/ Hex Artifact Content
Login

Artifact 2c08239b55cf93c03a79cbdedf1ac89967fd6acb:


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 36 34  select.c,v 1.364
0200: 20 32 30 30 37 2f 31 32 2f 30 38 20 32 31 3a 31   2007/12/08 21:1
0210: 30 3a 32 30 20 64 72 68 20 45 78 70 20 24 0a 2a  0:20 drh Exp $.*
0220: 2f 0a 23 69 6e 63 6c 75 64 65 20 22 73 71 6c 69  /.#include "sqli
0230: 74 65 49 6e 74 2e 68 22 0a 0a 0a 2f 2a 0a 2a 2a  teInt.h".../*.**
0240: 20 44 65 6c 65 74 65 20 61 6c 6c 20 74 68 65 20   Delete all the 
0250: 63 6f 6e 74 65 6e 74 20 6f 66 20 61 20 53 65 6c  content of a Sel
0260: 65 63 74 20 73 74 72 75 63 74 75 72 65 20 62 75  ect structure bu
0270: 74 20 64 6f 20 6e 6f 74 20 64 65 61 6c 6c 6f 63  t do not dealloc
0280: 61 74 65 0a 2a 2a 20 74 68 65 20 73 65 6c 65 63  ate.** the selec
0290: 74 20 73 74 72 75 63 74 75 72 65 20 69 74 73 65  t structure itse
02a0: 6c 66 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  lf..*/.static vo
02b0: 69 64 20 63 6c 65 61 72 53 65 6c 65 63 74 28 53  id clearSelect(S
02c0: 65 6c 65 63 74 20 2a 70 29 7b 0a 20 20 73 71 6c  elect *p){.  sql
02d0: 69 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65  ite3ExprListDele
02e0: 74 65 28 70 2d 3e 70 45 4c 69 73 74 29 3b 0a 20  te(p->pEList);. 
02f0: 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74 44   sqlite3SrcListD
0300: 65 6c 65 74 65 28 70 2d 3e 70 53 72 63 29 3b 0a  elete(p->pSrc);.
0310: 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c    sqlite3ExprDel
0320: 65 74 65 28 70 2d 3e 70 57 68 65 72 65 29 3b 0a  ete(p->pWhere);.
0330: 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73    sqlite3ExprLis
0340: 74 44 65 6c 65 74 65 28 70 2d 3e 70 47 72 6f 75  tDelete(p->pGrou
0350: 70 42 79 29 3b 0a 20 20 73 71 6c 69 74 65 33 45  pBy);.  sqlite3E
0360: 78 70 72 44 65 6c 65 74 65 28 70 2d 3e 70 48 61  xprDelete(p->pHa
0370: 76 69 6e 67 29 3b 0a 20 20 73 71 6c 69 74 65 33  ving);.  sqlite3
0380: 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28 70  ExprListDelete(p
0390: 2d 3e 70 4f 72 64 65 72 42 79 29 3b 0a 20 20 73  ->pOrderBy);.  s
03a0: 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65 6c 65  qlite3SelectDele
03b0: 74 65 28 70 2d 3e 70 50 72 69 6f 72 29 3b 0a 20  te(p->pPrior);. 
03c0: 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65   sqlite3ExprDele
03d0: 74 65 28 70 2d 3e 70 4c 69 6d 69 74 29 3b 0a 20  te(p->pLimit);. 
03e0: 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65   sqlite3ExprDele
03f0: 74 65 28 70 2d 3e 70 4f 66 66 73 65 74 29 3b 0a  te(p->pOffset);.
0400: 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61  }.../*.** Alloca
0410: 74 65 20 61 20 6e 65 77 20 53 65 6c 65 63 74 20  te a new Select 
0420: 73 74 72 75 63 74 75 72 65 20 61 6e 64 20 72 65  structure and re
0430: 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74  turn a pointer t
0440: 6f 20 74 68 61 74 0a 2a 2a 20 73 74 72 75 63 74  o that.** struct
0450: 75 72 65 2e 0a 2a 2f 0a 53 65 6c 65 63 74 20 2a  ure..*/.Select *
0460: 73 71 6c 69 74 65 33 53 65 6c 65 63 74 4e 65 77  sqlite3SelectNew
0470: 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
0480: 65 2c 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72  e,        /* Par
0490: 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  sing context */.
04a0: 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69    ExprList *pELi
04b0: 73 74 2c 20 20 20 20 20 2f 2a 20 77 68 69 63 68  st,     /* which
04c0: 20 63 6f 6c 75 6d 6e 73 20 74 6f 20 69 6e 63 6c   columns to incl
04d0: 75 64 65 20 69 6e 20 74 68 65 20 72 65 73 75 6c  ude in the resul
04e0: 74 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a  t */.  SrcList *
04f0: 70 53 72 63 2c 20 20 20 20 20 20 20 20 2f 2a 20  pSrc,        /* 
0500: 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20  the FROM clause 
0510: 2d 2d 20 77 68 69 63 68 20 74 61 62 6c 65 73 20  -- which tables 
0520: 74 6f 20 73 63 61 6e 20 2a 2f 0a 20 20 45 78 70  to scan */.  Exp
0530: 72 20 2a 70 57 68 65 72 65 2c 20 20 20 20 20 20  r *pWhere,      
0540: 20 20 20 2f 2a 20 74 68 65 20 57 48 45 52 45 20     /* the WHERE 
0550: 63 6c 61 75 73 65 20 2a 2f 0a 20 20 45 78 70 72  clause */.  Expr
0560: 4c 69 73 74 20 2a 70 47 72 6f 75 70 42 79 2c 20  List *pGroupBy, 
0570: 20 20 2f 2a 20 74 68 65 20 47 52 4f 55 50 20 42    /* the GROUP B
0580: 59 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 45 78  Y clause */.  Ex
0590: 70 72 20 2a 70 48 61 76 69 6e 67 2c 20 20 20 20  pr *pHaving,    
05a0: 20 20 20 20 2f 2a 20 74 68 65 20 48 41 56 49 4e      /* the HAVIN
05b0: 47 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 45 78  G clause */.  Ex
05c0: 70 72 4c 69 73 74 20 2a 70 4f 72 64 65 72 42 79  prList *pOrderBy
05d0: 2c 20 20 20 2f 2a 20 74 68 65 20 4f 52 44 45 52  ,   /* the ORDER
05e0: 20 42 59 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20   BY clause */.  
05f0: 69 6e 74 20 69 73 44 69 73 74 69 6e 63 74 2c 20  int isDistinct, 
0600: 20 20 20 20 20 20 2f 2a 20 74 72 75 65 20 69 66        /* true if
0610: 20 74 68 65 20 44 49 53 54 49 4e 43 54 20 6b 65   the DISTINCT ke
0620: 79 77 6f 72 64 20 69 73 20 70 72 65 73 65 6e 74  yword is present
0630: 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 4c 69 6d   */.  Expr *pLim
0640: 69 74 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 4c  it,         /* L
0650: 49 4d 49 54 20 76 61 6c 75 65 2e 20 20 4e 55 4c  IMIT value.  NUL
0660: 4c 20 6d 65 61 6e 73 20 6e 6f 74 20 75 73 65 64  L means not used
0670: 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 4f 66 66   */.  Expr *pOff
0680: 73 65 74 20 20 20 20 20 20 20 20 20 2f 2a 20 4f  set         /* O
0690: 46 46 53 45 54 20 76 61 6c 75 65 2e 20 20 4e 55  FFSET value.  NU
06a0: 4c 4c 20 6d 65 61 6e 73 20 6e 6f 20 6f 66 66 73  LL means no offs
06b0: 65 74 20 2a 2f 0a 29 7b 0a 20 20 53 65 6c 65 63  et */.){.  Selec
06c0: 74 20 2a 70 4e 65 77 3b 0a 20 20 53 65 6c 65 63  t *pNew;.  Selec
06d0: 74 20 73 74 61 6e 64 69 6e 3b 0a 20 20 73 71 6c  t standin;.  sql
06e0: 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73  ite3 *db = pPars
06f0: 65 2d 3e 64 62 3b 0a 20 20 70 4e 65 77 20 3d 20  e->db;.  pNew = 
0700: 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a  sqlite3DbMallocZ
0710: 65 72 6f 28 64 62 2c 20 73 69 7a 65 6f 66 28 2a  ero(db, sizeof(*
0720: 70 4e 65 77 29 20 29 3b 0a 20 20 61 73 73 65 72  pNew) );.  asser
0730: 74 28 20 21 70 4f 66 66 73 65 74 20 7c 7c 20 70  t( !pOffset || p
0740: 4c 69 6d 69 74 20 29 3b 20 20 20 2f 2a 20 43 61  Limit );   /* Ca
0750: 6e 27 74 20 68 61 76 65 20 4f 46 46 53 45 54 20  n't have OFFSET 
0760: 77 69 74 68 6f 75 74 20 4c 49 4d 49 54 2e 20 2a  without LIMIT. *
0770: 2f 0a 20 20 69 66 28 20 70 4e 65 77 3d 3d 30 20  /.  if( pNew==0 
0780: 29 7b 0a 20 20 20 20 70 4e 65 77 20 3d 20 26 73  ){.    pNew = &s
0790: 74 61 6e 64 69 6e 3b 0a 20 20 20 20 6d 65 6d 73  tandin;.    mems
07a0: 65 74 28 70 4e 65 77 2c 20 30 2c 20 73 69 7a 65  et(pNew, 0, size
07b0: 6f 66 28 2a 70 4e 65 77 29 29 3b 0a 20 20 7d 0a  of(*pNew));.  }.
07c0: 20 20 69 66 28 20 70 45 4c 69 73 74 3d 3d 30 20    if( pEList==0 
07d0: 29 7b 0a 20 20 20 20 70 45 4c 69 73 74 20 3d 20  ){.    pEList = 
07e0: 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 41  sqlite3ExprListA
07f0: 70 70 65 6e 64 28 70 50 61 72 73 65 2c 20 30 2c  ppend(pParse, 0,
0800: 20 73 71 6c 69 74 65 33 45 78 70 72 28 64 62 2c   sqlite3Expr(db,
0810: 54 4b 5f 41 4c 4c 2c 30 2c 30 2c 30 29 2c 20 30  TK_ALL,0,0,0), 0
0820: 29 3b 0a 20 20 7d 0a 20 20 70 4e 65 77 2d 3e 70  );.  }.  pNew->p
0830: 45 4c 69 73 74 20 3d 20 70 45 4c 69 73 74 3b 0a  EList = pEList;.
0840: 20 20 70 4e 65 77 2d 3e 70 53 72 63 20 3d 20 70    pNew->pSrc = p
0850: 53 72 63 3b 0a 20 20 70 4e 65 77 2d 3e 70 57 68  Src;.  pNew->pWh
0860: 65 72 65 20 3d 20 70 57 68 65 72 65 3b 0a 20 20  ere = pWhere;.  
0870: 70 4e 65 77 2d 3e 70 47 72 6f 75 70 42 79 20 3d  pNew->pGroupBy =
0880: 20 70 47 72 6f 75 70 42 79 3b 0a 20 20 70 4e 65   pGroupBy;.  pNe
0890: 77 2d 3e 70 48 61 76 69 6e 67 20 3d 20 70 48 61  w->pHaving = pHa
08a0: 76 69 6e 67 3b 0a 20 20 70 4e 65 77 2d 3e 70 4f  ving;.  pNew->pO
08b0: 72 64 65 72 42 79 20 3d 20 70 4f 72 64 65 72 42  rderBy = pOrderB
08c0: 79 3b 0a 20 20 70 4e 65 77 2d 3e 69 73 44 69 73  y;.  pNew->isDis
08d0: 74 69 6e 63 74 20 3d 20 69 73 44 69 73 74 69 6e  tinct = isDistin
08e0: 63 74 3b 0a 20 20 70 4e 65 77 2d 3e 6f 70 20 3d  ct;.  pNew->op =
08f0: 20 54 4b 5f 53 45 4c 45 43 54 3b 0a 20 20 61 73   TK_SELECT;.  as
0900: 73 65 72 74 28 20 70 4f 66 66 73 65 74 3d 3d 30  sert( pOffset==0
0910: 20 7c 7c 20 70 4c 69 6d 69 74 21 3d 30 20 29 3b   || pLimit!=0 );
0920: 0a 20 20 70 4e 65 77 2d 3e 70 4c 69 6d 69 74 20  .  pNew->pLimit 
0930: 3d 20 70 4c 69 6d 69 74 3b 0a 20 20 70 4e 65 77  = pLimit;.  pNew
0940: 2d 3e 70 4f 66 66 73 65 74 20 3d 20 70 4f 66 66  ->pOffset = pOff
0950: 73 65 74 3b 0a 20 20 70 4e 65 77 2d 3e 69 4c 69  set;.  pNew->iLi
0960: 6d 69 74 20 3d 20 2d 31 3b 0a 20 20 70 4e 65 77  mit = -1;.  pNew
0970: 2d 3e 69 4f 66 66 73 65 74 20 3d 20 2d 31 3b 0a  ->iOffset = -1;.
0980: 20 20 70 4e 65 77 2d 3e 61 64 64 72 4f 70 65 6e    pNew->addrOpen
0990: 45 70 68 6d 5b 30 5d 20 3d 20 2d 31 3b 0a 20 20  Ephm[0] = -1;.  
09a0: 70 4e 65 77 2d 3e 61 64 64 72 4f 70 65 6e 45 70  pNew->addrOpenEp
09b0: 68 6d 5b 31 5d 20 3d 20 2d 31 3b 0a 20 20 70 4e  hm[1] = -1;.  pN
09c0: 65 77 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d  ew->addrOpenEphm
09d0: 5b 32 5d 20 3d 20 2d 31 3b 0a 20 20 69 66 28 20  [2] = -1;.  if( 
09e0: 70 4e 65 77 3d 3d 26 73 74 61 6e 64 69 6e 29 20  pNew==&standin) 
09f0: 7b 0a 20 20 20 20 63 6c 65 61 72 53 65 6c 65 63  {.    clearSelec
0a00: 74 28 70 4e 65 77 29 3b 0a 20 20 20 20 70 4e 65  t(pNew);.    pNe
0a10: 77 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74  w = 0;.  }.  ret
0a20: 75 72 6e 20 70 4e 65 77 3b 0a 7d 0a 0a 2f 2a 0a  urn pNew;.}../*.
0a30: 2a 2a 20 44 65 6c 65 74 65 20 74 68 65 20 67 69  ** Delete the gi
0a40: 76 65 6e 20 53 65 6c 65 63 74 20 73 74 72 75 63  ven Select struc
0a50: 74 75 72 65 20 61 6e 64 20 61 6c 6c 20 6f 66 20  ture and all of 
0a60: 69 74 73 20 73 75 62 73 74 72 75 63 74 75 72 65  its substructure
0a70: 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  s..*/.void sqlit
0a80: 65 33 53 65 6c 65 63 74 44 65 6c 65 74 65 28 53  e3SelectDelete(S
0a90: 65 6c 65 63 74 20 2a 70 29 7b 0a 20 20 69 66 28  elect *p){.  if(
0aa0: 20 70 20 29 7b 0a 20 20 20 20 63 6c 65 61 72 53   p ){.    clearS
0ab0: 65 6c 65 63 74 28 70 29 3b 0a 20 20 20 20 73 71  elect(p);.    sq
0ac0: 6c 69 74 65 33 5f 66 72 65 65 28 70 29 3b 0a 20  lite3_free(p);. 
0ad0: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65   }.}../*.** Give
0ae0: 6e 20 31 20 74 6f 20 33 20 69 64 65 6e 74 69 66  n 1 to 3 identif
0af0: 69 65 72 73 20 70 72 65 63 65 65 64 69 6e 67 20  iers preceeding 
0b00: 74 68 65 20 4a 4f 49 4e 20 6b 65 79 77 6f 72 64  the JOIN keyword
0b10: 2c 20 64 65 74 65 72 6d 69 6e 65 20 74 68 65 0a  , determine the.
0b20: 2a 2a 20 74 79 70 65 20 6f 66 20 6a 6f 69 6e 2e  ** type of join.
0b30: 20 20 52 65 74 75 72 6e 20 61 6e 20 69 6e 74 65    Return an inte
0b40: 67 65 72 20 63 6f 6e 73 74 61 6e 74 20 74 68 61  ger constant tha
0b50: 74 20 65 78 70 72 65 73 73 65 73 20 74 68 61 74  t expresses that
0b60: 20 74 79 70 65 0a 2a 2a 20 69 6e 20 74 65 72 6d   type.** in term
0b70: 73 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69  s of the followi
0b80: 6e 67 20 62 69 74 20 76 61 6c 75 65 73 3a 0a 2a  ng bit values:.*
0b90: 2a 0a 2a 2a 20 20 20 20 20 4a 54 5f 49 4e 4e 45  *.**     JT_INNE
0ba0: 52 0a 2a 2a 20 20 20 20 20 4a 54 5f 43 52 4f 53  R.**     JT_CROS
0bb0: 53 0a 2a 2a 20 20 20 20 20 4a 54 5f 4f 55 54 45  S.**     JT_OUTE
0bc0: 52 0a 2a 2a 20 20 20 20 20 4a 54 5f 4e 41 54 55  R.**     JT_NATU
0bd0: 52 41 4c 0a 2a 2a 20 20 20 20 20 4a 54 5f 4c 45  RAL.**     JT_LE
0be0: 46 54 0a 2a 2a 20 20 20 20 20 4a 54 5f 52 49 47  FT.**     JT_RIG
0bf0: 48 54 0a 2a 2a 0a 2a 2a 20 41 20 66 75 6c 6c 20  HT.**.** A full 
0c00: 6f 75 74 65 72 20 6a 6f 69 6e 20 69 73 20 74 68  outer join is th
0c10: 65 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 20 6f 66  e combination of
0c20: 20 4a 54 5f 4c 45 46 54 20 61 6e 64 20 4a 54 5f   JT_LEFT and JT_
0c30: 52 49 47 48 54 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  RIGHT..**.** If 
0c40: 61 6e 20 69 6c 6c 65 67 61 6c 20 6f 72 20 75 6e  an illegal or un
0c50: 73 75 70 70 6f 72 74 65 64 20 6a 6f 69 6e 20 74  supported join t
0c60: 79 70 65 20 69 73 20 73 65 65 6e 2c 20 74 68 65  ype is seen, the
0c70: 6e 20 73 74 69 6c 6c 20 72 65 74 75 72 6e 0a 2a  n still return.*
0c80: 2a 20 61 20 6a 6f 69 6e 20 74 79 70 65 2c 20 62  * a join type, b
0c90: 75 74 20 70 75 74 20 61 6e 20 65 72 72 6f 72 20  ut put an error 
0ca0: 69 6e 20 74 68 65 20 70 50 61 72 73 65 20 73 74  in the pParse st
0cb0: 72 75 63 74 75 72 65 2e 0a 2a 2f 0a 69 6e 74 20  ructure..*/.int 
0cc0: 73 71 6c 69 74 65 33 4a 6f 69 6e 54 79 70 65 28  sqlite3JoinType(
0cd0: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 54  Parse *pParse, T
0ce0: 6f 6b 65 6e 20 2a 70 41 2c 20 54 6f 6b 65 6e 20  oken *pA, Token 
0cf0: 2a 70 42 2c 20 54 6f 6b 65 6e 20 2a 70 43 29 7b  *pB, Token *pC){
0d00: 0a 20 20 69 6e 74 20 6a 6f 69 6e 74 79 70 65 20  .  int jointype 
0d10: 3d 20 30 3b 0a 20 20 54 6f 6b 65 6e 20 2a 61 70  = 0;.  Token *ap
0d20: 41 6c 6c 5b 33 5d 3b 0a 20 20 54 6f 6b 65 6e 20  All[3];.  Token 
0d30: 2a 70 3b 0a 20 20 73 74 61 74 69 63 20 63 6f 6e  *p;.  static con
0d40: 73 74 20 73 74 72 75 63 74 20 7b 0a 20 20 20 20  st struct {.    
0d50: 63 6f 6e 73 74 20 63 68 61 72 20 7a 4b 65 79 77  const char zKeyw
0d60: 6f 72 64 5b 38 5d 3b 0a 20 20 20 20 75 38 20 6e  ord[8];.    u8 n
0d70: 43 68 61 72 3b 0a 20 20 20 20 75 38 20 63 6f 64  Char;.    u8 cod
0d80: 65 3b 0a 20 20 7d 20 6b 65 79 77 6f 72 64 73 5b  e;.  } keywords[
0d90: 5d 20 3d 20 7b 0a 20 20 20 20 7b 20 22 6e 61 74  ] = {.    { "nat
0da0: 75 72 61 6c 22 2c 20 37 2c 20 4a 54 5f 4e 41 54  ural", 7, JT_NAT
0db0: 55 52 41 4c 20 7d 2c 0a 20 20 20 20 7b 20 22 6c  URAL },.    { "l
0dc0: 65 66 74 22 2c 20 20 20 20 34 2c 20 4a 54 5f 4c  eft",    4, JT_L
0dd0: 45 46 54 7c 4a 54 5f 4f 55 54 45 52 20 7d 2c 0a  EFT|JT_OUTER },.
0de0: 20 20 20 20 7b 20 22 72 69 67 68 74 22 2c 20 20      { "right",  
0df0: 20 35 2c 20 4a 54 5f 52 49 47 48 54 7c 4a 54 5f   5, JT_RIGHT|JT_
0e00: 4f 55 54 45 52 20 7d 2c 0a 20 20 20 20 7b 20 22  OUTER },.    { "
0e10: 66 75 6c 6c 22 2c 20 20 20 20 34 2c 20 4a 54 5f  full",    4, JT_
0e20: 4c 45 46 54 7c 4a 54 5f 52 49 47 48 54 7c 4a 54  LEFT|JT_RIGHT|JT
0e30: 5f 4f 55 54 45 52 20 7d 2c 0a 20 20 20 20 7b 20  _OUTER },.    { 
0e40: 22 6f 75 74 65 72 22 2c 20 20 20 35 2c 20 4a 54  "outer",   5, JT
0e50: 5f 4f 55 54 45 52 20 7d 2c 0a 20 20 20 20 7b 20  _OUTER },.    { 
0e60: 22 69 6e 6e 65 72 22 2c 20 20 20 35 2c 20 4a 54  "inner",   5, JT
0e70: 5f 49 4e 4e 45 52 20 7d 2c 0a 20 20 20 20 7b 20  _INNER },.    { 
0e80: 22 63 72 6f 73 73 22 2c 20 20 20 35 2c 20 4a 54  "cross",   5, JT
0e90: 5f 49 4e 4e 45 52 7c 4a 54 5f 43 52 4f 53 53 20  _INNER|JT_CROSS 
0ea0: 7d 2c 0a 20 20 7d 3b 0a 20 20 69 6e 74 20 69 2c  },.  };.  int i,
0eb0: 20 6a 3b 0a 20 20 61 70 41 6c 6c 5b 30 5d 20 3d   j;.  apAll[0] =
0ec0: 20 70 41 3b 0a 20 20 61 70 41 6c 6c 5b 31 5d 20   pA;.  apAll[1] 
0ed0: 3d 20 70 42 3b 0a 20 20 61 70 41 6c 6c 5b 32 5d  = pB;.  apAll[2]
0ee0: 20 3d 20 70 43 3b 0a 20 20 66 6f 72 28 69 3d 30   = pC;.  for(i=0
0ef0: 3b 20 69 3c 33 20 26 26 20 61 70 41 6c 6c 5b 69  ; i<3 && apAll[i
0f00: 5d 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 70 20 3d  ]; i++){.    p =
0f10: 20 61 70 41 6c 6c 5b 69 5d 3b 0a 20 20 20 20 66   apAll[i];.    f
0f20: 6f 72 28 6a 3d 30 3b 20 6a 3c 73 69 7a 65 6f 66  or(j=0; j<sizeof
0f30: 28 6b 65 79 77 6f 72 64 73 29 2f 73 69 7a 65 6f  (keywords)/sizeo
0f40: 66 28 6b 65 79 77 6f 72 64 73 5b 30 5d 29 3b 20  f(keywords[0]); 
0f50: 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20  j++){.      if( 
0f60: 70 2d 3e 6e 3d 3d 6b 65 79 77 6f 72 64 73 5b 6a  p->n==keywords[j
0f70: 5d 2e 6e 43 68 61 72 20 0a 20 20 20 20 20 20 20  ].nChar .       
0f80: 20 20 20 26 26 20 73 71 6c 69 74 65 33 53 74 72     && sqlite3Str
0f90: 4e 49 43 6d 70 28 28 63 68 61 72 2a 29 70 2d 3e  NICmp((char*)p->
0fa0: 7a 2c 20 6b 65 79 77 6f 72 64 73 5b 6a 5d 2e 7a  z, keywords[j].z
0fb0: 4b 65 79 77 6f 72 64 2c 20 70 2d 3e 6e 29 3d 3d  Keyword, p->n)==
0fc0: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 6a 6f 69  0 ){.        joi
0fd0: 6e 74 79 70 65 20 7c 3d 20 6b 65 79 77 6f 72 64  ntype |= keyword
0fe0: 73 5b 6a 5d 2e 63 6f 64 65 3b 0a 20 20 20 20 20  s[j].code;.     
0ff0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
1000: 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  }.    }.    if( 
1010: 6a 3e 3d 73 69 7a 65 6f 66 28 6b 65 79 77 6f 72  j>=sizeof(keywor
1020: 64 73 29 2f 73 69 7a 65 6f 66 28 6b 65 79 77 6f  ds)/sizeof(keywo
1030: 72 64 73 5b 30 5d 29 20 29 7b 0a 20 20 20 20 20  rds[0]) ){.     
1040: 20 6a 6f 69 6e 74 79 70 65 20 7c 3d 20 4a 54 5f   jointype |= JT_
1050: 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 62 72 65  ERROR;.      bre
1060: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  ak;.    }.  }.  
1070: 69 66 28 0a 20 20 20 20 20 28 6a 6f 69 6e 74 79  if(.     (jointy
1080: 70 65 20 26 20 28 4a 54 5f 49 4e 4e 45 52 7c 4a  pe & (JT_INNER|J
1090: 54 5f 4f 55 54 45 52 29 29 3d 3d 28 4a 54 5f 49  T_OUTER))==(JT_I
10a0: 4e 4e 45 52 7c 4a 54 5f 4f 55 54 45 52 29 20 7c  NNER|JT_OUTER) |
10b0: 7c 0a 20 20 20 20 20 28 6a 6f 69 6e 74 79 70 65  |.     (jointype
10c0: 20 26 20 4a 54 5f 45 52 52 4f 52 29 21 3d 30 0a   & JT_ERROR)!=0.
10d0: 20 20 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63    ){.    const c
10e0: 68 61 72 20 2a 7a 53 70 31 20 3d 20 22 20 22 3b  har *zSp1 = " ";
10f0: 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20  .    const char 
1100: 2a 7a 53 70 32 20 3d 20 22 20 22 3b 0a 20 20 20  *zSp2 = " ";.   
1110: 20 69 66 28 20 70 42 3d 3d 30 20 29 7b 20 7a 53   if( pB==0 ){ zS
1120: 70 31 2b 2b 3b 20 7d 0a 20 20 20 20 69 66 28 20  p1++; }.    if( 
1130: 70 43 3d 3d 30 20 29 7b 20 7a 53 70 32 2b 2b 3b  pC==0 ){ zSp2++;
1140: 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72   }.    sqlite3Er
1150: 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
1160: 75 6e 6b 6e 6f 77 6e 20 6f 72 20 75 6e 73 75 70  unknown or unsup
1170: 70 6f 72 74 65 64 20 6a 6f 69 6e 20 74 79 70 65  ported join type
1180: 3a 20 22 0a 20 20 20 20 20 20 20 22 25 54 25 73  : ".       "%T%s
1190: 25 54 25 73 25 54 22 2c 20 70 41 2c 20 7a 53 70  %T%s%T", pA, zSp
11a0: 31 2c 20 70 42 2c 20 7a 53 70 32 2c 20 70 43 29  1, pB, zSp2, pC)
11b0: 3b 0a 20 20 20 20 6a 6f 69 6e 74 79 70 65 20 3d  ;.    jointype =
11c0: 20 4a 54 5f 49 4e 4e 45 52 3b 0a 20 20 7d 65 6c   JT_INNER;.  }el
11d0: 73 65 20 69 66 28 20 6a 6f 69 6e 74 79 70 65 20  se if( jointype 
11e0: 26 20 4a 54 5f 52 49 47 48 54 20 29 7b 0a 20 20  & JT_RIGHT ){.  
11f0: 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
1200: 67 28 70 50 61 72 73 65 2c 20 0a 20 20 20 20 20  g(pParse, .     
1210: 20 22 52 49 47 48 54 20 61 6e 64 20 46 55 4c 4c   "RIGHT and FULL
1220: 20 4f 55 54 45 52 20 4a 4f 49 4e 73 20 61 72 65   OUTER JOINs are
1230: 20 6e 6f 74 20 63 75 72 72 65 6e 74 6c 79 20 73   not currently s
1240: 75 70 70 6f 72 74 65 64 22 29 3b 0a 20 20 20 20  upported");.    
1250: 6a 6f 69 6e 74 79 70 65 20 3d 20 4a 54 5f 49 4e  jointype = JT_IN
1260: 4e 45 52 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  NER;.  }.  retur
1270: 6e 20 6a 6f 69 6e 74 79 70 65 3b 0a 7d 0a 0a 2f  n jointype;.}../
1280: 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
1290: 69 6e 64 65 78 20 6f 66 20 61 20 63 6f 6c 75 6d  index of a colum
12a0: 6e 20 69 6e 20 61 20 74 61 62 6c 65 2e 20 20 52  n in a table.  R
12b0: 65 74 75 72 6e 20 2d 31 20 69 66 20 74 68 65 20  eturn -1 if the 
12c0: 63 6f 6c 75 6d 6e 0a 2a 2a 20 69 73 20 6e 6f 74  column.** is not
12d0: 20 63 6f 6e 74 61 69 6e 65 64 20 69 6e 20 74 68   contained in th
12e0: 65 20 74 61 62 6c 65 2e 0a 2a 2f 0a 73 74 61 74  e table..*/.stat
12f0: 69 63 20 69 6e 74 20 63 6f 6c 75 6d 6e 49 6e 64  ic int columnInd
1300: 65 78 28 54 61 62 6c 65 20 2a 70 54 61 62 2c 20  ex(Table *pTab, 
1310: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43 6f 6c  const char *zCol
1320: 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f  ){.  int i;.  fo
1330: 72 28 69 3d 30 3b 20 69 3c 70 54 61 62 2d 3e 6e  r(i=0; i<pTab->n
1340: 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69  Col; i++){.    i
1350: 66 28 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d  f( sqlite3StrICm
1360: 70 28 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 5d 2e  p(pTab->aCol[i].
1370: 7a 4e 61 6d 65 2c 20 7a 43 6f 6c 29 3d 3d 30 20  zName, zCol)==0 
1380: 29 20 72 65 74 75 72 6e 20 69 3b 0a 20 20 7d 0a  ) return i;.  }.
1390: 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a 7d 0a 0a    return -1;.}..
13a0: 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 76 61  /*.** Set the va
13b0: 6c 75 65 20 6f 66 20 61 20 74 6f 6b 65 6e 20 74  lue of a token t
13c0: 6f 20 61 20 27 5c 30 30 30 27 2d 74 65 72 6d 69  o a '\000'-termi
13d0: 6e 61 74 65 64 20 73 74 72 69 6e 67 2e 0a 2a 2f  nated string..*/
13e0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 65 74  .static void set
13f0: 54 6f 6b 65 6e 28 54 6f 6b 65 6e 20 2a 70 2c 20  Token(Token *p, 
1400: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 29 7b 0a  const char *z){.
1410: 20 20 70 2d 3e 7a 20 3d 20 28 75 38 2a 29 7a 3b    p->z = (u8*)z;
1420: 0a 20 20 70 2d 3e 6e 20 3d 20 7a 20 3f 20 73 74  .  p->n = z ? st
1430: 72 6c 65 6e 28 7a 29 20 3a 20 30 3b 0a 20 20 70  rlen(z) : 0;.  p
1440: 2d 3e 64 79 6e 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a  ->dyn = 0;.}../*
1450: 0a 2a 2a 20 53 65 74 20 74 68 65 20 74 6f 6b 65  .** Set the toke
1460: 6e 20 74 6f 20 74 68 65 20 64 6f 75 62 6c 65 2d  n to the double-
1470: 71 75 6f 74 65 64 20 61 6e 64 20 65 73 63 61 70  quoted and escap
1480: 65 64 20 76 65 72 73 69 6f 6e 20 6f 66 20 74 68  ed version of th
1490: 65 20 73 74 72 69 6e 67 20 70 6f 69 6e 74 65 64  e string pointed
14a0: 0a 2a 2a 20 74 6f 20 62 79 20 7a 2e 20 46 6f 72  .** to by z. For
14b0: 20 65 78 61 6d 70 6c 65 3b 0a 2a 2a 0a 2a 2a 20   example;.**.** 
14c0: 20 20 20 7b 61 22 62 63 7d 20 20 2d 3e 20 20 7b     {a"bc}  ->  {
14d0: 22 61 22 22 62 63 22 7d 0a 2a 2f 0a 73 74 61 74  "a""bc"}.*/.stat
14e0: 69 63 20 76 6f 69 64 20 73 65 74 51 75 6f 74 65  ic void setQuote
14f0: 64 54 6f 6b 65 6e 28 50 61 72 73 65 20 2a 70 50  dToken(Parse *pP
1500: 61 72 73 65 2c 20 54 6f 6b 65 6e 20 2a 70 2c 20  arse, Token *p, 
1510: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 29 7b 0a  const char *z){.
1520: 20 20 70 2d 3e 7a 20 3d 20 28 75 38 20 2a 29 73    p->z = (u8 *)s
1530: 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 30 2c  qlite3MPrintf(0,
1540: 20 22 5c 22 25 77 5c 22 22 2c 20 7a 29 3b 0a 20   "\"%w\"", z);. 
1550: 20 70 2d 3e 64 79 6e 20 3d 20 31 3b 0a 20 20 69   p->dyn = 1;.  i
1560: 66 28 20 70 2d 3e 7a 20 29 7b 0a 20 20 20 20 70  f( p->z ){.    p
1570: 2d 3e 6e 20 3d 20 73 74 72 6c 65 6e 28 28 63 68  ->n = strlen((ch
1580: 61 72 20 2a 29 70 2d 3e 7a 29 3b 0a 20 20 7d 65  ar *)p->z);.  }e
1590: 6c 73 65 7b 0a 20 20 20 20 70 50 61 72 73 65 2d  lse{.    pParse-
15a0: 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65  >db->mallocFaile
15b0: 64 20 3d 20 31 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  d = 1;.  }.}../*
15c0: 0a 2a 2a 20 43 72 65 61 74 65 20 61 6e 20 65 78  .** Create an ex
15d0: 70 72 65 73 73 69 6f 6e 20 6e 6f 64 65 20 66 6f  pression node fo
15e0: 72 20 61 6e 20 69 64 65 6e 74 69 66 69 65 72 20  r an identifier 
15f0: 77 69 74 68 20 74 68 65 20 6e 61 6d 65 20 6f 66  with the name of
1600: 20 7a 4e 61 6d 65 0a 2a 2f 0a 45 78 70 72 20 2a   zName.*/.Expr *
1610: 73 71 6c 69 74 65 33 43 72 65 61 74 65 49 64 45  sqlite3CreateIdE
1620: 78 70 72 28 50 61 72 73 65 20 2a 70 50 61 72 73  xpr(Parse *pPars
1630: 65 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  e, const char *z
1640: 4e 61 6d 65 29 7b 0a 20 20 54 6f 6b 65 6e 20 64  Name){.  Token d
1650: 75 6d 6d 79 3b 0a 20 20 73 65 74 54 6f 6b 65 6e  ummy;.  setToken
1660: 28 26 64 75 6d 6d 79 2c 20 7a 4e 61 6d 65 29 3b  (&dummy, zName);
1670: 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65  .  return sqlite
1680: 33 50 45 78 70 72 28 70 50 61 72 73 65 2c 20 54  3PExpr(pParse, T
1690: 4b 5f 49 44 2c 20 30 2c 20 30 2c 20 26 64 75 6d  K_ID, 0, 0, &dum
16a0: 6d 79 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 41  my);.}.../*.** A
16b0: 64 64 20 61 20 74 65 72 6d 20 74 6f 20 74 68 65  dd a term to the
16c0: 20 57 48 45 52 45 20 65 78 70 72 65 73 73 69 6f   WHERE expressio
16d0: 6e 20 69 6e 20 2a 70 70 45 78 70 72 20 74 68 61  n in *ppExpr tha
16e0: 74 20 72 65 71 75 69 72 65 73 20 74 68 65 0a 2a  t requires the.*
16f0: 2a 20 7a 43 6f 6c 20 63 6f 6c 75 6d 6e 20 74 6f  * zCol column to
1700: 20 62 65 20 65 71 75 61 6c 20 69 6e 20 74 68 65   be equal in the
1710: 20 74 77 6f 20 74 61 62 6c 65 73 20 70 54 61 62   two tables pTab
1720: 31 20 61 6e 64 20 70 54 61 62 32 2e 0a 2a 2f 0a  1 and pTab2..*/.
1730: 73 74 61 74 69 63 20 76 6f 69 64 20 61 64 64 57  static void addW
1740: 68 65 72 65 54 65 72 6d 28 0a 20 20 50 61 72 73  hereTerm(.  Pars
1750: 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20  e *pParse,      
1760: 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20       /* Parsing 
1770: 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 63 6f 6e  context */.  con
1780: 73 74 20 63 68 61 72 20 2a 7a 43 6f 6c 2c 20 20  st char *zCol,  
1790: 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66        /* Name of
17a0: 20 74 68 65 20 63 6f 6c 75 6d 6e 20 2a 2f 0a 20   the column */. 
17b0: 20 63 6f 6e 73 74 20 54 61 62 6c 65 20 2a 70 54   const Table *pT
17c0: 61 62 31 2c 20 20 20 20 20 20 2f 2a 20 46 69 72  ab1,      /* Fir
17d0: 73 74 20 74 61 62 6c 65 20 2a 2f 0a 20 20 63 6f  st table */.  co
17e0: 6e 73 74 20 63 68 61 72 20 2a 7a 41 6c 69 61 73  nst char *zAlias
17f0: 31 2c 20 20 20 20 20 2f 2a 20 41 6c 69 61 73 20  1,     /* Alias 
1800: 66 6f 72 20 66 69 72 73 74 20 74 61 62 6c 65 2e  for first table.
1810: 20 20 4d 61 79 20 62 65 20 4e 55 4c 4c 20 2a 2f    May be NULL */
1820: 0a 20 20 63 6f 6e 73 74 20 54 61 62 6c 65 20 2a  .  const Table *
1830: 70 54 61 62 32 2c 20 20 20 20 20 20 2f 2a 20 53  pTab2,      /* S
1840: 65 63 6f 6e 64 20 74 61 62 6c 65 20 2a 2f 0a 20  econd table */. 
1850: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 41 6c   const char *zAl
1860: 69 61 73 32 2c 20 20 20 20 20 2f 2a 20 41 6c 69  ias2,     /* Ali
1870: 61 73 20 66 6f 72 20 73 65 63 6f 6e 64 20 74 61  as for second ta
1880: 62 6c 65 2e 20 20 4d 61 79 20 62 65 20 4e 55 4c  ble.  May be NUL
1890: 4c 20 2a 2f 0a 20 20 69 6e 74 20 69 52 69 67 68  L */.  int iRigh
18a0: 74 4a 6f 69 6e 54 61 62 6c 65 2c 20 20 20 20 20  tJoinTable,     
18b0: 2f 2a 20 56 44 42 45 20 63 75 72 73 6f 72 20 66  /* VDBE cursor f
18c0: 6f 72 20 74 68 65 20 72 69 67 68 74 20 74 61 62  or the right tab
18d0: 6c 65 20 2a 2f 0a 20 20 45 78 70 72 20 2a 2a 70  le */.  Expr **p
18e0: 70 45 78 70 72 20 20 20 20 20 20 20 20 20 20 20  pExpr           
18f0: 20 2f 2a 20 41 64 64 20 74 68 65 20 65 71 75 61   /* Add the equa
1900: 6c 69 74 79 20 74 65 72 6d 20 74 6f 20 74 68 69  lity term to thi
1910: 73 20 65 78 70 72 65 73 73 69 6f 6e 20 2a 2f 0a  s expression */.
1920: 29 7b 0a 20 20 45 78 70 72 20 2a 70 45 31 61 2c  ){.  Expr *pE1a,
1930: 20 2a 70 45 31 62 2c 20 2a 70 45 31 63 3b 0a 20   *pE1b, *pE1c;. 
1940: 20 45 78 70 72 20 2a 70 45 32 61 2c 20 2a 70 45   Expr *pE2a, *pE
1950: 32 62 2c 20 2a 70 45 32 63 3b 0a 20 20 45 78 70  2b, *pE2c;.  Exp
1960: 72 20 2a 70 45 3b 0a 0a 20 20 70 45 31 61 20 3d  r *pE;..  pE1a =
1970: 20 73 71 6c 69 74 65 33 43 72 65 61 74 65 49 64   sqlite3CreateId
1980: 45 78 70 72 28 70 50 61 72 73 65 2c 20 7a 43 6f  Expr(pParse, zCo
1990: 6c 29 3b 0a 20 20 70 45 32 61 20 3d 20 73 71 6c  l);.  pE2a = sql
19a0: 69 74 65 33 43 72 65 61 74 65 49 64 45 78 70 72  ite3CreateIdExpr
19b0: 28 70 50 61 72 73 65 2c 20 7a 43 6f 6c 29 3b 0a  (pParse, zCol);.
19c0: 20 20 69 66 28 20 7a 41 6c 69 61 73 31 3d 3d 30    if( zAlias1==0
19d0: 20 29 7b 0a 20 20 20 20 7a 41 6c 69 61 73 31 20   ){.    zAlias1 
19e0: 3d 20 70 54 61 62 31 2d 3e 7a 4e 61 6d 65 3b 0a  = pTab1->zName;.
19f0: 20 20 7d 0a 20 20 70 45 31 62 20 3d 20 73 71 6c    }.  pE1b = sql
1a00: 69 74 65 33 43 72 65 61 74 65 49 64 45 78 70 72  ite3CreateIdExpr
1a10: 28 70 50 61 72 73 65 2c 20 7a 41 6c 69 61 73 31  (pParse, zAlias1
1a20: 29 3b 0a 20 20 69 66 28 20 7a 41 6c 69 61 73 32  );.  if( zAlias2
1a30: 3d 3d 30 20 29 7b 0a 20 20 20 20 7a 41 6c 69 61  ==0 ){.    zAlia
1a40: 73 32 20 3d 20 70 54 61 62 32 2d 3e 7a 4e 61 6d  s2 = pTab2->zNam
1a50: 65 3b 0a 20 20 7d 0a 20 20 70 45 32 62 20 3d 20  e;.  }.  pE2b = 
1a60: 73 71 6c 69 74 65 33 43 72 65 61 74 65 49 64 45  sqlite3CreateIdE
1a70: 78 70 72 28 70 50 61 72 73 65 2c 20 7a 41 6c 69  xpr(pParse, zAli
1a80: 61 73 32 29 3b 0a 20 20 70 45 31 63 20 3d 20 73  as2);.  pE1c = s
1a90: 71 6c 69 74 65 33 50 45 78 70 72 28 70 50 61 72  qlite3PExpr(pPar
1aa0: 73 65 2c 20 54 4b 5f 44 4f 54 2c 20 70 45 31 62  se, TK_DOT, pE1b
1ab0: 2c 20 70 45 31 61 2c 20 30 29 3b 0a 20 20 70 45  , pE1a, 0);.  pE
1ac0: 32 63 20 3d 20 73 71 6c 69 74 65 33 50 45 78 70  2c = sqlite3PExp
1ad0: 72 28 70 50 61 72 73 65 2c 20 54 4b 5f 44 4f 54  r(pParse, TK_DOT
1ae0: 2c 20 70 45 32 62 2c 20 70 45 32 61 2c 20 30 29  , pE2b, pE2a, 0)
1af0: 3b 0a 20 20 70 45 20 3d 20 73 71 6c 69 74 65 33  ;.  pE = sqlite3
1b00: 50 45 78 70 72 28 70 50 61 72 73 65 2c 20 54 4b  PExpr(pParse, TK
1b10: 5f 45 51 2c 20 70 45 31 63 2c 20 70 45 32 63 2c  _EQ, pE1c, pE2c,
1b20: 20 30 29 3b 0a 20 20 69 66 28 20 70 45 20 29 7b   0);.  if( pE ){
1b30: 0a 20 20 20 20 45 78 70 72 53 65 74 50 72 6f 70  .    ExprSetProp
1b40: 65 72 74 79 28 70 45 2c 20 45 50 5f 46 72 6f 6d  erty(pE, EP_From
1b50: 4a 6f 69 6e 29 3b 0a 20 20 20 20 70 45 2d 3e 69  Join);.    pE->i
1b60: 52 69 67 68 74 4a 6f 69 6e 54 61 62 6c 65 20 3d  RightJoinTable =
1b70: 20 69 52 69 67 68 74 4a 6f 69 6e 54 61 62 6c 65   iRightJoinTable
1b80: 3b 0a 20 20 7d 0a 20 20 2a 70 70 45 78 70 72 20  ;.  }.  *ppExpr 
1b90: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 41 6e 64  = sqlite3ExprAnd
1ba0: 28 70 50 61 72 73 65 2d 3e 64 62 2c 2a 70 70 45  (pParse->db,*ppE
1bb0: 78 70 72 2c 20 70 45 29 3b 0a 7d 0a 0a 2f 2a 0a  xpr, pE);.}../*.
1bc0: 2a 2a 20 53 65 74 20 74 68 65 20 45 50 5f 46 72  ** Set the EP_Fr
1bd0: 6f 6d 4a 6f 69 6e 20 70 72 6f 70 65 72 74 79 20  omJoin property 
1be0: 6f 6e 20 61 6c 6c 20 74 65 72 6d 73 20 6f 66 20  on all terms of 
1bf0: 74 68 65 20 67 69 76 65 6e 20 65 78 70 72 65 73  the given expres
1c00: 73 69 6f 6e 2e 0a 2a 2a 20 41 6e 64 20 73 65 74  sion..** And set
1c10: 20 74 68 65 20 45 78 70 72 2e 69 52 69 67 68 74   the Expr.iRight
1c20: 4a 6f 69 6e 54 61 62 6c 65 20 74 6f 20 69 54 61  JoinTable to iTa
1c30: 62 6c 65 20 66 6f 72 20 65 76 65 72 79 20 74 65  ble for every te
1c40: 72 6d 20 69 6e 20 74 68 65 0a 2a 2a 20 65 78 70  rm in the.** exp
1c50: 72 65 73 73 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54  ression..**.** T
1c60: 68 65 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 20 70  he EP_FromJoin p
1c70: 72 6f 70 65 72 74 79 20 69 73 20 75 73 65 64 20  roperty is used 
1c80: 6f 6e 20 74 65 72 6d 73 20 6f 66 20 61 6e 20 65  on terms of an e
1c90: 78 70 72 65 73 73 69 6f 6e 20 74 6f 20 74 65 6c  xpression to tel
1ca0: 6c 0a 2a 2a 20 74 68 65 20 4c 45 46 54 20 4f 55  l.** the LEFT OU
1cb0: 54 45 52 20 4a 4f 49 4e 20 70 72 6f 63 65 73 73  TER JOIN process
1cc0: 69 6e 67 20 6c 6f 67 69 63 20 74 68 61 74 20 74  ing logic that t
1cd0: 68 69 73 20 74 65 72 6d 20 69 73 20 70 61 72 74  his term is part
1ce0: 20 6f 66 20 74 68 65 0a 2a 2a 20 6a 6f 69 6e 20   of the.** join 
1cf0: 72 65 73 74 72 69 63 74 69 6f 6e 20 73 70 65 63  restriction spec
1d00: 69 66 69 65 64 20 69 6e 20 74 68 65 20 4f 4e 20  ified in the ON 
1d10: 6f 72 20 55 53 49 4e 47 20 63 6c 61 75 73 65 20  or USING clause 
1d20: 61 6e 64 20 6e 6f 74 20 61 20 70 61 72 74 0a 2a  and not a part.*
1d30: 2a 20 6f 66 20 74 68 65 20 6d 6f 72 65 20 67 65  * of the more ge
1d40: 6e 65 72 61 6c 20 57 48 45 52 45 20 63 6c 61 75  neral WHERE clau
1d50: 73 65 2e 20 20 54 68 65 73 65 20 74 65 72 6d 73  se.  These terms
1d60: 20 61 72 65 20 6d 6f 76 65 64 20 6f 76 65 72 20   are moved over 
1d70: 74 6f 20 74 68 65 0a 2a 2a 20 57 48 45 52 45 20  to the.** WHERE 
1d80: 63 6c 61 75 73 65 20 64 75 72 69 6e 67 20 6a 6f  clause during jo
1d90: 69 6e 20 70 72 6f 63 65 73 73 69 6e 67 20 62 75  in processing bu
1da0: 74 20 77 65 20 6e 65 65 64 20 74 6f 20 72 65 6d  t we need to rem
1db0: 65 6d 62 65 72 20 74 68 61 74 20 74 68 65 79 0a  ember that they.
1dc0: 2a 2a 20 6f 72 69 67 69 6e 61 74 65 64 20 69 6e  ** originated in
1dd0: 20 74 68 65 20 4f 4e 20 6f 72 20 55 53 49 4e 47   the ON or USING
1de0: 20 63 6c 61 75 73 65 2e 0a 2a 2a 0a 2a 2a 20 54   clause..**.** T
1df0: 68 65 20 45 78 70 72 2e 69 52 69 67 68 74 4a 6f  he Expr.iRightJo
1e00: 69 6e 54 61 62 6c 65 20 74 65 6c 6c 73 20 74 68  inTable tells th
1e10: 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 70  e WHERE clause p
1e20: 72 6f 63 65 73 73 69 6e 67 20 74 68 61 74 20 74  rocessing that t
1e30: 68 65 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e  he.** expression
1e40: 20 64 65 70 65 6e 64 73 20 6f 6e 20 74 61 62 6c   depends on tabl
1e50: 65 20 69 52 69 67 68 74 4a 6f 69 6e 54 61 62 6c  e iRightJoinTabl
1e60: 65 20 65 76 65 6e 20 69 66 20 74 68 61 74 20 74  e even if that t
1e70: 61 62 6c 65 20 69 73 20 6e 6f 74 0a 2a 2a 20 65  able is not.** e
1e80: 78 70 6c 69 63 69 74 6c 79 20 6d 65 6e 74 69 6f  xplicitly mentio
1e90: 6e 65 64 20 69 6e 20 74 68 65 20 65 78 70 72 65  ned in the expre
1ea0: 73 73 69 6f 6e 2e 20 20 54 68 61 74 20 69 6e 66  ssion.  That inf
1eb0: 6f 72 6d 61 74 69 6f 6e 20 69 73 20 6e 65 65 64  ormation is need
1ec0: 65 64 0a 2a 2a 20 66 6f 72 20 63 61 73 65 73 20  ed.** for cases 
1ed0: 6c 69 6b 65 20 74 68 69 73 3a 0a 2a 2a 0a 2a 2a  like this:.**.**
1ee0: 20 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f      SELECT * FRO
1ef0: 4d 20 74 31 20 4c 45 46 54 20 4a 4f 49 4e 20 74  M t1 LEFT JOIN t
1f00: 32 20 4f 4e 20 74 31 2e 61 3d 74 32 2e 62 20 41  2 ON t1.a=t2.b A
1f10: 4e 44 20 74 31 2e 78 3d 35 0a 2a 2a 0a 2a 2a 20  ND t1.x=5.**.** 
1f20: 54 68 65 20 77 68 65 72 65 20 63 6c 61 75 73 65  The where clause
1f30: 20 6e 65 65 64 73 20 74 6f 20 64 65 66 65 72 20   needs to defer 
1f40: 74 68 65 20 68 61 6e 64 6c 69 6e 67 20 6f 66 20  the handling of 
1f50: 74 68 65 20 74 31 2e 78 3d 35 0a 2a 2a 20 74 65  the t1.x=5.** te
1f60: 72 6d 20 75 6e 74 69 6c 20 61 66 74 65 72 20 74  rm until after t
1f70: 68 65 20 74 32 20 6c 6f 6f 70 20 6f 66 20 74 68  he t2 loop of th
1f80: 65 20 6a 6f 69 6e 2e 20 20 49 6e 20 74 68 61 74  e join.  In that
1f90: 20 77 61 79 2c 20 61 0a 2a 2a 20 4e 55 4c 4c 20   way, a.** NULL 
1fa0: 74 32 20 72 6f 77 20 77 69 6c 6c 20 62 65 20 69  t2 row will be i
1fb0: 6e 73 65 72 74 65 64 20 77 68 65 6e 65 76 65 72  nserted whenever
1fc0: 20 74 31 2e 78 21 3d 35 2e 20 20 49 66 20 77 65   t1.x!=5.  If we
1fd0: 20 64 6f 20 6e 6f 74 0a 2a 2a 20 64 65 66 65 72   do not.** defer
1fe0: 20 74 68 65 20 68 61 6e 64 6c 69 6e 67 20 6f 66   the handling of
1ff0: 20 74 31 2e 78 3d 35 2c 20 69 74 20 77 69 6c 6c   t1.x=5, it will
2000: 20 62 65 20 70 72 6f 63 65 73 73 65 64 20 69 6d   be processed im
2010: 6d 65 64 69 61 74 65 6c 79 0a 2a 2a 20 61 66 74  mediately.** aft
2020: 65 72 20 74 68 65 20 74 31 20 6c 6f 6f 70 20 61  er the t1 loop a
2030: 6e 64 20 72 6f 77 73 20 77 69 74 68 20 74 31 2e  nd rows with t1.
2040: 78 21 3d 35 20 77 69 6c 6c 20 6e 65 76 65 72 20  x!=5 will never 
2050: 61 70 70 65 61 72 20 69 6e 0a 2a 2a 20 74 68 65  appear in.** the
2060: 20 6f 75 74 70 75 74 2c 20 77 68 69 63 68 20 69   output, which i
2070: 73 20 69 6e 63 6f 72 72 65 63 74 2e 0a 2a 2f 0a  s incorrect..*/.
2080: 73 74 61 74 69 63 20 76 6f 69 64 20 73 65 74 4a  static void setJ
2090: 6f 69 6e 45 78 70 72 28 45 78 70 72 20 2a 70 2c  oinExpr(Expr *p,
20a0: 20 69 6e 74 20 69 54 61 62 6c 65 29 7b 0a 20 20   int iTable){.  
20b0: 77 68 69 6c 65 28 20 70 20 29 7b 0a 20 20 20 20  while( p ){.    
20c0: 45 78 70 72 53 65 74 50 72 6f 70 65 72 74 79 28  ExprSetProperty(
20d0: 70 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29 3b  p, EP_FromJoin);
20e0: 0a 20 20 20 20 70 2d 3e 69 52 69 67 68 74 4a 6f  .    p->iRightJo
20f0: 69 6e 54 61 62 6c 65 20 3d 20 69 54 61 62 6c 65  inTable = iTable
2100: 3b 0a 20 20 20 20 73 65 74 4a 6f 69 6e 45 78 70  ;.    setJoinExp
2110: 72 28 70 2d 3e 70 4c 65 66 74 2c 20 69 54 61 62  r(p->pLeft, iTab
2120: 6c 65 29 3b 0a 20 20 20 20 70 20 3d 20 70 2d 3e  le);.    p = p->
2130: 70 52 69 67 68 74 3b 0a 20 20 7d 20 0a 7d 0a 0a  pRight;.  } .}..
2140: 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
2150: 6e 65 20 70 72 6f 63 65 73 73 65 73 20 74 68 65  ne processes the
2160: 20 6a 6f 69 6e 20 69 6e 66 6f 72 6d 61 74 69 6f   join informatio
2170: 6e 20 66 6f 72 20 61 20 53 45 4c 45 43 54 20 73  n for a SELECT s
2180: 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 20 4f 4e 20  tatement..** ON 
2190: 61 6e 64 20 55 53 49 4e 47 20 63 6c 61 75 73 65  and USING clause
21a0: 73 20 61 72 65 20 63 6f 6e 76 65 72 74 65 64 20  s are converted 
21b0: 69 6e 74 6f 20 65 78 74 72 61 20 74 65 72 6d 73  into extra terms
21c0: 20 6f 66 20 74 68 65 20 57 48 45 52 45 20 63 6c   of the WHERE cl
21d0: 61 75 73 65 2e 0a 2a 2a 20 4e 41 54 55 52 41 4c  ause..** NATURAL
21e0: 20 6a 6f 69 6e 73 20 61 6c 73 6f 20 63 72 65 61   joins also crea
21f0: 74 65 20 65 78 74 72 61 20 57 48 45 52 45 20 63  te extra WHERE c
2200: 6c 61 75 73 65 20 74 65 72 6d 73 2e 0a 2a 2a 0a  lause terms..**.
2210: 2a 2a 20 54 68 65 20 74 65 72 6d 73 20 6f 66 20  ** The terms of 
2220: 61 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 61 72  a FROM clause ar
2230: 65 20 63 6f 6e 74 61 69 6e 65 64 20 69 6e 20 74  e contained in t
2240: 68 65 20 53 65 6c 65 63 74 2e 70 53 72 63 20 73  he Select.pSrc s
2250: 74 72 75 63 74 75 72 65 2e 0a 2a 2a 20 54 68 65  tructure..** The
2260: 20 6c 65 66 74 20 6d 6f 73 74 20 74 61 62 6c 65   left most table
2270: 20 69 73 20 74 68 65 20 66 69 72 73 74 20 65 6e   is the first en
2280: 74 72 79 20 69 6e 20 53 65 6c 65 63 74 2e 70 53  try in Select.pS
2290: 72 63 2e 20 20 54 68 65 20 72 69 67 68 74 2d 6d  rc.  The right-m
22a0: 6f 73 74 0a 2a 2a 20 74 61 62 6c 65 20 69 73 20  ost.** table is 
22b0: 74 68 65 20 6c 61 73 74 20 65 6e 74 72 79 2e 20  the last entry. 
22c0: 20 54 68 65 20 6a 6f 69 6e 20 6f 70 65 72 61 74   The join operat
22d0: 6f 72 20 69 73 20 68 65 6c 64 20 69 6e 20 74 68  or is held in th
22e0: 65 20 65 6e 74 72 79 20 74 6f 0a 2a 2a 20 74 68  e entry to.** th
22f0: 65 20 6c 65 66 74 2e 20 20 54 68 75 73 20 65 6e  e left.  Thus en
2300: 74 72 79 20 30 20 63 6f 6e 74 61 69 6e 73 20 74  try 0 contains t
2310: 68 65 20 6a 6f 69 6e 20 6f 70 65 72 61 74 6f 72  he join operator
2320: 20 66 6f 72 20 74 68 65 20 6a 6f 69 6e 20 62 65   for the join be
2330: 74 77 65 65 6e 0a 2a 2a 20 65 6e 74 72 69 65 73  tween.** entries
2340: 20 30 20 61 6e 64 20 31 2e 20 20 41 6e 79 20 4f   0 and 1.  Any O
2350: 4e 20 6f 72 20 55 53 49 4e 47 20 63 6c 61 75 73  N or USING claus
2360: 65 73 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  es associated wi
2370: 74 68 20 74 68 65 20 6a 6f 69 6e 20 61 72 65 0a  th the join are.
2380: 2a 2a 20 61 6c 73 6f 20 61 74 74 61 63 68 65 64  ** also attached
2390: 20 74 6f 20 74 68 65 20 6c 65 66 74 20 65 6e 74   to the left ent
23a0: 72 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  ry..**.** This r
23b0: 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73 20 74  outine returns t
23c0: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 65 72 72  he number of err
23d0: 6f 72 73 20 65 6e 63 6f 75 6e 74 65 72 65 64 2e  ors encountered.
23e0: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73  .*/.static int s
23f0: 71 6c 69 74 65 50 72 6f 63 65 73 73 4a 6f 69 6e  qliteProcessJoin
2400: 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
2410: 53 65 6c 65 63 74 20 2a 70 29 7b 0a 20 20 53 72  Select *p){.  Sr
2420: 63 4c 69 73 74 20 2a 70 53 72 63 3b 20 20 20 20  cList *pSrc;    
2430: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2440: 20 41 6c 6c 20 74 61 62 6c 65 73 20 69 6e 20 74   All tables in t
2450: 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 2a  he FROM clause *
2460: 2f 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 20 20 20  /.  int i, j;   
2470: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2480: 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e      /* Loop coun
2490: 74 65 72 73 20 2a 2f 0a 20 20 73 74 72 75 63 74  ters */.  struct
24a0: 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70   SrcList_item *p
24b0: 4c 65 66 74 3b 20 20 20 20 20 2f 2a 20 4c 65 66  Left;     /* Lef
24c0: 74 20 74 61 62 6c 65 20 62 65 69 6e 67 20 6a 6f  t table being jo
24d0: 69 6e 65 64 20 2a 2f 0a 20 20 73 74 72 75 63 74  ined */.  struct
24e0: 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70   SrcList_item *p
24f0: 52 69 67 68 74 3b 20 20 20 20 2f 2a 20 52 69 67  Right;    /* Rig
2500: 68 74 20 74 61 62 6c 65 20 62 65 69 6e 67 20 6a  ht table being j
2510: 6f 69 6e 65 64 20 2a 2f 0a 0a 20 20 70 53 72 63  oined */..  pSrc
2520: 20 3d 20 70 2d 3e 70 53 72 63 3b 0a 20 20 70 4c   = p->pSrc;.  pL
2530: 65 66 74 20 3d 20 26 70 53 72 63 2d 3e 61 5b 30  eft = &pSrc->a[0
2540: 5d 3b 0a 20 20 70 52 69 67 68 74 20 3d 20 26 70  ];.  pRight = &p
2550: 4c 65 66 74 5b 31 5d 3b 0a 20 20 66 6f 72 28 69  Left[1];.  for(i
2560: 3d 30 3b 20 69 3c 70 53 72 63 2d 3e 6e 53 72 63  =0; i<pSrc->nSrc
2570: 2d 31 3b 20 69 2b 2b 2c 20 70 52 69 67 68 74 2b  -1; i++, pRight+
2580: 2b 2c 20 70 4c 65 66 74 2b 2b 29 7b 0a 20 20 20  +, pLeft++){.   
2590: 20 54 61 62 6c 65 20 2a 70 4c 65 66 74 54 61 62   Table *pLeftTab
25a0: 20 3d 20 70 4c 65 66 74 2d 3e 70 54 61 62 3b 0a   = pLeft->pTab;.
25b0: 20 20 20 20 54 61 62 6c 65 20 2a 70 52 69 67 68      Table *pRigh
25c0: 74 54 61 62 20 3d 20 70 52 69 67 68 74 2d 3e 70  tTab = pRight->p
25d0: 54 61 62 3b 0a 0a 20 20 20 20 69 66 28 20 70 4c  Tab;..    if( pL
25e0: 65 66 74 54 61 62 3d 3d 30 20 7c 7c 20 70 52 69  eftTab==0 || pRi
25f0: 67 68 74 54 61 62 3d 3d 30 20 29 20 63 6f 6e 74  ghtTab==0 ) cont
2600: 69 6e 75 65 3b 0a 0a 20 20 20 20 2f 2a 20 57 68  inue;..    /* Wh
2610: 65 6e 20 74 68 65 20 4e 41 54 55 52 41 4c 20 6b  en the NATURAL k
2620: 65 79 77 6f 72 64 20 69 73 20 70 72 65 73 65 6e  eyword is presen
2630: 74 2c 20 61 64 64 20 57 48 45 52 45 20 63 6c 61  t, add WHERE cla
2640: 75 73 65 20 74 65 72 6d 73 20 66 6f 72 0a 20 20  use terms for.  
2650: 20 20 2a 2a 20 65 76 65 72 79 20 63 6f 6c 75 6d    ** every colum
2660: 6e 20 74 68 61 74 20 74 68 65 20 74 77 6f 20 74  n that the two t
2670: 61 62 6c 65 73 20 68 61 76 65 20 69 6e 20 63 6f  ables have in co
2680: 6d 6d 6f 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  mmon..    */.   
2690: 20 69 66 28 20 70 52 69 67 68 74 2d 3e 6a 6f 69   if( pRight->joi
26a0: 6e 74 79 70 65 20 26 20 4a 54 5f 4e 41 54 55 52  ntype & JT_NATUR
26b0: 41 4c 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  AL ){.      if( 
26c0: 70 52 69 67 68 74 2d 3e 70 4f 6e 20 7c 7c 20 70  pRight->pOn || p
26d0: 52 69 67 68 74 2d 3e 70 55 73 69 6e 67 20 29 7b  Right->pUsing ){
26e0: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
26f0: 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
2700: 20 22 61 20 4e 41 54 55 52 41 4c 20 6a 6f 69 6e   "a NATURAL join
2710: 20 6d 61 79 20 6e 6f 74 20 68 61 76 65 20 22 0a   may not have ".
2720: 20 20 20 20 20 20 20 20 20 20 20 22 61 6e 20 4f             "an O
2730: 4e 20 6f 72 20 55 53 49 4e 47 20 63 6c 61 75 73  N or USING claus
2740: 65 22 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20  e", 0);.        
2750: 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 20 20  return 1;.      
2760: 7d 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b  }.      for(j=0;
2770: 20 6a 3c 70 4c 65 66 74 54 61 62 2d 3e 6e 43 6f   j<pLeftTab->nCo
2780: 6c 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20  l; j++){.       
2790: 20 63 68 61 72 20 2a 7a 4e 61 6d 65 20 3d 20 70   char *zName = p
27a0: 4c 65 66 74 54 61 62 2d 3e 61 43 6f 6c 5b 6a 5d  LeftTab->aCol[j]
27b0: 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20 20 20  .zName;.        
27c0: 69 66 28 20 63 6f 6c 75 6d 6e 49 6e 64 65 78 28  if( columnIndex(
27d0: 70 52 69 67 68 74 54 61 62 2c 20 7a 4e 61 6d 65  pRightTab, zName
27e0: 29 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )>=0 ){.        
27f0: 20 20 61 64 64 57 68 65 72 65 54 65 72 6d 28 70    addWhereTerm(p
2800: 50 61 72 73 65 2c 20 7a 4e 61 6d 65 2c 20 70 4c  Parse, zName, pL
2810: 65 66 74 54 61 62 2c 20 70 4c 65 66 74 2d 3e 7a  eftTab, pLeft->z
2820: 41 6c 69 61 73 2c 20 0a 20 20 20 20 20 20 20 20  Alias, .        
2830: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2840: 20 20 20 20 20 20 70 52 69 67 68 74 54 61 62 2c        pRightTab,
2850: 20 70 52 69 67 68 74 2d 3e 7a 41 6c 69 61 73 2c   pRight->zAlias,
2860: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
2870: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
2880: 52 69 67 68 74 2d 3e 69 43 75 72 73 6f 72 2c 20  Right->iCursor, 
2890: 26 70 2d 3e 70 57 68 65 72 65 29 3b 0a 20 20 20  &p->pWhere);.   
28a0: 20 20 20 20 20 20 20 0a 20 20 20 20 20 20 20 20         .        
28b0: 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  }.      }.    }.
28c0: 0a 20 20 20 20 2f 2a 20 44 69 73 61 6c 6c 6f 77  .    /* Disallow
28d0: 20 62 6f 74 68 20 4f 4e 20 61 6e 64 20 55 53 49   both ON and USI
28e0: 4e 47 20 63 6c 61 75 73 65 73 20 69 6e 20 74 68  NG clauses in th
28f0: 65 20 73 61 6d 65 20 6a 6f 69 6e 0a 20 20 20 20  e same join.    
2900: 2a 2f 0a 20 20 20 20 69 66 28 20 70 52 69 67 68  */.    if( pRigh
2910: 74 2d 3e 70 4f 6e 20 26 26 20 70 52 69 67 68 74  t->pOn && pRight
2920: 2d 3e 70 55 73 69 6e 67 20 29 7b 0a 20 20 20 20  ->pUsing ){.    
2930: 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
2940: 67 28 70 50 61 72 73 65 2c 20 22 63 61 6e 6e 6f  g(pParse, "canno
2950: 74 20 68 61 76 65 20 62 6f 74 68 20 4f 4e 20 61  t have both ON a
2960: 6e 64 20 55 53 49 4e 47 20 22 0a 20 20 20 20 20  nd USING ".     
2970: 20 20 20 22 63 6c 61 75 73 65 73 20 69 6e 20 74     "clauses in t
2980: 68 65 20 73 61 6d 65 20 6a 6f 69 6e 22 29 3b 0a  he same join");.
2990: 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a        return 1;.
29a0: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 41 64      }..    /* Ad
29b0: 64 20 74 68 65 20 4f 4e 20 63 6c 61 75 73 65 20  d the ON clause 
29c0: 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68  to the end of th
29d0: 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 2c 20  e WHERE clause, 
29e0: 63 6f 6e 6e 65 63 74 65 64 20 62 79 0a 20 20 20  connected by.   
29f0: 20 2a 2a 20 61 6e 20 41 4e 44 20 6f 70 65 72 61   ** an AND opera
2a00: 74 6f 72 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  tor..    */.    
2a10: 69 66 28 20 70 52 69 67 68 74 2d 3e 70 4f 6e 20  if( pRight->pOn 
2a20: 29 7b 0a 20 20 20 20 20 20 73 65 74 4a 6f 69 6e  ){.      setJoin
2a30: 45 78 70 72 28 70 52 69 67 68 74 2d 3e 70 4f 6e  Expr(pRight->pOn
2a40: 2c 20 70 52 69 67 68 74 2d 3e 69 43 75 72 73 6f  , pRight->iCurso
2a50: 72 29 3b 0a 20 20 20 20 20 20 70 2d 3e 70 57 68  r);.      p->pWh
2a60: 65 72 65 20 3d 20 73 71 6c 69 74 65 33 45 78 70  ere = sqlite3Exp
2a70: 72 41 6e 64 28 70 50 61 72 73 65 2d 3e 64 62 2c  rAnd(pParse->db,
2a80: 20 70 2d 3e 70 57 68 65 72 65 2c 20 70 52 69 67   p->pWhere, pRig
2a90: 68 74 2d 3e 70 4f 6e 29 3b 0a 20 20 20 20 20 20  ht->pOn);.      
2aa0: 70 52 69 67 68 74 2d 3e 70 4f 6e 20 3d 20 30 3b  pRight->pOn = 0;
2ab0: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43  .    }..    /* C
2ac0: 72 65 61 74 65 20 65 78 74 72 61 20 74 65 72 6d  reate extra term
2ad0: 73 20 6f 6e 20 74 68 65 20 57 48 45 52 45 20 63  s on the WHERE c
2ae0: 6c 61 75 73 65 20 66 6f 72 20 65 61 63 68 20 63  lause for each c
2af0: 6f 6c 75 6d 6e 20 6e 61 6d 65 64 0a 20 20 20 20  olumn named.    
2b00: 2a 2a 20 69 6e 20 74 68 65 20 55 53 49 4e 47 20  ** in the USING 
2b10: 63 6c 61 75 73 65 2e 20 20 45 78 61 6d 70 6c 65  clause.  Example
2b20: 3a 20 49 66 20 74 68 65 20 74 77 6f 20 74 61 62  : If the two tab
2b30: 6c 65 73 20 74 6f 20 62 65 20 6a 6f 69 6e 65 64  les to be joined
2b40: 20 61 72 65 20 0a 20 20 20 20 2a 2a 20 41 20 61   are .    ** A a
2b50: 6e 64 20 42 20 61 6e 64 20 74 68 65 20 55 53 49  nd B and the USI
2b60: 4e 47 20 63 6c 61 75 73 65 20 6e 61 6d 65 73 20  NG clause names 
2b70: 58 2c 20 59 2c 20 61 6e 64 20 5a 2c 20 74 68 65  X, Y, and Z, the
2b80: 6e 20 61 64 64 20 74 68 69 73 0a 20 20 20 20 2a  n add this.    *
2b90: 2a 20 74 6f 20 74 68 65 20 57 48 45 52 45 20 63  * to the WHERE c
2ba0: 6c 61 75 73 65 3a 20 20 20 20 41 2e 58 3d 42 2e  lause:    A.X=B.
2bb0: 58 20 41 4e 44 20 41 2e 59 3d 42 2e 59 20 41 4e  X AND A.Y=B.Y AN
2bc0: 44 20 41 2e 5a 3d 42 2e 5a 0a 20 20 20 20 2a 2a  D A.Z=B.Z.    **
2bd0: 20 52 65 70 6f 72 74 20 61 6e 20 65 72 72 6f 72   Report an error
2be0: 20 69 66 20 61 6e 79 20 63 6f 6c 75 6d 6e 20 6d   if any column m
2bf0: 65 6e 74 69 6f 6e 65 64 20 69 6e 20 74 68 65 20  entioned in the 
2c00: 55 53 49 4e 47 20 63 6c 61 75 73 65 20 69 73 0a  USING clause is.
2c10: 20 20 20 20 2a 2a 20 6e 6f 74 20 63 6f 6e 74 61      ** not conta
2c20: 69 6e 65 64 20 69 6e 20 62 6f 74 68 20 74 61 62  ined in both tab
2c30: 6c 65 73 20 74 6f 20 62 65 20 6a 6f 69 6e 65 64  les to be joined
2c40: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
2c50: 20 70 52 69 67 68 74 2d 3e 70 55 73 69 6e 67 20   pRight->pUsing 
2c60: 29 7b 0a 20 20 20 20 20 20 49 64 4c 69 73 74 20  ){.      IdList 
2c70: 2a 70 4c 69 73 74 20 3d 20 70 52 69 67 68 74 2d  *pList = pRight-
2c80: 3e 70 55 73 69 6e 67 3b 0a 20 20 20 20 20 20 66  >pUsing;.      f
2c90: 6f 72 28 6a 3d 30 3b 20 6a 3c 70 4c 69 73 74 2d  or(j=0; j<pList-
2ca0: 3e 6e 49 64 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20  >nId; j++){.    
2cb0: 20 20 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 20      char *zName 
2cc0: 3d 20 70 4c 69 73 74 2d 3e 61 5b 6a 5d 2e 7a 4e  = pList->a[j].zN
2cd0: 61 6d 65 3b 0a 20 20 20 20 20 20 20 20 69 66 28  ame;.        if(
2ce0: 20 63 6f 6c 75 6d 6e 49 6e 64 65 78 28 70 4c 65   columnIndex(pLe
2cf0: 66 74 54 61 62 2c 20 7a 4e 61 6d 65 29 3c 30 20  ftTab, zName)<0 
2d00: 7c 7c 20 63 6f 6c 75 6d 6e 49 6e 64 65 78 28 70  || columnIndex(p
2d10: 52 69 67 68 74 54 61 62 2c 20 7a 4e 61 6d 65 29  RightTab, zName)
2d20: 3c 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  <0 ){.          
2d30: 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
2d40: 70 50 61 72 73 65 2c 20 22 63 61 6e 6e 6f 74 20  pParse, "cannot 
2d50: 6a 6f 69 6e 20 75 73 69 6e 67 20 63 6f 6c 75 6d  join using colum
2d60: 6e 20 25 73 20 2d 20 63 6f 6c 75 6d 6e 20 22 0a  n %s - column ".
2d70: 20 20 20 20 20 20 20 20 20 20 20 20 22 6e 6f 74              "not
2d80: 20 70 72 65 73 65 6e 74 20 69 6e 20 62 6f 74 68   present in both
2d90: 20 74 61 62 6c 65 73 22 2c 20 7a 4e 61 6d 65 29   tables", zName)
2da0: 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75  ;.          retu
2db0: 72 6e 20 31 3b 0a 20 20 20 20 20 20 20 20 7d 0a  rn 1;.        }.
2dc0: 20 20 20 20 20 20 20 20 61 64 64 57 68 65 72 65          addWhere
2dd0: 54 65 72 6d 28 70 50 61 72 73 65 2c 20 7a 4e 61  Term(pParse, zNa
2de0: 6d 65 2c 20 70 4c 65 66 74 54 61 62 2c 20 70 4c  me, pLeftTab, pL
2df0: 65 66 74 2d 3e 7a 41 6c 69 61 73 2c 20 0a 20 20  eft->zAlias, .  
2e00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e10: 20 20 20 20 20 20 20 20 20 20 70 52 69 67 68 74            pRight
2e20: 54 61 62 2c 20 70 52 69 67 68 74 2d 3e 7a 41 6c  Tab, pRight->zAl
2e30: 69 61 73 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ias,.           
2e40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e50: 20 70 52 69 67 68 74 2d 3e 69 43 75 72 73 6f 72   pRight->iCursor
2e60: 2c 20 26 70 2d 3e 70 57 68 65 72 65 29 3b 0a 20  , &p->pWhere);. 
2e70: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
2e80: 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a  .  return 0;.}..
2e90: 2f 2a 0a 2a 2a 20 49 6e 73 65 72 74 20 63 6f 64  /*.** Insert cod
2ea0: 65 20 69 6e 74 6f 20 22 76 22 20 74 68 61 74 20  e into "v" that 
2eb0: 77 69 6c 6c 20 70 75 73 68 20 74 68 65 20 72 65  will push the re
2ec0: 63 6f 72 64 20 6f 6e 20 74 68 65 20 74 6f 70 20  cord on the top 
2ed0: 6f 66 20 74 68 65 0a 2a 2a 20 73 74 61 63 6b 20  of the.** stack 
2ee0: 69 6e 74 6f 20 74 68 65 20 73 6f 72 74 65 72 2e  into the sorter.
2ef0: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
2f00: 70 75 73 68 4f 6e 74 6f 53 6f 72 74 65 72 28 0a  pushOntoSorter(.
2f10: 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
2f20: 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73           /* Pars
2f30: 65 72 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  er context */.  
2f40: 45 78 70 72 4c 69 73 74 20 2a 70 4f 72 64 65 72  ExprList *pOrder
2f50: 42 79 2c 20 20 20 20 2f 2a 20 54 68 65 20 4f 52  By,    /* The OR
2f60: 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 2a 2f  DER BY clause */
2f70: 0a 20 20 53 65 6c 65 63 74 20 2a 70 53 65 6c 65  .  Select *pSele
2f80: 63 74 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65  ct        /* The
2f90: 20 77 68 6f 6c 65 20 53 45 4c 45 43 54 20 73 74   whole SELECT st
2fa0: 61 74 65 6d 65 6e 74 20 2a 2f 0a 29 7b 0a 20 20  atement */.){.  
2fb0: 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65  Vdbe *v = pParse
2fc0: 2d 3e 70 56 64 62 65 3b 0a 20 20 73 71 6c 69 74  ->pVdbe;.  sqlit
2fd0: 65 33 45 78 70 72 43 6f 64 65 45 78 70 72 4c 69  e3ExprCodeExprLi
2fe0: 73 74 28 70 50 61 72 73 65 2c 20 70 4f 72 64 65  st(pParse, pOrde
2ff0: 72 42 79 29 3b 0a 20 20 73 71 6c 69 74 65 33 56  rBy);.  sqlite3V
3000: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 53  dbeAddOp(v, OP_S
3010: 65 71 75 65 6e 63 65 2c 20 70 4f 72 64 65 72 42  equence, pOrderB
3020: 79 2d 3e 69 45 43 75 72 73 6f 72 2c 20 30 29 3b  y->iECursor, 0);
3030: 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  .  sqlite3VdbeAd
3040: 64 4f 70 28 76 2c 20 4f 50 5f 50 75 6c 6c 2c 20  dOp(v, OP_Pull, 
3050: 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 20  pOrderBy->nExpr 
3060: 2b 20 31 2c 20 30 29 3b 0a 20 20 73 71 6c 69 74  + 1, 0);.  sqlit
3070: 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
3080: 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20 70 4f  P_MakeRecord, pO
3090: 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 20 2b 20  rderBy->nExpr + 
30a0: 32 2c 20 30 29 3b 0a 20 20 73 71 6c 69 74 65 33  2, 0);.  sqlite3
30b0: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
30c0: 49 64 78 49 6e 73 65 72 74 2c 20 70 4f 72 64 65  IdxInsert, pOrde
30d0: 72 42 79 2d 3e 69 45 43 75 72 73 6f 72 2c 20 30  rBy->iECursor, 0
30e0: 29 3b 0a 20 20 69 66 28 20 70 53 65 6c 65 63 74  );.  if( pSelect
30f0: 2d 3e 69 4c 69 6d 69 74 3e 3d 30 20 29 7b 0a 20  ->iLimit>=0 ){. 
3100: 20 20 20 69 6e 74 20 61 64 64 72 31 2c 20 61 64     int addr1, ad
3110: 64 72 32 3b 0a 20 20 20 20 61 64 64 72 31 20 3d  dr2;.    addr1 =
3120: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
3130: 70 28 76 2c 20 4f 50 5f 49 66 4d 65 6d 5a 65 72  p(v, OP_IfMemZer
3140: 6f 2c 20 70 53 65 6c 65 63 74 2d 3e 69 4c 69 6d  o, pSelect->iLim
3150: 69 74 2b 31 2c 20 30 29 3b 0a 20 20 20 20 73 71  it+1, 0);.    sq
3160: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
3170: 2c 20 4f 50 5f 4d 65 6d 49 6e 63 72 2c 20 2d 31  , OP_MemIncr, -1
3180: 2c 20 70 53 65 6c 65 63 74 2d 3e 69 4c 69 6d 69  , pSelect->iLimi
3190: 74 2b 31 29 3b 0a 20 20 20 20 61 64 64 72 32 20  t+1);.    addr2 
31a0: 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  = sqlite3VdbeAdd
31b0: 4f 70 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30  Op(v, OP_Goto, 0
31c0: 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  , 0);.    sqlite
31d0: 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c  3VdbeJumpHere(v,
31e0: 20 61 64 64 72 31 29 3b 0a 20 20 20 20 73 71 6c   addr1);.    sql
31f0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
3200: 20 4f 50 5f 4c 61 73 74 2c 20 70 4f 72 64 65 72   OP_Last, pOrder
3210: 42 79 2d 3e 69 45 43 75 72 73 6f 72 2c 20 30 29  By->iECursor, 0)
3220: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
3230: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 44 65 6c  eAddOp(v, OP_Del
3240: 65 74 65 2c 20 70 4f 72 64 65 72 42 79 2d 3e 69  ete, pOrderBy->i
3250: 45 43 75 72 73 6f 72 2c 20 30 29 3b 0a 20 20 20  ECursor, 0);.   
3260: 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70   sqlite3VdbeJump
3270: 48 65 72 65 28 76 2c 20 61 64 64 72 32 29 3b 0a  Here(v, addr2);.
3280: 20 20 20 20 70 53 65 6c 65 63 74 2d 3e 69 4c 69      pSelect->iLi
3290: 6d 69 74 20 3d 20 2d 31 3b 0a 20 20 7d 0a 7d 0a  mit = -1;.  }.}.
32a0: 0a 2f 2a 0a 2a 2a 20 41 64 64 20 63 6f 64 65 20  ./*.** Add code 
32b0: 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 74 68 65  to implement the
32c0: 20 4f 46 46 53 45 54 0a 2a 2f 0a 73 74 61 74 69   OFFSET.*/.stati
32d0: 63 20 76 6f 69 64 20 63 6f 64 65 4f 66 66 73 65  c void codeOffse
32e0: 74 28 0a 20 20 56 64 62 65 20 2a 76 2c 20 20 20  t(.  Vdbe *v,   
32f0: 20 20 20 20 20 20 20 2f 2a 20 47 65 6e 65 72 61         /* Genera
3300: 74 65 20 63 6f 64 65 20 69 6e 74 6f 20 74 68 69  te code into thi
3310: 73 20 56 4d 20 2a 2f 0a 20 20 53 65 6c 65 63 74  s VM */.  Select
3320: 20 2a 70 2c 20 20 20 20 20 20 20 20 2f 2a 20 54   *p,        /* T
3330: 68 65 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d  he SELECT statem
3340: 65 6e 74 20 62 65 69 6e 67 20 63 6f 64 65 64 20  ent being coded 
3350: 2a 2f 0a 20 20 69 6e 74 20 69 43 6f 6e 74 69 6e  */.  int iContin
3360: 75 65 2c 20 20 20 20 2f 2a 20 4a 75 6d 70 20 68  ue,    /* Jump h
3370: 65 72 65 20 74 6f 20 73 6b 69 70 20 74 68 65 20  ere to skip the 
3380: 63 75 72 72 65 6e 74 20 72 65 63 6f 72 64 20 2a  current record *
3390: 2f 0a 20 20 69 6e 74 20 6e 50 6f 70 20 20 20 20  /.  int nPop    
33a0: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
33b0: 6f 66 20 74 69 6d 65 73 20 74 6f 20 70 6f 70 20  of times to pop 
33c0: 73 74 61 63 6b 20 77 68 65 6e 20 6a 75 6d 70 69  stack when jumpi
33d0: 6e 67 20 2a 2f 0a 29 7b 0a 20 20 69 66 28 20 70  ng */.){.  if( p
33e0: 2d 3e 69 4f 66 66 73 65 74 3e 3d 30 20 26 26 20  ->iOffset>=0 && 
33f0: 69 43 6f 6e 74 69 6e 75 65 21 3d 30 20 29 7b 0a  iContinue!=0 ){.
3400: 20 20 20 20 69 6e 74 20 61 64 64 72 3b 0a 20 20      int addr;.  
3410: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
3420: 4f 70 28 76 2c 20 4f 50 5f 4d 65 6d 49 6e 63 72  Op(v, OP_MemIncr
3430: 2c 20 2d 31 2c 20 70 2d 3e 69 4f 66 66 73 65 74  , -1, p->iOffset
3440: 29 3b 0a 20 20 20 20 61 64 64 72 20 3d 20 73 71  );.    addr = sq
3450: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
3460: 2c 20 4f 50 5f 49 66 4d 65 6d 4e 65 67 2c 20 70  , OP_IfMemNeg, p
3470: 2d 3e 69 4f 66 66 73 65 74 2c 20 30 29 3b 0a 20  ->iOffset, 0);. 
3480: 20 20 20 69 66 28 20 6e 50 6f 70 3e 30 20 29 7b     if( nPop>0 ){
3490: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
34a0: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 50 6f  beAddOp(v, OP_Po
34b0: 70 2c 20 6e 50 6f 70 2c 20 30 29 3b 0a 20 20 20  p, nPop, 0);.   
34c0: 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64   }.    sqlite3Vd
34d0: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 47 6f  beAddOp(v, OP_Go
34e0: 74 6f 2c 20 30 2c 20 69 43 6f 6e 74 69 6e 75 65  to, 0, iContinue
34f0: 29 3b 0a 20 20 20 20 56 64 62 65 43 6f 6d 6d 65  );.    VdbeComme
3500: 6e 74 28 28 76 2c 20 22 23 20 73 6b 69 70 20 4f  nt((v, "# skip O
3510: 46 46 53 45 54 20 72 65 63 6f 72 64 73 22 29 29  FFSET records"))
3520: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
3530: 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64  eJumpHere(v, add
3540: 72 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  r);.  }.}../*.**
3550: 20 41 64 64 20 63 6f 64 65 20 74 68 61 74 20 77   Add code that w
3560: 69 6c 6c 20 63 68 65 63 6b 20 74 6f 20 6d 61 6b  ill check to mak
3570: 65 20 73 75 72 65 20 74 68 65 20 74 6f 70 20 4e  e sure the top N
3580: 20 65 6c 65 6d 65 6e 74 73 20 6f 66 20 74 68 65   elements of the
3590: 0a 2a 2a 20 73 74 61 63 6b 20 61 72 65 20 64 69  .** stack are di
35a0: 73 74 69 6e 63 74 2e 20 20 69 54 61 62 20 69 73  stinct.  iTab is
35b0: 20 61 20 73 6f 72 74 69 6e 67 20 69 6e 64 65 78   a sorting index
35c0: 20 74 68 61 74 20 68 6f 6c 64 73 20 70 72 65 76   that holds prev
35d0: 69 6f 75 73 6c 79 0a 2a 2a 20 73 65 65 6e 20 63  iously.** seen c
35e0: 6f 6d 62 69 6e 61 74 69 6f 6e 73 20 6f 66 20 74  ombinations of t
35f0: 68 65 20 4e 20 76 61 6c 75 65 73 2e 20 20 41 20  he N values.  A 
3600: 6e 65 77 20 65 6e 74 72 79 20 69 73 20 6d 61 64  new entry is mad
3610: 65 20 69 6e 20 69 54 61 62 0a 2a 2a 20 69 66 20  e in iTab.** if 
3620: 74 68 65 20 63 75 72 72 65 6e 74 20 4e 20 76 61  the current N va
3630: 6c 75 65 73 20 61 72 65 20 6e 65 77 2e 0a 2a 2a  lues are new..**
3640: 0a 2a 2a 20 41 20 6a 75 6d 70 20 74 6f 20 61 64  .** A jump to ad
3650: 64 72 52 65 70 65 61 74 20 69 73 20 6d 61 64 65  drRepeat is made
3660: 20 61 6e 64 20 74 68 65 20 4e 2b 31 20 76 61 6c   and the N+1 val
3670: 75 65 73 20 61 72 65 20 70 6f 70 70 65 64 20 66  ues are popped f
3680: 72 6f 6d 20 74 68 65 0a 2a 2a 20 73 74 61 63 6b  rom the.** stack
3690: 20 69 66 20 74 68 65 20 74 6f 70 20 4e 20 65 6c   if the top N el
36a0: 65 6d 65 6e 74 73 20 61 72 65 20 6e 6f 74 20 64  ements are not d
36b0: 69 73 74 69 6e 63 74 2e 0a 2a 2f 0a 73 74 61 74  istinct..*/.stat
36c0: 69 63 20 76 6f 69 64 20 63 6f 64 65 44 69 73 74  ic void codeDist
36d0: 69 6e 63 74 28 0a 20 20 56 64 62 65 20 2a 76 2c  inct(.  Vdbe *v,
36e0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 47 65             /* Ge
36f0: 6e 65 72 61 74 65 20 63 6f 64 65 20 69 6e 74 6f  nerate code into
3700: 20 74 68 69 73 20 56 4d 20 2a 2f 0a 20 20 69 6e   this VM */.  in
3710: 74 20 69 54 61 62 2c 20 20 20 20 20 20 20 20 20  t iTab,         
3720: 20 2f 2a 20 41 20 73 6f 72 74 69 6e 67 20 69 6e   /* A sorting in
3730: 64 65 78 20 75 73 65 64 20 74 6f 20 74 65 73 74  dex used to test
3740: 20 66 6f 72 20 64 69 73 74 69 6e 63 74 6e 65 73   for distinctnes
3750: 73 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 52  s */.  int addrR
3760: 65 70 65 61 74 2c 20 20 20 20 2f 2a 20 4a 75 6d  epeat,    /* Jum
3770: 70 20 74 6f 20 68 65 72 65 20 69 66 20 6e 6f 74  p to here if not
3780: 20 64 69 73 74 69 6e 63 74 20 2a 2f 0a 20 20 69   distinct */.  i
3790: 6e 74 20 4e 20 20 20 20 20 20 20 20 20 20 20 20  nt N            
37a0: 20 20 2f 2a 20 54 68 65 20 74 6f 70 20 4e 20 65    /* The top N e
37b0: 6c 65 6d 65 6e 74 73 20 6f 66 20 74 68 65 20 73  lements of the s
37c0: 74 61 63 6b 20 6d 75 73 74 20 62 65 20 64 69 73  tack must be dis
37d0: 74 69 6e 63 74 20 2a 2f 0a 29 7b 0a 20 20 73 71  tinct */.){.  sq
37e0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
37f0: 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c  , OP_MakeRecord,
3800: 20 2d 4e 2c 20 30 29 3b 0a 20 20 73 71 6c 69 74   -N, 0);.  sqlit
3810: 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
3820: 50 5f 44 69 73 74 69 6e 63 74 2c 20 69 54 61 62  P_Distinct, iTab
3830: 2c 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72  , sqlite3VdbeCur
3840: 72 65 6e 74 41 64 64 72 28 76 29 2b 33 29 3b 0a  rentAddr(v)+3);.
3850: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
3860: 4f 70 28 76 2c 20 4f 50 5f 50 6f 70 2c 20 4e 2b  Op(v, OP_Pop, N+
3870: 31 2c 20 30 29 3b 0a 20 20 73 71 6c 69 74 65 33  1, 0);.  sqlite3
3880: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
3890: 47 6f 74 6f 2c 20 30 2c 20 61 64 64 72 52 65 70  Goto, 0, addrRep
38a0: 65 61 74 29 3b 0a 20 20 56 64 62 65 43 6f 6d 6d  eat);.  VdbeComm
38b0: 65 6e 74 28 28 76 2c 20 22 23 20 73 6b 69 70 20  ent((v, "# skip 
38c0: 69 6e 64 69 73 74 69 6e 63 74 20 72 65 63 6f 72  indistinct recor
38d0: 64 73 22 29 29 3b 0a 20 20 73 71 6c 69 74 65 33  ds"));.  sqlite3
38e0: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
38f0: 49 64 78 49 6e 73 65 72 74 2c 20 69 54 61 62 2c  IdxInsert, iTab,
3900: 20 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65   0);.}../*.** Ge
3910: 6e 65 72 61 74 65 20 61 6e 20 65 72 72 6f 72 20  nerate an error 
3920: 6d 65 73 73 61 67 65 20 77 68 65 6e 20 61 20 53  message when a S
3930: 45 4c 45 43 54 20 69 73 20 75 73 65 64 20 77 69  ELECT is used wi
3940: 74 68 69 6e 20 61 20 73 75 62 65 78 70 72 65 73  thin a subexpres
3950: 73 69 6f 6e 0a 2a 2a 20 28 65 78 61 6d 70 6c 65  sion.** (example
3960: 3a 20 20 22 61 20 49 4e 20 28 53 45 4c 45 43 54  :  "a IN (SELECT
3970: 20 2a 20 46 52 4f 4d 20 74 61 62 6c 65 29 22 29   * FROM table)")
3980: 20 62 75 74 20 69 74 20 68 61 73 20 6d 6f 72 65   but it has more
3990: 20 74 68 61 6e 20 31 20 72 65 73 75 6c 74 0a 2a   than 1 result.*
39a0: 2a 20 63 6f 6c 75 6d 6e 2e 20 20 57 65 20 64 6f  * column.  We do
39b0: 20 74 68 69 73 20 69 6e 20 61 20 73 75 62 72 6f   this in a subro
39c0: 75 74 69 6e 65 20 62 65 63 61 75 73 65 20 74 68  utine because th
39d0: 65 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 69  e error occurs i
39e0: 6e 20 6d 75 6c 74 69 70 6c 65 0a 2a 2a 20 70 6c  n multiple.** pl
39f0: 61 63 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  aces..*/.static 
3a00: 69 6e 74 20 63 68 65 63 6b 46 6f 72 4d 75 6c 74  int checkForMult
3a10: 69 43 6f 6c 75 6d 6e 53 65 6c 65 63 74 45 72 72  iColumnSelectErr
3a20: 6f 72 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  or(Parse *pParse
3a30: 2c 20 69 6e 74 20 65 44 65 73 74 2c 20 69 6e 74  , int eDest, int
3a40: 20 6e 45 78 70 72 29 7b 0a 20 20 69 66 28 20 6e   nExpr){.  if( n
3a50: 45 78 70 72 3e 31 20 26 26 20 28 65 44 65 73 74  Expr>1 && (eDest
3a60: 3d 3d 53 52 54 5f 4d 65 6d 20 7c 7c 20 65 44 65  ==SRT_Mem || eDe
3a70: 73 74 3d 3d 53 52 54 5f 53 65 74 29 20 29 7b 0a  st==SRT_Set) ){.
3a80: 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
3a90: 4d 73 67 28 70 50 61 72 73 65 2c 20 22 6f 6e 6c  Msg(pParse, "onl
3aa0: 79 20 61 20 73 69 6e 67 6c 65 20 72 65 73 75 6c  y a single resul
3ab0: 74 20 61 6c 6c 6f 77 65 64 20 66 6f 72 20 22 0a  t allowed for ".
3ac0: 20 20 20 20 20 20 20 22 61 20 53 45 4c 45 43 54         "a SELECT
3ad0: 20 74 68 61 74 20 69 73 20 70 61 72 74 20 6f 66   that is part of
3ae0: 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 22 29   an expression")
3af0: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a  ;.    return 1;.
3b00: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65 74    }else{.    ret
3b10: 75 72 6e 20 30 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  urn 0;.  }.}../*
3b20: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
3b30: 20 67 65 6e 65 72 61 74 65 73 20 74 68 65 20 63   generates the c
3b40: 6f 64 65 20 66 6f 72 20 74 68 65 20 69 6e 73 69  ode for the insi
3b50: 64 65 20 6f 66 20 74 68 65 20 69 6e 6e 65 72 20  de of the inner 
3b60: 6c 6f 6f 70 0a 2a 2a 20 6f 66 20 61 20 53 45 4c  loop.** of a SEL
3b70: 45 43 54 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 73 72  ECT..**.** If sr
3b80: 63 54 61 62 20 61 6e 64 20 6e 43 6f 6c 75 6d 6e  cTab and nColumn
3b90: 20 61 72 65 20 62 6f 74 68 20 7a 65 72 6f 2c 20   are both zero, 
3ba0: 74 68 65 6e 20 74 68 65 20 70 45 4c 69 73 74 20  then the pEList 
3bb0: 65 78 70 72 65 73 73 69 6f 6e 73 0a 2a 2a 20 61  expressions.** a
3bc0: 72 65 20 65 76 61 6c 75 61 74 65 64 20 69 6e 20  re evaluated in 
3bd0: 6f 72 64 65 72 20 74 6f 20 67 65 74 20 74 68 65  order to get the
3be0: 20 64 61 74 61 20 66 6f 72 20 74 68 69 73 20 72   data for this r
3bf0: 6f 77 2e 20 20 49 66 20 6e 43 6f 6c 75 6d 6e 3e  ow.  If nColumn>
3c00: 30 0a 2a 2a 20 74 68 65 6e 20 64 61 74 61 20 69  0.** then data i
3c10: 73 20 70 75 6c 6c 65 64 20 66 72 6f 6d 20 73 72  s pulled from sr
3c20: 63 54 61 62 20 61 6e 64 20 70 45 4c 69 73 74 20  cTab and pEList 
3c30: 69 73 20 75 73 65 64 20 6f 6e 6c 79 20 74 6f 20  is used only to 
3c40: 67 65 74 20 74 68 65 0a 2a 2a 20 64 61 74 61 74  get the.** datat
3c50: 79 70 65 73 20 66 6f 72 20 65 61 63 68 20 63 6f  ypes for each co
3c60: 6c 75 6d 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  lumn..*/.static 
3c70: 69 6e 74 20 73 65 6c 65 63 74 49 6e 6e 65 72 4c  int selectInnerL
3c80: 6f 6f 70 28 0a 20 20 50 61 72 73 65 20 2a 70 50  oop(.  Parse *pP
3c90: 61 72 73 65 2c 20 20 20 20 20 20 20 20 20 20 2f  arse,          /
3ca0: 2a 20 54 68 65 20 70 61 72 73 65 72 20 63 6f 6e  * The parser con
3cb0: 74 65 78 74 20 2a 2f 0a 20 20 53 65 6c 65 63 74  text */.  Select
3cc0: 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20   *p,            
3cd0: 20 20 2f 2a 20 54 68 65 20 63 6f 6d 70 6c 65 74    /* The complet
3ce0: 65 20 73 65 6c 65 63 74 20 73 74 61 74 65 6d 65  e select stateme
3cf0: 6e 74 20 62 65 69 6e 67 20 63 6f 64 65 64 20 2a  nt being coded *
3d00: 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45  /.  ExprList *pE
3d10: 4c 69 73 74 2c 20 20 20 20 20 20 20 2f 2a 20 4c  List,       /* L
3d20: 69 73 74 20 6f 66 20 76 61 6c 75 65 73 20 62 65  ist of values be
3d30: 69 6e 67 20 65 78 74 72 61 63 74 65 64 20 2a 2f  ing extracted */
3d40: 0a 20 20 69 6e 74 20 73 72 63 54 61 62 2c 20 20  .  int srcTab,  
3d50: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 75             /* Pu
3d60: 6c 6c 20 64 61 74 61 20 66 72 6f 6d 20 74 68 69  ll data from thi
3d70: 73 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74  s table */.  int
3d80: 20 6e 43 6f 6c 75 6d 6e 2c 20 20 20 20 20 20 20   nColumn,       
3d90: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
3da0: 66 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65  f columns in the
3db0: 20 73 6f 75 72 63 65 20 74 61 62 6c 65 20 2a 2f   source table */
3dc0: 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4f 72  .  ExprList *pOr
3dd0: 64 65 72 42 79 2c 20 20 20 20 20 2f 2a 20 49 66  derBy,     /* If
3de0: 20 6e 6f 74 20 4e 55 4c 4c 2c 20 73 6f 72 74 20   not NULL, sort 
3df0: 72 65 73 75 6c 74 73 20 75 73 69 6e 67 20 74 68  results using th
3e00: 69 73 20 6b 65 79 20 2a 2f 0a 20 20 69 6e 74 20  is key */.  int 
3e10: 64 69 73 74 69 6e 63 74 2c 20 20 20 20 20 20 20  distinct,       
3e20: 20 20 20 20 2f 2a 20 49 66 20 3e 3d 30 2c 20 6d      /* If >=0, m
3e30: 61 6b 65 20 73 75 72 65 20 72 65 73 75 6c 74 73  ake sure results
3e40: 20 61 72 65 20 64 69 73 74 69 6e 63 74 20 2a 2f   are distinct */
3e50: 0a 20 20 69 6e 74 20 65 44 65 73 74 2c 20 20 20  .  int eDest,   
3e60: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 48 6f             /* Ho
3e70: 77 20 74 6f 20 64 69 73 70 6f 73 65 20 6f 66 20  w to dispose of 
3e80: 74 68 65 20 72 65 73 75 6c 74 73 20 2a 2f 0a 20  the results */. 
3e90: 20 69 6e 74 20 69 50 61 72 6d 2c 20 20 20 20 20   int iParm,     
3ea0: 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6e 20 61           /* An a
3eb0: 72 67 75 6d 65 6e 74 20 74 6f 20 74 68 65 20 64  rgument to the d
3ec0: 69 73 70 6f 73 61 6c 20 6d 65 74 68 6f 64 20 2a  isposal method *
3ed0: 2f 0a 20 20 69 6e 74 20 69 43 6f 6e 74 69 6e 75  /.  int iContinu
3ee0: 65 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4a  e,          /* J
3ef0: 75 6d 70 20 68 65 72 65 20 74 6f 20 63 6f 6e 74  ump here to cont
3f00: 69 6e 75 65 20 77 69 74 68 20 6e 65 78 74 20 72  inue with next r
3f10: 6f 77 20 2a 2f 0a 20 20 69 6e 74 20 69 42 72 65  ow */.  int iBre
3f20: 61 6b 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ak,             
3f30: 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20 74 6f 20  /* Jump here to 
3f40: 62 72 65 61 6b 20 6f 75 74 20 6f 66 20 74 68 65  break out of the
3f50: 20 69 6e 6e 65 72 20 6c 6f 6f 70 20 2a 2f 0a 20   inner loop */. 
3f60: 20 63 68 61 72 20 2a 61 66 66 20 20 20 20 20 20   char *aff      
3f70: 20 20 20 20 20 20 20 20 20 2f 2a 20 61 66 66 69           /* affi
3f80: 6e 69 74 79 20 73 74 72 69 6e 67 20 69 66 20 65  nity string if e
3f90: 44 65 73 74 20 69 73 20 53 52 54 5f 55 6e 69 6f  Dest is SRT_Unio
3fa0: 6e 20 2a 2f 0a 29 7b 0a 20 20 56 64 62 65 20 2a  n */.){.  Vdbe *
3fb0: 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62  v = pParse->pVdb
3fc0: 65 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e  e;.  int i;.  in
3fd0: 74 20 68 61 73 44 69 73 74 69 6e 63 74 3b 20 20  t hasDistinct;  
3fe0: 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66        /* True if
3ff0: 20 74 68 65 20 44 49 53 54 49 4e 43 54 20 6b 65   the DISTINCT ke
4000: 79 77 6f 72 64 20 69 73 20 70 72 65 73 65 6e 74  yword is present
4010: 20 2a 2f 0a 0a 20 20 69 66 28 20 76 3d 3d 30 20   */..  if( v==0 
4020: 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 61 73  ) return 0;.  as
4030: 73 65 72 74 28 20 70 45 4c 69 73 74 21 3d 30 20  sert( pEList!=0 
4040: 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 72  );..  /* If ther
4050: 65 20 77 61 73 20 61 20 4c 49 4d 49 54 20 63 6c  e was a LIMIT cl
4060: 61 75 73 65 20 6f 6e 20 74 68 65 20 53 45 4c 45  ause on the SELE
4070: 43 54 20 73 74 61 74 65 6d 65 6e 74 2c 20 74 68  CT statement, th
4080: 65 6e 20 64 6f 20 74 68 65 20 63 68 65 63 6b 0a  en do the check.
4090: 20 20 2a 2a 20 74 6f 20 73 65 65 20 69 66 20 74    ** to see if t
40a0: 68 69 73 20 72 6f 77 20 73 68 6f 75 6c 64 20 62  his row should b
40b0: 65 20 6f 75 74 70 75 74 2e 0a 20 20 2a 2f 0a 20  e output..  */. 
40c0: 20 68 61 73 44 69 73 74 69 6e 63 74 20 3d 20 64   hasDistinct = d
40d0: 69 73 74 69 6e 63 74 3e 3d 30 20 26 26 20 70 45  istinct>=0 && pE
40e0: 4c 69 73 74 2d 3e 6e 45 78 70 72 3e 30 3b 0a 20  List->nExpr>0;. 
40f0: 20 69 66 28 20 70 4f 72 64 65 72 42 79 3d 3d 30   if( pOrderBy==0
4100: 20 26 26 20 21 68 61 73 44 69 73 74 69 6e 63 74   && !hasDistinct
4110: 20 29 7b 0a 20 20 20 20 63 6f 64 65 4f 66 66 73   ){.    codeOffs
4120: 65 74 28 76 2c 20 70 2c 20 69 43 6f 6e 74 69 6e  et(v, p, iContin
4130: 75 65 2c 20 30 29 3b 0a 20 20 7d 0a 0a 20 20 2f  ue, 0);.  }..  /
4140: 2a 20 50 75 6c 6c 20 74 68 65 20 72 65 71 75 65  * Pull the reque
4150: 73 74 65 64 20 63 6f 6c 75 6d 6e 73 2e 0a 20 20  sted columns..  
4160: 2a 2f 0a 20 20 69 66 28 20 6e 43 6f 6c 75 6d 6e  */.  if( nColumn
4170: 3e 30 20 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d  >0 ){.    for(i=
4180: 30 3b 20 69 3c 6e 43 6f 6c 75 6d 6e 3b 20 69 2b  0; i<nColumn; i+
4190: 2b 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  +){.      sqlite
41a0: 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
41b0: 5f 43 6f 6c 75 6d 6e 2c 20 73 72 63 54 61 62 2c  _Column, srcTab,
41c0: 20 69 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c   i);.    }.  }el
41d0: 73 65 7b 0a 20 20 20 20 6e 43 6f 6c 75 6d 6e 20  se{.    nColumn 
41e0: 3d 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b  = pEList->nExpr;
41f0: 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72  .    sqlite3Expr
4200: 43 6f 64 65 45 78 70 72 4c 69 73 74 28 70 50 61  CodeExprList(pPa
4210: 72 73 65 2c 20 70 45 4c 69 73 74 29 3b 0a 20 20  rse, pEList);.  
4220: 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 44  }..  /* If the D
4230: 49 53 54 49 4e 43 54 20 6b 65 79 77 6f 72 64 20  ISTINCT keyword 
4240: 77 61 73 20 70 72 65 73 65 6e 74 20 6f 6e 20 74  was present on t
4250: 68 65 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d  he SELECT statem
4260: 65 6e 74 0a 20 20 2a 2a 20 61 6e 64 20 74 68 69  ent.  ** and thi
4270: 73 20 72 6f 77 20 68 61 73 20 62 65 65 6e 20 73  s row has been s
4280: 65 65 6e 20 62 65 66 6f 72 65 2c 20 74 68 65 6e  een before, then
4290: 20 64 6f 20 6e 6f 74 20 6d 61 6b 65 20 74 68 69   do not make thi
42a0: 73 20 72 6f 77 0a 20 20 2a 2a 20 70 61 72 74 20  s row.  ** part 
42b0: 6f 66 20 74 68 65 20 72 65 73 75 6c 74 2e 0a 20  of the result.. 
42c0: 20 2a 2f 0a 20 20 69 66 28 20 68 61 73 44 69 73   */.  if( hasDis
42d0: 74 69 6e 63 74 20 29 7b 0a 20 20 20 20 61 73 73  tinct ){.    ass
42e0: 65 72 74 28 20 70 45 4c 69 73 74 21 3d 30 20 29  ert( pEList!=0 )
42f0: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 45  ;.    assert( pE
4300: 4c 69 73 74 2d 3e 6e 45 78 70 72 3d 3d 6e 43 6f  List->nExpr==nCo
4310: 6c 75 6d 6e 20 29 3b 0a 20 20 20 20 63 6f 64 65  lumn );.    code
4320: 44 69 73 74 69 6e 63 74 28 76 2c 20 64 69 73 74  Distinct(v, dist
4330: 69 6e 63 74 2c 20 69 43 6f 6e 74 69 6e 75 65 2c  inct, iContinue,
4340: 20 6e 43 6f 6c 75 6d 6e 29 3b 0a 20 20 20 20 69   nColumn);.    i
4350: 66 28 20 70 4f 72 64 65 72 42 79 3d 3d 30 20 29  f( pOrderBy==0 )
4360: 7b 0a 20 20 20 20 20 20 63 6f 64 65 4f 66 66 73  {.      codeOffs
4370: 65 74 28 76 2c 20 70 2c 20 69 43 6f 6e 74 69 6e  et(v, p, iContin
4380: 75 65 2c 20 6e 43 6f 6c 75 6d 6e 29 3b 0a 20 20  ue, nColumn);.  
4390: 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20 63    }.  }..  if( c
43a0: 68 65 63 6b 46 6f 72 4d 75 6c 74 69 43 6f 6c 75  heckForMultiColu
43b0: 6d 6e 53 65 6c 65 63 74 45 72 72 6f 72 28 70 50  mnSelectError(pP
43c0: 61 72 73 65 2c 20 65 44 65 73 74 2c 20 70 45 4c  arse, eDest, pEL
43d0: 69 73 74 2d 3e 6e 45 78 70 72 29 20 29 7b 0a 20  ist->nExpr) ){. 
43e0: 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d     return 0;.  }
43f0: 0a 0a 20 20 73 77 69 74 63 68 28 20 65 44 65 73  ..  switch( eDes
4400: 74 20 29 7b 0a 20 20 20 20 2f 2a 20 49 6e 20 74  t ){.    /* In t
4410: 68 69 73 20 6d 6f 64 65 2c 20 77 72 69 74 65 20  his mode, write 
4420: 65 61 63 68 20 71 75 65 72 79 20 72 65 73 75 6c  each query resul
4430: 74 20 74 6f 20 74 68 65 20 6b 65 79 20 6f 66 20  t to the key of 
4440: 74 68 65 20 74 65 6d 70 6f 72 61 72 79 0a 20 20  the temporary.  
4450: 20 20 2a 2a 20 74 61 62 6c 65 20 69 50 61 72 6d    ** table iParm
4460: 2e 0a 20 20 20 20 2a 2f 0a 23 69 66 6e 64 65 66  ..    */.#ifndef
4470: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f 4d   SQLITE_OMIT_COM
4480: 50 4f 55 4e 44 5f 53 45 4c 45 43 54 0a 20 20 20  POUND_SELECT.   
4490: 20 63 61 73 65 20 53 52 54 5f 55 6e 69 6f 6e 3a   case SRT_Union:
44a0: 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   {.      sqlite3
44b0: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
44c0: 4d 61 6b 65 52 65 63 6f 72 64 2c 20 6e 43 6f 6c  MakeRecord, nCol
44d0: 75 6d 6e 2c 20 30 29 3b 0a 20 20 20 20 20 20 69  umn, 0);.      i
44e0: 66 28 20 61 66 66 20 29 7b 0a 20 20 20 20 20 20  f( aff ){.      
44f0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61    sqlite3VdbeCha
4500: 6e 67 65 50 33 28 76 2c 20 2d 31 2c 20 61 66 66  ngeP3(v, -1, aff
4510: 2c 20 50 33 5f 53 54 41 54 49 43 29 3b 0a 20 20  , P3_STATIC);.  
4520: 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69      }.      sqli
4530: 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
4540: 4f 50 5f 49 64 78 49 6e 73 65 72 74 2c 20 69 50  OP_IdxInsert, iP
4550: 61 72 6d 2c 20 30 29 3b 0a 20 20 20 20 20 20 62  arm, 0);.      b
4560: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  reak;.    }..   
4570: 20 2f 2a 20 43 6f 6e 73 74 72 75 63 74 20 61 20   /* Construct a 
4580: 72 65 63 6f 72 64 20 66 72 6f 6d 20 74 68 65 20  record from the 
4590: 71 75 65 72 79 20 72 65 73 75 6c 74 2c 20 62 75  query result, bu
45a0: 74 20 69 6e 73 74 65 61 64 20 6f 66 0a 20 20 20  t instead of.   
45b0: 20 2a 2a 20 73 61 76 69 6e 67 20 74 68 61 74 20   ** saving that 
45c0: 72 65 63 6f 72 64 2c 20 75 73 65 20 69 74 20 61  record, use it a
45d0: 73 20 61 20 6b 65 79 20 74 6f 20 64 65 6c 65 74  s a key to delet
45e0: 65 20 65 6c 65 6d 65 6e 74 73 20 66 72 6f 6d 0a  e elements from.
45f0: 20 20 20 20 2a 2a 20 74 68 65 20 74 65 6d 70 6f      ** the tempo
4600: 72 61 72 79 20 74 61 62 6c 65 20 69 50 61 72 6d  rary table iParm
4610: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73  ..    */.    cas
4620: 65 20 53 52 54 5f 45 78 63 65 70 74 3a 20 7b 0a  e SRT_Except: {.
4630: 20 20 20 20 20 20 69 6e 74 20 61 64 64 72 3b 0a        int addr;.
4640: 20 20 20 20 20 20 61 64 64 72 20 3d 20 73 71 6c        addr = sql
4650: 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
4660: 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20   OP_MakeRecord, 
4670: 6e 43 6f 6c 75 6d 6e 2c 20 30 29 3b 0a 20 20 20  nColumn, 0);.   
4680: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68     sqlite3VdbeCh
4690: 61 6e 67 65 50 33 28 76 2c 20 2d 31 2c 20 61 66  angeP3(v, -1, af
46a0: 66 2c 20 50 33 5f 53 54 41 54 49 43 29 3b 0a 20  f, P3_STATIC);. 
46b0: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
46c0: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4e 6f 74 46  AddOp(v, OP_NotF
46d0: 6f 75 6e 64 2c 20 69 50 61 72 6d 2c 20 61 64 64  ound, iParm, add
46e0: 72 2b 33 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  r+3);.      sqli
46f0: 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
4700: 4f 50 5f 44 65 6c 65 74 65 2c 20 69 50 61 72 6d  OP_Delete, iParm
4710: 2c 20 30 29 3b 0a 20 20 20 20 20 20 62 72 65 61  , 0);.      brea
4720: 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  k;.    }.#endif.
4730: 0a 20 20 20 20 2f 2a 20 53 74 6f 72 65 20 74 68  .    /* Store th
4740: 65 20 72 65 73 75 6c 74 20 61 73 20 64 61 74 61  e result as data
4750: 20 75 73 69 6e 67 20 61 20 75 6e 69 71 75 65 20   using a unique 
4760: 6b 65 79 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  key..    */.    
4770: 63 61 73 65 20 53 52 54 5f 54 61 62 6c 65 3a 0a  case SRT_Table:.
4780: 20 20 20 20 63 61 73 65 20 53 52 54 5f 45 70 68      case SRT_Eph
4790: 65 6d 54 61 62 3a 20 7b 0a 20 20 20 20 20 20 73  emTab: {.      s
47a0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
47b0: 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64  v, OP_MakeRecord
47c0: 2c 20 6e 43 6f 6c 75 6d 6e 2c 20 30 29 3b 0a 20  , nColumn, 0);. 
47d0: 20 20 20 20 20 69 66 28 20 70 4f 72 64 65 72 42       if( pOrderB
47e0: 79 20 29 7b 0a 20 20 20 20 20 20 20 20 70 75 73  y ){.        pus
47f0: 68 4f 6e 74 6f 53 6f 72 74 65 72 28 70 50 61 72  hOntoSorter(pPar
4800: 73 65 2c 20 70 4f 72 64 65 72 42 79 2c 20 70 29  se, pOrderBy, p)
4810: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
4820: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
4830: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4e 65  beAddOp(v, OP_Ne
4840: 77 52 6f 77 69 64 2c 20 69 50 61 72 6d 2c 20 30  wRowid, iParm, 0
4850: 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
4860: 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
4870: 50 5f 50 75 6c 6c 2c 20 31 2c 20 30 29 3b 0a 20  P_Pull, 1, 0);. 
4880: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
4890: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49 6e  beAddOp(v, OP_In
48a0: 73 65 72 74 2c 20 69 50 61 72 6d 2c 20 4f 50 46  sert, iParm, OPF
48b0: 4c 41 47 5f 41 50 50 45 4e 44 29 3b 0a 20 20 20  LAG_APPEND);.   
48c0: 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b     }.      break
48d0: 3b 0a 20 20 20 20 7d 0a 0a 23 69 66 6e 64 65 66  ;.    }..#ifndef
48e0: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42   SQLITE_OMIT_SUB
48f0: 51 55 45 52 59 0a 20 20 20 20 2f 2a 20 49 66 20  QUERY.    /* If 
4900: 77 65 20 61 72 65 20 63 72 65 61 74 69 6e 67 20  we are creating 
4910: 61 20 73 65 74 20 66 6f 72 20 61 6e 20 22 65 78  a set for an "ex
4920: 70 72 20 49 4e 20 28 53 45 4c 45 43 54 20 2e 2e  pr IN (SELECT ..
4930: 2e 29 22 20 63 6f 6e 73 74 72 75 63 74 2c 0a 20  .)" construct,. 
4940: 20 20 20 2a 2a 20 74 68 65 6e 20 74 68 65 72 65     ** then there
4950: 20 73 68 6f 75 6c 64 20 62 65 20 61 20 73 69 6e   should be a sin
4960: 67 6c 65 20 69 74 65 6d 20 6f 6e 20 74 68 65 20  gle item on the 
4970: 73 74 61 63 6b 2e 20 20 57 72 69 74 65 20 74 68  stack.  Write th
4980: 69 73 0a 20 20 20 20 2a 2a 20 69 74 65 6d 20 69  is.    ** item i
4990: 6e 74 6f 20 74 68 65 20 73 65 74 20 74 61 62 6c  nto the set tabl
49a0: 65 20 77 69 74 68 20 62 6f 67 75 73 20 64 61 74  e with bogus dat
49b0: 61 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61  a..    */.    ca
49c0: 73 65 20 53 52 54 5f 53 65 74 3a 20 7b 0a 20 20  se SRT_Set: {.  
49d0: 20 20 20 20 69 6e 74 20 61 64 64 72 31 20 3d 20      int addr1 = 
49e0: 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65  sqlite3VdbeCurre
49f0: 6e 74 41 64 64 72 28 76 29 3b 0a 20 20 20 20 20  ntAddr(v);.     
4a00: 20 69 6e 74 20 61 64 64 72 32 3b 0a 0a 20 20 20   int addr2;..   
4a10: 20 20 20 61 73 73 65 72 74 28 20 6e 43 6f 6c 75     assert( nColu
4a20: 6d 6e 3d 3d 31 20 29 3b 0a 20 20 20 20 20 20 73  mn==1 );.      s
4a30: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
4a40: 76 2c 20 4f 50 5f 4e 6f 74 4e 75 6c 6c 2c 20 2d  v, OP_NotNull, -
4a50: 31 2c 20 61 64 64 72 31 2b 33 29 3b 0a 20 20 20  1, addr1+3);.   
4a60: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
4a70: 64 4f 70 28 76 2c 20 4f 50 5f 50 6f 70 2c 20 31  dOp(v, OP_Pop, 1
4a80: 2c 20 30 29 3b 0a 20 20 20 20 20 20 61 64 64 72  , 0);.      addr
4a90: 32 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41  2 = sqlite3VdbeA
4aa0: 64 64 4f 70 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c  ddOp(v, OP_Goto,
4ab0: 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 70 2d   0, 0);.      p-
4ac0: 3e 61 66 66 69 6e 69 74 79 20 3d 20 73 71 6c 69  >affinity = sqli
4ad0: 74 65 33 43 6f 6d 70 61 72 65 41 66 66 69 6e 69  te3CompareAffini
4ae0: 74 79 28 70 45 4c 69 73 74 2d 3e 61 5b 30 5d 2e  ty(pEList->a[0].
4af0: 70 45 78 70 72 2c 28 69 50 61 72 6d 3e 3e 31 36  pExpr,(iParm>>16
4b00: 29 26 30 78 66 66 29 3b 0a 20 20 20 20 20 20 69  )&0xff);.      i
4b10: 66 28 20 70 4f 72 64 65 72 42 79 20 29 7b 0a 20  f( pOrderBy ){. 
4b20: 20 20 20 20 20 20 20 2f 2a 20 41 74 20 66 69 72         /* At fir
4b30: 73 74 20 67 6c 61 6e 63 65 20 79 6f 75 20 77 6f  st glance you wo
4b40: 75 6c 64 20 74 68 69 6e 6b 20 77 65 20 63 6f 75  uld think we cou
4b50: 6c 64 20 6f 70 74 69 6d 69 7a 65 20 6f 75 74 20  ld optimize out 
4b60: 74 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 4f  the.        ** O
4b70: 52 44 45 52 20 42 59 20 69 6e 20 74 68 69 73 20  RDER BY in this 
4b80: 63 61 73 65 20 73 69 6e 63 65 20 74 68 65 20 6f  case since the o
4b90: 72 64 65 72 20 6f 66 20 65 6e 74 72 69 65 73 20  rder of entries 
4ba0: 69 6e 20 74 68 65 20 73 65 74 0a 20 20 20 20 20  in the set.     
4bb0: 20 20 20 2a 2a 20 64 6f 65 73 20 6e 6f 74 20 6d     ** does not m
4bc0: 61 74 74 65 72 2e 20 20 42 75 74 20 74 68 65 72  atter.  But ther
4bd0: 65 20 6d 69 67 68 74 20 62 65 20 61 20 4c 49 4d  e might be a LIM
4be0: 49 54 20 63 6c 61 75 73 65 2c 20 69 6e 20 77 68  IT clause, in wh
4bf0: 69 63 68 0a 20 20 20 20 20 20 20 20 2a 2a 20 63  ich.        ** c
4c00: 61 73 65 20 74 68 65 20 6f 72 64 65 72 20 64 6f  ase the order do
4c10: 65 73 20 6d 61 74 74 65 72 20 2a 2f 0a 20 20 20  es matter */.   
4c20: 20 20 20 20 20 70 75 73 68 4f 6e 74 6f 53 6f 72       pushOntoSor
4c30: 74 65 72 28 70 50 61 72 73 65 2c 20 70 4f 72 64  ter(pParse, pOrd
4c40: 65 72 42 79 2c 20 70 29 3b 0a 20 20 20 20 20 20  erBy, p);.      
4c50: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73  }else{.        s
4c60: 71 6c 69 74 65 33 56 64 62 65 4f 70 33 28 76 2c  qlite3VdbeOp3(v,
4c70: 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20   OP_MakeRecord, 
4c80: 31 2c 20 30 2c 20 26 70 2d 3e 61 66 66 69 6e 69  1, 0, &p->affini
4c90: 74 79 2c 20 31 29 3b 0a 20 20 20 20 20 20 20 20  ty, 1);.        
4ca0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
4cb0: 28 76 2c 20 4f 50 5f 49 64 78 49 6e 73 65 72 74  (v, OP_IdxInsert
4cc0: 2c 20 28 69 50 61 72 6d 26 30 78 30 30 30 30 46  , (iParm&0x0000F
4cd0: 46 46 46 29 2c 20 30 29 3b 0a 20 20 20 20 20 20  FFF), 0);.      
4ce0: 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  }.      sqlite3V
4cf0: 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61  dbeJumpHere(v, a
4d00: 64 64 72 32 29 3b 0a 20 20 20 20 20 20 62 72 65  ddr2);.      bre
4d10: 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  ak;.    }..    /
4d20: 2a 20 49 66 20 61 6e 79 20 72 6f 77 20 65 78 69  * If any row exi
4d30: 73 74 20 69 6e 20 74 68 65 20 72 65 73 75 6c 74  st in the result
4d40: 20 73 65 74 2c 20 72 65 63 6f 72 64 20 74 68 61   set, record tha
4d50: 74 20 66 61 63 74 20 61 6e 64 20 61 62 6f 72 74  t fact and abort
4d60: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73  ..    */.    cas
4d70: 65 20 53 52 54 5f 45 78 69 73 74 73 3a 20 7b 0a  e SRT_Exists: {.
4d80: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
4d90: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 65 6d  eAddOp(v, OP_Mem
4da0: 49 6e 74 2c 20 31 2c 20 69 50 61 72 6d 29 3b 0a  Int, 1, iParm);.
4db0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
4dc0: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 50 6f 70  eAddOp(v, OP_Pop
4dd0: 2c 20 6e 43 6f 6c 75 6d 6e 2c 20 30 29 3b 0a 20  , nColumn, 0);. 
4de0: 20 20 20 20 20 2f 2a 20 54 68 65 20 4c 49 4d 49       /* The LIMI
4df0: 54 20 63 6c 61 75 73 65 20 77 69 6c 6c 20 74 65  T clause will te
4e00: 72 6d 69 6e 61 74 65 20 74 68 65 20 6c 6f 6f 70  rminate the loop
4e10: 20 66 6f 72 20 75 73 20 2a 2f 0a 20 20 20 20 20   for us */.     
4e20: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20   break;.    }.. 
4e30: 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73     /* If this is
4e40: 20 61 20 73 63 61 6c 61 72 20 73 65 6c 65 63 74   a scalar select
4e50: 20 74 68 61 74 20 69 73 20 70 61 72 74 20 6f 66   that is part of
4e60: 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 2c 20   an expression, 
4e70: 74 68 65 6e 0a 20 20 20 20 2a 2a 20 73 74 6f 72  then.    ** stor
4e80: 65 20 74 68 65 20 72 65 73 75 6c 74 73 20 69 6e  e the results in
4e90: 20 74 68 65 20 61 70 70 72 6f 70 72 69 61 74 65   the appropriate
4ea0: 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 20 61 6e 64   memory cell and
4eb0: 20 62 72 65 61 6b 20 6f 75 74 0a 20 20 20 20 2a   break out.    *
4ec0: 2a 20 6f 66 20 74 68 65 20 73 63 61 6e 20 6c 6f  * of the scan lo
4ed0: 6f 70 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63  op..    */.    c
4ee0: 61 73 65 20 53 52 54 5f 4d 65 6d 3a 20 7b 0a 20  ase SRT_Mem: {. 
4ef0: 20 20 20 20 20 61 73 73 65 72 74 28 20 6e 43 6f       assert( nCo
4f00: 6c 75 6d 6e 3d 3d 31 20 29 3b 0a 20 20 20 20 20  lumn==1 );.     
4f10: 20 69 66 28 20 70 4f 72 64 65 72 42 79 20 29 7b   if( pOrderBy ){
4f20: 0a 20 20 20 20 20 20 20 20 70 75 73 68 4f 6e 74  .        pushOnt
4f30: 6f 53 6f 72 74 65 72 28 70 50 61 72 73 65 2c 20  oSorter(pParse, 
4f40: 70 4f 72 64 65 72 42 79 2c 20 70 29 3b 0a 20 20  pOrderBy, p);.  
4f50: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
4f60: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
4f70: 64 4f 70 28 76 2c 20 4f 50 5f 4d 65 6d 53 74 6f  dOp(v, OP_MemSto
4f80: 72 65 2c 20 69 50 61 72 6d 2c 20 31 29 3b 0a 20  re, iParm, 1);. 
4f90: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 4c 49         /* The LI
4fa0: 4d 49 54 20 63 6c 61 75 73 65 20 77 69 6c 6c 20  MIT clause will 
4fb0: 6a 75 6d 70 20 6f 75 74 20 6f 66 20 74 68 65 20  jump out of the 
4fc0: 6c 6f 6f 70 20 66 6f 72 20 75 73 20 2a 2f 0a 20  loop for us */. 
4fd0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65       }.      bre
4fe0: 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66  ak;.    }.#endif
4ff0: 20 2f 2a 20 23 69 66 6e 64 65 66 20 53 51 4c 49   /* #ifndef SQLI
5000: 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59  TE_OMIT_SUBQUERY
5010: 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 53 65 6e 64   */..    /* Send
5020: 20 74 68 65 20 64 61 74 61 20 74 6f 20 74 68 65   the data to the
5030: 20 63 61 6c 6c 62 61 63 6b 20 66 75 6e 63 74 69   callback functi
5040: 6f 6e 20 6f 72 20 74 6f 20 61 20 73 75 62 72 6f  on or to a subro
5050: 75 74 69 6e 65 2e 20 20 49 6e 20 74 68 65 0a 20  utine.  In the. 
5060: 20 20 20 2a 2a 20 63 61 73 65 20 6f 66 20 61 20     ** case of a 
5070: 73 75 62 72 6f 75 74 69 6e 65 2c 20 74 68 65 20  subroutine, the 
5080: 73 75 62 72 6f 75 74 69 6e 65 20 69 74 73 65 6c  subroutine itsel
5090: 66 20 69 73 20 72 65 73 70 6f 6e 73 69 62 6c 65  f is responsible
50a0: 20 66 6f 72 0a 20 20 20 20 2a 2a 20 70 6f 70 70   for.    ** popp
50b0: 69 6e 67 20 74 68 65 20 64 61 74 61 20 66 72 6f  ing the data fro
50c0: 6d 20 74 68 65 20 73 74 61 63 6b 2e 0a 20 20 20  m the stack..   
50d0: 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 52 54   */.    case SRT
50e0: 5f 53 75 62 72 6f 75 74 69 6e 65 3a 0a 20 20 20  _Subroutine:.   
50f0: 20 63 61 73 65 20 53 52 54 5f 43 61 6c 6c 62 61   case SRT_Callba
5100: 63 6b 3a 20 7b 0a 20 20 20 20 20 20 69 66 28 20  ck: {.      if( 
5110: 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20  pOrderBy ){.    
5120: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
5130: 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 61 6b 65 52  ddOp(v, OP_MakeR
5140: 65 63 6f 72 64 2c 20 6e 43 6f 6c 75 6d 6e 2c 20  ecord, nColumn, 
5150: 30 29 3b 0a 20 20 20 20 20 20 20 20 70 75 73 68  0);.        push
5160: 4f 6e 74 6f 53 6f 72 74 65 72 28 70 50 61 72 73  OntoSorter(pPars
5170: 65 2c 20 70 4f 72 64 65 72 42 79 2c 20 70 29 3b  e, pOrderBy, p);
5180: 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28  .      }else if(
5190: 20 65 44 65 73 74 3d 3d 53 52 54 5f 53 75 62 72   eDest==SRT_Subr
51a0: 6f 75 74 69 6e 65 20 29 7b 0a 20 20 20 20 20 20  outine ){.      
51b0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
51c0: 4f 70 28 76 2c 20 4f 50 5f 47 6f 73 75 62 2c 20  Op(v, OP_Gosub, 
51d0: 30 2c 20 69 50 61 72 6d 29 3b 0a 20 20 20 20 20  0, iParm);.     
51e0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
51f0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
5200: 28 76 2c 20 4f 50 5f 43 61 6c 6c 62 61 63 6b 2c  (v, OP_Callback,
5210: 20 6e 43 6f 6c 75 6d 6e 2c 20 30 29 3b 0a 20 20   nColumn, 0);.  
5220: 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61      }.      brea
5230: 6b 3b 0a 20 20 20 20 7d 0a 0a 23 69 66 20 21 64  k;.    }..#if !d
5240: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
5250: 49 54 5f 54 52 49 47 47 45 52 29 0a 20 20 20 20  IT_TRIGGER).    
5260: 2f 2a 20 44 69 73 63 61 72 64 20 74 68 65 20 72  /* Discard the r
5270: 65 73 75 6c 74 73 2e 20 20 54 68 69 73 20 69 73  esults.  This is
5280: 20 75 73 65 64 20 66 6f 72 20 53 45 4c 45 43 54   used for SELECT
5290: 20 73 74 61 74 65 6d 65 6e 74 73 20 69 6e 73 69   statements insi
52a0: 64 65 0a 20 20 20 20 2a 2a 20 74 68 65 20 62 6f  de.    ** the bo
52b0: 64 79 20 6f 66 20 61 20 54 52 49 47 47 45 52 2e  dy of a TRIGGER.
52c0: 20 20 54 68 65 20 70 75 72 70 6f 73 65 20 6f 66    The purpose of
52d0: 20 73 75 63 68 20 73 65 6c 65 63 74 73 20 69 73   such selects is
52e0: 20 74 6f 20 63 61 6c 6c 0a 20 20 20 20 2a 2a 20   to call.    ** 
52f0: 75 73 65 72 2d 64 65 66 69 6e 65 64 20 66 75 6e  user-defined fun
5300: 63 74 69 6f 6e 73 20 74 68 61 74 20 68 61 76 65  ctions that have
5310: 20 73 69 64 65 20 65 66 66 65 63 74 73 2e 20 20   side effects.  
5320: 57 65 20 64 6f 20 6e 6f 74 20 63 61 72 65 0a 20  We do not care. 
5330: 20 20 20 2a 2a 20 61 62 6f 75 74 20 74 68 65 20     ** about the 
5340: 61 63 74 75 61 6c 20 72 65 73 75 6c 74 73 20 6f  actual results o
5350: 66 20 74 68 65 20 73 65 6c 65 63 74 2e 0a 20 20  f the select..  
5360: 20 20 2a 2f 0a 20 20 20 20 64 65 66 61 75 6c 74    */.    default
5370: 3a 20 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74  : {.      assert
5380: 28 20 65 44 65 73 74 3d 3d 53 52 54 5f 44 69 73  ( eDest==SRT_Dis
5390: 63 61 72 64 20 29 3b 0a 20 20 20 20 20 20 73 71  card );.      sq
53a0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
53b0: 2c 20 4f 50 5f 50 6f 70 2c 20 6e 43 6f 6c 75 6d  , OP_Pop, nColum
53c0: 6e 2c 20 30 29 3b 0a 20 20 20 20 20 20 62 72 65  n, 0);.      bre
53d0: 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66  ak;.    }.#endif
53e0: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4a 75 6d 70 20  .  }..  /* Jump 
53f0: 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68  to the end of th
5400: 65 20 6c 6f 6f 70 20 69 66 20 74 68 65 20 4c 49  e loop if the LI
5410: 4d 49 54 20 69 73 20 72 65 61 63 68 65 64 2e 0a  MIT is reached..
5420: 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 69 4c    */.  if( p->iL
5430: 69 6d 69 74 3e 3d 30 20 26 26 20 70 4f 72 64 65  imit>=0 && pOrde
5440: 72 42 79 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71  rBy==0 ){.    sq
5450: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
5460: 2c 20 4f 50 5f 4d 65 6d 49 6e 63 72 2c 20 2d 31  , OP_MemIncr, -1
5470: 2c 20 70 2d 3e 69 4c 69 6d 69 74 29 3b 0a 20 20  , p->iLimit);.  
5480: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
5490: 4f 70 28 76 2c 20 4f 50 5f 49 66 4d 65 6d 5a 65  Op(v, OP_IfMemZe
54a0: 72 6f 2c 20 70 2d 3e 69 4c 69 6d 69 74 2c 20 69  ro, p->iLimit, i
54b0: 42 72 65 61 6b 29 3b 0a 20 20 7d 0a 20 20 72 65  Break);.  }.  re
54c0: 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn 0;.}../*.**
54d0: 20 47 69 76 65 6e 20 61 6e 20 65 78 70 72 65 73   Given an expres
54e0: 73 69 6f 6e 20 6c 69 73 74 2c 20 67 65 6e 65 72  sion list, gener
54f0: 61 74 65 20 61 20 4b 65 79 49 6e 66 6f 20 73 74  ate a KeyInfo st
5500: 72 75 63 74 75 72 65 20 74 68 61 74 20 72 65 63  ructure that rec
5510: 6f 72 64 73 0a 2a 2a 20 74 68 65 20 63 6f 6c 6c  ords.** the coll
5520: 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65 20 66  ating sequence f
5530: 6f 72 20 65 61 63 68 20 65 78 70 72 65 73 73 69  or each expressi
5540: 6f 6e 20 69 6e 20 74 68 61 74 20 65 78 70 72 65  on in that expre
5550: 73 73 69 6f 6e 20 6c 69 73 74 2e 0a 2a 2a 0a 2a  ssion list..**.*
5560: 2a 20 49 66 20 74 68 65 20 45 78 70 72 4c 69 73  * If the ExprLis
5570: 74 20 69 73 20 61 6e 20 4f 52 44 45 52 20 42 59  t is an ORDER BY
5580: 20 6f 72 20 47 52 4f 55 50 20 42 59 20 63 6c 61   or GROUP BY cla
5590: 75 73 65 20 74 68 65 6e 20 74 68 65 20 72 65 73  use then the res
55a0: 75 6c 74 69 6e 67 0a 2a 2a 20 4b 65 79 49 6e 66  ulting.** KeyInf
55b0: 6f 20 73 74 72 75 63 74 75 72 65 20 69 73 20 61  o structure is a
55c0: 70 70 72 6f 70 72 69 61 74 65 20 66 6f 72 20 69  ppropriate for i
55d0: 6e 69 74 69 61 6c 69 7a 69 6e 67 20 61 20 76 69  nitializing a vi
55e0: 72 74 75 61 6c 20 69 6e 64 65 78 20 74 6f 0a 2a  rtual index to.*
55f0: 2a 20 69 6d 70 6c 65 6d 65 6e 74 20 74 68 61 74  * implement that
5600: 20 63 6c 61 75 73 65 2e 20 20 49 66 20 74 68 65   clause.  If the
5610: 20 45 78 70 72 4c 69 73 74 20 69 73 20 74 68 65   ExprList is the
5620: 20 72 65 73 75 6c 74 20 73 65 74 20 6f 66 20 61   result set of a
5630: 20 53 45 4c 45 43 54 0a 2a 2a 20 74 68 65 6e 20   SELECT.** then 
5640: 74 68 65 20 4b 65 79 49 6e 66 6f 20 73 74 72 75  the KeyInfo stru
5650: 63 74 75 72 65 20 69 73 20 61 70 70 72 6f 70 72  cture is appropr
5660: 69 61 74 65 20 66 6f 72 20 69 6e 69 74 69 61 6c  iate for initial
5670: 69 7a 69 6e 67 20 61 20 76 69 72 74 75 61 6c 0a  izing a virtual.
5680: 2a 2a 20 69 6e 64 65 78 20 74 6f 20 69 6d 70 6c  ** index to impl
5690: 65 6d 65 6e 74 20 61 20 44 49 53 54 49 4e 43 54  ement a DISTINCT
56a0: 20 74 65 73 74 2e 0a 2a 2a 0a 2a 2a 20 53 70 61   test..**.** Spa
56b0: 63 65 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 4b  ce to hold the K
56c0: 65 79 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65  eyInfo structure
56d0: 20 69 73 20 6f 62 74 61 69 6e 20 66 72 6f 6d 20   is obtain from 
56e0: 6d 61 6c 6c 6f 63 2e 20 20 54 68 65 20 63 61 6c  malloc.  The cal
56f0: 6c 69 6e 67 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e  ling.** function
5700: 20 69 73 20 72 65 73 70 6f 6e 73 69 62 6c 65 20   is responsible 
5710: 66 6f 72 20 73 65 65 69 6e 67 20 74 68 61 74 20  for seeing that 
5720: 74 68 69 73 20 73 74 72 75 63 74 75 72 65 20 69  this structure i
5730: 73 20 65 76 65 6e 74 75 61 6c 6c 79 0a 2a 2a 20  s eventually.** 
5740: 66 72 65 65 64 2e 20 20 41 64 64 20 74 68 65 20  freed.  Add the 
5750: 4b 65 79 49 6e 66 6f 20 73 74 72 75 63 74 75 72  KeyInfo structur
5760: 65 20 74 6f 20 74 68 65 20 50 33 20 66 69 65 6c  e to the P3 fiel
5770: 64 20 6f 66 20 61 6e 20 6f 70 63 6f 64 65 20 75  d of an opcode u
5780: 73 69 6e 67 0a 2a 2a 20 50 33 5f 4b 45 59 49 4e  sing.** P3_KEYIN
5790: 46 4f 5f 48 41 4e 44 4f 46 46 20 69 73 20 74 68  FO_HANDOFF is th
57a0: 65 20 75 73 75 61 6c 20 77 61 79 20 6f 66 20 64  e usual way of d
57b0: 65 61 6c 69 6e 67 20 77 69 74 68 20 74 68 69 73  ealing with this
57c0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 4b 65 79 49  ..*/.static KeyI
57d0: 6e 66 6f 20 2a 6b 65 79 49 6e 66 6f 46 72 6f 6d  nfo *keyInfoFrom
57e0: 45 78 70 72 4c 69 73 74 28 50 61 72 73 65 20 2a  ExprList(Parse *
57f0: 70 50 61 72 73 65 2c 20 45 78 70 72 4c 69 73 74  pParse, ExprList
5800: 20 2a 70 4c 69 73 74 29 7b 0a 20 20 73 71 6c 69   *pList){.  sqli
5810: 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65  te3 *db = pParse
5820: 2d 3e 64 62 3b 0a 20 20 69 6e 74 20 6e 45 78 70  ->db;.  int nExp
5830: 72 3b 0a 20 20 4b 65 79 49 6e 66 6f 20 2a 70 49  r;.  KeyInfo *pI
5840: 6e 66 6f 3b 0a 20 20 73 74 72 75 63 74 20 45 78  nfo;.  struct Ex
5850: 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74  prList_item *pIt
5860: 65 6d 3b 0a 20 20 69 6e 74 20 69 3b 0a 0a 20 20  em;.  int i;..  
5870: 6e 45 78 70 72 20 3d 20 70 4c 69 73 74 2d 3e 6e  nExpr = pList->n
5880: 45 78 70 72 3b 0a 20 20 70 49 6e 66 6f 20 3d 20  Expr;.  pInfo = 
5890: 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a  sqlite3DbMallocZ
58a0: 65 72 6f 28 64 62 2c 20 73 69 7a 65 6f 66 28 2a  ero(db, sizeof(*
58b0: 70 49 6e 66 6f 29 20 2b 20 6e 45 78 70 72 2a 28  pInfo) + nExpr*(
58c0: 73 69 7a 65 6f 66 28 43 6f 6c 6c 53 65 71 2a 29  sizeof(CollSeq*)
58d0: 2b 31 29 20 29 3b 0a 20 20 69 66 28 20 70 49 6e  +1) );.  if( pIn
58e0: 66 6f 20 29 7b 0a 20 20 20 20 70 49 6e 66 6f 2d  fo ){.    pInfo-
58f0: 3e 61 53 6f 72 74 4f 72 64 65 72 20 3d 20 28 75  >aSortOrder = (u
5900: 38 2a 29 26 70 49 6e 66 6f 2d 3e 61 43 6f 6c 6c  8*)&pInfo->aColl
5910: 5b 6e 45 78 70 72 5d 3b 0a 20 20 20 20 70 49 6e  [nExpr];.    pIn
5920: 66 6f 2d 3e 6e 46 69 65 6c 64 20 3d 20 6e 45 78  fo->nField = nEx
5930: 70 72 3b 0a 20 20 20 20 70 49 6e 66 6f 2d 3e 65  pr;.    pInfo->e
5940: 6e 63 20 3d 20 45 4e 43 28 64 62 29 3b 0a 20 20  nc = ENC(db);.  
5950: 20 20 66 6f 72 28 69 3d 30 2c 20 70 49 74 65 6d    for(i=0, pItem
5960: 3d 70 4c 69 73 74 2d 3e 61 3b 20 69 3c 6e 45 78  =pList->a; i<nEx
5970: 70 72 3b 20 69 2b 2b 2c 20 70 49 74 65 6d 2b 2b  pr; i++, pItem++
5980: 29 7b 0a 20 20 20 20 20 20 43 6f 6c 6c 53 65 71  ){.      CollSeq
5990: 20 2a 70 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 70   *pColl;.      p
59a0: 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 45 78  Coll = sqlite3Ex
59b0: 70 72 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65  prCollSeq(pParse
59c0: 2c 20 70 49 74 65 6d 2d 3e 70 45 78 70 72 29 3b  , pItem->pExpr);
59d0: 0a 20 20 20 20 20 20 69 66 28 20 21 70 43 6f 6c  .      if( !pCol
59e0: 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 70 43 6f  l ){.        pCo
59f0: 6c 6c 20 3d 20 64 62 2d 3e 70 44 66 6c 74 43 6f  ll = db->pDfltCo
5a00: 6c 6c 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ll;.      }.    
5a10: 20 20 70 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b 69    pInfo->aColl[i
5a20: 5d 20 3d 20 70 43 6f 6c 6c 3b 0a 20 20 20 20 20  ] = pColl;.     
5a30: 20 70 49 6e 66 6f 2d 3e 61 53 6f 72 74 4f 72 64   pInfo->aSortOrd
5a40: 65 72 5b 69 5d 20 3d 20 70 49 74 65 6d 2d 3e 73  er[i] = pItem->s
5a50: 6f 72 74 4f 72 64 65 72 3b 0a 20 20 20 20 7d 0a  ortOrder;.    }.
5a60: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 49 6e    }.  return pIn
5a70: 66 6f 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 49 66  fo;.}.../*.** If
5a80: 20 74 68 65 20 69 6e 6e 65 72 20 6c 6f 6f 70 20   the inner loop 
5a90: 77 61 73 20 67 65 6e 65 72 61 74 65 64 20 75 73  was generated us
5aa0: 69 6e 67 20 61 20 6e 6f 6e 2d 6e 75 6c 6c 20 70  ing a non-null p
5ab0: 4f 72 64 65 72 42 79 20 61 72 67 75 6d 65 6e 74  OrderBy argument
5ac0: 2c 0a 2a 2a 20 74 68 65 6e 20 74 68 65 20 72 65  ,.** then the re
5ad0: 73 75 6c 74 73 20 77 65 72 65 20 70 6c 61 63 65  sults were place
5ae0: 64 20 69 6e 20 61 20 73 6f 72 74 65 72 2e 20 20  d in a sorter.  
5af0: 41 66 74 65 72 20 74 68 65 20 6c 6f 6f 70 20 69  After the loop i
5b00: 73 20 74 65 72 6d 69 6e 61 74 65 64 0a 2a 2a 20  s terminated.** 
5b10: 77 65 20 6e 65 65 64 20 74 6f 20 72 75 6e 20 74  we need to run t
5b20: 68 65 20 73 6f 72 74 65 72 20 61 6e 64 20 6f 75  he sorter and ou
5b30: 74 70 75 74 20 74 68 65 20 72 65 73 75 6c 74 73  tput the results
5b40: 2e 20 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  .  The following
5b50: 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 67 65 6e 65  .** routine gene
5b60: 72 61 74 65 73 20 74 68 65 20 63 6f 64 65 20 6e  rates the code n
5b70: 65 65 64 65 64 20 74 6f 20 64 6f 20 74 68 61 74  eeded to do that
5b80: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
5b90: 20 67 65 6e 65 72 61 74 65 53 6f 72 74 54 61 69   generateSortTai
5ba0: 6c 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  l(.  Parse *pPar
5bb0: 73 65 2c 20 20 20 2f 2a 20 50 61 72 73 69 6e 67  se,   /* Parsing
5bc0: 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53 65   context */.  Se
5bd0: 6c 65 63 74 20 2a 70 2c 20 20 20 20 20 20 20 2f  lect *p,       /
5be0: 2a 20 54 68 65 20 53 45 4c 45 43 54 20 73 74 61  * The SELECT sta
5bf0: 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 56 64 62 65  tement */.  Vdbe
5c00: 20 2a 76 2c 20 20 20 20 20 20 20 20 20 2f 2a 20   *v,         /* 
5c10: 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 69 6e  Generate code in
5c20: 74 6f 20 74 68 69 73 20 56 44 42 45 20 2a 2f 0a  to this VDBE */.
5c30: 20 20 69 6e 74 20 6e 43 6f 6c 75 6d 6e 2c 20 20    int nColumn,  
5c40: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
5c50: 63 6f 6c 75 6d 6e 73 20 6f 66 20 64 61 74 61 20  columns of data 
5c60: 2a 2f 0a 20 20 69 6e 74 20 65 44 65 73 74 2c 20  */.  int eDest, 
5c70: 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20 74        /* Write t
5c80: 68 65 20 73 6f 72 74 65 64 20 72 65 73 75 6c 74  he sorted result
5c90: 73 20 68 65 72 65 20 2a 2f 0a 20 20 69 6e 74 20  s here */.  int 
5ca0: 69 50 61 72 6d 20 20 20 20 20 20 20 20 2f 2a 20  iParm        /* 
5cb0: 4f 70 74 69 6f 6e 61 6c 20 70 61 72 61 6d 65 74  Optional paramet
5cc0: 65 72 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  er associated wi
5cd0: 74 68 20 65 44 65 73 74 20 2a 2f 0a 29 7b 0a 20  th eDest */.){. 
5ce0: 20 69 6e 74 20 62 72 6b 20 3d 20 73 71 6c 69 74   int brk = sqlit
5cf0: 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28  e3VdbeMakeLabel(
5d00: 76 29 3b 0a 20 20 69 6e 74 20 63 6f 6e 74 20 3d  v);.  int cont =
5d10: 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65   sqlite3VdbeMake
5d20: 4c 61 62 65 6c 28 76 29 3b 0a 20 20 69 6e 74 20  Label(v);.  int 
5d30: 61 64 64 72 3b 0a 20 20 69 6e 74 20 69 54 61 62  addr;.  int iTab
5d40: 3b 0a 20 20 69 6e 74 20 70 73 65 75 64 6f 54 61  ;.  int pseudoTa
5d50: 62 20 3d 20 30 3b 0a 20 20 45 78 70 72 4c 69 73  b = 0;.  ExprLis
5d60: 74 20 2a 70 4f 72 64 65 72 42 79 20 3d 20 70 2d  t *pOrderBy = p-
5d70: 3e 70 4f 72 64 65 72 42 79 3b 0a 0a 20 20 69 54  >pOrderBy;..  iT
5d80: 61 62 20 3d 20 70 4f 72 64 65 72 42 79 2d 3e 69  ab = pOrderBy->i
5d90: 45 43 75 72 73 6f 72 3b 0a 20 20 69 66 28 20 65  ECursor;.  if( e
5da0: 44 65 73 74 3d 3d 53 52 54 5f 43 61 6c 6c 62 61  Dest==SRT_Callba
5db0: 63 6b 20 7c 7c 20 65 44 65 73 74 3d 3d 53 52 54  ck || eDest==SRT
5dc0: 5f 53 75 62 72 6f 75 74 69 6e 65 20 29 7b 0a 20  _Subroutine ){. 
5dd0: 20 20 20 70 73 65 75 64 6f 54 61 62 20 3d 20 70     pseudoTab = p
5de0: 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20  Parse->nTab++;. 
5df0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
5e00: 64 4f 70 28 76 2c 20 4f 50 5f 4f 70 65 6e 50 73  dOp(v, OP_OpenPs
5e10: 65 75 64 6f 2c 20 70 73 65 75 64 6f 54 61 62 2c  eudo, pseudoTab,
5e20: 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33   0);.    sqlite3
5e30: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
5e40: 53 65 74 4e 75 6d 43 6f 6c 75 6d 6e 73 2c 20 70  SetNumColumns, p
5e50: 73 65 75 64 6f 54 61 62 2c 20 6e 43 6f 6c 75 6d  seudoTab, nColum
5e60: 6e 29 3b 0a 20 20 7d 0a 20 20 61 64 64 72 20 3d  n);.  }.  addr =
5e70: 20 31 20 2b 20 73 71 6c 69 74 65 33 56 64 62 65   1 + sqlite3Vdbe
5e80: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 53 6f 72 74  AddOp(v, OP_Sort
5e90: 2c 20 69 54 61 62 2c 20 62 72 6b 29 3b 0a 20 20  , iTab, brk);.  
5ea0: 63 6f 64 65 4f 66 66 73 65 74 28 76 2c 20 70 2c  codeOffset(v, p,
5eb0: 20 63 6f 6e 74 2c 20 30 29 3b 0a 20 20 69 66 28   cont, 0);.  if(
5ec0: 20 65 44 65 73 74 3d 3d 53 52 54 5f 43 61 6c 6c   eDest==SRT_Call
5ed0: 62 61 63 6b 20 7c 7c 20 65 44 65 73 74 3d 3d 53  back || eDest==S
5ee0: 52 54 5f 53 75 62 72 6f 75 74 69 6e 65 20 29 7b  RT_Subroutine ){
5ef0: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
5f00: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49 6e 74 65  AddOp(v, OP_Inte
5f10: 67 65 72 2c 20 31 2c 20 30 29 3b 0a 20 20 7d 0a  ger, 1, 0);.  }.
5f20: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
5f30: 4f 70 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c  Op(v, OP_Column,
5f40: 20 69 54 61 62 2c 20 70 4f 72 64 65 72 42 79 2d   iTab, pOrderBy-
5f50: 3e 6e 45 78 70 72 20 2b 20 31 29 3b 0a 20 20 73  >nExpr + 1);.  s
5f60: 77 69 74 63 68 28 20 65 44 65 73 74 20 29 7b 0a  witch( eDest ){.
5f70: 20 20 20 20 63 61 73 65 20 53 52 54 5f 54 61 62      case SRT_Tab
5f80: 6c 65 3a 0a 20 20 20 20 63 61 73 65 20 53 52 54  le:.    case SRT
5f90: 5f 45 70 68 65 6d 54 61 62 3a 20 7b 0a 20 20 20  _EphemTab: {.   
5fa0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
5fb0: 64 4f 70 28 76 2c 20 4f 50 5f 4e 65 77 52 6f 77  dOp(v, OP_NewRow
5fc0: 69 64 2c 20 69 50 61 72 6d 2c 20 30 29 3b 0a 20  id, iParm, 0);. 
5fd0: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
5fe0: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 50 75 6c 6c  AddOp(v, OP_Pull
5ff0: 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20 20 20 73  , 1, 0);.      s
6000: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
6010: 76 2c 20 4f 50 5f 49 6e 73 65 72 74 2c 20 69 50  v, OP_Insert, iP
6020: 61 72 6d 2c 20 4f 50 46 4c 41 47 5f 41 50 50 45  arm, OPFLAG_APPE
6030: 4e 44 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  ND);.      break
6040: 3b 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20  ;.    }.#ifndef 
6050: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51  SQLITE_OMIT_SUBQ
6060: 55 45 52 59 0a 20 20 20 20 63 61 73 65 20 53 52  UERY.    case SR
6070: 54 5f 53 65 74 3a 20 7b 0a 20 20 20 20 20 20 61  T_Set: {.      a
6080: 73 73 65 72 74 28 20 6e 43 6f 6c 75 6d 6e 3d 3d  ssert( nColumn==
6090: 31 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  1 );.      sqlit
60a0: 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
60b0: 50 5f 4e 6f 74 4e 75 6c 6c 2c 20 2d 31 2c 20 73  P_NotNull, -1, s
60c0: 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e  qlite3VdbeCurren
60d0: 74 41 64 64 72 28 76 29 2b 33 29 3b 0a 20 20 20  tAddr(v)+3);.   
60e0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
60f0: 64 4f 70 28 76 2c 20 4f 50 5f 50 6f 70 2c 20 31  dOp(v, OP_Pop, 1
6100: 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  , 0);.      sqli
6110: 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
6120: 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 73 71 6c 69  OP_Goto, 0, sqli
6130: 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64  te3VdbeCurrentAd
6140: 64 72 28 76 29 2b 33 29 3b 0a 20 20 20 20 20 20  dr(v)+3);.      
6150: 73 71 6c 69 74 65 33 56 64 62 65 4f 70 33 28 76  sqlite3VdbeOp3(v
6160: 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c  , OP_MakeRecord,
6170: 20 31 2c 20 30 2c 20 26 70 2d 3e 61 66 66 69 6e   1, 0, &p->affin
6180: 69 74 79 2c 20 31 29 3b 0a 20 20 20 20 20 20 73  ity, 1);.      s
6190: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
61a0: 76 2c 20 4f 50 5f 49 64 78 49 6e 73 65 72 74 2c  v, OP_IdxInsert,
61b0: 20 28 69 50 61 72 6d 26 30 78 30 30 30 30 46 46   (iParm&0x0000FF
61c0: 46 46 29 2c 20 30 29 3b 0a 20 20 20 20 20 20 62  FF), 0);.      b
61d0: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
61e0: 63 61 73 65 20 53 52 54 5f 4d 65 6d 3a 20 7b 0a  case SRT_Mem: {.
61f0: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6e 43        assert( nC
6200: 6f 6c 75 6d 6e 3d 3d 31 20 29 3b 0a 20 20 20 20  olumn==1 );.    
6210: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
6220: 4f 70 28 76 2c 20 4f 50 5f 4d 65 6d 53 74 6f 72  Op(v, OP_MemStor
6230: 65 2c 20 69 50 61 72 6d 2c 20 31 29 3b 0a 20 20  e, iParm, 1);.  
6240: 20 20 20 20 2f 2a 20 54 68 65 20 4c 49 4d 49 54      /* The LIMIT
6250: 20 63 6c 61 75 73 65 20 77 69 6c 6c 20 74 65 72   clause will ter
6260: 6d 69 6e 61 74 65 20 74 68 65 20 6c 6f 6f 70 20  minate the loop 
6270: 66 6f 72 20 75 73 20 2a 2f 0a 20 20 20 20 20 20  for us */.      
6280: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e  break;.    }.#en
6290: 64 69 66 0a 20 20 20 20 63 61 73 65 20 53 52 54  dif.    case SRT
62a0: 5f 43 61 6c 6c 62 61 63 6b 3a 0a 20 20 20 20 63  _Callback:.    c
62b0: 61 73 65 20 53 52 54 5f 53 75 62 72 6f 75 74 69  ase SRT_Subrouti
62c0: 6e 65 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20  ne: {.      int 
62d0: 69 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  i;.      sqlite3
62e0: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
62f0: 49 6e 73 65 72 74 2c 20 70 73 65 75 64 6f 54 61  Insert, pseudoTa
6300: 62 2c 20 30 29 3b 0a 20 20 20 20 20 20 66 6f 72  b, 0);.      for
6310: 28 69 3d 30 3b 20 69 3c 6e 43 6f 6c 75 6d 6e 3b  (i=0; i<nColumn;
6320: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 73   i++){.        s
6330: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
6340: 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 70 73  v, OP_Column, ps
6350: 65 75 64 6f 54 61 62 2c 20 69 29 3b 0a 20 20 20  eudoTab, i);.   
6360: 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 65     }.      if( e
6370: 44 65 73 74 3d 3d 53 52 54 5f 43 61 6c 6c 62 61  Dest==SRT_Callba
6380: 63 6b 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  ck ){.        sq
6390: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
63a0: 2c 20 4f 50 5f 43 61 6c 6c 62 61 63 6b 2c 20 6e  , OP_Callback, n
63b0: 43 6f 6c 75 6d 6e 2c 20 30 29 3b 0a 20 20 20 20  Column, 0);.    
63c0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
63d0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
63e0: 70 28 76 2c 20 4f 50 5f 47 6f 73 75 62 2c 20 30  p(v, OP_Gosub, 0
63f0: 2c 20 69 50 61 72 6d 29 3b 0a 20 20 20 20 20 20  , iParm);.      
6400: 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  }.      break;. 
6410: 20 20 20 7d 0a 20 20 20 20 64 65 66 61 75 6c 74     }.    default
6420: 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20 44 6f 20  : {.      /* Do 
6430: 6e 6f 74 68 69 6e 67 20 2a 2f 0a 20 20 20 20 20  nothing */.     
6440: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
6450: 7d 0a 0a 20 20 2f 2a 20 4a 75 6d 70 20 74 6f 20  }..  /* Jump to 
6460: 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 6c  the end of the l
6470: 6f 6f 70 20 77 68 65 6e 20 74 68 65 20 4c 49 4d  oop when the LIM
6480: 49 54 20 69 73 20 72 65 61 63 68 65 64 0a 20 20  IT is reached.  
6490: 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 69 4c 69 6d  */.  if( p->iLim
64a0: 69 74 3e 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c  it>=0 ){.    sql
64b0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
64c0: 20 4f 50 5f 4d 65 6d 49 6e 63 72 2c 20 2d 31 2c   OP_MemIncr, -1,
64d0: 20 70 2d 3e 69 4c 69 6d 69 74 29 3b 0a 20 20 20   p->iLimit);.   
64e0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
64f0: 70 28 76 2c 20 4f 50 5f 49 66 4d 65 6d 5a 65 72  p(v, OP_IfMemZer
6500: 6f 2c 20 70 2d 3e 69 4c 69 6d 69 74 2c 20 62 72  o, p->iLimit, br
6510: 6b 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68  k);.  }..  /* Th
6520: 65 20 62 6f 74 74 6f 6d 20 6f 66 20 74 68 65 20  e bottom of the 
6530: 6c 6f 6f 70 0a 20 20 2a 2f 0a 20 20 73 71 6c 69  loop.  */.  sqli
6540: 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61  te3VdbeResolveLa
6550: 62 65 6c 28 76 2c 20 63 6f 6e 74 29 3b 0a 20 20  bel(v, cont);.  
6560: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
6570: 28 76 2c 20 4f 50 5f 4e 65 78 74 2c 20 69 54 61  (v, OP_Next, iTa
6580: 62 2c 20 61 64 64 72 29 3b 0a 20 20 73 71 6c 69  b, addr);.  sqli
6590: 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61  te3VdbeResolveLa
65a0: 62 65 6c 28 76 2c 20 62 72 6b 29 3b 0a 20 20 69  bel(v, brk);.  i
65b0: 66 28 20 65 44 65 73 74 3d 3d 53 52 54 5f 43 61  f( eDest==SRT_Ca
65c0: 6c 6c 62 61 63 6b 20 7c 7c 20 65 44 65 73 74 3d  llback || eDest=
65d0: 3d 53 52 54 5f 53 75 62 72 6f 75 74 69 6e 65 20  =SRT_Subroutine 
65e0: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  ){.    sqlite3Vd
65f0: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 43 6c  beAddOp(v, OP_Cl
6600: 6f 73 65 2c 20 70 73 65 75 64 6f 54 61 62 2c 20  ose, pseudoTab, 
6610: 30 29 3b 0a 20 20 7d 0a 0a 7d 0a 0a 2f 2a 0a 2a  0);.  }..}../*.*
6620: 2a 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74  * Return a point
6630: 65 72 20 74 6f 20 61 20 73 74 72 69 6e 67 20 63  er to a string c
6640: 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 27 64  ontaining the 'd
6650: 65 63 6c 61 72 61 74 69 6f 6e 20 74 79 70 65 27  eclaration type'
6660: 20 6f 66 20 74 68 65 0a 2a 2a 20 65 78 70 72 65   of the.** expre
6670: 73 73 69 6f 6e 20 70 45 78 70 72 2e 20 54 68 65  ssion pExpr. The
6680: 20 73 74 72 69 6e 67 20 6d 61 79 20 62 65 20 74   string may be t
6690: 72 65 61 74 65 64 20 61 73 20 73 74 61 74 69 63  reated as static
66a0: 20 62 79 20 74 68 65 20 63 61 6c 6c 65 72 2e 0a   by the caller..
66b0: 2a 2a 0a 2a 2a 20 54 68 65 20 64 65 63 6c 61 72  **.** The declar
66c0: 61 74 69 6f 6e 20 74 79 70 65 20 69 73 20 74 68  ation type is th
66d0: 65 20 65 78 61 63 74 20 64 61 74 61 74 79 70 65  e exact datatype
66e0: 20 64 65 66 69 6e 69 74 69 6f 6e 20 65 78 74 72   definition extr
66f0: 61 63 74 65 64 20 66 72 6f 6d 20 74 68 65 0a 2a  acted from the.*
6700: 2a 20 6f 72 69 67 69 6e 61 6c 20 43 52 45 41 54  * original CREAT
6710: 45 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e  E TABLE statemen
6720: 74 20 69 66 20 74 68 65 20 65 78 70 72 65 73 73  t if the express
6730: 69 6f 6e 20 69 73 20 61 20 63 6f 6c 75 6d 6e 2e  ion is a column.
6740: 20 54 68 65 0a 2a 2a 20 64 65 63 6c 61 72 61 74   The.** declarat
6750: 69 6f 6e 20 74 79 70 65 20 66 6f 72 20 61 20 52  ion type for a R
6760: 4f 57 49 44 20 66 69 65 6c 64 20 69 73 20 49 4e  OWID field is IN
6770: 54 45 47 45 52 2e 20 45 78 61 63 74 6c 79 20 77  TEGER. Exactly w
6780: 68 65 6e 20 61 6e 20 65 78 70 72 65 73 73 69 6f  hen an expressio
6790: 6e 0a 2a 2a 20 69 73 20 63 6f 6e 73 69 64 65 72  n.** is consider
67a0: 65 64 20 61 20 63 6f 6c 75 6d 6e 20 63 61 6e 20  ed a column can 
67b0: 62 65 20 63 6f 6d 70 6c 65 78 20 69 6e 20 74 68  be complex in th
67c0: 65 20 70 72 65 73 65 6e 63 65 20 6f 66 20 73 75  e presence of su
67d0: 62 71 75 65 72 69 65 73 2e 20 54 68 65 0a 2a 2a  bqueries. The.**
67e0: 20 72 65 73 75 6c 74 2d 73 65 74 20 65 78 70 72   result-set expr
67f0: 65 73 73 69 6f 6e 20 69 6e 20 61 6c 6c 20 6f 66  ession in all of
6800: 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 53   the following S
6810: 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 73  ELECT statements
6820: 20 69 73 20 0a 2a 2a 20 63 6f 6e 73 69 64 65 72   is .** consider
6830: 65 64 20 61 20 63 6f 6c 75 6d 6e 20 62 79 20 74  ed a column by t
6840: 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a  his function..**
6850: 0a 2a 2a 20 20 20 53 45 4c 45 43 54 20 63 6f 6c  .**   SELECT col
6860: 20 46 52 4f 4d 20 74 62 6c 3b 0a 2a 2a 20 20 20   FROM tbl;.**   
6870: 53 45 4c 45 43 54 20 28 53 45 4c 45 43 54 20 63  SELECT (SELECT c
6880: 6f 6c 20 46 52 4f 4d 20 74 62 6c 3b 0a 2a 2a 20  ol FROM tbl;.** 
6890: 20 20 53 45 4c 45 43 54 20 28 53 45 4c 45 43 54    SELECT (SELECT
68a0: 20 63 6f 6c 20 46 52 4f 4d 20 74 62 6c 29 3b 0a   col FROM tbl);.
68b0: 2a 2a 20 20 20 53 45 4c 45 43 54 20 61 62 63 20  **   SELECT abc 
68c0: 46 52 4f 4d 20 28 53 45 4c 45 43 54 20 63 6f 6c  FROM (SELECT col
68d0: 20 41 53 20 61 62 63 20 46 52 4f 4d 20 74 62 6c   AS abc FROM tbl
68e0: 29 3b 0a 2a 2a 20 0a 2a 2a 20 54 68 65 20 64 65  );.** .** The de
68f0: 63 6c 61 72 61 74 69 6f 6e 20 74 79 70 65 20 66  claration type f
6900: 6f 72 20 61 6e 79 20 65 78 70 72 65 73 73 69 6f  or any expressio
6910: 6e 20 6f 74 68 65 72 20 74 68 61 6e 20 61 20 63  n other than a c
6920: 6f 6c 75 6d 6e 20 69 73 20 4e 55 4c 4c 2e 0a 2a  olumn is NULL..*
6930: 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63  /.static const c
6940: 68 61 72 20 2a 63 6f 6c 75 6d 6e 54 79 70 65 28  har *columnType(
6950: 0a 20 20 4e 61 6d 65 43 6f 6e 74 65 78 74 20 2a  .  NameContext *
6960: 70 4e 43 2c 20 0a 20 20 45 78 70 72 20 2a 70 45  pNC, .  Expr *pE
6970: 78 70 72 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61  xpr,.  const cha
6980: 72 20 2a 2a 70 7a 4f 72 69 67 69 6e 44 62 2c 0a  r **pzOriginDb,.
6990: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 2a 70    const char **p
69a0: 7a 4f 72 69 67 69 6e 54 61 62 2c 0a 20 20 63 6f  zOriginTab,.  co
69b0: 6e 73 74 20 63 68 61 72 20 2a 2a 70 7a 4f 72 69  nst char **pzOri
69c0: 67 69 6e 43 6f 6c 0a 29 7b 0a 20 20 63 68 61 72  ginCol.){.  char
69d0: 20 63 6f 6e 73 74 20 2a 7a 54 79 70 65 20 3d 20   const *zType = 
69e0: 30 3b 0a 20 20 63 68 61 72 20 63 6f 6e 73 74 20  0;.  char const 
69f0: 2a 7a 4f 72 69 67 69 6e 44 62 20 3d 20 30 3b 0a  *zOriginDb = 0;.
6a00: 20 20 63 68 61 72 20 63 6f 6e 73 74 20 2a 7a 4f    char const *zO
6a10: 72 69 67 69 6e 54 61 62 20 3d 20 30 3b 0a 20 20  riginTab = 0;.  
6a20: 63 68 61 72 20 63 6f 6e 73 74 20 2a 7a 4f 72 69  char const *zOri
6a30: 67 69 6e 43 6f 6c 20 3d 20 30 3b 0a 20 20 69 6e  ginCol = 0;.  in
6a40: 74 20 6a 3b 0a 20 20 69 66 28 20 70 45 78 70 72  t j;.  if( pExpr
6a50: 3d 3d 30 20 7c 7c 20 70 4e 43 2d 3e 70 53 72 63  ==0 || pNC->pSrc
6a60: 4c 69 73 74 3d 3d 30 20 29 20 72 65 74 75 72 6e  List==0 ) return
6a70: 20 30 3b 0a 0a 20 20 73 77 69 74 63 68 28 20 70   0;..  switch( p
6a80: 45 78 70 72 2d 3e 6f 70 20 29 7b 0a 20 20 20 20  Expr->op ){.    
6a90: 63 61 73 65 20 54 4b 5f 41 47 47 5f 43 4f 4c 55  case TK_AGG_COLU
6aa0: 4d 4e 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  MN:.    case TK_
6ab0: 43 4f 4c 55 4d 4e 3a 20 7b 0a 20 20 20 20 20 20  COLUMN: {.      
6ac0: 2f 2a 20 54 68 65 20 65 78 70 72 65 73 73 69 6f  /* The expressio
6ad0: 6e 20 69 73 20 61 20 63 6f 6c 75 6d 6e 2e 20 4c  n is a column. L
6ae0: 6f 63 61 74 65 20 74 68 65 20 74 61 62 6c 65 20  ocate the table 
6af0: 74 68 65 20 63 6f 6c 75 6d 6e 20 69 73 20 62 65  the column is be
6b00: 69 6e 67 0a 20 20 20 20 20 20 2a 2a 20 65 78 74  ing.      ** ext
6b10: 72 61 63 74 65 64 20 66 72 6f 6d 20 69 6e 20 4e  racted from in N
6b20: 61 6d 65 43 6f 6e 74 65 78 74 2e 70 53 72 63 4c  ameContext.pSrcL
6b30: 69 73 74 2e 20 54 68 69 73 20 74 61 62 6c 65 20  ist. This table 
6b40: 6d 61 79 20 62 65 20 72 65 61 6c 0a 20 20 20 20  may be real.    
6b50: 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20 74 61    ** database ta
6b60: 62 6c 65 20 6f 72 20 61 20 73 75 62 71 75 65 72  ble or a subquer
6b70: 79 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  y..      */.    
6b80: 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20    Table *pTab = 
6b90: 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  0;            /*
6ba0: 20 54 61 62 6c 65 20 73 74 72 75 63 74 75 72 65   Table structure
6bb0: 20 63 6f 6c 75 6d 6e 20 69 73 20 65 78 74 72 61   column is extra
6bc0: 63 74 65 64 20 66 72 6f 6d 20 2a 2f 0a 20 20 20  cted from */.   
6bd0: 20 20 20 53 65 6c 65 63 74 20 2a 70 53 20 3d 20     Select *pS = 
6be0: 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  0;             /
6bf0: 2a 20 53 65 6c 65 63 74 20 74 68 65 20 63 6f 6c  * Select the col
6c00: 75 6d 6e 20 69 73 20 65 78 74 72 61 63 74 65 64  umn is extracted
6c10: 20 66 72 6f 6d 20 2a 2f 0a 20 20 20 20 20 20 69   from */.      i
6c20: 6e 74 20 69 43 6f 6c 20 3d 20 70 45 78 70 72 2d  nt iCol = pExpr-
6c30: 3e 69 43 6f 6c 75 6d 6e 3b 20 20 2f 2a 20 49 6e  >iColumn;  /* In
6c40: 64 65 78 20 6f 66 20 63 6f 6c 75 6d 6e 20 69 6e  dex of column in
6c50: 20 70 54 61 62 20 2a 2f 0a 20 20 20 20 20 20 77   pTab */.      w
6c60: 68 69 6c 65 28 20 70 4e 43 20 26 26 20 21 70 54  hile( pNC && !pT
6c70: 61 62 20 29 7b 0a 20 20 20 20 20 20 20 20 53 72  ab ){.        Sr
6c80: 63 4c 69 73 74 20 2a 70 54 61 62 4c 69 73 74 20  cList *pTabList 
6c90: 3d 20 70 4e 43 2d 3e 70 53 72 63 4c 69 73 74 3b  = pNC->pSrcList;
6ca0: 0a 20 20 20 20 20 20 20 20 66 6f 72 28 6a 3d 30  .        for(j=0
6cb0: 3b 6a 3c 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72  ;j<pTabList->nSr
6cc0: 63 20 26 26 20 70 54 61 62 4c 69 73 74 2d 3e 61  c && pTabList->a
6cd0: 5b 6a 5d 2e 69 43 75 72 73 6f 72 21 3d 70 45 78  [j].iCursor!=pEx
6ce0: 70 72 2d 3e 69 54 61 62 6c 65 3b 6a 2b 2b 29 3b  pr->iTable;j++);
6cf0: 0a 20 20 20 20 20 20 20 20 69 66 28 20 6a 3c 70  .        if( j<p
6d00: 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 20 29 7b  TabList->nSrc ){
6d10: 0a 20 20 20 20 20 20 20 20 20 20 70 54 61 62 20  .          pTab 
6d20: 3d 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 6a 5d  = pTabList->a[j]
6d30: 2e 70 54 61 62 3b 0a 20 20 20 20 20 20 20 20 20  .pTab;.         
6d40: 20 70 53 20 3d 20 70 54 61 62 4c 69 73 74 2d 3e   pS = pTabList->
6d50: 61 5b 6a 5d 2e 70 53 65 6c 65 63 74 3b 0a 20 20  a[j].pSelect;.  
6d60: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
6d70: 20 20 20 20 20 20 20 70 4e 43 20 3d 20 70 4e 43         pNC = pNC
6d80: 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 20  ->pNext;.       
6d90: 20 7d 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20   }.      }..    
6da0: 20 20 69 66 28 20 70 54 61 62 3d 3d 30 20 29 7b    if( pTab==0 ){
6db0: 0a 20 20 20 20 20 20 20 20 2f 2a 20 46 49 58 20  .        /* FIX 
6dc0: 4d 45 3a 0a 20 20 20 20 20 20 20 20 2a 2a 20 54  ME:.        ** T
6dd0: 68 69 73 20 63 61 6e 20 6f 63 63 75 72 73 20 69  his can occurs i
6de0: 66 20 79 6f 75 20 68 61 76 65 20 73 6f 6d 65 74  f you have somet
6df0: 68 69 6e 67 20 6c 69 6b 65 20 22 53 45 4c 45 43  hing like "SELEC
6e00: 54 20 6e 65 77 2e 78 3b 22 20 69 6e 73 69 64 65  T new.x;" inside
6e10: 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 20 74 72  .        ** a tr
6e20: 69 67 67 65 72 2e 20 20 49 6e 20 6f 74 68 65 72  igger.  In other
6e30: 20 77 6f 72 64 73 2c 20 69 66 20 79 6f 75 20 72   words, if you r
6e40: 65 66 65 72 65 6e 63 65 20 74 68 65 20 73 70 65  eference the spe
6e50: 63 69 61 6c 20 22 6e 65 77 22 0a 20 20 20 20 20  cial "new".     
6e60: 20 20 20 2a 2a 20 74 61 62 6c 65 20 69 6e 20 74     ** table in t
6e70: 68 65 20 72 65 73 75 6c 74 20 73 65 74 20 6f 66  he result set of
6e80: 20 61 20 73 65 6c 65 63 74 2e 20 20 57 65 20 64   a select.  We d
6e90: 6f 20 6e 6f 74 20 68 61 76 65 20 61 20 67 6f 6f  o not have a goo
6ea0: 64 20 77 61 79 0a 20 20 20 20 20 20 20 20 2a 2a  d way.        **
6eb0: 20 74 6f 20 66 69 6e 64 20 74 68 65 20 61 63 74   to find the act
6ec0: 75 61 6c 20 74 61 62 6c 65 20 74 79 70 65 2c 20  ual table type, 
6ed0: 73 6f 20 63 61 6c 6c 20 69 74 20 22 54 45 58 54  so call it "TEXT
6ee0: 22 2e 20 20 54 68 69 73 20 69 73 20 72 65 61 6c  ".  This is real
6ef0: 6c 79 0a 20 20 20 20 20 20 20 20 2a 2a 20 73 6f  ly.        ** so
6f00: 6d 65 74 68 69 6e 67 20 6f 66 20 61 20 62 75 67  mething of a bug
6f10: 2c 20 62 75 74 20 49 20 64 6f 20 6e 6f 74 20 6b  , but I do not k
6f20: 6e 6f 77 20 68 6f 77 20 74 6f 20 66 69 78 20 69  now how to fix i
6f30: 74 2e 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20  t..        **.  
6f40: 20 20 20 20 20 20 2a 2a 20 54 68 69 73 20 63 6f        ** This co
6f50: 64 65 20 64 6f 65 73 20 6e 6f 74 20 70 72 6f 64  de does not prod
6f60: 75 63 65 20 74 68 65 20 63 6f 72 72 65 63 74 20  uce the correct 
6f70: 61 6e 73 77 65 72 20 2d 20 69 74 20 6a 75 73 74  answer - it just
6f80: 20 70 72 65 76 65 6e 74 73 0a 20 20 20 20 20 20   prevents.      
6f90: 20 20 2a 2a 20 61 20 73 65 67 66 61 75 6c 74 2e    ** a segfault.
6fa0: 20 20 53 65 65 20 74 69 63 6b 65 74 20 23 31 32    See ticket #12
6fb0: 32 39 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20  29..        */. 
6fc0: 20 20 20 20 20 20 20 7a 54 79 70 65 20 3d 20 22         zType = "
6fd0: 54 45 58 54 22 3b 0a 20 20 20 20 20 20 20 20 62  TEXT";.        b
6fe0: 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 0a 20  reak;.      }.. 
6ff0: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 54 61       assert( pTa
7000: 62 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70  b );.      if( p
7010: 53 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  S ){.        /* 
7020: 54 68 65 20 22 74 61 62 6c 65 22 20 69 73 20 61  The "table" is a
7030: 63 74 75 61 6c 6c 79 20 61 20 73 75 62 2d 73 65  ctually a sub-se
7040: 6c 65 63 74 20 6f 72 20 61 20 76 69 65 77 20 69  lect or a view i
7050: 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73  n the FROM claus
7060: 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f 66 20  e.        ** of 
7070: 74 68 65 20 53 45 4c 45 43 54 20 73 74 61 74 65  the SELECT state
7080: 6d 65 6e 74 2e 20 52 65 74 75 72 6e 20 74 68 65  ment. Return the
7090: 20 64 65 63 6c 61 72 61 74 69 6f 6e 20 74 79 70   declaration typ
70a0: 65 20 61 6e 64 20 6f 72 69 67 69 6e 0a 20 20 20  e and origin.   
70b0: 20 20 20 20 20 2a 2a 20 64 61 74 61 20 66 6f 72       ** data for
70c0: 20 74 68 65 20 72 65 73 75 6c 74 2d 73 65 74 20   the result-set 
70d0: 63 6f 6c 75 6d 6e 20 6f 66 20 74 68 65 20 73 75  column of the su
70e0: 62 2d 73 65 6c 65 63 74 2e 0a 20 20 20 20 20 20  b-select..      
70f0: 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28    */.        if(
7100: 20 69 43 6f 6c 3e 3d 30 20 26 26 20 69 43 6f 6c   iCol>=0 && iCol
7110: 3c 70 53 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78  <pS->pEList->nEx
7120: 70 72 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  pr ){.          
7130: 2f 2a 20 49 66 20 69 43 6f 6c 20 69 73 20 6c 65  /* If iCol is le
7140: 73 73 20 74 68 61 6e 20 7a 65 72 6f 2c 20 74 68  ss than zero, th
7150: 65 6e 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  en the expressio
7160: 6e 20 72 65 71 75 65 73 74 73 20 74 68 65 0a 20  n requests the. 
7170: 20 20 20 20 20 20 20 20 20 2a 2a 20 72 6f 77 69           ** rowi
7180: 64 20 6f 66 20 74 68 65 20 73 75 62 2d 73 65 6c  d of the sub-sel
7190: 65 63 74 20 6f 72 20 76 69 65 77 2e 20 54 68 69  ect or view. Thi
71a0: 73 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20  s expression is 
71b0: 6c 65 67 61 6c 20 28 73 65 65 20 0a 20 20 20 20  legal (see .    
71c0: 20 20 20 20 20 20 2a 2a 20 74 65 73 74 20 63 61        ** test ca
71d0: 73 65 20 6d 69 73 63 32 2e 32 2e 32 29 20 2d 20  se misc2.2.2) - 
71e0: 69 74 20 61 6c 77 61 79 73 20 65 76 61 6c 75 61  it always evalua
71f0: 74 65 73 20 74 6f 20 4e 55 4c 4c 2e 0a 20 20 20  tes to NULL..   
7200: 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
7210: 20 20 20 20 4e 61 6d 65 43 6f 6e 74 65 78 74 20      NameContext 
7220: 73 4e 43 3b 0a 20 20 20 20 20 20 20 20 20 20 45  sNC;.          E
7230: 78 70 72 20 2a 70 20 3d 20 70 53 2d 3e 70 45 4c  xpr *p = pS->pEL
7240: 69 73 74 2d 3e 61 5b 69 43 6f 6c 5d 2e 70 45 78  ist->a[iCol].pEx
7250: 70 72 3b 0a 20 20 20 20 20 20 20 20 20 20 73 4e  pr;.          sN
7260: 43 2e 70 53 72 63 4c 69 73 74 20 3d 20 70 53 2d  C.pSrcList = pS-
7270: 3e 70 53 72 63 3b 0a 20 20 20 20 20 20 20 20 20  >pSrc;.         
7280: 20 73 4e 43 2e 70 4e 65 78 74 20 3d 20 30 3b 0a   sNC.pNext = 0;.
7290: 20 20 20 20 20 20 20 20 20 20 73 4e 43 2e 70 50            sNC.pP
72a0: 61 72 73 65 20 3d 20 70 4e 43 2d 3e 70 50 61 72  arse = pNC->pPar
72b0: 73 65 3b 0a 20 20 20 20 20 20 20 20 20 20 7a 54  se;.          zT
72c0: 79 70 65 20 3d 20 63 6f 6c 75 6d 6e 54 79 70 65  ype = columnType
72d0: 28 26 73 4e 43 2c 20 70 2c 20 26 7a 4f 72 69 67  (&sNC, p, &zOrig
72e0: 69 6e 44 62 2c 20 26 7a 4f 72 69 67 69 6e 54 61  inDb, &zOriginTa
72f0: 62 2c 20 26 7a 4f 72 69 67 69 6e 43 6f 6c 29 3b  b, &zOriginCol);
7300: 20 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20   .        }.    
7310: 20 20 7d 65 6c 73 65 20 69 66 28 20 70 54 61 62    }else if( pTab
7320: 2d 3e 70 53 63 68 65 6d 61 20 29 7b 0a 20 20 20  ->pSchema ){.   
7330: 20 20 20 20 20 2f 2a 20 41 20 72 65 61 6c 20 74       /* A real t
7340: 61 62 6c 65 20 2a 2f 0a 20 20 20 20 20 20 20 20  able */.        
7350: 61 73 73 65 72 74 28 20 21 70 53 20 29 3b 0a 20  assert( !pS );. 
7360: 20 20 20 20 20 20 20 69 66 28 20 69 43 6f 6c 3c         if( iCol<
7370: 30 20 29 20 69 43 6f 6c 20 3d 20 70 54 61 62 2d  0 ) iCol = pTab-
7380: 3e 69 50 4b 65 79 3b 0a 20 20 20 20 20 20 20 20  >iPKey;.        
7390: 61 73 73 65 72 74 28 20 69 43 6f 6c 3d 3d 2d 31  assert( iCol==-1
73a0: 20 7c 7c 20 28 69 43 6f 6c 3e 3d 30 20 26 26 20   || (iCol>=0 && 
73b0: 69 43 6f 6c 3c 70 54 61 62 2d 3e 6e 43 6f 6c 29  iCol<pTab->nCol)
73c0: 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20   );.        if( 
73d0: 69 43 6f 6c 3c 30 20 29 7b 0a 20 20 20 20 20 20  iCol<0 ){.      
73e0: 20 20 20 20 7a 54 79 70 65 20 3d 20 22 49 4e 54      zType = "INT
73f0: 45 47 45 52 22 3b 0a 20 20 20 20 20 20 20 20 20  EGER";.         
7400: 20 7a 4f 72 69 67 69 6e 43 6f 6c 20 3d 20 22 72   zOriginCol = "r
7410: 6f 77 69 64 22 3b 0a 20 20 20 20 20 20 20 20 7d  owid";.        }
7420: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
7430: 7a 54 79 70 65 20 3d 20 70 54 61 62 2d 3e 61 43  zType = pTab->aC
7440: 6f 6c 5b 69 43 6f 6c 5d 2e 7a 54 79 70 65 3b 0a  ol[iCol].zType;.
7450: 20 20 20 20 20 20 20 20 20 20 7a 4f 72 69 67 69            zOrigi
7460: 6e 43 6f 6c 20 3d 20 70 54 61 62 2d 3e 61 43 6f  nCol = pTab->aCo
7470: 6c 5b 69 43 6f 6c 5d 2e 7a 4e 61 6d 65 3b 0a 20  l[iCol].zName;. 
7480: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
7490: 20 7a 4f 72 69 67 69 6e 54 61 62 20 3d 20 70 54   zOriginTab = pT
74a0: 61 62 2d 3e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20  ab->zName;.     
74b0: 20 20 20 69 66 28 20 70 4e 43 2d 3e 70 50 61 72     if( pNC->pPar
74c0: 73 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  se ){.          
74d0: 69 6e 74 20 69 44 62 20 3d 20 73 71 6c 69 74 65  int iDb = sqlite
74e0: 33 53 63 68 65 6d 61 54 6f 49 6e 64 65 78 28 70  3SchemaToIndex(p
74f0: 4e 43 2d 3e 70 50 61 72 73 65 2d 3e 64 62 2c 20  NC->pParse->db, 
7500: 70 54 61 62 2d 3e 70 53 63 68 65 6d 61 29 3b 0a  pTab->pSchema);.
7510: 20 20 20 20 20 20 20 20 20 20 7a 4f 72 69 67 69            zOrigi
7520: 6e 44 62 20 3d 20 70 4e 43 2d 3e 70 50 61 72 73  nDb = pNC->pPars
7530: 65 2d 3e 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e  e->db->aDb[iDb].
7540: 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20 20 20 7d  zName;.        }
7550: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62  .      }.      b
7560: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 69 66 6e  reak;.    }.#ifn
7570: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
7580: 53 55 42 51 55 45 52 59 0a 20 20 20 20 63 61 73  SUBQUERY.    cas
7590: 65 20 54 4b 5f 53 45 4c 45 43 54 3a 20 7b 0a 20  e TK_SELECT: {. 
75a0: 20 20 20 20 20 2f 2a 20 54 68 65 20 65 78 70 72       /* The expr
75b0: 65 73 73 69 6f 6e 20 69 73 20 61 20 73 75 62 2d  ession is a sub-
75c0: 73 65 6c 65 63 74 2e 20 52 65 74 75 72 6e 20 74  select. Return t
75d0: 68 65 20 64 65 63 6c 61 72 61 74 69 6f 6e 20 74  he declaration t
75e0: 79 70 65 20 61 6e 64 0a 20 20 20 20 20 20 2a 2a  ype and.      **
75f0: 20 6f 72 69 67 69 6e 20 69 6e 66 6f 20 66 6f 72   origin info for
7600: 20 74 68 65 20 73 69 6e 67 6c 65 20 63 6f 6c 75   the single colu
7610: 6d 6e 20 69 6e 20 74 68 65 20 72 65 73 75 6c 74  mn in the result
7620: 20 73 65 74 20 6f 66 20 74 68 65 20 53 45 4c 45   set of the SELE
7630: 43 54 0a 20 20 20 20 20 20 2a 2a 20 73 74 61 74  CT.      ** stat
7640: 65 6d 65 6e 74 2e 0a 20 20 20 20 20 20 2a 2f 0a  ement..      */.
7650: 20 20 20 20 20 20 4e 61 6d 65 43 6f 6e 74 65 78        NameContex
7660: 74 20 73 4e 43 3b 0a 20 20 20 20 20 20 53 65 6c  t sNC;.      Sel
7670: 65 63 74 20 2a 70 53 20 3d 20 70 45 78 70 72 2d  ect *pS = pExpr-
7680: 3e 70 53 65 6c 65 63 74 3b 0a 20 20 20 20 20 20  >pSelect;.      
7690: 45 78 70 72 20 2a 70 20 3d 20 70 53 2d 3e 70 45  Expr *p = pS->pE
76a0: 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72  List->a[0].pExpr
76b0: 3b 0a 20 20 20 20 20 20 73 4e 43 2e 70 53 72 63  ;.      sNC.pSrc
76c0: 4c 69 73 74 20 3d 20 70 53 2d 3e 70 53 72 63 3b  List = pS->pSrc;
76d0: 0a 20 20 20 20 20 20 73 4e 43 2e 70 4e 65 78 74  .      sNC.pNext
76e0: 20 3d 20 70 4e 43 3b 0a 20 20 20 20 20 20 73 4e   = pNC;.      sN
76f0: 43 2e 70 50 61 72 73 65 20 3d 20 70 4e 43 2d 3e  C.pParse = pNC->
7700: 70 50 61 72 73 65 3b 0a 20 20 20 20 20 20 7a 54  pParse;.      zT
7710: 79 70 65 20 3d 20 63 6f 6c 75 6d 6e 54 79 70 65  ype = columnType
7720: 28 26 73 4e 43 2c 20 70 2c 20 26 7a 4f 72 69 67  (&sNC, p, &zOrig
7730: 69 6e 44 62 2c 20 26 7a 4f 72 69 67 69 6e 54 61  inDb, &zOriginTa
7740: 62 2c 20 26 7a 4f 72 69 67 69 6e 43 6f 6c 29 3b  b, &zOriginCol);
7750: 20 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20   .      break;. 
7760: 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 0a     }.#endif.  }.
7770: 20 20 0a 20 20 69 66 28 20 70 7a 4f 72 69 67 69    .  if( pzOrigi
7780: 6e 44 62 20 29 7b 0a 20 20 20 20 61 73 73 65 72  nDb ){.    asser
7790: 74 28 20 70 7a 4f 72 69 67 69 6e 54 61 62 20 26  t( pzOriginTab &
77a0: 26 20 70 7a 4f 72 69 67 69 6e 43 6f 6c 20 29 3b  & pzOriginCol );
77b0: 0a 20 20 20 20 2a 70 7a 4f 72 69 67 69 6e 44 62  .    *pzOriginDb
77c0: 20 3d 20 7a 4f 72 69 67 69 6e 44 62 3b 0a 20 20   = zOriginDb;.  
77d0: 20 20 2a 70 7a 4f 72 69 67 69 6e 54 61 62 20 3d    *pzOriginTab =
77e0: 20 7a 4f 72 69 67 69 6e 54 61 62 3b 0a 20 20 20   zOriginTab;.   
77f0: 20 2a 70 7a 4f 72 69 67 69 6e 43 6f 6c 20 3d 20   *pzOriginCol = 
7800: 7a 4f 72 69 67 69 6e 43 6f 6c 3b 0a 20 20 7d 0a  zOriginCol;.  }.
7810: 20 20 72 65 74 75 72 6e 20 7a 54 79 70 65 3b 0a    return zType;.
7820: 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74  }../*.** Generat
7830: 65 20 63 6f 64 65 20 74 68 61 74 20 77 69 6c 6c  e code that will
7840: 20 74 65 6c 6c 20 74 68 65 20 56 44 42 45 20 74   tell the VDBE t
7850: 68 65 20 64 65 63 6c 61 72 61 74 69 6f 6e 20 74  he declaration t
7860: 79 70 65 73 20 6f 66 20 63 6f 6c 75 6d 6e 73 0a  ypes of columns.
7870: 2a 2a 20 69 6e 20 74 68 65 20 72 65 73 75 6c 74  ** in the result
7880: 20 73 65 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20   set..*/.static 
7890: 76 6f 69 64 20 67 65 6e 65 72 61 74 65 43 6f 6c  void generateCol
78a0: 75 6d 6e 54 79 70 65 73 28 0a 20 20 50 61 72 73  umnTypes(.  Pars
78b0: 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20  e *pParse,      
78c0: 2f 2a 20 50 61 72 73 65 72 20 63 6f 6e 74 65 78  /* Parser contex
78d0: 74 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a  t */.  SrcList *
78e0: 70 54 61 62 4c 69 73 74 2c 20 20 2f 2a 20 4c 69  pTabList,  /* Li
78f0: 73 74 20 6f 66 20 74 61 62 6c 65 73 20 2a 2f 0a  st of tables */.
7900: 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69    ExprList *pELi
7910: 73 74 20 20 20 20 2f 2a 20 45 78 70 72 65 73 73  st    /* Express
7920: 69 6f 6e 73 20 64 65 66 69 6e 69 6e 67 20 74 68  ions defining th
7930: 65 20 72 65 73 75 6c 74 20 73 65 74 20 2a 2f 0a  e result set */.
7940: 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70  ){.  Vdbe *v = p
7950: 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20  Parse->pVdbe;.  
7960: 69 6e 74 20 69 3b 0a 20 20 4e 61 6d 65 43 6f 6e  int i;.  NameCon
7970: 74 65 78 74 20 73 4e 43 3b 0a 20 20 73 4e 43 2e  text sNC;.  sNC.
7980: 70 53 72 63 4c 69 73 74 20 3d 20 70 54 61 62 4c  pSrcList = pTabL
7990: 69 73 74 3b 0a 20 20 73 4e 43 2e 70 50 61 72 73  ist;.  sNC.pPars
79a0: 65 20 3d 20 70 50 61 72 73 65 3b 0a 20 20 66 6f  e = pParse;.  fo
79b0: 72 28 69 3d 30 3b 20 69 3c 70 45 4c 69 73 74 2d  r(i=0; i<pEList-
79c0: 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20  >nExpr; i++){.  
79d0: 20 20 45 78 70 72 20 2a 70 20 3d 20 70 45 4c 69    Expr *p = pELi
79e0: 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 3b 0a  st->a[i].pExpr;.
79f0: 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
7a00: 7a 4f 72 69 67 44 62 20 3d 20 30 3b 0a 20 20 20  zOrigDb = 0;.   
7a10: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4f 72   const char *zOr
7a20: 69 67 54 61 62 20 3d 20 30 3b 0a 20 20 20 20 63  igTab = 0;.    c
7a30: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4f 72 69 67  onst char *zOrig
7a40: 43 6f 6c 20 3d 20 30 3b 0a 20 20 20 20 63 6f 6e  Col = 0;.    con
7a50: 73 74 20 63 68 61 72 20 2a 7a 54 79 70 65 20 3d  st char *zType =
7a60: 20 63 6f 6c 75 6d 6e 54 79 70 65 28 26 73 4e 43   columnType(&sNC
7a70: 2c 20 70 2c 20 26 7a 4f 72 69 67 44 62 2c 20 26  , p, &zOrigDb, &
7a80: 7a 4f 72 69 67 54 61 62 2c 20 26 7a 4f 72 69 67  zOrigTab, &zOrig
7a90: 43 6f 6c 29 3b 0a 0a 20 20 20 20 2f 2a 20 54 68  Col);..    /* Th
7aa0: 65 20 76 64 62 65 20 6d 75 73 74 20 6d 61 6b 65  e vdbe must make
7ab0: 20 69 74 27 73 20 6f 77 6e 20 63 6f 70 79 20 6f   it's own copy o
7ac0: 66 20 74 68 65 20 63 6f 6c 75 6d 6e 2d 74 79 70  f the column-typ
7ad0: 65 20 61 6e 64 20 6f 74 68 65 72 20 0a 20 20 20  e and other .   
7ae0: 20 2a 2a 20 63 6f 6c 75 6d 6e 20 73 70 65 63 69   ** column speci
7af0: 66 69 63 20 73 74 72 69 6e 67 73 2c 20 69 6e 20  fic strings, in 
7b00: 63 61 73 65 20 74 68 65 20 73 63 68 65 6d 61 20  case the schema 
7b10: 69 73 20 72 65 73 65 74 20 62 65 66 6f 72 65 20  is reset before 
7b20: 74 68 69 73 0a 20 20 20 20 2a 2a 20 76 69 72 74  this.    ** virt
7b30: 75 61 6c 20 6d 61 63 68 69 6e 65 20 69 73 20 64  ual machine is d
7b40: 65 6c 65 74 65 64 2e 0a 20 20 20 20 2a 2f 0a 20  eleted..    */. 
7b50: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 53 65     sqlite3VdbeSe
7b60: 74 43 6f 6c 4e 61 6d 65 28 76 2c 20 69 2c 20 43  tColName(v, i, C
7b70: 4f 4c 4e 41 4d 45 5f 44 45 43 4c 54 59 50 45 2c  OLNAME_DECLTYPE,
7b80: 20 7a 54 79 70 65 2c 20 50 33 5f 54 52 41 4e 53   zType, P3_TRANS
7b90: 49 45 4e 54 29 3b 0a 20 20 20 20 73 71 6c 69 74  IENT);.    sqlit
7ba0: 65 33 56 64 62 65 53 65 74 43 6f 6c 4e 61 6d 65  e3VdbeSetColName
7bb0: 28 76 2c 20 69 2c 20 43 4f 4c 4e 41 4d 45 5f 44  (v, i, COLNAME_D
7bc0: 41 54 41 42 41 53 45 2c 20 7a 4f 72 69 67 44 62  ATABASE, zOrigDb
7bd0: 2c 20 50 33 5f 54 52 41 4e 53 49 45 4e 54 29 3b  , P3_TRANSIENT);
7be0: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
7bf0: 53 65 74 43 6f 6c 4e 61 6d 65 28 76 2c 20 69 2c  SetColName(v, i,
7c00: 20 43 4f 4c 4e 41 4d 45 5f 54 41 42 4c 45 2c 20   COLNAME_TABLE, 
7c10: 7a 4f 72 69 67 54 61 62 2c 20 50 33 5f 54 52 41  zOrigTab, P3_TRA
7c20: 4e 53 49 45 4e 54 29 3b 0a 20 20 20 20 73 71 6c  NSIENT);.    sql
7c30: 69 74 65 33 56 64 62 65 53 65 74 43 6f 6c 4e 61  ite3VdbeSetColNa
7c40: 6d 65 28 76 2c 20 69 2c 20 43 4f 4c 4e 41 4d 45  me(v, i, COLNAME
7c50: 5f 43 4f 4c 55 4d 4e 2c 20 7a 4f 72 69 67 43 6f  _COLUMN, zOrigCo
7c60: 6c 2c 20 50 33 5f 54 52 41 4e 53 49 45 4e 54 29  l, P3_TRANSIENT)
7c70: 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47  ;.  }.}../*.** G
7c80: 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 68 61  enerate code tha
7c90: 74 20 77 69 6c 6c 20 74 65 6c 6c 20 74 68 65 20  t will tell the 
7ca0: 56 44 42 45 20 74 68 65 20 6e 61 6d 65 73 20 6f  VDBE the names o
7cb0: 66 20 63 6f 6c 75 6d 6e 73 0a 2a 2a 20 69 6e 20  f columns.** in 
7cc0: 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 2e 20  the result set. 
7cd0: 20 54 68 69 73 20 69 6e 66 6f 72 6d 61 74 69 6f   This informatio
7ce0: 6e 20 69 73 20 75 73 65 64 20 74 6f 20 70 72 6f  n is used to pro
7cf0: 76 69 64 65 20 74 68 65 0a 2a 2a 20 61 7a 43 6f  vide the.** azCo
7d00: 6c 5b 5d 20 76 61 6c 75 65 73 20 69 6e 20 74 68  l[] values in th
7d10: 65 20 63 61 6c 6c 62 61 63 6b 2e 0a 2a 2f 0a 73  e callback..*/.s
7d20: 74 61 74 69 63 20 76 6f 69 64 20 67 65 6e 65 72  tatic void gener
7d30: 61 74 65 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 0a  ateColumnNames(.
7d40: 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
7d50: 20 20 20 20 20 20 2f 2a 20 50 61 72 73 65 72 20        /* Parser 
7d60: 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53 72 63  context */.  Src
7d70: 4c 69 73 74 20 2a 70 54 61 62 4c 69 73 74 2c 20  List *pTabList, 
7d80: 20 2f 2a 20 4c 69 73 74 20 6f 66 20 74 61 62 6c   /* List of tabl
7d90: 65 73 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74  es */.  ExprList
7da0: 20 2a 70 45 4c 69 73 74 20 20 20 20 2f 2a 20 45   *pEList    /* E
7db0: 78 70 72 65 73 73 69 6f 6e 73 20 64 65 66 69 6e  xpressions defin
7dc0: 69 6e 67 20 74 68 65 20 72 65 73 75 6c 74 20 73  ing the result s
7dd0: 65 74 20 2a 2f 0a 29 7b 0a 20 20 56 64 62 65 20  et */.){.  Vdbe 
7de0: 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64  *v = pParse->pVd
7df0: 62 65 3b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 0a  be;.  int i, j;.
7e00: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
7e10: 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 69 6e  pParse->db;.  in
7e20: 74 20 66 75 6c 6c 4e 61 6d 65 73 2c 20 73 68 6f  t fullNames, sho
7e30: 72 74 4e 61 6d 65 73 3b 0a 0a 23 69 66 6e 64 65  rtNames;..#ifnde
7e40: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 45 58  f SQLITE_OMIT_EX
7e50: 50 4c 41 49 4e 0a 20 20 2f 2a 20 49 66 20 74 68  PLAIN.  /* If th
7e60: 69 73 20 69 73 20 61 6e 20 45 58 50 4c 41 49 4e  is is an EXPLAIN
7e70: 2c 20 73 6b 69 70 20 74 68 69 73 20 73 74 65 70  , skip this step
7e80: 20 2a 2f 0a 20 20 69 66 28 20 70 50 61 72 73 65   */.  if( pParse
7e90: 2d 3e 65 78 70 6c 61 69 6e 20 29 7b 0a 20 20 20  ->explain ){.   
7ea0: 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 23 65 6e   return;.  }.#en
7eb0: 64 69 66 0a 0a 20 20 61 73 73 65 72 74 28 20 76  dif..  assert( v
7ec0: 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 50 61  !=0 );.  if( pPa
7ed0: 72 73 65 2d 3e 63 6f 6c 4e 61 6d 65 73 53 65 74  rse->colNamesSet
7ee0: 20 7c 7c 20 76 3d 3d 30 20 7c 7c 20 64 62 2d 3e   || v==0 || db->
7ef0: 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20 72  mallocFailed ) r
7f00: 65 74 75 72 6e 3b 0a 20 20 70 50 61 72 73 65 2d  eturn;.  pParse-
7f10: 3e 63 6f 6c 4e 61 6d 65 73 53 65 74 20 3d 20 31  >colNamesSet = 1
7f20: 3b 0a 20 20 66 75 6c 6c 4e 61 6d 65 73 20 3d 20  ;.  fullNames = 
7f30: 28 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c  (db->flags & SQL
7f40: 49 54 45 5f 46 75 6c 6c 43 6f 6c 4e 61 6d 65 73  ITE_FullColNames
7f50: 29 21 3d 30 3b 0a 20 20 73 68 6f 72 74 4e 61 6d  )!=0;.  shortNam
7f60: 65 73 20 3d 20 28 64 62 2d 3e 66 6c 61 67 73 20  es = (db->flags 
7f70: 26 20 53 51 4c 49 54 45 5f 53 68 6f 72 74 43 6f  & SQLITE_ShortCo
7f80: 6c 4e 61 6d 65 73 29 21 3d 30 3b 0a 20 20 73 71  lNames)!=0;.  sq
7f90: 6c 69 74 65 33 56 64 62 65 53 65 74 4e 75 6d 43  lite3VdbeSetNumC
7fa0: 6f 6c 73 28 76 2c 20 70 45 4c 69 73 74 2d 3e 6e  ols(v, pEList->n
7fb0: 45 78 70 72 29 3b 0a 20 20 66 6f 72 28 69 3d 30  Expr);.  for(i=0
7fc0: 3b 20 69 3c 70 45 4c 69 73 74 2d 3e 6e 45 78 70  ; i<pEList->nExp
7fd0: 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 45 78 70  r; i++){.    Exp
7fe0: 72 20 2a 70 3b 0a 20 20 20 20 70 20 3d 20 70 45  r *p;.    p = pE
7ff0: 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72  List->a[i].pExpr
8000: 3b 0a 20 20 20 20 69 66 28 20 70 3d 3d 30 20 29  ;.    if( p==0 )
8010: 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69   continue;.    i
8020: 66 28 20 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e  f( pEList->a[i].
8030: 7a 4e 61 6d 65 20 29 7b 0a 20 20 20 20 20 20 63  zName ){.      c
8040: 68 61 72 20 2a 7a 4e 61 6d 65 20 3d 20 70 45 4c  har *zName = pEL
8050: 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 3b  ist->a[i].zName;
8060: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
8070: 62 65 53 65 74 43 6f 6c 4e 61 6d 65 28 76 2c 20  beSetColName(v, 
8080: 69 2c 20 43 4f 4c 4e 41 4d 45 5f 4e 41 4d 45 2c  i, COLNAME_NAME,
8090: 20 7a 4e 61 6d 65 2c 20 73 74 72 6c 65 6e 28 7a   zName, strlen(z
80a0: 4e 61 6d 65 29 29 3b 0a 20 20 20 20 20 20 63 6f  Name));.      co
80b0: 6e 74 69 6e 75 65 3b 0a 20 20 20 20 7d 0a 20 20  ntinue;.    }.  
80c0: 20 20 69 66 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f    if( p->op==TK_
80d0: 43 4f 4c 55 4d 4e 20 26 26 20 70 54 61 62 4c 69  COLUMN && pTabLi
80e0: 73 74 20 29 7b 0a 20 20 20 20 20 20 54 61 62 6c  st ){.      Tabl
80f0: 65 20 2a 70 54 61 62 3b 0a 20 20 20 20 20 20 63  e *pTab;.      c
8100: 68 61 72 20 2a 7a 43 6f 6c 3b 0a 20 20 20 20 20  har *zCol;.     
8110: 20 69 6e 74 20 69 43 6f 6c 20 3d 20 70 2d 3e 69   int iCol = p->i
8120: 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20 20 66 6f  Column;.      fo
8130: 72 28 6a 3d 30 3b 20 6a 3c 70 54 61 62 4c 69 73  r(j=0; j<pTabLis
8140: 74 2d 3e 6e 53 72 63 20 26 26 20 70 54 61 62 4c  t->nSrc && pTabL
8150: 69 73 74 2d 3e 61 5b 6a 5d 2e 69 43 75 72 73 6f  ist->a[j].iCurso
8160: 72 21 3d 70 2d 3e 69 54 61 62 6c 65 3b 20 6a 2b  r!=p->iTable; j+
8170: 2b 29 7b 7d 0a 20 20 20 20 20 20 61 73 73 65 72  +){}.      asser
8180: 74 28 20 6a 3c 70 54 61 62 4c 69 73 74 2d 3e 6e  t( j<pTabList->n
8190: 53 72 63 20 29 3b 0a 20 20 20 20 20 20 70 54 61  Src );.      pTa
81a0: 62 20 3d 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b  b = pTabList->a[
81b0: 6a 5d 2e 70 54 61 62 3b 0a 20 20 20 20 20 20 69  j].pTab;.      i
81c0: 66 28 20 69 43 6f 6c 3c 30 20 29 20 69 43 6f 6c  f( iCol<0 ) iCol
81d0: 20 3d 20 70 54 61 62 2d 3e 69 50 4b 65 79 3b 0a   = pTab->iPKey;.
81e0: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 69 43        assert( iC
81f0: 6f 6c 3d 3d 2d 31 20 7c 7c 20 28 69 43 6f 6c 3e  ol==-1 || (iCol>
8200: 3d 30 20 26 26 20 69 43 6f 6c 3c 70 54 61 62 2d  =0 && iCol<pTab-
8210: 3e 6e 43 6f 6c 29 20 29 3b 0a 20 20 20 20 20 20  >nCol) );.      
8220: 69 66 28 20 69 43 6f 6c 3c 30 20 29 7b 0a 20 20  if( iCol<0 ){.  
8230: 20 20 20 20 20 20 7a 43 6f 6c 20 3d 20 22 72 6f        zCol = "ro
8240: 77 69 64 22 3b 0a 20 20 20 20 20 20 7d 65 6c 73  wid";.      }els
8250: 65 7b 0a 20 20 20 20 20 20 20 20 7a 43 6f 6c 20  e{.        zCol 
8260: 3d 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f  = pTab->aCol[iCo
8270: 6c 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20  l].zName;.      
8280: 7d 0a 20 20 20 20 20 20 69 66 28 20 21 73 68 6f  }.      if( !sho
8290: 72 74 4e 61 6d 65 73 20 26 26 20 21 66 75 6c 6c  rtNames && !full
82a0: 4e 61 6d 65 73 20 26 26 20 70 2d 3e 73 70 61 6e  Names && p->span
82b0: 2e 7a 20 26 26 20 70 2d 3e 73 70 61 6e 2e 7a 5b  .z && p->span.z[
82c0: 30 5d 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  0] ){.        sq
82d0: 6c 69 74 65 33 56 64 62 65 53 65 74 43 6f 6c 4e  lite3VdbeSetColN
82e0: 61 6d 65 28 76 2c 20 69 2c 20 43 4f 4c 4e 41 4d  ame(v, i, COLNAM
82f0: 45 5f 4e 41 4d 45 2c 20 28 63 68 61 72 2a 29 70  E_NAME, (char*)p
8300: 2d 3e 73 70 61 6e 2e 7a 2c 20 70 2d 3e 73 70 61  ->span.z, p->spa
8310: 6e 2e 6e 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  n.n);.      }els
8320: 65 20 69 66 28 20 66 75 6c 6c 4e 61 6d 65 73 20  e if( fullNames 
8330: 7c 7c 20 28 21 73 68 6f 72 74 4e 61 6d 65 73 20  || (!shortNames 
8340: 26 26 20 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72  && pTabList->nSr
8350: 63 3e 31 29 20 29 7b 0a 20 20 20 20 20 20 20 20  c>1) ){.        
8360: 63 68 61 72 20 2a 7a 4e 61 6d 65 20 3d 20 30 3b  char *zName = 0;
8370: 0a 20 20 20 20 20 20 20 20 63 68 61 72 20 2a 7a  .        char *z
8380: 54 61 62 3b 0a 20 0a 20 20 20 20 20 20 20 20 7a  Tab;. .        z
8390: 54 61 62 20 3d 20 70 54 61 62 4c 69 73 74 2d 3e  Tab = pTabList->
83a0: 61 5b 6a 5d 2e 7a 41 6c 69 61 73 3b 0a 20 20 20  a[j].zAlias;.   
83b0: 20 20 20 20 20 69 66 28 20 66 75 6c 6c 4e 61 6d       if( fullNam
83c0: 65 73 20 7c 7c 20 7a 54 61 62 3d 3d 30 20 29 20  es || zTab==0 ) 
83d0: 7a 54 61 62 20 3d 20 70 54 61 62 2d 3e 7a 4e 61  zTab = pTab->zNa
83e0: 6d 65 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  me;.        sqli
83f0: 74 65 33 53 65 74 53 74 72 69 6e 67 28 26 7a 4e  te3SetString(&zN
8400: 61 6d 65 2c 20 7a 54 61 62 2c 20 22 2e 22 2c 20  ame, zTab, ".", 
8410: 7a 43 6f 6c 2c 20 28 63 68 61 72 2a 29 30 29 3b  zCol, (char*)0);
8420: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
8430: 56 64 62 65 53 65 74 43 6f 6c 4e 61 6d 65 28 76  VdbeSetColName(v
8440: 2c 20 69 2c 20 43 4f 4c 4e 41 4d 45 5f 4e 41 4d  , i, COLNAME_NAM
8450: 45 2c 20 7a 4e 61 6d 65 2c 20 50 33 5f 44 59 4e  E, zName, P3_DYN
8460: 41 4d 49 43 29 3b 0a 20 20 20 20 20 20 7d 65 6c  AMIC);.      }el
8470: 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  se{.        sqli
8480: 74 65 33 56 64 62 65 53 65 74 43 6f 6c 4e 61 6d  te3VdbeSetColNam
8490: 65 28 76 2c 20 69 2c 20 43 4f 4c 4e 41 4d 45 5f  e(v, i, COLNAME_
84a0: 4e 41 4d 45 2c 20 7a 43 6f 6c 2c 20 73 74 72 6c  NAME, zCol, strl
84b0: 65 6e 28 7a 43 6f 6c 29 29 3b 0a 20 20 20 20 20  en(zCol));.     
84c0: 20 7d 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28   }.    }else if(
84d0: 20 70 2d 3e 73 70 61 6e 2e 7a 20 26 26 20 70 2d   p->span.z && p-
84e0: 3e 73 70 61 6e 2e 7a 5b 30 5d 20 29 7b 0a 20 20  >span.z[0] ){.  
84f0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 53      sqlite3VdbeS
8500: 65 74 43 6f 6c 4e 61 6d 65 28 76 2c 20 69 2c 20  etColName(v, i, 
8510: 43 4f 4c 4e 41 4d 45 5f 4e 41 4d 45 2c 20 28 63  COLNAME_NAME, (c
8520: 68 61 72 2a 29 70 2d 3e 73 70 61 6e 2e 7a 2c 20  har*)p->span.z, 
8530: 70 2d 3e 73 70 61 6e 2e 6e 29 3b 0a 20 20 20 20  p->span.n);.    
8540: 20 20 2f 2a 20 73 71 6c 69 74 65 33 56 64 62 65    /* sqlite3Vdbe
8550: 43 6f 6d 70 72 65 73 73 53 70 61 63 65 28 76 2c  CompressSpace(v,
8560: 20 61 64 64 72 29 3b 20 2a 2f 0a 20 20 20 20 7d   addr); */.    }
8570: 65 6c 73 65 7b 0a 20 20 20 20 20 20 63 68 61 72  else{.      char
8580: 20 7a 4e 61 6d 65 5b 33 30 5d 3b 0a 20 20 20 20   zName[30];.    
8590: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6f 70 21    assert( p->op!
85a0: 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 7c 7c 20 70 54  =TK_COLUMN || pT
85b0: 61 62 4c 69 73 74 3d 3d 30 20 29 3b 0a 20 20 20  abList==0 );.   
85c0: 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69     sqlite3_snpri
85d0: 6e 74 66 28 73 69 7a 65 6f 66 28 7a 4e 61 6d 65  ntf(sizeof(zName
85e0: 29 2c 20 7a 4e 61 6d 65 2c 20 22 63 6f 6c 75 6d  ), zName, "colum
85f0: 6e 25 64 22 2c 20 69 2b 31 29 3b 0a 20 20 20 20  n%d", i+1);.    
8600: 20 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 74    sqlite3VdbeSet
8610: 43 6f 6c 4e 61 6d 65 28 76 2c 20 69 2c 20 43 4f  ColName(v, i, CO
8620: 4c 4e 41 4d 45 5f 4e 41 4d 45 2c 20 7a 4e 61 6d  LNAME_NAME, zNam
8630: 65 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  e, 0);.    }.  }
8640: 0a 20 20 67 65 6e 65 72 61 74 65 43 6f 6c 75 6d  .  generateColum
8650: 6e 54 79 70 65 73 28 70 50 61 72 73 65 2c 20 70  nTypes(pParse, p
8660: 54 61 62 4c 69 73 74 2c 20 70 45 4c 69 73 74 29  TabList, pEList)
8670: 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c  ;.}..#ifndef SQL
8680: 49 54 45 5f 4f 4d 49 54 5f 43 4f 4d 50 4f 55 4e  ITE_OMIT_COMPOUN
8690: 44 5f 53 45 4c 45 43 54 0a 2f 2a 0a 2a 2a 20 4e  D_SELECT./*.** N
86a0: 61 6d 65 20 6f 66 20 74 68 65 20 63 6f 6e 6e 65  ame of the conne
86b0: 63 74 69 6f 6e 20 6f 70 65 72 61 74 6f 72 2c 20  ction operator, 
86c0: 75 73 65 64 20 66 6f 72 20 65 72 72 6f 72 20 6d  used for error m
86d0: 65 73 73 61 67 65 73 2e 0a 2a 2f 0a 73 74 61 74  essages..*/.stat
86e0: 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 73  ic const char *s
86f0: 65 6c 65 63 74 4f 70 4e 61 6d 65 28 69 6e 74 20  electOpName(int 
8700: 69 64 29 7b 0a 20 20 63 68 61 72 20 2a 7a 3b 0a  id){.  char *z;.
8710: 20 20 73 77 69 74 63 68 28 20 69 64 20 29 7b 0a    switch( id ){.
8720: 20 20 20 20 63 61 73 65 20 54 4b 5f 41 4c 4c 3a      case TK_ALL:
8730: 20 20 20 20 20 20 20 7a 20 3d 20 22 55 4e 49 4f         z = "UNIO
8740: 4e 20 41 4c 4c 22 3b 20 20 20 62 72 65 61 6b 3b  N ALL";   break;
8750: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49 4e 54  .    case TK_INT
8760: 45 52 53 45 43 54 3a 20 7a 20 3d 20 22 49 4e 54  ERSECT: z = "INT
8770: 45 52 53 45 43 54 22 3b 20 20 20 62 72 65 61 6b  ERSECT";   break
8780: 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 45 58  ;.    case TK_EX
8790: 43 45 50 54 3a 20 20 20 20 7a 20 3d 20 22 45 58  CEPT:    z = "EX
87a0: 43 45 50 54 22 3b 20 20 20 20 20 20 62 72 65 61  CEPT";      brea
87b0: 6b 3b 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20  k;.    default: 
87c0: 20 20 20 20 20 20 20 20 20 20 7a 20 3d 20 22 55            z = "U
87d0: 4e 49 4f 4e 22 3b 20 20 20 20 20 20 20 62 72 65  NION";       bre
87e0: 61 6b 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  ak;.  }.  return
87f0: 20 7a 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20   z;.}.#endif /* 
8800: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f 4d 50  SQLITE_OMIT_COMP
8810: 4f 55 4e 44 5f 53 45 4c 45 43 54 20 2a 2f 0a 0a  OUND_SELECT */..
8820: 2f 2a 0a 2a 2a 20 46 6f 72 77 61 72 64 20 64 65  /*.** Forward de
8830: 63 6c 61 72 61 74 69 6f 6e 0a 2a 2f 0a 73 74 61  claration.*/.sta
8840: 74 69 63 20 69 6e 74 20 70 72 65 70 53 65 6c 65  tic int prepSele
8850: 63 74 53 74 6d 74 28 50 61 72 73 65 2a 2c 20 53  ctStmt(Parse*, S
8860: 65 6c 65 63 74 2a 29 3b 0a 0a 2f 2a 0a 2a 2a 20  elect*);../*.** 
8870: 47 69 76 65 6e 20 61 20 53 45 4c 45 43 54 20 73  Given a SELECT s
8880: 74 61 74 65 6d 65 6e 74 2c 20 67 65 6e 65 72 61  tatement, genera
8890: 74 65 20 61 20 54 61 62 6c 65 20 73 74 72 75 63  te a Table struc
88a0: 74 75 72 65 20 74 68 61 74 20 64 65 73 63 72 69  ture that descri
88b0: 62 65 73 0a 2a 2a 20 74 68 65 20 72 65 73 75 6c  bes.** the resul
88c0: 74 20 73 65 74 20 6f 66 20 74 68 61 74 20 53 45  t set of that SE
88d0: 4c 45 43 54 2e 0a 2a 2f 0a 54 61 62 6c 65 20 2a  LECT..*/.Table *
88e0: 73 71 6c 69 74 65 33 52 65 73 75 6c 74 53 65 74  sqlite3ResultSet
88f0: 4f 66 53 65 6c 65 63 74 28 50 61 72 73 65 20 2a  OfSelect(Parse *
8900: 70 50 61 72 73 65 2c 20 63 68 61 72 20 2a 7a 54  pParse, char *zT
8910: 61 62 4e 61 6d 65 2c 20 53 65 6c 65 63 74 20 2a  abName, Select *
8920: 70 53 65 6c 65 63 74 29 7b 0a 20 20 54 61 62 6c  pSelect){.  Tabl
8930: 65 20 2a 70 54 61 62 3b 0a 20 20 69 6e 74 20 69  e *pTab;.  int i
8940: 2c 20 6a 3b 0a 20 20 45 78 70 72 4c 69 73 74 20  , j;.  ExprList 
8950: 2a 70 45 4c 69 73 74 3b 0a 20 20 43 6f 6c 75 6d  *pEList;.  Colum
8960: 6e 20 2a 61 43 6f 6c 2c 20 2a 70 43 6f 6c 3b 0a  n *aCol, *pCol;.
8970: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
8980: 70 50 61 72 73 65 2d 3e 64 62 3b 0a 0a 20 20 77  pParse->db;..  w
8990: 68 69 6c 65 28 20 70 53 65 6c 65 63 74 2d 3e 70  hile( pSelect->p
89a0: 50 72 69 6f 72 20 29 20 70 53 65 6c 65 63 74 20  Prior ) pSelect 
89b0: 3d 20 70 53 65 6c 65 63 74 2d 3e 70 50 72 69 6f  = pSelect->pPrio
89c0: 72 3b 0a 20 20 69 66 28 20 70 72 65 70 53 65 6c  r;.  if( prepSel
89d0: 65 63 74 53 74 6d 74 28 70 50 61 72 73 65 2c 20  ectStmt(pParse, 
89e0: 70 53 65 6c 65 63 74 29 20 29 7b 0a 20 20 20 20  pSelect) ){.    
89f0: 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20  return 0;.  }.  
8a00: 69 66 28 20 73 71 6c 69 74 65 33 53 65 6c 65 63  if( sqlite3Selec
8a10: 74 52 65 73 6f 6c 76 65 28 70 50 61 72 73 65 2c  tResolve(pParse,
8a20: 20 70 53 65 6c 65 63 74 2c 20 30 29 20 29 7b 0a   pSelect, 0) ){.
8a30: 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
8a40: 7d 0a 20 20 70 54 61 62 20 3d 20 73 71 6c 69 74  }.  pTab = sqlit
8a50: 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64  e3DbMallocZero(d
8a60: 62 2c 20 73 69 7a 65 6f 66 28 54 61 62 6c 65 29  b, sizeof(Table)
8a70: 20 29 3b 0a 20 20 69 66 28 20 70 54 61 62 3d 3d   );.  if( pTab==
8a80: 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  0 ){.    return 
8a90: 30 3b 0a 20 20 7d 0a 20 20 70 54 61 62 2d 3e 6e  0;.  }.  pTab->n
8aa0: 52 65 66 20 3d 20 31 3b 0a 20 20 70 54 61 62 2d  Ref = 1;.  pTab-
8ab0: 3e 7a 4e 61 6d 65 20 3d 20 7a 54 61 62 4e 61 6d  >zName = zTabNam
8ac0: 65 20 3f 20 73 71 6c 69 74 65 33 44 62 53 74 72  e ? sqlite3DbStr
8ad0: 44 75 70 28 64 62 2c 20 7a 54 61 62 4e 61 6d 65  Dup(db, zTabName
8ae0: 29 20 3a 20 30 3b 0a 20 20 70 45 4c 69 73 74 20  ) : 0;.  pEList 
8af0: 3d 20 70 53 65 6c 65 63 74 2d 3e 70 45 4c 69 73  = pSelect->pELis
8b00: 74 3b 0a 20 20 70 54 61 62 2d 3e 6e 43 6f 6c 20  t;.  pTab->nCol 
8b10: 3d 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b  = pEList->nExpr;
8b20: 0a 20 20 61 73 73 65 72 74 28 20 70 54 61 62 2d  .  assert( pTab-
8b30: 3e 6e 43 6f 6c 3e 30 20 29 3b 0a 20 20 70 54 61  >nCol>0 );.  pTa
8b40: 62 2d 3e 61 43 6f 6c 20 3d 20 61 43 6f 6c 20 3d  b->aCol = aCol =
8b50: 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63   sqlite3DbMalloc
8b60: 5a 65 72 6f 28 64 62 2c 20 73 69 7a 65 6f 66 28  Zero(db, sizeof(
8b70: 70 54 61 62 2d 3e 61 43 6f 6c 5b 30 5d 29 2a 70  pTab->aCol[0])*p
8b80: 54 61 62 2d 3e 6e 43 6f 6c 29 3b 0a 20 20 66 6f  Tab->nCol);.  fo
8b90: 72 28 69 3d 30 2c 20 70 43 6f 6c 3d 61 43 6f 6c  r(i=0, pCol=aCol
8ba0: 3b 20 69 3c 70 54 61 62 2d 3e 6e 43 6f 6c 3b 20  ; i<pTab->nCol; 
8bb0: 69 2b 2b 2c 20 70 43 6f 6c 2b 2b 29 7b 0a 20 20  i++, pCol++){.  
8bc0: 20 20 45 78 70 72 20 2a 70 2c 20 2a 70 52 3b 0a    Expr *p, *pR;.
8bd0: 20 20 20 20 63 68 61 72 20 2a 7a 54 79 70 65 3b      char *zType;
8be0: 0a 20 20 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65  .    char *zName
8bf0: 3b 0a 20 20 20 20 69 6e 74 20 6e 4e 61 6d 65 3b  ;.    int nName;
8c00: 0a 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43  .    CollSeq *pC
8c10: 6f 6c 6c 3b 0a 20 20 20 20 69 6e 74 20 63 6e 74  oll;.    int cnt
8c20: 3b 0a 20 20 20 20 4e 61 6d 65 43 6f 6e 74 65 78  ;.    NameContex
8c30: 74 20 73 4e 43 3b 0a 20 20 20 20 0a 20 20 20 20  t sNC;.    .    
8c40: 2f 2a 20 47 65 74 20 61 6e 20 61 70 70 72 6f 70  /* Get an approp
8c50: 72 69 61 74 65 20 6e 61 6d 65 20 66 6f 72 20 74  riate name for t
8c60: 68 65 20 63 6f 6c 75 6d 6e 0a 20 20 20 20 2a 2f  he column.    */
8c70: 0a 20 20 20 20 70 20 3d 20 70 45 4c 69 73 74 2d  .    p = pEList-
8c80: 3e 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20  >a[i].pExpr;.   
8c90: 20 61 73 73 65 72 74 28 20 70 2d 3e 70 52 69 67   assert( p->pRig
8ca0: 68 74 3d 3d 30 20 7c 7c 20 70 2d 3e 70 52 69 67  ht==0 || p->pRig
8cb0: 68 74 2d 3e 74 6f 6b 65 6e 2e 7a 3d 3d 30 20 7c  ht->token.z==0 |
8cc0: 7c 20 70 2d 3e 70 52 69 67 68 74 2d 3e 74 6f 6b  | p->pRight->tok
8cd0: 65 6e 2e 7a 5b 30 5d 21 3d 30 20 29 3b 0a 20 20  en.z[0]!=0 );.  
8ce0: 20 20 69 66 28 20 28 7a 4e 61 6d 65 20 3d 20 70    if( (zName = p
8cf0: 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d  EList->a[i].zNam
8d00: 65 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 2f  e)!=0 ){.      /
8d10: 2a 20 49 66 20 74 68 65 20 63 6f 6c 75 6d 6e 20  * If the column 
8d20: 63 6f 6e 74 61 69 6e 73 20 61 6e 20 22 41 53 20  contains an "AS 
8d30: 3c 6e 61 6d 65 3e 22 20 70 68 72 61 73 65 2c 20  <name>" phrase, 
8d40: 75 73 65 20 3c 6e 61 6d 65 3e 20 61 73 20 74 68  use <name> as th
8d50: 65 20 6e 61 6d 65 20 2a 2f 0a 20 20 20 20 20 20  e name */.      
8d60: 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 44  zName = sqlite3D
8d70: 62 53 74 72 44 75 70 28 64 62 2c 20 7a 4e 61 6d  bStrDup(db, zNam
8d80: 65 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66  e);.    }else if
8d90: 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 44 4f 54 20  ( p->op==TK_DOT 
8da0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 26  .              &
8db0: 26 20 28 70 52 3d 70 2d 3e 70 52 69 67 68 74 29  & (pR=p->pRight)
8dc0: 21 3d 30 20 26 26 20 70 52 2d 3e 74 6f 6b 65 6e  !=0 && pR->token
8dd0: 2e 7a 20 26 26 20 70 52 2d 3e 74 6f 6b 65 6e 2e  .z && pR->token.
8de0: 7a 5b 30 5d 20 29 7b 0a 20 20 20 20 20 20 2f 2a  z[0] ){.      /*
8df0: 20 46 6f 72 20 63 6f 6c 75 6d 6e 73 20 6f 66 20   For columns of 
8e00: 74 68 65 20 66 72 6f 6d 20 41 2e 42 20 75 73 65  the from A.B use
8e10: 20 42 20 61 73 20 74 68 65 20 6e 61 6d 65 20 2a   B as the name *
8e20: 2f 0a 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20  /.      zName = 
8e30: 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 64  sqlite3MPrintf(d
8e40: 62 2c 20 22 25 54 22 2c 20 26 70 52 2d 3e 74 6f  b, "%T", &pR->to
8e50: 6b 65 6e 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20  ken);.    }else 
8e60: 69 66 28 20 70 2d 3e 73 70 61 6e 2e 7a 20 26 26  if( p->span.z &&
8e70: 20 70 2d 3e 73 70 61 6e 2e 7a 5b 30 5d 20 29 7b   p->span.z[0] ){
8e80: 0a 20 20 20 20 20 20 2f 2a 20 55 73 65 20 74 68  .      /* Use th
8e90: 65 20 6f 72 69 67 69 6e 61 6c 20 74 65 78 74 20  e original text 
8ea0: 6f 66 20 74 68 65 20 63 6f 6c 75 6d 6e 20 65 78  of the column ex
8eb0: 70 72 65 73 73 69 6f 6e 20 61 73 20 69 74 73 20  pression as its 
8ec0: 6e 61 6d 65 20 2a 2f 0a 20 20 20 20 20 20 7a 4e  name */.      zN
8ed0: 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 4d 50 72  ame = sqlite3MPr
8ee0: 69 6e 74 66 28 64 62 2c 20 22 25 54 22 2c 20 26  intf(db, "%T", &
8ef0: 70 2d 3e 73 70 61 6e 29 3b 0a 20 20 20 20 7d 65  p->span);.    }e
8f00: 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66  lse{.      /* If
8f10: 20 61 6c 6c 20 65 6c 73 65 20 66 61 69 6c 73 2c   all else fails,
8f20: 20 6d 61 6b 65 20 75 70 20 61 20 6e 61 6d 65 20   make up a name 
8f30: 2a 2f 0a 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d  */.      zName =
8f40: 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28   sqlite3MPrintf(
8f50: 64 62 2c 20 22 63 6f 6c 75 6d 6e 25 64 22 2c 20  db, "column%d", 
8f60: 69 2b 31 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  i+1);.    }.    
8f70: 69 66 28 20 21 7a 4e 61 6d 65 20 7c 7c 20 64 62  if( !zName || db
8f80: 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
8f90: 7b 0a 20 20 20 20 20 20 64 62 2d 3e 6d 61 6c 6c  {.      db->mall
8fa0: 6f 63 46 61 69 6c 65 64 20 3d 20 31 3b 0a 20 20  ocFailed = 1;.  
8fb0: 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
8fc0: 28 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 73  (zName);.      s
8fd0: 71 6c 69 74 65 33 44 65 6c 65 74 65 54 61 62 6c  qlite3DeleteTabl
8fe0: 65 28 70 54 61 62 29 3b 0a 20 20 20 20 20 20 72  e(pTab);.      r
8ff0: 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 20  eturn 0;.    }. 
9000: 20 20 20 73 71 6c 69 74 65 33 44 65 71 75 6f 74     sqlite3Dequot
9010: 65 28 7a 4e 61 6d 65 29 3b 0a 0a 20 20 20 20 2f  e(zName);..    /
9020: 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65 20  * Make sure the 
9030: 63 6f 6c 75 6d 6e 20 6e 61 6d 65 20 69 73 20 75  column name is u
9040: 6e 69 71 75 65 2e 20 20 49 66 20 74 68 65 20 6e  nique.  If the n
9050: 61 6d 65 20 69 73 20 6e 6f 74 20 75 6e 69 71 75  ame is not uniqu
9060: 65 2c 0a 20 20 20 20 2a 2a 20 61 70 70 65 6e 64  e,.    ** append
9070: 20 61 20 69 6e 74 65 67 65 72 20 74 6f 20 74 68   a integer to th
9080: 65 20 6e 61 6d 65 20 73 6f 20 74 68 61 74 20 69  e name so that i
9090: 74 20 62 65 63 6f 6d 65 73 20 75 6e 69 71 75 65  t becomes unique
90a0: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 6e 4e 61  ..    */.    nNa
90b0: 6d 65 20 3d 20 73 74 72 6c 65 6e 28 7a 4e 61 6d  me = strlen(zNam
90c0: 65 29 3b 0a 20 20 20 20 66 6f 72 28 6a 3d 63 6e  e);.    for(j=cn
90d0: 74 3d 30 3b 20 6a 3c 69 3b 20 6a 2b 2b 29 7b 0a  t=0; j<i; j++){.
90e0: 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65        if( sqlite
90f0: 33 53 74 72 49 43 6d 70 28 61 43 6f 6c 5b 6a 5d  3StrICmp(aCol[j]
9100: 2e 7a 4e 61 6d 65 2c 20 7a 4e 61 6d 65 29 3d 3d  .zName, zName)==
9110: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 7a 4e 61  0 ){.        zNa
9120: 6d 65 5b 6e 4e 61 6d 65 5d 20 3d 20 30 3b 0a 20  me[nName] = 0;. 
9130: 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 73         zName = s
9140: 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 64 62  qlite3MPrintf(db
9150: 2c 20 22 25 7a 3a 25 64 22 2c 20 7a 4e 61 6d 65  , "%z:%d", zName
9160: 2c 20 2b 2b 63 6e 74 29 3b 0a 20 20 20 20 20 20  , ++cnt);.      
9170: 20 20 6a 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20    j = -1;.      
9180: 20 20 69 66 28 20 7a 4e 61 6d 65 3d 3d 30 20 29    if( zName==0 )
9190: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
91a0: 20 20 20 20 7d 0a 20 20 20 20 70 43 6f 6c 2d 3e      }.    pCol->
91b0: 7a 4e 61 6d 65 20 3d 20 7a 4e 61 6d 65 3b 0a 0a  zName = zName;..
91c0: 20 20 20 20 2f 2a 20 47 65 74 20 74 68 65 20 74      /* Get the t
91d0: 79 70 65 6e 61 6d 65 2c 20 74 79 70 65 20 61 66  ypename, type af
91e0: 66 69 6e 69 74 79 2c 20 61 6e 64 20 63 6f 6c 6c  finity, and coll
91f0: 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65 20 66  ating sequence f
9200: 6f 72 20 74 68 65 0a 20 20 20 20 2a 2a 20 63 6f  or the.    ** co
9210: 6c 75 6d 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  lumn..    */.   
9220: 20 6d 65 6d 73 65 74 28 26 73 4e 43 2c 20 30 2c   memset(&sNC, 0,
9230: 20 73 69 7a 65 6f 66 28 73 4e 43 29 29 3b 0a 20   sizeof(sNC));. 
9240: 20 20 20 73 4e 43 2e 70 53 72 63 4c 69 73 74 20     sNC.pSrcList 
9250: 3d 20 70 53 65 6c 65 63 74 2d 3e 70 53 72 63 3b  = pSelect->pSrc;
9260: 0a 20 20 20 20 7a 54 79 70 65 20 3d 20 73 71 6c  .    zType = sql
9270: 69 74 65 33 44 62 53 74 72 44 75 70 28 64 62 2c  ite3DbStrDup(db,
9280: 20 63 6f 6c 75 6d 6e 54 79 70 65 28 26 73 4e 43   columnType(&sNC
9290: 2c 20 70 2c 20 30 2c 20 30 2c 20 30 29 29 3b 0a  , p, 0, 0, 0));.
92a0: 20 20 20 20 70 43 6f 6c 2d 3e 7a 54 79 70 65 20      pCol->zType 
92b0: 3d 20 7a 54 79 70 65 3b 0a 20 20 20 20 70 43 6f  = zType;.    pCo
92c0: 6c 2d 3e 61 66 66 69 6e 69 74 79 20 3d 20 73 71  l->affinity = sq
92d0: 6c 69 74 65 33 45 78 70 72 41 66 66 69 6e 69 74  lite3ExprAffinit
92e0: 79 28 70 29 3b 0a 20 20 20 20 70 43 6f 6c 6c 20  y(p);.    pColl 
92f0: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6c  = sqlite3ExprCol
9300: 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70 29 3b  lSeq(pParse, p);
9310: 0a 20 20 20 20 69 66 28 20 70 43 6f 6c 6c 20 29  .    if( pColl )
9320: 7b 0a 20 20 20 20 20 20 70 43 6f 6c 2d 3e 7a 43  {.      pCol->zC
9330: 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 44 62 53  oll = sqlite3DbS
9340: 74 72 44 75 70 28 64 62 2c 20 70 43 6f 6c 6c 2d  trDup(db, pColl-
9350: 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 7d 0a 20  >zName);.    }. 
9360: 20 7d 0a 20 20 70 54 61 62 2d 3e 69 50 4b 65 79   }.  pTab->iPKey
9370: 20 3d 20 2d 31 3b 0a 20 20 72 65 74 75 72 6e 20   = -1;.  return 
9380: 70 54 61 62 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50  pTab;.}../*.** P
9390: 72 65 70 61 72 65 20 61 20 53 45 4c 45 43 54 20  repare a SELECT 
93a0: 73 74 61 74 65 6d 65 6e 74 20 66 6f 72 20 70 72  statement for pr
93b0: 6f 63 65 73 73 69 6e 67 20 62 79 20 64 6f 69 6e  ocessing by doin
93c0: 67 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 0a  g the following.
93d0: 2a 2a 20 74 68 69 6e 67 73 3a 0a 2a 2a 0a 2a 2a  ** things:.**.**
93e0: 20 20 20 20 28 31 29 20 20 4d 61 6b 65 20 73 75      (1)  Make su
93f0: 72 65 20 56 44 42 45 20 63 75 72 73 6f 72 20 6e  re VDBE cursor n
9400: 75 6d 62 65 72 73 20 68 61 76 65 20 62 65 65 6e  umbers have been
9410: 20 61 73 73 69 67 6e 65 64 20 74 6f 20 65 76 65   assigned to eve
9420: 72 79 0a 2a 2a 20 20 20 20 20 20 20 20 20 65 6c  ry.**         el
9430: 65 6d 65 6e 74 20 6f 66 20 74 68 65 20 46 52 4f  ement of the FRO
9440: 4d 20 63 6c 61 75 73 65 2e 0a 2a 2a 0a 2a 2a 20  M clause..**.** 
9450: 20 20 20 28 32 29 20 20 46 69 6c 6c 20 69 6e 20     (2)  Fill in 
9460: 74 68 65 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b  the pTabList->a[
9470: 5d 2e 70 54 61 62 20 66 69 65 6c 64 73 20 69 6e  ].pTab fields in
9480: 20 74 68 65 20 53 72 63 4c 69 73 74 20 74 68 61   the SrcList tha
9490: 74 20 0a 2a 2a 20 20 20 20 20 20 20 20 20 64 65  t .**         de
94a0: 66 69 6e 65 73 20 46 52 4f 4d 20 63 6c 61 75 73  fines FROM claus
94b0: 65 2e 20 20 57 68 65 6e 20 76 69 65 77 73 20 61  e.  When views a
94c0: 70 70 65 61 72 20 69 6e 20 74 68 65 20 46 52 4f  ppear in the FRO
94d0: 4d 20 63 6c 61 75 73 65 2c 0a 2a 2a 20 20 20 20  M clause,.**    
94e0: 20 20 20 20 20 66 69 6c 6c 20 70 54 61 62 4c 69       fill pTabLi
94f0: 73 74 2d 3e 61 5b 5d 2e 70 53 65 6c 65 63 74 20  st->a[].pSelect 
9500: 77 69 74 68 20 61 20 63 6f 70 79 20 6f 66 20 74  with a copy of t
9510: 68 65 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d  he SELECT statem
9520: 65 6e 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 74  ent.**         t
9530: 68 61 74 20 69 6d 70 6c 65 6d 65 6e 74 73 20 74  hat implements t
9540: 68 65 20 76 69 65 77 2e 20 20 41 20 63 6f 70 79  he view.  A copy
9550: 20 69 73 20 6d 61 64 65 20 6f 66 20 74 68 65 20   is made of the 
9560: 76 69 65 77 27 73 20 53 45 4c 45 43 54 0a 2a 2a  view's SELECT.**
9570: 20 20 20 20 20 20 20 20 20 73 74 61 74 65 6d 65           stateme
9580: 6e 74 20 73 6f 20 74 68 61 74 20 77 65 20 63 61  nt so that we ca
9590: 6e 20 66 72 65 65 6c 79 20 6d 6f 64 69 66 79 20  n freely modify 
95a0: 6f 72 20 64 65 6c 65 74 65 20 74 68 61 74 20 73  or delete that s
95b0: 74 61 74 65 6d 65 6e 74 0a 2a 2a 20 20 20 20 20  tatement.**     
95c0: 20 20 20 20 77 69 74 68 6f 75 74 20 77 6f 72 72      without worr
95d0: 79 69 6e 67 20 61 62 6f 75 74 20 6d 65 73 73 69  ying about messi
95e0: 6e 67 20 75 70 20 74 68 65 20 70 72 65 73 69 73  ng up the presis
95f0: 74 65 6e 74 20 72 65 70 72 65 73 65 6e 74 61 74  tent representat
9600: 69 6f 6e 0a 2a 2a 20 20 20 20 20 20 20 20 20 6f  ion.**         o
9610: 66 20 74 68 65 20 76 69 65 77 2e 0a 2a 2a 0a 2a  f the view..**.*
9620: 2a 20 20 20 20 28 33 29 20 20 41 64 64 20 74 65  *    (3)  Add te
9630: 72 6d 73 20 74 6f 20 74 68 65 20 57 48 45 52 45  rms to the WHERE
9640: 20 63 6c 61 75 73 65 20 74 6f 20 61 63 63 6f 6d   clause to accom
9650: 6f 64 61 74 65 20 74 68 65 20 4e 41 54 55 52 41  odate the NATURA
9660: 4c 20 6b 65 79 77 6f 72 64 0a 2a 2a 20 20 20 20  L keyword.**    
9670: 20 20 20 20 20 6f 6e 20 6a 6f 69 6e 73 20 61 6e       on joins an
9680: 64 20 74 68 65 20 4f 4e 20 61 6e 64 20 55 53 49  d the ON and USI
9690: 4e 47 20 63 6c 61 75 73 65 20 6f 66 20 6a 6f 69  NG clause of joi
96a0: 6e 73 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 28 34 29  ns..**.**    (4)
96b0: 20 20 53 63 61 6e 20 74 68 65 20 6c 69 73 74 20    Scan the list 
96c0: 6f 66 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68  of columns in th
96d0: 65 20 72 65 73 75 6c 74 20 73 65 74 20 28 70 45  e result set (pE
96e0: 4c 69 73 74 29 20 6c 6f 6f 6b 69 6e 67 0a 2a 2a  List) looking.**
96f0: 20 20 20 20 20 20 20 20 20 66 6f 72 20 69 6e 73           for ins
9700: 74 61 6e 63 65 73 20 6f 66 20 74 68 65 20 22 2a  tances of the "*
9710: 22 20 6f 70 65 72 61 74 6f 72 20 6f 72 20 74 68  " operator or th
9720: 65 20 54 41 42 4c 45 2e 2a 20 6f 70 65 72 61 74  e TABLE.* operat
9730: 6f 72 2e 0a 2a 2a 20 20 20 20 20 20 20 20 20 49  or..**         I
9740: 66 20 66 6f 75 6e 64 2c 20 65 78 70 61 6e 64 20  f found, expand 
9750: 65 61 63 68 20 22 2a 22 20 74 6f 20 62 65 20 65  each "*" to be e
9760: 76 65 72 79 20 63 6f 6c 75 6d 6e 20 69 6e 20 65  very column in e
9770: 76 65 72 79 20 74 61 62 6c 65 0a 2a 2a 20 20 20  very table.**   
9780: 20 20 20 20 20 20 61 6e 64 20 54 41 42 4c 45 2e        and TABLE.
9790: 2a 20 74 6f 20 62 65 20 65 76 65 72 79 20 63 6f  * to be every co
97a0: 6c 75 6d 6e 20 69 6e 20 54 41 42 4c 45 2e 0a 2a  lumn in TABLE..*
97b0: 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 30 20 6f 6e  *.** Return 0 on
97c0: 20 73 75 63 63 65 73 73 2e 20 20 49 66 20 74 68   success.  If th
97d0: 65 72 65 20 61 72 65 20 70 72 6f 62 6c 65 6d 73  ere are problems
97e0: 2c 20 6c 65 61 76 65 20 61 6e 20 65 72 72 6f 72  , leave an error
97f0: 20 6d 65 73 73 61 67 65 0a 2a 2a 20 69 6e 20 70   message.** in p
9800: 50 61 72 73 65 20 61 6e 64 20 72 65 74 75 72 6e  Parse and return
9810: 20 6e 6f 6e 2d 7a 65 72 6f 2e 0a 2a 2f 0a 73 74   non-zero..*/.st
9820: 61 74 69 63 20 69 6e 74 20 70 72 65 70 53 65 6c  atic int prepSel
9830: 65 63 74 53 74 6d 74 28 50 61 72 73 65 20 2a 70  ectStmt(Parse *p
9840: 50 61 72 73 65 2c 20 53 65 6c 65 63 74 20 2a 70  Parse, Select *p
9850: 29 7b 0a 20 20 69 6e 74 20 69 2c 20 6a 2c 20 6b  ){.  int i, j, k
9860: 2c 20 72 63 3b 0a 20 20 53 72 63 4c 69 73 74 20  , rc;.  SrcList 
9870: 2a 70 54 61 62 4c 69 73 74 3b 0a 20 20 45 78 70  *pTabList;.  Exp
9880: 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 3b 0a 20  rList *pEList;. 
9890: 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f   struct SrcList_
98a0: 69 74 65 6d 20 2a 70 46 72 6f 6d 3b 0a 20 20 73  item *pFrom;.  s
98b0: 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61  qlite3 *db = pPa
98c0: 72 73 65 2d 3e 64 62 3b 0a 0a 20 20 69 66 28 20  rse->db;..  if( 
98d0: 70 3d 3d 30 20 7c 7c 20 70 2d 3e 70 53 72 63 3d  p==0 || p->pSrc=
98e0: 3d 30 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63  =0 || db->malloc
98f0: 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 72 65  Failed ){.    re
9900: 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 70 54  turn 1;.  }.  pT
9910: 61 62 4c 69 73 74 20 3d 20 70 2d 3e 70 53 72 63  abList = p->pSrc
9920: 3b 0a 20 20 70 45 4c 69 73 74 20 3d 20 70 2d 3e  ;.  pEList = p->
9930: 70 45 4c 69 73 74 3b 0a 0a 20 20 2f 2a 20 4d 61  pEList;..  /* Ma
9940: 6b 65 20 73 75 72 65 20 63 75 72 73 6f 72 20 6e  ke sure cursor n
9950: 75 6d 62 65 72 73 20 68 61 76 65 20 62 65 65 6e  umbers have been
9960: 20 61 73 73 69 67 6e 65 64 20 74 6f 20 61 6c 6c   assigned to all
9970: 20 65 6e 74 72 69 65 73 20 69 6e 0a 20 20 2a 2a   entries in.  **
9980: 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65   the FROM clause
9990: 20 6f 66 20 74 68 65 20 53 45 4c 45 43 54 20 73   of the SELECT s
99a0: 74 61 74 65 6d 65 6e 74 2e 0a 20 20 2a 2f 0a 20  tatement..  */. 
99b0: 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74 41   sqlite3SrcListA
99c0: 73 73 69 67 6e 43 75 72 73 6f 72 73 28 70 50 61  ssignCursors(pPa
99d0: 72 73 65 2c 20 70 2d 3e 70 53 72 63 29 3b 0a 0a  rse, p->pSrc);..
99e0: 20 20 2f 2a 20 4c 6f 6f 6b 20 75 70 20 65 76 65    /* Look up eve
99f0: 72 79 20 74 61 62 6c 65 20 6e 61 6d 65 64 20 69  ry table named i
9a00: 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73  n the FROM claus
9a10: 65 20 6f 66 20 74 68 65 20 73 65 6c 65 63 74 2e  e of the select.
9a20: 20 20 49 66 0a 20 20 2a 2a 20 61 6e 20 65 6e 74    If.  ** an ent
9a30: 72 79 20 6f 66 20 74 68 65 20 46 52 4f 4d 20 63  ry of the FROM c
9a40: 6c 61 75 73 65 20 69 73 20 61 20 73 75 62 71 75  lause is a subqu
9a50: 65 72 79 20 69 6e 73 74 65 61 64 20 6f 66 20 61  ery instead of a
9a60: 20 74 61 62 6c 65 20 6f 72 20 76 69 65 77 2c 0a   table or view,.
9a70: 20 20 2a 2a 20 74 68 65 6e 20 63 72 65 61 74 65    ** then create
9a80: 20 61 20 74 72 61 6e 73 69 65 6e 74 20 74 61 62   a transient tab
9a90: 6c 65 20 73 74 72 75 63 74 75 72 65 20 74 6f 20  le structure to 
9aa0: 64 65 73 63 72 69 62 65 20 74 68 65 20 73 75 62  describe the sub
9ab0: 71 75 65 72 79 2e 0a 20 20 2a 2f 0a 20 20 66 6f  query..  */.  fo
9ac0: 72 28 69 3d 30 2c 20 70 46 72 6f 6d 3d 70 54 61  r(i=0, pFrom=pTa
9ad0: 62 4c 69 73 74 2d 3e 61 3b 20 69 3c 70 54 61 62  bList->a; i<pTab
9ae0: 4c 69 73 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b 2c  List->nSrc; i++,
9af0: 20 70 46 72 6f 6d 2b 2b 29 7b 0a 20 20 20 20 54   pFrom++){.    T
9b00: 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20 20 20  able *pTab;.    
9b10: 69 66 28 20 70 46 72 6f 6d 2d 3e 70 54 61 62 21  if( pFrom->pTab!
9b20: 3d 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54  =0 ){.      /* T
9b30: 68 69 73 20 73 74 61 74 65 6d 65 6e 74 20 68 61  his statement ha
9b40: 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 70  s already been p
9b50: 72 65 70 61 72 65 64 2e 20 20 54 68 65 72 65 20  repared.  There 
9b60: 69 73 20 6e 6f 20 6e 65 65 64 0a 20 20 20 20 20  is no need.     
9b70: 20 2a 2a 20 74 6f 20 67 6f 20 66 75 72 74 68 65   ** to go furthe
9b80: 72 2e 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65  r. */.      asse
9b90: 72 74 28 20 69 3d 3d 30 20 29 3b 0a 20 20 20 20  rt( i==0 );.    
9ba0: 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20    return 0;.    
9bb0: 7d 0a 20 20 20 20 69 66 28 20 70 46 72 6f 6d 2d  }.    if( pFrom-
9bc0: 3e 7a 4e 61 6d 65 3d 3d 30 20 29 7b 0a 23 69 66  >zName==0 ){.#if
9bd0: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
9be0: 5f 53 55 42 51 55 45 52 59 0a 20 20 20 20 20 20  _SUBQUERY.      
9bf0: 2f 2a 20 41 20 73 75 62 2d 71 75 65 72 79 20 69  /* A sub-query i
9c00: 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73  n the FROM claus
9c10: 65 20 6f 66 20 61 20 53 45 4c 45 43 54 20 2a 2f  e of a SELECT */
9c20: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
9c30: 46 72 6f 6d 2d 3e 70 53 65 6c 65 63 74 21 3d 30  From->pSelect!=0
9c40: 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 46   );.      if( pF
9c50: 72 6f 6d 2d 3e 7a 41 6c 69 61 73 3d 3d 30 20 29  rom->zAlias==0 )
9c60: 7b 0a 20 20 20 20 20 20 20 20 70 46 72 6f 6d 2d  {.        pFrom-
9c70: 3e 7a 41 6c 69 61 73 20 3d 0a 20 20 20 20 20 20  >zAlias =.      
9c80: 20 20 20 20 73 71 6c 69 74 65 33 4d 50 72 69 6e      sqlite3MPrin
9c90: 74 66 28 64 62 2c 20 22 73 71 6c 69 74 65 5f 73  tf(db, "sqlite_s
9ca0: 75 62 71 75 65 72 79 5f 25 70 5f 22 2c 20 28 76  ubquery_%p_", (v
9cb0: 6f 69 64 2a 29 70 46 72 6f 6d 2d 3e 70 53 65 6c  oid*)pFrom->pSel
9cc0: 65 63 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ect);.      }.  
9cd0: 20 20 20 20 61 73 73 65 72 74 28 20 70 46 72 6f      assert( pFro
9ce0: 6d 2d 3e 70 54 61 62 3d 3d 30 20 29 3b 0a 20 20  m->pTab==0 );.  
9cf0: 20 20 20 20 70 46 72 6f 6d 2d 3e 70 54 61 62 20      pFrom->pTab 
9d00: 3d 20 70 54 61 62 20 3d 20 0a 20 20 20 20 20 20  = pTab = .      
9d10: 20 20 73 71 6c 69 74 65 33 52 65 73 75 6c 74 53    sqlite3ResultS
9d20: 65 74 4f 66 53 65 6c 65 63 74 28 70 50 61 72 73  etOfSelect(pPars
9d30: 65 2c 20 70 46 72 6f 6d 2d 3e 7a 41 6c 69 61 73  e, pFrom->zAlias
9d40: 2c 20 70 46 72 6f 6d 2d 3e 70 53 65 6c 65 63 74  , pFrom->pSelect
9d50: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 54 61  );.      if( pTa
9d60: 62 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  b==0 ){.        
9d70: 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 20 20  return 1;.      
9d80: 7d 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20 69  }.      /* The i
9d90: 73 45 70 68 65 6d 20 66 6c 61 67 20 69 6e 64 69  sEphem flag indi
9da0: 63 61 74 65 73 20 74 68 61 74 20 74 68 65 20 54  cates that the T
9db0: 61 62 6c 65 20 73 74 72 75 63 74 75 72 65 20 68  able structure h
9dc0: 61 73 20 62 65 65 6e 0a 20 20 20 20 20 20 2a 2a  as been.      **
9dd0: 20 64 79 6e 61 6d 69 63 61 6c 6c 79 20 61 6c 6c   dynamically all
9de0: 6f 63 61 74 65 64 20 61 6e 64 20 6d 61 79 20 62  ocated and may b
9df0: 65 20 66 72 65 65 64 20 61 74 20 61 6e 79 20 74  e freed at any t
9e00: 69 6d 65 2e 20 20 49 6e 20 6f 74 68 65 72 20 77  ime.  In other w
9e10: 6f 72 64 73 2c 0a 20 20 20 20 20 20 2a 2a 20 70  ords,.      ** p
9e20: 54 61 62 20 69 73 20 6e 6f 74 20 70 6f 69 6e 74  Tab is not point
9e30: 69 6e 67 20 74 6f 20 61 20 70 65 72 73 69 73 74  ing to a persist
9e40: 65 6e 74 20 74 61 62 6c 65 20 73 74 72 75 63 74  ent table struct
9e50: 75 72 65 20 74 68 61 74 20 64 65 66 69 6e 65 73  ure that defines
9e60: 0a 20 20 20 20 20 20 2a 2a 20 70 61 72 74 20 6f  .      ** part o
9e70: 66 20 74 68 65 20 73 63 68 65 6d 61 2e 20 2a 2f  f the schema. */
9e80: 0a 20 20 20 20 20 20 70 54 61 62 2d 3e 69 73 45  .      pTab->isE
9e90: 70 68 65 6d 20 3d 20 31 3b 0a 23 65 6e 64 69 66  phem = 1;.#endif
9ea0: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
9eb0: 20 20 2f 2a 20 41 6e 20 6f 72 64 69 6e 61 72 79    /* An ordinary
9ec0: 20 74 61 62 6c 65 20 6f 72 20 76 69 65 77 20 6e   table or view n
9ed0: 61 6d 65 20 69 6e 20 74 68 65 20 46 52 4f 4d 20  ame in the FROM 
9ee0: 63 6c 61 75 73 65 20 2a 2f 0a 20 20 20 20 20 20  clause */.      
9ef0: 61 73 73 65 72 74 28 20 70 46 72 6f 6d 2d 3e 70  assert( pFrom->p
9f00: 54 61 62 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  Tab==0 );.      
9f10: 70 46 72 6f 6d 2d 3e 70 54 61 62 20 3d 20 70 54  pFrom->pTab = pT
9f20: 61 62 20 3d 20 0a 20 20 20 20 20 20 20 20 73 71  ab = .        sq
9f30: 6c 69 74 65 33 4c 6f 63 61 74 65 54 61 62 6c 65  lite3LocateTable
9f40: 28 70 50 61 72 73 65 2c 70 46 72 6f 6d 2d 3e 7a  (pParse,pFrom->z
9f50: 4e 61 6d 65 2c 70 46 72 6f 6d 2d 3e 7a 44 61 74  Name,pFrom->zDat
9f60: 61 62 61 73 65 29 3b 0a 20 20 20 20 20 20 69 66  abase);.      if
9f70: 28 20 70 54 61 62 3d 3d 30 20 29 7b 0a 20 20 20  ( pTab==0 ){.   
9f80: 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20       return 1;. 
9f90: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 54 61       }.      pTa
9fa0: 62 2d 3e 6e 52 65 66 2b 2b 3b 0a 23 69 66 20 21  b->nRef++;.#if !
9fb0: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
9fc0: 4d 49 54 5f 56 49 45 57 29 20 7c 7c 20 21 64 65  MIT_VIEW) || !de
9fd0: 66 69 6e 65 64 20 28 53 51 4c 49 54 45 5f 4f 4d  fined (SQLITE_OM
9fe0: 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 29  IT_VIRTUALTABLE)
9ff0: 0a 20 20 20 20 20 20 69 66 28 20 70 54 61 62 2d  .      if( pTab-
a000: 3e 70 53 65 6c 65 63 74 20 7c 7c 20 49 73 56 69  >pSelect || IsVi
a010: 72 74 75 61 6c 28 70 54 61 62 29 20 29 7b 0a 20  rtual(pTab) ){. 
a020: 20 20 20 20 20 20 20 2f 2a 20 57 65 20 72 65 61         /* We rea
a030: 63 68 20 68 65 72 65 20 69 66 20 74 68 65 20 6e  ch here if the n
a040: 61 6d 65 64 20 74 61 62 6c 65 20 69 73 20 61 20  amed table is a 
a050: 72 65 61 6c 6c 79 20 61 20 76 69 65 77 20 2a 2f  really a view */
a060: 0a 20 20 20 20 20 20 20 20 69 66 28 20 73 71 6c  .        if( sql
a070: 69 74 65 33 56 69 65 77 47 65 74 43 6f 6c 75 6d  ite3ViewGetColum
a080: 6e 4e 61 6d 65 73 28 70 50 61 72 73 65 2c 20 70  nNames(pParse, p
a090: 54 61 62 29 20 29 7b 0a 20 20 20 20 20 20 20 20  Tab) ){.        
a0a0: 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20    return 1;.    
a0b0: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 2f 2a      }.        /*
a0c0: 20 49 66 20 70 46 72 6f 6d 2d 3e 70 53 65 6c 65   If pFrom->pSele
a0d0: 63 74 21 3d 30 20 69 74 20 6d 65 61 6e 73 20 77  ct!=0 it means w
a0e0: 65 20 61 72 65 20 64 65 61 6c 69 6e 67 20 77 69  e are dealing wi
a0f0: 74 68 20 61 0a 20 20 20 20 20 20 20 20 2a 2a 20  th a.        ** 
a100: 76 69 65 77 20 77 69 74 68 69 6e 20 61 20 76 69  view within a vi
a110: 65 77 2e 20 20 54 68 65 20 53 45 4c 45 43 54 20  ew.  The SELECT 
a120: 73 74 72 75 63 74 75 72 65 20 68 61 73 20 61 6c  structure has al
a130: 72 65 61 64 79 20 62 65 65 6e 0a 20 20 20 20 20  ready been.     
a140: 20 20 20 2a 2a 20 63 6f 70 69 65 64 20 62 79 20     ** copied by 
a150: 74 68 65 20 6f 75 74 65 72 20 76 69 65 77 20 73  the outer view s
a160: 6f 20 77 65 20 63 61 6e 20 73 6b 69 70 20 74 68  o we can skip th
a170: 65 20 63 6f 70 79 20 73 74 65 70 20 68 65 72 65  e copy step here
a180: 0a 20 20 20 20 20 20 20 20 2a 2a 20 69 6e 20 74  .        ** in t
a190: 68 65 20 69 6e 6e 65 72 20 76 69 65 77 2e 0a 20  he inner view.. 
a1a0: 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
a1b0: 20 20 69 66 28 20 70 46 72 6f 6d 2d 3e 70 53 65    if( pFrom->pSe
a1c0: 6c 65 63 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20  lect==0 ){.     
a1d0: 20 20 20 20 20 70 46 72 6f 6d 2d 3e 70 53 65 6c       pFrom->pSel
a1e0: 65 63 74 20 3d 20 73 71 6c 69 74 65 33 53 65 6c  ect = sqlite3Sel
a1f0: 65 63 74 44 75 70 28 64 62 2c 20 70 54 61 62 2d  ectDup(db, pTab-
a200: 3e 70 53 65 6c 65 63 74 29 3b 0a 20 20 20 20 20  >pSelect);.     
a210: 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 23 65 6e     }.      }.#en
a220: 64 69 66 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  dif.    }.  }.. 
a230: 20 2f 2a 20 50 72 6f 63 65 73 73 20 4e 41 54 55   /* Process NATU
a240: 52 41 4c 20 6b 65 79 77 6f 72 64 73 2c 20 61 6e  RAL keywords, an
a250: 64 20 4f 4e 20 61 6e 64 20 55 53 49 4e 47 20 63  d ON and USING c
a260: 6c 61 75 73 65 73 20 6f 66 20 6a 6f 69 6e 73 2e  lauses of joins.
a270: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 73 71 6c 69  .  */.  if( sqli
a280: 74 65 50 72 6f 63 65 73 73 4a 6f 69 6e 28 70 50  teProcessJoin(pP
a290: 61 72 73 65 2c 20 70 29 20 29 20 72 65 74 75 72  arse, p) ) retur
a2a0: 6e 20 31 3b 0a 0a 20 20 2f 2a 20 46 6f 72 20 65  n 1;..  /* For e
a2b0: 76 65 72 79 20 22 2a 22 20 74 68 61 74 20 6f 63  very "*" that oc
a2c0: 63 75 72 73 20 69 6e 20 74 68 65 20 63 6f 6c 75  curs in the colu
a2d0: 6d 6e 20 6c 69 73 74 2c 20 69 6e 73 65 72 74 20  mn list, insert 
a2e0: 74 68 65 20 6e 61 6d 65 73 20 6f 66 0a 20 20 2a  the names of.  *
a2f0: 2a 20 61 6c 6c 20 63 6f 6c 75 6d 6e 73 20 69 6e  * all columns in
a300: 20 61 6c 6c 20 74 61 62 6c 65 73 2e 20 20 41 6e   all tables.  An
a310: 64 20 66 6f 72 20 65 76 65 72 79 20 54 41 42 4c  d for every TABL
a320: 45 2e 2a 20 69 6e 73 65 72 74 20 74 68 65 20 6e  E.* insert the n
a330: 61 6d 65 73 0a 20 20 2a 2a 20 6f 66 20 61 6c 6c  ames.  ** of all
a340: 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 54 41 42 4c   columns in TABL
a350: 45 2e 20 20 54 68 65 20 70 61 72 73 65 72 20 69  E.  The parser i
a360: 6e 73 65 72 74 65 64 20 61 20 73 70 65 63 69 61  nserted a specia
a370: 6c 20 65 78 70 72 65 73 73 69 6f 6e 0a 20 20 2a  l expression.  *
a380: 2a 20 77 69 74 68 20 74 68 65 20 54 4b 5f 41 4c  * with the TK_AL
a390: 4c 20 6f 70 65 72 61 74 6f 72 20 66 6f 72 20 65  L operator for e
a3a0: 61 63 68 20 22 2a 22 20 74 68 61 74 20 69 74 20  ach "*" that it 
a3b0: 66 6f 75 6e 64 20 69 6e 20 74 68 65 20 63 6f 6c  found in the col
a3c0: 75 6d 6e 20 6c 69 73 74 2e 0a 20 20 2a 2a 20 54  umn list..  ** T
a3d0: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 6f 64  he following cod
a3e0: 65 20 6a 75 73 74 20 68 61 73 20 74 6f 20 6c 6f  e just has to lo
a3f0: 63 61 74 65 20 74 68 65 20 54 4b 5f 41 4c 4c 20  cate the TK_ALL 
a400: 65 78 70 72 65 73 73 69 6f 6e 73 20 61 6e 64 20  expressions and 
a410: 65 78 70 61 6e 64 0a 20 20 2a 2a 20 65 61 63 68  expand.  ** each
a420: 20 6f 6e 65 20 74 6f 20 74 68 65 20 6c 69 73 74   one to the list
a430: 20 6f 66 20 61 6c 6c 20 63 6f 6c 75 6d 6e 73 20   of all columns 
a440: 69 6e 20 61 6c 6c 20 74 61 62 6c 65 73 2e 0a 20  in all tables.. 
a450: 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 66 69 72   **.  ** The fir
a460: 73 74 20 6c 6f 6f 70 20 6a 75 73 74 20 63 68 65  st loop just che
a470: 63 6b 73 20 74 6f 20 73 65 65 20 69 66 20 74 68  cks to see if th
a480: 65 72 65 20 61 72 65 20 61 6e 79 20 22 2a 22 20  ere are any "*" 
a490: 6f 70 65 72 61 74 6f 72 73 0a 20 20 2a 2a 20 74  operators.  ** t
a4a0: 68 61 74 20 6e 65 65 64 20 65 78 70 61 6e 64 69  hat need expandi
a4b0: 6e 67 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 6b  ng..  */.  for(k
a4c0: 3d 30 3b 20 6b 3c 70 45 4c 69 73 74 2d 3e 6e 45  =0; k<pEList->nE
a4d0: 78 70 72 3b 20 6b 2b 2b 29 7b 0a 20 20 20 20 45  xpr; k++){.    E
a4e0: 78 70 72 20 2a 70 45 20 3d 20 70 45 4c 69 73 74  xpr *pE = pEList
a4f0: 2d 3e 61 5b 6b 5d 2e 70 45 78 70 72 3b 0a 20 20  ->a[k].pExpr;.  
a500: 20 20 69 66 28 20 70 45 2d 3e 6f 70 3d 3d 54 4b    if( pE->op==TK
a510: 5f 41 4c 4c 20 29 20 62 72 65 61 6b 3b 0a 20 20  _ALL ) break;.  
a520: 20 20 69 66 28 20 70 45 2d 3e 6f 70 3d 3d 54 4b    if( pE->op==TK
a530: 5f 44 4f 54 20 26 26 20 70 45 2d 3e 70 52 69 67  _DOT && pE->pRig
a540: 68 74 20 26 26 20 70 45 2d 3e 70 52 69 67 68 74  ht && pE->pRight
a550: 2d 3e 6f 70 3d 3d 54 4b 5f 41 4c 4c 0a 20 20 20  ->op==TK_ALL.   
a560: 20 20 20 20 20 20 26 26 20 70 45 2d 3e 70 4c 65        && pE->pLe
a570: 66 74 20 26 26 20 70 45 2d 3e 70 4c 65 66 74 2d  ft && pE->pLeft-
a580: 3e 6f 70 3d 3d 54 4b 5f 49 44 20 29 20 62 72 65  >op==TK_ID ) bre
a590: 61 6b 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 30  ak;.  }.  rc = 0
a5a0: 3b 0a 20 20 69 66 28 20 6b 3c 70 45 4c 69 73 74  ;.  if( k<pEList
a5b0: 2d 3e 6e 45 78 70 72 20 29 7b 0a 20 20 20 20 2f  ->nExpr ){.    /
a5c0: 2a 0a 20 20 20 20 2a 2a 20 49 66 20 77 65 20 67  *.    ** If we g
a5d0: 65 74 20 68 65 72 65 20 69 74 20 6d 65 61 6e 73  et here it means
a5e0: 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 20   the result set 
a5f0: 63 6f 6e 74 61 69 6e 73 20 6f 6e 65 20 6f 72 20  contains one or 
a600: 6d 6f 72 65 20 22 2a 22 0a 20 20 20 20 2a 2a 20  more "*".    ** 
a610: 6f 70 65 72 61 74 6f 72 73 20 74 68 61 74 20 6e  operators that n
a620: 65 65 64 20 74 6f 20 62 65 20 65 78 70 61 6e 64  eed to be expand
a630: 65 64 2e 20 20 4c 6f 6f 70 20 74 68 72 6f 75 67  ed.  Loop throug
a640: 68 20 65 61 63 68 20 65 78 70 72 65 73 73 69 6f  h each expressio
a650: 6e 0a 20 20 20 20 2a 2a 20 69 6e 20 74 68 65 20  n.    ** in the 
a660: 72 65 73 75 6c 74 20 73 65 74 20 61 6e 64 20 65  result set and e
a670: 78 70 61 6e 64 20 74 68 65 6d 20 6f 6e 65 20 62  xpand them one b
a680: 79 20 6f 6e 65 2e 0a 20 20 20 20 2a 2f 0a 20 20  y one..    */.  
a690: 20 20 73 74 72 75 63 74 20 45 78 70 72 4c 69 73    struct ExprLis
a6a0: 74 5f 69 74 65 6d 20 2a 61 20 3d 20 70 45 4c 69  t_item *a = pELi
a6b0: 73 74 2d 3e 61 3b 0a 20 20 20 20 45 78 70 72 4c  st->a;.    ExprL
a6c0: 69 73 74 20 2a 70 4e 65 77 20 3d 20 30 3b 0a 20  ist *pNew = 0;. 
a6d0: 20 20 20 69 6e 74 20 66 6c 61 67 73 20 3d 20 70     int flags = p
a6e0: 50 61 72 73 65 2d 3e 64 62 2d 3e 66 6c 61 67 73  Parse->db->flags
a6f0: 3b 0a 20 20 20 20 69 6e 74 20 6c 6f 6e 67 4e 61  ;.    int longNa
a700: 6d 65 73 20 3d 20 28 66 6c 61 67 73 20 26 20 53  mes = (flags & S
a710: 51 4c 49 54 45 5f 46 75 6c 6c 43 6f 6c 4e 61 6d  QLITE_FullColNam
a720: 65 73 29 21 3d 30 20 26 26 0a 20 20 20 20 20 20  es)!=0 &&.      
a730: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a740: 28 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f  (flags & SQLITE_
a750: 53 68 6f 72 74 43 6f 6c 4e 61 6d 65 73 29 3d 3d  ShortColNames)==
a760: 30 3b 0a 0a 20 20 20 20 66 6f 72 28 6b 3d 30 3b  0;..    for(k=0;
a770: 20 6b 3c 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72   k<pEList->nExpr
a780: 3b 20 6b 2b 2b 29 7b 0a 20 20 20 20 20 20 45 78  ; k++){.      Ex
a790: 70 72 20 2a 70 45 20 3d 20 61 5b 6b 5d 2e 70 45  pr *pE = a[k].pE
a7a0: 78 70 72 3b 0a 20 20 20 20 20 20 69 66 28 20 70  xpr;.      if( p
a7b0: 45 2d 3e 6f 70 21 3d 54 4b 5f 41 4c 4c 20 26 26  E->op!=TK_ALL &&
a7c0: 0a 20 20 20 20 20 20 20 20 20 20 20 28 70 45 2d  .           (pE-
a7d0: 3e 6f 70 21 3d 54 4b 5f 44 4f 54 20 7c 7c 20 70  >op!=TK_DOT || p
a7e0: 45 2d 3e 70 52 69 67 68 74 3d 3d 30 20 7c 7c 20  E->pRight==0 || 
a7f0: 70 45 2d 3e 70 52 69 67 68 74 2d 3e 6f 70 21 3d  pE->pRight->op!=
a800: 54 4b 5f 41 4c 4c 29 20 29 7b 0a 20 20 20 20 20  TK_ALL) ){.     
a810: 20 20 20 2f 2a 20 54 68 69 73 20 70 61 72 74 69     /* This parti
a820: 63 75 6c 61 72 20 65 78 70 72 65 73 73 69 6f 6e  cular expression
a830: 20 64 6f 65 73 20 6e 6f 74 20 6e 65 65 64 20 74   does not need t
a840: 6f 20 62 65 20 65 78 70 61 6e 64 65 64 2e 0a 20  o be expanded.. 
a850: 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
a860: 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33    pNew = sqlite3
a870: 45 78 70 72 4c 69 73 74 41 70 70 65 6e 64 28 70  ExprListAppend(p
a880: 50 61 72 73 65 2c 20 70 4e 65 77 2c 20 61 5b 6b  Parse, pNew, a[k
a890: 5d 2e 70 45 78 70 72 2c 20 30 29 3b 0a 20 20 20  ].pExpr, 0);.   
a8a0: 20 20 20 20 20 69 66 28 20 70 4e 65 77 20 29 7b       if( pNew ){
a8b0: 0a 20 20 20 20 20 20 20 20 20 20 70 4e 65 77 2d  .          pNew-
a8c0: 3e 61 5b 70 4e 65 77 2d 3e 6e 45 78 70 72 2d 31  >a[pNew->nExpr-1
a8d0: 5d 2e 7a 4e 61 6d 65 20 3d 20 61 5b 6b 5d 2e 7a  ].zName = a[k].z
a8e0: 4e 61 6d 65 3b 0a 20 20 20 20 20 20 20 20 7d 65  Name;.        }e
a8f0: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 72  lse{.          r
a900: 63 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 7d  c = 1;.        }
a910: 0a 20 20 20 20 20 20 20 20 61 5b 6b 5d 2e 70 45  .        a[k].pE
a920: 78 70 72 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  xpr = 0;.       
a930: 20 61 5b 6b 5d 2e 7a 4e 61 6d 65 20 3d 20 30 3b   a[k].zName = 0;
a940: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
a950: 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20 65 78        /* This ex
a960: 70 72 65 73 73 69 6f 6e 20 69 73 20 61 20 22 2a  pression is a "*
a970: 22 20 6f 72 20 61 20 22 54 41 42 4c 45 2e 2a 22  " or a "TABLE.*"
a980: 20 61 6e 64 20 6e 65 65 64 73 20 74 6f 20 62 65   and needs to be
a990: 0a 20 20 20 20 20 20 20 20 2a 2a 20 65 78 70 61  .        ** expa
a9a0: 6e 64 65 64 2e 20 2a 2f 0a 20 20 20 20 20 20 20  nded. */.       
a9b0: 20 69 6e 74 20 74 61 62 6c 65 53 65 65 6e 20 3d   int tableSeen =
a9c0: 20 30 3b 20 20 20 20 20 20 2f 2a 20 53 65 74 20   0;      /* Set 
a9d0: 74 6f 20 31 20 77 68 65 6e 20 54 41 42 4c 45 20  to 1 when TABLE 
a9e0: 6d 61 74 63 68 65 73 20 2a 2f 0a 20 20 20 20 20  matches */.     
a9f0: 20 20 20 63 68 61 72 20 2a 7a 54 4e 61 6d 65 3b     char *zTName;
aa00: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 74              /* t
aa10: 65 78 74 20 6f 66 20 6e 61 6d 65 20 6f 66 20 54  ext of name of T
aa20: 41 42 4c 45 20 2a 2f 0a 20 20 20 20 20 20 20 20  ABLE */.        
aa30: 69 66 28 20 70 45 2d 3e 6f 70 3d 3d 54 4b 5f 44  if( pE->op==TK_D
aa40: 4f 54 20 26 26 20 70 45 2d 3e 70 4c 65 66 74 20  OT && pE->pLeft 
aa50: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 7a 54 4e  ){.          zTN
aa60: 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d  ame = sqlite3Nam
aa70: 65 46 72 6f 6d 54 6f 6b 65 6e 28 64 62 2c 20 26  eFromToken(db, &
aa80: 70 45 2d 3e 70 4c 65 66 74 2d 3e 74 6f 6b 65 6e  pE->pLeft->token
aa90: 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  );.        }else
aaa0: 7b 0a 20 20 20 20 20 20 20 20 20 20 7a 54 4e 61  {.          zTNa
aab0: 6d 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  me = 0;.        
aac0: 7d 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d  }.        for(i=
aad0: 30 2c 20 70 46 72 6f 6d 3d 70 54 61 62 4c 69 73  0, pFrom=pTabLis
aae0: 74 2d 3e 61 3b 20 69 3c 70 54 61 62 4c 69 73 74  t->a; i<pTabList
aaf0: 2d 3e 6e 53 72 63 3b 20 69 2b 2b 2c 20 70 46 72  ->nSrc; i++, pFr
ab00: 6f 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20  om++){.         
ab10: 20 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 70   Table *pTab = p
ab20: 46 72 6f 6d 2d 3e 70 54 61 62 3b 0a 20 20 20 20  From->pTab;.    
ab30: 20 20 20 20 20 20 63 68 61 72 20 2a 7a 54 61 62        char *zTab
ab40: 4e 61 6d 65 20 3d 20 70 46 72 6f 6d 2d 3e 7a 41  Name = pFrom->zA
ab50: 6c 69 61 73 3b 0a 20 20 20 20 20 20 20 20 20 20  lias;.          
ab60: 69 66 28 20 7a 54 61 62 4e 61 6d 65 3d 3d 30 20  if( zTabName==0 
ab70: 7c 7c 20 7a 54 61 62 4e 61 6d 65 5b 30 5d 3d 3d  || zTabName[0]==
ab80: 30 20 29 7b 20 0a 20 20 20 20 20 20 20 20 20 20  0 ){ .          
ab90: 20 20 7a 54 61 62 4e 61 6d 65 20 3d 20 70 54 61    zTabName = pTa
aba0: 62 2d 3e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20  b->zName;.      
abb0: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
abc0: 69 66 28 20 7a 54 4e 61 6d 65 20 26 26 20 28 7a  if( zTName && (z
abd0: 54 61 62 4e 61 6d 65 3d 3d 30 20 7c 7c 20 7a 54  TabName==0 || zT
abe0: 61 62 4e 61 6d 65 5b 30 5d 3d 3d 30 20 7c 7c 20  abName[0]==0 || 
abf0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
ac00: 20 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70    sqlite3StrICmp
ac10: 28 7a 54 4e 61 6d 65 2c 20 7a 54 61 62 4e 61 6d  (zTName, zTabNam
ac20: 65 29 21 3d 30 29 20 29 7b 0a 20 20 20 20 20 20  e)!=0) ){.      
ac30: 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a        continue;.
ac40: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
ac50: 20 20 20 20 20 20 74 61 62 6c 65 53 65 65 6e 20        tableSeen 
ac60: 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20 66  = 1;.          f
ac70: 6f 72 28 6a 3d 30 3b 20 6a 3c 70 54 61 62 2d 3e  or(j=0; j<pTab->
ac80: 6e 43 6f 6c 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20  nCol; j++){.    
ac90: 20 20 20 20 20 20 20 20 45 78 70 72 20 2a 70 45          Expr *pE
aca0: 78 70 72 2c 20 2a 70 52 69 67 68 74 3b 0a 20 20  xpr, *pRight;.  
acb0: 20 20 20 20 20 20 20 20 20 20 63 68 61 72 20 2a            char *
acc0: 7a 4e 61 6d 65 20 3d 20 70 54 61 62 2d 3e 61 43  zName = pTab->aC
acd0: 6f 6c 5b 6a 5d 2e 7a 4e 61 6d 65 3b 0a 0a 20 20  ol[j].zName;..  
ace0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20            /* If 
acf0: 61 20 63 6f 6c 75 6d 6e 20 69 73 20 6d 61 72 6b  a column is mark
ad00: 65 64 20 61 73 20 27 68 69 64 64 65 6e 27 20 28  ed as 'hidden' (
ad10: 63 75 72 72 65 6e 74 6c 79 20 6f 6e 6c 79 20 70  currently only p
ad20: 6f 73 73 69 62 6c 65 0a 20 20 20 20 20 20 20 20  ossible.        
ad30: 20 20 20 20 2a 2a 20 66 6f 72 20 76 69 72 74 75      ** for virtu
ad40: 61 6c 20 74 61 62 6c 65 73 29 2c 20 64 6f 20 6e  al tables), do n
ad50: 6f 74 20 69 6e 63 6c 75 64 65 20 69 74 20 69 6e  ot include it in
ad60: 20 74 68 65 20 65 78 70 61 6e 64 65 64 0a 20 20   the expanded.  
ad70: 20 20 20 20 20 20 20 20 20 20 2a 2a 20 72 65 73            ** res
ad80: 75 6c 74 2d 73 65 74 20 6c 69 73 74 2e 0a 20 20  ult-set list..  
ad90: 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20            */.   
ada0: 20 20 20 20 20 20 20 20 20 69 66 28 20 49 73 48           if( IsH
adb0: 69 64 64 65 6e 43 6f 6c 75 6d 6e 28 26 70 54 61  iddenColumn(&pTa
adc0: 62 2d 3e 61 43 6f 6c 5b 6a 5d 29 20 29 7b 0a 20  b->aCol[j]) ){. 
add0: 20 20 20 20 20 20 20 20 20 20 20 20 20 61 73 73               ass
ade0: 65 72 74 28 49 73 56 69 72 74 75 61 6c 28 70 54  ert(IsVirtual(pT
adf0: 61 62 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ab));.          
ae00: 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20      continue;.  
ae10: 20 20 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20            }..   
ae20: 20 20 20 20 20 20 20 20 20 69 66 28 20 69 3e 30           if( i>0
ae30: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
ae40: 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74    struct SrcList
ae50: 5f 69 74 65 6d 20 2a 70 4c 65 66 74 20 3d 20 26  _item *pLeft = &
ae60: 70 54 61 62 4c 69 73 74 2d 3e 61 5b 69 2d 31 5d  pTabList->a[i-1]
ae70: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
ae80: 69 66 28 20 28 70 4c 65 66 74 5b 31 5d 2e 6a 6f  if( (pLeft[1].jo
ae90: 69 6e 74 79 70 65 20 26 20 4a 54 5f 4e 41 54 55  intype & JT_NATU
aea0: 52 41 4c 29 21 3d 30 20 26 26 0a 20 20 20 20 20  RAL)!=0 &&.     
aeb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
aec0: 20 20 20 63 6f 6c 75 6d 6e 49 6e 64 65 78 28 70     columnIndex(p
aed0: 4c 65 66 74 2d 3e 70 54 61 62 2c 20 7a 4e 61 6d  Left->pTab, zNam
aee0: 65 29 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  e)>=0 ){.       
aef0: 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 20 61           /* In a
af00: 20 4e 41 54 55 52 41 4c 20 6a 6f 69 6e 2c 20 6f   NATURAL join, o
af10: 6d 69 74 20 74 68 65 20 6a 6f 69 6e 20 63 6f 6c  mit the join col
af20: 75 6d 6e 73 20 66 72 6f 6d 20 74 68 65 20 0a 20  umns from the . 
af30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2a                 *
af40: 2a 20 74 61 62 6c 65 20 6f 6e 20 74 68 65 20 72  * table on the r
af50: 69 67 68 74 20 2a 2f 0a 20 20 20 20 20 20 20 20  ight */.        
af60: 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65          continue
af70: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
af80: 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  }.              
af90: 69 66 28 20 73 71 6c 69 74 65 33 49 64 4c 69 73  if( sqlite3IdLis
afa0: 74 49 6e 64 65 78 28 70 4c 65 66 74 5b 31 5d 2e  tIndex(pLeft[1].
afb0: 70 55 73 69 6e 67 2c 20 7a 4e 61 6d 65 29 3e 3d  pUsing, zName)>=
afc0: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  0 ){.           
afd0: 20 20 20 20 20 2f 2a 20 49 6e 20 61 20 6a 6f 69       /* In a joi
afe0: 6e 20 77 69 74 68 20 61 20 55 53 49 4e 47 20 63  n with a USING c
aff0: 6c 61 75 73 65 2c 20 6f 6d 69 74 20 63 6f 6c 75  lause, omit colu
b000: 6d 6e 73 20 69 6e 20 74 68 65 0a 20 20 20 20 20  mns in the.     
b010: 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 75 73             ** us
b020: 69 6e 67 20 63 6c 61 75 73 65 20 66 72 6f 6d 20  ing clause from 
b030: 74 68 65 20 74 61 62 6c 65 20 6f 6e 20 74 68 65  the table on the
b040: 20 72 69 67 68 74 2e 20 2a 2f 0a 20 20 20 20 20   right. */.     
b050: 20 20 20 20 20 20 20 20 20 20 20 63 6f 6e 74 69             conti
b060: 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20  nue;.           
b070: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20     }.           
b080: 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 70   }.            p
b090: 52 69 67 68 74 20 3d 20 73 71 6c 69 74 65 33 50  Right = sqlite3P
b0a0: 45 78 70 72 28 70 50 61 72 73 65 2c 20 54 4b 5f  Expr(pParse, TK_
b0b0: 49 44 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20  ID, 0, 0, 0);.  
b0c0: 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70 52            if( pR
b0d0: 69 67 68 74 3d 3d 30 20 29 20 62 72 65 61 6b 3b  ight==0 ) break;
b0e0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 65 74  .            set
b0f0: 51 75 6f 74 65 64 54 6f 6b 65 6e 28 70 50 61 72  QuotedToken(pPar
b100: 73 65 2c 20 26 70 52 69 67 68 74 2d 3e 74 6f 6b  se, &pRight->tok
b110: 65 6e 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  en, zName);.    
b120: 20 20 20 20 20 20 20 20 69 66 28 20 7a 54 61 62          if( zTab
b130: 4e 61 6d 65 20 26 26 20 28 6c 6f 6e 67 4e 61 6d  Name && (longNam
b140: 65 73 20 7c 7c 20 70 54 61 62 4c 69 73 74 2d 3e  es || pTabList->
b150: 6e 53 72 63 3e 31 29 20 29 7b 0a 20 20 20 20 20  nSrc>1) ){.     
b160: 20 20 20 20 20 20 20 20 20 45 78 70 72 20 2a 70           Expr *p
b170: 4c 65 66 74 20 3d 20 73 71 6c 69 74 65 33 50 45  Left = sqlite3PE
b180: 78 70 72 28 70 50 61 72 73 65 2c 20 54 4b 5f 49  xpr(pParse, TK_I
b190: 44 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20  D, 0, 0, 0);.   
b1a0: 20 20 20 20 20 20 20 20 20 20 20 70 45 78 70 72             pExpr
b1b0: 20 3d 20 73 71 6c 69 74 65 33 50 45 78 70 72 28   = sqlite3PExpr(
b1c0: 70 50 61 72 73 65 2c 20 54 4b 5f 44 4f 54 2c 20  pParse, TK_DOT, 
b1d0: 70 4c 65 66 74 2c 20 70 52 69 67 68 74 2c 20 30  pLeft, pRight, 0
b1e0: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  );.             
b1f0: 20 69 66 28 20 70 45 78 70 72 3d 3d 30 20 29 20   if( pExpr==0 ) 
b200: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20  break;.         
b210: 20 20 20 20 20 73 65 74 51 75 6f 74 65 64 54 6f       setQuotedTo
b220: 6b 65 6e 28 70 50 61 72 73 65 2c 20 26 70 4c 65  ken(pParse, &pLe
b230: 66 74 2d 3e 74 6f 6b 65 6e 2c 20 7a 54 61 62 4e  ft->token, zTabN
b240: 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ame);.          
b250: 20 20 20 20 73 65 74 54 6f 6b 65 6e 28 26 70 45      setToken(&pE
b260: 78 70 72 2d 3e 73 70 61 6e 2c 20 0a 20 20 20 20  xpr->span, .    
b270: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71                sq
b280: 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 64 62 2c  lite3MPrintf(db,
b290: 20 22 25 73 2e 25 73 22 2c 20 7a 54 61 62 4e 61   "%s.%s", zTabNa
b2a0: 6d 65 2c 20 7a 4e 61 6d 65 29 29 3b 0a 20 20 20  me, zName));.   
b2b0: 20 20 20 20 20 20 20 20 20 20 20 70 45 78 70 72             pExpr
b2c0: 2d 3e 73 70 61 6e 2e 64 79 6e 20 3d 20 31 3b 0a  ->span.dyn = 1;.
b2d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 45                pE
b2e0: 78 70 72 2d 3e 74 6f 6b 65 6e 2e 7a 20 3d 20 30  xpr->token.z = 0
b2f0: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
b300: 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 6e 20 3d  pExpr->token.n =
b310: 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20   0;.            
b320: 20 20 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 64    pExpr->token.d
b330: 79 6e 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  yn = 0;.        
b340: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
b350: 20 20 20 20 20 20 20 20 20 70 45 78 70 72 20 3d           pExpr =
b360: 20 70 52 69 67 68 74 3b 0a 20 20 20 20 20 20 20   pRight;.       
b370: 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 73 70         pExpr->sp
b380: 61 6e 20 3d 20 70 45 78 70 72 2d 3e 74 6f 6b 65  an = pExpr->toke
b390: 6e 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  n;.             
b3a0: 20 70 45 78 70 72 2d 3e 73 70 61 6e 2e 64 79 6e   pExpr->span.dyn
b3b0: 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20   = 0;.          
b3c0: 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20    }.            
b3d0: 69 66 28 20 6c 6f 6e 67 4e 61 6d 65 73 20 29 7b  if( longNames ){
b3e0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70  .              p
b3f0: 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 45 78 70  New = sqlite3Exp
b400: 72 4c 69 73 74 41 70 70 65 6e 64 28 70 50 61 72  rListAppend(pPar
b410: 73 65 2c 20 70 4e 65 77 2c 20 70 45 78 70 72 2c  se, pNew, pExpr,
b420: 20 26 70 45 78 70 72 2d 3e 73 70 61 6e 29 3b 0a   &pExpr->span);.
b430: 20 20 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73              }els
b440: 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  e{.             
b450: 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 45   pNew = sqlite3E
b460: 78 70 72 4c 69 73 74 41 70 70 65 6e 64 28 70 50  xprListAppend(pP
b470: 61 72 73 65 2c 20 70 4e 65 77 2c 20 70 45 78 70  arse, pNew, pExp
b480: 72 2c 20 26 70 52 69 67 68 74 2d 3e 74 6f 6b 65  r, &pRight->toke
b490: 6e 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  n);.            
b4a0: 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  }.          }.  
b4b0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
b4c0: 69 66 28 20 21 74 61 62 6c 65 53 65 65 6e 20 29  if( !tableSeen )
b4d0: 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  {.          if( 
b4e0: 7a 54 4e 61 6d 65 20 29 7b 0a 20 20 20 20 20 20  zTName ){.      
b4f0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72        sqlite3Err
b500: 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 6e  orMsg(pParse, "n
b510: 6f 20 73 75 63 68 20 74 61 62 6c 65 3a 20 25 73  o such table: %s
b520: 22 2c 20 7a 54 4e 61 6d 65 29 3b 0a 20 20 20 20  ", zTName);.    
b530: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
b540: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
b550: 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
b560: 20 22 6e 6f 20 74 61 62 6c 65 73 20 73 70 65 63   "no tables spec
b570: 69 66 69 65 64 22 29 3b 0a 20 20 20 20 20 20 20  ified");.       
b580: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 72     }.          r
b590: 63 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 7d  c = 1;.        }
b5a0: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
b5b0: 5f 66 72 65 65 28 7a 54 4e 61 6d 65 29 3b 0a 20  _free(zTName);. 
b5c0: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
b5d0: 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
b5e0: 44 65 6c 65 74 65 28 70 45 4c 69 73 74 29 3b 0a  Delete(pEList);.
b5f0: 20 20 20 20 70 2d 3e 70 45 4c 69 73 74 20 3d 20      p->pEList = 
b600: 70 4e 65 77 3b 0a 20 20 7d 0a 20 20 69 66 28 20  pNew;.  }.  if( 
b610: 70 2d 3e 70 45 4c 69 73 74 20 26 26 20 70 2d 3e  p->pEList && p->
b620: 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3e 53 51  pEList->nExpr>SQ
b630: 4c 49 54 45 5f 4d 41 58 5f 43 4f 4c 55 4d 4e 20  LITE_MAX_COLUMN 
b640: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72  ){.    sqlite3Er
b650: 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
b660: 74 6f 6f 20 6d 61 6e 79 20 63 6f 6c 75 6d 6e 73  too many columns
b670: 20 69 6e 20 72 65 73 75 6c 74 20 73 65 74 22 29   in result set")
b680: 3b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54  ;.    rc = SQLIT
b690: 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69  E_ERROR;.  }.  i
b6a0: 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  f( db->mallocFai
b6b0: 6c 65 64 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  led ){.    rc = 
b6c0: 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
b6d0: 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
b6e0: 0a 0a 2f 2a 0a 2a 2a 20 44 75 72 69 6e 67 20 74  ../*.** During t
b6f0: 68 65 20 70 72 6f 63 65 73 73 20 6f 66 20 6d 61  he process of ma
b700: 74 63 68 69 6e 67 20 4f 52 44 45 52 20 42 59 20  tching ORDER BY 
b710: 74 65 72 6d 73 20 74 6f 20 63 6f 6c 75 6d 6e 73  terms to columns
b720: 20 6f 66 20 74 68 65 20 0a 2a 2a 20 72 65 73 75   of the .** resu
b730: 6c 74 20 73 65 74 2c 20 74 68 65 20 45 78 70 72  lt set, the Expr
b740: 6c 69 73 74 2e 61 5b 5d 2e 64 6f 6e 65 20 66 6c  list.a[].done fl
b750: 61 67 20 63 61 6e 20 62 65 20 73 65 74 20 74 6f  ag can be set to
b760: 20 6f 6e 65 20 6f 66 20 74 68 65 0a 2a 2a 20 66   one of the.** f
b770: 6f 6c 6c 6f 77 69 6e 67 20 76 61 6c 75 65 73 3a  ollowing values:
b780: 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 4f 52 44 45  .*/.#define ORDE
b790: 52 42 59 5f 4d 41 54 43 48 5f 4e 4f 4e 45 20 20  RBY_MATCH_NONE  
b7a0: 20 20 20 30 20 20 20 2f 2a 20 4e 6f 20 6d 61 74     0   /* No mat
b7b0: 63 68 20 66 6f 75 6e 64 20 2a 2f 0a 23 64 65 66  ch found */.#def
b7c0: 69 6e 65 20 4f 52 44 45 52 42 59 5f 4d 41 54 43  ine ORDERBY_MATC
b7d0: 48 5f 50 41 52 54 49 41 4c 20 20 31 20 20 20 2f  H_PARTIAL  1   /
b7e0: 2a 20 41 20 67 6f 6f 64 20 6d 61 74 63 68 2c 20  * A good match, 
b7f0: 62 75 74 20 6e 6f 74 20 70 65 72 66 65 63 74 20  but not perfect 
b800: 2a 2f 0a 23 64 65 66 69 6e 65 20 4f 52 44 45 52  */.#define ORDER
b810: 42 59 5f 4d 41 54 43 48 5f 45 58 41 43 54 20 20  BY_MATCH_EXACT  
b820: 20 20 32 20 20 20 2f 2a 20 41 6e 20 65 78 61 63    2   /* An exac
b830: 74 20 6d 61 74 63 68 20 73 65 65 6e 20 2a 2f 0a  t match seen */.
b840: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
b850: 4f 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45  OMIT_COMPOUND_SE
b860: 4c 45 43 54 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  LECT./*.** This 
b870: 72 6f 75 74 69 6e 65 20 61 73 73 6f 63 69 61 74  routine associat
b880: 65 73 20 65 6e 74 72 69 65 73 20 69 6e 20 61 6e  es entries in an
b890: 20 4f 52 44 45 52 20 42 59 20 65 78 70 72 65 73   ORDER BY expres
b8a0: 73 69 6f 6e 20 6c 69 73 74 20 77 69 74 68 0a 2a  sion list with.*
b8b0: 2a 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 61 20 72  * columns in a r
b8c0: 65 73 75 6c 74 2e 20 20 46 6f 72 20 65 61 63 68  esult.  For each
b8d0: 20 4f 52 44 45 52 20 42 59 20 65 78 70 72 65 73   ORDER BY expres
b8e0: 73 69 6f 6e 2c 20 74 68 65 20 6f 70 63 6f 64 65  sion, the opcode
b8f0: 20 6f 66 0a 2a 2a 20 74 68 65 20 74 6f 70 2d 6c   of.** the top-l
b900: 65 76 65 6c 20 6e 6f 64 65 20 69 73 20 63 68 61  evel node is cha
b910: 6e 67 65 64 20 74 6f 20 54 4b 5f 43 4f 4c 55 4d  nged to TK_COLUM
b920: 4e 20 61 6e 64 20 74 68 65 20 69 43 6f 6c 75 6d  N and the iColum
b930: 6e 20 76 61 6c 75 65 20 6f 66 0a 2a 2a 20 74 68  n value of.** th
b940: 65 20 74 6f 70 2d 6c 65 76 65 6c 20 6e 6f 64 65  e top-level node
b950: 20 69 73 20 66 69 6c 6c 65 64 20 69 6e 20 77 69   is filled in wi
b960: 74 68 20 63 6f 6c 75 6d 6e 20 6e 75 6d 62 65 72  th column number
b970: 20 61 6e 64 20 74 68 65 20 69 54 61 62 6c 65 0a   and the iTable.
b980: 2a 2a 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20  ** value of the 
b990: 74 6f 70 2d 6c 65 76 65 6c 20 6e 6f 64 65 20 69  top-level node i
b9a0: 73 20 66 69 6c 6c 65 64 20 77 69 74 68 20 69 54  s filled with iT
b9b0: 61 62 6c 65 20 70 61 72 61 6d 65 74 65 72 2e 0a  able parameter..
b9c0: 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 72 65 20 61  **.** If there a
b9d0: 72 65 20 70 72 69 6f 72 20 53 45 4c 45 43 54 20  re prior SELECT 
b9e0: 63 6c 61 75 73 65 73 2c 20 74 68 65 79 20 61 72  clauses, they ar
b9f0: 65 20 70 72 6f 63 65 73 73 65 64 20 66 69 72 73  e processed firs
ba00: 74 2e 20 20 41 20 6d 61 74 63 68 0a 2a 2a 20 69  t.  A match.** i
ba10: 6e 20 61 6e 20 65 61 72 6c 69 65 72 20 53 45 4c  n an earlier SEL
ba20: 45 43 54 20 74 61 6b 65 73 20 70 72 65 63 65 64  ECT takes preced
ba30: 65 6e 63 65 20 6f 76 65 72 20 61 20 6c 61 74 65  ence over a late
ba40: 72 20 53 45 4c 45 43 54 2e 0a 2a 2a 0a 2a 2a 20  r SELECT..**.** 
ba50: 41 6e 79 20 65 6e 74 72 79 20 74 68 61 74 20 64  Any entry that d
ba60: 6f 65 73 20 6e 6f 74 20 6d 61 74 63 68 20 69 73  oes not match is
ba70: 20 66 6c 61 67 67 65 64 20 61 73 20 61 6e 20 65   flagged as an e
ba80: 72 72 6f 72 2e 20 20 54 68 65 20 6e 75 6d 62 65  rror.  The numbe
ba90: 72 0a 2a 2a 20 6f 66 20 65 72 72 6f 72 73 20 69  r.** of errors i
baa0: 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73  s returned..*/.s
bab0: 74 61 74 69 63 20 69 6e 74 20 6d 61 74 63 68 4f  tatic int matchO
bac0: 72 64 65 72 62 79 54 6f 43 6f 6c 75 6d 6e 28 0a  rderbyToColumn(.
bad0: 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
bae0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 20 70            /* A p
baf0: 6c 61 63 65 20 74 6f 20 6c 65 61 76 65 20 65 72  lace to leave er
bb00: 72 6f 72 20 6d 65 73 73 61 67 65 73 20 2a 2f 0a  ror messages */.
bb10: 20 20 53 65 6c 65 63 74 20 2a 70 53 65 6c 65 63    Select *pSelec
bb20: 74 2c 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 74  t,        /* Mat
bb30: 63 68 20 74 6f 20 72 65 73 75 6c 74 20 63 6f 6c  ch to result col
bb40: 75 6d 6e 73 20 6f 66 20 74 68 69 73 20 53 45 4c  umns of this SEL
bb50: 45 43 54 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73  ECT */.  ExprLis
bb60: 74 20 2a 70 4f 72 64 65 72 42 79 2c 20 20 20 20  t *pOrderBy,    
bb70: 20 2f 2a 20 54 68 65 20 4f 52 44 45 52 20 42 59   /* The ORDER BY
bb80: 20 76 61 6c 75 65 73 20 74 6f 20 6d 61 74 63 68   values to match
bb90: 20 61 67 61 69 6e 73 74 20 63 6f 6c 75 6d 6e 73   against columns
bba0: 20 2a 2f 0a 20 20 69 6e 74 20 69 54 61 62 6c 65   */.  int iTable
bbb0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ,             /*
bbc0: 20 49 6e 73 65 72 74 20 74 68 69 73 20 76 61 6c   Insert this val
bbd0: 75 65 20 69 6e 20 69 54 61 62 6c 65 20 2a 2f 0a  ue in iTable */.
bbe0: 20 20 69 6e 74 20 72 69 67 68 74 4d 6f 73 74 20    int rightMost 
bbf0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 52 55            /* TRU
bc00: 45 20 66 6f 72 20 6f 75 74 65 72 6d 6f 73 74 20  E for outermost 
bc10: 72 65 63 75 72 73 69 76 65 20 69 6e 76 6f 63 61  recursive invoca
bc20: 74 69 6f 6e 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  tion */.){.  int
bc30: 20 6e 45 72 72 20 3d 20 30 3b 0a 20 20 69 6e 74   nErr = 0;.  int
bc40: 20 69 2c 20 6a 3b 0a 20 20 45 78 70 72 4c 69 73   i, j;.  ExprLis
bc50: 74 20 2a 70 45 4c 69 73 74 3b 0a 20 20 73 71 6c  t *pEList;.  sql
bc60: 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73  ite3 *db = pPars
bc70: 65 2d 3e 64 62 3b 0a 20 20 4e 61 6d 65 43 6f 6e  e->db;.  NameCon
bc80: 74 65 78 74 20 6e 63 3b 0a 0a 20 20 69 66 28 20  text nc;..  if( 
bc90: 70 53 65 6c 65 63 74 3d 3d 30 20 7c 7c 20 70 4f  pSelect==0 || pO
bca0: 72 64 65 72 42 79 3d 3d 30 20 29 20 72 65 74 75  rderBy==0 ) retu
bcb0: 72 6e 20 31 3b 0a 20 20 69 66 28 20 72 69 67 68  rn 1;.  if( righ
bcc0: 74 4d 6f 73 74 20 29 7b 0a 20 20 20 20 61 73 73  tMost ){.    ass
bcd0: 65 72 74 28 20 70 53 65 6c 65 63 74 2d 3e 70 4f  ert( pSelect->pO
bce0: 72 64 65 72 42 79 3d 3d 70 4f 72 64 65 72 42 79  rderBy==pOrderBy
bcf0: 20 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b   );.    for(i=0;
bd00: 20 69 3c 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78   i<pOrderBy->nEx
bd10: 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  pr; i++){.      
bd20: 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 64  pOrderBy->a[i].d
bd30: 6f 6e 65 20 3d 20 4f 52 44 45 52 42 59 5f 4d 41  one = ORDERBY_MA
bd40: 54 43 48 5f 4e 4f 4e 45 3b 0a 20 20 20 20 7d 0a  TCH_NONE;.    }.
bd50: 20 20 7d 0a 20 20 69 66 28 20 70 53 65 6c 65 63    }.  if( pSelec
bd60: 74 2d 3e 70 50 72 69 6f 72 0a 20 20 20 20 20 20  t->pPrior.      
bd70: 26 26 20 6d 61 74 63 68 4f 72 64 65 72 62 79 54  && matchOrderbyT
bd80: 6f 43 6f 6c 75 6d 6e 28 70 50 61 72 73 65 2c 20  oColumn(pParse, 
bd90: 70 53 65 6c 65 63 74 2d 3e 70 50 72 69 6f 72 2c  pSelect->pPrior,
bda0: 20 70 4f 72 64 65 72 42 79 2c 20 69 54 61 62 6c   pOrderBy, iTabl
bdb0: 65 2c 20 30 29 20 29 7b 0a 20 20 20 20 72 65 74  e, 0) ){.    ret
bdc0: 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 69 66 28  urn 1;.  }.  if(
bdd0: 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 52 65   sqlite3SelectRe
bde0: 73 6f 6c 76 65 28 70 50 61 72 73 65 2c 20 70 53  solve(pParse, pS
bdf0: 65 6c 65 63 74 2c 20 30 29 20 29 7b 0a 20 20 20  elect, 0) ){.   
be00: 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20   return 1;.  }. 
be10: 20 6d 65 6d 73 65 74 28 26 6e 63 2c 20 30 2c 20   memset(&nc, 0, 
be20: 73 69 7a 65 6f 66 28 6e 63 29 29 3b 0a 20 20 6e  sizeof(nc));.  n
be30: 63 2e 70 50 61 72 73 65 20 3d 20 70 50 61 72 73  c.pParse = pPars
be40: 65 3b 0a 20 20 6e 63 2e 70 53 72 63 4c 69 73 74  e;.  nc.pSrcList
be50: 20 3d 20 70 53 65 6c 65 63 74 2d 3e 70 53 72 63   = pSelect->pSrc
be60: 3b 0a 20 20 6e 63 2e 70 45 4c 69 73 74 20 3d 20  ;.  nc.pEList = 
be70: 70 45 4c 69 73 74 20 3d 20 70 53 65 6c 65 63 74  pEList = pSelect
be80: 2d 3e 70 45 4c 69 73 74 3b 0a 20 20 6e 63 2e 61  ->pEList;.  nc.a
be90: 6c 6c 6f 77 41 67 67 20 3d 20 31 3b 0a 20 20 66  llowAgg = 1;.  f
bea0: 6f 72 28 69 3d 30 3b 20 6e 45 72 72 3d 3d 30 20  or(i=0; nErr==0 
beb0: 26 26 20 69 3c 70 4f 72 64 65 72 42 79 2d 3e 6e  && i<pOrderBy->n
bec0: 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  Expr; i++){.    
bed0: 73 74 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f  struct ExprList_
bee0: 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 20  item *pItem;.   
bef0: 20 45 78 70 72 20 2a 70 45 20 3d 20 70 4f 72 64   Expr *pE = pOrd
bf00: 65 72 42 79 2d 3e 61 5b 69 5d 2e 70 45 78 70 72  erBy->a[i].pExpr
bf10: 3b 0a 20 20 20 20 69 6e 74 20 69 43 6f 6c 20 3d  ;.    int iCol =
bf20: 20 2d 31 3b 0a 20 20 20 20 69 6e 74 20 6d 61 74   -1;.    int mat
bf30: 63 68 20 3d 20 4f 52 44 45 52 42 59 5f 4d 41 54  ch = ORDERBY_MAT
bf40: 43 48 5f 4e 4f 4e 45 3b 0a 20 20 20 20 45 78 70  CH_NONE;.    Exp
bf50: 72 20 2a 70 44 75 70 3b 0a 0a 20 20 20 20 69 66  r *pDup;..    if
bf60: 28 20 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d  ( pOrderBy->a[i]
bf70: 2e 64 6f 6e 65 3d 3d 4f 52 44 45 52 42 59 5f 4d  .done==ORDERBY_M
bf80: 41 54 43 48 5f 45 58 41 43 54 20 29 7b 0a 20 20  ATCH_EXACT ){.  
bf90: 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20      continue;.  
bfa0: 20 20 7d 0a 20 20 20 20 69 66 28 20 73 71 6c 69    }.    if( sqli
bfb0: 74 65 33 45 78 70 72 49 73 49 6e 74 65 67 65 72  te3ExprIsInteger
bfc0: 28 70 45 2c 20 26 69 43 6f 6c 29 20 29 7b 0a 20  (pE, &iCol) ){. 
bfd0: 20 20 20 20 20 69 66 28 20 69 43 6f 6c 3c 3d 30       if( iCol<=0
bfe0: 20 7c 7c 20 69 43 6f 6c 3e 70 45 4c 69 73 74 2d   || iCol>pEList-
bff0: 3e 6e 45 78 70 72 20 29 7b 0a 20 20 20 20 20 20  >nExpr ){.      
c000: 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
c010: 67 28 70 50 61 72 73 65 2c 0a 20 20 20 20 20 20  g(pParse,.      
c020: 20 20 20 20 22 4f 52 44 45 52 20 42 59 20 70 6f      "ORDER BY po
c030: 73 69 74 69 6f 6e 20 25 64 20 73 68 6f 75 6c 64  sition %d should
c040: 20 62 65 20 62 65 74 77 65 65 6e 20 31 20 61 6e   be between 1 an
c050: 64 20 25 64 22 2c 0a 20 20 20 20 20 20 20 20 20  d %d",.         
c060: 20 69 43 6f 6c 2c 20 70 45 4c 69 73 74 2d 3e 6e   iCol, pEList->n
c070: 45 78 70 72 29 3b 0a 20 20 20 20 20 20 20 20 6e  Expr);.        n
c080: 45 72 72 2b 2b 3b 0a 20 20 20 20 20 20 20 20 62  Err++;.        b
c090: 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  reak;.      }.  
c0a0: 20 20 20 20 69 66 28 20 21 72 69 67 68 74 4d 6f      if( !rightMo
c0b0: 73 74 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  st ) continue;. 
c0c0: 20 20 20 20 20 69 43 6f 6c 2d 2d 3b 0a 20 20 20       iCol--;.   
c0d0: 20 20 20 6d 61 74 63 68 20 3d 20 4f 52 44 45 52     match = ORDER
c0e0: 42 59 5f 4d 41 54 43 48 5f 45 58 41 43 54 3b 0a  BY_MATCH_EXACT;.
c0f0: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 21 6d      }.    if( !m
c100: 61 74 63 68 20 26 26 20 70 50 61 72 73 65 2d 3e  atch && pParse->
c110: 6e 45 72 72 3d 3d 30 20 26 26 20 28 70 44 75 70  nErr==0 && (pDup
c120: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44 75   = sqlite3ExprDu
c130: 70 28 64 62 2c 20 70 45 29 29 21 3d 30 20 29 7b  p(db, pE))!=0 ){
c140: 0a 20 20 20 20 20 20 6e 63 2e 6e 45 72 72 20 3d  .      nc.nErr =
c150: 20 30 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   0;.      assert
c160: 28 20 70 50 61 72 73 65 2d 3e 7a 45 72 72 4d 73  ( pParse->zErrMs
c170: 67 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 69 66  g==0 );.      if
c180: 28 20 73 71 6c 69 74 65 33 45 78 70 72 52 65 73  ( sqlite3ExprRes
c190: 6f 6c 76 65 4e 61 6d 65 73 28 26 6e 63 2c 20 70  olveNames(&nc, p
c1a0: 44 75 70 29 20 29 7b 0a 20 20 20 20 20 20 20 20  Dup) ){.        
c1b0: 73 71 6c 69 74 65 33 45 72 72 6f 72 43 6c 65 61  sqlite3ErrorClea
c1c0: 72 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20  r(pParse);.     
c1d0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
c1e0: 66 6f 72 28 6a 3d 30 2c 20 70 49 74 65 6d 3d 70  for(j=0, pItem=p
c1f0: 45 4c 69 73 74 2d 3e 61 3b 20 6a 3c 70 45 4c 69  EList->a; j<pELi
c200: 73 74 2d 3e 6e 45 78 70 72 3b 20 6a 2b 2b 2c 20  st->nExpr; j++, 
c210: 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 20 20  pItem++){.      
c220: 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 45      if( sqlite3E
c230: 78 70 72 43 6f 6d 70 61 72 65 28 70 49 74 65 6d  xprCompare(pItem
c240: 2d 3e 70 45 78 70 72 2c 20 70 44 75 70 29 20 29  ->pExpr, pDup) )
c250: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 43  {.            iC
c260: 6f 6c 20 3d 20 6a 3b 0a 20 20 20 20 20 20 20 20  ol = j;.        
c270: 20 20 20 20 6d 61 74 63 68 20 3d 20 4f 52 44 45      match = ORDE
c280: 52 42 59 5f 4d 41 54 43 48 5f 50 41 52 54 49 41  RBY_MATCH_PARTIA
c290: 4c 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 62  L;.            b
c2a0: 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20  reak;.          
c2b0: 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  }.        }.    
c2c0: 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65    }.      sqlite
c2d0: 33 45 78 70 72 44 65 6c 65 74 65 28 70 44 75 70  3ExprDelete(pDup
c2e0: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  );.    }.    if(
c2f0: 20 6d 61 74 63 68 20 29 7b 0a 20 20 20 20 20 20   match ){.      
c300: 70 45 2d 3e 6f 70 20 3d 20 54 4b 5f 43 4f 4c 55  pE->op = TK_COLU
c310: 4d 4e 3b 0a 20 20 20 20 20 20 70 45 2d 3e 69 54  MN;.      pE->iT
c320: 61 62 6c 65 20 3d 20 69 54 61 62 6c 65 3b 0a 20  able = iTable;. 
c330: 20 20 20 20 20 70 45 2d 3e 69 41 67 67 20 3d 20       pE->iAgg = 
c340: 2d 31 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4f  -1;.      if( pO
c350: 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 64 6f 6e  rderBy->a[i].don
c360: 65 21 3d 4f 52 44 45 52 42 59 5f 4d 41 54 43 48  e!=ORDERBY_MATCH
c370: 5f 4e 4f 4e 45 20 26 26 20 70 45 2d 3e 69 43 6f  _NONE && pE->iCo
c380: 6c 75 6d 6e 21 3d 69 43 6f 6c 20 29 7b 0a 20 20  lumn!=iCol ){.  
c390: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72        sqlite3Err
c3a0: 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 0a 20 20  orMsg(pParse,.  
c3b0: 20 20 20 20 20 20 20 20 22 4f 52 44 45 52 20 42          "ORDER B
c3c0: 59 20 74 65 72 6d 20 6e 75 6d 62 65 72 20 25 64  Y term number %d
c3d0: 20 69 73 20 61 6d 62 69 67 75 6f 75 73 22 2c 20   is ambiguous", 
c3e0: 69 2b 31 29 3b 0a 20 20 20 20 20 20 20 20 6e 45  i+1);.        nE
c3f0: 72 72 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  rr++;.      }.  
c400: 20 20 20 20 70 45 2d 3e 69 43 6f 6c 75 6d 6e 20      pE->iColumn 
c410: 3d 20 69 43 6f 6c 3b 0a 20 20 20 20 20 20 70 4f  = iCol;.      pO
c420: 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 64 6f 6e  rderBy->a[i].don
c430: 65 20 3d 20 6d 61 74 63 68 3b 0a 20 20 20 20 7d  e = match;.    }
c440: 65 6c 73 65 20 69 66 28 20 72 69 67 68 74 4d 6f  else if( rightMo
c450: 73 74 20 26 26 20 70 4f 72 64 65 72 42 79 2d 3e  st && pOrderBy->
c460: 61 5b 69 5d 2e 64 6f 6e 65 3d 3d 4f 52 44 45 52  a[i].done==ORDER
c470: 42 59 5f 4d 41 54 43 48 5f 4e 4f 4e 45 20 29 7b  BY_MATCH_NONE ){
c480: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72  .      sqlite3Er
c490: 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 0a 20  rorMsg(pParse,. 
c4a0: 20 20 20 20 20 20 20 22 4f 52 44 45 52 20 42 59         "ORDER BY
c4b0: 20 74 65 72 6d 20 6e 75 6d 62 65 72 20 25 64 20   term number %d 
c4c0: 64 6f 65 73 20 6e 6f 74 20 6d 61 74 63 68 20 61  does not match a
c4d0: 6e 79 20 72 65 73 75 6c 74 20 63 6f 6c 75 6d 6e  ny result column
c4e0: 22 2c 20 69 2b 31 29 3b 0a 20 20 20 20 20 20 6e  ", i+1);.      n
c4f0: 45 72 72 2b 2b 3b 0a 20 20 20 20 20 20 62 72 65  Err++;.      bre
c500: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  ak;.    }.  }.  
c510: 72 65 74 75 72 6e 20 6e 45 72 72 3b 20 20 0a 7d  return nErr;  .}
c520: 0a 23 65 6e 64 69 66 20 2f 2a 20 23 69 66 6e 64  .#endif /* #ifnd
c530: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43  ef SQLITE_OMIT_C
c540: 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45 43 54 20 2a  OMPOUND_SELECT *
c550: 2f 0a 0a 2f 2a 0a 2a 2a 20 47 65 74 20 61 20 56  /../*.** Get a V
c560: 44 42 45 20 66 6f 72 20 74 68 65 20 67 69 76 65  DBE for the give
c570: 6e 20 70 61 72 73 65 72 20 63 6f 6e 74 65 78 74  n parser context
c580: 2e 20 20 43 72 65 61 74 65 20 61 20 6e 65 77 20  .  Create a new 
c590: 6f 6e 65 20 69 66 20 6e 65 63 65 73 73 61 72 79  one if necessary
c5a0: 2e 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72  ..** If an error
c5b0: 20 6f 63 63 75 72 73 2c 20 72 65 74 75 72 6e 20   occurs, return 
c5c0: 4e 55 4c 4c 20 61 6e 64 20 6c 65 61 76 65 20 61  NULL and leave a
c5d0: 20 6d 65 73 73 61 67 65 20 69 6e 20 70 50 61 72   message in pPar
c5e0: 73 65 2e 0a 2a 2f 0a 56 64 62 65 20 2a 73 71 6c  se..*/.Vdbe *sql
c5f0: 69 74 65 33 47 65 74 56 64 62 65 28 50 61 72 73  ite3GetVdbe(Pars
c600: 65 20 2a 70 50 61 72 73 65 29 7b 0a 20 20 56 64  e *pParse){.  Vd
c610: 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e  be *v = pParse->
c620: 70 56 64 62 65 3b 0a 20 20 69 66 28 20 76 3d 3d  pVdbe;.  if( v==
c630: 30 20 29 7b 0a 20 20 20 20 76 20 3d 20 70 50 61  0 ){.    v = pPa
c640: 72 73 65 2d 3e 70 56 64 62 65 20 3d 20 73 71 6c  rse->pVdbe = sql
c650: 69 74 65 33 56 64 62 65 43 72 65 61 74 65 28 70  ite3VdbeCreate(p
c660: 50 61 72 73 65 2d 3e 64 62 29 3b 0a 20 20 7d 0a  Parse->db);.  }.
c670: 20 20 72 65 74 75 72 6e 20 76 3b 0a 7d 0a 0a 0a    return v;.}...
c680: 2f 2a 0a 2a 2a 20 43 6f 6d 70 75 74 65 20 74 68  /*.** Compute th
c690: 65 20 69 4c 69 6d 69 74 20 61 6e 64 20 69 4f 66  e iLimit and iOf
c6a0: 66 73 65 74 20 66 69 65 6c 64 73 20 6f 66 20 74  fset fields of t
c6b0: 68 65 20 53 45 4c 45 43 54 20 62 61 73 65 64 20  he SELECT based 
c6c0: 6f 6e 20 74 68 65 0a 2a 2a 20 70 4c 69 6d 69 74  on the.** pLimit
c6d0: 20 61 6e 64 20 70 4f 66 66 73 65 74 20 65 78 70   and pOffset exp
c6e0: 72 65 73 73 69 6f 6e 73 2e 20 20 70 4c 69 6d 69  ressions.  pLimi
c6f0: 74 20 61 6e 64 20 70 4f 66 66 73 65 74 20 68 6f  t and pOffset ho
c700: 6c 64 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  ld the expressio
c710: 6e 73 0a 2a 2a 20 74 68 61 74 20 61 70 70 65 61  ns.** that appea
c720: 72 20 69 6e 20 74 68 65 20 6f 72 69 67 69 6e 61  r in the origina
c730: 6c 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 20  l SQL statement 
c740: 61 66 74 65 72 20 74 68 65 20 4c 49 4d 49 54 20  after the LIMIT 
c750: 61 6e 64 20 4f 46 46 53 45 54 0a 2a 2a 20 6b 65  and OFFSET.** ke
c760: 79 77 6f 72 64 73 2e 20 20 4f 72 20 4e 55 4c 4c  ywords.  Or NULL
c770: 20 69 66 20 74 68 6f 73 65 20 6b 65 79 77 6f 72   if those keywor
c780: 64 73 20 61 72 65 20 6f 6d 69 74 74 65 64 2e 20  ds are omitted. 
c790: 69 4c 69 6d 69 74 20 61 6e 64 20 69 4f 66 66 73  iLimit and iOffs
c7a0: 65 74 20 0a 2a 2a 20 61 72 65 20 74 68 65 20 69  et .** are the i
c7b0: 6e 74 65 67 65 72 20 6d 65 6d 6f 72 79 20 72 65  nteger memory re
c7c0: 67 69 73 74 65 72 20 6e 75 6d 62 65 72 73 20 66  gister numbers f
c7d0: 6f 72 20 63 6f 75 6e 74 65 72 73 20 75 73 65 64  or counters used
c7e0: 20 74 6f 20 63 6f 6d 70 75 74 65 20 0a 2a 2a 20   to compute .** 
c7f0: 74 68 65 20 6c 69 6d 69 74 20 61 6e 64 20 6f 66  the limit and of
c800: 66 73 65 74 2e 20 20 49 66 20 74 68 65 72 65 20  fset.  If there 
c810: 69 73 20 6e 6f 20 6c 69 6d 69 74 20 61 6e 64 2f  is no limit and/
c820: 6f 72 20 6f 66 66 73 65 74 2c 20 74 68 65 6e 20  or offset, then 
c830: 0a 2a 2a 20 69 4c 69 6d 69 74 20 61 6e 64 20 69  .** iLimit and i
c840: 4f 66 66 73 65 74 20 61 72 65 20 6e 65 67 61 74  Offset are negat
c850: 69 76 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ive..**.** This 
c860: 72 6f 75 74 69 6e 65 20 63 68 61 6e 67 65 73 20  routine changes 
c870: 74 68 65 20 76 61 6c 75 65 73 20 6f 66 20 69 4c  the values of iL
c880: 69 6d 69 74 20 61 6e 64 20 69 4f 66 66 73 65 74  imit and iOffset
c890: 20 6f 6e 6c 79 20 69 66 0a 2a 2a 20 61 20 6c 69   only if.** a li
c8a0: 6d 69 74 20 6f 72 20 6f 66 66 73 65 74 20 69 73  mit or offset is
c8b0: 20 64 65 66 69 6e 65 64 20 62 79 20 70 4c 69 6d   defined by pLim
c8c0: 69 74 20 61 6e 64 20 70 4f 66 66 73 65 74 2e 20  it and pOffset. 
c8d0: 20 69 4c 69 6d 69 74 20 61 6e 64 0a 2a 2a 20 69   iLimit and.** i
c8e0: 4f 66 66 73 65 74 20 73 68 6f 75 6c 64 20 68 61  Offset should ha
c8f0: 76 65 20 62 65 65 6e 20 70 72 65 73 65 74 20 74  ve been preset t
c900: 6f 20 61 70 70 72 6f 70 72 69 61 74 65 20 64 65  o appropriate de
c910: 66 61 75 6c 74 20 76 61 6c 75 65 73 0a 2a 2a 20  fault values.** 
c920: 28 75 73 75 61 6c 6c 79 20 62 75 74 20 6e 6f 74  (usually but not
c930: 20 61 6c 77 61 79 73 20 2d 31 29 20 70 72 69 6f   always -1) prio
c940: 72 20 74 6f 20 63 61 6c 6c 69 6e 67 20 74 68 69  r to calling thi
c950: 73 20 72 6f 75 74 69 6e 65 2e 0a 2a 2a 20 4f 6e  s routine..** On
c960: 6c 79 20 69 66 20 70 4c 69 6d 69 74 21 3d 30 20  ly if pLimit!=0 
c970: 6f 72 20 70 4f 66 66 73 65 74 21 3d 30 20 64 6f  or pOffset!=0 do
c980: 20 74 68 65 20 6c 69 6d 69 74 20 72 65 67 69 73   the limit regis
c990: 74 65 72 73 20 67 65 74 0a 2a 2a 20 72 65 64 65  ters get.** rede
c9a0: 66 69 6e 65 64 2e 20 20 54 68 65 20 55 4e 49 4f  fined.  The UNIO
c9b0: 4e 20 41 4c 4c 20 6f 70 65 72 61 74 6f 72 20 75  N ALL operator u
c9c0: 73 65 73 20 74 68 69 73 20 70 72 6f 70 65 72 74  ses this propert
c9d0: 79 20 74 6f 20 66 6f 72 63 65 0a 2a 2a 20 74 68  y to force.** th
c9e0: 65 20 72 65 75 73 65 20 6f 66 20 74 68 65 20 73  e reuse of the s
c9f0: 61 6d 65 20 6c 69 6d 69 74 20 61 6e 64 20 6f 66  ame limit and of
ca00: 66 73 65 74 20 72 65 67 69 73 74 65 72 73 20 61  fset registers a
ca10: 63 72 6f 73 73 20 6d 75 6c 74 69 70 6c 65 0a 2a  cross multiple.*
ca20: 2a 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  * SELECT stateme
ca30: 6e 74 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  nts..*/.static v
ca40: 6f 69 64 20 63 6f 6d 70 75 74 65 4c 69 6d 69 74  oid computeLimit
ca50: 52 65 67 69 73 74 65 72 73 28 50 61 72 73 65 20  Registers(Parse 
ca60: 2a 70 50 61 72 73 65 2c 20 53 65 6c 65 63 74 20  *pParse, Select 
ca70: 2a 70 2c 20 69 6e 74 20 69 42 72 65 61 6b 29 7b  *p, int iBreak){
ca80: 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 30 3b 0a  .  Vdbe *v = 0;.
ca90: 20 20 69 6e 74 20 69 4c 69 6d 69 74 20 3d 20 30    int iLimit = 0
caa0: 3b 0a 20 20 69 6e 74 20 69 4f 66 66 73 65 74 3b  ;.  int iOffset;
cab0: 0a 20 20 69 6e 74 20 61 64 64 72 31 2c 20 61 64  .  int addr1, ad
cac0: 64 72 32 3b 0a 0a 20 20 2f 2a 20 0a 20 20 2a 2a  dr2;..  /* .  **
cad0: 20 22 4c 49 4d 49 54 20 2d 31 22 20 61 6c 77 61   "LIMIT -1" alwa
cae0: 79 73 20 73 68 6f 77 73 20 61 6c 6c 20 72 6f 77  ys shows all row
caf0: 73 2e 20 20 54 68 65 72 65 20 69 73 20 73 6f 6d  s.  There is som
cb00: 65 0a 20 20 2a 2a 20 63 6f 6e 74 72 61 76 65 72  e.  ** contraver
cb10: 73 79 20 61 62 6f 75 74 20 77 68 61 74 20 74 68  sy about what th
cb20: 65 20 63 6f 72 72 65 63 74 20 62 65 68 61 76 69  e correct behavi
cb30: 6f 72 20 73 68 6f 75 6c 64 20 62 65 2e 0a 20 20  or should be..  
cb40: 2a 2a 20 54 68 65 20 63 75 72 72 65 6e 74 20 69  ** The current i
cb50: 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 69 6e  mplementation in
cb60: 74 65 72 70 72 65 74 73 20 22 4c 49 4d 49 54 20  terprets "LIMIT 
cb70: 30 22 20 74 6f 20 6d 65 61 6e 0a 20 20 2a 2a 20  0" to mean.  ** 
cb80: 6e 6f 20 72 6f 77 73 2e 0a 20 20 2a 2f 0a 20 20  no rows..  */.  
cb90: 69 66 28 20 70 2d 3e 70 4c 69 6d 69 74 20 29 7b  if( p->pLimit ){
cba0: 0a 20 20 20 20 70 2d 3e 69 4c 69 6d 69 74 20 3d  .    p->iLimit =
cbb0: 20 69 4c 69 6d 69 74 20 3d 20 70 50 61 72 73 65   iLimit = pParse
cbc0: 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 70 50 61 72  ->nMem;.    pPar
cbd0: 73 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 32 3b 0a 20  se->nMem += 2;. 
cbe0: 20 20 20 76 20 3d 20 73 71 6c 69 74 65 33 47 65     v = sqlite3Ge
cbf0: 74 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20  tVdbe(pParse);. 
cc00: 20 20 20 69 66 28 20 76 3d 3d 30 20 29 20 72 65     if( v==0 ) re
cc10: 74 75 72 6e 3b 0a 20 20 20 20 73 71 6c 69 74 65  turn;.    sqlite
cc20: 33 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65  3ExprCode(pParse
cc30: 2c 20 70 2d 3e 70 4c 69 6d 69 74 29 3b 0a 20 20  , p->pLimit);.  
cc40: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
cc50: 4f 70 28 76 2c 20 4f 50 5f 4d 75 73 74 42 65 49  Op(v, OP_MustBeI
cc60: 6e 74 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 73  nt, 0, 0);.    s
cc70: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
cc80: 76 2c 20 4f 50 5f 4d 65 6d 53 74 6f 72 65 2c 20  v, OP_MemStore, 
cc90: 69 4c 69 6d 69 74 2c 20 31 29 3b 0a 20 20 20 20  iLimit, 1);.    
cca0: 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20  VdbeComment((v, 
ccb0: 22 23 20 4c 49 4d 49 54 20 63 6f 75 6e 74 65 72  "# LIMIT counter
ccc0: 22 29 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  "));.    sqlite3
ccd0: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
cce0: 49 66 4d 65 6d 5a 65 72 6f 2c 20 69 4c 69 6d 69  IfMemZero, iLimi
ccf0: 74 2c 20 69 42 72 65 61 6b 29 3b 0a 20 20 20 20  t, iBreak);.    
cd00: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
cd10: 28 76 2c 20 4f 50 5f 4d 65 6d 4c 6f 61 64 2c 20  (v, OP_MemLoad, 
cd20: 69 4c 69 6d 69 74 2c 20 30 29 3b 0a 20 20 7d 0a  iLimit, 0);.  }.
cd30: 20 20 69 66 28 20 70 2d 3e 70 4f 66 66 73 65 74    if( p->pOffset
cd40: 20 29 7b 0a 20 20 20 20 70 2d 3e 69 4f 66 66 73   ){.    p->iOffs
cd50: 65 74 20 3d 20 69 4f 66 66 73 65 74 20 3d 20 70  et = iOffset = p
cd60: 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b 2b 3b 0a 20  Parse->nMem++;. 
cd70: 20 20 20 76 20 3d 20 73 71 6c 69 74 65 33 47 65     v = sqlite3Ge
cd80: 74 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20  tVdbe(pParse);. 
cd90: 20 20 20 69 66 28 20 76 3d 3d 30 20 29 20 72 65     if( v==0 ) re
cda0: 74 75 72 6e 3b 0a 20 20 20 20 73 71 6c 69 74 65  turn;.    sqlite
cdb0: 33 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65  3ExprCode(pParse
cdc0: 2c 20 70 2d 3e 70 4f 66 66 73 65 74 29 3b 0a 20  , p->pOffset);. 
cdd0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
cde0: 64 4f 70 28 76 2c 20 4f 50 5f 4d 75 73 74 42 65  dOp(v, OP_MustBe
cdf0: 49 6e 74 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  Int, 0, 0);.    
ce00: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
ce10: 28 76 2c 20 4f 50 5f 4d 65 6d 53 74 6f 72 65 2c  (v, OP_MemStore,
ce20: 20 69 4f 66 66 73 65 74 2c 20 70 2d 3e 70 4c 69   iOffset, p->pLi
ce30: 6d 69 74 3d 3d 30 29 3b 0a 20 20 20 20 56 64 62  mit==0);.    Vdb
ce40: 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 23 20  eComment((v, "# 
ce50: 4f 46 46 53 45 54 20 63 6f 75 6e 74 65 72 22 29  OFFSET counter")
ce60: 29 3b 0a 20 20 20 20 61 64 64 72 31 20 3d 20 73  );.    addr1 = s
ce70: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
ce80: 76 2c 20 4f 50 5f 49 66 4d 65 6d 50 6f 73 2c 20  v, OP_IfMemPos, 
ce90: 69 4f 66 66 73 65 74 2c 20 30 29 3b 0a 20 20 20  iOffset, 0);.   
cea0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
ceb0: 70 28 76 2c 20 4f 50 5f 50 6f 70 2c 20 31 2c 20  p(v, OP_Pop, 1, 
cec0: 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  0);.    sqlite3V
ced0: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49  dbeAddOp(v, OP_I
cee0: 6e 74 65 67 65 72 2c 20 30 2c 20 30 29 3b 0a 20  nteger, 0, 0);. 
cef0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75     sqlite3VdbeJu
cf00: 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72 31 29  mpHere(v, addr1)
cf10: 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 70 4c 69  ;.    if( p->pLi
cf20: 6d 69 74 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  mit ){.      sql
cf30: 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
cf40: 20 4f 50 5f 41 64 64 2c 20 30 2c 20 30 29 3b 0a   OP_Add, 0, 0);.
cf50: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20      }.  }.  if( 
cf60: 70 2d 3e 70 4c 69 6d 69 74 20 29 7b 0a 20 20 20  p->pLimit ){.   
cf70: 20 61 64 64 72 31 20 3d 20 73 71 6c 69 74 65 33   addr1 = sqlite3
cf80: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
cf90: 49 66 4d 65 6d 50 6f 73 2c 20 69 4c 69 6d 69 74  IfMemPos, iLimit
cfa0: 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  , 0);.    sqlite
cfb0: 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
cfc0: 5f 50 6f 70 2c 20 31 2c 20 30 29 3b 0a 20 20 20  _Pop, 1, 0);.   
cfd0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
cfe0: 70 28 76 2c 20 4f 50 5f 4d 65 6d 49 6e 74 2c 20  p(v, OP_MemInt, 
cff0: 2d 31 2c 20 69 4c 69 6d 69 74 2b 31 29 3b 0a 20  -1, iLimit+1);. 
d000: 20 20 20 61 64 64 72 32 20 3d 20 73 71 6c 69 74     addr2 = sqlit
d010: 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
d020: 50 5f 47 6f 74 6f 2c 20 30 2c 20 30 29 3b 0a 20  P_Goto, 0, 0);. 
d030: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75     sqlite3VdbeJu
d040: 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72 31 29  mpHere(v, addr1)
d050: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
d060: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 65 6d  eAddOp(v, OP_Mem
d070: 53 74 6f 72 65 2c 20 69 4c 69 6d 69 74 2b 31 2c  Store, iLimit+1,
d080: 20 31 29 3b 0a 20 20 20 20 56 64 62 65 43 6f 6d   1);.    VdbeCom
d090: 6d 65 6e 74 28 28 76 2c 20 22 23 20 4c 49 4d 49  ment((v, "# LIMI
d0a0: 54 2b 4f 46 46 53 45 54 22 29 29 3b 0a 20 20 20  T+OFFSET"));.   
d0b0: 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70   sqlite3VdbeJump
d0c0: 48 65 72 65 28 76 2c 20 61 64 64 72 32 29 3b 0a  Here(v, addr2);.
d0d0: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c    }.}../*.** All
d0e0: 6f 63 61 74 65 20 61 20 76 69 72 74 75 61 6c 20  ocate a virtual 
d0f0: 69 6e 64 65 78 20 74 6f 20 75 73 65 20 66 6f 72  index to use for
d100: 20 73 6f 72 74 69 6e 67 2e 0a 2a 2f 0a 73 74 61   sorting..*/.sta
d110: 74 69 63 20 76 6f 69 64 20 63 72 65 61 74 65 53  tic void createS
d120: 6f 72 74 69 6e 67 49 6e 64 65 78 28 50 61 72 73  ortingIndex(Pars
d130: 65 20 2a 70 50 61 72 73 65 2c 20 53 65 6c 65 63  e *pParse, Selec
d140: 74 20 2a 70 2c 20 45 78 70 72 4c 69 73 74 20 2a  t *p, ExprList *
d150: 70 4f 72 64 65 72 42 79 29 7b 0a 20 20 69 66 28  pOrderBy){.  if(
d160: 20 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20   pOrderBy ){.   
d170: 20 69 6e 74 20 61 64 64 72 3b 0a 20 20 20 20 61   int addr;.    a
d180: 73 73 65 72 74 28 20 70 4f 72 64 65 72 42 79 2d  ssert( pOrderBy-
d190: 3e 69 45 43 75 72 73 6f 72 3d 3d 30 20 29 3b 0a  >iECursor==0 );.
d1a0: 20 20 20 20 70 4f 72 64 65 72 42 79 2d 3e 69 45      pOrderBy->iE
d1b0: 43 75 72 73 6f 72 20 3d 20 70 50 61 72 73 65 2d  Cursor = pParse-
d1c0: 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20 61 64 64  >nTab++;.    add
d1d0: 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41  r = sqlite3VdbeA
d1e0: 64 64 4f 70 28 70 50 61 72 73 65 2d 3e 70 56 64  ddOp(pParse->pVd
d1f0: 62 65 2c 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d  be, OP_OpenEphem
d200: 65 72 61 6c 2c 0a 20 20 20 20 20 20 20 20 20 20  eral,.          
d210: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d220: 20 20 70 4f 72 64 65 72 42 79 2d 3e 69 45 43 75    pOrderBy->iECu
d230: 72 73 6f 72 2c 20 70 4f 72 64 65 72 42 79 2d 3e  rsor, pOrderBy->
d240: 6e 45 78 70 72 2b 31 29 3b 0a 20 20 20 20 61 73  nExpr+1);.    as
d250: 73 65 72 74 28 20 70 2d 3e 61 64 64 72 4f 70 65  sert( p->addrOpe
d260: 6e 45 70 68 6d 5b 32 5d 20 3d 3d 20 2d 31 20 29  nEphm[2] == -1 )
d270: 3b 0a 20 20 20 20 70 2d 3e 61 64 64 72 4f 70 65  ;.    p->addrOpe
d280: 6e 45 70 68 6d 5b 32 5d 20 3d 20 61 64 64 72 3b  nEphm[2] = addr;
d290: 0a 20 20 7d 0a 7d 0a 0a 23 69 66 6e 64 65 66 20  .  }.}..#ifndef 
d2a0: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f 4d 50  SQLITE_OMIT_COMP
d2b0: 4f 55 4e 44 5f 53 45 4c 45 43 54 0a 2f 2a 0a 2a  OUND_SELECT./*.*
d2c0: 2a 20 52 65 74 75 72 6e 20 74 68 65 20 61 70 70  * Return the app
d2d0: 72 6f 70 72 69 61 74 65 20 63 6f 6c 6c 61 74 69  ropriate collati
d2e0: 6e 67 20 73 65 71 75 65 6e 63 65 20 66 6f 72 20  ng sequence for 
d2f0: 74 68 65 20 69 43 6f 6c 2d 74 68 20 63 6f 6c 75  the iCol-th colu
d300: 6d 6e 20 6f 66 0a 2a 2a 20 74 68 65 20 72 65 73  mn of.** the res
d310: 75 6c 74 20 73 65 74 20 66 6f 72 20 74 68 65 20  ult set for the 
d320: 63 6f 6d 70 6f 75 6e 64 2d 73 65 6c 65 63 74 20  compound-select 
d330: 73 74 61 74 65 6d 65 6e 74 20 22 70 22 2e 20 20  statement "p".  
d340: 52 65 74 75 72 6e 20 4e 55 4c 4c 20 69 66 0a 2a  Return NULL if.*
d350: 2a 20 74 68 65 20 63 6f 6c 75 6d 6e 20 68 61 73  * the column has
d360: 20 6e 6f 20 64 65 66 61 75 6c 74 20 63 6f 6c 6c   no default coll
d370: 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65 2e 0a  ating sequence..
d380: 2a 2a 0a 2a 2a 20 54 68 65 20 63 6f 6c 6c 61 74  **.** The collat
d390: 69 6e 67 20 73 65 71 75 65 6e 63 65 20 66 6f 72  ing sequence for
d3a0: 20 74 68 65 20 63 6f 6d 70 6f 75 6e 64 20 73 65   the compound se
d3b0: 6c 65 63 74 20 69 73 20 74 61 6b 65 6e 20 66 72  lect is taken fr
d3c0: 6f 6d 20 74 68 65 0a 2a 2a 20 6c 65 66 74 2d 6d  om the.** left-m
d3d0: 6f 73 74 20 74 65 72 6d 20 6f 66 20 74 68 65 20  ost term of the 
d3e0: 73 65 6c 65 63 74 20 74 68 61 74 20 68 61 73 20  select that has 
d3f0: 61 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75  a collating sequ
d400: 65 6e 63 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ence..*/.static 
d410: 43 6f 6c 6c 53 65 71 20 2a 6d 75 6c 74 69 53 65  CollSeq *multiSe
d420: 6c 65 63 74 43 6f 6c 6c 53 65 71 28 50 61 72 73  lectCollSeq(Pars
d430: 65 20 2a 70 50 61 72 73 65 2c 20 53 65 6c 65 63  e *pParse, Selec
d440: 74 20 2a 70 2c 20 69 6e 74 20 69 43 6f 6c 29 7b  t *p, int iCol){
d450: 0a 20 20 43 6f 6c 6c 53 65 71 20 2a 70 52 65 74  .  CollSeq *pRet
d460: 3b 0a 20 20 69 66 28 20 70 2d 3e 70 50 72 69 6f  ;.  if( p->pPrio
d470: 72 20 29 7b 0a 20 20 20 20 70 52 65 74 20 3d 20  r ){.    pRet = 
d480: 6d 75 6c 74 69 53 65 6c 65 63 74 43 6f 6c 6c 53  multiSelectCollS
d490: 65 71 28 70 50 61 72 73 65 2c 20 70 2d 3e 70 50  eq(pParse, p->pP
d4a0: 72 69 6f 72 2c 20 69 43 6f 6c 29 3b 0a 20 20 7d  rior, iCol);.  }
d4b0: 65 6c 73 65 7b 0a 20 20 20 20 70 52 65 74 20 3d  else{.    pRet =
d4c0: 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 52   0;.  }.  if( pR
d4d0: 65 74 3d 3d 30 20 29 7b 0a 20 20 20 20 70 52 65  et==0 ){.    pRe
d4e0: 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43  t = sqlite3ExprC
d4f0: 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70  ollSeq(pParse, p
d500: 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b 69 43 6f 6c  ->pEList->a[iCol
d510: 5d 2e 70 45 78 70 72 29 3b 0a 20 20 7d 0a 20 20  ].pExpr);.  }.  
d520: 72 65 74 75 72 6e 20 70 52 65 74 3b 0a 7d 0a 23  return pRet;.}.#
d530: 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
d540: 4f 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45  OMIT_COMPOUND_SE
d550: 4c 45 43 54 20 2a 2f 0a 0a 23 69 66 6e 64 65 66  LECT */..#ifndef
d560: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f 4d   SQLITE_OMIT_COM
d570: 50 4f 55 4e 44 5f 53 45 4c 45 43 54 0a 2f 2a 0a  POUND_SELECT./*.
d580: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
d590: 69 73 20 63 61 6c 6c 65 64 20 74 6f 20 70 72 6f  is called to pro
d5a0: 63 65 73 73 20 61 20 71 75 65 72 79 20 74 68 61  cess a query tha
d5b0: 74 20 69 73 20 72 65 61 6c 6c 79 20 74 68 65 20  t is really the 
d5c0: 75 6e 69 6f 6e 0a 2a 2a 20 6f 72 20 69 6e 74 65  union.** or inte
d5d0: 72 73 65 63 74 69 6f 6e 20 6f 66 20 74 77 6f 20  rsection of two 
d5e0: 6f 72 20 6d 6f 72 65 20 73 65 70 61 72 61 74 65  or more separate
d5f0: 20 71 75 65 72 69 65 73 2e 0a 2a 2a 0a 2a 2a 20   queries..**.** 
d600: 22 70 22 20 70 6f 69 6e 74 73 20 74 6f 20 74 68  "p" points to th
d610: 65 20 72 69 67 68 74 2d 6d 6f 73 74 20 6f 66 20  e right-most of 
d620: 74 68 65 20 74 77 6f 20 71 75 65 72 69 65 73 2e  the two queries.
d630: 20 20 74 68 65 20 71 75 65 72 79 20 6f 6e 20 74    the query on t
d640: 68 65 0a 2a 2a 20 6c 65 66 74 20 69 73 20 70 2d  he.** left is p-
d650: 3e 70 50 72 69 6f 72 2e 20 20 54 68 65 20 6c 65  >pPrior.  The le
d660: 66 74 20 71 75 65 72 79 20 63 6f 75 6c 64 20 61  ft query could a
d670: 6c 73 6f 20 62 65 20 61 20 63 6f 6d 70 6f 75 6e  lso be a compoun
d680: 64 20 71 75 65 72 79 0a 2a 2a 20 69 6e 20 77 68  d query.** in wh
d690: 69 63 68 20 63 61 73 65 20 74 68 69 73 20 72 6f  ich case this ro
d6a0: 75 74 69 6e 65 20 77 69 6c 6c 20 62 65 20 63 61  utine will be ca
d6b0: 6c 6c 65 64 20 72 65 63 75 72 73 69 76 65 6c 79  lled recursively
d6c0: 2e 20 0a 2a 2a 0a 2a 2a 20 54 68 65 20 72 65 73  . .**.** The res
d6d0: 75 6c 74 73 20 6f 66 20 74 68 65 20 74 6f 74 61  ults of the tota
d6e0: 6c 20 71 75 65 72 79 20 61 72 65 20 74 6f 20 62  l query are to b
d6f0: 65 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 61  e written into a
d700: 20 64 65 73 74 69 6e 61 74 69 6f 6e 0a 2a 2a 20   destination.** 
d710: 6f 66 20 74 79 70 65 20 65 44 65 73 74 20 77 69  of type eDest wi
d720: 74 68 20 70 61 72 61 6d 65 74 65 72 20 69 50 61  th parameter iPa
d730: 72 6d 2e 0a 2a 2a 0a 2a 2a 20 45 78 61 6d 70 6c  rm..**.** Exampl
d740: 65 20 31 3a 20 20 43 6f 6e 73 69 64 65 72 20 61  e 1:  Consider a
d750: 20 74 68 72 65 65 2d 77 61 79 20 63 6f 6d 70 6f   three-way compo
d760: 75 6e 64 20 53 51 4c 20 73 74 61 74 65 6d 65 6e  und SQL statemen
d770: 74 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 45 4c  t..**.**     SEL
d780: 45 43 54 20 61 20 46 52 4f 4d 20 74 31 20 55 4e  ECT a FROM t1 UN
d790: 49 4f 4e 20 53 45 4c 45 43 54 20 62 20 46 52 4f  ION SELECT b FRO
d7a0: 4d 20 74 32 20 55 4e 49 4f 4e 20 53 45 4c 45 43  M t2 UNION SELEC
d7b0: 54 20 63 20 46 52 4f 4d 20 74 33 0a 2a 2a 0a 2a  T c FROM t3.**.*
d7c0: 2a 20 54 68 69 73 20 73 74 61 74 65 6d 65 6e 74  * This statement
d7d0: 20 69 73 20 70 61 72 73 65 64 20 75 70 20 61 73   is parsed up as
d7e0: 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20   follows:.**.** 
d7f0: 20 20 20 20 53 45 4c 45 43 54 20 63 20 46 52 4f      SELECT c FRO
d800: 4d 20 74 33 0a 2a 2a 20 20 20 20 20 20 7c 0a 2a  M t3.**      |.*
d810: 2a 20 20 20 20 20 20 60 2d 2d 2d 2d 2d 3e 20 20  *      `----->  
d820: 53 45 4c 45 43 54 20 62 20 46 52 4f 4d 20 74 32  SELECT b FROM t2
d830: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
d840: 20 20 20 7c 0a 2a 2a 20 20 20 20 20 20 20 20 20     |.**         
d850: 20 20 20 20 20 20 20 60 2d 2d 2d 2d 2d 2d 3e 20         `------> 
d860: 20 53 45 4c 45 43 54 20 61 20 46 52 4f 4d 20 74   SELECT a FROM t
d870: 31 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 72 72 6f  1.**.** The arro
d880: 77 73 20 69 6e 20 74 68 65 20 64 69 61 67 72 61  ws in the diagra
d890: 6d 20 61 62 6f 76 65 20 72 65 70 72 65 73 65 6e  m above represen
d8a0: 74 20 74 68 65 20 53 65 6c 65 63 74 2e 70 50 72  t the Select.pPr
d8b0: 69 6f 72 20 70 6f 69 6e 74 65 72 2e 0a 2a 2a 20  ior pointer..** 
d8c0: 53 6f 20 69 66 20 74 68 69 73 20 72 6f 75 74 69  So if this routi
d8d0: 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 77 69 74  ne is called wit
d8e0: 68 20 70 20 65 71 75 61 6c 20 74 6f 20 74 68 65  h p equal to the
d8f0: 20 74 33 20 71 75 65 72 79 2c 20 74 68 65 6e 0a   t3 query, then.
d900: 2a 2a 20 70 50 72 69 6f 72 20 77 69 6c 6c 20 62  ** pPrior will b
d910: 65 20 74 68 65 20 74 32 20 71 75 65 72 79 2e 20  e the t2 query. 
d920: 20 70 2d 3e 6f 70 20 77 69 6c 6c 20 62 65 20 54   p->op will be T
d930: 4b 5f 55 4e 49 4f 4e 20 69 6e 20 74 68 69 73 20  K_UNION in this 
d940: 63 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 69  case..**.** Noti
d950: 63 65 20 74 68 61 74 20 62 65 63 61 75 73 65 20  ce that because 
d960: 6f 66 20 74 68 65 20 77 61 79 20 53 51 4c 69 74  of the way SQLit
d970: 65 20 70 61 72 73 65 73 20 63 6f 6d 70 6f 75 6e  e parses compoun
d980: 64 20 53 45 4c 45 43 54 73 2c 20 74 68 65 0a 2a  d SELECTs, the.*
d990: 2a 20 69 6e 64 69 76 69 64 75 61 6c 20 73 65 6c  * individual sel
d9a0: 65 63 74 73 20 61 6c 77 61 79 73 20 67 72 6f 75  ects always grou
d9b0: 70 20 66 72 6f 6d 20 6c 65 66 74 20 74 6f 20 72  p from left to r
d9c0: 69 67 68 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ight..*/.static 
d9d0: 69 6e 74 20 6d 75 6c 74 69 53 65 6c 65 63 74 28  int multiSelect(
d9e0: 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
d9f0: 2c 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73  ,        /* Pars
da00: 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  ing context */. 
da10: 20 53 65 6c 65 63 74 20 2a 70 2c 20 20 20 20 20   Select *p,     
da20: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 72 69         /* The ri
da30: 67 68 74 2d 6d 6f 73 74 20 6f 66 20 53 45 4c 45  ght-most of SELE
da40: 43 54 73 20 74 6f 20 62 65 20 63 6f 64 65 64 20  CTs to be coded 
da50: 2a 2f 0a 20 20 69 6e 74 20 65 44 65 73 74 2c 20  */.  int eDest, 
da60: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 5c 5f             /* \_
da70: 5f 5f 20 20 53 74 6f 72 65 20 71 75 65 72 79 20  __  Store query 
da80: 72 65 73 75 6c 74 73 20 61 73 20 73 70 65 63 69  results as speci
da90: 66 69 65 64 20 2a 2f 0a 20 20 69 6e 74 20 69 50  fied */.  int iP
daa0: 61 72 6d 2c 20 20 20 20 20 20 20 20 20 20 20 20  arm,            
dab0: 2f 2a 20 2f 20 20 20 20 20 62 79 20 74 68 65 73  /* /     by thes
dac0: 65 20 74 77 6f 20 70 61 72 61 6d 65 74 65 72 73  e two parameters
dad0: 2e 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 63  .         */.  c
dae0: 68 61 72 20 2a 61 66 66 20 20 20 20 20 20 20 20  har *aff        
daf0: 20 20 20 20 20 2f 2a 20 49 66 20 65 44 65 73 74       /* If eDest
db00: 20 69 73 20 53 52 54 5f 55 6e 69 6f 6e 2c 20 74   is SRT_Union, t
db10: 68 65 20 61 66 66 69 6e 69 74 79 20 73 74 72 69  he affinity stri
db20: 6e 67 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72  ng */.){.  int r
db30: 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20  c = SQLITE_OK;  
db40: 20 2f 2a 20 53 75 63 63 65 73 73 20 63 6f 64 65   /* Success code
db50: 20 66 72 6f 6d 20 61 20 73 75 62 72 6f 75 74 69   from a subrouti
db60: 6e 65 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a  ne */.  Select *
db70: 70 50 72 69 6f 72 3b 20 20 20 20 20 20 20 2f 2a  pPrior;       /*
db80: 20 41 6e 6f 74 68 65 72 20 53 45 4c 45 43 54 20   Another SELECT 
db90: 69 6d 6d 65 64 69 61 74 65 6c 79 20 74 6f 20 6f  immediately to o
dba0: 75 72 20 6c 65 66 74 20 2a 2f 0a 20 20 56 64 62  ur left */.  Vdb
dbb0: 65 20 2a 76 3b 20 20 20 20 20 20 20 20 20 20 20  e *v;           
dbc0: 20 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63     /* Generate c
dbd0: 6f 64 65 20 74 6f 20 74 68 69 73 20 56 44 42 45  ode to this VDBE
dbe0: 20 2a 2f 0a 20 20 69 6e 74 20 6e 43 6f 6c 3b 20   */.  int nCol; 
dbf0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
dc00: 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73  umber of columns
dc10: 20 69 6e 20 74 68 65 20 72 65 73 75 6c 74 20 73   in the result s
dc20: 65 74 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74  et */.  ExprList
dc30: 20 2a 70 4f 72 64 65 72 42 79 3b 20 20 20 2f 2a   *pOrderBy;   /*
dc40: 20 54 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c   The ORDER BY cl
dc50: 61 75 73 65 20 6f 6e 20 70 20 2a 2f 0a 20 20 69  ause on p */.  i
dc60: 6e 74 20 61 53 65 74 50 32 5b 32 5d 3b 20 20 20  nt aSetP2[2];   
dc70: 20 20 20 20 20 2f 2a 20 53 65 74 20 50 32 20 76       /* Set P2 v
dc80: 61 6c 75 65 20 6f 66 20 74 68 65 73 65 20 6f 70  alue of these op
dc90: 20 74 6f 20 6e 75 6d 62 65 72 20 6f 66 20 63 6f   to number of co
dca0: 6c 75 6d 6e 73 20 2a 2f 0a 20 20 69 6e 74 20 6e  lumns */.  int n
dcb0: 53 65 74 50 32 20 3d 20 30 3b 20 20 20 20 20 20  SetP2 = 0;      
dcc0: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 73 6c   /* Number of sl
dcd0: 6f 74 73 20 69 6e 20 61 53 65 74 50 32 5b 5d 20  ots in aSetP2[] 
dce0: 75 73 65 64 20 2a 2f 0a 0a 20 20 2f 2a 20 4d 61  used */..  /* Ma
dcf0: 6b 65 20 73 75 72 65 20 74 68 65 72 65 20 69 73  ke sure there is
dd00: 20 6e 6f 20 4f 52 44 45 52 20 42 59 20 6f 72 20   no ORDER BY or 
dd10: 4c 49 4d 49 54 20 63 6c 61 75 73 65 20 6f 6e 20  LIMIT clause on 
dd20: 70 72 69 6f 72 20 53 45 4c 45 43 54 73 2e 20 20  prior SELECTs.  
dd30: 4f 6e 6c 79 0a 20 20 2a 2a 20 74 68 65 20 6c 61  Only.  ** the la
dd40: 73 74 20 28 72 69 67 68 74 2d 6d 6f 73 74 29 20  st (right-most) 
dd50: 53 45 4c 45 43 54 20 69 6e 20 74 68 65 20 73 65  SELECT in the se
dd60: 72 69 65 73 20 6d 61 79 20 68 61 76 65 20 61 6e  ries may have an
dd70: 20 4f 52 44 45 52 20 42 59 20 6f 72 20 4c 49 4d   ORDER BY or LIM
dd80: 49 54 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  IT..  */.  if( p
dd90: 3d 3d 30 20 7c 7c 20 70 2d 3e 70 50 72 69 6f 72  ==0 || p->pPrior
dda0: 3d 3d 30 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  ==0 ){.    rc = 
ddb0: 31 3b 0a 20 20 20 20 67 6f 74 6f 20 6d 75 6c 74  1;.    goto mult
ddc0: 69 5f 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20  i_select_end;.  
ddd0: 7d 0a 20 20 70 50 72 69 6f 72 20 3d 20 70 2d 3e  }.  pPrior = p->
dde0: 70 50 72 69 6f 72 3b 0a 20 20 61 73 73 65 72 74  pPrior;.  assert
ddf0: 28 20 70 50 72 69 6f 72 2d 3e 70 52 69 67 68 74  ( pPrior->pRight
de00: 6d 6f 73 74 21 3d 70 50 72 69 6f 72 20 29 3b 0a  most!=pPrior );.
de10: 20 20 61 73 73 65 72 74 28 20 70 50 72 69 6f 72    assert( pPrior
de20: 2d 3e 70 52 69 67 68 74 6d 6f 73 74 3d 3d 70 2d  ->pRightmost==p-
de30: 3e 70 52 69 67 68 74 6d 6f 73 74 20 29 3b 0a 20  >pRightmost );. 
de40: 20 69 66 28 20 70 50 72 69 6f 72 2d 3e 70 4f 72   if( pPrior->pOr
de50: 64 65 72 42 79 20 29 7b 0a 20 20 20 20 73 71 6c  derBy ){.    sql
de60: 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
de70: 72 73 65 2c 22 4f 52 44 45 52 20 42 59 20 63 6c  rse,"ORDER BY cl
de80: 61 75 73 65 20 73 68 6f 75 6c 64 20 63 6f 6d 65  ause should come
de90: 20 61 66 74 65 72 20 25 73 20 6e 6f 74 20 62 65   after %s not be
dea0: 66 6f 72 65 22 2c 0a 20 20 20 20 20 20 73 65 6c  fore",.      sel
deb0: 65 63 74 4f 70 4e 61 6d 65 28 70 2d 3e 6f 70 29  ectOpName(p->op)
dec0: 29 3b 0a 20 20 20 20 72 63 20 3d 20 31 3b 0a 20  );.    rc = 1;. 
ded0: 20 20 20 67 6f 74 6f 20 6d 75 6c 74 69 5f 73 65     goto multi_se
dee0: 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 7d 0a 20 20  lect_end;.  }.  
def0: 69 66 28 20 70 50 72 69 6f 72 2d 3e 70 4c 69 6d  if( pPrior->pLim
df00: 69 74 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  it ){.    sqlite
df10: 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
df20: 2c 22 4c 49 4d 49 54 20 63 6c 61 75 73 65 20 73  ,"LIMIT clause s
df30: 68 6f 75 6c 64 20 63 6f 6d 65 20 61 66 74 65 72  hould come after
df40: 20 25 73 20 6e 6f 74 20 62 65 66 6f 72 65 22 2c   %s not before",
df50: 0a 20 20 20 20 20 20 73 65 6c 65 63 74 4f 70 4e  .      selectOpN
df60: 61 6d 65 28 70 2d 3e 6f 70 29 29 3b 0a 20 20 20  ame(p->op));.   
df70: 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 67 6f 74   rc = 1;.    got
df80: 6f 20 6d 75 6c 74 69 5f 73 65 6c 65 63 74 5f 65  o multi_select_e
df90: 6e 64 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61  nd;.  }..  /* Ma
dfa0: 6b 65 20 73 75 72 65 20 77 65 20 68 61 76 65 20  ke sure we have 
dfb0: 61 20 76 61 6c 69 64 20 71 75 65 72 79 20 65 6e  a valid query en
dfc0: 67 69 6e 65 2e 20 20 49 66 20 6e 6f 74 2c 20 63  gine.  If not, c
dfd0: 72 65 61 74 65 20 61 20 6e 65 77 20 6f 6e 65 2e  reate a new one.
dfe0: 0a 20 20 2a 2f 0a 20 20 76 20 3d 20 73 71 6c 69  .  */.  v = sqli
dff0: 74 65 33 47 65 74 56 64 62 65 28 70 50 61 72 73  te3GetVdbe(pPars
e000: 65 29 3b 0a 20 20 69 66 28 20 76 3d 3d 30 20 29  e);.  if( v==0 )
e010: 7b 0a 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20  {.    rc = 1;.  
e020: 20 20 67 6f 74 6f 20 6d 75 6c 74 69 5f 73 65 6c    goto multi_sel
e030: 65 63 74 5f 65 6e 64 3b 0a 20 20 7d 0a 0a 20 20  ect_end;.  }..  
e040: 2f 2a 20 43 72 65 61 74 65 20 74 68 65 20 64 65  /* Create the de
e050: 73 74 69 6e 61 74 69 6f 6e 20 74 65 6d 70 6f 72  stination tempor
e060: 61 72 79 20 74 61 62 6c 65 20 69 66 20 6e 65 63  ary table if nec
e070: 65 73 73 61 72 79 0a 20 20 2a 2f 0a 20 20 69 66  essary.  */.  if
e080: 28 20 65 44 65 73 74 3d 3d 53 52 54 5f 45 70 68  ( eDest==SRT_Eph
e090: 65 6d 54 61 62 20 29 7b 0a 20 20 20 20 61 73 73  emTab ){.    ass
e0a0: 65 72 74 28 20 70 2d 3e 70 45 4c 69 73 74 20 29  ert( p->pEList )
e0b0: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 6e 53  ;.    assert( nS
e0c0: 65 74 50 32 3c 73 69 7a 65 6f 66 28 61 53 65 74  etP2<sizeof(aSet
e0d0: 50 32 29 2f 73 69 7a 65 6f 66 28 61 53 65 74 50  P2)/sizeof(aSetP
e0e0: 32 5b 30 5d 29 20 29 3b 0a 20 20 20 20 61 53 65  2[0]) );.    aSe
e0f0: 74 50 32 5b 6e 53 65 74 50 32 2b 2b 5d 20 3d 20  tP2[nSetP2++] = 
e100: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
e110: 28 76 2c 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d  (v, OP_OpenEphem
e120: 65 72 61 6c 2c 20 69 50 61 72 6d 2c 20 30 29 3b  eral, iParm, 0);
e130: 0a 20 20 20 20 65 44 65 73 74 20 3d 20 53 52 54  .    eDest = SRT
e140: 5f 54 61 62 6c 65 3b 0a 20 20 7d 0a 0a 20 20 2f  _Table;.  }..  /
e150: 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20  * Generate code 
e160: 66 6f 72 20 74 68 65 20 6c 65 66 74 20 61 6e 64  for the left and
e170: 20 72 69 67 68 74 20 53 45 4c 45 43 54 20 73 74   right SELECT st
e180: 61 74 65 6d 65 6e 74 73 2e 0a 20 20 2a 2f 0a 20  atements..  */. 
e190: 20 70 4f 72 64 65 72 42 79 20 3d 20 70 2d 3e 70   pOrderBy = p->p
e1a0: 4f 72 64 65 72 42 79 3b 0a 20 20 73 77 69 74 63  OrderBy;.  switc
e1b0: 68 28 20 70 2d 3e 6f 70 20 29 7b 0a 20 20 20 20  h( p->op ){.    
e1c0: 63 61 73 65 20 54 4b 5f 41 4c 4c 3a 20 7b 0a 20  case TK_ALL: {. 
e1d0: 20 20 20 20 20 69 66 28 20 70 4f 72 64 65 72 42       if( pOrderB
e1e0: 79 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  y==0 ){.        
e1f0: 69 6e 74 20 61 64 64 72 20 3d 20 30 3b 0a 20 20  int addr = 0;.  
e200: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21 70        assert( !p
e210: 50 72 69 6f 72 2d 3e 70 4c 69 6d 69 74 20 29 3b  Prior->pLimit );
e220: 0a 20 20 20 20 20 20 20 20 70 50 72 69 6f 72 2d  .        pPrior-
e230: 3e 70 4c 69 6d 69 74 20 3d 20 70 2d 3e 70 4c 69  >pLimit = p->pLi
e240: 6d 69 74 3b 0a 20 20 20 20 20 20 20 20 70 50 72  mit;.        pPr
e250: 69 6f 72 2d 3e 70 4f 66 66 73 65 74 20 3d 20 70  ior->pOffset = p
e260: 2d 3e 70 4f 66 66 73 65 74 3b 0a 20 20 20 20 20  ->pOffset;.     
e270: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 53     rc = sqlite3S
e280: 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70 50  elect(pParse, pP
e290: 72 69 6f 72 2c 20 65 44 65 73 74 2c 20 69 50 61  rior, eDest, iPa
e2a0: 72 6d 2c 20 30 2c 20 30 2c 20 30 2c 20 61 66 66  rm, 0, 0, 0, aff
e2b0: 29 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 70 4c  );.        p->pL
e2c0: 69 6d 69 74 20 3d 20 30 3b 0a 20 20 20 20 20 20  imit = 0;.      
e2d0: 20 20 70 2d 3e 70 4f 66 66 73 65 74 20 3d 20 30    p->pOffset = 0
e2e0: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63  ;.        if( rc
e2f0: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 67 6f   ){.          go
e300: 74 6f 20 6d 75 6c 74 69 5f 73 65 6c 65 63 74 5f  to multi_select_
e310: 65 6e 64 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  end;.        }. 
e320: 20 20 20 20 20 20 20 70 2d 3e 70 50 72 69 6f 72         p->pPrior
e330: 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 70 2d   = 0;.        p-
e340: 3e 69 4c 69 6d 69 74 20 3d 20 70 50 72 69 6f 72  >iLimit = pPrior
e350: 2d 3e 69 4c 69 6d 69 74 3b 0a 20 20 20 20 20 20  ->iLimit;.      
e360: 20 20 70 2d 3e 69 4f 66 66 73 65 74 20 3d 20 70    p->iOffset = p
e370: 50 72 69 6f 72 2d 3e 69 4f 66 66 73 65 74 3b 0a  Prior->iOffset;.
e380: 20 20 20 20 20 20 20 20 69 66 28 20 70 2d 3e 69          if( p->i
e390: 4c 69 6d 69 74 3e 3d 30 20 29 7b 0a 20 20 20 20  Limit>=0 ){.    
e3a0: 20 20 20 20 20 20 61 64 64 72 20 3d 20 73 71 6c        addr = sql
e3b0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
e3c0: 20 4f 50 5f 49 66 4d 65 6d 5a 65 72 6f 2c 20 70   OP_IfMemZero, p
e3d0: 2d 3e 69 4c 69 6d 69 74 2c 20 30 29 3b 0a 20 20  ->iLimit, 0);.  
e3e0: 20 20 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d          VdbeComm
e3f0: 65 6e 74 28 28 76 2c 20 22 23 20 4a 75 6d 70 20  ent((v, "# Jump 
e400: 61 68 65 61 64 20 69 66 20 4c 49 4d 49 54 20 72  ahead if LIMIT r
e410: 65 61 63 68 65 64 22 29 29 3b 0a 20 20 20 20 20  eached"));.     
e420: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 72 63 20     }.        rc 
e430: 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28  = sqlite3Select(
e440: 70 50 61 72 73 65 2c 20 70 2c 20 65 44 65 73 74  pParse, p, eDest
e450: 2c 20 69 50 61 72 6d 2c 20 30 2c 20 30 2c 20 30  , iParm, 0, 0, 0
e460: 2c 20 61 66 66 29 3b 0a 20 20 20 20 20 20 20 20  , aff);.        
e470: 70 2d 3e 70 50 72 69 6f 72 20 3d 20 70 50 72 69  p->pPrior = pPri
e480: 6f 72 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  or;.        if( 
e490: 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  rc ){.          
e4a0: 67 6f 74 6f 20 6d 75 6c 74 69 5f 73 65 6c 65 63  goto multi_selec
e4b0: 74 5f 65 6e 64 3b 0a 20 20 20 20 20 20 20 20 7d  t_end;.        }
e4c0: 0a 20 20 20 20 20 20 20 20 69 66 28 20 61 64 64  .        if( add
e4d0: 72 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73  r ){.          s
e4e0: 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65  qlite3VdbeJumpHe
e4f0: 72 65 28 76 2c 20 61 64 64 72 29 3b 0a 20 20 20  re(v, addr);.   
e500: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 62       }.        b
e510: 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  reak;.      }.  
e520: 20 20 20 20 2f 2a 20 46 6f 72 20 55 4e 49 4f 4e      /* For UNION
e530: 20 41 4c 4c 20 2e 2e 2e 20 4f 52 44 45 52 20 42   ALL ... ORDER B
e540: 59 20 66 61 6c 6c 20 74 68 72 6f 75 67 68 20 74  Y fall through t
e550: 6f 20 74 68 65 20 6e 65 78 74 20 63 61 73 65 20  o the next case 
e560: 2a 2f 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  */.    }.    cas
e570: 65 20 54 4b 5f 45 58 43 45 50 54 3a 0a 20 20 20  e TK_EXCEPT:.   
e580: 20 63 61 73 65 20 54 4b 5f 55 4e 49 4f 4e 3a 20   case TK_UNION: 
e590: 7b 0a 20 20 20 20 20 20 69 6e 74 20 75 6e 69 6f  {.      int unio
e5a0: 6e 54 61 62 3b 20 20 20 20 2f 2a 20 43 75 72 73  nTab;    /* Curs
e5b0: 6f 72 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65  or number of the
e5c0: 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65   temporary table
e5d0: 20 68 6f 6c 64 69 6e 67 20 72 65 73 75 6c 74 20   holding result 
e5e0: 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 6f 70 20  */.      int op 
e5f0: 3d 20 30 3b 20 20 20 20 20 20 2f 2a 20 4f 6e 65  = 0;      /* One
e600: 20 6f 66 20 74 68 65 20 53 52 54 5f 20 6f 70 65   of the SRT_ ope
e610: 72 61 74 69 6f 6e 73 20 74 6f 20 61 70 70 6c 79  rations to apply
e620: 20 74 6f 20 73 65 6c 66 20 2a 2f 0a 20 20 20 20   to self */.    
e630: 20 20 69 6e 74 20 70 72 69 6f 72 4f 70 3b 20 20    int priorOp;  
e640: 20 20 20 2f 2a 20 54 68 65 20 53 52 54 5f 20 6f     /* The SRT_ o
e650: 70 65 72 61 74 69 6f 6e 20 74 6f 20 61 70 70 6c  peration to appl
e660: 79 20 74 6f 20 70 72 69 6f 72 20 73 65 6c 65 63  y to prior selec
e670: 74 73 20 2a 2f 0a 20 20 20 20 20 20 45 78 70 72  ts */.      Expr
e680: 20 2a 70 4c 69 6d 69 74 2c 20 2a 70 4f 66 66 73   *pLimit, *pOffs
e690: 65 74 3b 20 2f 2a 20 53 61 76 65 64 20 76 61 6c  et; /* Saved val
e6a0: 75 65 73 20 6f 66 20 70 2d 3e 6e 4c 69 6d 69 74  ues of p->nLimit
e6b0: 20 61 6e 64 20 70 2d 3e 6e 4f 66 66 73 65 74 20   and p->nOffset 
e6c0: 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 61 64 64  */.      int add
e6d0: 72 3b 0a 0a 20 20 20 20 20 20 70 72 69 6f 72 4f  r;..      priorO
e6e0: 70 20 3d 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 41 4c  p = p->op==TK_AL
e6f0: 4c 20 3f 20 53 52 54 5f 54 61 62 6c 65 20 3a 20  L ? SRT_Table : 
e700: 53 52 54 5f 55 6e 69 6f 6e 3b 0a 20 20 20 20 20  SRT_Union;.     
e710: 20 69 66 28 20 65 44 65 73 74 3d 3d 70 72 69 6f   if( eDest==prio
e720: 72 4f 70 20 26 26 20 70 4f 72 64 65 72 42 79 3d  rOp && pOrderBy=
e730: 3d 30 20 26 26 20 21 70 2d 3e 70 4c 69 6d 69 74  =0 && !p->pLimit
e740: 20 26 26 20 21 70 2d 3e 70 4f 66 66 73 65 74 20   && !p->pOffset 
e750: 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 57 65  ){.        /* We
e760: 20 63 61 6e 20 72 65 75 73 65 20 61 20 74 65 6d   can reuse a tem
e770: 70 6f 72 61 72 79 20 74 61 62 6c 65 20 67 65 6e  porary table gen
e780: 65 72 61 74 65 64 20 62 79 20 61 20 53 45 4c 45  erated by a SELE
e790: 43 54 20 74 6f 20 6f 75 72 0a 20 20 20 20 20 20  CT to our.      
e7a0: 20 20 2a 2a 20 72 69 67 68 74 2e 0a 20 20 20 20    ** right..    
e7b0: 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 75      */.        u
e7c0: 6e 69 6f 6e 54 61 62 20 3d 20 69 50 61 72 6d 3b  nionTab = iParm;
e7d0: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
e7e0: 20 20 20 20 20 20 2f 2a 20 57 65 20 77 69 6c 6c        /* We will
e7f0: 20 6e 65 65 64 20 74 6f 20 63 72 65 61 74 65 20   need to create 
e800: 6f 75 72 20 6f 77 6e 20 74 65 6d 70 6f 72 61 72  our own temporar
e810: 79 20 74 61 62 6c 65 20 74 6f 20 68 6f 6c 64 20  y table to hold 
e820: 74 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 69  the.        ** i
e830: 6e 74 65 72 6d 65 64 69 61 74 65 20 72 65 73 75  ntermediate resu
e840: 6c 74 73 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a  lts..        */.
e850: 20 20 20 20 20 20 20 20 75 6e 69 6f 6e 54 61 62          unionTab
e860: 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b   = pParse->nTab+
e870: 2b 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  +;.        if( p
e880: 4f 72 64 65 72 42 79 20 26 26 20 6d 61 74 63 68  OrderBy && match
e890: 4f 72 64 65 72 62 79 54 6f 43 6f 6c 75 6d 6e 28  OrderbyToColumn(
e8a0: 70 50 61 72 73 65 2c 20 70 2c 20 70 4f 72 64 65  pParse, p, pOrde
e8b0: 72 42 79 2c 20 75 6e 69 6f 6e 54 61 62 2c 31 29  rBy, unionTab,1)
e8c0: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63   ){.          rc
e8d0: 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20   = 1;.          
e8e0: 67 6f 74 6f 20 6d 75 6c 74 69 5f 73 65 6c 65 63  goto multi_selec
e8f0: 74 5f 65 6e 64 3b 0a 20 20 20 20 20 20 20 20 7d  t_end;.        }
e900: 0a 20 20 20 20 20 20 20 20 61 64 64 72 20 3d 20  .        addr = 
e910: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
e920: 28 76 2c 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d  (v, OP_OpenEphem
e930: 65 72 61 6c 2c 20 75 6e 69 6f 6e 54 61 62 2c 20  eral, unionTab, 
e940: 30 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  0);.        if( 
e950: 70 72 69 6f 72 4f 70 3d 3d 53 52 54 5f 54 61 62  priorOp==SRT_Tab
e960: 6c 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  le ){.          
e970: 61 73 73 65 72 74 28 20 6e 53 65 74 50 32 3c 73  assert( nSetP2<s
e980: 69 7a 65 6f 66 28 61 53 65 74 50 32 29 2f 73 69  izeof(aSetP2)/si
e990: 7a 65 6f 66 28 61 53 65 74 50 32 5b 30 5d 29 20  zeof(aSetP2[0]) 
e9a0: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 61 53 65  );.          aSe
e9b0: 74 50 32 5b 6e 53 65 74 50 32 2b 2b 5d 20 3d 20  tP2[nSetP2++] = 
e9c0: 61 64 64 72 3b 0a 20 20 20 20 20 20 20 20 7d 65  addr;.        }e
e9d0: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 61  lse{.          a
e9e0: 73 73 65 72 74 28 20 70 2d 3e 61 64 64 72 4f 70  ssert( p->addrOp
e9f0: 65 6e 45 70 68 6d 5b 30 5d 20 3d 3d 20 2d 31 20  enEphm[0] == -1 
ea00: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e  );.          p->
ea10: 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b 30 5d 20  addrOpenEphm[0] 
ea20: 3d 20 61 64 64 72 3b 0a 20 20 20 20 20 20 20 20  = addr;.        
ea30: 20 20 70 2d 3e 70 52 69 67 68 74 6d 6f 73 74 2d    p->pRightmost-
ea40: 3e 75 73 65 73 45 70 68 6d 20 3d 20 31 3b 0a 20  >usesEphm = 1;. 
ea50: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
ea60: 20 63 72 65 61 74 65 53 6f 72 74 69 6e 67 49 6e   createSortingIn
ea70: 64 65 78 28 70 50 61 72 73 65 2c 20 70 2c 20 70  dex(pParse, p, p
ea80: 4f 72 64 65 72 42 79 29 3b 0a 20 20 20 20 20 20  OrderBy);.      
ea90: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 45 4c    assert( p->pEL
eaa0: 69 73 74 20 29 3b 0a 20 20 20 20 20 20 7d 0a 0a  ist );.      }..
eab0: 20 20 20 20 20 20 2f 2a 20 43 6f 64 65 20 74 68        /* Code th
eac0: 65 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  e SELECT stateme
ead0: 6e 74 73 20 74 6f 20 6f 75 72 20 6c 65 66 74 0a  nts to our left.
eae0: 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 61        */.      a
eaf0: 73 73 65 72 74 28 20 21 70 50 72 69 6f 72 2d 3e  ssert( !pPrior->
eb00: 70 4f 72 64 65 72 42 79 20 29 3b 0a 20 20 20 20  pOrderBy );.    
eb10: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 53 65    rc = sqlite3Se
eb20: 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70 50 72  lect(pParse, pPr
eb30: 69 6f 72 2c 20 70 72 69 6f 72 4f 70 2c 20 75 6e  ior, priorOp, un
eb40: 69 6f 6e 54 61 62 2c 20 30 2c 20 30 2c 20 30 2c  ionTab, 0, 0, 0,
eb50: 20 61 66 66 29 3b 0a 20 20 20 20 20 20 69 66 28   aff);.      if(
eb60: 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20 67   rc ){.        g
eb70: 6f 74 6f 20 6d 75 6c 74 69 5f 73 65 6c 65 63 74  oto multi_select
eb80: 5f 65 6e 64 3b 0a 20 20 20 20 20 20 7d 0a 0a 20  _end;.      }.. 
eb90: 20 20 20 20 20 2f 2a 20 43 6f 64 65 20 74 68 65       /* Code the
eba0: 20 63 75 72 72 65 6e 74 20 53 45 4c 45 43 54 20   current SELECT 
ebb0: 73 74 61 74 65 6d 65 6e 74 0a 20 20 20 20 20 20  statement.      
ebc0: 2a 2f 0a 20 20 20 20 20 20 73 77 69 74 63 68 28  */.      switch(
ebd0: 20 70 2d 3e 6f 70 20 29 7b 0a 20 20 20 20 20 20   p->op ){.      
ebe0: 20 20 20 63 61 73 65 20 54 4b 5f 45 58 43 45 50     case TK_EXCEP
ebf0: 54 3a 20 20 6f 70 20 3d 20 53 52 54 5f 45 78 63  T:  op = SRT_Exc
ec00: 65 70 74 3b 20 20 20 62 72 65 61 6b 3b 0a 20 20  ept;   break;.  
ec10: 20 20 20 20 20 20 20 63 61 73 65 20 54 4b 5f 55         case TK_U
ec20: 4e 49 4f 4e 3a 20 20 20 6f 70 20 3d 20 53 52 54  NION:   op = SRT
ec30: 5f 55 6e 69 6f 6e 3b 20 20 20 20 62 72 65 61 6b  _Union;    break
ec40: 3b 0a 20 20 20 20 20 20 20 20 20 63 61 73 65 20  ;.         case 
ec50: 54 4b 5f 41 4c 4c 3a 20 20 20 20 20 6f 70 20 3d  TK_ALL:     op =
ec60: 20 53 52 54 5f 54 61 62 6c 65 3b 20 20 20 20 62   SRT_Table;    b
ec70: 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  reak;.      }.  
ec80: 20 20 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d 20      p->pPrior = 
ec90: 30 3b 0a 20 20 20 20 20 20 70 2d 3e 70 4f 72 64  0;.      p->pOrd
eca0: 65 72 42 79 20 3d 20 30 3b 0a 20 20 20 20 20 20  erBy = 0;.      
ecb0: 70 2d 3e 64 69 73 61 6c 6c 6f 77 4f 72 64 65 72  p->disallowOrder
ecc0: 42 79 20 3d 20 70 4f 72 64 65 72 42 79 21 3d 30  By = pOrderBy!=0
ecd0: 3b 0a 20 20 20 20 20 20 70 4c 69 6d 69 74 20 3d  ;.      pLimit =
ece0: 20 70 2d 3e 70 4c 69 6d 69 74 3b 0a 20 20 20 20   p->pLimit;.    
ecf0: 20 20 70 2d 3e 70 4c 69 6d 69 74 20 3d 20 30 3b    p->pLimit = 0;
ed00: 0a 20 20 20 20 20 20 70 4f 66 66 73 65 74 20 3d  .      pOffset =
ed10: 20 70 2d 3e 70 4f 66 66 73 65 74 3b 0a 20 20 20   p->pOffset;.   
ed20: 20 20 20 70 2d 3e 70 4f 66 66 73 65 74 20 3d 20     p->pOffset = 
ed30: 30 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  0;.      rc = sq
ed40: 6c 69 74 65 33 53 65 6c 65 63 74 28 70 50 61 72  lite3Select(pPar
ed50: 73 65 2c 20 70 2c 20 6f 70 2c 20 75 6e 69 6f 6e  se, p, op, union
ed60: 54 61 62 2c 20 30 2c 20 30 2c 20 30 2c 20 61 66  Tab, 0, 0, 0, af
ed70: 66 29 3b 0a 20 20 20 20 20 20 2f 2a 20 51 75 65  f);.      /* Que
ed80: 72 79 20 66 6c 61 74 74 65 6e 69 6e 67 20 69 6e  ry flattening in
ed90: 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28 29   sqlite3Select()
eda0: 20 6d 69 67 68 74 20 72 65 66 69 6c 6c 20 70 2d   might refill p-
edb0: 3e 70 4f 72 64 65 72 42 79 2e 0a 20 20 20 20 20  >pOrderBy..     
edc0: 20 2a 2a 20 42 65 20 73 75 72 65 20 74 6f 20 64   ** Be sure to d
edd0: 65 6c 65 74 65 20 70 2d 3e 70 4f 72 64 65 72 42  elete p->pOrderB
ede0: 79 2c 20 74 68 65 72 65 66 6f 72 65 2c 20 74 6f  y, therefore, to
edf0: 20 61 76 6f 69 64 20 61 20 6d 65 6d 6f 72 79 20   avoid a memory 
ee00: 6c 65 61 6b 2e 20 2a 2f 0a 20 20 20 20 20 20 73  leak. */.      s
ee10: 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 65  qlite3ExprListDe
ee20: 6c 65 74 65 28 70 2d 3e 70 4f 72 64 65 72 42 79  lete(p->pOrderBy
ee30: 29 3b 0a 20 20 20 20 20 20 70 2d 3e 70 50 72 69  );.      p->pPri
ee40: 6f 72 20 3d 20 70 50 72 69 6f 72 3b 0a 20 20 20  or = pPrior;.   
ee50: 20 20 20 70 2d 3e 70 4f 72 64 65 72 42 79 20 3d     p->pOrderBy =
ee60: 20 70 4f 72 64 65 72 42 79 3b 0a 20 20 20 20 20   pOrderBy;.     
ee70: 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65   sqlite3ExprDele
ee80: 74 65 28 70 2d 3e 70 4c 69 6d 69 74 29 3b 0a 20  te(p->pLimit);. 
ee90: 20 20 20 20 20 70 2d 3e 70 4c 69 6d 69 74 20 3d       p->pLimit =
eea0: 20 70 4c 69 6d 69 74 3b 0a 20 20 20 20 20 20 70   pLimit;.      p
eeb0: 2d 3e 70 4f 66 66 73 65 74 20 3d 20 70 4f 66 66  ->pOffset = pOff
eec0: 73 65 74 3b 0a 20 20 20 20 20 20 70 2d 3e 69 4c  set;.      p->iL
eed0: 69 6d 69 74 20 3d 20 2d 31 3b 0a 20 20 20 20 20  imit = -1;.     
eee0: 20 70 2d 3e 69 4f 66 66 73 65 74 20 3d 20 2d 31   p->iOffset = -1
eef0: 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 20 29  ;.      if( rc )
ef00: 7b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 6d  {.        goto m
ef10: 75 6c 74 69 5f 73 65 6c 65 63 74 5f 65 6e 64 3b  ulti_select_end;
ef20: 0a 20 20 20 20 20 20 7d 0a 0a 0a 20 20 20 20 20  .      }...     
ef30: 20 2f 2a 20 43 6f 6e 76 65 72 74 20 74 68 65 20   /* Convert the 
ef40: 64 61 74 61 20 69 6e 20 74 68 65 20 74 65 6d 70  data in the temp
ef50: 6f 72 61 72 79 20 74 61 62 6c 65 20 69 6e 74 6f  orary table into
ef60: 20 77 68 61 74 65 76 65 72 20 66 6f 72 6d 0a 20   whatever form. 
ef70: 20 20 20 20 20 2a 2a 20 69 74 20 69 73 20 74 68       ** it is th
ef80: 61 74 20 77 65 20 63 75 72 72 65 6e 74 6c 79 20  at we currently 
ef90: 6e 65 65 64 2e 0a 20 20 20 20 20 20 2a 2f 20 20  need..      */  
efa0: 20 20 20 20 0a 20 20 20 20 20 20 69 66 28 20 65      .      if( e
efb0: 44 65 73 74 21 3d 70 72 69 6f 72 4f 70 20 7c 7c  Dest!=priorOp ||
efc0: 20 75 6e 69 6f 6e 54 61 62 21 3d 69 50 61 72 6d   unionTab!=iParm
efd0: 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20   ){.        int 
efe0: 69 43 6f 6e 74 2c 20 69 42 72 65 61 6b 2c 20 69  iCont, iBreak, i
eff0: 53 74 61 72 74 3b 0a 20 20 20 20 20 20 20 20 61  Start;.        a
f000: 73 73 65 72 74 28 20 70 2d 3e 70 45 4c 69 73 74  ssert( p->pEList
f010: 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20   );.        if( 
f020: 65 44 65 73 74 3d 3d 53 52 54 5f 43 61 6c 6c 62  eDest==SRT_Callb
f030: 61 63 6b 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ack ){.         
f040: 20 53 65 6c 65 63 74 20 2a 70 46 69 72 73 74 20   Select *pFirst 
f050: 3d 20 70 3b 0a 20 20 20 20 20 20 20 20 20 20 77  = p;.          w
f060: 68 69 6c 65 28 20 70 46 69 72 73 74 2d 3e 70 50  hile( pFirst->pP
f070: 72 69 6f 72 20 29 20 70 46 69 72 73 74 20 3d 20  rior ) pFirst = 
f080: 70 46 69 72 73 74 2d 3e 70 50 72 69 6f 72 3b 0a  pFirst->pPrior;.
f090: 20 20 20 20 20 20 20 20 20 20 67 65 6e 65 72 61            genera
f0a0: 74 65 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 70 50  teColumnNames(pP
f0b0: 61 72 73 65 2c 20 30 2c 20 70 46 69 72 73 74 2d  arse, 0, pFirst-
f0c0: 3e 70 45 4c 69 73 74 29 3b 0a 20 20 20 20 20 20  >pEList);.      
f0d0: 20 20 7d 0a 20 20 20 20 20 20 20 20 69 42 72 65    }.        iBre
f0e0: 61 6b 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  ak = sqlite3Vdbe
f0f0: 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20  MakeLabel(v);.  
f100: 20 20 20 20 20 20 69 43 6f 6e 74 20 3d 20 73 71        iCont = sq
f110: 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62  lite3VdbeMakeLab
f120: 65 6c 28 76 29 3b 0a 20 20 20 20 20 20 20 20 63  el(v);.        c
f130: 6f 6d 70 75 74 65 4c 69 6d 69 74 52 65 67 69 73  omputeLimitRegis
f140: 74 65 72 73 28 70 50 61 72 73 65 2c 20 70 2c 20  ters(pParse, p, 
f150: 69 42 72 65 61 6b 29 3b 0a 20 20 20 20 20 20 20  iBreak);.       
f160: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
f170: 70 28 76 2c 20 4f 50 5f 52 65 77 69 6e 64 2c 20  p(v, OP_Rewind, 
f180: 75 6e 69 6f 6e 54 61 62 2c 20 69 42 72 65 61 6b  unionTab, iBreak
f190: 29 3b 0a 20 20 20 20 20 20 20 20 69 53 74 61 72  );.        iStar
f1a0: 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43  t = sqlite3VdbeC
f1b0: 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 20  urrentAddr(v);. 
f1c0: 20 20 20 20 20 20 20 72 63 20 3d 20 73 65 6c 65         rc = sele
f1d0: 63 74 49 6e 6e 65 72 4c 6f 6f 70 28 70 50 61 72  ctInnerLoop(pPar
f1e0: 73 65 2c 20 70 2c 20 70 2d 3e 70 45 4c 69 73 74  se, p, p->pEList
f1f0: 2c 20 75 6e 69 6f 6e 54 61 62 2c 20 70 2d 3e 70  , unionTab, p->p
f200: 45 4c 69 73 74 2d 3e 6e 45 78 70 72 2c 0a 20 20  EList->nExpr,.  
f210: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f220: 20 20 20 20 20 20 20 20 20 20 20 70 4f 72 64 65             pOrde
f230: 72 42 79 2c 20 2d 31 2c 20 65 44 65 73 74 2c 20  rBy, -1, eDest, 
f240: 69 50 61 72 6d 2c 20 0a 20 20 20 20 20 20 20 20  iParm, .        
f250: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f260: 20 20 20 20 20 69 43 6f 6e 74 2c 20 69 42 72 65       iCont, iBre
f270: 61 6b 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20  ak, 0);.        
f280: 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20  if( rc ){.      
f290: 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20      rc = 1;.    
f2a0: 20 20 20 20 20 20 67 6f 74 6f 20 6d 75 6c 74 69        goto multi
f2b0: 5f 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20  _select_end;.   
f2c0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 73       }.        s
f2d0: 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76  qlite3VdbeResolv
f2e0: 65 4c 61 62 65 6c 28 76 2c 20 69 43 6f 6e 74 29  eLabel(v, iCont)
f2f0: 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
f300: 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
f310: 5f 4e 65 78 74 2c 20 75 6e 69 6f 6e 54 61 62 2c  _Next, unionTab,
f320: 20 69 53 74 61 72 74 29 3b 0a 20 20 20 20 20 20   iStart);.      
f330: 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73    sqlite3VdbeRes
f340: 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 69 42 72  olveLabel(v, iBr
f350: 65 61 6b 29 3b 0a 20 20 20 20 20 20 20 20 73 71  eak);.        sq
f360: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
f370: 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 75 6e 69 6f  , OP_Close, unio
f380: 6e 54 61 62 2c 20 30 29 3b 0a 20 20 20 20 20 20  nTab, 0);.      
f390: 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  }.      break;. 
f3a0: 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b     }.    case TK
f3b0: 5f 49 4e 54 45 52 53 45 43 54 3a 20 7b 0a 20 20  _INTERSECT: {.  
f3c0: 20 20 20 20 69 6e 74 20 74 61 62 31 2c 20 74 61      int tab1, ta
f3d0: 62 32 3b 0a 20 20 20 20 20 20 69 6e 74 20 69 43  b2;.      int iC
f3e0: 6f 6e 74 2c 20 69 42 72 65 61 6b 2c 20 69 53 74  ont, iBreak, iSt
f3f0: 61 72 74 3b 0a 20 20 20 20 20 20 45 78 70 72 20  art;.      Expr 
f400: 2a 70 4c 69 6d 69 74 2c 20 2a 70 4f 66 66 73 65  *pLimit, *pOffse
f410: 74 3b 0a 20 20 20 20 20 20 69 6e 74 20 61 64 64  t;.      int add
f420: 72 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 49 4e 54  r;..      /* INT
f430: 45 52 53 45 43 54 20 69 73 20 64 69 66 66 65 72  ERSECT is differ
f440: 65 6e 74 20 66 72 6f 6d 20 74 68 65 20 6f 74 68  ent from the oth
f450: 65 72 73 20 73 69 6e 63 65 20 69 74 20 72 65 71  ers since it req
f460: 75 69 72 65 73 0a 20 20 20 20 20 20 2a 2a 20 74  uires.      ** t
f470: 77 6f 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62  wo temporary tab
f480: 6c 65 73 2e 20 20 48 65 6e 63 65 20 69 74 20 68  les.  Hence it h
f490: 61 73 20 69 74 73 20 6f 77 6e 20 63 61 73 65 2e  as its own case.
f4a0: 20 20 42 65 67 69 6e 0a 20 20 20 20 20 20 2a 2a    Begin.      **
f4b0: 20 62 79 20 61 6c 6c 6f 63 61 74 69 6e 67 20 74   by allocating t
f4c0: 68 65 20 74 61 62 6c 65 73 20 77 65 20 77 69 6c  he tables we wil
f4d0: 6c 20 6e 65 65 64 2e 0a 20 20 20 20 20 20 2a 2f  l need..      */
f4e0: 0a 20 20 20 20 20 20 74 61 62 31 20 3d 20 70 50  .      tab1 = pP
f4f0: 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20  arse->nTab++;.  
f500: 20 20 20 20 74 61 62 32 20 3d 20 70 50 61 72 73      tab2 = pPars
f510: 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20 20  e->nTab++;.     
f520: 20 69 66 28 20 70 4f 72 64 65 72 42 79 20 26 26   if( pOrderBy &&
f530: 20 6d 61 74 63 68 4f 72 64 65 72 62 79 54 6f 43   matchOrderbyToC
f540: 6f 6c 75 6d 6e 28 70 50 61 72 73 65 2c 70 2c 70  olumn(pParse,p,p
f550: 4f 72 64 65 72 42 79 2c 74 61 62 31 2c 31 29 20  OrderBy,tab1,1) 
f560: 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
f570: 31 3b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20  1;.        goto 
f580: 6d 75 6c 74 69 5f 73 65 6c 65 63 74 5f 65 6e 64  multi_select_end
f590: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
f5a0: 63 72 65 61 74 65 53 6f 72 74 69 6e 67 49 6e 64  createSortingInd
f5b0: 65 78 28 70 50 61 72 73 65 2c 20 70 2c 20 70 4f  ex(pParse, p, pO
f5c0: 72 64 65 72 42 79 29 3b 0a 0a 20 20 20 20 20 20  rderBy);..      
f5d0: 61 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64  addr = sqlite3Vd
f5e0: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4f 70  beAddOp(v, OP_Op
f5f0: 65 6e 45 70 68 65 6d 65 72 61 6c 2c 20 74 61 62  enEphemeral, tab
f600: 31 2c 20 30 29 3b 0a 20 20 20 20 20 20 61 73 73  1, 0);.      ass
f610: 65 72 74 28 20 70 2d 3e 61 64 64 72 4f 70 65 6e  ert( p->addrOpen
f620: 45 70 68 6d 5b 30 5d 20 3d 3d 20 2d 31 20 29 3b  Ephm[0] == -1 );
f630: 0a 20 20 20 20 20 20 70 2d 3e 61 64 64 72 4f 70  .      p->addrOp
f640: 65 6e 45 70 68 6d 5b 30 5d 20 3d 20 61 64 64 72  enEphm[0] = addr
f650: 3b 0a 20 20 20 20 20 20 70 2d 3e 70 52 69 67 68  ;.      p->pRigh
f660: 74 6d 6f 73 74 2d 3e 75 73 65 73 45 70 68 6d 20  tmost->usesEphm 
f670: 3d 20 31 3b 0a 20 20 20 20 20 20 61 73 73 65 72  = 1;.      asser
f680: 74 28 20 70 2d 3e 70 45 4c 69 73 74 20 29 3b 0a  t( p->pEList );.
f690: 0a 20 20 20 20 20 20 2f 2a 20 43 6f 64 65 20 74  .      /* Code t
f6a0: 68 65 20 53 45 4c 45 43 54 73 20 74 6f 20 6f 75  he SELECTs to ou
f6b0: 72 20 6c 65 66 74 20 69 6e 74 6f 20 74 65 6d 70  r left into temp
f6c0: 6f 72 61 72 79 20 74 61 62 6c 65 20 22 74 61 62  orary table "tab
f6d0: 31 22 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  1"..      */.   
f6e0: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 53     rc = sqlite3S
f6f0: 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70 50  elect(pParse, pP
f700: 72 69 6f 72 2c 20 53 52 54 5f 55 6e 69 6f 6e 2c  rior, SRT_Union,
f710: 20 74 61 62 31 2c 20 30 2c 20 30 2c 20 30 2c 20   tab1, 0, 0, 0, 
f720: 61 66 66 29 3b 0a 20 20 20 20 20 20 69 66 28 20  aff);.      if( 
f730: 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20 67 6f  rc ){.        go
f740: 74 6f 20 6d 75 6c 74 69 5f 73 65 6c 65 63 74 5f  to multi_select_
f750: 65 6e 64 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20  end;.      }..  
f760: 20 20 20 20 2f 2a 20 43 6f 64 65 20 74 68 65 20      /* Code the 
f770: 63 75 72 72 65 6e 74 20 53 45 4c 45 43 54 20 69  current SELECT i
f780: 6e 74 6f 20 74 65 6d 70 6f 72 61 72 79 20 74 61  nto temporary ta
f790: 62 6c 65 20 22 74 61 62 32 22 0a 20 20 20 20 20  ble "tab2".     
f7a0: 20 2a 2f 0a 20 20 20 20 20 20 61 64 64 72 20 3d   */.      addr =
f7b0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
f7c0: 70 28 76 2c 20 4f 50 5f 4f 70 65 6e 45 70 68 65  p(v, OP_OpenEphe
f7d0: 6d 65 72 61 6c 2c 20 74 61 62 32 2c 20 30 29 3b  meral, tab2, 0);
f7e0: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
f7f0: 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b 31  ->addrOpenEphm[1
f800: 5d 20 3d 3d 20 2d 31 20 29 3b 0a 20 20 20 20 20  ] == -1 );.     
f810: 20 70 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d   p->addrOpenEphm
f820: 5b 31 5d 20 3d 20 61 64 64 72 3b 0a 20 20 20 20  [1] = addr;.    
f830: 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d 20 30 3b    p->pPrior = 0;
f840: 0a 20 20 20 20 20 20 70 4c 69 6d 69 74 20 3d 20  .      pLimit = 
f850: 70 2d 3e 70 4c 69 6d 69 74 3b 0a 20 20 20 20 20  p->pLimit;.     
f860: 20 70 2d 3e 70 4c 69 6d 69 74 20 3d 20 30 3b 0a   p->pLimit = 0;.
f870: 20 20 20 20 20 20 70 4f 66 66 73 65 74 20 3d 20        pOffset = 
f880: 70 2d 3e 70 4f 66 66 73 65 74 3b 0a 20 20 20 20  p->pOffset;.    
f890: 20 20 70 2d 3e 70 4f 66 66 73 65 74 20 3d 20 30    p->pOffset = 0
f8a0: 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  ;.      rc = sql
f8b0: 69 74 65 33 53 65 6c 65 63 74 28 70 50 61 72 73  ite3Select(pPars
f8c0: 65 2c 20 70 2c 20 53 52 54 5f 55 6e 69 6f 6e 2c  e, p, SRT_Union,
f8d0: 20 74 61 62 32 2c 20 30 2c 20 30 2c 20 30 2c 20   tab2, 0, 0, 0, 
f8e0: 61 66 66 29 3b 0a 20 20 20 20 20 20 70 2d 3e 70  aff);.      p->p
f8f0: 50 72 69 6f 72 20 3d 20 70 50 72 69 6f 72 3b 0a  Prior = pPrior;.
f900: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
f910: 72 44 65 6c 65 74 65 28 70 2d 3e 70 4c 69 6d 69  rDelete(p->pLimi
f920: 74 29 3b 0a 20 20 20 20 20 20 70 2d 3e 70 4c 69  t);.      p->pLi
f930: 6d 69 74 20 3d 20 70 4c 69 6d 69 74 3b 0a 20 20  mit = pLimit;.  
f940: 20 20 20 20 70 2d 3e 70 4f 66 66 73 65 74 20 3d      p->pOffset =
f950: 20 70 4f 66 66 73 65 74 3b 0a 20 20 20 20 20 20   pOffset;.      
f960: 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20  if( rc ){.      
f970: 20 20 67 6f 74 6f 20 6d 75 6c 74 69 5f 73 65 6c    goto multi_sel
f980: 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 20 20 7d  ect_end;.      }
f990: 0a 0a 20 20 20 20 20 20 2f 2a 20 47 65 6e 65 72  ..      /* Gener
f9a0: 61 74 65 20 63 6f 64 65 20 74 6f 20 74 61 6b 65  ate code to take
f9b0: 20 74 68 65 20 69 6e 74 65 72 73 65 63 74 69 6f   the intersectio
f9c0: 6e 20 6f 66 20 74 68 65 20 74 77 6f 20 74 65 6d  n of the two tem
f9d0: 70 6f 72 61 72 79 0a 20 20 20 20 20 20 2a 2a 20  porary.      ** 
f9e0: 74 61 62 6c 65 73 2e 0a 20 20 20 20 20 20 2a 2f  tables..      */
f9f0: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
fa00: 2d 3e 70 45 4c 69 73 74 20 29 3b 0a 20 20 20 20  ->pEList );.    
fa10: 20 20 69 66 28 20 65 44 65 73 74 3d 3d 53 52 54    if( eDest==SRT
fa20: 5f 43 61 6c 6c 62 61 63 6b 20 29 7b 0a 20 20 20  _Callback ){.   
fa30: 20 20 20 20 20 53 65 6c 65 63 74 20 2a 70 46 69       Select *pFi
fa40: 72 73 74 20 3d 20 70 3b 0a 20 20 20 20 20 20 20  rst = p;.       
fa50: 20 77 68 69 6c 65 28 20 70 46 69 72 73 74 2d 3e   while( pFirst->
fa60: 70 50 72 69 6f 72 20 29 20 70 46 69 72 73 74 20  pPrior ) pFirst 
fa70: 3d 20 70 46 69 72 73 74 2d 3e 70 50 72 69 6f 72  = pFirst->pPrior
fa80: 3b 0a 20 20 20 20 20 20 20 20 67 65 6e 65 72 61  ;.        genera
fa90: 74 65 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 70 50  teColumnNames(pP
faa0: 61 72 73 65 2c 20 30 2c 20 70 46 69 72 73 74 2d  arse, 0, pFirst-
fab0: 3e 70 45 4c 69 73 74 29 3b 0a 20 20 20 20 20 20  >pEList);.      
fac0: 7d 0a 20 20 20 20 20 20 69 42 72 65 61 6b 20 3d  }.      iBreak =
fad0: 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65   sqlite3VdbeMake
fae0: 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 20 20  Label(v);.      
faf0: 69 43 6f 6e 74 20 3d 20 73 71 6c 69 74 65 33 56  iCont = sqlite3V
fb00: 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b  dbeMakeLabel(v);
fb10: 0a 20 20 20 20 20 20 63 6f 6d 70 75 74 65 4c 69  .      computeLi
fb20: 6d 69 74 52 65 67 69 73 74 65 72 73 28 70 50 61  mitRegisters(pPa
fb30: 72 73 65 2c 20 70 2c 20 69 42 72 65 61 6b 29 3b  rse, p, iBreak);
fb40: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
fb50: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 52 65  beAddOp(v, OP_Re
fb60: 77 69 6e 64 2c 20 74 61 62 31 2c 20 69 42 72 65  wind, tab1, iBre
fb70: 61 6b 29 3b 0a 20 20 20 20 20 20 69 53 74 61 72  ak);.      iStar
fb80: 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41  t = sqlite3VdbeA
fb90: 64 64 4f 70 28 76 2c 20 4f 50 5f 52 6f 77 4b 65  ddOp(v, OP_RowKe
fba0: 79 2c 20 74 61 62 31 2c 20 30 29 3b 0a 20 20 20  y, tab1, 0);.   
fbb0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
fbc0: 64 4f 70 28 76 2c 20 4f 50 5f 4e 6f 74 46 6f 75  dOp(v, OP_NotFou
fbd0: 6e 64 2c 20 74 61 62 32 2c 20 69 43 6f 6e 74 29  nd, tab2, iCont)
fbe0: 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 65 6c  ;.      rc = sel
fbf0: 65 63 74 49 6e 6e 65 72 4c 6f 6f 70 28 70 50 61  ectInnerLoop(pPa
fc00: 72 73 65 2c 20 70 2c 20 70 2d 3e 70 45 4c 69 73  rse, p, p->pELis
fc10: 74 2c 20 74 61 62 31 2c 20 70 2d 3e 70 45 4c 69  t, tab1, p->pELi
fc20: 73 74 2d 3e 6e 45 78 70 72 2c 0a 20 20 20 20 20  st->nExpr,.     
fc30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fc40: 20 20 20 20 20 20 20 20 70 4f 72 64 65 72 42 79          pOrderBy
fc50: 2c 20 2d 31 2c 20 65 44 65 73 74 2c 20 69 50 61  , -1, eDest, iPa
fc60: 72 6d 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20  rm, .           
fc70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fc80: 20 20 69 43 6f 6e 74 2c 20 69 42 72 65 61 6b 2c    iCont, iBreak,
fc90: 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72   0);.      if( r
fca0: 63 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  c ){.        rc 
fcb0: 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 67 6f 74  = 1;.        got
fcc0: 6f 20 6d 75 6c 74 69 5f 73 65 6c 65 63 74 5f 65  o multi_select_e
fcd0: 6e 64 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  nd;.      }.    
fce0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73    sqlite3VdbeRes
fcf0: 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 69 43 6f  olveLabel(v, iCo
fd00: 6e 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  nt);.      sqlit
fd10: 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
fd20: 50 5f 4e 65 78 74 2c 20 74 61 62 31 2c 20 69 53  P_Next, tab1, iS
fd30: 74 61 72 74 29 3b 0a 20 20 20 20 20 20 73 71 6c  tart);.      sql
fd40: 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c  ite3VdbeResolveL
fd50: 61 62 65 6c 28 76 2c 20 69 42 72 65 61 6b 29 3b  abel(v, iBreak);
fd60: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
fd70: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 43 6c  beAddOp(v, OP_Cl
fd80: 6f 73 65 2c 20 74 61 62 32 2c 20 30 29 3b 0a 20  ose, tab2, 0);. 
fd90: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
fda0: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 43 6c 6f 73  AddOp(v, OP_Clos
fdb0: 65 2c 20 74 61 62 31 2c 20 30 29 3b 0a 20 20 20  e, tab1, 0);.   
fdc0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
fdd0: 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 73    }..  /* Make s
fde0: 75 72 65 20 61 6c 6c 20 53 45 4c 45 43 54 73 20  ure all SELECTs 
fdf0: 69 6e 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74  in the statement
fe00: 20 68 61 76 65 20 74 68 65 20 73 61 6d 65 20 6e   have the same n
fe10: 75 6d 62 65 72 20 6f 66 20 65 6c 65 6d 65 6e 74  umber of element
fe20: 73 0a 20 20 2a 2a 20 69 6e 20 74 68 65 69 72 20  s.  ** in their 
fe30: 72 65 73 75 6c 74 20 73 65 74 73 2e 0a 20 20 2a  result sets..  *
fe40: 2f 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70  /.  assert( p->p
fe50: 45 4c 69 73 74 20 26 26 20 70 50 72 69 6f 72 2d  EList && pPrior-
fe60: 3e 70 45 4c 69 73 74 20 29 3b 0a 20 20 69 66 28  >pEList );.  if(
fe70: 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70   p->pEList->nExp
fe80: 72 21 3d 70 50 72 69 6f 72 2d 3e 70 45 4c 69 73  r!=pPrior->pELis
fe90: 74 2d 3e 6e 45 78 70 72 20 29 7b 0a 20 20 20 20  t->nExpr ){.    
fea0: 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
feb0: 70 50 61 72 73 65 2c 20 22 53 45 4c 45 43 54 73  pParse, "SELECTs
fec0: 20 74 6f 20 74 68 65 20 6c 65 66 74 20 61 6e 64   to the left and
fed0: 20 72 69 67 68 74 20 6f 66 20 25 73 22 0a 20 20   right of %s".  
fee0: 20 20 20 20 22 20 64 6f 20 6e 6f 74 20 68 61 76      " do not hav
fef0: 65 20 74 68 65 20 73 61 6d 65 20 6e 75 6d 62 65  e the same numbe
ff00: 72 20 6f 66 20 72 65 73 75 6c 74 20 63 6f 6c 75  r of result colu
ff10: 6d 6e 73 22 2c 20 73 65 6c 65 63 74 4f 70 4e 61  mns", selectOpNa
ff20: 6d 65 28 70 2d 3e 6f 70 29 29 3b 0a 20 20 20 20  me(p->op));.    
ff30: 72 63 20 3d 20 31 3b 0a 20 20 20 20 67 6f 74 6f  rc = 1;.    goto
ff40: 20 6d 75 6c 74 69 5f 73 65 6c 65 63 74 5f 65 6e   multi_select_en
ff50: 64 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 65 74  d;.  }..  /* Set
ff60: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 63   the number of c
ff70: 6f 6c 75 6d 6e 73 20 69 6e 20 74 65 6d 70 6f 72  olumns in tempor
ff80: 61 72 79 20 74 61 62 6c 65 73 0a 20 20 2a 2f 0a  ary tables.  */.
ff90: 20 20 6e 43 6f 6c 20 3d 20 70 2d 3e 70 45 4c 69    nCol = p->pELi
ffa0: 73 74 2d 3e 6e 45 78 70 72 3b 0a 20 20 77 68 69  st->nExpr;.  whi
ffb0: 6c 65 28 20 6e 53 65 74 50 32 20 29 7b 0a 20 20  le( nSetP2 ){.  
ffc0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61    sqlite3VdbeCha
ffd0: 6e 67 65 50 32 28 76 2c 20 61 53 65 74 50 32 5b  ngeP2(v, aSetP2[
ffe0: 2d 2d 6e 53 65 74 50 32 5d 2c 20 6e 43 6f 6c 29  --nSetP2], nCol)
fff0: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 6f 6d 70  ;.  }..  /* Comp
10000 75 74 65 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65  ute collating se
10010 71 75 65 6e 63 65 73 20 75 73 65 64 20 62 79 20  quences used by 
10020 65 69 74 68 65 72 20 74 68 65 20 4f 52 44 45 52  either the ORDER
10030 20 42 59 20 63 6c 61 75 73 65 20 6f 72 0a 20 20   BY clause or.  
10040 2a 2a 20 62 79 20 61 6e 79 20 74 65 6d 70 6f 72  ** by any tempor
10050 61 72 79 20 74 61 62 6c 65 73 20 6e 65 65 64 65  ary tables neede
10060 64 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 74  d to implement t
10070 68 65 20 63 6f 6d 70 6f 75 6e 64 20 73 65 6c 65  he compound sele
10080 63 74 2e 0a 20 20 2a 2a 20 41 74 74 61 63 68 20  ct..  ** Attach 
10090 74 68 65 20 4b 65 79 49 6e 66 6f 20 73 74 72 75  the KeyInfo stru
100a0 63 74 75 72 65 20 74 6f 20 61 6c 6c 20 74 65 6d  cture to all tem
100b0 70 6f 72 61 72 79 20 74 61 62 6c 65 73 2e 20 20  porary tables.  
100c0 49 6e 76 6f 6b 65 20 74 68 65 0a 20 20 2a 2a 20  Invoke the.  ** 
100d0 4f 52 44 45 52 20 42 59 20 70 72 6f 63 65 73 73  ORDER BY process
100e0 69 6e 67 20 69 66 20 74 68 65 72 65 20 69 73 20  ing if there is 
100f0 61 6e 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75  an ORDER BY clau
10100 73 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68  se..  **.  ** Th
10110 69 73 20 73 65 63 74 69 6f 6e 20 69 73 20 72 75  is section is ru
10120 6e 20 62 79 20 74 68 65 20 72 69 67 68 74 2d 6d  n by the right-m
10130 6f 73 74 20 53 45 4c 45 43 54 20 73 74 61 74 65  ost SELECT state
10140 6d 65 6e 74 20 6f 6e 6c 79 2e 0a 20 20 2a 2a 20  ment only..  ** 
10150 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
10160 73 20 74 6f 20 74 68 65 20 6c 65 66 74 20 61 6c  s to the left al
10170 77 61 79 73 20 73 6b 69 70 20 74 68 69 73 20 70  ways skip this p
10180 61 72 74 2e 20 20 54 68 65 20 72 69 67 68 74 2d  art.  The right-
10190 6d 6f 73 74 0a 20 20 2a 2a 20 53 45 4c 45 43 54  most.  ** SELECT
101a0 20 6d 69 67 68 74 20 61 6c 73 6f 20 73 6b 69 70   might also skip
101b0 20 74 68 69 73 20 70 61 72 74 20 69 66 20 69 74   this part if it
101c0 20 68 61 73 20 6e 6f 20 4f 52 44 45 52 20 42 59   has no ORDER BY
101d0 20 63 6c 61 75 73 65 20 61 6e 64 0a 20 20 2a 2a   clause and.  **
101e0 20 6e 6f 20 74 65 6d 70 20 74 61 62 6c 65 73 20   no temp tables 
101f0 61 72 65 20 72 65 71 75 69 72 65 64 2e 0a 20 20  are required..  
10200 2a 2f 0a 20 20 69 66 28 20 70 4f 72 64 65 72 42  */.  if( pOrderB
10210 79 20 7c 7c 20 70 2d 3e 75 73 65 73 45 70 68 6d  y || p->usesEphm
10220 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 20 20   ){.    int i;  
10230 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10240 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f        /* Loop co
10250 75 6e 74 65 72 20 2a 2f 0a 20 20 20 20 4b 65 79  unter */.    Key
10260 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 3b 20  Info *pKeyInfo; 
10270 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f             /* Co
10280 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65  llating sequence
10290 20 66 6f 72 20 74 68 65 20 72 65 73 75 6c 74 20   for the result 
102a0 73 65 74 20 2a 2f 0a 20 20 20 20 53 65 6c 65 63  set */.    Selec
102b0 74 20 2a 70 4c 6f 6f 70 3b 20 20 20 20 20 20 20  t *pLoop;       
102c0 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6f 72 20           /* For 
102d0 6c 6f 6f 70 69 6e 67 20 74 68 72 6f 75 67 68 20  looping through 
102e0 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
102f0 73 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 4b 65  s */.    int nKe
10300 79 43 6f 6c 3b 20 20 20 20 20 20 20 20 20 20 20  yCol;           
10310 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
10320 20 6f 66 20 65 6e 74 72 69 65 73 20 69 6e 20 70   of entries in p
10330 4b 65 79 49 6e 66 6f 2d 3e 61 43 6f 6c 5b 5d 20  KeyInfo->aCol[] 
10340 2a 2f 0a 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a  */.    CollSeq *
10350 2a 61 70 43 6f 6c 6c 3b 20 20 20 20 20 20 20 20  *apColl;        
10360 20 20 20 20 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70       /* For loop
10370 69 6e 67 20 74 68 72 6f 75 67 68 20 70 4b 65 79  ing through pKey
10380 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b 5d 20 2a 2f  Info->aColl[] */
10390 0a 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a 2a 61  .    CollSeq **a
103a0 43 6f 70 79 3b 20 20 20 20 20 20 20 20 20 20 20  Copy;           
103b0 20 20 20 2f 2a 20 41 20 63 6f 70 79 20 6f 66 20     /* A copy of 
103c0 70 4b 65 79 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b  pKeyInfo->aColl[
103d0 5d 20 2a 2f 0a 0a 20 20 20 20 61 73 73 65 72 74  ] */..    assert
103e0 28 20 70 2d 3e 70 52 69 67 68 74 6d 6f 73 74 3d  ( p->pRightmost=
103f0 3d 70 20 29 3b 0a 20 20 20 20 6e 4b 65 79 43 6f  =p );.    nKeyCo
10400 6c 20 3d 20 6e 43 6f 6c 20 2b 20 28 70 4f 72 64  l = nCol + (pOrd
10410 65 72 42 79 20 3f 20 70 4f 72 64 65 72 42 79 2d  erBy ? pOrderBy-
10420 3e 6e 45 78 70 72 20 3a 20 30 29 3b 0a 20 20 20  >nExpr : 0);.   
10430 20 70 4b 65 79 49 6e 66 6f 20 3d 20 73 71 6c 69   pKeyInfo = sqli
10440 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28  te3DbMallocZero(
10450 70 50 61 72 73 65 2d 3e 64 62 2c 0a 20 20 20 20  pParse->db,.    
10460 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10470 20 20 20 73 69 7a 65 6f 66 28 2a 70 4b 65 79 49     sizeof(*pKeyI
10480 6e 66 6f 29 2b 6e 4b 65 79 43 6f 6c 2a 28 73 69  nfo)+nKeyCol*(si
10490 7a 65 6f 66 28 43 6f 6c 6c 53 65 71 2a 29 20 2b  zeof(CollSeq*) +
104a0 20 31 29 29 3b 0a 20 20 20 20 69 66 28 20 21 70   1));.    if( !p
104b0 4b 65 79 49 6e 66 6f 20 29 7b 0a 20 20 20 20 20  KeyInfo ){.     
104c0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d   rc = SQLITE_NOM
104d0 45 4d 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 6d  EM;.      goto m
104e0 75 6c 74 69 5f 73 65 6c 65 63 74 5f 65 6e 64 3b  ulti_select_end;
104f0 0a 20 20 20 20 7d 0a 0a 20 20 20 20 70 4b 65 79  .    }..    pKey
10500 49 6e 66 6f 2d 3e 65 6e 63 20 3d 20 45 4e 43 28  Info->enc = ENC(
10510 70 50 61 72 73 65 2d 3e 64 62 29 3b 0a 20 20 20  pParse->db);.   
10520 20 70 4b 65 79 49 6e 66 6f 2d 3e 6e 46 69 65 6c   pKeyInfo->nFiel
10530 64 20 3d 20 6e 43 6f 6c 3b 0a 0a 20 20 20 20 66  d = nCol;..    f
10540 6f 72 28 69 3d 30 2c 20 61 70 43 6f 6c 6c 3d 70  or(i=0, apColl=p
10550 4b 65 79 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 3b 20  KeyInfo->aColl; 
10560 69 3c 6e 43 6f 6c 3b 20 69 2b 2b 2c 20 61 70 43  i<nCol; i++, apC
10570 6f 6c 6c 2b 2b 29 7b 0a 20 20 20 20 20 20 2a 61  oll++){.      *a
10580 70 43 6f 6c 6c 20 3d 20 6d 75 6c 74 69 53 65 6c  pColl = multiSel
10590 65 63 74 43 6f 6c 6c 53 65 71 28 70 50 61 72 73  ectCollSeq(pPars
105a0 65 2c 20 70 2c 20 69 29 3b 0a 20 20 20 20 20 20  e, p, i);.      
105b0 69 66 28 20 30 3d 3d 2a 61 70 43 6f 6c 6c 20 29  if( 0==*apColl )
105c0 7b 0a 20 20 20 20 20 20 20 20 2a 61 70 43 6f 6c  {.        *apCol
105d0 6c 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e  l = pParse->db->
105e0 70 44 66 6c 74 43 6f 6c 6c 3b 0a 20 20 20 20 20  pDfltColl;.     
105f0 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 66 6f   }.    }..    fo
10600 72 28 70 4c 6f 6f 70 3d 70 3b 20 70 4c 6f 6f 70  r(pLoop=p; pLoop
10610 3b 20 70 4c 6f 6f 70 3d 70 4c 6f 6f 70 2d 3e 70  ; pLoop=pLoop->p
10620 50 72 69 6f 72 29 7b 0a 20 20 20 20 20 20 66 6f  Prior){.      fo
10630 72 28 69 3d 30 3b 20 69 3c 32 3b 20 69 2b 2b 29  r(i=0; i<2; i++)
10640 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 61 64  {.        int ad
10650 64 72 20 3d 20 70 4c 6f 6f 70 2d 3e 61 64 64 72  dr = pLoop->addr
10660 4f 70 65 6e 45 70 68 6d 5b 69 5d 3b 0a 20 20 20  OpenEphm[i];.   
10670 20 20 20 20 20 69 66 28 20 61 64 64 72 3c 30 20       if( addr<0 
10680 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ){.          /* 
10690 49 66 20 5b 30 5d 20 69 73 20 75 6e 75 73 65 64  If [0] is unused
106a0 20 74 68 65 6e 20 5b 31 5d 20 69 73 20 61 6c 73   then [1] is als
106b0 6f 20 75 6e 75 73 65 64 2e 20 20 53 6f 20 77 65  o unused.  So we
106c0 20 63 61 6e 0a 20 20 20 20 20 20 20 20 20 20 2a   can.          *
106d0 2a 20 61 6c 77 61 79 73 20 73 61 66 65 6c 79 20  * always safely 
106e0 61 62 6f 72 74 20 61 73 20 73 6f 6f 6e 20 61 73  abort as soon as
106f0 20 74 68 65 20 66 69 72 73 74 20 75 6e 75 73 65   the first unuse
10700 64 20 73 6c 6f 74 20 69 73 20 66 6f 75 6e 64 20  d slot is found 
10710 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 61 73 73  */.          ass
10720 65 72 74 28 20 70 4c 6f 6f 70 2d 3e 61 64 64 72  ert( pLoop->addr
10730 4f 70 65 6e 45 70 68 6d 5b 31 5d 3c 30 20 29 3b  OpenEphm[1]<0 );
10740 0a 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b  .          break
10750 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
10760 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43      sqlite3VdbeC
10770 68 61 6e 67 65 50 32 28 76 2c 20 61 64 64 72 2c  hangeP2(v, addr,
10780 20 6e 43 6f 6c 29 3b 0a 20 20 20 20 20 20 20 20   nCol);.        
10790 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67  sqlite3VdbeChang
107a0 65 50 33 28 76 2c 20 61 64 64 72 2c 20 28 63 68  eP3(v, addr, (ch
107b0 61 72 2a 29 70 4b 65 79 49 6e 66 6f 2c 20 50 33  ar*)pKeyInfo, P3
107c0 5f 4b 45 59 49 4e 46 4f 29 3b 0a 20 20 20 20 20  _KEYINFO);.     
107d0 20 20 20 70 4c 6f 6f 70 2d 3e 61 64 64 72 4f 70     pLoop->addrOp
107e0 65 6e 45 70 68 6d 5b 69 5d 20 3d 20 2d 31 3b 0a  enEphm[i] = -1;.
107f0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20        }.    }.. 
10800 20 20 20 69 66 28 20 70 4f 72 64 65 72 42 79 20     if( pOrderBy 
10810 29 7b 0a 20 20 20 20 20 20 73 74 72 75 63 74 20  ){.      struct 
10820 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70  ExprList_item *p
10830 4f 54 65 72 6d 20 3d 20 70 4f 72 64 65 72 42 79  OTerm = pOrderBy
10840 2d 3e 61 3b 0a 20 20 20 20 20 20 69 6e 74 20 6e  ->a;.      int n
10850 4f 72 64 65 72 42 79 45 78 70 72 20 3d 20 70 4f  OrderByExpr = pO
10860 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 3b 0a 20  rderBy->nExpr;. 
10870 20 20 20 20 20 69 6e 74 20 61 64 64 72 3b 0a 20       int addr;. 
10880 20 20 20 20 20 75 38 20 2a 70 53 6f 72 74 4f 72       u8 *pSortOr
10890 64 65 72 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 52  der;..      /* R
108a0 65 75 73 65 20 74 68 65 20 73 61 6d 65 20 70 4b  euse the same pK
108b0 65 79 49 6e 66 6f 20 66 6f 72 20 74 68 65 20 4f  eyInfo for the O
108c0 52 44 45 52 20 42 59 20 61 73 20 77 61 73 20 75  RDER BY as was u
108d0 73 65 64 20 61 62 6f 76 65 20 66 6f 72 0a 20 20  sed above for.  
108e0 20 20 20 20 2a 2a 20 74 68 65 20 63 6f 6d 70 6f      ** the compo
108f0 75 6e 64 20 73 65 6c 65 63 74 20 73 74 61 74 65  und select state
10900 6d 65 6e 74 73 2e 20 20 45 78 63 65 70 74 20 77  ments.  Except w
10910 65 20 68 61 76 65 20 74 6f 20 63 68 61 6e 67 65  e have to change
10920 20 6f 75 74 20 74 68 65 0a 20 20 20 20 20 20 2a   out the.      *
10930 2a 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 43 6f 6c  * pKeyInfo->aCol
10940 6c 5b 5d 20 76 61 6c 75 65 73 2e 20 20 53 6f 6d  l[] values.  Som
10950 65 20 6f 66 20 74 68 65 20 61 43 6f 6c 6c 5b 5d  e of the aColl[]
10960 20 76 61 6c 75 65 73 20 77 69 6c 6c 20 62 65 0a   values will be.
10970 20 20 20 20 20 20 2a 2a 20 72 65 75 73 65 64 20        ** reused 
10980 77 68 65 6e 20 63 6f 6e 73 74 72 75 63 74 69 6e  when constructin
10990 67 20 74 68 65 20 70 4b 65 79 49 6e 66 6f 20 66  g the pKeyInfo f
109a0 6f 72 20 74 68 65 20 4f 52 44 45 52 20 42 59 2c  or the ORDER BY,
109b0 20 73 6f 20 6d 61 6b 65 0a 20 20 20 20 20 20 2a   so make.      *
109c0 2a 20 61 20 63 6f 70 79 2e 20 20 53 75 66 66 69  * a copy.  Suffi
109d0 63 69 65 6e 74 20 73 70 61 63 65 20 74 6f 20 68  cient space to h
109e0 6f 6c 64 20 62 6f 74 68 20 74 68 65 20 6e 43 6f  old both the nCo
109f0 6c 20 65 6e 74 72 69 65 73 20 66 6f 72 0a 20 20  l entries for.  
10a00 20 20 20 20 2a 2a 20 74 68 65 20 63 6f 6d 70 6f      ** the compo
10a10 75 6e 64 20 73 65 6c 65 63 74 20 61 6e 64 20 74  und select and t
10a20 68 65 20 6e 4f 72 64 65 72 62 79 45 78 70 72 20  he nOrderbyExpr 
10a30 65 6e 74 72 69 65 73 20 66 6f 72 20 74 68 65 20  entries for the 
10a40 4f 52 44 45 52 20 42 59 0a 20 20 20 20 20 20 2a  ORDER BY.      *
10a50 2a 20 77 61 73 20 61 6c 6c 6f 63 61 74 65 64 20  * was allocated 
10a60 61 62 6f 76 65 2e 20 20 42 75 74 20 77 65 20 6e  above.  But we n
10a70 65 65 64 20 74 6f 20 6d 6f 76 65 20 74 68 65 20  eed to move the 
10a80 63 6f 6d 70 6f 75 6e 64 20 73 65 6c 65 63 74 0a  compound select.
10a90 20 20 20 20 20 20 2a 2a 20 65 6e 74 72 69 65 73        ** entries
10aa0 20 6f 75 74 20 6f 66 20 74 68 65 20 77 61 79 20   out of the way 
10ab0 62 65 66 6f 72 65 20 63 6f 6e 73 74 72 75 63 74  before construct
10ac0 69 6e 67 20 74 68 65 20 4f 52 44 45 52 20 42 59  ing the ORDER BY
10ad0 20 65 6e 74 72 69 65 73 2e 0a 20 20 20 20 20 20   entries..      
10ae0 2a 2a 20 4d 6f 76 65 20 74 68 65 20 63 6f 6d 70  ** Move the comp
10af0 6f 75 6e 64 20 73 65 6c 65 63 74 20 65 6e 74 72  ound select entr
10b00 69 65 73 20 69 6e 74 6f 20 61 43 6f 70 79 5b 5d  ies into aCopy[]
10b10 20 77 68 65 72 65 20 74 68 65 79 20 63 61 6e 20   where they can 
10b20 62 65 0a 20 20 20 20 20 20 2a 2a 20 61 63 63 65  be.      ** acce
10b30 73 73 65 64 20 61 6e 64 20 72 65 75 73 65 64 20  ssed and reused 
10b40 77 68 65 6e 20 63 6f 6e 73 74 72 75 63 74 69 6e  when constructin
10b50 67 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 65  g the ORDER BY e
10b60 6e 74 72 69 65 73 2e 0a 20 20 20 20 20 20 2a 2a  ntries..      **
10b70 20 42 65 63 61 75 73 65 20 6e 43 6f 6c 20 6d 69   Because nCol mi
10b80 67 68 74 20 62 65 20 67 72 65 61 74 65 72 20 74  ght be greater t
10b90 68 61 6e 20 6f 72 20 6c 65 73 73 20 74 68 61 6e  han or less than
10ba0 20 6e 4f 72 64 65 72 42 79 45 78 70 72 0a 20 20   nOrderByExpr.  
10bb0 20 20 20 20 2a 2a 20 77 65 20 68 61 76 65 20 74      ** we have t
10bc0 6f 20 75 73 65 20 6d 65 6d 6d 6f 76 65 28 29 20  o use memmove() 
10bd0 77 68 65 6e 20 64 6f 69 6e 67 20 74 68 65 20 63  when doing the c
10be0 6f 70 79 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  opy..      */.  
10bf0 20 20 20 20 61 43 6f 70 79 20 3d 20 26 70 4b 65      aCopy = &pKe
10c00 79 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b 6e 4f 72  yInfo->aColl[nOr
10c10 64 65 72 42 79 45 78 70 72 5d 3b 0a 20 20 20 20  derByExpr];.    
10c20 20 20 70 53 6f 72 74 4f 72 64 65 72 20 3d 20 70    pSortOrder = p
10c30 4b 65 79 49 6e 66 6f 2d 3e 61 53 6f 72 74 4f 72  KeyInfo->aSortOr
10c40 64 65 72 20 3d 20 28 75 38 2a 29 26 61 43 6f 70  der = (u8*)&aCop
10c50 79 5b 6e 43 6f 6c 5d 3b 0a 20 20 20 20 20 20 6d  y[nCol];.      m
10c60 65 6d 6d 6f 76 65 28 61 43 6f 70 79 2c 20 70 4b  emmove(aCopy, pK
10c70 65 79 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 2c 20 6e  eyInfo->aColl, n
10c80 43 6f 6c 2a 73 69 7a 65 6f 66 28 43 6f 6c 6c 53  Col*sizeof(CollS
10c90 65 71 2a 29 29 3b 0a 0a 20 20 20 20 20 20 61 70  eq*));..      ap
10ca0 43 6f 6c 6c 20 3d 20 70 4b 65 79 49 6e 66 6f 2d  Coll = pKeyInfo-
10cb0 3e 61 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 66 6f  >aColl;.      fo
10cc0 72 28 69 3d 30 3b 20 69 3c 6e 4f 72 64 65 72 42  r(i=0; i<nOrderB
10cd0 79 45 78 70 72 3b 20 69 2b 2b 2c 20 70 4f 54 65  yExpr; i++, pOTe
10ce0 72 6d 2b 2b 2c 20 61 70 43 6f 6c 6c 2b 2b 2c 20  rm++, apColl++, 
10cf0 70 53 6f 72 74 4f 72 64 65 72 2b 2b 29 7b 0a 20  pSortOrder++){. 
10d00 20 20 20 20 20 20 20 45 78 70 72 20 2a 70 45 78         Expr *pEx
10d10 70 72 20 3d 20 70 4f 54 65 72 6d 2d 3e 70 45 78  pr = pOTerm->pEx
10d20 70 72 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  pr;.        if( 
10d30 28 70 45 78 70 72 2d 3e 66 6c 61 67 73 20 26 20  (pExpr->flags & 
10d40 45 50 5f 45 78 70 43 6f 6c 6c 61 74 65 29 20 29  EP_ExpCollate) )
10d50 7b 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65  {.          asse
10d60 72 74 28 20 70 45 78 70 72 2d 3e 70 43 6f 6c 6c  rt( pExpr->pColl
10d70 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 20  !=0 );.         
10d80 20 2a 61 70 43 6f 6c 6c 20 3d 20 70 45 78 70 72   *apColl = pExpr
10d90 2d 3e 70 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 20  ->pColl;.       
10da0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
10db0 20 20 2a 61 70 43 6f 6c 6c 20 3d 20 61 43 6f 70    *apColl = aCop
10dc0 79 5b 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e  y[pExpr->iColumn
10dd0 5d 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  ];.        }.   
10de0 20 20 20 20 20 2a 70 53 6f 72 74 4f 72 64 65 72       *pSortOrder
10df0 20 3d 20 70 4f 54 65 72 6d 2d 3e 73 6f 72 74 4f   = pOTerm->sortO
10e00 72 64 65 72 3b 0a 20 20 20 20 20 20 7d 0a 20 20  rder;.      }.  
10e10 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70      assert( p->p
10e20 52 69 67 68 74 6d 6f 73 74 3d 3d 70 20 29 3b 0a  Rightmost==p );.
10e30 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d        assert( p-
10e40 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b 32 5d  >addrOpenEphm[2]
10e50 3e 3d 30 20 29 3b 0a 20 20 20 20 20 20 61 64 64  >=0 );.      add
10e60 72 20 3d 20 70 2d 3e 61 64 64 72 4f 70 65 6e 45  r = p->addrOpenE
10e70 70 68 6d 5b 32 5d 3b 0a 20 20 20 20 20 20 73 71  phm[2];.      sq
10e80 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50  lite3VdbeChangeP
10e90 32 28 76 2c 20 61 64 64 72 2c 20 70 2d 3e 70 4f  2(v, addr, p->pO
10ea0 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 2b 32 29  rderBy->nExpr+2)
10eb0 3b 0a 20 20 20 20 20 20 70 4b 65 79 49 6e 66 6f  ;.      pKeyInfo
10ec0 2d 3e 6e 46 69 65 6c 64 20 3d 20 6e 4f 72 64 65  ->nField = nOrde
10ed0 72 42 79 45 78 70 72 3b 0a 20 20 20 20 20 20 73  rByExpr;.      s
10ee0 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65  qlite3VdbeChange
10ef0 50 33 28 76 2c 20 61 64 64 72 2c 20 28 63 68 61  P3(v, addr, (cha
10f00 72 2a 29 70 4b 65 79 49 6e 66 6f 2c 20 50 33 5f  r*)pKeyInfo, P3_
10f10 4b 45 59 49 4e 46 4f 5f 48 41 4e 44 4f 46 46 29  KEYINFO_HANDOFF)
10f20 3b 0a 20 20 20 20 20 20 70 4b 65 79 49 6e 66 6f  ;.      pKeyInfo
10f30 20 3d 20 30 3b 0a 20 20 20 20 20 20 67 65 6e 65   = 0;.      gene
10f40 72 61 74 65 53 6f 72 74 54 61 69 6c 28 70 50 61  rateSortTail(pPa
10f50 72 73 65 2c 20 70 2c 20 76 2c 20 70 2d 3e 70 45  rse, p, v, p->pE
10f60 4c 69 73 74 2d 3e 6e 45 78 70 72 2c 20 65 44 65  List->nExpr, eDe
10f70 73 74 2c 20 69 50 61 72 6d 29 3b 0a 20 20 20 20  st, iParm);.    
10f80 7d 0a 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66  }..    sqlite3_f
10f90 72 65 65 28 70 4b 65 79 49 6e 66 6f 29 3b 0a 20  ree(pKeyInfo);. 
10fa0 20 7d 0a 0a 6d 75 6c 74 69 5f 73 65 6c 65 63 74   }..multi_select
10fb0 5f 65 6e 64 3a 0a 20 20 72 65 74 75 72 6e 20 72  _end:.  return r
10fc0 63 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53  c;.}.#endif /* S
10fd0 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f 4d 50 4f  QLITE_OMIT_COMPO
10fe0 55 4e 44 5f 53 45 4c 45 43 54 20 2a 2f 0a 0a 23  UND_SELECT */..#
10ff0 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
11000 49 54 5f 56 49 45 57 0a 2f 2a 20 46 6f 72 77 61  IT_VIEW./* Forwa
11010 72 64 20 44 65 63 6c 61 72 61 74 69 6f 6e 73 20  rd Declarations 
11020 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73  */.static void s
11030 75 62 73 74 45 78 70 72 4c 69 73 74 28 73 71 6c  ubstExprList(sql
11040 69 74 65 33 2a 2c 20 45 78 70 72 4c 69 73 74 2a  ite3*, ExprList*
11050 2c 20 69 6e 74 2c 20 45 78 70 72 4c 69 73 74 2a  , int, ExprList*
11060 29 3b 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73  );.static void s
11070 75 62 73 74 53 65 6c 65 63 74 28 73 71 6c 69 74  ubstSelect(sqlit
11080 65 33 2a 2c 20 53 65 6c 65 63 74 20 2a 2c 20 69  e3*, Select *, i
11090 6e 74 2c 20 45 78 70 72 4c 69 73 74 20 2a 29 3b  nt, ExprList *);
110a0 0a 0a 2f 2a 0a 2a 2a 20 53 63 61 6e 20 74 68 72  ../*.** Scan thr
110b0 6f 75 67 68 20 74 68 65 20 65 78 70 72 65 73 73  ough the express
110c0 69 6f 6e 20 70 45 78 70 72 2e 20 20 52 65 70 6c  ion pExpr.  Repl
110d0 61 63 65 20 65 76 65 72 79 20 72 65 66 65 72 65  ace every refere
110e0 6e 63 65 20 74 6f 0a 2a 2a 20 61 20 63 6f 6c 75  nce to.** a colu
110f0 6d 6e 20 69 6e 20 74 61 62 6c 65 20 6e 75 6d 62  mn in table numb
11100 65 72 20 69 54 61 62 6c 65 20 77 69 74 68 20 61  er iTable with a
11110 20 63 6f 70 79 20 6f 66 20 74 68 65 20 69 43 6f   copy of the iCo
11120 6c 75 6d 6e 2d 74 68 0a 2a 2a 20 65 6e 74 72 79  lumn-th.** entry
11130 20 69 6e 20 70 45 4c 69 73 74 2e 20 20 28 42 75   in pEList.  (Bu
11140 74 20 6c 65 61 76 65 20 72 65 66 65 72 65 6e 63  t leave referenc
11150 65 73 20 74 6f 20 74 68 65 20 52 4f 57 49 44 20  es to the ROWID 
11160 63 6f 6c 75 6d 6e 20 0a 2a 2a 20 75 6e 63 68 61  column .** uncha
11170 6e 67 65 64 2e 29 0a 2a 2a 0a 2a 2a 20 54 68 69  nged.).**.** Thi
11180 73 20 72 6f 75 74 69 6e 65 20 69 73 20 70 61 72  s routine is par
11190 74 20 6f 66 20 74 68 65 20 66 6c 61 74 74 65 6e  t of the flatten
111a0 69 6e 67 20 70 72 6f 63 65 64 75 72 65 2e 20 20  ing procedure.  
111b0 41 20 73 75 62 71 75 65 72 79 0a 2a 2a 20 77 68  A subquery.** wh
111c0 6f 73 65 20 72 65 73 75 6c 74 20 73 65 74 20 69  ose result set i
111d0 73 20 64 65 66 69 6e 65 64 20 62 79 20 70 45 4c  s defined by pEL
111e0 69 73 74 20 61 70 70 65 61 72 73 20 61 73 20 65  ist appears as e
111f0 6e 74 72 79 20 69 6e 20 74 68 65 0a 2a 2a 20 46  ntry in the.** F
11200 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20 61 20  ROM clause of a 
11210 53 45 4c 45 43 54 20 73 75 63 68 20 74 68 61 74  SELECT such that
11220 20 74 68 65 20 56 44 42 45 20 63 75 72 73 6f 72   the VDBE cursor
11230 20 61 73 73 69 67 6e 65 64 20 74 6f 20 74 68 61   assigned to tha
11240 74 0a 2a 2a 20 46 4f 52 4d 20 63 6c 61 75 73 65  t.** FORM clause
11250 20 65 6e 74 72 79 20 69 73 20 69 54 61 62 6c 65   entry is iTable
11260 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  .  This routine 
11270 6d 61 6b 65 20 74 68 65 20 6e 65 63 65 73 73 61  make the necessa
11280 72 79 20 0a 2a 2a 20 63 68 61 6e 67 65 73 20 74  ry .** changes t
11290 6f 20 70 45 78 70 72 20 73 6f 20 74 68 61 74 20  o pExpr so that 
112a0 69 74 20 72 65 66 65 72 73 20 64 69 72 65 63 74  it refers direct
112b0 6c 79 20 74 6f 20 74 68 65 20 73 6f 75 72 63 65  ly to the source
112c0 20 74 61 62 6c 65 0a 2a 2a 20 6f 66 20 74 68 65   table.** of the
112d0 20 73 75 62 71 75 65 72 79 20 72 61 74 68 65 72   subquery rather
112e0 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 20   the result set 
112f0 6f 66 20 74 68 65 20 73 75 62 71 75 65 72 79 2e  of the subquery.
11300 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
11310 73 75 62 73 74 45 78 70 72 28 0a 20 20 73 71 6c  substExpr(.  sql
11320 69 74 65 33 20 2a 64 62 2c 20 20 20 20 20 20 20  ite3 *db,       
11330 20 2f 2a 20 52 65 70 6f 72 74 20 6d 61 6c 6c 6f   /* Report mallo
11340 63 20 65 72 72 6f 72 73 20 74 6f 20 74 68 69 73  c errors to this
11350 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20   connection */. 
11360 20 45 78 70 72 20 2a 70 45 78 70 72 2c 20 20 20   Expr *pExpr,   
11370 20 20 20 20 20 2f 2a 20 45 78 70 72 20 69 6e 20       /* Expr in 
11380 77 68 69 63 68 20 73 75 62 73 74 69 74 75 74 69  which substituti
11390 6f 6e 20 6f 63 63 75 72 73 20 2a 2f 0a 20 20 69  on occurs */.  i
113a0 6e 74 20 69 54 61 62 6c 65 2c 20 20 20 20 20 20  nt iTable,      
113b0 20 20 20 2f 2a 20 54 61 62 6c 65 20 74 6f 20 62     /* Table to b
113c0 65 20 73 75 62 73 74 69 74 75 74 65 64 20 2a 2f  e substituted */
113d0 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c  .  ExprList *pEL
113e0 69 73 74 20 20 20 20 2f 2a 20 53 75 62 73 74 69  ist    /* Substi
113f0 74 75 74 65 20 65 78 70 72 65 73 73 69 6f 6e 73  tute expressions
11400 20 2a 2f 0a 29 7b 0a 20 20 69 66 28 20 70 45 78   */.){.  if( pEx
11410 70 72 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a  pr==0 ) return;.
11420 20 20 69 66 28 20 70 45 78 70 72 2d 3e 6f 70 3d    if( pExpr->op=
11430 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 26 26 20 70 45  =TK_COLUMN && pE
11440 78 70 72 2d 3e 69 54 61 62 6c 65 3d 3d 69 54 61  xpr->iTable==iTa
11450 62 6c 65 20 29 7b 0a 20 20 20 20 69 66 28 20 70  ble ){.    if( p
11460 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3c 30 20  Expr->iColumn<0 
11470 29 7b 0a 20 20 20 20 20 20 70 45 78 70 72 2d 3e  ){.      pExpr->
11480 6f 70 20 3d 20 54 4b 5f 4e 55 4c 4c 3b 0a 20 20  op = TK_NULL;.  
11490 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 45    }else{.      E
114a0 78 70 72 20 2a 70 4e 65 77 3b 0a 20 20 20 20 20  xpr *pNew;.     
114b0 20 61 73 73 65 72 74 28 20 70 45 4c 69 73 74 21   assert( pEList!
114c0 3d 30 20 26 26 20 70 45 78 70 72 2d 3e 69 43 6f  =0 && pExpr->iCo
114d0 6c 75 6d 6e 3c 70 45 4c 69 73 74 2d 3e 6e 45 78  lumn<pEList->nEx
114e0 70 72 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  pr );.      asse
114f0 72 74 28 20 70 45 78 70 72 2d 3e 70 4c 65 66 74  rt( pExpr->pLeft
11500 3d 3d 30 20 26 26 20 70 45 78 70 72 2d 3e 70 52  ==0 && pExpr->pR
11510 69 67 68 74 3d 3d 30 20 26 26 20 70 45 78 70 72  ight==0 && pExpr
11520 2d 3e 70 4c 69 73 74 3d 3d 30 20 29 3b 0a 20 20  ->pList==0 );.  
11530 20 20 20 20 70 4e 65 77 20 3d 20 70 45 4c 69 73      pNew = pELis
11540 74 2d 3e 61 5b 70 45 78 70 72 2d 3e 69 43 6f 6c  t->a[pExpr->iCol
11550 75 6d 6e 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20  umn].pExpr;.    
11560 20 20 61 73 73 65 72 74 28 20 70 4e 65 77 21 3d    assert( pNew!=
11570 30 20 29 3b 0a 20 20 20 20 20 20 70 45 78 70 72  0 );.      pExpr
11580 2d 3e 6f 70 20 3d 20 70 4e 65 77 2d 3e 6f 70 3b  ->op = pNew->op;
11590 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
115a0 45 78 70 72 2d 3e 70 4c 65 66 74 3d 3d 30 20 29  Expr->pLeft==0 )
115b0 3b 0a 20 20 20 20 20 20 70 45 78 70 72 2d 3e 70  ;.      pExpr->p
115c0 4c 65 66 74 20 3d 20 73 71 6c 69 74 65 33 45 78  Left = sqlite3Ex
115d0 70 72 44 75 70 28 64 62 2c 20 70 4e 65 77 2d 3e  prDup(db, pNew->
115e0 70 4c 65 66 74 29 3b 0a 20 20 20 20 20 20 61 73  pLeft);.      as
115f0 73 65 72 74 28 20 70 45 78 70 72 2d 3e 70 52 69  sert( pExpr->pRi
11600 67 68 74 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  ght==0 );.      
11610 70 45 78 70 72 2d 3e 70 52 69 67 68 74 20 3d 20  pExpr->pRight = 
11620 73 71 6c 69 74 65 33 45 78 70 72 44 75 70 28 64  sqlite3ExprDup(d
11630 62 2c 20 70 4e 65 77 2d 3e 70 52 69 67 68 74 29  b, pNew->pRight)
11640 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
11650 70 45 78 70 72 2d 3e 70 4c 69 73 74 3d 3d 30 20  pExpr->pList==0 
11660 29 3b 0a 20 20 20 20 20 20 70 45 78 70 72 2d 3e  );.      pExpr->
11670 70 4c 69 73 74 20 3d 20 73 71 6c 69 74 65 33 45  pList = sqlite3E
11680 78 70 72 4c 69 73 74 44 75 70 28 64 62 2c 20 70  xprListDup(db, p
11690 4e 65 77 2d 3e 70 4c 69 73 74 29 3b 0a 20 20 20  New->pList);.   
116a0 20 20 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65     pExpr->iTable
116b0 20 3d 20 70 4e 65 77 2d 3e 69 54 61 62 6c 65 3b   = pNew->iTable;
116c0 0a 20 20 20 20 20 20 70 45 78 70 72 2d 3e 70 54  .      pExpr->pT
116d0 61 62 20 3d 20 70 4e 65 77 2d 3e 70 54 61 62 3b  ab = pNew->pTab;
116e0 0a 20 20 20 20 20 20 70 45 78 70 72 2d 3e 69 43  .      pExpr->iC
116f0 6f 6c 75 6d 6e 20 3d 20 70 4e 65 77 2d 3e 69 43  olumn = pNew->iC
11700 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20 20 70 45 78  olumn;.      pEx
11710 70 72 2d 3e 69 41 67 67 20 3d 20 70 4e 65 77 2d  pr->iAgg = pNew-
11720 3e 69 41 67 67 3b 0a 20 20 20 20 20 20 73 71 6c  >iAgg;.      sql
11730 69 74 65 33 54 6f 6b 65 6e 43 6f 70 79 28 64 62  ite3TokenCopy(db
11740 2c 20 26 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2c  , &pExpr->token,
11750 20 26 70 4e 65 77 2d 3e 74 6f 6b 65 6e 29 3b 0a   &pNew->token);.
11760 20 20 20 20 20 20 73 71 6c 69 74 65 33 54 6f 6b        sqlite3Tok
11770 65 6e 43 6f 70 79 28 64 62 2c 20 26 70 45 78 70  enCopy(db, &pExp
11780 72 2d 3e 73 70 61 6e 2c 20 26 70 4e 65 77 2d 3e  r->span, &pNew->
11790 73 70 61 6e 29 3b 0a 20 20 20 20 20 20 70 45 78  span);.      pEx
117a0 70 72 2d 3e 70 53 65 6c 65 63 74 20 3d 20 73 71  pr->pSelect = sq
117b0 6c 69 74 65 33 53 65 6c 65 63 74 44 75 70 28 64  lite3SelectDup(d
117c0 62 2c 20 70 4e 65 77 2d 3e 70 53 65 6c 65 63 74  b, pNew->pSelect
117d0 29 3b 0a 20 20 20 20 20 20 70 45 78 70 72 2d 3e  );.      pExpr->
117e0 66 6c 61 67 73 20 3d 20 70 4e 65 77 2d 3e 66 6c  flags = pNew->fl
117f0 61 67 73 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c  ags;.    }.  }el
11800 73 65 7b 0a 20 20 20 20 73 75 62 73 74 45 78 70  se{.    substExp
11810 72 28 64 62 2c 20 70 45 78 70 72 2d 3e 70 4c 65  r(db, pExpr->pLe
11820 66 74 2c 20 69 54 61 62 6c 65 2c 20 70 45 4c 69  ft, iTable, pELi
11830 73 74 29 3b 0a 20 20 20 20 73 75 62 73 74 45 78  st);.    substEx
11840 70 72 28 64 62 2c 20 70 45 78 70 72 2d 3e 70 52  pr(db, pExpr->pR
11850 69 67 68 74 2c 20 69 54 61 62 6c 65 2c 20 70 45  ight, iTable, pE
11860 4c 69 73 74 29 3b 0a 20 20 20 20 73 75 62 73 74  List);.    subst
11870 53 65 6c 65 63 74 28 64 62 2c 20 70 45 78 70 72  Select(db, pExpr
11880 2d 3e 70 53 65 6c 65 63 74 2c 20 69 54 61 62 6c  ->pSelect, iTabl
11890 65 2c 20 70 45 4c 69 73 74 29 3b 0a 20 20 20 20  e, pEList);.    
118a0 73 75 62 73 74 45 78 70 72 4c 69 73 74 28 64 62  substExprList(db
118b0 2c 20 70 45 78 70 72 2d 3e 70 4c 69 73 74 2c 20  , pExpr->pList, 
118c0 69 54 61 62 6c 65 2c 20 70 45 4c 69 73 74 29 3b  iTable, pEList);
118d0 0a 20 20 7d 0a 7d 0a 73 74 61 74 69 63 20 76 6f  .  }.}.static vo
118e0 69 64 20 73 75 62 73 74 45 78 70 72 4c 69 73 74  id substExprList
118f0 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c  (.  sqlite3 *db,
11900 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 70 6f           /* Repo
11910 72 74 20 6d 61 6c 6c 6f 63 20 65 72 72 6f 72 73  rt malloc errors
11920 20 68 65 72 65 20 2a 2f 0a 20 20 45 78 70 72 4c   here */.  ExprL
11930 69 73 74 20 2a 70 4c 69 73 74 2c 20 20 20 20 20  ist *pList,     
11940 2f 2a 20 4c 69 73 74 20 74 6f 20 73 63 61 6e 20  /* List to scan 
11950 61 6e 64 20 69 6e 20 77 68 69 63 68 20 74 6f 20  and in which to 
11960 6d 61 6b 65 20 73 75 62 73 74 69 74 75 74 65 73  make substitutes
11970 20 2a 2f 0a 20 20 69 6e 74 20 69 54 61 62 6c 65   */.  int iTable
11980 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 61  ,          /* Ta
11990 62 6c 65 20 74 6f 20 62 65 20 73 75 62 73 74 69  ble to be substi
119a0 74 75 74 65 64 20 2a 2f 0a 20 20 45 78 70 72 4c  tuted */.  ExprL
119b0 69 73 74 20 2a 70 45 4c 69 73 74 20 20 20 20 20  ist *pEList     
119c0 2f 2a 20 53 75 62 73 74 69 74 75 74 65 20 76 61  /* Substitute va
119d0 6c 75 65 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  lues */.){.  int
119e0 20 69 3b 0a 20 20 69 66 28 20 70 4c 69 73 74 3d   i;.  if( pList=
119f0 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 66  =0 ) return;.  f
11a00 6f 72 28 69 3d 30 3b 20 69 3c 70 4c 69 73 74 2d  or(i=0; i<pList-
11a10 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20  >nExpr; i++){.  
11a20 20 20 73 75 62 73 74 45 78 70 72 28 64 62 2c 20    substExpr(db, 
11a30 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70  pList->a[i].pExp
11a40 72 2c 20 69 54 61 62 6c 65 2c 20 70 45 4c 69 73  r, iTable, pELis
11a50 74 29 3b 0a 20 20 7d 0a 7d 0a 73 74 61 74 69 63  t);.  }.}.static
11a60 20 76 6f 69 64 20 73 75 62 73 74 53 65 6c 65 63   void substSelec
11a70 74 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  t(.  sqlite3 *db
11a80 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 70  ,         /* Rep
11a90 6f 72 74 20 6d 61 6c 6c 6f 63 20 65 72 72 6f 72  ort malloc error
11aa0 73 20 68 65 72 65 20 2a 2f 0a 20 20 53 65 6c 65  s here */.  Sele
11ab0 63 74 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20  ct *p,          
11ac0 20 2f 2a 20 53 45 4c 45 43 54 20 73 74 61 74 65   /* SELECT state
11ad0 6d 65 6e 74 20 69 6e 20 77 68 69 63 68 20 74 6f  ment in which to
11ae0 20 6d 61 6b 65 20 73 75 62 73 74 69 74 75 74 69   make substituti
11af0 6f 6e 73 20 2a 2f 0a 20 20 69 6e 74 20 69 54 61  ons */.  int iTa
11b00 62 6c 65 2c 20 20 20 20 20 20 20 20 20 20 2f 2a  ble,          /*
11b10 20 54 61 62 6c 65 20 74 6f 20 62 65 20 72 65 70   Table to be rep
11b20 6c 61 63 65 64 20 2a 2f 0a 20 20 45 78 70 72 4c  laced */.  ExprL
11b30 69 73 74 20 2a 70 45 4c 69 73 74 20 20 20 20 20  ist *pEList     
11b40 2f 2a 20 53 75 62 73 74 69 74 75 74 65 20 76 61  /* Substitute va
11b50 6c 75 65 73 20 2a 2f 0a 29 7b 0a 20 20 69 66 28  lues */.){.  if(
11b60 20 21 70 20 29 20 72 65 74 75 72 6e 3b 0a 20 20   !p ) return;.  
11b70 73 75 62 73 74 45 78 70 72 4c 69 73 74 28 64 62  substExprList(db
11b80 2c 20 70 2d 3e 70 45 4c 69 73 74 2c 20 69 54 61  , p->pEList, iTa
11b90 62 6c 65 2c 20 70 45 4c 69 73 74 29 3b 0a 20 20  ble, pEList);.  
11ba0 73 75 62 73 74 45 78 70 72 4c 69 73 74 28 64 62  substExprList(db
11bb0 2c 20 70 2d 3e 70 47 72 6f 75 70 42 79 2c 20 69  , p->pGroupBy, i
11bc0 54 61 62 6c 65 2c 20 70 45 4c 69 73 74 29 3b 0a  Table, pEList);.
11bd0 20 20 73 75 62 73 74 45 78 70 72 4c 69 73 74 28    substExprList(
11be0 64 62 2c 20 70 2d 3e 70 4f 72 64 65 72 42 79 2c  db, p->pOrderBy,
11bf0 20 69 54 61 62 6c 65 2c 20 70 45 4c 69 73 74 29   iTable, pEList)
11c00 3b 0a 20 20 73 75 62 73 74 45 78 70 72 28 64 62  ;.  substExpr(db
11c10 2c 20 70 2d 3e 70 48 61 76 69 6e 67 2c 20 69 54  , p->pHaving, iT
11c20 61 62 6c 65 2c 20 70 45 4c 69 73 74 29 3b 0a 20  able, pEList);. 
11c30 20 73 75 62 73 74 45 78 70 72 28 64 62 2c 20 70   substExpr(db, p
11c40 2d 3e 70 57 68 65 72 65 2c 20 69 54 61 62 6c 65  ->pWhere, iTable
11c50 2c 20 70 45 4c 69 73 74 29 3b 0a 20 20 73 75 62  , pEList);.  sub
11c60 73 74 53 65 6c 65 63 74 28 64 62 2c 20 70 2d 3e  stSelect(db, p->
11c70 70 50 72 69 6f 72 2c 20 69 54 61 62 6c 65 2c 20  pPrior, iTable, 
11c80 70 45 4c 69 73 74 29 3b 0a 7d 0a 23 65 6e 64 69  pEList);.}.#endi
11c90 66 20 2f 2a 20 21 64 65 66 69 6e 65 64 28 53 51  f /* !defined(SQ
11ca0 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 29 20  LITE_OMIT_VIEW) 
11cb0 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  */..#ifndef SQLI
11cc0 54 45 5f 4f 4d 49 54 5f 56 49 45 57 0a 2f 2a 0a  TE_OMIT_VIEW./*.
11cd0 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
11ce0 61 74 74 65 6d 70 74 73 20 74 6f 20 66 6c 61 74  attempts to flat
11cf0 74 65 6e 20 73 75 62 71 75 65 72 69 65 73 20 69  ten subqueries i
11d00 6e 20 6f 72 64 65 72 20 74 6f 20 73 70 65 65 64  n order to speed
11d10 0a 2a 2a 20 65 78 65 63 75 74 69 6f 6e 2e 20 20  .** execution.  
11d20 49 74 20 72 65 74 75 72 6e 73 20 31 20 69 66 20  It returns 1 if 
11d30 69 74 20 6d 61 6b 65 73 20 63 68 61 6e 67 65 73  it makes changes
11d40 20 61 6e 64 20 30 20 69 66 20 6e 6f 20 66 6c 61   and 0 if no fla
11d50 74 74 65 6e 69 6e 67 0a 2a 2a 20 6f 63 63 75 72  ttening.** occur
11d60 73 2e 0a 2a 2a 0a 2a 2a 20 54 6f 20 75 6e 64 65  s..**.** To unde
11d70 72 73 74 61 6e 64 20 74 68 65 20 63 6f 6e 63 65  rstand the conce
11d80 70 74 20 6f 66 20 66 6c 61 74 74 65 6e 69 6e 67  pt of flattening
11d90 2c 20 63 6f 6e 73 69 64 65 72 20 74 68 65 20 66  , consider the f
11da0 6f 6c 6c 6f 77 69 6e 67 0a 2a 2a 20 71 75 65 72  ollowing.** quer
11db0 79 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 45 4c  y:.**.**     SEL
11dc0 45 43 54 20 61 20 46 52 4f 4d 20 28 53 45 4c 45  ECT a FROM (SELE
11dd0 43 54 20 78 2b 79 20 41 53 20 61 20 46 52 4f 4d  CT x+y AS a FROM
11de0 20 74 31 20 57 48 45 52 45 20 7a 3c 31 30 30 29   t1 WHERE z<100)
11df0 20 57 48 45 52 45 20 61 3e 35 0a 2a 2a 0a 2a 2a   WHERE a>5.**.**
11e00 20 54 68 65 20 64 65 66 61 75 6c 74 20 77 61 79   The default way
11e10 20 6f 66 20 69 6d 70 6c 65 6d 65 6e 74 69 6e 67   of implementing
11e20 20 74 68 69 73 20 71 75 65 72 79 20 69 73 20 74   this query is t
11e30 6f 20 65 78 65 63 75 74 65 20 74 68 65 0a 2a 2a  o execute the.**
11e40 20 73 75 62 71 75 65 72 79 20 66 69 72 73 74 20   subquery first 
11e50 61 6e 64 20 73 74 6f 72 65 20 74 68 65 20 72 65  and store the re
11e60 73 75 6c 74 73 20 69 6e 20 61 20 74 65 6d 70 6f  sults in a tempo
11e70 72 61 72 79 20 74 61 62 6c 65 2c 20 74 68 65 6e  rary table, then
11e80 0a 2a 2a 20 72 75 6e 20 74 68 65 20 6f 75 74 65  .** run the oute
11e90 72 20 71 75 65 72 79 20 6f 6e 20 74 68 61 74 20  r query on that 
11ea0 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 2e  temporary table.
11eb0 20 20 54 68 69 73 20 72 65 71 75 69 72 65 73 20    This requires 
11ec0 74 77 6f 0a 2a 2a 20 70 61 73 73 65 73 20 6f 76  two.** passes ov
11ed0 65 72 20 74 68 65 20 64 61 74 61 2e 20 20 46 75  er the data.  Fu
11ee0 72 74 68 65 72 6d 6f 72 65 2c 20 62 65 63 61 75  rthermore, becau
11ef0 73 65 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79  se the temporary
11f00 20 74 61 62 6c 65 0a 2a 2a 20 68 61 73 20 6e 6f   table.** has no
11f10 20 69 6e 64 69 63 65 73 2c 20 74 68 65 20 57 48   indices, the WH
11f20 45 52 45 20 63 6c 61 75 73 65 20 6f 6e 20 74 68  ERE clause on th
11f30 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 63 61  e outer query ca
11f40 6e 6e 6f 74 20 62 65 0a 2a 2a 20 6f 70 74 69 6d  nnot be.** optim
11f50 69 7a 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  ized..**.** This
11f60 20 72 6f 75 74 69 6e 65 20 61 74 74 65 6d 70 74   routine attempt
11f70 73 20 74 6f 20 72 65 77 72 69 74 65 20 71 75 65  s to rewrite que
11f80 72 69 65 73 20 73 75 63 68 20 61 73 20 74 68 65  ries such as the
11f90 20 61 62 6f 76 65 20 69 6e 74 6f 0a 2a 2a 20 61   above into.** a
11fa0 20 73 69 6e 67 6c 65 20 66 6c 61 74 20 73 65 6c   single flat sel
11fb0 65 63 74 2c 20 6c 69 6b 65 20 74 68 69 73 3a 0a  ect, like this:.
11fc0 2a 2a 0a 2a 2a 20 20 20 20 20 53 45 4c 45 43 54  **.**     SELECT
11fd0 20 78 2b 79 20 41 53 20 61 20 46 52 4f 4d 20 74   x+y AS a FROM t
11fe0 31 20 57 48 45 52 45 20 7a 3c 31 30 30 20 41 4e  1 WHERE z<100 AN
11ff0 44 20 61 3e 35 0a 2a 2a 0a 2a 2a 20 54 68 65 20  D a>5.**.** The 
12000 63 6f 64 65 20 67 65 6e 65 72 61 74 65 64 20 66  code generated f
12010 6f 72 20 74 68 69 73 20 73 69 6d 70 69 66 69 63  or this simpific
12020 61 74 69 6f 6e 20 67 69 76 65 73 20 74 68 65 20  ation gives the 
12030 73 61 6d 65 20 72 65 73 75 6c 74 0a 2a 2a 20 62  same result.** b
12040 75 74 20 6f 6e 6c 79 20 68 61 73 20 74 6f 20 73  ut only has to s
12050 63 61 6e 20 74 68 65 20 64 61 74 61 20 6f 6e 63  can the data onc
12060 65 2e 20 20 41 6e 64 20 62 65 63 61 75 73 65 20  e.  And because 
12070 69 6e 64 69 63 65 73 20 6d 69 67 68 74 20 0a 2a  indices might .*
12080 2a 20 65 78 69 73 74 20 6f 6e 20 74 68 65 20 74  * exist on the t
12090 61 62 6c 65 20 74 31 2c 20 61 20 63 6f 6d 70 6c  able t1, a compl
120a0 65 74 65 20 73 63 61 6e 20 6f 66 20 74 68 65 20  ete scan of the 
120b0 64 61 74 61 20 6d 69 67 68 74 20 62 65 0a 2a 2a  data might be.**
120c0 20 61 76 6f 69 64 65 64 2e 0a 2a 2a 0a 2a 2a 20   avoided..**.** 
120d0 46 6c 61 74 74 65 6e 69 6e 67 20 69 73 20 6f 6e  Flattening is on
120e0 6c 79 20 61 74 74 65 6d 70 74 65 64 20 69 66 20  ly attempted if 
120f0 61 6c 6c 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f  all of the follo
12100 77 69 6e 67 20 61 72 65 20 74 72 75 65 3a 0a 2a  wing are true:.*
12110 2a 0a 2a 2a 20 20 20 28 31 29 20 20 54 68 65 20  *.**   (1)  The 
12120 73 75 62 71 75 65 72 79 20 61 6e 64 20 74 68 65  subquery and the
12130 20 6f 75 74 65 72 20 71 75 65 72 79 20 64 6f 20   outer query do 
12140 6e 6f 74 20 62 6f 74 68 20 75 73 65 20 61 67 67  not both use agg
12150 72 65 67 61 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 20  regates..**.**  
12160 20 28 32 29 20 20 54 68 65 20 73 75 62 71 75 65   (2)  The subque
12170 72 79 20 69 73 20 6e 6f 74 20 61 6e 20 61 67 67  ry is not an agg
12180 72 65 67 61 74 65 20 6f 72 20 74 68 65 20 6f 75  regate or the ou
12190 74 65 72 20 71 75 65 72 79 20 69 73 20 6e 6f 74  ter query is not
121a0 20 61 20 6a 6f 69 6e 2e 0a 2a 2a 0a 2a 2a 20 20   a join..**.**  
121b0 20 28 33 29 20 20 54 68 65 20 73 75 62 71 75 65   (3)  The subque
121c0 72 79 20 69 73 20 6e 6f 74 20 74 68 65 20 72 69  ry is not the ri
121d0 67 68 74 20 6f 70 65 72 61 6e 64 20 6f 66 20 61  ght operand of a
121e0 20 6c 65 66 74 20 6f 75 74 65 72 20 6a 6f 69 6e   left outer join
121f0 2c 20 6f 72 0a 2a 2a 20 20 20 20 20 20 20 20 74  , or.**        t
12200 68 65 20 73 75 62 71 75 65 72 79 20 69 73 20 6e  he subquery is n
12210 6f 74 20 69 74 73 65 6c 66 20 61 20 6a 6f 69 6e  ot itself a join
12220 2e 20 20 28 54 69 63 6b 65 74 20 23 33 30 36 29  .  (Ticket #306)
12230 0a 2a 2a 0a 2a 2a 20 20 20 28 34 29 20 20 54 68  .**.**   (4)  Th
12240 65 20 73 75 62 71 75 65 72 79 20 69 73 20 6e 6f  e subquery is no
12250 74 20 44 49 53 54 49 4e 43 54 20 6f 72 20 74 68  t DISTINCT or th
12260 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 69 73  e outer query is
12270 20 6e 6f 74 20 61 20 6a 6f 69 6e 2e 0a 2a 2a 0a   not a join..**.
12280 2a 2a 20 20 20 28 35 29 20 20 54 68 65 20 73 75  **   (5)  The su
12290 62 71 75 65 72 79 20 69 73 20 6e 6f 74 20 44 49  bquery is not DI
122a0 53 54 49 4e 43 54 20 6f 72 20 74 68 65 20 6f 75  STINCT or the ou
122b0 74 65 72 20 71 75 65 72 79 20 64 6f 65 73 20 6e  ter query does n
122c0 6f 74 20 75 73 65 0a 2a 2a 20 20 20 20 20 20 20  ot use.**       
122d0 20 61 67 67 72 65 67 61 74 65 73 2e 0a 2a 2a 0a   aggregates..**.
122e0 2a 2a 20 20 20 28 36 29 20 20 54 68 65 20 73 75  **   (6)  The su
122f0 62 71 75 65 72 79 20 64 6f 65 73 20 6e 6f 74 20  bquery does not 
12300 75 73 65 20 61 67 67 72 65 67 61 74 65 73 20 6f  use aggregates o
12310 72 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72  r the outer quer
12320 79 20 69 73 20 6e 6f 74 0a 2a 2a 20 20 20 20 20  y is not.**     
12330 20 20 20 44 49 53 54 49 4e 43 54 2e 0a 2a 2a 0a     DISTINCT..**.
12340 2a 2a 20 20 20 28 37 29 20 20 54 68 65 20 73 75  **   (7)  The su
12350 62 71 75 65 72 79 20 68 61 73 20 61 20 46 52 4f  bquery has a FRO
12360 4d 20 63 6c 61 75 73 65 2e 0a 2a 2a 0a 2a 2a 20  M clause..**.** 
12370 20 20 28 38 29 20 20 54 68 65 20 73 75 62 71 75    (8)  The subqu
12380 65 72 79 20 64 6f 65 73 20 6e 6f 74 20 75 73 65  ery does not use
12390 20 4c 49 4d 49 54 20 6f 72 20 74 68 65 20 6f 75   LIMIT or the ou
123a0 74 65 72 20 71 75 65 72 79 20 69 73 20 6e 6f 74  ter query is not
123b0 20 61 20 6a 6f 69 6e 2e 0a 2a 2a 0a 2a 2a 20 20   a join..**.**  
123c0 20 28 39 29 20 20 54 68 65 20 73 75 62 71 75 65   (9)  The subque
123d0 72 79 20 64 6f 65 73 20 6e 6f 74 20 75 73 65 20  ry does not use 
123e0 4c 49 4d 49 54 20 6f 72 20 74 68 65 20 6f 75 74  LIMIT or the out
123f0 65 72 20 71 75 65 72 79 20 64 6f 65 73 20 6e 6f  er query does no
12400 74 20 75 73 65 0a 2a 2a 20 20 20 20 20 20 20 20  t use.**        
12410 61 67 67 72 65 67 61 74 65 73 2e 0a 2a 2a 0a 2a  aggregates..**.*
12420 2a 20 20 28 31 30 29 20 20 54 68 65 20 73 75 62  *  (10)  The sub
12430 71 75 65 72 79 20 64 6f 65 73 20 6e 6f 74 20 75  query does not u
12440 73 65 20 61 67 67 72 65 67 61 74 65 73 20 6f 72  se aggregates or
12450 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79   the outer query
12460 20 64 6f 65 73 20 6e 6f 74 0a 2a 2a 20 20 20 20   does not.**    
12470 20 20 20 20 75 73 65 20 4c 49 4d 49 54 2e 0a 2a      use LIMIT..*
12480 2a 0a 2a 2a 20 20 28 31 31 29 20 20 54 68 65 20  *.**  (11)  The 
12490 73 75 62 71 75 65 72 79 20 61 6e 64 20 74 68 65  subquery and the
124a0 20 6f 75 74 65 72 20 71 75 65 72 79 20 64 6f 20   outer query do 
124b0 6e 6f 74 20 62 6f 74 68 20 68 61 76 65 20 4f 52  not both have OR
124c0 44 45 52 20 42 59 20 63 6c 61 75 73 65 73 2e 0a  DER BY clauses..
124d0 2a 2a 0a 2a 2a 20 20 28 31 32 29 20 20 54 68 65  **.**  (12)  The
124e0 20 73 75 62 71 75 65 72 79 20 69 73 20 6e 6f 74   subquery is not
124f0 20 74 68 65 20 72 69 67 68 74 20 74 65 72 6d 20   the right term 
12500 6f 66 20 61 20 4c 45 46 54 20 4f 55 54 45 52 20  of a LEFT OUTER 
12510 4a 4f 49 4e 20 6f 72 20 74 68 65 0a 2a 2a 20 20  JOIN or the.**  
12520 20 20 20 20 20 20 73 75 62 71 75 65 72 79 20 68        subquery h
12530 61 73 20 6e 6f 20 57 48 45 52 45 20 63 6c 61 75  as no WHERE clau
12540 73 65 2e 20 20 28 61 64 64 65 64 20 62 79 20 74  se.  (added by t
12550 69 63 6b 65 74 20 23 33 35 30 29 0a 2a 2a 0a 2a  icket #350).**.*
12560 2a 20 20 28 31 33 29 20 20 54 68 65 20 73 75 62  *  (13)  The sub
12570 71 75 65 72 79 20 61 6e 64 20 6f 75 74 65 72 20  query and outer 
12580 71 75 65 72 79 20 64 6f 20 6e 6f 74 20 62 6f 74  query do not bot
12590 68 20 75 73 65 20 4c 49 4d 49 54 0a 2a 2a 0a 2a  h use LIMIT.**.*
125a0 2a 20 20 28 31 34 29 20 20 54 68 65 20 73 75 62  *  (14)  The sub
125b0 71 75 65 72 79 20 64 6f 65 73 20 6e 6f 74 20 75  query does not u
125c0 73 65 20 4f 46 46 53 45 54 0a 2a 2a 0a 2a 2a 20  se OFFSET.**.** 
125d0 20 28 31 35 29 20 20 54 68 65 20 6f 75 74 65 72   (15)  The outer
125e0 20 71 75 65 72 79 20 69 73 20 6e 6f 74 20 70 61   query is not pa
125f0 72 74 20 6f 66 20 61 20 63 6f 6d 70 6f 75 6e 64  rt of a compound
12600 20 73 65 6c 65 63 74 20 6f 72 20 74 68 65 0a 2a   select or the.*
12610 2a 20 20 20 20 20 20 20 20 73 75 62 71 75 65 72  *        subquer
12620 79 20 64 6f 65 73 20 6e 6f 74 20 68 61 76 65 20  y does not have 
12630 62 6f 74 68 20 61 6e 20 4f 52 44 45 52 20 42 59  both an ORDER BY
12640 20 61 6e 64 20 61 20 4c 49 4d 49 54 20 63 6c 61   and a LIMIT cla
12650 75 73 65 2e 0a 2a 2a 20 20 20 20 20 20 20 20 28  use..**        (
12660 53 65 65 20 74 69 63 6b 65 74 20 23 32 33 33 39  See ticket #2339
12670 29 0a 2a 2a 0a 2a 2a 20 49 6e 20 74 68 69 73 20  ).**.** In this 
12680 72 6f 75 74 69 6e 65 2c 20 74 68 65 20 22 70 22  routine, the "p"
12690 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 61 20   parameter is a 
126a0 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 6f  pointer to the o
126b0 75 74 65 72 20 71 75 65 72 79 2e 0a 2a 2a 20 54  uter query..** T
126c0 68 65 20 73 75 62 71 75 65 72 79 20 69 73 20 70  he subquery is p
126d0 2d 3e 70 53 72 63 2d 3e 61 5b 69 46 72 6f 6d 5d  ->pSrc->a[iFrom]
126e0 2e 20 20 69 73 41 67 67 20 69 73 20 74 72 75 65  .  isAgg is true
126f0 20 69 66 20 74 68 65 20 6f 75 74 65 72 20 71 75   if the outer qu
12700 65 72 79 0a 2a 2a 20 75 73 65 73 20 61 67 67 72  ery.** uses aggr
12710 65 67 61 74 65 73 20 61 6e 64 20 73 75 62 71 75  egates and subqu
12720 65 72 79 49 73 41 67 67 20 69 73 20 74 72 75 65  eryIsAgg is true
12730 20 69 66 20 74 68 65 20 73 75 62 71 75 65 72 79   if the subquery
12740 20 75 73 65 73 20 61 67 67 72 65 67 61 74 65 73   uses aggregates
12750 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 66 6c 61 74 74  ..**.** If flatt
12760 65 6e 69 6e 67 20 69 73 20 6e 6f 74 20 61 74 74  ening is not att
12770 65 6d 70 74 65 64 2c 20 74 68 69 73 20 72 6f 75  empted, this rou
12780 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70 20  tine is a no-op 
12790 61 6e 64 20 72 65 74 75 72 6e 73 20 30 2e 0a 2a  and returns 0..*
127a0 2a 20 49 66 20 66 6c 61 74 74 65 6e 69 6e 67 20  * If flattening 
127b0 69 73 20 61 74 74 65 6d 70 74 65 64 20 74 68 69  is attempted thi
127c0 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e  s routine return
127d0 73 20 31 2e 0a 2a 2a 0a 2a 2a 20 41 6c 6c 20 6f  s 1..**.** All o
127e0 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  f the expression
127f0 20 61 6e 61 6c 79 73 69 73 20 6d 75 73 74 20 6f   analysis must o
12800 63 63 75 72 20 6f 6e 20 62 6f 74 68 20 74 68 65  ccur on both the
12810 20 6f 75 74 65 72 20 71 75 65 72 79 20 61 6e 64   outer query and
12820 0a 2a 2a 20 74 68 65 20 73 75 62 71 75 65 72 79  .** the subquery
12830 20 62 65 66 6f 72 65 20 74 68 69 73 20 72 6f 75   before this rou
12840 74 69 6e 65 20 72 75 6e 73 2e 0a 2a 2f 0a 73 74  tine runs..*/.st
12850 61 74 69 63 20 69 6e 74 20 66 6c 61 74 74 65 6e  atic int flatten
12860 53 75 62 71 75 65 72 79 28 0a 20 20 73 71 6c 69  Subquery(.  sqli
12870 74 65 33 20 2a 64 62 2c 20 20 20 20 20 20 20 20  te3 *db,        
12880 20 2f 2a 20 44 61 74 61 62 61 73 65 20 63 6f 6e   /* Database con
12890 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 53 65 6c  nection */.  Sel
128a0 65 63 74 20 2a 70 2c 20 20 20 20 20 20 20 20 20  ect *p,         
128b0 20 20 2f 2a 20 54 68 65 20 70 61 72 65 6e 74 20    /* The parent 
128c0 6f 72 20 6f 75 74 65 72 20 53 45 4c 45 43 54 20  or outer SELECT 
128d0 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 69  statement */.  i
128e0 6e 74 20 69 46 72 6f 6d 2c 20 20 20 20 20 20 20  nt iFrom,       
128f0 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 69 6e 20      /* Index in 
12900 70 2d 3e 70 53 72 63 2d 3e 61 5b 5d 20 6f 66 20  p->pSrc->a[] of 
12910 74 68 65 20 69 6e 6e 65 72 20 73 75 62 71 75 65  the inner subque
12920 72 79 20 2a 2f 0a 20 20 69 6e 74 20 69 73 41 67  ry */.  int isAg
12930 67 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  g,           /* 
12940 54 72 75 65 20 69 66 20 6f 75 74 65 72 20 53 45  True if outer SE
12950 4c 45 43 54 20 75 73 65 73 20 61 67 67 72 65 67  LECT uses aggreg
12960 61 74 65 20 66 75 6e 63 74 69 6f 6e 73 20 2a 2f  ate functions */
12970 0a 20 20 69 6e 74 20 73 75 62 71 75 65 72 79 49  .  int subqueryI
12980 73 41 67 67 20 20 20 20 2f 2a 20 54 72 75 65 20  sAgg    /* True 
12990 69 66 20 74 68 65 20 73 75 62 71 75 65 72 79 20  if the subquery 
129a0 75 73 65 73 20 61 67 67 72 65 67 61 74 65 20 66  uses aggregate f
129b0 75 6e 63 74 69 6f 6e 73 20 2a 2f 0a 29 7b 0a 20  unctions */.){. 
129c0 20 53 65 6c 65 63 74 20 2a 70 53 75 62 3b 20 20   Select *pSub;  
129d0 20 20 20 20 20 2f 2a 20 54 68 65 20 69 6e 6e 65       /* The inne
129e0 72 20 71 75 65 72 79 20 6f 72 20 22 73 75 62 71  r query or "subq
129f0 75 65 72 79 22 20 2a 2f 0a 20 20 53 72 63 4c 69  uery" */.  SrcLi
12a00 73 74 20 2a 70 53 72 63 3b 20 20 20 20 20 20 2f  st *pSrc;      /
12a10 2a 20 54 68 65 20 46 52 4f 4d 20 63 6c 61 75 73  * The FROM claus
12a20 65 20 6f 66 20 74 68 65 20 6f 75 74 65 72 20 71  e of the outer q
12a30 75 65 72 79 20 2a 2f 0a 20 20 53 72 63 4c 69 73  uery */.  SrcLis
12a40 74 20 2a 70 53 75 62 53 72 63 3b 20 20 20 2f 2a  t *pSubSrc;   /*
12a50 20 54 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65   The FROM clause
12a60 20 6f 66 20 74 68 65 20 73 75 62 71 75 65 72 79   of the subquery
12a70 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a   */.  ExprList *
12a80 70 4c 69 73 74 3b 20 20 20 20 2f 2a 20 54 68 65  pList;    /* The
12a90 20 72 65 73 75 6c 74 20 73 65 74 20 6f 66 20 74   result set of t
12aa0 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 2a  he outer query *
12ab0 2f 0a 20 20 69 6e 74 20 69 50 61 72 65 6e 74 3b  /.  int iParent;
12ac0 20 20 20 20 20 20 20 20 2f 2a 20 56 44 42 45 20          /* VDBE 
12ad0 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 20 6f 66  cursor number of
12ae0 20 74 68 65 20 70 53 75 62 20 72 65 73 75 6c 74   the pSub result
12af0 20 73 65 74 20 74 65 6d 70 20 74 61 62 6c 65 20   set temp table 
12b00 2a 2f 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20  */.  int i;     
12b10 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70           /* Loop
12b20 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 45 78   counter */.  Ex
12b30 70 72 20 2a 70 57 68 65 72 65 3b 20 20 20 20 20  pr *pWhere;     
12b40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
12b50 2a 20 54 68 65 20 57 48 45 52 45 20 63 6c 61 75  * The WHERE clau
12b60 73 65 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 53  se */.  struct S
12b70 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 53 75  rcList_item *pSu
12b80 62 69 74 65 6d 3b 20 20 20 2f 2a 20 54 68 65 20  bitem;   /* The 
12b90 73 75 62 71 75 65 72 79 20 2a 2f 0a 0a 20 20 2f  subquery */..  /
12ba0 2a 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69  * Check to see i
12bb0 66 20 66 6c 61 74 74 65 6e 69 6e 67 20 69 73 20  f flattening is 
12bc0 70 65 72 6d 69 74 74 65 64 2e 20 20 52 65 74 75  permitted.  Retu
12bd0 72 6e 20 30 20 69 66 20 6e 6f 74 2e 0a 20 20 2a  rn 0 if not..  *
12be0 2f 0a 20 20 69 66 28 20 70 3d 3d 30 20 29 20 72  /.  if( p==0 ) r
12bf0 65 74 75 72 6e 20 30 3b 0a 20 20 70 53 72 63 20  eturn 0;.  pSrc 
12c00 3d 20 70 2d 3e 70 53 72 63 3b 0a 20 20 61 73 73  = p->pSrc;.  ass
12c10 65 72 74 28 20 70 53 72 63 20 26 26 20 69 46 72  ert( pSrc && iFr
12c20 6f 6d 3e 3d 30 20 26 26 20 69 46 72 6f 6d 3c 70  om>=0 && iFrom<p
12c30 53 72 63 2d 3e 6e 53 72 63 20 29 3b 0a 20 20 70  Src->nSrc );.  p
12c40 53 75 62 69 74 65 6d 20 3d 20 26 70 53 72 63 2d  Subitem = &pSrc-
12c50 3e 61 5b 69 46 72 6f 6d 5d 3b 0a 20 20 70 53 75  >a[iFrom];.  pSu
12c60 62 20 3d 20 70 53 75 62 69 74 65 6d 2d 3e 70 53  b = pSubitem->pS
12c70 65 6c 65 63 74 3b 0a 20 20 61 73 73 65 72 74 28  elect;.  assert(
12c80 20 70 53 75 62 21 3d 30 20 29 3b 0a 20 20 69 66   pSub!=0 );.  if
12c90 28 20 69 73 41 67 67 20 26 26 20 73 75 62 71 75  ( isAgg && subqu
12ca0 65 72 79 49 73 41 67 67 20 29 20 72 65 74 75 72  eryIsAgg ) retur
12cb0 6e 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  n 0;            
12cc0 20 20 20 20 20 2f 2a 20 52 65 73 74 72 69 63 74       /* Restrict
12cd0 69 6f 6e 20 28 31 29 20 20 2a 2f 0a 20 20 69 66  ion (1)  */.  if
12ce0 28 20 73 75 62 71 75 65 72 79 49 73 41 67 67 20  ( subqueryIsAgg 
12cf0 26 26 20 70 53 72 63 2d 3e 6e 53 72 63 3e 31 20  && pSrc->nSrc>1 
12d00 29 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20  ) return 0;     
12d10 20 20 20 20 20 2f 2a 20 52 65 73 74 72 69 63 74       /* Restrict
12d20 69 6f 6e 20 28 32 29 20 20 2a 2f 0a 20 20 70 53  ion (2)  */.  pS
12d30 75 62 53 72 63 20 3d 20 70 53 75 62 2d 3e 70 53  ubSrc = pSub->pS
12d40 72 63 3b 0a 20 20 61 73 73 65 72 74 28 20 70 53  rc;.  assert( pS
12d50 75 62 53 72 63 20 29 3b 0a 20 20 2f 2a 20 50 72  ubSrc );.  /* Pr
12d60 69 6f 72 20 74 6f 20 76 65 72 73 69 6f 6e 20 33  ior to version 3
12d70 2e 31 2e 32 2c 20 77 68 65 6e 20 4c 49 4d 49 54  .1.2, when LIMIT
12d80 20 61 6e 64 20 4f 46 46 53 45 54 20 68 61 64 20   and OFFSET had 
12d90 74 6f 20 62 65 20 73 69 6d 70 6c 65 20 63 6f 6e  to be simple con
12da0 73 74 61 6e 74 73 2c 0a 20 20 2a 2a 20 6e 6f 74  stants,.  ** not
12db0 20 61 72 62 69 74 72 61 72 79 20 65 78 70 72 65   arbitrary expre
12dc0 73 73 73 69 6f 6e 73 2c 20 77 65 20 61 6c 6c 6f  sssions, we allo
12dd0 77 65 64 20 73 6f 6d 65 20 63 6f 6d 62 69 6e 69  wed some combini
12de0 6e 67 20 6f 66 20 4c 49 4d 49 54 20 61 6e 64 20  ng of LIMIT and 
12df0 4f 46 46 53 45 54 0a 20 20 2a 2a 20 62 65 63 61  OFFSET.  ** beca
12e00 75 73 65 20 74 68 65 79 20 63 6f 75 6c 64 20 62  use they could b
12e10 65 20 63 6f 6d 70 75 74 65 64 20 61 74 20 63 6f  e computed at co
12e20 6d 70 69 6c 65 2d 74 69 6d 65 2e 20 20 42 75 74  mpile-time.  But
12e30 20 77 68 65 6e 20 4c 49 4d 49 54 20 61 6e 64 20   when LIMIT and 
12e40 4f 46 46 53 45 54 0a 20 20 2a 2a 20 62 65 63 61  OFFSET.  ** beca
12e50 6d 65 20 61 72 62 69 74 72 61 72 79 20 65 78 70  me arbitrary exp
12e60 72 65 73 73 69 6f 6e 73 2c 20 77 65 20 77 65 72  ressions, we wer
12e70 65 20 66 6f 72 63 65 64 20 74 6f 20 61 64 64 20  e forced to add 
12e80 72 65 73 74 72 69 63 74 69 6f 6e 73 20 28 31 33  restrictions (13
12e90 29 0a 20 20 2a 2a 20 61 6e 64 20 28 31 34 29 2e  ).  ** and (14).
12ea0 20 2a 2f 0a 20 20 69 66 28 20 70 53 75 62 2d 3e   */.  if( pSub->
12eb0 70 4c 69 6d 69 74 20 26 26 20 70 2d 3e 70 4c 69  pLimit && p->pLi
12ec0 6d 69 74 20 29 20 72 65 74 75 72 6e 20 30 3b 20  mit ) return 0; 
12ed0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
12ee0 52 65 73 74 72 69 63 74 69 6f 6e 20 28 31 33 29  Restriction (13)
12ef0 20 2a 2f 0a 20 20 69 66 28 20 70 53 75 62 2d 3e   */.  if( pSub->
12f00 70 4f 66 66 73 65 74 20 29 20 72 65 74 75 72 6e  pOffset ) return
12f10 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
12f20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
12f30 52 65 73 74 72 69 63 74 69 6f 6e 20 28 31 34 29  Restriction (14)
12f40 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 70 52 69   */.  if( p->pRi
12f50 67 68 74 6d 6f 73 74 20 26 26 20 70 53 75 62 2d  ghtmost && pSub-
12f60 3e 70 4c 69 6d 69 74 20 26 26 20 70 53 75 62 2d  >pLimit && pSub-
12f70 3e 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20  >pOrderBy ){.   
12f80 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20   return 0;      
12f90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12fa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12fb0 20 20 20 20 20 20 2f 2a 20 52 65 73 74 72 69 63        /* Restric
12fc0 74 69 6f 6e 20 28 31 35 29 20 2a 2f 0a 20 20 7d  tion (15) */.  }
12fd0 0a 20 20 69 66 28 20 70 53 75 62 53 72 63 2d 3e  .  if( pSubSrc->
12fe0 6e 53 72 63 3d 3d 30 20 29 20 72 65 74 75 72 6e  nSrc==0 ) return
12ff0 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
13000 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73            /* Res
13010 74 72 69 63 74 69 6f 6e 20 28 37 29 20 20 2a 2f  triction (7)  */
13020 0a 20 20 69 66 28 20 28 70 53 75 62 2d 3e 69 73  .  if( (pSub->is
13030 44 69 73 74 69 6e 63 74 20 7c 7c 20 70 53 75 62  Distinct || pSub
13040 2d 3e 70 4c 69 6d 69 74 29 20 0a 20 20 20 20 20  ->pLimit) .     
13050 20 20 20 20 26 26 20 28 70 53 72 63 2d 3e 6e 53      && (pSrc->nS
13060 72 63 3e 31 20 7c 7c 20 69 73 41 67 67 29 20 29  rc>1 || isAgg) )
13070 7b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65  {          /* Re
13080 73 74 72 69 63 74 69 6f 6e 73 20 28 34 29 28 35  strictions (4)(5
13090 29 28 38 29 28 39 29 20 2a 2f 0a 20 20 20 20 20  )(8)(9) */.     
130a0 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20  return 0;       
130b0 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e 69 73  .  }.  if( p->is
130c0 44 69 73 74 69 6e 63 74 20 26 26 20 73 75 62 71  Distinct && subq
130d0 75 65 72 79 49 73 41 67 67 20 29 20 72 65 74 75  ueryIsAgg ) retu
130e0 72 6e 20 30 3b 20 20 20 20 20 20 20 20 20 2f 2a  rn 0;         /*
130f0 20 52 65 73 74 72 69 63 74 69 6f 6e 20 28 36 29   Restriction (6)
13100 20 20 2a 2f 0a 20 20 69 66 28 20 28 70 2d 3e 64    */.  if( (p->d
13110 69 73 61 6c 6c 6f 77 4f 72 64 65 72 42 79 20 7c  isallowOrderBy |
13120 7c 20 70 2d 3e 70 4f 72 64 65 72 42 79 29 20 26  | p->pOrderBy) &
13130 26 20 70 53 75 62 2d 3e 70 4f 72 64 65 72 42 79  & pSub->pOrderBy
13140 20 29 7b 0a 20 20 20 20 20 72 65 74 75 72 6e 20   ){.     return 
13150 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
13160 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13170 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
13180 52 65 73 74 72 69 63 74 69 6f 6e 20 28 31 31 29  Restriction (11)
13190 20 2a 2f 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 65   */.  }..  /* Re
131a0 73 74 72 69 63 74 69 6f 6e 20 33 3a 20 20 49 66  striction 3:  If
131b0 20 74 68 65 20 73 75 62 71 75 65 72 79 20 69 73   the subquery is
131c0 20 61 20 6a 6f 69 6e 2c 20 6d 61 6b 65 20 73 75   a join, make su
131d0 72 65 20 74 68 65 20 73 75 62 71 75 65 72 79 20  re the subquery 
131e0 69 73 20 0a 20 20 2a 2a 20 6e 6f 74 20 75 73 65  is .  ** not use
131f0 64 20 61 73 20 74 68 65 20 72 69 67 68 74 20 6f  d as the right o
13200 70 65 72 61 6e 64 20 6f 66 20 61 6e 20 6f 75 74  perand of an out
13210 65 72 20 6a 6f 69 6e 2e 20 20 45 78 61 6d 70 6c  er join.  Exampl
13220 65 73 20 6f 66 20 77 68 79 20 74 68 69 73 0a 20  es of why this. 
13230 20 2a 2a 20 69 73 20 6e 6f 74 20 61 6c 6c 6f 77   ** is not allow
13240 65 64 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20  ed:.  **.  **   
13250 20 20 20 20 20 20 74 31 20 4c 45 46 54 20 4f 55        t1 LEFT OU
13260 54 45 52 20 4a 4f 49 4e 20 28 74 32 20 4a 4f 49  TER JOIN (t2 JOI
13270 4e 20 74 33 29 0a 20 20 2a 2a 0a 20 20 2a 2a 20  N t3).  **.  ** 
13280 49 66 20 77 65 20 66 6c 61 74 74 65 6e 20 74 68  If we flatten th
13290 65 20 61 62 6f 76 65 2c 20 77 65 20 77 6f 75 6c  e above, we woul
132a0 64 20 67 65 74 0a 20 20 2a 2a 0a 20 20 2a 2a 20  d get.  **.  ** 
132b0 20 20 20 20 20 20 20 20 28 74 31 20 4c 45 46 54          (t1 LEFT
132c0 20 4f 55 54 45 52 20 4a 4f 49 4e 20 74 32 29 20   OUTER JOIN t2) 
132d0 4a 4f 49 4e 20 74 33 0a 20 20 2a 2a 0a 20 20 2a  JOIN t3.  **.  *
132e0 2a 20 77 68 69 63 68 20 69 73 20 6e 6f 74 20 61  * which is not a
132f0 74 20 61 6c 6c 20 74 68 65 20 73 61 6d 65 20 74  t all the same t
13300 68 69 6e 67 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  hing..  */.  if(
13310 20 70 53 75 62 53 72 63 2d 3e 6e 53 72 63 3e 31   pSubSrc->nSrc>1
13320 20 26 26 20 28 70 53 75 62 69 74 65 6d 2d 3e 6a   && (pSubitem->j
13330 6f 69 6e 74 79 70 65 20 26 20 4a 54 5f 4f 55 54  ointype & JT_OUT
13340 45 52 29 21 3d 30 20 29 7b 0a 20 20 20 20 72 65  ER)!=0 ){.    re
13350 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f  turn 0;.  }..  /
13360 2a 20 52 65 73 74 72 69 63 74 69 6f 6e 20 31 32  * Restriction 12
13370 3a 20 20 49 66 20 74 68 65 20 73 75 62 71 75 65  :  If the subque
13380 72 79 20 69 73 20 74 68 65 20 72 69 67 68 74 20  ry is the right 
13390 6f 70 65 72 61 6e 64 20 6f 66 20 61 20 6c 65 66  operand of a lef
133a0 74 20 6f 75 74 65 72 0a 20 20 2a 2a 20 6a 6f 69  t outer.  ** joi
133b0 6e 2c 20 6d 61 6b 65 20 73 75 72 65 20 74 68 65  n, make sure the
133c0 20 73 75 62 71 75 65 72 79 20 68 61 73 20 6e 6f   subquery has no
133d0 20 57 48 45 52 45 20 63 6c 61 75 73 65 2e 0a 20   WHERE clause.. 
133e0 20 2a 2a 20 41 6e 20 65 78 61 6d 70 6c 65 73 20   ** An examples 
133f0 6f 66 20 77 68 79 20 74 68 69 73 20 69 73 20 6e  of why this is n
13400 6f 74 20 61 6c 6c 6f 77 65 64 3a 0a 20 20 2a 2a  ot allowed:.  **
13410 0a 20 20 2a 2a 20 20 20 20 20 20 20 20 20 74 31  .  **         t1
13420 20 4c 45 46 54 20 4f 55 54 45 52 20 4a 4f 49 4e   LEFT OUTER JOIN
13430 20 28 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20   (SELECT * FROM 
13440 74 32 20 57 48 45 52 45 20 74 32 2e 78 3e 30 29  t2 WHERE t2.x>0)
13450 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 77 65  .  **.  ** If we
13460 20 66 6c 61 74 74 65 6e 20 74 68 65 20 61 62 6f   flatten the abo
13470 76 65 2c 20 77 65 20 77 6f 75 6c 64 20 67 65 74  ve, we would get
13480 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 20  .  **.  **      
13490 20 20 20 28 74 31 20 4c 45 46 54 20 4f 55 54 45     (t1 LEFT OUTE
134a0 52 20 4a 4f 49 4e 20 74 32 29 20 57 48 45 52 45  R JOIN t2) WHERE
134b0 20 74 32 2e 78 3e 30 0a 20 20 2a 2a 0a 20 20 2a   t2.x>0.  **.  *
134c0 2a 20 42 75 74 20 74 68 65 20 74 32 2e 78 3e 30  * But the t2.x>0
134d0 20 74 65 73 74 20 77 69 6c 6c 20 61 6c 77 61 79   test will alway
134e0 73 20 66 61 69 6c 20 6f 6e 20 61 20 4e 55 4c 4c  s fail on a NULL
134f0 20 72 6f 77 20 6f 66 20 74 32 2c 20 77 68 69 63   row of t2, whic
13500 68 0a 20 20 2a 2a 20 65 66 66 65 63 74 69 76 65  h.  ** effective
13510 6c 79 20 63 6f 6e 76 65 72 74 73 20 74 68 65 20  ly converts the 
13520 4f 55 54 45 52 20 4a 4f 49 4e 20 69 6e 74 6f 20  OUTER JOIN into 
13530 61 6e 20 49 4e 4e 45 52 20 4a 4f 49 4e 2e 0a 20  an INNER JOIN.. 
13540 20 2a 2f 0a 20 20 69 66 28 20 28 70 53 75 62 69   */.  if( (pSubi
13550 74 65 6d 2d 3e 6a 6f 69 6e 74 79 70 65 20 26 20  tem->jointype & 
13560 4a 54 5f 4f 55 54 45 52 29 21 3d 30 20 26 26 20  JT_OUTER)!=0 && 
13570 70 53 75 62 2d 3e 70 57 68 65 72 65 21 3d 30 20  pSub->pWhere!=0 
13580 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b  ){.    return 0;
13590 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 77 65  .  }..  /* If we
135a0 20 72 65 61 63 68 20 74 68 69 73 20 70 6f 69 6e   reach this poin
135b0 74 2c 20 69 74 20 6d 65 61 6e 73 20 66 6c 61 74  t, it means flat
135c0 74 65 6e 69 6e 67 20 69 73 20 70 65 72 6d 69 74  tening is permit
135d0 74 65 64 20 66 6f 72 20 74 68 65 0a 20 20 2a 2a  ted for the.  **
135e0 20 69 46 72 6f 6d 2d 74 68 20 65 6e 74 72 79 20   iFrom-th entry 
135f0 6f 66 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75  of the FROM clau
13600 73 65 20 69 6e 20 74 68 65 20 6f 75 74 65 72 20  se in the outer 
13610 71 75 65 72 79 2e 0a 20 20 2a 2f 0a 0a 20 20 2f  query..  */..  /
13620 2a 20 4d 6f 76 65 20 61 6c 6c 20 6f 66 20 74 68  * Move all of th
13630 65 20 46 52 4f 4d 20 65 6c 65 6d 65 6e 74 73 20  e FROM elements 
13640 6f 66 20 74 68 65 20 73 75 62 71 75 65 72 79 20  of the subquery 
13650 69 6e 74 6f 20 74 68 65 0a 20 20 2a 2a 20 74 68  into the.  ** th
13660 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66  e FROM clause of
13670 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79   the outer query
13680 2e 20 20 42 65 66 6f 72 65 20 64 6f 69 6e 67 20  .  Before doing 
13690 74 68 69 73 2c 20 72 65 6d 65 6d 62 65 72 0a 20  this, remember. 
136a0 20 2a 2a 20 74 68 65 20 63 75 72 73 6f 72 20 6e   ** the cursor n
136b0 75 6d 62 65 72 20 66 6f 72 20 74 68 65 20 6f 72  umber for the or
136c0 69 67 69 6e 61 6c 20 6f 75 74 65 72 20 71 75 65  iginal outer que
136d0 72 79 20 46 52 4f 4d 20 65 6c 65 6d 65 6e 74 20  ry FROM element 
136e0 69 6e 0a 20 20 2a 2a 20 69 50 61 72 65 6e 74 2e  in.  ** iParent.
136f0 20 20 54 68 65 20 69 50 61 72 65 6e 74 20 63 75    The iParent cu
13700 72 73 6f 72 20 77 69 6c 6c 20 6e 65 76 65 72 20  rsor will never 
13710 62 65 20 75 73 65 64 2e 20 20 53 75 62 73 65 71  be used.  Subseq
13720 75 65 6e 74 20 63 6f 64 65 0a 20 20 2a 2a 20 77  uent code.  ** w
13730 69 6c 6c 20 73 63 61 6e 20 65 78 70 72 65 73 73  ill scan express
13740 69 6f 6e 73 20 6c 6f 6f 6b 69 6e 67 20 66 6f 72  ions looking for
13750 20 69 50 61 72 65 6e 74 20 72 65 66 65 72 65 6e   iParent referen
13760 63 65 73 20 61 6e 64 20 72 65 70 6c 61 63 65 0a  ces and replace.
13770 20 20 2a 2a 20 74 68 6f 73 65 20 72 65 66 65 72    ** those refer
13780 65 6e 63 65 73 20 77 69 74 68 20 65 78 70 72 65  ences with expre
13790 73 73 69 6f 6e 73 20 74 68 61 74 20 72 65 73 6f  ssions that reso
137a0 6c 76 65 20 74 6f 20 74 68 65 20 73 75 62 71 75  lve to the subqu
137b0 65 72 79 20 46 52 4f 4d 0a 20 20 2a 2a 20 65 6c  ery FROM.  ** el
137c0 65 6d 65 6e 74 73 20 77 65 20 61 72 65 20 6e 6f  ements we are no
137d0 77 20 63 6f 70 79 69 6e 67 20 69 6e 2e 0a 20 20  w copying in..  
137e0 2a 2f 0a 20 20 69 50 61 72 65 6e 74 20 3d 20 70  */.  iParent = p
137f0 53 75 62 69 74 65 6d 2d 3e 69 43 75 72 73 6f 72  Subitem->iCursor
13800 3b 0a 20 20 7b 0a 20 20 20 20 69 6e 74 20 6e 53  ;.  {.    int nS
13810 75 62 53 72 63 20 3d 20 70 53 75 62 53 72 63 2d  ubSrc = pSubSrc-
13820 3e 6e 53 72 63 3b 0a 20 20 20 20 69 6e 74 20 6a  >nSrc;.    int j
13830 6f 69 6e 74 79 70 65 20 3d 20 70 53 75 62 69 74  ointype = pSubit
13840 65 6d 2d 3e 6a 6f 69 6e 74 79 70 65 3b 0a 0a 20  em->jointype;.. 
13850 20 20 20 73 71 6c 69 74 65 33 44 65 6c 65 74 65     sqlite3Delete
13860 54 61 62 6c 65 28 70 53 75 62 69 74 65 6d 2d 3e  Table(pSubitem->
13870 70 54 61 62 29 3b 0a 20 20 20 20 73 71 6c 69 74  pTab);.    sqlit
13880 65 33 5f 66 72 65 65 28 70 53 75 62 69 74 65 6d  e3_free(pSubitem
13890 2d 3e 7a 44 61 74 61 62 61 73 65 29 3b 0a 20 20  ->zDatabase);.  
138a0 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
138b0 53 75 62 69 74 65 6d 2d 3e 7a 4e 61 6d 65 29 3b  Subitem->zName);
138c0 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65  .    sqlite3_fre
138d0 65 28 70 53 75 62 69 74 65 6d 2d 3e 7a 41 6c 69  e(pSubitem->zAli
138e0 61 73 29 3b 0a 20 20 20 20 70 53 75 62 69 74 65  as);.    pSubite
138f0 6d 2d 3e 70 54 61 62 20 3d 20 30 3b 0a 20 20 20  m->pTab = 0;.   
13900 20 70 53 75 62 69 74 65 6d 2d 3e 7a 44 61 74 61   pSubitem->zData
13910 62 61 73 65 20 3d 20 30 3b 0a 20 20 20 20 70 53  base = 0;.    pS
13920 75 62 69 74 65 6d 2d 3e 7a 4e 61 6d 65 20 3d 20  ubitem->zName = 
13930 30 3b 0a 20 20 20 20 70 53 75 62 69 74 65 6d 2d  0;.    pSubitem-
13940 3e 7a 41 6c 69 61 73 20 3d 20 30 3b 0a 20 20 20  >zAlias = 0;.   
13950 20 69 66 28 20 6e 53 75 62 53 72 63 3e 31 20 29   if( nSubSrc>1 )
13960 7b 0a 20 20 20 20 20 20 69 6e 74 20 65 78 74 72  {.      int extr
13970 61 20 3d 20 6e 53 75 62 53 72 63 20 2d 20 31 3b  a = nSubSrc - 1;
13980 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 31 3b 20  .      for(i=1; 
13990 69 3c 6e 53 75 62 53 72 63 3b 20 69 2b 2b 29 7b  i<nSubSrc; i++){
139a0 0a 20 20 20 20 20 20 20 20 70 53 72 63 20 3d 20  .        pSrc = 
139b0 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74 41 70  sqlite3SrcListAp
139c0 70 65 6e 64 28 64 62 2c 20 70 53 72 63 2c 20 30  pend(db, pSrc, 0
139d0 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 69 66  , 0);.        if
139e0 28 20 70 53 72 63 3d 3d 30 20 29 7b 0a 20 20 20  ( pSrc==0 ){.   
139f0 20 20 20 20 20 20 20 70 2d 3e 70 53 72 63 20 3d         p->pSrc =
13a00 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65   0;.          re
13a10 74 75 72 6e 20 31 3b 0a 20 20 20 20 20 20 20 20  turn 1;.        
13a20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  }.      }.      
13a30 70 2d 3e 70 53 72 63 20 3d 20 70 53 72 63 3b 0a  p->pSrc = pSrc;.
13a40 20 20 20 20 20 20 66 6f 72 28 69 3d 70 53 72 63        for(i=pSrc
13a50 2d 3e 6e 53 72 63 2d 31 3b 20 69 2d 65 78 74 72  ->nSrc-1; i-extr
13a60 61 3e 3d 69 46 72 6f 6d 3b 20 69 2d 2d 29 7b 0a  a>=iFrom; i--){.
13a70 20 20 20 20 20 20 20 20 70 53 72 63 2d 3e 61 5b          pSrc->a[
13a80 69 5d 20 3d 20 70 53 72 63 2d 3e 61 5b 69 2d 65  i] = pSrc->a[i-e
13a90 78 74 72 61 5d 3b 0a 20 20 20 20 20 20 7d 0a 20  xtra];.      }. 
13aa0 20 20 20 7d 0a 20 20 20 20 66 6f 72 28 69 3d 30     }.    for(i=0
13ab0 3b 20 69 3c 6e 53 75 62 53 72 63 3b 20 69 2b 2b  ; i<nSubSrc; i++
13ac0 29 7b 0a 20 20 20 20 20 20 70 53 72 63 2d 3e 61  ){.      pSrc->a
13ad0 5b 69 2b 69 46 72 6f 6d 5d 20 3d 20 70 53 75 62  [i+iFrom] = pSub
13ae0 53 72 63 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20 20  Src->a[i];.     
13af0 20 6d 65 6d 73 65 74 28 26 70 53 75 62 53 72 63   memset(&pSubSrc
13b00 2d 3e 61 5b 69 5d 2c 20 30 2c 20 73 69 7a 65 6f  ->a[i], 0, sizeo
13b10 66 28 70 53 75 62 53 72 63 2d 3e 61 5b 69 5d 29  f(pSubSrc->a[i])
13b20 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 53 72  );.    }.    pSr
13b30 63 2d 3e 61 5b 69 46 72 6f 6d 5d 2e 6a 6f 69 6e  c->a[iFrom].join
13b40 74 79 70 65 20 3d 20 6a 6f 69 6e 74 79 70 65 3b  type = jointype;
13b50 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4e 6f 77 20 62  .  }..  /* Now b
13b60 65 67 69 6e 20 73 75 62 73 74 69 74 75 74 69 6e  egin substitutin
13b70 67 20 73 75 62 71 75 65 72 79 20 72 65 73 75 6c  g subquery resul
13b80 74 20 73 65 74 20 65 78 70 72 65 73 73 69 6f 6e  t set expression
13b90 73 20 66 6f 72 20 0a 20 20 2a 2a 20 72 65 66 65  s for .  ** refe
13ba0 72 65 6e 63 65 73 20 74 6f 20 74 68 65 20 69 50  rences to the iP
13bb0 61 72 65 6e 74 20 69 6e 20 74 68 65 20 6f 75 74  arent in the out
13bc0 65 72 20 71 75 65 72 79 2e 0a 20 20 2a 2a 20 0a  er query..  ** .
13bd0 20 20 2a 2a 20 45 78 61 6d 70 6c 65 3a 0a 20 20    ** Example:.  
13be0 2a 2a 0a 20 20 2a 2a 20 20 20 53 45 4c 45 43 54  **.  **   SELECT
13bf0 20 61 2b 35 2c 20 62 2a 31 30 20 46 52 4f 4d 20   a+5, b*10 FROM 
13c00 28 53 45 4c 45 43 54 20 78 2a 33 20 41 53 20 61  (SELECT x*3 AS a
13c10 2c 20 79 2b 31 30 20 41 53 20 62 20 46 52 4f 4d  , y+10 AS b FROM
13c20 20 74 31 29 20 57 48 45 52 45 20 61 3e 62 3b 0a   t1) WHERE a>b;.
13c30 20 20 2a 2a 20 20 20 5c 20 20 20 20 20 20 20 20    **   \        
13c40 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 5f 5f               \__
13c50 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 20 73 75 62 71  ___________ subq
13c60 75 65 72 79 20 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 2f  uery __________/
13c70 20 20 20 20 20 20 20 20 20 20 2f 0a 20 20 2a 2a            /.  **
13c80 20 20 20 20 5c 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f      \___________
13c90 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 20 6f 75 74 65 72  __________ outer
13ca0 20 71 75 65 72 79 20 5f 5f 5f 5f 5f 5f 5f 5f 5f   query _________
13cb0 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f  ________________
13cc0 5f 5f 5f 5f 5f 2f 0a 20 20 2a 2a 0a 20 20 2a 2a  _____/.  **.  **
13cd0 20 57 65 20 6c 6f 6f 6b 20 61 74 20 65 76 65 72   We look at ever
13ce0 79 20 65 78 70 72 65 73 73 69 6f 6e 20 69 6e 20  y expression in 
13cf0 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20  the outer query 
13d00 61 6e 64 20 65 76 65 72 79 20 70 6c 61 63 65 20  and every place 
13d10 77 65 20 73 65 65 0a 20 20 2a 2a 20 22 61 22 20  we see.  ** "a" 
13d20 77 65 20 73 75 62 73 74 69 74 75 74 65 20 22 78  we substitute "x
13d30 2a 33 22 20 61 6e 64 20 65 76 65 72 79 20 70 6c  *3" and every pl
13d40 61 63 65 20 77 65 20 73 65 65 20 22 62 22 20 77  ace we see "b" w
13d50 65 20 73 75 62 73 74 69 74 75 74 65 20 22 79 2b  e substitute "y+
13d60 31 30 22 2e 0a 20 20 2a 2f 0a 20 20 70 4c 69 73  10"..  */.  pLis
13d70 74 20 3d 20 70 2d 3e 70 45 4c 69 73 74 3b 0a 20  t = p->pEList;. 
13d80 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4c 69 73   for(i=0; i<pLis
13d90 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a  t->nExpr; i++){.
13da0 20 20 20 20 45 78 70 72 20 2a 70 45 78 70 72 3b      Expr *pExpr;
13db0 0a 20 20 20 20 69 66 28 20 70 4c 69 73 74 2d 3e  .    if( pList->
13dc0 61 5b 69 5d 2e 7a 4e 61 6d 65 3d 3d 30 20 26 26  a[i].zName==0 &&
13dd0 20 28 70 45 78 70 72 20 3d 20 70 4c 69 73 74 2d   (pExpr = pList-
13de0 3e 61 5b 69 5d 2e 70 45 78 70 72 29 2d 3e 73 70  >a[i].pExpr)->sp
13df0 61 6e 2e 7a 21 3d 30 20 29 7b 0a 20 20 20 20 20  an.z!=0 ){.     
13e00 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61   pList->a[i].zNa
13e10 6d 65 20 3d 20 0a 20 20 20 20 20 20 20 20 20 20  me = .          
13e20 20 20 20 73 71 6c 69 74 65 33 44 62 53 74 72 4e     sqlite3DbStrN
13e30 44 75 70 28 64 62 2c 20 28 63 68 61 72 2a 29 70  Dup(db, (char*)p
13e40 45 78 70 72 2d 3e 73 70 61 6e 2e 7a 2c 20 70 45  Expr->span.z, pE
13e50 78 70 72 2d 3e 73 70 61 6e 2e 6e 29 3b 0a 20 20  xpr->span.n);.  
13e60 20 20 7d 0a 20 20 7d 0a 20 20 73 75 62 73 74 45    }.  }.  substE
13e70 78 70 72 4c 69 73 74 28 64 62 2c 20 70 2d 3e 70  xprList(db, p->p
13e80 45 4c 69 73 74 2c 20 69 50 61 72 65 6e 74 2c 20  EList, iParent, 
13e90 70 53 75 62 2d 3e 70 45 4c 69 73 74 29 3b 0a 20  pSub->pEList);. 
13ea0 20 69 66 28 20 69 73 41 67 67 20 29 7b 0a 20 20   if( isAgg ){.  
13eb0 20 20 73 75 62 73 74 45 78 70 72 4c 69 73 74 28    substExprList(
13ec0 64 62 2c 20 70 2d 3e 70 47 72 6f 75 70 42 79 2c  db, p->pGroupBy,
13ed0 20 69 50 61 72 65 6e 74 2c 20 70 53 75 62 2d 3e   iParent, pSub->
13ee0 70 45 4c 69 73 74 29 3b 0a 20 20 20 20 73 75 62  pEList);.    sub
13ef0 73 74 45 78 70 72 28 64 62 2c 20 70 2d 3e 70 48  stExpr(db, p->pH
13f00 61 76 69 6e 67 2c 20 69 50 61 72 65 6e 74 2c 20  aving, iParent, 
13f10 70 53 75 62 2d 3e 70 45 4c 69 73 74 29 3b 0a 20  pSub->pEList);. 
13f20 20 7d 0a 20 20 69 66 28 20 70 53 75 62 2d 3e 70   }.  if( pSub->p
13f30 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20 61  OrderBy ){.    a
13f40 73 73 65 72 74 28 20 70 2d 3e 70 4f 72 64 65 72  ssert( p->pOrder
13f50 42 79 3d 3d 30 20 29 3b 0a 20 20 20 20 70 2d 3e  By==0 );.    p->
13f60 70 4f 72 64 65 72 42 79 20 3d 20 70 53 75 62 2d  pOrderBy = pSub-
13f70 3e 70 4f 72 64 65 72 42 79 3b 0a 20 20 20 20 70  >pOrderBy;.    p
13f80 53 75 62 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20  Sub->pOrderBy = 
13f90 30 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70  0;.  }else if( p
13fa0 2d 3e 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20  ->pOrderBy ){.  
13fb0 20 20 73 75 62 73 74 45 78 70 72 4c 69 73 74 28    substExprList(
13fc0 64 62 2c 20 70 2d 3e 70 4f 72 64 65 72 42 79 2c  db, p->pOrderBy,
13fd0 20 69 50 61 72 65 6e 74 2c 20 70 53 75 62 2d 3e   iParent, pSub->
13fe0 70 45 4c 69 73 74 29 3b 0a 20 20 7d 0a 20 20 69  pEList);.  }.  i
13ff0 66 28 20 70 53 75 62 2d 3e 70 57 68 65 72 65 20  f( pSub->pWhere 
14000 29 7b 0a 20 20 20 20 70 57 68 65 72 65 20 3d 20  ){.    pWhere = 
14010 73 71 6c 69 74 65 33 45 78 70 72 44 75 70 28 64  sqlite3ExprDup(d
14020 62 2c 20 70 53 75 62 2d 3e 70 57 68 65 72 65 29  b, pSub->pWhere)
14030 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70  ;.  }else{.    p
14040 57 68 65 72 65 20 3d 20 30 3b 0a 20 20 7d 0a 20  Where = 0;.  }. 
14050 20 69 66 28 20 73 75 62 71 75 65 72 79 49 73 41   if( subqueryIsA
14060 67 67 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  gg ){.    assert
14070 28 20 70 2d 3e 70 48 61 76 69 6e 67 3d 3d 30 20  ( p->pHaving==0 
14080 29 3b 0a 20 20 20 20 70 2d 3e 70 48 61 76 69 6e  );.    p->pHavin
14090 67 20 3d 20 70 2d 3e 70 57 68 65 72 65 3b 0a 20  g = p->pWhere;. 
140a0 20 20 20 70 2d 3e 70 57 68 65 72 65 20 3d 20 70     p->pWhere = p
140b0 57 68 65 72 65 3b 0a 20 20 20 20 73 75 62 73 74  Where;.    subst
140c0 45 78 70 72 28 64 62 2c 20 70 2d 3e 70 48 61 76  Expr(db, p->pHav
140d0 69 6e 67 2c 20 69 50 61 72 65 6e 74 2c 20 70 53  ing, iParent, pS
140e0 75 62 2d 3e 70 45 4c 69 73 74 29 3b 0a 20 20 20  ub->pEList);.   
140f0 20 70 2d 3e 70 48 61 76 69 6e 67 20 3d 20 73 71   p->pHaving = sq
14100 6c 69 74 65 33 45 78 70 72 41 6e 64 28 64 62 2c  lite3ExprAnd(db,
14110 20 70 2d 3e 70 48 61 76 69 6e 67 2c 20 0a 20 20   p->pHaving, .  
14120 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14130 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71                sq
14140 6c 69 74 65 33 45 78 70 72 44 75 70 28 64 62 2c  lite3ExprDup(db,
14150 20 70 53 75 62 2d 3e 70 48 61 76 69 6e 67 29 29   pSub->pHaving))
14160 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 2d  ;.    assert( p-
14170 3e 70 47 72 6f 75 70 42 79 3d 3d 30 20 29 3b 0a  >pGroupBy==0 );.
14180 20 20 20 20 70 2d 3e 70 47 72 6f 75 70 42 79 20      p->pGroupBy 
14190 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73  = sqlite3ExprLis
141a0 74 44 75 70 28 64 62 2c 20 70 53 75 62 2d 3e 70  tDup(db, pSub->p
141b0 47 72 6f 75 70 42 79 29 3b 0a 20 20 7d 65 6c 73  GroupBy);.  }els
141c0 65 7b 0a 20 20 20 20 73 75 62 73 74 45 78 70 72  e{.    substExpr
141d0 28 64 62 2c 20 70 2d 3e 70 57 68 65 72 65 2c 20  (db, p->pWhere, 
141e0 69 50 61 72 65 6e 74 2c 20 70 53 75 62 2d 3e 70  iParent, pSub->p
141f0 45 4c 69 73 74 29 3b 0a 20 20 20 20 70 2d 3e 70  EList);.    p->p
14200 57 68 65 72 65 20 3d 20 73 71 6c 69 74 65 33 45  Where = sqlite3E
14210 78 70 72 41 6e 64 28 64 62 2c 20 70 2d 3e 70 57  xprAnd(db, p->pW
14220 68 65 72 65 2c 20 70 57 68 65 72 65 29 3b 0a 20  here, pWhere);. 
14230 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 66 6c 61   }..  /* The fla
14240 74 74 65 6e 65 64 20 71 75 65 72 79 20 69 73 20  ttened query is 
14250 64 69 73 74 69 6e 63 74 20 69 66 20 65 69 74 68  distinct if eith
14260 65 72 20 74 68 65 20 69 6e 6e 65 72 20 6f 72 20  er the inner or 
14270 74 68 65 0a 20 20 2a 2a 20 6f 75 74 65 72 20 71  the.  ** outer q
14280 75 65 72 79 20 69 73 20 64 69 73 74 69 6e 63 74  uery is distinct
14290 2e 20 0a 20 20 2a 2f 0a 20 20 70 2d 3e 69 73 44  . .  */.  p->isD
142a0 69 73 74 69 6e 63 74 20 3d 20 70 2d 3e 69 73 44  istinct = p->isD
142b0 69 73 74 69 6e 63 74 20 7c 7c 20 70 53 75 62 2d  istinct || pSub-
142c0 3e 69 73 44 69 73 74 69 6e 63 74 3b 0a 0a 20 20  >isDistinct;..  
142d0 2f 2a 0a 20 20 2a 2a 20 53 45 4c 45 43 54 20 2e  /*.  ** SELECT .
142e0 2e 2e 20 46 52 4f 4d 20 28 53 45 4c 45 43 54 20  .. FROM (SELECT 
142f0 2e 2e 2e 20 4c 49 4d 49 54 20 61 20 4f 46 46 53  ... LIMIT a OFFS
14300 45 54 20 62 29 20 4c 49 4d 49 54 20 78 20 4f 46  ET b) LIMIT x OF
14310 46 53 45 54 20 79 3b 0a 20 20 2a 2a 0a 20 20 2a  FSET y;.  **.  *
14320 2a 20 4f 6e 65 20 69 73 20 74 65 6d 70 74 65 64  * One is tempted
14330 20 74 6f 20 74 72 79 20 74 6f 20 61 64 64 20 61   to try to add a
14340 20 61 6e 64 20 62 20 74 6f 20 63 6f 6d 62 69 6e   and b to combin
14350 65 20 74 68 65 20 6c 69 6d 69 74 73 2e 20 20 42  e the limits.  B
14360 75 74 20 74 68 69 73 0a 20 20 2a 2a 20 64 6f 65  ut this.  ** doe
14370 73 20 6e 6f 74 20 77 6f 72 6b 20 69 66 20 65 69  s not work if ei
14380 74 68 65 72 20 6c 69 6d 69 74 20 69 73 20 6e 65  ther limit is ne
14390 67 61 74 69 76 65 2e 0a 20 20 2a 2f 0a 20 20 69  gative..  */.  i
143a0 66 28 20 70 53 75 62 2d 3e 70 4c 69 6d 69 74 20  f( pSub->pLimit 
143b0 29 7b 0a 20 20 20 20 70 2d 3e 70 4c 69 6d 69 74  ){.    p->pLimit
143c0 20 3d 20 70 53 75 62 2d 3e 70 4c 69 6d 69 74 3b   = pSub->pLimit;
143d0 0a 20 20 20 20 70 53 75 62 2d 3e 70 4c 69 6d 69  .    pSub->pLimi
143e0 74 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  t = 0;.  }..  /*
143f0 20 46 69 6e 69 61 6c 6c 79 2c 20 64 65 6c 65 74   Finially, delet
14400 65 20 77 68 61 74 20 69 73 20 6c 65 66 74 20 6f  e what is left o
14410 66 20 74 68 65 20 73 75 62 71 75 65 72 79 20 61  f the subquery a
14420 6e 64 20 72 65 74 75 72 6e 0a 20 20 2a 2a 20 73  nd return.  ** s
14430 75 63 63 65 73 73 2e 0a 20 20 2a 2f 0a 20 20 73  uccess..  */.  s
14440 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65 6c 65  qlite3SelectDele
14450 74 65 28 70 53 75 62 29 3b 0a 20 20 72 65 74 75  te(pSub);.  retu
14460 72 6e 20 31 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f  rn 1;.}.#endif /
14470 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49  * SQLITE_OMIT_VI
14480 45 57 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 41 6e 61  EW */../*.** Ana
14490 6c 79 7a 65 20 74 68 65 20 53 45 4c 45 43 54 20  lyze the SELECT 
144a0 73 74 61 74 65 6d 65 6e 74 20 70 61 73 73 65 64  statement passed
144b0 20 69 6e 20 61 73 20 61 6e 20 61 72 67 75 6d 65   in as an argume
144c0 6e 74 20 74 6f 20 73 65 65 20 69 66 20 69 74 0a  nt to see if it.
144d0 2a 2a 20 69 73 20 61 20 73 69 6d 70 6c 65 20 6d  ** is a simple m
144e0 69 6e 28 29 20 6f 72 20 6d 61 78 28 29 20 71 75  in() or max() qu
144f0 65 72 79 2e 20 20 49 66 20 69 74 20 69 73 20 61  ery.  If it is a
14500 6e 64 20 74 68 69 73 20 71 75 65 72 79 20 63 61  nd this query ca
14510 6e 20 62 65 0a 2a 2a 20 73 61 74 69 73 66 69 65  n be.** satisfie
14520 64 20 75 73 69 6e 67 20 61 20 73 69 6e 67 6c 65  d using a single
14530 20 73 65 65 6b 20 74 6f 20 74 68 65 20 62 65 67   seek to the beg
14540 69 6e 6e 69 6e 67 20 6f 72 20 65 6e 64 20 6f 66  inning or end of
14550 20 61 6e 20 69 6e 64 65 78 2c 0a 2a 2a 20 74 68   an index,.** th
14560 65 6e 20 67 65 6e 65 72 61 74 65 20 74 68 65 20  en generate the 
14570 63 6f 64 65 20 66 6f 72 20 74 68 69 73 20 53 45  code for this SE
14580 4c 45 43 54 20 61 6e 64 20 72 65 74 75 72 6e 20  LECT and return 
14590 31 2e 20 20 49 66 20 74 68 69 73 20 69 73 20 6e  1.  If this is n
145a0 6f 74 20 61 20 0a 2a 2a 20 73 69 6d 70 6c 65 20  ot a .** simple 
145b0 6d 69 6e 28 29 20 6f 72 20 6d 61 78 28 29 20 71  min() or max() q
145c0 75 65 72 79 2c 20 74 68 65 6e 20 72 65 74 75 72  uery, then retur
145d0 6e 20 30 3b 0a 2a 2a 0a 2a 2a 20 41 20 73 69 6d  n 0;.**.** A sim
145e0 70 6c 79 20 6d 69 6e 28 29 20 6f 72 20 6d 61 78  ply min() or max
145f0 28 29 20 71 75 65 72 79 20 6c 6f 6f 6b 73 20 6c  () query looks l
14600 69 6b 65 20 74 68 69 73 3a 0a 2a 2a 0a 2a 2a 20  ike this:.**.** 
14610 20 20 20 53 45 4c 45 43 54 20 6d 69 6e 28 61 29     SELECT min(a)
14620 20 46 52 4f 4d 20 74 61 62 6c 65 3b 0a 2a 2a 20   FROM table;.** 
14630 20 20 20 53 45 4c 45 43 54 20 6d 61 78 28 61 29     SELECT max(a)
14640 20 46 52 4f 4d 20 74 61 62 6c 65 3b 0a 2a 2a 0a   FROM table;.**.
14650 2a 2a 20 54 68 65 20 71 75 65 72 79 20 6d 61 79  ** The query may
14660 20 68 61 76 65 20 6f 6e 6c 79 20 61 20 73 69 6e   have only a sin
14670 67 6c 65 20 74 61 62 6c 65 20 69 6e 20 69 74 73  gle table in its
14680 20 46 52 4f 4d 20 61 72 67 75 6d 65 6e 74 2e 20   FROM argument. 
14690 20 54 68 65 72 65 0a 2a 2a 20 63 61 6e 20 62 65   There.** can be
146a0 20 6e 6f 20 47 52 4f 55 50 20 42 59 20 6f 72 20   no GROUP BY or 
146b0 48 41 56 49 4e 47 20 6f 72 20 57 48 45 52 45 20  HAVING or WHERE 
146c0 63 6c 61 75 73 65 73 2e 20 20 54 68 65 20 72 65  clauses.  The re
146d0 73 75 6c 74 20 73 65 74 20 6d 75 73 74 0a 2a 2a  sult set must.**
146e0 20 62 65 20 74 68 65 20 6d 69 6e 28 29 20 6f 72   be the min() or
146f0 20 6d 61 78 28 29 20 6f 66 20 61 20 73 69 6e 67   max() of a sing
14700 6c 65 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 68 65  le column of the
14710 20 74 61 62 6c 65 2e 20 20 54 68 65 20 63 6f 6c   table.  The col
14720 75 6d 6e 0a 2a 2a 20 69 6e 20 74 68 65 20 6d 69  umn.** in the mi
14730 6e 28 29 20 6f 72 20 6d 61 78 28 29 20 66 75 6e  n() or max() fun
14740 63 74 69 6f 6e 20 6d 75 73 74 20 62 65 20 69 6e  ction must be in
14750 64 65 78 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  dexed..**.** The
14760 20 70 61 72 61 6d 65 74 65 72 73 20 74 6f 20 74   parameters to t
14770 68 69 73 20 72 6f 75 74 69 6e 65 20 61 72 65 20  his routine are 
14780 74 68 65 20 73 61 6d 65 20 61 73 20 66 6f 72 20  the same as for 
14790 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28 29 2e  sqlite3Select().
147a0 0a 2a 2a 20 53 65 65 20 74 68 65 20 68 65 61 64  .** See the head
147b0 65 72 20 63 6f 6d 6d 65 6e 74 20 6f 6e 20 74 68  er comment on th
147c0 61 74 20 72 6f 75 74 69 6e 65 20 66 6f 72 20 61  at routine for a
147d0 64 64 69 74 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d  dditional inform
147e0 61 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63  ation..*/.static
147f0 20 69 6e 74 20 73 69 6d 70 6c 65 4d 69 6e 4d 61   int simpleMinMa
14800 78 51 75 65 72 79 28 50 61 72 73 65 20 2a 70 50  xQuery(Parse *pP
14810 61 72 73 65 2c 20 53 65 6c 65 63 74 20 2a 70 2c  arse, Select *p,
14820 20 69 6e 74 20 65 44 65 73 74 2c 20 69 6e 74 20   int eDest, int 
14830 69 50 61 72 6d 29 7b 0a 20 20 45 78 70 72 20 2a  iParm){.  Expr *
14840 70 45 78 70 72 3b 0a 20 20 69 6e 74 20 69 43 6f  pExpr;.  int iCo
14850 6c 3b 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62  l;.  Table *pTab
14860 3b 0a 20 20 49 6e 64 65 78 20 2a 70 49 64 78 3b  ;.  Index *pIdx;
14870 0a 20 20 69 6e 74 20 62 61 73 65 3b 0a 20 20 56  .  int base;.  V
14880 64 62 65 20 2a 76 3b 0a 20 20 69 6e 74 20 73 65  dbe *v;.  int se
14890 65 6b 4f 70 3b 0a 20 20 45 78 70 72 4c 69 73 74  ekOp;.  ExprList
148a0 20 2a 70 45 4c 69 73 74 2c 20 2a 70 4c 69 73 74   *pEList, *pList
148b0 2c 20 65 4c 69 73 74 3b 0a 20 20 73 74 72 75 63  , eList;.  struc
148c0 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20  t ExprList_item 
148d0 65 4c 69 73 74 49 74 65 6d 3b 0a 20 20 53 72 63  eListItem;.  Src
148e0 4c 69 73 74 20 2a 70 53 72 63 3b 0a 20 20 69 6e  List *pSrc;.  in
148f0 74 20 62 72 6b 3b 0a 20 20 69 6e 74 20 69 44 62  t brk;.  int iDb
14900 3b 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 74 6f  ;..  /* Check to
14910 20 73 65 65 20 69 66 20 74 68 69 73 20 71 75 65   see if this que
14920 72 79 20 69 73 20 61 20 73 69 6d 70 6c 65 20 6d  ry is a simple m
14930 69 6e 28 29 20 6f 72 20 6d 61 78 28 29 20 71 75  in() or max() qu
14940 65 72 79 2e 20 20 52 65 74 75 72 6e 0a 20 20 2a  ery.  Return.  *
14950 2a 20 7a 65 72 6f 20 69 66 20 69 74 20 69 73 20  * zero if it is 
14960 20 6e 6f 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28   not..  */.  if(
14970 20 70 2d 3e 70 47 72 6f 75 70 42 79 20 7c 7c 20   p->pGroupBy || 
14980 70 2d 3e 70 48 61 76 69 6e 67 20 7c 7c 20 70 2d  p->pHaving || p-
14990 3e 70 57 68 65 72 65 20 29 20 72 65 74 75 72 6e  >pWhere ) return
149a0 20 30 3b 0a 20 20 70 53 72 63 20 3d 20 70 2d 3e   0;.  pSrc = p->
149b0 70 53 72 63 3b 0a 20 20 69 66 28 20 70 53 72 63  pSrc;.  if( pSrc
149c0 2d 3e 6e 53 72 63 21 3d 31 20 29 20 72 65 74 75  ->nSrc!=1 ) retu
149d0 72 6e 20 30 3b 0a 20 20 70 45 4c 69 73 74 20 3d  rn 0;.  pEList =
149e0 20 70 2d 3e 70 45 4c 69 73 74 3b 0a 20 20 69 66   p->pEList;.  if
149f0 28 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 21  ( pEList->nExpr!
14a00 3d 31 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  =1 ) return 0;. 
14a10 20 70 45 78 70 72 20 3d 20 70 45 4c 69 73 74 2d   pExpr = pEList-
14a20 3e 61 5b 30 5d 2e 70 45 78 70 72 3b 0a 20 20 69  >a[0].pExpr;.  i
14a30 66 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b  f( pExpr->op!=TK
14a40 5f 41 47 47 5f 46 55 4e 43 54 49 4f 4e 20 29 20  _AGG_FUNCTION ) 
14a50 72 65 74 75 72 6e 20 30 3b 0a 20 20 70 4c 69 73  return 0;.  pLis
14a60 74 20 3d 20 70 45 78 70 72 2d 3e 70 4c 69 73 74  t = pExpr->pList
14a70 3b 0a 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30  ;.  if( pList==0
14a80 20 7c 7c 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72   || pList->nExpr
14a90 21 3d 31 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  !=1 ) return 0;.
14aa0 20 20 69 66 28 20 70 45 78 70 72 2d 3e 74 6f 6b    if( pExpr->tok
14ab0 65 6e 2e 6e 21 3d 33 20 29 20 72 65 74 75 72 6e  en.n!=3 ) return
14ac0 20 30 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65   0;.  if( sqlite
14ad0 33 53 74 72 4e 49 43 6d 70 28 28 63 68 61 72 2a  3StrNICmp((char*
14ae0 29 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 7a 2c  )pExpr->token.z,
14af0 22 6d 69 6e 22 2c 33 29 3d 3d 30 20 29 7b 0a 20  "min",3)==0 ){. 
14b00 20 20 20 73 65 65 6b 4f 70 20 3d 20 4f 50 5f 52     seekOp = OP_R
14b10 65 77 69 6e 64 3b 0a 20 20 7d 65 6c 73 65 20 69  ewind;.  }else i
14b20 66 28 20 73 71 6c 69 74 65 33 53 74 72 4e 49 43  f( sqlite3StrNIC
14b30 6d 70 28 28 63 68 61 72 2a 29 70 45 78 70 72 2d  mp((char*)pExpr-
14b40 3e 74 6f 6b 65 6e 2e 7a 2c 22 6d 61 78 22 2c 33  >token.z,"max",3
14b50 29 3d 3d 30 20 29 7b 0a 20 20 20 20 73 65 65 6b  )==0 ){.    seek
14b60 4f 70 20 3d 20 4f 50 5f 4c 61 73 74 3b 0a 20 20  Op = OP_Last;.  
14b70 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65 74 75 72  }else{.    retur
14b80 6e 20 30 3b 0a 20 20 7d 0a 20 20 70 45 78 70 72  n 0;.  }.  pExpr
14b90 20 3d 20 70 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70   = pList->a[0].p
14ba0 45 78 70 72 3b 0a 20 20 69 66 28 20 70 45 78 70  Expr;.  if( pExp
14bb0 72 2d 3e 6f 70 21 3d 54 4b 5f 43 4f 4c 55 4d 4e  r->op!=TK_COLUMN
14bc0 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69   ) return 0;.  i
14bd0 43 6f 6c 20 3d 20 70 45 78 70 72 2d 3e 69 43 6f  Col = pExpr->iCo
14be0 6c 75 6d 6e 3b 0a 20 20 70 54 61 62 20 3d 20 70  lumn;.  pTab = p
14bf0 53 72 63 2d 3e 61 5b 30 5d 2e 70 54 61 62 3b 0a  Src->a[0].pTab;.
14c00 0a 20 20 2f 2a 20 54 68 69 73 20 6f 70 74 69 6d  .  /* This optim
14c10 69 7a 61 74 69 6f 6e 20 63 61 6e 6e 6f 74 20 62  ization cannot b
14c20 65 20 75 73 65 64 20 77 69 74 68 20 76 69 72 74  e used with virt
14c30 75 61 6c 20 74 61 62 6c 65 73 2e 20 2a 2f 0a 20  ual tables. */. 
14c40 20 69 66 28 20 49 73 56 69 72 74 75 61 6c 28 70   if( IsVirtual(p
14c50 54 61 62 29 20 29 20 72 65 74 75 72 6e 20 30 3b  Tab) ) return 0;
14c60 0a 0a 20 20 2f 2a 20 49 66 20 77 65 20 67 65 74  ..  /* If we get
14c70 20 74 6f 20 68 65 72 65 2c 20 69 74 20 6d 65 61   to here, it mea
14c80 6e 73 20 74 68 65 20 71 75 65 72 79 20 69 73 20  ns the query is 
14c90 6f 66 20 74 68 65 20 63 6f 72 72 65 63 74 20 66  of the correct f
14ca0 6f 72 6d 2e 0a 20 20 2a 2a 20 43 68 65 63 6b 20  orm..  ** Check 
14cb0 74 6f 20 6d 61 6b 65 20 73 75 72 65 20 77 65 20  to make sure we 
14cc0 68 61 76 65 20 61 6e 20 69 6e 64 65 78 20 61 6e  have an index an
14cd0 64 20 6d 61 6b 65 20 70 49 64 78 20 70 6f 69 6e  d make pIdx poin
14ce0 74 20 74 6f 20 74 68 65 0a 20 20 2a 2a 20 61 70  t to the.  ** ap
14cf0 70 72 6f 70 72 69 61 74 65 20 69 6e 64 65 78 2e  propriate index.
14d00 20 20 49 66 20 74 68 65 20 6d 69 6e 28 29 20 6f    If the min() o
14d10 72 20 6d 61 78 28 29 20 69 73 20 6f 6e 20 61 6e  r max() is on an
14d20 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59   INTEGER PRIMARY
14d30 0a 20 20 2a 2a 20 6b 65 79 20 63 6f 6c 75 6d 6e  .  ** key column
14d40 2c 20 6e 6f 20 69 6e 64 65 78 20 69 73 20 6e 65  , no index is ne
14d50 63 65 73 73 61 72 79 20 73 6f 20 73 65 74 20 70  cessary so set p
14d60 49 64 78 20 74 6f 20 4e 55 4c 4c 2e 20 20 49 66  Idx to NULL.  If
14d70 20 6e 6f 0a 20 20 2a 2a 20 75 73 61 62 6c 65 20   no.  ** usable 
14d80 69 6e 64 65 78 20 69 73 20 66 6f 75 6e 64 2c 20  index is found, 
14d90 72 65 74 75 72 6e 20 30 2e 0a 20 20 2a 2f 0a 20  return 0..  */. 
14da0 20 69 66 28 20 69 43 6f 6c 3c 30 20 29 7b 0a 20   if( iCol<0 ){. 
14db0 20 20 20 70 49 64 78 20 3d 20 30 3b 0a 20 20 7d     pIdx = 0;.  }
14dc0 65 6c 73 65 7b 0a 20 20 20 20 43 6f 6c 6c 53 65  else{.    CollSe
14dd0 71 20 2a 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74  q *pColl = sqlit
14de0 65 33 45 78 70 72 43 6f 6c 6c 53 65 71 28 70 50  e3ExprCollSeq(pP
14df0 61 72 73 65 2c 20 70 45 78 70 72 29 3b 0a 20 20  arse, pExpr);.  
14e00 20 20 69 66 28 20 70 43 6f 6c 6c 3d 3d 30 20 29    if( pColl==0 )
14e10 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 66   return 0;.    f
14e20 6f 72 28 70 49 64 78 3d 70 54 61 62 2d 3e 70 49  or(pIdx=pTab->pI
14e30 6e 64 65 78 3b 20 70 49 64 78 3b 20 70 49 64 78  ndex; pIdx; pIdx
14e40 3d 70 49 64 78 2d 3e 70 4e 65 78 74 29 7b 0a 20  =pIdx->pNext){. 
14e50 20 20 20 20 20 61 73 73 65 72 74 28 20 70 49 64       assert( pId
14e60 78 2d 3e 6e 43 6f 6c 75 6d 6e 3e 3d 31 20 29 3b  x->nColumn>=1 );
14e70 0a 20 20 20 20 20 20 69 66 28 20 70 49 64 78 2d  .      if( pIdx-
14e80 3e 61 69 43 6f 6c 75 6d 6e 5b 30 5d 3d 3d 69 43  >aiColumn[0]==iC
14e90 6f 6c 20 26 26 20 0a 20 20 20 20 20 20 20 20 20  ol && .         
14ea0 20 30 3d 3d 73 71 6c 69 74 65 33 53 74 72 49 43   0==sqlite3StrIC
14eb0 6d 70 28 70 49 64 78 2d 3e 61 7a 43 6f 6c 6c 5b  mp(pIdx->azColl[
14ec0 30 5d 2c 20 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65  0], pColl->zName
14ed0 29 20 29 7b 0a 20 20 20 20 20 20 20 20 62 72 65  ) ){.        bre
14ee0 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ak;.      }.    
14ef0 7d 0a 20 20 20 20 69 66 28 20 70 49 64 78 3d 3d  }.    if( pIdx==
14f00 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  0 ) return 0;.  
14f10 7d 0a 0a 20 20 2f 2a 20 49 64 65 6e 74 69 66 79  }..  /* Identify
14f20 20 63 6f 6c 75 6d 6e 20 74 79 70 65 73 20 69 66   column types if
14f30 20 77 65 20 77 69 6c 6c 20 62 65 20 75 73 69 6e   we will be usin
14f40 67 20 74 68 65 20 63 61 6c 6c 62 61 63 6b 2e 20  g the callback. 
14f50 20 54 68 69 73 0a 20 20 2a 2a 20 73 74 65 70 20   This.  ** step 
14f60 69 73 20 73 6b 69 70 70 65 64 20 69 66 20 74 68  is skipped if th
14f70 65 20 6f 75 74 70 75 74 20 69 73 20 67 6f 69 6e  e output is goin
14f80 67 20 74 6f 20 61 20 74 61 62 6c 65 20 6f 72 20  g to a table or 
14f90 61 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 2e 0a 20  a memory cell.. 
14fa0 20 2a 2a 20 54 68 65 20 63 6f 6c 75 6d 6e 20 6e   ** The column n
14fb0 61 6d 65 73 20 68 61 76 65 20 61 6c 72 65 61 64  ames have alread
14fc0 79 20 62 65 65 6e 20 67 65 6e 65 72 61 74 65 64  y been generated
14fd0 20 69 6e 20 74 68 65 20 63 61 6c 6c 69 6e 67 20   in the calling 
14fe0 66 75 6e 63 74 69 6f 6e 2e 0a 20 20 2a 2f 0a 20  function..  */. 
14ff0 20 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56   v = sqlite3GetV
15000 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20 69  dbe(pParse);.  i
15010 66 28 20 76 3d 3d 30 20 29 20 72 65 74 75 72 6e  f( v==0 ) return
15020 20 30 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65   0;..  /* If the
15030 20 6f 75 74 70 75 74 20 69 73 20 64 65 73 74 69   output is desti
15040 6e 65 64 20 66 6f 72 20 61 20 74 65 6d 70 6f 72  ned for a tempor
15050 61 72 79 20 74 61 62 6c 65 2c 20 6f 70 65 6e 20  ary table, open 
15060 74 68 61 74 20 74 61 62 6c 65 2e 0a 20 20 2a 2f  that table..  */
15070 0a 20 20 69 66 28 20 65 44 65 73 74 3d 3d 53 52  .  if( eDest==SR
15080 54 5f 45 70 68 65 6d 54 61 62 20 29 7b 0a 20 20  T_EphemTab ){.  
15090 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
150a0 4f 70 28 76 2c 20 4f 50 5f 4f 70 65 6e 45 70 68  Op(v, OP_OpenEph
150b0 65 6d 65 72 61 6c 2c 20 69 50 61 72 6d 2c 20 31  emeral, iParm, 1
150c0 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 47 65 6e  );.  }..  /* Gen
150d0 65 72 61 74 69 6e 67 20 63 6f 64 65 20 74 6f 20  erating code to 
150e0 66 69 6e 64 20 74 68 65 20 6d 69 6e 20 6f 72 20  find the min or 
150f0 74 68 65 20 6d 61 78 2e 20 20 42 61 73 69 63 61  the max.  Basica
15100 6c 6c 79 20 61 6c 6c 20 77 65 20 68 61 76 65 0a  lly all we have.
15110 20 20 2a 2a 20 74 6f 20 64 6f 20 69 73 20 66 69    ** to do is fi
15120 6e 64 20 74 68 65 20 66 69 72 73 74 20 6f 72 20  nd the first or 
15130 74 68 65 20 6c 61 73 74 20 65 6e 74 72 79 20 69  the last entry i
15140 6e 20 74 68 65 20 63 68 6f 73 65 6e 20 69 6e 64  n the chosen ind
15150 65 78 2e 20 20 49 66 0a 20 20 2a 2a 20 74 68 65  ex.  If.  ** the
15160 20 6d 69 6e 28 29 20 6f 72 20 6d 61 78 28 29 20   min() or max() 
15170 69 73 20 6f 6e 20 74 68 65 20 49 4e 54 45 47 45  is on the INTEGE
15180 52 20 50 52 49 4d 41 52 59 20 4b 45 59 2c 20 74  R PRIMARY KEY, t
15190 68 65 6e 20 66 69 6e 64 20 74 68 65 20 66 69 72  hen find the fir
151a0 73 74 0a 20 20 2a 2a 20 6f 72 20 6c 61 73 74 20  st.  ** or last 
151b0 65 6e 74 72 79 20 69 6e 20 74 68 65 20 6d 61 69  entry in the mai
151c0 6e 20 74 61 62 6c 65 2e 0a 20 20 2a 2f 0a 20 20  n table..  */.  
151d0 69 44 62 20 3d 20 73 71 6c 69 74 65 33 53 63 68  iDb = sqlite3Sch
151e0 65 6d 61 54 6f 49 6e 64 65 78 28 70 50 61 72 73  emaToIndex(pPars
151f0 65 2d 3e 64 62 2c 20 70 54 61 62 2d 3e 70 53 63  e->db, pTab->pSc
15200 68 65 6d 61 29 3b 0a 20 20 61 73 73 65 72 74 28  hema);.  assert(
15210 20 69 44 62 3e 3d 30 20 7c 7c 20 70 54 61 62 2d   iDb>=0 || pTab-
15220 3e 69 73 45 70 68 65 6d 20 29 3b 0a 20 20 73 71  >isEphem );.  sq
15230 6c 69 74 65 33 43 6f 64 65 56 65 72 69 66 79 53  lite3CodeVerifyS
15240 63 68 65 6d 61 28 70 50 61 72 73 65 2c 20 69 44  chema(pParse, iD
15250 62 29 3b 0a 20 20 73 71 6c 69 74 65 33 54 61 62  b);.  sqlite3Tab
15260 6c 65 4c 6f 63 6b 28 70 50 61 72 73 65 2c 20 69  leLock(pParse, i
15270 44 62 2c 20 70 54 61 62 2d 3e 74 6e 75 6d 2c 20  Db, pTab->tnum, 
15280 30 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b  0, pTab->zName);
15290 0a 20 20 62 61 73 65 20 3d 20 70 53 72 63 2d 3e  .  base = pSrc->
152a0 61 5b 30 5d 2e 69 43 75 72 73 6f 72 3b 0a 20 20  a[0].iCursor;.  
152b0 62 72 6b 20 3d 20 73 71 6c 69 74 65 33 56 64 62  brk = sqlite3Vdb
152c0 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20  eMakeLabel(v);. 
152d0 20 63 6f 6d 70 75 74 65 4c 69 6d 69 74 52 65 67   computeLimitReg
152e0 69 73 74 65 72 73 28 70 50 61 72 73 65 2c 20 70  isters(pParse, p
152f0 2c 20 62 72 6b 29 3b 0a 20 20 69 66 28 20 70 53  , brk);.  if( pS
15300 72 63 2d 3e 61 5b 30 5d 2e 70 53 65 6c 65 63 74  rc->a[0].pSelect
15310 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ==0 ){.    sqlit
15320 65 33 4f 70 65 6e 54 61 62 6c 65 28 70 50 61 72  e3OpenTable(pPar
15330 73 65 2c 20 62 61 73 65 2c 20 69 44 62 2c 20 70  se, base, iDb, p
15340 54 61 62 2c 20 4f 50 5f 4f 70 65 6e 52 65 61 64  Tab, OP_OpenRead
15350 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 49 64  );.  }.  if( pId
15360 78 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69  x==0 ){.    sqli
15370 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
15380 73 65 65 6b 4f 70 2c 20 62 61 73 65 2c 20 30 29  seekOp, base, 0)
15390 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f  ;.  }else{.    /
153a0 2a 20 45 76 65 6e 20 74 68 6f 75 67 68 20 74 68  * Even though th
153b0 65 20 63 75 72 73 6f 72 20 75 73 65 64 20 74 6f  e cursor used to
153c0 20 6f 70 65 6e 20 74 68 65 20 69 6e 64 65 78 20   open the index 
153d0 68 65 72 65 20 69 73 20 63 6c 6f 73 65 64 0a 20  here is closed. 
153e0 20 20 20 2a 2a 20 61 73 20 73 6f 6f 6e 20 61 73     ** as soon as
153f0 20 61 20 73 69 6e 67 6c 65 20 76 61 6c 75 65 20   a single value 
15400 68 61 73 20 62 65 65 6e 20 72 65 61 64 20 66 72  has been read fr
15410 6f 6d 20 69 74 2c 20 61 6c 6c 6f 63 61 74 65 20  om it, allocate 
15420 69 74 0a 20 20 20 20 2a 2a 20 75 73 69 6e 67 20  it.    ** using 
15430 28 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 29  (pParse->nTab++)
15440 20 74 6f 20 70 72 65 76 65 6e 74 20 74 68 65 20   to prevent the 
15450 63 75 72 73 6f 72 20 69 64 20 66 72 6f 6d 20 62  cursor id from b
15460 65 69 6e 67 20 0a 20 20 20 20 2a 2a 20 72 65 75  eing .    ** reu
15470 73 65 64 2e 20 54 68 69 73 20 69 73 20 69 6d 70  sed. This is imp
15480 6f 72 74 61 6e 74 20 66 6f 72 20 73 74 61 74 65  ortant for state
15490 6d 65 6e 74 73 20 6f 66 20 74 68 65 20 66 6f 72  ments of the for
154a0 6d 20 0a 20 20 20 20 2a 2a 20 22 49 4e 53 45 52  m .    ** "INSER
154b0 54 20 49 4e 54 4f 20 78 20 53 45 4c 45 43 54 20  T INTO x SELECT 
154c0 6d 61 78 28 29 20 46 52 4f 4d 20 78 22 2e 0a 20  max() FROM x".. 
154d0 20 20 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 49     */.    int iI
154e0 64 78 3b 0a 20 20 20 20 4b 65 79 49 6e 66 6f 20  dx;.    KeyInfo 
154f0 2a 70 4b 65 79 20 3d 20 73 71 6c 69 74 65 33 49  *pKey = sqlite3I
15500 6e 64 65 78 4b 65 79 69 6e 66 6f 28 70 50 61 72  ndexKeyinfo(pPar
15510 73 65 2c 20 70 49 64 78 29 3b 0a 20 20 20 20 69  se, pIdx);.    i
15520 49 64 78 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54  Idx = pParse->nT
15530 61 62 2b 2b 3b 0a 20 20 20 20 61 73 73 65 72 74  ab++;.    assert
15540 28 20 70 49 64 78 2d 3e 70 53 63 68 65 6d 61 3d  ( pIdx->pSchema=
15550 3d 70 54 61 62 2d 3e 70 53 63 68 65 6d 61 20 29  =pTab->pSchema )
15560 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
15570 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49 6e 74  eAddOp(v, OP_Int
15580 65 67 65 72 2c 20 69 44 62 2c 20 30 29 3b 0a 20  eger, iDb, 0);. 
15590 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4f 70     sqlite3VdbeOp
155a0 33 28 76 2c 20 4f 50 5f 4f 70 65 6e 52 65 61 64  3(v, OP_OpenRead
155b0 2c 20 69 49 64 78 2c 20 70 49 64 78 2d 3e 74 6e  , iIdx, pIdx->tn
155c0 75 6d 2c 20 0a 20 20 20 20 20 20 20 20 28 63 68  um, .        (ch
155d0 61 72 2a 29 70 4b 65 79 2c 20 50 33 5f 4b 45 59  ar*)pKey, P3_KEY
155e0 49 4e 46 4f 5f 48 41 4e 44 4f 46 46 29 3b 0a 20  INFO_HANDOFF);. 
155f0 20 20 20 69 66 28 20 73 65 65 6b 4f 70 3d 3d 4f     if( seekOp==O
15600 50 5f 52 65 77 69 6e 64 20 29 7b 0a 20 20 20 20  P_Rewind ){.    
15610 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
15620 4f 70 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30  Op(v, OP_Null, 0
15630 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  , 0);.      sqli
15640 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
15650 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20 31  OP_MakeRecord, 1
15660 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 65 65 6b  , 0);.      seek
15670 4f 70 20 3d 20 4f 50 5f 4d 6f 76 65 47 74 3b 0a  Op = OP_MoveGt;.
15680 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 49      }.    if( pI
15690 64 78 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b 30  dx->aSortOrder[0
156a0 5d 3d 3d 53 51 4c 49 54 45 5f 53 4f 5f 44 45 53  ]==SQLITE_SO_DES
156b0 43 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 69  C ){.      /* Ti
156c0 63 6b 65 74 20 23 32 35 31 34 3a 20 69 6e 76 65  cket #2514: inve
156d0 72 74 20 74 68 65 20 73 65 65 6b 20 6f 70 65 72  rt the seek oper
156e0 61 74 6f 72 20 69 66 20 77 65 20 61 72 65 20 75  ator if we are u
156f0 73 69 6e 67 0a 20 20 20 20 20 20 2a 2a 20 61 20  sing.      ** a 
15700 64 65 73 63 65 6e 64 69 6e 67 20 69 6e 64 65 78  descending index
15710 2e 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 73  . */.      if( s
15720 65 65 6b 4f 70 3d 3d 4f 50 5f 4c 61 73 74 20 29  eekOp==OP_Last )
15730 7b 0a 20 20 20 20 20 20 20 20 73 65 65 6b 4f 70  {.        seekOp
15740 20 3d 20 4f 50 5f 52 65 77 69 6e 64 3b 0a 20 20   = OP_Rewind;.  
15750 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
15760 20 20 20 61 73 73 65 72 74 28 20 73 65 65 6b 4f     assert( seekO
15770 70 3d 3d 4f 50 5f 4d 6f 76 65 47 74 20 29 3b 0a  p==OP_MoveGt );.
15780 20 20 20 20 20 20 20 20 73 65 65 6b 4f 70 20 3d          seekOp =
15790 20 4f 50 5f 4d 6f 76 65 4c 74 3b 0a 20 20 20 20   OP_MoveLt;.    
157a0 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73 71    }.    }.    sq
157b0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
157c0 2c 20 73 65 65 6b 4f 70 2c 20 69 49 64 78 2c 20  , seekOp, iIdx, 
157d0 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  0);.    sqlite3V
157e0 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49  dbeAddOp(v, OP_I
157f0 64 78 52 6f 77 69 64 2c 20 69 49 64 78 2c 20 30  dxRowid, iIdx, 0
15800 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
15810 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 43 6c  beAddOp(v, OP_Cl
15820 6f 73 65 2c 20 69 49 64 78 2c 20 30 29 3b 0a 20  ose, iIdx, 0);. 
15830 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
15840 64 4f 70 28 76 2c 20 4f 50 5f 4d 6f 76 65 47 65  dOp(v, OP_MoveGe
15850 2c 20 62 61 73 65 2c 20 30 29 3b 0a 20 20 7d 0a  , base, 0);.  }.
15860 20 20 65 4c 69 73 74 2e 6e 45 78 70 72 20 3d 20    eList.nExpr = 
15870 31 3b 0a 20 20 6d 65 6d 73 65 74 28 26 65 4c 69  1;.  memset(&eLi
15880 73 74 49 74 65 6d 2c 20 30 2c 20 73 69 7a 65 6f  stItem, 0, sizeo
15890 66 28 65 4c 69 73 74 49 74 65 6d 29 29 3b 0a 20  f(eListItem));. 
158a0 20 65 4c 69 73 74 2e 61 20 3d 20 26 65 4c 69 73   eList.a = &eLis
158b0 74 49 74 65 6d 3b 0a 20 20 65 4c 69 73 74 2e 61  tItem;.  eList.a
158c0 5b 30 5d 2e 70 45 78 70 72 20 3d 20 70 45 78 70  [0].pExpr = pExp
158d0 72 3b 0a 20 20 73 65 6c 65 63 74 49 6e 6e 65 72  r;.  selectInner
158e0 4c 6f 6f 70 28 70 50 61 72 73 65 2c 20 70 2c 20  Loop(pParse, p, 
158f0 26 65 4c 69 73 74 2c 20 30 2c 20 30 2c 20 30 2c  &eList, 0, 0, 0,
15900 20 2d 31 2c 20 65 44 65 73 74 2c 20 69 50 61 72   -1, eDest, iPar
15910 6d 2c 20 62 72 6b 2c 20 62 72 6b 2c 20 30 29 3b  m, brk, brk, 0);
15920 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65  .  sqlite3VdbeRe
15930 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 62 72  solveLabel(v, br
15940 6b 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  k);.  sqlite3Vdb
15950 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 43 6c 6f  eAddOp(v, OP_Clo
15960 73 65 2c 20 62 61 73 65 2c 20 30 29 3b 0a 20 20  se, base, 0);.  
15970 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a 7d 0a 0a  .  return 1;.}..
15980 2f 2a 0a 2a 2a 20 41 6e 61 6c 79 7a 65 20 61 6e  /*.** Analyze an
15990 64 20 4f 52 44 45 52 20 42 59 20 6f 72 20 47 52  d ORDER BY or GR
159a0 4f 55 50 20 42 59 20 63 6c 61 75 73 65 20 69 6e  OUP BY clause in
159b0 20 61 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d   a SELECT statem
159c0 65 6e 74 2e 20 20 52 65 74 75 72 6e 0a 2a 2a 20  ent.  Return.** 
159d0 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 65 72  the number of er
159e0 72 6f 72 73 20 73 65 65 6e 2e 0a 2a 2a 0a 2a 2a  rors seen..**.**
159f0 20 41 6e 20 4f 52 44 45 52 20 42 59 20 6f 72 20   An ORDER BY or 
15a00 47 52 4f 55 50 20 42 59 20 69 73 20 61 20 6c 69  GROUP BY is a li
15a10 73 74 20 6f 66 20 65 78 70 72 65 73 73 69 6f 6e  st of expression
15a20 73 2e 20 20 49 66 20 61 6e 79 20 65 78 70 72 65  s.  If any expre
15a30 73 73 69 6f 6e 0a 2a 2a 20 69 73 20 61 6e 20 69  ssion.** is an i
15a40 6e 74 65 67 65 72 20 63 6f 6e 73 74 61 6e 74 2c  nteger constant,
15a50 20 74 68 65 6e 20 74 68 61 74 20 65 78 70 72 65   then that expre
15a60 73 73 69 6f 6e 20 69 73 20 72 65 70 6c 61 63 65  ssion is replace
15a70 64 20 62 79 20 74 68 65 0a 2a 2a 20 63 6f 72 72  d by the.** corr
15a80 65 73 70 6f 6e 64 69 6e 67 20 65 6e 74 72 79 20  esponding entry 
15a90 69 6e 20 74 68 65 20 72 65 73 75 6c 74 20 73 65  in the result se
15aa0 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  t..*/.static int
15ab0 20 70 72 6f 63 65 73 73 4f 72 64 65 72 47 72 6f   processOrderGro
15ac0 75 70 42 79 28 0a 20 20 4e 61 6d 65 43 6f 6e 74  upBy(.  NameCont
15ad0 65 78 74 20 2a 70 4e 43 2c 20 20 20 20 20 2f 2a  ext *pNC,     /*
15ae0 20 4e 61 6d 65 20 63 6f 6e 74 65 78 74 20 6f 66   Name context of
15af0 20 74 68 65 20 53 45 4c 45 43 54 20 73 74 61 74   the SELECT stat
15b00 65 6d 65 6e 74 2e 20 2a 2f 0a 20 20 45 78 70 72  ement. */.  Expr
15b10 4c 69 73 74 20 2a 70 4f 72 64 65 72 42 79 2c 20  List *pOrderBy, 
15b20 20 20 2f 2a 20 54 68 65 20 4f 52 44 45 52 20 42    /* The ORDER B
15b30 59 20 6f 72 20 47 52 4f 55 50 20 42 59 20 63 6c  Y or GROUP BY cl
15b40 61 75 73 65 20 74 6f 20 62 65 20 70 72 6f 63 65  ause to be proce
15b50 73 73 65 64 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  ssed */.  const 
15b60 63 68 61 72 20 2a 7a 54 79 70 65 20 20 20 20 20  char *zType     
15b70 2f 2a 20 45 69 74 68 65 72 20 22 4f 52 44 45 52  /* Either "ORDER
15b80 22 20 6f 72 20 22 47 52 4f 55 50 22 2c 20 61 73  " or "GROUP", as
15b90 20 61 70 70 72 6f 70 72 69 61 74 65 20 2a 2f 0a   appropriate */.
15ba0 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 45 78  ){.  int i;.  Ex
15bb0 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 20 3d  prList *pEList =
15bc0 20 70 4e 43 2d 3e 70 45 4c 69 73 74 3b 20 20 20   pNC->pEList;   
15bd0 20 20 2f 2a 20 54 68 65 20 72 65 73 75 6c 74 20    /* The result 
15be0 73 65 74 20 6f 66 20 74 68 65 20 53 45 4c 45 43  set of the SELEC
15bf0 54 20 2a 2f 0a 20 20 50 61 72 73 65 20 2a 70 50  T */.  Parse *pP
15c00 61 72 73 65 20 3d 20 70 4e 43 2d 3e 70 50 61 72  arse = pNC->pPar
15c10 73 65 3b 20 20 20 20 20 2f 2a 20 54 68 65 20 72  se;     /* The r
15c20 65 73 75 6c 74 20 73 65 74 20 6f 66 20 74 68 65  esult set of the
15c30 20 53 45 4c 45 43 54 20 2a 2f 0a 20 20 61 73 73   SELECT */.  ass
15c40 65 72 74 28 20 70 45 4c 69 73 74 20 29 3b 0a 0a  ert( pEList );..
15c50 20 20 69 66 28 20 70 4f 72 64 65 72 42 79 3d 3d    if( pOrderBy==
15c60 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  0 ) return 0;.  
15c70 69 66 28 20 70 4f 72 64 65 72 42 79 2d 3e 6e 45  if( pOrderBy->nE
15c80 78 70 72 3e 53 51 4c 49 54 45 5f 4d 41 58 5f 43  xpr>SQLITE_MAX_C
15c90 4f 4c 55 4d 4e 20 29 7b 0a 20 20 20 20 73 71 6c  OLUMN ){.    sql
15ca0 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
15cb0 72 73 65 2c 20 22 74 6f 6f 20 6d 61 6e 79 20 74  rse, "too many t
15cc0 65 72 6d 73 20 69 6e 20 25 73 20 42 59 20 63 6c  erms in %s BY cl
15cd0 61 75 73 65 22 2c 20 7a 54 79 70 65 29 3b 0a 20  ause", zType);. 
15ce0 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d     return 1;.  }
15cf0 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4f  .  for(i=0; i<pO
15d00 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 3b 20 69  rderBy->nExpr; i
15d10 2b 2b 29 7b 0a 20 20 20 20 69 6e 74 20 69 43 6f  ++){.    int iCo
15d20 6c 3b 0a 20 20 20 20 45 78 70 72 20 2a 70 45 20  l;.    Expr *pE 
15d30 3d 20 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d  = pOrderBy->a[i]
15d40 2e 70 45 78 70 72 3b 0a 20 20 20 20 69 66 28 20  .pExpr;.    if( 
15d50 73 71 6c 69 74 65 33 45 78 70 72 49 73 49 6e 74  sqlite3ExprIsInt
15d60 65 67 65 72 28 70 45 2c 20 26 69 43 6f 6c 29 20  eger(pE, &iCol) 
15d70 29 7b 0a 20 20 20 20 20 20 69 66 28 20 69 43 6f  ){.      if( iCo
15d80 6c 3e 30 20 26 26 20 69 43 6f 6c 3c 3d 70 45 4c  l>0 && iCol<=pEL
15d90 69 73 74 2d 3e 6e 45 78 70 72 20 29 7b 0a 20 20  ist->nExpr ){.  
15da0 20 20 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a 70        CollSeq *p
15db0 43 6f 6c 6c 20 3d 20 70 45 2d 3e 70 43 6f 6c 6c  Coll = pE->pColl
15dc0 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 66 6c  ;.        int fl
15dd0 61 67 73 20 3d 20 70 45 2d 3e 66 6c 61 67 73 20  ags = pE->flags 
15de0 26 20 45 50 5f 45 78 70 43 6f 6c 6c 61 74 65 3b  & EP_ExpCollate;
15df0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
15e00 45 78 70 72 44 65 6c 65 74 65 28 70 45 29 3b 0a  ExprDelete(pE);.
15e10 20 20 20 20 20 20 20 20 70 45 20 3d 20 73 71 6c          pE = sql
15e20 69 74 65 33 45 78 70 72 44 75 70 28 70 50 61 72  ite3ExprDup(pPar
15e30 73 65 2d 3e 64 62 2c 20 70 45 4c 69 73 74 2d 3e  se->db, pEList->
15e40 61 5b 69 43 6f 6c 2d 31 5d 2e 70 45 78 70 72 29  a[iCol-1].pExpr)
15e50 3b 0a 20 20 20 20 20 20 20 20 70 4f 72 64 65 72  ;.        pOrder
15e60 42 79 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 20 3d  By->a[i].pExpr =
15e70 20 70 45 3b 0a 20 20 20 20 20 20 20 20 69 66 28   pE;.        if(
15e80 20 70 43 6f 6c 6c 20 26 26 20 66 6c 61 67 73 20   pColl && flags 
15e90 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 45 2d  ){.          pE-
15ea0 3e 70 43 6f 6c 6c 20 3d 20 70 43 6f 6c 6c 3b 0a  >pColl = pColl;.
15eb0 20 20 20 20 20 20 20 20 20 20 70 45 2d 3e 66 6c            pE->fl
15ec0 61 67 73 20 7c 3d 20 66 6c 61 67 73 3b 0a 20 20  ags |= flags;.  
15ed0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65        }.      }e
15ee0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  lse{.        sql
15ef0 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
15f00 72 73 65 2c 20 0a 20 20 20 20 20 20 20 20 20 20  rse, .          
15f10 20 22 25 73 20 42 59 20 63 6f 6c 75 6d 6e 20 6e   "%s BY column n
15f20 75 6d 62 65 72 20 25 64 20 6f 75 74 20 6f 66 20  umber %d out of 
15f30 72 61 6e 67 65 20 2d 20 73 68 6f 75 6c 64 20 62  range - should b
15f40 65 20 22 0a 20 20 20 20 20 20 20 20 20 20 20 22  e ".           "
15f50 62 65 74 77 65 65 6e 20 31 20 61 6e 64 20 25 64  between 1 and %d
15f60 22 2c 20 7a 54 79 70 65 2c 20 69 43 6f 6c 2c 20  ", zType, iCol, 
15f70 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 29 3b 0a  pEList->nExpr);.
15f80 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 31          return 1
15f90 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
15fa0 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 45      if( sqlite3E
15fb0 78 70 72 52 65 73 6f 6c 76 65 4e 61 6d 65 73 28  xprResolveNames(
15fc0 70 4e 43 2c 20 70 45 29 20 29 7b 0a 20 20 20 20  pNC, pE) ){.    
15fd0 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20    return 1;.    
15fe0 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30  }.  }.  return 0
15ff0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
16000 72 6f 75 74 69 6e 65 20 72 65 73 6f 6c 76 65 73  routine resolves
16010 20 61 6e 79 20 6e 61 6d 65 73 20 75 73 65 64 20   any names used 
16020 69 6e 20 74 68 65 20 72 65 73 75 6c 74 20 73 65  in the result se
16030 74 20 6f 66 20 74 68 65 0a 2a 2a 20 73 75 70 70  t of the.** supp
16040 6c 69 65 64 20 53 45 4c 45 43 54 20 73 74 61 74  lied SELECT stat
16050 65 6d 65 6e 74 2e 20 49 66 20 74 68 65 20 53 45  ement. If the SE
16060 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 62  LECT statement b
16070 65 69 6e 67 20 72 65 73 6f 6c 76 65 64 0a 2a 2a  eing resolved.**
16080 20 69 73 20 61 20 73 75 62 2d 73 65 6c 65 63 74   is a sub-select
16090 2c 20 74 68 65 6e 20 70 4f 75 74 65 72 4e 43 20  , then pOuterNC 
160a0 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  is a pointer to 
160b0 74 68 65 20 4e 61 6d 65 43 6f 6e 74 65 78 74 20  the NameContext 
160c0 0a 2a 2a 20 6f 66 20 74 68 65 20 70 61 72 65 6e  .** of the paren
160d0 74 20 53 45 4c 45 43 54 2e 0a 2a 2f 0a 69 6e 74  t SELECT..*/.int
160e0 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 52 65   sqlite3SelectRe
160f0 73 6f 6c 76 65 28 0a 20 20 50 61 72 73 65 20 2a  solve(.  Parse *
16100 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 20  pParse,         
16110 2f 2a 20 54 68 65 20 70 61 72 73 65 72 20 63 6f  /* The parser co
16120 6e 74 65 78 74 20 2a 2f 0a 20 20 53 65 6c 65 63  ntext */.  Selec
16130 74 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20  t *p,           
16140 20 20 2f 2a 20 54 68 65 20 53 45 4c 45 43 54 20    /* The SELECT 
16150 73 74 61 74 65 6d 65 6e 74 20 62 65 69 6e 67 20  statement being 
16160 63 6f 64 65 64 2e 20 2a 2f 0a 20 20 4e 61 6d 65  coded. */.  Name
16170 43 6f 6e 74 65 78 74 20 2a 70 4f 75 74 65 72 4e  Context *pOuterN
16180 43 20 20 2f 2a 20 54 68 65 20 6f 75 74 65 72 20  C  /* The outer 
16190 6e 61 6d 65 20 63 6f 6e 74 65 78 74 2e 20 4d 61  name context. Ma
161a0 79 20 62 65 20 4e 55 4c 4c 2e 20 2a 2f 0a 29 7b  y be NULL. */.){
161b0 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c  .  ExprList *pEL
161c0 69 73 74 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  ist;          /*
161d0 20 52 65 73 75 6c 74 20 73 65 74 2e 20 2a 2f 0a   Result set. */.
161e0 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20    int i;        
161f0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
16200 46 6f 72 2d 6c 6f 6f 70 20 76 61 72 69 61 62 6c  For-loop variabl
16210 65 20 75 73 65 64 20 69 6e 20 6d 75 6c 74 69 70  e used in multip
16220 6c 65 20 70 6c 61 63 65 73 20 2a 2f 0a 20 20 4e  le places */.  N
16230 61 6d 65 43 6f 6e 74 65 78 74 20 73 4e 43 3b 20  ameContext sNC; 
16240 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 63            /* Loc
16250 61 6c 20 6e 61 6d 65 2d 63 6f 6e 74 65 78 74 20  al name-context 
16260 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70  */.  ExprList *p
16270 47 72 6f 75 70 42 79 3b 20 20 20 20 20 20 20 20  GroupBy;        
16280 2f 2a 20 54 68 65 20 67 72 6f 75 70 20 62 79 20  /* The group by 
16290 63 6c 61 75 73 65 20 2a 2f 0a 0a 20 20 2f 2a 20  clause */..  /* 
162a0 49 66 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  If this routine 
162b0 68 61 73 20 72 75 6e 20 62 65 66 6f 72 65 2c 20  has run before, 
162c0 72 65 74 75 72 6e 20 69 6d 6d 65 64 69 61 74 65  return immediate
162d0 6c 79 2e 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e  ly. */.  if( p->
162e0 69 73 52 65 73 6f 6c 76 65 64 20 29 7b 0a 20 20  isResolved ){.  
162f0 20 20 61 73 73 65 72 74 28 20 21 70 4f 75 74 65    assert( !pOute
16300 72 4e 43 20 29 3b 0a 20 20 20 20 72 65 74 75 72  rNC );.    retur
16310 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d  n SQLITE_OK;.  }
16320 0a 20 20 70 2d 3e 69 73 52 65 73 6f 6c 76 65 64  .  p->isResolved
16330 20 3d 20 31 3b 0a 0a 20 20 2f 2a 20 49 66 20 74   = 1;..  /* If t
16340 68 65 72 65 20 68 61 76 65 20 61 6c 72 65 61 64  here have alread
16350 79 20 62 65 65 6e 20 65 72 72 6f 72 73 2c 20 64  y been errors, d
16360 6f 20 6e 6f 74 68 69 6e 67 2e 20 2a 2f 0a 20 20  o nothing. */.  
16370 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 45 72 72  if( pParse->nErr
16380 3e 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  >0 ){.    return
16390 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20   SQLITE_ERROR;. 
163a0 20 7d 0a 0a 20 20 2f 2a 20 50 72 65 70 61 72 65   }..  /* Prepare
163b0 20 74 68 65 20 73 65 6c 65 63 74 20 73 74 61 74   the select stat
163c0 65 6d 65 6e 74 2e 20 54 68 69 73 20 63 61 6c 6c  ement. This call
163d0 20 77 69 6c 6c 20 61 6c 6c 6f 63 61 74 65 20 61   will allocate a
163e0 6c 6c 20 63 75 72 73 6f 72 73 0a 20 20 2a 2a 20  ll cursors.  ** 
163f0 72 65 71 75 69 72 65 64 20 74 6f 20 68 61 6e 64  required to hand
16400 6c 65 20 74 68 65 20 74 61 62 6c 65 73 20 61 6e  le the tables an
16410 64 20 73 75 62 71 75 65 72 69 65 73 20 69 6e 20  d subqueries in 
16420 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 2e  the FROM clause.
16430 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 72 65 70  .  */.  if( prep
16440 53 65 6c 65 63 74 53 74 6d 74 28 70 50 61 72 73  SelectStmt(pPars
16450 65 2c 20 70 29 20 29 7b 0a 20 20 20 20 72 65 74  e, p) ){.    ret
16460 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52  urn SQLITE_ERROR
16470 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 65 73 6f  ;.  }..  /* Reso
16480 6c 76 65 20 74 68 65 20 65 78 70 72 65 73 73 69  lve the expressi
16490 6f 6e 73 20 69 6e 20 74 68 65 20 4c 49 4d 49 54  ons in the LIMIT
164a0 20 61 6e 64 20 4f 46 46 53 45 54 20 63 6c 61 75   and OFFSET clau
164b0 73 65 73 2e 20 54 68 65 73 65 0a 20 20 2a 2a 20  ses. These.  ** 
164c0 61 72 65 20 6e 6f 74 20 61 6c 6c 6f 77 65 64 20  are not allowed 
164d0 74 6f 20 72 65 66 65 72 20 74 6f 20 61 6e 79 20  to refer to any 
164e0 6e 61 6d 65 73 2c 20 73 6f 20 70 61 73 73 20 61  names, so pass a
164f0 6e 20 65 6d 70 74 79 20 4e 61 6d 65 43 6f 6e 74  n empty NameCont
16500 65 78 74 2e 0a 20 20 2a 2f 0a 20 20 6d 65 6d 73  ext..  */.  mems
16510 65 74 28 26 73 4e 43 2c 20 30 2c 20 73 69 7a 65  et(&sNC, 0, size
16520 6f 66 28 73 4e 43 29 29 3b 0a 20 20 73 4e 43 2e  of(sNC));.  sNC.
16530 70 50 61 72 73 65 20 3d 20 70 50 61 72 73 65 3b  pParse = pParse;
16540 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 45 78  .  if( sqlite3Ex
16550 70 72 52 65 73 6f 6c 76 65 4e 61 6d 65 73 28 26  prResolveNames(&
16560 73 4e 43 2c 20 70 2d 3e 70 4c 69 6d 69 74 29 20  sNC, p->pLimit) 
16570 7c 7c 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ||.      sqlite3
16580 45 78 70 72 52 65 73 6f 6c 76 65 4e 61 6d 65 73  ExprResolveNames
16590 28 26 73 4e 43 2c 20 70 2d 3e 70 4f 66 66 73 65  (&sNC, p->pOffse
165a0 74 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  t) ){.    return
165b0 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20   SQLITE_ERROR;. 
165c0 20 7d 0a 0a 20 20 2f 2a 20 53 65 74 20 75 70 20   }..  /* Set up 
165d0 74 68 65 20 6c 6f 63 61 6c 20 6e 61 6d 65 2d 63  the local name-c
165e0 6f 6e 74 65 78 74 20 74 6f 20 70 61 73 73 20 74  ontext to pass t
165f0 6f 20 45 78 70 72 52 65 73 6f 6c 76 65 4e 61 6d  o ExprResolveNam
16600 65 73 28 29 20 74 6f 0a 20 20 2a 2a 20 72 65 73  es() to.  ** res
16610 6f 6c 76 65 20 74 68 65 20 65 78 70 72 65 73 73  olve the express
16620 69 6f 6e 2d 6c 69 73 74 2e 0a 20 20 2a 2f 0a 20  ion-list..  */. 
16630 20 73 4e 43 2e 61 6c 6c 6f 77 41 67 67 20 3d 20   sNC.allowAgg = 
16640 31 3b 0a 20 20 73 4e 43 2e 70 53 72 63 4c 69 73  1;.  sNC.pSrcLis
16650 74 20 3d 20 70 2d 3e 70 53 72 63 3b 0a 20 20 73  t = p->pSrc;.  s
16660 4e 43 2e 70 4e 65 78 74 20 3d 20 70 4f 75 74 65  NC.pNext = pOute
16670 72 4e 43 3b 0a 0a 20 20 2f 2a 20 52 65 73 6f 6c  rNC;..  /* Resol
16680 76 65 20 6e 61 6d 65 73 20 69 6e 20 74 68 65 20  ve names in the 
16690 72 65 73 75 6c 74 20 73 65 74 2e 20 2a 2f 0a 20  result set. */. 
166a0 20 70 45 4c 69 73 74 20 3d 20 70 2d 3e 70 45 4c   pEList = p->pEL
166b0 69 73 74 3b 0a 20 20 69 66 28 20 21 70 45 4c 69  ist;.  if( !pELi
166c0 73 74 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49  st ) return SQLI
166d0 54 45 5f 45 52 52 4f 52 3b 0a 20 20 66 6f 72 28  TE_ERROR;.  for(
166e0 69 3d 30 3b 20 69 3c 70 45 4c 69 73 74 2d 3e 6e  i=0; i<pEList->n
166f0 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  Expr; i++){.    
16700 45 78 70 72 20 2a 70 58 20 3d 20 70 45 4c 69 73  Expr *pX = pELis
16710 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 20  t->a[i].pExpr;. 
16720 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 45 78     if( sqlite3Ex
16730 70 72 52 65 73 6f 6c 76 65 4e 61 6d 65 73 28 26  prResolveNames(&
16740 73 4e 43 2c 20 70 58 29 20 29 7b 0a 20 20 20 20  sNC, pX) ){.    
16750 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
16760 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 7d  ERROR;.    }.  }
16770 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20  ..  /* If there 
16780 61 72 65 20 6e 6f 20 61 67 67 72 65 67 61 74 65  are no aggregate
16790 20 66 75 6e 63 74 69 6f 6e 73 20 69 6e 20 74 68   functions in th
167a0 65 20 72 65 73 75 6c 74 2d 73 65 74 2c 20 61 6e  e result-set, an
167b0 64 20 6e 6f 20 47 52 4f 55 50 20 42 59 20 0a 20  d no GROUP BY . 
167c0 20 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 2c 20   ** expression, 
167d0 64 6f 20 6e 6f 74 20 61 6c 6c 6f 77 20 61 67 67  do not allow agg
167e0 72 65 67 61 74 65 73 20 69 6e 20 61 6e 79 20 6f  regates in any o
167f0 66 20 74 68 65 20 6f 74 68 65 72 20 65 78 70 72  f the other expr
16800 65 73 73 69 6f 6e 73 2e 0a 20 20 2a 2f 0a 20 20  essions..  */.  
16810 61 73 73 65 72 74 28 20 21 70 2d 3e 69 73 41 67  assert( !p->isAg
16820 67 20 29 3b 0a 20 20 70 47 72 6f 75 70 42 79 20  g );.  pGroupBy 
16830 3d 20 70 2d 3e 70 47 72 6f 75 70 42 79 3b 0a 20  = p->pGroupBy;. 
16840 20 69 66 28 20 70 47 72 6f 75 70 42 79 20 7c 7c   if( pGroupBy ||
16850 20 73 4e 43 2e 68 61 73 41 67 67 20 29 7b 0a 20   sNC.hasAgg ){. 
16860 20 20 20 70 2d 3e 69 73 41 67 67 20 3d 20 31 3b     p->isAgg = 1;
16870 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 4e  .  }else{.    sN
16880 43 2e 61 6c 6c 6f 77 41 67 67 20 3d 20 30 3b 0a  C.allowAgg = 0;.
16890 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 61 20 48    }..  /* If a H
168a0 41 56 49 4e 47 20 63 6c 61 75 73 65 20 69 73 20  AVING clause is 
168b0 70 72 65 73 65 6e 74 2c 20 74 68 65 6e 20 74 68  present, then th
168c0 65 72 65 20 6d 75 73 74 20 62 65 20 61 20 47 52  ere must be a GR
168d0 4f 55 50 20 42 59 20 63 6c 61 75 73 65 2e 0a 20  OUP BY clause.. 
168e0 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 70 48 61   */.  if( p->pHa
168f0 76 69 6e 67 20 26 26 20 21 70 47 72 6f 75 70 42  ving && !pGroupB
16900 79 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  y ){.    sqlite3
16910 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
16920 20 22 61 20 47 52 4f 55 50 20 42 59 20 63 6c 61   "a GROUP BY cla
16930 75 73 65 20 69 73 20 72 65 71 75 69 72 65 64 20  use is required 
16940 62 65 66 6f 72 65 20 48 41 56 49 4e 47 22 29 3b  before HAVING");
16950 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
16960 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20  TE_ERROR;.  }.. 
16970 20 2f 2a 20 41 64 64 20 74 68 65 20 65 78 70 72   /* Add the expr
16980 65 73 73 69 6f 6e 20 6c 69 73 74 20 74 6f 20 74  ession list to t
16990 68 65 20 6e 61 6d 65 2d 63 6f 6e 74 65 78 74 20  he name-context 
169a0 62 65 66 6f 72 65 20 70 61 72 73 69 6e 67 20 74  before parsing t
169b0 68 65 0a 20 20 2a 2a 20 6f 74 68 65 72 20 65 78  he.  ** other ex
169c0 70 72 65 73 73 69 6f 6e 73 20 69 6e 20 74 68 65  pressions in the
169d0 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
169e0 74 2e 20 54 68 69 73 20 69 73 20 73 6f 20 74 68  t. This is so th
169f0 61 74 0a 20 20 2a 2a 20 65 78 70 72 65 73 73 69  at.  ** expressi
16a00 6f 6e 73 20 69 6e 20 74 68 65 20 57 48 45 52 45  ons in the WHERE
16a10 20 63 6c 61 75 73 65 20 28 65 74 63 2e 29 20 63   clause (etc.) c
16a20 61 6e 20 72 65 66 65 72 20 74 6f 20 65 78 70 72  an refer to expr
16a30 65 73 73 69 6f 6e 73 20 62 79 0a 20 20 2a 2a 20  essions by.  ** 
16a40 61 6c 69 61 73 65 73 20 69 6e 20 74 68 65 20 72  aliases in the r
16a50 65 73 75 6c 74 20 73 65 74 2e 0a 20 20 2a 2a 0a  esult set..  **.
16a60 20 20 2a 2a 20 4d 69 6e 6f 72 20 70 6f 69 6e 74    ** Minor point
16a70 3a 20 49 66 20 74 68 69 73 20 69 73 20 74 68 65  : If this is the
16a80 20 63 61 73 65 2c 20 74 68 65 6e 20 74 68 65 20   case, then the 
16a90 65 78 70 72 65 73 73 69 6f 6e 20 77 69 6c 6c 20  expression will 
16aa0 62 65 0a 20 20 2a 2a 20 72 65 2d 65 76 61 6c 75  be.  ** re-evalu
16ab0 61 74 65 64 20 66 6f 72 20 65 61 63 68 20 72 65  ated for each re
16ac0 66 65 72 65 6e 63 65 20 74 6f 20 69 74 2e 0a 20  ference to it.. 
16ad0 20 2a 2f 0a 20 20 73 4e 43 2e 70 45 4c 69 73 74   */.  sNC.pEList
16ae0 20 3d 20 70 2d 3e 70 45 4c 69 73 74 3b 0a 20 20   = p->pEList;.  
16af0 69 66 28 20 73 71 6c 69 74 65 33 45 78 70 72 52  if( sqlite3ExprR
16b00 65 73 6f 6c 76 65 4e 61 6d 65 73 28 26 73 4e 43  esolveNames(&sNC
16b10 2c 20 70 2d 3e 70 57 68 65 72 65 29 20 7c 7c 0a  , p->pWhere) ||.
16b20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
16b30 52 65 73 6f 6c 76 65 4e 61 6d 65 73 28 26 73 4e  ResolveNames(&sN
16b40 43 2c 20 70 2d 3e 70 48 61 76 69 6e 67 29 20 29  C, p->pHaving) )
16b50 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
16b60 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20  ITE_ERROR;.  }. 
16b70 20 69 66 28 20 70 2d 3e 70 50 72 69 6f 72 3d 3d   if( p->pPrior==
16b80 30 20 26 26 20 70 72 6f 63 65 73 73 4f 72 64 65  0 && processOrde
16b90 72 47 72 6f 75 70 42 79 28 26 73 4e 43 2c 20 70  rGroupBy(&sNC, p
16ba0 2d 3e 70 4f 72 64 65 72 42 79 2c 20 22 4f 52 44  ->pOrderBy, "ORD
16bb0 45 52 22 29 20 29 7b 0a 20 20 20 20 72 65 74 75  ER") ){.    retu
16bc0 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b  rn SQLITE_ERROR;
16bd0 0a 20 20 7d 0a 20 20 69 66 28 20 70 72 6f 63 65  .  }.  if( proce
16be0 73 73 4f 72 64 65 72 47 72 6f 75 70 42 79 28 26  ssOrderGroupBy(&
16bf0 73 4e 43 2c 20 70 47 72 6f 75 70 42 79 2c 20 22  sNC, pGroupBy, "
16c00 47 52 4f 55 50 22 29 20 29 7b 0a 20 20 20 20 72  GROUP") ){.    r
16c10 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52  eturn SQLITE_ERR
16c20 4f 52 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70  OR;.  }..  if( p
16c30 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f  Parse->db->mallo
16c40 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 72  cFailed ){.    r
16c50 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d  eturn SQLITE_NOM
16c60 45 4d 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61  EM;.  }..  /* Ma
16c70 6b 65 20 73 75 72 65 20 74 68 65 20 47 52 4f 55  ke sure the GROU
16c80 50 20 42 59 20 63 6c 61 75 73 65 20 64 6f 65 73  P BY clause does
16c90 20 6e 6f 74 20 63 6f 6e 74 61 69 6e 20 61 67 67   not contain agg
16ca0 72 65 67 61 74 65 20 66 75 6e 63 74 69 6f 6e 73  regate functions
16cb0 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 47 72  ..  */.  if( pGr
16cc0 6f 75 70 42 79 20 29 7b 0a 20 20 20 20 73 74 72  oupBy ){.    str
16cd0 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65  uct ExprList_ite
16ce0 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 0a 20 20 20  m *pItem;.  .   
16cf0 20 66 6f 72 28 69 3d 30 2c 20 70 49 74 65 6d 3d   for(i=0, pItem=
16d00 70 47 72 6f 75 70 42 79 2d 3e 61 3b 20 69 3c 70  pGroupBy->a; i<p
16d10 47 72 6f 75 70 42 79 2d 3e 6e 45 78 70 72 3b 20  GroupBy->nExpr; 
16d20 69 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20  i++, pItem++){. 
16d30 20 20 20 20 20 69 66 28 20 45 78 70 72 48 61 73       if( ExprHas
16d40 50 72 6f 70 65 72 74 79 28 70 49 74 65 6d 2d 3e  Property(pItem->
16d50 70 45 78 70 72 2c 20 45 50 5f 41 67 67 29 20 29  pExpr, EP_Agg) )
16d60 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
16d70 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
16d80 2c 20 22 61 67 67 72 65 67 61 74 65 20 66 75 6e  , "aggregate fun
16d90 63 74 69 6f 6e 73 20 61 72 65 20 6e 6f 74 20 61  ctions are not a
16da0 6c 6c 6f 77 65 64 20 69 6e 20 22 0a 20 20 20 20  llowed in ".    
16db0 20 20 20 20 20 20 20 20 22 74 68 65 20 47 52 4f          "the GRO
16dc0 55 50 20 42 59 20 63 6c 61 75 73 65 22 29 3b 0a  UP BY clause");.
16dd0 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53          return S
16de0 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20  QLITE_ERROR;.   
16df0 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a     }.    }.  }..
16e00 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20    /* If this is 
16e10 6f 6e 65 20 53 45 4c 45 43 54 20 6f 66 20 61 20  one SELECT of a 
16e20 63 6f 6d 70 6f 75 6e 64 2c 20 62 65 20 73 75 72  compound, be sur
16e30 65 20 74 6f 20 72 65 73 6f 6c 76 65 20 6e 61 6d  e to resolve nam
16e40 65 73 0a 20 20 2a 2a 20 69 6e 20 74 68 65 20 6f  es.  ** in the o
16e50 74 68 65 72 20 53 45 4c 45 43 54 73 2e 0a 20 20  ther SELECTs..  
16e60 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 70 50 72 69  */.  if( p->pPri
16e70 6f 72 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  or ){.    return
16e80 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 52 65   sqlite3SelectRe
16e90 73 6f 6c 76 65 28 70 50 61 72 73 65 2c 20 70 2d  solve(pParse, p-
16ea0 3e 70 50 72 69 6f 72 2c 20 70 4f 75 74 65 72 4e  >pPrior, pOuterN
16eb0 43 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  C);.  }else{.   
16ec0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
16ed0 4b 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  K;.  }.}../*.** 
16ee0 52 65 73 65 74 20 74 68 65 20 61 67 67 72 65 67  Reset the aggreg
16ef0 61 74 65 20 61 63 63 75 6d 75 6c 61 74 6f 72 2e  ate accumulator.
16f00 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 67 67 72 65  .**.** The aggre
16f10 67 61 74 65 20 61 63 63 75 6d 75 6c 61 74 6f 72  gate accumulator
16f20 20 69 73 20 61 20 73 65 74 20 6f 66 20 6d 65 6d   is a set of mem
16f30 6f 72 79 20 63 65 6c 6c 73 20 74 68 61 74 20 68  ory cells that h
16f40 6f 6c 64 0a 2a 2a 20 69 6e 74 65 72 6d 65 64 69  old.** intermedi
16f50 61 74 65 20 72 65 73 75 6c 74 73 20 77 68 69 6c  ate results whil
16f60 65 20 63 61 6c 63 75 6c 61 74 69 6e 67 20 61 6e  e calculating an
16f70 20 61 67 67 72 65 67 61 74 65 2e 20 20 54 68 69   aggregate.  Thi
16f80 73 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 73 69 6d  s.** routine sim
16f90 70 6c 79 20 73 74 6f 72 65 73 20 4e 55 4c 4c 73  ply stores NULLs
16fa0 20 69 6e 20 61 6c 6c 20 6f 66 20 74 68 6f 73 65   in all of those
16fb0 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 73 2e 0a 2a   memory cells..*
16fc0 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72 65  /.static void re
16fd0 73 65 74 41 63 63 75 6d 75 6c 61 74 6f 72 28 50  setAccumulator(P
16fe0 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 41 67  arse *pParse, Ag
16ff0 67 49 6e 66 6f 20 2a 70 41 67 67 49 6e 66 6f 29  gInfo *pAggInfo)
17000 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50  {.  Vdbe *v = pP
17010 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69  arse->pVdbe;.  i
17020 6e 74 20 69 3b 0a 20 20 73 74 72 75 63 74 20 41  nt i;.  struct A
17030 67 67 49 6e 66 6f 5f 66 75 6e 63 20 2a 70 46 75  ggInfo_func *pFu
17040 6e 63 3b 0a 20 20 69 66 28 20 70 41 67 67 49 6e  nc;.  if( pAggIn
17050 66 6f 2d 3e 6e 46 75 6e 63 2b 70 41 67 67 49 6e  fo->nFunc+pAggIn
17060 66 6f 2d 3e 6e 43 6f 6c 75 6d 6e 3d 3d 30 20 29  fo->nColumn==0 )
17070 7b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20  {.    return;.  
17080 7d 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70  }.  for(i=0; i<p
17090 41 67 67 49 6e 66 6f 2d 3e 6e 43 6f 6c 75 6d 6e  AggInfo->nColumn
170a0 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69  ; i++){.    sqli
170b0 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
170c0 4f 50 5f 4d 65 6d 4e 75 6c 6c 2c 20 70 41 67 67  OP_MemNull, pAgg
170d0 49 6e 66 6f 2d 3e 61 43 6f 6c 5b 69 5d 2e 69 4d  Info->aCol[i].iM
170e0 65 6d 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 66 6f  em, 0);.  }.  fo
170f0 72 28 70 46 75 6e 63 3d 70 41 67 67 49 6e 66 6f  r(pFunc=pAggInfo
17100 2d 3e 61 46 75 6e 63 2c 20 69 3d 30 3b 20 69 3c  ->aFunc, i=0; i<
17110 70 41 67 67 49 6e 66 6f 2d 3e 6e 46 75 6e 63 3b  pAggInfo->nFunc;
17120 20 69 2b 2b 2c 20 70 46 75 6e 63 2b 2b 29 7b 0a   i++, pFunc++){.
17130 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
17140 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 65 6d 4e 75  ddOp(v, OP_MemNu
17150 6c 6c 2c 20 70 46 75 6e 63 2d 3e 69 4d 65 6d 2c  ll, pFunc->iMem,
17160 20 30 29 3b 0a 20 20 20 20 69 66 28 20 70 46 75   0);.    if( pFu
17170 6e 63 2d 3e 69 44 69 73 74 69 6e 63 74 3e 3d 30  nc->iDistinct>=0
17180 20 29 7b 0a 20 20 20 20 20 20 45 78 70 72 20 2a   ){.      Expr *
17190 70 45 20 3d 20 70 46 75 6e 63 2d 3e 70 45 78 70  pE = pFunc->pExp
171a0 72 3b 0a 20 20 20 20 20 20 69 66 28 20 70 45 2d  r;.      if( pE-
171b0 3e 70 4c 69 73 74 3d 3d 30 20 7c 7c 20 70 45 2d  >pList==0 || pE-
171c0 3e 70 4c 69 73 74 2d 3e 6e 45 78 70 72 21 3d 31  >pList->nExpr!=1
171d0 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
171e0 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
171f0 73 65 2c 20 22 44 49 53 54 49 4e 43 54 20 69 6e  se, "DISTINCT in
17200 20 61 67 67 72 65 67 61 74 65 20 6d 75 73 74 20   aggregate must 
17210 62 65 20 66 6f 6c 6c 6f 77 65 64 20 22 0a 20 20  be followed ".  
17220 20 20 20 20 20 20 20 20 20 22 62 79 20 61 6e 20           "by an 
17230 65 78 70 72 65 73 73 69 6f 6e 22 29 3b 0a 20 20  expression");.  
17240 20 20 20 20 20 20 70 46 75 6e 63 2d 3e 69 44 69        pFunc->iDi
17250 73 74 69 6e 63 74 20 3d 20 2d 31 3b 0a 20 20 20  stinct = -1;.   
17260 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
17270 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49    KeyInfo *pKeyI
17280 6e 66 6f 20 3d 20 6b 65 79 49 6e 66 6f 46 72 6f  nfo = keyInfoFro
17290 6d 45 78 70 72 4c 69 73 74 28 70 50 61 72 73 65  mExprList(pParse
172a0 2c 20 70 45 2d 3e 70 4c 69 73 74 29 3b 0a 20 20  , pE->pList);.  
172b0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
172c0 65 4f 70 33 28 76 2c 20 4f 50 5f 4f 70 65 6e 45  eOp3(v, OP_OpenE
172d0 70 68 65 6d 65 72 61 6c 2c 20 70 46 75 6e 63 2d  phemeral, pFunc-
172e0 3e 69 44 69 73 74 69 6e 63 74 2c 20 30 2c 20 0a  >iDistinct, 0, .
172f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17300 20 20 20 20 20 20 20 20 20 20 28 63 68 61 72 2a            (char*
17310 29 70 4b 65 79 49 6e 66 6f 2c 20 50 33 5f 4b 45  )pKeyInfo, P3_KE
17320 59 49 4e 46 4f 5f 48 41 4e 44 4f 46 46 29 3b 0a  YINFO_HANDOFF);.
17330 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
17340 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 76 6f 6b  }.}../*.** Invok
17350 65 20 74 68 65 20 4f 50 5f 41 67 67 46 69 6e 61  e the OP_AggFina
17360 6c 69 7a 65 20 6f 70 63 6f 64 65 20 66 6f 72 20  lize opcode for 
17370 65 76 65 72 79 20 61 67 67 72 65 67 61 74 65 20  every aggregate 
17380 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 69 6e 20 74  function.** in t
17390 68 65 20 41 67 67 49 6e 66 6f 20 73 74 72 75 63  he AggInfo struc
173a0 74 75 72 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ture..*/.static 
173b0 76 6f 69 64 20 66 69 6e 61 6c 69 7a 65 41 67 67  void finalizeAgg
173c0 46 75 6e 63 74 69 6f 6e 73 28 50 61 72 73 65 20  Functions(Parse 
173d0 2a 70 50 61 72 73 65 2c 20 41 67 67 49 6e 66 6f  *pParse, AggInfo
173e0 20 2a 70 41 67 67 49 6e 66 6f 29 7b 0a 20 20 56   *pAggInfo){.  V
173f0 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d  dbe *v = pParse-
17400 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74 20 69 3b  >pVdbe;.  int i;
17410 0a 20 20 73 74 72 75 63 74 20 41 67 67 49 6e 66  .  struct AggInf
17420 6f 5f 66 75 6e 63 20 2a 70 46 3b 0a 20 20 66 6f  o_func *pF;.  fo
17430 72 28 69 3d 30 2c 20 70 46 3d 70 41 67 67 49 6e  r(i=0, pF=pAggIn
17440 66 6f 2d 3e 61 46 75 6e 63 3b 20 69 3c 70 41 67  fo->aFunc; i<pAg
17450 67 49 6e 66 6f 2d 3e 6e 46 75 6e 63 3b 20 69 2b  gInfo->nFunc; i+
17460 2b 2c 20 70 46 2b 2b 29 7b 0a 20 20 20 20 45 78  +, pF++){.    Ex
17470 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 20 3d 20  prList *pList = 
17480 70 46 2d 3e 70 45 78 70 72 2d 3e 70 4c 69 73 74  pF->pExpr->pList
17490 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
174a0 65 4f 70 33 28 76 2c 20 4f 50 5f 41 67 67 46 69  eOp3(v, OP_AggFi
174b0 6e 61 6c 2c 20 70 46 2d 3e 69 4d 65 6d 2c 20 70  nal, pF->iMem, p
174c0 4c 69 73 74 20 3f 20 70 4c 69 73 74 2d 3e 6e 45  List ? pList->nE
174d0 78 70 72 20 3a 20 30 2c 0a 20 20 20 20 20 20 20  xpr : 0,.       
174e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28                 (
174f0 76 6f 69 64 2a 29 70 46 2d 3e 70 46 75 6e 63 2c  void*)pF->pFunc,
17500 20 50 33 5f 46 55 4e 43 44 45 46 29 3b 0a 20 20   P3_FUNCDEF);.  
17510 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 70 64 61 74  }.}../*.** Updat
17520 65 20 74 68 65 20 61 63 63 75 6d 75 6c 61 74 6f  e the accumulato
17530 72 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 73 20 66  r memory cells f
17540 6f 72 20 61 6e 20 61 67 67 72 65 67 61 74 65 20  or an aggregate 
17550 62 61 73 65 64 20 6f 6e 0a 2a 2a 20 74 68 65 20  based on.** the 
17560 63 75 72 72 65 6e 74 20 63 75 72 73 6f 72 20 70  current cursor p
17570 6f 73 69 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74  osition..*/.stat
17580 69 63 20 76 6f 69 64 20 75 70 64 61 74 65 41 63  ic void updateAc
17590 63 75 6d 75 6c 61 74 6f 72 28 50 61 72 73 65 20  cumulator(Parse 
175a0 2a 70 50 61 72 73 65 2c 20 41 67 67 49 6e 66 6f  *pParse, AggInfo
175b0 20 2a 70 41 67 67 49 6e 66 6f 29 7b 0a 20 20 56   *pAggInfo){.  V
175c0 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d  dbe *v = pParse-
175d0 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74 20 69 3b  >pVdbe;.  int i;
175e0 0a 20 20 73 74 72 75 63 74 20 41 67 67 49 6e 66  .  struct AggInf
175f0 6f 5f 66 75 6e 63 20 2a 70 46 3b 0a 20 20 73 74  o_func *pF;.  st
17600 72 75 63 74 20 41 67 67 49 6e 66 6f 5f 63 6f 6c  ruct AggInfo_col
17610 20 2a 70 43 3b 0a 0a 20 20 70 41 67 67 49 6e 66   *pC;..  pAggInf
17620 6f 2d 3e 64 69 72 65 63 74 4d 6f 64 65 20 3d 20  o->directMode = 
17630 31 3b 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70 46  1;.  for(i=0, pF
17640 3d 70 41 67 67 49 6e 66 6f 2d 3e 61 46 75 6e 63  =pAggInfo->aFunc
17650 3b 20 69 3c 70 41 67 67 49 6e 66 6f 2d 3e 6e 46  ; i<pAggInfo->nF
17660 75 6e 63 3b 20 69 2b 2b 2c 20 70 46 2b 2b 29 7b  unc; i++, pF++){
17670 0a 20 20 20 20 69 6e 74 20 6e 41 72 67 3b 0a 20  .    int nArg;. 
17680 20 20 20 69 6e 74 20 61 64 64 72 4e 65 78 74 20     int addrNext 
17690 3d 20 30 3b 0a 20 20 20 20 45 78 70 72 4c 69 73  = 0;.    ExprLis
176a0 74 20 2a 70 4c 69 73 74 20 3d 20 70 46 2d 3e 70  t *pList = pF->p
176b0 45 78 70 72 2d 3e 70 4c 69 73 74 3b 0a 20 20 20  Expr->pList;.   
176c0 20 69 66 28 20 70 4c 69 73 74 20 29 7b 0a 20 20   if( pList ){.  
176d0 20 20 20 20 6e 41 72 67 20 3d 20 70 4c 69 73 74      nArg = pList
176e0 2d 3e 6e 45 78 70 72 3b 0a 20 20 20 20 20 20 73  ->nExpr;.      s
176f0 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 45 78  qlite3ExprCodeEx
17700 70 72 4c 69 73 74 28 70 50 61 72 73 65 2c 20 70  prList(pParse, p
17710 4c 69 73 74 29 3b 0a 20 20 20 20 7d 65 6c 73 65  List);.    }else
17720 7b 0a 20 20 20 20 20 20 6e 41 72 67 20 3d 20 30  {.      nArg = 0
17730 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
17740 70 46 2d 3e 69 44 69 73 74 69 6e 63 74 3e 3d 30  pF->iDistinct>=0
17750 20 29 7b 0a 20 20 20 20 20 20 61 64 64 72 4e 65   ){.      addrNe
17760 78 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  xt = sqlite3Vdbe
17770 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20  MakeLabel(v);.  
17780 20 20 20 20 61 73 73 65 72 74 28 20 6e 41 72 67      assert( nArg
17790 3d 3d 31 20 29 3b 0a 20 20 20 20 20 20 63 6f 64  ==1 );.      cod
177a0 65 44 69 73 74 69 6e 63 74 28 76 2c 20 70 46 2d  eDistinct(v, pF-
177b0 3e 69 44 69 73 74 69 6e 63 74 2c 20 61 64 64 72  >iDistinct, addr
177c0 4e 65 78 74 2c 20 31 29 3b 0a 20 20 20 20 7d 0a  Next, 1);.    }.
177d0 20 20 20 20 69 66 28 20 70 46 2d 3e 70 46 75 6e      if( pF->pFun
177e0 63 2d 3e 6e 65 65 64 43 6f 6c 6c 53 65 71 20 29  c->needCollSeq )
177f0 7b 0a 20 20 20 20 20 20 43 6f 6c 6c 53 65 71 20  {.      CollSeq 
17800 2a 70 43 6f 6c 6c 20 3d 20 30 3b 0a 20 20 20 20  *pColl = 0;.    
17810 20 20 73 74 72 75 63 74 20 45 78 70 72 4c 69 73    struct ExprLis
17820 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20  t_item *pItem;. 
17830 20 20 20 20 20 69 6e 74 20 6a 3b 0a 20 20 20 20       int j;.    
17840 20 20 61 73 73 65 72 74 28 20 70 4c 69 73 74 21    assert( pList!
17850 3d 30 20 29 3b 20 20 2f 2a 20 70 4c 69 73 74 21  =0 );  /* pList!
17860 3d 30 20 69 66 20 70 46 2d 3e 70 46 75 6e 63 2d  =0 if pF->pFunc-
17870 3e 6e 65 65 64 43 6f 6c 6c 53 65 71 20 69 73 20  >needCollSeq is 
17880 74 72 75 65 20 2a 2f 0a 20 20 20 20 20 20 66 6f  true */.      fo
17890 72 28 6a 3d 30 2c 20 70 49 74 65 6d 3d 70 4c 69  r(j=0, pItem=pLi
178a0 73 74 2d 3e 61 3b 20 21 70 43 6f 6c 6c 20 26 26  st->a; !pColl &&
178b0 20 6a 3c 6e 41 72 67 3b 20 6a 2b 2b 2c 20 70 49   j<nArg; j++, pI
178c0 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  tem++){.        
178d0 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 45  pColl = sqlite3E
178e0 78 70 72 43 6f 6c 6c 53 65 71 28 70 50 61 72 73  xprCollSeq(pPars
178f0 65 2c 20 70 49 74 65 6d 2d 3e 70 45 78 70 72 29  e, pItem->pExpr)
17900 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
17910 69 66 28 20 21 70 43 6f 6c 6c 20 29 7b 0a 20 20  if( !pColl ){.  
17920 20 20 20 20 20 20 70 43 6f 6c 6c 20 3d 20 70 50        pColl = pP
17930 61 72 73 65 2d 3e 64 62 2d 3e 70 44 66 6c 74 43  arse->db->pDfltC
17940 6f 6c 6c 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  oll;.      }.   
17950 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4f 70     sqlite3VdbeOp
17960 33 28 76 2c 20 4f 50 5f 43 6f 6c 6c 53 65 71 2c  3(v, OP_CollSeq,
17970 20 30 2c 20 30 2c 20 28 63 68 61 72 20 2a 29 70   0, 0, (char *)p
17980 43 6f 6c 6c 2c 20 50 33 5f 43 4f 4c 4c 53 45 51  Coll, P3_COLLSEQ
17990 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c  );.    }.    sql
179a0 69 74 65 33 56 64 62 65 4f 70 33 28 76 2c 20 4f  ite3VdbeOp3(v, O
179b0 50 5f 41 67 67 53 74 65 70 2c 20 70 46 2d 3e 69  P_AggStep, pF->i
179c0 4d 65 6d 2c 20 6e 41 72 67 2c 20 28 76 6f 69 64  Mem, nArg, (void
179d0 2a 29 70 46 2d 3e 70 46 75 6e 63 2c 20 50 33 5f  *)pF->pFunc, P3_
179e0 46 55 4e 43 44 45 46 29 3b 0a 20 20 20 20 69 66  FUNCDEF);.    if
179f0 28 20 61 64 64 72 4e 65 78 74 20 29 7b 0a 20 20  ( addrNext ){.  
17a00 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 52      sqlite3VdbeR
17a10 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 61  esolveLabel(v, a
17a20 64 64 72 4e 65 78 74 29 3b 0a 20 20 20 20 7d 0a  ddrNext);.    }.
17a30 20 20 7d 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70    }.  for(i=0, p
17a40 43 3d 70 41 67 67 49 6e 66 6f 2d 3e 61 43 6f 6c  C=pAggInfo->aCol
17a50 3b 20 69 3c 70 41 67 67 49 6e 66 6f 2d 3e 6e 41  ; i<pAggInfo->nA
17a60 63 63 75 6d 75 6c 61 74 6f 72 3b 20 69 2b 2b 2c  ccumulator; i++,
17a70 20 70 43 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69   pC++){.    sqli
17a80 74 65 33 45 78 70 72 43 6f 64 65 28 70 50 61 72  te3ExprCode(pPar
17a90 73 65 2c 20 70 43 2d 3e 70 45 78 70 72 29 3b 0a  se, pC->pExpr);.
17aa0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
17ab0 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 65 6d 53 74  ddOp(v, OP_MemSt
17ac0 6f 72 65 2c 20 70 43 2d 3e 69 4d 65 6d 2c 20 31  ore, pC->iMem, 1
17ad0 29 3b 0a 20 20 7d 0a 20 20 70 41 67 67 49 6e 66  );.  }.  pAggInf
17ae0 6f 2d 3e 64 69 72 65 63 74 4d 6f 64 65 20 3d 20  o->directMode = 
17af0 30 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e  0;.}.../*.** Gen
17b00 65 72 61 74 65 20 63 6f 64 65 20 66 6f 72 20 74  erate code for t
17b10 68 65 20 67 69 76 65 6e 20 53 45 4c 45 43 54 20  he given SELECT 
17b20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a  statement..**.**
17b30 20 54 68 65 20 72 65 73 75 6c 74 73 20 61 72 65   The results are
17b40 20 64 69 73 74 72 69 62 75 74 65 64 20 69 6e 20   distributed in 
17b50 76 61 72 69 6f 75 73 20 77 61 79 73 20 64 65 70  various ways dep
17b60 65 6e 64 69 6e 67 20 6f 6e 20 74 68 65 0a 2a 2a  ending on the.**
17b70 20 76 61 6c 75 65 20 6f 66 20 65 44 65 73 74 20   value of eDest 
17b80 61 6e 64 20 69 50 61 72 6d 2e 0a 2a 2a 0a 2a 2a  and iParm..**.**
17b90 20 20 20 20 20 65 44 65 73 74 20 56 61 6c 75 65       eDest Value
17ba0 20 20 20 20 20 20 20 52 65 73 75 6c 74 0a 2a 2a         Result.**
17bb0 20 20 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d       -----------
17bc0 2d 20 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  -    -----------
17bd0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
17be0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
17bf0 0a 2a 2a 20 20 20 20 20 53 52 54 5f 43 61 6c 6c  .**     SRT_Call
17c00 62 61 63 6b 20 20 20 20 49 6e 76 6f 6b 65 20 74  back    Invoke t
17c10 68 65 20 63 61 6c 6c 62 61 63 6b 20 66 6f 72 20  he callback for 
17c20 65 61 63 68 20 72 6f 77 20 6f 66 20 74 68 65 20  each row of the 
17c30 72 65 73 75 6c 74 2e 0a 2a 2a 0a 2a 2a 20 20 20  result..**.**   
17c40 20 20 53 52 54 5f 4d 65 6d 20 20 20 20 20 20 20    SRT_Mem       
17c50 20 20 53 74 6f 72 65 20 66 69 72 73 74 20 72 65    Store first re
17c60 73 75 6c 74 20 69 6e 20 6d 65 6d 6f 72 79 20 63  sult in memory c
17c70 65 6c 6c 20 69 50 61 72 6d 0a 2a 2a 0a 2a 2a 20  ell iParm.**.** 
17c80 20 20 20 20 53 52 54 5f 53 65 74 20 20 20 20 20      SRT_Set     
17c90 20 20 20 20 53 74 6f 72 65 20 72 65 73 75 6c 74      Store result
17ca0 73 20 61 73 20 6b 65 79 73 20 6f 66 20 74 61 62  s as keys of tab
17cb0 6c 65 20 69 50 61 72 6d 2e 0a 2a 2a 0a 2a 2a 20  le iParm..**.** 
17cc0 20 20 20 20 53 52 54 5f 55 6e 69 6f 6e 20 20 20      SRT_Union   
17cd0 20 20 20 20 53 74 6f 72 65 20 72 65 73 75 6c 74      Store result
17ce0 73 20 61 73 20 61 20 6b 65 79 20 69 6e 20 61 20  s as a key in a 
17cf0 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20  temporary table 
17d00 69 50 61 72 6d 0a 2a 2a 0a 2a 2a 20 20 20 20 20  iParm.**.**     
17d10 53 52 54 5f 45 78 63 65 70 74 20 20 20 20 20 20  SRT_Except      
17d20 52 65 6d 6f 76 65 20 72 65 73 75 6c 74 73 20 66  Remove results f
17d30 72 6f 6d 20 74 68 65 20 74 65 6d 70 6f 72 61 72  rom the temporar
17d40 79 20 74 61 62 6c 65 20 69 50 61 72 6d 2e 0a 2a  y table iParm..*
17d50 2a 0a 2a 2a 20 20 20 20 20 53 52 54 5f 54 61 62  *.**     SRT_Tab
17d60 6c 65 20 20 20 20 20 20 20 53 74 6f 72 65 20 72  le       Store r
17d70 65 73 75 6c 74 73 20 69 6e 20 74 65 6d 70 6f 72  esults in tempor
17d80 61 72 79 20 74 61 62 6c 65 20 69 50 61 72 6d 0a  ary table iParm.
17d90 2a 2a 0a 2a 2a 20 54 68 65 20 74 61 62 6c 65 20  **.** The table 
17da0 61 62 6f 76 65 20 69 73 20 69 6e 63 6f 6d 70 6c  above is incompl
17db0 65 74 65 2e 20 20 41 64 64 69 74 69 6f 6e 61 6c  ete.  Additional
17dc0 20 65 44 69 73 74 20 76 61 6c 75 65 20 68 61 76   eDist value hav
17dd0 65 20 62 65 20 61 64 64 65 64 0a 2a 2a 20 73 69  e be added.** si
17de0 6e 63 65 20 74 68 69 73 20 63 6f 6d 6d 65 6e 74  nce this comment
17df0 20 77 61 73 20 77 72 69 74 74 65 6e 2e 20 20 53   was written.  S
17e00 65 65 20 74 68 65 20 73 65 6c 65 63 74 49 6e 6e  ee the selectInn
17e10 65 72 4c 6f 6f 70 28 29 20 66 75 6e 63 74 69 6f  erLoop() functio
17e20 6e 20 66 6f 72 0a 2a 2a 20 61 20 63 6f 6d 70 6c  n for.** a compl
17e30 65 74 65 20 6c 69 73 74 69 6e 67 20 6f 66 20 74  ete listing of t
17e40 68 65 20 61 6c 6c 6f 77 65 64 20 76 61 6c 75 65  he allowed value
17e50 73 20 6f 66 20 65 44 65 73 74 20 61 6e 64 20 74  s of eDest and t
17e60 68 65 69 72 20 6d 65 61 6e 69 6e 67 73 2e 0a 2a  heir meanings..*
17e70 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
17e80 65 20 72 65 74 75 72 6e 73 20 74 68 65 20 6e 75  e returns the nu
17e90 6d 62 65 72 20 6f 66 20 65 72 72 6f 72 73 2e 20  mber of errors. 
17ea0 20 49 66 20 61 6e 79 20 65 72 72 6f 72 73 20 61   If any errors a
17eb0 72 65 0a 2a 2a 20 65 6e 63 6f 75 6e 74 65 72 65  re.** encountere
17ec0 64 2c 20 74 68 65 6e 20 61 6e 20 61 70 70 72 6f  d, then an appro
17ed0 70 72 69 61 74 65 20 65 72 72 6f 72 20 6d 65 73  priate error mes
17ee0 73 61 67 65 20 69 73 20 6c 65 66 74 20 69 6e 0a  sage is left in.
17ef0 2a 2a 20 70 50 61 72 73 65 2d 3e 7a 45 72 72 4d  ** pParse->zErrM
17f00 73 67 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  sg..**.** This r
17f10 6f 75 74 69 6e 65 20 64 6f 65 73 20 4e 4f 54 20  outine does NOT 
17f20 66 72 65 65 20 74 68 65 20 53 65 6c 65 63 74 20  free the Select 
17f30 73 74 72 75 63 74 75 72 65 20 70 61 73 73 65 64  structure passed
17f40 20 69 6e 2e 20 20 54 68 65 0a 2a 2a 20 63 61 6c   in.  The.** cal
17f50 6c 69 6e 67 20 66 75 6e 63 74 69 6f 6e 20 6e 65  ling function ne
17f60 65 64 73 20 74 6f 20 64 6f 20 74 68 61 74 2e 0a  eds to do that..
17f70 2a 2a 0a 2a 2a 20 54 68 65 20 70 50 61 72 65 6e  **.** The pParen
17f80 74 2c 20 70 61 72 65 6e 74 54 61 62 2c 20 61 6e  t, parentTab, an
17f90 64 20 2a 70 50 61 72 65 6e 74 41 67 67 20 66 69  d *pParentAgg fi
17fa0 65 6c 64 73 20 61 72 65 20 66 69 6c 6c 65 64 20  elds are filled 
17fb0 69 6e 20 69 66 20 74 68 69 73 0a 2a 2a 20 53 45  in if this.** SE
17fc0 4c 45 43 54 20 69 73 20 61 20 73 75 62 71 75 65  LECT is a subque
17fd0 72 79 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e  ry.  This routin
17fe0 65 20 6d 61 79 20 74 72 79 20 74 6f 20 63 6f 6d  e may try to com
17ff0 62 69 6e 65 20 74 68 69 73 20 53 45 4c 45 43 54  bine this SELECT
18000 0a 2a 2a 20 77 69 74 68 20 69 74 73 20 70 61 72  .** with its par
18010 65 6e 74 20 74 6f 20 66 6f 72 6d 20 61 20 73 69  ent to form a si
18020 6e 67 6c 65 20 66 6c 61 74 20 71 75 65 72 79 2e  ngle flat query.
18030 20 20 49 6e 20 73 6f 20 64 6f 69 6e 67 2c 20 69    In so doing, i
18040 74 20 6d 69 67 68 74 0a 2a 2a 20 63 68 61 6e 67  t might.** chang
18050 65 20 74 68 65 20 70 61 72 65 6e 74 20 71 75 65  e the parent que
18060 72 79 20 66 72 6f 6d 20 61 20 6e 6f 6e 2d 61 67  ry from a non-ag
18070 67 72 65 67 61 74 65 20 74 6f 20 61 6e 20 61 67  gregate to an ag
18080 67 72 65 67 61 74 65 20 71 75 65 72 79 2e 0a 2a  gregate query..*
18090 2a 20 46 6f 72 20 74 68 61 74 20 72 65 61 73 6f  * For that reaso
180a0 6e 2c 20 74 68 65 20 70 50 61 72 65 6e 74 41 67  n, the pParentAg
180b0 67 20 66 6c 61 67 20 69 73 20 70 61 73 73 65 64  g flag is passed
180c0 20 61 73 20 61 20 70 6f 69 6e 74 65 72 2c 20 73   as a pointer, s
180d0 6f 20 69 74 0a 2a 2a 20 63 61 6e 20 62 65 20 63  o it.** can be c
180e0 68 61 6e 67 65 64 2e 0a 2a 2a 0a 2a 2a 20 45 78  hanged..**.** Ex
180f0 61 6d 70 6c 65 20 31 3a 20 20 20 54 68 65 20 6d  ample 1:   The m
18100 65 61 6e 69 6e 67 20 6f 66 20 74 68 65 20 70 50  eaning of the pP
18110 61 72 65 6e 74 20 70 61 72 61 6d 65 74 65 72 2e  arent parameter.
18120 0a 2a 2a 0a 2a 2a 20 20 20 20 53 45 4c 45 43 54  .**.**    SELECT
18130 20 2a 20 46 52 4f 4d 20 74 31 20 4a 4f 49 4e 20   * FROM t1 JOIN 
18140 28 53 45 4c 45 43 54 20 78 2c 20 63 6f 75 6e 74  (SELECT x, count
18150 28 2a 29 20 46 52 4f 4d 20 74 32 29 20 4a 4f 49  (*) FROM t2) JOI
18160 4e 20 74 33 3b 0a 2a 2a 20 20 20 20 5c 20 20 20  N t3;.**    \   
18170 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18180 20 20 20 5c 5f 5f 5f 5f 5f 5f 5f 20 73 75 62 71     \_______ subq
18190 75 65 72 79 20 5f 5f 5f 5f 5f 5f 5f 2f 20 20 20  uery _______/   
181a0 20 20 20 20 20 2f 0a 2a 2a 20 20 20 20 20 5c 20       /.**     \ 
181b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
181c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
181d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
181e0 20 20 20 20 20 2f 0a 2a 2a 20 20 20 20 20 20 5c       /.**      \
181f0 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f  ________________
18200 5f 5f 5f 5f 20 6f 75 74 65 72 20 71 75 65 72 79  ____ outer query
18210 20 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f   _______________
18220 5f 5f 5f 5f 2f 0a 2a 2a 0a 2a 2a 20 54 68 69 73  ____/.**.** This
18230 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c   routine is call
18240 65 64 20 66 6f 72 20 74 68 65 20 6f 75 74 65 72  ed for the outer
18250 20 71 75 65 72 79 20 66 69 72 73 74 2e 20 20 20   query first.   
18260 46 6f 72 20 74 68 61 74 20 63 61 6c 6c 2c 0a 2a  For that call,.*
18270 2a 20 70 50 61 72 65 6e 74 20 77 69 6c 6c 20 62  * pParent will b
18280 65 20 4e 55 4c 4c 2e 20 20 44 75 72 69 6e 67 20  e NULL.  During 
18290 74 68 65 20 70 72 6f 63 65 73 73 69 6e 67 20 6f  the processing o
182a0 66 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72  f the outer quer
182b0 79 2c 20 74 68 69 73 20 0a 2a 2a 20 72 6f 75 74  y, this .** rout
182c0 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 72 65  ine is called re
182d0 63 75 72 73 69 76 65 6c 79 20 74 6f 20 68 61 6e  cursively to han
182e0 64 6c 65 20 74 68 65 20 73 75 62 71 75 65 72 79  dle the subquery
182f0 2e 20 20 46 6f 72 20 74 68 65 20 72 65 63 75 72  .  For the recur
18300 73 69 76 65 0a 2a 2a 20 63 61 6c 6c 2c 20 70 50  sive.** call, pP
18310 61 72 65 6e 74 20 77 69 6c 6c 20 70 6f 69 6e 74  arent will point
18320 20 74 6f 20 74 68 65 20 6f 75 74 65 72 20 71 75   to the outer qu
18330 65 72 79 2e 20 20 42 65 63 61 75 73 65 20 74 68  ery.  Because th
18340 65 20 73 75 62 71 75 65 72 79 20 69 73 0a 2a 2a  e subquery is.**
18350 20 74 68 65 20 73 65 63 6f 6e 64 20 65 6c 65 6d   the second elem
18360 65 6e 74 20 69 6e 20 61 20 74 68 72 65 65 2d 77  ent in a three-w
18370 61 79 20 6a 6f 69 6e 2c 20 74 68 65 20 70 61 72  ay join, the par
18380 65 6e 74 54 61 62 20 70 61 72 61 6d 65 74 65 72  entTab parameter
18390 20 77 69 6c 6c 0a 2a 2a 20 62 65 20 31 20 28 74   will.** be 1 (t
183a0 68 65 20 32 6e 64 20 76 61 6c 75 65 20 6f 66 20  he 2nd value of 
183b0 61 20 30 2d 69 6e 64 65 78 65 64 20 61 72 72 61  a 0-indexed arra
183c0 79 2e 29 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  y.).*/.int sqlit
183d0 65 33 53 65 6c 65 63 74 28 0a 20 20 50 61 72 73  e3Select(.  Pars
183e0 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20  e *pParse,      
183f0 20 20 20 2f 2a 20 54 68 65 20 70 61 72 73 65 72     /* The parser
18400 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53 65   context */.  Se
18410 6c 65 63 74 20 2a 70 2c 20 20 20 20 20 20 20 20  lect *p,        
18420 20 20 20 20 20 2f 2a 20 54 68 65 20 53 45 4c 45       /* The SELE
18430 43 54 20 73 74 61 74 65 6d 65 6e 74 20 62 65 69  CT statement bei
18440 6e 67 20 63 6f 64 65 64 2e 20 2a 2f 0a 20 20 69  ng coded. */.  i
18450 6e 74 20 65 44 65 73 74 2c 20 20 20 20 20 20 20  nt eDest,       
18460 20 20 20 20 20 20 2f 2a 20 48 6f 77 20 74 6f 20        /* How to 
18470 64 69 73 70 6f 73 65 20 6f 66 20 74 68 65 20 72  dispose of the r
18480 65 73 75 6c 74 73 20 2a 2f 0a 20 20 69 6e 74 20  esults */.  int 
18490 69 50 61 72 6d 2c 20 20 20 20 20 20 20 20 20 20  iParm,          
184a0 20 20 20 2f 2a 20 41 20 70 61 72 61 6d 65 74 65     /* A paramete
184b0 72 20 75 73 65 64 20 62 79 20 74 68 65 20 65 44  r used by the eD
184c0 65 73 74 20 64 69 73 70 6f 73 61 6c 20 6d 65 74  est disposal met
184d0 68 6f 64 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20  hod */.  Select 
184e0 2a 70 50 61 72 65 6e 74 2c 20 20 20 20 20 20 20  *pParent,       
184f0 2f 2a 20 41 6e 6f 74 68 65 72 20 53 45 4c 45 43  /* Another SELEC
18500 54 20 66 6f 72 20 77 68 69 63 68 20 74 68 69 73  T for which this
18510 20 69 73 20 61 20 73 75 62 2d 71 75 65 72 79 20   is a sub-query 
18520 2a 2f 0a 20 20 69 6e 74 20 70 61 72 65 6e 74 54  */.  int parentT
18530 61 62 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 49  ab,         /* I
18540 6e 64 65 78 20 69 6e 20 70 50 61 72 65 6e 74 2d  ndex in pParent-
18550 3e 70 53 72 63 20 6f 66 20 74 68 69 73 20 71 75  >pSrc of this qu
18560 65 72 79 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 50  ery */.  int *pP
18570 61 72 65 6e 74 41 67 67 2c 20 20 20 20 20 20 20  arentAgg,       
18580 2f 2a 20 54 72 75 65 20 69 66 20 70 50 61 72 65  /* True if pPare
18590 6e 74 20 75 73 65 73 20 61 67 67 72 65 67 61 74  nt uses aggregat
185a0 65 20 66 75 6e 63 74 69 6f 6e 73 20 2a 2f 0a 20  e functions */. 
185b0 20 63 68 61 72 20 2a 61 66 66 20 20 20 20 20 20   char *aff      
185c0 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 65 44          /* If eD
185d0 65 73 74 20 69 73 20 53 52 54 5f 55 6e 69 6f 6e  est is SRT_Union
185e0 2c 20 74 68 65 20 61 66 66 69 6e 69 74 79 20 73  , the affinity s
185f0 74 72 69 6e 67 20 2a 2f 0a 29 7b 0a 20 20 69 6e  tring */.){.  in
18600 74 20 69 2c 20 6a 3b 20 20 20 20 20 20 20 20 20  t i, j;         
18610 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75       /* Loop cou
18620 6e 74 65 72 73 20 2a 2f 0a 20 20 57 68 65 72 65  nters */.  Where
18630 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 3b 20 20 20  Info *pWInfo;   
18640 20 20 2f 2a 20 52 65 74 75 72 6e 20 66 72 6f 6d    /* Return from
18650 20 73 71 6c 69 74 65 33 57 68 65 72 65 42 65 67   sqlite3WhereBeg
18660 69 6e 28 29 20 2a 2f 0a 20 20 56 64 62 65 20 2a  in() */.  Vdbe *
18670 76 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  v;              
18680 20 2f 2a 20 54 68 65 20 76 69 72 74 75 61 6c 20   /* The virtual 
18690 6d 61 63 68 69 6e 65 20 75 6e 64 65 72 20 63 6f  machine under co
186a0 6e 73 74 72 75 63 74 69 6f 6e 20 2a 2f 0a 20 20  nstruction */.  
186b0 69 6e 74 20 69 73 41 67 67 3b 20 20 20 20 20 20  int isAgg;      
186c0 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 66         /* True f
186d0 6f 72 20 73 65 6c 65 63 74 20 6c 69 73 74 73 20  or select lists 
186e0 6c 69 6b 65 20 22 63 6f 75 6e 74 28 2a 29 22 20  like "count(*)" 
186f0 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70  */.  ExprList *p
18700 45 4c 69 73 74 3b 20 20 20 20 20 20 2f 2a 20 4c  EList;      /* L
18710 69 73 74 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 74  ist of columns t
18720 6f 20 65 78 74 72 61 63 74 2e 20 2a 2f 0a 20 20  o extract. */.  
18730 53 72 63 4c 69 73 74 20 2a 70 54 61 62 4c 69 73  SrcList *pTabLis
18740 74 3b 20 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f  t;     /* List o
18750 66 20 74 61 62 6c 65 73 20 74 6f 20 73 65 6c 65  f tables to sele
18760 63 74 20 66 72 6f 6d 20 2a 2f 0a 20 20 45 78 70  ct from */.  Exp
18770 72 20 2a 70 57 68 65 72 65 3b 20 20 20 20 20 20  r *pWhere;      
18780 20 20 20 20 2f 2a 20 54 68 65 20 57 48 45 52 45      /* The WHERE
18790 20 63 6c 61 75 73 65 2e 20 20 4d 61 79 20 62 65   clause.  May be
187a0 20 4e 55 4c 4c 20 2a 2f 0a 20 20 45 78 70 72 4c   NULL */.  ExprL
187b0 69 73 74 20 2a 70 4f 72 64 65 72 42 79 3b 20 20  ist *pOrderBy;  
187c0 20 20 2f 2a 20 54 68 65 20 4f 52 44 45 52 20 42    /* The ORDER B
187d0 59 20 63 6c 61 75 73 65 2e 20 20 4d 61 79 20 62  Y clause.  May b
187e0 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20 45 78 70 72  e NULL */.  Expr
187f0 4c 69 73 74 20 2a 70 47 72 6f 75 70 42 79 3b 20  List *pGroupBy; 
18800 20 20 20 2f 2a 20 54 68 65 20 47 52 4f 55 50 20     /* The GROUP 
18810 42 59 20 63 6c 61 75 73 65 2e 20 20 4d 61 79 20  BY clause.  May 
18820 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20 45 78 70  be NULL */.  Exp
18830 72 20 2a 70 48 61 76 69 6e 67 3b 20 20 20 20 20  r *pHaving;     
18840 20 20 20 20 2f 2a 20 54 68 65 20 48 41 56 49 4e      /* The HAVIN
18850 47 20 63 6c 61 75 73 65 2e 20 20 4d 61 79 20 62  G clause.  May b
18860 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20 69 6e 74 20  e NULL */.  int 
18870 69 73 44 69 73 74 69 6e 63 74 3b 20 20 20 20 20  isDistinct;     
18880 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 74 68     /* True if th
18890 65 20 44 49 53 54 49 4e 43 54 20 6b 65 79 77 6f  e DISTINCT keywo
188a0 72 64 20 69 73 20 70 72 65 73 65 6e 74 20 2a 2f  rd is present */
188b0 0a 20 20 69 6e 74 20 64 69 73 74 69 6e 63 74 3b  .  int distinct;
188c0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 61 62            /* Tab
188d0 6c 65 20 74 6f 20 75 73 65 20 66 6f 72 20 74 68  le to use for th
188e0 65 20 64 69 73 74 69 6e 63 74 20 73 65 74 20 2a  e distinct set *
188f0 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20 31 3b 20  /.  int rc = 1; 
18900 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56 61             /* Va
18910 6c 75 65 20 74 6f 20 72 65 74 75 72 6e 20 66 72  lue to return fr
18920 6f 6d 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  om this function
18930 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 53 6f   */.  int addrSo
18940 72 74 49 6e 64 65 78 3b 20 20 20 20 20 2f 2a 20  rtIndex;     /* 
18950 41 64 64 72 65 73 73 20 6f 66 20 61 6e 20 4f 50  Address of an OP
18960 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 20 69  _OpenEphemeral i
18970 6e 73 74 72 75 63 74 69 6f 6e 20 2a 2f 0a 20 20  nstruction */.  
18980 41 67 67 49 6e 66 6f 20 73 41 67 67 49 6e 66 6f  AggInfo sAggInfo
18990 3b 20 20 20 20 20 20 2f 2a 20 49 6e 66 6f 72 6d  ;      /* Inform
189a0 61 74 69 6f 6e 20 75 73 65 64 20 62 79 20 61 67  ation used by ag
189b0 67 72 65 67 61 74 65 20 71 75 65 72 69 65 73 20  gregate queries 
189c0 2a 2f 0a 20 20 69 6e 74 20 69 45 6e 64 3b 20 20  */.  int iEnd;  
189d0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
189e0 64 64 72 65 73 73 20 6f 66 20 74 68 65 20 65 6e  ddress of the en
189f0 64 20 6f 66 20 74 68 65 20 71 75 65 72 79 20 2a  d of the query *
18a00 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b  /.  sqlite3 *db;
18a10 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
18a20 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65  e database conne
18a30 63 74 69 6f 6e 20 2a 2f 0a 0a 20 20 64 62 20 3d  ction */..  db =
18a40 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 69   pParse->db;.  i
18a50 66 28 20 70 3d 3d 30 20 7c 7c 20 64 62 2d 3e 6d  f( p==0 || db->m
18a60 61 6c 6c 6f 63 46 61 69 6c 65 64 20 7c 7c 20 70  allocFailed || p
18a70 50 61 72 73 65 2d 3e 6e 45 72 72 20 29 7b 0a 20  Parse->nErr ){. 
18a80 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d     return 1;.  }
18a90 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 41 75  .  if( sqlite3Au
18aa0 74 68 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20  thCheck(pParse, 
18ab0 53 51 4c 49 54 45 5f 53 45 4c 45 43 54 2c 20 30  SQLITE_SELECT, 0
18ac0 2c 20 30 2c 20 30 29 20 29 20 72 65 74 75 72 6e  , 0, 0) ) return
18ad0 20 31 3b 0a 20 20 6d 65 6d 73 65 74 28 26 73 41   1;.  memset(&sA
18ae0 67 67 49 6e 66 6f 2c 20 30 2c 20 73 69 7a 65 6f  ggInfo, 0, sizeo
18af0 66 28 73 41 67 67 49 6e 66 6f 29 29 3b 0a 0a 23  f(sAggInfo));..#
18b00 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
18b10 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45  IT_COMPOUND_SELE
18b20 43 54 0a 20 20 2f 2a 20 49 66 20 74 68 65 72 65  CT.  /* If there
18b30 20 69 73 20 61 72 65 20 61 20 73 65 71 75 65 6e   is are a sequen
18b40 63 65 20 6f 66 20 71 75 65 72 69 65 73 2c 20 64  ce of queries, d
18b50 6f 20 74 68 65 20 65 61 72 6c 69 65 72 20 6f 6e  o the earlier on
18b60 65 73 20 66 69 72 73 74 2e 0a 20 20 2a 2f 0a 20  es first..  */. 
18b70 20 69 66 28 20 70 2d 3e 70 50 72 69 6f 72 20 29   if( p->pPrior )
18b80 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e 70 52 69  {.    if( p->pRi
18b90 67 68 74 6d 6f 73 74 3d 3d 30 20 29 7b 0a 20 20  ghtmost==0 ){.  
18ba0 20 20 20 20 53 65 6c 65 63 74 20 2a 70 4c 6f 6f      Select *pLoo
18bb0 70 3b 0a 20 20 20 20 20 20 69 6e 74 20 63 6e 74  p;.      int cnt
18bc0 20 3d 20 30 3b 0a 20 20 20 20 20 20 66 6f 72 28   = 0;.      for(
18bd0 70 4c 6f 6f 70 3d 70 3b 20 70 4c 6f 6f 70 3b 20  pLoop=p; pLoop; 
18be0 70 4c 6f 6f 70 3d 70 4c 6f 6f 70 2d 3e 70 50 72  pLoop=pLoop->pPr
18bf0 69 6f 72 2c 20 63 6e 74 2b 2b 29 7b 0a 20 20 20  ior, cnt++){.   
18c00 20 20 20 20 20 70 4c 6f 6f 70 2d 3e 70 52 69 67       pLoop->pRig
18c10 68 74 6d 6f 73 74 20 3d 20 70 3b 0a 20 20 20 20  htmost = p;.    
18c20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 53 51    }.      if( SQ
18c30 4c 49 54 45 5f 4d 41 58 5f 43 4f 4d 50 4f 55 4e  LITE_MAX_COMPOUN
18c40 44 5f 53 45 4c 45 43 54 3e 30 20 26 26 20 63 6e  D_SELECT>0 && cn
18c50 74 3e 53 51 4c 49 54 45 5f 4d 41 58 5f 43 4f 4d  t>SQLITE_MAX_COM
18c60 50 4f 55 4e 44 5f 53 45 4c 45 43 54 20 29 7b 0a  POUND_SELECT ){.
18c70 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
18c80 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
18c90 22 74 6f 6f 20 6d 61 6e 79 20 74 65 72 6d 73 20  "too many terms 
18ca0 69 6e 20 63 6f 6d 70 6f 75 6e 64 20 53 45 4c 45  in compound SELE
18cb0 43 54 22 29 3b 0a 20 20 20 20 20 20 20 20 72 65  CT");.        re
18cc0 74 75 72 6e 20 31 3b 0a 20 20 20 20 20 20 7d 0a  turn 1;.      }.
18cd0 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e      }.    return
18ce0 20 6d 75 6c 74 69 53 65 6c 65 63 74 28 70 50 61   multiSelect(pPa
18cf0 72 73 65 2c 20 70 2c 20 65 44 65 73 74 2c 20 69  rse, p, eDest, i
18d00 50 61 72 6d 2c 20 61 66 66 29 3b 0a 20 20 7d 0a  Parm, aff);.  }.
18d10 23 65 6e 64 69 66 0a 0a 20 20 70 4f 72 64 65 72  #endif..  pOrder
18d20 42 79 20 3d 20 70 2d 3e 70 4f 72 64 65 72 42 79  By = p->pOrderBy
18d30 3b 0a 20 20 69 66 28 20 49 67 6e 6f 72 61 62 6c  ;.  if( Ignorabl
18d40 65 4f 72 64 65 72 62 79 28 65 44 65 73 74 29 20  eOrderby(eDest) 
18d50 29 7b 0a 20 20 20 20 70 2d 3e 70 4f 72 64 65 72  ){.    p->pOrder
18d60 42 79 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 69 66  By = 0;.  }.  if
18d70 28 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 52  ( sqlite3SelectR
18d80 65 73 6f 6c 76 65 28 70 50 61 72 73 65 2c 20 70  esolve(pParse, p
18d90 2c 20 30 29 20 29 7b 0a 20 20 20 20 67 6f 74 6f  , 0) ){.    goto
18da0 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 7d   select_end;.  }
18db0 0a 20 20 70 2d 3e 70 4f 72 64 65 72 42 79 20 3d  .  p->pOrderBy =
18dc0 20 70 4f 72 64 65 72 42 79 3b 0a 0a 20 20 2f 2a   pOrderBy;..  /*
18dd0 20 4d 61 6b 65 20 6c 6f 63 61 6c 20 63 6f 70 69   Make local copi
18de0 65 73 20 6f 66 20 74 68 65 20 70 61 72 61 6d 65  es of the parame
18df0 74 65 72 73 20 66 6f 72 20 74 68 69 73 20 71 75  ters for this qu
18e00 65 72 79 2e 0a 20 20 2a 2f 0a 20 20 70 54 61 62  ery..  */.  pTab
18e10 4c 69 73 74 20 3d 20 70 2d 3e 70 53 72 63 3b 0a  List = p->pSrc;.
18e20 20 20 70 57 68 65 72 65 20 3d 20 70 2d 3e 70 57    pWhere = p->pW
18e30 68 65 72 65 3b 0a 20 20 70 47 72 6f 75 70 42 79  here;.  pGroupBy
18e40 20 3d 20 70 2d 3e 70 47 72 6f 75 70 42 79 3b 0a   = p->pGroupBy;.
18e50 20 20 70 48 61 76 69 6e 67 20 3d 20 70 2d 3e 70    pHaving = p->p
18e60 48 61 76 69 6e 67 3b 0a 20 20 69 73 41 67 67 20  Having;.  isAgg 
18e70 3d 20 70 2d 3e 69 73 41 67 67 3b 0a 20 20 69 73  = p->isAgg;.  is
18e80 44 69 73 74 69 6e 63 74 20 3d 20 70 2d 3e 69 73  Distinct = p->is
18e90 44 69 73 74 69 6e 63 74 3b 0a 20 20 70 45 4c 69  Distinct;.  pELi
18ea0 73 74 20 3d 20 70 2d 3e 70 45 4c 69 73 74 3b 0a  st = p->pEList;.
18eb0 20 20 69 66 28 20 70 45 4c 69 73 74 3d 3d 30 20    if( pEList==0 
18ec0 29 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e  ) goto select_en
18ed0 64 3b 0a 0a 20 20 2f 2a 20 0a 20 20 2a 2a 20 44  d;..  /* .  ** D
18ee0 6f 20 6e 6f 74 20 65 76 65 6e 20 61 74 74 65 6d  o not even attem
18ef0 70 74 20 74 6f 20 67 65 6e 65 72 61 74 65 20 61  pt to generate a
18f00 6e 79 20 63 6f 64 65 20 69 66 20 77 65 20 68 61  ny code if we ha
18f10 76 65 20 61 6c 72 65 61 64 79 20 73 65 65 6e 0a  ve already seen.
18f20 20 20 2a 2a 20 65 72 72 6f 72 73 20 62 65 66 6f    ** errors befo
18f30 72 65 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  re this routine 
18f40 73 74 61 72 74 73 2e 0a 20 20 2a 2f 0a 20 20 69  starts..  */.  i
18f50 66 28 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 3e  f( pParse->nErr>
18f60 30 20 29 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f  0 ) goto select_
18f70 65 6e 64 3b 0a 0a 20 20 2f 2a 20 49 66 20 77 72  end;..  /* If wr
18f80 69 74 69 6e 67 20 74 6f 20 6d 65 6d 6f 72 79 20  iting to memory 
18f90 6f 72 20 67 65 6e 65 72 61 74 69 6e 67 20 61 20  or generating a 
18fa0 73 65 74 0a 20 20 2a 2a 20 6f 6e 6c 79 20 61 20  set.  ** only a 
18fb0 73 69 6e 67 6c 65 20 63 6f 6c 75 6d 6e 20 6d 61  single column ma
18fc0 79 20 62 65 20 6f 75 74 70 75 74 2e 0a 20 20 2a  y be output..  *
18fd0 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  /.#ifndef SQLITE
18fe0 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 20  _OMIT_SUBQUERY. 
18ff0 20 69 66 28 20 63 68 65 63 6b 46 6f 72 4d 75 6c   if( checkForMul
19000 74 69 43 6f 6c 75 6d 6e 53 65 6c 65 63 74 45 72  tiColumnSelectEr
19010 72 6f 72 28 70 50 61 72 73 65 2c 20 65 44 65 73  ror(pParse, eDes
19020 74 2c 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72  t, pEList->nExpr
19030 29 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 73 65  ) ){.    goto se
19040 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 7d 0a 23 65  lect_end;.  }.#e
19050 6e 64 69 66 0a 0a 20 20 2f 2a 20 4f 52 44 45 52  ndif..  /* ORDER
19060 20 42 59 20 69 73 20 69 67 6e 6f 72 65 64 20 66   BY is ignored f
19070 6f 72 20 73 6f 6d 65 20 64 65 73 74 69 6e 61 74  or some destinat
19080 69 6f 6e 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  ions..  */.  if(
19090 20 49 67 6e 6f 72 61 62 6c 65 4f 72 64 65 72 62   IgnorableOrderb
190a0 79 28 65 44 65 73 74 29 20 29 7b 0a 20 20 20 20  y(eDest) ){.    
190b0 70 4f 72 64 65 72 42 79 20 3d 20 30 3b 0a 20 20  pOrderBy = 0;.  
190c0 7d 0a 0a 20 20 2f 2a 20 42 65 67 69 6e 20 67 65  }..  /* Begin ge
190d0 6e 65 72 61 74 69 6e 67 20 63 6f 64 65 2e 0a 20  nerating code.. 
190e0 20 2a 2f 0a 20 20 76 20 3d 20 73 71 6c 69 74 65   */.  v = sqlite
190f0 33 47 65 74 56 64 62 65 28 70 50 61 72 73 65 29  3GetVdbe(pParse)
19100 3b 0a 20 20 69 66 28 20 76 3d 3d 30 20 29 20 67  ;.  if( v==0 ) g
19110 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a  oto select_end;.
19120 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63  .  /* Generate c
19130 6f 64 65 20 66 6f 72 20 61 6c 6c 20 73 75 62 2d  ode for all sub-
19140 71 75 65 72 69 65 73 20 69 6e 20 74 68 65 20 46  queries in the F
19150 52 4f 4d 20 63 6c 61 75 73 65 0a 20 20 2a 2f 0a  ROM clause.  */.
19160 23 69 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c  #if !defined(SQL
19170 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52  ITE_OMIT_SUBQUER
19180 59 29 20 7c 7c 20 21 64 65 66 69 6e 65 64 28 53  Y) || !defined(S
19190 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 29  QLITE_OMIT_VIEW)
191a0 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 54  .  for(i=0; i<pT
191b0 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3b 20 69 2b  abList->nSrc; i+
191c0 2b 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68  +){.    const ch
191d0 61 72 20 2a 7a 53 61 76 65 64 41 75 74 68 43 6f  ar *zSavedAuthCo
191e0 6e 74 65 78 74 20 3d 20 30 3b 0a 20 20 20 20 69  ntext = 0;.    i
191f0 6e 74 20 6e 65 65 64 52 65 73 74 6f 72 65 43 6f  nt needRestoreCo
19200 6e 74 65 78 74 3b 0a 20 20 20 20 73 74 72 75 63  ntext;.    struc
19210 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a  t SrcList_item *
19220 70 49 74 65 6d 20 3d 20 26 70 54 61 62 4c 69 73  pItem = &pTabLis
19230 74 2d 3e 61 5b 69 5d 3b 0a 0a 20 20 20 20 69 66  t->a[i];..    if
19240 28 20 70 49 74 65 6d 2d 3e 70 53 65 6c 65 63 74  ( pItem->pSelect
19250 3d 3d 30 20 7c 7c 20 70 49 74 65 6d 2d 3e 69 73  ==0 || pItem->is
19260 50 6f 70 75 6c 61 74 65 64 20 29 20 63 6f 6e 74  Populated ) cont
19270 69 6e 75 65 3b 0a 20 20 20 20 69 66 28 20 70 49  inue;.    if( pI
19280 74 65 6d 2d 3e 7a 4e 61 6d 65 21 3d 30 20 29 7b  tem->zName!=0 ){
19290 0a 20 20 20 20 20 20 7a 53 61 76 65 64 41 75 74  .      zSavedAut
192a0 68 43 6f 6e 74 65 78 74 20 3d 20 70 50 61 72 73  hContext = pPars
192b0 65 2d 3e 7a 41 75 74 68 43 6f 6e 74 65 78 74 3b  e->zAuthContext;
192c0 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 7a  .      pParse->z
192d0 41 75 74 68 43 6f 6e 74 65 78 74 20 3d 20 70 49  AuthContext = pI
192e0 74 65 6d 2d 3e 7a 4e 61 6d 65 3b 0a 20 20 20 20  tem->zName;.    
192f0 20 20 6e 65 65 64 52 65 73 74 6f 72 65 43 6f 6e    needRestoreCon
19300 74 65 78 74 20 3d 20 31 3b 0a 20 20 20 20 7d 65  text = 1;.    }e
19310 6c 73 65 7b 0a 20 20 20 20 20 20 6e 65 65 64 52  lse{.      needR
19320 65 73 74 6f 72 65 43 6f 6e 74 65 78 74 20 3d 20  estoreContext = 
19330 30 3b 0a 20 20 20 20 7d 0a 23 69 66 20 64 65 66  0;.    }.#if def
19340 69 6e 65 64 28 53 51 4c 49 54 45 5f 54 45 53 54  ined(SQLITE_TEST
19350 29 20 7c 7c 20 53 51 4c 49 54 45 5f 4d 41 58 5f  ) || SQLITE_MAX_
19360 45 58 50 52 5f 44 45 50 54 48 3e 30 0a 20 20 20  EXPR_DEPTH>0.   
19370 20 2f 2a 20 49 6e 63 72 65 6d 65 6e 74 20 50 61   /* Increment Pa
19380 72 73 65 2e 6e 48 65 69 67 68 74 20 62 79 20 74  rse.nHeight by t
19390 68 65 20 68 65 69 67 68 74 20 6f 66 20 74 68 65  he height of the
193a0 20 6c 61 72 67 65 73 74 20 65 78 70 72 65 73 73   largest express
193b0 69 6f 6e 0a 20 20 20 20 2a 2a 20 74 72 65 65 20  ion.    ** tree 
193c0 72 65 66 65 72 65 64 20 74 6f 20 62 79 20 74 68  refered to by th
193d0 69 73 2c 20 74 68 65 20 70 61 72 65 6e 74 20 73  is, the parent s
193e0 65 6c 65 63 74 2e 20 54 68 65 20 63 68 69 6c 64  elect. The child
193f0 20 73 65 6c 65 63 74 0a 20 20 20 20 2a 2a 20 6d   select.    ** m
19400 61 79 20 63 6f 6e 74 61 69 6e 20 65 78 70 72 65  ay contain expre
19410 73 73 69 6f 6e 20 74 72 65 65 73 20 6f 66 20 61  ssion trees of a
19420 74 20 6d 6f 73 74 0a 20 20 20 20 2a 2a 20 28 53  t most.    ** (S
19430 51 4c 49 54 45 5f 4d 41 58 5f 45 58 50 52 5f 44  QLITE_MAX_EXPR_D
19440 45 50 54 48 2d 50 61 72 73 65 2e 6e 48 65 69 67  EPTH-Parse.nHeig
19450 68 74 29 20 68 65 69 67 68 74 2e 20 54 68 69 73  ht) height. This
19460 20 69 73 20 61 20 62 69 74 0a 20 20 20 20 2a 2a   is a bit.    **
19470 20 6d 6f 72 65 20 63 6f 6e 73 65 72 76 61 74 69   more conservati
19480 76 65 20 74 68 61 6e 20 6e 65 63 65 73 73 61 72  ve than necessar
19490 79 2c 20 62 75 74 20 6d 75 63 68 20 65 61 73 69  y, but much easi
194a0 65 72 20 74 68 61 6e 20 65 6e 66 6f 72 63 69 6e  er than enforcin
194b0 67 0a 20 20 20 20 2a 2a 20 61 6e 20 65 78 61 63  g.    ** an exac
194c0 74 20 6c 69 6d 69 74 2e 0a 20 20 20 20 2a 2f 0a  t limit..    */.
194d0 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 48 65 69      pParse->nHei
194e0 67 68 74 20 2b 3d 20 73 71 6c 69 74 65 33 53 65  ght += sqlite3Se
194f0 6c 65 63 74 45 78 70 72 48 65 69 67 68 74 28 70  lectExprHeight(p
19500 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 73 71  );.#endif.    sq
19510 6c 69 74 65 33 53 65 6c 65 63 74 28 70 50 61 72  lite3Select(pPar
19520 73 65 2c 20 70 49 74 65 6d 2d 3e 70 53 65 6c 65  se, pItem->pSele
19530 63 74 2c 20 53 52 54 5f 45 70 68 65 6d 54 61 62  ct, SRT_EphemTab
19540 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  , .             
19550 20 20 20 20 70 49 74 65 6d 2d 3e 69 43 75 72 73      pItem->iCurs
19560 6f 72 2c 20 70 2c 20 69 2c 20 26 69 73 41 67 67  or, p, i, &isAgg
19570 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 64 62  , 0);.    if( db
19580 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
19590 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 73 65 6c  {.      goto sel
195a0 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 7d 0a 23  ect_end;.    }.#
195b0 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  if defined(SQLIT
195c0 45 5f 54 45 53 54 29 20 7c 7c 20 53 51 4c 49 54  E_TEST) || SQLIT
195d0 45 5f 4d 41 58 5f 45 58 50 52 5f 44 45 50 54 48  E_MAX_EXPR_DEPTH
195e0 3e 30 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 6e  >0.    pParse->n
195f0 48 65 69 67 68 74 20 2d 3d 20 73 71 6c 69 74 65  Height -= sqlite
19600 33 53 65 6c 65 63 74 45 78 70 72 48 65 69 67 68  3SelectExprHeigh
19610 74 28 70 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20  t(p);.#endif.   
19620 20 69 66 28 20 6e 65 65 64 52 65 73 74 6f 72 65   if( needRestore
19630 43 6f 6e 74 65 78 74 20 29 7b 0a 20 20 20 20 20  Context ){.     
19640 20 70 50 61 72 73 65 2d 3e 7a 41 75 74 68 43 6f   pParse->zAuthCo
19650 6e 74 65 78 74 20 3d 20 7a 53 61 76 65 64 41 75  ntext = zSavedAu
19660 74 68 43 6f 6e 74 65 78 74 3b 0a 20 20 20 20 7d  thContext;.    }
19670 0a 20 20 20 20 70 54 61 62 4c 69 73 74 20 3d 20  .    pTabList = 
19680 70 2d 3e 70 53 72 63 3b 0a 20 20 20 20 70 57 68  p->pSrc;.    pWh
19690 65 72 65 20 3d 20 70 2d 3e 70 57 68 65 72 65 3b  ere = p->pWhere;
196a0 0a 20 20 20 20 69 66 28 20 21 49 67 6e 6f 72 61  .    if( !Ignora
196b0 62 6c 65 4f 72 64 65 72 62 79 28 65 44 65 73 74  bleOrderby(eDest
196c0 29 20 29 7b 0a 20 20 20 20 20 20 70 4f 72 64 65  ) ){.      pOrde
196d0 72 42 79 20 3d 20 70 2d 3e 70 4f 72 64 65 72 42  rBy = p->pOrderB
196e0 79 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 47 72  y;.    }.    pGr
196f0 6f 75 70 42 79 20 3d 20 70 2d 3e 70 47 72 6f 75  oupBy = p->pGrou
19700 70 42 79 3b 0a 20 20 20 20 70 48 61 76 69 6e 67  pBy;.    pHaving
19710 20 3d 20 70 2d 3e 70 48 61 76 69 6e 67 3b 0a 20   = p->pHaving;. 
19720 20 20 20 69 73 44 69 73 74 69 6e 63 74 20 3d 20     isDistinct = 
19730 70 2d 3e 69 73 44 69 73 74 69 6e 63 74 3b 0a 20  p->isDistinct;. 
19740 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20   }.#endif..  /* 
19750 43 68 65 63 6b 20 66 6f 72 20 74 68 65 20 73 70  Check for the sp
19760 65 63 69 61 6c 20 63 61 73 65 20 6f 66 20 61 20  ecial case of a 
19770 6d 69 6e 28 29 20 6f 72 20 6d 61 78 28 29 20 66  min() or max() f
19780 75 6e 63 74 69 6f 6e 20 62 79 20 69 74 73 65 6c  unction by itsel
19790 66 0a 20 20 2a 2a 20 69 6e 20 74 68 65 20 72 65  f.  ** in the re
197a0 73 75 6c 74 20 73 65 74 2e 0a 20 20 2a 2f 0a 20  sult set..  */. 
197b0 20 69 66 28 20 73 69 6d 70 6c 65 4d 69 6e 4d 61   if( simpleMinMa
197c0 78 51 75 65 72 79 28 70 50 61 72 73 65 2c 20 70  xQuery(pParse, p
197d0 2c 20 65 44 65 73 74 2c 20 69 50 61 72 6d 29 20  , eDest, iParm) 
197e0 29 7b 0a 20 20 20 20 72 63 20 3d 20 30 3b 0a 20  ){.    rc = 0;. 
197f0 20 20 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65     goto select_e
19800 6e 64 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 68  nd;.  }..  /* Ch
19810 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20 74 68  eck to see if th
19820 69 73 20 69 73 20 61 20 73 75 62 71 75 65 72 79  is is a subquery
19830 20 74 68 61 74 20 63 61 6e 20 62 65 20 22 66 6c   that can be "fl
19840 61 74 74 65 6e 65 64 22 20 69 6e 74 6f 20 69 74  attened" into it
19850 73 20 70 61 72 65 6e 74 2e 0a 20 20 2a 2a 20 49  s parent..  ** I
19860 66 20 66 6c 61 74 74 65 6e 69 6e 67 20 69 73 20  f flattening is 
19870 61 20 70 6f 73 73 69 62 6c 69 74 79 2c 20 64 6f  a possiblity, do
19880 20 73 6f 20 61 6e 64 20 72 65 74 75 72 6e 20 69   so and return i
19890 6d 6d 65 64 69 61 74 65 6c 79 2e 20 20 0a 20 20  mmediately.  .  
198a0 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  */.#ifndef SQLIT
198b0 45 5f 4f 4d 49 54 5f 56 49 45 57 0a 20 20 69 66  E_OMIT_VIEW.  if
198c0 28 20 70 50 61 72 65 6e 74 20 26 26 20 70 50 61  ( pParent && pPa
198d0 72 65 6e 74 41 67 67 20 26 26 0a 20 20 20 20 20  rentAgg &&.     
198e0 20 66 6c 61 74 74 65 6e 53 75 62 71 75 65 72 79   flattenSubquery
198f0 28 64 62 2c 20 70 50 61 72 65 6e 74 2c 20 70 61  (db, pParent, pa
19900 72 65 6e 74 54 61 62 2c 20 2a 70 50 61 72 65 6e  rentTab, *pParen
19910 74 41 67 67 2c 20 69 73 41 67 67 29 20 29 7b 0a  tAgg, isAgg) ){.
19920 20 20 20 20 69 66 28 20 69 73 41 67 67 20 29 20      if( isAgg ) 
19930 2a 70 50 61 72 65 6e 74 41 67 67 20 3d 20 31 3b  *pParentAgg = 1;
19940 0a 20 20 20 20 67 6f 74 6f 20 73 65 6c 65 63 74  .    goto select
19950 5f 65 6e 64 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  _end;.  }.#endif
19960 0a 0a 20 20 2f 2a 20 49 66 20 70 6f 73 73 69 62  ..  /* If possib
19970 6c 65 2c 20 72 65 77 72 69 74 65 20 74 68 65 20  le, rewrite the 
19980 71 75 65 72 79 20 74 6f 20 75 73 65 20 47 52 4f  query to use GRO
19990 55 50 20 42 59 20 69 6e 73 74 65 61 64 20 6f 66  UP BY instead of
199a0 20 44 49 53 54 49 4e 43 54 2e 0a 20 20 2a 2a 20   DISTINCT..  ** 
199b0 47 52 4f 55 50 20 42 59 20 6d 61 79 20 75 73 65  GROUP BY may use
199c0 20 61 6e 20 69 6e 64 65 78 2c 20 44 49 53 54 49   an index, DISTI
199d0 4e 43 54 20 6e 65 76 65 72 20 64 6f 65 73 2e 0a  NCT never does..
199e0 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 69 73    */.  if( p->is
199f0 44 69 73 74 69 6e 63 74 20 26 26 20 21 70 2d 3e  Distinct && !p->
19a00 69 73 41 67 67 20 26 26 20 21 70 2d 3e 70 47 72  isAgg && !p->pGr
19a10 6f 75 70 42 79 20 29 7b 0a 20 20 20 20 70 2d 3e  oupBy ){.    p->
19a20 70 47 72 6f 75 70 42 79 20 3d 20 73 71 6c 69 74  pGroupBy = sqlit
19a30 65 33 45 78 70 72 4c 69 73 74 44 75 70 28 64 62  e3ExprListDup(db
19a40 2c 20 70 2d 3e 70 45 4c 69 73 74 29 3b 0a 20 20  , p->pEList);.  
19a50 20 20 70 47 72 6f 75 70 42 79 20 3d 20 70 2d 3e    pGroupBy = p->
19a60 70 47 72 6f 75 70 42 79 3b 0a 20 20 20 20 70 2d  pGroupBy;.    p-
19a70 3e 69 73 44 69 73 74 69 6e 63 74 20 3d 20 30 3b  >isDistinct = 0;
19a80 0a 20 20 20 20 69 73 44 69 73 74 69 6e 63 74 20  .    isDistinct 
19a90 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49  = 0;.  }..  /* I
19aa0 66 20 74 68 65 72 65 20 69 73 20 61 6e 20 4f 52  f there is an OR
19ab0 44 45 52 20 42 59 20 63 6c 61 75 73 65 2c 20 74  DER BY clause, t
19ac0 68 65 6e 20 74 68 69 73 20 73 6f 72 74 69 6e 67  hen this sorting
19ad0 0a 20 20 2a 2a 20 69 6e 64 65 78 20 6d 69 67 68  .  ** index migh
19ae0 74 20 65 6e 64 20 75 70 20 62 65 69 6e 67 20 75  t end up being u
19af0 6e 75 73 65 64 20 69 66 20 74 68 65 20 64 61 74  nused if the dat
19b00 61 20 63 61 6e 20 62 65 20 0a 20 20 2a 2a 20 65  a can be .  ** e
19b10 78 74 72 61 63 74 65 64 20 69 6e 20 70 72 65 2d  xtracted in pre-
19b20 73 6f 72 74 65 64 20 6f 72 64 65 72 2e 20 20 49  sorted order.  I
19b30 66 20 74 68 61 74 20 69 73 20 74 68 65 20 63 61  f that is the ca
19b40 73 65 2c 20 74 68 65 6e 20 74 68 65 0a 20 20 2a  se, then the.  *
19b50 2a 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72  * OP_OpenEphemer
19b60 61 6c 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 77  al instruction w
19b70 69 6c 6c 20 62 65 20 63 68 61 6e 67 65 64 20 74  ill be changed t
19b80 6f 20 61 6e 20 4f 50 5f 4e 6f 6f 70 20 6f 6e 63  o an OP_Noop onc
19b90 65 0a 20 20 2a 2a 20 77 65 20 66 69 67 75 72 65  e.  ** we figure
19ba0 20 6f 75 74 20 74 68 61 74 20 74 68 65 20 73 6f   out that the so
19bb0 72 74 69 6e 67 20 69 6e 64 65 78 20 69 73 20 6e  rting index is n
19bc0 6f 74 20 6e 65 65 64 65 64 2e 20 20 54 68 65 20  ot needed.  The 
19bd0 61 64 64 72 53 6f 72 74 49 6e 64 65 78 0a 20 20  addrSortIndex.  
19be0 2a 2a 20 76 61 72 69 61 62 6c 65 20 69 73 20 75  ** variable is u
19bf0 73 65 64 20 74 6f 20 66 61 63 69 6c 69 74 61 74  sed to facilitat
19c00 65 20 74 68 61 74 20 63 68 61 6e 67 65 2e 0a 20  e that change.. 
19c10 20 2a 2f 0a 20 20 69 66 28 20 70 4f 72 64 65 72   */.  if( pOrder
19c20 42 79 20 29 7b 0a 20 20 20 20 4b 65 79 49 6e 66  By ){.    KeyInf
19c30 6f 20 2a 70 4b 65 79 49 6e 66 6f 3b 0a 20 20 20  o *pKeyInfo;.   
19c40 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 45 72   if( pParse->nEr
19c50 72 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20  r ){.      goto 
19c60 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20  select_end;.    
19c70 7d 0a 20 20 20 20 70 4b 65 79 49 6e 66 6f 20 3d  }.    pKeyInfo =
19c80 20 6b 65 79 49 6e 66 6f 46 72 6f 6d 45 78 70 72   keyInfoFromExpr
19c90 4c 69 73 74 28 70 50 61 72 73 65 2c 20 70 4f 72  List(pParse, pOr
19ca0 64 65 72 42 79 29 3b 0a 20 20 20 20 70 4f 72 64  derBy);.    pOrd
19cb0 65 72 42 79 2d 3e 69 45 43 75 72 73 6f 72 20 3d  erBy->iECursor =
19cc0 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b   pParse->nTab++;
19cd0 0a 20 20 20 20 70 2d 3e 61 64 64 72 4f 70 65 6e  .    p->addrOpen
19ce0 45 70 68 6d 5b 32 5d 20 3d 20 61 64 64 72 53 6f  Ephm[2] = addrSo
19cf0 72 74 49 6e 64 65 78 20 3d 0a 20 20 20 20 20 20  rtIndex =.      
19d00 73 71 6c 69 74 65 33 56 64 62 65 4f 70 33 28 76  sqlite3VdbeOp3(v
19d10 2c 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72  , OP_OpenEphemer
19d20 61 6c 2c 20 70 4f 72 64 65 72 42 79 2d 3e 69 45  al, pOrderBy->iE
19d30 43 75 72 73 6f 72 2c 20 70 4f 72 64 65 72 42 79  Cursor, pOrderBy
19d40 2d 3e 6e 45 78 70 72 2b 32 2c 20 20 20 20 20 20  ->nExpr+2,      
19d50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28                 (
19d60 63 68 61 72 2a 29 70 4b 65 79 49 6e 66 6f 2c 20  char*)pKeyInfo, 
19d70 50 33 5f 4b 45 59 49 4e 46 4f 5f 48 41 4e 44 4f  P3_KEYINFO_HANDO
19d80 46 46 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  FF);.  }else{.  
19d90 20 20 61 64 64 72 53 6f 72 74 49 6e 64 65 78 20    addrSortIndex 
19da0 3d 20 2d 31 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  = -1;.  }..  /* 
19db0 49 66 20 74 68 65 20 6f 75 74 70 75 74 20 69 73  If the output is
19dc0 20 64 65 73 74 69 6e 65 64 20 66 6f 72 20 61 20   destined for a 
19dd0 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 2c  temporary table,
19de0 20 6f 70 65 6e 20 74 68 61 74 20 74 61 62 6c 65   open that table
19df0 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 65 44 65  ..  */.  if( eDe
19e00 73 74 3d 3d 53 52 54 5f 45 70 68 65 6d 54 61 62  st==SRT_EphemTab
19e10 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56   ){.    sqlite3V
19e20 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4f  dbeAddOp(v, OP_O
19e30 70 65 6e 45 70 68 65 6d 65 72 61 6c 2c 20 69 50  penEphemeral, iP
19e40 61 72 6d 2c 20 70 45 4c 69 73 74 2d 3e 6e 45 78  arm, pEList->nEx
19e50 70 72 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53  pr);.  }..  /* S
19e60 65 74 20 74 68 65 20 6c 69 6d 69 74 65 72 2e 0a  et the limiter..
19e70 20 20 2a 2f 0a 20 20 69 45 6e 64 20 3d 20 73 71    */.  iEnd = sq
19e80 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62  lite3VdbeMakeLab
19e90 65 6c 28 76 29 3b 0a 20 20 63 6f 6d 70 75 74 65  el(v);.  compute
19ea0 4c 69 6d 69 74 52 65 67 69 73 74 65 72 73 28 70  LimitRegisters(p
19eb0 50 61 72 73 65 2c 20 70 2c 20 69 45 6e 64 29 3b  Parse, p, iEnd);
19ec0 0a 0a 20 20 2f 2a 20 4f 70 65 6e 20 61 20 76 69  ..  /* Open a vi
19ed0 72 74 75 61 6c 20 69 6e 64 65 78 20 74 6f 20 75  rtual index to u
19ee0 73 65 20 66 6f 72 20 74 68 65 20 64 69 73 74 69  se for the disti
19ef0 6e 63 74 20 73 65 74 2e 0a 20 20 2a 2f 0a 20 20  nct set..  */.  
19f00 69 66 28 20 69 73 44 69 73 74 69 6e 63 74 20 29  if( isDistinct )
19f10 7b 0a 20 20 20 20 4b 65 79 49 6e 66 6f 20 2a 70  {.    KeyInfo *p
19f20 4b 65 79 49 6e 66 6f 3b 0a 20 20 20 20 61 73 73  KeyInfo;.    ass
19f30 65 72 74 28 20 69 73 41 67 67 20 7c 7c 20 70 47  ert( isAgg || pG
19f40 72 6f 75 70 42 79 20 29 3b 0a 20 20 20 20 64 69  roupBy );.    di
19f50 73 74 69 6e 63 74 20 3d 20 70 50 61 72 73 65 2d  stinct = pParse-
19f60 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20 70 4b 65  >nTab++;.    pKe
19f70 79 49 6e 66 6f 20 3d 20 6b 65 79 49 6e 66 6f 46  yInfo = keyInfoF
19f80 72 6f 6d 45 78 70 72 4c 69 73 74 28 70 50 61 72  romExprList(pPar
19f90 73 65 2c 20 70 2d 3e 70 45 4c 69 73 74 29 3b 0a  se, p->pEList);.
19fa0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4f      sqlite3VdbeO
19fb0 70 33 28 76 2c 20 4f 50 5f 4f 70 65 6e 45 70 68  p3(v, OP_OpenEph
19fc0 65 6d 65 72 61 6c 2c 20 64 69 73 74 69 6e 63 74  emeral, distinct
19fd0 2c 20 30 2c 20 0a 20 20 20 20 20 20 20 20 20 20  , 0, .          
19fe0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 63                (c
19ff0 68 61 72 2a 29 70 4b 65 79 49 6e 66 6f 2c 20 50  har*)pKeyInfo, P
1a000 33 5f 4b 45 59 49 4e 46 4f 5f 48 41 4e 44 4f 46  3_KEYINFO_HANDOF
1a010 46 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  F);.  }else{.   
1a020 20 64 69 73 74 69 6e 63 74 20 3d 20 2d 31 3b 0a   distinct = -1;.
1a030 20 20 7d 0a 0a 20 20 2f 2a 20 41 67 67 72 65 67    }..  /* Aggreg
1a040 61 74 65 20 61 6e 64 20 6e 6f 6e 2d 61 67 67 72  ate and non-aggr
1a050 65 67 61 74 65 20 71 75 65 72 69 65 73 20 61 72  egate queries ar
1a060 65 20 68 61 6e 64 6c 65 64 20 64 69 66 66 65 72  e handled differ
1a070 65 6e 74 6c 79 20 2a 2f 0a 20 20 69 66 28 20 21  ently */.  if( !
1a080 69 73 41 67 67 20 26 26 20 70 47 72 6f 75 70 42  isAgg && pGroupB
1a090 79 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20 54  y==0 ){.    /* T
1a0a0 68 69 73 20 63 61 73 65 20 69 73 20 66 6f 72 20  his case is for 
1a0b0 6e 6f 6e 2d 61 67 67 72 65 67 61 74 65 20 71 75  non-aggregate qu
1a0c0 65 72 69 65 73 0a 20 20 20 20 2a 2a 20 42 65 67  eries.    ** Beg
1a0d0 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  in the database 
1a0e0 73 63 61 6e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  scan.    */.    
1a0f0 70 57 49 6e 66 6f 20 3d 20 73 71 6c 69 74 65 33  pWInfo = sqlite3
1a100 57 68 65 72 65 42 65 67 69 6e 28 70 50 61 72 73  WhereBegin(pPars
1a110 65 2c 20 70 54 61 62 4c 69 73 74 2c 20 70 57 68  e, pTabList, pWh
1a120 65 72 65 2c 20 26 70 4f 72 64 65 72 42 79 29 3b  ere, &pOrderBy);
1a130 0a 20 20 20 20 69 66 28 20 70 57 49 6e 66 6f 3d  .    if( pWInfo=
1a140 3d 30 20 29 20 67 6f 74 6f 20 73 65 6c 65 63 74  =0 ) goto select
1a150 5f 65 6e 64 3b 0a 0a 20 20 20 20 2f 2a 20 49 66  _end;..    /* If
1a160 20 73 6f 72 74 69 6e 67 20 69 6e 64 65 78 20 74   sorting index t
1a170 68 61 74 20 77 61 73 20 63 72 65 61 74 65 64 20  hat was created 
1a180 62 79 20 61 20 70 72 69 6f 72 20 4f 50 5f 4f 70  by a prior OP_Op
1a190 65 6e 45 70 68 65 6d 65 72 61 6c 20 0a 20 20 20  enEphemeral .   
1a1a0 20 2a 2a 20 69 6e 73 74 72 75 63 74 69 6f 6e 20   ** instruction 
1a1b0 65 6e 64 65 64 20 75 70 20 6e 6f 74 20 62 65 69  ended up not bei
1a1c0 6e 67 20 6e 65 65 64 65 64 2c 20 74 68 65 6e 20  ng needed, then 
1a1d0 63 68 61 6e 67 65 20 74 68 65 20 4f 50 5f 4f 70  change the OP_Op
1a1e0 65 6e 45 70 68 65 6d 65 72 61 6c 0a 20 20 20 20  enEphemeral.    
1a1f0 2a 2a 20 69 6e 74 6f 20 61 6e 20 4f 50 5f 4e 6f  ** into an OP_No
1a200 6f 70 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  op..    */.    i
1a210 66 28 20 61 64 64 72 53 6f 72 74 49 6e 64 65 78  f( addrSortIndex
1a220 3e 3d 30 20 26 26 20 70 4f 72 64 65 72 42 79 3d  >=0 && pOrderBy=
1a230 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  =0 ){.      sqli
1a240 74 65 33 56 64 62 65 43 68 61 6e 67 65 54 6f 4e  te3VdbeChangeToN
1a250 6f 6f 70 28 76 2c 20 61 64 64 72 53 6f 72 74 49  oop(v, addrSortI
1a260 6e 64 65 78 2c 20 31 29 3b 0a 20 20 20 20 20 20  ndex, 1);.      
1a270 70 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b  p->addrOpenEphm[
1a280 32 5d 20 3d 20 2d 31 3b 0a 20 20 20 20 7d 0a 0a  2] = -1;.    }..
1a290 20 20 20 20 2f 2a 20 55 73 65 20 74 68 65 20 73      /* Use the s
1a2a0 74 61 6e 64 61 72 64 20 69 6e 6e 65 72 20 6c 6f  tandard inner lo
1a2b0 6f 70 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61 73  op.    */.    as
1a2c0 73 65 72 74 28 21 69 73 44 69 73 74 69 6e 63 74  sert(!isDistinct
1a2d0 29 3b 0a 20 20 20 20 69 66 28 20 73 65 6c 65 63  );.    if( selec
1a2e0 74 49 6e 6e 65 72 4c 6f 6f 70 28 70 50 61 72 73  tInnerLoop(pPars
1a2f0 65 2c 20 70 2c 20 70 45 4c 69 73 74 2c 20 30 2c  e, p, pEList, 0,
1a300 20 30 2c 20 70 4f 72 64 65 72 42 79 2c 20 2d 31   0, pOrderBy, -1
1a310 2c 20 65 44 65 73 74 2c 0a 20 20 20 20 20 20 20  , eDest,.       
1a320 20 20 20 20 20 20 20 20 20 20 20 20 20 69 50 61               iPa
1a330 72 6d 2c 20 70 57 49 6e 66 6f 2d 3e 69 43 6f 6e  rm, pWInfo->iCon
1a340 74 69 6e 75 65 2c 20 70 57 49 6e 66 6f 2d 3e 69  tinue, pWInfo->i
1a350 42 72 65 61 6b 2c 20 61 66 66 29 20 29 7b 0a 20  Break, aff) ){. 
1a360 20 20 20 20 20 20 67 6f 74 6f 20 73 65 6c 65 63        goto selec
1a370 74 5f 65 6e 64 3b 0a 20 20 20 20 7d 0a 0a 20 20  t_end;.    }..  
1a380 20 20 2f 2a 20 45 6e 64 20 74 68 65 20 64 61 74    /* End the dat
1a390 61 62 61 73 65 20 73 63 61 6e 20 6c 6f 6f 70 2e  abase scan loop.
1a3a0 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73 71 6c 69  .    */.    sqli
1a3b0 74 65 33 57 68 65 72 65 45 6e 64 28 70 57 49 6e  te3WhereEnd(pWIn
1a3c0 66 6f 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  fo);.  }else{.  
1a3d0 20 20 2f 2a 20 54 68 69 73 20 69 73 20 74 68 65    /* This is the
1a3e0 20 70 72 6f 63 65 73 73 69 6e 67 20 66 6f 72 20   processing for 
1a3f0 61 67 67 72 65 67 61 74 65 20 71 75 65 72 69 65  aggregate querie
1a400 73 20 2a 2f 0a 20 20 20 20 4e 61 6d 65 43 6f 6e  s */.    NameCon
1a410 74 65 78 74 20 73 4e 43 3b 20 20 20 20 2f 2a 20  text sNC;    /* 
1a420 4e 61 6d 65 20 63 6f 6e 74 65 78 74 20 66 6f 72  Name context for
1a430 20 70 72 6f 63 65 73 73 69 6e 67 20 61 67 67 72   processing aggr
1a440 65 67 61 74 65 20 69 6e 66 6f 72 6d 61 74 69 6f  egate informatio
1a450 6e 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 41 4d  n */.    int iAM
1a460 65 6d 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  em;          /* 
1a470 46 69 72 73 74 20 4d 65 6d 20 61 64 64 72 65 73  First Mem addres
1a480 73 20 66 6f 72 20 73 74 6f 72 69 6e 67 20 63 75  s for storing cu
1a490 72 72 65 6e 74 20 47 52 4f 55 50 20 42 59 20 2a  rrent GROUP BY *
1a4a0 2f 0a 20 20 20 20 69 6e 74 20 69 42 4d 65 6d 3b  /.    int iBMem;
1a4b0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72            /* Fir
1a4c0 73 74 20 4d 65 6d 20 61 64 64 72 65 73 73 20 66  st Mem address f
1a4d0 6f 72 20 70 72 65 76 69 6f 75 73 20 47 52 4f 55  or previous GROU
1a4e0 50 20 42 59 20 2a 2f 0a 20 20 20 20 69 6e 74 20  P BY */.    int 
1a4f0 69 55 73 65 46 6c 61 67 3b 20 20 20 20 20 20 20  iUseFlag;       
1a500 2f 2a 20 4d 65 6d 20 61 64 64 72 65 73 73 20 68  /* Mem address h
1a510 6f 6c 64 69 6e 67 20 66 6c 61 67 20 69 6e 64 69  olding flag indi
1a520 63 61 74 69 6e 67 20 74 68 61 74 20 61 74 20 6c  cating that at l
1a530 65 61 73 74 0a 20 20 20 20 20 20 20 20 20 20 20  east.           
1a540 20 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20               ** 
1a550 6f 6e 65 20 72 6f 77 20 6f 66 20 74 68 65 20 69  one row of the i
1a560 6e 70 75 74 20 74 6f 20 74 68 65 20 61 67 67 72  nput to the aggr
1a570 65 67 61 74 6f 72 20 68 61 73 20 62 65 65 6e 0a  egator has been.
1a580 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a590 20 20 20 20 20 20 20 20 2a 2a 20 70 72 6f 63 65          ** proce
1a5a0 73 73 65 64 20 2a 2f 0a 20 20 20 20 69 6e 74 20  ssed */.    int 
1a5b0 69 41 62 6f 72 74 46 6c 61 67 3b 20 20 20 20 20  iAbortFlag;     
1a5c0 2f 2a 20 4d 65 6d 20 61 64 64 72 65 73 73 20 77  /* Mem address w
1a5d0 68 69 63 68 20 63 61 75 73 65 73 20 71 75 65 72  hich causes quer
1a5e0 79 20 61 62 6f 72 74 20 69 66 20 70 6f 73 69 74  y abort if posit
1a5f0 69 76 65 20 2a 2f 0a 20 20 20 20 69 6e 74 20 67  ive */.    int g
1a600 72 6f 75 70 42 79 53 6f 72 74 3b 20 20 20 20 2f  roupBySort;    /
1a610 2a 20 52 6f 77 73 20 63 6f 6d 65 20 66 72 6f 6d  * Rows come from
1a620 20 73 6f 75 72 63 65 20 69 6e 20 47 52 4f 55 50   source in GROUP
1a630 20 42 59 20 6f 72 64 65 72 20 2a 2f 0a 0a 0a 20   BY order */... 
1a640 20 20 20 2f 2a 20 54 68 65 20 66 6f 6c 6c 6f 77     /* The follow
1a650 69 6e 67 20 76 61 72 69 61 62 6c 65 73 20 68 6f  ing variables ho
1a660 6c 64 20 61 64 64 72 65 73 73 65 73 20 6f 72 20  ld addresses or 
1a670 6c 61 62 65 6c 73 20 66 6f 72 20 70 61 72 74 73  labels for parts
1a680 20 6f 66 20 74 68 65 0a 20 20 20 20 2a 2a 20 76   of the.    ** v
1a690 69 72 74 75 61 6c 20 6d 61 63 68 69 6e 65 20 70  irtual machine p
1a6a0 72 6f 67 72 61 6d 20 77 65 20 61 72 65 20 70 75  rogram we are pu
1a6b0 74 74 69 6e 67 20 74 6f 67 65 74 68 65 72 20 2a  tting together *
1a6c0 2f 0a 20 20 20 20 69 6e 74 20 61 64 64 72 4f 75  /.    int addrOu
1a6d0 74 70 75 74 52 6f 77 3b 20 20 20 20 20 20 2f 2a  tputRow;      /*
1a6e0 20 53 74 61 72 74 20 6f 66 20 73 75 62 72 6f 75   Start of subrou
1a6f0 74 69 6e 65 20 74 68 61 74 20 6f 75 74 70 75 74  tine that output
1a700 73 20 61 20 72 65 73 75 6c 74 20 72 6f 77 20 2a  s a result row *
1a710 2f 0a 20 20 20 20 69 6e 74 20 61 64 64 72 53 65  /.    int addrSe
1a720 74 41 62 6f 72 74 3b 20 20 20 20 20 20 20 2f 2a  tAbort;       /*
1a730 20 53 65 74 20 74 68 65 20 61 62 6f 72 74 20 66   Set the abort f
1a740 6c 61 67 20 61 6e 64 20 72 65 74 75 72 6e 20 2a  lag and return *
1a750 2f 0a 20 20 20 20 69 6e 74 20 61 64 64 72 49 6e  /.    int addrIn
1a760 69 74 69 61 6c 69 7a 65 4c 6f 6f 70 3b 20 2f 2a  itializeLoop; /*
1a770 20 53 74 61 72 74 20 6f 66 20 63 6f 64 65 20 74   Start of code t
1a780 68 61 74 20 69 6e 69 74 69 61 6c 69 7a 65 73 20  hat initializes 
1a790 74 68 65 20 69 6e 70 75 74 20 6c 6f 6f 70 20 2a  the input loop *
1a7a0 2f 0a 20 20 20 20 69 6e 74 20 61 64 64 72 54 6f  /.    int addrTo
1a7b0 70 4f 66 4c 6f 6f 70 3b 20 20 20 20 20 20 2f 2a  pOfLoop;      /*
1a7c0 20 54 6f 70 20 6f 66 20 74 68 65 20 69 6e 70 75   Top of the inpu
1a7d0 74 20 6c 6f 6f 70 20 2a 2f 0a 20 20 20 20 69 6e  t loop */.    in
1a7e0 74 20 61 64 64 72 47 72 6f 75 70 42 79 43 68 61  t addrGroupByCha
1a7f0 6e 67 65 3b 20 20 2f 2a 20 43 6f 64 65 20 74 68  nge;  /* Code th
1a800 61 74 20 72 75 6e 73 20 77 68 65 6e 20 61 6e 79  at runs when any
1a810 20 47 52 4f 55 50 20 42 59 20 74 65 72 6d 20 63   GROUP BY term c
1a820 68 61 6e 67 65 73 20 2a 2f 0a 20 20 20 20 69 6e  hanges */.    in
1a830 74 20 61 64 64 72 50 72 6f 63 65 73 73 52 6f 77  t addrProcessRow
1a840 3b 20 20 20 20 20 2f 2a 20 43 6f 64 65 20 74 6f  ;     /* Code to
1a850 20 70 72 6f 63 65 73 73 20 61 20 73 69 6e 67 6c   process a singl
1a860 65 20 69 6e 70 75 74 20 72 6f 77 20 2a 2f 0a 20  e input row */. 
1a870 20 20 20 69 6e 74 20 61 64 64 72 45 6e 64 3b 20     int addrEnd; 
1a880 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 6e             /* En
1a890 64 20 6f 66 20 61 6c 6c 20 70 72 6f 63 65 73 73  d of all process
1a8a0 69 6e 67 20 2a 2f 0a 20 20 20 20 69 6e 74 20 61  ing */.    int a
1a8b0 64 64 72 53 6f 72 74 69 6e 67 49 64 78 3b 20 20  ddrSortingIdx;  
1a8c0 20 20 20 2f 2a 20 54 68 65 20 4f 50 5f 4f 70 65     /* The OP_Ope
1a8d0 6e 45 70 68 65 6d 65 72 61 6c 20 66 6f 72 20 74  nEphemeral for t
1a8e0 68 65 20 73 6f 72 74 69 6e 67 20 69 6e 64 65 78  he sorting index
1a8f0 20 2a 2f 0a 20 20 20 20 69 6e 74 20 61 64 64 72   */.    int addr
1a900 52 65 73 65 74 3b 20 20 20 20 20 20 20 20 20 20  Reset;          
1a910 2f 2a 20 53 75 62 72 6f 75 74 69 6e 65 20 66 6f  /* Subroutine fo
1a920 72 20 72 65 73 65 74 74 69 6e 67 20 74 68 65 20  r resetting the 
1a930 61 63 63 75 6d 75 6c 61 74 6f 72 20 2a 2f 0a 0a  accumulator */..
1a940 20 20 20 20 61 64 64 72 45 6e 64 20 3d 20 73 71      addrEnd = sq
1a950 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62  lite3VdbeMakeLab
1a960 65 6c 28 76 29 3b 0a 0a 20 20 20 20 2f 2a 20 43  el(v);..    /* C
1a970 6f 6e 76 65 72 74 20 54 4b 5f 43 4f 4c 55 4d 4e  onvert TK_COLUMN
1a980 20 6e 6f 64 65 73 20 69 6e 74 6f 20 54 4b 5f 41   nodes into TK_A
1a990 47 47 5f 43 4f 4c 55 4d 4e 20 61 6e 64 20 6d 61  GG_COLUMN and ma
1a9a0 6b 65 20 65 6e 74 72 69 65 73 20 69 6e 0a 20 20  ke entries in.  
1a9b0 20 20 2a 2a 20 73 41 67 67 49 6e 66 6f 20 66 6f    ** sAggInfo fo
1a9c0 72 20 61 6c 6c 20 54 4b 5f 41 47 47 5f 46 55 4e  r all TK_AGG_FUN
1a9d0 43 54 49 4f 4e 20 6e 6f 64 65 73 20 69 6e 20 65  CTION nodes in e
1a9e0 78 70 72 65 73 73 69 6f 6e 73 20 6f 66 20 74 68  xpressions of th
1a9f0 65 0a 20 20 20 20 2a 2a 20 53 45 4c 45 43 54 20  e.    ** SELECT 
1aa00 73 74 61 74 65 6d 65 6e 74 2e 0a 20 20 20 20 2a  statement..    *
1aa10 2f 0a 20 20 20 20 6d 65 6d 73 65 74 28 26 73 4e  /.    memset(&sN
1aa20 43 2c 20 30 2c 20 73 69 7a 65 6f 66 28 73 4e 43  C, 0, sizeof(sNC
1aa30 29 29 3b 0a 20 20 20 20 73 4e 43 2e 70 50 61 72  ));.    sNC.pPar
1aa40 73 65 20 3d 20 70 50 61 72 73 65 3b 0a 20 20 20  se = pParse;.   
1aa50 20 73 4e 43 2e 70 53 72 63 4c 69 73 74 20 3d 20   sNC.pSrcList = 
1aa60 70 54 61 62 4c 69 73 74 3b 0a 20 20 20 20 73 4e  pTabList;.    sN
1aa70 43 2e 70 41 67 67 49 6e 66 6f 20 3d 20 26 73 41  C.pAggInfo = &sA
1aa80 67 67 49 6e 66 6f 3b 0a 20 20 20 20 73 41 67 67  ggInfo;.    sAgg
1aa90 49 6e 66 6f 2e 6e 53 6f 72 74 69 6e 67 43 6f 6c  Info.nSortingCol
1aaa0 75 6d 6e 20 3d 20 70 47 72 6f 75 70 42 79 20 3f  umn = pGroupBy ?
1aab0 20 70 47 72 6f 75 70 42 79 2d 3e 6e 45 78 70 72   pGroupBy->nExpr
1aac0 2b 31 20 3a 20 30 3b 0a 20 20 20 20 73 41 67 67  +1 : 0;.    sAgg
1aad0 49 6e 66 6f 2e 70 47 72 6f 75 70 42 79 20 3d 20  Info.pGroupBy = 
1aae0 70 47 72 6f 75 70 42 79 3b 0a 20 20 20 20 69 66  pGroupBy;.    if
1aaf0 28 20 73 71 6c 69 74 65 33 45 78 70 72 41 6e 61  ( sqlite3ExprAna
1ab00 6c 79 7a 65 41 67 67 4c 69 73 74 28 26 73 4e 43  lyzeAggList(&sNC
1ab10 2c 20 70 45 4c 69 73 74 29 20 29 7b 0a 20 20 20  , pEList) ){.   
1ab20 20 20 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65     goto select_e
1ab30 6e 64 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  nd;.    }.    if
1ab40 28 20 73 71 6c 69 74 65 33 45 78 70 72 41 6e 61  ( sqlite3ExprAna
1ab50 6c 79 7a 65 41 67 67 4c 69 73 74 28 26 73 4e 43  lyzeAggList(&sNC
1ab60 2c 20 70 4f 72 64 65 72 42 79 29 20 29 7b 0a 20  , pOrderBy) ){. 
1ab70 20 20 20 20 20 67 6f 74 6f 20 73 65 6c 65 63 74       goto select
1ab80 5f 65 6e 64 3b 0a 20 20 20 20 7d 0a 20 20 20 20  _end;.    }.    
1ab90 69 66 28 20 70 48 61 76 69 6e 67 20 26 26 20 73  if( pHaving && s
1aba0 71 6c 69 74 65 33 45 78 70 72 41 6e 61 6c 79 7a  qlite3ExprAnalyz
1abb0 65 41 67 67 72 65 67 61 74 65 73 28 26 73 4e 43  eAggregates(&sNC
1abc0 2c 20 70 48 61 76 69 6e 67 29 20 29 7b 0a 20 20  , pHaving) ){.  
1abd0 20 20 20 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f      goto select_
1abe0 65 6e 64 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73  end;.    }.    s
1abf0 41 67 67 49 6e 66 6f 2e 6e 41 63 63 75 6d 75 6c  AggInfo.nAccumul
1ac00 61 74 6f 72 20 3d 20 73 41 67 67 49 6e 66 6f 2e  ator = sAggInfo.
1ac10 6e 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 66 6f 72  nColumn;.    for
1ac20 28 69 3d 30 3b 20 69 3c 73 41 67 67 49 6e 66 6f  (i=0; i<sAggInfo
1ac30 2e 6e 46 75 6e 63 3b 20 69 2b 2b 29 7b 0a 20 20  .nFunc; i++){.  
1ac40 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 45      if( sqlite3E
1ac50 78 70 72 41 6e 61 6c 79 7a 65 41 67 67 4c 69 73  xprAnalyzeAggLis
1ac60 74 28 26 73 4e 43 2c 20 73 41 67 67 49 6e 66 6f  t(&sNC, sAggInfo
1ac70 2e 61 46 75 6e 63 5b 69 5d 2e 70 45 78 70 72 2d  .aFunc[i].pExpr-
1ac80 3e 70 4c 69 73 74 29 20 29 7b 0a 20 20 20 20 20  >pList) ){.     
1ac90 20 20 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65     goto select_e
1aca0 6e 64 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  nd;.      }.    
1acb0 7d 0a 20 20 20 20 69 66 28 20 64 62 2d 3e 6d 61  }.    if( db->ma
1acc0 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20 67 6f 74  llocFailed ) got
1acd0 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 0a 20  o select_end;.. 
1ace0 20 20 20 2f 2a 20 50 72 6f 63 65 73 73 69 6e 67     /* Processing
1acf0 20 66 6f 72 20 61 67 67 72 65 67 61 74 65 73 20   for aggregates 
1ad00 77 69 74 68 20 47 52 4f 55 50 20 42 59 20 69 73  with GROUP BY is
1ad10 20 76 65 72 79 20 64 69 66 66 65 72 65 6e 74 20   very different 
1ad20 61 6e 64 0a 20 20 20 20 2a 2a 20 6d 75 63 68 20  and.    ** much 
1ad30 6d 6f 72 65 20 63 6f 6d 70 6c 65 78 20 74 68 61  more complex tha
1ad40 6e 20 61 67 67 72 65 67 61 74 65 73 20 77 69 74  n aggregates wit
1ad50 68 6f 75 74 20 61 20 47 52 4f 55 50 20 42 59 2e  hout a GROUP BY.
1ad60 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
1ad70 70 47 72 6f 75 70 42 79 20 29 7b 0a 20 20 20 20  pGroupBy ){.    
1ad80 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49    KeyInfo *pKeyI
1ad90 6e 66 6f 3b 20 20 2f 2a 20 4b 65 79 69 6e 67 20  nfo;  /* Keying 
1ada0 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 6f 72 20  information for 
1adb0 74 68 65 20 67 72 6f 75 70 20 62 79 20 63 6c 61  the group by cla
1adc0 75 73 65 20 2a 2f 0a 0a 20 20 20 20 20 20 2f 2a  use */..      /*
1add0 20 43 72 65 61 74 65 20 6c 61 62 65 6c 73 20 74   Create labels t
1ade0 68 61 74 20 77 65 20 77 69 6c 6c 20 62 65 20 6e  hat we will be n
1adf0 65 65 64 69 6e 67 0a 20 20 20 20 20 20 2a 2f 0a  eeding.      */.
1ae00 20 20 20 20 20 0a 20 20 20 20 20 20 61 64 64 72       .      addr
1ae10 49 6e 69 74 69 61 6c 69 7a 65 4c 6f 6f 70 20 3d  InitializeLoop =
1ae20 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65   sqlite3VdbeMake
1ae30 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 20 20  Label(v);.      
1ae40 61 64 64 72 47 72 6f 75 70 42 79 43 68 61 6e 67  addrGroupByChang
1ae50 65 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d  e = sqlite3VdbeM
1ae60 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20  akeLabel(v);.   
1ae70 20 20 20 61 64 64 72 50 72 6f 63 65 73 73 52 6f     addrProcessRo
1ae80 77 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d  w = sqlite3VdbeM
1ae90 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 0a 20 20  akeLabel(v);..  
1aea0 20 20 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20      /* If there 
1aeb0 69 73 20 61 20 47 52 4f 55 50 20 42 59 20 63 6c  is a GROUP BY cl
1aec0 61 75 73 65 20 77 65 20 6d 69 67 68 74 20 6e 65  ause we might ne
1aed0 65 64 20 61 20 73 6f 72 74 69 6e 67 20 69 6e 64  ed a sorting ind
1aee0 65 78 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20 69  ex to.      ** i
1aef0 6d 70 6c 65 6d 65 6e 74 20 69 74 2e 20 20 41 6c  mplement it.  Al
1af00 6c 6f 63 61 74 65 20 74 68 61 74 20 73 6f 72 74  locate that sort
1af10 69 6e 67 20 69 6e 64 65 78 20 6e 6f 77 2e 20 20  ing index now.  
1af20 49 66 20 69 74 20 74 75 72 6e 73 20 6f 75 74 0a  If it turns out.
1af30 20 20 20 20 20 20 2a 2a 20 74 68 61 74 20 77 65        ** that we
1af40 20 64 6f 20 6e 6f 74 20 6e 65 65 64 20 69 74 20   do not need it 
1af50 61 66 74 65 72 20 61 6c 6c 2c 20 74 68 65 20 4f  after all, the O
1af60 70 65 6e 45 70 68 65 6d 65 72 61 6c 20 69 6e 73  penEphemeral ins
1af70 74 72 75 63 74 69 6f 6e 0a 20 20 20 20 20 20 2a  truction.      *
1af80 2a 20 77 69 6c 6c 20 62 65 20 63 6f 6e 76 65 72  * will be conver
1af90 74 65 64 20 69 6e 74 6f 20 61 20 4e 6f 6f 70 2e  ted into a Noop.
1afa0 20 20 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20    .      */.    
1afb0 20 20 73 41 67 67 49 6e 66 6f 2e 73 6f 72 74 69    sAggInfo.sorti
1afc0 6e 67 49 64 78 20 3d 20 70 50 61 72 73 65 2d 3e  ngIdx = pParse->
1afd0 6e 54 61 62 2b 2b 3b 0a 20 20 20 20 20 20 70 4b  nTab++;.      pK
1afe0 65 79 49 6e 66 6f 20 3d 20 6b 65 79 49 6e 66 6f  eyInfo = keyInfo
1aff0 46 72 6f 6d 45 78 70 72 4c 69 73 74 28 70 50 61  FromExprList(pPa
1b000 72 73 65 2c 20 70 47 72 6f 75 70 42 79 29 3b 0a  rse, pGroupBy);.
1b010 20 20 20 20 20 20 61 64 64 72 53 6f 72 74 69 6e        addrSortin
1b020 67 49 64 78 20 3d 0a 20 20 20 20 20 20 20 20 20  gIdx =.         
1b030 20 73 71 6c 69 74 65 33 56 64 62 65 4f 70 33 28   sqlite3VdbeOp3(
1b040 76 2c 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65  v, OP_OpenEpheme
1b050 72 61 6c 2c 20 73 41 67 67 49 6e 66 6f 2e 73 6f  ral, sAggInfo.so
1b060 72 74 69 6e 67 49 64 78 2c 0a 20 20 20 20 20 20  rtingIdx,.      
1b070 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b080 20 20 20 73 41 67 67 49 6e 66 6f 2e 6e 53 6f 72     sAggInfo.nSor
1b090 74 69 6e 67 43 6f 6c 75 6d 6e 2c 0a 20 20 20 20  tingColumn,.    
1b0a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b0b0 20 20 20 20 20 28 63 68 61 72 2a 29 70 4b 65 79       (char*)pKey
1b0c0 49 6e 66 6f 2c 20 50 33 5f 4b 45 59 49 4e 46 4f  Info, P3_KEYINFO
1b0d0 5f 48 41 4e 44 4f 46 46 29 3b 0a 0a 20 20 20 20  _HANDOFF);..    
1b0e0 20 20 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20    /* Initialize 
1b0f0 6d 65 6d 6f 72 79 20 6c 6f 63 61 74 69 6f 6e 73  memory locations
1b100 20 75 73 65 64 20 62 79 20 47 52 4f 55 50 20 42   used by GROUP B
1b110 59 20 61 67 67 72 65 67 61 74 65 20 70 72 6f 63  Y aggregate proc
1b120 65 73 73 69 6e 67 0a 20 20 20 20 20 20 2a 2f 0a  essing.      */.
1b130 20 20 20 20 20 20 69 55 73 65 46 6c 61 67 20 3d        iUseFlag =
1b140 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b 2b 3b   pParse->nMem++;
1b150 0a 20 20 20 20 20 20 69 41 62 6f 72 74 46 6c 61  .      iAbortFla
1b160 67 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d  g = pParse->nMem
1b170 2b 2b 3b 0a 20 20 20 20 20 20 69 41 4d 65 6d 20  ++;.      iAMem 
1b180 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a  = pParse->nMem;.
1b190 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 4d        pParse->nM
1b1a0 65 6d 20 2b 3d 20 70 47 72 6f 75 70 42 79 2d 3e  em += pGroupBy->
1b1b0 6e 45 78 70 72 3b 0a 20 20 20 20 20 20 69 42 4d  nExpr;.      iBM
1b1c0 65 6d 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 65  em = pParse->nMe
1b1d0 6d 3b 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d  m;.      pParse-
1b1e0 3e 6e 4d 65 6d 20 2b 3d 20 70 47 72 6f 75 70 42  >nMem += pGroupB
1b1f0 79 2d 3e 6e 45 78 70 72 3b 0a 20 20 20 20 20 20  y->nExpr;.      
1b200 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
1b210 28 76 2c 20 4f 50 5f 4d 65 6d 49 6e 74 2c 20 30  (v, OP_MemInt, 0
1b220 2c 20 69 41 62 6f 72 74 46 6c 61 67 29 3b 0a 20  , iAbortFlag);. 
1b230 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74       VdbeComment
1b240 28 28 76 2c 20 22 23 20 63 6c 65 61 72 20 61 62  ((v, "# clear ab
1b250 6f 72 74 20 66 6c 61 67 22 29 29 3b 0a 20 20 20  ort flag"));.   
1b260 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
1b270 64 4f 70 28 76 2c 20 4f 50 5f 4d 65 6d 49 6e 74  dOp(v, OP_MemInt
1b280 2c 20 30 2c 20 69 55 73 65 46 6c 61 67 29 3b 0a  , 0, iUseFlag);.
1b290 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e        VdbeCommen
1b2a0 74 28 28 76 2c 20 22 23 20 69 6e 64 69 63 61 74  t((v, "# indicat
1b2b0 65 20 61 63 63 75 6d 75 6c 61 74 6f 72 20 65 6d  e accumulator em
1b2c0 70 74 79 22 29 29 3b 0a 20 20 20 20 20 20 73 71  pty"));.      sq
1b2d0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
1b2e0 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 61 64  , OP_Goto, 0, ad
1b2f0 64 72 49 6e 69 74 69 61 6c 69 7a 65 4c 6f 6f 70  drInitializeLoop
1b300 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 47 65 6e  );..      /* Gen
1b310 65 72 61 74 65 20 61 20 73 75 62 72 6f 75 74 69  erate a subrouti
1b320 6e 65 20 74 68 61 74 20 6f 75 74 70 75 74 73 20  ne that outputs 
1b330 61 20 73 69 6e 67 6c 65 20 72 6f 77 20 6f 66 20  a single row of 
1b340 74 68 65 20 72 65 73 75 6c 74 0a 20 20 20 20 20  the result.     
1b350 20 2a 2a 20 73 65 74 2e 20 20 54 68 69 73 20 73   ** set.  This s
1b360 75 62 72 6f 75 74 69 6e 65 20 66 69 72 73 74 20  ubroutine first 
1b370 6c 6f 6f 6b 73 20 61 74 20 74 68 65 20 69 55 73  looks at the iUs
1b380 65 46 6c 61 67 2e 20 20 49 66 20 69 55 73 65 46  eFlag.  If iUseF
1b390 6c 61 67 0a 20 20 20 20 20 20 2a 2a 20 69 73 20  lag.      ** is 
1b3a0 6c 65 73 73 20 74 68 61 6e 20 6f 72 20 65 71 75  less than or equ
1b3b0 61 6c 20 74 6f 20 7a 65 72 6f 2c 20 74 68 65 20  al to zero, the 
1b3c0 73 75 62 72 6f 75 74 69 6e 65 20 69 73 20 61 20  subroutine is a 
1b3d0 6e 6f 2d 6f 70 2e 20 20 49 66 0a 20 20 20 20 20  no-op.  If.     
1b3e0 20 2a 2a 20 74 68 65 20 70 72 6f 63 65 73 73 69   ** the processi
1b3f0 6e 67 20 63 61 6c 6c 73 20 66 6f 72 20 74 68 65  ng calls for the
1b400 20 71 75 65 72 79 20 74 6f 20 61 62 6f 72 74 2c   query to abort,
1b410 20 74 68 69 73 20 73 75 62 72 6f 75 74 69 6e 65   this subroutine
1b420 0a 20 20 20 20 20 20 2a 2a 20 69 6e 63 72 65 6d  .      ** increm
1b430 65 6e 74 73 20 74 68 65 20 69 41 62 6f 72 74 46  ents the iAbortF
1b440 6c 61 67 20 6d 65 6d 6f 72 79 20 6c 6f 63 61 74  lag memory locat
1b450 69 6f 6e 20 62 65 66 6f 72 65 20 72 65 74 75 72  ion before retur
1b460 6e 69 6e 67 20 69 6e 0a 20 20 20 20 20 20 2a 2a  ning in.      **
1b470 20 6f 72 64 65 72 20 74 6f 20 73 69 67 6e 61 6c   order to signal
1b480 20 74 68 65 20 63 61 6c 6c 65 72 20 74 6f 20 61   the caller to a
1b490 62 6f 72 74 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  bort..      */. 
1b4a0 20 20 20 20 20 61 64 64 72 53 65 74 41 62 6f 72       addrSetAbor
1b4b0 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43  t = sqlite3VdbeC
1b4c0 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 20  urrentAddr(v);. 
1b4d0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
1b4e0 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 65 6d 49  AddOp(v, OP_MemI
1b4f0 6e 74 2c 20 31 2c 20 69 41 62 6f 72 74 46 6c 61  nt, 1, iAbortFla
1b500 67 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f  g);.      VdbeCo
1b510 6d 6d 65 6e 74 28 28 76 2c 20 22 23 20 73 65 74  mment((v, "# set
1b520 20 61 62 6f 72 74 20 66 6c 61 67 22 29 29 3b 0a   abort flag"));.
1b530 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
1b540 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 52 65 74  eAddOp(v, OP_Ret
1b550 75 72 6e 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  urn, 0, 0);.    
1b560 20 20 61 64 64 72 4f 75 74 70 75 74 52 6f 77 20    addrOutputRow 
1b570 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72  = sqlite3VdbeCur
1b580 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 20 20 20  rentAddr(v);.   
1b590 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
1b5a0 64 4f 70 28 76 2c 20 4f 50 5f 49 66 4d 65 6d 50  dOp(v, OP_IfMemP
1b5b0 6f 73 2c 20 69 55 73 65 46 6c 61 67 2c 20 61 64  os, iUseFlag, ad
1b5c0 64 72 4f 75 74 70 75 74 52 6f 77 2b 32 29 3b 0a  drOutputRow+2);.
1b5d0 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e        VdbeCommen
1b5e0 74 28 28 76 2c 20 22 23 20 47 72 6f 75 70 62 79  t((v, "# Groupby
1b5f0 20 72 65 73 75 6c 74 20 67 65 6e 65 72 61 74 6f   result generato
1b600 72 20 65 6e 74 72 79 20 70 6f 69 6e 74 22 29 29  r entry point"))
1b610 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
1b620 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 52  dbeAddOp(v, OP_R
1b630 65 74 75 72 6e 2c 20 30 2c 20 30 29 3b 0a 20 20  eturn, 0, 0);.  
1b640 20 20 20 20 66 69 6e 61 6c 69 7a 65 41 67 67 46      finalizeAggF
1b650 75 6e 63 74 69 6f 6e 73 28 70 50 61 72 73 65 2c  unctions(pParse,
1b660 20 26 73 41 67 67 49 6e 66 6f 29 3b 0a 20 20 20   &sAggInfo);.   
1b670 20 20 20 69 66 28 20 70 48 61 76 69 6e 67 20 29     if( pHaving )
1b680 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
1b690 33 45 78 70 72 49 66 46 61 6c 73 65 28 70 50 61  3ExprIfFalse(pPa
1b6a0 72 73 65 2c 20 70 48 61 76 69 6e 67 2c 20 61 64  rse, pHaving, ad
1b6b0 64 72 4f 75 74 70 75 74 52 6f 77 2b 31 2c 20 31  drOutputRow+1, 1
1b6c0 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
1b6d0 20 72 63 20 3d 20 73 65 6c 65 63 74 49 6e 6e 65   rc = selectInne
1b6e0 72 4c 6f 6f 70 28 70 50 61 72 73 65 2c 20 70 2c  rLoop(pParse, p,
1b6f0 20 70 2d 3e 70 45 4c 69 73 74 2c 20 30 2c 20 30   p->pEList, 0, 0
1b700 2c 20 70 4f 72 64 65 72 42 79 2c 0a 20 20 20 20  , pOrderBy,.    
1b710 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b720 20 20 20 20 20 20 20 64 69 73 74 69 6e 63 74 2c         distinct,
1b730 20 65 44 65 73 74 2c 20 69 50 61 72 6d 2c 20 0a   eDest, iParm, .
1b740 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b750 20 20 20 20 20 20 20 20 20 20 20 61 64 64 72 4f             addrO
1b760 75 74 70 75 74 52 6f 77 2b 31 2c 20 61 64 64 72  utputRow+1, addr
1b770 53 65 74 41 62 6f 72 74 2c 20 61 66 66 29 3b 0a  SetAbort, aff);.
1b780 20 20 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a        if( rc ){.
1b790 20 20 20 20 20 20 20 20 67 6f 74 6f 20 73 65 6c          goto sel
1b7a0 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 20 20 7d  ect_end;.      }
1b7b0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
1b7c0 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 52 65  beAddOp(v, OP_Re
1b7d0 74 75 72 6e 2c 20 30 2c 20 30 29 3b 0a 20 20 20  turn, 0, 0);.   
1b7e0 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28     VdbeComment((
1b7f0 76 2c 20 22 23 20 65 6e 64 20 67 72 6f 75 70 62  v, "# end groupb
1b800 79 20 72 65 73 75 6c 74 20 67 65 6e 65 72 61 74  y result generat
1b810 6f 72 22 29 29 3b 0a 0a 20 20 20 20 20 20 2f 2a  or"));..      /*
1b820 20 47 65 6e 65 72 61 74 65 20 61 20 73 75 62 72   Generate a subr
1b830 6f 75 74 69 6e 65 20 74 68 61 74 20 77 69 6c 6c  outine that will
1b840 20 72 65 73 65 74 20 74 68 65 20 67 72 6f 75 70   reset the group
1b850 2d 62 79 20 61 63 63 75 6d 75 6c 61 74 6f 72 0a  -by accumulator.
1b860 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 61        */.      a
1b870 64 64 72 52 65 73 65 74 20 3d 20 73 71 6c 69 74  ddrReset = sqlit
1b880 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64  e3VdbeCurrentAdd
1b890 72 28 76 29 3b 0a 20 20 20 20 20 20 72 65 73 65  r(v);.      rese
1b8a0 74 41 63 63 75 6d 75 6c 61 74 6f 72 28 70 50 61  tAccumulator(pPa
1b8b0 72 73 65 2c 20 26 73 41 67 67 49 6e 66 6f 29 3b  rse, &sAggInfo);
1b8c0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
1b8d0 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 52 65  beAddOp(v, OP_Re
1b8e0 74 75 72 6e 2c 20 30 2c 20 30 29 3b 0a 0a 20 20  turn, 0, 0);..  
1b8f0 20 20 20 20 2f 2a 20 42 65 67 69 6e 20 61 20 6c      /* Begin a l
1b900 6f 6f 70 20 74 68 61 74 20 77 69 6c 6c 20 65 78  oop that will ex
1b910 74 72 61 63 74 20 61 6c 6c 20 73 6f 75 72 63 65  tract all source
1b920 20 72 6f 77 73 20 69 6e 20 47 52 4f 55 50 20 42   rows in GROUP B
1b930 59 20 6f 72 64 65 72 2e 0a 20 20 20 20 20 20 2a  Y order..      *
1b940 2a 20 54 68 69 73 20 6d 69 67 68 74 20 69 6e 76  * This might inv
1b950 6f 6c 76 65 20 74 77 6f 20 73 65 70 61 72 61 74  olve two separat
1b960 65 20 6c 6f 6f 70 73 20 77 69 74 68 20 61 6e 20  e loops with an 
1b970 4f 50 5f 53 6f 72 74 20 69 6e 20 62 65 74 77 65  OP_Sort in betwe
1b980 65 6e 2c 20 6f 72 0a 20 20 20 20 20 20 2a 2a 20  en, or.      ** 
1b990 69 74 20 6d 69 67 68 74 20 62 65 20 61 20 73 69  it might be a si
1b9a0 6e 67 6c 65 20 6c 6f 6f 70 20 74 68 61 74 20 75  ngle loop that u
1b9b0 73 65 73 20 61 6e 20 69 6e 64 65 78 20 74 6f 20  ses an index to 
1b9c0 65 78 74 72 61 63 74 20 69 6e 66 6f 72 6d 61 74  extract informat
1b9d0 69 6f 6e 0a 20 20 20 20 20 20 2a 2a 20 69 6e 20  ion.      ** in 
1b9e0 74 68 65 20 72 69 67 68 74 20 6f 72 64 65 72 20  the right order 
1b9f0 74 6f 20 62 65 67 69 6e 20 77 69 74 68 2e 0a 20  to begin with.. 
1ba00 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 73 71       */.      sq
1ba10 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65  lite3VdbeResolve
1ba20 4c 61 62 65 6c 28 76 2c 20 61 64 64 72 49 6e 69  Label(v, addrIni
1ba30 74 69 61 6c 69 7a 65 4c 6f 6f 70 29 3b 0a 20 20  tializeLoop);.  
1ba40 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
1ba50 64 64 4f 70 28 76 2c 20 4f 50 5f 47 6f 73 75 62  ddOp(v, OP_Gosub
1ba60 2c 20 30 2c 20 61 64 64 72 52 65 73 65 74 29 3b  , 0, addrReset);
1ba70 0a 20 20 20 20 20 20 70 57 49 6e 66 6f 20 3d 20  .      pWInfo = 
1ba80 73 71 6c 69 74 65 33 57 68 65 72 65 42 65 67 69  sqlite3WhereBegi
1ba90 6e 28 70 50 61 72 73 65 2c 20 70 54 61 62 4c 69  n(pParse, pTabLi
1baa0 73 74 2c 20 70 57 68 65 72 65 2c 20 26 70 47 72  st, pWhere, &pGr
1bab0 6f 75 70 42 79 29 3b 0a 20 20 20 20 20 20 69 66  oupBy);.      if
1bac0 28 20 70 57 49 6e 66 6f 3d 3d 30 20 29 20 67 6f  ( pWInfo==0 ) go
1bad0 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20  to select_end;. 
1bae0 20 20 20 20 20 69 66 28 20 70 47 72 6f 75 70 42       if( pGroupB
1baf0 79 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  y==0 ){.        
1bb00 2f 2a 20 54 68 65 20 6f 70 74 69 6d 69 7a 65 72  /* The optimizer
1bb10 20 69 73 20 61 62 6c 65 20 74 6f 20 64 65 6c 69   is able to deli
1bb20 76 65 72 20 72 6f 77 73 20 69 6e 20 67 72 6f 75  ver rows in grou
1bb30 70 20 62 79 20 6f 72 64 65 72 20 73 6f 0a 20 20  p by order so.  
1bb40 20 20 20 20 20 20 2a 2a 20 77 65 20 64 6f 20 6e        ** we do n
1bb50 6f 74 20 68 61 76 65 20 74 6f 20 73 6f 72 74 2e  ot have to sort.
1bb60 20 20 54 68 65 20 4f 50 5f 4f 70 65 6e 45 70 68    The OP_OpenEph
1bb70 65 6d 65 72 61 6c 20 74 61 62 6c 65 20 77 69 6c  emeral table wil
1bb80 6c 20 62 65 0a 20 20 20 20 20 20 20 20 2a 2a 20  l be.        ** 
1bb90 63 61 6e 63 65 6c 6c 65 64 20 6c 61 74 65 72 20  cancelled later 
1bba0 62 65 63 61 75 73 65 20 77 65 20 73 74 69 6c 6c  because we still
1bbb0 20 6e 65 65 64 20 74 6f 20 75 73 65 20 74 68 65   need to use the
1bbc0 20 70 4b 65 79 49 6e 66 6f 0a 20 20 20 20 20 20   pKeyInfo.      
1bbd0 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 70 47 72    */.        pGr
1bbe0 6f 75 70 42 79 20 3d 20 70 2d 3e 70 47 72 6f 75  oupBy = p->pGrou
1bbf0 70 42 79 3b 0a 20 20 20 20 20 20 20 20 67 72 6f  pBy;.        gro
1bc00 75 70 42 79 53 6f 72 74 20 3d 20 30 3b 0a 20 20  upBySort = 0;.  
1bc10 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1bc20 20 20 20 2f 2a 20 52 6f 77 73 20 61 72 65 20 63     /* Rows are c
1bc30 6f 6d 69 6e 67 20 6f 75 74 20 69 6e 20 75 6e 64  oming out in und
1bc40 65 74 65 72 6d 69 6e 65 64 20 6f 72 64 65 72 2e  etermined order.
1bc50 20 20 57 65 20 68 61 76 65 20 74 6f 20 70 75 73    We have to pus
1bc60 68 0a 20 20 20 20 20 20 20 20 2a 2a 20 65 61 63  h.        ** eac
1bc70 68 20 72 6f 77 20 69 6e 74 6f 20 61 20 73 6f 72  h row into a sor
1bc80 74 69 6e 67 20 69 6e 64 65 78 2c 20 74 65 72 6d  ting index, term
1bc90 69 6e 61 74 65 20 74 68 65 20 66 69 72 73 74 20  inate the first 
1bca0 6c 6f 6f 70 2c 0a 20 20 20 20 20 20 20 20 2a 2a  loop,.        **
1bcb0 20 74 68 65 6e 20 6c 6f 6f 70 20 6f 76 65 72 20   then loop over 
1bcc0 74 68 65 20 73 6f 72 74 69 6e 67 20 69 6e 64 65  the sorting inde
1bcd0 78 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 67 65  x in order to ge
1bce0 74 20 74 68 65 20 6f 75 74 70 75 74 0a 20 20 20  t the output.   
1bcf0 20 20 20 20 20 2a 2a 20 69 6e 20 73 6f 72 74 65       ** in sorte
1bd00 64 20 6f 72 64 65 72 0a 20 20 20 20 20 20 20 20  d order.        
1bd10 2a 2f 0a 20 20 20 20 20 20 20 20 67 72 6f 75 70  */.        group
1bd20 42 79 53 6f 72 74 20 3d 20 31 3b 0a 20 20 20 20  BySort = 1;.    
1bd30 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
1bd40 6f 64 65 45 78 70 72 4c 69 73 74 28 70 50 61 72  odeExprList(pPar
1bd50 73 65 2c 20 70 47 72 6f 75 70 42 79 29 3b 0a 20  se, pGroupBy);. 
1bd60 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
1bd70 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 53 65  beAddOp(v, OP_Se
1bd80 71 75 65 6e 63 65 2c 20 73 41 67 67 49 6e 66 6f  quence, sAggInfo
1bd90 2e 73 6f 72 74 69 6e 67 49 64 78 2c 20 30 29 3b  .sortingIdx, 0);
1bda0 0a 20 20 20 20 20 20 20 20 6a 20 3d 20 70 47 72  .        j = pGr
1bdb0 6f 75 70 42 79 2d 3e 6e 45 78 70 72 2b 31 3b 0a  oupBy->nExpr+1;.
1bdc0 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b          for(i=0;
1bdd0 20 69 3c 73 41 67 67 49 6e 66 6f 2e 6e 43 6f 6c   i<sAggInfo.nCol
1bde0 75 6d 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  umn; i++){.     
1bdf0 20 20 20 20 20 73 74 72 75 63 74 20 41 67 67 49       struct AggI
1be00 6e 66 6f 5f 63 6f 6c 20 2a 70 43 6f 6c 20 3d 20  nfo_col *pCol = 
1be10 26 73 41 67 67 49 6e 66 6f 2e 61 43 6f 6c 5b 69  &sAggInfo.aCol[i
1be20 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  ];.          if(
1be30 20 70 43 6f 6c 2d 3e 69 53 6f 72 74 65 72 43 6f   pCol->iSorterCo
1be40 6c 75 6d 6e 3c 6a 20 29 20 63 6f 6e 74 69 6e 75  lumn<j ) continu
1be50 65 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  e;.          sql
1be60 69 74 65 33 45 78 70 72 43 6f 64 65 47 65 74 43  ite3ExprCodeGetC
1be70 6f 6c 75 6d 6e 28 76 2c 20 70 43 6f 6c 2d 3e 70  olumn(v, pCol->p
1be80 54 61 62 2c 20 70 43 6f 6c 2d 3e 69 43 6f 6c 75  Tab, pCol->iColu
1be90 6d 6e 2c 20 70 43 6f 6c 2d 3e 69 54 61 62 6c 65  mn, pCol->iTable
1bea0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 6a 2b 2b  );.          j++
1beb0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
1bec0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
1bed0 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 61 6b 65 52  ddOp(v, OP_MakeR
1bee0 65 63 6f 72 64 2c 20 6a 2c 20 30 29 3b 0a 20 20  ecord, j, 0);.  
1bef0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
1bf00 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49 64 78  eAddOp(v, OP_Idx
1bf10 49 6e 73 65 72 74 2c 20 73 41 67 67 49 6e 66 6f  Insert, sAggInfo
1bf20 2e 73 6f 72 74 69 6e 67 49 64 78 2c 20 30 29 3b  .sortingIdx, 0);
1bf30 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
1bf40 57 68 65 72 65 45 6e 64 28 70 57 49 6e 66 6f 29  WhereEnd(pWInfo)
1bf50 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
1bf60 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
1bf70 5f 53 6f 72 74 2c 20 73 41 67 67 49 6e 66 6f 2e  _Sort, sAggInfo.
1bf80 73 6f 72 74 69 6e 67 49 64 78 2c 20 61 64 64 72  sortingIdx, addr
1bf90 45 6e 64 29 3b 0a 20 20 20 20 20 20 20 20 56 64  End);.        Vd
1bfa0 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 23  beComment((v, "#
1bfb0 20 47 52 4f 55 50 20 42 59 20 73 6f 72 74 22 29   GROUP BY sort")
1bfc0 29 3b 0a 20 20 20 20 20 20 20 20 73 41 67 67 49  );.        sAggI
1bfd0 6e 66 6f 2e 75 73 65 53 6f 72 74 69 6e 67 49 64  nfo.useSortingId
1bfe0 78 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a 0a  x = 1;.      }..
1bff0 20 20 20 20 20 20 2f 2a 20 45 76 61 6c 75 61 74        /* Evaluat
1c000 65 20 74 68 65 20 63 75 72 72 65 6e 74 20 47 52  e the current GR
1c010 4f 55 50 20 42 59 20 74 65 72 6d 73 20 61 6e 64  OUP BY terms and
1c020 20 73 74 6f 72 65 20 69 6e 20 62 30 2c 20 62 31   store in b0, b1
1c030 2c 20 62 32 2e 2e 2e 0a 20 20 20 20 20 20 2a 2a  , b2....      **
1c040 20 28 62 30 20 69 73 20 6d 65 6d 6f 72 79 20 6c   (b0 is memory l
1c050 6f 63 61 74 69 6f 6e 20 69 42 4d 65 6d 2b 30 2c  ocation iBMem+0,
1c060 20 62 31 20 69 73 20 69 42 4d 65 6d 2b 31 2c 20   b1 is iBMem+1, 
1c070 61 6e 64 20 73 6f 20 66 6f 72 74 68 29 0a 20 20  and so forth).  
1c080 20 20 20 20 2a 2a 20 54 68 65 6e 20 63 6f 6d 70      ** Then comp
1c090 61 72 65 20 74 68 65 20 63 75 72 72 65 6e 74 20  are the current 
1c0a0 47 52 4f 55 50 20 42 59 20 74 65 72 6d 73 20 61  GROUP BY terms a
1c0b0 67 61 69 6e 73 74 20 74 68 65 20 47 52 4f 55 50  gainst the GROUP
1c0c0 20 42 59 20 74 65 72 6d 73 0a 20 20 20 20 20 20   BY terms.      
1c0d0 2a 2a 20 66 72 6f 6d 20 74 68 65 20 70 72 65 76  ** from the prev
1c0e0 69 6f 75 73 20 72 6f 77 20 63 75 72 72 65 6e 74  ious row current
1c0f0 6c 79 20 73 74 6f 72 65 64 20 69 6e 20 61 30 2c  ly stored in a0,
1c100 20 61 31 2c 20 61 32 2e 2e 2e 0a 20 20 20 20 20   a1, a2....     
1c110 20 2a 2f 0a 20 20 20 20 20 20 61 64 64 72 54 6f   */.      addrTo
1c120 70 4f 66 4c 6f 6f 70 20 3d 20 73 71 6c 69 74 65  pOfLoop = sqlite
1c130 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72  3VdbeCurrentAddr
1c140 28 76 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 6a  (v);.      for(j
1c150 3d 30 3b 20 6a 3c 70 47 72 6f 75 70 42 79 2d 3e  =0; j<pGroupBy->
1c160 6e 45 78 70 72 3b 20 6a 2b 2b 29 7b 0a 20 20 20  nExpr; j++){.   
1c170 20 20 20 20 20 69 66 28 20 67 72 6f 75 70 42 79       if( groupBy
1c180 53 6f 72 74 20 29 7b 0a 20 20 20 20 20 20 20 20  Sort ){.        
1c190 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
1c1a0 4f 70 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c  Op(v, OP_Column,
1c1b0 20 73 41 67 67 49 6e 66 6f 2e 73 6f 72 74 69 6e   sAggInfo.sortin
1c1c0 67 49 64 78 2c 20 6a 29 3b 0a 20 20 20 20 20 20  gIdx, j);.      
1c1d0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
1c1e0 20 20 20 73 41 67 67 49 6e 66 6f 2e 64 69 72 65     sAggInfo.dire
1c1f0 63 74 4d 6f 64 65 20 3d 20 31 3b 0a 20 20 20 20  ctMode = 1;.    
1c200 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
1c210 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70 47  rCode(pParse, pG
1c220 72 6f 75 70 42 79 2d 3e 61 5b 6a 5d 2e 70 45 78  roupBy->a[j].pEx
1c230 70 72 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  pr);.        }. 
1c240 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
1c250 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 65  beAddOp(v, OP_Me
1c260 6d 53 74 6f 72 65 2c 20 69 42 4d 65 6d 2b 6a 2c  mStore, iBMem+j,
1c270 20 6a 3c 70 47 72 6f 75 70 42 79 2d 3e 6e 45 78   j<pGroupBy->nEx
1c280 70 72 2d 31 29 3b 0a 20 20 20 20 20 20 7d 0a 20  pr-1);.      }. 
1c290 20 20 20 20 20 66 6f 72 28 6a 3d 70 47 72 6f 75       for(j=pGrou
1c2a0 70 42 79 2d 3e 6e 45 78 70 72 2d 31 3b 20 6a 3e  pBy->nExpr-1; j>
1c2b0 3d 30 3b 20 6a 2d 2d 29 7b 0a 20 20 20 20 20 20  =0; j--){.      
1c2c0 20 20 69 66 28 20 6a 3c 70 47 72 6f 75 70 42 79    if( j<pGroupBy
1c2d0 2d 3e 6e 45 78 70 72 2d 31 20 29 7b 0a 20 20 20  ->nExpr-1 ){.   
1c2e0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
1c2f0 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 65  beAddOp(v, OP_Me
1c300 6d 4c 6f 61 64 2c 20 69 42 4d 65 6d 2b 6a 2c 20  mLoad, iBMem+j, 
1c310 30 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  0);.        }.  
1c320 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
1c330 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 65 6d  eAddOp(v, OP_Mem
1c340 4c 6f 61 64 2c 20 69 41 4d 65 6d 2b 6a 2c 20 30  Load, iAMem+j, 0
1c350 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 6a  );.        if( j
1c360 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ==0 ){.         
1c370 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
1c380 70 28 76 2c 20 4f 50 5f 45 71 2c 20 30 78 32 30  p(v, OP_Eq, 0x20
1c390 30 2c 20 61 64 64 72 50 72 6f 63 65 73 73 52 6f  0, addrProcessRo
1c3a0 77 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  w);.        }els
1c3b0 65 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  e{.          sql
1c3c0 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
1c3d0 20 4f 50 5f 4e 65 2c 20 30 78 32 30 30 2c 20 61   OP_Ne, 0x200, a
1c3e0 64 64 72 47 72 6f 75 70 42 79 43 68 61 6e 67 65  ddrGroupByChange
1c3f0 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
1c400 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
1c410 43 68 61 6e 67 65 50 33 28 76 2c 20 2d 31 2c 20  ChangeP3(v, -1, 
1c420 28 76 6f 69 64 2a 29 70 4b 65 79 49 6e 66 6f 2d  (void*)pKeyInfo-
1c430 3e 61 43 6f 6c 6c 5b 6a 5d 2c 20 50 33 5f 43 4f  >aColl[j], P3_CO
1c440 4c 4c 53 45 51 29 3b 0a 20 20 20 20 20 20 7d 0a  LLSEQ);.      }.
1c450 0a 20 20 20 20 20 20 2f 2a 20 47 65 6e 65 72 61  .      /* Genera
1c460 74 65 20 63 6f 64 65 20 74 68 61 74 20 72 75 6e  te code that run
1c470 73 20 77 68 65 6e 65 76 65 72 20 74 68 65 20 47  s whenever the G
1c480 52 4f 55 50 20 42 59 20 63 68 61 6e 67 65 73 2e  ROUP BY changes.
1c490 0a 20 20 20 20 20 20 2a 2a 20 43 68 61 6e 67 65  .      ** Change
1c4a0 20 69 6e 20 74 68 65 20 47 52 4f 55 50 20 42 59   in the GROUP BY
1c4b0 20 61 72 65 20 64 65 74 65 63 74 65 64 20 62 79   are detected by
1c4c0 20 74 68 65 20 70 72 65 76 69 6f 75 73 20 63 6f   the previous co
1c4d0 64 65 0a 20 20 20 20 20 20 2a 2a 20 62 6c 6f 63  de.      ** bloc
1c4e0 6b 2e 20 20 49 66 20 74 68 65 72 65 20 77 65 72  k.  If there wer
1c4f0 65 20 6e 6f 20 63 68 61 6e 67 65 73 2c 20 74 68  e no changes, th
1c500 69 73 20 62 6c 6f 63 6b 20 69 73 20 73 6b 69 70  is block is skip
1c510 70 65 64 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20  ped..      **.  
1c520 20 20 20 20 2a 2a 20 54 68 69 73 20 63 6f 64 65      ** This code
1c530 20 63 6f 70 69 65 73 20 63 75 72 72 65 6e 74 20   copies current 
1c540 67 72 6f 75 70 20 62 79 20 74 65 72 6d 73 20 69  group by terms i
1c550 6e 20 62 30 2c 62 31 2c 62 32 2c 2e 2e 2e 0a 20  n b0,b1,b2,.... 
1c560 20 20 20 20 20 2a 2a 20 6f 76 65 72 20 74 6f 20       ** over to 
1c570 61 30 2c 61 31 2c 61 32 2e 20 20 49 74 20 74 68  a0,a1,a2.  It th
1c580 65 6e 20 63 61 6c 6c 73 20 74 68 65 20 6f 75 74  en calls the out
1c590 70 75 74 20 73 75 62 72 6f 75 74 69 6e 65 0a 20  put subroutine. 
1c5a0 20 20 20 20 20 2a 2a 20 61 6e 64 20 72 65 73 65       ** and rese
1c5b0 74 73 20 74 68 65 20 61 67 67 72 65 67 61 74 65  ts the aggregate
1c5c0 20 61 63 63 75 6d 75 6c 61 74 6f 72 20 72 65 67   accumulator reg
1c5d0 69 73 74 65 72 73 20 69 6e 20 70 72 65 70 61 72  isters in prepar
1c5e0 61 74 69 6f 6e 0a 20 20 20 20 20 20 2a 2a 20 66  ation.      ** f
1c5f0 6f 72 20 74 68 65 20 6e 65 78 74 20 47 52 4f 55  or the next GROU
1c600 50 20 42 59 20 62 61 74 63 68 2e 0a 20 20 20 20  P BY batch..    
1c610 20 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74    */.      sqlit
1c620 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62  e3VdbeResolveLab
1c630 65 6c 28 76 2c 20 61 64 64 72 47 72 6f 75 70 42  el(v, addrGroupB
1c640 79 43 68 61 6e 67 65 29 3b 0a 20 20 20 20 20 20  yChange);.      
1c650 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 47 72 6f 75  for(j=0; j<pGrou
1c660 70 42 79 2d 3e 6e 45 78 70 72 3b 20 6a 2b 2b 29  pBy->nExpr; j++)
1c670 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
1c680 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
1c690 5f 4d 65 6d 4d 6f 76 65 2c 20 69 41 4d 65 6d 2b  _MemMove, iAMem+
1c6a0 6a 2c 20 69 42 4d 65 6d 2b 6a 29 3b 0a 20 20 20  j, iBMem+j);.   
1c6b0 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74     }.      sqlit
1c6c0 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
1c6d0 50 5f 47 6f 73 75 62 2c 20 30 2c 20 61 64 64 72  P_Gosub, 0, addr
1c6e0 4f 75 74 70 75 74 52 6f 77 29 3b 0a 20 20 20 20  OutputRow);.    
1c6f0 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76    VdbeComment((v
1c700 2c 20 22 23 20 6f 75 74 70 75 74 20 6f 6e 65 20  , "# output one 
1c710 72 6f 77 22 29 29 3b 0a 20 20 20 20 20 20 73 71  row"));.      sq
1c720 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
1c730 2c 20 4f 50 5f 49 66 4d 65 6d 50 6f 73 2c 20 69  , OP_IfMemPos, i
1c740 41 62 6f 72 74 46 6c 61 67 2c 20 61 64 64 72 45  AbortFlag, addrE
1c750 6e 64 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43  nd);.      VdbeC
1c760 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 23 20 63 68  omment((v, "# ch
1c770 65 63 6b 20 61 62 6f 72 74 20 66 6c 61 67 22 29  eck abort flag")
1c780 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
1c790 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
1c7a0 47 6f 73 75 62 2c 20 30 2c 20 61 64 64 72 52 65  Gosub, 0, addrRe
1c7b0 73 65 74 29 3b 0a 20 20 20 20 20 20 56 64 62 65  set);.      Vdbe
1c7c0 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 23 20 72  Comment((v, "# r
1c7d0 65 73 65 74 20 61 63 63 75 6d 75 6c 61 74 6f 72  eset accumulator
1c7e0 22 29 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 55  "));..      /* U
1c7f0 70 64 61 74 65 20 74 68 65 20 61 67 67 72 65 67  pdate the aggreg
1c800 61 74 65 20 61 63 63 75 6d 75 6c 61 74 6f 72 73  ate accumulators
1c810 20 62 61 73 65 64 20 6f 6e 20 74 68 65 20 63 6f   based on the co
1c820 6e 74 65 6e 74 20 6f 66 0a 20 20 20 20 20 20 2a  ntent of.      *
1c830 2a 20 74 68 65 20 63 75 72 72 65 6e 74 20 72 6f  * the current ro
1c840 77 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  w.      */.     
1c850 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f   sqlite3VdbeReso
1c860 6c 76 65 4c 61 62 65 6c 28 76 2c 20 61 64 64 72  lveLabel(v, addr
1c870 50 72 6f 63 65 73 73 52 6f 77 29 3b 0a 20 20 20  ProcessRow);.   
1c880 20 20 20 75 70 64 61 74 65 41 63 63 75 6d 75 6c     updateAccumul
1c890 61 74 6f 72 28 70 50 61 72 73 65 2c 20 26 73 41  ator(pParse, &sA
1c8a0 67 67 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20 73  ggInfo);.      s
1c8b0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
1c8c0 76 2c 20 4f 50 5f 4d 65 6d 49 6e 74 2c 20 31 2c  v, OP_MemInt, 1,
1c8d0 20 69 55 73 65 46 6c 61 67 29 3b 0a 20 20 20 20   iUseFlag);.    
1c8e0 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76    VdbeComment((v
1c8f0 2c 20 22 23 20 69 6e 64 69 63 61 74 65 20 64 61  , "# indicate da
1c900 74 61 20 69 6e 20 61 63 63 75 6d 75 6c 61 74 6f  ta in accumulato
1c910 72 22 29 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20  r"));..      /* 
1c920 45 6e 64 20 6f 66 20 74 68 65 20 6c 6f 6f 70 0a  End of the loop.
1c930 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69        */.      i
1c940 66 28 20 67 72 6f 75 70 42 79 53 6f 72 74 20 29  f( groupBySort )
1c950 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
1c960 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
1c970 5f 4e 65 78 74 2c 20 73 41 67 67 49 6e 66 6f 2e  _Next, sAggInfo.
1c980 73 6f 72 74 69 6e 67 49 64 78 2c 20 61 64 64 72  sortingIdx, addr
1c990 54 6f 70 4f 66 4c 6f 6f 70 29 3b 0a 20 20 20 20  TopOfLoop);.    
1c9a0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
1c9b0 20 73 71 6c 69 74 65 33 57 68 65 72 65 45 6e 64   sqlite3WhereEnd
1c9c0 28 70 57 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20  (pWInfo);.      
1c9d0 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61    sqlite3VdbeCha
1c9e0 6e 67 65 54 6f 4e 6f 6f 70 28 76 2c 20 61 64 64  ngeToNoop(v, add
1c9f0 72 53 6f 72 74 69 6e 67 49 64 78 2c 20 31 29 3b  rSortingIdx, 1);
1ca00 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20  .      }..      
1ca10 2f 2a 20 4f 75 74 70 75 74 20 74 68 65 20 66 69  /* Output the fi
1ca20 6e 61 6c 20 72 6f 77 20 6f 66 20 72 65 73 75 6c  nal row of resul
1ca30 74 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  t.      */.     
1ca40 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
1ca50 70 28 76 2c 20 4f 50 5f 47 6f 73 75 62 2c 20 30  p(v, OP_Gosub, 0
1ca60 2c 20 61 64 64 72 4f 75 74 70 75 74 52 6f 77 29  , addrOutputRow)
1ca70 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d  ;.      VdbeComm
1ca80 65 6e 74 28 28 76 2c 20 22 23 20 6f 75 74 70 75  ent((v, "# outpu
1ca90 74 20 66 69 6e 61 6c 20 72 6f 77 22 29 29 3b 0a  t final row"));.
1caa0 20 20 20 20 20 20 0a 20 20 20 20 7d 20 2f 2a 20        .    } /* 
1cab0 65 6e 64 69 66 20 70 47 72 6f 75 70 42 79 20 2a  endif pGroupBy *
1cac0 2f 0a 20 20 20 20 65 6c 73 65 20 7b 0a 20 20 20  /.    else {.   
1cad0 20 20 20 2f 2a 20 54 68 69 73 20 63 61 73 65 20     /* This case 
1cae0 72 75 6e 73 20 69 66 20 74 68 65 20 61 67 67 72  runs if the aggr
1caf0 65 67 61 74 65 20 68 61 73 20 6e 6f 20 47 52 4f  egate has no GRO
1cb00 55 50 20 42 59 20 63 6c 61 75 73 65 2e 20 20 54  UP BY clause.  T
1cb10 68 65 0a 20 20 20 20 20 20 2a 2a 20 70 72 6f 63  he.      ** proc
1cb20 65 73 73 69 6e 67 20 69 73 20 6d 75 63 68 20 73  essing is much s
1cb30 69 6d 70 6c 65 72 20 73 69 6e 63 65 20 74 68 65  impler since the
1cb40 72 65 20 69 73 20 6f 6e 6c 79 20 61 20 73 69 6e  re is only a sin
1cb50 67 6c 65 20 72 6f 77 0a 20 20 20 20 20 20 2a 2a  gle row.      **
1cb60 20 6f 66 20 6f 75 74 70 75 74 2e 0a 20 20 20 20   of output..    
1cb70 20 20 2a 2f 0a 20 20 20 20 20 20 72 65 73 65 74    */.      reset
1cb80 41 63 63 75 6d 75 6c 61 74 6f 72 28 70 50 61 72  Accumulator(pPar
1cb90 73 65 2c 20 26 73 41 67 67 49 6e 66 6f 29 3b 0a  se, &sAggInfo);.
1cba0 20 20 20 20 20 20 70 57 49 6e 66 6f 20 3d 20 73        pWInfo = s
1cbb0 71 6c 69 74 65 33 57 68 65 72 65 42 65 67 69 6e  qlite3WhereBegin
1cbc0 28 70 50 61 72 73 65 2c 20 70 54 61 62 4c 69 73  (pParse, pTabLis
1cbd0 74 2c 20 70 57 68 65 72 65 2c 20 30 29 3b 0a 20  t, pWhere, 0);. 
1cbe0 20 20 20 20 20 69 66 28 20 70 57 49 6e 66 6f 3d       if( pWInfo=
1cbf0 3d 30 20 29 20 67 6f 74 6f 20 73 65 6c 65 63 74  =0 ) goto select
1cc00 5f 65 6e 64 3b 0a 20 20 20 20 20 20 75 70 64 61  _end;.      upda
1cc10 74 65 41 63 63 75 6d 75 6c 61 74 6f 72 28 70 50  teAccumulator(pP
1cc20 61 72 73 65 2c 20 26 73 41 67 67 49 6e 66 6f 29  arse, &sAggInfo)
1cc30 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 57  ;.      sqlite3W
1cc40 68 65 72 65 45 6e 64 28 70 57 49 6e 66 6f 29 3b  hereEnd(pWInfo);
1cc50 0a 20 20 20 20 20 20 66 69 6e 61 6c 69 7a 65 41  .      finalizeA
1cc60 67 67 46 75 6e 63 74 69 6f 6e 73 28 70 50 61 72  ggFunctions(pPar
1cc70 73 65 2c 20 26 73 41 67 67 49 6e 66 6f 29 3b 0a  se, &sAggInfo);.
1cc80 20 20 20 20 20 20 70 4f 72 64 65 72 42 79 20 3d        pOrderBy =
1cc90 20 30 3b 0a 20 20 20 20 20 20 69 66 28 20 70 48   0;.      if( pH
1cca0 61 76 69 6e 67 20 29 7b 0a 20 20 20 20 20 20 20  aving ){.       
1ccb0 20 73 71 6c 69 74 65 33 45 78 70 72 49 66 46 61   sqlite3ExprIfFa
1ccc0 6c 73 65 28 70 50 61 72 73 65 2c 20 70 48 61 76  lse(pParse, pHav
1ccd0 69 6e 67 2c 20 61 64 64 72 45 6e 64 2c 20 31 29  ing, addrEnd, 1)
1cce0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
1ccf0 73 65 6c 65 63 74 49 6e 6e 65 72 4c 6f 6f 70 28  selectInnerLoop(
1cd00 70 50 61 72 73 65 2c 20 70 2c 20 70 2d 3e 70 45  pParse, p, p->pE
1cd10 4c 69 73 74 2c 20 30 2c 20 30 2c 20 30 2c 20 2d  List, 0, 0, 0, -
1cd20 31 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  1, .            
1cd30 20 20 20 20 20 20 20 20 20 20 65 44 65 73 74 2c            eDest,
1cd40 20 69 50 61 72 6d 2c 20 61 64 64 72 45 6e 64 2c   iParm, addrEnd,
1cd50 20 61 64 64 72 45 6e 64 2c 20 61 66 66 29 3b 0a   addrEnd, aff);.
1cd60 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
1cd70 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65  3VdbeResolveLabe
1cd80 6c 28 76 2c 20 61 64 64 72 45 6e 64 29 3b 0a 20  l(v, addrEnd);. 
1cd90 20 20 20 0a 20 20 7d 20 2f 2a 20 65 6e 64 69 66     .  } /* endif
1cda0 20 61 67 67 72 65 67 61 74 65 20 71 75 65 72 79   aggregate query
1cdb0 20 2a 2f 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65   */..  /* If the
1cdc0 72 65 20 69 73 20 61 6e 20 4f 52 44 45 52 20 42  re is an ORDER B
1cdd0 59 20 63 6c 61 75 73 65 2c 20 74 68 65 6e 20 77  Y clause, then w
1cde0 65 20 6e 65 65 64 20 74 6f 20 73 6f 72 74 20 74  e need to sort t
1cdf0 68 65 20 72 65 73 75 6c 74 73 0a 20 20 2a 2a 20  he results.  ** 
1ce00 61 6e 64 20 73 65 6e 64 20 74 68 65 6d 20 74 6f  and send them to
1ce10 20 74 68 65 20 63 61 6c 6c 62 61 63 6b 20 6f 6e   the callback on
1ce20 65 20 62 79 20 6f 6e 65 2e 0a 20 20 2a 2f 0a 20  e by one..  */. 
1ce30 20 69 66 28 20 70 4f 72 64 65 72 42 79 20 29 7b   if( pOrderBy ){
1ce40 0a 20 20 20 20 67 65 6e 65 72 61 74 65 53 6f 72  .    generateSor
1ce50 74 54 61 69 6c 28 70 50 61 72 73 65 2c 20 70 2c  tTail(pParse, p,
1ce60 20 76 2c 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70   v, pEList->nExp
1ce70 72 2c 20 65 44 65 73 74 2c 20 69 50 61 72 6d 29  r, eDest, iParm)
1ce80 3b 0a 20 20 7d 0a 0a 23 69 66 6e 64 65 66 20 53  ;.  }..#ifndef S
1ce90 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55  QLITE_OMIT_SUBQU
1cea0 45 52 59 0a 20 20 2f 2a 20 49 66 20 74 68 69 73  ERY.  /* If this
1ceb0 20 77 61 73 20 61 20 73 75 62 71 75 65 72 79 2c   was a subquery,
1cec0 20 77 65 20 68 61 76 65 20 6e 6f 77 20 63 6f 6e   we have now con
1ced0 76 65 72 74 65 64 20 74 68 65 20 73 75 62 71 75  verted the subqu
1cee0 65 72 79 20 69 6e 74 6f 20 61 0a 20 20 2a 2a 20  ery into a.  ** 
1cef0 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 2e  temporary table.
1cf00 20 20 53 6f 20 73 65 74 20 74 68 65 20 53 72 63    So set the Src
1cf10 4c 69 73 74 5f 69 74 65 6d 2e 69 73 50 6f 70 75  List_item.isPopu
1cf20 6c 61 74 65 64 20 66 6c 61 67 20 74 6f 20 70 72  lated flag to pr
1cf30 65 76 65 6e 74 0a 20 20 2a 2a 20 74 68 69 73 20  event.  ** this 
1cf40 73 75 62 71 75 65 72 79 20 66 72 6f 6d 20 62 65  subquery from be
1cf50 69 6e 67 20 65 76 61 6c 75 61 74 65 64 20 61 67  ing evaluated ag
1cf60 61 69 6e 20 61 6e 64 20 74 6f 20 66 6f 72 63 65  ain and to force
1cf70 20 74 68 65 20 75 73 65 20 6f 66 0a 20 20 2a 2a   the use of.  **
1cf80 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79 20 74   the temporary t
1cf90 61 62 6c 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  able..  */.  if(
1cfa0 20 70 50 61 72 65 6e 74 20 29 7b 0a 20 20 20 20   pParent ){.    
1cfb0 61 73 73 65 72 74 28 20 70 50 61 72 65 6e 74 2d  assert( pParent-
1cfc0 3e 70 53 72 63 2d 3e 6e 53 72 63 3e 70 61 72 65  >pSrc->nSrc>pare
1cfd0 6e 74 54 61 62 20 29 3b 0a 20 20 20 20 61 73 73  ntTab );.    ass
1cfe0 65 72 74 28 20 70 50 61 72 65 6e 74 2d 3e 70 53  ert( pParent->pS
1cff0 72 63 2d 3e 61 5b 70 61 72 65 6e 74 54 61 62 5d  rc->a[parentTab]
1d000 2e 70 53 65 6c 65 63 74 3d 3d 70 20 29 3b 0a 20  .pSelect==p );. 
1d010 20 20 20 70 50 61 72 65 6e 74 2d 3e 70 53 72 63     pParent->pSrc
1d020 2d 3e 61 5b 70 61 72 65 6e 74 54 61 62 5d 2e 69  ->a[parentTab].i
1d030 73 50 6f 70 75 6c 61 74 65 64 20 3d 20 31 3b 0a  sPopulated = 1;.
1d040 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a    }.#endif..  /*
1d050 20 4a 75 6d 70 20 68 65 72 65 20 74 6f 20 73 6b   Jump here to sk
1d060 69 70 20 74 68 69 73 20 71 75 65 72 79 0a 20 20  ip this query.  
1d070 2a 2f 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  */.  sqlite3Vdbe
1d080 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20  ResolveLabel(v, 
1d090 69 45 6e 64 29 3b 0a 0a 20 20 2f 2a 20 54 68 65  iEnd);..  /* The
1d0a0 20 53 45 4c 45 43 54 20 77 61 73 20 73 75 63 63   SELECT was succ
1d0b0 65 73 73 66 75 6c 6c 79 20 63 6f 64 65 64 2e 20  essfully coded. 
1d0c0 20 20 53 65 74 20 74 68 65 20 72 65 74 75 72 6e    Set the return
1d0d0 20 63 6f 64 65 20 74 6f 20 30 0a 20 20 2a 2a 20   code to 0.  ** 
1d0e0 74 6f 20 69 6e 64 69 63 61 74 65 20 6e 6f 20 65  to indicate no e
1d0f0 72 72 6f 72 73 2e 0a 20 20 2a 2f 0a 20 20 72 63  rrors..  */.  rc
1d100 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20 43 6f 6e 74   = 0;..  /* Cont
1d110 72 6f 6c 20 6a 75 6d 70 73 20 74 6f 20 68 65 72  rol jumps to her
1d120 65 20 69 66 20 61 6e 20 65 72 72 6f 72 20 69 73  e if an error is
1d130 20 65 6e 63 6f 75 6e 74 65 72 65 64 20 61 62 6f   encountered abo
1d140 76 65 2c 20 6f 72 20 75 70 6f 6e 0a 20 20 2a 2a  ve, or upon.  **
1d150 20 73 75 63 63 65 73 73 66 75 6c 20 63 6f 64 69   successful codi
1d160 6e 67 20 6f 66 20 74 68 65 20 53 45 4c 45 43 54  ng of the SELECT
1d170 2e 0a 20 20 2a 2f 0a 73 65 6c 65 63 74 5f 65 6e  ..  */.select_en
1d180 64 3a 0a 0a 20 20 2f 2a 20 49 64 65 6e 74 69 66  d:..  /* Identif
1d190 79 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 69  y column names i
1d1a0 66 20 77 65 20 77 69 6c 6c 20 62 65 20 75 73 69  f we will be usi
1d1b0 6e 67 20 74 68 65 6d 20 69 6e 20 61 20 63 61 6c  ng them in a cal
1d1c0 6c 62 61 63 6b 2e 20 20 54 68 69 73 0a 20 20 2a  lback.  This.  *
1d1d0 2a 20 73 74 65 70 20 69 73 20 73 6b 69 70 70 65  * step is skippe
1d1e0 64 20 69 66 20 74 68 65 20 6f 75 74 70 75 74 20  d if the output 
1d1f0 69 73 20 67 6f 69 6e 67 20 74 6f 20 73 6f 6d 65  is going to some
1d200 20 6f 74 68 65 72 20 64 65 73 74 69 6e 61 74 69   other destinati
1d210 6f 6e 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 72  on..  */.  if( r
1d220 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
1d230 65 44 65 73 74 3d 3d 53 52 54 5f 43 61 6c 6c 62  eDest==SRT_Callb
1d240 61 63 6b 20 29 7b 0a 20 20 20 20 67 65 6e 65 72  ack ){.    gener
1d250 61 74 65 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 70  ateColumnNames(p
1d260 50 61 72 73 65 2c 20 70 54 61 62 4c 69 73 74 2c  Parse, pTabList,
1d270 20 70 45 4c 69 73 74 29 3b 0a 20 20 7d 0a 0a 20   pEList);.  }.. 
1d280 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 73 41   sqlite3_free(sA
1d290 67 67 49 6e 66 6f 2e 61 43 6f 6c 29 3b 0a 20 20  ggInfo.aCol);.  
1d2a0 73 71 6c 69 74 65 33 5f 66 72 65 65 28 73 41 67  sqlite3_free(sAg
1d2b0 67 49 6e 66 6f 2e 61 46 75 6e 63 29 3b 0a 20 20  gInfo.aFunc);.  
1d2c0 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69  return rc;.}..#i
1d2d0 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45  f defined(SQLITE
1d2e0 5f 44 45 42 55 47 29 0a 2f 2a 0a 2a 2a 2a 2a 2a  _DEBUG)./*.*****
1d2f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1d300 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1d310 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1d320 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1d330 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68  **********.** Th
1d340 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 6f 64 65  e following code
1d350 20 69 73 20 75 73 65 64 20 66 6f 72 20 74 65 73   is used for tes
1d360 74 69 6e 67 20 61 6e 64 20 64 65 62 75 67 67 69  ting and debuggi
1d370 6e 67 20 6f 6e 6c 79 2e 20 20 54 68 65 20 63 6f  ng only.  The co
1d380 64 65 0a 2a 2a 20 74 68 61 74 20 66 6f 6c 6c 6f  de.** that follo
1d390 77 73 20 64 6f 65 73 20 6e 6f 74 20 61 70 70 65  ws does not appe
1d3a0 61 72 20 69 6e 20 6e 6f 72 6d 61 6c 20 62 75 69  ar in normal bui
1d3b0 6c 64 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 73 65  lds..**.** These
1d3c0 20 72 6f 75 74 69 6e 65 73 20 61 72 65 20 75 73   routines are us
1d3d0 65 64 20 74 6f 20 70 72 69 6e 74 20 6f 75 74 20  ed to print out 
1d3e0 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 61  the content of a
1d3f0 6c 6c 20 6f 72 20 70 61 72 74 20 6f 66 20 61 20  ll or part of a 
1d400 0a 2a 2a 20 70 61 72 73 65 20 73 74 72 75 63 74  .** parse struct
1d410 75 72 65 73 20 73 75 63 68 20 61 73 20 53 65 6c  ures such as Sel
1d420 65 63 74 20 6f 72 20 45 78 70 72 2e 20 20 53 75  ect or Expr.  Su
1d430 63 68 20 70 72 69 6e 74 6f 75 74 73 20 61 72 65  ch printouts are
1d440 20 75 73 65 66 75 6c 0a 2a 2a 20 66 6f 72 20 68   useful.** for h
1d450 65 6c 70 69 6e 67 20 74 6f 20 75 6e 64 65 72 73  elping to unders
1d460 74 61 6e 64 20 77 68 61 74 20 69 73 20 68 61 70  tand what is hap
1d470 70 65 6e 69 6e 67 20 69 6e 73 69 64 65 20 74 68  pening inside th
1d480 65 20 63 6f 64 65 20 67 65 6e 65 72 61 74 6f 72  e code generator
1d490 0a 2a 2a 20 64 75 72 69 6e 67 20 74 68 65 20 65  .** during the e
1d4a0 78 65 63 75 74 69 6f 6e 20 6f 66 20 63 6f 6d 70  xecution of comp
1d4b0 6c 65 78 20 53 45 4c 45 43 54 20 73 74 61 74 65  lex SELECT state
1d4c0 6d 65 6e 74 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  ments..**.** The
1d4d0 73 65 20 72 6f 75 74 69 6e 65 20 61 72 65 20 6e  se routine are n
1d4e0 6f 74 20 63 61 6c 6c 65 64 20 61 6e 79 77 68 65  ot called anywhe
1d4f0 72 65 20 66 72 6f 6d 20 77 69 74 68 69 6e 20 74  re from within t
1d500 68 65 20 6e 6f 72 6d 61 6c 0a 2a 2a 20 63 6f 64  he normal.** cod
1d510 65 20 62 61 73 65 2e 20 20 54 68 65 6e 20 61 72  e base.  Then ar
1d520 65 20 69 6e 74 65 6e 64 65 64 20 74 6f 20 62 65  e intended to be
1d530 20 63 61 6c 6c 65 64 20 66 72 6f 6d 20 77 69 74   called from wit
1d540 68 69 6e 20 74 68 65 20 64 65 62 75 67 67 65 72  hin the debugger
1d550 0a 2a 2a 20 6f 72 20 66 72 6f 6d 20 74 65 6d 70  .** or from temp
1d560 6f 72 61 72 79 20 22 70 72 69 6e 74 66 22 20 73  orary "printf" s
1d570 74 61 74 65 6d 65 6e 74 73 20 69 6e 73 65 72 74  tatements insert
1d580 65 64 20 66 6f 72 20 64 65 62 75 67 67 69 6e 67  ed for debugging
1d590 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
1d5a0 33 50 72 69 6e 74 45 78 70 72 28 45 78 70 72 20  3PrintExpr(Expr 
1d5b0 2a 70 29 7b 0a 20 20 69 66 28 20 70 2d 3e 74 6f  *p){.  if( p->to
1d5c0 6b 65 6e 2e 7a 20 26 26 20 70 2d 3e 74 6f 6b 65  ken.z && p->toke
1d5d0 6e 2e 6e 3e 30 20 29 7b 0a 20 20 20 20 73 71 6c  n.n>0 ){.    sql
1d5e0 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28  ite3DebugPrintf(
1d5f0 22 28 25 2e 2a 73 22 2c 20 70 2d 3e 74 6f 6b 65  "(%.*s", p->toke
1d600 6e 2e 6e 2c 20 70 2d 3e 74 6f 6b 65 6e 2e 7a 29  n.n, p->token.z)
1d610 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73  ;.  }else{.    s
1d620 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74  qlite3DebugPrint
1d630 66 28 22 28 25 64 22 2c 20 70 2d 3e 6f 70 29 3b  f("(%d", p->op);
1d640 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e 70 4c  .  }.  if( p->pL
1d650 65 66 74 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  eft ){.    sqlit
1d660 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 20  e3DebugPrintf(" 
1d670 22 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 50  ");.    sqlite3P
1d680 72 69 6e 74 45 78 70 72 28 70 2d 3e 70 4c 65 66  rintExpr(p->pLef
1d690 74 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d  t);.  }.  if( p-
1d6a0 3e 70 52 69 67 68 74 20 29 7b 0a 20 20 20 20 73  >pRight ){.    s
1d6b0 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74  qlite3DebugPrint
1d6c0 66 28 22 20 22 29 3b 0a 20 20 20 20 73 71 6c 69  f(" ");.    sqli
1d6d0 74 65 33 50 72 69 6e 74 45 78 70 72 28 70 2d 3e  te3PrintExpr(p->
1d6e0 70 52 69 67 68 74 29 3b 0a 20 20 7d 0a 20 20 73  pRight);.  }.  s
1d6f0 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74  qlite3DebugPrint
1d700 66 28 22 29 22 29 3b 0a 7d 0a 76 6f 69 64 20 73  f(")");.}.void s
1d710 71 6c 69 74 65 33 50 72 69 6e 74 45 78 70 72 4c  qlite3PrintExprL
1d720 69 73 74 28 45 78 70 72 4c 69 73 74 20 2a 70 4c  ist(ExprList *pL
1d730 69 73 74 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20  ist){.  int i;. 
1d740 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4c 69 73   for(i=0; i<pLis
1d750 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a  t->nExpr; i++){.
1d760 20 20 20 20 73 71 6c 69 74 65 33 50 72 69 6e 74      sqlite3Print
1d770 45 78 70 72 28 70 4c 69 73 74 2d 3e 61 5b 69 5d  Expr(pList->a[i]
1d780 2e 70 45 78 70 72 29 3b 0a 20 20 20 20 69 66 28  .pExpr);.    if(
1d790 20 69 3c 70 4c 69 73 74 2d 3e 6e 45 78 70 72 2d   i<pList->nExpr-
1d7a0 31 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  1 ){.      sqlit
1d7b0 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 2c  e3DebugPrintf(",
1d7c0 20 22 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d   ");.    }.  }.}
1d7d0 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 50 72 69  .void sqlite3Pri
1d7e0 6e 74 53 65 6c 65 63 74 28 53 65 6c 65 63 74 20  ntSelect(Select 
1d7f0 2a 70 2c 20 69 6e 74 20 69 6e 64 65 6e 74 29 7b  *p, int indent){
1d800 0a 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50  .  sqlite3DebugP
1d810 72 69 6e 74 66 28 22 25 2a 73 53 45 4c 45 43 54  rintf("%*sSELECT
1d820 28 25 70 29 20 22 2c 20 69 6e 64 65 6e 74 2c 20  (%p) ", indent, 
1d830 22 22 2c 20 70 29 3b 0a 20 20 73 71 6c 69 74 65  "", p);.  sqlite
1d840 33 50 72 69 6e 74 45 78 70 72 4c 69 73 74 28 70  3PrintExprList(p
1d850 2d 3e 70 45 4c 69 73 74 29 3b 0a 20 20 73 71 6c  ->pEList);.  sql
1d860 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28  ite3DebugPrintf(
1d870 22 5c 6e 22 29 3b 0a 20 20 69 66 28 20 70 2d 3e  "\n");.  if( p->
1d880 70 53 72 63 20 29 7b 0a 20 20 20 20 63 68 61 72  pSrc ){.    char
1d890 20 2a 7a 50 72 65 66 69 78 3b 0a 20 20 20 20 69   *zPrefix;.    i
1d8a0 6e 74 20 69 3b 0a 20 20 20 20 7a 50 72 65 66 69  nt i;.    zPrefi
1d8b0 78 20 3d 20 22 46 52 4f 4d 22 3b 0a 20 20 20 20  x = "FROM";.    
1d8c0 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 70 53  for(i=0; i<p->pS
1d8d0 72 63 2d 3e 6e 53 72 63 3b 20 69 2b 2b 29 7b 0a  rc->nSrc; i++){.
1d8e0 20 20 20 20 20 20 73 74 72 75 63 74 20 53 72 63        struct Src
1d8f0 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d  List_item *pItem
1d900 20 3d 20 26 70 2d 3e 70 53 72 63 2d 3e 61 5b 69   = &p->pSrc->a[i
1d910 5d 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ];.      sqlite3
1d920 44 65 62 75 67 50 72 69 6e 74 66 28 22 25 2a 73  DebugPrintf("%*s
1d930 20 22 2c 20 69 6e 64 65 6e 74 2b 36 2c 20 7a 50   ", indent+6, zP
1d940 72 65 66 69 78 29 3b 0a 20 20 20 20 20 20 7a 50  refix);.      zP
1d950 72 65 66 69 78 20 3d 20 22 22 3b 0a 20 20 20 20  refix = "";.    
1d960 20 20 69 66 28 20 70 49 74 65 6d 2d 3e 70 53 65    if( pItem->pSe
1d970 6c 65 63 74 20 29 7b 0a 20 20 20 20 20 20 20 20  lect ){.        
1d980 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e  sqlite3DebugPrin
1d990 74 66 28 22 28 5c 6e 22 29 3b 0a 20 20 20 20 20  tf("(\n");.     
1d9a0 20 20 20 73 71 6c 69 74 65 33 50 72 69 6e 74 53     sqlite3PrintS
1d9b0 65 6c 65 63 74 28 70 49 74 65 6d 2d 3e 70 53 65  elect(pItem->pSe
1d9c0 6c 65 63 74 2c 20 69 6e 64 65 6e 74 2b 31 30 29  lect, indent+10)
1d9d0 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
1d9e0 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 25 2a  3DebugPrintf("%*
1d9f0 73 29 22 2c 20 69 6e 64 65 6e 74 2b 38 2c 20 22  s)", indent+8, "
1da00 22 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20  ");.      }else 
1da10 69 66 28 20 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65  if( pItem->zName
1da20 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
1da30 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22  te3DebugPrintf("
1da40 25 73 22 2c 20 70 49 74 65 6d 2d 3e 7a 4e 61 6d  %s", pItem->zNam
1da50 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  e);.      }.    
1da60 20 20 69 66 28 20 70 49 74 65 6d 2d 3e 70 54 61    if( pItem->pTa
1da70 62 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  b ){.        sql
1da80 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28  ite3DebugPrintf(
1da90 22 28 74 61 62 6c 65 3a 20 25 73 29 22 2c 20 70  "(table: %s)", p
1daa0 49 74 65 6d 2d 3e 70 54 61 62 2d 3e 7a 4e 61 6d  Item->pTab->zNam
1dab0 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  e);.      }.    
1dac0 20 20 69 66 28 20 70 49 74 65 6d 2d 3e 7a 41 6c    if( pItem->zAl
1dad0 69 61 73 20 29 7b 0a 20 20 20 20 20 20 20 20 73  ias ){.        s
1dae0 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74  qlite3DebugPrint
1daf0 66 28 22 20 41 53 20 25 73 22 2c 20 70 49 74 65  f(" AS %s", pIte
1db00 6d 2d 3e 7a 41 6c 69 61 73 29 3b 0a 20 20 20 20  m->zAlias);.    
1db10 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 69 3c    }.      if( i<
1db20 70 2d 3e 70 53 72 63 2d 3e 6e 53 72 63 2d 31 20  p->pSrc->nSrc-1 
1db30 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
1db40 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 2c  e3DebugPrintf(",
1db50 22 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ");.      }.    
1db60 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72    sqlite3DebugPr
1db70 69 6e 74 66 28 22 5c 6e 22 29 3b 0a 20 20 20 20  intf("\n");.    
1db80 7d 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e 70  }.  }.  if( p->p
1db90 57 68 65 72 65 20 29 7b 0a 20 20 20 20 73 71 6c  Where ){.    sql
1dba0 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28  ite3DebugPrintf(
1dbb0 22 25 2a 73 20 57 48 45 52 45 20 22 2c 20 69 6e  "%*s WHERE ", in
1dbc0 64 65 6e 74 2c 20 22 22 29 3b 0a 20 20 20 20 73  dent, "");.    s
1dbd0 71 6c 69 74 65 33 50 72 69 6e 74 45 78 70 72 28  qlite3PrintExpr(
1dbe0 70 2d 3e 70 57 68 65 72 65 29 3b 0a 20 20 20 20  p->pWhere);.    
1dbf0 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e  sqlite3DebugPrin
1dc00 74 66 28 22 5c 6e 22 29 3b 0a 20 20 7d 0a 20 20  tf("\n");.  }.  
1dc10 69 66 28 20 70 2d 3e 70 47 72 6f 75 70 42 79 20  if( p->pGroupBy 
1dc20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 65  ){.    sqlite3De
1dc30 62 75 67 50 72 69 6e 74 66 28 22 25 2a 73 20 47  bugPrintf("%*s G
1dc40 52 4f 55 50 20 42 59 20 22 2c 20 69 6e 64 65 6e  ROUP BY ", inden
1dc50 74 2c 20 22 22 29 3b 0a 20 20 20 20 73 71 6c 69  t, "");.    sqli
1dc60 74 65 33 50 72 69 6e 74 45 78 70 72 4c 69 73 74  te3PrintExprList
1dc70 28 70 2d 3e 70 47 72 6f 75 70 42 79 29 3b 0a 20  (p->pGroupBy);. 
1dc80 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50     sqlite3DebugP
1dc90 72 69 6e 74 66 28 22 5c 6e 22 29 3b 0a 20 20 7d  rintf("\n");.  }
1dca0 0a 20 20 69 66 28 20 70 2d 3e 70 48 61 76 69 6e  .  if( p->pHavin
1dcb0 67 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  g ){.    sqlite3
1dcc0 44 65 62 75 67 50 72 69 6e 74 66 28 22 25 2a 73  DebugPrintf("%*s
1dcd0 20 48 41 56 49 4e 47 20 22 2c 20 69 6e 64 65 6e   HAVING ", inden
1dce0 74 2c 20 22 22 29 3b 0a 20 20 20 20 73 71 6c 69  t, "");.    sqli
1dcf0 74 65 33 50 72 69 6e 74 45 78 70 72 28 70 2d 3e  te3PrintExpr(p->
1dd00 70 48 61 76 69 6e 67 29 3b 0a 20 20 20 20 73 71  pHaving);.    sq
1dd10 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66  lite3DebugPrintf
1dd20 28 22 5c 6e 22 29 3b 0a 20 20 7d 0a 20 20 69 66  ("\n");.  }.  if
1dd30 28 20 70 2d 3e 70 4f 72 64 65 72 42 79 20 29 7b  ( p->pOrderBy ){
1dd40 0a 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75  .    sqlite3Debu
1dd50 67 50 72 69 6e 74 66 28 22 25 2a 73 20 4f 52 44  gPrintf("%*s ORD
1dd60 45 52 20 42 59 20 22 2c 20 69 6e 64 65 6e 74 2c  ER BY ", indent,
1dd70 20 22 22 29 3b 0a 20 20 20 20 73 71 6c 69 74 65   "");.    sqlite
1dd80 33 50 72 69 6e 74 45 78 70 72 4c 69 73 74 28 70  3PrintExprList(p
1dd90 2d 3e 70 4f 72 64 65 72 42 79 29 3b 0a 20 20 20  ->pOrderBy);.   
1dda0 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69   sqlite3DebugPri
1ddb0 6e 74 66 28 22 5c 6e 22 29 3b 0a 20 20 7d 0a 7d  ntf("\n");.  }.}
1ddc0 0a 2f 2a 20 45 6e 64 20 6f 66 20 74 68 65 20 73  ./* End of the s
1ddd0 74 72 75 63 74 75 72 65 20 64 65 62 75 67 20 70  tructure debug p
1dde0 72 69 6e 74 69 6e 67 20 63 6f 64 65 0a 2a 2a 2a  rinting code.***
1ddf0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1de00 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1de10 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1de20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1de30 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 23 65 6e 64  **********/.#end
1de40 69 66 20 2f 2a 20 64 65 66 69 6e 65 64 28 53 51  if /* defined(SQ
1de50 4c 49 54 45 5f 54 45 53 54 29 20 7c 7c 20 64 65  LITE_TEST) || de
1de60 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 44 45 42  fined(SQLITE_DEB
1de70 55 47 29 20 2a 2f 0a                             UG) */.