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

Artifact e8cfdc85ef317881343292e08dce6aa15708fe13:


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 33 37 30  select.c,v 1.370
0200: 20 32 30 30 37 2f 31 32 2f 31 33 20 32 31 3a 35   2007/12/13 21:5
0210: 34 3a 31 31 20 64 72 68 20 45 78 70 20 24 0a 2a  4:11 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 53  id clearSelect(S
02c0: 65 6c 65 63 74 20 2a 70 29 7b 0a 20 20 73 71 6c  elect *p){.  sql
02d0: 69 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65  ite3ExprListDele
02e0: 74 65 28 70 2d 3e 70 45 4c 69 73 74 29 3b 0a 20  te(p->pEList);. 
02f0: 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74 44   sqlite3SrcListD
0300: 65 6c 65 74 65 28 70 2d 3e 70 53 72 63 29 3b 0a  elete(p->pSrc);.
0310: 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c    sqlite3ExprDel
0320: 65 74 65 28 70 2d 3e 70 57 68 65 72 65 29 3b 0a  ete(p->pWhere);.
0330: 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73    sqlite3ExprLis
0340: 74 44 65 6c 65 74 65 28 70 2d 3e 70 47 72 6f 75  tDelete(p->pGrou
0350: 70 42 79 29 3b 0a 20 20 73 71 6c 69 74 65 33 45  pBy);.  sqlite3E
0360: 78 70 72 44 65 6c 65 74 65 28 70 2d 3e 70 48 61  xprDelete(p->pHa
0370: 76 69 6e 67 29 3b 0a 20 20 73 71 6c 69 74 65 33  ving);.  sqlite3
0380: 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28 70  ExprListDelete(p
0390: 2d 3e 70 4f 72 64 65 72 42 79 29 3b 0a 20 20 73  ->pOrderBy);.  s
03a0: 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65 6c 65  qlite3SelectDele
03b0: 74 65 28 70 2d 3e 70 50 72 69 6f 72 29 3b 0a 20  te(p->pPrior);. 
03c0: 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65   sqlite3ExprDele
03d0: 74 65 28 70 2d 3e 70 4c 69 6d 69 74 29 3b 0a 20  te(p->pLimit);. 
03e0: 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65   sqlite3ExprDele
03f0: 74 65 28 70 2d 3e 70 4f 66 66 73 65 74 29 3b 0a  te(p->pOffset);.
0400: 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61  }.../*.** Alloca
0410: 74 65 20 61 20 6e 65 77 20 53 65 6c 65 63 74 20  te a new Select 
0420: 73 74 72 75 63 74 75 72 65 20 61 6e 64 20 72 65  structure and re
0430: 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74  turn a pointer t
0440: 6f 20 74 68 61 74 0a 2a 2a 20 73 74 72 75 63 74  o that.** struct
0450: 75 72 65 2e 0a 2a 2f 0a 53 65 6c 65 63 74 20 2a  ure..*/.Select *
0460: 73 71 6c 69 74 65 33 53 65 6c 65 63 74 4e 65 77  sqlite3SelectNew
0470: 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
0480: 65 2c 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72  e,        /* Par
0490: 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  sing context */.
04a0: 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69    ExprList *pELi
04b0: 73 74 2c 20 20 20 20 20 2f 2a 20 77 68 69 63 68  st,     /* which
04c0: 20 63 6f 6c 75 6d 6e 73 20 74 6f 20 69 6e 63 6c   columns to incl
04d0: 75 64 65 20 69 6e 20 74 68 65 20 72 65 73 75 6c  ude in the resul
04e0: 74 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a  t */.  SrcList *
04f0: 70 53 72 63 2c 20 20 20 20 20 20 20 20 2f 2a 20  pSrc,        /* 
0500: 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20  the FROM clause 
0510: 2d 2d 20 77 68 69 63 68 20 74 61 62 6c 65 73 20  -- which tables 
0520: 74 6f 20 73 63 61 6e 20 2a 2f 0a 20 20 45 78 70  to scan */.  Exp
0530: 72 20 2a 70 57 68 65 72 65 2c 20 20 20 20 20 20  r *pWhere,      
0540: 20 20 20 2f 2a 20 74 68 65 20 57 48 45 52 45 20     /* the WHERE 
0550: 63 6c 61 75 73 65 20 2a 2f 0a 20 20 45 78 70 72  clause */.  Expr
0560: 4c 69 73 74 20 2a 70 47 72 6f 75 70 42 79 2c 20  List *pGroupBy, 
0570: 20 20 2f 2a 20 74 68 65 20 47 52 4f 55 50 20 42    /* the GROUP B
0580: 59 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 45 78  Y clause */.  Ex
0590: 70 72 20 2a 70 48 61 76 69 6e 67 2c 20 20 20 20  pr *pHaving,    
05a0: 20 20 20 20 2f 2a 20 74 68 65 20 48 41 56 49 4e      /* the HAVIN
05b0: 47 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 45 78  G clause */.  Ex
05c0: 70 72 4c 69 73 74 20 2a 70 4f 72 64 65 72 42 79  prList *pOrderBy
05d0: 2c 20 20 20 2f 2a 20 74 68 65 20 4f 52 44 45 52  ,   /* the ORDER
05e0: 20 42 59 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20   BY clause */.  
05f0: 69 6e 74 20 69 73 44 69 73 74 69 6e 63 74 2c 20  int isDistinct, 
0600: 20 20 20 20 20 20 2f 2a 20 74 72 75 65 20 69 66        /* true if
0610: 20 74 68 65 20 44 49 53 54 49 4e 43 54 20 6b 65   the DISTINCT ke
0620: 79 77 6f 72 64 20 69 73 20 70 72 65 73 65 6e 74  yword is present
0630: 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 4c 69 6d   */.  Expr *pLim
0640: 69 74 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 4c  it,         /* L
0650: 49 4d 49 54 20 76 61 6c 75 65 2e 20 20 4e 55 4c  IMIT value.  NUL
0660: 4c 20 6d 65 61 6e 73 20 6e 6f 74 20 75 73 65 64  L means not used
0670: 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 4f 66 66   */.  Expr *pOff
0680: 73 65 74 20 20 20 20 20 20 20 20 20 2f 2a 20 4f  set         /* O
0690: 46 46 53 45 54 20 76 61 6c 75 65 2e 20 20 4e 55  FFSET value.  NU
06a0: 4c 4c 20 6d 65 61 6e 73 20 6e 6f 20 6f 66 66 73  LL means no offs
06b0: 65 74 20 2a 2f 0a 29 7b 0a 20 20 53 65 6c 65 63  et */.){.  Selec
06c0: 74 20 2a 70 4e 65 77 3b 0a 20 20 53 65 6c 65 63  t *pNew;.  Selec
06d0: 74 20 73 74 61 6e 64 69 6e 3b 0a 20 20 73 71 6c  t standin;.  sql
06e0: 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73  ite3 *db = pPars
06f0: 65 2d 3e 64 62 3b 0a 20 20 70 4e 65 77 20 3d 20  e->db;.  pNew = 
0700: 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a  sqlite3DbMallocZ
0710: 65 72 6f 28 64 62 2c 20 73 69 7a 65 6f 66 28 2a  ero(db, sizeof(*
0720: 70 4e 65 77 29 20 29 3b 0a 20 20 61 73 73 65 72  pNew) );.  asser
0730: 74 28 20 21 70 4f 66 66 73 65 74 20 7c 7c 20 70  t( !pOffset || p
0740: 4c 69 6d 69 74 20 29 3b 20 20 20 2f 2a 20 43 61  Limit );   /* Ca
0750: 6e 27 74 20 68 61 76 65 20 4f 46 46 53 45 54 20  n't have OFFSET 
0760: 77 69 74 68 6f 75 74 20 4c 49 4d 49 54 2e 20 2a  without LIMIT. *
0770: 2f 0a 20 20 69 66 28 20 70 4e 65 77 3d 3d 30 20  /.  if( pNew==0 
0780: 29 7b 0a 20 20 20 20 70 4e 65 77 20 3d 20 26 73  ){.    pNew = &s
0790: 74 61 6e 64 69 6e 3b 0a 20 20 20 20 6d 65 6d 73  tandin;.    mems
07a0: 65 74 28 70 4e 65 77 2c 20 30 2c 20 73 69 7a 65  et(pNew, 0, size
07b0: 6f 66 28 2a 70 4e 65 77 29 29 3b 0a 20 20 7d 0a  of(*pNew));.  }.
07c0: 20 20 69 66 28 20 70 45 4c 69 73 74 3d 3d 30 20    if( pEList==0 
07d0: 29 7b 0a 20 20 20 20 70 45 4c 69 73 74 20 3d 20  ){.    pEList = 
07e0: 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 41  sqlite3ExprListA
07f0: 70 70 65 6e 64 28 70 50 61 72 73 65 2c 20 30 2c  ppend(pParse, 0,
0800: 20 73 71 6c 69 74 65 33 45 78 70 72 28 64 62 2c   sqlite3Expr(db,
0810: 54 4b 5f 41 4c 4c 2c 30 2c 30 2c 30 29 2c 20 30  TK_ALL,0,0,0), 0
0820: 29 3b 0a 20 20 7d 0a 20 20 70 4e 65 77 2d 3e 70  );.  }.  pNew->p
0830: 45 4c 69 73 74 20 3d 20 70 45 4c 69 73 74 3b 0a  EList = pEList;.
0840: 20 20 70 4e 65 77 2d 3e 70 53 72 63 20 3d 20 70    pNew->pSrc = p
0850: 53 72 63 3b 0a 20 20 70 4e 65 77 2d 3e 70 57 68  Src;.  pNew->pWh
0860: 65 72 65 20 3d 20 70 57 68 65 72 65 3b 0a 20 20  ere = pWhere;.  
0870: 70 4e 65 77 2d 3e 70 47 72 6f 75 70 42 79 20 3d  pNew->pGroupBy =
0880: 20 70 47 72 6f 75 70 42 79 3b 0a 20 20 70 4e 65   pGroupBy;.  pNe
0890: 77 2d 3e 70 48 61 76 69 6e 67 20 3d 20 70 48 61  w->pHaving = pHa
08a0: 76 69 6e 67 3b 0a 20 20 70 4e 65 77 2d 3e 70 4f  ving;.  pNew->pO
08b0: 72 64 65 72 42 79 20 3d 20 70 4f 72 64 65 72 42  rderBy = pOrderB
08c0: 79 3b 0a 20 20 70 4e 65 77 2d 3e 69 73 44 69 73  y;.  pNew->isDis
08d0: 74 69 6e 63 74 20 3d 20 69 73 44 69 73 74 69 6e  tinct = isDistin
08e0: 63 74 3b 0a 20 20 70 4e 65 77 2d 3e 6f 70 20 3d  ct;.  pNew->op =
08f0: 20 54 4b 5f 53 45 4c 45 43 54 3b 0a 20 20 61 73   TK_SELECT;.  as
0900: 73 65 72 74 28 20 70 4f 66 66 73 65 74 3d 3d 30  sert( pOffset==0
0910: 20 7c 7c 20 70 4c 69 6d 69 74 21 3d 30 20 29 3b   || pLimit!=0 );
0920: 0a 20 20 70 4e 65 77 2d 3e 70 4c 69 6d 69 74 20  .  pNew->pLimit 
0930: 3d 20 70 4c 69 6d 69 74 3b 0a 20 20 70 4e 65 77  = pLimit;.  pNew
0940: 2d 3e 70 4f 66 66 73 65 74 20 3d 20 70 4f 66 66  ->pOffset = pOff
0950: 73 65 74 3b 0a 20 20 70 4e 65 77 2d 3e 69 4c 69  set;.  pNew->iLi
0960: 6d 69 74 20 3d 20 2d 31 3b 0a 20 20 70 4e 65 77  mit = -1;.  pNew
0970: 2d 3e 69 4f 66 66 73 65 74 20 3d 20 2d 31 3b 0a  ->iOffset = -1;.
0980: 20 20 70 4e 65 77 2d 3e 61 64 64 72 4f 70 65 6e    pNew->addrOpen
0990: 45 70 68 6d 5b 30 5d 20 3d 20 2d 31 3b 0a 20 20  Ephm[0] = -1;.  
09a0: 70 4e 65 77 2d 3e 61 64 64 72 4f 70 65 6e 45 70  pNew->addrOpenEp
09b0: 68 6d 5b 31 5d 20 3d 20 2d 31 3b 0a 20 20 70 4e  hm[1] = -1;.  pN
09c0: 65 77 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d  ew->addrOpenEphm
09d0: 5b 32 5d 20 3d 20 2d 31 3b 0a 20 20 69 66 28 20  [2] = -1;.  if( 
09e0: 70 4e 65 77 3d 3d 26 73 74 61 6e 64 69 6e 29 20  pNew==&standin) 
09f0: 7b 0a 20 20 20 20 63 6c 65 61 72 53 65 6c 65 63  {.    clearSelec
0a00: 74 28 70 4e 65 77 29 3b 0a 20 20 20 20 70 4e 65  t(pNew);.    pNe
0a10: 77 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74  w = 0;.  }.  ret
0a20: 75 72 6e 20 70 4e 65 77 3b 0a 7d 0a 0a 2f 2a 0a  urn pNew;.}../*.
0a30: 2a 2a 20 44 65 6c 65 74 65 20 74 68 65 20 67 69  ** Delete the gi
0a40: 76 65 6e 20 53 65 6c 65 63 74 20 73 74 72 75 63  ven Select struc
0a50: 74 75 72 65 20 61 6e 64 20 61 6c 6c 20 6f 66 20  ture and all of 
0a60: 69 74 73 20 73 75 62 73 74 72 75 63 74 75 72 65  its substructure
0a70: 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  s..*/.void sqlit
0a80: 65 33 53 65 6c 65 63 74 44 65 6c 65 74 65 28 53  e3SelectDelete(S
0a90: 65 6c 65 63 74 20 2a 70 29 7b 0a 20 20 69 66 28  elect *p){.  if(
0aa0: 20 70 20 29 7b 0a 20 20 20 20 63 6c 65 61 72 53   p ){.    clearS
0ab0: 65 6c 65 63 74 28 70 29 3b 0a 20 20 20 20 73 71  elect(p);.    sq
0ac0: 6c 69 74 65 33 5f 66 72 65 65 28 70 29 3b 0a 20  lite3_free(p);. 
0ad0: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65   }.}../*.** Give
0ae0: 6e 20 31 20 74 6f 20 33 20 69 64 65 6e 74 69 66  n 1 to 3 identif
0af0: 69 65 72 73 20 70 72 65 63 65 65 64 69 6e 67 20  iers preceeding 
0b00: 74 68 65 20 4a 4f 49 4e 20 6b 65 79 77 6f 72 64  the JOIN keyword
0b10: 2c 20 64 65 74 65 72 6d 69 6e 65 20 74 68 65 0a  , determine the.
0b20: 2a 2a 20 74 79 70 65 20 6f 66 20 6a 6f 69 6e 2e  ** type of join.
0b30: 20 20 52 65 74 75 72 6e 20 61 6e 20 69 6e 74 65    Return an inte
0b40: 67 65 72 20 63 6f 6e 73 74 61 6e 74 20 74 68 61  ger constant tha
0b50: 74 20 65 78 70 72 65 73 73 65 73 20 74 68 61 74  t expresses that
0b60: 20 74 79 70 65 0a 2a 2a 20 69 6e 20 74 65 72 6d   type.** in term
0b70: 73 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69  s of the followi
0b80: 6e 67 20 62 69 74 20 76 61 6c 75 65 73 3a 0a 2a  ng bit values:.*
0b90: 2a 0a 2a 2a 20 20 20 20 20 4a 54 5f 49 4e 4e 45  *.**     JT_INNE
0ba0: 52 0a 2a 2a 20 20 20 20 20 4a 54 5f 43 52 4f 53  R.**     JT_CROS
0bb0: 53 0a 2a 2a 20 20 20 20 20 4a 54 5f 4f 55 54 45  S.**     JT_OUTE
0bc0: 52 0a 2a 2a 20 20 20 20 20 4a 54 5f 4e 41 54 55  R.**     JT_NATU
0bd0: 52 41 4c 0a 2a 2a 20 20 20 20 20 4a 54 5f 4c 45  RAL.**     JT_LE
0be0: 46 54 0a 2a 2a 20 20 20 20 20 4a 54 5f 52 49 47  FT.**     JT_RIG
0bf0: 48 54 0a 2a 2a 0a 2a 2a 20 41 20 66 75 6c 6c 20  HT.**.** A full 
0c00: 6f 75 74 65 72 20 6a 6f 69 6e 20 69 73 20 74 68  outer join is th
0c10: 65 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 20 6f 66  e combination of
0c20: 20 4a 54 5f 4c 45 46 54 20 61 6e 64 20 4a 54 5f   JT_LEFT and JT_
0c30: 52 49 47 48 54 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  RIGHT..**.** If 
0c40: 61 6e 20 69 6c 6c 65 67 61 6c 20 6f 72 20 75 6e  an illegal or un
0c50: 73 75 70 70 6f 72 74 65 64 20 6a 6f 69 6e 20 74  supported join t
0c60: 79 70 65 20 69 73 20 73 65 65 6e 2c 20 74 68 65  ype is seen, the
0c70: 6e 20 73 74 69 6c 6c 20 72 65 74 75 72 6e 0a 2a  n still return.*
0c80: 2a 20 61 20 6a 6f 69 6e 20 74 79 70 65 2c 20 62  * a join type, b
0c90: 75 74 20 70 75 74 20 61 6e 20 65 72 72 6f 72 20  ut put an error 
0ca0: 69 6e 20 74 68 65 20 70 50 61 72 73 65 20 73 74  in the pParse st
0cb0: 72 75 63 74 75 72 65 2e 0a 2a 2f 0a 69 6e 74 20  ructure..*/.int 
0cc0: 73 71 6c 69 74 65 33 4a 6f 69 6e 54 79 70 65 28  sqlite3JoinType(
0cd0: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 54  Parse *pParse, T
0ce0: 6f 6b 65 6e 20 2a 70 41 2c 20 54 6f 6b 65 6e 20  oken *pA, Token 
0cf0: 2a 70 42 2c 20 54 6f 6b 65 6e 20 2a 70 43 29 7b  *pB, Token *pC){
0d00: 0a 20 20 69 6e 74 20 6a 6f 69 6e 74 79 70 65 20  .  int jointype 
0d10: 3d 20 30 3b 0a 20 20 54 6f 6b 65 6e 20 2a 61 70  = 0;.  Token *ap
0d20: 41 6c 6c 5b 33 5d 3b 0a 20 20 54 6f 6b 65 6e 20  All[3];.  Token 
0d30: 2a 70 3b 0a 20 20 73 74 61 74 69 63 20 63 6f 6e  *p;.  static con
0d40: 73 74 20 73 74 72 75 63 74 20 7b 0a 20 20 20 20  st struct {.    
0d50: 63 6f 6e 73 74 20 63 68 61 72 20 7a 4b 65 79 77  const char zKeyw
0d60: 6f 72 64 5b 38 5d 3b 0a 20 20 20 20 75 38 20 6e  ord[8];.    u8 n
0d70: 43 68 61 72 3b 0a 20 20 20 20 75 38 20 63 6f 64  Char;.    u8 cod
0d80: 65 3b 0a 20 20 7d 20 6b 65 79 77 6f 72 64 73 5b  e;.  } keywords[
0d90: 5d 20 3d 20 7b 0a 20 20 20 20 7b 20 22 6e 61 74  ] = {.    { "nat
0da0: 75 72 61 6c 22 2c 20 37 2c 20 4a 54 5f 4e 41 54  ural", 7, JT_NAT
0db0: 55 52 41 4c 20 7d 2c 0a 20 20 20 20 7b 20 22 6c  URAL },.    { "l
0dc0: 65 66 74 22 2c 20 20 20 20 34 2c 20 4a 54 5f 4c  eft",    4, JT_L
0dd0: 45 46 54 7c 4a 54 5f 4f 55 54 45 52 20 7d 2c 0a  EFT|JT_OUTER },.
0de0: 20 20 20 20 7b 20 22 72 69 67 68 74 22 2c 20 20      { "right",  
0df0: 20 35 2c 20 4a 54 5f 52 49 47 48 54 7c 4a 54 5f   5, JT_RIGHT|JT_
0e00: 4f 55 54 45 52 20 7d 2c 0a 20 20 20 20 7b 20 22  OUTER },.    { "
0e10: 66 75 6c 6c 22 2c 20 20 20 20 34 2c 20 4a 54 5f  full",    4, JT_
0e20: 4c 45 46 54 7c 4a 54 5f 52 49 47 48 54 7c 4a 54  LEFT|JT_RIGHT|JT
0e30: 5f 4f 55 54 45 52 20 7d 2c 0a 20 20 20 20 7b 20  _OUTER },.    { 
0e40: 22 6f 75 74 65 72 22 2c 20 20 20 35 2c 20 4a 54  "outer",   5, JT
0e50: 5f 4f 55 54 45 52 20 7d 2c 0a 20 20 20 20 7b 20  _OUTER },.    { 
0e60: 22 69 6e 6e 65 72 22 2c 20 20 20 35 2c 20 4a 54  "inner",   5, JT
0e70: 5f 49 4e 4e 45 52 20 7d 2c 0a 20 20 20 20 7b 20  _INNER },.    { 
0e80: 22 63 72 6f 73 73 22 2c 20 20 20 35 2c 20 4a 54  "cross",   5, JT
0e90: 5f 49 4e 4e 45 52 7c 4a 54 5f 43 52 4f 53 53 20  _INNER|JT_CROSS 
0ea0: 7d 2c 0a 20 20 7d 3b 0a 20 20 69 6e 74 20 69 2c  },.  };.  int i,
0eb0: 20 6a 3b 0a 20 20 61 70 41 6c 6c 5b 30 5d 20 3d   j;.  apAll[0] =
0ec0: 20 70 41 3b 0a 20 20 61 70 41 6c 6c 5b 31 5d 20   pA;.  apAll[1] 
0ed0: 3d 20 70 42 3b 0a 20 20 61 70 41 6c 6c 5b 32 5d  = pB;.  apAll[2]
0ee0: 20 3d 20 70 43 3b 0a 20 20 66 6f 72 28 69 3d 30   = pC;.  for(i=0
0ef0: 3b 20 69 3c 33 20 26 26 20 61 70 41 6c 6c 5b 69  ; i<3 && apAll[i
0f00: 5d 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 70 20 3d  ]; i++){.    p =
0f10: 20 61 70 41 6c 6c 5b 69 5d 3b 0a 20 20 20 20 66   apAll[i];.    f
0f20: 6f 72 28 6a 3d 30 3b 20 6a 3c 73 69 7a 65 6f 66  or(j=0; j<sizeof
0f30: 28 6b 65 79 77 6f 72 64 73 29 2f 73 69 7a 65 6f  (keywords)/sizeo
0f40: 66 28 6b 65 79 77 6f 72 64 73 5b 30 5d 29 3b 20  f(keywords[0]); 
0f50: 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20  j++){.      if( 
0f60: 70 2d 3e 6e 3d 3d 6b 65 79 77 6f 72 64 73 5b 6a  p->n==keywords[j
0f70: 5d 2e 6e 43 68 61 72 20 0a 20 20 20 20 20 20 20  ].nChar .       
0f80: 20 20 20 26 26 20 73 71 6c 69 74 65 33 53 74 72     && sqlite3Str
0f90: 4e 49 43 6d 70 28 28 63 68 61 72 2a 29 70 2d 3e  NICmp((char*)p->
0fa0: 7a 2c 20 6b 65 79 77 6f 72 64 73 5b 6a 5d 2e 7a  z, keywords[j].z
0fb0: 4b 65 79 77 6f 72 64 2c 20 70 2d 3e 6e 29 3d 3d  Keyword, p->n)==
0fc0: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 6a 6f 69  0 ){.        joi
0fd0: 6e 74 79 70 65 20 7c 3d 20 6b 65 79 77 6f 72 64  ntype |= keyword
0fe0: 73 5b 6a 5d 2e 63 6f 64 65 3b 0a 20 20 20 20 20  s[j].code;.     
0ff0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
1000: 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  }.    }.    if( 
1010: 6a 3e 3d 73 69 7a 65 6f 66 28 6b 65 79 77 6f 72  j>=sizeof(keywor
1020: 64 73 29 2f 73 69 7a 65 6f 66 28 6b 65 79 77 6f  ds)/sizeof(keywo
1030: 72 64 73 5b 30 5d 29 20 29 7b 0a 20 20 20 20 20  rds[0]) ){.     
1040: 20 6a 6f 69 6e 74 79 70 65 20 7c 3d 20 4a 54 5f   jointype |= JT_
1050: 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 62 72 65  ERROR;.      bre
1060: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  ak;.    }.  }.  
1070: 69 66 28 0a 20 20 20 20 20 28 6a 6f 69 6e 74 79  if(.     (jointy
1080: 70 65 20 26 20 28 4a 54 5f 49 4e 4e 45 52 7c 4a  pe & (JT_INNER|J
1090: 54 5f 4f 55 54 45 52 29 29 3d 3d 28 4a 54 5f 49  T_OUTER))==(JT_I
10a0: 4e 4e 45 52 7c 4a 54 5f 4f 55 54 45 52 29 20 7c  NNER|JT_OUTER) |
10b0: 7c 0a 20 20 20 20 20 28 6a 6f 69 6e 74 79 70 65  |.     (jointype
10c0: 20 26 20 4a 54 5f 45 52 52 4f 52 29 21 3d 30 0a   & JT_ERROR)!=0.
10d0: 20 20 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63    ){.    const c
10e0: 68 61 72 20 2a 7a 53 70 31 20 3d 20 22 20 22 3b  har *zSp1 = " ";
10f0: 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20  .    const char 
1100: 2a 7a 53 70 32 20 3d 20 22 20 22 3b 0a 20 20 20  *zSp2 = " ";.   
1110: 20 69 66 28 20 70 42 3d 3d 30 20 29 7b 20 7a 53   if( pB==0 ){ zS
1120: 70 31 2b 2b 3b 20 7d 0a 20 20 20 20 69 66 28 20  p1++; }.    if( 
1130: 70 43 3d 3d 30 20 29 7b 20 7a 53 70 32 2b 2b 3b  pC==0 ){ zSp2++;
1140: 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72   }.    sqlite3Er
1150: 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
1160: 75 6e 6b 6e 6f 77 6e 20 6f 72 20 75 6e 73 75 70  unknown or unsup
1170: 70 6f 72 74 65 64 20 6a 6f 69 6e 20 74 79 70 65  ported join type
1180: 3a 20 22 0a 20 20 20 20 20 20 20 22 25 54 25 73  : ".       "%T%s
1190: 25 54 25 73 25 54 22 2c 20 70 41 2c 20 7a 53 70  %T%s%T", pA, zSp
11a0: 31 2c 20 70 42 2c 20 7a 53 70 32 2c 20 70 43 29  1, pB, zSp2, pC)
11b0: 3b 0a 20 20 20 20 6a 6f 69 6e 74 79 70 65 20 3d  ;.    jointype =
11c0: 20 4a 54 5f 49 4e 4e 45 52 3b 0a 20 20 7d 65 6c   JT_INNER;.  }el
11d0: 73 65 20 69 66 28 20 6a 6f 69 6e 74 79 70 65 20  se if( jointype 
11e0: 26 20 4a 54 5f 52 49 47 48 54 20 29 7b 0a 20 20  & JT_RIGHT ){.  
11f0: 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
1200: 67 28 70 50 61 72 73 65 2c 20 0a 20 20 20 20 20  g(pParse, .     
1210: 20 22 52 49 47 48 54 20 61 6e 64 20 46 55 4c 4c   "RIGHT and FULL
1220: 20 4f 55 54 45 52 20 4a 4f 49 4e 73 20 61 72 65   OUTER JOINs are
1230: 20 6e 6f 74 20 63 75 72 72 65 6e 74 6c 79 20 73   not currently s
1240: 75 70 70 6f 72 74 65 64 22 29 3b 0a 20 20 20 20  upported");.    
1250: 6a 6f 69 6e 74 79 70 65 20 3d 20 4a 54 5f 49 4e  jointype = JT_IN
1260: 4e 45 52 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  NER;.  }.  retur
1270: 6e 20 6a 6f 69 6e 74 79 70 65 3b 0a 7d 0a 0a 2f  n jointype;.}../
1280: 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
1290: 69 6e 64 65 78 20 6f 66 20 61 20 63 6f 6c 75 6d  index of a colum
12a0: 6e 20 69 6e 20 61 20 74 61 62 6c 65 2e 20 20 52  n in a table.  R
12b0: 65 74 75 72 6e 20 2d 31 20 69 66 20 74 68 65 20  eturn -1 if the 
12c0: 63 6f 6c 75 6d 6e 0a 2a 2a 20 69 73 20 6e 6f 74  column.** is not
12d0: 20 63 6f 6e 74 61 69 6e 65 64 20 69 6e 20 74 68   contained in th
12e0: 65 20 74 61 62 6c 65 2e 0a 2a 2f 0a 73 74 61 74  e table..*/.stat
12f0: 69 63 20 69 6e 74 20 63 6f 6c 75 6d 6e 49 6e 64  ic int columnInd
1300: 65 78 28 54 61 62 6c 65 20 2a 70 54 61 62 2c 20  ex(Table *pTab, 
1310: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43 6f 6c  const char *zCol
1320: 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f  ){.  int i;.  fo
1330: 72 28 69 3d 30 3b 20 69 3c 70 54 61 62 2d 3e 6e  r(i=0; i<pTab->n
1340: 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69  Col; i++){.    i
1350: 66 28 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d  f( sqlite3StrICm
1360: 70 28 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 5d 2e  p(pTab->aCol[i].
1370: 7a 4e 61 6d 65 2c 20 7a 43 6f 6c 29 3d 3d 30 20  zName, zCol)==0 
1380: 29 20 72 65 74 75 72 6e 20 69 3b 0a 20 20 7d 0a  ) return i;.  }.
1390: 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a 7d 0a 0a    return -1;.}..
13a0: 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 76 61  /*.** Set the va
13b0: 6c 75 65 20 6f 66 20 61 20 74 6f 6b 65 6e 20 74  lue of a token t
13c0: 6f 20 61 20 27 5c 30 30 30 27 2d 74 65 72 6d 69  o a '\000'-termi
13d0: 6e 61 74 65 64 20 73 74 72 69 6e 67 2e 0a 2a 2f  nated string..*/
13e0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 65 74  .static void set
13f0: 54 6f 6b 65 6e 28 54 6f 6b 65 6e 20 2a 70 2c 20  Token(Token *p, 
1400: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 29 7b 0a  const char *z){.
1410: 20 20 70 2d 3e 7a 20 3d 20 28 75 38 2a 29 7a 3b    p->z = (u8*)z;
1420: 0a 20 20 70 2d 3e 6e 20 3d 20 7a 20 3f 20 73 74  .  p->n = z ? st
1430: 72 6c 65 6e 28 7a 29 20 3a 20 30 3b 0a 20 20 70  rlen(z) : 0;.  p
1440: 2d 3e 64 79 6e 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a  ->dyn = 0;.}../*
1450: 0a 2a 2a 20 53 65 74 20 74 68 65 20 74 6f 6b 65  .** Set the toke
1460: 6e 20 74 6f 20 74 68 65 20 64 6f 75 62 6c 65 2d  n to the double-
1470: 71 75 6f 74 65 64 20 61 6e 64 20 65 73 63 61 70  quoted and escap
1480: 65 64 20 76 65 72 73 69 6f 6e 20 6f 66 20 74 68  ed version of th
1490: 65 20 73 74 72 69 6e 67 20 70 6f 69 6e 74 65 64  e string pointed
14a0: 0a 2a 2a 20 74 6f 20 62 79 20 7a 2e 20 46 6f 72  .** to by z. For
14b0: 20 65 78 61 6d 70 6c 65 3b 0a 2a 2a 0a 2a 2a 20   example;.**.** 
14c0: 20 20 20 7b 61 22 62 63 7d 20 20 2d 3e 20 20 7b     {a"bc}  ->  {
14d0: 22 61 22 22 62 63 22 7d 0a 2a 2f 0a 73 74 61 74  "a""bc"}.*/.stat
14e0: 69 63 20 76 6f 69 64 20 73 65 74 51 75 6f 74 65  ic void setQuote
14f0: 64 54 6f 6b 65 6e 28 50 61 72 73 65 20 2a 70 50  dToken(Parse *pP
1500: 61 72 73 65 2c 20 54 6f 6b 65 6e 20 2a 70 2c 20  arse, Token *p, 
1510: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 29 7b 0a  const char *z){.
1520: 20 20 70 2d 3e 7a 20 3d 20 28 75 38 20 2a 29 73    p->z = (u8 *)s
1530: 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 30 2c  qlite3MPrintf(0,
1540: 20 22 5c 22 25 77 5c 22 22 2c 20 7a 29 3b 0a 20   "\"%w\"", z);. 
1550: 20 70 2d 3e 64 79 6e 20 3d 20 31 3b 0a 20 20 69   p->dyn = 1;.  i
1560: 66 28 20 70 2d 3e 7a 20 29 7b 0a 20 20 20 20 70  f( p->z ){.    p
1570: 2d 3e 6e 20 3d 20 73 74 72 6c 65 6e 28 28 63 68  ->n = strlen((ch
1580: 61 72 20 2a 29 70 2d 3e 7a 29 3b 0a 20 20 7d 65  ar *)p->z);.  }e
1590: 6c 73 65 7b 0a 20 20 20 20 70 50 61 72 73 65 2d  lse{.    pParse-
15a0: 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65  >db->mallocFaile
15b0: 64 20 3d 20 31 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  d = 1;.  }.}../*
15c0: 0a 2a 2a 20 43 72 65 61 74 65 20 61 6e 20 65 78  .** Create an ex
15d0: 70 72 65 73 73 69 6f 6e 20 6e 6f 64 65 20 66 6f  pression node fo
15e0: 72 20 61 6e 20 69 64 65 6e 74 69 66 69 65 72 20  r an identifier 
15f0: 77 69 74 68 20 74 68 65 20 6e 61 6d 65 20 6f 66  with the name of
1600: 20 7a 4e 61 6d 65 0a 2a 2f 0a 45 78 70 72 20 2a   zName.*/.Expr *
1610: 73 71 6c 69 74 65 33 43 72 65 61 74 65 49 64 45  sqlite3CreateIdE
1620: 78 70 72 28 50 61 72 73 65 20 2a 70 50 61 72 73  xpr(Parse *pPars
1630: 65 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  e, const char *z
1640: 4e 61 6d 65 29 7b 0a 20 20 54 6f 6b 65 6e 20 64  Name){.  Token d
1650: 75 6d 6d 79 3b 0a 20 20 73 65 74 54 6f 6b 65 6e  ummy;.  setToken
1660: 28 26 64 75 6d 6d 79 2c 20 7a 4e 61 6d 65 29 3b  (&dummy, zName);
1670: 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65  .  return sqlite
1680: 33 50 45 78 70 72 28 70 50 61 72 73 65 2c 20 54  3PExpr(pParse, T
1690: 4b 5f 49 44 2c 20 30 2c 20 30 2c 20 26 64 75 6d  K_ID, 0, 0, &dum
16a0: 6d 79 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 41  my);.}.../*.** A
16b0: 64 64 20 61 20 74 65 72 6d 20 74 6f 20 74 68 65  dd a term to the
16c0: 20 57 48 45 52 45 20 65 78 70 72 65 73 73 69 6f   WHERE expressio
16d0: 6e 20 69 6e 20 2a 70 70 45 78 70 72 20 74 68 61  n in *ppExpr tha
16e0: 74 20 72 65 71 75 69 72 65 73 20 74 68 65 0a 2a  t requires the.*
16f0: 2a 20 7a 43 6f 6c 20 63 6f 6c 75 6d 6e 20 74 6f  * zCol column to
1700: 20 62 65 20 65 71 75 61 6c 20 69 6e 20 74 68 65   be equal in the
1710: 20 74 77 6f 20 74 61 62 6c 65 73 20 70 54 61 62   two tables pTab
1720: 31 20 61 6e 64 20 70 54 61 62 32 2e 0a 2a 2f 0a  1 and pTab2..*/.
1730: 73 74 61 74 69 63 20 76 6f 69 64 20 61 64 64 57  static void addW
1740: 68 65 72 65 54 65 72 6d 28 0a 20 20 50 61 72 73  hereTerm(.  Pars
1750: 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20  e *pParse,      
1760: 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20       /* Parsing 
1770: 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 63 6f 6e  context */.  con
1780: 73 74 20 63 68 61 72 20 2a 7a 43 6f 6c 2c 20 20  st char *zCol,  
1790: 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66        /* Name of
17a0: 20 74 68 65 20 63 6f 6c 75 6d 6e 20 2a 2f 0a 20   the column */. 
17b0: 20 63 6f 6e 73 74 20 54 61 62 6c 65 20 2a 70 54   const Table *pT
17c0: 61 62 31 2c 20 20 20 20 20 20 2f 2a 20 46 69 72  ab1,      /* Fir
17d0: 73 74 20 74 61 62 6c 65 20 2a 2f 0a 20 20 63 6f  st table */.  co
17e0: 6e 73 74 20 63 68 61 72 20 2a 7a 41 6c 69 61 73  nst char *zAlias
17f0: 31 2c 20 20 20 20 20 2f 2a 20 41 6c 69 61 73 20  1,     /* Alias 
1800: 66 6f 72 20 66 69 72 73 74 20 74 61 62 6c 65 2e  for first table.
1810: 20 20 4d 61 79 20 62 65 20 4e 55 4c 4c 20 2a 2f    May be NULL */
1820: 0a 20 20 63 6f 6e 73 74 20 54 61 62 6c 65 20 2a  .  const Table *
1830: 70 54 61 62 32 2c 20 20 20 20 20 20 2f 2a 20 53  pTab2,      /* S
1840: 65 63 6f 6e 64 20 74 61 62 6c 65 20 2a 2f 0a 20  econd table */. 
1850: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 41 6c   const char *zAl
1860: 69 61 73 32 2c 20 20 20 20 20 2f 2a 20 41 6c 69  ias2,     /* Ali
1870: 61 73 20 66 6f 72 20 73 65 63 6f 6e 64 20 74 61  as for second ta
1880: 62 6c 65 2e 20 20 4d 61 79 20 62 65 20 4e 55 4c  ble.  May be NUL
1890: 4c 20 2a 2f 0a 20 20 69 6e 74 20 69 52 69 67 68  L */.  int iRigh
18a0: 74 4a 6f 69 6e 54 61 62 6c 65 2c 20 20 20 20 20  tJoinTable,     
18b0: 2f 2a 20 56 44 42 45 20 63 75 72 73 6f 72 20 66  /* VDBE cursor f
18c0: 6f 72 20 74 68 65 20 72 69 67 68 74 20 74 61 62  or the right tab
18d0: 6c 65 20 2a 2f 0a 20 20 45 78 70 72 20 2a 2a 70  le */.  Expr **p
18e0: 70 45 78 70 72 20 20 20 20 20 20 20 20 20 20 20  pExpr           
18f0: 20 2f 2a 20 41 64 64 20 74 68 65 20 65 71 75 61   /* Add the equa
1900: 6c 69 74 79 20 74 65 72 6d 20 74 6f 20 74 68 69  lity term to thi
1910: 73 20 65 78 70 72 65 73 73 69 6f 6e 20 2a 2f 0a  s expression */.
1920: 29 7b 0a 20 20 45 78 70 72 20 2a 70 45 31 61 2c  ){.  Expr *pE1a,
1930: 20 2a 70 45 31 62 2c 20 2a 70 45 31 63 3b 0a 20   *pE1b, *pE1c;. 
1940: 20 45 78 70 72 20 2a 70 45 32 61 2c 20 2a 70 45   Expr *pE2a, *pE
1950: 32 62 2c 20 2a 70 45 32 63 3b 0a 20 20 45 78 70  2b, *pE2c;.  Exp
1960: 72 20 2a 70 45 3b 0a 0a 20 20 70 45 31 61 20 3d  r *pE;..  pE1a =
1970: 20 73 71 6c 69 74 65 33 43 72 65 61 74 65 49 64   sqlite3CreateId
1980: 45 78 70 72 28 70 50 61 72 73 65 2c 20 7a 43 6f  Expr(pParse, zCo
1990: 6c 29 3b 0a 20 20 70 45 32 61 20 3d 20 73 71 6c  l);.  pE2a = sql
19a0: 69 74 65 33 43 72 65 61 74 65 49 64 45 78 70 72  ite3CreateIdExpr
19b0: 28 70 50 61 72 73 65 2c 20 7a 43 6f 6c 29 3b 0a  (pParse, zCol);.
19c0: 20 20 69 66 28 20 7a 41 6c 69 61 73 31 3d 3d 30    if( zAlias1==0
19d0: 20 29 7b 0a 20 20 20 20 7a 41 6c 69 61 73 31 20   ){.    zAlias1 
19e0: 3d 20 70 54 61 62 31 2d 3e 7a 4e 61 6d 65 3b 0a  = pTab1->zName;.
19f0: 20 20 7d 0a 20 20 70 45 31 62 20 3d 20 73 71 6c    }.  pE1b = sql
1a00: 69 74 65 33 43 72 65 61 74 65 49 64 45 78 70 72  ite3CreateIdExpr
1a10: 28 70 50 61 72 73 65 2c 20 7a 41 6c 69 61 73 31  (pParse, zAlias1
1a20: 29 3b 0a 20 20 69 66 28 20 7a 41 6c 69 61 73 32  );.  if( zAlias2
1a30: 3d 3d 30 20 29 7b 0a 20 20 20 20 7a 41 6c 69 61  ==0 ){.    zAlia
1a40: 73 32 20 3d 20 70 54 61 62 32 2d 3e 7a 4e 61 6d  s2 = pTab2->zNam
1a50: 65 3b 0a 20 20 7d 0a 20 20 70 45 32 62 20 3d 20  e;.  }.  pE2b = 
1a60: 73 71 6c 69 74 65 33 43 72 65 61 74 65 49 64 45  sqlite3CreateIdE
1a70: 78 70 72 28 70 50 61 72 73 65 2c 20 7a 41 6c 69  xpr(pParse, zAli
1a80: 61 73 32 29 3b 0a 20 20 70 45 31 63 20 3d 20 73  as2);.  pE1c = s
1a90: 71 6c 69 74 65 33 50 45 78 70 72 28 70 50 61 72  qlite3PExpr(pPar
1aa0: 73 65 2c 20 54 4b 5f 44 4f 54 2c 20 70 45 31 62  se, TK_DOT, pE1b
1ab0: 2c 20 70 45 31 61 2c 20 30 29 3b 0a 20 20 70 45  , pE1a, 0);.  pE
1ac0: 32 63 20 3d 20 73 71 6c 69 74 65 33 50 45 78 70  2c = sqlite3PExp
1ad0: 72 28 70 50 61 72 73 65 2c 20 54 4b 5f 44 4f 54  r(pParse, TK_DOT
1ae0: 2c 20 70 45 32 62 2c 20 70 45 32 61 2c 20 30 29  , pE2b, pE2a, 0)
1af0: 3b 0a 20 20 70 45 20 3d 20 73 71 6c 69 74 65 33  ;.  pE = sqlite3
1b00: 50 45 78 70 72 28 70 50 61 72 73 65 2c 20 54 4b  PExpr(pParse, TK
1b10: 5f 45 51 2c 20 70 45 31 63 2c 20 70 45 32 63 2c  _EQ, pE1c, pE2c,
1b20: 20 30 29 3b 0a 20 20 69 66 28 20 70 45 20 29 7b   0);.  if( pE ){
1b30: 0a 20 20 20 20 45 78 70 72 53 65 74 50 72 6f 70  .    ExprSetProp
1b40: 65 72 74 79 28 70 45 2c 20 45 50 5f 46 72 6f 6d  erty(pE, EP_From
1b50: 4a 6f 69 6e 29 3b 0a 20 20 20 20 70 45 2d 3e 69  Join);.    pE->i
1b60: 52 69 67 68 74 4a 6f 69 6e 54 61 62 6c 65 20 3d  RightJoinTable =
1b70: 20 69 52 69 67 68 74 4a 6f 69 6e 54 61 62 6c 65   iRightJoinTable
1b80: 3b 0a 20 20 7d 0a 20 20 2a 70 70 45 78 70 72 20  ;.  }.  *ppExpr 
1b90: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 41 6e 64  = sqlite3ExprAnd
1ba0: 28 70 50 61 72 73 65 2d 3e 64 62 2c 2a 70 70 45  (pParse->db,*ppE
1bb0: 78 70 72 2c 20 70 45 29 3b 0a 7d 0a 0a 2f 2a 0a  xpr, pE);.}../*.
1bc0: 2a 2a 20 53 65 74 20 74 68 65 20 45 50 5f 46 72  ** Set the EP_Fr
1bd0: 6f 6d 4a 6f 69 6e 20 70 72 6f 70 65 72 74 79 20  omJoin property 
1be0: 6f 6e 20 61 6c 6c 20 74 65 72 6d 73 20 6f 66 20  on all terms of 
1bf0: 74 68 65 20 67 69 76 65 6e 20 65 78 70 72 65 73  the given expres
1c00: 73 69 6f 6e 2e 0a 2a 2a 20 41 6e 64 20 73 65 74  sion..** And set
1c10: 20 74 68 65 20 45 78 70 72 2e 69 52 69 67 68 74   the Expr.iRight
1c20: 4a 6f 69 6e 54 61 62 6c 65 20 74 6f 20 69 54 61  JoinTable to iTa
1c30: 62 6c 65 20 66 6f 72 20 65 76 65 72 79 20 74 65  ble for every te
1c40: 72 6d 20 69 6e 20 74 68 65 0a 2a 2a 20 65 78 70  rm in the.** exp
1c50: 72 65 73 73 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54  ression..**.** T
1c60: 68 65 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 20 70  he EP_FromJoin p
1c70: 72 6f 70 65 72 74 79 20 69 73 20 75 73 65 64 20  roperty is used 
1c80: 6f 6e 20 74 65 72 6d 73 20 6f 66 20 61 6e 20 65  on terms of an e
1c90: 78 70 72 65 73 73 69 6f 6e 20 74 6f 20 74 65 6c  xpression to tel
1ca0: 6c 0a 2a 2a 20 74 68 65 20 4c 45 46 54 20 4f 55  l.** the LEFT OU
1cb0: 54 45 52 20 4a 4f 49 4e 20 70 72 6f 63 65 73 73  TER JOIN process
1cc0: 69 6e 67 20 6c 6f 67 69 63 20 74 68 61 74 20 74  ing logic that t
1cd0: 68 69 73 20 74 65 72 6d 20 69 73 20 70 61 72 74  his term is part
1ce0: 20 6f 66 20 74 68 65 0a 2a 2a 20 6a 6f 69 6e 20   of the.** join 
1cf0: 72 65 73 74 72 69 63 74 69 6f 6e 20 73 70 65 63  restriction spec
1d00: 69 66 69 65 64 20 69 6e 20 74 68 65 20 4f 4e 20  ified in the ON 
1d10: 6f 72 20 55 53 49 4e 47 20 63 6c 61 75 73 65 20  or USING clause 
1d20: 61 6e 64 20 6e 6f 74 20 61 20 70 61 72 74 0a 2a  and not a part.*
1d30: 2a 20 6f 66 20 74 68 65 20 6d 6f 72 65 20 67 65  * of the more ge
1d40: 6e 65 72 61 6c 20 57 48 45 52 45 20 63 6c 61 75  neral WHERE clau
1d50: 73 65 2e 20 20 54 68 65 73 65 20 74 65 72 6d 73  se.  These terms
1d60: 20 61 72 65 20 6d 6f 76 65 64 20 6f 76 65 72 20   are moved over 
1d70: 74 6f 20 74 68 65 0a 2a 2a 20 57 48 45 52 45 20  to the.** WHERE 
1d80: 63 6c 61 75 73 65 20 64 75 72 69 6e 67 20 6a 6f  clause during jo
1d90: 69 6e 20 70 72 6f 63 65 73 73 69 6e 67 20 62 75  in processing bu
1da0: 74 20 77 65 20 6e 65 65 64 20 74 6f 20 72 65 6d  t we need to rem
1db0: 65 6d 62 65 72 20 74 68 61 74 20 74 68 65 79 0a  ember that they.
1dc0: 2a 2a 20 6f 72 69 67 69 6e 61 74 65 64 20 69 6e  ** originated in
1dd0: 20 74 68 65 20 4f 4e 20 6f 72 20 55 53 49 4e 47   the ON or USING
1de0: 20 63 6c 61 75 73 65 2e 0a 2a 2a 0a 2a 2a 20 54   clause..**.** T
1df0: 68 65 20 45 78 70 72 2e 69 52 69 67 68 74 4a 6f  he Expr.iRightJo
1e00: 69 6e 54 61 62 6c 65 20 74 65 6c 6c 73 20 74 68  inTable tells th
1e10: 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 70  e WHERE clause p
1e20: 72 6f 63 65 73 73 69 6e 67 20 74 68 61 74 20 74  rocessing that t
1e30: 68 65 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e  he.** expression
1e40: 20 64 65 70 65 6e 64 73 20 6f 6e 20 74 61 62 6c   depends on tabl
1e50: 65 20 69 52 69 67 68 74 4a 6f 69 6e 54 61 62 6c  e iRightJoinTabl
1e60: 65 20 65 76 65 6e 20 69 66 20 74 68 61 74 20 74  e even if that t
1e70: 61 62 6c 65 20 69 73 20 6e 6f 74 0a 2a 2a 20 65  able is not.** e
1e80: 78 70 6c 69 63 69 74 6c 79 20 6d 65 6e 74 69 6f  xplicitly mentio
1e90: 6e 65 64 20 69 6e 20 74 68 65 20 65 78 70 72 65  ned in the expre
1ea0: 73 73 69 6f 6e 2e 20 20 54 68 61 74 20 69 6e 66  ssion.  That inf
1eb0: 6f 72 6d 61 74 69 6f 6e 20 69 73 20 6e 65 65 64  ormation is need
1ec0: 65 64 0a 2a 2a 20 66 6f 72 20 63 61 73 65 73 20  ed.** for cases 
1ed0: 6c 69 6b 65 20 74 68 69 73 3a 0a 2a 2a 0a 2a 2a  like this:.**.**
1ee0: 20 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f      SELECT * FRO
1ef0: 4d 20 74 31 20 4c 45 46 54 20 4a 4f 49 4e 20 74  M t1 LEFT JOIN t
1f00: 32 20 4f 4e 20 74 31 2e 61 3d 74 32 2e 62 20 41  2 ON t1.a=t2.b A
1f10: 4e 44 20 74 31 2e 78 3d 35 0a 2a 2a 0a 2a 2a 20  ND t1.x=5.**.** 
1f20: 54 68 65 20 77 68 65 72 65 20 63 6c 61 75 73 65  The where clause
1f30: 20 6e 65 65 64 73 20 74 6f 20 64 65 66 65 72 20   needs to defer 
1f40: 74 68 65 20 68 61 6e 64 6c 69 6e 67 20 6f 66 20  the handling of 
1f50: 74 68 65 20 74 31 2e 78 3d 35 0a 2a 2a 20 74 65  the t1.x=5.** te
1f60: 72 6d 20 75 6e 74 69 6c 20 61 66 74 65 72 20 74  rm until after t
1f70: 68 65 20 74 32 20 6c 6f 6f 70 20 6f 66 20 74 68  he t2 loop of th
1f80: 65 20 6a 6f 69 6e 2e 20 20 49 6e 20 74 68 61 74  e join.  In that
1f90: 20 77 61 79 2c 20 61 0a 2a 2a 20 4e 55 4c 4c 20   way, a.** NULL 
1fa0: 74 32 20 72 6f 77 20 77 69 6c 6c 20 62 65 20 69  t2 row will be i
1fb0: 6e 73 65 72 74 65 64 20 77 68 65 6e 65 76 65 72  nserted whenever
1fc0: 20 74 31 2e 78 21 3d 35 2e 20 20 49 66 20 77 65   t1.x!=5.  If we
1fd0: 20 64 6f 20 6e 6f 74 0a 2a 2a 20 64 65 66 65 72   do not.** defer
1fe0: 20 74 68 65 20 68 61 6e 64 6c 69 6e 67 20 6f 66   the handling of
1ff0: 20 74 31 2e 78 3d 35 2c 20 69 74 20 77 69 6c 6c   t1.x=5, it will
2000: 20 62 65 20 70 72 6f 63 65 73 73 65 64 20 69 6d   be processed im
2010: 6d 65 64 69 61 74 65 6c 79 0a 2a 2a 20 61 66 74  mediately.** aft
2020: 65 72 20 74 68 65 20 74 31 20 6c 6f 6f 70 20 61  er the t1 loop a
2030: 6e 64 20 72 6f 77 73 20 77 69 74 68 20 74 31 2e  nd rows with t1.
2040: 78 21 3d 35 20 77 69 6c 6c 20 6e 65 76 65 72 20  x!=5 will never 
2050: 61 70 70 65 61 72 20 69 6e 0a 2a 2a 20 74 68 65  appear in.** the
2060: 20 6f 75 74 70 75 74 2c 20 77 68 69 63 68 20 69   output, which i
2070: 73 20 69 6e 63 6f 72 72 65 63 74 2e 0a 2a 2f 0a  s incorrect..*/.
2080: 73 74 61 74 69 63 20 76 6f 69 64 20 73 65 74 4a  static void setJ
2090: 6f 69 6e 45 78 70 72 28 45 78 70 72 20 2a 70 2c  oinExpr(Expr *p,
20a0: 20 69 6e 74 20 69 54 61 62 6c 65 29 7b 0a 20 20   int iTable){.  
20b0: 77 68 69 6c 65 28 20 70 20 29 7b 0a 20 20 20 20  while( p ){.    
20c0: 45 78 70 72 53 65 74 50 72 6f 70 65 72 74 79 28  ExprSetProperty(
20d0: 70 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29 3b  p, EP_FromJoin);
20e0: 0a 20 20 20 20 70 2d 3e 69 52 69 67 68 74 4a 6f  .    p->iRightJo
20f0: 69 6e 54 61 62 6c 65 20 3d 20 69 54 61 62 6c 65  inTable = iTable
2100: 3b 0a 20 20 20 20 73 65 74 4a 6f 69 6e 45 78 70  ;.    setJoinExp
2110: 72 28 70 2d 3e 70 4c 65 66 74 2c 20 69 54 61 62  r(p->pLeft, iTab
2120: 6c 65 29 3b 0a 20 20 20 20 70 20 3d 20 70 2d 3e  le);.    p = p->
2130: 70 52 69 67 68 74 3b 0a 20 20 7d 20 0a 7d 0a 0a  pRight;.  } .}..
2140: 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
2150: 6e 65 20 70 72 6f 63 65 73 73 65 73 20 74 68 65  ne processes the
2160: 20 6a 6f 69 6e 20 69 6e 66 6f 72 6d 61 74 69 6f   join informatio
2170: 6e 20 66 6f 72 20 61 20 53 45 4c 45 43 54 20 73  n for a SELECT s
2180: 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 20 4f 4e 20  tatement..** ON 
2190: 61 6e 64 20 55 53 49 4e 47 20 63 6c 61 75 73 65  and USING clause
21a0: 73 20 61 72 65 20 63 6f 6e 76 65 72 74 65 64 20  s are converted 
21b0: 69 6e 74 6f 20 65 78 74 72 61 20 74 65 72 6d 73  into extra terms
21c0: 20 6f 66 20 74 68 65 20 57 48 45 52 45 20 63 6c   of the WHERE cl
21d0: 61 75 73 65 2e 0a 2a 2a 20 4e 41 54 55 52 41 4c  ause..** NATURAL
21e0: 20 6a 6f 69 6e 73 20 61 6c 73 6f 20 63 72 65 61   joins also crea
21f0: 74 65 20 65 78 74 72 61 20 57 48 45 52 45 20 63  te extra WHERE c
2200: 6c 61 75 73 65 20 74 65 72 6d 73 2e 0a 2a 2a 0a  lause terms..**.
2210: 2a 2a 20 54 68 65 20 74 65 72 6d 73 20 6f 66 20  ** The terms of 
2220: 61 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 61 72  a FROM clause ar
2230: 65 20 63 6f 6e 74 61 69 6e 65 64 20 69 6e 20 74  e contained in t
2240: 68 65 20 53 65 6c 65 63 74 2e 70 53 72 63 20 73  he Select.pSrc s
2250: 74 72 75 63 74 75 72 65 2e 0a 2a 2a 20 54 68 65  tructure..** The
2260: 20 6c 65 66 74 20 6d 6f 73 74 20 74 61 62 6c 65   left most table
2270: 20 69 73 20 74 68 65 20 66 69 72 73 74 20 65 6e   is the first en
2280: 74 72 79 20 69 6e 20 53 65 6c 65 63 74 2e 70 53  try in Select.pS
2290: 72 63 2e 20 20 54 68 65 20 72 69 67 68 74 2d 6d  rc.  The right-m
22a0: 6f 73 74 0a 2a 2a 20 74 61 62 6c 65 20 69 73 20  ost.** table is 
22b0: 74 68 65 20 6c 61 73 74 20 65 6e 74 72 79 2e 20  the last entry. 
22c0: 20 54 68 65 20 6a 6f 69 6e 20 6f 70 65 72 61 74   The join operat
22d0: 6f 72 20 69 73 20 68 65 6c 64 20 69 6e 20 74 68  or is held in th
22e0: 65 20 65 6e 74 72 79 20 74 6f 0a 2a 2a 20 74 68  e entry to.** th
22f0: 65 20 6c 65 66 74 2e 20 20 54 68 75 73 20 65 6e  e left.  Thus en
2300: 74 72 79 20 30 20 63 6f 6e 74 61 69 6e 73 20 74  try 0 contains t
2310: 68 65 20 6a 6f 69 6e 20 6f 70 65 72 61 74 6f 72  he join operator
2320: 20 66 6f 72 20 74 68 65 20 6a 6f 69 6e 20 62 65   for the join be
2330: 74 77 65 65 6e 0a 2a 2a 20 65 6e 74 72 69 65 73  tween.** entries
2340: 20 30 20 61 6e 64 20 31 2e 20 20 41 6e 79 20 4f   0 and 1.  Any O
2350: 4e 20 6f 72 20 55 53 49 4e 47 20 63 6c 61 75 73  N or USING claus
2360: 65 73 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  es associated wi
2370: 74 68 20 74 68 65 20 6a 6f 69 6e 20 61 72 65 0a  th the join are.
2380: 2a 2a 20 61 6c 73 6f 20 61 74 74 61 63 68 65 64  ** also attached
2390: 20 74 6f 20 74 68 65 20 6c 65 66 74 20 65 6e 74   to the left ent
23a0: 72 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  ry..**.** This r
23b0: 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73 20 74  outine returns t
23c0: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 65 72 72  he number of err
23d0: 6f 72 73 20 65 6e 63 6f 75 6e 74 65 72 65 64 2e  ors encountered.
23e0: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73  .*/.static int s
23f0: 71 6c 69 74 65 50 72 6f 63 65 73 73 4a 6f 69 6e  qliteProcessJoin
2400: 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
2410: 53 65 6c 65 63 74 20 2a 70 29 7b 0a 20 20 53 72  Select *p){.  Sr
2420: 63 4c 69 73 74 20 2a 70 53 72 63 3b 20 20 20 20  cList *pSrc;    
2430: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2440: 20 41 6c 6c 20 74 61 62 6c 65 73 20 69 6e 20 74   All tables in t
2450: 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 2a  he FROM clause *
2460: 2f 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 20 20 20  /.  int i, j;   
2470: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2480: 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e      /* Loop coun
2490: 74 65 72 73 20 2a 2f 0a 20 20 73 74 72 75 63 74  ters */.  struct
24a0: 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70   SrcList_item *p
24b0: 4c 65 66 74 3b 20 20 20 20 20 2f 2a 20 4c 65 66  Left;     /* Lef
24c0: 74 20 74 61 62 6c 65 20 62 65 69 6e 67 20 6a 6f  t table being jo
24d0: 69 6e 65 64 20 2a 2f 0a 20 20 73 74 72 75 63 74  ined */.  struct
24e0: 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70   SrcList_item *p
24f0: 52 69 67 68 74 3b 20 20 20 20 2f 2a 20 52 69 67  Right;    /* Rig
2500: 68 74 20 74 61 62 6c 65 20 62 65 69 6e 67 20 6a  ht table being j
2510: 6f 69 6e 65 64 20 2a 2f 0a 0a 20 20 70 53 72 63  oined */..  pSrc
2520: 20 3d 20 70 2d 3e 70 53 72 63 3b 0a 20 20 70 4c   = p->pSrc;.  pL
2530: 65 66 74 20 3d 20 26 70 53 72 63 2d 3e 61 5b 30  eft = &pSrc->a[0
2540: 5d 3b 0a 20 20 70 52 69 67 68 74 20 3d 20 26 70  ];.  pRight = &p
2550: 4c 65 66 74 5b 31 5d 3b 0a 20 20 66 6f 72 28 69  Left[1];.  for(i
2560: 3d 30 3b 20 69 3c 70 53 72 63 2d 3e 6e 53 72 63  =0; i<pSrc->nSrc
2570: 2d 31 3b 20 69 2b 2b 2c 20 70 52 69 67 68 74 2b  -1; i++, pRight+
2580: 2b 2c 20 70 4c 65 66 74 2b 2b 29 7b 0a 20 20 20  +, pLeft++){.   
2590: 20 54 61 62 6c 65 20 2a 70 4c 65 66 74 54 61 62   Table *pLeftTab
25a0: 20 3d 20 70 4c 65 66 74 2d 3e 70 54 61 62 3b 0a   = pLeft->pTab;.
25b0: 20 20 20 20 54 61 62 6c 65 20 2a 70 52 69 67 68      Table *pRigh
25c0: 74 54 61 62 20 3d 20 70 52 69 67 68 74 2d 3e 70  tTab = pRight->p
25d0: 54 61 62 3b 0a 0a 20 20 20 20 69 66 28 20 70 4c  Tab;..    if( pL
25e0: 65 66 74 54 61 62 3d 3d 30 20 7c 7c 20 70 52 69  eftTab==0 || pRi
25f0: 67 68 74 54 61 62 3d 3d 30 20 29 20 63 6f 6e 74  ghtTab==0 ) cont
2600: 69 6e 75 65 3b 0a 0a 20 20 20 20 2f 2a 20 57 68  inue;..    /* Wh
2610: 65 6e 20 74 68 65 20 4e 41 54 55 52 41 4c 20 6b  en the NATURAL k
2620: 65 79 77 6f 72 64 20 69 73 20 70 72 65 73 65 6e  eyword is presen
2630: 74 2c 20 61 64 64 20 57 48 45 52 45 20 63 6c 61  t, add WHERE cla
2640: 75 73 65 20 74 65 72 6d 73 20 66 6f 72 0a 20 20  use terms for.  
2650: 20 20 2a 2a 20 65 76 65 72 79 20 63 6f 6c 75 6d    ** every colum
2660: 6e 20 74 68 61 74 20 74 68 65 20 74 77 6f 20 74  n that the two t
2670: 61 62 6c 65 73 20 68 61 76 65 20 69 6e 20 63 6f  ables have in co
2680: 6d 6d 6f 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  mmon..    */.   
2690: 20 69 66 28 20 70 52 69 67 68 74 2d 3e 6a 6f 69   if( pRight->joi
26a0: 6e 74 79 70 65 20 26 20 4a 54 5f 4e 41 54 55 52  ntype & JT_NATUR
26b0: 41 4c 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  AL ){.      if( 
26c0: 70 52 69 67 68 74 2d 3e 70 4f 6e 20 7c 7c 20 70  pRight->pOn || p
26d0: 52 69 67 68 74 2d 3e 70 55 73 69 6e 67 20 29 7b  Right->pUsing ){
26e0: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
26f0: 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
2700: 20 22 61 20 4e 41 54 55 52 41 4c 20 6a 6f 69 6e   "a NATURAL join
2710: 20 6d 61 79 20 6e 6f 74 20 68 61 76 65 20 22 0a   may not have ".
2720: 20 20 20 20 20 20 20 20 20 20 20 22 61 6e 20 4f             "an O
2730: 4e 20 6f 72 20 55 53 49 4e 47 20 63 6c 61 75 73  N or USING claus
2740: 65 22 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20  e", 0);.        
2750: 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 20 20  return 1;.      
2760: 7d 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b  }.      for(j=0;
2770: 20 6a 3c 70 4c 65 66 74 54 61 62 2d 3e 6e 43 6f   j<pLeftTab->nCo
2780: 6c 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20  l; j++){.       
2790: 20 63 68 61 72 20 2a 7a 4e 61 6d 65 20 3d 20 70   char *zName = p
27a0: 4c 65 66 74 54 61 62 2d 3e 61 43 6f 6c 5b 6a 5d  LeftTab->aCol[j]
27b0: 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20 20 20  .zName;.        
27c0: 69 66 28 20 63 6f 6c 75 6d 6e 49 6e 64 65 78 28  if( columnIndex(
27d0: 70 52 69 67 68 74 54 61 62 2c 20 7a 4e 61 6d 65  pRightTab, zName
27e0: 29 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )>=0 ){.        
27f0: 20 20 61 64 64 57 68 65 72 65 54 65 72 6d 28 70    addWhereTerm(p
2800: 50 61 72 73 65 2c 20 7a 4e 61 6d 65 2c 20 70 4c  Parse, zName, pL
2810: 65 66 74 54 61 62 2c 20 70 4c 65 66 74 2d 3e 7a  eftTab, pLeft->z
2820: 41 6c 69 61 73 2c 20 0a 20 20 20 20 20 20 20 20  Alias, .        
2830: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2840: 20 20 20 20 20 20 70 52 69 67 68 74 54 61 62 2c        pRightTab,
2850: 20 70 52 69 67 68 74 2d 3e 7a 41 6c 69 61 73 2c   pRight->zAlias,
2860: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
2870: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
2880: 52 69 67 68 74 2d 3e 69 43 75 72 73 6f 72 2c 20  Right->iCursor, 
2890: 26 70 2d 3e 70 57 68 65 72 65 29 3b 0a 20 20 20  &p->pWhere);.   
28a0: 20 20 20 20 20 20 20 0a 20 20 20 20 20 20 20 20         .        
28b0: 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  }.      }.    }.
28c0: 0a 20 20 20 20 2f 2a 20 44 69 73 61 6c 6c 6f 77  .    /* Disallow
28d0: 20 62 6f 74 68 20 4f 4e 20 61 6e 64 20 55 53 49   both ON and USI
28e0: 4e 47 20 63 6c 61 75 73 65 73 20 69 6e 20 74 68  NG clauses in th
28f0: 65 20 73 61 6d 65 20 6a 6f 69 6e 0a 20 20 20 20  e same join.    
2900: 2a 2f 0a 20 20 20 20 69 66 28 20 70 52 69 67 68  */.    if( pRigh
2910: 74 2d 3e 70 4f 6e 20 26 26 20 70 52 69 67 68 74  t->pOn && pRight
2920: 2d 3e 70 55 73 69 6e 67 20 29 7b 0a 20 20 20 20  ->pUsing ){.    
2930: 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
2940: 67 28 70 50 61 72 73 65 2c 20 22 63 61 6e 6e 6f  g(pParse, "canno
2950: 74 20 68 61 76 65 20 62 6f 74 68 20 4f 4e 20 61  t have both ON a
2960: 6e 64 20 55 53 49 4e 47 20 22 0a 20 20 20 20 20  nd USING ".     
2970: 20 20 20 22 63 6c 61 75 73 65 73 20 69 6e 20 74     "clauses in t
2980: 68 65 20 73 61 6d 65 20 6a 6f 69 6e 22 29 3b 0a  he same join");.
2990: 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a        return 1;.
29a0: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 41 64      }..    /* Ad
29b0: 64 20 74 68 65 20 4f 4e 20 63 6c 61 75 73 65 20  d the ON clause 
29c0: 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68  to the end of th
29d0: 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 2c 20  e WHERE clause, 
29e0: 63 6f 6e 6e 65 63 74 65 64 20 62 79 0a 20 20 20  connected by.   
29f0: 20 2a 2a 20 61 6e 20 41 4e 44 20 6f 70 65 72 61   ** an AND opera
2a00: 74 6f 72 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  tor..    */.    
2a10: 69 66 28 20 70 52 69 67 68 74 2d 3e 70 4f 6e 20  if( pRight->pOn 
2a20: 29 7b 0a 20 20 20 20 20 20 73 65 74 4a 6f 69 6e  ){.      setJoin
2a30: 45 78 70 72 28 70 52 69 67 68 74 2d 3e 70 4f 6e  Expr(pRight->pOn
2a40: 2c 20 70 52 69 67 68 74 2d 3e 69 43 75 72 73 6f  , pRight->iCurso
2a50: 72 29 3b 0a 20 20 20 20 20 20 70 2d 3e 70 57 68  r);.      p->pWh
2a60: 65 72 65 20 3d 20 73 71 6c 69 74 65 33 45 78 70  ere = sqlite3Exp
2a70: 72 41 6e 64 28 70 50 61 72 73 65 2d 3e 64 62 2c  rAnd(pParse->db,
2a80: 20 70 2d 3e 70 57 68 65 72 65 2c 20 70 52 69 67   p->pWhere, pRig
2a90: 68 74 2d 3e 70 4f 6e 29 3b 0a 20 20 20 20 20 20  ht->pOn);.      
2aa0: 70 52 69 67 68 74 2d 3e 70 4f 6e 20 3d 20 30 3b  pRight->pOn = 0;
2ab0: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43  .    }..    /* C
2ac0: 72 65 61 74 65 20 65 78 74 72 61 20 74 65 72 6d  reate extra term
2ad0: 73 20 6f 6e 20 74 68 65 20 57 48 45 52 45 20 63  s on the WHERE c
2ae0: 6c 61 75 73 65 20 66 6f 72 20 65 61 63 68 20 63  lause for each c
2af0: 6f 6c 75 6d 6e 20 6e 61 6d 65 64 0a 20 20 20 20  olumn named.    
2b00: 2a 2a 20 69 6e 20 74 68 65 20 55 53 49 4e 47 20  ** in the USING 
2b10: 63 6c 61 75 73 65 2e 20 20 45 78 61 6d 70 6c 65  clause.  Example
2b20: 3a 20 49 66 20 74 68 65 20 74 77 6f 20 74 61 62  : If the two tab
2b30: 6c 65 73 20 74 6f 20 62 65 20 6a 6f 69 6e 65 64  les to be joined
2b40: 20 61 72 65 20 0a 20 20 20 20 2a 2a 20 41 20 61   are .    ** A a
2b50: 6e 64 20 42 20 61 6e 64 20 74 68 65 20 55 53 49  nd B and the USI
2b60: 4e 47 20 63 6c 61 75 73 65 20 6e 61 6d 65 73 20  NG clause names 
2b70: 58 2c 20 59 2c 20 61 6e 64 20 5a 2c 20 74 68 65  X, Y, and Z, the
2b80: 6e 20 61 64 64 20 74 68 69 73 0a 20 20 20 20 2a  n add this.    *
2b90: 2a 20 74 6f 20 74 68 65 20 57 48 45 52 45 20 63  * to the WHERE c
2ba0: 6c 61 75 73 65 3a 20 20 20 20 41 2e 58 3d 42 2e  lause:    A.X=B.
2bb0: 58 20 41 4e 44 20 41 2e 59 3d 42 2e 59 20 41 4e  X AND A.Y=B.Y AN
2bc0: 44 20 41 2e 5a 3d 42 2e 5a 0a 20 20 20 20 2a 2a  D A.Z=B.Z.    **
2bd0: 20 52 65 70 6f 72 74 20 61 6e 20 65 72 72 6f 72   Report an error
2be0: 20 69 66 20 61 6e 79 20 63 6f 6c 75 6d 6e 20 6d   if any column m
2bf0: 65 6e 74 69 6f 6e 65 64 20 69 6e 20 74 68 65 20  entioned in the 
2c00: 55 53 49 4e 47 20 63 6c 61 75 73 65 20 69 73 0a  USING clause is.
2c10: 20 20 20 20 2a 2a 20 6e 6f 74 20 63 6f 6e 74 61      ** not conta
2c20: 69 6e 65 64 20 69 6e 20 62 6f 74 68 20 74 61 62  ined in both tab
2c30: 6c 65 73 20 74 6f 20 62 65 20 6a 6f 69 6e 65 64  les to be joined
2c40: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
2c50: 20 70 52 69 67 68 74 2d 3e 70 55 73 69 6e 67 20   pRight->pUsing 
2c60: 29 7b 0a 20 20 20 20 20 20 49 64 4c 69 73 74 20  ){.      IdList 
2c70: 2a 70 4c 69 73 74 20 3d 20 70 52 69 67 68 74 2d  *pList = pRight-
2c80: 3e 70 55 73 69 6e 67 3b 0a 20 20 20 20 20 20 66  >pUsing;.      f
2c90: 6f 72 28 6a 3d 30 3b 20 6a 3c 70 4c 69 73 74 2d  or(j=0; j<pList-
2ca0: 3e 6e 49 64 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20  >nId; j++){.    
2cb0: 20 20 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 20      char *zName 
2cc0: 3d 20 70 4c 69 73 74 2d 3e 61 5b 6a 5d 2e 7a 4e  = pList->a[j].zN
2cd0: 61 6d 65 3b 0a 20 20 20 20 20 20 20 20 69 66 28  ame;.        if(
2ce0: 20 63 6f 6c 75 6d 6e 49 6e 64 65 78 28 70 4c 65   columnIndex(pLe
2cf0: 66 74 54 61 62 2c 20 7a 4e 61 6d 65 29 3c 30 20  ftTab, zName)<0 
2d00: 7c 7c 20 63 6f 6c 75 6d 6e 49 6e 64 65 78 28 70  || columnIndex(p
2d10: 52 69 67 68 74 54 61 62 2c 20 7a 4e 61 6d 65 29  RightTab, zName)
2d20: 3c 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  <0 ){.          
2d30: 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
2d40: 70 50 61 72 73 65 2c 20 22 63 61 6e 6e 6f 74 20  pParse, "cannot 
2d50: 6a 6f 69 6e 20 75 73 69 6e 67 20 63 6f 6c 75 6d  join using colum
2d60: 6e 20 25 73 20 2d 20 63 6f 6c 75 6d 6e 20 22 0a  n %s - column ".
2d70: 20 20 20 20 20 20 20 20 20 20 20 20 22 6e 6f 74              "not
2d80: 20 70 72 65 73 65 6e 74 20 69 6e 20 62 6f 74 68   present in both
2d90: 20 74 61 62 6c 65 73 22 2c 20 7a 4e 61 6d 65 29   tables", zName)
2da0: 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75  ;.          retu
2db0: 72 6e 20 31 3b 0a 20 20 20 20 20 20 20 20 7d 0a  rn 1;.        }.
2dc0: 20 20 20 20 20 20 20 20 61 64 64 57 68 65 72 65          addWhere
2dd0: 54 65 72 6d 28 70 50 61 72 73 65 2c 20 7a 4e 61  Term(pParse, zNa
2de0: 6d 65 2c 20 70 4c 65 66 74 54 61 62 2c 20 70 4c  me, pLeftTab, pL
2df0: 65 66 74 2d 3e 7a 41 6c 69 61 73 2c 20 0a 20 20  eft->zAlias, .  
2e00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e10: 20 20 20 20 20 20 20 20 20 20 70 52 69 67 68 74            pRight
2e20: 54 61 62 2c 20 70 52 69 67 68 74 2d 3e 7a 41 6c  Tab, pRight->zAl
2e30: 69 61 73 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ias,.           
2e40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e50: 20 70 52 69 67 68 74 2d 3e 69 43 75 72 73 6f 72   pRight->iCursor
2e60: 2c 20 26 70 2d 3e 70 57 68 65 72 65 29 3b 0a 20  , &p->pWhere);. 
2e70: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
2e80: 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a  .  return 0;.}..
2e90: 2f 2a 0a 2a 2a 20 49 6e 73 65 72 74 20 63 6f 64  /*.** Insert cod
2ea0: 65 20 69 6e 74 6f 20 22 76 22 20 74 68 61 74 20  e into "v" that 
2eb0: 77 69 6c 6c 20 70 75 73 68 20 74 68 65 20 72 65  will push the re
2ec0: 63 6f 72 64 20 6f 6e 20 74 68 65 20 74 6f 70 20  cord on the top 
2ed0: 6f 66 20 74 68 65 0a 2a 2a 20 73 74 61 63 6b 20  of the.** stack 
2ee0: 69 6e 74 6f 20 74 68 65 20 73 6f 72 74 65 72 2e  into the sorter.
2ef0: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
2f00: 70 75 73 68 4f 6e 74 6f 53 6f 72 74 65 72 28 0a  pushOntoSorter(.
2f10: 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
2f20: 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73           /* Pars
2f30: 65 72 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  er context */.  
2f40: 45 78 70 72 4c 69 73 74 20 2a 70 4f 72 64 65 72  ExprList *pOrder
2f50: 42 79 2c 20 20 20 20 2f 2a 20 54 68 65 20 4f 52  By,    /* The OR
2f60: 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 2a 2f  DER BY clause */
2f70: 0a 20 20 53 65 6c 65 63 74 20 2a 70 53 65 6c 65  .  Select *pSele
2f80: 63 74 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65  ct        /* The
2f90: 20 77 68 6f 6c 65 20 53 45 4c 45 43 54 20 73 74   whole SELECT st
2fa0: 61 74 65 6d 65 6e 74 20 2a 2f 0a 29 7b 0a 20 20  atement */.){.  
2fb0: 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65  Vdbe *v = pParse
2fc0: 2d 3e 70 56 64 62 65 3b 0a 20 20 73 71 6c 69 74  ->pVdbe;.  sqlit
2fd0: 65 33 45 78 70 72 43 6f 64 65 45 78 70 72 4c 69  e3ExprCodeExprLi
2fe0: 73 74 28 70 50 61 72 73 65 2c 20 70 4f 72 64 65  st(pParse, pOrde
2ff0: 72 42 79 29 3b 0a 20 20 73 71 6c 69 74 65 33 56  rBy);.  sqlite3V
3000: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 53  dbeAddOp(v, OP_S
3010: 65 71 75 65 6e 63 65 2c 20 70 4f 72 64 65 72 42  equence, pOrderB
3020: 79 2d 3e 69 45 43 75 72 73 6f 72 2c 20 30 29 3b  y->iECursor, 0);
3030: 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  .  sqlite3VdbeAd
3040: 64 4f 70 28 76 2c 20 4f 50 5f 50 75 6c 6c 2c 20  dOp(v, OP_Pull, 
3050: 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 20  pOrderBy->nExpr 
3060: 2b 20 31 2c 20 30 29 3b 0a 20 20 73 71 6c 69 74  + 1, 0);.  sqlit
3070: 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
3080: 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20 70 4f  P_MakeRecord, pO
3090: 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 20 2b 20  rderBy->nExpr + 
30a0: 32 2c 20 30 29 3b 0a 20 20 73 71 6c 69 74 65 33  2, 0);.  sqlite3
30b0: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
30c0: 49 64 78 49 6e 73 65 72 74 2c 20 70 4f 72 64 65  IdxInsert, pOrde
30d0: 72 42 79 2d 3e 69 45 43 75 72 73 6f 72 2c 20 30  rBy->iECursor, 0
30e0: 29 3b 0a 20 20 69 66 28 20 70 53 65 6c 65 63 74  );.  if( pSelect
30f0: 2d 3e 69 4c 69 6d 69 74 3e 3d 30 20 29 7b 0a 20  ->iLimit>=0 ){. 
3100: 20 20 20 69 6e 74 20 61 64 64 72 31 2c 20 61 64     int addr1, ad
3110: 64 72 32 3b 0a 20 20 20 20 61 64 64 72 31 20 3d  dr2;.    addr1 =
3120: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
3130: 70 28 76 2c 20 4f 50 5f 49 66 4d 65 6d 5a 65 72  p(v, OP_IfMemZer
3140: 6f 2c 20 70 53 65 6c 65 63 74 2d 3e 69 4c 69 6d  o, pSelect->iLim
3150: 69 74 2b 31 2c 20 30 29 3b 0a 20 20 20 20 73 71  it+1, 0);.    sq
3160: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
3170: 2c 20 4f 50 5f 4d 65 6d 49 6e 63 72 2c 20 2d 31  , OP_MemIncr, -1
3180: 2c 20 70 53 65 6c 65 63 74 2d 3e 69 4c 69 6d 69  , pSelect->iLimi
3190: 74 2b 31 29 3b 0a 20 20 20 20 61 64 64 72 32 20  t+1);.    addr2 
31a0: 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  = sqlite3VdbeAdd
31b0: 4f 70 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30  Op(v, OP_Goto, 0
31c0: 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  , 0);.    sqlite
31d0: 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c  3VdbeJumpHere(v,
31e0: 20 61 64 64 72 31 29 3b 0a 20 20 20 20 73 71 6c   addr1);.    sql
31f0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
3200: 20 4f 50 5f 4c 61 73 74 2c 20 70 4f 72 64 65 72   OP_Last, pOrder
3210: 42 79 2d 3e 69 45 43 75 72 73 6f 72 2c 20 30 29  By->iECursor, 0)
3220: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
3230: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 44 65 6c  eAddOp(v, OP_Del
3240: 65 74 65 2c 20 70 4f 72 64 65 72 42 79 2d 3e 69  ete, pOrderBy->i
3250: 45 43 75 72 73 6f 72 2c 20 30 29 3b 0a 20 20 20  ECursor, 0);.   
3260: 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70   sqlite3VdbeJump
3270: 48 65 72 65 28 76 2c 20 61 64 64 72 32 29 3b 0a  Here(v, addr2);.
3280: 20 20 20 20 70 53 65 6c 65 63 74 2d 3e 69 4c 69      pSelect->iLi
3290: 6d 69 74 20 3d 20 2d 31 3b 0a 20 20 7d 0a 7d 0a  mit = -1;.  }.}.
32a0: 0a 2f 2a 0a 2a 2a 20 41 64 64 20 63 6f 64 65 20  ./*.** Add code 
32b0: 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 74 68 65  to implement the
32c0: 20 4f 46 46 53 45 54 0a 2a 2f 0a 73 74 61 74 69   OFFSET.*/.stati
32d0: 63 20 76 6f 69 64 20 63 6f 64 65 4f 66 66 73 65  c void codeOffse
32e0: 74 28 0a 20 20 56 64 62 65 20 2a 76 2c 20 20 20  t(.  Vdbe *v,   
32f0: 20 20 20 20 20 20 20 2f 2a 20 47 65 6e 65 72 61         /* Genera
3300: 74 65 20 63 6f 64 65 20 69 6e 74 6f 20 74 68 69  te code into thi
3310: 73 20 56 4d 20 2a 2f 0a 20 20 53 65 6c 65 63 74  s VM */.  Select
3320: 20 2a 70 2c 20 20 20 20 20 20 20 20 2f 2a 20 54   *p,        /* T
3330: 68 65 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d  he SELECT statem
3340: 65 6e 74 20 62 65 69 6e 67 20 63 6f 64 65 64 20  ent being coded 
3350: 2a 2f 0a 20 20 69 6e 74 20 69 43 6f 6e 74 69 6e  */.  int iContin
3360: 75 65 2c 20 20 20 20 2f 2a 20 4a 75 6d 70 20 68  ue,    /* Jump h
3370: 65 72 65 20 74 6f 20 73 6b 69 70 20 74 68 65 20  ere to skip the 
3380: 63 75 72 72 65 6e 74 20 72 65 63 6f 72 64 20 2a  current record *
3390: 2f 0a 20 20 69 6e 74 20 6e 50 6f 70 20 20 20 20  /.  int nPop    
33a0: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
33b0: 6f 66 20 74 69 6d 65 73 20 74 6f 20 70 6f 70 20  of times to pop 
33c0: 73 74 61 63 6b 20 77 68 65 6e 20 6a 75 6d 70 69  stack when jumpi
33d0: 6e 67 20 2a 2f 0a 29 7b 0a 20 20 69 66 28 20 70  ng */.){.  if( p
33e0: 2d 3e 69 4f 66 66 73 65 74 3e 3d 30 20 26 26 20  ->iOffset>=0 && 
33f0: 69 43 6f 6e 74 69 6e 75 65 21 3d 30 20 29 7b 0a  iContinue!=0 ){.
3400: 20 20 20 20 69 6e 74 20 61 64 64 72 3b 0a 20 20      int addr;.  
3410: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
3420: 4f 70 28 76 2c 20 4f 50 5f 4d 65 6d 49 6e 63 72  Op(v, OP_MemIncr
3430: 2c 20 2d 31 2c 20 70 2d 3e 69 4f 66 66 73 65 74  , -1, p->iOffset
3440: 29 3b 0a 20 20 20 20 61 64 64 72 20 3d 20 73 71  );.    addr = sq
3450: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
3460: 2c 20 4f 50 5f 49 66 4d 65 6d 4e 65 67 2c 20 70  , OP_IfMemNeg, p
3470: 2d 3e 69 4f 66 66 73 65 74 2c 20 30 29 3b 0a 20  ->iOffset, 0);. 
3480: 20 20 20 69 66 28 20 6e 50 6f 70 3e 30 20 29 7b     if( nPop>0 ){
3490: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
34a0: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 50 6f  beAddOp(v, OP_Po
34b0: 70 2c 20 6e 50 6f 70 2c 20 30 29 3b 0a 20 20 20  p, nPop, 0);.   
34c0: 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64   }.    sqlite3Vd
34d0: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 47 6f  beAddOp(v, OP_Go
34e0: 74 6f 2c 20 30 2c 20 69 43 6f 6e 74 69 6e 75 65  to, 0, iContinue
34f0: 29 3b 0a 20 20 20 20 56 64 62 65 43 6f 6d 6d 65  );.    VdbeComme
3500: 6e 74 28 28 76 2c 20 22 23 20 73 6b 69 70 20 4f  nt((v, "# skip O
3510: 46 46 53 45 54 20 72 65 63 6f 72 64 73 22 29 29  FFSET records"))
3520: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
3530: 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64  eJumpHere(v, add
3540: 72 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  r);.  }.}../*.**
3550: 20 41 64 64 20 63 6f 64 65 20 74 68 61 74 20 77   Add code that w
3560: 69 6c 6c 20 63 68 65 63 6b 20 74 6f 20 6d 61 6b  ill check to mak
3570: 65 20 73 75 72 65 20 74 68 65 20 74 6f 70 20 4e  e sure the top N
3580: 20 65 6c 65 6d 65 6e 74 73 20 6f 66 20 74 68 65   elements of the
3590: 0a 2a 2a 20 73 74 61 63 6b 20 61 72 65 20 64 69  .** stack are di
35a0: 73 74 69 6e 63 74 2e 20 20 69 54 61 62 20 69 73  stinct.  iTab is
35b0: 20 61 20 73 6f 72 74 69 6e 67 20 69 6e 64 65 78   a sorting index
35c0: 20 74 68 61 74 20 68 6f 6c 64 73 20 70 72 65 76   that holds prev
35d0: 69 6f 75 73 6c 79 0a 2a 2a 20 73 65 65 6e 20 63  iously.** seen c
35e0: 6f 6d 62 69 6e 61 74 69 6f 6e 73 20 6f 66 20 74  ombinations of t
35f0: 68 65 20 4e 20 76 61 6c 75 65 73 2e 20 20 41 20  he N values.  A 
3600: 6e 65 77 20 65 6e 74 72 79 20 69 73 20 6d 61 64  new entry is mad
3610: 65 20 69 6e 20 69 54 61 62 0a 2a 2a 20 69 66 20  e in iTab.** if 
3620: 74 68 65 20 63 75 72 72 65 6e 74 20 4e 20 76 61  the current N va
3630: 6c 75 65 73 20 61 72 65 20 6e 65 77 2e 0a 2a 2a  lues are new..**
3640: 0a 2a 2a 20 41 20 6a 75 6d 70 20 74 6f 20 61 64  .** A jump to ad
3650: 64 72 52 65 70 65 61 74 20 69 73 20 6d 61 64 65  drRepeat is made
3660: 20 61 6e 64 20 74 68 65 20 4e 2b 31 20 76 61 6c   and the N+1 val
3670: 75 65 73 20 61 72 65 20 70 6f 70 70 65 64 20 66  ues are popped f
3680: 72 6f 6d 20 74 68 65 0a 2a 2a 20 73 74 61 63 6b  rom the.** stack
3690: 20 69 66 20 74 68 65 20 74 6f 70 20 4e 20 65 6c   if the top N el
36a0: 65 6d 65 6e 74 73 20 61 72 65 20 6e 6f 74 20 64  ements are not d
36b0: 69 73 74 69 6e 63 74 2e 0a 2a 2f 0a 73 74 61 74  istinct..*/.stat
36c0: 69 63 20 76 6f 69 64 20 63 6f 64 65 44 69 73 74  ic void codeDist
36d0: 69 6e 63 74 28 0a 20 20 56 64 62 65 20 2a 76 2c  inct(.  Vdbe *v,
36e0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 47 65             /* Ge
36f0: 6e 65 72 61 74 65 20 63 6f 64 65 20 69 6e 74 6f  nerate code into
3700: 20 74 68 69 73 20 56 4d 20 2a 2f 0a 20 20 69 6e   this VM */.  in
3710: 74 20 69 54 61 62 2c 20 20 20 20 20 20 20 20 20  t iTab,         
3720: 20 2f 2a 20 41 20 73 6f 72 74 69 6e 67 20 69 6e   /* A sorting in
3730: 64 65 78 20 75 73 65 64 20 74 6f 20 74 65 73 74  dex used to test
3740: 20 66 6f 72 20 64 69 73 74 69 6e 63 74 6e 65 73   for distinctnes
3750: 73 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 52  s */.  int addrR
3760: 65 70 65 61 74 2c 20 20 20 20 2f 2a 20 4a 75 6d  epeat,    /* Jum
3770: 70 20 74 6f 20 68 65 72 65 20 69 66 20 6e 6f 74  p to here if not
3780: 20 64 69 73 74 69 6e 63 74 20 2a 2f 0a 20 20 69   distinct */.  i
3790: 6e 74 20 4e 20 20 20 20 20 20 20 20 20 20 20 20  nt N            
37a0: 20 20 2f 2a 20 54 68 65 20 74 6f 70 20 4e 20 65    /* The top N e
37b0: 6c 65 6d 65 6e 74 73 20 6f 66 20 74 68 65 20 73  lements of the s
37c0: 74 61 63 6b 20 6d 75 73 74 20 62 65 20 64 69 73  tack must be dis
37d0: 74 69 6e 63 74 20 2a 2f 0a 29 7b 0a 20 20 73 71  tinct */.){.  sq
37e0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
37f0: 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c  , OP_MakeRecord,
3800: 20 2d 4e 2c 20 30 29 3b 0a 20 20 73 71 6c 69 74   -N, 0);.  sqlit
3810: 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
3820: 50 5f 44 69 73 74 69 6e 63 74 2c 20 69 54 61 62  P_Distinct, iTab
3830: 2c 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72  , sqlite3VdbeCur
3840: 72 65 6e 74 41 64 64 72 28 76 29 2b 33 29 3b 0a  rentAddr(v)+3);.
3850: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
3860: 4f 70 28 76 2c 20 4f 50 5f 50 6f 70 2c 20 4e 2b  Op(v, OP_Pop, N+
3870: 31 2c 20 30 29 3b 0a 20 20 73 71 6c 69 74 65 33  1, 0);.  sqlite3
3880: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
3890: 47 6f 74 6f 2c 20 30 2c 20 61 64 64 72 52 65 70  Goto, 0, addrRep
38a0: 65 61 74 29 3b 0a 20 20 56 64 62 65 43 6f 6d 6d  eat);.  VdbeComm
38b0: 65 6e 74 28 28 76 2c 20 22 23 20 73 6b 69 70 20  ent((v, "# skip 
38c0: 69 6e 64 69 73 74 69 6e 63 74 20 72 65 63 6f 72  indistinct recor
38d0: 64 73 22 29 29 3b 0a 20 20 73 71 6c 69 74 65 33  ds"));.  sqlite3
38e0: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
38f0: 49 64 78 49 6e 73 65 72 74 2c 20 69 54 61 62 2c  IdxInsert, iTab,
3900: 20 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65   0);.}../*.** Ge
3910: 6e 65 72 61 74 65 20 61 6e 20 65 72 72 6f 72 20  nerate an error 
3920: 6d 65 73 73 61 67 65 20 77 68 65 6e 20 61 20 53  message when a S
3930: 45 4c 45 43 54 20 69 73 20 75 73 65 64 20 77 69  ELECT is used wi
3940: 74 68 69 6e 20 61 20 73 75 62 65 78 70 72 65 73  thin a subexpres
3950: 73 69 6f 6e 0a 2a 2a 20 28 65 78 61 6d 70 6c 65  sion.** (example
3960: 3a 20 20 22 61 20 49 4e 20 28 53 45 4c 45 43 54  :  "a IN (SELECT
3970: 20 2a 20 46 52 4f 4d 20 74 61 62 6c 65 29 22 29   * FROM table)")
3980: 20 62 75 74 20 69 74 20 68 61 73 20 6d 6f 72 65   but it has more
3990: 20 74 68 61 6e 20 31 20 72 65 73 75 6c 74 0a 2a   than 1 result.*
39a0: 2a 20 63 6f 6c 75 6d 6e 2e 20 20 57 65 20 64 6f  * column.  We do
39b0: 20 74 68 69 73 20 69 6e 20 61 20 73 75 62 72 6f   this in a subro
39c0: 75 74 69 6e 65 20 62 65 63 61 75 73 65 20 74 68  utine because th
39d0: 65 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 69  e error occurs i
39e0: 6e 20 6d 75 6c 74 69 70 6c 65 0a 2a 2a 20 70 6c  n multiple.** pl
39f0: 61 63 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  aces..*/.static 
3a00: 69 6e 74 20 63 68 65 63 6b 46 6f 72 4d 75 6c 74  int checkForMult
3a10: 69 43 6f 6c 75 6d 6e 53 65 6c 65 63 74 45 72 72  iColumnSelectErr
3a20: 6f 72 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  or(Parse *pParse
3a30: 2c 20 69 6e 74 20 65 44 65 73 74 2c 20 69 6e 74  , int eDest, int
3a40: 20 6e 45 78 70 72 29 7b 0a 20 20 69 66 28 20 6e   nExpr){.  if( n
3a50: 45 78 70 72 3e 31 20 26 26 20 28 65 44 65 73 74  Expr>1 && (eDest
3a60: 3d 3d 53 52 54 5f 4d 65 6d 20 7c 7c 20 65 44 65  ==SRT_Mem || eDe
3a70: 73 74 3d 3d 53 52 54 5f 53 65 74 29 20 29 7b 0a  st==SRT_Set) ){.
3a80: 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
3a90: 4d 73 67 28 70 50 61 72 73 65 2c 20 22 6f 6e 6c  Msg(pParse, "onl
3aa0: 79 20 61 20 73 69 6e 67 6c 65 20 72 65 73 75 6c  y a single resul
3ab0: 74 20 61 6c 6c 6f 77 65 64 20 66 6f 72 20 22 0a  t allowed for ".
3ac0: 20 20 20 20 20 20 20 22 61 20 53 45 4c 45 43 54         "a SELECT
3ad0: 20 74 68 61 74 20 69 73 20 70 61 72 74 20 6f 66   that is part of
3ae0: 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 22 29   an expression")
3af0: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a  ;.    return 1;.
3b00: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65 74    }else{.    ret
3b10: 75 72 6e 20 30 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  urn 0;.  }.}../*
3b20: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
3b30: 20 67 65 6e 65 72 61 74 65 73 20 74 68 65 20 63   generates the c
3b40: 6f 64 65 20 66 6f 72 20 74 68 65 20 69 6e 73 69  ode for the insi
3b50: 64 65 20 6f 66 20 74 68 65 20 69 6e 6e 65 72 20  de of the inner 
3b60: 6c 6f 6f 70 0a 2a 2a 20 6f 66 20 61 20 53 45 4c  loop.** of a SEL
3b70: 45 43 54 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 73 72  ECT..**.** If sr
3b80: 63 54 61 62 20 61 6e 64 20 6e 43 6f 6c 75 6d 6e  cTab and nColumn
3b90: 20 61 72 65 20 62 6f 74 68 20 7a 65 72 6f 2c 20   are both zero, 
3ba0: 74 68 65 6e 20 74 68 65 20 70 45 4c 69 73 74 20  then the pEList 
3bb0: 65 78 70 72 65 73 73 69 6f 6e 73 0a 2a 2a 20 61  expressions.** a
3bc0: 72 65 20 65 76 61 6c 75 61 74 65 64 20 69 6e 20  re evaluated in 
3bd0: 6f 72 64 65 72 20 74 6f 20 67 65 74 20 74 68 65  order to get the
3be0: 20 64 61 74 61 20 66 6f 72 20 74 68 69 73 20 72   data for this r
3bf0: 6f 77 2e 20 20 49 66 20 6e 43 6f 6c 75 6d 6e 3e  ow.  If nColumn>
3c00: 30 0a 2a 2a 20 74 68 65 6e 20 64 61 74 61 20 69  0.** then data i
3c10: 73 20 70 75 6c 6c 65 64 20 66 72 6f 6d 20 73 72  s pulled from sr
3c20: 63 54 61 62 20 61 6e 64 20 70 45 4c 69 73 74 20  cTab and pEList 
3c30: 69 73 20 75 73 65 64 20 6f 6e 6c 79 20 74 6f 20  is used only to 
3c40: 67 65 74 20 74 68 65 0a 2a 2a 20 64 61 74 61 74  get the.** datat
3c50: 79 70 65 73 20 66 6f 72 20 65 61 63 68 20 63 6f  ypes for each co
3c60: 6c 75 6d 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  lumn..*/.static 
3c70: 69 6e 74 20 73 65 6c 65 63 74 49 6e 6e 65 72 4c  int selectInnerL
3c80: 6f 6f 70 28 0a 20 20 50 61 72 73 65 20 2a 70 50  oop(.  Parse *pP
3c90: 61 72 73 65 2c 20 20 20 20 20 20 20 20 20 20 2f  arse,          /
3ca0: 2a 20 54 68 65 20 70 61 72 73 65 72 20 63 6f 6e  * The parser con
3cb0: 74 65 78 74 20 2a 2f 0a 20 20 53 65 6c 65 63 74  text */.  Select
3cc0: 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20   *p,            
3cd0: 20 20 2f 2a 20 54 68 65 20 63 6f 6d 70 6c 65 74    /* The complet
3ce0: 65 20 73 65 6c 65 63 74 20 73 74 61 74 65 6d 65  e select stateme
3cf0: 6e 74 20 62 65 69 6e 67 20 63 6f 64 65 64 20 2a  nt being coded *
3d00: 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45  /.  ExprList *pE
3d10: 4c 69 73 74 2c 20 20 20 20 20 20 20 2f 2a 20 4c  List,       /* L
3d20: 69 73 74 20 6f 66 20 76 61 6c 75 65 73 20 62 65  ist of values be
3d30: 69 6e 67 20 65 78 74 72 61 63 74 65 64 20 2a 2f  ing extracted */
3d40: 0a 20 20 69 6e 74 20 73 72 63 54 61 62 2c 20 20  .  int srcTab,  
3d50: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 75             /* Pu
3d60: 6c 6c 20 64 61 74 61 20 66 72 6f 6d 20 74 68 69  ll data from thi
3d70: 73 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74  s table */.  int
3d80: 20 6e 43 6f 6c 75 6d 6e 2c 20 20 20 20 20 20 20   nColumn,       
3d90: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
3da0: 66 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65  f columns in the
3db0: 20 73 6f 75 72 63 65 20 74 61 62 6c 65 20 2a 2f   source table */
3dc0: 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4f 72  .  ExprList *pOr
3dd0: 64 65 72 42 79 2c 20 20 20 20 20 2f 2a 20 49 66  derBy,     /* If
3de0: 20 6e 6f 74 20 4e 55 4c 4c 2c 20 73 6f 72 74 20   not NULL, sort 
3df0: 72 65 73 75 6c 74 73 20 75 73 69 6e 67 20 74 68  results using th
3e00: 69 73 20 6b 65 79 20 2a 2f 0a 20 20 69 6e 74 20  is key */.  int 
3e10: 64 69 73 74 69 6e 63 74 2c 20 20 20 20 20 20 20  distinct,       
3e20: 20 20 20 20 2f 2a 20 49 66 20 3e 3d 30 2c 20 6d      /* If >=0, m
3e30: 61 6b 65 20 73 75 72 65 20 72 65 73 75 6c 74 73  ake sure results
3e40: 20 61 72 65 20 64 69 73 74 69 6e 63 74 20 2a 2f   are distinct */
3e50: 0a 20 20 69 6e 74 20 65 44 65 73 74 2c 20 20 20  .  int eDest,   
3e60: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 48 6f             /* Ho
3e70: 77 20 74 6f 20 64 69 73 70 6f 73 65 20 6f 66 20  w to dispose of 
3e80: 74 68 65 20 72 65 73 75 6c 74 73 20 2a 2f 0a 20  the results */. 
3e90: 20 69 6e 74 20 69 50 61 72 6d 2c 20 20 20 20 20   int iParm,     
3ea0: 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6e 20 61           /* An a
3eb0: 72 67 75 6d 65 6e 74 20 74 6f 20 74 68 65 20 64  rgument to the d
3ec0: 69 73 70 6f 73 61 6c 20 6d 65 74 68 6f 64 20 2a  isposal method *
3ed0: 2f 0a 20 20 69 6e 74 20 69 43 6f 6e 74 69 6e 75  /.  int iContinu
3ee0: 65 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4a  e,          /* J
3ef0: 75 6d 70 20 68 65 72 65 20 74 6f 20 63 6f 6e 74  ump here to cont
3f00: 69 6e 75 65 20 77 69 74 68 20 6e 65 78 74 20 72  inue with next r
3f10: 6f 77 20 2a 2f 0a 20 20 69 6e 74 20 69 42 72 65  ow */.  int iBre
3f20: 61 6b 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ak,             
3f30: 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20 74 6f 20  /* Jump here to 
3f40: 62 72 65 61 6b 20 6f 75 74 20 6f 66 20 74 68 65  break out of the
3f50: 20 69 6e 6e 65 72 20 6c 6f 6f 70 20 2a 2f 0a 20   inner loop */. 
3f60: 20 63 68 61 72 20 2a 61 66 66 20 20 20 20 20 20   char *aff      
3f70: 20 20 20 20 20 20 20 20 20 2f 2a 20 61 66 66 69           /* affi
3f80: 6e 69 74 79 20 73 74 72 69 6e 67 20 69 66 20 65  nity string if e
3f90: 44 65 73 74 20 69 73 20 53 52 54 5f 55 6e 69 6f  Dest is SRT_Unio
3fa0: 6e 20 2a 2f 0a 29 7b 0a 20 20 56 64 62 65 20 2a  n */.){.  Vdbe *
3fb0: 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62  v = pParse->pVdb
3fc0: 65 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e  e;.  int i;.  in
3fd0: 74 20 68 61 73 44 69 73 74 69 6e 63 74 3b 20 20  t hasDistinct;  
3fe0: 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66        /* True if
3ff0: 20 74 68 65 20 44 49 53 54 49 4e 43 54 20 6b 65   the DISTINCT ke
4000: 79 77 6f 72 64 20 69 73 20 70 72 65 73 65 6e 74  yword is present
4010: 20 2a 2f 0a 0a 20 20 69 66 28 20 76 3d 3d 30 20   */..  if( v==0 
4020: 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 61 73  ) return 0;.  as
4030: 73 65 72 74 28 20 70 45 4c 69 73 74 21 3d 30 20  sert( pEList!=0 
4040: 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 72  );..  /* If ther
4050: 65 20 77 61 73 20 61 20 4c 49 4d 49 54 20 63 6c  e was a LIMIT cl
4060: 61 75 73 65 20 6f 6e 20 74 68 65 20 53 45 4c 45  ause on the SELE
4070: 43 54 20 73 74 61 74 65 6d 65 6e 74 2c 20 74 68  CT statement, th
4080: 65 6e 20 64 6f 20 74 68 65 20 63 68 65 63 6b 0a  en do the check.
4090: 20 20 2a 2a 20 74 6f 20 73 65 65 20 69 66 20 74    ** to see if t
40a0: 68 69 73 20 72 6f 77 20 73 68 6f 75 6c 64 20 62  his row should b
40b0: 65 20 6f 75 74 70 75 74 2e 0a 20 20 2a 2f 0a 20  e output..  */. 
40c0: 20 68 61 73 44 69 73 74 69 6e 63 74 20 3d 20 64   hasDistinct = d
40d0: 69 73 74 69 6e 63 74 3e 3d 30 20 26 26 20 70 45  istinct>=0 && pE
40e0: 4c 69 73 74 2d 3e 6e 45 78 70 72 3e 30 3b 0a 20  List->nExpr>0;. 
40f0: 20 69 66 28 20 70 4f 72 64 65 72 42 79 3d 3d 30   if( pOrderBy==0
4100: 20 26 26 20 21 68 61 73 44 69 73 74 69 6e 63 74   && !hasDistinct
4110: 20 29 7b 0a 20 20 20 20 63 6f 64 65 4f 66 66 73   ){.    codeOffs
4120: 65 74 28 76 2c 20 70 2c 20 69 43 6f 6e 74 69 6e  et(v, p, iContin
4130: 75 65 2c 20 30 29 3b 0a 20 20 7d 0a 0a 20 20 2f  ue, 0);.  }..  /
4140: 2a 20 50 75 6c 6c 20 74 68 65 20 72 65 71 75 65  * Pull the reque
4150: 73 74 65 64 20 63 6f 6c 75 6d 6e 73 2e 0a 20 20  sted columns..  
4160: 2a 2f 0a 20 20 69 66 28 20 6e 43 6f 6c 75 6d 6e  */.  if( nColumn
4170: 3e 30 20 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d  >0 ){.    for(i=
4180: 30 3b 20 69 3c 6e 43 6f 6c 75 6d 6e 3b 20 69 2b  0; i<nColumn; i+
4190: 2b 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  +){.      sqlite
41a0: 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
41b0: 5f 43 6f 6c 75 6d 6e 2c 20 73 72 63 54 61 62 2c  _Column, srcTab,
41c0: 20 69 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c   i);.    }.  }el
41d0: 73 65 7b 0a 20 20 20 20 6e 43 6f 6c 75 6d 6e 20  se{.    nColumn 
41e0: 3d 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b  = pEList->nExpr;
41f0: 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72  .    sqlite3Expr
4200: 43 6f 64 65 45 78 70 72 4c 69 73 74 28 70 50 61  CodeExprList(pPa
4210: 72 73 65 2c 20 70 45 4c 69 73 74 29 3b 0a 20 20  rse, pEList);.  
4220: 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 44  }..  /* If the D
4230: 49 53 54 49 4e 43 54 20 6b 65 79 77 6f 72 64 20  ISTINCT keyword 
4240: 77 61 73 20 70 72 65 73 65 6e 74 20 6f 6e 20 74  was present on t
4250: 68 65 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d  he SELECT statem
4260: 65 6e 74 0a 20 20 2a 2a 20 61 6e 64 20 74 68 69  ent.  ** and thi
4270: 73 20 72 6f 77 20 68 61 73 20 62 65 65 6e 20 73  s row has been s
4280: 65 65 6e 20 62 65 66 6f 72 65 2c 20 74 68 65 6e  een before, then
4290: 20 64 6f 20 6e 6f 74 20 6d 61 6b 65 20 74 68 69   do not make thi
42a0: 73 20 72 6f 77 0a 20 20 2a 2a 20 70 61 72 74 20  s row.  ** part 
42b0: 6f 66 20 74 68 65 20 72 65 73 75 6c 74 2e 0a 20  of the result.. 
42c0: 20 2a 2f 0a 20 20 69 66 28 20 68 61 73 44 69 73   */.  if( hasDis
42d0: 74 69 6e 63 74 20 29 7b 0a 20 20 20 20 61 73 73  tinct ){.    ass
42e0: 65 72 74 28 20 70 45 4c 69 73 74 21 3d 30 20 29  ert( pEList!=0 )
42f0: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 45  ;.    assert( pE
4300: 4c 69 73 74 2d 3e 6e 45 78 70 72 3d 3d 6e 43 6f  List->nExpr==nCo
4310: 6c 75 6d 6e 20 29 3b 0a 20 20 20 20 63 6f 64 65  lumn );.    code
4320: 44 69 73 74 69 6e 63 74 28 76 2c 20 64 69 73 74  Distinct(v, dist
4330: 69 6e 63 74 2c 20 69 43 6f 6e 74 69 6e 75 65 2c  inct, iContinue,
4340: 20 6e 43 6f 6c 75 6d 6e 29 3b 0a 20 20 20 20 69   nColumn);.    i
4350: 66 28 20 70 4f 72 64 65 72 42 79 3d 3d 30 20 29  f( pOrderBy==0 )
4360: 7b 0a 20 20 20 20 20 20 63 6f 64 65 4f 66 66 73  {.      codeOffs
4370: 65 74 28 76 2c 20 70 2c 20 69 43 6f 6e 74 69 6e  et(v, p, iContin
4380: 75 65 2c 20 6e 43 6f 6c 75 6d 6e 29 3b 0a 20 20  ue, nColumn);.  
4390: 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20 63    }.  }..  if( c
43a0: 68 65 63 6b 46 6f 72 4d 75 6c 74 69 43 6f 6c 75  heckForMultiColu
43b0: 6d 6e 53 65 6c 65 63 74 45 72 72 6f 72 28 70 50  mnSelectError(pP
43c0: 61 72 73 65 2c 20 65 44 65 73 74 2c 20 70 45 4c  arse, eDest, pEL
43d0: 69 73 74 2d 3e 6e 45 78 70 72 29 20 29 7b 0a 20  ist->nExpr) ){. 
43e0: 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d     return 0;.  }
43f0: 0a 0a 20 20 73 77 69 74 63 68 28 20 65 44 65 73  ..  switch( eDes
4400: 74 20 29 7b 0a 20 20 20 20 2f 2a 20 49 6e 20 74  t ){.    /* In t
4410: 68 69 73 20 6d 6f 64 65 2c 20 77 72 69 74 65 20  his mode, write 
4420: 65 61 63 68 20 71 75 65 72 79 20 72 65 73 75 6c  each query resul
4430: 74 20 74 6f 20 74 68 65 20 6b 65 79 20 6f 66 20  t to the key of 
4440: 74 68 65 20 74 65 6d 70 6f 72 61 72 79 0a 20 20  the temporary.  
4450: 20 20 2a 2a 20 74 61 62 6c 65 20 69 50 61 72 6d    ** table iParm
4460: 2e 0a 20 20 20 20 2a 2f 0a 23 69 66 6e 64 65 66  ..    */.#ifndef
4470: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f 4d   SQLITE_OMIT_COM
4480: 50 4f 55 4e 44 5f 53 45 4c 45 43 54 0a 20 20 20  POUND_SELECT.   
4490: 20 63 61 73 65 20 53 52 54 5f 55 6e 69 6f 6e 3a   case SRT_Union:
44a0: 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   {.      sqlite3
44b0: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
44c0: 4d 61 6b 65 52 65 63 6f 72 64 2c 20 6e 43 6f 6c  MakeRecord, nCol
44d0: 75 6d 6e 2c 20 30 29 3b 0a 20 20 20 20 20 20 69  umn, 0);.      i
44e0: 66 28 20 61 66 66 20 29 7b 0a 20 20 20 20 20 20  f( aff ){.      
44f0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61    sqlite3VdbeCha
4500: 6e 67 65 50 33 28 76 2c 20 2d 31 2c 20 61 66 66  ngeP3(v, -1, aff
4510: 2c 20 50 33 5f 53 54 41 54 49 43 29 3b 0a 20 20  , P3_STATIC);.  
4520: 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69      }.      sqli
4530: 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
4540: 4f 50 5f 49 64 78 49 6e 73 65 72 74 2c 20 69 50  OP_IdxInsert, iP
4550: 61 72 6d 2c 20 30 29 3b 0a 20 20 20 20 20 20 62  arm, 0);.      b
4560: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  reak;.    }..   
4570: 20 2f 2a 20 43 6f 6e 73 74 72 75 63 74 20 61 20   /* Construct a 
4580: 72 65 63 6f 72 64 20 66 72 6f 6d 20 74 68 65 20  record from the 
4590: 71 75 65 72 79 20 72 65 73 75 6c 74 2c 20 62 75  query result, bu
45a0: 74 20 69 6e 73 74 65 61 64 20 6f 66 0a 20 20 20  t instead of.   
45b0: 20 2a 2a 20 73 61 76 69 6e 67 20 74 68 61 74 20   ** saving that 
45c0: 72 65 63 6f 72 64 2c 20 75 73 65 20 69 74 20 61  record, use it a
45d0: 73 20 61 20 6b 65 79 20 74 6f 20 64 65 6c 65 74  s a key to delet
45e0: 65 20 65 6c 65 6d 65 6e 74 73 20 66 72 6f 6d 0a  e elements from.
45f0: 20 20 20 20 2a 2a 20 74 68 65 20 74 65 6d 70 6f      ** the tempo
4600: 72 61 72 79 20 74 61 62 6c 65 20 69 50 61 72 6d  rary table iParm
4610: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73  ..    */.    cas
4620: 65 20 53 52 54 5f 45 78 63 65 70 74 3a 20 7b 0a  e SRT_Except: {.
4630: 20 20 20 20 20 20 69 6e 74 20 61 64 64 72 3b 0a        int addr;.
4640: 20 20 20 20 20 20 61 64 64 72 20 3d 20 73 71 6c        addr = sql
4650: 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
4660: 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20   OP_MakeRecord, 
4670: 6e 43 6f 6c 75 6d 6e 2c 20 30 29 3b 0a 20 20 20  nColumn, 0);.   
4680: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68     sqlite3VdbeCh
4690: 61 6e 67 65 50 33 28 76 2c 20 2d 31 2c 20 61 66  angeP3(v, -1, af
46a0: 66 2c 20 50 33 5f 53 54 41 54 49 43 29 3b 0a 20  f, P3_STATIC);. 
46b0: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
46c0: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4e 6f 74 46  AddOp(v, OP_NotF
46d0: 6f 75 6e 64 2c 20 69 50 61 72 6d 2c 20 61 64 64  ound, iParm, add
46e0: 72 2b 33 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  r+3);.      sqli
46f0: 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
4700: 4f 50 5f 44 65 6c 65 74 65 2c 20 69 50 61 72 6d  OP_Delete, iParm
4710: 2c 20 30 29 3b 0a 20 20 20 20 20 20 62 72 65 61  , 0);.      brea
4720: 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  k;.    }.#endif.
4730: 0a 20 20 20 20 2f 2a 20 53 74 6f 72 65 20 74 68  .    /* Store th
4740: 65 20 72 65 73 75 6c 74 20 61 73 20 64 61 74 61  e result as data
4750: 20 75 73 69 6e 67 20 61 20 75 6e 69 71 75 65 20   using a unique 
4760: 6b 65 79 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  key..    */.    
4770: 63 61 73 65 20 53 52 54 5f 54 61 62 6c 65 3a 0a  case SRT_Table:.
4780: 20 20 20 20 63 61 73 65 20 53 52 54 5f 45 70 68      case SRT_Eph
4790: 65 6d 54 61 62 3a 20 7b 0a 20 20 20 20 20 20 73  emTab: {.      s
47a0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
47b0: 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64  v, OP_MakeRecord
47c0: 2c 20 6e 43 6f 6c 75 6d 6e 2c 20 30 29 3b 0a 20  , nColumn, 0);. 
47d0: 20 20 20 20 20 69 66 28 20 70 4f 72 64 65 72 42       if( pOrderB
47e0: 79 20 29 7b 0a 20 20 20 20 20 20 20 20 70 75 73  y ){.        pus
47f0: 68 4f 6e 74 6f 53 6f 72 74 65 72 28 70 50 61 72  hOntoSorter(pPar
4800: 73 65 2c 20 70 4f 72 64 65 72 42 79 2c 20 70 29  se, pOrderBy, p)
4810: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
4820: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
4830: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4e 65  beAddOp(v, OP_Ne
4840: 77 52 6f 77 69 64 2c 20 69 50 61 72 6d 2c 20 30  wRowid, iParm, 0
4850: 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
4860: 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
4870: 50 5f 50 75 6c 6c 2c 20 31 2c 20 30 29 3b 0a 20  P_Pull, 1, 0);. 
4880: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
4890: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49 6e  beAddOp(v, OP_In
48a0: 73 65 72 74 2c 20 69 50 61 72 6d 2c 20 4f 50 46  sert, iParm, OPF
48b0: 4c 41 47 5f 41 50 50 45 4e 44 29 3b 0a 20 20 20  LAG_APPEND);.   
48c0: 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b     }.      break
48d0: 3b 0a 20 20 20 20 7d 0a 0a 23 69 66 6e 64 65 66  ;.    }..#ifndef
48e0: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42   SQLITE_OMIT_SUB
48f0: 51 55 45 52 59 0a 20 20 20 20 2f 2a 20 49 66 20  QUERY.    /* If 
4900: 77 65 20 61 72 65 20 63 72 65 61 74 69 6e 67 20  we are creating 
4910: 61 20 73 65 74 20 66 6f 72 20 61 6e 20 22 65 78  a set for an "ex
4920: 70 72 20 49 4e 20 28 53 45 4c 45 43 54 20 2e 2e  pr IN (SELECT ..
4930: 2e 29 22 20 63 6f 6e 73 74 72 75 63 74 2c 0a 20  .)" construct,. 
4940: 20 20 20 2a 2a 20 74 68 65 6e 20 74 68 65 72 65     ** then there
4950: 20 73 68 6f 75 6c 64 20 62 65 20 61 20 73 69 6e   should be a sin
4960: 67 6c 65 20 69 74 65 6d 20 6f 6e 20 74 68 65 20  gle item on the 
4970: 73 74 61 63 6b 2e 20 20 57 72 69 74 65 20 74 68  stack.  Write th
4980: 69 73 0a 20 20 20 20 2a 2a 20 69 74 65 6d 20 69  is.    ** item i
4990: 6e 74 6f 20 74 68 65 20 73 65 74 20 74 61 62 6c  nto the set tabl
49a0: 65 20 77 69 74 68 20 62 6f 67 75 73 20 64 61 74  e with bogus dat
49b0: 61 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61  a..    */.    ca
49c0: 73 65 20 53 52 54 5f 53 65 74 3a 20 7b 0a 20 20  se SRT_Set: {.  
49d0: 20 20 20 20 69 6e 74 20 61 64 64 72 31 20 3d 20      int addr1 = 
49e0: 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65  sqlite3VdbeCurre
49f0: 6e 74 41 64 64 72 28 76 29 3b 0a 20 20 20 20 20  ntAddr(v);.     
4a00: 20 69 6e 74 20 61 64 64 72 32 3b 0a 0a 20 20 20   int addr2;..   
4a10: 20 20 20 61 73 73 65 72 74 28 20 6e 43 6f 6c 75     assert( nColu
4a20: 6d 6e 3d 3d 31 20 29 3b 0a 20 20 20 20 20 20 73  mn==1 );.      s
4a30: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
4a40: 76 2c 20 4f 50 5f 4e 6f 74 4e 75 6c 6c 2c 20 2d  v, OP_NotNull, -
4a50: 31 2c 20 61 64 64 72 31 2b 33 29 3b 0a 20 20 20  1, addr1+3);.   
4a60: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
4a70: 64 4f 70 28 76 2c 20 4f 50 5f 50 6f 70 2c 20 31  dOp(v, OP_Pop, 1
4a80: 2c 20 30 29 3b 0a 20 20 20 20 20 20 61 64 64 72  , 0);.      addr
4a90: 32 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41  2 = sqlite3VdbeA
4aa0: 64 64 4f 70 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c  ddOp(v, OP_Goto,
4ab0: 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 70 2d   0, 0);.      p-
4ac0: 3e 61 66 66 69 6e 69 74 79 20 3d 20 73 71 6c 69  >affinity = sqli
4ad0: 74 65 33 43 6f 6d 70 61 72 65 41 66 66 69 6e 69  te3CompareAffini
4ae0: 74 79 28 70 45 4c 69 73 74 2d 3e 61 5b 30 5d 2e  ty(pEList->a[0].
4af0: 70 45 78 70 72 2c 28 69 50 61 72 6d 3e 3e 31 36  pExpr,(iParm>>16
4b00: 29 26 30 78 66 66 29 3b 0a 20 20 20 20 20 20 69  )&0xff);.      i
4b10: 66 28 20 70 4f 72 64 65 72 42 79 20 29 7b 0a 20  f( pOrderBy ){. 
4b20: 20 20 20 20 20 20 20 2f 2a 20 41 74 20 66 69 72         /* At fir
4b30: 73 74 20 67 6c 61 6e 63 65 20 79 6f 75 20 77 6f  st glance you wo
4b40: 75 6c 64 20 74 68 69 6e 6b 20 77 65 20 63 6f 75  uld think we cou
4b50: 6c 64 20 6f 70 74 69 6d 69 7a 65 20 6f 75 74 20  ld optimize out 
4b60: 74 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 4f  the.        ** O
4b70: 52 44 45 52 20 42 59 20 69 6e 20 74 68 69 73 20  RDER BY in this 
4b80: 63 61 73 65 20 73 69 6e 63 65 20 74 68 65 20 6f  case since the o
4b90: 72 64 65 72 20 6f 66 20 65 6e 74 72 69 65 73 20  rder of entries 
4ba0: 69 6e 20 74 68 65 20 73 65 74 0a 20 20 20 20 20  in the set.     
4bb0: 20 20 20 2a 2a 20 64 6f 65 73 20 6e 6f 74 20 6d     ** does not m
4bc0: 61 74 74 65 72 2e 20 20 42 75 74 20 74 68 65 72  atter.  But ther
4bd0: 65 20 6d 69 67 68 74 20 62 65 20 61 20 4c 49 4d  e might be a LIM
4be0: 49 54 20 63 6c 61 75 73 65 2c 20 69 6e 20 77 68  IT clause, in wh
4bf0: 69 63 68 0a 20 20 20 20 20 20 20 20 2a 2a 20 63  ich.        ** c
4c00: 61 73 65 20 74 68 65 20 6f 72 64 65 72 20 64 6f  ase the order do
4c10: 65 73 20 6d 61 74 74 65 72 20 2a 2f 0a 20 20 20  es matter */.   
4c20: 20 20 20 20 20 70 75 73 68 4f 6e 74 6f 53 6f 72       pushOntoSor
4c30: 74 65 72 28 70 50 61 72 73 65 2c 20 70 4f 72 64  ter(pParse, pOrd
4c40: 65 72 42 79 2c 20 70 29 3b 0a 20 20 20 20 20 20  erBy, p);.      
4c50: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73  }else{.        s
4c60: 71 6c 69 74 65 33 56 64 62 65 4f 70 33 28 76 2c  qlite3VdbeOp3(v,
4c70: 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20   OP_MakeRecord, 
4c80: 31 2c 20 30 2c 20 26 70 2d 3e 61 66 66 69 6e 69  1, 0, &p->affini
4c90: 74 79 2c 20 31 29 3b 0a 20 20 20 20 20 20 20 20  ty, 1);.        
4ca0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
4cb0: 28 76 2c 20 4f 50 5f 49 64 78 49 6e 73 65 72 74  (v, OP_IdxInsert
4cc0: 2c 20 28 69 50 61 72 6d 26 30 78 30 30 30 30 46  , (iParm&0x0000F
4cd0: 46 46 46 29 2c 20 30 29 3b 0a 20 20 20 20 20 20  FFF), 0);.      
4ce0: 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  }.      sqlite3V
4cf0: 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61  dbeJumpHere(v, a
4d00: 64 64 72 32 29 3b 0a 20 20 20 20 20 20 62 72 65  ddr2);.      bre
4d10: 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  ak;.    }..    /
4d20: 2a 20 49 66 20 61 6e 79 20 72 6f 77 20 65 78 69  * If any row exi
4d30: 73 74 20 69 6e 20 74 68 65 20 72 65 73 75 6c 74  st in the result
4d40: 20 73 65 74 2c 20 72 65 63 6f 72 64 20 74 68 61   set, record tha
4d50: 74 20 66 61 63 74 20 61 6e 64 20 61 62 6f 72 74  t fact and abort
4d60: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73  ..    */.    cas
4d70: 65 20 53 52 54 5f 45 78 69 73 74 73 3a 20 7b 0a  e SRT_Exists: {.
4d80: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
4d90: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 65 6d  eAddOp(v, OP_Mem
4da0: 49 6e 74 2c 20 31 2c 20 69 50 61 72 6d 29 3b 0a  Int, 1, iParm);.
4db0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
4dc0: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 50 6f 70  eAddOp(v, OP_Pop
4dd0: 2c 20 6e 43 6f 6c 75 6d 6e 2c 20 30 29 3b 0a 20  , nColumn, 0);. 
4de0: 20 20 20 20 20 2f 2a 20 54 68 65 20 4c 49 4d 49       /* The LIMI
4df0: 54 20 63 6c 61 75 73 65 20 77 69 6c 6c 20 74 65  T clause will te
4e00: 72 6d 69 6e 61 74 65 20 74 68 65 20 6c 6f 6f 70  rminate the loop
4e10: 20 66 6f 72 20 75 73 20 2a 2f 0a 20 20 20 20 20   for us */.     
4e20: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20   break;.    }.. 
4e30: 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73     /* If this is
4e40: 20 61 20 73 63 61 6c 61 72 20 73 65 6c 65 63 74   a scalar select
4e50: 20 74 68 61 74 20 69 73 20 70 61 72 74 20 6f 66   that is part of
4e60: 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 2c 20   an expression, 
4e70: 74 68 65 6e 0a 20 20 20 20 2a 2a 20 73 74 6f 72  then.    ** stor
4e80: 65 20 74 68 65 20 72 65 73 75 6c 74 73 20 69 6e  e the results in
4e90: 20 74 68 65 20 61 70 70 72 6f 70 72 69 61 74 65   the appropriate
4ea0: 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 20 61 6e 64   memory cell and
4eb0: 20 62 72 65 61 6b 20 6f 75 74 0a 20 20 20 20 2a   break out.    *
4ec0: 2a 20 6f 66 20 74 68 65 20 73 63 61 6e 20 6c 6f  * of the scan lo
4ed0: 6f 70 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63  op..    */.    c
4ee0: 61 73 65 20 53 52 54 5f 4d 65 6d 3a 20 7b 0a 20  ase SRT_Mem: {. 
4ef0: 20 20 20 20 20 61 73 73 65 72 74 28 20 6e 43 6f       assert( nCo
4f00: 6c 75 6d 6e 3d 3d 31 20 29 3b 0a 20 20 20 20 20  lumn==1 );.     
4f10: 20 69 66 28 20 70 4f 72 64 65 72 42 79 20 29 7b   if( pOrderBy ){
4f20: 0a 20 20 20 20 20 20 20 20 70 75 73 68 4f 6e 74  .        pushOnt
4f30: 6f 53 6f 72 74 65 72 28 70 50 61 72 73 65 2c 20  oSorter(pParse, 
4f40: 70 4f 72 64 65 72 42 79 2c 20 70 29 3b 0a 20 20  pOrderBy, p);.  
4f50: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
4f60: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
4f70: 64 4f 70 28 76 2c 20 4f 50 5f 4d 65 6d 53 74 6f  dOp(v, OP_MemSto
4f80: 72 65 2c 20 69 50 61 72 6d 2c 20 31 29 3b 0a 20  re, iParm, 1);. 
4f90: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 4c 49         /* The LI
4fa0: 4d 49 54 20 63 6c 61 75 73 65 20 77 69 6c 6c 20  MIT clause will 
4fb0: 6a 75 6d 70 20 6f 75 74 20 6f 66 20 74 68 65 20  jump out of the 
4fc0: 6c 6f 6f 70 20 66 6f 72 20 75 73 20 2a 2f 0a 20  loop for us */. 
4fd0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65       }.      bre
4fe0: 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66  ak;.    }.#endif
4ff0: 20 2f 2a 20 23 69 66 6e 64 65 66 20 53 51 4c 49   /* #ifndef SQLI
5000: 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59  TE_OMIT_SUBQUERY
5010: 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 53 65 6e 64   */..    /* Send
5020: 20 74 68 65 20 64 61 74 61 20 74 6f 20 74 68 65   the data to the
5030: 20 63 61 6c 6c 62 61 63 6b 20 66 75 6e 63 74 69   callback functi
5040: 6f 6e 20 6f 72 20 74 6f 20 61 20 73 75 62 72 6f  on or to a subro
5050: 75 74 69 6e 65 2e 20 20 49 6e 20 74 68 65 0a 20  utine.  In the. 
5060: 20 20 20 2a 2a 20 63 61 73 65 20 6f 66 20 61 20     ** case of a 
5070: 73 75 62 72 6f 75 74 69 6e 65 2c 20 74 68 65 20  subroutine, the 
5080: 73 75 62 72 6f 75 74 69 6e 65 20 69 74 73 65 6c  subroutine itsel
5090: 66 20 69 73 20 72 65 73 70 6f 6e 73 69 62 6c 65  f is responsible
50a0: 20 66 6f 72 0a 20 20 20 20 2a 2a 20 70 6f 70 70   for.    ** popp
50b0: 69 6e 67 20 74 68 65 20 64 61 74 61 20 66 72 6f  ing the data fro
50c0: 6d 20 74 68 65 20 73 74 61 63 6b 2e 0a 20 20 20  m the stack..   
50d0: 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 52 54   */.    case SRT
50e0: 5f 53 75 62 72 6f 75 74 69 6e 65 3a 0a 20 20 20  _Subroutine:.   
50f0: 20 63 61 73 65 20 53 52 54 5f 43 61 6c 6c 62 61   case SRT_Callba
5100: 63 6b 3a 20 7b 0a 20 20 20 20 20 20 69 66 28 20  ck: {.      if( 
5110: 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20  pOrderBy ){.    
5120: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
5130: 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 61 6b 65 52  ddOp(v, OP_MakeR
5140: 65 63 6f 72 64 2c 20 6e 43 6f 6c 75 6d 6e 2c 20  ecord, nColumn, 
5150: 30 29 3b 0a 20 20 20 20 20 20 20 20 70 75 73 68  0);.        push
5160: 4f 6e 74 6f 53 6f 72 74 65 72 28 70 50 61 72 73  OntoSorter(pPars
5170: 65 2c 20 70 4f 72 64 65 72 42 79 2c 20 70 29 3b  e, pOrderBy, p);
5180: 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28  .      }else if(
5190: 20 65 44 65 73 74 3d 3d 53 52 54 5f 53 75 62 72   eDest==SRT_Subr
51a0: 6f 75 74 69 6e 65 20 29 7b 0a 20 20 20 20 20 20  outine ){.      
51b0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
51c0: 4f 70 28 76 2c 20 4f 50 5f 47 6f 73 75 62 2c 20  Op(v, OP_Gosub, 
51d0: 30 2c 20 69 50 61 72 6d 29 3b 0a 20 20 20 20 20  0, iParm);.     
51e0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
51f0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
5200: 28 76 2c 20 4f 50 5f 43 61 6c 6c 62 61 63 6b 2c  (v, OP_Callback,
5210: 20 6e 43 6f 6c 75 6d 6e 2c 20 30 29 3b 0a 20 20   nColumn, 0);.  
5220: 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61      }.      brea
5230: 6b 3b 0a 20 20 20 20 7d 0a 0a 23 69 66 20 21 64  k;.    }..#if !d
5240: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
5250: 49 54 5f 54 52 49 47 47 45 52 29 0a 20 20 20 20  IT_TRIGGER).    
5260: 2f 2a 20 44 69 73 63 61 72 64 20 74 68 65 20 72  /* Discard the r
5270: 65 73 75 6c 74 73 2e 20 20 54 68 69 73 20 69 73  esults.  This is
5280: 20 75 73 65 64 20 66 6f 72 20 53 45 4c 45 43 54   used for SELECT
5290: 20 73 74 61 74 65 6d 65 6e 74 73 20 69 6e 73 69   statements insi
52a0: 64 65 0a 20 20 20 20 2a 2a 20 74 68 65 20 62 6f  de.    ** the bo
52b0: 64 79 20 6f 66 20 61 20 54 52 49 47 47 45 52 2e  dy of a TRIGGER.
52c0: 20 20 54 68 65 20 70 75 72 70 6f 73 65 20 6f 66    The purpose of
52d0: 20 73 75 63 68 20 73 65 6c 65 63 74 73 20 69 73   such selects is
52e0: 20 74 6f 20 63 61 6c 6c 0a 20 20 20 20 2a 2a 20   to call.    ** 
52f0: 75 73 65 72 2d 64 65 66 69 6e 65 64 20 66 75 6e  user-defined fun
5300: 63 74 69 6f 6e 73 20 74 68 61 74 20 68 61 76 65  ctions that have
5310: 20 73 69 64 65 20 65 66 66 65 63 74 73 2e 20 20   side effects.  
5320: 57 65 20 64 6f 20 6e 6f 74 20 63 61 72 65 0a 20  We do not care. 
5330: 20 20 20 2a 2a 20 61 62 6f 75 74 20 74 68 65 20     ** about the 
5340: 61 63 74 75 61 6c 20 72 65 73 75 6c 74 73 20 6f  actual results o
5350: 66 20 74 68 65 20 73 65 6c 65 63 74 2e 0a 20 20  f the select..  
5360: 20 20 2a 2f 0a 20 20 20 20 64 65 66 61 75 6c 74    */.    default
5370: 3a 20 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74  : {.      assert
5380: 28 20 65 44 65 73 74 3d 3d 53 52 54 5f 44 69 73  ( eDest==SRT_Dis
5390: 63 61 72 64 20 29 3b 0a 20 20 20 20 20 20 73 71  card );.      sq
53a0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
53b0: 2c 20 4f 50 5f 50 6f 70 2c 20 6e 43 6f 6c 75 6d  , OP_Pop, nColum
53c0: 6e 2c 20 30 29 3b 0a 20 20 20 20 20 20 62 72 65  n, 0);.      bre
53d0: 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66  ak;.    }.#endif
53e0: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4a 75 6d 70 20  .  }..  /* Jump 
53f0: 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68  to the end of th
5400: 65 20 6c 6f 6f 70 20 69 66 20 74 68 65 20 4c 49  e loop if the LI
5410: 4d 49 54 20 69 73 20 72 65 61 63 68 65 64 2e 0a  MIT is reached..
5420: 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 69 4c    */.  if( p->iL
5430: 69 6d 69 74 3e 3d 30 20 26 26 20 70 4f 72 64 65  imit>=0 && pOrde
5440: 72 42 79 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71  rBy==0 ){.    sq
5450: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
5460: 2c 20 4f 50 5f 4d 65 6d 49 6e 63 72 2c 20 2d 31  , OP_MemIncr, -1
5470: 2c 20 70 2d 3e 69 4c 69 6d 69 74 29 3b 0a 20 20  , p->iLimit);.  
5480: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
5490: 4f 70 28 76 2c 20 4f 50 5f 49 66 4d 65 6d 5a 65  Op(v, OP_IfMemZe
54a0: 72 6f 2c 20 70 2d 3e 69 4c 69 6d 69 74 2c 20 69  ro, p->iLimit, i
54b0: 42 72 65 61 6b 29 3b 0a 20 20 7d 0a 20 20 72 65  Break);.  }.  re
54c0: 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn 0;.}../*.**
54d0: 20 47 69 76 65 6e 20 61 6e 20 65 78 70 72 65 73   Given an expres
54e0: 73 69 6f 6e 20 6c 69 73 74 2c 20 67 65 6e 65 72  sion list, gener
54f0: 61 74 65 20 61 20 4b 65 79 49 6e 66 6f 20 73 74  ate a KeyInfo st
5500: 72 75 63 74 75 72 65 20 74 68 61 74 20 72 65 63  ructure that rec
5510: 6f 72 64 73 0a 2a 2a 20 74 68 65 20 63 6f 6c 6c  ords.** the coll
5520: 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65 20 66  ating sequence f
5530: 6f 72 20 65 61 63 68 20 65 78 70 72 65 73 73 69  or each expressi
5540: 6f 6e 20 69 6e 20 74 68 61 74 20 65 78 70 72 65  on in that expre
5550: 73 73 69 6f 6e 20 6c 69 73 74 2e 0a 2a 2a 0a 2a  ssion list..**.*
5560: 2a 20 49 66 20 74 68 65 20 45 78 70 72 4c 69 73  * If the ExprLis
5570: 74 20 69 73 20 61 6e 20 4f 52 44 45 52 20 42 59  t is an ORDER BY
5580: 20 6f 72 20 47 52 4f 55 50 20 42 59 20 63 6c 61   or GROUP BY cla
5590: 75 73 65 20 74 68 65 6e 20 74 68 65 20 72 65 73  use then the res
55a0: 75 6c 74 69 6e 67 0a 2a 2a 20 4b 65 79 49 6e 66  ulting.** KeyInf
55b0: 6f 20 73 74 72 75 63 74 75 72 65 20 69 73 20 61  o structure is a
55c0: 70 70 72 6f 70 72 69 61 74 65 20 66 6f 72 20 69  ppropriate for i
55d0: 6e 69 74 69 61 6c 69 7a 69 6e 67 20 61 20 76 69  nitializing a vi
55e0: 72 74 75 61 6c 20 69 6e 64 65 78 20 74 6f 0a 2a  rtual index to.*
55f0: 2a 20 69 6d 70 6c 65 6d 65 6e 74 20 74 68 61 74  * implement that
5600: 20 63 6c 61 75 73 65 2e 20 20 49 66 20 74 68 65   clause.  If the
5610: 20 45 78 70 72 4c 69 73 74 20 69 73 20 74 68 65   ExprList is the
5620: 20 72 65 73 75 6c 74 20 73 65 74 20 6f 66 20 61   result set of a
5630: 20 53 45 4c 45 43 54 0a 2a 2a 20 74 68 65 6e 20   SELECT.** then 
5640: 74 68 65 20 4b 65 79 49 6e 66 6f 20 73 74 72 75  the KeyInfo stru
5650: 63 74 75 72 65 20 69 73 20 61 70 70 72 6f 70 72  cture is appropr
5660: 69 61 74 65 20 66 6f 72 20 69 6e 69 74 69 61 6c  iate for initial
5670: 69 7a 69 6e 67 20 61 20 76 69 72 74 75 61 6c 0a  izing a virtual.
5680: 2a 2a 20 69 6e 64 65 78 20 74 6f 20 69 6d 70 6c  ** index to impl
5690: 65 6d 65 6e 74 20 61 20 44 49 53 54 49 4e 43 54  ement a DISTINCT
56a0: 20 74 65 73 74 2e 0a 2a 2a 0a 2a 2a 20 53 70 61   test..**.** Spa
56b0: 63 65 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 4b  ce to hold the K
56c0: 65 79 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65  eyInfo structure
56d0: 20 69 73 20 6f 62 74 61 69 6e 20 66 72 6f 6d 20   is obtain from 
56e0: 6d 61 6c 6c 6f 63 2e 20 20 54 68 65 20 63 61 6c  malloc.  The cal
56f0: 6c 69 6e 67 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e  ling.** function
5700: 20 69 73 20 72 65 73 70 6f 6e 73 69 62 6c 65 20   is responsible 
5710: 66 6f 72 20 73 65 65 69 6e 67 20 74 68 61 74 20  for seeing that 
5720: 74 68 69 73 20 73 74 72 75 63 74 75 72 65 20 69  this structure i
5730: 73 20 65 76 65 6e 74 75 61 6c 6c 79 0a 2a 2a 20  s eventually.** 
5740: 66 72 65 65 64 2e 20 20 41 64 64 20 74 68 65 20  freed.  Add the 
5750: 4b 65 79 49 6e 66 6f 20 73 74 72 75 63 74 75 72  KeyInfo structur
5760: 65 20 74 6f 20 74 68 65 20 50 33 20 66 69 65 6c  e to the P3 fiel
5770: 64 20 6f 66 20 61 6e 20 6f 70 63 6f 64 65 20 75  d of an opcode u
5780: 73 69 6e 67 0a 2a 2a 20 50 33 5f 4b 45 59 49 4e  sing.** P3_KEYIN
5790: 46 4f 5f 48 41 4e 44 4f 46 46 20 69 73 20 74 68  FO_HANDOFF is th
57a0: 65 20 75 73 75 61 6c 20 77 61 79 20 6f 66 20 64  e usual way of d
57b0: 65 61 6c 69 6e 67 20 77 69 74 68 20 74 68 69 73  ealing with this
57c0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 4b 65 79 49  ..*/.static KeyI
57d0: 6e 66 6f 20 2a 6b 65 79 49 6e 66 6f 46 72 6f 6d  nfo *keyInfoFrom
57e0: 45 78 70 72 4c 69 73 74 28 50 61 72 73 65 20 2a  ExprList(Parse *
57f0: 70 50 61 72 73 65 2c 20 45 78 70 72 4c 69 73 74  pParse, ExprList
5800: 20 2a 70 4c 69 73 74 29 7b 0a 20 20 73 71 6c 69   *pList){.  sqli
5810: 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65  te3 *db = pParse
5820: 2d 3e 64 62 3b 0a 20 20 69 6e 74 20 6e 45 78 70  ->db;.  int nExp
5830: 72 3b 0a 20 20 4b 65 79 49 6e 66 6f 20 2a 70 49  r;.  KeyInfo *pI
5840: 6e 66 6f 3b 0a 20 20 73 74 72 75 63 74 20 45 78  nfo;.  struct Ex
5850: 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74  prList_item *pIt
5860: 65 6d 3b 0a 20 20 69 6e 74 20 69 3b 0a 0a 20 20  em;.  int i;..  
5870: 6e 45 78 70 72 20 3d 20 70 4c 69 73 74 2d 3e 6e  nExpr = pList->n
5880: 45 78 70 72 3b 0a 20 20 70 49 6e 66 6f 20 3d 20  Expr;.  pInfo = 
5890: 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a  sqlite3DbMallocZ
58a0: 65 72 6f 28 64 62 2c 20 73 69 7a 65 6f 66 28 2a  ero(db, sizeof(*
58b0: 70 49 6e 66 6f 29 20 2b 20 6e 45 78 70 72 2a 28  pInfo) + nExpr*(
58c0: 73 69 7a 65 6f 66 28 43 6f 6c 6c 53 65 71 2a 29  sizeof(CollSeq*)
58d0: 2b 31 29 20 29 3b 0a 20 20 69 66 28 20 70 49 6e  +1) );.  if( pIn
58e0: 66 6f 20 29 7b 0a 20 20 20 20 70 49 6e 66 6f 2d  fo ){.    pInfo-
58f0: 3e 61 53 6f 72 74 4f 72 64 65 72 20 3d 20 28 75  >aSortOrder = (u
5900: 38 2a 29 26 70 49 6e 66 6f 2d 3e 61 43 6f 6c 6c  8*)&pInfo->aColl
5910: 5b 6e 45 78 70 72 5d 3b 0a 20 20 20 20 70 49 6e  [nExpr];.    pIn
5920: 66 6f 2d 3e 6e 46 69 65 6c 64 20 3d 20 6e 45 78  fo->nField = nEx
5930: 70 72 3b 0a 20 20 20 20 70 49 6e 66 6f 2d 3e 65  pr;.    pInfo->e
5940: 6e 63 20 3d 20 45 4e 43 28 64 62 29 3b 0a 20 20  nc = ENC(db);.  
5950: 20 20 66 6f 72 28 69 3d 30 2c 20 70 49 74 65 6d    for(i=0, pItem
5960: 3d 70 4c 69 73 74 2d 3e 61 3b 20 69 3c 6e 45 78  =pList->a; i<nEx
5970: 70 72 3b 20 69 2b 2b 2c 20 70 49 74 65 6d 2b 2b  pr; i++, pItem++
5980: 29 7b 0a 20 20 20 20 20 20 43 6f 6c 6c 53 65 71  ){.      CollSeq
5990: 20 2a 70 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 70   *pColl;.      p
59a0: 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 45 78  Coll = sqlite3Ex
59b0: 70 72 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65  prCollSeq(pParse
59c0: 2c 20 70 49 74 65 6d 2d 3e 70 45 78 70 72 29 3b  , pItem->pExpr);
59d0: 0a 20 20 20 20 20 20 69 66 28 20 21 70 43 6f 6c  .      if( !pCol
59e0: 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 70 43 6f  l ){.        pCo
59f0: 6c 6c 20 3d 20 64 62 2d 3e 70 44 66 6c 74 43 6f  ll = db->pDfltCo
5a00: 6c 6c 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ll;.      }.    
5a10: 20 20 70 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b 69    pInfo->aColl[i
5a20: 5d 20 3d 20 70 43 6f 6c 6c 3b 0a 20 20 20 20 20  ] = pColl;.     
5a30: 20 70 49 6e 66 6f 2d 3e 61 53 6f 72 74 4f 72 64   pInfo->aSortOrd
5a40: 65 72 5b 69 5d 20 3d 20 70 49 74 65 6d 2d 3e 73  er[i] = pItem->s
5a50: 6f 72 74 4f 72 64 65 72 3b 0a 20 20 20 20 7d 0a  ortOrder;.    }.
5a60: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 49 6e    }.  return pIn
5a70: 66 6f 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 49 66  fo;.}.../*.** If
5a80: 20 74 68 65 20 69 6e 6e 65 72 20 6c 6f 6f 70 20   the inner loop 
5a90: 77 61 73 20 67 65 6e 65 72 61 74 65 64 20 75 73  was generated us
5aa0: 69 6e 67 20 61 20 6e 6f 6e 2d 6e 75 6c 6c 20 70  ing a non-null p
5ab0: 4f 72 64 65 72 42 79 20 61 72 67 75 6d 65 6e 74  OrderBy argument
5ac0: 2c 0a 2a 2a 20 74 68 65 6e 20 74 68 65 20 72 65  ,.** then the re
5ad0: 73 75 6c 74 73 20 77 65 72 65 20 70 6c 61 63 65  sults were place
5ae0: 64 20 69 6e 20 61 20 73 6f 72 74 65 72 2e 20 20  d in a sorter.  
5af0: 41 66 74 65 72 20 74 68 65 20 6c 6f 6f 70 20 69  After the loop i
5b00: 73 20 74 65 72 6d 69 6e 61 74 65 64 0a 2a 2a 20  s terminated.** 
5b10: 77 65 20 6e 65 65 64 20 74 6f 20 72 75 6e 20 74  we need to run t
5b20: 68 65 20 73 6f 72 74 65 72 20 61 6e 64 20 6f 75  he sorter and ou
5b30: 74 70 75 74 20 74 68 65 20 72 65 73 75 6c 74 73  tput the results
5b40: 2e 20 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  .  The following
5b50: 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 67 65 6e 65  .** routine gene
5b60: 72 61 74 65 73 20 74 68 65 20 63 6f 64 65 20 6e  rates the code n
5b70: 65 65 64 65 64 20 74 6f 20 64 6f 20 74 68 61 74  eeded to do that
5b80: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
5b90: 20 67 65 6e 65 72 61 74 65 53 6f 72 74 54 61 69   generateSortTai
5ba0: 6c 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  l(.  Parse *pPar
5bb0: 73 65 2c 20 20 20 2f 2a 20 50 61 72 73 69 6e 67  se,   /* Parsing
5bc0: 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53 65   context */.  Se
5bd0: 6c 65 63 74 20 2a 70 2c 20 20 20 20 20 20 20 2f  lect *p,       /
5be0: 2a 20 54 68 65 20 53 45 4c 45 43 54 20 73 74 61  * The SELECT sta
5bf0: 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 56 64 62 65  tement */.  Vdbe
5c00: 20 2a 76 2c 20 20 20 20 20 20 20 20 20 2f 2a 20   *v,         /* 
5c10: 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 69 6e  Generate code in
5c20: 74 6f 20 74 68 69 73 20 56 44 42 45 20 2a 2f 0a  to this VDBE */.
5c30: 20 20 69 6e 74 20 6e 43 6f 6c 75 6d 6e 2c 20 20    int nColumn,  
5c40: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
5c50: 63 6f 6c 75 6d 6e 73 20 6f 66 20 64 61 74 61 20  columns of data 
5c60: 2a 2f 0a 20 20 69 6e 74 20 65 44 65 73 74 2c 20  */.  int eDest, 
5c70: 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20 74        /* Write t
5c80: 68 65 20 73 6f 72 74 65 64 20 72 65 73 75 6c 74  he sorted result
5c90: 73 20 68 65 72 65 20 2a 2f 0a 20 20 69 6e 74 20  s here */.  int 
5ca0: 69 50 61 72 6d 20 20 20 20 20 20 20 20 2f 2a 20  iParm        /* 
5cb0: 4f 70 74 69 6f 6e 61 6c 20 70 61 72 61 6d 65 74  Optional paramet
5cc0: 65 72 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  er associated wi
5cd0: 74 68 20 65 44 65 73 74 20 2a 2f 0a 29 7b 0a 20  th eDest */.){. 
5ce0: 20 69 6e 74 20 62 72 6b 20 3d 20 73 71 6c 69 74   int brk = sqlit
5cf0: 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28  e3VdbeMakeLabel(
5d00: 76 29 3b 0a 20 20 69 6e 74 20 63 6f 6e 74 20 3d  v);.  int cont =
5d10: 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65   sqlite3VdbeMake
5d20: 4c 61 62 65 6c 28 76 29 3b 0a 20 20 69 6e 74 20  Label(v);.  int 
5d30: 61 64 64 72 3b 0a 20 20 69 6e 74 20 69 54 61 62  addr;.  int iTab
5d40: 3b 0a 20 20 69 6e 74 20 70 73 65 75 64 6f 54 61  ;.  int pseudoTa
5d50: 62 20 3d 20 30 3b 0a 20 20 45 78 70 72 4c 69 73  b = 0;.  ExprLis
5d60: 74 20 2a 70 4f 72 64 65 72 42 79 20 3d 20 70 2d  t *pOrderBy = p-
5d70: 3e 70 4f 72 64 65 72 42 79 3b 0a 0a 20 20 69 54  >pOrderBy;..  iT
5d80: 61 62 20 3d 20 70 4f 72 64 65 72 42 79 2d 3e 69  ab = pOrderBy->i
5d90: 45 43 75 72 73 6f 72 3b 0a 20 20 69 66 28 20 65  ECursor;.  if( e
5da0: 44 65 73 74 3d 3d 53 52 54 5f 43 61 6c 6c 62 61  Dest==SRT_Callba
5db0: 63 6b 20 7c 7c 20 65 44 65 73 74 3d 3d 53 52 54  ck || eDest==SRT
5dc0: 5f 53 75 62 72 6f 75 74 69 6e 65 20 29 7b 0a 20  _Subroutine ){. 
5dd0: 20 20 20 70 73 65 75 64 6f 54 61 62 20 3d 20 70     pseudoTab = p
5de0: 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20  Parse->nTab++;. 
5df0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
5e00: 64 4f 70 28 76 2c 20 4f 50 5f 4f 70 65 6e 50 73  dOp(v, OP_OpenPs
5e10: 65 75 64 6f 2c 20 70 73 65 75 64 6f 54 61 62 2c  eudo, pseudoTab,
5e20: 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33   0);.    sqlite3
5e30: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
5e40: 53 65 74 4e 75 6d 43 6f 6c 75 6d 6e 73 2c 20 70  SetNumColumns, p
5e50: 73 65 75 64 6f 54 61 62 2c 20 6e 43 6f 6c 75 6d  seudoTab, nColum
5e60: 6e 29 3b 0a 20 20 7d 0a 20 20 61 64 64 72 20 3d  n);.  }.  addr =
5e70: 20 31 20 2b 20 73 71 6c 69 74 65 33 56 64 62 65   1 + sqlite3Vdbe
5e80: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 53 6f 72 74  AddOp(v, OP_Sort
5e90: 2c 20 69 54 61 62 2c 20 62 72 6b 29 3b 0a 20 20  , iTab, brk);.  
5ea0: 63 6f 64 65 4f 66 66 73 65 74 28 76 2c 20 70 2c  codeOffset(v, p,
5eb0: 20 63 6f 6e 74 2c 20 30 29 3b 0a 20 20 69 66 28   cont, 0);.  if(
5ec0: 20 65 44 65 73 74 3d 3d 53 52 54 5f 43 61 6c 6c   eDest==SRT_Call
5ed0: 62 61 63 6b 20 7c 7c 20 65 44 65 73 74 3d 3d 53  back || eDest==S
5ee0: 52 54 5f 53 75 62 72 6f 75 74 69 6e 65 20 29 7b  RT_Subroutine ){
5ef0: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
5f00: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49 6e 74 65  AddOp(v, OP_Inte
5f10: 67 65 72 2c 20 31 2c 20 30 29 3b 0a 20 20 7d 0a  ger, 1, 0);.  }.
5f20: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
5f30: 4f 70 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c  Op(v, OP_Column,
5f40: 20 69 54 61 62 2c 20 70 4f 72 64 65 72 42 79 2d   iTab, pOrderBy-
5f50: 3e 6e 45 78 70 72 20 2b 20 31 29 3b 0a 20 20 73  >nExpr + 1);.  s
5f60: 77 69 74 63 68 28 20 65 44 65 73 74 20 29 7b 0a  witch( eDest ){.
5f70: 20 20 20 20 63 61 73 65 20 53 52 54 5f 54 61 62      case SRT_Tab
5f80: 6c 65 3a 0a 20 20 20 20 63 61 73 65 20 53 52 54  le:.    case SRT
5f90: 5f 45 70 68 65 6d 54 61 62 3a 20 7b 0a 20 20 20  _EphemTab: {.   
5fa0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
5fb0: 64 4f 70 28 76 2c 20 4f 50 5f 4e 65 77 52 6f 77  dOp(v, OP_NewRow
5fc0: 69 64 2c 20 69 50 61 72 6d 2c 20 30 29 3b 0a 20  id, iParm, 0);. 
5fd0: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
5fe0: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 50 75 6c 6c  AddOp(v, OP_Pull
5ff0: 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20 20 20 73  , 1, 0);.      s
6000: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
6010: 76 2c 20 4f 50 5f 49 6e 73 65 72 74 2c 20 69 50  v, OP_Insert, iP
6020: 61 72 6d 2c 20 4f 50 46 4c 41 47 5f 41 50 50 45  arm, OPFLAG_APPE
6030: 4e 44 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  ND);.      break
6040: 3b 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20  ;.    }.#ifndef 
6050: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51  SQLITE_OMIT_SUBQ
6060: 55 45 52 59 0a 20 20 20 20 63 61 73 65 20 53 52  UERY.    case SR
6070: 54 5f 53 65 74 3a 20 7b 0a 20 20 20 20 20 20 61  T_Set: {.      a
6080: 73 73 65 72 74 28 20 6e 43 6f 6c 75 6d 6e 3d 3d  ssert( nColumn==
6090: 31 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  1 );.      sqlit
60a0: 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
60b0: 50 5f 4e 6f 74 4e 75 6c 6c 2c 20 2d 31 2c 20 73  P_NotNull, -1, s
60c0: 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e  qlite3VdbeCurren
60d0: 74 41 64 64 72 28 76 29 2b 33 29 3b 0a 20 20 20  tAddr(v)+3);.   
60e0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
60f0: 64 4f 70 28 76 2c 20 4f 50 5f 50 6f 70 2c 20 31  dOp(v, OP_Pop, 1
6100: 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  , 0);.      sqli
6110: 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
6120: 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 73 71 6c 69  OP_Goto, 0, sqli
6130: 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64  te3VdbeCurrentAd
6140: 64 72 28 76 29 2b 33 29 3b 0a 20 20 20 20 20 20  dr(v)+3);.      
6150: 73 71 6c 69 74 65 33 56 64 62 65 4f 70 33 28 76  sqlite3VdbeOp3(v
6160: 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c  , OP_MakeRecord,
6170: 20 31 2c 20 30 2c 20 26 70 2d 3e 61 66 66 69 6e   1, 0, &p->affin
6180: 69 74 79 2c 20 31 29 3b 0a 20 20 20 20 20 20 73  ity, 1);.      s
6190: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
61a0: 76 2c 20 4f 50 5f 49 64 78 49 6e 73 65 72 74 2c  v, OP_IdxInsert,
61b0: 20 28 69 50 61 72 6d 26 30 78 30 30 30 30 46 46   (iParm&0x0000FF
61c0: 46 46 29 2c 20 30 29 3b 0a 20 20 20 20 20 20 62  FF), 0);.      b
61d0: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
61e0: 63 61 73 65 20 53 52 54 5f 4d 65 6d 3a 20 7b 0a  case SRT_Mem: {.
61f0: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6e 43        assert( nC
6200: 6f 6c 75 6d 6e 3d 3d 31 20 29 3b 0a 20 20 20 20  olumn==1 );.    
6210: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
6220: 4f 70 28 76 2c 20 4f 50 5f 4d 65 6d 53 74 6f 72  Op(v, OP_MemStor
6230: 65 2c 20 69 50 61 72 6d 2c 20 31 29 3b 0a 20 20  e, iParm, 1);.  
6240: 20 20 20 20 2f 2a 20 54 68 65 20 4c 49 4d 49 54      /* The LIMIT
6250: 20 63 6c 61 75 73 65 20 77 69 6c 6c 20 74 65 72   clause will ter
6260: 6d 69 6e 61 74 65 20 74 68 65 20 6c 6f 6f 70 20  minate the loop 
6270: 66 6f 72 20 75 73 20 2a 2f 0a 20 20 20 20 20 20  for us */.      
6280: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e  break;.    }.#en
6290: 64 69 66 0a 20 20 20 20 63 61 73 65 20 53 52 54  dif.    case SRT
62a0: 5f 43 61 6c 6c 62 61 63 6b 3a 0a 20 20 20 20 63  _Callback:.    c
62b0: 61 73 65 20 53 52 54 5f 53 75 62 72 6f 75 74 69  ase SRT_Subrouti
62c0: 6e 65 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20  ne: {.      int 
62d0: 69 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  i;.      sqlite3
62e0: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
62f0: 49 6e 73 65 72 74 2c 20 70 73 65 75 64 6f 54 61  Insert, pseudoTa
6300: 62 2c 20 30 29 3b 0a 20 20 20 20 20 20 66 6f 72  b, 0);.      for
6310: 28 69 3d 30 3b 20 69 3c 6e 43 6f 6c 75 6d 6e 3b  (i=0; i<nColumn;
6320: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 73   i++){.        s
6330: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
6340: 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 70 73  v, OP_Column, ps
6350: 65 75 64 6f 54 61 62 2c 20 69 29 3b 0a 20 20 20  eudoTab, i);.   
6360: 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 65     }.      if( e
6370: 44 65 73 74 3d 3d 53 52 54 5f 43 61 6c 6c 62 61  Dest==SRT_Callba
6380: 63 6b 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  ck ){.        sq
6390: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
63a0: 2c 20 4f 50 5f 43 61 6c 6c 62 61 63 6b 2c 20 6e  , OP_Callback, n
63b0: 43 6f 6c 75 6d 6e 2c 20 30 29 3b 0a 20 20 20 20  Column, 0);.    
63c0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
63d0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
63e0: 70 28 76 2c 20 4f 50 5f 47 6f 73 75 62 2c 20 30  p(v, OP_Gosub, 0
63f0: 2c 20 69 50 61 72 6d 29 3b 0a 20 20 20 20 20 20  , iParm);.      
6400: 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  }.      break;. 
6410: 20 20 20 7d 0a 20 20 20 20 64 65 66 61 75 6c 74     }.    default
6420: 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20 44 6f 20  : {.      /* Do 
6430: 6e 6f 74 68 69 6e 67 20 2a 2f 0a 20 20 20 20 20  nothing */.     
6440: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
6450: 7d 0a 0a 20 20 2f 2a 20 4a 75 6d 70 20 74 6f 20  }..  /* Jump to 
6460: 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 6c  the end of the l
6470: 6f 6f 70 20 77 68 65 6e 20 74 68 65 20 4c 49 4d  oop when the LIM
6480: 49 54 20 69 73 20 72 65 61 63 68 65 64 0a 20 20  IT is reached.  
6490: 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 69 4c 69 6d  */.  if( p->iLim
64a0: 69 74 3e 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c  it>=0 ){.    sql
64b0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
64c0: 20 4f 50 5f 4d 65 6d 49 6e 63 72 2c 20 2d 31 2c   OP_MemIncr, -1,
64d0: 20 70 2d 3e 69 4c 69 6d 69 74 29 3b 0a 20 20 20   p->iLimit);.   
64e0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
64f0: 70 28 76 2c 20 4f 50 5f 49 66 4d 65 6d 5a 65 72  p(v, OP_IfMemZer
6500: 6f 2c 20 70 2d 3e 69 4c 69 6d 69 74 2c 20 62 72  o, p->iLimit, br
6510: 6b 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68  k);.  }..  /* Th
6520: 65 20 62 6f 74 74 6f 6d 20 6f 66 20 74 68 65 20  e bottom of the 
6530: 6c 6f 6f 70 0a 20 20 2a 2f 0a 20 20 73 71 6c 69  loop.  */.  sqli
6540: 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61  te3VdbeResolveLa
6550: 62 65 6c 28 76 2c 20 63 6f 6e 74 29 3b 0a 20 20  bel(v, cont);.  
6560: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
6570: 28 76 2c 20 4f 50 5f 4e 65 78 74 2c 20 69 54 61  (v, OP_Next, iTa
6580: 62 2c 20 61 64 64 72 29 3b 0a 20 20 73 71 6c 69  b, addr);.  sqli
6590: 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61  te3VdbeResolveLa
65a0: 62 65 6c 28 76 2c 20 62 72 6b 29 3b 0a 20 20 69  bel(v, brk);.  i
65b0: 66 28 20 65 44 65 73 74 3d 3d 53 52 54 5f 43 61  f( eDest==SRT_Ca
65c0: 6c 6c 62 61 63 6b 20 7c 7c 20 65 44 65 73 74 3d  llback || eDest=
65d0: 3d 53 52 54 5f 53 75 62 72 6f 75 74 69 6e 65 20  =SRT_Subroutine 
65e0: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  ){.    sqlite3Vd
65f0: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 43 6c  beAddOp(v, OP_Cl
6600: 6f 73 65 2c 20 70 73 65 75 64 6f 54 61 62 2c 20  ose, pseudoTab, 
6610: 30 29 3b 0a 20 20 7d 0a 0a 7d 0a 0a 2f 2a 0a 2a  0);.  }..}../*.*
6620: 2a 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74  * Return a point
6630: 65 72 20 74 6f 20 61 20 73 74 72 69 6e 67 20 63  er to a string c
6640: 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 27 64  ontaining the 'd
6650: 65 63 6c 61 72 61 74 69 6f 6e 20 74 79 70 65 27  eclaration type'
6660: 20 6f 66 20 74 68 65 0a 2a 2a 20 65 78 70 72 65   of the.** expre
6670: 73 73 69 6f 6e 20 70 45 78 70 72 2e 20 54 68 65  ssion pExpr. The
6680: 20 73 74 72 69 6e 67 20 6d 61 79 20 62 65 20 74   string may be t
6690: 72 65 61 74 65 64 20 61 73 20 73 74 61 74 69 63  reated as static
66a0: 20 62 79 20 74 68 65 20 63 61 6c 6c 65 72 2e 0a   by the caller..
66b0: 2a 2a 0a 2a 2a 20 54 68 65 20 64 65 63 6c 61 72  **.** The declar
66c0: 61 74 69 6f 6e 20 74 79 70 65 20 69 73 20 74 68  ation type is th
66d0: 65 20 65 78 61 63 74 20 64 61 74 61 74 79 70 65  e exact datatype
66e0: 20 64 65 66 69 6e 69 74 69 6f 6e 20 65 78 74 72   definition extr
66f0: 61 63 74 65 64 20 66 72 6f 6d 20 74 68 65 0a 2a  acted from the.*
6700: 2a 20 6f 72 69 67 69 6e 61 6c 20 43 52 45 41 54  * original CREAT
6710: 45 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e  E TABLE statemen
6720: 74 20 69 66 20 74 68 65 20 65 78 70 72 65 73 73  t if the express
6730: 69 6f 6e 20 69 73 20 61 20 63 6f 6c 75 6d 6e 2e  ion is a column.
6740: 20 54 68 65 0a 2a 2a 20 64 65 63 6c 61 72 61 74   The.** declarat
6750: 69 6f 6e 20 74 79 70 65 20 66 6f 72 20 61 20 52  ion type for a R
6760: 4f 57 49 44 20 66 69 65 6c 64 20 69 73 20 49 4e  OWID field is IN
6770: 54 45 47 45 52 2e 20 45 78 61 63 74 6c 79 20 77  TEGER. Exactly w
6780: 68 65 6e 20 61 6e 20 65 78 70 72 65 73 73 69 6f  hen an expressio
6790: 6e 0a 2a 2a 20 69 73 20 63 6f 6e 73 69 64 65 72  n.** is consider
67a0: 65 64 20 61 20 63 6f 6c 75 6d 6e 20 63 61 6e 20  ed a column can 
67b0: 62 65 20 63 6f 6d 70 6c 65 78 20 69 6e 20 74 68  be complex in th
67c0: 65 20 70 72 65 73 65 6e 63 65 20 6f 66 20 73 75  e presence of su
67d0: 62 71 75 65 72 69 65 73 2e 20 54 68 65 0a 2a 2a  bqueries. The.**
67e0: 20 72 65 73 75 6c 74 2d 73 65 74 20 65 78 70 72   result-set expr
67f0: 65 73 73 69 6f 6e 20 69 6e 20 61 6c 6c 20 6f 66  ession in all of
6800: 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 53   the following S
6810: 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 73  ELECT statements
6820: 20 69 73 20 0a 2a 2a 20 63 6f 6e 73 69 64 65 72   is .** consider
6830: 65 64 20 61 20 63 6f 6c 75 6d 6e 20 62 79 20 74  ed a column by t
6840: 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a  his function..**
6850: 0a 2a 2a 20 20 20 53 45 4c 45 43 54 20 63 6f 6c  .**   SELECT col
6860: 20 46 52 4f 4d 20 74 62 6c 3b 0a 2a 2a 20 20 20   FROM tbl;.**   
6870: 53 45 4c 45 43 54 20 28 53 45 4c 45 43 54 20 63  SELECT (SELECT c
6880: 6f 6c 20 46 52 4f 4d 20 74 62 6c 3b 0a 2a 2a 20  ol FROM tbl;.** 
6890: 20 20 53 45 4c 45 43 54 20 28 53 45 4c 45 43 54    SELECT (SELECT
68a0: 20 63 6f 6c 20 46 52 4f 4d 20 74 62 6c 29 3b 0a   col FROM tbl);.
68b0: 2a 2a 20 20 20 53 45 4c 45 43 54 20 61 62 63 20  **   SELECT abc 
68c0: 46 52 4f 4d 20 28 53 45 4c 45 43 54 20 63 6f 6c  FROM (SELECT col
68d0: 20 41 53 20 61 62 63 20 46 52 4f 4d 20 74 62 6c   AS abc FROM tbl
68e0: 29 3b 0a 2a 2a 20 0a 2a 2a 20 54 68 65 20 64 65  );.** .** The de
68f0: 63 6c 61 72 61 74 69 6f 6e 20 74 79 70 65 20 66  claration type f
6900: 6f 72 20 61 6e 79 20 65 78 70 72 65 73 73 69 6f  or any expressio
6910: 6e 20 6f 74 68 65 72 20 74 68 61 6e 20 61 20 63  n other than a c
6920: 6f 6c 75 6d 6e 20 69 73 20 4e 55 4c 4c 2e 0a 2a  olumn is NULL..*
6930: 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63  /.static const c
6940: 68 61 72 20 2a 63 6f 6c 75 6d 6e 54 79 70 65 28  har *columnType(
6950: 0a 20 20 4e 61 6d 65 43 6f 6e 74 65 78 74 20 2a  .  NameContext *
6960: 70 4e 43 2c 20 0a 20 20 45 78 70 72 20 2a 70 45  pNC, .  Expr *pE
6970: 78 70 72 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61  xpr,.  const cha
6980: 72 20 2a 2a 70 7a 4f 72 69 67 69 6e 44 62 2c 0a  r **pzOriginDb,.
6990: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 2a 70    const char **p
69a0: 7a 4f 72 69 67 69 6e 54 61 62 2c 0a 20 20 63 6f  zOriginTab,.  co
69b0: 6e 73 74 20 63 68 61 72 20 2a 2a 70 7a 4f 72 69  nst char **pzOri
69c0: 67 69 6e 43 6f 6c 0a 29 7b 0a 20 20 63 68 61 72  ginCol.){.  char
69d0: 20 63 6f 6e 73 74 20 2a 7a 54 79 70 65 20 3d 20   const *zType = 
69e0: 30 3b 0a 20 20 63 68 61 72 20 63 6f 6e 73 74 20  0;.  char const 
69f0: 2a 7a 4f 72 69 67 69 6e 44 62 20 3d 20 30 3b 0a  *zOriginDb = 0;.
6a00: 20 20 63 68 61 72 20 63 6f 6e 73 74 20 2a 7a 4f    char const *zO
6a10: 72 69 67 69 6e 54 61 62 20 3d 20 30 3b 0a 20 20  riginTab = 0;.  
6a20: 63 68 61 72 20 63 6f 6e 73 74 20 2a 7a 4f 72 69  char const *zOri
6a30: 67 69 6e 43 6f 6c 20 3d 20 30 3b 0a 20 20 69 6e  ginCol = 0;.  in
6a40: 74 20 6a 3b 0a 20 20 69 66 28 20 70 45 78 70 72  t j;.  if( pExpr
6a50: 3d 3d 30 20 7c 7c 20 70 4e 43 2d 3e 70 53 72 63  ==0 || pNC->pSrc
6a60: 4c 69 73 74 3d 3d 30 20 29 20 72 65 74 75 72 6e  List==0 ) return
6a70: 20 30 3b 0a 0a 20 20 73 77 69 74 63 68 28 20 70   0;..  switch( p
6a80: 45 78 70 72 2d 3e 6f 70 20 29 7b 0a 20 20 20 20  Expr->op ){.    
6a90: 63 61 73 65 20 54 4b 5f 41 47 47 5f 43 4f 4c 55  case TK_AGG_COLU
6aa0: 4d 4e 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  MN:.    case TK_
6ab0: 43 4f 4c 55 4d 4e 3a 20 7b 0a 20 20 20 20 20 20  COLUMN: {.      
6ac0: 2f 2a 20 54 68 65 20 65 78 70 72 65 73 73 69 6f  /* The expressio
6ad0: 6e 20 69 73 20 61 20 63 6f 6c 75 6d 6e 2e 20 4c  n is a column. L
6ae0: 6f 63 61 74 65 20 74 68 65 20 74 61 62 6c 65 20  ocate the table 
6af0: 74 68 65 20 63 6f 6c 75 6d 6e 20 69 73 20 62 65  the column is be
6b00: 69 6e 67 0a 20 20 20 20 20 20 2a 2a 20 65 78 74  ing.      ** ext
6b10: 72 61 63 74 65 64 20 66 72 6f 6d 20 69 6e 20 4e  racted from in N
6b20: 61 6d 65 43 6f 6e 74 65 78 74 2e 70 53 72 63 4c  ameContext.pSrcL
6b30: 69 73 74 2e 20 54 68 69 73 20 74 61 62 6c 65 20  ist. This table 
6b40: 6d 61 79 20 62 65 20 72 65 61 6c 0a 20 20 20 20  may be real.    
6b50: 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20 74 61    ** database ta
6b60: 62 6c 65 20 6f 72 20 61 20 73 75 62 71 75 65 72  ble or a subquer
6b70: 79 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  y..      */.    
6b80: 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20    Table *pTab = 
6b90: 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  0;            /*
6ba0: 20 54 61 62 6c 65 20 73 74 72 75 63 74 75 72 65   Table structure
6bb0: 20 63 6f 6c 75 6d 6e 20 69 73 20 65 78 74 72 61   column is extra
6bc0: 63 74 65 64 20 66 72 6f 6d 20 2a 2f 0a 20 20 20  cted from */.   
6bd0: 20 20 20 53 65 6c 65 63 74 20 2a 70 53 20 3d 20     Select *pS = 
6be0: 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  0;             /
6bf0: 2a 20 53 65 6c 65 63 74 20 74 68 65 20 63 6f 6c  * Select the col
6c00: 75 6d 6e 20 69 73 20 65 78 74 72 61 63 74 65 64  umn is extracted
6c10: 20 66 72 6f 6d 20 2a 2f 0a 20 20 20 20 20 20 69   from */.      i
6c20: 6e 74 20 69 43 6f 6c 20 3d 20 70 45 78 70 72 2d  nt iCol = pExpr-
6c30: 3e 69 43 6f 6c 75 6d 6e 3b 20 20 2f 2a 20 49 6e  >iColumn;  /* In
6c40: 64 65 78 20 6f 66 20 63 6f 6c 75 6d 6e 20 69 6e  dex of column in
6c50: 20 70 54 61 62 20 2a 2f 0a 20 20 20 20 20 20 77   pTab */.      w
6c60: 68 69 6c 65 28 20 70 4e 43 20 26 26 20 21 70 54  hile( pNC && !pT
6c70: 61 62 20 29 7b 0a 20 20 20 20 20 20 20 20 53 72  ab ){.        Sr
6c80: 63 4c 69 73 74 20 2a 70 54 61 62 4c 69 73 74 20  cList *pTabList 
6c90: 3d 20 70 4e 43 2d 3e 70 53 72 63 4c 69 73 74 3b  = pNC->pSrcList;
6ca0: 0a 20 20 20 20 20 20 20 20 66 6f 72 28 6a 3d 30  .        for(j=0
6cb0: 3b 6a 3c 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72  ;j<pTabList->nSr
6cc0: 63 20 26 26 20 70 54 61 62 4c 69 73 74 2d 3e 61  c && pTabList->a
6cd0: 5b 6a 5d 2e 69 43 75 72 73 6f 72 21 3d 70 45 78  [j].iCursor!=pEx
6ce0: 70 72 2d 3e 69 54 61 62 6c 65 3b 6a 2b 2b 29 3b  pr->iTable;j++);
6cf0: 0a 20 20 20 20 20 20 20 20 69 66 28 20 6a 3c 70  .        if( j<p
6d00: 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 20 29 7b  TabList->nSrc ){
6d10: 0a 20 20 20 20 20 20 20 20 20 20 70 54 61 62 20  .          pTab 
6d20: 3d 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 6a 5d  = pTabList->a[j]
6d30: 2e 70 54 61 62 3b 0a 20 20 20 20 20 20 20 20 20  .pTab;.         
6d40: 20 70 53 20 3d 20 70 54 61 62 4c 69 73 74 2d 3e   pS = pTabList->
6d50: 61 5b 6a 5d 2e 70 53 65 6c 65 63 74 3b 0a 20 20  a[j].pSelect;.  
6d60: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
6d70: 20 20 20 20 20 20 20 70 4e 43 20 3d 20 70 4e 43         pNC = pNC
6d80: 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 20  ->pNext;.       
6d90: 20 7d 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20   }.      }..    
6da0: 20 20 69 66 28 20 70 54 61 62 3d 3d 30 20 29 7b    if( pTab==0 ){
6db0: 0a 20 20 20 20 20 20 20 20 2f 2a 20 46 49 58 20  .        /* FIX 
6dc0: 4d 45 3a 0a 20 20 20 20 20 20 20 20 2a 2a 20 54  ME:.        ** T
6dd0: 68 69 73 20 63 61 6e 20 6f 63 63 75 72 73 20 69  his can occurs i
6de0: 66 20 79 6f 75 20 68 61 76 65 20 73 6f 6d 65 74  f you have somet
6df0: 68 69 6e 67 20 6c 69 6b 65 20 22 53 45 4c 45 43  hing like "SELEC
6e00: 54 20 6e 65 77 2e 78 3b 22 20 69 6e 73 69 64 65  T new.x;" inside
6e10: 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 20 74 72  .        ** a tr
6e20: 69 67 67 65 72 2e 20 20 49 6e 20 6f 74 68 65 72  igger.  In other
6e30: 20 77 6f 72 64 73 2c 20 69 66 20 79 6f 75 20 72   words, if you r
6e40: 65 66 65 72 65 6e 63 65 20 74 68 65 20 73 70 65  eference the spe
6e50: 63 69 61 6c 20 22 6e 65 77 22 0a 20 20 20 20 20  cial "new".     
6e60: 20 20 20 2a 2a 20 74 61 62 6c 65 20 69 6e 20 74     ** table in t
6e70: 68 65 20 72 65 73 75 6c 74 20 73 65 74 20 6f 66  he result set of
6e80: 20 61 20 73 65 6c 65 63 74 2e 20 20 57 65 20 64   a select.  We d
6e90: 6f 20 6e 6f 74 20 68 61 76 65 20 61 20 67 6f 6f  o not have a goo
6ea0: 64 20 77 61 79 0a 20 20 20 20 20 20 20 20 2a 2a  d way.        **
6eb0: 20 74 6f 20 66 69 6e 64 20 74 68 65 20 61 63 74   to find the act
6ec0: 75 61 6c 20 74 61 62 6c 65 20 74 79 70 65 2c 20  ual table type, 
6ed0: 73 6f 20 63 61 6c 6c 20 69 74 20 22 54 45 58 54  so call it "TEXT
6ee0: 22 2e 20 20 54 68 69 73 20 69 73 20 72 65 61 6c  ".  This is real
6ef0: 6c 79 0a 20 20 20 20 20 20 20 20 2a 2a 20 73 6f  ly.        ** so
6f00: 6d 65 74 68 69 6e 67 20 6f 66 20 61 20 62 75 67  mething of a bug
6f10: 2c 20 62 75 74 20 49 20 64 6f 20 6e 6f 74 20 6b  , but I do not k
6f20: 6e 6f 77 20 68 6f 77 20 74 6f 20 66 69 78 20 69  now how to fix i
6f30: 74 2e 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20  t..        **.  
6f40: 20 20 20 20 20 20 2a 2a 20 54 68 69 73 20 63 6f        ** This co
6f50: 64 65 20 64 6f 65 73 20 6e 6f 74 20 70 72 6f 64  de does not prod
6f60: 75 63 65 20 74 68 65 20 63 6f 72 72 65 63 74 20  uce the correct 
6f70: 61 6e 73 77 65 72 20 2d 20 69 74 20 6a 75 73 74  answer - it just
6f80: 20 70 72 65 76 65 6e 74 73 0a 20 20 20 20 20 20   prevents.      
6f90: 20 20 2a 2a 20 61 20 73 65 67 66 61 75 6c 74 2e    ** a segfault.
6fa0: 20 20 53 65 65 20 74 69 63 6b 65 74 20 23 31 32    See ticket #12
6fb0: 32 39 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20  29..        */. 
6fc0: 20 20 20 20 20 20 20 7a 54 79 70 65 20 3d 20 22         zType = "
6fd0: 54 45 58 54 22 3b 0a 20 20 20 20 20 20 20 20 62  TEXT";.        b
6fe0: 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 0a 20  reak;.      }.. 
6ff0: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 54 61       assert( pTa
7000: 62 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70  b );.      if( p
7010: 53 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  S ){.        /* 
7020: 54 68 65 20 22 74 61 62 6c 65 22 20 69 73 20 61  The "table" is a
7030: 63 74 75 61 6c 6c 79 20 61 20 73 75 62 2d 73 65  ctually a sub-se
7040: 6c 65 63 74 20 6f 72 20 61 20 76 69 65 77 20 69  lect or a view i
7050: 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73  n the FROM claus
7060: 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f 66 20  e.        ** of 
7070: 74 68 65 20 53 45 4c 45 43 54 20 73 74 61 74 65  the SELECT state
7080: 6d 65 6e 74 2e 20 52 65 74 75 72 6e 20 74 68 65  ment. Return the
7090: 20 64 65 63 6c 61 72 61 74 69 6f 6e 20 74 79 70   declaration typ
70a0: 65 20 61 6e 64 20 6f 72 69 67 69 6e 0a 20 20 20  e and origin.   
70b0: 20 20 20 20 20 2a 2a 20 64 61 74 61 20 66 6f 72       ** data for
70c0: 20 74 68 65 20 72 65 73 75 6c 74 2d 73 65 74 20   the result-set 
70d0: 63 6f 6c 75 6d 6e 20 6f 66 20 74 68 65 20 73 75  column of the su
70e0: 62 2d 73 65 6c 65 63 74 2e 0a 20 20 20 20 20 20  b-select..      
70f0: 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28    */.        if(
7100: 20 69 43 6f 6c 3e 3d 30 20 26 26 20 69 43 6f 6c   iCol>=0 && iCol
7110: 3c 70 53 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78  <pS->pEList->nEx
7120: 70 72 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  pr ){.          
7130: 2f 2a 20 49 66 20 69 43 6f 6c 20 69 73 20 6c 65  /* If iCol is le
7140: 73 73 20 74 68 61 6e 20 7a 65 72 6f 2c 20 74 68  ss than zero, th
7150: 65 6e 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  en the expressio
7160: 6e 20 72 65 71 75 65 73 74 73 20 74 68 65 0a 20  n requests the. 
7170: 20 20 20 20 20 20 20 20 20 2a 2a 20 72 6f 77 69           ** rowi
7180: 64 20 6f 66 20 74 68 65 20 73 75 62 2d 73 65 6c  d of the sub-sel
7190: 65 63 74 20 6f 72 20 76 69 65 77 2e 20 54 68 69  ect or view. Thi
71a0: 73 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20  s expression is 
71b0: 6c 65 67 61 6c 20 28 73 65 65 20 0a 20 20 20 20  legal (see .    
71c0: 20 20 20 20 20 20 2a 2a 20 74 65 73 74 20 63 61        ** test ca
71d0: 73 65 20 6d 69 73 63 32 2e 32 2e 32 29 20 2d 20  se misc2.2.2) - 
71e0: 69 74 20 61 6c 77 61 79 73 20 65 76 61 6c 75 61  it always evalua
71f0: 74 65 73 20 74 6f 20 4e 55 4c 4c 2e 0a 20 20 20  tes to NULL..   
7200: 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
7210: 20 20 20 20 4e 61 6d 65 43 6f 6e 74 65 78 74 20      NameContext 
7220: 73 4e 43 3b 0a 20 20 20 20 20 20 20 20 20 20 45  sNC;.          E
7230: 78 70 72 20 2a 70 20 3d 20 70 53 2d 3e 70 45 4c  xpr *p = pS->pEL
7240: 69 73 74 2d 3e 61 5b 69 43 6f 6c 5d 2e 70 45 78  ist->a[iCol].pEx
7250: 70 72 3b 0a 20 20 20 20 20 20 20 20 20 20 73 4e  pr;.          sN
7260: 43 2e 70 53 72 63 4c 69 73 74 20 3d 20 70 53 2d  C.pSrcList = pS-
7270: 3e 70 53 72 63 3b 0a 20 20 20 20 20 20 20 20 20  >pSrc;.         
7280: 20 73 4e 43 2e 70 4e 65 78 74 20 3d 20 30 3b 0a   sNC.pNext = 0;.
7290: 20 20 20 20 20 20 20 20 20 20 73 4e 43 2e 70 50            sNC.pP
72a0: 61 72 73 65 20 3d 20 70 4e 43 2d 3e 70 50 61 72  arse = pNC->pPar
72b0: 73 65 3b 0a 20 20 20 20 20 20 20 20 20 20 7a 54  se;.          zT
72c0: 79 70 65 20 3d 20 63 6f 6c 75 6d 6e 54 79 70 65  ype = columnType
72d0: 28 26 73 4e 43 2c 20 70 2c 20 26 7a 4f 72 69 67  (&sNC, p, &zOrig
72e0: 69 6e 44 62 2c 20 26 7a 4f 72 69 67 69 6e 54 61  inDb, &zOriginTa
72f0: 62 2c 20 26 7a 4f 72 69 67 69 6e 43 6f 6c 29 3b  b, &zOriginCol);
7300: 20 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20   .        }.    
7310: 20 20 7d 65 6c 73 65 20 69 66 28 20 70 54 61 62    }else if( pTab
7320: 2d 3e 70 53 63 68 65 6d 61 20 29 7b 0a 20 20 20  ->pSchema ){.   
7330: 20 20 20 20 20 2f 2a 20 41 20 72 65 61 6c 20 74       /* A real t
7340: 61 62 6c 65 20 2a 2f 0a 20 20 20 20 20 20 20 20  able */.        
7350: 61 73 73 65 72 74 28 20 21 70 53 20 29 3b 0a 20  assert( !pS );. 
7360: 20 20 20 20 20 20 20 69 66 28 20 69 43 6f 6c 3c         if( iCol<
7370: 30 20 29 20 69 43 6f 6c 20 3d 20 70 54 61 62 2d  0 ) iCol = pTab-
7380: 3e 69 50 4b 65 79 3b 0a 20 20 20 20 20 20 20 20  >iPKey;.        
7390: 61 73 73 65 72 74 28 20 69 43 6f 6c 3d 3d 2d 31  assert( iCol==-1
73a0: 20 7c 7c 20 28 69 43 6f 6c 3e 3d 30 20 26 26 20   || (iCol>=0 && 
73b0: 69 43 6f 6c 3c 70 54 61 62 2d 3e 6e 43 6f 6c 29  iCol<pTab->nCol)
73c0: 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20   );.        if( 
73d0: 69 43 6f 6c 3c 30 20 29 7b 0a 20 20 20 20 20 20  iCol<0 ){.      
73e0: 20 20 20 20 7a 54 79 70 65 20 3d 20 22 49 4e 54      zType = "INT
73f0: 45 47 45 52 22 3b 0a 20 20 20 20 20 20 20 20 20  EGER";.         
7400: 20 7a 4f 72 69 67 69 6e 43 6f 6c 20 3d 20 22 72   zOriginCol = "r
7410: 6f 77 69 64 22 3b 0a 20 20 20 20 20 20 20 20 7d  owid";.        }
7420: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
7430: 7a 54 79 70 65 20 3d 20 70 54 61 62 2d 3e 61 43  zType = pTab->aC
7440: 6f 6c 5b 69 43 6f 6c 5d 2e 7a 54 79 70 65 3b 0a  ol[iCol].zType;.
7450: 20 20 20 20 20 20 20 20 20 20 7a 4f 72 69 67 69            zOrigi
7460: 6e 43 6f 6c 20 3d 20 70 54 61 62 2d 3e 61 43 6f  nCol = pTab->aCo
7470: 6c 5b 69 43 6f 6c 5d 2e 7a 4e 61 6d 65 3b 0a 20  l[iCol].zName;. 
7480: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
7490: 20 7a 4f 72 69 67 69 6e 54 61 62 20 3d 20 70 54   zOriginTab = pT
74a0: 61 62 2d 3e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20  ab->zName;.     
74b0: 20 20 20 69 66 28 20 70 4e 43 2d 3e 70 50 61 72     if( pNC->pPar
74c0: 73 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  se ){.          
74d0: 69 6e 74 20 69 44 62 20 3d 20 73 71 6c 69 74 65  int iDb = sqlite
74e0: 33 53 63 68 65 6d 61 54 6f 49 6e 64 65 78 28 70  3SchemaToIndex(p
74f0: 4e 43 2d 3e 70 50 61 72 73 65 2d 3e 64 62 2c 20  NC->pParse->db, 
7500: 70 54 61 62 2d 3e 70 53 63 68 65 6d 61 29 3b 0a  pTab->pSchema);.
7510: 20 20 20 20 20 20 20 20 20 20 7a 4f 72 69 67 69            zOrigi
7520: 6e 44 62 20 3d 20 70 4e 43 2d 3e 70 50 61 72 73  nDb = pNC->pPars
7530: 65 2d 3e 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e  e->db->aDb[iDb].
7540: 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20 20 20 7d  zName;.        }
7550: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62  .      }.      b
7560: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 69 66 6e  reak;.    }.#ifn
7570: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
7580: 53 55 42 51 55 45 52 59 0a 20 20 20 20 63 61 73  SUBQUERY.    cas
7590: 65 20 54 4b 5f 53 45 4c 45 43 54 3a 20 7b 0a 20  e TK_SELECT: {. 
75a0: 20 20 20 20 20 2f 2a 20 54 68 65 20 65 78 70 72       /* The expr
75b0: 65 73 73 69 6f 6e 20 69 73 20 61 20 73 75 62 2d  ession is a sub-
75c0: 73 65 6c 65 63 74 2e 20 52 65 74 75 72 6e 20 74  select. Return t
75d0: 68 65 20 64 65 63 6c 61 72 61 74 69 6f 6e 20 74  he declaration t
75e0: 79 70 65 20 61 6e 64 0a 20 20 20 20 20 20 2a 2a  ype and.      **
75f0: 20 6f 72 69 67 69 6e 20 69 6e 66 6f 20 66 6f 72   origin info for
7600: 20 74 68 65 20 73 69 6e 67 6c 65 20 63 6f 6c 75   the single colu
7610: 6d 6e 20 69 6e 20 74 68 65 20 72 65 73 75 6c 74  mn in the result
7620: 20 73 65 74 20 6f 66 20 74 68 65 20 53 45 4c 45   set of the SELE
7630: 43 54 0a 20 20 20 20 20 20 2a 2a 20 73 74 61 74  CT.      ** stat
7640: 65 6d 65 6e 74 2e 0a 20 20 20 20 20 20 2a 2f 0a  ement..      */.
7650: 20 20 20 20 20 20 4e 61 6d 65 43 6f 6e 74 65 78        NameContex
7660: 74 20 73 4e 43 3b 0a 20 20 20 20 20 20 53 65 6c  t sNC;.      Sel
7670: 65 63 74 20 2a 70 53 20 3d 20 70 45 78 70 72 2d  ect *pS = pExpr-
7680: 3e 70 53 65 6c 65 63 74 3b 0a 20 20 20 20 20 20  >pSelect;.      
7690: 45 78 70 72 20 2a 70 20 3d 20 70 53 2d 3e 70 45  Expr *p = pS->pE
76a0: 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72  List->a[0].pExpr
76b0: 3b 0a 20 20 20 20 20 20 73 4e 43 2e 70 53 72 63  ;.      sNC.pSrc
76c0: 4c 69 73 74 20 3d 20 70 53 2d 3e 70 53 72 63 3b  List = pS->pSrc;
76d0: 0a 20 20 20 20 20 20 73 4e 43 2e 70 4e 65 78 74  .      sNC.pNext
76e0: 20 3d 20 70 4e 43 3b 0a 20 20 20 20 20 20 73 4e   = pNC;.      sN
76f0: 43 2e 70 50 61 72 73 65 20 3d 20 70 4e 43 2d 3e  C.pParse = pNC->
7700: 70 50 61 72 73 65 3b 0a 20 20 20 20 20 20 7a 54  pParse;.      zT
7710: 79 70 65 20 3d 20 63 6f 6c 75 6d 6e 54 79 70 65  ype = columnType
7720: 28 26 73 4e 43 2c 20 70 2c 20 26 7a 4f 72 69 67  (&sNC, p, &zOrig
7730: 69 6e 44 62 2c 20 26 7a 4f 72 69 67 69 6e 54 61  inDb, &zOriginTa
7740: 62 2c 20 26 7a 4f 72 69 67 69 6e 43 6f 6c 29 3b  b, &zOriginCol);
7750: 20 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20   .      break;. 
7760: 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 0a     }.#endif.  }.
7770: 20 20 0a 20 20 69 66 28 20 70 7a 4f 72 69 67 69    .  if( pzOrigi
7780: 6e 44 62 20 29 7b 0a 20 20 20 20 61 73 73 65 72  nDb ){.    asser
7790: 74 28 20 70 7a 4f 72 69 67 69 6e 54 61 62 20 26  t( pzOriginTab &
77a0: 26 20 70 7a 4f 72 69 67 69 6e 43 6f 6c 20 29 3b  & pzOriginCol );
77b0: 0a 20 20 20 20 2a 70 7a 4f 72 69 67 69 6e 44 62  .    *pzOriginDb
77c0: 20 3d 20 7a 4f 72 69 67 69 6e 44 62 3b 0a 20 20   = zOriginDb;.  
77d0: 20 20 2a 70 7a 4f 72 69 67 69 6e 54 61 62 20 3d    *pzOriginTab =
77e0: 20 7a 4f 72 69 67 69 6e 54 61 62 3b 0a 20 20 20   zOriginTab;.   
77f0: 20 2a 70 7a 4f 72 69 67 69 6e 43 6f 6c 20 3d 20   *pzOriginCol = 
7800: 7a 4f 72 69 67 69 6e 43 6f 6c 3b 0a 20 20 7d 0a  zOriginCol;.  }.
7810: 20 20 72 65 74 75 72 6e 20 7a 54 79 70 65 3b 0a    return zType;.
7820: 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74  }../*.** Generat
7830: 65 20 63 6f 64 65 20 74 68 61 74 20 77 69 6c 6c  e code that will
7840: 20 74 65 6c 6c 20 74 68 65 20 56 44 42 45 20 74   tell the VDBE t
7850: 68 65 20 64 65 63 6c 61 72 61 74 69 6f 6e 20 74  he declaration t
7860: 79 70 65 73 20 6f 66 20 63 6f 6c 75 6d 6e 73 0a  ypes of columns.
7870: 2a 2a 20 69 6e 20 74 68 65 20 72 65 73 75 6c 74  ** in the result
7880: 20 73 65 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20   set..*/.static 
7890: 76 6f 69 64 20 67 65 6e 65 72 61 74 65 43 6f 6c  void generateCol
78a0: 75 6d 6e 54 79 70 65 73 28 0a 20 20 50 61 72 73  umnTypes(.  Pars
78b0: 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20  e *pParse,      
78c0: 2f 2a 20 50 61 72 73 65 72 20 63 6f 6e 74 65 78  /* Parser contex
78d0: 74 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a  t */.  SrcList *
78e0: 70 54 61 62 4c 69 73 74 2c 20 20 2f 2a 20 4c 69  pTabList,  /* Li
78f0: 73 74 20 6f 66 20 74 61 62 6c 65 73 20 2a 2f 0a  st of tables */.
7900: 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69    ExprList *pELi
7910: 73 74 20 20 20 20 2f 2a 20 45 78 70 72 65 73 73  st    /* Express
7920: 69 6f 6e 73 20 64 65 66 69 6e 69 6e 67 20 74 68  ions defining th
7930: 65 20 72 65 73 75 6c 74 20 73 65 74 20 2a 2f 0a  e result set */.
7940: 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70  ){.  Vdbe *v = p
7950: 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20  Parse->pVdbe;.  
7960: 69 6e 74 20 69 3b 0a 20 20 4e 61 6d 65 43 6f 6e  int i;.  NameCon
7970: 74 65 78 74 20 73 4e 43 3b 0a 20 20 73 4e 43 2e  text sNC;.  sNC.
7980: 70 53 72 63 4c 69 73 74 20 3d 20 70 54 61 62 4c  pSrcList = pTabL
7990: 69 73 74 3b 0a 20 20 73 4e 43 2e 70 50 61 72 73  ist;.  sNC.pPars
79a0: 65 20 3d 20 70 50 61 72 73 65 3b 0a 20 20 66 6f  e = pParse;.  fo
79b0: 72 28 69 3d 30 3b 20 69 3c 70 45 4c 69 73 74 2d  r(i=0; i<pEList-
79c0: 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20  >nExpr; i++){.  
79d0: 20 20 45 78 70 72 20 2a 70 20 3d 20 70 45 4c 69    Expr *p = pELi
79e0: 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 3b 0a  st->a[i].pExpr;.
79f0: 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
7a00: 7a 4f 72 69 67 44 62 20 3d 20 30 3b 0a 20 20 20  zOrigDb = 0;.   
7a10: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4f 72   const char *zOr
7a20: 69 67 54 61 62 20 3d 20 30 3b 0a 20 20 20 20 63  igTab = 0;.    c
7a30: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4f 72 69 67  onst char *zOrig
7a40: 43 6f 6c 20 3d 20 30 3b 0a 20 20 20 20 63 6f 6e  Col = 0;.    con
7a50: 73 74 20 63 68 61 72 20 2a 7a 54 79 70 65 20 3d  st char *zType =
7a60: 20 63 6f 6c 75 6d 6e 54 79 70 65 28 26 73 4e 43   columnType(&sNC
7a70: 2c 20 70 2c 20 26 7a 4f 72 69 67 44 62 2c 20 26  , p, &zOrigDb, &
7a80: 7a 4f 72 69 67 54 61 62 2c 20 26 7a 4f 72 69 67  zOrigTab, &zOrig
7a90: 43 6f 6c 29 3b 0a 0a 20 20 20 20 2f 2a 20 54 68  Col);..    /* Th
7aa0: 65 20 76 64 62 65 20 6d 75 73 74 20 6d 61 6b 65  e vdbe must make
7ab0: 20 69 74 73 20 6f 77 6e 20 63 6f 70 79 20 6f 66   its own copy of
7ac0: 20 74 68 65 20 63 6f 6c 75 6d 6e 2d 74 79 70 65   the column-type
7ad0: 20 61 6e 64 20 6f 74 68 65 72 20 0a 20 20 20 20   and other .    
7ae0: 2a 2a 20 63 6f 6c 75 6d 6e 20 73 70 65 63 69 66  ** column specif
7af0: 69 63 20 73 74 72 69 6e 67 73 2c 20 69 6e 20 63  ic strings, in c
7b00: 61 73 65 20 74 68 65 20 73 63 68 65 6d 61 20 69  ase the schema i
7b10: 73 20 72 65 73 65 74 20 62 65 66 6f 72 65 20 74  s reset before t
7b20: 68 69 73 0a 20 20 20 20 2a 2a 20 76 69 72 74 75  his.    ** virtu
7b30: 61 6c 20 6d 61 63 68 69 6e 65 20 69 73 20 64 65  al machine is de
7b40: 6c 65 74 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20  leted..    */.  
7b50: 20 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 74    sqlite3VdbeSet
7b60: 43 6f 6c 4e 61 6d 65 28 76 2c 20 69 2c 20 43 4f  ColName(v, i, CO
7b70: 4c 4e 41 4d 45 5f 44 45 43 4c 54 59 50 45 2c 20  LNAME_DECLTYPE, 
7b80: 7a 54 79 70 65 2c 20 50 33 5f 54 52 41 4e 53 49  zType, P3_TRANSI
7b90: 45 4e 54 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  ENT);.    sqlite
7ba0: 33 56 64 62 65 53 65 74 43 6f 6c 4e 61 6d 65 28  3VdbeSetColName(
7bb0: 76 2c 20 69 2c 20 43 4f 4c 4e 41 4d 45 5f 44 41  v, i, COLNAME_DA
7bc0: 54 41 42 41 53 45 2c 20 7a 4f 72 69 67 44 62 2c  TABASE, zOrigDb,
7bd0: 20 50 33 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a   P3_TRANSIENT);.
7be0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 53      sqlite3VdbeS
7bf0: 65 74 43 6f 6c 4e 61 6d 65 28 76 2c 20 69 2c 20  etColName(v, i, 
7c00: 43 4f 4c 4e 41 4d 45 5f 54 41 42 4c 45 2c 20 7a  COLNAME_TABLE, z
7c10: 4f 72 69 67 54 61 62 2c 20 50 33 5f 54 52 41 4e  OrigTab, P3_TRAN
7c20: 53 49 45 4e 54 29 3b 0a 20 20 20 20 73 71 6c 69  SIENT);.    sqli
7c30: 74 65 33 56 64 62 65 53 65 74 43 6f 6c 4e 61 6d  te3VdbeSetColNam
7c40: 65 28 76 2c 20 69 2c 20 43 4f 4c 4e 41 4d 45 5f  e(v, i, COLNAME_
7c50: 43 4f 4c 55 4d 4e 2c 20 7a 4f 72 69 67 43 6f 6c  COLUMN, zOrigCol
7c60: 2c 20 50 33 5f 54 52 41 4e 53 49 45 4e 54 29 3b  , P3_TRANSIENT);
7c70: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65  .  }.}../*.** Ge
7c80: 6e 65 72 61 74 65 20 63 6f 64 65 20 74 68 61 74  nerate code that
7c90: 20 77 69 6c 6c 20 74 65 6c 6c 20 74 68 65 20 56   will tell the V
7ca0: 44 42 45 20 74 68 65 20 6e 61 6d 65 73 20 6f 66  DBE the names of
7cb0: 20 63 6f 6c 75 6d 6e 73 0a 2a 2a 20 69 6e 20 74   columns.** in t
7cc0: 68 65 20 72 65 73 75 6c 74 20 73 65 74 2e 20 20  he result set.  
7cd0: 54 68 69 73 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  This information
7ce0: 20 69 73 20 75 73 65 64 20 74 6f 20 70 72 6f 76   is used to prov
7cf0: 69 64 65 20 74 68 65 0a 2a 2a 20 61 7a 43 6f 6c  ide the.** azCol
7d00: 5b 5d 20 76 61 6c 75 65 73 20 69 6e 20 74 68 65  [] values in the
7d10: 20 63 61 6c 6c 62 61 63 6b 2e 0a 2a 2f 0a 73 74   callback..*/.st
7d20: 61 74 69 63 20 76 6f 69 64 20 67 65 6e 65 72 61  atic void genera
7d30: 74 65 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 0a 20  teColumnNames(. 
7d40: 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
7d50: 20 20 20 20 20 2f 2a 20 50 61 72 73 65 72 20 63       /* Parser c
7d60: 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53 72 63 4c  ontext */.  SrcL
7d70: 69 73 74 20 2a 70 54 61 62 4c 69 73 74 2c 20 20  ist *pTabList,  
7d80: 2f 2a 20 4c 69 73 74 20 6f 66 20 74 61 62 6c 65  /* List of table
7d90: 73 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20  s */.  ExprList 
7da0: 2a 70 45 4c 69 73 74 20 20 20 20 2f 2a 20 45 78  *pEList    /* Ex
7db0: 70 72 65 73 73 69 6f 6e 73 20 64 65 66 69 6e 69  pressions defini
7dc0: 6e 67 20 74 68 65 20 72 65 73 75 6c 74 20 73 65  ng the result se
7dd0: 74 20 2a 2f 0a 29 7b 0a 20 20 56 64 62 65 20 2a  t */.){.  Vdbe *
7de0: 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62  v = pParse->pVdb
7df0: 65 3b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20  e;.  int i, j;. 
7e00: 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70   sqlite3 *db = p
7e10: 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 69 6e 74  Parse->db;.  int
7e20: 20 66 75 6c 6c 4e 61 6d 65 73 2c 20 73 68 6f 72   fullNames, shor
7e30: 74 4e 61 6d 65 73 3b 0a 0a 23 69 66 6e 64 65 66  tNames;..#ifndef
7e40: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 45 58 50   SQLITE_OMIT_EXP
7e50: 4c 41 49 4e 0a 20 20 2f 2a 20 49 66 20 74 68 69  LAIN.  /* If thi
7e60: 73 20 69 73 20 61 6e 20 45 58 50 4c 41 49 4e 2c  s is an EXPLAIN,
7e70: 20 73 6b 69 70 20 74 68 69 73 20 73 74 65 70 20   skip this step 
7e80: 2a 2f 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d  */.  if( pParse-
7e90: 3e 65 78 70 6c 61 69 6e 20 29 7b 0a 20 20 20 20  >explain ){.    
7ea0: 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 23 65 6e 64  return;.  }.#end
7eb0: 69 66 0a 0a 20 20 61 73 73 65 72 74 28 20 76 21  if..  assert( v!
7ec0: 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 50 61 72  =0 );.  if( pPar
7ed0: 73 65 2d 3e 63 6f 6c 4e 61 6d 65 73 53 65 74 20  se->colNamesSet 
7ee0: 7c 7c 20 76 3d 3d 30 20 7c 7c 20 64 62 2d 3e 6d  || v==0 || db->m
7ef0: 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20 72 65  allocFailed ) re
7f00: 74 75 72 6e 3b 0a 20 20 70 50 61 72 73 65 2d 3e  turn;.  pParse->
7f10: 63 6f 6c 4e 61 6d 65 73 53 65 74 20 3d 20 31 3b  colNamesSet = 1;
7f20: 0a 20 20 66 75 6c 6c 4e 61 6d 65 73 20 3d 20 28  .  fullNames = (
7f30: 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49  db->flags & SQLI
7f40: 54 45 5f 46 75 6c 6c 43 6f 6c 4e 61 6d 65 73 29  TE_FullColNames)
7f50: 21 3d 30 3b 0a 20 20 73 68 6f 72 74 4e 61 6d 65  !=0;.  shortName
7f60: 73 20 3d 20 28 64 62 2d 3e 66 6c 61 67 73 20 26  s = (db->flags &
7f70: 20 53 51 4c 49 54 45 5f 53 68 6f 72 74 43 6f 6c   SQLITE_ShortCol
7f80: 4e 61 6d 65 73 29 21 3d 30 3b 0a 20 20 73 71 6c  Names)!=0;.  sql
7f90: 69 74 65 33 56 64 62 65 53 65 74 4e 75 6d 43 6f  ite3VdbeSetNumCo
7fa0: 6c 73 28 76 2c 20 70 45 4c 69 73 74 2d 3e 6e 45  ls(v, pEList->nE
7fb0: 78 70 72 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  xpr);.  for(i=0;
7fc0: 20 69 3c 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72   i<pEList->nExpr
7fd0: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72  ; i++){.    Expr
7fe0: 20 2a 70 3b 0a 20 20 20 20 70 20 3d 20 70 45 4c   *p;.    p = pEL
7ff0: 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 3b  ist->a[i].pExpr;
8000: 0a 20 20 20 20 69 66 28 20 70 3d 3d 30 20 29 20  .    if( p==0 ) 
8010: 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69 66  continue;.    if
8020: 28 20 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a  ( pEList->a[i].z
8030: 4e 61 6d 65 20 29 7b 0a 20 20 20 20 20 20 63 68  Name ){.      ch
8040: 61 72 20 2a 7a 4e 61 6d 65 20 3d 20 70 45 4c 69  ar *zName = pELi
8050: 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 3b 0a  st->a[i].zName;.
8060: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
8070: 65 53 65 74 43 6f 6c 4e 61 6d 65 28 76 2c 20 69  eSetColName(v, i
8080: 2c 20 43 4f 4c 4e 41 4d 45 5f 4e 41 4d 45 2c 20  , COLNAME_NAME, 
8090: 7a 4e 61 6d 65 2c 20 73 74 72 6c 65 6e 28 7a 4e  zName, strlen(zN
80a0: 61 6d 65 29 29 3b 0a 20 20 20 20 20 20 63 6f 6e  ame));.      con
80b0: 74 69 6e 75 65 3b 0a 20 20 20 20 7d 0a 20 20 20  tinue;.    }.   
80c0: 20 69 66 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 43   if( p->op==TK_C
80d0: 4f 4c 55 4d 4e 20 26 26 20 70 54 61 62 4c 69 73  OLUMN && pTabLis
80e0: 74 20 29 7b 0a 20 20 20 20 20 20 54 61 62 6c 65  t ){.      Table
80f0: 20 2a 70 54 61 62 3b 0a 20 20 20 20 20 20 63 68   *pTab;.      ch
8100: 61 72 20 2a 7a 43 6f 6c 3b 0a 20 20 20 20 20 20  ar *zCol;.      
8110: 69 6e 74 20 69 43 6f 6c 20 3d 20 70 2d 3e 69 43  int iCol = p->iC
8120: 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20 20 66 6f 72  olumn;.      for
8130: 28 6a 3d 30 3b 20 6a 3c 70 54 61 62 4c 69 73 74  (j=0; j<pTabList
8140: 2d 3e 6e 53 72 63 20 26 26 20 70 54 61 62 4c 69  ->nSrc && pTabLi
8150: 73 74 2d 3e 61 5b 6a 5d 2e 69 43 75 72 73 6f 72  st->a[j].iCursor
8160: 21 3d 70 2d 3e 69 54 61 62 6c 65 3b 20 6a 2b 2b  !=p->iTable; j++
8170: 29 7b 7d 0a 20 20 20 20 20 20 61 73 73 65 72 74  ){}.      assert
8180: 28 20 6a 3c 70 54 61 62 4c 69 73 74 2d 3e 6e 53  ( j<pTabList->nS
8190: 72 63 20 29 3b 0a 20 20 20 20 20 20 70 54 61 62  rc );.      pTab
81a0: 20 3d 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 6a   = pTabList->a[j
81b0: 5d 2e 70 54 61 62 3b 0a 20 20 20 20 20 20 69 66  ].pTab;.      if
81c0: 28 20 69 43 6f 6c 3c 30 20 29 20 69 43 6f 6c 20  ( iCol<0 ) iCol 
81d0: 3d 20 70 54 61 62 2d 3e 69 50 4b 65 79 3b 0a 20  = pTab->iPKey;. 
81e0: 20 20 20 20 20 61 73 73 65 72 74 28 20 69 43 6f       assert( iCo
81f0: 6c 3d 3d 2d 31 20 7c 7c 20 28 69 43 6f 6c 3e 3d  l==-1 || (iCol>=
8200: 30 20 26 26 20 69 43 6f 6c 3c 70 54 61 62 2d 3e  0 && iCol<pTab->
8210: 6e 43 6f 6c 29 20 29 3b 0a 20 20 20 20 20 20 69  nCol) );.      i
8220: 66 28 20 69 43 6f 6c 3c 30 20 29 7b 0a 20 20 20  f( iCol<0 ){.   
8230: 20 20 20 20 20 7a 43 6f 6c 20 3d 20 22 72 6f 77       zCol = "row
8240: 69 64 22 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  id";.      }else
8250: 7b 0a 20 20 20 20 20 20 20 20 7a 43 6f 6c 20 3d  {.        zCol =
8260: 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c   pTab->aCol[iCol
8270: 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20 7d  ].zName;.      }
8280: 0a 20 20 20 20 20 20 69 66 28 20 21 73 68 6f 72  .      if( !shor
8290: 74 4e 61 6d 65 73 20 26 26 20 21 66 75 6c 6c 4e  tNames && !fullN
82a0: 61 6d 65 73 20 26 26 20 70 2d 3e 73 70 61 6e 2e  ames && p->span.
82b0: 7a 20 26 26 20 70 2d 3e 73 70 61 6e 2e 7a 5b 30  z && p->span.z[0
82c0: 5d 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  ] ){.        sql
82d0: 69 74 65 33 56 64 62 65 53 65 74 43 6f 6c 4e 61  ite3VdbeSetColNa
82e0: 6d 65 28 76 2c 20 69 2c 20 43 4f 4c 4e 41 4d 45  me(v, i, COLNAME
82f0: 5f 4e 41 4d 45 2c 20 28 63 68 61 72 2a 29 70 2d  _NAME, (char*)p-
8300: 3e 73 70 61 6e 2e 7a 2c 20 70 2d 3e 73 70 61 6e  >span.z, p->span
8310: 2e 6e 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  .n);.      }else
8320: 20 69 66 28 20 66 75 6c 6c 4e 61 6d 65 73 20 7c   if( fullNames |
8330: 7c 20 28 21 73 68 6f 72 74 4e 61 6d 65 73 20 26  | (!shortNames &
8340: 26 20 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63  & pTabList->nSrc
8350: 3e 31 29 20 29 7b 0a 20 20 20 20 20 20 20 20 63  >1) ){.        c
8360: 68 61 72 20 2a 7a 4e 61 6d 65 20 3d 20 30 3b 0a  har *zName = 0;.
8370: 20 20 20 20 20 20 20 20 63 68 61 72 20 2a 7a 54          char *zT
8380: 61 62 3b 0a 20 0a 20 20 20 20 20 20 20 20 7a 54  ab;. .        zT
8390: 61 62 20 3d 20 70 54 61 62 4c 69 73 74 2d 3e 61  ab = pTabList->a
83a0: 5b 6a 5d 2e 7a 41 6c 69 61 73 3b 0a 20 20 20 20  [j].zAlias;.    
83b0: 20 20 20 20 69 66 28 20 66 75 6c 6c 4e 61 6d 65      if( fullName
83c0: 73 20 7c 7c 20 7a 54 61 62 3d 3d 30 20 29 20 7a  s || zTab==0 ) z
83d0: 54 61 62 20 3d 20 70 54 61 62 2d 3e 7a 4e 61 6d  Tab = pTab->zNam
83e0: 65 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  e;.        sqlit
83f0: 65 33 53 65 74 53 74 72 69 6e 67 28 26 7a 4e 61  e3SetString(&zNa
8400: 6d 65 2c 20 7a 54 61 62 2c 20 22 2e 22 2c 20 7a  me, zTab, ".", z
8410: 43 6f 6c 2c 20 28 63 68 61 72 2a 29 30 29 3b 0a  Col, (char*)0);.
8420: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
8430: 64 62 65 53 65 74 43 6f 6c 4e 61 6d 65 28 76 2c  dbeSetColName(v,
8440: 20 69 2c 20 43 4f 4c 4e 41 4d 45 5f 4e 41 4d 45   i, COLNAME_NAME
8450: 2c 20 7a 4e 61 6d 65 2c 20 50 33 5f 44 59 4e 41  , zName, P3_DYNA
8460: 4d 49 43 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  MIC);.      }els
8470: 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  e{.        sqlit
8480: 65 33 56 64 62 65 53 65 74 43 6f 6c 4e 61 6d 65  e3VdbeSetColName
8490: 28 76 2c 20 69 2c 20 43 4f 4c 4e 41 4d 45 5f 4e  (v, i, COLNAME_N
84a0: 41 4d 45 2c 20 7a 43 6f 6c 2c 20 73 74 72 6c 65  AME, zCol, strle
84b0: 6e 28 7a 43 6f 6c 29 29 3b 0a 20 20 20 20 20 20  n(zCol));.      
84c0: 7d 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  }.    }else if( 
84d0: 70 2d 3e 73 70 61 6e 2e 7a 20 26 26 20 70 2d 3e  p->span.z && p->
84e0: 73 70 61 6e 2e 7a 5b 30 5d 20 29 7b 0a 20 20 20  span.z[0] ){.   
84f0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 53 65     sqlite3VdbeSe
8500: 74 43 6f 6c 4e 61 6d 65 28 76 2c 20 69 2c 20 43  tColName(v, i, C
8510: 4f 4c 4e 41 4d 45 5f 4e 41 4d 45 2c 20 28 63 68  OLNAME_NAME, (ch
8520: 61 72 2a 29 70 2d 3e 73 70 61 6e 2e 7a 2c 20 70  ar*)p->span.z, p
8530: 2d 3e 73 70 61 6e 2e 6e 29 3b 0a 20 20 20 20 20  ->span.n);.     
8540: 20 2f 2a 20 73 71 6c 69 74 65 33 56 64 62 65 43   /* sqlite3VdbeC
8550: 6f 6d 70 72 65 73 73 53 70 61 63 65 28 76 2c 20  ompressSpace(v, 
8560: 61 64 64 72 29 3b 20 2a 2f 0a 20 20 20 20 7d 65  addr); */.    }e
8570: 6c 73 65 7b 0a 20 20 20 20 20 20 63 68 61 72 20  lse{.      char 
8580: 7a 4e 61 6d 65 5b 33 30 5d 3b 0a 20 20 20 20 20  zName[30];.     
8590: 20 61 73 73 65 72 74 28 20 70 2d 3e 6f 70 21 3d   assert( p->op!=
85a0: 54 4b 5f 43 4f 4c 55 4d 4e 20 7c 7c 20 70 54 61  TK_COLUMN || pTa
85b0: 62 4c 69 73 74 3d 3d 30 20 29 3b 0a 20 20 20 20  bList==0 );.    
85c0: 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e    sqlite3_snprin
85d0: 74 66 28 73 69 7a 65 6f 66 28 7a 4e 61 6d 65 29  tf(sizeof(zName)
85e0: 2c 20 7a 4e 61 6d 65 2c 20 22 63 6f 6c 75 6d 6e  , zName, "column
85f0: 25 64 22 2c 20 69 2b 31 29 3b 0a 20 20 20 20 20  %d", i+1);.     
8600: 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 74 43   sqlite3VdbeSetC
8610: 6f 6c 4e 61 6d 65 28 76 2c 20 69 2c 20 43 4f 4c  olName(v, i, COL
8620: 4e 41 4d 45 5f 4e 41 4d 45 2c 20 7a 4e 61 6d 65  NAME_NAME, zName
8630: 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  , 0);.    }.  }.
8640: 20 20 67 65 6e 65 72 61 74 65 43 6f 6c 75 6d 6e    generateColumn
8650: 54 79 70 65 73 28 70 50 61 72 73 65 2c 20 70 54  Types(pParse, pT
8660: 61 62 4c 69 73 74 2c 20 70 45 4c 69 73 74 29 3b  abList, pEList);
8670: 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  .}..#ifndef SQLI
8680: 54 45 5f 4f 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44  TE_OMIT_COMPOUND
8690: 5f 53 45 4c 45 43 54 0a 2f 2a 0a 2a 2a 20 4e 61  _SELECT./*.** Na
86a0: 6d 65 20 6f 66 20 74 68 65 20 63 6f 6e 6e 65 63  me of the connec
86b0: 74 69 6f 6e 20 6f 70 65 72 61 74 6f 72 2c 20 75  tion operator, u
86c0: 73 65 64 20 66 6f 72 20 65 72 72 6f 72 20 6d 65  sed for error me
86d0: 73 73 61 67 65 73 2e 0a 2a 2f 0a 73 74 61 74 69  ssages..*/.stati
86e0: 63 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 73 65  c const char *se
86f0: 6c 65 63 74 4f 70 4e 61 6d 65 28 69 6e 74 20 69  lectOpName(int i
8700: 64 29 7b 0a 20 20 63 68 61 72 20 2a 7a 3b 0a 20  d){.  char *z;. 
8710: 20 73 77 69 74 63 68 28 20 69 64 20 29 7b 0a 20   switch( id ){. 
8720: 20 20 20 63 61 73 65 20 54 4b 5f 41 4c 4c 3a 20     case TK_ALL: 
8730: 20 20 20 20 20 20 7a 20 3d 20 22 55 4e 49 4f 4e        z = "UNION
8740: 20 41 4c 4c 22 3b 20 20 20 62 72 65 61 6b 3b 0a   ALL";   break;.
8750: 20 20 20 20 63 61 73 65 20 54 4b 5f 49 4e 54 45      case TK_INTE
8760: 52 53 45 43 54 3a 20 7a 20 3d 20 22 49 4e 54 45  RSECT: z = "INTE
8770: 52 53 45 43 54 22 3b 20 20 20 62 72 65 61 6b 3b  RSECT";   break;
8780: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 45 58 43  .    case TK_EXC
8790: 45 50 54 3a 20 20 20 20 7a 20 3d 20 22 45 58 43  EPT:    z = "EXC
87a0: 45 50 54 22 3b 20 20 20 20 20 20 62 72 65 61 6b  EPT";      break
87b0: 3b 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20 20  ;.    default:  
87c0: 20 20 20 20 20 20 20 20 20 7a 20 3d 20 22 55 4e           z = "UN
87d0: 49 4f 4e 22 3b 20 20 20 20 20 20 20 62 72 65 61  ION";       brea
87e0: 6b 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  k;.  }.  return 
87f0: 7a 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53  z;.}.#endif /* S
8800: 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f 4d 50 4f  QLITE_OMIT_COMPO
8810: 55 4e 44 5f 53 45 4c 45 43 54 20 2a 2f 0a 0a 2f  UND_SELECT */../
8820: 2a 0a 2a 2a 20 46 6f 72 77 61 72 64 20 64 65 63  *.** Forward dec
8830: 6c 61 72 61 74 69 6f 6e 0a 2a 2f 0a 73 74 61 74  laration.*/.stat
8840: 69 63 20 69 6e 74 20 70 72 65 70 53 65 6c 65 63  ic int prepSelec
8850: 74 53 74 6d 74 28 50 61 72 73 65 2a 2c 20 53 65  tStmt(Parse*, Se
8860: 6c 65 63 74 2a 29 3b 0a 0a 2f 2a 0a 2a 2a 20 47  lect*);../*.** G
8870: 69 76 65 6e 20 61 20 53 45 4c 45 43 54 20 73 74  iven a SELECT st
8880: 61 74 65 6d 65 6e 74 2c 20 67 65 6e 65 72 61 74  atement, generat
8890: 65 20 61 20 54 61 62 6c 65 20 73 74 72 75 63 74  e a Table struct
88a0: 75 72 65 20 74 68 61 74 20 64 65 73 63 72 69 62  ure that describ
88b0: 65 73 0a 2a 2a 20 74 68 65 20 72 65 73 75 6c 74  es.** the result
88c0: 20 73 65 74 20 6f 66 20 74 68 61 74 20 53 45 4c   set of that SEL
88d0: 45 43 54 2e 0a 2a 2f 0a 54 61 62 6c 65 20 2a 73  ECT..*/.Table *s
88e0: 71 6c 69 74 65 33 52 65 73 75 6c 74 53 65 74 4f  qlite3ResultSetO
88f0: 66 53 65 6c 65 63 74 28 50 61 72 73 65 20 2a 70  fSelect(Parse *p
8900: 50 61 72 73 65 2c 20 63 68 61 72 20 2a 7a 54 61  Parse, char *zTa
8910: 62 4e 61 6d 65 2c 20 53 65 6c 65 63 74 20 2a 70  bName, Select *p
8920: 53 65 6c 65 63 74 29 7b 0a 20 20 54 61 62 6c 65  Select){.  Table
8930: 20 2a 70 54 61 62 3b 0a 20 20 69 6e 74 20 69 2c   *pTab;.  int i,
8940: 20 6a 3b 0a 20 20 45 78 70 72 4c 69 73 74 20 2a   j;.  ExprList *
8950: 70 45 4c 69 73 74 3b 0a 20 20 43 6f 6c 75 6d 6e  pEList;.  Column
8960: 20 2a 61 43 6f 6c 2c 20 2a 70 43 6f 6c 3b 0a 20   *aCol, *pCol;. 
8970: 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70   sqlite3 *db = p
8980: 50 61 72 73 65 2d 3e 64 62 3b 0a 0a 20 20 77 68  Parse->db;..  wh
8990: 69 6c 65 28 20 70 53 65 6c 65 63 74 2d 3e 70 50  ile( pSelect->pP
89a0: 72 69 6f 72 20 29 20 70 53 65 6c 65 63 74 20 3d  rior ) pSelect =
89b0: 20 70 53 65 6c 65 63 74 2d 3e 70 50 72 69 6f 72   pSelect->pPrior
89c0: 3b 0a 20 20 69 66 28 20 70 72 65 70 53 65 6c 65  ;.  if( prepSele
89d0: 63 74 53 74 6d 74 28 70 50 61 72 73 65 2c 20 70  ctStmt(pParse, p
89e0: 53 65 6c 65 63 74 29 20 29 7b 0a 20 20 20 20 72  Select) ){.    r
89f0: 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 69  eturn 0;.  }.  i
8a00: 66 28 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74  f( sqlite3Select
8a10: 52 65 73 6f 6c 76 65 28 70 50 61 72 73 65 2c 20  Resolve(pParse, 
8a20: 70 53 65 6c 65 63 74 2c 20 30 29 20 29 7b 0a 20  pSelect, 0) ){. 
8a30: 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d     return 0;.  }
8a40: 0a 20 20 70 54 61 62 20 3d 20 73 71 6c 69 74 65  .  pTab = sqlite
8a50: 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62  3DbMallocZero(db
8a60: 2c 20 73 69 7a 65 6f 66 28 54 61 62 6c 65 29 20  , sizeof(Table) 
8a70: 29 3b 0a 20 20 69 66 28 20 70 54 61 62 3d 3d 30  );.  if( pTab==0
8a80: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30   ){.    return 0
8a90: 3b 0a 20 20 7d 0a 20 20 70 54 61 62 2d 3e 6e 52  ;.  }.  pTab->nR
8aa0: 65 66 20 3d 20 31 3b 0a 20 20 70 54 61 62 2d 3e  ef = 1;.  pTab->
8ab0: 7a 4e 61 6d 65 20 3d 20 7a 54 61 62 4e 61 6d 65  zName = zTabName
8ac0: 20 3f 20 73 71 6c 69 74 65 33 44 62 53 74 72 44   ? sqlite3DbStrD
8ad0: 75 70 28 64 62 2c 20 7a 54 61 62 4e 61 6d 65 29  up(db, zTabName)
8ae0: 20 3a 20 30 3b 0a 20 20 70 45 4c 69 73 74 20 3d   : 0;.  pEList =
8af0: 20 70 53 65 6c 65 63 74 2d 3e 70 45 4c 69 73 74   pSelect->pEList
8b00: 3b 0a 20 20 70 54 61 62 2d 3e 6e 43 6f 6c 20 3d  ;.  pTab->nCol =
8b10: 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 0a   pEList->nExpr;.
8b20: 20 20 61 73 73 65 72 74 28 20 70 54 61 62 2d 3e    assert( pTab->
8b30: 6e 43 6f 6c 3e 30 20 29 3b 0a 20 20 70 54 61 62  nCol>0 );.  pTab
8b40: 2d 3e 61 43 6f 6c 20 3d 20 61 43 6f 6c 20 3d 20  ->aCol = aCol = 
8b50: 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a  sqlite3DbMallocZ
8b60: 65 72 6f 28 64 62 2c 20 73 69 7a 65 6f 66 28 70  ero(db, sizeof(p
8b70: 54 61 62 2d 3e 61 43 6f 6c 5b 30 5d 29 2a 70 54  Tab->aCol[0])*pT
8b80: 61 62 2d 3e 6e 43 6f 6c 29 3b 0a 20 20 66 6f 72  ab->nCol);.  for
8b90: 28 69 3d 30 2c 20 70 43 6f 6c 3d 61 43 6f 6c 3b  (i=0, pCol=aCol;
8ba0: 20 69 3c 70 54 61 62 2d 3e 6e 43 6f 6c 3b 20 69   i<pTab->nCol; i
8bb0: 2b 2b 2c 20 70 43 6f 6c 2b 2b 29 7b 0a 20 20 20  ++, pCol++){.   
8bc0: 20 45 78 70 72 20 2a 70 2c 20 2a 70 52 3b 0a 20   Expr *p, *pR;. 
8bd0: 20 20 20 63 68 61 72 20 2a 7a 54 79 70 65 3b 0a     char *zType;.
8be0: 20 20 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 3b      char *zName;
8bf0: 0a 20 20 20 20 69 6e 74 20 6e 4e 61 6d 65 3b 0a  .    int nName;.
8c00: 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f      CollSeq *pCo
8c10: 6c 6c 3b 0a 20 20 20 20 69 6e 74 20 63 6e 74 3b  ll;.    int cnt;
8c20: 0a 20 20 20 20 4e 61 6d 65 43 6f 6e 74 65 78 74  .    NameContext
8c30: 20 73 4e 43 3b 0a 20 20 20 20 0a 20 20 20 20 2f   sNC;.    .    /
8c40: 2a 20 47 65 74 20 61 6e 20 61 70 70 72 6f 70 72  * Get an appropr
8c50: 69 61 74 65 20 6e 61 6d 65 20 66 6f 72 20 74 68  iate name for th
8c60: 65 20 63 6f 6c 75 6d 6e 0a 20 20 20 20 2a 2f 0a  e column.    */.
8c70: 20 20 20 20 70 20 3d 20 70 45 4c 69 73 74 2d 3e      p = pEList->
8c80: 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20  a[i].pExpr;.    
8c90: 61 73 73 65 72 74 28 20 70 2d 3e 70 52 69 67 68  assert( p->pRigh
8ca0: 74 3d 3d 30 20 7c 7c 20 70 2d 3e 70 52 69 67 68  t==0 || p->pRigh
8cb0: 74 2d 3e 74 6f 6b 65 6e 2e 7a 3d 3d 30 20 7c 7c  t->token.z==0 ||
8cc0: 20 70 2d 3e 70 52 69 67 68 74 2d 3e 74 6f 6b 65   p->pRight->toke
8cd0: 6e 2e 7a 5b 30 5d 21 3d 30 20 29 3b 0a 20 20 20  n.z[0]!=0 );.   
8ce0: 20 69 66 28 20 28 7a 4e 61 6d 65 20 3d 20 70 45   if( (zName = pE
8cf0: 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65  List->a[i].zName
8d00: 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a  )!=0 ){.      /*
8d10: 20 49 66 20 74 68 65 20 63 6f 6c 75 6d 6e 20 63   If the column c
8d20: 6f 6e 74 61 69 6e 73 20 61 6e 20 22 41 53 20 3c  ontains an "AS <
8d30: 6e 61 6d 65 3e 22 20 70 68 72 61 73 65 2c 20 75  name>" phrase, u
8d40: 73 65 20 3c 6e 61 6d 65 3e 20 61 73 20 74 68 65  se <name> as the
8d50: 20 6e 61 6d 65 20 2a 2f 0a 20 20 20 20 20 20 7a   name */.      z
8d60: 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 44 62  Name = sqlite3Db
8d70: 53 74 72 44 75 70 28 64 62 2c 20 7a 4e 61 6d 65  StrDup(db, zName
8d80: 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  );.    }else if(
8d90: 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 44 4f 54 20 0a   p->op==TK_DOT .
8da0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 26 26                &&
8db0: 20 28 70 52 3d 70 2d 3e 70 52 69 67 68 74 29 21   (pR=p->pRight)!
8dc0: 3d 30 20 26 26 20 70 52 2d 3e 74 6f 6b 65 6e 2e  =0 && pR->token.
8dd0: 7a 20 26 26 20 70 52 2d 3e 74 6f 6b 65 6e 2e 7a  z && pR->token.z
8de0: 5b 30 5d 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  [0] ){.      /* 
8df0: 46 6f 72 20 63 6f 6c 75 6d 6e 73 20 6f 66 20 74  For columns of t
8e00: 68 65 20 66 72 6f 6d 20 41 2e 42 20 75 73 65 20  he from A.B use 
8e10: 42 20 61 73 20 74 68 65 20 6e 61 6d 65 20 2a 2f  B as the name */
8e20: 0a 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 73  .      zName = s
8e30: 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 64 62  qlite3MPrintf(db
8e40: 2c 20 22 25 54 22 2c 20 26 70 52 2d 3e 74 6f 6b  , "%T", &pR->tok
8e50: 65 6e 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69  en);.    }else i
8e60: 66 28 20 70 2d 3e 73 70 61 6e 2e 7a 20 26 26 20  f( p->span.z && 
8e70: 70 2d 3e 73 70 61 6e 2e 7a 5b 30 5d 20 29 7b 0a  p->span.z[0] ){.
8e80: 20 20 20 20 20 20 2f 2a 20 55 73 65 20 74 68 65        /* Use the
8e90: 20 6f 72 69 67 69 6e 61 6c 20 74 65 78 74 20 6f   original text o
8ea0: 66 20 74 68 65 20 63 6f 6c 75 6d 6e 20 65 78 70  f the column exp
8eb0: 72 65 73 73 69 6f 6e 20 61 73 20 69 74 73 20 6e  ression as its n
8ec0: 61 6d 65 20 2a 2f 0a 20 20 20 20 20 20 7a 4e 61  ame */.      zNa
8ed0: 6d 65 20 3d 20 73 71 6c 69 74 65 33 4d 50 72 69  me = sqlite3MPri
8ee0: 6e 74 66 28 64 62 2c 20 22 25 54 22 2c 20 26 70  ntf(db, "%T", &p
8ef0: 2d 3e 73 70 61 6e 29 3b 0a 20 20 20 20 7d 65 6c  ->span);.    }el
8f00: 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66 20  se{.      /* If 
8f10: 61 6c 6c 20 65 6c 73 65 20 66 61 69 6c 73 2c 20  all else fails, 
8f20: 6d 61 6b 65 20 75 70 20 61 20 6e 61 6d 65 20 2a  make up a name *
8f30: 2f 0a 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20  /.      zName = 
8f40: 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 64  sqlite3MPrintf(d
8f50: 62 2c 20 22 63 6f 6c 75 6d 6e 25 64 22 2c 20 69  b, "column%d", i
8f60: 2b 31 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  +1);.    }.    i
8f70: 66 28 20 21 7a 4e 61 6d 65 20 7c 7c 20 64 62 2d  f( !zName || db-
8f80: 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b  >mallocFailed ){
8f90: 0a 20 20 20 20 20 20 64 62 2d 3e 6d 61 6c 6c 6f  .      db->mallo
8fa0: 63 46 61 69 6c 65 64 20 3d 20 31 3b 0a 20 20 20  cFailed = 1;.   
8fb0: 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
8fc0: 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 73 71  zName);.      sq
8fd0: 6c 69 74 65 33 44 65 6c 65 74 65 54 61 62 6c 65  lite3DeleteTable
8fe0: 28 70 54 61 62 29 3b 0a 20 20 20 20 20 20 72 65  (pTab);.      re
8ff0: 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 20 20  turn 0;.    }.  
9000: 20 20 73 71 6c 69 74 65 33 44 65 71 75 6f 74 65    sqlite3Dequote
9010: 28 7a 4e 61 6d 65 29 3b 0a 0a 20 20 20 20 2f 2a  (zName);..    /*
9020: 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65 20 63   Make sure the c
9030: 6f 6c 75 6d 6e 20 6e 61 6d 65 20 69 73 20 75 6e  olumn name is un
9040: 69 71 75 65 2e 20 20 49 66 20 74 68 65 20 6e 61  ique.  If the na
9050: 6d 65 20 69 73 20 6e 6f 74 20 75 6e 69 71 75 65  me is not unique
9060: 2c 0a 20 20 20 20 2a 2a 20 61 70 70 65 6e 64 20  ,.    ** append 
9070: 61 20 69 6e 74 65 67 65 72 20 74 6f 20 74 68 65  a integer to the
9080: 20 6e 61 6d 65 20 73 6f 20 74 68 61 74 20 69 74   name so that it
9090: 20 62 65 63 6f 6d 65 73 20 75 6e 69 71 75 65 2e   becomes unique.
90a0: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 6e 4e 61 6d  .    */.    nNam
90b0: 65 20 3d 20 73 74 72 6c 65 6e 28 7a 4e 61 6d 65  e = strlen(zName
90c0: 29 3b 0a 20 20 20 20 66 6f 72 28 6a 3d 63 6e 74  );.    for(j=cnt
90d0: 3d 30 3b 20 6a 3c 69 3b 20 6a 2b 2b 29 7b 0a 20  =0; j<i; j++){. 
90e0: 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33       if( sqlite3
90f0: 53 74 72 49 43 6d 70 28 61 43 6f 6c 5b 6a 5d 2e  StrICmp(aCol[j].
9100: 7a 4e 61 6d 65 2c 20 7a 4e 61 6d 65 29 3d 3d 30  zName, zName)==0
9110: 20 29 7b 0a 20 20 20 20 20 20 20 20 7a 4e 61 6d   ){.        zNam
9120: 65 5b 6e 4e 61 6d 65 5d 20 3d 20 30 3b 0a 20 20  e[nName] = 0;.  
9130: 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 73 71        zName = sq
9140: 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 64 62 2c  lite3MPrintf(db,
9150: 20 22 25 7a 3a 25 64 22 2c 20 7a 4e 61 6d 65 2c   "%z:%d", zName,
9160: 20 2b 2b 63 6e 74 29 3b 0a 20 20 20 20 20 20 20   ++cnt);.       
9170: 20 6a 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 20   j = -1;.       
9180: 20 69 66 28 20 7a 4e 61 6d 65 3d 3d 30 20 29 20   if( zName==0 ) 
9190: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20  break;.      }. 
91a0: 20 20 20 7d 0a 20 20 20 20 70 43 6f 6c 2d 3e 7a     }.    pCol->z
91b0: 4e 61 6d 65 20 3d 20 7a 4e 61 6d 65 3b 0a 0a 20  Name = zName;.. 
91c0: 20 20 20 2f 2a 20 47 65 74 20 74 68 65 20 74 79     /* Get the ty
91d0: 70 65 6e 61 6d 65 2c 20 74 79 70 65 20 61 66 66  pename, type aff
91e0: 69 6e 69 74 79 2c 20 61 6e 64 20 63 6f 6c 6c 61  inity, and colla
91f0: 74 69 6e 67 20 73 65 71 75 65 6e 63 65 20 66 6f  ting sequence fo
9200: 72 20 74 68 65 0a 20 20 20 20 2a 2a 20 63 6f 6c  r the.    ** col
9210: 75 6d 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  umn..    */.    
9220: 6d 65 6d 73 65 74 28 26 73 4e 43 2c 20 30 2c 20  memset(&sNC, 0, 
9230: 73 69 7a 65 6f 66 28 73 4e 43 29 29 3b 0a 20 20  sizeof(sNC));.  
9240: 20 20 73 4e 43 2e 70 53 72 63 4c 69 73 74 20 3d    sNC.pSrcList =
9250: 20 70 53 65 6c 65 63 74 2d 3e 70 53 72 63 3b 0a   pSelect->pSrc;.
9260: 20 20 20 20 7a 54 79 70 65 20 3d 20 73 71 6c 69      zType = sqli
9270: 74 65 33 44 62 53 74 72 44 75 70 28 64 62 2c 20  te3DbStrDup(db, 
9280: 63 6f 6c 75 6d 6e 54 79 70 65 28 26 73 4e 43 2c  columnType(&sNC,
9290: 20 70 2c 20 30 2c 20 30 2c 20 30 29 29 3b 0a 20   p, 0, 0, 0));. 
92a0: 20 20 20 70 43 6f 6c 2d 3e 7a 54 79 70 65 20 3d     pCol->zType =
92b0: 20 7a 54 79 70 65 3b 0a 20 20 20 20 70 43 6f 6c   zType;.    pCol
92c0: 2d 3e 61 66 66 69 6e 69 74 79 20 3d 20 73 71 6c  ->affinity = sql
92d0: 69 74 65 33 45 78 70 72 41 66 66 69 6e 69 74 79  ite3ExprAffinity
92e0: 28 70 29 3b 0a 20 20 20 20 70 43 6f 6c 6c 20 3d  (p);.    pColl =
92f0: 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c   sqlite3ExprColl
9300: 53 65 71 28 70 50 61 72 73 65 2c 20 70 29 3b 0a  Seq(pParse, p);.
9310: 20 20 20 20 69 66 28 20 70 43 6f 6c 6c 20 29 7b      if( pColl ){
9320: 0a 20 20 20 20 20 20 70 43 6f 6c 2d 3e 7a 43 6f  .      pCol->zCo
9330: 6c 6c 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74  ll = sqlite3DbSt
9340: 72 44 75 70 28 64 62 2c 20 70 43 6f 6c 6c 2d 3e  rDup(db, pColl->
9350: 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 7d 0a 20 20  zName);.    }.  
9360: 7d 0a 20 20 70 54 61 62 2d 3e 69 50 4b 65 79 20  }.  pTab->iPKey 
9370: 3d 20 2d 31 3b 0a 20 20 72 65 74 75 72 6e 20 70  = -1;.  return p
9380: 54 61 62 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 72  Tab;.}../*.** Pr
9390: 65 70 61 72 65 20 61 20 53 45 4c 45 43 54 20 73  epare a SELECT s
93a0: 74 61 74 65 6d 65 6e 74 20 66 6f 72 20 70 72 6f  tatement for pro
93b0: 63 65 73 73 69 6e 67 20 62 79 20 64 6f 69 6e 67  cessing by doing
93c0: 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 0a 2a   the following.*
93d0: 2a 20 74 68 69 6e 67 73 3a 0a 2a 2a 0a 2a 2a 20  * things:.**.** 
93e0: 20 20 20 28 31 29 20 20 4d 61 6b 65 20 73 75 72     (1)  Make sur
93f0: 65 20 56 44 42 45 20 63 75 72 73 6f 72 20 6e 75  e VDBE cursor nu
9400: 6d 62 65 72 73 20 68 61 76 65 20 62 65 65 6e 20  mbers have been 
9410: 61 73 73 69 67 6e 65 64 20 74 6f 20 65 76 65 72  assigned to ever
9420: 79 0a 2a 2a 20 20 20 20 20 20 20 20 20 65 6c 65  y.**         ele
9430: 6d 65 6e 74 20 6f 66 20 74 68 65 20 46 52 4f 4d  ment of the FROM
9440: 20 63 6c 61 75 73 65 2e 0a 2a 2a 0a 2a 2a 20 20   clause..**.**  
9450: 20 20 28 32 29 20 20 46 69 6c 6c 20 69 6e 20 74    (2)  Fill in t
9460: 68 65 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 5d  he pTabList->a[]
9470: 2e 70 54 61 62 20 66 69 65 6c 64 73 20 69 6e 20  .pTab fields in 
9480: 74 68 65 20 53 72 63 4c 69 73 74 20 74 68 61 74  the SrcList that
9490: 20 0a 2a 2a 20 20 20 20 20 20 20 20 20 64 65 66   .**         def
94a0: 69 6e 65 73 20 46 52 4f 4d 20 63 6c 61 75 73 65  ines FROM clause
94b0: 2e 20 20 57 68 65 6e 20 76 69 65 77 73 20 61 70  .  When views ap
94c0: 70 65 61 72 20 69 6e 20 74 68 65 20 46 52 4f 4d  pear in the FROM
94d0: 20 63 6c 61 75 73 65 2c 0a 2a 2a 20 20 20 20 20   clause,.**     
94e0: 20 20 20 20 66 69 6c 6c 20 70 54 61 62 4c 69 73      fill pTabLis
94f0: 74 2d 3e 61 5b 5d 2e 70 53 65 6c 65 63 74 20 77  t->a[].pSelect w
9500: 69 74 68 20 61 20 63 6f 70 79 20 6f 66 20 74 68  ith a copy of th
9510: 65 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  e SELECT stateme
9520: 6e 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 74 68  nt.**         th
9530: 61 74 20 69 6d 70 6c 65 6d 65 6e 74 73 20 74 68  at implements th
9540: 65 20 76 69 65 77 2e 20 20 41 20 63 6f 70 79 20  e view.  A copy 
9550: 69 73 20 6d 61 64 65 20 6f 66 20 74 68 65 20 76  is made of the v
9560: 69 65 77 27 73 20 53 45 4c 45 43 54 0a 2a 2a 20  iew's SELECT.** 
9570: 20 20 20 20 20 20 20 20 73 74 61 74 65 6d 65 6e          statemen
9580: 74 20 73 6f 20 74 68 61 74 20 77 65 20 63 61 6e  t so that we can
9590: 20 66 72 65 65 6c 79 20 6d 6f 64 69 66 79 20 6f   freely modify o
95a0: 72 20 64 65 6c 65 74 65 20 74 68 61 74 20 73 74  r delete that st
95b0: 61 74 65 6d 65 6e 74 0a 2a 2a 20 20 20 20 20 20  atement.**      
95c0: 20 20 20 77 69 74 68 6f 75 74 20 77 6f 72 72 79     without worry
95d0: 69 6e 67 20 61 62 6f 75 74 20 6d 65 73 73 69 6e  ing about messin
95e0: 67 20 75 70 20 74 68 65 20 70 72 65 73 69 73 74  g up the presist
95f0: 65 6e 74 20 72 65 70 72 65 73 65 6e 74 61 74 69  ent representati
9600: 6f 6e 0a 2a 2a 20 20 20 20 20 20 20 20 20 6f 66  on.**         of
9610: 20 74 68 65 20 76 69 65 77 2e 0a 2a 2a 0a 2a 2a   the view..**.**
9620: 20 20 20 20 28 33 29 20 20 41 64 64 20 74 65 72      (3)  Add ter
9630: 6d 73 20 74 6f 20 74 68 65 20 57 48 45 52 45 20  ms to the WHERE 
9640: 63 6c 61 75 73 65 20 74 6f 20 61 63 63 6f 6d 6f  clause to accomo
9650: 64 61 74 65 20 74 68 65 20 4e 41 54 55 52 41 4c  date the NATURAL
9660: 20 6b 65 79 77 6f 72 64 0a 2a 2a 20 20 20 20 20   keyword.**     
9670: 20 20 20 20 6f 6e 20 6a 6f 69 6e 73 20 61 6e 64      on joins and
9680: 20 74 68 65 20 4f 4e 20 61 6e 64 20 55 53 49 4e   the ON and USIN
9690: 47 20 63 6c 61 75 73 65 20 6f 66 20 6a 6f 69 6e  G clause of join
96a0: 73 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 28 34 29 20  s..**.**    (4) 
96b0: 20 53 63 61 6e 20 74 68 65 20 6c 69 73 74 20 6f   Scan the list o
96c0: 66 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65  f columns in the
96d0: 20 72 65 73 75 6c 74 20 73 65 74 20 28 70 45 4c   result set (pEL
96e0: 69 73 74 29 20 6c 6f 6f 6b 69 6e 67 0a 2a 2a 20  ist) looking.** 
96f0: 20 20 20 20 20 20 20 20 66 6f 72 20 69 6e 73 74          for inst
9700: 61 6e 63 65 73 20 6f 66 20 74 68 65 20 22 2a 22  ances of the "*"
9710: 20 6f 70 65 72 61 74 6f 72 20 6f 72 20 74 68 65   operator or the
9720: 20 54 41 42 4c 45 2e 2a 20 6f 70 65 72 61 74 6f   TABLE.* operato
9730: 72 2e 0a 2a 2a 20 20 20 20 20 20 20 20 20 49 66  r..**         If
9740: 20 66 6f 75 6e 64 2c 20 65 78 70 61 6e 64 20 65   found, expand e
9750: 61 63 68 20 22 2a 22 20 74 6f 20 62 65 20 65 76  ach "*" to be ev
9760: 65 72 79 20 63 6f 6c 75 6d 6e 20 69 6e 20 65 76  ery column in ev
9770: 65 72 79 20 74 61 62 6c 65 0a 2a 2a 20 20 20 20  ery table.**    
9780: 20 20 20 20 20 61 6e 64 20 54 41 42 4c 45 2e 2a       and TABLE.*
9790: 20 74 6f 20 62 65 20 65 76 65 72 79 20 63 6f 6c   to be every col
97a0: 75 6d 6e 20 69 6e 20 54 41 42 4c 45 2e 0a 2a 2a  umn in TABLE..**
97b0: 0a 2a 2a 20 52 65 74 75 72 6e 20 30 20 6f 6e 20  .** Return 0 on 
97c0: 73 75 63 63 65 73 73 2e 20 20 49 66 20 74 68 65  success.  If the
97d0: 72 65 20 61 72 65 20 70 72 6f 62 6c 65 6d 73 2c  re are problems,
97e0: 20 6c 65 61 76 65 20 61 6e 20 65 72 72 6f 72 20   leave an error 
97f0: 6d 65 73 73 61 67 65 0a 2a 2a 20 69 6e 20 70 50  message.** in pP
9800: 61 72 73 65 20 61 6e 64 20 72 65 74 75 72 6e 20  arse and return 
9810: 6e 6f 6e 2d 7a 65 72 6f 2e 0a 2a 2f 0a 73 74 61  non-zero..*/.sta
9820: 74 69 63 20 69 6e 74 20 70 72 65 70 53 65 6c 65  tic int prepSele
9830: 63 74 53 74 6d 74 28 50 61 72 73 65 20 2a 70 50  ctStmt(Parse *pP
9840: 61 72 73 65 2c 20 53 65 6c 65 63 74 20 2a 70 29  arse, Select *p)
9850: 7b 0a 20 20 69 6e 74 20 69 2c 20 6a 2c 20 6b 2c  {.  int i, j, k,
9860: 20 72 63 3b 0a 20 20 53 72 63 4c 69 73 74 20 2a   rc;.  SrcList *
9870: 70 54 61 62 4c 69 73 74 3b 0a 20 20 45 78 70 72  pTabList;.  Expr
9880: 4c 69 73 74 20 2a 70 45 4c 69 73 74 3b 0a 20 20  List *pEList;.  
9890: 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69  struct SrcList_i
98a0: 74 65 6d 20 2a 70 46 72 6f 6d 3b 0a 20 20 73 71  tem *pFrom;.  sq
98b0: 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72  lite3 *db = pPar
98c0: 73 65 2d 3e 64 62 3b 0a 0a 20 20 69 66 28 20 70  se->db;..  if( p
98d0: 3d 3d 30 20 7c 7c 20 70 2d 3e 70 53 72 63 3d 3d  ==0 || p->pSrc==
98e0: 30 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46  0 || db->mallocF
98f0: 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 72 65 74  ailed ){.    ret
9900: 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 70 54 61  urn 1;.  }.  pTa
9910: 62 4c 69 73 74 20 3d 20 70 2d 3e 70 53 72 63 3b  bList = p->pSrc;
9920: 0a 20 20 70 45 4c 69 73 74 20 3d 20 70 2d 3e 70  .  pEList = p->p
9930: 45 4c 69 73 74 3b 0a 0a 20 20 2f 2a 20 4d 61 6b  EList;..  /* Mak
9940: 65 20 73 75 72 65 20 63 75 72 73 6f 72 20 6e 75  e sure cursor nu
9950: 6d 62 65 72 73 20 68 61 76 65 20 62 65 65 6e 20  mbers have been 
9960: 61 73 73 69 67 6e 65 64 20 74 6f 20 61 6c 6c 20  assigned to all 
9970: 65 6e 74 72 69 65 73 20 69 6e 0a 20 20 2a 2a 20  entries in.  ** 
9980: 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20  the FROM clause 
9990: 6f 66 20 74 68 65 20 53 45 4c 45 43 54 20 73 74  of the SELECT st
99a0: 61 74 65 6d 65 6e 74 2e 0a 20 20 2a 2f 0a 20 20  atement..  */.  
99b0: 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74 41 73  sqlite3SrcListAs
99c0: 73 69 67 6e 43 75 72 73 6f 72 73 28 70 50 61 72  signCursors(pPar
99d0: 73 65 2c 20 70 2d 3e 70 53 72 63 29 3b 0a 0a 20  se, p->pSrc);.. 
99e0: 20 2f 2a 20 4c 6f 6f 6b 20 75 70 20 65 76 65 72   /* Look up ever
99f0: 79 20 74 61 62 6c 65 20 6e 61 6d 65 64 20 69 6e  y table named in
9a00: 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65   the FROM clause
9a10: 20 6f 66 20 74 68 65 20 73 65 6c 65 63 74 2e 20   of the select. 
9a20: 20 49 66 0a 20 20 2a 2a 20 61 6e 20 65 6e 74 72   If.  ** an entr
9a30: 79 20 6f 66 20 74 68 65 20 46 52 4f 4d 20 63 6c  y of the FROM cl
9a40: 61 75 73 65 20 69 73 20 61 20 73 75 62 71 75 65  ause is a subque
9a50: 72 79 20 69 6e 73 74 65 61 64 20 6f 66 20 61 20  ry instead of a 
9a60: 74 61 62 6c 65 20 6f 72 20 76 69 65 77 2c 0a 20  table or view,. 
9a70: 20 2a 2a 20 74 68 65 6e 20 63 72 65 61 74 65 20   ** then create 
9a80: 61 20 74 72 61 6e 73 69 65 6e 74 20 74 61 62 6c  a transient tabl
9a90: 65 20 73 74 72 75 63 74 75 72 65 20 74 6f 20 64  e structure to d
9aa0: 65 73 63 72 69 62 65 20 74 68 65 20 73 75 62 71  escribe the subq
9ab0: 75 65 72 79 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72  uery..  */.  for
9ac0: 28 69 3d 30 2c 20 70 46 72 6f 6d 3d 70 54 61 62  (i=0, pFrom=pTab
9ad0: 4c 69 73 74 2d 3e 61 3b 20 69 3c 70 54 61 62 4c  List->a; i<pTabL
9ae0: 69 73 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b 2c 20  ist->nSrc; i++, 
9af0: 70 46 72 6f 6d 2b 2b 29 7b 0a 20 20 20 20 54 61  pFrom++){.    Ta
9b00: 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20 20 20 69  ble *pTab;.    i
9b10: 66 28 20 70 46 72 6f 6d 2d 3e 70 54 61 62 21 3d  f( pFrom->pTab!=
9b20: 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68  0 ){.      /* Th
9b30: 69 73 20 73 74 61 74 65 6d 65 6e 74 20 68 61 73  is statement has
9b40: 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 70 72   already been pr
9b50: 65 70 61 72 65 64 2e 20 20 54 68 65 72 65 20 69  epared.  There i
9b60: 73 20 6e 6f 20 6e 65 65 64 0a 20 20 20 20 20 20  s no need.      
9b70: 2a 2a 20 74 6f 20 67 6f 20 66 75 72 74 68 65 72  ** to go further
9b80: 2e 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72  . */.      asser
9b90: 74 28 20 69 3d 3d 30 20 29 3b 0a 20 20 20 20 20  t( i==0 );.     
9ba0: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d   return 0;.    }
9bb0: 0a 20 20 20 20 69 66 28 20 70 46 72 6f 6d 2d 3e  .    if( pFrom->
9bc0: 7a 4e 61 6d 65 3d 3d 30 20 29 7b 0a 23 69 66 6e  zName==0 ){.#ifn
9bd0: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
9be0: 53 55 42 51 55 45 52 59 0a 20 20 20 20 20 20 2f  SUBQUERY.      /
9bf0: 2a 20 41 20 73 75 62 2d 71 75 65 72 79 20 69 6e  * A sub-query in
9c00: 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65   the FROM clause
9c10: 20 6f 66 20 61 20 53 45 4c 45 43 54 20 2a 2f 0a   of a SELECT */.
9c20: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 46        assert( pF
9c30: 72 6f 6d 2d 3e 70 53 65 6c 65 63 74 21 3d 30 20  rom->pSelect!=0 
9c40: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 46 72  );.      if( pFr
9c50: 6f 6d 2d 3e 7a 41 6c 69 61 73 3d 3d 30 20 29 7b  om->zAlias==0 ){
9c60: 0a 20 20 20 20 20 20 20 20 70 46 72 6f 6d 2d 3e  .        pFrom->
9c70: 7a 41 6c 69 61 73 20 3d 0a 20 20 20 20 20 20 20  zAlias =.       
9c80: 20 20 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74     sqlite3MPrint
9c90: 66 28 64 62 2c 20 22 73 71 6c 69 74 65 5f 73 75  f(db, "sqlite_su
9ca0: 62 71 75 65 72 79 5f 25 70 5f 22 2c 20 28 76 6f  bquery_%p_", (vo
9cb0: 69 64 2a 29 70 46 72 6f 6d 2d 3e 70 53 65 6c 65  id*)pFrom->pSele
9cc0: 63 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ct);.      }.   
9cd0: 20 20 20 61 73 73 65 72 74 28 20 70 46 72 6f 6d     assert( pFrom
9ce0: 2d 3e 70 54 61 62 3d 3d 30 20 29 3b 0a 20 20 20  ->pTab==0 );.   
9cf0: 20 20 20 70 46 72 6f 6d 2d 3e 70 54 61 62 20 3d     pFrom->pTab =
9d00: 20 70 54 61 62 20 3d 20 0a 20 20 20 20 20 20 20   pTab = .       
9d10: 20 73 71 6c 69 74 65 33 52 65 73 75 6c 74 53 65   sqlite3ResultSe
9d20: 74 4f 66 53 65 6c 65 63 74 28 70 50 61 72 73 65  tOfSelect(pParse
9d30: 2c 20 70 46 72 6f 6d 2d 3e 7a 41 6c 69 61 73 2c  , pFrom->zAlias,
9d40: 20 70 46 72 6f 6d 2d 3e 70 53 65 6c 65 63 74 29   pFrom->pSelect)
9d50: 3b 0a 20 20 20 20 20 20 69 66 28 20 70 54 61 62  ;.      if( pTab
9d60: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 72  ==0 ){.        r
9d70: 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 20 20 7d  eturn 1;.      }
9d80: 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20 69 73  .      /* The is
9d90: 45 70 68 65 6d 20 66 6c 61 67 20 69 6e 64 69 63  Ephem flag indic
9da0: 61 74 65 73 20 74 68 61 74 20 74 68 65 20 54 61  ates that the Ta
9db0: 62 6c 65 20 73 74 72 75 63 74 75 72 65 20 68 61  ble structure ha
9dc0: 73 20 62 65 65 6e 0a 20 20 20 20 20 20 2a 2a 20  s been.      ** 
9dd0: 64 79 6e 61 6d 69 63 61 6c 6c 79 20 61 6c 6c 6f  dynamically allo
9de0: 63 61 74 65 64 20 61 6e 64 20 6d 61 79 20 62 65  cated and may be
9df0: 20 66 72 65 65 64 20 61 74 20 61 6e 79 20 74 69   freed at any ti
9e00: 6d 65 2e 20 20 49 6e 20 6f 74 68 65 72 20 77 6f  me.  In other wo
9e10: 72 64 73 2c 0a 20 20 20 20 20 20 2a 2a 20 70 54  rds,.      ** pT
9e20: 61 62 20 69 73 20 6e 6f 74 20 70 6f 69 6e 74 69  ab is not pointi
9e30: 6e 67 20 74 6f 20 61 20 70 65 72 73 69 73 74 65  ng to a persiste
9e40: 6e 74 20 74 61 62 6c 65 20 73 74 72 75 63 74 75  nt table structu
9e50: 72 65 20 74 68 61 74 20 64 65 66 69 6e 65 73 0a  re that defines.
9e60: 20 20 20 20 20 20 2a 2a 20 70 61 72 74 20 6f 66        ** part of
9e70: 20 74 68 65 20 73 63 68 65 6d 61 2e 20 2a 2f 0a   the schema. */.
9e80: 20 20 20 20 20 20 70 54 61 62 2d 3e 69 73 45 70        pTab->isEp
9e90: 68 65 6d 20 3d 20 31 3b 0a 23 65 6e 64 69 66 0a  hem = 1;.#endif.
9ea0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
9eb0: 20 2f 2a 20 41 6e 20 6f 72 64 69 6e 61 72 79 20   /* An ordinary 
9ec0: 74 61 62 6c 65 20 6f 72 20 76 69 65 77 20 6e 61  table or view na
9ed0: 6d 65 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63  me in the FROM c
9ee0: 6c 61 75 73 65 20 2a 2f 0a 20 20 20 20 20 20 61  lause */.      a
9ef0: 73 73 65 72 74 28 20 70 46 72 6f 6d 2d 3e 70 54  ssert( pFrom->pT
9f00: 61 62 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 70  ab==0 );.      p
9f10: 46 72 6f 6d 2d 3e 70 54 61 62 20 3d 20 70 54 61  From->pTab = pTa
9f20: 62 20 3d 20 0a 20 20 20 20 20 20 20 20 73 71 6c  b = .        sql
9f30: 69 74 65 33 4c 6f 63 61 74 65 54 61 62 6c 65 28  ite3LocateTable(
9f40: 70 50 61 72 73 65 2c 70 46 72 6f 6d 2d 3e 7a 4e  pParse,pFrom->zN
9f50: 61 6d 65 2c 70 46 72 6f 6d 2d 3e 7a 44 61 74 61  ame,pFrom->zData
9f60: 62 61 73 65 29 3b 0a 20 20 20 20 20 20 69 66 28  base);.      if(
9f70: 20 70 54 61 62 3d 3d 30 20 29 7b 0a 20 20 20 20   pTab==0 ){.    
9f80: 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20      return 1;.  
9f90: 20 20 20 20 7d 0a 20 20 20 20 20 20 70 54 61 62      }.      pTab
9fa0: 2d 3e 6e 52 65 66 2b 2b 3b 0a 23 69 66 20 21 64  ->nRef++;.#if !d
9fb0: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
9fc0: 49 54 5f 56 49 45 57 29 20 7c 7c 20 21 64 65 66  IT_VIEW) || !def
9fd0: 69 6e 65 64 20 28 53 51 4c 49 54 45 5f 4f 4d 49  ined (SQLITE_OMI
9fe0: 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 29 0a  T_VIRTUALTABLE).
9ff0: 20 20 20 20 20 20 69 66 28 20 70 54 61 62 2d 3e        if( pTab->
a000: 70 53 65 6c 65 63 74 20 7c 7c 20 49 73 56 69 72  pSelect || IsVir
a010: 74 75 61 6c 28 70 54 61 62 29 20 29 7b 0a 20 20  tual(pTab) ){.  
a020: 20 20 20 20 20 20 2f 2a 20 57 65 20 72 65 61 63        /* We reac
a030: 68 20 68 65 72 65 20 69 66 20 74 68 65 20 6e 61  h here if the na
a040: 6d 65 64 20 74 61 62 6c 65 20 69 73 20 61 20 72  med table is a r
a050: 65 61 6c 6c 79 20 61 20 76 69 65 77 20 2a 2f 0a  eally a view */.
a060: 20 20 20 20 20 20 20 20 69 66 28 20 73 71 6c 69          if( sqli
a070: 74 65 33 56 69 65 77 47 65 74 43 6f 6c 75 6d 6e  te3ViewGetColumn
a080: 4e 61 6d 65 73 28 70 50 61 72 73 65 2c 20 70 54  Names(pParse, pT
a090: 61 62 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ab) ){.         
a0a0: 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 20   return 1;.     
a0b0: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 2f 2a 20     }.        /* 
a0c0: 49 66 20 70 46 72 6f 6d 2d 3e 70 53 65 6c 65 63  If pFrom->pSelec
a0d0: 74 21 3d 30 20 69 74 20 6d 65 61 6e 73 20 77 65  t!=0 it means we
a0e0: 20 61 72 65 20 64 65 61 6c 69 6e 67 20 77 69 74   are dealing wit
a0f0: 68 20 61 0a 20 20 20 20 20 20 20 20 2a 2a 20 76  h a.        ** v
a100: 69 65 77 20 77 69 74 68 69 6e 20 61 20 76 69 65  iew within a vie
a110: 77 2e 20 20 54 68 65 20 53 45 4c 45 43 54 20 73  w.  The SELECT s
a120: 74 72 75 63 74 75 72 65 20 68 61 73 20 61 6c 72  tructure has alr
a130: 65 61 64 79 20 62 65 65 6e 0a 20 20 20 20 20 20  eady been.      
a140: 20 20 2a 2a 20 63 6f 70 69 65 64 20 62 79 20 74    ** copied by t
a150: 68 65 20 6f 75 74 65 72 20 76 69 65 77 20 73 6f  he outer view so
a160: 20 77 65 20 63 61 6e 20 73 6b 69 70 20 74 68 65   we can skip the
a170: 20 63 6f 70 79 20 73 74 65 70 20 68 65 72 65 0a   copy step here.
a180: 20 20 20 20 20 20 20 20 2a 2a 20 69 6e 20 74 68          ** in th
a190: 65 20 69 6e 6e 65 72 20 76 69 65 77 2e 0a 20 20  e inner view..  
a1a0: 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
a1b0: 20 69 66 28 20 70 46 72 6f 6d 2d 3e 70 53 65 6c   if( pFrom->pSel
a1c0: 65 63 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ect==0 ){.      
a1d0: 20 20 20 20 70 46 72 6f 6d 2d 3e 70 53 65 6c 65      pFrom->pSele
a1e0: 63 74 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65  ct = sqlite3Sele
a1f0: 63 74 44 75 70 28 64 62 2c 20 70 54 61 62 2d 3e  ctDup(db, pTab->
a200: 70 53 65 6c 65 63 74 29 3b 0a 20 20 20 20 20 20  pSelect);.      
a210: 20 20 7d 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64    }.      }.#end
a220: 69 66 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  if.    }.  }..  
a230: 2f 2a 20 50 72 6f 63 65 73 73 20 4e 41 54 55 52  /* Process NATUR
a240: 41 4c 20 6b 65 79 77 6f 72 64 73 2c 20 61 6e 64  AL keywords, and
a250: 20 4f 4e 20 61 6e 64 20 55 53 49 4e 47 20 63 6c   ON and USING cl
a260: 61 75 73 65 73 20 6f 66 20 6a 6f 69 6e 73 2e 0a  auses of joins..
a270: 20 20 2a 2f 0a 20 20 69 66 28 20 73 71 6c 69 74    */.  if( sqlit
a280: 65 50 72 6f 63 65 73 73 4a 6f 69 6e 28 70 50 61  eProcessJoin(pPa
a290: 72 73 65 2c 20 70 29 20 29 20 72 65 74 75 72 6e  rse, p) ) return
a2a0: 20 31 3b 0a 0a 20 20 2f 2a 20 46 6f 72 20 65 76   1;..  /* For ev
a2b0: 65 72 79 20 22 2a 22 20 74 68 61 74 20 6f 63 63  ery "*" that occ
a2c0: 75 72 73 20 69 6e 20 74 68 65 20 63 6f 6c 75 6d  urs in the colum
a2d0: 6e 20 6c 69 73 74 2c 20 69 6e 73 65 72 74 20 74  n list, insert t
a2e0: 68 65 20 6e 61 6d 65 73 20 6f 66 0a 20 20 2a 2a  he names of.  **
a2f0: 20 61 6c 6c 20 63 6f 6c 75 6d 6e 73 20 69 6e 20   all columns in 
a300: 61 6c 6c 20 74 61 62 6c 65 73 2e 20 20 41 6e 64  all tables.  And
a310: 20 66 6f 72 20 65 76 65 72 79 20 54 41 42 4c 45   for every TABLE
a320: 2e 2a 20 69 6e 73 65 72 74 20 74 68 65 20 6e 61  .* insert the na
a330: 6d 65 73 0a 20 20 2a 2a 20 6f 66 20 61 6c 6c 20  mes.  ** of all 
a340: 63 6f 6c 75 6d 6e 73 20 69 6e 20 54 41 42 4c 45  columns in TABLE
a350: 2e 20 20 54 68 65 20 70 61 72 73 65 72 20 69 6e  .  The parser in
a360: 73 65 72 74 65 64 20 61 20 73 70 65 63 69 61 6c  serted a special
a370: 20 65 78 70 72 65 73 73 69 6f 6e 0a 20 20 2a 2a   expression.  **
a380: 20 77 69 74 68 20 74 68 65 20 54 4b 5f 41 4c 4c   with the TK_ALL
a390: 20 6f 70 65 72 61 74 6f 72 20 66 6f 72 20 65 61   operator for ea
a3a0: 63 68 20 22 2a 22 20 74 68 61 74 20 69 74 20 66  ch "*" that it f
a3b0: 6f 75 6e 64 20 69 6e 20 74 68 65 20 63 6f 6c 75  ound in the colu
a3c0: 6d 6e 20 6c 69 73 74 2e 0a 20 20 2a 2a 20 54 68  mn list..  ** Th
a3d0: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 6f 64 65  e following code
a3e0: 20 6a 75 73 74 20 68 61 73 20 74 6f 20 6c 6f 63   just has to loc
a3f0: 61 74 65 20 74 68 65 20 54 4b 5f 41 4c 4c 20 65  ate the TK_ALL e
a400: 78 70 72 65 73 73 69 6f 6e 73 20 61 6e 64 20 65  xpressions and e
a410: 78 70 61 6e 64 0a 20 20 2a 2a 20 65 61 63 68 20  xpand.  ** each 
a420: 6f 6e 65 20 74 6f 20 74 68 65 20 6c 69 73 74 20  one to the list 
a430: 6f 66 20 61 6c 6c 20 63 6f 6c 75 6d 6e 73 20 69  of all columns i
a440: 6e 20 61 6c 6c 20 74 61 62 6c 65 73 2e 0a 20 20  n all tables..  
a450: 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 66 69 72 73  **.  ** The firs
a460: 74 20 6c 6f 6f 70 20 6a 75 73 74 20 63 68 65 63  t loop just chec
a470: 6b 73 20 74 6f 20 73 65 65 20 69 66 20 74 68 65  ks to see if the
a480: 72 65 20 61 72 65 20 61 6e 79 20 22 2a 22 20 6f  re are any "*" o
a490: 70 65 72 61 74 6f 72 73 0a 20 20 2a 2a 20 74 68  perators.  ** th
a4a0: 61 74 20 6e 65 65 64 20 65 78 70 61 6e 64 69 6e  at need expandin
a4b0: 67 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 6b 3d  g..  */.  for(k=
a4c0: 30 3b 20 6b 3c 70 45 4c 69 73 74 2d 3e 6e 45 78  0; k<pEList->nEx
a4d0: 70 72 3b 20 6b 2b 2b 29 7b 0a 20 20 20 20 45 78  pr; k++){.    Ex
a4e0: 70 72 20 2a 70 45 20 3d 20 70 45 4c 69 73 74 2d  pr *pE = pEList-
a4f0: 3e 61 5b 6b 5d 2e 70 45 78 70 72 3b 0a 20 20 20  >a[k].pExpr;.   
a500: 20 69 66 28 20 70 45 2d 3e 6f 70 3d 3d 54 4b 5f   if( pE->op==TK_
a510: 41 4c 4c 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  ALL ) break;.   
a520: 20 69 66 28 20 70 45 2d 3e 6f 70 3d 3d 54 4b 5f   if( pE->op==TK_
a530: 44 4f 54 20 26 26 20 70 45 2d 3e 70 52 69 67 68  DOT && pE->pRigh
a540: 74 20 26 26 20 70 45 2d 3e 70 52 69 67 68 74 2d  t && pE->pRight-
a550: 3e 6f 70 3d 3d 54 4b 5f 41 4c 4c 0a 20 20 20 20  >op==TK_ALL.    
a560: 20 20 20 20 20 26 26 20 70 45 2d 3e 70 4c 65 66       && pE->pLef
a570: 74 20 26 26 20 70 45 2d 3e 70 4c 65 66 74 2d 3e  t && pE->pLeft->
a580: 6f 70 3d 3d 54 4b 5f 49 44 20 29 20 62 72 65 61  op==TK_ID ) brea
a590: 6b 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 30 3b  k;.  }.  rc = 0;
a5a0: 0a 20 20 69 66 28 20 6b 3c 70 45 4c 69 73 74 2d  .  if( k<pEList-
a5b0: 3e 6e 45 78 70 72 20 29 7b 0a 20 20 20 20 2f 2a  >nExpr ){.    /*
a5c0: 0a 20 20 20 20 2a 2a 20 49 66 20 77 65 20 67 65  .    ** If we ge
a5d0: 74 20 68 65 72 65 20 69 74 20 6d 65 61 6e 73 20  t here it means 
a5e0: 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 20 63  the result set c
a5f0: 6f 6e 74 61 69 6e 73 20 6f 6e 65 20 6f 72 20 6d  ontains one or m
a600: 6f 72 65 20 22 2a 22 0a 20 20 20 20 2a 2a 20 6f  ore "*".    ** o
a610: 70 65 72 61 74 6f 72 73 20 74 68 61 74 20 6e 65  perators that ne
a620: 65 64 20 74 6f 20 62 65 20 65 78 70 61 6e 64 65  ed to be expande
a630: 64 2e 20 20 4c 6f 6f 70 20 74 68 72 6f 75 67 68  d.  Loop through
a640: 20 65 61 63 68 20 65 78 70 72 65 73 73 69 6f 6e   each expression
a650: 0a 20 20 20 20 2a 2a 20 69 6e 20 74 68 65 20 72  .    ** in the r
a660: 65 73 75 6c 74 20 73 65 74 20 61 6e 64 20 65 78  esult set and ex
a670: 70 61 6e 64 20 74 68 65 6d 20 6f 6e 65 20 62 79  pand them one by
a680: 20 6f 6e 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20   one..    */.   
a690: 20 73 74 72 75 63 74 20 45 78 70 72 4c 69 73 74   struct ExprList
a6a0: 5f 69 74 65 6d 20 2a 61 20 3d 20 70 45 4c 69 73  _item *a = pELis
a6b0: 74 2d 3e 61 3b 0a 20 20 20 20 45 78 70 72 4c 69  t->a;.    ExprLi
a6c0: 73 74 20 2a 70 4e 65 77 20 3d 20 30 3b 0a 20 20  st *pNew = 0;.  
a6d0: 20 20 69 6e 74 20 66 6c 61 67 73 20 3d 20 70 50    int flags = pP
a6e0: 61 72 73 65 2d 3e 64 62 2d 3e 66 6c 61 67 73 3b  arse->db->flags;
a6f0: 0a 20 20 20 20 69 6e 74 20 6c 6f 6e 67 4e 61 6d  .    int longNam
a700: 65 73 20 3d 20 28 66 6c 61 67 73 20 26 20 53 51  es = (flags & SQ
a710: 4c 49 54 45 5f 46 75 6c 6c 43 6f 6c 4e 61 6d 65  LITE_FullColName
a720: 73 29 21 3d 30 20 26 26 0a 20 20 20 20 20 20 20  s)!=0 &&.       
a730: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28                 (
a740: 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 53  flags & SQLITE_S
a750: 68 6f 72 74 43 6f 6c 4e 61 6d 65 73 29 3d 3d 30  hortColNames)==0
a760: 3b 0a 0a 20 20 20 20 66 6f 72 28 6b 3d 30 3b 20  ;..    for(k=0; 
a770: 6b 3c 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b  k<pEList->nExpr;
a780: 20 6b 2b 2b 29 7b 0a 20 20 20 20 20 20 45 78 70   k++){.      Exp
a790: 72 20 2a 70 45 20 3d 20 61 5b 6b 5d 2e 70 45 78  r *pE = a[k].pEx
a7a0: 70 72 3b 0a 20 20 20 20 20 20 69 66 28 20 70 45  pr;.      if( pE
a7b0: 2d 3e 6f 70 21 3d 54 4b 5f 41 4c 4c 20 26 26 0a  ->op!=TK_ALL &&.
a7c0: 20 20 20 20 20 20 20 20 20 20 20 28 70 45 2d 3e             (pE->
a7d0: 6f 70 21 3d 54 4b 5f 44 4f 54 20 7c 7c 20 70 45  op!=TK_DOT || pE
a7e0: 2d 3e 70 52 69 67 68 74 3d 3d 30 20 7c 7c 20 70  ->pRight==0 || p
a7f0: 45 2d 3e 70 52 69 67 68 74 2d 3e 6f 70 21 3d 54  E->pRight->op!=T
a800: 4b 5f 41 4c 4c 29 20 29 7b 0a 20 20 20 20 20 20  K_ALL) ){.      
a810: 20 20 2f 2a 20 54 68 69 73 20 70 61 72 74 69 63    /* This partic
a820: 75 6c 61 72 20 65 78 70 72 65 73 73 69 6f 6e 20  ular expression 
a830: 64 6f 65 73 20 6e 6f 74 20 6e 65 65 64 20 74 6f  does not need to
a840: 20 62 65 20 65 78 70 61 6e 64 65 64 2e 0a 20 20   be expanded..  
a850: 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
a860: 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 45   pNew = sqlite3E
a870: 78 70 72 4c 69 73 74 41 70 70 65 6e 64 28 70 50  xprListAppend(pP
a880: 61 72 73 65 2c 20 70 4e 65 77 2c 20 61 5b 6b 5d  arse, pNew, a[k]
a890: 2e 70 45 78 70 72 2c 20 30 29 3b 0a 20 20 20 20  .pExpr, 0);.    
a8a0: 20 20 20 20 69 66 28 20 70 4e 65 77 20 29 7b 0a      if( pNew ){.
a8b0: 20 20 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e            pNew->
a8c0: 61 5b 70 4e 65 77 2d 3e 6e 45 78 70 72 2d 31 5d  a[pNew->nExpr-1]
a8d0: 2e 7a 4e 61 6d 65 20 3d 20 61 5b 6b 5d 2e 7a 4e  .zName = a[k].zN
a8e0: 61 6d 65 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  ame;.        }el
a8f0: 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63  se{.          rc
a900: 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 7d 0a   = 1;.        }.
a910: 20 20 20 20 20 20 20 20 61 5b 6b 5d 2e 70 45 78          a[k].pEx
a920: 70 72 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  pr = 0;.        
a930: 61 5b 6b 5d 2e 7a 4e 61 6d 65 20 3d 20 30 3b 0a  a[k].zName = 0;.
a940: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
a950: 20 20 20 20 20 2f 2a 20 54 68 69 73 20 65 78 70       /* This exp
a960: 72 65 73 73 69 6f 6e 20 69 73 20 61 20 22 2a 22  ression is a "*"
a970: 20 6f 72 20 61 20 22 54 41 42 4c 45 2e 2a 22 20   or a "TABLE.*" 
a980: 61 6e 64 20 6e 65 65 64 73 20 74 6f 20 62 65 0a  and needs to be.
a990: 20 20 20 20 20 20 20 20 2a 2a 20 65 78 70 61 6e          ** expan
a9a0: 64 65 64 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20  ded. */.        
a9b0: 69 6e 74 20 74 61 62 6c 65 53 65 65 6e 20 3d 20  int tableSeen = 
a9c0: 30 3b 20 20 20 20 20 20 2f 2a 20 53 65 74 20 74  0;      /* Set t
a9d0: 6f 20 31 20 77 68 65 6e 20 54 41 42 4c 45 20 6d  o 1 when TABLE m
a9e0: 61 74 63 68 65 73 20 2a 2f 0a 20 20 20 20 20 20  atches */.      
a9f0: 20 20 63 68 61 72 20 2a 7a 54 4e 61 6d 65 3b 20    char *zTName; 
aa00: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 74 65             /* te
aa10: 78 74 20 6f 66 20 6e 61 6d 65 20 6f 66 20 54 41  xt of name of TA
aa20: 42 4c 45 20 2a 2f 0a 20 20 20 20 20 20 20 20 69  BLE */.        i
aa30: 66 28 20 70 45 2d 3e 6f 70 3d 3d 54 4b 5f 44 4f  f( pE->op==TK_DO
aa40: 54 20 26 26 20 70 45 2d 3e 70 4c 65 66 74 20 29  T && pE->pLeft )
aa50: 7b 0a 20 20 20 20 20 20 20 20 20 20 7a 54 4e 61  {.          zTNa
aa60: 6d 65 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65  me = sqlite3Name
aa70: 46 72 6f 6d 54 6f 6b 65 6e 28 64 62 2c 20 26 70  FromToken(db, &p
aa80: 45 2d 3e 70 4c 65 66 74 2d 3e 74 6f 6b 65 6e 29  E->pLeft->token)
aa90: 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  ;.        }else{
aaa0: 0a 20 20 20 20 20 20 20 20 20 20 7a 54 4e 61 6d  .          zTNam
aab0: 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7d  e = 0;.        }
aac0: 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30  .        for(i=0
aad0: 2c 20 70 46 72 6f 6d 3d 70 54 61 62 4c 69 73 74  , pFrom=pTabList
aae0: 2d 3e 61 3b 20 69 3c 70 54 61 62 4c 69 73 74 2d  ->a; i<pTabList-
aaf0: 3e 6e 53 72 63 3b 20 69 2b 2b 2c 20 70 46 72 6f  >nSrc; i++, pFro
ab00: 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20  m++){.          
ab10: 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 70 46  Table *pTab = pF
ab20: 72 6f 6d 2d 3e 70 54 61 62 3b 0a 20 20 20 20 20  rom->pTab;.     
ab30: 20 20 20 20 20 63 68 61 72 20 2a 7a 54 61 62 4e       char *zTabN
ab40: 61 6d 65 20 3d 20 70 46 72 6f 6d 2d 3e 7a 41 6c  ame = pFrom->zAl
ab50: 69 61 73 3b 0a 20 20 20 20 20 20 20 20 20 20 69  ias;.          i
ab60: 66 28 20 7a 54 61 62 4e 61 6d 65 3d 3d 30 20 7c  f( zTabName==0 |
ab70: 7c 20 7a 54 61 62 4e 61 6d 65 5b 30 5d 3d 3d 30  | zTabName[0]==0
ab80: 20 29 7b 20 0a 20 20 20 20 20 20 20 20 20 20 20   ){ .           
ab90: 20 7a 54 61 62 4e 61 6d 65 20 3d 20 70 54 61 62   zTabName = pTab
aba0: 2d 3e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20 20  ->zName;.       
abb0: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 69     }.          i
abc0: 66 28 20 7a 54 4e 61 6d 65 20 26 26 20 28 7a 54  f( zTName && (zT
abd0: 61 62 4e 61 6d 65 3d 3d 30 20 7c 7c 20 7a 54 61  abName==0 || zTa
abe0: 62 4e 61 6d 65 5b 30 5d 3d 3d 30 20 7c 7c 20 0a  bName[0]==0 || .
abf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ac00: 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28   sqlite3StrICmp(
ac10: 7a 54 4e 61 6d 65 2c 20 7a 54 61 62 4e 61 6d 65  zTName, zTabName
ac20: 29 21 3d 30 29 20 29 7b 0a 20 20 20 20 20 20 20  )!=0) ){.       
ac30: 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20       continue;. 
ac40: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
ac50: 20 20 20 20 20 74 61 62 6c 65 53 65 65 6e 20 3d       tableSeen =
ac60: 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20 66 6f   1;.          fo
ac70: 72 28 6a 3d 30 3b 20 6a 3c 70 54 61 62 2d 3e 6e  r(j=0; j<pTab->n
ac80: 43 6f 6c 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20  Col; j++){.     
ac90: 20 20 20 20 20 20 20 45 78 70 72 20 2a 70 45 78         Expr *pEx
aca0: 70 72 2c 20 2a 70 52 69 67 68 74 3b 0a 20 20 20  pr, *pRight;.   
acb0: 20 20 20 20 20 20 20 20 20 63 68 61 72 20 2a 7a           char *z
acc0: 4e 61 6d 65 20 3d 20 70 54 61 62 2d 3e 61 43 6f  Name = pTab->aCo
acd0: 6c 5b 6a 5d 2e 7a 4e 61 6d 65 3b 0a 0a 20 20 20  l[j].zName;..   
ace0: 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 61           /* If a
acf0: 20 63 6f 6c 75 6d 6e 20 69 73 20 6d 61 72 6b 65   column is marke
ad00: 64 20 61 73 20 27 68 69 64 64 65 6e 27 20 28 63  d as 'hidden' (c
ad10: 75 72 72 65 6e 74 6c 79 20 6f 6e 6c 79 20 70 6f  urrently only po
ad20: 73 73 69 62 6c 65 0a 20 20 20 20 20 20 20 20 20  ssible.         
ad30: 20 20 20 2a 2a 20 66 6f 72 20 76 69 72 74 75 61     ** for virtua
ad40: 6c 20 74 61 62 6c 65 73 29 2c 20 64 6f 20 6e 6f  l tables), do no
ad50: 74 20 69 6e 63 6c 75 64 65 20 69 74 20 69 6e 20  t include it in 
ad60: 74 68 65 20 65 78 70 61 6e 64 65 64 0a 20 20 20  the expanded.   
ad70: 20 20 20 20 20 20 20 20 20 2a 2a 20 72 65 73 75           ** resu
ad80: 6c 74 2d 73 65 74 20 6c 69 73 74 2e 0a 20 20 20  lt-set list..   
ad90: 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20           */.    
ada0: 20 20 20 20 20 20 20 20 69 66 28 20 49 73 48 69          if( IsHi
adb0: 64 64 65 6e 43 6f 6c 75 6d 6e 28 26 70 54 61 62  ddenColumn(&pTab
adc0: 2d 3e 61 43 6f 6c 5b 6a 5d 29 20 29 7b 0a 20 20  ->aCol[j]) ){.  
add0: 20 20 20 20 20 20 20 20 20 20 20 20 61 73 73 65              asse
ade0: 72 74 28 49 73 56 69 72 74 75 61 6c 28 70 54 61  rt(IsVirtual(pTa
adf0: 62 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  b));.           
ae00: 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20     continue;.   
ae10: 20 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20           }..    
ae20: 20 20 20 20 20 20 20 20 69 66 28 20 69 3e 30 20          if( i>0 
ae30: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
ae40: 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f   struct SrcList_
ae50: 69 74 65 6d 20 2a 70 4c 65 66 74 20 3d 20 26 70  item *pLeft = &p
ae60: 54 61 62 4c 69 73 74 2d 3e 61 5b 69 2d 31 5d 3b  TabList->a[i-1];
ae70: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69  .              i
ae80: 66 28 20 28 70 4c 65 66 74 5b 31 5d 2e 6a 6f 69  f( (pLeft[1].joi
ae90: 6e 74 79 70 65 20 26 20 4a 54 5f 4e 41 54 55 52  ntype & JT_NATUR
aea0: 41 4c 29 21 3d 30 20 26 26 0a 20 20 20 20 20 20  AL)!=0 &&.      
aeb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
aec0: 20 20 63 6f 6c 75 6d 6e 49 6e 64 65 78 28 70 4c    columnIndex(pL
aed0: 65 66 74 2d 3e 70 54 61 62 2c 20 7a 4e 61 6d 65  eft->pTab, zName
aee0: 29 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )>=0 ){.        
aef0: 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 20 61 20          /* In a 
af00: 4e 41 54 55 52 41 4c 20 6a 6f 69 6e 2c 20 6f 6d  NATURAL join, om
af10: 69 74 20 74 68 65 20 6a 6f 69 6e 20 63 6f 6c 75  it the join colu
af20: 6d 6e 73 20 66 72 6f 6d 20 74 68 65 20 0a 20 20  mns from the .  
af30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a                **
af40: 20 74 61 62 6c 65 20 6f 6e 20 74 68 65 20 72 69   table on the ri
af50: 67 68 74 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  ght */.         
af60: 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b         continue;
af70: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d  .              }
af80: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69  .              i
af90: 66 28 20 73 71 6c 69 74 65 33 49 64 4c 69 73 74  f( sqlite3IdList
afa0: 49 6e 64 65 78 28 70 4c 65 66 74 5b 31 5d 2e 70  Index(pLeft[1].p
afb0: 55 73 69 6e 67 2c 20 7a 4e 61 6d 65 29 3e 3d 30  Using, zName)>=0
afc0: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
afd0: 20 20 20 20 2f 2a 20 49 6e 20 61 20 6a 6f 69 6e      /* In a join
afe0: 20 77 69 74 68 20 61 20 55 53 49 4e 47 20 63 6c   with a USING cl
aff0: 61 75 73 65 2c 20 6f 6d 69 74 20 63 6f 6c 75 6d  ause, omit colum
b000: 6e 73 20 69 6e 20 74 68 65 0a 20 20 20 20 20 20  ns in the.      
b010: 20 20 20 20 20 20 20 20 20 20 2a 2a 20 75 73 69            ** usi
b020: 6e 67 20 63 6c 61 75 73 65 20 66 72 6f 6d 20 74  ng clause from t
b030: 68 65 20 74 61 62 6c 65 20 6f 6e 20 74 68 65 20  he table on the 
b040: 72 69 67 68 74 2e 20 2a 2f 0a 20 20 20 20 20 20  right. */.      
b050: 20 20 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e            contin
b060: 75 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ue;.            
b070: 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20    }.            
b080: 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 52  }.            pR
b090: 69 67 68 74 20 3d 20 73 71 6c 69 74 65 33 50 45  ight = sqlite3PE
b0a0: 78 70 72 28 70 50 61 72 73 65 2c 20 54 4b 5f 49  xpr(pParse, TK_I
b0b0: 44 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20  D, 0, 0, 0);.   
b0c0: 20 20 20 20 20 20 20 20 20 69 66 28 20 70 52 69           if( pRi
b0d0: 67 68 74 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a  ght==0 ) break;.
b0e0: 20 20 20 20 20 20 20 20 20 20 20 20 73 65 74 51              setQ
b0f0: 75 6f 74 65 64 54 6f 6b 65 6e 28 70 50 61 72 73  uotedToken(pPars
b100: 65 2c 20 26 70 52 69 67 68 74 2d 3e 74 6f 6b 65  e, &pRight->toke
b110: 6e 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20  n, zName);.     
b120: 20 20 20 20 20 20 20 69 66 28 20 7a 54 61 62 4e         if( zTabN
b130: 61 6d 65 20 26 26 20 28 6c 6f 6e 67 4e 61 6d 65  ame && (longName
b140: 73 20 7c 7c 20 70 54 61 62 4c 69 73 74 2d 3e 6e  s || pTabList->n
b150: 53 72 63 3e 31 29 20 29 7b 0a 20 20 20 20 20 20  Src>1) ){.      
b160: 20 20 20 20 20 20 20 20 45 78 70 72 20 2a 70 4c          Expr *pL
b170: 65 66 74 20 3d 20 73 71 6c 69 74 65 33 50 45 78  eft = sqlite3PEx
b180: 70 72 28 70 50 61 72 73 65 2c 20 54 4b 5f 49 44  pr(pParse, TK_ID
b190: 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  , 0, 0, 0);.    
b1a0: 20 20 20 20 20 20 20 20 20 20 70 45 78 70 72 20            pExpr 
b1b0: 3d 20 73 71 6c 69 74 65 33 50 45 78 70 72 28 70  = sqlite3PExpr(p
b1c0: 50 61 72 73 65 2c 20 54 4b 5f 44 4f 54 2c 20 70  Parse, TK_DOT, p
b1d0: 4c 65 66 74 2c 20 70 52 69 67 68 74 2c 20 30 29  Left, pRight, 0)
b1e0: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
b1f0: 69 66 28 20 70 45 78 70 72 3d 3d 30 20 29 20 62  if( pExpr==0 ) b
b200: 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20  reak;.          
b210: 20 20 20 20 73 65 74 51 75 6f 74 65 64 54 6f 6b      setQuotedTok
b220: 65 6e 28 70 50 61 72 73 65 2c 20 26 70 4c 65 66  en(pParse, &pLef
b230: 74 2d 3e 74 6f 6b 65 6e 2c 20 7a 54 61 62 4e 61  t->token, zTabNa
b240: 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  me);.           
b250: 20 20 20 73 65 74 54 6f 6b 65 6e 28 26 70 45 78     setToken(&pEx
b260: 70 72 2d 3e 73 70 61 6e 2c 20 0a 20 20 20 20 20  pr->span, .     
b270: 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c               sql
b280: 69 74 65 33 4d 50 72 69 6e 74 66 28 64 62 2c 20  ite3MPrintf(db, 
b290: 22 25 73 2e 25 73 22 2c 20 7a 54 61 62 4e 61 6d  "%s.%s", zTabNam
b2a0: 65 2c 20 7a 4e 61 6d 65 29 29 3b 0a 20 20 20 20  e, zName));.    
b2b0: 20 20 20 20 20 20 20 20 20 20 70 45 78 70 72 2d            pExpr-
b2c0: 3e 73 70 61 6e 2e 64 79 6e 20 3d 20 31 3b 0a 20  >span.dyn = 1;. 
b2d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 70 45 78               pEx
b2e0: 70 72 2d 3e 74 6f 6b 65 6e 2e 7a 20 3d 20 30 3b  pr->token.z = 0;
b2f0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70  .              p
b300: 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 6e 20 3d 20  Expr->token.n = 
b310: 30 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  0;.             
b320: 20 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 64 79   pExpr->token.dy
b330: 6e 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20  n = 0;.         
b340: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
b350: 20 20 20 20 20 20 20 20 70 45 78 70 72 20 3d 20          pExpr = 
b360: 70 52 69 67 68 74 3b 0a 20 20 20 20 20 20 20 20  pRight;.        
b370: 20 20 20 20 20 20 70 45 78 70 72 2d 3e 73 70 61        pExpr->spa
b380: 6e 20 3d 20 70 45 78 70 72 2d 3e 74 6f 6b 65 6e  n = pExpr->token
b390: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
b3a0: 70 45 78 70 72 2d 3e 73 70 61 6e 2e 64 79 6e 20  pExpr->span.dyn 
b3b0: 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 20  = 0;.           
b3c0: 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 69   }.            i
b3d0: 66 28 20 6c 6f 6e 67 4e 61 6d 65 73 20 29 7b 0a  f( longNames ){.
b3e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 4e                pN
b3f0: 65 77 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  ew = sqlite3Expr
b400: 4c 69 73 74 41 70 70 65 6e 64 28 70 50 61 72 73  ListAppend(pPars
b410: 65 2c 20 70 4e 65 77 2c 20 70 45 78 70 72 2c 20  e, pNew, pExpr, 
b420: 26 70 45 78 70 72 2d 3e 73 70 61 6e 29 3b 0a 20  &pExpr->span);. 
b430: 20 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65             }else
b440: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
b450: 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 45 78  pNew = sqlite3Ex
b460: 70 72 4c 69 73 74 41 70 70 65 6e 64 28 70 50 61  prListAppend(pPa
b470: 72 73 65 2c 20 70 4e 65 77 2c 20 70 45 78 70 72  rse, pNew, pExpr
b480: 2c 20 26 70 52 69 67 68 74 2d 3e 74 6f 6b 65 6e  , &pRight->token
b490: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  );.            }
b4a0: 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
b4b0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69       }.        i
b4c0: 66 28 20 21 74 61 62 6c 65 53 65 65 6e 20 29 7b  f( !tableSeen ){
b4d0: 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 7a  .          if( z
b4e0: 54 4e 61 6d 65 20 29 7b 0a 20 20 20 20 20 20 20  TName ){.       
b4f0: 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f       sqlite3Erro
b500: 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 6e 6f  rMsg(pParse, "no
b510: 20 73 75 63 68 20 74 61 62 6c 65 3a 20 25 73 22   such table: %s"
b520: 2c 20 7a 54 4e 61 6d 65 29 3b 0a 20 20 20 20 20  , zTName);.     
b530: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
b540: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
b550: 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
b560: 22 6e 6f 20 74 61 62 6c 65 73 20 73 70 65 63 69  "no tables speci
b570: 66 69 65 64 22 29 3b 0a 20 20 20 20 20 20 20 20  fied");.        
b580: 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 72 63    }.          rc
b590: 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 7d 0a   = 1;.        }.
b5a0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
b5b0: 66 72 65 65 28 7a 54 4e 61 6d 65 29 3b 0a 20 20  free(zTName);.  
b5c0: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
b5d0: 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44  sqlite3ExprListD
b5e0: 65 6c 65 74 65 28 70 45 4c 69 73 74 29 3b 0a 20  elete(pEList);. 
b5f0: 20 20 20 70 2d 3e 70 45 4c 69 73 74 20 3d 20 70     p->pEList = p
b600: 4e 65 77 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  New;.  }.  if( p
b610: 2d 3e 70 45 4c 69 73 74 20 26 26 20 70 2d 3e 70  ->pEList && p->p
b620: 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3e 53 51 4c  EList->nExpr>SQL
b630: 49 54 45 5f 4d 41 58 5f 43 4f 4c 55 4d 4e 20 29  ITE_MAX_COLUMN )
b640: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72  {.    sqlite3Err
b650: 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 74  orMsg(pParse, "t
b660: 6f 6f 20 6d 61 6e 79 20 63 6f 6c 75 6d 6e 73 20  oo many columns 
b670: 69 6e 20 72 65 73 75 6c 74 20 73 65 74 22 29 3b  in result set");
b680: 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45  .    rc = SQLITE
b690: 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66  _ERROR;.  }.  if
b6a0: 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ( db->mallocFail
b6b0: 65 64 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53  ed ){.    rc = S
b6c0: 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d  QLITE_NOMEM;.  }
b6d0: 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
b6e0: 0a 2f 2a 0a 2a 2a 20 70 45 20 69 73 20 61 20 70  ./*.** pE is a p
b6f0: 6f 69 6e 74 65 72 20 74 6f 20 61 6e 20 65 78 70  ointer to an exp
b700: 72 65 73 73 69 6f 6e 20 77 68 69 63 68 20 69 73  ression which is
b710: 20 61 20 73 69 6e 67 6c 65 20 74 65 72 6d 20 69   a single term i
b720: 6e 0a 2a 2a 20 4f 52 44 45 52 20 42 59 20 6f 72  n.** ORDER BY or
b730: 20 47 52 4f 55 50 20 42 59 20 63 6c 61 75 73 65   GROUP BY clause
b740: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 45 20 65 76  ..**.** If pE ev
b750: 61 6c 75 61 74 65 73 20 74 6f 20 61 6e 20 69 6e  aluates to an in
b760: 74 65 67 65 72 20 63 6f 6e 73 74 61 6e 74 20 69  teger constant i
b770: 2c 20 74 68 65 6e 20 72 65 74 75 72 6e 20 69 2e  , then return i.
b780: 0a 2a 2a 20 54 68 69 73 20 69 73 20 61 6e 20 69  .** This is an i
b790: 6e 64 69 63 61 74 69 6f 6e 20 74 6f 20 74 68 65  ndication to the
b7a0: 20 63 61 6c 6c 65 72 20 74 68 61 74 20 69 74 20   caller that it 
b7b0: 73 68 6f 75 6c 64 20 73 6f 72 74 0a 2a 2a 20 62  should sort.** b
b7c0: 79 20 74 68 65 20 69 2d 74 68 20 63 6f 6c 75 6d  y the i-th colum
b7d0: 6e 20 6f 66 20 74 68 65 20 72 65 73 75 6c 74 20  n of the result 
b7e0: 73 65 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 45  set..**.** If pE
b7f0: 20 69 73 20 61 20 77 65 6c 6c 2d 66 6f 72 6d 65   is a well-forme
b800: 64 20 65 78 70 72 65 73 73 69 6f 6e 20 61 6e 64  d expression and
b810: 20 74 68 65 20 53 45 4c 45 43 54 20 73 74 61 74   the SELECT stat
b820: 65 6d 65 6e 74 0a 2a 2a 20 69 73 20 6e 6f 74 20  ement.** is not 
b830: 63 6f 6d 70 6f 75 6e 64 2c 20 74 68 65 6e 20 72  compound, then r
b840: 65 74 75 72 6e 20 30 2e 20 20 54 68 69 73 20 69  eturn 0.  This i
b850: 6e 64 69 63 61 74 65 73 20 74 6f 20 74 68 65 0a  ndicates to the.
b860: 2a 2a 20 63 61 6c 6c 65 72 20 74 68 61 74 20 69  ** caller that i
b870: 74 20 73 68 6f 75 6c 64 20 73 6f 72 74 20 62 79  t should sort by
b880: 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68   the value of th
b890: 65 20 4f 52 44 45 52 20 42 59 0a 2a 2a 20 65 78  e ORDER BY.** ex
b8a0: 70 72 65 73 73 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20  pression..**.** 
b8b0: 49 66 20 74 68 65 20 53 45 4c 45 43 54 20 69 73  If the SELECT is
b8c0: 20 63 6f 6d 70 6f 75 6e 64 2c 20 74 68 65 6e 20   compound, then 
b8d0: 61 74 74 65 6d 70 74 20 74 6f 20 6d 61 74 63 68  attempt to match
b8e0: 20 70 45 20 61 67 61 69 6e 73 74 0a 2a 2a 20 72   pE against.** r
b8f0: 65 73 75 6c 74 20 73 65 74 20 63 6f 6c 75 6d 6e  esult set column
b900: 73 20 69 6e 20 74 68 65 20 6c 65 66 74 2d 6d 6f  s in the left-mo
b910: 73 74 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d  st SELECT statem
b920: 65 6e 74 2e 20 20 52 65 74 75 72 6e 0a 2a 2a 20  ent.  Return.** 
b930: 74 68 65 20 69 6e 64 65 78 20 69 20 6f 66 20 74  the index i of t
b940: 68 65 20 6d 61 74 63 68 69 6e 67 20 63 6f 6c 75  he matching colu
b950: 6d 6e 2c 20 61 73 20 61 6e 20 69 6e 64 69 63 61  mn, as an indica
b960: 74 69 6f 6e 20 74 6f 20 74 68 65 20 0a 2a 2a 20  tion to the .** 
b970: 63 61 6c 6c 65 72 20 74 68 61 74 20 69 74 20 73  caller that it s
b980: 68 6f 75 6c 64 20 73 6f 72 74 20 62 79 20 74 68  hould sort by th
b990: 65 20 69 2d 74 68 20 63 6f 6c 75 6d 6e 2e 20 20  e i-th column.  
b9a0: 49 66 20 74 68 65 72 65 20 69 73 0a 2a 2a 20 6e  If there is.** n
b9b0: 6f 20 6d 61 74 63 68 2c 20 72 65 74 75 72 6e 20  o match, return 
b9c0: 2d 31 20 61 6e 64 20 6c 65 61 76 65 20 61 6e 20  -1 and leave an 
b9d0: 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 69 6e  error message in
b9e0: 20 70 50 61 72 73 65 2e 0a 2a 2f 0a 73 74 61 74   pParse..*/.stat
b9f0: 69 63 20 69 6e 74 20 6d 61 74 63 68 4f 72 64 65  ic int matchOrde
ba00: 72 42 79 54 65 72 6d 54 6f 45 78 70 72 4c 69 73  rByTermToExprLis
ba10: 74 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  t(.  Parse *pPar
ba20: 73 65 2c 20 20 20 20 20 2f 2a 20 50 61 72 73 69  se,     /* Parsi
ba30: 6e 67 20 63 6f 6e 74 65 78 74 20 66 6f 72 20 65  ng context for e
ba40: 72 72 6f 72 20 6d 65 73 73 61 67 65 73 20 2a 2f  rror messages */
ba50: 0a 20 20 53 65 6c 65 63 74 20 2a 70 53 65 6c 65  .  Select *pSele
ba60: 63 74 2c 20 20 20 2f 2a 20 54 68 65 20 53 45 4c  ct,   /* The SEL
ba70: 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 77 69  ECT statement wi
ba80: 74 68 20 74 68 65 20 4f 52 44 45 52 20 42 59 20  th the ORDER BY 
ba90: 63 6c 61 75 73 65 20 2a 2f 0a 20 20 45 78 70 72  clause */.  Expr
baa0: 20 2a 70 45 2c 20 20 20 20 20 20 20 20 20 20 2f   *pE,          /
bab0: 2a 20 54 68 65 20 73 70 65 63 69 66 69 63 20 4f  * The specific O
bac0: 52 44 45 52 20 42 59 20 74 65 72 6d 20 2a 2f 0a  RDER BY term */.
bad0: 20 20 69 6e 74 20 69 64 78 2c 20 20 20 20 20 20    int idx,      
bae0: 20 20 20 20 20 2f 2a 20 57 68 65 6e 20 4f 52 44       /* When ORD
baf0: 45 52 20 42 59 20 74 65 72 6d 20 69 73 20 74 68  ER BY term is th
bb00: 69 73 20 2a 2f 0a 20 20 69 6e 74 20 69 73 43 6f  is */.  int isCo
bb10: 6d 70 6f 75 6e 64 2c 20 20 20 20 2f 2a 20 54 72  mpound,    /* Tr
bb20: 75 65 20 69 66 20 74 68 69 73 20 69 73 20 61 20  ue if this is a 
bb30: 63 6f 6d 70 6f 75 6e 64 20 53 45 4c 45 43 54 20  compound SELECT 
bb40: 2a 2f 0a 20 20 75 38 20 2a 70 48 61 73 41 67 67  */.  u8 *pHasAgg
bb50: 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
bb60: 69 66 20 65 78 70 72 65 73 73 69 6f 6e 20 63 6f  if expression co
bb70: 6e 74 61 69 6e 73 20 61 67 67 72 65 67 61 74 65  ntains aggregate
bb80: 20 66 75 6e 63 74 69 6f 6e 73 20 2a 2f 0a 29 7b   functions */.){
bb90: 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20  .  int i;       
bba0: 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f        /* Loop co
bbb0: 75 6e 74 65 72 20 2a 2f 0a 20 20 45 78 70 72 4c  unter */.  ExprL
bbc0: 69 73 74 20 2a 70 45 4c 69 73 74 3b 20 20 2f 2a  ist *pEList;  /*
bbd0: 20 54 68 65 20 63 6f 6c 75 6d 6e 73 20 6f 66 20   The columns of 
bbe0: 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 20 2a  the result set *
bbf0: 2f 0a 20 20 4e 61 6d 65 43 6f 6e 74 65 78 74 20  /.  NameContext 
bc00: 6e 63 3b 20 20 20 20 2f 2a 20 4e 61 6d 65 20 63  nc;    /* Name c
bc10: 6f 6e 74 65 78 74 20 66 6f 72 20 72 65 73 6f 6c  ontext for resol
bc20: 76 69 6e 67 20 70 45 20 2a 2f 0a 0a 0a 20 20 2f  ving pE */...  /
bc30: 2a 20 49 66 20 74 68 65 20 74 65 72 6d 20 69 73  * If the term is
bc40: 20 61 6e 20 69 6e 74 65 67 65 72 20 63 6f 6e 73   an integer cons
bc50: 74 61 6e 74 2c 20 72 65 74 75 72 6e 20 74 68 65  tant, return the
bc60: 20 76 61 6c 75 65 20 6f 66 20 74 68 61 74 0a 20   value of that. 
bc70: 20 2a 2a 20 63 6f 6e 73 74 61 6e 74 20 2a 2f 0a   ** constant */.
bc80: 20 20 70 45 4c 69 73 74 20 3d 20 70 53 65 6c 65    pEList = pSele
bc90: 63 74 2d 3e 70 45 4c 69 73 74 3b 0a 20 20 69 66  ct->pEList;.  if
bca0: 28 20 73 71 6c 69 74 65 33 45 78 70 72 49 73 49  ( sqlite3ExprIsI
bcb0: 6e 74 65 67 65 72 28 70 45 2c 20 26 69 29 20 29  nteger(pE, &i) )
bcc0: 7b 0a 20 20 20 20 69 66 28 20 69 3c 3d 30 20 29  {.    if( i<=0 )
bcd0: 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 69 20  {.      /* If i 
bce0: 69 73 20 74 6f 6f 20 73 6d 61 6c 6c 2c 20 6d 61  is too small, ma
bcf0: 6b 65 20 69 74 20 74 6f 6f 20 62 69 67 2e 20 20  ke it too big.  
bd00: 54 68 61 74 20 77 61 79 20 74 68 65 20 63 61 6c  That way the cal
bd10: 6c 69 6e 67 0a 20 20 20 20 20 20 2a 2a 20 66 75  ling.      ** fu
bd20: 6e 63 74 69 6f 6e 20 73 74 69 6c 6c 20 73 65 65  nction still see
bd30: 73 20 61 20 76 61 6c 75 65 20 74 68 61 74 20 69  s a value that i
bd40: 73 20 6f 75 74 20 6f 66 20 72 61 6e 67 65 2c 20  s out of range, 
bd50: 62 75 74 20 64 6f 65 73 0a 20 20 20 20 20 20 2a  but does.      *
bd60: 2a 20 6e 6f 74 20 63 6f 6e 66 75 73 65 20 74 68  * not confuse th
bd70: 65 20 63 6f 6c 75 6d 6e 20 6e 75 6d 62 65 72 20  e column number 
bd80: 77 69 74 68 20 30 20 6f 72 20 2d 31 20 72 65 73  with 0 or -1 res
bd90: 75 6c 74 20 63 6f 64 65 2e 0a 20 20 20 20 20 20  ult code..      
bda0: 2a 2f 0a 20 20 20 20 20 20 69 20 3d 20 70 45 4c  */.      i = pEL
bdb0: 69 73 74 2d 3e 6e 45 78 70 72 2b 31 3b 0a 20 20  ist->nExpr+1;.  
bdc0: 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 69    }.    return i
bdd0: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74  ;.  }..  /* If t
bde0: 68 65 20 74 65 72 6d 20 69 73 20 61 20 73 69 6d  he term is a sim
bdf0: 70 6c 65 20 69 64 65 6e 74 69 66 69 65 72 20 74  ple identifier t
be00: 68 61 74 20 74 72 79 20 74 6f 20 6d 61 74 63 68  hat try to match
be10: 20 74 68 61 74 20 69 64 65 6e 74 69 66 69 65 72   that identifier
be20: 0a 20 20 2a 2a 20 61 67 61 69 6e 73 74 20 61 20  .  ** against a 
be30: 63 6f 6c 75 6d 6e 20 6e 61 6d 65 20 69 6e 20 74  column name in t
be40: 68 65 20 72 65 73 75 6c 74 20 73 65 74 2e 0a 20  he result set.. 
be50: 20 2a 2f 0a 20 20 69 66 28 20 70 45 2d 3e 6f 70   */.  if( pE->op
be60: 3d 3d 54 4b 5f 49 44 20 7c 7c 20 28 70 45 2d 3e  ==TK_ID || (pE->
be70: 6f 70 3d 3d 54 4b 5f 53 54 52 49 4e 47 20 26 26  op==TK_STRING &&
be80: 20 70 45 2d 3e 74 6f 6b 65 6e 2e 7a 5b 30 5d 21   pE->token.z[0]!
be90: 3d 27 5c 27 27 29 20 29 7b 0a 20 20 20 20 73 71  ='\'') ){.    sq
bea0: 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72  lite3 *db = pPar
beb0: 73 65 2d 3e 64 62 3b 0a 20 20 20 20 63 68 61 72  se->db;.    char
bec0: 20 2a 7a 43 6f 6c 20 3d 20 73 71 6c 69 74 65 33   *zCol = sqlite3
bed0: 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 64 62  NameFromToken(db
bee0: 2c 20 26 70 45 2d 3e 74 6f 6b 65 6e 29 3b 0a 20  , &pE->token);. 
bef0: 20 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f     if( db->mallo
bf00: 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 20  cFailed ){.     
bf10: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 43   sqlite3_free(zC
bf20: 6f 6c 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  ol);.      retur
bf30: 6e 20 2d 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20  n -1;.    }.    
bf40: 66 6f 72 28 69 3d 30 3b 20 69 3c 70 45 4c 69 73  for(i=0; i<pELis
bf50: 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a  t->nExpr; i++){.
bf60: 20 20 20 20 20 20 63 68 61 72 20 2a 7a 41 73 20        char *zAs 
bf70: 3d 20 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a  = pEList->a[i].z
bf80: 4e 61 6d 65 3b 0a 20 20 20 20 20 20 69 66 28 20  Name;.      if( 
bf90: 7a 41 73 21 3d 30 20 26 26 20 73 71 6c 69 74 65  zAs!=0 && sqlite
bfa0: 33 53 74 72 49 43 6d 70 28 7a 41 73 2c 20 7a 43  3StrICmp(zAs, zC
bfb0: 6f 6c 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ol)==0 ){.      
bfc0: 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
bfd0: 43 6f 6c 29 3b 0a 20 20 20 20 20 20 20 20 72 65  Col);.        re
bfe0: 74 75 72 6e 20 69 2b 31 3b 0a 20 20 20 20 20 20  turn i+1;.      
bff0: 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  }.    }.    sqli
c000: 74 65 33 5f 66 72 65 65 28 7a 43 6f 6c 29 3b 0a  te3_free(zCol);.
c010: 20 20 7d 0a 0a 20 20 2f 2a 20 52 65 73 6f 6c 76    }..  /* Resolv
c020: 65 20 61 6c 6c 20 6e 61 6d 65 73 20 69 6e 20 74  e all names in t
c030: 68 65 20 4f 52 44 45 52 20 42 59 20 74 65 72 6d  he ORDER BY term
c040: 20 65 78 70 72 65 73 73 69 6f 6e 0a 20 20 2a 2f   expression.  */
c050: 0a 20 20 6d 65 6d 73 65 74 28 26 6e 63 2c 20 30  .  memset(&nc, 0
c060: 2c 20 73 69 7a 65 6f 66 28 6e 63 29 29 3b 0a 20  , sizeof(nc));. 
c070: 20 6e 63 2e 70 50 61 72 73 65 20 3d 20 70 50 61   nc.pParse = pPa
c080: 72 73 65 3b 0a 20 20 6e 63 2e 70 53 72 63 4c 69  rse;.  nc.pSrcLi
c090: 73 74 20 3d 20 70 53 65 6c 65 63 74 2d 3e 70 53  st = pSelect->pS
c0a0: 72 63 3b 0a 20 20 6e 63 2e 70 45 4c 69 73 74 20  rc;.  nc.pEList 
c0b0: 3d 20 70 45 4c 69 73 74 3b 0a 20 20 6e 63 2e 61  = pEList;.  nc.a
c0c0: 6c 6c 6f 77 41 67 67 20 3d 20 31 3b 0a 20 20 6e  llowAgg = 1;.  n
c0d0: 63 2e 6e 45 72 72 20 3d 20 30 3b 0a 20 20 69 66  c.nErr = 0;.  if
c0e0: 28 20 73 71 6c 69 74 65 33 45 78 70 72 52 65 73  ( sqlite3ExprRes
c0f0: 6f 6c 76 65 4e 61 6d 65 73 28 26 6e 63 2c 20 70  olveNames(&nc, p
c100: 45 29 20 29 7b 0a 20 20 20 20 69 66 28 20 69 73  E) ){.    if( is
c110: 43 6f 6d 70 6f 75 6e 64 20 29 7b 0a 20 20 20 20  Compound ){.    
c120: 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 43 6c    sqlite3ErrorCl
c130: 65 61 72 28 70 50 61 72 73 65 29 3b 0a 20 20 20  ear(pParse);.   
c140: 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20     return 0;.   
c150: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 65   }else{.      re
c160: 74 75 72 6e 20 2d 31 3b 0a 20 20 20 20 7d 0a 20  turn -1;.    }. 
c170: 20 7d 0a 20 20 69 66 28 20 6e 63 2e 68 61 73 41   }.  if( nc.hasA
c180: 67 67 20 26 26 20 70 48 61 73 41 67 67 20 29 7b  gg && pHasAgg ){
c190: 0a 20 20 20 20 2a 70 48 61 73 41 67 67 20 3d 20  .    *pHasAgg = 
c1a0: 31 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46 6f 72  1;.  }..  /* For
c1b0: 20 61 20 63 6f 6d 70 6f 75 6e 64 20 53 45 4c 45   a compound SELE
c1c0: 43 54 2c 20 77 65 20 6e 65 65 64 20 74 6f 20 74  CT, we need to t
c1d0: 72 79 20 74 6f 20 6d 61 74 63 68 20 74 68 65 20  ry to match the 
c1e0: 4f 52 44 45 52 20 42 59 0a 20 20 2a 2a 20 65 78  ORDER BY.  ** ex
c1f0: 70 72 65 73 73 69 6f 6e 20 61 67 61 69 6e 73 74  pression against
c200: 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 69   an expression i
c210: 6e 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74  n the result set
c220: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 69 73 43 6f  .  */.  if( isCo
c230: 6d 70 6f 75 6e 64 20 29 7b 0a 20 20 20 20 66 6f  mpound ){.    fo
c240: 72 28 69 3d 30 3b 20 69 3c 70 45 4c 69 73 74 2d  r(i=0; i<pEList-
c250: 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20  >nExpr; i++){.  
c260: 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 45      if( sqlite3E
c270: 78 70 72 43 6f 6d 70 61 72 65 28 70 45 4c 69 73  xprCompare(pELis
c280: 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 2c 20 70  t->a[i].pExpr, p
c290: 45 29 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65  E) ){.        re
c2a0: 74 75 72 6e 20 69 2b 31 3b 0a 20 20 20 20 20 20  turn i+1;.      
c2b0: 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  }.    }.  }.  re
c2c0: 74 75 72 6e 20 30 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a  turn 0;.}.../*.*
c2d0: 2a 20 41 6e 61 6c 79 7a 65 20 61 6e 64 20 4f 52  * Analyze and OR
c2e0: 44 45 52 20 42 59 20 6f 72 20 47 52 4f 55 50 20  DER BY or GROUP 
c2f0: 42 59 20 63 6c 61 75 73 65 20 69 6e 20 61 20 73  BY clause in a s
c300: 69 6d 70 6c 65 20 53 45 4c 45 43 54 20 73 74 61  imple SELECT sta
c310: 74 65 6d 65 6e 74 2e 0a 2a 2a 20 52 65 74 75 72  tement..** Retur
c320: 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  n the number of 
c330: 65 72 72 6f 72 73 20 73 65 65 6e 2e 0a 2a 2a 0a  errors seen..**.
c340: 2a 2a 20 45 76 65 72 79 20 74 65 72 6d 20 6f 66  ** Every term of
c350: 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 6f 72   the ORDER BY or
c360: 20 47 52 4f 55 50 20 42 59 20 63 6c 61 75 73 65   GROUP BY clause
c370: 20 6e 65 65 64 73 20 74 6f 20 62 65 20 61 6e 0a   needs to be an.
c380: 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 2e 20 20  ** expression.  
c390: 49 66 20 61 6e 79 20 65 78 70 72 65 73 73 69 6f  If any expressio
c3a0: 6e 20 69 73 20 61 6e 20 69 6e 74 65 67 65 72 20  n is an integer 
c3b0: 63 6f 6e 73 74 61 6e 74 2c 20 74 68 65 6e 0a 2a  constant, then.*
c3c0: 2a 20 74 68 61 74 20 65 78 70 72 65 73 73 69 6f  * that expressio
c3d0: 6e 20 69 73 20 72 65 70 6c 61 63 65 64 20 62 79  n is replaced by
c3e0: 20 74 68 65 20 63 6f 72 72 65 73 70 6f 6e 64 69   the correspondi
c3f0: 6e 67 20 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f  ng .** expressio
c400: 6e 20 66 72 6f 6d 20 74 68 65 20 72 65 73 75 6c  n from the resul
c410: 74 20 73 65 74 2e 0a 2a 2f 0a 73 74 61 74 69 63  t set..*/.static
c420: 20 69 6e 74 20 70 72 6f 63 65 73 73 4f 72 64 65   int processOrde
c430: 72 47 72 6f 75 70 42 79 28 0a 20 20 50 61 72 73  rGroupBy(.  Pars
c440: 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20  e *pParse,      
c450: 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e    /* Parsing con
c460: 74 65 78 74 2e 20 20 4c 65 61 76 65 20 65 72 72  text.  Leave err
c470: 6f 72 20 6d 65 73 73 61 67 65 73 20 68 65 72 65  or messages here
c480: 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 53   */.  Select *pS
c490: 65 6c 65 63 74 2c 20 20 20 20 20 20 2f 2a 20 54  elect,      /* T
c4a0: 68 65 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d  he SELECT statem
c4b0: 65 6e 74 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74  ent containing t
c4c0: 68 65 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 45  he clause */.  E
c4d0: 78 70 72 4c 69 73 74 20 2a 70 4f 72 64 65 72 42  xprList *pOrderB
c4e0: 79 2c 20 20 20 2f 2a 20 54 68 65 20 4f 52 44 45  y,   /* The ORDE
c4f0: 52 20 42 59 20 6f 72 20 47 52 4f 55 50 20 42 59  R BY or GROUP BY
c500: 20 63 6c 61 75 73 65 20 74 6f 20 62 65 20 70 72   clause to be pr
c510: 6f 63 65 73 73 65 64 20 2a 2f 0a 20 20 69 6e 74  ocessed */.  int
c520: 20 69 73 4f 72 64 65 72 2c 20 20 20 20 20 20 20   isOrder,       
c530: 20 20 20 2f 2a 20 31 20 66 6f 72 20 4f 52 44 45     /* 1 for ORDE
c540: 52 20 42 59 2e 20 20 30 20 66 6f 72 20 47 52 4f  R BY.  0 for GRO
c550: 55 50 20 42 59 20 2a 2f 0a 20 20 75 38 20 2a 70  UP BY */.  u8 *p
c560: 48 61 73 41 67 67 20 20 20 20 20 20 20 20 20 20  HasAgg          
c570: 20 2f 2a 20 53 65 74 20 74 6f 20 54 52 55 45 20   /* Set to TRUE 
c580: 69 66 20 61 6e 79 20 74 65 72 6d 20 63 6f 6e 74  if any term cont
c590: 61 69 6e 73 20 61 6e 20 61 67 67 72 65 67 61 74  ains an aggregat
c5a0: 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 3b  e */.){.  int i;
c5b0: 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d  .  sqlite3 *db =
c5c0: 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 45   pParse->db;.  E
c5d0: 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 3b  xprList *pEList;
c5e0: 0a 0a 20 20 69 66 28 20 70 4f 72 64 65 72 42 79  ..  if( pOrderBy
c5f0: 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  ==0 ) return 0;.
c600: 20 20 69 66 28 20 70 4f 72 64 65 72 42 79 2d 3e    if( pOrderBy->
c610: 6e 45 78 70 72 3e 53 51 4c 49 54 45 5f 4d 41 58  nExpr>SQLITE_MAX
c620: 5f 43 4f 4c 55 4d 4e 20 29 7b 0a 20 20 20 20 63  _COLUMN ){.    c
c630: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 79 70 65  onst char *zType
c640: 20 3d 20 69 73 4f 72 64 65 72 20 3f 20 22 4f 52   = isOrder ? "OR
c650: 44 45 52 22 20 3a 20 22 47 52 4f 55 50 22 3b 0a  DER" : "GROUP";.
c660: 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
c670: 4d 73 67 28 70 50 61 72 73 65 2c 20 22 74 6f 6f  Msg(pParse, "too
c680: 20 6d 61 6e 79 20 74 65 72 6d 73 20 69 6e 20 25   many terms in %
c690: 73 20 42 59 20 63 6c 61 75 73 65 22 2c 20 7a 54  s BY clause", zT
c6a0: 79 70 65 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  ype);.    return
c6b0: 20 31 3b 0a 20 20 7d 0a 20 20 70 45 4c 69 73 74   1;.  }.  pEList
c6c0: 20 3d 20 70 53 65 6c 65 63 74 2d 3e 70 45 4c 69   = pSelect->pELi
c6d0: 73 74 3b 0a 20 20 69 66 28 20 70 45 4c 69 73 74  st;.  if( pEList
c6e0: 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ==0 ){.    retur
c6f0: 6e 20 30 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 69  n 0;.  }.  for(i
c700: 3d 30 3b 20 69 3c 70 4f 72 64 65 72 42 79 2d 3e  =0; i<pOrderBy->
c710: 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20  nExpr; i++){.   
c720: 20 69 6e 74 20 69 43 6f 6c 3b 0a 20 20 20 20 45   int iCol;.    E
c730: 78 70 72 20 2a 70 45 20 3d 20 70 4f 72 64 65 72  xpr *pE = pOrder
c740: 42 79 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 3b 0a  By->a[i].pExpr;.
c750: 20 20 20 20 69 43 6f 6c 20 3d 20 6d 61 74 63 68      iCol = match
c760: 4f 72 64 65 72 42 79 54 65 72 6d 54 6f 45 78 70  OrderByTermToExp
c770: 72 4c 69 73 74 28 70 50 61 72 73 65 2c 20 70 53  rList(pParse, pS
c780: 65 6c 65 63 74 2c 20 70 45 2c 20 69 2b 31 2c 20  elect, pE, i+1, 
c790: 30 2c 20 70 48 61 73 41 67 67 29 3b 0a 20 20 20  0, pHasAgg);.   
c7a0: 20 69 66 28 20 69 43 6f 6c 3c 30 20 29 7b 0a 20   if( iCol<0 ){. 
c7b0: 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20       return 1;. 
c7c0: 20 20 20 7d 0a 20 20 20 20 69 66 28 20 69 43 6f     }.    if( iCo
c7d0: 6c 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 20  l>pEList->nExpr 
c7e0: 29 7b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 63  ){.      const c
c7f0: 68 61 72 20 2a 7a 54 79 70 65 20 3d 20 69 73 4f  har *zType = isO
c800: 72 64 65 72 20 3f 20 22 4f 52 44 45 52 22 20 3a  rder ? "ORDER" :
c810: 20 22 47 52 4f 55 50 22 3b 0a 20 20 20 20 20 20   "GROUP";.      
c820: 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
c830: 70 50 61 72 73 65 2c 20 0a 20 20 20 20 20 20 20  pParse, .       
c840: 20 20 22 25 72 20 25 73 20 42 59 20 74 65 72 6d    "%r %s BY term
c850: 20 6f 75 74 20 6f 66 20 72 61 6e 67 65 20 2d 20   out of range - 
c860: 73 68 6f 75 6c 64 20 62 65 20 22 0a 20 20 20 20  should be ".    
c870: 20 20 20 20 20 22 62 65 74 77 65 65 6e 20 31 20       "between 1 
c880: 61 6e 64 20 25 64 22 2c 20 69 2b 31 2c 20 7a 54  and %d", i+1, zT
c890: 79 70 65 2c 20 70 45 4c 69 73 74 2d 3e 6e 45 78  ype, pEList->nEx
c8a0: 70 72 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  pr);.      retur
c8b0: 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  n 1;.    }.    i
c8c0: 66 28 20 69 43 6f 6c 3e 30 20 29 7b 0a 20 20 20  f( iCol>0 ){.   
c8d0: 20 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c     CollSeq *pCol
c8e0: 6c 20 3d 20 70 45 2d 3e 70 43 6f 6c 6c 3b 0a 20  l = pE->pColl;. 
c8f0: 20 20 20 20 20 69 6e 74 20 66 6c 61 67 73 20 3d       int flags =
c900: 20 70 45 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f   pE->flags & EP_
c910: 45 78 70 43 6f 6c 6c 61 74 65 3b 0a 20 20 20 20  ExpCollate;.    
c920: 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c    sqlite3ExprDel
c930: 65 74 65 28 70 45 29 3b 0a 20 20 20 20 20 20 70  ete(pE);.      p
c940: 45 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44  E = sqlite3ExprD
c950: 75 70 28 64 62 2c 20 70 45 4c 69 73 74 2d 3e 61  up(db, pEList->a
c960: 5b 69 43 6f 6c 2d 31 5d 2e 70 45 78 70 72 29 3b  [iCol-1].pExpr);
c970: 0a 20 20 20 20 20 20 70 4f 72 64 65 72 42 79 2d  .      pOrderBy-
c980: 3e 61 5b 69 5d 2e 70 45 78 70 72 20 3d 20 70 45  >a[i].pExpr = pE
c990: 3b 0a 20 20 20 20 20 20 69 66 28 20 70 43 6f 6c  ;.      if( pCol
c9a0: 6c 20 26 26 20 66 6c 61 67 73 20 29 7b 0a 20 20  l && flags ){.  
c9b0: 20 20 20 20 20 20 70 45 2d 3e 70 43 6f 6c 6c 20        pE->pColl 
c9c0: 3d 20 70 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 20  = pColl;.       
c9d0: 20 70 45 2d 3e 66 6c 61 67 73 20 7c 3d 20 66 6c   pE->flags |= fl
c9e0: 61 67 73 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ags;.      }.   
c9f0: 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
ca00: 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6e 61 6c  0;.}../*.** Anal
ca10: 79 7a 65 20 61 6e 64 20 4f 52 44 45 52 20 42 59  yze and ORDER BY
ca20: 20 6f 72 20 47 52 4f 55 50 20 42 59 20 63 6c 61   or GROUP BY cla
ca30: 75 73 65 20 69 6e 20 61 20 53 45 4c 45 43 54 20  use in a SELECT 
ca40: 73 74 61 74 65 6d 65 6e 74 2e 20 20 52 65 74 75  statement.  Retu
ca50: 72 6e 0a 2a 2a 20 74 68 65 20 6e 75 6d 62 65 72  rn.** the number
ca60: 20 6f 66 20 65 72 72 6f 72 73 20 73 65 65 6e 2e   of errors seen.
ca70: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 72 6f 63 65  .**.** The proce
ca80: 73 73 69 6e 67 20 64 65 70 65 6e 64 73 20 6f 6e  ssing depends on
ca90: 20 77 68 65 74 68 65 72 20 74 68 65 20 53 45 4c   whether the SEL
caa0: 45 43 54 20 69 73 20 73 69 6d 70 6c 65 20 6f 72  ECT is simple or
cab0: 20 63 6f 6d 70 6f 75 6e 64 2e 0a 2a 2a 20 46 6f   compound..** Fo
cac0: 72 20 61 20 73 69 6d 70 6c 65 20 53 45 4c 45 43  r a simple SELEC
cad0: 54 20 73 74 61 74 65 6d 65 6e 74 2c 20 65 76 72  T statement, evr
cae0: 79 20 74 65 72 6d 20 6f 66 20 74 68 65 20 4f 52  y term of the OR
caf0: 44 45 52 20 42 59 20 6f 72 20 47 52 4f 55 50 20  DER BY or GROUP 
cb00: 42 59 0a 2a 2a 20 63 6c 61 75 73 65 20 6e 65 65  BY.** clause nee
cb10: 64 73 20 74 6f 20 62 65 20 61 6e 20 65 78 70 72  ds to be an expr
cb20: 65 73 73 69 6f 6e 2e 20 20 49 66 20 61 6e 79 20  ession.  If any 
cb30: 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 61 6e  expression is an
cb40: 20 69 6e 74 65 67 65 72 0a 2a 2a 20 63 6f 6e 73   integer.** cons
cb50: 74 61 6e 74 2c 20 74 68 65 6e 20 74 68 61 74 20  tant, then that 
cb60: 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 72 65  expression is re
cb70: 70 6c 61 63 65 64 20 62 79 20 74 68 65 20 63 6f  placed by the co
cb80: 72 72 65 73 70 6f 6e 64 69 6e 67 20 0a 2a 2a 20  rresponding .** 
cb90: 65 78 70 72 65 73 73 69 6f 6e 20 66 72 6f 6d 20  expression from 
cba0: 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 2e 0a  the result set..
cbb0: 2a 2a 0a 2a 2a 20 46 6f 72 20 63 6f 6d 70 6f 75  **.** For compou
cbc0: 6e 64 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d  nd SELECT statem
cbd0: 65 6e 74 73 2c 20 65 76 65 72 79 20 65 78 70 72  ents, every expr
cbe0: 65 73 73 69 6f 6e 20 6e 65 65 64 73 20 74 6f 20  ession needs to 
cbf0: 62 65 20 6f 66 0a 2a 2a 20 74 79 70 65 20 54 4b  be of.** type TK
cc00: 5f 43 4f 4c 55 4d 4e 20 77 69 74 68 20 61 20 69  _COLUMN with a i
cc10: 54 61 62 6c 65 20 76 61 6c 75 65 20 61 73 20 67  Table value as g
cc20: 69 76 65 6e 20 69 6e 20 74 68 65 20 34 74 68 20  iven in the 4th 
cc30: 70 61 72 61 6d 65 74 65 72 2e 0a 2a 2a 20 49 66  parameter..** If
cc40: 20 61 6e 79 20 65 78 70 72 65 73 73 69 6f 6e 20   any expression 
cc50: 69 73 20 61 6e 20 69 6e 74 65 67 65 72 2c 20 74  is an integer, t
cc60: 68 61 74 20 62 65 63 6f 6d 65 73 20 74 68 65 20  hat becomes the 
cc70: 63 6f 6c 75 6d 6e 20 6e 75 6d 62 65 72 2e 0a 2a  column number..*
cc80: 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 6d 61 74  * Otherwise, mat
cc90: 63 68 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  ch the expressio
cca0: 6e 20 61 67 61 69 6e 73 74 20 72 65 73 75 6c 74  n against result
ccb0: 20 73 65 74 20 63 6f 6c 75 6d 6e 73 20 66 72 6f   set columns fro
ccc0: 6d 0a 2a 2a 20 74 68 65 20 6c 65 66 74 2d 6d 6f  m.** the left-mo
ccd0: 73 74 20 53 45 4c 45 43 54 2e 0a 2a 2f 0a 73 74  st SELECT..*/.st
cce0: 61 74 69 63 20 69 6e 74 20 70 72 6f 63 65 73 73  atic int process
ccf0: 43 6f 6d 70 6f 75 6e 64 4f 72 64 65 72 42 79 28  CompoundOrderBy(
cd00: 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
cd10: 2c 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73  ,        /* Pars
cd20: 69 6e 67 20 63 6f 6e 74 65 78 74 2e 20 20 4c 65  ing context.  Le
cd30: 61 76 65 20 65 72 72 6f 72 20 6d 65 73 73 61 67  ave error messag
cd40: 65 73 20 68 65 72 65 20 2a 2f 0a 20 20 53 65 6c  es here */.  Sel
cd50: 65 63 74 20 2a 70 53 65 6c 65 63 74 2c 20 20 20  ect *pSelect,   
cd60: 20 20 20 2f 2a 20 54 68 65 20 53 45 4c 45 43 54     /* The SELECT
cd70: 20 73 74 61 74 65 6d 65 6e 74 20 63 6f 6e 74 61   statement conta
cd80: 69 6e 69 6e 67 20 74 68 65 20 4f 52 44 45 52 20  ining the ORDER 
cd90: 42 59 20 2a 2f 0a 20 20 69 6e 74 20 69 54 61 62  BY */.  int iTab
cda0: 6c 65 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  le            /*
cdb0: 20 4f 75 74 70 75 74 20 74 61 62 6c 65 20 66 6f   Output table fo
cdc0: 72 20 63 6f 6d 70 6f 75 6e 64 20 53 45 4c 45 43  r compound SELEC
cdd0: 54 20 73 74 61 74 65 6d 65 6e 74 73 20 2a 2f 0a  T statements */.
cde0: 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 45 78  ){.  int i;.  Ex
cdf0: 70 72 4c 69 73 74 20 2a 70 4f 72 64 65 72 42 79  prList *pOrderBy
ce00: 3b 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45  ;.  ExprList *pE
ce10: 4c 69 73 74 3b 0a 20 20 73 71 6c 69 74 65 33 20  List;.  sqlite3 
ce20: 2a 64 62 3b 0a 20 20 69 6e 74 20 6d 6f 72 65 54  *db;.  int moreT
ce30: 6f 44 6f 20 3d 20 31 3b 0a 0a 20 20 70 4f 72 64  oDo = 1;..  pOrd
ce40: 65 72 42 79 20 3d 20 70 53 65 6c 65 63 74 2d 3e  erBy = pSelect->
ce50: 70 4f 72 64 65 72 42 79 3b 0a 20 20 69 66 28 20  pOrderBy;.  if( 
ce60: 70 4f 72 64 65 72 42 79 3d 3d 30 20 29 20 72 65  pOrderBy==0 ) re
ce70: 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 70 4f  turn 0;.  if( pO
ce80: 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 3e 53 51  rderBy->nExpr>SQ
ce90: 4c 49 54 45 5f 4d 41 58 5f 43 4f 4c 55 4d 4e 20  LITE_MAX_COLUMN 
cea0: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72  ){.    sqlite3Er
ceb0: 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
cec0: 74 6f 6f 20 6d 61 6e 79 20 74 65 72 6d 73 20 69  too many terms i
ced0: 6e 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73  n ORDER BY claus
cee0: 65 22 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  e");.    return 
cef0: 31 3b 0a 20 20 7d 0a 20 20 64 62 20 3d 20 70 50  1;.  }.  db = pP
cf00: 61 72 73 65 2d 3e 64 62 3b 0a 20 20 66 6f 72 28  arse->db;.  for(
cf10: 69 3d 30 3b 20 69 3c 70 4f 72 64 65 72 42 79 2d  i=0; i<pOrderBy-
cf20: 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20  >nExpr; i++){.  
cf30: 20 20 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d    pOrderBy->a[i]
cf40: 2e 64 6f 6e 65 20 3d 20 30 3b 0a 20 20 7d 0a 20  .done = 0;.  }. 
cf50: 20 77 68 69 6c 65 28 20 70 53 65 6c 65 63 74 2d   while( pSelect-
cf60: 3e 70 50 72 69 6f 72 20 29 7b 0a 20 20 20 20 70  >pPrior ){.    p
cf70: 53 65 6c 65 63 74 20 3d 20 70 53 65 6c 65 63 74  Select = pSelect
cf80: 2d 3e 70 50 72 69 6f 72 3b 0a 20 20 7d 0a 20 20  ->pPrior;.  }.  
cf90: 77 68 69 6c 65 28 20 70 53 65 6c 65 63 74 20 26  while( pSelect &
cfa0: 26 20 6d 6f 72 65 54 6f 44 6f 20 29 7b 0a 20 20  & moreToDo ){.  
cfb0: 20 20 6d 6f 72 65 54 6f 44 6f 20 3d 20 30 3b 0a    moreToDo = 0;.
cfc0: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70      for(i=0; i<p
cfd0: 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 3b 20  OrderBy->nExpr; 
cfe0: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  i++){.      int 
cff0: 69 43 6f 6c 3b 0a 20 20 20 20 20 20 45 78 70 72  iCol;.      Expr
d000: 20 2a 70 45 3b 0a 20 20 20 20 20 20 69 66 28 20   *pE;.      if( 
d010: 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 64  pOrderBy->a[i].d
d020: 6f 6e 65 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  one ) continue;.
d030: 20 20 20 20 20 20 70 45 20 3d 20 70 4f 72 64 65        pE = pOrde
d040: 72 42 79 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 3b  rBy->a[i].pExpr;
d050: 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 44 75  .      Expr *pDu
d060: 70 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44  p = sqlite3ExprD
d070: 75 70 28 64 62 2c 20 70 45 29 3b 0a 20 20 20 20  up(db, pE);.    
d080: 20 20 69 66 28 20 70 44 75 70 3d 3d 30 20 29 7b    if( pDup==0 ){
d090: 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
d0a0: 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  1;.      }.     
d0b0: 20 69 43 6f 6c 20 3d 20 6d 61 74 63 68 4f 72 64   iCol = matchOrd
d0c0: 65 72 42 79 54 65 72 6d 54 6f 45 78 70 72 4c 69  erByTermToExprLi
d0d0: 73 74 28 70 50 61 72 73 65 2c 20 70 53 65 6c 65  st(pParse, pSele
d0e0: 63 74 2c 20 70 44 75 70 2c 20 69 2b 31 2c 20 31  ct, pDup, i+1, 1
d0f0: 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  , 0);.      sqli
d100: 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 70 44  te3ExprDelete(pD
d110: 75 70 29 3b 0a 20 20 20 20 20 20 69 66 28 20 69  up);.      if( i
d120: 43 6f 6c 3c 30 20 29 7b 0a 20 20 20 20 20 20 20  Col<0 ){.       
d130: 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 20   return 1;.     
d140: 20 7d 0a 20 20 20 20 20 20 70 45 4c 69 73 74 20   }.      pEList 
d150: 3d 20 70 53 65 6c 65 63 74 2d 3e 70 45 4c 69 73  = pSelect->pELis
d160: 74 3b 0a 20 20 20 20 20 20 69 66 28 20 70 45 4c  t;.      if( pEL
d170: 69 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ist==0 ){.      
d180: 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20    return 1;.    
d190: 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 69 43    }.      if( iC
d1a0: 6f 6c 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72  ol>pEList->nExpr
d1b0: 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
d1c0: 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
d1d0: 73 65 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20  se, .           
d1e0: 22 25 72 20 4f 52 44 45 52 20 42 59 20 74 65 72  "%r ORDER BY ter
d1f0: 6d 20 6f 75 74 20 6f 66 20 72 61 6e 67 65 20 2d  m out of range -
d200: 20 73 68 6f 75 6c 64 20 62 65 20 22 0a 20 20 20   should be ".   
d210: 20 20 20 20 20 20 20 20 22 62 65 74 77 65 65 6e          "between
d220: 20 31 20 61 6e 64 20 25 64 22 2c 20 69 2b 31 2c   1 and %d", i+1,
d230: 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 29 3b   pEList->nExpr);
d240: 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
d250: 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  1;.      }.     
d260: 20 69 66 28 20 69 43 6f 6c 3e 30 20 29 7b 0a 20   if( iCol>0 ){. 
d270: 20 20 20 20 20 20 20 70 45 2d 3e 6f 70 20 3d 20         pE->op = 
d280: 54 4b 5f 43 4f 4c 55 4d 4e 3b 0a 20 20 20 20 20  TK_COLUMN;.     
d290: 20 20 20 70 45 2d 3e 69 54 61 62 6c 65 20 3d 20     pE->iTable = 
d2a0: 69 54 61 62 6c 65 3b 0a 20 20 20 20 20 20 20 20  iTable;.        
d2b0: 70 45 2d 3e 69 41 67 67 20 3d 20 2d 31 3b 0a 20  pE->iAgg = -1;. 
d2c0: 20 20 20 20 20 20 20 70 45 2d 3e 69 43 6f 6c 75         pE->iColu
d2d0: 6d 6e 20 3d 20 69 43 6f 6c 2d 31 3b 0a 20 20 20  mn = iCol-1;.   
d2e0: 20 20 20 20 20 70 45 2d 3e 70 54 61 62 20 3d 20       pE->pTab = 
d2f0: 30 3b 0a 20 20 20 20 20 20 20 20 70 4f 72 64 65  0;.        pOrde
d300: 72 42 79 2d 3e 61 5b 69 5d 2e 64 6f 6e 65 20 3d  rBy->a[i].done =
d310: 20 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b   1;.      }else{
d320: 0a 20 20 20 20 20 20 20 20 6d 6f 72 65 54 6f 44  .        moreToD
d330: 6f 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20  o = 1;.      }. 
d340: 20 20 20 7d 0a 20 20 20 20 70 53 65 6c 65 63 74     }.    pSelect
d350: 20 3d 20 70 53 65 6c 65 63 74 2d 3e 70 4e 65 78   = pSelect->pNex
d360: 74 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d 30  t;.  }.  for(i=0
d370: 3b 20 69 3c 70 4f 72 64 65 72 42 79 2d 3e 6e 45  ; i<pOrderBy->nE
d380: 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69  xpr; i++){.    i
d390: 66 28 20 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69  f( pOrderBy->a[i
d3a0: 5d 2e 64 6f 6e 65 3d 3d 30 20 29 7b 0a 20 20 20  ].done==0 ){.   
d3b0: 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
d3c0: 73 67 28 70 50 61 72 73 65 2c 20 22 25 72 20 4f  sg(pParse, "%r O
d3d0: 52 44 45 52 20 42 59 20 74 65 72 6d 20 64 6f 65  RDER BY term doe
d3e0: 73 20 6e 6f 74 20 6d 61 74 63 68 20 61 6e 79 20  s not match any 
d3f0: 22 0a 20 20 20 20 20 20 20 20 20 20 20 20 22 63  ".            "c
d400: 6f 6c 75 6d 6e 20 69 6e 20 74 68 65 20 72 65 73  olumn in the res
d410: 75 6c 74 20 73 65 74 22 2c 20 69 2b 31 29 3b 0a  ult set", i+1);.
d420: 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a        return 1;.
d430: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
d440: 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47  rn 0;.}../*.** G
d450: 65 74 20 61 20 56 44 42 45 20 66 6f 72 20 74 68  et a VDBE for th
d460: 65 20 67 69 76 65 6e 20 70 61 72 73 65 72 20 63  e given parser c
d470: 6f 6e 74 65 78 74 2e 20 20 43 72 65 61 74 65 20  ontext.  Create 
d480: 61 20 6e 65 77 20 6f 6e 65 20 69 66 20 6e 65 63  a new one if nec
d490: 65 73 73 61 72 79 2e 0a 2a 2a 20 49 66 20 61 6e  essary..** If an
d4a0: 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 72   error occurs, r
d4b0: 65 74 75 72 6e 20 4e 55 4c 4c 20 61 6e 64 20 6c  eturn NULL and l
d4c0: 65 61 76 65 20 61 20 6d 65 73 73 61 67 65 20 69  eave a message i
d4d0: 6e 20 70 50 61 72 73 65 2e 0a 2a 2f 0a 56 64 62  n pParse..*/.Vdb
d4e0: 65 20 2a 73 71 6c 69 74 65 33 47 65 74 56 64 62  e *sqlite3GetVdb
d4f0: 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 29  e(Parse *pParse)
d500: 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50  {.  Vdbe *v = pP
d510: 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69  arse->pVdbe;.  i
d520: 66 28 20 76 3d 3d 30 20 29 7b 0a 20 20 20 20 76  f( v==0 ){.    v
d530: 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65   = pParse->pVdbe
d540: 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43 72   = sqlite3VdbeCr
d550: 65 61 74 65 28 70 50 61 72 73 65 2d 3e 64 62 29  eate(pParse->db)
d560: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 76  ;.  }.  return v
d570: 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70  ;.}.../*.** Comp
d580: 75 74 65 20 74 68 65 20 69 4c 69 6d 69 74 20 61  ute the iLimit a
d590: 6e 64 20 69 4f 66 66 73 65 74 20 66 69 65 6c 64  nd iOffset field
d5a0: 73 20 6f 66 20 74 68 65 20 53 45 4c 45 43 54 20  s of the SELECT 
d5b0: 62 61 73 65 64 20 6f 6e 20 74 68 65 0a 2a 2a 20  based on the.** 
d5c0: 70 4c 69 6d 69 74 20 61 6e 64 20 70 4f 66 66 73  pLimit and pOffs
d5d0: 65 74 20 65 78 70 72 65 73 73 69 6f 6e 73 2e 20  et expressions. 
d5e0: 20 70 4c 69 6d 69 74 20 61 6e 64 20 70 4f 66 66   pLimit and pOff
d5f0: 73 65 74 20 68 6f 6c 64 20 74 68 65 20 65 78 70  set hold the exp
d600: 72 65 73 73 69 6f 6e 73 0a 2a 2a 20 74 68 61 74  ressions.** that
d610: 20 61 70 70 65 61 72 20 69 6e 20 74 68 65 20 6f   appear in the o
d620: 72 69 67 69 6e 61 6c 20 53 51 4c 20 73 74 61 74  riginal SQL stat
d630: 65 6d 65 6e 74 20 61 66 74 65 72 20 74 68 65 20  ement after the 
d640: 4c 49 4d 49 54 20 61 6e 64 20 4f 46 46 53 45 54  LIMIT and OFFSET
d650: 0a 2a 2a 20 6b 65 79 77 6f 72 64 73 2e 20 20 4f  .** keywords.  O
d660: 72 20 4e 55 4c 4c 20 69 66 20 74 68 6f 73 65 20  r NULL if those 
d670: 6b 65 79 77 6f 72 64 73 20 61 72 65 20 6f 6d 69  keywords are omi
d680: 74 74 65 64 2e 20 69 4c 69 6d 69 74 20 61 6e 64  tted. iLimit and
d690: 20 69 4f 66 66 73 65 74 20 0a 2a 2a 20 61 72 65   iOffset .** are
d6a0: 20 74 68 65 20 69 6e 74 65 67 65 72 20 6d 65 6d   the integer mem
d6b0: 6f 72 79 20 72 65 67 69 73 74 65 72 20 6e 75 6d  ory register num
d6c0: 62 65 72 73 20 66 6f 72 20 63 6f 75 6e 74 65 72  bers for counter
d6d0: 73 20 75 73 65 64 20 74 6f 20 63 6f 6d 70 75 74  s used to comput
d6e0: 65 20 0a 2a 2a 20 74 68 65 20 6c 69 6d 69 74 20  e .** the limit 
d6f0: 61 6e 64 20 6f 66 66 73 65 74 2e 20 20 49 66 20  and offset.  If 
d700: 74 68 65 72 65 20 69 73 20 6e 6f 20 6c 69 6d 69  there is no limi
d710: 74 20 61 6e 64 2f 6f 72 20 6f 66 66 73 65 74 2c  t and/or offset,
d720: 20 74 68 65 6e 20 0a 2a 2a 20 69 4c 69 6d 69 74   then .** iLimit
d730: 20 61 6e 64 20 69 4f 66 66 73 65 74 20 61 72 65   and iOffset are
d740: 20 6e 65 67 61 74 69 76 65 2e 0a 2a 2a 0a 2a 2a   negative..**.**
d750: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 63 68   This routine ch
d760: 61 6e 67 65 73 20 74 68 65 20 76 61 6c 75 65 73  anges the values
d770: 20 6f 66 20 69 4c 69 6d 69 74 20 61 6e 64 20 69   of iLimit and i
d780: 4f 66 66 73 65 74 20 6f 6e 6c 79 20 69 66 0a 2a  Offset only if.*
d790: 2a 20 61 20 6c 69 6d 69 74 20 6f 72 20 6f 66 66  * a limit or off
d7a0: 73 65 74 20 69 73 20 64 65 66 69 6e 65 64 20 62  set is defined b
d7b0: 79 20 70 4c 69 6d 69 74 20 61 6e 64 20 70 4f 66  y pLimit and pOf
d7c0: 66 73 65 74 2e 20 20 69 4c 69 6d 69 74 20 61 6e  fset.  iLimit an
d7d0: 64 0a 2a 2a 20 69 4f 66 66 73 65 74 20 73 68 6f  d.** iOffset sho
d7e0: 75 6c 64 20 68 61 76 65 20 62 65 65 6e 20 70 72  uld have been pr
d7f0: 65 73 65 74 20 74 6f 20 61 70 70 72 6f 70 72 69  eset to appropri
d800: 61 74 65 20 64 65 66 61 75 6c 74 20 76 61 6c 75  ate default valu
d810: 65 73 0a 2a 2a 20 28 75 73 75 61 6c 6c 79 20 62  es.** (usually b
d820: 75 74 20 6e 6f 74 20 61 6c 77 61 79 73 20 2d 31  ut not always -1
d830: 29 20 70 72 69 6f 72 20 74 6f 20 63 61 6c 6c 69  ) prior to calli
d840: 6e 67 20 74 68 69 73 20 72 6f 75 74 69 6e 65 2e  ng this routine.
d850: 0a 2a 2a 20 4f 6e 6c 79 20 69 66 20 70 4c 69 6d  .** Only if pLim
d860: 69 74 21 3d 30 20 6f 72 20 70 4f 66 66 73 65 74  it!=0 or pOffset
d870: 21 3d 30 20 64 6f 20 74 68 65 20 6c 69 6d 69 74  !=0 do the limit
d880: 20 72 65 67 69 73 74 65 72 73 20 67 65 74 0a 2a   registers get.*
d890: 2a 20 72 65 64 65 66 69 6e 65 64 2e 20 20 54 68  * redefined.  Th
d8a0: 65 20 55 4e 49 4f 4e 20 41 4c 4c 20 6f 70 65 72  e UNION ALL oper
d8b0: 61 74 6f 72 20 75 73 65 73 20 74 68 69 73 20 70  ator uses this p
d8c0: 72 6f 70 65 72 74 79 20 74 6f 20 66 6f 72 63 65  roperty to force
d8d0: 0a 2a 2a 20 74 68 65 20 72 65 75 73 65 20 6f 66  .** the reuse of
d8e0: 20 74 68 65 20 73 61 6d 65 20 6c 69 6d 69 74 20   the same limit 
d8f0: 61 6e 64 20 6f 66 66 73 65 74 20 72 65 67 69 73  and offset regis
d900: 74 65 72 73 20 61 63 72 6f 73 73 20 6d 75 6c 74  ters across mult
d910: 69 70 6c 65 0a 2a 2a 20 53 45 4c 45 43 54 20 73  iple.** SELECT s
d920: 74 61 74 65 6d 65 6e 74 73 2e 0a 2a 2f 0a 73 74  tatements..*/.st
d930: 61 74 69 63 20 76 6f 69 64 20 63 6f 6d 70 75 74  atic void comput
d940: 65 4c 69 6d 69 74 52 65 67 69 73 74 65 72 73 28  eLimitRegisters(
d950: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 53  Parse *pParse, S
d960: 65 6c 65 63 74 20 2a 70 2c 20 69 6e 74 20 69 42  elect *p, int iB
d970: 72 65 61 6b 29 7b 0a 20 20 56 64 62 65 20 2a 76  reak){.  Vdbe *v
d980: 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69 4c 69 6d   = 0;.  int iLim
d990: 69 74 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69 4f  it = 0;.  int iO
d9a0: 66 66 73 65 74 3b 0a 20 20 69 6e 74 20 61 64 64  ffset;.  int add
d9b0: 72 31 2c 20 61 64 64 72 32 3b 0a 0a 20 20 2f 2a  r1, addr2;..  /*
d9c0: 20 0a 20 20 2a 2a 20 22 4c 49 4d 49 54 20 2d 31   .  ** "LIMIT -1
d9d0: 22 20 61 6c 77 61 79 73 20 73 68 6f 77 73 20 61  " always shows a
d9e0: 6c 6c 20 72 6f 77 73 2e 20 20 54 68 65 72 65 20  ll rows.  There 
d9f0: 69 73 20 73 6f 6d 65 0a 20 20 2a 2a 20 63 6f 6e  is some.  ** con
da00: 74 72 61 76 65 72 73 79 20 61 62 6f 75 74 20 77  traversy about w
da10: 68 61 74 20 74 68 65 20 63 6f 72 72 65 63 74 20  hat the correct 
da20: 62 65 68 61 76 69 6f 72 20 73 68 6f 75 6c 64 20  behavior should 
da30: 62 65 2e 0a 20 20 2a 2a 20 54 68 65 20 63 75 72  be..  ** The cur
da40: 72 65 6e 74 20 69 6d 70 6c 65 6d 65 6e 74 61 74  rent implementat
da50: 69 6f 6e 20 69 6e 74 65 72 70 72 65 74 73 20 22  ion interprets "
da60: 4c 49 4d 49 54 20 30 22 20 74 6f 20 6d 65 61 6e  LIMIT 0" to mean
da70: 0a 20 20 2a 2a 20 6e 6f 20 72 6f 77 73 2e 0a 20  .  ** no rows.. 
da80: 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 70 4c 69   */.  if( p->pLi
da90: 6d 69 74 20 29 7b 0a 20 20 20 20 70 2d 3e 69 4c  mit ){.    p->iL
daa0: 69 6d 69 74 20 3d 20 69 4c 69 6d 69 74 20 3d 20  imit = iLimit = 
dab0: 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20  pParse->nMem;.  
dac0: 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b    pParse->nMem +
dad0: 3d 20 32 3b 0a 20 20 20 20 76 20 3d 20 73 71 6c  = 2;.    v = sql
dae0: 69 74 65 33 47 65 74 56 64 62 65 28 70 50 61 72  ite3GetVdbe(pPar
daf0: 73 65 29 3b 0a 20 20 20 20 69 66 28 20 76 3d 3d  se);.    if( v==
db00: 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 20 20  0 ) return;.    
db10: 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28  sqlite3ExprCode(
db20: 70 50 61 72 73 65 2c 20 70 2d 3e 70 4c 69 6d 69  pParse, p->pLimi
db30: 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  t);.    sqlite3V
db40: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d  dbeAddOp(v, OP_M
db50: 75 73 74 42 65 49 6e 74 2c 20 30 2c 20 30 29 3b  ustBeInt, 0, 0);
db60: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
db70: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 65 6d 53  AddOp(v, OP_MemS
db80: 74 6f 72 65 2c 20 69 4c 69 6d 69 74 2c 20 31 29  tore, iLimit, 1)
db90: 3b 0a 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e  ;.    VdbeCommen
dba0: 74 28 28 76 2c 20 22 23 20 4c 49 4d 49 54 20 63  t((v, "# LIMIT c
dbb0: 6f 75 6e 74 65 72 22 29 29 3b 0a 20 20 20 20 73  ounter"));.    s
dbc0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
dbd0: 76 2c 20 4f 50 5f 49 66 4d 65 6d 5a 65 72 6f 2c  v, OP_IfMemZero,
dbe0: 20 69 4c 69 6d 69 74 2c 20 69 42 72 65 61 6b 29   iLimit, iBreak)
dbf0: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
dc00: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 65 6d  eAddOp(v, OP_Mem
dc10: 4c 6f 61 64 2c 20 69 4c 69 6d 69 74 2c 20 30 29  Load, iLimit, 0)
dc20: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e 70  ;.  }.  if( p->p
dc30: 4f 66 66 73 65 74 20 29 7b 0a 20 20 20 20 70 2d  Offset ){.    p-
dc40: 3e 69 4f 66 66 73 65 74 20 3d 20 69 4f 66 66 73  >iOffset = iOffs
dc50: 65 74 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 65  et = pParse->nMe
dc60: 6d 2b 2b 3b 0a 20 20 20 20 76 20 3d 20 73 71 6c  m++;.    v = sql
dc70: 69 74 65 33 47 65 74 56 64 62 65 28 70 50 61 72  ite3GetVdbe(pPar
dc80: 73 65 29 3b 0a 20 20 20 20 69 66 28 20 76 3d 3d  se);.    if( v==
dc90: 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 20 20  0 ) return;.    
dca0: 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28  sqlite3ExprCode(
dcb0: 70 50 61 72 73 65 2c 20 70 2d 3e 70 4f 66 66 73  pParse, p->pOffs
dcc0: 65 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  et);.    sqlite3
dcd0: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
dce0: 4d 75 73 74 42 65 49 6e 74 2c 20 30 2c 20 30 29  MustBeInt, 0, 0)
dcf0: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
dd00: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 65 6d  eAddOp(v, OP_Mem
dd10: 53 74 6f 72 65 2c 20 69 4f 66 66 73 65 74 2c 20  Store, iOffset, 
dd20: 70 2d 3e 70 4c 69 6d 69 74 3d 3d 30 29 3b 0a 20  p->pLimit==0);. 
dd30: 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28     VdbeComment((
dd40: 76 2c 20 22 23 20 4f 46 46 53 45 54 20 63 6f 75  v, "# OFFSET cou
dd50: 6e 74 65 72 22 29 29 3b 0a 20 20 20 20 61 64 64  nter"));.    add
dd60: 72 31 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  r1 = sqlite3Vdbe
dd70: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49 66 4d 65  AddOp(v, OP_IfMe
dd80: 6d 50 6f 73 2c 20 69 4f 66 66 73 65 74 2c 20 30  mPos, iOffset, 0
dd90: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
dda0: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 50 6f  beAddOp(v, OP_Po
ddb0: 70 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20 73 71  p, 1, 0);.    sq
ddc0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
ddd0: 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 30 2c  , OP_Integer, 0,
dde0: 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33   0);.    sqlite3
ddf0: 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20  VdbeJumpHere(v, 
de00: 61 64 64 72 31 29 3b 0a 20 20 20 20 69 66 28 20  addr1);.    if( 
de10: 70 2d 3e 70 4c 69 6d 69 74 20 29 7b 0a 20 20 20  p->pLimit ){.   
de20: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
de30: 64 4f 70 28 76 2c 20 4f 50 5f 41 64 64 2c 20 30  dOp(v, OP_Add, 0
de40: 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  , 0);.    }.  }.
de50: 20 20 69 66 28 20 70 2d 3e 70 4c 69 6d 69 74 20    if( p->pLimit 
de60: 29 7b 0a 20 20 20 20 61 64 64 72 31 20 3d 20 73  ){.    addr1 = s
de70: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
de80: 76 2c 20 4f 50 5f 49 66 4d 65 6d 50 6f 73 2c 20  v, OP_IfMemPos, 
de90: 69 4c 69 6d 69 74 2c 20 30 29 3b 0a 20 20 20 20  iLimit, 0);.    
dea0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
deb0: 28 76 2c 20 4f 50 5f 50 6f 70 2c 20 31 2c 20 30  (v, OP_Pop, 1, 0
dec0: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
ded0: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 65  beAddOp(v, OP_Me
dee0: 6d 49 6e 74 2c 20 2d 31 2c 20 69 4c 69 6d 69 74  mInt, -1, iLimit
def0: 2b 31 29 3b 0a 20 20 20 20 61 64 64 72 32 20 3d  +1);.    addr2 =
df00: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
df10: 70 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c  p(v, OP_Goto, 0,
df20: 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33   0);.    sqlite3
df30: 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20  VdbeJumpHere(v, 
df40: 61 64 64 72 31 29 3b 0a 20 20 20 20 73 71 6c 69  addr1);.    sqli
df50: 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
df60: 4f 50 5f 4d 65 6d 53 74 6f 72 65 2c 20 69 4c 69  OP_MemStore, iLi
df70: 6d 69 74 2b 31 2c 20 31 29 3b 0a 20 20 20 20 56  mit+1, 1);.    V
df80: 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22  dbeComment((v, "
df90: 23 20 4c 49 4d 49 54 2b 4f 46 46 53 45 54 22 29  # LIMIT+OFFSET")
dfa0: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
dfb0: 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64  beJumpHere(v, ad
dfc0: 64 72 32 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  dr2);.  }.}../*.
dfd0: 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 61 20 76 69  ** Allocate a vi
dfe0: 72 74 75 61 6c 20 69 6e 64 65 78 20 74 6f 20 75  rtual index to u
dff0: 73 65 20 66 6f 72 20 73 6f 72 74 69 6e 67 2e 0a  se for sorting..
e000: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63  */.static void c
e010: 72 65 61 74 65 53 6f 72 74 69 6e 67 49 6e 64 65  reateSortingInde
e020: 78 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  x(Parse *pParse,
e030: 20 53 65 6c 65 63 74 20 2a 70 2c 20 45 78 70 72   Select *p, Expr
e040: 4c 69 73 74 20 2a 70 4f 72 64 65 72 42 79 29 7b  List *pOrderBy){
e050: 0a 20 20 69 66 28 20 70 4f 72 64 65 72 42 79 20  .  if( pOrderBy 
e060: 29 7b 0a 20 20 20 20 69 6e 74 20 61 64 64 72 3b  ){.    int addr;
e070: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4f 72  .    assert( pOr
e080: 64 65 72 42 79 2d 3e 69 45 43 75 72 73 6f 72 3d  derBy->iECursor=
e090: 3d 30 20 29 3b 0a 20 20 20 20 70 4f 72 64 65 72  =0 );.    pOrder
e0a0: 42 79 2d 3e 69 45 43 75 72 73 6f 72 20 3d 20 70  By->iECursor = p
e0b0: 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20  Parse->nTab++;. 
e0c0: 20 20 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65     addr = sqlite
e0d0: 33 56 64 62 65 41 64 64 4f 70 28 70 50 61 72 73  3VdbeAddOp(pPars
e0e0: 65 2d 3e 70 56 64 62 65 2c 20 4f 50 5f 4f 70 65  e->pVdbe, OP_Ope
e0f0: 6e 45 70 68 65 6d 65 72 61 6c 2c 0a 20 20 20 20  nEphemeral,.    
e100: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e110: 20 20 20 20 20 20 20 20 70 4f 72 64 65 72 42 79          pOrderBy
e120: 2d 3e 69 45 43 75 72 73 6f 72 2c 20 70 4f 72 64  ->iECursor, pOrd
e130: 65 72 42 79 2d 3e 6e 45 78 70 72 2b 31 29 3b 0a  erBy->nExpr+1);.
e140: 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 61      assert( p->a
e150: 64 64 72 4f 70 65 6e 45 70 68 6d 5b 32 5d 20 3d  ddrOpenEphm[2] =
e160: 3d 20 2d 31 20 29 3b 0a 20 20 20 20 70 2d 3e 61  = -1 );.    p->a
e170: 64 64 72 4f 70 65 6e 45 70 68 6d 5b 32 5d 20 3d  ddrOpenEphm[2] =
e180: 20 61 64 64 72 3b 0a 20 20 7d 0a 7d 0a 0a 23 69   addr;.  }.}..#i
e190: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
e1a0: 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45 43  T_COMPOUND_SELEC
e1b0: 54 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  T./*.** Return t
e1c0: 68 65 20 61 70 70 72 6f 70 72 69 61 74 65 20 63  he appropriate c
e1d0: 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63  ollating sequenc
e1e0: 65 20 66 6f 72 20 74 68 65 20 69 43 6f 6c 2d 74  e for the iCol-t
e1f0: 68 20 63 6f 6c 75 6d 6e 20 6f 66 0a 2a 2a 20 74  h column of.** t
e200: 68 65 20 72 65 73 75 6c 74 20 73 65 74 20 66 6f  he result set fo
e210: 72 20 74 68 65 20 63 6f 6d 70 6f 75 6e 64 2d 73  r the compound-s
e220: 65 6c 65 63 74 20 73 74 61 74 65 6d 65 6e 74 20  elect statement 
e230: 22 70 22 2e 20 20 52 65 74 75 72 6e 20 4e 55 4c  "p".  Return NUL
e240: 4c 20 69 66 0a 2a 2a 20 74 68 65 20 63 6f 6c 75  L if.** the colu
e250: 6d 6e 20 68 61 73 20 6e 6f 20 64 65 66 61 75 6c  mn has no defaul
e260: 74 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75  t collating sequ
e270: 65 6e 63 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  ence..**.** The 
e280: 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e  collating sequen
e290: 63 65 20 66 6f 72 20 74 68 65 20 63 6f 6d 70 6f  ce for the compo
e2a0: 75 6e 64 20 73 65 6c 65 63 74 20 69 73 20 74 61  und select is ta
e2b0: 6b 65 6e 20 66 72 6f 6d 20 74 68 65 0a 2a 2a 20  ken from the.** 
e2c0: 6c 65 66 74 2d 6d 6f 73 74 20 74 65 72 6d 20 6f  left-most term o
e2d0: 66 20 74 68 65 20 73 65 6c 65 63 74 20 74 68 61  f the select tha
e2e0: 74 20 68 61 73 20 61 20 63 6f 6c 6c 61 74 69 6e  t has a collatin
e2f0: 67 20 73 65 71 75 65 6e 63 65 2e 0a 2a 2f 0a 73  g sequence..*/.s
e300: 74 61 74 69 63 20 43 6f 6c 6c 53 65 71 20 2a 6d  tatic CollSeq *m
e310: 75 6c 74 69 53 65 6c 65 63 74 43 6f 6c 6c 53 65  ultiSelectCollSe
e320: 71 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  q(Parse *pParse,
e330: 20 53 65 6c 65 63 74 20 2a 70 2c 20 69 6e 74 20   Select *p, int 
e340: 69 43 6f 6c 29 7b 0a 20 20 43 6f 6c 6c 53 65 71  iCol){.  CollSeq
e350: 20 2a 70 52 65 74 3b 0a 20 20 69 66 28 20 70 2d   *pRet;.  if( p-
e360: 3e 70 50 72 69 6f 72 20 29 7b 0a 20 20 20 20 70  >pPrior ){.    p
e370: 52 65 74 20 3d 20 6d 75 6c 74 69 53 65 6c 65 63  Ret = multiSelec
e380: 74 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c  tCollSeq(pParse,
e390: 20 70 2d 3e 70 50 72 69 6f 72 2c 20 69 43 6f 6c   p->pPrior, iCol
e3a0: 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
e3b0: 70 52 65 74 20 3d 20 30 3b 0a 20 20 7d 0a 20 20  pRet = 0;.  }.  
e3c0: 69 66 28 20 70 52 65 74 3d 3d 30 20 29 7b 0a 20  if( pRet==0 ){. 
e3d0: 20 20 20 70 52 65 74 20 3d 20 73 71 6c 69 74 65     pRet = sqlite
e3e0: 33 45 78 70 72 43 6f 6c 6c 53 65 71 28 70 50 61  3ExprCollSeq(pPa
e3f0: 72 73 65 2c 20 70 2d 3e 70 45 4c 69 73 74 2d 3e  rse, p->pEList->
e400: 61 5b 69 43 6f 6c 5d 2e 70 45 78 70 72 29 3b 0a  a[iCol].pExpr);.
e410: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 52 65    }.  return pRe
e420: 74 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53  t;.}.#endif /* S
e430: 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f 4d 50 4f  QLITE_OMIT_COMPO
e440: 55 4e 44 5f 53 45 4c 45 43 54 20 2a 2f 0a 0a 23  UND_SELECT */..#
e450: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
e460: 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45  IT_COMPOUND_SELE
e470: 43 54 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  CT./*.** This ro
e480: 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20  utine is called 
e490: 74 6f 20 70 72 6f 63 65 73 73 20 61 20 71 75 65  to process a que
e4a0: 72 79 20 74 68 61 74 20 69 73 20 72 65 61 6c 6c  ry that is reall
e4b0: 79 20 74 68 65 20 75 6e 69 6f 6e 0a 2a 2a 20 6f  y the union.** o
e4c0: 72 20 69 6e 74 65 72 73 65 63 74 69 6f 6e 20 6f  r intersection o
e4d0: 66 20 74 77 6f 20 6f 72 20 6d 6f 72 65 20 73 65  f two or more se
e4e0: 70 61 72 61 74 65 20 71 75 65 72 69 65 73 2e 0a  parate queries..
e4f0: 2a 2a 0a 2a 2a 20 22 70 22 20 70 6f 69 6e 74 73  **.** "p" points
e500: 20 74 6f 20 74 68 65 20 72 69 67 68 74 2d 6d 6f   to the right-mo
e510: 73 74 20 6f 66 20 74 68 65 20 74 77 6f 20 71 75  st of the two qu
e520: 65 72 69 65 73 2e 20 20 74 68 65 20 71 75 65 72  eries.  the quer
e530: 79 20 6f 6e 20 74 68 65 0a 2a 2a 20 6c 65 66 74  y on the.** left
e540: 20 69 73 20 70 2d 3e 70 50 72 69 6f 72 2e 20 20   is p->pPrior.  
e550: 54 68 65 20 6c 65 66 74 20 71 75 65 72 79 20 63  The left query c
e560: 6f 75 6c 64 20 61 6c 73 6f 20 62 65 20 61 20 63  ould also be a c
e570: 6f 6d 70 6f 75 6e 64 20 71 75 65 72 79 0a 2a 2a  ompound query.**
e580: 20 69 6e 20 77 68 69 63 68 20 63 61 73 65 20 74   in which case t
e590: 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c  his routine will
e5a0: 20 62 65 20 63 61 6c 6c 65 64 20 72 65 63 75 72   be called recur
e5b0: 73 69 76 65 6c 79 2e 20 0a 2a 2a 0a 2a 2a 20 54  sively. .**.** T
e5c0: 68 65 20 72 65 73 75 6c 74 73 20 6f 66 20 74 68  he results of th
e5d0: 65 20 74 6f 74 61 6c 20 71 75 65 72 79 20 61 72  e total query ar
e5e0: 65 20 74 6f 20 62 65 20 77 72 69 74 74 65 6e 20  e to be written 
e5f0: 69 6e 74 6f 20 61 20 64 65 73 74 69 6e 61 74 69  into a destinati
e600: 6f 6e 0a 2a 2a 20 6f 66 20 74 79 70 65 20 65 44  on.** of type eD
e610: 65 73 74 20 77 69 74 68 20 70 61 72 61 6d 65 74  est with paramet
e620: 65 72 20 69 50 61 72 6d 2e 0a 2a 2a 0a 2a 2a 20  er iParm..**.** 
e630: 45 78 61 6d 70 6c 65 20 31 3a 20 20 43 6f 6e 73  Example 1:  Cons
e640: 69 64 65 72 20 61 20 74 68 72 65 65 2d 77 61 79  ider a three-way
e650: 20 63 6f 6d 70 6f 75 6e 64 20 53 51 4c 20 73 74   compound SQL st
e660: 61 74 65 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 20  atement..**.**  
e670: 20 20 20 53 45 4c 45 43 54 20 61 20 46 52 4f 4d     SELECT a FROM
e680: 20 74 31 20 55 4e 49 4f 4e 20 53 45 4c 45 43 54   t1 UNION SELECT
e690: 20 62 20 46 52 4f 4d 20 74 32 20 55 4e 49 4f 4e   b FROM t2 UNION
e6a0: 20 53 45 4c 45 43 54 20 63 20 46 52 4f 4d 20 74   SELECT c FROM t
e6b0: 33 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 73 74 61  3.**.** This sta
e6c0: 74 65 6d 65 6e 74 20 69 73 20 70 61 72 73 65 64  tement is parsed
e6d0: 20 75 70 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a   up as follows:.
e6e0: 2a 2a 0a 2a 2a 20 20 20 20 20 53 45 4c 45 43 54  **.**     SELECT
e6f0: 20 63 20 46 52 4f 4d 20 74 33 0a 2a 2a 20 20 20   c FROM t3.**   
e700: 20 20 20 7c 0a 2a 2a 20 20 20 20 20 20 60 2d 2d     |.**      `--
e710: 2d 2d 2d 3e 20 20 53 45 4c 45 43 54 20 62 20 46  --->  SELECT b F
e720: 52 4f 4d 20 74 32 0a 2a 2a 20 20 20 20 20 20 20  ROM t2.**       
e730: 20 20 20 20 20 20 20 20 20 7c 0a 2a 2a 20 20 20           |.**   
e740: 20 20 20 20 20 20 20 20 20 20 20 20 20 60 2d 2d               `--
e750: 2d 2d 2d 2d 3e 20 20 53 45 4c 45 43 54 20 61 20  ---->  SELECT a 
e760: 46 52 4f 4d 20 74 31 0a 2a 2a 0a 2a 2a 20 54 68  FROM t1.**.** Th
e770: 65 20 61 72 72 6f 77 73 20 69 6e 20 74 68 65 20  e arrows in the 
e780: 64 69 61 67 72 61 6d 20 61 62 6f 76 65 20 72 65  diagram above re
e790: 70 72 65 73 65 6e 74 20 74 68 65 20 53 65 6c 65  present the Sele
e7a0: 63 74 2e 70 50 72 69 6f 72 20 70 6f 69 6e 74 65  ct.pPrior pointe
e7b0: 72 2e 0a 2a 2a 20 53 6f 20 69 66 20 74 68 69 73  r..** So if this
e7c0: 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c   routine is call
e7d0: 65 64 20 77 69 74 68 20 70 20 65 71 75 61 6c 20  ed with p equal 
e7e0: 74 6f 20 74 68 65 20 74 33 20 71 75 65 72 79 2c  to the t3 query,
e7f0: 20 74 68 65 6e 0a 2a 2a 20 70 50 72 69 6f 72 20   then.** pPrior 
e800: 77 69 6c 6c 20 62 65 20 74 68 65 20 74 32 20 71  will be the t2 q
e810: 75 65 72 79 2e 20 20 70 2d 3e 6f 70 20 77 69 6c  uery.  p->op wil
e820: 6c 20 62 65 20 54 4b 5f 55 4e 49 4f 4e 20 69 6e  l be TK_UNION in
e830: 20 74 68 69 73 20 63 61 73 65 2e 0a 2a 2a 0a 2a   this case..**.*
e840: 2a 20 4e 6f 74 69 63 65 20 74 68 61 74 20 62 65  * Notice that be
e850: 63 61 75 73 65 20 6f 66 20 74 68 65 20 77 61 79  cause of the way
e860: 20 53 51 4c 69 74 65 20 70 61 72 73 65 73 20 63   SQLite parses c
e870: 6f 6d 70 6f 75 6e 64 20 53 45 4c 45 43 54 73 2c  ompound SELECTs,
e880: 20 74 68 65 0a 2a 2a 20 69 6e 64 69 76 69 64 75   the.** individu
e890: 61 6c 20 73 65 6c 65 63 74 73 20 61 6c 77 61 79  al selects alway
e8a0: 73 20 67 72 6f 75 70 20 66 72 6f 6d 20 6c 65 66  s group from lef
e8b0: 74 20 74 6f 20 72 69 67 68 74 2e 0a 2a 2f 0a 73  t to right..*/.s
e8c0: 74 61 74 69 63 20 69 6e 74 20 6d 75 6c 74 69 53  tatic int multiS
e8d0: 65 6c 65 63 74 28 0a 20 20 50 61 72 73 65 20 2a  elect(.  Parse *
e8e0: 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 2f  pParse,        /
e8f0: 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78  * Parsing contex
e900: 74 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70  t */.  Select *p
e910: 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ,            /* 
e920: 54 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 20 6f  The right-most o
e930: 66 20 53 45 4c 45 43 54 73 20 74 6f 20 62 65 20  f SELECTs to be 
e940: 63 6f 64 65 64 20 2a 2f 0a 20 20 69 6e 74 20 65  coded */.  int e
e950: 44 65 73 74 2c 20 20 20 20 20 20 20 20 20 20 20  Dest,           
e960: 20 2f 2a 20 5c 5f 5f 5f 20 20 53 74 6f 72 65 20   /* \___  Store 
e970: 71 75 65 72 79 20 72 65 73 75 6c 74 73 20 61 73  query results as
e980: 20 73 70 65 63 69 66 69 65 64 20 2a 2f 0a 20 20   specified */.  
e990: 69 6e 74 20 69 50 61 72 6d 2c 20 20 20 20 20 20  int iParm,      
e9a0: 20 20 20 20 20 20 2f 2a 20 2f 20 20 20 20 20 62        /* /     b
e9b0: 79 20 74 68 65 73 65 20 74 77 6f 20 70 61 72 61  y these two para
e9c0: 6d 65 74 65 72 73 2e 20 20 20 20 20 20 20 20 20  meters.         
e9d0: 2a 2f 0a 20 20 63 68 61 72 20 2a 61 66 66 20 20  */.  char *aff  
e9e0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66             /* If
e9f0: 20 65 44 65 73 74 20 69 73 20 53 52 54 5f 55 6e   eDest is SRT_Un
ea00: 69 6f 6e 2c 20 74 68 65 20 61 66 66 69 6e 69 74  ion, the affinit
ea10: 79 20 73 74 72 69 6e 67 20 2a 2f 0a 29 7b 0a 20  y string */.){. 
ea20: 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
ea30: 5f 4f 4b 3b 20 20 20 2f 2a 20 53 75 63 63 65 73  _OK;   /* Succes
ea40: 73 20 63 6f 64 65 20 66 72 6f 6d 20 61 20 73 75  s code from a su
ea50: 62 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 53 65  broutine */.  Se
ea60: 6c 65 63 74 20 2a 70 50 72 69 6f 72 3b 20 20 20  lect *pPrior;   
ea70: 20 20 20 20 2f 2a 20 41 6e 6f 74 68 65 72 20 53      /* Another S
ea80: 45 4c 45 43 54 20 69 6d 6d 65 64 69 61 74 65 6c  ELECT immediatel
ea90: 79 20 74 6f 20 6f 75 72 20 6c 65 66 74 20 2a 2f  y to our left */
eaa0: 0a 20 20 56 64 62 65 20 2a 76 3b 20 20 20 20 20  .  Vdbe *v;     
eab0: 20 20 20 20 20 20 20 20 20 2f 2a 20 47 65 6e 65           /* Gene
eac0: 72 61 74 65 20 63 6f 64 65 20 74 6f 20 74 68 69  rate code to thi
ead0: 73 20 56 44 42 45 20 2a 2f 0a 20 20 69 6e 74 20  s VDBE */.  int 
eae0: 6e 43 6f 6c 3b 20 20 20 20 20 20 20 20 20 20 20  nCol;           
eaf0: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63    /* Number of c
eb00: 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20 72 65  olumns in the re
eb10: 73 75 6c 74 20 73 65 74 20 2a 2f 0a 20 20 45 78  sult set */.  Ex
eb20: 70 72 4c 69 73 74 20 2a 70 4f 72 64 65 72 42 79  prList *pOrderBy
eb30: 3b 20 20 20 2f 2a 20 54 68 65 20 4f 52 44 45 52  ;   /* The ORDER
eb40: 20 42 59 20 63 6c 61 75 73 65 20 6f 6e 20 70 20   BY clause on p 
eb50: 2a 2f 0a 20 20 69 6e 74 20 61 53 65 74 50 32 5b  */.  int aSetP2[
eb60: 32 5d 3b 20 20 20 20 20 20 20 20 2f 2a 20 53 65  2];        /* Se
eb70: 74 20 50 32 20 76 61 6c 75 65 20 6f 66 20 74 68  t P2 value of th
eb80: 65 73 65 20 6f 70 20 74 6f 20 6e 75 6d 62 65 72  ese op to number
eb90: 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 2a 2f 0a 20   of columns */. 
eba0: 20 69 6e 74 20 6e 53 65 74 50 32 20 3d 20 30 3b   int nSetP2 = 0;
ebb0: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
ebc0: 20 6f 66 20 73 6c 6f 74 73 20 69 6e 20 61 53 65   of slots in aSe
ebd0: 74 50 32 5b 5d 20 75 73 65 64 20 2a 2f 0a 0a 20  tP2[] used */.. 
ebe0: 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 68   /* Make sure th
ebf0: 65 72 65 20 69 73 20 6e 6f 20 4f 52 44 45 52 20  ere is no ORDER 
ec00: 42 59 20 6f 72 20 4c 49 4d 49 54 20 63 6c 61 75  BY or LIMIT clau
ec10: 73 65 20 6f 6e 20 70 72 69 6f 72 20 53 45 4c 45  se on prior SELE
ec20: 43 54 73 2e 20 20 4f 6e 6c 79 0a 20 20 2a 2a 20  CTs.  Only.  ** 
ec30: 74 68 65 20 6c 61 73 74 20 28 72 69 67 68 74 2d  the last (right-
ec40: 6d 6f 73 74 29 20 53 45 4c 45 43 54 20 69 6e 20  most) SELECT in 
ec50: 74 68 65 20 73 65 72 69 65 73 20 6d 61 79 20 68  the series may h
ec60: 61 76 65 20 61 6e 20 4f 52 44 45 52 20 42 59 20  ave an ORDER BY 
ec70: 6f 72 20 4c 49 4d 49 54 2e 0a 20 20 2a 2f 0a 20  or LIMIT..  */. 
ec80: 20 69 66 28 20 70 3d 3d 30 20 7c 7c 20 70 2d 3e   if( p==0 || p->
ec90: 70 50 72 69 6f 72 3d 3d 30 20 29 7b 0a 20 20 20  pPrior==0 ){.   
eca0: 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 67 6f 74   rc = 1;.    got
ecb0: 6f 20 6d 75 6c 74 69 5f 73 65 6c 65 63 74 5f 65  o multi_select_e
ecc0: 6e 64 3b 0a 20 20 7d 0a 20 20 70 50 72 69 6f 72  nd;.  }.  pPrior
ecd0: 20 3d 20 70 2d 3e 70 50 72 69 6f 72 3b 0a 20 20   = p->pPrior;.  
ece0: 61 73 73 65 72 74 28 20 70 50 72 69 6f 72 2d 3e  assert( pPrior->
ecf0: 70 52 69 67 68 74 6d 6f 73 74 21 3d 70 50 72 69  pRightmost!=pPri
ed00: 6f 72 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  or );.  assert( 
ed10: 70 50 72 69 6f 72 2d 3e 70 52 69 67 68 74 6d 6f  pPrior->pRightmo
ed20: 73 74 3d 3d 70 2d 3e 70 52 69 67 68 74 6d 6f 73  st==p->pRightmos
ed30: 74 20 29 3b 0a 20 20 69 66 28 20 70 50 72 69 6f  t );.  if( pPrio
ed40: 72 2d 3e 70 4f 72 64 65 72 42 79 20 29 7b 0a 20  r->pOrderBy ){. 
ed50: 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
ed60: 73 67 28 70 50 61 72 73 65 2c 22 4f 52 44 45 52  sg(pParse,"ORDER
ed70: 20 42 59 20 63 6c 61 75 73 65 20 73 68 6f 75 6c   BY clause shoul
ed80: 64 20 63 6f 6d 65 20 61 66 74 65 72 20 25 73 20  d come after %s 
ed90: 6e 6f 74 20 62 65 66 6f 72 65 22 2c 0a 20 20 20  not before",.   
eda0: 20 20 20 73 65 6c 65 63 74 4f 70 4e 61 6d 65 28     selectOpName(
edb0: 70 2d 3e 6f 70 29 29 3b 0a 20 20 20 20 72 63 20  p->op));.    rc 
edc0: 3d 20 31 3b 0a 20 20 20 20 67 6f 74 6f 20 6d 75  = 1;.    goto mu
edd0: 6c 74 69 5f 73 65 6c 65 63 74 5f 65 6e 64 3b 0a  lti_select_end;.
ede0: 20 20 7d 0a 20 20 69 66 28 20 70 50 72 69 6f 72    }.  if( pPrior
edf0: 2d 3e 70 4c 69 6d 69 74 20 29 7b 0a 20 20 20 20  ->pLimit ){.    
ee00: 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
ee10: 70 50 61 72 73 65 2c 22 4c 49 4d 49 54 20 63 6c  pParse,"LIMIT cl
ee20: 61 75 73 65 20 73 68 6f 75 6c 64 20 63 6f 6d 65  ause should come
ee30: 20 61 66 74 65 72 20 25 73 20 6e 6f 74 20 62 65   after %s not be
ee40: 66 6f 72 65 22 2c 0a 20 20 20 20 20 20 73 65 6c  fore",.      sel
ee50: 65 63 74 4f 70 4e 61 6d 65 28 70 2d 3e 6f 70 29  ectOpName(p->op)
ee60: 29 3b 0a 20 20 20 20 72 63 20 3d 20 31 3b 0a 20  );.    rc = 1;. 
ee70: 20 20 20 67 6f 74 6f 20 6d 75 6c 74 69 5f 73 65     goto multi_se
ee80: 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 7d 0a 0a 20  lect_end;.  }.. 
ee90: 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 77 65   /* Make sure we
eea0: 20 68 61 76 65 20 61 20 76 61 6c 69 64 20 71 75   have a valid qu
eeb0: 65 72 79 20 65 6e 67 69 6e 65 2e 20 20 49 66 20  ery engine.  If 
eec0: 6e 6f 74 2c 20 63 72 65 61 74 65 20 61 20 6e 65  not, create a ne
eed0: 77 20 6f 6e 65 2e 0a 20 20 2a 2f 0a 20 20 76 20  w one..  */.  v 
eee0: 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64 62 65  = sqlite3GetVdbe
eef0: 28 70 50 61 72 73 65 29 3b 0a 20 20 69 66 28 20  (pParse);.  if( 
ef00: 76 3d 3d 30 20 29 7b 0a 20 20 20 20 72 63 20 3d  v==0 ){.    rc =
ef10: 20 31 3b 0a 20 20 20 20 67 6f 74 6f 20 6d 75 6c   1;.    goto mul
ef20: 74 69 5f 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20  ti_select_end;. 
ef30: 20 7d 0a 0a 20 20 2f 2a 20 43 72 65 61 74 65 20   }..  /* Create 
ef40: 74 68 65 20 64 65 73 74 69 6e 61 74 69 6f 6e 20  the destination 
ef50: 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20  temporary table 
ef60: 69 66 20 6e 65 63 65 73 73 61 72 79 0a 20 20 2a  if necessary.  *
ef70: 2f 0a 20 20 69 66 28 20 65 44 65 73 74 3d 3d 53  /.  if( eDest==S
ef80: 52 54 5f 45 70 68 65 6d 54 61 62 20 29 7b 0a 20  RT_EphemTab ){. 
ef90: 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 45     assert( p->pE
efa0: 4c 69 73 74 20 29 3b 0a 20 20 20 20 61 73 73 65  List );.    asse
efb0: 72 74 28 20 6e 53 65 74 50 32 3c 73 69 7a 65 6f  rt( nSetP2<sizeo
efc0: 66 28 61 53 65 74 50 32 29 2f 73 69 7a 65 6f 66  f(aSetP2)/sizeof
efd0: 28 61 53 65 74 50 32 5b 30 5d 29 20 29 3b 0a 20  (aSetP2[0]) );. 
efe0: 20 20 20 61 53 65 74 50 32 5b 6e 53 65 74 50 32     aSetP2[nSetP2
eff0: 2b 2b 5d 20 3d 20 73 71 6c 69 74 65 33 56 64 62  ++] = sqlite3Vdb
f000: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4f 70 65  eAddOp(v, OP_Ope
f010: 6e 45 70 68 65 6d 65 72 61 6c 2c 20 69 50 61 72  nEphemeral, iPar
f020: 6d 2c 20 30 29 3b 0a 20 20 20 20 65 44 65 73 74  m, 0);.    eDest
f030: 20 3d 20 53 52 54 5f 54 61 62 6c 65 3b 0a 20 20   = SRT_Table;.  
f040: 7d 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65  }..  /* Generate
f050: 20 63 6f 64 65 20 66 6f 72 20 74 68 65 20 6c 65   code for the le
f060: 66 74 20 61 6e 64 20 72 69 67 68 74 20 53 45 4c  ft and right SEL
f070: 45 43 54 20 73 74 61 74 65 6d 65 6e 74 73 2e 0a  ECT statements..
f080: 20 20 2a 2f 0a 20 20 70 4f 72 64 65 72 42 79 20    */.  pOrderBy 
f090: 3d 20 70 2d 3e 70 4f 72 64 65 72 42 79 3b 0a 20  = p->pOrderBy;. 
f0a0: 20 73 77 69 74 63 68 28 20 70 2d 3e 6f 70 20 29   switch( p->op )
f0b0: 7b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 41 4c  {.    case TK_AL
f0c0: 4c 3a 20 7b 0a 20 20 20 20 20 20 69 66 28 20 70  L: {.      if( p
f0d0: 4f 72 64 65 72 42 79 3d 3d 30 20 29 7b 0a 20 20  OrderBy==0 ){.  
f0e0: 20 20 20 20 20 20 69 6e 74 20 61 64 64 72 20 3d        int addr =
f0f0: 20 30 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65   0;.        asse
f100: 72 74 28 20 21 70 50 72 69 6f 72 2d 3e 70 4c 69  rt( !pPrior->pLi
f110: 6d 69 74 20 29 3b 0a 20 20 20 20 20 20 20 20 70  mit );.        p
f120: 50 72 69 6f 72 2d 3e 70 4c 69 6d 69 74 20 3d 20  Prior->pLimit = 
f130: 70 2d 3e 70 4c 69 6d 69 74 3b 0a 20 20 20 20 20  p->pLimit;.     
f140: 20 20 20 70 50 72 69 6f 72 2d 3e 70 4f 66 66 73     pPrior->pOffs
f150: 65 74 20 3d 20 70 2d 3e 70 4f 66 66 73 65 74 3b  et = p->pOffset;
f160: 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71  .        rc = sq
f170: 6c 69 74 65 33 53 65 6c 65 63 74 28 70 50 61 72  lite3Select(pPar
f180: 73 65 2c 20 70 50 72 69 6f 72 2c 20 65 44 65 73  se, pPrior, eDes
f190: 74 2c 20 69 50 61 72 6d 2c 20 30 2c 20 30 2c 20  t, iParm, 0, 0, 
f1a0: 30 2c 20 61 66 66 29 3b 0a 20 20 20 20 20 20 20  0, aff);.       
f1b0: 20 70 2d 3e 70 4c 69 6d 69 74 20 3d 20 30 3b 0a   p->pLimit = 0;.
f1c0: 20 20 20 20 20 20 20 20 70 2d 3e 70 4f 66 66 73          p->pOffs
f1d0: 65 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  et = 0;.        
f1e0: 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20  if( rc ){.      
f1f0: 20 20 20 20 67 6f 74 6f 20 6d 75 6c 74 69 5f 73      goto multi_s
f200: 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 20  elect_end;.     
f210: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 70 2d 3e     }.        p->
f220: 70 50 72 69 6f 72 20 3d 20 30 3b 0a 20 20 20 20  pPrior = 0;.    
f230: 20 20 20 20 70 2d 3e 69 4c 69 6d 69 74 20 3d 20      p->iLimit = 
f240: 70 50 72 69 6f 72 2d 3e 69 4c 69 6d 69 74 3b 0a  pPrior->iLimit;.
f250: 20 20 20 20 20 20 20 20 70 2d 3e 69 4f 66 66 73          p->iOffs
f260: 65 74 20 3d 20 70 50 72 69 6f 72 2d 3e 69 4f 66  et = pPrior->iOf
f270: 66 73 65 74 3b 0a 20 20 20 20 20 20 20 20 69 66  fset;.        if
f280: 28 20 70 2d 3e 69 4c 69 6d 69 74 3e 3d 30 20 29  ( p->iLimit>=0 )
f290: 7b 0a 20 20 20 20 20 20 20 20 20 20 61 64 64 72  {.          addr
f2a0: 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   = sqlite3VdbeAd
f2b0: 64 4f 70 28 76 2c 20 4f 50 5f 49 66 4d 65 6d 5a  dOp(v, OP_IfMemZ
f2c0: 65 72 6f 2c 20 70 2d 3e 69 4c 69 6d 69 74 2c 20  ero, p->iLimit, 
f2d0: 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 56 64  0);.          Vd
f2e0: 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 23  beComment((v, "#
f2f0: 20 4a 75 6d 70 20 61 68 65 61 64 20 69 66 20 4c   Jump ahead if L
f300: 49 4d 49 54 20 72 65 61 63 68 65 64 22 29 29 3b  IMIT reached"));
f310: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
f320: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 53     rc = sqlite3S
f330: 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70 2c  elect(pParse, p,
f340: 20 65 44 65 73 74 2c 20 69 50 61 72 6d 2c 20 30   eDest, iParm, 0
f350: 2c 20 30 2c 20 30 2c 20 61 66 66 29 3b 0a 20 20  , 0, 0, aff);.  
f360: 20 20 20 20 20 20 70 2d 3e 70 50 72 69 6f 72 20        p->pPrior 
f370: 3d 20 70 50 72 69 6f 72 3b 0a 20 20 20 20 20 20  = pPrior;.      
f380: 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20    if( rc ){.    
f390: 20 20 20 20 20 20 67 6f 74 6f 20 6d 75 6c 74 69        goto multi
f3a0: 5f 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20  _select_end;.   
f3b0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69       }.        i
f3c0: 66 28 20 61 64 64 72 20 29 7b 0a 20 20 20 20 20  f( addr ){.     
f3d0: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
f3e0: 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72  JumpHere(v, addr
f3f0: 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
f400: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
f410: 20 20 7d 0a 20 20 20 20 20 20 2f 2a 20 46 6f 72    }.      /* For
f420: 20 55 4e 49 4f 4e 20 41 4c 4c 20 2e 2e 2e 20 4f   UNION ALL ... O
f430: 52 44 45 52 20 42 59 20 66 61 6c 6c 20 74 68 72  RDER BY fall thr
f440: 6f 75 67 68 20 74 6f 20 74 68 65 20 6e 65 78 74  ough to the next
f450: 20 63 61 73 65 20 2a 2f 0a 20 20 20 20 7d 0a 20   case */.    }. 
f460: 20 20 20 63 61 73 65 20 54 4b 5f 45 58 43 45 50     case TK_EXCEP
f470: 54 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 55  T:.    case TK_U
f480: 4e 49 4f 4e 3a 20 7b 0a 20 20 20 20 20 20 69 6e  NION: {.      in
f490: 74 20 75 6e 69 6f 6e 54 61 62 3b 20 20 20 20 2f  t unionTab;    /
f4a0: 2a 20 43 75 72 73 6f 72 20 6e 75 6d 62 65 72 20  * Cursor number 
f4b0: 6f 66 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79  of the temporary
f4c0: 20 74 61 62 6c 65 20 68 6f 6c 64 69 6e 67 20 72   table holding r
f4d0: 65 73 75 6c 74 20 2a 2f 0a 20 20 20 20 20 20 69  esult */.      i
f4e0: 6e 74 20 6f 70 20 3d 20 30 3b 20 20 20 20 20 20  nt op = 0;      
f4f0: 2f 2a 20 4f 6e 65 20 6f 66 20 74 68 65 20 53 52  /* One of the SR
f500: 54 5f 20 6f 70 65 72 61 74 69 6f 6e 73 20 74 6f  T_ operations to
f510: 20 61 70 70 6c 79 20 74 6f 20 73 65 6c 66 20 2a   apply to self *
f520: 2f 0a 20 20 20 20 20 20 69 6e 74 20 70 72 69 6f  /.      int prio
f530: 72 4f 70 3b 20 20 20 20 20 2f 2a 20 54 68 65 20  rOp;     /* The 
f540: 53 52 54 5f 20 6f 70 65 72 61 74 69 6f 6e 20 74  SRT_ operation t
f550: 6f 20 61 70 70 6c 79 20 74 6f 20 70 72 69 6f 72  o apply to prior
f560: 20 73 65 6c 65 63 74 73 20 2a 2f 0a 20 20 20 20   selects */.    
f570: 20 20 45 78 70 72 20 2a 70 4c 69 6d 69 74 2c 20    Expr *pLimit, 
f580: 2a 70 4f 66 66 73 65 74 3b 20 2f 2a 20 53 61 76  *pOffset; /* Sav
f590: 65 64 20 76 61 6c 75 65 73 20 6f 66 20 70 2d 3e  ed values of p->
f5a0: 6e 4c 69 6d 69 74 20 61 6e 64 20 70 2d 3e 6e 4f  nLimit and p->nO
f5b0: 66 66 73 65 74 20 2a 2f 0a 20 20 20 20 20 20 69  ffset */.      i
f5c0: 6e 74 20 61 64 64 72 3b 0a 0a 20 20 20 20 20 20  nt addr;..      
f5d0: 70 72 69 6f 72 4f 70 20 3d 20 70 2d 3e 6f 70 3d  priorOp = p->op=
f5e0: 3d 54 4b 5f 41 4c 4c 20 3f 20 53 52 54 5f 54 61  =TK_ALL ? SRT_Ta
f5f0: 62 6c 65 20 3a 20 53 52 54 5f 55 6e 69 6f 6e 3b  ble : SRT_Union;
f600: 0a 20 20 20 20 20 20 69 66 28 20 65 44 65 73 74  .      if( eDest
f610: 3d 3d 70 72 69 6f 72 4f 70 20 26 26 20 70 4f 72  ==priorOp && pOr
f620: 64 65 72 42 79 3d 3d 30 20 26 26 20 21 70 2d 3e  derBy==0 && !p->
f630: 70 4c 69 6d 69 74 20 26 26 20 21 70 2d 3e 70 4f  pLimit && !p->pO
f640: 66 66 73 65 74 20 29 7b 0a 20 20 20 20 20 20 20  ffset ){.       
f650: 20 2f 2a 20 57 65 20 63 61 6e 20 72 65 75 73 65   /* We can reuse
f660: 20 61 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62   a temporary tab
f670: 6c 65 20 67 65 6e 65 72 61 74 65 64 20 62 79 20  le generated by 
f680: 61 20 53 45 4c 45 43 54 20 74 6f 20 6f 75 72 0a  a SELECT to our.
f690: 20 20 20 20 20 20 20 20 2a 2a 20 72 69 67 68 74          ** right
f6a0: 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20  ..        */.   
f6b0: 20 20 20 20 20 75 6e 69 6f 6e 54 61 62 20 3d 20       unionTab = 
f6c0: 69 50 61 72 6d 3b 0a 20 20 20 20 20 20 7d 65 6c  iParm;.      }el
f6d0: 73 65 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 57  se{.        /* W
f6e0: 65 20 77 69 6c 6c 20 6e 65 65 64 20 74 6f 20 63  e will need to c
f6f0: 72 65 61 74 65 20 6f 75 72 20 6f 77 6e 20 74 65  reate our own te
f700: 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20 74 6f  mporary table to
f710: 20 68 6f 6c 64 20 74 68 65 0a 20 20 20 20 20 20   hold the.      
f720: 20 20 2a 2a 20 69 6e 74 65 72 6d 65 64 69 61 74    ** intermediat
f730: 65 20 72 65 73 75 6c 74 73 2e 0a 20 20 20 20 20  e results..     
f740: 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 75 6e     */.        un
f750: 69 6f 6e 54 61 62 20 3d 20 70 50 61 72 73 65 2d  ionTab = pParse-
f760: 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20 20 20 20  >nTab++;.       
f770: 20 69 66 28 20 70 72 6f 63 65 73 73 43 6f 6d 70   if( processComp
f780: 6f 75 6e 64 4f 72 64 65 72 42 79 28 70 50 61 72  oundOrderBy(pPar
f790: 73 65 2c 20 70 2c 20 75 6e 69 6f 6e 54 61 62 29  se, p, unionTab)
f7a0: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63   ){.          rc
f7b0: 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20   = 1;.          
f7c0: 67 6f 74 6f 20 6d 75 6c 74 69 5f 73 65 6c 65 63  goto multi_selec
f7d0: 74 5f 65 6e 64 3b 0a 20 20 20 20 20 20 20 20 7d  t_end;.        }
f7e0: 0a 20 20 20 20 20 20 20 20 61 64 64 72 20 3d 20  .        addr = 
f7f0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
f800: 28 76 2c 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d  (v, OP_OpenEphem
f810: 65 72 61 6c 2c 20 75 6e 69 6f 6e 54 61 62 2c 20  eral, unionTab, 
f820: 30 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  0);.        if( 
f830: 70 72 69 6f 72 4f 70 3d 3d 53 52 54 5f 54 61 62  priorOp==SRT_Tab
f840: 6c 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  le ){.          
f850: 61 73 73 65 72 74 28 20 6e 53 65 74 50 32 3c 73  assert( nSetP2<s
f860: 69 7a 65 6f 66 28 61 53 65 74 50 32 29 2f 73 69  izeof(aSetP2)/si
f870: 7a 65 6f 66 28 61 53 65 74 50 32 5b 30 5d 29 20  zeof(aSetP2[0]) 
f880: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 61 53 65  );.          aSe
f890: 74 50 32 5b 6e 53 65 74 50 32 2b 2b 5d 20 3d 20  tP2[nSetP2++] = 
f8a0: 61 64 64 72 3b 0a 20 20 20 20 20 20 20 20 7d 65  addr;.        }e
f8b0: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 61  lse{.          a
f8c0: 73 73 65 72 74 28 20 70 2d 3e 61 64 64 72 4f 70  ssert( p->addrOp
f8d0: 65 6e 45 70 68 6d 5b 30 5d 20 3d 3d 20 2d 31 20  enEphm[0] == -1 
f8e0: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e  );.          p->
f8f0: 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b 30 5d 20  addrOpenEphm[0] 
f900: 3d 20 61 64 64 72 3b 0a 20 20 20 20 20 20 20 20  = addr;.        
f910: 20 20 70 2d 3e 70 52 69 67 68 74 6d 6f 73 74 2d    p->pRightmost-
f920: 3e 75 73 65 73 45 70 68 6d 20 3d 20 31 3b 0a 20  >usesEphm = 1;. 
f930: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
f940: 20 63 72 65 61 74 65 53 6f 72 74 69 6e 67 49 6e   createSortingIn
f950: 64 65 78 28 70 50 61 72 73 65 2c 20 70 2c 20 70  dex(pParse, p, p
f960: 4f 72 64 65 72 42 79 29 3b 0a 20 20 20 20 20 20  OrderBy);.      
f970: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 45 4c    assert( p->pEL
f980: 69 73 74 20 29 3b 0a 20 20 20 20 20 20 7d 0a 0a  ist );.      }..
f990: 20 20 20 20 20 20 2f 2a 20 43 6f 64 65 20 74 68        /* Code th
f9a0: 65 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  e SELECT stateme
f9b0: 6e 74 73 20 74 6f 20 6f 75 72 20 6c 65 66 74 0a  nts to our left.
f9c0: 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 61        */.      a
f9d0: 73 73 65 72 74 28 20 21 70 50 72 69 6f 72 2d 3e  ssert( !pPrior->
f9e0: 70 4f 72 64 65 72 42 79 20 29 3b 0a 20 20 20 20  pOrderBy );.    
f9f0: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 53 65    rc = sqlite3Se
fa00: 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70 50 72  lect(pParse, pPr
fa10: 69 6f 72 2c 20 70 72 69 6f 72 4f 70 2c 20 75 6e  ior, priorOp, un
fa20: 69 6f 6e 54 61 62 2c 20 30 2c 20 30 2c 20 30 2c  ionTab, 0, 0, 0,
fa30: 20 61 66 66 29 3b 0a 20 20 20 20 20 20 69 66 28   aff);.      if(
fa40: 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20 67   rc ){.        g
fa50: 6f 74 6f 20 6d 75 6c 74 69 5f 73 65 6c 65 63 74  oto multi_select
fa60: 5f 65 6e 64 3b 0a 20 20 20 20 20 20 7d 0a 0a 20  _end;.      }.. 
fa70: 20 20 20 20 20 2f 2a 20 43 6f 64 65 20 74 68 65       /* Code the
fa80: 20 63 75 72 72 65 6e 74 20 53 45 4c 45 43 54 20   current SELECT 
fa90: 73 74 61 74 65 6d 65 6e 74 0a 20 20 20 20 20 20  statement.      
faa0: 2a 2f 0a 20 20 20 20 20 20 73 77 69 74 63 68 28  */.      switch(
fab0: 20 70 2d 3e 6f 70 20 29 7b 0a 20 20 20 20 20 20   p->op ){.      
fac0: 20 20 20 63 61 73 65 20 54 4b 5f 45 58 43 45 50     case TK_EXCEP
fad0: 54 3a 20 20 6f 70 20 3d 20 53 52 54 5f 45 78 63  T:  op = SRT_Exc
fae0: 65 70 74 3b 20 20 20 62 72 65 61 6b 3b 0a 20 20  ept;   break;.  
faf0: 20 20 20 20 20 20 20 63 61 73 65 20 54 4b 5f 55         case TK_U
fb00: 4e 49 4f 4e 3a 20 20 20 6f 70 20 3d 20 53 52 54  NION:   op = SRT
fb10: 5f 55 6e 69 6f 6e 3b 20 20 20 20 62 72 65 61 6b  _Union;    break
fb20: 3b 0a 20 20 20 20 20 20 20 20 20 63 61 73 65 20  ;.         case 
fb30: 54 4b 5f 41 4c 4c 3a 20 20 20 20 20 6f 70 20 3d  TK_ALL:     op =
fb40: 20 53 52 54 5f 54 61 62 6c 65 3b 20 20 20 20 62   SRT_Table;    b
fb50: 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  reak;.      }.  
fb60: 20 20 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d 20      p->pPrior = 
fb70: 30 3b 0a 20 20 20 20 20 20 70 2d 3e 70 4f 72 64  0;.      p->pOrd
fb80: 65 72 42 79 20 3d 20 30 3b 0a 20 20 20 20 20 20  erBy = 0;.      
fb90: 70 2d 3e 64 69 73 61 6c 6c 6f 77 4f 72 64 65 72  p->disallowOrder
fba0: 42 79 20 3d 20 70 4f 72 64 65 72 42 79 21 3d 30  By = pOrderBy!=0
fbb0: 3b 0a 20 20 20 20 20 20 70 4c 69 6d 69 74 20 3d  ;.      pLimit =
fbc0: 20 70 2d 3e 70 4c 69 6d 69 74 3b 0a 20 20 20 20   p->pLimit;.    
fbd0: 20 20 70 2d 3e 70 4c 69 6d 69 74 20 3d 20 30 3b    p->pLimit = 0;
fbe0: 0a 20 20 20 20 20 20 70 4f 66 66 73 65 74 20 3d  .      pOffset =
fbf0: 20 70 2d 3e 70 4f 66 66 73 65 74 3b 0a 20 20 20   p->pOffset;.   
fc00: 20 20 20 70 2d 3e 70 4f 66 66 73 65 74 20 3d 20     p->pOffset = 
fc10: 30 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  0;.      rc = sq
fc20: 6c 69 74 65 33 53 65 6c 65 63 74 28 70 50 61 72  lite3Select(pPar
fc30: 73 65 2c 20 70 2c 20 6f 70 2c 20 75 6e 69 6f 6e  se, p, op, union
fc40: 54 61 62 2c 20 30 2c 20 30 2c 20 30 2c 20 61 66  Tab, 0, 0, 0, af
fc50: 66 29 3b 0a 20 20 20 20 20 20 2f 2a 20 51 75 65  f);.      /* Que
fc60: 72 79 20 66 6c 61 74 74 65 6e 69 6e 67 20 69 6e  ry flattening in
fc70: 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28 29   sqlite3Select()
fc80: 20 6d 69 67 68 74 20 72 65 66 69 6c 6c 20 70 2d   might refill p-
fc90: 3e 70 4f 72 64 65 72 42 79 2e 0a 20 20 20 20 20  >pOrderBy..     
fca0: 20 2a 2a 20 42 65 20 73 75 72 65 20 74 6f 20 64   ** Be sure to d
fcb0: 65 6c 65 74 65 20 70 2d 3e 70 4f 72 64 65 72 42  elete p->pOrderB
fcc0: 79 2c 20 74 68 65 72 65 66 6f 72 65 2c 20 74 6f  y, therefore, to
fcd0: 20 61 76 6f 69 64 20 61 20 6d 65 6d 6f 72 79 20   avoid a memory 
fce0: 6c 65 61 6b 2e 20 2a 2f 0a 20 20 20 20 20 20 73  leak. */.      s
fcf0: 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 65  qlite3ExprListDe
fd00: 6c 65 74 65 28 70 2d 3e 70 4f 72 64 65 72 42 79  lete(p->pOrderBy
fd10: 29 3b 0a 20 20 20 20 20 20 70 2d 3e 70 50 72 69  );.      p->pPri
fd20: 6f 72 20 3d 20 70 50 72 69 6f 72 3b 0a 20 20 20  or = pPrior;.   
fd30: 20 20 20 70 2d 3e 70 4f 72 64 65 72 42 79 20 3d     p->pOrderBy =
fd40: 20 70 4f 72 64 65 72 42 79 3b 0a 20 20 20 20 20   pOrderBy;.     
fd50: 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65   sqlite3ExprDele
fd60: 74 65 28 70 2d 3e 70 4c 69 6d 69 74 29 3b 0a 20  te(p->pLimit);. 
fd70: 20 20 20 20 20 70 2d 3e 70 4c 69 6d 69 74 20 3d       p->pLimit =
fd80: 20 70 4c 69 6d 69 74 3b 0a 20 20 20 20 20 20 70   pLimit;.      p
fd90: 2d 3e 70 4f 66 66 73 65 74 20 3d 20 70 4f 66 66  ->pOffset = pOff
fda0: 73 65 74 3b 0a 20 20 20 20 20 20 70 2d 3e 69 4c  set;.      p->iL
fdb0: 69 6d 69 74 20 3d 20 2d 31 3b 0a 20 20 20 20 20  imit = -1;.     
fdc0: 20 70 2d 3e 69 4f 66 66 73 65 74 20 3d 20 2d 31   p->iOffset = -1
fdd0: 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 20 29  ;.      if( rc )
fde0: 7b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 6d  {.        goto m
fdf0: 75 6c 74 69 5f 73 65 6c 65 63 74 5f 65 6e 64 3b  ulti_select_end;
fe00: 0a 20 20 20 20 20 20 7d 0a 0a 0a 20 20 20 20 20  .      }...     
fe10: 20 2f 2a 20 43 6f 6e 76 65 72 74 20 74 68 65 20   /* Convert the 
fe20: 64 61 74 61 20 69 6e 20 74 68 65 20 74 65 6d 70  data in the temp
fe30: 6f 72 61 72 79 20 74 61 62 6c 65 20 69 6e 74 6f  orary table into
fe40: 20 77 68 61 74 65 76 65 72 20 66 6f 72 6d 0a 20   whatever form. 
fe50: 20 20 20 20 20 2a 2a 20 69 74 20 69 73 20 74 68       ** it is th
fe60: 61 74 20 77 65 20 63 75 72 72 65 6e 74 6c 79 20  at we currently 
fe70: 6e 65 65 64 2e 0a 20 20 20 20 20 20 2a 2f 20 20  need..      */  
fe80: 20 20 20 20 0a 20 20 20 20 20 20 69 66 28 20 65      .      if( e
fe90: 44 65 73 74 21 3d 70 72 69 6f 72 4f 70 20 7c 7c  Dest!=priorOp ||
fea0: 20 75 6e 69 6f 6e 54 61 62 21 3d 69 50 61 72 6d   unionTab!=iParm
feb0: 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20   ){.        int 
fec0: 69 43 6f 6e 74 2c 20 69 42 72 65 61 6b 2c 20 69  iCont, iBreak, i
fed0: 53 74 61 72 74 3b 0a 20 20 20 20 20 20 20 20 61  Start;.        a
fee0: 73 73 65 72 74 28 20 70 2d 3e 70 45 4c 69 73 74  ssert( p->pEList
fef0: 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20   );.        if( 
ff00: 65 44 65 73 74 3d 3d 53 52 54 5f 43 61 6c 6c 62  eDest==SRT_Callb
ff10: 61 63 6b 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ack ){.         
ff20: 20 53 65 6c 65 63 74 20 2a 70 46 69 72 73 74 20   Select *pFirst 
ff30: 3d 20 70 3b 0a 20 20 20 20 20 20 20 20 20 20 77  = p;.          w
ff40: 68 69 6c 65 28 20 70 46 69 72 73 74 2d 3e 70 50  hile( pFirst->pP
ff50: 72 69 6f 72 20 29 20 70 46 69 72 73 74 20 3d 20  rior ) pFirst = 
ff60: 70 46 69 72 73 74 2d 3e 70 50 72 69 6f 72 3b 0a  pFirst->pPrior;.
ff70: 20 20 20 20 20 20 20 20 20 20 67 65 6e 65 72 61            genera
ff80: 74 65 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 70 50  teColumnNames(pP
ff90: 61 72 73 65 2c 20 30 2c 20 70 46 69 72 73 74 2d  arse, 0, pFirst-
ffa0: 3e 70 45 4c 69 73 74 29 3b 0a 20 20 20 20 20 20  >pEList);.      
ffb0: 20 20 7d 0a 20 20 20 20 20 20 20 20 69 42 72 65    }.        iBre
ffc0: 61 6b 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  ak = sqlite3Vdbe
ffd0: 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20  MakeLabel(v);.  
ffe0: 20 20 20 20 20 20 69 43 6f 6e 74 20 3d 20 73 71        iCont = sq
fff0: 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62  lite3VdbeMakeLab
10000 65 6c 28 76 29 3b 0a 20 20 20 20 20 20 20 20 63  el(v);.        c
10010 6f 6d 70 75 74 65 4c 69 6d 69 74 52 65 67 69 73  omputeLimitRegis
10020 74 65 72 73 28 70 50 61 72 73 65 2c 20 70 2c 20  ters(pParse, p, 
10030 69 42 72 65 61 6b 29 3b 0a 20 20 20 20 20 20 20  iBreak);.       
10040 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
10050 70 28 76 2c 20 4f 50 5f 52 65 77 69 6e 64 2c 20  p(v, OP_Rewind, 
10060 75 6e 69 6f 6e 54 61 62 2c 20 69 42 72 65 61 6b  unionTab, iBreak
10070 29 3b 0a 20 20 20 20 20 20 20 20 69 53 74 61 72  );.        iStar
10080 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43  t = sqlite3VdbeC
10090 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 20  urrentAddr(v);. 
100a0 20 20 20 20 20 20 20 72 63 20 3d 20 73 65 6c 65         rc = sele
100b0 63 74 49 6e 6e 65 72 4c 6f 6f 70 28 70 50 61 72  ctInnerLoop(pPar
100c0 73 65 2c 20 70 2c 20 70 2d 3e 70 45 4c 69 73 74  se, p, p->pEList
100d0 2c 20 75 6e 69 6f 6e 54 61 62 2c 20 70 2d 3e 70  , unionTab, p->p
100e0 45 4c 69 73 74 2d 3e 6e 45 78 70 72 2c 0a 20 20  EList->nExpr,.  
100f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10100 20 20 20 20 20 20 20 20 20 20 20 70 4f 72 64 65             pOrde
10110 72 42 79 2c 20 2d 31 2c 20 65 44 65 73 74 2c 20  rBy, -1, eDest, 
10120 69 50 61 72 6d 2c 20 0a 20 20 20 20 20 20 20 20  iParm, .        
10130 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10140 20 20 20 20 20 69 43 6f 6e 74 2c 20 69 42 72 65       iCont, iBre
10150 61 6b 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20  ak, 0);.        
10160 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20  if( rc ){.      
10170 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20      rc = 1;.    
10180 20 20 20 20 20 20 67 6f 74 6f 20 6d 75 6c 74 69        goto multi
10190 5f 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20  _select_end;.   
101a0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 73       }.        s
101b0 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76  qlite3VdbeResolv
101c0 65 4c 61 62 65 6c 28 76 2c 20 69 43 6f 6e 74 29  eLabel(v, iCont)
101d0 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
101e0 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
101f0 5f 4e 65 78 74 2c 20 75 6e 69 6f 6e 54 61 62 2c  _Next, unionTab,
10200 20 69 53 74 61 72 74 29 3b 0a 20 20 20 20 20 20   iStart);.      
10210 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73    sqlite3VdbeRes
10220 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 69 42 72  olveLabel(v, iBr
10230 65 61 6b 29 3b 0a 20 20 20 20 20 20 20 20 73 71  eak);.        sq
10240 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
10250 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 75 6e 69 6f  , OP_Close, unio
10260 6e 54 61 62 2c 20 30 29 3b 0a 20 20 20 20 20 20  nTab, 0);.      
10270 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  }.      break;. 
10280 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b     }.    case TK
10290 5f 49 4e 54 45 52 53 45 43 54 3a 20 7b 0a 20 20  _INTERSECT: {.  
102a0 20 20 20 20 69 6e 74 20 74 61 62 31 2c 20 74 61      int tab1, ta
102b0 62 32 3b 0a 20 20 20 20 20 20 69 6e 74 20 69 43  b2;.      int iC
102c0 6f 6e 74 2c 20 69 42 72 65 61 6b 2c 20 69 53 74  ont, iBreak, iSt
102d0 61 72 74 3b 0a 20 20 20 20 20 20 45 78 70 72 20  art;.      Expr 
102e0 2a 70 4c 69 6d 69 74 2c 20 2a 70 4f 66 66 73 65  *pLimit, *pOffse
102f0 74 3b 0a 20 20 20 20 20 20 69 6e 74 20 61 64 64  t;.      int add
10300 72 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 49 4e 54  r;..      /* INT
10310 45 52 53 45 43 54 20 69 73 20 64 69 66 66 65 72  ERSECT is differ
10320 65 6e 74 20 66 72 6f 6d 20 74 68 65 20 6f 74 68  ent from the oth
10330 65 72 73 20 73 69 6e 63 65 20 69 74 20 72 65 71  ers since it req
10340 75 69 72 65 73 0a 20 20 20 20 20 20 2a 2a 20 74  uires.      ** t
10350 77 6f 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62  wo temporary tab
10360 6c 65 73 2e 20 20 48 65 6e 63 65 20 69 74 20 68  les.  Hence it h
10370 61 73 20 69 74 73 20 6f 77 6e 20 63 61 73 65 2e  as its own case.
10380 20 20 42 65 67 69 6e 0a 20 20 20 20 20 20 2a 2a    Begin.      **
10390 20 62 79 20 61 6c 6c 6f 63 61 74 69 6e 67 20 74   by allocating t
103a0 68 65 20 74 61 62 6c 65 73 20 77 65 20 77 69 6c  he tables we wil
103b0 6c 20 6e 65 65 64 2e 0a 20 20 20 20 20 20 2a 2f  l need..      */
103c0 0a 20 20 20 20 20 20 74 61 62 31 20 3d 20 70 50  .      tab1 = pP
103d0 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20  arse->nTab++;.  
103e0 20 20 20 20 74 61 62 32 20 3d 20 70 50 61 72 73      tab2 = pPars
103f0 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20 20  e->nTab++;.     
10400 20 69 66 28 20 70 72 6f 63 65 73 73 43 6f 6d 70   if( processComp
10410 6f 75 6e 64 4f 72 64 65 72 42 79 28 70 50 61 72  oundOrderBy(pPar
10420 73 65 2c 20 70 2c 20 74 61 62 31 29 20 29 7b 0a  se, p, tab1) ){.
10430 20 20 20 20 20 20 20 20 72 63 20 3d 20 31 3b 0a          rc = 1;.
10440 20 20 20 20 20 20 20 20 67 6f 74 6f 20 6d 75 6c          goto mul
10450 74 69 5f 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20  ti_select_end;. 
10460 20 20 20 20 20 7d 0a 20 20 20 20 20 20 63 72 65       }.      cre
10470 61 74 65 53 6f 72 74 69 6e 67 49 6e 64 65 78 28  ateSortingIndex(
10480 70 50 61 72 73 65 2c 20 70 2c 20 70 4f 72 64 65  pParse, p, pOrde
10490 72 42 79 29 3b 0a 0a 20 20 20 20 20 20 61 64 64  rBy);..      add
104a0 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41  r = sqlite3VdbeA
104b0 64 64 4f 70 28 76 2c 20 4f 50 5f 4f 70 65 6e 45  ddOp(v, OP_OpenE
104c0 70 68 65 6d 65 72 61 6c 2c 20 74 61 62 31 2c 20  phemeral, tab1, 
104d0 30 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  0);.      assert
104e0 28 20 70 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68  ( p->addrOpenEph
104f0 6d 5b 30 5d 20 3d 3d 20 2d 31 20 29 3b 0a 20 20  m[0] == -1 );.  
10500 20 20 20 20 70 2d 3e 61 64 64 72 4f 70 65 6e 45      p->addrOpenE
10510 70 68 6d 5b 30 5d 20 3d 20 61 64 64 72 3b 0a 20  phm[0] = addr;. 
10520 20 20 20 20 20 70 2d 3e 70 52 69 67 68 74 6d 6f       p->pRightmo
10530 73 74 2d 3e 75 73 65 73 45 70 68 6d 20 3d 20 31  st->usesEphm = 1
10540 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
10550 70 2d 3e 70 45 4c 69 73 74 20 29 3b 0a 0a 20 20  p->pEList );..  
10560 20 20 20 20 2f 2a 20 43 6f 64 65 20 74 68 65 20      /* Code the 
10570 53 45 4c 45 43 54 73 20 74 6f 20 6f 75 72 20 6c  SELECTs to our l
10580 65 66 74 20 69 6e 74 6f 20 74 65 6d 70 6f 72 61  eft into tempora
10590 72 79 20 74 61 62 6c 65 20 22 74 61 62 31 22 2e  ry table "tab1".
105a0 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
105b0 72 63 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65  rc = sqlite3Sele
105c0 63 74 28 70 50 61 72 73 65 2c 20 70 50 72 69 6f  ct(pParse, pPrio
105d0 72 2c 20 53 52 54 5f 55 6e 69 6f 6e 2c 20 74 61  r, SRT_Union, ta
105e0 62 31 2c 20 30 2c 20 30 2c 20 30 2c 20 61 66 66  b1, 0, 0, 0, aff
105f0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 20  );.      if( rc 
10600 29 7b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20  ){.        goto 
10610 6d 75 6c 74 69 5f 73 65 6c 65 63 74 5f 65 6e 64  multi_select_end
10620 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20  ;.      }..     
10630 20 2f 2a 20 43 6f 64 65 20 74 68 65 20 63 75 72   /* Code the cur
10640 72 65 6e 74 20 53 45 4c 45 43 54 20 69 6e 74 6f  rent SELECT into
10650 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65   temporary table
10660 20 22 74 61 62 32 22 0a 20 20 20 20 20 20 2a 2f   "tab2".      */
10670 0a 20 20 20 20 20 20 61 64 64 72 20 3d 20 73 71  .      addr = sq
10680 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
10690 2c 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72  , OP_OpenEphemer
106a0 61 6c 2c 20 74 61 62 32 2c 20 30 29 3b 0a 20 20  al, tab2, 0);.  
106b0 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 61      assert( p->a
106c0 64 64 72 4f 70 65 6e 45 70 68 6d 5b 31 5d 20 3d  ddrOpenEphm[1] =
106d0 3d 20 2d 31 20 29 3b 0a 20 20 20 20 20 20 70 2d  = -1 );.      p-
106e0 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b 31 5d  >addrOpenEphm[1]
106f0 20 3d 20 61 64 64 72 3b 0a 20 20 20 20 20 20 70   = addr;.      p
10700 2d 3e 70 50 72 69 6f 72 20 3d 20 30 3b 0a 20 20  ->pPrior = 0;.  
10710 20 20 20 20 70 4c 69 6d 69 74 20 3d 20 70 2d 3e      pLimit = p->
10720 70 4c 69 6d 69 74 3b 0a 20 20 20 20 20 20 70 2d  pLimit;.      p-
10730 3e 70 4c 69 6d 69 74 20 3d 20 30 3b 0a 20 20 20  >pLimit = 0;.   
10740 20 20 20 70 4f 66 66 73 65 74 20 3d 20 70 2d 3e     pOffset = p->
10750 70 4f 66 66 73 65 74 3b 0a 20 20 20 20 20 20 70  pOffset;.      p
10760 2d 3e 70 4f 66 66 73 65 74 20 3d 20 30 3b 0a 20  ->pOffset = 0;. 
10770 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
10780 33 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20  3Select(pParse, 
10790 70 2c 20 53 52 54 5f 55 6e 69 6f 6e 2c 20 74 61  p, SRT_Union, ta
107a0 62 32 2c 20 30 2c 20 30 2c 20 30 2c 20 61 66 66  b2, 0, 0, 0, aff
107b0 29 3b 0a 20 20 20 20 20 20 70 2d 3e 70 50 72 69  );.      p->pPri
107c0 6f 72 20 3d 20 70 50 72 69 6f 72 3b 0a 20 20 20  or = pPrior;.   
107d0 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65     sqlite3ExprDe
107e0 6c 65 74 65 28 70 2d 3e 70 4c 69 6d 69 74 29 3b  lete(p->pLimit);
107f0 0a 20 20 20 20 20 20 70 2d 3e 70 4c 69 6d 69 74  .      p->pLimit
10800 20 3d 20 70 4c 69 6d 69 74 3b 0a 20 20 20 20 20   = pLimit;.     
10810 20 70 2d 3e 70 4f 66 66 73 65 74 20 3d 20 70 4f   p->pOffset = pO
10820 66 66 73 65 74 3b 0a 20 20 20 20 20 20 69 66 28  ffset;.      if(
10830 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20 67   rc ){.        g
10840 6f 74 6f 20 6d 75 6c 74 69 5f 73 65 6c 65 63 74  oto multi_select
10850 5f 65 6e 64 3b 0a 20 20 20 20 20 20 7d 0a 0a 20  _end;.      }.. 
10860 20 20 20 20 20 2f 2a 20 47 65 6e 65 72 61 74 65       /* Generate
10870 20 63 6f 64 65 20 74 6f 20 74 61 6b 65 20 74 68   code to take th
10880 65 20 69 6e 74 65 72 73 65 63 74 69 6f 6e 20 6f  e intersection o
10890 66 20 74 68 65 20 74 77 6f 20 74 65 6d 70 6f 72  f the two tempor
108a0 61 72 79 0a 20 20 20 20 20 20 2a 2a 20 74 61 62  ary.      ** tab
108b0 6c 65 73 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  les..      */.  
108c0 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70      assert( p->p
108d0 45 4c 69 73 74 20 29 3b 0a 20 20 20 20 20 20 69  EList );.      i
108e0 66 28 20 65 44 65 73 74 3d 3d 53 52 54 5f 43 61  f( eDest==SRT_Ca
108f0 6c 6c 62 61 63 6b 20 29 7b 0a 20 20 20 20 20 20  llback ){.      
10900 20 20 53 65 6c 65 63 74 20 2a 70 46 69 72 73 74    Select *pFirst
10910 20 3d 20 70 3b 0a 20 20 20 20 20 20 20 20 77 68   = p;.        wh
10920 69 6c 65 28 20 70 46 69 72 73 74 2d 3e 70 50 72  ile( pFirst->pPr
10930 69 6f 72 20 29 20 70 46 69 72 73 74 20 3d 20 70  ior ) pFirst = p
10940 46 69 72 73 74 2d 3e 70 50 72 69 6f 72 3b 0a 20  First->pPrior;. 
10950 20 20 20 20 20 20 20 67 65 6e 65 72 61 74 65 43         generateC
10960 6f 6c 75 6d 6e 4e 61 6d 65 73 28 70 50 61 72 73  olumnNames(pPars
10970 65 2c 20 30 2c 20 70 46 69 72 73 74 2d 3e 70 45  e, 0, pFirst->pE
10980 4c 69 73 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20  List);.      }. 
10990 20 20 20 20 20 69 42 72 65 61 6b 20 3d 20 73 71       iBreak = sq
109a0 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62  lite3VdbeMakeLab
109b0 65 6c 28 76 29 3b 0a 20 20 20 20 20 20 69 43 6f  el(v);.      iCo
109c0 6e 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  nt = sqlite3Vdbe
109d0 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20  MakeLabel(v);.  
109e0 20 20 20 20 63 6f 6d 70 75 74 65 4c 69 6d 69 74      computeLimit
109f0 52 65 67 69 73 74 65 72 73 28 70 50 61 72 73 65  Registers(pParse
10a00 2c 20 70 2c 20 69 42 72 65 61 6b 29 3b 0a 20 20  , p, iBreak);.  
10a10 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
10a20 64 64 4f 70 28 76 2c 20 4f 50 5f 52 65 77 69 6e  ddOp(v, OP_Rewin
10a30 64 2c 20 74 61 62 31 2c 20 69 42 72 65 61 6b 29  d, tab1, iBreak)
10a40 3b 0a 20 20 20 20 20 20 69 53 74 61 72 74 20 3d  ;.      iStart =
10a50 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
10a60 70 28 76 2c 20 4f 50 5f 52 6f 77 4b 65 79 2c 20  p(v, OP_RowKey, 
10a70 74 61 62 31 2c 20 30 29 3b 0a 20 20 20 20 20 20  tab1, 0);.      
10a80 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
10a90 28 76 2c 20 4f 50 5f 4e 6f 74 46 6f 75 6e 64 2c  (v, OP_NotFound,
10aa0 20 74 61 62 32 2c 20 69 43 6f 6e 74 29 3b 0a 20   tab2, iCont);. 
10ab0 20 20 20 20 20 72 63 20 3d 20 73 65 6c 65 63 74       rc = select
10ac0 49 6e 6e 65 72 4c 6f 6f 70 28 70 50 61 72 73 65  InnerLoop(pParse
10ad0 2c 20 70 2c 20 70 2d 3e 70 45 4c 69 73 74 2c 20  , p, p->pEList, 
10ae0 74 61 62 31 2c 20 70 2d 3e 70 45 4c 69 73 74 2d  tab1, p->pEList-
10af0 3e 6e 45 78 70 72 2c 0a 20 20 20 20 20 20 20 20  >nExpr,.        
10b00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10b10 20 20 20 20 20 70 4f 72 64 65 72 42 79 2c 20 2d       pOrderBy, -
10b20 31 2c 20 65 44 65 73 74 2c 20 69 50 61 72 6d 2c  1, eDest, iParm,
10b30 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20   .              
10b40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69                 i
10b50 43 6f 6e 74 2c 20 69 42 72 65 61 6b 2c 20 30 29  Cont, iBreak, 0)
10b60 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 20 29  ;.      if( rc )
10b70 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 31  {.        rc = 1
10b80 3b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 6d  ;.        goto m
10b90 75 6c 74 69 5f 73 65 6c 65 63 74 5f 65 6e 64 3b  ulti_select_end;
10ba0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73  .      }.      s
10bb0 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76  qlite3VdbeResolv
10bc0 65 4c 61 62 65 6c 28 76 2c 20 69 43 6f 6e 74 29  eLabel(v, iCont)
10bd0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
10be0 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4e  dbeAddOp(v, OP_N
10bf0 65 78 74 2c 20 74 61 62 31 2c 20 69 53 74 61 72  ext, tab1, iStar
10c00 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  t);.      sqlite
10c10 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65  3VdbeResolveLabe
10c20 6c 28 76 2c 20 69 42 72 65 61 6b 29 3b 0a 20 20  l(v, iBreak);.  
10c30 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
10c40 64 64 4f 70 28 76 2c 20 4f 50 5f 43 6c 6f 73 65  ddOp(v, OP_Close
10c50 2c 20 74 61 62 32 2c 20 30 29 3b 0a 20 20 20 20  , tab2, 0);.    
10c60 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
10c70 4f 70 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20  Op(v, OP_Close, 
10c80 74 61 62 31 2c 20 30 29 3b 0a 20 20 20 20 20 20  tab1, 0);.      
10c90 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d  break;.    }.  }
10ca0 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65  ..  /* Make sure
10cb0 20 61 6c 6c 20 53 45 4c 45 43 54 73 20 69 6e 20   all SELECTs in 
10cc0 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 68 61  the statement ha
10cd0 76 65 20 74 68 65 20 73 61 6d 65 20 6e 75 6d 62  ve the same numb
10ce0 65 72 20 6f 66 20 65 6c 65 6d 65 6e 74 73 0a 20  er of elements. 
10cf0 20 2a 2a 20 69 6e 20 74 68 65 69 72 20 72 65 73   ** in their res
10d00 75 6c 74 20 73 65 74 73 2e 0a 20 20 2a 2f 0a 20  ult sets..  */. 
10d10 20 61 73 73 65 72 74 28 20 70 2d 3e 70 45 4c 69   assert( p->pELi
10d20 73 74 20 26 26 20 70 50 72 69 6f 72 2d 3e 70 45  st && pPrior->pE
10d30 4c 69 73 74 20 29 3b 0a 20 20 69 66 28 20 70 2d  List );.  if( p-
10d40 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 21 3d  >pEList->nExpr!=
10d50 70 50 72 69 6f 72 2d 3e 70 45 4c 69 73 74 2d 3e  pPrior->pEList->
10d60 6e 45 78 70 72 20 29 7b 0a 20 20 20 20 73 71 6c  nExpr ){.    sql
10d70 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
10d80 72 73 65 2c 20 22 53 45 4c 45 43 54 73 20 74 6f  rse, "SELECTs to
10d90 20 74 68 65 20 6c 65 66 74 20 61 6e 64 20 72 69   the left and ri
10da0 67 68 74 20 6f 66 20 25 73 22 0a 20 20 20 20 20  ght of %s".     
10db0 20 22 20 64 6f 20 6e 6f 74 20 68 61 76 65 20 74   " do not have t
10dc0 68 65 20 73 61 6d 65 20 6e 75 6d 62 65 72 20 6f  he same number o
10dd0 66 20 72 65 73 75 6c 74 20 63 6f 6c 75 6d 6e 73  f result columns
10de0 22 2c 20 73 65 6c 65 63 74 4f 70 4e 61 6d 65 28  ", selectOpName(
10df0 70 2d 3e 6f 70 29 29 3b 0a 20 20 20 20 72 63 20  p->op));.    rc 
10e00 3d 20 31 3b 0a 20 20 20 20 67 6f 74 6f 20 6d 75  = 1;.    goto mu
10e10 6c 74 69 5f 73 65 6c 65 63 74 5f 65 6e 64 3b 0a  lti_select_end;.
10e20 20 20 7d 0a 0a 20 20 2f 2a 20 53 65 74 20 74 68    }..  /* Set th
10e30 65 20 6e 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75  e number of colu
10e40 6d 6e 73 20 69 6e 20 74 65 6d 70 6f 72 61 72 79  mns in temporary
10e50 20 74 61 62 6c 65 73 0a 20 20 2a 2f 0a 20 20 6e   tables.  */.  n
10e60 43 6f 6c 20 3d 20 70 2d 3e 70 45 4c 69 73 74 2d  Col = p->pEList-
10e70 3e 6e 45 78 70 72 3b 0a 20 20 77 68 69 6c 65 28  >nExpr;.  while(
10e80 20 6e 53 65 74 50 32 20 29 7b 0a 20 20 20 20 73   nSetP2 ){.    s
10e90 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65  qlite3VdbeChange
10ea0 50 32 28 76 2c 20 61 53 65 74 50 32 5b 2d 2d 6e  P2(v, aSetP2[--n
10eb0 53 65 74 50 32 5d 2c 20 6e 43 6f 6c 29 3b 0a 20  SetP2], nCol);. 
10ec0 20 7d 0a 0a 20 20 2f 2a 20 43 6f 6d 70 75 74 65   }..  /* Compute
10ed0 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65   collating seque
10ee0 6e 63 65 73 20 75 73 65 64 20 62 79 20 65 69 74  nces used by eit
10ef0 68 65 72 20 74 68 65 20 4f 52 44 45 52 20 42 59  her the ORDER BY
10f00 20 63 6c 61 75 73 65 20 6f 72 0a 20 20 2a 2a 20   clause or.  ** 
10f10 62 79 20 61 6e 79 20 74 65 6d 70 6f 72 61 72 79  by any temporary
10f20 20 74 61 62 6c 65 73 20 6e 65 65 64 65 64 20 74   tables needed t
10f30 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 74 68 65 20  o implement the 
10f40 63 6f 6d 70 6f 75 6e 64 20 73 65 6c 65 63 74 2e  compound select.
10f50 0a 20 20 2a 2a 20 41 74 74 61 63 68 20 74 68 65  .  ** Attach the
10f60 20 4b 65 79 49 6e 66 6f 20 73 74 72 75 63 74 75   KeyInfo structu
10f70 72 65 20 74 6f 20 61 6c 6c 20 74 65 6d 70 6f 72  re to all tempor
10f80 61 72 79 20 74 61 62 6c 65 73 2e 20 20 49 6e 76  ary tables.  Inv
10f90 6f 6b 65 20 74 68 65 0a 20 20 2a 2a 20 4f 52 44  oke the.  ** ORD
10fa0 45 52 20 42 59 20 70 72 6f 63 65 73 73 69 6e 67  ER BY processing
10fb0 20 69 66 20 74 68 65 72 65 20 69 73 20 61 6e 20   if there is an 
10fc0 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 2e  ORDER BY clause.
10fd0 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 69 73 20  .  **.  ** This 
10fe0 73 65 63 74 69 6f 6e 20 69 73 20 72 75 6e 20 62  section is run b
10ff0 79 20 74 68 65 20 72 69 67 68 74 2d 6d 6f 73 74  y the right-most
11000 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
11010 74 20 6f 6e 6c 79 2e 0a 20 20 2a 2a 20 53 45 4c  t only..  ** SEL
11020 45 43 54 20 73 74 61 74 65 6d 65 6e 74 73 20 74  ECT statements t
11030 6f 20 74 68 65 20 6c 65 66 74 20 61 6c 77 61 79  o the left alway
11040 73 20 73 6b 69 70 20 74 68 69 73 20 70 61 72 74  s skip this part
11050 2e 20 20 54 68 65 20 72 69 67 68 74 2d 6d 6f 73  .  The right-mos
11060 74 0a 20 20 2a 2a 20 53 45 4c 45 43 54 20 6d 69  t.  ** SELECT mi
11070 67 68 74 20 61 6c 73 6f 20 73 6b 69 70 20 74 68  ght also skip th
11080 69 73 20 70 61 72 74 20 69 66 20 69 74 20 68 61  is part if it ha
11090 73 20 6e 6f 20 4f 52 44 45 52 20 42 59 20 63 6c  s no ORDER BY cl
110a0 61 75 73 65 20 61 6e 64 0a 20 20 2a 2a 20 6e 6f  ause and.  ** no
110b0 20 74 65 6d 70 20 74 61 62 6c 65 73 20 61 72 65   temp tables are
110c0 20 72 65 71 75 69 72 65 64 2e 0a 20 20 2a 2f 0a   required..  */.
110d0 20 20 69 66 28 20 70 4f 72 64 65 72 42 79 20 7c    if( pOrderBy |
110e0 7c 20 70 2d 3e 75 73 65 73 45 70 68 6d 20 29 7b  | p->usesEphm ){
110f0 0a 20 20 20 20 69 6e 74 20 69 3b 20 20 20 20 20  .    int i;     
11100 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11110 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74     /* Loop count
11120 65 72 20 2a 2f 0a 20 20 20 20 4b 65 79 49 6e 66  er */.    KeyInf
11130 6f 20 2a 70 4b 65 79 49 6e 66 6f 3b 20 20 20 20  o *pKeyInfo;    
11140 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6c 6c 61          /* Colla
11150 74 69 6e 67 20 73 65 71 75 65 6e 63 65 20 66 6f  ting sequence fo
11160 72 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74  r the result set
11170 20 2a 2f 0a 20 20 20 20 53 65 6c 65 63 74 20 2a   */.    Select *
11180 70 4c 6f 6f 70 3b 20 20 20 20 20 20 20 20 20 20  pLoop;          
11190 20 20 20 20 20 20 2f 2a 20 46 6f 72 20 6c 6f 6f        /* For loo
111a0 70 69 6e 67 20 74 68 72 6f 75 67 68 20 53 45 4c  ping through SEL
111b0 45 43 54 20 73 74 61 74 65 6d 65 6e 74 73 20 2a  ECT statements *
111c0 2f 0a 20 20 20 20 69 6e 74 20 6e 4b 65 79 43 6f  /.    int nKeyCo
111d0 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l;              
111e0 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
111f0 20 65 6e 74 72 69 65 73 20 69 6e 20 70 4b 65 79   entries in pKey
11200 49 6e 66 6f 2d 3e 61 43 6f 6c 5b 5d 20 2a 2f 0a  Info->aCol[] */.
11210 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a 2a 61 70      CollSeq **ap
11220 43 6f 6c 6c 3b 20 20 20 20 20 20 20 20 20 20 20  Coll;           
11230 20 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e 67    /* For looping
11240 20 74 68 72 6f 75 67 68 20 70 4b 65 79 49 6e 66   through pKeyInf
11250 6f 2d 3e 61 43 6f 6c 6c 5b 5d 20 2a 2f 0a 20 20  o->aColl[] */.  
11260 20 20 43 6f 6c 6c 53 65 71 20 2a 2a 61 43 6f 70    CollSeq **aCop
11270 79 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  y;              
11280 2f 2a 20 41 20 63 6f 70 79 20 6f 66 20 70 4b 65  /* A copy of pKe
11290 79 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b 5d 20 2a  yInfo->aColl[] *
112a0 2f 0a 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  /..    assert( p
112b0 2d 3e 70 52 69 67 68 74 6d 6f 73 74 3d 3d 70 20  ->pRightmost==p 
112c0 29 3b 0a 20 20 20 20 6e 4b 65 79 43 6f 6c 20 3d  );.    nKeyCol =
112d0 20 6e 43 6f 6c 20 2b 20 28 70 4f 72 64 65 72 42   nCol + (pOrderB
112e0 79 20 3f 20 70 4f 72 64 65 72 42 79 2d 3e 6e 45  y ? pOrderBy->nE
112f0 78 70 72 20 3a 20 30 29 3b 0a 20 20 20 20 70 4b  xpr : 0);.    pK
11300 65 79 49 6e 66 6f 20 3d 20 73 71 6c 69 74 65 33  eyInfo = sqlite3
11310 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 70 50 61  DbMallocZero(pPa
11320 72 73 65 2d 3e 64 62 2c 0a 20 20 20 20 20 20 20  rse->db,.       
11330 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11340 73 69 7a 65 6f 66 28 2a 70 4b 65 79 49 6e 66 6f  sizeof(*pKeyInfo
11350 29 2b 6e 4b 65 79 43 6f 6c 2a 28 73 69 7a 65 6f  )+nKeyCol*(sizeo
11360 66 28 43 6f 6c 6c 53 65 71 2a 29 20 2b 20 31 29  f(CollSeq*) + 1)
11370 29 3b 0a 20 20 20 20 69 66 28 20 21 70 4b 65 79  );.    if( !pKey
11380 49 6e 66 6f 20 29 7b 0a 20 20 20 20 20 20 72 63  Info ){.      rc
11390 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b   = SQLITE_NOMEM;
113a0 0a 20 20 20 20 20 20 67 6f 74 6f 20 6d 75 6c 74  .      goto mult
113b0 69 5f 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20  i_select_end;.  
113c0 20 20 7d 0a 0a 20 20 20 20 70 4b 65 79 49 6e 66    }..    pKeyInf
113d0 6f 2d 3e 65 6e 63 20 3d 20 45 4e 43 28 70 50 61  o->enc = ENC(pPa
113e0 72 73 65 2d 3e 64 62 29 3b 0a 20 20 20 20 70 4b  rse->db);.    pK
113f0 65 79 49 6e 66 6f 2d 3e 6e 46 69 65 6c 64 20 3d  eyInfo->nField =
11400 20 6e 43 6f 6c 3b 0a 0a 20 20 20 20 66 6f 72 28   nCol;..    for(
11410 69 3d 30 2c 20 61 70 43 6f 6c 6c 3d 70 4b 65 79  i=0, apColl=pKey
11420 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 3b 20 69 3c 6e  Info->aColl; i<n
11430 43 6f 6c 3b 20 69 2b 2b 2c 20 61 70 43 6f 6c 6c  Col; i++, apColl
11440 2b 2b 29 7b 0a 20 20 20 20 20 20 2a 61 70 43 6f  ++){.      *apCo
11450 6c 6c 20 3d 20 6d 75 6c 74 69 53 65 6c 65 63 74  ll = multiSelect
11460 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20  CollSeq(pParse, 
11470 70 2c 20 69 29 3b 0a 20 20 20 20 20 20 69 66 28  p, i);.      if(
11480 20 30 3d 3d 2a 61 70 43 6f 6c 6c 20 29 7b 0a 20   0==*apColl ){. 
11490 20 20 20 20 20 20 20 2a 61 70 43 6f 6c 6c 20 3d         *apColl =
114a0 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 70 44 66   pParse->db->pDf
114b0 6c 74 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 7d 0a  ltColl;.      }.
114c0 20 20 20 20 7d 0a 0a 20 20 20 20 66 6f 72 28 70      }..    for(p
114d0 4c 6f 6f 70 3d 70 3b 20 70 4c 6f 6f 70 3b 20 70  Loop=p; pLoop; p
114e0 4c 6f 6f 70 3d 70 4c 6f 6f 70 2d 3e 70 50 72 69  Loop=pLoop->pPri
114f0 6f 72 29 7b 0a 20 20 20 20 20 20 66 6f 72 28 69  or){.      for(i
11500 3d 30 3b 20 69 3c 32 3b 20 69 2b 2b 29 7b 0a 20  =0; i<2; i++){. 
11510 20 20 20 20 20 20 20 69 6e 74 20 61 64 64 72 20         int addr 
11520 3d 20 70 4c 6f 6f 70 2d 3e 61 64 64 72 4f 70 65  = pLoop->addrOpe
11530 6e 45 70 68 6d 5b 69 5d 3b 0a 20 20 20 20 20 20  nEphm[i];.      
11540 20 20 69 66 28 20 61 64 64 72 3c 30 20 29 7b 0a    if( addr<0 ){.
11550 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20            /* If 
11560 5b 30 5d 20 69 73 20 75 6e 75 73 65 64 20 74 68  [0] is unused th
11570 65 6e 20 5b 31 5d 20 69 73 20 61 6c 73 6f 20 75  en [1] is also u
11580 6e 75 73 65 64 2e 20 20 53 6f 20 77 65 20 63 61  nused.  So we ca
11590 6e 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 61  n.          ** a
115a0 6c 77 61 79 73 20 73 61 66 65 6c 79 20 61 62 6f  lways safely abo
115b0 72 74 20 61 73 20 73 6f 6f 6e 20 61 73 20 74 68  rt as soon as th
115c0 65 20 66 69 72 73 74 20 75 6e 75 73 65 64 20 73  e first unused s
115d0 6c 6f 74 20 69 73 20 66 6f 75 6e 64 20 2a 2f 0a  lot is found */.
115e0 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74            assert
115f0 28 20 70 4c 6f 6f 70 2d 3e 61 64 64 72 4f 70 65  ( pLoop->addrOpe
11600 6e 45 70 68 6d 5b 31 5d 3c 30 20 29 3b 0a 20 20  nEphm[1]<0 );.  
11610 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
11620 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
11630 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e   sqlite3VdbeChan
11640 67 65 50 32 28 76 2c 20 61 64 64 72 2c 20 6e 43  geP2(v, addr, nC
11650 6f 6c 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  ol);.        sql
11660 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 33  ite3VdbeChangeP3
11670 28 76 2c 20 61 64 64 72 2c 20 28 63 68 61 72 2a  (v, addr, (char*
11680 29 70 4b 65 79 49 6e 66 6f 2c 20 50 33 5f 4b 45  )pKeyInfo, P3_KE
11690 59 49 4e 46 4f 29 3b 0a 20 20 20 20 20 20 20 20  YINFO);.        
116a0 70 4c 6f 6f 70 2d 3e 61 64 64 72 4f 70 65 6e 45  pLoop->addrOpenE
116b0 70 68 6d 5b 69 5d 20 3d 20 2d 31 3b 0a 20 20 20  phm[i] = -1;.   
116c0 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20     }.    }..    
116d0 69 66 28 20 70 4f 72 64 65 72 42 79 20 29 7b 0a  if( pOrderBy ){.
116e0 20 20 20 20 20 20 73 74 72 75 63 74 20 45 78 70        struct Exp
116f0 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 4f 54 65  rList_item *pOTe
11700 72 6d 20 3d 20 70 4f 72 64 65 72 42 79 2d 3e 61  rm = pOrderBy->a
11710 3b 0a 20 20 20 20 20 20 69 6e 74 20 6e 4f 72 64  ;.      int nOrd
11720 65 72 42 79 45 78 70 72 20 3d 20 70 4f 72 64 65  erByExpr = pOrde
11730 72 42 79 2d 3e 6e 45 78 70 72 3b 0a 20 20 20 20  rBy->nExpr;.    
11740 20 20 69 6e 74 20 61 64 64 72 3b 0a 20 20 20 20    int addr;.    
11750 20 20 75 38 20 2a 70 53 6f 72 74 4f 72 64 65 72    u8 *pSortOrder
11760 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 52 65 75 73  ;..      /* Reus
11770 65 20 74 68 65 20 73 61 6d 65 20 70 4b 65 79 49  e the same pKeyI
11780 6e 66 6f 20 66 6f 72 20 74 68 65 20 4f 52 44 45  nfo for the ORDE
11790 52 20 42 59 20 61 73 20 77 61 73 20 75 73 65 64  R BY as was used
117a0 20 61 62 6f 76 65 20 66 6f 72 0a 20 20 20 20 20   above for.     
117b0 20 2a 2a 20 74 68 65 20 63 6f 6d 70 6f 75 6e 64   ** the compound
117c0 20 73 65 6c 65 63 74 20 73 74 61 74 65 6d 65 6e   select statemen
117d0 74 73 2e 20 20 45 78 63 65 70 74 20 77 65 20 68  ts.  Except we h
117e0 61 76 65 20 74 6f 20 63 68 61 6e 67 65 20 6f 75  ave to change ou
117f0 74 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 70  t the.      ** p
11800 4b 65 79 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b 5d  KeyInfo->aColl[]
11810 20 76 61 6c 75 65 73 2e 20 20 53 6f 6d 65 20 6f   values.  Some o
11820 66 20 74 68 65 20 61 43 6f 6c 6c 5b 5d 20 76 61  f the aColl[] va
11830 6c 75 65 73 20 77 69 6c 6c 20 62 65 0a 20 20 20  lues will be.   
11840 20 20 20 2a 2a 20 72 65 75 73 65 64 20 77 68 65     ** reused whe
11850 6e 20 63 6f 6e 73 74 72 75 63 74 69 6e 67 20 74  n constructing t
11860 68 65 20 70 4b 65 79 49 6e 66 6f 20 66 6f 72 20  he pKeyInfo for 
11870 74 68 65 20 4f 52 44 45 52 20 42 59 2c 20 73 6f  the ORDER BY, so
11880 20 6d 61 6b 65 0a 20 20 20 20 20 20 2a 2a 20 61   make.      ** a
11890 20 63 6f 70 79 2e 20 20 53 75 66 66 69 63 69 65   copy.  Sufficie
118a0 6e 74 20 73 70 61 63 65 20 74 6f 20 68 6f 6c 64  nt space to hold
118b0 20 62 6f 74 68 20 74 68 65 20 6e 43 6f 6c 20 65   both the nCol e
118c0 6e 74 72 69 65 73 20 66 6f 72 0a 20 20 20 20 20  ntries for.     
118d0 20 2a 2a 20 74 68 65 20 63 6f 6d 70 6f 75 6e 64   ** the compound
118e0 20 73 65 6c 65 63 74 20 61 6e 64 20 74 68 65 20   select and the 
118f0 6e 4f 72 64 65 72 62 79 45 78 70 72 20 65 6e 74  nOrderbyExpr ent
11900 72 69 65 73 20 66 6f 72 20 74 68 65 20 4f 52 44  ries for the ORD
11910 45 52 20 42 59 0a 20 20 20 20 20 20 2a 2a 20 77  ER BY.      ** w
11920 61 73 20 61 6c 6c 6f 63 61 74 65 64 20 61 62 6f  as allocated abo
11930 76 65 2e 20 20 42 75 74 20 77 65 20 6e 65 65 64  ve.  But we need
11940 20 74 6f 20 6d 6f 76 65 20 74 68 65 20 63 6f 6d   to move the com
11950 70 6f 75 6e 64 20 73 65 6c 65 63 74 0a 20 20 20  pound select.   
11960 20 20 20 2a 2a 20 65 6e 74 72 69 65 73 20 6f 75     ** entries ou
11970 74 20 6f 66 20 74 68 65 20 77 61 79 20 62 65 66  t of the way bef
11980 6f 72 65 20 63 6f 6e 73 74 72 75 63 74 69 6e 67  ore constructing
11990 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 65 6e   the ORDER BY en
119a0 74 72 69 65 73 2e 0a 20 20 20 20 20 20 2a 2a 20  tries..      ** 
119b0 4d 6f 76 65 20 74 68 65 20 63 6f 6d 70 6f 75 6e  Move the compoun
119c0 64 20 73 65 6c 65 63 74 20 65 6e 74 72 69 65 73  d select entries
119d0 20 69 6e 74 6f 20 61 43 6f 70 79 5b 5d 20 77 68   into aCopy[] wh
119e0 65 72 65 20 74 68 65 79 20 63 61 6e 20 62 65 0a  ere they can be.
119f0 20 20 20 20 20 20 2a 2a 20 61 63 63 65 73 73 65        ** accesse
11a00 64 20 61 6e 64 20 72 65 75 73 65 64 20 77 68 65  d and reused whe
11a10 6e 20 63 6f 6e 73 74 72 75 63 74 69 6e 67 20 74  n constructing t
11a20 68 65 20 4f 52 44 45 52 20 42 59 20 65 6e 74 72  he ORDER BY entr
11a30 69 65 73 2e 0a 20 20 20 20 20 20 2a 2a 20 42 65  ies..      ** Be
11a40 63 61 75 73 65 20 6e 43 6f 6c 20 6d 69 67 68 74  cause nCol might
11a50 20 62 65 20 67 72 65 61 74 65 72 20 74 68 61 6e   be greater than
11a60 20 6f 72 20 6c 65 73 73 20 74 68 61 6e 20 6e 4f   or less than nO
11a70 72 64 65 72 42 79 45 78 70 72 0a 20 20 20 20 20  rderByExpr.     
11a80 20 2a 2a 20 77 65 20 68 61 76 65 20 74 6f 20 75   ** we have to u
11a90 73 65 20 6d 65 6d 6d 6f 76 65 28 29 20 77 68 65  se memmove() whe
11aa0 6e 20 64 6f 69 6e 67 20 74 68 65 20 63 6f 70 79  n doing the copy
11ab0 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
11ac0 20 61 43 6f 70 79 20 3d 20 26 70 4b 65 79 49 6e   aCopy = &pKeyIn
11ad0 66 6f 2d 3e 61 43 6f 6c 6c 5b 6e 4f 72 64 65 72  fo->aColl[nOrder
11ae0 42 79 45 78 70 72 5d 3b 0a 20 20 20 20 20 20 70  ByExpr];.      p
11af0 53 6f 72 74 4f 72 64 65 72 20 3d 20 70 4b 65 79  SortOrder = pKey
11b00 49 6e 66 6f 2d 3e 61 53 6f 72 74 4f 72 64 65 72  Info->aSortOrder
11b10 20 3d 20 28 75 38 2a 29 26 61 43 6f 70 79 5b 6e   = (u8*)&aCopy[n
11b20 43 6f 6c 5d 3b 0a 20 20 20 20 20 20 6d 65 6d 6d  Col];.      memm
11b30 6f 76 65 28 61 43 6f 70 79 2c 20 70 4b 65 79 49  ove(aCopy, pKeyI
11b40 6e 66 6f 2d 3e 61 43 6f 6c 6c 2c 20 6e 43 6f 6c  nfo->aColl, nCol
11b50 2a 73 69 7a 65 6f 66 28 43 6f 6c 6c 53 65 71 2a  *sizeof(CollSeq*
11b60 29 29 3b 0a 0a 20 20 20 20 20 20 61 70 43 6f 6c  ));..      apCol
11b70 6c 20 3d 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 43  l = pKeyInfo->aC
11b80 6f 6c 6c 3b 0a 20 20 20 20 20 20 66 6f 72 28 69  oll;.      for(i
11b90 3d 30 3b 20 69 3c 6e 4f 72 64 65 72 42 79 45 78  =0; i<nOrderByEx
11ba0 70 72 3b 20 69 2b 2b 2c 20 70 4f 54 65 72 6d 2b  pr; i++, pOTerm+
11bb0 2b 2c 20 61 70 43 6f 6c 6c 2b 2b 2c 20 70 53 6f  +, apColl++, pSo
11bc0 72 74 4f 72 64 65 72 2b 2b 29 7b 0a 20 20 20 20  rtOrder++){.    
11bd0 20 20 20 20 45 78 70 72 20 2a 70 45 78 70 72 20      Expr *pExpr 
11be0 3d 20 70 4f 54 65 72 6d 2d 3e 70 45 78 70 72 3b  = pOTerm->pExpr;
11bf0 0a 20 20 20 20 20 20 20 20 69 66 28 20 28 70 45  .        if( (pE
11c00 78 70 72 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f  xpr->flags & EP_
11c10 45 78 70 43 6f 6c 6c 61 74 65 29 20 29 7b 0a 20  ExpCollate) ){. 
11c20 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28           assert(
11c30 20 70 45 78 70 72 2d 3e 70 43 6f 6c 6c 21 3d 30   pExpr->pColl!=0
11c40 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 2a 61   );.          *a
11c50 70 43 6f 6c 6c 20 3d 20 70 45 78 70 72 2d 3e 70  pColl = pExpr->p
11c60 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 20 20 7d 65  Coll;.        }e
11c70 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 2a  lse{.          *
11c80 61 70 43 6f 6c 6c 20 3d 20 61 43 6f 70 79 5b 70  apColl = aCopy[p
11c90 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 5d 3b 0a  Expr->iColumn];.
11ca0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
11cb0 20 20 2a 70 53 6f 72 74 4f 72 64 65 72 20 3d 20    *pSortOrder = 
11cc0 70 4f 54 65 72 6d 2d 3e 73 6f 72 74 4f 72 64 65  pOTerm->sortOrde
11cd0 72 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  r;.      }.     
11ce0 20 61 73 73 65 72 74 28 20 70 2d 3e 70 52 69 67   assert( p->pRig
11cf0 68 74 6d 6f 73 74 3d 3d 70 20 29 3b 0a 20 20 20  htmost==p );.   
11d00 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 61 64     assert( p->ad
11d10 64 72 4f 70 65 6e 45 70 68 6d 5b 32 5d 3e 3d 30  drOpenEphm[2]>=0
11d20 20 29 3b 0a 20 20 20 20 20 20 61 64 64 72 20 3d   );.      addr =
11d30 20 70 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d   p->addrOpenEphm
11d40 5b 32 5d 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  [2];.      sqlit
11d50 65 33 56 64 62 65 43 68 61 6e 67 65 50 32 28 76  e3VdbeChangeP2(v
11d60 2c 20 61 64 64 72 2c 20 70 2d 3e 70 4f 72 64 65  , addr, p->pOrde
11d70 72 42 79 2d 3e 6e 45 78 70 72 2b 32 29 3b 0a 20  rBy->nExpr+2);. 
11d80 20 20 20 20 20 70 4b 65 79 49 6e 66 6f 2d 3e 6e       pKeyInfo->n
11d90 46 69 65 6c 64 20 3d 20 6e 4f 72 64 65 72 42 79  Field = nOrderBy
11da0 45 78 70 72 3b 0a 20 20 20 20 20 20 73 71 6c 69  Expr;.      sqli
11db0 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 33 28  te3VdbeChangeP3(
11dc0 76 2c 20 61 64 64 72 2c 20 28 63 68 61 72 2a 29  v, addr, (char*)
11dd0 70 4b 65 79 49 6e 66 6f 2c 20 50 33 5f 4b 45 59  pKeyInfo, P3_KEY
11de0 49 4e 46 4f 5f 48 41 4e 44 4f 46 46 29 3b 0a 20  INFO_HANDOFF);. 
11df0 20 20 20 20 20 70 4b 65 79 49 6e 66 6f 20 3d 20       pKeyInfo = 
11e00 30 3b 0a 20 20 20 20 20 20 67 65 6e 65 72 61 74  0;.      generat
11e10 65 53 6f 72 74 54 61 69 6c 28 70 50 61 72 73 65  eSortTail(pParse
11e20 2c 20 70 2c 20 76 2c 20 70 2d 3e 70 45 4c 69 73  , p, v, p->pELis
11e30 74 2d 3e 6e 45 78 70 72 2c 20 65 44 65 73 74 2c  t->nExpr, eDest,
11e40 20 69 50 61 72 6d 29 3b 0a 20 20 20 20 7d 0a 0a   iParm);.    }..
11e50 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
11e60 28 70 4b 65 79 49 6e 66 6f 29 3b 0a 20 20 7d 0a  (pKeyInfo);.  }.
11e70 0a 6d 75 6c 74 69 5f 73 65 6c 65 63 74 5f 65 6e  .multi_select_en
11e80 64 3a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  d:.  return rc;.
11e90 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  }.#endif /* SQLI
11ea0 54 45 5f 4f 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44  TE_OMIT_COMPOUND
11eb0 5f 53 45 4c 45 43 54 20 2a 2f 0a 0a 23 69 66 6e  _SELECT */..#ifn
11ec0 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
11ed0 56 49 45 57 0a 2f 2a 20 46 6f 72 77 61 72 64 20  VIEW./* Forward 
11ee0 44 65 63 6c 61 72 61 74 69 6f 6e 73 20 2a 2f 0a  Declarations */.
11ef0 73 74 61 74 69 63 20 76 6f 69 64 20 73 75 62 73  static void subs
11f00 74 45 78 70 72 4c 69 73 74 28 73 71 6c 69 74 65  tExprList(sqlite
11f10 33 2a 2c 20 45 78 70 72 4c 69 73 74 2a 2c 20 69  3*, ExprList*, i
11f20 6e 74 2c 20 45 78 70 72 4c 69 73 74 2a 29 3b 0a  nt, ExprList*);.
11f30 73 74 61 74 69 63 20 76 6f 69 64 20 73 75 62 73  static void subs
11f40 74 53 65 6c 65 63 74 28 73 71 6c 69 74 65 33 2a  tSelect(sqlite3*
11f50 2c 20 53 65 6c 65 63 74 20 2a 2c 20 69 6e 74 2c  , Select *, int,
11f60 20 45 78 70 72 4c 69 73 74 20 2a 29 3b 0a 0a 2f   ExprList *);../
11f70 2a 0a 2a 2a 20 53 63 61 6e 20 74 68 72 6f 75 67  *.** Scan throug
11f80 68 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  h the expression
11f90 20 70 45 78 70 72 2e 20 20 52 65 70 6c 61 63 65   pExpr.  Replace
11fa0 20 65 76 65 72 79 20 72 65 66 65 72 65 6e 63 65   every reference
11fb0 20 74 6f 0a 2a 2a 20 61 20 63 6f 6c 75 6d 6e 20   to.** a column 
11fc0 69 6e 20 74 61 62 6c 65 20 6e 75 6d 62 65 72 20  in table number 
11fd0 69 54 61 62 6c 65 20 77 69 74 68 20 61 20 63 6f  iTable with a co
11fe0 70 79 20 6f 66 20 74 68 65 20 69 43 6f 6c 75 6d  py of the iColum
11ff0 6e 2d 74 68 0a 2a 2a 20 65 6e 74 72 79 20 69 6e  n-th.** entry in
12000 20 70 45 4c 69 73 74 2e 20 20 28 42 75 74 20 6c   pEList.  (But l
12010 65 61 76 65 20 72 65 66 65 72 65 6e 63 65 73 20  eave references 
12020 74 6f 20 74 68 65 20 52 4f 57 49 44 20 63 6f 6c  to the ROWID col
12030 75 6d 6e 20 0a 2a 2a 20 75 6e 63 68 61 6e 67 65  umn .** unchange
12040 64 2e 29 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  d.).**.** This r
12050 6f 75 74 69 6e 65 20 69 73 20 70 61 72 74 20 6f  outine is part o
12060 66 20 74 68 65 20 66 6c 61 74 74 65 6e 69 6e 67  f the flattening
12070 20 70 72 6f 63 65 64 75 72 65 2e 20 20 41 20 73   procedure.  A s
12080 75 62 71 75 65 72 79 0a 2a 2a 20 77 68 6f 73 65  ubquery.** whose
12090 20 72 65 73 75 6c 74 20 73 65 74 20 69 73 20 64   result set is d
120a0 65 66 69 6e 65 64 20 62 79 20 70 45 4c 69 73 74  efined by pEList
120b0 20 61 70 70 65 61 72 73 20 61 73 20 65 6e 74 72   appears as entr
120c0 79 20 69 6e 20 74 68 65 0a 2a 2a 20 46 52 4f 4d  y in the.** FROM
120d0 20 63 6c 61 75 73 65 20 6f 66 20 61 20 53 45 4c   clause of a SEL
120e0 45 43 54 20 73 75 63 68 20 74 68 61 74 20 74 68  ECT such that th
120f0 65 20 56 44 42 45 20 63 75 72 73 6f 72 20 61 73  e VDBE cursor as
12100 73 69 67 6e 65 64 20 74 6f 20 74 68 61 74 0a 2a  signed to that.*
12110 2a 20 46 4f 52 4d 20 63 6c 61 75 73 65 20 65 6e  * FORM clause en
12120 74 72 79 20 69 73 20 69 54 61 62 6c 65 2e 20 20  try is iTable.  
12130 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6d 61 6b  This routine mak
12140 65 20 74 68 65 20 6e 65 63 65 73 73 61 72 79 20  e the necessary 
12150 0a 2a 2a 20 63 68 61 6e 67 65 73 20 74 6f 20 70  .** changes to p
12160 45 78 70 72 20 73 6f 20 74 68 61 74 20 69 74 20  Expr so that it 
12170 72 65 66 65 72 73 20 64 69 72 65 63 74 6c 79 20  refers directly 
12180 74 6f 20 74 68 65 20 73 6f 75 72 63 65 20 74 61  to the source ta
12190 62 6c 65 0a 2a 2a 20 6f 66 20 74 68 65 20 73 75  ble.** of the su
121a0 62 71 75 65 72 79 20 72 61 74 68 65 72 20 74 68  bquery rather th
121b0 65 20 72 65 73 75 6c 74 20 73 65 74 20 6f 66 20  e result set of 
121c0 74 68 65 20 73 75 62 71 75 65 72 79 2e 0a 2a 2f  the subquery..*/
121d0 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 75 62  .static void sub
121e0 73 74 45 78 70 72 28 0a 20 20 73 71 6c 69 74 65  stExpr(.  sqlite
121f0 33 20 2a 64 62 2c 20 20 20 20 20 20 20 20 2f 2a  3 *db,        /*
12200 20 52 65 70 6f 72 74 20 6d 61 6c 6c 6f 63 20 65   Report malloc e
12210 72 72 6f 72 73 20 74 6f 20 74 68 69 73 20 63 6f  rrors to this co
12220 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 45 78  nnection */.  Ex
12230 70 72 20 2a 70 45 78 70 72 2c 20 20 20 20 20 20  pr *pExpr,      
12240 20 20 2f 2a 20 45 78 70 72 20 69 6e 20 77 68 69    /* Expr in whi
12250 63 68 20 73 75 62 73 74 69 74 75 74 69 6f 6e 20  ch substitution 
12260 6f 63 63 75 72 73 20 2a 2f 0a 20 20 69 6e 74 20  occurs */.  int 
12270 69 54 61 62 6c 65 2c 20 20 20 20 20 20 20 20 20  iTable,         
12280 2f 2a 20 54 61 62 6c 65 20 74 6f 20 62 65 20 73  /* Table to be s
12290 75 62 73 74 69 74 75 74 65 64 20 2a 2f 0a 20 20  ubstituted */.  
122a0 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74  ExprList *pEList
122b0 20 20 20 20 2f 2a 20 53 75 62 73 74 69 74 75 74      /* Substitut
122c0 65 20 65 78 70 72 65 73 73 69 6f 6e 73 20 2a 2f  e expressions */
122d0 0a 29 7b 0a 20 20 69 66 28 20 70 45 78 70 72 3d  .){.  if( pExpr=
122e0 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69  =0 ) return;.  i
122f0 66 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b  f( pExpr->op==TK
12300 5f 43 4f 4c 55 4d 4e 20 26 26 20 70 45 78 70 72  _COLUMN && pExpr
12310 2d 3e 69 54 61 62 6c 65 3d 3d 69 54 61 62 6c 65  ->iTable==iTable
12320 20 29 7b 0a 20 20 20 20 69 66 28 20 70 45 78 70   ){.    if( pExp
12330 72 2d 3e 69 43 6f 6c 75 6d 6e 3c 30 20 29 7b 0a  r->iColumn<0 ){.
12340 20 20 20 20 20 20 70 45 78 70 72 2d 3e 6f 70 20        pExpr->op 
12350 3d 20 54 4b 5f 4e 55 4c 4c 3b 0a 20 20 20 20 7d  = TK_NULL;.    }
12360 65 6c 73 65 7b 0a 20 20 20 20 20 20 45 78 70 72  else{.      Expr
12370 20 2a 70 4e 65 77 3b 0a 20 20 20 20 20 20 61 73   *pNew;.      as
12380 73 65 72 74 28 20 70 45 4c 69 73 74 21 3d 30 20  sert( pEList!=0 
12390 26 26 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d  && pExpr->iColum
123a0 6e 3c 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 20  n<pEList->nExpr 
123b0 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
123c0 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 3d 3d 30   pExpr->pLeft==0
123d0 20 26 26 20 70 45 78 70 72 2d 3e 70 52 69 67 68   && pExpr->pRigh
123e0 74 3d 3d 30 20 26 26 20 70 45 78 70 72 2d 3e 70  t==0 && pExpr->p
123f0 4c 69 73 74 3d 3d 30 20 29 3b 0a 20 20 20 20 20  List==0 );.     
12400 20 70 4e 65 77 20 3d 20 70 45 4c 69 73 74 2d 3e   pNew = pEList->
12410 61 5b 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e  a[pExpr->iColumn
12420 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 20 20 61  ].pExpr;.      a
12430 73 73 65 72 74 28 20 70 4e 65 77 21 3d 30 20 29  ssert( pNew!=0 )
12440 3b 0a 20 20 20 20 20 20 70 45 78 70 72 2d 3e 6f  ;.      pExpr->o
12450 70 20 3d 20 70 4e 65 77 2d 3e 6f 70 3b 0a 20 20  p = pNew->op;.  
12460 20 20 20 20 61 73 73 65 72 74 28 20 70 45 78 70      assert( pExp
12470 72 2d 3e 70 4c 65 66 74 3d 3d 30 20 29 3b 0a 20  r->pLeft==0 );. 
12480 20 20 20 20 20 70 45 78 70 72 2d 3e 70 4c 65 66       pExpr->pLef
12490 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44  t = sqlite3ExprD
124a0 75 70 28 64 62 2c 20 70 4e 65 77 2d 3e 70 4c 65  up(db, pNew->pLe
124b0 66 74 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  ft);.      asser
124c0 74 28 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74  t( pExpr->pRight
124d0 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 70 45 78  ==0 );.      pEx
124e0 70 72 2d 3e 70 52 69 67 68 74 20 3d 20 73 71 6c  pr->pRight = sql
124f0 69 74 65 33 45 78 70 72 44 75 70 28 64 62 2c 20  ite3ExprDup(db, 
12500 70 4e 65 77 2d 3e 70 52 69 67 68 74 29 3b 0a 20  pNew->pRight);. 
12510 20 20 20 20 20 61 73 73 65 72 74 28 20 70 45 78       assert( pEx
12520 70 72 2d 3e 70 4c 69 73 74 3d 3d 30 20 29 3b 0a  pr->pList==0 );.
12530 20 20 20 20 20 20 70 45 78 70 72 2d 3e 70 4c 69        pExpr->pLi
12540 73 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  st = sqlite3Expr
12550 4c 69 73 74 44 75 70 28 64 62 2c 20 70 4e 65 77  ListDup(db, pNew
12560 2d 3e 70 4c 69 73 74 29 3b 0a 20 20 20 20 20 20  ->pList);.      
12570 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 20 3d 20  pExpr->iTable = 
12580 70 4e 65 77 2d 3e 69 54 61 62 6c 65 3b 0a 20 20  pNew->iTable;.  
12590 20 20 20 20 70 45 78 70 72 2d 3e 70 54 61 62 20      pExpr->pTab 
125a0 3d 20 70 4e 65 77 2d 3e 70 54 61 62 3b 0a 20 20  = pNew->pTab;.  
125b0 20 20 20 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75      pExpr->iColu
125c0 6d 6e 20 3d 20 70 4e 65 77 2d 3e 69 43 6f 6c 75  mn = pNew->iColu
125d0 6d 6e 3b 0a 20 20 20 20 20 20 70 45 78 70 72 2d  mn;.      pExpr-
125e0 3e 69 41 67 67 20 3d 20 70 4e 65 77 2d 3e 69 41  >iAgg = pNew->iA
125f0 67 67 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  gg;.      sqlite
12600 33 54 6f 6b 65 6e 43 6f 70 79 28 64 62 2c 20 26  3TokenCopy(db, &
12610 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2c 20 26 70  pExpr->token, &p
12620 4e 65 77 2d 3e 74 6f 6b 65 6e 29 3b 0a 20 20 20  New->token);.   
12630 20 20 20 73 71 6c 69 74 65 33 54 6f 6b 65 6e 43     sqlite3TokenC
12640 6f 70 79 28 64 62 2c 20 26 70 45 78 70 72 2d 3e  opy(db, &pExpr->
12650 73 70 61 6e 2c 20 26 70 4e 65 77 2d 3e 73 70 61  span, &pNew->spa
12660 6e 29 3b 0a 20 20 20 20 20 20 70 45 78 70 72 2d  n);.      pExpr-
12670 3e 70 53 65 6c 65 63 74 20 3d 20 73 71 6c 69 74  >pSelect = sqlit
12680 65 33 53 65 6c 65 63 74 44 75 70 28 64 62 2c 20  e3SelectDup(db, 
12690 70 4e 65 77 2d 3e 70 53 65 6c 65 63 74 29 3b 0a  pNew->pSelect);.
126a0 20 20 20 20 20 20 70 45 78 70 72 2d 3e 66 6c 61        pExpr->fla
126b0 67 73 20 3d 20 70 4e 65 77 2d 3e 66 6c 61 67 73  gs = pNew->flags
126c0 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b  ;.    }.  }else{
126d0 0a 20 20 20 20 73 75 62 73 74 45 78 70 72 28 64  .    substExpr(d
126e0 62 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c  b, pExpr->pLeft,
126f0 20 69 54 61 62 6c 65 2c 20 70 45 4c 69 73 74 29   iTable, pEList)
12700 3b 0a 20 20 20 20 73 75 62 73 74 45 78 70 72 28  ;.    substExpr(
12710 64 62 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68  db, pExpr->pRigh
12720 74 2c 20 69 54 61 62 6c 65 2c 20 70 45 4c 69 73  t, iTable, pELis
12730 74 29 3b 0a 20 20 20 20 73 75 62 73 74 53 65 6c  t);.    substSel
12740 65 63 74 28 64 62 2c 20 70 45 78 70 72 2d 3e 70  ect(db, pExpr->p
12750 53 65 6c 65 63 74 2c 20 69 54 61 62 6c 65 2c 20  Select, iTable, 
12760 70 45 4c 69 73 74 29 3b 0a 20 20 20 20 73 75 62  pEList);.    sub
12770 73 74 45 78 70 72 4c 69 73 74 28 64 62 2c 20 70  stExprList(db, p
12780 45 78 70 72 2d 3e 70 4c 69 73 74 2c 20 69 54 61  Expr->pList, iTa
12790 62 6c 65 2c 20 70 45 4c 69 73 74 29 3b 0a 20 20  ble, pEList);.  
127a0 7d 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20  }.}.static void 
127b0 73 75 62 73 74 45 78 70 72 4c 69 73 74 28 0a 20  substExprList(. 
127c0 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 20 20   sqlite3 *db,   
127d0 20 20 20 20 20 20 2f 2a 20 52 65 70 6f 72 74 20        /* Report 
127e0 6d 61 6c 6c 6f 63 20 65 72 72 6f 72 73 20 68 65  malloc errors he
127f0 72 65 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74  re */.  ExprList
12800 20 2a 70 4c 69 73 74 2c 20 20 20 20 20 2f 2a 20   *pList,     /* 
12810 4c 69 73 74 20 74 6f 20 73 63 61 6e 20 61 6e 64  List to scan and
12820 20 69 6e 20 77 68 69 63 68 20 74 6f 20 6d 61 6b   in which to mak
12830 65 20 73 75 62 73 74 69 74 75 74 65 73 20 2a 2f  e substitutes */
12840 0a 20 20 69 6e 74 20 69 54 61 62 6c 65 2c 20 20  .  int iTable,  
12850 20 20 20 20 20 20 20 20 2f 2a 20 54 61 62 6c 65          /* Table
12860 20 74 6f 20 62 65 20 73 75 62 73 74 69 74 75 74   to be substitut
12870 65 64 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74  ed */.  ExprList
12880 20 2a 70 45 4c 69 73 74 20 20 20 20 20 2f 2a 20   *pEList     /* 
12890 53 75 62 73 74 69 74 75 74 65 20 76 61 6c 75 65  Substitute value
128a0 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 3b  s */.){.  int i;
128b0 0a 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20  .  if( pList==0 
128c0 29 20 72 65 74 75 72 6e 3b 0a 20 20 66 6f 72 28  ) return;.  for(
128d0 69 3d 30 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e 45  i=0; i<pList->nE
128e0 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73  xpr; i++){.    s
128f0 75 62 73 74 45 78 70 72 28 64 62 2c 20 70 4c 69  ubstExpr(db, pLi
12900 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 2c 20  st->a[i].pExpr, 
12910 69 54 61 62 6c 65 2c 20 70 45 4c 69 73 74 29 3b  iTable, pEList);
12920 0a 20 20 7d 0a 7d 0a 73 74 61 74 69 63 20 76 6f  .  }.}.static vo
12930 69 64 20 73 75 62 73 74 53 65 6c 65 63 74 28 0a  id substSelect(.
12940 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 20    sqlite3 *db,  
12950 20 20 20 20 20 20 20 2f 2a 20 52 65 70 6f 72 74         /* Report
12960 20 6d 61 6c 6c 6f 63 20 65 72 72 6f 72 73 20 68   malloc errors h
12970 65 72 65 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20  ere */.  Select 
12980 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a  *p,           /*
12990 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
129a0 74 20 69 6e 20 77 68 69 63 68 20 74 6f 20 6d 61  t in which to ma
129b0 6b 65 20 73 75 62 73 74 69 74 75 74 69 6f 6e 73  ke substitutions
129c0 20 2a 2f 0a 20 20 69 6e 74 20 69 54 61 62 6c 65   */.  int iTable
129d0 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 61  ,          /* Ta
129e0 62 6c 65 20 74 6f 20 62 65 20 72 65 70 6c 61 63  ble to be replac
129f0 65 64 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74  ed */.  ExprList
12a00 20 2a 70 45 4c 69 73 74 20 20 20 20 20 2f 2a 20   *pEList     /* 
12a10 53 75 62 73 74 69 74 75 74 65 20 76 61 6c 75 65  Substitute value
12a20 73 20 2a 2f 0a 29 7b 0a 20 20 69 66 28 20 21 70  s */.){.  if( !p
12a30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 73 75 62   ) return;.  sub
12a40 73 74 45 78 70 72 4c 69 73 74 28 64 62 2c 20 70  stExprList(db, p
12a50 2d 3e 70 45 4c 69 73 74 2c 20 69 54 61 62 6c 65  ->pEList, iTable
12a60 2c 20 70 45 4c 69 73 74 29 3b 0a 20 20 73 75 62  , pEList);.  sub
12a70 73 74 45 78 70 72 4c 69 73 74 28 64 62 2c 20 70  stExprList(db, p
12a80 2d 3e 70 47 72 6f 75 70 42 79 2c 20 69 54 61 62  ->pGroupBy, iTab
12a90 6c 65 2c 20 70 45 4c 69 73 74 29 3b 0a 20 20 73  le, pEList);.  s
12aa0 75 62 73 74 45 78 70 72 4c 69 73 74 28 64 62 2c  ubstExprList(db,
12ab0 20 70 2d 3e 70 4f 72 64 65 72 42 79 2c 20 69 54   p->pOrderBy, iT
12ac0 61 62 6c 65 2c 20 70 45 4c 69 73 74 29 3b 0a 20  able, pEList);. 
12ad0 20 73 75 62 73 74 45 78 70 72 28 64 62 2c 20 70   substExpr(db, p
12ae0 2d 3e 70 48 61 76 69 6e 67 2c 20 69 54 61 62 6c  ->pHaving, iTabl
12af0 65 2c 20 70 45 4c 69 73 74 29 3b 0a 20 20 73 75  e, pEList);.  su
12b00 62 73 74 45 78 70 72 28 64 62 2c 20 70 2d 3e 70  bstExpr(db, p->p
12b10 57 68 65 72 65 2c 20 69 54 61 62 6c 65 2c 20 70  Where, iTable, p
12b20 45 4c 69 73 74 29 3b 0a 20 20 73 75 62 73 74 53  EList);.  substS
12b30 65 6c 65 63 74 28 64 62 2c 20 70 2d 3e 70 50 72  elect(db, p->pPr
12b40 69 6f 72 2c 20 69 54 61 62 6c 65 2c 20 70 45 4c  ior, iTable, pEL
12b50 69 73 74 29 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f  ist);.}.#endif /
12b60 2a 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  * !defined(SQLIT
12b70 45 5f 4f 4d 49 54 5f 56 49 45 57 29 20 2a 2f 0a  E_OMIT_VIEW) */.
12b80 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
12b90 4f 4d 49 54 5f 56 49 45 57 0a 2f 2a 0a 2a 2a 20  OMIT_VIEW./*.** 
12ba0 54 68 69 73 20 72 6f 75 74 69 6e 65 20 61 74 74  This routine att
12bb0 65 6d 70 74 73 20 74 6f 20 66 6c 61 74 74 65 6e  empts to flatten
12bc0 20 73 75 62 71 75 65 72 69 65 73 20 69 6e 20 6f   subqueries in o
12bd0 72 64 65 72 20 74 6f 20 73 70 65 65 64 0a 2a 2a  rder to speed.**
12be0 20 65 78 65 63 75 74 69 6f 6e 2e 20 20 49 74 20   execution.  It 
12bf0 72 65 74 75 72 6e 73 20 31 20 69 66 20 69 74 20  returns 1 if it 
12c00 6d 61 6b 65 73 20 63 68 61 6e 67 65 73 20 61 6e  makes changes an
12c10 64 20 30 20 69 66 20 6e 6f 20 66 6c 61 74 74 65  d 0 if no flatte
12c20 6e 69 6e 67 0a 2a 2a 20 6f 63 63 75 72 73 2e 0a  ning.** occurs..
12c30 2a 2a 0a 2a 2a 20 54 6f 20 75 6e 64 65 72 73 74  **.** To underst
12c40 61 6e 64 20 74 68 65 20 63 6f 6e 63 65 70 74 20  and the concept 
12c50 6f 66 20 66 6c 61 74 74 65 6e 69 6e 67 2c 20 63  of flattening, c
12c60 6f 6e 73 69 64 65 72 20 74 68 65 20 66 6f 6c 6c  onsider the foll
12c70 6f 77 69 6e 67 0a 2a 2a 20 71 75 65 72 79 3a 0a  owing.** query:.
12c80 2a 2a 0a 2a 2a 20 20 20 20 20 53 45 4c 45 43 54  **.**     SELECT
12c90 20 61 20 46 52 4f 4d 20 28 53 45 4c 45 43 54 20   a FROM (SELECT 
12ca0 78 2b 79 20 41 53 20 61 20 46 52 4f 4d 20 74 31  x+y AS a FROM t1
12cb0 20 57 48 45 52 45 20 7a 3c 31 30 30 29 20 57 48   WHERE z<100) WH
12cc0 45 52 45 20 61 3e 35 0a 2a 2a 0a 2a 2a 20 54 68  ERE a>5.**.** Th
12cd0 65 20 64 65 66 61 75 6c 74 20 77 61 79 20 6f 66  e default way of
12ce0 20 69 6d 70 6c 65 6d 65 6e 74 69 6e 67 20 74 68   implementing th
12cf0 69 73 20 71 75 65 72 79 20 69 73 20 74 6f 20 65  is query is to e
12d00 78 65 63 75 74 65 20 74 68 65 0a 2a 2a 20 73 75  xecute the.** su
12d10 62 71 75 65 72 79 20 66 69 72 73 74 20 61 6e 64  bquery first and
12d20 20 73 74 6f 72 65 20 74 68 65 20 72 65 73 75 6c   store the resul
12d30 74 73 20 69 6e 20 61 20 74 65 6d 70 6f 72 61 72  ts in a temporar
12d40 79 20 74 61 62 6c 65 2c 20 74 68 65 6e 0a 2a 2a  y table, then.**
12d50 20 72 75 6e 20 74 68 65 20 6f 75 74 65 72 20 71   run the outer q
12d60 75 65 72 79 20 6f 6e 20 74 68 61 74 20 74 65 6d  uery on that tem
12d70 70 6f 72 61 72 79 20 74 61 62 6c 65 2e 20 20 54  porary table.  T
12d80 68 69 73 20 72 65 71 75 69 72 65 73 20 74 77 6f  his requires two
12d90 0a 2a 2a 20 70 61 73 73 65 73 20 6f 76 65 72 20  .** passes over 
12da0 74 68 65 20 64 61 74 61 2e 20 20 46 75 72 74 68  the data.  Furth
12db0 65 72 6d 6f 72 65 2c 20 62 65 63 61 75 73 65 20  ermore, because 
12dc0 74 68 65 20 74 65 6d 70 6f 72 61 72 79 20 74 61  the temporary ta
12dd0 62 6c 65 0a 2a 2a 20 68 61 73 20 6e 6f 20 69 6e  ble.** has no in
12de0 64 69 63 65 73 2c 20 74 68 65 20 57 48 45 52 45  dices, the WHERE
12df0 20 63 6c 61 75 73 65 20 6f 6e 20 74 68 65 20 6f   clause on the o
12e00 75 74 65 72 20 71 75 65 72 79 20 63 61 6e 6e 6f  uter query canno
12e10 74 20 62 65 0a 2a 2a 20 6f 70 74 69 6d 69 7a 65  t be.** optimize
12e20 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  d..**.** This ro
12e30 75 74 69 6e 65 20 61 74 74 65 6d 70 74 73 20 74  utine attempts t
12e40 6f 20 72 65 77 72 69 74 65 20 71 75 65 72 69 65  o rewrite querie
12e50 73 20 73 75 63 68 20 61 73 20 74 68 65 20 61 62  s such as the ab
12e60 6f 76 65 20 69 6e 74 6f 0a 2a 2a 20 61 20 73 69  ove into.** a si
12e70 6e 67 6c 65 20 66 6c 61 74 20 73 65 6c 65 63 74  ngle flat select
12e80 2c 20 6c 69 6b 65 20 74 68 69 73 3a 0a 2a 2a 0a  , like this:.**.
12e90 2a 2a 20 20 20 20 20 53 45 4c 45 43 54 20 78 2b  **     SELECT x+
12ea0 79 20 41 53 20 61 20 46 52 4f 4d 20 74 31 20 57  y AS a FROM t1 W
12eb0 48 45 52 45 20 7a 3c 31 30 30 20 41 4e 44 20 61  HERE z<100 AND a
12ec0 3e 35 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 6f 64  >5.**.** The cod
12ed0 65 20 67 65 6e 65 72 61 74 65 64 20 66 6f 72 20  e generated for 
12ee0 74 68 69 73 20 73 69 6d 70 69 66 69 63 61 74 69  this simpificati
12ef0 6f 6e 20 67 69 76 65 73 20 74 68 65 20 73 61 6d  on gives the sam
12f00 65 20 72 65 73 75 6c 74 0a 2a 2a 20 62 75 74 20  e result.** but 
12f10 6f 6e 6c 79 20 68 61 73 20 74 6f 20 73 63 61 6e  only has to scan
12f20 20 74 68 65 20 64 61 74 61 20 6f 6e 63 65 2e 20   the data once. 
12f30 20 41 6e 64 20 62 65 63 61 75 73 65 20 69 6e 64   And because ind
12f40 69 63 65 73 20 6d 69 67 68 74 20 0a 2a 2a 20 65  ices might .** e
12f50 78 69 73 74 20 6f 6e 20 74 68 65 20 74 61 62 6c  xist on the tabl
12f60 65 20 74 31 2c 20 61 20 63 6f 6d 70 6c 65 74 65  e t1, a complete
12f70 20 73 63 61 6e 20 6f 66 20 74 68 65 20 64 61 74   scan of the dat
12f80 61 20 6d 69 67 68 74 20 62 65 0a 2a 2a 20 61 76  a might be.** av
12f90 6f 69 64 65 64 2e 0a 2a 2a 0a 2a 2a 20 46 6c 61  oided..**.** Fla
12fa0 74 74 65 6e 69 6e 67 20 69 73 20 6f 6e 6c 79 20  ttening is only 
12fb0 61 74 74 65 6d 70 74 65 64 20 69 66 20 61 6c 6c  attempted if all
12fc0 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   of the followin
12fd0 67 20 61 72 65 20 74 72 75 65 3a 0a 2a 2a 0a 2a  g are true:.**.*
12fe0 2a 20 20 20 28 31 29 20 20 54 68 65 20 73 75 62  *   (1)  The sub
12ff0 71 75 65 72 79 20 61 6e 64 20 74 68 65 20 6f 75  query and the ou
13000 74 65 72 20 71 75 65 72 79 20 64 6f 20 6e 6f 74  ter query do not
13010 20 62 6f 74 68 20 75 73 65 20 61 67 67 72 65 67   both use aggreg
13020 61 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 20 20 28 32  ates..**.**   (2
13030 29 20 20 54 68 65 20 73 75 62 71 75 65 72 79 20  )  The subquery 
13040 69 73 20 6e 6f 74 20 61 6e 20 61 67 67 72 65 67  is not an aggreg
13050 61 74 65 20 6f 72 20 74 68 65 20 6f 75 74 65 72  ate or the outer
13060 20 71 75 65 72 79 20 69 73 20 6e 6f 74 20 61 20   query is not a 
13070 6a 6f 69 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20 28 33  join..**.**   (3
13080 29 20 20 54 68 65 20 73 75 62 71 75 65 72 79 20  )  The subquery 
13090 69 73 20 6e 6f 74 20 74 68 65 20 72 69 67 68 74  is not the right
130a0 20 6f 70 65 72 61 6e 64 20 6f 66 20 61 20 6c 65   operand of a le
130b0 66 74 20 6f 75 74 65 72 20 6a 6f 69 6e 2c 20 6f  ft outer join, o
130c0 72 0a 2a 2a 20 20 20 20 20 20 20 20 74 68 65 20  r.**        the 
130d0 73 75 62 71 75 65 72 79 20 69 73 20 6e 6f 74 20  subquery is not 
130e0 69 74 73 65 6c 66 20 61 20 6a 6f 69 6e 2e 20 20  itself a join.  
130f0 28 54 69 63 6b 65 74 20 23 33 30 36 29 0a 2a 2a  (Ticket #306).**
13100 0a 2a 2a 20 20 20 28 34 29 20 20 54 68 65 20 73  .**   (4)  The s
13110 75 62 71 75 65 72 79 20 69 73 20 6e 6f 74 20 44  ubquery is not D
13120 49 53 54 49 4e 43 54 20 6f 72 20 74 68 65 20 6f  ISTINCT or the o
13130 75 74 65 72 20 71 75 65 72 79 20 69 73 20 6e 6f  uter query is no
13140 74 20 61 20 6a 6f 69 6e 2e 0a 2a 2a 0a 2a 2a 20  t a join..**.** 
13150 20 20 28 35 29 20 20 54 68 65 20 73 75 62 71 75    (5)  The subqu
13160 65 72 79 20 69 73 20 6e 6f 74 20 44 49 53 54 49  ery is not DISTI
13170 4e 43 54 20 6f 72 20 74 68 65 20 6f 75 74 65 72  NCT or the outer
13180 20 71 75 65 72 79 20 64 6f 65 73 20 6e 6f 74 20   query does not 
13190 75 73 65 0a 2a 2a 20 20 20 20 20 20 20 20 61 67  use.**        ag
131a0 67 72 65 67 61 74 65 73 2e 0a 2a 2a 0a 2a 2a 20  gregates..**.** 
131b0 20 20 28 36 29 20 20 54 68 65 20 73 75 62 71 75    (6)  The subqu
131c0 65 72 79 20 64 6f 65 73 20 6e 6f 74 20 75 73 65  ery does not use
131d0 20 61 67 67 72 65 67 61 74 65 73 20 6f 72 20 74   aggregates or t
131e0 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 69  he outer query i
131f0 73 20 6e 6f 74 0a 2a 2a 20 20 20 20 20 20 20 20  s not.**        
13200 44 49 53 54 49 4e 43 54 2e 0a 2a 2a 0a 2a 2a 20  DISTINCT..**.** 
13210 20 20 28 37 29 20 20 54 68 65 20 73 75 62 71 75    (7)  The subqu
13220 65 72 79 20 68 61 73 20 61 20 46 52 4f 4d 20 63  ery has a FROM c
13230 6c 61 75 73 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 28  lause..**.**   (
13240 38 29 20 20 54 68 65 20 73 75 62 71 75 65 72 79  8)  The subquery
13250 20 64 6f 65 73 20 6e 6f 74 20 75 73 65 20 4c 49   does not use LI
13260 4d 49 54 20 6f 72 20 74 68 65 20 6f 75 74 65 72  MIT or the outer
13270 20 71 75 65 72 79 20 69 73 20 6e 6f 74 20 61 20   query is not a 
13280 6a 6f 69 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20 28 39  join..**.**   (9
13290 29 20 20 54 68 65 20 73 75 62 71 75 65 72 79 20  )  The subquery 
132a0 64 6f 65 73 20 6e 6f 74 20 75 73 65 20 4c 49 4d  does not use LIM
132b0 49 54 20 6f 72 20 74 68 65 20 6f 75 74 65 72 20  IT or the outer 
132c0 71 75 65 72 79 20 64 6f 65 73 20 6e 6f 74 20 75  query does not u
132d0 73 65 0a 2a 2a 20 20 20 20 20 20 20 20 61 67 67  se.**        agg
132e0 72 65 67 61 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 20  regates..**.**  
132f0 28 31 30 29 20 20 54 68 65 20 73 75 62 71 75 65  (10)  The subque
13300 72 79 20 64 6f 65 73 20 6e 6f 74 20 75 73 65 20  ry does not use 
13310 61 67 67 72 65 67 61 74 65 73 20 6f 72 20 74 68  aggregates or th
13320 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 64 6f  e outer query do
13330 65 73 20 6e 6f 74 0a 2a 2a 20 20 20 20 20 20 20  es not.**       
13340 20 75 73 65 20 4c 49 4d 49 54 2e 0a 2a 2a 0a 2a   use LIMIT..**.*
13350 2a 20 20 28 31 31 29 20 20 54 68 65 20 73 75 62  *  (11)  The sub
13360 71 75 65 72 79 20 61 6e 64 20 74 68 65 20 6f 75  query and the ou
13370 74 65 72 20 71 75 65 72 79 20 64 6f 20 6e 6f 74  ter query do not
13380 20 62 6f 74 68 20 68 61 76 65 20 4f 52 44 45 52   both have ORDER
13390 20 42 59 20 63 6c 61 75 73 65 73 2e 0a 2a 2a 0a   BY clauses..**.
133a0 2a 2a 20 20 28 31 32 29 20 20 54 68 65 20 73 75  **  (12)  The su
133b0 62 71 75 65 72 79 20 69 73 20 6e 6f 74 20 74 68  bquery is not th
133c0 65 20 72 69 67 68 74 20 74 65 72 6d 20 6f 66 20  e right term of 
133d0 61 20 4c 45 46 54 20 4f 55 54 45 52 20 4a 4f 49  a LEFT OUTER JOI
133e0 4e 20 6f 72 20 74 68 65 0a 2a 2a 20 20 20 20 20  N or the.**     
133f0 20 20 20 73 75 62 71 75 65 72 79 20 68 61 73 20     subquery has 
13400 6e 6f 20 57 48 45 52 45 20 63 6c 61 75 73 65 2e  no WHERE clause.
13410 20 20 28 61 64 64 65 64 20 62 79 20 74 69 63 6b    (added by tick
13420 65 74 20 23 33 35 30 29 0a 2a 2a 0a 2a 2a 20 20  et #350).**.**  
13430 28 31 33 29 20 20 54 68 65 20 73 75 62 71 75 65  (13)  The subque
13440 72 79 20 61 6e 64 20 6f 75 74 65 72 20 71 75 65  ry and outer que
13450 72 79 20 64 6f 20 6e 6f 74 20 62 6f 74 68 20 75  ry do not both u
13460 73 65 20 4c 49 4d 49 54 0a 2a 2a 0a 2a 2a 20 20  se LIMIT.**.**  
13470 28 31 34 29 20 20 54 68 65 20 73 75 62 71 75 65  (14)  The subque
13480 72 79 20 64 6f 65 73 20 6e 6f 74 20 75 73 65 20  ry does not use 
13490 4f 46 46 53 45 54 0a 2a 2a 0a 2a 2a 20 20 28 31  OFFSET.**.**  (1
134a0 35 29 20 20 54 68 65 20 6f 75 74 65 72 20 71 75  5)  The outer qu
134b0 65 72 79 20 69 73 20 6e 6f 74 20 70 61 72 74 20  ery is not part 
134c0 6f 66 20 61 20 63 6f 6d 70 6f 75 6e 64 20 73 65  of a compound se
134d0 6c 65 63 74 20 6f 72 20 74 68 65 0a 2a 2a 20 20  lect or the.**  
134e0 20 20 20 20 20 20 73 75 62 71 75 65 72 79 20 64        subquery d
134f0 6f 65 73 20 6e 6f 74 20 68 61 76 65 20 62 6f 74  oes not have bot
13500 68 20 61 6e 20 4f 52 44 45 52 20 42 59 20 61 6e  h an ORDER BY an
13510 64 20 61 20 4c 49 4d 49 54 20 63 6c 61 75 73 65  d a LIMIT clause
13520 2e 0a 2a 2a 20 20 20 20 20 20 20 20 28 53 65 65  ..**        (See
13530 20 74 69 63 6b 65 74 20 23 32 33 33 39 29 0a 2a   ticket #2339).*
13540 2a 0a 2a 2a 20 49 6e 20 74 68 69 73 20 72 6f 75  *.** In this rou
13550 74 69 6e 65 2c 20 74 68 65 20 22 70 22 20 70 61  tine, the "p" pa
13560 72 61 6d 65 74 65 72 20 69 73 20 61 20 70 6f 69  rameter is a poi
13570 6e 74 65 72 20 74 6f 20 74 68 65 20 6f 75 74 65  nter to the oute
13580 72 20 71 75 65 72 79 2e 0a 2a 2a 20 54 68 65 20  r query..** The 
13590 73 75 62 71 75 65 72 79 20 69 73 20 70 2d 3e 70  subquery is p->p
135a0 53 72 63 2d 3e 61 5b 69 46 72 6f 6d 5d 2e 20 20  Src->a[iFrom].  
135b0 69 73 41 67 67 20 69 73 20 74 72 75 65 20 69 66  isAgg is true if
135c0 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79   the outer query
135d0 0a 2a 2a 20 75 73 65 73 20 61 67 67 72 65 67 61  .** uses aggrega
135e0 74 65 73 20 61 6e 64 20 73 75 62 71 75 65 72 79  tes and subquery
135f0 49 73 41 67 67 20 69 73 20 74 72 75 65 20 69 66  IsAgg is true if
13600 20 74 68 65 20 73 75 62 71 75 65 72 79 20 75 73   the subquery us
13610 65 73 20 61 67 67 72 65 67 61 74 65 73 2e 0a 2a  es aggregates..*
13620 2a 0a 2a 2a 20 49 66 20 66 6c 61 74 74 65 6e 69  *.** If flatteni
13630 6e 67 20 69 73 20 6e 6f 74 20 61 74 74 65 6d 70  ng is not attemp
13640 74 65 64 2c 20 74 68 69 73 20 72 6f 75 74 69 6e  ted, this routin
13650 65 20 69 73 20 61 20 6e 6f 2d 6f 70 20 61 6e 64  e is a no-op and
13660 20 72 65 74 75 72 6e 73 20 30 2e 0a 2a 2a 20 49   returns 0..** I
13670 66 20 66 6c 61 74 74 65 6e 69 6e 67 20 69 73 20  f flattening is 
13680 61 74 74 65 6d 70 74 65 64 20 74 68 69 73 20 72  attempted this r
13690 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73 20 31  outine returns 1
136a0 2e 0a 2a 2a 0a 2a 2a 20 41 6c 6c 20 6f 66 20 74  ..**.** All of t
136b0 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 61 6e  he expression an
136c0 61 6c 79 73 69 73 20 6d 75 73 74 20 6f 63 63 75  alysis must occu
136d0 72 20 6f 6e 20 62 6f 74 68 20 74 68 65 20 6f 75  r on both the ou
136e0 74 65 72 20 71 75 65 72 79 20 61 6e 64 0a 2a 2a  ter query and.**
136f0 20 74 68 65 20 73 75 62 71 75 65 72 79 20 62 65   the subquery be
13700 66 6f 72 65 20 74 68 69 73 20 72 6f 75 74 69 6e  fore this routin
13710 65 20 72 75 6e 73 2e 0a 2a 2f 0a 73 74 61 74 69  e runs..*/.stati
13720 63 20 69 6e 74 20 66 6c 61 74 74 65 6e 53 75 62  c int flattenSub
13730 71 75 65 72 79 28 0a 20 20 73 71 6c 69 74 65 33  query(.  sqlite3
13740 20 2a 64 62 2c 20 20 20 20 20 20 20 20 20 2f 2a   *db,         /*
13750 20 44 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63   Database connec
13760 74 69 6f 6e 20 2a 2f 0a 20 20 53 65 6c 65 63 74  tion */.  Select
13770 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 2f   *p,           /
13780 2a 20 54 68 65 20 70 61 72 65 6e 74 20 6f 72 20  * The parent or 
13790 6f 75 74 65 72 20 53 45 4c 45 43 54 20 73 74 61  outer SELECT sta
137a0 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20  tement */.  int 
137b0 69 46 72 6f 6d 2c 20 20 20 20 20 20 20 20 20 20  iFrom,          
137c0 20 2f 2a 20 49 6e 64 65 78 20 69 6e 20 70 2d 3e   /* Index in p->
137d0 70 53 72 63 2d 3e 61 5b 5d 20 6f 66 20 74 68 65  pSrc->a[] of the
137e0 20 69 6e 6e 65 72 20 73 75 62 71 75 65 72 79 20   inner subquery 
137f0 2a 2f 0a 20 20 69 6e 74 20 69 73 41 67 67 2c 20  */.  int isAgg, 
13800 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
13810 65 20 69 66 20 6f 75 74 65 72 20 53 45 4c 45 43  e if outer SELEC
13820 54 20 75 73 65 73 20 61 67 67 72 65 67 61 74 65  T uses aggregate
13830 20 66 75 6e 63 74 69 6f 6e 73 20 2a 2f 0a 20 20   functions */.  
13840 69 6e 74 20 73 75 62 71 75 65 72 79 49 73 41 67  int subqueryIsAg
13850 67 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20  g    /* True if 
13860 74 68 65 20 73 75 62 71 75 65 72 79 20 75 73 65  the subquery use
13870 73 20 61 67 67 72 65 67 61 74 65 20 66 75 6e 63  s aggregate func
13880 74 69 6f 6e 73 20 2a 2f 0a 29 7b 0a 20 20 53 65  tions */.){.  Se
13890 6c 65 63 74 20 2a 70 53 75 62 3b 20 20 20 20 20  lect *pSub;     
138a0 20 20 2f 2a 20 54 68 65 20 69 6e 6e 65 72 20 71    /* The inner q
138b0 75 65 72 79 20 6f 72 20 22 73 75 62 71 75 65 72  uery or "subquer
138c0 79 22 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20  y" */.  SrcList 
138d0 2a 70 53 72 63 3b 20 20 20 20 20 20 2f 2a 20 54  *pSrc;      /* T
138e0 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f  he FROM clause o
138f0 66 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72  f the outer quer
13900 79 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a  y */.  SrcList *
13910 70 53 75 62 53 72 63 3b 20 20 20 2f 2a 20 54 68  pSubSrc;   /* Th
13920 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66  e FROM clause of
13930 20 74 68 65 20 73 75 62 71 75 65 72 79 20 2a 2f   the subquery */
13940 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69  .  ExprList *pLi
13950 73 74 3b 20 20 20 20 2f 2a 20 54 68 65 20 72 65  st;    /* The re
13960 73 75 6c 74 20 73 65 74 20 6f 66 20 74 68 65 20  sult set of the 
13970 6f 75 74 65 72 20 71 75 65 72 79 20 2a 2f 0a 20  outer query */. 
13980 20 69 6e 74 20 69 50 61 72 65 6e 74 3b 20 20 20   int iParent;   
13990 20 20 20 20 20 2f 2a 20 56 44 42 45 20 63 75 72       /* VDBE cur
139a0 73 6f 72 20 6e 75 6d 62 65 72 20 6f 66 20 74 68  sor number of th
139b0 65 20 70 53 75 62 20 72 65 73 75 6c 74 20 73 65  e pSub result se
139c0 74 20 74 65 6d 70 20 74 61 62 6c 65 20 2a 2f 0a  t temp table */.
139d0 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20    int i;        
139e0 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f        /* Loop co
139f0 75 6e 74 65 72 20 2a 2f 0a 20 20 45 78 70 72 20  unter */.  Expr 
13a00 2a 70 57 68 65 72 65 3b 20 20 20 20 20 20 20 20  *pWhere;        
13a10 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
13a20 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  he WHERE clause 
13a30 2a 2f 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c  */.  struct SrcL
13a40 69 73 74 5f 69 74 65 6d 20 2a 70 53 75 62 69 74  ist_item *pSubit
13a50 65 6d 3b 20 20 20 2f 2a 20 54 68 65 20 73 75 62  em;   /* The sub
13a60 71 75 65 72 79 20 2a 2f 0a 0a 20 20 2f 2a 20 43  query */..  /* C
13a70 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20 66  heck to see if f
13a80 6c 61 74 74 65 6e 69 6e 67 20 69 73 20 70 65 72  lattening is per
13a90 6d 69 74 74 65 64 2e 20 20 52 65 74 75 72 6e 20  mitted.  Return 
13aa0 30 20 69 66 20 6e 6f 74 2e 0a 20 20 2a 2f 0a 20  0 if not..  */. 
13ab0 20 69 66 28 20 70 3d 3d 30 20 29 20 72 65 74 75   if( p==0 ) retu
13ac0 72 6e 20 30 3b 0a 20 20 70 53 72 63 20 3d 20 70  rn 0;.  pSrc = p
13ad0 2d 3e 70 53 72 63 3b 0a 20 20 61 73 73 65 72 74  ->pSrc;.  assert
13ae0 28 20 70 53 72 63 20 26 26 20 69 46 72 6f 6d 3e  ( pSrc && iFrom>
13af0 3d 30 20 26 26 20 69 46 72 6f 6d 3c 70 53 72 63  =0 && iFrom<pSrc
13b00 2d 3e 6e 53 72 63 20 29 3b 0a 20 20 70 53 75 62  ->nSrc );.  pSub
13b10 69 74 65 6d 20 3d 20 26 70 53 72 63 2d 3e 61 5b  item = &pSrc->a[
13b20 69 46 72 6f 6d 5d 3b 0a 20 20 70 53 75 62 20 3d  iFrom];.  pSub =
13b30 20 70 53 75 62 69 74 65 6d 2d 3e 70 53 65 6c 65   pSubitem->pSele
13b40 63 74 3b 0a 20 20 61 73 73 65 72 74 28 20 70 53  ct;.  assert( pS
13b50 75 62 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 69  ub!=0 );.  if( i
13b60 73 41 67 67 20 26 26 20 73 75 62 71 75 65 72 79  sAgg && subquery
13b70 49 73 41 67 67 20 29 20 72 65 74 75 72 6e 20 30  IsAgg ) return 0
13b80 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
13b90 20 20 2f 2a 20 52 65 73 74 72 69 63 74 69 6f 6e    /* Restriction
13ba0 20 28 31 29 20 20 2a 2f 0a 20 20 69 66 28 20 73   (1)  */.  if( s
13bb0 75 62 71 75 65 72 79 49 73 41 67 67 20 26 26 20  ubqueryIsAgg && 
13bc0 70 53 72 63 2d 3e 6e 53 72 63 3e 31 20 29 20 72  pSrc->nSrc>1 ) r
13bd0 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20 20  eturn 0;        
13be0 20 20 2f 2a 20 52 65 73 74 72 69 63 74 69 6f 6e    /* Restriction
13bf0 20 28 32 29 20 20 2a 2f 0a 20 20 70 53 75 62 53   (2)  */.  pSubS
13c00 72 63 20 3d 20 70 53 75 62 2d 3e 70 53 72 63 3b  rc = pSub->pSrc;
13c10 0a 20 20 61 73 73 65 72 74 28 20 70 53 75 62 53  .  assert( pSubS
13c20 72 63 20 29 3b 0a 20 20 2f 2a 20 50 72 69 6f 72  rc );.  /* Prior
13c30 20 74 6f 20 76 65 72 73 69 6f 6e 20 33 2e 31 2e   to version 3.1.
13c40 32 2c 20 77 68 65 6e 20 4c 49 4d 49 54 20 61 6e  2, when LIMIT an
13c50 64 20 4f 46 46 53 45 54 20 68 61 64 20 74 6f 20  d OFFSET had to 
13c60 62 65 20 73 69 6d 70 6c 65 20 63 6f 6e 73 74 61  be simple consta
13c70 6e 74 73 2c 0a 20 20 2a 2a 20 6e 6f 74 20 61 72  nts,.  ** not ar
13c80 62 69 74 72 61 72 79 20 65 78 70 72 65 73 73 73  bitrary expresss
13c90 69 6f 6e 73 2c 20 77 65 20 61 6c 6c 6f 77 65 64  ions, we allowed
13ca0 20 73 6f 6d 65 20 63 6f 6d 62 69 6e 69 6e 67 20   some combining 
13cb0 6f 66 20 4c 49 4d 49 54 20 61 6e 64 20 4f 46 46  of LIMIT and OFF
13cc0 53 45 54 0a 20 20 2a 2a 20 62 65 63 61 75 73 65  SET.  ** because
13cd0 20 74 68 65 79 20 63 6f 75 6c 64 20 62 65 20 63   they could be c
13ce0 6f 6d 70 75 74 65 64 20 61 74 20 63 6f 6d 70 69  omputed at compi
13cf0 6c 65 2d 74 69 6d 65 2e 20 20 42 75 74 20 77 68  le-time.  But wh
13d00 65 6e 20 4c 49 4d 49 54 20 61 6e 64 20 4f 46 46  en LIMIT and OFF
13d10 53 45 54 0a 20 20 2a 2a 20 62 65 63 61 6d 65 20  SET.  ** became 
13d20 61 72 62 69 74 72 61 72 79 20 65 78 70 72 65 73  arbitrary expres
13d30 73 69 6f 6e 73 2c 20 77 65 20 77 65 72 65 20 66  sions, we were f
13d40 6f 72 63 65 64 20 74 6f 20 61 64 64 20 72 65 73  orced to add res
13d50 74 72 69 63 74 69 6f 6e 73 20 28 31 33 29 0a 20  trictions (13). 
13d60 20 2a 2a 20 61 6e 64 20 28 31 34 29 2e 20 2a 2f   ** and (14). */
13d70 0a 20 20 69 66 28 20 70 53 75 62 2d 3e 70 4c 69  .  if( pSub->pLi
13d80 6d 69 74 20 26 26 20 70 2d 3e 70 4c 69 6d 69 74  mit && p->pLimit
13d90 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20   ) return 0;    
13da0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73            /* Res
13db0 74 72 69 63 74 69 6f 6e 20 28 31 33 29 20 2a 2f  triction (13) */
13dc0 0a 20 20 69 66 28 20 70 53 75 62 2d 3e 70 4f 66  .  if( pSub->pOf
13dd0 66 73 65 74 20 29 20 72 65 74 75 72 6e 20 30 3b  fset ) return 0;
13de0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13df0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73            /* Res
13e00 74 72 69 63 74 69 6f 6e 20 28 31 34 29 20 2a 2f  triction (14) */
13e10 0a 20 20 69 66 28 20 70 2d 3e 70 52 69 67 68 74  .  if( p->pRight
13e20 6d 6f 73 74 20 26 26 20 70 53 75 62 2d 3e 70 4c  most && pSub->pL
13e30 69 6d 69 74 20 26 26 20 70 53 75 62 2d 3e 70 4f  imit && pSub->pO
13e40 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20 72 65  rderBy ){.    re
13e50 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20 20 20  turn 0;         
13e60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13e70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13e80 20 20 20 2f 2a 20 52 65 73 74 72 69 63 74 69 6f     /* Restrictio
13e90 6e 20 28 31 35 29 20 2a 2f 0a 20 20 7d 0a 20 20  n (15) */.  }.  
13ea0 69 66 28 20 70 53 75 62 53 72 63 2d 3e 6e 53 72  if( pSubSrc->nSr
13eb0 63 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b  c==0 ) return 0;
13ec0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13ed0 20 20 20 20 20 20 20 2f 2a 20 52 65 73 74 72 69         /* Restri
13ee0 63 74 69 6f 6e 20 28 37 29 20 20 2a 2f 0a 20 20  ction (7)  */.  
13ef0 69 66 28 20 28 70 53 75 62 2d 3e 69 73 44 69 73  if( (pSub->isDis
13f00 74 69 6e 63 74 20 7c 7c 20 70 53 75 62 2d 3e 70  tinct || pSub->p
13f10 4c 69 6d 69 74 29 20 0a 20 20 20 20 20 20 20 20  Limit) .        
13f20 20 26 26 20 28 70 53 72 63 2d 3e 6e 53 72 63 3e   && (pSrc->nSrc>
13f30 31 20 7c 7c 20 69 73 41 67 67 29 20 29 7b 20 20  1 || isAgg) ){  
13f40 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73 74 72          /* Restr
13f50 69 63 74 69 6f 6e 73 20 28 34 29 28 35 29 28 38  ictions (4)(5)(8
13f60 29 28 39 29 20 2a 2f 0a 20 20 20 20 20 72 65 74  )(9) */.     ret
13f70 75 72 6e 20 30 3b 20 20 20 20 20 20 20 0a 20 20  urn 0;       .  
13f80 7d 0a 20 20 69 66 28 20 70 2d 3e 69 73 44 69 73  }.  if( p->isDis
13f90 74 69 6e 63 74 20 26 26 20 73 75 62 71 75 65 72  tinct && subquer
13fa0 79 49 73 41 67 67 20 29 20 72 65 74 75 72 6e 20  yIsAgg ) return 
13fb0 30 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65  0;         /* Re
13fc0 73 74 72 69 63 74 69 6f 6e 20 28 36 29 20 20 2a  striction (6)  *
13fd0 2f 0a 20 20 69 66 28 20 28 70 2d 3e 64 69 73 61  /.  if( (p->disa
13fe0 6c 6c 6f 77 4f 72 64 65 72 42 79 20 7c 7c 20 70  llowOrderBy || p
13ff0 2d 3e 70 4f 72 64 65 72 42 79 29 20 26 26 20 70  ->pOrderBy) && p
14000 53 75 62 2d 3e 70 4f 72 64 65 72 42 79 20 29 7b  Sub->pOrderBy ){
14010 0a 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 20  .     return 0; 
14020 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14030 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14040 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73            /* Res
14050 74 72 69 63 74 69 6f 6e 20 28 31 31 29 20 2a 2f  triction (11) */
14060 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 65 73 74 72  .  }..  /* Restr
14070 69 63 74 69 6f 6e 20 33 3a 20 20 49 66 20 74 68  iction 3:  If th
14080 65 20 73 75 62 71 75 65 72 79 20 69 73 20 61 20  e subquery is a 
14090 6a 6f 69 6e 2c 20 6d 61 6b 65 20 73 75 72 65 20  join, make sure 
140a0 74 68 65 20 73 75 62 71 75 65 72 79 20 69 73 20  the subquery is 
140b0 0a 20 20 2a 2a 20 6e 6f 74 20 75 73 65 64 20 61  .  ** not used a
140c0 73 20 74 68 65 20 72 69 67 68 74 20 6f 70 65 72  s the right oper
140d0 61 6e 64 20 6f 66 20 61 6e 20 6f 75 74 65 72 20  and of an outer 
140e0 6a 6f 69 6e 2e 20 20 45 78 61 6d 70 6c 65 73 20  join.  Examples 
140f0 6f 66 20 77 68 79 20 74 68 69 73 0a 20 20 2a 2a  of why this.  **
14100 20 69 73 20 6e 6f 74 20 61 6c 6c 6f 77 65 64 3a   is not allowed:
14110 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 20  .  **.  **      
14120 20 20 20 74 31 20 4c 45 46 54 20 4f 55 54 45 52     t1 LEFT OUTER
14130 20 4a 4f 49 4e 20 28 74 32 20 4a 4f 49 4e 20 74   JOIN (t2 JOIN t
14140 33 29 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20  3).  **.  ** If 
14150 77 65 20 66 6c 61 74 74 65 6e 20 74 68 65 20 61  we flatten the a
14160 62 6f 76 65 2c 20 77 65 20 77 6f 75 6c 64 20 67  bove, we would g
14170 65 74 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20  et.  **.  **    
14180 20 20 20 20 20 28 74 31 20 4c 45 46 54 20 4f 55       (t1 LEFT OU
14190 54 45 52 20 4a 4f 49 4e 20 74 32 29 20 4a 4f 49  TER JOIN t2) JOI
141a0 4e 20 74 33 0a 20 20 2a 2a 0a 20 20 2a 2a 20 77  N t3.  **.  ** w
141b0 68 69 63 68 20 69 73 20 6e 6f 74 20 61 74 20 61  hich is not at a
141c0 6c 6c 20 74 68 65 20 73 61 6d 65 20 74 68 69 6e  ll the same thin
141d0 67 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 53  g..  */.  if( pS
141e0 75 62 53 72 63 2d 3e 6e 53 72 63 3e 31 20 26 26  ubSrc->nSrc>1 &&
141f0 20 28 70 53 75 62 69 74 65 6d 2d 3e 6a 6f 69 6e   (pSubitem->join
14200 74 79 70 65 20 26 20 4a 54 5f 4f 55 54 45 52 29  type & JT_OUTER)
14210 21 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72  !=0 ){.    retur
14220 6e 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52  n 0;.  }..  /* R
14230 65 73 74 72 69 63 74 69 6f 6e 20 31 32 3a 20 20  estriction 12:  
14240 49 66 20 74 68 65 20 73 75 62 71 75 65 72 79 20  If the subquery 
14250 69 73 20 74 68 65 20 72 69 67 68 74 20 6f 70 65  is the right ope
14260 72 61 6e 64 20 6f 66 20 61 20 6c 65 66 74 20 6f  rand of a left o
14270 75 74 65 72 0a 20 20 2a 2a 20 6a 6f 69 6e 2c 20  uter.  ** join, 
14280 6d 61 6b 65 20 73 75 72 65 20 74 68 65 20 73 75  make sure the su
14290 62 71 75 65 72 79 20 68 61 73 20 6e 6f 20 57 48  bquery has no WH
142a0 45 52 45 20 63 6c 61 75 73 65 2e 0a 20 20 2a 2a  ERE clause..  **
142b0 20 41 6e 20 65 78 61 6d 70 6c 65 73 20 6f 66 20   An examples of 
142c0 77 68 79 20 74 68 69 73 20 69 73 20 6e 6f 74 20  why this is not 
142d0 61 6c 6c 6f 77 65 64 3a 0a 20 20 2a 2a 0a 20 20  allowed:.  **.  
142e0 2a 2a 20 20 20 20 20 20 20 20 20 74 31 20 4c 45  **         t1 LE
142f0 46 54 20 4f 55 54 45 52 20 4a 4f 49 4e 20 28 53  FT OUTER JOIN (S
14300 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 32 20  ELECT * FROM t2 
14310 57 48 45 52 45 20 74 32 2e 78 3e 30 29 0a 20 20  WHERE t2.x>0).  
14320 2a 2a 0a 20 20 2a 2a 20 49 66 20 77 65 20 66 6c  **.  ** If we fl
14330 61 74 74 65 6e 20 74 68 65 20 61 62 6f 76 65 2c  atten the above,
14340 20 77 65 20 77 6f 75 6c 64 20 67 65 74 0a 20 20   we would get.  
14350 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 20 20 20 20  **.  **         
14360 28 74 31 20 4c 45 46 54 20 4f 55 54 45 52 20 4a  (t1 LEFT OUTER J
14370 4f 49 4e 20 74 32 29 20 57 48 45 52 45 20 74 32  OIN t2) WHERE t2
14380 2e 78 3e 30 0a 20 20 2a 2a 0a 20 20 2a 2a 20 42  .x>0.  **.  ** B
14390 75 74 20 74 68 65 20 74 32 2e 78 3e 30 20 74 65  ut the t2.x>0 te
143a0 73 74 20 77 69 6c 6c 20 61 6c 77 61 79 73 20 66  st will always f
143b0 61 69 6c 20 6f 6e 20 61 20 4e 55 4c 4c 20 72 6f  ail on a NULL ro
143c0 77 20 6f 66 20 74 32 2c 20 77 68 69 63 68 0a 20  w of t2, which. 
143d0 20 2a 2a 20 65 66 66 65 63 74 69 76 65 6c 79 20   ** effectively 
143e0 63 6f 6e 76 65 72 74 73 20 74 68 65 20 4f 55 54  converts the OUT
143f0 45 52 20 4a 4f 49 4e 20 69 6e 74 6f 20 61 6e 20  ER JOIN into an 
14400 49 4e 4e 45 52 20 4a 4f 49 4e 2e 0a 20 20 2a 2f  INNER JOIN..  */
14410 0a 20 20 69 66 28 20 28 70 53 75 62 69 74 65 6d  .  if( (pSubitem
14420 2d 3e 6a 6f 69 6e 74 79 70 65 20 26 20 4a 54 5f  ->jointype & JT_
14430 4f 55 54 45 52 29 21 3d 30 20 26 26 20 70 53 75  OUTER)!=0 && pSu
14440 62 2d 3e 70 57 68 65 72 65 21 3d 30 20 29 7b 0a  b->pWhere!=0 ){.
14450 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
14460 7d 0a 0a 20 20 2f 2a 20 49 66 20 77 65 20 72 65  }..  /* If we re
14470 61 63 68 20 74 68 69 73 20 70 6f 69 6e 74 2c 20  ach this point, 
14480 69 74 20 6d 65 61 6e 73 20 66 6c 61 74 74 65 6e  it means flatten
14490 69 6e 67 20 69 73 20 70 65 72 6d 69 74 74 65 64  ing is permitted
144a0 20 66 6f 72 20 74 68 65 0a 20 20 2a 2a 20 69 46   for the.  ** iF
144b0 72 6f 6d 2d 74 68 20 65 6e 74 72 79 20 6f 66 20  rom-th entry of 
144c0 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20  the FROM clause 
144d0 69 6e 20 74 68 65 20 6f 75 74 65 72 20 71 75 65  in the outer que
144e0 72 79 2e 0a 20 20 2a 2f 0a 0a 20 20 2f 2a 20 4d  ry..  */..  /* M
144f0 6f 76 65 20 61 6c 6c 20 6f 66 20 74 68 65 20 46  ove all of the F
14500 52 4f 4d 20 65 6c 65 6d 65 6e 74 73 20 6f 66 20  ROM elements of 
14510 74 68 65 20 73 75 62 71 75 65 72 79 20 69 6e 74  the subquery int
14520 6f 20 74 68 65 0a 20 20 2a 2a 20 74 68 65 20 46  o the.  ** the F
14530 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20 74 68  ROM clause of th
14540 65 20 6f 75 74 65 72 20 71 75 65 72 79 2e 20 20  e outer query.  
14550 42 65 66 6f 72 65 20 64 6f 69 6e 67 20 74 68 69  Before doing thi
14560 73 2c 20 72 65 6d 65 6d 62 65 72 0a 20 20 2a 2a  s, remember.  **
14570 20 74 68 65 20 63 75 72 73 6f 72 20 6e 75 6d 62   the cursor numb
14580 65 72 20 66 6f 72 20 74 68 65 20 6f 72 69 67 69  er for the origi
14590 6e 61 6c 20 6f 75 74 65 72 20 71 75 65 72 79 20  nal outer query 
145a0 46 52 4f 4d 20 65 6c 65 6d 65 6e 74 20 69 6e 0a  FROM element in.
145b0 20 20 2a 2a 20 69 50 61 72 65 6e 74 2e 20 20 54    ** iParent.  T
145c0 68 65 20 69 50 61 72 65 6e 74 20 63 75 72 73 6f  he iParent curso
145d0 72 20 77 69 6c 6c 20 6e 65 76 65 72 20 62 65 20  r will never be 
145e0 75 73 65 64 2e 20 20 53 75 62 73 65 71 75 65 6e  used.  Subsequen
145f0 74 20 63 6f 64 65 0a 20 20 2a 2a 20 77 69 6c 6c  t code.  ** will
14600 20 73 63 61 6e 20 65 78 70 72 65 73 73 69 6f 6e   scan expression
14610 73 20 6c 6f 6f 6b 69 6e 67 20 66 6f 72 20 69 50  s looking for iP
14620 61 72 65 6e 74 20 72 65 66 65 72 65 6e 63 65 73  arent references
14630 20 61 6e 64 20 72 65 70 6c 61 63 65 0a 20 20 2a   and replace.  *
14640 2a 20 74 68 6f 73 65 20 72 65 66 65 72 65 6e 63  * those referenc
14650 65 73 20 77 69 74 68 20 65 78 70 72 65 73 73 69  es with expressi
14660 6f 6e 73 20 74 68 61 74 20 72 65 73 6f 6c 76 65  ons that resolve
14670 20 74 6f 20 74 68 65 20 73 75 62 71 75 65 72 79   to the subquery
14680 20 46 52 4f 4d 0a 20 20 2a 2a 20 65 6c 65 6d 65   FROM.  ** eleme
14690 6e 74 73 20 77 65 20 61 72 65 20 6e 6f 77 20 63  nts we are now c
146a0 6f 70 79 69 6e 67 20 69 6e 2e 0a 20 20 2a 2f 0a  opying in..  */.
146b0 20 20 69 50 61 72 65 6e 74 20 3d 20 70 53 75 62    iParent = pSub
146c0 69 74 65 6d 2d 3e 69 43 75 72 73 6f 72 3b 0a 20  item->iCursor;. 
146d0 20 7b 0a 20 20 20 20 69 6e 74 20 6e 53 75 62 53   {.    int nSubS
146e0 72 63 20 3d 20 70 53 75 62 53 72 63 2d 3e 6e 53  rc = pSubSrc->nS
146f0 72 63 3b 0a 20 20 20 20 69 6e 74 20 6a 6f 69 6e  rc;.    int join
14700 74 79 70 65 20 3d 20 70 53 75 62 69 74 65 6d 2d  type = pSubitem-
14710 3e 6a 6f 69 6e 74 79 70 65 3b 0a 0a 20 20 20 20  >jointype;..    
14720 73 71 6c 69 74 65 33 44 65 6c 65 74 65 54 61 62  sqlite3DeleteTab
14730 6c 65 28 70 53 75 62 69 74 65 6d 2d 3e 70 54 61  le(pSubitem->pTa
14740 62 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  b);.    sqlite3_
14750 66 72 65 65 28 70 53 75 62 69 74 65 6d 2d 3e 7a  free(pSubitem->z
14760 44 61 74 61 62 61 73 65 29 3b 0a 20 20 20 20 73  Database);.    s
14770 71 6c 69 74 65 33 5f 66 72 65 65 28 70 53 75 62  qlite3_free(pSub
14780 69 74 65 6d 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20  item->zName);.  
14790 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
147a0 53 75 62 69 74 65 6d 2d 3e 7a 41 6c 69 61 73 29  Subitem->zAlias)
147b0 3b 0a 20 20 20 20 70 53 75 62 69 74 65 6d 2d 3e  ;.    pSubitem->
147c0 70 54 61 62 20 3d 20 30 3b 0a 20 20 20 20 70 53  pTab = 0;.    pS
147d0 75 62 69 74 65 6d 2d 3e 7a 44 61 74 61 62 61 73  ubitem->zDatabas
147e0 65 20 3d 20 30 3b 0a 20 20 20 20 70 53 75 62 69  e = 0;.    pSubi
147f0 74 65 6d 2d 3e 7a 4e 61 6d 65 20 3d 20 30 3b 0a  tem->zName = 0;.
14800 20 20 20 20 70 53 75 62 69 74 65 6d 2d 3e 7a 41      pSubitem->zA
14810 6c 69 61 73 20 3d 20 30 3b 0a 20 20 20 20 69 66  lias = 0;.    if
14820 28 20 6e 53 75 62 53 72 63 3e 31 20 29 7b 0a 20  ( nSubSrc>1 ){. 
14830 20 20 20 20 20 69 6e 74 20 65 78 74 72 61 20 3d       int extra =
14840 20 6e 53 75 62 53 72 63 20 2d 20 31 3b 0a 20 20   nSubSrc - 1;.  
14850 20 20 20 20 66 6f 72 28 69 3d 31 3b 20 69 3c 6e      for(i=1; i<n
14860 53 75 62 53 72 63 3b 20 69 2b 2b 29 7b 0a 20 20  SubSrc; i++){.  
14870 20 20 20 20 20 20 70 53 72 63 20 3d 20 73 71 6c        pSrc = sql
14880 69 74 65 33 53 72 63 4c 69 73 74 41 70 70 65 6e  ite3SrcListAppen
14890 64 28 64 62 2c 20 70 53 72 63 2c 20 30 2c 20 30  d(db, pSrc, 0, 0
148a0 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  );.        if( p
148b0 53 72 63 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  Src==0 ){.      
148c0 20 20 20 20 70 2d 3e 70 53 72 63 20 3d 20 30 3b      p->pSrc = 0;
148d0 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72  .          retur
148e0 6e 20 31 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  n 1;.        }. 
148f0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 2d 3e       }.      p->
14900 70 53 72 63 20 3d 20 70 53 72 63 3b 0a 20 20 20  pSrc = pSrc;.   
14910 20 20 20 66 6f 72 28 69 3d 70 53 72 63 2d 3e 6e     for(i=pSrc->n
14920 53 72 63 2d 31 3b 20 69 2d 65 78 74 72 61 3e 3d  Src-1; i-extra>=
14930 69 46 72 6f 6d 3b 20 69 2d 2d 29 7b 0a 20 20 20  iFrom; i--){.   
14940 20 20 20 20 20 70 53 72 63 2d 3e 61 5b 69 5d 20       pSrc->a[i] 
14950 3d 20 70 53 72 63 2d 3e 61 5b 69 2d 65 78 74 72  = pSrc->a[i-extr
14960 61 5d 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  a];.      }.    
14970 7d 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  }.    for(i=0; i
14980 3c 6e 53 75 62 53 72 63 3b 20 69 2b 2b 29 7b 0a  <nSubSrc; i++){.
14990 20 20 20 20 20 20 70 53 72 63 2d 3e 61 5b 69 2b        pSrc->a[i+
149a0 69 46 72 6f 6d 5d 20 3d 20 70 53 75 62 53 72 63  iFrom] = pSubSrc
149b0 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20 20 20 6d 65  ->a[i];.      me
149c0 6d 73 65 74 28 26 70 53 75 62 53 72 63 2d 3e 61  mset(&pSubSrc->a
149d0 5b 69 5d 2c 20 30 2c 20 73 69 7a 65 6f 66 28 70  [i], 0, sizeof(p
149e0 53 75 62 53 72 63 2d 3e 61 5b 69 5d 29 29 3b 0a  SubSrc->a[i]));.
149f0 20 20 20 20 7d 0a 20 20 20 20 70 53 72 63 2d 3e      }.    pSrc->
14a00 61 5b 69 46 72 6f 6d 5d 2e 6a 6f 69 6e 74 79 70  a[iFrom].jointyp
14a10 65 20 3d 20 6a 6f 69 6e 74 79 70 65 3b 0a 20 20  e = jointype;.  
14a20 7d 0a 0a 20 20 2f 2a 20 4e 6f 77 20 62 65 67 69  }..  /* Now begi
14a30 6e 20 73 75 62 73 74 69 74 75 74 69 6e 67 20 73  n substituting s
14a40 75 62 71 75 65 72 79 20 72 65 73 75 6c 74 20 73  ubquery result s
14a50 65 74 20 65 78 70 72 65 73 73 69 6f 6e 73 20 66  et expressions f
14a60 6f 72 20 0a 20 20 2a 2a 20 72 65 66 65 72 65 6e  or .  ** referen
14a70 63 65 73 20 74 6f 20 74 68 65 20 69 50 61 72 65  ces to the iPare
14a80 6e 74 20 69 6e 20 74 68 65 20 6f 75 74 65 72 20  nt in the outer 
14a90 71 75 65 72 79 2e 0a 20 20 2a 2a 20 0a 20 20 2a  query..  ** .  *
14aa0 2a 20 45 78 61 6d 70 6c 65 3a 0a 20 20 2a 2a 0a  * Example:.  **.
14ab0 20 20 2a 2a 20 20 20 53 45 4c 45 43 54 20 61 2b    **   SELECT a+
14ac0 35 2c 20 62 2a 31 30 20 46 52 4f 4d 20 28 53 45  5, b*10 FROM (SE
14ad0 4c 45 43 54 20 78 2a 33 20 41 53 20 61 2c 20 79  LECT x*3 AS a, y
14ae0 2b 31 30 20 41 53 20 62 20 46 52 4f 4d 20 74 31  +10 AS b FROM t1
14af0 29 20 57 48 45 52 45 20 61 3e 62 3b 0a 20 20 2a  ) WHERE a>b;.  *
14b00 2a 20 20 20 5c 20 20 20 20 20 20 20 20 20 20 20  *   \           
14b10 20 20 20 20 20 20 20 20 20 20 5c 5f 5f 5f 5f 5f            \_____
14b20 5f 5f 5f 5f 5f 5f 5f 5f 20 73 75 62 71 75 65 72  ________ subquer
14b30 79 20 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 2f 20 20 20  y __________/   
14b40 20 20 20 20 20 20 20 2f 0a 20 20 2a 2a 20 20 20         /.  **   
14b50 20 5c 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f   \______________
14b60 5f 5f 5f 5f 5f 5f 5f 20 6f 75 74 65 72 20 71 75  _______ outer qu
14b70 65 72 79 20 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f  ery ____________
14b80 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f  ________________
14b90 5f 5f 2f 0a 20 20 2a 2a 0a 20 20 2a 2a 20 57 65  __/.  **.  ** We
14ba0 20 6c 6f 6f 6b 20 61 74 20 65 76 65 72 79 20 65   look at every e
14bb0 78 70 72 65 73 73 69 6f 6e 20 69 6e 20 74 68 65  xpression in the
14bc0 20 6f 75 74 65 72 20 71 75 65 72 79 20 61 6e 64   outer query and
14bd0 20 65 76 65 72 79 20 70 6c 61 63 65 20 77 65 20   every place we 
14be0 73 65 65 0a 20 20 2a 2a 20 22 61 22 20 77 65 20  see.  ** "a" we 
14bf0 73 75 62 73 74 69 74 75 74 65 20 22 78 2a 33 22  substitute "x*3"
14c00 20 61 6e 64 20 65 76 65 72 79 20 70 6c 61 63 65   and every place
14c10 20 77 65 20 73 65 65 20 22 62 22 20 77 65 20 73   we see "b" we s
14c20 75 62 73 74 69 74 75 74 65 20 22 79 2b 31 30 22  ubstitute "y+10"
14c30 2e 0a 20 20 2a 2f 0a 20 20 70 4c 69 73 74 20 3d  ..  */.  pList =
14c40 20 70 2d 3e 70 45 4c 69 73 74 3b 0a 20 20 66 6f   p->pEList;.  fo
14c50 72 28 69 3d 30 3b 20 69 3c 70 4c 69 73 74 2d 3e  r(i=0; i<pList->
14c60 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20  nExpr; i++){.   
14c70 20 45 78 70 72 20 2a 70 45 78 70 72 3b 0a 20 20   Expr *pExpr;.  
14c80 20 20 69 66 28 20 70 4c 69 73 74 2d 3e 61 5b 69    if( pList->a[i
14c90 5d 2e 7a 4e 61 6d 65 3d 3d 30 20 26 26 20 28 70  ].zName==0 && (p
14ca0 45 78 70 72 20 3d 20 70 4c 69 73 74 2d 3e 61 5b  Expr = pList->a[
14cb0 69 5d 2e 70 45 78 70 72 29 2d 3e 73 70 61 6e 2e  i].pExpr)->span.
14cc0 7a 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 4c  z!=0 ){.      pL
14cd0 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 20  ist->a[i].zName 
14ce0 3d 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  = .             
14cf0 73 71 6c 69 74 65 33 44 62 53 74 72 4e 44 75 70  sqlite3DbStrNDup
14d00 28 64 62 2c 20 28 63 68 61 72 2a 29 70 45 78 70  (db, (char*)pExp
14d10 72 2d 3e 73 70 61 6e 2e 7a 2c 20 70 45 78 70 72  r->span.z, pExpr
14d20 2d 3e 73 70 61 6e 2e 6e 29 3b 0a 20 20 20 20 7d  ->span.n);.    }
14d30 0a 20 20 7d 0a 20 20 73 75 62 73 74 45 78 70 72  .  }.  substExpr
14d40 4c 69 73 74 28 64 62 2c 20 70 2d 3e 70 45 4c 69  List(db, p->pELi
14d50 73 74 2c 20 69 50 61 72 65 6e 74 2c 20 70 53 75  st, iParent, pSu
14d60 62 2d 3e 70 45 4c 69 73 74 29 3b 0a 20 20 69 66  b->pEList);.  if
14d70 28 20 69 73 41 67 67 20 29 7b 0a 20 20 20 20 73  ( isAgg ){.    s
14d80 75 62 73 74 45 78 70 72 4c 69 73 74 28 64 62 2c  ubstExprList(db,
14d90 20 70 2d 3e 70 47 72 6f 75 70 42 79 2c 20 69 50   p->pGroupBy, iP
14da0 61 72 65 6e 74 2c 20 70 53 75 62 2d 3e 70 45 4c  arent, pSub->pEL
14db0 69 73 74 29 3b 0a 20 20 20 20 73 75 62 73 74 45  ist);.    substE
14dc0 78 70 72 28 64 62 2c 20 70 2d 3e 70 48 61 76 69  xpr(db, p->pHavi
14dd0 6e 67 2c 20 69 50 61 72 65 6e 74 2c 20 70 53 75  ng, iParent, pSu
14de0 62 2d 3e 70 45 4c 69 73 74 29 3b 0a 20 20 7d 0a  b->pEList);.  }.
14df0 20 20 69 66 28 20 70 53 75 62 2d 3e 70 4f 72 64    if( pSub->pOrd
14e00 65 72 42 79 20 29 7b 0a 20 20 20 20 61 73 73 65  erBy ){.    asse
14e10 72 74 28 20 70 2d 3e 70 4f 72 64 65 72 42 79 3d  rt( p->pOrderBy=
14e20 3d 30 20 29 3b 0a 20 20 20 20 70 2d 3e 70 4f 72  =0 );.    p->pOr
14e30 64 65 72 42 79 20 3d 20 70 53 75 62 2d 3e 70 4f  derBy = pSub->pO
14e40 72 64 65 72 42 79 3b 0a 20 20 20 20 70 53 75 62  rderBy;.    pSub
14e50 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20 30 3b 0a  ->pOrderBy = 0;.
14e60 20 20 7d 65 6c 73 65 20 69 66 28 20 70 2d 3e 70    }else if( p->p
14e70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20 73  OrderBy ){.    s
14e80 75 62 73 74 45 78 70 72 4c 69 73 74 28 64 62 2c  ubstExprList(db,
14e90 20 70 2d 3e 70 4f 72 64 65 72 42 79 2c 20 69 50   p->pOrderBy, iP
14ea0 61 72 65 6e 74 2c 20 70 53 75 62 2d 3e 70 45 4c  arent, pSub->pEL
14eb0 69 73 74 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  ist);.  }.  if( 
14ec0 70 53 75 62 2d 3e 70 57 68 65 72 65 20 29 7b 0a  pSub->pWhere ){.
14ed0 20 20 20 20 70 57 68 65 72 65 20 3d 20 73 71 6c      pWhere = sql
14ee0 69 74 65 33 45 78 70 72 44 75 70 28 64 62 2c 20  ite3ExprDup(db, 
14ef0 70 53 75 62 2d 3e 70 57 68 65 72 65 29 3b 0a 20  pSub->pWhere);. 
14f00 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 57 68 65   }else{.    pWhe
14f10 72 65 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 69 66  re = 0;.  }.  if
14f20 28 20 73 75 62 71 75 65 72 79 49 73 41 67 67 20  ( subqueryIsAgg 
14f30 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
14f40 2d 3e 70 48 61 76 69 6e 67 3d 3d 30 20 29 3b 0a  ->pHaving==0 );.
14f50 20 20 20 20 70 2d 3e 70 48 61 76 69 6e 67 20 3d      p->pHaving =
14f60 20 70 2d 3e 70 57 68 65 72 65 3b 0a 20 20 20 20   p->pWhere;.    
14f70 70 2d 3e 70 57 68 65 72 65 20 3d 20 70 57 68 65  p->pWhere = pWhe
14f80 72 65 3b 0a 20 20 20 20 73 75 62 73 74 45 78 70  re;.    substExp
14f90 72 28 64 62 2c 20 70 2d 3e 70 48 61 76 69 6e 67  r(db, p->pHaving
14fa0 2c 20 69 50 61 72 65 6e 74 2c 20 70 53 75 62 2d  , iParent, pSub-
14fb0 3e 70 45 4c 69 73 74 29 3b 0a 20 20 20 20 70 2d  >pEList);.    p-
14fc0 3e 70 48 61 76 69 6e 67 20 3d 20 73 71 6c 69 74  >pHaving = sqlit
14fd0 65 33 45 78 70 72 41 6e 64 28 64 62 2c 20 70 2d  e3ExprAnd(db, p-
14fe0 3e 70 48 61 76 69 6e 67 2c 20 0a 20 20 20 20 20  >pHaving, .     
14ff0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15000 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
15010 65 33 45 78 70 72 44 75 70 28 64 62 2c 20 70 53  e3ExprDup(db, pS
15020 75 62 2d 3e 70 48 61 76 69 6e 67 29 29 3b 0a 20  ub->pHaving));. 
15030 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 47     assert( p->pG
15040 72 6f 75 70 42 79 3d 3d 30 20 29 3b 0a 20 20 20  roupBy==0 );.   
15050 20 70 2d 3e 70 47 72 6f 75 70 42 79 20 3d 20 73   p->pGroupBy = s
15060 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 75  qlite3ExprListDu
15070 70 28 64 62 2c 20 70 53 75 62 2d 3e 70 47 72 6f  p(db, pSub->pGro
15080 75 70 42 79 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  upBy);.  }else{.
15090 20 20 20 20 73 75 62 73 74 45 78 70 72 28 64 62      substExpr(db
150a0 2c 20 70 2d 3e 70 57 68 65 72 65 2c 20 69 50 61  , p->pWhere, iPa
150b0 72 65 6e 74 2c 20 70 53 75 62 2d 3e 70 45 4c 69  rent, pSub->pELi
150c0 73 74 29 3b 0a 20 20 20 20 70 2d 3e 70 57 68 65  st);.    p->pWhe
150d0 72 65 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  re = sqlite3Expr
150e0 41 6e 64 28 64 62 2c 20 70 2d 3e 70 57 68 65 72  And(db, p->pWher
150f0 65 2c 20 70 57 68 65 72 65 29 3b 0a 20 20 7d 0a  e, pWhere);.  }.
15100 0a 20 20 2f 2a 20 54 68 65 20 66 6c 61 74 74 65  .  /* The flatte
15110 6e 65 64 20 71 75 65 72 79 20 69 73 20 64 69 73  ned query is dis
15120 74 69 6e 63 74 20 69 66 20 65 69 74 68 65 72 20  tinct if either 
15130 74 68 65 20 69 6e 6e 65 72 20 6f 72 20 74 68 65  the inner or the
15140 0a 20 20 2a 2a 20 6f 75 74 65 72 20 71 75 65 72  .  ** outer quer
15150 79 20 69 73 20 64 69 73 74 69 6e 63 74 2e 20 0a  y is distinct. .
15160 20 20 2a 2f 0a 20 20 70 2d 3e 69 73 44 69 73 74    */.  p->isDist
15170 69 6e 63 74 20 3d 20 70 2d 3e 69 73 44 69 73 74  inct = p->isDist
15180 69 6e 63 74 20 7c 7c 20 70 53 75 62 2d 3e 69 73  inct || pSub->is
15190 44 69 73 74 69 6e 63 74 3b 0a 0a 20 20 2f 2a 0a  Distinct;..  /*.
151a0 20 20 2a 2a 20 53 45 4c 45 43 54 20 2e 2e 2e 20    ** SELECT ... 
151b0 46 52 4f 4d 20 28 53 45 4c 45 43 54 20 2e 2e 2e  FROM (SELECT ...
151c0 20 4c 49 4d 49 54 20 61 20 4f 46 46 53 45 54 20   LIMIT a OFFSET 
151d0 62 29 20 4c 49 4d 49 54 20 78 20 4f 46 46 53 45  b) LIMIT x OFFSE
151e0 54 20 79 3b 0a 20 20 2a 2a 0a 20 20 2a 2a 20 4f  T y;.  **.  ** O
151f0 6e 65 20 69 73 20 74 65 6d 70 74 65 64 20 74 6f  ne is tempted to
15200 20 74 72 79 20 74 6f 20 61 64 64 20 61 20 61 6e   try to add a an
15210 64 20 62 20 74 6f 20 63 6f 6d 62 69 6e 65 20 74  d b to combine t
15220 68 65 20 6c 69 6d 69 74 73 2e 20 20 42 75 74 20  he limits.  But 
15230 74 68 69 73 0a 20 20 2a 2a 20 64 6f 65 73 20 6e  this.  ** does n
15240 6f 74 20 77 6f 72 6b 20 69 66 20 65 69 74 68 65  ot work if eithe
15250 72 20 6c 69 6d 69 74 20 69 73 20 6e 65 67 61 74  r limit is negat
15260 69 76 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ive..  */.  if( 
15270 70 53 75 62 2d 3e 70 4c 69 6d 69 74 20 29 7b 0a  pSub->pLimit ){.
15280 20 20 20 20 70 2d 3e 70 4c 69 6d 69 74 20 3d 20      p->pLimit = 
15290 70 53 75 62 2d 3e 70 4c 69 6d 69 74 3b 0a 20 20  pSub->pLimit;.  
152a0 20 20 70 53 75 62 2d 3e 70 4c 69 6d 69 74 20 3d    pSub->pLimit =
152b0 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46 69   0;.  }..  /* Fi
152c0 6e 69 61 6c 6c 79 2c 20 64 65 6c 65 74 65 20 77  nially, delete w
152d0 68 61 74 20 69 73 20 6c 65 66 74 20 6f 66 20 74  hat is left of t
152e0 68 65 20 73 75 62 71 75 65 72 79 20 61 6e 64 20  he subquery and 
152f0 72 65 74 75 72 6e 0a 20 20 2a 2a 20 73 75 63 63  return.  ** succ
15300 65 73 73 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69  ess..  */.  sqli
15310 74 65 33 53 65 6c 65 63 74 44 65 6c 65 74 65 28  te3SelectDelete(
15320 70 53 75 62 29 3b 0a 20 20 72 65 74 75 72 6e 20  pSub);.  return 
15330 31 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53  1;.}.#endif /* S
15340 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 20  QLITE_OMIT_VIEW 
15350 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 41 6e 61 6c 79 7a  */../*.** Analyz
15360 65 20 74 68 65 20 53 45 4c 45 43 54 20 73 74 61  e the SELECT sta
15370 74 65 6d 65 6e 74 20 70 61 73 73 65 64 20 69 6e  tement passed in
15380 20 61 73 20 61 6e 20 61 72 67 75 6d 65 6e 74 20   as an argument 
15390 74 6f 20 73 65 65 20 69 66 20 69 74 0a 2a 2a 20  to see if it.** 
153a0 69 73 20 61 20 73 69 6d 70 6c 65 20 6d 69 6e 28  is a simple min(
153b0 29 20 6f 72 20 6d 61 78 28 29 20 71 75 65 72 79  ) or max() query
153c0 2e 20 20 49 66 20 69 74 20 69 73 20 61 6e 64 20  .  If it is and 
153d0 74 68 69 73 20 71 75 65 72 79 20 63 61 6e 20 62  this query can b
153e0 65 0a 2a 2a 20 73 61 74 69 73 66 69 65 64 20 75  e.** satisfied u
153f0 73 69 6e 67 20 61 20 73 69 6e 67 6c 65 20 73 65  sing a single se
15400 65 6b 20 74 6f 20 74 68 65 20 62 65 67 69 6e 6e  ek to the beginn
15410 69 6e 67 20 6f 72 20 65 6e 64 20 6f 66 20 61 6e  ing or end of an
15420 20 69 6e 64 65 78 2c 0a 2a 2a 20 74 68 65 6e 20   index,.** then 
15430 67 65 6e 65 72 61 74 65 20 74 68 65 20 63 6f 64  generate the cod
15440 65 20 66 6f 72 20 74 68 69 73 20 53 45 4c 45 43  e for this SELEC
15450 54 20 61 6e 64 20 72 65 74 75 72 6e 20 31 2e 20  T and return 1. 
15460 20 49 66 20 74 68 69 73 20 69 73 20 6e 6f 74 20   If this is not 
15470 61 20 0a 2a 2a 20 73 69 6d 70 6c 65 20 6d 69 6e  a .** simple min
15480 28 29 20 6f 72 20 6d 61 78 28 29 20 71 75 65 72  () or max() quer
15490 79 2c 20 74 68 65 6e 20 72 65 74 75 72 6e 20 30  y, then return 0
154a0 3b 0a 2a 2a 0a 2a 2a 20 41 20 73 69 6d 70 6c 79  ;.**.** A simply
154b0 20 6d 69 6e 28 29 20 6f 72 20 6d 61 78 28 29 20   min() or max() 
154c0 71 75 65 72 79 20 6c 6f 6f 6b 73 20 6c 69 6b 65  query looks like
154d0 20 74 68 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20   this:.**.**    
154e0 53 45 4c 45 43 54 20 6d 69 6e 28 61 29 20 46 52  SELECT min(a) FR
154f0 4f 4d 20 74 61 62 6c 65 3b 0a 2a 2a 20 20 20 20  OM table;.**    
15500 53 45 4c 45 43 54 20 6d 61 78 28 61 29 20 46 52  SELECT max(a) FR
15510 4f 4d 20 74 61 62 6c 65 3b 0a 2a 2a 0a 2a 2a 20  OM table;.**.** 
15520 54 68 65 20 71 75 65 72 79 20 6d 61 79 20 68 61  The query may ha
15530 76 65 20 6f 6e 6c 79 20 61 20 73 69 6e 67 6c 65  ve only a single
15540 20 74 61 62 6c 65 20 69 6e 20 69 74 73 20 46 52   table in its FR
15550 4f 4d 20 61 72 67 75 6d 65 6e 74 2e 20 20 54 68  OM argument.  Th
15560 65 72 65 0a 2a 2a 20 63 61 6e 20 62 65 20 6e 6f  ere.** can be no
15570 20 47 52 4f 55 50 20 42 59 20 6f 72 20 48 41 56   GROUP BY or HAV
15580 49 4e 47 20 6f 72 20 57 48 45 52 45 20 63 6c 61  ING or WHERE cla
15590 75 73 65 73 2e 20 20 54 68 65 20 72 65 73 75 6c  uses.  The resul
155a0 74 20 73 65 74 20 6d 75 73 74 0a 2a 2a 20 62 65  t set must.** be
155b0 20 74 68 65 20 6d 69 6e 28 29 20 6f 72 20 6d 61   the min() or ma
155c0 78 28 29 20 6f 66 20 61 20 73 69 6e 67 6c 65 20  x() of a single 
155d0 63 6f 6c 75 6d 6e 20 6f 66 20 74 68 65 20 74 61  column of the ta
155e0 62 6c 65 2e 20 20 54 68 65 20 63 6f 6c 75 6d 6e  ble.  The column
155f0 0a 2a 2a 20 69 6e 20 74 68 65 20 6d 69 6e 28 29  .** in the min()
15600 20 6f 72 20 6d 61 78 28 29 20 66 75 6e 63 74 69   or max() functi
15610 6f 6e 20 6d 75 73 74 20 62 65 20 69 6e 64 65 78  on must be index
15620 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 61  ed..**.** The pa
15630 72 61 6d 65 74 65 72 73 20 74 6f 20 74 68 69 73  rameters to this
15640 20 72 6f 75 74 69 6e 65 20 61 72 65 20 74 68 65   routine are the
15650 20 73 61 6d 65 20 61 73 20 66 6f 72 20 73 71 6c   same as for sql
15660 69 74 65 33 53 65 6c 65 63 74 28 29 2e 0a 2a 2a  ite3Select()..**
15670 20 53 65 65 20 74 68 65 20 68 65 61 64 65 72 20   See the header 
15680 63 6f 6d 6d 65 6e 74 20 6f 6e 20 74 68 61 74 20  comment on that 
15690 72 6f 75 74 69 6e 65 20 66 6f 72 20 61 64 64 69  routine for addi
156a0 74 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61 74 69  tional informati
156b0 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  on..*/.static in
156c0 74 20 73 69 6d 70 6c 65 4d 69 6e 4d 61 78 51 75  t simpleMinMaxQu
156d0 65 72 79 28 50 61 72 73 65 20 2a 70 50 61 72 73  ery(Parse *pPars
156e0 65 2c 20 53 65 6c 65 63 74 20 2a 70 2c 20 69 6e  e, Select *p, in
156f0 74 20 65 44 65 73 74 2c 20 69 6e 74 20 69 50 61  t eDest, int iPa
15700 72 6d 29 7b 0a 20 20 45 78 70 72 20 2a 70 45 78  rm){.  Expr *pEx
15710 70 72 3b 0a 20 20 69 6e 74 20 69 43 6f 6c 3b 0a  pr;.  int iCol;.
15720 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20    Table *pTab;. 
15730 20 49 6e 64 65 78 20 2a 70 49 64 78 3b 0a 20 20   Index *pIdx;.  
15740 69 6e 74 20 62 61 73 65 3b 0a 20 20 56 64 62 65  int base;.  Vdbe
15750 20 2a 76 3b 0a 20 20 69 6e 74 20 73 65 65 6b 4f   *v;.  int seekO
15760 70 3b 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70  p;.  ExprList *p
15770 45 4c 69 73 74 2c 20 2a 70 4c 69 73 74 2c 20 65  EList, *pList, e
15780 4c 69 73 74 3b 0a 20 20 73 74 72 75 63 74 20 45  List;.  struct E
15790 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 65 4c 69  xprList_item eLi
157a0 73 74 49 74 65 6d 3b 0a 20 20 53 72 63 4c 69 73  stItem;.  SrcLis
157b0 74 20 2a 70 53 72 63 3b 0a 20 20 69 6e 74 20 62  t *pSrc;.  int b
157c0 72 6b 3b 0a 20 20 69 6e 74 20 69 44 62 3b 0a 0a  rk;.  int iDb;..
157d0 20 20 2f 2a 20 43 68 65 63 6b 20 74 6f 20 73 65    /* Check to se
157e0 65 20 69 66 20 74 68 69 73 20 71 75 65 72 79 20  e if this query 
157f0 69 73 20 61 20 73 69 6d 70 6c 65 20 6d 69 6e 28  is a simple min(
15800 29 20 6f 72 20 6d 61 78 28 29 20 71 75 65 72 79  ) or max() query
15810 2e 20 20 52 65 74 75 72 6e 0a 20 20 2a 2a 20 7a  .  Return.  ** z
15820 65 72 6f 20 69 66 20 69 74 20 69 73 20 20 6e 6f  ero if it is  no
15830 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d  t..  */.  if( p-
15840 3e 70 47 72 6f 75 70 42 79 20 7c 7c 20 70 2d 3e  >pGroupBy || p->
15850 70 48 61 76 69 6e 67 20 7c 7c 20 70 2d 3e 70 57  pHaving || p->pW
15860 68 65 72 65 20 29 20 72 65 74 75 72 6e 20 30 3b  here ) return 0;
15870 0a 20 20 70 53 72 63 20 3d 20 70 2d 3e 70 53 72  .  pSrc = p->pSr
15880 63 3b 0a 20 20 69 66 28 20 70 53 72 63 2d 3e 6e  c;.  if( pSrc->n
15890 53 72 63 21 3d 31 20 29 20 72 65 74 75 72 6e 20  Src!=1 ) return 
158a0 30 3b 0a 20 20 70 45 4c 69 73 74 20 3d 20 70 2d  0;.  pEList = p-
158b0 3e 70 45 4c 69 73 74 3b 0a 20 20 69 66 28 20 70  >pEList;.  if( p
158c0 45 4c 69 73 74 2d 3e 6e 45 78 70 72 21 3d 31 20  EList->nExpr!=1 
158d0 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 70 45  ) return 0;.  pE
158e0 78 70 72 20 3d 20 70 45 4c 69 73 74 2d 3e 61 5b  xpr = pEList->a[
158f0 30 5d 2e 70 45 78 70 72 3b 0a 20 20 69 66 28 20  0].pExpr;.  if( 
15900 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 41 47  pExpr->op!=TK_AG
15910 47 5f 46 55 4e 43 54 49 4f 4e 20 29 20 72 65 74  G_FUNCTION ) ret
15920 75 72 6e 20 30 3b 0a 20 20 70 4c 69 73 74 20 3d  urn 0;.  pList =
15930 20 70 45 78 70 72 2d 3e 70 4c 69 73 74 3b 0a 20   pExpr->pList;. 
15940 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20 7c 7c   if( pList==0 ||
15950 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72 21 3d 31   pList->nExpr!=1
15960 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69   ) return 0;.  i
15970 66 28 20 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e  f( pExpr->token.
15980 6e 21 3d 33 20 29 20 72 65 74 75 72 6e 20 30 3b  n!=3 ) return 0;
15990 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 74  .  if( sqlite3St
159a0 72 4e 49 43 6d 70 28 28 63 68 61 72 2a 29 70 45  rNICmp((char*)pE
159b0 78 70 72 2d 3e 74 6f 6b 65 6e 2e 7a 2c 22 6d 69  xpr->token.z,"mi
159c0 6e 22 2c 33 29 3d 3d 30 20 29 7b 0a 20 20 20 20  n",3)==0 ){.    
159d0 73 65 65 6b 4f 70 20 3d 20 4f 50 5f 52 65 77 69  seekOp = OP_Rewi
159e0 6e 64 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20  nd;.  }else if( 
159f0 73 71 6c 69 74 65 33 53 74 72 4e 49 43 6d 70 28  sqlite3StrNICmp(
15a00 28 63 68 61 72 2a 29 70 45 78 70 72 2d 3e 74 6f  (char*)pExpr->to
15a10 6b 65 6e 2e 7a 2c 22 6d 61 78 22 2c 33 29 3d 3d  ken.z,"max",3)==
15a20 30 20 29 7b 0a 20 20 20 20 73 65 65 6b 4f 70 20  0 ){.    seekOp 
15a30 3d 20 4f 50 5f 4c 61 73 74 3b 0a 20 20 7d 65 6c  = OP_Last;.  }el
15a40 73 65 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30  se{.    return 0
15a50 3b 0a 20 20 7d 0a 20 20 70 45 78 70 72 20 3d 20  ;.  }.  pExpr = 
15a60 70 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70  pList->a[0].pExp
15a70 72 3b 0a 20 20 69 66 28 20 70 45 78 70 72 2d 3e  r;.  if( pExpr->
15a80 6f 70 21 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29 20  op!=TK_COLUMN ) 
15a90 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 43 6f 6c  return 0;.  iCol
15aa0 20 3d 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d   = pExpr->iColum
15ab0 6e 3b 0a 20 20 70 54 61 62 20 3d 20 70 53 72 63  n;.  pTab = pSrc
15ac0 2d 3e 61 5b 30 5d 2e 70 54 61 62 3b 0a 0a 20 20  ->a[0].pTab;..  
15ad0 2f 2a 20 54 68 69 73 20 6f 70 74 69 6d 69 7a 61  /* This optimiza
15ae0 74 69 6f 6e 20 63 61 6e 6e 6f 74 20 62 65 20 75  tion cannot be u
15af0 73 65 64 20 77 69 74 68 20 76 69 72 74 75 61 6c  sed with virtual
15b00 20 74 61 62 6c 65 73 2e 20 2a 2f 0a 20 20 69 66   tables. */.  if
15b10 28 20 49 73 56 69 72 74 75 61 6c 28 70 54 61 62  ( IsVirtual(pTab
15b20 29 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 0a 20  ) ) return 0;.. 
15b30 20 2f 2a 20 49 66 20 77 65 20 67 65 74 20 74 6f   /* If we get to
15b40 20 68 65 72 65 2c 20 69 74 20 6d 65 61 6e 73 20   here, it means 
15b50 74 68 65 20 71 75 65 72 79 20 69 73 20 6f 66 20  the query is of 
15b60 74 68 65 20 63 6f 72 72 65 63 74 20 66 6f 72 6d  the correct form
15b70 2e 0a 20 20 2a 2a 20 43 68 65 63 6b 20 74 6f 20  ..  ** Check to 
15b80 6d 61 6b 65 20 73 75 72 65 20 77 65 20 68 61 76  make sure we hav
15b90 65 20 61 6e 20 69 6e 64 65 78 20 61 6e 64 20 6d  e an index and m
15ba0 61 6b 65 20 70 49 64 78 20 70 6f 69 6e 74 20 74  ake pIdx point t
15bb0 6f 20 74 68 65 0a 20 20 2a 2a 20 61 70 70 72 6f  o the.  ** appro
15bc0 70 72 69 61 74 65 20 69 6e 64 65 78 2e 20 20 49  priate index.  I
15bd0 66 20 74 68 65 20 6d 69 6e 28 29 20 6f 72 20 6d  f the min() or m
15be0 61 78 28 29 20 69 73 20 6f 6e 20 61 6e 20 49 4e  ax() is on an IN
15bf0 54 45 47 45 52 20 50 52 49 4d 41 52 59 0a 20 20  TEGER PRIMARY.  
15c00 2a 2a 20 6b 65 79 20 63 6f 6c 75 6d 6e 2c 20 6e  ** key column, n
15c10 6f 20 69 6e 64 65 78 20 69 73 20 6e 65 63 65 73  o index is neces
15c20 73 61 72 79 20 73 6f 20 73 65 74 20 70 49 64 78  sary so set pIdx
15c30 20 74 6f 20 4e 55 4c 4c 2e 20 20 49 66 20 6e 6f   to NULL.  If no
15c40 0a 20 20 2a 2a 20 75 73 61 62 6c 65 20 69 6e 64  .  ** usable ind
15c50 65 78 20 69 73 20 66 6f 75 6e 64 2c 20 72 65 74  ex is found, ret
15c60 75 72 6e 20 30 2e 0a 20 20 2a 2f 0a 20 20 69 66  urn 0..  */.  if
15c70 28 20 69 43 6f 6c 3c 30 20 29 7b 0a 20 20 20 20  ( iCol<0 ){.    
15c80 70 49 64 78 20 3d 20 30 3b 0a 20 20 7d 65 6c 73  pIdx = 0;.  }els
15c90 65 7b 0a 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a  e{.    CollSeq *
15ca0 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 45  pColl = sqlite3E
15cb0 78 70 72 43 6f 6c 6c 53 65 71 28 70 50 61 72 73  xprCollSeq(pPars
15cc0 65 2c 20 70 45 78 70 72 29 3b 0a 20 20 20 20 69  e, pExpr);.    i
15cd0 66 28 20 70 43 6f 6c 6c 3d 3d 30 20 29 20 72 65  f( pColl==0 ) re
15ce0 74 75 72 6e 20 30 3b 0a 20 20 20 20 66 6f 72 28  turn 0;.    for(
15cf0 70 49 64 78 3d 70 54 61 62 2d 3e 70 49 6e 64 65  pIdx=pTab->pInde
15d00 78 3b 20 70 49 64 78 3b 20 70 49 64 78 3d 70 49  x; pIdx; pIdx=pI
15d10 64 78 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20  dx->pNext){.    
15d20 20 20 61 73 73 65 72 74 28 20 70 49 64 78 2d 3e    assert( pIdx->
15d30 6e 43 6f 6c 75 6d 6e 3e 3d 31 20 29 3b 0a 20 20  nColumn>=1 );.  
15d40 20 20 20 20 69 66 28 20 70 49 64 78 2d 3e 61 69      if( pIdx->ai
15d50 43 6f 6c 75 6d 6e 5b 30 5d 3d 3d 69 43 6f 6c 20  Column[0]==iCol 
15d60 26 26 20 0a 20 20 20 20 20 20 20 20 20 20 30 3d  && .          0=
15d70 3d 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28  =sqlite3StrICmp(
15d80 70 49 64 78 2d 3e 61 7a 43 6f 6c 6c 5b 30 5d 2c  pIdx->azColl[0],
15d90 20 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65 29 20 29   pColl->zName) )
15da0 7b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  {.        break;
15db0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
15dc0 20 20 20 69 66 28 20 70 49 64 78 3d 3d 30 20 29     if( pIdx==0 )
15dd0 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 0a   return 0;.  }..
15de0 20 20 2f 2a 20 49 64 65 6e 74 69 66 79 20 63 6f    /* Identify co
15df0 6c 75 6d 6e 20 74 79 70 65 73 20 69 66 20 77 65  lumn types if we
15e00 20 77 69 6c 6c 20 62 65 20 75 73 69 6e 67 20 74   will be using t
15e10 68 65 20 63 61 6c 6c 62 61 63 6b 2e 20 20 54 68  he callback.  Th
15e20 69 73 0a 20 20 2a 2a 20 73 74 65 70 20 69 73 20  is.  ** step is 
15e30 73 6b 69 70 70 65 64 20 69 66 20 74 68 65 20 6f  skipped if the o
15e40 75 74 70 75 74 20 69 73 20 67 6f 69 6e 67 20 74  utput is going t
15e50 6f 20 61 20 74 61 62 6c 65 20 6f 72 20 61 20 6d  o a table or a m
15e60 65 6d 6f 72 79 20 63 65 6c 6c 2e 0a 20 20 2a 2a  emory cell..  **
15e70 20 54 68 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65   The column name
15e80 73 20 68 61 76 65 20 61 6c 72 65 61 64 79 20 62  s have already b
15e90 65 65 6e 20 67 65 6e 65 72 61 74 65 64 20 69 6e  een generated in
15ea0 20 74 68 65 20 63 61 6c 6c 69 6e 67 20 66 75 6e   the calling fun
15eb0 63 74 69 6f 6e 2e 0a 20 20 2a 2f 0a 20 20 76 20  ction..  */.  v 
15ec0 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64 62 65  = sqlite3GetVdbe
15ed0 28 70 50 61 72 73 65 29 3b 0a 20 20 69 66 28 20  (pParse);.  if( 
15ee0 76 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b  v==0 ) return 0;
15ef0 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 6f 75  ..  /* If the ou
15f00 74 70 75 74 20 69 73 20 64 65 73 74 69 6e 65 64  tput is destined
15f10 20 66 6f 72 20 61 20 74 65 6d 70 6f 72 61 72 79   for a temporary
15f20 20 74 61 62 6c 65 2c 20 6f 70 65 6e 20 74 68 61   table, open tha
15f30 74 20 74 61 62 6c 65 2e 0a 20 20 2a 2f 0a 20 20  t table..  */.  
15f40 69 66 28 20 65 44 65 73 74 3d 3d 53 52 54 5f 45  if( eDest==SRT_E
15f50 70 68 65 6d 54 61 62 20 29 7b 0a 20 20 20 20 73  phemTab ){.    s
15f60 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
15f70 76 2c 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65  v, OP_OpenEpheme
15f80 72 61 6c 2c 20 69 50 61 72 6d 2c 20 31 29 3b 0a  ral, iParm, 1);.
15f90 20 20 7d 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61    }..  /* Genera
15fa0 74 69 6e 67 20 63 6f 64 65 20 74 6f 20 66 69 6e  ting code to fin
15fb0 64 20 74 68 65 20 6d 69 6e 20 6f 72 20 74 68 65  d the min or the
15fc0 20 6d 61 78 2e 20 20 42 61 73 69 63 61 6c 6c 79   max.  Basically
15fd0 20 61 6c 6c 20 77 65 20 68 61 76 65 0a 20 20 2a   all we have.  *
15fe0 2a 20 74 6f 20 64 6f 20 69 73 20 66 69 6e 64 20  * to do is find 
15ff0 74 68 65 20 66 69 72 73 74 20 6f 72 20 74 68 65  the first or the
16000 20 6c 61 73 74 20 65 6e 74 72 79 20 69 6e 20 74   last entry in t
16010 68 65 20 63 68 6f 73 65 6e 20 69 6e 64 65 78 2e  he chosen index.
16020 20 20 49 66 0a 20 20 2a 2a 20 74 68 65 20 6d 69    If.  ** the mi
16030 6e 28 29 20 6f 72 20 6d 61 78 28 29 20 69 73 20  n() or max() is 
16040 6f 6e 20 74 68 65 20 49 4e 54 45 47 45 52 20 50  on the INTEGER P
16050 52 49 4d 41 52 59 20 4b 45 59 2c 20 74 68 65 6e  RIMARY KEY, then
16060 20 66 69 6e 64 20 74 68 65 20 66 69 72 73 74 0a   find the first.
16070 20 20 2a 2a 20 6f 72 20 6c 61 73 74 20 65 6e 74    ** or last ent
16080 72 79 20 69 6e 20 74 68 65 20 6d 61 69 6e 20 74  ry in the main t
16090 61 62 6c 65 2e 0a 20 20 2a 2f 0a 20 20 69 44 62  able..  */.  iDb
160a0 20 3d 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61   = sqlite3Schema
160b0 54 6f 49 6e 64 65 78 28 70 50 61 72 73 65 2d 3e  ToIndex(pParse->
160c0 64 62 2c 20 70 54 61 62 2d 3e 70 53 63 68 65 6d  db, pTab->pSchem
160d0 61 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69 44  a);.  assert( iD
160e0 62 3e 3d 30 20 7c 7c 20 70 54 61 62 2d 3e 69 73  b>=0 || pTab->is
160f0 45 70 68 65 6d 20 29 3b 0a 20 20 73 71 6c 69 74  Ephem );.  sqlit
16100 65 33 43 6f 64 65 56 65 72 69 66 79 53 63 68 65  e3CodeVerifySche
16110 6d 61 28 70 50 61 72 73 65 2c 20 69 44 62 29 3b  ma(pParse, iDb);
16120 0a 20 20 73 71 6c 69 74 65 33 54 61 62 6c 65 4c  .  sqlite3TableL
16130 6f 63 6b 28 70 50 61 72 73 65 2c 20 69 44 62 2c  ock(pParse, iDb,
16140 20 70 54 61 62 2d 3e 74 6e 75 6d 2c 20 30 2c 20   pTab->tnum, 0, 
16150 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20  pTab->zName);.  
16160 62 61 73 65 20 3d 20 70 53 72 63 2d 3e 61 5b 30  base = pSrc->a[0
16170 5d 2e 69 43 75 72 73 6f 72 3b 0a 20 20 62 72 6b  ].iCursor;.  brk
16180 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61   = sqlite3VdbeMa
16190 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 63 6f  keLabel(v);.  co
161a0 6d 70 75 74 65 4c 69 6d 69 74 52 65 67 69 73 74  mputeLimitRegist
161b0 65 72 73 28 70 50 61 72 73 65 2c 20 70 2c 20 62  ers(pParse, p, b
161c0 72 6b 29 3b 0a 20 20 69 66 28 20 70 53 72 63 2d  rk);.  if( pSrc-
161d0 3e 61 5b 30 5d 2e 70 53 65 6c 65 63 74 3d 3d 30  >a[0].pSelect==0
161e0 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 4f   ){.    sqlite3O
161f0 70 65 6e 54 61 62 6c 65 28 70 50 61 72 73 65 2c  penTable(pParse,
16200 20 62 61 73 65 2c 20 69 44 62 2c 20 70 54 61 62   base, iDb, pTab
16210 2c 20 4f 50 5f 4f 70 65 6e 52 65 61 64 29 3b 0a  , OP_OpenRead);.
16220 20 20 7d 0a 20 20 69 66 28 20 70 49 64 78 3d 3d    }.  if( pIdx==
16230 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  0 ){.    sqlite3
16240 56 64 62 65 41 64 64 4f 70 28 76 2c 20 73 65 65  VdbeAddOp(v, see
16250 6b 4f 70 2c 20 62 61 73 65 2c 20 30 29 3b 0a 20  kOp, base, 0);. 
16260 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 45   }else{.    /* E
16270 76 65 6e 20 74 68 6f 75 67 68 20 74 68 65 20 63  ven though the c
16280 75 72 73 6f 72 20 75 73 65 64 20 74 6f 20 6f 70  ursor used to op
16290 65 6e 20 74 68 65 20 69 6e 64 65 78 20 68 65 72  en the index her
162a0 65 20 69 73 20 63 6c 6f 73 65 64 0a 20 20 20 20  e is closed.    
162b0 2a 2a 20 61 73 20 73 6f 6f 6e 20 61 73 20 61 20  ** as soon as a 
162c0 73 69 6e 67 6c 65 20 76 61 6c 75 65 20 68 61 73  single value has
162d0 20 62 65 65 6e 20 72 65 61 64 20 66 72 6f 6d 20   been read from 
162e0 69 74 2c 20 61 6c 6c 6f 63 61 74 65 20 69 74 0a  it, allocate it.
162f0 20 20 20 20 2a 2a 20 75 73 69 6e 67 20 28 70 50      ** using (pP
16300 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 29 20 74 6f  arse->nTab++) to
16310 20 70 72 65 76 65 6e 74 20 74 68 65 20 63 75 72   prevent the cur
16320 73 6f 72 20 69 64 20 66 72 6f 6d 20 62 65 69 6e  sor id from bein
16330 67 20 0a 20 20 20 20 2a 2a 20 72 65 75 73 65 64  g .    ** reused
16340 2e 20 54 68 69 73 20 69 73 20 69 6d 70 6f 72 74  . This is import
16350 61 6e 74 20 66 6f 72 20 73 74 61 74 65 6d 65 6e  ant for statemen
16360 74 73 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 0a  ts of the form .
16370 20 20 20 20 2a 2a 20 22 49 4e 53 45 52 54 20 49      ** "INSERT I
16380 4e 54 4f 20 78 20 53 45 4c 45 43 54 20 6d 61 78  NTO x SELECT max
16390 28 29 20 46 52 4f 4d 20 78 22 2e 0a 20 20 20 20  () FROM x"..    
163a0 2a 2f 0a 20 20 20 20 69 6e 74 20 69 49 64 78 3b  */.    int iIdx;
163b0 0a 20 20 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b  .    KeyInfo *pK
163c0 65 79 20 3d 20 73 71 6c 69 74 65 33 49 6e 64 65  ey = sqlite3Inde
163d0 78 4b 65 79 69 6e 66 6f 28 70 50 61 72 73 65 2c  xKeyinfo(pParse,
163e0 20 70 49 64 78 29 3b 0a 20 20 20 20 69 49 64 78   pIdx);.    iIdx
163f0 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b   = pParse->nTab+
16400 2b 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  +;.    assert( p
16410 49 64 78 2d 3e 70 53 63 68 65 6d 61 3d 3d 70 54  Idx->pSchema==pT
16420 61 62 2d 3e 70 53 63 68 65 6d 61 20 29 3b 0a 20  ab->pSchema );. 
16430 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
16440 64 4f 70 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65  dOp(v, OP_Intege
16450 72 2c 20 69 44 62 2c 20 30 29 3b 0a 20 20 20 20  r, iDb, 0);.    
16460 73 71 6c 69 74 65 33 56 64 62 65 4f 70 33 28 76  sqlite3VdbeOp3(v
16470 2c 20 4f 50 5f 4f 70 65 6e 52 65 61 64 2c 20 69  , OP_OpenRead, i
16480 49 64 78 2c 20 70 49 64 78 2d 3e 74 6e 75 6d 2c  Idx, pIdx->tnum,
16490 20 0a 20 20 20 20 20 20 20 20 28 63 68 61 72 2a   .        (char*
164a0 29 70 4b 65 79 2c 20 50 33 5f 4b 45 59 49 4e 46  )pKey, P3_KEYINF
164b0 4f 5f 48 41 4e 44 4f 46 46 29 3b 0a 20 20 20 20  O_HANDOFF);.    
164c0 69 66 28 20 73 65 65 6b 4f 70 3d 3d 4f 50 5f 52  if( seekOp==OP_R
164d0 65 77 69 6e 64 20 29 7b 0a 20 20 20 20 20 20 73  ewind ){.      s
164e0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
164f0 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20 30  v, OP_Null, 0, 0
16500 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
16510 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
16520 4d 61 6b 65 52 65 63 6f 72 64 2c 20 31 2c 20 30  MakeRecord, 1, 0
16530 29 3b 0a 20 20 20 20 20 20 73 65 65 6b 4f 70 20  );.      seekOp 
16540 3d 20 4f 50 5f 4d 6f 76 65 47 74 3b 0a 20 20 20  = OP_MoveGt;.   
16550 20 7d 0a 20 20 20 20 69 66 28 20 70 49 64 78 2d   }.    if( pIdx-
16560 3e 61 53 6f 72 74 4f 72 64 65 72 5b 30 5d 3d 3d  >aSortOrder[0]==
16570 53 51 4c 49 54 45 5f 53 4f 5f 44 45 53 43 20 29  SQLITE_SO_DESC )
16580 7b 0a 20 20 20 20 20 20 2f 2a 20 54 69 63 6b 65  {.      /* Ticke
16590 74 20 23 32 35 31 34 3a 20 69 6e 76 65 72 74 20  t #2514: invert 
165a0 74 68 65 20 73 65 65 6b 20 6f 70 65 72 61 74 6f  the seek operato
165b0 72 20 69 66 20 77 65 20 61 72 65 20 75 73 69 6e  r if we are usin
165c0 67 0a 20 20 20 20 20 20 2a 2a 20 61 20 64 65 73  g.      ** a des
165d0 63 65 6e 64 69 6e 67 20 69 6e 64 65 78 2e 20 2a  cending index. *
165e0 2f 0a 20 20 20 20 20 20 69 66 28 20 73 65 65 6b  /.      if( seek
165f0 4f 70 3d 3d 4f 50 5f 4c 61 73 74 20 29 7b 0a 20  Op==OP_Last ){. 
16600 20 20 20 20 20 20 20 73 65 65 6b 4f 70 20 3d 20         seekOp = 
16610 4f 50 5f 52 65 77 69 6e 64 3b 0a 20 20 20 20 20  OP_Rewind;.     
16620 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
16630 61 73 73 65 72 74 28 20 73 65 65 6b 4f 70 3d 3d  assert( seekOp==
16640 4f 50 5f 4d 6f 76 65 47 74 20 29 3b 0a 20 20 20  OP_MoveGt );.   
16650 20 20 20 20 20 73 65 65 6b 4f 70 20 3d 20 4f 50       seekOp = OP
16660 5f 4d 6f 76 65 4c 74 3b 0a 20 20 20 20 20 20 7d  _MoveLt;.      }
16670 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
16680 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 73  e3VdbeAddOp(v, s
16690 65 65 6b 4f 70 2c 20 69 49 64 78 2c 20 30 29 3b  eekOp, iIdx, 0);
166a0 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
166b0 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49 64 78 52  AddOp(v, OP_IdxR
166c0 6f 77 69 64 2c 20 69 49 64 78 2c 20 30 29 3b 0a  owid, iIdx, 0);.
166d0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
166e0 64 64 4f 70 28 76 2c 20 4f 50 5f 43 6c 6f 73 65  ddOp(v, OP_Close
166f0 2c 20 69 49 64 78 2c 20 30 29 3b 0a 20 20 20 20  , iIdx, 0);.    
16700 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
16710 28 76 2c 20 4f 50 5f 4d 6f 76 65 47 65 2c 20 62  (v, OP_MoveGe, b
16720 61 73 65 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 65  ase, 0);.  }.  e
16730 4c 69 73 74 2e 6e 45 78 70 72 20 3d 20 31 3b 0a  List.nExpr = 1;.
16740 20 20 6d 65 6d 73 65 74 28 26 65 4c 69 73 74 49    memset(&eListI
16750 74 65 6d 2c 20 30 2c 20 73 69 7a 65 6f 66 28 65  tem, 0, sizeof(e
16760 4c 69 73 74 49 74 65 6d 29 29 3b 0a 20 20 65 4c  ListItem));.  eL
16770 69 73 74 2e 61 20 3d 20 26 65 4c 69 73 74 49 74  ist.a = &eListIt
16780 65 6d 3b 0a 20 20 65 4c 69 73 74 2e 61 5b 30 5d  em;.  eList.a[0]
16790 2e 70 45 78 70 72 20 3d 20 70 45 78 70 72 3b 0a  .pExpr = pExpr;.
167a0 20 20 73 65 6c 65 63 74 49 6e 6e 65 72 4c 6f 6f    selectInnerLoo
167b0 70 28 70 50 61 72 73 65 2c 20 70 2c 20 26 65 4c  p(pParse, p, &eL
167c0 69 73 74 2c 20 30 2c 20 30 2c 20 30 2c 20 2d 31  ist, 0, 0, 0, -1
167d0 2c 20 65 44 65 73 74 2c 20 69 50 61 72 6d 2c 20  , eDest, iParm, 
167e0 62 72 6b 2c 20 62 72 6b 2c 20 30 29 3b 0a 20 20  brk, brk, 0);.  
167f0 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c  sqlite3VdbeResol
16800 76 65 4c 61 62 65 6c 28 76 2c 20 62 72 6b 29 3b  veLabel(v, brk);
16810 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  .  sqlite3VdbeAd
16820 64 4f 70 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c  dOp(v, OP_Close,
16830 20 62 61 73 65 2c 20 30 29 3b 0a 20 20 0a 20 20   base, 0);.  .  
16840 72 65 74 75 72 6e 20 31 3b 0a 7d 0a 0a 2f 2a 0a  return 1;.}../*.
16850 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
16860 72 65 73 6f 6c 76 65 73 20 61 6e 79 20 6e 61 6d  resolves any nam
16870 65 73 20 75 73 65 64 20 69 6e 20 74 68 65 20 72  es used in the r
16880 65 73 75 6c 74 20 73 65 74 20 6f 66 20 74 68 65  esult set of the
16890 0a 2a 2a 20 73 75 70 70 6c 69 65 64 20 53 45 4c  .** supplied SEL
168a0 45 43 54 20 73 74 61 74 65 6d 65 6e 74 2e 20 49  ECT statement. I
168b0 66 20 74 68 65 20 53 45 4c 45 43 54 20 73 74 61  f the SELECT sta
168c0 74 65 6d 65 6e 74 20 62 65 69 6e 67 20 72 65 73  tement being res
168d0 6f 6c 76 65 64 0a 2a 2a 20 69 73 20 61 20 73 75  olved.** is a su
168e0 62 2d 73 65 6c 65 63 74 2c 20 74 68 65 6e 20 70  b-select, then p
168f0 4f 75 74 65 72 4e 43 20 69 73 20 61 20 70 6f 69  OuterNC is a poi
16900 6e 74 65 72 20 74 6f 20 74 68 65 20 4e 61 6d 65  nter to the Name
16910 43 6f 6e 74 65 78 74 20 0a 2a 2a 20 6f 66 20 74  Context .** of t
16920 68 65 20 70 61 72 65 6e 74 20 53 45 4c 45 43 54  he parent SELECT
16930 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
16940 53 65 6c 65 63 74 52 65 73 6f 6c 76 65 28 0a 20  SelectResolve(. 
16950 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
16960 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70          /* The p
16970 61 72 73 65 72 20 63 6f 6e 74 65 78 74 20 2a 2f  arser context */
16980 0a 20 20 53 65 6c 65 63 74 20 2a 70 2c 20 20 20  .  Select *p,   
16990 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
169a0 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
169b0 74 20 62 65 69 6e 67 20 63 6f 64 65 64 2e 20 2a  t being coded. *
169c0 2f 0a 20 20 4e 61 6d 65 43 6f 6e 74 65 78 74 20  /.  NameContext 
169d0 2a 70 4f 75 74 65 72 4e 43 20 20 2f 2a 20 54 68  *pOuterNC  /* Th
169e0 65 20 6f 75 74 65 72 20 6e 61 6d 65 20 63 6f 6e  e outer name con
169f0 74 65 78 74 2e 20 4d 61 79 20 62 65 20 4e 55 4c  text. May be NUL
16a00 4c 2e 20 2a 2f 0a 29 7b 0a 20 20 45 78 70 72 4c  L. */.){.  ExprL
16a10 69 73 74 20 2a 70 45 4c 69 73 74 3b 20 20 20 20  ist *pEList;    
16a20 20 20 20 20 20 20 2f 2a 20 52 65 73 75 6c 74 20        /* Result 
16a30 73 65 74 2e 20 2a 2f 0a 20 20 69 6e 74 20 69 3b  set. */.  int i;
16a40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16a50 20 20 20 20 20 2f 2a 20 46 6f 72 2d 6c 6f 6f 70       /* For-loop
16a60 20 76 61 72 69 61 62 6c 65 20 75 73 65 64 20 69   variable used i
16a70 6e 20 6d 75 6c 74 69 70 6c 65 20 70 6c 61 63 65  n multiple place
16a80 73 20 2a 2f 0a 20 20 4e 61 6d 65 43 6f 6e 74 65  s */.  NameConte
16a90 78 74 20 73 4e 43 3b 20 20 20 20 20 20 20 20 20  xt sNC;         
16aa0 20 20 2f 2a 20 4c 6f 63 61 6c 20 6e 61 6d 65 2d    /* Local name-
16ab0 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78 70  context */.  Exp
16ac0 72 4c 69 73 74 20 2a 70 47 72 6f 75 70 42 79 3b  rList *pGroupBy;
16ad0 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 67          /* The g
16ae0 72 6f 75 70 20 62 79 20 63 6c 61 75 73 65 20 2a  roup by clause *
16af0 2f 0a 0a 20 20 2f 2a 20 49 66 20 74 68 69 73 20  /..  /* If this 
16b00 72 6f 75 74 69 6e 65 20 68 61 73 20 72 75 6e 20  routine has run 
16b10 62 65 66 6f 72 65 2c 20 72 65 74 75 72 6e 20 69  before, return i
16b20 6d 6d 65 64 69 61 74 65 6c 79 2e 20 2a 2f 0a 20  mmediately. */. 
16b30 20 69 66 28 20 70 2d 3e 69 73 52 65 73 6f 6c 76   if( p->isResolv
16b40 65 64 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  ed ){.    assert
16b50 28 20 21 70 4f 75 74 65 72 4e 43 20 29 3b 0a 20  ( !pOuterNC );. 
16b60 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
16b70 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 70 2d 3e 69 73  _OK;.  }.  p->is
16b80 52 65 73 6f 6c 76 65 64 20 3d 20 31 3b 0a 0a 20  Resolved = 1;.. 
16b90 20 2f 2a 20 49 66 20 74 68 65 72 65 20 68 61 76   /* If there hav
16ba0 65 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 65  e already been e
16bb0 72 72 6f 72 73 2c 20 64 6f 20 6e 6f 74 68 69 6e  rrors, do nothin
16bc0 67 2e 20 2a 2f 0a 20 20 69 66 28 20 70 50 61 72  g. */.  if( pPar
16bd0 73 65 2d 3e 6e 45 72 72 3e 30 20 29 7b 0a 20 20  se->nErr>0 ){.  
16be0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
16bf0 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  ERROR;.  }..  /*
16c00 20 50 72 65 70 61 72 65 20 74 68 65 20 73 65 6c   Prepare the sel
16c10 65 63 74 20 73 74 61 74 65 6d 65 6e 74 2e 20 54  ect statement. T
16c20 68 69 73 20 63 61 6c 6c 20 77 69 6c 6c 20 61 6c  his call will al
16c30 6c 6f 63 61 74 65 20 61 6c 6c 20 63 75 72 73 6f  locate all curso
16c40 72 73 0a 20 20 2a 2a 20 72 65 71 75 69 72 65 64  rs.  ** required
16c50 20 74 6f 20 68 61 6e 64 6c 65 20 74 68 65 20 74   to handle the t
16c60 61 62 6c 65 73 20 61 6e 64 20 73 75 62 71 75 65  ables and subque
16c70 72 69 65 73 20 69 6e 20 74 68 65 20 46 52 4f 4d  ries in the FROM
16c80 20 63 6c 61 75 73 65 2e 0a 20 20 2a 2f 0a 20 20   clause..  */.  
16c90 69 66 28 20 70 72 65 70 53 65 6c 65 63 74 53 74  if( prepSelectSt
16ca0 6d 74 28 70 50 61 72 73 65 2c 20 70 29 20 29 7b  mt(pParse, p) ){
16cb0 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
16cc0 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20  TE_ERROR;.  }.. 
16cd0 20 2f 2a 20 52 65 73 6f 6c 76 65 20 74 68 65 20   /* Resolve the 
16ce0 65 78 70 72 65 73 73 69 6f 6e 73 20 69 6e 20 74  expressions in t
16cf0 68 65 20 4c 49 4d 49 54 20 61 6e 64 20 4f 46 46  he LIMIT and OFF
16d00 53 45 54 20 63 6c 61 75 73 65 73 2e 20 54 68 65  SET clauses. The
16d10 73 65 0a 20 20 2a 2a 20 61 72 65 20 6e 6f 74 20  se.  ** are not 
16d20 61 6c 6c 6f 77 65 64 20 74 6f 20 72 65 66 65 72  allowed to refer
16d30 20 74 6f 20 61 6e 79 20 6e 61 6d 65 73 2c 20 73   to any names, s
16d40 6f 20 70 61 73 73 20 61 6e 20 65 6d 70 74 79 20  o pass an empty 
16d50 4e 61 6d 65 43 6f 6e 74 65 78 74 2e 0a 20 20 2a  NameContext..  *
16d60 2f 0a 20 20 6d 65 6d 73 65 74 28 26 73 4e 43 2c  /.  memset(&sNC,
16d70 20 30 2c 20 73 69 7a 65 6f 66 28 73 4e 43 29 29   0, sizeof(sNC))
16d80 3b 0a 20 20 73 4e 43 2e 70 50 61 72 73 65 20 3d  ;.  sNC.pParse =
16d90 20 70 50 61 72 73 65 3b 0a 20 20 69 66 28 20 73   pParse;.  if( s
16da0 71 6c 69 74 65 33 45 78 70 72 52 65 73 6f 6c 76  qlite3ExprResolv
16db0 65 4e 61 6d 65 73 28 26 73 4e 43 2c 20 70 2d 3e  eNames(&sNC, p->
16dc0 70 4c 69 6d 69 74 29 20 7c 7c 0a 20 20 20 20 20  pLimit) ||.     
16dd0 20 73 71 6c 69 74 65 33 45 78 70 72 52 65 73 6f   sqlite3ExprReso
16de0 6c 76 65 4e 61 6d 65 73 28 26 73 4e 43 2c 20 70  lveNames(&sNC, p
16df0 2d 3e 70 4f 66 66 73 65 74 29 20 29 7b 0a 20 20  ->pOffset) ){.  
16e00 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
16e10 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  ERROR;.  }..  /*
16e20 20 53 65 74 20 75 70 20 74 68 65 20 6c 6f 63 61   Set up the loca
16e30 6c 20 6e 61 6d 65 2d 63 6f 6e 74 65 78 74 20 74  l name-context t
16e40 6f 20 70 61 73 73 20 74 6f 20 45 78 70 72 52 65  o pass to ExprRe
16e50 73 6f 6c 76 65 4e 61 6d 65 73 28 29 20 74 6f 0a  solveNames() to.
16e60 20 20 2a 2a 20 72 65 73 6f 6c 76 65 20 74 68 65    ** resolve the
16e70 20 65 78 70 72 65 73 73 69 6f 6e 2d 6c 69 73 74   expression-list
16e80 2e 0a 20 20 2a 2f 0a 20 20 73 4e 43 2e 61 6c 6c  ..  */.  sNC.all
16e90 6f 77 41 67 67 20 3d 20 31 3b 0a 20 20 73 4e 43  owAgg = 1;.  sNC
16ea0 2e 70 53 72 63 4c 69 73 74 20 3d 20 70 2d 3e 70  .pSrcList = p->p
16eb0 53 72 63 3b 0a 20 20 73 4e 43 2e 70 4e 65 78 74  Src;.  sNC.pNext
16ec0 20 3d 20 70 4f 75 74 65 72 4e 43 3b 0a 0a 20 20   = pOuterNC;..  
16ed0 2f 2a 20 52 65 73 6f 6c 76 65 20 6e 61 6d 65 73  /* Resolve names
16ee0 20 69 6e 20 74 68 65 20 72 65 73 75 6c 74 20 73   in the result s
16ef0 65 74 2e 20 2a 2f 0a 20 20 70 45 4c 69 73 74 20  et. */.  pEList 
16f00 3d 20 70 2d 3e 70 45 4c 69 73 74 3b 0a 20 20 69  = p->pEList;.  i
16f10 66 28 20 21 70 45 4c 69 73 74 20 29 20 72 65 74  f( !pEList ) ret
16f20 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52  urn SQLITE_ERROR
16f30 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70  ;.  for(i=0; i<p
16f40 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b  EList->nExpr; i+
16f50 2b 29 7b 0a 20 20 20 20 45 78 70 72 20 2a 70 58  +){.    Expr *pX
16f60 20 3d 20 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e   = pEList->a[i].
16f70 70 45 78 70 72 3b 0a 20 20 20 20 69 66 28 20 73  pExpr;.    if( s
16f80 71 6c 69 74 65 33 45 78 70 72 52 65 73 6f 6c 76  qlite3ExprResolv
16f90 65 4e 61 6d 65 73 28 26 73 4e 43 2c 20 70 58 29  eNames(&sNC, pX)
16fa0 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
16fb0 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20   SQLITE_ERROR;. 
16fc0 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49     }.  }..  /* I
16fd0 66 20 74 68 65 72 65 20 61 72 65 20 6e 6f 20 61  f there are no a
16fe0 67 67 72 65 67 61 74 65 20 66 75 6e 63 74 69 6f  ggregate functio
16ff0 6e 73 20 69 6e 20 74 68 65 20 72 65 73 75 6c 74  ns in the result
17000 2d 73 65 74 2c 20 61 6e 64 20 6e 6f 20 47 52 4f  -set, and no GRO
17010 55 50 20 42 59 20 0a 20 20 2a 2a 20 65 78 70 72  UP BY .  ** expr
17020 65 73 73 69 6f 6e 2c 20 64 6f 20 6e 6f 74 20 61  ession, do not a
17030 6c 6c 6f 77 20 61 67 67 72 65 67 61 74 65 73 20  llow aggregates 
17040 69 6e 20 61 6e 79 20 6f 66 20 74 68 65 20 6f 74  in any of the ot
17050 68 65 72 20 65 78 70 72 65 73 73 69 6f 6e 73 2e  her expressions.
17060 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  .  */.  assert( 
17070 21 70 2d 3e 69 73 41 67 67 20 29 3b 0a 20 20 70  !p->isAgg );.  p
17080 47 72 6f 75 70 42 79 20 3d 20 70 2d 3e 70 47 72  GroupBy = p->pGr
17090 6f 75 70 42 79 3b 0a 20 20 69 66 28 20 70 47 72  oupBy;.  if( pGr
170a0 6f 75 70 42 79 20 7c 7c 20 73 4e 43 2e 68 61 73  oupBy || sNC.has
170b0 41 67 67 20 29 7b 0a 20 20 20 20 70 2d 3e 69 73  Agg ){.    p->is
170c0 41 67 67 20 3d 20 31 3b 0a 20 20 7d 65 6c 73 65  Agg = 1;.  }else
170d0 7b 0a 20 20 20 20 73 4e 43 2e 61 6c 6c 6f 77 41  {.    sNC.allowA
170e0 67 67 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f  gg = 0;.  }..  /
170f0 2a 20 49 66 20 61 20 48 41 56 49 4e 47 20 63 6c  * If a HAVING cl
17100 61 75 73 65 20 69 73 20 70 72 65 73 65 6e 74 2c  ause is present,
17110 20 74 68 65 6e 20 74 68 65 72 65 20 6d 75 73 74   then there must
17120 20 62 65 20 61 20 47 52 4f 55 50 20 42 59 20 63   be a GROUP BY c
17130 6c 61 75 73 65 2e 0a 20 20 2a 2f 0a 20 20 69 66  lause..  */.  if
17140 28 20 70 2d 3e 70 48 61 76 69 6e 67 20 26 26 20  ( p->pHaving && 
17150 21 70 47 72 6f 75 70 42 79 20 29 7b 0a 20 20 20  !pGroupBy ){.   
17160 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
17170 28 70 50 61 72 73 65 2c 20 22 61 20 47 52 4f 55  (pParse, "a GROU
17180 50 20 42 59 20 63 6c 61 75 73 65 20 69 73 20 72  P BY clause is r
17190 65 71 75 69 72 65 64 20 62 65 66 6f 72 65 20 48  equired before H
171a0 41 56 49 4e 47 22 29 3b 0a 20 20 20 20 72 65 74  AVING");.    ret
171b0 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52  urn SQLITE_ERROR
171c0 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 64 64 20  ;.  }..  /* Add 
171d0 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 6c  the expression l
171e0 69 73 74 20 74 6f 20 74 68 65 20 6e 61 6d 65 2d  ist to the name-
171f0 63 6f 6e 74 65 78 74 20 62 65 66 6f 72 65 20 70  context before p
17200 61 72 73 69 6e 67 20 74 68 65 0a 20 20 2a 2a 20  arsing the.  ** 
17210 6f 74 68 65 72 20 65 78 70 72 65 73 73 69 6f 6e  other expression
17220 73 20 69 6e 20 74 68 65 20 53 45 4c 45 43 54 20  s in the SELECT 
17230 73 74 61 74 65 6d 65 6e 74 2e 20 54 68 69 73 20  statement. This 
17240 69 73 20 73 6f 20 74 68 61 74 0a 20 20 2a 2a 20  is so that.  ** 
17250 65 78 70 72 65 73 73 69 6f 6e 73 20 69 6e 20 74  expressions in t
17260 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  he WHERE clause 
17270 28 65 74 63 2e 29 20 63 61 6e 20 72 65 66 65 72  (etc.) can refer
17280 20 74 6f 20 65 78 70 72 65 73 73 69 6f 6e 73 20   to expressions 
17290 62 79 0a 20 20 2a 2a 20 61 6c 69 61 73 65 73 20  by.  ** aliases 
172a0 69 6e 20 74 68 65 20 72 65 73 75 6c 74 20 73 65  in the result se
172b0 74 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 4d 69 6e  t..  **.  ** Min
172c0 6f 72 20 70 6f 69 6e 74 3a 20 49 66 20 74 68 69  or point: If thi
172d0 73 20 69 73 20 74 68 65 20 63 61 73 65 2c 20 74  s is the case, t
172e0 68 65 6e 20 74 68 65 20 65 78 70 72 65 73 73 69  hen the expressi
172f0 6f 6e 20 77 69 6c 6c 20 62 65 0a 20 20 2a 2a 20  on will be.  ** 
17300 72 65 2d 65 76 61 6c 75 61 74 65 64 20 66 6f 72  re-evaluated for
17310 20 65 61 63 68 20 72 65 66 65 72 65 6e 63 65 20   each reference 
17320 74 6f 20 69 74 2e 0a 20 20 2a 2f 0a 20 20 73 4e  to it..  */.  sN
17330 43 2e 70 45 4c 69 73 74 20 3d 20 70 2d 3e 70 45  C.pEList = p->pE
17340 4c 69 73 74 3b 0a 20 20 69 66 28 20 73 71 6c 69  List;.  if( sqli
17350 74 65 33 45 78 70 72 52 65 73 6f 6c 76 65 4e 61  te3ExprResolveNa
17360 6d 65 73 28 26 73 4e 43 2c 20 70 2d 3e 70 57 68  mes(&sNC, p->pWh
17370 65 72 65 29 20 7c 7c 0a 20 20 20 20 20 73 71 6c  ere) ||.     sql
17380 69 74 65 33 45 78 70 72 52 65 73 6f 6c 76 65 4e  ite3ExprResolveN
17390 61 6d 65 73 28 26 73 4e 43 2c 20 70 2d 3e 70 48  ames(&sNC, p->pH
173a0 61 76 69 6e 67 29 20 29 7b 0a 20 20 20 20 72 65  aving) ){.    re
173b0 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f  turn SQLITE_ERRO
173c0 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e  R;.  }.  if( p->
173d0 70 50 72 69 6f 72 3d 3d 30 20 29 7b 0a 20 20 20  pPrior==0 ){.   
173e0 20 69 66 28 20 70 72 6f 63 65 73 73 4f 72 64 65   if( processOrde
173f0 72 47 72 6f 75 70 42 79 28 70 50 61 72 73 65 2c  rGroupBy(pParse,
17400 20 70 2c 20 70 2d 3e 70 4f 72 64 65 72 42 79 2c   p, p->pOrderBy,
17410 20 31 2c 20 26 73 4e 43 2e 68 61 73 41 67 67 29   1, &sNC.hasAgg)
17420 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
17430 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20   SQLITE_ERROR;. 
17440 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 70     }.  }.  if( p
17450 72 6f 63 65 73 73 4f 72 64 65 72 47 72 6f 75 70  rocessOrderGroup
17460 42 79 28 70 50 61 72 73 65 2c 20 70 2c 20 70 47  By(pParse, p, pG
17470 72 6f 75 70 42 79 2c 20 30 2c 20 26 73 4e 43 2e  roupBy, 0, &sNC.
17480 68 61 73 41 67 67 29 20 29 7b 0a 20 20 20 20 72  hasAgg) ){.    r
17490 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52  eturn SQLITE_ERR
174a0 4f 52 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70  OR;.  }..  if( p
174b0 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f  Parse->db->mallo
174c0 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 72  cFailed ){.    r
174d0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d  eturn SQLITE_NOM
174e0 45 4d 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61  EM;.  }..  /* Ma
174f0 6b 65 20 73 75 72 65 20 74 68 65 20 47 52 4f 55  ke sure the GROU
17500 50 20 42 59 20 63 6c 61 75 73 65 20 64 6f 65 73  P BY clause does
17510 20 6e 6f 74 20 63 6f 6e 74 61 69 6e 20 61 67 67   not contain agg
17520 72 65 67 61 74 65 20 66 75 6e 63 74 69 6f 6e 73  regate functions
17530 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 47 72  ..  */.  if( pGr
17540 6f 75 70 42 79 20 29 7b 0a 20 20 20 20 73 74 72  oupBy ){.    str
17550 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65  uct ExprList_ite
17560 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 0a 20 20 20  m *pItem;.  .   
17570 20 66 6f 72 28 69 3d 30 2c 20 70 49 74 65 6d 3d   for(i=0, pItem=
17580 70 47 72 6f 75 70 42 79 2d 3e 61 3b 20 69 3c 70  pGroupBy->a; i<p
17590 47 72 6f 75 70 42 79 2d 3e 6e 45 78 70 72 3b 20  GroupBy->nExpr; 
175a0 69 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20  i++, pItem++){. 
175b0 20 20 20 20 20 69 66 28 20 45 78 70 72 48 61 73       if( ExprHas
175c0 50 72 6f 70 65 72 74 79 28 70 49 74 65 6d 2d 3e  Property(pItem->
175d0 70 45 78 70 72 2c 20 45 50 5f 41 67 67 29 20 29  pExpr, EP_Agg) )
175e0 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
175f0 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
17600 2c 20 22 61 67 67 72 65 67 61 74 65 20 66 75 6e  , "aggregate fun
17610 63 74 69 6f 6e 73 20 61 72 65 20 6e 6f 74 20 61  ctions are not a
17620 6c 6c 6f 77 65 64 20 69 6e 20 22 0a 20 20 20 20  llowed in ".    
17630 20 20 20 20 20 20 20 20 22 74 68 65 20 47 52 4f          "the GRO
17640 55 50 20 42 59 20 63 6c 61 75 73 65 22 29 3b 0a  UP BY clause");.
17650 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53          return S
17660 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20  QLITE_ERROR;.   
17670 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a     }.    }.  }..
17680 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20    /* If this is 
17690 6f 6e 65 20 53 45 4c 45 43 54 20 6f 66 20 61 20  one SELECT of a 
176a0 63 6f 6d 70 6f 75 6e 64 2c 20 62 65 20 73 75 72  compound, be sur
176b0 65 20 74 6f 20 72 65 73 6f 6c 76 65 20 6e 61 6d  e to resolve nam
176c0 65 73 0a 20 20 2a 2a 20 69 6e 20 74 68 65 20 6f  es.  ** in the o
176d0 74 68 65 72 20 53 45 4c 45 43 54 73 2e 0a 20 20  ther SELECTs..  
176e0 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 70 50 72 69  */.  if( p->pPri
176f0 6f 72 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  or ){.    return
17700 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 52 65   sqlite3SelectRe
17710 73 6f 6c 76 65 28 70 50 61 72 73 65 2c 20 70 2d  solve(pParse, p-
17720 3e 70 50 72 69 6f 72 2c 20 70 4f 75 74 65 72 4e  >pPrior, pOuterN
17730 43 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  C);.  }else{.   
17740 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
17750 4b 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  K;.  }.}../*.** 
17760 52 65 73 65 74 20 74 68 65 20 61 67 67 72 65 67  Reset the aggreg
17770 61 74 65 20 61 63 63 75 6d 75 6c 61 74 6f 72 2e  ate accumulator.
17780 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 67 67 72 65  .**.** The aggre
17790 67 61 74 65 20 61 63 63 75 6d 75 6c 61 74 6f 72  gate accumulator
177a0 20 69 73 20 61 20 73 65 74 20 6f 66 20 6d 65 6d   is a set of mem
177b0 6f 72 79 20 63 65 6c 6c 73 20 74 68 61 74 20 68  ory cells that h
177c0 6f 6c 64 0a 2a 2a 20 69 6e 74 65 72 6d 65 64 69  old.** intermedi
177d0 61 74 65 20 72 65 73 75 6c 74 73 20 77 68 69 6c  ate results whil
177e0 65 20 63 61 6c 63 75 6c 61 74 69 6e 67 20 61 6e  e calculating an
177f0 20 61 67 67 72 65 67 61 74 65 2e 20 20 54 68 69   aggregate.  Thi
17800 73 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 73 69 6d  s.** routine sim
17810 70 6c 79 20 73 74 6f 72 65 73 20 4e 55 4c 4c 73  ply stores NULLs
17820 20 69 6e 20 61 6c 6c 20 6f 66 20 74 68 6f 73 65   in all of those
17830 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 73 2e 0a 2a   memory cells..*
17840 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72 65  /.static void re
17850 73 65 74 41 63 63 75 6d 75 6c 61 74 6f 72 28 50  setAccumulator(P
17860 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 41 67  arse *pParse, Ag
17870 67 49 6e 66 6f 20 2a 70 41 67 67 49 6e 66 6f 29  gInfo *pAggInfo)
17880 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50  {.  Vdbe *v = pP
17890 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69  arse->pVdbe;.  i
178a0 6e 74 20 69 3b 0a 20 20 73 74 72 75 63 74 20 41  nt i;.  struct A
178b0 67 67 49 6e 66 6f 5f 66 75 6e 63 20 2a 70 46 75  ggInfo_func *pFu
178c0 6e 63 3b 0a 20 20 69 66 28 20 70 41 67 67 49 6e  nc;.  if( pAggIn
178d0 66 6f 2d 3e 6e 46 75 6e 63 2b 70 41 67 67 49 6e  fo->nFunc+pAggIn
178e0 66 6f 2d 3e 6e 43 6f 6c 75 6d 6e 3d 3d 30 20 29  fo->nColumn==0 )
178f0 7b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20  {.    return;.  
17900 7d 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70  }.  for(i=0; i<p
17910 41 67 67 49 6e 66 6f 2d 3e 6e 43 6f 6c 75 6d 6e  AggInfo->nColumn
17920 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69  ; i++){.    sqli
17930 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
17940 4f 50 5f 4d 65 6d 4e 75 6c 6c 2c 20 70 41 67 67  OP_MemNull, pAgg
17950 49 6e 66 6f 2d 3e 61 43 6f 6c 5b 69 5d 2e 69 4d  Info->aCol[i].iM
17960 65 6d 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 66 6f  em, 0);.  }.  fo
17970 72 28 70 46 75 6e 63 3d 70 41 67 67 49 6e 66 6f  r(pFunc=pAggInfo
17980 2d 3e 61 46 75 6e 63 2c 20 69 3d 30 3b 20 69 3c  ->aFunc, i=0; i<
17990 70 41 67 67 49 6e 66 6f 2d 3e 6e 46 75 6e 63 3b  pAggInfo->nFunc;
179a0 20 69 2b 2b 2c 20 70 46 75 6e 63 2b 2b 29 7b 0a   i++, pFunc++){.
179b0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
179c0 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 65 6d 4e 75  ddOp(v, OP_MemNu
179d0 6c 6c 2c 20 70 46 75 6e 63 2d 3e 69 4d 65 6d 2c  ll, pFunc->iMem,
179e0 20 30 29 3b 0a 20 20 20 20 69 66 28 20 70 46 75   0);.    if( pFu
179f0 6e 63 2d 3e 69 44 69 73 74 69 6e 63 74 3e 3d 30  nc->iDistinct>=0
17a00 20 29 7b 0a 20 20 20 20 20 20 45 78 70 72 20 2a   ){.      Expr *
17a10 70 45 20 3d 20 70 46 75 6e 63 2d 3e 70 45 78 70  pE = pFunc->pExp
17a20 72 3b 0a 20 20 20 20 20 20 69 66 28 20 70 45 2d  r;.      if( pE-
17a30 3e 70 4c 69 73 74 3d 3d 30 20 7c 7c 20 70 45 2d  >pList==0 || pE-
17a40 3e 70 4c 69 73 74 2d 3e 6e 45 78 70 72 21 3d 31  >pList->nExpr!=1
17a50 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
17a60 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
17a70 73 65 2c 20 22 44 49 53 54 49 4e 43 54 20 69 6e  se, "DISTINCT in
17a80 20 61 67 67 72 65 67 61 74 65 20 6d 75 73 74 20   aggregate must 
17a90 62 65 20 66 6f 6c 6c 6f 77 65 64 20 22 0a 20 20  be followed ".  
17aa0 20 20 20 20 20 20 20 20 20 22 62 79 20 61 6e 20           "by an 
17ab0 65 78 70 72 65 73 73 69 6f 6e 22 29 3b 0a 20 20  expression");.  
17ac0 20 20 20 20 20 20 70 46 75 6e 63 2d 3e 69 44 69        pFunc->iDi
17ad0 73 74 69 6e 63 74 20 3d 20 2d 31 3b 0a 20 20 20  stinct = -1;.   
17ae0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
17af0 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49    KeyInfo *pKeyI
17b00 6e 66 6f 20 3d 20 6b 65 79 49 6e 66 6f 46 72 6f  nfo = keyInfoFro
17b10 6d 45 78 70 72 4c 69 73 74 28 70 50 61 72 73 65  mExprList(pParse
17b20 2c 20 70 45 2d 3e 70 4c 69 73 74 29 3b 0a 20 20  , pE->pList);.  
17b30 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
17b40 65 4f 70 33 28 76 2c 20 4f 50 5f 4f 70 65 6e 45  eOp3(v, OP_OpenE
17b50 70 68 65 6d 65 72 61 6c 2c 20 70 46 75 6e 63 2d  phemeral, pFunc-
17b60 3e 69 44 69 73 74 69 6e 63 74 2c 20 30 2c 20 0a  >iDistinct, 0, .
17b70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17b80 20 20 20 20 20 20 20 20 20 20 28 63 68 61 72 2a            (char*
17b90 29 70 4b 65 79 49 6e 66 6f 2c 20 50 33 5f 4b 45  )pKeyInfo, P3_KE
17ba0 59 49 4e 46 4f 5f 48 41 4e 44 4f 46 46 29 3b 0a  YINFO_HANDOFF);.
17bb0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
17bc0 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 76 6f 6b  }.}../*.** Invok
17bd0 65 20 74 68 65 20 4f 50 5f 41 67 67 46 69 6e 61  e the OP_AggFina
17be0 6c 69 7a 65 20 6f 70 63 6f 64 65 20 66 6f 72 20  lize opcode for 
17bf0 65 76 65 72 79 20 61 67 67 72 65 67 61 74 65 20  every aggregate 
17c00 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 69 6e 20 74  function.** in t
17c10 68 65 20 41 67 67 49 6e 66 6f 20 73 74 72 75 63  he AggInfo struc
17c20 74 75 72 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ture..*/.static 
17c30 76 6f 69 64 20 66 69 6e 61 6c 69 7a 65 41 67 67  void finalizeAgg
17c40 46 75 6e 63 74 69 6f 6e 73 28 50 61 72 73 65 20  Functions(Parse 
17c50 2a 70 50 61 72 73 65 2c 20 41 67 67 49 6e 66 6f  *pParse, AggInfo
17c60 20 2a 70 41 67 67 49 6e 66 6f 29 7b 0a 20 20 56   *pAggInfo){.  V
17c70 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d  dbe *v = pParse-
17c80 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74 20 69 3b  >pVdbe;.  int i;
17c90 0a 20 20 73 74 72 75 63 74 20 41 67 67 49 6e 66  .  struct AggInf
17ca0 6f 5f 66 75 6e 63 20 2a 70 46 3b 0a 20 20 66 6f  o_func *pF;.  fo
17cb0 72 28 69 3d 30 2c 20 70 46 3d 70 41 67 67 49 6e  r(i=0, pF=pAggIn
17cc0 66 6f 2d 3e 61 46 75 6e 63 3b 20 69 3c 70 41 67  fo->aFunc; i<pAg
17cd0 67 49 6e 66 6f 2d 3e 6e 46 75 6e 63 3b 20 69 2b  gInfo->nFunc; i+
17ce0 2b 2c 20 70 46 2b 2b 29 7b 0a 20 20 20 20 45 78  +, pF++){.    Ex
17cf0 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 20 3d 20  prList *pList = 
17d00 70 46 2d 3e 70 45 78 70 72 2d 3e 70 4c 69 73 74  pF->pExpr->pList
17d10 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
17d20 65 4f 70 33 28 76 2c 20 4f 50 5f 41 67 67 46 69  eOp3(v, OP_AggFi
17d30 6e 61 6c 2c 20 70 46 2d 3e 69 4d 65 6d 2c 20 70  nal, pF->iMem, p
17d40 4c 69 73 74 20 3f 20 70 4c 69 73 74 2d 3e 6e 45  List ? pList->nE
17d50 78 70 72 20 3a 20 30 2c 0a 20 20 20 20 20 20 20  xpr : 0,.       
17d60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28                 (
17d70 76 6f 69 64 2a 29 70 46 2d 3e 70 46 75 6e 63 2c  void*)pF->pFunc,
17d80 20 50 33 5f 46 55 4e 43 44 45 46 29 3b 0a 20 20   P3_FUNCDEF);.  
17d90 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 70 64 61 74  }.}../*.** Updat
17da0 65 20 74 68 65 20 61 63 63 75 6d 75 6c 61 74 6f  e the accumulato
17db0 72 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 73 20 66  r memory cells f
17dc0 6f 72 20 61 6e 20 61 67 67 72 65 67 61 74 65 20  or an aggregate 
17dd0 62 61 73 65 64 20 6f 6e 0a 2a 2a 20 74 68 65 20  based on.** the 
17de0 63 75 72 72 65 6e 74 20 63 75 72 73 6f 72 20 70  current cursor p
17df0 6f 73 69 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74  osition..*/.stat
17e00 69 63 20 76 6f 69 64 20 75 70 64 61 74 65 41 63  ic void updateAc
17e10 63 75 6d 75 6c 61 74 6f 72 28 50 61 72 73 65 20  cumulator(Parse 
17e20 2a 70 50 61 72 73 65 2c 20 41 67 67 49 6e 66 6f  *pParse, AggInfo
17e30 20 2a 70 41 67 67 49 6e 66 6f 29 7b 0a 20 20 56   *pAggInfo){.  V
17e40 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d  dbe *v = pParse-
17e50 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74 20 69 3b  >pVdbe;.  int i;
17e60 0a 20 20 73 74 72 75 63 74 20 41 67 67 49 6e 66  .  struct AggInf
17e70 6f 5f 66 75 6e 63 20 2a 70 46 3b 0a 20 20 73 74  o_func *pF;.  st
17e80 72 75 63 74 20 41 67 67 49 6e 66 6f 5f 63 6f 6c  ruct AggInfo_col
17e90 20 2a 70 43 3b 0a 0a 20 20 70 41 67 67 49 6e 66   *pC;..  pAggInf
17ea0 6f 2d 3e 64 69 72 65 63 74 4d 6f 64 65 20 3d 20  o->directMode = 
17eb0 31 3b 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70 46  1;.  for(i=0, pF
17ec0 3d 70 41 67 67 49 6e 66 6f 2d 3e 61 46 75 6e 63  =pAggInfo->aFunc
17ed0 3b 20 69 3c 70 41 67 67 49 6e 66 6f 2d 3e 6e 46  ; i<pAggInfo->nF
17ee0 75 6e 63 3b 20 69 2b 2b 2c 20 70 46 2b 2b 29 7b  unc; i++, pF++){
17ef0 0a 20 20 20 20 69 6e 74 20 6e 41 72 67 3b 0a 20  .    int nArg;. 
17f00 20 20 20 69 6e 74 20 61 64 64 72 4e 65 78 74 20     int addrNext 
17f10 3d 20 30 3b 0a 20 20 20 20 45 78 70 72 4c 69 73  = 0;.    ExprLis
17f20 74 20 2a 70 4c 69 73 74 20 3d 20 70 46 2d 3e 70  t *pList = pF->p
17f30 45 78 70 72 2d 3e 70 4c 69 73 74 3b 0a 20 20 20  Expr->pList;.   
17f40 20 69 66 28 20 70 4c 69 73 74 20 29 7b 0a 20 20   if( pList ){.  
17f50 20 20 20 20 6e 41 72 67 20 3d 20 70 4c 69 73 74      nArg = pList
17f60 2d 3e 6e 45 78 70 72 3b 0a 20 20 20 20 20 20 73  ->nExpr;.      s
17f70 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 45 78  qlite3ExprCodeEx
17f80 70 72 4c 69 73 74 28 70 50 61 72 73 65 2c 20 70  prList(pParse, p
17f90 4c 69 73 74 29 3b 0a 20 20 20 20 7d 65 6c 73 65  List);.    }else
17fa0 7b 0a 20 20 20 20 20 20 6e 41 72 67 20 3d 20 30  {.      nArg = 0
17fb0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
17fc0 70 46 2d 3e 69 44 69 73 74 69 6e 63 74 3e 3d 30  pF->iDistinct>=0
17fd0 20 29 7b 0a 20 20 20 20 20 20 61 64 64 72 4e 65   ){.      addrNe
17fe0 78 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  xt = sqlite3Vdbe
17ff0 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20  MakeLabel(v);.  
18000 20 20 20 20 61 73 73 65 72 74 28 20 6e 41 72 67      assert( nArg
18010 3d 3d 31 20 29 3b 0a 20 20 20 20 20 20 63 6f 64  ==1 );.      cod
18020 65 44 69 73 74 69 6e 63 74 28 76 2c 20 70 46 2d  eDistinct(v, pF-
18030 3e 69 44 69 73 74 69 6e 63 74 2c 20 61 64 64 72  >iDistinct, addr
18040 4e 65 78 74 2c 20 31 29 3b 0a 20 20 20 20 7d 0a  Next, 1);.    }.
18050 20 20 20 20 69 66 28 20 70 46 2d 3e 70 46 75 6e      if( pF->pFun
18060 63 2d 3e 6e 65 65 64 43 6f 6c 6c 53 65 71 20 29  c->needCollSeq )
18070 7b 0a 20 20 20 20 20 20 43 6f 6c 6c 53 65 71 20  {.      CollSeq 
18080 2a 70 43 6f 6c 6c 20 3d 20 30 3b 0a 20 20 20 20  *pColl = 0;.    
18090 20 20 73 74 72 75 63 74 20 45 78 70 72 4c 69 73    struct ExprLis
180a0 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20  t_item *pItem;. 
180b0 20 20 20 20 20 69 6e 74 20 6a 3b 0a 20 20 20 20       int j;.    
180c0 20 20 61 73 73 65 72 74 28 20 70 4c 69 73 74 21    assert( pList!
180d0 3d 30 20 29 3b 20 20 2f 2a 20 70 4c 69 73 74 21  =0 );  /* pList!
180e0 3d 30 20 69 66 20 70 46 2d 3e 70 46 75 6e 63 2d  =0 if pF->pFunc-
180f0 3e 6e 65 65 64 43 6f 6c 6c 53 65 71 20 69 73 20  >needCollSeq is 
18100 74 72 75 65 20 2a 2f 0a 20 20 20 20 20 20 66 6f  true */.      fo
18110 72 28 6a 3d 30 2c 20 70 49 74 65 6d 3d 70 4c 69  r(j=0, pItem=pLi
18120 73 74 2d 3e 61 3b 20 21 70 43 6f 6c 6c 20 26 26  st->a; !pColl &&
18130 20 6a 3c 6e 41 72 67 3b 20 6a 2b 2b 2c 20 70 49   j<nArg; j++, pI
18140 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  tem++){.        
18150 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 45  pColl = sqlite3E
18160 78 70 72 43 6f 6c 6c 53 65 71 28 70 50 61 72 73  xprCollSeq(pPars
18170 65 2c 20 70 49 74 65 6d 2d 3e 70 45 78 70 72 29  e, pItem->pExpr)
18180 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
18190 69 66 28 20 21 70 43 6f 6c 6c 20 29 7b 0a 20 20  if( !pColl ){.  
181a0 20 20 20 20 20 20 70 43 6f 6c 6c 20 3d 20 70 50        pColl = pP
181b0 61 72 73 65 2d 3e 64 62 2d 3e 70 44 66 6c 74 43  arse->db->pDfltC
181c0 6f 6c 6c 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  oll;.      }.   
181d0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4f 70     sqlite3VdbeOp
181e0 33 28 76 2c 20 4f 50 5f 43 6f 6c 6c 53 65 71 2c  3(v, OP_CollSeq,
181f0 20 30 2c 20 30 2c 20 28 63 68 61 72 20 2a 29 70   0, 0, (char *)p
18200 43 6f 6c 6c 2c 20 50 33 5f 43 4f 4c 4c 53 45 51  Coll, P3_COLLSEQ
18210 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c  );.    }.    sql
18220 69 74 65 33 56 64 62 65 4f 70 33 28 76 2c 20 4f  ite3VdbeOp3(v, O
18230 50 5f 41 67 67 53 74 65 70 2c 20 70 46 2d 3e 69  P_AggStep, pF->i
18240 4d 65 6d 2c 20 6e 41 72 67 2c 20 28 76 6f 69 64  Mem, nArg, (void
18250 2a 29 70 46 2d 3e 70 46 75 6e 63 2c 20 50 33 5f  *)pF->pFunc, P3_
18260 46 55 4e 43 44 45 46 29 3b 0a 20 20 20 20 69 66  FUNCDEF);.    if
18270 28 20 61 64 64 72 4e 65 78 74 20 29 7b 0a 20 20  ( addrNext ){.  
18280 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 52      sqlite3VdbeR
18290 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 61  esolveLabel(v, a
182a0 64 64 72 4e 65 78 74 29 3b 0a 20 20 20 20 7d 0a  ddrNext);.    }.
182b0 20 20 7d 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70    }.  for(i=0, p
182c0 43 3d 70 41 67 67 49 6e 66 6f 2d 3e 61 43 6f 6c  C=pAggInfo->aCol
182d0 3b 20 69 3c 70 41 67 67 49 6e 66 6f 2d 3e 6e 41  ; i<pAggInfo->nA
182e0 63 63 75 6d 75 6c 61 74 6f 72 3b 20 69 2b 2b 2c  ccumulator; i++,
182f0 20 70 43 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69   pC++){.    sqli
18300 74 65 33 45 78 70 72 43 6f 64 65 28 70 50 61 72  te3ExprCode(pPar
18310 73 65 2c 20 70 43 2d 3e 70 45 78 70 72 29 3b 0a  se, pC->pExpr);.
18320 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
18330 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 65 6d 53 74  ddOp(v, OP_MemSt
18340 6f 72 65 2c 20 70 43 2d 3e 69 4d 65 6d 2c 20 31  ore, pC->iMem, 1
18350 29 3b 0a 20 20 7d 0a 20 20 70 41 67 67 49 6e 66  );.  }.  pAggInf
18360 6f 2d 3e 64 69 72 65 63 74 4d 6f 64 65 20 3d 20  o->directMode = 
18370 30 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e  0;.}.../*.** Gen
18380 65 72 61 74 65 20 63 6f 64 65 20 66 6f 72 20 74  erate code for t
18390 68 65 20 67 69 76 65 6e 20 53 45 4c 45 43 54 20  he given SELECT 
183a0 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a  statement..**.**
183b0 20 54 68 65 20 72 65 73 75 6c 74 73 20 61 72 65   The results are
183c0 20 64 69 73 74 72 69 62 75 74 65 64 20 69 6e 20   distributed in 
183d0 76 61 72 69 6f 75 73 20 77 61 79 73 20 64 65 70  various ways dep
183e0 65 6e 64 69 6e 67 20 6f 6e 20 74 68 65 0a 2a 2a  ending on the.**
183f0 20 76 61 6c 75 65 20 6f 66 20 65 44 65 73 74 20   value of eDest 
18400 61 6e 64 20 69 50 61 72 6d 2e 0a 2a 2a 0a 2a 2a  and iParm..**.**
18410 20 20 20 20 20 65 44 65 73 74 20 56 61 6c 75 65       eDest Value
18420 20 20 20 20 20 20 20 52 65 73 75 6c 74 0a 2a 2a         Result.**
18430 20 20 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d       -----------
18440 2d 20 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  -    -----------
18450 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
18460 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
18470 0a 2a 2a 20 20 20 20 20 53 52 54 5f 43 61 6c 6c  .**     SRT_Call
18480 62 61 63 6b 20 20 20 20 49 6e 76 6f 6b 65 20 74  back    Invoke t
18490 68 65 20 63 61 6c 6c 62 61 63 6b 20 66 6f 72 20  he callback for 
184a0 65 61 63 68 20 72 6f 77 20 6f 66 20 74 68 65 20  each row of the 
184b0 72 65 73 75 6c 74 2e 0a 2a 2a 0a 2a 2a 20 20 20  result..**.**   
184c0 20 20 53 52 54 5f 4d 65 6d 20 20 20 20 20 20 20    SRT_Mem       
184d0 20 20 53 74 6f 72 65 20 66 69 72 73 74 20 72 65    Store first re
184e0 73 75 6c 74 20 69 6e 20 6d 65 6d 6f 72 79 20 63  sult in memory c
184f0 65 6c 6c 20 69 50 61 72 6d 0a 2a 2a 0a 2a 2a 20  ell iParm.**.** 
18500 20 20 20 20 53 52 54 5f 53 65 74 20 20 20 20 20      SRT_Set     
18510 20 20 20 20 53 74 6f 72 65 20 72 65 73 75 6c 74      Store result
18520 73 20 61 73 20 6b 65 79 73 20 6f 66 20 74 61 62  s as keys of tab
18530 6c 65 20 69 50 61 72 6d 2e 0a 2a 2a 0a 2a 2a 20  le iParm..**.** 
18540 20 20 20 20 53 52 54 5f 55 6e 69 6f 6e 20 20 20      SRT_Union   
18550 20 20 20 20 53 74 6f 72 65 20 72 65 73 75 6c 74      Store result
18560 73 20 61 73 20 61 20 6b 65 79 20 69 6e 20 61 20  s as a key in a 
18570 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20  temporary table 
18580 69 50 61 72 6d 0a 2a 2a 0a 2a 2a 20 20 20 20 20  iParm.**.**     
18590 53 52 54 5f 45 78 63 65 70 74 20 20 20 20 20 20  SRT_Except      
185a0 52 65 6d 6f 76 65 20 72 65 73 75 6c 74 73 20 66  Remove results f
185b0 72 6f 6d 20 74 68 65 20 74 65 6d 70 6f 72 61 72  rom the temporar
185c0 79 20 74 61 62 6c 65 20 69 50 61 72 6d 2e 0a 2a  y table iParm..*
185d0 2a 0a 2a 2a 20 20 20 20 20 53 52 54 5f 54 61 62  *.**     SRT_Tab
185e0 6c 65 20 20 20 20 20 20 20 53 74 6f 72 65 20 72  le       Store r
185f0 65 73 75 6c 74 73 20 69 6e 20 74 65 6d 70 6f 72  esults in tempor
18600 61 72 79 20 74 61 62 6c 65 20 69 50 61 72 6d 0a  ary table iParm.
18610 2a 2a 0a 2a 2a 20 54 68 65 20 74 61 62 6c 65 20  **.** The table 
18620 61 62 6f 76 65 20 69 73 20 69 6e 63 6f 6d 70 6c  above is incompl
18630 65 74 65 2e 20 20 41 64 64 69 74 69 6f 6e 61 6c  ete.  Additional
18640 20 65 44 69 73 74 20 76 61 6c 75 65 20 68 61 76   eDist value hav
18650 65 20 62 65 20 61 64 64 65 64 0a 2a 2a 20 73 69  e be added.** si
18660 6e 63 65 20 74 68 69 73 20 63 6f 6d 6d 65 6e 74  nce this comment
18670 20 77 61 73 20 77 72 69 74 74 65 6e 2e 20 20 53   was written.  S
18680 65 65 20 74 68 65 20 73 65 6c 65 63 74 49 6e 6e  ee the selectInn
18690 65 72 4c 6f 6f 70 28 29 20 66 75 6e 63 74 69 6f  erLoop() functio
186a0 6e 20 66 6f 72 0a 2a 2a 20 61 20 63 6f 6d 70 6c  n for.** a compl
186b0 65 74 65 20 6c 69 73 74 69 6e 67 20 6f 66 20 74  ete listing of t
186c0 68 65 20 61 6c 6c 6f 77 65 64 20 76 61 6c 75 65  he allowed value
186d0 73 20 6f 66 20 65 44 65 73 74 20 61 6e 64 20 74  s of eDest and t
186e0 68 65 69 72 20 6d 65 61 6e 69 6e 67 73 2e 0a 2a  heir meanings..*
186f0 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
18700 65 20 72 65 74 75 72 6e 73 20 74 68 65 20 6e 75  e returns the nu
18710 6d 62 65 72 20 6f 66 20 65 72 72 6f 72 73 2e 20  mber of errors. 
18720 20 49 66 20 61 6e 79 20 65 72 72 6f 72 73 20 61   If any errors a
18730 72 65 0a 2a 2a 20 65 6e 63 6f 75 6e 74 65 72 65  re.** encountere
18740 64 2c 20 74 68 65 6e 20 61 6e 20 61 70 70 72 6f  d, then an appro
18750 70 72 69 61 74 65 20 65 72 72 6f 72 20 6d 65 73  priate error mes
18760 73 61 67 65 20 69 73 20 6c 65 66 74 20 69 6e 0a  sage is left in.
18770 2a 2a 20 70 50 61 72 73 65 2d 3e 7a 45 72 72 4d  ** pParse->zErrM
18780 73 67 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  sg..**.** This r
18790 6f 75 74 69 6e 65 20 64 6f 65 73 20 4e 4f 54 20  outine does NOT 
187a0 66 72 65 65 20 74 68 65 20 53 65 6c 65 63 74 20  free the Select 
187b0 73 74 72 75 63 74 75 72 65 20 70 61 73 73 65 64  structure passed
187c0 20 69 6e 2e 20 20 54 68 65 0a 2a 2a 20 63 61 6c   in.  The.** cal
187d0 6c 69 6e 67 20 66 75 6e 63 74 69 6f 6e 20 6e 65  ling function ne
187e0 65 64 73 20 74 6f 20 64 6f 20 74 68 61 74 2e 0a  eds to do that..
187f0 2a 2a 0a 2a 2a 20 54 68 65 20 70 50 61 72 65 6e  **.** The pParen
18800 74 2c 20 70 61 72 65 6e 74 54 61 62 2c 20 61 6e  t, parentTab, an
18810 64 20 2a 70 50 61 72 65 6e 74 41 67 67 20 66 69  d *pParentAgg fi
18820 65 6c 64 73 20 61 72 65 20 66 69 6c 6c 65 64 20  elds are filled 
18830 69 6e 20 69 66 20 74 68 69 73 0a 2a 2a 20 53 45  in if this.** SE
18840 4c 45 43 54 20 69 73 20 61 20 73 75 62 71 75 65  LECT is a subque
18850 72 79 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e  ry.  This routin
18860 65 20 6d 61 79 20 74 72 79 20 74 6f 20 63 6f 6d  e may try to com
18870 62 69 6e 65 20 74 68 69 73 20 53 45 4c 45 43 54  bine this SELECT
18880 0a 2a 2a 20 77 69 74 68 20 69 74 73 20 70 61 72  .** with its par
18890 65 6e 74 20 74 6f 20 66 6f 72 6d 20 61 20 73 69  ent to form a si
188a0 6e 67 6c 65 20 66 6c 61 74 20 71 75 65 72 79 2e  ngle flat query.
188b0 20 20 49 6e 20 73 6f 20 64 6f 69 6e 67 2c 20 69    In so doing, i
188c0 74 20 6d 69 67 68 74 0a 2a 2a 20 63 68 61 6e 67  t might.** chang
188d0 65 20 74 68 65 20 70 61 72 65 6e 74 20 71 75 65  e the parent que
188e0 72 79 20 66 72 6f 6d 20 61 20 6e 6f 6e 2d 61 67  ry from a non-ag
188f0 67 72 65 67 61 74 65 20 74 6f 20 61 6e 20 61 67  gregate to an ag
18900 67 72 65 67 61 74 65 20 71 75 65 72 79 2e 0a 2a  gregate query..*
18910 2a 20 46 6f 72 20 74 68 61 74 20 72 65 61 73 6f  * For that reaso
18920 6e 2c 20 74 68 65 20 70 50 61 72 65 6e 74 41 67  n, the pParentAg
18930 67 20 66 6c 61 67 20 69 73 20 70 61 73 73 65 64  g flag is passed
18940 20 61 73 20 61 20 70 6f 69 6e 74 65 72 2c 20 73   as a pointer, s
18950 6f 20 69 74 0a 2a 2a 20 63 61 6e 20 62 65 20 63  o it.** can be c
18960 68 61 6e 67 65 64 2e 0a 2a 2a 0a 2a 2a 20 45 78  hanged..**.** Ex
18970 61 6d 70 6c 65 20 31 3a 20 20 20 54 68 65 20 6d  ample 1:   The m
18980 65 61 6e 69 6e 67 20 6f 66 20 74 68 65 20 70 50  eaning of the pP
18990 61 72 65 6e 74 20 70 61 72 61 6d 65 74 65 72 2e  arent parameter.
189a0 0a 2a 2a 0a 2a 2a 20 20 20 20 53 45 4c 45 43 54  .**.**    SELECT
189b0 20 2a 20 46 52 4f 4d 20 74 31 20 4a 4f 49 4e 20   * FROM t1 JOIN 
189c0 28 53 45 4c 45 43 54 20 78 2c 20 63 6f 75 6e 74  (SELECT x, count
189d0 28 2a 29 20 46 52 4f 4d 20 74 32 29 20 4a 4f 49  (*) FROM t2) JOI
189e0 4e 20 74 33 3b 0a 2a 2a 20 20 20 20 5c 20 20 20  N t3;.**    \   
189f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18a00 20 20 20 5c 5f 5f 5f 5f 5f 5f 5f 20 73 75 62 71     \_______ subq
18a10 75 65 72 79 20 5f 5f 5f 5f 5f 5f 5f 2f 20 20 20  uery _______/   
18a20 20 20 20 20 20 2f 0a 2a 2a 20 20 20 20 20 5c 20       /.**     \ 
18a30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18a40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18a50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18a60 20 20 20 20 20 2f 0a 2a 2a 20 20 20 20 20 20 5c       /.**      \
18a70 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f  ________________
18a80 5f 5f 5f 5f 20 6f 75 74 65 72 20 71 75 65 72 79  ____ outer query
18a90 20 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f   _______________
18aa0 5f 5f 5f 5f 2f 0a 2a 2a 0a 2a 2a 20 54 68 69 73  ____/.**.** This
18ab0 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c   routine is call
18ac0 65 64 20 66 6f 72 20 74 68 65 20 6f 75 74 65 72  ed for the outer
18ad0 20 71 75 65 72 79 20 66 69 72 73 74 2e 20 20 20   query first.   
18ae0 46 6f 72 20 74 68 61 74 20 63 61 6c 6c 2c 0a 2a  For that call,.*
18af0 2a 20 70 50 61 72 65 6e 74 20 77 69 6c 6c 20 62  * pParent will b
18b00 65 20 4e 55 4c 4c 2e 20 20 44 75 72 69 6e 67 20  e NULL.  During 
18b10 74 68 65 20 70 72 6f 63 65 73 73 69 6e 67 20 6f  the processing o
18b20 66 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72  f the outer quer
18b30 79 2c 20 74 68 69 73 20 0a 2a 2a 20 72 6f 75 74  y, this .** rout
18b40 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 72 65  ine is called re
18b50 63 75 72 73 69 76 65 6c 79 20 74 6f 20 68 61 6e  cursively to han
18b60 64 6c 65 20 74 68 65 20 73 75 62 71 75 65 72 79  dle the subquery
18b70 2e 20 20 46 6f 72 20 74 68 65 20 72 65 63 75 72  .  For the recur
18b80 73 69 76 65 0a 2a 2a 20 63 61 6c 6c 2c 20 70 50  sive.** call, pP
18b90 61 72 65 6e 74 20 77 69 6c 6c 20 70 6f 69 6e 74  arent will point
18ba0 20 74 6f 20 74 68 65 20 6f 75 74 65 72 20 71 75   to the outer qu
18bb0 65 72 79 2e 20 20 42 65 63 61 75 73 65 20 74 68  ery.  Because th
18bc0 65 20 73 75 62 71 75 65 72 79 20 69 73 0a 2a 2a  e subquery is.**
18bd0 20 74 68 65 20 73 65 63 6f 6e 64 20 65 6c 65 6d   the second elem
18be0 65 6e 74 20 69 6e 20 61 20 74 68 72 65 65 2d 77  ent in a three-w
18bf0 61 79 20 6a 6f 69 6e 2c 20 74 68 65 20 70 61 72  ay join, the par
18c00 65 6e 74 54 61 62 20 70 61 72 61 6d 65 74 65 72  entTab parameter
18c10 20 77 69 6c 6c 0a 2a 2a 20 62 65 20 31 20 28 74   will.** be 1 (t
18c20 68 65 20 32 6e 64 20 76 61 6c 75 65 20 6f 66 20  he 2nd value of 
18c30 61 20 30 2d 69 6e 64 65 78 65 64 20 61 72 72 61  a 0-indexed arra
18c40 79 2e 29 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  y.).*/.int sqlit
18c50 65 33 53 65 6c 65 63 74 28 0a 20 20 50 61 72 73  e3Select(.  Pars
18c60 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20  e *pParse,      
18c70 20 20 20 2f 2a 20 54 68 65 20 70 61 72 73 65 72     /* The parser
18c80 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53 65   context */.  Se
18c90 6c 65 63 74 20 2a 70 2c 20 20 20 20 20 20 20 20  lect *p,        
18ca0 20 20 20 20 20 2f 2a 20 54 68 65 20 53 45 4c 45       /* The SELE
18cb0 43 54 20 73 74 61 74 65 6d 65 6e 74 20 62 65 69  CT statement bei
18cc0 6e 67 20 63 6f 64 65 64 2e 20 2a 2f 0a 20 20 69  ng coded. */.  i
18cd0 6e 74 20 65 44 65 73 74 2c 20 20 20 20 20 20 20  nt eDest,       
18ce0 20 20 20 20 20 20 2f 2a 20 48 6f 77 20 74 6f 20        /* How to 
18cf0 64 69 73 70 6f 73 65 20 6f 66 20 74 68 65 20 72  dispose of the r
18d00 65 73 75 6c 74 73 20 2a 2f 0a 20 20 69 6e 74 20  esults */.  int 
18d10 69 50 61 72 6d 2c 20 20 20 20 20 20 20 20 20 20  iParm,          
18d20 20 20 20 2f 2a 20 41 20 70 61 72 61 6d 65 74 65     /* A paramete
18d30 72 20 75 73 65 64 20 62 79 20 74 68 65 20 65 44  r used by the eD
18d40 65 73 74 20 64 69 73 70 6f 73 61 6c 20 6d 65 74  est disposal met
18d50 68 6f 64 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20  hod */.  Select 
18d60 2a 70 50 61 72 65 6e 74 2c 20 20 20 20 20 20 20  *pParent,       
18d70 2f 2a 20 41 6e 6f 74 68 65 72 20 53 45 4c 45 43  /* Another SELEC
18d80 54 20 66 6f 72 20 77 68 69 63 68 20 74 68 69 73  T for which this
18d90 20 69 73 20 61 20 73 75 62 2d 71 75 65 72 79 20   is a sub-query 
18da0 2a 2f 0a 20 20 69 6e 74 20 70 61 72 65 6e 74 54  */.  int parentT
18db0 61 62 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 49  ab,         /* I
18dc0 6e 64 65 78 20 69 6e 20 70 50 61 72 65 6e 74 2d  ndex in pParent-
18dd0 3e 70 53 72 63 20 6f 66 20 74 68 69 73 20 71 75  >pSrc of this qu
18de0 65 72 79 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 50  ery */.  int *pP
18df0 61 72 65 6e 74 41 67 67 2c 20 20 20 20 20 20 20  arentAgg,       
18e00 2f 2a 20 54 72 75 65 20 69 66 20 70 50 61 72 65  /* True if pPare
18e10 6e 74 20 75 73 65 73 20 61 67 67 72 65 67 61 74  nt uses aggregat
18e20 65 20 66 75 6e 63 74 69 6f 6e 73 20 2a 2f 0a 20  e functions */. 
18e30 20 63 68 61 72 20 2a 61 66 66 20 20 20 20 20 20   char *aff      
18e40 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 65 44          /* If eD
18e50 65 73 74 20 69 73 20 53 52 54 5f 55 6e 69 6f 6e  est is SRT_Union
18e60 2c 20 74 68 65 20 61 66 66 69 6e 69 74 79 20 73  , the affinity s
18e70 74 72 69 6e 67 20 2a 2f 0a 29 7b 0a 20 20 69 6e  tring */.){.  in
18e80 74 20 69 2c 20 6a 3b 20 20 20 20 20 20 20 20 20  t i, j;         
18e90 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75       /* Loop cou
18ea0 6e 74 65 72 73 20 2a 2f 0a 20 20 57 68 65 72 65  nters */.  Where
18eb0 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 3b 20 20 20  Info *pWInfo;   
18ec0 20 20 2f 2a 20 52 65 74 75 72 6e 20 66 72 6f 6d    /* Return from
18ed0 20 73 71 6c 69 74 65 33 57 68 65 72 65 42 65 67   sqlite3WhereBeg
18ee0 69 6e 28 29 20 2a 2f 0a 20 20 56 64 62 65 20 2a  in() */.  Vdbe *
18ef0 76 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  v;              
18f00 20 2f 2a 20 54 68 65 20 76 69 72 74 75 61 6c 20   /* The virtual 
18f10 6d 61 63 68 69 6e 65 20 75 6e 64 65 72 20 63 6f  machine under co
18f20 6e 73 74 72 75 63 74 69 6f 6e 20 2a 2f 0a 20 20  nstruction */.  
18f30 69 6e 74 20 69 73 41 67 67 3b 20 20 20 20 20 20  int isAgg;      
18f40 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 66         /* True f
18f50 6f 72 20 73 65 6c 65 63 74 20 6c 69 73 74 73 20  or select lists 
18f60 6c 69 6b 65 20 22 63 6f 75 6e 74 28 2a 29 22 20  like "count(*)" 
18f70 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70  */.  ExprList *p
18f80 45 4c 69 73 74 3b 20 20 20 20 20 20 2f 2a 20 4c  EList;      /* L
18f90 69 73 74 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 74  ist of columns t
18fa0 6f 20 65 78 74 72 61 63 74 2e 20 2a 2f 0a 20 20  o extract. */.  
18fb0 53 72 63 4c 69 73 74 20 2a 70 54 61 62 4c 69 73  SrcList *pTabLis
18fc0 74 3b 20 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f  t;     /* List o
18fd0 66 20 74 61 62 6c 65 73 20 74 6f 20 73 65 6c 65  f tables to sele
18fe0 63 74 20 66 72 6f 6d 20 2a 2f 0a 20 20 45 78 70  ct from */.  Exp
18ff0 72 20 2a 70 57 68 65 72 65 3b 20 20 20 20 20 20  r *pWhere;      
19000 20 20 20 20 2f 2a 20 54 68 65 20 57 48 45 52 45      /* The WHERE
19010 20 63 6c 61 75 73 65 2e 20 20 4d 61 79 20 62 65   clause.  May be
19020 20 4e 55 4c 4c 20 2a 2f 0a 20 20 45 78 70 72 4c   NULL */.  ExprL
19030 69 73 74 20 2a 70 4f 72 64 65 72 42 79 3b 20 20  ist *pOrderBy;  
19040 20 20 2f 2a 20 54 68 65 20 4f 52 44 45 52 20 42    /* The ORDER B
19050 59 20 63 6c 61 75 73 65 2e 20 20 4d 61 79 20 62  Y clause.  May b
19060 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20 45 78 70 72  e NULL */.  Expr
19070 4c 69 73 74 20 2a 70 47 72 6f 75 70 42 79 3b 20  List *pGroupBy; 
19080 20 20 20 2f 2a 20 54 68 65 20 47 52 4f 55 50 20     /* The GROUP 
19090 42 59 20 63 6c 61 75 73 65 2e 20 20 4d 61 79 20  BY clause.  May 
190a0 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20 45 78 70  be NULL */.  Exp
190b0 72 20 2a 70 48 61 76 69 6e 67 3b 20 20 20 20 20  r *pHaving;     
190c0 20 20 20 20 2f 2a 20 54 68 65 20 48 41 56 49 4e      /* The HAVIN
190d0 47 20 63 6c 61 75 73 65 2e 20 20 4d 61 79 20 62  G clause.  May b
190e0 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20 69 6e 74 20  e NULL */.  int 
190f0 69 73 44 69 73 74 69 6e 63 74 3b 20 20 20 20 20  isDistinct;     
19100 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 74 68     /* True if th
19110 65 20 44 49 53 54 49 4e 43 54 20 6b 65 79 77 6f  e DISTINCT keywo
19120 72 64 20 69 73 20 70 72 65 73 65 6e 74 20 2a 2f  rd is present */
19130 0a 20 20 69 6e 74 20 64 69 73 74 69 6e 63 74 3b  .  int distinct;
19140 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 61 62            /* Tab
19150 6c 65 20 74 6f 20 75 73 65 20 66 6f 72 20 74 68  le to use for th
19160 65 20 64 69 73 74 69 6e 63 74 20 73 65 74 20 2a  e distinct set *
19170 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20 31 3b 20  /.  int rc = 1; 
19180 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56 61             /* Va
19190 6c 75 65 20 74 6f 20 72 65 74 75 72 6e 20 66 72  lue to return fr
191a0 6f 6d 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  om this function
191b0 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 53 6f   */.  int addrSo
191c0 72 74 49 6e 64 65 78 3b 20 20 20 20 20 2f 2a 20  rtIndex;     /* 
191d0 41 64 64 72 65 73 73 20 6f 66 20 61 6e 20 4f 50  Address of an OP
191e0 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 20 69  _OpenEphemeral i
191f0 6e 73 74 72 75 63 74 69 6f 6e 20 2a 2f 0a 20 20  nstruction */.  
19200 41 67 67 49 6e 66 6f 20 73 41 67 67 49 6e 66 6f  AggInfo sAggInfo
19210 3b 20 20 20 20 20 20 2f 2a 20 49 6e 66 6f 72 6d  ;      /* Inform
19220 61 74 69 6f 6e 20 75 73 65 64 20 62 79 20 61 67  ation used by ag
19230 67 72 65 67 61 74 65 20 71 75 65 72 69 65 73 20  gregate queries 
19240 2a 2f 0a 20 20 69 6e 74 20 69 45 6e 64 3b 20 20  */.  int iEnd;  
19250 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
19260 64 64 72 65 73 73 20 6f 66 20 74 68 65 20 65 6e  ddress of the en
19270 64 20 6f 66 20 74 68 65 20 71 75 65 72 79 20 2a  d of the query *
19280 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b  /.  sqlite3 *db;
19290 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
192a0 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65  e database conne
192b0 63 74 69 6f 6e 20 2a 2f 0a 0a 20 20 64 62 20 3d  ction */..  db =
192c0 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 69   pParse->db;.  i
192d0 66 28 20 70 3d 3d 30 20 7c 7c 20 64 62 2d 3e 6d  f( p==0 || db->m
192e0 61 6c 6c 6f 63 46 61 69 6c 65 64 20 7c 7c 20 70  allocFailed || p
192f0 50 61 72 73 65 2d 3e 6e 45 72 72 20 29 7b 0a 20  Parse->nErr ){. 
19300 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d     return 1;.  }
19310 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 41 75  .  if( sqlite3Au
19320 74 68 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20  thCheck(pParse, 
19330 53 51 4c 49 54 45 5f 53 45 4c 45 43 54 2c 20 30  SQLITE_SELECT, 0
19340 2c 20 30 2c 20 30 29 20 29 20 72 65 74 75 72 6e  , 0, 0) ) return
19350 20 31 3b 0a 20 20 6d 65 6d 73 65 74 28 26 73 41   1;.  memset(&sA
19360 67 67 49 6e 66 6f 2c 20 30 2c 20 73 69 7a 65 6f  ggInfo, 0, sizeo
19370 66 28 73 41 67 67 49 6e 66 6f 29 29 3b 0a 0a 20  f(sAggInfo));.. 
19380 20 70 4f 72 64 65 72 42 79 20 3d 20 70 2d 3e 70   pOrderBy = p->p
19390 4f 72 64 65 72 42 79 3b 0a 20 20 69 66 28 20 49  OrderBy;.  if( I
193a0 67 6e 6f 72 61 62 6c 65 4f 72 64 65 72 62 79 28  gnorableOrderby(
193b0 65 44 65 73 74 29 20 29 7b 0a 20 20 20 20 70 2d  eDest) ){.    p-
193c0 3e 70 4f 72 64 65 72 42 79 20 3d 20 30 3b 0a 20  >pOrderBy = 0;. 
193d0 20 7d 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33   }.  if( sqlite3
193e0 53 65 6c 65 63 74 52 65 73 6f 6c 76 65 28 70 50  SelectResolve(pP
193f0 61 72 73 65 2c 20 70 2c 20 30 29 20 29 7b 0a 20  arse, p, 0) ){. 
19400 20 20 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65     goto select_e
19410 6e 64 3b 0a 20 20 7d 0a 20 20 70 2d 3e 70 4f 72  nd;.  }.  p->pOr
19420 64 65 72 42 79 20 3d 20 70 4f 72 64 65 72 42 79  derBy = pOrderBy
19430 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  ;..#ifndef SQLIT
19440 45 5f 4f 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f  E_OMIT_COMPOUND_
19450 53 45 4c 45 43 54 0a 20 20 2f 2a 20 49 66 20 74  SELECT.  /* If t
19460 68 65 72 65 20 69 73 20 61 72 65 20 61 20 73 65  here is are a se
19470 71 75 65 6e 63 65 20 6f 66 20 71 75 65 72 69 65  quence of querie
19480 73 2c 20 64 6f 20 74 68 65 20 65 61 72 6c 69 65  s, do the earlie
19490 72 20 6f 6e 65 73 20 66 69 72 73 74 2e 0a 20 20  r ones first..  
194a0 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 70 50 72 69  */.  if( p->pPri
194b0 6f 72 20 29 7b 0a 20 20 20 20 69 66 28 20 70 2d  or ){.    if( p-
194c0 3e 70 52 69 67 68 74 6d 6f 73 74 3d 3d 30 20 29  >pRightmost==0 )
194d0 7b 0a 20 20 20 20 20 20 53 65 6c 65 63 74 20 2a  {.      Select *
194e0 70 4c 6f 6f 70 2c 20 2a 70 52 69 67 68 74 20 3d  pLoop, *pRight =
194f0 20 30 3b 0a 20 20 20 20 20 20 69 6e 74 20 63 6e   0;.      int cn
19500 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 66 6f 72  t = 0;.      for
19510 28 70 4c 6f 6f 70 3d 70 3b 20 70 4c 6f 6f 70 3b  (pLoop=p; pLoop;
19520 20 70 4c 6f 6f 70 3d 70 4c 6f 6f 70 2d 3e 70 50   pLoop=pLoop->pP
19530 72 69 6f 72 2c 20 63 6e 74 2b 2b 29 7b 0a 20 20  rior, cnt++){.  
19540 20 20 20 20 20 20 70 4c 6f 6f 70 2d 3e 70 52 69        pLoop->pRi
19550 67 68 74 6d 6f 73 74 20 3d 20 70 3b 0a 20 20 20  ghtmost = p;.   
19560 20 20 20 20 20 70 4c 6f 6f 70 2d 3e 70 4e 65 78       pLoop->pNex
19570 74 20 3d 20 70 52 69 67 68 74 3b 0a 20 20 20 20  t = pRight;.    
19580 20 20 20 20 70 52 69 67 68 74 20 3d 20 70 4c 6f      pRight = pLo
19590 6f 70 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  op;.      }.    
195a0 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4d 41 58    if( SQLITE_MAX
195b0 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45 43 54  _COMPOUND_SELECT
195c0 3e 30 20 26 26 20 63 6e 74 3e 53 51 4c 49 54 45  >0 && cnt>SQLITE
195d0 5f 4d 41 58 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45  _MAX_COMPOUND_SE
195e0 4c 45 43 54 20 29 7b 0a 20 20 20 20 20 20 20 20  LECT ){.        
195f0 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
19600 70 50 61 72 73 65 2c 20 22 74 6f 6f 20 6d 61 6e  pParse, "too man
19610 79 20 74 65 72 6d 73 20 69 6e 20 63 6f 6d 70 6f  y terms in compo
19620 75 6e 64 20 53 45 4c 45 43 54 22 29 3b 0a 20 20  und SELECT");.  
19630 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a        return 1;.
19640 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
19650 20 20 72 65 74 75 72 6e 20 6d 75 6c 74 69 53 65    return multiSe
19660 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70 2c 20  lect(pParse, p, 
19670 65 44 65 73 74 2c 20 69 50 61 72 6d 2c 20 61 66  eDest, iParm, af
19680 66 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a  f);.  }.#endif..
19690 20 20 2f 2a 20 4d 61 6b 65 20 6c 6f 63 61 6c 20    /* Make local 
196a0 63 6f 70 69 65 73 20 6f 66 20 74 68 65 20 70 61  copies of the pa
196b0 72 61 6d 65 74 65 72 73 20 66 6f 72 20 74 68 69  rameters for thi
196c0 73 20 71 75 65 72 79 2e 0a 20 20 2a 2f 0a 20 20  s query..  */.  
196d0 70 54 61 62 4c 69 73 74 20 3d 20 70 2d 3e 70 53  pTabList = p->pS
196e0 72 63 3b 0a 20 20 70 57 68 65 72 65 20 3d 20 70  rc;.  pWhere = p
196f0 2d 3e 70 57 68 65 72 65 3b 0a 20 20 70 47 72 6f  ->pWhere;.  pGro
19700 75 70 42 79 20 3d 20 70 2d 3e 70 47 72 6f 75 70  upBy = p->pGroup
19710 42 79 3b 0a 20 20 70 48 61 76 69 6e 67 20 3d 20  By;.  pHaving = 
19720 70 2d 3e 70 48 61 76 69 6e 67 3b 0a 20 20 69 73  p->pHaving;.  is
19730 41 67 67 20 3d 20 70 2d 3e 69 73 41 67 67 3b 0a  Agg = p->isAgg;.
19740 20 20 69 73 44 69 73 74 69 6e 63 74 20 3d 20 70    isDistinct = p
19750 2d 3e 69 73 44 69 73 74 69 6e 63 74 3b 0a 20 20  ->isDistinct;.  
19760 70 45 4c 69 73 74 20 3d 20 70 2d 3e 70 45 4c 69  pEList = p->pELi
19770 73 74 3b 0a 20 20 69 66 28 20 70 45 4c 69 73 74  st;.  if( pEList
19780 3d 3d 30 20 29 20 67 6f 74 6f 20 73 65 6c 65 63  ==0 ) goto selec
19790 74 5f 65 6e 64 3b 0a 0a 20 20 2f 2a 20 0a 20 20  t_end;..  /* .  
197a0 2a 2a 20 44 6f 20 6e 6f 74 20 65 76 65 6e 20 61  ** Do not even a
197b0 74 74 65 6d 70 74 20 74 6f 20 67 65 6e 65 72 61  ttempt to genera
197c0 74 65 20 61 6e 79 20 63 6f 64 65 20 69 66 20 77  te any code if w
197d0 65 20 68 61 76 65 20 61 6c 72 65 61 64 79 20 73  e have already s
197e0 65 65 6e 0a 20 20 2a 2a 20 65 72 72 6f 72 73 20  een.  ** errors 
197f0 62 65 66 6f 72 65 20 74 68 69 73 20 72 6f 75 74  before this rout
19800 69 6e 65 20 73 74 61 72 74 73 2e 0a 20 20 2a 2f  ine starts..  */
19810 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e  .  if( pParse->n
19820 45 72 72 3e 30 20 29 20 67 6f 74 6f 20 73 65 6c  Err>0 ) goto sel
19830 65 63 74 5f 65 6e 64 3b 0a 0a 20 20 2f 2a 20 49  ect_end;..  /* I
19840 66 20 77 72 69 74 69 6e 67 20 74 6f 20 6d 65 6d  f writing to mem
19850 6f 72 79 20 6f 72 20 67 65 6e 65 72 61 74 69 6e  ory or generatin
19860 67 20 61 20 73 65 74 0a 20 20 2a 2a 20 6f 6e 6c  g a set.  ** onl
19870 79 20 61 20 73 69 6e 67 6c 65 20 63 6f 6c 75 6d  y a single colum
19880 6e 20 6d 61 79 20 62 65 20 6f 75 74 70 75 74 2e  n may be output.
19890 0a 20 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51  .  */.#ifndef SQ
198a0 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45  LITE_OMIT_SUBQUE
198b0 52 59 0a 20 20 69 66 28 20 63 68 65 63 6b 46 6f  RY.  if( checkFo
198c0 72 4d 75 6c 74 69 43 6f 6c 75 6d 6e 53 65 6c 65  rMultiColumnSele
198d0 63 74 45 72 72 6f 72 28 70 50 61 72 73 65 2c 20  ctError(pParse, 
198e0 65 44 65 73 74 2c 20 70 45 4c 69 73 74 2d 3e 6e  eDest, pEList->n
198f0 45 78 70 72 29 20 29 7b 0a 20 20 20 20 67 6f 74  Expr) ){.    got
19900 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20  o select_end;.  
19910 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 4f  }.#endif..  /* O
19920 52 44 45 52 20 42 59 20 69 73 20 69 67 6e 6f 72  RDER BY is ignor
19930 65 64 20 66 6f 72 20 73 6f 6d 65 20 64 65 73 74  ed for some dest
19940 69 6e 61 74 69 6f 6e 73 2e 0a 20 20 2a 2f 0a 20  inations..  */. 
19950 20 69 66 28 20 49 67 6e 6f 72 61 62 6c 65 4f 72   if( IgnorableOr
19960 64 65 72 62 79 28 65 44 65 73 74 29 20 29 7b 0a  derby(eDest) ){.
19970 20 20 20 20 70 4f 72 64 65 72 42 79 20 3d 20 30      pOrderBy = 0
19980 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 42 65 67 69  ;.  }..  /* Begi
19990 6e 20 67 65 6e 65 72 61 74 69 6e 67 20 63 6f 64  n generating cod
199a0 65 2e 0a 20 20 2a 2f 0a 20 20 76 20 3d 20 73 71  e..  */.  v = sq
199b0 6c 69 74 65 33 47 65 74 56 64 62 65 28 70 50 61  lite3GetVdbe(pPa
199c0 72 73 65 29 3b 0a 20 20 69 66 28 20 76 3d 3d 30  rse);.  if( v==0
199d0 20 29 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65   ) goto select_e
199e0 6e 64 3b 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61  nd;..  /* Genera
199f0 74 65 20 63 6f 64 65 20 66 6f 72 20 61 6c 6c 20  te code for all 
19a00 73 75 62 2d 71 75 65 72 69 65 73 20 69 6e 20 74  sub-queries in t
19a10 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 0a 20  he FROM clause. 
19a20 20 2a 2f 0a 23 69 66 20 21 64 65 66 69 6e 65 64   */.#if !defined
19a30 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42  (SQLITE_OMIT_SUB
19a40 51 55 45 52 59 29 20 7c 7c 20 21 64 65 66 69 6e  QUERY) || !defin
19a50 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56  ed(SQLITE_OMIT_V
19a60 49 45 57 29 0a 20 20 66 6f 72 28 69 3d 30 3b 20  IEW).  for(i=0; 
19a70 69 3c 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63  i<pTabList->nSrc
19a80 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 63 6f 6e 73  ; i++){.    cons
19a90 74 20 63 68 61 72 20 2a 7a 53 61 76 65 64 41 75  t char *zSavedAu
19aa0 74 68 43 6f 6e 74 65 78 74 20 3d 20 30 3b 0a 20  thContext = 0;. 
19ab0 20 20 20 69 6e 74 20 6e 65 65 64 52 65 73 74 6f     int needResto
19ac0 72 65 43 6f 6e 74 65 78 74 3b 0a 20 20 20 20 73  reContext;.    s
19ad0 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74  truct SrcList_it
19ae0 65 6d 20 2a 70 49 74 65 6d 20 3d 20 26 70 54 61  em *pItem = &pTa
19af0 62 4c 69 73 74 2d 3e 61 5b 69 5d 3b 0a 0a 20 20  bList->a[i];..  
19b00 20 20 69 66 28 20 70 49 74 65 6d 2d 3e 70 53 65    if( pItem->pSe
19b10 6c 65 63 74 3d 3d 30 20 7c 7c 20 70 49 74 65 6d  lect==0 || pItem
19b20 2d 3e 69 73 50 6f 70 75 6c 61 74 65 64 20 29 20  ->isPopulated ) 
19b30 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69 66  continue;.    if
19b40 28 20 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65 21 3d  ( pItem->zName!=
19b50 30 20 29 7b 0a 20 20 20 20 20 20 7a 53 61 76 65  0 ){.      zSave
19b60 64 41 75 74 68 43 6f 6e 74 65 78 74 20 3d 20 70  dAuthContext = p
19b70 50 61 72 73 65 2d 3e 7a 41 75 74 68 43 6f 6e 74  Parse->zAuthCont
19b80 65 78 74 3b 0a 20 20 20 20 20 20 70 50 61 72 73  ext;.      pPars
19b90 65 2d 3e 7a 41 75 74 68 43 6f 6e 74 65 78 74 20  e->zAuthContext 
19ba0 3d 20 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65 3b 0a  = pItem->zName;.
19bb0 20 20 20 20 20 20 6e 65 65 64 52 65 73 74 6f 72        needRestor
19bc0 65 43 6f 6e 74 65 78 74 20 3d 20 31 3b 0a 20 20  eContext = 1;.  
19bd0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 6e    }else{.      n
19be0 65 65 64 52 65 73 74 6f 72 65 43 6f 6e 74 65 78  eedRestoreContex
19bf0 74 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 23 69 66  t = 0;.    }.#if
19c00 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f   defined(SQLITE_
19c10 54 45 53 54 29 20 7c 7c 20 53 51 4c 49 54 45 5f  TEST) || SQLITE_
19c20 4d 41 58 5f 45 58 50 52 5f 44 45 50 54 48 3e 30  MAX_EXPR_DEPTH>0
19c30 0a 20 20 20 20 2f 2a 20 49 6e 63 72 65 6d 65 6e  .    /* Incremen
19c40 74 20 50 61 72 73 65 2e 6e 48 65 69 67 68 74 20  t Parse.nHeight 
19c50 62 79 20 74 68 65 20 68 65 69 67 68 74 20 6f 66  by the height of
19c60 20 74 68 65 20 6c 61 72 67 65 73 74 20 65 78 70   the largest exp
19c70 72 65 73 73 69 6f 6e 0a 20 20 20 20 2a 2a 20 74  ression.    ** t
19c80 72 65 65 20 72 65 66 65 72 65 64 20 74 6f 20 62  ree refered to b
19c90 79 20 74 68 69 73 2c 20 74 68 65 20 70 61 72 65  y this, the pare
19ca0 6e 74 20 73 65 6c 65 63 74 2e 20 54 68 65 20 63  nt select. The c
19cb0 68 69 6c 64 20 73 65 6c 65 63 74 0a 20 20 20 20  hild select.    
19cc0 2a 2a 20 6d 61 79 20 63 6f 6e 74 61 69 6e 20 65  ** may contain e
19cd0 78 70 72 65 73 73 69 6f 6e 20 74 72 65 65 73 20  xpression trees 
19ce0 6f 66 20 61 74 20 6d 6f 73 74 0a 20 20 20 20 2a  of at most.    *
19cf0 2a 20 28 53 51 4c 49 54 45 5f 4d 41 58 5f 45 58  * (SQLITE_MAX_EX
19d00 50 52 5f 44 45 50 54 48 2d 50 61 72 73 65 2e 6e  PR_DEPTH-Parse.n
19d10 48 65 69 67 68 74 29 20 68 65 69 67 68 74 2e 20  Height) height. 
19d20 54 68 69 73 20 69 73 20 61 20 62 69 74 0a 20 20  This is a bit.  
19d30 20 20 2a 2a 20 6d 6f 72 65 20 63 6f 6e 73 65 72    ** more conser
19d40 76 61 74 69 76 65 20 74 68 61 6e 20 6e 65 63 65  vative than nece
19d50 73 73 61 72 79 2c 20 62 75 74 20 6d 75 63 68 20  ssary, but much 
19d60 65 61 73 69 65 72 20 74 68 61 6e 20 65 6e 66 6f  easier than enfo
19d70 72 63 69 6e 67 0a 20 20 20 20 2a 2a 20 61 6e 20  rcing.    ** an 
19d80 65 78 61 63 74 20 6c 69 6d 69 74 2e 0a 20 20 20  exact limit..   
19d90 20 2a 2f 0a 20 20 20 20 70 50 61 72 73 65 2d 3e   */.    pParse->
19da0 6e 48 65 69 67 68 74 20 2b 3d 20 73 71 6c 69 74  nHeight += sqlit
19db0 65 33 53 65 6c 65 63 74 45 78 70 72 48 65 69 67  e3SelectExprHeig
19dc0 68 74 28 70 29 3b 0a 23 65 6e 64 69 66 0a 20 20  ht(p);.#endif.  
19dd0 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28    sqlite3Select(
19de0 70 50 61 72 73 65 2c 20 70 49 74 65 6d 2d 3e 70  pParse, pItem->p
19df0 53 65 6c 65 63 74 2c 20 53 52 54 5f 45 70 68 65  Select, SRT_Ephe
19e00 6d 54 61 62 2c 20 0a 20 20 20 20 20 20 20 20 20  mTab, .         
19e10 20 20 20 20 20 20 20 20 70 49 74 65 6d 2d 3e 69          pItem->i
19e20 43 75 72 73 6f 72 2c 20 70 2c 20 69 2c 20 26 69  Cursor, p, i, &i
19e30 73 41 67 67 2c 20 30 29 3b 0a 20 20 20 20 69 66  sAgg, 0);.    if
19e40 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ( db->mallocFail
19e50 65 64 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f  ed ){.      goto
19e60 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20   select_end;.   
19e70 20 7d 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53   }.#if defined(S
19e80 51 4c 49 54 45 5f 54 45 53 54 29 20 7c 7c 20 53  QLITE_TEST) || S
19e90 51 4c 49 54 45 5f 4d 41 58 5f 45 58 50 52 5f 44  QLITE_MAX_EXPR_D
19ea0 45 50 54 48 3e 30 0a 20 20 20 20 70 50 61 72 73  EPTH>0.    pPars
19eb0 65 2d 3e 6e 48 65 69 67 68 74 20 2d 3d 20 73 71  e->nHeight -= sq
19ec0 6c 69 74 65 33 53 65 6c 65 63 74 45 78 70 72 48  lite3SelectExprH
19ed0 65 69 67 68 74 28 70 29 3b 0a 23 65 6e 64 69 66  eight(p);.#endif
19ee0 0a 20 20 20 20 69 66 28 20 6e 65 65 64 52 65 73  .    if( needRes
19ef0 74 6f 72 65 43 6f 6e 74 65 78 74 20 29 7b 0a 20  toreContext ){. 
19f00 20 20 20 20 20 70 50 61 72 73 65 2d 3e 7a 41 75       pParse->zAu
19f10 74 68 43 6f 6e 74 65 78 74 20 3d 20 7a 53 61 76  thContext = zSav
19f20 65 64 41 75 74 68 43 6f 6e 74 65 78 74 3b 0a 20  edAuthContext;. 
19f30 20 20 20 7d 0a 20 20 20 20 70 54 61 62 4c 69 73     }.    pTabLis
19f40 74 20 3d 20 70 2d 3e 70 53 72 63 3b 0a 20 20 20  t = p->pSrc;.   
19f50 20 70 57 68 65 72 65 20 3d 20 70 2d 3e 70 57 68   pWhere = p->pWh
19f60 65 72 65 3b 0a 20 20 20 20 69 66 28 20 21 49 67  ere;.    if( !Ig
19f70 6e 6f 72 61 62 6c 65 4f 72 64 65 72 62 79 28 65  norableOrderby(e
19f80 44 65 73 74 29 20 29 7b 0a 20 20 20 20 20 20 70  Dest) ){.      p
19f90 4f 72 64 65 72 42 79 20 3d 20 70 2d 3e 70 4f 72  OrderBy = p->pOr
19fa0 64 65 72 42 79 3b 0a 20 20 20 20 7d 0a 20 20 20  derBy;.    }.   
19fb0 20 70 47 72 6f 75 70 42 79 20 3d 20 70 2d 3e 70   pGroupBy = p->p
19fc0 47 72 6f 75 70 42 79 3b 0a 20 20 20 20 70 48 61  GroupBy;.    pHa
19fd0 76 69 6e 67 20 3d 20 70 2d 3e 70 48 61 76 69 6e  ving = p->pHavin
19fe0 67 3b 0a 20 20 20 20 69 73 44 69 73 74 69 6e 63  g;.    isDistinc
19ff0 74 20 3d 20 70 2d 3e 69 73 44 69 73 74 69 6e 63  t = p->isDistinc
1a000 74 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20  t;.  }.#endif.. 
1a010 20 2f 2a 20 43 68 65 63 6b 20 66 6f 72 20 74 68   /* Check for th
1a020 65 20 73 70 65 63 69 61 6c 20 63 61 73 65 20 6f  e special case o
1a030 66 20 61 20 6d 69 6e 28 29 20 6f 72 20 6d 61 78  f a min() or max
1a040 28 29 20 66 75 6e 63 74 69 6f 6e 20 62 79 20 69  () function by i
1a050 74 73 65 6c 66 0a 20 20 2a 2a 20 69 6e 20 74 68  tself.  ** in th
1a060 65 20 72 65 73 75 6c 74 20 73 65 74 2e 0a 20 20  e result set..  
1a070 2a 2f 0a 20 20 69 66 28 20 73 69 6d 70 6c 65 4d  */.  if( simpleM
1a080 69 6e 4d 61 78 51 75 65 72 79 28 70 50 61 72 73  inMaxQuery(pPars
1a090 65 2c 20 70 2c 20 65 44 65 73 74 2c 20 69 50 61  e, p, eDest, iPa
1a0a0 72 6d 29 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  rm) ){.    rc = 
1a0b0 30 3b 0a 20 20 20 20 67 6f 74 6f 20 73 65 6c 65  0;.    goto sele
1a0c0 63 74 5f 65 6e 64 3b 0a 20 20 7d 0a 0a 20 20 2f  ct_end;.  }..  /
1a0d0 2a 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69  * Check to see i
1a0e0 66 20 74 68 69 73 20 69 73 20 61 20 73 75 62 71  f this is a subq
1a0f0 75 65 72 79 20 74 68 61 74 20 63 61 6e 20 62 65  uery that can be
1a100 20 22 66 6c 61 74 74 65 6e 65 64 22 20 69 6e 74   "flattened" int
1a110 6f 20 69 74 73 20 70 61 72 65 6e 74 2e 0a 20 20  o its parent..  
1a120 2a 2a 20 49 66 20 66 6c 61 74 74 65 6e 69 6e 67  ** If flattening
1a130 20 69 73 20 61 20 70 6f 73 73 69 62 6c 69 74 79   is a possiblity
1a140 2c 20 64 6f 20 73 6f 20 61 6e 64 20 72 65 74 75  , do so and retu
1a150 72 6e 20 69 6d 6d 65 64 69 61 74 65 6c 79 2e 20  rn immediately. 
1a160 20 0a 20 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53   .  */.#ifndef S
1a170 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 0a  QLITE_OMIT_VIEW.
1a180 20 20 69 66 28 20 70 50 61 72 65 6e 74 20 26 26    if( pParent &&
1a190 20 70 50 61 72 65 6e 74 41 67 67 20 26 26 0a 20   pParentAgg &&. 
1a1a0 20 20 20 20 20 66 6c 61 74 74 65 6e 53 75 62 71       flattenSubq
1a1b0 75 65 72 79 28 64 62 2c 20 70 50 61 72 65 6e 74  uery(db, pParent
1a1c0 2c 20 70 61 72 65 6e 74 54 61 62 2c 20 2a 70 50  , parentTab, *pP
1a1d0 61 72 65 6e 74 41 67 67 2c 20 69 73 41 67 67 29  arentAgg, isAgg)
1a1e0 20 29 7b 0a 20 20 20 20 69 66 28 20 69 73 41 67   ){.    if( isAg
1a1f0 67 20 29 20 2a 70 50 61 72 65 6e 74 41 67 67 20  g ) *pParentAgg 
1a200 3d 20 31 3b 0a 20 20 20 20 67 6f 74 6f 20 73 65  = 1;.    goto se
1a210 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 7d 0a 23 65  lect_end;.  }.#e
1a220 6e 64 69 66 0a 0a 20 20 2f 2a 20 49 66 20 70 6f  ndif..  /* If po
1a230 73 73 69 62 6c 65 2c 20 72 65 77 72 69 74 65 20  ssible, rewrite 
1a240 74 68 65 20 71 75 65 72 79 20 74 6f 20 75 73 65  the query to use
1a250 20 47 52 4f 55 50 20 42 59 20 69 6e 73 74 65 61   GROUP BY instea
1a260 64 20 6f 66 20 44 49 53 54 49 4e 43 54 2e 0a 20  d of DISTINCT.. 
1a270 20 2a 2a 20 47 52 4f 55 50 20 42 59 20 6d 61 79   ** GROUP BY may
1a280 20 75 73 65 20 61 6e 20 69 6e 64 65 78 2c 20 44   use an index, D
1a290 49 53 54 49 4e 43 54 20 6e 65 76 65 72 20 64 6f  ISTINCT never do
1a2a0 65 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  es..  */.  if( p
1a2b0 2d 3e 69 73 44 69 73 74 69 6e 63 74 20 26 26 20  ->isDistinct && 
1a2c0 21 70 2d 3e 69 73 41 67 67 20 26 26 20 21 70 2d  !p->isAgg && !p-
1a2d0 3e 70 47 72 6f 75 70 42 79 20 29 7b 0a 20 20 20  >pGroupBy ){.   
1a2e0 20 70 2d 3e 70 47 72 6f 75 70 42 79 20 3d 20 73   p->pGroupBy = s
1a2f0 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 75  qlite3ExprListDu
1a300 70 28 64 62 2c 20 70 2d 3e 70 45 4c 69 73 74 29  p(db, p->pEList)
1a310 3b 0a 20 20 20 20 70 47 72 6f 75 70 42 79 20 3d  ;.    pGroupBy =
1a320 20 70 2d 3e 70 47 72 6f 75 70 42 79 3b 0a 20 20   p->pGroupBy;.  
1a330 20 20 70 2d 3e 69 73 44 69 73 74 69 6e 63 74 20    p->isDistinct 
1a340 3d 20 30 3b 0a 20 20 20 20 69 73 44 69 73 74 69  = 0;.    isDisti
1a350 6e 63 74 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20  nct = 0;.  }..  
1a360 2f 2a 20 49 66 20 74 68 65 72 65 20 69 73 20 61  /* If there is a
1a370 6e 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73  n ORDER BY claus
1a380 65 2c 20 74 68 65 6e 20 74 68 69 73 20 73 6f 72  e, then this sor
1a390 74 69 6e 67 0a 20 20 2a 2a 20 69 6e 64 65 78 20  ting.  ** index 
1a3a0 6d 69 67 68 74 20 65 6e 64 20 75 70 20 62 65 69  might end up bei
1a3b0 6e 67 20 75 6e 75 73 65 64 20 69 66 20 74 68 65  ng unused if the
1a3c0 20 64 61 74 61 20 63 61 6e 20 62 65 20 0a 20 20   data can be .  
1a3d0 2a 2a 20 65 78 74 72 61 63 74 65 64 20 69 6e 20  ** extracted in 
1a3e0 70 72 65 2d 73 6f 72 74 65 64 20 6f 72 64 65 72  pre-sorted order
1a3f0 2e 20 20 49 66 20 74 68 61 74 20 69 73 20 74 68  .  If that is th
1a400 65 20 63 61 73 65 2c 20 74 68 65 6e 20 74 68 65  e case, then the
1a410 0a 20 20 2a 2a 20 4f 50 5f 4f 70 65 6e 45 70 68  .  ** OP_OpenEph
1a420 65 6d 65 72 61 6c 20 69 6e 73 74 72 75 63 74 69  emeral instructi
1a430 6f 6e 20 77 69 6c 6c 20 62 65 20 63 68 61 6e 67  on will be chang
1a440 65 64 20 74 6f 20 61 6e 20 4f 50 5f 4e 6f 6f 70  ed to an OP_Noop
1a450 20 6f 6e 63 65 0a 20 20 2a 2a 20 77 65 20 66 69   once.  ** we fi
1a460 67 75 72 65 20 6f 75 74 20 74 68 61 74 20 74 68  gure out that th
1a470 65 20 73 6f 72 74 69 6e 67 20 69 6e 64 65 78 20  e sorting index 
1a480 69 73 20 6e 6f 74 20 6e 65 65 64 65 64 2e 20 20  is not needed.  
1a490 54 68 65 20 61 64 64 72 53 6f 72 74 49 6e 64 65  The addrSortInde
1a4a0 78 0a 20 20 2a 2a 20 76 61 72 69 61 62 6c 65 20  x.  ** variable 
1a4b0 69 73 20 75 73 65 64 20 74 6f 20 66 61 63 69 6c  is used to facil
1a4c0 69 74 61 74 65 20 74 68 61 74 20 63 68 61 6e 67  itate that chang
1a4d0 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 4f  e..  */.  if( pO
1a4e0 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20 4b 65  rderBy ){.    Ke
1a4f0 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 3b  yInfo *pKeyInfo;
1a500 0a 20 20 20 20 69 66 28 20 70 50 61 72 73 65 2d  .    if( pParse-
1a510 3e 6e 45 72 72 20 29 7b 0a 20 20 20 20 20 20 67  >nErr ){.      g
1a520 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a  oto select_end;.
1a530 20 20 20 20 7d 0a 20 20 20 20 70 4b 65 79 49 6e      }.    pKeyIn
1a540 66 6f 20 3d 20 6b 65 79 49 6e 66 6f 46 72 6f 6d  fo = keyInfoFrom
1a550 45 78 70 72 4c 69 73 74 28 70 50 61 72 73 65 2c  ExprList(pParse,
1a560 20 70 4f 72 64 65 72 42 79 29 3b 0a 20 20 20 20   pOrderBy);.    
1a570 70 4f 72 64 65 72 42 79 2d 3e 69 45 43 75 72 73  pOrderBy->iECurs
1a580 6f 72 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61  or = pParse->nTa
1a590 62 2b 2b 3b 0a 20 20 20 20 70 2d 3e 61 64 64 72  b++;.    p->addr
1a5a0 4f 70 65 6e 45 70 68 6d 5b 32 5d 20 3d 20 61 64  OpenEphm[2] = ad
1a5b0 64 72 53 6f 72 74 49 6e 64 65 78 20 3d 0a 20 20  drSortIndex =.  
1a5c0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4f      sqlite3VdbeO
1a5d0 70 33 28 76 2c 20 4f 50 5f 4f 70 65 6e 45 70 68  p3(v, OP_OpenEph
1a5e0 65 6d 65 72 61 6c 2c 20 70 4f 72 64 65 72 42 79  emeral, pOrderBy
1a5f0 2d 3e 69 45 43 75 72 73 6f 72 2c 20 70 4f 72 64  ->iECursor, pOrd
1a600 65 72 42 79 2d 3e 6e 45 78 70 72 2b 32 2c 20 20  erBy->nExpr+2,  
1a610 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a620 20 20 20 28 63 68 61 72 2a 29 70 4b 65 79 49 6e     (char*)pKeyIn
1a630 66 6f 2c 20 50 33 5f 4b 45 59 49 4e 46 4f 5f 48  fo, P3_KEYINFO_H
1a640 41 4e 44 4f 46 46 29 3b 0a 20 20 7d 65 6c 73 65  ANDOFF);.  }else
1a650 7b 0a 20 20 20 20 61 64 64 72 53 6f 72 74 49 6e  {.    addrSortIn
1a660 64 65 78 20 3d 20 2d 31 3b 0a 20 20 7d 0a 0a 20  dex = -1;.  }.. 
1a670 20 2f 2a 20 49 66 20 74 68 65 20 6f 75 74 70 75   /* If the outpu
1a680 74 20 69 73 20 64 65 73 74 69 6e 65 64 20 66 6f  t is destined fo
1a690 72 20 61 20 74 65 6d 70 6f 72 61 72 79 20 74 61  r a temporary ta
1a6a0 62 6c 65 2c 20 6f 70 65 6e 20 74 68 61 74 20 74  ble, open that t
1a6b0 61 62 6c 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  able..  */.  if(
1a6c0 20 65 44 65 73 74 3d 3d 53 52 54 5f 45 70 68 65   eDest==SRT_Ephe
1a6d0 6d 54 61 62 20 29 7b 0a 20 20 20 20 73 71 6c 69  mTab ){.    sqli
1a6e0 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
1a6f0 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c  OP_OpenEphemeral
1a700 2c 20 69 50 61 72 6d 2c 20 70 45 4c 69 73 74 2d  , iParm, pEList-
1a710 3e 6e 45 78 70 72 29 3b 0a 20 20 7d 0a 0a 20 20  >nExpr);.  }..  
1a720 2f 2a 20 53 65 74 20 74 68 65 20 6c 69 6d 69 74  /* Set the limit
1a730 65 72 2e 0a 20 20 2a 2f 0a 20 20 69 45 6e 64 20  er..  */.  iEnd 
1a740 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b  = sqlite3VdbeMak
1a750 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 63 6f 6d  eLabel(v);.  com
1a760 70 75 74 65 4c 69 6d 69 74 52 65 67 69 73 74 65  puteLimitRegiste
1a770 72 73 28 70 50 61 72 73 65 2c 20 70 2c 20 69 45  rs(pParse, p, iE
1a780 6e 64 29 3b 0a 0a 20 20 2f 2a 20 4f 70 65 6e 20  nd);..  /* Open 
1a790 61 20 76 69 72 74 75 61 6c 20 69 6e 64 65 78 20  a virtual index 
1a7a0 74 6f 20 75 73 65 20 66 6f 72 20 74 68 65 20 64  to use for the d
1a7b0 69 73 74 69 6e 63 74 20 73 65 74 2e 0a 20 20 2a  istinct set..  *
1a7c0 2f 0a 20 20 69 66 28 20 69 73 44 69 73 74 69 6e  /.  if( isDistin
1a7d0 63 74 20 29 7b 0a 20 20 20 20 4b 65 79 49 6e 66  ct ){.    KeyInf
1a7e0 6f 20 2a 70 4b 65 79 49 6e 66 6f 3b 0a 20 20 20  o *pKeyInfo;.   
1a7f0 20 61 73 73 65 72 74 28 20 69 73 41 67 67 20 7c   assert( isAgg |
1a800 7c 20 70 47 72 6f 75 70 42 79 20 29 3b 0a 20 20  | pGroupBy );.  
1a810 20 20 64 69 73 74 69 6e 63 74 20 3d 20 70 50 61    distinct = pPa
1a820 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20  rse->nTab++;.   
1a830 20 70 4b 65 79 49 6e 66 6f 20 3d 20 6b 65 79 49   pKeyInfo = keyI
1a840 6e 66 6f 46 72 6f 6d 45 78 70 72 4c 69 73 74 28  nfoFromExprList(
1a850 70 50 61 72 73 65 2c 20 70 2d 3e 70 45 4c 69 73  pParse, p->pELis
1a860 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  t);.    sqlite3V
1a870 64 62 65 4f 70 33 28 76 2c 20 4f 50 5f 4f 70 65  dbeOp3(v, OP_Ope
1a880 6e 45 70 68 65 6d 65 72 61 6c 2c 20 64 69 73 74  nEphemeral, dist
1a890 69 6e 63 74 2c 20 30 2c 20 0a 20 20 20 20 20 20  inct, 0, .      
1a8a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a8b0 20 20 28 63 68 61 72 2a 29 70 4b 65 79 49 6e 66    (char*)pKeyInf
1a8c0 6f 2c 20 50 33 5f 4b 45 59 49 4e 46 4f 5f 48 41  o, P3_KEYINFO_HA
1a8d0 4e 44 4f 46 46 29 3b 0a 20 20 7d 65 6c 73 65 7b  NDOFF);.  }else{
1a8e0 0a 20 20 20 20 64 69 73 74 69 6e 63 74 20 3d 20  .    distinct = 
1a8f0 2d 31 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 67  -1;.  }..  /* Ag
1a900 67 72 65 67 61 74 65 20 61 6e 64 20 6e 6f 6e 2d  gregate and non-
1a910 61 67 67 72 65 67 61 74 65 20 71 75 65 72 69 65  aggregate querie
1a920 73 20 61 72 65 20 68 61 6e 64 6c 65 64 20 64 69  s are handled di
1a930 66 66 65 72 65 6e 74 6c 79 20 2a 2f 0a 20 20 69  fferently */.  i
1a940 66 28 20 21 69 73 41 67 67 20 26 26 20 70 47 72  f( !isAgg && pGr
1a950 6f 75 70 42 79 3d 3d 30 20 29 7b 0a 20 20 20 20  oupBy==0 ){.    
1a960 2f 2a 20 54 68 69 73 20 63 61 73 65 20 69 73 20  /* This case is 
1a970 66 6f 72 20 6e 6f 6e 2d 61 67 67 72 65 67 61 74  for non-aggregat
1a980 65 20 71 75 65 72 69 65 73 0a 20 20 20 20 2a 2a  e queries.    **
1a990 20 42 65 67 69 6e 20 74 68 65 20 64 61 74 61 62   Begin the datab
1a9a0 61 73 65 20 73 63 61 6e 0a 20 20 20 20 2a 2f 0a  ase scan.    */.
1a9b0 20 20 20 20 70 57 49 6e 66 6f 20 3d 20 73 71 6c      pWInfo = sql
1a9c0 69 74 65 33 57 68 65 72 65 42 65 67 69 6e 28 70  ite3WhereBegin(p
1a9d0 50 61 72 73 65 2c 20 70 54 61 62 4c 69 73 74 2c  Parse, pTabList,
1a9e0 20 70 57 68 65 72 65 2c 20 26 70 4f 72 64 65 72   pWhere, &pOrder
1a9f0 42 79 29 3b 0a 20 20 20 20 69 66 28 20 70 57 49  By);.    if( pWI
1aa00 6e 66 6f 3d 3d 30 20 29 20 67 6f 74 6f 20 73 65  nfo==0 ) goto se
1aa10 6c 65 63 74 5f 65 6e 64 3b 0a 0a 20 20 20 20 2f  lect_end;..    /
1aa20 2a 20 49 66 20 73 6f 72 74 69 6e 67 20 69 6e 64  * If sorting ind
1aa30 65 78 20 74 68 61 74 20 77 61 73 20 63 72 65 61  ex that was crea
1aa40 74 65 64 20 62 79 20 61 20 70 72 69 6f 72 20 4f  ted by a prior O
1aa50 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 20  P_OpenEphemeral 
1aa60 0a 20 20 20 20 2a 2a 20 69 6e 73 74 72 75 63 74  .    ** instruct
1aa70 69 6f 6e 20 65 6e 64 65 64 20 75 70 20 6e 6f 74  ion ended up not
1aa80 20 62 65 69 6e 67 20 6e 65 65 64 65 64 2c 20 74   being needed, t
1aa90 68 65 6e 20 63 68 61 6e 67 65 20 74 68 65 20 4f  hen change the O
1aaa0 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 0a  P_OpenEphemeral.
1aab0 20 20 20 20 2a 2a 20 69 6e 74 6f 20 61 6e 20 4f      ** into an O
1aac0 50 5f 4e 6f 6f 70 2e 0a 20 20 20 20 2a 2f 0a 20  P_Noop..    */. 
1aad0 20 20 20 69 66 28 20 61 64 64 72 53 6f 72 74 49     if( addrSortI
1aae0 6e 64 65 78 3e 3d 30 20 26 26 20 70 4f 72 64 65  ndex>=0 && pOrde
1aaf0 72 42 79 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  rBy==0 ){.      
1ab00 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67  sqlite3VdbeChang
1ab10 65 54 6f 4e 6f 6f 70 28 76 2c 20 61 64 64 72 53  eToNoop(v, addrS
1ab20 6f 72 74 49 6e 64 65 78 2c 20 31 29 3b 0a 20 20  ortIndex, 1);.  
1ab30 20 20 20 20 70 2d 3e 61 64 64 72 4f 70 65 6e 45      p->addrOpenE
1ab40 70 68 6d 5b 32 5d 20 3d 20 2d 31 3b 0a 20 20 20  phm[2] = -1;.   
1ab50 20 7d 0a 0a 20 20 20 20 2f 2a 20 55 73 65 20 74   }..    /* Use t
1ab60 68 65 20 73 74 61 6e 64 61 72 64 20 69 6e 6e 65  he standard inne
1ab70 72 20 6c 6f 6f 70 0a 20 20 20 20 2a 2f 0a 20 20  r loop.    */.  
1ab80 20 20 61 73 73 65 72 74 28 21 69 73 44 69 73 74    assert(!isDist
1ab90 69 6e 63 74 29 3b 0a 20 20 20 20 69 66 28 20 73  inct);.    if( s
1aba0 65 6c 65 63 74 49 6e 6e 65 72 4c 6f 6f 70 28 70  electInnerLoop(p
1abb0 50 61 72 73 65 2c 20 70 2c 20 70 45 4c 69 73 74  Parse, p, pEList
1abc0 2c 20 30 2c 20 30 2c 20 70 4f 72 64 65 72 42 79  , 0, 0, pOrderBy
1abd0 2c 20 2d 31 2c 20 65 44 65 73 74 2c 0a 20 20 20  , -1, eDest,.   
1abe0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1abf0 20 69 50 61 72 6d 2c 20 70 57 49 6e 66 6f 2d 3e   iParm, pWInfo->
1ac00 69 43 6f 6e 74 69 6e 75 65 2c 20 70 57 49 6e 66  iContinue, pWInf
1ac10 6f 2d 3e 69 42 72 65 61 6b 2c 20 61 66 66 29 20  o->iBreak, aff) 
1ac20 29 7b 0a 20 20 20 20 20 20 20 67 6f 74 6f 20 73  ){.       goto s
1ac30 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 7d  elect_end;.    }
1ac40 0a 0a 20 20 20 20 2f 2a 20 45 6e 64 20 74 68 65  ..    /* End the
1ac50 20 64 61 74 61 62 61 73 65 20 73 63 61 6e 20 6c   database scan l
1ac60 6f 6f 70 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  oop..    */.    
1ac70 73 71 6c 69 74 65 33 57 68 65 72 65 45 6e 64 28  sqlite3WhereEnd(
1ac80 70 57 49 6e 66 6f 29 3b 0a 20 20 7d 65 6c 73 65  pWInfo);.  }else
1ac90 7b 0a 20 20 20 20 2f 2a 20 54 68 69 73 20 69 73  {.    /* This is
1aca0 20 74 68 65 20 70 72 6f 63 65 73 73 69 6e 67 20   the processing 
1acb0 66 6f 72 20 61 67 67 72 65 67 61 74 65 20 71 75  for aggregate qu
1acc0 65 72 69 65 73 20 2a 2f 0a 20 20 20 20 4e 61 6d  eries */.    Nam
1acd0 65 43 6f 6e 74 65 78 74 20 73 4e 43 3b 20 20 20  eContext sNC;   
1ace0 20 2f 2a 20 4e 61 6d 65 20 63 6f 6e 74 65 78 74   /* Name context
1acf0 20 66 6f 72 20 70 72 6f 63 65 73 73 69 6e 67 20   for processing 
1ad00 61 67 67 72 65 67 61 74 65 20 69 6e 66 6f 72 6d  aggregate inform
1ad10 61 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 69 6e 74  ation */.    int
1ad20 20 69 41 4d 65 6d 3b 20 20 20 20 20 20 20 20 20   iAMem;         
1ad30 20 2f 2a 20 46 69 72 73 74 20 4d 65 6d 20 61 64   /* First Mem ad
1ad40 64 72 65 73 73 20 66 6f 72 20 73 74 6f 72 69 6e  dress for storin
1ad50 67 20 63 75 72 72 65 6e 74 20 47 52 4f 55 50 20  g current GROUP 
1ad60 42 59 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 42  BY */.    int iB
1ad70 4d 65 6d 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  Mem;          /*
1ad80 20 46 69 72 73 74 20 4d 65 6d 20 61 64 64 72 65   First Mem addre
1ad90 73 73 20 66 6f 72 20 70 72 65 76 69 6f 75 73 20  ss for previous 
1ada0 47 52 4f 55 50 20 42 59 20 2a 2f 0a 20 20 20 20  GROUP BY */.    
1adb0 69 6e 74 20 69 55 73 65 46 6c 61 67 3b 20 20 20  int iUseFlag;   
1adc0 20 20 20 20 2f 2a 20 4d 65 6d 20 61 64 64 72 65      /* Mem addre
1add0 73 73 20 68 6f 6c 64 69 6e 67 20 66 6c 61 67 20  ss holding flag 
1ade0 69 6e 64 69 63 61 74 69 6e 67 20 74 68 61 74 20  indicating that 
1adf0 61 74 20 6c 65 61 73 74 0a 20 20 20 20 20 20 20  at least.       
1ae00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ae10 20 2a 2a 20 6f 6e 65 20 72 6f 77 20 6f 66 20 74   ** one row of t
1ae20 68 65 20 69 6e 70 75 74 20 74 6f 20 74 68 65 20  he input to the 
1ae30 61 67 67 72 65 67 61 74 6f 72 20 68 61 73 20 62  aggregator has b
1ae40 65 65 6e 0a 20 20 20 20 20 20 20 20 20 20 20 20  een.            
1ae50 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 70              ** p
1ae60 72 6f 63 65 73 73 65 64 20 2a 2f 0a 20 20 20 20  rocessed */.    
1ae70 69 6e 74 20 69 41 62 6f 72 74 46 6c 61 67 3b 20  int iAbortFlag; 
1ae80 20 20 20 20 2f 2a 20 4d 65 6d 20 61 64 64 72 65      /* Mem addre
1ae90 73 73 20 77 68 69 63 68 20 63 61 75 73 65 73 20  ss which causes 
1aea0 71 75 65 72 79 20 61 62 6f 72 74 20 69 66 20 70  query abort if p
1aeb0 6f 73 69 74 69 76 65 20 2a 2f 0a 20 20 20 20 69  ositive */.    i
1aec0 6e 74 20 67 72 6f 75 70 42 79 53 6f 72 74 3b 20  nt groupBySort; 
1aed0 20 20 20 2f 2a 20 52 6f 77 73 20 63 6f 6d 65 20     /* Rows come 
1aee0 66 72 6f 6d 20 73 6f 75 72 63 65 20 69 6e 20 47  from source in G
1aef0 52 4f 55 50 20 42 59 20 6f 72 64 65 72 20 2a 2f  ROUP BY order */
1af00 0a 0a 0a 20 20 20 20 2f 2a 20 54 68 65 20 66 6f  ...    /* The fo
1af10 6c 6c 6f 77 69 6e 67 20 76 61 72 69 61 62 6c 65  llowing variable
1af20 73 20 68 6f 6c 64 20 61 64 64 72 65 73 73 65 73  s hold addresses
1af30 20 6f 72 20 6c 61 62 65 6c 73 20 66 6f 72 20 70   or labels for p
1af40 61 72 74 73 20 6f 66 20 74 68 65 0a 20 20 20 20  arts of the.    
1af50 2a 2a 20 76 69 72 74 75 61 6c 20 6d 61 63 68 69  ** virtual machi
1af60 6e 65 20 70 72 6f 67 72 61 6d 20 77 65 20 61 72  ne program we ar
1af70 65 20 70 75 74 74 69 6e 67 20 74 6f 67 65 74 68  e putting togeth
1af80 65 72 20 2a 2f 0a 20 20 20 20 69 6e 74 20 61 64  er */.    int ad
1af90 64 72 4f 75 74 70 75 74 52 6f 77 3b 20 20 20 20  drOutputRow;    
1afa0 20 20 2f 2a 20 53 74 61 72 74 20 6f 66 20 73 75    /* Start of su
1afb0 62 72 6f 75 74 69 6e 65 20 74 68 61 74 20 6f 75  broutine that ou
1afc0 74 70 75 74 73 20 61 20 72 65 73 75 6c 74 20 72  tputs a result r
1afd0 6f 77 20 2a 2f 0a 20 20 20 20 69 6e 74 20 61 64  ow */.    int ad
1afe0 64 72 53 65 74 41 62 6f 72 74 3b 20 20 20 20 20  drSetAbort;     
1aff0 20 20 2f 2a 20 53 65 74 20 74 68 65 20 61 62 6f    /* Set the abo
1b000 72 74 20 66 6c 61 67 20 61 6e 64 20 72 65 74 75  rt flag and retu
1b010 72 6e 20 2a 2f 0a 20 20 20 20 69 6e 74 20 61 64  rn */.    int ad
1b020 64 72 49 6e 69 74 69 61 6c 69 7a 65 4c 6f 6f 70  drInitializeLoop
1b030 3b 20 2f 2a 20 53 74 61 72 74 20 6f 66 20 63 6f  ; /* Start of co
1b040 64 65 20 74 68 61 74 20 69 6e 69 74 69 61 6c 69  de that initiali
1b050 7a 65 73 20 74 68 65 20 69 6e 70 75 74 20 6c 6f  zes the input lo
1b060 6f 70 20 2a 2f 0a 20 20 20 20 69 6e 74 20 61 64  op */.    int ad
1b070 64 72 54 6f 70 4f 66 4c 6f 6f 70 3b 20 20 20 20  drTopOfLoop;    
1b080 20 20 2f 2a 20 54 6f 70 20 6f 66 20 74 68 65 20    /* Top of the 
1b090 69 6e 70 75 74 20 6c 6f 6f 70 20 2a 2f 0a 20 20  input loop */.  
1b0a0 20 20 69 6e 74 20 61 64 64 72 47 72 6f 75 70 42    int addrGroupB
1b0b0 79 43 68 61 6e 67 65 3b 20 20 2f 2a 20 43 6f 64  yChange;  /* Cod
1b0c0 65 20 74 68 61 74 20 72 75 6e 73 20 77 68 65 6e  e that runs when
1b0d0 20 61 6e 79 20 47 52 4f 55 50 20 42 59 20 74 65   any GROUP BY te
1b0e0 72 6d 20 63 68 61 6e 67 65 73 20 2a 2f 0a 20 20  rm changes */.  
1b0f0 20 20 69 6e 74 20 61 64 64 72 50 72 6f 63 65 73    int addrProces
1b100 73 52 6f 77 3b 20 20 20 20 20 2f 2a 20 43 6f 64  sRow;     /* Cod
1b110 65 20 74 6f 20 70 72 6f 63 65 73 73 20 61 20 73  e to process a s
1b120 69 6e 67 6c 65 20 69 6e 70 75 74 20 72 6f 77 20  ingle input row 
1b130 2a 2f 0a 20 20 20 20 69 6e 74 20 61 64 64 72 45  */.    int addrE
1b140 6e 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  nd;            /
1b150 2a 20 45 6e 64 20 6f 66 20 61 6c 6c 20 70 72 6f  * End of all pro
1b160 63 65 73 73 69 6e 67 20 2a 2f 0a 20 20 20 20 69  cessing */.    i
1b170 6e 74 20 61 64 64 72 53 6f 72 74 69 6e 67 49 64  nt addrSortingId
1b180 78 3b 20 20 20 20 20 2f 2a 20 54 68 65 20 4f 50  x;     /* The OP
1b190 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 20 66  _OpenEphemeral f
1b1a0 6f 72 20 74 68 65 20 73 6f 72 74 69 6e 67 20 69  or the sorting i
1b1b0 6e 64 65 78 20 2a 2f 0a 20 20 20 20 69 6e 74 20  ndex */.    int 
1b1c0 61 64 64 72 52 65 73 65 74 3b 20 20 20 20 20 20  addrReset;      
1b1d0 20 20 20 20 2f 2a 20 53 75 62 72 6f 75 74 69 6e      /* Subroutin
1b1e0 65 20 66 6f 72 20 72 65 73 65 74 74 69 6e 67 20  e for resetting 
1b1f0 74 68 65 20 61 63 63 75 6d 75 6c 61 74 6f 72 20  the accumulator 
1b200 2a 2f 0a 0a 20 20 20 20 61 64 64 72 45 6e 64 20  */..    addrEnd 
1b210 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b  = sqlite3VdbeMak
1b220 65 4c 61 62 65 6c 28 76 29 3b 0a 0a 20 20 20 20  eLabel(v);..    
1b230 2f 2a 20 43 6f 6e 76 65 72 74 20 54 4b 5f 43 4f  /* Convert TK_CO
1b240 4c 55 4d 4e 20 6e 6f 64 65 73 20 69 6e 74 6f 20  LUMN nodes into 
1b250 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 20 61 6e  TK_AGG_COLUMN an
1b260 64 20 6d 61 6b 65 20 65 6e 74 72 69 65 73 20 69  d make entries i
1b270 6e 0a 20 20 20 20 2a 2a 20 73 41 67 67 49 6e 66  n.    ** sAggInf
1b280 6f 20 66 6f 72 20 61 6c 6c 20 54 4b 5f 41 47 47  o for all TK_AGG
1b290 5f 46 55 4e 43 54 49 4f 4e 20 6e 6f 64 65 73 20  _FUNCTION nodes 
1b2a0 69 6e 20 65 78 70 72 65 73 73 69 6f 6e 73 20 6f  in expressions o
1b2b0 66 20 74 68 65 0a 20 20 20 20 2a 2a 20 53 45 4c  f the.    ** SEL
1b2c0 45 43 54 20 73 74 61 74 65 6d 65 6e 74 2e 0a 20  ECT statement.. 
1b2d0 20 20 20 2a 2f 0a 20 20 20 20 6d 65 6d 73 65 74     */.    memset
1b2e0 28 26 73 4e 43 2c 20 30 2c 20 73 69 7a 65 6f 66  (&sNC, 0, sizeof
1b2f0 28 73 4e 43 29 29 3b 0a 20 20 20 20 73 4e 43 2e  (sNC));.    sNC.
1b300 70 50 61 72 73 65 20 3d 20 70 50 61 72 73 65 3b  pParse = pParse;
1b310 0a 20 20 20 20 73 4e 43 2e 70 53 72 63 4c 69 73  .    sNC.pSrcLis
1b320 74 20 3d 20 70 54 61 62 4c 69 73 74 3b 0a 20 20  t = pTabList;.  
1b330 20 20 73 4e 43 2e 70 41 67 67 49 6e 66 6f 20 3d    sNC.pAggInfo =
1b340 20 26 73 41 67 67 49 6e 66 6f 3b 0a 20 20 20 20   &sAggInfo;.    
1b350 73 41 67 67 49 6e 66 6f 2e 6e 53 6f 72 74 69 6e  sAggInfo.nSortin
1b360 67 43 6f 6c 75 6d 6e 20 3d 20 70 47 72 6f 75 70  gColumn = pGroup
1b370 42 79 20 3f 20 70 47 72 6f 75 70 42 79 2d 3e 6e  By ? pGroupBy->n
1b380 45 78 70 72 2b 31 20 3a 20 30 3b 0a 20 20 20 20  Expr+1 : 0;.    
1b390 73 41 67 67 49 6e 66 6f 2e 70 47 72 6f 75 70 42  sAggInfo.pGroupB
1b3a0 79 20 3d 20 70 47 72 6f 75 70 42 79 3b 0a 20 20  y = pGroupBy;.  
1b3b0 20 20 69 66 28 20 73 71 6c 69 74 65 33 45 78 70    if( sqlite3Exp
1b3c0 72 41 6e 61 6c 79 7a 65 41 67 67 4c 69 73 74 28  rAnalyzeAggList(
1b3d0 26 73 4e 43 2c 20 70 45 4c 69 73 74 29 20 29 7b  &sNC, pEList) ){
1b3e0 0a 20 20 20 20 20 20 67 6f 74 6f 20 73 65 6c 65  .      goto sele
1b3f0 63 74 5f 65 6e 64 3b 0a 20 20 20 20 7d 0a 20 20  ct_end;.    }.  
1b400 20 20 69 66 28 20 73 71 6c 69 74 65 33 45 78 70    if( sqlite3Exp
1b410 72 41 6e 61 6c 79 7a 65 41 67 67 4c 69 73 74 28  rAnalyzeAggList(
1b420 26 73 4e 43 2c 20 70 4f 72 64 65 72 42 79 29 20  &sNC, pOrderBy) 
1b430 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 73 65  ){.      goto se
1b440 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 7d 0a  lect_end;.    }.
1b450 20 20 20 20 69 66 28 20 70 48 61 76 69 6e 67 20      if( pHaving 
1b460 26 26 20 73 71 6c 69 74 65 33 45 78 70 72 41 6e  && sqlite3ExprAn
1b470 61 6c 79 7a 65 41 67 67 72 65 67 61 74 65 73 28  alyzeAggregates(
1b480 26 73 4e 43 2c 20 70 48 61 76 69 6e 67 29 20 29  &sNC, pHaving) )
1b490 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 73 65 6c  {.      goto sel
1b4a0 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 7d 0a 20  ect_end;.    }. 
1b4b0 20 20 20 73 41 67 67 49 6e 66 6f 2e 6e 41 63 63     sAggInfo.nAcc
1b4c0 75 6d 75 6c 61 74 6f 72 20 3d 20 73 41 67 67 49  umulator = sAggI
1b4d0 6e 66 6f 2e 6e 43 6f 6c 75 6d 6e 3b 0a 20 20 20  nfo.nColumn;.   
1b4e0 20 66 6f 72 28 69 3d 30 3b 20 69 3c 73 41 67 67   for(i=0; i<sAgg
1b4f0 49 6e 66 6f 2e 6e 46 75 6e 63 3b 20 69 2b 2b 29  Info.nFunc; i++)
1b500 7b 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69  {.      if( sqli
1b510 74 65 33 45 78 70 72 41 6e 61 6c 79 7a 65 41 67  te3ExprAnalyzeAg
1b520 67 4c 69 73 74 28 26 73 4e 43 2c 20 73 41 67 67  gList(&sNC, sAgg
1b530 49 6e 66 6f 2e 61 46 75 6e 63 5b 69 5d 2e 70 45  Info.aFunc[i].pE
1b540 78 70 72 2d 3e 70 4c 69 73 74 29 20 29 7b 0a 20  xpr->pList) ){. 
1b550 20 20 20 20 20 20 20 67 6f 74 6f 20 73 65 6c 65         goto sele
1b560 63 74 5f 65 6e 64 3b 0a 20 20 20 20 20 20 7d 0a  ct_end;.      }.
1b570 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 64 62      }.    if( db
1b580 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
1b590 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64   goto select_end
1b5a0 3b 0a 0a 20 20 20 20 2f 2a 20 50 72 6f 63 65 73  ;..    /* Proces
1b5b0 73 69 6e 67 20 66 6f 72 20 61 67 67 72 65 67 61  sing for aggrega
1b5c0 74 65 73 20 77 69 74 68 20 47 52 4f 55 50 20 42  tes with GROUP B
1b5d0 59 20 69 73 20 76 65 72 79 20 64 69 66 66 65 72  Y is very differ
1b5e0 65 6e 74 20 61 6e 64 0a 20 20 20 20 2a 2a 20 6d  ent and.    ** m
1b5f0 75 63 68 20 6d 6f 72 65 20 63 6f 6d 70 6c 65 78  uch more complex
1b600 20 74 68 61 6e 20 61 67 67 72 65 67 61 74 65 73   than aggregates
1b610 20 77 69 74 68 6f 75 74 20 61 20 47 52 4f 55 50   without a GROUP
1b620 20 42 59 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20   BY..    */.    
1b630 69 66 28 20 70 47 72 6f 75 70 42 79 20 29 7b 0a  if( pGroupBy ){.
1b640 20 20 20 20 20 20 4b 65 79 49 6e 66 6f 20 2a 70        KeyInfo *p
1b650 4b 65 79 49 6e 66 6f 3b 20 20 2f 2a 20 4b 65 79  KeyInfo;  /* Key
1b660 69 6e 67 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  ing information 
1b670 66 6f 72 20 74 68 65 20 67 72 6f 75 70 20 62 79  for the group by
1b680 20 63 6c 61 75 73 65 20 2a 2f 0a 0a 20 20 20 20   clause */..    
1b690 20 20 2f 2a 20 43 72 65 61 74 65 20 6c 61 62 65    /* Create labe
1b6a0 6c 73 20 74 68 61 74 20 77 65 20 77 69 6c 6c 20  ls that we will 
1b6b0 62 65 20 6e 65 65 64 69 6e 67 0a 20 20 20 20 20  be needing.     
1b6c0 20 2a 2f 0a 20 20 20 20 20 0a 20 20 20 20 20 20   */.     .      
1b6d0 61 64 64 72 49 6e 69 74 69 61 6c 69 7a 65 4c 6f  addrInitializeLo
1b6e0 6f 70 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  op = sqlite3Vdbe
1b6f0 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20  MakeLabel(v);.  
1b700 20 20 20 20 61 64 64 72 47 72 6f 75 70 42 79 43      addrGroupByC
1b710 68 61 6e 67 65 20 3d 20 73 71 6c 69 74 65 33 56  hange = sqlite3V
1b720 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b  dbeMakeLabel(v);
1b730 0a 20 20 20 20 20 20 61 64 64 72 50 72 6f 63 65  .      addrProce
1b740 73 73 52 6f 77 20 3d 20 73 71 6c 69 74 65 33 56  ssRow = sqlite3V
1b750 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b  dbeMakeLabel(v);
1b760 0a 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68  ..      /* If th
1b770 65 72 65 20 69 73 20 61 20 47 52 4f 55 50 20 42  ere is a GROUP B
1b780 59 20 63 6c 61 75 73 65 20 77 65 20 6d 69 67 68  Y clause we migh
1b790 74 20 6e 65 65 64 20 61 20 73 6f 72 74 69 6e 67  t need a sorting
1b7a0 20 69 6e 64 65 78 20 74 6f 0a 20 20 20 20 20 20   index to.      
1b7b0 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74 20 69 74 2e  ** implement it.
1b7c0 20 20 41 6c 6c 6f 63 61 74 65 20 74 68 61 74 20    Allocate that 
1b7d0 73 6f 72 74 69 6e 67 20 69 6e 64 65 78 20 6e 6f  sorting index no
1b7e0 77 2e 20 20 49 66 20 69 74 20 74 75 72 6e 73 20  w.  If it turns 
1b7f0 6f 75 74 0a 20 20 20 20 20 20 2a 2a 20 74 68 61  out.      ** tha
1b800 74 20 77 65 20 64 6f 20 6e 6f 74 20 6e 65 65 64  t we do not need
1b810 20 69 74 20 61 66 74 65 72 20 61 6c 6c 2c 20 74   it after all, t
1b820 68 65 20 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c  he OpenEphemeral
1b830 20 69 6e 73 74 72 75 63 74 69 6f 6e 0a 20 20 20   instruction.   
1b840 20 20 20 2a 2a 20 77 69 6c 6c 20 62 65 20 63 6f     ** will be co
1b850 6e 76 65 72 74 65 64 20 69 6e 74 6f 20 61 20 4e  nverted into a N
1b860 6f 6f 70 2e 20 20 0a 20 20 20 20 20 20 2a 2f 0a  oop.  .      */.
1b870 20 20 20 20 20 20 73 41 67 67 49 6e 66 6f 2e 73        sAggInfo.s
1b880 6f 72 74 69 6e 67 49 64 78 20 3d 20 70 50 61 72  ortingIdx = pPar
1b890 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20  se->nTab++;.    
1b8a0 20 20 70 4b 65 79 49 6e 66 6f 20 3d 20 6b 65 79    pKeyInfo = key
1b8b0 49 6e 66 6f 46 72 6f 6d 45 78 70 72 4c 69 73 74  InfoFromExprList
1b8c0 28 70 50 61 72 73 65 2c 20 70 47 72 6f 75 70 42  (pParse, pGroupB
1b8d0 79 29 3b 0a 20 20 20 20 20 20 61 64 64 72 53 6f  y);.      addrSo
1b8e0 72 74 69 6e 67 49 64 78 20 3d 0a 20 20 20 20 20  rtingIdx =.     
1b8f0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
1b900 4f 70 33 28 76 2c 20 4f 50 5f 4f 70 65 6e 45 70  Op3(v, OP_OpenEp
1b910 68 65 6d 65 72 61 6c 2c 20 73 41 67 67 49 6e 66  hemeral, sAggInf
1b920 6f 2e 73 6f 72 74 69 6e 67 49 64 78 2c 0a 20 20  o.sortingIdx,.  
1b930 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b940 20 20 20 20 20 20 20 73 41 67 67 49 6e 66 6f 2e         sAggInfo.
1b950 6e 53 6f 72 74 69 6e 67 43 6f 6c 75 6d 6e 2c 0a  nSortingColumn,.
1b960 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b970 20 20 20 20 20 20 20 20 20 28 63 68 61 72 2a 29           (char*)
1b980 70 4b 65 79 49 6e 66 6f 2c 20 50 33 5f 4b 45 59  pKeyInfo, P3_KEY
1b990 49 4e 46 4f 5f 48 41 4e 44 4f 46 46 29 3b 0a 0a  INFO_HANDOFF);..
1b9a0 20 20 20 20 20 20 2f 2a 20 49 6e 69 74 69 61 6c        /* Initial
1b9b0 69 7a 65 20 6d 65 6d 6f 72 79 20 6c 6f 63 61 74  ize memory locat
1b9c0 69 6f 6e 73 20 75 73 65 64 20 62 79 20 47 52 4f  ions used by GRO
1b9d0 55 50 20 42 59 20 61 67 67 72 65 67 61 74 65 20  UP BY aggregate 
1b9e0 70 72 6f 63 65 73 73 69 6e 67 0a 20 20 20 20 20  processing.     
1b9f0 20 2a 2f 0a 20 20 20 20 20 20 69 55 73 65 46 6c   */.      iUseFl
1ba00 61 67 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 65  ag = pParse->nMe
1ba10 6d 2b 2b 3b 0a 20 20 20 20 20 20 69 41 62 6f 72  m++;.      iAbor
1ba20 74 46 6c 61 67 20 3d 20 70 50 61 72 73 65 2d 3e  tFlag = pParse->
1ba30 6e 4d 65 6d 2b 2b 3b 0a 20 20 20 20 20 20 69 41  nMem++;.      iA
1ba40 4d 65 6d 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d  Mem = pParse->nM
1ba50 65 6d 3b 0a 20 20 20 20 20 20 70 50 61 72 73 65  em;.      pParse
1ba60 2d 3e 6e 4d 65 6d 20 2b 3d 20 70 47 72 6f 75 70  ->nMem += pGroup
1ba70 42 79 2d 3e 6e 45 78 70 72 3b 0a 20 20 20 20 20  By->nExpr;.     
1ba80 20 69 42 4d 65 6d 20 3d 20 70 50 61 72 73 65 2d   iBMem = pParse-
1ba90 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 70 50 61  >nMem;.      pPa
1baa0 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 70 47 72  rse->nMem += pGr
1bab0 6f 75 70 42 79 2d 3e 6e 45 78 70 72 3b 0a 20 20  oupBy->nExpr;.  
1bac0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
1bad0 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 65 6d 49 6e  ddOp(v, OP_MemIn
1bae0 74 2c 20 30 2c 20 69 41 62 6f 72 74 46 6c 61 67  t, 0, iAbortFlag
1baf0 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 6d  );.      VdbeCom
1bb00 6d 65 6e 74 28 28 76 2c 20 22 23 20 63 6c 65 61  ment((v, "# clea
1bb10 72 20 61 62 6f 72 74 20 66 6c 61 67 22 29 29 3b  r abort flag"));
1bb20 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
1bb30 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 65  beAddOp(v, OP_Me
1bb40 6d 49 6e 74 2c 20 30 2c 20 69 55 73 65 46 6c 61  mInt, 0, iUseFla
1bb50 67 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f  g);.      VdbeCo
1bb60 6d 6d 65 6e 74 28 28 76 2c 20 22 23 20 69 6e 64  mment((v, "# ind
1bb70 69 63 61 74 65 20 61 63 63 75 6d 75 6c 61 74 6f  icate accumulato
1bb80 72 20 65 6d 70 74 79 22 29 29 3b 0a 20 20 20 20  r empty"));.    
1bb90 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
1bba0 4f 70 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30  Op(v, OP_Goto, 0
1bbb0 2c 20 61 64 64 72 49 6e 69 74 69 61 6c 69 7a 65  , addrInitialize
1bbc0 4c 6f 6f 70 29 3b 0a 0a 20 20 20 20 20 20 2f 2a  Loop);..      /*
1bbd0 20 47 65 6e 65 72 61 74 65 20 61 20 73 75 62 72   Generate a subr
1bbe0 6f 75 74 69 6e 65 20 74 68 61 74 20 6f 75 74 70  outine that outp
1bbf0 75 74 73 20 61 20 73 69 6e 67 6c 65 20 72 6f 77  uts a single row
1bc00 20 6f 66 20 74 68 65 20 72 65 73 75 6c 74 0a 20   of the result. 
1bc10 20 20 20 20 20 2a 2a 20 73 65 74 2e 20 20 54 68       ** set.  Th
1bc20 69 73 20 73 75 62 72 6f 75 74 69 6e 65 20 66 69  is subroutine fi
1bc30 72 73 74 20 6c 6f 6f 6b 73 20 61 74 20 74 68 65  rst looks at the
1bc40 20 69 55 73 65 46 6c 61 67 2e 20 20 49 66 20 69   iUseFlag.  If i
1bc50 55 73 65 46 6c 61 67 0a 20 20 20 20 20 20 2a 2a  UseFlag.      **
1bc60 20 69 73 20 6c 65 73 73 20 74 68 61 6e 20 6f 72   is less than or
1bc70 20 65 71 75 61 6c 20 74 6f 20 7a 65 72 6f 2c 20   equal to zero, 
1bc80 74 68 65 20 73 75 62 72 6f 75 74 69 6e 65 20 69  the subroutine i
1bc90 73 20 61 20 6e 6f 2d 6f 70 2e 20 20 49 66 0a 20  s a no-op.  If. 
1bca0 20 20 20 20 20 2a 2a 20 74 68 65 20 70 72 6f 63       ** the proc
1bcb0 65 73 73 69 6e 67 20 63 61 6c 6c 73 20 66 6f 72  essing calls for
1bcc0 20 74 68 65 20 71 75 65 72 79 20 74 6f 20 61 62   the query to ab
1bcd0 6f 72 74 2c 20 74 68 69 73 20 73 75 62 72 6f 75  ort, this subrou
1bce0 74 69 6e 65 0a 20 20 20 20 20 20 2a 2a 20 69 6e  tine.      ** in
1bcf0 63 72 65 6d 65 6e 74 73 20 74 68 65 20 69 41 62  crements the iAb
1bd00 6f 72 74 46 6c 61 67 20 6d 65 6d 6f 72 79 20 6c  ortFlag memory l
1bd10 6f 63 61 74 69 6f 6e 20 62 65 66 6f 72 65 20 72  ocation before r
1bd20 65 74 75 72 6e 69 6e 67 20 69 6e 0a 20 20 20 20  eturning in.    
1bd30 20 20 2a 2a 20 6f 72 64 65 72 20 74 6f 20 73 69    ** order to si
1bd40 67 6e 61 6c 20 74 68 65 20 63 61 6c 6c 65 72 20  gnal the caller 
1bd50 74 6f 20 61 62 6f 72 74 2e 0a 20 20 20 20 20 20  to abort..      
1bd60 2a 2f 0a 20 20 20 20 20 20 61 64 64 72 53 65 74  */.      addrSet
1bd70 41 62 6f 72 74 20 3d 20 73 71 6c 69 74 65 33 56  Abort = sqlite3V
1bd80 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76  dbeCurrentAddr(v
1bd90 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
1bda0 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
1bdb0 4d 65 6d 49 6e 74 2c 20 31 2c 20 69 41 62 6f 72  MemInt, 1, iAbor
1bdc0 74 46 6c 61 67 29 3b 0a 20 20 20 20 20 20 56 64  tFlag);.      Vd
1bdd0 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 23  beComment((v, "#
1bde0 20 73 65 74 20 61 62 6f 72 74 20 66 6c 61 67 22   set abort flag"
1bdf0 29 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  ));.      sqlite
1be00 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
1be10 5f 52 65 74 75 72 6e 2c 20 30 2c 20 30 29 3b 0a  _Return, 0, 0);.
1be20 20 20 20 20 20 20 61 64 64 72 4f 75 74 70 75 74        addrOutput
1be30 52 6f 77 20 3d 20 73 71 6c 69 74 65 33 56 64 62  Row = sqlite3Vdb
1be40 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b  eCurrentAddr(v);
1be50 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
1be60 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49 66  beAddOp(v, OP_If
1be70 4d 65 6d 50 6f 73 2c 20 69 55 73 65 46 6c 61 67  MemPos, iUseFlag
1be80 2c 20 61 64 64 72 4f 75 74 70 75 74 52 6f 77 2b  , addrOutputRow+
1be90 32 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f  2);.      VdbeCo
1bea0 6d 6d 65 6e 74 28 28 76 2c 20 22 23 20 47 72 6f  mment((v, "# Gro
1beb0 75 70 62 79 20 72 65 73 75 6c 74 20 67 65 6e 65  upby result gene
1bec0 72 61 74 6f 72 20 65 6e 74 72 79 20 70 6f 69 6e  rator entry poin
1bed0 74 22 29 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  t"));.      sqli
1bee0 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
1bef0 4f 50 5f 52 65 74 75 72 6e 2c 20 30 2c 20 30 29  OP_Return, 0, 0)
1bf00 3b 0a 20 20 20 20 20 20 66 69 6e 61 6c 69 7a 65  ;.      finalize
1bf10 41 67 67 46 75 6e 63 74 69 6f 6e 73 28 70 50 61  AggFunctions(pPa
1bf20 72 73 65 2c 20 26 73 41 67 67 49 6e 66 6f 29 3b  rse, &sAggInfo);
1bf30 0a 20 20 20 20 20 20 69 66 28 20 70 48 61 76 69  .      if( pHavi
1bf40 6e 67 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  ng ){.        sq
1bf50 6c 69 74 65 33 45 78 70 72 49 66 46 61 6c 73 65  lite3ExprIfFalse
1bf60 28 70 50 61 72 73 65 2c 20 70 48 61 76 69 6e 67  (pParse, pHaving
1bf70 2c 20 61 64 64 72 4f 75 74 70 75 74 52 6f 77 2b  , addrOutputRow+
1bf80 31 2c 20 31 29 3b 0a 20 20 20 20 20 20 7d 0a 20  1, 1);.      }. 
1bf90 20 20 20 20 20 72 63 20 3d 20 73 65 6c 65 63 74       rc = select
1bfa0 49 6e 6e 65 72 4c 6f 6f 70 28 70 50 61 72 73 65  InnerLoop(pParse
1bfb0 2c 20 70 2c 20 70 2d 3e 70 45 4c 69 73 74 2c 20  , p, p->pEList, 
1bfc0 30 2c 20 30 2c 20 70 4f 72 64 65 72 42 79 2c 0a  0, 0, pOrderBy,.
1bfd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bfe0 20 20 20 20 20 20 20 20 20 20 20 64 69 73 74 69             disti
1bff0 6e 63 74 2c 20 65 44 65 73 74 2c 20 69 50 61 72  nct, eDest, iPar
1c000 6d 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  m, .            
1c010 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 61                 a
1c020 64 64 72 4f 75 74 70 75 74 52 6f 77 2b 31 2c 20  ddrOutputRow+1, 
1c030 61 64 64 72 53 65 74 41 62 6f 72 74 2c 20 61 66  addrSetAbort, af
1c040 66 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  f);.      if( rc
1c050 20 29 7b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f   ){.        goto
1c060 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20   select_end;.   
1c070 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74     }.      sqlit
1c080 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
1c090 50 5f 52 65 74 75 72 6e 2c 20 30 2c 20 30 29 3b  P_Return, 0, 0);
1c0a0 0a 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65  .      VdbeComme
1c0b0 6e 74 28 28 76 2c 20 22 23 20 65 6e 64 20 67 72  nt((v, "# end gr
1c0c0 6f 75 70 62 79 20 72 65 73 75 6c 74 20 67 65 6e  oupby result gen
1c0d0 65 72 61 74 6f 72 22 29 29 3b 0a 0a 20 20 20 20  erator"));..    
1c0e0 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 61 20    /* Generate a 
1c0f0 73 75 62 72 6f 75 74 69 6e 65 20 74 68 61 74 20  subroutine that 
1c100 77 69 6c 6c 20 72 65 73 65 74 20 74 68 65 20 67  will reset the g
1c110 72 6f 75 70 2d 62 79 20 61 63 63 75 6d 75 6c 61  roup-by accumula
1c120 74 6f 72 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  tor.      */.   
1c130 20 20 20 61 64 64 72 52 65 73 65 74 20 3d 20 73     addrReset = s
1c140 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e  qlite3VdbeCurren
1c150 74 41 64 64 72 28 76 29 3b 0a 20 20 20 20 20 20  tAddr(v);.      
1c160 72 65 73 65 74 41 63 63 75 6d 75 6c 61 74 6f 72  resetAccumulator
1c170 28 70 50 61 72 73 65 2c 20 26 73 41 67 67 49 6e  (pParse, &sAggIn
1c180 66 6f 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  fo);.      sqlit
1c190 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
1c1a0 50 5f 52 65 74 75 72 6e 2c 20 30 2c 20 30 29 3b  P_Return, 0, 0);
1c1b0 0a 0a 20 20 20 20 20 20 2f 2a 20 42 65 67 69 6e  ..      /* Begin
1c1c0 20 61 20 6c 6f 6f 70 20 74 68 61 74 20 77 69 6c   a loop that wil
1c1d0 6c 20 65 78 74 72 61 63 74 20 61 6c 6c 20 73 6f  l extract all so
1c1e0 75 72 63 65 20 72 6f 77 73 20 69 6e 20 47 52 4f  urce rows in GRO
1c1f0 55 50 20 42 59 20 6f 72 64 65 72 2e 0a 20 20 20  UP BY order..   
1c200 20 20 20 2a 2a 20 54 68 69 73 20 6d 69 67 68 74     ** This might
1c210 20 69 6e 76 6f 6c 76 65 20 74 77 6f 20 73 65 70   involve two sep
1c220 61 72 61 74 65 20 6c 6f 6f 70 73 20 77 69 74 68  arate loops with
1c230 20 61 6e 20 4f 50 5f 53 6f 72 74 20 69 6e 20 62   an OP_Sort in b
1c240 65 74 77 65 65 6e 2c 20 6f 72 0a 20 20 20 20 20  etween, or.     
1c250 20 2a 2a 20 69 74 20 6d 69 67 68 74 20 62 65 20   ** it might be 
1c260 61 20 73 69 6e 67 6c 65 20 6c 6f 6f 70 20 74 68  a single loop th
1c270 61 74 20 75 73 65 73 20 61 6e 20 69 6e 64 65 78  at uses an index
1c280 20 74 6f 20 65 78 74 72 61 63 74 20 69 6e 66 6f   to extract info
1c290 72 6d 61 74 69 6f 6e 0a 20 20 20 20 20 20 2a 2a  rmation.      **
1c2a0 20 69 6e 20 74 68 65 20 72 69 67 68 74 20 6f 72   in the right or
1c2b0 64 65 72 20 74 6f 20 62 65 67 69 6e 20 77 69 74  der to begin wit
1c2c0 68 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  h..      */.    
1c2d0 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73    sqlite3VdbeRes
1c2e0 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 61 64 64  olveLabel(v, add
1c2f0 72 49 6e 69 74 69 61 6c 69 7a 65 4c 6f 6f 70 29  rInitializeLoop)
1c300 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
1c310 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 47  dbeAddOp(v, OP_G
1c320 6f 73 75 62 2c 20 30 2c 20 61 64 64 72 52 65 73  osub, 0, addrRes
1c330 65 74 29 3b 0a 20 20 20 20 20 20 70 57 49 6e 66  et);.      pWInf
1c340 6f 20 3d 20 73 71 6c 69 74 65 33 57 68 65 72 65  o = sqlite3Where
1c350 42 65 67 69 6e 28 70 50 61 72 73 65 2c 20 70 54  Begin(pParse, pT
1c360 61 62 4c 69 73 74 2c 20 70 57 68 65 72 65 2c 20  abList, pWhere, 
1c370 26 70 47 72 6f 75 70 42 79 29 3b 0a 20 20 20 20  &pGroupBy);.    
1c380 20 20 69 66 28 20 70 57 49 6e 66 6f 3d 3d 30 20    if( pWInfo==0 
1c390 29 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e  ) goto select_en
1c3a0 64 3b 0a 20 20 20 20 20 20 69 66 28 20 70 47 72  d;.      if( pGr
1c3b0 6f 75 70 42 79 3d 3d 30 20 29 7b 0a 20 20 20 20  oupBy==0 ){.    
1c3c0 20 20 20 20 2f 2a 20 54 68 65 20 6f 70 74 69 6d      /* The optim
1c3d0 69 7a 65 72 20 69 73 20 61 62 6c 65 20 74 6f 20  izer is able to 
1c3e0 64 65 6c 69 76 65 72 20 72 6f 77 73 20 69 6e 20  deliver rows in 
1c3f0 67 72 6f 75 70 20 62 79 20 6f 72 64 65 72 20 73  group by order s
1c400 6f 0a 20 20 20 20 20 20 20 20 2a 2a 20 77 65 20  o.        ** we 
1c410 64 6f 20 6e 6f 74 20 68 61 76 65 20 74 6f 20 73  do not have to s
1c420 6f 72 74 2e 20 20 54 68 65 20 4f 50 5f 4f 70 65  ort.  The OP_Ope
1c430 6e 45 70 68 65 6d 65 72 61 6c 20 74 61 62 6c 65  nEphemeral table
1c440 20 77 69 6c 6c 20 62 65 0a 20 20 20 20 20 20 20   will be.       
1c450 20 2a 2a 20 63 61 6e 63 65 6c 6c 65 64 20 6c 61   ** cancelled la
1c460 74 65 72 20 62 65 63 61 75 73 65 20 77 65 20 73  ter because we s
1c470 74 69 6c 6c 20 6e 65 65 64 20 74 6f 20 75 73 65  till need to use
1c480 20 74 68 65 20 70 4b 65 79 49 6e 66 6f 0a 20 20   the pKeyInfo.  
1c490 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
1c4a0 20 70 47 72 6f 75 70 42 79 20 3d 20 70 2d 3e 70   pGroupBy = p->p
1c4b0 47 72 6f 75 70 42 79 3b 0a 20 20 20 20 20 20 20  GroupBy;.       
1c4c0 20 67 72 6f 75 70 42 79 53 6f 72 74 20 3d 20 30   groupBySort = 0
1c4d0 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
1c4e0 20 20 20 20 20 20 20 2f 2a 20 52 6f 77 73 20 61         /* Rows a
1c4f0 72 65 20 63 6f 6d 69 6e 67 20 6f 75 74 20 69 6e  re coming out in
1c500 20 75 6e 64 65 74 65 72 6d 69 6e 65 64 20 6f 72   undetermined or
1c510 64 65 72 2e 20 20 57 65 20 68 61 76 65 20 74 6f  der.  We have to
1c520 20 70 75 73 68 0a 20 20 20 20 20 20 20 20 2a 2a   push.        **
1c530 20 65 61 63 68 20 72 6f 77 20 69 6e 74 6f 20 61   each row into a
1c540 20 73 6f 72 74 69 6e 67 20 69 6e 64 65 78 2c 20   sorting index, 
1c550 74 65 72 6d 69 6e 61 74 65 20 74 68 65 20 66 69  terminate the fi
1c560 72 73 74 20 6c 6f 6f 70 2c 0a 20 20 20 20 20 20  rst loop,.      
1c570 20 20 2a 2a 20 74 68 65 6e 20 6c 6f 6f 70 20 6f    ** then loop o
1c580 76 65 72 20 74 68 65 20 73 6f 72 74 69 6e 67 20  ver the sorting 
1c590 69 6e 64 65 78 20 69 6e 20 6f 72 64 65 72 20 74  index in order t
1c5a0 6f 20 67 65 74 20 74 68 65 20 6f 75 74 70 75 74  o get the output
1c5b0 0a 20 20 20 20 20 20 20 20 2a 2a 20 69 6e 20 73  .        ** in s
1c5c0 6f 72 74 65 64 20 6f 72 64 65 72 0a 20 20 20 20  orted order.    
1c5d0 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 67      */.        g
1c5e0 72 6f 75 70 42 79 53 6f 72 74 20 3d 20 31 3b 0a  roupBySort = 1;.
1c5f0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
1c600 78 70 72 43 6f 64 65 45 78 70 72 4c 69 73 74 28  xprCodeExprList(
1c610 70 50 61 72 73 65 2c 20 70 47 72 6f 75 70 42 79  pParse, pGroupBy
1c620 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
1c630 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
1c640 50 5f 53 65 71 75 65 6e 63 65 2c 20 73 41 67 67  P_Sequence, sAgg
1c650 49 6e 66 6f 2e 73 6f 72 74 69 6e 67 49 64 78 2c  Info.sortingIdx,
1c660 20 30 29 3b 0a 20 20 20 20 20 20 20 20 6a 20 3d   0);.        j =
1c670 20 70 47 72 6f 75 70 42 79 2d 3e 6e 45 78 70 72   pGroupBy->nExpr
1c680 2b 31 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28  +1;.        for(
1c690 69 3d 30 3b 20 69 3c 73 41 67 67 49 6e 66 6f 2e  i=0; i<sAggInfo.
1c6a0 6e 43 6f 6c 75 6d 6e 3b 20 69 2b 2b 29 7b 0a 20  nColumn; i++){. 
1c6b0 20 20 20 20 20 20 20 20 20 73 74 72 75 63 74 20           struct 
1c6c0 41 67 67 49 6e 66 6f 5f 63 6f 6c 20 2a 70 43 6f  AggInfo_col *pCo
1c6d0 6c 20 3d 20 26 73 41 67 67 49 6e 66 6f 2e 61 43  l = &sAggInfo.aC
1c6e0 6f 6c 5b 69 5d 3b 0a 20 20 20 20 20 20 20 20 20  ol[i];.         
1c6f0 20 69 66 28 20 70 43 6f 6c 2d 3e 69 53 6f 72 74   if( pCol->iSort
1c700 65 72 43 6f 6c 75 6d 6e 3c 6a 20 29 20 63 6f 6e  erColumn<j ) con
1c710 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 20  tinue;.         
1c720 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
1c730 47 65 74 43 6f 6c 75 6d 6e 28 76 2c 20 70 43 6f  GetColumn(v, pCo
1c740 6c 2d 3e 70 54 61 62 2c 20 70 43 6f 6c 2d 3e 69  l->pTab, pCol->i
1c750 43 6f 6c 75 6d 6e 2c 20 70 43 6f 6c 2d 3e 69 54  Column, pCol->iT
1c760 61 62 6c 65 29 3b 0a 20 20 20 20 20 20 20 20 20  able);.         
1c770 20 6a 2b 2b 3b 0a 20 20 20 20 20 20 20 20 7d 0a   j++;.        }.
1c780 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
1c790 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d  dbeAddOp(v, OP_M
1c7a0 61 6b 65 52 65 63 6f 72 64 2c 20 6a 2c 20 30 29  akeRecord, j, 0)
1c7b0 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
1c7c0 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
1c7d0 5f 49 64 78 49 6e 73 65 72 74 2c 20 73 41 67 67  _IdxInsert, sAgg
1c7e0 49 6e 66 6f 2e 73 6f 72 74 69 6e 67 49 64 78 2c  Info.sortingIdx,
1c7f0 20 30 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c   0);.        sql
1c800 69 74 65 33 57 68 65 72 65 45 6e 64 28 70 57 49  ite3WhereEnd(pWI
1c810 6e 66 6f 29 3b 0a 20 20 20 20 20 20 20 20 73 71  nfo);.        sq
1c820 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
1c830 2c 20 4f 50 5f 53 6f 72 74 2c 20 73 41 67 67 49  , OP_Sort, sAggI
1c840 6e 66 6f 2e 73 6f 72 74 69 6e 67 49 64 78 2c 20  nfo.sortingIdx, 
1c850 61 64 64 72 45 6e 64 29 3b 0a 20 20 20 20 20 20  addrEnd);.      
1c860 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76    VdbeComment((v
1c870 2c 20 22 23 20 47 52 4f 55 50 20 42 59 20 73 6f  , "# GROUP BY so
1c880 72 74 22 29 29 3b 0a 20 20 20 20 20 20 20 20 73  rt"));.        s
1c890 41 67 67 49 6e 66 6f 2e 75 73 65 53 6f 72 74 69  AggInfo.useSorti
1c8a0 6e 67 49 64 78 20 3d 20 31 3b 0a 20 20 20 20 20  ngIdx = 1;.     
1c8b0 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 45 76 61   }..      /* Eva
1c8c0 6c 75 61 74 65 20 74 68 65 20 63 75 72 72 65 6e  luate the curren
1c8d0 74 20 47 52 4f 55 50 20 42 59 20 74 65 72 6d 73  t GROUP BY terms
1c8e0 20 61 6e 64 20 73 74 6f 72 65 20 69 6e 20 62 30   and store in b0
1c8f0 2c 20 62 31 2c 20 62 32 2e 2e 2e 0a 20 20 20 20  , b1, b2....    
1c900 20 20 2a 2a 20 28 62 30 20 69 73 20 6d 65 6d 6f    ** (b0 is memo
1c910 72 79 20 6c 6f 63 61 74 69 6f 6e 20 69 42 4d 65  ry location iBMe
1c920 6d 2b 30 2c 20 62 31 20 69 73 20 69 42 4d 65 6d  m+0, b1 is iBMem
1c930 2b 31 2c 20 61 6e 64 20 73 6f 20 66 6f 72 74 68  +1, and so forth
1c940 29 0a 20 20 20 20 20 20 2a 2a 20 54 68 65 6e 20  ).      ** Then 
1c950 63 6f 6d 70 61 72 65 20 74 68 65 20 63 75 72 72  compare the curr
1c960 65 6e 74 20 47 52 4f 55 50 20 42 59 20 74 65 72  ent GROUP BY ter
1c970 6d 73 20 61 67 61 69 6e 73 74 20 74 68 65 20 47  ms against the G
1c980 52 4f 55 50 20 42 59 20 74 65 72 6d 73 0a 20 20  ROUP BY terms.  
1c990 20 20 20 20 2a 2a 20 66 72 6f 6d 20 74 68 65 20      ** from the 
1c9a0 70 72 65 76 69 6f 75 73 20 72 6f 77 20 63 75 72  previous row cur
1c9b0 72 65 6e 74 6c 79 20 73 74 6f 72 65 64 20 69 6e  rently stored in
1c9c0 20 61 30 2c 20 61 31 2c 20 61 32 2e 2e 2e 0a 20   a0, a1, a2.... 
1c9d0 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 61 64       */.      ad
1c9e0 64 72 54 6f 70 4f 66 4c 6f 6f 70 20 3d 20 73 71  drTopOfLoop = sq
1c9f0 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74  lite3VdbeCurrent
1ca00 41 64 64 72 28 76 29 3b 0a 20 20 20 20 20 20 66  Addr(v);.      f
1ca10 6f 72 28 6a 3d 30 3b 20 6a 3c 70 47 72 6f 75 70  or(j=0; j<pGroup
1ca20 42 79 2d 3e 6e 45 78 70 72 3b 20 6a 2b 2b 29 7b  By->nExpr; j++){
1ca30 0a 20 20 20 20 20 20 20 20 69 66 28 20 67 72 6f  .        if( gro
1ca40 75 70 42 79 53 6f 72 74 20 29 7b 0a 20 20 20 20  upBySort ){.    
1ca50 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
1ca60 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 43 6f 6c  eAddOp(v, OP_Col
1ca70 75 6d 6e 2c 20 73 41 67 67 49 6e 66 6f 2e 73 6f  umn, sAggInfo.so
1ca80 72 74 69 6e 67 49 64 78 2c 20 6a 29 3b 0a 20 20  rtingIdx, j);.  
1ca90 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
1caa0 20 20 20 20 20 20 20 73 41 67 67 49 6e 66 6f 2e         sAggInfo.
1cab0 64 69 72 65 63 74 4d 6f 64 65 20 3d 20 31 3b 0a  directMode = 1;.
1cac0 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
1cad0 33 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65  3ExprCode(pParse
1cae0 2c 20 70 47 72 6f 75 70 42 79 2d 3e 61 5b 6a 5d  , pGroupBy->a[j]
1caf0 2e 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20 20  .pExpr);.       
1cb00 20 7d 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74   }.        sqlit
1cb10 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
1cb20 50 5f 4d 65 6d 53 74 6f 72 65 2c 20 69 42 4d 65  P_MemStore, iBMe
1cb30 6d 2b 6a 2c 20 6a 3c 70 47 72 6f 75 70 42 79 2d  m+j, j<pGroupBy-
1cb40 3e 6e 45 78 70 72 2d 31 29 3b 0a 20 20 20 20 20  >nExpr-1);.     
1cb50 20 7d 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d 70   }.      for(j=p
1cb60 47 72 6f 75 70 42 79 2d 3e 6e 45 78 70 72 2d 31  GroupBy->nExpr-1
1cb70 3b 20 6a 3e 3d 30 3b 20 6a 2d 2d 29 7b 0a 20 20  ; j>=0; j--){.  
1cb80 20 20 20 20 20 20 69 66 28 20 6a 3c 70 47 72 6f        if( j<pGro
1cb90 75 70 42 79 2d 3e 6e 45 78 70 72 2d 31 20 29 7b  upBy->nExpr-1 ){
1cba0 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
1cbb0 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
1cbc0 50 5f 4d 65 6d 4c 6f 61 64 2c 20 69 42 4d 65 6d  P_MemLoad, iBMem
1cbd0 2b 6a 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20  +j, 0);.        
1cbe0 7d 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  }.        sqlite
1cbf0 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
1cc00 5f 4d 65 6d 4c 6f 61 64 2c 20 69 41 4d 65 6d 2b  _MemLoad, iAMem+
1cc10 6a 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 69  j, 0);.        i
1cc20 66 28 20 6a 3d 3d 30 20 29 7b 0a 20 20 20 20 20  f( j==0 ){.     
1cc30 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
1cc40 41 64 64 4f 70 28 76 2c 20 4f 50 5f 45 71 2c 20  AddOp(v, OP_Eq, 
1cc50 30 78 32 30 30 2c 20 61 64 64 72 50 72 6f 63 65  0x200, addrProce
1cc60 73 73 52 6f 77 29 3b 0a 20 20 20 20 20 20 20 20  ssRow);.        
1cc70 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
1cc80 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
1cc90 70 28 76 2c 20 4f 50 5f 4e 65 2c 20 30 78 32 30  p(v, OP_Ne, 0x20
1cca0 30 2c 20 61 64 64 72 47 72 6f 75 70 42 79 43 68  0, addrGroupByCh
1ccb0 61 6e 67 65 29 3b 0a 20 20 20 20 20 20 20 20 7d  ange);.        }
1ccc0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
1ccd0 56 64 62 65 43 68 61 6e 67 65 50 33 28 76 2c 20  VdbeChangeP3(v, 
1cce0 2d 31 2c 20 28 76 6f 69 64 2a 29 70 4b 65 79 49  -1, (void*)pKeyI
1ccf0 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b 6a 5d 2c 20 50  nfo->aColl[j], P
1cd00 33 5f 43 4f 4c 4c 53 45 51 29 3b 0a 20 20 20 20  3_COLLSEQ);.    
1cd10 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 47 65    }..      /* Ge
1cd20 6e 65 72 61 74 65 20 63 6f 64 65 20 74 68 61 74  nerate code that
1cd30 20 72 75 6e 73 20 77 68 65 6e 65 76 65 72 20 74   runs whenever t
1cd40 68 65 20 47 52 4f 55 50 20 42 59 20 63 68 61 6e  he GROUP BY chan
1cd50 67 65 73 2e 0a 20 20 20 20 20 20 2a 2a 20 43 68  ges..      ** Ch
1cd60 61 6e 67 65 20 69 6e 20 74 68 65 20 47 52 4f 55  ange in the GROU
1cd70 50 20 42 59 20 61 72 65 20 64 65 74 65 63 74 65  P BY are detecte
1cd80 64 20 62 79 20 74 68 65 20 70 72 65 76 69 6f 75  d by the previou
1cd90 73 20 63 6f 64 65 0a 20 20 20 20 20 20 2a 2a 20  s code.      ** 
1cda0 62 6c 6f 63 6b 2e 20 20 49 66 20 74 68 65 72 65  block.  If there
1cdb0 20 77 65 72 65 20 6e 6f 20 63 68 61 6e 67 65 73   were no changes
1cdc0 2c 20 74 68 69 73 20 62 6c 6f 63 6b 20 69 73 20  , this block is 
1cdd0 73 6b 69 70 70 65 64 2e 0a 20 20 20 20 20 20 2a  skipped..      *
1cde0 2a 0a 20 20 20 20 20 20 2a 2a 20 54 68 69 73 20  *.      ** This 
1cdf0 63 6f 64 65 20 63 6f 70 69 65 73 20 63 75 72 72  code copies curr
1ce00 65 6e 74 20 67 72 6f 75 70 20 62 79 20 74 65 72  ent group by ter
1ce10 6d 73 20 69 6e 20 62 30 2c 62 31 2c 62 32 2c 2e  ms in b0,b1,b2,.
1ce20 2e 2e 0a 20 20 20 20 20 20 2a 2a 20 6f 76 65 72  ...      ** over
1ce30 20 74 6f 20 61 30 2c 61 31 2c 61 32 2e 20 20 49   to a0,a1,a2.  I
1ce40 74 20 74 68 65 6e 20 63 61 6c 6c 73 20 74 68 65  t then calls the
1ce50 20 6f 75 74 70 75 74 20 73 75 62 72 6f 75 74 69   output subrouti
1ce60 6e 65 0a 20 20 20 20 20 20 2a 2a 20 61 6e 64 20  ne.      ** and 
1ce70 72 65 73 65 74 73 20 74 68 65 20 61 67 67 72 65  resets the aggre
1ce80 67 61 74 65 20 61 63 63 75 6d 75 6c 61 74 6f 72  gate accumulator
1ce90 20 72 65 67 69 73 74 65 72 73 20 69 6e 20 70 72   registers in pr
1cea0 65 70 61 72 61 74 69 6f 6e 0a 20 20 20 20 20 20  eparation.      
1ceb0 2a 2a 20 66 6f 72 20 74 68 65 20 6e 65 78 74 20  ** for the next 
1cec0 47 52 4f 55 50 20 42 59 20 62 61 74 63 68 2e 0a  GROUP BY batch..
1ced0 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 73        */.      s
1cee0 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76  qlite3VdbeResolv
1cef0 65 4c 61 62 65 6c 28 76 2c 20 61 64 64 72 47 72  eLabel(v, addrGr
1cf00 6f 75 70 42 79 43 68 61 6e 67 65 29 3b 0a 20 20  oupByChange);.  
1cf10 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70      for(j=0; j<p
1cf20 47 72 6f 75 70 42 79 2d 3e 6e 45 78 70 72 3b 20  GroupBy->nExpr; 
1cf30 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 73 71  j++){.        sq
1cf40 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
1cf50 2c 20 4f 50 5f 4d 65 6d 4d 6f 76 65 2c 20 69 41  , OP_MemMove, iA
1cf60 4d 65 6d 2b 6a 2c 20 69 42 4d 65 6d 2b 6a 29 3b  Mem+j, iBMem+j);
1cf70 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73  .      }.      s
1cf80 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
1cf90 76 2c 20 4f 50 5f 47 6f 73 75 62 2c 20 30 2c 20  v, OP_Gosub, 0, 
1cfa0 61 64 64 72 4f 75 74 70 75 74 52 6f 77 29 3b 0a  addrOutputRow);.
1cfb0 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e        VdbeCommen
1cfc0 74 28 28 76 2c 20 22 23 20 6f 75 74 70 75 74 20  t((v, "# output 
1cfd0 6f 6e 65 20 72 6f 77 22 29 29 3b 0a 20 20 20 20  one row"));.    
1cfe0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
1cff0 4f 70 28 76 2c 20 4f 50 5f 49 66 4d 65 6d 50 6f  Op(v, OP_IfMemPo
1d000 73 2c 20 69 41 62 6f 72 74 46 6c 61 67 2c 20 61  s, iAbortFlag, a
1d010 64 64 72 45 6e 64 29 3b 0a 20 20 20 20 20 20 56  ddrEnd);.      V
1d020 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22  dbeComment((v, "
1d030 23 20 63 68 65 63 6b 20 61 62 6f 72 74 20 66 6c  # check abort fl
1d040 61 67 22 29 29 3b 0a 20 20 20 20 20 20 73 71 6c  ag"));.      sql
1d050 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
1d060 20 4f 50 5f 47 6f 73 75 62 2c 20 30 2c 20 61 64   OP_Gosub, 0, ad
1d070 64 72 52 65 73 65 74 29 3b 0a 20 20 20 20 20 20  drReset);.      
1d080 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20  VdbeComment((v, 
1d090 22 23 20 72 65 73 65 74 20 61 63 63 75 6d 75 6c  "# reset accumul
1d0a0 61 74 6f 72 22 29 29 3b 0a 0a 20 20 20 20 20 20  ator"));..      
1d0b0 2f 2a 20 55 70 64 61 74 65 20 74 68 65 20 61 67  /* Update the ag
1d0c0 67 72 65 67 61 74 65 20 61 63 63 75 6d 75 6c 61  gregate accumula
1d0d0 74 6f 72 73 20 62 61 73 65 64 20 6f 6e 20 74 68  tors based on th
1d0e0 65 20 63 6f 6e 74 65 6e 74 20 6f 66 0a 20 20 20  e content of.   
1d0f0 20 20 20 2a 2a 20 74 68 65 20 63 75 72 72 65 6e     ** the curren
1d100 74 20 72 6f 77 0a 20 20 20 20 20 20 2a 2f 0a 20  t row.      */. 
1d110 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
1d120 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20  ResolveLabel(v, 
1d130 61 64 64 72 50 72 6f 63 65 73 73 52 6f 77 29 3b  addrProcessRow);
1d140 0a 20 20 20 20 20 20 75 70 64 61 74 65 41 63 63  .      updateAcc
1d150 75 6d 75 6c 61 74 6f 72 28 70 50 61 72 73 65 2c  umulator(pParse,
1d160 20 26 73 41 67 67 49 6e 66 6f 29 3b 0a 20 20 20   &sAggInfo);.   
1d170 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
1d180 64 4f 70 28 76 2c 20 4f 50 5f 4d 65 6d 49 6e 74  dOp(v, OP_MemInt
1d190 2c 20 31 2c 20 69 55 73 65 46 6c 61 67 29 3b 0a  , 1, iUseFlag);.
1d1a0 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e        VdbeCommen
1d1b0 74 28 28 76 2c 20 22 23 20 69 6e 64 69 63 61 74  t((v, "# indicat
1d1c0 65 20 64 61 74 61 20 69 6e 20 61 63 63 75 6d 75  e data in accumu
1d1d0 6c 61 74 6f 72 22 29 29 3b 0a 0a 20 20 20 20 20  lator"));..     
1d1e0 20 2f 2a 20 45 6e 64 20 6f 66 20 74 68 65 20 6c   /* End of the l
1d1f0 6f 6f 70 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  oop.      */.   
1d200 20 20 20 69 66 28 20 67 72 6f 75 70 42 79 53 6f     if( groupBySo
1d210 72 74 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  rt ){.        sq
1d220 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
1d230 2c 20 4f 50 5f 4e 65 78 74 2c 20 73 41 67 67 49  , OP_Next, sAggI
1d240 6e 66 6f 2e 73 6f 72 74 69 6e 67 49 64 78 2c 20  nfo.sortingIdx, 
1d250 61 64 64 72 54 6f 70 4f 66 4c 6f 6f 70 29 3b 0a  addrTopOfLoop);.
1d260 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
1d270 20 20 20 20 20 73 71 6c 69 74 65 33 57 68 65 72       sqlite3Wher
1d280 65 45 6e 64 28 70 57 49 6e 66 6f 29 3b 0a 20 20  eEnd(pWInfo);.  
1d290 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
1d2a0 65 43 68 61 6e 67 65 54 6f 4e 6f 6f 70 28 76 2c  eChangeToNoop(v,
1d2b0 20 61 64 64 72 53 6f 72 74 69 6e 67 49 64 78 2c   addrSortingIdx,
1d2c0 20 31 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20   1);.      }..  
1d2d0 20 20 20 20 2f 2a 20 4f 75 74 70 75 74 20 74 68      /* Output th
1d2e0 65 20 66 69 6e 61 6c 20 72 6f 77 20 6f 66 20 72  e final row of r
1d2f0 65 73 75 6c 74 0a 20 20 20 20 20 20 2a 2f 0a 20  esult.      */. 
1d300 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
1d310 41 64 64 4f 70 28 76 2c 20 4f 50 5f 47 6f 73 75  AddOp(v, OP_Gosu
1d320 62 2c 20 30 2c 20 61 64 64 72 4f 75 74 70 75 74  b, 0, addrOutput
1d330 52 6f 77 29 3b 0a 20 20 20 20 20 20 56 64 62 65  Row);.      Vdbe
1d340 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 23 20 6f  Comment((v, "# o
1d350 75 74 70 75 74 20 66 69 6e 61 6c 20 72 6f 77 22  utput final row"
1d360 29 29 3b 0a 20 20 20 20 20 20 0a 20 20 20 20 7d  ));.      .    }
1d370 20 2f 2a 20 65 6e 64 69 66 20 70 47 72 6f 75 70   /* endif pGroup
1d380 42 79 20 2a 2f 0a 20 20 20 20 65 6c 73 65 20 7b  By */.    else {
1d390 0a 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20 63  .      /* This c
1d3a0 61 73 65 20 72 75 6e 73 20 69 66 20 74 68 65 20  ase runs if the 
1d3b0 61 67 67 72 65 67 61 74 65 20 68 61 73 20 6e 6f  aggregate has no
1d3c0 20 47 52 4f 55 50 20 42 59 20 63 6c 61 75 73 65   GROUP BY clause
1d3d0 2e 20 20 54 68 65 0a 20 20 20 20 20 20 2a 2a 20  .  The.      ** 
1d3e0 70 72 6f 63 65 73 73 69 6e 67 20 69 73 20 6d 75  processing is mu
1d3f0 63 68 20 73 69 6d 70 6c 65 72 20 73 69 6e 63 65  ch simpler since
1d400 20 74 68 65 72 65 20 69 73 20 6f 6e 6c 79 20 61   there is only a
1d410 20 73 69 6e 67 6c 65 20 72 6f 77 0a 20 20 20 20   single row.    
1d420 20 20 2a 2a 20 6f 66 20 6f 75 74 70 75 74 2e 0a    ** of output..
1d430 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 72        */.      r
1d440 65 73 65 74 41 63 63 75 6d 75 6c 61 74 6f 72 28  esetAccumulator(
1d450 70 50 61 72 73 65 2c 20 26 73 41 67 67 49 6e 66  pParse, &sAggInf
1d460 6f 29 3b 0a 20 20 20 20 20 20 70 57 49 6e 66 6f  o);.      pWInfo
1d470 20 3d 20 73 71 6c 69 74 65 33 57 68 65 72 65 42   = sqlite3WhereB
1d480 65 67 69 6e 28 70 50 61 72 73 65 2c 20 70 54 61  egin(pParse, pTa
1d490 62 4c 69 73 74 2c 20 70 57 68 65 72 65 2c 20 30  bList, pWhere, 0
1d4a0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 57 49  );.      if( pWI
1d4b0 6e 66 6f 3d 3d 30 20 29 20 67 6f 74 6f 20 73 65  nfo==0 ) goto se
1d4c0 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 20 20  lect_end;.      
1d4d0 75 70 64 61 74 65 41 63 63 75 6d 75 6c 61 74 6f  updateAccumulato
1d4e0 72 28 70 50 61 72 73 65 2c 20 26 73 41 67 67 49  r(pParse, &sAggI
1d4f0 6e 66 6f 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  nfo);.      sqli
1d500 74 65 33 57 68 65 72 65 45 6e 64 28 70 57 49 6e  te3WhereEnd(pWIn
1d510 66 6f 29 3b 0a 20 20 20 20 20 20 66 69 6e 61 6c  fo);.      final
1d520 69 7a 65 41 67 67 46 75 6e 63 74 69 6f 6e 73 28  izeAggFunctions(
1d530 70 50 61 72 73 65 2c 20 26 73 41 67 67 49 6e 66  pParse, &sAggInf
1d540 6f 29 3b 0a 20 20 20 20 20 20 70 4f 72 64 65 72  o);.      pOrder
1d550 42 79 20 3d 20 30 3b 0a 20 20 20 20 20 20 69 66  By = 0;.      if
1d560 28 20 70 48 61 76 69 6e 67 20 29 7b 0a 20 20 20  ( pHaving ){.   
1d570 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
1d580 49 66 46 61 6c 73 65 28 70 50 61 72 73 65 2c 20  IfFalse(pParse, 
1d590 70 48 61 76 69 6e 67 2c 20 61 64 64 72 45 6e 64  pHaving, addrEnd
1d5a0 2c 20 31 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  , 1);.      }.  
1d5b0 20 20 20 20 73 65 6c 65 63 74 49 6e 6e 65 72 4c      selectInnerL
1d5c0 6f 6f 70 28 70 50 61 72 73 65 2c 20 70 2c 20 70  oop(pParse, p, p
1d5d0 2d 3e 70 45 4c 69 73 74 2c 20 30 2c 20 30 2c 20  ->pEList, 0, 0, 
1d5e0 30 2c 20 2d 31 2c 20 0a 20 20 20 20 20 20 20 20  0, -1, .        
1d5f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 65 44                eD
1d600 65 73 74 2c 20 69 50 61 72 6d 2c 20 61 64 64 72  est, iParm, addr
1d610 45 6e 64 2c 20 61 64 64 72 45 6e 64 2c 20 61 66  End, addrEnd, af
1d620 66 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71  f);.    }.    sq
1d630 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65  lite3VdbeResolve
1d640 4c 61 62 65 6c 28 76 2c 20 61 64 64 72 45 6e 64  Label(v, addrEnd
1d650 29 3b 0a 20 20 20 20 0a 20 20 7d 20 2f 2a 20 65  );.    .  } /* e
1d660 6e 64 69 66 20 61 67 67 72 65 67 61 74 65 20 71  ndif aggregate q
1d670 75 65 72 79 20 2a 2f 0a 0a 20 20 2f 2a 20 49 66  uery */..  /* If
1d680 20 74 68 65 72 65 20 69 73 20 61 6e 20 4f 52 44   there is an ORD
1d690 45 52 20 42 59 20 63 6c 61 75 73 65 2c 20 74 68  ER BY clause, th
1d6a0 65 6e 20 77 65 20 6e 65 65 64 20 74 6f 20 73 6f  en we need to so
1d6b0 72 74 20 74 68 65 20 72 65 73 75 6c 74 73 0a 20  rt the results. 
1d6c0 20 2a 2a 20 61 6e 64 20 73 65 6e 64 20 74 68 65   ** and send the
1d6d0 6d 20 74 6f 20 74 68 65 20 63 61 6c 6c 62 61 63  m to the callbac
1d6e0 6b 20 6f 6e 65 20 62 79 20 6f 6e 65 2e 0a 20 20  k one by one..  
1d6f0 2a 2f 0a 20 20 69 66 28 20 70 4f 72 64 65 72 42  */.  if( pOrderB
1d700 79 20 29 7b 0a 20 20 20 20 67 65 6e 65 72 61 74  y ){.    generat
1d710 65 53 6f 72 74 54 61 69 6c 28 70 50 61 72 73 65  eSortTail(pParse
1d720 2c 20 70 2c 20 76 2c 20 70 45 4c 69 73 74 2d 3e  , p, v, pEList->
1d730 6e 45 78 70 72 2c 20 65 44 65 73 74 2c 20 69 50  nExpr, eDest, iP
1d740 61 72 6d 29 3b 0a 20 20 7d 0a 0a 23 69 66 6e 64  arm);.  }..#ifnd
1d750 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53  ef SQLITE_OMIT_S
1d760 55 42 51 55 45 52 59 0a 20 20 2f 2a 20 49 66 20  UBQUERY.  /* If 
1d770 74 68 69 73 20 77 61 73 20 61 20 73 75 62 71 75  this was a subqu
1d780 65 72 79 2c 20 77 65 20 68 61 76 65 20 6e 6f 77  ery, we have now
1d790 20 63 6f 6e 76 65 72 74 65 64 20 74 68 65 20 73   converted the s
1d7a0 75 62 71 75 65 72 79 20 69 6e 74 6f 20 61 0a 20  ubquery into a. 
1d7b0 20 2a 2a 20 74 65 6d 70 6f 72 61 72 79 20 74 61   ** temporary ta
1d7c0 62 6c 65 2e 20 20 53 6f 20 73 65 74 20 74 68 65  ble.  So set the
1d7d0 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 2e 69 73   SrcList_item.is
1d7e0 50 6f 70 75 6c 61 74 65 64 20 66 6c 61 67 20 74  Populated flag t
1d7f0 6f 20 70 72 65 76 65 6e 74 0a 20 20 2a 2a 20 74  o prevent.  ** t
1d800 68 69 73 20 73 75 62 71 75 65 72 79 20 66 72 6f  his subquery fro
1d810 6d 20 62 65 69 6e 67 20 65 76 61 6c 75 61 74 65  m being evaluate
1d820 64 20 61 67 61 69 6e 20 61 6e 64 20 74 6f 20 66  d again and to f
1d830 6f 72 63 65 20 74 68 65 20 75 73 65 20 6f 66 0a  orce the use of.
1d840 20 20 2a 2a 20 74 68 65 20 74 65 6d 70 6f 72 61    ** the tempora
1d850 72 79 20 74 61 62 6c 65 2e 0a 20 20 2a 2f 0a 20  ry table..  */. 
1d860 20 69 66 28 20 70 50 61 72 65 6e 74 20 29 7b 0a   if( pParent ){.
1d870 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 72      assert( pPar
1d880 65 6e 74 2d 3e 70 53 72 63 2d 3e 6e 53 72 63 3e  ent->pSrc->nSrc>
1d890 70 61 72 65 6e 74 54 61 62 20 29 3b 0a 20 20 20  parentTab );.   
1d8a0 20 61 73 73 65 72 74 28 20 70 50 61 72 65 6e 74   assert( pParent
1d8b0 2d 3e 70 53 72 63 2d 3e 61 5b 70 61 72 65 6e 74  ->pSrc->a[parent
1d8c0 54 61 62 5d 2e 70 53 65 6c 65 63 74 3d 3d 70 20  Tab].pSelect==p 
1d8d0 29 3b 0a 20 20 20 20 70 50 61 72 65 6e 74 2d 3e  );.    pParent->
1d8e0 70 53 72 63 2d 3e 61 5b 70 61 72 65 6e 74 54 61  pSrc->a[parentTa
1d8f0 62 5d 2e 69 73 50 6f 70 75 6c 61 74 65 64 20 3d  b].isPopulated =
1d900 20 31 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a   1;.  }.#endif..
1d910 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20 74    /* Jump here t
1d920 6f 20 73 6b 69 70 20 74 68 69 73 20 71 75 65 72  o skip this quer
1d930 79 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  y.  */.  sqlite3
1d940 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c  VdbeResolveLabel
1d950 28 76 2c 20 69 45 6e 64 29 3b 0a 0a 20 20 2f 2a  (v, iEnd);..  /*
1d960 20 54 68 65 20 53 45 4c 45 43 54 20 77 61 73 20   The SELECT was 
1d970 73 75 63 63 65 73 73 66 75 6c 6c 79 20 63 6f 64  successfully cod
1d980 65 64 2e 20 20 20 53 65 74 20 74 68 65 20 72 65  ed.   Set the re
1d990 74 75 72 6e 20 63 6f 64 65 20 74 6f 20 30 0a 20  turn code to 0. 
1d9a0 20 2a 2a 20 74 6f 20 69 6e 64 69 63 61 74 65 20   ** to indicate 
1d9b0 6e 6f 20 65 72 72 6f 72 73 2e 0a 20 20 2a 2f 0a  no errors..  */.
1d9c0 20 20 72 63 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20    rc = 0;..  /* 
1d9d0 43 6f 6e 74 72 6f 6c 20 6a 75 6d 70 73 20 74 6f  Control jumps to
1d9e0 20 68 65 72 65 20 69 66 20 61 6e 20 65 72 72 6f   here if an erro
1d9f0 72 20 69 73 20 65 6e 63 6f 75 6e 74 65 72 65 64  r is encountered
1da00 20 61 62 6f 76 65 2c 20 6f 72 20 75 70 6f 6e 0a   above, or upon.
1da10 20 20 2a 2a 20 73 75 63 63 65 73 73 66 75 6c 20    ** successful 
1da20 63 6f 64 69 6e 67 20 6f 66 20 74 68 65 20 53 45  coding of the SE
1da30 4c 45 43 54 2e 0a 20 20 2a 2f 0a 73 65 6c 65 63  LECT..  */.selec
1da40 74 5f 65 6e 64 3a 0a 0a 20 20 2f 2a 20 49 64 65  t_end:..  /* Ide
1da50 6e 74 69 66 79 20 63 6f 6c 75 6d 6e 20 6e 61 6d  ntify column nam
1da60 65 73 20 69 66 20 77 65 20 77 69 6c 6c 20 62 65  es if we will be
1da70 20 75 73 69 6e 67 20 74 68 65 6d 20 69 6e 20 61   using them in a
1da80 20 63 61 6c 6c 62 61 63 6b 2e 20 20 54 68 69 73   callback.  This
1da90 0a 20 20 2a 2a 20 73 74 65 70 20 69 73 20 73 6b  .  ** step is sk
1daa0 69 70 70 65 64 20 69 66 20 74 68 65 20 6f 75 74  ipped if the out
1dab0 70 75 74 20 69 73 20 67 6f 69 6e 67 20 74 6f 20  put is going to 
1dac0 73 6f 6d 65 20 6f 74 68 65 72 20 64 65 73 74 69  some other desti
1dad0 6e 61 74 69 6f 6e 2e 0a 20 20 2a 2f 0a 20 20 69  nation..  */.  i
1dae0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
1daf0 20 26 26 20 65 44 65 73 74 3d 3d 53 52 54 5f 43   && eDest==SRT_C
1db00 61 6c 6c 62 61 63 6b 20 29 7b 0a 20 20 20 20 67  allback ){.    g
1db10 65 6e 65 72 61 74 65 43 6f 6c 75 6d 6e 4e 61 6d  enerateColumnNam
1db20 65 73 28 70 50 61 72 73 65 2c 20 70 54 61 62 4c  es(pParse, pTabL
1db30 69 73 74 2c 20 70 45 4c 69 73 74 29 3b 0a 20 20  ist, pEList);.  
1db40 7d 0a 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65  }..  sqlite3_fre
1db50 65 28 73 41 67 67 49 6e 66 6f 2e 61 43 6f 6c 29  e(sAggInfo.aCol)
1db60 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65  ;.  sqlite3_free
1db70 28 73 41 67 67 49 6e 66 6f 2e 61 46 75 6e 63 29  (sAggInfo.aFunc)
1db80 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
1db90 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 51  ..#if defined(SQ
1dba0 4c 49 54 45 5f 44 45 42 55 47 29 0a 2f 2a 0a 2a  LITE_DEBUG)./*.*
1dbb0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1dbc0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1dbd0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1dbe0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1dbf0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a  **************.*
1dc00 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  * The following 
1dc10 63 6f 64 65 20 69 73 20 75 73 65 64 20 66 6f 72  code is used for
1dc20 20 74 65 73 74 69 6e 67 20 61 6e 64 20 64 65 62   testing and deb
1dc30 75 67 67 69 6e 67 20 6f 6e 6c 79 2e 20 20 54 68  ugging only.  Th
1dc40 65 20 63 6f 64 65 0a 2a 2a 20 74 68 61 74 20 66  e code.** that f
1dc50 6f 6c 6c 6f 77 73 20 64 6f 65 73 20 6e 6f 74 20  ollows does not 
1dc60 61 70 70 65 61 72 20 69 6e 20 6e 6f 72 6d 61 6c  appear in normal
1dc70 20 62 75 69 6c 64 73 2e 0a 2a 2a 0a 2a 2a 20 54   builds..**.** T
1dc80 68 65 73 65 20 72 6f 75 74 69 6e 65 73 20 61 72  hese routines ar
1dc90 65 20 75 73 65 64 20 74 6f 20 70 72 69 6e 74 20  e used to print 
1dca0 6f 75 74 20 74 68 65 20 63 6f 6e 74 65 6e 74 20  out the content 
1dcb0 6f 66 20 61 6c 6c 20 6f 72 20 70 61 72 74 20 6f  of all or part o
1dcc0 66 20 61 20 0a 2a 2a 20 70 61 72 73 65 20 73 74  f a .** parse st
1dcd0 72 75 63 74 75 72 65 73 20 73 75 63 68 20 61 73  ructures such as
1dce0 20 53 65 6c 65 63 74 20 6f 72 20 45 78 70 72 2e   Select or Expr.
1dcf0 20 20 53 75 63 68 20 70 72 69 6e 74 6f 75 74 73    Such printouts
1dd00 20 61 72 65 20 75 73 65 66 75 6c 0a 2a 2a 20 66   are useful.** f
1dd10 6f 72 20 68 65 6c 70 69 6e 67 20 74 6f 20 75 6e  or helping to un
1dd20 64 65 72 73 74 61 6e 64 20 77 68 61 74 20 69 73  derstand what is
1dd30 20 68 61 70 70 65 6e 69 6e 67 20 69 6e 73 69 64   happening insid
1dd40 65 20 74 68 65 20 63 6f 64 65 20 67 65 6e 65 72  e the code gener
1dd50 61 74 6f 72 0a 2a 2a 20 64 75 72 69 6e 67 20 74  ator.** during t
1dd60 68 65 20 65 78 65 63 75 74 69 6f 6e 20 6f 66 20  he execution of 
1dd70 63 6f 6d 70 6c 65 78 20 53 45 4c 45 43 54 20 73  complex SELECT s
1dd80 74 61 74 65 6d 65 6e 74 73 2e 0a 2a 2a 0a 2a 2a  tatements..**.**
1dd90 20 54 68 65 73 65 20 72 6f 75 74 69 6e 65 20 61   These routine a
1dda0 72 65 20 6e 6f 74 20 63 61 6c 6c 65 64 20 61 6e  re not called an
1ddb0 79 77 68 65 72 65 20 66 72 6f 6d 20 77 69 74 68  ywhere from with
1ddc0 69 6e 20 74 68 65 20 6e 6f 72 6d 61 6c 0a 2a 2a  in the normal.**
1ddd0 20 63 6f 64 65 20 62 61 73 65 2e 20 20 54 68 65   code base.  The
1dde0 6e 20 61 72 65 20 69 6e 74 65 6e 64 65 64 20 74  n are intended t
1ddf0 6f 20 62 65 20 63 61 6c 6c 65 64 20 66 72 6f 6d  o be called from
1de00 20 77 69 74 68 69 6e 20 74 68 65 20 64 65 62 75   within the debu
1de10 67 67 65 72 0a 2a 2a 20 6f 72 20 66 72 6f 6d 20  gger.** or from 
1de20 74 65 6d 70 6f 72 61 72 79 20 22 70 72 69 6e 74  temporary "print
1de30 66 22 20 73 74 61 74 65 6d 65 6e 74 73 20 69 6e  f" statements in
1de40 73 65 72 74 65 64 20 66 6f 72 20 64 65 62 75 67  serted for debug
1de50 67 69 6e 67 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  ging..*/.void sq
1de60 6c 69 74 65 33 50 72 69 6e 74 45 78 70 72 28 45  lite3PrintExpr(E
1de70 78 70 72 20 2a 70 29 7b 0a 20 20 69 66 28 20 70  xpr *p){.  if( p
1de80 2d 3e 74 6f 6b 65 6e 2e 7a 20 26 26 20 70 2d 3e  ->token.z && p->
1de90 74 6f 6b 65 6e 2e 6e 3e 30 20 29 7b 0a 20 20 20  token.n>0 ){.   
1dea0 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69   sqlite3DebugPri
1deb0 6e 74 66 28 22 28 25 2e 2a 73 22 2c 20 70 2d 3e  ntf("(%.*s", p->
1dec0 74 6f 6b 65 6e 2e 6e 2c 20 70 2d 3e 74 6f 6b 65  token.n, p->toke
1ded0 6e 2e 7a 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  n.z);.  }else{. 
1dee0 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50     sqlite3DebugP
1def0 72 69 6e 74 66 28 22 28 25 64 22 2c 20 70 2d 3e  rintf("(%d", p->
1df00 6f 70 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  op);.  }.  if( p
1df10 2d 3e 70 4c 65 66 74 20 29 7b 0a 20 20 20 20 73  ->pLeft ){.    s
1df20 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74  qlite3DebugPrint
1df30 66 28 22 20 22 29 3b 0a 20 20 20 20 73 71 6c 69  f(" ");.    sqli
1df40 74 65 33 50 72 69 6e 74 45 78 70 72 28 70 2d 3e  te3PrintExpr(p->
1df50 70 4c 65 66 74 29 3b 0a 20 20 7d 0a 20 20 69 66  pLeft);.  }.  if
1df60 28 20 70 2d 3e 70 52 69 67 68 74 20 29 7b 0a 20  ( p->pRight ){. 
1df70 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50     sqlite3DebugP
1df80 72 69 6e 74 66 28 22 20 22 29 3b 0a 20 20 20 20  rintf(" ");.    
1df90 73 71 6c 69 74 65 33 50 72 69 6e 74 45 78 70 72  sqlite3PrintExpr
1dfa0 28 70 2d 3e 70 52 69 67 68 74 29 3b 0a 20 20 7d  (p->pRight);.  }
1dfb0 0a 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50  .  sqlite3DebugP
1dfc0 72 69 6e 74 66 28 22 29 22 29 3b 0a 7d 0a 76 6f  rintf(")");.}.vo
1dfd0 69 64 20 73 71 6c 69 74 65 33 50 72 69 6e 74 45  id sqlite3PrintE
1dfe0 78 70 72 4c 69 73 74 28 45 78 70 72 4c 69 73 74  xprList(ExprList
1dff0 20 2a 70 4c 69 73 74 29 7b 0a 20 20 69 6e 74 20   *pList){.  int 
1e000 69 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  i;.  for(i=0; i<
1e010 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b  pList->nExpr; i+
1e020 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 50  +){.    sqlite3P
1e030 72 69 6e 74 45 78 70 72 28 70 4c 69 73 74 2d 3e  rintExpr(pList->
1e040 61 5b 69 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20  a[i].pExpr);.   
1e050 20 69 66 28 20 69 3c 70 4c 69 73 74 2d 3e 6e 45   if( i<pList->nE
1e060 78 70 72 2d 31 20 29 7b 0a 20 20 20 20 20 20 73  xpr-1 ){.      s
1e070 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74  qlite3DebugPrint
1e080 66 28 22 2c 20 22 29 3b 0a 20 20 20 20 7d 0a 20  f(", ");.    }. 
1e090 20 7d 0a 7d 0a 76 6f 69 64 20 73 71 6c 69 74 65   }.}.void sqlite
1e0a0 33 50 72 69 6e 74 53 65 6c 65 63 74 28 53 65 6c  3PrintSelect(Sel
1e0b0 65 63 74 20 2a 70 2c 20 69 6e 74 20 69 6e 64 65  ect *p, int inde
1e0c0 6e 74 29 7b 0a 20 20 73 71 6c 69 74 65 33 44 65  nt){.  sqlite3De
1e0d0 62 75 67 50 72 69 6e 74 66 28 22 25 2a 73 53 45  bugPrintf("%*sSE
1e0e0 4c 45 43 54 28 25 70 29 20 22 2c 20 69 6e 64 65  LECT(%p) ", inde
1e0f0 6e 74 2c 20 22 22 2c 20 70 29 3b 0a 20 20 73 71  nt, "", p);.  sq
1e100 6c 69 74 65 33 50 72 69 6e 74 45 78 70 72 4c 69  lite3PrintExprLi
1e110 73 74 28 70 2d 3e 70 45 4c 69 73 74 29 3b 0a 20  st(p->pEList);. 
1e120 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69   sqlite3DebugPri
1e130 6e 74 66 28 22 5c 6e 22 29 3b 0a 20 20 69 66 28  ntf("\n");.  if(
1e140 20 70 2d 3e 70 53 72 63 20 29 7b 0a 20 20 20 20   p->pSrc ){.    
1e150 63 68 61 72 20 2a 7a 50 72 65 66 69 78 3b 0a 20  char *zPrefix;. 
1e160 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 7a 50     int i;.    zP
1e170 72 65 66 69 78 20 3d 20 22 46 52 4f 4d 22 3b 0a  refix = "FROM";.
1e180 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70      for(i=0; i<p
1e190 2d 3e 70 53 72 63 2d 3e 6e 53 72 63 3b 20 69 2b  ->pSrc->nSrc; i+
1e1a0 2b 29 7b 0a 20 20 20 20 20 20 73 74 72 75 63 74  +){.      struct
1e1b0 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70   SrcList_item *p
1e1c0 49 74 65 6d 20 3d 20 26 70 2d 3e 70 53 72 63 2d  Item = &p->pSrc-
1e1d0 3e 61 5b 69 5d 3b 0a 20 20 20 20 20 20 73 71 6c  >a[i];.      sql
1e1e0 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28  ite3DebugPrintf(
1e1f0 22 25 2a 73 20 22 2c 20 69 6e 64 65 6e 74 2b 36  "%*s ", indent+6
1e200 2c 20 7a 50 72 65 66 69 78 29 3b 0a 20 20 20 20  , zPrefix);.    
1e210 20 20 7a 50 72 65 66 69 78 20 3d 20 22 22 3b 0a    zPrefix = "";.
1e220 20 20 20 20 20 20 69 66 28 20 70 49 74 65 6d 2d        if( pItem-
1e230 3e 70 53 65 6c 65 63 74 20 29 7b 0a 20 20 20 20  >pSelect ){.    
1e240 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67      sqlite3Debug
1e250 50 72 69 6e 74 66 28 22 28 5c 6e 22 29 3b 0a 20  Printf("(\n");. 
1e260 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 72         sqlite3Pr
1e270 69 6e 74 53 65 6c 65 63 74 28 70 49 74 65 6d 2d  intSelect(pItem-
1e280 3e 70 53 65 6c 65 63 74 2c 20 69 6e 64 65 6e 74  >pSelect, indent
1e290 2b 31 30 29 3b 0a 20 20 20 20 20 20 20 20 73 71  +10);.        sq
1e2a0 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66  lite3DebugPrintf
1e2b0 28 22 25 2a 73 29 22 2c 20 69 6e 64 65 6e 74 2b  ("%*s)", indent+
1e2c0 38 2c 20 22 22 29 3b 0a 20 20 20 20 20 20 7d 65  8, "");.      }e
1e2d0 6c 73 65 20 69 66 28 20 70 49 74 65 6d 2d 3e 7a  lse if( pItem->z
1e2e0 4e 61 6d 65 20 29 7b 0a 20 20 20 20 20 20 20 20  Name ){.        
1e2f0 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e  sqlite3DebugPrin
1e300 74 66 28 22 25 73 22 2c 20 70 49 74 65 6d 2d 3e  tf("%s", pItem->
1e310 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 7d 0a  zName);.      }.
1e320 20 20 20 20 20 20 69 66 28 20 70 49 74 65 6d 2d        if( pItem-
1e330 3e 70 54 61 62 20 29 7b 0a 20 20 20 20 20 20 20  >pTab ){.       
1e340 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69   sqlite3DebugPri
1e350 6e 74 66 28 22 28 74 61 62 6c 65 3a 20 25 73 29  ntf("(table: %s)
1e360 22 2c 20 70 49 74 65 6d 2d 3e 70 54 61 62 2d 3e  ", pItem->pTab->
1e370 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 7d 0a  zName);.      }.
1e380 20 20 20 20 20 20 69 66 28 20 70 49 74 65 6d 2d        if( pItem-
1e390 3e 7a 41 6c 69 61 73 20 29 7b 0a 20 20 20 20 20  >zAlias ){.     
1e3a0 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50     sqlite3DebugP
1e3b0 72 69 6e 74 66 28 22 20 41 53 20 25 73 22 2c 20  rintf(" AS %s", 
1e3c0 70 49 74 65 6d 2d 3e 7a 41 6c 69 61 73 29 3b 0a  pItem->zAlias);.
1e3d0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
1e3e0 28 20 69 3c 70 2d 3e 70 53 72 63 2d 3e 6e 53 72  ( i<p->pSrc->nSr
1e3f0 63 2d 31 20 29 7b 0a 20 20 20 20 20 20 20 20 73  c-1 ){.        s
1e400 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74  qlite3DebugPrint
1e410 66 28 22 2c 22 29 3b 0a 20 20 20 20 20 20 7d 0a  f(",");.      }.
1e420 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 65 62        sqlite3Deb
1e430 75 67 50 72 69 6e 74 66 28 22 5c 6e 22 29 3b 0a  ugPrintf("\n");.
1e440 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20      }.  }.  if( 
1e450 70 2d 3e 70 57 68 65 72 65 20 29 7b 0a 20 20 20  p->pWhere ){.   
1e460 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69   sqlite3DebugPri
1e470 6e 74 66 28 22 25 2a 73 20 57 48 45 52 45 20 22  ntf("%*s WHERE "
1e480 2c 20 69 6e 64 65 6e 74 2c 20 22 22 29 3b 0a 20  , indent, "");. 
1e490 20 20 20 73 71 6c 69 74 65 33 50 72 69 6e 74 45     sqlite3PrintE
1e4a0 78 70 72 28 70 2d 3e 70 57 68 65 72 65 29 3b 0a  xpr(p->pWhere);.
1e4b0 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67      sqlite3Debug
1e4c0 50 72 69 6e 74 66 28 22 5c 6e 22 29 3b 0a 20 20  Printf("\n");.  
1e4d0 7d 0a 20 20 69 66 28 20 70 2d 3e 70 47 72 6f 75  }.  if( p->pGrou
1e4e0 70 42 79 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  pBy ){.    sqlit
1e4f0 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 25  e3DebugPrintf("%
1e500 2a 73 20 47 52 4f 55 50 20 42 59 20 22 2c 20 69  *s GROUP BY ", i
1e510 6e 64 65 6e 74 2c 20 22 22 29 3b 0a 20 20 20 20  ndent, "");.    
1e520 73 71 6c 69 74 65 33 50 72 69 6e 74 45 78 70 72  sqlite3PrintExpr
1e530 4c 69 73 74 28 70 2d 3e 70 47 72 6f 75 70 42 79  List(p->pGroupBy
1e540 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 65  );.    sqlite3De
1e550 62 75 67 50 72 69 6e 74 66 28 22 5c 6e 22 29 3b  bugPrintf("\n");
1e560 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e 70 48  .  }.  if( p->pH
1e570 61 76 69 6e 67 20 29 7b 0a 20 20 20 20 73 71 6c  aving ){.    sql
1e580 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28  ite3DebugPrintf(
1e590 22 25 2a 73 20 48 41 56 49 4e 47 20 22 2c 20 69  "%*s HAVING ", i
1e5a0 6e 64 65 6e 74 2c 20 22 22 29 3b 0a 20 20 20 20  ndent, "");.    
1e5b0 73 71 6c 69 74 65 33 50 72 69 6e 74 45 78 70 72  sqlite3PrintExpr
1e5c0 28 70 2d 3e 70 48 61 76 69 6e 67 29 3b 0a 20 20  (p->pHaving);.  
1e5d0 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72    sqlite3DebugPr
1e5e0 69 6e 74 66 28 22 5c 6e 22 29 3b 0a 20 20 7d 0a  intf("\n");.  }.
1e5f0 20 20 69 66 28 20 70 2d 3e 70 4f 72 64 65 72 42    if( p->pOrderB
1e600 79 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  y ){.    sqlite3
1e610 44 65 62 75 67 50 72 69 6e 74 66 28 22 25 2a 73  DebugPrintf("%*s
1e620 20 4f 52 44 45 52 20 42 59 20 22 2c 20 69 6e 64   ORDER BY ", ind
1e630 65 6e 74 2c 20 22 22 29 3b 0a 20 20 20 20 73 71  ent, "");.    sq
1e640 6c 69 74 65 33 50 72 69 6e 74 45 78 70 72 4c 69  lite3PrintExprLi
1e650 73 74 28 70 2d 3e 70 4f 72 64 65 72 42 79 29 3b  st(p->pOrderBy);
1e660 0a 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75  .    sqlite3Debu
1e670 67 50 72 69 6e 74 66 28 22 5c 6e 22 29 3b 0a 20  gPrintf("\n");. 
1e680 20 7d 0a 7d 0a 2f 2a 20 45 6e 64 20 6f 66 20 74   }.}./* End of t
1e690 68 65 20 73 74 72 75 63 74 75 72 65 20 64 65 62  he structure deb
1e6a0 75 67 20 70 72 69 6e 74 69 6e 67 20 63 6f 64 65  ug printing code
1e6b0 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  .***************
1e6c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1e6d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1e6e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1e6f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a  **************/.
1e700 23 65 6e 64 69 66 20 2f 2a 20 64 65 66 69 6e 65  #endif /* define
1e710 64 28 53 51 4c 49 54 45 5f 54 45 53 54 29 20 7c  d(SQLITE_TEST) |
1e720 7c 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45  | defined(SQLITE
1e730 5f 44 45 42 55 47 29 20 2a 2f 0a                 _DEBUG) */.