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

Artifact 30110ce6ce891dcb93a922ee4a51946983df0a33:


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 38 34  select.c,v 1.384
0200: 20 32 30 30 38 2f 30 31 2f 30 34 20 32 32 3a 30   2008/01/04 22:0
0210: 31 3a 30 33 20 64 72 68 20 45 78 70 20 24 0a 2a  1:03 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 2c 20 30 29 3b 0a 20 20 73 71 6c 69 74  rBy, 0);.  sqlit
3000: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
3010: 4f 50 5f 53 65 71 75 65 6e 63 65 2c 20 70 4f 72  OP_Sequence, pOr
3020: 64 65 72 42 79 2d 3e 69 45 43 75 72 73 6f 72 2c  derBy->iECursor,
3030: 20 30 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64   0);.  sqlite3Vd
3040: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 50  beAddOp2(v, OP_P
3050: 75 6c 6c 2c 20 70 4f 72 64 65 72 42 79 2d 3e 6e  ull, pOrderBy->n
3060: 45 78 70 72 20 2b 20 31 2c 20 30 29 3b 0a 20 20  Expr + 1, 0);.  
3070: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
3080: 32 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f  2(v, OP_MakeReco
3090: 72 64 2c 20 70 4f 72 64 65 72 42 79 2d 3e 6e 45  rd, pOrderBy->nE
30a0: 78 70 72 20 2b 20 32 2c 20 30 29 3b 0a 20 20 73  xpr + 2, 0);.  s
30b0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
30c0: 28 76 2c 20 4f 50 5f 49 64 78 49 6e 73 65 72 74  (v, OP_IdxInsert
30d0: 2c 20 70 4f 72 64 65 72 42 79 2d 3e 69 45 43 75  , pOrderBy->iECu
30e0: 72 73 6f 72 2c 20 30 29 3b 0a 20 20 69 66 28 20  rsor, 0);.  if( 
30f0: 70 53 65 6c 65 63 74 2d 3e 69 4c 69 6d 69 74 3e  pSelect->iLimit>
3100: 3d 30 20 29 7b 0a 20 20 20 20 69 6e 74 20 61 64  =0 ){.    int ad
3110: 64 72 31 2c 20 61 64 64 72 32 3b 0a 20 20 20 20  dr1, addr2;.    
3120: 61 64 64 72 31 20 3d 20 73 71 6c 69 74 65 33 56  addr1 = sqlite3V
3130: 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
3140: 49 66 4d 65 6d 5a 65 72 6f 2c 20 70 53 65 6c 65  IfMemZero, pSele
3150: 63 74 2d 3e 69 4c 69 6d 69 74 2b 31 2c 20 30 29  ct->iLimit+1, 0)
3160: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
3170: 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4d 65  eAddOp2(v, OP_Me
3180: 6d 49 6e 63 72 2c 20 2d 31 2c 20 70 53 65 6c 65  mIncr, -1, pSele
3190: 63 74 2d 3e 69 4c 69 6d 69 74 2b 31 29 3b 0a 20  ct->iLimit+1);. 
31a0: 20 20 20 61 64 64 72 32 20 3d 20 73 71 6c 69 74     addr2 = sqlit
31b0: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
31c0: 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 30 29 3b 0a  OP_Goto, 0, 0);.
31d0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a      sqlite3VdbeJ
31e0: 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72 31  umpHere(v, addr1
31f0: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
3200: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4c  beAddOp2(v, OP_L
3210: 61 73 74 2c 20 70 4f 72 64 65 72 42 79 2d 3e 69  ast, pOrderBy->i
3220: 45 43 75 72 73 6f 72 2c 20 30 29 3b 0a 20 20 20  ECursor, 0);.   
3230: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
3240: 70 32 28 76 2c 20 4f 50 5f 44 65 6c 65 74 65 2c  p2(v, OP_Delete,
3250: 20 70 4f 72 64 65 72 42 79 2d 3e 69 45 43 75 72   pOrderBy->iECur
3260: 73 6f 72 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c  sor, 0);.    sql
3270: 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65  ite3VdbeJumpHere
3280: 28 76 2c 20 61 64 64 72 32 29 3b 0a 20 20 20 20  (v, addr2);.    
3290: 70 53 65 6c 65 63 74 2d 3e 69 4c 69 6d 69 74 20  pSelect->iLimit 
32a0: 3d 20 2d 31 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  = -1;.  }.}../*.
32b0: 2a 2a 20 41 64 64 20 63 6f 64 65 20 74 6f 20 69  ** Add code to i
32c0: 6d 70 6c 65 6d 65 6e 74 20 74 68 65 20 4f 46 46  mplement the OFF
32d0: 53 45 54 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  SET.*/.static vo
32e0: 69 64 20 63 6f 64 65 4f 66 66 73 65 74 28 0a 20  id codeOffset(. 
32f0: 20 56 64 62 65 20 2a 76 2c 20 20 20 20 20 20 20   Vdbe *v,       
3300: 20 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63     /* Generate c
3310: 6f 64 65 20 69 6e 74 6f 20 74 68 69 73 20 56 4d  ode into this VM
3320: 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 2c   */.  Select *p,
3330: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 53          /* The S
3340: 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20  ELECT statement 
3350: 62 65 69 6e 67 20 63 6f 64 65 64 20 2a 2f 0a 20  being coded */. 
3360: 20 69 6e 74 20 69 43 6f 6e 74 69 6e 75 65 2c 20   int iContinue, 
3370: 20 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20     /* Jump here 
3380: 74 6f 20 73 6b 69 70 20 74 68 65 20 63 75 72 72  to skip the curr
3390: 65 6e 74 20 72 65 63 6f 72 64 20 2a 2f 0a 20 20  ent record */.  
33a0: 69 6e 74 20 6e 50 6f 70 20 20 20 20 20 20 20 20  int nPop        
33b0: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 74    /* Number of t
33c0: 69 6d 65 73 20 74 6f 20 70 6f 70 20 73 74 61 63  imes to pop stac
33d0: 6b 20 77 68 65 6e 20 6a 75 6d 70 69 6e 67 20 2a  k when jumping *
33e0: 2f 0a 29 7b 0a 20 20 69 66 28 20 70 2d 3e 69 4f  /.){.  if( p->iO
33f0: 66 66 73 65 74 3e 3d 30 20 26 26 20 69 43 6f 6e  ffset>=0 && iCon
3400: 74 69 6e 75 65 21 3d 30 20 29 7b 0a 20 20 20 20  tinue!=0 ){.    
3410: 69 6e 74 20 61 64 64 72 3b 0a 20 20 20 20 73 71  int addr;.    sq
3420: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
3430: 76 2c 20 4f 50 5f 4d 65 6d 49 6e 63 72 2c 20 2d  v, OP_MemIncr, -
3440: 31 2c 20 70 2d 3e 69 4f 66 66 73 65 74 29 3b 0a  1, p->iOffset);.
3450: 20 20 20 20 61 64 64 72 20 3d 20 73 71 6c 69 74      addr = sqlit
3460: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
3470: 4f 50 5f 49 66 4d 65 6d 4e 65 67 2c 20 70 2d 3e  OP_IfMemNeg, p->
3480: 69 4f 66 66 73 65 74 2c 20 30 29 3b 0a 20 20 20  iOffset, 0);.   
3490: 20 69 66 28 20 6e 50 6f 70 3e 30 20 29 7b 0a 20   if( nPop>0 ){. 
34a0: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
34b0: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 50 6f 70  AddOp2(v, OP_Pop
34c0: 2c 20 6e 50 6f 70 2c 20 30 29 3b 0a 20 20 20 20  , nPop, 0);.    
34d0: 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  }.    sqlite3Vdb
34e0: 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f  eAddOp2(v, OP_Go
34f0: 74 6f 2c 20 30 2c 20 69 43 6f 6e 74 69 6e 75 65  to, 0, iContinue
3500: 29 3b 0a 20 20 20 20 56 64 62 65 43 6f 6d 6d 65  );.    VdbeComme
3510: 6e 74 28 28 76 2c 20 22 73 6b 69 70 20 4f 46 46  nt((v, "skip OFF
3520: 53 45 54 20 72 65 63 6f 72 64 73 22 29 29 3b 0a  SET records"));.
3530: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a      sqlite3VdbeJ
3540: 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72 29  umpHere(v, addr)
3550: 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  ;.  }.}../*.** A
3560: 64 64 20 63 6f 64 65 20 74 68 61 74 20 77 69 6c  dd code that wil
3570: 6c 20 63 68 65 63 6b 20 74 6f 20 6d 61 6b 65 20  l check to make 
3580: 73 75 72 65 20 74 68 65 20 74 6f 70 20 4e 20 65  sure the top N e
3590: 6c 65 6d 65 6e 74 73 20 6f 66 20 74 68 65 0a 2a  lements of the.*
35a0: 2a 20 73 74 61 63 6b 20 61 72 65 20 64 69 73 74  * stack are dist
35b0: 69 6e 63 74 2e 20 20 69 54 61 62 20 69 73 20 61  inct.  iTab is a
35c0: 20 73 6f 72 74 69 6e 67 20 69 6e 64 65 78 20 74   sorting index t
35d0: 68 61 74 20 68 6f 6c 64 73 20 70 72 65 76 69 6f  hat holds previo
35e0: 75 73 6c 79 0a 2a 2a 20 73 65 65 6e 20 63 6f 6d  usly.** seen com
35f0: 62 69 6e 61 74 69 6f 6e 73 20 6f 66 20 74 68 65  binations of the
3600: 20 4e 20 76 61 6c 75 65 73 2e 20 20 41 20 6e 65   N values.  A ne
3610: 77 20 65 6e 74 72 79 20 69 73 20 6d 61 64 65 20  w entry is made 
3620: 69 6e 20 69 54 61 62 0a 2a 2a 20 69 66 20 74 68  in iTab.** if th
3630: 65 20 63 75 72 72 65 6e 74 20 4e 20 76 61 6c 75  e current N valu
3640: 65 73 20 61 72 65 20 6e 65 77 2e 0a 2a 2a 0a 2a  es are new..**.*
3650: 2a 20 41 20 6a 75 6d 70 20 74 6f 20 61 64 64 72  * A jump to addr
3660: 52 65 70 65 61 74 20 69 73 20 6d 61 64 65 20 61  Repeat is made a
3670: 6e 64 20 74 68 65 20 4e 2b 31 20 76 61 6c 75 65  nd the N+1 value
3680: 73 20 61 72 65 20 70 6f 70 70 65 64 20 66 72 6f  s are popped fro
3690: 6d 20 74 68 65 0a 2a 2a 20 73 74 61 63 6b 20 69  m the.** stack i
36a0: 66 20 74 68 65 20 74 6f 70 20 4e 20 65 6c 65 6d  f the top N elem
36b0: 65 6e 74 73 20 61 72 65 20 6e 6f 74 20 64 69 73  ents are not dis
36c0: 74 69 6e 63 74 2e 0a 2a 2f 0a 73 74 61 74 69 63  tinct..*/.static
36d0: 20 76 6f 69 64 20 63 6f 64 65 44 69 73 74 69 6e   void codeDistin
36e0: 63 74 5f 4f 4c 44 28 0a 20 20 56 64 62 65 20 2a  ct_OLD(.  Vdbe *
36f0: 76 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  v,           /* 
3700: 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 69 6e  Generate code in
3710: 74 6f 20 74 68 69 73 20 56 4d 20 2a 2f 0a 20 20  to this VM */.  
3720: 69 6e 74 20 69 54 61 62 2c 20 20 20 20 20 20 20  int iTab,       
3730: 20 20 20 2f 2a 20 41 20 73 6f 72 74 69 6e 67 20     /* A sorting 
3740: 69 6e 64 65 78 20 75 73 65 64 20 74 6f 20 74 65  index used to te
3750: 73 74 20 66 6f 72 20 64 69 73 74 69 6e 63 74 6e  st for distinctn
3760: 65 73 73 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64  ess */.  int add
3770: 72 52 65 70 65 61 74 2c 20 20 20 20 2f 2a 20 4a  rRepeat,    /* J
3780: 75 6d 70 20 74 6f 20 68 65 72 65 20 69 66 20 6e  ump to here if n
3790: 6f 74 20 64 69 73 74 69 6e 63 74 20 2a 2f 0a 20  ot distinct */. 
37a0: 20 69 6e 74 20 4e 20 20 20 20 20 20 20 20 20 20   int N          
37b0: 20 20 20 20 2f 2a 20 54 68 65 20 74 6f 70 20 4e      /* The top N
37c0: 20 65 6c 65 6d 65 6e 74 73 20 6f 66 20 74 68 65   elements of the
37d0: 20 73 74 61 63 6b 20 6d 75 73 74 20 62 65 20 64   stack must be d
37e0: 69 73 74 69 6e 63 74 20 2a 2f 0a 29 7b 0a 20 20  istinct */.){.  
37f0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
3800: 32 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f  2(v, OP_MakeReco
3810: 72 64 2c 20 2d 4e 2c 20 30 29 3b 0a 20 20 73 71  rd, -N, 0);.  sq
3820: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
3830: 76 2c 20 4f 50 5f 44 69 73 74 69 6e 63 74 2c 20  v, OP_Distinct, 
3840: 69 54 61 62 2c 20 73 71 6c 69 74 65 33 56 64 62  iTab, sqlite3Vdb
3850: 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 2b  eCurrentAddr(v)+
3860: 33 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  3);.  sqlite3Vdb
3870: 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 50 6f  eAddOp2(v, OP_Po
3880: 70 2c 20 4e 2b 31 2c 20 30 29 3b 0a 20 20 73 71  p, N+1, 0);.  sq
3890: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
38a0: 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 61  v, OP_Goto, 0, a
38b0: 64 64 72 52 65 70 65 61 74 29 3b 0a 20 20 56 64  ddrRepeat);.  Vd
38c0: 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 73  beComment((v, "s
38d0: 6b 69 70 20 69 6e 64 69 73 74 69 6e 63 74 20 72  kip indistinct r
38e0: 65 63 6f 72 64 73 22 29 29 3b 0a 20 20 73 71 6c  ecords"));.  sql
38f0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
3900: 2c 20 4f 50 5f 49 64 78 49 6e 73 65 72 74 2c 20  , OP_IdxInsert, 
3910: 69 54 61 62 2c 20 30 29 3b 0a 7d 0a 0a 2f 2a 0a  iTab, 0);.}../*.
3920: 2a 2a 20 41 64 64 20 63 6f 64 65 20 74 68 61 74  ** Add code that
3930: 20 77 69 6c 6c 20 63 68 65 63 6b 20 74 6f 20 6d   will check to m
3940: 61 6b 65 20 73 75 72 65 20 74 68 65 20 74 6f 70  ake sure the top
3950: 20 4e 20 65 6c 65 6d 65 6e 74 73 20 6f 66 20 74   N elements of t
3960: 68 65 0a 2a 2a 20 73 74 61 63 6b 20 61 72 65 20  he.** stack are 
3970: 64 69 73 74 69 6e 63 74 2e 20 20 69 54 61 62 20  distinct.  iTab 
3980: 69 73 20 61 20 73 6f 72 74 69 6e 67 20 69 6e 64  is a sorting ind
3990: 65 78 20 74 68 61 74 20 68 6f 6c 64 73 20 70 72  ex that holds pr
39a0: 65 76 69 6f 75 73 6c 79 0a 2a 2a 20 73 65 65 6e  eviously.** seen
39b0: 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 73 20 6f 66   combinations of
39c0: 20 74 68 65 20 4e 20 76 61 6c 75 65 73 2e 20 20   the N values.  
39d0: 41 20 6e 65 77 20 65 6e 74 72 79 20 69 73 20 6d  A new entry is m
39e0: 61 64 65 20 69 6e 20 69 54 61 62 0a 2a 2a 20 69  ade in iTab.** i
39f0: 66 20 74 68 65 20 63 75 72 72 65 6e 74 20 4e 20  f the current N 
3a00: 76 61 6c 75 65 73 20 61 72 65 20 6e 65 77 2e 0a  values are new..
3a10: 2a 2a 0a 2a 2a 20 41 20 6a 75 6d 70 20 74 6f 20  **.** A jump to 
3a20: 61 64 64 72 52 65 70 65 61 74 20 69 73 20 6d 61  addrRepeat is ma
3a30: 64 65 20 61 6e 64 20 74 68 65 20 4e 2b 31 20 76  de and the N+1 v
3a40: 61 6c 75 65 73 20 61 72 65 20 70 6f 70 70 65 64  alues are popped
3a50: 20 66 72 6f 6d 20 74 68 65 0a 2a 2a 20 73 74 61   from the.** sta
3a60: 63 6b 20 69 66 20 74 68 65 20 74 6f 70 20 4e 20  ck if the top N 
3a70: 65 6c 65 6d 65 6e 74 73 20 61 72 65 20 6e 6f 74  elements are not
3a80: 20 64 69 73 74 69 6e 63 74 2e 0a 2a 2f 0a 73 74   distinct..*/.st
3a90: 61 74 69 63 20 76 6f 69 64 20 63 6f 64 65 44 69  atic void codeDi
3aa0: 73 74 69 6e 63 74 28 0a 20 20 56 64 62 65 20 2a  stinct(.  Vdbe *
3ab0: 76 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  v,           /* 
3ac0: 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 69 6e  Generate code in
3ad0: 74 6f 20 74 68 69 73 20 56 4d 20 2a 2f 0a 20 20  to this VM */.  
3ae0: 69 6e 74 20 69 54 61 62 2c 20 20 20 20 20 20 20  int iTab,       
3af0: 20 20 20 2f 2a 20 41 20 73 6f 72 74 69 6e 67 20     /* A sorting 
3b00: 69 6e 64 65 78 20 75 73 65 64 20 74 6f 20 74 65  index used to te
3b10: 73 74 20 66 6f 72 20 64 69 73 74 69 6e 63 74 6e  st for distinctn
3b20: 65 73 73 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64  ess */.  int add
3b30: 72 52 65 70 65 61 74 2c 20 20 20 20 2f 2a 20 4a  rRepeat,    /* J
3b40: 75 6d 70 20 74 6f 20 68 65 72 65 20 69 66 20 6e  ump to here if n
3b50: 6f 74 20 64 69 73 74 69 6e 63 74 20 2a 2f 0a 20  ot distinct */. 
3b60: 20 69 6e 74 20 69 4d 65 6d 20 20 20 20 20 20 20   int iMem       
3b70: 20 20 20 20 2f 2a 20 46 69 72 73 74 20 65 6c 65      /* First ele
3b80: 6d 65 6e 74 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c  ment */.){.  sql
3b90: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
3ba0: 2c 20 4f 50 5f 52 65 67 4d 61 6b 65 52 65 63 2c  , OP_RegMakeRec,
3bb0: 20 69 4d 65 6d 2c 20 30 29 3b 0a 20 20 73 71 6c   iMem, 0);.  sql
3bc0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
3bd0: 2c 20 4f 50 5f 44 69 73 74 69 6e 63 74 2c 20 69  , OP_Distinct, i
3be0: 54 61 62 2c 20 73 71 6c 69 74 65 33 56 64 62 65  Tab, sqlite3Vdbe
3bf0: 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 2b 33  CurrentAddr(v)+3
3c00: 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  );.  sqlite3Vdbe
3c10: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 50 6f 70  AddOp2(v, OP_Pop
3c20: 2c 20 31 2c 20 30 29 3b 0a 20 20 73 71 6c 69 74  , 1, 0);.  sqlit
3c30: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
3c40: 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 61 64 64 72  OP_Goto, 0, addr
3c50: 52 65 70 65 61 74 29 3b 0a 20 20 56 64 62 65 43  Repeat);.  VdbeC
3c60: 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 73 6b 69 70  omment((v, "skip
3c70: 20 69 6e 64 69 73 74 69 6e 63 74 20 72 65 63 6f   indistinct reco
3c80: 72 64 73 22 29 29 3b 0a 20 20 73 71 6c 69 74 65  rds"));.  sqlite
3c90: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
3ca0: 50 5f 49 64 78 49 6e 73 65 72 74 2c 20 69 54 61  P_IdxInsert, iTa
3cb0: 62 2c 20 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  b, 0);.}../*.** 
3cc0: 47 65 6e 65 72 61 74 65 20 61 6e 20 65 72 72 6f  Generate an erro
3cd0: 72 20 6d 65 73 73 61 67 65 20 77 68 65 6e 20 61  r message when a
3ce0: 20 53 45 4c 45 43 54 20 69 73 20 75 73 65 64 20   SELECT is used 
3cf0: 77 69 74 68 69 6e 20 61 20 73 75 62 65 78 70 72  within a subexpr
3d00: 65 73 73 69 6f 6e 0a 2a 2a 20 28 65 78 61 6d 70  ession.** (examp
3d10: 6c 65 3a 20 20 22 61 20 49 4e 20 28 53 45 4c 45  le:  "a IN (SELE
3d20: 43 54 20 2a 20 46 52 4f 4d 20 74 61 62 6c 65 29  CT * FROM table)
3d30: 22 29 20 62 75 74 20 69 74 20 68 61 73 20 6d 6f  ") but it has mo
3d40: 72 65 20 74 68 61 6e 20 31 20 72 65 73 75 6c 74  re than 1 result
3d50: 0a 2a 2a 20 63 6f 6c 75 6d 6e 2e 20 20 57 65 20  .** column.  We 
3d60: 64 6f 20 74 68 69 73 20 69 6e 20 61 20 73 75 62  do this in a sub
3d70: 72 6f 75 74 69 6e 65 20 62 65 63 61 75 73 65 20  routine because 
3d80: 74 68 65 20 65 72 72 6f 72 20 6f 63 63 75 72 73  the error occurs
3d90: 20 69 6e 20 6d 75 6c 74 69 70 6c 65 0a 2a 2a 20   in multiple.** 
3da0: 70 6c 61 63 65 73 2e 0a 2a 2f 0a 73 74 61 74 69  places..*/.stati
3db0: 63 20 69 6e 74 20 63 68 65 63 6b 46 6f 72 4d 75  c int checkForMu
3dc0: 6c 74 69 43 6f 6c 75 6d 6e 53 65 6c 65 63 74 45  ltiColumnSelectE
3dd0: 72 72 6f 72 28 0a 20 20 50 61 72 73 65 20 2a 70  rror(.  Parse *p
3de0: 50 61 72 73 65 2c 20 20 20 20 20 20 20 2f 2a 20  Parse,       /* 
3df0: 50 61 72 73 65 20 63 6f 6e 74 65 78 74 2e 20 2a  Parse context. *
3e00: 2f 0a 20 20 53 65 6c 65 63 74 44 65 73 74 20 2a  /.  SelectDest *
3e10: 70 44 65 73 74 2c 20 20 20 2f 2a 20 44 65 73 74  pDest,   /* Dest
3e20: 69 6e 61 74 69 6f 6e 20 6f 66 20 53 45 4c 45 43  ination of SELEC
3e30: 54 20 72 65 73 75 6c 74 73 20 2a 2f 0a 20 20 69  T results */.  i
3e40: 6e 74 20 6e 45 78 70 72 20 20 20 20 20 20 20 20  nt nExpr        
3e50: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
3e60: 20 72 65 73 75 6c 74 20 63 6f 6c 75 6d 6e 73 20   result columns 
3e70: 72 65 74 75 72 6e 65 64 20 62 79 20 53 45 4c 45  returned by SELE
3e80: 43 54 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 65  CT */.){.  int e
3e90: 44 65 73 74 20 3d 20 70 44 65 73 74 2d 3e 65 44  Dest = pDest->eD
3ea0: 65 73 74 3b 0a 20 20 69 66 28 20 6e 45 78 70 72  est;.  if( nExpr
3eb0: 3e 31 20 26 26 20 28 65 44 65 73 74 3d 3d 53 52  >1 && (eDest==SR
3ec0: 54 5f 4d 65 6d 20 7c 7c 20 65 44 65 73 74 3d 3d  T_Mem || eDest==
3ed0: 53 52 54 5f 53 65 74 29 20 29 7b 0a 20 20 20 20  SRT_Set) ){.    
3ee0: 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
3ef0: 70 50 61 72 73 65 2c 20 22 6f 6e 6c 79 20 61 20  pParse, "only a 
3f00: 73 69 6e 67 6c 65 20 72 65 73 75 6c 74 20 61 6c  single result al
3f10: 6c 6f 77 65 64 20 66 6f 72 20 22 0a 20 20 20 20  lowed for ".    
3f20: 20 20 20 22 61 20 53 45 4c 45 43 54 20 74 68 61     "a SELECT tha
3f30: 74 20 69 73 20 70 61 72 74 20 6f 66 20 61 6e 20  t is part of an 
3f40: 65 78 70 72 65 73 73 69 6f 6e 22 29 3b 0a 20 20  expression");.  
3f50: 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 65    return 1;.  }e
3f60: 6c 73 65 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  lse{.    return 
3f70: 30 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  0;.  }.}../*.** 
3f80: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 67 65 6e  This routine gen
3f90: 65 72 61 74 65 73 20 74 68 65 20 63 6f 64 65 20  erates the code 
3fa0: 66 6f 72 20 74 68 65 20 69 6e 73 69 64 65 20 6f  for the inside o
3fb0: 66 20 74 68 65 20 69 6e 6e 65 72 20 6c 6f 6f 70  f the inner loop
3fc0: 0a 2a 2a 20 6f 66 20 61 20 53 45 4c 45 43 54 2e  .** of a SELECT.
3fd0: 0a 2a 2a 0a 2a 2a 20 49 66 20 73 72 63 54 61 62  .**.** If srcTab
3fe0: 20 61 6e 64 20 6e 43 6f 6c 75 6d 6e 20 61 72 65   and nColumn are
3ff0: 20 62 6f 74 68 20 7a 65 72 6f 2c 20 74 68 65 6e   both zero, then
4000: 20 74 68 65 20 70 45 4c 69 73 74 20 65 78 70 72   the pEList expr
4010: 65 73 73 69 6f 6e 73 0a 2a 2a 20 61 72 65 20 65  essions.** are e
4020: 76 61 6c 75 61 74 65 64 20 69 6e 20 6f 72 64 65  valuated in orde
4030: 72 20 74 6f 20 67 65 74 20 74 68 65 20 64 61 74  r to get the dat
4040: 61 20 66 6f 72 20 74 68 69 73 20 72 6f 77 2e 20  a for this row. 
4050: 20 49 66 20 6e 43 6f 6c 75 6d 6e 3e 30 0a 2a 2a   If nColumn>0.**
4060: 20 74 68 65 6e 20 64 61 74 61 20 69 73 20 70 75   then data is pu
4070: 6c 6c 65 64 20 66 72 6f 6d 20 73 72 63 54 61 62  lled from srcTab
4080: 20 61 6e 64 20 70 45 4c 69 73 74 20 69 73 20 75   and pEList is u
4090: 73 65 64 20 6f 6e 6c 79 20 74 6f 20 67 65 74 20  sed only to get 
40a0: 74 68 65 0a 2a 2a 20 64 61 74 61 74 79 70 65 73  the.** datatypes
40b0: 20 66 6f 72 20 65 61 63 68 20 63 6f 6c 75 6d 6e   for each column
40c0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
40d0: 73 65 6c 65 63 74 49 6e 6e 65 72 4c 6f 6f 70 28  selectInnerLoop(
40e0: 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
40f0: 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68  ,          /* Th
4100: 65 20 70 61 72 73 65 72 20 63 6f 6e 74 65 78 74  e parser context
4110: 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 2c   */.  Select *p,
4120: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
4130: 20 54 68 65 20 63 6f 6d 70 6c 65 74 65 20 73 65   The complete se
4140: 6c 65 63 74 20 73 74 61 74 65 6d 65 6e 74 20 62  lect statement b
4150: 65 69 6e 67 20 63 6f 64 65 64 20 2a 2f 0a 20 20  eing coded */.  
4160: 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74  ExprList *pEList
4170: 2c 20 20 20 20 20 20 20 2f 2a 20 4c 69 73 74 20  ,       /* List 
4180: 6f 66 20 76 61 6c 75 65 73 20 62 65 69 6e 67 20  of values being 
4190: 65 78 74 72 61 63 74 65 64 20 2a 2f 0a 20 20 69  extracted */.  i
41a0: 6e 74 20 73 72 63 54 61 62 2c 20 20 20 20 20 20  nt srcTab,      
41b0: 20 20 20 20 20 20 20 2f 2a 20 50 75 6c 6c 20 64         /* Pull d
41c0: 61 74 61 20 66 72 6f 6d 20 74 68 69 73 20 74 61  ata from this ta
41d0: 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 43 6f  ble */.  int nCo
41e0: 6c 75 6d 6e 2c 20 20 20 20 20 20 20 20 20 20 20  lumn,           
41f0: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 6f   /* Number of co
4200: 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20 73 6f 75  lumns in the sou
4210: 72 63 65 20 74 61 62 6c 65 20 2a 2f 0a 20 20 45  rce table */.  E
4220: 78 70 72 4c 69 73 74 20 2a 70 4f 72 64 65 72 42  xprList *pOrderB
4230: 79 2c 20 20 20 20 20 2f 2a 20 49 66 20 6e 6f 74  y,     /* If not
4240: 20 4e 55 4c 4c 2c 20 73 6f 72 74 20 72 65 73 75   NULL, sort resu
4250: 6c 74 73 20 75 73 69 6e 67 20 74 68 69 73 20 6b  lts using this k
4260: 65 79 20 2a 2f 0a 20 20 69 6e 74 20 64 69 73 74  ey */.  int dist
4270: 69 6e 63 74 2c 20 20 20 20 20 20 20 20 20 20 20  inct,           
4280: 2f 2a 20 49 66 20 3e 3d 30 2c 20 6d 61 6b 65 20  /* If >=0, make 
4290: 73 75 72 65 20 72 65 73 75 6c 74 73 20 61 72 65  sure results are
42a0: 20 64 69 73 74 69 6e 63 74 20 2a 2f 0a 20 20 53   distinct */.  S
42b0: 65 6c 65 63 74 44 65 73 74 20 2a 70 44 65 73 74  electDest *pDest
42c0: 2c 20 20 20 20 20 20 2f 2a 20 48 6f 77 20 74 6f  ,      /* How to
42d0: 20 64 69 73 70 6f 73 65 20 6f 66 20 74 68 65 20   dispose of the 
42e0: 72 65 73 75 6c 74 73 20 2a 2f 0a 20 20 69 6e 74  results */.  int
42f0: 20 69 43 6f 6e 74 69 6e 75 65 2c 20 20 20 20 20   iContinue,     
4300: 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72       /* Jump her
4310: 65 20 74 6f 20 63 6f 6e 74 69 6e 75 65 20 77 69  e to continue wi
4320: 74 68 20 6e 65 78 74 20 72 6f 77 20 2a 2f 0a 20  th next row */. 
4330: 20 69 6e 74 20 69 42 72 65 61 6b 2c 20 20 20 20   int iBreak,    
4340: 20 20 20 20 20 20 20 20 20 2f 2a 20 4a 75 6d 70           /* Jump
4350: 20 68 65 72 65 20 74 6f 20 62 72 65 61 6b 20 6f   here to break o
4360: 75 74 20 6f 66 20 74 68 65 20 69 6e 6e 65 72 20  ut of the inner 
4370: 6c 6f 6f 70 20 2a 2f 0a 20 20 63 68 61 72 20 2a  loop */.  char *
4380: 61 66 66 20 20 20 20 20 20 20 20 20 20 20 20 20  aff             
4390: 20 20 2f 2a 20 61 66 66 69 6e 69 74 79 20 73 74    /* affinity st
43a0: 72 69 6e 67 20 69 66 20 65 44 65 73 74 20 69 73  ring if eDest is
43b0: 20 53 52 54 5f 55 6e 69 6f 6e 20 2a 2f 0a 29 7b   SRT_Union */.){
43c0: 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61  .  Vdbe *v = pPa
43d0: 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e  rse->pVdbe;.  in
43e0: 74 20 69 2c 20 6e 3b 0a 20 20 69 6e 74 20 68 61  t i, n;.  int ha
43f0: 73 44 69 73 74 69 6e 63 74 3b 20 20 20 20 20 20  sDistinct;      
4400: 20 20 2f 2a 20 54 72 75 65 20 69 66 20 74 68 65    /* True if the
4410: 20 44 49 53 54 49 4e 43 54 20 6b 65 79 77 6f 72   DISTINCT keywor
4420: 64 20 69 73 20 70 72 65 73 65 6e 74 20 2a 2f 0a  d is present */.
4430: 20 20 69 6e 74 20 69 4d 65 6d 3b 20 20 20 20 20    int iMem;     
4440: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 74 61            /* Sta
4450: 72 74 20 6f 66 20 6d 65 6d 6f 72 79 20 68 6f 6c  rt of memory hol
4460: 64 69 6e 67 20 72 65 73 75 6c 74 20 73 65 74 20  ding result set 
4470: 2a 2f 0a 20 20 69 6e 74 20 65 44 65 73 74 20 3d  */.  int eDest =
4480: 20 70 44 65 73 74 2d 3e 65 44 65 73 74 3b 0a 20   pDest->eDest;. 
4490: 20 69 6e 74 20 69 50 61 72 6d 20 3d 20 70 44 65   int iParm = pDe
44a0: 73 74 2d 3e 69 50 61 72 6d 3b 0a 0a 20 20 69 66  st->iParm;..  if
44b0: 28 20 76 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  ( v==0 ) return 
44c0: 30 3b 0a 20 20 61 73 73 65 72 74 28 20 70 45 4c  0;.  assert( pEL
44d0: 69 73 74 21 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20  ist!=0 );..  /* 
44e0: 49 66 20 74 68 65 72 65 20 77 61 73 20 61 20 4c  If there was a L
44f0: 49 4d 49 54 20 63 6c 61 75 73 65 20 6f 6e 20 74  IMIT clause on t
4500: 68 65 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d  he SELECT statem
4510: 65 6e 74 2c 20 74 68 65 6e 20 64 6f 20 74 68 65  ent, then do the
4520: 20 63 68 65 63 6b 0a 20 20 2a 2a 20 74 6f 20 73   check.  ** to s
4530: 65 65 20 69 66 20 74 68 69 73 20 72 6f 77 20 73  ee if this row s
4540: 68 6f 75 6c 64 20 62 65 20 6f 75 74 70 75 74 2e  hould be output.
4550: 0a 20 20 2a 2f 0a 20 20 68 61 73 44 69 73 74 69  .  */.  hasDisti
4560: 6e 63 74 20 3d 20 64 69 73 74 69 6e 63 74 3e 3d  nct = distinct>=
4570: 30 20 26 26 20 70 45 4c 69 73 74 2d 3e 6e 45 78  0 && pEList->nEx
4580: 70 72 3e 30 3b 0a 20 20 69 66 28 20 70 4f 72 64  pr>0;.  if( pOrd
4590: 65 72 42 79 3d 3d 30 20 26 26 20 21 68 61 73 44  erBy==0 && !hasD
45a0: 69 73 74 69 6e 63 74 20 29 7b 0a 20 20 20 20 63  istinct ){.    c
45b0: 6f 64 65 4f 66 66 73 65 74 28 76 2c 20 70 2c 20  odeOffset(v, p, 
45c0: 69 43 6f 6e 74 69 6e 75 65 2c 20 30 29 3b 0a 20  iContinue, 0);. 
45d0: 20 7d 0a 0a 20 20 2f 2a 20 50 75 6c 6c 20 74 68   }..  /* Pull th
45e0: 65 20 72 65 71 75 65 73 74 65 64 20 63 6f 6c 75  e requested colu
45f0: 6d 6e 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  mns..  */.  if( 
4600: 6e 43 6f 6c 75 6d 6e 3e 30 20 29 7b 0a 20 20 20  nColumn>0 ){.   
4610: 20 6e 20 3d 20 6e 43 6f 6c 75 6d 6e 3b 0a 20 20   n = nColumn;.  
4620: 7d 65 6c 73 65 7b 0a 20 20 20 20 6e 20 3d 20 70  }else{.    n = p
4630: 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 0a 20 20  EList->nExpr;.  
4640: 7d 0a 20 20 69 4d 65 6d 20 3d 20 2b 2b 70 50 61  }.  iMem = ++pPa
4650: 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 70 50 61  rse->nMem;.  pPa
4660: 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 6e 2b 31  rse->nMem += n+1
4670: 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41  ;.  sqlite3VdbeA
4680: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65  ddOp2(v, OP_Inte
4690: 67 65 72 2c 20 6e 2c 20 69 4d 65 6d 29 3b 0a 20  ger, n, iMem);. 
46a0: 20 69 66 28 20 6e 43 6f 6c 75 6d 6e 3e 30 20 29   if( nColumn>0 )
46b0: 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  {.    for(i=0; i
46c0: 3c 6e 43 6f 6c 75 6d 6e 3b 20 69 2b 2b 29 7b 0a  <nColumn; i++){.
46d0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
46e0: 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f  eAddOp3(v, OP_Co
46f0: 6c 75 6d 6e 2c 20 73 72 63 54 61 62 2c 20 69 2c  lumn, srcTab, i,
4700: 20 69 4d 65 6d 2b 69 2b 31 29 3b 0a 20 20 20 20   iMem+i+1);.    
4710: 7d 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 65 44  }.  }else if( eD
4720: 65 73 74 21 3d 53 52 54 5f 45 78 69 73 74 73 20  est!=SRT_Exists 
4730: 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65  ){.    /* If the
4740: 20 64 65 73 74 69 6e 61 74 69 6f 6e 20 69 73 20   destination is 
4750: 61 6e 20 45 58 49 53 54 53 28 2e 2e 2e 29 20 65  an EXISTS(...) e
4760: 78 70 72 65 73 73 69 6f 6e 2c 20 74 68 65 20 61  xpression, the a
4770: 63 74 75 61 6c 0a 20 20 20 20 2a 2a 20 76 61 6c  ctual.    ** val
4780: 75 65 73 20 72 65 74 75 72 6e 65 64 20 62 79 20  ues returned by 
4790: 74 68 65 20 53 45 4c 45 43 54 20 61 72 65 20 6e  the SELECT are n
47a0: 6f 74 20 72 65 71 75 69 72 65 64 2e 0a 20 20 20  ot required..   
47b0: 20 2a 2f 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b   */.    for(i=0;
47c0: 20 69 3c 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20   i<n; i++){.    
47d0: 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64    sqlite3ExprCod
47e0: 65 28 70 50 61 72 73 65 2c 20 70 45 4c 69 73 74  e(pParse, pEList
47f0: 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 2c 20 69 4d  ->a[i].pExpr, iM
4800: 65 6d 2b 69 2b 31 29 3b 0a 20 20 20 20 7d 0a 20  em+i+1);.    }. 
4810: 20 7d 0a 20 20 6e 43 6f 6c 75 6d 6e 20 3d 20 6e   }.  nColumn = n
4820: 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 44  ;..  /* If the D
4830: 49 53 54 49 4e 43 54 20 6b 65 79 77 6f 72 64 20  ISTINCT keyword 
4840: 77 61 73 20 70 72 65 73 65 6e 74 20 6f 6e 20 74  was present on t
4850: 68 65 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d  he SELECT statem
4860: 65 6e 74 0a 20 20 2a 2a 20 61 6e 64 20 74 68 69  ent.  ** and thi
4870: 73 20 72 6f 77 20 68 61 73 20 62 65 65 6e 20 73  s row has been s
4880: 65 65 6e 20 62 65 66 6f 72 65 2c 20 74 68 65 6e  een before, then
4890: 20 64 6f 20 6e 6f 74 20 6d 61 6b 65 20 74 68 69   do not make thi
48a0: 73 20 72 6f 77 0a 20 20 2a 2a 20 70 61 72 74 20  s row.  ** part 
48b0: 6f 66 20 74 68 65 20 72 65 73 75 6c 74 2e 0a 20  of the result.. 
48c0: 20 2a 2f 0a 20 20 69 66 28 20 68 61 73 44 69 73   */.  if( hasDis
48d0: 74 69 6e 63 74 20 29 7b 0a 20 20 20 20 61 73 73  tinct ){.    ass
48e0: 65 72 74 28 20 70 45 4c 69 73 74 21 3d 30 20 29  ert( pEList!=0 )
48f0: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 45  ;.    assert( pE
4900: 4c 69 73 74 2d 3e 6e 45 78 70 72 3d 3d 6e 43 6f  List->nExpr==nCo
4910: 6c 75 6d 6e 20 29 3b 0a 20 20 20 20 63 6f 64 65  lumn );.    code
4920: 44 69 73 74 69 6e 63 74 28 76 2c 20 64 69 73 74  Distinct(v, dist
4930: 69 6e 63 74 2c 20 69 43 6f 6e 74 69 6e 75 65 2c  inct, iContinue,
4940: 20 69 4d 65 6d 29 3b 0a 20 20 20 20 69 66 28 20   iMem);.    if( 
4950: 70 4f 72 64 65 72 42 79 3d 3d 30 20 29 7b 0a 20  pOrderBy==0 ){. 
4960: 20 20 20 20 20 63 6f 64 65 4f 66 66 73 65 74 28       codeOffset(
4970: 76 2c 20 70 2c 20 69 43 6f 6e 74 69 6e 75 65 2c  v, p, iContinue,
4980: 20 6e 43 6f 6c 75 6d 6e 29 3b 0a 20 20 20 20 7d   nColumn);.    }
4990: 0a 20 20 7d 0a 0a 20 20 69 66 28 20 63 68 65 63  .  }..  if( chec
49a0: 6b 46 6f 72 4d 75 6c 74 69 43 6f 6c 75 6d 6e 53  kForMultiColumnS
49b0: 65 6c 65 63 74 45 72 72 6f 72 28 70 50 61 72 73  electError(pPars
49c0: 65 2c 20 70 44 65 73 74 2c 20 70 45 4c 69 73 74  e, pDest, pEList
49d0: 2d 3e 6e 45 78 70 72 29 20 29 7b 0a 20 20 20 20  ->nExpr) ){.    
49e0: 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 0a 20  return 0;.  }.. 
49f0: 20 73 77 69 74 63 68 28 20 65 44 65 73 74 20 29   switch( eDest )
4a00: 7b 0a 20 20 20 20 2f 2a 20 49 6e 20 74 68 69 73  {.    /* In this
4a10: 20 6d 6f 64 65 2c 20 77 72 69 74 65 20 65 61 63   mode, write eac
4a20: 68 20 71 75 65 72 79 20 72 65 73 75 6c 74 20 74  h query result t
4a30: 6f 20 74 68 65 20 6b 65 79 20 6f 66 20 74 68 65  o the key of the
4a40: 20 74 65 6d 70 6f 72 61 72 79 0a 20 20 20 20 2a   temporary.    *
4a50: 2a 20 74 61 62 6c 65 20 69 50 61 72 6d 2e 0a 20  * table iParm.. 
4a60: 20 20 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51     */.#ifndef SQ
4a70: 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f 4d 50 4f 55  LITE_OMIT_COMPOU
4a80: 4e 44 5f 53 45 4c 45 43 54 0a 20 20 20 20 63 61  ND_SELECT.    ca
4a90: 73 65 20 53 52 54 5f 55 6e 69 6f 6e 3a 20 7b 0a  se SRT_Union: {.
4aa0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
4ab0: 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52 65  eAddOp2(v, OP_Re
4ac0: 67 4d 61 6b 65 52 65 63 2c 20 69 4d 65 6d 2c 20  gMakeRec, iMem, 
4ad0: 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20 61 66  0);.      if( af
4ae0: 66 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  f ){.        sql
4af0: 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 34  ite3VdbeChangeP4
4b00: 28 76 2c 20 2d 31 2c 20 61 66 66 2c 20 50 34 5f  (v, -1, aff, P4_
4b10: 53 54 41 54 49 43 29 3b 0a 20 20 20 20 20 20 7d  STATIC);.      }
4b20: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
4b30: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49  beAddOp2(v, OP_I
4b40: 64 78 49 6e 73 65 72 74 2c 20 69 50 61 72 6d 2c  dxInsert, iParm,
4b50: 20 30 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b   0);.      break
4b60: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
4b70: 43 6f 6e 73 74 72 75 63 74 20 61 20 72 65 63 6f  Construct a reco
4b80: 72 64 20 66 72 6f 6d 20 74 68 65 20 71 75 65 72  rd from the quer
4b90: 79 20 72 65 73 75 6c 74 2c 20 62 75 74 20 69 6e  y result, but in
4ba0: 73 74 65 61 64 20 6f 66 0a 20 20 20 20 2a 2a 20  stead of.    ** 
4bb0: 73 61 76 69 6e 67 20 74 68 61 74 20 72 65 63 6f  saving that reco
4bc0: 72 64 2c 20 75 73 65 20 69 74 20 61 73 20 61 20  rd, use it as a 
4bd0: 6b 65 79 20 74 6f 20 64 65 6c 65 74 65 20 65 6c  key to delete el
4be0: 65 6d 65 6e 74 73 20 66 72 6f 6d 0a 20 20 20 20  ements from.    
4bf0: 2a 2a 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79  ** the temporary
4c00: 20 74 61 62 6c 65 20 69 50 61 72 6d 2e 0a 20 20   table iParm..  
4c10: 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 52    */.    case SR
4c20: 54 5f 45 78 63 65 70 74 3a 20 7b 0a 20 20 20 20  T_Except: {.    
4c30: 20 20 69 6e 74 20 61 64 64 72 3b 0a 20 20 20 20    int addr;.    
4c40: 20 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65 33    addr = sqlite3
4c50: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
4c60: 5f 52 65 67 4d 61 6b 65 52 65 63 2c 20 69 4d 65  _RegMakeRec, iMe
4c70: 6d 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c  m, 0);.      sql
4c80: 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 34  ite3VdbeChangeP4
4c90: 28 76 2c 20 2d 31 2c 20 61 66 66 2c 20 50 34 5f  (v, -1, aff, P4_
4ca0: 53 54 41 54 49 43 29 3b 0a 20 20 20 20 20 20 73  STATIC);.      s
4cb0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
4cc0: 28 76 2c 20 4f 50 5f 4e 6f 74 46 6f 75 6e 64 2c  (v, OP_NotFound,
4cd0: 20 69 50 61 72 6d 2c 20 61 64 64 72 2b 33 29 3b   iParm, addr+3);
4ce0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
4cf0: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 44  beAddOp2(v, OP_D
4d00: 65 6c 65 74 65 2c 20 69 50 61 72 6d 2c 20 30 29  elete, iParm, 0)
4d10: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
4d20: 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20     }.#endif..   
4d30: 20 2f 2a 20 53 74 6f 72 65 20 74 68 65 20 72 65   /* Store the re
4d40: 73 75 6c 74 20 61 73 20 64 61 74 61 20 75 73 69  sult as data usi
4d50: 6e 67 20 61 20 75 6e 69 71 75 65 20 6b 65 79 2e  ng a unique key.
4d60: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65  .    */.    case
4d70: 20 53 52 54 5f 54 61 62 6c 65 3a 0a 20 20 20 20   SRT_Table:.    
4d80: 63 61 73 65 20 53 52 54 5f 45 70 68 65 6d 54 61  case SRT_EphemTa
4d90: 62 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  b: {.      sqlit
4da0: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
4db0: 4f 50 5f 52 65 67 4d 61 6b 65 52 65 63 2c 20 69  OP_RegMakeRec, i
4dc0: 4d 65 6d 2c 20 30 29 3b 0a 20 20 20 20 20 20 69  Mem, 0);.      i
4dd0: 66 28 20 70 4f 72 64 65 72 42 79 20 29 7b 0a 20  f( pOrderBy ){. 
4de0: 20 20 20 20 20 20 20 70 75 73 68 4f 6e 74 6f 53         pushOntoS
4df0: 6f 72 74 65 72 28 70 50 61 72 73 65 2c 20 70 4f  orter(pParse, pO
4e00: 72 64 65 72 42 79 2c 20 70 29 3b 0a 20 20 20 20  rderBy, p);.    
4e10: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
4e20: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
4e30: 70 31 28 76 2c 20 4f 50 5f 4e 65 77 52 6f 77 69  p1(v, OP_NewRowi
4e40: 64 2c 20 69 50 61 72 6d 29 3b 0a 20 20 20 20 20  d, iParm);.     
4e50: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
4e60: 64 4f 70 32 28 76 2c 20 4f 50 5f 50 75 6c 6c 2c  dOp2(v, OP_Pull,
4e70: 20 31 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20   1, 0);.        
4e80: 73 71 6c 69 74 65 33 43 6f 64 65 49 6e 73 65 72  sqlite3CodeInser
4e90: 74 28 70 50 61 72 73 65 2c 20 69 50 61 72 6d 2c  t(pParse, iParm,
4ea0: 20 4f 50 46 4c 41 47 5f 41 50 50 45 4e 44 29 3b   OPFLAG_APPEND);
4eb0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62  .      }.      b
4ec0: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 23 69 66  reak;.    }..#if
4ed0: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
4ee0: 5f 53 55 42 51 55 45 52 59 0a 20 20 20 20 2f 2a  _SUBQUERY.    /*
4ef0: 20 49 66 20 77 65 20 61 72 65 20 63 72 65 61 74   If we are creat
4f00: 69 6e 67 20 61 20 73 65 74 20 66 6f 72 20 61 6e  ing a set for an
4f10: 20 22 65 78 70 72 20 49 4e 20 28 53 45 4c 45 43   "expr IN (SELEC
4f20: 54 20 2e 2e 2e 29 22 20 63 6f 6e 73 74 72 75 63  T ...)" construc
4f30: 74 2c 0a 20 20 20 20 2a 2a 20 74 68 65 6e 20 74  t,.    ** then t
4f40: 68 65 72 65 20 73 68 6f 75 6c 64 20 62 65 20 61  here should be a
4f50: 20 73 69 6e 67 6c 65 20 69 74 65 6d 20 6f 6e 20   single item on 
4f60: 74 68 65 20 73 74 61 63 6b 2e 20 20 57 72 69 74  the stack.  Writ
4f70: 65 20 74 68 69 73 0a 20 20 20 20 2a 2a 20 69 74  e this.    ** it
4f80: 65 6d 20 69 6e 74 6f 20 74 68 65 20 73 65 74 20  em into the set 
4f90: 74 61 62 6c 65 20 77 69 74 68 20 62 6f 67 75 73  table with bogus
4fa0: 20 64 61 74 61 2e 0a 20 20 20 20 2a 2f 0a 20 20   data..    */.  
4fb0: 20 20 63 61 73 65 20 53 52 54 5f 53 65 74 3a 20    case SRT_Set: 
4fc0: 7b 0a 20 20 20 20 20 20 69 6e 74 20 61 64 64 72  {.      int addr
4fd0: 32 3b 0a 0a 20 20 20 20 20 20 61 73 73 65 72 74  2;..      assert
4fe0: 28 20 6e 43 6f 6c 75 6d 6e 3d 3d 31 20 29 3b 0a  ( nColumn==1 );.
4ff0: 20 20 20 20 20 20 61 64 64 72 32 20 3d 20 73 71        addr2 = sq
5000: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
5010: 76 2c 20 4f 50 5f 49 66 4d 65 6d 4e 75 6c 6c 2c  v, OP_IfMemNull,
5020: 20 69 4d 65 6d 2b 31 2c 20 30 29 3b 0a 20 20 20   iMem+1, 0);.   
5030: 20 20 20 70 2d 3e 61 66 66 69 6e 69 74 79 20 3d     p->affinity =
5040: 20 73 71 6c 69 74 65 33 43 6f 6d 70 61 72 65 41   sqlite3CompareA
5050: 66 66 69 6e 69 74 79 28 70 45 4c 69 73 74 2d 3e  ffinity(pEList->
5060: 61 5b 30 5d 2e 70 45 78 70 72 2c 20 70 44 65 73  a[0].pExpr, pDes
5070: 74 2d 3e 61 66 66 69 6e 69 74 79 29 3b 0a 20 20  t->affinity);.  
5080: 20 20 20 20 69 66 28 20 70 4f 72 64 65 72 42 79      if( pOrderBy
5090: 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 41   ){.        /* A
50a0: 74 20 66 69 72 73 74 20 67 6c 61 6e 63 65 20 79  t first glance y
50b0: 6f 75 20 77 6f 75 6c 64 20 74 68 69 6e 6b 20 77  ou would think w
50c0: 65 20 63 6f 75 6c 64 20 6f 70 74 69 6d 69 7a 65  e could optimize
50d0: 20 6f 75 74 20 74 68 65 0a 20 20 20 20 20 20 20   out the.       
50e0: 20 2a 2a 20 4f 52 44 45 52 20 42 59 20 69 6e 20   ** ORDER BY in 
50f0: 74 68 69 73 20 63 61 73 65 20 73 69 6e 63 65 20  this case since 
5100: 74 68 65 20 6f 72 64 65 72 20 6f 66 20 65 6e 74  the order of ent
5110: 72 69 65 73 20 69 6e 20 74 68 65 20 73 65 74 0a  ries in the set.
5120: 20 20 20 20 20 20 20 20 2a 2a 20 64 6f 65 73 20          ** does 
5130: 6e 6f 74 20 6d 61 74 74 65 72 2e 20 20 42 75 74  not matter.  But
5140: 20 74 68 65 72 65 20 6d 69 67 68 74 20 62 65 20   there might be 
5150: 61 20 4c 49 4d 49 54 20 63 6c 61 75 73 65 2c 20  a LIMIT clause, 
5160: 69 6e 20 77 68 69 63 68 0a 20 20 20 20 20 20 20  in which.       
5170: 20 2a 2a 20 63 61 73 65 20 74 68 65 20 6f 72 64   ** case the ord
5180: 65 72 20 64 6f 65 73 20 6d 61 74 74 65 72 20 2a  er does matter *
5190: 2f 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  /.        sqlite
51a0: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
51b0: 50 5f 4d 65 6d 4c 6f 61 64 2c 20 69 4d 65 6d 2b  P_MemLoad, iMem+
51c0: 31 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 70  1, 0);.        p
51d0: 75 73 68 4f 6e 74 6f 53 6f 72 74 65 72 28 70 50  ushOntoSorter(pP
51e0: 61 72 73 65 2c 20 70 4f 72 64 65 72 42 79 2c 20  arse, pOrderBy, 
51f0: 70 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  p);.      }else{
5200: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
5210: 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50  VdbeAddOp4(v, OP
5220: 5f 52 65 67 4d 61 6b 65 52 65 63 2c 20 69 4d 65  _RegMakeRec, iMe
5230: 6d 2c 20 30 2c 20 30 2c 20 26 70 2d 3e 61 66 66  m, 0, 0, &p->aff
5240: 69 6e 69 74 79 2c 20 31 29 3b 0a 20 20 20 20 20  inity, 1);.     
5250: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
5260: 64 4f 70 32 28 76 2c 20 4f 50 5f 49 64 78 49 6e  dOp2(v, OP_IdxIn
5270: 73 65 72 74 2c 20 69 50 61 72 6d 2c 20 30 29 3b  sert, iParm, 0);
5280: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73  .      }.      s
5290: 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65  qlite3VdbeJumpHe
52a0: 72 65 28 76 2c 20 61 64 64 72 32 29 3b 0a 20 20  re(v, addr2);.  
52b0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
52c0: 0a 0a 20 20 20 20 2f 2a 20 49 66 20 61 6e 79 20  ..    /* If any 
52d0: 72 6f 77 20 65 78 69 73 74 20 69 6e 20 74 68 65  row exist in the
52e0: 20 72 65 73 75 6c 74 20 73 65 74 2c 20 72 65 63   result set, rec
52f0: 6f 72 64 20 74 68 61 74 20 66 61 63 74 20 61 6e  ord that fact an
5300: 64 20 61 62 6f 72 74 2e 0a 20 20 20 20 2a 2f 0a  d abort..    */.
5310: 20 20 20 20 63 61 73 65 20 53 52 54 5f 45 78 69      case SRT_Exi
5320: 73 74 73 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c  sts: {.      sql
5330: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
5340: 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 31 2c  , OP_Integer, 1,
5350: 20 69 50 61 72 6d 29 3b 0a 20 20 20 20 20 20 2f   iParm);.      /
5360: 2a 20 54 68 65 20 4c 49 4d 49 54 20 63 6c 61 75  * The LIMIT clau
5370: 73 65 20 77 69 6c 6c 20 74 65 72 6d 69 6e 61 74  se will terminat
5380: 65 20 74 68 65 20 6c 6f 6f 70 20 66 6f 72 20 75  e the loop for u
5390: 73 20 2a 2f 0a 20 20 20 20 20 20 62 72 65 61 6b  s */.      break
53a0: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
53b0: 49 66 20 74 68 69 73 20 69 73 20 61 20 73 63 61  If this is a sca
53c0: 6c 61 72 20 73 65 6c 65 63 74 20 74 68 61 74 20  lar select that 
53d0: 69 73 20 70 61 72 74 20 6f 66 20 61 6e 20 65 78  is part of an ex
53e0: 70 72 65 73 73 69 6f 6e 2c 20 74 68 65 6e 0a 20  pression, then. 
53f0: 20 20 20 2a 2a 20 73 74 6f 72 65 20 74 68 65 20     ** store the 
5400: 72 65 73 75 6c 74 73 20 69 6e 20 74 68 65 20 61  results in the a
5410: 70 70 72 6f 70 72 69 61 74 65 20 6d 65 6d 6f 72  ppropriate memor
5420: 79 20 63 65 6c 6c 20 61 6e 64 20 62 72 65 61 6b  y cell and break
5430: 20 6f 75 74 0a 20 20 20 20 2a 2a 20 6f 66 20 74   out.    ** of t
5440: 68 65 20 73 63 61 6e 20 6c 6f 6f 70 2e 0a 20 20  he scan loop..  
5450: 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 52    */.    case SR
5460: 54 5f 4d 65 6d 3a 20 7b 0a 20 20 20 20 20 20 61  T_Mem: {.      a
5470: 73 73 65 72 74 28 20 6e 43 6f 6c 75 6d 6e 3d 3d  ssert( nColumn==
5480: 31 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  1 );.      sqlit
5490: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
54a0: 4f 50 5f 4d 65 6d 4c 6f 61 64 2c 20 69 4d 65 6d  OP_MemLoad, iMem
54b0: 2b 31 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66  +1, 0);.      if
54c0: 28 20 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20  ( pOrderBy ){.  
54d0: 20 20 20 20 20 20 70 75 73 68 4f 6e 74 6f 53 6f        pushOntoSo
54e0: 72 74 65 72 28 70 50 61 72 73 65 2c 20 70 4f 72  rter(pParse, pOr
54f0: 64 65 72 42 79 2c 20 70 29 3b 0a 20 20 20 20 20  derBy, p);.     
5500: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
5510: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
5520: 32 28 76 2c 20 4f 50 5f 4d 65 6d 53 74 6f 72 65  2(v, OP_MemStore
5530: 2c 20 69 50 61 72 6d 2c 20 31 29 3b 0a 20 20 20  , iParm, 1);.   
5540: 20 20 20 20 20 2f 2a 20 54 68 65 20 4c 49 4d 49       /* The LIMI
5550: 54 20 63 6c 61 75 73 65 20 77 69 6c 6c 20 6a 75  T clause will ju
5560: 6d 70 20 6f 75 74 20 6f 66 20 74 68 65 20 6c 6f  mp out of the lo
5570: 6f 70 20 66 6f 72 20 75 73 20 2a 2f 0a 20 20 20  op for us */.   
5580: 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b     }.      break
5590: 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 20 2f  ;.    }.#endif /
55a0: 2a 20 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  * #ifndef SQLITE
55b0: 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 20 2a  _OMIT_SUBQUERY *
55c0: 2f 0a 0a 20 20 20 20 2f 2a 20 53 65 6e 64 20 74  /..    /* Send t
55d0: 68 65 20 64 61 74 61 20 74 6f 20 74 68 65 20 63  he data to the c
55e0: 61 6c 6c 62 61 63 6b 20 66 75 6e 63 74 69 6f 6e  allback function
55f0: 20 6f 72 20 74 6f 20 61 20 73 75 62 72 6f 75 74   or to a subrout
5600: 69 6e 65 2e 20 20 49 6e 20 74 68 65 0a 20 20 20  ine.  In the.   
5610: 20 2a 2a 20 63 61 73 65 20 6f 66 20 61 20 73 75   ** case of a su
5620: 62 72 6f 75 74 69 6e 65 2c 20 74 68 65 20 73 75  broutine, the su
5630: 62 72 6f 75 74 69 6e 65 20 69 74 73 65 6c 66 20  broutine itself 
5640: 69 73 20 72 65 73 70 6f 6e 73 69 62 6c 65 20 66  is responsible f
5650: 6f 72 0a 20 20 20 20 2a 2a 20 70 6f 70 70 69 6e  or.    ** poppin
5660: 67 20 74 68 65 20 64 61 74 61 20 66 72 6f 6d 20  g the data from 
5670: 74 68 65 20 73 74 61 63 6b 2e 0a 20 20 20 20 2a  the stack..    *
5680: 2f 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f 53  /.    case SRT_S
5690: 75 62 72 6f 75 74 69 6e 65 3a 0a 20 20 20 20 63  ubroutine:.    c
56a0: 61 73 65 20 53 52 54 5f 43 61 6c 6c 62 61 63 6b  ase SRT_Callback
56b0: 3a 20 7b 0a 20 20 20 20 20 20 69 66 28 20 70 4f  : {.      if( pO
56c0: 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20 20 20  rderBy ){.      
56d0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
56e0: 4f 70 32 28 76 2c 20 4f 50 5f 52 65 67 4d 61 6b  Op2(v, OP_RegMak
56f0: 65 52 65 63 2c 20 69 4d 65 6d 2c 20 30 29 3b 0a  eRec, iMem, 0);.
5700: 20 20 20 20 20 20 20 20 70 75 73 68 4f 6e 74 6f          pushOnto
5710: 53 6f 72 74 65 72 28 70 50 61 72 73 65 2c 20 70  Sorter(pParse, p
5720: 4f 72 64 65 72 42 79 2c 20 70 29 3b 0a 20 20 20  OrderBy, p);.   
5730: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 65 44 65     }else if( eDe
5740: 73 74 3d 3d 53 52 54 5f 53 75 62 72 6f 75 74 69  st==SRT_Subrouti
5750: 6e 65 20 29 7b 0a 20 20 20 20 20 20 20 20 66 6f  ne ){.        fo
5760: 72 28 69 3d 30 3b 20 69 3c 6e 43 6f 6c 75 6d 6e  r(i=0; i<nColumn
5770: 3b 20 69 2b 2b 29 20 73 71 6c 69 74 65 33 56 64  ; i++) sqlite3Vd
5780: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4d  beAddOp2(v, OP_M
5790: 65 6d 4c 6f 61 64 2c 20 69 4d 65 6d 2b 69 2b 31  emLoad, iMem+i+1
57a0: 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 73 71  , 0);.        sq
57b0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
57c0: 76 2c 20 4f 50 5f 47 6f 73 75 62 2c 20 30 2c 20  v, OP_Gosub, 0, 
57d0: 69 50 61 72 6d 29 3b 0a 20 20 20 20 20 20 7d 65  iParm);.      }e
57e0: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  lse{.        sql
57f0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
5800: 2c 20 4f 50 5f 52 65 73 75 6c 74 52 6f 77 2c 20  , OP_ResultRow, 
5810: 69 4d 65 6d 2b 31 2c 20 6e 43 6f 6c 75 6d 6e 29  iMem+1, nColumn)
5820: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
5830: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 23 69  break;.    }..#i
5840: 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  f !defined(SQLIT
5850: 45 5f 4f 4d 49 54 5f 54 52 49 47 47 45 52 29 0a  E_OMIT_TRIGGER).
5860: 20 20 20 20 2f 2a 20 44 69 73 63 61 72 64 20 74      /* Discard t
5870: 68 65 20 72 65 73 75 6c 74 73 2e 20 20 54 68 69  he results.  Thi
5880: 73 20 69 73 20 75 73 65 64 20 66 6f 72 20 53 45  s is used for SE
5890: 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 73 20  LECT statements 
58a0: 69 6e 73 69 64 65 0a 20 20 20 20 2a 2a 20 74 68  inside.    ** th
58b0: 65 20 62 6f 64 79 20 6f 66 20 61 20 54 52 49 47  e body of a TRIG
58c0: 47 45 52 2e 20 20 54 68 65 20 70 75 72 70 6f 73  GER.  The purpos
58d0: 65 20 6f 66 20 73 75 63 68 20 73 65 6c 65 63 74  e of such select
58e0: 73 20 69 73 20 74 6f 20 63 61 6c 6c 0a 20 20 20  s is to call.   
58f0: 20 2a 2a 20 75 73 65 72 2d 64 65 66 69 6e 65 64   ** user-defined
5900: 20 66 75 6e 63 74 69 6f 6e 73 20 74 68 61 74 20   functions that 
5910: 68 61 76 65 20 73 69 64 65 20 65 66 66 65 63 74  have side effect
5920: 73 2e 20 20 57 65 20 64 6f 20 6e 6f 74 20 63 61  s.  We do not ca
5930: 72 65 0a 20 20 20 20 2a 2a 20 61 62 6f 75 74 20  re.    ** about 
5940: 74 68 65 20 61 63 74 75 61 6c 20 72 65 73 75 6c  the actual resul
5950: 74 73 20 6f 66 20 74 68 65 20 73 65 6c 65 63 74  ts of the select
5960: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 64 65 66  ..    */.    def
5970: 61 75 6c 74 3a 20 7b 0a 20 20 20 20 20 20 61 73  ault: {.      as
5980: 73 65 72 74 28 20 65 44 65 73 74 3d 3d 53 52 54  sert( eDest==SRT
5990: 5f 44 69 73 63 61 72 64 20 29 3b 0a 20 20 20 20  _Discard );.    
59a0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23    break;.    }.#
59b0: 65 6e 64 69 66 0a 20 20 7d 0a 0a 20 20 2f 2a 20  endif.  }..  /* 
59c0: 4a 75 6d 70 20 74 6f 20 74 68 65 20 65 6e 64 20  Jump to the end 
59d0: 6f 66 20 74 68 65 20 6c 6f 6f 70 20 69 66 20 74  of the loop if t
59e0: 68 65 20 4c 49 4d 49 54 20 69 73 20 72 65 61 63  he LIMIT is reac
59f0: 68 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  hed..  */.  if( 
5a00: 70 2d 3e 69 4c 69 6d 69 74 3e 3d 30 20 26 26 20  p->iLimit>=0 && 
5a10: 70 4f 72 64 65 72 42 79 3d 3d 30 20 29 7b 0a 20  pOrderBy==0 ){. 
5a20: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
5a30: 64 4f 70 32 28 76 2c 20 4f 50 5f 4d 65 6d 49 6e  dOp2(v, OP_MemIn
5a40: 63 72 2c 20 2d 31 2c 20 70 2d 3e 69 4c 69 6d 69  cr, -1, p->iLimi
5a50: 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  t);.    sqlite3V
5a60: 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
5a70: 49 66 4d 65 6d 5a 65 72 6f 2c 20 70 2d 3e 69 4c  IfMemZero, p->iL
5a80: 69 6d 69 74 2c 20 69 42 72 65 61 6b 29 3b 0a 20  imit, iBreak);. 
5a90: 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d   }.  return 0;.}
5aa0: 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20 61 6e  ../*.** Given an
5ab0: 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74   expression list
5ac0: 2c 20 67 65 6e 65 72 61 74 65 20 61 20 4b 65 79  , generate a Key
5ad0: 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65 20 74  Info structure t
5ae0: 68 61 74 20 72 65 63 6f 72 64 73 0a 2a 2a 20 74  hat records.** t
5af0: 68 65 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71  he collating seq
5b00: 75 65 6e 63 65 20 66 6f 72 20 65 61 63 68 20 65  uence for each e
5b10: 78 70 72 65 73 73 69 6f 6e 20 69 6e 20 74 68 61  xpression in tha
5b20: 74 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 69 73  t expression lis
5b30: 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  t..**.** If the 
5b40: 45 78 70 72 4c 69 73 74 20 69 73 20 61 6e 20 4f  ExprList is an O
5b50: 52 44 45 52 20 42 59 20 6f 72 20 47 52 4f 55 50  RDER BY or GROUP
5b60: 20 42 59 20 63 6c 61 75 73 65 20 74 68 65 6e 20   BY clause then 
5b70: 74 68 65 20 72 65 73 75 6c 74 69 6e 67 0a 2a 2a  the resulting.**
5b80: 20 4b 65 79 49 6e 66 6f 20 73 74 72 75 63 74 75   KeyInfo structu
5b90: 72 65 20 69 73 20 61 70 70 72 6f 70 72 69 61 74  re is appropriat
5ba0: 65 20 66 6f 72 20 69 6e 69 74 69 61 6c 69 7a 69  e for initializi
5bb0: 6e 67 20 61 20 76 69 72 74 75 61 6c 20 69 6e 64  ng a virtual ind
5bc0: 65 78 20 74 6f 0a 2a 2a 20 69 6d 70 6c 65 6d 65  ex to.** impleme
5bd0: 6e 74 20 74 68 61 74 20 63 6c 61 75 73 65 2e 20  nt that clause. 
5be0: 20 49 66 20 74 68 65 20 45 78 70 72 4c 69 73 74   If the ExprList
5bf0: 20 69 73 20 74 68 65 20 72 65 73 75 6c 74 20 73   is the result s
5c00: 65 74 20 6f 66 20 61 20 53 45 4c 45 43 54 0a 2a  et of a SELECT.*
5c10: 2a 20 74 68 65 6e 20 74 68 65 20 4b 65 79 49 6e  * then the KeyIn
5c20: 66 6f 20 73 74 72 75 63 74 75 72 65 20 69 73 20  fo structure is 
5c30: 61 70 70 72 6f 70 72 69 61 74 65 20 66 6f 72 20  appropriate for 
5c40: 69 6e 69 74 69 61 6c 69 7a 69 6e 67 20 61 20 76  initializing a v
5c50: 69 72 74 75 61 6c 0a 2a 2a 20 69 6e 64 65 78 20  irtual.** index 
5c60: 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 61 20 44  to implement a D
5c70: 49 53 54 49 4e 43 54 20 74 65 73 74 2e 0a 2a 2a  ISTINCT test..**
5c80: 0a 2a 2a 20 53 70 61 63 65 20 74 6f 20 68 6f 6c  .** Space to hol
5c90: 64 20 74 68 65 20 4b 65 79 49 6e 66 6f 20 73 74  d the KeyInfo st
5ca0: 72 75 63 74 75 72 65 20 69 73 20 6f 62 74 61 69  ructure is obtai
5cb0: 6e 20 66 72 6f 6d 20 6d 61 6c 6c 6f 63 2e 20 20  n from malloc.  
5cc0: 54 68 65 20 63 61 6c 6c 69 6e 67 0a 2a 2a 20 66  The calling.** f
5cd0: 75 6e 63 74 69 6f 6e 20 69 73 20 72 65 73 70 6f  unction is respo
5ce0: 6e 73 69 62 6c 65 20 66 6f 72 20 73 65 65 69 6e  nsible for seein
5cf0: 67 20 74 68 61 74 20 74 68 69 73 20 73 74 72 75  g that this stru
5d00: 63 74 75 72 65 20 69 73 20 65 76 65 6e 74 75 61  cture is eventua
5d10: 6c 6c 79 0a 2a 2a 20 66 72 65 65 64 2e 20 20 41  lly.** freed.  A
5d20: 64 64 20 74 68 65 20 4b 65 79 49 6e 66 6f 20 73  dd the KeyInfo s
5d30: 74 72 75 63 74 75 72 65 20 74 6f 20 74 68 65 20  tructure to the 
5d40: 50 34 20 66 69 65 6c 64 20 6f 66 20 61 6e 20 6f  P4 field of an o
5d50: 70 63 6f 64 65 20 75 73 69 6e 67 0a 2a 2a 20 50  pcode using.** P
5d60: 34 5f 4b 45 59 49 4e 46 4f 5f 48 41 4e 44 4f 46  4_KEYINFO_HANDOF
5d70: 46 20 69 73 20 74 68 65 20 75 73 75 61 6c 20 77  F is the usual w
5d80: 61 79 20 6f 66 20 64 65 61 6c 69 6e 67 20 77 69  ay of dealing wi
5d90: 74 68 20 74 68 69 73 2e 0a 2a 2f 0a 73 74 61 74  th this..*/.stat
5da0: 69 63 20 4b 65 79 49 6e 66 6f 20 2a 6b 65 79 49  ic KeyInfo *keyI
5db0: 6e 66 6f 46 72 6f 6d 45 78 70 72 4c 69 73 74 28  nfoFromExprList(
5dc0: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 45  Parse *pParse, E
5dd0: 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 29 7b  xprList *pList){
5de0: 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d  .  sqlite3 *db =
5df0: 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 69   pParse->db;.  i
5e00: 6e 74 20 6e 45 78 70 72 3b 0a 20 20 4b 65 79 49  nt nExpr;.  KeyI
5e10: 6e 66 6f 20 2a 70 49 6e 66 6f 3b 0a 20 20 73 74  nfo *pInfo;.  st
5e20: 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74  ruct ExprList_it
5e30: 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 69 6e 74  em *pItem;.  int
5e40: 20 69 3b 0a 0a 20 20 6e 45 78 70 72 20 3d 20 70   i;..  nExpr = p
5e50: 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 0a 20 20 70  List->nExpr;.  p
5e60: 49 6e 66 6f 20 3d 20 73 71 6c 69 74 65 33 44 62  Info = sqlite3Db
5e70: 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 73  MallocZero(db, s
5e80: 69 7a 65 6f 66 28 2a 70 49 6e 66 6f 29 20 2b 20  izeof(*pInfo) + 
5e90: 6e 45 78 70 72 2a 28 73 69 7a 65 6f 66 28 43 6f  nExpr*(sizeof(Co
5ea0: 6c 6c 53 65 71 2a 29 2b 31 29 20 29 3b 0a 20 20  llSeq*)+1) );.  
5eb0: 69 66 28 20 70 49 6e 66 6f 20 29 7b 0a 20 20 20  if( pInfo ){.   
5ec0: 20 70 49 6e 66 6f 2d 3e 61 53 6f 72 74 4f 72 64   pInfo->aSortOrd
5ed0: 65 72 20 3d 20 28 75 38 2a 29 26 70 49 6e 66 6f  er = (u8*)&pInfo
5ee0: 2d 3e 61 43 6f 6c 6c 5b 6e 45 78 70 72 5d 3b 0a  ->aColl[nExpr];.
5ef0: 20 20 20 20 70 49 6e 66 6f 2d 3e 6e 46 69 65 6c      pInfo->nFiel
5f00: 64 20 3d 20 6e 45 78 70 72 3b 0a 20 20 20 20 70  d = nExpr;.    p
5f10: 49 6e 66 6f 2d 3e 65 6e 63 20 3d 20 45 4e 43 28  Info->enc = ENC(
5f20: 64 62 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30  db);.    for(i=0
5f30: 2c 20 70 49 74 65 6d 3d 70 4c 69 73 74 2d 3e 61  , pItem=pList->a
5f40: 3b 20 69 3c 6e 45 78 70 72 3b 20 69 2b 2b 2c 20  ; i<nExpr; i++, 
5f50: 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 20 20  pItem++){.      
5f60: 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 3b 0a  CollSeq *pColl;.
5f70: 20 20 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71        pColl = sq
5f80: 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c 53 65 71  lite3ExprCollSeq
5f90: 28 70 50 61 72 73 65 2c 20 70 49 74 65 6d 2d 3e  (pParse, pItem->
5fa0: 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20 69 66  pExpr);.      if
5fb0: 28 20 21 70 43 6f 6c 6c 20 29 7b 0a 20 20 20 20  ( !pColl ){.    
5fc0: 20 20 20 20 70 43 6f 6c 6c 20 3d 20 64 62 2d 3e      pColl = db->
5fd0: 70 44 66 6c 74 43 6f 6c 6c 3b 0a 20 20 20 20 20  pDfltColl;.     
5fe0: 20 7d 0a 20 20 20 20 20 20 70 49 6e 66 6f 2d 3e   }.      pInfo->
5ff0: 61 43 6f 6c 6c 5b 69 5d 20 3d 20 70 43 6f 6c 6c  aColl[i] = pColl
6000: 3b 0a 20 20 20 20 20 20 70 49 6e 66 6f 2d 3e 61  ;.      pInfo->a
6010: 53 6f 72 74 4f 72 64 65 72 5b 69 5d 20 3d 20 70  SortOrder[i] = p
6020: 49 74 65 6d 2d 3e 73 6f 72 74 4f 72 64 65 72 3b  Item->sortOrder;
6030: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
6040: 75 72 6e 20 70 49 6e 66 6f 3b 0a 7d 0a 0a 0a 2f  urn pInfo;.}.../
6050: 2a 0a 2a 2a 20 49 66 20 74 68 65 20 69 6e 6e 65  *.** If the inne
6060: 72 20 6c 6f 6f 70 20 77 61 73 20 67 65 6e 65 72  r loop was gener
6070: 61 74 65 64 20 75 73 69 6e 67 20 61 20 6e 6f 6e  ated using a non
6080: 2d 6e 75 6c 6c 20 70 4f 72 64 65 72 42 79 20 61  -null pOrderBy a
6090: 72 67 75 6d 65 6e 74 2c 0a 2a 2a 20 74 68 65 6e  rgument,.** then
60a0: 20 74 68 65 20 72 65 73 75 6c 74 73 20 77 65 72   the results wer
60b0: 65 20 70 6c 61 63 65 64 20 69 6e 20 61 20 73 6f  e placed in a so
60c0: 72 74 65 72 2e 20 20 41 66 74 65 72 20 74 68 65  rter.  After the
60d0: 20 6c 6f 6f 70 20 69 73 20 74 65 72 6d 69 6e 61   loop is termina
60e0: 74 65 64 0a 2a 2a 20 77 65 20 6e 65 65 64 20 74  ted.** we need t
60f0: 6f 20 72 75 6e 20 74 68 65 20 73 6f 72 74 65 72  o run the sorter
6100: 20 61 6e 64 20 6f 75 74 70 75 74 20 74 68 65 20   and output the 
6110: 72 65 73 75 6c 74 73 2e 20 20 54 68 65 20 66 6f  results.  The fo
6120: 6c 6c 6f 77 69 6e 67 0a 2a 2a 20 72 6f 75 74 69  llowing.** routi
6130: 6e 65 20 67 65 6e 65 72 61 74 65 73 20 74 68 65  ne generates the
6140: 20 63 6f 64 65 20 6e 65 65 64 65 64 20 74 6f 20   code needed to 
6150: 64 6f 20 74 68 61 74 2e 0a 2a 2f 0a 73 74 61 74  do that..*/.stat
6160: 69 63 20 76 6f 69 64 20 67 65 6e 65 72 61 74 65  ic void generate
6170: 53 6f 72 74 54 61 69 6c 28 0a 20 20 50 61 72 73  SortTail(.  Pars
6180: 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 2f 2a  e *pParse,    /*
6190: 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74   Parsing context
61a0: 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 2c   */.  Select *p,
61b0: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 53          /* The S
61c0: 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20  ELECT statement 
61d0: 2a 2f 0a 20 20 56 64 62 65 20 2a 76 2c 20 20 20  */.  Vdbe *v,   
61e0: 20 20 20 20 20 20 20 2f 2a 20 47 65 6e 65 72 61         /* Genera
61f0: 74 65 20 63 6f 64 65 20 69 6e 74 6f 20 74 68 69  te code into thi
6200: 73 20 56 44 42 45 20 2a 2f 0a 20 20 69 6e 74 20  s VDBE */.  int 
6210: 6e 43 6f 6c 75 6d 6e 2c 20 20 20 20 20 20 2f 2a  nColumn,      /*
6220: 20 4e 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d   Number of colum
6230: 6e 73 20 6f 66 20 64 61 74 61 20 2a 2f 0a 20 20  ns of data */.  
6240: 53 65 6c 65 63 74 44 65 73 74 20 2a 70 44 65 73  SelectDest *pDes
6250: 74 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20 73  t /* Write the s
6260: 6f 72 74 65 64 20 72 65 73 75 6c 74 73 20 68 65  orted results he
6270: 72 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 62  re */.){.  int b
6280: 72 6b 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  rk = sqlite3Vdbe
6290: 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20  MakeLabel(v);.  
62a0: 69 6e 74 20 63 6f 6e 74 20 3d 20 73 71 6c 69 74  int cont = sqlit
62b0: 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28  e3VdbeMakeLabel(
62c0: 76 29 3b 0a 20 20 69 6e 74 20 61 64 64 72 3b 0a  v);.  int addr;.
62d0: 20 20 69 6e 74 20 69 54 61 62 3b 0a 20 20 69 6e    int iTab;.  in
62e0: 74 20 70 73 65 75 64 6f 54 61 62 20 3d 20 30 3b  t pseudoTab = 0;
62f0: 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4f 72  .  ExprList *pOr
6300: 64 65 72 42 79 20 3d 20 70 2d 3e 70 4f 72 64 65  derBy = p->pOrde
6310: 72 42 79 3b 0a 0a 20 20 69 6e 74 20 65 44 65 73  rBy;..  int eDes
6320: 74 20 3d 20 70 44 65 73 74 2d 3e 65 44 65 73 74  t = pDest->eDest
6330: 3b 0a 20 20 69 6e 74 20 69 50 61 72 6d 20 3d 20  ;.  int iParm = 
6340: 70 44 65 73 74 2d 3e 69 50 61 72 6d 3b 0a 0a 20  pDest->iParm;.. 
6350: 20 69 54 61 62 20 3d 20 70 4f 72 64 65 72 42 79   iTab = pOrderBy
6360: 2d 3e 69 45 43 75 72 73 6f 72 3b 0a 20 20 69 66  ->iECursor;.  if
6370: 28 20 65 44 65 73 74 3d 3d 53 52 54 5f 43 61 6c  ( eDest==SRT_Cal
6380: 6c 62 61 63 6b 20 7c 7c 20 65 44 65 73 74 3d 3d  lback || eDest==
6390: 53 52 54 5f 53 75 62 72 6f 75 74 69 6e 65 20 29  SRT_Subroutine )
63a0: 7b 0a 20 20 20 20 70 73 65 75 64 6f 54 61 62 20  {.    pseudoTab 
63b0: 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b  = pParse->nTab++
63c0: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
63d0: 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4f 70  eAddOp2(v, OP_Op
63e0: 65 6e 50 73 65 75 64 6f 2c 20 70 73 65 75 64 6f  enPseudo, pseudo
63f0: 54 61 62 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c  Tab, 0);.    sql
6400: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
6410: 2c 20 4f 50 5f 53 65 74 4e 75 6d 43 6f 6c 75 6d  , OP_SetNumColum
6420: 6e 73 2c 20 70 73 65 75 64 6f 54 61 62 2c 20 6e  ns, pseudoTab, n
6430: 43 6f 6c 75 6d 6e 29 3b 0a 20 20 7d 0a 20 20 61  Column);.  }.  a
6440: 64 64 72 20 3d 20 31 20 2b 20 73 71 6c 69 74 65  ddr = 1 + sqlite
6450: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
6460: 50 5f 53 6f 72 74 2c 20 69 54 61 62 2c 20 62 72  P_Sort, iTab, br
6470: 6b 29 3b 0a 20 20 63 6f 64 65 4f 66 66 73 65 74  k);.  codeOffset
6480: 28 76 2c 20 70 2c 20 63 6f 6e 74 2c 20 30 29 3b  (v, p, cont, 0);
6490: 0a 20 20 69 66 28 20 65 44 65 73 74 3d 3d 53 52  .  if( eDest==SR
64a0: 54 5f 43 61 6c 6c 62 61 63 6b 20 7c 7c 20 65 44  T_Callback || eD
64b0: 65 73 74 3d 3d 53 52 54 5f 53 75 62 72 6f 75 74  est==SRT_Subrout
64c0: 69 6e 65 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ine ){.    sqlit
64d0: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
64e0: 4f 50 5f 49 6e 74 65 67 65 72 2c 20 31 2c 20 30  OP_Integer, 1, 0
64f0: 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  );.  }.  sqlite3
6500: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
6510: 5f 43 6f 6c 75 6d 6e 2c 20 69 54 61 62 2c 20 70  _Column, iTab, p
6520: 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 20 2b  OrderBy->nExpr +
6530: 20 31 29 3b 0a 20 20 73 77 69 74 63 68 28 20 65   1);.  switch( e
6540: 44 65 73 74 20 29 7b 0a 20 20 20 20 63 61 73 65  Dest ){.    case
6550: 20 53 52 54 5f 54 61 62 6c 65 3a 0a 20 20 20 20   SRT_Table:.    
6560: 63 61 73 65 20 53 52 54 5f 45 70 68 65 6d 54 61  case SRT_EphemTa
6570: 62 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  b: {.      sqlit
6580: 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20  e3VdbeAddOp1(v, 
6590: 4f 50 5f 4e 65 77 52 6f 77 69 64 2c 20 69 50 61  OP_NewRowid, iPa
65a0: 72 6d 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  rm);.      sqlit
65b0: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
65c0: 4f 50 5f 50 75 6c 6c 2c 20 31 2c 20 30 29 3b 0a  OP_Pull, 1, 0);.
65d0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 43 6f 64        sqlite3Cod
65e0: 65 49 6e 73 65 72 74 28 70 50 61 72 73 65 2c 20  eInsert(pParse, 
65f0: 69 50 61 72 6d 2c 20 4f 50 46 4c 41 47 5f 41 50  iParm, OPFLAG_AP
6600: 50 45 4e 44 29 3b 0a 20 20 20 20 20 20 62 72 65  PEND);.      bre
6610: 61 6b 3b 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65  ak;.    }.#ifnde
6620: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55  f SQLITE_OMIT_SU
6630: 42 51 55 45 52 59 0a 20 20 20 20 63 61 73 65 20  BQUERY.    case 
6640: 53 52 54 5f 53 65 74 3a 20 7b 0a 20 20 20 20 20  SRT_Set: {.     
6650: 20 61 73 73 65 72 74 28 20 6e 43 6f 6c 75 6d 6e   assert( nColumn
6660: 3d 3d 31 20 29 3b 0a 20 20 20 20 20 20 73 71 6c  ==1 );.      sql
6670: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
6680: 2c 20 4f 50 5f 4e 6f 74 4e 75 6c 6c 2c 20 2d 31  , OP_NotNull, -1
6690: 2c 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72  , sqlite3VdbeCur
66a0: 72 65 6e 74 41 64 64 72 28 76 29 2b 33 29 3b 0a  rentAddr(v)+3);.
66b0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
66c0: 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 50 6f  eAddOp2(v, OP_Po
66d0: 70 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20 20 20  p, 1, 0);.      
66e0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
66f0: 32 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c  2(v, OP_Goto, 0,
6700: 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72   sqlite3VdbeCurr
6710: 65 6e 74 41 64 64 72 28 76 29 2b 33 29 3b 0a 20  entAddr(v)+3);. 
6720: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
6730: 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 4d 61 6b  AddOp4(v, OP_Mak
6740: 65 52 65 63 6f 72 64 2c 20 31 2c 20 30 2c 20 30  eRecord, 1, 0, 0
6750: 2c 20 26 70 2d 3e 61 66 66 69 6e 69 74 79 2c 20  , &p->affinity, 
6760: 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  1);.      sqlite
6770: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
6780: 50 5f 49 64 78 49 6e 73 65 72 74 2c 20 69 50 61  P_IdxInsert, iPa
6790: 72 6d 2c 20 30 29 3b 0a 20 20 20 20 20 20 62 72  rm, 0);.      br
67a0: 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  eak;.    }.    c
67b0: 61 73 65 20 53 52 54 5f 4d 65 6d 3a 20 7b 0a 20  ase SRT_Mem: {. 
67c0: 20 20 20 20 20 61 73 73 65 72 74 28 20 6e 43 6f       assert( nCo
67d0: 6c 75 6d 6e 3d 3d 31 20 29 3b 0a 20 20 20 20 20  lumn==1 );.     
67e0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
67f0: 70 32 28 76 2c 20 4f 50 5f 4d 65 6d 53 74 6f 72  p2(v, OP_MemStor
6800: 65 2c 20 69 50 61 72 6d 2c 20 31 29 3b 0a 20 20  e, iParm, 1);.  
6810: 20 20 20 20 2f 2a 20 54 68 65 20 4c 49 4d 49 54      /* The LIMIT
6820: 20 63 6c 61 75 73 65 20 77 69 6c 6c 20 74 65 72   clause will ter
6830: 6d 69 6e 61 74 65 20 74 68 65 20 6c 6f 6f 70 20  minate the loop 
6840: 66 6f 72 20 75 73 20 2a 2f 0a 20 20 20 20 20 20  for us */.      
6850: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e  break;.    }.#en
6860: 64 69 66 0a 20 20 20 20 63 61 73 65 20 53 52 54  dif.    case SRT
6870: 5f 43 61 6c 6c 62 61 63 6b 3a 0a 20 20 20 20 63  _Callback:.    c
6880: 61 73 65 20 53 52 54 5f 53 75 62 72 6f 75 74 69  ase SRT_Subrouti
6890: 6e 65 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20  ne: {.      int 
68a0: 69 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  i;.      sqlite3
68b0: 43 6f 64 65 49 6e 73 65 72 74 28 70 50 61 72 73  CodeInsert(pPars
68c0: 65 2c 20 70 73 65 75 64 6f 54 61 62 2c 20 30 29  e, pseudoTab, 0)
68d0: 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b  ;.      for(i=0;
68e0: 20 69 3c 6e 43 6f 6c 75 6d 6e 3b 20 69 2b 2b 29   i<nColumn; i++)
68f0: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
6900: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
6910: 50 5f 43 6f 6c 75 6d 6e 2c 20 70 73 65 75 64 6f  P_Column, pseudo
6920: 54 61 62 2c 20 69 29 3b 0a 20 20 20 20 20 20 7d  Tab, i);.      }
6930: 0a 20 20 20 20 20 20 69 66 28 20 65 44 65 73 74  .      if( eDest
6940: 3d 3d 53 52 54 5f 43 61 6c 6c 62 61 63 6b 20 29  ==SRT_Callback )
6950: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
6960: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
6970: 50 5f 43 61 6c 6c 62 61 63 6b 2c 20 6e 43 6f 6c  P_Callback, nCol
6980: 75 6d 6e 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d  umn, 0);.      }
6990: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71  else{.        sq
69a0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
69b0: 76 2c 20 4f 50 5f 47 6f 73 75 62 2c 20 30 2c 20  v, OP_Gosub, 0, 
69c0: 69 50 61 72 6d 29 3b 0a 20 20 20 20 20 20 7d 0a  iParm);.      }.
69d0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
69e0: 20 7d 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20   }.    default: 
69f0: 7b 0a 20 20 20 20 20 20 2f 2a 20 44 6f 20 6e 6f  {.      /* Do no
6a00: 74 68 69 6e 67 20 2a 2f 0a 20 20 20 20 20 20 62  thing */.      b
6a10: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  reak;.    }.  }.
6a20: 0a 20 20 2f 2a 20 4a 75 6d 70 20 74 6f 20 74 68  .  /* Jump to th
6a30: 65 20 65 6e 64 20 6f 66 20 74 68 65 20 6c 6f 6f  e end of the loo
6a40: 70 20 77 68 65 6e 20 74 68 65 20 4c 49 4d 49 54  p when the LIMIT
6a50: 20 69 73 20 72 65 61 63 68 65 64 0a 20 20 2a 2f   is reached.  */
6a60: 0a 20 20 69 66 28 20 70 2d 3e 69 4c 69 6d 69 74  .  if( p->iLimit
6a70: 3e 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  >=0 ){.    sqlit
6a80: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
6a90: 4f 50 5f 4d 65 6d 49 6e 63 72 2c 20 2d 31 2c 20  OP_MemIncr, -1, 
6aa0: 70 2d 3e 69 4c 69 6d 69 74 29 3b 0a 20 20 20 20  p->iLimit);.    
6ab0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
6ac0: 32 28 76 2c 20 4f 50 5f 49 66 4d 65 6d 5a 65 72  2(v, OP_IfMemZer
6ad0: 6f 2c 20 70 2d 3e 69 4c 69 6d 69 74 2c 20 62 72  o, p->iLimit, br
6ae0: 6b 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68  k);.  }..  /* Th
6af0: 65 20 62 6f 74 74 6f 6d 20 6f 66 20 74 68 65 20  e bottom of the 
6b00: 6c 6f 6f 70 0a 20 20 2a 2f 0a 20 20 73 71 6c 69  loop.  */.  sqli
6b10: 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61  te3VdbeResolveLa
6b20: 62 65 6c 28 76 2c 20 63 6f 6e 74 29 3b 0a 20 20  bel(v, cont);.  
6b30: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
6b40: 32 28 76 2c 20 4f 50 5f 4e 65 78 74 2c 20 69 54  2(v, OP_Next, iT
6b50: 61 62 2c 20 61 64 64 72 29 3b 0a 20 20 73 71 6c  ab, addr);.  sql
6b60: 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c  ite3VdbeResolveL
6b70: 61 62 65 6c 28 76 2c 20 62 72 6b 29 3b 0a 20 20  abel(v, brk);.  
6b80: 69 66 28 20 65 44 65 73 74 3d 3d 53 52 54 5f 43  if( eDest==SRT_C
6b90: 61 6c 6c 62 61 63 6b 20 7c 7c 20 65 44 65 73 74  allback || eDest
6ba0: 3d 3d 53 52 54 5f 53 75 62 72 6f 75 74 69 6e 65  ==SRT_Subroutine
6bb0: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56   ){.    sqlite3V
6bc0: 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
6bd0: 43 6c 6f 73 65 2c 20 70 73 65 75 64 6f 54 61 62  Close, pseudoTab
6be0: 2c 20 30 29 3b 0a 20 20 7d 0a 0a 7d 0a 0a 2f 2a  , 0);.  }..}../*
6bf0: 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 70 6f 69  .** Return a poi
6c00: 6e 74 65 72 20 74 6f 20 61 20 73 74 72 69 6e 67  nter to a string
6c10: 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20   containing the 
6c20: 27 64 65 63 6c 61 72 61 74 69 6f 6e 20 74 79 70  'declaration typ
6c30: 65 27 20 6f 66 20 74 68 65 0a 2a 2a 20 65 78 70  e' of the.** exp
6c40: 72 65 73 73 69 6f 6e 20 70 45 78 70 72 2e 20 54  ression pExpr. T
6c50: 68 65 20 73 74 72 69 6e 67 20 6d 61 79 20 62 65  he string may be
6c60: 20 74 72 65 61 74 65 64 20 61 73 20 73 74 61 74   treated as stat
6c70: 69 63 20 62 79 20 74 68 65 20 63 61 6c 6c 65 72  ic by the caller
6c80: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 64 65 63 6c  ..**.** The decl
6c90: 61 72 61 74 69 6f 6e 20 74 79 70 65 20 69 73 20  aration type is 
6ca0: 74 68 65 20 65 78 61 63 74 20 64 61 74 61 74 79  the exact dataty
6cb0: 70 65 20 64 65 66 69 6e 69 74 69 6f 6e 20 65 78  pe definition ex
6cc0: 74 72 61 63 74 65 64 20 66 72 6f 6d 20 74 68 65  tracted from the
6cd0: 0a 2a 2a 20 6f 72 69 67 69 6e 61 6c 20 43 52 45  .** original CRE
6ce0: 41 54 45 20 54 41 42 4c 45 20 73 74 61 74 65 6d  ATE TABLE statem
6cf0: 65 6e 74 20 69 66 20 74 68 65 20 65 78 70 72 65  ent if the expre
6d00: 73 73 69 6f 6e 20 69 73 20 61 20 63 6f 6c 75 6d  ssion is a colum
6d10: 6e 2e 20 54 68 65 0a 2a 2a 20 64 65 63 6c 61 72  n. The.** declar
6d20: 61 74 69 6f 6e 20 74 79 70 65 20 66 6f 72 20 61  ation type for a
6d30: 20 52 4f 57 49 44 20 66 69 65 6c 64 20 69 73 20   ROWID field is 
6d40: 49 4e 54 45 47 45 52 2e 20 45 78 61 63 74 6c 79  INTEGER. Exactly
6d50: 20 77 68 65 6e 20 61 6e 20 65 78 70 72 65 73 73   when an express
6d60: 69 6f 6e 0a 2a 2a 20 69 73 20 63 6f 6e 73 69 64  ion.** is consid
6d70: 65 72 65 64 20 61 20 63 6f 6c 75 6d 6e 20 63 61  ered a column ca
6d80: 6e 20 62 65 20 63 6f 6d 70 6c 65 78 20 69 6e 20  n be complex in 
6d90: 74 68 65 20 70 72 65 73 65 6e 63 65 20 6f 66 20  the presence of 
6da0: 73 75 62 71 75 65 72 69 65 73 2e 20 54 68 65 0a  subqueries. The.
6db0: 2a 2a 20 72 65 73 75 6c 74 2d 73 65 74 20 65 78  ** result-set ex
6dc0: 70 72 65 73 73 69 6f 6e 20 69 6e 20 61 6c 6c 20  pression in all 
6dd0: 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  of the following
6de0: 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
6df0: 74 73 20 69 73 20 0a 2a 2a 20 63 6f 6e 73 69 64  ts is .** consid
6e00: 65 72 65 64 20 61 20 63 6f 6c 75 6d 6e 20 62 79  ered a column by
6e10: 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e 0a   this function..
6e20: 2a 2a 0a 2a 2a 20 20 20 53 45 4c 45 43 54 20 63  **.**   SELECT c
6e30: 6f 6c 20 46 52 4f 4d 20 74 62 6c 3b 0a 2a 2a 20  ol FROM tbl;.** 
6e40: 20 20 53 45 4c 45 43 54 20 28 53 45 4c 45 43 54    SELECT (SELECT
6e50: 20 63 6f 6c 20 46 52 4f 4d 20 74 62 6c 3b 0a 2a   col FROM tbl;.*
6e60: 2a 20 20 20 53 45 4c 45 43 54 20 28 53 45 4c 45  *   SELECT (SELE
6e70: 43 54 20 63 6f 6c 20 46 52 4f 4d 20 74 62 6c 29  CT col FROM tbl)
6e80: 3b 0a 2a 2a 20 20 20 53 45 4c 45 43 54 20 61 62  ;.**   SELECT ab
6e90: 63 20 46 52 4f 4d 20 28 53 45 4c 45 43 54 20 63  c FROM (SELECT c
6ea0: 6f 6c 20 41 53 20 61 62 63 20 46 52 4f 4d 20 74  ol AS abc FROM t
6eb0: 62 6c 29 3b 0a 2a 2a 20 0a 2a 2a 20 54 68 65 20  bl);.** .** The 
6ec0: 64 65 63 6c 61 72 61 74 69 6f 6e 20 74 79 70 65  declaration type
6ed0: 20 66 6f 72 20 61 6e 79 20 65 78 70 72 65 73 73   for any express
6ee0: 69 6f 6e 20 6f 74 68 65 72 20 74 68 61 6e 20 61  ion other than a
6ef0: 20 63 6f 6c 75 6d 6e 20 69 73 20 4e 55 4c 4c 2e   column is NULL.
6f00: 0a 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73 74  .*/.static const
6f10: 20 63 68 61 72 20 2a 63 6f 6c 75 6d 6e 54 79 70   char *columnTyp
6f20: 65 28 0a 20 20 4e 61 6d 65 43 6f 6e 74 65 78 74  e(.  NameContext
6f30: 20 2a 70 4e 43 2c 20 0a 20 20 45 78 70 72 20 2a   *pNC, .  Expr *
6f40: 70 45 78 70 72 2c 0a 20 20 63 6f 6e 73 74 20 63  pExpr,.  const c
6f50: 68 61 72 20 2a 2a 70 7a 4f 72 69 67 69 6e 44 62  har **pzOriginDb
6f60: 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  ,.  const char *
6f70: 2a 70 7a 4f 72 69 67 69 6e 54 61 62 2c 0a 20 20  *pzOriginTab,.  
6f80: 63 6f 6e 73 74 20 63 68 61 72 20 2a 2a 70 7a 4f  const char **pzO
6f90: 72 69 67 69 6e 43 6f 6c 0a 29 7b 0a 20 20 63 68  riginCol.){.  ch
6fa0: 61 72 20 63 6f 6e 73 74 20 2a 7a 54 79 70 65 20  ar const *zType 
6fb0: 3d 20 30 3b 0a 20 20 63 68 61 72 20 63 6f 6e 73  = 0;.  char cons
6fc0: 74 20 2a 7a 4f 72 69 67 69 6e 44 62 20 3d 20 30  t *zOriginDb = 0
6fd0: 3b 0a 20 20 63 68 61 72 20 63 6f 6e 73 74 20 2a  ;.  char const *
6fe0: 7a 4f 72 69 67 69 6e 54 61 62 20 3d 20 30 3b 0a  zOriginTab = 0;.
6ff0: 20 20 63 68 61 72 20 63 6f 6e 73 74 20 2a 7a 4f    char const *zO
7000: 72 69 67 69 6e 43 6f 6c 20 3d 20 30 3b 0a 20 20  riginCol = 0;.  
7010: 69 6e 74 20 6a 3b 0a 20 20 69 66 28 20 70 45 78  int j;.  if( pEx
7020: 70 72 3d 3d 30 20 7c 7c 20 70 4e 43 2d 3e 70 53  pr==0 || pNC->pS
7030: 72 63 4c 69 73 74 3d 3d 30 20 29 20 72 65 74 75  rcList==0 ) retu
7040: 72 6e 20 30 3b 0a 0a 20 20 73 77 69 74 63 68 28  rn 0;..  switch(
7050: 20 70 45 78 70 72 2d 3e 6f 70 20 29 7b 0a 20 20   pExpr->op ){.  
7060: 20 20 63 61 73 65 20 54 4b 5f 41 47 47 5f 43 4f    case TK_AGG_CO
7070: 4c 55 4d 4e 3a 0a 20 20 20 20 63 61 73 65 20 54  LUMN:.    case T
7080: 4b 5f 43 4f 4c 55 4d 4e 3a 20 7b 0a 20 20 20 20  K_COLUMN: {.    
7090: 20 20 2f 2a 20 54 68 65 20 65 78 70 72 65 73 73    /* The express
70a0: 69 6f 6e 20 69 73 20 61 20 63 6f 6c 75 6d 6e 2e  ion is a column.
70b0: 20 4c 6f 63 61 74 65 20 74 68 65 20 74 61 62 6c   Locate the tabl
70c0: 65 20 74 68 65 20 63 6f 6c 75 6d 6e 20 69 73 20  e the column is 
70d0: 62 65 69 6e 67 0a 20 20 20 20 20 20 2a 2a 20 65  being.      ** e
70e0: 78 74 72 61 63 74 65 64 20 66 72 6f 6d 20 69 6e  xtracted from in
70f0: 20 4e 61 6d 65 43 6f 6e 74 65 78 74 2e 70 53 72   NameContext.pSr
7100: 63 4c 69 73 74 2e 20 54 68 69 73 20 74 61 62 6c  cList. This tabl
7110: 65 20 6d 61 79 20 62 65 20 72 65 61 6c 0a 20 20  e may be real.  
7120: 20 20 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20      ** database 
7130: 74 61 62 6c 65 20 6f 72 20 61 20 73 75 62 71 75  table or a subqu
7140: 65 72 79 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  ery..      */.  
7150: 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20      Table *pTab 
7160: 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
7170: 2f 2a 20 54 61 62 6c 65 20 73 74 72 75 63 74 75  /* Table structu
7180: 72 65 20 63 6f 6c 75 6d 6e 20 69 73 20 65 78 74  re column is ext
7190: 72 61 63 74 65 64 20 66 72 6f 6d 20 2a 2f 0a 20  racted from */. 
71a0: 20 20 20 20 20 53 65 6c 65 63 74 20 2a 70 53 20       Select *pS 
71b0: 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
71c0: 20 2f 2a 20 53 65 6c 65 63 74 20 74 68 65 20 63   /* Select the c
71d0: 6f 6c 75 6d 6e 20 69 73 20 65 78 74 72 61 63 74  olumn is extract
71e0: 65 64 20 66 72 6f 6d 20 2a 2f 0a 20 20 20 20 20  ed from */.     
71f0: 20 69 6e 74 20 69 43 6f 6c 20 3d 20 70 45 78 70   int iCol = pExp
7200: 72 2d 3e 69 43 6f 6c 75 6d 6e 3b 20 20 2f 2a 20  r->iColumn;  /* 
7210: 49 6e 64 65 78 20 6f 66 20 63 6f 6c 75 6d 6e 20  Index of column 
7220: 69 6e 20 70 54 61 62 20 2a 2f 0a 20 20 20 20 20  in pTab */.     
7230: 20 77 68 69 6c 65 28 20 70 4e 43 20 26 26 20 21   while( pNC && !
7240: 70 54 61 62 20 29 7b 0a 20 20 20 20 20 20 20 20  pTab ){.        
7250: 53 72 63 4c 69 73 74 20 2a 70 54 61 62 4c 69 73  SrcList *pTabLis
7260: 74 20 3d 20 70 4e 43 2d 3e 70 53 72 63 4c 69 73  t = pNC->pSrcLis
7270: 74 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 6a  t;.        for(j
7280: 3d 30 3b 6a 3c 70 54 61 62 4c 69 73 74 2d 3e 6e  =0;j<pTabList->n
7290: 53 72 63 20 26 26 20 70 54 61 62 4c 69 73 74 2d  Src && pTabList-
72a0: 3e 61 5b 6a 5d 2e 69 43 75 72 73 6f 72 21 3d 70  >a[j].iCursor!=p
72b0: 45 78 70 72 2d 3e 69 54 61 62 6c 65 3b 6a 2b 2b  Expr->iTable;j++
72c0: 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 6a  );.        if( j
72d0: 3c 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 20  <pTabList->nSrc 
72e0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 54 61  ){.          pTa
72f0: 62 20 3d 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b  b = pTabList->a[
7300: 6a 5d 2e 70 54 61 62 3b 0a 20 20 20 20 20 20 20  j].pTab;.       
7310: 20 20 20 70 53 20 3d 20 70 54 61 62 4c 69 73 74     pS = pTabList
7320: 2d 3e 61 5b 6a 5d 2e 70 53 65 6c 65 63 74 3b 0a  ->a[j].pSelect;.
7330: 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
7340: 20 20 20 20 20 20 20 20 20 70 4e 43 20 3d 20 70           pNC = p
7350: 4e 43 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20  NC->pNext;.     
7360: 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 0a 20 20     }.      }..  
7370: 20 20 20 20 69 66 28 20 70 54 61 62 3d 3d 30 20      if( pTab==0 
7380: 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 46 49  ){.        /* FI
7390: 58 20 4d 45 3a 0a 20 20 20 20 20 20 20 20 2a 2a  X ME:.        **
73a0: 20 54 68 69 73 20 63 61 6e 20 6f 63 63 75 72 73   This can occurs
73b0: 20 69 66 20 79 6f 75 20 68 61 76 65 20 73 6f 6d   if you have som
73c0: 65 74 68 69 6e 67 20 6c 69 6b 65 20 22 53 45 4c  ething like "SEL
73d0: 45 43 54 20 6e 65 77 2e 78 3b 22 20 69 6e 73 69  ECT new.x;" insi
73e0: 64 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 20  de.        ** a 
73f0: 74 72 69 67 67 65 72 2e 20 20 49 6e 20 6f 74 68  trigger.  In oth
7400: 65 72 20 77 6f 72 64 73 2c 20 69 66 20 79 6f 75  er words, if you
7410: 20 72 65 66 65 72 65 6e 63 65 20 74 68 65 20 73   reference the s
7420: 70 65 63 69 61 6c 20 22 6e 65 77 22 0a 20 20 20  pecial "new".   
7430: 20 20 20 20 20 2a 2a 20 74 61 62 6c 65 20 69 6e       ** table in
7440: 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 20   the result set 
7450: 6f 66 20 61 20 73 65 6c 65 63 74 2e 20 20 57 65  of a select.  We
7460: 20 64 6f 20 6e 6f 74 20 68 61 76 65 20 61 20 67   do not have a g
7470: 6f 6f 64 20 77 61 79 0a 20 20 20 20 20 20 20 20  ood way.        
7480: 2a 2a 20 74 6f 20 66 69 6e 64 20 74 68 65 20 61  ** to find the a
7490: 63 74 75 61 6c 20 74 61 62 6c 65 20 74 79 70 65  ctual table type
74a0: 2c 20 73 6f 20 63 61 6c 6c 20 69 74 20 22 54 45  , so call it "TE
74b0: 58 54 22 2e 20 20 54 68 69 73 20 69 73 20 72 65  XT".  This is re
74c0: 61 6c 6c 79 0a 20 20 20 20 20 20 20 20 2a 2a 20  ally.        ** 
74d0: 73 6f 6d 65 74 68 69 6e 67 20 6f 66 20 61 20 62  something of a b
74e0: 75 67 2c 20 62 75 74 20 49 20 64 6f 20 6e 6f 74  ug, but I do not
74f0: 20 6b 6e 6f 77 20 68 6f 77 20 74 6f 20 66 69 78   know how to fix
7500: 20 69 74 2e 0a 20 20 20 20 20 20 20 20 2a 2a 0a   it..        **.
7510: 20 20 20 20 20 20 20 20 2a 2a 20 54 68 69 73 20          ** This 
7520: 63 6f 64 65 20 64 6f 65 73 20 6e 6f 74 20 70 72  code does not pr
7530: 6f 64 75 63 65 20 74 68 65 20 63 6f 72 72 65 63  oduce the correc
7540: 74 20 61 6e 73 77 65 72 20 2d 20 69 74 20 6a 75  t answer - it ju
7550: 73 74 20 70 72 65 76 65 6e 74 73 0a 20 20 20 20  st prevents.    
7560: 20 20 20 20 2a 2a 20 61 20 73 65 67 66 61 75 6c      ** a segfaul
7570: 74 2e 20 20 53 65 65 20 74 69 63 6b 65 74 20 23  t.  See ticket #
7580: 31 32 32 39 2e 0a 20 20 20 20 20 20 20 20 2a 2f  1229..        */
7590: 0a 20 20 20 20 20 20 20 20 7a 54 79 70 65 20 3d  .        zType =
75a0: 20 22 54 45 58 54 22 3b 0a 20 20 20 20 20 20 20   "TEXT";.       
75b0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
75c0: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
75d0: 54 61 62 20 29 3b 0a 20 20 20 20 20 20 69 66 28  Tab );.      if(
75e0: 20 70 53 20 29 7b 0a 20 20 20 20 20 20 20 20 2f   pS ){.        /
75f0: 2a 20 54 68 65 20 22 74 61 62 6c 65 22 20 69 73  * The "table" is
7600: 20 61 63 74 75 61 6c 6c 79 20 61 20 73 75 62 2d   actually a sub-
7610: 73 65 6c 65 63 74 20 6f 72 20 61 20 76 69 65 77  select or a view
7620: 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61   in the FROM cla
7630: 75 73 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f  use.        ** o
7640: 66 20 74 68 65 20 53 45 4c 45 43 54 20 73 74 61  f the SELECT sta
7650: 74 65 6d 65 6e 74 2e 20 52 65 74 75 72 6e 20 74  tement. Return t
7660: 68 65 20 64 65 63 6c 61 72 61 74 69 6f 6e 20 74  he declaration t
7670: 79 70 65 20 61 6e 64 20 6f 72 69 67 69 6e 0a 20  ype and origin. 
7680: 20 20 20 20 20 20 20 2a 2a 20 64 61 74 61 20 66         ** data f
7690: 6f 72 20 74 68 65 20 72 65 73 75 6c 74 2d 73 65  or the result-se
76a0: 74 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 68 65 20  t column of the 
76b0: 73 75 62 2d 73 65 6c 65 63 74 2e 0a 20 20 20 20  sub-select..    
76c0: 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 69      */.        i
76d0: 66 28 20 69 43 6f 6c 3e 3d 30 20 26 26 20 69 43  f( iCol>=0 && iC
76e0: 6f 6c 3c 70 53 2d 3e 70 45 4c 69 73 74 2d 3e 6e  ol<pS->pEList->n
76f0: 45 78 70 72 20 29 7b 0a 20 20 20 20 20 20 20 20  Expr ){.        
7700: 20 20 2f 2a 20 49 66 20 69 43 6f 6c 20 69 73 20    /* If iCol is 
7710: 6c 65 73 73 20 74 68 61 6e 20 7a 65 72 6f 2c 20  less than zero, 
7720: 74 68 65 6e 20 74 68 65 20 65 78 70 72 65 73 73  then the express
7730: 69 6f 6e 20 72 65 71 75 65 73 74 73 20 74 68 65  ion requests the
7740: 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 72 6f  .          ** ro
7750: 77 69 64 20 6f 66 20 74 68 65 20 73 75 62 2d 73  wid of the sub-s
7760: 65 6c 65 63 74 20 6f 72 20 76 69 65 77 2e 20 54  elect or view. T
7770: 68 69 73 20 65 78 70 72 65 73 73 69 6f 6e 20 69  his expression i
7780: 73 20 6c 65 67 61 6c 20 28 73 65 65 20 0a 20 20  s legal (see .  
7790: 20 20 20 20 20 20 20 20 2a 2a 20 74 65 73 74 20          ** test 
77a0: 63 61 73 65 20 6d 69 73 63 32 2e 32 2e 32 29 20  case misc2.2.2) 
77b0: 2d 20 69 74 20 61 6c 77 61 79 73 20 65 76 61 6c  - it always eval
77c0: 75 61 74 65 73 20 74 6f 20 4e 55 4c 4c 2e 0a 20  uates to NULL.. 
77d0: 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20           */.    
77e0: 20 20 20 20 20 20 4e 61 6d 65 43 6f 6e 74 65 78        NameContex
77f0: 74 20 73 4e 43 3b 0a 20 20 20 20 20 20 20 20 20  t sNC;.         
7800: 20 45 78 70 72 20 2a 70 20 3d 20 70 53 2d 3e 70   Expr *p = pS->p
7810: 45 4c 69 73 74 2d 3e 61 5b 69 43 6f 6c 5d 2e 70  EList->a[iCol].p
7820: 45 78 70 72 3b 0a 20 20 20 20 20 20 20 20 20 20  Expr;.          
7830: 73 4e 43 2e 70 53 72 63 4c 69 73 74 20 3d 20 70  sNC.pSrcList = p
7840: 53 2d 3e 70 53 72 63 3b 0a 20 20 20 20 20 20 20  S->pSrc;.       
7850: 20 20 20 73 4e 43 2e 70 4e 65 78 74 20 3d 20 30     sNC.pNext = 0
7860: 3b 0a 20 20 20 20 20 20 20 20 20 20 73 4e 43 2e  ;.          sNC.
7870: 70 50 61 72 73 65 20 3d 20 70 4e 43 2d 3e 70 50  pParse = pNC->pP
7880: 61 72 73 65 3b 0a 20 20 20 20 20 20 20 20 20 20  arse;.          
7890: 7a 54 79 70 65 20 3d 20 63 6f 6c 75 6d 6e 54 79  zType = columnTy
78a0: 70 65 28 26 73 4e 43 2c 20 70 2c 20 26 7a 4f 72  pe(&sNC, p, &zOr
78b0: 69 67 69 6e 44 62 2c 20 26 7a 4f 72 69 67 69 6e  iginDb, &zOrigin
78c0: 54 61 62 2c 20 26 7a 4f 72 69 67 69 6e 43 6f 6c  Tab, &zOriginCol
78d0: 29 3b 20 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ); .        }.  
78e0: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 54      }else if( pT
78f0: 61 62 2d 3e 70 53 63 68 65 6d 61 20 29 7b 0a 20  ab->pSchema ){. 
7900: 20 20 20 20 20 20 20 2f 2a 20 41 20 72 65 61 6c         /* A real
7910: 20 74 61 62 6c 65 20 2a 2f 0a 20 20 20 20 20 20   table */.      
7920: 20 20 61 73 73 65 72 74 28 20 21 70 53 20 29 3b    assert( !pS );
7930: 0a 20 20 20 20 20 20 20 20 69 66 28 20 69 43 6f  .        if( iCo
7940: 6c 3c 30 20 29 20 69 43 6f 6c 20 3d 20 70 54 61  l<0 ) iCol = pTa
7950: 62 2d 3e 69 50 4b 65 79 3b 0a 20 20 20 20 20 20  b->iPKey;.      
7960: 20 20 61 73 73 65 72 74 28 20 69 43 6f 6c 3d 3d    assert( iCol==
7970: 2d 31 20 7c 7c 20 28 69 43 6f 6c 3e 3d 30 20 26  -1 || (iCol>=0 &
7980: 26 20 69 43 6f 6c 3c 70 54 61 62 2d 3e 6e 43 6f  & iCol<pTab->nCo
7990: 6c 29 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66  l) );.        if
79a0: 28 20 69 43 6f 6c 3c 30 20 29 7b 0a 20 20 20 20  ( iCol<0 ){.    
79b0: 20 20 20 20 20 20 7a 54 79 70 65 20 3d 20 22 49        zType = "I
79c0: 4e 54 45 47 45 52 22 3b 0a 20 20 20 20 20 20 20  NTEGER";.       
79d0: 20 20 20 7a 4f 72 69 67 69 6e 43 6f 6c 20 3d 20     zOriginCol = 
79e0: 22 72 6f 77 69 64 22 3b 0a 20 20 20 20 20 20 20  "rowid";.       
79f0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
7a00: 20 20 7a 54 79 70 65 20 3d 20 70 54 61 62 2d 3e    zType = pTab->
7a10: 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 7a 54 79 70 65  aCol[iCol].zType
7a20: 3b 0a 20 20 20 20 20 20 20 20 20 20 7a 4f 72 69  ;.          zOri
7a30: 67 69 6e 43 6f 6c 20 3d 20 70 54 61 62 2d 3e 61  ginCol = pTab->a
7a40: 43 6f 6c 5b 69 43 6f 6c 5d 2e 7a 4e 61 6d 65 3b  Col[iCol].zName;
7a50: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
7a60: 20 20 20 7a 4f 72 69 67 69 6e 54 61 62 20 3d 20     zOriginTab = 
7a70: 70 54 61 62 2d 3e 7a 4e 61 6d 65 3b 0a 20 20 20  pTab->zName;.   
7a80: 20 20 20 20 20 69 66 28 20 70 4e 43 2d 3e 70 50       if( pNC->pP
7a90: 61 72 73 65 20 29 7b 0a 20 20 20 20 20 20 20 20  arse ){.        
7aa0: 20 20 69 6e 74 20 69 44 62 20 3d 20 73 71 6c 69    int iDb = sqli
7ab0: 74 65 33 53 63 68 65 6d 61 54 6f 49 6e 64 65 78  te3SchemaToIndex
7ac0: 28 70 4e 43 2d 3e 70 50 61 72 73 65 2d 3e 64 62  (pNC->pParse->db
7ad0: 2c 20 70 54 61 62 2d 3e 70 53 63 68 65 6d 61 29  , pTab->pSchema)
7ae0: 3b 0a 20 20 20 20 20 20 20 20 20 20 7a 4f 72 69  ;.          zOri
7af0: 67 69 6e 44 62 20 3d 20 70 4e 43 2d 3e 70 50 61  ginDb = pNC->pPa
7b00: 72 73 65 2d 3e 64 62 2d 3e 61 44 62 5b 69 44 62  rse->db->aDb[iDb
7b10: 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20 20  ].zName;.       
7b20: 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20   }.      }.     
7b30: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 69   break;.    }.#i
7b40: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
7b50: 54 5f 53 55 42 51 55 45 52 59 0a 20 20 20 20 63  T_SUBQUERY.    c
7b60: 61 73 65 20 54 4b 5f 53 45 4c 45 43 54 3a 20 7b  ase TK_SELECT: {
7b70: 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20 65 78  .      /* The ex
7b80: 70 72 65 73 73 69 6f 6e 20 69 73 20 61 20 73 75  pression is a su
7b90: 62 2d 73 65 6c 65 63 74 2e 20 52 65 74 75 72 6e  b-select. Return
7ba0: 20 74 68 65 20 64 65 63 6c 61 72 61 74 69 6f 6e   the declaration
7bb0: 20 74 79 70 65 20 61 6e 64 0a 20 20 20 20 20 20   type and.      
7bc0: 2a 2a 20 6f 72 69 67 69 6e 20 69 6e 66 6f 20 66  ** origin info f
7bd0: 6f 72 20 74 68 65 20 73 69 6e 67 6c 65 20 63 6f  or the single co
7be0: 6c 75 6d 6e 20 69 6e 20 74 68 65 20 72 65 73 75  lumn in the resu
7bf0: 6c 74 20 73 65 74 20 6f 66 20 74 68 65 20 53 45  lt set of the SE
7c00: 4c 45 43 54 0a 20 20 20 20 20 20 2a 2a 20 73 74  LECT.      ** st
7c10: 61 74 65 6d 65 6e 74 2e 0a 20 20 20 20 20 20 2a  atement..      *
7c20: 2f 0a 20 20 20 20 20 20 4e 61 6d 65 43 6f 6e 74  /.      NameCont
7c30: 65 78 74 20 73 4e 43 3b 0a 20 20 20 20 20 20 53  ext sNC;.      S
7c40: 65 6c 65 63 74 20 2a 70 53 20 3d 20 70 45 78 70  elect *pS = pExp
7c50: 72 2d 3e 70 53 65 6c 65 63 74 3b 0a 20 20 20 20  r->pSelect;.    
7c60: 20 20 45 78 70 72 20 2a 70 20 3d 20 70 53 2d 3e    Expr *p = pS->
7c70: 70 45 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78  pEList->a[0].pEx
7c80: 70 72 3b 0a 20 20 20 20 20 20 73 4e 43 2e 70 53  pr;.      sNC.pS
7c90: 72 63 4c 69 73 74 20 3d 20 70 53 2d 3e 70 53 72  rcList = pS->pSr
7ca0: 63 3b 0a 20 20 20 20 20 20 73 4e 43 2e 70 4e 65  c;.      sNC.pNe
7cb0: 78 74 20 3d 20 70 4e 43 3b 0a 20 20 20 20 20 20  xt = pNC;.      
7cc0: 73 4e 43 2e 70 50 61 72 73 65 20 3d 20 70 4e 43  sNC.pParse = pNC
7cd0: 2d 3e 70 50 61 72 73 65 3b 0a 20 20 20 20 20 20  ->pParse;.      
7ce0: 7a 54 79 70 65 20 3d 20 63 6f 6c 75 6d 6e 54 79  zType = columnTy
7cf0: 70 65 28 26 73 4e 43 2c 20 70 2c 20 26 7a 4f 72  pe(&sNC, p, &zOr
7d00: 69 67 69 6e 44 62 2c 20 26 7a 4f 72 69 67 69 6e  iginDb, &zOrigin
7d10: 54 61 62 2c 20 26 7a 4f 72 69 67 69 6e 43 6f 6c  Tab, &zOriginCol
7d20: 29 3b 20 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  ); .      break;
7d30: 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  .    }.#endif.  
7d40: 7d 0a 20 20 0a 20 20 69 66 28 20 70 7a 4f 72 69  }.  .  if( pzOri
7d50: 67 69 6e 44 62 20 29 7b 0a 20 20 20 20 61 73 73  ginDb ){.    ass
7d60: 65 72 74 28 20 70 7a 4f 72 69 67 69 6e 54 61 62  ert( pzOriginTab
7d70: 20 26 26 20 70 7a 4f 72 69 67 69 6e 43 6f 6c 20   && pzOriginCol 
7d80: 29 3b 0a 20 20 20 20 2a 70 7a 4f 72 69 67 69 6e  );.    *pzOrigin
7d90: 44 62 20 3d 20 7a 4f 72 69 67 69 6e 44 62 3b 0a  Db = zOriginDb;.
7da0: 20 20 20 20 2a 70 7a 4f 72 69 67 69 6e 54 61 62      *pzOriginTab
7db0: 20 3d 20 7a 4f 72 69 67 69 6e 54 61 62 3b 0a 20   = zOriginTab;. 
7dc0: 20 20 20 2a 70 7a 4f 72 69 67 69 6e 43 6f 6c 20     *pzOriginCol 
7dd0: 3d 20 7a 4f 72 69 67 69 6e 43 6f 6c 3b 0a 20 20  = zOriginCol;.  
7de0: 7d 0a 20 20 72 65 74 75 72 6e 20 7a 54 79 70 65  }.  return zType
7df0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72  ;.}../*.** Gener
7e00: 61 74 65 20 63 6f 64 65 20 74 68 61 74 20 77 69  ate code that wi
7e10: 6c 6c 20 74 65 6c 6c 20 74 68 65 20 56 44 42 45  ll tell the VDBE
7e20: 20 74 68 65 20 64 65 63 6c 61 72 61 74 69 6f 6e   the declaration
7e30: 20 74 79 70 65 73 20 6f 66 20 63 6f 6c 75 6d 6e   types of column
7e40: 73 0a 2a 2a 20 69 6e 20 74 68 65 20 72 65 73 75  s.** in the resu
7e50: 6c 74 20 73 65 74 2e 0a 2a 2f 0a 73 74 61 74 69  lt set..*/.stati
7e60: 63 20 76 6f 69 64 20 67 65 6e 65 72 61 74 65 43  c void generateC
7e70: 6f 6c 75 6d 6e 54 79 70 65 73 28 0a 20 20 50 61  olumnTypes(.  Pa
7e80: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20  rse *pParse,    
7e90: 20 20 2f 2a 20 50 61 72 73 65 72 20 63 6f 6e 74    /* Parser cont
7ea0: 65 78 74 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74  ext */.  SrcList
7eb0: 20 2a 70 54 61 62 4c 69 73 74 2c 20 20 2f 2a 20   *pTabList,  /* 
7ec0: 4c 69 73 74 20 6f 66 20 74 61 62 6c 65 73 20 2a  List of tables *
7ed0: 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45  /.  ExprList *pE
7ee0: 4c 69 73 74 20 20 20 20 2f 2a 20 45 78 70 72 65  List    /* Expre
7ef0: 73 73 69 6f 6e 73 20 64 65 66 69 6e 69 6e 67 20  ssions defining 
7f00: 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 20 2a  the result set *
7f10: 2f 0a 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d  /.){.  Vdbe *v =
7f20: 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a   pParse->pVdbe;.
7f30: 20 20 69 6e 74 20 69 3b 0a 20 20 4e 61 6d 65 43    int i;.  NameC
7f40: 6f 6e 74 65 78 74 20 73 4e 43 3b 0a 20 20 73 4e  ontext sNC;.  sN
7f50: 43 2e 70 53 72 63 4c 69 73 74 20 3d 20 70 54 61  C.pSrcList = pTa
7f60: 62 4c 69 73 74 3b 0a 20 20 73 4e 43 2e 70 50 61  bList;.  sNC.pPa
7f70: 72 73 65 20 3d 20 70 50 61 72 73 65 3b 0a 20 20  rse = pParse;.  
7f80: 66 6f 72 28 69 3d 30 3b 20 69 3c 70 45 4c 69 73  for(i=0; i<pELis
7f90: 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a  t->nExpr; i++){.
7fa0: 20 20 20 20 45 78 70 72 20 2a 70 20 3d 20 70 45      Expr *p = pE
7fb0: 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72  List->a[i].pExpr
7fc0: 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72  ;.    const char
7fd0: 20 2a 7a 4f 72 69 67 44 62 20 3d 20 30 3b 0a 20   *zOrigDb = 0;. 
7fe0: 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
7ff0: 4f 72 69 67 54 61 62 20 3d 20 30 3b 0a 20 20 20  OrigTab = 0;.   
8000: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4f 72   const char *zOr
8010: 69 67 43 6f 6c 20 3d 20 30 3b 0a 20 20 20 20 63  igCol = 0;.    c
8020: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 79 70 65  onst char *zType
8030: 20 3d 20 63 6f 6c 75 6d 6e 54 79 70 65 28 26 73   = columnType(&s
8040: 4e 43 2c 20 70 2c 20 26 7a 4f 72 69 67 44 62 2c  NC, p, &zOrigDb,
8050: 20 26 7a 4f 72 69 67 54 61 62 2c 20 26 7a 4f 72   &zOrigTab, &zOr
8060: 69 67 43 6f 6c 29 3b 0a 0a 20 20 20 20 2f 2a 20  igCol);..    /* 
8070: 54 68 65 20 76 64 62 65 20 6d 75 73 74 20 6d 61  The vdbe must ma
8080: 6b 65 20 69 74 73 20 6f 77 6e 20 63 6f 70 79 20  ke its own copy 
8090: 6f 66 20 74 68 65 20 63 6f 6c 75 6d 6e 2d 74 79  of the column-ty
80a0: 70 65 20 61 6e 64 20 6f 74 68 65 72 20 0a 20 20  pe and other .  
80b0: 20 20 2a 2a 20 63 6f 6c 75 6d 6e 20 73 70 65 63    ** column spec
80c0: 69 66 69 63 20 73 74 72 69 6e 67 73 2c 20 69 6e  ific strings, in
80d0: 20 63 61 73 65 20 74 68 65 20 73 63 68 65 6d 61   case the schema
80e0: 20 69 73 20 72 65 73 65 74 20 62 65 66 6f 72 65   is reset before
80f0: 20 74 68 69 73 0a 20 20 20 20 2a 2a 20 76 69 72   this.    ** vir
8100: 74 75 61 6c 20 6d 61 63 68 69 6e 65 20 69 73 20  tual machine is 
8110: 64 65 6c 65 74 65 64 2e 0a 20 20 20 20 2a 2f 0a  deleted..    */.
8120: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 53      sqlite3VdbeS
8130: 65 74 43 6f 6c 4e 61 6d 65 28 76 2c 20 69 2c 20  etColName(v, i, 
8140: 43 4f 4c 4e 41 4d 45 5f 44 45 43 4c 54 59 50 45  COLNAME_DECLTYPE
8150: 2c 20 7a 54 79 70 65 2c 20 50 34 5f 54 52 41 4e  , zType, P4_TRAN
8160: 53 49 45 4e 54 29 3b 0a 20 20 20 20 73 71 6c 69  SIENT);.    sqli
8170: 74 65 33 56 64 62 65 53 65 74 43 6f 6c 4e 61 6d  te3VdbeSetColNam
8180: 65 28 76 2c 20 69 2c 20 43 4f 4c 4e 41 4d 45 5f  e(v, i, COLNAME_
8190: 44 41 54 41 42 41 53 45 2c 20 7a 4f 72 69 67 44  DATABASE, zOrigD
81a0: 62 2c 20 50 34 5f 54 52 41 4e 53 49 45 4e 54 29  b, P4_TRANSIENT)
81b0: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
81c0: 65 53 65 74 43 6f 6c 4e 61 6d 65 28 76 2c 20 69  eSetColName(v, i
81d0: 2c 20 43 4f 4c 4e 41 4d 45 5f 54 41 42 4c 45 2c  , COLNAME_TABLE,
81e0: 20 7a 4f 72 69 67 54 61 62 2c 20 50 34 5f 54 52   zOrigTab, P4_TR
81f0: 41 4e 53 49 45 4e 54 29 3b 0a 20 20 20 20 73 71  ANSIENT);.    sq
8200: 6c 69 74 65 33 56 64 62 65 53 65 74 43 6f 6c 4e  lite3VdbeSetColN
8210: 61 6d 65 28 76 2c 20 69 2c 20 43 4f 4c 4e 41 4d  ame(v, i, COLNAM
8220: 45 5f 43 4f 4c 55 4d 4e 2c 20 7a 4f 72 69 67 43  E_COLUMN, zOrigC
8230: 6f 6c 2c 20 50 34 5f 54 52 41 4e 53 49 45 4e 54  ol, P4_TRANSIENT
8240: 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  );.  }.}../*.** 
8250: 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 68  Generate code th
8260: 61 74 20 77 69 6c 6c 20 74 65 6c 6c 20 74 68 65  at will tell the
8270: 20 56 44 42 45 20 74 68 65 20 6e 61 6d 65 73 20   VDBE the names 
8280: 6f 66 20 63 6f 6c 75 6d 6e 73 0a 2a 2a 20 69 6e  of columns.** in
8290: 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 2e   the result set.
82a0: 20 20 54 68 69 73 20 69 6e 66 6f 72 6d 61 74 69    This informati
82b0: 6f 6e 20 69 73 20 75 73 65 64 20 74 6f 20 70 72  on is used to pr
82c0: 6f 76 69 64 65 20 74 68 65 0a 2a 2a 20 61 7a 43  ovide the.** azC
82d0: 6f 6c 5b 5d 20 76 61 6c 75 65 73 20 69 6e 20 74  ol[] values in t
82e0: 68 65 20 63 61 6c 6c 62 61 63 6b 2e 0a 2a 2f 0a  he callback..*/.
82f0: 73 74 61 74 69 63 20 76 6f 69 64 20 67 65 6e 65  static void gene
8300: 72 61 74 65 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28  rateColumnNames(
8310: 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
8320: 2c 20 20 20 20 20 20 2f 2a 20 50 61 72 73 65 72  ,      /* Parser
8330: 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53 72   context */.  Sr
8340: 63 4c 69 73 74 20 2a 70 54 61 62 4c 69 73 74 2c  cList *pTabList,
8350: 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 74 61 62    /* List of tab
8360: 6c 65 73 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73  les */.  ExprLis
8370: 74 20 2a 70 45 4c 69 73 74 20 20 20 20 2f 2a 20  t *pEList    /* 
8380: 45 78 70 72 65 73 73 69 6f 6e 73 20 64 65 66 69  Expressions defi
8390: 6e 69 6e 67 20 74 68 65 20 72 65 73 75 6c 74 20  ning the result 
83a0: 73 65 74 20 2a 2f 0a 29 7b 0a 20 20 56 64 62 65  set */.){.  Vdbe
83b0: 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56   *v = pParse->pV
83c0: 64 62 65 3b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b  dbe;.  int i, j;
83d0: 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d  .  sqlite3 *db =
83e0: 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 69   pParse->db;.  i
83f0: 6e 74 20 66 75 6c 6c 4e 61 6d 65 73 2c 20 73 68  nt fullNames, sh
8400: 6f 72 74 4e 61 6d 65 73 3b 0a 0a 23 69 66 6e 64  ortNames;..#ifnd
8410: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 45  ef SQLITE_OMIT_E
8420: 58 50 4c 41 49 4e 0a 20 20 2f 2a 20 49 66 20 74  XPLAIN.  /* If t
8430: 68 69 73 20 69 73 20 61 6e 20 45 58 50 4c 41 49  his is an EXPLAI
8440: 4e 2c 20 73 6b 69 70 20 74 68 69 73 20 73 74 65  N, skip this ste
8450: 70 20 2a 2f 0a 20 20 69 66 28 20 70 50 61 72 73  p */.  if( pPars
8460: 65 2d 3e 65 78 70 6c 61 69 6e 20 29 7b 0a 20 20  e->explain ){.  
8470: 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 23 65    return;.  }.#e
8480: 6e 64 69 66 0a 0a 20 20 61 73 73 65 72 74 28 20  ndif..  assert( 
8490: 76 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 50  v!=0 );.  if( pP
84a0: 61 72 73 65 2d 3e 63 6f 6c 4e 61 6d 65 73 53 65  arse->colNamesSe
84b0: 74 20 7c 7c 20 76 3d 3d 30 20 7c 7c 20 64 62 2d  t || v==0 || db-
84c0: 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20  >mallocFailed ) 
84d0: 72 65 74 75 72 6e 3b 0a 20 20 70 50 61 72 73 65  return;.  pParse
84e0: 2d 3e 63 6f 6c 4e 61 6d 65 73 53 65 74 20 3d 20  ->colNamesSet = 
84f0: 31 3b 0a 20 20 66 75 6c 6c 4e 61 6d 65 73 20 3d  1;.  fullNames =
8500: 20 28 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51   (db->flags & SQ
8510: 4c 49 54 45 5f 46 75 6c 6c 43 6f 6c 4e 61 6d 65  LITE_FullColName
8520: 73 29 21 3d 30 3b 0a 20 20 73 68 6f 72 74 4e 61  s)!=0;.  shortNa
8530: 6d 65 73 20 3d 20 28 64 62 2d 3e 66 6c 61 67 73  mes = (db->flags
8540: 20 26 20 53 51 4c 49 54 45 5f 53 68 6f 72 74 43   & SQLITE_ShortC
8550: 6f 6c 4e 61 6d 65 73 29 21 3d 30 3b 0a 20 20 73  olNames)!=0;.  s
8560: 71 6c 69 74 65 33 56 64 62 65 53 65 74 4e 75 6d  qlite3VdbeSetNum
8570: 43 6f 6c 73 28 76 2c 20 70 45 4c 69 73 74 2d 3e  Cols(v, pEList->
8580: 6e 45 78 70 72 29 3b 0a 20 20 66 6f 72 28 69 3d  nExpr);.  for(i=
8590: 30 3b 20 69 3c 70 45 4c 69 73 74 2d 3e 6e 45 78  0; i<pEList->nEx
85a0: 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 45 78  pr; i++){.    Ex
85b0: 70 72 20 2a 70 3b 0a 20 20 20 20 70 20 3d 20 70  pr *p;.    p = p
85c0: 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70  EList->a[i].pExp
85d0: 72 3b 0a 20 20 20 20 69 66 28 20 70 3d 3d 30 20  r;.    if( p==0 
85e0: 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
85f0: 69 66 28 20 70 45 4c 69 73 74 2d 3e 61 5b 69 5d  if( pEList->a[i]
8600: 2e 7a 4e 61 6d 65 20 29 7b 0a 20 20 20 20 20 20  .zName ){.      
8610: 63 68 61 72 20 2a 7a 4e 61 6d 65 20 3d 20 70 45  char *zName = pE
8620: 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65  List->a[i].zName
8630: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
8640: 64 62 65 53 65 74 43 6f 6c 4e 61 6d 65 28 76 2c  dbeSetColName(v,
8650: 20 69 2c 20 43 4f 4c 4e 41 4d 45 5f 4e 41 4d 45   i, COLNAME_NAME
8660: 2c 20 7a 4e 61 6d 65 2c 20 73 74 72 6c 65 6e 28  , zName, strlen(
8670: 7a 4e 61 6d 65 29 29 3b 0a 20 20 20 20 20 20 63  zName));.      c
8680: 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 7d 0a 20  ontinue;.    }. 
8690: 20 20 20 69 66 28 20 70 2d 3e 6f 70 3d 3d 54 4b     if( p->op==TK
86a0: 5f 43 4f 4c 55 4d 4e 20 26 26 20 70 54 61 62 4c  _COLUMN && pTabL
86b0: 69 73 74 20 29 7b 0a 20 20 20 20 20 20 54 61 62  ist ){.      Tab
86c0: 6c 65 20 2a 70 54 61 62 3b 0a 20 20 20 20 20 20  le *pTab;.      
86d0: 63 68 61 72 20 2a 7a 43 6f 6c 3b 0a 20 20 20 20  char *zCol;.    
86e0: 20 20 69 6e 74 20 69 43 6f 6c 20 3d 20 70 2d 3e    int iCol = p->
86f0: 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20 20 66  iColumn;.      f
8700: 6f 72 28 6a 3d 30 3b 20 6a 3c 70 54 61 62 4c 69  or(j=0; j<pTabLi
8710: 73 74 2d 3e 6e 53 72 63 20 26 26 20 70 54 61 62  st->nSrc && pTab
8720: 4c 69 73 74 2d 3e 61 5b 6a 5d 2e 69 43 75 72 73  List->a[j].iCurs
8730: 6f 72 21 3d 70 2d 3e 69 54 61 62 6c 65 3b 20 6a  or!=p->iTable; j
8740: 2b 2b 29 7b 7d 0a 20 20 20 20 20 20 61 73 73 65  ++){}.      asse
8750: 72 74 28 20 6a 3c 70 54 61 62 4c 69 73 74 2d 3e  rt( j<pTabList->
8760: 6e 53 72 63 20 29 3b 0a 20 20 20 20 20 20 70 54  nSrc );.      pT
8770: 61 62 20 3d 20 70 54 61 62 4c 69 73 74 2d 3e 61  ab = pTabList->a
8780: 5b 6a 5d 2e 70 54 61 62 3b 0a 20 20 20 20 20 20  [j].pTab;.      
8790: 69 66 28 20 69 43 6f 6c 3c 30 20 29 20 69 43 6f  if( iCol<0 ) iCo
87a0: 6c 20 3d 20 70 54 61 62 2d 3e 69 50 4b 65 79 3b  l = pTab->iPKey;
87b0: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 69  .      assert( i
87c0: 43 6f 6c 3d 3d 2d 31 20 7c 7c 20 28 69 43 6f 6c  Col==-1 || (iCol
87d0: 3e 3d 30 20 26 26 20 69 43 6f 6c 3c 70 54 61 62  >=0 && iCol<pTab
87e0: 2d 3e 6e 43 6f 6c 29 20 29 3b 0a 20 20 20 20 20  ->nCol) );.     
87f0: 20 69 66 28 20 69 43 6f 6c 3c 30 20 29 7b 0a 20   if( iCol<0 ){. 
8800: 20 20 20 20 20 20 20 7a 43 6f 6c 20 3d 20 22 72         zCol = "r
8810: 6f 77 69 64 22 3b 0a 20 20 20 20 20 20 7d 65 6c  owid";.      }el
8820: 73 65 7b 0a 20 20 20 20 20 20 20 20 7a 43 6f 6c  se{.        zCol
8830: 20 3d 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 43   = pTab->aCol[iC
8840: 6f 6c 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20  ol].zName;.     
8850: 20 7d 0a 20 20 20 20 20 20 69 66 28 20 21 73 68   }.      if( !sh
8860: 6f 72 74 4e 61 6d 65 73 20 26 26 20 21 66 75 6c  ortNames && !ful
8870: 6c 4e 61 6d 65 73 20 26 26 20 70 2d 3e 73 70 61  lNames && p->spa
8880: 6e 2e 7a 20 26 26 20 70 2d 3e 73 70 61 6e 2e 7a  n.z && p->span.z
8890: 5b 30 5d 20 29 7b 0a 20 20 20 20 20 20 20 20 73  [0] ){.        s
88a0: 71 6c 69 74 65 33 56 64 62 65 53 65 74 43 6f 6c  qlite3VdbeSetCol
88b0: 4e 61 6d 65 28 76 2c 20 69 2c 20 43 4f 4c 4e 41  Name(v, i, COLNA
88c0: 4d 45 5f 4e 41 4d 45 2c 20 28 63 68 61 72 2a 29  ME_NAME, (char*)
88d0: 70 2d 3e 73 70 61 6e 2e 7a 2c 20 70 2d 3e 73 70  p->span.z, p->sp
88e0: 61 6e 2e 6e 29 3b 0a 20 20 20 20 20 20 7d 65 6c  an.n);.      }el
88f0: 73 65 20 69 66 28 20 66 75 6c 6c 4e 61 6d 65 73  se if( fullNames
8900: 20 7c 7c 20 28 21 73 68 6f 72 74 4e 61 6d 65 73   || (!shortNames
8910: 20 26 26 20 70 54 61 62 4c 69 73 74 2d 3e 6e 53   && pTabList->nS
8920: 72 63 3e 31 29 20 29 7b 0a 20 20 20 20 20 20 20  rc>1) ){.       
8930: 20 63 68 61 72 20 2a 7a 4e 61 6d 65 20 3d 20 30   char *zName = 0
8940: 3b 0a 20 20 20 20 20 20 20 20 63 68 61 72 20 2a  ;.        char *
8950: 7a 54 61 62 3b 0a 20 0a 20 20 20 20 20 20 20 20  zTab;. .        
8960: 7a 54 61 62 20 3d 20 70 54 61 62 4c 69 73 74 2d  zTab = pTabList-
8970: 3e 61 5b 6a 5d 2e 7a 41 6c 69 61 73 3b 0a 20 20  >a[j].zAlias;.  
8980: 20 20 20 20 20 20 69 66 28 20 66 75 6c 6c 4e 61        if( fullNa
8990: 6d 65 73 20 7c 7c 20 7a 54 61 62 3d 3d 30 20 29  mes || zTab==0 )
89a0: 20 7a 54 61 62 20 3d 20 70 54 61 62 2d 3e 7a 4e   zTab = pTab->zN
89b0: 61 6d 65 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  ame;.        sql
89c0: 69 74 65 33 53 65 74 53 74 72 69 6e 67 28 26 7a  ite3SetString(&z
89d0: 4e 61 6d 65 2c 20 7a 54 61 62 2c 20 22 2e 22 2c  Name, zTab, ".",
89e0: 20 7a 43 6f 6c 2c 20 28 63 68 61 72 2a 29 30 29   zCol, (char*)0)
89f0: 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
8a00: 33 56 64 62 65 53 65 74 43 6f 6c 4e 61 6d 65 28  3VdbeSetColName(
8a10: 76 2c 20 69 2c 20 43 4f 4c 4e 41 4d 45 5f 4e 41  v, i, COLNAME_NA
8a20: 4d 45 2c 20 7a 4e 61 6d 65 2c 20 50 34 5f 44 59  ME, zName, P4_DY
8a30: 4e 41 4d 49 43 29 3b 0a 20 20 20 20 20 20 7d 65  NAMIC);.      }e
8a40: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  lse{.        sql
8a50: 69 74 65 33 56 64 62 65 53 65 74 43 6f 6c 4e 61  ite3VdbeSetColNa
8a60: 6d 65 28 76 2c 20 69 2c 20 43 4f 4c 4e 41 4d 45  me(v, i, COLNAME
8a70: 5f 4e 41 4d 45 2c 20 7a 43 6f 6c 2c 20 73 74 72  _NAME, zCol, str
8a80: 6c 65 6e 28 7a 43 6f 6c 29 29 3b 0a 20 20 20 20  len(zCol));.    
8a90: 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 20 69 66    }.    }else if
8aa0: 28 20 70 2d 3e 73 70 61 6e 2e 7a 20 26 26 20 70  ( p->span.z && p
8ab0: 2d 3e 73 70 61 6e 2e 7a 5b 30 5d 20 29 7b 0a 20  ->span.z[0] ){. 
8ac0: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
8ad0: 53 65 74 43 6f 6c 4e 61 6d 65 28 76 2c 20 69 2c  SetColName(v, i,
8ae0: 20 43 4f 4c 4e 41 4d 45 5f 4e 41 4d 45 2c 20 28   COLNAME_NAME, (
8af0: 63 68 61 72 2a 29 70 2d 3e 73 70 61 6e 2e 7a 2c  char*)p->span.z,
8b00: 20 70 2d 3e 73 70 61 6e 2e 6e 29 3b 0a 20 20 20   p->span.n);.   
8b10: 20 20 20 2f 2a 20 73 71 6c 69 74 65 33 56 64 62     /* sqlite3Vdb
8b20: 65 43 6f 6d 70 72 65 73 73 53 70 61 63 65 28 76  eCompressSpace(v
8b30: 2c 20 61 64 64 72 29 3b 20 2a 2f 0a 20 20 20 20  , addr); */.    
8b40: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 63 68 61  }else{.      cha
8b50: 72 20 7a 4e 61 6d 65 5b 33 30 5d 3b 0a 20 20 20  r zName[30];.   
8b60: 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6f 70     assert( p->op
8b70: 21 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 7c 7c 20 70  !=TK_COLUMN || p
8b80: 54 61 62 4c 69 73 74 3d 3d 30 20 29 3b 0a 20 20  TabList==0 );.  
8b90: 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72      sqlite3_snpr
8ba0: 69 6e 74 66 28 73 69 7a 65 6f 66 28 7a 4e 61 6d  intf(sizeof(zNam
8bb0: 65 29 2c 20 7a 4e 61 6d 65 2c 20 22 63 6f 6c 75  e), zName, "colu
8bc0: 6d 6e 25 64 22 2c 20 69 2b 31 29 3b 0a 20 20 20  mn%d", i+1);.   
8bd0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 53 65     sqlite3VdbeSe
8be0: 74 43 6f 6c 4e 61 6d 65 28 76 2c 20 69 2c 20 43  tColName(v, i, C
8bf0: 4f 4c 4e 41 4d 45 5f 4e 41 4d 45 2c 20 7a 4e 61  OLNAME_NAME, zNa
8c00: 6d 65 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20  me, 0);.    }.  
8c10: 7d 0a 20 20 67 65 6e 65 72 61 74 65 43 6f 6c 75  }.  generateColu
8c20: 6d 6e 54 79 70 65 73 28 70 50 61 72 73 65 2c 20  mnTypes(pParse, 
8c30: 70 54 61 62 4c 69 73 74 2c 20 70 45 4c 69 73 74  pTabList, pEList
8c40: 29 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51  );.}..#ifndef SQ
8c50: 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f 4d 50 4f 55  LITE_OMIT_COMPOU
8c60: 4e 44 5f 53 45 4c 45 43 54 0a 2f 2a 0a 2a 2a 20  ND_SELECT./*.** 
8c70: 4e 61 6d 65 20 6f 66 20 74 68 65 20 63 6f 6e 6e  Name of the conn
8c80: 65 63 74 69 6f 6e 20 6f 70 65 72 61 74 6f 72 2c  ection operator,
8c90: 20 75 73 65 64 20 66 6f 72 20 65 72 72 6f 72 20   used for error 
8ca0: 6d 65 73 73 61 67 65 73 2e 0a 2a 2f 0a 73 74 61  messages..*/.sta
8cb0: 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  tic const char *
8cc0: 73 65 6c 65 63 74 4f 70 4e 61 6d 65 28 69 6e 74  selectOpName(int
8cd0: 20 69 64 29 7b 0a 20 20 63 68 61 72 20 2a 7a 3b   id){.  char *z;
8ce0: 0a 20 20 73 77 69 74 63 68 28 20 69 64 20 29 7b  .  switch( id ){
8cf0: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 41 4c 4c  .    case TK_ALL
8d00: 3a 20 20 20 20 20 20 20 7a 20 3d 20 22 55 4e 49  :       z = "UNI
8d10: 4f 4e 20 41 4c 4c 22 3b 20 20 20 62 72 65 61 6b  ON ALL";   break
8d20: 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49 4e  ;.    case TK_IN
8d30: 54 45 52 53 45 43 54 3a 20 7a 20 3d 20 22 49 4e  TERSECT: z = "IN
8d40: 54 45 52 53 45 43 54 22 3b 20 20 20 62 72 65 61  TERSECT";   brea
8d50: 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 45  k;.    case TK_E
8d60: 58 43 45 50 54 3a 20 20 20 20 7a 20 3d 20 22 45  XCEPT:    z = "E
8d70: 58 43 45 50 54 22 3b 20 20 20 20 20 20 62 72 65  XCEPT";      bre
8d80: 61 6b 3b 0a 20 20 20 20 64 65 66 61 75 6c 74 3a  ak;.    default:
8d90: 20 20 20 20 20 20 20 20 20 20 20 7a 20 3d 20 22             z = "
8da0: 55 4e 49 4f 4e 22 3b 20 20 20 20 20 20 20 62 72  UNION";       br
8db0: 65 61 6b 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  eak;.  }.  retur
8dc0: 6e 20 7a 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a  n z;.}.#endif /*
8dd0: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f 4d   SQLITE_OMIT_COM
8de0: 50 4f 55 4e 44 5f 53 45 4c 45 43 54 20 2a 2f 0a  POUND_SELECT */.
8df0: 0a 2f 2a 0a 2a 2a 20 46 6f 72 77 61 72 64 20 64  ./*.** Forward d
8e00: 65 63 6c 61 72 61 74 69 6f 6e 0a 2a 2f 0a 73 74  eclaration.*/.st
8e10: 61 74 69 63 20 69 6e 74 20 70 72 65 70 53 65 6c  atic int prepSel
8e20: 65 63 74 53 74 6d 74 28 50 61 72 73 65 2a 2c 20  ectStmt(Parse*, 
8e30: 53 65 6c 65 63 74 2a 29 3b 0a 0a 2f 2a 0a 2a 2a  Select*);../*.**
8e40: 20 47 69 76 65 6e 20 61 20 53 45 4c 45 43 54 20   Given a SELECT 
8e50: 73 74 61 74 65 6d 65 6e 74 2c 20 67 65 6e 65 72  statement, gener
8e60: 61 74 65 20 61 20 54 61 62 6c 65 20 73 74 72 75  ate a Table stru
8e70: 63 74 75 72 65 20 74 68 61 74 20 64 65 73 63 72  cture that descr
8e80: 69 62 65 73 0a 2a 2a 20 74 68 65 20 72 65 73 75  ibes.** the resu
8e90: 6c 74 20 73 65 74 20 6f 66 20 74 68 61 74 20 53  lt set of that S
8ea0: 45 4c 45 43 54 2e 0a 2a 2f 0a 54 61 62 6c 65 20  ELECT..*/.Table 
8eb0: 2a 73 71 6c 69 74 65 33 52 65 73 75 6c 74 53 65  *sqlite3ResultSe
8ec0: 74 4f 66 53 65 6c 65 63 74 28 50 61 72 73 65 20  tOfSelect(Parse 
8ed0: 2a 70 50 61 72 73 65 2c 20 63 68 61 72 20 2a 7a  *pParse, char *z
8ee0: 54 61 62 4e 61 6d 65 2c 20 53 65 6c 65 63 74 20  TabName, Select 
8ef0: 2a 70 53 65 6c 65 63 74 29 7b 0a 20 20 54 61 62  *pSelect){.  Tab
8f00: 6c 65 20 2a 70 54 61 62 3b 0a 20 20 69 6e 74 20  le *pTab;.  int 
8f10: 69 2c 20 6a 3b 0a 20 20 45 78 70 72 4c 69 73 74  i, j;.  ExprList
8f20: 20 2a 70 45 4c 69 73 74 3b 0a 20 20 43 6f 6c 75   *pEList;.  Colu
8f30: 6d 6e 20 2a 61 43 6f 6c 2c 20 2a 70 43 6f 6c 3b  mn *aCol, *pCol;
8f40: 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d  .  sqlite3 *db =
8f50: 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 0a 20 20   pParse->db;..  
8f60: 77 68 69 6c 65 28 20 70 53 65 6c 65 63 74 2d 3e  while( pSelect->
8f70: 70 50 72 69 6f 72 20 29 20 70 53 65 6c 65 63 74  pPrior ) pSelect
8f80: 20 3d 20 70 53 65 6c 65 63 74 2d 3e 70 50 72 69   = pSelect->pPri
8f90: 6f 72 3b 0a 20 20 69 66 28 20 70 72 65 70 53 65  or;.  if( prepSe
8fa0: 6c 65 63 74 53 74 6d 74 28 70 50 61 72 73 65 2c  lectStmt(pParse,
8fb0: 20 70 53 65 6c 65 63 74 29 20 29 7b 0a 20 20 20   pSelect) ){.   
8fc0: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20   return 0;.  }. 
8fd0: 20 69 66 28 20 73 71 6c 69 74 65 33 53 65 6c 65   if( sqlite3Sele
8fe0: 63 74 52 65 73 6f 6c 76 65 28 70 50 61 72 73 65  ctResolve(pParse
8ff0: 2c 20 70 53 65 6c 65 63 74 2c 20 30 29 20 29 7b  , pSelect, 0) ){
9000: 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20  .    return 0;. 
9010: 20 7d 0a 20 20 70 54 61 62 20 3d 20 73 71 6c 69   }.  pTab = sqli
9020: 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28  te3DbMallocZero(
9030: 64 62 2c 20 73 69 7a 65 6f 66 28 54 61 62 6c 65  db, sizeof(Table
9040: 29 20 29 3b 0a 20 20 69 66 28 20 70 54 61 62 3d  ) );.  if( pTab=
9050: 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  =0 ){.    return
9060: 20 30 3b 0a 20 20 7d 0a 20 20 70 54 61 62 2d 3e   0;.  }.  pTab->
9070: 6e 52 65 66 20 3d 20 31 3b 0a 20 20 70 54 61 62  nRef = 1;.  pTab
9080: 2d 3e 7a 4e 61 6d 65 20 3d 20 7a 54 61 62 4e 61  ->zName = zTabNa
9090: 6d 65 20 3f 20 73 71 6c 69 74 65 33 44 62 53 74  me ? sqlite3DbSt
90a0: 72 44 75 70 28 64 62 2c 20 7a 54 61 62 4e 61 6d  rDup(db, zTabNam
90b0: 65 29 20 3a 20 30 3b 0a 20 20 70 45 4c 69 73 74  e) : 0;.  pEList
90c0: 20 3d 20 70 53 65 6c 65 63 74 2d 3e 70 45 4c 69   = pSelect->pELi
90d0: 73 74 3b 0a 20 20 70 54 61 62 2d 3e 6e 43 6f 6c  st;.  pTab->nCol
90e0: 20 3d 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72   = pEList->nExpr
90f0: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 54 61 62  ;.  assert( pTab
9100: 2d 3e 6e 43 6f 6c 3e 30 20 29 3b 0a 20 20 70 54  ->nCol>0 );.  pT
9110: 61 62 2d 3e 61 43 6f 6c 20 3d 20 61 43 6f 6c 20  ab->aCol = aCol 
9120: 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f  = sqlite3DbMallo
9130: 63 5a 65 72 6f 28 64 62 2c 20 73 69 7a 65 6f 66  cZero(db, sizeof
9140: 28 70 54 61 62 2d 3e 61 43 6f 6c 5b 30 5d 29 2a  (pTab->aCol[0])*
9150: 70 54 61 62 2d 3e 6e 43 6f 6c 29 3b 0a 20 20 66  pTab->nCol);.  f
9160: 6f 72 28 69 3d 30 2c 20 70 43 6f 6c 3d 61 43 6f  or(i=0, pCol=aCo
9170: 6c 3b 20 69 3c 70 54 61 62 2d 3e 6e 43 6f 6c 3b  l; i<pTab->nCol;
9180: 20 69 2b 2b 2c 20 70 43 6f 6c 2b 2b 29 7b 0a 20   i++, pCol++){. 
9190: 20 20 20 45 78 70 72 20 2a 70 2c 20 2a 70 52 3b     Expr *p, *pR;
91a0: 0a 20 20 20 20 63 68 61 72 20 2a 7a 54 79 70 65  .    char *zType
91b0: 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a 4e 61 6d  ;.    char *zNam
91c0: 65 3b 0a 20 20 20 20 69 6e 74 20 6e 4e 61 6d 65  e;.    int nName
91d0: 3b 0a 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a 70  ;.    CollSeq *p
91e0: 43 6f 6c 6c 3b 0a 20 20 20 20 69 6e 74 20 63 6e  Coll;.    int cn
91f0: 74 3b 0a 20 20 20 20 4e 61 6d 65 43 6f 6e 74 65  t;.    NameConte
9200: 78 74 20 73 4e 43 3b 0a 20 20 20 20 0a 20 20 20  xt sNC;.    .   
9210: 20 2f 2a 20 47 65 74 20 61 6e 20 61 70 70 72 6f   /* Get an appro
9220: 70 72 69 61 74 65 20 6e 61 6d 65 20 66 6f 72 20  priate name for 
9230: 74 68 65 20 63 6f 6c 75 6d 6e 0a 20 20 20 20 2a  the column.    *
9240: 2f 0a 20 20 20 20 70 20 3d 20 70 45 4c 69 73 74  /.    p = pEList
9250: 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20  ->a[i].pExpr;.  
9260: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 52 69    assert( p->pRi
9270: 67 68 74 3d 3d 30 20 7c 7c 20 70 2d 3e 70 52 69  ght==0 || p->pRi
9280: 67 68 74 2d 3e 74 6f 6b 65 6e 2e 7a 3d 3d 30 20  ght->token.z==0 
9290: 7c 7c 20 70 2d 3e 70 52 69 67 68 74 2d 3e 74 6f  || p->pRight->to
92a0: 6b 65 6e 2e 7a 5b 30 5d 21 3d 30 20 29 3b 0a 20  ken.z[0]!=0 );. 
92b0: 20 20 20 69 66 28 20 28 7a 4e 61 6d 65 20 3d 20     if( (zName = 
92c0: 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61  pEList->a[i].zNa
92d0: 6d 65 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  me)!=0 ){.      
92e0: 2f 2a 20 49 66 20 74 68 65 20 63 6f 6c 75 6d 6e  /* If the column
92f0: 20 63 6f 6e 74 61 69 6e 73 20 61 6e 20 22 41 53   contains an "AS
9300: 20 3c 6e 61 6d 65 3e 22 20 70 68 72 61 73 65 2c   <name>" phrase,
9310: 20 75 73 65 20 3c 6e 61 6d 65 3e 20 61 73 20 74   use <name> as t
9320: 68 65 20 6e 61 6d 65 20 2a 2f 0a 20 20 20 20 20  he name */.     
9330: 20 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33   zName = sqlite3
9340: 44 62 53 74 72 44 75 70 28 64 62 2c 20 7a 4e 61  DbStrDup(db, zNa
9350: 6d 65 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69  me);.    }else i
9360: 66 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 44 4f 54  f( p->op==TK_DOT
9370: 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20   .              
9380: 26 26 20 28 70 52 3d 70 2d 3e 70 52 69 67 68 74  && (pR=p->pRight
9390: 29 21 3d 30 20 26 26 20 70 52 2d 3e 74 6f 6b 65  )!=0 && pR->toke
93a0: 6e 2e 7a 20 26 26 20 70 52 2d 3e 74 6f 6b 65 6e  n.z && pR->token
93b0: 2e 7a 5b 30 5d 20 29 7b 0a 20 20 20 20 20 20 2f  .z[0] ){.      /
93c0: 2a 20 46 6f 72 20 63 6f 6c 75 6d 6e 73 20 6f 66  * For columns of
93d0: 20 74 68 65 20 66 72 6f 6d 20 41 2e 42 20 75 73   the from A.B us
93e0: 65 20 42 20 61 73 20 74 68 65 20 6e 61 6d 65 20  e B as the name 
93f0: 2a 2f 0a 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d  */.      zName =
9400: 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28   sqlite3MPrintf(
9410: 64 62 2c 20 22 25 54 22 2c 20 26 70 52 2d 3e 74  db, "%T", &pR->t
9420: 6f 6b 65 6e 29 3b 0a 20 20 20 20 7d 65 6c 73 65  oken);.    }else
9430: 20 69 66 28 20 70 2d 3e 73 70 61 6e 2e 7a 20 26   if( p->span.z &
9440: 26 20 70 2d 3e 73 70 61 6e 2e 7a 5b 30 5d 20 29  & p->span.z[0] )
9450: 7b 0a 20 20 20 20 20 20 2f 2a 20 55 73 65 20 74  {.      /* Use t
9460: 68 65 20 6f 72 69 67 69 6e 61 6c 20 74 65 78 74  he original text
9470: 20 6f 66 20 74 68 65 20 63 6f 6c 75 6d 6e 20 65   of the column e
9480: 78 70 72 65 73 73 69 6f 6e 20 61 73 20 69 74 73  xpression as its
9490: 20 6e 61 6d 65 20 2a 2f 0a 20 20 20 20 20 20 7a   name */.      z
94a0: 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 4d 50  Name = sqlite3MP
94b0: 72 69 6e 74 66 28 64 62 2c 20 22 25 54 22 2c 20  rintf(db, "%T", 
94c0: 26 70 2d 3e 73 70 61 6e 29 3b 0a 20 20 20 20 7d  &p->span);.    }
94d0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20 49  else{.      /* I
94e0: 66 20 61 6c 6c 20 65 6c 73 65 20 66 61 69 6c 73  f all else fails
94f0: 2c 20 6d 61 6b 65 20 75 70 20 61 20 6e 61 6d 65  , make up a name
9500: 20 2a 2f 0a 20 20 20 20 20 20 7a 4e 61 6d 65 20   */.      zName 
9510: 3d 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66  = sqlite3MPrintf
9520: 28 64 62 2c 20 22 63 6f 6c 75 6d 6e 25 64 22 2c  (db, "column%d",
9530: 20 69 2b 31 29 3b 0a 20 20 20 20 7d 0a 20 20 20   i+1);.    }.   
9540: 20 69 66 28 20 21 7a 4e 61 6d 65 20 7c 7c 20 64   if( !zName || d
9550: 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
9560: 29 7b 0a 20 20 20 20 20 20 64 62 2d 3e 6d 61 6c  ){.      db->mal
9570: 6c 6f 63 46 61 69 6c 65 64 20 3d 20 31 3b 0a 20  locFailed = 1;. 
9580: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65       sqlite3_fre
9590: 65 28 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20  e(zName);.      
95a0: 73 71 6c 69 74 65 33 44 65 6c 65 74 65 54 61 62  sqlite3DeleteTab
95b0: 6c 65 28 70 54 61 62 29 3b 0a 20 20 20 20 20 20  le(pTab);.      
95c0: 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a  return 0;.    }.
95d0: 20 20 20 20 73 71 6c 69 74 65 33 44 65 71 75 6f      sqlite3Dequo
95e0: 74 65 28 7a 4e 61 6d 65 29 3b 0a 0a 20 20 20 20  te(zName);..    
95f0: 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65  /* Make sure the
9600: 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 20 69 73 20   column name is 
9610: 75 6e 69 71 75 65 2e 20 20 49 66 20 74 68 65 20  unique.  If the 
9620: 6e 61 6d 65 20 69 73 20 6e 6f 74 20 75 6e 69 71  name is not uniq
9630: 75 65 2c 0a 20 20 20 20 2a 2a 20 61 70 70 65 6e  ue,.    ** appen
9640: 64 20 61 20 69 6e 74 65 67 65 72 20 74 6f 20 74  d a integer to t
9650: 68 65 20 6e 61 6d 65 20 73 6f 20 74 68 61 74 20  he name so that 
9660: 69 74 20 62 65 63 6f 6d 65 73 20 75 6e 69 71 75  it becomes uniqu
9670: 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 6e 4e  e..    */.    nN
9680: 61 6d 65 20 3d 20 73 74 72 6c 65 6e 28 7a 4e 61  ame = strlen(zNa
9690: 6d 65 29 3b 0a 20 20 20 20 66 6f 72 28 6a 3d 63  me);.    for(j=c
96a0: 6e 74 3d 30 3b 20 6a 3c 69 3b 20 6a 2b 2b 29 7b  nt=0; j<i; j++){
96b0: 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74  .      if( sqlit
96c0: 65 33 53 74 72 49 43 6d 70 28 61 43 6f 6c 5b 6a  e3StrICmp(aCol[j
96d0: 5d 2e 7a 4e 61 6d 65 2c 20 7a 4e 61 6d 65 29 3d  ].zName, zName)=
96e0: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 7a 4e  =0 ){.        zN
96f0: 61 6d 65 5b 6e 4e 61 6d 65 5d 20 3d 20 30 3b 0a  ame[nName] = 0;.
9700: 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20          zName = 
9710: 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 64  sqlite3MPrintf(d
9720: 62 2c 20 22 25 7a 3a 25 64 22 2c 20 7a 4e 61 6d  b, "%z:%d", zNam
9730: 65 2c 20 2b 2b 63 6e 74 29 3b 0a 20 20 20 20 20  e, ++cnt);.     
9740: 20 20 20 6a 20 3d 20 2d 31 3b 0a 20 20 20 20 20     j = -1;.     
9750: 20 20 20 69 66 28 20 7a 4e 61 6d 65 3d 3d 30 20     if( zName==0 
9760: 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d  ) break;.      }
9770: 0a 20 20 20 20 7d 0a 20 20 20 20 70 43 6f 6c 2d  .    }.    pCol-
9780: 3e 7a 4e 61 6d 65 20 3d 20 7a 4e 61 6d 65 3b 0a  >zName = zName;.
9790: 0a 20 20 20 20 2f 2a 20 47 65 74 20 74 68 65 20  .    /* Get the 
97a0: 74 79 70 65 6e 61 6d 65 2c 20 74 79 70 65 20 61  typename, type a
97b0: 66 66 69 6e 69 74 79 2c 20 61 6e 64 20 63 6f 6c  ffinity, and col
97c0: 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65 20  lating sequence 
97d0: 66 6f 72 20 74 68 65 0a 20 20 20 20 2a 2a 20 63  for the.    ** c
97e0: 6f 6c 75 6d 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20  olumn..    */.  
97f0: 20 20 6d 65 6d 73 65 74 28 26 73 4e 43 2c 20 30    memset(&sNC, 0
9800: 2c 20 73 69 7a 65 6f 66 28 73 4e 43 29 29 3b 0a  , sizeof(sNC));.
9810: 20 20 20 20 73 4e 43 2e 70 53 72 63 4c 69 73 74      sNC.pSrcList
9820: 20 3d 20 70 53 65 6c 65 63 74 2d 3e 70 53 72 63   = pSelect->pSrc
9830: 3b 0a 20 20 20 20 7a 54 79 70 65 20 3d 20 73 71  ;.    zType = sq
9840: 6c 69 74 65 33 44 62 53 74 72 44 75 70 28 64 62  lite3DbStrDup(db
9850: 2c 20 63 6f 6c 75 6d 6e 54 79 70 65 28 26 73 4e  , columnType(&sN
9860: 43 2c 20 70 2c 20 30 2c 20 30 2c 20 30 29 29 3b  C, p, 0, 0, 0));
9870: 0a 20 20 20 20 70 43 6f 6c 2d 3e 7a 54 79 70 65  .    pCol->zType
9880: 20 3d 20 7a 54 79 70 65 3b 0a 20 20 20 20 70 43   = zType;.    pC
9890: 6f 6c 2d 3e 61 66 66 69 6e 69 74 79 20 3d 20 73  ol->affinity = s
98a0: 71 6c 69 74 65 33 45 78 70 72 41 66 66 69 6e 69  qlite3ExprAffini
98b0: 74 79 28 70 29 3b 0a 20 20 20 20 70 43 6f 6c 6c  ty(p);.    pColl
98c0: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f   = sqlite3ExprCo
98d0: 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70 29  llSeq(pParse, p)
98e0: 3b 0a 20 20 20 20 69 66 28 20 70 43 6f 6c 6c 20  ;.    if( pColl 
98f0: 29 7b 0a 20 20 20 20 20 20 70 43 6f 6c 2d 3e 7a  ){.      pCol->z
9900: 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 44 62  Coll = sqlite3Db
9910: 53 74 72 44 75 70 28 64 62 2c 20 70 43 6f 6c 6c  StrDup(db, pColl
9920: 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 7d 0a  ->zName);.    }.
9930: 20 20 7d 0a 20 20 70 54 61 62 2d 3e 69 50 4b 65    }.  pTab->iPKe
9940: 79 20 3d 20 2d 31 3b 0a 20 20 72 65 74 75 72 6e  y = -1;.  return
9950: 20 70 54 61 62 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   pTab;.}../*.** 
9960: 50 72 65 70 61 72 65 20 61 20 53 45 4c 45 43 54  Prepare a SELECT
9970: 20 73 74 61 74 65 6d 65 6e 74 20 66 6f 72 20 70   statement for p
9980: 72 6f 63 65 73 73 69 6e 67 20 62 79 20 64 6f 69  rocessing by doi
9990: 6e 67 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  ng the following
99a0: 0a 2a 2a 20 74 68 69 6e 67 73 3a 0a 2a 2a 0a 2a  .** things:.**.*
99b0: 2a 20 20 20 20 28 31 29 20 20 4d 61 6b 65 20 73  *    (1)  Make s
99c0: 75 72 65 20 56 44 42 45 20 63 75 72 73 6f 72 20  ure VDBE cursor 
99d0: 6e 75 6d 62 65 72 73 20 68 61 76 65 20 62 65 65  numbers have bee
99e0: 6e 20 61 73 73 69 67 6e 65 64 20 74 6f 20 65 76  n assigned to ev
99f0: 65 72 79 0a 2a 2a 20 20 20 20 20 20 20 20 20 65  ery.**         e
9a00: 6c 65 6d 65 6e 74 20 6f 66 20 74 68 65 20 46 52  lement of the FR
9a10: 4f 4d 20 63 6c 61 75 73 65 2e 0a 2a 2a 0a 2a 2a  OM clause..**.**
9a20: 20 20 20 20 28 32 29 20 20 46 69 6c 6c 20 69 6e      (2)  Fill in
9a30: 20 74 68 65 20 70 54 61 62 4c 69 73 74 2d 3e 61   the pTabList->a
9a40: 5b 5d 2e 70 54 61 62 20 66 69 65 6c 64 73 20 69  [].pTab fields i
9a50: 6e 20 74 68 65 20 53 72 63 4c 69 73 74 20 74 68  n the SrcList th
9a60: 61 74 20 0a 2a 2a 20 20 20 20 20 20 20 20 20 64  at .**         d
9a70: 65 66 69 6e 65 73 20 46 52 4f 4d 20 63 6c 61 75  efines FROM clau
9a80: 73 65 2e 20 20 57 68 65 6e 20 76 69 65 77 73 20  se.  When views 
9a90: 61 70 70 65 61 72 20 69 6e 20 74 68 65 20 46 52  appear in the FR
9aa0: 4f 4d 20 63 6c 61 75 73 65 2c 0a 2a 2a 20 20 20  OM clause,.**   
9ab0: 20 20 20 20 20 20 66 69 6c 6c 20 70 54 61 62 4c        fill pTabL
9ac0: 69 73 74 2d 3e 61 5b 5d 2e 70 53 65 6c 65 63 74  ist->a[].pSelect
9ad0: 20 77 69 74 68 20 61 20 63 6f 70 79 20 6f 66 20   with a copy of 
9ae0: 74 68 65 20 53 45 4c 45 43 54 20 73 74 61 74 65  the SELECT state
9af0: 6d 65 6e 74 0a 2a 2a 20 20 20 20 20 20 20 20 20  ment.**         
9b00: 74 68 61 74 20 69 6d 70 6c 65 6d 65 6e 74 73 20  that implements 
9b10: 74 68 65 20 76 69 65 77 2e 20 20 41 20 63 6f 70  the view.  A cop
9b20: 79 20 69 73 20 6d 61 64 65 20 6f 66 20 74 68 65  y is made of the
9b30: 20 76 69 65 77 27 73 20 53 45 4c 45 43 54 0a 2a   view's SELECT.*
9b40: 2a 20 20 20 20 20 20 20 20 20 73 74 61 74 65 6d  *         statem
9b50: 65 6e 74 20 73 6f 20 74 68 61 74 20 77 65 20 63  ent so that we c
9b60: 61 6e 20 66 72 65 65 6c 79 20 6d 6f 64 69 66 79  an freely modify
9b70: 20 6f 72 20 64 65 6c 65 74 65 20 74 68 61 74 20   or delete that 
9b80: 73 74 61 74 65 6d 65 6e 74 0a 2a 2a 20 20 20 20  statement.**    
9b90: 20 20 20 20 20 77 69 74 68 6f 75 74 20 77 6f 72       without wor
9ba0: 72 79 69 6e 67 20 61 62 6f 75 74 20 6d 65 73 73  rying about mess
9bb0: 69 6e 67 20 75 70 20 74 68 65 20 70 72 65 73 69  ing up the presi
9bc0: 73 74 65 6e 74 20 72 65 70 72 65 73 65 6e 74 61  stent representa
9bd0: 74 69 6f 6e 0a 2a 2a 20 20 20 20 20 20 20 20 20  tion.**         
9be0: 6f 66 20 74 68 65 20 76 69 65 77 2e 0a 2a 2a 0a  of the view..**.
9bf0: 2a 2a 20 20 20 20 28 33 29 20 20 41 64 64 20 74  **    (3)  Add t
9c00: 65 72 6d 73 20 74 6f 20 74 68 65 20 57 48 45 52  erms to the WHER
9c10: 45 20 63 6c 61 75 73 65 20 74 6f 20 61 63 63 6f  E clause to acco
9c20: 6d 6f 64 61 74 65 20 74 68 65 20 4e 41 54 55 52  modate the NATUR
9c30: 41 4c 20 6b 65 79 77 6f 72 64 0a 2a 2a 20 20 20  AL keyword.**   
9c40: 20 20 20 20 20 20 6f 6e 20 6a 6f 69 6e 73 20 61        on joins a
9c50: 6e 64 20 74 68 65 20 4f 4e 20 61 6e 64 20 55 53  nd the ON and US
9c60: 49 4e 47 20 63 6c 61 75 73 65 20 6f 66 20 6a 6f  ING clause of jo
9c70: 69 6e 73 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 28 34  ins..**.**    (4
9c80: 29 20 20 53 63 61 6e 20 74 68 65 20 6c 69 73 74  )  Scan the list
9c90: 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74   of columns in t
9ca0: 68 65 20 72 65 73 75 6c 74 20 73 65 74 20 28 70  he result set (p
9cb0: 45 4c 69 73 74 29 20 6c 6f 6f 6b 69 6e 67 0a 2a  EList) looking.*
9cc0: 2a 20 20 20 20 20 20 20 20 20 66 6f 72 20 69 6e  *         for in
9cd0: 73 74 61 6e 63 65 73 20 6f 66 20 74 68 65 20 22  stances of the "
9ce0: 2a 22 20 6f 70 65 72 61 74 6f 72 20 6f 72 20 74  *" operator or t
9cf0: 68 65 20 54 41 42 4c 45 2e 2a 20 6f 70 65 72 61  he TABLE.* opera
9d00: 74 6f 72 2e 0a 2a 2a 20 20 20 20 20 20 20 20 20  tor..**         
9d10: 49 66 20 66 6f 75 6e 64 2c 20 65 78 70 61 6e 64  If found, expand
9d20: 20 65 61 63 68 20 22 2a 22 20 74 6f 20 62 65 20   each "*" to be 
9d30: 65 76 65 72 79 20 63 6f 6c 75 6d 6e 20 69 6e 20  every column in 
9d40: 65 76 65 72 79 20 74 61 62 6c 65 0a 2a 2a 20 20  every table.**  
9d50: 20 20 20 20 20 20 20 61 6e 64 20 54 41 42 4c 45         and TABLE
9d60: 2e 2a 20 74 6f 20 62 65 20 65 76 65 72 79 20 63  .* to be every c
9d70: 6f 6c 75 6d 6e 20 69 6e 20 54 41 42 4c 45 2e 0a  olumn in TABLE..
9d80: 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 30 20 6f  **.** Return 0 o
9d90: 6e 20 73 75 63 63 65 73 73 2e 20 20 49 66 20 74  n success.  If t
9da0: 68 65 72 65 20 61 72 65 20 70 72 6f 62 6c 65 6d  here are problem
9db0: 73 2c 20 6c 65 61 76 65 20 61 6e 20 65 72 72 6f  s, leave an erro
9dc0: 72 20 6d 65 73 73 61 67 65 0a 2a 2a 20 69 6e 20  r message.** in 
9dd0: 70 50 61 72 73 65 20 61 6e 64 20 72 65 74 75 72  pParse and retur
9de0: 6e 20 6e 6f 6e 2d 7a 65 72 6f 2e 0a 2a 2f 0a 73  n non-zero..*/.s
9df0: 74 61 74 69 63 20 69 6e 74 20 70 72 65 70 53 65  tatic int prepSe
9e00: 6c 65 63 74 53 74 6d 74 28 50 61 72 73 65 20 2a  lectStmt(Parse *
9e10: 70 50 61 72 73 65 2c 20 53 65 6c 65 63 74 20 2a  pParse, Select *
9e20: 70 29 7b 0a 20 20 69 6e 74 20 69 2c 20 6a 2c 20  p){.  int i, j, 
9e30: 6b 2c 20 72 63 3b 0a 20 20 53 72 63 4c 69 73 74  k, rc;.  SrcList
9e40: 20 2a 70 54 61 62 4c 69 73 74 3b 0a 20 20 45 78   *pTabList;.  Ex
9e50: 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 3b 0a  prList *pEList;.
9e60: 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74    struct SrcList
9e70: 5f 69 74 65 6d 20 2a 70 46 72 6f 6d 3b 0a 20 20  _item *pFrom;.  
9e80: 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50  sqlite3 *db = pP
9e90: 61 72 73 65 2d 3e 64 62 3b 0a 0a 20 20 69 66 28  arse->db;..  if(
9ea0: 20 70 3d 3d 30 20 7c 7c 20 70 2d 3e 70 53 72 63   p==0 || p->pSrc
9eb0: 3d 3d 30 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f  ==0 || db->mallo
9ec0: 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 72  cFailed ){.    r
9ed0: 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 70  eturn 1;.  }.  p
9ee0: 54 61 62 4c 69 73 74 20 3d 20 70 2d 3e 70 53 72  TabList = p->pSr
9ef0: 63 3b 0a 20 20 70 45 4c 69 73 74 20 3d 20 70 2d  c;.  pEList = p-
9f00: 3e 70 45 4c 69 73 74 3b 0a 0a 20 20 2f 2a 20 4d  >pEList;..  /* M
9f10: 61 6b 65 20 73 75 72 65 20 63 75 72 73 6f 72 20  ake sure cursor 
9f20: 6e 75 6d 62 65 72 73 20 68 61 76 65 20 62 65 65  numbers have bee
9f30: 6e 20 61 73 73 69 67 6e 65 64 20 74 6f 20 61 6c  n assigned to al
9f40: 6c 20 65 6e 74 72 69 65 73 20 69 6e 0a 20 20 2a  l entries in.  *
9f50: 2a 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73  * the FROM claus
9f60: 65 20 6f 66 20 74 68 65 20 53 45 4c 45 43 54 20  e of the SELECT 
9f70: 73 74 61 74 65 6d 65 6e 74 2e 0a 20 20 2a 2f 0a  statement..  */.
9f80: 20 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74    sqlite3SrcList
9f90: 41 73 73 69 67 6e 43 75 72 73 6f 72 73 28 70 50  AssignCursors(pP
9fa0: 61 72 73 65 2c 20 70 2d 3e 70 53 72 63 29 3b 0a  arse, p->pSrc);.
9fb0: 0a 20 20 2f 2a 20 4c 6f 6f 6b 20 75 70 20 65 76  .  /* Look up ev
9fc0: 65 72 79 20 74 61 62 6c 65 20 6e 61 6d 65 64 20  ery table named 
9fd0: 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75  in the FROM clau
9fe0: 73 65 20 6f 66 20 74 68 65 20 73 65 6c 65 63 74  se of the select
9ff0: 2e 20 20 49 66 0a 20 20 2a 2a 20 61 6e 20 65 6e  .  If.  ** an en
a000: 74 72 79 20 6f 66 20 74 68 65 20 46 52 4f 4d 20  try of the FROM 
a010: 63 6c 61 75 73 65 20 69 73 20 61 20 73 75 62 71  clause is a subq
a020: 75 65 72 79 20 69 6e 73 74 65 61 64 20 6f 66 20  uery instead of 
a030: 61 20 74 61 62 6c 65 20 6f 72 20 76 69 65 77 2c  a table or view,
a040: 0a 20 20 2a 2a 20 74 68 65 6e 20 63 72 65 61 74  .  ** then creat
a050: 65 20 61 20 74 72 61 6e 73 69 65 6e 74 20 74 61  e a transient ta
a060: 62 6c 65 20 73 74 72 75 63 74 75 72 65 20 74 6f  ble structure to
a070: 20 64 65 73 63 72 69 62 65 20 74 68 65 20 73 75   describe the su
a080: 62 71 75 65 72 79 2e 0a 20 20 2a 2f 0a 20 20 66  bquery..  */.  f
a090: 6f 72 28 69 3d 30 2c 20 70 46 72 6f 6d 3d 70 54  or(i=0, pFrom=pT
a0a0: 61 62 4c 69 73 74 2d 3e 61 3b 20 69 3c 70 54 61  abList->a; i<pTa
a0b0: 62 4c 69 73 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b  bList->nSrc; i++
a0c0: 2c 20 70 46 72 6f 6d 2b 2b 29 7b 0a 20 20 20 20  , pFrom++){.    
a0d0: 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20 20  Table *pTab;.   
a0e0: 20 69 66 28 20 70 46 72 6f 6d 2d 3e 70 54 61 62   if( pFrom->pTab
a0f0: 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  !=0 ){.      /* 
a100: 54 68 69 73 20 73 74 61 74 65 6d 65 6e 74 20 68  This statement h
a110: 61 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20  as already been 
a120: 70 72 65 70 61 72 65 64 2e 20 20 54 68 65 72 65  prepared.  There
a130: 20 69 73 20 6e 6f 20 6e 65 65 64 0a 20 20 20 20   is no need.    
a140: 20 20 2a 2a 20 74 6f 20 67 6f 20 66 75 72 74 68    ** to go furth
a150: 65 72 2e 20 2a 2f 0a 20 20 20 20 20 20 61 73 73  er. */.      ass
a160: 65 72 74 28 20 69 3d 3d 30 20 29 3b 0a 20 20 20  ert( i==0 );.   
a170: 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20     return 0;.   
a180: 20 7d 0a 20 20 20 20 69 66 28 20 70 46 72 6f 6d   }.    if( pFrom
a190: 2d 3e 7a 4e 61 6d 65 3d 3d 30 20 29 7b 0a 23 69  ->zName==0 ){.#i
a1a0: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
a1b0: 54 5f 53 55 42 51 55 45 52 59 0a 20 20 20 20 20  T_SUBQUERY.     
a1c0: 20 2f 2a 20 41 20 73 75 62 2d 71 75 65 72 79 20   /* A sub-query 
a1d0: 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75  in the FROM clau
a1e0: 73 65 20 6f 66 20 61 20 53 45 4c 45 43 54 20 2a  se of a SELECT *
a1f0: 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  /.      assert( 
a200: 70 46 72 6f 6d 2d 3e 70 53 65 6c 65 63 74 21 3d  pFrom->pSelect!=
a210: 30 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70  0 );.      if( p
a220: 46 72 6f 6d 2d 3e 7a 41 6c 69 61 73 3d 3d 30 20  From->zAlias==0 
a230: 29 7b 0a 20 20 20 20 20 20 20 20 70 46 72 6f 6d  ){.        pFrom
a240: 2d 3e 7a 41 6c 69 61 73 20 3d 0a 20 20 20 20 20  ->zAlias =.     
a250: 20 20 20 20 20 73 71 6c 69 74 65 33 4d 50 72 69       sqlite3MPri
a260: 6e 74 66 28 64 62 2c 20 22 73 71 6c 69 74 65 5f  ntf(db, "sqlite_
a270: 73 75 62 71 75 65 72 79 5f 25 70 5f 22 2c 20 28  subquery_%p_", (
a280: 76 6f 69 64 2a 29 70 46 72 6f 6d 2d 3e 70 53 65  void*)pFrom->pSe
a290: 6c 65 63 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20  lect);.      }. 
a2a0: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 46 72       assert( pFr
a2b0: 6f 6d 2d 3e 70 54 61 62 3d 3d 30 20 29 3b 0a 20  om->pTab==0 );. 
a2c0: 20 20 20 20 20 70 46 72 6f 6d 2d 3e 70 54 61 62       pFrom->pTab
a2d0: 20 3d 20 70 54 61 62 20 3d 20 0a 20 20 20 20 20   = pTab = .     
a2e0: 20 20 20 73 71 6c 69 74 65 33 52 65 73 75 6c 74     sqlite3Result
a2f0: 53 65 74 4f 66 53 65 6c 65 63 74 28 70 50 61 72  SetOfSelect(pPar
a300: 73 65 2c 20 70 46 72 6f 6d 2d 3e 7a 41 6c 69 61  se, pFrom->zAlia
a310: 73 2c 20 70 46 72 6f 6d 2d 3e 70 53 65 6c 65 63  s, pFrom->pSelec
a320: 74 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 54  t);.      if( pT
a330: 61 62 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  ab==0 ){.       
a340: 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 20   return 1;.     
a350: 20 7d 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20   }.      /* The 
a360: 69 73 45 70 68 65 6d 20 66 6c 61 67 20 69 6e 64  isEphem flag ind
a370: 69 63 61 74 65 73 20 74 68 61 74 20 74 68 65 20  icates that the 
a380: 54 61 62 6c 65 20 73 74 72 75 63 74 75 72 65 20  Table structure 
a390: 68 61 73 20 62 65 65 6e 0a 20 20 20 20 20 20 2a  has been.      *
a3a0: 2a 20 64 79 6e 61 6d 69 63 61 6c 6c 79 20 61 6c  * dynamically al
a3b0: 6c 6f 63 61 74 65 64 20 61 6e 64 20 6d 61 79 20  located and may 
a3c0: 62 65 20 66 72 65 65 64 20 61 74 20 61 6e 79 20  be freed at any 
a3d0: 74 69 6d 65 2e 20 20 49 6e 20 6f 74 68 65 72 20  time.  In other 
a3e0: 77 6f 72 64 73 2c 0a 20 20 20 20 20 20 2a 2a 20  words,.      ** 
a3f0: 70 54 61 62 20 69 73 20 6e 6f 74 20 70 6f 69 6e  pTab is not poin
a400: 74 69 6e 67 20 74 6f 20 61 20 70 65 72 73 69 73  ting to a persis
a410: 74 65 6e 74 20 74 61 62 6c 65 20 73 74 72 75 63  tent table struc
a420: 74 75 72 65 20 74 68 61 74 20 64 65 66 69 6e 65  ture that define
a430: 73 0a 20 20 20 20 20 20 2a 2a 20 70 61 72 74 20  s.      ** part 
a440: 6f 66 20 74 68 65 20 73 63 68 65 6d 61 2e 20 2a  of the schema. *
a450: 2f 0a 20 20 20 20 20 20 70 54 61 62 2d 3e 69 73  /.      pTab->is
a460: 45 70 68 65 6d 20 3d 20 31 3b 0a 23 65 6e 64 69  Ephem = 1;.#endi
a470: 66 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  f.    }else{.   
a480: 20 20 20 2f 2a 20 41 6e 20 6f 72 64 69 6e 61 72     /* An ordinar
a490: 79 20 74 61 62 6c 65 20 6f 72 20 76 69 65 77 20  y table or view 
a4a0: 6e 61 6d 65 20 69 6e 20 74 68 65 20 46 52 4f 4d  name in the FROM
a4b0: 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 20 20 20   clause */.     
a4c0: 20 61 73 73 65 72 74 28 20 70 46 72 6f 6d 2d 3e   assert( pFrom->
a4d0: 70 54 61 62 3d 3d 30 20 29 3b 0a 20 20 20 20 20  pTab==0 );.     
a4e0: 20 70 46 72 6f 6d 2d 3e 70 54 61 62 20 3d 20 70   pFrom->pTab = p
a4f0: 54 61 62 20 3d 20 0a 20 20 20 20 20 20 20 20 73  Tab = .        s
a500: 71 6c 69 74 65 33 4c 6f 63 61 74 65 54 61 62 6c  qlite3LocateTabl
a510: 65 28 70 50 61 72 73 65 2c 70 46 72 6f 6d 2d 3e  e(pParse,pFrom->
a520: 7a 4e 61 6d 65 2c 70 46 72 6f 6d 2d 3e 7a 44 61  zName,pFrom->zDa
a530: 74 61 62 61 73 65 29 3b 0a 20 20 20 20 20 20 69  tabase);.      i
a540: 66 28 20 70 54 61 62 3d 3d 30 20 29 7b 0a 20 20  f( pTab==0 ){.  
a550: 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a        return 1;.
a560: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 54        }.      pT
a570: 61 62 2d 3e 6e 52 65 66 2b 2b 3b 0a 23 69 66 20  ab->nRef++;.#if 
a580: 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
a590: 4f 4d 49 54 5f 56 49 45 57 29 20 7c 7c 20 21 64  OMIT_VIEW) || !d
a5a0: 65 66 69 6e 65 64 20 28 53 51 4c 49 54 45 5f 4f  efined (SQLITE_O
a5b0: 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45  MIT_VIRTUALTABLE
a5c0: 29 0a 20 20 20 20 20 20 69 66 28 20 70 54 61 62  ).      if( pTab
a5d0: 2d 3e 70 53 65 6c 65 63 74 20 7c 7c 20 49 73 56  ->pSelect || IsV
a5e0: 69 72 74 75 61 6c 28 70 54 61 62 29 20 29 7b 0a  irtual(pTab) ){.
a5f0: 20 20 20 20 20 20 20 20 2f 2a 20 57 65 20 72 65          /* We re
a600: 61 63 68 20 68 65 72 65 20 69 66 20 74 68 65 20  ach here if the 
a610: 6e 61 6d 65 64 20 74 61 62 6c 65 20 69 73 20 61  named table is a
a620: 20 72 65 61 6c 6c 79 20 61 20 76 69 65 77 20 2a   really a view *
a630: 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20 73 71  /.        if( sq
a640: 6c 69 74 65 33 56 69 65 77 47 65 74 43 6f 6c 75  lite3ViewGetColu
a650: 6d 6e 4e 61 6d 65 73 28 70 50 61 72 73 65 2c 20  mnNames(pParse, 
a660: 70 54 61 62 29 20 29 7b 0a 20 20 20 20 20 20 20  pTab) ){.       
a670: 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20     return 1;.   
a680: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 2f       }.        /
a690: 2a 20 49 66 20 70 46 72 6f 6d 2d 3e 70 53 65 6c  * If pFrom->pSel
a6a0: 65 63 74 21 3d 30 20 69 74 20 6d 65 61 6e 73 20  ect!=0 it means 
a6b0: 77 65 20 61 72 65 20 64 65 61 6c 69 6e 67 20 77  we are dealing w
a6c0: 69 74 68 20 61 0a 20 20 20 20 20 20 20 20 2a 2a  ith a.        **
a6d0: 20 76 69 65 77 20 77 69 74 68 69 6e 20 61 20 76   view within a v
a6e0: 69 65 77 2e 20 20 54 68 65 20 53 45 4c 45 43 54  iew.  The SELECT
a6f0: 20 73 74 72 75 63 74 75 72 65 20 68 61 73 20 61   structure has a
a700: 6c 72 65 61 64 79 20 62 65 65 6e 0a 20 20 20 20  lready been.    
a710: 20 20 20 20 2a 2a 20 63 6f 70 69 65 64 20 62 79      ** copied by
a720: 20 74 68 65 20 6f 75 74 65 72 20 76 69 65 77 20   the outer view 
a730: 73 6f 20 77 65 20 63 61 6e 20 73 6b 69 70 20 74  so we can skip t
a740: 68 65 20 63 6f 70 79 20 73 74 65 70 20 68 65 72  he copy step her
a750: 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 69 6e 20  e.        ** in 
a760: 74 68 65 20 69 6e 6e 65 72 20 76 69 65 77 2e 0a  the inner view..
a770: 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
a780: 20 20 20 69 66 28 20 70 46 72 6f 6d 2d 3e 70 53     if( pFrom->pS
a790: 65 6c 65 63 74 3d 3d 30 20 29 7b 0a 20 20 20 20  elect==0 ){.    
a7a0: 20 20 20 20 20 20 70 46 72 6f 6d 2d 3e 70 53 65        pFrom->pSe
a7b0: 6c 65 63 74 20 3d 20 73 71 6c 69 74 65 33 53 65  lect = sqlite3Se
a7c0: 6c 65 63 74 44 75 70 28 64 62 2c 20 70 54 61 62  lectDup(db, pTab
a7d0: 2d 3e 70 53 65 6c 65 63 74 29 3b 0a 20 20 20 20  ->pSelect);.    
a7e0: 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 23 65      }.      }.#e
a7f0: 6e 64 69 66 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  ndif.    }.  }..
a800: 20 20 2f 2a 20 50 72 6f 63 65 73 73 20 4e 41 54    /* Process NAT
a810: 55 52 41 4c 20 6b 65 79 77 6f 72 64 73 2c 20 61  URAL keywords, a
a820: 6e 64 20 4f 4e 20 61 6e 64 20 55 53 49 4e 47 20  nd ON and USING 
a830: 63 6c 61 75 73 65 73 20 6f 66 20 6a 6f 69 6e 73  clauses of joins
a840: 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 73 71 6c  ..  */.  if( sql
a850: 69 74 65 50 72 6f 63 65 73 73 4a 6f 69 6e 28 70  iteProcessJoin(p
a860: 50 61 72 73 65 2c 20 70 29 20 29 20 72 65 74 75  Parse, p) ) retu
a870: 72 6e 20 31 3b 0a 0a 20 20 2f 2a 20 46 6f 72 20  rn 1;..  /* For 
a880: 65 76 65 72 79 20 22 2a 22 20 74 68 61 74 20 6f  every "*" that o
a890: 63 63 75 72 73 20 69 6e 20 74 68 65 20 63 6f 6c  ccurs in the col
a8a0: 75 6d 6e 20 6c 69 73 74 2c 20 69 6e 73 65 72 74  umn list, insert
a8b0: 20 74 68 65 20 6e 61 6d 65 73 20 6f 66 0a 20 20   the names of.  
a8c0: 2a 2a 20 61 6c 6c 20 63 6f 6c 75 6d 6e 73 20 69  ** all columns i
a8d0: 6e 20 61 6c 6c 20 74 61 62 6c 65 73 2e 20 20 41  n all tables.  A
a8e0: 6e 64 20 66 6f 72 20 65 76 65 72 79 20 54 41 42  nd for every TAB
a8f0: 4c 45 2e 2a 20 69 6e 73 65 72 74 20 74 68 65 20  LE.* insert the 
a900: 6e 61 6d 65 73 0a 20 20 2a 2a 20 6f 66 20 61 6c  names.  ** of al
a910: 6c 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 54 41 42  l columns in TAB
a920: 4c 45 2e 20 20 54 68 65 20 70 61 72 73 65 72 20  LE.  The parser 
a930: 69 6e 73 65 72 74 65 64 20 61 20 73 70 65 63 69  inserted a speci
a940: 61 6c 20 65 78 70 72 65 73 73 69 6f 6e 0a 20 20  al expression.  
a950: 2a 2a 20 77 69 74 68 20 74 68 65 20 54 4b 5f 41  ** with the TK_A
a960: 4c 4c 20 6f 70 65 72 61 74 6f 72 20 66 6f 72 20  LL operator for 
a970: 65 61 63 68 20 22 2a 22 20 74 68 61 74 20 69 74  each "*" that it
a980: 20 66 6f 75 6e 64 20 69 6e 20 74 68 65 20 63 6f   found in the co
a990: 6c 75 6d 6e 20 6c 69 73 74 2e 0a 20 20 2a 2a 20  lumn list..  ** 
a9a0: 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 6f  The following co
a9b0: 64 65 20 6a 75 73 74 20 68 61 73 20 74 6f 20 6c  de just has to l
a9c0: 6f 63 61 74 65 20 74 68 65 20 54 4b 5f 41 4c 4c  ocate the TK_ALL
a9d0: 20 65 78 70 72 65 73 73 69 6f 6e 73 20 61 6e 64   expressions and
a9e0: 20 65 78 70 61 6e 64 0a 20 20 2a 2a 20 65 61 63   expand.  ** eac
a9f0: 68 20 6f 6e 65 20 74 6f 20 74 68 65 20 6c 69 73  h one to the lis
aa00: 74 20 6f 66 20 61 6c 6c 20 63 6f 6c 75 6d 6e 73  t of all columns
aa10: 20 69 6e 20 61 6c 6c 20 74 61 62 6c 65 73 2e 0a   in all tables..
aa20: 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 66 69    **.  ** The fi
aa30: 72 73 74 20 6c 6f 6f 70 20 6a 75 73 74 20 63 68  rst loop just ch
aa40: 65 63 6b 73 20 74 6f 20 73 65 65 20 69 66 20 74  ecks to see if t
aa50: 68 65 72 65 20 61 72 65 20 61 6e 79 20 22 2a 22  here are any "*"
aa60: 20 6f 70 65 72 61 74 6f 72 73 0a 20 20 2a 2a 20   operators.  ** 
aa70: 74 68 61 74 20 6e 65 65 64 20 65 78 70 61 6e 64  that need expand
aa80: 69 6e 67 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28  ing..  */.  for(
aa90: 6b 3d 30 3b 20 6b 3c 70 45 4c 69 73 74 2d 3e 6e  k=0; k<pEList->n
aaa0: 45 78 70 72 3b 20 6b 2b 2b 29 7b 0a 20 20 20 20  Expr; k++){.    
aab0: 45 78 70 72 20 2a 70 45 20 3d 20 70 45 4c 69 73  Expr *pE = pELis
aac0: 74 2d 3e 61 5b 6b 5d 2e 70 45 78 70 72 3b 0a 20  t->a[k].pExpr;. 
aad0: 20 20 20 69 66 28 20 70 45 2d 3e 6f 70 3d 3d 54     if( pE->op==T
aae0: 4b 5f 41 4c 4c 20 29 20 62 72 65 61 6b 3b 0a 20  K_ALL ) break;. 
aaf0: 20 20 20 69 66 28 20 70 45 2d 3e 6f 70 3d 3d 54     if( pE->op==T
ab00: 4b 5f 44 4f 54 20 26 26 20 70 45 2d 3e 70 52 69  K_DOT && pE->pRi
ab10: 67 68 74 20 26 26 20 70 45 2d 3e 70 52 69 67 68  ght && pE->pRigh
ab20: 74 2d 3e 6f 70 3d 3d 54 4b 5f 41 4c 4c 0a 20 20  t->op==TK_ALL.  
ab30: 20 20 20 20 20 20 20 26 26 20 70 45 2d 3e 70 4c         && pE->pL
ab40: 65 66 74 20 26 26 20 70 45 2d 3e 70 4c 65 66 74  eft && pE->pLeft
ab50: 2d 3e 6f 70 3d 3d 54 4b 5f 49 44 20 29 20 62 72  ->op==TK_ID ) br
ab60: 65 61 6b 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20  eak;.  }.  rc = 
ab70: 30 3b 0a 20 20 69 66 28 20 6b 3c 70 45 4c 69 73  0;.  if( k<pELis
ab80: 74 2d 3e 6e 45 78 70 72 20 29 7b 0a 20 20 20 20  t->nExpr ){.    
ab90: 2f 2a 0a 20 20 20 20 2a 2a 20 49 66 20 77 65 20  /*.    ** If we 
aba0: 67 65 74 20 68 65 72 65 20 69 74 20 6d 65 61 6e  get here it mean
abb0: 73 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74  s the result set
abc0: 20 63 6f 6e 74 61 69 6e 73 20 6f 6e 65 20 6f 72   contains one or
abd0: 20 6d 6f 72 65 20 22 2a 22 0a 20 20 20 20 2a 2a   more "*".    **
abe0: 20 6f 70 65 72 61 74 6f 72 73 20 74 68 61 74 20   operators that 
abf0: 6e 65 65 64 20 74 6f 20 62 65 20 65 78 70 61 6e  need to be expan
ac00: 64 65 64 2e 20 20 4c 6f 6f 70 20 74 68 72 6f 75  ded.  Loop throu
ac10: 67 68 20 65 61 63 68 20 65 78 70 72 65 73 73 69  gh each expressi
ac20: 6f 6e 0a 20 20 20 20 2a 2a 20 69 6e 20 74 68 65  on.    ** in the
ac30: 20 72 65 73 75 6c 74 20 73 65 74 20 61 6e 64 20   result set and 
ac40: 65 78 70 61 6e 64 20 74 68 65 6d 20 6f 6e 65 20  expand them one 
ac50: 62 79 20 6f 6e 65 2e 0a 20 20 20 20 2a 2f 0a 20  by one..    */. 
ac60: 20 20 20 73 74 72 75 63 74 20 45 78 70 72 4c 69     struct ExprLi
ac70: 73 74 5f 69 74 65 6d 20 2a 61 20 3d 20 70 45 4c  st_item *a = pEL
ac80: 69 73 74 2d 3e 61 3b 0a 20 20 20 20 45 78 70 72  ist->a;.    Expr
ac90: 4c 69 73 74 20 2a 70 4e 65 77 20 3d 20 30 3b 0a  List *pNew = 0;.
aca0: 20 20 20 20 69 6e 74 20 66 6c 61 67 73 20 3d 20      int flags = 
acb0: 70 50 61 72 73 65 2d 3e 64 62 2d 3e 66 6c 61 67  pParse->db->flag
acc0: 73 3b 0a 20 20 20 20 69 6e 74 20 6c 6f 6e 67 4e  s;.    int longN
acd0: 61 6d 65 73 20 3d 20 28 66 6c 61 67 73 20 26 20  ames = (flags & 
ace0: 53 51 4c 49 54 45 5f 46 75 6c 6c 43 6f 6c 4e 61  SQLITE_FullColNa
acf0: 6d 65 73 29 21 3d 30 20 26 26 0a 20 20 20 20 20  mes)!=0 &&.     
ad00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ad10: 20 28 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45   (flags & SQLITE
ad20: 5f 53 68 6f 72 74 43 6f 6c 4e 61 6d 65 73 29 3d  _ShortColNames)=
ad30: 3d 30 3b 0a 0a 20 20 20 20 66 6f 72 28 6b 3d 30  =0;..    for(k=0
ad40: 3b 20 6b 3c 70 45 4c 69 73 74 2d 3e 6e 45 78 70  ; k<pEList->nExp
ad50: 72 3b 20 6b 2b 2b 29 7b 0a 20 20 20 20 20 20 45  r; k++){.      E
ad60: 78 70 72 20 2a 70 45 20 3d 20 61 5b 6b 5d 2e 70  xpr *pE = a[k].p
ad70: 45 78 70 72 3b 0a 20 20 20 20 20 20 69 66 28 20  Expr;.      if( 
ad80: 70 45 2d 3e 6f 70 21 3d 54 4b 5f 41 4c 4c 20 26  pE->op!=TK_ALL &
ad90: 26 0a 20 20 20 20 20 20 20 20 20 20 20 28 70 45  &.           (pE
ada0: 2d 3e 6f 70 21 3d 54 4b 5f 44 4f 54 20 7c 7c 20  ->op!=TK_DOT || 
adb0: 70 45 2d 3e 70 52 69 67 68 74 3d 3d 30 20 7c 7c  pE->pRight==0 ||
adc0: 20 70 45 2d 3e 70 52 69 67 68 74 2d 3e 6f 70 21   pE->pRight->op!
add0: 3d 54 4b 5f 41 4c 4c 29 20 29 7b 0a 20 20 20 20  =TK_ALL) ){.    
ade0: 20 20 20 20 2f 2a 20 54 68 69 73 20 70 61 72 74      /* This part
adf0: 69 63 75 6c 61 72 20 65 78 70 72 65 73 73 69 6f  icular expressio
ae00: 6e 20 64 6f 65 73 20 6e 6f 74 20 6e 65 65 64 20  n does not need 
ae10: 74 6f 20 62 65 20 65 78 70 61 6e 64 65 64 2e 0a  to be expanded..
ae20: 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
ae30: 20 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65     pNew = sqlite
ae40: 33 45 78 70 72 4c 69 73 74 41 70 70 65 6e 64 28  3ExprListAppend(
ae50: 70 50 61 72 73 65 2c 20 70 4e 65 77 2c 20 61 5b  pParse, pNew, a[
ae60: 6b 5d 2e 70 45 78 70 72 2c 20 30 29 3b 0a 20 20  k].pExpr, 0);.  
ae70: 20 20 20 20 20 20 69 66 28 20 70 4e 65 77 20 29        if( pNew )
ae80: 7b 0a 20 20 20 20 20 20 20 20 20 20 70 4e 65 77  {.          pNew
ae90: 2d 3e 61 5b 70 4e 65 77 2d 3e 6e 45 78 70 72 2d  ->a[pNew->nExpr-
aea0: 31 5d 2e 7a 4e 61 6d 65 20 3d 20 61 5b 6b 5d 2e  1].zName = a[k].
aeb0: 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20 20 20 7d  zName;.        }
aec0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
aed0: 72 63 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20  rc = 1;.        
aee0: 7d 0a 20 20 20 20 20 20 20 20 61 5b 6b 5d 2e 70  }.        a[k].p
aef0: 45 78 70 72 20 3d 20 30 3b 0a 20 20 20 20 20 20  Expr = 0;.      
af00: 20 20 61 5b 6b 5d 2e 7a 4e 61 6d 65 20 3d 20 30    a[k].zName = 0
af10: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
af20: 20 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20 65         /* This e
af30: 78 70 72 65 73 73 69 6f 6e 20 69 73 20 61 20 22  xpression is a "
af40: 2a 22 20 6f 72 20 61 20 22 54 41 42 4c 45 2e 2a  *" or a "TABLE.*
af50: 22 20 61 6e 64 20 6e 65 65 64 73 20 74 6f 20 62  " and needs to b
af60: 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 65 78 70  e.        ** exp
af70: 61 6e 64 65 64 2e 20 2a 2f 0a 20 20 20 20 20 20  anded. */.      
af80: 20 20 69 6e 74 20 74 61 62 6c 65 53 65 65 6e 20    int tableSeen 
af90: 3d 20 30 3b 20 20 20 20 20 20 2f 2a 20 53 65 74  = 0;      /* Set
afa0: 20 74 6f 20 31 20 77 68 65 6e 20 54 41 42 4c 45   to 1 when TABLE
afb0: 20 6d 61 74 63 68 65 73 20 2a 2f 0a 20 20 20 20   matches */.    
afc0: 20 20 20 20 63 68 61 72 20 2a 7a 54 4e 61 6d 65      char *zTName
afd0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
afe0: 74 65 78 74 20 6f 66 20 6e 61 6d 65 20 6f 66 20  text of name of 
aff0: 54 41 42 4c 45 20 2a 2f 0a 20 20 20 20 20 20 20  TABLE */.       
b000: 20 69 66 28 20 70 45 2d 3e 6f 70 3d 3d 54 4b 5f   if( pE->op==TK_
b010: 44 4f 54 20 26 26 20 70 45 2d 3e 70 4c 65 66 74  DOT && pE->pLeft
b020: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 7a 54   ){.          zT
b030: 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 4e 61  Name = sqlite3Na
b040: 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 64 62 2c 20  meFromToken(db, 
b050: 26 70 45 2d 3e 70 4c 65 66 74 2d 3e 74 6f 6b 65  &pE->pLeft->toke
b060: 6e 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  n);.        }els
b070: 65 7b 0a 20 20 20 20 20 20 20 20 20 20 7a 54 4e  e{.          zTN
b080: 61 6d 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  ame = 0;.       
b090: 20 7d 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69   }.        for(i
b0a0: 3d 30 2c 20 70 46 72 6f 6d 3d 70 54 61 62 4c 69  =0, pFrom=pTabLi
b0b0: 73 74 2d 3e 61 3b 20 69 3c 70 54 61 62 4c 69 73  st->a; i<pTabLis
b0c0: 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b 2c 20 70 46  t->nSrc; i++, pF
b0d0: 72 6f 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  rom++){.        
b0e0: 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20    Table *pTab = 
b0f0: 70 46 72 6f 6d 2d 3e 70 54 61 62 3b 0a 20 20 20  pFrom->pTab;.   
b100: 20 20 20 20 20 20 20 63 68 61 72 20 2a 7a 54 61         char *zTa
b110: 62 4e 61 6d 65 20 3d 20 70 46 72 6f 6d 2d 3e 7a  bName = pFrom->z
b120: 41 6c 69 61 73 3b 0a 20 20 20 20 20 20 20 20 20  Alias;.         
b130: 20 69 66 28 20 7a 54 61 62 4e 61 6d 65 3d 3d 30   if( zTabName==0
b140: 20 7c 7c 20 7a 54 61 62 4e 61 6d 65 5b 30 5d 3d   || zTabName[0]=
b150: 3d 30 20 29 7b 20 0a 20 20 20 20 20 20 20 20 20  =0 ){ .         
b160: 20 20 20 7a 54 61 62 4e 61 6d 65 20 3d 20 70 54     zTabName = pT
b170: 61 62 2d 3e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20  ab->zName;.     
b180: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
b190: 20 69 66 28 20 7a 54 4e 61 6d 65 20 26 26 20 28   if( zTName && (
b1a0: 7a 54 61 62 4e 61 6d 65 3d 3d 30 20 7c 7c 20 7a  zTabName==0 || z
b1b0: 54 61 62 4e 61 6d 65 5b 30 5d 3d 3d 30 20 7c 7c  TabName[0]==0 ||
b1c0: 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20   .              
b1d0: 20 20 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d     sqlite3StrICm
b1e0: 70 28 7a 54 4e 61 6d 65 2c 20 7a 54 61 62 4e 61  p(zTName, zTabNa
b1f0: 6d 65 29 21 3d 30 29 20 29 7b 0a 20 20 20 20 20  me)!=0) ){.     
b200: 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b         continue;
b210: 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
b220: 20 20 20 20 20 20 20 74 61 62 6c 65 53 65 65 6e         tableSeen
b230: 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20   = 1;.          
b240: 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 54 61 62 2d  for(j=0; j<pTab-
b250: 3e 6e 43 6f 6c 3b 20 6a 2b 2b 29 7b 0a 20 20 20  >nCol; j++){.   
b260: 20 20 20 20 20 20 20 20 20 45 78 70 72 20 2a 70           Expr *p
b270: 45 78 70 72 2c 20 2a 70 52 69 67 68 74 3b 0a 20  Expr, *pRight;. 
b280: 20 20 20 20 20 20 20 20 20 20 20 63 68 61 72 20             char 
b290: 2a 7a 4e 61 6d 65 20 3d 20 70 54 61 62 2d 3e 61  *zName = pTab->a
b2a0: 43 6f 6c 5b 6a 5d 2e 7a 4e 61 6d 65 3b 0a 0a 20  Col[j].zName;.. 
b2b0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66             /* If
b2c0: 20 61 20 63 6f 6c 75 6d 6e 20 69 73 20 6d 61 72   a column is mar
b2d0: 6b 65 64 20 61 73 20 27 68 69 64 64 65 6e 27 20  ked as 'hidden' 
b2e0: 28 63 75 72 72 65 6e 74 6c 79 20 6f 6e 6c 79 20  (currently only 
b2f0: 70 6f 73 73 69 62 6c 65 0a 20 20 20 20 20 20 20  possible.       
b300: 20 20 20 20 20 2a 2a 20 66 6f 72 20 76 69 72 74       ** for virt
b310: 75 61 6c 20 74 61 62 6c 65 73 29 2c 20 64 6f 20  ual tables), do 
b320: 6e 6f 74 20 69 6e 63 6c 75 64 65 20 69 74 20 69  not include it i
b330: 6e 20 74 68 65 20 65 78 70 61 6e 64 65 64 0a 20  n the expanded. 
b340: 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 72 65             ** re
b350: 73 75 6c 74 2d 73 65 74 20 6c 69 73 74 2e 0a 20  sult-set list.. 
b360: 20 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20             */.  
b370: 20 20 20 20 20 20 20 20 20 20 69 66 28 20 49 73            if( Is
b380: 48 69 64 64 65 6e 43 6f 6c 75 6d 6e 28 26 70 54  HiddenColumn(&pT
b390: 61 62 2d 3e 61 43 6f 6c 5b 6a 5d 29 20 29 7b 0a  ab->aCol[j]) ){.
b3a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 61 73                as
b3b0: 73 65 72 74 28 49 73 56 69 72 74 75 61 6c 28 70  sert(IsVirtual(p
b3c0: 54 61 62 29 29 3b 0a 20 20 20 20 20 20 20 20 20  Tab));.         
b3d0: 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20       continue;. 
b3e0: 20 20 20 20 20 20 20 20 20 20 20 7d 0a 0a 20 20             }..  
b3f0: 20 20 20 20 20 20 20 20 20 20 69 66 28 20 69 3e            if( i>
b400: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  0 ){.           
b410: 20 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73     struct SrcLis
b420: 74 5f 69 74 65 6d 20 2a 70 4c 65 66 74 20 3d 20  t_item *pLeft = 
b430: 26 70 54 61 62 4c 69 73 74 2d 3e 61 5b 69 2d 31  &pTabList->a[i-1
b440: 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ];.             
b450: 20 69 66 28 20 28 70 4c 65 66 74 5b 31 5d 2e 6a   if( (pLeft[1].j
b460: 6f 69 6e 74 79 70 65 20 26 20 4a 54 5f 4e 41 54  ointype & JT_NAT
b470: 55 52 41 4c 29 21 3d 30 20 26 26 0a 20 20 20 20  URAL)!=0 &&.    
b480: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b490: 20 20 20 20 63 6f 6c 75 6d 6e 49 6e 64 65 78 28      columnIndex(
b4a0: 70 4c 65 66 74 2d 3e 70 54 61 62 2c 20 7a 4e 61  pLeft->pTab, zNa
b4b0: 6d 65 29 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20  me)>=0 ){.      
b4c0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 20            /* In 
b4d0: 61 20 4e 41 54 55 52 41 4c 20 6a 6f 69 6e 2c 20  a NATURAL join, 
b4e0: 6f 6d 69 74 20 74 68 65 20 6a 6f 69 6e 20 63 6f  omit the join co
b4f0: 6c 75 6d 6e 73 20 66 72 6f 6d 20 74 68 65 20 0a  lumns from the .
b500: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b510: 2a 2a 20 74 61 62 6c 65 20 6f 6e 20 74 68 65 20  ** table on the 
b520: 72 69 67 68 74 20 2a 2f 0a 20 20 20 20 20 20 20  right */.       
b530: 20 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75           continu
b540: 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  e;.             
b550: 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20   }.             
b560: 20 69 66 28 20 73 71 6c 69 74 65 33 49 64 4c 69   if( sqlite3IdLi
b570: 73 74 49 6e 64 65 78 28 70 4c 65 66 74 5b 31 5d  stIndex(pLeft[1]
b580: 2e 70 55 73 69 6e 67 2c 20 7a 4e 61 6d 65 29 3e  .pUsing, zName)>
b590: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
b5a0: 20 20 20 20 20 20 2f 2a 20 49 6e 20 61 20 6a 6f        /* In a jo
b5b0: 69 6e 20 77 69 74 68 20 61 20 55 53 49 4e 47 20  in with a USING 
b5c0: 63 6c 61 75 73 65 2c 20 6f 6d 69 74 20 63 6f 6c  clause, omit col
b5d0: 75 6d 6e 73 20 69 6e 20 74 68 65 0a 20 20 20 20  umns in the.    
b5e0: 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 75              ** u
b5f0: 73 69 6e 67 20 63 6c 61 75 73 65 20 66 72 6f 6d  sing clause from
b600: 20 74 68 65 20 74 61 62 6c 65 20 6f 6e 20 74 68   the table on th
b610: 65 20 72 69 67 68 74 2e 20 2a 2f 0a 20 20 20 20  e right. */.    
b620: 20 20 20 20 20 20 20 20 20 20 20 20 63 6f 6e 74              cont
b630: 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 20 20  inue;.          
b640: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
b650: 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20    }.            
b660: 70 52 69 67 68 74 20 3d 20 73 71 6c 69 74 65 33  pRight = sqlite3
b670: 50 45 78 70 72 28 70 50 61 72 73 65 2c 20 54 4b  PExpr(pParse, TK
b680: 5f 49 44 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20  _ID, 0, 0, 0);. 
b690: 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70             if( p
b6a0: 52 69 67 68 74 3d 3d 30 20 29 20 62 72 65 61 6b  Right==0 ) break
b6b0: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 65  ;.            se
b6c0: 74 51 75 6f 74 65 64 54 6f 6b 65 6e 28 70 50 61  tQuotedToken(pPa
b6d0: 72 73 65 2c 20 26 70 52 69 67 68 74 2d 3e 74 6f  rse, &pRight->to
b6e0: 6b 65 6e 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20  ken, zName);.   
b6f0: 20 20 20 20 20 20 20 20 20 69 66 28 20 7a 54 61           if( zTa
b700: 62 4e 61 6d 65 20 26 26 20 28 6c 6f 6e 67 4e 61  bName && (longNa
b710: 6d 65 73 20 7c 7c 20 70 54 61 62 4c 69 73 74 2d  mes || pTabList-
b720: 3e 6e 53 72 63 3e 31 29 20 29 7b 0a 20 20 20 20  >nSrc>1) ){.    
b730: 20 20 20 20 20 20 20 20 20 20 45 78 70 72 20 2a            Expr *
b740: 70 4c 65 66 74 20 3d 20 73 71 6c 69 74 65 33 50  pLeft = sqlite3P
b750: 45 78 70 72 28 70 50 61 72 73 65 2c 20 54 4b 5f  Expr(pParse, TK_
b760: 49 44 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20  ID, 0, 0, 0);.  
b770: 20 20 20 20 20 20 20 20 20 20 20 20 70 45 78 70              pExp
b780: 72 20 3d 20 73 71 6c 69 74 65 33 50 45 78 70 72  r = sqlite3PExpr
b790: 28 70 50 61 72 73 65 2c 20 54 4b 5f 44 4f 54 2c  (pParse, TK_DOT,
b7a0: 20 70 4c 65 66 74 2c 20 70 52 69 67 68 74 2c 20   pLeft, pRight, 
b7b0: 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  0);.            
b7c0: 20 20 69 66 28 20 70 45 78 70 72 3d 3d 30 20 29    if( pExpr==0 )
b7d0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
b7e0: 20 20 20 20 20 20 73 65 74 51 75 6f 74 65 64 54        setQuotedT
b7f0: 6f 6b 65 6e 28 70 50 61 72 73 65 2c 20 26 70 4c  oken(pParse, &pL
b800: 65 66 74 2d 3e 74 6f 6b 65 6e 2c 20 7a 54 61 62  eft->token, zTab
b810: 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 20  Name);.         
b820: 20 20 20 20 20 73 65 74 54 6f 6b 65 6e 28 26 70       setToken(&p
b830: 45 78 70 72 2d 3e 73 70 61 6e 2c 20 0a 20 20 20  Expr->span, .   
b840: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73                 s
b850: 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 64 62  qlite3MPrintf(db
b860: 2c 20 22 25 73 2e 25 73 22 2c 20 7a 54 61 62 4e  , "%s.%s", zTabN
b870: 61 6d 65 2c 20 7a 4e 61 6d 65 29 29 3b 0a 20 20  ame, zName));.  
b880: 20 20 20 20 20 20 20 20 20 20 20 20 70 45 78 70              pExp
b890: 72 2d 3e 73 70 61 6e 2e 64 79 6e 20 3d 20 31 3b  r->span.dyn = 1;
b8a0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70  .              p
b8b0: 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 7a 20 3d 20  Expr->token.z = 
b8c0: 30 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  0;.             
b8d0: 20 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 6e 20   pExpr->token.n 
b8e0: 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 20  = 0;.           
b8f0: 20 20 20 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e     pExpr->token.
b900: 64 79 6e 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  dyn = 0;.       
b910: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
b920: 20 20 20 20 20 20 20 20 20 20 70 45 78 70 72 20            pExpr 
b930: 3d 20 70 52 69 67 68 74 3b 0a 20 20 20 20 20 20  = pRight;.      
b940: 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 73          pExpr->s
b950: 70 61 6e 20 3d 20 70 45 78 70 72 2d 3e 74 6f 6b  pan = pExpr->tok
b960: 65 6e 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  en;.            
b970: 20 20 70 45 78 70 72 2d 3e 73 70 61 6e 2e 64 79    pExpr->span.dy
b980: 6e 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20  n = 0;.         
b990: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20     }.           
b9a0: 20 69 66 28 20 6c 6f 6e 67 4e 61 6d 65 73 20 29   if( longNames )
b9b0: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
b9c0: 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 45 78  pNew = sqlite3Ex
b9d0: 70 72 4c 69 73 74 41 70 70 65 6e 64 28 70 50 61  prListAppend(pPa
b9e0: 72 73 65 2c 20 70 4e 65 77 2c 20 70 45 78 70 72  rse, pNew, pExpr
b9f0: 2c 20 26 70 45 78 70 72 2d 3e 73 70 61 6e 29 3b  , &pExpr->span);
ba00: 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 65 6c  .            }el
ba10: 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  se{.            
ba20: 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33    pNew = sqlite3
ba30: 45 78 70 72 4c 69 73 74 41 70 70 65 6e 64 28 70  ExprListAppend(p
ba40: 50 61 72 73 65 2c 20 70 4e 65 77 2c 20 70 45 78  Parse, pNew, pEx
ba50: 70 72 2c 20 26 70 52 69 67 68 74 2d 3e 74 6f 6b  pr, &pRight->tok
ba60: 65 6e 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  en);.           
ba70: 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20   }.          }. 
ba80: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
ba90: 20 69 66 28 20 21 74 61 62 6c 65 53 65 65 6e 20   if( !tableSeen 
baa0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  ){.          if(
bab0: 20 7a 54 4e 61 6d 65 20 29 7b 0a 20 20 20 20 20   zTName ){.     
bac0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72         sqlite3Er
bad0: 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
bae0: 6e 6f 20 73 75 63 68 20 74 61 62 6c 65 3a 20 25  no such table: %
baf0: 73 22 2c 20 7a 54 4e 61 6d 65 29 3b 0a 20 20 20  s", zTName);.   
bb00: 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
bb10: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
bb20: 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
bb30: 2c 20 22 6e 6f 20 74 61 62 6c 65 73 20 73 70 65  , "no tables spe
bb40: 63 69 66 69 65 64 22 29 3b 0a 20 20 20 20 20 20  cified");.      
bb50: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
bb60: 72 63 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20  rc = 1;.        
bb70: 7d 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  }.        sqlite
bb80: 33 5f 66 72 65 65 28 7a 54 4e 61 6d 65 29 3b 0a  3_free(zTName);.
bb90: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
bba0: 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73    sqlite3ExprLis
bbb0: 74 44 65 6c 65 74 65 28 70 45 4c 69 73 74 29 3b  tDelete(pEList);
bbc0: 0a 20 20 20 20 70 2d 3e 70 45 4c 69 73 74 20 3d  .    p->pEList =
bbd0: 20 70 4e 65 77 3b 0a 20 20 7d 0a 20 20 69 66 28   pNew;.  }.  if(
bbe0: 20 70 2d 3e 70 45 4c 69 73 74 20 26 26 20 70 2d   p->pEList && p-
bbf0: 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3e 53  >pEList->nExpr>S
bc00: 51 4c 49 54 45 5f 4d 41 58 5f 43 4f 4c 55 4d 4e  QLITE_MAX_COLUMN
bc10: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45   ){.    sqlite3E
bc20: 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
bc30: 22 74 6f 6f 20 6d 61 6e 79 20 63 6f 6c 75 6d 6e  "too many column
bc40: 73 20 69 6e 20 72 65 73 75 6c 74 20 73 65 74 22  s in result set"
bc50: 29 3b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49  );.    rc = SQLI
bc60: 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20  TE_ERROR;.  }.  
bc70: 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  if( db->mallocFa
bc80: 69 6c 65 64 20 29 7b 0a 20 20 20 20 72 63 20 3d  iled ){.    rc =
bc90: 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
bca0: 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
bcb0: 7d 0a 0a 2f 2a 0a 2a 2a 20 70 45 20 69 73 20 61  }../*.** pE is a
bcc0: 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 6e 20 65   pointer to an e
bcd0: 78 70 72 65 73 73 69 6f 6e 20 77 68 69 63 68 20  xpression which 
bce0: 69 73 20 61 20 73 69 6e 67 6c 65 20 74 65 72 6d  is a single term
bcf0: 20 69 6e 0a 2a 2a 20 4f 52 44 45 52 20 42 59 20   in.** ORDER BY 
bd00: 6f 72 20 47 52 4f 55 50 20 42 59 20 63 6c 61 75  or GROUP BY clau
bd10: 73 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 45 20  se..**.** If pE 
bd20: 65 76 61 6c 75 61 74 65 73 20 74 6f 20 61 6e 20  evaluates to an 
bd30: 69 6e 74 65 67 65 72 20 63 6f 6e 73 74 61 6e 74  integer constant
bd40: 20 69 2c 20 74 68 65 6e 20 72 65 74 75 72 6e 20   i, then return 
bd50: 69 2e 0a 2a 2a 20 54 68 69 73 20 69 73 20 61 6e  i..** This is an
bd60: 20 69 6e 64 69 63 61 74 69 6f 6e 20 74 6f 20 74   indication to t
bd70: 68 65 20 63 61 6c 6c 65 72 20 74 68 61 74 20 69  he caller that i
bd80: 74 20 73 68 6f 75 6c 64 20 73 6f 72 74 0a 2a 2a  t should sort.**
bd90: 20 62 79 20 74 68 65 20 69 2d 74 68 20 63 6f 6c   by the i-th col
bda0: 75 6d 6e 20 6f 66 20 74 68 65 20 72 65 73 75 6c  umn of the resul
bdb0: 74 20 73 65 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  t set..**.** If 
bdc0: 70 45 20 69 73 20 61 20 77 65 6c 6c 2d 66 6f 72  pE is a well-for
bdd0: 6d 65 64 20 65 78 70 72 65 73 73 69 6f 6e 20 61  med expression a
bde0: 6e 64 20 74 68 65 20 53 45 4c 45 43 54 20 73 74  nd the SELECT st
bdf0: 61 74 65 6d 65 6e 74 0a 2a 2a 20 69 73 20 6e 6f  atement.** is no
be00: 74 20 63 6f 6d 70 6f 75 6e 64 2c 20 74 68 65 6e  t compound, then
be10: 20 72 65 74 75 72 6e 20 30 2e 20 20 54 68 69 73   return 0.  This
be20: 20 69 6e 64 69 63 61 74 65 73 20 74 6f 20 74 68   indicates to th
be30: 65 0a 2a 2a 20 63 61 6c 6c 65 72 20 74 68 61 74  e.** caller that
be40: 20 69 74 20 73 68 6f 75 6c 64 20 73 6f 72 74 20   it should sort 
be50: 62 79 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20  by the value of 
be60: 74 68 65 20 4f 52 44 45 52 20 42 59 0a 2a 2a 20  the ORDER BY.** 
be70: 65 78 70 72 65 73 73 69 6f 6e 2e 0a 2a 2a 0a 2a  expression..**.*
be80: 2a 20 49 66 20 74 68 65 20 53 45 4c 45 43 54 20  * If the SELECT 
be90: 69 73 20 63 6f 6d 70 6f 75 6e 64 2c 20 74 68 65  is compound, the
bea0: 6e 20 61 74 74 65 6d 70 74 20 74 6f 20 6d 61 74  n attempt to mat
beb0: 63 68 20 70 45 20 61 67 61 69 6e 73 74 0a 2a 2a  ch pE against.**
bec0: 20 72 65 73 75 6c 74 20 73 65 74 20 63 6f 6c 75   result set colu
bed0: 6d 6e 73 20 69 6e 20 74 68 65 20 6c 65 66 74 2d  mns in the left-
bee0: 6d 6f 73 74 20 53 45 4c 45 43 54 20 73 74 61 74  most SELECT stat
bef0: 65 6d 65 6e 74 2e 20 20 52 65 74 75 72 6e 0a 2a  ement.  Return.*
bf00: 2a 20 74 68 65 20 69 6e 64 65 78 20 69 20 6f 66  * the index i of
bf10: 20 74 68 65 20 6d 61 74 63 68 69 6e 67 20 63 6f   the matching co
bf20: 6c 75 6d 6e 2c 20 61 73 20 61 6e 20 69 6e 64 69  lumn, as an indi
bf30: 63 61 74 69 6f 6e 20 74 6f 20 74 68 65 20 0a 2a  cation to the .*
bf40: 2a 20 63 61 6c 6c 65 72 20 74 68 61 74 20 69 74  * caller that it
bf50: 20 73 68 6f 75 6c 64 20 73 6f 72 74 20 62 79 20   should sort by 
bf60: 74 68 65 20 69 2d 74 68 20 63 6f 6c 75 6d 6e 2e  the i-th column.
bf70: 20 20 49 66 20 74 68 65 72 65 20 69 73 0a 2a 2a    If there is.**
bf80: 20 6e 6f 20 6d 61 74 63 68 2c 20 72 65 74 75 72   no match, retur
bf90: 6e 20 2d 31 20 61 6e 64 20 6c 65 61 76 65 20 61  n -1 and leave a
bfa0: 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20  n error message 
bfb0: 69 6e 20 70 50 61 72 73 65 2e 0a 2a 2f 0a 73 74  in pParse..*/.st
bfc0: 61 74 69 63 20 69 6e 74 20 6d 61 74 63 68 4f 72  atic int matchOr
bfd0: 64 65 72 42 79 54 65 72 6d 54 6f 45 78 70 72 4c  derByTermToExprL
bfe0: 69 73 74 28 0a 20 20 50 61 72 73 65 20 2a 70 50  ist(.  Parse *pP
bff0: 61 72 73 65 2c 20 20 20 20 20 2f 2a 20 50 61 72  arse,     /* Par
c000: 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 66 6f 72  sing context for
c010: 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 73 20   error messages 
c020: 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 53 65  */.  Select *pSe
c030: 6c 65 63 74 2c 20 20 20 2f 2a 20 54 68 65 20 53  lect,   /* The S
c040: 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20  ELECT statement 
c050: 77 69 74 68 20 74 68 65 20 4f 52 44 45 52 20 42  with the ORDER B
c060: 59 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 45 78  Y clause */.  Ex
c070: 70 72 20 2a 70 45 2c 20 20 20 20 20 20 20 20 20  pr *pE,         
c080: 20 2f 2a 20 54 68 65 20 73 70 65 63 69 66 69 63   /* The specific
c090: 20 4f 52 44 45 52 20 42 59 20 74 65 72 6d 20 2a   ORDER BY term *
c0a0: 2f 0a 20 20 69 6e 74 20 69 64 78 2c 20 20 20 20  /.  int idx,    
c0b0: 20 20 20 20 20 20 20 2f 2a 20 57 68 65 6e 20 4f         /* When O
c0c0: 52 44 45 52 20 42 59 20 74 65 72 6d 20 69 73 20  RDER BY term is 
c0d0: 74 68 69 73 20 2a 2f 0a 20 20 69 6e 74 20 69 73  this */.  int is
c0e0: 43 6f 6d 70 6f 75 6e 64 2c 20 20 20 20 2f 2a 20  Compound,    /* 
c0f0: 54 72 75 65 20 69 66 20 74 68 69 73 20 69 73 20  True if this is 
c100: 61 20 63 6f 6d 70 6f 75 6e 64 20 53 45 4c 45 43  a compound SELEC
c110: 54 20 2a 2f 0a 20 20 75 38 20 2a 70 48 61 73 41  T */.  u8 *pHasA
c120: 67 67 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75  gg        /* Tru
c130: 65 20 69 66 20 65 78 70 72 65 73 73 69 6f 6e 20  e if expression 
c140: 63 6f 6e 74 61 69 6e 73 20 61 67 67 72 65 67 61  contains aggrega
c150: 74 65 20 66 75 6e 63 74 69 6f 6e 73 20 2a 2f 0a  te functions */.
c160: 29 7b 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20  ){.  int i;     
c170: 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20          /* Loop 
c180: 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 45 78 70  counter */.  Exp
c190: 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 3b 20 20  rList *pEList;  
c1a0: 2f 2a 20 54 68 65 20 63 6f 6c 75 6d 6e 73 20 6f  /* The columns o
c1b0: 66 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74  f the result set
c1c0: 20 2a 2f 0a 20 20 4e 61 6d 65 43 6f 6e 74 65 78   */.  NameContex
c1d0: 74 20 6e 63 3b 20 20 20 20 2f 2a 20 4e 61 6d 65  t nc;    /* Name
c1e0: 20 63 6f 6e 74 65 78 74 20 66 6f 72 20 72 65 73   context for res
c1f0: 6f 6c 76 69 6e 67 20 70 45 20 2a 2f 0a 0a 0a 20  olving pE */... 
c200: 20 2f 2a 20 49 66 20 74 68 65 20 74 65 72 6d 20   /* If the term 
c210: 69 73 20 61 6e 20 69 6e 74 65 67 65 72 20 63 6f  is an integer co
c220: 6e 73 74 61 6e 74 2c 20 72 65 74 75 72 6e 20 74  nstant, return t
c230: 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68 61 74  he value of that
c240: 0a 20 20 2a 2a 20 63 6f 6e 73 74 61 6e 74 20 2a  .  ** constant *
c250: 2f 0a 20 20 70 45 4c 69 73 74 20 3d 20 70 53 65  /.  pEList = pSe
c260: 6c 65 63 74 2d 3e 70 45 4c 69 73 74 3b 0a 20 20  lect->pEList;.  
c270: 69 66 28 20 73 71 6c 69 74 65 33 45 78 70 72 49  if( sqlite3ExprI
c280: 73 49 6e 74 65 67 65 72 28 70 45 2c 20 26 69 29  sInteger(pE, &i)
c290: 20 29 7b 0a 20 20 20 20 69 66 28 20 69 3c 3d 30   ){.    if( i<=0
c2a0: 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66 20   ){.      /* If 
c2b0: 69 20 69 73 20 74 6f 6f 20 73 6d 61 6c 6c 2c 20  i is too small, 
c2c0: 6d 61 6b 65 20 69 74 20 74 6f 6f 20 62 69 67 2e  make it too big.
c2d0: 20 20 54 68 61 74 20 77 61 79 20 74 68 65 20 63    That way the c
c2e0: 61 6c 6c 69 6e 67 0a 20 20 20 20 20 20 2a 2a 20  alling.      ** 
c2f0: 66 75 6e 63 74 69 6f 6e 20 73 74 69 6c 6c 20 73  function still s
c300: 65 65 73 20 61 20 76 61 6c 75 65 20 74 68 61 74  ees a value that
c310: 20 69 73 20 6f 75 74 20 6f 66 20 72 61 6e 67 65   is out of range
c320: 2c 20 62 75 74 20 64 6f 65 73 0a 20 20 20 20 20  , but does.     
c330: 20 2a 2a 20 6e 6f 74 20 63 6f 6e 66 75 73 65 20   ** not confuse 
c340: 74 68 65 20 63 6f 6c 75 6d 6e 20 6e 75 6d 62 65  the column numbe
c350: 72 20 77 69 74 68 20 30 20 6f 72 20 2d 31 20 72  r with 0 or -1 r
c360: 65 73 75 6c 74 20 63 6f 64 65 2e 0a 20 20 20 20  esult code..    
c370: 20 20 2a 2f 0a 20 20 20 20 20 20 69 20 3d 20 70    */.      i = p
c380: 45 4c 69 73 74 2d 3e 6e 45 78 70 72 2b 31 3b 0a  EList->nExpr+1;.
c390: 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e      }.    return
c3a0: 20 69 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66   i;.  }..  /* If
c3b0: 20 74 68 65 20 74 65 72 6d 20 69 73 20 61 20 73   the term is a s
c3c0: 69 6d 70 6c 65 20 69 64 65 6e 74 69 66 69 65 72  imple identifier
c3d0: 20 74 68 61 74 20 74 72 79 20 74 6f 20 6d 61 74   that try to mat
c3e0: 63 68 20 74 68 61 74 20 69 64 65 6e 74 69 66 69  ch that identifi
c3f0: 65 72 0a 20 20 2a 2a 20 61 67 61 69 6e 73 74 20  er.  ** against 
c400: 61 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 20 69 6e  a column name in
c410: 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 2e   the result set.
c420: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 45 2d 3e  .  */.  if( pE->
c430: 6f 70 3d 3d 54 4b 5f 49 44 20 7c 7c 20 28 70 45  op==TK_ID || (pE
c440: 2d 3e 6f 70 3d 3d 54 4b 5f 53 54 52 49 4e 47 20  ->op==TK_STRING 
c450: 26 26 20 70 45 2d 3e 74 6f 6b 65 6e 2e 7a 5b 30  && pE->token.z[0
c460: 5d 21 3d 27 5c 27 27 29 20 29 7b 0a 20 20 20 20  ]!='\'') ){.    
c470: 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50  sqlite3 *db = pP
c480: 61 72 73 65 2d 3e 64 62 3b 0a 20 20 20 20 63 68  arse->db;.    ch
c490: 61 72 20 2a 7a 43 6f 6c 20 3d 20 73 71 6c 69 74  ar *zCol = sqlit
c4a0: 65 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28  e3NameFromToken(
c4b0: 64 62 2c 20 26 70 45 2d 3e 74 6f 6b 65 6e 29 3b  db, &pE->token);
c4c0: 0a 20 20 20 20 69 66 28 20 7a 43 6f 6c 3d 3d 30  .    if( zCol==0
c4d0: 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
c4e0: 20 2d 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66   -1;.    }.    f
c4f0: 6f 72 28 69 3d 30 3b 20 69 3c 70 45 4c 69 73 74  or(i=0; i<pEList
c500: 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20  ->nExpr; i++){. 
c510: 20 20 20 20 20 63 68 61 72 20 2a 7a 41 73 20 3d       char *zAs =
c520: 20 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e   pEList->a[i].zN
c530: 61 6d 65 3b 0a 20 20 20 20 20 20 69 66 28 20 7a  ame;.      if( z
c540: 41 73 21 3d 30 20 26 26 20 73 71 6c 69 74 65 33  As!=0 && sqlite3
c550: 53 74 72 49 43 6d 70 28 7a 41 73 2c 20 7a 43 6f  StrICmp(zAs, zCo
c560: 6c 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  l)==0 ){.       
c570: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 43   sqlite3_free(zC
c580: 6f 6c 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74  ol);.        ret
c590: 75 72 6e 20 69 2b 31 3b 0a 20 20 20 20 20 20 7d  urn i+1;.      }
c5a0: 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
c5b0: 65 33 5f 66 72 65 65 28 7a 43 6f 6c 29 3b 0a 20  e3_free(zCol);. 
c5c0: 20 7d 0a 0a 20 20 2f 2a 20 52 65 73 6f 6c 76 65   }..  /* Resolve
c5d0: 20 61 6c 6c 20 6e 61 6d 65 73 20 69 6e 20 74 68   all names in th
c5e0: 65 20 4f 52 44 45 52 20 42 59 20 74 65 72 6d 20  e ORDER BY term 
c5f0: 65 78 70 72 65 73 73 69 6f 6e 0a 20 20 2a 2f 0a  expression.  */.
c600: 20 20 6d 65 6d 73 65 74 28 26 6e 63 2c 20 30 2c    memset(&nc, 0,
c610: 20 73 69 7a 65 6f 66 28 6e 63 29 29 3b 0a 20 20   sizeof(nc));.  
c620: 6e 63 2e 70 50 61 72 73 65 20 3d 20 70 50 61 72  nc.pParse = pPar
c630: 73 65 3b 0a 20 20 6e 63 2e 70 53 72 63 4c 69 73  se;.  nc.pSrcLis
c640: 74 20 3d 20 70 53 65 6c 65 63 74 2d 3e 70 53 72  t = pSelect->pSr
c650: 63 3b 0a 20 20 6e 63 2e 70 45 4c 69 73 74 20 3d  c;.  nc.pEList =
c660: 20 70 45 4c 69 73 74 3b 0a 20 20 6e 63 2e 61 6c   pEList;.  nc.al
c670: 6c 6f 77 41 67 67 20 3d 20 31 3b 0a 20 20 6e 63  lowAgg = 1;.  nc
c680: 2e 6e 45 72 72 20 3d 20 30 3b 0a 20 20 69 66 28  .nErr = 0;.  if(
c690: 20 73 71 6c 69 74 65 33 45 78 70 72 52 65 73 6f   sqlite3ExprReso
c6a0: 6c 76 65 4e 61 6d 65 73 28 26 6e 63 2c 20 70 45  lveNames(&nc, pE
c6b0: 29 20 29 7b 0a 20 20 20 20 69 66 28 20 69 73 43  ) ){.    if( isC
c6c0: 6f 6d 70 6f 75 6e 64 20 29 7b 0a 20 20 20 20 20  ompound ){.     
c6d0: 20 73 71 6c 69 74 65 33 45 72 72 6f 72 43 6c 65   sqlite3ErrorCle
c6e0: 61 72 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20  ar(pParse);.    
c6f0: 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20    return 0;.    
c700: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 65 74  }else{.      ret
c710: 75 72 6e 20 2d 31 3b 0a 20 20 20 20 7d 0a 20 20  urn -1;.    }.  
c720: 7d 0a 20 20 69 66 28 20 6e 63 2e 68 61 73 41 67  }.  if( nc.hasAg
c730: 67 20 26 26 20 70 48 61 73 41 67 67 20 29 7b 0a  g && pHasAgg ){.
c740: 20 20 20 20 2a 70 48 61 73 41 67 67 20 3d 20 31      *pHasAgg = 1
c750: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46 6f 72 20  ;.  }..  /* For 
c760: 61 20 63 6f 6d 70 6f 75 6e 64 20 53 45 4c 45 43  a compound SELEC
c770: 54 2c 20 77 65 20 6e 65 65 64 20 74 6f 20 74 72  T, we need to tr
c780: 79 20 74 6f 20 6d 61 74 63 68 20 74 68 65 20 4f  y to match the O
c790: 52 44 45 52 20 42 59 0a 20 20 2a 2a 20 65 78 70  RDER BY.  ** exp
c7a0: 72 65 73 73 69 6f 6e 20 61 67 61 69 6e 73 74 20  ression against 
c7b0: 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 69 6e  an expression in
c7c0: 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 0a   the result set.
c7d0: 20 20 2a 2f 0a 20 20 69 66 28 20 69 73 43 6f 6d    */.  if( isCom
c7e0: 70 6f 75 6e 64 20 29 7b 0a 20 20 20 20 66 6f 72  pound ){.    for
c7f0: 28 69 3d 30 3b 20 69 3c 70 45 4c 69 73 74 2d 3e  (i=0; i<pEList->
c800: 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20  nExpr; i++){.   
c810: 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 45 78     if( sqlite3Ex
c820: 70 72 43 6f 6d 70 61 72 65 28 70 45 4c 69 73 74  prCompare(pEList
c830: 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 2c 20 70 45  ->a[i].pExpr, pE
c840: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74  ) ){.        ret
c850: 75 72 6e 20 69 2b 31 3b 0a 20 20 20 20 20 20 7d  urn i+1;.      }
c860: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
c870: 75 72 6e 20 30 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  urn 0;.}.../*.**
c880: 20 41 6e 61 6c 79 7a 65 20 61 6e 64 20 4f 52 44   Analyze and ORD
c890: 45 52 20 42 59 20 6f 72 20 47 52 4f 55 50 20 42  ER BY or GROUP B
c8a0: 59 20 63 6c 61 75 73 65 20 69 6e 20 61 20 73 69  Y clause in a si
c8b0: 6d 70 6c 65 20 53 45 4c 45 43 54 20 73 74 61 74  mple SELECT stat
c8c0: 65 6d 65 6e 74 2e 0a 2a 2a 20 52 65 74 75 72 6e  ement..** Return
c8d0: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 65   the number of e
c8e0: 72 72 6f 72 73 20 73 65 65 6e 2e 0a 2a 2a 0a 2a  rrors seen..**.*
c8f0: 2a 20 45 76 65 72 79 20 74 65 72 6d 20 6f 66 20  * Every term of 
c900: 74 68 65 20 4f 52 44 45 52 20 42 59 20 6f 72 20  the ORDER BY or 
c910: 47 52 4f 55 50 20 42 59 20 63 6c 61 75 73 65 20  GROUP BY clause 
c920: 6e 65 65 64 73 20 74 6f 20 62 65 20 61 6e 0a 2a  needs to be an.*
c930: 2a 20 65 78 70 72 65 73 73 69 6f 6e 2e 20 20 49  * expression.  I
c940: 66 20 61 6e 79 20 65 78 70 72 65 73 73 69 6f 6e  f any expression
c950: 20 69 73 20 61 6e 20 69 6e 74 65 67 65 72 20 63   is an integer c
c960: 6f 6e 73 74 61 6e 74 2c 20 74 68 65 6e 0a 2a 2a  onstant, then.**
c970: 20 74 68 61 74 20 65 78 70 72 65 73 73 69 6f 6e   that expression
c980: 20 69 73 20 72 65 70 6c 61 63 65 64 20 62 79 20   is replaced by 
c990: 74 68 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e  the correspondin
c9a0: 67 20 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e  g .** expression
c9b0: 20 66 72 6f 6d 20 74 68 65 20 72 65 73 75 6c 74   from the result
c9c0: 20 73 65 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20   set..*/.static 
c9d0: 69 6e 74 20 70 72 6f 63 65 73 73 4f 72 64 65 72  int processOrder
c9e0: 47 72 6f 75 70 42 79 28 0a 20 20 50 61 72 73 65  GroupBy(.  Parse
c9f0: 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20   *pParse,       
ca00: 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74   /* Parsing cont
ca10: 65 78 74 2e 20 20 4c 65 61 76 65 20 65 72 72 6f  ext.  Leave erro
ca20: 72 20 6d 65 73 73 61 67 65 73 20 68 65 72 65 20  r messages here 
ca30: 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 53 65  */.  Select *pSe
ca40: 6c 65 63 74 2c 20 20 20 20 20 20 2f 2a 20 54 68  lect,      /* Th
ca50: 65 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  e SELECT stateme
ca60: 6e 74 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68  nt containing th
ca70: 65 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 45 78  e clause */.  Ex
ca80: 70 72 4c 69 73 74 20 2a 70 4f 72 64 65 72 42 79  prList *pOrderBy
ca90: 2c 20 20 20 2f 2a 20 54 68 65 20 4f 52 44 45 52  ,   /* The ORDER
caa0: 20 42 59 20 6f 72 20 47 52 4f 55 50 20 42 59 20   BY or GROUP BY 
cab0: 63 6c 61 75 73 65 20 74 6f 20 62 65 20 70 72 6f  clause to be pro
cac0: 63 65 73 73 65 64 20 2a 2f 0a 20 20 69 6e 74 20  cessed */.  int 
cad0: 69 73 4f 72 64 65 72 2c 20 20 20 20 20 20 20 20  isOrder,        
cae0: 20 20 2f 2a 20 31 20 66 6f 72 20 4f 52 44 45 52    /* 1 for ORDER
caf0: 20 42 59 2e 20 20 30 20 66 6f 72 20 47 52 4f 55   BY.  0 for GROU
cb00: 50 20 42 59 20 2a 2f 0a 20 20 75 38 20 2a 70 48  P BY */.  u8 *pH
cb10: 61 73 41 67 67 20 20 20 20 20 20 20 20 20 20 20  asAgg           
cb20: 2f 2a 20 53 65 74 20 74 6f 20 54 52 55 45 20 69  /* Set to TRUE i
cb30: 66 20 61 6e 79 20 74 65 72 6d 20 63 6f 6e 74 61  f any term conta
cb40: 69 6e 73 20 61 6e 20 61 67 67 72 65 67 61 74 65  ins an aggregate
cb50: 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 3b 0a   */.){.  int i;.
cb60: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
cb70: 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 45 78  pParse->db;.  Ex
cb80: 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 3b 0a  prList *pEList;.
cb90: 0a 20 20 69 66 28 20 70 4f 72 64 65 72 42 79 3d  .  if( pOrderBy=
cba0: 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  =0 ) return 0;. 
cbb0: 20 69 66 28 20 70 4f 72 64 65 72 42 79 2d 3e 6e   if( pOrderBy->n
cbc0: 45 78 70 72 3e 53 51 4c 49 54 45 5f 4d 41 58 5f  Expr>SQLITE_MAX_
cbd0: 43 4f 4c 55 4d 4e 20 29 7b 0a 20 20 20 20 63 6f  COLUMN ){.    co
cbe0: 6e 73 74 20 63 68 61 72 20 2a 7a 54 79 70 65 20  nst char *zType 
cbf0: 3d 20 69 73 4f 72 64 65 72 20 3f 20 22 4f 52 44  = isOrder ? "ORD
cc00: 45 52 22 20 3a 20 22 47 52 4f 55 50 22 3b 0a 20  ER" : "GROUP";. 
cc10: 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
cc20: 73 67 28 70 50 61 72 73 65 2c 20 22 74 6f 6f 20  sg(pParse, "too 
cc30: 6d 61 6e 79 20 74 65 72 6d 73 20 69 6e 20 25 73  many terms in %s
cc40: 20 42 59 20 63 6c 61 75 73 65 22 2c 20 7a 54 79   BY clause", zTy
cc50: 70 65 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  pe);.    return 
cc60: 31 3b 0a 20 20 7d 0a 20 20 70 45 4c 69 73 74 20  1;.  }.  pEList 
cc70: 3d 20 70 53 65 6c 65 63 74 2d 3e 70 45 4c 69 73  = pSelect->pELis
cc80: 74 3b 0a 20 20 69 66 28 20 70 45 4c 69 73 74 3d  t;.  if( pEList=
cc90: 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  =0 ){.    return
cca0: 20 30 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d   0;.  }.  for(i=
ccb0: 30 3b 20 69 3c 70 4f 72 64 65 72 42 79 2d 3e 6e  0; i<pOrderBy->n
ccc0: 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  Expr; i++){.    
ccd0: 69 6e 74 20 69 43 6f 6c 3b 0a 20 20 20 20 45 78  int iCol;.    Ex
cce0: 70 72 20 2a 70 45 20 3d 20 70 4f 72 64 65 72 42  pr *pE = pOrderB
ccf0: 79 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 20  y->a[i].pExpr;. 
cd00: 20 20 20 69 43 6f 6c 20 3d 20 6d 61 74 63 68 4f     iCol = matchO
cd10: 72 64 65 72 42 79 54 65 72 6d 54 6f 45 78 70 72  rderByTermToExpr
cd20: 4c 69 73 74 28 70 50 61 72 73 65 2c 20 70 53 65  List(pParse, pSe
cd30: 6c 65 63 74 2c 20 70 45 2c 20 69 2b 31 2c 20 30  lect, pE, i+1, 0
cd40: 2c 20 70 48 61 73 41 67 67 29 3b 0a 20 20 20 20  , pHasAgg);.    
cd50: 69 66 28 20 69 43 6f 6c 3c 30 20 29 7b 0a 20 20  if( iCol<0 ){.  
cd60: 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20      return 1;.  
cd70: 20 20 7d 0a 20 20 20 20 69 66 28 20 69 43 6f 6c    }.    if( iCol
cd80: 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 20 29  >pEList->nExpr )
cd90: 7b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68  {.      const ch
cda0: 61 72 20 2a 7a 54 79 70 65 20 3d 20 69 73 4f 72  ar *zType = isOr
cdb0: 64 65 72 20 3f 20 22 4f 52 44 45 52 22 20 3a 20  der ? "ORDER" : 
cdc0: 22 47 52 4f 55 50 22 3b 0a 20 20 20 20 20 20 73  "GROUP";.      s
cdd0: 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
cde0: 50 61 72 73 65 2c 20 0a 20 20 20 20 20 20 20 20  Parse, .        
cdf0: 20 22 25 72 20 25 73 20 42 59 20 74 65 72 6d 20   "%r %s BY term 
ce00: 6f 75 74 20 6f 66 20 72 61 6e 67 65 20 2d 20 73  out of range - s
ce10: 68 6f 75 6c 64 20 62 65 20 22 0a 20 20 20 20 20  hould be ".     
ce20: 20 20 20 20 22 62 65 74 77 65 65 6e 20 31 20 61      "between 1 a
ce30: 6e 64 20 25 64 22 2c 20 69 2b 31 2c 20 7a 54 79  nd %d", i+1, zTy
ce40: 70 65 2c 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70  pe, pEList->nExp
ce50: 72 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  r);.      return
ce60: 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66   1;.    }.    if
ce70: 28 20 69 43 6f 6c 3e 30 20 29 7b 0a 20 20 20 20  ( iCol>0 ){.    
ce80: 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c    CollSeq *pColl
ce90: 20 3d 20 70 45 2d 3e 70 43 6f 6c 6c 3b 0a 20 20   = pE->pColl;.  
cea0: 20 20 20 20 69 6e 74 20 66 6c 61 67 73 20 3d 20      int flags = 
ceb0: 70 45 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f 45  pE->flags & EP_E
cec0: 78 70 43 6f 6c 6c 61 74 65 3b 0a 20 20 20 20 20  xpCollate;.     
ced0: 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65   sqlite3ExprDele
cee0: 74 65 28 70 45 29 3b 0a 20 20 20 20 20 20 70 45  te(pE);.      pE
cef0: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44 75   = sqlite3ExprDu
cf00: 70 28 64 62 2c 20 70 45 4c 69 73 74 2d 3e 61 5b  p(db, pEList->a[
cf10: 69 43 6f 6c 2d 31 5d 2e 70 45 78 70 72 29 3b 0a  iCol-1].pExpr);.
cf20: 20 20 20 20 20 20 70 4f 72 64 65 72 42 79 2d 3e        pOrderBy->
cf30: 61 5b 69 5d 2e 70 45 78 70 72 20 3d 20 70 45 3b  a[i].pExpr = pE;
cf40: 0a 20 20 20 20 20 20 69 66 28 20 70 43 6f 6c 6c  .      if( pColl
cf50: 20 26 26 20 66 6c 61 67 73 20 29 7b 0a 20 20 20   && flags ){.   
cf60: 20 20 20 20 20 70 45 2d 3e 70 43 6f 6c 6c 20 3d       pE->pColl =
cf70: 20 70 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 20 20   pColl;.        
cf80: 70 45 2d 3e 66 6c 61 67 73 20 7c 3d 20 66 6c 61  pE->flags |= fla
cf90: 67 73 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  gs;.      }.    
cfa0: 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30  }.  }.  return 0
cfb0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6e 61 6c 79  ;.}../*.** Analy
cfc0: 7a 65 20 61 6e 64 20 4f 52 44 45 52 20 42 59 20  ze and ORDER BY 
cfd0: 6f 72 20 47 52 4f 55 50 20 42 59 20 63 6c 61 75  or GROUP BY clau
cfe0: 73 65 20 69 6e 20 61 20 53 45 4c 45 43 54 20 73  se in a SELECT s
cff0: 74 61 74 65 6d 65 6e 74 2e 20 20 52 65 74 75 72  tatement.  Retur
d000: 6e 0a 2a 2a 20 74 68 65 20 6e 75 6d 62 65 72 20  n.** the number 
d010: 6f 66 20 65 72 72 6f 72 73 20 73 65 65 6e 2e 0a  of errors seen..
d020: 2a 2a 0a 2a 2a 20 54 68 65 20 70 72 6f 63 65 73  **.** The proces
d030: 73 69 6e 67 20 64 65 70 65 6e 64 73 20 6f 6e 20  sing depends on 
d040: 77 68 65 74 68 65 72 20 74 68 65 20 53 45 4c 45  whether the SELE
d050: 43 54 20 69 73 20 73 69 6d 70 6c 65 20 6f 72 20  CT is simple or 
d060: 63 6f 6d 70 6f 75 6e 64 2e 0a 2a 2a 20 46 6f 72  compound..** For
d070: 20 61 20 73 69 6d 70 6c 65 20 53 45 4c 45 43 54   a simple SELECT
d080: 20 73 74 61 74 65 6d 65 6e 74 2c 20 65 76 72 79   statement, evry
d090: 20 74 65 72 6d 20 6f 66 20 74 68 65 20 4f 52 44   term of the ORD
d0a0: 45 52 20 42 59 20 6f 72 20 47 52 4f 55 50 20 42  ER BY or GROUP B
d0b0: 59 0a 2a 2a 20 63 6c 61 75 73 65 20 6e 65 65 64  Y.** clause need
d0c0: 73 20 74 6f 20 62 65 20 61 6e 20 65 78 70 72 65  s to be an expre
d0d0: 73 73 69 6f 6e 2e 20 20 49 66 20 61 6e 79 20 65  ssion.  If any e
d0e0: 78 70 72 65 73 73 69 6f 6e 20 69 73 20 61 6e 20  xpression is an 
d0f0: 69 6e 74 65 67 65 72 0a 2a 2a 20 63 6f 6e 73 74  integer.** const
d100: 61 6e 74 2c 20 74 68 65 6e 20 74 68 61 74 20 65  ant, then that e
d110: 78 70 72 65 73 73 69 6f 6e 20 69 73 20 72 65 70  xpression is rep
d120: 6c 61 63 65 64 20 62 79 20 74 68 65 20 63 6f 72  laced by the cor
d130: 72 65 73 70 6f 6e 64 69 6e 67 20 0a 2a 2a 20 65  responding .** e
d140: 78 70 72 65 73 73 69 6f 6e 20 66 72 6f 6d 20 74  xpression from t
d150: 68 65 20 72 65 73 75 6c 74 20 73 65 74 2e 0a 2a  he result set..*
d160: 2a 0a 2a 2a 20 46 6f 72 20 63 6f 6d 70 6f 75 6e  *.** For compoun
d170: 64 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  d SELECT stateme
d180: 6e 74 73 2c 20 65 76 65 72 79 20 65 78 70 72 65  nts, every expre
d190: 73 73 69 6f 6e 20 6e 65 65 64 73 20 74 6f 20 62  ssion needs to b
d1a0: 65 20 6f 66 0a 2a 2a 20 74 79 70 65 20 54 4b 5f  e of.** type TK_
d1b0: 43 4f 4c 55 4d 4e 20 77 69 74 68 20 61 20 69 54  COLUMN with a iT
d1c0: 61 62 6c 65 20 76 61 6c 75 65 20 61 73 20 67 69  able value as gi
d1d0: 76 65 6e 20 69 6e 20 74 68 65 20 34 74 68 20 70  ven in the 4th p
d1e0: 61 72 61 6d 65 74 65 72 2e 0a 2a 2a 20 49 66 20  arameter..** If 
d1f0: 61 6e 79 20 65 78 70 72 65 73 73 69 6f 6e 20 69  any expression i
d200: 73 20 61 6e 20 69 6e 74 65 67 65 72 2c 20 74 68  s an integer, th
d210: 61 74 20 62 65 63 6f 6d 65 73 20 74 68 65 20 63  at becomes the c
d220: 6f 6c 75 6d 6e 20 6e 75 6d 62 65 72 2e 0a 2a 2a  olumn number..**
d230: 20 4f 74 68 65 72 77 69 73 65 2c 20 6d 61 74 63   Otherwise, matc
d240: 68 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  h the expression
d250: 20 61 67 61 69 6e 73 74 20 72 65 73 75 6c 74 20   against result 
d260: 73 65 74 20 63 6f 6c 75 6d 6e 73 20 66 72 6f 6d  set columns from
d270: 0a 2a 2a 20 74 68 65 20 6c 65 66 74 2d 6d 6f 73  .** the left-mos
d280: 74 20 53 45 4c 45 43 54 2e 0a 2a 2f 0a 73 74 61  t SELECT..*/.sta
d290: 74 69 63 20 69 6e 74 20 70 72 6f 63 65 73 73 43  tic int processC
d2a0: 6f 6d 70 6f 75 6e 64 4f 72 64 65 72 42 79 28 0a  ompoundOrderBy(.
d2b0: 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
d2c0: 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69          /* Parsi
d2d0: 6e 67 20 63 6f 6e 74 65 78 74 2e 20 20 4c 65 61  ng context.  Lea
d2e0: 76 65 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65  ve error message
d2f0: 73 20 68 65 72 65 20 2a 2f 0a 20 20 53 65 6c 65  s here */.  Sele
d300: 63 74 20 2a 70 53 65 6c 65 63 74 2c 20 20 20 20  ct *pSelect,    
d310: 20 20 2f 2a 20 54 68 65 20 53 45 4c 45 43 54 20    /* The SELECT 
d320: 73 74 61 74 65 6d 65 6e 74 20 63 6f 6e 74 61 69  statement contai
d330: 6e 69 6e 67 20 74 68 65 20 4f 52 44 45 52 20 42  ning the ORDER B
d340: 59 20 2a 2f 0a 20 20 69 6e 74 20 69 54 61 62 6c  Y */.  int iTabl
d350: 65 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  e            /* 
d360: 4f 75 74 70 75 74 20 74 61 62 6c 65 20 66 6f 72  Output table for
d370: 20 63 6f 6d 70 6f 75 6e 64 20 53 45 4c 45 43 54   compound SELECT
d380: 20 73 74 61 74 65 6d 65 6e 74 73 20 2a 2f 0a 29   statements */.)
d390: 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 45 78 70  {.  int i;.  Exp
d3a0: 72 4c 69 73 74 20 2a 70 4f 72 64 65 72 42 79 3b  rList *pOrderBy;
d3b0: 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c  .  ExprList *pEL
d3c0: 69 73 74 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a  ist;.  sqlite3 *
d3d0: 64 62 3b 0a 20 20 69 6e 74 20 6d 6f 72 65 54 6f  db;.  int moreTo
d3e0: 44 6f 20 3d 20 31 3b 0a 0a 20 20 70 4f 72 64 65  Do = 1;..  pOrde
d3f0: 72 42 79 20 3d 20 70 53 65 6c 65 63 74 2d 3e 70  rBy = pSelect->p
d400: 4f 72 64 65 72 42 79 3b 0a 20 20 69 66 28 20 70  OrderBy;.  if( p
d410: 4f 72 64 65 72 42 79 3d 3d 30 20 29 20 72 65 74  OrderBy==0 ) ret
d420: 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 70 4f 72  urn 0;.  if( pOr
d430: 64 65 72 42 79 2d 3e 6e 45 78 70 72 3e 53 51 4c  derBy->nExpr>SQL
d440: 49 54 45 5f 4d 41 58 5f 43 4f 4c 55 4d 4e 20 29  ITE_MAX_COLUMN )
d450: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72  {.    sqlite3Err
d460: 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 74  orMsg(pParse, "t
d470: 6f 6f 20 6d 61 6e 79 20 74 65 72 6d 73 20 69 6e  oo many terms in
d480: 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65   ORDER BY clause
d490: 22 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 31  ");.    return 1
d4a0: 3b 0a 20 20 7d 0a 20 20 64 62 20 3d 20 70 50 61  ;.  }.  db = pPa
d4b0: 72 73 65 2d 3e 64 62 3b 0a 20 20 66 6f 72 28 69  rse->db;.  for(i
d4c0: 3d 30 3b 20 69 3c 70 4f 72 64 65 72 42 79 2d 3e  =0; i<pOrderBy->
d4d0: 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20  nExpr; i++){.   
d4e0: 20 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e   pOrderBy->a[i].
d4f0: 64 6f 6e 65 20 3d 20 30 3b 0a 20 20 7d 0a 20 20  done = 0;.  }.  
d500: 77 68 69 6c 65 28 20 70 53 65 6c 65 63 74 2d 3e  while( pSelect->
d510: 70 50 72 69 6f 72 20 29 7b 0a 20 20 20 20 70 53  pPrior ){.    pS
d520: 65 6c 65 63 74 20 3d 20 70 53 65 6c 65 63 74 2d  elect = pSelect-
d530: 3e 70 50 72 69 6f 72 3b 0a 20 20 7d 0a 20 20 77  >pPrior;.  }.  w
d540: 68 69 6c 65 28 20 70 53 65 6c 65 63 74 20 26 26  hile( pSelect &&
d550: 20 6d 6f 72 65 54 6f 44 6f 20 29 7b 0a 20 20 20   moreToDo ){.   
d560: 20 6d 6f 72 65 54 6f 44 6f 20 3d 20 30 3b 0a 20   moreToDo = 0;. 
d570: 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4f     for(i=0; i<pO
d580: 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 3b 20 69  rderBy->nExpr; i
d590: 2b 2b 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69  ++){.      int i
d5a0: 43 6f 6c 3b 0a 20 20 20 20 20 20 45 78 70 72 20  Col;.      Expr 
d5b0: 2a 70 45 2c 20 2a 70 44 75 70 3b 0a 20 20 20 20  *pE, *pDup;.    
d5c0: 20 20 69 66 28 20 70 4f 72 64 65 72 42 79 2d 3e    if( pOrderBy->
d5d0: 61 5b 69 5d 2e 64 6f 6e 65 20 29 20 63 6f 6e 74  a[i].done ) cont
d5e0: 69 6e 75 65 3b 0a 20 20 20 20 20 20 70 45 20 3d  inue;.      pE =
d5f0: 20 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e   pOrderBy->a[i].
d600: 70 45 78 70 72 3b 0a 20 20 20 20 20 20 70 44 75  pExpr;.      pDu
d610: 70 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44  p = sqlite3ExprD
d620: 75 70 28 64 62 2c 20 70 45 29 3b 0a 20 20 20 20  up(db, pE);.    
d630: 20 20 69 66 28 20 70 44 75 70 3d 3d 30 20 29 7b    if( pDup==0 ){
d640: 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
d650: 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  1;.      }.     
d660: 20 69 43 6f 6c 20 3d 20 6d 61 74 63 68 4f 72 64   iCol = matchOrd
d670: 65 72 42 79 54 65 72 6d 54 6f 45 78 70 72 4c 69  erByTermToExprLi
d680: 73 74 28 70 50 61 72 73 65 2c 20 70 53 65 6c 65  st(pParse, pSele
d690: 63 74 2c 20 70 44 75 70 2c 20 69 2b 31 2c 20 31  ct, pDup, i+1, 1
d6a0: 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  , 0);.      sqli
d6b0: 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 70 44  te3ExprDelete(pD
d6c0: 75 70 29 3b 0a 20 20 20 20 20 20 69 66 28 20 69  up);.      if( i
d6d0: 43 6f 6c 3c 30 20 29 7b 0a 20 20 20 20 20 20 20  Col<0 ){.       
d6e0: 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 20   return 1;.     
d6f0: 20 7d 0a 20 20 20 20 20 20 70 45 4c 69 73 74 20   }.      pEList 
d700: 3d 20 70 53 65 6c 65 63 74 2d 3e 70 45 4c 69 73  = pSelect->pELis
d710: 74 3b 0a 20 20 20 20 20 20 69 66 28 20 70 45 4c  t;.      if( pEL
d720: 69 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ist==0 ){.      
d730: 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20    return 1;.    
d740: 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 69 43    }.      if( iC
d750: 6f 6c 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72  ol>pEList->nExpr
d760: 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
d770: 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
d780: 73 65 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20  se, .           
d790: 22 25 72 20 4f 52 44 45 52 20 42 59 20 74 65 72  "%r ORDER BY ter
d7a0: 6d 20 6f 75 74 20 6f 66 20 72 61 6e 67 65 20 2d  m out of range -
d7b0: 20 73 68 6f 75 6c 64 20 62 65 20 22 0a 20 20 20   should be ".   
d7c0: 20 20 20 20 20 20 20 20 22 62 65 74 77 65 65 6e          "between
d7d0: 20 31 20 61 6e 64 20 25 64 22 2c 20 69 2b 31 2c   1 and %d", i+1,
d7e0: 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 29 3b   pEList->nExpr);
d7f0: 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
d800: 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  1;.      }.     
d810: 20 69 66 28 20 69 43 6f 6c 3e 30 20 29 7b 0a 20   if( iCol>0 ){. 
d820: 20 20 20 20 20 20 20 70 45 2d 3e 6f 70 20 3d 20         pE->op = 
d830: 54 4b 5f 43 4f 4c 55 4d 4e 3b 0a 20 20 20 20 20  TK_COLUMN;.     
d840: 20 20 20 70 45 2d 3e 69 54 61 62 6c 65 20 3d 20     pE->iTable = 
d850: 69 54 61 62 6c 65 3b 0a 20 20 20 20 20 20 20 20  iTable;.        
d860: 70 45 2d 3e 69 41 67 67 20 3d 20 2d 31 3b 0a 20  pE->iAgg = -1;. 
d870: 20 20 20 20 20 20 20 70 45 2d 3e 69 43 6f 6c 75         pE->iColu
d880: 6d 6e 20 3d 20 69 43 6f 6c 2d 31 3b 0a 20 20 20  mn = iCol-1;.   
d890: 20 20 20 20 20 70 45 2d 3e 70 54 61 62 20 3d 20       pE->pTab = 
d8a0: 30 3b 0a 20 20 20 20 20 20 20 20 70 4f 72 64 65  0;.        pOrde
d8b0: 72 42 79 2d 3e 61 5b 69 5d 2e 64 6f 6e 65 20 3d  rBy->a[i].done =
d8c0: 20 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b   1;.      }else{
d8d0: 0a 20 20 20 20 20 20 20 20 6d 6f 72 65 54 6f 44  .        moreToD
d8e0: 6f 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20  o = 1;.      }. 
d8f0: 20 20 20 7d 0a 20 20 20 20 70 53 65 6c 65 63 74     }.    pSelect
d900: 20 3d 20 70 53 65 6c 65 63 74 2d 3e 70 4e 65 78   = pSelect->pNex
d910: 74 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d 30  t;.  }.  for(i=0
d920: 3b 20 69 3c 70 4f 72 64 65 72 42 79 2d 3e 6e 45  ; i<pOrderBy->nE
d930: 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69  xpr; i++){.    i
d940: 66 28 20 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69  f( pOrderBy->a[i
d950: 5d 2e 64 6f 6e 65 3d 3d 30 20 29 7b 0a 20 20 20  ].done==0 ){.   
d960: 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
d970: 73 67 28 70 50 61 72 73 65 2c 20 22 25 72 20 4f  sg(pParse, "%r O
d980: 52 44 45 52 20 42 59 20 74 65 72 6d 20 64 6f 65  RDER BY term doe
d990: 73 20 6e 6f 74 20 6d 61 74 63 68 20 61 6e 79 20  s not match any 
d9a0: 22 0a 20 20 20 20 20 20 20 20 20 20 20 20 22 63  ".            "c
d9b0: 6f 6c 75 6d 6e 20 69 6e 20 74 68 65 20 72 65 73  olumn in the res
d9c0: 75 6c 74 20 73 65 74 22 2c 20 69 2b 31 29 3b 0a  ult set", i+1);.
d9d0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a        return 1;.
d9e0: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
d9f0: 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47  rn 0;.}../*.** G
da00: 65 74 20 61 20 56 44 42 45 20 66 6f 72 20 74 68  et a VDBE for th
da10: 65 20 67 69 76 65 6e 20 70 61 72 73 65 72 20 63  e given parser c
da20: 6f 6e 74 65 78 74 2e 20 20 43 72 65 61 74 65 20  ontext.  Create 
da30: 61 20 6e 65 77 20 6f 6e 65 20 69 66 20 6e 65 63  a new one if nec
da40: 65 73 73 61 72 79 2e 0a 2a 2a 20 49 66 20 61 6e  essary..** If an
da50: 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 72   error occurs, r
da60: 65 74 75 72 6e 20 4e 55 4c 4c 20 61 6e 64 20 6c  eturn NULL and l
da70: 65 61 76 65 20 61 20 6d 65 73 73 61 67 65 20 69  eave a message i
da80: 6e 20 70 50 61 72 73 65 2e 0a 2a 2f 0a 56 64 62  n pParse..*/.Vdb
da90: 65 20 2a 73 71 6c 69 74 65 33 47 65 74 56 64 62  e *sqlite3GetVdb
daa0: 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 29  e(Parse *pParse)
dab0: 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50  {.  Vdbe *v = pP
dac0: 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69  arse->pVdbe;.  i
dad0: 66 28 20 76 3d 3d 30 20 29 7b 0a 20 20 20 20 76  f( v==0 ){.    v
dae0: 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65   = pParse->pVdbe
daf0: 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43 72   = sqlite3VdbeCr
db00: 65 61 74 65 28 70 50 61 72 73 65 2d 3e 64 62 29  eate(pParse->db)
db10: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 76  ;.  }.  return v
db20: 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70  ;.}.../*.** Comp
db30: 75 74 65 20 74 68 65 20 69 4c 69 6d 69 74 20 61  ute the iLimit a
db40: 6e 64 20 69 4f 66 66 73 65 74 20 66 69 65 6c 64  nd iOffset field
db50: 73 20 6f 66 20 74 68 65 20 53 45 4c 45 43 54 20  s of the SELECT 
db60: 62 61 73 65 64 20 6f 6e 20 74 68 65 0a 2a 2a 20  based on the.** 
db70: 70 4c 69 6d 69 74 20 61 6e 64 20 70 4f 66 66 73  pLimit and pOffs
db80: 65 74 20 65 78 70 72 65 73 73 69 6f 6e 73 2e 20  et expressions. 
db90: 20 70 4c 69 6d 69 74 20 61 6e 64 20 70 4f 66 66   pLimit and pOff
dba0: 73 65 74 20 68 6f 6c 64 20 74 68 65 20 65 78 70  set hold the exp
dbb0: 72 65 73 73 69 6f 6e 73 0a 2a 2a 20 74 68 61 74  ressions.** that
dbc0: 20 61 70 70 65 61 72 20 69 6e 20 74 68 65 20 6f   appear in the o
dbd0: 72 69 67 69 6e 61 6c 20 53 51 4c 20 73 74 61 74  riginal SQL stat
dbe0: 65 6d 65 6e 74 20 61 66 74 65 72 20 74 68 65 20  ement after the 
dbf0: 4c 49 4d 49 54 20 61 6e 64 20 4f 46 46 53 45 54  LIMIT and OFFSET
dc00: 0a 2a 2a 20 6b 65 79 77 6f 72 64 73 2e 20 20 4f  .** keywords.  O
dc10: 72 20 4e 55 4c 4c 20 69 66 20 74 68 6f 73 65 20  r NULL if those 
dc20: 6b 65 79 77 6f 72 64 73 20 61 72 65 20 6f 6d 69  keywords are omi
dc30: 74 74 65 64 2e 20 69 4c 69 6d 69 74 20 61 6e 64  tted. iLimit and
dc40: 20 69 4f 66 66 73 65 74 20 0a 2a 2a 20 61 72 65   iOffset .** are
dc50: 20 74 68 65 20 69 6e 74 65 67 65 72 20 6d 65 6d   the integer mem
dc60: 6f 72 79 20 72 65 67 69 73 74 65 72 20 6e 75 6d  ory register num
dc70: 62 65 72 73 20 66 6f 72 20 63 6f 75 6e 74 65 72  bers for counter
dc80: 73 20 75 73 65 64 20 74 6f 20 63 6f 6d 70 75 74  s used to comput
dc90: 65 20 0a 2a 2a 20 74 68 65 20 6c 69 6d 69 74 20  e .** the limit 
dca0: 61 6e 64 20 6f 66 66 73 65 74 2e 20 20 49 66 20  and offset.  If 
dcb0: 74 68 65 72 65 20 69 73 20 6e 6f 20 6c 69 6d 69  there is no limi
dcc0: 74 20 61 6e 64 2f 6f 72 20 6f 66 66 73 65 74 2c  t and/or offset,
dcd0: 20 74 68 65 6e 20 0a 2a 2a 20 69 4c 69 6d 69 74   then .** iLimit
dce0: 20 61 6e 64 20 69 4f 66 66 73 65 74 20 61 72 65   and iOffset are
dcf0: 20 6e 65 67 61 74 69 76 65 2e 0a 2a 2a 0a 2a 2a   negative..**.**
dd00: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 63 68   This routine ch
dd10: 61 6e 67 65 73 20 74 68 65 20 76 61 6c 75 65 73  anges the values
dd20: 20 6f 66 20 69 4c 69 6d 69 74 20 61 6e 64 20 69   of iLimit and i
dd30: 4f 66 66 73 65 74 20 6f 6e 6c 79 20 69 66 0a 2a  Offset only if.*
dd40: 2a 20 61 20 6c 69 6d 69 74 20 6f 72 20 6f 66 66  * a limit or off
dd50: 73 65 74 20 69 73 20 64 65 66 69 6e 65 64 20 62  set is defined b
dd60: 79 20 70 4c 69 6d 69 74 20 61 6e 64 20 70 4f 66  y pLimit and pOf
dd70: 66 73 65 74 2e 20 20 69 4c 69 6d 69 74 20 61 6e  fset.  iLimit an
dd80: 64 0a 2a 2a 20 69 4f 66 66 73 65 74 20 73 68 6f  d.** iOffset sho
dd90: 75 6c 64 20 68 61 76 65 20 62 65 65 6e 20 70 72  uld have been pr
dda0: 65 73 65 74 20 74 6f 20 61 70 70 72 6f 70 72 69  eset to appropri
ddb0: 61 74 65 20 64 65 66 61 75 6c 74 20 76 61 6c 75  ate default valu
ddc0: 65 73 0a 2a 2a 20 28 75 73 75 61 6c 6c 79 20 62  es.** (usually b
ddd0: 75 74 20 6e 6f 74 20 61 6c 77 61 79 73 20 2d 31  ut not always -1
dde0: 29 20 70 72 69 6f 72 20 74 6f 20 63 61 6c 6c 69  ) prior to calli
ddf0: 6e 67 20 74 68 69 73 20 72 6f 75 74 69 6e 65 2e  ng this routine.
de00: 0a 2a 2a 20 4f 6e 6c 79 20 69 66 20 70 4c 69 6d  .** Only if pLim
de10: 69 74 21 3d 30 20 6f 72 20 70 4f 66 66 73 65 74  it!=0 or pOffset
de20: 21 3d 30 20 64 6f 20 74 68 65 20 6c 69 6d 69 74  !=0 do the limit
de30: 20 72 65 67 69 73 74 65 72 73 20 67 65 74 0a 2a   registers get.*
de40: 2a 20 72 65 64 65 66 69 6e 65 64 2e 20 20 54 68  * redefined.  Th
de50: 65 20 55 4e 49 4f 4e 20 41 4c 4c 20 6f 70 65 72  e UNION ALL oper
de60: 61 74 6f 72 20 75 73 65 73 20 74 68 69 73 20 70  ator uses this p
de70: 72 6f 70 65 72 74 79 20 74 6f 20 66 6f 72 63 65  roperty to force
de80: 0a 2a 2a 20 74 68 65 20 72 65 75 73 65 20 6f 66  .** the reuse of
de90: 20 74 68 65 20 73 61 6d 65 20 6c 69 6d 69 74 20   the same limit 
dea0: 61 6e 64 20 6f 66 66 73 65 74 20 72 65 67 69 73  and offset regis
deb0: 74 65 72 73 20 61 63 72 6f 73 73 20 6d 75 6c 74  ters across mult
dec0: 69 70 6c 65 0a 2a 2a 20 53 45 4c 45 43 54 20 73  iple.** SELECT s
ded0: 74 61 74 65 6d 65 6e 74 73 2e 0a 2a 2f 0a 73 74  tatements..*/.st
dee0: 61 74 69 63 20 76 6f 69 64 20 63 6f 6d 70 75 74  atic void comput
def0: 65 4c 69 6d 69 74 52 65 67 69 73 74 65 72 73 28  eLimitRegisters(
df00: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 53  Parse *pParse, S
df10: 65 6c 65 63 74 20 2a 70 2c 20 69 6e 74 20 69 42  elect *p, int iB
df20: 72 65 61 6b 29 7b 0a 20 20 56 64 62 65 20 2a 76  reak){.  Vdbe *v
df30: 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69 4c 69 6d   = 0;.  int iLim
df40: 69 74 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69 4f  it = 0;.  int iO
df50: 66 66 73 65 74 3b 0a 20 20 69 6e 74 20 61 64 64  ffset;.  int add
df60: 72 31 2c 20 61 64 64 72 32 3b 0a 0a 20 20 2f 2a  r1, addr2;..  /*
df70: 20 0a 20 20 2a 2a 20 22 4c 49 4d 49 54 20 2d 31   .  ** "LIMIT -1
df80: 22 20 61 6c 77 61 79 73 20 73 68 6f 77 73 20 61  " always shows a
df90: 6c 6c 20 72 6f 77 73 2e 20 20 54 68 65 72 65 20  ll rows.  There 
dfa0: 69 73 20 73 6f 6d 65 0a 20 20 2a 2a 20 63 6f 6e  is some.  ** con
dfb0: 74 72 61 76 65 72 73 79 20 61 62 6f 75 74 20 77  traversy about w
dfc0: 68 61 74 20 74 68 65 20 63 6f 72 72 65 63 74 20  hat the correct 
dfd0: 62 65 68 61 76 69 6f 72 20 73 68 6f 75 6c 64 20  behavior should 
dfe0: 62 65 2e 0a 20 20 2a 2a 20 54 68 65 20 63 75 72  be..  ** The cur
dff0: 72 65 6e 74 20 69 6d 70 6c 65 6d 65 6e 74 61 74  rent implementat
e000: 69 6f 6e 20 69 6e 74 65 72 70 72 65 74 73 20 22  ion interprets "
e010: 4c 49 4d 49 54 20 30 22 20 74 6f 20 6d 65 61 6e  LIMIT 0" to mean
e020: 0a 20 20 2a 2a 20 6e 6f 20 72 6f 77 73 2e 0a 20  .  ** no rows.. 
e030: 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 70 4c 69   */.  if( p->pLi
e040: 6d 69 74 20 29 7b 0a 20 20 20 20 70 2d 3e 69 4c  mit ){.    p->iL
e050: 69 6d 69 74 20 3d 20 69 4c 69 6d 69 74 20 3d 20  imit = iLimit = 
e060: 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a  ++pParse->nMem;.
e070: 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d      pParse->nMem
e080: 2b 2b 3b 0a 20 20 20 20 76 20 3d 20 73 71 6c 69  ++;.    v = sqli
e090: 74 65 33 47 65 74 56 64 62 65 28 70 50 61 72 73  te3GetVdbe(pPars
e0a0: 65 29 3b 0a 20 20 20 20 69 66 28 20 76 3d 3d 30  e);.    if( v==0
e0b0: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 73   ) return;.    s
e0c0: 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28 70  qlite3ExprCode(p
e0d0: 50 61 72 73 65 2c 20 70 2d 3e 70 4c 69 6d 69 74  Parse, p->pLimit
e0e0: 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  , 0);.    sqlite
e0f0: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
e100: 50 5f 4d 75 73 74 42 65 49 6e 74 2c 20 30 2c 20  P_MustBeInt, 0, 
e110: 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  0);.    sqlite3V
e120: 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
e130: 4d 65 6d 53 74 6f 72 65 2c 20 69 4c 69 6d 69 74  MemStore, iLimit
e140: 2c 20 31 29 3b 0a 20 20 20 20 56 64 62 65 43 6f  , 1);.    VdbeCo
e150: 6d 6d 65 6e 74 28 28 76 2c 20 22 4c 49 4d 49 54  mment((v, "LIMIT
e160: 20 63 6f 75 6e 74 65 72 22 29 29 3b 0a 20 20 20   counter"));.   
e170: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
e180: 70 32 28 76 2c 20 4f 50 5f 49 66 4d 65 6d 5a 65  p2(v, OP_IfMemZe
e190: 72 6f 2c 20 69 4c 69 6d 69 74 2c 20 69 42 72 65  ro, iLimit, iBre
e1a0: 61 6b 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  ak);.    sqlite3
e1b0: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
e1c0: 5f 4d 65 6d 4c 6f 61 64 2c 20 69 4c 69 6d 69 74  _MemLoad, iLimit
e1d0: 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  , 0);.  }.  if( 
e1e0: 70 2d 3e 70 4f 66 66 73 65 74 20 29 7b 0a 20 20  p->pOffset ){.  
e1f0: 20 20 70 2d 3e 69 4f 66 66 73 65 74 20 3d 20 69    p->iOffset = i
e200: 4f 66 66 73 65 74 20 3d 20 2b 2b 70 50 61 72 73  Offset = ++pPars
e210: 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 76 20 3d  e->nMem;.    v =
e220: 20 73 71 6c 69 74 65 33 47 65 74 56 64 62 65 28   sqlite3GetVdbe(
e230: 70 50 61 72 73 65 29 3b 0a 20 20 20 20 69 66 28  pParse);.    if(
e240: 20 76 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a   v==0 ) return;.
e250: 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
e260: 6f 64 65 28 70 50 61 72 73 65 2c 20 70 2d 3e 70  ode(pParse, p->p
e270: 4f 66 66 73 65 74 2c 20 30 29 3b 0a 20 20 20 20  Offset, 0);.    
e280: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
e290: 32 28 76 2c 20 4f 50 5f 4d 75 73 74 42 65 49 6e  2(v, OP_MustBeIn
e2a0: 74 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 73 71  t, 0, 0);.    sq
e2b0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
e2c0: 76 2c 20 4f 50 5f 4d 65 6d 53 74 6f 72 65 2c 20  v, OP_MemStore, 
e2d0: 69 4f 66 66 73 65 74 2c 20 70 2d 3e 70 4c 69 6d  iOffset, p->pLim
e2e0: 69 74 3d 3d 30 29 3b 0a 20 20 20 20 56 64 62 65  it==0);.    Vdbe
e2f0: 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 4f 46 46  Comment((v, "OFF
e300: 53 45 54 20 63 6f 75 6e 74 65 72 22 29 29 3b 0a  SET counter"));.
e310: 20 20 20 20 61 64 64 72 31 20 3d 20 73 71 6c 69      addr1 = sqli
e320: 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
e330: 20 4f 50 5f 49 66 4d 65 6d 50 6f 73 2c 20 69 4f   OP_IfMemPos, iO
e340: 66 66 73 65 74 2c 20 30 29 3b 0a 20 20 20 20 73  ffset, 0);.    s
e350: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
e360: 28 76 2c 20 4f 50 5f 50 6f 70 2c 20 31 2c 20 30  (v, OP_Pop, 1, 0
e370: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
e380: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49  beAddOp2(v, OP_I
e390: 6e 74 65 67 65 72 2c 20 30 2c 20 30 29 3b 0a 20  nteger, 0, 0);. 
e3a0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75     sqlite3VdbeJu
e3b0: 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72 31 29  mpHere(v, addr1)
e3c0: 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 70 4c 69  ;.    if( p->pLi
e3d0: 6d 69 74 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  mit ){.      sql
e3e0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
e3f0: 2c 20 4f 50 5f 41 64 64 2c 20 30 2c 20 30 29 3b  , OP_Add, 0, 0);
e400: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28  .    }.  }.  if(
e410: 20 70 2d 3e 70 4c 69 6d 69 74 20 29 7b 0a 20 20   p->pLimit ){.  
e420: 20 20 61 64 64 72 31 20 3d 20 73 71 6c 69 74 65    addr1 = sqlite
e430: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
e440: 50 5f 49 66 4d 65 6d 50 6f 73 2c 20 69 4c 69 6d  P_IfMemPos, iLim
e450: 69 74 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69  it, 0);.    sqli
e460: 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
e470: 20 4f 50 5f 50 6f 70 2c 20 31 2c 20 30 29 3b 0a   OP_Pop, 1, 0);.
e480: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
e490: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65  ddOp2(v, OP_Inte
e4a0: 67 65 72 2c 20 2d 31 2c 20 69 4c 69 6d 69 74 2b  ger, -1, iLimit+
e4b0: 31 29 3b 0a 20 20 20 20 61 64 64 72 32 20 3d 20  1);.    addr2 = 
e4c0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
e4d0: 32 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c  2(v, OP_Goto, 0,
e4e0: 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33   0);.    sqlite3
e4f0: 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20  VdbeJumpHere(v, 
e500: 61 64 64 72 31 29 3b 0a 20 20 20 20 73 71 6c 69  addr1);.    sqli
e510: 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
e520: 20 4f 50 5f 4d 65 6d 53 74 6f 72 65 2c 20 69 4c   OP_MemStore, iL
e530: 69 6d 69 74 2b 31 2c 20 31 29 3b 0a 20 20 20 20  imit+1, 1);.    
e540: 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20  VdbeComment((v, 
e550: 22 4c 49 4d 49 54 2b 4f 46 46 53 45 54 22 29 29  "LIMIT+OFFSET"))
e560: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
e570: 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64  eJumpHere(v, add
e580: 72 32 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  r2);.  }.}../*.*
e590: 2a 20 41 6c 6c 6f 63 61 74 65 20 61 20 76 69 72  * Allocate a vir
e5a0: 74 75 61 6c 20 69 6e 64 65 78 20 74 6f 20 75 73  tual index to us
e5b0: 65 20 66 6f 72 20 73 6f 72 74 69 6e 67 2e 0a 2a  e for sorting..*
e5c0: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63 72  /.static void cr
e5d0: 65 61 74 65 53 6f 72 74 69 6e 67 49 6e 64 65 78  eateSortingIndex
e5e0: 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
e5f0: 53 65 6c 65 63 74 20 2a 70 2c 20 45 78 70 72 4c  Select *p, ExprL
e600: 69 73 74 20 2a 70 4f 72 64 65 72 42 79 29 7b 0a  ist *pOrderBy){.
e610: 20 20 69 66 28 20 70 4f 72 64 65 72 42 79 20 29    if( pOrderBy )
e620: 7b 0a 20 20 20 20 69 6e 74 20 61 64 64 72 3b 0a  {.    int addr;.
e630: 20 20 20 20 61 73 73 65 72 74 28 20 70 4f 72 64      assert( pOrd
e640: 65 72 42 79 2d 3e 69 45 43 75 72 73 6f 72 3d 3d  erBy->iECursor==
e650: 30 20 29 3b 0a 20 20 20 20 70 4f 72 64 65 72 42  0 );.    pOrderB
e660: 79 2d 3e 69 45 43 75 72 73 6f 72 20 3d 20 70 50  y->iECursor = pP
e670: 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20  arse->nTab++;.  
e680: 20 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65 33    addr = sqlite3
e690: 56 64 62 65 41 64 64 4f 70 32 28 70 50 61 72 73  VdbeAddOp2(pPars
e6a0: 65 2d 3e 70 56 64 62 65 2c 20 4f 50 5f 4f 70 65  e->pVdbe, OP_Ope
e6b0: 6e 45 70 68 65 6d 65 72 61 6c 2c 0a 20 20 20 20  nEphemeral,.    
e6c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e6d0: 20 20 20 20 20 20 20 20 70 4f 72 64 65 72 42 79          pOrderBy
e6e0: 2d 3e 69 45 43 75 72 73 6f 72 2c 20 70 4f 72 64  ->iECursor, pOrd
e6f0: 65 72 42 79 2d 3e 6e 45 78 70 72 2b 31 29 3b 0a  erBy->nExpr+1);.
e700: 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 61      assert( p->a
e710: 64 64 72 4f 70 65 6e 45 70 68 6d 5b 32 5d 20 3d  ddrOpenEphm[2] =
e720: 3d 20 2d 31 20 29 3b 0a 20 20 20 20 70 2d 3e 61  = -1 );.    p->a
e730: 64 64 72 4f 70 65 6e 45 70 68 6d 5b 32 5d 20 3d  ddrOpenEphm[2] =
e740: 20 61 64 64 72 3b 0a 20 20 7d 0a 7d 0a 0a 23 69   addr;.  }.}..#i
e750: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
e760: 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45 43  T_COMPOUND_SELEC
e770: 54 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  T./*.** Return t
e780: 68 65 20 61 70 70 72 6f 70 72 69 61 74 65 20 63  he appropriate c
e790: 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63  ollating sequenc
e7a0: 65 20 66 6f 72 20 74 68 65 20 69 43 6f 6c 2d 74  e for the iCol-t
e7b0: 68 20 63 6f 6c 75 6d 6e 20 6f 66 0a 2a 2a 20 74  h column of.** t
e7c0: 68 65 20 72 65 73 75 6c 74 20 73 65 74 20 66 6f  he result set fo
e7d0: 72 20 74 68 65 20 63 6f 6d 70 6f 75 6e 64 2d 73  r the compound-s
e7e0: 65 6c 65 63 74 20 73 74 61 74 65 6d 65 6e 74 20  elect statement 
e7f0: 22 70 22 2e 20 20 52 65 74 75 72 6e 20 4e 55 4c  "p".  Return NUL
e800: 4c 20 69 66 0a 2a 2a 20 74 68 65 20 63 6f 6c 75  L if.** the colu
e810: 6d 6e 20 68 61 73 20 6e 6f 20 64 65 66 61 75 6c  mn has no defaul
e820: 74 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75  t collating sequ
e830: 65 6e 63 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  ence..**.** The 
e840: 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e  collating sequen
e850: 63 65 20 66 6f 72 20 74 68 65 20 63 6f 6d 70 6f  ce for the compo
e860: 75 6e 64 20 73 65 6c 65 63 74 20 69 73 20 74 61  und select is ta
e870: 6b 65 6e 20 66 72 6f 6d 20 74 68 65 0a 2a 2a 20  ken from the.** 
e880: 6c 65 66 74 2d 6d 6f 73 74 20 74 65 72 6d 20 6f  left-most term o
e890: 66 20 74 68 65 20 73 65 6c 65 63 74 20 74 68 61  f the select tha
e8a0: 74 20 68 61 73 20 61 20 63 6f 6c 6c 61 74 69 6e  t has a collatin
e8b0: 67 20 73 65 71 75 65 6e 63 65 2e 0a 2a 2f 0a 73  g sequence..*/.s
e8c0: 74 61 74 69 63 20 43 6f 6c 6c 53 65 71 20 2a 6d  tatic CollSeq *m
e8d0: 75 6c 74 69 53 65 6c 65 63 74 43 6f 6c 6c 53 65  ultiSelectCollSe
e8e0: 71 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  q(Parse *pParse,
e8f0: 20 53 65 6c 65 63 74 20 2a 70 2c 20 69 6e 74 20   Select *p, int 
e900: 69 43 6f 6c 29 7b 0a 20 20 43 6f 6c 6c 53 65 71  iCol){.  CollSeq
e910: 20 2a 70 52 65 74 3b 0a 20 20 69 66 28 20 70 2d   *pRet;.  if( p-
e920: 3e 70 50 72 69 6f 72 20 29 7b 0a 20 20 20 20 70  >pPrior ){.    p
e930: 52 65 74 20 3d 20 6d 75 6c 74 69 53 65 6c 65 63  Ret = multiSelec
e940: 74 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c  tCollSeq(pParse,
e950: 20 70 2d 3e 70 50 72 69 6f 72 2c 20 69 43 6f 6c   p->pPrior, iCol
e960: 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
e970: 70 52 65 74 20 3d 20 30 3b 0a 20 20 7d 0a 20 20  pRet = 0;.  }.  
e980: 69 66 28 20 70 52 65 74 3d 3d 30 20 29 7b 0a 20  if( pRet==0 ){. 
e990: 20 20 20 70 52 65 74 20 3d 20 73 71 6c 69 74 65     pRet = sqlite
e9a0: 33 45 78 70 72 43 6f 6c 6c 53 65 71 28 70 50 61  3ExprCollSeq(pPa
e9b0: 72 73 65 2c 20 70 2d 3e 70 45 4c 69 73 74 2d 3e  rse, p->pEList->
e9c0: 61 5b 69 43 6f 6c 5d 2e 70 45 78 70 72 29 3b 0a  a[iCol].pExpr);.
e9d0: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 52 65    }.  return pRe
e9e0: 74 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53  t;.}.#endif /* S
e9f0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f 4d 50 4f  QLITE_OMIT_COMPO
ea00: 55 4e 44 5f 53 45 4c 45 43 54 20 2a 2f 0a 0a 23  UND_SELECT */..#
ea10: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
ea20: 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45  IT_COMPOUND_SELE
ea30: 43 54 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  CT./*.** This ro
ea40: 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20  utine is called 
ea50: 74 6f 20 70 72 6f 63 65 73 73 20 61 20 71 75 65  to process a que
ea60: 72 79 20 74 68 61 74 20 69 73 20 72 65 61 6c 6c  ry that is reall
ea70: 79 20 74 68 65 20 75 6e 69 6f 6e 0a 2a 2a 20 6f  y the union.** o
ea80: 72 20 69 6e 74 65 72 73 65 63 74 69 6f 6e 20 6f  r intersection o
ea90: 66 20 74 77 6f 20 6f 72 20 6d 6f 72 65 20 73 65  f two or more se
eaa0: 70 61 72 61 74 65 20 71 75 65 72 69 65 73 2e 0a  parate queries..
eab0: 2a 2a 0a 2a 2a 20 22 70 22 20 70 6f 69 6e 74 73  **.** "p" points
eac0: 20 74 6f 20 74 68 65 20 72 69 67 68 74 2d 6d 6f   to the right-mo
ead0: 73 74 20 6f 66 20 74 68 65 20 74 77 6f 20 71 75  st of the two qu
eae0: 65 72 69 65 73 2e 20 20 74 68 65 20 71 75 65 72  eries.  the quer
eaf0: 79 20 6f 6e 20 74 68 65 0a 2a 2a 20 6c 65 66 74  y on the.** left
eb00: 20 69 73 20 70 2d 3e 70 50 72 69 6f 72 2e 20 20   is p->pPrior.  
eb10: 54 68 65 20 6c 65 66 74 20 71 75 65 72 79 20 63  The left query c
eb20: 6f 75 6c 64 20 61 6c 73 6f 20 62 65 20 61 20 63  ould also be a c
eb30: 6f 6d 70 6f 75 6e 64 20 71 75 65 72 79 0a 2a 2a  ompound query.**
eb40: 20 69 6e 20 77 68 69 63 68 20 63 61 73 65 20 74   in which case t
eb50: 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c  his routine will
eb60: 20 62 65 20 63 61 6c 6c 65 64 20 72 65 63 75 72   be called recur
eb70: 73 69 76 65 6c 79 2e 20 0a 2a 2a 0a 2a 2a 20 54  sively. .**.** T
eb80: 68 65 20 72 65 73 75 6c 74 73 20 6f 66 20 74 68  he results of th
eb90: 65 20 74 6f 74 61 6c 20 71 75 65 72 79 20 61 72  e total query ar
eba0: 65 20 74 6f 20 62 65 20 77 72 69 74 74 65 6e 20  e to be written 
ebb0: 69 6e 74 6f 20 61 20 64 65 73 74 69 6e 61 74 69  into a destinati
ebc0: 6f 6e 0a 2a 2a 20 6f 66 20 74 79 70 65 20 65 44  on.** of type eD
ebd0: 65 73 74 20 77 69 74 68 20 70 61 72 61 6d 65 74  est with paramet
ebe0: 65 72 20 69 50 61 72 6d 2e 0a 2a 2a 0a 2a 2a 20  er iParm..**.** 
ebf0: 45 78 61 6d 70 6c 65 20 31 3a 20 20 43 6f 6e 73  Example 1:  Cons
ec00: 69 64 65 72 20 61 20 74 68 72 65 65 2d 77 61 79  ider a three-way
ec10: 20 63 6f 6d 70 6f 75 6e 64 20 53 51 4c 20 73 74   compound SQL st
ec20: 61 74 65 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 20  atement..**.**  
ec30: 20 20 20 53 45 4c 45 43 54 20 61 20 46 52 4f 4d     SELECT a FROM
ec40: 20 74 31 20 55 4e 49 4f 4e 20 53 45 4c 45 43 54   t1 UNION SELECT
ec50: 20 62 20 46 52 4f 4d 20 74 32 20 55 4e 49 4f 4e   b FROM t2 UNION
ec60: 20 53 45 4c 45 43 54 20 63 20 46 52 4f 4d 20 74   SELECT c FROM t
ec70: 33 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 73 74 61  3.**.** This sta
ec80: 74 65 6d 65 6e 74 20 69 73 20 70 61 72 73 65 64  tement is parsed
ec90: 20 75 70 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a   up as follows:.
eca0: 2a 2a 0a 2a 2a 20 20 20 20 20 53 45 4c 45 43 54  **.**     SELECT
ecb0: 20 63 20 46 52 4f 4d 20 74 33 0a 2a 2a 20 20 20   c FROM t3.**   
ecc0: 20 20 20 7c 0a 2a 2a 20 20 20 20 20 20 60 2d 2d     |.**      `--
ecd0: 2d 2d 2d 3e 20 20 53 45 4c 45 43 54 20 62 20 46  --->  SELECT b F
ece0: 52 4f 4d 20 74 32 0a 2a 2a 20 20 20 20 20 20 20  ROM t2.**       
ecf0: 20 20 20 20 20 20 20 20 20 7c 0a 2a 2a 20 20 20           |.**   
ed00: 20 20 20 20 20 20 20 20 20 20 20 20 20 60 2d 2d               `--
ed10: 2d 2d 2d 2d 3e 20 20 53 45 4c 45 43 54 20 61 20  ---->  SELECT a 
ed20: 46 52 4f 4d 20 74 31 0a 2a 2a 0a 2a 2a 20 54 68  FROM t1.**.** Th
ed30: 65 20 61 72 72 6f 77 73 20 69 6e 20 74 68 65 20  e arrows in the 
ed40: 64 69 61 67 72 61 6d 20 61 62 6f 76 65 20 72 65  diagram above re
ed50: 70 72 65 73 65 6e 74 20 74 68 65 20 53 65 6c 65  present the Sele
ed60: 63 74 2e 70 50 72 69 6f 72 20 70 6f 69 6e 74 65  ct.pPrior pointe
ed70: 72 2e 0a 2a 2a 20 53 6f 20 69 66 20 74 68 69 73  r..** So if this
ed80: 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c   routine is call
ed90: 65 64 20 77 69 74 68 20 70 20 65 71 75 61 6c 20  ed with p equal 
eda0: 74 6f 20 74 68 65 20 74 33 20 71 75 65 72 79 2c  to the t3 query,
edb0: 20 74 68 65 6e 0a 2a 2a 20 70 50 72 69 6f 72 20   then.** pPrior 
edc0: 77 69 6c 6c 20 62 65 20 74 68 65 20 74 32 20 71  will be the t2 q
edd0: 75 65 72 79 2e 20 20 70 2d 3e 6f 70 20 77 69 6c  uery.  p->op wil
ede0: 6c 20 62 65 20 54 4b 5f 55 4e 49 4f 4e 20 69 6e  l be TK_UNION in
edf0: 20 74 68 69 73 20 63 61 73 65 2e 0a 2a 2a 0a 2a   this case..**.*
ee00: 2a 20 4e 6f 74 69 63 65 20 74 68 61 74 20 62 65  * Notice that be
ee10: 63 61 75 73 65 20 6f 66 20 74 68 65 20 77 61 79  cause of the way
ee20: 20 53 51 4c 69 74 65 20 70 61 72 73 65 73 20 63   SQLite parses c
ee30: 6f 6d 70 6f 75 6e 64 20 53 45 4c 45 43 54 73 2c  ompound SELECTs,
ee40: 20 74 68 65 0a 2a 2a 20 69 6e 64 69 76 69 64 75   the.** individu
ee50: 61 6c 20 73 65 6c 65 63 74 73 20 61 6c 77 61 79  al selects alway
ee60: 73 20 67 72 6f 75 70 20 66 72 6f 6d 20 6c 65 66  s group from lef
ee70: 74 20 74 6f 20 72 69 67 68 74 2e 0a 2a 2f 0a 73  t to right..*/.s
ee80: 74 61 74 69 63 20 69 6e 74 20 6d 75 6c 74 69 53  tatic int multiS
ee90: 65 6c 65 63 74 28 0a 20 20 50 61 72 73 65 20 2a  elect(.  Parse *
eea0: 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 2f  pParse,        /
eeb0: 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78  * Parsing contex
eec0: 74 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70  t */.  Select *p
eed0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ,            /* 
eee0: 54 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 20 6f  The right-most o
eef0: 66 20 53 45 4c 45 43 54 73 20 74 6f 20 62 65 20  f SELECTs to be 
ef00: 63 6f 64 65 64 20 2a 2f 0a 20 20 53 65 6c 65 63  coded */.  Selec
ef10: 74 44 65 73 74 20 2a 70 44 65 73 74 2c 20 20 20  tDest *pDest,   
ef20: 20 2f 2a 20 57 68 61 74 20 74 6f 20 64 6f 20 77   /* What to do w
ef30: 69 74 68 20 71 75 65 72 79 20 72 65 73 75 6c 74  ith query result
ef40: 73 20 2a 2f 0a 20 20 63 68 61 72 20 2a 61 66 66  s */.  char *aff
ef50: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
ef60: 49 66 20 65 44 65 73 74 20 69 73 20 53 52 54 5f  If eDest is SRT_
ef70: 55 6e 69 6f 6e 2c 20 74 68 65 20 61 66 66 69 6e  Union, the affin
ef80: 69 74 79 20 73 74 72 69 6e 67 20 2a 2f 0a 29 7b  ity string */.){
ef90: 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
efa0: 54 45 5f 4f 4b 3b 20 20 20 2f 2a 20 53 75 63 63  TE_OK;   /* Succ
efb0: 65 73 73 20 63 6f 64 65 20 66 72 6f 6d 20 61 20  ess code from a 
efc0: 73 75 62 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20  subroutine */.  
efd0: 53 65 6c 65 63 74 20 2a 70 50 72 69 6f 72 3b 20  Select *pPrior; 
efe0: 20 20 20 20 20 20 2f 2a 20 41 6e 6f 74 68 65 72        /* Another
eff0: 20 53 45 4c 45 43 54 20 69 6d 6d 65 64 69 61 74   SELECT immediat
f000: 65 6c 79 20 74 6f 20 6f 75 72 20 6c 65 66 74 20  ely to our left 
f010: 2a 2f 0a 20 20 56 64 62 65 20 2a 76 3b 20 20 20  */.  Vdbe *v;   
f020: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 47 65             /* Ge
f030: 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20 74  nerate code to t
f040: 68 69 73 20 56 44 42 45 20 2a 2f 0a 20 20 69 6e  his VDBE */.  in
f050: 74 20 6e 43 6f 6c 3b 20 20 20 20 20 20 20 20 20  t nCol;         
f060: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
f070: 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20   columns in the 
f080: 72 65 73 75 6c 74 20 73 65 74 20 2a 2f 0a 20 20  result set */.  
f090: 45 78 70 72 4c 69 73 74 20 2a 70 4f 72 64 65 72  ExprList *pOrder
f0a0: 42 79 3b 20 20 20 2f 2a 20 54 68 65 20 4f 52 44  By;   /* The ORD
f0b0: 45 52 20 42 59 20 63 6c 61 75 73 65 20 6f 6e 20  ER BY clause on 
f0c0: 70 20 2a 2f 0a 20 20 69 6e 74 20 61 53 65 74 50  p */.  int aSetP
f0d0: 32 5b 32 5d 3b 20 20 20 20 20 20 20 20 2f 2a 20  2[2];        /* 
f0e0: 53 65 74 20 50 32 20 76 61 6c 75 65 20 6f 66 20  Set P2 value of 
f0f0: 74 68 65 73 65 20 6f 70 20 74 6f 20 6e 75 6d 62  these op to numb
f100: 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 2a 2f  er of columns */
f110: 0a 20 20 69 6e 74 20 6e 53 65 74 50 32 20 3d 20  .  int nSetP2 = 
f120: 30 3b 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62  0;       /* Numb
f130: 65 72 20 6f 66 20 73 6c 6f 74 73 20 69 6e 20 61  er of slots in a
f140: 53 65 74 50 32 5b 5d 20 75 73 65 64 20 2a 2f 0a  SetP2[] used */.
f150: 0a 20 20 53 65 6c 65 63 74 44 65 73 74 20 64 65  .  SelectDest de
f160: 73 74 3b 0a 20 20 64 65 73 74 2e 65 44 65 73 74  st;.  dest.eDest
f170: 20 3d 20 70 44 65 73 74 2d 3e 65 44 65 73 74 3b   = pDest->eDest;
f180: 0a 20 20 64 65 73 74 2e 69 50 61 72 6d 20 3d 20  .  dest.iParm = 
f190: 70 44 65 73 74 2d 3e 69 50 61 72 6d 3b 0a 20 20  pDest->iParm;.  
f1a0: 64 65 73 74 2e 61 66 66 69 6e 69 74 79 20 3d 20  dest.affinity = 
f1b0: 70 44 65 73 74 2d 3e 61 66 66 69 6e 69 74 79 3b  pDest->affinity;
f1c0: 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65  ..  /* Make sure
f1d0: 20 74 68 65 72 65 20 69 73 20 6e 6f 20 4f 52 44   there is no ORD
f1e0: 45 52 20 42 59 20 6f 72 20 4c 49 4d 49 54 20 63  ER BY or LIMIT c
f1f0: 6c 61 75 73 65 20 6f 6e 20 70 72 69 6f 72 20 53  lause on prior S
f200: 45 4c 45 43 54 73 2e 20 20 4f 6e 6c 79 0a 20 20  ELECTs.  Only.  
f210: 2a 2a 20 74 68 65 20 6c 61 73 74 20 28 72 69 67  ** the last (rig
f220: 68 74 2d 6d 6f 73 74 29 20 53 45 4c 45 43 54 20  ht-most) SELECT 
f230: 69 6e 20 74 68 65 20 73 65 72 69 65 73 20 6d 61  in the series ma
f240: 79 20 68 61 76 65 20 61 6e 20 4f 52 44 45 52 20  y have an ORDER 
f250: 42 59 20 6f 72 20 4c 49 4d 49 54 2e 0a 20 20 2a  BY or LIMIT..  *
f260: 2f 0a 20 20 69 66 28 20 70 3d 3d 30 20 7c 7c 20  /.  if( p==0 || 
f270: 70 2d 3e 70 50 72 69 6f 72 3d 3d 30 20 29 7b 0a  p->pPrior==0 ){.
f280: 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20      rc = 1;.    
f290: 67 6f 74 6f 20 6d 75 6c 74 69 5f 73 65 6c 65 63  goto multi_selec
f2a0: 74 5f 65 6e 64 3b 0a 20 20 7d 0a 20 20 70 50 72  t_end;.  }.  pPr
f2b0: 69 6f 72 20 3d 20 70 2d 3e 70 50 72 69 6f 72 3b  ior = p->pPrior;
f2c0: 0a 20 20 61 73 73 65 72 74 28 20 70 50 72 69 6f  .  assert( pPrio
f2d0: 72 2d 3e 70 52 69 67 68 74 6d 6f 73 74 21 3d 70  r->pRightmost!=p
f2e0: 50 72 69 6f 72 20 29 3b 0a 20 20 61 73 73 65 72  Prior );.  asser
f2f0: 74 28 20 70 50 72 69 6f 72 2d 3e 70 52 69 67 68  t( pPrior->pRigh
f300: 74 6d 6f 73 74 3d 3d 70 2d 3e 70 52 69 67 68 74  tmost==p->pRight
f310: 6d 6f 73 74 20 29 3b 0a 20 20 69 66 28 20 70 50  most );.  if( pP
f320: 72 69 6f 72 2d 3e 70 4f 72 64 65 72 42 79 20 29  rior->pOrderBy )
f330: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72  {.    sqlite3Err
f340: 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 22 4f 52  orMsg(pParse,"OR
f350: 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 73 68  DER BY clause sh
f360: 6f 75 6c 64 20 63 6f 6d 65 20 61 66 74 65 72 20  ould come after 
f370: 25 73 20 6e 6f 74 20 62 65 66 6f 72 65 22 2c 0a  %s not before",.
f380: 20 20 20 20 20 20 73 65 6c 65 63 74 4f 70 4e 61        selectOpNa
f390: 6d 65 28 70 2d 3e 6f 70 29 29 3b 0a 20 20 20 20  me(p->op));.    
f3a0: 72 63 20 3d 20 31 3b 0a 20 20 20 20 67 6f 74 6f  rc = 1;.    goto
f3b0: 20 6d 75 6c 74 69 5f 73 65 6c 65 63 74 5f 65 6e   multi_select_en
f3c0: 64 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 72  d;.  }.  if( pPr
f3d0: 69 6f 72 2d 3e 70 4c 69 6d 69 74 20 29 7b 0a 20  ior->pLimit ){. 
f3e0: 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
f3f0: 73 67 28 70 50 61 72 73 65 2c 22 4c 49 4d 49 54  sg(pParse,"LIMIT
f400: 20 63 6c 61 75 73 65 20 73 68 6f 75 6c 64 20 63   clause should c
f410: 6f 6d 65 20 61 66 74 65 72 20 25 73 20 6e 6f 74  ome after %s not
f420: 20 62 65 66 6f 72 65 22 2c 0a 20 20 20 20 20 20   before",.      
f430: 73 65 6c 65 63 74 4f 70 4e 61 6d 65 28 70 2d 3e  selectOpName(p->
f440: 6f 70 29 29 3b 0a 20 20 20 20 72 63 20 3d 20 31  op));.    rc = 1
f450: 3b 0a 20 20 20 20 67 6f 74 6f 20 6d 75 6c 74 69  ;.    goto multi
f460: 5f 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 7d  _select_end;.  }
f470: 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65  ..  /* Make sure
f480: 20 77 65 20 68 61 76 65 20 61 20 76 61 6c 69 64   we have a valid
f490: 20 71 75 65 72 79 20 65 6e 67 69 6e 65 2e 20 20   query engine.  
f4a0: 49 66 20 6e 6f 74 2c 20 63 72 65 61 74 65 20 61  If not, create a
f4b0: 20 6e 65 77 20 6f 6e 65 2e 0a 20 20 2a 2f 0a 20   new one..  */. 
f4c0: 20 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56   v = sqlite3GetV
f4d0: 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20 69  dbe(pParse);.  i
f4e0: 66 28 20 76 3d 3d 30 20 29 7b 0a 20 20 20 20 72  f( v==0 ){.    r
f4f0: 63 20 3d 20 31 3b 0a 20 20 20 20 67 6f 74 6f 20  c = 1;.    goto 
f500: 6d 75 6c 74 69 5f 73 65 6c 65 63 74 5f 65 6e 64  multi_select_end
f510: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 72 65 61  ;.  }..  /* Crea
f520: 74 65 20 74 68 65 20 64 65 73 74 69 6e 61 74 69  te the destinati
f530: 6f 6e 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62  on temporary tab
f540: 6c 65 20 69 66 20 6e 65 63 65 73 73 61 72 79 0a  le if necessary.
f550: 20 20 2a 2f 0a 20 20 69 66 28 20 64 65 73 74 2e    */.  if( dest.
f560: 65 44 65 73 74 3d 3d 53 52 54 5f 45 70 68 65 6d  eDest==SRT_Ephem
f570: 54 61 62 20 29 7b 0a 20 20 20 20 61 73 73 65 72  Tab ){.    asser
f580: 74 28 20 70 2d 3e 70 45 4c 69 73 74 20 29 3b 0a  t( p->pEList );.
f590: 20 20 20 20 61 73 73 65 72 74 28 20 6e 53 65 74      assert( nSet
f5a0: 50 32 3c 73 69 7a 65 6f 66 28 61 53 65 74 50 32  P2<sizeof(aSetP2
f5b0: 29 2f 73 69 7a 65 6f 66 28 61 53 65 74 50 32 5b  )/sizeof(aSetP2[
f5c0: 30 5d 29 20 29 3b 0a 20 20 20 20 61 53 65 74 50  0]) );.    aSetP
f5d0: 32 5b 6e 53 65 74 50 32 2b 2b 5d 20 3d 20 73 71  2[nSetP2++] = sq
f5e0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
f5f0: 76 2c 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65  v, OP_OpenEpheme
f600: 72 61 6c 2c 20 64 65 73 74 2e 69 50 61 72 6d 2c  ral, dest.iParm,
f610: 20 30 29 3b 0a 20 20 20 20 64 65 73 74 2e 65 44   0);.    dest.eD
f620: 65 73 74 20 3d 20 53 52 54 5f 54 61 62 6c 65 3b  est = SRT_Table;
f630: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 47 65 6e 65 72  .  }..  /* Gener
f640: 61 74 65 20 63 6f 64 65 20 66 6f 72 20 74 68 65  ate code for the
f650: 20 6c 65 66 74 20 61 6e 64 20 72 69 67 68 74 20   left and right 
f660: 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
f670: 73 2e 0a 20 20 2a 2f 0a 20 20 70 4f 72 64 65 72  s..  */.  pOrder
f680: 42 79 20 3d 20 70 2d 3e 70 4f 72 64 65 72 42 79  By = p->pOrderBy
f690: 3b 0a 20 20 73 77 69 74 63 68 28 20 70 2d 3e 6f  ;.  switch( p->o
f6a0: 70 20 29 7b 0a 20 20 20 20 63 61 73 65 20 54 4b  p ){.    case TK
f6b0: 5f 41 4c 4c 3a 20 7b 0a 20 20 20 20 20 20 69 66  _ALL: {.      if
f6c0: 28 20 70 4f 72 64 65 72 42 79 3d 3d 30 20 29 7b  ( pOrderBy==0 ){
f6d0: 0a 20 20 20 20 20 20 20 20 69 6e 74 20 61 64 64  .        int add
f6e0: 72 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 61  r = 0;.        a
f6f0: 73 73 65 72 74 28 20 21 70 50 72 69 6f 72 2d 3e  ssert( !pPrior->
f700: 70 4c 69 6d 69 74 20 29 3b 0a 20 20 20 20 20 20  pLimit );.      
f710: 20 20 70 50 72 69 6f 72 2d 3e 70 4c 69 6d 69 74    pPrior->pLimit
f720: 20 3d 20 70 2d 3e 70 4c 69 6d 69 74 3b 0a 20 20   = p->pLimit;.  
f730: 20 20 20 20 20 20 70 50 72 69 6f 72 2d 3e 70 4f        pPrior->pO
f740: 66 66 73 65 74 20 3d 20 70 2d 3e 70 4f 66 66 73  ffset = p->pOffs
f750: 65 74 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d  et;.        rc =
f760: 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28 70   sqlite3Select(p
f770: 50 61 72 73 65 2c 20 70 50 72 69 6f 72 2c 20 26  Parse, pPrior, &
f780: 64 65 73 74 2c 20 30 2c 20 30 2c 20 30 2c 20 61  dest, 0, 0, 0, a
f790: 66 66 29 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e  ff);.        p->
f7a0: 70 4c 69 6d 69 74 20 3d 20 30 3b 0a 20 20 20 20  pLimit = 0;.    
f7b0: 20 20 20 20 70 2d 3e 70 4f 66 66 73 65 74 20 3d      p->pOffset =
f7c0: 20 30 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20   0;.        if( 
f7d0: 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  rc ){.          
f7e0: 67 6f 74 6f 20 6d 75 6c 74 69 5f 73 65 6c 65 63  goto multi_selec
f7f0: 74 5f 65 6e 64 3b 0a 20 20 20 20 20 20 20 20 7d  t_end;.        }
f800: 0a 20 20 20 20 20 20 20 20 70 2d 3e 70 50 72 69  .        p->pPri
f810: 6f 72 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  or = 0;.        
f820: 70 2d 3e 69 4c 69 6d 69 74 20 3d 20 70 50 72 69  p->iLimit = pPri
f830: 6f 72 2d 3e 69 4c 69 6d 69 74 3b 0a 20 20 20 20  or->iLimit;.    
f840: 20 20 20 20 70 2d 3e 69 4f 66 66 73 65 74 20 3d      p->iOffset =
f850: 20 70 50 72 69 6f 72 2d 3e 69 4f 66 66 73 65 74   pPrior->iOffset
f860: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 2d  ;.        if( p-
f870: 3e 69 4c 69 6d 69 74 3e 3d 30 20 29 7b 0a 20 20  >iLimit>=0 ){.  
f880: 20 20 20 20 20 20 20 20 61 64 64 72 20 3d 20 73          addr = s
f890: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
f8a0: 28 76 2c 20 4f 50 5f 49 66 4d 65 6d 5a 65 72 6f  (v, OP_IfMemZero
f8b0: 2c 20 70 2d 3e 69 4c 69 6d 69 74 2c 20 30 29 3b  , p->iLimit, 0);
f8c0: 0a 20 20 20 20 20 20 20 20 20 20 56 64 62 65 43  .          VdbeC
f8d0: 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 4a 75 6d 70  omment((v, "Jump
f8e0: 20 61 68 65 61 64 20 69 66 20 4c 49 4d 49 54 20   ahead if LIMIT 
f8f0: 72 65 61 63 68 65 64 22 29 29 3b 0a 20 20 20 20  reached"));.    
f900: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 72 63      }.        rc
f910: 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74   = sqlite3Select
f920: 28 70 50 61 72 73 65 2c 20 70 2c 20 26 64 65 73  (pParse, p, &des
f930: 74 2c 20 30 2c 20 30 2c 20 30 2c 20 61 66 66 29  t, 0, 0, 0, aff)
f940: 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 70 50 72  ;.        p->pPr
f950: 69 6f 72 20 3d 20 70 50 72 69 6f 72 3b 0a 20 20  ior = pPrior;.  
f960: 20 20 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a        if( rc ){.
f970: 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 6d            goto m
f980: 75 6c 74 69 5f 73 65 6c 65 63 74 5f 65 6e 64 3b  ulti_select_end;
f990: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
f9a0: 20 20 20 69 66 28 20 61 64 64 72 20 29 7b 0a 20     if( addr ){. 
f9b0: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
f9c0: 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20  VdbeJumpHere(v, 
f9d0: 61 64 64 72 29 3b 0a 20 20 20 20 20 20 20 20 7d  addr);.        }
f9e0: 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  .        break;.
f9f0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 2f 2a        }.      /*
fa00: 20 46 6f 72 20 55 4e 49 4f 4e 20 41 4c 4c 20 2e   For UNION ALL .
fa10: 2e 2e 20 4f 52 44 45 52 20 42 59 20 66 61 6c 6c  .. ORDER BY fall
fa20: 20 74 68 72 6f 75 67 68 20 74 6f 20 74 68 65 20   through to the 
fa30: 6e 65 78 74 20 63 61 73 65 20 2a 2f 0a 20 20 20  next case */.   
fa40: 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 45   }.    case TK_E
fa50: 58 43 45 50 54 3a 0a 20 20 20 20 63 61 73 65 20  XCEPT:.    case 
fa60: 54 4b 5f 55 4e 49 4f 4e 3a 20 7b 0a 20 20 20 20  TK_UNION: {.    
fa70: 20 20 69 6e 74 20 75 6e 69 6f 6e 54 61 62 3b 20    int unionTab; 
fa80: 20 20 20 2f 2a 20 43 75 72 73 6f 72 20 6e 75 6d     /* Cursor num
fa90: 62 65 72 20 6f 66 20 74 68 65 20 74 65 6d 70 6f  ber of the tempo
faa0: 72 61 72 79 20 74 61 62 6c 65 20 68 6f 6c 64 69  rary table holdi
fab0: 6e 67 20 72 65 73 75 6c 74 20 2a 2f 0a 20 20 20  ng result */.   
fac0: 20 20 20 69 6e 74 20 6f 70 20 3d 20 30 3b 20 20     int op = 0;  
fad0: 20 20 20 20 2f 2a 20 4f 6e 65 20 6f 66 20 74 68      /* One of th
fae0: 65 20 53 52 54 5f 20 6f 70 65 72 61 74 69 6f 6e  e SRT_ operation
faf0: 73 20 74 6f 20 61 70 70 6c 79 20 74 6f 20 73 65  s to apply to se
fb00: 6c 66 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20  lf */.      int 
fb10: 70 72 69 6f 72 4f 70 3b 20 20 20 20 20 2f 2a 20  priorOp;     /* 
fb20: 54 68 65 20 53 52 54 5f 20 6f 70 65 72 61 74 69  The SRT_ operati
fb30: 6f 6e 20 74 6f 20 61 70 70 6c 79 20 74 6f 20 70  on to apply to p
fb40: 72 69 6f 72 20 73 65 6c 65 63 74 73 20 2a 2f 0a  rior selects */.
fb50: 20 20 20 20 20 20 45 78 70 72 20 2a 70 4c 69 6d        Expr *pLim
fb60: 69 74 2c 20 2a 70 4f 66 66 73 65 74 3b 20 2f 2a  it, *pOffset; /*
fb70: 20 53 61 76 65 64 20 76 61 6c 75 65 73 20 6f 66   Saved values of
fb80: 20 70 2d 3e 6e 4c 69 6d 69 74 20 61 6e 64 20 70   p->nLimit and p
fb90: 2d 3e 6e 4f 66 66 73 65 74 20 2a 2f 0a 20 20 20  ->nOffset */.   
fba0: 20 20 20 69 6e 74 20 61 64 64 72 3b 0a 20 20 20     int addr;.   
fbb0: 20 20 20 53 65 6c 65 63 74 44 65 73 74 20 75 6e     SelectDest un
fbc0: 69 6f 6e 64 65 73 74 3b 0a 0a 20 20 20 20 20 20  iondest;..      
fbd0: 70 72 69 6f 72 4f 70 20 3d 20 70 2d 3e 6f 70 3d  priorOp = p->op=
fbe0: 3d 54 4b 5f 41 4c 4c 20 3f 20 53 52 54 5f 54 61  =TK_ALL ? SRT_Ta
fbf0: 62 6c 65 20 3a 20 53 52 54 5f 55 6e 69 6f 6e 3b  ble : SRT_Union;
fc00: 0a 20 20 20 20 20 20 69 66 28 20 64 65 73 74 2e  .      if( dest.
fc10: 65 44 65 73 74 3d 3d 70 72 69 6f 72 4f 70 20 26  eDest==priorOp &
fc20: 26 20 70 4f 72 64 65 72 42 79 3d 3d 30 20 26 26  & pOrderBy==0 &&
fc30: 20 21 70 2d 3e 70 4c 69 6d 69 74 20 26 26 20 21   !p->pLimit && !
fc40: 70 2d 3e 70 4f 66 66 73 65 74 20 29 7b 0a 20 20  p->pOffset ){.  
fc50: 20 20 20 20 20 20 2f 2a 20 57 65 20 63 61 6e 20        /* We can 
fc60: 72 65 75 73 65 20 61 20 74 65 6d 70 6f 72 61 72  reuse a temporar
fc70: 79 20 74 61 62 6c 65 20 67 65 6e 65 72 61 74 65  y table generate
fc80: 64 20 62 79 20 61 20 53 45 4c 45 43 54 20 74 6f  d by a SELECT to
fc90: 20 6f 75 72 0a 20 20 20 20 20 20 20 20 2a 2a 20   our.        ** 
fca0: 72 69 67 68 74 2e 0a 20 20 20 20 20 20 20 20 2a  right..        *
fcb0: 2f 0a 20 20 20 20 20 20 20 20 75 6e 69 6f 6e 54  /.        unionT
fcc0: 61 62 20 3d 20 64 65 73 74 2e 69 50 61 72 6d 3b  ab = dest.iParm;
fcd0: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
fce0: 20 20 20 20 20 20 2f 2a 20 57 65 20 77 69 6c 6c        /* We will
fcf0: 20 6e 65 65 64 20 74 6f 20 63 72 65 61 74 65 20   need to create 
fd00: 6f 75 72 20 6f 77 6e 20 74 65 6d 70 6f 72 61 72  our own temporar
fd10: 79 20 74 61 62 6c 65 20 74 6f 20 68 6f 6c 64 20  y table to hold 
fd20: 74 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 69  the.        ** i
fd30: 6e 74 65 72 6d 65 64 69 61 74 65 20 72 65 73 75  ntermediate resu
fd40: 6c 74 73 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a  lts..        */.
fd50: 20 20 20 20 20 20 20 20 75 6e 69 6f 6e 54 61 62          unionTab
fd60: 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b   = pParse->nTab+
fd70: 2b 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  +;.        if( p
fd80: 72 6f 63 65 73 73 43 6f 6d 70 6f 75 6e 64 4f 72  rocessCompoundOr
fd90: 64 65 72 42 79 28 70 50 61 72 73 65 2c 20 70 2c  derBy(pParse, p,
fda0: 20 75 6e 69 6f 6e 54 61 62 29 20 29 7b 0a 20 20   unionTab) ){.  
fdb0: 20 20 20 20 20 20 20 20 72 63 20 3d 20 31 3b 0a          rc = 1;.
fdc0: 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 6d            goto m
fdd0: 75 6c 74 69 5f 73 65 6c 65 63 74 5f 65 6e 64 3b  ulti_select_end;
fde0: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
fdf0: 20 20 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65     addr = sqlite
fe00: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
fe10: 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 2c  P_OpenEphemeral,
fe20: 20 75 6e 69 6f 6e 54 61 62 2c 20 30 29 3b 0a 20   unionTab, 0);. 
fe30: 20 20 20 20 20 20 20 69 66 28 20 70 72 69 6f 72         if( prior
fe40: 4f 70 3d 3d 53 52 54 5f 54 61 62 6c 65 20 29 7b  Op==SRT_Table ){
fe50: 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72  .          asser
fe60: 74 28 20 6e 53 65 74 50 32 3c 73 69 7a 65 6f 66  t( nSetP2<sizeof
fe70: 28 61 53 65 74 50 32 29 2f 73 69 7a 65 6f 66 28  (aSetP2)/sizeof(
fe80: 61 53 65 74 50 32 5b 30 5d 29 20 29 3b 0a 20 20  aSetP2[0]) );.  
fe90: 20 20 20 20 20 20 20 20 61 53 65 74 50 32 5b 6e          aSetP2[n
fea0: 53 65 74 50 32 2b 2b 5d 20 3d 20 61 64 64 72 3b  SetP2++] = addr;
feb0: 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
fec0: 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74            assert
fed0: 28 20 70 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68  ( p->addrOpenEph
fee0: 6d 5b 30 5d 20 3d 3d 20 2d 31 20 29 3b 0a 20 20  m[0] == -1 );.  
fef0: 20 20 20 20 20 20 20 20 70 2d 3e 61 64 64 72 4f          p->addrO
ff00: 70 65 6e 45 70 68 6d 5b 30 5d 20 3d 20 61 64 64  penEphm[0] = add
ff10: 72 3b 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e  r;.          p->
ff20: 70 52 69 67 68 74 6d 6f 73 74 2d 3e 75 73 65 73  pRightmost->uses
ff30: 45 70 68 6d 20 3d 20 31 3b 0a 20 20 20 20 20 20  Ephm = 1;.      
ff40: 20 20 7d 0a 20 20 20 20 20 20 20 20 63 72 65 61    }.        crea
ff50: 74 65 53 6f 72 74 69 6e 67 49 6e 64 65 78 28 70  teSortingIndex(p
ff60: 50 61 72 73 65 2c 20 70 2c 20 70 4f 72 64 65 72  Parse, p, pOrder
ff70: 42 79 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73  By);.        ass
ff80: 65 72 74 28 20 70 2d 3e 70 45 4c 69 73 74 20 29  ert( p->pEList )
ff90: 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20  ;.      }..     
ffa0: 20 2f 2a 20 43 6f 64 65 20 74 68 65 20 53 45 4c   /* Code the SEL
ffb0: 45 43 54 20 73 74 61 74 65 6d 65 6e 74 73 20 74  ECT statements t
ffc0: 6f 20 6f 75 72 20 6c 65 66 74 0a 20 20 20 20 20  o our left.     
ffd0: 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74   */.      assert
ffe0: 28 20 21 70 50 72 69 6f 72 2d 3e 70 4f 72 64 65  ( !pPrior->pOrde
fff0: 72 42 79 20 29 3b 0a 20 20 20 20 20 20 75 6e 69  rBy );.      uni
10000 6f 6e 64 65 73 74 2e 65 44 65 73 74 20 3d 20 70  ondest.eDest = p
10010 72 69 6f 72 4f 70 3b 0a 20 20 20 20 20 20 75 6e  riorOp;.      un
10020 69 6f 6e 64 65 73 74 2e 69 50 61 72 6d 20 3d 20  iondest.iParm = 
10030 75 6e 69 6f 6e 54 61 62 3b 0a 20 20 20 20 20 20  unionTab;.      
10040 72 63 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65  rc = sqlite3Sele
10050 63 74 28 70 50 61 72 73 65 2c 20 70 50 72 69 6f  ct(pParse, pPrio
10060 72 2c 20 26 75 6e 69 6f 6e 64 65 73 74 2c 20 30  r, &uniondest, 0
10070 2c 20 30 2c 20 30 2c 20 61 66 66 29 3b 0a 20 20  , 0, 0, aff);.  
10080 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20      if( rc ){.  
10090 20 20 20 20 20 20 67 6f 74 6f 20 6d 75 6c 74 69        goto multi
100a0 5f 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20  _select_end;.   
100b0 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 43     }..      /* C
100c0 6f 64 65 20 74 68 65 20 63 75 72 72 65 6e 74 20  ode the current 
100d0 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
100e0 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
100f0 73 77 69 74 63 68 28 20 70 2d 3e 6f 70 20 29 7b  switch( p->op ){
10100 0a 20 20 20 20 20 20 20 20 20 63 61 73 65 20 54  .         case T
10110 4b 5f 45 58 43 45 50 54 3a 20 20 6f 70 20 3d 20  K_EXCEPT:  op = 
10120 53 52 54 5f 45 78 63 65 70 74 3b 20 20 20 62 72  SRT_Except;   br
10130 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 63 61  eak;.         ca
10140 73 65 20 54 4b 5f 55 4e 49 4f 4e 3a 20 20 20 6f  se TK_UNION:   o
10150 70 20 3d 20 53 52 54 5f 55 6e 69 6f 6e 3b 20 20  p = SRT_Union;  
10160 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20    break;.       
10170 20 20 63 61 73 65 20 54 4b 5f 41 4c 4c 3a 20 20    case TK_ALL:  
10180 20 20 20 6f 70 20 3d 20 53 52 54 5f 54 61 62 6c     op = SRT_Tabl
10190 65 3b 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20  e;    break;.   
101a0 20 20 20 7d 0a 20 20 20 20 20 20 70 2d 3e 70 50     }.      p->pP
101b0 72 69 6f 72 20 3d 20 30 3b 0a 20 20 20 20 20 20  rior = 0;.      
101c0 70 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20 30 3b  p->pOrderBy = 0;
101d0 0a 20 20 20 20 20 20 70 2d 3e 64 69 73 61 6c 6c  .      p->disall
101e0 6f 77 4f 72 64 65 72 42 79 20 3d 20 70 4f 72 64  owOrderBy = pOrd
101f0 65 72 42 79 21 3d 30 3b 0a 20 20 20 20 20 20 70  erBy!=0;.      p
10200 4c 69 6d 69 74 20 3d 20 70 2d 3e 70 4c 69 6d 69  Limit = p->pLimi
10210 74 3b 0a 20 20 20 20 20 20 70 2d 3e 70 4c 69 6d  t;.      p->pLim
10220 69 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 4f  it = 0;.      pO
10230 66 66 73 65 74 20 3d 20 70 2d 3e 70 4f 66 66 73  ffset = p->pOffs
10240 65 74 3b 0a 20 20 20 20 20 20 70 2d 3e 70 4f 66  et;.      p->pOf
10250 66 73 65 74 20 3d 20 30 3b 0a 20 20 20 20 20 20  fset = 0;.      
10260 75 6e 69 6f 6e 64 65 73 74 2e 65 44 65 73 74 20  uniondest.eDest 
10270 3d 20 6f 70 3b 0a 20 20 20 20 20 20 72 63 20 3d  = op;.      rc =
10280 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28 70   sqlite3Select(p
10290 50 61 72 73 65 2c 20 70 2c 20 26 75 6e 69 6f 6e  Parse, p, &union
102a0 64 65 73 74 2c 20 30 2c 20 30 2c 20 30 2c 20 61  dest, 0, 0, 0, a
102b0 66 66 29 3b 0a 20 20 20 20 20 20 2f 2a 20 51 75  ff);.      /* Qu
102c0 65 72 79 20 66 6c 61 74 74 65 6e 69 6e 67 20 69  ery flattening i
102d0 6e 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28  n sqlite3Select(
102e0 29 20 6d 69 67 68 74 20 72 65 66 69 6c 6c 20 70  ) might refill p
102f0 2d 3e 70 4f 72 64 65 72 42 79 2e 0a 20 20 20 20  ->pOrderBy..    
10300 20 20 2a 2a 20 42 65 20 73 75 72 65 20 74 6f 20    ** Be sure to 
10310 64 65 6c 65 74 65 20 70 2d 3e 70 4f 72 64 65 72  delete p->pOrder
10320 42 79 2c 20 74 68 65 72 65 66 6f 72 65 2c 20 74  By, therefore, t
10330 6f 20 61 76 6f 69 64 20 61 20 6d 65 6d 6f 72 79  o avoid a memory
10340 20 6c 65 61 6b 2e 20 2a 2f 0a 20 20 20 20 20 20   leak. */.      
10350 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44  sqlite3ExprListD
10360 65 6c 65 74 65 28 70 2d 3e 70 4f 72 64 65 72 42  elete(p->pOrderB
10370 79 29 3b 0a 20 20 20 20 20 20 70 2d 3e 70 50 72  y);.      p->pPr
10380 69 6f 72 20 3d 20 70 50 72 69 6f 72 3b 0a 20 20  ior = pPrior;.  
10390 20 20 20 20 70 2d 3e 70 4f 72 64 65 72 42 79 20      p->pOrderBy 
103a0 3d 20 70 4f 72 64 65 72 42 79 3b 0a 20 20 20 20  = pOrderBy;.    
103b0 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c    sqlite3ExprDel
103c0 65 74 65 28 70 2d 3e 70 4c 69 6d 69 74 29 3b 0a  ete(p->pLimit);.
103d0 20 20 20 20 20 20 70 2d 3e 70 4c 69 6d 69 74 20        p->pLimit 
103e0 3d 20 70 4c 69 6d 69 74 3b 0a 20 20 20 20 20 20  = pLimit;.      
103f0 70 2d 3e 70 4f 66 66 73 65 74 20 3d 20 70 4f 66  p->pOffset = pOf
10400 66 73 65 74 3b 0a 20 20 20 20 20 20 70 2d 3e 69  fset;.      p->i
10410 4c 69 6d 69 74 20 3d 20 2d 31 3b 0a 20 20 20 20  Limit = -1;.    
10420 20 20 70 2d 3e 69 4f 66 66 73 65 74 20 3d 20 2d    p->iOffset = -
10430 31 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 20  1;.      if( rc 
10440 29 7b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20  ){.        goto 
10450 6d 75 6c 74 69 5f 73 65 6c 65 63 74 5f 65 6e 64  multi_select_end
10460 3b 0a 20 20 20 20 20 20 7d 0a 0a 0a 20 20 20 20  ;.      }...    
10470 20 20 2f 2a 20 43 6f 6e 76 65 72 74 20 74 68 65    /* Convert the
10480 20 64 61 74 61 20 69 6e 20 74 68 65 20 74 65 6d   data in the tem
10490 70 6f 72 61 72 79 20 74 61 62 6c 65 20 69 6e 74  porary table int
104a0 6f 20 77 68 61 74 65 76 65 72 20 66 6f 72 6d 0a  o whatever form.
104b0 20 20 20 20 20 20 2a 2a 20 69 74 20 69 73 20 74        ** it is t
104c0 68 61 74 20 77 65 20 63 75 72 72 65 6e 74 6c 79  hat we currently
104d0 20 6e 65 65 64 2e 0a 20 20 20 20 20 20 2a 2f 20   need..      */ 
104e0 20 20 20 20 20 0a 20 20 20 20 20 20 69 66 28 20       .      if( 
104f0 64 65 73 74 2e 65 44 65 73 74 21 3d 70 72 69 6f  dest.eDest!=prio
10500 72 4f 70 20 7c 7c 20 75 6e 69 6f 6e 54 61 62 21  rOp || unionTab!
10510 3d 64 65 73 74 2e 69 50 61 72 6d 20 29 7b 0a 20  =dest.iParm ){. 
10520 20 20 20 20 20 20 20 69 6e 74 20 69 43 6f 6e 74         int iCont
10530 2c 20 69 42 72 65 61 6b 2c 20 69 53 74 61 72 74  , iBreak, iStart
10540 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ;.        assert
10550 28 20 70 2d 3e 70 45 4c 69 73 74 20 29 3b 0a 20  ( p->pEList );. 
10560 20 20 20 20 20 20 20 69 66 28 20 64 65 73 74 2e         if( dest.
10570 65 44 65 73 74 3d 3d 53 52 54 5f 43 61 6c 6c 62  eDest==SRT_Callb
10580 61 63 6b 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ack ){.         
10590 20 53 65 6c 65 63 74 20 2a 70 46 69 72 73 74 20   Select *pFirst 
105a0 3d 20 70 3b 0a 20 20 20 20 20 20 20 20 20 20 77  = p;.          w
105b0 68 69 6c 65 28 20 70 46 69 72 73 74 2d 3e 70 50  hile( pFirst->pP
105c0 72 69 6f 72 20 29 20 70 46 69 72 73 74 20 3d 20  rior ) pFirst = 
105d0 70 46 69 72 73 74 2d 3e 70 50 72 69 6f 72 3b 0a  pFirst->pPrior;.
105e0 20 20 20 20 20 20 20 20 20 20 67 65 6e 65 72 61            genera
105f0 74 65 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 70 50  teColumnNames(pP
10600 61 72 73 65 2c 20 30 2c 20 70 46 69 72 73 74 2d  arse, 0, pFirst-
10610 3e 70 45 4c 69 73 74 29 3b 0a 20 20 20 20 20 20  >pEList);.      
10620 20 20 7d 0a 20 20 20 20 20 20 20 20 69 42 72 65    }.        iBre
10630 61 6b 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  ak = sqlite3Vdbe
10640 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20  MakeLabel(v);.  
10650 20 20 20 20 20 20 69 43 6f 6e 74 20 3d 20 73 71        iCont = sq
10660 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62  lite3VdbeMakeLab
10670 65 6c 28 76 29 3b 0a 20 20 20 20 20 20 20 20 63  el(v);.        c
10680 6f 6d 70 75 74 65 4c 69 6d 69 74 52 65 67 69 73  omputeLimitRegis
10690 74 65 72 73 28 70 50 61 72 73 65 2c 20 70 2c 20  ters(pParse, p, 
106a0 69 42 72 65 61 6b 29 3b 0a 20 20 20 20 20 20 20  iBreak);.       
106b0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
106c0 70 32 28 76 2c 20 4f 50 5f 52 65 77 69 6e 64 2c  p2(v, OP_Rewind,
106d0 20 75 6e 69 6f 6e 54 61 62 2c 20 69 42 72 65 61   unionTab, iBrea
106e0 6b 29 3b 0a 20 20 20 20 20 20 20 20 69 53 74 61  k);.        iSta
106f0 72 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  rt = sqlite3Vdbe
10700 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b 0a  CurrentAddr(v);.
10710 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 65 6c          rc = sel
10720 65 63 74 49 6e 6e 65 72 4c 6f 6f 70 28 70 50 61  ectInnerLoop(pPa
10730 72 73 65 2c 20 70 2c 20 70 2d 3e 70 45 4c 69 73  rse, p, p->pELis
10740 74 2c 20 75 6e 69 6f 6e 54 61 62 2c 20 70 2d 3e  t, unionTab, p->
10750 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 2c 0a 20  pEList->nExpr,. 
10760 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10770 20 20 20 20 20 20 20 20 20 20 20 20 70 4f 72 64              pOrd
10780 65 72 42 79 2c 20 2d 31 2c 20 26 64 65 73 74 2c  erBy, -1, &dest,
10790 20 69 43 6f 6e 74 2c 20 69 42 72 65 61 6b 2c 20   iCont, iBreak, 
107a0 30 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  0);.        if( 
107b0 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  rc ){.          
107c0 72 63 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20  rc = 1;.        
107d0 20 20 67 6f 74 6f 20 6d 75 6c 74 69 5f 73 65 6c    goto multi_sel
107e0 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 20 20 20  ect_end;.       
107f0 20 7d 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74   }.        sqlit
10800 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62  e3VdbeResolveLab
10810 65 6c 28 76 2c 20 69 43 6f 6e 74 29 3b 0a 20 20  el(v, iCont);.  
10820 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
10830 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 65  eAddOp2(v, OP_Ne
10840 78 74 2c 20 75 6e 69 6f 6e 54 61 62 2c 20 69 53  xt, unionTab, iS
10850 74 61 72 74 29 3b 0a 20 20 20 20 20 20 20 20 73  tart);.        s
10860 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76  qlite3VdbeResolv
10870 65 4c 61 62 65 6c 28 76 2c 20 69 42 72 65 61 6b  eLabel(v, iBreak
10880 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
10890 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
108a0 4f 50 5f 43 6c 6f 73 65 2c 20 75 6e 69 6f 6e 54  OP_Close, unionT
108b0 61 62 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a  ab, 0);.      }.
108c0 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
108d0 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49   }.    case TK_I
108e0 4e 54 45 52 53 45 43 54 3a 20 7b 0a 20 20 20 20  NTERSECT: {.    
108f0 20 20 69 6e 74 20 74 61 62 31 2c 20 74 61 62 32    int tab1, tab2
10900 3b 0a 20 20 20 20 20 20 69 6e 74 20 69 43 6f 6e  ;.      int iCon
10910 74 2c 20 69 42 72 65 61 6b 2c 20 69 53 74 61 72  t, iBreak, iStar
10920 74 3b 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70  t;.      Expr *p
10930 4c 69 6d 69 74 2c 20 2a 70 4f 66 66 73 65 74 3b  Limit, *pOffset;
10940 0a 20 20 20 20 20 20 69 6e 74 20 61 64 64 72 3b  .      int addr;
10950 0a 20 20 20 20 20 20 53 65 6c 65 63 74 44 65 73  .      SelectDes
10960 74 20 69 6e 74 65 72 73 65 63 74 64 65 73 74 20  t intersectdest 
10970 3d 20 7b 53 52 54 5f 55 6e 69 6f 6e 2c 20 30 2c  = {SRT_Union, 0,
10980 20 30 7d 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 49   0};..      /* I
10990 4e 54 45 52 53 45 43 54 20 69 73 20 64 69 66 66  NTERSECT is diff
109a0 65 72 65 6e 74 20 66 72 6f 6d 20 74 68 65 20 6f  erent from the o
109b0 74 68 65 72 73 20 73 69 6e 63 65 20 69 74 20 72  thers since it r
109c0 65 71 75 69 72 65 73 0a 20 20 20 20 20 20 2a 2a  equires.      **
109d0 20 74 77 6f 20 74 65 6d 70 6f 72 61 72 79 20 74   two temporary t
109e0 61 62 6c 65 73 2e 20 20 48 65 6e 63 65 20 69 74  ables.  Hence it
109f0 20 68 61 73 20 69 74 73 20 6f 77 6e 20 63 61 73   has its own cas
10a00 65 2e 20 20 42 65 67 69 6e 0a 20 20 20 20 20 20  e.  Begin.      
10a10 2a 2a 20 62 79 20 61 6c 6c 6f 63 61 74 69 6e 67  ** by allocating
10a20 20 74 68 65 20 74 61 62 6c 65 73 20 77 65 20 77   the tables we w
10a30 69 6c 6c 20 6e 65 65 64 2e 0a 20 20 20 20 20 20  ill need..      
10a40 2a 2f 0a 20 20 20 20 20 20 74 61 62 31 20 3d 20  */.      tab1 = 
10a50 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a  pParse->nTab++;.
10a60 20 20 20 20 20 20 74 61 62 32 20 3d 20 70 50 61        tab2 = pPa
10a70 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20  rse->nTab++;.   
10a80 20 20 20 69 66 28 20 70 72 6f 63 65 73 73 43 6f     if( processCo
10a90 6d 70 6f 75 6e 64 4f 72 64 65 72 42 79 28 70 50  mpoundOrderBy(pP
10aa0 61 72 73 65 2c 20 70 2c 20 74 61 62 31 29 20 29  arse, p, tab1) )
10ab0 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 31  {.        rc = 1
10ac0 3b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 6d  ;.        goto m
10ad0 75 6c 74 69 5f 73 65 6c 65 63 74 5f 65 6e 64 3b  ulti_select_end;
10ae0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 63  .      }.      c
10af0 72 65 61 74 65 53 6f 72 74 69 6e 67 49 6e 64 65  reateSortingInde
10b00 78 28 70 50 61 72 73 65 2c 20 70 2c 20 70 4f 72  x(pParse, p, pOr
10b10 64 65 72 42 79 29 3b 0a 0a 20 20 20 20 20 20 61  derBy);..      a
10b20 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62  ddr = sqlite3Vdb
10b30 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4f 70  eAddOp2(v, OP_Op
10b40 65 6e 45 70 68 65 6d 65 72 61 6c 2c 20 74 61 62  enEphemeral, tab
10b50 31 2c 20 30 29 3b 0a 20 20 20 20 20 20 61 73 73  1, 0);.      ass
10b60 65 72 74 28 20 70 2d 3e 61 64 64 72 4f 70 65 6e  ert( p->addrOpen
10b70 45 70 68 6d 5b 30 5d 20 3d 3d 20 2d 31 20 29 3b  Ephm[0] == -1 );
10b80 0a 20 20 20 20 20 20 70 2d 3e 61 64 64 72 4f 70  .      p->addrOp
10b90 65 6e 45 70 68 6d 5b 30 5d 20 3d 20 61 64 64 72  enEphm[0] = addr
10ba0 3b 0a 20 20 20 20 20 20 70 2d 3e 70 52 69 67 68  ;.      p->pRigh
10bb0 74 6d 6f 73 74 2d 3e 75 73 65 73 45 70 68 6d 20  tmost->usesEphm 
10bc0 3d 20 31 3b 0a 20 20 20 20 20 20 61 73 73 65 72  = 1;.      asser
10bd0 74 28 20 70 2d 3e 70 45 4c 69 73 74 20 29 3b 0a  t( p->pEList );.
10be0 0a 20 20 20 20 20 20 2f 2a 20 43 6f 64 65 20 74  .      /* Code t
10bf0 68 65 20 53 45 4c 45 43 54 73 20 74 6f 20 6f 75  he SELECTs to ou
10c00 72 20 6c 65 66 74 20 69 6e 74 6f 20 74 65 6d 70  r left into temp
10c10 6f 72 61 72 79 20 74 61 62 6c 65 20 22 74 61 62  orary table "tab
10c20 31 22 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  1"..      */.   
10c30 20 20 20 69 6e 74 65 72 73 65 63 74 64 65 73 74     intersectdest
10c40 2e 69 50 61 72 6d 20 3d 20 74 61 62 31 3b 0a 20  .iParm = tab1;. 
10c50 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
10c60 33 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20  3Select(pParse, 
10c70 70 50 72 69 6f 72 2c 20 26 69 6e 74 65 72 73 65  pPrior, &interse
10c80 63 74 64 65 73 74 2c 20 30 2c 20 30 2c 20 30 2c  ctdest, 0, 0, 0,
10c90 20 61 66 66 29 3b 0a 20 20 20 20 20 20 69 66 28   aff);.      if(
10ca0 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20 67   rc ){.        g
10cb0 6f 74 6f 20 6d 75 6c 74 69 5f 73 65 6c 65 63 74  oto multi_select
10cc0 5f 65 6e 64 3b 0a 20 20 20 20 20 20 7d 0a 0a 20  _end;.      }.. 
10cd0 20 20 20 20 20 2f 2a 20 43 6f 64 65 20 74 68 65       /* Code the
10ce0 20 63 75 72 72 65 6e 74 20 53 45 4c 45 43 54 20   current SELECT 
10cf0 69 6e 74 6f 20 74 65 6d 70 6f 72 61 72 79 20 74  into temporary t
10d00 61 62 6c 65 20 22 74 61 62 32 22 0a 20 20 20 20  able "tab2".    
10d10 20 20 2a 2f 0a 20 20 20 20 20 20 61 64 64 72 20    */.      addr 
10d20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  = sqlite3VdbeAdd
10d30 4f 70 32 28 76 2c 20 4f 50 5f 4f 70 65 6e 45 70  Op2(v, OP_OpenEp
10d40 68 65 6d 65 72 61 6c 2c 20 74 61 62 32 2c 20 30  hemeral, tab2, 0
10d50 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
10d60 20 70 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d   p->addrOpenEphm
10d70 5b 31 5d 20 3d 3d 20 2d 31 20 29 3b 0a 20 20 20  [1] == -1 );.   
10d80 20 20 20 70 2d 3e 61 64 64 72 4f 70 65 6e 45 70     p->addrOpenEp
10d90 68 6d 5b 31 5d 20 3d 20 61 64 64 72 3b 0a 20 20  hm[1] = addr;.  
10da0 20 20 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d 20      p->pPrior = 
10db0 30 3b 0a 20 20 20 20 20 20 70 4c 69 6d 69 74 20  0;.      pLimit 
10dc0 3d 20 70 2d 3e 70 4c 69 6d 69 74 3b 0a 20 20 20  = p->pLimit;.   
10dd0 20 20 20 70 2d 3e 70 4c 69 6d 69 74 20 3d 20 30     p->pLimit = 0
10de0 3b 0a 20 20 20 20 20 20 70 4f 66 66 73 65 74 20  ;.      pOffset 
10df0 3d 20 70 2d 3e 70 4f 66 66 73 65 74 3b 0a 20 20  = p->pOffset;.  
10e00 20 20 20 20 70 2d 3e 70 4f 66 66 73 65 74 20 3d      p->pOffset =
10e10 20 30 3b 0a 20 20 20 20 20 20 69 6e 74 65 72 73   0;.      inters
10e20 65 63 74 64 65 73 74 2e 69 50 61 72 6d 20 3d 20  ectdest.iParm = 
10e30 74 61 62 32 3b 0a 20 20 20 20 20 20 72 63 20 3d  tab2;.      rc =
10e40 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28 70   sqlite3Select(p
10e50 50 61 72 73 65 2c 20 70 2c 20 26 69 6e 74 65 72  Parse, p, &inter
10e60 73 65 63 74 64 65 73 74 2c 20 30 2c 20 30 2c 20  sectdest, 0, 0, 
10e70 30 2c 20 61 66 66 29 3b 0a 20 20 20 20 20 20 70  0, aff);.      p
10e80 2d 3e 70 50 72 69 6f 72 20 3d 20 70 50 72 69 6f  ->pPrior = pPrio
10e90 72 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  r;.      sqlite3
10ea0 45 78 70 72 44 65 6c 65 74 65 28 70 2d 3e 70 4c  ExprDelete(p->pL
10eb0 69 6d 69 74 29 3b 0a 20 20 20 20 20 20 70 2d 3e  imit);.      p->
10ec0 70 4c 69 6d 69 74 20 3d 20 70 4c 69 6d 69 74 3b  pLimit = pLimit;
10ed0 0a 20 20 20 20 20 20 70 2d 3e 70 4f 66 66 73 65  .      p->pOffse
10ee0 74 20 3d 20 70 4f 66 66 73 65 74 3b 0a 20 20 20  t = pOffset;.   
10ef0 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20     if( rc ){.   
10f00 20 20 20 20 20 67 6f 74 6f 20 6d 75 6c 74 69 5f       goto multi_
10f10 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20  select_end;.    
10f20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 47 65    }..      /* Ge
10f30 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20 74  nerate code to t
10f40 61 6b 65 20 74 68 65 20 69 6e 74 65 72 73 65 63  ake the intersec
10f50 74 69 6f 6e 20 6f 66 20 74 68 65 20 74 77 6f 20  tion of the two 
10f60 74 65 6d 70 6f 72 61 72 79 0a 20 20 20 20 20 20  temporary.      
10f70 2a 2a 20 74 61 62 6c 65 73 2e 0a 20 20 20 20 20  ** tables..     
10f80 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74   */.      assert
10f90 28 20 70 2d 3e 70 45 4c 69 73 74 20 29 3b 0a 20  ( p->pEList );. 
10fa0 20 20 20 20 20 69 66 28 20 64 65 73 74 2e 65 44       if( dest.eD
10fb0 65 73 74 3d 3d 53 52 54 5f 43 61 6c 6c 62 61 63  est==SRT_Callbac
10fc0 6b 20 29 7b 0a 20 20 20 20 20 20 20 20 53 65 6c  k ){.        Sel
10fd0 65 63 74 20 2a 70 46 69 72 73 74 20 3d 20 70 3b  ect *pFirst = p;
10fe0 0a 20 20 20 20 20 20 20 20 77 68 69 6c 65 28 20  .        while( 
10ff0 70 46 69 72 73 74 2d 3e 70 50 72 69 6f 72 20 29  pFirst->pPrior )
11000 20 70 46 69 72 73 74 20 3d 20 70 46 69 72 73 74   pFirst = pFirst
11010 2d 3e 70 50 72 69 6f 72 3b 0a 20 20 20 20 20 20  ->pPrior;.      
11020 20 20 67 65 6e 65 72 61 74 65 43 6f 6c 75 6d 6e    generateColumn
11030 4e 61 6d 65 73 28 70 50 61 72 73 65 2c 20 30 2c  Names(pParse, 0,
11040 20 70 46 69 72 73 74 2d 3e 70 45 4c 69 73 74 29   pFirst->pEList)
11050 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
11060 69 42 72 65 61 6b 20 3d 20 73 71 6c 69 74 65 33  iBreak = sqlite3
11070 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29  VdbeMakeLabel(v)
11080 3b 0a 20 20 20 20 20 20 69 43 6f 6e 74 20 3d 20  ;.      iCont = 
11090 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c  sqlite3VdbeMakeL
110a0 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 20 20 63  abel(v);.      c
110b0 6f 6d 70 75 74 65 4c 69 6d 69 74 52 65 67 69 73  omputeLimitRegis
110c0 74 65 72 73 28 70 50 61 72 73 65 2c 20 70 2c 20  ters(pParse, p, 
110d0 69 42 72 65 61 6b 29 3b 0a 20 20 20 20 20 20 73  iBreak);.      s
110e0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
110f0 28 76 2c 20 4f 50 5f 52 65 77 69 6e 64 2c 20 74  (v, OP_Rewind, t
11100 61 62 31 2c 20 69 42 72 65 61 6b 29 3b 0a 20 20  ab1, iBreak);.  
11110 20 20 20 20 69 53 74 61 72 74 20 3d 20 73 71 6c      iStart = sql
11120 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
11130 2c 20 4f 50 5f 52 6f 77 4b 65 79 2c 20 74 61 62  , OP_RowKey, tab
11140 31 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c  1, 0);.      sql
11150 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
11160 2c 20 4f 50 5f 4e 6f 74 46 6f 75 6e 64 2c 20 74  , OP_NotFound, t
11170 61 62 32 2c 20 69 43 6f 6e 74 29 3b 0a 20 20 20  ab2, iCont);.   
11180 20 20 20 72 63 20 3d 20 73 65 6c 65 63 74 49 6e     rc = selectIn
11190 6e 65 72 4c 6f 6f 70 28 70 50 61 72 73 65 2c 20  nerLoop(pParse, 
111a0 70 2c 20 70 2d 3e 70 45 4c 69 73 74 2c 20 74 61  p, p->pEList, ta
111b0 62 31 2c 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e  b1, p->pEList->n
111c0 45 78 70 72 2c 0a 20 20 20 20 20 20 20 20 20 20  Expr,.          
111d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
111e0 20 20 20 70 4f 72 64 65 72 42 79 2c 20 2d 31 2c     pOrderBy, -1,
111f0 20 26 64 65 73 74 2c 20 69 43 6f 6e 74 2c 20 69   &dest, iCont, i
11200 42 72 65 61 6b 2c 20 30 29 3b 0a 20 20 20 20 20  Break, 0);.     
11210 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20   if( rc ){.     
11220 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 20     rc = 1;.     
11230 20 20 20 67 6f 74 6f 20 6d 75 6c 74 69 5f 73 65     goto multi_se
11240 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 20 20  lect_end;.      
11250 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  }.      sqlite3V
11260 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28  dbeResolveLabel(
11270 76 2c 20 69 43 6f 6e 74 29 3b 0a 20 20 20 20 20  v, iCont);.     
11280 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
11290 70 32 28 76 2c 20 4f 50 5f 4e 65 78 74 2c 20 74  p2(v, OP_Next, t
112a0 61 62 31 2c 20 69 53 74 61 72 74 29 3b 0a 20 20  ab1, iStart);.  
112b0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 52      sqlite3VdbeR
112c0 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 69  esolveLabel(v, i
112d0 42 72 65 61 6b 29 3b 0a 20 20 20 20 20 20 73 71  Break);.      sq
112e0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
112f0 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 74 61 62  v, OP_Close, tab
11300 32 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c  2, 0);.      sql
11310 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
11320 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 74 61 62 31  , OP_Close, tab1
11330 2c 20 30 29 3b 0a 20 20 20 20 20 20 62 72 65 61  , 0);.      brea
11340 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  k;.    }.  }..  
11350 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 61 6c 6c  /* Make sure all
11360 20 53 45 4c 45 43 54 73 20 69 6e 20 74 68 65 20   SELECTs in the 
11370 73 74 61 74 65 6d 65 6e 74 20 68 61 76 65 20 74  statement have t
11380 68 65 20 73 61 6d 65 20 6e 75 6d 62 65 72 20 6f  he same number o
11390 66 20 65 6c 65 6d 65 6e 74 73 0a 20 20 2a 2a 20  f elements.  ** 
113a0 69 6e 20 74 68 65 69 72 20 72 65 73 75 6c 74 20  in their result 
113b0 73 65 74 73 2e 0a 20 20 2a 2f 0a 20 20 61 73 73  sets..  */.  ass
113c0 65 72 74 28 20 70 2d 3e 70 45 4c 69 73 74 20 26  ert( p->pEList &
113d0 26 20 70 50 72 69 6f 72 2d 3e 70 45 4c 69 73 74  & pPrior->pEList
113e0 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e 70 45 4c   );.  if( p->pEL
113f0 69 73 74 2d 3e 6e 45 78 70 72 21 3d 70 50 72 69  ist->nExpr!=pPri
11400 6f 72 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70  or->pEList->nExp
11410 72 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  r ){.    sqlite3
11420 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
11430 20 22 53 45 4c 45 43 54 73 20 74 6f 20 74 68 65   "SELECTs to the
11440 20 6c 65 66 74 20 61 6e 64 20 72 69 67 68 74 20   left and right 
11450 6f 66 20 25 73 22 0a 20 20 20 20 20 20 22 20 64  of %s".      " d
11460 6f 20 6e 6f 74 20 68 61 76 65 20 74 68 65 20 73  o not have the s
11470 61 6d 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 65  ame number of re
11480 73 75 6c 74 20 63 6f 6c 75 6d 6e 73 22 2c 20 73  sult columns", s
11490 65 6c 65 63 74 4f 70 4e 61 6d 65 28 70 2d 3e 6f  electOpName(p->o
114a0 70 29 29 3b 0a 20 20 20 20 72 63 20 3d 20 31 3b  p));.    rc = 1;
114b0 0a 20 20 20 20 67 6f 74 6f 20 6d 75 6c 74 69 5f  .    goto multi_
114c0 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 7d 0a  select_end;.  }.
114d0 0a 20 20 2f 2a 20 53 65 74 20 74 68 65 20 6e 75  .  /* Set the nu
114e0 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20  mber of columns 
114f0 69 6e 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62  in temporary tab
11500 6c 65 73 0a 20 20 2a 2f 0a 20 20 6e 43 6f 6c 20  les.  */.  nCol 
11510 3d 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78  = p->pEList->nEx
11520 70 72 3b 0a 20 20 77 68 69 6c 65 28 20 6e 53 65  pr;.  while( nSe
11530 74 50 32 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  tP2 ){.    sqlit
11540 65 33 56 64 62 65 43 68 61 6e 67 65 50 32 28 76  e3VdbeChangeP2(v
11550 2c 20 61 53 65 74 50 32 5b 2d 2d 6e 53 65 74 50  , aSetP2[--nSetP
11560 32 5d 2c 20 6e 43 6f 6c 29 3b 0a 20 20 7d 0a 0a  2], nCol);.  }..
11570 20 20 2f 2a 20 43 6f 6d 70 75 74 65 20 63 6f 6c    /* Compute col
11580 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65 73  lating sequences
11590 20 75 73 65 64 20 62 79 20 65 69 74 68 65 72 20   used by either 
115a0 74 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61  the ORDER BY cla
115b0 75 73 65 20 6f 72 0a 20 20 2a 2a 20 62 79 20 61  use or.  ** by a
115c0 6e 79 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62  ny temporary tab
115d0 6c 65 73 20 6e 65 65 64 65 64 20 74 6f 20 69 6d  les needed to im
115e0 70 6c 65 6d 65 6e 74 20 74 68 65 20 63 6f 6d 70  plement the comp
115f0 6f 75 6e 64 20 73 65 6c 65 63 74 2e 0a 20 20 2a  ound select..  *
11600 2a 20 41 74 74 61 63 68 20 74 68 65 20 4b 65 79  * Attach the Key
11610 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65 20 74  Info structure t
11620 6f 20 61 6c 6c 20 74 65 6d 70 6f 72 61 72 79 20  o all temporary 
11630 74 61 62 6c 65 73 2e 20 20 49 6e 76 6f 6b 65 20  tables.  Invoke 
11640 74 68 65 0a 20 20 2a 2a 20 4f 52 44 45 52 20 42  the.  ** ORDER B
11650 59 20 70 72 6f 63 65 73 73 69 6e 67 20 69 66 20  Y processing if 
11660 74 68 65 72 65 20 69 73 20 61 6e 20 4f 52 44 45  there is an ORDE
11670 52 20 42 59 20 63 6c 61 75 73 65 2e 0a 20 20 2a  R BY clause..  *
11680 2a 0a 20 20 2a 2a 20 54 68 69 73 20 73 65 63 74  *.  ** This sect
11690 69 6f 6e 20 69 73 20 72 75 6e 20 62 79 20 74 68  ion is run by th
116a0 65 20 72 69 67 68 74 2d 6d 6f 73 74 20 53 45 4c  e right-most SEL
116b0 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 6f 6e  ECT statement on
116c0 6c 79 2e 0a 20 20 2a 2a 20 53 45 4c 45 43 54 20  ly..  ** SELECT 
116d0 73 74 61 74 65 6d 65 6e 74 73 20 74 6f 20 74 68  statements to th
116e0 65 20 6c 65 66 74 20 61 6c 77 61 79 73 20 73 6b  e left always sk
116f0 69 70 20 74 68 69 73 20 70 61 72 74 2e 20 20 54  ip this part.  T
11700 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 0a 20 20  he right-most.  
11710 2a 2a 20 53 45 4c 45 43 54 20 6d 69 67 68 74 20  ** SELECT might 
11720 61 6c 73 6f 20 73 6b 69 70 20 74 68 69 73 20 70  also skip this p
11730 61 72 74 20 69 66 20 69 74 20 68 61 73 20 6e 6f  art if it has no
11740 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65   ORDER BY clause
11750 20 61 6e 64 0a 20 20 2a 2a 20 6e 6f 20 74 65 6d   and.  ** no tem
11760 70 20 74 61 62 6c 65 73 20 61 72 65 20 72 65 71  p tables are req
11770 75 69 72 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66  uired..  */.  if
11780 28 20 70 4f 72 64 65 72 42 79 20 7c 7c 20 70 2d  ( pOrderBy || p-
11790 3e 75 73 65 73 45 70 68 6d 20 29 7b 0a 20 20 20  >usesEphm ){.   
117a0 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20   int i;         
117b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
117c0 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a  * Loop counter *
117d0 2f 0a 20 20 20 20 4b 65 79 49 6e 66 6f 20 2a 70  /.    KeyInfo *p
117e0 4b 65 79 49 6e 66 6f 3b 20 20 20 20 20 20 20 20  KeyInfo;        
117f0 20 20 20 20 2f 2a 20 43 6f 6c 6c 61 74 69 6e 67      /* Collating
11800 20 73 65 71 75 65 6e 63 65 20 66 6f 72 20 74 68   sequence for th
11810 65 20 72 65 73 75 6c 74 20 73 65 74 20 2a 2f 0a  e result set */.
11820 20 20 20 20 53 65 6c 65 63 74 20 2a 70 4c 6f 6f      Select *pLoo
11830 70 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p;              
11840 20 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e 67    /* For looping
11850 20 74 68 72 6f 75 67 68 20 53 45 4c 45 43 54 20   through SELECT 
11860 73 74 61 74 65 6d 65 6e 74 73 20 2a 2f 0a 20 20  statements */.  
11870 20 20 69 6e 74 20 6e 4b 65 79 43 6f 6c 3b 20 20    int nKeyCol;  
11880 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11890 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 65 6e 74  /* Number of ent
118a0 72 69 65 73 20 69 6e 20 70 4b 65 79 49 6e 66 6f  ries in pKeyInfo
118b0 2d 3e 61 43 6f 6c 5b 5d 20 2a 2f 0a 20 20 20 20  ->aCol[] */.    
118c0 43 6f 6c 6c 53 65 71 20 2a 2a 61 70 43 6f 6c 6c  CollSeq **apColl
118d0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
118e0 20 46 6f 72 20 6c 6f 6f 70 69 6e 67 20 74 68 72   For looping thr
118f0 6f 75 67 68 20 70 4b 65 79 49 6e 66 6f 2d 3e 61  ough pKeyInfo->a
11900 43 6f 6c 6c 5b 5d 20 2a 2f 0a 20 20 20 20 43 6f  Coll[] */.    Co
11910 6c 6c 53 65 71 20 2a 2a 61 43 6f 70 79 3b 20 20  llSeq **aCopy;  
11920 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
11930 20 63 6f 70 79 20 6f 66 20 70 4b 65 79 49 6e 66   copy of pKeyInf
11940 6f 2d 3e 61 43 6f 6c 6c 5b 5d 20 2a 2f 0a 0a 20  o->aColl[] */.. 
11950 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 52     assert( p->pR
11960 69 67 68 74 6d 6f 73 74 3d 3d 70 20 29 3b 0a 20  ightmost==p );. 
11970 20 20 20 6e 4b 65 79 43 6f 6c 20 3d 20 6e 43 6f     nKeyCol = nCo
11980 6c 20 2b 20 28 70 4f 72 64 65 72 42 79 20 3f 20  l + (pOrderBy ? 
11990 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 20  pOrderBy->nExpr 
119a0 3a 20 30 29 3b 0a 20 20 20 20 70 4b 65 79 49 6e  : 0);.    pKeyIn
119b0 66 6f 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61  fo = sqlite3DbMa
119c0 6c 6c 6f 63 5a 65 72 6f 28 70 50 61 72 73 65 2d  llocZero(pParse-
119d0 3e 64 62 2c 0a 20 20 20 20 20 20 20 20 20 20 20  >db,.           
119e0 20 20 20 20 20 20 20 20 20 20 20 20 73 69 7a 65              size
119f0 6f 66 28 2a 70 4b 65 79 49 6e 66 6f 29 2b 6e 4b  of(*pKeyInfo)+nK
11a00 65 79 43 6f 6c 2a 28 73 69 7a 65 6f 66 28 43 6f  eyCol*(sizeof(Co
11a10 6c 6c 53 65 71 2a 29 20 2b 20 31 29 29 3b 0a 20  llSeq*) + 1));. 
11a20 20 20 20 69 66 28 20 21 70 4b 65 79 49 6e 66 6f     if( !pKeyInfo
11a30 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53   ){.      rc = S
11a40 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20  QLITE_NOMEM;.   
11a50 20 20 20 67 6f 74 6f 20 6d 75 6c 74 69 5f 73 65     goto multi_se
11a60 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 7d 0a  lect_end;.    }.
11a70 0a 20 20 20 20 70 4b 65 79 49 6e 66 6f 2d 3e 65  .    pKeyInfo->e
11a80 6e 63 20 3d 20 45 4e 43 28 70 50 61 72 73 65 2d  nc = ENC(pParse-
11a90 3e 64 62 29 3b 0a 20 20 20 20 70 4b 65 79 49 6e  >db);.    pKeyIn
11aa0 66 6f 2d 3e 6e 46 69 65 6c 64 20 3d 20 6e 43 6f  fo->nField = nCo
11ab0 6c 3b 0a 0a 20 20 20 20 66 6f 72 28 69 3d 30 2c  l;..    for(i=0,
11ac0 20 61 70 43 6f 6c 6c 3d 70 4b 65 79 49 6e 66 6f   apColl=pKeyInfo
11ad0 2d 3e 61 43 6f 6c 6c 3b 20 69 3c 6e 43 6f 6c 3b  ->aColl; i<nCol;
11ae0 20 69 2b 2b 2c 20 61 70 43 6f 6c 6c 2b 2b 29 7b   i++, apColl++){
11af0 0a 20 20 20 20 20 20 2a 61 70 43 6f 6c 6c 20 3d  .      *apColl =
11b00 20 6d 75 6c 74 69 53 65 6c 65 63 74 43 6f 6c 6c   multiSelectColl
11b10 53 65 71 28 70 50 61 72 73 65 2c 20 70 2c 20 69  Seq(pParse, p, i
11b20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 30 3d 3d  );.      if( 0==
11b30 2a 61 70 43 6f 6c 6c 20 29 7b 0a 20 20 20 20 20  *apColl ){.     
11b40 20 20 20 2a 61 70 43 6f 6c 6c 20 3d 20 70 50 61     *apColl = pPa
11b50 72 73 65 2d 3e 64 62 2d 3e 70 44 66 6c 74 43 6f  rse->db->pDfltCo
11b60 6c 6c 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ll;.      }.    
11b70 7d 0a 0a 20 20 20 20 66 6f 72 28 70 4c 6f 6f 70  }..    for(pLoop
11b80 3d 70 3b 20 70 4c 6f 6f 70 3b 20 70 4c 6f 6f 70  =p; pLoop; pLoop
11b90 3d 70 4c 6f 6f 70 2d 3e 70 50 72 69 6f 72 29 7b  =pLoop->pPrior){
11ba0 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  .      for(i=0; 
11bb0 69 3c 32 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  i<2; i++){.     
11bc0 20 20 20 69 6e 74 20 61 64 64 72 20 3d 20 70 4c     int addr = pL
11bd0 6f 6f 70 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68  oop->addrOpenEph
11be0 6d 5b 69 5d 3b 0a 20 20 20 20 20 20 20 20 69 66  m[i];.        if
11bf0 28 20 61 64 64 72 3c 30 20 29 7b 0a 20 20 20 20  ( addr<0 ){.    
11c00 20 20 20 20 20 20 2f 2a 20 49 66 20 5b 30 5d 20        /* If [0] 
11c10 69 73 20 75 6e 75 73 65 64 20 74 68 65 6e 20 5b  is unused then [
11c20 31 5d 20 69 73 20 61 6c 73 6f 20 75 6e 75 73 65  1] is also unuse
11c30 64 2e 20 20 53 6f 20 77 65 20 63 61 6e 0a 20 20  d.  So we can.  
11c40 20 20 20 20 20 20 20 20 2a 2a 20 61 6c 77 61 79          ** alway
11c50 73 20 73 61 66 65 6c 79 20 61 62 6f 72 74 20 61  s safely abort a
11c60 73 20 73 6f 6f 6e 20 61 73 20 74 68 65 20 66 69  s soon as the fi
11c70 72 73 74 20 75 6e 75 73 65 64 20 73 6c 6f 74 20  rst unused slot 
11c80 69 73 20 66 6f 75 6e 64 20 2a 2f 0a 20 20 20 20  is found */.    
11c90 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 4c        assert( pL
11ca0 6f 6f 70 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68  oop->addrOpenEph
11cb0 6d 5b 31 5d 3c 30 20 29 3b 0a 20 20 20 20 20 20  m[1]<0 );.      
11cc0 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
11cd0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 73 71 6c     }.        sql
11ce0 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 32  ite3VdbeChangeP2
11cf0 28 76 2c 20 61 64 64 72 2c 20 6e 43 6f 6c 29 3b  (v, addr, nCol);
11d00 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
11d10 56 64 62 65 43 68 61 6e 67 65 50 34 28 76 2c 20  VdbeChangeP4(v, 
11d20 61 64 64 72 2c 20 28 63 68 61 72 2a 29 70 4b 65  addr, (char*)pKe
11d30 79 49 6e 66 6f 2c 20 50 34 5f 4b 45 59 49 4e 46  yInfo, P4_KEYINF
11d40 4f 29 3b 0a 20 20 20 20 20 20 20 20 70 4c 6f 6f  O);.        pLoo
11d50 70 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b  p->addrOpenEphm[
11d60 69 5d 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 7d  i] = -1;.      }
11d70 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20  .    }..    if( 
11d80 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20  pOrderBy ){.    
11d90 20 20 73 74 72 75 63 74 20 45 78 70 72 4c 69 73    struct ExprLis
11da0 74 5f 69 74 65 6d 20 2a 70 4f 54 65 72 6d 20 3d  t_item *pOTerm =
11db0 20 70 4f 72 64 65 72 42 79 2d 3e 61 3b 0a 20 20   pOrderBy->a;.  
11dc0 20 20 20 20 69 6e 74 20 6e 4f 72 64 65 72 42 79      int nOrderBy
11dd0 45 78 70 72 20 3d 20 70 4f 72 64 65 72 42 79 2d  Expr = pOrderBy-
11de0 3e 6e 45 78 70 72 3b 0a 20 20 20 20 20 20 69 6e  >nExpr;.      in
11df0 74 20 61 64 64 72 3b 0a 20 20 20 20 20 20 75 38  t addr;.      u8
11e00 20 2a 70 53 6f 72 74 4f 72 64 65 72 3b 0a 0a 20   *pSortOrder;.. 
11e10 20 20 20 20 20 2f 2a 20 52 65 75 73 65 20 74 68       /* Reuse th
11e20 65 20 73 61 6d 65 20 70 4b 65 79 49 6e 66 6f 20  e same pKeyInfo 
11e30 66 6f 72 20 74 68 65 20 4f 52 44 45 52 20 42 59  for the ORDER BY
11e40 20 61 73 20 77 61 73 20 75 73 65 64 20 61 62 6f   as was used abo
11e50 76 65 20 66 6f 72 0a 20 20 20 20 20 20 2a 2a 20  ve for.      ** 
11e60 74 68 65 20 63 6f 6d 70 6f 75 6e 64 20 73 65 6c  the compound sel
11e70 65 63 74 20 73 74 61 74 65 6d 65 6e 74 73 2e 20  ect statements. 
11e80 20 45 78 63 65 70 74 20 77 65 20 68 61 76 65 20   Except we have 
11e90 74 6f 20 63 68 61 6e 67 65 20 6f 75 74 20 74 68  to change out th
11ea0 65 0a 20 20 20 20 20 20 2a 2a 20 70 4b 65 79 49  e.      ** pKeyI
11eb0 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b 5d 20 76 61 6c  nfo->aColl[] val
11ec0 75 65 73 2e 20 20 53 6f 6d 65 20 6f 66 20 74 68  ues.  Some of th
11ed0 65 20 61 43 6f 6c 6c 5b 5d 20 76 61 6c 75 65 73  e aColl[] values
11ee0 20 77 69 6c 6c 20 62 65 0a 20 20 20 20 20 20 2a   will be.      *
11ef0 2a 20 72 65 75 73 65 64 20 77 68 65 6e 20 63 6f  * reused when co
11f00 6e 73 74 72 75 63 74 69 6e 67 20 74 68 65 20 70  nstructing the p
11f10 4b 65 79 49 6e 66 6f 20 66 6f 72 20 74 68 65 20  KeyInfo for the 
11f20 4f 52 44 45 52 20 42 59 2c 20 73 6f 20 6d 61 6b  ORDER BY, so mak
11f30 65 0a 20 20 20 20 20 20 2a 2a 20 61 20 63 6f 70  e.      ** a cop
11f40 79 2e 20 20 53 75 66 66 69 63 69 65 6e 74 20 73  y.  Sufficient s
11f50 70 61 63 65 20 74 6f 20 68 6f 6c 64 20 62 6f 74  pace to hold bot
11f60 68 20 74 68 65 20 6e 43 6f 6c 20 65 6e 74 72 69  h the nCol entri
11f70 65 73 20 66 6f 72 0a 20 20 20 20 20 20 2a 2a 20  es for.      ** 
11f80 74 68 65 20 63 6f 6d 70 6f 75 6e 64 20 73 65 6c  the compound sel
11f90 65 63 74 20 61 6e 64 20 74 68 65 20 6e 4f 72 64  ect and the nOrd
11fa0 65 72 62 79 45 78 70 72 20 65 6e 74 72 69 65 73  erbyExpr entries
11fb0 20 66 6f 72 20 74 68 65 20 4f 52 44 45 52 20 42   for the ORDER B
11fc0 59 0a 20 20 20 20 20 20 2a 2a 20 77 61 73 20 61  Y.      ** was a
11fd0 6c 6c 6f 63 61 74 65 64 20 61 62 6f 76 65 2e 20  llocated above. 
11fe0 20 42 75 74 20 77 65 20 6e 65 65 64 20 74 6f 20   But we need to 
11ff0 6d 6f 76 65 20 74 68 65 20 63 6f 6d 70 6f 75 6e  move the compoun
12000 64 20 73 65 6c 65 63 74 0a 20 20 20 20 20 20 2a  d select.      *
12010 2a 20 65 6e 74 72 69 65 73 20 6f 75 74 20 6f 66  * entries out of
12020 20 74 68 65 20 77 61 79 20 62 65 66 6f 72 65 20   the way before 
12030 63 6f 6e 73 74 72 75 63 74 69 6e 67 20 74 68 65  constructing the
12040 20 4f 52 44 45 52 20 42 59 20 65 6e 74 72 69 65   ORDER BY entrie
12050 73 2e 0a 20 20 20 20 20 20 2a 2a 20 4d 6f 76 65  s..      ** Move
12060 20 74 68 65 20 63 6f 6d 70 6f 75 6e 64 20 73 65   the compound se
12070 6c 65 63 74 20 65 6e 74 72 69 65 73 20 69 6e 74  lect entries int
12080 6f 20 61 43 6f 70 79 5b 5d 20 77 68 65 72 65 20  o aCopy[] where 
12090 74 68 65 79 20 63 61 6e 20 62 65 0a 20 20 20 20  they can be.    
120a0 20 20 2a 2a 20 61 63 63 65 73 73 65 64 20 61 6e    ** accessed an
120b0 64 20 72 65 75 73 65 64 20 77 68 65 6e 20 63 6f  d reused when co
120c0 6e 73 74 72 75 63 74 69 6e 67 20 74 68 65 20 4f  nstructing the O
120d0 52 44 45 52 20 42 59 20 65 6e 74 72 69 65 73 2e  RDER BY entries.
120e0 0a 20 20 20 20 20 20 2a 2a 20 42 65 63 61 75 73  .      ** Becaus
120f0 65 20 6e 43 6f 6c 20 6d 69 67 68 74 20 62 65 20  e nCol might be 
12100 67 72 65 61 74 65 72 20 74 68 61 6e 20 6f 72 20  greater than or 
12110 6c 65 73 73 20 74 68 61 6e 20 6e 4f 72 64 65 72  less than nOrder
12120 42 79 45 78 70 72 0a 20 20 20 20 20 20 2a 2a 20  ByExpr.      ** 
12130 77 65 20 68 61 76 65 20 74 6f 20 75 73 65 20 6d  we have to use m
12140 65 6d 6d 6f 76 65 28 29 20 77 68 65 6e 20 64 6f  emmove() when do
12150 69 6e 67 20 74 68 65 20 63 6f 70 79 2e 0a 20 20  ing the copy..  
12160 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 61 43 6f      */.      aCo
12170 70 79 20 3d 20 26 70 4b 65 79 49 6e 66 6f 2d 3e  py = &pKeyInfo->
12180 61 43 6f 6c 6c 5b 6e 4f 72 64 65 72 42 79 45 78  aColl[nOrderByEx
12190 70 72 5d 3b 0a 20 20 20 20 20 20 70 53 6f 72 74  pr];.      pSort
121a0 4f 72 64 65 72 20 3d 20 70 4b 65 79 49 6e 66 6f  Order = pKeyInfo
121b0 2d 3e 61 53 6f 72 74 4f 72 64 65 72 20 3d 20 28  ->aSortOrder = (
121c0 75 38 2a 29 26 61 43 6f 70 79 5b 6e 43 6f 6c 5d  u8*)&aCopy[nCol]
121d0 3b 0a 20 20 20 20 20 20 6d 65 6d 6d 6f 76 65 28  ;.      memmove(
121e0 61 43 6f 70 79 2c 20 70 4b 65 79 49 6e 66 6f 2d  aCopy, pKeyInfo-
121f0 3e 61 43 6f 6c 6c 2c 20 6e 43 6f 6c 2a 73 69 7a  >aColl, nCol*siz
12200 65 6f 66 28 43 6f 6c 6c 53 65 71 2a 29 29 3b 0a  eof(CollSeq*));.
12210 0a 20 20 20 20 20 20 61 70 43 6f 6c 6c 20 3d 20  .      apColl = 
12220 70 4b 65 79 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 3b  pKeyInfo->aColl;
12230 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  .      for(i=0; 
12240 69 3c 6e 4f 72 64 65 72 42 79 45 78 70 72 3b 20  i<nOrderByExpr; 
12250 69 2b 2b 2c 20 70 4f 54 65 72 6d 2b 2b 2c 20 61  i++, pOTerm++, a
12260 70 43 6f 6c 6c 2b 2b 2c 20 70 53 6f 72 74 4f 72  pColl++, pSortOr
12270 64 65 72 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  der++){.        
12280 45 78 70 72 20 2a 70 45 78 70 72 20 3d 20 70 4f  Expr *pExpr = pO
12290 54 65 72 6d 2d 3e 70 45 78 70 72 3b 0a 20 20 20  Term->pExpr;.   
122a0 20 20 20 20 20 69 66 28 20 28 70 45 78 70 72 2d       if( (pExpr-
122b0 3e 66 6c 61 67 73 20 26 20 45 50 5f 45 78 70 43  >flags & EP_ExpC
122c0 6f 6c 6c 61 74 65 29 20 29 7b 0a 20 20 20 20 20  ollate) ){.     
122d0 20 20 20 20 20 61 73 73 65 72 74 28 20 70 45 78       assert( pEx
122e0 70 72 2d 3e 70 43 6f 6c 6c 21 3d 30 20 29 3b 0a  pr->pColl!=0 );.
122f0 20 20 20 20 20 20 20 20 20 20 2a 61 70 43 6f 6c            *apCol
12300 6c 20 3d 20 70 45 78 70 72 2d 3e 70 43 6f 6c 6c  l = pExpr->pColl
12310 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  ;.        }else{
12320 0a 20 20 20 20 20 20 20 20 20 20 2a 61 70 43 6f  .          *apCo
12330 6c 6c 20 3d 20 61 43 6f 70 79 5b 70 45 78 70 72  ll = aCopy[pExpr
12340 2d 3e 69 43 6f 6c 75 6d 6e 5d 3b 0a 20 20 20 20  ->iColumn];.    
12350 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 2a 70      }.        *p
12360 53 6f 72 74 4f 72 64 65 72 20 3d 20 70 4f 54 65  SortOrder = pOTe
12370 72 6d 2d 3e 73 6f 72 74 4f 72 64 65 72 3b 0a 20  rm->sortOrder;. 
12380 20 20 20 20 20 7d 0a 20 20 20 20 20 20 61 73 73       }.      ass
12390 65 72 74 28 20 70 2d 3e 70 52 69 67 68 74 6d 6f  ert( p->pRightmo
123a0 73 74 3d 3d 70 20 29 3b 0a 20 20 20 20 20 20 61  st==p );.      a
123b0 73 73 65 72 74 28 20 70 2d 3e 61 64 64 72 4f 70  ssert( p->addrOp
123c0 65 6e 45 70 68 6d 5b 32 5d 3e 3d 30 20 29 3b 0a  enEphm[2]>=0 );.
123d0 20 20 20 20 20 20 61 64 64 72 20 3d 20 70 2d 3e        addr = p->
123e0 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b 32 5d 3b  addrOpenEphm[2];
123f0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
12400 62 65 43 68 61 6e 67 65 50 32 28 76 2c 20 61 64  beChangeP2(v, ad
12410 64 72 2c 20 70 2d 3e 70 4f 72 64 65 72 42 79 2d  dr, p->pOrderBy-
12420 3e 6e 45 78 70 72 2b 32 29 3b 0a 20 20 20 20 20  >nExpr+2);.     
12430 20 70 4b 65 79 49 6e 66 6f 2d 3e 6e 46 69 65 6c   pKeyInfo->nFiel
12440 64 20 3d 20 6e 4f 72 64 65 72 42 79 45 78 70 72  d = nOrderByExpr
12450 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
12460 64 62 65 43 68 61 6e 67 65 50 34 28 76 2c 20 61  dbeChangeP4(v, a
12470 64 64 72 2c 20 28 63 68 61 72 2a 29 70 4b 65 79  ddr, (char*)pKey
12480 49 6e 66 6f 2c 20 50 34 5f 4b 45 59 49 4e 46 4f  Info, P4_KEYINFO
12490 5f 48 41 4e 44 4f 46 46 29 3b 0a 20 20 20 20 20  _HANDOFF);.     
124a0 20 70 4b 65 79 49 6e 66 6f 20 3d 20 30 3b 0a 20   pKeyInfo = 0;. 
124b0 20 20 20 20 20 67 65 6e 65 72 61 74 65 53 6f 72       generateSor
124c0 74 54 61 69 6c 28 70 50 61 72 73 65 2c 20 70 2c  tTail(pParse, p,
124d0 20 76 2c 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e   v, p->pEList->n
124e0 45 78 70 72 2c 20 26 64 65 73 74 29 3b 0a 20 20  Expr, &dest);.  
124f0 20 20 7d 0a 0a 20 20 20 20 73 71 6c 69 74 65 33    }..    sqlite3
12500 5f 66 72 65 65 28 70 4b 65 79 49 6e 66 6f 29 3b  _free(pKeyInfo);
12510 0a 20 20 7d 0a 0a 6d 75 6c 74 69 5f 73 65 6c 65  .  }..multi_sele
12520 63 74 5f 65 6e 64 3a 0a 20 20 72 65 74 75 72 6e  ct_end:.  return
12530 20 72 63 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a   rc;.}.#endif /*
12540 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f 4d   SQLITE_OMIT_COM
12550 50 4f 55 4e 44 5f 53 45 4c 45 43 54 20 2a 2f 0a  POUND_SELECT */.
12560 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
12570 4f 4d 49 54 5f 56 49 45 57 0a 2f 2a 20 46 6f 72  OMIT_VIEW./* For
12580 77 61 72 64 20 44 65 63 6c 61 72 61 74 69 6f 6e  ward Declaration
12590 73 20 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  s */.static void
125a0 20 73 75 62 73 74 45 78 70 72 4c 69 73 74 28 73   substExprList(s
125b0 71 6c 69 74 65 33 2a 2c 20 45 78 70 72 4c 69 73  qlite3*, ExprLis
125c0 74 2a 2c 20 69 6e 74 2c 20 45 78 70 72 4c 69 73  t*, int, ExprLis
125d0 74 2a 29 3b 0a 73 74 61 74 69 63 20 76 6f 69 64  t*);.static void
125e0 20 73 75 62 73 74 53 65 6c 65 63 74 28 73 71 6c   substSelect(sql
125f0 69 74 65 33 2a 2c 20 53 65 6c 65 63 74 20 2a 2c  ite3*, Select *,
12600 20 69 6e 74 2c 20 45 78 70 72 4c 69 73 74 20 2a   int, ExprList *
12610 29 3b 0a 0a 2f 2a 0a 2a 2a 20 53 63 61 6e 20 74  );../*.** Scan t
12620 68 72 6f 75 67 68 20 74 68 65 20 65 78 70 72 65  hrough the expre
12630 73 73 69 6f 6e 20 70 45 78 70 72 2e 20 20 52 65  ssion pExpr.  Re
12640 70 6c 61 63 65 20 65 76 65 72 79 20 72 65 66 65  place every refe
12650 72 65 6e 63 65 20 74 6f 0a 2a 2a 20 61 20 63 6f  rence to.** a co
12660 6c 75 6d 6e 20 69 6e 20 74 61 62 6c 65 20 6e 75  lumn in table nu
12670 6d 62 65 72 20 69 54 61 62 6c 65 20 77 69 74 68  mber iTable with
12680 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20 69   a copy of the i
12690 43 6f 6c 75 6d 6e 2d 74 68 0a 2a 2a 20 65 6e 74  Column-th.** ent
126a0 72 79 20 69 6e 20 70 45 4c 69 73 74 2e 20 20 28  ry in pEList.  (
126b0 42 75 74 20 6c 65 61 76 65 20 72 65 66 65 72 65  But leave refere
126c0 6e 63 65 73 20 74 6f 20 74 68 65 20 52 4f 57 49  nces to the ROWI
126d0 44 20 63 6f 6c 75 6d 6e 20 0a 2a 2a 20 75 6e 63  D column .** unc
126e0 68 61 6e 67 65 64 2e 29 0a 2a 2a 0a 2a 2a 20 54  hanged.).**.** T
126f0 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 70  his routine is p
12700 61 72 74 20 6f 66 20 74 68 65 20 66 6c 61 74 74  art of the flatt
12710 65 6e 69 6e 67 20 70 72 6f 63 65 64 75 72 65 2e  ening procedure.
12720 20 20 41 20 73 75 62 71 75 65 72 79 0a 2a 2a 20    A subquery.** 
12730 77 68 6f 73 65 20 72 65 73 75 6c 74 20 73 65 74  whose result set
12740 20 69 73 20 64 65 66 69 6e 65 64 20 62 79 20 70   is defined by p
12750 45 4c 69 73 74 20 61 70 70 65 61 72 73 20 61 73  EList appears as
12760 20 65 6e 74 72 79 20 69 6e 20 74 68 65 0a 2a 2a   entry in the.**
12770 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20   FROM clause of 
12780 61 20 53 45 4c 45 43 54 20 73 75 63 68 20 74 68  a SELECT such th
12790 61 74 20 74 68 65 20 56 44 42 45 20 63 75 72 73  at the VDBE curs
127a0 6f 72 20 61 73 73 69 67 6e 65 64 20 74 6f 20 74  or assigned to t
127b0 68 61 74 0a 2a 2a 20 46 4f 52 4d 20 63 6c 61 75  hat.** FORM clau
127c0 73 65 20 65 6e 74 72 79 20 69 73 20 69 54 61 62  se entry is iTab
127d0 6c 65 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e  le.  This routin
127e0 65 20 6d 61 6b 65 20 74 68 65 20 6e 65 63 65 73  e make the neces
127f0 73 61 72 79 20 0a 2a 2a 20 63 68 61 6e 67 65 73  sary .** changes
12800 20 74 6f 20 70 45 78 70 72 20 73 6f 20 74 68 61   to pExpr so tha
12810 74 20 69 74 20 72 65 66 65 72 73 20 64 69 72 65  t it refers dire
12820 63 74 6c 79 20 74 6f 20 74 68 65 20 73 6f 75 72  ctly to the sour
12830 63 65 20 74 61 62 6c 65 0a 2a 2a 20 6f 66 20 74  ce table.** of t
12840 68 65 20 73 75 62 71 75 65 72 79 20 72 61 74 68  he subquery rath
12850 65 72 20 74 68 65 20 72 65 73 75 6c 74 20 73 65  er the result se
12860 74 20 6f 66 20 74 68 65 20 73 75 62 71 75 65 72  t of the subquer
12870 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  y..*/.static voi
12880 64 20 73 75 62 73 74 45 78 70 72 28 0a 20 20 73  d substExpr(.  s
12890 71 6c 69 74 65 33 20 2a 64 62 2c 20 20 20 20 20  qlite3 *db,     
128a0 20 20 20 2f 2a 20 52 65 70 6f 72 74 20 6d 61 6c     /* Report mal
128b0 6c 6f 63 20 65 72 72 6f 72 73 20 74 6f 20 74 68  loc errors to th
128c0 69 73 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f  is connection */
128d0 0a 20 20 45 78 70 72 20 2a 70 45 78 70 72 2c 20  .  Expr *pExpr, 
128e0 20 20 20 20 20 20 20 2f 2a 20 45 78 70 72 20 69         /* Expr i
128f0 6e 20 77 68 69 63 68 20 73 75 62 73 74 69 74 75  n which substitu
12900 74 69 6f 6e 20 6f 63 63 75 72 73 20 2a 2f 0a 20  tion occurs */. 
12910 20 69 6e 74 20 69 54 61 62 6c 65 2c 20 20 20 20   int iTable,    
12920 20 20 20 20 20 2f 2a 20 54 61 62 6c 65 20 74 6f       /* Table to
12930 20 62 65 20 73 75 62 73 74 69 74 75 74 65 64 20   be substituted 
12940 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70  */.  ExprList *p
12950 45 4c 69 73 74 20 20 20 20 2f 2a 20 53 75 62 73  EList    /* Subs
12960 74 69 74 75 74 65 20 65 78 70 72 65 73 73 69 6f  titute expressio
12970 6e 73 20 2a 2f 0a 29 7b 0a 20 20 69 66 28 20 70  ns */.){.  if( p
12980 45 78 70 72 3d 3d 30 20 29 20 72 65 74 75 72 6e  Expr==0 ) return
12990 3b 0a 20 20 69 66 28 20 70 45 78 70 72 2d 3e 6f  ;.  if( pExpr->o
129a0 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 26 26 20  p==TK_COLUMN && 
129b0 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 3d 3d 69  pExpr->iTable==i
129c0 54 61 62 6c 65 20 29 7b 0a 20 20 20 20 69 66 28  Table ){.    if(
129d0 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3c   pExpr->iColumn<
129e0 30 20 29 7b 0a 20 20 20 20 20 20 70 45 78 70 72  0 ){.      pExpr
129f0 2d 3e 6f 70 20 3d 20 54 4b 5f 4e 55 4c 4c 3b 0a  ->op = TK_NULL;.
12a00 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
12a10 20 45 78 70 72 20 2a 70 4e 65 77 3b 0a 20 20 20   Expr *pNew;.   
12a20 20 20 20 61 73 73 65 72 74 28 20 70 45 4c 69 73     assert( pELis
12a30 74 21 3d 30 20 26 26 20 70 45 78 70 72 2d 3e 69  t!=0 && pExpr->i
12a40 43 6f 6c 75 6d 6e 3c 70 45 4c 69 73 74 2d 3e 6e  Column<pEList->n
12a50 45 78 70 72 20 29 3b 0a 20 20 20 20 20 20 61 73  Expr );.      as
12a60 73 65 72 74 28 20 70 45 78 70 72 2d 3e 70 4c 65  sert( pExpr->pLe
12a70 66 74 3d 3d 30 20 26 26 20 70 45 78 70 72 2d 3e  ft==0 && pExpr->
12a80 70 52 69 67 68 74 3d 3d 30 20 26 26 20 70 45 78  pRight==0 && pEx
12a90 70 72 2d 3e 70 4c 69 73 74 3d 3d 30 20 29 3b 0a  pr->pList==0 );.
12aa0 20 20 20 20 20 20 70 4e 65 77 20 3d 20 70 45 4c        pNew = pEL
12ab0 69 73 74 2d 3e 61 5b 70 45 78 70 72 2d 3e 69 43  ist->a[pExpr->iC
12ac0 6f 6c 75 6d 6e 5d 2e 70 45 78 70 72 3b 0a 20 20  olumn].pExpr;.  
12ad0 20 20 20 20 61 73 73 65 72 74 28 20 70 4e 65 77      assert( pNew
12ae0 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 70 45 78  !=0 );.      pEx
12af0 70 72 2d 3e 6f 70 20 3d 20 70 4e 65 77 2d 3e 6f  pr->op = pNew->o
12b00 70 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  p;.      assert(
12b10 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 3d 3d 30   pExpr->pLeft==0
12b20 20 29 3b 0a 20 20 20 20 20 20 70 45 78 70 72 2d   );.      pExpr-
12b30 3e 70 4c 65 66 74 20 3d 20 73 71 6c 69 74 65 33  >pLeft = sqlite3
12b40 45 78 70 72 44 75 70 28 64 62 2c 20 70 4e 65 77  ExprDup(db, pNew
12b50 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 20 20 20 20  ->pLeft);.      
12b60 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 70  assert( pExpr->p
12b70 52 69 67 68 74 3d 3d 30 20 29 3b 0a 20 20 20 20  Right==0 );.    
12b80 20 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 20    pExpr->pRight 
12b90 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44 75 70  = sqlite3ExprDup
12ba0 28 64 62 2c 20 70 4e 65 77 2d 3e 70 52 69 67 68  (db, pNew->pRigh
12bb0 74 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  t);.      assert
12bc0 28 20 70 45 78 70 72 2d 3e 70 4c 69 73 74 3d 3d  ( pExpr->pList==
12bd0 30 20 29 3b 0a 20 20 20 20 20 20 70 45 78 70 72  0 );.      pExpr
12be0 2d 3e 70 4c 69 73 74 20 3d 20 73 71 6c 69 74 65  ->pList = sqlite
12bf0 33 45 78 70 72 4c 69 73 74 44 75 70 28 64 62 2c  3ExprListDup(db,
12c00 20 70 4e 65 77 2d 3e 70 4c 69 73 74 29 3b 0a 20   pNew->pList);. 
12c10 20 20 20 20 20 70 45 78 70 72 2d 3e 69 54 61 62       pExpr->iTab
12c20 6c 65 20 3d 20 70 4e 65 77 2d 3e 69 54 61 62 6c  le = pNew->iTabl
12c30 65 3b 0a 20 20 20 20 20 20 70 45 78 70 72 2d 3e  e;.      pExpr->
12c40 70 54 61 62 20 3d 20 70 4e 65 77 2d 3e 70 54 61  pTab = pNew->pTa
12c50 62 3b 0a 20 20 20 20 20 20 70 45 78 70 72 2d 3e  b;.      pExpr->
12c60 69 43 6f 6c 75 6d 6e 20 3d 20 70 4e 65 77 2d 3e  iColumn = pNew->
12c70 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20 20 70  iColumn;.      p
12c80 45 78 70 72 2d 3e 69 41 67 67 20 3d 20 70 4e 65  Expr->iAgg = pNe
12c90 77 2d 3e 69 41 67 67 3b 0a 20 20 20 20 20 20 73  w->iAgg;.      s
12ca0 71 6c 69 74 65 33 54 6f 6b 65 6e 43 6f 70 79 28  qlite3TokenCopy(
12cb0 64 62 2c 20 26 70 45 78 70 72 2d 3e 74 6f 6b 65  db, &pExpr->toke
12cc0 6e 2c 20 26 70 4e 65 77 2d 3e 74 6f 6b 65 6e 29  n, &pNew->token)
12cd0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 54  ;.      sqlite3T
12ce0 6f 6b 65 6e 43 6f 70 79 28 64 62 2c 20 26 70 45  okenCopy(db, &pE
12cf0 78 70 72 2d 3e 73 70 61 6e 2c 20 26 70 4e 65 77  xpr->span, &pNew
12d00 2d 3e 73 70 61 6e 29 3b 0a 20 20 20 20 20 20 70  ->span);.      p
12d10 45 78 70 72 2d 3e 70 53 65 6c 65 63 74 20 3d 20  Expr->pSelect = 
12d20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 75 70  sqlite3SelectDup
12d30 28 64 62 2c 20 70 4e 65 77 2d 3e 70 53 65 6c 65  (db, pNew->pSele
12d40 63 74 29 3b 0a 20 20 20 20 20 20 70 45 78 70 72  ct);.      pExpr
12d50 2d 3e 66 6c 61 67 73 20 3d 20 70 4e 65 77 2d 3e  ->flags = pNew->
12d60 66 6c 61 67 73 3b 0a 20 20 20 20 7d 0a 20 20 7d  flags;.    }.  }
12d70 65 6c 73 65 7b 0a 20 20 20 20 73 75 62 73 74 45  else{.    substE
12d80 78 70 72 28 64 62 2c 20 70 45 78 70 72 2d 3e 70  xpr(db, pExpr->p
12d90 4c 65 66 74 2c 20 69 54 61 62 6c 65 2c 20 70 45  Left, iTable, pE
12da0 4c 69 73 74 29 3b 0a 20 20 20 20 73 75 62 73 74  List);.    subst
12db0 45 78 70 72 28 64 62 2c 20 70 45 78 70 72 2d 3e  Expr(db, pExpr->
12dc0 70 52 69 67 68 74 2c 20 69 54 61 62 6c 65 2c 20  pRight, iTable, 
12dd0 70 45 4c 69 73 74 29 3b 0a 20 20 20 20 73 75 62  pEList);.    sub
12de0 73 74 53 65 6c 65 63 74 28 64 62 2c 20 70 45 78  stSelect(db, pEx
12df0 70 72 2d 3e 70 53 65 6c 65 63 74 2c 20 69 54 61  pr->pSelect, iTa
12e00 62 6c 65 2c 20 70 45 4c 69 73 74 29 3b 0a 20 20  ble, pEList);.  
12e10 20 20 73 75 62 73 74 45 78 70 72 4c 69 73 74 28    substExprList(
12e20 64 62 2c 20 70 45 78 70 72 2d 3e 70 4c 69 73 74  db, pExpr->pList
12e30 2c 20 69 54 61 62 6c 65 2c 20 70 45 4c 69 73 74  , iTable, pEList
12e40 29 3b 0a 20 20 7d 0a 7d 0a 73 74 61 74 69 63 20  );.  }.}.static 
12e50 76 6f 69 64 20 73 75 62 73 74 45 78 70 72 4c 69  void substExprLi
12e60 73 74 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  st(.  sqlite3 *d
12e70 62 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65  b,         /* Re
12e80 70 6f 72 74 20 6d 61 6c 6c 6f 63 20 65 72 72 6f  port malloc erro
12e90 72 73 20 68 65 72 65 20 2a 2f 0a 20 20 45 78 70  rs here */.  Exp
12ea0 72 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20 20 20  rList *pList,   
12eb0 20 20 2f 2a 20 4c 69 73 74 20 74 6f 20 73 63 61    /* List to sca
12ec0 6e 20 61 6e 64 20 69 6e 20 77 68 69 63 68 20 74  n and in which t
12ed0 6f 20 6d 61 6b 65 20 73 75 62 73 74 69 74 75 74  o make substitut
12ee0 65 73 20 2a 2f 0a 20 20 69 6e 74 20 69 54 61 62  es */.  int iTab
12ef0 6c 65 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20  le,          /* 
12f00 54 61 62 6c 65 20 74 6f 20 62 65 20 73 75 62 73  Table to be subs
12f10 74 69 74 75 74 65 64 20 2a 2f 0a 20 20 45 78 70  tituted */.  Exp
12f20 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 20 20 20  rList *pEList   
12f30 20 20 2f 2a 20 53 75 62 73 74 69 74 75 74 65 20    /* Substitute 
12f40 76 61 6c 75 65 73 20 2a 2f 0a 29 7b 0a 20 20 69  values */.){.  i
12f50 6e 74 20 69 3b 0a 20 20 69 66 28 20 70 4c 69 73  nt i;.  if( pLis
12f60 74 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20  t==0 ) return;. 
12f70 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4c 69 73   for(i=0; i<pLis
12f80 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a  t->nExpr; i++){.
12f90 20 20 20 20 73 75 62 73 74 45 78 70 72 28 64 62      substExpr(db
12fa0 2c 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45  , pList->a[i].pE
12fb0 78 70 72 2c 20 69 54 61 62 6c 65 2c 20 70 45 4c  xpr, iTable, pEL
12fc0 69 73 74 29 3b 0a 20 20 7d 0a 7d 0a 73 74 61 74  ist);.  }.}.stat
12fd0 69 63 20 76 6f 69 64 20 73 75 62 73 74 53 65 6c  ic void substSel
12fe0 65 63 74 28 0a 20 20 73 71 6c 69 74 65 33 20 2a  ect(.  sqlite3 *
12ff0 64 62 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 52  db,         /* R
13000 65 70 6f 72 74 20 6d 61 6c 6c 6f 63 20 65 72 72  eport malloc err
13010 6f 72 73 20 68 65 72 65 20 2a 2f 0a 20 20 53 65  ors here */.  Se
13020 6c 65 63 74 20 2a 70 2c 20 20 20 20 20 20 20 20  lect *p,        
13030 20 20 20 2f 2a 20 53 45 4c 45 43 54 20 73 74 61     /* SELECT sta
13040 74 65 6d 65 6e 74 20 69 6e 20 77 68 69 63 68 20  tement in which 
13050 74 6f 20 6d 61 6b 65 20 73 75 62 73 74 69 74 75  to make substitu
13060 74 69 6f 6e 73 20 2a 2f 0a 20 20 69 6e 74 20 69  tions */.  int i
13070 54 61 62 6c 65 2c 20 20 20 20 20 20 20 20 20 20  Table,          
13080 2f 2a 20 54 61 62 6c 65 20 74 6f 20 62 65 20 72  /* Table to be r
13090 65 70 6c 61 63 65 64 20 2a 2f 0a 20 20 45 78 70  eplaced */.  Exp
130a0 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 20 20 20  rList *pEList   
130b0 20 20 2f 2a 20 53 75 62 73 74 69 74 75 74 65 20    /* Substitute 
130c0 76 61 6c 75 65 73 20 2a 2f 0a 29 7b 0a 20 20 69  values */.){.  i
130d0 66 28 20 21 70 20 29 20 72 65 74 75 72 6e 3b 0a  f( !p ) return;.
130e0 20 20 73 75 62 73 74 45 78 70 72 4c 69 73 74 28    substExprList(
130f0 64 62 2c 20 70 2d 3e 70 45 4c 69 73 74 2c 20 69  db, p->pEList, i
13100 54 61 62 6c 65 2c 20 70 45 4c 69 73 74 29 3b 0a  Table, pEList);.
13110 20 20 73 75 62 73 74 45 78 70 72 4c 69 73 74 28    substExprList(
13120 64 62 2c 20 70 2d 3e 70 47 72 6f 75 70 42 79 2c  db, p->pGroupBy,
13130 20 69 54 61 62 6c 65 2c 20 70 45 4c 69 73 74 29   iTable, pEList)
13140 3b 0a 20 20 73 75 62 73 74 45 78 70 72 4c 69 73  ;.  substExprLis
13150 74 28 64 62 2c 20 70 2d 3e 70 4f 72 64 65 72 42  t(db, p->pOrderB
13160 79 2c 20 69 54 61 62 6c 65 2c 20 70 45 4c 69 73  y, iTable, pELis
13170 74 29 3b 0a 20 20 73 75 62 73 74 45 78 70 72 28  t);.  substExpr(
13180 64 62 2c 20 70 2d 3e 70 48 61 76 69 6e 67 2c 20  db, p->pHaving, 
13190 69 54 61 62 6c 65 2c 20 70 45 4c 69 73 74 29 3b  iTable, pEList);
131a0 0a 20 20 73 75 62 73 74 45 78 70 72 28 64 62 2c  .  substExpr(db,
131b0 20 70 2d 3e 70 57 68 65 72 65 2c 20 69 54 61 62   p->pWhere, iTab
131c0 6c 65 2c 20 70 45 4c 69 73 74 29 3b 0a 20 20 73  le, pEList);.  s
131d0 75 62 73 74 53 65 6c 65 63 74 28 64 62 2c 20 70  ubstSelect(db, p
131e0 2d 3e 70 50 72 69 6f 72 2c 20 69 54 61 62 6c 65  ->pPrior, iTable
131f0 2c 20 70 45 4c 69 73 74 29 3b 0a 7d 0a 23 65 6e  , pEList);.}.#en
13200 64 69 66 20 2f 2a 20 21 64 65 66 69 6e 65 64 28  dif /* !defined(
13210 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57  SQLITE_OMIT_VIEW
13220 29 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51  ) */..#ifndef SQ
13230 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 0a 2f  LITE_OMIT_VIEW./
13240 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
13250 65 20 61 74 74 65 6d 70 74 73 20 74 6f 20 66 6c  e attempts to fl
13260 61 74 74 65 6e 20 73 75 62 71 75 65 72 69 65 73  atten subqueries
13270 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 73 70 65   in order to spe
13280 65 64 0a 2a 2a 20 65 78 65 63 75 74 69 6f 6e 2e  ed.** execution.
13290 20 20 49 74 20 72 65 74 75 72 6e 73 20 31 20 69    It returns 1 i
132a0 66 20 69 74 20 6d 61 6b 65 73 20 63 68 61 6e 67  f it makes chang
132b0 65 73 20 61 6e 64 20 30 20 69 66 20 6e 6f 20 66  es and 0 if no f
132c0 6c 61 74 74 65 6e 69 6e 67 0a 2a 2a 20 6f 63 63  lattening.** occ
132d0 75 72 73 2e 0a 2a 2a 0a 2a 2a 20 54 6f 20 75 6e  urs..**.** To un
132e0 64 65 72 73 74 61 6e 64 20 74 68 65 20 63 6f 6e  derstand the con
132f0 63 65 70 74 20 6f 66 20 66 6c 61 74 74 65 6e 69  cept of flatteni
13300 6e 67 2c 20 63 6f 6e 73 69 64 65 72 20 74 68 65  ng, consider the
13310 20 66 6f 6c 6c 6f 77 69 6e 67 0a 2a 2a 20 71 75   following.** qu
13320 65 72 79 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53  ery:.**.**     S
13330 45 4c 45 43 54 20 61 20 46 52 4f 4d 20 28 53 45  ELECT a FROM (SE
13340 4c 45 43 54 20 78 2b 79 20 41 53 20 61 20 46 52  LECT x+y AS a FR
13350 4f 4d 20 74 31 20 57 48 45 52 45 20 7a 3c 31 30  OM t1 WHERE z<10
13360 30 29 20 57 48 45 52 45 20 61 3e 35 0a 2a 2a 0a  0) WHERE a>5.**.
13370 2a 2a 20 54 68 65 20 64 65 66 61 75 6c 74 20 77  ** The default w
13380 61 79 20 6f 66 20 69 6d 70 6c 65 6d 65 6e 74 69  ay of implementi
13390 6e 67 20 74 68 69 73 20 71 75 65 72 79 20 69 73  ng this query is
133a0 20 74 6f 20 65 78 65 63 75 74 65 20 74 68 65 0a   to execute the.
133b0 2a 2a 20 73 75 62 71 75 65 72 79 20 66 69 72 73  ** subquery firs
133c0 74 20 61 6e 64 20 73 74 6f 72 65 20 74 68 65 20  t and store the 
133d0 72 65 73 75 6c 74 73 20 69 6e 20 61 20 74 65 6d  results in a tem
133e0 70 6f 72 61 72 79 20 74 61 62 6c 65 2c 20 74 68  porary table, th
133f0 65 6e 0a 2a 2a 20 72 75 6e 20 74 68 65 20 6f 75  en.** run the ou
13400 74 65 72 20 71 75 65 72 79 20 6f 6e 20 74 68 61  ter query on tha
13410 74 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c  t temporary tabl
13420 65 2e 20 20 54 68 69 73 20 72 65 71 75 69 72 65  e.  This require
13430 73 20 74 77 6f 0a 2a 2a 20 70 61 73 73 65 73 20  s two.** passes 
13440 6f 76 65 72 20 74 68 65 20 64 61 74 61 2e 20 20  over the data.  
13450 46 75 72 74 68 65 72 6d 6f 72 65 2c 20 62 65 63  Furthermore, bec
13460 61 75 73 65 20 74 68 65 20 74 65 6d 70 6f 72 61  ause the tempora
13470 72 79 20 74 61 62 6c 65 0a 2a 2a 20 68 61 73 20  ry table.** has 
13480 6e 6f 20 69 6e 64 69 63 65 73 2c 20 74 68 65 20  no indices, the 
13490 57 48 45 52 45 20 63 6c 61 75 73 65 20 6f 6e 20  WHERE clause on 
134a0 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20  the outer query 
134b0 63 61 6e 6e 6f 74 20 62 65 0a 2a 2a 20 6f 70 74  cannot be.** opt
134c0 69 6d 69 7a 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68  imized..**.** Th
134d0 69 73 20 72 6f 75 74 69 6e 65 20 61 74 74 65 6d  is routine attem
134e0 70 74 73 20 74 6f 20 72 65 77 72 69 74 65 20 71  pts to rewrite q
134f0 75 65 72 69 65 73 20 73 75 63 68 20 61 73 20 74  ueries such as t
13500 68 65 20 61 62 6f 76 65 20 69 6e 74 6f 0a 2a 2a  he above into.**
13510 20 61 20 73 69 6e 67 6c 65 20 66 6c 61 74 20 73   a single flat s
13520 65 6c 65 63 74 2c 20 6c 69 6b 65 20 74 68 69 73  elect, like this
13530 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 45 4c 45  :.**.**     SELE
13540 43 54 20 78 2b 79 20 41 53 20 61 20 46 52 4f 4d  CT x+y AS a FROM
13550 20 74 31 20 57 48 45 52 45 20 7a 3c 31 30 30 20   t1 WHERE z<100 
13560 41 4e 44 20 61 3e 35 0a 2a 2a 0a 2a 2a 20 54 68  AND a>5.**.** Th
13570 65 20 63 6f 64 65 20 67 65 6e 65 72 61 74 65 64  e code generated
13580 20 66 6f 72 20 74 68 69 73 20 73 69 6d 70 69 66   for this simpif
13590 69 63 61 74 69 6f 6e 20 67 69 76 65 73 20 74 68  ication gives th
135a0 65 20 73 61 6d 65 20 72 65 73 75 6c 74 0a 2a 2a  e same result.**
135b0 20 62 75 74 20 6f 6e 6c 79 20 68 61 73 20 74 6f   but only has to
135c0 20 73 63 61 6e 20 74 68 65 20 64 61 74 61 20 6f   scan the data o
135d0 6e 63 65 2e 20 20 41 6e 64 20 62 65 63 61 75 73  nce.  And becaus
135e0 65 20 69 6e 64 69 63 65 73 20 6d 69 67 68 74 20  e indices might 
135f0 0a 2a 2a 20 65 78 69 73 74 20 6f 6e 20 74 68 65  .** exist on the
13600 20 74 61 62 6c 65 20 74 31 2c 20 61 20 63 6f 6d   table t1, a com
13610 70 6c 65 74 65 20 73 63 61 6e 20 6f 66 20 74 68  plete scan of th
13620 65 20 64 61 74 61 20 6d 69 67 68 74 20 62 65 0a  e data might be.
13630 2a 2a 20 61 76 6f 69 64 65 64 2e 0a 2a 2a 0a 2a  ** avoided..**.*
13640 2a 20 46 6c 61 74 74 65 6e 69 6e 67 20 69 73 20  * Flattening is 
13650 6f 6e 6c 79 20 61 74 74 65 6d 70 74 65 64 20 69  only attempted i
13660 66 20 61 6c 6c 20 6f 66 20 74 68 65 20 66 6f 6c  f all of the fol
13670 6c 6f 77 69 6e 67 20 61 72 65 20 74 72 75 65 3a  lowing are true:
13680 0a 2a 2a 0a 2a 2a 20 20 20 28 31 29 20 20 54 68  .**.**   (1)  Th
13690 65 20 73 75 62 71 75 65 72 79 20 61 6e 64 20 74  e subquery and t
136a0 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 64  he outer query d
136b0 6f 20 6e 6f 74 20 62 6f 74 68 20 75 73 65 20 61  o not both use a
136c0 67 67 72 65 67 61 74 65 73 2e 0a 2a 2a 0a 2a 2a  ggregates..**.**
136d0 20 20 20 28 32 29 20 20 54 68 65 20 73 75 62 71     (2)  The subq
136e0 75 65 72 79 20 69 73 20 6e 6f 74 20 61 6e 20 61  uery is not an a
136f0 67 67 72 65 67 61 74 65 20 6f 72 20 74 68 65 20  ggregate or the 
13700 6f 75 74 65 72 20 71 75 65 72 79 20 69 73 20 6e  outer query is n
13710 6f 74 20 61 20 6a 6f 69 6e 2e 0a 2a 2a 0a 2a 2a  ot a join..**.**
13720 20 20 20 28 33 29 20 20 54 68 65 20 73 75 62 71     (3)  The subq
13730 75 65 72 79 20 69 73 20 6e 6f 74 20 74 68 65 20  uery is not the 
13740 72 69 67 68 74 20 6f 70 65 72 61 6e 64 20 6f 66  right operand of
13750 20 61 20 6c 65 66 74 20 6f 75 74 65 72 20 6a 6f   a left outer jo
13760 69 6e 2c 20 6f 72 0a 2a 2a 20 20 20 20 20 20 20  in, or.**       
13770 20 74 68 65 20 73 75 62 71 75 65 72 79 20 69 73   the subquery is
13780 20 6e 6f 74 20 69 74 73 65 6c 66 20 61 20 6a 6f   not itself a jo
13790 69 6e 2e 20 20 28 54 69 63 6b 65 74 20 23 33 30  in.  (Ticket #30
137a0 36 29 0a 2a 2a 0a 2a 2a 20 20 20 28 34 29 20 20  6).**.**   (4)  
137b0 54 68 65 20 73 75 62 71 75 65 72 79 20 69 73 20  The subquery is 
137c0 6e 6f 74 20 44 49 53 54 49 4e 43 54 20 6f 72 20  not DISTINCT or 
137d0 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20  the outer query 
137e0 69 73 20 6e 6f 74 20 61 20 6a 6f 69 6e 2e 0a 2a  is not a join..*
137f0 2a 0a 2a 2a 20 20 20 28 35 29 20 20 54 68 65 20  *.**   (5)  The 
13800 73 75 62 71 75 65 72 79 20 69 73 20 6e 6f 74 20  subquery is not 
13810 44 49 53 54 49 4e 43 54 20 6f 72 20 74 68 65 20  DISTINCT or the 
13820 6f 75 74 65 72 20 71 75 65 72 79 20 64 6f 65 73  outer query does
13830 20 6e 6f 74 20 75 73 65 0a 2a 2a 20 20 20 20 20   not use.**     
13840 20 20 20 61 67 67 72 65 67 61 74 65 73 2e 0a 2a     aggregates..*
13850 2a 0a 2a 2a 20 20 20 28 36 29 20 20 54 68 65 20  *.**   (6)  The 
13860 73 75 62 71 75 65 72 79 20 64 6f 65 73 20 6e 6f  subquery does no
13870 74 20 75 73 65 20 61 67 67 72 65 67 61 74 65 73  t use aggregates
13880 20 6f 72 20 74 68 65 20 6f 75 74 65 72 20 71 75   or the outer qu
13890 65 72 79 20 69 73 20 6e 6f 74 0a 2a 2a 20 20 20  ery is not.**   
138a0 20 20 20 20 20 44 49 53 54 49 4e 43 54 2e 0a 2a       DISTINCT..*
138b0 2a 0a 2a 2a 20 20 20 28 37 29 20 20 54 68 65 20  *.**   (7)  The 
138c0 73 75 62 71 75 65 72 79 20 68 61 73 20 61 20 46  subquery has a F
138d0 52 4f 4d 20 63 6c 61 75 73 65 2e 0a 2a 2a 0a 2a  ROM clause..**.*
138e0 2a 20 20 20 28 38 29 20 20 54 68 65 20 73 75 62  *   (8)  The sub
138f0 71 75 65 72 79 20 64 6f 65 73 20 6e 6f 74 20 75  query does not u
13900 73 65 20 4c 49 4d 49 54 20 6f 72 20 74 68 65 20  se LIMIT or the 
13910 6f 75 74 65 72 20 71 75 65 72 79 20 69 73 20 6e  outer query is n
13920 6f 74 20 61 20 6a 6f 69 6e 2e 0a 2a 2a 0a 2a 2a  ot a join..**.**
13930 20 20 20 28 39 29 20 20 54 68 65 20 73 75 62 71     (9)  The subq
13940 75 65 72 79 20 64 6f 65 73 20 6e 6f 74 20 75 73  uery does not us
13950 65 20 4c 49 4d 49 54 20 6f 72 20 74 68 65 20 6f  e LIMIT or the o
13960 75 74 65 72 20 71 75 65 72 79 20 64 6f 65 73 20  uter query does 
13970 6e 6f 74 20 75 73 65 0a 2a 2a 20 20 20 20 20 20  not use.**      
13980 20 20 61 67 67 72 65 67 61 74 65 73 2e 0a 2a 2a    aggregates..**
13990 0a 2a 2a 20 20 28 31 30 29 20 20 54 68 65 20 73  .**  (10)  The s
139a0 75 62 71 75 65 72 79 20 64 6f 65 73 20 6e 6f 74  ubquery does not
139b0 20 75 73 65 20 61 67 67 72 65 67 61 74 65 73 20   use aggregates 
139c0 6f 72 20 74 68 65 20 6f 75 74 65 72 20 71 75 65  or the outer que
139d0 72 79 20 64 6f 65 73 20 6e 6f 74 0a 2a 2a 20 20  ry does not.**  
139e0 20 20 20 20 20 20 75 73 65 20 4c 49 4d 49 54 2e        use LIMIT.
139f0 0a 2a 2a 0a 2a 2a 20 20 28 31 31 29 20 20 54 68  .**.**  (11)  Th
13a00 65 20 73 75 62 71 75 65 72 79 20 61 6e 64 20 74  e subquery and t
13a10 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 64  he outer query d
13a20 6f 20 6e 6f 74 20 62 6f 74 68 20 68 61 76 65 20  o not both have 
13a30 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 73  ORDER BY clauses
13a40 2e 0a 2a 2a 0a 2a 2a 20 20 28 31 32 29 20 20 54  ..**.**  (12)  T
13a50 68 65 20 73 75 62 71 75 65 72 79 20 69 73 20 6e  he subquery is n
13a60 6f 74 20 74 68 65 20 72 69 67 68 74 20 74 65 72  ot the right ter
13a70 6d 20 6f 66 20 61 20 4c 45 46 54 20 4f 55 54 45  m of a LEFT OUTE
13a80 52 20 4a 4f 49 4e 20 6f 72 20 74 68 65 0a 2a 2a  R JOIN or the.**
13a90 20 20 20 20 20 20 20 20 73 75 62 71 75 65 72 79          subquery
13aa0 20 68 61 73 20 6e 6f 20 57 48 45 52 45 20 63 6c   has no WHERE cl
13ab0 61 75 73 65 2e 20 20 28 61 64 64 65 64 20 62 79  ause.  (added by
13ac0 20 74 69 63 6b 65 74 20 23 33 35 30 29 0a 2a 2a   ticket #350).**
13ad0 0a 2a 2a 20 20 28 31 33 29 20 20 54 68 65 20 73  .**  (13)  The s
13ae0 75 62 71 75 65 72 79 20 61 6e 64 20 6f 75 74 65  ubquery and oute
13af0 72 20 71 75 65 72 79 20 64 6f 20 6e 6f 74 20 62  r query do not b
13b00 6f 74 68 20 75 73 65 20 4c 49 4d 49 54 0a 2a 2a  oth use LIMIT.**
13b10 0a 2a 2a 20 20 28 31 34 29 20 20 54 68 65 20 73  .**  (14)  The s
13b20 75 62 71 75 65 72 79 20 64 6f 65 73 20 6e 6f 74  ubquery does not
13b30 20 75 73 65 20 4f 46 46 53 45 54 0a 2a 2a 0a 2a   use OFFSET.**.*
13b40 2a 20 20 28 31 35 29 20 20 54 68 65 20 6f 75 74  *  (15)  The out
13b50 65 72 20 71 75 65 72 79 20 69 73 20 6e 6f 74 20  er query is not 
13b60 70 61 72 74 20 6f 66 20 61 20 63 6f 6d 70 6f 75  part of a compou
13b70 6e 64 20 73 65 6c 65 63 74 20 6f 72 20 74 68 65  nd select or the
13b80 0a 2a 2a 20 20 20 20 20 20 20 20 73 75 62 71 75  .**        subqu
13b90 65 72 79 20 64 6f 65 73 20 6e 6f 74 20 68 61 76  ery does not hav
13ba0 65 20 62 6f 74 68 20 61 6e 20 4f 52 44 45 52 20  e both an ORDER 
13bb0 42 59 20 61 6e 64 20 61 20 4c 49 4d 49 54 20 63  BY and a LIMIT c
13bc0 6c 61 75 73 65 2e 0a 2a 2a 20 20 20 20 20 20 20  lause..**       
13bd0 20 28 53 65 65 20 74 69 63 6b 65 74 20 23 32 33   (See ticket #23
13be0 33 39 29 0a 2a 2a 0a 2a 2a 20 49 6e 20 74 68 69  39).**.** In thi
13bf0 73 20 72 6f 75 74 69 6e 65 2c 20 74 68 65 20 22  s routine, the "
13c00 70 22 20 70 61 72 61 6d 65 74 65 72 20 69 73 20  p" parameter is 
13c10 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65  a pointer to the
13c20 20 6f 75 74 65 72 20 71 75 65 72 79 2e 0a 2a 2a   outer query..**
13c30 20 54 68 65 20 73 75 62 71 75 65 72 79 20 69 73   The subquery is
13c40 20 70 2d 3e 70 53 72 63 2d 3e 61 5b 69 46 72 6f   p->pSrc->a[iFro
13c50 6d 5d 2e 20 20 69 73 41 67 67 20 69 73 20 74 72  m].  isAgg is tr
13c60 75 65 20 69 66 20 74 68 65 20 6f 75 74 65 72 20  ue if the outer 
13c70 71 75 65 72 79 0a 2a 2a 20 75 73 65 73 20 61 67  query.** uses ag
13c80 67 72 65 67 61 74 65 73 20 61 6e 64 20 73 75 62  gregates and sub
13c90 71 75 65 72 79 49 73 41 67 67 20 69 73 20 74 72  queryIsAgg is tr
13ca0 75 65 20 69 66 20 74 68 65 20 73 75 62 71 75 65  ue if the subque
13cb0 72 79 20 75 73 65 73 20 61 67 67 72 65 67 61 74  ry uses aggregat
13cc0 65 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 66 6c 61  es..**.** If fla
13cd0 74 74 65 6e 69 6e 67 20 69 73 20 6e 6f 74 20 61  ttening is not a
13ce0 74 74 65 6d 70 74 65 64 2c 20 74 68 69 73 20 72  ttempted, this r
13cf0 6f 75 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f  outine is a no-o
13d00 70 20 61 6e 64 20 72 65 74 75 72 6e 73 20 30 2e  p and returns 0.
13d10 0a 2a 2a 20 49 66 20 66 6c 61 74 74 65 6e 69 6e  .** If flattenin
13d20 67 20 69 73 20 61 74 74 65 6d 70 74 65 64 20 74  g is attempted t
13d30 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75  his routine retu
13d40 72 6e 73 20 31 2e 0a 2a 2a 0a 2a 2a 20 41 6c 6c  rns 1..**.** All
13d50 20 6f 66 20 74 68 65 20 65 78 70 72 65 73 73 69   of the expressi
13d60 6f 6e 20 61 6e 61 6c 79 73 69 73 20 6d 75 73 74  on analysis must
13d70 20 6f 63 63 75 72 20 6f 6e 20 62 6f 74 68 20 74   occur on both t
13d80 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 61  he outer query a
13d90 6e 64 0a 2a 2a 20 74 68 65 20 73 75 62 71 75 65  nd.** the subque
13da0 72 79 20 62 65 66 6f 72 65 20 74 68 69 73 20 72  ry before this r
13db0 6f 75 74 69 6e 65 20 72 75 6e 73 2e 0a 2a 2f 0a  outine runs..*/.
13dc0 73 74 61 74 69 63 20 69 6e 74 20 66 6c 61 74 74  static int flatt
13dd0 65 6e 53 75 62 71 75 65 72 79 28 0a 20 20 73 71  enSubquery(.  sq
13de0 6c 69 74 65 33 20 2a 64 62 2c 20 20 20 20 20 20  lite3 *db,      
13df0 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 63     /* Database c
13e00 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 53  onnection */.  S
13e10 65 6c 65 63 74 20 2a 70 2c 20 20 20 20 20 20 20  elect *p,       
13e20 20 20 20 20 2f 2a 20 54 68 65 20 70 61 72 65 6e      /* The paren
13e30 74 20 6f 72 20 6f 75 74 65 72 20 53 45 4c 45 43  t or outer SELEC
13e40 54 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20  T statement */. 
13e50 20 69 6e 74 20 69 46 72 6f 6d 2c 20 20 20 20 20   int iFrom,     
13e60 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 69        /* Index i
13e70 6e 20 70 2d 3e 70 53 72 63 2d 3e 61 5b 5d 20 6f  n p->pSrc->a[] o
13e80 66 20 74 68 65 20 69 6e 6e 65 72 20 73 75 62 71  f the inner subq
13e90 75 65 72 79 20 2a 2f 0a 20 20 69 6e 74 20 69 73  uery */.  int is
13ea0 41 67 67 2c 20 20 20 20 20 20 20 20 20 20 20 2f  Agg,           /
13eb0 2a 20 54 72 75 65 20 69 66 20 6f 75 74 65 72 20  * True if outer 
13ec0 53 45 4c 45 43 54 20 75 73 65 73 20 61 67 67 72  SELECT uses aggr
13ed0 65 67 61 74 65 20 66 75 6e 63 74 69 6f 6e 73 20  egate functions 
13ee0 2a 2f 0a 20 20 69 6e 74 20 73 75 62 71 75 65 72  */.  int subquer
13ef0 79 49 73 41 67 67 20 20 20 20 2f 2a 20 54 72 75  yIsAgg    /* Tru
13f00 65 20 69 66 20 74 68 65 20 73 75 62 71 75 65 72  e if the subquer
13f10 79 20 75 73 65 73 20 61 67 67 72 65 67 61 74 65  y uses aggregate
13f20 20 66 75 6e 63 74 69 6f 6e 73 20 2a 2f 0a 29 7b   functions */.){
13f30 0a 20 20 53 65 6c 65 63 74 20 2a 70 53 75 62 3b  .  Select *pSub;
13f40 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 69 6e         /* The in
13f50 6e 65 72 20 71 75 65 72 79 20 6f 72 20 22 73 75  ner query or "su
13f60 62 71 75 65 72 79 22 20 2a 2f 0a 20 20 53 72 63  bquery" */.  Src
13f70 4c 69 73 74 20 2a 70 53 72 63 3b 20 20 20 20 20  List *pSrc;     
13f80 20 2f 2a 20 54 68 65 20 46 52 4f 4d 20 63 6c 61   /* The FROM cla
13f90 75 73 65 20 6f 66 20 74 68 65 20 6f 75 74 65 72  use of the outer
13fa0 20 71 75 65 72 79 20 2a 2f 0a 20 20 53 72 63 4c   query */.  SrcL
13fb0 69 73 74 20 2a 70 53 75 62 53 72 63 3b 20 20 20  ist *pSubSrc;   
13fc0 2f 2a 20 54 68 65 20 46 52 4f 4d 20 63 6c 61 75  /* The FROM clau
13fd0 73 65 20 6f 66 20 74 68 65 20 73 75 62 71 75 65  se of the subque
13fe0 72 79 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74  ry */.  ExprList
13ff0 20 2a 70 4c 69 73 74 3b 20 20 20 20 2f 2a 20 54   *pList;    /* T
14000 68 65 20 72 65 73 75 6c 74 20 73 65 74 20 6f 66  he result set of
14010 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79   the outer query
14020 20 2a 2f 0a 20 20 69 6e 74 20 69 50 61 72 65 6e   */.  int iParen
14030 74 3b 20 20 20 20 20 20 20 20 2f 2a 20 56 44 42  t;        /* VDB
14040 45 20 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 20  E cursor number 
14050 6f 66 20 74 68 65 20 70 53 75 62 20 72 65 73 75  of the pSub resu
14060 6c 74 20 73 65 74 20 74 65 6d 70 20 74 61 62 6c  lt set temp tabl
14070 65 20 2a 2f 0a 20 20 69 6e 74 20 69 3b 20 20 20  e */.  int i;   
14080 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f             /* Lo
14090 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20  op counter */.  
140a0 45 78 70 72 20 2a 70 57 68 65 72 65 3b 20 20 20  Expr *pWhere;   
140b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
140c0 20 2f 2a 20 54 68 65 20 57 48 45 52 45 20 63 6c   /* The WHERE cl
140d0 61 75 73 65 20 2a 2f 0a 20 20 73 74 72 75 63 74  ause */.  struct
140e0 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70   SrcList_item *p
140f0 53 75 62 69 74 65 6d 3b 20 20 20 2f 2a 20 54 68  Subitem;   /* Th
14100 65 20 73 75 62 71 75 65 72 79 20 2a 2f 0a 0a 20  e subquery */.. 
14110 20 2f 2a 20 43 68 65 63 6b 20 74 6f 20 73 65 65   /* Check to see
14120 20 69 66 20 66 6c 61 74 74 65 6e 69 6e 67 20 69   if flattening i
14130 73 20 70 65 72 6d 69 74 74 65 64 2e 20 20 52 65  s permitted.  Re
14140 74 75 72 6e 20 30 20 69 66 20 6e 6f 74 2e 0a 20  turn 0 if not.. 
14150 20 2a 2f 0a 20 20 69 66 28 20 70 3d 3d 30 20 29   */.  if( p==0 )
14160 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 70 53 72   return 0;.  pSr
14170 63 20 3d 20 70 2d 3e 70 53 72 63 3b 0a 20 20 61  c = p->pSrc;.  a
14180 73 73 65 72 74 28 20 70 53 72 63 20 26 26 20 69  ssert( pSrc && i
14190 46 72 6f 6d 3e 3d 30 20 26 26 20 69 46 72 6f 6d  From>=0 && iFrom
141a0 3c 70 53 72 63 2d 3e 6e 53 72 63 20 29 3b 0a 20  <pSrc->nSrc );. 
141b0 20 70 53 75 62 69 74 65 6d 20 3d 20 26 70 53 72   pSubitem = &pSr
141c0 63 2d 3e 61 5b 69 46 72 6f 6d 5d 3b 0a 20 20 70  c->a[iFrom];.  p
141d0 53 75 62 20 3d 20 70 53 75 62 69 74 65 6d 2d 3e  Sub = pSubitem->
141e0 70 53 65 6c 65 63 74 3b 0a 20 20 61 73 73 65 72  pSelect;.  asser
141f0 74 28 20 70 53 75 62 21 3d 30 20 29 3b 0a 20 20  t( pSub!=0 );.  
14200 69 66 28 20 69 73 41 67 67 20 26 26 20 73 75 62  if( isAgg && sub
14210 71 75 65 72 79 49 73 41 67 67 20 29 20 72 65 74  queryIsAgg ) ret
14220 75 72 6e 20 30 3b 20 20 20 20 20 20 20 20 20 20  urn 0;          
14230 20 20 20 20 20 20 20 2f 2a 20 52 65 73 74 72 69         /* Restri
14240 63 74 69 6f 6e 20 28 31 29 20 20 2a 2f 0a 20 20  ction (1)  */.  
14250 69 66 28 20 73 75 62 71 75 65 72 79 49 73 41 67  if( subqueryIsAg
14260 67 20 26 26 20 70 53 72 63 2d 3e 6e 53 72 63 3e  g && pSrc->nSrc>
14270 31 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20 20  1 ) return 0;   
14280 20 20 20 20 20 20 20 2f 2a 20 52 65 73 74 72 69         /* Restri
14290 63 74 69 6f 6e 20 28 32 29 20 20 2a 2f 0a 20 20  ction (2)  */.  
142a0 70 53 75 62 53 72 63 20 3d 20 70 53 75 62 2d 3e  pSubSrc = pSub->
142b0 70 53 72 63 3b 0a 20 20 61 73 73 65 72 74 28 20  pSrc;.  assert( 
142c0 70 53 75 62 53 72 63 20 29 3b 0a 20 20 2f 2a 20  pSubSrc );.  /* 
142d0 50 72 69 6f 72 20 74 6f 20 76 65 72 73 69 6f 6e  Prior to version
142e0 20 33 2e 31 2e 32 2c 20 77 68 65 6e 20 4c 49 4d   3.1.2, when LIM
142f0 49 54 20 61 6e 64 20 4f 46 46 53 45 54 20 68 61  IT and OFFSET ha
14300 64 20 74 6f 20 62 65 20 73 69 6d 70 6c 65 20 63  d to be simple c
14310 6f 6e 73 74 61 6e 74 73 2c 0a 20 20 2a 2a 20 6e  onstants,.  ** n
14320 6f 74 20 61 72 62 69 74 72 61 72 79 20 65 78 70  ot arbitrary exp
14330 72 65 73 73 73 69 6f 6e 73 2c 20 77 65 20 61 6c  resssions, we al
14340 6c 6f 77 65 64 20 73 6f 6d 65 20 63 6f 6d 62 69  lowed some combi
14350 6e 69 6e 67 20 6f 66 20 4c 49 4d 49 54 20 61 6e  ning of LIMIT an
14360 64 20 4f 46 46 53 45 54 0a 20 20 2a 2a 20 62 65  d OFFSET.  ** be
14370 63 61 75 73 65 20 74 68 65 79 20 63 6f 75 6c 64  cause they could
14380 20 62 65 20 63 6f 6d 70 75 74 65 64 20 61 74 20   be computed at 
14390 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 2e 20 20 42  compile-time.  B
143a0 75 74 20 77 68 65 6e 20 4c 49 4d 49 54 20 61 6e  ut when LIMIT an
143b0 64 20 4f 46 46 53 45 54 0a 20 20 2a 2a 20 62 65  d OFFSET.  ** be
143c0 63 61 6d 65 20 61 72 62 69 74 72 61 72 79 20 65  came arbitrary e
143d0 78 70 72 65 73 73 69 6f 6e 73 2c 20 77 65 20 77  xpressions, we w
143e0 65 72 65 20 66 6f 72 63 65 64 20 74 6f 20 61 64  ere forced to ad
143f0 64 20 72 65 73 74 72 69 63 74 69 6f 6e 73 20 28  d restrictions (
14400 31 33 29 0a 20 20 2a 2a 20 61 6e 64 20 28 31 34  13).  ** and (14
14410 29 2e 20 2a 2f 0a 20 20 69 66 28 20 70 53 75 62  ). */.  if( pSub
14420 2d 3e 70 4c 69 6d 69 74 20 26 26 20 70 2d 3e 70  ->pLimit && p->p
14430 4c 69 6d 69 74 20 29 20 72 65 74 75 72 6e 20 30  Limit ) return 0
14440 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
14450 2a 20 52 65 73 74 72 69 63 74 69 6f 6e 20 28 31  * Restriction (1
14460 33 29 20 2a 2f 0a 20 20 69 66 28 20 70 53 75 62  3) */.  if( pSub
14470 2d 3e 70 4f 66 66 73 65 74 20 29 20 72 65 74 75  ->pOffset ) retu
14480 72 6e 20 30 3b 20 20 20 20 20 20 20 20 20 20 20  rn 0;           
14490 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
144a0 2a 20 52 65 73 74 72 69 63 74 69 6f 6e 20 28 31  * Restriction (1
144b0 34 29 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 70  4) */.  if( p->p
144c0 52 69 67 68 74 6d 6f 73 74 20 26 26 20 70 53 75  Rightmost && pSu
144d0 62 2d 3e 70 4c 69 6d 69 74 20 26 26 20 70 53 75  b->pLimit && pSu
144e0 62 2d 3e 70 4f 72 64 65 72 42 79 20 29 7b 0a 20  b->pOrderBy ){. 
144f0 20 20 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20     return 0;    
14500 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14510 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14520 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73 74 72          /* Restr
14530 69 63 74 69 6f 6e 20 28 31 35 29 20 2a 2f 0a 20  iction (15) */. 
14540 20 7d 0a 20 20 69 66 28 20 70 53 75 62 53 72 63   }.  if( pSubSrc
14550 2d 3e 6e 53 72 63 3d 3d 30 20 29 20 72 65 74 75  ->nSrc==0 ) retu
14560 72 6e 20 30 3b 20 20 20 20 20 20 20 20 20 20 20  rn 0;           
14570 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
14580 65 73 74 72 69 63 74 69 6f 6e 20 28 37 29 20 20  estriction (7)  
14590 2a 2f 0a 20 20 69 66 28 20 28 70 53 75 62 2d 3e  */.  if( (pSub->
145a0 69 73 44 69 73 74 69 6e 63 74 20 7c 7c 20 70 53  isDistinct || pS
145b0 75 62 2d 3e 70 4c 69 6d 69 74 29 20 0a 20 20 20  ub->pLimit) .   
145c0 20 20 20 20 20 20 26 26 20 28 70 53 72 63 2d 3e        && (pSrc->
145d0 6e 53 72 63 3e 31 20 7c 7c 20 69 73 41 67 67 29  nSrc>1 || isAgg)
145e0 20 29 7b 20 20 20 20 20 20 20 20 20 20 2f 2a 20   ){          /* 
145f0 52 65 73 74 72 69 63 74 69 6f 6e 73 20 28 34 29  Restrictions (4)
14600 28 35 29 28 38 29 28 39 29 20 2a 2f 0a 20 20 20  (5)(8)(9) */.   
14610 20 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20    return 0;     
14620 20 20 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e    .  }.  if( p->
14630 69 73 44 69 73 74 69 6e 63 74 20 26 26 20 73 75  isDistinct && su
14640 62 71 75 65 72 79 49 73 41 67 67 20 29 20 72 65  bqueryIsAgg ) re
14650 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20 20 20  turn 0;         
14660 2f 2a 20 52 65 73 74 72 69 63 74 69 6f 6e 20 28  /* Restriction (
14670 36 29 20 20 2a 2f 0a 20 20 69 66 28 20 28 70 2d  6)  */.  if( (p-
14680 3e 64 69 73 61 6c 6c 6f 77 4f 72 64 65 72 42 79  >disallowOrderBy
14690 20 7c 7c 20 70 2d 3e 70 4f 72 64 65 72 42 79 29   || p->pOrderBy)
146a0 20 26 26 20 70 53 75 62 2d 3e 70 4f 72 64 65 72   && pSub->pOrder
146b0 42 79 20 29 7b 0a 20 20 20 20 20 72 65 74 75 72  By ){.     retur
146c0 6e 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  n 0;            
146d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
146e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
146f0 2a 20 52 65 73 74 72 69 63 74 69 6f 6e 20 28 31  * Restriction (1
14700 31 29 20 2a 2f 0a 20 20 7d 0a 0a 20 20 2f 2a 20  1) */.  }..  /* 
14710 52 65 73 74 72 69 63 74 69 6f 6e 20 33 3a 20 20  Restriction 3:  
14720 49 66 20 74 68 65 20 73 75 62 71 75 65 72 79 20  If the subquery 
14730 69 73 20 61 20 6a 6f 69 6e 2c 20 6d 61 6b 65 20  is a join, make 
14740 73 75 72 65 20 74 68 65 20 73 75 62 71 75 65 72  sure the subquer
14750 79 20 69 73 20 0a 20 20 2a 2a 20 6e 6f 74 20 75  y is .  ** not u
14760 73 65 64 20 61 73 20 74 68 65 20 72 69 67 68 74  sed as the right
14770 20 6f 70 65 72 61 6e 64 20 6f 66 20 61 6e 20 6f   operand of an o
14780 75 74 65 72 20 6a 6f 69 6e 2e 20 20 45 78 61 6d  uter join.  Exam
14790 70 6c 65 73 20 6f 66 20 77 68 79 20 74 68 69 73  ples of why this
147a0 0a 20 20 2a 2a 20 69 73 20 6e 6f 74 20 61 6c 6c  .  ** is not all
147b0 6f 77 65 64 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20  owed:.  **.  ** 
147c0 20 20 20 20 20 20 20 20 74 31 20 4c 45 46 54 20          t1 LEFT 
147d0 4f 55 54 45 52 20 4a 4f 49 4e 20 28 74 32 20 4a  OUTER JOIN (t2 J
147e0 4f 49 4e 20 74 33 29 0a 20 20 2a 2a 0a 20 20 2a  OIN t3).  **.  *
147f0 2a 20 49 66 20 77 65 20 66 6c 61 74 74 65 6e 20  * If we flatten 
14800 74 68 65 20 61 62 6f 76 65 2c 20 77 65 20 77 6f  the above, we wo
14810 75 6c 64 20 67 65 74 0a 20 20 2a 2a 0a 20 20 2a  uld get.  **.  *
14820 2a 20 20 20 20 20 20 20 20 20 28 74 31 20 4c 45  *         (t1 LE
14830 46 54 20 4f 55 54 45 52 20 4a 4f 49 4e 20 74 32  FT OUTER JOIN t2
14840 29 20 4a 4f 49 4e 20 74 33 0a 20 20 2a 2a 0a 20  ) JOIN t3.  **. 
14850 20 2a 2a 20 77 68 69 63 68 20 69 73 20 6e 6f 74   ** which is not
14860 20 61 74 20 61 6c 6c 20 74 68 65 20 73 61 6d 65   at all the same
14870 20 74 68 69 6e 67 2e 0a 20 20 2a 2f 0a 20 20 69   thing..  */.  i
14880 66 28 20 70 53 75 62 53 72 63 2d 3e 6e 53 72 63  f( pSubSrc->nSrc
14890 3e 31 20 26 26 20 28 70 53 75 62 69 74 65 6d 2d  >1 && (pSubitem-
148a0 3e 6a 6f 69 6e 74 79 70 65 20 26 20 4a 54 5f 4f  >jointype & JT_O
148b0 55 54 45 52 29 21 3d 30 20 29 7b 0a 20 20 20 20  UTER)!=0 ){.    
148c0 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 0a 20  return 0;.  }.. 
148d0 20 2f 2a 20 52 65 73 74 72 69 63 74 69 6f 6e 20   /* Restriction 
148e0 31 32 3a 20 20 49 66 20 74 68 65 20 73 75 62 71  12:  If the subq
148f0 75 65 72 79 20 69 73 20 74 68 65 20 72 69 67 68  uery is the righ
14900 74 20 6f 70 65 72 61 6e 64 20 6f 66 20 61 20 6c  t operand of a l
14910 65 66 74 20 6f 75 74 65 72 0a 20 20 2a 2a 20 6a  eft outer.  ** j
14920 6f 69 6e 2c 20 6d 61 6b 65 20 73 75 72 65 20 74  oin, make sure t
14930 68 65 20 73 75 62 71 75 65 72 79 20 68 61 73 20  he subquery has 
14940 6e 6f 20 57 48 45 52 45 20 63 6c 61 75 73 65 2e  no WHERE clause.
14950 0a 20 20 2a 2a 20 41 6e 20 65 78 61 6d 70 6c 65  .  ** An example
14960 73 20 6f 66 20 77 68 79 20 74 68 69 73 20 69 73  s of why this is
14970 20 6e 6f 74 20 61 6c 6c 6f 77 65 64 3a 0a 20 20   not allowed:.  
14980 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 20 20 20 20  **.  **         
14990 74 31 20 4c 45 46 54 20 4f 55 54 45 52 20 4a 4f  t1 LEFT OUTER JO
149a0 49 4e 20 28 53 45 4c 45 43 54 20 2a 20 46 52 4f  IN (SELECT * FRO
149b0 4d 20 74 32 20 57 48 45 52 45 20 74 32 2e 78 3e  M t2 WHERE t2.x>
149c0 30 29 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20  0).  **.  ** If 
149d0 77 65 20 66 6c 61 74 74 65 6e 20 74 68 65 20 61  we flatten the a
149e0 62 6f 76 65 2c 20 77 65 20 77 6f 75 6c 64 20 67  bove, we would g
149f0 65 74 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20  et.  **.  **    
14a00 20 20 20 20 20 28 74 31 20 4c 45 46 54 20 4f 55       (t1 LEFT OU
14a10 54 45 52 20 4a 4f 49 4e 20 74 32 29 20 57 48 45  TER JOIN t2) WHE
14a20 52 45 20 74 32 2e 78 3e 30 0a 20 20 2a 2a 0a 20  RE t2.x>0.  **. 
14a30 20 2a 2a 20 42 75 74 20 74 68 65 20 74 32 2e 78   ** But the t2.x
14a40 3e 30 20 74 65 73 74 20 77 69 6c 6c 20 61 6c 77  >0 test will alw
14a50 61 79 73 20 66 61 69 6c 20 6f 6e 20 61 20 4e 55  ays fail on a NU
14a60 4c 4c 20 72 6f 77 20 6f 66 20 74 32 2c 20 77 68  LL row of t2, wh
14a70 69 63 68 0a 20 20 2a 2a 20 65 66 66 65 63 74 69  ich.  ** effecti
14a80 76 65 6c 79 20 63 6f 6e 76 65 72 74 73 20 74 68  vely converts th
14a90 65 20 4f 55 54 45 52 20 4a 4f 49 4e 20 69 6e 74  e OUTER JOIN int
14aa0 6f 20 61 6e 20 49 4e 4e 45 52 20 4a 4f 49 4e 2e  o an INNER JOIN.
14ab0 0a 20 20 2a 2f 0a 20 20 69 66 28 20 28 70 53 75  .  */.  if( (pSu
14ac0 62 69 74 65 6d 2d 3e 6a 6f 69 6e 74 79 70 65 20  bitem->jointype 
14ad0 26 20 4a 54 5f 4f 55 54 45 52 29 21 3d 30 20 26  & JT_OUTER)!=0 &
14ae0 26 20 70 53 75 62 2d 3e 70 57 68 65 72 65 21 3d  & pSub->pWhere!=
14af0 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  0 ){.    return 
14b00 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20  0;.  }..  /* If 
14b10 77 65 20 72 65 61 63 68 20 74 68 69 73 20 70 6f  we reach this po
14b20 69 6e 74 2c 20 69 74 20 6d 65 61 6e 73 20 66 6c  int, it means fl
14b30 61 74 74 65 6e 69 6e 67 20 69 73 20 70 65 72 6d  attening is perm
14b40 69 74 74 65 64 20 66 6f 72 20 74 68 65 0a 20 20  itted for the.  
14b50 2a 2a 20 69 46 72 6f 6d 2d 74 68 20 65 6e 74 72  ** iFrom-th entr
14b60 79 20 6f 66 20 74 68 65 20 46 52 4f 4d 20 63 6c  y of the FROM cl
14b70 61 75 73 65 20 69 6e 20 74 68 65 20 6f 75 74 65  ause in the oute
14b80 72 20 71 75 65 72 79 2e 0a 20 20 2a 2f 0a 0a 20  r query..  */.. 
14b90 20 2f 2a 20 4d 6f 76 65 20 61 6c 6c 20 6f 66 20   /* Move all of 
14ba0 74 68 65 20 46 52 4f 4d 20 65 6c 65 6d 65 6e 74  the FROM element
14bb0 73 20 6f 66 20 74 68 65 20 73 75 62 71 75 65 72  s of the subquer
14bc0 79 20 69 6e 74 6f 20 74 68 65 0a 20 20 2a 2a 20  y into the.  ** 
14bd0 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20  the FROM clause 
14be0 6f 66 20 74 68 65 20 6f 75 74 65 72 20 71 75 65  of the outer que
14bf0 72 79 2e 20 20 42 65 66 6f 72 65 20 64 6f 69 6e  ry.  Before doin
14c00 67 20 74 68 69 73 2c 20 72 65 6d 65 6d 62 65 72  g this, remember
14c10 0a 20 20 2a 2a 20 74 68 65 20 63 75 72 73 6f 72  .  ** the cursor
14c20 20 6e 75 6d 62 65 72 20 66 6f 72 20 74 68 65 20   number for the 
14c30 6f 72 69 67 69 6e 61 6c 20 6f 75 74 65 72 20 71  original outer q
14c40 75 65 72 79 20 46 52 4f 4d 20 65 6c 65 6d 65 6e  uery FROM elemen
14c50 74 20 69 6e 0a 20 20 2a 2a 20 69 50 61 72 65 6e  t in.  ** iParen
14c60 74 2e 20 20 54 68 65 20 69 50 61 72 65 6e 74 20  t.  The iParent 
14c70 63 75 72 73 6f 72 20 77 69 6c 6c 20 6e 65 76 65  cursor will neve
14c80 72 20 62 65 20 75 73 65 64 2e 20 20 53 75 62 73  r be used.  Subs
14c90 65 71 75 65 6e 74 20 63 6f 64 65 0a 20 20 2a 2a  equent code.  **
14ca0 20 77 69 6c 6c 20 73 63 61 6e 20 65 78 70 72 65   will scan expre
14cb0 73 73 69 6f 6e 73 20 6c 6f 6f 6b 69 6e 67 20 66  ssions looking f
14cc0 6f 72 20 69 50 61 72 65 6e 74 20 72 65 66 65 72  or iParent refer
14cd0 65 6e 63 65 73 20 61 6e 64 20 72 65 70 6c 61 63  ences and replac
14ce0 65 0a 20 20 2a 2a 20 74 68 6f 73 65 20 72 65 66  e.  ** those ref
14cf0 65 72 65 6e 63 65 73 20 77 69 74 68 20 65 78 70  erences with exp
14d00 72 65 73 73 69 6f 6e 73 20 74 68 61 74 20 72 65  ressions that re
14d10 73 6f 6c 76 65 20 74 6f 20 74 68 65 20 73 75 62  solve to the sub
14d20 71 75 65 72 79 20 46 52 4f 4d 0a 20 20 2a 2a 20  query FROM.  ** 
14d30 65 6c 65 6d 65 6e 74 73 20 77 65 20 61 72 65 20  elements we are 
14d40 6e 6f 77 20 63 6f 70 79 69 6e 67 20 69 6e 2e 0a  now copying in..
14d50 20 20 2a 2f 0a 20 20 69 50 61 72 65 6e 74 20 3d    */.  iParent =
14d60 20 70 53 75 62 69 74 65 6d 2d 3e 69 43 75 72 73   pSubitem->iCurs
14d70 6f 72 3b 0a 20 20 7b 0a 20 20 20 20 69 6e 74 20  or;.  {.    int 
14d80 6e 53 75 62 53 72 63 20 3d 20 70 53 75 62 53 72  nSubSrc = pSubSr
14d90 63 2d 3e 6e 53 72 63 3b 0a 20 20 20 20 69 6e 74  c->nSrc;.    int
14da0 20 6a 6f 69 6e 74 79 70 65 20 3d 20 70 53 75 62   jointype = pSub
14db0 69 74 65 6d 2d 3e 6a 6f 69 6e 74 79 70 65 3b 0a  item->jointype;.
14dc0 0a 20 20 20 20 73 71 6c 69 74 65 33 44 65 6c 65  .    sqlite3Dele
14dd0 74 65 54 61 62 6c 65 28 70 53 75 62 69 74 65 6d  teTable(pSubitem
14de0 2d 3e 70 54 61 62 29 3b 0a 20 20 20 20 73 71 6c  ->pTab);.    sql
14df0 69 74 65 33 5f 66 72 65 65 28 70 53 75 62 69 74  ite3_free(pSubit
14e00 65 6d 2d 3e 7a 44 61 74 61 62 61 73 65 29 3b 0a  em->zDatabase);.
14e10 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
14e20 28 70 53 75 62 69 74 65 6d 2d 3e 7a 4e 61 6d 65  (pSubitem->zName
14e30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66  );.    sqlite3_f
14e40 72 65 65 28 70 53 75 62 69 74 65 6d 2d 3e 7a 41  ree(pSubitem->zA
14e50 6c 69 61 73 29 3b 0a 20 20 20 20 70 53 75 62 69  lias);.    pSubi
14e60 74 65 6d 2d 3e 70 54 61 62 20 3d 20 30 3b 0a 20  tem->pTab = 0;. 
14e70 20 20 20 70 53 75 62 69 74 65 6d 2d 3e 7a 44 61     pSubitem->zDa
14e80 74 61 62 61 73 65 20 3d 20 30 3b 0a 20 20 20 20  tabase = 0;.    
14e90 70 53 75 62 69 74 65 6d 2d 3e 7a 4e 61 6d 65 20  pSubitem->zName 
14ea0 3d 20 30 3b 0a 20 20 20 20 70 53 75 62 69 74 65  = 0;.    pSubite
14eb0 6d 2d 3e 7a 41 6c 69 61 73 20 3d 20 30 3b 0a 20  m->zAlias = 0;. 
14ec0 20 20 20 69 66 28 20 6e 53 75 62 53 72 63 3e 31     if( nSubSrc>1
14ed0 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 65 78   ){.      int ex
14ee0 74 72 61 20 3d 20 6e 53 75 62 53 72 63 20 2d 20  tra = nSubSrc - 
14ef0 31 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 31  1;.      for(i=1
14f00 3b 20 69 3c 6e 53 75 62 53 72 63 3b 20 69 2b 2b  ; i<nSubSrc; i++
14f10 29 7b 0a 20 20 20 20 20 20 20 20 70 53 72 63 20  ){.        pSrc 
14f20 3d 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74  = sqlite3SrcList
14f30 41 70 70 65 6e 64 28 64 62 2c 20 70 53 72 63 2c  Append(db, pSrc,
14f40 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20   0, 0);.        
14f50 69 66 28 20 70 53 72 63 3d 3d 30 20 29 7b 0a 20  if( pSrc==0 ){. 
14f60 20 20 20 20 20 20 20 20 20 70 2d 3e 70 53 72 63           p->pSrc
14f70 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20   = 0;.          
14f80 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 20 20  return 1;.      
14f90 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
14fa0 20 20 70 2d 3e 70 53 72 63 20 3d 20 70 53 72 63    p->pSrc = pSrc
14fb0 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 70 53  ;.      for(i=pS
14fc0 72 63 2d 3e 6e 53 72 63 2d 31 3b 20 69 2d 65 78  rc->nSrc-1; i-ex
14fd0 74 72 61 3e 3d 69 46 72 6f 6d 3b 20 69 2d 2d 29  tra>=iFrom; i--)
14fe0 7b 0a 20 20 20 20 20 20 20 20 70 53 72 63 2d 3e  {.        pSrc->
14ff0 61 5b 69 5d 20 3d 20 70 53 72 63 2d 3e 61 5b 69  a[i] = pSrc->a[i
15000 2d 65 78 74 72 61 5d 3b 0a 20 20 20 20 20 20 7d  -extra];.      }
15010 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f 72 28 69  .    }.    for(i
15020 3d 30 3b 20 69 3c 6e 53 75 62 53 72 63 3b 20 69  =0; i<nSubSrc; i
15030 2b 2b 29 7b 0a 20 20 20 20 20 20 70 53 72 63 2d  ++){.      pSrc-
15040 3e 61 5b 69 2b 69 46 72 6f 6d 5d 20 3d 20 70 53  >a[i+iFrom] = pS
15050 75 62 53 72 63 2d 3e 61 5b 69 5d 3b 0a 20 20 20  ubSrc->a[i];.   
15060 20 20 20 6d 65 6d 73 65 74 28 26 70 53 75 62 53     memset(&pSubS
15070 72 63 2d 3e 61 5b 69 5d 2c 20 30 2c 20 73 69 7a  rc->a[i], 0, siz
15080 65 6f 66 28 70 53 75 62 53 72 63 2d 3e 61 5b 69  eof(pSubSrc->a[i
15090 5d 29 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  ]));.    }.    p
150a0 53 72 63 2d 3e 61 5b 69 46 72 6f 6d 5d 2e 6a 6f  Src->a[iFrom].jo
150b0 69 6e 74 79 70 65 20 3d 20 6a 6f 69 6e 74 79 70  intype = jointyp
150c0 65 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4e 6f 77  e;.  }..  /* Now
150d0 20 62 65 67 69 6e 20 73 75 62 73 74 69 74 75 74   begin substitut
150e0 69 6e 67 20 73 75 62 71 75 65 72 79 20 72 65 73  ing subquery res
150f0 75 6c 74 20 73 65 74 20 65 78 70 72 65 73 73 69  ult set expressi
15100 6f 6e 73 20 66 6f 72 20 0a 20 20 2a 2a 20 72 65  ons for .  ** re
15110 66 65 72 65 6e 63 65 73 20 74 6f 20 74 68 65 20  ferences to the 
15120 69 50 61 72 65 6e 74 20 69 6e 20 74 68 65 20 6f  iParent in the o
15130 75 74 65 72 20 71 75 65 72 79 2e 0a 20 20 2a 2a  uter query..  **
15140 20 0a 20 20 2a 2a 20 45 78 61 6d 70 6c 65 3a 0a   .  ** Example:.
15150 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 53 45 4c 45    **.  **   SELE
15160 43 54 20 61 2b 35 2c 20 62 2a 31 30 20 46 52 4f  CT a+5, b*10 FRO
15170 4d 20 28 53 45 4c 45 43 54 20 78 2a 33 20 41 53  M (SELECT x*3 AS
15180 20 61 2c 20 79 2b 31 30 20 41 53 20 62 20 46 52   a, y+10 AS b FR
15190 4f 4d 20 74 31 29 20 57 48 45 52 45 20 61 3e 62  OM t1) WHERE a>b
151a0 3b 0a 20 20 2a 2a 20 20 20 5c 20 20 20 20 20 20  ;.  **   \      
151b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c                 \
151c0 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 20 73 75  _____________ su
151d0 62 71 75 65 72 79 20 5f 5f 5f 5f 5f 5f 5f 5f 5f  bquery _________
151e0 5f 2f 20 20 20 20 20 20 20 20 20 20 2f 0a 20 20  _/          /.  
151f0 2a 2a 20 20 20 20 5c 5f 5f 5f 5f 5f 5f 5f 5f 5f  **    \_________
15200 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 20 6f 75 74  ____________ out
15210 65 72 20 71 75 65 72 79 20 5f 5f 5f 5f 5f 5f 5f  er query _______
15220 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f  ________________
15230 5f 5f 5f 5f 5f 5f 5f 2f 0a 20 20 2a 2a 0a 20 20  _______/.  **.  
15240 2a 2a 20 57 65 20 6c 6f 6f 6b 20 61 74 20 65 76  ** We look at ev
15250 65 72 79 20 65 78 70 72 65 73 73 69 6f 6e 20 69  ery expression i
15260 6e 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72  n the outer quer
15270 79 20 61 6e 64 20 65 76 65 72 79 20 70 6c 61 63  y and every plac
15280 65 20 77 65 20 73 65 65 0a 20 20 2a 2a 20 22 61  e we see.  ** "a
15290 22 20 77 65 20 73 75 62 73 74 69 74 75 74 65 20  " we substitute 
152a0 22 78 2a 33 22 20 61 6e 64 20 65 76 65 72 79 20  "x*3" and every 
152b0 70 6c 61 63 65 20 77 65 20 73 65 65 20 22 62 22  place we see "b"
152c0 20 77 65 20 73 75 62 73 74 69 74 75 74 65 20 22   we substitute "
152d0 79 2b 31 30 22 2e 0a 20 20 2a 2f 0a 20 20 70 4c  y+10"..  */.  pL
152e0 69 73 74 20 3d 20 70 2d 3e 70 45 4c 69 73 74 3b  ist = p->pEList;
152f0 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4c  .  for(i=0; i<pL
15300 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29  ist->nExpr; i++)
15310 7b 0a 20 20 20 20 45 78 70 72 20 2a 70 45 78 70  {.    Expr *pExp
15320 72 3b 0a 20 20 20 20 69 66 28 20 70 4c 69 73 74  r;.    if( pList
15330 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 3d 3d 30 20  ->a[i].zName==0 
15340 26 26 20 28 70 45 78 70 72 20 3d 20 70 4c 69 73  && (pExpr = pLis
15350 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 29 2d 3e  t->a[i].pExpr)->
15360 73 70 61 6e 2e 7a 21 3d 30 20 29 7b 0a 20 20 20  span.z!=0 ){.   
15370 20 20 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a     pList->a[i].z
15380 4e 61 6d 65 20 3d 20 0a 20 20 20 20 20 20 20 20  Name = .        
15390 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 53 74       sqlite3DbSt
153a0 72 4e 44 75 70 28 64 62 2c 20 28 63 68 61 72 2a  rNDup(db, (char*
153b0 29 70 45 78 70 72 2d 3e 73 70 61 6e 2e 7a 2c 20  )pExpr->span.z, 
153c0 70 45 78 70 72 2d 3e 73 70 61 6e 2e 6e 29 3b 0a  pExpr->span.n);.
153d0 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 75 62 73      }.  }.  subs
153e0 74 45 78 70 72 4c 69 73 74 28 64 62 2c 20 70 2d  tExprList(db, p-
153f0 3e 70 45 4c 69 73 74 2c 20 69 50 61 72 65 6e 74  >pEList, iParent
15400 2c 20 70 53 75 62 2d 3e 70 45 4c 69 73 74 29 3b  , pSub->pEList);
15410 0a 20 20 69 66 28 20 69 73 41 67 67 20 29 7b 0a  .  if( isAgg ){.
15420 20 20 20 20 73 75 62 73 74 45 78 70 72 4c 69 73      substExprLis
15430 74 28 64 62 2c 20 70 2d 3e 70 47 72 6f 75 70 42  t(db, p->pGroupB
15440 79 2c 20 69 50 61 72 65 6e 74 2c 20 70 53 75 62  y, iParent, pSub
15450 2d 3e 70 45 4c 69 73 74 29 3b 0a 20 20 20 20 73  ->pEList);.    s
15460 75 62 73 74 45 78 70 72 28 64 62 2c 20 70 2d 3e  ubstExpr(db, p->
15470 70 48 61 76 69 6e 67 2c 20 69 50 61 72 65 6e 74  pHaving, iParent
15480 2c 20 70 53 75 62 2d 3e 70 45 4c 69 73 74 29 3b  , pSub->pEList);
15490 0a 20 20 7d 0a 20 20 69 66 28 20 70 53 75 62 2d  .  }.  if( pSub-
154a0 3e 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20  >pOrderBy ){.   
154b0 20 61 73 73 65 72 74 28 20 70 2d 3e 70 4f 72 64   assert( p->pOrd
154c0 65 72 42 79 3d 3d 30 20 29 3b 0a 20 20 20 20 70  erBy==0 );.    p
154d0 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20 70 53 75  ->pOrderBy = pSu
154e0 62 2d 3e 70 4f 72 64 65 72 42 79 3b 0a 20 20 20  b->pOrderBy;.   
154f0 20 70 53 75 62 2d 3e 70 4f 72 64 65 72 42 79 20   pSub->pOrderBy 
15500 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  = 0;.  }else if(
15510 20 70 2d 3e 70 4f 72 64 65 72 42 79 20 29 7b 0a   p->pOrderBy ){.
15520 20 20 20 20 73 75 62 73 74 45 78 70 72 4c 69 73      substExprLis
15530 74 28 64 62 2c 20 70 2d 3e 70 4f 72 64 65 72 42  t(db, p->pOrderB
15540 79 2c 20 69 50 61 72 65 6e 74 2c 20 70 53 75 62  y, iParent, pSub
15550 2d 3e 70 45 4c 69 73 74 29 3b 0a 20 20 7d 0a 20  ->pEList);.  }. 
15560 20 69 66 28 20 70 53 75 62 2d 3e 70 57 68 65 72   if( pSub->pWher
15570 65 20 29 7b 0a 20 20 20 20 70 57 68 65 72 65 20  e ){.    pWhere 
15580 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44 75 70  = sqlite3ExprDup
15590 28 64 62 2c 20 70 53 75 62 2d 3e 70 57 68 65 72  (db, pSub->pWher
155a0 65 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  e);.  }else{.   
155b0 20 70 57 68 65 72 65 20 3d 20 30 3b 0a 20 20 7d   pWhere = 0;.  }
155c0 0a 20 20 69 66 28 20 73 75 62 71 75 65 72 79 49  .  if( subqueryI
155d0 73 41 67 67 20 29 7b 0a 20 20 20 20 61 73 73 65  sAgg ){.    asse
155e0 72 74 28 20 70 2d 3e 70 48 61 76 69 6e 67 3d 3d  rt( p->pHaving==
155f0 30 20 29 3b 0a 20 20 20 20 70 2d 3e 70 48 61 76  0 );.    p->pHav
15600 69 6e 67 20 3d 20 70 2d 3e 70 57 68 65 72 65 3b  ing = p->pWhere;
15610 0a 20 20 20 20 70 2d 3e 70 57 68 65 72 65 20 3d  .    p->pWhere =
15620 20 70 57 68 65 72 65 3b 0a 20 20 20 20 73 75 62   pWhere;.    sub
15630 73 74 45 78 70 72 28 64 62 2c 20 70 2d 3e 70 48  stExpr(db, p->pH
15640 61 76 69 6e 67 2c 20 69 50 61 72 65 6e 74 2c 20  aving, iParent, 
15650 70 53 75 62 2d 3e 70 45 4c 69 73 74 29 3b 0a 20  pSub->pEList);. 
15660 20 20 20 70 2d 3e 70 48 61 76 69 6e 67 20 3d 20     p->pHaving = 
15670 73 71 6c 69 74 65 33 45 78 70 72 41 6e 64 28 64  sqlite3ExprAnd(d
15680 62 2c 20 70 2d 3e 70 48 61 76 69 6e 67 2c 20 0a  b, p->pHaving, .
15690 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
156a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
156b0 73 71 6c 69 74 65 33 45 78 70 72 44 75 70 28 64  sqlite3ExprDup(d
156c0 62 2c 20 70 53 75 62 2d 3e 70 48 61 76 69 6e 67  b, pSub->pHaving
156d0 29 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  ));.    assert( 
156e0 70 2d 3e 70 47 72 6f 75 70 42 79 3d 3d 30 20 29  p->pGroupBy==0 )
156f0 3b 0a 20 20 20 20 70 2d 3e 70 47 72 6f 75 70 42  ;.    p->pGroupB
15700 79 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c  y = sqlite3ExprL
15710 69 73 74 44 75 70 28 64 62 2c 20 70 53 75 62 2d  istDup(db, pSub-
15720 3e 70 47 72 6f 75 70 42 79 29 3b 0a 20 20 7d 65  >pGroupBy);.  }e
15730 6c 73 65 7b 0a 20 20 20 20 73 75 62 73 74 45 78  lse{.    substEx
15740 70 72 28 64 62 2c 20 70 2d 3e 70 57 68 65 72 65  pr(db, p->pWhere
15750 2c 20 69 50 61 72 65 6e 74 2c 20 70 53 75 62 2d  , iParent, pSub-
15760 3e 70 45 4c 69 73 74 29 3b 0a 20 20 20 20 70 2d  >pEList);.    p-
15770 3e 70 57 68 65 72 65 20 3d 20 73 71 6c 69 74 65  >pWhere = sqlite
15780 33 45 78 70 72 41 6e 64 28 64 62 2c 20 70 2d 3e  3ExprAnd(db, p->
15790 70 57 68 65 72 65 2c 20 70 57 68 65 72 65 29 3b  pWhere, pWhere);
157a0 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 66  .  }..  /* The f
157b0 6c 61 74 74 65 6e 65 64 20 71 75 65 72 79 20 69  lattened query i
157c0 73 20 64 69 73 74 69 6e 63 74 20 69 66 20 65 69  s distinct if ei
157d0 74 68 65 72 20 74 68 65 20 69 6e 6e 65 72 20 6f  ther the inner o
157e0 72 20 74 68 65 0a 20 20 2a 2a 20 6f 75 74 65 72  r the.  ** outer
157f0 20 71 75 65 72 79 20 69 73 20 64 69 73 74 69 6e   query is distin
15800 63 74 2e 20 0a 20 20 2a 2f 0a 20 20 70 2d 3e 69  ct. .  */.  p->i
15810 73 44 69 73 74 69 6e 63 74 20 3d 20 70 2d 3e 69  sDistinct = p->i
15820 73 44 69 73 74 69 6e 63 74 20 7c 7c 20 70 53 75  sDistinct || pSu
15830 62 2d 3e 69 73 44 69 73 74 69 6e 63 74 3b 0a 0a  b->isDistinct;..
15840 20 20 2f 2a 0a 20 20 2a 2a 20 53 45 4c 45 43 54    /*.  ** SELECT
15850 20 2e 2e 2e 20 46 52 4f 4d 20 28 53 45 4c 45 43   ... FROM (SELEC
15860 54 20 2e 2e 2e 20 4c 49 4d 49 54 20 61 20 4f 46  T ... LIMIT a OF
15870 46 53 45 54 20 62 29 20 4c 49 4d 49 54 20 78 20  FSET b) LIMIT x 
15880 4f 46 46 53 45 54 20 79 3b 0a 20 20 2a 2a 0a 20  OFFSET y;.  **. 
15890 20 2a 2a 20 4f 6e 65 20 69 73 20 74 65 6d 70 74   ** One is tempt
158a0 65 64 20 74 6f 20 74 72 79 20 74 6f 20 61 64 64  ed to try to add
158b0 20 61 20 61 6e 64 20 62 20 74 6f 20 63 6f 6d 62   a and b to comb
158c0 69 6e 65 20 74 68 65 20 6c 69 6d 69 74 73 2e 20  ine the limits. 
158d0 20 42 75 74 20 74 68 69 73 0a 20 20 2a 2a 20 64   But this.  ** d
158e0 6f 65 73 20 6e 6f 74 20 77 6f 72 6b 20 69 66 20  oes not work if 
158f0 65 69 74 68 65 72 20 6c 69 6d 69 74 20 69 73 20  either limit is 
15900 6e 65 67 61 74 69 76 65 2e 0a 20 20 2a 2f 0a 20  negative..  */. 
15910 20 69 66 28 20 70 53 75 62 2d 3e 70 4c 69 6d 69   if( pSub->pLimi
15920 74 20 29 7b 0a 20 20 20 20 70 2d 3e 70 4c 69 6d  t ){.    p->pLim
15930 69 74 20 3d 20 70 53 75 62 2d 3e 70 4c 69 6d 69  it = pSub->pLimi
15940 74 3b 0a 20 20 20 20 70 53 75 62 2d 3e 70 4c 69  t;.    pSub->pLi
15950 6d 69 74 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20  mit = 0;.  }..  
15960 2f 2a 20 46 69 6e 69 61 6c 6c 79 2c 20 64 65 6c  /* Finially, del
15970 65 74 65 20 77 68 61 74 20 69 73 20 6c 65 66 74  ete what is left
15980 20 6f 66 20 74 68 65 20 73 75 62 71 75 65 72 79   of the subquery
15990 20 61 6e 64 20 72 65 74 75 72 6e 0a 20 20 2a 2a   and return.  **
159a0 20 73 75 63 63 65 73 73 2e 0a 20 20 2a 2f 0a 20   success..  */. 
159b0 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65   sqlite3SelectDe
159c0 6c 65 74 65 28 70 53 75 62 29 3b 0a 20 20 72 65  lete(pSub);.  re
159d0 74 75 72 6e 20 31 3b 0a 7d 0a 23 65 6e 64 69 66  turn 1;.}.#endif
159e0 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f   /* SQLITE_OMIT_
159f0 56 49 45 57 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 41  VIEW */../*.** A
15a00 6e 61 6c 79 7a 65 20 74 68 65 20 53 45 4c 45 43  nalyze the SELEC
15a10 54 20 73 74 61 74 65 6d 65 6e 74 20 70 61 73 73  T statement pass
15a20 65 64 20 69 6e 20 61 73 20 61 6e 20 61 72 67 75  ed in as an argu
15a30 6d 65 6e 74 20 74 6f 20 73 65 65 20 69 66 20 69  ment to see if i
15a40 74 0a 2a 2a 20 69 73 20 61 20 73 69 6d 70 6c 65  t.** is a simple
15a50 20 6d 69 6e 28 29 20 6f 72 20 6d 61 78 28 29 20   min() or max() 
15a60 71 75 65 72 79 2e 20 20 49 66 20 69 74 20 69 73  query.  If it is
15a70 20 61 6e 64 20 74 68 69 73 20 71 75 65 72 79 20   and this query 
15a80 63 61 6e 20 62 65 0a 2a 2a 20 73 61 74 69 73 66  can be.** satisf
15a90 69 65 64 20 75 73 69 6e 67 20 61 20 73 69 6e 67  ied using a sing
15aa0 6c 65 20 73 65 65 6b 20 74 6f 20 74 68 65 20 62  le seek to the b
15ab0 65 67 69 6e 6e 69 6e 67 20 6f 72 20 65 6e 64 20  eginning or end 
15ac0 6f 66 20 61 6e 20 69 6e 64 65 78 2c 0a 2a 2a 20  of an index,.** 
15ad0 74 68 65 6e 20 67 65 6e 65 72 61 74 65 20 74 68  then generate th
15ae0 65 20 63 6f 64 65 20 66 6f 72 20 74 68 69 73 20  e code for this 
15af0 53 45 4c 45 43 54 20 61 6e 64 20 72 65 74 75 72  SELECT and retur
15b00 6e 20 31 2e 20 20 49 66 20 74 68 69 73 20 69 73  n 1.  If this is
15b10 20 6e 6f 74 20 61 20 0a 2a 2a 20 73 69 6d 70 6c   not a .** simpl
15b20 65 20 6d 69 6e 28 29 20 6f 72 20 6d 61 78 28 29  e min() or max()
15b30 20 71 75 65 72 79 2c 20 74 68 65 6e 20 72 65 74   query, then ret
15b40 75 72 6e 20 30 3b 0a 2a 2a 0a 2a 2a 20 41 20 73  urn 0;.**.** A s
15b50 69 6d 70 6c 79 20 6d 69 6e 28 29 20 6f 72 20 6d  imply min() or m
15b60 61 78 28 29 20 71 75 65 72 79 20 6c 6f 6f 6b 73  ax() query looks
15b70 20 6c 69 6b 65 20 74 68 69 73 3a 0a 2a 2a 0a 2a   like this:.**.*
15b80 2a 20 20 20 20 53 45 4c 45 43 54 20 6d 69 6e 28  *    SELECT min(
15b90 61 29 20 46 52 4f 4d 20 74 61 62 6c 65 3b 0a 2a  a) FROM table;.*
15ba0 2a 20 20 20 20 53 45 4c 45 43 54 20 6d 61 78 28  *    SELECT max(
15bb0 61 29 20 46 52 4f 4d 20 74 61 62 6c 65 3b 0a 2a  a) FROM table;.*
15bc0 2a 0a 2a 2a 20 54 68 65 20 71 75 65 72 79 20 6d  *.** The query m
15bd0 61 79 20 68 61 76 65 20 6f 6e 6c 79 20 61 20 73  ay have only a s
15be0 69 6e 67 6c 65 20 74 61 62 6c 65 20 69 6e 20 69  ingle table in i
15bf0 74 73 20 46 52 4f 4d 20 61 72 67 75 6d 65 6e 74  ts FROM argument
15c00 2e 20 20 54 68 65 72 65 0a 2a 2a 20 63 61 6e 20  .  There.** can 
15c10 62 65 20 6e 6f 20 47 52 4f 55 50 20 42 59 20 6f  be no GROUP BY o
15c20 72 20 48 41 56 49 4e 47 20 6f 72 20 57 48 45 52  r HAVING or WHER
15c30 45 20 63 6c 61 75 73 65 73 2e 20 20 54 68 65 20  E clauses.  The 
15c40 72 65 73 75 6c 74 20 73 65 74 20 6d 75 73 74 0a  result set must.
15c50 2a 2a 20 62 65 20 74 68 65 20 6d 69 6e 28 29 20  ** be the min() 
15c60 6f 72 20 6d 61 78 28 29 20 6f 66 20 61 20 73 69  or max() of a si
15c70 6e 67 6c 65 20 63 6f 6c 75 6d 6e 20 6f 66 20 74  ngle column of t
15c80 68 65 20 74 61 62 6c 65 2e 20 20 54 68 65 20 63  he table.  The c
15c90 6f 6c 75 6d 6e 0a 2a 2a 20 69 6e 20 74 68 65 20  olumn.** in the 
15ca0 6d 69 6e 28 29 20 6f 72 20 6d 61 78 28 29 20 66  min() or max() f
15cb0 75 6e 63 74 69 6f 6e 20 6d 75 73 74 20 62 65 20  unction must be 
15cc0 69 6e 64 65 78 65 64 2e 0a 2a 2a 0a 2a 2a 20 54  indexed..**.** T
15cd0 68 65 20 70 61 72 61 6d 65 74 65 72 73 20 74 6f  he parameters to
15ce0 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 61 72   this routine ar
15cf0 65 20 74 68 65 20 73 61 6d 65 20 61 73 20 66 6f  e the same as fo
15d00 72 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28  r sqlite3Select(
15d10 29 2e 0a 2a 2a 20 53 65 65 20 74 68 65 20 68 65  )..** See the he
15d20 61 64 65 72 20 63 6f 6d 6d 65 6e 74 20 6f 6e 20  ader comment on 
15d30 74 68 61 74 20 72 6f 75 74 69 6e 65 20 66 6f 72  that routine for
15d40 20 61 64 64 69 74 69 6f 6e 61 6c 20 69 6e 66 6f   additional info
15d50 72 6d 61 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74  rmation..*/.stat
15d60 69 63 20 69 6e 74 20 73 69 6d 70 6c 65 4d 69 6e  ic int simpleMin
15d70 4d 61 78 51 75 65 72 79 28 50 61 72 73 65 20 2a  MaxQuery(Parse *
15d80 70 50 61 72 73 65 2c 20 53 65 6c 65 63 74 20 2a  pParse, Select *
15d90 70 2c 20 53 65 6c 65 63 74 44 65 73 74 20 2a 70  p, SelectDest *p
15da0 44 65 73 74 29 7b 0a 20 20 45 78 70 72 20 2a 70  Dest){.  Expr *p
15db0 45 78 70 72 3b 0a 20 20 69 6e 74 20 69 43 6f 6c  Expr;.  int iCol
15dc0 3b 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b  ;.  Table *pTab;
15dd0 0a 20 20 49 6e 64 65 78 20 2a 70 49 64 78 3b 0a  .  Index *pIdx;.
15de0 20 20 69 6e 74 20 62 61 73 65 3b 0a 20 20 56 64    int base;.  Vd
15df0 62 65 20 2a 76 3b 0a 20 20 69 6e 74 20 73 65 65  be *v;.  int see
15e00 6b 4f 70 3b 0a 20 20 45 78 70 72 4c 69 73 74 20  kOp;.  ExprList 
15e10 2a 70 45 4c 69 73 74 2c 20 2a 70 4c 69 73 74 2c  *pEList, *pList,
15e20 20 65 4c 69 73 74 3b 0a 20 20 73 74 72 75 63 74   eList;.  struct
15e30 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 65   ExprList_item e
15e40 4c 69 73 74 49 74 65 6d 3b 0a 20 20 53 72 63 4c  ListItem;.  SrcL
15e50 69 73 74 20 2a 70 53 72 63 3b 0a 20 20 69 6e 74  ist *pSrc;.  int
15e60 20 62 72 6b 3b 0a 20 20 69 6e 74 20 69 44 62 3b   brk;.  int iDb;
15e70 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 74 6f 20  ..  /* Check to 
15e80 73 65 65 20 69 66 20 74 68 69 73 20 71 75 65 72  see if this quer
15e90 79 20 69 73 20 61 20 73 69 6d 70 6c 65 20 6d 69  y is a simple mi
15ea0 6e 28 29 20 6f 72 20 6d 61 78 28 29 20 71 75 65  n() or max() que
15eb0 72 79 2e 20 20 52 65 74 75 72 6e 0a 20 20 2a 2a  ry.  Return.  **
15ec0 20 7a 65 72 6f 20 69 66 20 69 74 20 69 73 20 20   zero if it is  
15ed0 6e 6f 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  not..  */.  if( 
15ee0 70 2d 3e 70 47 72 6f 75 70 42 79 20 7c 7c 20 70  p->pGroupBy || p
15ef0 2d 3e 70 48 61 76 69 6e 67 20 7c 7c 20 70 2d 3e  ->pHaving || p->
15f00 70 57 68 65 72 65 20 29 20 72 65 74 75 72 6e 20  pWhere ) return 
15f10 30 3b 0a 20 20 70 53 72 63 20 3d 20 70 2d 3e 70  0;.  pSrc = p->p
15f20 53 72 63 3b 0a 20 20 69 66 28 20 70 53 72 63 2d  Src;.  if( pSrc-
15f30 3e 6e 53 72 63 21 3d 31 20 29 20 72 65 74 75 72  >nSrc!=1 ) retur
15f40 6e 20 30 3b 0a 20 20 70 45 4c 69 73 74 20 3d 20  n 0;.  pEList = 
15f50 70 2d 3e 70 45 4c 69 73 74 3b 0a 20 20 69 66 28  p->pEList;.  if(
15f60 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 21 3d   pEList->nExpr!=
15f70 31 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  1 ) return 0;.  
15f80 70 45 78 70 72 20 3d 20 70 45 4c 69 73 74 2d 3e  pExpr = pEList->
15f90 61 5b 30 5d 2e 70 45 78 70 72 3b 0a 20 20 69 66  a[0].pExpr;.  if
15fa0 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f  ( pExpr->op!=TK_
15fb0 41 47 47 5f 46 55 4e 43 54 49 4f 4e 20 29 20 72  AGG_FUNCTION ) r
15fc0 65 74 75 72 6e 20 30 3b 0a 20 20 70 4c 69 73 74  eturn 0;.  pList
15fd0 20 3d 20 70 45 78 70 72 2d 3e 70 4c 69 73 74 3b   = pExpr->pList;
15fe0 0a 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20  .  if( pList==0 
15ff0 7c 7c 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72 21  || pList->nExpr!
16000 3d 31 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  =1 ) return 0;. 
16010 20 69 66 28 20 70 45 78 70 72 2d 3e 74 6f 6b 65   if( pExpr->toke
16020 6e 2e 6e 21 3d 33 20 29 20 72 65 74 75 72 6e 20  n.n!=3 ) return 
16030 30 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33  0;.  if( sqlite3
16040 53 74 72 4e 49 43 6d 70 28 28 63 68 61 72 2a 29  StrNICmp((char*)
16050 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 7a 2c 22  pExpr->token.z,"
16060 6d 69 6e 22 2c 33 29 3d 3d 30 20 29 7b 0a 20 20  min",3)==0 ){.  
16070 20 20 73 65 65 6b 4f 70 20 3d 20 4f 50 5f 52 65    seekOp = OP_Re
16080 77 69 6e 64 3b 0a 20 20 7d 65 6c 73 65 20 69 66  wind;.  }else if
16090 28 20 73 71 6c 69 74 65 33 53 74 72 4e 49 43 6d  ( sqlite3StrNICm
160a0 70 28 28 63 68 61 72 2a 29 70 45 78 70 72 2d 3e  p((char*)pExpr->
160b0 74 6f 6b 65 6e 2e 7a 2c 22 6d 61 78 22 2c 33 29  token.z,"max",3)
160c0 3d 3d 30 20 29 7b 0a 20 20 20 20 73 65 65 6b 4f  ==0 ){.    seekO
160d0 70 20 3d 20 4f 50 5f 4c 61 73 74 3b 0a 20 20 7d  p = OP_Last;.  }
160e0 65 6c 73 65 7b 0a 20 20 20 20 72 65 74 75 72 6e  else{.    return
160f0 20 30 3b 0a 20 20 7d 0a 20 20 70 45 78 70 72 20   0;.  }.  pExpr 
16100 3d 20 70 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45  = pList->a[0].pE
16110 78 70 72 3b 0a 20 20 69 66 28 20 70 45 78 70 72  xpr;.  if( pExpr
16120 2d 3e 6f 70 21 3d 54 4b 5f 43 4f 4c 55 4d 4e 20  ->op!=TK_COLUMN 
16130 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 43  ) return 0;.  iC
16140 6f 6c 20 3d 20 70 45 78 70 72 2d 3e 69 43 6f 6c  ol = pExpr->iCol
16150 75 6d 6e 3b 0a 20 20 70 54 61 62 20 3d 20 70 53  umn;.  pTab = pS
16160 72 63 2d 3e 61 5b 30 5d 2e 70 54 61 62 3b 0a 0a  rc->a[0].pTab;..
16170 20 20 2f 2a 20 54 68 69 73 20 6f 70 74 69 6d 69    /* This optimi
16180 7a 61 74 69 6f 6e 20 63 61 6e 6e 6f 74 20 62 65  zation cannot be
16190 20 75 73 65 64 20 77 69 74 68 20 76 69 72 74 75   used with virtu
161a0 61 6c 20 74 61 62 6c 65 73 2e 20 2a 2f 0a 20 20  al tables. */.  
161b0 69 66 28 20 49 73 56 69 72 74 75 61 6c 28 70 54  if( IsVirtual(pT
161c0 61 62 29 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  ab) ) return 0;.
161d0 0a 20 20 2f 2a 20 49 66 20 77 65 20 67 65 74 20  .  /* If we get 
161e0 74 6f 20 68 65 72 65 2c 20 69 74 20 6d 65 61 6e  to here, it mean
161f0 73 20 74 68 65 20 71 75 65 72 79 20 69 73 20 6f  s the query is o
16200 66 20 74 68 65 20 63 6f 72 72 65 63 74 20 66 6f  f the correct fo
16210 72 6d 2e 0a 20 20 2a 2a 20 43 68 65 63 6b 20 74  rm..  ** Check t
16220 6f 20 6d 61 6b 65 20 73 75 72 65 20 77 65 20 68  o make sure we h
16230 61 76 65 20 61 6e 20 69 6e 64 65 78 20 61 6e 64  ave an index and
16240 20 6d 61 6b 65 20 70 49 64 78 20 70 6f 69 6e 74   make pIdx point
16250 20 74 6f 20 74 68 65 0a 20 20 2a 2a 20 61 70 70   to the.  ** app
16260 72 6f 70 72 69 61 74 65 20 69 6e 64 65 78 2e 20  ropriate index. 
16270 20 49 66 20 74 68 65 20 6d 69 6e 28 29 20 6f 72   If the min() or
16280 20 6d 61 78 28 29 20 69 73 20 6f 6e 20 61 6e 20   max() is on an 
16290 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59 0a  INTEGER PRIMARY.
162a0 20 20 2a 2a 20 6b 65 79 20 63 6f 6c 75 6d 6e 2c    ** key column,
162b0 20 6e 6f 20 69 6e 64 65 78 20 69 73 20 6e 65 63   no index is nec
162c0 65 73 73 61 72 79 20 73 6f 20 73 65 74 20 70 49  essary so set pI
162d0 64 78 20 74 6f 20 4e 55 4c 4c 2e 20 20 49 66 20  dx to NULL.  If 
162e0 6e 6f 0a 20 20 2a 2a 20 75 73 61 62 6c 65 20 69  no.  ** usable i
162f0 6e 64 65 78 20 69 73 20 66 6f 75 6e 64 2c 20 72  ndex is found, r
16300 65 74 75 72 6e 20 30 2e 0a 20 20 2a 2f 0a 20 20  eturn 0..  */.  
16310 69 66 28 20 69 43 6f 6c 3c 30 20 29 7b 0a 20 20  if( iCol<0 ){.  
16320 20 20 70 49 64 78 20 3d 20 30 3b 0a 20 20 7d 65    pIdx = 0;.  }e
16330 6c 73 65 7b 0a 20 20 20 20 43 6f 6c 6c 53 65 71  lse{.    CollSeq
16340 20 2a 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65   *pColl = sqlite
16350 33 45 78 70 72 43 6f 6c 6c 53 65 71 28 70 50 61  3ExprCollSeq(pPa
16360 72 73 65 2c 20 70 45 78 70 72 29 3b 0a 20 20 20  rse, pExpr);.   
16370 20 69 66 28 20 70 43 6f 6c 6c 3d 3d 30 20 29 20   if( pColl==0 ) 
16380 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 66 6f  return 0;.    fo
16390 72 28 70 49 64 78 3d 70 54 61 62 2d 3e 70 49 6e  r(pIdx=pTab->pIn
163a0 64 65 78 3b 20 70 49 64 78 3b 20 70 49 64 78 3d  dex; pIdx; pIdx=
163b0 70 49 64 78 2d 3e 70 4e 65 78 74 29 7b 0a 20 20  pIdx->pNext){.  
163c0 20 20 20 20 61 73 73 65 72 74 28 20 70 49 64 78      assert( pIdx
163d0 2d 3e 6e 43 6f 6c 75 6d 6e 3e 3d 31 20 29 3b 0a  ->nColumn>=1 );.
163e0 20 20 20 20 20 20 69 66 28 20 70 49 64 78 2d 3e        if( pIdx->
163f0 61 69 43 6f 6c 75 6d 6e 5b 30 5d 3d 3d 69 43 6f  aiColumn[0]==iCo
16400 6c 20 26 26 20 0a 20 20 20 20 20 20 20 20 20 20  l && .          
16410 30 3d 3d 73 71 6c 69 74 65 33 53 74 72 49 43 6d  0==sqlite3StrICm
16420 70 28 70 49 64 78 2d 3e 61 7a 43 6f 6c 6c 5b 30  p(pIdx->azColl[0
16430 5d 2c 20 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65 29  ], pColl->zName)
16440 20 29 7b 0a 20 20 20 20 20 20 20 20 62 72 65 61   ){.        brea
16450 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  k;.      }.    }
16460 0a 20 20 20 20 69 66 28 20 70 49 64 78 3d 3d 30  .    if( pIdx==0
16470 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d   ) return 0;.  }
16480 0a 0a 20 20 2f 2a 20 49 64 65 6e 74 69 66 79 20  ..  /* Identify 
16490 63 6f 6c 75 6d 6e 20 74 79 70 65 73 20 69 66 20  column types if 
164a0 77 65 20 77 69 6c 6c 20 62 65 20 75 73 69 6e 67  we will be using
164b0 20 74 68 65 20 63 61 6c 6c 62 61 63 6b 2e 20 20   the callback.  
164c0 54 68 69 73 0a 20 20 2a 2a 20 73 74 65 70 20 69  This.  ** step i
164d0 73 20 73 6b 69 70 70 65 64 20 69 66 20 74 68 65  s skipped if the
164e0 20 6f 75 74 70 75 74 20 69 73 20 67 6f 69 6e 67   output is going
164f0 20 74 6f 20 61 20 74 61 62 6c 65 20 6f 72 20 61   to a table or a
16500 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 2e 0a 20 20   memory cell..  
16510 2a 2a 20 54 68 65 20 63 6f 6c 75 6d 6e 20 6e 61  ** The column na
16520 6d 65 73 20 68 61 76 65 20 61 6c 72 65 61 64 79  mes have already
16530 20 62 65 65 6e 20 67 65 6e 65 72 61 74 65 64 20   been generated 
16540 69 6e 20 74 68 65 20 63 61 6c 6c 69 6e 67 20 66  in the calling f
16550 75 6e 63 74 69 6f 6e 2e 0a 20 20 2a 2f 0a 20 20  unction..  */.  
16560 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64  v = sqlite3GetVd
16570 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20 69 66  be(pParse);.  if
16580 28 20 76 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  ( v==0 ) return 
16590 30 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20  0;..  /* If the 
165a0 6f 75 74 70 75 74 20 69 73 20 64 65 73 74 69 6e  output is destin
165b0 65 64 20 66 6f 72 20 61 20 74 65 6d 70 6f 72 61  ed for a tempora
165c0 72 79 20 74 61 62 6c 65 2c 20 6f 70 65 6e 20 74  ry table, open t
165d0 68 61 74 20 74 61 62 6c 65 2e 0a 20 20 2a 2f 0a  hat table..  */.
165e0 20 20 69 66 28 20 70 44 65 73 74 2d 3e 65 44 65    if( pDest->eDe
165f0 73 74 3d 3d 53 52 54 5f 45 70 68 65 6d 54 61 62  st==SRT_EphemTab
16600 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56   ){.    sqlite3V
16610 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
16620 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 2c 20 70  OpenEphemeral, p
16630 44 65 73 74 2d 3e 69 50 61 72 6d 2c 20 31 29 3b  Dest->iParm, 1);
16640 0a 20 20 7d 0a 0a 20 20 2f 2a 20 47 65 6e 65 72  .  }..  /* Gener
16650 61 74 69 6e 67 20 63 6f 64 65 20 74 6f 20 66 69  ating code to fi
16660 6e 64 20 74 68 65 20 6d 69 6e 20 6f 72 20 74 68  nd the min or th
16670 65 20 6d 61 78 2e 20 20 42 61 73 69 63 61 6c 6c  e max.  Basicall
16680 79 20 61 6c 6c 20 77 65 20 68 61 76 65 0a 20 20  y all we have.  
16690 2a 2a 20 74 6f 20 64 6f 20 69 73 20 66 69 6e 64  ** to do is find
166a0 20 74 68 65 20 66 69 72 73 74 20 6f 72 20 74 68   the first or th
166b0 65 20 6c 61 73 74 20 65 6e 74 72 79 20 69 6e 20  e last entry in 
166c0 74 68 65 20 63 68 6f 73 65 6e 20 69 6e 64 65 78  the chosen index
166d0 2e 20 20 49 66 0a 20 20 2a 2a 20 74 68 65 20 6d  .  If.  ** the m
166e0 69 6e 28 29 20 6f 72 20 6d 61 78 28 29 20 69 73  in() or max() is
166f0 20 6f 6e 20 74 68 65 20 49 4e 54 45 47 45 52 20   on the INTEGER 
16700 50 52 49 4d 41 52 59 20 4b 45 59 2c 20 74 68 65  PRIMARY KEY, the
16710 6e 20 66 69 6e 64 20 74 68 65 20 66 69 72 73 74  n find the first
16720 0a 20 20 2a 2a 20 6f 72 20 6c 61 73 74 20 65 6e  .  ** or last en
16730 74 72 79 20 69 6e 20 74 68 65 20 6d 61 69 6e 20  try in the main 
16740 74 61 62 6c 65 2e 0a 20 20 2a 2f 0a 20 20 69 44  table..  */.  iD
16750 62 20 3d 20 73 71 6c 69 74 65 33 53 63 68 65 6d  b = sqlite3Schem
16760 61 54 6f 49 6e 64 65 78 28 70 50 61 72 73 65 2d  aToIndex(pParse-
16770 3e 64 62 2c 20 70 54 61 62 2d 3e 70 53 63 68 65  >db, pTab->pSche
16780 6d 61 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69  ma);.  assert( i
16790 44 62 3e 3d 30 20 7c 7c 20 70 54 61 62 2d 3e 69  Db>=0 || pTab->i
167a0 73 45 70 68 65 6d 20 29 3b 0a 20 20 73 71 6c 69  sEphem );.  sqli
167b0 74 65 33 43 6f 64 65 56 65 72 69 66 79 53 63 68  te3CodeVerifySch
167c0 65 6d 61 28 70 50 61 72 73 65 2c 20 69 44 62 29  ema(pParse, iDb)
167d0 3b 0a 20 20 73 71 6c 69 74 65 33 54 61 62 6c 65  ;.  sqlite3Table
167e0 4c 6f 63 6b 28 70 50 61 72 73 65 2c 20 69 44 62  Lock(pParse, iDb
167f0 2c 20 70 54 61 62 2d 3e 74 6e 75 6d 2c 20 30 2c  , pTab->tnum, 0,
16800 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20   pTab->zName);. 
16810 20 62 61 73 65 20 3d 20 70 53 72 63 2d 3e 61 5b   base = pSrc->a[
16820 30 5d 2e 69 43 75 72 73 6f 72 3b 0a 20 20 62 72  0].iCursor;.  br
16830 6b 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d  k = sqlite3VdbeM
16840 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 63  akeLabel(v);.  c
16850 6f 6d 70 75 74 65 4c 69 6d 69 74 52 65 67 69 73  omputeLimitRegis
16860 74 65 72 73 28 70 50 61 72 73 65 2c 20 70 2c 20  ters(pParse, p, 
16870 62 72 6b 29 3b 0a 20 20 69 66 28 20 70 53 72 63  brk);.  if( pSrc
16880 2d 3e 61 5b 30 5d 2e 70 53 65 6c 65 63 74 3d 3d  ->a[0].pSelect==
16890 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  0 ){.    sqlite3
168a0 4f 70 65 6e 54 61 62 6c 65 28 70 50 61 72 73 65  OpenTable(pParse
168b0 2c 20 62 61 73 65 2c 20 69 44 62 2c 20 70 54 61  , base, iDb, pTa
168c0 62 2c 20 4f 50 5f 4f 70 65 6e 52 65 61 64 29 3b  b, OP_OpenRead);
168d0 0a 20 20 7d 0a 20 20 69 66 28 20 70 49 64 78 3d  .  }.  if( pIdx=
168e0 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  =0 ){.    sqlite
168f0 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 73  3VdbeAddOp2(v, s
16900 65 65 6b 4f 70 2c 20 62 61 73 65 2c 20 30 29 3b  eekOp, base, 0);
16910 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a  .  }else{.    /*
16920 20 45 76 65 6e 20 74 68 6f 75 67 68 20 74 68 65   Even though the
16930 20 63 75 72 73 6f 72 20 75 73 65 64 20 74 6f 20   cursor used to 
16940 6f 70 65 6e 20 74 68 65 20 69 6e 64 65 78 20 68  open the index h
16950 65 72 65 20 69 73 20 63 6c 6f 73 65 64 0a 20 20  ere is closed.  
16960 20 20 2a 2a 20 61 73 20 73 6f 6f 6e 20 61 73 20    ** as soon as 
16970 61 20 73 69 6e 67 6c 65 20 76 61 6c 75 65 20 68  a single value h
16980 61 73 20 62 65 65 6e 20 72 65 61 64 20 66 72 6f  as been read fro
16990 6d 20 69 74 2c 20 61 6c 6c 6f 63 61 74 65 20 69  m it, allocate i
169a0 74 0a 20 20 20 20 2a 2a 20 75 73 69 6e 67 20 28  t.    ** using (
169b0 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 29 20  pParse->nTab++) 
169c0 74 6f 20 70 72 65 76 65 6e 74 20 74 68 65 20 63  to prevent the c
169d0 75 72 73 6f 72 20 69 64 20 66 72 6f 6d 20 62 65  ursor id from be
169e0 69 6e 67 20 0a 20 20 20 20 2a 2a 20 72 65 75 73  ing .    ** reus
169f0 65 64 2e 20 54 68 69 73 20 69 73 20 69 6d 70 6f  ed. This is impo
16a00 72 74 61 6e 74 20 66 6f 72 20 73 74 61 74 65 6d  rtant for statem
16a10 65 6e 74 73 20 6f 66 20 74 68 65 20 66 6f 72 6d  ents of the form
16a20 20 0a 20 20 20 20 2a 2a 20 22 49 4e 53 45 52 54   .    ** "INSERT
16a30 20 49 4e 54 4f 20 78 20 53 45 4c 45 43 54 20 6d   INTO x SELECT m
16a40 61 78 28 29 20 46 52 4f 4d 20 78 22 2e 0a 20 20  ax() FROM x"..  
16a50 20 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 49 64    */.    int iId
16a60 78 3b 0a 20 20 20 20 4b 65 79 49 6e 66 6f 20 2a  x;.    KeyInfo *
16a70 70 4b 65 79 20 3d 20 73 71 6c 69 74 65 33 49 6e  pKey = sqlite3In
16a80 64 65 78 4b 65 79 69 6e 66 6f 28 70 50 61 72 73  dexKeyinfo(pPars
16a90 65 2c 20 70 49 64 78 29 3b 0a 20 20 20 20 69 49  e, pIdx);.    iI
16aa0 64 78 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61  dx = pParse->nTa
16ab0 62 2b 2b 3b 0a 20 20 20 20 61 73 73 65 72 74 28  b++;.    assert(
16ac0 20 70 49 64 78 2d 3e 70 53 63 68 65 6d 61 3d 3d   pIdx->pSchema==
16ad0 70 54 61 62 2d 3e 70 53 63 68 65 6d 61 20 29 3b  pTab->pSchema );
16ae0 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
16af0 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 4f 70 65  AddOp4(v, OP_Ope
16b00 6e 52 65 61 64 2c 20 69 49 64 78 2c 20 70 49 64  nRead, iIdx, pId
16b10 78 2d 3e 74 6e 75 6d 2c 20 69 44 62 2c 0a 20 20  x->tnum, iDb,.  
16b20 20 20 20 20 20 20 28 63 68 61 72 2a 29 70 4b 65        (char*)pKe
16b30 79 2c 20 50 34 5f 4b 45 59 49 4e 46 4f 5f 48 41  y, P4_KEYINFO_HA
16b40 4e 44 4f 46 46 29 3b 0a 20 20 20 20 69 66 28 20  NDOFF);.    if( 
16b50 73 65 65 6b 4f 70 3d 3d 4f 50 5f 52 65 77 69 6e  seekOp==OP_Rewin
16b60 64 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  d ){.      sqlit
16b70 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
16b80 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20 30 29 3b 0a  OP_Null, 0, 0);.
16b90 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
16ba0 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4d 61  eAddOp2(v, OP_Ma
16bb0 6b 65 52 65 63 6f 72 64 2c 20 31 2c 20 30 29 3b  keRecord, 1, 0);
16bc0 0a 20 20 20 20 20 20 73 65 65 6b 4f 70 20 3d 20  .      seekOp = 
16bd0 4f 50 5f 4d 6f 76 65 47 74 3b 0a 20 20 20 20 7d  OP_MoveGt;.    }
16be0 0a 20 20 20 20 69 66 28 20 70 49 64 78 2d 3e 61  .    if( pIdx->a
16bf0 53 6f 72 74 4f 72 64 65 72 5b 30 5d 3d 3d 53 51  SortOrder[0]==SQ
16c00 4c 49 54 45 5f 53 4f 5f 44 45 53 43 20 29 7b 0a  LITE_SO_DESC ){.
16c10 20 20 20 20 20 20 2f 2a 20 54 69 63 6b 65 74 20        /* Ticket 
16c20 23 32 35 31 34 3a 20 69 6e 76 65 72 74 20 74 68  #2514: invert th
16c30 65 20 73 65 65 6b 20 6f 70 65 72 61 74 6f 72 20  e seek operator 
16c40 69 66 20 77 65 20 61 72 65 20 75 73 69 6e 67 0a  if we are using.
16c50 20 20 20 20 20 20 2a 2a 20 61 20 64 65 73 63 65        ** a desce
16c60 6e 64 69 6e 67 20 69 6e 64 65 78 2e 20 2a 2f 0a  nding index. */.
16c70 20 20 20 20 20 20 69 66 28 20 73 65 65 6b 4f 70        if( seekOp
16c80 3d 3d 4f 50 5f 4c 61 73 74 20 29 7b 0a 20 20 20  ==OP_Last ){.   
16c90 20 20 20 20 20 73 65 65 6b 4f 70 20 3d 20 4f 50       seekOp = OP
16ca0 5f 52 65 77 69 6e 64 3b 0a 20 20 20 20 20 20 7d  _Rewind;.      }
16cb0 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 61 73  else{.        as
16cc0 73 65 72 74 28 20 73 65 65 6b 4f 70 3d 3d 4f 50  sert( seekOp==OP
16cd0 5f 4d 6f 76 65 47 74 20 29 3b 0a 20 20 20 20 20  _MoveGt );.     
16ce0 20 20 20 73 65 65 6b 4f 70 20 3d 20 4f 50 5f 4d     seekOp = OP_M
16cf0 6f 76 65 4c 74 3b 0a 20 20 20 20 20 20 7d 0a 20  oveLt;.      }. 
16d00 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
16d10 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 73 65  VdbeAddOp2(v, se
16d20 65 6b 4f 70 2c 20 69 49 64 78 2c 20 30 29 3b 0a  ekOp, iIdx, 0);.
16d30 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
16d40 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 64 78 52  ddOp2(v, OP_IdxR
16d50 6f 77 69 64 2c 20 69 49 64 78 2c 20 30 29 3b 0a  owid, iIdx, 0);.
16d60 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
16d70 64 64 4f 70 32 28 76 2c 20 4f 50 5f 43 6c 6f 73  ddOp2(v, OP_Clos
16d80 65 2c 20 69 49 64 78 2c 20 30 29 3b 0a 20 20 20  e, iIdx, 0);.   
16d90 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
16da0 70 32 28 76 2c 20 4f 50 5f 4d 6f 76 65 47 65 2c  p2(v, OP_MoveGe,
16db0 20 62 61 73 65 2c 20 30 29 3b 0a 20 20 7d 0a 20   base, 0);.  }. 
16dc0 20 65 4c 69 73 74 2e 6e 45 78 70 72 20 3d 20 31   eList.nExpr = 1
16dd0 3b 0a 20 20 6d 65 6d 73 65 74 28 26 65 4c 69 73  ;.  memset(&eLis
16de0 74 49 74 65 6d 2c 20 30 2c 20 73 69 7a 65 6f 66  tItem, 0, sizeof
16df0 28 65 4c 69 73 74 49 74 65 6d 29 29 3b 0a 20 20  (eListItem));.  
16e00 65 4c 69 73 74 2e 61 20 3d 20 26 65 4c 69 73 74  eList.a = &eList
16e10 49 74 65 6d 3b 0a 20 20 65 4c 69 73 74 2e 61 5b  Item;.  eList.a[
16e20 30 5d 2e 70 45 78 70 72 20 3d 20 70 45 78 70 72  0].pExpr = pExpr
16e30 3b 0a 20 20 73 65 6c 65 63 74 49 6e 6e 65 72 4c  ;.  selectInnerL
16e40 6f 6f 70 28 70 50 61 72 73 65 2c 20 70 2c 20 26  oop(pParse, p, &
16e50 65 4c 69 73 74 2c 20 30 2c 20 30 2c 20 30 2c 20  eList, 0, 0, 0, 
16e60 2d 31 2c 20 70 44 65 73 74 2c 20 62 72 6b 2c 20  -1, pDest, brk, 
16e70 62 72 6b 2c 20 30 29 3b 0a 20 20 73 71 6c 69 74  brk, 0);.  sqlit
16e80 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62  e3VdbeResolveLab
16e90 65 6c 28 76 2c 20 62 72 6b 29 3b 0a 20 20 73 71  el(v, brk);.  sq
16ea0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
16eb0 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 62 61 73  v, OP_Close, bas
16ec0 65 2c 20 30 29 3b 0a 20 20 0a 20 20 72 65 74 75  e, 0);.  .  retu
16ed0 72 6e 20 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  rn 1;.}../*.** T
16ee0 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 73 6f  his routine reso
16ef0 6c 76 65 73 20 61 6e 79 20 6e 61 6d 65 73 20 75  lves any names u
16f00 73 65 64 20 69 6e 20 74 68 65 20 72 65 73 75 6c  sed in the resul
16f10 74 20 73 65 74 20 6f 66 20 74 68 65 0a 2a 2a 20  t set of the.** 
16f20 73 75 70 70 6c 69 65 64 20 53 45 4c 45 43 54 20  supplied SELECT 
16f30 73 74 61 74 65 6d 65 6e 74 2e 20 49 66 20 74 68  statement. If th
16f40 65 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  e SELECT stateme
16f50 6e 74 20 62 65 69 6e 67 20 72 65 73 6f 6c 76 65  nt being resolve
16f60 64 0a 2a 2a 20 69 73 20 61 20 73 75 62 2d 73 65  d.** is a sub-se
16f70 6c 65 63 74 2c 20 74 68 65 6e 20 70 4f 75 74 65  lect, then pOute
16f80 72 4e 43 20 69 73 20 61 20 70 6f 69 6e 74 65 72  rNC is a pointer
16f90 20 74 6f 20 74 68 65 20 4e 61 6d 65 43 6f 6e 74   to the NameCont
16fa0 65 78 74 20 0a 2a 2a 20 6f 66 20 74 68 65 20 70  ext .** of the p
16fb0 61 72 65 6e 74 20 53 45 4c 45 43 54 2e 0a 2a 2f  arent SELECT..*/
16fc0 0a 69 6e 74 20 73 71 6c 69 74 65 33 53 65 6c 65  .int sqlite3Sele
16fd0 63 74 52 65 73 6f 6c 76 65 28 0a 20 20 50 61 72  ctResolve(.  Par
16fe0 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20  se *pParse,     
16ff0 20 20 20 20 2f 2a 20 54 68 65 20 70 61 72 73 65      /* The parse
17000 72 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53  r context */.  S
17010 65 6c 65 63 74 20 2a 70 2c 20 20 20 20 20 20 20  elect *p,       
17020 20 20 20 20 20 20 2f 2a 20 54 68 65 20 53 45 4c        /* The SEL
17030 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 62 65  ECT statement be
17040 69 6e 67 20 63 6f 64 65 64 2e 20 2a 2f 0a 20 20  ing coded. */.  
17050 4e 61 6d 65 43 6f 6e 74 65 78 74 20 2a 70 4f 75  NameContext *pOu
17060 74 65 72 4e 43 20 20 2f 2a 20 54 68 65 20 6f 75  terNC  /* The ou
17070 74 65 72 20 6e 61 6d 65 20 63 6f 6e 74 65 78 74  ter name context
17080 2e 20 4d 61 79 20 62 65 20 4e 55 4c 4c 2e 20 2a  . May be NULL. *
17090 2f 0a 29 7b 0a 20 20 45 78 70 72 4c 69 73 74 20  /.){.  ExprList 
170a0 2a 70 45 4c 69 73 74 3b 20 20 20 20 20 20 20 20  *pEList;        
170b0 20 20 2f 2a 20 52 65 73 75 6c 74 20 73 65 74 2e    /* Result set.
170c0 20 2a 2f 0a 20 20 69 6e 74 20 69 3b 20 20 20 20   */.  int i;    
170d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
170e0 20 2f 2a 20 46 6f 72 2d 6c 6f 6f 70 20 76 61 72   /* For-loop var
170f0 69 61 62 6c 65 20 75 73 65 64 20 69 6e 20 6d 75  iable used in mu
17100 6c 74 69 70 6c 65 20 70 6c 61 63 65 73 20 2a 2f  ltiple places */
17110 0a 20 20 4e 61 6d 65 43 6f 6e 74 65 78 74 20 73  .  NameContext s
17120 4e 43 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  NC;           /*
17130 20 4c 6f 63 61 6c 20 6e 61 6d 65 2d 63 6f 6e 74   Local name-cont
17140 65 78 74 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73  ext */.  ExprLis
17150 74 20 2a 70 47 72 6f 75 70 42 79 3b 20 20 20 20  t *pGroupBy;    
17160 20 20 20 20 2f 2a 20 54 68 65 20 67 72 6f 75 70      /* The group
17170 20 62 79 20 63 6c 61 75 73 65 20 2a 2f 0a 0a 20   by clause */.. 
17180 20 2f 2a 20 49 66 20 74 68 69 73 20 72 6f 75 74   /* If this rout
17190 69 6e 65 20 68 61 73 20 72 75 6e 20 62 65 66 6f  ine has run befo
171a0 72 65 2c 20 72 65 74 75 72 6e 20 69 6d 6d 65 64  re, return immed
171b0 69 61 74 65 6c 79 2e 20 2a 2f 0a 20 20 69 66 28  iately. */.  if(
171c0 20 70 2d 3e 69 73 52 65 73 6f 6c 76 65 64 20 29   p->isResolved )
171d0 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 21 70  {.    assert( !p
171e0 4f 75 74 65 72 4e 43 20 29 3b 0a 20 20 20 20 72  OuterNC );.    r
171f0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
17200 0a 20 20 7d 0a 20 20 70 2d 3e 69 73 52 65 73 6f  .  }.  p->isReso
17210 6c 76 65 64 20 3d 20 31 3b 0a 0a 20 20 2f 2a 20  lved = 1;..  /* 
17220 49 66 20 74 68 65 72 65 20 68 61 76 65 20 61 6c  If there have al
17230 72 65 61 64 79 20 62 65 65 6e 20 65 72 72 6f 72  ready been error
17240 73 2c 20 64 6f 20 6e 6f 74 68 69 6e 67 2e 20 2a  s, do nothing. *
17250 2f 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e  /.  if( pParse->
17260 6e 45 72 72 3e 30 20 29 7b 0a 20 20 20 20 72 65  nErr>0 ){.    re
17270 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f  turn SQLITE_ERRO
17280 52 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 50 72 65  R;.  }..  /* Pre
17290 70 61 72 65 20 74 68 65 20 73 65 6c 65 63 74 20  pare the select 
172a0 73 74 61 74 65 6d 65 6e 74 2e 20 54 68 69 73 20  statement. This 
172b0 63 61 6c 6c 20 77 69 6c 6c 20 61 6c 6c 6f 63 61  call will alloca
172c0 74 65 20 61 6c 6c 20 63 75 72 73 6f 72 73 0a 20  te all cursors. 
172d0 20 2a 2a 20 72 65 71 75 69 72 65 64 20 74 6f 20   ** required to 
172e0 68 61 6e 64 6c 65 20 74 68 65 20 74 61 62 6c 65  handle the table
172f0 73 20 61 6e 64 20 73 75 62 71 75 65 72 69 65 73  s and subqueries
17300 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61   in the FROM cla
17310 75 73 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  use..  */.  if( 
17320 70 72 65 70 53 65 6c 65 63 74 53 74 6d 74 28 70  prepSelectStmt(p
17330 50 61 72 73 65 2c 20 70 29 20 29 7b 0a 20 20 20  Parse, p) ){.   
17340 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45   return SQLITE_E
17350 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  RROR;.  }..  /* 
17360 52 65 73 6f 6c 76 65 20 74 68 65 20 65 78 70 72  Resolve the expr
17370 65 73 73 69 6f 6e 73 20 69 6e 20 74 68 65 20 4c  essions in the L
17380 49 4d 49 54 20 61 6e 64 20 4f 46 46 53 45 54 20  IMIT and OFFSET 
17390 63 6c 61 75 73 65 73 2e 20 54 68 65 73 65 0a 20  clauses. These. 
173a0 20 2a 2a 20 61 72 65 20 6e 6f 74 20 61 6c 6c 6f   ** are not allo
173b0 77 65 64 20 74 6f 20 72 65 66 65 72 20 74 6f 20  wed to refer to 
173c0 61 6e 79 20 6e 61 6d 65 73 2c 20 73 6f 20 70 61  any names, so pa
173d0 73 73 20 61 6e 20 65 6d 70 74 79 20 4e 61 6d 65  ss an empty Name
173e0 43 6f 6e 74 65 78 74 2e 0a 20 20 2a 2f 0a 20 20  Context..  */.  
173f0 6d 65 6d 73 65 74 28 26 73 4e 43 2c 20 30 2c 20  memset(&sNC, 0, 
17400 73 69 7a 65 6f 66 28 73 4e 43 29 29 3b 0a 20 20  sizeof(sNC));.  
17410 73 4e 43 2e 70 50 61 72 73 65 20 3d 20 70 50 61  sNC.pParse = pPa
17420 72 73 65 3b 0a 20 20 69 66 28 20 73 71 6c 69 74  rse;.  if( sqlit
17430 65 33 45 78 70 72 52 65 73 6f 6c 76 65 4e 61 6d  e3ExprResolveNam
17440 65 73 28 26 73 4e 43 2c 20 70 2d 3e 70 4c 69 6d  es(&sNC, p->pLim
17450 69 74 29 20 7c 7c 0a 20 20 20 20 20 20 73 71 6c  it) ||.      sql
17460 69 74 65 33 45 78 70 72 52 65 73 6f 6c 76 65 4e  ite3ExprResolveN
17470 61 6d 65 73 28 26 73 4e 43 2c 20 70 2d 3e 70 4f  ames(&sNC, p->pO
17480 66 66 73 65 74 29 20 29 7b 0a 20 20 20 20 72 65  ffset) ){.    re
17490 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f  turn SQLITE_ERRO
174a0 52 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 65 74  R;.  }..  /* Set
174b0 20 75 70 20 74 68 65 20 6c 6f 63 61 6c 20 6e 61   up the local na
174c0 6d 65 2d 63 6f 6e 74 65 78 74 20 74 6f 20 70 61  me-context to pa
174d0 73 73 20 74 6f 20 45 78 70 72 52 65 73 6f 6c 76  ss to ExprResolv
174e0 65 4e 61 6d 65 73 28 29 20 74 6f 0a 20 20 2a 2a  eNames() to.  **
174f0 20 72 65 73 6f 6c 76 65 20 74 68 65 20 65 78 70   resolve the exp
17500 72 65 73 73 69 6f 6e 2d 6c 69 73 74 2e 0a 20 20  ression-list..  
17510 2a 2f 0a 20 20 73 4e 43 2e 61 6c 6c 6f 77 41 67  */.  sNC.allowAg
17520 67 20 3d 20 31 3b 0a 20 20 73 4e 43 2e 70 53 72  g = 1;.  sNC.pSr
17530 63 4c 69 73 74 20 3d 20 70 2d 3e 70 53 72 63 3b  cList = p->pSrc;
17540 0a 20 20 73 4e 43 2e 70 4e 65 78 74 20 3d 20 70  .  sNC.pNext = p
17550 4f 75 74 65 72 4e 43 3b 0a 0a 20 20 2f 2a 20 52  OuterNC;..  /* R
17560 65 73 6f 6c 76 65 20 6e 61 6d 65 73 20 69 6e 20  esolve names in 
17570 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 2e 20  the result set. 
17580 2a 2f 0a 20 20 70 45 4c 69 73 74 20 3d 20 70 2d  */.  pEList = p-
17590 3e 70 45 4c 69 73 74 3b 0a 20 20 69 66 28 20 21  >pEList;.  if( !
175a0 70 45 4c 69 73 74 20 29 20 72 65 74 75 72 6e 20  pEList ) return 
175b0 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20  SQLITE_ERROR;.  
175c0 66 6f 72 28 69 3d 30 3b 20 69 3c 70 45 4c 69 73  for(i=0; i<pELis
175d0 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a  t->nExpr; i++){.
175e0 20 20 20 20 45 78 70 72 20 2a 70 58 20 3d 20 70      Expr *pX = p
175f0 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70  EList->a[i].pExp
17600 72 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74  r;.    if( sqlit
17610 65 33 45 78 70 72 52 65 73 6f 6c 76 65 4e 61 6d  e3ExprResolveNam
17620 65 73 28 26 73 4e 43 2c 20 70 58 29 20 29 7b 0a  es(&sNC, pX) ){.
17630 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
17640 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d  ITE_ERROR;.    }
17650 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68  .  }..  /* If th
17660 65 72 65 20 61 72 65 20 6e 6f 20 61 67 67 72 65  ere are no aggre
17670 67 61 74 65 20 66 75 6e 63 74 69 6f 6e 73 20 69  gate functions i
17680 6e 20 74 68 65 20 72 65 73 75 6c 74 2d 73 65 74  n the result-set
17690 2c 20 61 6e 64 20 6e 6f 20 47 52 4f 55 50 20 42  , and no GROUP B
176a0 59 20 0a 20 20 2a 2a 20 65 78 70 72 65 73 73 69  Y .  ** expressi
176b0 6f 6e 2c 20 64 6f 20 6e 6f 74 20 61 6c 6c 6f 77  on, do not allow
176c0 20 61 67 67 72 65 67 61 74 65 73 20 69 6e 20 61   aggregates in a
176d0 6e 79 20 6f 66 20 74 68 65 20 6f 74 68 65 72 20  ny of the other 
176e0 65 78 70 72 65 73 73 69 6f 6e 73 2e 0a 20 20 2a  expressions..  *
176f0 2f 0a 20 20 61 73 73 65 72 74 28 20 21 70 2d 3e  /.  assert( !p->
17700 69 73 41 67 67 20 29 3b 0a 20 20 70 47 72 6f 75  isAgg );.  pGrou
17710 70 42 79 20 3d 20 70 2d 3e 70 47 72 6f 75 70 42  pBy = p->pGroupB
17720 79 3b 0a 20 20 69 66 28 20 70 47 72 6f 75 70 42  y;.  if( pGroupB
17730 79 20 7c 7c 20 73 4e 43 2e 68 61 73 41 67 67 20  y || sNC.hasAgg 
17740 29 7b 0a 20 20 20 20 70 2d 3e 69 73 41 67 67 20  ){.    p->isAgg 
17750 3d 20 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  = 1;.  }else{.  
17760 20 20 73 4e 43 2e 61 6c 6c 6f 77 41 67 67 20 3d    sNC.allowAgg =
17770 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66   0;.  }..  /* If
17780 20 61 20 48 41 56 49 4e 47 20 63 6c 61 75 73 65   a HAVING clause
17790 20 69 73 20 70 72 65 73 65 6e 74 2c 20 74 68 65   is present, the
177a0 6e 20 74 68 65 72 65 20 6d 75 73 74 20 62 65 20  n there must be 
177b0 61 20 47 52 4f 55 50 20 42 59 20 63 6c 61 75 73  a GROUP BY claus
177c0 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d  e..  */.  if( p-
177d0 3e 70 48 61 76 69 6e 67 20 26 26 20 21 70 47 72  >pHaving && !pGr
177e0 6f 75 70 42 79 20 29 7b 0a 20 20 20 20 73 71 6c  oupBy ){.    sql
177f0 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
17800 72 73 65 2c 20 22 61 20 47 52 4f 55 50 20 42 59  rse, "a GROUP BY
17810 20 63 6c 61 75 73 65 20 69 73 20 72 65 71 75 69   clause is requi
17820 72 65 64 20 62 65 66 6f 72 65 20 48 41 56 49 4e  red before HAVIN
17830 47 22 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  G");.    return 
17840 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20  SQLITE_ERROR;.  
17850 7d 0a 0a 20 20 2f 2a 20 41 64 64 20 74 68 65 20  }..  /* Add the 
17860 65 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 20  expression list 
17870 74 6f 20 74 68 65 20 6e 61 6d 65 2d 63 6f 6e 74  to the name-cont
17880 65 78 74 20 62 65 66 6f 72 65 20 70 61 72 73 69  ext before parsi
17890 6e 67 20 74 68 65 0a 20 20 2a 2a 20 6f 74 68 65  ng the.  ** othe
178a0 72 20 65 78 70 72 65 73 73 69 6f 6e 73 20 69 6e  r expressions in
178b0 20 74 68 65 20 53 45 4c 45 43 54 20 73 74 61 74   the SELECT stat
178c0 65 6d 65 6e 74 2e 20 54 68 69 73 20 69 73 20 73  ement. This is s
178d0 6f 20 74 68 61 74 0a 20 20 2a 2a 20 65 78 70 72  o that.  ** expr
178e0 65 73 73 69 6f 6e 73 20 69 6e 20 74 68 65 20 57  essions in the W
178f0 48 45 52 45 20 63 6c 61 75 73 65 20 28 65 74 63  HERE clause (etc
17900 2e 29 20 63 61 6e 20 72 65 66 65 72 20 74 6f 20  .) can refer to 
17910 65 78 70 72 65 73 73 69 6f 6e 73 20 62 79 0a 20  expressions by. 
17920 20 2a 2a 20 61 6c 69 61 73 65 73 20 69 6e 20 74   ** aliases in t
17930 68 65 20 72 65 73 75 6c 74 20 73 65 74 2e 0a 20  he result set.. 
17940 20 2a 2a 0a 20 20 2a 2a 20 4d 69 6e 6f 72 20 70   **.  ** Minor p
17950 6f 69 6e 74 3a 20 49 66 20 74 68 69 73 20 69 73  oint: If this is
17960 20 74 68 65 20 63 61 73 65 2c 20 74 68 65 6e 20   the case, then 
17970 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 77  the expression w
17980 69 6c 6c 20 62 65 0a 20 20 2a 2a 20 72 65 2d 65  ill be.  ** re-e
17990 76 61 6c 75 61 74 65 64 20 66 6f 72 20 65 61 63  valuated for eac
179a0 68 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20 69  h reference to i
179b0 74 2e 0a 20 20 2a 2f 0a 20 20 73 4e 43 2e 70 45  t..  */.  sNC.pE
179c0 4c 69 73 74 20 3d 20 70 2d 3e 70 45 4c 69 73 74  List = p->pEList
179d0 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 45  ;.  if( sqlite3E
179e0 78 70 72 52 65 73 6f 6c 76 65 4e 61 6d 65 73 28  xprResolveNames(
179f0 26 73 4e 43 2c 20 70 2d 3e 70 57 68 65 72 65 29  &sNC, p->pWhere)
17a00 20 7c 7c 0a 20 20 20 20 20 73 71 6c 69 74 65 33   ||.     sqlite3
17a10 45 78 70 72 52 65 73 6f 6c 76 65 4e 61 6d 65 73  ExprResolveNames
17a20 28 26 73 4e 43 2c 20 70 2d 3e 70 48 61 76 69 6e  (&sNC, p->pHavin
17a30 67 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  g) ){.    return
17a40 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20   SQLITE_ERROR;. 
17a50 20 7d 0a 20 20 69 66 28 20 70 2d 3e 70 50 72 69   }.  if( p->pPri
17a60 6f 72 3d 3d 30 20 29 7b 0a 20 20 20 20 69 66 28  or==0 ){.    if(
17a70 20 70 72 6f 63 65 73 73 4f 72 64 65 72 47 72 6f   processOrderGro
17a80 75 70 42 79 28 70 50 61 72 73 65 2c 20 70 2c 20  upBy(pParse, p, 
17a90 70 2d 3e 70 4f 72 64 65 72 42 79 2c 20 31 2c 20  p->pOrderBy, 1, 
17aa0 26 73 4e 43 2e 68 61 73 41 67 67 29 20 29 7b 0a  &sNC.hasAgg) ){.
17ab0 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
17ac0 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d  ITE_ERROR;.    }
17ad0 0a 20 20 7d 0a 20 20 69 66 28 20 70 72 6f 63 65  .  }.  if( proce
17ae0 73 73 4f 72 64 65 72 47 72 6f 75 70 42 79 28 70  ssOrderGroupBy(p
17af0 50 61 72 73 65 2c 20 70 2c 20 70 47 72 6f 75 70  Parse, p, pGroup
17b00 42 79 2c 20 30 2c 20 26 73 4e 43 2e 68 61 73 41  By, 0, &sNC.hasA
17b10 67 67 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72  gg) ){.    retur
17b20 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a  n SQLITE_ERROR;.
17b30 20 20 7d 0a 0a 20 20 69 66 28 20 70 50 61 72 73    }..  if( pPars
17b40 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  e->db->mallocFai
17b50 6c 65 64 20 29 7b 0a 20 20 20 20 72 65 74 75 72  led ){.    retur
17b60 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  n SQLITE_NOMEM;.
17b70 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 73    }..  /* Make s
17b80 75 72 65 20 74 68 65 20 47 52 4f 55 50 20 42 59  ure the GROUP BY
17b90 20 63 6c 61 75 73 65 20 64 6f 65 73 20 6e 6f 74   clause does not
17ba0 20 63 6f 6e 74 61 69 6e 20 61 67 67 72 65 67 61   contain aggrega
17bb0 74 65 20 66 75 6e 63 74 69 6f 6e 73 2e 0a 20 20  te functions..  
17bc0 2a 2f 0a 20 20 69 66 28 20 70 47 72 6f 75 70 42  */.  if( pGroupB
17bd0 79 20 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20  y ){.    struct 
17be0 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70  ExprList_item *p
17bf0 49 74 65 6d 3b 0a 20 20 0a 20 20 20 20 66 6f 72  Item;.  .    for
17c00 28 69 3d 30 2c 20 70 49 74 65 6d 3d 70 47 72 6f  (i=0, pItem=pGro
17c10 75 70 42 79 2d 3e 61 3b 20 69 3c 70 47 72 6f 75  upBy->a; i<pGrou
17c20 70 42 79 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 2c  pBy->nExpr; i++,
17c30 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 20   pItem++){.     
17c40 20 69 66 28 20 45 78 70 72 48 61 73 50 72 6f 70   if( ExprHasProp
17c50 65 72 74 79 28 70 49 74 65 6d 2d 3e 70 45 78 70  erty(pItem->pExp
17c60 72 2c 20 45 50 5f 41 67 67 29 20 29 7b 0a 20 20  r, EP_Agg) ){.  
17c70 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72        sqlite3Err
17c80 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 61  orMsg(pParse, "a
17c90 67 67 72 65 67 61 74 65 20 66 75 6e 63 74 69 6f  ggregate functio
17ca0 6e 73 20 61 72 65 20 6e 6f 74 20 61 6c 6c 6f 77  ns are not allow
17cb0 65 64 20 69 6e 20 22 0a 20 20 20 20 20 20 20 20  ed in ".        
17cc0 20 20 20 20 22 74 68 65 20 47 52 4f 55 50 20 42      "the GROUP B
17cd0 59 20 63 6c 61 75 73 65 22 29 3b 0a 20 20 20 20  Y clause");.    
17ce0 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
17cf0 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 7d  E_ERROR;.      }
17d00 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
17d10 20 49 66 20 74 68 69 73 20 69 73 20 6f 6e 65 20   If this is one 
17d20 53 45 4c 45 43 54 20 6f 66 20 61 20 63 6f 6d 70  SELECT of a comp
17d30 6f 75 6e 64 2c 20 62 65 20 73 75 72 65 20 74 6f  ound, be sure to
17d40 20 72 65 73 6f 6c 76 65 20 6e 61 6d 65 73 0a 20   resolve names. 
17d50 20 2a 2a 20 69 6e 20 74 68 65 20 6f 74 68 65 72   ** in the other
17d60 20 53 45 4c 45 43 54 73 2e 0a 20 20 2a 2f 0a 20   SELECTs..  */. 
17d70 20 69 66 28 20 70 2d 3e 70 50 72 69 6f 72 20 29   if( p->pPrior )
17d80 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 73 71 6c  {.    return sql
17d90 69 74 65 33 53 65 6c 65 63 74 52 65 73 6f 6c 76  ite3SelectResolv
17da0 65 28 70 50 61 72 73 65 2c 20 70 2d 3e 70 50 72  e(pParse, p->pPr
17db0 69 6f 72 2c 20 70 4f 75 74 65 72 4e 43 29 3b 0a  ior, pOuterNC);.
17dc0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65 74    }else{.    ret
17dd0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
17de0 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 73 65   }.}../*.** Rese
17df0 74 20 74 68 65 20 61 67 67 72 65 67 61 74 65 20  t the aggregate 
17e00 61 63 63 75 6d 75 6c 61 74 6f 72 2e 0a 2a 2a 0a  accumulator..**.
17e10 2a 2a 20 54 68 65 20 61 67 67 72 65 67 61 74 65  ** The aggregate
17e20 20 61 63 63 75 6d 75 6c 61 74 6f 72 20 69 73 20   accumulator is 
17e30 61 20 73 65 74 20 6f 66 20 6d 65 6d 6f 72 79 20  a set of memory 
17e40 63 65 6c 6c 73 20 74 68 61 74 20 68 6f 6c 64 0a  cells that hold.
17e50 2a 2a 20 69 6e 74 65 72 6d 65 64 69 61 74 65 20  ** intermediate 
17e60 72 65 73 75 6c 74 73 20 77 68 69 6c 65 20 63 61  results while ca
17e70 6c 63 75 6c 61 74 69 6e 67 20 61 6e 20 61 67 67  lculating an agg
17e80 72 65 67 61 74 65 2e 20 20 54 68 69 73 0a 2a 2a  regate.  This.**
17e90 20 72 6f 75 74 69 6e 65 20 73 69 6d 70 6c 79 20   routine simply 
17ea0 73 74 6f 72 65 73 20 4e 55 4c 4c 73 20 69 6e 20  stores NULLs in 
17eb0 61 6c 6c 20 6f 66 20 74 68 6f 73 65 20 6d 65 6d  all of those mem
17ec0 6f 72 79 20 63 65 6c 6c 73 2e 0a 2a 2f 0a 73 74  ory cells..*/.st
17ed0 61 74 69 63 20 76 6f 69 64 20 72 65 73 65 74 41  atic void resetA
17ee0 63 63 75 6d 75 6c 61 74 6f 72 28 50 61 72 73 65  ccumulator(Parse
17ef0 20 2a 70 50 61 72 73 65 2c 20 41 67 67 49 6e 66   *pParse, AggInf
17f00 6f 20 2a 70 41 67 67 49 6e 66 6f 29 7b 0a 20 20  o *pAggInfo){.  
17f10 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65  Vdbe *v = pParse
17f20 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74 20 69  ->pVdbe;.  int i
17f30 3b 0a 20 20 73 74 72 75 63 74 20 41 67 67 49 6e  ;.  struct AggIn
17f40 66 6f 5f 66 75 6e 63 20 2a 70 46 75 6e 63 3b 0a  fo_func *pFunc;.
17f50 20 20 69 66 28 20 70 41 67 67 49 6e 66 6f 2d 3e    if( pAggInfo->
17f60 6e 46 75 6e 63 2b 70 41 67 67 49 6e 66 6f 2d 3e  nFunc+pAggInfo->
17f70 6e 43 6f 6c 75 6d 6e 3d 3d 30 20 29 7b 0a 20 20  nColumn==0 ){.  
17f80 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20    return;.  }.  
17f90 66 6f 72 28 69 3d 30 3b 20 69 3c 70 41 67 67 49  for(i=0; i<pAggI
17fa0 6e 66 6f 2d 3e 6e 43 6f 6c 75 6d 6e 3b 20 69 2b  nfo->nColumn; i+
17fb0 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  +){.    sqlite3V
17fc0 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
17fd0 4e 75 6c 6c 2c 20 30 2c 20 70 41 67 67 49 6e 66  Null, 0, pAggInf
17fe0 6f 2d 3e 61 43 6f 6c 5b 69 5d 2e 69 4d 65 6d 29  o->aCol[i].iMem)
17ff0 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 70 46 75 6e  ;.  }.  for(pFun
18000 63 3d 70 41 67 67 49 6e 66 6f 2d 3e 61 46 75 6e  c=pAggInfo->aFun
18010 63 2c 20 69 3d 30 3b 20 69 3c 70 41 67 67 49 6e  c, i=0; i<pAggIn
18020 66 6f 2d 3e 6e 46 75 6e 63 3b 20 69 2b 2b 2c 20  fo->nFunc; i++, 
18030 70 46 75 6e 63 2b 2b 29 7b 0a 20 20 20 20 73 71  pFunc++){.    sq
18040 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
18050 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20 70  v, OP_Null, 0, p
18060 46 75 6e 63 2d 3e 69 4d 65 6d 29 3b 0a 20 20 20  Func->iMem);.   
18070 20 69 66 28 20 70 46 75 6e 63 2d 3e 69 44 69 73   if( pFunc->iDis
18080 74 69 6e 63 74 3e 3d 30 20 29 7b 0a 20 20 20 20  tinct>=0 ){.    
18090 20 20 45 78 70 72 20 2a 70 45 20 3d 20 70 46 75    Expr *pE = pFu
180a0 6e 63 2d 3e 70 45 78 70 72 3b 0a 20 20 20 20 20  nc->pExpr;.     
180b0 20 69 66 28 20 70 45 2d 3e 70 4c 69 73 74 3d 3d   if( pE->pList==
180c0 30 20 7c 7c 20 70 45 2d 3e 70 4c 69 73 74 2d 3e  0 || pE->pList->
180d0 6e 45 78 70 72 21 3d 31 20 29 7b 0a 20 20 20 20  nExpr!=1 ){.    
180e0 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
180f0 4d 73 67 28 70 50 61 72 73 65 2c 20 22 44 49 53  Msg(pParse, "DIS
18100 54 49 4e 43 54 20 69 6e 20 61 67 67 72 65 67 61  TINCT in aggrega
18110 74 65 20 6d 75 73 74 20 62 65 20 66 6f 6c 6c 6f  te must be follo
18120 77 65 64 20 22 0a 20 20 20 20 20 20 20 20 20 20  wed ".          
18130 20 22 62 79 20 61 6e 20 65 78 70 72 65 73 73 69   "by an expressi
18140 6f 6e 22 29 3b 0a 20 20 20 20 20 20 20 20 70 46  on");.        pF
18150 75 6e 63 2d 3e 69 44 69 73 74 69 6e 63 74 20 3d  unc->iDistinct =
18160 20 2d 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65   -1;.      }else
18170 7b 0a 20 20 20 20 20 20 20 20 4b 65 79 49 6e 66  {.        KeyInf
18180 6f 20 2a 70 4b 65 79 49 6e 66 6f 20 3d 20 6b 65  o *pKeyInfo = ke
18190 79 49 6e 66 6f 46 72 6f 6d 45 78 70 72 4c 69 73  yInfoFromExprLis
181a0 74 28 70 50 61 72 73 65 2c 20 70 45 2d 3e 70 4c  t(pParse, pE->pL
181b0 69 73 74 29 3b 0a 20 20 20 20 20 20 20 20 73 71  ist);.        sq
181c0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28  lite3VdbeAddOp4(
181d0 76 2c 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65  v, OP_OpenEpheme
181e0 72 61 6c 2c 20 70 46 75 6e 63 2d 3e 69 44 69 73  ral, pFunc->iDis
181f0 74 69 6e 63 74 2c 20 30 2c 20 30 2c 0a 20 20 20  tinct, 0, 0,.   
18200 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18210 20 20 20 20 20 20 20 28 63 68 61 72 2a 29 70 4b         (char*)pK
18220 65 79 49 6e 66 6f 2c 20 50 34 5f 4b 45 59 49 4e  eyInfo, P4_KEYIN
18230 46 4f 5f 48 41 4e 44 4f 46 46 29 3b 0a 20 20 20  FO_HANDOFF);.   
18240 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d     }.    }.  }.}
18250 0a 0a 2f 2a 0a 2a 2a 20 49 6e 76 6f 6b 65 20 74  ../*.** Invoke t
18260 68 65 20 4f 50 5f 41 67 67 46 69 6e 61 6c 69 7a  he OP_AggFinaliz
18270 65 20 6f 70 63 6f 64 65 20 66 6f 72 20 65 76 65  e opcode for eve
18280 72 79 20 61 67 67 72 65 67 61 74 65 20 66 75 6e  ry aggregate fun
18290 63 74 69 6f 6e 0a 2a 2a 20 69 6e 20 74 68 65 20  ction.** in the 
182a0 41 67 67 49 6e 66 6f 20 73 74 72 75 63 74 75 72  AggInfo structur
182b0 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  e..*/.static voi
182c0 64 20 66 69 6e 61 6c 69 7a 65 41 67 67 46 75 6e  d finalizeAggFun
182d0 63 74 69 6f 6e 73 28 50 61 72 73 65 20 2a 70 50  ctions(Parse *pP
182e0 61 72 73 65 2c 20 41 67 67 49 6e 66 6f 20 2a 70  arse, AggInfo *p
182f0 41 67 67 49 6e 66 6f 29 7b 0a 20 20 56 64 62 65  AggInfo){.  Vdbe
18300 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56   *v = pParse->pV
18310 64 62 65 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  dbe;.  int i;.  
18320 73 74 72 75 63 74 20 41 67 67 49 6e 66 6f 5f 66  struct AggInfo_f
18330 75 6e 63 20 2a 70 46 3b 0a 20 20 66 6f 72 28 69  unc *pF;.  for(i
18340 3d 30 2c 20 70 46 3d 70 41 67 67 49 6e 66 6f 2d  =0, pF=pAggInfo-
18350 3e 61 46 75 6e 63 3b 20 69 3c 70 41 67 67 49 6e  >aFunc; i<pAggIn
18360 66 6f 2d 3e 6e 46 75 6e 63 3b 20 69 2b 2b 2c 20  fo->nFunc; i++, 
18370 70 46 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72 4c  pF++){.    ExprL
18380 69 73 74 20 2a 70 4c 69 73 74 20 3d 20 70 46 2d  ist *pList = pF-
18390 3e 70 45 78 70 72 2d 3e 70 4c 69 73 74 3b 0a 20  >pExpr->pList;. 
183a0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
183b0 64 4f 70 34 28 76 2c 20 4f 50 5f 41 67 67 46 69  dOp4(v, OP_AggFi
183c0 6e 61 6c 2c 20 70 46 2d 3e 69 4d 65 6d 2c 20 70  nal, pF->iMem, p
183d0 4c 69 73 74 20 3f 20 70 4c 69 73 74 2d 3e 6e 45  List ? pList->nE
183e0 78 70 72 20 3a 20 30 2c 20 30 2c 0a 20 20 20 20  xpr : 0, 0,.    
183f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18400 20 20 28 76 6f 69 64 2a 29 70 46 2d 3e 70 46 75    (void*)pF->pFu
18410 6e 63 2c 20 50 34 5f 46 55 4e 43 44 45 46 29 3b  nc, P4_FUNCDEF);
18420 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 70  .  }.}../*.** Up
18430 64 61 74 65 20 74 68 65 20 61 63 63 75 6d 75 6c  date the accumul
18440 61 74 6f 72 20 6d 65 6d 6f 72 79 20 63 65 6c 6c  ator memory cell
18450 73 20 66 6f 72 20 61 6e 20 61 67 67 72 65 67 61  s for an aggrega
18460 74 65 20 62 61 73 65 64 20 6f 6e 0a 2a 2a 20 74  te based on.** t
18470 68 65 20 63 75 72 72 65 6e 74 20 63 75 72 73 6f  he current curso
18480 72 20 70 6f 73 69 74 69 6f 6e 2e 0a 2a 2f 0a 73  r position..*/.s
18490 74 61 74 69 63 20 76 6f 69 64 20 75 70 64 61 74  tatic void updat
184a0 65 41 63 63 75 6d 75 6c 61 74 6f 72 28 50 61 72  eAccumulator(Par
184b0 73 65 20 2a 70 50 61 72 73 65 2c 20 41 67 67 49  se *pParse, AggI
184c0 6e 66 6f 20 2a 70 41 67 67 49 6e 66 6f 29 7b 0a  nfo *pAggInfo){.
184d0 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72    Vdbe *v = pPar
184e0 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74  se->pVdbe;.  int
184f0 20 69 3b 0a 20 20 73 74 72 75 63 74 20 41 67 67   i;.  struct Agg
18500 49 6e 66 6f 5f 66 75 6e 63 20 2a 70 46 3b 0a 20  Info_func *pF;. 
18510 20 73 74 72 75 63 74 20 41 67 67 49 6e 66 6f 5f   struct AggInfo_
18520 63 6f 6c 20 2a 70 43 3b 0a 0a 20 20 70 41 67 67  col *pC;..  pAgg
18530 49 6e 66 6f 2d 3e 64 69 72 65 63 74 4d 6f 64 65  Info->directMode
18540 20 3d 20 31 3b 0a 20 20 66 6f 72 28 69 3d 30 2c   = 1;.  for(i=0,
18550 20 70 46 3d 70 41 67 67 49 6e 66 6f 2d 3e 61 46   pF=pAggInfo->aF
18560 75 6e 63 3b 20 69 3c 70 41 67 67 49 6e 66 6f 2d  unc; i<pAggInfo-
18570 3e 6e 46 75 6e 63 3b 20 69 2b 2b 2c 20 70 46 2b  >nFunc; i++, pF+
18580 2b 29 7b 0a 20 20 20 20 69 6e 74 20 6e 41 72 67  +){.    int nArg
18590 3b 0a 20 20 20 20 69 6e 74 20 61 64 64 72 4e 65  ;.    int addrNe
185a0 78 74 20 3d 20 30 3b 0a 20 20 20 20 45 78 70 72  xt = 0;.    Expr
185b0 4c 69 73 74 20 2a 70 4c 69 73 74 20 3d 20 70 46  List *pList = pF
185c0 2d 3e 70 45 78 70 72 2d 3e 70 4c 69 73 74 3b 0a  ->pExpr->pList;.
185d0 20 20 20 20 69 66 28 20 70 4c 69 73 74 20 29 7b      if( pList ){
185e0 0a 20 20 20 20 20 20 6e 41 72 67 20 3d 20 70 4c  .      nArg = pL
185f0 69 73 74 2d 3e 6e 45 78 70 72 3b 0a 20 20 20 20  ist->nExpr;.    
18600 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64    sqlite3ExprCod
18610 65 45 78 70 72 4c 69 73 74 28 70 50 61 72 73 65  eExprList(pParse
18620 2c 20 70 4c 69 73 74 2c 20 30 29 3b 0a 20 20 20  , pList, 0);.   
18630 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 6e 41   }else{.      nA
18640 72 67 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20  rg = 0;.    }.  
18650 20 20 69 66 28 20 70 46 2d 3e 69 44 69 73 74 69    if( pF->iDisti
18660 6e 63 74 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20  nct>=0 ){.      
18670 61 64 64 72 4e 65 78 74 20 3d 20 73 71 6c 69 74  addrNext = sqlit
18680 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28  e3VdbeMakeLabel(
18690 76 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  v);.      assert
186a0 28 20 6e 41 72 67 3d 3d 31 20 29 3b 0a 20 20 20  ( nArg==1 );.   
186b0 20 20 20 63 6f 64 65 44 69 73 74 69 6e 63 74 5f     codeDistinct_
186c0 4f 4c 44 28 76 2c 20 70 46 2d 3e 69 44 69 73 74  OLD(v, pF->iDist
186d0 69 6e 63 74 2c 20 61 64 64 72 4e 65 78 74 2c 20  inct, addrNext, 
186e0 31 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  1);.    }.    if
186f0 28 20 70 46 2d 3e 70 46 75 6e 63 2d 3e 6e 65 65  ( pF->pFunc->nee
18700 64 43 6f 6c 6c 53 65 71 20 29 7b 0a 20 20 20 20  dCollSeq ){.    
18710 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c    CollSeq *pColl
18720 20 3d 20 30 3b 0a 20 20 20 20 20 20 73 74 72 75   = 0;.      stru
18730 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d  ct ExprList_item
18740 20 2a 70 49 74 65 6d 3b 0a 20 20 20 20 20 20 69   *pItem;.      i
18750 6e 74 20 6a 3b 0a 20 20 20 20 20 20 61 73 73 65  nt j;.      asse
18760 72 74 28 20 70 4c 69 73 74 21 3d 30 20 29 3b 20  rt( pList!=0 ); 
18770 20 2f 2a 20 70 4c 69 73 74 21 3d 30 20 69 66 20   /* pList!=0 if 
18780 70 46 2d 3e 70 46 75 6e 63 2d 3e 6e 65 65 64 43  pF->pFunc->needC
18790 6f 6c 6c 53 65 71 20 69 73 20 74 72 75 65 20 2a  ollSeq is true *
187a0 2f 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 2c  /.      for(j=0,
187b0 20 70 49 74 65 6d 3d 70 4c 69 73 74 2d 3e 61 3b   pItem=pList->a;
187c0 20 21 70 43 6f 6c 6c 20 26 26 20 6a 3c 6e 41 72   !pColl && j<nAr
187d0 67 3b 20 6a 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29  g; j++, pItem++)
187e0 7b 0a 20 20 20 20 20 20 20 20 70 43 6f 6c 6c 20  {.        pColl 
187f0 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6c  = sqlite3ExprCol
18800 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70 49 74  lSeq(pParse, pIt
18810 65 6d 2d 3e 70 45 78 70 72 29 3b 0a 20 20 20 20  em->pExpr);.    
18820 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 21 70    }.      if( !p
18830 43 6f 6c 6c 20 29 7b 0a 20 20 20 20 20 20 20 20  Coll ){.        
18840 70 43 6f 6c 6c 20 3d 20 70 50 61 72 73 65 2d 3e  pColl = pParse->
18850 64 62 2d 3e 70 44 66 6c 74 43 6f 6c 6c 3b 0a 20  db->pDfltColl;. 
18860 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c       }.      sql
18870 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76  ite3VdbeAddOp4(v
18880 2c 20 4f 50 5f 43 6f 6c 6c 53 65 71 2c 20 30 2c  , OP_CollSeq, 0,
18890 20 30 2c 20 30 2c 20 28 63 68 61 72 20 2a 29 70   0, 0, (char *)p
188a0 43 6f 6c 6c 2c 20 50 34 5f 43 4f 4c 4c 53 45 51  Coll, P4_COLLSEQ
188b0 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c  );.    }.    sql
188c0 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76  ite3VdbeAddOp4(v
188d0 2c 20 4f 50 5f 41 67 67 53 74 65 70 2c 20 70 46  , OP_AggStep, pF
188e0 2d 3e 69 4d 65 6d 2c 20 6e 41 72 67 2c 20 30 2c  ->iMem, nArg, 0,
188f0 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20   .              
18900 20 20 20 20 20 20 20 20 28 76 6f 69 64 2a 29 70          (void*)p
18910 46 2d 3e 70 46 75 6e 63 2c 20 50 34 5f 46 55 4e  F->pFunc, P4_FUN
18920 43 44 45 46 29 3b 0a 20 20 20 20 69 66 28 20 61  CDEF);.    if( a
18930 64 64 72 4e 65 78 74 20 29 7b 0a 20 20 20 20 20  ddrNext ){.     
18940 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f   sqlite3VdbeReso
18950 6c 76 65 4c 61 62 65 6c 28 76 2c 20 61 64 64 72  lveLabel(v, addr
18960 4e 65 78 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  Next);.    }.  }
18970 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70 43 3d 70  .  for(i=0, pC=p
18980 41 67 67 49 6e 66 6f 2d 3e 61 43 6f 6c 3b 20 69  AggInfo->aCol; i
18990 3c 70 41 67 67 49 6e 66 6f 2d 3e 6e 41 63 63 75  <pAggInfo->nAccu
189a0 6d 75 6c 61 74 6f 72 3b 20 69 2b 2b 2c 20 70 43  mulator; i++, pC
189b0 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  ++){.    sqlite3
189c0 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c  ExprCode(pParse,
189d0 20 70 43 2d 3e 70 45 78 70 72 2c 20 70 43 2d 3e   pC->pExpr, pC->
189e0 69 4d 65 6d 29 3b 0a 20 20 7d 0a 20 20 70 41 67  iMem);.  }.  pAg
189f0 67 49 6e 66 6f 2d 3e 64 69 72 65 63 74 4d 6f 64  gInfo->directMod
18a00 65 20 3d 20 30 3b 0a 7d 0a 0a 23 69 66 6e 64 65  e = 0;.}..#ifnde
18a10 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52  f SQLITE_OMIT_TR
18a20 49 47 47 45 52 0a 2f 2a 0a 2a 2a 20 54 68 69 73  IGGER./*.** This
18a30 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 75 73 65   function is use
18a40 64 20 77 68 65 6e 20 61 20 53 45 4c 45 43 54 20  d when a SELECT 
18a50 73 74 61 74 65 6d 65 6e 74 20 69 73 20 75 73 65  statement is use
18a60 64 20 74 6f 20 63 72 65 61 74 65 20 61 0a 2a 2a  d to create a.**
18a70 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65   temporary table
18a80 20 66 6f 72 20 69 74 65 72 61 74 69 6e 67 20 74   for iterating t
18a90 68 72 6f 75 67 68 20 77 68 65 6e 20 72 75 6e 6e  hrough when runn
18aa0 69 6e 67 20 61 6e 20 49 4e 53 54 45 41 44 20 4f  ing an INSTEAD O
18ab0 46 0a 2a 2a 20 55 50 44 41 54 45 20 6f 72 20 49  F.** UPDATE or I
18ac0 4e 53 54 45 41 44 20 4f 46 20 44 45 4c 45 54 45  NSTEAD OF DELETE
18ad0 20 74 72 69 67 67 65 72 2e 20 0a 2a 2a 0a 2a 2a   trigger. .**.**
18ae0 20 49 66 20 70 6f 73 73 69 62 6c 65 2c 20 74 68   If possible, th
18af0 65 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  e SELECT stateme
18b00 6e 74 20 69 73 20 6d 6f 64 69 66 69 65 64 20 73  nt is modified s
18b10 6f 20 74 68 61 74 20 4e 55 4c 4c 20 76 61 6c 75  o that NULL valu
18b20 65 73 0a 2a 2a 20 61 72 65 20 73 74 6f 72 65 64  es.** are stored
18b30 20 69 6e 20 74 68 65 20 74 65 6d 70 6f 72 61 72   in the temporar
18b40 79 20 74 61 62 6c 65 20 66 6f 72 20 61 6c 6c 20  y table for all 
18b50 63 6f 6c 75 6d 6e 73 20 66 6f 72 20 77 68 69 63  columns for whic
18b60 68 20 74 68 65 20 0a 2a 2a 20 63 6f 72 72 65 73  h the .** corres
18b70 70 6f 6e 64 69 6e 67 20 62 69 74 20 69 6e 20 61  ponding bit in a
18b80 72 67 75 6d 65 6e 74 20 6d 61 73 6b 20 69 73 20  rgument mask is 
18b90 6e 6f 74 20 73 65 74 2e 20 49 66 20 6d 61 73 6b  not set. If mask
18ba0 20 74 61 6b 65 73 20 74 68 65 0a 2a 2a 20 73 70   takes the.** sp
18bb0 65 63 69 61 6c 20 76 61 6c 75 65 20 30 78 66 66  ecial value 0xff
18bc0 66 66 66 66 66 66 2c 20 74 68 65 6e 20 61 6c 6c  ffffff, then all
18bd0 20 63 6f 6c 75 6d 6e 73 20 61 72 65 20 70 6f 70   columns are pop
18be0 75 6c 61 74 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73  ulated..*/.int s
18bf0 71 6c 69 74 65 33 53 65 6c 65 63 74 4d 61 73 6b  qlite3SelectMask
18c00 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
18c10 53 65 6c 65 63 74 20 2a 70 2c 20 75 33 32 20 6d  Select *p, u32 m
18c20 61 73 6b 29 7b 0a 20 20 69 66 28 20 21 70 2d 3e  ask){.  if( !p->
18c30 70 50 72 69 6f 72 20 26 26 20 21 70 2d 3e 69 73  pPrior && !p->is
18c40 44 69 73 74 69 6e 63 74 20 26 26 20 6d 61 73 6b  Distinct && mask
18c50 21 3d 30 78 66 66 66 66 66 66 66 66 20 29 7b 0a  !=0xffffffff ){.
18c60 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45      ExprList *pE
18c70 4c 69 73 74 3b 0a 20 20 20 20 69 6e 74 20 69 3b  List;.    int i;
18c80 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33  .    if( sqlite3
18c90 53 65 6c 65 63 74 52 65 73 6f 6c 76 65 28 70 50  SelectResolve(pP
18ca0 61 72 73 65 2c 20 70 2c 20 30 29 20 29 7b 0a 20  arse, p, 0) ){. 
18cb0 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
18cc0 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a  TE_ERROR;.    }.
18cd0 20 20 20 20 70 45 4c 69 73 74 20 3d 20 70 2d 3e      pEList = p->
18ce0 70 45 4c 69 73 74 3b 0a 20 20 20 20 66 6f 72 28  pEList;.    for(
18cf0 69 3d 30 3b 20 69 3c 70 45 4c 69 73 74 2d 3e 6e  i=0; i<pEList->n
18d00 45 78 70 72 20 26 26 20 69 3c 33 32 3b 20 69 2b  Expr && i<32; i+
18d10 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 21 28  +){.      if( !(
18d20 6d 61 73 6b 26 28 28 75 33 32 29 31 3c 3c 69 29  mask&((u32)1<<i)
18d30 29 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  ) ){.        sql
18d40 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 70  ite3ExprDelete(p
18d50 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70  EList->a[i].pExp
18d60 72 29 3b 0a 20 20 20 20 20 20 20 20 70 45 4c 69  r);.        pELi
18d70 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 20 3d  st->a[i].pExpr =
18d80 20 73 71 6c 69 74 65 33 45 78 70 72 28 70 50 61   sqlite3Expr(pPa
18d90 72 73 65 2d 3e 64 62 2c 20 54 4b 5f 4e 55 4c 4c  rse->db, TK_NULL
18da0 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  , 0, 0, 0);.    
18db0 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20    }.    }.  }.  
18dc0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
18dd0 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  ;.}.#endif../*.*
18de0 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20  * Generate code 
18df0 66 6f 72 20 74 68 65 20 67 69 76 65 6e 20 53 45  for the given SE
18e00 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 2e 0a  LECT statement..
18e10 2a 2a 0a 2a 2a 20 54 68 65 20 72 65 73 75 6c 74  **.** The result
18e20 73 20 61 72 65 20 64 69 73 74 72 69 62 75 74 65  s are distribute
18e30 64 20 69 6e 20 76 61 72 69 6f 75 73 20 77 61 79  d in various way
18e40 73 20 64 65 70 65 6e 64 69 6e 67 20 6f 6e 20 74  s depending on t
18e50 68 65 0a 2a 2a 20 63 6f 6e 74 65 6e 74 73 20 6f  he.** contents o
18e60 66 20 74 68 65 20 53 65 6c 65 63 74 44 65 73 74  f the SelectDest
18e70 20 73 74 72 75 63 74 75 72 65 20 70 6f 69 6e 74   structure point
18e80 65 64 20 74 6f 20 62 79 20 61 72 67 75 6d 65 6e  ed to by argumen
18e90 74 20 70 44 65 73 74 0a 2a 2a 20 61 73 20 66 6f  t pDest.** as fo
18ea0 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  llows:.**.**    
18eb0 20 70 44 65 73 74 2d 3e 65 44 65 73 74 20 20 20   pDest->eDest   
18ec0 20 52 65 73 75 6c 74 0a 2a 2a 20 20 20 20 20 2d   Result.**     -
18ed0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 20 20 20 20 2d  -----------    -
18ee0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
18ef0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
18f00 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a 20 20 20  ----------.**   
18f10 20 20 53 52 54 5f 43 61 6c 6c 62 61 63 6b 20 20    SRT_Callback  
18f20 20 20 49 6e 76 6f 6b 65 20 74 68 65 20 63 61 6c    Invoke the cal
18f30 6c 62 61 63 6b 20 66 6f 72 20 65 61 63 68 20 72  lback for each r
18f40 6f 77 20 6f 66 20 74 68 65 20 72 65 73 75 6c 74  ow of the result
18f50 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 52 54 5f  ..**.**     SRT_
18f60 4d 65 6d 20 20 20 20 20 20 20 20 20 53 74 6f 72  Mem         Stor
18f70 65 20 66 69 72 73 74 20 72 65 73 75 6c 74 20 69  e first result i
18f80 6e 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 20 70 44  n memory cell pD
18f90 65 73 74 2d 3e 69 50 61 72 6d 0a 2a 2a 0a 2a 2a  est->iParm.**.**
18fa0 20 20 20 20 20 53 52 54 5f 53 65 74 20 20 20 20       SRT_Set    
18fb0 20 20 20 20 20 53 74 6f 72 65 20 6e 6f 6e 2d 6e       Store non-n
18fc0 75 6c 6c 20 72 65 73 75 6c 74 73 20 61 73 20 6b  ull results as k
18fd0 65 79 73 20 6f 66 20 74 61 62 6c 65 20 70 44 65  eys of table pDe
18fe0 73 74 2d 3e 69 50 61 72 6d 2e 20 0a 2a 2a 20 20  st->iParm. .**  
18ff0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19000 20 20 20 41 70 70 6c 79 20 74 68 65 20 61 66 66     Apply the aff
19010 69 6e 69 74 79 20 70 44 65 73 74 2d 3e 61 66 66  inity pDest->aff
19020 69 6e 69 74 79 20 62 65 66 6f 72 65 20 73 74 6f  inity before sto
19030 72 69 6e 67 20 74 68 65 6d 2e 0a 2a 2a 0a 2a 2a  ring them..**.**
19040 20 20 20 20 20 53 52 54 5f 55 6e 69 6f 6e 20 20       SRT_Union  
19050 20 20 20 20 20 53 74 6f 72 65 20 72 65 73 75 6c       Store resul
19060 74 73 20 61 73 20 61 20 6b 65 79 20 69 6e 20 61  ts as a key in a
19070 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65   temporary table
19080 20 70 44 65 73 74 2d 3e 69 50 61 72 6d 2e 0a 2a   pDest->iParm..*
19090 2a 0a 2a 2a 20 20 20 20 20 53 52 54 5f 45 78 63  *.**     SRT_Exc
190a0 65 70 74 20 20 20 20 20 20 52 65 6d 6f 76 65 20  ept      Remove 
190b0 72 65 73 75 6c 74 73 20 66 72 6f 6d 20 74 68 65  results from the
190c0 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65   temporary table
190d0 20 70 44 65 73 74 2d 3e 69 50 61 72 6d 2e 0a 2a   pDest->iParm..*
190e0 2a 0a 2a 2a 20 20 20 20 20 53 52 54 5f 54 61 62  *.**     SRT_Tab
190f0 6c 65 20 20 20 20 20 20 20 53 74 6f 72 65 20 72  le       Store r
19100 65 73 75 6c 74 73 20 69 6e 20 74 65 6d 70 6f 72  esults in tempor
19110 61 72 79 20 74 61 62 6c 65 20 70 44 65 73 74 2d  ary table pDest-
19120 3e 69 50 61 72 6d 0a 2a 2a 0a 2a 2a 20 20 20 20  >iParm.**.**    
19130 20 53 52 54 5f 45 70 68 65 6d 54 61 62 20 20 20   SRT_EphemTab   
19140 20 43 72 65 61 74 65 20 61 6e 20 74 65 6d 70 6f   Create an tempo
19150 72 61 72 79 20 74 61 62 6c 65 20 70 44 65 73 74  rary table pDest
19160 2d 3e 69 50 61 72 6d 20 61 6e 64 20 73 74 6f 72  ->iParm and stor
19170 65 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  e.**            
19180 20 20 20 20 20 20 20 20 20 74 68 65 20 72 65 73           the res
19190 75 6c 74 20 74 68 65 72 65 2e 20 54 68 65 20 63  ult there. The c
191a0 75 72 73 6f 72 20 69 73 20 6c 65 66 74 20 6f 70  ursor is left op
191b0 65 6e 20 61 66 74 65 72 0a 2a 2a 20 20 20 20 20  en after.**     
191c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
191d0 72 65 74 75 72 6e 69 6e 67 2e 0a 2a 2a 0a 2a 2a  returning..**.**
191e0 20 20 20 20 20 53 52 54 5f 53 75 62 72 6f 75 74       SRT_Subrout
191f0 69 6e 65 20 20 46 6f 72 20 65 61 63 68 20 72 6f  ine  For each ro
19200 77 20 72 65 74 75 72 6e 65 64 2c 20 70 75 73 68  w returned, push
19210 20 74 68 65 20 72 65 73 75 6c 74 73 20 6f 6e 74   the results ont
19220 6f 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 20 20  o the.**        
19230 20 20 20 20 20 20 20 20 20 20 20 20 20 76 64 62               vdb
19240 65 20 73 74 61 63 6b 20 61 6e 64 20 63 61 6c 6c  e stack and call
19250 20 74 68 65 20 73 75 62 72 6f 75 74 69 6e 65 20   the subroutine 
19260 28 76 69 61 20 4f 50 5f 47 6f 73 75 62 29 0a 2a  (via OP_Gosub).*
19270 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *               
19280 20 20 20 20 20 20 61 74 20 61 64 64 72 65 73 73        at address
19290 20 70 44 65 73 74 2d 3e 69 50 61 72 6d 2e 0a 2a   pDest->iParm..*
192a0 2a 0a 2a 2a 20 20 20 20 20 53 52 54 5f 45 78 69  *.**     SRT_Exi
192b0 73 74 73 20 20 20 20 20 20 53 74 6f 72 65 20 61  sts      Store a
192c0 20 31 20 69 6e 20 6d 65 6d 6f 72 79 20 63 65 6c   1 in memory cel
192d0 6c 20 70 44 65 73 74 2d 3e 69 50 61 72 6d 20 69  l pDest->iParm i
192e0 66 20 74 68 65 20 72 65 73 75 6c 74 0a 2a 2a 20  f the result.** 
192f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19300 20 20 20 20 73 65 74 20 69 73 20 6e 6f 74 20 65      set is not e
19310 6d 70 74 79 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20  mpty..**.**     
19320 53 52 54 5f 44 69 73 63 61 72 64 20 20 20 20 20  SRT_Discard     
19330 54 68 72 6f 77 20 74 68 65 20 72 65 73 75 6c 74  Throw the result
19340 73 20 61 77 61 79 2e 0a 2a 2a 0a 2a 2a 20 53 65  s away..**.** Se
19350 65 20 74 68 65 20 73 65 6c 65 63 74 49 6e 6e 65  e the selectInne
19360 72 4c 6f 6f 70 28 29 20 66 75 6e 63 74 69 6f 6e  rLoop() function
19370 20 66 6f 72 20 61 20 63 61 6e 6f 6e 69 63 61 6c   for a canonical
19380 20 6c 69 73 74 69 6e 67 20 6f 66 20 74 68 65 20   listing of the 
19390 0a 2a 2a 20 61 6c 6c 6f 77 65 64 20 76 61 6c 75  .** allowed valu
193a0 65 73 20 6f 66 20 65 44 65 73 74 20 61 6e 64 20  es of eDest and 
193b0 74 68 65 69 72 20 6d 65 61 6e 69 6e 67 73 2e 0a  their meanings..
193c0 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
193d0 6e 65 20 72 65 74 75 72 6e 73 20 74 68 65 20 6e  ne returns the n
193e0 75 6d 62 65 72 20 6f 66 20 65 72 72 6f 72 73 2e  umber of errors.
193f0 20 20 49 66 20 61 6e 79 20 65 72 72 6f 72 73 20    If any errors 
19400 61 72 65 0a 2a 2a 20 65 6e 63 6f 75 6e 74 65 72  are.** encounter
19410 65 64 2c 20 74 68 65 6e 20 61 6e 20 61 70 70 72  ed, then an appr
19420 6f 70 72 69 61 74 65 20 65 72 72 6f 72 20 6d 65  opriate error me
19430 73 73 61 67 65 20 69 73 20 6c 65 66 74 20 69 6e  ssage is left in
19440 0a 2a 2a 20 70 50 61 72 73 65 2d 3e 7a 45 72 72  .** pParse->zErr
19450 4d 73 67 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  Msg..**.** This 
19460 72 6f 75 74 69 6e 65 20 64 6f 65 73 20 4e 4f 54  routine does NOT
19470 20 66 72 65 65 20 74 68 65 20 53 65 6c 65 63 74   free the Select
19480 20 73 74 72 75 63 74 75 72 65 20 70 61 73 73 65   structure passe
19490 64 20 69 6e 2e 20 20 54 68 65 0a 2a 2a 20 63 61  d in.  The.** ca
194a0 6c 6c 69 6e 67 20 66 75 6e 63 74 69 6f 6e 20 6e  lling function n
194b0 65 65 64 73 20 74 6f 20 64 6f 20 74 68 61 74 2e  eeds to do that.
194c0 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 50 61 72 65  .**.** The pPare
194d0 6e 74 2c 20 70 61 72 65 6e 74 54 61 62 2c 20 61  nt, parentTab, a
194e0 6e 64 20 2a 70 50 61 72 65 6e 74 41 67 67 20 66  nd *pParentAgg f
194f0 69 65 6c 64 73 20 61 72 65 20 66 69 6c 6c 65 64  ields are filled
19500 20 69 6e 20 69 66 20 74 68 69 73 0a 2a 2a 20 53   in if this.** S
19510 45 4c 45 43 54 20 69 73 20 61 20 73 75 62 71 75  ELECT is a subqu
19520 65 72 79 2e 20 20 54 68 69 73 20 72 6f 75 74 69  ery.  This routi
19530 6e 65 20 6d 61 79 20 74 72 79 20 74 6f 20 63 6f  ne may try to co
19540 6d 62 69 6e 65 20 74 68 69 73 20 53 45 4c 45 43  mbine this SELEC
19550 54 0a 2a 2a 20 77 69 74 68 20 69 74 73 20 70 61  T.** with its pa
19560 72 65 6e 74 20 74 6f 20 66 6f 72 6d 20 61 20 73  rent to form a s
19570 69 6e 67 6c 65 20 66 6c 61 74 20 71 75 65 72 79  ingle flat query
19580 2e 20 20 49 6e 20 73 6f 20 64 6f 69 6e 67 2c 20  .  In so doing, 
19590 69 74 20 6d 69 67 68 74 0a 2a 2a 20 63 68 61 6e  it might.** chan
195a0 67 65 20 74 68 65 20 70 61 72 65 6e 74 20 71 75  ge the parent qu
195b0 65 72 79 20 66 72 6f 6d 20 61 20 6e 6f 6e 2d 61  ery from a non-a
195c0 67 67 72 65 67 61 74 65 20 74 6f 20 61 6e 20 61  ggregate to an a
195d0 67 67 72 65 67 61 74 65 20 71 75 65 72 79 2e 0a  ggregate query..
195e0 2a 2a 20 46 6f 72 20 74 68 61 74 20 72 65 61 73  ** For that reas
195f0 6f 6e 2c 20 74 68 65 20 70 50 61 72 65 6e 74 41  on, the pParentA
19600 67 67 20 66 6c 61 67 20 69 73 20 70 61 73 73 65  gg flag is passe
19610 64 20 61 73 20 61 20 70 6f 69 6e 74 65 72 2c 20  d as a pointer, 
19620 73 6f 20 69 74 0a 2a 2a 20 63 61 6e 20 62 65 20  so it.** can be 
19630 63 68 61 6e 67 65 64 2e 0a 2a 2a 0a 2a 2a 20 45  changed..**.** E
19640 78 61 6d 70 6c 65 20 31 3a 20 20 20 54 68 65 20  xample 1:   The 
19650 6d 65 61 6e 69 6e 67 20 6f 66 20 74 68 65 20 70  meaning of the p
19660 50 61 72 65 6e 74 20 70 61 72 61 6d 65 74 65 72  Parent parameter
19670 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 53 45 4c 45 43  ..**.**    SELEC
19680 54 20 2a 20 46 52 4f 4d 20 74 31 20 4a 4f 49 4e  T * FROM t1 JOIN
19690 20 28 53 45 4c 45 43 54 20 78 2c 20 63 6f 75 6e   (SELECT x, coun
196a0 74 28 2a 29 20 46 52 4f 4d 20 74 32 29 20 4a 4f  t(*) FROM t2) JO
196b0 49 4e 20 74 33 3b 0a 2a 2a 20 20 20 20 5c 20 20  IN t3;.**    \  
196c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
196d0 20 20 20 20 5c 5f 5f 5f 5f 5f 5f 5f 20 73 75 62      \_______ sub
196e0 71 75 65 72 79 20 5f 5f 5f 5f 5f 5f 5f 2f 20 20  query _______/  
196f0 20 20 20 20 20 20 2f 0a 2a 2a 20 20 20 20 20 5c        /.**     \
19700 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19710 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19720 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19730 20 20 20 20 20 20 2f 0a 2a 2a 20 20 20 20 20 20        /.**      
19740 5c 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f  \_______________
19750 5f 5f 5f 5f 5f 20 6f 75 74 65 72 20 71 75 65 72  _____ outer quer
19760 79 20 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f  y ______________
19770 5f 5f 5f 5f 5f 2f 0a 2a 2a 0a 2a 2a 20 54 68 69  _____/.**.** Thi
19780 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c  s routine is cal
19790 6c 65 64 20 66 6f 72 20 74 68 65 20 6f 75 74 65  led for the oute
197a0 72 20 71 75 65 72 79 20 66 69 72 73 74 2e 20 20  r query first.  
197b0 20 46 6f 72 20 74 68 61 74 20 63 61 6c 6c 2c 0a   For that call,.
197c0 2a 2a 20 70 50 61 72 65 6e 74 20 77 69 6c 6c 20  ** pParent will 
197d0 62 65 20 4e 55 4c 4c 2e 20 20 44 75 72 69 6e 67  be NULL.  During
197e0 20 74 68 65 20 70 72 6f 63 65 73 73 69 6e 67 20   the processing 
197f0 6f 66 20 74 68 65 20 6f 75 74 65 72 20 71 75 65  of the outer que
19800 72 79 2c 20 74 68 69 73 20 0a 2a 2a 20 72 6f 75  ry, this .** rou
19810 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 72  tine is called r
19820 65 63 75 72 73 69 76 65 6c 79 20 74 6f 20 68 61  ecursively to ha
19830 6e 64 6c 65 20 74 68 65 20 73 75 62 71 75 65 72  ndle the subquer
19840 79 2e 20 20 46 6f 72 20 74 68 65 20 72 65 63 75  y.  For the recu
19850 72 73 69 76 65 0a 2a 2a 20 63 61 6c 6c 2c 20 70  rsive.** call, p
19860 50 61 72 65 6e 74 20 77 69 6c 6c 20 70 6f 69 6e  Parent will poin
19870 74 20 74 6f 20 74 68 65 20 6f 75 74 65 72 20 71  t to the outer q
19880 75 65 72 79 2e 20 20 42 65 63 61 75 73 65 20 74  uery.  Because t
19890 68 65 20 73 75 62 71 75 65 72 79 20 69 73 0a 2a  he subquery is.*
198a0 2a 20 74 68 65 20 73 65 63 6f 6e 64 20 65 6c 65  * the second ele
198b0 6d 65 6e 74 20 69 6e 20 61 20 74 68 72 65 65 2d  ment in a three-
198c0 77 61 79 20 6a 6f 69 6e 2c 20 74 68 65 20 70 61  way join, the pa
198d0 72 65 6e 74 54 61 62 20 70 61 72 61 6d 65 74 65  rentTab paramete
198e0 72 20 77 69 6c 6c 0a 2a 2a 20 62 65 20 31 20 28  r will.** be 1 (
198f0 74 68 65 20 32 6e 64 20 76 61 6c 75 65 20 6f 66  the 2nd value of
19900 20 61 20 30 2d 69 6e 64 65 78 65 64 20 61 72 72   a 0-indexed arr
19910 61 79 2e 29 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ay.).*/.int sqli
19920 74 65 33 53 65 6c 65 63 74 28 0a 20 20 50 61 72  te3Select(.  Par
19930 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20  se *pParse,     
19940 20 20 20 20 2f 2a 20 54 68 65 20 70 61 72 73 65      /* The parse
19950 72 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53  r context */.  S
19960 65 6c 65 63 74 20 2a 70 2c 20 20 20 20 20 20 20  elect *p,       
19970 20 20 20 20 20 20 2f 2a 20 54 68 65 20 53 45 4c        /* The SEL
19980 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 62 65  ECT statement be
19990 69 6e 67 20 63 6f 64 65 64 2e 20 2a 2f 0a 20 20  ing coded. */.  
199a0 53 65 6c 65 63 74 44 65 73 74 20 2a 70 44 65 73  SelectDest *pDes
199b0 74 2c 20 20 20 20 20 2f 2a 20 57 68 61 74 20 74  t,     /* What t
199c0 6f 20 64 6f 20 77 69 74 68 20 74 68 65 20 71 75  o do with the qu
199d0 65 72 79 20 72 65 73 75 6c 74 73 20 2a 2f 0a 20  ery results */. 
199e0 20 53 65 6c 65 63 74 20 2a 70 50 61 72 65 6e 74   Select *pParent
199f0 2c 20 20 20 20 20 20 20 2f 2a 20 41 6e 6f 74 68  ,       /* Anoth
19a00 65 72 20 53 45 4c 45 43 54 20 66 6f 72 20 77 68  er SELECT for wh
19a10 69 63 68 20 74 68 69 73 20 69 73 20 61 20 73 75  ich this is a su
19a20 62 2d 71 75 65 72 79 20 2a 2f 0a 20 20 69 6e 74  b-query */.  int
19a30 20 70 61 72 65 6e 74 54 61 62 2c 20 20 20 20 20   parentTab,     
19a40 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 69 6e 20      /* Index in 
19a50 70 50 61 72 65 6e 74 2d 3e 70 53 72 63 20 6f 66  pParent->pSrc of
19a60 20 74 68 69 73 20 71 75 65 72 79 20 2a 2f 0a 20   this query */. 
19a70 20 69 6e 74 20 2a 70 50 61 72 65 6e 74 41 67 67   int *pParentAgg
19a80 2c 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20  ,       /* True 
19a90 69 66 20 70 50 61 72 65 6e 74 20 75 73 65 73 20  if pParent uses 
19aa0 61 67 67 72 65 67 61 74 65 20 66 75 6e 63 74 69  aggregate functi
19ab0 6f 6e 73 20 2a 2f 0a 20 20 63 68 61 72 20 2a 61  ons */.  char *a
19ac0 66 66 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ff              
19ad0 2f 2a 20 49 66 20 65 44 65 73 74 20 69 73 20 53  /* If eDest is S
19ae0 52 54 5f 55 6e 69 6f 6e 2c 20 74 68 65 20 61 66  RT_Union, the af
19af0 66 69 6e 69 74 79 20 73 74 72 69 6e 67 20 2a 2f  finity string */
19b00 0a 29 7b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 20  .){.  int i, j; 
19b10 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
19b20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 73 20 2a 2f  Loop counters */
19b30 0a 20 20 57 68 65 72 65 49 6e 66 6f 20 2a 70 57  .  WhereInfo *pW
19b40 49 6e 66 6f 3b 20 20 20 20 20 2f 2a 20 52 65 74  Info;     /* Ret
19b50 75 72 6e 20 66 72 6f 6d 20 73 71 6c 69 74 65 33  urn from sqlite3
19b60 57 68 65 72 65 42 65 67 69 6e 28 29 20 2a 2f 0a  WhereBegin() */.
19b70 20 20 56 64 62 65 20 2a 76 3b 20 20 20 20 20 20    Vdbe *v;      
19b80 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
19b90 76 69 72 74 75 61 6c 20 6d 61 63 68 69 6e 65 20  virtual machine 
19ba0 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69  under constructi
19bb0 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 69 73 41 67  on */.  int isAg
19bc0 67 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  g;             /
19bd0 2a 20 54 72 75 65 20 66 6f 72 20 73 65 6c 65 63  * True for selec
19be0 74 20 6c 69 73 74 73 20 6c 69 6b 65 20 22 63 6f  t lists like "co
19bf0 75 6e 74 28 2a 29 22 20 2a 2f 0a 20 20 45 78 70  unt(*)" */.  Exp
19c00 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 3b 20 20  rList *pEList;  
19c10 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 63      /* List of c
19c20 6f 6c 75 6d 6e 73 20 74 6f 20 65 78 74 72 61 63  olumns to extrac
19c30 74 2e 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20  t. */.  SrcList 
19c40 2a 70 54 61 62 4c 69 73 74 3b 20 20 20 20 20 2f  *pTabList;     /
19c50 2a 20 4c 69 73 74 20 6f 66 20 74 61 62 6c 65 73  * List of tables
19c60 20 74 6f 20 73 65 6c 65 63 74 20 66 72 6f 6d 20   to select from 
19c70 2a 2f 0a 20 20 45 78 70 72 20 2a 70 57 68 65 72  */.  Expr *pWher
19c80 65 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54  e;          /* T
19c90 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 2e  he WHERE clause.
19ca0 20 20 4d 61 79 20 62 65 20 4e 55 4c 4c 20 2a 2f    May be NULL */
19cb0 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4f 72  .  ExprList *pOr
19cc0 64 65 72 42 79 3b 20 20 20 20 2f 2a 20 54 68 65  derBy;    /* The
19cd0 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65   ORDER BY clause
19ce0 2e 20 20 4d 61 79 20 62 65 20 4e 55 4c 4c 20 2a  .  May be NULL *
19cf0 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 47  /.  ExprList *pG
19d00 72 6f 75 70 42 79 3b 20 20 20 20 2f 2a 20 54 68  roupBy;    /* Th
19d10 65 20 47 52 4f 55 50 20 42 59 20 63 6c 61 75 73  e GROUP BY claus
19d20 65 2e 20 20 4d 61 79 20 62 65 20 4e 55 4c 4c 20  e.  May be NULL 
19d30 2a 2f 0a 20 20 45 78 70 72 20 2a 70 48 61 76 69  */.  Expr *pHavi
19d40 6e 67 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 54  ng;         /* T
19d50 68 65 20 48 41 56 49 4e 47 20 63 6c 61 75 73 65  he HAVING clause
19d60 2e 20 20 4d 61 79 20 62 65 20 4e 55 4c 4c 20 2a  .  May be NULL *
19d70 2f 0a 20 20 69 6e 74 20 69 73 44 69 73 74 69 6e  /.  int isDistin
19d80 63 74 3b 20 20 20 20 20 20 20 20 2f 2a 20 54 72  ct;        /* Tr
19d90 75 65 20 69 66 20 74 68 65 20 44 49 53 54 49 4e  ue if the DISTIN
19da0 43 54 20 6b 65 79 77 6f 72 64 20 69 73 20 70 72  CT keyword is pr
19db0 65 73 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 64  esent */.  int d
19dc0 69 73 74 69 6e 63 74 3b 20 20 20 20 20 20 20 20  istinct;        
19dd0 20 20 2f 2a 20 54 61 62 6c 65 20 74 6f 20 75 73    /* Table to us
19de0 65 20 66 6f 72 20 74 68 65 20 64 69 73 74 69 6e  e for the distin
19df0 63 74 20 73 65 74 20 2a 2f 0a 20 20 69 6e 74 20  ct set */.  int 
19e00 72 63 20 3d 20 31 3b 20 20 20 20 20 20 20 20 20  rc = 1;         
19e10 20 20 20 2f 2a 20 56 61 6c 75 65 20 74 6f 20 72     /* Value to r
19e20 65 74 75 72 6e 20 66 72 6f 6d 20 74 68 69 73 20  eturn from this 
19e30 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e  function */.  in
19e40 74 20 61 64 64 72 53 6f 72 74 49 6e 64 65 78 3b  t addrSortIndex;
19e50 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20       /* Address 
19e60 6f 66 20 61 6e 20 4f 50 5f 4f 70 65 6e 45 70 68  of an OP_OpenEph
19e70 65 6d 65 72 61 6c 20 69 6e 73 74 72 75 63 74 69  emeral instructi
19e80 6f 6e 20 2a 2f 0a 20 20 41 67 67 49 6e 66 6f 20  on */.  AggInfo 
19e90 73 41 67 67 49 6e 66 6f 3b 20 20 20 20 20 20 2f  sAggInfo;      /
19ea0 2a 20 49 6e 66 6f 72 6d 61 74 69 6f 6e 20 75 73  * Information us
19eb0 65 64 20 62 79 20 61 67 67 72 65 67 61 74 65 20  ed by aggregate 
19ec0 71 75 65 72 69 65 73 20 2a 2f 0a 20 20 69 6e 74  queries */.  int
19ed0 20 69 45 6e 64 3b 20 20 20 20 20 20 20 20 20 20   iEnd;          
19ee0 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f      /* Address o
19ef0 66 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65  f the end of the
19f00 20 71 75 65 72 79 20 2a 2f 0a 20 20 73 71 6c 69   query */.  sqli
19f10 74 65 33 20 2a 64 62 3b 20 20 20 20 20 20 20 20  te3 *db;        
19f20 20 20 20 2f 2a 20 54 68 65 20 64 61 74 61 62 61     /* The databa
19f30 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f  se connection */
19f40 0a 0a 20 20 64 62 20 3d 20 70 50 61 72 73 65 2d  ..  db = pParse-
19f50 3e 64 62 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20  >db;.  if( p==0 
19f60 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  || db->mallocFai
19f70 6c 65 64 20 7c 7c 20 70 50 61 72 73 65 2d 3e 6e  led || pParse->n
19f80 45 72 72 20 29 7b 0a 20 20 20 20 72 65 74 75 72  Err ){.    retur
19f90 6e 20 31 3b 0a 20 20 7d 0a 20 20 69 66 28 20 73  n 1;.  }.  if( s
19fa0 71 6c 69 74 65 33 41 75 74 68 43 68 65 63 6b 28  qlite3AuthCheck(
19fb0 70 50 61 72 73 65 2c 20 53 51 4c 49 54 45 5f 53  pParse, SQLITE_S
19fc0 45 4c 45 43 54 2c 20 30 2c 20 30 2c 20 30 29 20  ELECT, 0, 0, 0) 
19fd0 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 6d 65  ) return 1;.  me
19fe0 6d 73 65 74 28 26 73 41 67 67 49 6e 66 6f 2c 20  mset(&sAggInfo, 
19ff0 30 2c 20 73 69 7a 65 6f 66 28 73 41 67 67 49 6e  0, sizeof(sAggIn
1a000 66 6f 29 29 3b 0a 0a 20 20 70 4f 72 64 65 72 42  fo));..  pOrderB
1a010 79 20 3d 20 70 2d 3e 70 4f 72 64 65 72 42 79 3b  y = p->pOrderBy;
1a020 0a 20 20 69 66 28 20 49 67 6e 6f 72 61 62 6c 65  .  if( Ignorable
1a030 4f 72 64 65 72 62 79 28 70 44 65 73 74 29 20 29  Orderby(pDest) )
1a040 7b 0a 20 20 20 20 70 2d 3e 70 4f 72 64 65 72 42  {.    p->pOrderB
1a050 79 20 3d 20 30 3b 0a 0a 20 20 20 20 2f 2a 20 49  y = 0;..    /* I
1a060 6e 20 74 68 65 73 65 20 63 61 73 65 73 20 74 68  n these cases th
1a070 65 20 44 49 53 54 49 4e 43 54 20 6f 70 65 72 61  e DISTINCT opera
1a080 74 6f 72 20 6d 61 6b 65 73 20 6e 6f 20 64 69 66  tor makes no dif
1a090 66 65 72 65 6e 63 65 20 74 6f 20 74 68 65 0a 20  ference to the. 
1a0a0 20 20 20 2a 2a 20 72 65 73 75 6c 74 73 2c 20 73     ** results, s
1a0b0 6f 20 72 65 6d 6f 76 65 20 69 74 20 69 66 20 69  o remove it if i
1a0c0 74 20 77 65 72 65 20 73 70 65 63 69 66 69 65 64  t were specified
1a0d0 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61 73 73  ..    */.    ass
1a0e0 65 72 74 28 70 44 65 73 74 2d 3e 65 44 65 73 74  ert(pDest->eDest
1a0f0 3d 3d 53 52 54 5f 45 78 69 73 74 73 20 7c 7c 20  ==SRT_Exists || 
1a100 70 44 65 73 74 2d 3e 65 44 65 73 74 3d 3d 53 52  pDest->eDest==SR
1a110 54 5f 55 6e 69 6f 6e 20 7c 7c 20 0a 20 20 20 20  T_Union || .    
1a120 20 20 20 20 20 20 20 70 44 65 73 74 2d 3e 65 44         pDest->eD
1a130 65 73 74 3d 3d 53 52 54 5f 45 78 63 65 70 74 20  est==SRT_Except 
1a140 7c 7c 20 70 44 65 73 74 2d 3e 65 44 65 73 74 3d  || pDest->eDest=
1a150 3d 53 52 54 5f 44 69 73 63 61 72 64 29 3b 0a 20  =SRT_Discard);. 
1a160 20 20 20 70 2d 3e 69 73 44 69 73 74 69 6e 63 74     p->isDistinct
1a170 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20   = 0;.  }.  if( 
1a180 73 71 6c 69 74 65 33 53 65 6c 65 63 74 52 65 73  sqlite3SelectRes
1a190 6f 6c 76 65 28 70 50 61 72 73 65 2c 20 70 2c 20  olve(pParse, p, 
1a1a0 30 29 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 73  0) ){.    goto s
1a1b0 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 7d 0a 20  elect_end;.  }. 
1a1c0 20 70 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20 70   p->pOrderBy = p
1a1d0 4f 72 64 65 72 42 79 3b 0a 0a 23 69 66 6e 64 65  OrderBy;..#ifnde
1a1e0 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f  f SQLITE_OMIT_CO
1a1f0 4d 50 4f 55 4e 44 5f 53 45 4c 45 43 54 0a 20 20  MPOUND_SELECT.  
1a200 2f 2a 20 49 66 20 74 68 65 72 65 20 69 73 20 61  /* If there is a
1a210 72 65 20 61 20 73 65 71 75 65 6e 63 65 20 6f 66  re a sequence of
1a220 20 71 75 65 72 69 65 73 2c 20 64 6f 20 74 68 65   queries, do the
1a230 20 65 61 72 6c 69 65 72 20 6f 6e 65 73 20 66 69   earlier ones fi
1a240 72 73 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  rst..  */.  if( 
1a250 70 2d 3e 70 50 72 69 6f 72 20 29 7b 0a 20 20 20  p->pPrior ){.   
1a260 20 69 66 28 20 70 2d 3e 70 52 69 67 68 74 6d 6f   if( p->pRightmo
1a270 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 53  st==0 ){.      S
1a280 65 6c 65 63 74 20 2a 70 4c 6f 6f 70 2c 20 2a 70  elect *pLoop, *p
1a290 52 69 67 68 74 20 3d 20 30 3b 0a 20 20 20 20 20  Right = 0;.     
1a2a0 20 69 6e 74 20 63 6e 74 20 3d 20 30 3b 0a 20 20   int cnt = 0;.  
1a2b0 20 20 20 20 66 6f 72 28 70 4c 6f 6f 70 3d 70 3b      for(pLoop=p;
1a2c0 20 70 4c 6f 6f 70 3b 20 70 4c 6f 6f 70 3d 70 4c   pLoop; pLoop=pL
1a2d0 6f 6f 70 2d 3e 70 50 72 69 6f 72 2c 20 63 6e 74  oop->pPrior, cnt
1a2e0 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 70 4c 6f  ++){.        pLo
1a2f0 6f 70 2d 3e 70 52 69 67 68 74 6d 6f 73 74 20 3d  op->pRightmost =
1a300 20 70 3b 0a 20 20 20 20 20 20 20 20 70 4c 6f 6f   p;.        pLoo
1a310 70 2d 3e 70 4e 65 78 74 20 3d 20 70 52 69 67 68  p->pNext = pRigh
1a320 74 3b 0a 20 20 20 20 20 20 20 20 70 52 69 67 68  t;.        pRigh
1a330 74 20 3d 20 70 4c 6f 6f 70 3b 0a 20 20 20 20 20  t = pLoop;.     
1a340 20 7d 0a 20 20 20 20 20 20 69 66 28 20 53 51 4c   }.      if( SQL
1a350 49 54 45 5f 4d 41 58 5f 43 4f 4d 50 4f 55 4e 44  ITE_MAX_COMPOUND
1a360 5f 53 45 4c 45 43 54 3e 30 20 26 26 20 63 6e 74  _SELECT>0 && cnt
1a370 3e 53 51 4c 49 54 45 5f 4d 41 58 5f 43 4f 4d 50  >SQLITE_MAX_COMP
1a380 4f 55 4e 44 5f 53 45 4c 45 43 54 20 29 7b 0a 20  OUND_SELECT ){. 
1a390 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72         sqlite3Er
1a3a0 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
1a3b0 74 6f 6f 20 6d 61 6e 79 20 74 65 72 6d 73 20 69  too many terms i
1a3c0 6e 20 63 6f 6d 70 6f 75 6e 64 20 53 45 4c 45 43  n compound SELEC
1a3d0 54 22 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74  T");.        ret
1a3e0 75 72 6e 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20  urn 1;.      }. 
1a3f0 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20     }.    return 
1a400 6d 75 6c 74 69 53 65 6c 65 63 74 28 70 50 61 72  multiSelect(pPar
1a410 73 65 2c 20 70 2c 20 70 44 65 73 74 2c 20 61 66  se, p, pDest, af
1a420 66 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a  f);.  }.#endif..
1a430 20 20 2f 2a 20 4d 61 6b 65 20 6c 6f 63 61 6c 20    /* Make local 
1a440 63 6f 70 69 65 73 20 6f 66 20 74 68 65 20 70 61  copies of the pa
1a450 72 61 6d 65 74 65 72 73 20 66 6f 72 20 74 68 69  rameters for thi
1a460 73 20 71 75 65 72 79 2e 0a 20 20 2a 2f 0a 20 20  s query..  */.  
1a470 70 54 61 62 4c 69 73 74 20 3d 20 70 2d 3e 70 53  pTabList = p->pS
1a480 72 63 3b 0a 20 20 70 57 68 65 72 65 20 3d 20 70  rc;.  pWhere = p
1a490 2d 3e 70 57 68 65 72 65 3b 0a 20 20 70 47 72 6f  ->pWhere;.  pGro
1a4a0 75 70 42 79 20 3d 20 70 2d 3e 70 47 72 6f 75 70  upBy = p->pGroup
1a4b0 42 79 3b 0a 20 20 70 48 61 76 69 6e 67 20 3d 20  By;.  pHaving = 
1a4c0 70 2d 3e 70 48 61 76 69 6e 67 3b 0a 20 20 69 73  p->pHaving;.  is
1a4d0 41 67 67 20 3d 20 70 2d 3e 69 73 41 67 67 3b 0a  Agg = p->isAgg;.
1a4e0 20 20 69 73 44 69 73 74 69 6e 63 74 20 3d 20 70    isDistinct = p
1a4f0 2d 3e 69 73 44 69 73 74 69 6e 63 74 3b 0a 20 20  ->isDistinct;.  
1a500 70 45 4c 69 73 74 20 3d 20 70 2d 3e 70 45 4c 69  pEList = p->pELi
1a510 73 74 3b 0a 20 20 69 66 28 20 70 45 4c 69 73 74  st;.  if( pEList
1a520 3d 3d 30 20 29 20 67 6f 74 6f 20 73 65 6c 65 63  ==0 ) goto selec
1a530 74 5f 65 6e 64 3b 0a 0a 20 20 2f 2a 20 0a 20 20  t_end;..  /* .  
1a540 2a 2a 20 44 6f 20 6e 6f 74 20 65 76 65 6e 20 61  ** Do not even a
1a550 74 74 65 6d 70 74 20 74 6f 20 67 65 6e 65 72 61  ttempt to genera
1a560 74 65 20 61 6e 79 20 63 6f 64 65 20 69 66 20 77  te any code if w
1a570 65 20 68 61 76 65 20 61 6c 72 65 61 64 79 20 73  e have already s
1a580 65 65 6e 0a 20 20 2a 2a 20 65 72 72 6f 72 73 20  een.  ** errors 
1a590 62 65 66 6f 72 65 20 74 68 69 73 20 72 6f 75 74  before this rout
1a5a0 69 6e 65 20 73 74 61 72 74 73 2e 0a 20 20 2a 2f  ine starts..  */
1a5b0 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e  .  if( pParse->n
1a5c0 45 72 72 3e 30 20 29 20 67 6f 74 6f 20 73 65 6c  Err>0 ) goto sel
1a5d0 65 63 74 5f 65 6e 64 3b 0a 0a 20 20 2f 2a 20 49  ect_end;..  /* I
1a5e0 66 20 77 72 69 74 69 6e 67 20 74 6f 20 6d 65 6d  f writing to mem
1a5f0 6f 72 79 20 6f 72 20 67 65 6e 65 72 61 74 69 6e  ory or generatin
1a600 67 20 61 20 73 65 74 0a 20 20 2a 2a 20 6f 6e 6c  g a set.  ** onl
1a610 79 20 61 20 73 69 6e 67 6c 65 20 63 6f 6c 75 6d  y a single colum
1a620 6e 20 6d 61 79 20 62 65 20 6f 75 74 70 75 74 2e  n may be output.
1a630 0a 20 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51  .  */.#ifndef SQ
1a640 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45  LITE_OMIT_SUBQUE
1a650 52 59 0a 20 20 69 66 28 20 63 68 65 63 6b 46 6f  RY.  if( checkFo
1a660 72 4d 75 6c 74 69 43 6f 6c 75 6d 6e 53 65 6c 65  rMultiColumnSele
1a670 63 74 45 72 72 6f 72 28 70 50 61 72 73 65 2c 20  ctError(pParse, 
1a680 70 44 65 73 74 2c 20 70 45 4c 69 73 74 2d 3e 6e  pDest, pEList->n
1a690 45 78 70 72 29 20 29 7b 0a 20 20 20 20 67 6f 74  Expr) ){.    got
1a6a0 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20  o select_end;.  
1a6b0 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 4f  }.#endif..  /* O
1a6c0 52 44 45 52 20 42 59 20 69 73 20 69 67 6e 6f 72  RDER BY is ignor
1a6d0 65 64 20 66 6f 72 20 73 6f 6d 65 20 64 65 73 74  ed for some dest
1a6e0 69 6e 61 74 69 6f 6e 73 2e 0a 20 20 2a 2f 0a 20  inations..  */. 
1a6f0 20 69 66 28 20 49 67 6e 6f 72 61 62 6c 65 4f 72   if( IgnorableOr
1a700 64 65 72 62 79 28 70 44 65 73 74 29 20 29 7b 0a  derby(pDest) ){.
1a710 20 20 20 20 70 4f 72 64 65 72 42 79 20 3d 20 30      pOrderBy = 0
1a720 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 42 65 67 69  ;.  }..  /* Begi
1a730 6e 20 67 65 6e 65 72 61 74 69 6e 67 20 63 6f 64  n generating cod
1a740 65 2e 0a 20 20 2a 2f 0a 20 20 76 20 3d 20 73 71  e..  */.  v = sq
1a750 6c 69 74 65 33 47 65 74 56 64 62 65 28 70 50 61  lite3GetVdbe(pPa
1a760 72 73 65 29 3b 0a 20 20 69 66 28 20 76 3d 3d 30  rse);.  if( v==0
1a770 20 29 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65   ) goto select_e
1a780 6e 64 3b 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61  nd;..  /* Genera
1a790 74 65 20 63 6f 64 65 20 66 6f 72 20 61 6c 6c 20  te code for all 
1a7a0 73 75 62 2d 71 75 65 72 69 65 73 20 69 6e 20 74  sub-queries in t
1a7b0 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 0a 20  he FROM clause. 
1a7c0 20 2a 2f 0a 23 69 66 20 21 64 65 66 69 6e 65 64   */.#if !defined
1a7d0 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42  (SQLITE_OMIT_SUB
1a7e0 51 55 45 52 59 29 20 7c 7c 20 21 64 65 66 69 6e  QUERY) || !defin
1a7f0 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56  ed(SQLITE_OMIT_V
1a800 49 45 57 29 0a 20 20 66 6f 72 28 69 3d 30 3b 20  IEW).  for(i=0; 
1a810 69 3c 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63  i<pTabList->nSrc
1a820 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 63 6f 6e 73  ; i++){.    cons
1a830 74 20 63 68 61 72 20 2a 7a 53 61 76 65 64 41 75  t char *zSavedAu
1a840 74 68 43 6f 6e 74 65 78 74 20 3d 20 30 3b 0a 20  thContext = 0;. 
1a850 20 20 20 69 6e 74 20 6e 65 65 64 52 65 73 74 6f     int needResto
1a860 72 65 43 6f 6e 74 65 78 74 3b 0a 20 20 20 20 73  reContext;.    s
1a870 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74  truct SrcList_it
1a880 65 6d 20 2a 70 49 74 65 6d 20 3d 20 26 70 54 61  em *pItem = &pTa
1a890 62 4c 69 73 74 2d 3e 61 5b 69 5d 3b 0a 20 20 20  bList->a[i];.   
1a8a0 20 53 65 6c 65 63 74 44 65 73 74 20 64 65 73 74   SelectDest dest
1a8b0 20 3d 20 7b 53 52 54 5f 45 70 68 65 6d 54 61 62   = {SRT_EphemTab
1a8c0 2c 20 30 2c 20 30 7d 3b 0a 0a 20 20 20 20 69 66  , 0, 0};..    if
1a8d0 28 20 70 49 74 65 6d 2d 3e 70 53 65 6c 65 63 74  ( pItem->pSelect
1a8e0 3d 3d 30 20 7c 7c 20 70 49 74 65 6d 2d 3e 69 73  ==0 || pItem->is
1a8f0 50 6f 70 75 6c 61 74 65 64 20 29 20 63 6f 6e 74  Populated ) cont
1a900 69 6e 75 65 3b 0a 20 20 20 20 69 66 28 20 70 49  inue;.    if( pI
1a910 74 65 6d 2d 3e 7a 4e 61 6d 65 21 3d 30 20 29 7b  tem->zName!=0 ){
1a920 0a 20 20 20 20 20 20 7a 53 61 76 65 64 41 75 74  .      zSavedAut
1a930 68 43 6f 6e 74 65 78 74 20 3d 20 70 50 61 72 73  hContext = pPars
1a940 65 2d 3e 7a 41 75 74 68 43 6f 6e 74 65 78 74 3b  e->zAuthContext;
1a950 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 7a  .      pParse->z
1a960 41 75 74 68 43 6f 6e 74 65 78 74 20 3d 20 70 49  AuthContext = pI
1a970 74 65 6d 2d 3e 7a 4e 61 6d 65 3b 0a 20 20 20 20  tem->zName;.    
1a980 20 20 6e 65 65 64 52 65 73 74 6f 72 65 43 6f 6e    needRestoreCon
1a990 74 65 78 74 20 3d 20 31 3b 0a 20 20 20 20 7d 65  text = 1;.    }e
1a9a0 6c 73 65 7b 0a 20 20 20 20 20 20 6e 65 65 64 52  lse{.      needR
1a9b0 65 73 74 6f 72 65 43 6f 6e 74 65 78 74 20 3d 20  estoreContext = 
1a9c0 30 3b 0a 20 20 20 20 7d 0a 23 69 66 20 64 65 66  0;.    }.#if def
1a9d0 69 6e 65 64 28 53 51 4c 49 54 45 5f 54 45 53 54  ined(SQLITE_TEST
1a9e0 29 20 7c 7c 20 53 51 4c 49 54 45 5f 4d 41 58 5f  ) || SQLITE_MAX_
1a9f0 45 58 50 52 5f 44 45 50 54 48 3e 30 0a 20 20 20  EXPR_DEPTH>0.   
1aa00 20 2f 2a 20 49 6e 63 72 65 6d 65 6e 74 20 50 61   /* Increment Pa
1aa10 72 73 65 2e 6e 48 65 69 67 68 74 20 62 79 20 74  rse.nHeight by t
1aa20 68 65 20 68 65 69 67 68 74 20 6f 66 20 74 68 65  he height of the
1aa30 20 6c 61 72 67 65 73 74 20 65 78 70 72 65 73 73   largest express
1aa40 69 6f 6e 0a 20 20 20 20 2a 2a 20 74 72 65 65 20  ion.    ** tree 
1aa50 72 65 66 65 72 65 64 20 74 6f 20 62 79 20 74 68  refered to by th
1aa60 69 73 2c 20 74 68 65 20 70 61 72 65 6e 74 20 73  is, the parent s
1aa70 65 6c 65 63 74 2e 20 54 68 65 20 63 68 69 6c 64  elect. The child
1aa80 20 73 65 6c 65 63 74 0a 20 20 20 20 2a 2a 20 6d   select.    ** m
1aa90 61 79 20 63 6f 6e 74 61 69 6e 20 65 78 70 72 65  ay contain expre
1aaa0 73 73 69 6f 6e 20 74 72 65 65 73 20 6f 66 20 61  ssion trees of a
1aab0 74 20 6d 6f 73 74 0a 20 20 20 20 2a 2a 20 28 53  t most.    ** (S
1aac0 51 4c 49 54 45 5f 4d 41 58 5f 45 58 50 52 5f 44  QLITE_MAX_EXPR_D
1aad0 45 50 54 48 2d 50 61 72 73 65 2e 6e 48 65 69 67  EPTH-Parse.nHeig
1aae0 68 74 29 20 68 65 69 67 68 74 2e 20 54 68 69 73  ht) height. This
1aaf0 20 69 73 20 61 20 62 69 74 0a 20 20 20 20 2a 2a   is a bit.    **
1ab00 20 6d 6f 72 65 20 63 6f 6e 73 65 72 76 61 74 69   more conservati
1ab10 76 65 20 74 68 61 6e 20 6e 65 63 65 73 73 61 72  ve than necessar
1ab20 79 2c 20 62 75 74 20 6d 75 63 68 20 65 61 73 69  y, but much easi
1ab30 65 72 20 74 68 61 6e 20 65 6e 66 6f 72 63 69 6e  er than enforcin
1ab40 67 0a 20 20 20 20 2a 2a 20 61 6e 20 65 78 61 63  g.    ** an exac
1ab50 74 20 6c 69 6d 69 74 2e 0a 20 20 20 20 2a 2f 0a  t limit..    */.
1ab60 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 48 65 69      pParse->nHei
1ab70 67 68 74 20 2b 3d 20 73 71 6c 69 74 65 33 53 65  ght += sqlite3Se
1ab80 6c 65 63 74 45 78 70 72 48 65 69 67 68 74 28 70  lectExprHeight(p
1ab90 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 64 65  );.#endif.    de
1aba0 73 74 2e 69 50 61 72 6d 20 3d 20 70 49 74 65 6d  st.iParm = pItem
1abb0 2d 3e 69 43 75 72 73 6f 72 3b 0a 20 20 20 20 73  ->iCursor;.    s
1abc0 71 6c 69 74 65 33 53 65 6c 65 63 74 28 70 50 61  qlite3Select(pPa
1abd0 72 73 65 2c 20 70 49 74 65 6d 2d 3e 70 53 65 6c  rse, pItem->pSel
1abe0 65 63 74 2c 20 26 64 65 73 74 2c 20 70 2c 20 69  ect, &dest, p, i
1abf0 2c 20 26 69 73 41 67 67 2c 20 30 29 3b 0a 20 20  , &isAgg, 0);.  
1ac00 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63    if( db->malloc
1ac10 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 20 20  Failed ){.      
1ac20 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b  goto select_end;
1ac30 0a 20 20 20 20 7d 0a 23 69 66 20 64 65 66 69 6e  .    }.#if defin
1ac40 65 64 28 53 51 4c 49 54 45 5f 54 45 53 54 29 20  ed(SQLITE_TEST) 
1ac50 7c 7c 20 53 51 4c 49 54 45 5f 4d 41 58 5f 45 58  || SQLITE_MAX_EX
1ac60 50 52 5f 44 45 50 54 48 3e 30 0a 20 20 20 20 70  PR_DEPTH>0.    p
1ac70 50 61 72 73 65 2d 3e 6e 48 65 69 67 68 74 20 2d  Parse->nHeight -
1ac80 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 45  = sqlite3SelectE
1ac90 78 70 72 48 65 69 67 68 74 28 70 29 3b 0a 23 65  xprHeight(p);.#e
1aca0 6e 64 69 66 0a 20 20 20 20 69 66 28 20 6e 65 65  ndif.    if( nee
1acb0 64 52 65 73 74 6f 72 65 43 6f 6e 74 65 78 74 20  dRestoreContext 
1acc0 29 7b 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d  ){.      pParse-
1acd0 3e 7a 41 75 74 68 43 6f 6e 74 65 78 74 20 3d 20  >zAuthContext = 
1ace0 7a 53 61 76 65 64 41 75 74 68 43 6f 6e 74 65 78  zSavedAuthContex
1acf0 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 54 61  t;.    }.    pTa
1ad00 62 4c 69 73 74 20 3d 20 70 2d 3e 70 53 72 63 3b  bList = p->pSrc;
1ad10 0a 20 20 20 20 70 57 68 65 72 65 20 3d 20 70 2d  .    pWhere = p-
1ad20 3e 70 57 68 65 72 65 3b 0a 20 20 20 20 69 66 28  >pWhere;.    if(
1ad30 20 21 49 67 6e 6f 72 61 62 6c 65 4f 72 64 65 72   !IgnorableOrder
1ad40 62 79 28 70 44 65 73 74 29 20 29 7b 0a 20 20 20  by(pDest) ){.   
1ad50 20 20 20 70 4f 72 64 65 72 42 79 20 3d 20 70 2d     pOrderBy = p-
1ad60 3e 70 4f 72 64 65 72 42 79 3b 0a 20 20 20 20 7d  >pOrderBy;.    }
1ad70 0a 20 20 20 20 70 47 72 6f 75 70 42 79 20 3d 20  .    pGroupBy = 
1ad80 70 2d 3e 70 47 72 6f 75 70 42 79 3b 0a 20 20 20  p->pGroupBy;.   
1ad90 20 70 48 61 76 69 6e 67 20 3d 20 70 2d 3e 70 48   pHaving = p->pH
1ada0 61 76 69 6e 67 3b 0a 20 20 20 20 69 73 44 69 73  aving;.    isDis
1adb0 74 69 6e 63 74 20 3d 20 70 2d 3e 69 73 44 69 73  tinct = p->isDis
1adc0 74 69 6e 63 74 3b 0a 20 20 7d 0a 23 65 6e 64 69  tinct;.  }.#endi
1add0 66 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 66 6f  f..  /* Check fo
1ade0 72 20 74 68 65 20 73 70 65 63 69 61 6c 20 63 61  r the special ca
1adf0 73 65 20 6f 66 20 61 20 6d 69 6e 28 29 20 6f 72  se of a min() or
1ae00 20 6d 61 78 28 29 20 66 75 6e 63 74 69 6f 6e 20   max() function 
1ae10 62 79 20 69 74 73 65 6c 66 0a 20 20 2a 2a 20 69  by itself.  ** i
1ae20 6e 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74  n the result set
1ae30 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 73 69 6d  ..  */.  if( sim
1ae40 70 6c 65 4d 69 6e 4d 61 78 51 75 65 72 79 28 70  pleMinMaxQuery(p
1ae50 50 61 72 73 65 2c 20 70 2c 20 70 44 65 73 74 29  Parse, p, pDest)
1ae60 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 30 3b 0a   ){.    rc = 0;.
1ae70 20 20 20 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f      goto select_
1ae80 65 6e 64 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43  end;.  }..  /* C
1ae90 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20 74  heck to see if t
1aea0 68 69 73 20 69 73 20 61 20 73 75 62 71 75 65 72  his is a subquer
1aeb0 79 20 74 68 61 74 20 63 61 6e 20 62 65 20 22 66  y that can be "f
1aec0 6c 61 74 74 65 6e 65 64 22 20 69 6e 74 6f 20 69  lattened" into i
1aed0 74 73 20 70 61 72 65 6e 74 2e 0a 20 20 2a 2a 20  ts parent..  ** 
1aee0 49 66 20 66 6c 61 74 74 65 6e 69 6e 67 20 69 73  If flattening is
1aef0 20 61 20 70 6f 73 73 69 62 6c 69 74 79 2c 20 64   a possiblity, d
1af00 6f 20 73 6f 20 61 6e 64 20 72 65 74 75 72 6e 20  o so and return 
1af10 69 6d 6d 65 64 69 61 74 65 6c 79 2e 20 20 0a 20  immediately.  . 
1af20 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49   */.#ifndef SQLI
1af30 54 45 5f 4f 4d 49 54 5f 56 49 45 57 0a 20 20 69  TE_OMIT_VIEW.  i
1af40 66 28 20 70 50 61 72 65 6e 74 20 26 26 20 70 50  f( pParent && pP
1af50 61 72 65 6e 74 41 67 67 20 26 26 0a 20 20 20 20  arentAgg &&.    
1af60 20 20 66 6c 61 74 74 65 6e 53 75 62 71 75 65 72    flattenSubquer
1af70 79 28 64 62 2c 20 70 50 61 72 65 6e 74 2c 20 70  y(db, pParent, p
1af80 61 72 65 6e 74 54 61 62 2c 20 2a 70 50 61 72 65  arentTab, *pPare
1af90 6e 74 41 67 67 2c 20 69 73 41 67 67 29 20 29 7b  ntAgg, isAgg) ){
1afa0 0a 20 20 20 20 69 66 28 20 69 73 41 67 67 20 29  .    if( isAgg )
1afb0 20 2a 70 50 61 72 65 6e 74 41 67 67 20 3d 20 31   *pParentAgg = 1
1afc0 3b 0a 20 20 20 20 67 6f 74 6f 20 73 65 6c 65 63  ;.    goto selec
1afd0 74 5f 65 6e 64 3b 0a 20 20 7d 0a 23 65 6e 64 69  t_end;.  }.#endi
1afe0 66 0a 0a 20 20 2f 2a 20 49 66 20 70 6f 73 73 69  f..  /* If possi
1aff0 62 6c 65 2c 20 72 65 77 72 69 74 65 20 74 68 65  ble, rewrite the
1b000 20 71 75 65 72 79 20 74 6f 20 75 73 65 20 47 52   query to use GR
1b010 4f 55 50 20 42 59 20 69 6e 73 74 65 61 64 20 6f  OUP BY instead o
1b020 66 20 44 49 53 54 49 4e 43 54 2e 0a 20 20 2a 2a  f DISTINCT..  **
1b030 20 47 52 4f 55 50 20 42 59 20 6d 61 79 20 75 73   GROUP BY may us
1b040 65 20 61 6e 20 69 6e 64 65 78 2c 20 44 49 53 54  e an index, DIST
1b050 49 4e 43 54 20 6e 65 76 65 72 20 64 6f 65 73 2e  INCT never does.
1b060 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 69  .  */.  if( p->i
1b070 73 44 69 73 74 69 6e 63 74 20 26 26 20 21 70 2d  sDistinct && !p-
1b080 3e 69 73 41 67 67 20 26 26 20 21 70 2d 3e 70 47  >isAgg && !p->pG
1b090 72 6f 75 70 42 79 20 29 7b 0a 20 20 20 20 70 2d  roupBy ){.    p-
1b0a0 3e 70 47 72 6f 75 70 42 79 20 3d 20 73 71 6c 69  >pGroupBy = sqli
1b0b0 74 65 33 45 78 70 72 4c 69 73 74 44 75 70 28 64  te3ExprListDup(d
1b0c0 62 2c 20 70 2d 3e 70 45 4c 69 73 74 29 3b 0a 20  b, p->pEList);. 
1b0d0 20 20 20 70 47 72 6f 75 70 42 79 20 3d 20 70 2d     pGroupBy = p-
1b0e0 3e 70 47 72 6f 75 70 42 79 3b 0a 20 20 20 20 70  >pGroupBy;.    p
1b0f0 2d 3e 69 73 44 69 73 74 69 6e 63 74 20 3d 20 30  ->isDistinct = 0
1b100 3b 0a 20 20 20 20 69 73 44 69 73 74 69 6e 63 74  ;.    isDistinct
1b110 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20   = 0;.  }..  /* 
1b120 49 66 20 74 68 65 72 65 20 69 73 20 61 6e 20 4f  If there is an O
1b130 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 2c 20  RDER BY clause, 
1b140 74 68 65 6e 20 74 68 69 73 20 73 6f 72 74 69 6e  then this sortin
1b150 67 0a 20 20 2a 2a 20 69 6e 64 65 78 20 6d 69 67  g.  ** index mig
1b160 68 74 20 65 6e 64 20 75 70 20 62 65 69 6e 67 20  ht end up being 
1b170 75 6e 75 73 65 64 20 69 66 20 74 68 65 20 64 61  unused if the da
1b180 74 61 20 63 61 6e 20 62 65 20 0a 20 20 2a 2a 20  ta can be .  ** 
1b190 65 78 74 72 61 63 74 65 64 20 69 6e 20 70 72 65  extracted in pre
1b1a0 2d 73 6f 72 74 65 64 20 6f 72 64 65 72 2e 20 20  -sorted order.  
1b1b0 49 66 20 74 68 61 74 20 69 73 20 74 68 65 20 63  If that is the c
1b1c0 61 73 65 2c 20 74 68 65 6e 20 74 68 65 0a 20 20  ase, then the.  
1b1d0 2a 2a 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65  ** OP_OpenEpheme
1b1e0 72 61 6c 20 69 6e 73 74 72 75 63 74 69 6f 6e 20  ral instruction 
1b1f0 77 69 6c 6c 20 62 65 20 63 68 61 6e 67 65 64 20  will be changed 
1b200 74 6f 20 61 6e 20 4f 50 5f 4e 6f 6f 70 20 6f 6e  to an OP_Noop on
1b210 63 65 0a 20 20 2a 2a 20 77 65 20 66 69 67 75 72  ce.  ** we figur
1b220 65 20 6f 75 74 20 74 68 61 74 20 74 68 65 20 73  e out that the s
1b230 6f 72 74 69 6e 67 20 69 6e 64 65 78 20 69 73 20  orting index is 
1b240 6e 6f 74 20 6e 65 65 64 65 64 2e 20 20 54 68 65  not needed.  The
1b250 20 61 64 64 72 53 6f 72 74 49 6e 64 65 78 0a 20   addrSortIndex. 
1b260 20 2a 2a 20 76 61 72 69 61 62 6c 65 20 69 73 20   ** variable is 
1b270 75 73 65 64 20 74 6f 20 66 61 63 69 6c 69 74 61  used to facilita
1b280 74 65 20 74 68 61 74 20 63 68 61 6e 67 65 2e 0a  te that change..
1b290 20 20 2a 2f 0a 20 20 69 66 28 20 70 4f 72 64 65    */.  if( pOrde
1b2a0 72 42 79 20 29 7b 0a 20 20 20 20 4b 65 79 49 6e  rBy ){.    KeyIn
1b2b0 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 3b 0a 20 20  fo *pKeyInfo;.  
1b2c0 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 45    if( pParse->nE
1b2d0 72 72 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f  rr ){.      goto
1b2e0 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20   select_end;.   
1b2f0 20 7d 0a 20 20 20 20 70 4b 65 79 49 6e 66 6f 20   }.    pKeyInfo 
1b300 3d 20 6b 65 79 49 6e 66 6f 46 72 6f 6d 45 78 70  = keyInfoFromExp
1b310 72 4c 69 73 74 28 70 50 61 72 73 65 2c 20 70 4f  rList(pParse, pO
1b320 72 64 65 72 42 79 29 3b 0a 20 20 20 20 70 4f 72  rderBy);.    pOr
1b330 64 65 72 42 79 2d 3e 69 45 43 75 72 73 6f 72 20  derBy->iECursor 
1b340 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b  = pParse->nTab++
1b350 3b 0a 20 20 20 20 70 2d 3e 61 64 64 72 4f 70 65  ;.    p->addrOpe
1b360 6e 45 70 68 6d 5b 32 5d 20 3d 20 61 64 64 72 53  nEphm[2] = addrS
1b370 6f 72 74 49 6e 64 65 78 20 3d 0a 20 20 20 20 20  ortIndex =.     
1b380 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
1b390 70 34 28 76 2c 20 4f 50 5f 4f 70 65 6e 45 70 68  p4(v, OP_OpenEph
1b3a0 65 6d 65 72 61 6c 2c 0a 20 20 20 20 20 20 20 20  emeral,.        
1b3b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b3c0 20 20 20 70 4f 72 64 65 72 42 79 2d 3e 69 45 43     pOrderBy->iEC
1b3d0 75 72 73 6f 72 2c 20 70 4f 72 64 65 72 42 79 2d  ursor, pOrderBy-
1b3e0 3e 6e 45 78 70 72 2b 32 2c 20 30 2c 0a 20 20 20  >nExpr+2, 0,.   
1b3f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b400 20 20 20 20 20 20 20 20 28 63 68 61 72 2a 29 70          (char*)p
1b410 4b 65 79 49 6e 66 6f 2c 20 50 34 5f 4b 45 59 49  KeyInfo, P4_KEYI
1b420 4e 46 4f 5f 48 41 4e 44 4f 46 46 29 3b 0a 20 20  NFO_HANDOFF);.  
1b430 7d 65 6c 73 65 7b 0a 20 20 20 20 61 64 64 72 53  }else{.    addrS
1b440 6f 72 74 49 6e 64 65 78 20 3d 20 2d 31 3b 0a 20  ortIndex = -1;. 
1b450 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20   }..  /* If the 
1b460 6f 75 74 70 75 74 20 69 73 20 64 65 73 74 69 6e  output is destin
1b470 65 64 20 66 6f 72 20 61 20 74 65 6d 70 6f 72 61  ed for a tempora
1b480 72 79 20 74 61 62 6c 65 2c 20 6f 70 65 6e 20 74  ry table, open t
1b490 68 61 74 20 74 61 62 6c 65 2e 0a 20 20 2a 2f 0a  hat table..  */.
1b4a0 20 20 69 66 28 20 70 44 65 73 74 2d 3e 65 44 65    if( pDest->eDe
1b4b0 73 74 3d 3d 53 52 54 5f 45 70 68 65 6d 54 61 62  st==SRT_EphemTab
1b4c0 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56   ){.    sqlite3V
1b4d0 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
1b4e0 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 2c 20 70  OpenEphemeral, p
1b4f0 44 65 73 74 2d 3e 69 50 61 72 6d 2c 20 70 45 4c  Dest->iParm, pEL
1b500 69 73 74 2d 3e 6e 45 78 70 72 29 3b 0a 20 20 7d  ist->nExpr);.  }
1b510 0a 0a 20 20 2f 2a 20 53 65 74 20 74 68 65 20 6c  ..  /* Set the l
1b520 69 6d 69 74 65 72 2e 0a 20 20 2a 2f 0a 20 20 69  imiter..  */.  i
1b530 45 6e 64 20 3d 20 73 71 6c 69 74 65 33 56 64 62  End = sqlite3Vdb
1b540 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20  eMakeLabel(v);. 
1b550 20 63 6f 6d 70 75 74 65 4c 69 6d 69 74 52 65 67   computeLimitReg
1b560 69 73 74 65 72 73 28 70 50 61 72 73 65 2c 20 70  isters(pParse, p
1b570 2c 20 69 45 6e 64 29 3b 0a 0a 20 20 2f 2a 20 4f  , iEnd);..  /* O
1b580 70 65 6e 20 61 20 76 69 72 74 75 61 6c 20 69 6e  pen a virtual in
1b590 64 65 78 20 74 6f 20 75 73 65 20 66 6f 72 20 74  dex to use for t
1b5a0 68 65 20 64 69 73 74 69 6e 63 74 20 73 65 74 2e  he distinct set.
1b5b0 0a 20 20 2a 2f 0a 20 20 69 66 28 20 69 73 44 69  .  */.  if( isDi
1b5c0 73 74 69 6e 63 74 20 29 7b 0a 20 20 20 20 4b 65  stinct ){.    Ke
1b5d0 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 3b  yInfo *pKeyInfo;
1b5e0 0a 20 20 20 20 61 73 73 65 72 74 28 20 69 73 41  .    assert( isA
1b5f0 67 67 20 7c 7c 20 70 47 72 6f 75 70 42 79 20 29  gg || pGroupBy )
1b600 3b 0a 20 20 20 20 64 69 73 74 69 6e 63 74 20 3d  ;.    distinct =
1b610 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b   pParse->nTab++;
1b620 0a 20 20 20 20 70 4b 65 79 49 6e 66 6f 20 3d 20  .    pKeyInfo = 
1b630 6b 65 79 49 6e 66 6f 46 72 6f 6d 45 78 70 72 4c  keyInfoFromExprL
1b640 69 73 74 28 70 50 61 72 73 65 2c 20 70 2d 3e 70  ist(pParse, p->p
1b650 45 4c 69 73 74 29 3b 0a 20 20 20 20 73 71 6c 69  EList);.    sqli
1b660 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c  te3VdbeAddOp4(v,
1b670 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61   OP_OpenEphemera
1b680 6c 2c 20 64 69 73 74 69 6e 63 74 2c 20 30 2c 20  l, distinct, 0, 
1b690 30 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  0,.             
1b6a0 20 20 20 20 20 20 20 20 20 20 20 28 63 68 61 72             (char
1b6b0 2a 29 70 4b 65 79 49 6e 66 6f 2c 20 50 34 5f 4b  *)pKeyInfo, P4_K
1b6c0 45 59 49 4e 46 4f 5f 48 41 4e 44 4f 46 46 29 3b  EYINFO_HANDOFF);
1b6d0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 64 69  .  }else{.    di
1b6e0 73 74 69 6e 63 74 20 3d 20 2d 31 3b 0a 20 20 7d  stinct = -1;.  }
1b6f0 0a 0a 20 20 2f 2a 20 41 67 67 72 65 67 61 74 65  ..  /* Aggregate
1b700 20 61 6e 64 20 6e 6f 6e 2d 61 67 67 72 65 67 61   and non-aggrega
1b710 74 65 20 71 75 65 72 69 65 73 20 61 72 65 20 68  te queries are h
1b720 61 6e 64 6c 65 64 20 64 69 66 66 65 72 65 6e 74  andled different
1b730 6c 79 20 2a 2f 0a 20 20 69 66 28 20 21 69 73 41  ly */.  if( !isA
1b740 67 67 20 26 26 20 70 47 72 6f 75 70 42 79 3d 3d  gg && pGroupBy==
1b750 30 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 69 73  0 ){.    /* This
1b760 20 63 61 73 65 20 69 73 20 66 6f 72 20 6e 6f 6e   case is for non
1b770 2d 61 67 67 72 65 67 61 74 65 20 71 75 65 72 69  -aggregate queri
1b780 65 73 0a 20 20 20 20 2a 2a 20 42 65 67 69 6e 20  es.    ** Begin 
1b790 74 68 65 20 64 61 74 61 62 61 73 65 20 73 63 61  the database sca
1b7a0 6e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70 57 49  n.    */.    pWI
1b7b0 6e 66 6f 20 3d 20 73 71 6c 69 74 65 33 57 68 65  nfo = sqlite3Whe
1b7c0 72 65 42 65 67 69 6e 28 70 50 61 72 73 65 2c 20  reBegin(pParse, 
1b7d0 70 54 61 62 4c 69 73 74 2c 20 70 57 68 65 72 65  pTabList, pWhere
1b7e0 2c 20 26 70 4f 72 64 65 72 42 79 29 3b 0a 20 20  , &pOrderBy);.  
1b7f0 20 20 69 66 28 20 70 57 49 6e 66 6f 3d 3d 30 20    if( pWInfo==0 
1b800 29 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e  ) goto select_en
1b810 64 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 73 6f  d;..    /* If so
1b820 72 74 69 6e 67 20 69 6e 64 65 78 20 74 68 61 74  rting index that
1b830 20 77 61 73 20 63 72 65 61 74 65 64 20 62 79 20   was created by 
1b840 61 20 70 72 69 6f 72 20 4f 50 5f 4f 70 65 6e 45  a prior OP_OpenE
1b850 70 68 65 6d 65 72 61 6c 20 0a 20 20 20 20 2a 2a  phemeral .    **
1b860 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 65 6e 64   instruction end
1b870 65 64 20 75 70 20 6e 6f 74 20 62 65 69 6e 67 20  ed up not being 
1b880 6e 65 65 64 65 64 2c 20 74 68 65 6e 20 63 68 61  needed, then cha
1b890 6e 67 65 20 74 68 65 20 4f 50 5f 4f 70 65 6e 45  nge the OP_OpenE
1b8a0 70 68 65 6d 65 72 61 6c 0a 20 20 20 20 2a 2a 20  phemeral.    ** 
1b8b0 69 6e 74 6f 20 61 6e 20 4f 50 5f 4e 6f 6f 70 2e  into an OP_Noop.
1b8c0 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
1b8d0 61 64 64 72 53 6f 72 74 49 6e 64 65 78 3e 3d 30  addrSortIndex>=0
1b8e0 20 26 26 20 70 4f 72 64 65 72 42 79 3d 3d 30 20   && pOrderBy==0 
1b8f0 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
1b900 56 64 62 65 43 68 61 6e 67 65 54 6f 4e 6f 6f 70  VdbeChangeToNoop
1b910 28 76 2c 20 61 64 64 72 53 6f 72 74 49 6e 64 65  (v, addrSortInde
1b920 78 2c 20 31 29 3b 0a 20 20 20 20 20 20 70 2d 3e  x, 1);.      p->
1b930 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b 32 5d 20  addrOpenEphm[2] 
1b940 3d 20 2d 31 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  = -1;.    }..   
1b950 20 2f 2a 20 55 73 65 20 74 68 65 20 73 74 61 6e   /* Use the stan
1b960 64 61 72 64 20 69 6e 6e 65 72 20 6c 6f 6f 70 0a  dard inner loop.
1b970 20 20 20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72      */.    asser
1b980 74 28 21 69 73 44 69 73 74 69 6e 63 74 29 3b 0a  t(!isDistinct);.
1b990 20 20 20 20 69 66 28 20 73 65 6c 65 63 74 49 6e      if( selectIn
1b9a0 6e 65 72 4c 6f 6f 70 28 70 50 61 72 73 65 2c 20  nerLoop(pParse, 
1b9b0 70 2c 20 70 45 4c 69 73 74 2c 20 30 2c 20 30 2c  p, pEList, 0, 0,
1b9c0 20 70 4f 72 64 65 72 42 79 2c 20 2d 31 2c 20 70   pOrderBy, -1, p
1b9d0 44 65 73 74 2c 0a 20 20 20 20 20 20 20 20 20 20  Dest,.          
1b9e0 20 20 20 20 20 20 20 20 20 20 70 57 49 6e 66 6f            pWInfo
1b9f0 2d 3e 69 43 6f 6e 74 69 6e 75 65 2c 20 70 57 49  ->iContinue, pWI
1ba00 6e 66 6f 2d 3e 69 42 72 65 61 6b 2c 20 61 66 66  nfo->iBreak, aff
1ba10 29 20 29 7b 0a 20 20 20 20 20 20 20 67 6f 74 6f  ) ){.       goto
1ba20 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20   select_end;.   
1ba30 20 7d 0a 0a 20 20 20 20 2f 2a 20 45 6e 64 20 74   }..    /* End t
1ba40 68 65 20 64 61 74 61 62 61 73 65 20 73 63 61 6e  he database scan
1ba50 20 6c 6f 6f 70 2e 0a 20 20 20 20 2a 2f 0a 20 20   loop..    */.  
1ba60 20 20 73 71 6c 69 74 65 33 57 68 65 72 65 45 6e    sqlite3WhereEn
1ba70 64 28 70 57 49 6e 66 6f 29 3b 0a 20 20 7d 65 6c  d(pWInfo);.  }el
1ba80 73 65 7b 0a 20 20 20 20 2f 2a 20 54 68 69 73 20  se{.    /* This 
1ba90 69 73 20 74 68 65 20 70 72 6f 63 65 73 73 69 6e  is the processin
1baa0 67 20 66 6f 72 20 61 67 67 72 65 67 61 74 65 20  g for aggregate 
1bab0 71 75 65 72 69 65 73 20 2a 2f 0a 20 20 20 20 4e  queries */.    N
1bac0 61 6d 65 43 6f 6e 74 65 78 74 20 73 4e 43 3b 20  ameContext sNC; 
1bad0 20 20 20 2f 2a 20 4e 61 6d 65 20 63 6f 6e 74 65     /* Name conte
1bae0 78 74 20 66 6f 72 20 70 72 6f 63 65 73 73 69 6e  xt for processin
1baf0 67 20 61 67 67 72 65 67 61 74 65 20 69 6e 66 6f  g aggregate info
1bb00 72 6d 61 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 69  rmation */.    i
1bb10 6e 74 20 69 41 4d 65 6d 3b 20 20 20 20 20 20 20  nt iAMem;       
1bb20 20 20 20 2f 2a 20 46 69 72 73 74 20 4d 65 6d 20     /* First Mem 
1bb30 61 64 64 72 65 73 73 20 66 6f 72 20 73 74 6f 72  address for stor
1bb40 69 6e 67 20 63 75 72 72 65 6e 74 20 47 52 4f 55  ing current GROU
1bb50 50 20 42 59 20 2a 2f 0a 20 20 20 20 69 6e 74 20  P BY */.    int 
1bb60 69 42 4d 65 6d 3b 20 20 20 20 20 20 20 20 20 20  iBMem;          
1bb70 2f 2a 20 46 69 72 73 74 20 4d 65 6d 20 61 64 64  /* First Mem add
1bb80 72 65 73 73 20 66 6f 72 20 70 72 65 76 69 6f 75  ress for previou
1bb90 73 20 47 52 4f 55 50 20 42 59 20 2a 2f 0a 20 20  s GROUP BY */.  
1bba0 20 20 69 6e 74 20 69 55 73 65 46 6c 61 67 3b 20    int iUseFlag; 
1bbb0 20 20 20 20 20 20 2f 2a 20 4d 65 6d 20 61 64 64        /* Mem add
1bbc0 72 65 73 73 20 68 6f 6c 64 69 6e 67 20 66 6c 61  ress holding fla
1bbd0 67 20 69 6e 64 69 63 61 74 69 6e 67 20 74 68 61  g indicating tha
1bbe0 74 20 61 74 20 6c 65 61 73 74 0a 20 20 20 20 20  t at least.     
1bbf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bc00 20 20 20 2a 2a 20 6f 6e 65 20 72 6f 77 20 6f 66     ** one row of
1bc10 20 74 68 65 20 69 6e 70 75 74 20 74 6f 20 74 68   the input to th
1bc20 65 20 61 67 67 72 65 67 61 74 6f 72 20 68 61 73  e aggregator has
1bc30 20 62 65 65 6e 0a 20 20 20 20 20 20 20 20 20 20   been.          
1bc40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a                **
1bc50 20 70 72 6f 63 65 73 73 65 64 20 2a 2f 0a 20 20   processed */.  
1bc60 20 20 69 6e 74 20 69 41 62 6f 72 74 46 6c 61 67    int iAbortFlag
1bc70 3b 20 20 20 20 20 2f 2a 20 4d 65 6d 20 61 64 64  ;     /* Mem add
1bc80 72 65 73 73 20 77 68 69 63 68 20 63 61 75 73 65  ress which cause
1bc90 73 20 71 75 65 72 79 20 61 62 6f 72 74 20 69 66  s query abort if
1bca0 20 70 6f 73 69 74 69 76 65 20 2a 2f 0a 20 20 20   positive */.   
1bcb0 20 69 6e 74 20 67 72 6f 75 70 42 79 53 6f 72 74   int groupBySort
1bcc0 3b 20 20 20 20 2f 2a 20 52 6f 77 73 20 63 6f 6d  ;    /* Rows com
1bcd0 65 20 66 72 6f 6d 20 73 6f 75 72 63 65 20 69 6e  e from source in
1bce0 20 47 52 4f 55 50 20 42 59 20 6f 72 64 65 72 20   GROUP BY order 
1bcf0 2a 2f 0a 0a 0a 20 20 20 20 2f 2a 20 54 68 65 20  */...    /* The 
1bd00 66 6f 6c 6c 6f 77 69 6e 67 20 76 61 72 69 61 62  following variab
1bd10 6c 65 73 20 68 6f 6c 64 20 61 64 64 72 65 73 73  les hold address
1bd20 65 73 20 6f 72 20 6c 61 62 65 6c 73 20 66 6f 72  es or labels for
1bd30 20 70 61 72 74 73 20 6f 66 20 74 68 65 0a 20 20   parts of the.  
1bd40 20 20 2a 2a 20 76 69 72 74 75 61 6c 20 6d 61 63    ** virtual mac
1bd50 68 69 6e 65 20 70 72 6f 67 72 61 6d 20 77 65 20  hine program we 
1bd60 61 72 65 20 70 75 74 74 69 6e 67 20 74 6f 67 65  are putting toge
1bd70 74 68 65 72 20 2a 2f 0a 20 20 20 20 69 6e 74 20  ther */.    int 
1bd80 61 64 64 72 4f 75 74 70 75 74 52 6f 77 3b 20 20  addrOutputRow;  
1bd90 20 20 20 20 2f 2a 20 53 74 61 72 74 20 6f 66 20      /* Start of 
1bda0 73 75 62 72 6f 75 74 69 6e 65 20 74 68 61 74 20  subroutine that 
1bdb0 6f 75 74 70 75 74 73 20 61 20 72 65 73 75 6c 74  outputs a result
1bdc0 20 72 6f 77 20 2a 2f 0a 20 20 20 20 69 6e 74 20   row */.    int 
1bdd0 61 64 64 72 53 65 74 41 62 6f 72 74 3b 20 20 20  addrSetAbort;   
1bde0 20 20 20 20 2f 2a 20 53 65 74 20 74 68 65 20 61      /* Set the a
1bdf0 62 6f 72 74 20 66 6c 61 67 20 61 6e 64 20 72 65  bort flag and re
1be00 74 75 72 6e 20 2a 2f 0a 20 20 20 20 69 6e 74 20  turn */.    int 
1be10 61 64 64 72 49 6e 69 74 69 61 6c 69 7a 65 4c 6f  addrInitializeLo
1be20 6f 70 3b 20 2f 2a 20 53 74 61 72 74 20 6f 66 20  op; /* Start of 
1be30 63 6f 64 65 20 74 68 61 74 20 69 6e 69 74 69 61  code that initia
1be40 6c 69 7a 65 73 20 74 68 65 20 69 6e 70 75 74 20  lizes the input 
1be50 6c 6f 6f 70 20 2a 2f 0a 20 20 20 20 69 6e 74 20  loop */.    int 
1be60 61 64 64 72 54 6f 70 4f 66 4c 6f 6f 70 3b 20 20  addrTopOfLoop;  
1be70 20 20 20 20 2f 2a 20 54 6f 70 20 6f 66 20 74 68      /* Top of th
1be80 65 20 69 6e 70 75 74 20 6c 6f 6f 70 20 2a 2f 0a  e input loop */.
1be90 20 20 20 20 69 6e 74 20 61 64 64 72 47 72 6f 75      int addrGrou
1bea0 70 42 79 43 68 61 6e 67 65 3b 20 20 2f 2a 20 43  pByChange;  /* C
1beb0 6f 64 65 20 74 68 61 74 20 72 75 6e 73 20 77 68  ode that runs wh
1bec0 65 6e 20 61 6e 79 20 47 52 4f 55 50 20 42 59 20  en any GROUP BY 
1bed0 74 65 72 6d 20 63 68 61 6e 67 65 73 20 2a 2f 0a  term changes */.
1bee0 20 20 20 20 69 6e 74 20 61 64 64 72 50 72 6f 63      int addrProc
1bef0 65 73 73 52 6f 77 3b 20 20 20 20 20 2f 2a 20 43  essRow;     /* C
1bf00 6f 64 65 20 74 6f 20 70 72 6f 63 65 73 73 20 61  ode to process a
1bf10 20 73 69 6e 67 6c 65 20 69 6e 70 75 74 20 72 6f   single input ro
1bf20 77 20 2a 2f 0a 20 20 20 20 69 6e 74 20 61 64 64  w */.    int add
1bf30 72 45 6e 64 3b 20 20 20 20 20 20 20 20 20 20 20  rEnd;           
1bf40 20 2f 2a 20 45 6e 64 20 6f 66 20 61 6c 6c 20 70   /* End of all p
1bf50 72 6f 63 65 73 73 69 6e 67 20 2a 2f 0a 20 20 20  rocessing */.   
1bf60 20 69 6e 74 20 61 64 64 72 53 6f 72 74 69 6e 67   int addrSorting
1bf70 49 64 78 3b 20 20 20 20 20 2f 2a 20 54 68 65 20  Idx;     /* The 
1bf80 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c  OP_OpenEphemeral
1bf90 20 66 6f 72 20 74 68 65 20 73 6f 72 74 69 6e 67   for the sorting
1bfa0 20 69 6e 64 65 78 20 2a 2f 0a 20 20 20 20 69 6e   index */.    in
1bfb0 74 20 61 64 64 72 52 65 73 65 74 3b 20 20 20 20  t addrReset;    
1bfc0 20 20 20 20 20 20 2f 2a 20 53 75 62 72 6f 75 74        /* Subrout
1bfd0 69 6e 65 20 66 6f 72 20 72 65 73 65 74 74 69 6e  ine for resettin
1bfe0 67 20 74 68 65 20 61 63 63 75 6d 75 6c 61 74 6f  g the accumulato
1bff0 72 20 2a 2f 0a 0a 20 20 20 20 61 64 64 72 45 6e  r */..    addrEn
1c000 64 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d  d = sqlite3VdbeM
1c010 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 0a 20 20  akeLabel(v);..  
1c020 20 20 2f 2a 20 43 6f 6e 76 65 72 74 20 54 4b 5f    /* Convert TK_
1c030 43 4f 4c 55 4d 4e 20 6e 6f 64 65 73 20 69 6e 74  COLUMN nodes int
1c040 6f 20 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 20  o TK_AGG_COLUMN 
1c050 61 6e 64 20 6d 61 6b 65 20 65 6e 74 72 69 65 73  and make entries
1c060 20 69 6e 0a 20 20 20 20 2a 2a 20 73 41 67 67 49   in.    ** sAggI
1c070 6e 66 6f 20 66 6f 72 20 61 6c 6c 20 54 4b 5f 41  nfo for all TK_A
1c080 47 47 5f 46 55 4e 43 54 49 4f 4e 20 6e 6f 64 65  GG_FUNCTION node
1c090 73 20 69 6e 20 65 78 70 72 65 73 73 69 6f 6e 73  s in expressions
1c0a0 20 6f 66 20 74 68 65 0a 20 20 20 20 2a 2a 20 53   of the.    ** S
1c0b0 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 2e  ELECT statement.
1c0c0 0a 20 20 20 20 2a 2f 0a 20 20 20 20 6d 65 6d 73  .    */.    mems
1c0d0 65 74 28 26 73 4e 43 2c 20 30 2c 20 73 69 7a 65  et(&sNC, 0, size
1c0e0 6f 66 28 73 4e 43 29 29 3b 0a 20 20 20 20 73 4e  of(sNC));.    sN
1c0f0 43 2e 70 50 61 72 73 65 20 3d 20 70 50 61 72 73  C.pParse = pPars
1c100 65 3b 0a 20 20 20 20 73 4e 43 2e 70 53 72 63 4c  e;.    sNC.pSrcL
1c110 69 73 74 20 3d 20 70 54 61 62 4c 69 73 74 3b 0a  ist = pTabList;.
1c120 20 20 20 20 73 4e 43 2e 70 41 67 67 49 6e 66 6f      sNC.pAggInfo
1c130 20 3d 20 26 73 41 67 67 49 6e 66 6f 3b 0a 20 20   = &sAggInfo;.  
1c140 20 20 73 41 67 67 49 6e 66 6f 2e 6e 53 6f 72 74    sAggInfo.nSort
1c150 69 6e 67 43 6f 6c 75 6d 6e 20 3d 20 70 47 72 6f  ingColumn = pGro
1c160 75 70 42 79 20 3f 20 70 47 72 6f 75 70 42 79 2d  upBy ? pGroupBy-
1c170 3e 6e 45 78 70 72 2b 31 20 3a 20 30 3b 0a 20 20  >nExpr+1 : 0;.  
1c180 20 20 73 41 67 67 49 6e 66 6f 2e 70 47 72 6f 75    sAggInfo.pGrou
1c190 70 42 79 20 3d 20 70 47 72 6f 75 70 42 79 3b 0a  pBy = pGroupBy;.
1c1a0 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 45      if( sqlite3E
1c1b0 78 70 72 41 6e 61 6c 79 7a 65 41 67 67 4c 69 73  xprAnalyzeAggLis
1c1c0 74 28 26 73 4e 43 2c 20 70 45 4c 69 73 74 29 20  t(&sNC, pEList) 
1c1d0 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 73 65  ){.      goto se
1c1e0 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 7d 0a  lect_end;.    }.
1c1f0 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 45      if( sqlite3E
1c200 78 70 72 41 6e 61 6c 79 7a 65 41 67 67 4c 69 73  xprAnalyzeAggLis
1c210 74 28 26 73 4e 43 2c 20 70 4f 72 64 65 72 42 79  t(&sNC, pOrderBy
1c220 29 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20  ) ){.      goto 
1c230 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20  select_end;.    
1c240 7d 0a 20 20 20 20 69 66 28 20 70 48 61 76 69 6e  }.    if( pHavin
1c250 67 20 26 26 20 73 71 6c 69 74 65 33 45 78 70 72  g && sqlite3Expr
1c260 41 6e 61 6c 79 7a 65 41 67 67 72 65 67 61 74 65  AnalyzeAggregate
1c270 73 28 26 73 4e 43 2c 20 70 48 61 76 69 6e 67 29  s(&sNC, pHaving)
1c280 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 73   ){.      goto s
1c290 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 7d  elect_end;.    }
1c2a0 0a 20 20 20 20 73 41 67 67 49 6e 66 6f 2e 6e 41  .    sAggInfo.nA
1c2b0 63 63 75 6d 75 6c 61 74 6f 72 20 3d 20 73 41 67  ccumulator = sAg
1c2c0 67 49 6e 66 6f 2e 6e 43 6f 6c 75 6d 6e 3b 0a 20  gInfo.nColumn;. 
1c2d0 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 73 41     for(i=0; i<sA
1c2e0 67 67 49 6e 66 6f 2e 6e 46 75 6e 63 3b 20 69 2b  ggInfo.nFunc; i+
1c2f0 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 73 71  +){.      if( sq
1c300 6c 69 74 65 33 45 78 70 72 41 6e 61 6c 79 7a 65  lite3ExprAnalyze
1c310 41 67 67 4c 69 73 74 28 26 73 4e 43 2c 20 73 41  AggList(&sNC, sA
1c320 67 67 49 6e 66 6f 2e 61 46 75 6e 63 5b 69 5d 2e  ggInfo.aFunc[i].
1c330 70 45 78 70 72 2d 3e 70 4c 69 73 74 29 20 29 7b  pExpr->pList) ){
1c340 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 73 65  .        goto se
1c350 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 20 20  lect_end;.      
1c360 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  }.    }.    if( 
1c370 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
1c380 20 29 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65   ) goto select_e
1c390 6e 64 3b 0a 0a 20 20 20 20 2f 2a 20 50 72 6f 63  nd;..    /* Proc
1c3a0 65 73 73 69 6e 67 20 66 6f 72 20 61 67 67 72 65  essing for aggre
1c3b0 67 61 74 65 73 20 77 69 74 68 20 47 52 4f 55 50  gates with GROUP
1c3c0 20 42 59 20 69 73 20 76 65 72 79 20 64 69 66 66   BY is very diff
1c3d0 65 72 65 6e 74 20 61 6e 64 0a 20 20 20 20 2a 2a  erent and.    **
1c3e0 20 6d 75 63 68 20 6d 6f 72 65 20 63 6f 6d 70 6c   much more compl
1c3f0 65 78 20 74 68 61 6e 20 61 67 67 72 65 67 61 74  ex than aggregat
1c400 65 73 20 77 69 74 68 6f 75 74 20 61 20 47 52 4f  es without a GRO
1c410 55 50 20 42 59 2e 0a 20 20 20 20 2a 2f 0a 20 20  UP BY..    */.  
1c420 20 20 69 66 28 20 70 47 72 6f 75 70 42 79 20 29    if( pGroupBy )
1c430 7b 0a 20 20 20 20 20 20 4b 65 79 49 6e 66 6f 20  {.      KeyInfo 
1c440 2a 70 4b 65 79 49 6e 66 6f 3b 20 20 2f 2a 20 4b  *pKeyInfo;  /* K
1c450 65 79 69 6e 67 20 69 6e 66 6f 72 6d 61 74 69 6f  eying informatio
1c460 6e 20 66 6f 72 20 74 68 65 20 67 72 6f 75 70 20  n for the group 
1c470 62 79 20 63 6c 61 75 73 65 20 2a 2f 0a 0a 20 20  by clause */..  
1c480 20 20 20 20 2f 2a 20 43 72 65 61 74 65 20 6c 61      /* Create la
1c490 62 65 6c 73 20 74 68 61 74 20 77 65 20 77 69 6c  bels that we wil
1c4a0 6c 20 62 65 20 6e 65 65 64 69 6e 67 0a 20 20 20  l be needing.   
1c4b0 20 20 20 2a 2f 0a 20 20 20 20 20 0a 20 20 20 20     */.     .    
1c4c0 20 20 61 64 64 72 49 6e 69 74 69 61 6c 69 7a 65    addrInitialize
1c4d0 4c 6f 6f 70 20 3d 20 73 71 6c 69 74 65 33 56 64  Loop = sqlite3Vd
1c4e0 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a  beMakeLabel(v);.
1c4f0 20 20 20 20 20 20 61 64 64 72 47 72 6f 75 70 42        addrGroupB
1c500 79 43 68 61 6e 67 65 20 3d 20 73 71 6c 69 74 65  yChange = sqlite
1c510 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76  3VdbeMakeLabel(v
1c520 29 3b 0a 20 20 20 20 20 20 61 64 64 72 50 72 6f  );.      addrPro
1c530 63 65 73 73 52 6f 77 20 3d 20 73 71 6c 69 74 65  cessRow = sqlite
1c540 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76  3VdbeMakeLabel(v
1c550 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 49 66 20  );..      /* If 
1c560 74 68 65 72 65 20 69 73 20 61 20 47 52 4f 55 50  there is a GROUP
1c570 20 42 59 20 63 6c 61 75 73 65 20 77 65 20 6d 69   BY clause we mi
1c580 67 68 74 20 6e 65 65 64 20 61 20 73 6f 72 74 69  ght need a sorti
1c590 6e 67 20 69 6e 64 65 78 20 74 6f 0a 20 20 20 20  ng index to.    
1c5a0 20 20 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74 20 69    ** implement i
1c5b0 74 2e 20 20 41 6c 6c 6f 63 61 74 65 20 74 68 61  t.  Allocate tha
1c5c0 74 20 73 6f 72 74 69 6e 67 20 69 6e 64 65 78 20  t sorting index 
1c5d0 6e 6f 77 2e 20 20 49 66 20 69 74 20 74 75 72 6e  now.  If it turn
1c5e0 73 20 6f 75 74 0a 20 20 20 20 20 20 2a 2a 20 74  s out.      ** t
1c5f0 68 61 74 20 77 65 20 64 6f 20 6e 6f 74 20 6e 65  hat we do not ne
1c600 65 64 20 69 74 20 61 66 74 65 72 20 61 6c 6c 2c  ed it after all,
1c610 20 74 68 65 20 4f 70 65 6e 45 70 68 65 6d 65 72   the OpenEphemer
1c620 61 6c 20 69 6e 73 74 72 75 63 74 69 6f 6e 0a 20  al instruction. 
1c630 20 20 20 20 20 2a 2a 20 77 69 6c 6c 20 62 65 20       ** will be 
1c640 63 6f 6e 76 65 72 74 65 64 20 69 6e 74 6f 20 61  converted into a
1c650 20 4e 6f 6f 70 2e 20 20 0a 20 20 20 20 20 20 2a   Noop.  .      *
1c660 2f 0a 20 20 20 20 20 20 73 41 67 67 49 6e 66 6f  /.      sAggInfo
1c670 2e 73 6f 72 74 69 6e 67 49 64 78 20 3d 20 70 50  .sortingIdx = pP
1c680 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20  arse->nTab++;.  
1c690 20 20 20 20 70 4b 65 79 49 6e 66 6f 20 3d 20 6b      pKeyInfo = k
1c6a0 65 79 49 6e 66 6f 46 72 6f 6d 45 78 70 72 4c 69  eyInfoFromExprLi
1c6b0 73 74 28 70 50 61 72 73 65 2c 20 70 47 72 6f 75  st(pParse, pGrou
1c6c0 70 42 79 29 3b 0a 20 20 20 20 20 20 61 64 64 72  pBy);.      addr
1c6d0 53 6f 72 74 69 6e 67 49 64 78 20 3d 0a 20 20 20  SortingIdx =.   
1c6e0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
1c6f0 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 4f  beAddOp4(v, OP_O
1c700 70 65 6e 45 70 68 65 6d 65 72 61 6c 2c 20 73 41  penEphemeral, sA
1c710 67 67 49 6e 66 6f 2e 73 6f 72 74 69 6e 67 49 64  ggInfo.sortingId
1c720 78 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  x,.             
1c730 20 20 20 20 20 20 20 20 20 20 20 20 73 41 67 67              sAgg
1c740 49 6e 66 6f 2e 6e 53 6f 72 74 69 6e 67 43 6f 6c  Info.nSortingCol
1c750 75 6d 6e 2c 20 30 2c 0a 20 20 20 20 20 20 20 20  umn, 0,.        
1c760 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c770 20 28 63 68 61 72 2a 29 70 4b 65 79 49 6e 66 6f   (char*)pKeyInfo
1c780 2c 20 50 34 5f 4b 45 59 49 4e 46 4f 5f 48 41 4e  , P4_KEYINFO_HAN
1c790 44 4f 46 46 29 3b 0a 0a 20 20 20 20 20 20 2f 2a  DOFF);..      /*
1c7a0 20 49 6e 69 74 69 61 6c 69 7a 65 20 6d 65 6d 6f   Initialize memo
1c7b0 72 79 20 6c 6f 63 61 74 69 6f 6e 73 20 75 73 65  ry locations use
1c7c0 64 20 62 79 20 47 52 4f 55 50 20 42 59 20 61 67  d by GROUP BY ag
1c7d0 67 72 65 67 61 74 65 20 70 72 6f 63 65 73 73 69  gregate processi
1c7e0 6e 67 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  ng.      */.    
1c7f0 20 20 69 55 73 65 46 6c 61 67 20 3d 20 2b 2b 70    iUseFlag = ++p
1c800 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20  Parse->nMem;.   
1c810 20 20 20 69 41 62 6f 72 74 46 6c 61 67 20 3d 20     iAbortFlag = 
1c820 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a  ++pParse->nMem;.
1c830 20 20 20 20 20 20 69 41 4d 65 6d 20 3d 20 70 50        iAMem = pP
1c840 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 20 31 3b 0a  arse->nMem + 1;.
1c850 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 4d        pParse->nM
1c860 65 6d 20 2b 3d 20 70 47 72 6f 75 70 42 79 2d 3e  em += pGroupBy->
1c870 6e 45 78 70 72 3b 0a 20 20 20 20 20 20 69 42 4d  nExpr;.      iBM
1c880 65 6d 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 65  em = pParse->nMe
1c890 6d 20 2b 20 31 3b 0a 20 20 20 20 20 20 70 50 61  m + 1;.      pPa
1c8a0 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 70 47 72  rse->nMem += pGr
1c8b0 6f 75 70 42 79 2d 3e 6e 45 78 70 72 3b 0a 20 20  oupBy->nExpr;.  
1c8c0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
1c8d0 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65  ddOp2(v, OP_Inte
1c8e0 67 65 72 2c 20 30 2c 20 69 41 62 6f 72 74 46 6c  ger, 0, iAbortFl
1c8f0 61 67 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43  ag);.      VdbeC
1c900 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 63 6c 65 61  omment((v, "clea
1c910 72 20 61 62 6f 72 74 20 66 6c 61 67 22 29 29 3b  r abort flag"));
1c920 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
1c930 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49  beAddOp2(v, OP_I
1c940 6e 74 65 67 65 72 2c 20 30 2c 20 69 55 73 65 46  nteger, 0, iUseF
1c950 6c 61 67 29 3b 0a 20 20 20 20 20 20 56 64 62 65  lag);.      Vdbe
1c960 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 69 6e 64  Comment((v, "ind
1c970 69 63 61 74 65 20 61 63 63 75 6d 75 6c 61 74 6f  icate accumulato
1c980 72 20 65 6d 70 74 79 22 29 29 3b 0a 20 20 20 20  r empty"));.    
1c990 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
1c9a0 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20  Op2(v, OP_Goto, 
1c9b0 30 2c 20 61 64 64 72 49 6e 69 74 69 61 6c 69 7a  0, addrInitializ
1c9c0 65 4c 6f 6f 70 29 3b 0a 0a 20 20 20 20 20 20 2f  eLoop);..      /
1c9d0 2a 20 47 65 6e 65 72 61 74 65 20 61 20 73 75 62  * Generate a sub
1c9e0 72 6f 75 74 69 6e 65 20 74 68 61 74 20 6f 75 74  routine that out
1c9f0 70 75 74 73 20 61 20 73 69 6e 67 6c 65 20 72 6f  puts a single ro
1ca00 77 20 6f 66 20 74 68 65 20 72 65 73 75 6c 74 0a  w of the result.
1ca10 20 20 20 20 20 20 2a 2a 20 73 65 74 2e 20 20 54        ** set.  T
1ca20 68 69 73 20 73 75 62 72 6f 75 74 69 6e 65 20 66  his subroutine f
1ca30 69 72 73 74 20 6c 6f 6f 6b 73 20 61 74 20 74 68  irst looks at th
1ca40 65 20 69 55 73 65 46 6c 61 67 2e 20 20 49 66 20  e iUseFlag.  If 
1ca50 69 55 73 65 46 6c 61 67 0a 20 20 20 20 20 20 2a  iUseFlag.      *
1ca60 2a 20 69 73 20 6c 65 73 73 20 74 68 61 6e 20 6f  * is less than o
1ca70 72 20 65 71 75 61 6c 20 74 6f 20 7a 65 72 6f 2c  r equal to zero,
1ca80 20 74 68 65 20 73 75 62 72 6f 75 74 69 6e 65 20   the subroutine 
1ca90 69 73 20 61 20 6e 6f 2d 6f 70 2e 20 20 49 66 0a  is a no-op.  If.
1caa0 20 20 20 20 20 20 2a 2a 20 74 68 65 20 70 72 6f        ** the pro
1cab0 63 65 73 73 69 6e 67 20 63 61 6c 6c 73 20 66 6f  cessing calls fo
1cac0 72 20 74 68 65 20 71 75 65 72 79 20 74 6f 20 61  r the query to a
1cad0 62 6f 72 74 2c 20 74 68 69 73 20 73 75 62 72 6f  bort, this subro
1cae0 75 74 69 6e 65 0a 20 20 20 20 20 20 2a 2a 20 69  utine.      ** i
1caf0 6e 63 72 65 6d 65 6e 74 73 20 74 68 65 20 69 41  ncrements the iA
1cb00 62 6f 72 74 46 6c 61 67 20 6d 65 6d 6f 72 79 20  bortFlag memory 
1cb10 6c 6f 63 61 74 69 6f 6e 20 62 65 66 6f 72 65 20  location before 
1cb20 72 65 74 75 72 6e 69 6e 67 20 69 6e 0a 20 20 20  returning in.   
1cb30 20 20 20 2a 2a 20 6f 72 64 65 72 20 74 6f 20 73     ** order to s
1cb40 69 67 6e 61 6c 20 74 68 65 20 63 61 6c 6c 65 72  ignal the caller
1cb50 20 74 6f 20 61 62 6f 72 74 2e 0a 20 20 20 20 20   to abort..     
1cb60 20 2a 2f 0a 20 20 20 20 20 20 61 64 64 72 53 65   */.      addrSe
1cb70 74 41 62 6f 72 74 20 3d 20 73 71 6c 69 74 65 33  tAbort = sqlite3
1cb80 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28  VdbeCurrentAddr(
1cb90 76 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  v);.      sqlite
1cba0 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
1cbb0 50 5f 49 6e 74 65 67 65 72 2c 20 31 2c 20 69 41  P_Integer, 1, iA
1cbc0 62 6f 72 74 46 6c 61 67 29 3b 0a 20 20 20 20 20  bortFlag);.     
1cbd0 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c   VdbeComment((v,
1cbe0 20 22 73 65 74 20 61 62 6f 72 74 20 66 6c 61 67   "set abort flag
1cbf0 22 29 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  "));.      sqlit
1cc00 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
1cc10 4f 50 5f 52 65 74 75 72 6e 2c 20 30 2c 20 30 29  OP_Return, 0, 0)
1cc20 3b 0a 20 20 20 20 20 20 61 64 64 72 4f 75 74 70  ;.      addrOutp
1cc30 75 74 52 6f 77 20 3d 20 73 71 6c 69 74 65 33 56  utRow = sqlite3V
1cc40 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76  dbeCurrentAddr(v
1cc50 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
1cc60 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
1cc70 5f 49 66 4d 65 6d 50 6f 73 2c 20 69 55 73 65 46  _IfMemPos, iUseF
1cc80 6c 61 67 2c 20 61 64 64 72 4f 75 74 70 75 74 52  lag, addrOutputR
1cc90 6f 77 2b 32 29 3b 0a 20 20 20 20 20 20 56 64 62  ow+2);.      Vdb
1cca0 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 47 72  eComment((v, "Gr
1ccb0 6f 75 70 62 79 20 72 65 73 75 6c 74 20 67 65 6e  oupby result gen
1ccc0 65 72 61 74 6f 72 20 65 6e 74 72 79 20 70 6f 69  erator entry poi
1ccd0 6e 74 22 29 29 3b 0a 20 20 20 20 20 20 73 71 6c  nt"));.      sql
1cce0 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
1ccf0 2c 20 4f 50 5f 52 65 74 75 72 6e 2c 20 30 2c 20  , OP_Return, 0, 
1cd00 30 29 3b 0a 20 20 20 20 20 20 66 69 6e 61 6c 69  0);.      finali
1cd10 7a 65 41 67 67 46 75 6e 63 74 69 6f 6e 73 28 70  zeAggFunctions(p
1cd20 50 61 72 73 65 2c 20 26 73 41 67 67 49 6e 66 6f  Parse, &sAggInfo
1cd30 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 48 61  );.      if( pHa
1cd40 76 69 6e 67 20 29 7b 0a 20 20 20 20 20 20 20 20  ving ){.        
1cd50 73 71 6c 69 74 65 33 45 78 70 72 49 66 46 61 6c  sqlite3ExprIfFal
1cd60 73 65 28 70 50 61 72 73 65 2c 20 70 48 61 76 69  se(pParse, pHavi
1cd70 6e 67 2c 20 61 64 64 72 4f 75 74 70 75 74 52 6f  ng, addrOutputRo
1cd80 77 2b 31 2c 20 31 29 3b 0a 20 20 20 20 20 20 7d  w+1, 1);.      }
1cd90 0a 20 20 20 20 20 20 72 63 20 3d 20 73 65 6c 65  .      rc = sele
1cda0 63 74 49 6e 6e 65 72 4c 6f 6f 70 28 70 50 61 72  ctInnerLoop(pPar
1cdb0 73 65 2c 20 70 2c 20 70 2d 3e 70 45 4c 69 73 74  se, p, p->pEList
1cdc0 2c 20 30 2c 20 30 2c 20 70 4f 72 64 65 72 42 79  , 0, 0, pOrderBy
1cdd0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
1cde0 20 20 20 20 20 20 20 20 20 20 20 20 20 64 69 73               dis
1cdf0 74 69 6e 63 74 2c 20 70 44 65 73 74 2c 0a 20 20  tinct, pDest,.  
1ce00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ce10 20 20 20 20 20 20 20 20 20 61 64 64 72 4f 75 74           addrOut
1ce20 70 75 74 52 6f 77 2b 31 2c 20 61 64 64 72 53 65  putRow+1, addrSe
1ce30 74 41 62 6f 72 74 2c 20 61 66 66 29 3b 0a 20 20  tAbort, aff);.  
1ce40 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20      if( rc ){.  
1ce50 20 20 20 20 20 20 67 6f 74 6f 20 73 65 6c 65 63        goto selec
1ce60 74 5f 65 6e 64 3b 0a 20 20 20 20 20 20 7d 0a 20  t_end;.      }. 
1ce70 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
1ce80 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52 65 74  AddOp2(v, OP_Ret
1ce90 75 72 6e 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  urn, 0, 0);.    
1cea0 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76    VdbeComment((v
1ceb0 2c 20 22 65 6e 64 20 67 72 6f 75 70 62 79 20 72  , "end groupby r
1cec0 65 73 75 6c 74 20 67 65 6e 65 72 61 74 6f 72 22  esult generator"
1ced0 29 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 47 65  ));..      /* Ge
1cee0 6e 65 72 61 74 65 20 61 20 73 75 62 72 6f 75 74  nerate a subrout
1cef0 69 6e 65 20 74 68 61 74 20 77 69 6c 6c 20 72 65  ine that will re
1cf00 73 65 74 20 74 68 65 20 67 72 6f 75 70 2d 62 79  set the group-by
1cf10 20 61 63 63 75 6d 75 6c 61 74 6f 72 0a 20 20 20   accumulator.   
1cf20 20 20 20 2a 2f 0a 20 20 20 20 20 20 61 64 64 72     */.      addr
1cf30 52 65 73 65 74 20 3d 20 73 71 6c 69 74 65 33 56  Reset = sqlite3V
1cf40 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76  dbeCurrentAddr(v
1cf50 29 3b 0a 20 20 20 20 20 20 72 65 73 65 74 41 63  );.      resetAc
1cf60 63 75 6d 75 6c 61 74 6f 72 28 70 50 61 72 73 65  cumulator(pParse
1cf70 2c 20 26 73 41 67 67 49 6e 66 6f 29 3b 0a 20 20  , &sAggInfo);.  
1cf80 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
1cf90 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52 65 74 75  ddOp2(v, OP_Retu
1cfa0 72 6e 2c 20 30 2c 20 30 29 3b 0a 0a 20 20 20 20  rn, 0, 0);..    
1cfb0 20 20 2f 2a 20 42 65 67 69 6e 20 61 20 6c 6f 6f    /* Begin a loo
1cfc0 70 20 74 68 61 74 20 77 69 6c 6c 20 65 78 74 72  p that will extr
1cfd0 61 63 74 20 61 6c 6c 20 73 6f 75 72 63 65 20 72  act all source r
1cfe0 6f 77 73 20 69 6e 20 47 52 4f 55 50 20 42 59 20  ows in GROUP BY 
1cff0 6f 72 64 65 72 2e 0a 20 20 20 20 20 20 2a 2a 20  order..      ** 
1d000 54 68 69 73 20 6d 69 67 68 74 20 69 6e 76 6f 6c  This might invol
1d010 76 65 20 74 77 6f 20 73 65 70 61 72 61 74 65 20  ve two separate 
1d020 6c 6f 6f 70 73 20 77 69 74 68 20 61 6e 20 4f 50  loops with an OP
1d030 5f 53 6f 72 74 20 69 6e 20 62 65 74 77 65 65 6e  _Sort in between
1d040 2c 20 6f 72 0a 20 20 20 20 20 20 2a 2a 20 69 74  , or.      ** it
1d050 20 6d 69 67 68 74 20 62 65 20 61 20 73 69 6e 67   might be a sing
1d060 6c 65 20 6c 6f 6f 70 20 74 68 61 74 20 75 73 65  le loop that use
1d070 73 20 61 6e 20 69 6e 64 65 78 20 74 6f 20 65 78  s an index to ex
1d080 74 72 61 63 74 20 69 6e 66 6f 72 6d 61 74 69 6f  tract informatio
1d090 6e 0a 20 20 20 20 20 20 2a 2a 20 69 6e 20 74 68  n.      ** in th
1d0a0 65 20 72 69 67 68 74 20 6f 72 64 65 72 20 74 6f  e right order to
1d0b0 20 62 65 67 69 6e 20 77 69 74 68 2e 0a 20 20 20   begin with..   
1d0c0 20 20 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69     */.      sqli
1d0d0 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61  te3VdbeResolveLa
1d0e0 62 65 6c 28 76 2c 20 61 64 64 72 49 6e 69 74 69  bel(v, addrIniti
1d0f0 61 6c 69 7a 65 4c 6f 6f 70 29 3b 0a 20 20 20 20  alizeLoop);.    
1d100 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
1d110 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 73 75 62 2c  Op2(v, OP_Gosub,
1d120 20 30 2c 20 61 64 64 72 52 65 73 65 74 29 3b 0a   0, addrReset);.
1d130 20 20 20 20 20 20 70 57 49 6e 66 6f 20 3d 20 73        pWInfo = s
1d140 71 6c 69 74 65 33 57 68 65 72 65 42 65 67 69 6e  qlite3WhereBegin
1d150 28 70 50 61 72 73 65 2c 20 70 54 61 62 4c 69 73  (pParse, pTabLis
1d160 74 2c 20 70 57 68 65 72 65 2c 20 26 70 47 72 6f  t, pWhere, &pGro
1d170 75 70 42 79 29 3b 0a 20 20 20 20 20 20 69 66 28  upBy);.      if(
1d180 20 70 57 49 6e 66 6f 3d 3d 30 20 29 20 67 6f 74   pWInfo==0 ) got
1d190 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20  o select_end;.  
1d1a0 20 20 20 20 69 66 28 20 70 47 72 6f 75 70 42 79      if( pGroupBy
1d1b0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 2f  ==0 ){.        /
1d1c0 2a 20 54 68 65 20 6f 70 74 69 6d 69 7a 65 72 20  * The optimizer 
1d1d0 69 73 20 61 62 6c 65 20 74 6f 20 64 65 6c 69 76  is able to deliv
1d1e0 65 72 20 72 6f 77 73 20 69 6e 20 67 72 6f 75 70  er rows in group
1d1f0 20 62 79 20 6f 72 64 65 72 20 73 6f 0a 20 20 20   by order so.   
1d200 20 20 20 20 20 2a 2a 20 77 65 20 64 6f 20 6e 6f       ** we do no
1d210 74 20 68 61 76 65 20 74 6f 20 73 6f 72 74 2e 20  t have to sort. 
1d220 20 54 68 65 20 4f 50 5f 4f 70 65 6e 45 70 68 65   The OP_OpenEphe
1d230 6d 65 72 61 6c 20 74 61 62 6c 65 20 77 69 6c 6c  meral table will
1d240 20 62 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 63   be.        ** c
1d250 61 6e 63 65 6c 6c 65 64 20 6c 61 74 65 72 20 62  ancelled later b
1d260 65 63 61 75 73 65 20 77 65 20 73 74 69 6c 6c 20  ecause we still 
1d270 6e 65 65 64 20 74 6f 20 75 73 65 20 74 68 65 20  need to use the 
1d280 70 4b 65 79 49 6e 66 6f 0a 20 20 20 20 20 20 20  pKeyInfo.       
1d290 20 2a 2f 0a 20 20 20 20 20 20 20 20 70 47 72 6f   */.        pGro
1d2a0 75 70 42 79 20 3d 20 70 2d 3e 70 47 72 6f 75 70  upBy = p->pGroup
1d2b0 42 79 3b 0a 20 20 20 20 20 20 20 20 67 72 6f 75  By;.        grou
1d2c0 70 42 79 53 6f 72 74 20 3d 20 30 3b 0a 20 20 20  pBySort = 0;.   
1d2d0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1d2e0 20 20 2f 2a 20 52 6f 77 73 20 61 72 65 20 63 6f    /* Rows are co
1d2f0 6d 69 6e 67 20 6f 75 74 20 69 6e 20 75 6e 64 65  ming out in unde
1d300 74 65 72 6d 69 6e 65 64 20 6f 72 64 65 72 2e 20  termined order. 
1d310 20 57 65 20 68 61 76 65 20 74 6f 20 70 75 73 68   We have to push
1d320 0a 20 20 20 20 20 20 20 20 2a 2a 20 65 61 63 68  .        ** each
1d330 20 72 6f 77 20 69 6e 74 6f 20 61 20 73 6f 72 74   row into a sort
1d340 69 6e 67 20 69 6e 64 65 78 2c 20 74 65 72 6d 69  ing index, termi
1d350 6e 61 74 65 20 74 68 65 20 66 69 72 73 74 20 6c  nate the first l
1d360 6f 6f 70 2c 0a 20 20 20 20 20 20 20 20 2a 2a 20  oop,.        ** 
1d370 74 68 65 6e 20 6c 6f 6f 70 20 6f 76 65 72 20 74  then loop over t
1d380 68 65 20 73 6f 72 74 69 6e 67 20 69 6e 64 65 78  he sorting index
1d390 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 67 65 74   in order to get
1d3a0 20 74 68 65 20 6f 75 74 70 75 74 0a 20 20 20 20   the output.    
1d3b0 20 20 20 20 2a 2a 20 69 6e 20 73 6f 72 74 65 64      ** in sorted
1d3c0 20 6f 72 64 65 72 0a 20 20 20 20 20 20 20 20 2a   order.        *
1d3d0 2f 0a 20 20 20 20 20 20 20 20 67 72 6f 75 70 42  /.        groupB
1d3e0 79 53 6f 72 74 20 3d 20 31 3b 0a 20 20 20 20 20  ySort = 1;.     
1d3f0 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f     sqlite3ExprCo
1d400 64 65 45 78 70 72 4c 69 73 74 28 70 50 61 72 73  deExprList(pPars
1d410 65 2c 20 70 47 72 6f 75 70 42 79 2c 20 30 29 3b  e, pGroupBy, 0);
1d420 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
1d430 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
1d440 5f 53 65 71 75 65 6e 63 65 2c 20 73 41 67 67 49  _Sequence, sAggI
1d450 6e 66 6f 2e 73 6f 72 74 69 6e 67 49 64 78 2c 20  nfo.sortingIdx, 
1d460 30 29 3b 0a 20 20 20 20 20 20 20 20 6a 20 3d 20  0);.        j = 
1d470 70 47 72 6f 75 70 42 79 2d 3e 6e 45 78 70 72 2b  pGroupBy->nExpr+
1d480 31 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69  1;.        for(i
1d490 3d 30 3b 20 69 3c 73 41 67 67 49 6e 66 6f 2e 6e  =0; i<sAggInfo.n
1d4a0 43 6f 6c 75 6d 6e 3b 20 69 2b 2b 29 7b 0a 20 20  Column; i++){.  
1d4b0 20 20 20 20 20 20 20 20 73 74 72 75 63 74 20 41          struct A
1d4c0 67 67 49 6e 66 6f 5f 63 6f 6c 20 2a 70 43 6f 6c  ggInfo_col *pCol
1d4d0 20 3d 20 26 73 41 67 67 49 6e 66 6f 2e 61 43 6f   = &sAggInfo.aCo
1d4e0 6c 5b 69 5d 3b 0a 20 20 20 20 20 20 20 20 20 20  l[i];.          
1d4f0 69 66 28 20 70 43 6f 6c 2d 3e 69 53 6f 72 74 65  if( pCol->iSorte
1d500 72 43 6f 6c 75 6d 6e 3c 6a 20 29 20 63 6f 6e 74  rColumn<j ) cont
1d510 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 20 20  inue;.          
1d520 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 47  sqlite3ExprCodeG
1d530 65 74 43 6f 6c 75 6d 6e 28 76 2c 20 70 43 6f 6c  etColumn(v, pCol
1d540 2d 3e 70 54 61 62 2c 20 70 43 6f 6c 2d 3e 69 43  ->pTab, pCol->iC
1d550 6f 6c 75 6d 6e 2c 70 43 6f 6c 2d 3e 69 54 61 62  olumn,pCol->iTab
1d560 6c 65 2c 30 29 3b 0a 20 20 20 20 20 20 20 20 20  le,0);.         
1d570 20 6a 2b 2b 3b 0a 20 20 20 20 20 20 20 20 7d 0a   j++;.        }.
1d580 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
1d590 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
1d5a0 4d 61 6b 65 52 65 63 6f 72 64 2c 20 6a 2c 20 30  MakeRecord, j, 0
1d5b0 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
1d5c0 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
1d5d0 4f 50 5f 49 64 78 49 6e 73 65 72 74 2c 20 73 41  OP_IdxInsert, sA
1d5e0 67 67 49 6e 66 6f 2e 73 6f 72 74 69 6e 67 49 64  ggInfo.sortingId
1d5f0 78 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 73  x, 0);.        s
1d600 71 6c 69 74 65 33 57 68 65 72 65 45 6e 64 28 70  qlite3WhereEnd(p
1d610 57 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20 20 20  WInfo);.        
1d620 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
1d630 32 28 76 2c 20 4f 50 5f 53 6f 72 74 2c 20 73 41  2(v, OP_Sort, sA
1d640 67 67 49 6e 66 6f 2e 73 6f 72 74 69 6e 67 49 64  ggInfo.sortingId
1d650 78 2c 20 61 64 64 72 45 6e 64 29 3b 0a 20 20 20  x, addrEnd);.   
1d660 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74       VdbeComment
1d670 28 28 76 2c 20 22 47 52 4f 55 50 20 42 59 20 73  ((v, "GROUP BY s
1d680 6f 72 74 22 29 29 3b 0a 20 20 20 20 20 20 20 20  ort"));.        
1d690 73 41 67 67 49 6e 66 6f 2e 75 73 65 53 6f 72 74  sAggInfo.useSort
1d6a0 69 6e 67 49 64 78 20 3d 20 31 3b 0a 20 20 20 20  ingIdx = 1;.    
1d6b0 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 45 76    }..      /* Ev
1d6c0 61 6c 75 61 74 65 20 74 68 65 20 63 75 72 72 65  aluate the curre
1d6d0 6e 74 20 47 52 4f 55 50 20 42 59 20 74 65 72 6d  nt GROUP BY term
1d6e0 73 20 61 6e 64 20 73 74 6f 72 65 20 69 6e 20 62  s and store in b
1d6f0 30 2c 20 62 31 2c 20 62 32 2e 2e 2e 0a 20 20 20  0, b1, b2....   
1d700 20 20 20 2a 2a 20 28 62 30 20 69 73 20 6d 65 6d     ** (b0 is mem
1d710 6f 72 79 20 6c 6f 63 61 74 69 6f 6e 20 69 42 4d  ory location iBM
1d720 65 6d 2b 30 2c 20 62 31 20 69 73 20 69 42 4d 65  em+0, b1 is iBMe
1d730 6d 2b 31 2c 20 61 6e 64 20 73 6f 20 66 6f 72 74  m+1, and so fort
1d740 68 29 0a 20 20 20 20 20 20 2a 2a 20 54 68 65 6e  h).      ** Then
1d750 20 63 6f 6d 70 61 72 65 20 74 68 65 20 63 75 72   compare the cur
1d760 72 65 6e 74 20 47 52 4f 55 50 20 42 59 20 74 65  rent GROUP BY te
1d770 72 6d 73 20 61 67 61 69 6e 73 74 20 74 68 65 20  rms against the 
1d780 47 52 4f 55 50 20 42 59 20 74 65 72 6d 73 0a 20  GROUP BY terms. 
1d790 20 20 20 20 20 2a 2a 20 66 72 6f 6d 20 74 68 65       ** from the
1d7a0 20 70 72 65 76 69 6f 75 73 20 72 6f 77 20 63 75   previous row cu
1d7b0 72 72 65 6e 74 6c 79 20 73 74 6f 72 65 64 20 69  rrently stored i
1d7c0 6e 20 61 30 2c 20 61 31 2c 20 61 32 2e 2e 2e 0a  n a0, a1, a2....
1d7d0 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 61        */.      a
1d7e0 64 64 72 54 6f 70 4f 66 4c 6f 6f 70 20 3d 20 73  ddrTopOfLoop = s
1d7f0 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e  qlite3VdbeCurren
1d800 74 41 64 64 72 28 76 29 3b 0a 20 20 20 20 20 20  tAddr(v);.      
1d810 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 47 72 6f 75  for(j=0; j<pGrou
1d820 70 42 79 2d 3e 6e 45 78 70 72 3b 20 6a 2b 2b 29  pBy->nExpr; j++)
1d830 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 67 72  {.        if( gr
1d840 6f 75 70 42 79 53 6f 72 74 20 29 7b 0a 20 20 20  oupBySort ){.   
1d850 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
1d860 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 43  beAddOp2(v, OP_C
1d870 6f 6c 75 6d 6e 2c 20 73 41 67 67 49 6e 66 6f 2e  olumn, sAggInfo.
1d880 73 6f 72 74 69 6e 67 49 64 78 2c 20 6a 29 3b 0a  sortingIdx, j);.
1d890 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
1d8a0 20 20 20 20 20 20 20 20 20 73 41 67 67 49 6e 66           sAggInf
1d8b0 6f 2e 64 69 72 65 63 74 4d 6f 64 65 20 3d 20 31  o.directMode = 1
1d8c0 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  ;.          sqli
1d8d0 74 65 33 45 78 70 72 43 6f 64 65 28 70 50 61 72  te3ExprCode(pPar
1d8e0 73 65 2c 20 70 47 72 6f 75 70 42 79 2d 3e 61 5b  se, pGroupBy->a[
1d8f0 6a 5d 2e 70 45 78 70 72 2c 20 30 29 3b 0a 20 20  j].pExpr, 0);.  
1d900 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
1d910 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
1d920 32 28 76 2c 20 4f 50 5f 4d 65 6d 53 74 6f 72 65  2(v, OP_MemStore
1d930 2c 20 69 42 4d 65 6d 2b 6a 2c 20 6a 3c 70 47 72  , iBMem+j, j<pGr
1d940 6f 75 70 42 79 2d 3e 6e 45 78 70 72 2d 31 29 3b  oupBy->nExpr-1);
1d950 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 66  .      }.      f
1d960 6f 72 28 6a 3d 70 47 72 6f 75 70 42 79 2d 3e 6e  or(j=pGroupBy->n
1d970 45 78 70 72 2d 31 3b 20 6a 3e 3d 30 3b 20 6a 2d  Expr-1; j>=0; j-
1d980 2d 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20  -){.        if( 
1d990 6a 3c 70 47 72 6f 75 70 42 79 2d 3e 6e 45 78 70  j<pGroupBy->nExp
1d9a0 72 2d 31 20 29 7b 0a 20 20 20 20 20 20 20 20 20  r-1 ){.         
1d9b0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
1d9c0 70 32 28 76 2c 20 4f 50 5f 4d 65 6d 4c 6f 61 64  p2(v, OP_MemLoad
1d9d0 2c 20 69 42 4d 65 6d 2b 6a 2c 20 30 29 3b 0a 20  , iBMem+j, 0);. 
1d9e0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
1d9f0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
1da00 70 32 28 76 2c 20 4f 50 5f 4d 65 6d 4c 6f 61 64  p2(v, OP_MemLoad
1da10 2c 20 69 41 4d 65 6d 2b 6a 2c 20 30 29 3b 0a 20  , iAMem+j, 0);. 
1da20 20 20 20 20 20 20 20 69 66 28 20 6a 3d 3d 30 20         if( j==0 
1da30 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  ){.          sql
1da40 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
1da50 2c 20 4f 50 5f 45 71 2c 20 30 78 32 30 30 2c 20  , OP_Eq, 0x200, 
1da60 61 64 64 72 50 72 6f 63 65 73 73 52 6f 77 29 3b  addrProcessRow);
1da70 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
1da80 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
1da90 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
1daa0 50 5f 4e 65 2c 20 30 78 32 30 30 2c 20 61 64 64  P_Ne, 0x200, add
1dab0 72 47 72 6f 75 70 42 79 43 68 61 6e 67 65 29 3b  rGroupByChange);
1dac0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
1dad0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68     sqlite3VdbeCh
1dae0 61 6e 67 65 50 34 28 76 2c 20 2d 31 2c 20 28 76  angeP4(v, -1, (v
1daf0 6f 69 64 2a 29 70 4b 65 79 49 6e 66 6f 2d 3e 61  oid*)pKeyInfo->a
1db00 43 6f 6c 6c 5b 6a 5d 2c 20 50 34 5f 43 4f 4c 4c  Coll[j], P4_COLL
1db10 53 45 51 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20  SEQ);.      }.. 
1db20 20 20 20 20 20 2f 2a 20 47 65 6e 65 72 61 74 65       /* Generate
1db30 20 63 6f 64 65 20 74 68 61 74 20 72 75 6e 73 20   code that runs 
1db40 77 68 65 6e 65 76 65 72 20 74 68 65 20 47 52 4f  whenever the GRO
1db50 55 50 20 42 59 20 63 68 61 6e 67 65 73 2e 0a 20  UP BY changes.. 
1db60 20 20 20 20 20 2a 2a 20 43 68 61 6e 67 65 20 69       ** Change i
1db70 6e 20 74 68 65 20 47 52 4f 55 50 20 42 59 20 61  n the GROUP BY a
1db80 72 65 20 64 65 74 65 63 74 65 64 20 62 79 20 74  re detected by t
1db90 68 65 20 70 72 65 76 69 6f 75 73 20 63 6f 64 65  he previous code
1dba0 0a 20 20 20 20 20 20 2a 2a 20 62 6c 6f 63 6b 2e  .      ** block.
1dbb0 20 20 49 66 20 74 68 65 72 65 20 77 65 72 65 20    If there were 
1dbc0 6e 6f 20 63 68 61 6e 67 65 73 2c 20 74 68 69 73  no changes, this
1dbd0 20 62 6c 6f 63 6b 20 69 73 20 73 6b 69 70 70 65   block is skippe
1dbe0 64 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20  d..      **.    
1dbf0 20 20 2a 2a 20 54 68 69 73 20 63 6f 64 65 20 63    ** This code c
1dc00 6f 70 69 65 73 20 63 75 72 72 65 6e 74 20 67 72  opies current gr
1dc10 6f 75 70 20 62 79 20 74 65 72 6d 73 20 69 6e 20  oup by terms in 
1dc20 62 30 2c 62 31 2c 62 32 2c 2e 2e 2e 0a 20 20 20  b0,b1,b2,....   
1dc30 20 20 20 2a 2a 20 6f 76 65 72 20 74 6f 20 61 30     ** over to a0
1dc40 2c 61 31 2c 61 32 2e 20 20 49 74 20 74 68 65 6e  ,a1,a2.  It then
1dc50 20 63 61 6c 6c 73 20 74 68 65 20 6f 75 74 70 75   calls the outpu
1dc60 74 20 73 75 62 72 6f 75 74 69 6e 65 0a 20 20 20  t subroutine.   
1dc70 20 20 20 2a 2a 20 61 6e 64 20 72 65 73 65 74 73     ** and resets
1dc80 20 74 68 65 20 61 67 67 72 65 67 61 74 65 20 61   the aggregate a
1dc90 63 63 75 6d 75 6c 61 74 6f 72 20 72 65 67 69 73  ccumulator regis
1dca0 74 65 72 73 20 69 6e 20 70 72 65 70 61 72 61 74  ters in preparat
1dcb0 69 6f 6e 0a 20 20 20 20 20 20 2a 2a 20 66 6f 72  ion.      ** for
1dcc0 20 74 68 65 20 6e 65 78 74 20 47 52 4f 55 50 20   the next GROUP 
1dcd0 42 59 20 62 61 74 63 68 2e 0a 20 20 20 20 20 20  BY batch..      
1dce0 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  */.      sqlite3
1dcf0 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c  VdbeResolveLabel
1dd00 28 76 2c 20 61 64 64 72 47 72 6f 75 70 42 79 43  (v, addrGroupByC
1dd10 68 61 6e 67 65 29 3b 0a 20 20 20 20 20 20 66 6f  hange);.      fo
1dd20 72 28 6a 3d 30 3b 20 6a 3c 70 47 72 6f 75 70 42  r(j=0; j<pGroupB
1dd30 79 2d 3e 6e 45 78 70 72 3b 20 6a 2b 2b 29 7b 0a  y->nExpr; j++){.
1dd40 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
1dd50 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
1dd60 4d 65 6d 4d 6f 76 65 2c 20 69 41 4d 65 6d 2b 6a  MemMove, iAMem+j
1dd70 2c 20 69 42 4d 65 6d 2b 6a 29 3b 0a 20 20 20 20  , iBMem+j);.    
1dd80 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65    }.      sqlite
1dd90 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
1dda0 50 5f 47 6f 73 75 62 2c 20 30 2c 20 61 64 64 72  P_Gosub, 0, addr
1ddb0 4f 75 74 70 75 74 52 6f 77 29 3b 0a 20 20 20 20  OutputRow);.    
1ddc0 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76    VdbeComment((v
1ddd0 2c 20 22 6f 75 74 70 75 74 20 6f 6e 65 20 72 6f  , "output one ro
1dde0 77 22 29 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  w"));.      sqli
1ddf0 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
1de00 20 4f 50 5f 49 66 4d 65 6d 50 6f 73 2c 20 69 41   OP_IfMemPos, iA
1de10 62 6f 72 74 46 6c 61 67 2c 20 61 64 64 72 45 6e  bortFlag, addrEn
1de20 64 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f  d);.      VdbeCo
1de30 6d 6d 65 6e 74 28 28 76 2c 20 22 63 68 65 63 6b  mment((v, "check
1de40 20 61 62 6f 72 74 20 66 6c 61 67 22 29 29 3b 0a   abort flag"));.
1de50 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
1de60 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f  eAddOp2(v, OP_Go
1de70 73 75 62 2c 20 30 2c 20 61 64 64 72 52 65 73 65  sub, 0, addrRese
1de80 74 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f  t);.      VdbeCo
1de90 6d 6d 65 6e 74 28 28 76 2c 20 22 72 65 73 65 74  mment((v, "reset
1dea0 20 61 63 63 75 6d 75 6c 61 74 6f 72 22 29 29 3b   accumulator"));
1deb0 0a 0a 20 20 20 20 20 20 2f 2a 20 55 70 64 61 74  ..      /* Updat
1dec0 65 20 74 68 65 20 61 67 67 72 65 67 61 74 65 20  e the aggregate 
1ded0 61 63 63 75 6d 75 6c 61 74 6f 72 73 20 62 61 73  accumulators bas
1dee0 65 64 20 6f 6e 20 74 68 65 20 63 6f 6e 74 65 6e  ed on the conten
1def0 74 20 6f 66 0a 20 20 20 20 20 20 2a 2a 20 74 68  t of.      ** th
1df00 65 20 63 75 72 72 65 6e 74 20 72 6f 77 0a 20 20  e current row.  
1df10 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c      */.      sql
1df20 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c  ite3VdbeResolveL
1df30 61 62 65 6c 28 76 2c 20 61 64 64 72 50 72 6f 63  abel(v, addrProc
1df40 65 73 73 52 6f 77 29 3b 0a 20 20 20 20 20 20 75  essRow);.      u
1df50 70 64 61 74 65 41 63 63 75 6d 75 6c 61 74 6f 72  pdateAccumulator
1df60 28 70 50 61 72 73 65 2c 20 26 73 41 67 67 49 6e  (pParse, &sAggIn
1df70 66 6f 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  fo);.      sqlit
1df80 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
1df90 4f 50 5f 49 6e 74 65 67 65 72 2c 20 31 2c 20 69  OP_Integer, 1, i
1dfa0 55 73 65 46 6c 61 67 29 3b 0a 20 20 20 20 20 20  UseFlag);.      
1dfb0 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20  VdbeComment((v, 
1dfc0 22 69 6e 64 69 63 61 74 65 20 64 61 74 61 20 69  "indicate data i
1dfd0 6e 20 61 63 63 75 6d 75 6c 61 74 6f 72 22 29 29  n accumulator"))
1dfe0 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 45 6e 64 20  ;..      /* End 
1dff0 6f 66 20 74 68 65 20 6c 6f 6f 70 0a 20 20 20 20  of the loop.    
1e000 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 67    */.      if( g
1e010 72 6f 75 70 42 79 53 6f 72 74 20 29 7b 0a 20 20  roupBySort ){.  
1e020 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
1e030 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 65  eAddOp2(v, OP_Ne
1e040 78 74 2c 20 73 41 67 67 49 6e 66 6f 2e 73 6f 72  xt, sAggInfo.sor
1e050 74 69 6e 67 49 64 78 2c 20 61 64 64 72 54 6f 70  tingIdx, addrTop
1e060 4f 66 4c 6f 6f 70 29 3b 0a 20 20 20 20 20 20 7d  OfLoop);.      }
1e070 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71  else{.        sq
1e080 6c 69 74 65 33 57 68 65 72 65 45 6e 64 28 70 57  lite3WhereEnd(pW
1e090 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20 20 20 73  Info);.        s
1e0a0 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65  qlite3VdbeChange
1e0b0 54 6f 4e 6f 6f 70 28 76 2c 20 61 64 64 72 53 6f  ToNoop(v, addrSo
1e0c0 72 74 69 6e 67 49 64 78 2c 20 31 29 3b 0a 20 20  rtingIdx, 1);.  
1e0d0 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20      }..      /* 
1e0e0 4f 75 74 70 75 74 20 74 68 65 20 66 69 6e 61 6c  Output the final
1e0f0 20 72 6f 77 20 6f 66 20 72 65 73 75 6c 74 0a 20   row of result. 
1e100 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 73 71       */.      sq
1e110 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
1e120 76 2c 20 4f 50 5f 47 6f 73 75 62 2c 20 30 2c 20  v, OP_Gosub, 0, 
1e130 61 64 64 72 4f 75 74 70 75 74 52 6f 77 29 3b 0a  addrOutputRow);.
1e140 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e        VdbeCommen
1e150 74 28 28 76 2c 20 22 6f 75 74 70 75 74 20 66 69  t((v, "output fi
1e160 6e 61 6c 20 72 6f 77 22 29 29 3b 0a 20 20 20 20  nal row"));.    
1e170 20 20 0a 20 20 20 20 7d 20 2f 2a 20 65 6e 64 69    .    } /* endi
1e180 66 20 70 47 72 6f 75 70 42 79 20 2a 2f 0a 20 20  f pGroupBy */.  
1e190 20 20 65 6c 73 65 20 7b 0a 20 20 20 20 20 20 2f    else {.      /
1e1a0 2a 20 54 68 69 73 20 63 61 73 65 20 72 75 6e 73  * This case runs
1e1b0 20 69 66 20 74 68 65 20 61 67 67 72 65 67 61 74   if the aggregat
1e1c0 65 20 68 61 73 20 6e 6f 20 47 52 4f 55 50 20 42  e has no GROUP B
1e1d0 59 20 63 6c 61 75 73 65 2e 20 20 54 68 65 0a 20  Y clause.  The. 
1e1e0 20 20 20 20 20 2a 2a 20 70 72 6f 63 65 73 73 69       ** processi
1e1f0 6e 67 20 69 73 20 6d 75 63 68 20 73 69 6d 70 6c  ng is much simpl
1e200 65 72 20 73 69 6e 63 65 20 74 68 65 72 65 20 69  er since there i
1e210 73 20 6f 6e 6c 79 20 61 20 73 69 6e 67 6c 65 20  s only a single 
1e220 72 6f 77 0a 20 20 20 20 20 20 2a 2a 20 6f 66 20  row.      ** of 
1e230 6f 75 74 70 75 74 2e 0a 20 20 20 20 20 20 2a 2f  output..      */
1e240 0a 20 20 20 20 20 20 72 65 73 65 74 41 63 63 75  .      resetAccu
1e250 6d 75 6c 61 74 6f 72 28 70 50 61 72 73 65 2c 20  mulator(pParse, 
1e260 26 73 41 67 67 49 6e 66 6f 29 3b 0a 20 20 20 20  &sAggInfo);.    
1e270 20 20 70 57 49 6e 66 6f 20 3d 20 73 71 6c 69 74    pWInfo = sqlit
1e280 65 33 57 68 65 72 65 42 65 67 69 6e 28 70 50 61  e3WhereBegin(pPa
1e290 72 73 65 2c 20 70 54 61 62 4c 69 73 74 2c 20 70  rse, pTabList, p
1e2a0 57 68 65 72 65 2c 20 30 29 3b 0a 20 20 20 20 20  Where, 0);.     
1e2b0 20 69 66 28 20 70 57 49 6e 66 6f 3d 3d 30 20 29   if( pWInfo==0 )
1e2c0 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64   goto select_end
1e2d0 3b 0a 20 20 20 20 20 20 75 70 64 61 74 65 41 63  ;.      updateAc
1e2e0 63 75 6d 75 6c 61 74 6f 72 28 70 50 61 72 73 65  cumulator(pParse
1e2f0 2c 20 26 73 41 67 67 49 6e 66 6f 29 3b 0a 20 20  , &sAggInfo);.  
1e300 20 20 20 20 73 71 6c 69 74 65 33 57 68 65 72 65      sqlite3Where
1e310 45 6e 64 28 70 57 49 6e 66 6f 29 3b 0a 20 20 20  End(pWInfo);.   
1e320 20 20 20 66 69 6e 61 6c 69 7a 65 41 67 67 46 75     finalizeAggFu
1e330 6e 63 74 69 6f 6e 73 28 70 50 61 72 73 65 2c 20  nctions(pParse, 
1e340 26 73 41 67 67 49 6e 66 6f 29 3b 0a 20 20 20 20  &sAggInfo);.    
1e350 20 20 70 4f 72 64 65 72 42 79 20 3d 20 30 3b 0a    pOrderBy = 0;.
1e360 20 20 20 20 20 20 69 66 28 20 70 48 61 76 69 6e        if( pHavin
1e370 67 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  g ){.        sql
1e380 69 74 65 33 45 78 70 72 49 66 46 61 6c 73 65 28  ite3ExprIfFalse(
1e390 70 50 61 72 73 65 2c 20 70 48 61 76 69 6e 67 2c  pParse, pHaving,
1e3a0 20 61 64 64 72 45 6e 64 2c 20 31 29 3b 0a 20 20   addrEnd, 1);.  
1e3b0 20 20 20 20 7d 0a 20 20 20 20 20 20 73 65 6c 65      }.      sele
1e3c0 63 74 49 6e 6e 65 72 4c 6f 6f 70 28 70 50 61 72  ctInnerLoop(pPar
1e3d0 73 65 2c 20 70 2c 20 70 2d 3e 70 45 4c 69 73 74  se, p, p->pEList
1e3e0 2c 20 30 2c 20 30 2c 20 30 2c 20 2d 31 2c 20 0a  , 0, 0, 0, -1, .
1e3f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e400 20 20 20 20 20 20 70 44 65 73 74 2c 20 61 64 64        pDest, add
1e410 72 45 6e 64 2c 20 61 64 64 72 45 6e 64 2c 20 61  rEnd, addrEnd, a
1e420 66 66 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73  ff);.    }.    s
1e430 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76  qlite3VdbeResolv
1e440 65 4c 61 62 65 6c 28 76 2c 20 61 64 64 72 45 6e  eLabel(v, addrEn
1e450 64 29 3b 0a 20 20 20 20 0a 20 20 7d 20 2f 2a 20  d);.    .  } /* 
1e460 65 6e 64 69 66 20 61 67 67 72 65 67 61 74 65 20  endif aggregate 
1e470 71 75 65 72 79 20 2a 2f 0a 0a 20 20 2f 2a 20 49  query */..  /* I
1e480 66 20 74 68 65 72 65 20 69 73 20 61 6e 20 4f 52  f there is an OR
1e490 44 45 52 20 42 59 20 63 6c 61 75 73 65 2c 20 74  DER BY clause, t
1e4a0 68 65 6e 20 77 65 20 6e 65 65 64 20 74 6f 20 73  hen we need to s
1e4b0 6f 72 74 20 74 68 65 20 72 65 73 75 6c 74 73 0a  ort the results.
1e4c0 20 20 2a 2a 20 61 6e 64 20 73 65 6e 64 20 74 68    ** and send th
1e4d0 65 6d 20 74 6f 20 74 68 65 20 63 61 6c 6c 62 61  em to the callba
1e4e0 63 6b 20 6f 6e 65 20 62 79 20 6f 6e 65 2e 0a 20  ck one by one.. 
1e4f0 20 2a 2f 0a 20 20 69 66 28 20 70 4f 72 64 65 72   */.  if( pOrder
1e500 42 79 20 29 7b 0a 20 20 20 20 67 65 6e 65 72 61  By ){.    genera
1e510 74 65 53 6f 72 74 54 61 69 6c 28 70 50 61 72 73  teSortTail(pPars
1e520 65 2c 20 70 2c 20 76 2c 20 70 45 4c 69 73 74 2d  e, p, v, pEList-
1e530 3e 6e 45 78 70 72 2c 20 70 44 65 73 74 29 3b 0a  >nExpr, pDest);.
1e540 20 20 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c    }..#ifndef SQL
1e550 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52  ITE_OMIT_SUBQUER
1e560 59 0a 20 20 2f 2a 20 49 66 20 74 68 69 73 20 77  Y.  /* If this w
1e570 61 73 20 61 20 73 75 62 71 75 65 72 79 2c 20 77  as a subquery, w
1e580 65 20 68 61 76 65 20 6e 6f 77 20 63 6f 6e 76 65  e have now conve
1e590 72 74 65 64 20 74 68 65 20 73 75 62 71 75 65 72  rted the subquer
1e5a0 79 20 69 6e 74 6f 20 61 0a 20 20 2a 2a 20 74 65  y into a.  ** te
1e5b0 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 2e 20 20  mporary table.  
1e5c0 53 6f 20 73 65 74 20 74 68 65 20 53 72 63 4c 69  So set the SrcLi
1e5d0 73 74 5f 69 74 65 6d 2e 69 73 50 6f 70 75 6c 61  st_item.isPopula
1e5e0 74 65 64 20 66 6c 61 67 20 74 6f 20 70 72 65 76  ted flag to prev
1e5f0 65 6e 74 0a 20 20 2a 2a 20 74 68 69 73 20 73 75  ent.  ** this su
1e600 62 71 75 65 72 79 20 66 72 6f 6d 20 62 65 69 6e  bquery from bein
1e610 67 20 65 76 61 6c 75 61 74 65 64 20 61 67 61 69  g evaluated agai
1e620 6e 20 61 6e 64 20 74 6f 20 66 6f 72 63 65 20 74  n and to force t
1e630 68 65 20 75 73 65 20 6f 66 0a 20 20 2a 2a 20 74  he use of.  ** t
1e640 68 65 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62  he temporary tab
1e650 6c 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  le..  */.  if( p
1e660 50 61 72 65 6e 74 20 29 7b 0a 20 20 20 20 61 73  Parent ){.    as
1e670 73 65 72 74 28 20 70 50 61 72 65 6e 74 2d 3e 70  sert( pParent->p
1e680 53 72 63 2d 3e 6e 53 72 63 3e 70 61 72 65 6e 74  Src->nSrc>parent
1e690 54 61 62 20 29 3b 0a 20 20 20 20 61 73 73 65 72  Tab );.    asser
1e6a0 74 28 20 70 50 61 72 65 6e 74 2d 3e 70 53 72 63  t( pParent->pSrc
1e6b0 2d 3e 61 5b 70 61 72 65 6e 74 54 61 62 5d 2e 70  ->a[parentTab].p
1e6c0 53 65 6c 65 63 74 3d 3d 70 20 29 3b 0a 20 20 20  Select==p );.   
1e6d0 20 70 50 61 72 65 6e 74 2d 3e 70 53 72 63 2d 3e   pParent->pSrc->
1e6e0 61 5b 70 61 72 65 6e 74 54 61 62 5d 2e 69 73 50  a[parentTab].isP
1e6f0 6f 70 75 6c 61 74 65 64 20 3d 20 31 3b 0a 20 20  opulated = 1;.  
1e700 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 4a  }.#endif..  /* J
1e710 75 6d 70 20 68 65 72 65 20 74 6f 20 73 6b 69 70  ump here to skip
1e720 20 74 68 69 73 20 71 75 65 72 79 0a 20 20 2a 2f   this query.  */
1e730 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65  .  sqlite3VdbeRe
1e740 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 69 45  solveLabel(v, iE
1e750 6e 64 29 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 53  nd);..  /* The S
1e760 45 4c 45 43 54 20 77 61 73 20 73 75 63 63 65 73  ELECT was succes
1e770 73 66 75 6c 6c 79 20 63 6f 64 65 64 2e 20 20 20  sfully coded.   
1e780 53 65 74 20 74 68 65 20 72 65 74 75 72 6e 20 63  Set the return c
1e790 6f 64 65 20 74 6f 20 30 0a 20 20 2a 2a 20 74 6f  ode to 0.  ** to
1e7a0 20 69 6e 64 69 63 61 74 65 20 6e 6f 20 65 72 72   indicate no err
1e7b0 6f 72 73 2e 0a 20 20 2a 2f 0a 20 20 72 63 20 3d  ors..  */.  rc =
1e7c0 20 30 3b 0a 0a 20 20 2f 2a 20 43 6f 6e 74 72 6f   0;..  /* Contro
1e7d0 6c 20 6a 75 6d 70 73 20 74 6f 20 68 65 72 65 20  l jumps to here 
1e7e0 69 66 20 61 6e 20 65 72 72 6f 72 20 69 73 20 65  if an error is e
1e7f0 6e 63 6f 75 6e 74 65 72 65 64 20 61 62 6f 76 65  ncountered above
1e800 2c 20 6f 72 20 75 70 6f 6e 0a 20 20 2a 2a 20 73  , or upon.  ** s
1e810 75 63 63 65 73 73 66 75 6c 20 63 6f 64 69 6e 67  uccessful coding
1e820 20 6f 66 20 74 68 65 20 53 45 4c 45 43 54 2e 0a   of the SELECT..
1e830 20 20 2a 2f 0a 73 65 6c 65 63 74 5f 65 6e 64 3a    */.select_end:
1e840 0a 0a 20 20 2f 2a 20 49 64 65 6e 74 69 66 79 20  ..  /* Identify 
1e850 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 69 66 20  column names if 
1e860 77 65 20 77 69 6c 6c 20 62 65 20 75 73 69 6e 67  we will be using
1e870 20 74 68 65 6d 20 69 6e 20 61 20 63 61 6c 6c 62   them in a callb
1e880 61 63 6b 2e 20 20 54 68 69 73 0a 20 20 2a 2a 20  ack.  This.  ** 
1e890 73 74 65 70 20 69 73 20 73 6b 69 70 70 65 64 20  step is skipped 
1e8a0 69 66 20 74 68 65 20 6f 75 74 70 75 74 20 69 73  if the output is
1e8b0 20 67 6f 69 6e 67 20 74 6f 20 73 6f 6d 65 20 6f   going to some o
1e8c0 74 68 65 72 20 64 65 73 74 69 6e 61 74 69 6f 6e  ther destination
1e8d0 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 72 63 3d  ..  */.  if( rc=
1e8e0 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 44  =SQLITE_OK && pD
1e8f0 65 73 74 2d 3e 65 44 65 73 74 3d 3d 53 52 54 5f  est->eDest==SRT_
1e900 43 61 6c 6c 62 61 63 6b 20 29 7b 0a 20 20 20 20  Callback ){.    
1e910 67 65 6e 65 72 61 74 65 43 6f 6c 75 6d 6e 4e 61  generateColumnNa
1e920 6d 65 73 28 70 50 61 72 73 65 2c 20 70 54 61 62  mes(pParse, pTab
1e930 4c 69 73 74 2c 20 70 45 4c 69 73 74 29 3b 0a 20  List, pEList);. 
1e940 20 7d 0a 0a 20 20 73 71 6c 69 74 65 33 5f 66 72   }..  sqlite3_fr
1e950 65 65 28 73 41 67 67 49 6e 66 6f 2e 61 43 6f 6c  ee(sAggInfo.aCol
1e960 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65  );.  sqlite3_fre
1e970 65 28 73 41 67 67 49 6e 66 6f 2e 61 46 75 6e 63  e(sAggInfo.aFunc
1e980 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
1e990 7d 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53  }..#if defined(S
1e9a0 51 4c 49 54 45 5f 44 45 42 55 47 29 0a 2f 2a 0a  QLITE_DEBUG)./*.
1e9b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1e9c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1e9d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1e9e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1e9f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a  ***************.
1ea00 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  ** The following
1ea10 20 63 6f 64 65 20 69 73 20 75 73 65 64 20 66 6f   code is used fo
1ea20 72 20 74 65 73 74 69 6e 67 20 61 6e 64 20 64 65  r testing and de
1ea30 62 75 67 67 69 6e 67 20 6f 6e 6c 79 2e 20 20 54  bugging only.  T
1ea40 68 65 20 63 6f 64 65 0a 2a 2a 20 74 68 61 74 20  he code.** that 
1ea50 66 6f 6c 6c 6f 77 73 20 64 6f 65 73 20 6e 6f 74  follows does not
1ea60 20 61 70 70 65 61 72 20 69 6e 20 6e 6f 72 6d 61   appear in norma
1ea70 6c 20 62 75 69 6c 64 73 2e 0a 2a 2a 0a 2a 2a 20  l builds..**.** 
1ea80 54 68 65 73 65 20 72 6f 75 74 69 6e 65 73 20 61  These routines a
1ea90 72 65 20 75 73 65 64 20 74 6f 20 70 72 69 6e 74  re used to print
1eaa0 20 6f 75 74 20 74 68 65 20 63 6f 6e 74 65 6e 74   out the content
1eab0 20 6f 66 20 61 6c 6c 20 6f 72 20 70 61 72 74 20   of all or part 
1eac0 6f 66 20 61 20 0a 2a 2a 20 70 61 72 73 65 20 73  of a .** parse s
1ead0 74 72 75 63 74 75 72 65 73 20 73 75 63 68 20 61  tructures such a
1eae0 73 20 53 65 6c 65 63 74 20 6f 72 20 45 78 70 72  s Select or Expr
1eaf0 2e 20 20 53 75 63 68 20 70 72 69 6e 74 6f 75 74  .  Such printout
1eb00 73 20 61 72 65 20 75 73 65 66 75 6c 0a 2a 2a 20  s are useful.** 
1eb10 66 6f 72 20 68 65 6c 70 69 6e 67 20 74 6f 20 75  for helping to u
1eb20 6e 64 65 72 73 74 61 6e 64 20 77 68 61 74 20 69  nderstand what i
1eb30 73 20 68 61 70 70 65 6e 69 6e 67 20 69 6e 73 69  s happening insi
1eb40 64 65 20 74 68 65 20 63 6f 64 65 20 67 65 6e 65  de the code gene
1eb50 72 61 74 6f 72 0a 2a 2a 20 64 75 72 69 6e 67 20  rator.** during 
1eb60 74 68 65 20 65 78 65 63 75 74 69 6f 6e 20 6f 66  the execution of
1eb70 20 63 6f 6d 70 6c 65 78 20 53 45 4c 45 43 54 20   complex SELECT 
1eb80 73 74 61 74 65 6d 65 6e 74 73 2e 0a 2a 2a 0a 2a  statements..**.*
1eb90 2a 20 54 68 65 73 65 20 72 6f 75 74 69 6e 65 20  * These routine 
1eba0 61 72 65 20 6e 6f 74 20 63 61 6c 6c 65 64 20 61  are not called a
1ebb0 6e 79 77 68 65 72 65 20 66 72 6f 6d 20 77 69 74  nywhere from wit
1ebc0 68 69 6e 20 74 68 65 20 6e 6f 72 6d 61 6c 0a 2a  hin the normal.*
1ebd0 2a 20 63 6f 64 65 20 62 61 73 65 2e 20 20 54 68  * code base.  Th
1ebe0 65 6e 20 61 72 65 20 69 6e 74 65 6e 64 65 64 20  en are intended 
1ebf0 74 6f 20 62 65 20 63 61 6c 6c 65 64 20 66 72 6f  to be called fro
1ec00 6d 20 77 69 74 68 69 6e 20 74 68 65 20 64 65 62  m within the deb
1ec10 75 67 67 65 72 0a 2a 2a 20 6f 72 20 66 72 6f 6d  ugger.** or from
1ec20 20 74 65 6d 70 6f 72 61 72 79 20 22 70 72 69 6e   temporary "prin
1ec30 74 66 22 20 73 74 61 74 65 6d 65 6e 74 73 20 69  tf" statements i
1ec40 6e 73 65 72 74 65 64 20 66 6f 72 20 64 65 62 75  nserted for debu
1ec50 67 67 69 6e 67 2e 0a 2a 2f 0a 76 6f 69 64 20 73  gging..*/.void s
1ec60 71 6c 69 74 65 33 50 72 69 6e 74 45 78 70 72 28  qlite3PrintExpr(
1ec70 45 78 70 72 20 2a 70 29 7b 0a 20 20 69 66 28 20  Expr *p){.  if( 
1ec80 70 2d 3e 74 6f 6b 65 6e 2e 7a 20 26 26 20 70 2d  p->token.z && p-
1ec90 3e 74 6f 6b 65 6e 2e 6e 3e 30 20 29 7b 0a 20 20  >token.n>0 ){.  
1eca0 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72    sqlite3DebugPr
1ecb0 69 6e 74 66 28 22 28 25 2e 2a 73 22 2c 20 70 2d  intf("(%.*s", p-
1ecc0 3e 74 6f 6b 65 6e 2e 6e 2c 20 70 2d 3e 74 6f 6b  >token.n, p->tok
1ecd0 65 6e 2e 7a 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  en.z);.  }else{.
1ece0 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67      sqlite3Debug
1ecf0 50 72 69 6e 74 66 28 22 28 25 64 22 2c 20 70 2d  Printf("(%d", p-
1ed00 3e 6f 70 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  >op);.  }.  if( 
1ed10 70 2d 3e 70 4c 65 66 74 20 29 7b 0a 20 20 20 20  p->pLeft ){.    
1ed20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e  sqlite3DebugPrin
1ed30 74 66 28 22 20 22 29 3b 0a 20 20 20 20 73 71 6c  tf(" ");.    sql
1ed40 69 74 65 33 50 72 69 6e 74 45 78 70 72 28 70 2d  ite3PrintExpr(p-
1ed50 3e 70 4c 65 66 74 29 3b 0a 20 20 7d 0a 20 20 69  >pLeft);.  }.  i
1ed60 66 28 20 70 2d 3e 70 52 69 67 68 74 20 29 7b 0a  f( p->pRight ){.
1ed70 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67      sqlite3Debug
1ed80 50 72 69 6e 74 66 28 22 20 22 29 3b 0a 20 20 20  Printf(" ");.   
1ed90 20 73 71 6c 69 74 65 33 50 72 69 6e 74 45 78 70   sqlite3PrintExp
1eda0 72 28 70 2d 3e 70 52 69 67 68 74 29 3b 0a 20 20  r(p->pRight);.  
1edb0 7d 0a 20 20 73 71 6c 69 74 65 33 44 65 62 75 67  }.  sqlite3Debug
1edc0 50 72 69 6e 74 66 28 22 29 22 29 3b 0a 7d 0a 76  Printf(")");.}.v
1edd0 6f 69 64 20 73 71 6c 69 74 65 33 50 72 69 6e 74  oid sqlite3Print
1ede0 45 78 70 72 4c 69 73 74 28 45 78 70 72 4c 69 73  ExprList(ExprLis
1edf0 74 20 2a 70 4c 69 73 74 29 7b 0a 20 20 69 6e 74  t *pList){.  int
1ee00 20 69 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69   i;.  for(i=0; i
1ee10 3c 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69  <pList->nExpr; i
1ee20 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  ++){.    sqlite3
1ee30 50 72 69 6e 74 45 78 70 72 28 70 4c 69 73 74 2d  PrintExpr(pList-
1ee40 3e 61 5b 69 5d 2e 70 45 78 70 72 29 3b 0a 20 20  >a[i].pExpr);.  
1ee50 20 20 69 66 28 20 69 3c 70 4c 69 73 74 2d 3e 6e    if( i<pList->n
1ee60 45 78 70 72 2d 31 20 29 7b 0a 20 20 20 20 20 20  Expr-1 ){.      
1ee70 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e  sqlite3DebugPrin
1ee80 74 66 28 22 2c 20 22 29 3b 0a 20 20 20 20 7d 0a  tf(", ");.    }.
1ee90 20 20 7d 0a 7d 0a 76 6f 69 64 20 73 71 6c 69 74    }.}.void sqlit
1eea0 65 33 50 72 69 6e 74 53 65 6c 65 63 74 28 53 65  e3PrintSelect(Se
1eeb0 6c 65 63 74 20 2a 70 2c 20 69 6e 74 20 69 6e 64  lect *p, int ind
1eec0 65 6e 74 29 7b 0a 20 20 73 71 6c 69 74 65 33 44  ent){.  sqlite3D
1eed0 65 62 75 67 50 72 69 6e 74 66 28 22 25 2a 73 53  ebugPrintf("%*sS
1eee0 45 4c 45 43 54 28 25 70 29 20 22 2c 20 69 6e 64  ELECT(%p) ", ind
1eef0 65 6e 74 2c 20 22 22 2c 20 70 29 3b 0a 20 20 73  ent, "", p);.  s
1ef00 71 6c 69 74 65 33 50 72 69 6e 74 45 78 70 72 4c  qlite3PrintExprL
1ef10 69 73 74 28 70 2d 3e 70 45 4c 69 73 74 29 3b 0a  ist(p->pEList);.
1ef20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72    sqlite3DebugPr
1ef30 69 6e 74 66 28 22 5c 6e 22 29 3b 0a 20 20 69 66  intf("\n");.  if
1ef40 28 20 70 2d 3e 70 53 72 63 20 29 7b 0a 20 20 20  ( p->pSrc ){.   
1ef50 20 63 68 61 72 20 2a 7a 50 72 65 66 69 78 3b 0a   char *zPrefix;.
1ef60 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 7a      int i;.    z
1ef70 50 72 65 66 69 78 20 3d 20 22 46 52 4f 4d 22 3b  Prefix = "FROM";
1ef80 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
1ef90 70 2d 3e 70 53 72 63 2d 3e 6e 53 72 63 3b 20 69  p->pSrc->nSrc; i
1efa0 2b 2b 29 7b 0a 20 20 20 20 20 20 73 74 72 75 63  ++){.      struc
1efb0 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a  t SrcList_item *
1efc0 70 49 74 65 6d 20 3d 20 26 70 2d 3e 70 53 72 63  pItem = &p->pSrc
1efd0 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20 20 20 73 71  ->a[i];.      sq
1efe0 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66  lite3DebugPrintf
1eff0 28 22 25 2a 73 20 22 2c 20 69 6e 64 65 6e 74 2b  ("%*s ", indent+
1f000 36 2c 20 7a 50 72 65 66 69 78 29 3b 0a 20 20 20  6, zPrefix);.   
1f010 20 20 20 7a 50 72 65 66 69 78 20 3d 20 22 22 3b     zPrefix = "";
1f020 0a 20 20 20 20 20 20 69 66 28 20 70 49 74 65 6d  .      if( pItem
1f030 2d 3e 70 53 65 6c 65 63 74 20 29 7b 0a 20 20 20  ->pSelect ){.   
1f040 20 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75       sqlite3Debu
1f050 67 50 72 69 6e 74 66 28 22 28 5c 6e 22 29 3b 0a  gPrintf("(\n");.
1f060 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 50          sqlite3P
1f070 72 69 6e 74 53 65 6c 65 63 74 28 70 49 74 65 6d  rintSelect(pItem
1f080 2d 3e 70 53 65 6c 65 63 74 2c 20 69 6e 64 65 6e  ->pSelect, inden
1f090 74 2b 31 30 29 3b 0a 20 20 20 20 20 20 20 20 73  t+10);.        s
1f0a0 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74  qlite3DebugPrint
1f0b0 66 28 22 25 2a 73 29 22 2c 20 69 6e 64 65 6e 74  f("%*s)", indent
1f0c0 2b 38 2c 20 22 22 29 3b 0a 20 20 20 20 20 20 7d  +8, "");.      }
1f0d0 65 6c 73 65 20 69 66 28 20 70 49 74 65 6d 2d 3e  else if( pItem->
1f0e0 7a 4e 61 6d 65 20 29 7b 0a 20 20 20 20 20 20 20  zName ){.       
1f0f0 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69   sqlite3DebugPri
1f100 6e 74 66 28 22 25 73 22 2c 20 70 49 74 65 6d 2d  ntf("%s", pItem-
1f110 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 7d  >zName);.      }
1f120 0a 20 20 20 20 20 20 69 66 28 20 70 49 74 65 6d  .      if( pItem
1f130 2d 3e 70 54 61 62 20 29 7b 0a 20 20 20 20 20 20  ->pTab ){.      
1f140 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72    sqlite3DebugPr
1f150 69 6e 74 66 28 22 28 74 61 62 6c 65 3a 20 25 73  intf("(table: %s
1f160 29 22 2c 20 70 49 74 65 6d 2d 3e 70 54 61 62 2d  )", pItem->pTab-
1f170 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 7d  >zName);.      }
1f180 0a 20 20 20 20 20 20 69 66 28 20 70 49 74 65 6d  .      if( pItem
1f190 2d 3e 7a 41 6c 69 61 73 20 29 7b 0a 20 20 20 20  ->zAlias ){.    
1f1a0 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67      sqlite3Debug
1f1b0 50 72 69 6e 74 66 28 22 20 41 53 20 25 73 22 2c  Printf(" AS %s",
1f1c0 20 70 49 74 65 6d 2d 3e 7a 41 6c 69 61 73 29 3b   pItem->zAlias);
1f1d0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
1f1e0 66 28 20 69 3c 70 2d 3e 70 53 72 63 2d 3e 6e 53  f( i<p->pSrc->nS
1f1f0 72 63 2d 31 20 29 7b 0a 20 20 20 20 20 20 20 20  rc-1 ){.        
1f200 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e  sqlite3DebugPrin
1f210 74 66 28 22 2c 22 29 3b 0a 20 20 20 20 20 20 7d  tf(",");.      }
1f220 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 65  .      sqlite3De
1f230 62 75 67 50 72 69 6e 74 66 28 22 5c 6e 22 29 3b  bugPrintf("\n");
1f240 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28  .    }.  }.  if(
1f250 20 70 2d 3e 70 57 68 65 72 65 20 29 7b 0a 20 20   p->pWhere ){.  
1f260 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72    sqlite3DebugPr
1f270 69 6e 74 66 28 22 25 2a 73 20 57 48 45 52 45 20  intf("%*s WHERE 
1f280 22 2c 20 69 6e 64 65 6e 74 2c 20 22 22 29 3b 0a  ", indent, "");.
1f290 20 20 20 20 73 71 6c 69 74 65 33 50 72 69 6e 74      sqlite3Print
1f2a0 45 78 70 72 28 70 2d 3e 70 57 68 65 72 65 29 3b  Expr(p->pWhere);
1f2b0 0a 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75  .    sqlite3Debu
1f2c0 67 50 72 69 6e 74 66 28 22 5c 6e 22 29 3b 0a 20  gPrintf("\n");. 
1f2d0 20 7d 0a 20 20 69 66 28 20 70 2d 3e 70 47 72 6f   }.  if( p->pGro
1f2e0 75 70 42 79 20 29 7b 0a 20 20 20 20 73 71 6c 69  upBy ){.    sqli
1f2f0 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22  te3DebugPrintf("
1f300 25 2a 73 20 47 52 4f 55 50 20 42 59 20 22 2c 20  %*s GROUP BY ", 
1f310 69 6e 64 65 6e 74 2c 20 22 22 29 3b 0a 20 20 20  indent, "");.   
1f320 20 73 71 6c 69 74 65 33 50 72 69 6e 74 45 78 70   sqlite3PrintExp
1f330 72 4c 69 73 74 28 70 2d 3e 70 47 72 6f 75 70 42  rList(p->pGroupB
1f340 79 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44  y);.    sqlite3D
1f350 65 62 75 67 50 72 69 6e 74 66 28 22 5c 6e 22 29  ebugPrintf("\n")
1f360 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e 70  ;.  }.  if( p->p
1f370 48 61 76 69 6e 67 20 29 7b 0a 20 20 20 20 73 71  Having ){.    sq
1f380 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66  lite3DebugPrintf
1f390 28 22 25 2a 73 20 48 41 56 49 4e 47 20 22 2c 20  ("%*s HAVING ", 
1f3a0 69 6e 64 65 6e 74 2c 20 22 22 29 3b 0a 20 20 20  indent, "");.   
1f3b0 20 73 71 6c 69 74 65 33 50 72 69 6e 74 45 78 70   sqlite3PrintExp
1f3c0 72 28 70 2d 3e 70 48 61 76 69 6e 67 29 3b 0a 20  r(p->pHaving);. 
1f3d0 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50     sqlite3DebugP
1f3e0 72 69 6e 74 66 28 22 5c 6e 22 29 3b 0a 20 20 7d  rintf("\n");.  }
1f3f0 0a 20 20 69 66 28 20 70 2d 3e 70 4f 72 64 65 72  .  if( p->pOrder
1f400 42 79 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  By ){.    sqlite
1f410 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 25 2a  3DebugPrintf("%*
1f420 73 20 4f 52 44 45 52 20 42 59 20 22 2c 20 69 6e  s ORDER BY ", in
1f430 64 65 6e 74 2c 20 22 22 29 3b 0a 20 20 20 20 73  dent, "");.    s
1f440 71 6c 69 74 65 33 50 72 69 6e 74 45 78 70 72 4c  qlite3PrintExprL
1f450 69 73 74 28 70 2d 3e 70 4f 72 64 65 72 42 79 29  ist(p->pOrderBy)
1f460 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 65 62  ;.    sqlite3Deb
1f470 75 67 50 72 69 6e 74 66 28 22 5c 6e 22 29 3b 0a  ugPrintf("\n");.
1f480 20 20 7d 0a 7d 0a 2f 2a 20 45 6e 64 20 6f 66 20    }.}./* End of 
1f490 74 68 65 20 73 74 72 75 63 74 75 72 65 20 64 65  the structure de
1f4a0 62 75 67 20 70 72 69 6e 74 69 6e 67 20 63 6f 64  bug printing cod
1f4b0 65 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  e.**************
1f4c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1f4d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1f4e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1f4f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f  ***************/
1f500 0a 23 65 6e 64 69 66 20 2f 2a 20 64 65 66 69 6e  .#endif /* defin
1f510 65 64 28 53 51 4c 49 54 45 5f 54 45 53 54 29 20  ed(SQLITE_TEST) 
1f520 7c 7c 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  || defined(SQLIT
1f530 45 5f 44 45 42 55 47 29 20 2a 2f 0a              E_DEBUG) */.