/ Hex Artifact Content
Login

Artifact 102eb03b6daa3c113fac32019dd281f01a38baa8:


0000: 2f 2a 0a 2a 2a 20 32 30 30 31 20 53 65 70 74 65  /*.** 2001 Septe
0010: 6d 62 65 72 20 31 35 0a 2a 2a 0a 2a 2a 20 54 68  mber 15.**.** Th
0020: 65 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69  e author disclai
0030: 6d 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20  ms copyright to 
0040: 74 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65  this source code
0050: 2e 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a  .  In place of.*
0060: 2a 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65  * a legal notice
0070: 2c 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73  , here is a bles
0080: 73 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d  sing:.**.**    M
0090: 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61  ay you do good a
00a0: 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20  nd not evil..** 
00b0: 20 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20     May you find 
00c0: 66 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20  forgiveness for 
00d0: 79 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72  yourself and for
00e0: 67 69 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20  give others..** 
00f0: 20 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65     May you share
0100: 20 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74   freely, never t
0110: 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20  aking more than 
0120: 79 6f 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a  you give..**.***
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66  ******.** This f
0180: 69 6c 65 20 63 6f 6e 74 61 69 6e 73 20 43 20 63  ile contains C c
0190: 6f 64 65 20 72 6f 75 74 69 6e 65 73 20 74 68 61  ode routines tha
01a0: 74 20 61 72 65 20 63 61 6c 6c 65 64 20 62 79 20  t are called by 
01b0: 74 68 65 20 70 61 72 73 65 72 0a 2a 2a 20 74 6f  the parser.** to
01c0: 20 68 61 6e 64 6c 65 20 53 45 4c 45 43 54 20 73   handle SELECT s
01d0: 74 61 74 65 6d 65 6e 74 73 20 69 6e 20 53 51 4c  tatements in SQL
01e0: 69 74 65 2e 0a 2a 2a 0a 2a 2a 20 24 49 64 3a 20  ite..**.** $Id: 
01f0: 73 65 6c 65 63 74 2e 63 2c 76 20 31 2e 33 38 36  select.c,v 1.386
0200: 20 32 30 30 38 2f 30 31 2f 30 35 20 30 35 3a 32   2008/01/05 05:2
0210: 30 3a 31 30 20 64 72 68 20 45 78 70 20 24 0a 2a  0:10 drh Exp $.*
0220: 2f 0a 23 69 6e 63 6c 75 64 65 20 22 73 71 6c 69  /.#include "sqli
0230: 74 65 49 6e 74 2e 68 22 0a 0a 0a 2f 2a 0a 2a 2a  teInt.h".../*.**
0240: 20 44 65 6c 65 74 65 20 61 6c 6c 20 74 68 65 20   Delete all the 
0250: 63 6f 6e 74 65 6e 74 20 6f 66 20 61 20 53 65 6c  content of a Sel
0260: 65 63 74 20 73 74 72 75 63 74 75 72 65 20 62 75  ect structure bu
0270: 74 20 64 6f 20 6e 6f 74 20 64 65 61 6c 6c 6f 63  t do not dealloc
0280: 61 74 65 0a 2a 2a 20 74 68 65 20 73 65 6c 65 63  ate.** the selec
0290: 74 20 73 74 72 75 63 74 75 72 65 20 69 74 73 65  t structure itse
02a0: 6c 66 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  lf..*/.static vo
02b0: 69 64 20 63 6c 65 61 72 53 65 6c 65 63 74 28 53  id clearSelect(S
02c0: 65 6c 65 63 74 20 2a 70 29 7b 0a 20 20 73 71 6c  elect *p){.  sql
02d0: 69 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65  ite3ExprListDele
02e0: 74 65 28 70 2d 3e 70 45 4c 69 73 74 29 3b 0a 20  te(p->pEList);. 
02f0: 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74 44   sqlite3SrcListD
0300: 65 6c 65 74 65 28 70 2d 3e 70 53 72 63 29 3b 0a  elete(p->pSrc);.
0310: 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c    sqlite3ExprDel
0320: 65 74 65 28 70 2d 3e 70 57 68 65 72 65 29 3b 0a  ete(p->pWhere);.
0330: 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73    sqlite3ExprLis
0340: 74 44 65 6c 65 74 65 28 70 2d 3e 70 47 72 6f 75  tDelete(p->pGrou
0350: 70 42 79 29 3b 0a 20 20 73 71 6c 69 74 65 33 45  pBy);.  sqlite3E
0360: 78 70 72 44 65 6c 65 74 65 28 70 2d 3e 70 48 61  xprDelete(p->pHa
0370: 76 69 6e 67 29 3b 0a 20 20 73 71 6c 69 74 65 33  ving);.  sqlite3
0380: 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28 70  ExprListDelete(p
0390: 2d 3e 70 4f 72 64 65 72 42 79 29 3b 0a 20 20 73  ->pOrderBy);.  s
03a0: 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65 6c 65  qlite3SelectDele
03b0: 74 65 28 70 2d 3e 70 50 72 69 6f 72 29 3b 0a 20  te(p->pPrior);. 
03c0: 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65   sqlite3ExprDele
03d0: 74 65 28 70 2d 3e 70 4c 69 6d 69 74 29 3b 0a 20  te(p->pLimit);. 
03e0: 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65   sqlite3ExprDele
03f0: 74 65 28 70 2d 3e 70 4f 66 66 73 65 74 29 3b 0a  te(p->pOffset);.
0400: 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61  }.../*.** Alloca
0410: 74 65 20 61 20 6e 65 77 20 53 65 6c 65 63 74 20  te a new Select 
0420: 73 74 72 75 63 74 75 72 65 20 61 6e 64 20 72 65  structure and re
0430: 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74  turn a pointer t
0440: 6f 20 74 68 61 74 0a 2a 2a 20 73 74 72 75 63 74  o that.** struct
0450: 75 72 65 2e 0a 2a 2f 0a 53 65 6c 65 63 74 20 2a  ure..*/.Select *
0460: 73 71 6c 69 74 65 33 53 65 6c 65 63 74 4e 65 77  sqlite3SelectNew
0470: 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
0480: 65 2c 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72  e,        /* Par
0490: 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  sing context */.
04a0: 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69    ExprList *pELi
04b0: 73 74 2c 20 20 20 20 20 2f 2a 20 77 68 69 63 68  st,     /* which
04c0: 20 63 6f 6c 75 6d 6e 73 20 74 6f 20 69 6e 63 6c   columns to incl
04d0: 75 64 65 20 69 6e 20 74 68 65 20 72 65 73 75 6c  ude in the resul
04e0: 74 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a  t */.  SrcList *
04f0: 70 53 72 63 2c 20 20 20 20 20 20 20 20 2f 2a 20  pSrc,        /* 
0500: 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20  the FROM clause 
0510: 2d 2d 20 77 68 69 63 68 20 74 61 62 6c 65 73 20  -- which tables 
0520: 74 6f 20 73 63 61 6e 20 2a 2f 0a 20 20 45 78 70  to scan */.  Exp
0530: 72 20 2a 70 57 68 65 72 65 2c 20 20 20 20 20 20  r *pWhere,      
0540: 20 20 20 2f 2a 20 74 68 65 20 57 48 45 52 45 20     /* the WHERE 
0550: 63 6c 61 75 73 65 20 2a 2f 0a 20 20 45 78 70 72  clause */.  Expr
0560: 4c 69 73 74 20 2a 70 47 72 6f 75 70 42 79 2c 20  List *pGroupBy, 
0570: 20 20 2f 2a 20 74 68 65 20 47 52 4f 55 50 20 42    /* the GROUP B
0580: 59 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 45 78  Y clause */.  Ex
0590: 70 72 20 2a 70 48 61 76 69 6e 67 2c 20 20 20 20  pr *pHaving,    
05a0: 20 20 20 20 2f 2a 20 74 68 65 20 48 41 56 49 4e      /* the HAVIN
05b0: 47 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 45 78  G clause */.  Ex
05c0: 70 72 4c 69 73 74 20 2a 70 4f 72 64 65 72 42 79  prList *pOrderBy
05d0: 2c 20 20 20 2f 2a 20 74 68 65 20 4f 52 44 45 52  ,   /* the ORDER
05e0: 20 42 59 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20   BY clause */.  
05f0: 69 6e 74 20 69 73 44 69 73 74 69 6e 63 74 2c 20  int isDistinct, 
0600: 20 20 20 20 20 20 2f 2a 20 74 72 75 65 20 69 66        /* true if
0610: 20 74 68 65 20 44 49 53 54 49 4e 43 54 20 6b 65   the DISTINCT ke
0620: 79 77 6f 72 64 20 69 73 20 70 72 65 73 65 6e 74  yword is present
0630: 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 4c 69 6d   */.  Expr *pLim
0640: 69 74 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 4c  it,         /* L
0650: 49 4d 49 54 20 76 61 6c 75 65 2e 20 20 4e 55 4c  IMIT value.  NUL
0660: 4c 20 6d 65 61 6e 73 20 6e 6f 74 20 75 73 65 64  L means not used
0670: 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 4f 66 66   */.  Expr *pOff
0680: 73 65 74 20 20 20 20 20 20 20 20 20 2f 2a 20 4f  set         /* O
0690: 46 46 53 45 54 20 76 61 6c 75 65 2e 20 20 4e 55  FFSET value.  NU
06a0: 4c 4c 20 6d 65 61 6e 73 20 6e 6f 20 6f 66 66 73  LL means no offs
06b0: 65 74 20 2a 2f 0a 29 7b 0a 20 20 53 65 6c 65 63  et */.){.  Selec
06c0: 74 20 2a 70 4e 65 77 3b 0a 20 20 53 65 6c 65 63  t *pNew;.  Selec
06d0: 74 20 73 74 61 6e 64 69 6e 3b 0a 20 20 73 71 6c  t standin;.  sql
06e0: 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73  ite3 *db = pPars
06f0: 65 2d 3e 64 62 3b 0a 20 20 70 4e 65 77 20 3d 20  e->db;.  pNew = 
0700: 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a  sqlite3DbMallocZ
0710: 65 72 6f 28 64 62 2c 20 73 69 7a 65 6f 66 28 2a  ero(db, sizeof(*
0720: 70 4e 65 77 29 20 29 3b 0a 20 20 61 73 73 65 72  pNew) );.  asser
0730: 74 28 20 21 70 4f 66 66 73 65 74 20 7c 7c 20 70  t( !pOffset || p
0740: 4c 69 6d 69 74 20 29 3b 20 20 20 2f 2a 20 43 61  Limit );   /* Ca
0750: 6e 27 74 20 68 61 76 65 20 4f 46 46 53 45 54 20  n't have OFFSET 
0760: 77 69 74 68 6f 75 74 20 4c 49 4d 49 54 2e 20 2a  without LIMIT. *
0770: 2f 0a 20 20 69 66 28 20 70 4e 65 77 3d 3d 30 20  /.  if( pNew==0 
0780: 29 7b 0a 20 20 20 20 70 4e 65 77 20 3d 20 26 73  ){.    pNew = &s
0790: 74 61 6e 64 69 6e 3b 0a 20 20 20 20 6d 65 6d 73  tandin;.    mems
07a0: 65 74 28 70 4e 65 77 2c 20 30 2c 20 73 69 7a 65  et(pNew, 0, size
07b0: 6f 66 28 2a 70 4e 65 77 29 29 3b 0a 20 20 7d 0a  of(*pNew));.  }.
07c0: 20 20 69 66 28 20 70 45 4c 69 73 74 3d 3d 30 20    if( pEList==0 
07d0: 29 7b 0a 20 20 20 20 70 45 4c 69 73 74 20 3d 20  ){.    pEList = 
07e0: 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 41  sqlite3ExprListA
07f0: 70 70 65 6e 64 28 70 50 61 72 73 65 2c 20 30 2c  ppend(pParse, 0,
0800: 20 73 71 6c 69 74 65 33 45 78 70 72 28 64 62 2c   sqlite3Expr(db,
0810: 54 4b 5f 41 4c 4c 2c 30 2c 30 2c 30 29 2c 20 30  TK_ALL,0,0,0), 0
0820: 29 3b 0a 20 20 7d 0a 20 20 70 4e 65 77 2d 3e 70  );.  }.  pNew->p
0830: 45 4c 69 73 74 20 3d 20 70 45 4c 69 73 74 3b 0a  EList = pEList;.
0840: 20 20 70 4e 65 77 2d 3e 70 53 72 63 20 3d 20 70    pNew->pSrc = p
0850: 53 72 63 3b 0a 20 20 70 4e 65 77 2d 3e 70 57 68  Src;.  pNew->pWh
0860: 65 72 65 20 3d 20 70 57 68 65 72 65 3b 0a 20 20  ere = pWhere;.  
0870: 70 4e 65 77 2d 3e 70 47 72 6f 75 70 42 79 20 3d  pNew->pGroupBy =
0880: 20 70 47 72 6f 75 70 42 79 3b 0a 20 20 70 4e 65   pGroupBy;.  pNe
0890: 77 2d 3e 70 48 61 76 69 6e 67 20 3d 20 70 48 61  w->pHaving = pHa
08a0: 76 69 6e 67 3b 0a 20 20 70 4e 65 77 2d 3e 70 4f  ving;.  pNew->pO
08b0: 72 64 65 72 42 79 20 3d 20 70 4f 72 64 65 72 42  rderBy = pOrderB
08c0: 79 3b 0a 20 20 70 4e 65 77 2d 3e 69 73 44 69 73  y;.  pNew->isDis
08d0: 74 69 6e 63 74 20 3d 20 69 73 44 69 73 74 69 6e  tinct = isDistin
08e0: 63 74 3b 0a 20 20 70 4e 65 77 2d 3e 6f 70 20 3d  ct;.  pNew->op =
08f0: 20 54 4b 5f 53 45 4c 45 43 54 3b 0a 20 20 61 73   TK_SELECT;.  as
0900: 73 65 72 74 28 20 70 4f 66 66 73 65 74 3d 3d 30  sert( pOffset==0
0910: 20 7c 7c 20 70 4c 69 6d 69 74 21 3d 30 20 29 3b   || pLimit!=0 );
0920: 0a 20 20 70 4e 65 77 2d 3e 70 4c 69 6d 69 74 20  .  pNew->pLimit 
0930: 3d 20 70 4c 69 6d 69 74 3b 0a 20 20 70 4e 65 77  = pLimit;.  pNew
0940: 2d 3e 70 4f 66 66 73 65 74 20 3d 20 70 4f 66 66  ->pOffset = pOff
0950: 73 65 74 3b 0a 20 20 70 4e 65 77 2d 3e 69 4c 69  set;.  pNew->iLi
0960: 6d 69 74 20 3d 20 2d 31 3b 0a 20 20 70 4e 65 77  mit = -1;.  pNew
0970: 2d 3e 69 4f 66 66 73 65 74 20 3d 20 2d 31 3b 0a  ->iOffset = -1;.
0980: 20 20 70 4e 65 77 2d 3e 61 64 64 72 4f 70 65 6e    pNew->addrOpen
0990: 45 70 68 6d 5b 30 5d 20 3d 20 2d 31 3b 0a 20 20  Ephm[0] = -1;.  
09a0: 70 4e 65 77 2d 3e 61 64 64 72 4f 70 65 6e 45 70  pNew->addrOpenEp
09b0: 68 6d 5b 31 5d 20 3d 20 2d 31 3b 0a 20 20 70 4e  hm[1] = -1;.  pN
09c0: 65 77 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d  ew->addrOpenEphm
09d0: 5b 32 5d 20 3d 20 2d 31 3b 0a 20 20 69 66 28 20  [2] = -1;.  if( 
09e0: 70 4e 65 77 3d 3d 26 73 74 61 6e 64 69 6e 29 20  pNew==&standin) 
09f0: 7b 0a 20 20 20 20 63 6c 65 61 72 53 65 6c 65 63  {.    clearSelec
0a00: 74 28 70 4e 65 77 29 3b 0a 20 20 20 20 70 4e 65  t(pNew);.    pNe
0a10: 77 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74  w = 0;.  }.  ret
0a20: 75 72 6e 20 70 4e 65 77 3b 0a 7d 0a 0a 2f 2a 0a  urn pNew;.}../*.
0a30: 2a 2a 20 44 65 6c 65 74 65 20 74 68 65 20 67 69  ** Delete the gi
0a40: 76 65 6e 20 53 65 6c 65 63 74 20 73 74 72 75 63  ven Select struc
0a50: 74 75 72 65 20 61 6e 64 20 61 6c 6c 20 6f 66 20  ture and all of 
0a60: 69 74 73 20 73 75 62 73 74 72 75 63 74 75 72 65  its substructure
0a70: 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  s..*/.void sqlit
0a80: 65 33 53 65 6c 65 63 74 44 65 6c 65 74 65 28 53  e3SelectDelete(S
0a90: 65 6c 65 63 74 20 2a 70 29 7b 0a 20 20 69 66 28  elect *p){.  if(
0aa0: 20 70 20 29 7b 0a 20 20 20 20 63 6c 65 61 72 53   p ){.    clearS
0ab0: 65 6c 65 63 74 28 70 29 3b 0a 20 20 20 20 73 71  elect(p);.    sq
0ac0: 6c 69 74 65 33 5f 66 72 65 65 28 70 29 3b 0a 20  lite3_free(p);. 
0ad0: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65   }.}../*.** Give
0ae0: 6e 20 31 20 74 6f 20 33 20 69 64 65 6e 74 69 66  n 1 to 3 identif
0af0: 69 65 72 73 20 70 72 65 63 65 65 64 69 6e 67 20  iers preceeding 
0b00: 74 68 65 20 4a 4f 49 4e 20 6b 65 79 77 6f 72 64  the JOIN keyword
0b10: 2c 20 64 65 74 65 72 6d 69 6e 65 20 74 68 65 0a  , determine the.
0b20: 2a 2a 20 74 79 70 65 20 6f 66 20 6a 6f 69 6e 2e  ** type of join.
0b30: 20 20 52 65 74 75 72 6e 20 61 6e 20 69 6e 74 65    Return an inte
0b40: 67 65 72 20 63 6f 6e 73 74 61 6e 74 20 74 68 61  ger constant tha
0b50: 74 20 65 78 70 72 65 73 73 65 73 20 74 68 61 74  t expresses that
0b60: 20 74 79 70 65 0a 2a 2a 20 69 6e 20 74 65 72 6d   type.** in term
0b70: 73 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69  s of the followi
0b80: 6e 67 20 62 69 74 20 76 61 6c 75 65 73 3a 0a 2a  ng bit values:.*
0b90: 2a 0a 2a 2a 20 20 20 20 20 4a 54 5f 49 4e 4e 45  *.**     JT_INNE
0ba0: 52 0a 2a 2a 20 20 20 20 20 4a 54 5f 43 52 4f 53  R.**     JT_CROS
0bb0: 53 0a 2a 2a 20 20 20 20 20 4a 54 5f 4f 55 54 45  S.**     JT_OUTE
0bc0: 52 0a 2a 2a 20 20 20 20 20 4a 54 5f 4e 41 54 55  R.**     JT_NATU
0bd0: 52 41 4c 0a 2a 2a 20 20 20 20 20 4a 54 5f 4c 45  RAL.**     JT_LE
0be0: 46 54 0a 2a 2a 20 20 20 20 20 4a 54 5f 52 49 47  FT.**     JT_RIG
0bf0: 48 54 0a 2a 2a 0a 2a 2a 20 41 20 66 75 6c 6c 20  HT.**.** A full 
0c00: 6f 75 74 65 72 20 6a 6f 69 6e 20 69 73 20 74 68  outer join is th
0c10: 65 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 20 6f 66  e combination of
0c20: 20 4a 54 5f 4c 45 46 54 20 61 6e 64 20 4a 54 5f   JT_LEFT and JT_
0c30: 52 49 47 48 54 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  RIGHT..**.** If 
0c40: 61 6e 20 69 6c 6c 65 67 61 6c 20 6f 72 20 75 6e  an illegal or un
0c50: 73 75 70 70 6f 72 74 65 64 20 6a 6f 69 6e 20 74  supported join t
0c60: 79 70 65 20 69 73 20 73 65 65 6e 2c 20 74 68 65  ype is seen, the
0c70: 6e 20 73 74 69 6c 6c 20 72 65 74 75 72 6e 0a 2a  n still return.*
0c80: 2a 20 61 20 6a 6f 69 6e 20 74 79 70 65 2c 20 62  * a join type, b
0c90: 75 74 20 70 75 74 20 61 6e 20 65 72 72 6f 72 20  ut put an error 
0ca0: 69 6e 20 74 68 65 20 70 50 61 72 73 65 20 73 74  in the pParse st
0cb0: 72 75 63 74 75 72 65 2e 0a 2a 2f 0a 69 6e 74 20  ructure..*/.int 
0cc0: 73 71 6c 69 74 65 33 4a 6f 69 6e 54 79 70 65 28  sqlite3JoinType(
0cd0: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 54  Parse *pParse, T
0ce0: 6f 6b 65 6e 20 2a 70 41 2c 20 54 6f 6b 65 6e 20  oken *pA, Token 
0cf0: 2a 70 42 2c 20 54 6f 6b 65 6e 20 2a 70 43 29 7b  *pB, Token *pC){
0d00: 0a 20 20 69 6e 74 20 6a 6f 69 6e 74 79 70 65 20  .  int jointype 
0d10: 3d 20 30 3b 0a 20 20 54 6f 6b 65 6e 20 2a 61 70  = 0;.  Token *ap
0d20: 41 6c 6c 5b 33 5d 3b 0a 20 20 54 6f 6b 65 6e 20  All[3];.  Token 
0d30: 2a 70 3b 0a 20 20 73 74 61 74 69 63 20 63 6f 6e  *p;.  static con
0d40: 73 74 20 73 74 72 75 63 74 20 7b 0a 20 20 20 20  st struct {.    
0d50: 63 6f 6e 73 74 20 63 68 61 72 20 7a 4b 65 79 77  const char zKeyw
0d60: 6f 72 64 5b 38 5d 3b 0a 20 20 20 20 75 38 20 6e  ord[8];.    u8 n
0d70: 43 68 61 72 3b 0a 20 20 20 20 75 38 20 63 6f 64  Char;.    u8 cod
0d80: 65 3b 0a 20 20 7d 20 6b 65 79 77 6f 72 64 73 5b  e;.  } keywords[
0d90: 5d 20 3d 20 7b 0a 20 20 20 20 7b 20 22 6e 61 74  ] = {.    { "nat
0da0: 75 72 61 6c 22 2c 20 37 2c 20 4a 54 5f 4e 41 54  ural", 7, JT_NAT
0db0: 55 52 41 4c 20 7d 2c 0a 20 20 20 20 7b 20 22 6c  URAL },.    { "l
0dc0: 65 66 74 22 2c 20 20 20 20 34 2c 20 4a 54 5f 4c  eft",    4, JT_L
0dd0: 45 46 54 7c 4a 54 5f 4f 55 54 45 52 20 7d 2c 0a  EFT|JT_OUTER },.
0de0: 20 20 20 20 7b 20 22 72 69 67 68 74 22 2c 20 20      { "right",  
0df0: 20 35 2c 20 4a 54 5f 52 49 47 48 54 7c 4a 54 5f   5, JT_RIGHT|JT_
0e00: 4f 55 54 45 52 20 7d 2c 0a 20 20 20 20 7b 20 22  OUTER },.    { "
0e10: 66 75 6c 6c 22 2c 20 20 20 20 34 2c 20 4a 54 5f  full",    4, JT_
0e20: 4c 45 46 54 7c 4a 54 5f 52 49 47 48 54 7c 4a 54  LEFT|JT_RIGHT|JT
0e30: 5f 4f 55 54 45 52 20 7d 2c 0a 20 20 20 20 7b 20  _OUTER },.    { 
0e40: 22 6f 75 74 65 72 22 2c 20 20 20 35 2c 20 4a 54  "outer",   5, JT
0e50: 5f 4f 55 54 45 52 20 7d 2c 0a 20 20 20 20 7b 20  _OUTER },.    { 
0e60: 22 69 6e 6e 65 72 22 2c 20 20 20 35 2c 20 4a 54  "inner",   5, JT
0e70: 5f 49 4e 4e 45 52 20 7d 2c 0a 20 20 20 20 7b 20  _INNER },.    { 
0e80: 22 63 72 6f 73 73 22 2c 20 20 20 35 2c 20 4a 54  "cross",   5, JT
0e90: 5f 49 4e 4e 45 52 7c 4a 54 5f 43 52 4f 53 53 20  _INNER|JT_CROSS 
0ea0: 7d 2c 0a 20 20 7d 3b 0a 20 20 69 6e 74 20 69 2c  },.  };.  int i,
0eb0: 20 6a 3b 0a 20 20 61 70 41 6c 6c 5b 30 5d 20 3d   j;.  apAll[0] =
0ec0: 20 70 41 3b 0a 20 20 61 70 41 6c 6c 5b 31 5d 20   pA;.  apAll[1] 
0ed0: 3d 20 70 42 3b 0a 20 20 61 70 41 6c 6c 5b 32 5d  = pB;.  apAll[2]
0ee0: 20 3d 20 70 43 3b 0a 20 20 66 6f 72 28 69 3d 30   = pC;.  for(i=0
0ef0: 3b 20 69 3c 33 20 26 26 20 61 70 41 6c 6c 5b 69  ; i<3 && apAll[i
0f00: 5d 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 70 20 3d  ]; i++){.    p =
0f10: 20 61 70 41 6c 6c 5b 69 5d 3b 0a 20 20 20 20 66   apAll[i];.    f
0f20: 6f 72 28 6a 3d 30 3b 20 6a 3c 73 69 7a 65 6f 66  or(j=0; j<sizeof
0f30: 28 6b 65 79 77 6f 72 64 73 29 2f 73 69 7a 65 6f  (keywords)/sizeo
0f40: 66 28 6b 65 79 77 6f 72 64 73 5b 30 5d 29 3b 20  f(keywords[0]); 
0f50: 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20  j++){.      if( 
0f60: 70 2d 3e 6e 3d 3d 6b 65 79 77 6f 72 64 73 5b 6a  p->n==keywords[j
0f70: 5d 2e 6e 43 68 61 72 20 0a 20 20 20 20 20 20 20  ].nChar .       
0f80: 20 20 20 26 26 20 73 71 6c 69 74 65 33 53 74 72     && sqlite3Str
0f90: 4e 49 43 6d 70 28 28 63 68 61 72 2a 29 70 2d 3e  NICmp((char*)p->
0fa0: 7a 2c 20 6b 65 79 77 6f 72 64 73 5b 6a 5d 2e 7a  z, keywords[j].z
0fb0: 4b 65 79 77 6f 72 64 2c 20 70 2d 3e 6e 29 3d 3d  Keyword, p->n)==
0fc0: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 6a 6f 69  0 ){.        joi
0fd0: 6e 74 79 70 65 20 7c 3d 20 6b 65 79 77 6f 72 64  ntype |= keyword
0fe0: 73 5b 6a 5d 2e 63 6f 64 65 3b 0a 20 20 20 20 20  s[j].code;.     
0ff0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
1000: 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  }.    }.    if( 
1010: 6a 3e 3d 73 69 7a 65 6f 66 28 6b 65 79 77 6f 72  j>=sizeof(keywor
1020: 64 73 29 2f 73 69 7a 65 6f 66 28 6b 65 79 77 6f  ds)/sizeof(keywo
1030: 72 64 73 5b 30 5d 29 20 29 7b 0a 20 20 20 20 20  rds[0]) ){.     
1040: 20 6a 6f 69 6e 74 79 70 65 20 7c 3d 20 4a 54 5f   jointype |= JT_
1050: 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 62 72 65  ERROR;.      bre
1060: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  ak;.    }.  }.  
1070: 69 66 28 0a 20 20 20 20 20 28 6a 6f 69 6e 74 79  if(.     (jointy
1080: 70 65 20 26 20 28 4a 54 5f 49 4e 4e 45 52 7c 4a  pe & (JT_INNER|J
1090: 54 5f 4f 55 54 45 52 29 29 3d 3d 28 4a 54 5f 49  T_OUTER))==(JT_I
10a0: 4e 4e 45 52 7c 4a 54 5f 4f 55 54 45 52 29 20 7c  NNER|JT_OUTER) |
10b0: 7c 0a 20 20 20 20 20 28 6a 6f 69 6e 74 79 70 65  |.     (jointype
10c0: 20 26 20 4a 54 5f 45 52 52 4f 52 29 21 3d 30 0a   & JT_ERROR)!=0.
10d0: 20 20 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63    ){.    const c
10e0: 68 61 72 20 2a 7a 53 70 31 20 3d 20 22 20 22 3b  har *zSp1 = " ";
10f0: 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20  .    const char 
1100: 2a 7a 53 70 32 20 3d 20 22 20 22 3b 0a 20 20 20  *zSp2 = " ";.   
1110: 20 69 66 28 20 70 42 3d 3d 30 20 29 7b 20 7a 53   if( pB==0 ){ zS
1120: 70 31 2b 2b 3b 20 7d 0a 20 20 20 20 69 66 28 20  p1++; }.    if( 
1130: 70 43 3d 3d 30 20 29 7b 20 7a 53 70 32 2b 2b 3b  pC==0 ){ zSp2++;
1140: 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72   }.    sqlite3Er
1150: 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
1160: 75 6e 6b 6e 6f 77 6e 20 6f 72 20 75 6e 73 75 70  unknown or unsup
1170: 70 6f 72 74 65 64 20 6a 6f 69 6e 20 74 79 70 65  ported join type
1180: 3a 20 22 0a 20 20 20 20 20 20 20 22 25 54 25 73  : ".       "%T%s
1190: 25 54 25 73 25 54 22 2c 20 70 41 2c 20 7a 53 70  %T%s%T", pA, zSp
11a0: 31 2c 20 70 42 2c 20 7a 53 70 32 2c 20 70 43 29  1, pB, zSp2, pC)
11b0: 3b 0a 20 20 20 20 6a 6f 69 6e 74 79 70 65 20 3d  ;.    jointype =
11c0: 20 4a 54 5f 49 4e 4e 45 52 3b 0a 20 20 7d 65 6c   JT_INNER;.  }el
11d0: 73 65 20 69 66 28 20 6a 6f 69 6e 74 79 70 65 20  se if( jointype 
11e0: 26 20 4a 54 5f 52 49 47 48 54 20 29 7b 0a 20 20  & JT_RIGHT ){.  
11f0: 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
1200: 67 28 70 50 61 72 73 65 2c 20 0a 20 20 20 20 20  g(pParse, .     
1210: 20 22 52 49 47 48 54 20 61 6e 64 20 46 55 4c 4c   "RIGHT and FULL
1220: 20 4f 55 54 45 52 20 4a 4f 49 4e 73 20 61 72 65   OUTER JOINs are
1230: 20 6e 6f 74 20 63 75 72 72 65 6e 74 6c 79 20 73   not currently s
1240: 75 70 70 6f 72 74 65 64 22 29 3b 0a 20 20 20 20  upported");.    
1250: 6a 6f 69 6e 74 79 70 65 20 3d 20 4a 54 5f 49 4e  jointype = JT_IN
1260: 4e 45 52 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  NER;.  }.  retur
1270: 6e 20 6a 6f 69 6e 74 79 70 65 3b 0a 7d 0a 0a 2f  n jointype;.}../
1280: 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
1290: 69 6e 64 65 78 20 6f 66 20 61 20 63 6f 6c 75 6d  index of a colum
12a0: 6e 20 69 6e 20 61 20 74 61 62 6c 65 2e 20 20 52  n in a table.  R
12b0: 65 74 75 72 6e 20 2d 31 20 69 66 20 74 68 65 20  eturn -1 if the 
12c0: 63 6f 6c 75 6d 6e 0a 2a 2a 20 69 73 20 6e 6f 74  column.** is not
12d0: 20 63 6f 6e 74 61 69 6e 65 64 20 69 6e 20 74 68   contained in th
12e0: 65 20 74 61 62 6c 65 2e 0a 2a 2f 0a 73 74 61 74  e table..*/.stat
12f0: 69 63 20 69 6e 74 20 63 6f 6c 75 6d 6e 49 6e 64  ic int columnInd
1300: 65 78 28 54 61 62 6c 65 20 2a 70 54 61 62 2c 20  ex(Table *pTab, 
1310: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43 6f 6c  const char *zCol
1320: 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f  ){.  int i;.  fo
1330: 72 28 69 3d 30 3b 20 69 3c 70 54 61 62 2d 3e 6e  r(i=0; i<pTab->n
1340: 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69  Col; i++){.    i
1350: 66 28 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d  f( sqlite3StrICm
1360: 70 28 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 5d 2e  p(pTab->aCol[i].
1370: 7a 4e 61 6d 65 2c 20 7a 43 6f 6c 29 3d 3d 30 20  zName, zCol)==0 
1380: 29 20 72 65 74 75 72 6e 20 69 3b 0a 20 20 7d 0a  ) return i;.  }.
1390: 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a 7d 0a 0a    return -1;.}..
13a0: 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 76 61  /*.** Set the va
13b0: 6c 75 65 20 6f 66 20 61 20 74 6f 6b 65 6e 20 74  lue of a token t
13c0: 6f 20 61 20 27 5c 30 30 30 27 2d 74 65 72 6d 69  o a '\000'-termi
13d0: 6e 61 74 65 64 20 73 74 72 69 6e 67 2e 0a 2a 2f  nated string..*/
13e0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 65 74  .static void set
13f0: 54 6f 6b 65 6e 28 54 6f 6b 65 6e 20 2a 70 2c 20  Token(Token *p, 
1400: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 29 7b 0a  const char *z){.
1410: 20 20 70 2d 3e 7a 20 3d 20 28 75 38 2a 29 7a 3b    p->z = (u8*)z;
1420: 0a 20 20 70 2d 3e 6e 20 3d 20 7a 20 3f 20 73 74  .  p->n = z ? st
1430: 72 6c 65 6e 28 7a 29 20 3a 20 30 3b 0a 20 20 70  rlen(z) : 0;.  p
1440: 2d 3e 64 79 6e 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a  ->dyn = 0;.}../*
1450: 0a 2a 2a 20 53 65 74 20 74 68 65 20 74 6f 6b 65  .** Set the toke
1460: 6e 20 74 6f 20 74 68 65 20 64 6f 75 62 6c 65 2d  n to the double-
1470: 71 75 6f 74 65 64 20 61 6e 64 20 65 73 63 61 70  quoted and escap
1480: 65 64 20 76 65 72 73 69 6f 6e 20 6f 66 20 74 68  ed version of th
1490: 65 20 73 74 72 69 6e 67 20 70 6f 69 6e 74 65 64  e string pointed
14a0: 0a 2a 2a 20 74 6f 20 62 79 20 7a 2e 20 46 6f 72  .** to by z. For
14b0: 20 65 78 61 6d 70 6c 65 3b 0a 2a 2a 0a 2a 2a 20   example;.**.** 
14c0: 20 20 20 7b 61 22 62 63 7d 20 20 2d 3e 20 20 7b     {a"bc}  ->  {
14d0: 22 61 22 22 62 63 22 7d 0a 2a 2f 0a 73 74 61 74  "a""bc"}.*/.stat
14e0: 69 63 20 76 6f 69 64 20 73 65 74 51 75 6f 74 65  ic void setQuote
14f0: 64 54 6f 6b 65 6e 28 50 61 72 73 65 20 2a 70 50  dToken(Parse *pP
1500: 61 72 73 65 2c 20 54 6f 6b 65 6e 20 2a 70 2c 20  arse, Token *p, 
1510: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 29 7b 0a  const char *z){.
1520: 20 20 70 2d 3e 7a 20 3d 20 28 75 38 20 2a 29 73    p->z = (u8 *)s
1530: 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 30 2c  qlite3MPrintf(0,
1540: 20 22 5c 22 25 77 5c 22 22 2c 20 7a 29 3b 0a 20   "\"%w\"", z);. 
1550: 20 70 2d 3e 64 79 6e 20 3d 20 31 3b 0a 20 20 69   p->dyn = 1;.  i
1560: 66 28 20 70 2d 3e 7a 20 29 7b 0a 20 20 20 20 70  f( p->z ){.    p
1570: 2d 3e 6e 20 3d 20 73 74 72 6c 65 6e 28 28 63 68  ->n = strlen((ch
1580: 61 72 20 2a 29 70 2d 3e 7a 29 3b 0a 20 20 7d 65  ar *)p->z);.  }e
1590: 6c 73 65 7b 0a 20 20 20 20 70 50 61 72 73 65 2d  lse{.    pParse-
15a0: 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65  >db->mallocFaile
15b0: 64 20 3d 20 31 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  d = 1;.  }.}../*
15c0: 0a 2a 2a 20 43 72 65 61 74 65 20 61 6e 20 65 78  .** Create an ex
15d0: 70 72 65 73 73 69 6f 6e 20 6e 6f 64 65 20 66 6f  pression node fo
15e0: 72 20 61 6e 20 69 64 65 6e 74 69 66 69 65 72 20  r an identifier 
15f0: 77 69 74 68 20 74 68 65 20 6e 61 6d 65 20 6f 66  with the name of
1600: 20 7a 4e 61 6d 65 0a 2a 2f 0a 45 78 70 72 20 2a   zName.*/.Expr *
1610: 73 71 6c 69 74 65 33 43 72 65 61 74 65 49 64 45  sqlite3CreateIdE
1620: 78 70 72 28 50 61 72 73 65 20 2a 70 50 61 72 73  xpr(Parse *pPars
1630: 65 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  e, const char *z
1640: 4e 61 6d 65 29 7b 0a 20 20 54 6f 6b 65 6e 20 64  Name){.  Token d
1650: 75 6d 6d 79 3b 0a 20 20 73 65 74 54 6f 6b 65 6e  ummy;.  setToken
1660: 28 26 64 75 6d 6d 79 2c 20 7a 4e 61 6d 65 29 3b  (&dummy, zName);
1670: 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65  .  return sqlite
1680: 33 50 45 78 70 72 28 70 50 61 72 73 65 2c 20 54  3PExpr(pParse, T
1690: 4b 5f 49 44 2c 20 30 2c 20 30 2c 20 26 64 75 6d  K_ID, 0, 0, &dum
16a0: 6d 79 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 41  my);.}.../*.** A
16b0: 64 64 20 61 20 74 65 72 6d 20 74 6f 20 74 68 65  dd a term to the
16c0: 20 57 48 45 52 45 20 65 78 70 72 65 73 73 69 6f   WHERE expressio
16d0: 6e 20 69 6e 20 2a 70 70 45 78 70 72 20 74 68 61  n in *ppExpr tha
16e0: 74 20 72 65 71 75 69 72 65 73 20 74 68 65 0a 2a  t requires the.*
16f0: 2a 20 7a 43 6f 6c 20 63 6f 6c 75 6d 6e 20 74 6f  * zCol column to
1700: 20 62 65 20 65 71 75 61 6c 20 69 6e 20 74 68 65   be equal in the
1710: 20 74 77 6f 20 74 61 62 6c 65 73 20 70 54 61 62   two tables pTab
1720: 31 20 61 6e 64 20 70 54 61 62 32 2e 0a 2a 2f 0a  1 and pTab2..*/.
1730: 73 74 61 74 69 63 20 76 6f 69 64 20 61 64 64 57  static void addW
1740: 68 65 72 65 54 65 72 6d 28 0a 20 20 50 61 72 73  hereTerm(.  Pars
1750: 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20  e *pParse,      
1760: 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20       /* Parsing 
1770: 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 63 6f 6e  context */.  con
1780: 73 74 20 63 68 61 72 20 2a 7a 43 6f 6c 2c 20 20  st char *zCol,  
1790: 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66        /* Name of
17a0: 20 74 68 65 20 63 6f 6c 75 6d 6e 20 2a 2f 0a 20   the column */. 
17b0: 20 63 6f 6e 73 74 20 54 61 62 6c 65 20 2a 70 54   const Table *pT
17c0: 61 62 31 2c 20 20 20 20 20 20 2f 2a 20 46 69 72  ab1,      /* Fir
17d0: 73 74 20 74 61 62 6c 65 20 2a 2f 0a 20 20 63 6f  st table */.  co
17e0: 6e 73 74 20 63 68 61 72 20 2a 7a 41 6c 69 61 73  nst char *zAlias
17f0: 31 2c 20 20 20 20 20 2f 2a 20 41 6c 69 61 73 20  1,     /* Alias 
1800: 66 6f 72 20 66 69 72 73 74 20 74 61 62 6c 65 2e  for first table.
1810: 20 20 4d 61 79 20 62 65 20 4e 55 4c 4c 20 2a 2f    May be NULL */
1820: 0a 20 20 63 6f 6e 73 74 20 54 61 62 6c 65 20 2a  .  const Table *
1830: 70 54 61 62 32 2c 20 20 20 20 20 20 2f 2a 20 53  pTab2,      /* S
1840: 65 63 6f 6e 64 20 74 61 62 6c 65 20 2a 2f 0a 20  econd table */. 
1850: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 41 6c   const char *zAl
1860: 69 61 73 32 2c 20 20 20 20 20 2f 2a 20 41 6c 69  ias2,     /* Ali
1870: 61 73 20 66 6f 72 20 73 65 63 6f 6e 64 20 74 61  as for second ta
1880: 62 6c 65 2e 20 20 4d 61 79 20 62 65 20 4e 55 4c  ble.  May be NUL
1890: 4c 20 2a 2f 0a 20 20 69 6e 74 20 69 52 69 67 68  L */.  int iRigh
18a0: 74 4a 6f 69 6e 54 61 62 6c 65 2c 20 20 20 20 20  tJoinTable,     
18b0: 2f 2a 20 56 44 42 45 20 63 75 72 73 6f 72 20 66  /* VDBE cursor f
18c0: 6f 72 20 74 68 65 20 72 69 67 68 74 20 74 61 62  or the right tab
18d0: 6c 65 20 2a 2f 0a 20 20 45 78 70 72 20 2a 2a 70  le */.  Expr **p
18e0: 70 45 78 70 72 20 20 20 20 20 20 20 20 20 20 20  pExpr           
18f0: 20 2f 2a 20 41 64 64 20 74 68 65 20 65 71 75 61   /* Add the equa
1900: 6c 69 74 79 20 74 65 72 6d 20 74 6f 20 74 68 69  lity term to thi
1910: 73 20 65 78 70 72 65 73 73 69 6f 6e 20 2a 2f 0a  s expression */.
1920: 29 7b 0a 20 20 45 78 70 72 20 2a 70 45 31 61 2c  ){.  Expr *pE1a,
1930: 20 2a 70 45 31 62 2c 20 2a 70 45 31 63 3b 0a 20   *pE1b, *pE1c;. 
1940: 20 45 78 70 72 20 2a 70 45 32 61 2c 20 2a 70 45   Expr *pE2a, *pE
1950: 32 62 2c 20 2a 70 45 32 63 3b 0a 20 20 45 78 70  2b, *pE2c;.  Exp
1960: 72 20 2a 70 45 3b 0a 0a 20 20 70 45 31 61 20 3d  r *pE;..  pE1a =
1970: 20 73 71 6c 69 74 65 33 43 72 65 61 74 65 49 64   sqlite3CreateId
1980: 45 78 70 72 28 70 50 61 72 73 65 2c 20 7a 43 6f  Expr(pParse, zCo
1990: 6c 29 3b 0a 20 20 70 45 32 61 20 3d 20 73 71 6c  l);.  pE2a = sql
19a0: 69 74 65 33 43 72 65 61 74 65 49 64 45 78 70 72  ite3CreateIdExpr
19b0: 28 70 50 61 72 73 65 2c 20 7a 43 6f 6c 29 3b 0a  (pParse, zCol);.
19c0: 20 20 69 66 28 20 7a 41 6c 69 61 73 31 3d 3d 30    if( zAlias1==0
19d0: 20 29 7b 0a 20 20 20 20 7a 41 6c 69 61 73 31 20   ){.    zAlias1 
19e0: 3d 20 70 54 61 62 31 2d 3e 7a 4e 61 6d 65 3b 0a  = pTab1->zName;.
19f0: 20 20 7d 0a 20 20 70 45 31 62 20 3d 20 73 71 6c    }.  pE1b = sql
1a00: 69 74 65 33 43 72 65 61 74 65 49 64 45 78 70 72  ite3CreateIdExpr
1a10: 28 70 50 61 72 73 65 2c 20 7a 41 6c 69 61 73 31  (pParse, zAlias1
1a20: 29 3b 0a 20 20 69 66 28 20 7a 41 6c 69 61 73 32  );.  if( zAlias2
1a30: 3d 3d 30 20 29 7b 0a 20 20 20 20 7a 41 6c 69 61  ==0 ){.    zAlia
1a40: 73 32 20 3d 20 70 54 61 62 32 2d 3e 7a 4e 61 6d  s2 = pTab2->zNam
1a50: 65 3b 0a 20 20 7d 0a 20 20 70 45 32 62 20 3d 20  e;.  }.  pE2b = 
1a60: 73 71 6c 69 74 65 33 43 72 65 61 74 65 49 64 45  sqlite3CreateIdE
1a70: 78 70 72 28 70 50 61 72 73 65 2c 20 7a 41 6c 69  xpr(pParse, zAli
1a80: 61 73 32 29 3b 0a 20 20 70 45 31 63 20 3d 20 73  as2);.  pE1c = s
1a90: 71 6c 69 74 65 33 50 45 78 70 72 28 70 50 61 72  qlite3PExpr(pPar
1aa0: 73 65 2c 20 54 4b 5f 44 4f 54 2c 20 70 45 31 62  se, TK_DOT, pE1b
1ab0: 2c 20 70 45 31 61 2c 20 30 29 3b 0a 20 20 70 45  , pE1a, 0);.  pE
1ac0: 32 63 20 3d 20 73 71 6c 69 74 65 33 50 45 78 70  2c = sqlite3PExp
1ad0: 72 28 70 50 61 72 73 65 2c 20 54 4b 5f 44 4f 54  r(pParse, TK_DOT
1ae0: 2c 20 70 45 32 62 2c 20 70 45 32 61 2c 20 30 29  , pE2b, pE2a, 0)
1af0: 3b 0a 20 20 70 45 20 3d 20 73 71 6c 69 74 65 33  ;.  pE = sqlite3
1b00: 50 45 78 70 72 28 70 50 61 72 73 65 2c 20 54 4b  PExpr(pParse, TK
1b10: 5f 45 51 2c 20 70 45 31 63 2c 20 70 45 32 63 2c  _EQ, pE1c, pE2c,
1b20: 20 30 29 3b 0a 20 20 69 66 28 20 70 45 20 29 7b   0);.  if( pE ){
1b30: 0a 20 20 20 20 45 78 70 72 53 65 74 50 72 6f 70  .    ExprSetProp
1b40: 65 72 74 79 28 70 45 2c 20 45 50 5f 46 72 6f 6d  erty(pE, EP_From
1b50: 4a 6f 69 6e 29 3b 0a 20 20 20 20 70 45 2d 3e 69  Join);.    pE->i
1b60: 52 69 67 68 74 4a 6f 69 6e 54 61 62 6c 65 20 3d  RightJoinTable =
1b70: 20 69 52 69 67 68 74 4a 6f 69 6e 54 61 62 6c 65   iRightJoinTable
1b80: 3b 0a 20 20 7d 0a 20 20 2a 70 70 45 78 70 72 20  ;.  }.  *ppExpr 
1b90: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 41 6e 64  = sqlite3ExprAnd
1ba0: 28 70 50 61 72 73 65 2d 3e 64 62 2c 2a 70 70 45  (pParse->db,*ppE
1bb0: 78 70 72 2c 20 70 45 29 3b 0a 7d 0a 0a 2f 2a 0a  xpr, pE);.}../*.
1bc0: 2a 2a 20 53 65 74 20 74 68 65 20 45 50 5f 46 72  ** Set the EP_Fr
1bd0: 6f 6d 4a 6f 69 6e 20 70 72 6f 70 65 72 74 79 20  omJoin property 
1be0: 6f 6e 20 61 6c 6c 20 74 65 72 6d 73 20 6f 66 20  on all terms of 
1bf0: 74 68 65 20 67 69 76 65 6e 20 65 78 70 72 65 73  the given expres
1c00: 73 69 6f 6e 2e 0a 2a 2a 20 41 6e 64 20 73 65 74  sion..** And set
1c10: 20 74 68 65 20 45 78 70 72 2e 69 52 69 67 68 74   the Expr.iRight
1c20: 4a 6f 69 6e 54 61 62 6c 65 20 74 6f 20 69 54 61  JoinTable to iTa
1c30: 62 6c 65 20 66 6f 72 20 65 76 65 72 79 20 74 65  ble for every te
1c40: 72 6d 20 69 6e 20 74 68 65 0a 2a 2a 20 65 78 70  rm in the.** exp
1c50: 72 65 73 73 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54  ression..**.** T
1c60: 68 65 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 20 70  he EP_FromJoin p
1c70: 72 6f 70 65 72 74 79 20 69 73 20 75 73 65 64 20  roperty is used 
1c80: 6f 6e 20 74 65 72 6d 73 20 6f 66 20 61 6e 20 65  on terms of an e
1c90: 78 70 72 65 73 73 69 6f 6e 20 74 6f 20 74 65 6c  xpression to tel
1ca0: 6c 0a 2a 2a 20 74 68 65 20 4c 45 46 54 20 4f 55  l.** the LEFT OU
1cb0: 54 45 52 20 4a 4f 49 4e 20 70 72 6f 63 65 73 73  TER JOIN process
1cc0: 69 6e 67 20 6c 6f 67 69 63 20 74 68 61 74 20 74  ing logic that t
1cd0: 68 69 73 20 74 65 72 6d 20 69 73 20 70 61 72 74  his term is part
1ce0: 20 6f 66 20 74 68 65 0a 2a 2a 20 6a 6f 69 6e 20   of the.** join 
1cf0: 72 65 73 74 72 69 63 74 69 6f 6e 20 73 70 65 63  restriction spec
1d00: 69 66 69 65 64 20 69 6e 20 74 68 65 20 4f 4e 20  ified in the ON 
1d10: 6f 72 20 55 53 49 4e 47 20 63 6c 61 75 73 65 20  or USING clause 
1d20: 61 6e 64 20 6e 6f 74 20 61 20 70 61 72 74 0a 2a  and not a part.*
1d30: 2a 20 6f 66 20 74 68 65 20 6d 6f 72 65 20 67 65  * of the more ge
1d40: 6e 65 72 61 6c 20 57 48 45 52 45 20 63 6c 61 75  neral WHERE clau
1d50: 73 65 2e 20 20 54 68 65 73 65 20 74 65 72 6d 73  se.  These terms
1d60: 20 61 72 65 20 6d 6f 76 65 64 20 6f 76 65 72 20   are moved over 
1d70: 74 6f 20 74 68 65 0a 2a 2a 20 57 48 45 52 45 20  to the.** WHERE 
1d80: 63 6c 61 75 73 65 20 64 75 72 69 6e 67 20 6a 6f  clause during jo
1d90: 69 6e 20 70 72 6f 63 65 73 73 69 6e 67 20 62 75  in processing bu
1da0: 74 20 77 65 20 6e 65 65 64 20 74 6f 20 72 65 6d  t we need to rem
1db0: 65 6d 62 65 72 20 74 68 61 74 20 74 68 65 79 0a  ember that they.
1dc0: 2a 2a 20 6f 72 69 67 69 6e 61 74 65 64 20 69 6e  ** originated in
1dd0: 20 74 68 65 20 4f 4e 20 6f 72 20 55 53 49 4e 47   the ON or USING
1de0: 20 63 6c 61 75 73 65 2e 0a 2a 2a 0a 2a 2a 20 54   clause..**.** T
1df0: 68 65 20 45 78 70 72 2e 69 52 69 67 68 74 4a 6f  he Expr.iRightJo
1e00: 69 6e 54 61 62 6c 65 20 74 65 6c 6c 73 20 74 68  inTable tells th
1e10: 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 70  e WHERE clause p
1e20: 72 6f 63 65 73 73 69 6e 67 20 74 68 61 74 20 74  rocessing that t
1e30: 68 65 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e  he.** expression
1e40: 20 64 65 70 65 6e 64 73 20 6f 6e 20 74 61 62 6c   depends on tabl
1e50: 65 20 69 52 69 67 68 74 4a 6f 69 6e 54 61 62 6c  e iRightJoinTabl
1e60: 65 20 65 76 65 6e 20 69 66 20 74 68 61 74 20 74  e even if that t
1e70: 61 62 6c 65 20 69 73 20 6e 6f 74 0a 2a 2a 20 65  able is not.** e
1e80: 78 70 6c 69 63 69 74 6c 79 20 6d 65 6e 74 69 6f  xplicitly mentio
1e90: 6e 65 64 20 69 6e 20 74 68 65 20 65 78 70 72 65  ned in the expre
1ea0: 73 73 69 6f 6e 2e 20 20 54 68 61 74 20 69 6e 66  ssion.  That inf
1eb0: 6f 72 6d 61 74 69 6f 6e 20 69 73 20 6e 65 65 64  ormation is need
1ec0: 65 64 0a 2a 2a 20 66 6f 72 20 63 61 73 65 73 20  ed.** for cases 
1ed0: 6c 69 6b 65 20 74 68 69 73 3a 0a 2a 2a 0a 2a 2a  like this:.**.**
1ee0: 20 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f      SELECT * FRO
1ef0: 4d 20 74 31 20 4c 45 46 54 20 4a 4f 49 4e 20 74  M t1 LEFT JOIN t
1f00: 32 20 4f 4e 20 74 31 2e 61 3d 74 32 2e 62 20 41  2 ON t1.a=t2.b A
1f10: 4e 44 20 74 31 2e 78 3d 35 0a 2a 2a 0a 2a 2a 20  ND t1.x=5.**.** 
1f20: 54 68 65 20 77 68 65 72 65 20 63 6c 61 75 73 65  The where clause
1f30: 20 6e 65 65 64 73 20 74 6f 20 64 65 66 65 72 20   needs to defer 
1f40: 74 68 65 20 68 61 6e 64 6c 69 6e 67 20 6f 66 20  the handling of 
1f50: 74 68 65 20 74 31 2e 78 3d 35 0a 2a 2a 20 74 65  the t1.x=5.** te
1f60: 72 6d 20 75 6e 74 69 6c 20 61 66 74 65 72 20 74  rm until after t
1f70: 68 65 20 74 32 20 6c 6f 6f 70 20 6f 66 20 74 68  he t2 loop of th
1f80: 65 20 6a 6f 69 6e 2e 20 20 49 6e 20 74 68 61 74  e join.  In that
1f90: 20 77 61 79 2c 20 61 0a 2a 2a 20 4e 55 4c 4c 20   way, a.** NULL 
1fa0: 74 32 20 72 6f 77 20 77 69 6c 6c 20 62 65 20 69  t2 row will be i
1fb0: 6e 73 65 72 74 65 64 20 77 68 65 6e 65 76 65 72  nserted whenever
1fc0: 20 74 31 2e 78 21 3d 35 2e 20 20 49 66 20 77 65   t1.x!=5.  If we
1fd0: 20 64 6f 20 6e 6f 74 0a 2a 2a 20 64 65 66 65 72   do not.** defer
1fe0: 20 74 68 65 20 68 61 6e 64 6c 69 6e 67 20 6f 66   the handling of
1ff0: 20 74 31 2e 78 3d 35 2c 20 69 74 20 77 69 6c 6c   t1.x=5, it will
2000: 20 62 65 20 70 72 6f 63 65 73 73 65 64 20 69 6d   be processed im
2010: 6d 65 64 69 61 74 65 6c 79 0a 2a 2a 20 61 66 74  mediately.** aft
2020: 65 72 20 74 68 65 20 74 31 20 6c 6f 6f 70 20 61  er the t1 loop a
2030: 6e 64 20 72 6f 77 73 20 77 69 74 68 20 74 31 2e  nd rows with t1.
2040: 78 21 3d 35 20 77 69 6c 6c 20 6e 65 76 65 72 20  x!=5 will never 
2050: 61 70 70 65 61 72 20 69 6e 0a 2a 2a 20 74 68 65  appear in.** the
2060: 20 6f 75 74 70 75 74 2c 20 77 68 69 63 68 20 69   output, which i
2070: 73 20 69 6e 63 6f 72 72 65 63 74 2e 0a 2a 2f 0a  s incorrect..*/.
2080: 73 74 61 74 69 63 20 76 6f 69 64 20 73 65 74 4a  static void setJ
2090: 6f 69 6e 45 78 70 72 28 45 78 70 72 20 2a 70 2c  oinExpr(Expr *p,
20a0: 20 69 6e 74 20 69 54 61 62 6c 65 29 7b 0a 20 20   int iTable){.  
20b0: 77 68 69 6c 65 28 20 70 20 29 7b 0a 20 20 20 20  while( p ){.    
20c0: 45 78 70 72 53 65 74 50 72 6f 70 65 72 74 79 28  ExprSetProperty(
20d0: 70 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29 3b  p, EP_FromJoin);
20e0: 0a 20 20 20 20 70 2d 3e 69 52 69 67 68 74 4a 6f  .    p->iRightJo
20f0: 69 6e 54 61 62 6c 65 20 3d 20 69 54 61 62 6c 65  inTable = iTable
2100: 3b 0a 20 20 20 20 73 65 74 4a 6f 69 6e 45 78 70  ;.    setJoinExp
2110: 72 28 70 2d 3e 70 4c 65 66 74 2c 20 69 54 61 62  r(p->pLeft, iTab
2120: 6c 65 29 3b 0a 20 20 20 20 70 20 3d 20 70 2d 3e  le);.    p = p->
2130: 70 52 69 67 68 74 3b 0a 20 20 7d 20 0a 7d 0a 0a  pRight;.  } .}..
2140: 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
2150: 6e 65 20 70 72 6f 63 65 73 73 65 73 20 74 68 65  ne processes the
2160: 20 6a 6f 69 6e 20 69 6e 66 6f 72 6d 61 74 69 6f   join informatio
2170: 6e 20 66 6f 72 20 61 20 53 45 4c 45 43 54 20 73  n for a SELECT s
2180: 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 20 4f 4e 20  tatement..** ON 
2190: 61 6e 64 20 55 53 49 4e 47 20 63 6c 61 75 73 65  and USING clause
21a0: 73 20 61 72 65 20 63 6f 6e 76 65 72 74 65 64 20  s are converted 
21b0: 69 6e 74 6f 20 65 78 74 72 61 20 74 65 72 6d 73  into extra terms
21c0: 20 6f 66 20 74 68 65 20 57 48 45 52 45 20 63 6c   of the WHERE cl
21d0: 61 75 73 65 2e 0a 2a 2a 20 4e 41 54 55 52 41 4c  ause..** NATURAL
21e0: 20 6a 6f 69 6e 73 20 61 6c 73 6f 20 63 72 65 61   joins also crea
21f0: 74 65 20 65 78 74 72 61 20 57 48 45 52 45 20 63  te extra WHERE c
2200: 6c 61 75 73 65 20 74 65 72 6d 73 2e 0a 2a 2a 0a  lause terms..**.
2210: 2a 2a 20 54 68 65 20 74 65 72 6d 73 20 6f 66 20  ** The terms of 
2220: 61 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 61 72  a FROM clause ar
2230: 65 20 63 6f 6e 74 61 69 6e 65 64 20 69 6e 20 74  e contained in t
2240: 68 65 20 53 65 6c 65 63 74 2e 70 53 72 63 20 73  he Select.pSrc s
2250: 74 72 75 63 74 75 72 65 2e 0a 2a 2a 20 54 68 65  tructure..** The
2260: 20 6c 65 66 74 20 6d 6f 73 74 20 74 61 62 6c 65   left most table
2270: 20 69 73 20 74 68 65 20 66 69 72 73 74 20 65 6e   is the first en
2280: 74 72 79 20 69 6e 20 53 65 6c 65 63 74 2e 70 53  try in Select.pS
2290: 72 63 2e 20 20 54 68 65 20 72 69 67 68 74 2d 6d  rc.  The right-m
22a0: 6f 73 74 0a 2a 2a 20 74 61 62 6c 65 20 69 73 20  ost.** table is 
22b0: 74 68 65 20 6c 61 73 74 20 65 6e 74 72 79 2e 20  the last entry. 
22c0: 20 54 68 65 20 6a 6f 69 6e 20 6f 70 65 72 61 74   The join operat
22d0: 6f 72 20 69 73 20 68 65 6c 64 20 69 6e 20 74 68  or is held in th
22e0: 65 20 65 6e 74 72 79 20 74 6f 0a 2a 2a 20 74 68  e entry to.** th
22f0: 65 20 6c 65 66 74 2e 20 20 54 68 75 73 20 65 6e  e left.  Thus en
2300: 74 72 79 20 30 20 63 6f 6e 74 61 69 6e 73 20 74  try 0 contains t
2310: 68 65 20 6a 6f 69 6e 20 6f 70 65 72 61 74 6f 72  he join operator
2320: 20 66 6f 72 20 74 68 65 20 6a 6f 69 6e 20 62 65   for the join be
2330: 74 77 65 65 6e 0a 2a 2a 20 65 6e 74 72 69 65 73  tween.** entries
2340: 20 30 20 61 6e 64 20 31 2e 20 20 41 6e 79 20 4f   0 and 1.  Any O
2350: 4e 20 6f 72 20 55 53 49 4e 47 20 63 6c 61 75 73  N or USING claus
2360: 65 73 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  es associated wi
2370: 74 68 20 74 68 65 20 6a 6f 69 6e 20 61 72 65 0a  th the join are.
2380: 2a 2a 20 61 6c 73 6f 20 61 74 74 61 63 68 65 64  ** also attached
2390: 20 74 6f 20 74 68 65 20 6c 65 66 74 20 65 6e 74   to the left ent
23a0: 72 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  ry..**.** This r
23b0: 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73 20 74  outine returns t
23c0: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 65 72 72  he number of err
23d0: 6f 72 73 20 65 6e 63 6f 75 6e 74 65 72 65 64 2e  ors encountered.
23e0: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73  .*/.static int s
23f0: 71 6c 69 74 65 50 72 6f 63 65 73 73 4a 6f 69 6e  qliteProcessJoin
2400: 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
2410: 53 65 6c 65 63 74 20 2a 70 29 7b 0a 20 20 53 72  Select *p){.  Sr
2420: 63 4c 69 73 74 20 2a 70 53 72 63 3b 20 20 20 20  cList *pSrc;    
2430: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2440: 20 41 6c 6c 20 74 61 62 6c 65 73 20 69 6e 20 74   All tables in t
2450: 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 2a  he FROM clause *
2460: 2f 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 20 20 20  /.  int i, j;   
2470: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2480: 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e      /* Loop coun
2490: 74 65 72 73 20 2a 2f 0a 20 20 73 74 72 75 63 74  ters */.  struct
24a0: 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70   SrcList_item *p
24b0: 4c 65 66 74 3b 20 20 20 20 20 2f 2a 20 4c 65 66  Left;     /* Lef
24c0: 74 20 74 61 62 6c 65 20 62 65 69 6e 67 20 6a 6f  t table being jo
24d0: 69 6e 65 64 20 2a 2f 0a 20 20 73 74 72 75 63 74  ined */.  struct
24e0: 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70   SrcList_item *p
24f0: 52 69 67 68 74 3b 20 20 20 20 2f 2a 20 52 69 67  Right;    /* Rig
2500: 68 74 20 74 61 62 6c 65 20 62 65 69 6e 67 20 6a  ht table being j
2510: 6f 69 6e 65 64 20 2a 2f 0a 0a 20 20 70 53 72 63  oined */..  pSrc
2520: 20 3d 20 70 2d 3e 70 53 72 63 3b 0a 20 20 70 4c   = p->pSrc;.  pL
2530: 65 66 74 20 3d 20 26 70 53 72 63 2d 3e 61 5b 30  eft = &pSrc->a[0
2540: 5d 3b 0a 20 20 70 52 69 67 68 74 20 3d 20 26 70  ];.  pRight = &p
2550: 4c 65 66 74 5b 31 5d 3b 0a 20 20 66 6f 72 28 69  Left[1];.  for(i
2560: 3d 30 3b 20 69 3c 70 53 72 63 2d 3e 6e 53 72 63  =0; i<pSrc->nSrc
2570: 2d 31 3b 20 69 2b 2b 2c 20 70 52 69 67 68 74 2b  -1; i++, pRight+
2580: 2b 2c 20 70 4c 65 66 74 2b 2b 29 7b 0a 20 20 20  +, pLeft++){.   
2590: 20 54 61 62 6c 65 20 2a 70 4c 65 66 74 54 61 62   Table *pLeftTab
25a0: 20 3d 20 70 4c 65 66 74 2d 3e 70 54 61 62 3b 0a   = pLeft->pTab;.
25b0: 20 20 20 20 54 61 62 6c 65 20 2a 70 52 69 67 68      Table *pRigh
25c0: 74 54 61 62 20 3d 20 70 52 69 67 68 74 2d 3e 70  tTab = pRight->p
25d0: 54 61 62 3b 0a 0a 20 20 20 20 69 66 28 20 70 4c  Tab;..    if( pL
25e0: 65 66 74 54 61 62 3d 3d 30 20 7c 7c 20 70 52 69  eftTab==0 || pRi
25f0: 67 68 74 54 61 62 3d 3d 30 20 29 20 63 6f 6e 74  ghtTab==0 ) cont
2600: 69 6e 75 65 3b 0a 0a 20 20 20 20 2f 2a 20 57 68  inue;..    /* Wh
2610: 65 6e 20 74 68 65 20 4e 41 54 55 52 41 4c 20 6b  en the NATURAL k
2620: 65 79 77 6f 72 64 20 69 73 20 70 72 65 73 65 6e  eyword is presen
2630: 74 2c 20 61 64 64 20 57 48 45 52 45 20 63 6c 61  t, add WHERE cla
2640: 75 73 65 20 74 65 72 6d 73 20 66 6f 72 0a 20 20  use terms for.  
2650: 20 20 2a 2a 20 65 76 65 72 79 20 63 6f 6c 75 6d    ** every colum
2660: 6e 20 74 68 61 74 20 74 68 65 20 74 77 6f 20 74  n that the two t
2670: 61 62 6c 65 73 20 68 61 76 65 20 69 6e 20 63 6f  ables have in co
2680: 6d 6d 6f 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  mmon..    */.   
2690: 20 69 66 28 20 70 52 69 67 68 74 2d 3e 6a 6f 69   if( pRight->joi
26a0: 6e 74 79 70 65 20 26 20 4a 54 5f 4e 41 54 55 52  ntype & JT_NATUR
26b0: 41 4c 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  AL ){.      if( 
26c0: 70 52 69 67 68 74 2d 3e 70 4f 6e 20 7c 7c 20 70  pRight->pOn || p
26d0: 52 69 67 68 74 2d 3e 70 55 73 69 6e 67 20 29 7b  Right->pUsing ){
26e0: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
26f0: 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
2700: 20 22 61 20 4e 41 54 55 52 41 4c 20 6a 6f 69 6e   "a NATURAL join
2710: 20 6d 61 79 20 6e 6f 74 20 68 61 76 65 20 22 0a   may not have ".
2720: 20 20 20 20 20 20 20 20 20 20 20 22 61 6e 20 4f             "an O
2730: 4e 20 6f 72 20 55 53 49 4e 47 20 63 6c 61 75 73  N or USING claus
2740: 65 22 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20  e", 0);.        
2750: 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 20 20  return 1;.      
2760: 7d 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b  }.      for(j=0;
2770: 20 6a 3c 70 4c 65 66 74 54 61 62 2d 3e 6e 43 6f   j<pLeftTab->nCo
2780: 6c 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20  l; j++){.       
2790: 20 63 68 61 72 20 2a 7a 4e 61 6d 65 20 3d 20 70   char *zName = p
27a0: 4c 65 66 74 54 61 62 2d 3e 61 43 6f 6c 5b 6a 5d  LeftTab->aCol[j]
27b0: 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20 20 20  .zName;.        
27c0: 69 66 28 20 63 6f 6c 75 6d 6e 49 6e 64 65 78 28  if( columnIndex(
27d0: 70 52 69 67 68 74 54 61 62 2c 20 7a 4e 61 6d 65  pRightTab, zName
27e0: 29 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )>=0 ){.        
27f0: 20 20 61 64 64 57 68 65 72 65 54 65 72 6d 28 70    addWhereTerm(p
2800: 50 61 72 73 65 2c 20 7a 4e 61 6d 65 2c 20 70 4c  Parse, zName, pL
2810: 65 66 74 54 61 62 2c 20 70 4c 65 66 74 2d 3e 7a  eftTab, pLeft->z
2820: 41 6c 69 61 73 2c 20 0a 20 20 20 20 20 20 20 20  Alias, .        
2830: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2840: 20 20 20 20 20 20 70 52 69 67 68 74 54 61 62 2c        pRightTab,
2850: 20 70 52 69 67 68 74 2d 3e 7a 41 6c 69 61 73 2c   pRight->zAlias,
2860: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
2870: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
2880: 52 69 67 68 74 2d 3e 69 43 75 72 73 6f 72 2c 20  Right->iCursor, 
2890: 26 70 2d 3e 70 57 68 65 72 65 29 3b 0a 20 20 20  &p->pWhere);.   
28a0: 20 20 20 20 20 20 20 0a 20 20 20 20 20 20 20 20         .        
28b0: 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  }.      }.    }.
28c0: 0a 20 20 20 20 2f 2a 20 44 69 73 61 6c 6c 6f 77  .    /* Disallow
28d0: 20 62 6f 74 68 20 4f 4e 20 61 6e 64 20 55 53 49   both ON and USI
28e0: 4e 47 20 63 6c 61 75 73 65 73 20 69 6e 20 74 68  NG clauses in th
28f0: 65 20 73 61 6d 65 20 6a 6f 69 6e 0a 20 20 20 20  e same join.    
2900: 2a 2f 0a 20 20 20 20 69 66 28 20 70 52 69 67 68  */.    if( pRigh
2910: 74 2d 3e 70 4f 6e 20 26 26 20 70 52 69 67 68 74  t->pOn && pRight
2920: 2d 3e 70 55 73 69 6e 67 20 29 7b 0a 20 20 20 20  ->pUsing ){.    
2930: 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
2940: 67 28 70 50 61 72 73 65 2c 20 22 63 61 6e 6e 6f  g(pParse, "canno
2950: 74 20 68 61 76 65 20 62 6f 74 68 20 4f 4e 20 61  t have both ON a
2960: 6e 64 20 55 53 49 4e 47 20 22 0a 20 20 20 20 20  nd USING ".     
2970: 20 20 20 22 63 6c 61 75 73 65 73 20 69 6e 20 74     "clauses in t
2980: 68 65 20 73 61 6d 65 20 6a 6f 69 6e 22 29 3b 0a  he same join");.
2990: 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a        return 1;.
29a0: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 41 64      }..    /* Ad
29b0: 64 20 74 68 65 20 4f 4e 20 63 6c 61 75 73 65 20  d the ON clause 
29c0: 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68  to the end of th
29d0: 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 2c 20  e WHERE clause, 
29e0: 63 6f 6e 6e 65 63 74 65 64 20 62 79 0a 20 20 20  connected by.   
29f0: 20 2a 2a 20 61 6e 20 41 4e 44 20 6f 70 65 72 61   ** an AND opera
2a00: 74 6f 72 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  tor..    */.    
2a10: 69 66 28 20 70 52 69 67 68 74 2d 3e 70 4f 6e 20  if( pRight->pOn 
2a20: 29 7b 0a 20 20 20 20 20 20 73 65 74 4a 6f 69 6e  ){.      setJoin
2a30: 45 78 70 72 28 70 52 69 67 68 74 2d 3e 70 4f 6e  Expr(pRight->pOn
2a40: 2c 20 70 52 69 67 68 74 2d 3e 69 43 75 72 73 6f  , pRight->iCurso
2a50: 72 29 3b 0a 20 20 20 20 20 20 70 2d 3e 70 57 68  r);.      p->pWh
2a60: 65 72 65 20 3d 20 73 71 6c 69 74 65 33 45 78 70  ere = sqlite3Exp
2a70: 72 41 6e 64 28 70 50 61 72 73 65 2d 3e 64 62 2c  rAnd(pParse->db,
2a80: 20 70 2d 3e 70 57 68 65 72 65 2c 20 70 52 69 67   p->pWhere, pRig
2a90: 68 74 2d 3e 70 4f 6e 29 3b 0a 20 20 20 20 20 20  ht->pOn);.      
2aa0: 70 52 69 67 68 74 2d 3e 70 4f 6e 20 3d 20 30 3b  pRight->pOn = 0;
2ab0: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43  .    }..    /* C
2ac0: 72 65 61 74 65 20 65 78 74 72 61 20 74 65 72 6d  reate extra term
2ad0: 73 20 6f 6e 20 74 68 65 20 57 48 45 52 45 20 63  s on the WHERE c
2ae0: 6c 61 75 73 65 20 66 6f 72 20 65 61 63 68 20 63  lause for each c
2af0: 6f 6c 75 6d 6e 20 6e 61 6d 65 64 0a 20 20 20 20  olumn named.    
2b00: 2a 2a 20 69 6e 20 74 68 65 20 55 53 49 4e 47 20  ** in the USING 
2b10: 63 6c 61 75 73 65 2e 20 20 45 78 61 6d 70 6c 65  clause.  Example
2b20: 3a 20 49 66 20 74 68 65 20 74 77 6f 20 74 61 62  : If the two tab
2b30: 6c 65 73 20 74 6f 20 62 65 20 6a 6f 69 6e 65 64  les to be joined
2b40: 20 61 72 65 20 0a 20 20 20 20 2a 2a 20 41 20 61   are .    ** A a
2b50: 6e 64 20 42 20 61 6e 64 20 74 68 65 20 55 53 49  nd B and the USI
2b60: 4e 47 20 63 6c 61 75 73 65 20 6e 61 6d 65 73 20  NG clause names 
2b70: 58 2c 20 59 2c 20 61 6e 64 20 5a 2c 20 74 68 65  X, Y, and Z, the
2b80: 6e 20 61 64 64 20 74 68 69 73 0a 20 20 20 20 2a  n add this.    *
2b90: 2a 20 74 6f 20 74 68 65 20 57 48 45 52 45 20 63  * to the WHERE c
2ba0: 6c 61 75 73 65 3a 20 20 20 20 41 2e 58 3d 42 2e  lause:    A.X=B.
2bb0: 58 20 41 4e 44 20 41 2e 59 3d 42 2e 59 20 41 4e  X AND A.Y=B.Y AN
2bc0: 44 20 41 2e 5a 3d 42 2e 5a 0a 20 20 20 20 2a 2a  D A.Z=B.Z.    **
2bd0: 20 52 65 70 6f 72 74 20 61 6e 20 65 72 72 6f 72   Report an error
2be0: 20 69 66 20 61 6e 79 20 63 6f 6c 75 6d 6e 20 6d   if any column m
2bf0: 65 6e 74 69 6f 6e 65 64 20 69 6e 20 74 68 65 20  entioned in the 
2c00: 55 53 49 4e 47 20 63 6c 61 75 73 65 20 69 73 0a  USING clause is.
2c10: 20 20 20 20 2a 2a 20 6e 6f 74 20 63 6f 6e 74 61      ** not conta
2c20: 69 6e 65 64 20 69 6e 20 62 6f 74 68 20 74 61 62  ined in both tab
2c30: 6c 65 73 20 74 6f 20 62 65 20 6a 6f 69 6e 65 64  les to be joined
2c40: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
2c50: 20 70 52 69 67 68 74 2d 3e 70 55 73 69 6e 67 20   pRight->pUsing 
2c60: 29 7b 0a 20 20 20 20 20 20 49 64 4c 69 73 74 20  ){.      IdList 
2c70: 2a 70 4c 69 73 74 20 3d 20 70 52 69 67 68 74 2d  *pList = pRight-
2c80: 3e 70 55 73 69 6e 67 3b 0a 20 20 20 20 20 20 66  >pUsing;.      f
2c90: 6f 72 28 6a 3d 30 3b 20 6a 3c 70 4c 69 73 74 2d  or(j=0; j<pList-
2ca0: 3e 6e 49 64 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20  >nId; j++){.    
2cb0: 20 20 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 20      char *zName 
2cc0: 3d 20 70 4c 69 73 74 2d 3e 61 5b 6a 5d 2e 7a 4e  = pList->a[j].zN
2cd0: 61 6d 65 3b 0a 20 20 20 20 20 20 20 20 69 66 28  ame;.        if(
2ce0: 20 63 6f 6c 75 6d 6e 49 6e 64 65 78 28 70 4c 65   columnIndex(pLe
2cf0: 66 74 54 61 62 2c 20 7a 4e 61 6d 65 29 3c 30 20  ftTab, zName)<0 
2d00: 7c 7c 20 63 6f 6c 75 6d 6e 49 6e 64 65 78 28 70  || columnIndex(p
2d10: 52 69 67 68 74 54 61 62 2c 20 7a 4e 61 6d 65 29  RightTab, zName)
2d20: 3c 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  <0 ){.          
2d30: 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
2d40: 70 50 61 72 73 65 2c 20 22 63 61 6e 6e 6f 74 20  pParse, "cannot 
2d50: 6a 6f 69 6e 20 75 73 69 6e 67 20 63 6f 6c 75 6d  join using colum
2d60: 6e 20 25 73 20 2d 20 63 6f 6c 75 6d 6e 20 22 0a  n %s - column ".
2d70: 20 20 20 20 20 20 20 20 20 20 20 20 22 6e 6f 74              "not
2d80: 20 70 72 65 73 65 6e 74 20 69 6e 20 62 6f 74 68   present in both
2d90: 20 74 61 62 6c 65 73 22 2c 20 7a 4e 61 6d 65 29   tables", zName)
2da0: 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75  ;.          retu
2db0: 72 6e 20 31 3b 0a 20 20 20 20 20 20 20 20 7d 0a  rn 1;.        }.
2dc0: 20 20 20 20 20 20 20 20 61 64 64 57 68 65 72 65          addWhere
2dd0: 54 65 72 6d 28 70 50 61 72 73 65 2c 20 7a 4e 61  Term(pParse, zNa
2de0: 6d 65 2c 20 70 4c 65 66 74 54 61 62 2c 20 70 4c  me, pLeftTab, pL
2df0: 65 66 74 2d 3e 7a 41 6c 69 61 73 2c 20 0a 20 20  eft->zAlias, .  
2e00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e10: 20 20 20 20 20 20 20 20 20 20 70 52 69 67 68 74            pRight
2e20: 54 61 62 2c 20 70 52 69 67 68 74 2d 3e 7a 41 6c  Tab, pRight->zAl
2e30: 69 61 73 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ias,.           
2e40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e50: 20 70 52 69 67 68 74 2d 3e 69 43 75 72 73 6f 72   pRight->iCursor
2e60: 2c 20 26 70 2d 3e 70 57 68 65 72 65 29 3b 0a 20  , &p->pWhere);. 
2e70: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
2e80: 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a  .  return 0;.}..
2e90: 2f 2a 0a 2a 2a 20 49 6e 73 65 72 74 20 63 6f 64  /*.** Insert cod
2ea0: 65 20 69 6e 74 6f 20 22 76 22 20 74 68 61 74 20  e into "v" that 
2eb0: 77 69 6c 6c 20 70 75 73 68 20 74 68 65 20 72 65  will push the re
2ec0: 63 6f 72 64 20 6f 6e 20 74 68 65 20 74 6f 70 20  cord on the top 
2ed0: 6f 66 20 74 68 65 0a 2a 2a 20 73 74 61 63 6b 20  of the.** stack 
2ee0: 69 6e 74 6f 20 74 68 65 20 73 6f 72 74 65 72 2e  into the sorter.
2ef0: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
2f00: 70 75 73 68 4f 6e 74 6f 53 6f 72 74 65 72 28 0a  pushOntoSorter(.
2f10: 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
2f20: 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73           /* Pars
2f30: 65 72 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  er context */.  
2f40: 45 78 70 72 4c 69 73 74 20 2a 70 4f 72 64 65 72  ExprList *pOrder
2f50: 42 79 2c 20 20 20 20 2f 2a 20 54 68 65 20 4f 52  By,    /* The OR
2f60: 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 2a 2f  DER BY clause */
2f70: 0a 20 20 53 65 6c 65 63 74 20 2a 70 53 65 6c 65  .  Select *pSele
2f80: 63 74 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65  ct        /* The
2f90: 20 77 68 6f 6c 65 20 53 45 4c 45 43 54 20 73 74   whole SELECT st
2fa0: 61 74 65 6d 65 6e 74 20 2a 2f 0a 29 7b 0a 20 20  atement */.){.  
2fb0: 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65  Vdbe *v = pParse
2fc0: 2d 3e 70 56 64 62 65 3b 0a 20 20 73 71 6c 69 74  ->pVdbe;.  sqlit
2fd0: 65 33 45 78 70 72 43 6f 64 65 45 78 70 72 4c 69  e3ExprCodeExprLi
2fe0: 73 74 28 70 50 61 72 73 65 2c 20 70 4f 72 64 65  st(pParse, pOrde
2ff0: 72 42 79 2c 20 30 29 3b 0a 20 20 73 71 6c 69 74  rBy, 0);.  sqlit
3000: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
3010: 4f 50 5f 53 65 71 75 65 6e 63 65 2c 20 70 4f 72  OP_Sequence, pOr
3020: 64 65 72 42 79 2d 3e 69 45 43 75 72 73 6f 72 2c  derBy->iECursor,
3030: 20 30 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64   0);.  sqlite3Vd
3040: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 50  beAddOp2(v, OP_P
3050: 75 6c 6c 2c 20 70 4f 72 64 65 72 42 79 2d 3e 6e  ull, pOrderBy->n
3060: 45 78 70 72 20 2b 20 31 2c 20 30 29 3b 0a 20 20  Expr + 1, 0);.  
3070: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
3080: 32 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f  2(v, OP_MakeReco
3090: 72 64 2c 20 70 4f 72 64 65 72 42 79 2d 3e 6e 45  rd, pOrderBy->nE
30a0: 78 70 72 20 2b 20 32 2c 20 30 29 3b 0a 20 20 73  xpr + 2, 0);.  s
30b0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
30c0: 28 76 2c 20 4f 50 5f 49 64 78 49 6e 73 65 72 74  (v, OP_IdxInsert
30d0: 2c 20 70 4f 72 64 65 72 42 79 2d 3e 69 45 43 75  , pOrderBy->iECu
30e0: 72 73 6f 72 2c 20 30 29 3b 0a 20 20 69 66 28 20  rsor, 0);.  if( 
30f0: 70 53 65 6c 65 63 74 2d 3e 69 4c 69 6d 69 74 3e  pSelect->iLimit>
3100: 3d 30 20 29 7b 0a 20 20 20 20 69 6e 74 20 61 64  =0 ){.    int ad
3110: 64 72 31 2c 20 61 64 64 72 32 3b 0a 20 20 20 20  dr1, addr2;.    
3120: 61 64 64 72 31 20 3d 20 73 71 6c 69 74 65 33 56  addr1 = sqlite3V
3130: 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
3140: 49 66 4d 65 6d 5a 65 72 6f 2c 20 70 53 65 6c 65  IfMemZero, pSele
3150: 63 74 2d 3e 69 4c 69 6d 69 74 2b 31 2c 20 30 29  ct->iLimit+1, 0)
3160: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
3170: 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 41 64  eAddOp2(v, OP_Ad
3180: 64 49 6d 6d 2c 20 70 53 65 6c 65 63 74 2d 3e 69  dImm, pSelect->i
3190: 4c 69 6d 69 74 2b 31 2c 20 2d 31 29 3b 0a 20 20  Limit+1, -1);.  
31a0: 20 20 61 64 64 72 32 20 3d 20 73 71 6c 69 74 65    addr2 = sqlite
31b0: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
31c0: 50 5f 47 6f 74 6f 2c 20 30 2c 20 30 29 3b 0a 20  P_Goto, 0, 0);. 
31d0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75     sqlite3VdbeJu
31e0: 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72 31 29  mpHere(v, addr1)
31f0: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
3200: 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4c 61  eAddOp2(v, OP_La
3210: 73 74 2c 20 70 4f 72 64 65 72 42 79 2d 3e 69 45  st, pOrderBy->iE
3220: 43 75 72 73 6f 72 2c 20 30 29 3b 0a 20 20 20 20  Cursor, 0);.    
3230: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
3240: 32 28 76 2c 20 4f 50 5f 44 65 6c 65 74 65 2c 20  2(v, OP_Delete, 
3250: 70 4f 72 64 65 72 42 79 2d 3e 69 45 43 75 72 73  pOrderBy->iECurs
3260: 6f 72 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69  or, 0);.    sqli
3270: 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28  te3VdbeJumpHere(
3280: 76 2c 20 61 64 64 72 32 29 3b 0a 20 20 20 20 70  v, addr2);.    p
3290: 53 65 6c 65 63 74 2d 3e 69 4c 69 6d 69 74 20 3d  Select->iLimit =
32a0: 20 2d 31 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a   -1;.  }.}../*.*
32b0: 2a 20 41 64 64 20 63 6f 64 65 20 74 6f 20 69 6d  * Add code to im
32c0: 70 6c 65 6d 65 6e 74 20 74 68 65 20 4f 46 46 53  plement the OFFS
32d0: 45 54 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  ET.*/.static voi
32e0: 64 20 63 6f 64 65 4f 66 66 73 65 74 28 0a 20 20  d codeOffset(.  
32f0: 56 64 62 65 20 2a 76 2c 20 20 20 20 20 20 20 20  Vdbe *v,        
3300: 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f    /* Generate co
3310: 64 65 20 69 6e 74 6f 20 74 68 69 73 20 56 4d 20  de into this VM 
3320: 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 2c 20  */.  Select *p, 
3330: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 53 45         /* The SE
3340: 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 62  LECT statement b
3350: 65 69 6e 67 20 63 6f 64 65 64 20 2a 2f 0a 20 20  eing coded */.  
3360: 69 6e 74 20 69 43 6f 6e 74 69 6e 75 65 2c 20 20  int iContinue,  
3370: 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20 74    /* Jump here t
3380: 6f 20 73 6b 69 70 20 74 68 65 20 63 75 72 72 65  o skip the curre
3390: 6e 74 20 72 65 63 6f 72 64 20 2a 2f 0a 20 20 69  nt record */.  i
33a0: 6e 74 20 6e 50 6f 70 20 20 20 20 20 20 20 20 20  nt nPop         
33b0: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 74 69   /* Number of ti
33c0: 6d 65 73 20 74 6f 20 70 6f 70 20 73 74 61 63 6b  mes to pop stack
33d0: 20 77 68 65 6e 20 6a 75 6d 70 69 6e 67 20 2a 2f   when jumping */
33e0: 0a 29 7b 0a 20 20 69 66 28 20 70 2d 3e 69 4f 66  .){.  if( p->iOf
33f0: 66 73 65 74 3e 3d 30 20 26 26 20 69 43 6f 6e 74  fset>=0 && iCont
3400: 69 6e 75 65 21 3d 30 20 29 7b 0a 20 20 20 20 69  inue!=0 ){.    i
3410: 6e 74 20 61 64 64 72 3b 0a 20 20 20 20 73 71 6c  nt addr;.    sql
3420: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
3430: 2c 20 4f 50 5f 41 64 64 49 6d 6d 2c 20 70 2d 3e  , OP_AddImm, p->
3440: 69 4f 66 66 73 65 74 2c 20 2d 31 29 3b 0a 20 20  iOffset, -1);.  
3450: 20 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65 33    addr = sqlite3
3460: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
3470: 5f 49 66 4d 65 6d 4e 65 67 2c 20 70 2d 3e 69 4f  _IfMemNeg, p->iO
3480: 66 66 73 65 74 2c 20 30 29 3b 0a 20 20 20 20 69  ffset, 0);.    i
3490: 66 28 20 6e 50 6f 70 3e 30 20 29 7b 0a 20 20 20  f( nPop>0 ){.   
34a0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
34b0: 64 4f 70 32 28 76 2c 20 4f 50 5f 50 6f 70 2c 20  dOp2(v, OP_Pop, 
34c0: 6e 50 6f 70 2c 20 30 29 3b 0a 20 20 20 20 7d 0a  nPop, 0);.    }.
34d0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
34e0: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 74 6f  ddOp2(v, OP_Goto
34f0: 2c 20 30 2c 20 69 43 6f 6e 74 69 6e 75 65 29 3b  , 0, iContinue);
3500: 0a 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74  .    VdbeComment
3510: 28 28 76 2c 20 22 73 6b 69 70 20 4f 46 46 53 45  ((v, "skip OFFSE
3520: 54 20 72 65 63 6f 72 64 73 22 29 29 3b 0a 20 20  T records"));.  
3530: 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d    sqlite3VdbeJum
3540: 70 48 65 72 65 28 76 2c 20 61 64 64 72 29 3b 0a  pHere(v, addr);.
3550: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64    }.}../*.** Add
3560: 20 63 6f 64 65 20 74 68 61 74 20 77 69 6c 6c 20   code that will 
3570: 63 68 65 63 6b 20 74 6f 20 6d 61 6b 65 20 73 75  check to make su
3580: 72 65 20 74 68 65 20 74 6f 70 20 4e 20 65 6c 65  re the top N ele
3590: 6d 65 6e 74 73 20 6f 66 20 74 68 65 0a 2a 2a 20  ments of the.** 
35a0: 73 74 61 63 6b 20 61 72 65 20 64 69 73 74 69 6e  stack are distin
35b0: 63 74 2e 20 20 69 54 61 62 20 69 73 20 61 20 73  ct.  iTab is a s
35c0: 6f 72 74 69 6e 67 20 69 6e 64 65 78 20 74 68 61  orting index tha
35d0: 74 20 68 6f 6c 64 73 20 70 72 65 76 69 6f 75 73  t holds previous
35e0: 6c 79 0a 2a 2a 20 73 65 65 6e 20 63 6f 6d 62 69  ly.** seen combi
35f0: 6e 61 74 69 6f 6e 73 20 6f 66 20 74 68 65 20 4e  nations of the N
3600: 20 76 61 6c 75 65 73 2e 20 20 41 20 6e 65 77 20   values.  A new 
3610: 65 6e 74 72 79 20 69 73 20 6d 61 64 65 20 69 6e  entry is made in
3620: 20 69 54 61 62 0a 2a 2a 20 69 66 20 74 68 65 20   iTab.** if the 
3630: 63 75 72 72 65 6e 74 20 4e 20 76 61 6c 75 65 73  current N values
3640: 20 61 72 65 20 6e 65 77 2e 0a 2a 2a 0a 2a 2a 20   are new..**.** 
3650: 41 20 6a 75 6d 70 20 74 6f 20 61 64 64 72 52 65  A jump to addrRe
3660: 70 65 61 74 20 69 73 20 6d 61 64 65 20 61 6e 64  peat is made and
3670: 20 74 68 65 20 4e 2b 31 20 76 61 6c 75 65 73 20   the N+1 values 
3680: 61 72 65 20 70 6f 70 70 65 64 20 66 72 6f 6d 20  are popped from 
3690: 74 68 65 0a 2a 2a 20 73 74 61 63 6b 20 69 66 20  the.** stack if 
36a0: 74 68 65 20 74 6f 70 20 4e 20 65 6c 65 6d 65 6e  the top N elemen
36b0: 74 73 20 61 72 65 20 6e 6f 74 20 64 69 73 74 69  ts are not disti
36c0: 6e 63 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  nct..*/.static v
36d0: 6f 69 64 20 63 6f 64 65 44 69 73 74 69 6e 63 74  oid codeDistinct
36e0: 5f 4f 4c 44 28 0a 20 20 56 64 62 65 20 2a 76 2c  _OLD(.  Vdbe *v,
36f0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 47 65             /* Ge
3700: 6e 65 72 61 74 65 20 63 6f 64 65 20 69 6e 74 6f  nerate code into
3710: 20 74 68 69 73 20 56 4d 20 2a 2f 0a 20 20 69 6e   this VM */.  in
3720: 74 20 69 54 61 62 2c 20 20 20 20 20 20 20 20 20  t iTab,         
3730: 20 2f 2a 20 41 20 73 6f 72 74 69 6e 67 20 69 6e   /* A sorting in
3740: 64 65 78 20 75 73 65 64 20 74 6f 20 74 65 73 74  dex used to test
3750: 20 66 6f 72 20 64 69 73 74 69 6e 63 74 6e 65 73   for distinctnes
3760: 73 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 52  s */.  int addrR
3770: 65 70 65 61 74 2c 20 20 20 20 2f 2a 20 4a 75 6d  epeat,    /* Jum
3780: 70 20 74 6f 20 68 65 72 65 20 69 66 20 6e 6f 74  p to here if not
3790: 20 64 69 73 74 69 6e 63 74 20 2a 2f 0a 20 20 69   distinct */.  i
37a0: 6e 74 20 4e 20 20 20 20 20 20 20 20 20 20 20 20  nt N            
37b0: 20 20 2f 2a 20 54 68 65 20 74 6f 70 20 4e 20 65    /* The top N e
37c0: 6c 65 6d 65 6e 74 73 20 6f 66 20 74 68 65 20 73  lements of the s
37d0: 74 61 63 6b 20 6d 75 73 74 20 62 65 20 64 69 73  tack must be dis
37e0: 74 69 6e 63 74 20 2a 2f 0a 29 7b 0a 20 20 73 71  tinct */.){.  sq
37f0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
3800: 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64  v, OP_MakeRecord
3810: 2c 20 2d 4e 2c 20 30 29 3b 0a 20 20 73 71 6c 69  , -N, 0);.  sqli
3820: 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
3830: 20 4f 50 5f 44 69 73 74 69 6e 63 74 2c 20 69 54   OP_Distinct, iT
3840: 61 62 2c 20 73 71 6c 69 74 65 33 56 64 62 65 43  ab, sqlite3VdbeC
3850: 75 72 72 65 6e 74 41 64 64 72 28 76 29 2b 33 29  urrentAddr(v)+3)
3860: 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41  ;.  sqlite3VdbeA
3870: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 50 6f 70 2c  ddOp2(v, OP_Pop,
3880: 20 4e 2b 31 2c 20 30 29 3b 0a 20 20 73 71 6c 69   N+1, 0);.  sqli
3890: 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
38a0: 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 61 64 64   OP_Goto, 0, add
38b0: 72 52 65 70 65 61 74 29 3b 0a 20 20 56 64 62 65  rRepeat);.  Vdbe
38c0: 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 73 6b 69  Comment((v, "ski
38d0: 70 20 69 6e 64 69 73 74 69 6e 63 74 20 72 65 63  p indistinct rec
38e0: 6f 72 64 73 22 29 29 3b 0a 20 20 73 71 6c 69 74  ords"));.  sqlit
38f0: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
3900: 4f 50 5f 49 64 78 49 6e 73 65 72 74 2c 20 69 54  OP_IdxInsert, iT
3910: 61 62 2c 20 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ab, 0);.}../*.**
3920: 20 41 64 64 20 63 6f 64 65 20 74 68 61 74 20 77   Add code that w
3930: 69 6c 6c 20 63 68 65 63 6b 20 74 6f 20 6d 61 6b  ill check to mak
3940: 65 20 73 75 72 65 20 74 68 65 20 74 6f 70 20 4e  e sure the top N
3950: 20 65 6c 65 6d 65 6e 74 73 20 6f 66 20 74 68 65   elements of the
3960: 0a 2a 2a 20 73 74 61 63 6b 20 61 72 65 20 64 69  .** stack are di
3970: 73 74 69 6e 63 74 2e 20 20 69 54 61 62 20 69 73  stinct.  iTab is
3980: 20 61 20 73 6f 72 74 69 6e 67 20 69 6e 64 65 78   a sorting index
3990: 20 74 68 61 74 20 68 6f 6c 64 73 20 70 72 65 76   that holds prev
39a0: 69 6f 75 73 6c 79 0a 2a 2a 20 73 65 65 6e 20 63  iously.** seen c
39b0: 6f 6d 62 69 6e 61 74 69 6f 6e 73 20 6f 66 20 74  ombinations of t
39c0: 68 65 20 4e 20 76 61 6c 75 65 73 2e 20 20 41 20  he N values.  A 
39d0: 6e 65 77 20 65 6e 74 72 79 20 69 73 20 6d 61 64  new entry is mad
39e0: 65 20 69 6e 20 69 54 61 62 0a 2a 2a 20 69 66 20  e in iTab.** if 
39f0: 74 68 65 20 63 75 72 72 65 6e 74 20 4e 20 76 61  the current N va
3a00: 6c 75 65 73 20 61 72 65 20 6e 65 77 2e 0a 2a 2a  lues are new..**
3a10: 0a 2a 2a 20 41 20 6a 75 6d 70 20 74 6f 20 61 64  .** A jump to ad
3a20: 64 72 52 65 70 65 61 74 20 69 73 20 6d 61 64 65  drRepeat is made
3a30: 20 61 6e 64 20 74 68 65 20 4e 2b 31 20 76 61 6c   and the N+1 val
3a40: 75 65 73 20 61 72 65 20 70 6f 70 70 65 64 20 66  ues are popped f
3a50: 72 6f 6d 20 74 68 65 0a 2a 2a 20 73 74 61 63 6b  rom the.** stack
3a60: 20 69 66 20 74 68 65 20 74 6f 70 20 4e 20 65 6c   if the top N el
3a70: 65 6d 65 6e 74 73 20 61 72 65 20 6e 6f 74 20 64  ements are not d
3a80: 69 73 74 69 6e 63 74 2e 0a 2a 2f 0a 73 74 61 74  istinct..*/.stat
3a90: 69 63 20 76 6f 69 64 20 63 6f 64 65 44 69 73 74  ic void codeDist
3aa0: 69 6e 63 74 28 0a 20 20 56 64 62 65 20 2a 76 2c  inct(.  Vdbe *v,
3ab0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 47 65             /* Ge
3ac0: 6e 65 72 61 74 65 20 63 6f 64 65 20 69 6e 74 6f  nerate code into
3ad0: 20 74 68 69 73 20 56 4d 20 2a 2f 0a 20 20 69 6e   this VM */.  in
3ae0: 74 20 69 54 61 62 2c 20 20 20 20 20 20 20 20 20  t iTab,         
3af0: 20 2f 2a 20 41 20 73 6f 72 74 69 6e 67 20 69 6e   /* A sorting in
3b00: 64 65 78 20 75 73 65 64 20 74 6f 20 74 65 73 74  dex used to test
3b10: 20 66 6f 72 20 64 69 73 74 69 6e 63 74 6e 65 73   for distinctnes
3b20: 73 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 52  s */.  int addrR
3b30: 65 70 65 61 74 2c 20 20 20 20 2f 2a 20 4a 75 6d  epeat,    /* Jum
3b40: 70 20 74 6f 20 68 65 72 65 20 69 66 20 6e 6f 74  p to here if not
3b50: 20 64 69 73 74 69 6e 63 74 20 2a 2f 0a 20 20 69   distinct */.  i
3b60: 6e 74 20 69 4d 65 6d 20 20 20 20 20 20 20 20 20  nt iMem         
3b70: 20 20 2f 2a 20 46 69 72 73 74 20 65 6c 65 6d 65    /* First eleme
3b80: 6e 74 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74  nt */.){.  sqlit
3b90: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
3ba0: 4f 50 5f 52 65 67 4d 61 6b 65 52 65 63 2c 20 69  OP_RegMakeRec, i
3bb0: 4d 65 6d 2c 20 30 29 3b 0a 20 20 73 71 6c 69 74  Mem, 0);.  sqlit
3bc0: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
3bd0: 4f 50 5f 44 69 73 74 69 6e 63 74 2c 20 69 54 61  OP_Distinct, iTa
3be0: 62 2c 20 73 71 6c 69 74 65 33 56 64 62 65 43 75  b, sqlite3VdbeCu
3bf0: 72 72 65 6e 74 41 64 64 72 28 76 29 2b 33 29 3b  rrentAddr(v)+3);
3c00: 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  .  sqlite3VdbeAd
3c10: 64 4f 70 32 28 76 2c 20 4f 50 5f 50 6f 70 2c 20  dOp2(v, OP_Pop, 
3c20: 31 2c 20 30 29 3b 0a 20 20 73 71 6c 69 74 65 33  1, 0);.  sqlite3
3c30: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
3c40: 5f 47 6f 74 6f 2c 20 30 2c 20 61 64 64 72 52 65  _Goto, 0, addrRe
3c50: 70 65 61 74 29 3b 0a 20 20 56 64 62 65 43 6f 6d  peat);.  VdbeCom
3c60: 6d 65 6e 74 28 28 76 2c 20 22 73 6b 69 70 20 69  ment((v, "skip i
3c70: 6e 64 69 73 74 69 6e 63 74 20 72 65 63 6f 72 64  ndistinct record
3c80: 73 22 29 29 3b 0a 20 20 73 71 6c 69 74 65 33 56  s"));.  sqlite3V
3c90: 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
3ca0: 49 64 78 49 6e 73 65 72 74 2c 20 69 54 61 62 2c  IdxInsert, iTab,
3cb0: 20 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65   0);.}../*.** Ge
3cc0: 6e 65 72 61 74 65 20 61 6e 20 65 72 72 6f 72 20  nerate an error 
3cd0: 6d 65 73 73 61 67 65 20 77 68 65 6e 20 61 20 53  message when a S
3ce0: 45 4c 45 43 54 20 69 73 20 75 73 65 64 20 77 69  ELECT is used wi
3cf0: 74 68 69 6e 20 61 20 73 75 62 65 78 70 72 65 73  thin a subexpres
3d00: 73 69 6f 6e 0a 2a 2a 20 28 65 78 61 6d 70 6c 65  sion.** (example
3d10: 3a 20 20 22 61 20 49 4e 20 28 53 45 4c 45 43 54  :  "a IN (SELECT
3d20: 20 2a 20 46 52 4f 4d 20 74 61 62 6c 65 29 22 29   * FROM table)")
3d30: 20 62 75 74 20 69 74 20 68 61 73 20 6d 6f 72 65   but it has more
3d40: 20 74 68 61 6e 20 31 20 72 65 73 75 6c 74 0a 2a   than 1 result.*
3d50: 2a 20 63 6f 6c 75 6d 6e 2e 20 20 57 65 20 64 6f  * column.  We do
3d60: 20 74 68 69 73 20 69 6e 20 61 20 73 75 62 72 6f   this in a subro
3d70: 75 74 69 6e 65 20 62 65 63 61 75 73 65 20 74 68  utine because th
3d80: 65 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 69  e error occurs i
3d90: 6e 20 6d 75 6c 74 69 70 6c 65 0a 2a 2a 20 70 6c  n multiple.** pl
3da0: 61 63 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  aces..*/.static 
3db0: 69 6e 74 20 63 68 65 63 6b 46 6f 72 4d 75 6c 74  int checkForMult
3dc0: 69 43 6f 6c 75 6d 6e 53 65 6c 65 63 74 45 72 72  iColumnSelectErr
3dd0: 6f 72 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  or(.  Parse *pPa
3de0: 72 73 65 2c 20 20 20 20 20 20 20 2f 2a 20 50 61  rse,       /* Pa
3df0: 72 73 65 20 63 6f 6e 74 65 78 74 2e 20 2a 2f 0a  rse context. */.
3e00: 20 20 53 65 6c 65 63 74 44 65 73 74 20 2a 70 44    SelectDest *pD
3e10: 65 73 74 2c 20 20 20 2f 2a 20 44 65 73 74 69 6e  est,   /* Destin
3e20: 61 74 69 6f 6e 20 6f 66 20 53 45 4c 45 43 54 20  ation of SELECT 
3e30: 72 65 73 75 6c 74 73 20 2a 2f 0a 20 20 69 6e 74  results */.  int
3e40: 20 6e 45 78 70 72 20 20 20 20 20 20 20 20 20 20   nExpr          
3e50: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 72    /* Number of r
3e60: 65 73 75 6c 74 20 63 6f 6c 75 6d 6e 73 20 72 65  esult columns re
3e70: 74 75 72 6e 65 64 20 62 79 20 53 45 4c 45 43 54  turned by SELECT
3e80: 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 65 44 65   */.){.  int eDe
3e90: 73 74 20 3d 20 70 44 65 73 74 2d 3e 65 44 65 73  st = pDest->eDes
3ea0: 74 3b 0a 20 20 69 66 28 20 6e 45 78 70 72 3e 31  t;.  if( nExpr>1
3eb0: 20 26 26 20 28 65 44 65 73 74 3d 3d 53 52 54 5f   && (eDest==SRT_
3ec0: 4d 65 6d 20 7c 7c 20 65 44 65 73 74 3d 3d 53 52  Mem || eDest==SR
3ed0: 54 5f 53 65 74 29 20 29 7b 0a 20 20 20 20 73 71  T_Set) ){.    sq
3ee0: 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
3ef0: 61 72 73 65 2c 20 22 6f 6e 6c 79 20 61 20 73 69  arse, "only a si
3f00: 6e 67 6c 65 20 72 65 73 75 6c 74 20 61 6c 6c 6f  ngle result allo
3f10: 77 65 64 20 66 6f 72 20 22 0a 20 20 20 20 20 20  wed for ".      
3f20: 20 22 61 20 53 45 4c 45 43 54 20 74 68 61 74 20   "a SELECT that 
3f30: 69 73 20 70 61 72 74 20 6f 66 20 61 6e 20 65 78  is part of an ex
3f40: 70 72 65 73 73 69 6f 6e 22 29 3b 0a 20 20 20 20  pression");.    
3f50: 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 65 6c 73  return 1;.  }els
3f60: 65 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b  e{.    return 0;
3f70: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  .  }.}../*.** Th
3f80: 69 73 20 72 6f 75 74 69 6e 65 20 67 65 6e 65 72  is routine gener
3f90: 61 74 65 73 20 74 68 65 20 63 6f 64 65 20 66 6f  ates the code fo
3fa0: 72 20 74 68 65 20 69 6e 73 69 64 65 20 6f 66 20  r the inside of 
3fb0: 74 68 65 20 69 6e 6e 65 72 20 6c 6f 6f 70 0a 2a  the inner loop.*
3fc0: 2a 20 6f 66 20 61 20 53 45 4c 45 43 54 2e 0a 2a  * of a SELECT..*
3fd0: 2a 0a 2a 2a 20 49 66 20 73 72 63 54 61 62 20 61  *.** If srcTab a
3fe0: 6e 64 20 6e 43 6f 6c 75 6d 6e 20 61 72 65 20 62  nd nColumn are b
3ff0: 6f 74 68 20 7a 65 72 6f 2c 20 74 68 65 6e 20 74  oth zero, then t
4000: 68 65 20 70 45 4c 69 73 74 20 65 78 70 72 65 73  he pEList expres
4010: 73 69 6f 6e 73 0a 2a 2a 20 61 72 65 20 65 76 61  sions.** are eva
4020: 6c 75 61 74 65 64 20 69 6e 20 6f 72 64 65 72 20  luated in order 
4030: 74 6f 20 67 65 74 20 74 68 65 20 64 61 74 61 20  to get the data 
4040: 66 6f 72 20 74 68 69 73 20 72 6f 77 2e 20 20 49  for this row.  I
4050: 66 20 6e 43 6f 6c 75 6d 6e 3e 30 0a 2a 2a 20 74  f nColumn>0.** t
4060: 68 65 6e 20 64 61 74 61 20 69 73 20 70 75 6c 6c  hen data is pull
4070: 65 64 20 66 72 6f 6d 20 73 72 63 54 61 62 20 61  ed from srcTab a
4080: 6e 64 20 70 45 4c 69 73 74 20 69 73 20 75 73 65  nd pEList is use
4090: 64 20 6f 6e 6c 79 20 74 6f 20 67 65 74 20 74 68  d only to get th
40a0: 65 0a 2a 2a 20 64 61 74 61 74 79 70 65 73 20 66  e.** datatypes f
40b0: 6f 72 20 65 61 63 68 20 63 6f 6c 75 6d 6e 2e 0a  or each column..
40c0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 65  */.static int se
40d0: 6c 65 63 74 49 6e 6e 65 72 4c 6f 6f 70 28 0a 20  lectInnerLoop(. 
40e0: 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
40f0: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
4100: 70 61 72 73 65 72 20 63 6f 6e 74 65 78 74 20 2a  parser context *
4110: 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 2c 20 20  /.  Select *p,  
4120: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
4130: 68 65 20 63 6f 6d 70 6c 65 74 65 20 73 65 6c 65  he complete sele
4140: 63 74 20 73 74 61 74 65 6d 65 6e 74 20 62 65 69  ct statement bei
4150: 6e 67 20 63 6f 64 65 64 20 2a 2f 0a 20 20 45 78  ng coded */.  Ex
4160: 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 2c 20  prList *pEList, 
4170: 20 20 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66        /* List of
4180: 20 76 61 6c 75 65 73 20 62 65 69 6e 67 20 65 78   values being ex
4190: 74 72 61 63 74 65 64 20 2a 2f 0a 20 20 69 6e 74  tracted */.  int
41a0: 20 73 72 63 54 61 62 2c 20 20 20 20 20 20 20 20   srcTab,        
41b0: 20 20 20 20 20 2f 2a 20 50 75 6c 6c 20 64 61 74       /* Pull dat
41c0: 61 20 66 72 6f 6d 20 74 68 69 73 20 74 61 62 6c  a from this tabl
41d0: 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 43 6f 6c 75  e */.  int nColu
41e0: 6d 6e 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f  mn,            /
41f0: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75  * Number of colu
4200: 6d 6e 73 20 69 6e 20 74 68 65 20 73 6f 75 72 63  mns in the sourc
4210: 65 20 74 61 62 6c 65 20 2a 2f 0a 20 20 45 78 70  e table */.  Exp
4220: 72 4c 69 73 74 20 2a 70 4f 72 64 65 72 42 79 2c  rList *pOrderBy,
4230: 20 20 20 20 20 2f 2a 20 49 66 20 6e 6f 74 20 4e       /* If not N
4240: 55 4c 4c 2c 20 73 6f 72 74 20 72 65 73 75 6c 74  ULL, sort result
4250: 73 20 75 73 69 6e 67 20 74 68 69 73 20 6b 65 79  s using this key
4260: 20 2a 2f 0a 20 20 69 6e 74 20 64 69 73 74 69 6e   */.  int distin
4270: 63 74 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ct,           /*
4280: 20 49 66 20 3e 3d 30 2c 20 6d 61 6b 65 20 73 75   If >=0, make su
4290: 72 65 20 72 65 73 75 6c 74 73 20 61 72 65 20 64  re results are d
42a0: 69 73 74 69 6e 63 74 20 2a 2f 0a 20 20 53 65 6c  istinct */.  Sel
42b0: 65 63 74 44 65 73 74 20 2a 70 44 65 73 74 2c 20  ectDest *pDest, 
42c0: 20 20 20 20 20 2f 2a 20 48 6f 77 20 74 6f 20 64       /* How to d
42d0: 69 73 70 6f 73 65 20 6f 66 20 74 68 65 20 72 65  ispose of the re
42e0: 73 75 6c 74 73 20 2a 2f 0a 20 20 69 6e 74 20 69  sults */.  int i
42f0: 43 6f 6e 74 69 6e 75 65 2c 20 20 20 20 20 20 20  Continue,       
4300: 20 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20     /* Jump here 
4310: 74 6f 20 63 6f 6e 74 69 6e 75 65 20 77 69 74 68  to continue with
4320: 20 6e 65 78 74 20 72 6f 77 20 2a 2f 0a 20 20 69   next row */.  i
4330: 6e 74 20 69 42 72 65 61 6b 2c 20 20 20 20 20 20  nt iBreak,      
4340: 20 20 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20 68         /* Jump h
4350: 65 72 65 20 74 6f 20 62 72 65 61 6b 20 6f 75 74  ere to break out
4360: 20 6f 66 20 74 68 65 20 69 6e 6e 65 72 20 6c 6f   of the inner lo
4370: 6f 70 20 2a 2f 0a 20 20 63 68 61 72 20 2a 61 66  op */.  char *af
4380: 66 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  f               
4390: 2f 2a 20 61 66 66 69 6e 69 74 79 20 73 74 72 69  /* affinity stri
43a0: 6e 67 20 69 66 20 65 44 65 73 74 20 69 73 20 53  ng if eDest is S
43b0: 52 54 5f 55 6e 69 6f 6e 20 2a 2f 0a 29 7b 0a 20  RT_Union */.){. 
43c0: 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73   Vdbe *v = pPars
43d0: 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74 20  e->pVdbe;.  int 
43e0: 69 2c 20 6e 3b 0a 20 20 69 6e 74 20 68 61 73 44  i, n;.  int hasD
43f0: 69 73 74 69 6e 63 74 3b 20 20 20 20 20 20 20 20  istinct;        
4400: 2f 2a 20 54 72 75 65 20 69 66 20 74 68 65 20 44  /* True if the D
4410: 49 53 54 49 4e 43 54 20 6b 65 79 77 6f 72 64 20  ISTINCT keyword 
4420: 69 73 20 70 72 65 73 65 6e 74 20 2a 2f 0a 20 20  is present */.  
4430: 69 6e 74 20 69 4d 65 6d 3b 20 20 20 20 20 20 20  int iMem;       
4440: 20 20 20 20 20 20 20 20 2f 2a 20 53 74 61 72 74          /* Start
4450: 20 6f 66 20 6d 65 6d 6f 72 79 20 68 6f 6c 64 69   of memory holdi
4460: 6e 67 20 72 65 73 75 6c 74 20 73 65 74 20 2a 2f  ng result set */
4470: 0a 20 20 69 6e 74 20 65 44 65 73 74 20 3d 20 70  .  int eDest = p
4480: 44 65 73 74 2d 3e 65 44 65 73 74 3b 0a 20 20 69  Dest->eDest;.  i
4490: 6e 74 20 69 50 61 72 6d 20 3d 20 70 44 65 73 74  nt iParm = pDest
44a0: 2d 3e 69 50 61 72 6d 3b 0a 0a 20 20 69 66 28 20  ->iParm;..  if( 
44b0: 76 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b  v==0 ) return 0;
44c0: 0a 20 20 61 73 73 65 72 74 28 20 70 45 4c 69 73  .  assert( pELis
44d0: 74 21 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 49 66  t!=0 );..  /* If
44e0: 20 74 68 65 72 65 20 77 61 73 20 61 20 4c 49 4d   there was a LIM
44f0: 49 54 20 63 6c 61 75 73 65 20 6f 6e 20 74 68 65  IT clause on the
4500: 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
4510: 74 2c 20 74 68 65 6e 20 64 6f 20 74 68 65 20 63  t, then do the c
4520: 68 65 63 6b 0a 20 20 2a 2a 20 74 6f 20 73 65 65  heck.  ** to see
4530: 20 69 66 20 74 68 69 73 20 72 6f 77 20 73 68 6f   if this row sho
4540: 75 6c 64 20 62 65 20 6f 75 74 70 75 74 2e 0a 20  uld be output.. 
4550: 20 2a 2f 0a 20 20 68 61 73 44 69 73 74 69 6e 63   */.  hasDistinc
4560: 74 20 3d 20 64 69 73 74 69 6e 63 74 3e 3d 30 20  t = distinct>=0 
4570: 26 26 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72  && pEList->nExpr
4580: 3e 30 3b 0a 20 20 69 66 28 20 70 4f 72 64 65 72  >0;.  if( pOrder
4590: 42 79 3d 3d 30 20 26 26 20 21 68 61 73 44 69 73  By==0 && !hasDis
45a0: 74 69 6e 63 74 20 29 7b 0a 20 20 20 20 63 6f 64  tinct ){.    cod
45b0: 65 4f 66 66 73 65 74 28 76 2c 20 70 2c 20 69 43  eOffset(v, p, iC
45c0: 6f 6e 74 69 6e 75 65 2c 20 30 29 3b 0a 20 20 7d  ontinue, 0);.  }
45d0: 0a 0a 20 20 2f 2a 20 50 75 6c 6c 20 74 68 65 20  ..  /* Pull the 
45e0: 72 65 71 75 65 73 74 65 64 20 63 6f 6c 75 6d 6e  requested column
45f0: 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6e 43  s..  */.  if( nC
4600: 6f 6c 75 6d 6e 3e 30 20 29 7b 0a 20 20 20 20 6e  olumn>0 ){.    n
4610: 20 3d 20 6e 43 6f 6c 75 6d 6e 3b 0a 20 20 7d 65   = nColumn;.  }e
4620: 6c 73 65 7b 0a 20 20 20 20 6e 20 3d 20 70 45 4c  lse{.    n = pEL
4630: 69 73 74 2d 3e 6e 45 78 70 72 3b 0a 20 20 7d 0a  ist->nExpr;.  }.
4640: 20 20 69 4d 65 6d 20 3d 20 2b 2b 70 50 61 72 73    iMem = ++pPars
4650: 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 70 50 61 72 73  e->nMem;.  pPars
4660: 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 6e 2b 31 3b 0a  e->nMem += n+1;.
4670: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
4680: 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65  Op2(v, OP_Intege
4690: 72 2c 20 6e 2c 20 69 4d 65 6d 29 3b 0a 20 20 69  r, n, iMem);.  i
46a0: 66 28 20 6e 43 6f 6c 75 6d 6e 3e 30 20 29 7b 0a  f( nColumn>0 ){.
46b0: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e      for(i=0; i<n
46c0: 43 6f 6c 75 6d 6e 3b 20 69 2b 2b 29 7b 0a 20 20  Column; i++){.  
46d0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
46e0: 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 6c 75  ddOp3(v, OP_Colu
46f0: 6d 6e 2c 20 73 72 63 54 61 62 2c 20 69 2c 20 69  mn, srcTab, i, i
4700: 4d 65 6d 2b 69 2b 31 29 3b 0a 20 20 20 20 7d 0a  Mem+i+1);.    }.
4710: 20 20 7d 65 6c 73 65 20 69 66 28 20 65 44 65 73    }else if( eDes
4720: 74 21 3d 53 52 54 5f 45 78 69 73 74 73 20 29 7b  t!=SRT_Exists ){
4730: 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 64  .    /* If the d
4740: 65 73 74 69 6e 61 74 69 6f 6e 20 69 73 20 61 6e  estination is an
4750: 20 45 58 49 53 54 53 28 2e 2e 2e 29 20 65 78 70   EXISTS(...) exp
4760: 72 65 73 73 69 6f 6e 2c 20 74 68 65 20 61 63 74  ression, the act
4770: 75 61 6c 0a 20 20 20 20 2a 2a 20 76 61 6c 75 65  ual.    ** value
4780: 73 20 72 65 74 75 72 6e 65 64 20 62 79 20 74 68  s returned by th
4790: 65 20 53 45 4c 45 43 54 20 61 72 65 20 6e 6f 74  e SELECT are not
47a0: 20 72 65 71 75 69 72 65 64 2e 0a 20 20 20 20 2a   required..    *
47b0: 2f 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  /.    for(i=0; i
47c0: 3c 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  <n; i++){.      
47d0: 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28  sqlite3ExprCode(
47e0: 70 50 61 72 73 65 2c 20 70 45 4c 69 73 74 2d 3e  pParse, pEList->
47f0: 61 5b 69 5d 2e 70 45 78 70 72 2c 20 69 4d 65 6d  a[i].pExpr, iMem
4800: 2b 69 2b 31 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  +i+1);.    }.  }
4810: 0a 20 20 6e 43 6f 6c 75 6d 6e 20 3d 20 6e 3b 0a  .  nColumn = n;.
4820: 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 44 49 53  .  /* If the DIS
4830: 54 49 4e 43 54 20 6b 65 79 77 6f 72 64 20 77 61  TINCT keyword wa
4840: 73 20 70 72 65 73 65 6e 74 20 6f 6e 20 74 68 65  s present on the
4850: 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
4860: 74 0a 20 20 2a 2a 20 61 6e 64 20 74 68 69 73 20  t.  ** and this 
4870: 72 6f 77 20 68 61 73 20 62 65 65 6e 20 73 65 65  row has been see
4880: 6e 20 62 65 66 6f 72 65 2c 20 74 68 65 6e 20 64  n before, then d
4890: 6f 20 6e 6f 74 20 6d 61 6b 65 20 74 68 69 73 20  o not make this 
48a0: 72 6f 77 0a 20 20 2a 2a 20 70 61 72 74 20 6f 66  row.  ** part of
48b0: 20 74 68 65 20 72 65 73 75 6c 74 2e 0a 20 20 2a   the result..  *
48c0: 2f 0a 20 20 69 66 28 20 68 61 73 44 69 73 74 69  /.  if( hasDisti
48d0: 6e 63 74 20 29 7b 0a 20 20 20 20 61 73 73 65 72  nct ){.    asser
48e0: 74 28 20 70 45 4c 69 73 74 21 3d 30 20 29 3b 0a  t( pEList!=0 );.
48f0: 20 20 20 20 61 73 73 65 72 74 28 20 70 45 4c 69      assert( pELi
4900: 73 74 2d 3e 6e 45 78 70 72 3d 3d 6e 43 6f 6c 75  st->nExpr==nColu
4910: 6d 6e 20 29 3b 0a 20 20 20 20 63 6f 64 65 44 69  mn );.    codeDi
4920: 73 74 69 6e 63 74 28 76 2c 20 64 69 73 74 69 6e  stinct(v, distin
4930: 63 74 2c 20 69 43 6f 6e 74 69 6e 75 65 2c 20 69  ct, iContinue, i
4940: 4d 65 6d 29 3b 0a 20 20 20 20 69 66 28 20 70 4f  Mem);.    if( pO
4950: 72 64 65 72 42 79 3d 3d 30 20 29 7b 0a 20 20 20  rderBy==0 ){.   
4960: 20 20 20 63 6f 64 65 4f 66 66 73 65 74 28 76 2c     codeOffset(v,
4970: 20 70 2c 20 69 43 6f 6e 74 69 6e 75 65 2c 20 6e   p, iContinue, n
4980: 43 6f 6c 75 6d 6e 29 3b 0a 20 20 20 20 7d 0a 20  Column);.    }. 
4990: 20 7d 0a 0a 20 20 69 66 28 20 63 68 65 63 6b 46   }..  if( checkF
49a0: 6f 72 4d 75 6c 74 69 43 6f 6c 75 6d 6e 53 65 6c  orMultiColumnSel
49b0: 65 63 74 45 72 72 6f 72 28 70 50 61 72 73 65 2c  ectError(pParse,
49c0: 20 70 44 65 73 74 2c 20 70 45 4c 69 73 74 2d 3e   pDest, pEList->
49d0: 6e 45 78 70 72 29 20 29 7b 0a 20 20 20 20 72 65  nExpr) ){.    re
49e0: 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 0a 20 20 73  turn 0;.  }..  s
49f0: 77 69 74 63 68 28 20 65 44 65 73 74 20 29 7b 0a  witch( eDest ){.
4a00: 20 20 20 20 2f 2a 20 49 6e 20 74 68 69 73 20 6d      /* In this m
4a10: 6f 64 65 2c 20 77 72 69 74 65 20 65 61 63 68 20  ode, write each 
4a20: 71 75 65 72 79 20 72 65 73 75 6c 74 20 74 6f 20  query result to 
4a30: 74 68 65 20 6b 65 79 20 6f 66 20 74 68 65 20 74  the key of the t
4a40: 65 6d 70 6f 72 61 72 79 0a 20 20 20 20 2a 2a 20  emporary.    ** 
4a50: 74 61 62 6c 65 20 69 50 61 72 6d 2e 0a 20 20 20  table iParm..   
4a60: 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49   */.#ifndef SQLI
4a70: 54 45 5f 4f 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44  TE_OMIT_COMPOUND
4a80: 5f 53 45 4c 45 43 54 0a 20 20 20 20 63 61 73 65  _SELECT.    case
4a90: 20 53 52 54 5f 55 6e 69 6f 6e 3a 20 7b 0a 20 20   SRT_Union: {.  
4aa0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
4ab0: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52 65 67 4d  ddOp2(v, OP_RegM
4ac0: 61 6b 65 52 65 63 2c 20 69 4d 65 6d 2c 20 30 29  akeRec, iMem, 0)
4ad0: 3b 0a 20 20 20 20 20 20 69 66 28 20 61 66 66 20  ;.      if( aff 
4ae0: 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
4af0: 65 33 56 64 62 65 43 68 61 6e 67 65 50 34 28 76  e3VdbeChangeP4(v
4b00: 2c 20 2d 31 2c 20 61 66 66 2c 20 50 34 5f 53 54  , -1, aff, P4_ST
4b10: 41 54 49 43 29 3b 0a 20 20 20 20 20 20 7d 0a 20  ATIC);.      }. 
4b20: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
4b30: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 64 78  AddOp2(v, OP_Idx
4b40: 49 6e 73 65 72 74 2c 20 69 50 61 72 6d 2c 20 30  Insert, iParm, 0
4b50: 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
4b60: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 6f      }..    /* Co
4b70: 6e 73 74 72 75 63 74 20 61 20 72 65 63 6f 72 64  nstruct a record
4b80: 20 66 72 6f 6d 20 74 68 65 20 71 75 65 72 79 20   from the query 
4b90: 72 65 73 75 6c 74 2c 20 62 75 74 20 69 6e 73 74  result, but inst
4ba0: 65 61 64 20 6f 66 0a 20 20 20 20 2a 2a 20 73 61  ead of.    ** sa
4bb0: 76 69 6e 67 20 74 68 61 74 20 72 65 63 6f 72 64  ving that record
4bc0: 2c 20 75 73 65 20 69 74 20 61 73 20 61 20 6b 65  , use it as a ke
4bd0: 79 20 74 6f 20 64 65 6c 65 74 65 20 65 6c 65 6d  y to delete elem
4be0: 65 6e 74 73 20 66 72 6f 6d 0a 20 20 20 20 2a 2a  ents from.    **
4bf0: 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79 20 74   the temporary t
4c00: 61 62 6c 65 20 69 50 61 72 6d 2e 0a 20 20 20 20  able iParm..    
4c10: 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f  */.    case SRT_
4c20: 45 78 63 65 70 74 3a 20 7b 0a 20 20 20 20 20 20  Except: {.      
4c30: 69 6e 74 20 61 64 64 72 3b 0a 20 20 20 20 20 20  int addr;.      
4c40: 61 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64  addr = sqlite3Vd
4c50: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52  beAddOp2(v, OP_R
4c60: 65 67 4d 61 6b 65 52 65 63 2c 20 69 4d 65 6d 2c  egMakeRec, iMem,
4c70: 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74   0);.      sqlit
4c80: 65 33 56 64 62 65 43 68 61 6e 67 65 50 34 28 76  e3VdbeChangeP4(v
4c90: 2c 20 2d 31 2c 20 61 66 66 2c 20 50 34 5f 53 54  , -1, aff, P4_ST
4ca0: 41 54 49 43 29 3b 0a 20 20 20 20 20 20 73 71 6c  ATIC);.      sql
4cb0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
4cc0: 2c 20 4f 50 5f 4e 6f 74 46 6f 75 6e 64 2c 20 69  , OP_NotFound, i
4cd0: 50 61 72 6d 2c 20 61 64 64 72 2b 33 29 3b 0a 20  Parm, addr+3);. 
4ce0: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
4cf0: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 44 65 6c  AddOp2(v, OP_Del
4d00: 65 74 65 2c 20 69 50 61 72 6d 2c 20 30 29 3b 0a  ete, iParm, 0);.
4d10: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
4d20: 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 2f   }.#endif..    /
4d30: 2a 20 53 74 6f 72 65 20 74 68 65 20 72 65 73 75  * Store the resu
4d40: 6c 74 20 61 73 20 64 61 74 61 20 75 73 69 6e 67  lt as data using
4d50: 20 61 20 75 6e 69 71 75 65 20 6b 65 79 2e 0a 20   a unique key.. 
4d60: 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53     */.    case S
4d70: 52 54 5f 54 61 62 6c 65 3a 0a 20 20 20 20 63 61  RT_Table:.    ca
4d80: 73 65 20 53 52 54 5f 45 70 68 65 6d 54 61 62 3a  se SRT_EphemTab:
4d90: 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   {.      sqlite3
4da0: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
4db0: 5f 52 65 67 4d 61 6b 65 52 65 63 2c 20 69 4d 65  _RegMakeRec, iMe
4dc0: 6d 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28  m, 0);.      if(
4dd0: 20 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20   pOrderBy ){.   
4de0: 20 20 20 20 20 70 75 73 68 4f 6e 74 6f 53 6f 72       pushOntoSor
4df0: 74 65 72 28 70 50 61 72 73 65 2c 20 70 4f 72 64  ter(pParse, pOrd
4e00: 65 72 42 79 2c 20 70 29 3b 0a 20 20 20 20 20 20  erBy, p);.      
4e10: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73  }else{.        s
4e20: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31  qlite3VdbeAddOp1
4e30: 28 76 2c 20 4f 50 5f 4e 65 77 52 6f 77 69 64 2c  (v, OP_NewRowid,
4e40: 20 69 50 61 72 6d 29 3b 0a 20 20 20 20 20 20 20   iParm);.       
4e50: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
4e60: 70 32 28 76 2c 20 4f 50 5f 50 75 6c 6c 2c 20 31  p2(v, OP_Pull, 1
4e70: 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 73 71  , 0);.        sq
4e80: 6c 69 74 65 33 43 6f 64 65 49 6e 73 65 72 74 28  lite3CodeInsert(
4e90: 70 50 61 72 73 65 2c 20 69 50 61 72 6d 2c 20 4f  pParse, iParm, O
4ea0: 50 46 4c 41 47 5f 41 50 50 45 4e 44 29 3b 0a 20  PFLAG_APPEND);. 
4eb0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65       }.      bre
4ec0: 61 6b 3b 0a 20 20 20 20 7d 0a 0a 23 69 66 6e 64  ak;.    }..#ifnd
4ed0: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53  ef SQLITE_OMIT_S
4ee0: 55 42 51 55 45 52 59 0a 20 20 20 20 2f 2a 20 49  UBQUERY.    /* I
4ef0: 66 20 77 65 20 61 72 65 20 63 72 65 61 74 69 6e  f we are creatin
4f00: 67 20 61 20 73 65 74 20 66 6f 72 20 61 6e 20 22  g a set for an "
4f10: 65 78 70 72 20 49 4e 20 28 53 45 4c 45 43 54 20  expr IN (SELECT 
4f20: 2e 2e 2e 29 22 20 63 6f 6e 73 74 72 75 63 74 2c  ...)" construct,
4f30: 0a 20 20 20 20 2a 2a 20 74 68 65 6e 20 74 68 65  .    ** then the
4f40: 72 65 20 73 68 6f 75 6c 64 20 62 65 20 61 20 73  re should be a s
4f50: 69 6e 67 6c 65 20 69 74 65 6d 20 6f 6e 20 74 68  ingle item on th
4f60: 65 20 73 74 61 63 6b 2e 20 20 57 72 69 74 65 20  e stack.  Write 
4f70: 74 68 69 73 0a 20 20 20 20 2a 2a 20 69 74 65 6d  this.    ** item
4f80: 20 69 6e 74 6f 20 74 68 65 20 73 65 74 20 74 61   into the set ta
4f90: 62 6c 65 20 77 69 74 68 20 62 6f 67 75 73 20 64  ble with bogus d
4fa0: 61 74 61 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ata..    */.    
4fb0: 63 61 73 65 20 53 52 54 5f 53 65 74 3a 20 7b 0a  case SRT_Set: {.
4fc0: 20 20 20 20 20 20 69 6e 74 20 61 64 64 72 32 3b        int addr2;
4fd0: 0a 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ..      assert( 
4fe0: 6e 43 6f 6c 75 6d 6e 3d 3d 31 20 29 3b 0a 20 20  nColumn==1 );.  
4ff0: 20 20 20 20 61 64 64 72 32 20 3d 20 73 71 6c 69      addr2 = sqli
5000: 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
5010: 20 4f 50 5f 49 66 4d 65 6d 4e 75 6c 6c 2c 20 69   OP_IfMemNull, i
5020: 4d 65 6d 2b 31 2c 20 30 29 3b 0a 20 20 20 20 20  Mem+1, 0);.     
5030: 20 70 2d 3e 61 66 66 69 6e 69 74 79 20 3d 20 73   p->affinity = s
5040: 71 6c 69 74 65 33 43 6f 6d 70 61 72 65 41 66 66  qlite3CompareAff
5050: 69 6e 69 74 79 28 70 45 4c 69 73 74 2d 3e 61 5b  inity(pEList->a[
5060: 30 5d 2e 70 45 78 70 72 2c 20 70 44 65 73 74 2d  0].pExpr, pDest-
5070: 3e 61 66 66 69 6e 69 74 79 29 3b 0a 20 20 20 20  >affinity);.    
5080: 20 20 69 66 28 20 70 4f 72 64 65 72 42 79 20 29    if( pOrderBy )
5090: 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 41 74 20  {.        /* At 
50a0: 66 69 72 73 74 20 67 6c 61 6e 63 65 20 79 6f 75  first glance you
50b0: 20 77 6f 75 6c 64 20 74 68 69 6e 6b 20 77 65 20   would think we 
50c0: 63 6f 75 6c 64 20 6f 70 74 69 6d 69 7a 65 20 6f  could optimize o
50d0: 75 74 20 74 68 65 0a 20 20 20 20 20 20 20 20 2a  ut the.        *
50e0: 2a 20 4f 52 44 45 52 20 42 59 20 69 6e 20 74 68  * ORDER BY in th
50f0: 69 73 20 63 61 73 65 20 73 69 6e 63 65 20 74 68  is case since th
5100: 65 20 6f 72 64 65 72 20 6f 66 20 65 6e 74 72 69  e order of entri
5110: 65 73 20 69 6e 20 74 68 65 20 73 65 74 0a 20 20  es in the set.  
5120: 20 20 20 20 20 20 2a 2a 20 64 6f 65 73 20 6e 6f        ** does no
5130: 74 20 6d 61 74 74 65 72 2e 20 20 42 75 74 20 74  t matter.  But t
5140: 68 65 72 65 20 6d 69 67 68 74 20 62 65 20 61 20  here might be a 
5150: 4c 49 4d 49 54 20 63 6c 61 75 73 65 2c 20 69 6e  LIMIT clause, in
5160: 20 77 68 69 63 68 0a 20 20 20 20 20 20 20 20 2a   which.        *
5170: 2a 20 63 61 73 65 20 74 68 65 20 6f 72 64 65 72  * case the order
5180: 20 64 6f 65 73 20 6d 61 74 74 65 72 20 2a 2f 0a   does matter */.
5190: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
51a0: 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
51b0: 53 43 6f 70 79 2c 20 69 4d 65 6d 2b 31 2c 20 30  SCopy, iMem+1, 0
51c0: 29 3b 0a 20 20 20 20 20 20 20 20 70 75 73 68 4f  );.        pushO
51d0: 6e 74 6f 53 6f 72 74 65 72 28 70 50 61 72 73 65  ntoSorter(pParse
51e0: 2c 20 70 4f 72 64 65 72 42 79 2c 20 70 29 3b 0a  , pOrderBy, p);.
51f0: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
5200: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
5210: 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 52 65 67  AddOp4(v, OP_Reg
5220: 4d 61 6b 65 52 65 63 2c 20 69 4d 65 6d 2c 20 30  MakeRec, iMem, 0
5230: 2c 20 30 2c 20 26 70 2d 3e 61 66 66 69 6e 69 74  , 0, &p->affinit
5240: 79 2c 20 31 29 3b 0a 20 20 20 20 20 20 20 20 73  y, 1);.        s
5250: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
5260: 28 76 2c 20 4f 50 5f 49 64 78 49 6e 73 65 72 74  (v, OP_IdxInsert
5270: 2c 20 69 50 61 72 6d 2c 20 30 29 3b 0a 20 20 20  , iParm, 0);.   
5280: 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74     }.      sqlit
5290: 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76  e3VdbeJumpHere(v
52a0: 2c 20 61 64 64 72 32 29 3b 0a 20 20 20 20 20 20  , addr2);.      
52b0: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20  break;.    }..  
52c0: 20 20 2f 2a 20 49 66 20 61 6e 79 20 72 6f 77 20    /* If any row 
52d0: 65 78 69 73 74 20 69 6e 20 74 68 65 20 72 65 73  exist in the res
52e0: 75 6c 74 20 73 65 74 2c 20 72 65 63 6f 72 64 20  ult set, record 
52f0: 74 68 61 74 20 66 61 63 74 20 61 6e 64 20 61 62  that fact and ab
5300: 6f 72 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ort..    */.    
5310: 63 61 73 65 20 53 52 54 5f 45 78 69 73 74 73 3a  case SRT_Exists:
5320: 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   {.      sqlite3
5330: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
5340: 5f 49 6e 74 65 67 65 72 2c 20 31 2c 20 69 50 61  _Integer, 1, iPa
5350: 72 6d 29 3b 0a 20 20 20 20 20 20 2f 2a 20 54 68  rm);.      /* Th
5360: 65 20 4c 49 4d 49 54 20 63 6c 61 75 73 65 20 77  e LIMIT clause w
5370: 69 6c 6c 20 74 65 72 6d 69 6e 61 74 65 20 74 68  ill terminate th
5380: 65 20 6c 6f 6f 70 20 66 6f 72 20 75 73 20 2a 2f  e loop for us */
5390: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
53a0: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74    }..    /* If t
53b0: 68 69 73 20 69 73 20 61 20 73 63 61 6c 61 72 20  his is a scalar 
53c0: 73 65 6c 65 63 74 20 74 68 61 74 20 69 73 20 70  select that is p
53d0: 61 72 74 20 6f 66 20 61 6e 20 65 78 70 72 65 73  art of an expres
53e0: 73 69 6f 6e 2c 20 74 68 65 6e 0a 20 20 20 20 2a  sion, then.    *
53f0: 2a 20 73 74 6f 72 65 20 74 68 65 20 72 65 73 75  * store the resu
5400: 6c 74 73 20 69 6e 20 74 68 65 20 61 70 70 72 6f  lts in the appro
5410: 70 72 69 61 74 65 20 6d 65 6d 6f 72 79 20 63 65  priate memory ce
5420: 6c 6c 20 61 6e 64 20 62 72 65 61 6b 20 6f 75 74  ll and break out
5430: 0a 20 20 20 20 2a 2a 20 6f 66 20 74 68 65 20 73  .    ** of the s
5440: 63 61 6e 20 6c 6f 6f 70 2e 0a 20 20 20 20 2a 2f  can loop..    */
5450: 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f 4d 65  .    case SRT_Me
5460: 6d 3a 20 7b 0a 20 20 20 20 20 20 61 73 73 65 72  m: {.      asser
5470: 74 28 20 6e 43 6f 6c 75 6d 6e 3d 3d 31 20 29 3b  t( nColumn==1 );
5480: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
5490: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 53  beAddOp2(v, OP_S
54a0: 43 6f 70 79 2c 20 69 4d 65 6d 2b 31 2c 20 30 29  Copy, iMem+1, 0)
54b0: 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4f 72 64  ;.      if( pOrd
54c0: 65 72 42 79 20 29 7b 0a 20 20 20 20 20 20 20 20  erBy ){.        
54d0: 70 75 73 68 4f 6e 74 6f 53 6f 72 74 65 72 28 70  pushOntoSorter(p
54e0: 50 61 72 73 65 2c 20 70 4f 72 64 65 72 42 79 2c  Parse, pOrderBy,
54f0: 20 70 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65   p);.      }else
5500: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
5510: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
5520: 50 5f 4d 6f 76 65 2c 20 30 2c 20 69 50 61 72 6d  P_Move, 0, iParm
5530: 29 3b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68  );.        /* Th
5540: 65 20 4c 49 4d 49 54 20 63 6c 61 75 73 65 20 77  e LIMIT clause w
5550: 69 6c 6c 20 6a 75 6d 70 20 6f 75 74 20 6f 66 20  ill jump out of 
5560: 74 68 65 20 6c 6f 6f 70 20 66 6f 72 20 75 73 20  the loop for us 
5570: 2a 2f 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  */.      }.     
5580: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65   break;.    }.#e
5590: 6e 64 69 66 20 2f 2a 20 23 69 66 6e 64 65 66 20  ndif /* #ifndef 
55a0: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51  SQLITE_OMIT_SUBQ
55b0: 55 45 52 59 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20  UERY */..    /* 
55c0: 53 65 6e 64 20 74 68 65 20 64 61 74 61 20 74 6f  Send the data to
55d0: 20 74 68 65 20 63 61 6c 6c 62 61 63 6b 20 66 75   the callback fu
55e0: 6e 63 74 69 6f 6e 20 6f 72 20 74 6f 20 61 20 73  nction or to a s
55f0: 75 62 72 6f 75 74 69 6e 65 2e 20 20 49 6e 20 74  ubroutine.  In t
5600: 68 65 0a 20 20 20 20 2a 2a 20 63 61 73 65 20 6f  he.    ** case o
5610: 66 20 61 20 73 75 62 72 6f 75 74 69 6e 65 2c 20  f a subroutine, 
5620: 74 68 65 20 73 75 62 72 6f 75 74 69 6e 65 20 69  the subroutine i
5630: 74 73 65 6c 66 20 69 73 20 72 65 73 70 6f 6e 73  tself is respons
5640: 69 62 6c 65 20 66 6f 72 0a 20 20 20 20 2a 2a 20  ible for.    ** 
5650: 70 6f 70 70 69 6e 67 20 74 68 65 20 64 61 74 61  popping the data
5660: 20 66 72 6f 6d 20 74 68 65 20 73 74 61 63 6b 2e   from the stack.
5670: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65  .    */.    case
5680: 20 53 52 54 5f 53 75 62 72 6f 75 74 69 6e 65 3a   SRT_Subroutine:
5690: 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f 43 61  .    case SRT_Ca
56a0: 6c 6c 62 61 63 6b 3a 20 7b 0a 20 20 20 20 20 20  llback: {.      
56b0: 69 66 28 20 70 4f 72 64 65 72 42 79 20 29 7b 0a  if( pOrderBy ){.
56c0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
56d0: 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
56e0: 52 65 67 4d 61 6b 65 52 65 63 2c 20 69 4d 65 6d  RegMakeRec, iMem
56f0: 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 70 75  , 0);.        pu
5700: 73 68 4f 6e 74 6f 53 6f 72 74 65 72 28 70 50 61  shOntoSorter(pPa
5710: 72 73 65 2c 20 70 4f 72 64 65 72 42 79 2c 20 70  rse, pOrderBy, p
5720: 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69  );.      }else i
5730: 66 28 20 65 44 65 73 74 3d 3d 53 52 54 5f 53 75  f( eDest==SRT_Su
5740: 62 72 6f 75 74 69 6e 65 20 29 7b 0a 20 20 20 20  broutine ){.    
5750: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e      for(i=0; i<n
5760: 43 6f 6c 75 6d 6e 3b 20 69 2b 2b 29 20 73 71 6c  Column; i++) sql
5770: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
5780: 2c 20 4f 50 5f 53 43 6f 70 79 2c 20 69 4d 65 6d  , OP_SCopy, iMem
5790: 2b 69 2b 31 2c 20 30 29 3b 0a 20 20 20 20 20 20  +i+1, 0);.      
57a0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
57b0: 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 73 75 62 2c  Op2(v, OP_Gosub,
57c0: 20 30 2c 20 69 50 61 72 6d 29 3b 0a 20 20 20 20   0, iParm);.    
57d0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
57e0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
57f0: 70 32 28 76 2c 20 4f 50 5f 52 65 73 75 6c 74 52  p2(v, OP_ResultR
5800: 6f 77 2c 20 69 4d 65 6d 2b 31 2c 20 6e 43 6f 6c  ow, iMem+1, nCol
5810: 75 6d 6e 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  umn);.      }.  
5820: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
5830: 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53  ..#if !defined(S
5840: 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 49 47 47  QLITE_OMIT_TRIGG
5850: 45 52 29 0a 20 20 20 20 2f 2a 20 44 69 73 63 61  ER).    /* Disca
5860: 72 64 20 74 68 65 20 72 65 73 75 6c 74 73 2e 20  rd the results. 
5870: 20 54 68 69 73 20 69 73 20 75 73 65 64 20 66 6f   This is used fo
5880: 72 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  r SELECT stateme
5890: 6e 74 73 20 69 6e 73 69 64 65 0a 20 20 20 20 2a  nts inside.    *
58a0: 2a 20 74 68 65 20 62 6f 64 79 20 6f 66 20 61 20  * the body of a 
58b0: 54 52 49 47 47 45 52 2e 20 20 54 68 65 20 70 75  TRIGGER.  The pu
58c0: 72 70 6f 73 65 20 6f 66 20 73 75 63 68 20 73 65  rpose of such se
58d0: 6c 65 63 74 73 20 69 73 20 74 6f 20 63 61 6c 6c  lects is to call
58e0: 0a 20 20 20 20 2a 2a 20 75 73 65 72 2d 64 65 66  .    ** user-def
58f0: 69 6e 65 64 20 66 75 6e 63 74 69 6f 6e 73 20 74  ined functions t
5900: 68 61 74 20 68 61 76 65 20 73 69 64 65 20 65 66  hat have side ef
5910: 66 65 63 74 73 2e 20 20 57 65 20 64 6f 20 6e 6f  fects.  We do no
5920: 74 20 63 61 72 65 0a 20 20 20 20 2a 2a 20 61 62  t care.    ** ab
5930: 6f 75 74 20 74 68 65 20 61 63 74 75 61 6c 20 72  out the actual r
5940: 65 73 75 6c 74 73 20 6f 66 20 74 68 65 20 73 65  esults of the se
5950: 6c 65 63 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  lect..    */.   
5960: 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20   default: {.    
5970: 20 20 61 73 73 65 72 74 28 20 65 44 65 73 74 3d    assert( eDest=
5980: 3d 53 52 54 5f 44 69 73 63 61 72 64 20 29 3b 0a  =SRT_Discard );.
5990: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
59a0: 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 0a 20   }.#endif.  }.. 
59b0: 20 2f 2a 20 4a 75 6d 70 20 74 6f 20 74 68 65 20   /* Jump to the 
59c0: 65 6e 64 20 6f 66 20 74 68 65 20 6c 6f 6f 70 20  end of the loop 
59d0: 69 66 20 74 68 65 20 4c 49 4d 49 54 20 69 73 20  if the LIMIT is 
59e0: 72 65 61 63 68 65 64 2e 0a 20 20 2a 2f 0a 20 20  reached..  */.  
59f0: 69 66 28 20 70 2d 3e 69 4c 69 6d 69 74 3e 3d 30  if( p->iLimit>=0
5a00: 20 26 26 20 70 4f 72 64 65 72 42 79 3d 3d 30 20   && pOrderBy==0 
5a10: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  ){.    sqlite3Vd
5a20: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 41  beAddOp2(v, OP_A
5a30: 64 64 49 6d 6d 2c 20 70 2d 3e 69 4c 69 6d 69 74  ddImm, p->iLimit
5a40: 2c 20 2d 31 29 3b 0a 20 20 20 20 73 71 6c 69 74  , -1);.    sqlit
5a50: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
5a60: 4f 50 5f 49 66 4d 65 6d 5a 65 72 6f 2c 20 70 2d  OP_IfMemZero, p-
5a70: 3e 69 4c 69 6d 69 74 2c 20 69 42 72 65 61 6b 29  >iLimit, iBreak)
5a80: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30  ;.  }.  return 0
5a90: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e  ;.}../*.** Given
5aa0: 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 6c   an expression l
5ab0: 69 73 74 2c 20 67 65 6e 65 72 61 74 65 20 61 20  ist, generate a 
5ac0: 4b 65 79 49 6e 66 6f 20 73 74 72 75 63 74 75 72  KeyInfo structur
5ad0: 65 20 74 68 61 74 20 72 65 63 6f 72 64 73 0a 2a  e that records.*
5ae0: 2a 20 74 68 65 20 63 6f 6c 6c 61 74 69 6e 67 20  * the collating 
5af0: 73 65 71 75 65 6e 63 65 20 66 6f 72 20 65 61 63  sequence for eac
5b00: 68 20 65 78 70 72 65 73 73 69 6f 6e 20 69 6e 20  h expression in 
5b10: 74 68 61 74 20 65 78 70 72 65 73 73 69 6f 6e 20  that expression 
5b20: 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  list..**.** If t
5b30: 68 65 20 45 78 70 72 4c 69 73 74 20 69 73 20 61  he ExprList is a
5b40: 6e 20 4f 52 44 45 52 20 42 59 20 6f 72 20 47 52  n ORDER BY or GR
5b50: 4f 55 50 20 42 59 20 63 6c 61 75 73 65 20 74 68  OUP BY clause th
5b60: 65 6e 20 74 68 65 20 72 65 73 75 6c 74 69 6e 67  en the resulting
5b70: 0a 2a 2a 20 4b 65 79 49 6e 66 6f 20 73 74 72 75  .** KeyInfo stru
5b80: 63 74 75 72 65 20 69 73 20 61 70 70 72 6f 70 72  cture is appropr
5b90: 69 61 74 65 20 66 6f 72 20 69 6e 69 74 69 61 6c  iate for initial
5ba0: 69 7a 69 6e 67 20 61 20 76 69 72 74 75 61 6c 20  izing a virtual 
5bb0: 69 6e 64 65 78 20 74 6f 0a 2a 2a 20 69 6d 70 6c  index to.** impl
5bc0: 65 6d 65 6e 74 20 74 68 61 74 20 63 6c 61 75 73  ement that claus
5bd0: 65 2e 20 20 49 66 20 74 68 65 20 45 78 70 72 4c  e.  If the ExprL
5be0: 69 73 74 20 69 73 20 74 68 65 20 72 65 73 75 6c  ist is the resul
5bf0: 74 20 73 65 74 20 6f 66 20 61 20 53 45 4c 45 43  t set of a SELEC
5c00: 54 0a 2a 2a 20 74 68 65 6e 20 74 68 65 20 4b 65  T.** then the Ke
5c10: 79 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65 20  yInfo structure 
5c20: 69 73 20 61 70 70 72 6f 70 72 69 61 74 65 20 66  is appropriate f
5c30: 6f 72 20 69 6e 69 74 69 61 6c 69 7a 69 6e 67 20  or initializing 
5c40: 61 20 76 69 72 74 75 61 6c 0a 2a 2a 20 69 6e 64  a virtual.** ind
5c50: 65 78 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20  ex to implement 
5c60: 61 20 44 49 53 54 49 4e 43 54 20 74 65 73 74 2e  a DISTINCT test.
5c70: 0a 2a 2a 0a 2a 2a 20 53 70 61 63 65 20 74 6f 20  .**.** Space to 
5c80: 68 6f 6c 64 20 74 68 65 20 4b 65 79 49 6e 66 6f  hold the KeyInfo
5c90: 20 73 74 72 75 63 74 75 72 65 20 69 73 20 6f 62   structure is ob
5ca0: 74 61 69 6e 20 66 72 6f 6d 20 6d 61 6c 6c 6f 63  tain from malloc
5cb0: 2e 20 20 54 68 65 20 63 61 6c 6c 69 6e 67 0a 2a  .  The calling.*
5cc0: 2a 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 72 65  * function is re
5cd0: 73 70 6f 6e 73 69 62 6c 65 20 66 6f 72 20 73 65  sponsible for se
5ce0: 65 69 6e 67 20 74 68 61 74 20 74 68 69 73 20 73  eing that this s
5cf0: 74 72 75 63 74 75 72 65 20 69 73 20 65 76 65 6e  tructure is even
5d00: 74 75 61 6c 6c 79 0a 2a 2a 20 66 72 65 65 64 2e  tually.** freed.
5d10: 20 20 41 64 64 20 74 68 65 20 4b 65 79 49 6e 66    Add the KeyInf
5d20: 6f 20 73 74 72 75 63 74 75 72 65 20 74 6f 20 74  o structure to t
5d30: 68 65 20 50 34 20 66 69 65 6c 64 20 6f 66 20 61  he P4 field of a
5d40: 6e 20 6f 70 63 6f 64 65 20 75 73 69 6e 67 0a 2a  n opcode using.*
5d50: 2a 20 50 34 5f 4b 45 59 49 4e 46 4f 5f 48 41 4e  * P4_KEYINFO_HAN
5d60: 44 4f 46 46 20 69 73 20 74 68 65 20 75 73 75 61  DOFF is the usua
5d70: 6c 20 77 61 79 20 6f 66 20 64 65 61 6c 69 6e 67  l way of dealing
5d80: 20 77 69 74 68 20 74 68 69 73 2e 0a 2a 2f 0a 73   with this..*/.s
5d90: 74 61 74 69 63 20 4b 65 79 49 6e 66 6f 20 2a 6b  tatic KeyInfo *k
5da0: 65 79 49 6e 66 6f 46 72 6f 6d 45 78 70 72 4c 69  eyInfoFromExprLi
5db0: 73 74 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  st(Parse *pParse
5dc0: 2c 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73  , ExprList *pLis
5dd0: 74 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  t){.  sqlite3 *d
5de0: 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a  b = pParse->db;.
5df0: 20 20 69 6e 74 20 6e 45 78 70 72 3b 0a 20 20 4b    int nExpr;.  K
5e00: 65 79 49 6e 66 6f 20 2a 70 49 6e 66 6f 3b 0a 20  eyInfo *pInfo;. 
5e10: 20 73 74 72 75 63 74 20 45 78 70 72 4c 69 73 74   struct ExprList
5e20: 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20  _item *pItem;.  
5e30: 69 6e 74 20 69 3b 0a 0a 20 20 6e 45 78 70 72 20  int i;..  nExpr 
5e40: 3d 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 0a  = pList->nExpr;.
5e50: 20 20 70 49 6e 66 6f 20 3d 20 73 71 6c 69 74 65    pInfo = sqlite
5e60: 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62  3DbMallocZero(db
5e70: 2c 20 73 69 7a 65 6f 66 28 2a 70 49 6e 66 6f 29  , sizeof(*pInfo)
5e80: 20 2b 20 6e 45 78 70 72 2a 28 73 69 7a 65 6f 66   + nExpr*(sizeof
5e90: 28 43 6f 6c 6c 53 65 71 2a 29 2b 31 29 20 29 3b  (CollSeq*)+1) );
5ea0: 0a 20 20 69 66 28 20 70 49 6e 66 6f 20 29 7b 0a  .  if( pInfo ){.
5eb0: 20 20 20 20 70 49 6e 66 6f 2d 3e 61 53 6f 72 74      pInfo->aSort
5ec0: 4f 72 64 65 72 20 3d 20 28 75 38 2a 29 26 70 49  Order = (u8*)&pI
5ed0: 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b 6e 45 78 70 72  nfo->aColl[nExpr
5ee0: 5d 3b 0a 20 20 20 20 70 49 6e 66 6f 2d 3e 6e 46  ];.    pInfo->nF
5ef0: 69 65 6c 64 20 3d 20 6e 45 78 70 72 3b 0a 20 20  ield = nExpr;.  
5f00: 20 20 70 49 6e 66 6f 2d 3e 65 6e 63 20 3d 20 45    pInfo->enc = E
5f10: 4e 43 28 64 62 29 3b 0a 20 20 20 20 66 6f 72 28  NC(db);.    for(
5f20: 69 3d 30 2c 20 70 49 74 65 6d 3d 70 4c 69 73 74  i=0, pItem=pList
5f30: 2d 3e 61 3b 20 69 3c 6e 45 78 70 72 3b 20 69 2b  ->a; i<nExpr; i+
5f40: 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20  +, pItem++){.   
5f50: 20 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c     CollSeq *pCol
5f60: 6c 3b 0a 20 20 20 20 20 20 70 43 6f 6c 6c 20 3d  l;.      pColl =
5f70: 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c   sqlite3ExprColl
5f80: 53 65 71 28 70 50 61 72 73 65 2c 20 70 49 74 65  Seq(pParse, pIte
5f90: 6d 2d 3e 70 45 78 70 72 29 3b 0a 20 20 20 20 20  m->pExpr);.     
5fa0: 20 69 66 28 20 21 70 43 6f 6c 6c 20 29 7b 0a 20   if( !pColl ){. 
5fb0: 20 20 20 20 20 20 20 70 43 6f 6c 6c 20 3d 20 64         pColl = d
5fc0: 62 2d 3e 70 44 66 6c 74 43 6f 6c 6c 3b 0a 20 20  b->pDfltColl;.  
5fd0: 20 20 20 20 7d 0a 20 20 20 20 20 20 70 49 6e 66      }.      pInf
5fe0: 6f 2d 3e 61 43 6f 6c 6c 5b 69 5d 20 3d 20 70 43  o->aColl[i] = pC
5ff0: 6f 6c 6c 3b 0a 20 20 20 20 20 20 70 49 6e 66 6f  oll;.      pInfo
6000: 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b 69 5d 20  ->aSortOrder[i] 
6010: 3d 20 70 49 74 65 6d 2d 3e 73 6f 72 74 4f 72 64  = pItem->sortOrd
6020: 65 72 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  er;.    }.  }.  
6030: 72 65 74 75 72 6e 20 70 49 6e 66 6f 3b 0a 7d 0a  return pInfo;.}.
6040: 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20 69  ../*.** If the i
6050: 6e 6e 65 72 20 6c 6f 6f 70 20 77 61 73 20 67 65  nner loop was ge
6060: 6e 65 72 61 74 65 64 20 75 73 69 6e 67 20 61 20  nerated using a 
6070: 6e 6f 6e 2d 6e 75 6c 6c 20 70 4f 72 64 65 72 42  non-null pOrderB
6080: 79 20 61 72 67 75 6d 65 6e 74 2c 0a 2a 2a 20 74  y argument,.** t
6090: 68 65 6e 20 74 68 65 20 72 65 73 75 6c 74 73 20  hen the results 
60a0: 77 65 72 65 20 70 6c 61 63 65 64 20 69 6e 20 61  were placed in a
60b0: 20 73 6f 72 74 65 72 2e 20 20 41 66 74 65 72 20   sorter.  After 
60c0: 74 68 65 20 6c 6f 6f 70 20 69 73 20 74 65 72 6d  the loop is term
60d0: 69 6e 61 74 65 64 0a 2a 2a 20 77 65 20 6e 65 65  inated.** we nee
60e0: 64 20 74 6f 20 72 75 6e 20 74 68 65 20 73 6f 72  d to run the sor
60f0: 74 65 72 20 61 6e 64 20 6f 75 74 70 75 74 20 74  ter and output t
6100: 68 65 20 72 65 73 75 6c 74 73 2e 20 20 54 68 65  he results.  The
6110: 20 66 6f 6c 6c 6f 77 69 6e 67 0a 2a 2a 20 72 6f   following.** ro
6120: 75 74 69 6e 65 20 67 65 6e 65 72 61 74 65 73 20  utine generates 
6130: 74 68 65 20 63 6f 64 65 20 6e 65 65 64 65 64 20  the code needed 
6140: 74 6f 20 64 6f 20 74 68 61 74 2e 0a 2a 2f 0a 73  to do that..*/.s
6150: 74 61 74 69 63 20 76 6f 69 64 20 67 65 6e 65 72  tatic void gener
6160: 61 74 65 53 6f 72 74 54 61 69 6c 28 0a 20 20 50  ateSortTail(.  P
6170: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
6180: 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74   /* Parsing cont
6190: 65 78 74 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20  ext */.  Select 
61a0: 2a 70 2c 20 20 20 20 20 20 20 20 2f 2a 20 54 68  *p,        /* Th
61b0: 65 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  e SELECT stateme
61c0: 6e 74 20 2a 2f 0a 20 20 56 64 62 65 20 2a 76 2c  nt */.  Vdbe *v,
61d0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 47 65 6e            /* Gen
61e0: 65 72 61 74 65 20 63 6f 64 65 20 69 6e 74 6f 20  erate code into 
61f0: 74 68 69 73 20 56 44 42 45 20 2a 2f 0a 20 20 69  this VDBE */.  i
6200: 6e 74 20 6e 43 6f 6c 75 6d 6e 2c 20 20 20 20 20  nt nColumn,     
6210: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 6f   /* Number of co
6220: 6c 75 6d 6e 73 20 6f 66 20 64 61 74 61 20 2a 2f  lumns of data */
6230: 0a 20 20 53 65 6c 65 63 74 44 65 73 74 20 2a 70  .  SelectDest *p
6240: 44 65 73 74 20 2f 2a 20 57 72 69 74 65 20 74 68  Dest /* Write th
6250: 65 20 73 6f 72 74 65 64 20 72 65 73 75 6c 74 73  e sorted results
6260: 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e   here */.){.  in
6270: 74 20 62 72 6b 20 3d 20 73 71 6c 69 74 65 33 56  t brk = sqlite3V
6280: 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b  dbeMakeLabel(v);
6290: 0a 20 20 69 6e 74 20 63 6f 6e 74 20 3d 20 73 71  .  int cont = sq
62a0: 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62  lite3VdbeMakeLab
62b0: 65 6c 28 76 29 3b 0a 20 20 69 6e 74 20 61 64 64  el(v);.  int add
62c0: 72 3b 0a 20 20 69 6e 74 20 69 54 61 62 3b 0a 20  r;.  int iTab;. 
62d0: 20 69 6e 74 20 70 73 65 75 64 6f 54 61 62 20 3d   int pseudoTab =
62e0: 20 30 3b 0a 20 20 45 78 70 72 4c 69 73 74 20 2a   0;.  ExprList *
62f0: 70 4f 72 64 65 72 42 79 20 3d 20 70 2d 3e 70 4f  pOrderBy = p->pO
6300: 72 64 65 72 42 79 3b 0a 0a 20 20 69 6e 74 20 65  rderBy;..  int e
6310: 44 65 73 74 20 3d 20 70 44 65 73 74 2d 3e 65 44  Dest = pDest->eD
6320: 65 73 74 3b 0a 20 20 69 6e 74 20 69 50 61 72 6d  est;.  int iParm
6330: 20 3d 20 70 44 65 73 74 2d 3e 69 50 61 72 6d 3b   = pDest->iParm;
6340: 0a 0a 20 20 69 54 61 62 20 3d 20 70 4f 72 64 65  ..  iTab = pOrde
6350: 72 42 79 2d 3e 69 45 43 75 72 73 6f 72 3b 0a 20  rBy->iECursor;. 
6360: 20 69 66 28 20 65 44 65 73 74 3d 3d 53 52 54 5f   if( eDest==SRT_
6370: 43 61 6c 6c 62 61 63 6b 20 7c 7c 20 65 44 65 73  Callback || eDes
6380: 74 3d 3d 53 52 54 5f 53 75 62 72 6f 75 74 69 6e  t==SRT_Subroutin
6390: 65 20 29 7b 0a 20 20 20 20 70 73 65 75 64 6f 54  e ){.    pseudoT
63a0: 61 62 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61  ab = pParse->nTa
63b0: 62 2b 2b 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  b++;.    sqlite3
63c0: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
63d0: 5f 4f 70 65 6e 50 73 65 75 64 6f 2c 20 70 73 65  _OpenPseudo, pse
63e0: 75 64 6f 54 61 62 2c 20 30 29 3b 0a 20 20 20 20  udoTab, 0);.    
63f0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
6400: 32 28 76 2c 20 4f 50 5f 53 65 74 4e 75 6d 43 6f  2(v, OP_SetNumCo
6410: 6c 75 6d 6e 73 2c 20 70 73 65 75 64 6f 54 61 62  lumns, pseudoTab
6420: 2c 20 6e 43 6f 6c 75 6d 6e 29 3b 0a 20 20 7d 0a  , nColumn);.  }.
6430: 20 20 61 64 64 72 20 3d 20 31 20 2b 20 73 71 6c    addr = 1 + sql
6440: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
6450: 2c 20 4f 50 5f 53 6f 72 74 2c 20 69 54 61 62 2c  , OP_Sort, iTab,
6460: 20 62 72 6b 29 3b 0a 20 20 63 6f 64 65 4f 66 66   brk);.  codeOff
6470: 73 65 74 28 76 2c 20 70 2c 20 63 6f 6e 74 2c 20  set(v, p, cont, 
6480: 30 29 3b 0a 20 20 69 66 28 20 65 44 65 73 74 3d  0);.  if( eDest=
6490: 3d 53 52 54 5f 43 61 6c 6c 62 61 63 6b 20 7c 7c  =SRT_Callback ||
64a0: 20 65 44 65 73 74 3d 3d 53 52 54 5f 53 75 62 72   eDest==SRT_Subr
64b0: 6f 75 74 69 6e 65 20 29 7b 0a 20 20 20 20 73 71  outine ){.    sq
64c0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
64d0: 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 31  v, OP_Integer, 1
64e0: 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  , 0);.  }.  sqli
64f0: 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
6500: 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 69 54 61 62   OP_Column, iTab
6510: 2c 20 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70  , pOrderBy->nExp
6520: 72 20 2b 20 31 29 3b 0a 20 20 73 77 69 74 63 68  r + 1);.  switch
6530: 28 20 65 44 65 73 74 20 29 7b 0a 20 20 20 20 63  ( eDest ){.    c
6540: 61 73 65 20 53 52 54 5f 54 61 62 6c 65 3a 0a 20  ase SRT_Table:. 
6550: 20 20 20 63 61 73 65 20 53 52 54 5f 45 70 68 65     case SRT_Ephe
6560: 6d 54 61 62 3a 20 7b 0a 20 20 20 20 20 20 73 71  mTab: {.      sq
6570: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28  lite3VdbeAddOp1(
6580: 76 2c 20 4f 50 5f 4e 65 77 52 6f 77 69 64 2c 20  v, OP_NewRowid, 
6590: 69 50 61 72 6d 29 3b 0a 20 20 20 20 20 20 73 71  iParm);.      sq
65a0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
65b0: 76 2c 20 4f 50 5f 50 75 6c 6c 2c 20 31 2c 20 30  v, OP_Pull, 1, 0
65c0: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
65d0: 43 6f 64 65 49 6e 73 65 72 74 28 70 50 61 72 73  CodeInsert(pPars
65e0: 65 2c 20 69 50 61 72 6d 2c 20 4f 50 46 4c 41 47  e, iParm, OPFLAG
65f0: 5f 41 50 50 45 4e 44 29 3b 0a 20 20 20 20 20 20  _APPEND);.      
6600: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 69 66  break;.    }.#if
6610: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
6620: 5f 53 55 42 51 55 45 52 59 0a 20 20 20 20 63 61  _SUBQUERY.    ca
6630: 73 65 20 53 52 54 5f 53 65 74 3a 20 7b 0a 20 20  se SRT_Set: {.  
6640: 20 20 20 20 61 73 73 65 72 74 28 20 6e 43 6f 6c      assert( nCol
6650: 75 6d 6e 3d 3d 31 20 29 3b 0a 20 20 20 20 20 20  umn==1 );.      
6660: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
6670: 32 28 76 2c 20 4f 50 5f 4e 6f 74 4e 75 6c 6c 2c  2(v, OP_NotNull,
6680: 20 2d 31 2c 20 73 71 6c 69 74 65 33 56 64 62 65   -1, sqlite3Vdbe
6690: 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 2b 33  CurrentAddr(v)+3
66a0: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
66b0: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
66c0: 5f 50 6f 70 2c 20 31 2c 20 30 29 3b 0a 20 20 20  _Pop, 1, 0);.   
66d0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
66e0: 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c  dOp2(v, OP_Goto,
66f0: 20 30 2c 20 73 71 6c 69 74 65 33 56 64 62 65 43   0, sqlite3VdbeC
6700: 75 72 72 65 6e 74 41 64 64 72 28 76 29 2b 33 29  urrentAddr(v)+3)
6710: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
6720: 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f  dbeAddOp4(v, OP_
6730: 4d 61 6b 65 52 65 63 6f 72 64 2c 20 31 2c 20 30  MakeRecord, 1, 0
6740: 2c 20 30 2c 20 26 70 2d 3e 61 66 66 69 6e 69 74  , 0, &p->affinit
6750: 79 2c 20 31 29 3b 0a 20 20 20 20 20 20 73 71 6c  y, 1);.      sql
6760: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
6770: 2c 20 4f 50 5f 49 64 78 49 6e 73 65 72 74 2c 20  , OP_IdxInsert, 
6780: 69 50 61 72 6d 2c 20 30 29 3b 0a 20 20 20 20 20  iParm, 0);.     
6790: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
67a0: 20 20 63 61 73 65 20 53 52 54 5f 4d 65 6d 3a 20    case SRT_Mem: 
67b0: 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
67c0: 6e 43 6f 6c 75 6d 6e 3d 3d 31 20 29 3b 0a 20 20  nColumn==1 );.  
67d0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
67e0: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4d 6f 76 65  ddOp2(v, OP_Move
67f0: 2c 20 30 2c 20 69 50 61 72 6d 29 3b 0a 20 20 20  , 0, iParm);.   
6800: 20 20 20 2f 2a 20 54 68 65 20 4c 49 4d 49 54 20     /* The LIMIT 
6810: 63 6c 61 75 73 65 20 77 69 6c 6c 20 74 65 72 6d  clause will term
6820: 69 6e 61 74 65 20 74 68 65 20 6c 6f 6f 70 20 66  inate the loop f
6830: 6f 72 20 75 73 20 2a 2f 0a 20 20 20 20 20 20 62  or us */.      b
6840: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64  reak;.    }.#end
6850: 69 66 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f  if.    case SRT_
6860: 43 61 6c 6c 62 61 63 6b 3a 0a 20 20 20 20 63 61  Callback:.    ca
6870: 73 65 20 53 52 54 5f 53 75 62 72 6f 75 74 69 6e  se SRT_Subroutin
6880: 65 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 69  e: {.      int i
6890: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 43  ;.      sqlite3C
68a0: 6f 64 65 49 6e 73 65 72 74 28 70 50 61 72 73 65  odeInsert(pParse
68b0: 2c 20 70 73 65 75 64 6f 54 61 62 2c 20 30 29 3b  , pseudoTab, 0);
68c0: 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  .      for(i=0; 
68d0: 69 3c 6e 43 6f 6c 75 6d 6e 3b 20 69 2b 2b 29 7b  i<nColumn; i++){
68e0: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
68f0: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
6900: 5f 43 6f 6c 75 6d 6e 2c 20 70 73 65 75 64 6f 54  _Column, pseudoT
6910: 61 62 2c 20 69 29 3b 0a 20 20 20 20 20 20 7d 0a  ab, i);.      }.
6920: 20 20 20 20 20 20 69 66 28 20 65 44 65 73 74 3d        if( eDest=
6930: 3d 53 52 54 5f 43 61 6c 6c 62 61 63 6b 20 29 7b  =SRT_Callback ){
6940: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
6950: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
6960: 5f 43 61 6c 6c 62 61 63 6b 2c 20 6e 43 6f 6c 75  _Callback, nColu
6970: 6d 6e 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 65  mn, 0);.      }e
6980: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  lse{.        sql
6990: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
69a0: 2c 20 4f 50 5f 47 6f 73 75 62 2c 20 30 2c 20 69  , OP_Gosub, 0, i
69b0: 50 61 72 6d 29 3b 0a 20 20 20 20 20 20 7d 0a 20  Parm);.      }. 
69c0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
69d0: 7d 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20 7b  }.    default: {
69e0: 0a 20 20 20 20 20 20 2f 2a 20 44 6f 20 6e 6f 74  .      /* Do not
69f0: 68 69 6e 67 20 2a 2f 0a 20 20 20 20 20 20 62 72  hing */.      br
6a00: 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  eak;.    }.  }..
6a10: 20 20 2f 2a 20 4a 75 6d 70 20 74 6f 20 74 68 65    /* Jump to the
6a20: 20 65 6e 64 20 6f 66 20 74 68 65 20 6c 6f 6f 70   end of the loop
6a30: 20 77 68 65 6e 20 74 68 65 20 4c 49 4d 49 54 20   when the LIMIT 
6a40: 69 73 20 72 65 61 63 68 65 64 0a 20 20 2a 2f 0a  is reached.  */.
6a50: 20 20 69 66 28 20 70 2d 3e 69 4c 69 6d 69 74 3e    if( p->iLimit>
6a60: 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  =0 ){.    sqlite
6a70: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
6a80: 50 5f 41 64 64 49 6d 6d 2c 20 70 2d 3e 69 4c 69  P_AddImm, p->iLi
6a90: 6d 69 74 2c 20 2d 31 29 3b 0a 20 20 20 20 73 71  mit, -1);.    sq
6aa0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
6ab0: 76 2c 20 4f 50 5f 49 66 4d 65 6d 5a 65 72 6f 2c  v, OP_IfMemZero,
6ac0: 20 70 2d 3e 69 4c 69 6d 69 74 2c 20 62 72 6b 29   p->iLimit, brk)
6ad0: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20  ;.  }..  /* The 
6ae0: 62 6f 74 74 6f 6d 20 6f 66 20 74 68 65 20 6c 6f  bottom of the lo
6af0: 6f 70 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65  op.  */.  sqlite
6b00: 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65  3VdbeResolveLabe
6b10: 6c 28 76 2c 20 63 6f 6e 74 29 3b 0a 20 20 73 71  l(v, cont);.  sq
6b20: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
6b30: 76 2c 20 4f 50 5f 4e 65 78 74 2c 20 69 54 61 62  v, OP_Next, iTab
6b40: 2c 20 61 64 64 72 29 3b 0a 20 20 73 71 6c 69 74  , addr);.  sqlit
6b50: 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62  e3VdbeResolveLab
6b60: 65 6c 28 76 2c 20 62 72 6b 29 3b 0a 20 20 69 66  el(v, brk);.  if
6b70: 28 20 65 44 65 73 74 3d 3d 53 52 54 5f 43 61 6c  ( eDest==SRT_Cal
6b80: 6c 62 61 63 6b 20 7c 7c 20 65 44 65 73 74 3d 3d  lback || eDest==
6b90: 53 52 54 5f 53 75 62 72 6f 75 74 69 6e 65 20 29  SRT_Subroutine )
6ba0: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  {.    sqlite3Vdb
6bb0: 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 43 6c  eAddOp2(v, OP_Cl
6bc0: 6f 73 65 2c 20 70 73 65 75 64 6f 54 61 62 2c 20  ose, pseudoTab, 
6bd0: 30 29 3b 0a 20 20 7d 0a 0a 7d 0a 0a 2f 2a 0a 2a  0);.  }..}../*.*
6be0: 2a 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74  * Return a point
6bf0: 65 72 20 74 6f 20 61 20 73 74 72 69 6e 67 20 63  er to a string c
6c00: 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 27 64  ontaining the 'd
6c10: 65 63 6c 61 72 61 74 69 6f 6e 20 74 79 70 65 27  eclaration type'
6c20: 20 6f 66 20 74 68 65 0a 2a 2a 20 65 78 70 72 65   of the.** expre
6c30: 73 73 69 6f 6e 20 70 45 78 70 72 2e 20 54 68 65  ssion pExpr. The
6c40: 20 73 74 72 69 6e 67 20 6d 61 79 20 62 65 20 74   string may be t
6c50: 72 65 61 74 65 64 20 61 73 20 73 74 61 74 69 63  reated as static
6c60: 20 62 79 20 74 68 65 20 63 61 6c 6c 65 72 2e 0a   by the caller..
6c70: 2a 2a 0a 2a 2a 20 54 68 65 20 64 65 63 6c 61 72  **.** The declar
6c80: 61 74 69 6f 6e 20 74 79 70 65 20 69 73 20 74 68  ation type is th
6c90: 65 20 65 78 61 63 74 20 64 61 74 61 74 79 70 65  e exact datatype
6ca0: 20 64 65 66 69 6e 69 74 69 6f 6e 20 65 78 74 72   definition extr
6cb0: 61 63 74 65 64 20 66 72 6f 6d 20 74 68 65 0a 2a  acted from the.*
6cc0: 2a 20 6f 72 69 67 69 6e 61 6c 20 43 52 45 41 54  * original CREAT
6cd0: 45 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e  E TABLE statemen
6ce0: 74 20 69 66 20 74 68 65 20 65 78 70 72 65 73 73  t if the express
6cf0: 69 6f 6e 20 69 73 20 61 20 63 6f 6c 75 6d 6e 2e  ion is a column.
6d00: 20 54 68 65 0a 2a 2a 20 64 65 63 6c 61 72 61 74   The.** declarat
6d10: 69 6f 6e 20 74 79 70 65 20 66 6f 72 20 61 20 52  ion type for a R
6d20: 4f 57 49 44 20 66 69 65 6c 64 20 69 73 20 49 4e  OWID field is IN
6d30: 54 45 47 45 52 2e 20 45 78 61 63 74 6c 79 20 77  TEGER. Exactly w
6d40: 68 65 6e 20 61 6e 20 65 78 70 72 65 73 73 69 6f  hen an expressio
6d50: 6e 0a 2a 2a 20 69 73 20 63 6f 6e 73 69 64 65 72  n.** is consider
6d60: 65 64 20 61 20 63 6f 6c 75 6d 6e 20 63 61 6e 20  ed a column can 
6d70: 62 65 20 63 6f 6d 70 6c 65 78 20 69 6e 20 74 68  be complex in th
6d80: 65 20 70 72 65 73 65 6e 63 65 20 6f 66 20 73 75  e presence of su
6d90: 62 71 75 65 72 69 65 73 2e 20 54 68 65 0a 2a 2a  bqueries. The.**
6da0: 20 72 65 73 75 6c 74 2d 73 65 74 20 65 78 70 72   result-set expr
6db0: 65 73 73 69 6f 6e 20 69 6e 20 61 6c 6c 20 6f 66  ession in all of
6dc0: 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 53   the following S
6dd0: 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 73  ELECT statements
6de0: 20 69 73 20 0a 2a 2a 20 63 6f 6e 73 69 64 65 72   is .** consider
6df0: 65 64 20 61 20 63 6f 6c 75 6d 6e 20 62 79 20 74  ed a column by t
6e00: 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a  his function..**
6e10: 0a 2a 2a 20 20 20 53 45 4c 45 43 54 20 63 6f 6c  .**   SELECT col
6e20: 20 46 52 4f 4d 20 74 62 6c 3b 0a 2a 2a 20 20 20   FROM tbl;.**   
6e30: 53 45 4c 45 43 54 20 28 53 45 4c 45 43 54 20 63  SELECT (SELECT c
6e40: 6f 6c 20 46 52 4f 4d 20 74 62 6c 3b 0a 2a 2a 20  ol FROM tbl;.** 
6e50: 20 20 53 45 4c 45 43 54 20 28 53 45 4c 45 43 54    SELECT (SELECT
6e60: 20 63 6f 6c 20 46 52 4f 4d 20 74 62 6c 29 3b 0a   col FROM tbl);.
6e70: 2a 2a 20 20 20 53 45 4c 45 43 54 20 61 62 63 20  **   SELECT abc 
6e80: 46 52 4f 4d 20 28 53 45 4c 45 43 54 20 63 6f 6c  FROM (SELECT col
6e90: 20 41 53 20 61 62 63 20 46 52 4f 4d 20 74 62 6c   AS abc FROM tbl
6ea0: 29 3b 0a 2a 2a 20 0a 2a 2a 20 54 68 65 20 64 65  );.** .** The de
6eb0: 63 6c 61 72 61 74 69 6f 6e 20 74 79 70 65 20 66  claration type f
6ec0: 6f 72 20 61 6e 79 20 65 78 70 72 65 73 73 69 6f  or any expressio
6ed0: 6e 20 6f 74 68 65 72 20 74 68 61 6e 20 61 20 63  n other than a c
6ee0: 6f 6c 75 6d 6e 20 69 73 20 4e 55 4c 4c 2e 0a 2a  olumn is NULL..*
6ef0: 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63  /.static const c
6f00: 68 61 72 20 2a 63 6f 6c 75 6d 6e 54 79 70 65 28  har *columnType(
6f10: 0a 20 20 4e 61 6d 65 43 6f 6e 74 65 78 74 20 2a  .  NameContext *
6f20: 70 4e 43 2c 20 0a 20 20 45 78 70 72 20 2a 70 45  pNC, .  Expr *pE
6f30: 78 70 72 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61  xpr,.  const cha
6f40: 72 20 2a 2a 70 7a 4f 72 69 67 69 6e 44 62 2c 0a  r **pzOriginDb,.
6f50: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 2a 70    const char **p
6f60: 7a 4f 72 69 67 69 6e 54 61 62 2c 0a 20 20 63 6f  zOriginTab,.  co
6f70: 6e 73 74 20 63 68 61 72 20 2a 2a 70 7a 4f 72 69  nst char **pzOri
6f80: 67 69 6e 43 6f 6c 0a 29 7b 0a 20 20 63 68 61 72  ginCol.){.  char
6f90: 20 63 6f 6e 73 74 20 2a 7a 54 79 70 65 20 3d 20   const *zType = 
6fa0: 30 3b 0a 20 20 63 68 61 72 20 63 6f 6e 73 74 20  0;.  char const 
6fb0: 2a 7a 4f 72 69 67 69 6e 44 62 20 3d 20 30 3b 0a  *zOriginDb = 0;.
6fc0: 20 20 63 68 61 72 20 63 6f 6e 73 74 20 2a 7a 4f    char const *zO
6fd0: 72 69 67 69 6e 54 61 62 20 3d 20 30 3b 0a 20 20  riginTab = 0;.  
6fe0: 63 68 61 72 20 63 6f 6e 73 74 20 2a 7a 4f 72 69  char const *zOri
6ff0: 67 69 6e 43 6f 6c 20 3d 20 30 3b 0a 20 20 69 6e  ginCol = 0;.  in
7000: 74 20 6a 3b 0a 20 20 69 66 28 20 70 45 78 70 72  t j;.  if( pExpr
7010: 3d 3d 30 20 7c 7c 20 70 4e 43 2d 3e 70 53 72 63  ==0 || pNC->pSrc
7020: 4c 69 73 74 3d 3d 30 20 29 20 72 65 74 75 72 6e  List==0 ) return
7030: 20 30 3b 0a 0a 20 20 73 77 69 74 63 68 28 20 70   0;..  switch( p
7040: 45 78 70 72 2d 3e 6f 70 20 29 7b 0a 20 20 20 20  Expr->op ){.    
7050: 63 61 73 65 20 54 4b 5f 41 47 47 5f 43 4f 4c 55  case TK_AGG_COLU
7060: 4d 4e 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  MN:.    case TK_
7070: 43 4f 4c 55 4d 4e 3a 20 7b 0a 20 20 20 20 20 20  COLUMN: {.      
7080: 2f 2a 20 54 68 65 20 65 78 70 72 65 73 73 69 6f  /* The expressio
7090: 6e 20 69 73 20 61 20 63 6f 6c 75 6d 6e 2e 20 4c  n is a column. L
70a0: 6f 63 61 74 65 20 74 68 65 20 74 61 62 6c 65 20  ocate the table 
70b0: 74 68 65 20 63 6f 6c 75 6d 6e 20 69 73 20 62 65  the column is be
70c0: 69 6e 67 0a 20 20 20 20 20 20 2a 2a 20 65 78 74  ing.      ** ext
70d0: 72 61 63 74 65 64 20 66 72 6f 6d 20 69 6e 20 4e  racted from in N
70e0: 61 6d 65 43 6f 6e 74 65 78 74 2e 70 53 72 63 4c  ameContext.pSrcL
70f0: 69 73 74 2e 20 54 68 69 73 20 74 61 62 6c 65 20  ist. This table 
7100: 6d 61 79 20 62 65 20 72 65 61 6c 0a 20 20 20 20  may be real.    
7110: 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20 74 61    ** database ta
7120: 62 6c 65 20 6f 72 20 61 20 73 75 62 71 75 65 72  ble or a subquer
7130: 79 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  y..      */.    
7140: 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20    Table *pTab = 
7150: 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  0;            /*
7160: 20 54 61 62 6c 65 20 73 74 72 75 63 74 75 72 65   Table structure
7170: 20 63 6f 6c 75 6d 6e 20 69 73 20 65 78 74 72 61   column is extra
7180: 63 74 65 64 20 66 72 6f 6d 20 2a 2f 0a 20 20 20  cted from */.   
7190: 20 20 20 53 65 6c 65 63 74 20 2a 70 53 20 3d 20     Select *pS = 
71a0: 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  0;             /
71b0: 2a 20 53 65 6c 65 63 74 20 74 68 65 20 63 6f 6c  * Select the col
71c0: 75 6d 6e 20 69 73 20 65 78 74 72 61 63 74 65 64  umn is extracted
71d0: 20 66 72 6f 6d 20 2a 2f 0a 20 20 20 20 20 20 69   from */.      i
71e0: 6e 74 20 69 43 6f 6c 20 3d 20 70 45 78 70 72 2d  nt iCol = pExpr-
71f0: 3e 69 43 6f 6c 75 6d 6e 3b 20 20 2f 2a 20 49 6e  >iColumn;  /* In
7200: 64 65 78 20 6f 66 20 63 6f 6c 75 6d 6e 20 69 6e  dex of column in
7210: 20 70 54 61 62 20 2a 2f 0a 20 20 20 20 20 20 77   pTab */.      w
7220: 68 69 6c 65 28 20 70 4e 43 20 26 26 20 21 70 54  hile( pNC && !pT
7230: 61 62 20 29 7b 0a 20 20 20 20 20 20 20 20 53 72  ab ){.        Sr
7240: 63 4c 69 73 74 20 2a 70 54 61 62 4c 69 73 74 20  cList *pTabList 
7250: 3d 20 70 4e 43 2d 3e 70 53 72 63 4c 69 73 74 3b  = pNC->pSrcList;
7260: 0a 20 20 20 20 20 20 20 20 66 6f 72 28 6a 3d 30  .        for(j=0
7270: 3b 6a 3c 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72  ;j<pTabList->nSr
7280: 63 20 26 26 20 70 54 61 62 4c 69 73 74 2d 3e 61  c && pTabList->a
7290: 5b 6a 5d 2e 69 43 75 72 73 6f 72 21 3d 70 45 78  [j].iCursor!=pEx
72a0: 70 72 2d 3e 69 54 61 62 6c 65 3b 6a 2b 2b 29 3b  pr->iTable;j++);
72b0: 0a 20 20 20 20 20 20 20 20 69 66 28 20 6a 3c 70  .        if( j<p
72c0: 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 20 29 7b  TabList->nSrc ){
72d0: 0a 20 20 20 20 20 20 20 20 20 20 70 54 61 62 20  .          pTab 
72e0: 3d 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 6a 5d  = pTabList->a[j]
72f0: 2e 70 54 61 62 3b 0a 20 20 20 20 20 20 20 20 20  .pTab;.         
7300: 20 70 53 20 3d 20 70 54 61 62 4c 69 73 74 2d 3e   pS = pTabList->
7310: 61 5b 6a 5d 2e 70 53 65 6c 65 63 74 3b 0a 20 20  a[j].pSelect;.  
7320: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
7330: 20 20 20 20 20 20 20 70 4e 43 20 3d 20 70 4e 43         pNC = pNC
7340: 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 20  ->pNext;.       
7350: 20 7d 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20   }.      }..    
7360: 20 20 69 66 28 20 70 54 61 62 3d 3d 30 20 29 7b    if( pTab==0 ){
7370: 0a 20 20 20 20 20 20 20 20 2f 2a 20 46 49 58 20  .        /* FIX 
7380: 4d 45 3a 0a 20 20 20 20 20 20 20 20 2a 2a 20 54  ME:.        ** T
7390: 68 69 73 20 63 61 6e 20 6f 63 63 75 72 73 20 69  his can occurs i
73a0: 66 20 79 6f 75 20 68 61 76 65 20 73 6f 6d 65 74  f you have somet
73b0: 68 69 6e 67 20 6c 69 6b 65 20 22 53 45 4c 45 43  hing like "SELEC
73c0: 54 20 6e 65 77 2e 78 3b 22 20 69 6e 73 69 64 65  T new.x;" inside
73d0: 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 20 74 72  .        ** a tr
73e0: 69 67 67 65 72 2e 20 20 49 6e 20 6f 74 68 65 72  igger.  In other
73f0: 20 77 6f 72 64 73 2c 20 69 66 20 79 6f 75 20 72   words, if you r
7400: 65 66 65 72 65 6e 63 65 20 74 68 65 20 73 70 65  eference the spe
7410: 63 69 61 6c 20 22 6e 65 77 22 0a 20 20 20 20 20  cial "new".     
7420: 20 20 20 2a 2a 20 74 61 62 6c 65 20 69 6e 20 74     ** table in t
7430: 68 65 20 72 65 73 75 6c 74 20 73 65 74 20 6f 66  he result set of
7440: 20 61 20 73 65 6c 65 63 74 2e 20 20 57 65 20 64   a select.  We d
7450: 6f 20 6e 6f 74 20 68 61 76 65 20 61 20 67 6f 6f  o not have a goo
7460: 64 20 77 61 79 0a 20 20 20 20 20 20 20 20 2a 2a  d way.        **
7470: 20 74 6f 20 66 69 6e 64 20 74 68 65 20 61 63 74   to find the act
7480: 75 61 6c 20 74 61 62 6c 65 20 74 79 70 65 2c 20  ual table type, 
7490: 73 6f 20 63 61 6c 6c 20 69 74 20 22 54 45 58 54  so call it "TEXT
74a0: 22 2e 20 20 54 68 69 73 20 69 73 20 72 65 61 6c  ".  This is real
74b0: 6c 79 0a 20 20 20 20 20 20 20 20 2a 2a 20 73 6f  ly.        ** so
74c0: 6d 65 74 68 69 6e 67 20 6f 66 20 61 20 62 75 67  mething of a bug
74d0: 2c 20 62 75 74 20 49 20 64 6f 20 6e 6f 74 20 6b  , but I do not k
74e0: 6e 6f 77 20 68 6f 77 20 74 6f 20 66 69 78 20 69  now how to fix i
74f0: 74 2e 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20  t..        **.  
7500: 20 20 20 20 20 20 2a 2a 20 54 68 69 73 20 63 6f        ** This co
7510: 64 65 20 64 6f 65 73 20 6e 6f 74 20 70 72 6f 64  de does not prod
7520: 75 63 65 20 74 68 65 20 63 6f 72 72 65 63 74 20  uce the correct 
7530: 61 6e 73 77 65 72 20 2d 20 69 74 20 6a 75 73 74  answer - it just
7540: 20 70 72 65 76 65 6e 74 73 0a 20 20 20 20 20 20   prevents.      
7550: 20 20 2a 2a 20 61 20 73 65 67 66 61 75 6c 74 2e    ** a segfault.
7560: 20 20 53 65 65 20 74 69 63 6b 65 74 20 23 31 32    See ticket #12
7570: 32 39 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20  29..        */. 
7580: 20 20 20 20 20 20 20 7a 54 79 70 65 20 3d 20 22         zType = "
7590: 54 45 58 54 22 3b 0a 20 20 20 20 20 20 20 20 62  TEXT";.        b
75a0: 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 0a 20  reak;.      }.. 
75b0: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 54 61       assert( pTa
75c0: 62 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70  b );.      if( p
75d0: 53 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  S ){.        /* 
75e0: 54 68 65 20 22 74 61 62 6c 65 22 20 69 73 20 61  The "table" is a
75f0: 63 74 75 61 6c 6c 79 20 61 20 73 75 62 2d 73 65  ctually a sub-se
7600: 6c 65 63 74 20 6f 72 20 61 20 76 69 65 77 20 69  lect or a view i
7610: 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73  n the FROM claus
7620: 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f 66 20  e.        ** of 
7630: 74 68 65 20 53 45 4c 45 43 54 20 73 74 61 74 65  the SELECT state
7640: 6d 65 6e 74 2e 20 52 65 74 75 72 6e 20 74 68 65  ment. Return the
7650: 20 64 65 63 6c 61 72 61 74 69 6f 6e 20 74 79 70   declaration typ
7660: 65 20 61 6e 64 20 6f 72 69 67 69 6e 0a 20 20 20  e and origin.   
7670: 20 20 20 20 20 2a 2a 20 64 61 74 61 20 66 6f 72       ** data for
7680: 20 74 68 65 20 72 65 73 75 6c 74 2d 73 65 74 20   the result-set 
7690: 63 6f 6c 75 6d 6e 20 6f 66 20 74 68 65 20 73 75  column of the su
76a0: 62 2d 73 65 6c 65 63 74 2e 0a 20 20 20 20 20 20  b-select..      
76b0: 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28    */.        if(
76c0: 20 69 43 6f 6c 3e 3d 30 20 26 26 20 69 43 6f 6c   iCol>=0 && iCol
76d0: 3c 70 53 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78  <pS->pEList->nEx
76e0: 70 72 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  pr ){.          
76f0: 2f 2a 20 49 66 20 69 43 6f 6c 20 69 73 20 6c 65  /* If iCol is le
7700: 73 73 20 74 68 61 6e 20 7a 65 72 6f 2c 20 74 68  ss than zero, th
7710: 65 6e 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  en the expressio
7720: 6e 20 72 65 71 75 65 73 74 73 20 74 68 65 0a 20  n requests the. 
7730: 20 20 20 20 20 20 20 20 20 2a 2a 20 72 6f 77 69           ** rowi
7740: 64 20 6f 66 20 74 68 65 20 73 75 62 2d 73 65 6c  d of the sub-sel
7750: 65 63 74 20 6f 72 20 76 69 65 77 2e 20 54 68 69  ect or view. Thi
7760: 73 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20  s expression is 
7770: 6c 65 67 61 6c 20 28 73 65 65 20 0a 20 20 20 20  legal (see .    
7780: 20 20 20 20 20 20 2a 2a 20 74 65 73 74 20 63 61        ** test ca
7790: 73 65 20 6d 69 73 63 32 2e 32 2e 32 29 20 2d 20  se misc2.2.2) - 
77a0: 69 74 20 61 6c 77 61 79 73 20 65 76 61 6c 75 61  it always evalua
77b0: 74 65 73 20 74 6f 20 4e 55 4c 4c 2e 0a 20 20 20  tes to NULL..   
77c0: 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
77d0: 20 20 20 20 4e 61 6d 65 43 6f 6e 74 65 78 74 20      NameContext 
77e0: 73 4e 43 3b 0a 20 20 20 20 20 20 20 20 20 20 45  sNC;.          E
77f0: 78 70 72 20 2a 70 20 3d 20 70 53 2d 3e 70 45 4c  xpr *p = pS->pEL
7800: 69 73 74 2d 3e 61 5b 69 43 6f 6c 5d 2e 70 45 78  ist->a[iCol].pEx
7810: 70 72 3b 0a 20 20 20 20 20 20 20 20 20 20 73 4e  pr;.          sN
7820: 43 2e 70 53 72 63 4c 69 73 74 20 3d 20 70 53 2d  C.pSrcList = pS-
7830: 3e 70 53 72 63 3b 0a 20 20 20 20 20 20 20 20 20  >pSrc;.         
7840: 20 73 4e 43 2e 70 4e 65 78 74 20 3d 20 30 3b 0a   sNC.pNext = 0;.
7850: 20 20 20 20 20 20 20 20 20 20 73 4e 43 2e 70 50            sNC.pP
7860: 61 72 73 65 20 3d 20 70 4e 43 2d 3e 70 50 61 72  arse = pNC->pPar
7870: 73 65 3b 0a 20 20 20 20 20 20 20 20 20 20 7a 54  se;.          zT
7880: 79 70 65 20 3d 20 63 6f 6c 75 6d 6e 54 79 70 65  ype = columnType
7890: 28 26 73 4e 43 2c 20 70 2c 20 26 7a 4f 72 69 67  (&sNC, p, &zOrig
78a0: 69 6e 44 62 2c 20 26 7a 4f 72 69 67 69 6e 54 61  inDb, &zOriginTa
78b0: 62 2c 20 26 7a 4f 72 69 67 69 6e 43 6f 6c 29 3b  b, &zOriginCol);
78c0: 20 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20   .        }.    
78d0: 20 20 7d 65 6c 73 65 20 69 66 28 20 70 54 61 62    }else if( pTab
78e0: 2d 3e 70 53 63 68 65 6d 61 20 29 7b 0a 20 20 20  ->pSchema ){.   
78f0: 20 20 20 20 20 2f 2a 20 41 20 72 65 61 6c 20 74       /* A real t
7900: 61 62 6c 65 20 2a 2f 0a 20 20 20 20 20 20 20 20  able */.        
7910: 61 73 73 65 72 74 28 20 21 70 53 20 29 3b 0a 20  assert( !pS );. 
7920: 20 20 20 20 20 20 20 69 66 28 20 69 43 6f 6c 3c         if( iCol<
7930: 30 20 29 20 69 43 6f 6c 20 3d 20 70 54 61 62 2d  0 ) iCol = pTab-
7940: 3e 69 50 4b 65 79 3b 0a 20 20 20 20 20 20 20 20  >iPKey;.        
7950: 61 73 73 65 72 74 28 20 69 43 6f 6c 3d 3d 2d 31  assert( iCol==-1
7960: 20 7c 7c 20 28 69 43 6f 6c 3e 3d 30 20 26 26 20   || (iCol>=0 && 
7970: 69 43 6f 6c 3c 70 54 61 62 2d 3e 6e 43 6f 6c 29  iCol<pTab->nCol)
7980: 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20   );.        if( 
7990: 69 43 6f 6c 3c 30 20 29 7b 0a 20 20 20 20 20 20  iCol<0 ){.      
79a0: 20 20 20 20 7a 54 79 70 65 20 3d 20 22 49 4e 54      zType = "INT
79b0: 45 47 45 52 22 3b 0a 20 20 20 20 20 20 20 20 20  EGER";.         
79c0: 20 7a 4f 72 69 67 69 6e 43 6f 6c 20 3d 20 22 72   zOriginCol = "r
79d0: 6f 77 69 64 22 3b 0a 20 20 20 20 20 20 20 20 7d  owid";.        }
79e0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
79f0: 7a 54 79 70 65 20 3d 20 70 54 61 62 2d 3e 61 43  zType = pTab->aC
7a00: 6f 6c 5b 69 43 6f 6c 5d 2e 7a 54 79 70 65 3b 0a  ol[iCol].zType;.
7a10: 20 20 20 20 20 20 20 20 20 20 7a 4f 72 69 67 69            zOrigi
7a20: 6e 43 6f 6c 20 3d 20 70 54 61 62 2d 3e 61 43 6f  nCol = pTab->aCo
7a30: 6c 5b 69 43 6f 6c 5d 2e 7a 4e 61 6d 65 3b 0a 20  l[iCol].zName;. 
7a40: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
7a50: 20 7a 4f 72 69 67 69 6e 54 61 62 20 3d 20 70 54   zOriginTab = pT
7a60: 61 62 2d 3e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20  ab->zName;.     
7a70: 20 20 20 69 66 28 20 70 4e 43 2d 3e 70 50 61 72     if( pNC->pPar
7a80: 73 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  se ){.          
7a90: 69 6e 74 20 69 44 62 20 3d 20 73 71 6c 69 74 65  int iDb = sqlite
7aa0: 33 53 63 68 65 6d 61 54 6f 49 6e 64 65 78 28 70  3SchemaToIndex(p
7ab0: 4e 43 2d 3e 70 50 61 72 73 65 2d 3e 64 62 2c 20  NC->pParse->db, 
7ac0: 70 54 61 62 2d 3e 70 53 63 68 65 6d 61 29 3b 0a  pTab->pSchema);.
7ad0: 20 20 20 20 20 20 20 20 20 20 7a 4f 72 69 67 69            zOrigi
7ae0: 6e 44 62 20 3d 20 70 4e 43 2d 3e 70 50 61 72 73  nDb = pNC->pPars
7af0: 65 2d 3e 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e  e->db->aDb[iDb].
7b00: 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20 20 20 7d  zName;.        }
7b10: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62  .      }.      b
7b20: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 69 66 6e  reak;.    }.#ifn
7b30: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
7b40: 53 55 42 51 55 45 52 59 0a 20 20 20 20 63 61 73  SUBQUERY.    cas
7b50: 65 20 54 4b 5f 53 45 4c 45 43 54 3a 20 7b 0a 20  e TK_SELECT: {. 
7b60: 20 20 20 20 20 2f 2a 20 54 68 65 20 65 78 70 72       /* The expr
7b70: 65 73 73 69 6f 6e 20 69 73 20 61 20 73 75 62 2d  ession is a sub-
7b80: 73 65 6c 65 63 74 2e 20 52 65 74 75 72 6e 20 74  select. Return t
7b90: 68 65 20 64 65 63 6c 61 72 61 74 69 6f 6e 20 74  he declaration t
7ba0: 79 70 65 20 61 6e 64 0a 20 20 20 20 20 20 2a 2a  ype and.      **
7bb0: 20 6f 72 69 67 69 6e 20 69 6e 66 6f 20 66 6f 72   origin info for
7bc0: 20 74 68 65 20 73 69 6e 67 6c 65 20 63 6f 6c 75   the single colu
7bd0: 6d 6e 20 69 6e 20 74 68 65 20 72 65 73 75 6c 74  mn in the result
7be0: 20 73 65 74 20 6f 66 20 74 68 65 20 53 45 4c 45   set of the SELE
7bf0: 43 54 0a 20 20 20 20 20 20 2a 2a 20 73 74 61 74  CT.      ** stat
7c00: 65 6d 65 6e 74 2e 0a 20 20 20 20 20 20 2a 2f 0a  ement..      */.
7c10: 20 20 20 20 20 20 4e 61 6d 65 43 6f 6e 74 65 78        NameContex
7c20: 74 20 73 4e 43 3b 0a 20 20 20 20 20 20 53 65 6c  t sNC;.      Sel
7c30: 65 63 74 20 2a 70 53 20 3d 20 70 45 78 70 72 2d  ect *pS = pExpr-
7c40: 3e 70 53 65 6c 65 63 74 3b 0a 20 20 20 20 20 20  >pSelect;.      
7c50: 45 78 70 72 20 2a 70 20 3d 20 70 53 2d 3e 70 45  Expr *p = pS->pE
7c60: 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72  List->a[0].pExpr
7c70: 3b 0a 20 20 20 20 20 20 73 4e 43 2e 70 53 72 63  ;.      sNC.pSrc
7c80: 4c 69 73 74 20 3d 20 70 53 2d 3e 70 53 72 63 3b  List = pS->pSrc;
7c90: 0a 20 20 20 20 20 20 73 4e 43 2e 70 4e 65 78 74  .      sNC.pNext
7ca0: 20 3d 20 70 4e 43 3b 0a 20 20 20 20 20 20 73 4e   = pNC;.      sN
7cb0: 43 2e 70 50 61 72 73 65 20 3d 20 70 4e 43 2d 3e  C.pParse = pNC->
7cc0: 70 50 61 72 73 65 3b 0a 20 20 20 20 20 20 7a 54  pParse;.      zT
7cd0: 79 70 65 20 3d 20 63 6f 6c 75 6d 6e 54 79 70 65  ype = columnType
7ce0: 28 26 73 4e 43 2c 20 70 2c 20 26 7a 4f 72 69 67  (&sNC, p, &zOrig
7cf0: 69 6e 44 62 2c 20 26 7a 4f 72 69 67 69 6e 54 61  inDb, &zOriginTa
7d00: 62 2c 20 26 7a 4f 72 69 67 69 6e 43 6f 6c 29 3b  b, &zOriginCol);
7d10: 20 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20   .      break;. 
7d20: 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 0a     }.#endif.  }.
7d30: 20 20 0a 20 20 69 66 28 20 70 7a 4f 72 69 67 69    .  if( pzOrigi
7d40: 6e 44 62 20 29 7b 0a 20 20 20 20 61 73 73 65 72  nDb ){.    asser
7d50: 74 28 20 70 7a 4f 72 69 67 69 6e 54 61 62 20 26  t( pzOriginTab &
7d60: 26 20 70 7a 4f 72 69 67 69 6e 43 6f 6c 20 29 3b  & pzOriginCol );
7d70: 0a 20 20 20 20 2a 70 7a 4f 72 69 67 69 6e 44 62  .    *pzOriginDb
7d80: 20 3d 20 7a 4f 72 69 67 69 6e 44 62 3b 0a 20 20   = zOriginDb;.  
7d90: 20 20 2a 70 7a 4f 72 69 67 69 6e 54 61 62 20 3d    *pzOriginTab =
7da0: 20 7a 4f 72 69 67 69 6e 54 61 62 3b 0a 20 20 20   zOriginTab;.   
7db0: 20 2a 70 7a 4f 72 69 67 69 6e 43 6f 6c 20 3d 20   *pzOriginCol = 
7dc0: 7a 4f 72 69 67 69 6e 43 6f 6c 3b 0a 20 20 7d 0a  zOriginCol;.  }.
7dd0: 20 20 72 65 74 75 72 6e 20 7a 54 79 70 65 3b 0a    return zType;.
7de0: 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74  }../*.** Generat
7df0: 65 20 63 6f 64 65 20 74 68 61 74 20 77 69 6c 6c  e code that will
7e00: 20 74 65 6c 6c 20 74 68 65 20 56 44 42 45 20 74   tell the VDBE t
7e10: 68 65 20 64 65 63 6c 61 72 61 74 69 6f 6e 20 74  he declaration t
7e20: 79 70 65 73 20 6f 66 20 63 6f 6c 75 6d 6e 73 0a  ypes of columns.
7e30: 2a 2a 20 69 6e 20 74 68 65 20 72 65 73 75 6c 74  ** in the result
7e40: 20 73 65 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20   set..*/.static 
7e50: 76 6f 69 64 20 67 65 6e 65 72 61 74 65 43 6f 6c  void generateCol
7e60: 75 6d 6e 54 79 70 65 73 28 0a 20 20 50 61 72 73  umnTypes(.  Pars
7e70: 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20  e *pParse,      
7e80: 2f 2a 20 50 61 72 73 65 72 20 63 6f 6e 74 65 78  /* Parser contex
7e90: 74 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a  t */.  SrcList *
7ea0: 70 54 61 62 4c 69 73 74 2c 20 20 2f 2a 20 4c 69  pTabList,  /* Li
7eb0: 73 74 20 6f 66 20 74 61 62 6c 65 73 20 2a 2f 0a  st of tables */.
7ec0: 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69    ExprList *pELi
7ed0: 73 74 20 20 20 20 2f 2a 20 45 78 70 72 65 73 73  st    /* Express
7ee0: 69 6f 6e 73 20 64 65 66 69 6e 69 6e 67 20 74 68  ions defining th
7ef0: 65 20 72 65 73 75 6c 74 20 73 65 74 20 2a 2f 0a  e result set */.
7f00: 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70  ){.  Vdbe *v = p
7f10: 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20  Parse->pVdbe;.  
7f20: 69 6e 74 20 69 3b 0a 20 20 4e 61 6d 65 43 6f 6e  int i;.  NameCon
7f30: 74 65 78 74 20 73 4e 43 3b 0a 20 20 73 4e 43 2e  text sNC;.  sNC.
7f40: 70 53 72 63 4c 69 73 74 20 3d 20 70 54 61 62 4c  pSrcList = pTabL
7f50: 69 73 74 3b 0a 20 20 73 4e 43 2e 70 50 61 72 73  ist;.  sNC.pPars
7f60: 65 20 3d 20 70 50 61 72 73 65 3b 0a 20 20 66 6f  e = pParse;.  fo
7f70: 72 28 69 3d 30 3b 20 69 3c 70 45 4c 69 73 74 2d  r(i=0; i<pEList-
7f80: 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20  >nExpr; i++){.  
7f90: 20 20 45 78 70 72 20 2a 70 20 3d 20 70 45 4c 69    Expr *p = pELi
7fa0: 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 3b 0a  st->a[i].pExpr;.
7fb0: 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
7fc0: 7a 4f 72 69 67 44 62 20 3d 20 30 3b 0a 20 20 20  zOrigDb = 0;.   
7fd0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4f 72   const char *zOr
7fe0: 69 67 54 61 62 20 3d 20 30 3b 0a 20 20 20 20 63  igTab = 0;.    c
7ff0: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4f 72 69 67  onst char *zOrig
8000: 43 6f 6c 20 3d 20 30 3b 0a 20 20 20 20 63 6f 6e  Col = 0;.    con
8010: 73 74 20 63 68 61 72 20 2a 7a 54 79 70 65 20 3d  st char *zType =
8020: 20 63 6f 6c 75 6d 6e 54 79 70 65 28 26 73 4e 43   columnType(&sNC
8030: 2c 20 70 2c 20 26 7a 4f 72 69 67 44 62 2c 20 26  , p, &zOrigDb, &
8040: 7a 4f 72 69 67 54 61 62 2c 20 26 7a 4f 72 69 67  zOrigTab, &zOrig
8050: 43 6f 6c 29 3b 0a 0a 20 20 20 20 2f 2a 20 54 68  Col);..    /* Th
8060: 65 20 76 64 62 65 20 6d 75 73 74 20 6d 61 6b 65  e vdbe must make
8070: 20 69 74 73 20 6f 77 6e 20 63 6f 70 79 20 6f 66   its own copy of
8080: 20 74 68 65 20 63 6f 6c 75 6d 6e 2d 74 79 70 65   the column-type
8090: 20 61 6e 64 20 6f 74 68 65 72 20 0a 20 20 20 20   and other .    
80a0: 2a 2a 20 63 6f 6c 75 6d 6e 20 73 70 65 63 69 66  ** column specif
80b0: 69 63 20 73 74 72 69 6e 67 73 2c 20 69 6e 20 63  ic strings, in c
80c0: 61 73 65 20 74 68 65 20 73 63 68 65 6d 61 20 69  ase the schema i
80d0: 73 20 72 65 73 65 74 20 62 65 66 6f 72 65 20 74  s reset before t
80e0: 68 69 73 0a 20 20 20 20 2a 2a 20 76 69 72 74 75  his.    ** virtu
80f0: 61 6c 20 6d 61 63 68 69 6e 65 20 69 73 20 64 65  al machine is de
8100: 6c 65 74 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20  leted..    */.  
8110: 20 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 74    sqlite3VdbeSet
8120: 43 6f 6c 4e 61 6d 65 28 76 2c 20 69 2c 20 43 4f  ColName(v, i, CO
8130: 4c 4e 41 4d 45 5f 44 45 43 4c 54 59 50 45 2c 20  LNAME_DECLTYPE, 
8140: 7a 54 79 70 65 2c 20 50 34 5f 54 52 41 4e 53 49  zType, P4_TRANSI
8150: 45 4e 54 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  ENT);.    sqlite
8160: 33 56 64 62 65 53 65 74 43 6f 6c 4e 61 6d 65 28  3VdbeSetColName(
8170: 76 2c 20 69 2c 20 43 4f 4c 4e 41 4d 45 5f 44 41  v, i, COLNAME_DA
8180: 54 41 42 41 53 45 2c 20 7a 4f 72 69 67 44 62 2c  TABASE, zOrigDb,
8190: 20 50 34 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a   P4_TRANSIENT);.
81a0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 53      sqlite3VdbeS
81b0: 65 74 43 6f 6c 4e 61 6d 65 28 76 2c 20 69 2c 20  etColName(v, i, 
81c0: 43 4f 4c 4e 41 4d 45 5f 54 41 42 4c 45 2c 20 7a  COLNAME_TABLE, z
81d0: 4f 72 69 67 54 61 62 2c 20 50 34 5f 54 52 41 4e  OrigTab, P4_TRAN
81e0: 53 49 45 4e 54 29 3b 0a 20 20 20 20 73 71 6c 69  SIENT);.    sqli
81f0: 74 65 33 56 64 62 65 53 65 74 43 6f 6c 4e 61 6d  te3VdbeSetColNam
8200: 65 28 76 2c 20 69 2c 20 43 4f 4c 4e 41 4d 45 5f  e(v, i, COLNAME_
8210: 43 4f 4c 55 4d 4e 2c 20 7a 4f 72 69 67 43 6f 6c  COLUMN, zOrigCol
8220: 2c 20 50 34 5f 54 52 41 4e 53 49 45 4e 54 29 3b  , P4_TRANSIENT);
8230: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65  .  }.}../*.** Ge
8240: 6e 65 72 61 74 65 20 63 6f 64 65 20 74 68 61 74  nerate code that
8250: 20 77 69 6c 6c 20 74 65 6c 6c 20 74 68 65 20 56   will tell the V
8260: 44 42 45 20 74 68 65 20 6e 61 6d 65 73 20 6f 66  DBE the names of
8270: 20 63 6f 6c 75 6d 6e 73 0a 2a 2a 20 69 6e 20 74   columns.** in t
8280: 68 65 20 72 65 73 75 6c 74 20 73 65 74 2e 20 20  he result set.  
8290: 54 68 69 73 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  This information
82a0: 20 69 73 20 75 73 65 64 20 74 6f 20 70 72 6f 76   is used to prov
82b0: 69 64 65 20 74 68 65 0a 2a 2a 20 61 7a 43 6f 6c  ide the.** azCol
82c0: 5b 5d 20 76 61 6c 75 65 73 20 69 6e 20 74 68 65  [] values in the
82d0: 20 63 61 6c 6c 62 61 63 6b 2e 0a 2a 2f 0a 73 74   callback..*/.st
82e0: 61 74 69 63 20 76 6f 69 64 20 67 65 6e 65 72 61  atic void genera
82f0: 74 65 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 0a 20  teColumnNames(. 
8300: 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
8310: 20 20 20 20 20 2f 2a 20 50 61 72 73 65 72 20 63       /* Parser c
8320: 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53 72 63 4c  ontext */.  SrcL
8330: 69 73 74 20 2a 70 54 61 62 4c 69 73 74 2c 20 20  ist *pTabList,  
8340: 2f 2a 20 4c 69 73 74 20 6f 66 20 74 61 62 6c 65  /* List of table
8350: 73 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20  s */.  ExprList 
8360: 2a 70 45 4c 69 73 74 20 20 20 20 2f 2a 20 45 78  *pEList    /* Ex
8370: 70 72 65 73 73 69 6f 6e 73 20 64 65 66 69 6e 69  pressions defini
8380: 6e 67 20 74 68 65 20 72 65 73 75 6c 74 20 73 65  ng the result se
8390: 74 20 2a 2f 0a 29 7b 0a 20 20 56 64 62 65 20 2a  t */.){.  Vdbe *
83a0: 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62  v = pParse->pVdb
83b0: 65 3b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20  e;.  int i, j;. 
83c0: 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70   sqlite3 *db = p
83d0: 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 69 6e 74  Parse->db;.  int
83e0: 20 66 75 6c 6c 4e 61 6d 65 73 2c 20 73 68 6f 72   fullNames, shor
83f0: 74 4e 61 6d 65 73 3b 0a 0a 23 69 66 6e 64 65 66  tNames;..#ifndef
8400: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 45 58 50   SQLITE_OMIT_EXP
8410: 4c 41 49 4e 0a 20 20 2f 2a 20 49 66 20 74 68 69  LAIN.  /* If thi
8420: 73 20 69 73 20 61 6e 20 45 58 50 4c 41 49 4e 2c  s is an EXPLAIN,
8430: 20 73 6b 69 70 20 74 68 69 73 20 73 74 65 70 20   skip this step 
8440: 2a 2f 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d  */.  if( pParse-
8450: 3e 65 78 70 6c 61 69 6e 20 29 7b 0a 20 20 20 20  >explain ){.    
8460: 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 23 65 6e 64  return;.  }.#end
8470: 69 66 0a 0a 20 20 61 73 73 65 72 74 28 20 76 21  if..  assert( v!
8480: 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 50 61 72  =0 );.  if( pPar
8490: 73 65 2d 3e 63 6f 6c 4e 61 6d 65 73 53 65 74 20  se->colNamesSet 
84a0: 7c 7c 20 76 3d 3d 30 20 7c 7c 20 64 62 2d 3e 6d  || v==0 || db->m
84b0: 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20 72 65  allocFailed ) re
84c0: 74 75 72 6e 3b 0a 20 20 70 50 61 72 73 65 2d 3e  turn;.  pParse->
84d0: 63 6f 6c 4e 61 6d 65 73 53 65 74 20 3d 20 31 3b  colNamesSet = 1;
84e0: 0a 20 20 66 75 6c 6c 4e 61 6d 65 73 20 3d 20 28  .  fullNames = (
84f0: 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49  db->flags & SQLI
8500: 54 45 5f 46 75 6c 6c 43 6f 6c 4e 61 6d 65 73 29  TE_FullColNames)
8510: 21 3d 30 3b 0a 20 20 73 68 6f 72 74 4e 61 6d 65  !=0;.  shortName
8520: 73 20 3d 20 28 64 62 2d 3e 66 6c 61 67 73 20 26  s = (db->flags &
8530: 20 53 51 4c 49 54 45 5f 53 68 6f 72 74 43 6f 6c   SQLITE_ShortCol
8540: 4e 61 6d 65 73 29 21 3d 30 3b 0a 20 20 73 71 6c  Names)!=0;.  sql
8550: 69 74 65 33 56 64 62 65 53 65 74 4e 75 6d 43 6f  ite3VdbeSetNumCo
8560: 6c 73 28 76 2c 20 70 45 4c 69 73 74 2d 3e 6e 45  ls(v, pEList->nE
8570: 78 70 72 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  xpr);.  for(i=0;
8580: 20 69 3c 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72   i<pEList->nExpr
8590: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72  ; i++){.    Expr
85a0: 20 2a 70 3b 0a 20 20 20 20 70 20 3d 20 70 45 4c   *p;.    p = pEL
85b0: 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 3b  ist->a[i].pExpr;
85c0: 0a 20 20 20 20 69 66 28 20 70 3d 3d 30 20 29 20  .    if( p==0 ) 
85d0: 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69 66  continue;.    if
85e0: 28 20 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a  ( pEList->a[i].z
85f0: 4e 61 6d 65 20 29 7b 0a 20 20 20 20 20 20 63 68  Name ){.      ch
8600: 61 72 20 2a 7a 4e 61 6d 65 20 3d 20 70 45 4c 69  ar *zName = pELi
8610: 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 3b 0a  st->a[i].zName;.
8620: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
8630: 65 53 65 74 43 6f 6c 4e 61 6d 65 28 76 2c 20 69  eSetColName(v, i
8640: 2c 20 43 4f 4c 4e 41 4d 45 5f 4e 41 4d 45 2c 20  , COLNAME_NAME, 
8650: 7a 4e 61 6d 65 2c 20 73 74 72 6c 65 6e 28 7a 4e  zName, strlen(zN
8660: 61 6d 65 29 29 3b 0a 20 20 20 20 20 20 63 6f 6e  ame));.      con
8670: 74 69 6e 75 65 3b 0a 20 20 20 20 7d 0a 20 20 20  tinue;.    }.   
8680: 20 69 66 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 43   if( p->op==TK_C
8690: 4f 4c 55 4d 4e 20 26 26 20 70 54 61 62 4c 69 73  OLUMN && pTabLis
86a0: 74 20 29 7b 0a 20 20 20 20 20 20 54 61 62 6c 65  t ){.      Table
86b0: 20 2a 70 54 61 62 3b 0a 20 20 20 20 20 20 63 68   *pTab;.      ch
86c0: 61 72 20 2a 7a 43 6f 6c 3b 0a 20 20 20 20 20 20  ar *zCol;.      
86d0: 69 6e 74 20 69 43 6f 6c 20 3d 20 70 2d 3e 69 43  int iCol = p->iC
86e0: 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20 20 66 6f 72  olumn;.      for
86f0: 28 6a 3d 30 3b 20 6a 3c 70 54 61 62 4c 69 73 74  (j=0; j<pTabList
8700: 2d 3e 6e 53 72 63 20 26 26 20 70 54 61 62 4c 69  ->nSrc && pTabLi
8710: 73 74 2d 3e 61 5b 6a 5d 2e 69 43 75 72 73 6f 72  st->a[j].iCursor
8720: 21 3d 70 2d 3e 69 54 61 62 6c 65 3b 20 6a 2b 2b  !=p->iTable; j++
8730: 29 7b 7d 0a 20 20 20 20 20 20 61 73 73 65 72 74  ){}.      assert
8740: 28 20 6a 3c 70 54 61 62 4c 69 73 74 2d 3e 6e 53  ( j<pTabList->nS
8750: 72 63 20 29 3b 0a 20 20 20 20 20 20 70 54 61 62  rc );.      pTab
8760: 20 3d 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 6a   = pTabList->a[j
8770: 5d 2e 70 54 61 62 3b 0a 20 20 20 20 20 20 69 66  ].pTab;.      if
8780: 28 20 69 43 6f 6c 3c 30 20 29 20 69 43 6f 6c 20  ( iCol<0 ) iCol 
8790: 3d 20 70 54 61 62 2d 3e 69 50 4b 65 79 3b 0a 20  = pTab->iPKey;. 
87a0: 20 20 20 20 20 61 73 73 65 72 74 28 20 69 43 6f       assert( iCo
87b0: 6c 3d 3d 2d 31 20 7c 7c 20 28 69 43 6f 6c 3e 3d  l==-1 || (iCol>=
87c0: 30 20 26 26 20 69 43 6f 6c 3c 70 54 61 62 2d 3e  0 && iCol<pTab->
87d0: 6e 43 6f 6c 29 20 29 3b 0a 20 20 20 20 20 20 69  nCol) );.      i
87e0: 66 28 20 69 43 6f 6c 3c 30 20 29 7b 0a 20 20 20  f( iCol<0 ){.   
87f0: 20 20 20 20 20 7a 43 6f 6c 20 3d 20 22 72 6f 77       zCol = "row
8800: 69 64 22 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  id";.      }else
8810: 7b 0a 20 20 20 20 20 20 20 20 7a 43 6f 6c 20 3d  {.        zCol =
8820: 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c   pTab->aCol[iCol
8830: 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20 7d  ].zName;.      }
8840: 0a 20 20 20 20 20 20 69 66 28 20 21 73 68 6f 72  .      if( !shor
8850: 74 4e 61 6d 65 73 20 26 26 20 21 66 75 6c 6c 4e  tNames && !fullN
8860: 61 6d 65 73 20 26 26 20 70 2d 3e 73 70 61 6e 2e  ames && p->span.
8870: 7a 20 26 26 20 70 2d 3e 73 70 61 6e 2e 7a 5b 30  z && p->span.z[0
8880: 5d 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  ] ){.        sql
8890: 69 74 65 33 56 64 62 65 53 65 74 43 6f 6c 4e 61  ite3VdbeSetColNa
88a0: 6d 65 28 76 2c 20 69 2c 20 43 4f 4c 4e 41 4d 45  me(v, i, COLNAME
88b0: 5f 4e 41 4d 45 2c 20 28 63 68 61 72 2a 29 70 2d  _NAME, (char*)p-
88c0: 3e 73 70 61 6e 2e 7a 2c 20 70 2d 3e 73 70 61 6e  >span.z, p->span
88d0: 2e 6e 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  .n);.      }else
88e0: 20 69 66 28 20 66 75 6c 6c 4e 61 6d 65 73 20 7c   if( fullNames |
88f0: 7c 20 28 21 73 68 6f 72 74 4e 61 6d 65 73 20 26  | (!shortNames &
8900: 26 20 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63  & pTabList->nSrc
8910: 3e 31 29 20 29 7b 0a 20 20 20 20 20 20 20 20 63  >1) ){.        c
8920: 68 61 72 20 2a 7a 4e 61 6d 65 20 3d 20 30 3b 0a  har *zName = 0;.
8930: 20 20 20 20 20 20 20 20 63 68 61 72 20 2a 7a 54          char *zT
8940: 61 62 3b 0a 20 0a 20 20 20 20 20 20 20 20 7a 54  ab;. .        zT
8950: 61 62 20 3d 20 70 54 61 62 4c 69 73 74 2d 3e 61  ab = pTabList->a
8960: 5b 6a 5d 2e 7a 41 6c 69 61 73 3b 0a 20 20 20 20  [j].zAlias;.    
8970: 20 20 20 20 69 66 28 20 66 75 6c 6c 4e 61 6d 65      if( fullName
8980: 73 20 7c 7c 20 7a 54 61 62 3d 3d 30 20 29 20 7a  s || zTab==0 ) z
8990: 54 61 62 20 3d 20 70 54 61 62 2d 3e 7a 4e 61 6d  Tab = pTab->zNam
89a0: 65 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  e;.        sqlit
89b0: 65 33 53 65 74 53 74 72 69 6e 67 28 26 7a 4e 61  e3SetString(&zNa
89c0: 6d 65 2c 20 7a 54 61 62 2c 20 22 2e 22 2c 20 7a  me, zTab, ".", z
89d0: 43 6f 6c 2c 20 28 63 68 61 72 2a 29 30 29 3b 0a  Col, (char*)0);.
89e0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
89f0: 64 62 65 53 65 74 43 6f 6c 4e 61 6d 65 28 76 2c  dbeSetColName(v,
8a00: 20 69 2c 20 43 4f 4c 4e 41 4d 45 5f 4e 41 4d 45   i, COLNAME_NAME
8a10: 2c 20 7a 4e 61 6d 65 2c 20 50 34 5f 44 59 4e 41  , zName, P4_DYNA
8a20: 4d 49 43 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  MIC);.      }els
8a30: 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  e{.        sqlit
8a40: 65 33 56 64 62 65 53 65 74 43 6f 6c 4e 61 6d 65  e3VdbeSetColName
8a50: 28 76 2c 20 69 2c 20 43 4f 4c 4e 41 4d 45 5f 4e  (v, i, COLNAME_N
8a60: 41 4d 45 2c 20 7a 43 6f 6c 2c 20 73 74 72 6c 65  AME, zCol, strle
8a70: 6e 28 7a 43 6f 6c 29 29 3b 0a 20 20 20 20 20 20  n(zCol));.      
8a80: 7d 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  }.    }else if( 
8a90: 70 2d 3e 73 70 61 6e 2e 7a 20 26 26 20 70 2d 3e  p->span.z && p->
8aa0: 73 70 61 6e 2e 7a 5b 30 5d 20 29 7b 0a 20 20 20  span.z[0] ){.   
8ab0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 53 65     sqlite3VdbeSe
8ac0: 74 43 6f 6c 4e 61 6d 65 28 76 2c 20 69 2c 20 43  tColName(v, i, C
8ad0: 4f 4c 4e 41 4d 45 5f 4e 41 4d 45 2c 20 28 63 68  OLNAME_NAME, (ch
8ae0: 61 72 2a 29 70 2d 3e 73 70 61 6e 2e 7a 2c 20 70  ar*)p->span.z, p
8af0: 2d 3e 73 70 61 6e 2e 6e 29 3b 0a 20 20 20 20 20  ->span.n);.     
8b00: 20 2f 2a 20 73 71 6c 69 74 65 33 56 64 62 65 43   /* sqlite3VdbeC
8b10: 6f 6d 70 72 65 73 73 53 70 61 63 65 28 76 2c 20  ompressSpace(v, 
8b20: 61 64 64 72 29 3b 20 2a 2f 0a 20 20 20 20 7d 65  addr); */.    }e
8b30: 6c 73 65 7b 0a 20 20 20 20 20 20 63 68 61 72 20  lse{.      char 
8b40: 7a 4e 61 6d 65 5b 33 30 5d 3b 0a 20 20 20 20 20  zName[30];.     
8b50: 20 61 73 73 65 72 74 28 20 70 2d 3e 6f 70 21 3d   assert( p->op!=
8b60: 54 4b 5f 43 4f 4c 55 4d 4e 20 7c 7c 20 70 54 61  TK_COLUMN || pTa
8b70: 62 4c 69 73 74 3d 3d 30 20 29 3b 0a 20 20 20 20  bList==0 );.    
8b80: 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e    sqlite3_snprin
8b90: 74 66 28 73 69 7a 65 6f 66 28 7a 4e 61 6d 65 29  tf(sizeof(zName)
8ba0: 2c 20 7a 4e 61 6d 65 2c 20 22 63 6f 6c 75 6d 6e  , zName, "column
8bb0: 25 64 22 2c 20 69 2b 31 29 3b 0a 20 20 20 20 20  %d", i+1);.     
8bc0: 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 74 43   sqlite3VdbeSetC
8bd0: 6f 6c 4e 61 6d 65 28 76 2c 20 69 2c 20 43 4f 4c  olName(v, i, COL
8be0: 4e 41 4d 45 5f 4e 41 4d 45 2c 20 7a 4e 61 6d 65  NAME_NAME, zName
8bf0: 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  , 0);.    }.  }.
8c00: 20 20 67 65 6e 65 72 61 74 65 43 6f 6c 75 6d 6e    generateColumn
8c10: 54 79 70 65 73 28 70 50 61 72 73 65 2c 20 70 54  Types(pParse, pT
8c20: 61 62 4c 69 73 74 2c 20 70 45 4c 69 73 74 29 3b  abList, pEList);
8c30: 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  .}..#ifndef SQLI
8c40: 54 45 5f 4f 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44  TE_OMIT_COMPOUND
8c50: 5f 53 45 4c 45 43 54 0a 2f 2a 0a 2a 2a 20 4e 61  _SELECT./*.** Na
8c60: 6d 65 20 6f 66 20 74 68 65 20 63 6f 6e 6e 65 63  me of the connec
8c70: 74 69 6f 6e 20 6f 70 65 72 61 74 6f 72 2c 20 75  tion operator, u
8c80: 73 65 64 20 66 6f 72 20 65 72 72 6f 72 20 6d 65  sed for error me
8c90: 73 73 61 67 65 73 2e 0a 2a 2f 0a 73 74 61 74 69  ssages..*/.stati
8ca0: 63 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 73 65  c const char *se
8cb0: 6c 65 63 74 4f 70 4e 61 6d 65 28 69 6e 74 20 69  lectOpName(int i
8cc0: 64 29 7b 0a 20 20 63 68 61 72 20 2a 7a 3b 0a 20  d){.  char *z;. 
8cd0: 20 73 77 69 74 63 68 28 20 69 64 20 29 7b 0a 20   switch( id ){. 
8ce0: 20 20 20 63 61 73 65 20 54 4b 5f 41 4c 4c 3a 20     case TK_ALL: 
8cf0: 20 20 20 20 20 20 7a 20 3d 20 22 55 4e 49 4f 4e        z = "UNION
8d00: 20 41 4c 4c 22 3b 20 20 20 62 72 65 61 6b 3b 0a   ALL";   break;.
8d10: 20 20 20 20 63 61 73 65 20 54 4b 5f 49 4e 54 45      case TK_INTE
8d20: 52 53 45 43 54 3a 20 7a 20 3d 20 22 49 4e 54 45  RSECT: z = "INTE
8d30: 52 53 45 43 54 22 3b 20 20 20 62 72 65 61 6b 3b  RSECT";   break;
8d40: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 45 58 43  .    case TK_EXC
8d50: 45 50 54 3a 20 20 20 20 7a 20 3d 20 22 45 58 43  EPT:    z = "EXC
8d60: 45 50 54 22 3b 20 20 20 20 20 20 62 72 65 61 6b  EPT";      break
8d70: 3b 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20 20  ;.    default:  
8d80: 20 20 20 20 20 20 20 20 20 7a 20 3d 20 22 55 4e           z = "UN
8d90: 49 4f 4e 22 3b 20 20 20 20 20 20 20 62 72 65 61  ION";       brea
8da0: 6b 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  k;.  }.  return 
8db0: 7a 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53  z;.}.#endif /* S
8dc0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f 4d 50 4f  QLITE_OMIT_COMPO
8dd0: 55 4e 44 5f 53 45 4c 45 43 54 20 2a 2f 0a 0a 2f  UND_SELECT */../
8de0: 2a 0a 2a 2a 20 46 6f 72 77 61 72 64 20 64 65 63  *.** Forward dec
8df0: 6c 61 72 61 74 69 6f 6e 0a 2a 2f 0a 73 74 61 74  laration.*/.stat
8e00: 69 63 20 69 6e 74 20 70 72 65 70 53 65 6c 65 63  ic int prepSelec
8e10: 74 53 74 6d 74 28 50 61 72 73 65 2a 2c 20 53 65  tStmt(Parse*, Se
8e20: 6c 65 63 74 2a 29 3b 0a 0a 2f 2a 0a 2a 2a 20 47  lect*);../*.** G
8e30: 69 76 65 6e 20 61 20 53 45 4c 45 43 54 20 73 74  iven a SELECT st
8e40: 61 74 65 6d 65 6e 74 2c 20 67 65 6e 65 72 61 74  atement, generat
8e50: 65 20 61 20 54 61 62 6c 65 20 73 74 72 75 63 74  e a Table struct
8e60: 75 72 65 20 74 68 61 74 20 64 65 73 63 72 69 62  ure that describ
8e70: 65 73 0a 2a 2a 20 74 68 65 20 72 65 73 75 6c 74  es.** the result
8e80: 20 73 65 74 20 6f 66 20 74 68 61 74 20 53 45 4c   set of that SEL
8e90: 45 43 54 2e 0a 2a 2f 0a 54 61 62 6c 65 20 2a 73  ECT..*/.Table *s
8ea0: 71 6c 69 74 65 33 52 65 73 75 6c 74 53 65 74 4f  qlite3ResultSetO
8eb0: 66 53 65 6c 65 63 74 28 50 61 72 73 65 20 2a 70  fSelect(Parse *p
8ec0: 50 61 72 73 65 2c 20 63 68 61 72 20 2a 7a 54 61  Parse, char *zTa
8ed0: 62 4e 61 6d 65 2c 20 53 65 6c 65 63 74 20 2a 70  bName, Select *p
8ee0: 53 65 6c 65 63 74 29 7b 0a 20 20 54 61 62 6c 65  Select){.  Table
8ef0: 20 2a 70 54 61 62 3b 0a 20 20 69 6e 74 20 69 2c   *pTab;.  int i,
8f00: 20 6a 3b 0a 20 20 45 78 70 72 4c 69 73 74 20 2a   j;.  ExprList *
8f10: 70 45 4c 69 73 74 3b 0a 20 20 43 6f 6c 75 6d 6e  pEList;.  Column
8f20: 20 2a 61 43 6f 6c 2c 20 2a 70 43 6f 6c 3b 0a 20   *aCol, *pCol;. 
8f30: 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70   sqlite3 *db = p
8f40: 50 61 72 73 65 2d 3e 64 62 3b 0a 0a 20 20 77 68  Parse->db;..  wh
8f50: 69 6c 65 28 20 70 53 65 6c 65 63 74 2d 3e 70 50  ile( pSelect->pP
8f60: 72 69 6f 72 20 29 20 70 53 65 6c 65 63 74 20 3d  rior ) pSelect =
8f70: 20 70 53 65 6c 65 63 74 2d 3e 70 50 72 69 6f 72   pSelect->pPrior
8f80: 3b 0a 20 20 69 66 28 20 70 72 65 70 53 65 6c 65  ;.  if( prepSele
8f90: 63 74 53 74 6d 74 28 70 50 61 72 73 65 2c 20 70  ctStmt(pParse, p
8fa0: 53 65 6c 65 63 74 29 20 29 7b 0a 20 20 20 20 72  Select) ){.    r
8fb0: 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 69  eturn 0;.  }.  i
8fc0: 66 28 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74  f( sqlite3Select
8fd0: 52 65 73 6f 6c 76 65 28 70 50 61 72 73 65 2c 20  Resolve(pParse, 
8fe0: 70 53 65 6c 65 63 74 2c 20 30 29 20 29 7b 0a 20  pSelect, 0) ){. 
8ff0: 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d     return 0;.  }
9000: 0a 20 20 70 54 61 62 20 3d 20 73 71 6c 69 74 65  .  pTab = sqlite
9010: 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62  3DbMallocZero(db
9020: 2c 20 73 69 7a 65 6f 66 28 54 61 62 6c 65 29 20  , sizeof(Table) 
9030: 29 3b 0a 20 20 69 66 28 20 70 54 61 62 3d 3d 30  );.  if( pTab==0
9040: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30   ){.    return 0
9050: 3b 0a 20 20 7d 0a 20 20 70 54 61 62 2d 3e 6e 52  ;.  }.  pTab->nR
9060: 65 66 20 3d 20 31 3b 0a 20 20 70 54 61 62 2d 3e  ef = 1;.  pTab->
9070: 7a 4e 61 6d 65 20 3d 20 7a 54 61 62 4e 61 6d 65  zName = zTabName
9080: 20 3f 20 73 71 6c 69 74 65 33 44 62 53 74 72 44   ? sqlite3DbStrD
9090: 75 70 28 64 62 2c 20 7a 54 61 62 4e 61 6d 65 29  up(db, zTabName)
90a0: 20 3a 20 30 3b 0a 20 20 70 45 4c 69 73 74 20 3d   : 0;.  pEList =
90b0: 20 70 53 65 6c 65 63 74 2d 3e 70 45 4c 69 73 74   pSelect->pEList
90c0: 3b 0a 20 20 70 54 61 62 2d 3e 6e 43 6f 6c 20 3d  ;.  pTab->nCol =
90d0: 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 0a   pEList->nExpr;.
90e0: 20 20 61 73 73 65 72 74 28 20 70 54 61 62 2d 3e    assert( pTab->
90f0: 6e 43 6f 6c 3e 30 20 29 3b 0a 20 20 70 54 61 62  nCol>0 );.  pTab
9100: 2d 3e 61 43 6f 6c 20 3d 20 61 43 6f 6c 20 3d 20  ->aCol = aCol = 
9110: 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a  sqlite3DbMallocZ
9120: 65 72 6f 28 64 62 2c 20 73 69 7a 65 6f 66 28 70  ero(db, sizeof(p
9130: 54 61 62 2d 3e 61 43 6f 6c 5b 30 5d 29 2a 70 54  Tab->aCol[0])*pT
9140: 61 62 2d 3e 6e 43 6f 6c 29 3b 0a 20 20 66 6f 72  ab->nCol);.  for
9150: 28 69 3d 30 2c 20 70 43 6f 6c 3d 61 43 6f 6c 3b  (i=0, pCol=aCol;
9160: 20 69 3c 70 54 61 62 2d 3e 6e 43 6f 6c 3b 20 69   i<pTab->nCol; i
9170: 2b 2b 2c 20 70 43 6f 6c 2b 2b 29 7b 0a 20 20 20  ++, pCol++){.   
9180: 20 45 78 70 72 20 2a 70 2c 20 2a 70 52 3b 0a 20   Expr *p, *pR;. 
9190: 20 20 20 63 68 61 72 20 2a 7a 54 79 70 65 3b 0a     char *zType;.
91a0: 20 20 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 3b      char *zName;
91b0: 0a 20 20 20 20 69 6e 74 20 6e 4e 61 6d 65 3b 0a  .    int nName;.
91c0: 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f      CollSeq *pCo
91d0: 6c 6c 3b 0a 20 20 20 20 69 6e 74 20 63 6e 74 3b  ll;.    int cnt;
91e0: 0a 20 20 20 20 4e 61 6d 65 43 6f 6e 74 65 78 74  .    NameContext
91f0: 20 73 4e 43 3b 0a 20 20 20 20 0a 20 20 20 20 2f   sNC;.    .    /
9200: 2a 20 47 65 74 20 61 6e 20 61 70 70 72 6f 70 72  * Get an appropr
9210: 69 61 74 65 20 6e 61 6d 65 20 66 6f 72 20 74 68  iate name for th
9220: 65 20 63 6f 6c 75 6d 6e 0a 20 20 20 20 2a 2f 0a  e column.    */.
9230: 20 20 20 20 70 20 3d 20 70 45 4c 69 73 74 2d 3e      p = pEList->
9240: 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20  a[i].pExpr;.    
9250: 61 73 73 65 72 74 28 20 70 2d 3e 70 52 69 67 68  assert( p->pRigh
9260: 74 3d 3d 30 20 7c 7c 20 70 2d 3e 70 52 69 67 68  t==0 || p->pRigh
9270: 74 2d 3e 74 6f 6b 65 6e 2e 7a 3d 3d 30 20 7c 7c  t->token.z==0 ||
9280: 20 70 2d 3e 70 52 69 67 68 74 2d 3e 74 6f 6b 65   p->pRight->toke
9290: 6e 2e 7a 5b 30 5d 21 3d 30 20 29 3b 0a 20 20 20  n.z[0]!=0 );.   
92a0: 20 69 66 28 20 28 7a 4e 61 6d 65 20 3d 20 70 45   if( (zName = pE
92b0: 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65  List->a[i].zName
92c0: 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a  )!=0 ){.      /*
92d0: 20 49 66 20 74 68 65 20 63 6f 6c 75 6d 6e 20 63   If the column c
92e0: 6f 6e 74 61 69 6e 73 20 61 6e 20 22 41 53 20 3c  ontains an "AS <
92f0: 6e 61 6d 65 3e 22 20 70 68 72 61 73 65 2c 20 75  name>" phrase, u
9300: 73 65 20 3c 6e 61 6d 65 3e 20 61 73 20 74 68 65  se <name> as the
9310: 20 6e 61 6d 65 20 2a 2f 0a 20 20 20 20 20 20 7a   name */.      z
9320: 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 44 62  Name = sqlite3Db
9330: 53 74 72 44 75 70 28 64 62 2c 20 7a 4e 61 6d 65  StrDup(db, zName
9340: 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  );.    }else if(
9350: 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 44 4f 54 20 0a   p->op==TK_DOT .
9360: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 26 26                &&
9370: 20 28 70 52 3d 70 2d 3e 70 52 69 67 68 74 29 21   (pR=p->pRight)!
9380: 3d 30 20 26 26 20 70 52 2d 3e 74 6f 6b 65 6e 2e  =0 && pR->token.
9390: 7a 20 26 26 20 70 52 2d 3e 74 6f 6b 65 6e 2e 7a  z && pR->token.z
93a0: 5b 30 5d 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  [0] ){.      /* 
93b0: 46 6f 72 20 63 6f 6c 75 6d 6e 73 20 6f 66 20 74  For columns of t
93c0: 68 65 20 66 72 6f 6d 20 41 2e 42 20 75 73 65 20  he from A.B use 
93d0: 42 20 61 73 20 74 68 65 20 6e 61 6d 65 20 2a 2f  B as the name */
93e0: 0a 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 73  .      zName = s
93f0: 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 64 62  qlite3MPrintf(db
9400: 2c 20 22 25 54 22 2c 20 26 70 52 2d 3e 74 6f 6b  , "%T", &pR->tok
9410: 65 6e 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69  en);.    }else i
9420: 66 28 20 70 2d 3e 73 70 61 6e 2e 7a 20 26 26 20  f( p->span.z && 
9430: 70 2d 3e 73 70 61 6e 2e 7a 5b 30 5d 20 29 7b 0a  p->span.z[0] ){.
9440: 20 20 20 20 20 20 2f 2a 20 55 73 65 20 74 68 65        /* Use the
9450: 20 6f 72 69 67 69 6e 61 6c 20 74 65 78 74 20 6f   original text o
9460: 66 20 74 68 65 20 63 6f 6c 75 6d 6e 20 65 78 70  f the column exp
9470: 72 65 73 73 69 6f 6e 20 61 73 20 69 74 73 20 6e  ression as its n
9480: 61 6d 65 20 2a 2f 0a 20 20 20 20 20 20 7a 4e 61  ame */.      zNa
9490: 6d 65 20 3d 20 73 71 6c 69 74 65 33 4d 50 72 69  me = sqlite3MPri
94a0: 6e 74 66 28 64 62 2c 20 22 25 54 22 2c 20 26 70  ntf(db, "%T", &p
94b0: 2d 3e 73 70 61 6e 29 3b 0a 20 20 20 20 7d 65 6c  ->span);.    }el
94c0: 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66 20  se{.      /* If 
94d0: 61 6c 6c 20 65 6c 73 65 20 66 61 69 6c 73 2c 20  all else fails, 
94e0: 6d 61 6b 65 20 75 70 20 61 20 6e 61 6d 65 20 2a  make up a name *
94f0: 2f 0a 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20  /.      zName = 
9500: 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 64  sqlite3MPrintf(d
9510: 62 2c 20 22 63 6f 6c 75 6d 6e 25 64 22 2c 20 69  b, "column%d", i
9520: 2b 31 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  +1);.    }.    i
9530: 66 28 20 21 7a 4e 61 6d 65 20 7c 7c 20 64 62 2d  f( !zName || db-
9540: 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b  >mallocFailed ){
9550: 0a 20 20 20 20 20 20 64 62 2d 3e 6d 61 6c 6c 6f  .      db->mallo
9560: 63 46 61 69 6c 65 64 20 3d 20 31 3b 0a 20 20 20  cFailed = 1;.   
9570: 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
9580: 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 73 71  zName);.      sq
9590: 6c 69 74 65 33 44 65 6c 65 74 65 54 61 62 6c 65  lite3DeleteTable
95a0: 28 70 54 61 62 29 3b 0a 20 20 20 20 20 20 72 65  (pTab);.      re
95b0: 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 20 20  turn 0;.    }.  
95c0: 20 20 73 71 6c 69 74 65 33 44 65 71 75 6f 74 65    sqlite3Dequote
95d0: 28 7a 4e 61 6d 65 29 3b 0a 0a 20 20 20 20 2f 2a  (zName);..    /*
95e0: 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65 20 63   Make sure the c
95f0: 6f 6c 75 6d 6e 20 6e 61 6d 65 20 69 73 20 75 6e  olumn name is un
9600: 69 71 75 65 2e 20 20 49 66 20 74 68 65 20 6e 61  ique.  If the na
9610: 6d 65 20 69 73 20 6e 6f 74 20 75 6e 69 71 75 65  me is not unique
9620: 2c 0a 20 20 20 20 2a 2a 20 61 70 70 65 6e 64 20  ,.    ** append 
9630: 61 20 69 6e 74 65 67 65 72 20 74 6f 20 74 68 65  a integer to the
9640: 20 6e 61 6d 65 20 73 6f 20 74 68 61 74 20 69 74   name so that it
9650: 20 62 65 63 6f 6d 65 73 20 75 6e 69 71 75 65 2e   becomes unique.
9660: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 6e 4e 61 6d  .    */.    nNam
9670: 65 20 3d 20 73 74 72 6c 65 6e 28 7a 4e 61 6d 65  e = strlen(zName
9680: 29 3b 0a 20 20 20 20 66 6f 72 28 6a 3d 63 6e 74  );.    for(j=cnt
9690: 3d 30 3b 20 6a 3c 69 3b 20 6a 2b 2b 29 7b 0a 20  =0; j<i; j++){. 
96a0: 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33       if( sqlite3
96b0: 53 74 72 49 43 6d 70 28 61 43 6f 6c 5b 6a 5d 2e  StrICmp(aCol[j].
96c0: 7a 4e 61 6d 65 2c 20 7a 4e 61 6d 65 29 3d 3d 30  zName, zName)==0
96d0: 20 29 7b 0a 20 20 20 20 20 20 20 20 7a 4e 61 6d   ){.        zNam
96e0: 65 5b 6e 4e 61 6d 65 5d 20 3d 20 30 3b 0a 20 20  e[nName] = 0;.  
96f0: 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 73 71        zName = sq
9700: 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 64 62 2c  lite3MPrintf(db,
9710: 20 22 25 7a 3a 25 64 22 2c 20 7a 4e 61 6d 65 2c   "%z:%d", zName,
9720: 20 2b 2b 63 6e 74 29 3b 0a 20 20 20 20 20 20 20   ++cnt);.       
9730: 20 6a 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 20   j = -1;.       
9740: 20 69 66 28 20 7a 4e 61 6d 65 3d 3d 30 20 29 20   if( zName==0 ) 
9750: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20  break;.      }. 
9760: 20 20 20 7d 0a 20 20 20 20 70 43 6f 6c 2d 3e 7a     }.    pCol->z
9770: 4e 61 6d 65 20 3d 20 7a 4e 61 6d 65 3b 0a 0a 20  Name = zName;.. 
9780: 20 20 20 2f 2a 20 47 65 74 20 74 68 65 20 74 79     /* Get the ty
9790: 70 65 6e 61 6d 65 2c 20 74 79 70 65 20 61 66 66  pename, type aff
97a0: 69 6e 69 74 79 2c 20 61 6e 64 20 63 6f 6c 6c 61  inity, and colla
97b0: 74 69 6e 67 20 73 65 71 75 65 6e 63 65 20 66 6f  ting sequence fo
97c0: 72 20 74 68 65 0a 20 20 20 20 2a 2a 20 63 6f 6c  r the.    ** col
97d0: 75 6d 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  umn..    */.    
97e0: 6d 65 6d 73 65 74 28 26 73 4e 43 2c 20 30 2c 20  memset(&sNC, 0, 
97f0: 73 69 7a 65 6f 66 28 73 4e 43 29 29 3b 0a 20 20  sizeof(sNC));.  
9800: 20 20 73 4e 43 2e 70 53 72 63 4c 69 73 74 20 3d    sNC.pSrcList =
9810: 20 70 53 65 6c 65 63 74 2d 3e 70 53 72 63 3b 0a   pSelect->pSrc;.
9820: 20 20 20 20 7a 54 79 70 65 20 3d 20 73 71 6c 69      zType = sqli
9830: 74 65 33 44 62 53 74 72 44 75 70 28 64 62 2c 20  te3DbStrDup(db, 
9840: 63 6f 6c 75 6d 6e 54 79 70 65 28 26 73 4e 43 2c  columnType(&sNC,
9850: 20 70 2c 20 30 2c 20 30 2c 20 30 29 29 3b 0a 20   p, 0, 0, 0));. 
9860: 20 20 20 70 43 6f 6c 2d 3e 7a 54 79 70 65 20 3d     pCol->zType =
9870: 20 7a 54 79 70 65 3b 0a 20 20 20 20 70 43 6f 6c   zType;.    pCol
9880: 2d 3e 61 66 66 69 6e 69 74 79 20 3d 20 73 71 6c  ->affinity = sql
9890: 69 74 65 33 45 78 70 72 41 66 66 69 6e 69 74 79  ite3ExprAffinity
98a0: 28 70 29 3b 0a 20 20 20 20 70 43 6f 6c 6c 20 3d  (p);.    pColl =
98b0: 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c   sqlite3ExprColl
98c0: 53 65 71 28 70 50 61 72 73 65 2c 20 70 29 3b 0a  Seq(pParse, p);.
98d0: 20 20 20 20 69 66 28 20 70 43 6f 6c 6c 20 29 7b      if( pColl ){
98e0: 0a 20 20 20 20 20 20 70 43 6f 6c 2d 3e 7a 43 6f  .      pCol->zCo
98f0: 6c 6c 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74  ll = sqlite3DbSt
9900: 72 44 75 70 28 64 62 2c 20 70 43 6f 6c 6c 2d 3e  rDup(db, pColl->
9910: 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 7d 0a 20 20  zName);.    }.  
9920: 7d 0a 20 20 70 54 61 62 2d 3e 69 50 4b 65 79 20  }.  pTab->iPKey 
9930: 3d 20 2d 31 3b 0a 20 20 72 65 74 75 72 6e 20 70  = -1;.  return p
9940: 54 61 62 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 72  Tab;.}../*.** Pr
9950: 65 70 61 72 65 20 61 20 53 45 4c 45 43 54 20 73  epare a SELECT s
9960: 74 61 74 65 6d 65 6e 74 20 66 6f 72 20 70 72 6f  tatement for pro
9970: 63 65 73 73 69 6e 67 20 62 79 20 64 6f 69 6e 67  cessing by doing
9980: 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 0a 2a   the following.*
9990: 2a 20 74 68 69 6e 67 73 3a 0a 2a 2a 0a 2a 2a 20  * things:.**.** 
99a0: 20 20 20 28 31 29 20 20 4d 61 6b 65 20 73 75 72     (1)  Make sur
99b0: 65 20 56 44 42 45 20 63 75 72 73 6f 72 20 6e 75  e VDBE cursor nu
99c0: 6d 62 65 72 73 20 68 61 76 65 20 62 65 65 6e 20  mbers have been 
99d0: 61 73 73 69 67 6e 65 64 20 74 6f 20 65 76 65 72  assigned to ever
99e0: 79 0a 2a 2a 20 20 20 20 20 20 20 20 20 65 6c 65  y.**         ele
99f0: 6d 65 6e 74 20 6f 66 20 74 68 65 20 46 52 4f 4d  ment of the FROM
9a00: 20 63 6c 61 75 73 65 2e 0a 2a 2a 0a 2a 2a 20 20   clause..**.**  
9a10: 20 20 28 32 29 20 20 46 69 6c 6c 20 69 6e 20 74    (2)  Fill in t
9a20: 68 65 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 5d  he pTabList->a[]
9a30: 2e 70 54 61 62 20 66 69 65 6c 64 73 20 69 6e 20  .pTab fields in 
9a40: 74 68 65 20 53 72 63 4c 69 73 74 20 74 68 61 74  the SrcList that
9a50: 20 0a 2a 2a 20 20 20 20 20 20 20 20 20 64 65 66   .**         def
9a60: 69 6e 65 73 20 46 52 4f 4d 20 63 6c 61 75 73 65  ines FROM clause
9a70: 2e 20 20 57 68 65 6e 20 76 69 65 77 73 20 61 70  .  When views ap
9a80: 70 65 61 72 20 69 6e 20 74 68 65 20 46 52 4f 4d  pear in the FROM
9a90: 20 63 6c 61 75 73 65 2c 0a 2a 2a 20 20 20 20 20   clause,.**     
9aa0: 20 20 20 20 66 69 6c 6c 20 70 54 61 62 4c 69 73      fill pTabLis
9ab0: 74 2d 3e 61 5b 5d 2e 70 53 65 6c 65 63 74 20 77  t->a[].pSelect w
9ac0: 69 74 68 20 61 20 63 6f 70 79 20 6f 66 20 74 68  ith a copy of th
9ad0: 65 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  e SELECT stateme
9ae0: 6e 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 74 68  nt.**         th
9af0: 61 74 20 69 6d 70 6c 65 6d 65 6e 74 73 20 74 68  at implements th
9b00: 65 20 76 69 65 77 2e 20 20 41 20 63 6f 70 79 20  e view.  A copy 
9b10: 69 73 20 6d 61 64 65 20 6f 66 20 74 68 65 20 76  is made of the v
9b20: 69 65 77 27 73 20 53 45 4c 45 43 54 0a 2a 2a 20  iew's SELECT.** 
9b30: 20 20 20 20 20 20 20 20 73 74 61 74 65 6d 65 6e          statemen
9b40: 74 20 73 6f 20 74 68 61 74 20 77 65 20 63 61 6e  t so that we can
9b50: 20 66 72 65 65 6c 79 20 6d 6f 64 69 66 79 20 6f   freely modify o
9b60: 72 20 64 65 6c 65 74 65 20 74 68 61 74 20 73 74  r delete that st
9b70: 61 74 65 6d 65 6e 74 0a 2a 2a 20 20 20 20 20 20  atement.**      
9b80: 20 20 20 77 69 74 68 6f 75 74 20 77 6f 72 72 79     without worry
9b90: 69 6e 67 20 61 62 6f 75 74 20 6d 65 73 73 69 6e  ing about messin
9ba0: 67 20 75 70 20 74 68 65 20 70 72 65 73 69 73 74  g up the presist
9bb0: 65 6e 74 20 72 65 70 72 65 73 65 6e 74 61 74 69  ent representati
9bc0: 6f 6e 0a 2a 2a 20 20 20 20 20 20 20 20 20 6f 66  on.**         of
9bd0: 20 74 68 65 20 76 69 65 77 2e 0a 2a 2a 0a 2a 2a   the view..**.**
9be0: 20 20 20 20 28 33 29 20 20 41 64 64 20 74 65 72      (3)  Add ter
9bf0: 6d 73 20 74 6f 20 74 68 65 20 57 48 45 52 45 20  ms to the WHERE 
9c00: 63 6c 61 75 73 65 20 74 6f 20 61 63 63 6f 6d 6f  clause to accomo
9c10: 64 61 74 65 20 74 68 65 20 4e 41 54 55 52 41 4c  date the NATURAL
9c20: 20 6b 65 79 77 6f 72 64 0a 2a 2a 20 20 20 20 20   keyword.**     
9c30: 20 20 20 20 6f 6e 20 6a 6f 69 6e 73 20 61 6e 64      on joins and
9c40: 20 74 68 65 20 4f 4e 20 61 6e 64 20 55 53 49 4e   the ON and USIN
9c50: 47 20 63 6c 61 75 73 65 20 6f 66 20 6a 6f 69 6e  G clause of join
9c60: 73 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 28 34 29 20  s..**.**    (4) 
9c70: 20 53 63 61 6e 20 74 68 65 20 6c 69 73 74 20 6f   Scan the list o
9c80: 66 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65  f columns in the
9c90: 20 72 65 73 75 6c 74 20 73 65 74 20 28 70 45 4c   result set (pEL
9ca0: 69 73 74 29 20 6c 6f 6f 6b 69 6e 67 0a 2a 2a 20  ist) looking.** 
9cb0: 20 20 20 20 20 20 20 20 66 6f 72 20 69 6e 73 74          for inst
9cc0: 61 6e 63 65 73 20 6f 66 20 74 68 65 20 22 2a 22  ances of the "*"
9cd0: 20 6f 70 65 72 61 74 6f 72 20 6f 72 20 74 68 65   operator or the
9ce0: 20 54 41 42 4c 45 2e 2a 20 6f 70 65 72 61 74 6f   TABLE.* operato
9cf0: 72 2e 0a 2a 2a 20 20 20 20 20 20 20 20 20 49 66  r..**         If
9d00: 20 66 6f 75 6e 64 2c 20 65 78 70 61 6e 64 20 65   found, expand e
9d10: 61 63 68 20 22 2a 22 20 74 6f 20 62 65 20 65 76  ach "*" to be ev
9d20: 65 72 79 20 63 6f 6c 75 6d 6e 20 69 6e 20 65 76  ery column in ev
9d30: 65 72 79 20 74 61 62 6c 65 0a 2a 2a 20 20 20 20  ery table.**    
9d40: 20 20 20 20 20 61 6e 64 20 54 41 42 4c 45 2e 2a       and TABLE.*
9d50: 20 74 6f 20 62 65 20 65 76 65 72 79 20 63 6f 6c   to be every col
9d60: 75 6d 6e 20 69 6e 20 54 41 42 4c 45 2e 0a 2a 2a  umn in TABLE..**
9d70: 0a 2a 2a 20 52 65 74 75 72 6e 20 30 20 6f 6e 20  .** Return 0 on 
9d80: 73 75 63 63 65 73 73 2e 20 20 49 66 20 74 68 65  success.  If the
9d90: 72 65 20 61 72 65 20 70 72 6f 62 6c 65 6d 73 2c  re are problems,
9da0: 20 6c 65 61 76 65 20 61 6e 20 65 72 72 6f 72 20   leave an error 
9db0: 6d 65 73 73 61 67 65 0a 2a 2a 20 69 6e 20 70 50  message.** in pP
9dc0: 61 72 73 65 20 61 6e 64 20 72 65 74 75 72 6e 20  arse and return 
9dd0: 6e 6f 6e 2d 7a 65 72 6f 2e 0a 2a 2f 0a 73 74 61  non-zero..*/.sta
9de0: 74 69 63 20 69 6e 74 20 70 72 65 70 53 65 6c 65  tic int prepSele
9df0: 63 74 53 74 6d 74 28 50 61 72 73 65 20 2a 70 50  ctStmt(Parse *pP
9e00: 61 72 73 65 2c 20 53 65 6c 65 63 74 20 2a 70 29  arse, Select *p)
9e10: 7b 0a 20 20 69 6e 74 20 69 2c 20 6a 2c 20 6b 2c  {.  int i, j, k,
9e20: 20 72 63 3b 0a 20 20 53 72 63 4c 69 73 74 20 2a   rc;.  SrcList *
9e30: 70 54 61 62 4c 69 73 74 3b 0a 20 20 45 78 70 72  pTabList;.  Expr
9e40: 4c 69 73 74 20 2a 70 45 4c 69 73 74 3b 0a 20 20  List *pEList;.  
9e50: 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69  struct SrcList_i
9e60: 74 65 6d 20 2a 70 46 72 6f 6d 3b 0a 20 20 73 71  tem *pFrom;.  sq
9e70: 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72  lite3 *db = pPar
9e80: 73 65 2d 3e 64 62 3b 0a 0a 20 20 69 66 28 20 70  se->db;..  if( p
9e90: 3d 3d 30 20 7c 7c 20 70 2d 3e 70 53 72 63 3d 3d  ==0 || p->pSrc==
9ea0: 30 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46  0 || db->mallocF
9eb0: 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 72 65 74  ailed ){.    ret
9ec0: 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 70 54 61  urn 1;.  }.  pTa
9ed0: 62 4c 69 73 74 20 3d 20 70 2d 3e 70 53 72 63 3b  bList = p->pSrc;
9ee0: 0a 20 20 70 45 4c 69 73 74 20 3d 20 70 2d 3e 70  .  pEList = p->p
9ef0: 45 4c 69 73 74 3b 0a 0a 20 20 2f 2a 20 4d 61 6b  EList;..  /* Mak
9f00: 65 20 73 75 72 65 20 63 75 72 73 6f 72 20 6e 75  e sure cursor nu
9f10: 6d 62 65 72 73 20 68 61 76 65 20 62 65 65 6e 20  mbers have been 
9f20: 61 73 73 69 67 6e 65 64 20 74 6f 20 61 6c 6c 20  assigned to all 
9f30: 65 6e 74 72 69 65 73 20 69 6e 0a 20 20 2a 2a 20  entries in.  ** 
9f40: 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20  the FROM clause 
9f50: 6f 66 20 74 68 65 20 53 45 4c 45 43 54 20 73 74  of the SELECT st
9f60: 61 74 65 6d 65 6e 74 2e 0a 20 20 2a 2f 0a 20 20  atement..  */.  
9f70: 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74 41 73  sqlite3SrcListAs
9f80: 73 69 67 6e 43 75 72 73 6f 72 73 28 70 50 61 72  signCursors(pPar
9f90: 73 65 2c 20 70 2d 3e 70 53 72 63 29 3b 0a 0a 20  se, p->pSrc);.. 
9fa0: 20 2f 2a 20 4c 6f 6f 6b 20 75 70 20 65 76 65 72   /* Look up ever
9fb0: 79 20 74 61 62 6c 65 20 6e 61 6d 65 64 20 69 6e  y table named in
9fc0: 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65   the FROM clause
9fd0: 20 6f 66 20 74 68 65 20 73 65 6c 65 63 74 2e 20   of the select. 
9fe0: 20 49 66 0a 20 20 2a 2a 20 61 6e 20 65 6e 74 72   If.  ** an entr
9ff0: 79 20 6f 66 20 74 68 65 20 46 52 4f 4d 20 63 6c  y of the FROM cl
a000: 61 75 73 65 20 69 73 20 61 20 73 75 62 71 75 65  ause is a subque
a010: 72 79 20 69 6e 73 74 65 61 64 20 6f 66 20 61 20  ry instead of a 
a020: 74 61 62 6c 65 20 6f 72 20 76 69 65 77 2c 0a 20  table or view,. 
a030: 20 2a 2a 20 74 68 65 6e 20 63 72 65 61 74 65 20   ** then create 
a040: 61 20 74 72 61 6e 73 69 65 6e 74 20 74 61 62 6c  a transient tabl
a050: 65 20 73 74 72 75 63 74 75 72 65 20 74 6f 20 64  e structure to d
a060: 65 73 63 72 69 62 65 20 74 68 65 20 73 75 62 71  escribe the subq
a070: 75 65 72 79 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72  uery..  */.  for
a080: 28 69 3d 30 2c 20 70 46 72 6f 6d 3d 70 54 61 62  (i=0, pFrom=pTab
a090: 4c 69 73 74 2d 3e 61 3b 20 69 3c 70 54 61 62 4c  List->a; i<pTabL
a0a0: 69 73 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b 2c 20  ist->nSrc; i++, 
a0b0: 70 46 72 6f 6d 2b 2b 29 7b 0a 20 20 20 20 54 61  pFrom++){.    Ta
a0c0: 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20 20 20 69  ble *pTab;.    i
a0d0: 66 28 20 70 46 72 6f 6d 2d 3e 70 54 61 62 21 3d  f( pFrom->pTab!=
a0e0: 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68  0 ){.      /* Th
a0f0: 69 73 20 73 74 61 74 65 6d 65 6e 74 20 68 61 73  is statement has
a100: 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 70 72   already been pr
a110: 65 70 61 72 65 64 2e 20 20 54 68 65 72 65 20 69  epared.  There i
a120: 73 20 6e 6f 20 6e 65 65 64 0a 20 20 20 20 20 20  s no need.      
a130: 2a 2a 20 74 6f 20 67 6f 20 66 75 72 74 68 65 72  ** to go further
a140: 2e 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72  . */.      asser
a150: 74 28 20 69 3d 3d 30 20 29 3b 0a 20 20 20 20 20  t( i==0 );.     
a160: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d   return 0;.    }
a170: 0a 20 20 20 20 69 66 28 20 70 46 72 6f 6d 2d 3e  .    if( pFrom->
a180: 7a 4e 61 6d 65 3d 3d 30 20 29 7b 0a 23 69 66 6e  zName==0 ){.#ifn
a190: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
a1a0: 53 55 42 51 55 45 52 59 0a 20 20 20 20 20 20 2f  SUBQUERY.      /
a1b0: 2a 20 41 20 73 75 62 2d 71 75 65 72 79 20 69 6e  * A sub-query in
a1c0: 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65   the FROM clause
a1d0: 20 6f 66 20 61 20 53 45 4c 45 43 54 20 2a 2f 0a   of a SELECT */.
a1e0: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 46        assert( pF
a1f0: 72 6f 6d 2d 3e 70 53 65 6c 65 63 74 21 3d 30 20  rom->pSelect!=0 
a200: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 46 72  );.      if( pFr
a210: 6f 6d 2d 3e 7a 41 6c 69 61 73 3d 3d 30 20 29 7b  om->zAlias==0 ){
a220: 0a 20 20 20 20 20 20 20 20 70 46 72 6f 6d 2d 3e  .        pFrom->
a230: 7a 41 6c 69 61 73 20 3d 0a 20 20 20 20 20 20 20  zAlias =.       
a240: 20 20 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74     sqlite3MPrint
a250: 66 28 64 62 2c 20 22 73 71 6c 69 74 65 5f 73 75  f(db, "sqlite_su
a260: 62 71 75 65 72 79 5f 25 70 5f 22 2c 20 28 76 6f  bquery_%p_", (vo
a270: 69 64 2a 29 70 46 72 6f 6d 2d 3e 70 53 65 6c 65  id*)pFrom->pSele
a280: 63 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ct);.      }.   
a290: 20 20 20 61 73 73 65 72 74 28 20 70 46 72 6f 6d     assert( pFrom
a2a0: 2d 3e 70 54 61 62 3d 3d 30 20 29 3b 0a 20 20 20  ->pTab==0 );.   
a2b0: 20 20 20 70 46 72 6f 6d 2d 3e 70 54 61 62 20 3d     pFrom->pTab =
a2c0: 20 70 54 61 62 20 3d 20 0a 20 20 20 20 20 20 20   pTab = .       
a2d0: 20 73 71 6c 69 74 65 33 52 65 73 75 6c 74 53 65   sqlite3ResultSe
a2e0: 74 4f 66 53 65 6c 65 63 74 28 70 50 61 72 73 65  tOfSelect(pParse
a2f0: 2c 20 70 46 72 6f 6d 2d 3e 7a 41 6c 69 61 73 2c  , pFrom->zAlias,
a300: 20 70 46 72 6f 6d 2d 3e 70 53 65 6c 65 63 74 29   pFrom->pSelect)
a310: 3b 0a 20 20 20 20 20 20 69 66 28 20 70 54 61 62  ;.      if( pTab
a320: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 72  ==0 ){.        r
a330: 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 20 20 7d  eturn 1;.      }
a340: 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20 69 73  .      /* The is
a350: 45 70 68 65 6d 20 66 6c 61 67 20 69 6e 64 69 63  Ephem flag indic
a360: 61 74 65 73 20 74 68 61 74 20 74 68 65 20 54 61  ates that the Ta
a370: 62 6c 65 20 73 74 72 75 63 74 75 72 65 20 68 61  ble structure ha
a380: 73 20 62 65 65 6e 0a 20 20 20 20 20 20 2a 2a 20  s been.      ** 
a390: 64 79 6e 61 6d 69 63 61 6c 6c 79 20 61 6c 6c 6f  dynamically allo
a3a0: 63 61 74 65 64 20 61 6e 64 20 6d 61 79 20 62 65  cated and may be
a3b0: 20 66 72 65 65 64 20 61 74 20 61 6e 79 20 74 69   freed at any ti
a3c0: 6d 65 2e 20 20 49 6e 20 6f 74 68 65 72 20 77 6f  me.  In other wo
a3d0: 72 64 73 2c 0a 20 20 20 20 20 20 2a 2a 20 70 54  rds,.      ** pT
a3e0: 61 62 20 69 73 20 6e 6f 74 20 70 6f 69 6e 74 69  ab is not pointi
a3f0: 6e 67 20 74 6f 20 61 20 70 65 72 73 69 73 74 65  ng to a persiste
a400: 6e 74 20 74 61 62 6c 65 20 73 74 72 75 63 74 75  nt table structu
a410: 72 65 20 74 68 61 74 20 64 65 66 69 6e 65 73 0a  re that defines.
a420: 20 20 20 20 20 20 2a 2a 20 70 61 72 74 20 6f 66        ** part of
a430: 20 74 68 65 20 73 63 68 65 6d 61 2e 20 2a 2f 0a   the schema. */.
a440: 20 20 20 20 20 20 70 54 61 62 2d 3e 69 73 45 70        pTab->isEp
a450: 68 65 6d 20 3d 20 31 3b 0a 23 65 6e 64 69 66 0a  hem = 1;.#endif.
a460: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
a470: 20 2f 2a 20 41 6e 20 6f 72 64 69 6e 61 72 79 20   /* An ordinary 
a480: 74 61 62 6c 65 20 6f 72 20 76 69 65 77 20 6e 61  table or view na
a490: 6d 65 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63  me in the FROM c
a4a0: 6c 61 75 73 65 20 2a 2f 0a 20 20 20 20 20 20 61  lause */.      a
a4b0: 73 73 65 72 74 28 20 70 46 72 6f 6d 2d 3e 70 54  ssert( pFrom->pT
a4c0: 61 62 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 70  ab==0 );.      p
a4d0: 46 72 6f 6d 2d 3e 70 54 61 62 20 3d 20 70 54 61  From->pTab = pTa
a4e0: 62 20 3d 20 0a 20 20 20 20 20 20 20 20 73 71 6c  b = .        sql
a4f0: 69 74 65 33 4c 6f 63 61 74 65 54 61 62 6c 65 28  ite3LocateTable(
a500: 70 50 61 72 73 65 2c 70 46 72 6f 6d 2d 3e 7a 4e  pParse,pFrom->zN
a510: 61 6d 65 2c 70 46 72 6f 6d 2d 3e 7a 44 61 74 61  ame,pFrom->zData
a520: 62 61 73 65 29 3b 0a 20 20 20 20 20 20 69 66 28  base);.      if(
a530: 20 70 54 61 62 3d 3d 30 20 29 7b 0a 20 20 20 20   pTab==0 ){.    
a540: 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20      return 1;.  
a550: 20 20 20 20 7d 0a 20 20 20 20 20 20 70 54 61 62      }.      pTab
a560: 2d 3e 6e 52 65 66 2b 2b 3b 0a 23 69 66 20 21 64  ->nRef++;.#if !d
a570: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
a580: 49 54 5f 56 49 45 57 29 20 7c 7c 20 21 64 65 66  IT_VIEW) || !def
a590: 69 6e 65 64 20 28 53 51 4c 49 54 45 5f 4f 4d 49  ined (SQLITE_OMI
a5a0: 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 29 0a  T_VIRTUALTABLE).
a5b0: 20 20 20 20 20 20 69 66 28 20 70 54 61 62 2d 3e        if( pTab->
a5c0: 70 53 65 6c 65 63 74 20 7c 7c 20 49 73 56 69 72  pSelect || IsVir
a5d0: 74 75 61 6c 28 70 54 61 62 29 20 29 7b 0a 20 20  tual(pTab) ){.  
a5e0: 20 20 20 20 20 20 2f 2a 20 57 65 20 72 65 61 63        /* We reac
a5f0: 68 20 68 65 72 65 20 69 66 20 74 68 65 20 6e 61  h here if the na
a600: 6d 65 64 20 74 61 62 6c 65 20 69 73 20 61 20 72  med table is a r
a610: 65 61 6c 6c 79 20 61 20 76 69 65 77 20 2a 2f 0a  eally a view */.
a620: 20 20 20 20 20 20 20 20 69 66 28 20 73 71 6c 69          if( sqli
a630: 74 65 33 56 69 65 77 47 65 74 43 6f 6c 75 6d 6e  te3ViewGetColumn
a640: 4e 61 6d 65 73 28 70 50 61 72 73 65 2c 20 70 54  Names(pParse, pT
a650: 61 62 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ab) ){.         
a660: 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 20   return 1;.     
a670: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 2f 2a 20     }.        /* 
a680: 49 66 20 70 46 72 6f 6d 2d 3e 70 53 65 6c 65 63  If pFrom->pSelec
a690: 74 21 3d 30 20 69 74 20 6d 65 61 6e 73 20 77 65  t!=0 it means we
a6a0: 20 61 72 65 20 64 65 61 6c 69 6e 67 20 77 69 74   are dealing wit
a6b0: 68 20 61 0a 20 20 20 20 20 20 20 20 2a 2a 20 76  h a.        ** v
a6c0: 69 65 77 20 77 69 74 68 69 6e 20 61 20 76 69 65  iew within a vie
a6d0: 77 2e 20 20 54 68 65 20 53 45 4c 45 43 54 20 73  w.  The SELECT s
a6e0: 74 72 75 63 74 75 72 65 20 68 61 73 20 61 6c 72  tructure has alr
a6f0: 65 61 64 79 20 62 65 65 6e 0a 20 20 20 20 20 20  eady been.      
a700: 20 20 2a 2a 20 63 6f 70 69 65 64 20 62 79 20 74    ** copied by t
a710: 68 65 20 6f 75 74 65 72 20 76 69 65 77 20 73 6f  he outer view so
a720: 20 77 65 20 63 61 6e 20 73 6b 69 70 20 74 68 65   we can skip the
a730: 20 63 6f 70 79 20 73 74 65 70 20 68 65 72 65 0a   copy step here.
a740: 20 20 20 20 20 20 20 20 2a 2a 20 69 6e 20 74 68          ** in th
a750: 65 20 69 6e 6e 65 72 20 76 69 65 77 2e 0a 20 20  e inner view..  
a760: 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
a770: 20 69 66 28 20 70 46 72 6f 6d 2d 3e 70 53 65 6c   if( pFrom->pSel
a780: 65 63 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ect==0 ){.      
a790: 20 20 20 20 70 46 72 6f 6d 2d 3e 70 53 65 6c 65      pFrom->pSele
a7a0: 63 74 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65  ct = sqlite3Sele
a7b0: 63 74 44 75 70 28 64 62 2c 20 70 54 61 62 2d 3e  ctDup(db, pTab->
a7c0: 70 53 65 6c 65 63 74 29 3b 0a 20 20 20 20 20 20  pSelect);.      
a7d0: 20 20 7d 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64    }.      }.#end
a7e0: 69 66 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  if.    }.  }..  
a7f0: 2f 2a 20 50 72 6f 63 65 73 73 20 4e 41 54 55 52  /* Process NATUR
a800: 41 4c 20 6b 65 79 77 6f 72 64 73 2c 20 61 6e 64  AL keywords, and
a810: 20 4f 4e 20 61 6e 64 20 55 53 49 4e 47 20 63 6c   ON and USING cl
a820: 61 75 73 65 73 20 6f 66 20 6a 6f 69 6e 73 2e 0a  auses of joins..
a830: 20 20 2a 2f 0a 20 20 69 66 28 20 73 71 6c 69 74    */.  if( sqlit
a840: 65 50 72 6f 63 65 73 73 4a 6f 69 6e 28 70 50 61  eProcessJoin(pPa
a850: 72 73 65 2c 20 70 29 20 29 20 72 65 74 75 72 6e  rse, p) ) return
a860: 20 31 3b 0a 0a 20 20 2f 2a 20 46 6f 72 20 65 76   1;..  /* For ev
a870: 65 72 79 20 22 2a 22 20 74 68 61 74 20 6f 63 63  ery "*" that occ
a880: 75 72 73 20 69 6e 20 74 68 65 20 63 6f 6c 75 6d  urs in the colum
a890: 6e 20 6c 69 73 74 2c 20 69 6e 73 65 72 74 20 74  n list, insert t
a8a0: 68 65 20 6e 61 6d 65 73 20 6f 66 0a 20 20 2a 2a  he names of.  **
a8b0: 20 61 6c 6c 20 63 6f 6c 75 6d 6e 73 20 69 6e 20   all columns in 
a8c0: 61 6c 6c 20 74 61 62 6c 65 73 2e 20 20 41 6e 64  all tables.  And
a8d0: 20 66 6f 72 20 65 76 65 72 79 20 54 41 42 4c 45   for every TABLE
a8e0: 2e 2a 20 69 6e 73 65 72 74 20 74 68 65 20 6e 61  .* insert the na
a8f0: 6d 65 73 0a 20 20 2a 2a 20 6f 66 20 61 6c 6c 20  mes.  ** of all 
a900: 63 6f 6c 75 6d 6e 73 20 69 6e 20 54 41 42 4c 45  columns in TABLE
a910: 2e 20 20 54 68 65 20 70 61 72 73 65 72 20 69 6e  .  The parser in
a920: 73 65 72 74 65 64 20 61 20 73 70 65 63 69 61 6c  serted a special
a930: 20 65 78 70 72 65 73 73 69 6f 6e 0a 20 20 2a 2a   expression.  **
a940: 20 77 69 74 68 20 74 68 65 20 54 4b 5f 41 4c 4c   with the TK_ALL
a950: 20 6f 70 65 72 61 74 6f 72 20 66 6f 72 20 65 61   operator for ea
a960: 63 68 20 22 2a 22 20 74 68 61 74 20 69 74 20 66  ch "*" that it f
a970: 6f 75 6e 64 20 69 6e 20 74 68 65 20 63 6f 6c 75  ound in the colu
a980: 6d 6e 20 6c 69 73 74 2e 0a 20 20 2a 2a 20 54 68  mn list..  ** Th
a990: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 6f 64 65  e following code
a9a0: 20 6a 75 73 74 20 68 61 73 20 74 6f 20 6c 6f 63   just has to loc
a9b0: 61 74 65 20 74 68 65 20 54 4b 5f 41 4c 4c 20 65  ate the TK_ALL e
a9c0: 78 70 72 65 73 73 69 6f 6e 73 20 61 6e 64 20 65  xpressions and e
a9d0: 78 70 61 6e 64 0a 20 20 2a 2a 20 65 61 63 68 20  xpand.  ** each 
a9e0: 6f 6e 65 20 74 6f 20 74 68 65 20 6c 69 73 74 20  one to the list 
a9f0: 6f 66 20 61 6c 6c 20 63 6f 6c 75 6d 6e 73 20 69  of all columns i
aa00: 6e 20 61 6c 6c 20 74 61 62 6c 65 73 2e 0a 20 20  n all tables..  
aa10: 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 66 69 72 73  **.  ** The firs
aa20: 74 20 6c 6f 6f 70 20 6a 75 73 74 20 63 68 65 63  t loop just chec
aa30: 6b 73 20 74 6f 20 73 65 65 20 69 66 20 74 68 65  ks to see if the
aa40: 72 65 20 61 72 65 20 61 6e 79 20 22 2a 22 20 6f  re are any "*" o
aa50: 70 65 72 61 74 6f 72 73 0a 20 20 2a 2a 20 74 68  perators.  ** th
aa60: 61 74 20 6e 65 65 64 20 65 78 70 61 6e 64 69 6e  at need expandin
aa70: 67 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 6b 3d  g..  */.  for(k=
aa80: 30 3b 20 6b 3c 70 45 4c 69 73 74 2d 3e 6e 45 78  0; k<pEList->nEx
aa90: 70 72 3b 20 6b 2b 2b 29 7b 0a 20 20 20 20 45 78  pr; k++){.    Ex
aaa0: 70 72 20 2a 70 45 20 3d 20 70 45 4c 69 73 74 2d  pr *pE = pEList-
aab0: 3e 61 5b 6b 5d 2e 70 45 78 70 72 3b 0a 20 20 20  >a[k].pExpr;.   
aac0: 20 69 66 28 20 70 45 2d 3e 6f 70 3d 3d 54 4b 5f   if( pE->op==TK_
aad0: 41 4c 4c 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  ALL ) break;.   
aae0: 20 69 66 28 20 70 45 2d 3e 6f 70 3d 3d 54 4b 5f   if( pE->op==TK_
aaf0: 44 4f 54 20 26 26 20 70 45 2d 3e 70 52 69 67 68  DOT && pE->pRigh
ab00: 74 20 26 26 20 70 45 2d 3e 70 52 69 67 68 74 2d  t && pE->pRight-
ab10: 3e 6f 70 3d 3d 54 4b 5f 41 4c 4c 0a 20 20 20 20  >op==TK_ALL.    
ab20: 20 20 20 20 20 26 26 20 70 45 2d 3e 70 4c 65 66       && pE->pLef
ab30: 74 20 26 26 20 70 45 2d 3e 70 4c 65 66 74 2d 3e  t && pE->pLeft->
ab40: 6f 70 3d 3d 54 4b 5f 49 44 20 29 20 62 72 65 61  op==TK_ID ) brea
ab50: 6b 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 30 3b  k;.  }.  rc = 0;
ab60: 0a 20 20 69 66 28 20 6b 3c 70 45 4c 69 73 74 2d  .  if( k<pEList-
ab70: 3e 6e 45 78 70 72 20 29 7b 0a 20 20 20 20 2f 2a  >nExpr ){.    /*
ab80: 0a 20 20 20 20 2a 2a 20 49 66 20 77 65 20 67 65  .    ** If we ge
ab90: 74 20 68 65 72 65 20 69 74 20 6d 65 61 6e 73 20  t here it means 
aba0: 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 20 63  the result set c
abb0: 6f 6e 74 61 69 6e 73 20 6f 6e 65 20 6f 72 20 6d  ontains one or m
abc0: 6f 72 65 20 22 2a 22 0a 20 20 20 20 2a 2a 20 6f  ore "*".    ** o
abd0: 70 65 72 61 74 6f 72 73 20 74 68 61 74 20 6e 65  perators that ne
abe0: 65 64 20 74 6f 20 62 65 20 65 78 70 61 6e 64 65  ed to be expande
abf0: 64 2e 20 20 4c 6f 6f 70 20 74 68 72 6f 75 67 68  d.  Loop through
ac00: 20 65 61 63 68 20 65 78 70 72 65 73 73 69 6f 6e   each expression
ac10: 0a 20 20 20 20 2a 2a 20 69 6e 20 74 68 65 20 72  .    ** in the r
ac20: 65 73 75 6c 74 20 73 65 74 20 61 6e 64 20 65 78  esult set and ex
ac30: 70 61 6e 64 20 74 68 65 6d 20 6f 6e 65 20 62 79  pand them one by
ac40: 20 6f 6e 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20   one..    */.   
ac50: 20 73 74 72 75 63 74 20 45 78 70 72 4c 69 73 74   struct ExprList
ac60: 5f 69 74 65 6d 20 2a 61 20 3d 20 70 45 4c 69 73  _item *a = pELis
ac70: 74 2d 3e 61 3b 0a 20 20 20 20 45 78 70 72 4c 69  t->a;.    ExprLi
ac80: 73 74 20 2a 70 4e 65 77 20 3d 20 30 3b 0a 20 20  st *pNew = 0;.  
ac90: 20 20 69 6e 74 20 66 6c 61 67 73 20 3d 20 70 50    int flags = pP
aca0: 61 72 73 65 2d 3e 64 62 2d 3e 66 6c 61 67 73 3b  arse->db->flags;
acb0: 0a 20 20 20 20 69 6e 74 20 6c 6f 6e 67 4e 61 6d  .    int longNam
acc0: 65 73 20 3d 20 28 66 6c 61 67 73 20 26 20 53 51  es = (flags & SQ
acd0: 4c 49 54 45 5f 46 75 6c 6c 43 6f 6c 4e 61 6d 65  LITE_FullColName
ace0: 73 29 21 3d 30 20 26 26 0a 20 20 20 20 20 20 20  s)!=0 &&.       
acf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28                 (
ad00: 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 53  flags & SQLITE_S
ad10: 68 6f 72 74 43 6f 6c 4e 61 6d 65 73 29 3d 3d 30  hortColNames)==0
ad20: 3b 0a 0a 20 20 20 20 66 6f 72 28 6b 3d 30 3b 20  ;..    for(k=0; 
ad30: 6b 3c 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b  k<pEList->nExpr;
ad40: 20 6b 2b 2b 29 7b 0a 20 20 20 20 20 20 45 78 70   k++){.      Exp
ad50: 72 20 2a 70 45 20 3d 20 61 5b 6b 5d 2e 70 45 78  r *pE = a[k].pEx
ad60: 70 72 3b 0a 20 20 20 20 20 20 69 66 28 20 70 45  pr;.      if( pE
ad70: 2d 3e 6f 70 21 3d 54 4b 5f 41 4c 4c 20 26 26 0a  ->op!=TK_ALL &&.
ad80: 20 20 20 20 20 20 20 20 20 20 20 28 70 45 2d 3e             (pE->
ad90: 6f 70 21 3d 54 4b 5f 44 4f 54 20 7c 7c 20 70 45  op!=TK_DOT || pE
ada0: 2d 3e 70 52 69 67 68 74 3d 3d 30 20 7c 7c 20 70  ->pRight==0 || p
adb0: 45 2d 3e 70 52 69 67 68 74 2d 3e 6f 70 21 3d 54  E->pRight->op!=T
adc0: 4b 5f 41 4c 4c 29 20 29 7b 0a 20 20 20 20 20 20  K_ALL) ){.      
add0: 20 20 2f 2a 20 54 68 69 73 20 70 61 72 74 69 63    /* This partic
ade0: 75 6c 61 72 20 65 78 70 72 65 73 73 69 6f 6e 20  ular expression 
adf0: 64 6f 65 73 20 6e 6f 74 20 6e 65 65 64 20 74 6f  does not need to
ae00: 20 62 65 20 65 78 70 61 6e 64 65 64 2e 0a 20 20   be expanded..  
ae10: 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
ae20: 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 45   pNew = sqlite3E
ae30: 78 70 72 4c 69 73 74 41 70 70 65 6e 64 28 70 50  xprListAppend(pP
ae40: 61 72 73 65 2c 20 70 4e 65 77 2c 20 61 5b 6b 5d  arse, pNew, a[k]
ae50: 2e 70 45 78 70 72 2c 20 30 29 3b 0a 20 20 20 20  .pExpr, 0);.    
ae60: 20 20 20 20 69 66 28 20 70 4e 65 77 20 29 7b 0a      if( pNew ){.
ae70: 20 20 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e            pNew->
ae80: 61 5b 70 4e 65 77 2d 3e 6e 45 78 70 72 2d 31 5d  a[pNew->nExpr-1]
ae90: 2e 7a 4e 61 6d 65 20 3d 20 61 5b 6b 5d 2e 7a 4e  .zName = a[k].zN
aea0: 61 6d 65 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  ame;.        }el
aeb0: 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63  se{.          rc
aec0: 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 7d 0a   = 1;.        }.
aed0: 20 20 20 20 20 20 20 20 61 5b 6b 5d 2e 70 45 78          a[k].pEx
aee0: 70 72 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  pr = 0;.        
aef0: 61 5b 6b 5d 2e 7a 4e 61 6d 65 20 3d 20 30 3b 0a  a[k].zName = 0;.
af00: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
af10: 20 20 20 20 20 2f 2a 20 54 68 69 73 20 65 78 70       /* This exp
af20: 72 65 73 73 69 6f 6e 20 69 73 20 61 20 22 2a 22  ression is a "*"
af30: 20 6f 72 20 61 20 22 54 41 42 4c 45 2e 2a 22 20   or a "TABLE.*" 
af40: 61 6e 64 20 6e 65 65 64 73 20 74 6f 20 62 65 0a  and needs to be.
af50: 20 20 20 20 20 20 20 20 2a 2a 20 65 78 70 61 6e          ** expan
af60: 64 65 64 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20  ded. */.        
af70: 69 6e 74 20 74 61 62 6c 65 53 65 65 6e 20 3d 20  int tableSeen = 
af80: 30 3b 20 20 20 20 20 20 2f 2a 20 53 65 74 20 74  0;      /* Set t
af90: 6f 20 31 20 77 68 65 6e 20 54 41 42 4c 45 20 6d  o 1 when TABLE m
afa0: 61 74 63 68 65 73 20 2a 2f 0a 20 20 20 20 20 20  atches */.      
afb0: 20 20 63 68 61 72 20 2a 7a 54 4e 61 6d 65 3b 20    char *zTName; 
afc0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 74 65             /* te
afd0: 78 74 20 6f 66 20 6e 61 6d 65 20 6f 66 20 54 41  xt of name of TA
afe0: 42 4c 45 20 2a 2f 0a 20 20 20 20 20 20 20 20 69  BLE */.        i
aff0: 66 28 20 70 45 2d 3e 6f 70 3d 3d 54 4b 5f 44 4f  f( pE->op==TK_DO
b000: 54 20 26 26 20 70 45 2d 3e 70 4c 65 66 74 20 29  T && pE->pLeft )
b010: 7b 0a 20 20 20 20 20 20 20 20 20 20 7a 54 4e 61  {.          zTNa
b020: 6d 65 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65  me = sqlite3Name
b030: 46 72 6f 6d 54 6f 6b 65 6e 28 64 62 2c 20 26 70  FromToken(db, &p
b040: 45 2d 3e 70 4c 65 66 74 2d 3e 74 6f 6b 65 6e 29  E->pLeft->token)
b050: 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  ;.        }else{
b060: 0a 20 20 20 20 20 20 20 20 20 20 7a 54 4e 61 6d  .          zTNam
b070: 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7d  e = 0;.        }
b080: 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30  .        for(i=0
b090: 2c 20 70 46 72 6f 6d 3d 70 54 61 62 4c 69 73 74  , pFrom=pTabList
b0a0: 2d 3e 61 3b 20 69 3c 70 54 61 62 4c 69 73 74 2d  ->a; i<pTabList-
b0b0: 3e 6e 53 72 63 3b 20 69 2b 2b 2c 20 70 46 72 6f  >nSrc; i++, pFro
b0c0: 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20  m++){.          
b0d0: 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 70 46  Table *pTab = pF
b0e0: 72 6f 6d 2d 3e 70 54 61 62 3b 0a 20 20 20 20 20  rom->pTab;.     
b0f0: 20 20 20 20 20 63 68 61 72 20 2a 7a 54 61 62 4e       char *zTabN
b100: 61 6d 65 20 3d 20 70 46 72 6f 6d 2d 3e 7a 41 6c  ame = pFrom->zAl
b110: 69 61 73 3b 0a 20 20 20 20 20 20 20 20 20 20 69  ias;.          i
b120: 66 28 20 7a 54 61 62 4e 61 6d 65 3d 3d 30 20 7c  f( zTabName==0 |
b130: 7c 20 7a 54 61 62 4e 61 6d 65 5b 30 5d 3d 3d 30  | zTabName[0]==0
b140: 20 29 7b 20 0a 20 20 20 20 20 20 20 20 20 20 20   ){ .           
b150: 20 7a 54 61 62 4e 61 6d 65 20 3d 20 70 54 61 62   zTabName = pTab
b160: 2d 3e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20 20  ->zName;.       
b170: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 69     }.          i
b180: 66 28 20 7a 54 4e 61 6d 65 20 26 26 20 28 7a 54  f( zTName && (zT
b190: 61 62 4e 61 6d 65 3d 3d 30 20 7c 7c 20 7a 54 61  abName==0 || zTa
b1a0: 62 4e 61 6d 65 5b 30 5d 3d 3d 30 20 7c 7c 20 0a  bName[0]==0 || .
b1b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b1c0: 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28   sqlite3StrICmp(
b1d0: 7a 54 4e 61 6d 65 2c 20 7a 54 61 62 4e 61 6d 65  zTName, zTabName
b1e0: 29 21 3d 30 29 20 29 7b 0a 20 20 20 20 20 20 20  )!=0) ){.       
b1f0: 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20       continue;. 
b200: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
b210: 20 20 20 20 20 74 61 62 6c 65 53 65 65 6e 20 3d       tableSeen =
b220: 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20 66 6f   1;.          fo
b230: 72 28 6a 3d 30 3b 20 6a 3c 70 54 61 62 2d 3e 6e  r(j=0; j<pTab->n
b240: 43 6f 6c 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20  Col; j++){.     
b250: 20 20 20 20 20 20 20 45 78 70 72 20 2a 70 45 78         Expr *pEx
b260: 70 72 2c 20 2a 70 52 69 67 68 74 3b 0a 20 20 20  pr, *pRight;.   
b270: 20 20 20 20 20 20 20 20 20 63 68 61 72 20 2a 7a           char *z
b280: 4e 61 6d 65 20 3d 20 70 54 61 62 2d 3e 61 43 6f  Name = pTab->aCo
b290: 6c 5b 6a 5d 2e 7a 4e 61 6d 65 3b 0a 0a 20 20 20  l[j].zName;..   
b2a0: 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 61           /* If a
b2b0: 20 63 6f 6c 75 6d 6e 20 69 73 20 6d 61 72 6b 65   column is marke
b2c0: 64 20 61 73 20 27 68 69 64 64 65 6e 27 20 28 63  d as 'hidden' (c
b2d0: 75 72 72 65 6e 74 6c 79 20 6f 6e 6c 79 20 70 6f  urrently only po
b2e0: 73 73 69 62 6c 65 0a 20 20 20 20 20 20 20 20 20  ssible.         
b2f0: 20 20 20 2a 2a 20 66 6f 72 20 76 69 72 74 75 61     ** for virtua
b300: 6c 20 74 61 62 6c 65 73 29 2c 20 64 6f 20 6e 6f  l tables), do no
b310: 74 20 69 6e 63 6c 75 64 65 20 69 74 20 69 6e 20  t include it in 
b320: 74 68 65 20 65 78 70 61 6e 64 65 64 0a 20 20 20  the expanded.   
b330: 20 20 20 20 20 20 20 20 20 2a 2a 20 72 65 73 75           ** resu
b340: 6c 74 2d 73 65 74 20 6c 69 73 74 2e 0a 20 20 20  lt-set list..   
b350: 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20           */.    
b360: 20 20 20 20 20 20 20 20 69 66 28 20 49 73 48 69          if( IsHi
b370: 64 64 65 6e 43 6f 6c 75 6d 6e 28 26 70 54 61 62  ddenColumn(&pTab
b380: 2d 3e 61 43 6f 6c 5b 6a 5d 29 20 29 7b 0a 20 20  ->aCol[j]) ){.  
b390: 20 20 20 20 20 20 20 20 20 20 20 20 61 73 73 65              asse
b3a0: 72 74 28 49 73 56 69 72 74 75 61 6c 28 70 54 61  rt(IsVirtual(pTa
b3b0: 62 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  b));.           
b3c0: 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20     continue;.   
b3d0: 20 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20           }..    
b3e0: 20 20 20 20 20 20 20 20 69 66 28 20 69 3e 30 20          if( i>0 
b3f0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
b400: 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f   struct SrcList_
b410: 69 74 65 6d 20 2a 70 4c 65 66 74 20 3d 20 26 70  item *pLeft = &p
b420: 54 61 62 4c 69 73 74 2d 3e 61 5b 69 2d 31 5d 3b  TabList->a[i-1];
b430: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69  .              i
b440: 66 28 20 28 70 4c 65 66 74 5b 31 5d 2e 6a 6f 69  f( (pLeft[1].joi
b450: 6e 74 79 70 65 20 26 20 4a 54 5f 4e 41 54 55 52  ntype & JT_NATUR
b460: 41 4c 29 21 3d 30 20 26 26 0a 20 20 20 20 20 20  AL)!=0 &&.      
b470: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b480: 20 20 63 6f 6c 75 6d 6e 49 6e 64 65 78 28 70 4c    columnIndex(pL
b490: 65 66 74 2d 3e 70 54 61 62 2c 20 7a 4e 61 6d 65  eft->pTab, zName
b4a0: 29 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )>=0 ){.        
b4b0: 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 20 61 20          /* In a 
b4c0: 4e 41 54 55 52 41 4c 20 6a 6f 69 6e 2c 20 6f 6d  NATURAL join, om
b4d0: 69 74 20 74 68 65 20 6a 6f 69 6e 20 63 6f 6c 75  it the join colu
b4e0: 6d 6e 73 20 66 72 6f 6d 20 74 68 65 20 0a 20 20  mns from the .  
b4f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a                **
b500: 20 74 61 62 6c 65 20 6f 6e 20 74 68 65 20 72 69   table on the ri
b510: 67 68 74 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  ght */.         
b520: 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b         continue;
b530: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d  .              }
b540: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69  .              i
b550: 66 28 20 73 71 6c 69 74 65 33 49 64 4c 69 73 74  f( sqlite3IdList
b560: 49 6e 64 65 78 28 70 4c 65 66 74 5b 31 5d 2e 70  Index(pLeft[1].p
b570: 55 73 69 6e 67 2c 20 7a 4e 61 6d 65 29 3e 3d 30  Using, zName)>=0
b580: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
b590: 20 20 20 20 2f 2a 20 49 6e 20 61 20 6a 6f 69 6e      /* In a join
b5a0: 20 77 69 74 68 20 61 20 55 53 49 4e 47 20 63 6c   with a USING cl
b5b0: 61 75 73 65 2c 20 6f 6d 69 74 20 63 6f 6c 75 6d  ause, omit colum
b5c0: 6e 73 20 69 6e 20 74 68 65 0a 20 20 20 20 20 20  ns in the.      
b5d0: 20 20 20 20 20 20 20 20 20 20 2a 2a 20 75 73 69            ** usi
b5e0: 6e 67 20 63 6c 61 75 73 65 20 66 72 6f 6d 20 74  ng clause from t
b5f0: 68 65 20 74 61 62 6c 65 20 6f 6e 20 74 68 65 20  he table on the 
b600: 72 69 67 68 74 2e 20 2a 2f 0a 20 20 20 20 20 20  right. */.      
b610: 20 20 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e            contin
b620: 75 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ue;.            
b630: 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20    }.            
b640: 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 52  }.            pR
b650: 69 67 68 74 20 3d 20 73 71 6c 69 74 65 33 50 45  ight = sqlite3PE
b660: 78 70 72 28 70 50 61 72 73 65 2c 20 54 4b 5f 49  xpr(pParse, TK_I
b670: 44 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20  D, 0, 0, 0);.   
b680: 20 20 20 20 20 20 20 20 20 69 66 28 20 70 52 69           if( pRi
b690: 67 68 74 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a  ght==0 ) break;.
b6a0: 20 20 20 20 20 20 20 20 20 20 20 20 73 65 74 51              setQ
b6b0: 75 6f 74 65 64 54 6f 6b 65 6e 28 70 50 61 72 73  uotedToken(pPars
b6c0: 65 2c 20 26 70 52 69 67 68 74 2d 3e 74 6f 6b 65  e, &pRight->toke
b6d0: 6e 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20  n, zName);.     
b6e0: 20 20 20 20 20 20 20 69 66 28 20 7a 54 61 62 4e         if( zTabN
b6f0: 61 6d 65 20 26 26 20 28 6c 6f 6e 67 4e 61 6d 65  ame && (longName
b700: 73 20 7c 7c 20 70 54 61 62 4c 69 73 74 2d 3e 6e  s || pTabList->n
b710: 53 72 63 3e 31 29 20 29 7b 0a 20 20 20 20 20 20  Src>1) ){.      
b720: 20 20 20 20 20 20 20 20 45 78 70 72 20 2a 70 4c          Expr *pL
b730: 65 66 74 20 3d 20 73 71 6c 69 74 65 33 50 45 78  eft = sqlite3PEx
b740: 70 72 28 70 50 61 72 73 65 2c 20 54 4b 5f 49 44  pr(pParse, TK_ID
b750: 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  , 0, 0, 0);.    
b760: 20 20 20 20 20 20 20 20 20 20 70 45 78 70 72 20            pExpr 
b770: 3d 20 73 71 6c 69 74 65 33 50 45 78 70 72 28 70  = sqlite3PExpr(p
b780: 50 61 72 73 65 2c 20 54 4b 5f 44 4f 54 2c 20 70  Parse, TK_DOT, p
b790: 4c 65 66 74 2c 20 70 52 69 67 68 74 2c 20 30 29  Left, pRight, 0)
b7a0: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
b7b0: 69 66 28 20 70 45 78 70 72 3d 3d 30 20 29 20 62  if( pExpr==0 ) b
b7c0: 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20  reak;.          
b7d0: 20 20 20 20 73 65 74 51 75 6f 74 65 64 54 6f 6b      setQuotedTok
b7e0: 65 6e 28 70 50 61 72 73 65 2c 20 26 70 4c 65 66  en(pParse, &pLef
b7f0: 74 2d 3e 74 6f 6b 65 6e 2c 20 7a 54 61 62 4e 61  t->token, zTabNa
b800: 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  me);.           
b810: 20 20 20 73 65 74 54 6f 6b 65 6e 28 26 70 45 78     setToken(&pEx
b820: 70 72 2d 3e 73 70 61 6e 2c 20 0a 20 20 20 20 20  pr->span, .     
b830: 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c               sql
b840: 69 74 65 33 4d 50 72 69 6e 74 66 28 64 62 2c 20  ite3MPrintf(db, 
b850: 22 25 73 2e 25 73 22 2c 20 7a 54 61 62 4e 61 6d  "%s.%s", zTabNam
b860: 65 2c 20 7a 4e 61 6d 65 29 29 3b 0a 20 20 20 20  e, zName));.    
b870: 20 20 20 20 20 20 20 20 20 20 70 45 78 70 72 2d            pExpr-
b880: 3e 73 70 61 6e 2e 64 79 6e 20 3d 20 31 3b 0a 20  >span.dyn = 1;. 
b890: 20 20 20 20 20 20 20 20 20 20 20 20 20 70 45 78               pEx
b8a0: 70 72 2d 3e 74 6f 6b 65 6e 2e 7a 20 3d 20 30 3b  pr->token.z = 0;
b8b0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70  .              p
b8c0: 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 6e 20 3d 20  Expr->token.n = 
b8d0: 30 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  0;.             
b8e0: 20 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 64 79   pExpr->token.dy
b8f0: 6e 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20  n = 0;.         
b900: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
b910: 20 20 20 20 20 20 20 20 70 45 78 70 72 20 3d 20          pExpr = 
b920: 70 52 69 67 68 74 3b 0a 20 20 20 20 20 20 20 20  pRight;.        
b930: 20 20 20 20 20 20 70 45 78 70 72 2d 3e 73 70 61        pExpr->spa
b940: 6e 20 3d 20 70 45 78 70 72 2d 3e 74 6f 6b 65 6e  n = pExpr->token
b950: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
b960: 70 45 78 70 72 2d 3e 73 70 61 6e 2e 64 79 6e 20  pExpr->span.dyn 
b970: 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 20  = 0;.           
b980: 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 69   }.            i
b990: 66 28 20 6c 6f 6e 67 4e 61 6d 65 73 20 29 7b 0a  f( longNames ){.
b9a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 4e                pN
b9b0: 65 77 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  ew = sqlite3Expr
b9c0: 4c 69 73 74 41 70 70 65 6e 64 28 70 50 61 72 73  ListAppend(pPars
b9d0: 65 2c 20 70 4e 65 77 2c 20 70 45 78 70 72 2c 20  e, pNew, pExpr, 
b9e0: 26 70 45 78 70 72 2d 3e 73 70 61 6e 29 3b 0a 20  &pExpr->span);. 
b9f0: 20 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65             }else
ba00: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
ba10: 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 45 78  pNew = sqlite3Ex
ba20: 70 72 4c 69 73 74 41 70 70 65 6e 64 28 70 50 61  prListAppend(pPa
ba30: 72 73 65 2c 20 70 4e 65 77 2c 20 70 45 78 70 72  rse, pNew, pExpr
ba40: 2c 20 26 70 52 69 67 68 74 2d 3e 74 6f 6b 65 6e  , &pRight->token
ba50: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  );.            }
ba60: 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
ba70: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69       }.        i
ba80: 66 28 20 21 74 61 62 6c 65 53 65 65 6e 20 29 7b  f( !tableSeen ){
ba90: 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 7a  .          if( z
baa0: 54 4e 61 6d 65 20 29 7b 0a 20 20 20 20 20 20 20  TName ){.       
bab0: 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f       sqlite3Erro
bac0: 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 6e 6f  rMsg(pParse, "no
bad0: 20 73 75 63 68 20 74 61 62 6c 65 3a 20 25 73 22   such table: %s"
bae0: 2c 20 7a 54 4e 61 6d 65 29 3b 0a 20 20 20 20 20  , zTName);.     
baf0: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
bb00: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
bb10: 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
bb20: 22 6e 6f 20 74 61 62 6c 65 73 20 73 70 65 63 69  "no tables speci
bb30: 66 69 65 64 22 29 3b 0a 20 20 20 20 20 20 20 20  fied");.        
bb40: 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 72 63    }.          rc
bb50: 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 7d 0a   = 1;.        }.
bb60: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
bb70: 66 72 65 65 28 7a 54 4e 61 6d 65 29 3b 0a 20 20  free(zTName);.  
bb80: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
bb90: 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44  sqlite3ExprListD
bba0: 65 6c 65 74 65 28 70 45 4c 69 73 74 29 3b 0a 20  elete(pEList);. 
bbb0: 20 20 20 70 2d 3e 70 45 4c 69 73 74 20 3d 20 70     p->pEList = p
bbc0: 4e 65 77 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  New;.  }.  if( p
bbd0: 2d 3e 70 45 4c 69 73 74 20 26 26 20 70 2d 3e 70  ->pEList && p->p
bbe0: 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3e 53 51 4c  EList->nExpr>SQL
bbf0: 49 54 45 5f 4d 41 58 5f 43 4f 4c 55 4d 4e 20 29  ITE_MAX_COLUMN )
bc00: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72  {.    sqlite3Err
bc10: 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 74  orMsg(pParse, "t
bc20: 6f 6f 20 6d 61 6e 79 20 63 6f 6c 75 6d 6e 73 20  oo many columns 
bc30: 69 6e 20 72 65 73 75 6c 74 20 73 65 74 22 29 3b  in result set");
bc40: 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45  .    rc = SQLITE
bc50: 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66  _ERROR;.  }.  if
bc60: 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ( db->mallocFail
bc70: 65 64 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53  ed ){.    rc = S
bc80: 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d  QLITE_NOMEM;.  }
bc90: 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
bca0: 0a 2f 2a 0a 2a 2a 20 70 45 20 69 73 20 61 20 70  ./*.** pE is a p
bcb0: 6f 69 6e 74 65 72 20 74 6f 20 61 6e 20 65 78 70  ointer to an exp
bcc0: 72 65 73 73 69 6f 6e 20 77 68 69 63 68 20 69 73  ression which is
bcd0: 20 61 20 73 69 6e 67 6c 65 20 74 65 72 6d 20 69   a single term i
bce0: 6e 0a 2a 2a 20 4f 52 44 45 52 20 42 59 20 6f 72  n.** ORDER BY or
bcf0: 20 47 52 4f 55 50 20 42 59 20 63 6c 61 75 73 65   GROUP BY clause
bd00: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 45 20 65 76  ..**.** If pE ev
bd10: 61 6c 75 61 74 65 73 20 74 6f 20 61 6e 20 69 6e  aluates to an in
bd20: 74 65 67 65 72 20 63 6f 6e 73 74 61 6e 74 20 69  teger constant i
bd30: 2c 20 74 68 65 6e 20 72 65 74 75 72 6e 20 69 2e  , then return i.
bd40: 0a 2a 2a 20 54 68 69 73 20 69 73 20 61 6e 20 69  .** This is an i
bd50: 6e 64 69 63 61 74 69 6f 6e 20 74 6f 20 74 68 65  ndication to the
bd60: 20 63 61 6c 6c 65 72 20 74 68 61 74 20 69 74 20   caller that it 
bd70: 73 68 6f 75 6c 64 20 73 6f 72 74 0a 2a 2a 20 62  should sort.** b
bd80: 79 20 74 68 65 20 69 2d 74 68 20 63 6f 6c 75 6d  y the i-th colum
bd90: 6e 20 6f 66 20 74 68 65 20 72 65 73 75 6c 74 20  n of the result 
bda0: 73 65 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 45  set..**.** If pE
bdb0: 20 69 73 20 61 20 77 65 6c 6c 2d 66 6f 72 6d 65   is a well-forme
bdc0: 64 20 65 78 70 72 65 73 73 69 6f 6e 20 61 6e 64  d expression and
bdd0: 20 74 68 65 20 53 45 4c 45 43 54 20 73 74 61 74   the SELECT stat
bde0: 65 6d 65 6e 74 0a 2a 2a 20 69 73 20 6e 6f 74 20  ement.** is not 
bdf0: 63 6f 6d 70 6f 75 6e 64 2c 20 74 68 65 6e 20 72  compound, then r
be00: 65 74 75 72 6e 20 30 2e 20 20 54 68 69 73 20 69  eturn 0.  This i
be10: 6e 64 69 63 61 74 65 73 20 74 6f 20 74 68 65 0a  ndicates to the.
be20: 2a 2a 20 63 61 6c 6c 65 72 20 74 68 61 74 20 69  ** caller that i
be30: 74 20 73 68 6f 75 6c 64 20 73 6f 72 74 20 62 79  t should sort by
be40: 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68   the value of th
be50: 65 20 4f 52 44 45 52 20 42 59 0a 2a 2a 20 65 78  e ORDER BY.** ex
be60: 70 72 65 73 73 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20  pression..**.** 
be70: 49 66 20 74 68 65 20 53 45 4c 45 43 54 20 69 73  If the SELECT is
be80: 20 63 6f 6d 70 6f 75 6e 64 2c 20 74 68 65 6e 20   compound, then 
be90: 61 74 74 65 6d 70 74 20 74 6f 20 6d 61 74 63 68  attempt to match
bea0: 20 70 45 20 61 67 61 69 6e 73 74 0a 2a 2a 20 72   pE against.** r
beb0: 65 73 75 6c 74 20 73 65 74 20 63 6f 6c 75 6d 6e  esult set column
bec0: 73 20 69 6e 20 74 68 65 20 6c 65 66 74 2d 6d 6f  s in the left-mo
bed0: 73 74 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d  st SELECT statem
bee0: 65 6e 74 2e 20 20 52 65 74 75 72 6e 0a 2a 2a 20  ent.  Return.** 
bef0: 74 68 65 20 69 6e 64 65 78 20 69 20 6f 66 20 74  the index i of t
bf00: 68 65 20 6d 61 74 63 68 69 6e 67 20 63 6f 6c 75  he matching colu
bf10: 6d 6e 2c 20 61 73 20 61 6e 20 69 6e 64 69 63 61  mn, as an indica
bf20: 74 69 6f 6e 20 74 6f 20 74 68 65 20 0a 2a 2a 20  tion to the .** 
bf30: 63 61 6c 6c 65 72 20 74 68 61 74 20 69 74 20 73  caller that it s
bf40: 68 6f 75 6c 64 20 73 6f 72 74 20 62 79 20 74 68  hould sort by th
bf50: 65 20 69 2d 74 68 20 63 6f 6c 75 6d 6e 2e 20 20  e i-th column.  
bf60: 49 66 20 74 68 65 72 65 20 69 73 0a 2a 2a 20 6e  If there is.** n
bf70: 6f 20 6d 61 74 63 68 2c 20 72 65 74 75 72 6e 20  o match, return 
bf80: 2d 31 20 61 6e 64 20 6c 65 61 76 65 20 61 6e 20  -1 and leave an 
bf90: 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 69 6e  error message in
bfa0: 20 70 50 61 72 73 65 2e 0a 2a 2f 0a 73 74 61 74   pParse..*/.stat
bfb0: 69 63 20 69 6e 74 20 6d 61 74 63 68 4f 72 64 65  ic int matchOrde
bfc0: 72 42 79 54 65 72 6d 54 6f 45 78 70 72 4c 69 73  rByTermToExprLis
bfd0: 74 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  t(.  Parse *pPar
bfe0: 73 65 2c 20 20 20 20 20 2f 2a 20 50 61 72 73 69  se,     /* Parsi
bff0: 6e 67 20 63 6f 6e 74 65 78 74 20 66 6f 72 20 65  ng context for e
c000: 72 72 6f 72 20 6d 65 73 73 61 67 65 73 20 2a 2f  rror messages */
c010: 0a 20 20 53 65 6c 65 63 74 20 2a 70 53 65 6c 65  .  Select *pSele
c020: 63 74 2c 20 20 20 2f 2a 20 54 68 65 20 53 45 4c  ct,   /* The SEL
c030: 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 77 69  ECT statement wi
c040: 74 68 20 74 68 65 20 4f 52 44 45 52 20 42 59 20  th the ORDER BY 
c050: 63 6c 61 75 73 65 20 2a 2f 0a 20 20 45 78 70 72  clause */.  Expr
c060: 20 2a 70 45 2c 20 20 20 20 20 20 20 20 20 20 2f   *pE,          /
c070: 2a 20 54 68 65 20 73 70 65 63 69 66 69 63 20 4f  * The specific O
c080: 52 44 45 52 20 42 59 20 74 65 72 6d 20 2a 2f 0a  RDER BY term */.
c090: 20 20 69 6e 74 20 69 64 78 2c 20 20 20 20 20 20    int idx,      
c0a0: 20 20 20 20 20 2f 2a 20 57 68 65 6e 20 4f 52 44       /* When ORD
c0b0: 45 52 20 42 59 20 74 65 72 6d 20 69 73 20 74 68  ER BY term is th
c0c0: 69 73 20 2a 2f 0a 20 20 69 6e 74 20 69 73 43 6f  is */.  int isCo
c0d0: 6d 70 6f 75 6e 64 2c 20 20 20 20 2f 2a 20 54 72  mpound,    /* Tr
c0e0: 75 65 20 69 66 20 74 68 69 73 20 69 73 20 61 20  ue if this is a 
c0f0: 63 6f 6d 70 6f 75 6e 64 20 53 45 4c 45 43 54 20  compound SELECT 
c100: 2a 2f 0a 20 20 75 38 20 2a 70 48 61 73 41 67 67  */.  u8 *pHasAgg
c110: 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
c120: 69 66 20 65 78 70 72 65 73 73 69 6f 6e 20 63 6f  if expression co
c130: 6e 74 61 69 6e 73 20 61 67 67 72 65 67 61 74 65  ntains aggregate
c140: 20 66 75 6e 63 74 69 6f 6e 73 20 2a 2f 0a 29 7b   functions */.){
c150: 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20  .  int i;       
c160: 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f        /* Loop co
c170: 75 6e 74 65 72 20 2a 2f 0a 20 20 45 78 70 72 4c  unter */.  ExprL
c180: 69 73 74 20 2a 70 45 4c 69 73 74 3b 20 20 2f 2a  ist *pEList;  /*
c190: 20 54 68 65 20 63 6f 6c 75 6d 6e 73 20 6f 66 20   The columns of 
c1a0: 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 20 2a  the result set *
c1b0: 2f 0a 20 20 4e 61 6d 65 43 6f 6e 74 65 78 74 20  /.  NameContext 
c1c0: 6e 63 3b 20 20 20 20 2f 2a 20 4e 61 6d 65 20 63  nc;    /* Name c
c1d0: 6f 6e 74 65 78 74 20 66 6f 72 20 72 65 73 6f 6c  ontext for resol
c1e0: 76 69 6e 67 20 70 45 20 2a 2f 0a 0a 0a 20 20 2f  ving pE */...  /
c1f0: 2a 20 49 66 20 74 68 65 20 74 65 72 6d 20 69 73  * If the term is
c200: 20 61 6e 20 69 6e 74 65 67 65 72 20 63 6f 6e 73   an integer cons
c210: 74 61 6e 74 2c 20 72 65 74 75 72 6e 20 74 68 65  tant, return the
c220: 20 76 61 6c 75 65 20 6f 66 20 74 68 61 74 0a 20   value of that. 
c230: 20 2a 2a 20 63 6f 6e 73 74 61 6e 74 20 2a 2f 0a   ** constant */.
c240: 20 20 70 45 4c 69 73 74 20 3d 20 70 53 65 6c 65    pEList = pSele
c250: 63 74 2d 3e 70 45 4c 69 73 74 3b 0a 20 20 69 66  ct->pEList;.  if
c260: 28 20 73 71 6c 69 74 65 33 45 78 70 72 49 73 49  ( sqlite3ExprIsI
c270: 6e 74 65 67 65 72 28 70 45 2c 20 26 69 29 20 29  nteger(pE, &i) )
c280: 7b 0a 20 20 20 20 69 66 28 20 69 3c 3d 30 20 29  {.    if( i<=0 )
c290: 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 69 20  {.      /* If i 
c2a0: 69 73 20 74 6f 6f 20 73 6d 61 6c 6c 2c 20 6d 61  is too small, ma
c2b0: 6b 65 20 69 74 20 74 6f 6f 20 62 69 67 2e 20 20  ke it too big.  
c2c0: 54 68 61 74 20 77 61 79 20 74 68 65 20 63 61 6c  That way the cal
c2d0: 6c 69 6e 67 0a 20 20 20 20 20 20 2a 2a 20 66 75  ling.      ** fu
c2e0: 6e 63 74 69 6f 6e 20 73 74 69 6c 6c 20 73 65 65  nction still see
c2f0: 73 20 61 20 76 61 6c 75 65 20 74 68 61 74 20 69  s a value that i
c300: 73 20 6f 75 74 20 6f 66 20 72 61 6e 67 65 2c 20  s out of range, 
c310: 62 75 74 20 64 6f 65 73 0a 20 20 20 20 20 20 2a  but does.      *
c320: 2a 20 6e 6f 74 20 63 6f 6e 66 75 73 65 20 74 68  * not confuse th
c330: 65 20 63 6f 6c 75 6d 6e 20 6e 75 6d 62 65 72 20  e column number 
c340: 77 69 74 68 20 30 20 6f 72 20 2d 31 20 72 65 73  with 0 or -1 res
c350: 75 6c 74 20 63 6f 64 65 2e 0a 20 20 20 20 20 20  ult code..      
c360: 2a 2f 0a 20 20 20 20 20 20 69 20 3d 20 70 45 4c  */.      i = pEL
c370: 69 73 74 2d 3e 6e 45 78 70 72 2b 31 3b 0a 20 20  ist->nExpr+1;.  
c380: 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 69    }.    return i
c390: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74  ;.  }..  /* If t
c3a0: 68 65 20 74 65 72 6d 20 69 73 20 61 20 73 69 6d  he term is a sim
c3b0: 70 6c 65 20 69 64 65 6e 74 69 66 69 65 72 20 74  ple identifier t
c3c0: 68 61 74 20 74 72 79 20 74 6f 20 6d 61 74 63 68  hat try to match
c3d0: 20 74 68 61 74 20 69 64 65 6e 74 69 66 69 65 72   that identifier
c3e0: 0a 20 20 2a 2a 20 61 67 61 69 6e 73 74 20 61 20  .  ** against a 
c3f0: 63 6f 6c 75 6d 6e 20 6e 61 6d 65 20 69 6e 20 74  column name in t
c400: 68 65 20 72 65 73 75 6c 74 20 73 65 74 2e 0a 20  he result set.. 
c410: 20 2a 2f 0a 20 20 69 66 28 20 70 45 2d 3e 6f 70   */.  if( pE->op
c420: 3d 3d 54 4b 5f 49 44 20 7c 7c 20 28 70 45 2d 3e  ==TK_ID || (pE->
c430: 6f 70 3d 3d 54 4b 5f 53 54 52 49 4e 47 20 26 26  op==TK_STRING &&
c440: 20 70 45 2d 3e 74 6f 6b 65 6e 2e 7a 5b 30 5d 21   pE->token.z[0]!
c450: 3d 27 5c 27 27 29 20 29 7b 0a 20 20 20 20 73 71  ='\'') ){.    sq
c460: 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72  lite3 *db = pPar
c470: 73 65 2d 3e 64 62 3b 0a 20 20 20 20 63 68 61 72  se->db;.    char
c480: 20 2a 7a 43 6f 6c 20 3d 20 73 71 6c 69 74 65 33   *zCol = sqlite3
c490: 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 64 62  NameFromToken(db
c4a0: 2c 20 26 70 45 2d 3e 74 6f 6b 65 6e 29 3b 0a 20  , &pE->token);. 
c4b0: 20 20 20 69 66 28 20 7a 43 6f 6c 3d 3d 30 20 29     if( zCol==0 )
c4c0: 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 2d  {.      return -
c4d0: 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f 72  1;.    }.    for
c4e0: 28 69 3d 30 3b 20 69 3c 70 45 4c 69 73 74 2d 3e  (i=0; i<pEList->
c4f0: 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20  nExpr; i++){.   
c500: 20 20 20 63 68 61 72 20 2a 7a 41 73 20 3d 20 70     char *zAs = p
c510: 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d  EList->a[i].zNam
c520: 65 3b 0a 20 20 20 20 20 20 69 66 28 20 7a 41 73  e;.      if( zAs
c530: 21 3d 30 20 26 26 20 73 71 6c 69 74 65 33 53 74  !=0 && sqlite3St
c540: 72 49 43 6d 70 28 7a 41 73 2c 20 7a 43 6f 6c 29  rICmp(zAs, zCol)
c550: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 73  ==0 ){.        s
c560: 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 43 6f 6c  qlite3_free(zCol
c570: 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  );.        retur
c580: 6e 20 69 2b 31 3b 0a 20 20 20 20 20 20 7d 0a 20  n i+1;.      }. 
c590: 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
c5a0: 5f 66 72 65 65 28 7a 43 6f 6c 29 3b 0a 20 20 7d  _free(zCol);.  }
c5b0: 0a 0a 20 20 2f 2a 20 52 65 73 6f 6c 76 65 20 61  ..  /* Resolve a
c5c0: 6c 6c 20 6e 61 6d 65 73 20 69 6e 20 74 68 65 20  ll names in the 
c5d0: 4f 52 44 45 52 20 42 59 20 74 65 72 6d 20 65 78  ORDER BY term ex
c5e0: 70 72 65 73 73 69 6f 6e 0a 20 20 2a 2f 0a 20 20  pression.  */.  
c5f0: 6d 65 6d 73 65 74 28 26 6e 63 2c 20 30 2c 20 73  memset(&nc, 0, s
c600: 69 7a 65 6f 66 28 6e 63 29 29 3b 0a 20 20 6e 63  izeof(nc));.  nc
c610: 2e 70 50 61 72 73 65 20 3d 20 70 50 61 72 73 65  .pParse = pParse
c620: 3b 0a 20 20 6e 63 2e 70 53 72 63 4c 69 73 74 20  ;.  nc.pSrcList 
c630: 3d 20 70 53 65 6c 65 63 74 2d 3e 70 53 72 63 3b  = pSelect->pSrc;
c640: 0a 20 20 6e 63 2e 70 45 4c 69 73 74 20 3d 20 70  .  nc.pEList = p
c650: 45 4c 69 73 74 3b 0a 20 20 6e 63 2e 61 6c 6c 6f  EList;.  nc.allo
c660: 77 41 67 67 20 3d 20 31 3b 0a 20 20 6e 63 2e 6e  wAgg = 1;.  nc.n
c670: 45 72 72 20 3d 20 30 3b 0a 20 20 69 66 28 20 73  Err = 0;.  if( s
c680: 71 6c 69 74 65 33 45 78 70 72 52 65 73 6f 6c 76  qlite3ExprResolv
c690: 65 4e 61 6d 65 73 28 26 6e 63 2c 20 70 45 29 20  eNames(&nc, pE) 
c6a0: 29 7b 0a 20 20 20 20 69 66 28 20 69 73 43 6f 6d  ){.    if( isCom
c6b0: 70 6f 75 6e 64 20 29 7b 0a 20 20 20 20 20 20 73  pound ){.      s
c6c0: 71 6c 69 74 65 33 45 72 72 6f 72 43 6c 65 61 72  qlite3ErrorClear
c6d0: 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20  (pParse);.      
c6e0: 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d 65  return 0;.    }e
c6f0: 6c 73 65 7b 0a 20 20 20 20 20 20 72 65 74 75 72  lse{.      retur
c700: 6e 20 2d 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  n -1;.    }.  }.
c710: 20 20 69 66 28 20 6e 63 2e 68 61 73 41 67 67 20    if( nc.hasAgg 
c720: 26 26 20 70 48 61 73 41 67 67 20 29 7b 0a 20 20  && pHasAgg ){.  
c730: 20 20 2a 70 48 61 73 41 67 67 20 3d 20 31 3b 0a    *pHasAgg = 1;.
c740: 20 20 7d 0a 0a 20 20 2f 2a 20 46 6f 72 20 61 20    }..  /* For a 
c750: 63 6f 6d 70 6f 75 6e 64 20 53 45 4c 45 43 54 2c  compound SELECT,
c760: 20 77 65 20 6e 65 65 64 20 74 6f 20 74 72 79 20   we need to try 
c770: 74 6f 20 6d 61 74 63 68 20 74 68 65 20 4f 52 44  to match the ORD
c780: 45 52 20 42 59 0a 20 20 2a 2a 20 65 78 70 72 65  ER BY.  ** expre
c790: 73 73 69 6f 6e 20 61 67 61 69 6e 73 74 20 61 6e  ssion against an
c7a0: 20 65 78 70 72 65 73 73 69 6f 6e 20 69 6e 20 74   expression in t
c7b0: 68 65 20 72 65 73 75 6c 74 20 73 65 74 0a 20 20  he result set.  
c7c0: 2a 2f 0a 20 20 69 66 28 20 69 73 43 6f 6d 70 6f  */.  if( isCompo
c7d0: 75 6e 64 20 29 7b 0a 20 20 20 20 66 6f 72 28 69  und ){.    for(i
c7e0: 3d 30 3b 20 69 3c 70 45 4c 69 73 74 2d 3e 6e 45  =0; i<pEList->nE
c7f0: 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  xpr; i++){.     
c800: 20 69 66 28 20 73 71 6c 69 74 65 33 45 78 70 72   if( sqlite3Expr
c810: 43 6f 6d 70 61 72 65 28 70 45 4c 69 73 74 2d 3e  Compare(pEList->
c820: 61 5b 69 5d 2e 70 45 78 70 72 2c 20 70 45 29 20  a[i].pExpr, pE) 
c830: 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  ){.        retur
c840: 6e 20 69 2b 31 3b 0a 20 20 20 20 20 20 7d 0a 20  n i+1;.      }. 
c850: 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
c860: 6e 20 30 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 41  n 0;.}.../*.** A
c870: 6e 61 6c 79 7a 65 20 61 6e 64 20 4f 52 44 45 52  nalyze and ORDER
c880: 20 42 59 20 6f 72 20 47 52 4f 55 50 20 42 59 20   BY or GROUP BY 
c890: 63 6c 61 75 73 65 20 69 6e 20 61 20 73 69 6d 70  clause in a simp
c8a0: 6c 65 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d  le SELECT statem
c8b0: 65 6e 74 2e 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ent..** Return t
c8c0: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 65 72 72  he number of err
c8d0: 6f 72 73 20 73 65 65 6e 2e 0a 2a 2a 0a 2a 2a 20  ors seen..**.** 
c8e0: 45 76 65 72 79 20 74 65 72 6d 20 6f 66 20 74 68  Every term of th
c8f0: 65 20 4f 52 44 45 52 20 42 59 20 6f 72 20 47 52  e ORDER BY or GR
c900: 4f 55 50 20 42 59 20 63 6c 61 75 73 65 20 6e 65  OUP BY clause ne
c910: 65 64 73 20 74 6f 20 62 65 20 61 6e 0a 2a 2a 20  eds to be an.** 
c920: 65 78 70 72 65 73 73 69 6f 6e 2e 20 20 49 66 20  expression.  If 
c930: 61 6e 79 20 65 78 70 72 65 73 73 69 6f 6e 20 69  any expression i
c940: 73 20 61 6e 20 69 6e 74 65 67 65 72 20 63 6f 6e  s an integer con
c950: 73 74 61 6e 74 2c 20 74 68 65 6e 0a 2a 2a 20 74  stant, then.** t
c960: 68 61 74 20 65 78 70 72 65 73 73 69 6f 6e 20 69  hat expression i
c970: 73 20 72 65 70 6c 61 63 65 64 20 62 79 20 74 68  s replaced by th
c980: 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20  e corresponding 
c990: 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 20 66  .** expression f
c9a0: 72 6f 6d 20 74 68 65 20 72 65 73 75 6c 74 20 73  rom the result s
c9b0: 65 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  et..*/.static in
c9c0: 74 20 70 72 6f 63 65 73 73 4f 72 64 65 72 47 72  t processOrderGr
c9d0: 6f 75 70 42 79 28 0a 20 20 50 61 72 73 65 20 2a  oupBy(.  Parse *
c9e0: 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 2f  pParse,        /
c9f0: 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78  * Parsing contex
ca00: 74 2e 20 20 4c 65 61 76 65 20 65 72 72 6f 72 20  t.  Leave error 
ca10: 6d 65 73 73 61 67 65 73 20 68 65 72 65 20 2a 2f  messages here */
ca20: 0a 20 20 53 65 6c 65 63 74 20 2a 70 53 65 6c 65  .  Select *pSele
ca30: 63 74 2c 20 20 20 20 20 20 2f 2a 20 54 68 65 20  ct,      /* The 
ca40: 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
ca50: 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20   containing the 
ca60: 63 6c 61 75 73 65 20 2a 2f 0a 20 20 45 78 70 72  clause */.  Expr
ca70: 4c 69 73 74 20 2a 70 4f 72 64 65 72 42 79 2c 20  List *pOrderBy, 
ca80: 20 20 2f 2a 20 54 68 65 20 4f 52 44 45 52 20 42    /* The ORDER B
ca90: 59 20 6f 72 20 47 52 4f 55 50 20 42 59 20 63 6c  Y or GROUP BY cl
caa0: 61 75 73 65 20 74 6f 20 62 65 20 70 72 6f 63 65  ause to be proce
cab0: 73 73 65 64 20 2a 2f 0a 20 20 69 6e 74 20 69 73  ssed */.  int is
cac0: 4f 72 64 65 72 2c 20 20 20 20 20 20 20 20 20 20  Order,          
cad0: 2f 2a 20 31 20 66 6f 72 20 4f 52 44 45 52 20 42  /* 1 for ORDER B
cae0: 59 2e 20 20 30 20 66 6f 72 20 47 52 4f 55 50 20  Y.  0 for GROUP 
caf0: 42 59 20 2a 2f 0a 20 20 75 38 20 2a 70 48 61 73  BY */.  u8 *pHas
cb00: 41 67 67 20 20 20 20 20 20 20 20 20 20 20 2f 2a  Agg           /*
cb10: 20 53 65 74 20 74 6f 20 54 52 55 45 20 69 66 20   Set to TRUE if 
cb20: 61 6e 79 20 74 65 72 6d 20 63 6f 6e 74 61 69 6e  any term contain
cb30: 73 20 61 6e 20 61 67 67 72 65 67 61 74 65 20 2a  s an aggregate *
cb40: 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  /.){.  int i;.  
cb50: 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50  sqlite3 *db = pP
cb60: 61 72 73 65 2d 3e 64 62 3b 0a 20 20 45 78 70 72  arse->db;.  Expr
cb70: 4c 69 73 74 20 2a 70 45 4c 69 73 74 3b 0a 0a 20  List *pEList;.. 
cb80: 20 69 66 28 20 70 4f 72 64 65 72 42 79 3d 3d 30   if( pOrderBy==0
cb90: 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69   ) return 0;.  i
cba0: 66 28 20 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78  f( pOrderBy->nEx
cbb0: 70 72 3e 53 51 4c 49 54 45 5f 4d 41 58 5f 43 4f  pr>SQLITE_MAX_CO
cbc0: 4c 55 4d 4e 20 29 7b 0a 20 20 20 20 63 6f 6e 73  LUMN ){.    cons
cbd0: 74 20 63 68 61 72 20 2a 7a 54 79 70 65 20 3d 20  t char *zType = 
cbe0: 69 73 4f 72 64 65 72 20 3f 20 22 4f 52 44 45 52  isOrder ? "ORDER
cbf0: 22 20 3a 20 22 47 52 4f 55 50 22 3b 0a 20 20 20  " : "GROUP";.   
cc00: 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
cc10: 28 70 50 61 72 73 65 2c 20 22 74 6f 6f 20 6d 61  (pParse, "too ma
cc20: 6e 79 20 74 65 72 6d 73 20 69 6e 20 25 73 20 42  ny terms in %s B
cc30: 59 20 63 6c 61 75 73 65 22 2c 20 7a 54 79 70 65  Y clause", zType
cc40: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 31 3b  );.    return 1;
cc50: 0a 20 20 7d 0a 20 20 70 45 4c 69 73 74 20 3d 20  .  }.  pEList = 
cc60: 70 53 65 6c 65 63 74 2d 3e 70 45 4c 69 73 74 3b  pSelect->pEList;
cc70: 0a 20 20 69 66 28 20 70 45 4c 69 73 74 3d 3d 30  .  if( pEList==0
cc80: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30   ){.    return 0
cc90: 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d 30 3b  ;.  }.  for(i=0;
cca0: 20 69 3c 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78   i<pOrderBy->nEx
ccb0: 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 6e  pr; i++){.    in
ccc0: 74 20 69 43 6f 6c 3b 0a 20 20 20 20 45 78 70 72  t iCol;.    Expr
ccd0: 20 2a 70 45 20 3d 20 70 4f 72 64 65 72 42 79 2d   *pE = pOrderBy-
cce0: 3e 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20  >a[i].pExpr;.   
ccf0: 20 69 43 6f 6c 20 3d 20 6d 61 74 63 68 4f 72 64   iCol = matchOrd
cd00: 65 72 42 79 54 65 72 6d 54 6f 45 78 70 72 4c 69  erByTermToExprLi
cd10: 73 74 28 70 50 61 72 73 65 2c 20 70 53 65 6c 65  st(pParse, pSele
cd20: 63 74 2c 20 70 45 2c 20 69 2b 31 2c 20 30 2c 20  ct, pE, i+1, 0, 
cd30: 70 48 61 73 41 67 67 29 3b 0a 20 20 20 20 69 66  pHasAgg);.    if
cd40: 28 20 69 43 6f 6c 3c 30 20 29 7b 0a 20 20 20 20  ( iCol<0 ){.    
cd50: 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20    return 1;.    
cd60: 7d 0a 20 20 20 20 69 66 28 20 69 43 6f 6c 3e 70  }.    if( iCol>p
cd70: 45 4c 69 73 74 2d 3e 6e 45 78 70 72 20 29 7b 0a  EList->nExpr ){.
cd80: 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72        const char
cd90: 20 2a 7a 54 79 70 65 20 3d 20 69 73 4f 72 64 65   *zType = isOrde
cda0: 72 20 3f 20 22 4f 52 44 45 52 22 20 3a 20 22 47  r ? "ORDER" : "G
cdb0: 52 4f 55 50 22 3b 0a 20 20 20 20 20 20 73 71 6c  ROUP";.      sql
cdc0: 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
cdd0: 72 73 65 2c 20 0a 20 20 20 20 20 20 20 20 20 22  rse, .         "
cde0: 25 72 20 25 73 20 42 59 20 74 65 72 6d 20 6f 75  %r %s BY term ou
cdf0: 74 20 6f 66 20 72 61 6e 67 65 20 2d 20 73 68 6f  t of range - sho
ce00: 75 6c 64 20 62 65 20 22 0a 20 20 20 20 20 20 20  uld be ".       
ce10: 20 20 22 62 65 74 77 65 65 6e 20 31 20 61 6e 64    "between 1 and
ce20: 20 25 64 22 2c 20 69 2b 31 2c 20 7a 54 79 70 65   %d", i+1, zType
ce30: 2c 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 29  , pEList->nExpr)
ce40: 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 31  ;.      return 1
ce50: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
ce60: 69 43 6f 6c 3e 30 20 29 7b 0a 20 20 20 20 20 20  iCol>0 ){.      
ce70: 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 20 3d  CollSeq *pColl =
ce80: 20 70 45 2d 3e 70 43 6f 6c 6c 3b 0a 20 20 20 20   pE->pColl;.    
ce90: 20 20 69 6e 74 20 66 6c 61 67 73 20 3d 20 70 45    int flags = pE
cea0: 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f 45 78 70  ->flags & EP_Exp
ceb0: 43 6f 6c 6c 61 74 65 3b 0a 20 20 20 20 20 20 73  Collate;.      s
cec0: 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65  qlite3ExprDelete
ced0: 28 70 45 29 3b 0a 20 20 20 20 20 20 70 45 20 3d  (pE);.      pE =
cee0: 20 73 71 6c 69 74 65 33 45 78 70 72 44 75 70 28   sqlite3ExprDup(
cef0: 64 62 2c 20 70 45 4c 69 73 74 2d 3e 61 5b 69 43  db, pEList->a[iC
cf00: 6f 6c 2d 31 5d 2e 70 45 78 70 72 29 3b 0a 20 20  ol-1].pExpr);.  
cf10: 20 20 20 20 70 4f 72 64 65 72 42 79 2d 3e 61 5b      pOrderBy->a[
cf20: 69 5d 2e 70 45 78 70 72 20 3d 20 70 45 3b 0a 20  i].pExpr = pE;. 
cf30: 20 20 20 20 20 69 66 28 20 70 43 6f 6c 6c 20 26       if( pColl &
cf40: 26 20 66 6c 61 67 73 20 29 7b 0a 20 20 20 20 20  & flags ){.     
cf50: 20 20 20 70 45 2d 3e 70 43 6f 6c 6c 20 3d 20 70     pE->pColl = p
cf60: 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 20 20 70 45  Coll;.        pE
cf70: 2d 3e 66 6c 61 67 73 20 7c 3d 20 66 6c 61 67 73  ->flags |= flags
cf80: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
cf90: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a    }.  return 0;.
cfa0: 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6e 61 6c 79 7a 65  }../*.** Analyze
cfb0: 20 61 6e 64 20 4f 52 44 45 52 20 42 59 20 6f 72   and ORDER BY or
cfc0: 20 47 52 4f 55 50 20 42 59 20 63 6c 61 75 73 65   GROUP BY clause
cfd0: 20 69 6e 20 61 20 53 45 4c 45 43 54 20 73 74 61   in a SELECT sta
cfe0: 74 65 6d 65 6e 74 2e 20 20 52 65 74 75 72 6e 0a  tement.  Return.
cff0: 2a 2a 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  ** the number of
d000: 20 65 72 72 6f 72 73 20 73 65 65 6e 2e 0a 2a 2a   errors seen..**
d010: 0a 2a 2a 20 54 68 65 20 70 72 6f 63 65 73 73 69  .** The processi
d020: 6e 67 20 64 65 70 65 6e 64 73 20 6f 6e 20 77 68  ng depends on wh
d030: 65 74 68 65 72 20 74 68 65 20 53 45 4c 45 43 54  ether the SELECT
d040: 20 69 73 20 73 69 6d 70 6c 65 20 6f 72 20 63 6f   is simple or co
d050: 6d 70 6f 75 6e 64 2e 0a 2a 2a 20 46 6f 72 20 61  mpound..** For a
d060: 20 73 69 6d 70 6c 65 20 53 45 4c 45 43 54 20 73   simple SELECT s
d070: 74 61 74 65 6d 65 6e 74 2c 20 65 76 72 79 20 74  tatement, evry t
d080: 65 72 6d 20 6f 66 20 74 68 65 20 4f 52 44 45 52  erm of the ORDER
d090: 20 42 59 20 6f 72 20 47 52 4f 55 50 20 42 59 0a   BY or GROUP BY.
d0a0: 2a 2a 20 63 6c 61 75 73 65 20 6e 65 65 64 73 20  ** clause needs 
d0b0: 74 6f 20 62 65 20 61 6e 20 65 78 70 72 65 73 73  to be an express
d0c0: 69 6f 6e 2e 20 20 49 66 20 61 6e 79 20 65 78 70  ion.  If any exp
d0d0: 72 65 73 73 69 6f 6e 20 69 73 20 61 6e 20 69 6e  ression is an in
d0e0: 74 65 67 65 72 0a 2a 2a 20 63 6f 6e 73 74 61 6e  teger.** constan
d0f0: 74 2c 20 74 68 65 6e 20 74 68 61 74 20 65 78 70  t, then that exp
d100: 72 65 73 73 69 6f 6e 20 69 73 20 72 65 70 6c 61  ression is repla
d110: 63 65 64 20 62 79 20 74 68 65 20 63 6f 72 72 65  ced by the corre
d120: 73 70 6f 6e 64 69 6e 67 20 0a 2a 2a 20 65 78 70  sponding .** exp
d130: 72 65 73 73 69 6f 6e 20 66 72 6f 6d 20 74 68 65  ression from the
d140: 20 72 65 73 75 6c 74 20 73 65 74 2e 0a 2a 2a 0a   result set..**.
d150: 2a 2a 20 46 6f 72 20 63 6f 6d 70 6f 75 6e 64 20  ** For compound 
d160: 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
d170: 73 2c 20 65 76 65 72 79 20 65 78 70 72 65 73 73  s, every express
d180: 69 6f 6e 20 6e 65 65 64 73 20 74 6f 20 62 65 20  ion needs to be 
d190: 6f 66 0a 2a 2a 20 74 79 70 65 20 54 4b 5f 43 4f  of.** type TK_CO
d1a0: 4c 55 4d 4e 20 77 69 74 68 20 61 20 69 54 61 62  LUMN with a iTab
d1b0: 6c 65 20 76 61 6c 75 65 20 61 73 20 67 69 76 65  le value as give
d1c0: 6e 20 69 6e 20 74 68 65 20 34 74 68 20 70 61 72  n in the 4th par
d1d0: 61 6d 65 74 65 72 2e 0a 2a 2a 20 49 66 20 61 6e  ameter..** If an
d1e0: 79 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20  y expression is 
d1f0: 61 6e 20 69 6e 74 65 67 65 72 2c 20 74 68 61 74  an integer, that
d200: 20 62 65 63 6f 6d 65 73 20 74 68 65 20 63 6f 6c   becomes the col
d210: 75 6d 6e 20 6e 75 6d 62 65 72 2e 0a 2a 2a 20 4f  umn number..** O
d220: 74 68 65 72 77 69 73 65 2c 20 6d 61 74 63 68 20  therwise, match 
d230: 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 61  the expression a
d240: 67 61 69 6e 73 74 20 72 65 73 75 6c 74 20 73 65  gainst result se
d250: 74 20 63 6f 6c 75 6d 6e 73 20 66 72 6f 6d 0a 2a  t columns from.*
d260: 2a 20 74 68 65 20 6c 65 66 74 2d 6d 6f 73 74 20  * the left-most 
d270: 53 45 4c 45 43 54 2e 0a 2a 2f 0a 73 74 61 74 69  SELECT..*/.stati
d280: 63 20 69 6e 74 20 70 72 6f 63 65 73 73 43 6f 6d  c int processCom
d290: 70 6f 75 6e 64 4f 72 64 65 72 42 79 28 0a 20 20  poundOrderBy(.  
d2a0: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
d2b0: 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67        /* Parsing
d2c0: 20 63 6f 6e 74 65 78 74 2e 20 20 4c 65 61 76 65   context.  Leave
d2d0: 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 73 20   error messages 
d2e0: 68 65 72 65 20 2a 2f 0a 20 20 53 65 6c 65 63 74  here */.  Select
d2f0: 20 2a 70 53 65 6c 65 63 74 2c 20 20 20 20 20 20   *pSelect,      
d300: 2f 2a 20 54 68 65 20 53 45 4c 45 43 54 20 73 74  /* The SELECT st
d310: 61 74 65 6d 65 6e 74 20 63 6f 6e 74 61 69 6e 69  atement containi
d320: 6e 67 20 74 68 65 20 4f 52 44 45 52 20 42 59 20  ng the ORDER BY 
d330: 2a 2f 0a 20 20 69 6e 74 20 69 54 61 62 6c 65 20  */.  int iTable 
d340: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 75             /* Ou
d350: 74 70 75 74 20 74 61 62 6c 65 20 66 6f 72 20 63  tput table for c
d360: 6f 6d 70 6f 75 6e 64 20 53 45 4c 45 43 54 20 73  ompound SELECT s
d370: 74 61 74 65 6d 65 6e 74 73 20 2a 2f 0a 29 7b 0a  tatements */.){.
d380: 20 20 69 6e 74 20 69 3b 0a 20 20 45 78 70 72 4c    int i;.  ExprL
d390: 69 73 74 20 2a 70 4f 72 64 65 72 42 79 3b 0a 20  ist *pOrderBy;. 
d3a0: 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73   ExprList *pELis
d3b0: 74 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  t;.  sqlite3 *db
d3c0: 3b 0a 20 20 69 6e 74 20 6d 6f 72 65 54 6f 44 6f  ;.  int moreToDo
d3d0: 20 3d 20 31 3b 0a 0a 20 20 70 4f 72 64 65 72 42   = 1;..  pOrderB
d3e0: 79 20 3d 20 70 53 65 6c 65 63 74 2d 3e 70 4f 72  y = pSelect->pOr
d3f0: 64 65 72 42 79 3b 0a 20 20 69 66 28 20 70 4f 72  derBy;.  if( pOr
d400: 64 65 72 42 79 3d 3d 30 20 29 20 72 65 74 75 72  derBy==0 ) retur
d410: 6e 20 30 3b 0a 20 20 69 66 28 20 70 4f 72 64 65  n 0;.  if( pOrde
d420: 72 42 79 2d 3e 6e 45 78 70 72 3e 53 51 4c 49 54  rBy->nExpr>SQLIT
d430: 45 5f 4d 41 58 5f 43 4f 4c 55 4d 4e 20 29 7b 0a  E_MAX_COLUMN ){.
d440: 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
d450: 4d 73 67 28 70 50 61 72 73 65 2c 20 22 74 6f 6f  Msg(pParse, "too
d460: 20 6d 61 6e 79 20 74 65 72 6d 73 20 69 6e 20 4f   many terms in O
d470: 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 22 29  RDER BY clause")
d480: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a  ;.    return 1;.
d490: 20 20 7d 0a 20 20 64 62 20 3d 20 70 50 61 72 73    }.  db = pPars
d4a0: 65 2d 3e 64 62 3b 0a 20 20 66 6f 72 28 69 3d 30  e->db;.  for(i=0
d4b0: 3b 20 69 3c 70 4f 72 64 65 72 42 79 2d 3e 6e 45  ; i<pOrderBy->nE
d4c0: 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 70  xpr; i++){.    p
d4d0: 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 64 6f  OrderBy->a[i].do
d4e0: 6e 65 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 77 68  ne = 0;.  }.  wh
d4f0: 69 6c 65 28 20 70 53 65 6c 65 63 74 2d 3e 70 50  ile( pSelect->pP
d500: 72 69 6f 72 20 29 7b 0a 20 20 20 20 70 53 65 6c  rior ){.    pSel
d510: 65 63 74 20 3d 20 70 53 65 6c 65 63 74 2d 3e 70  ect = pSelect->p
d520: 50 72 69 6f 72 3b 0a 20 20 7d 0a 20 20 77 68 69  Prior;.  }.  whi
d530: 6c 65 28 20 70 53 65 6c 65 63 74 20 26 26 20 6d  le( pSelect && m
d540: 6f 72 65 54 6f 44 6f 20 29 7b 0a 20 20 20 20 6d  oreToDo ){.    m
d550: 6f 72 65 54 6f 44 6f 20 3d 20 30 3b 0a 20 20 20  oreToDo = 0;.   
d560: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4f 72 64   for(i=0; i<pOrd
d570: 65 72 42 79 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b  erBy->nExpr; i++
d580: 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 43 6f  ){.      int iCo
d590: 6c 3b 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70  l;.      Expr *p
d5a0: 45 2c 20 2a 70 44 75 70 3b 0a 20 20 20 20 20 20  E, *pDup;.      
d5b0: 69 66 28 20 70 4f 72 64 65 72 42 79 2d 3e 61 5b  if( pOrderBy->a[
d5c0: 69 5d 2e 64 6f 6e 65 20 29 20 63 6f 6e 74 69 6e  i].done ) contin
d5d0: 75 65 3b 0a 20 20 20 20 20 20 70 45 20 3d 20 70  ue;.      pE = p
d5e0: 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 70 45  OrderBy->a[i].pE
d5f0: 78 70 72 3b 0a 20 20 20 20 20 20 70 44 75 70 20  xpr;.      pDup 
d600: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44 75 70  = sqlite3ExprDup
d610: 28 64 62 2c 20 70 45 29 3b 0a 20 20 20 20 20 20  (db, pE);.      
d620: 69 66 28 20 70 44 75 70 3d 3d 30 20 29 7b 0a 20  if( pDup==0 ){. 
d630: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b         return 1;
d640: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
d650: 43 6f 6c 20 3d 20 6d 61 74 63 68 4f 72 64 65 72  Col = matchOrder
d660: 42 79 54 65 72 6d 54 6f 45 78 70 72 4c 69 73 74  ByTermToExprList
d670: 28 70 50 61 72 73 65 2c 20 70 53 65 6c 65 63 74  (pParse, pSelect
d680: 2c 20 70 44 75 70 2c 20 69 2b 31 2c 20 31 2c 20  , pDup, i+1, 1, 
d690: 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  0);.      sqlite
d6a0: 33 45 78 70 72 44 65 6c 65 74 65 28 70 44 75 70  3ExprDelete(pDup
d6b0: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 69 43 6f  );.      if( iCo
d6c0: 6c 3c 30 20 29 7b 0a 20 20 20 20 20 20 20 20 72  l<0 ){.        r
d6d0: 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 20 20 7d  eturn 1;.      }
d6e0: 0a 20 20 20 20 20 20 70 45 4c 69 73 74 20 3d 20  .      pEList = 
d6f0: 70 53 65 6c 65 63 74 2d 3e 70 45 4c 69 73 74 3b  pSelect->pEList;
d700: 0a 20 20 20 20 20 20 69 66 28 20 70 45 4c 69 73  .      if( pELis
d710: 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  t==0 ){.        
d720: 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 20 20  return 1;.      
d730: 7d 0a 20 20 20 20 20 20 69 66 28 20 69 43 6f 6c  }.      if( iCol
d740: 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 20 29  >pEList->nExpr )
d750: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
d760: 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
d770: 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 22 25  , .           "%
d780: 72 20 4f 52 44 45 52 20 42 59 20 74 65 72 6d 20  r ORDER BY term 
d790: 6f 75 74 20 6f 66 20 72 61 6e 67 65 20 2d 20 73  out of range - s
d7a0: 68 6f 75 6c 64 20 62 65 20 22 0a 20 20 20 20 20  hould be ".     
d7b0: 20 20 20 20 20 20 22 62 65 74 77 65 65 6e 20 31        "between 1
d7c0: 20 61 6e 64 20 25 64 22 2c 20 69 2b 31 2c 20 70   and %d", i+1, p
d7d0: 45 4c 69 73 74 2d 3e 6e 45 78 70 72 29 3b 0a 20  EList->nExpr);. 
d7e0: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b         return 1;
d7f0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
d800: 66 28 20 69 43 6f 6c 3e 30 20 29 7b 0a 20 20 20  f( iCol>0 ){.   
d810: 20 20 20 20 20 70 45 2d 3e 6f 70 20 3d 20 54 4b       pE->op = TK
d820: 5f 43 4f 4c 55 4d 4e 3b 0a 20 20 20 20 20 20 20  _COLUMN;.       
d830: 20 70 45 2d 3e 69 54 61 62 6c 65 20 3d 20 69 54   pE->iTable = iT
d840: 61 62 6c 65 3b 0a 20 20 20 20 20 20 20 20 70 45  able;.        pE
d850: 2d 3e 69 41 67 67 20 3d 20 2d 31 3b 0a 20 20 20  ->iAgg = -1;.   
d860: 20 20 20 20 20 70 45 2d 3e 69 43 6f 6c 75 6d 6e       pE->iColumn
d870: 20 3d 20 69 43 6f 6c 2d 31 3b 0a 20 20 20 20 20   = iCol-1;.     
d880: 20 20 20 70 45 2d 3e 70 54 61 62 20 3d 20 30 3b     pE->pTab = 0;
d890: 0a 20 20 20 20 20 20 20 20 70 4f 72 64 65 72 42  .        pOrderB
d8a0: 79 2d 3e 61 5b 69 5d 2e 64 6f 6e 65 20 3d 20 31  y->a[i].done = 1
d8b0: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
d8c0: 20 20 20 20 20 20 20 6d 6f 72 65 54 6f 44 6f 20         moreToDo 
d8d0: 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  = 1;.      }.   
d8e0: 20 7d 0a 20 20 20 20 70 53 65 6c 65 63 74 20 3d   }.    pSelect =
d8f0: 20 70 53 65 6c 65 63 74 2d 3e 70 4e 65 78 74 3b   pSelect->pNext;
d900: 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d 30 3b 20  .  }.  for(i=0; 
d910: 69 3c 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70  i<pOrderBy->nExp
d920: 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28  r; i++){.    if(
d930: 20 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e   pOrderBy->a[i].
d940: 64 6f 6e 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20  done==0 ){.     
d950: 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
d960: 28 70 50 61 72 73 65 2c 20 22 25 72 20 4f 52 44  (pParse, "%r ORD
d970: 45 52 20 42 59 20 74 65 72 6d 20 64 6f 65 73 20  ER BY term does 
d980: 6e 6f 74 20 6d 61 74 63 68 20 61 6e 79 20 22 0a  not match any ".
d990: 20 20 20 20 20 20 20 20 20 20 20 20 22 63 6f 6c              "col
d9a0: 75 6d 6e 20 69 6e 20 74 68 65 20 72 65 73 75 6c  umn in the resul
d9b0: 74 20 73 65 74 22 2c 20 69 2b 31 29 3b 0a 20 20  t set", i+1);.  
d9c0: 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20      return 1;.  
d9d0: 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
d9e0: 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 74   0;.}../*.** Get
d9f0: 20 61 20 56 44 42 45 20 66 6f 72 20 74 68 65 20   a VDBE for the 
da00: 67 69 76 65 6e 20 70 61 72 73 65 72 20 63 6f 6e  given parser con
da10: 74 65 78 74 2e 20 20 43 72 65 61 74 65 20 61 20  text.  Create a 
da20: 6e 65 77 20 6f 6e 65 20 69 66 20 6e 65 63 65 73  new one if neces
da30: 73 61 72 79 2e 0a 2a 2a 20 49 66 20 61 6e 20 65  sary..** If an e
da40: 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 72 65 74  rror occurs, ret
da50: 75 72 6e 20 4e 55 4c 4c 20 61 6e 64 20 6c 65 61  urn NULL and lea
da60: 76 65 20 61 20 6d 65 73 73 61 67 65 20 69 6e 20  ve a message in 
da70: 70 50 61 72 73 65 2e 0a 2a 2f 0a 56 64 62 65 20  pParse..*/.Vdbe 
da80: 2a 73 71 6c 69 74 65 33 47 65 74 56 64 62 65 28  *sqlite3GetVdbe(
da90: 50 61 72 73 65 20 2a 70 50 61 72 73 65 29 7b 0a  Parse *pParse){.
daa0: 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72    Vdbe *v = pPar
dab0: 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69 66 28  se->pVdbe;.  if(
dac0: 20 76 3d 3d 30 20 29 7b 0a 20 20 20 20 76 20 3d   v==0 ){.    v =
dad0: 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 20 3d   pParse->pVdbe =
dae0: 20 73 71 6c 69 74 65 33 56 64 62 65 43 72 65 61   sqlite3VdbeCrea
daf0: 74 65 28 70 50 61 72 73 65 2d 3e 64 62 29 3b 0a  te(pParse->db);.
db00: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 76 3b 0a    }.  return v;.
db10: 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 75 74  }.../*.** Comput
db20: 65 20 74 68 65 20 69 4c 69 6d 69 74 20 61 6e 64  e the iLimit and
db30: 20 69 4f 66 66 73 65 74 20 66 69 65 6c 64 73 20   iOffset fields 
db40: 6f 66 20 74 68 65 20 53 45 4c 45 43 54 20 62 61  of the SELECT ba
db50: 73 65 64 20 6f 6e 20 74 68 65 0a 2a 2a 20 70 4c  sed on the.** pL
db60: 69 6d 69 74 20 61 6e 64 20 70 4f 66 66 73 65 74  imit and pOffset
db70: 20 65 78 70 72 65 73 73 69 6f 6e 73 2e 20 20 70   expressions.  p
db80: 4c 69 6d 69 74 20 61 6e 64 20 70 4f 66 66 73 65  Limit and pOffse
db90: 74 20 68 6f 6c 64 20 74 68 65 20 65 78 70 72 65  t hold the expre
dba0: 73 73 69 6f 6e 73 0a 2a 2a 20 74 68 61 74 20 61  ssions.** that a
dbb0: 70 70 65 61 72 20 69 6e 20 74 68 65 20 6f 72 69  ppear in the ori
dbc0: 67 69 6e 61 6c 20 53 51 4c 20 73 74 61 74 65 6d  ginal SQL statem
dbd0: 65 6e 74 20 61 66 74 65 72 20 74 68 65 20 4c 49  ent after the LI
dbe0: 4d 49 54 20 61 6e 64 20 4f 46 46 53 45 54 0a 2a  MIT and OFFSET.*
dbf0: 2a 20 6b 65 79 77 6f 72 64 73 2e 20 20 4f 72 20  * keywords.  Or 
dc00: 4e 55 4c 4c 20 69 66 20 74 68 6f 73 65 20 6b 65  NULL if those ke
dc10: 79 77 6f 72 64 73 20 61 72 65 20 6f 6d 69 74 74  ywords are omitt
dc20: 65 64 2e 20 69 4c 69 6d 69 74 20 61 6e 64 20 69  ed. iLimit and i
dc30: 4f 66 66 73 65 74 20 0a 2a 2a 20 61 72 65 20 74  Offset .** are t
dc40: 68 65 20 69 6e 74 65 67 65 72 20 6d 65 6d 6f 72  he integer memor
dc50: 79 20 72 65 67 69 73 74 65 72 20 6e 75 6d 62 65  y register numbe
dc60: 72 73 20 66 6f 72 20 63 6f 75 6e 74 65 72 73 20  rs for counters 
dc70: 75 73 65 64 20 74 6f 20 63 6f 6d 70 75 74 65 20  used to compute 
dc80: 0a 2a 2a 20 74 68 65 20 6c 69 6d 69 74 20 61 6e  .** the limit an
dc90: 64 20 6f 66 66 73 65 74 2e 20 20 49 66 20 74 68  d offset.  If th
dca0: 65 72 65 20 69 73 20 6e 6f 20 6c 69 6d 69 74 20  ere is no limit 
dcb0: 61 6e 64 2f 6f 72 20 6f 66 66 73 65 74 2c 20 74  and/or offset, t
dcc0: 68 65 6e 20 0a 2a 2a 20 69 4c 69 6d 69 74 20 61  hen .** iLimit a
dcd0: 6e 64 20 69 4f 66 66 73 65 74 20 61 72 65 20 6e  nd iOffset are n
dce0: 65 67 61 74 69 76 65 2e 0a 2a 2a 0a 2a 2a 20 54  egative..**.** T
dcf0: 68 69 73 20 72 6f 75 74 69 6e 65 20 63 68 61 6e  his routine chan
dd00: 67 65 73 20 74 68 65 20 76 61 6c 75 65 73 20 6f  ges the values o
dd10: 66 20 69 4c 69 6d 69 74 20 61 6e 64 20 69 4f 66  f iLimit and iOf
dd20: 66 73 65 74 20 6f 6e 6c 79 20 69 66 0a 2a 2a 20  fset only if.** 
dd30: 61 20 6c 69 6d 69 74 20 6f 72 20 6f 66 66 73 65  a limit or offse
dd40: 74 20 69 73 20 64 65 66 69 6e 65 64 20 62 79 20  t is defined by 
dd50: 70 4c 69 6d 69 74 20 61 6e 64 20 70 4f 66 66 73  pLimit and pOffs
dd60: 65 74 2e 20 20 69 4c 69 6d 69 74 20 61 6e 64 0a  et.  iLimit and.
dd70: 2a 2a 20 69 4f 66 66 73 65 74 20 73 68 6f 75 6c  ** iOffset shoul
dd80: 64 20 68 61 76 65 20 62 65 65 6e 20 70 72 65 73  d have been pres
dd90: 65 74 20 74 6f 20 61 70 70 72 6f 70 72 69 61 74  et to appropriat
dda0: 65 20 64 65 66 61 75 6c 74 20 76 61 6c 75 65 73  e default values
ddb0: 0a 2a 2a 20 28 75 73 75 61 6c 6c 79 20 62 75 74  .** (usually but
ddc0: 20 6e 6f 74 20 61 6c 77 61 79 73 20 2d 31 29 20   not always -1) 
ddd0: 70 72 69 6f 72 20 74 6f 20 63 61 6c 6c 69 6e 67  prior to calling
dde0: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 2e 0a 2a   this routine..*
ddf0: 2a 20 4f 6e 6c 79 20 69 66 20 70 4c 69 6d 69 74  * Only if pLimit
de00: 21 3d 30 20 6f 72 20 70 4f 66 66 73 65 74 21 3d  !=0 or pOffset!=
de10: 30 20 64 6f 20 74 68 65 20 6c 69 6d 69 74 20 72  0 do the limit r
de20: 65 67 69 73 74 65 72 73 20 67 65 74 0a 2a 2a 20  egisters get.** 
de30: 72 65 64 65 66 69 6e 65 64 2e 20 20 54 68 65 20  redefined.  The 
de40: 55 4e 49 4f 4e 20 41 4c 4c 20 6f 70 65 72 61 74  UNION ALL operat
de50: 6f 72 20 75 73 65 73 20 74 68 69 73 20 70 72 6f  or uses this pro
de60: 70 65 72 74 79 20 74 6f 20 66 6f 72 63 65 0a 2a  perty to force.*
de70: 2a 20 74 68 65 20 72 65 75 73 65 20 6f 66 20 74  * the reuse of t
de80: 68 65 20 73 61 6d 65 20 6c 69 6d 69 74 20 61 6e  he same limit an
de90: 64 20 6f 66 66 73 65 74 20 72 65 67 69 73 74 65  d offset registe
dea0: 72 73 20 61 63 72 6f 73 73 20 6d 75 6c 74 69 70  rs across multip
deb0: 6c 65 0a 2a 2a 20 53 45 4c 45 43 54 20 73 74 61  le.** SELECT sta
dec0: 74 65 6d 65 6e 74 73 2e 0a 2a 2f 0a 73 74 61 74  tements..*/.stat
ded0: 69 63 20 76 6f 69 64 20 63 6f 6d 70 75 74 65 4c  ic void computeL
dee0: 69 6d 69 74 52 65 67 69 73 74 65 72 73 28 50 61  imitRegisters(Pa
def0: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 53 65 6c  rse *pParse, Sel
df00: 65 63 74 20 2a 70 2c 20 69 6e 74 20 69 42 72 65  ect *p, int iBre
df10: 61 6b 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d  ak){.  Vdbe *v =
df20: 20 30 3b 0a 20 20 69 6e 74 20 69 4c 69 6d 69 74   0;.  int iLimit
df30: 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69 4f 66 66   = 0;.  int iOff
df40: 73 65 74 3b 0a 20 20 69 6e 74 20 61 64 64 72 31  set;.  int addr1
df50: 2c 20 61 64 64 72 32 3b 0a 0a 20 20 2f 2a 20 0a  , addr2;..  /* .
df60: 20 20 2a 2a 20 22 4c 49 4d 49 54 20 2d 31 22 20    ** "LIMIT -1" 
df70: 61 6c 77 61 79 73 20 73 68 6f 77 73 20 61 6c 6c  always shows all
df80: 20 72 6f 77 73 2e 20 20 54 68 65 72 65 20 69 73   rows.  There is
df90: 20 73 6f 6d 65 0a 20 20 2a 2a 20 63 6f 6e 74 72   some.  ** contr
dfa0: 61 76 65 72 73 79 20 61 62 6f 75 74 20 77 68 61  aversy about wha
dfb0: 74 20 74 68 65 20 63 6f 72 72 65 63 74 20 62 65  t the correct be
dfc0: 68 61 76 69 6f 72 20 73 68 6f 75 6c 64 20 62 65  havior should be
dfd0: 2e 0a 20 20 2a 2a 20 54 68 65 20 63 75 72 72 65  ..  ** The curre
dfe0: 6e 74 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  nt implementatio
dff0: 6e 20 69 6e 74 65 72 70 72 65 74 73 20 22 4c 49  n interprets "LI
e000: 4d 49 54 20 30 22 20 74 6f 20 6d 65 61 6e 0a 20  MIT 0" to mean. 
e010: 20 2a 2a 20 6e 6f 20 72 6f 77 73 2e 0a 20 20 2a   ** no rows..  *
e020: 2f 0a 20 20 69 66 28 20 70 2d 3e 70 4c 69 6d 69  /.  if( p->pLimi
e030: 74 20 29 7b 0a 20 20 20 20 70 2d 3e 69 4c 69 6d  t ){.    p->iLim
e040: 69 74 20 3d 20 69 4c 69 6d 69 74 20 3d 20 2b 2b  it = iLimit = ++
e050: 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20  pParse->nMem;.  
e060: 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b 2b    pParse->nMem++
e070: 3b 0a 20 20 20 20 76 20 3d 20 73 71 6c 69 74 65  ;.    v = sqlite
e080: 33 47 65 74 56 64 62 65 28 70 50 61 72 73 65 29  3GetVdbe(pParse)
e090: 3b 0a 20 20 20 20 69 66 28 20 76 3d 3d 30 20 29  ;.    if( v==0 )
e0a0: 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 73 71 6c   return;.    sql
e0b0: 69 74 65 33 45 78 70 72 43 6f 64 65 28 70 50 61  ite3ExprCode(pPa
e0c0: 72 73 65 2c 20 70 2d 3e 70 4c 69 6d 69 74 2c 20  rse, p->pLimit, 
e0d0: 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  0);.    sqlite3V
e0e0: 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
e0f0: 4d 75 73 74 42 65 49 6e 74 2c 20 30 2c 20 30 29  MustBeInt, 0, 0)
e100: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
e110: 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4d 6f  eAddOp2(v, OP_Mo
e120: 76 65 2c 20 30 2c 20 69 4c 69 6d 69 74 29 3b 0a  ve, 0, iLimit);.
e130: 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28      VdbeComment(
e140: 28 76 2c 20 22 4c 49 4d 49 54 20 63 6f 75 6e 74  (v, "LIMIT count
e150: 65 72 22 29 29 3b 0a 20 20 20 20 73 71 6c 69 74  er"));.    sqlit
e160: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
e170: 4f 50 5f 49 66 4d 65 6d 5a 65 72 6f 2c 20 69 4c  OP_IfMemZero, iL
e180: 69 6d 69 74 2c 20 69 42 72 65 61 6b 29 3b 0a 20  imit, iBreak);. 
e190: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
e1a0: 64 4f 70 32 28 76 2c 20 4f 50 5f 53 43 6f 70 79  dOp2(v, OP_SCopy
e1b0: 2c 20 69 4c 69 6d 69 74 2c 20 30 29 3b 0a 20 20  , iLimit, 0);.  
e1c0: 7d 0a 20 20 69 66 28 20 70 2d 3e 70 4f 66 66 73  }.  if( p->pOffs
e1d0: 65 74 20 29 7b 0a 20 20 20 20 70 2d 3e 69 4f 66  et ){.    p->iOf
e1e0: 66 73 65 74 20 3d 20 69 4f 66 66 73 65 74 20 3d  fset = iOffset =
e1f0: 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b   ++pParse->nMem;
e200: 0a 20 20 20 20 76 20 3d 20 73 71 6c 69 74 65 33  .    v = sqlite3
e210: 47 65 74 56 64 62 65 28 70 50 61 72 73 65 29 3b  GetVdbe(pParse);
e220: 0a 20 20 20 20 69 66 28 20 76 3d 3d 30 20 29 20  .    if( v==0 ) 
e230: 72 65 74 75 72 6e 3b 0a 20 20 20 20 73 71 6c 69  return;.    sqli
e240: 74 65 33 45 78 70 72 43 6f 64 65 28 70 50 61 72  te3ExprCode(pPar
e250: 73 65 2c 20 70 2d 3e 70 4f 66 66 73 65 74 2c 20  se, p->pOffset, 
e260: 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  0);.    sqlite3V
e270: 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
e280: 4d 75 73 74 42 65 49 6e 74 2c 20 30 2c 20 30 29  MustBeInt, 0, 0)
e290: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
e2a0: 65 41 64 64 4f 70 32 28 76 2c 20 70 2d 3e 70 4c  eAddOp2(v, p->pL
e2b0: 69 6d 69 74 3d 3d 30 20 3f 20 4f 50 5f 4d 6f 76  imit==0 ? OP_Mov
e2c0: 65 20 3a 20 4f 50 5f 43 6f 70 79 2c 20 30 2c 20  e : OP_Copy, 0, 
e2d0: 69 4f 66 66 73 65 74 29 3b 0a 20 20 20 20 56 64  iOffset);.    Vd
e2e0: 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 4f  beComment((v, "O
e2f0: 46 46 53 45 54 20 63 6f 75 6e 74 65 72 22 29 29  FFSET counter"))
e300: 3b 0a 20 20 20 20 61 64 64 72 31 20 3d 20 73 71  ;.    addr1 = sq
e310: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
e320: 76 2c 20 4f 50 5f 49 66 4d 65 6d 50 6f 73 2c 20  v, OP_IfMemPos, 
e330: 69 4f 66 66 73 65 74 2c 20 30 29 3b 0a 20 20 20  iOffset, 0);.   
e340: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
e350: 70 32 28 76 2c 20 4f 50 5f 50 6f 70 2c 20 31 2c  p2(v, OP_Pop, 1,
e360: 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33   0);.    sqlite3
e370: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
e380: 5f 49 6e 74 65 67 65 72 2c 20 30 2c 20 30 29 3b  _Integer, 0, 0);
e390: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
e3a0: 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72  JumpHere(v, addr
e3b0: 31 29 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 70  1);.    if( p->p
e3c0: 4c 69 6d 69 74 20 29 7b 0a 20 20 20 20 20 20 73  Limit ){.      s
e3d0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
e3e0: 28 76 2c 20 4f 50 5f 41 64 64 2c 20 30 2c 20 30  (v, OP_Add, 0, 0
e3f0: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69  );.    }.  }.  i
e400: 66 28 20 70 2d 3e 70 4c 69 6d 69 74 20 29 7b 0a  f( p->pLimit ){.
e410: 20 20 20 20 61 64 64 72 31 20 3d 20 73 71 6c 69      addr1 = sqli
e420: 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
e430: 20 4f 50 5f 49 66 4d 65 6d 50 6f 73 2c 20 69 4c   OP_IfMemPos, iL
e440: 69 6d 69 74 2c 20 30 29 3b 0a 20 20 20 20 73 71  imit, 0);.    sq
e450: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
e460: 76 2c 20 4f 50 5f 50 6f 70 2c 20 31 2c 20 30 29  v, OP_Pop, 1, 0)
e470: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
e480: 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e  eAddOp2(v, OP_In
e490: 74 65 67 65 72 2c 20 2d 31 2c 20 69 4c 69 6d 69  teger, -1, iLimi
e4a0: 74 2b 31 29 3b 0a 20 20 20 20 61 64 64 72 32 20  t+1);.    addr2 
e4b0: 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  = sqlite3VdbeAdd
e4c0: 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20  Op2(v, OP_Goto, 
e4d0: 30 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74  0, 0);.    sqlit
e4e0: 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76  e3VdbeJumpHere(v
e4f0: 2c 20 61 64 64 72 31 29 3b 0a 20 20 20 20 73 71  , addr1);.    sq
e500: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
e510: 76 2c 20 4f 50 5f 4d 6f 76 65 2c 20 30 2c 20 69  v, OP_Move, 0, i
e520: 4c 69 6d 69 74 2b 31 29 3b 0a 20 20 20 20 56 64  Limit+1);.    Vd
e530: 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 4c  beComment((v, "L
e540: 49 4d 49 54 2b 4f 46 46 53 45 54 22 29 29 3b 0a  IMIT+OFFSET"));.
e550: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a      sqlite3VdbeJ
e560: 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72 32  umpHere(v, addr2
e570: 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  );.  }.}../*.** 
e580: 41 6c 6c 6f 63 61 74 65 20 61 20 76 69 72 74 75  Allocate a virtu
e590: 61 6c 20 69 6e 64 65 78 20 74 6f 20 75 73 65 20  al index to use 
e5a0: 66 6f 72 20 73 6f 72 74 69 6e 67 2e 0a 2a 2f 0a  for sorting..*/.
e5b0: 73 74 61 74 69 63 20 76 6f 69 64 20 63 72 65 61  static void crea
e5c0: 74 65 53 6f 72 74 69 6e 67 49 6e 64 65 78 28 50  teSortingIndex(P
e5d0: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 53 65  arse *pParse, Se
e5e0: 6c 65 63 74 20 2a 70 2c 20 45 78 70 72 4c 69 73  lect *p, ExprLis
e5f0: 74 20 2a 70 4f 72 64 65 72 42 79 29 7b 0a 20 20  t *pOrderBy){.  
e600: 69 66 28 20 70 4f 72 64 65 72 42 79 20 29 7b 0a  if( pOrderBy ){.
e610: 20 20 20 20 69 6e 74 20 61 64 64 72 3b 0a 20 20      int addr;.  
e620: 20 20 61 73 73 65 72 74 28 20 70 4f 72 64 65 72    assert( pOrder
e630: 42 79 2d 3e 69 45 43 75 72 73 6f 72 3d 3d 30 20  By->iECursor==0 
e640: 29 3b 0a 20 20 20 20 70 4f 72 64 65 72 42 79 2d  );.    pOrderBy-
e650: 3e 69 45 43 75 72 73 6f 72 20 3d 20 70 50 61 72  >iECursor = pPar
e660: 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20  se->nTab++;.    
e670: 61 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64  addr = sqlite3Vd
e680: 62 65 41 64 64 4f 70 32 28 70 50 61 72 73 65 2d  beAddOp2(pParse-
e690: 3e 70 56 64 62 65 2c 20 4f 50 5f 4f 70 65 6e 45  >pVdbe, OP_OpenE
e6a0: 70 68 65 6d 65 72 61 6c 2c 0a 20 20 20 20 20 20  phemeral,.      
e6b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e6c0: 20 20 20 20 20 20 70 4f 72 64 65 72 42 79 2d 3e        pOrderBy->
e6d0: 69 45 43 75 72 73 6f 72 2c 20 70 4f 72 64 65 72  iECursor, pOrder
e6e0: 42 79 2d 3e 6e 45 78 70 72 2b 31 29 3b 0a 20 20  By->nExpr+1);.  
e6f0: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 61 64 64    assert( p->add
e700: 72 4f 70 65 6e 45 70 68 6d 5b 32 5d 20 3d 3d 20  rOpenEphm[2] == 
e710: 2d 31 20 29 3b 0a 20 20 20 20 70 2d 3e 61 64 64  -1 );.    p->add
e720: 72 4f 70 65 6e 45 70 68 6d 5b 32 5d 20 3d 20 61  rOpenEphm[2] = a
e730: 64 64 72 3b 0a 20 20 7d 0a 7d 0a 0a 23 69 66 6e  ddr;.  }.}..#ifn
e740: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
e750: 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45 43 54 0a  COMPOUND_SELECT.
e760: 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  /*.** Return the
e770: 20 61 70 70 72 6f 70 72 69 61 74 65 20 63 6f 6c   appropriate col
e780: 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65 20  lating sequence 
e790: 66 6f 72 20 74 68 65 20 69 43 6f 6c 2d 74 68 20  for the iCol-th 
e7a0: 63 6f 6c 75 6d 6e 20 6f 66 0a 2a 2a 20 74 68 65  column of.** the
e7b0: 20 72 65 73 75 6c 74 20 73 65 74 20 66 6f 72 20   result set for 
e7c0: 74 68 65 20 63 6f 6d 70 6f 75 6e 64 2d 73 65 6c  the compound-sel
e7d0: 65 63 74 20 73 74 61 74 65 6d 65 6e 74 20 22 70  ect statement "p
e7e0: 22 2e 20 20 52 65 74 75 72 6e 20 4e 55 4c 4c 20  ".  Return NULL 
e7f0: 69 66 0a 2a 2a 20 74 68 65 20 63 6f 6c 75 6d 6e  if.** the column
e800: 20 68 61 73 20 6e 6f 20 64 65 66 61 75 6c 74 20   has no default 
e810: 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e  collating sequen
e820: 63 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 6f  ce..**.** The co
e830: 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65  llating sequence
e840: 20 66 6f 72 20 74 68 65 20 63 6f 6d 70 6f 75 6e   for the compoun
e850: 64 20 73 65 6c 65 63 74 20 69 73 20 74 61 6b 65  d select is take
e860: 6e 20 66 72 6f 6d 20 74 68 65 0a 2a 2a 20 6c 65  n from the.** le
e870: 66 74 2d 6d 6f 73 74 20 74 65 72 6d 20 6f 66 20  ft-most term of 
e880: 74 68 65 20 73 65 6c 65 63 74 20 74 68 61 74 20  the select that 
e890: 68 61 73 20 61 20 63 6f 6c 6c 61 74 69 6e 67 20  has a collating 
e8a0: 73 65 71 75 65 6e 63 65 2e 0a 2a 2f 0a 73 74 61  sequence..*/.sta
e8b0: 74 69 63 20 43 6f 6c 6c 53 65 71 20 2a 6d 75 6c  tic CollSeq *mul
e8c0: 74 69 53 65 6c 65 63 74 43 6f 6c 6c 53 65 71 28  tiSelectCollSeq(
e8d0: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 53  Parse *pParse, S
e8e0: 65 6c 65 63 74 20 2a 70 2c 20 69 6e 74 20 69 43  elect *p, int iC
e8f0: 6f 6c 29 7b 0a 20 20 43 6f 6c 6c 53 65 71 20 2a  ol){.  CollSeq *
e900: 70 52 65 74 3b 0a 20 20 69 66 28 20 70 2d 3e 70  pRet;.  if( p->p
e910: 50 72 69 6f 72 20 29 7b 0a 20 20 20 20 70 52 65  Prior ){.    pRe
e920: 74 20 3d 20 6d 75 6c 74 69 53 65 6c 65 63 74 43  t = multiSelectC
e930: 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70  ollSeq(pParse, p
e940: 2d 3e 70 50 72 69 6f 72 2c 20 69 43 6f 6c 29 3b  ->pPrior, iCol);
e950: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 52  .  }else{.    pR
e960: 65 74 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 69 66  et = 0;.  }.  if
e970: 28 20 70 52 65 74 3d 3d 30 20 29 7b 0a 20 20 20  ( pRet==0 ){.   
e980: 20 70 52 65 74 20 3d 20 73 71 6c 69 74 65 33 45   pRet = sqlite3E
e990: 78 70 72 43 6f 6c 6c 53 65 71 28 70 50 61 72 73  xprCollSeq(pPars
e9a0: 65 2c 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b  e, p->pEList->a[
e9b0: 69 43 6f 6c 5d 2e 70 45 78 70 72 29 3b 0a 20 20  iCol].pExpr);.  
e9c0: 7d 0a 20 20 72 65 74 75 72 6e 20 70 52 65 74 3b  }.  return pRet;
e9d0: 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c  .}.#endif /* SQL
e9e0: 49 54 45 5f 4f 4d 49 54 5f 43 4f 4d 50 4f 55 4e  ITE_OMIT_COMPOUN
e9f0: 44 5f 53 45 4c 45 43 54 20 2a 2f 0a 0a 23 69 66  D_SELECT */..#if
ea00: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
ea10: 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45 43 54  _COMPOUND_SELECT
ea20: 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
ea30: 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 74 6f  ine is called to
ea40: 20 70 72 6f 63 65 73 73 20 61 20 71 75 65 72 79   process a query
ea50: 20 74 68 61 74 20 69 73 20 72 65 61 6c 6c 79 20   that is really 
ea60: 74 68 65 20 75 6e 69 6f 6e 0a 2a 2a 20 6f 72 20  the union.** or 
ea70: 69 6e 74 65 72 73 65 63 74 69 6f 6e 20 6f 66 20  intersection of 
ea80: 74 77 6f 20 6f 72 20 6d 6f 72 65 20 73 65 70 61  two or more sepa
ea90: 72 61 74 65 20 71 75 65 72 69 65 73 2e 0a 2a 2a  rate queries..**
eaa0: 0a 2a 2a 20 22 70 22 20 70 6f 69 6e 74 73 20 74  .** "p" points t
eab0: 6f 20 74 68 65 20 72 69 67 68 74 2d 6d 6f 73 74  o the right-most
eac0: 20 6f 66 20 74 68 65 20 74 77 6f 20 71 75 65 72   of the two quer
ead0: 69 65 73 2e 20 20 74 68 65 20 71 75 65 72 79 20  ies.  the query 
eae0: 6f 6e 20 74 68 65 0a 2a 2a 20 6c 65 66 74 20 69  on the.** left i
eaf0: 73 20 70 2d 3e 70 50 72 69 6f 72 2e 20 20 54 68  s p->pPrior.  Th
eb00: 65 20 6c 65 66 74 20 71 75 65 72 79 20 63 6f 75  e left query cou
eb10: 6c 64 20 61 6c 73 6f 20 62 65 20 61 20 63 6f 6d  ld also be a com
eb20: 70 6f 75 6e 64 20 71 75 65 72 79 0a 2a 2a 20 69  pound query.** i
eb30: 6e 20 77 68 69 63 68 20 63 61 73 65 20 74 68 69  n which case thi
eb40: 73 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 62  s routine will b
eb50: 65 20 63 61 6c 6c 65 64 20 72 65 63 75 72 73 69  e called recursi
eb60: 76 65 6c 79 2e 20 0a 2a 2a 0a 2a 2a 20 54 68 65  vely. .**.** The
eb70: 20 72 65 73 75 6c 74 73 20 6f 66 20 74 68 65 20   results of the 
eb80: 74 6f 74 61 6c 20 71 75 65 72 79 20 61 72 65 20  total query are 
eb90: 74 6f 20 62 65 20 77 72 69 74 74 65 6e 20 69 6e  to be written in
eba0: 74 6f 20 61 20 64 65 73 74 69 6e 61 74 69 6f 6e  to a destination
ebb0: 0a 2a 2a 20 6f 66 20 74 79 70 65 20 65 44 65 73  .** of type eDes
ebc0: 74 20 77 69 74 68 20 70 61 72 61 6d 65 74 65 72  t with parameter
ebd0: 20 69 50 61 72 6d 2e 0a 2a 2a 0a 2a 2a 20 45 78   iParm..**.** Ex
ebe0: 61 6d 70 6c 65 20 31 3a 20 20 43 6f 6e 73 69 64  ample 1:  Consid
ebf0: 65 72 20 61 20 74 68 72 65 65 2d 77 61 79 20 63  er a three-way c
ec00: 6f 6d 70 6f 75 6e 64 20 53 51 4c 20 73 74 61 74  ompound SQL stat
ec10: 65 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 20 20 20  ement..**.**    
ec20: 20 53 45 4c 45 43 54 20 61 20 46 52 4f 4d 20 74   SELECT a FROM t
ec30: 31 20 55 4e 49 4f 4e 20 53 45 4c 45 43 54 20 62  1 UNION SELECT b
ec40: 20 46 52 4f 4d 20 74 32 20 55 4e 49 4f 4e 20 53   FROM t2 UNION S
ec50: 45 4c 45 43 54 20 63 20 46 52 4f 4d 20 74 33 0a  ELECT c FROM t3.
ec60: 2a 2a 0a 2a 2a 20 54 68 69 73 20 73 74 61 74 65  **.** This state
ec70: 6d 65 6e 74 20 69 73 20 70 61 72 73 65 64 20 75  ment is parsed u
ec80: 70 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a  p as follows:.**
ec90: 0a 2a 2a 20 20 20 20 20 53 45 4c 45 43 54 20 63  .**     SELECT c
eca0: 20 46 52 4f 4d 20 74 33 0a 2a 2a 20 20 20 20 20   FROM t3.**     
ecb0: 20 7c 0a 2a 2a 20 20 20 20 20 20 60 2d 2d 2d 2d   |.**      `----
ecc0: 2d 3e 20 20 53 45 4c 45 43 54 20 62 20 46 52 4f  ->  SELECT b FRO
ecd0: 4d 20 74 32 0a 2a 2a 20 20 20 20 20 20 20 20 20  M t2.**         
ece0: 20 20 20 20 20 20 20 7c 0a 2a 2a 20 20 20 20 20         |.**     
ecf0: 20 20 20 20 20 20 20 20 20 20 20 60 2d 2d 2d 2d             `----
ed00: 2d 2d 3e 20 20 53 45 4c 45 43 54 20 61 20 46 52  -->  SELECT a FR
ed10: 4f 4d 20 74 31 0a 2a 2a 0a 2a 2a 20 54 68 65 20  OM t1.**.** The 
ed20: 61 72 72 6f 77 73 20 69 6e 20 74 68 65 20 64 69  arrows in the di
ed30: 61 67 72 61 6d 20 61 62 6f 76 65 20 72 65 70 72  agram above repr
ed40: 65 73 65 6e 74 20 74 68 65 20 53 65 6c 65 63 74  esent the Select
ed50: 2e 70 50 72 69 6f 72 20 70 6f 69 6e 74 65 72 2e  .pPrior pointer.
ed60: 0a 2a 2a 20 53 6f 20 69 66 20 74 68 69 73 20 72  .** So if this r
ed70: 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64  outine is called
ed80: 20 77 69 74 68 20 70 20 65 71 75 61 6c 20 74 6f   with p equal to
ed90: 20 74 68 65 20 74 33 20 71 75 65 72 79 2c 20 74   the t3 query, t
eda0: 68 65 6e 0a 2a 2a 20 70 50 72 69 6f 72 20 77 69  hen.** pPrior wi
edb0: 6c 6c 20 62 65 20 74 68 65 20 74 32 20 71 75 65  ll be the t2 que
edc0: 72 79 2e 20 20 70 2d 3e 6f 70 20 77 69 6c 6c 20  ry.  p->op will 
edd0: 62 65 20 54 4b 5f 55 4e 49 4f 4e 20 69 6e 20 74  be TK_UNION in t
ede0: 68 69 73 20 63 61 73 65 2e 0a 2a 2a 0a 2a 2a 20  his case..**.** 
edf0: 4e 6f 74 69 63 65 20 74 68 61 74 20 62 65 63 61  Notice that beca
ee00: 75 73 65 20 6f 66 20 74 68 65 20 77 61 79 20 53  use of the way S
ee10: 51 4c 69 74 65 20 70 61 72 73 65 73 20 63 6f 6d  QLite parses com
ee20: 70 6f 75 6e 64 20 53 45 4c 45 43 54 73 2c 20 74  pound SELECTs, t
ee30: 68 65 0a 2a 2a 20 69 6e 64 69 76 69 64 75 61 6c  he.** individual
ee40: 20 73 65 6c 65 63 74 73 20 61 6c 77 61 79 73 20   selects always 
ee50: 67 72 6f 75 70 20 66 72 6f 6d 20 6c 65 66 74 20  group from left 
ee60: 74 6f 20 72 69 67 68 74 2e 0a 2a 2f 0a 73 74 61  to right..*/.sta
ee70: 74 69 63 20 69 6e 74 20 6d 75 6c 74 69 53 65 6c  tic int multiSel
ee80: 65 63 74 28 0a 20 20 50 61 72 73 65 20 2a 70 50  ect(.  Parse *pP
ee90: 61 72 73 65 2c 20 20 20 20 20 20 20 20 2f 2a 20  arse,        /* 
eea0: 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20  Parsing context 
eeb0: 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 2c 20  */.  Select *p, 
eec0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
eed0: 65 20 72 69 67 68 74 2d 6d 6f 73 74 20 6f 66 20  e right-most of 
eee0: 53 45 4c 45 43 54 73 20 74 6f 20 62 65 20 63 6f  SELECTs to be co
eef0: 64 65 64 20 2a 2f 0a 20 20 53 65 6c 65 63 74 44  ded */.  SelectD
ef00: 65 73 74 20 2a 70 44 65 73 74 2c 20 20 20 20 2f  est *pDest,    /
ef10: 2a 20 57 68 61 74 20 74 6f 20 64 6f 20 77 69 74  * What to do wit
ef20: 68 20 71 75 65 72 79 20 72 65 73 75 6c 74 73 20  h query results 
ef30: 2a 2f 0a 20 20 63 68 61 72 20 2a 61 66 66 20 20  */.  char *aff  
ef40: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66             /* If
ef50: 20 65 44 65 73 74 20 69 73 20 53 52 54 5f 55 6e   eDest is SRT_Un
ef60: 69 6f 6e 2c 20 74 68 65 20 61 66 66 69 6e 69 74  ion, the affinit
ef70: 79 20 73 74 72 69 6e 67 20 2a 2f 0a 29 7b 0a 20  y string */.){. 
ef80: 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
ef90: 5f 4f 4b 3b 20 20 20 2f 2a 20 53 75 63 63 65 73  _OK;   /* Succes
efa0: 73 20 63 6f 64 65 20 66 72 6f 6d 20 61 20 73 75  s code from a su
efb0: 62 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 53 65  broutine */.  Se
efc0: 6c 65 63 74 20 2a 70 50 72 69 6f 72 3b 20 20 20  lect *pPrior;   
efd0: 20 20 20 20 2f 2a 20 41 6e 6f 74 68 65 72 20 53      /* Another S
efe0: 45 4c 45 43 54 20 69 6d 6d 65 64 69 61 74 65 6c  ELECT immediatel
eff0: 79 20 74 6f 20 6f 75 72 20 6c 65 66 74 20 2a 2f  y to our left */
f000: 0a 20 20 56 64 62 65 20 2a 76 3b 20 20 20 20 20  .  Vdbe *v;     
f010: 20 20 20 20 20 20 20 20 20 2f 2a 20 47 65 6e 65           /* Gene
f020: 72 61 74 65 20 63 6f 64 65 20 74 6f 20 74 68 69  rate code to thi
f030: 73 20 56 44 42 45 20 2a 2f 0a 20 20 69 6e 74 20  s VDBE */.  int 
f040: 6e 43 6f 6c 3b 20 20 20 20 20 20 20 20 20 20 20  nCol;           
f050: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63    /* Number of c
f060: 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20 72 65  olumns in the re
f070: 73 75 6c 74 20 73 65 74 20 2a 2f 0a 20 20 45 78  sult set */.  Ex
f080: 70 72 4c 69 73 74 20 2a 70 4f 72 64 65 72 42 79  prList *pOrderBy
f090: 3b 20 20 20 2f 2a 20 54 68 65 20 4f 52 44 45 52  ;   /* The ORDER
f0a0: 20 42 59 20 63 6c 61 75 73 65 20 6f 6e 20 70 20   BY clause on p 
f0b0: 2a 2f 0a 20 20 69 6e 74 20 61 53 65 74 50 32 5b  */.  int aSetP2[
f0c0: 32 5d 3b 20 20 20 20 20 20 20 20 2f 2a 20 53 65  2];        /* Se
f0d0: 74 20 50 32 20 76 61 6c 75 65 20 6f 66 20 74 68  t P2 value of th
f0e0: 65 73 65 20 6f 70 20 74 6f 20 6e 75 6d 62 65 72  ese op to number
f0f0: 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 2a 2f 0a 20   of columns */. 
f100: 20 69 6e 74 20 6e 53 65 74 50 32 20 3d 20 30 3b   int nSetP2 = 0;
f110: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
f120: 20 6f 66 20 73 6c 6f 74 73 20 69 6e 20 61 53 65   of slots in aSe
f130: 74 50 32 5b 5d 20 75 73 65 64 20 2a 2f 0a 0a 20  tP2[] used */.. 
f140: 20 53 65 6c 65 63 74 44 65 73 74 20 64 65 73 74   SelectDest dest
f150: 3b 0a 20 20 64 65 73 74 2e 65 44 65 73 74 20 3d  ;.  dest.eDest =
f160: 20 70 44 65 73 74 2d 3e 65 44 65 73 74 3b 0a 20   pDest->eDest;. 
f170: 20 64 65 73 74 2e 69 50 61 72 6d 20 3d 20 70 44   dest.iParm = pD
f180: 65 73 74 2d 3e 69 50 61 72 6d 3b 0a 20 20 64 65  est->iParm;.  de
f190: 73 74 2e 61 66 66 69 6e 69 74 79 20 3d 20 70 44  st.affinity = pD
f1a0: 65 73 74 2d 3e 61 66 66 69 6e 69 74 79 3b 0a 0a  est->affinity;..
f1b0: 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 74    /* Make sure t
f1c0: 68 65 72 65 20 69 73 20 6e 6f 20 4f 52 44 45 52  here is no ORDER
f1d0: 20 42 59 20 6f 72 20 4c 49 4d 49 54 20 63 6c 61   BY or LIMIT cla
f1e0: 75 73 65 20 6f 6e 20 70 72 69 6f 72 20 53 45 4c  use on prior SEL
f1f0: 45 43 54 73 2e 20 20 4f 6e 6c 79 0a 20 20 2a 2a  ECTs.  Only.  **
f200: 20 74 68 65 20 6c 61 73 74 20 28 72 69 67 68 74   the last (right
f210: 2d 6d 6f 73 74 29 20 53 45 4c 45 43 54 20 69 6e  -most) SELECT in
f220: 20 74 68 65 20 73 65 72 69 65 73 20 6d 61 79 20   the series may 
f230: 68 61 76 65 20 61 6e 20 4f 52 44 45 52 20 42 59  have an ORDER BY
f240: 20 6f 72 20 4c 49 4d 49 54 2e 0a 20 20 2a 2f 0a   or LIMIT..  */.
f250: 20 20 69 66 28 20 70 3d 3d 30 20 7c 7c 20 70 2d    if( p==0 || p-
f260: 3e 70 50 72 69 6f 72 3d 3d 30 20 29 7b 0a 20 20  >pPrior==0 ){.  
f270: 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 67 6f    rc = 1;.    go
f280: 74 6f 20 6d 75 6c 74 69 5f 73 65 6c 65 63 74 5f  to multi_select_
f290: 65 6e 64 3b 0a 20 20 7d 0a 20 20 70 50 72 69 6f  end;.  }.  pPrio
f2a0: 72 20 3d 20 70 2d 3e 70 50 72 69 6f 72 3b 0a 20  r = p->pPrior;. 
f2b0: 20 61 73 73 65 72 74 28 20 70 50 72 69 6f 72 2d   assert( pPrior-
f2c0: 3e 70 52 69 67 68 74 6d 6f 73 74 21 3d 70 50 72  >pRightmost!=pPr
f2d0: 69 6f 72 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ior );.  assert(
f2e0: 20 70 50 72 69 6f 72 2d 3e 70 52 69 67 68 74 6d   pPrior->pRightm
f2f0: 6f 73 74 3d 3d 70 2d 3e 70 52 69 67 68 74 6d 6f  ost==p->pRightmo
f300: 73 74 20 29 3b 0a 20 20 69 66 28 20 70 50 72 69  st );.  if( pPri
f310: 6f 72 2d 3e 70 4f 72 64 65 72 42 79 20 29 7b 0a  or->pOrderBy ){.
f320: 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
f330: 4d 73 67 28 70 50 61 72 73 65 2c 22 4f 52 44 45  Msg(pParse,"ORDE
f340: 52 20 42 59 20 63 6c 61 75 73 65 20 73 68 6f 75  R BY clause shou
f350: 6c 64 20 63 6f 6d 65 20 61 66 74 65 72 20 25 73  ld come after %s
f360: 20 6e 6f 74 20 62 65 66 6f 72 65 22 2c 0a 20 20   not before",.  
f370: 20 20 20 20 73 65 6c 65 63 74 4f 70 4e 61 6d 65      selectOpName
f380: 28 70 2d 3e 6f 70 29 29 3b 0a 20 20 20 20 72 63  (p->op));.    rc
f390: 20 3d 20 31 3b 0a 20 20 20 20 67 6f 74 6f 20 6d   = 1;.    goto m
f3a0: 75 6c 74 69 5f 73 65 6c 65 63 74 5f 65 6e 64 3b  ulti_select_end;
f3b0: 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 72 69 6f  .  }.  if( pPrio
f3c0: 72 2d 3e 70 4c 69 6d 69 74 20 29 7b 0a 20 20 20  r->pLimit ){.   
f3d0: 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
f3e0: 28 70 50 61 72 73 65 2c 22 4c 49 4d 49 54 20 63  (pParse,"LIMIT c
f3f0: 6c 61 75 73 65 20 73 68 6f 75 6c 64 20 63 6f 6d  lause should com
f400: 65 20 61 66 74 65 72 20 25 73 20 6e 6f 74 20 62  e after %s not b
f410: 65 66 6f 72 65 22 2c 0a 20 20 20 20 20 20 73 65  efore",.      se
f420: 6c 65 63 74 4f 70 4e 61 6d 65 28 70 2d 3e 6f 70  lectOpName(p->op
f430: 29 29 3b 0a 20 20 20 20 72 63 20 3d 20 31 3b 0a  ));.    rc = 1;.
f440: 20 20 20 20 67 6f 74 6f 20 6d 75 6c 74 69 5f 73      goto multi_s
f450: 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 7d 0a 0a  elect_end;.  }..
f460: 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 77    /* Make sure w
f470: 65 20 68 61 76 65 20 61 20 76 61 6c 69 64 20 71  e have a valid q
f480: 75 65 72 79 20 65 6e 67 69 6e 65 2e 20 20 49 66  uery engine.  If
f490: 20 6e 6f 74 2c 20 63 72 65 61 74 65 20 61 20 6e   not, create a n
f4a0: 65 77 20 6f 6e 65 2e 0a 20 20 2a 2f 0a 20 20 76  ew one..  */.  v
f4b0: 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64 62   = sqlite3GetVdb
f4c0: 65 28 70 50 61 72 73 65 29 3b 0a 20 20 69 66 28  e(pParse);.  if(
f4d0: 20 76 3d 3d 30 20 29 7b 0a 20 20 20 20 72 63 20   v==0 ){.    rc 
f4e0: 3d 20 31 3b 0a 20 20 20 20 67 6f 74 6f 20 6d 75  = 1;.    goto mu
f4f0: 6c 74 69 5f 73 65 6c 65 63 74 5f 65 6e 64 3b 0a  lti_select_end;.
f500: 20 20 7d 0a 0a 20 20 2f 2a 20 43 72 65 61 74 65    }..  /* Create
f510: 20 74 68 65 20 64 65 73 74 69 6e 61 74 69 6f 6e   the destination
f520: 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65   temporary table
f530: 20 69 66 20 6e 65 63 65 73 73 61 72 79 0a 20 20   if necessary.  
f540: 2a 2f 0a 20 20 69 66 28 20 64 65 73 74 2e 65 44  */.  if( dest.eD
f550: 65 73 74 3d 3d 53 52 54 5f 45 70 68 65 6d 54 61  est==SRT_EphemTa
f560: 62 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  b ){.    assert(
f570: 20 70 2d 3e 70 45 4c 69 73 74 20 29 3b 0a 20 20   p->pEList );.  
f580: 20 20 61 73 73 65 72 74 28 20 6e 53 65 74 50 32    assert( nSetP2
f590: 3c 73 69 7a 65 6f 66 28 61 53 65 74 50 32 29 2f  <sizeof(aSetP2)/
f5a0: 73 69 7a 65 6f 66 28 61 53 65 74 50 32 5b 30 5d  sizeof(aSetP2[0]
f5b0: 29 20 29 3b 0a 20 20 20 20 61 53 65 74 50 32 5b  ) );.    aSetP2[
f5c0: 6e 53 65 74 50 32 2b 2b 5d 20 3d 20 73 71 6c 69  nSetP2++] = sqli
f5d0: 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
f5e0: 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61   OP_OpenEphemera
f5f0: 6c 2c 20 64 65 73 74 2e 69 50 61 72 6d 2c 20 30  l, dest.iParm, 0
f600: 29 3b 0a 20 20 20 20 64 65 73 74 2e 65 44 65 73  );.    dest.eDes
f610: 74 20 3d 20 53 52 54 5f 54 61 62 6c 65 3b 0a 20  t = SRT_Table;. 
f620: 20 7d 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74   }..  /* Generat
f630: 65 20 63 6f 64 65 20 66 6f 72 20 74 68 65 20 6c  e code for the l
f640: 65 66 74 20 61 6e 64 20 72 69 67 68 74 20 53 45  eft and right SE
f650: 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 73 2e  LECT statements.
f660: 0a 20 20 2a 2f 0a 20 20 70 4f 72 64 65 72 42 79  .  */.  pOrderBy
f670: 20 3d 20 70 2d 3e 70 4f 72 64 65 72 42 79 3b 0a   = p->pOrderBy;.
f680: 20 20 73 77 69 74 63 68 28 20 70 2d 3e 6f 70 20    switch( p->op 
f690: 29 7b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 41  ){.    case TK_A
f6a0: 4c 4c 3a 20 7b 0a 20 20 20 20 20 20 69 66 28 20  LL: {.      if( 
f6b0: 70 4f 72 64 65 72 42 79 3d 3d 30 20 29 7b 0a 20  pOrderBy==0 ){. 
f6c0: 20 20 20 20 20 20 20 69 6e 74 20 61 64 64 72 20         int addr 
f6d0: 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 61 73 73  = 0;.        ass
f6e0: 65 72 74 28 20 21 70 50 72 69 6f 72 2d 3e 70 4c  ert( !pPrior->pL
f6f0: 69 6d 69 74 20 29 3b 0a 20 20 20 20 20 20 20 20  imit );.        
f700: 70 50 72 69 6f 72 2d 3e 70 4c 69 6d 69 74 20 3d  pPrior->pLimit =
f710: 20 70 2d 3e 70 4c 69 6d 69 74 3b 0a 20 20 20 20   p->pLimit;.    
f720: 20 20 20 20 70 50 72 69 6f 72 2d 3e 70 4f 66 66      pPrior->pOff
f730: 73 65 74 20 3d 20 70 2d 3e 70 4f 66 66 73 65 74  set = p->pOffset
f740: 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73  ;.        rc = s
f750: 71 6c 69 74 65 33 53 65 6c 65 63 74 28 70 50 61  qlite3Select(pPa
f760: 72 73 65 2c 20 70 50 72 69 6f 72 2c 20 26 64 65  rse, pPrior, &de
f770: 73 74 2c 20 30 2c 20 30 2c 20 30 2c 20 61 66 66  st, 0, 0, 0, aff
f780: 29 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 70 4c  );.        p->pL
f790: 69 6d 69 74 20 3d 20 30 3b 0a 20 20 20 20 20 20  imit = 0;.      
f7a0: 20 20 70 2d 3e 70 4f 66 66 73 65 74 20 3d 20 30    p->pOffset = 0
f7b0: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63  ;.        if( rc
f7c0: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 67 6f   ){.          go
f7d0: 74 6f 20 6d 75 6c 74 69 5f 73 65 6c 65 63 74 5f  to multi_select_
f7e0: 65 6e 64 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  end;.        }. 
f7f0: 20 20 20 20 20 20 20 70 2d 3e 70 50 72 69 6f 72         p->pPrior
f800: 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 70 2d   = 0;.        p-
f810: 3e 69 4c 69 6d 69 74 20 3d 20 70 50 72 69 6f 72  >iLimit = pPrior
f820: 2d 3e 69 4c 69 6d 69 74 3b 0a 20 20 20 20 20 20  ->iLimit;.      
f830: 20 20 70 2d 3e 69 4f 66 66 73 65 74 20 3d 20 70    p->iOffset = p
f840: 50 72 69 6f 72 2d 3e 69 4f 66 66 73 65 74 3b 0a  Prior->iOffset;.
f850: 20 20 20 20 20 20 20 20 69 66 28 20 70 2d 3e 69          if( p->i
f860: 4c 69 6d 69 74 3e 3d 30 20 29 7b 0a 20 20 20 20  Limit>=0 ){.    
f870: 20 20 20 20 20 20 61 64 64 72 20 3d 20 73 71 6c        addr = sql
f880: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
f890: 2c 20 4f 50 5f 49 66 4d 65 6d 5a 65 72 6f 2c 20  , OP_IfMemZero, 
f8a0: 70 2d 3e 69 4c 69 6d 69 74 2c 20 30 29 3b 0a 20  p->iLimit, 0);. 
f8b0: 20 20 20 20 20 20 20 20 20 56 64 62 65 43 6f 6d           VdbeCom
f8c0: 6d 65 6e 74 28 28 76 2c 20 22 4a 75 6d 70 20 61  ment((v, "Jump a
f8d0: 68 65 61 64 20 69 66 20 4c 49 4d 49 54 20 72 65  head if LIMIT re
f8e0: 61 63 68 65 64 22 29 29 3b 0a 20 20 20 20 20 20  ached"));.      
f8f0: 20 20 7d 0a 20 20 20 20 20 20 20 20 72 63 20 3d    }.        rc =
f900: 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28 70   sqlite3Select(p
f910: 50 61 72 73 65 2c 20 70 2c 20 26 64 65 73 74 2c  Parse, p, &dest,
f920: 20 30 2c 20 30 2c 20 30 2c 20 61 66 66 29 3b 0a   0, 0, 0, aff);.
f930: 20 20 20 20 20 20 20 20 70 2d 3e 70 50 72 69 6f          p->pPrio
f940: 72 20 3d 20 70 50 72 69 6f 72 3b 0a 20 20 20 20  r = pPrior;.    
f950: 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20      if( rc ){.  
f960: 20 20 20 20 20 20 20 20 67 6f 74 6f 20 6d 75 6c          goto mul
f970: 74 69 5f 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20  ti_select_end;. 
f980: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
f990: 20 69 66 28 20 61 64 64 72 20 29 7b 0a 20 20 20   if( addr ){.   
f9a0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
f9b0: 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64  beJumpHere(v, ad
f9c0: 64 72 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  dr);.        }. 
f9d0: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
f9e0: 20 20 20 20 7d 0a 20 20 20 20 20 20 2f 2a 20 46      }.      /* F
f9f0: 6f 72 20 55 4e 49 4f 4e 20 41 4c 4c 20 2e 2e 2e  or UNION ALL ...
fa00: 20 4f 52 44 45 52 20 42 59 20 66 61 6c 6c 20 74   ORDER BY fall t
fa10: 68 72 6f 75 67 68 20 74 6f 20 74 68 65 20 6e 65  hrough to the ne
fa20: 78 74 20 63 61 73 65 20 2a 2f 0a 20 20 20 20 7d  xt case */.    }
fa30: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 45 58 43  .    case TK_EXC
fa40: 45 50 54 3a 0a 20 20 20 20 63 61 73 65 20 54 4b  EPT:.    case TK
fa50: 5f 55 4e 49 4f 4e 3a 20 7b 0a 20 20 20 20 20 20  _UNION: {.      
fa60: 69 6e 74 20 75 6e 69 6f 6e 54 61 62 3b 20 20 20  int unionTab;   
fa70: 20 2f 2a 20 43 75 72 73 6f 72 20 6e 75 6d 62 65   /* Cursor numbe
fa80: 72 20 6f 66 20 74 68 65 20 74 65 6d 70 6f 72 61  r of the tempora
fa90: 72 79 20 74 61 62 6c 65 20 68 6f 6c 64 69 6e 67  ry table holding
faa0: 20 72 65 73 75 6c 74 20 2a 2f 0a 20 20 20 20 20   result */.     
fab0: 20 69 6e 74 20 6f 70 20 3d 20 30 3b 20 20 20 20   int op = 0;    
fac0: 20 20 2f 2a 20 4f 6e 65 20 6f 66 20 74 68 65 20    /* One of the 
fad0: 53 52 54 5f 20 6f 70 65 72 61 74 69 6f 6e 73 20  SRT_ operations 
fae0: 74 6f 20 61 70 70 6c 79 20 74 6f 20 73 65 6c 66  to apply to self
faf0: 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 70 72   */.      int pr
fb00: 69 6f 72 4f 70 3b 20 20 20 20 20 2f 2a 20 54 68  iorOp;     /* Th
fb10: 65 20 53 52 54 5f 20 6f 70 65 72 61 74 69 6f 6e  e SRT_ operation
fb20: 20 74 6f 20 61 70 70 6c 79 20 74 6f 20 70 72 69   to apply to pri
fb30: 6f 72 20 73 65 6c 65 63 74 73 20 2a 2f 0a 20 20  or selects */.  
fb40: 20 20 20 20 45 78 70 72 20 2a 70 4c 69 6d 69 74      Expr *pLimit
fb50: 2c 20 2a 70 4f 66 66 73 65 74 3b 20 2f 2a 20 53  , *pOffset; /* S
fb60: 61 76 65 64 20 76 61 6c 75 65 73 20 6f 66 20 70  aved values of p
fb70: 2d 3e 6e 4c 69 6d 69 74 20 61 6e 64 20 70 2d 3e  ->nLimit and p->
fb80: 6e 4f 66 66 73 65 74 20 2a 2f 0a 20 20 20 20 20  nOffset */.     
fb90: 20 69 6e 74 20 61 64 64 72 3b 0a 20 20 20 20 20   int addr;.     
fba0: 20 53 65 6c 65 63 74 44 65 73 74 20 75 6e 69 6f   SelectDest unio
fbb0: 6e 64 65 73 74 3b 0a 0a 20 20 20 20 20 20 70 72  ndest;..      pr
fbc0: 69 6f 72 4f 70 20 3d 20 70 2d 3e 6f 70 3d 3d 54  iorOp = p->op==T
fbd0: 4b 5f 41 4c 4c 20 3f 20 53 52 54 5f 54 61 62 6c  K_ALL ? SRT_Tabl
fbe0: 65 20 3a 20 53 52 54 5f 55 6e 69 6f 6e 3b 0a 20  e : SRT_Union;. 
fbf0: 20 20 20 20 20 69 66 28 20 64 65 73 74 2e 65 44       if( dest.eD
fc00: 65 73 74 3d 3d 70 72 69 6f 72 4f 70 20 26 26 20  est==priorOp && 
fc10: 70 4f 72 64 65 72 42 79 3d 3d 30 20 26 26 20 21  pOrderBy==0 && !
fc20: 70 2d 3e 70 4c 69 6d 69 74 20 26 26 20 21 70 2d  p->pLimit && !p-
fc30: 3e 70 4f 66 66 73 65 74 20 29 7b 0a 20 20 20 20  >pOffset ){.    
fc40: 20 20 20 20 2f 2a 20 57 65 20 63 61 6e 20 72 65      /* We can re
fc50: 75 73 65 20 61 20 74 65 6d 70 6f 72 61 72 79 20  use a temporary 
fc60: 74 61 62 6c 65 20 67 65 6e 65 72 61 74 65 64 20  table generated 
fc70: 62 79 20 61 20 53 45 4c 45 43 54 20 74 6f 20 6f  by a SELECT to o
fc80: 75 72 0a 20 20 20 20 20 20 20 20 2a 2a 20 72 69  ur.        ** ri
fc90: 67 68 74 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a  ght..        */.
fca0: 20 20 20 20 20 20 20 20 75 6e 69 6f 6e 54 61 62          unionTab
fcb0: 20 3d 20 64 65 73 74 2e 69 50 61 72 6d 3b 0a 20   = dest.iParm;. 
fcc0: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
fcd0: 20 20 20 20 2f 2a 20 57 65 20 77 69 6c 6c 20 6e      /* We will n
fce0: 65 65 64 20 74 6f 20 63 72 65 61 74 65 20 6f 75  eed to create ou
fcf0: 72 20 6f 77 6e 20 74 65 6d 70 6f 72 61 72 79 20  r own temporary 
fd00: 74 61 62 6c 65 20 74 6f 20 68 6f 6c 64 20 74 68  table to hold th
fd10: 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 69 6e 74  e.        ** int
fd20: 65 72 6d 65 64 69 61 74 65 20 72 65 73 75 6c 74  ermediate result
fd30: 73 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  s..        */.  
fd40: 20 20 20 20 20 20 75 6e 69 6f 6e 54 61 62 20 3d        unionTab =
fd50: 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b   pParse->nTab++;
fd60: 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 72 6f  .        if( pro
fd70: 63 65 73 73 43 6f 6d 70 6f 75 6e 64 4f 72 64 65  cessCompoundOrde
fd80: 72 42 79 28 70 50 61 72 73 65 2c 20 70 2c 20 75  rBy(pParse, p, u
fd90: 6e 69 6f 6e 54 61 62 29 20 29 7b 0a 20 20 20 20  nionTab) ){.    
fda0: 20 20 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20        rc = 1;.  
fdb0: 20 20 20 20 20 20 20 20 67 6f 74 6f 20 6d 75 6c          goto mul
fdc0: 74 69 5f 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20  ti_select_end;. 
fdd0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
fde0: 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56   addr = sqlite3V
fdf0: 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
fe00: 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 2c 20 75  OpenEphemeral, u
fe10: 6e 69 6f 6e 54 61 62 2c 20 30 29 3b 0a 20 20 20  nionTab, 0);.   
fe20: 20 20 20 20 20 69 66 28 20 70 72 69 6f 72 4f 70       if( priorOp
fe30: 3d 3d 53 52 54 5f 54 61 62 6c 65 20 29 7b 0a 20  ==SRT_Table ){. 
fe40: 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28           assert(
fe50: 20 6e 53 65 74 50 32 3c 73 69 7a 65 6f 66 28 61   nSetP2<sizeof(a
fe60: 53 65 74 50 32 29 2f 73 69 7a 65 6f 66 28 61 53  SetP2)/sizeof(aS
fe70: 65 74 50 32 5b 30 5d 29 20 29 3b 0a 20 20 20 20  etP2[0]) );.    
fe80: 20 20 20 20 20 20 61 53 65 74 50 32 5b 6e 53 65        aSetP2[nSe
fe90: 74 50 32 2b 2b 5d 20 3d 20 61 64 64 72 3b 0a 20  tP2++] = addr;. 
fea0: 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
feb0: 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
fec0: 70 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b  p->addrOpenEphm[
fed0: 30 5d 20 3d 3d 20 2d 31 20 29 3b 0a 20 20 20 20  0] == -1 );.    
fee0: 20 20 20 20 20 20 70 2d 3e 61 64 64 72 4f 70 65        p->addrOpe
fef0: 6e 45 70 68 6d 5b 30 5d 20 3d 20 61 64 64 72 3b  nEphm[0] = addr;
ff00: 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e 70 52  .          p->pR
ff10: 69 67 68 74 6d 6f 73 74 2d 3e 75 73 65 73 45 70  ightmost->usesEp
ff20: 68 6d 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20  hm = 1;.        
ff30: 7d 0a 20 20 20 20 20 20 20 20 63 72 65 61 74 65  }.        create
ff40: 53 6f 72 74 69 6e 67 49 6e 64 65 78 28 70 50 61  SortingIndex(pPa
ff50: 72 73 65 2c 20 70 2c 20 70 4f 72 64 65 72 42 79  rse, p, pOrderBy
ff60: 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  );.        asser
ff70: 74 28 20 70 2d 3e 70 45 4c 69 73 74 20 29 3b 0a  t( p->pEList );.
ff80: 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f        }..      /
ff90: 2a 20 43 6f 64 65 20 74 68 65 20 53 45 4c 45 43  * Code the SELEC
ffa0: 54 20 73 74 61 74 65 6d 65 6e 74 73 20 74 6f 20  T statements to 
ffb0: 6f 75 72 20 6c 65 66 74 0a 20 20 20 20 20 20 2a  our left.      *
ffc0: 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  /.      assert( 
ffd0: 21 70 50 72 69 6f 72 2d 3e 70 4f 72 64 65 72 42  !pPrior->pOrderB
ffe0: 79 20 29 3b 0a 20 20 20 20 20 20 75 6e 69 6f 6e  y );.      union
fff0: 64 65 73 74 2e 65 44 65 73 74 20 3d 20 70 72 69  dest.eDest = pri
10000 6f 72 4f 70 3b 0a 20 20 20 20 20 20 75 6e 69 6f  orOp;.      unio
10010 6e 64 65 73 74 2e 69 50 61 72 6d 20 3d 20 75 6e  ndest.iParm = un
10020 69 6f 6e 54 61 62 3b 0a 20 20 20 20 20 20 72 63  ionTab;.      rc
10030 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74   = sqlite3Select
10040 28 70 50 61 72 73 65 2c 20 70 50 72 69 6f 72 2c  (pParse, pPrior,
10050 20 26 75 6e 69 6f 6e 64 65 73 74 2c 20 30 2c 20   &uniondest, 0, 
10060 30 2c 20 30 2c 20 61 66 66 29 3b 0a 20 20 20 20  0, 0, aff);.    
10070 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20    if( rc ){.    
10080 20 20 20 20 67 6f 74 6f 20 6d 75 6c 74 69 5f 73      goto multi_s
10090 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 20  elect_end;.     
100a0 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 43 6f 64   }..      /* Cod
100b0 65 20 74 68 65 20 63 75 72 72 65 6e 74 20 53 45  e the current SE
100c0 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 0a 20  LECT statement. 
100d0 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 73 77       */.      sw
100e0 69 74 63 68 28 20 70 2d 3e 6f 70 20 29 7b 0a 20  itch( p->op ){. 
100f0 20 20 20 20 20 20 20 20 63 61 73 65 20 54 4b 5f          case TK_
10100 45 58 43 45 50 54 3a 20 20 6f 70 20 3d 20 53 52  EXCEPT:  op = SR
10110 54 5f 45 78 63 65 70 74 3b 20 20 20 62 72 65 61  T_Except;   brea
10120 6b 3b 0a 20 20 20 20 20 20 20 20 20 63 61 73 65  k;.         case
10130 20 54 4b 5f 55 4e 49 4f 4e 3a 20 20 20 6f 70 20   TK_UNION:   op 
10140 3d 20 53 52 54 5f 55 6e 69 6f 6e 3b 20 20 20 20  = SRT_Union;    
10150 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20  break;.         
10160 63 61 73 65 20 54 4b 5f 41 4c 4c 3a 20 20 20 20  case TK_ALL:    
10170 20 6f 70 20 3d 20 53 52 54 5f 54 61 62 6c 65 3b   op = SRT_Table;
10180 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
10190 20 7d 0a 20 20 20 20 20 20 70 2d 3e 70 50 72 69   }.      p->pPri
101a0 6f 72 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 2d  or = 0;.      p-
101b0 3e 70 4f 72 64 65 72 42 79 20 3d 20 30 3b 0a 20  >pOrderBy = 0;. 
101c0 20 20 20 20 20 70 2d 3e 64 69 73 61 6c 6c 6f 77       p->disallow
101d0 4f 72 64 65 72 42 79 20 3d 20 70 4f 72 64 65 72  OrderBy = pOrder
101e0 42 79 21 3d 30 3b 0a 20 20 20 20 20 20 70 4c 69  By!=0;.      pLi
101f0 6d 69 74 20 3d 20 70 2d 3e 70 4c 69 6d 69 74 3b  mit = p->pLimit;
10200 0a 20 20 20 20 20 20 70 2d 3e 70 4c 69 6d 69 74  .      p->pLimit
10210 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 4f 66 66   = 0;.      pOff
10220 73 65 74 20 3d 20 70 2d 3e 70 4f 66 66 73 65 74  set = p->pOffset
10230 3b 0a 20 20 20 20 20 20 70 2d 3e 70 4f 66 66 73  ;.      p->pOffs
10240 65 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 75 6e  et = 0;.      un
10250 69 6f 6e 64 65 73 74 2e 65 44 65 73 74 20 3d 20  iondest.eDest = 
10260 6f 70 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73  op;.      rc = s
10270 71 6c 69 74 65 33 53 65 6c 65 63 74 28 70 50 61  qlite3Select(pPa
10280 72 73 65 2c 20 70 2c 20 26 75 6e 69 6f 6e 64 65  rse, p, &unionde
10290 73 74 2c 20 30 2c 20 30 2c 20 30 2c 20 61 66 66  st, 0, 0, 0, aff
102a0 29 3b 0a 20 20 20 20 20 20 2f 2a 20 51 75 65 72  );.      /* Quer
102b0 79 20 66 6c 61 74 74 65 6e 69 6e 67 20 69 6e 20  y flattening in 
102c0 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28 29 20  sqlite3Select() 
102d0 6d 69 67 68 74 20 72 65 66 69 6c 6c 20 70 2d 3e  might refill p->
102e0 70 4f 72 64 65 72 42 79 2e 0a 20 20 20 20 20 20  pOrderBy..      
102f0 2a 2a 20 42 65 20 73 75 72 65 20 74 6f 20 64 65  ** Be sure to de
10300 6c 65 74 65 20 70 2d 3e 70 4f 72 64 65 72 42 79  lete p->pOrderBy
10310 2c 20 74 68 65 72 65 66 6f 72 65 2c 20 74 6f 20  , therefore, to 
10320 61 76 6f 69 64 20 61 20 6d 65 6d 6f 72 79 20 6c  avoid a memory l
10330 65 61 6b 2e 20 2a 2f 0a 20 20 20 20 20 20 73 71  eak. */.      sq
10340 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c  lite3ExprListDel
10350 65 74 65 28 70 2d 3e 70 4f 72 64 65 72 42 79 29  ete(p->pOrderBy)
10360 3b 0a 20 20 20 20 20 20 70 2d 3e 70 50 72 69 6f  ;.      p->pPrio
10370 72 20 3d 20 70 50 72 69 6f 72 3b 0a 20 20 20 20  r = pPrior;.    
10380 20 20 70 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20    p->pOrderBy = 
10390 70 4f 72 64 65 72 42 79 3b 0a 20 20 20 20 20 20  pOrderBy;.      
103a0 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74  sqlite3ExprDelet
103b0 65 28 70 2d 3e 70 4c 69 6d 69 74 29 3b 0a 20 20  e(p->pLimit);.  
103c0 20 20 20 20 70 2d 3e 70 4c 69 6d 69 74 20 3d 20      p->pLimit = 
103d0 70 4c 69 6d 69 74 3b 0a 20 20 20 20 20 20 70 2d  pLimit;.      p-
103e0 3e 70 4f 66 66 73 65 74 20 3d 20 70 4f 66 66 73  >pOffset = pOffs
103f0 65 74 3b 0a 20 20 20 20 20 20 70 2d 3e 69 4c 69  et;.      p->iLi
10400 6d 69 74 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20  mit = -1;.      
10410 70 2d 3e 69 4f 66 66 73 65 74 20 3d 20 2d 31 3b  p->iOffset = -1;
10420 0a 20 20 20 20 20 20 69 66 28 20 72 63 20 29 7b  .      if( rc ){
10430 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 6d 75  .        goto mu
10440 6c 74 69 5f 73 65 6c 65 63 74 5f 65 6e 64 3b 0a  lti_select_end;.
10450 20 20 20 20 20 20 7d 0a 0a 0a 20 20 20 20 20 20        }...      
10460 2f 2a 20 43 6f 6e 76 65 72 74 20 74 68 65 20 64  /* Convert the d
10470 61 74 61 20 69 6e 20 74 68 65 20 74 65 6d 70 6f  ata in the tempo
10480 72 61 72 79 20 74 61 62 6c 65 20 69 6e 74 6f 20  rary table into 
10490 77 68 61 74 65 76 65 72 20 66 6f 72 6d 0a 20 20  whatever form.  
104a0 20 20 20 20 2a 2a 20 69 74 20 69 73 20 74 68 61      ** it is tha
104b0 74 20 77 65 20 63 75 72 72 65 6e 74 6c 79 20 6e  t we currently n
104c0 65 65 64 2e 0a 20 20 20 20 20 20 2a 2f 20 20 20  eed..      */   
104d0 20 20 20 0a 20 20 20 20 20 20 69 66 28 20 64 65     .      if( de
104e0 73 74 2e 65 44 65 73 74 21 3d 70 72 69 6f 72 4f  st.eDest!=priorO
104f0 70 20 7c 7c 20 75 6e 69 6f 6e 54 61 62 21 3d 64  p || unionTab!=d
10500 65 73 74 2e 69 50 61 72 6d 20 29 7b 0a 20 20 20  est.iParm ){.   
10510 20 20 20 20 20 69 6e 74 20 69 43 6f 6e 74 2c 20       int iCont, 
10520 69 42 72 65 61 6b 2c 20 69 53 74 61 72 74 3b 0a  iBreak, iStart;.
10530 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
10540 70 2d 3e 70 45 4c 69 73 74 20 29 3b 0a 20 20 20  p->pEList );.   
10550 20 20 20 20 20 69 66 28 20 64 65 73 74 2e 65 44       if( dest.eD
10560 65 73 74 3d 3d 53 52 54 5f 43 61 6c 6c 62 61 63  est==SRT_Callbac
10570 6b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 53  k ){.          S
10580 65 6c 65 63 74 20 2a 70 46 69 72 73 74 20 3d 20  elect *pFirst = 
10590 70 3b 0a 20 20 20 20 20 20 20 20 20 20 77 68 69  p;.          whi
105a0 6c 65 28 20 70 46 69 72 73 74 2d 3e 70 50 72 69  le( pFirst->pPri
105b0 6f 72 20 29 20 70 46 69 72 73 74 20 3d 20 70 46  or ) pFirst = pF
105c0 69 72 73 74 2d 3e 70 50 72 69 6f 72 3b 0a 20 20  irst->pPrior;.  
105d0 20 20 20 20 20 20 20 20 67 65 6e 65 72 61 74 65          generate
105e0 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 70 50 61 72  ColumnNames(pPar
105f0 73 65 2c 20 30 2c 20 70 46 69 72 73 74 2d 3e 70  se, 0, pFirst->p
10600 45 4c 69 73 74 29 3b 0a 20 20 20 20 20 20 20 20  EList);.        
10610 7d 0a 20 20 20 20 20 20 20 20 69 42 72 65 61 6b  }.        iBreak
10620 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61   = sqlite3VdbeMa
10630 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20  keLabel(v);.    
10640 20 20 20 20 69 43 6f 6e 74 20 3d 20 73 71 6c 69      iCont = sqli
10650 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c  te3VdbeMakeLabel
10660 28 76 29 3b 0a 20 20 20 20 20 20 20 20 63 6f 6d  (v);.        com
10670 70 75 74 65 4c 69 6d 69 74 52 65 67 69 73 74 65  puteLimitRegiste
10680 72 73 28 70 50 61 72 73 65 2c 20 70 2c 20 69 42  rs(pParse, p, iB
10690 72 65 61 6b 29 3b 0a 20 20 20 20 20 20 20 20 73  reak);.        s
106a0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
106b0 28 76 2c 20 4f 50 5f 52 65 77 69 6e 64 2c 20 75  (v, OP_Rewind, u
106c0 6e 69 6f 6e 54 61 62 2c 20 69 42 72 65 61 6b 29  nionTab, iBreak)
106d0 3b 0a 20 20 20 20 20 20 20 20 69 53 74 61 72 74  ;.        iStart
106e0 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43 75   = sqlite3VdbeCu
106f0 72 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 20 20  rrentAddr(v);.  
10700 20 20 20 20 20 20 72 63 20 3d 20 73 65 6c 65 63        rc = selec
10710 74 49 6e 6e 65 72 4c 6f 6f 70 28 70 50 61 72 73  tInnerLoop(pPars
10720 65 2c 20 70 2c 20 70 2d 3e 70 45 4c 69 73 74 2c  e, p, p->pEList,
10730 20 75 6e 69 6f 6e 54 61 62 2c 20 70 2d 3e 70 45   unionTab, p->pE
10740 4c 69 73 74 2d 3e 6e 45 78 70 72 2c 0a 20 20 20  List->nExpr,.   
10750 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10760 20 20 20 20 20 20 20 20 20 20 70 4f 72 64 65 72            pOrder
10770 42 79 2c 20 2d 31 2c 20 26 64 65 73 74 2c 20 69  By, -1, &dest, i
10780 43 6f 6e 74 2c 20 69 42 72 65 61 6b 2c 20 30 29  Cont, iBreak, 0)
10790 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63  ;.        if( rc
107a0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63   ){.          rc
107b0 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20   = 1;.          
107c0 67 6f 74 6f 20 6d 75 6c 74 69 5f 73 65 6c 65 63  goto multi_selec
107d0 74 5f 65 6e 64 3b 0a 20 20 20 20 20 20 20 20 7d  t_end;.        }
107e0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
107f0 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c  VdbeResolveLabel
10800 28 76 2c 20 69 43 6f 6e 74 29 3b 0a 20 20 20 20  (v, iCont);.    
10810 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
10820 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 65 78 74  ddOp2(v, OP_Next
10830 2c 20 75 6e 69 6f 6e 54 61 62 2c 20 69 53 74 61  , unionTab, iSta
10840 72 74 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  rt);.        sql
10850 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c  ite3VdbeResolveL
10860 61 62 65 6c 28 76 2c 20 69 42 72 65 61 6b 29 3b  abel(v, iBreak);
10870 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
10880 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
10890 5f 43 6c 6f 73 65 2c 20 75 6e 69 6f 6e 54 61 62  _Close, unionTab
108a0 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  , 0);.      }.  
108b0 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
108c0 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49 4e 54  .    case TK_INT
108d0 45 52 53 45 43 54 3a 20 7b 0a 20 20 20 20 20 20  ERSECT: {.      
108e0 69 6e 74 20 74 61 62 31 2c 20 74 61 62 32 3b 0a  int tab1, tab2;.
108f0 20 20 20 20 20 20 69 6e 74 20 69 43 6f 6e 74 2c        int iCont,
10900 20 69 42 72 65 61 6b 2c 20 69 53 74 61 72 74 3b   iBreak, iStart;
10910 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 4c 69  .      Expr *pLi
10920 6d 69 74 2c 20 2a 70 4f 66 66 73 65 74 3b 0a 20  mit, *pOffset;. 
10930 20 20 20 20 20 69 6e 74 20 61 64 64 72 3b 0a 20       int addr;. 
10940 20 20 20 20 20 53 65 6c 65 63 74 44 65 73 74 20       SelectDest 
10950 69 6e 74 65 72 73 65 63 74 64 65 73 74 20 3d 20  intersectdest = 
10960 7b 53 52 54 5f 55 6e 69 6f 6e 2c 20 30 2c 20 30  {SRT_Union, 0, 0
10970 7d 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 49 4e 54  };..      /* INT
10980 45 52 53 45 43 54 20 69 73 20 64 69 66 66 65 72  ERSECT is differ
10990 65 6e 74 20 66 72 6f 6d 20 74 68 65 20 6f 74 68  ent from the oth
109a0 65 72 73 20 73 69 6e 63 65 20 69 74 20 72 65 71  ers since it req
109b0 75 69 72 65 73 0a 20 20 20 20 20 20 2a 2a 20 74  uires.      ** t
109c0 77 6f 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62  wo temporary tab
109d0 6c 65 73 2e 20 20 48 65 6e 63 65 20 69 74 20 68  les.  Hence it h
109e0 61 73 20 69 74 73 20 6f 77 6e 20 63 61 73 65 2e  as its own case.
109f0 20 20 42 65 67 69 6e 0a 20 20 20 20 20 20 2a 2a    Begin.      **
10a00 20 62 79 20 61 6c 6c 6f 63 61 74 69 6e 67 20 74   by allocating t
10a10 68 65 20 74 61 62 6c 65 73 20 77 65 20 77 69 6c  he tables we wil
10a20 6c 20 6e 65 65 64 2e 0a 20 20 20 20 20 20 2a 2f  l need..      */
10a30 0a 20 20 20 20 20 20 74 61 62 31 20 3d 20 70 50  .      tab1 = pP
10a40 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20  arse->nTab++;.  
10a50 20 20 20 20 74 61 62 32 20 3d 20 70 50 61 72 73      tab2 = pPars
10a60 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20 20  e->nTab++;.     
10a70 20 69 66 28 20 70 72 6f 63 65 73 73 43 6f 6d 70   if( processComp
10a80 6f 75 6e 64 4f 72 64 65 72 42 79 28 70 50 61 72  oundOrderBy(pPar
10a90 73 65 2c 20 70 2c 20 74 61 62 31 29 20 29 7b 0a  se, p, tab1) ){.
10aa0 20 20 20 20 20 20 20 20 72 63 20 3d 20 31 3b 0a          rc = 1;.
10ab0 20 20 20 20 20 20 20 20 67 6f 74 6f 20 6d 75 6c          goto mul
10ac0 74 69 5f 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20  ti_select_end;. 
10ad0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 63 72 65       }.      cre
10ae0 61 74 65 53 6f 72 74 69 6e 67 49 6e 64 65 78 28  ateSortingIndex(
10af0 70 50 61 72 73 65 2c 20 70 2c 20 70 4f 72 64 65  pParse, p, pOrde
10b00 72 42 79 29 3b 0a 0a 20 20 20 20 20 20 61 64 64  rBy);..      add
10b10 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41  r = sqlite3VdbeA
10b20 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4f 70 65 6e  ddOp2(v, OP_Open
10b30 45 70 68 65 6d 65 72 61 6c 2c 20 74 61 62 31 2c  Ephemeral, tab1,
10b40 20 30 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72   0);.      asser
10b50 74 28 20 70 2d 3e 61 64 64 72 4f 70 65 6e 45 70  t( p->addrOpenEp
10b60 68 6d 5b 30 5d 20 3d 3d 20 2d 31 20 29 3b 0a 20  hm[0] == -1 );. 
10b70 20 20 20 20 20 70 2d 3e 61 64 64 72 4f 70 65 6e       p->addrOpen
10b80 45 70 68 6d 5b 30 5d 20 3d 20 61 64 64 72 3b 0a  Ephm[0] = addr;.
10b90 20 20 20 20 20 20 70 2d 3e 70 52 69 67 68 74 6d        p->pRightm
10ba0 6f 73 74 2d 3e 75 73 65 73 45 70 68 6d 20 3d 20  ost->usesEphm = 
10bb0 31 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  1;.      assert(
10bc0 20 70 2d 3e 70 45 4c 69 73 74 20 29 3b 0a 0a 20   p->pEList );.. 
10bd0 20 20 20 20 20 2f 2a 20 43 6f 64 65 20 74 68 65       /* Code the
10be0 20 53 45 4c 45 43 54 73 20 74 6f 20 6f 75 72 20   SELECTs to our 
10bf0 6c 65 66 74 20 69 6e 74 6f 20 74 65 6d 70 6f 72  left into tempor
10c00 61 72 79 20 74 61 62 6c 65 20 22 74 61 62 31 22  ary table "tab1"
10c10 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
10c20 20 69 6e 74 65 72 73 65 63 74 64 65 73 74 2e 69   intersectdest.i
10c30 50 61 72 6d 20 3d 20 74 61 62 31 3b 0a 20 20 20  Parm = tab1;.   
10c40 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 53     rc = sqlite3S
10c50 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70 50  elect(pParse, pP
10c60 72 69 6f 72 2c 20 26 69 6e 74 65 72 73 65 63 74  rior, &intersect
10c70 64 65 73 74 2c 20 30 2c 20 30 2c 20 30 2c 20 61  dest, 0, 0, 0, a
10c80 66 66 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  ff);.      if( r
10c90 63 20 29 7b 0a 20 20 20 20 20 20 20 20 67 6f 74  c ){.        got
10ca0 6f 20 6d 75 6c 74 69 5f 73 65 6c 65 63 74 5f 65  o multi_select_e
10cb0 6e 64 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20  nd;.      }..   
10cc0 20 20 20 2f 2a 20 43 6f 64 65 20 74 68 65 20 63     /* Code the c
10cd0 75 72 72 65 6e 74 20 53 45 4c 45 43 54 20 69 6e  urrent SELECT in
10ce0 74 6f 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62  to temporary tab
10cf0 6c 65 20 22 74 61 62 32 22 0a 20 20 20 20 20 20  le "tab2".      
10d00 2a 2f 0a 20 20 20 20 20 20 61 64 64 72 20 3d 20  */.      addr = 
10d10 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
10d20 32 28 76 2c 20 4f 50 5f 4f 70 65 6e 45 70 68 65  2(v, OP_OpenEphe
10d30 6d 65 72 61 6c 2c 20 74 61 62 32 2c 20 30 29 3b  meral, tab2, 0);
10d40 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
10d50 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b 31  ->addrOpenEphm[1
10d60 5d 20 3d 3d 20 2d 31 20 29 3b 0a 20 20 20 20 20  ] == -1 );.     
10d70 20 70 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d   p->addrOpenEphm
10d80 5b 31 5d 20 3d 20 61 64 64 72 3b 0a 20 20 20 20  [1] = addr;.    
10d90 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d 20 30 3b    p->pPrior = 0;
10da0 0a 20 20 20 20 20 20 70 4c 69 6d 69 74 20 3d 20  .      pLimit = 
10db0 70 2d 3e 70 4c 69 6d 69 74 3b 0a 20 20 20 20 20  p->pLimit;.     
10dc0 20 70 2d 3e 70 4c 69 6d 69 74 20 3d 20 30 3b 0a   p->pLimit = 0;.
10dd0 20 20 20 20 20 20 70 4f 66 66 73 65 74 20 3d 20        pOffset = 
10de0 70 2d 3e 70 4f 66 66 73 65 74 3b 0a 20 20 20 20  p->pOffset;.    
10df0 20 20 70 2d 3e 70 4f 66 66 73 65 74 20 3d 20 30    p->pOffset = 0
10e00 3b 0a 20 20 20 20 20 20 69 6e 74 65 72 73 65 63  ;.      intersec
10e10 74 64 65 73 74 2e 69 50 61 72 6d 20 3d 20 74 61  tdest.iParm = ta
10e20 62 32 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73  b2;.      rc = s
10e30 71 6c 69 74 65 33 53 65 6c 65 63 74 28 70 50 61  qlite3Select(pPa
10e40 72 73 65 2c 20 70 2c 20 26 69 6e 74 65 72 73 65  rse, p, &interse
10e50 63 74 64 65 73 74 2c 20 30 2c 20 30 2c 20 30 2c  ctdest, 0, 0, 0,
10e60 20 61 66 66 29 3b 0a 20 20 20 20 20 20 70 2d 3e   aff);.      p->
10e70 70 50 72 69 6f 72 20 3d 20 70 50 72 69 6f 72 3b  pPrior = pPrior;
10e80 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
10e90 70 72 44 65 6c 65 74 65 28 70 2d 3e 70 4c 69 6d  prDelete(p->pLim
10ea0 69 74 29 3b 0a 20 20 20 20 20 20 70 2d 3e 70 4c  it);.      p->pL
10eb0 69 6d 69 74 20 3d 20 70 4c 69 6d 69 74 3b 0a 20  imit = pLimit;. 
10ec0 20 20 20 20 20 70 2d 3e 70 4f 66 66 73 65 74 20       p->pOffset 
10ed0 3d 20 70 4f 66 66 73 65 74 3b 0a 20 20 20 20 20  = pOffset;.     
10ee0 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20   if( rc ){.     
10ef0 20 20 20 67 6f 74 6f 20 6d 75 6c 74 69 5f 73 65     goto multi_se
10f00 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 20 20  lect_end;.      
10f10 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 47 65 6e 65  }..      /* Gene
10f20 72 61 74 65 20 63 6f 64 65 20 74 6f 20 74 61 6b  rate code to tak
10f30 65 20 74 68 65 20 69 6e 74 65 72 73 65 63 74 69  e the intersecti
10f40 6f 6e 20 6f 66 20 74 68 65 20 74 77 6f 20 74 65  on of the two te
10f50 6d 70 6f 72 61 72 79 0a 20 20 20 20 20 20 2a 2a  mporary.      **
10f60 20 74 61 62 6c 65 73 2e 0a 20 20 20 20 20 20 2a   tables..      *
10f70 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  /.      assert( 
10f80 70 2d 3e 70 45 4c 69 73 74 20 29 3b 0a 20 20 20  p->pEList );.   
10f90 20 20 20 69 66 28 20 64 65 73 74 2e 65 44 65 73     if( dest.eDes
10fa0 74 3d 3d 53 52 54 5f 43 61 6c 6c 62 61 63 6b 20  t==SRT_Callback 
10fb0 29 7b 0a 20 20 20 20 20 20 20 20 53 65 6c 65 63  ){.        Selec
10fc0 74 20 2a 70 46 69 72 73 74 20 3d 20 70 3b 0a 20  t *pFirst = p;. 
10fd0 20 20 20 20 20 20 20 77 68 69 6c 65 28 20 70 46         while( pF
10fe0 69 72 73 74 2d 3e 70 50 72 69 6f 72 20 29 20 70  irst->pPrior ) p
10ff0 46 69 72 73 74 20 3d 20 70 46 69 72 73 74 2d 3e  First = pFirst->
11000 70 50 72 69 6f 72 3b 0a 20 20 20 20 20 20 20 20  pPrior;.        
11010 67 65 6e 65 72 61 74 65 43 6f 6c 75 6d 6e 4e 61  generateColumnNa
11020 6d 65 73 28 70 50 61 72 73 65 2c 20 30 2c 20 70  mes(pParse, 0, p
11030 46 69 72 73 74 2d 3e 70 45 4c 69 73 74 29 3b 0a  First->pEList);.
11040 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 42        }.      iB
11050 72 65 61 6b 20 3d 20 73 71 6c 69 74 65 33 56 64  reak = sqlite3Vd
11060 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a  beMakeLabel(v);.
11070 20 20 20 20 20 20 69 43 6f 6e 74 20 3d 20 73 71        iCont = sq
11080 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62  lite3VdbeMakeLab
11090 65 6c 28 76 29 3b 0a 20 20 20 20 20 20 63 6f 6d  el(v);.      com
110a0 70 75 74 65 4c 69 6d 69 74 52 65 67 69 73 74 65  puteLimitRegiste
110b0 72 73 28 70 50 61 72 73 65 2c 20 70 2c 20 69 42  rs(pParse, p, iB
110c0 72 65 61 6b 29 3b 0a 20 20 20 20 20 20 73 71 6c  reak);.      sql
110d0 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
110e0 2c 20 4f 50 5f 52 65 77 69 6e 64 2c 20 74 61 62  , OP_Rewind, tab
110f0 31 2c 20 69 42 72 65 61 6b 29 3b 0a 20 20 20 20  1, iBreak);.    
11100 20 20 69 53 74 61 72 74 20 3d 20 73 71 6c 69 74    iStart = sqlit
11110 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
11120 4f 50 5f 52 6f 77 4b 65 79 2c 20 74 61 62 31 2c  OP_RowKey, tab1,
11130 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74   0);.      sqlit
11140 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
11150 4f 50 5f 4e 6f 74 46 6f 75 6e 64 2c 20 74 61 62  OP_NotFound, tab
11160 32 2c 20 69 43 6f 6e 74 29 3b 0a 20 20 20 20 20  2, iCont);.     
11170 20 72 63 20 3d 20 73 65 6c 65 63 74 49 6e 6e 65   rc = selectInne
11180 72 4c 6f 6f 70 28 70 50 61 72 73 65 2c 20 70 2c  rLoop(pParse, p,
11190 20 70 2d 3e 70 45 4c 69 73 74 2c 20 74 61 62 31   p->pEList, tab1
111a0 2c 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78  , p->pEList->nEx
111b0 70 72 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  pr,.            
111c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
111d0 20 70 4f 72 64 65 72 42 79 2c 20 2d 31 2c 20 26   pOrderBy, -1, &
111e0 64 65 73 74 2c 20 69 43 6f 6e 74 2c 20 69 42 72  dest, iCont, iBr
111f0 65 61 6b 2c 20 30 29 3b 0a 20 20 20 20 20 20 69  eak, 0);.      i
11200 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20  f( rc ){.       
11210 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 20 20 20   rc = 1;.       
11220 20 67 6f 74 6f 20 6d 75 6c 74 69 5f 73 65 6c 65   goto multi_sele
11230 63 74 5f 65 6e 64 3b 0a 20 20 20 20 20 20 7d 0a  ct_end;.      }.
11240 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
11250 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c  eResolveLabel(v,
11260 20 69 43 6f 6e 74 29 3b 0a 20 20 20 20 20 20 73   iCont);.      s
11270 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
11280 28 76 2c 20 4f 50 5f 4e 65 78 74 2c 20 74 61 62  (v, OP_Next, tab
11290 31 2c 20 69 53 74 61 72 74 29 3b 0a 20 20 20 20  1, iStart);.    
112a0 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73    sqlite3VdbeRes
112b0 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 69 42 72  olveLabel(v, iBr
112c0 65 61 6b 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  eak);.      sqli
112d0 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
112e0 20 4f 50 5f 43 6c 6f 73 65 2c 20 74 61 62 32 2c   OP_Close, tab2,
112f0 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74   0);.      sqlit
11300 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
11310 4f 50 5f 43 6c 6f 73 65 2c 20 74 61 62 31 2c 20  OP_Close, tab1, 
11320 30 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  0);.      break;
11330 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
11340 20 4d 61 6b 65 20 73 75 72 65 20 61 6c 6c 20 53   Make sure all S
11350 45 4c 45 43 54 73 20 69 6e 20 74 68 65 20 73 74  ELECTs in the st
11360 61 74 65 6d 65 6e 74 20 68 61 76 65 20 74 68 65  atement have the
11370 20 73 61 6d 65 20 6e 75 6d 62 65 72 20 6f 66 20   same number of 
11380 65 6c 65 6d 65 6e 74 73 0a 20 20 2a 2a 20 69 6e  elements.  ** in
11390 20 74 68 65 69 72 20 72 65 73 75 6c 74 20 73 65   their result se
113a0 74 73 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72  ts..  */.  asser
113b0 74 28 20 70 2d 3e 70 45 4c 69 73 74 20 26 26 20  t( p->pEList && 
113c0 70 50 72 69 6f 72 2d 3e 70 45 4c 69 73 74 20 29  pPrior->pEList )
113d0 3b 0a 20 20 69 66 28 20 70 2d 3e 70 45 4c 69 73  ;.  if( p->pELis
113e0 74 2d 3e 6e 45 78 70 72 21 3d 70 50 72 69 6f 72  t->nExpr!=pPrior
113f0 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 20  ->pEList->nExpr 
11400 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72  ){.    sqlite3Er
11410 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
11420 53 45 4c 45 43 54 73 20 74 6f 20 74 68 65 20 6c  SELECTs to the l
11430 65 66 74 20 61 6e 64 20 72 69 67 68 74 20 6f 66  eft and right of
11440 20 25 73 22 0a 20 20 20 20 20 20 22 20 64 6f 20   %s".      " do 
11450 6e 6f 74 20 68 61 76 65 20 74 68 65 20 73 61 6d  not have the sam
11460 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 65 73 75  e number of resu
11470 6c 74 20 63 6f 6c 75 6d 6e 73 22 2c 20 73 65 6c  lt columns", sel
11480 65 63 74 4f 70 4e 61 6d 65 28 70 2d 3e 6f 70 29  ectOpName(p->op)
11490 29 3b 0a 20 20 20 20 72 63 20 3d 20 31 3b 0a 20  );.    rc = 1;. 
114a0 20 20 20 67 6f 74 6f 20 6d 75 6c 74 69 5f 73 65     goto multi_se
114b0 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 7d 0a 0a 20  lect_end;.  }.. 
114c0 20 2f 2a 20 53 65 74 20 74 68 65 20 6e 75 6d 62   /* Set the numb
114d0 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 69 6e  er of columns in
114e0 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65   temporary table
114f0 73 0a 20 20 2a 2f 0a 20 20 6e 43 6f 6c 20 3d 20  s.  */.  nCol = 
11500 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72  p->pEList->nExpr
11510 3b 0a 20 20 77 68 69 6c 65 28 20 6e 53 65 74 50  ;.  while( nSetP
11520 32 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  2 ){.    sqlite3
11530 56 64 62 65 43 68 61 6e 67 65 50 32 28 76 2c 20  VdbeChangeP2(v, 
11540 61 53 65 74 50 32 5b 2d 2d 6e 53 65 74 50 32 5d  aSetP2[--nSetP2]
11550 2c 20 6e 43 6f 6c 29 3b 0a 20 20 7d 0a 0a 20 20  , nCol);.  }..  
11560 2f 2a 20 43 6f 6d 70 75 74 65 20 63 6f 6c 6c 61  /* Compute colla
11570 74 69 6e 67 20 73 65 71 75 65 6e 63 65 73 20 75  ting sequences u
11580 73 65 64 20 62 79 20 65 69 74 68 65 72 20 74 68  sed by either th
11590 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73  e ORDER BY claus
115a0 65 20 6f 72 0a 20 20 2a 2a 20 62 79 20 61 6e 79  e or.  ** by any
115b0 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65   temporary table
115c0 73 20 6e 65 65 64 65 64 20 74 6f 20 69 6d 70 6c  s needed to impl
115d0 65 6d 65 6e 74 20 74 68 65 20 63 6f 6d 70 6f 75  ement the compou
115e0 6e 64 20 73 65 6c 65 63 74 2e 0a 20 20 2a 2a 20  nd select..  ** 
115f0 41 74 74 61 63 68 20 74 68 65 20 4b 65 79 49 6e  Attach the KeyIn
11600 66 6f 20 73 74 72 75 63 74 75 72 65 20 74 6f 20  fo structure to 
11610 61 6c 6c 20 74 65 6d 70 6f 72 61 72 79 20 74 61  all temporary ta
11620 62 6c 65 73 2e 20 20 49 6e 76 6f 6b 65 20 74 68  bles.  Invoke th
11630 65 0a 20 20 2a 2a 20 4f 52 44 45 52 20 42 59 20  e.  ** ORDER BY 
11640 70 72 6f 63 65 73 73 69 6e 67 20 69 66 20 74 68  processing if th
11650 65 72 65 20 69 73 20 61 6e 20 4f 52 44 45 52 20  ere is an ORDER 
11660 42 59 20 63 6c 61 75 73 65 2e 0a 20 20 2a 2a 0a  BY clause..  **.
11670 20 20 2a 2a 20 54 68 69 73 20 73 65 63 74 69 6f    ** This sectio
11680 6e 20 69 73 20 72 75 6e 20 62 79 20 74 68 65 20  n is run by the 
11690 72 69 67 68 74 2d 6d 6f 73 74 20 53 45 4c 45 43  right-most SELEC
116a0 54 20 73 74 61 74 65 6d 65 6e 74 20 6f 6e 6c 79  T statement only
116b0 2e 0a 20 20 2a 2a 20 53 45 4c 45 43 54 20 73 74  ..  ** SELECT st
116c0 61 74 65 6d 65 6e 74 73 20 74 6f 20 74 68 65 20  atements to the 
116d0 6c 65 66 74 20 61 6c 77 61 79 73 20 73 6b 69 70  left always skip
116e0 20 74 68 69 73 20 70 61 72 74 2e 20 20 54 68 65   this part.  The
116f0 20 72 69 67 68 74 2d 6d 6f 73 74 0a 20 20 2a 2a   right-most.  **
11700 20 53 45 4c 45 43 54 20 6d 69 67 68 74 20 61 6c   SELECT might al
11710 73 6f 20 73 6b 69 70 20 74 68 69 73 20 70 61 72  so skip this par
11720 74 20 69 66 20 69 74 20 68 61 73 20 6e 6f 20 4f  t if it has no O
11730 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 61  RDER BY clause a
11740 6e 64 0a 20 20 2a 2a 20 6e 6f 20 74 65 6d 70 20  nd.  ** no temp 
11750 74 61 62 6c 65 73 20 61 72 65 20 72 65 71 75 69  tables are requi
11760 72 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  red..  */.  if( 
11770 70 4f 72 64 65 72 42 79 20 7c 7c 20 70 2d 3e 75  pOrderBy || p->u
11780 73 65 73 45 70 68 6d 20 29 7b 0a 20 20 20 20 69  sesEphm ){.    i
11790 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20 20 20  nt i;           
117a0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
117b0 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a  Loop counter */.
117c0 20 20 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65      KeyInfo *pKe
117d0 79 49 6e 66 6f 3b 20 20 20 20 20 20 20 20 20 20  yInfo;          
117e0 20 20 2f 2a 20 43 6f 6c 6c 61 74 69 6e 67 20 73    /* Collating s
117f0 65 71 75 65 6e 63 65 20 66 6f 72 20 74 68 65 20  equence for the 
11800 72 65 73 75 6c 74 20 73 65 74 20 2a 2f 0a 20 20  result set */.  
11810 20 20 53 65 6c 65 63 74 20 2a 70 4c 6f 6f 70 3b    Select *pLoop;
11820 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11830 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e 67 20 74  /* For looping t
11840 68 72 6f 75 67 68 20 53 45 4c 45 43 54 20 73 74  hrough SELECT st
11850 61 74 65 6d 65 6e 74 73 20 2a 2f 0a 20 20 20 20  atements */.    
11860 69 6e 74 20 6e 4b 65 79 43 6f 6c 3b 20 20 20 20  int nKeyCol;    
11870 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
11880 20 4e 75 6d 62 65 72 20 6f 66 20 65 6e 74 72 69   Number of entri
11890 65 73 20 69 6e 20 70 4b 65 79 49 6e 66 6f 2d 3e  es in pKeyInfo->
118a0 61 43 6f 6c 5b 5d 20 2a 2f 0a 20 20 20 20 43 6f  aCol[] */.    Co
118b0 6c 6c 53 65 71 20 2a 2a 61 70 43 6f 6c 6c 3b 20  llSeq **apColl; 
118c0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
118d0 6f 72 20 6c 6f 6f 70 69 6e 67 20 74 68 72 6f 75  or looping throu
118e0 67 68 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 43 6f  gh pKeyInfo->aCo
118f0 6c 6c 5b 5d 20 2a 2f 0a 20 20 20 20 43 6f 6c 6c  ll[] */.    Coll
11900 53 65 71 20 2a 2a 61 43 6f 70 79 3b 20 20 20 20  Seq **aCopy;    
11910 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 20 63            /* A c
11920 6f 70 79 20 6f 66 20 70 4b 65 79 49 6e 66 6f 2d  opy of pKeyInfo-
11930 3e 61 43 6f 6c 6c 5b 5d 20 2a 2f 0a 0a 20 20 20  >aColl[] */..   
11940 20 61 73 73 65 72 74 28 20 70 2d 3e 70 52 69 67   assert( p->pRig
11950 68 74 6d 6f 73 74 3d 3d 70 20 29 3b 0a 20 20 20  htmost==p );.   
11960 20 6e 4b 65 79 43 6f 6c 20 3d 20 6e 43 6f 6c 20   nKeyCol = nCol 
11970 2b 20 28 70 4f 72 64 65 72 42 79 20 3f 20 70 4f  + (pOrderBy ? pO
11980 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 20 3a 20  rderBy->nExpr : 
11990 30 29 3b 0a 20 20 20 20 70 4b 65 79 49 6e 66 6f  0);.    pKeyInfo
119a0 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c   = sqlite3DbMall
119b0 6f 63 5a 65 72 6f 28 70 50 61 72 73 65 2d 3e 64  ocZero(pParse->d
119c0 62 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  b,.             
119d0 20 20 20 20 20 20 20 20 20 20 73 69 7a 65 6f 66            sizeof
119e0 28 2a 70 4b 65 79 49 6e 66 6f 29 2b 6e 4b 65 79  (*pKeyInfo)+nKey
119f0 43 6f 6c 2a 28 73 69 7a 65 6f 66 28 43 6f 6c 6c  Col*(sizeof(Coll
11a00 53 65 71 2a 29 20 2b 20 31 29 29 3b 0a 20 20 20  Seq*) + 1));.   
11a10 20 69 66 28 20 21 70 4b 65 79 49 6e 66 6f 20 29   if( !pKeyInfo )
11a20 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c  {.      rc = SQL
11a30 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20  ITE_NOMEM;.     
11a40 20 67 6f 74 6f 20 6d 75 6c 74 69 5f 73 65 6c 65   goto multi_sele
11a50 63 74 5f 65 6e 64 3b 0a 20 20 20 20 7d 0a 0a 20  ct_end;.    }.. 
11a60 20 20 20 70 4b 65 79 49 6e 66 6f 2d 3e 65 6e 63     pKeyInfo->enc
11a70 20 3d 20 45 4e 43 28 70 50 61 72 73 65 2d 3e 64   = ENC(pParse->d
11a80 62 29 3b 0a 20 20 20 20 70 4b 65 79 49 6e 66 6f  b);.    pKeyInfo
11a90 2d 3e 6e 46 69 65 6c 64 20 3d 20 6e 43 6f 6c 3b  ->nField = nCol;
11aa0 0a 0a 20 20 20 20 66 6f 72 28 69 3d 30 2c 20 61  ..    for(i=0, a
11ab0 70 43 6f 6c 6c 3d 70 4b 65 79 49 6e 66 6f 2d 3e  pColl=pKeyInfo->
11ac0 61 43 6f 6c 6c 3b 20 69 3c 6e 43 6f 6c 3b 20 69  aColl; i<nCol; i
11ad0 2b 2b 2c 20 61 70 43 6f 6c 6c 2b 2b 29 7b 0a 20  ++, apColl++){. 
11ae0 20 20 20 20 20 2a 61 70 43 6f 6c 6c 20 3d 20 6d       *apColl = m
11af0 75 6c 74 69 53 65 6c 65 63 74 43 6f 6c 6c 53 65  ultiSelectCollSe
11b00 71 28 70 50 61 72 73 65 2c 20 70 2c 20 69 29 3b  q(pParse, p, i);
11b10 0a 20 20 20 20 20 20 69 66 28 20 30 3d 3d 2a 61  .      if( 0==*a
11b20 70 43 6f 6c 6c 20 29 7b 0a 20 20 20 20 20 20 20  pColl ){.       
11b30 20 2a 61 70 43 6f 6c 6c 20 3d 20 70 50 61 72 73   *apColl = pPars
11b40 65 2d 3e 64 62 2d 3e 70 44 66 6c 74 43 6f 6c 6c  e->db->pDfltColl
11b50 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
11b60 0a 20 20 20 20 66 6f 72 28 70 4c 6f 6f 70 3d 70  .    for(pLoop=p
11b70 3b 20 70 4c 6f 6f 70 3b 20 70 4c 6f 6f 70 3d 70  ; pLoop; pLoop=p
11b80 4c 6f 6f 70 2d 3e 70 50 72 69 6f 72 29 7b 0a 20  Loop->pPrior){. 
11b90 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c       for(i=0; i<
11ba0 32 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20  2; i++){.       
11bb0 20 69 6e 74 20 61 64 64 72 20 3d 20 70 4c 6f 6f   int addr = pLoo
11bc0 70 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b  p->addrOpenEphm[
11bd0 69 5d 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  i];.        if( 
11be0 61 64 64 72 3c 30 20 29 7b 0a 20 20 20 20 20 20  addr<0 ){.      
11bf0 20 20 20 20 2f 2a 20 49 66 20 5b 30 5d 20 69 73      /* If [0] is
11c00 20 75 6e 75 73 65 64 20 74 68 65 6e 20 5b 31 5d   unused then [1]
11c10 20 69 73 20 61 6c 73 6f 20 75 6e 75 73 65 64 2e   is also unused.
11c20 20 20 53 6f 20 77 65 20 63 61 6e 0a 20 20 20 20    So we can.    
11c30 20 20 20 20 20 20 2a 2a 20 61 6c 77 61 79 73 20        ** always 
11c40 73 61 66 65 6c 79 20 61 62 6f 72 74 20 61 73 20  safely abort as 
11c50 73 6f 6f 6e 20 61 73 20 74 68 65 20 66 69 72 73  soon as the firs
11c60 74 20 75 6e 75 73 65 64 20 73 6c 6f 74 20 69 73  t unused slot is
11c70 20 66 6f 75 6e 64 20 2a 2f 0a 20 20 20 20 20 20   found */.      
11c80 20 20 20 20 61 73 73 65 72 74 28 20 70 4c 6f 6f      assert( pLoo
11c90 70 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b  p->addrOpenEphm[
11ca0 31 5d 3c 30 20 29 3b 0a 20 20 20 20 20 20 20 20  1]<0 );.        
11cb0 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20    break;.       
11cc0 20 7d 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74   }.        sqlit
11cd0 65 33 56 64 62 65 43 68 61 6e 67 65 50 32 28 76  e3VdbeChangeP2(v
11ce0 2c 20 61 64 64 72 2c 20 6e 43 6f 6c 29 3b 0a 20  , addr, nCol);. 
11cf0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
11d00 62 65 43 68 61 6e 67 65 50 34 28 76 2c 20 61 64  beChangeP4(v, ad
11d10 64 72 2c 20 28 63 68 61 72 2a 29 70 4b 65 79 49  dr, (char*)pKeyI
11d20 6e 66 6f 2c 20 50 34 5f 4b 45 59 49 4e 46 4f 29  nfo, P4_KEYINFO)
11d30 3b 0a 20 20 20 20 20 20 20 20 70 4c 6f 6f 70 2d  ;.        pLoop-
11d40 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b 69 5d  >addrOpenEphm[i]
11d50 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 7d 0a 20   = -1;.      }. 
11d60 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 70 4f     }..    if( pO
11d70 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20 20 20  rderBy ){.      
11d80 73 74 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f  struct ExprList_
11d90 69 74 65 6d 20 2a 70 4f 54 65 72 6d 20 3d 20 70  item *pOTerm = p
11da0 4f 72 64 65 72 42 79 2d 3e 61 3b 0a 20 20 20 20  OrderBy->a;.    
11db0 20 20 69 6e 74 20 6e 4f 72 64 65 72 42 79 45 78    int nOrderByEx
11dc0 70 72 20 3d 20 70 4f 72 64 65 72 42 79 2d 3e 6e  pr = pOrderBy->n
11dd0 45 78 70 72 3b 0a 20 20 20 20 20 20 69 6e 74 20  Expr;.      int 
11de0 61 64 64 72 3b 0a 20 20 20 20 20 20 75 38 20 2a  addr;.      u8 *
11df0 70 53 6f 72 74 4f 72 64 65 72 3b 0a 0a 20 20 20  pSortOrder;..   
11e00 20 20 20 2f 2a 20 52 65 75 73 65 20 74 68 65 20     /* Reuse the 
11e10 73 61 6d 65 20 70 4b 65 79 49 6e 66 6f 20 66 6f  same pKeyInfo fo
11e20 72 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 61  r the ORDER BY a
11e30 73 20 77 61 73 20 75 73 65 64 20 61 62 6f 76 65  s was used above
11e40 20 66 6f 72 0a 20 20 20 20 20 20 2a 2a 20 74 68   for.      ** th
11e50 65 20 63 6f 6d 70 6f 75 6e 64 20 73 65 6c 65 63  e compound selec
11e60 74 20 73 74 61 74 65 6d 65 6e 74 73 2e 20 20 45  t statements.  E
11e70 78 63 65 70 74 20 77 65 20 68 61 76 65 20 74 6f  xcept we have to
11e80 20 63 68 61 6e 67 65 20 6f 75 74 20 74 68 65 0a   change out the.
11e90 20 20 20 20 20 20 2a 2a 20 70 4b 65 79 49 6e 66        ** pKeyInf
11ea0 6f 2d 3e 61 43 6f 6c 6c 5b 5d 20 76 61 6c 75 65  o->aColl[] value
11eb0 73 2e 20 20 53 6f 6d 65 20 6f 66 20 74 68 65 20  s.  Some of the 
11ec0 61 43 6f 6c 6c 5b 5d 20 76 61 6c 75 65 73 20 77  aColl[] values w
11ed0 69 6c 6c 20 62 65 0a 20 20 20 20 20 20 2a 2a 20  ill be.      ** 
11ee0 72 65 75 73 65 64 20 77 68 65 6e 20 63 6f 6e 73  reused when cons
11ef0 74 72 75 63 74 69 6e 67 20 74 68 65 20 70 4b 65  tructing the pKe
11f00 79 49 6e 66 6f 20 66 6f 72 20 74 68 65 20 4f 52  yInfo for the OR
11f10 44 45 52 20 42 59 2c 20 73 6f 20 6d 61 6b 65 0a  DER BY, so make.
11f20 20 20 20 20 20 20 2a 2a 20 61 20 63 6f 70 79 2e        ** a copy.
11f30 20 20 53 75 66 66 69 63 69 65 6e 74 20 73 70 61    Sufficient spa
11f40 63 65 20 74 6f 20 68 6f 6c 64 20 62 6f 74 68 20  ce to hold both 
11f50 74 68 65 20 6e 43 6f 6c 20 65 6e 74 72 69 65 73  the nCol entries
11f60 20 66 6f 72 0a 20 20 20 20 20 20 2a 2a 20 74 68   for.      ** th
11f70 65 20 63 6f 6d 70 6f 75 6e 64 20 73 65 6c 65 63  e compound selec
11f80 74 20 61 6e 64 20 74 68 65 20 6e 4f 72 64 65 72  t and the nOrder
11f90 62 79 45 78 70 72 20 65 6e 74 72 69 65 73 20 66  byExpr entries f
11fa0 6f 72 20 74 68 65 20 4f 52 44 45 52 20 42 59 0a  or the ORDER BY.
11fb0 20 20 20 20 20 20 2a 2a 20 77 61 73 20 61 6c 6c        ** was all
11fc0 6f 63 61 74 65 64 20 61 62 6f 76 65 2e 20 20 42  ocated above.  B
11fd0 75 74 20 77 65 20 6e 65 65 64 20 74 6f 20 6d 6f  ut we need to mo
11fe0 76 65 20 74 68 65 20 63 6f 6d 70 6f 75 6e 64 20  ve the compound 
11ff0 73 65 6c 65 63 74 0a 20 20 20 20 20 20 2a 2a 20  select.      ** 
12000 65 6e 74 72 69 65 73 20 6f 75 74 20 6f 66 20 74  entries out of t
12010 68 65 20 77 61 79 20 62 65 66 6f 72 65 20 63 6f  he way before co
12020 6e 73 74 72 75 63 74 69 6e 67 20 74 68 65 20 4f  nstructing the O
12030 52 44 45 52 20 42 59 20 65 6e 74 72 69 65 73 2e  RDER BY entries.
12040 0a 20 20 20 20 20 20 2a 2a 20 4d 6f 76 65 20 74  .      ** Move t
12050 68 65 20 63 6f 6d 70 6f 75 6e 64 20 73 65 6c 65  he compound sele
12060 63 74 20 65 6e 74 72 69 65 73 20 69 6e 74 6f 20  ct entries into 
12070 61 43 6f 70 79 5b 5d 20 77 68 65 72 65 20 74 68  aCopy[] where th
12080 65 79 20 63 61 6e 20 62 65 0a 20 20 20 20 20 20  ey can be.      
12090 2a 2a 20 61 63 63 65 73 73 65 64 20 61 6e 64 20  ** accessed and 
120a0 72 65 75 73 65 64 20 77 68 65 6e 20 63 6f 6e 73  reused when cons
120b0 74 72 75 63 74 69 6e 67 20 74 68 65 20 4f 52 44  tructing the ORD
120c0 45 52 20 42 59 20 65 6e 74 72 69 65 73 2e 0a 20  ER BY entries.. 
120d0 20 20 20 20 20 2a 2a 20 42 65 63 61 75 73 65 20       ** Because 
120e0 6e 43 6f 6c 20 6d 69 67 68 74 20 62 65 20 67 72  nCol might be gr
120f0 65 61 74 65 72 20 74 68 61 6e 20 6f 72 20 6c 65  eater than or le
12100 73 73 20 74 68 61 6e 20 6e 4f 72 64 65 72 42 79  ss than nOrderBy
12110 45 78 70 72 0a 20 20 20 20 20 20 2a 2a 20 77 65  Expr.      ** we
12120 20 68 61 76 65 20 74 6f 20 75 73 65 20 6d 65 6d   have to use mem
12130 6d 6f 76 65 28 29 20 77 68 65 6e 20 64 6f 69 6e  move() when doin
12140 67 20 74 68 65 20 63 6f 70 79 2e 0a 20 20 20 20  g the copy..    
12150 20 20 2a 2f 0a 20 20 20 20 20 20 61 43 6f 70 79    */.      aCopy
12160 20 3d 20 26 70 4b 65 79 49 6e 66 6f 2d 3e 61 43   = &pKeyInfo->aC
12170 6f 6c 6c 5b 6e 4f 72 64 65 72 42 79 45 78 70 72  oll[nOrderByExpr
12180 5d 3b 0a 20 20 20 20 20 20 70 53 6f 72 74 4f 72  ];.      pSortOr
12190 64 65 72 20 3d 20 70 4b 65 79 49 6e 66 6f 2d 3e  der = pKeyInfo->
121a0 61 53 6f 72 74 4f 72 64 65 72 20 3d 20 28 75 38  aSortOrder = (u8
121b0 2a 29 26 61 43 6f 70 79 5b 6e 43 6f 6c 5d 3b 0a  *)&aCopy[nCol];.
121c0 20 20 20 20 20 20 6d 65 6d 6d 6f 76 65 28 61 43        memmove(aC
121d0 6f 70 79 2c 20 70 4b 65 79 49 6e 66 6f 2d 3e 61  opy, pKeyInfo->a
121e0 43 6f 6c 6c 2c 20 6e 43 6f 6c 2a 73 69 7a 65 6f  Coll, nCol*sizeo
121f0 66 28 43 6f 6c 6c 53 65 71 2a 29 29 3b 0a 0a 20  f(CollSeq*));.. 
12200 20 20 20 20 20 61 70 43 6f 6c 6c 20 3d 20 70 4b       apColl = pK
12210 65 79 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 3b 0a 20  eyInfo->aColl;. 
12220 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c       for(i=0; i<
12230 6e 4f 72 64 65 72 42 79 45 78 70 72 3b 20 69 2b  nOrderByExpr; i+
12240 2b 2c 20 70 4f 54 65 72 6d 2b 2b 2c 20 61 70 43  +, pOTerm++, apC
12250 6f 6c 6c 2b 2b 2c 20 70 53 6f 72 74 4f 72 64 65  oll++, pSortOrde
12260 72 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 45 78  r++){.        Ex
12270 70 72 20 2a 70 45 78 70 72 20 3d 20 70 4f 54 65  pr *pExpr = pOTe
12280 72 6d 2d 3e 70 45 78 70 72 3b 0a 20 20 20 20 20  rm->pExpr;.     
12290 20 20 20 69 66 28 20 28 70 45 78 70 72 2d 3e 66     if( (pExpr->f
122a0 6c 61 67 73 20 26 20 45 50 5f 45 78 70 43 6f 6c  lags & EP_ExpCol
122b0 6c 61 74 65 29 20 29 7b 0a 20 20 20 20 20 20 20  late) ){.       
122c0 20 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72     assert( pExpr
122d0 2d 3e 70 43 6f 6c 6c 21 3d 30 20 29 3b 0a 20 20  ->pColl!=0 );.  
122e0 20 20 20 20 20 20 20 20 2a 61 70 43 6f 6c 6c 20          *apColl 
122f0 3d 20 70 45 78 70 72 2d 3e 70 43 6f 6c 6c 3b 0a  = pExpr->pColl;.
12300 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
12310 20 20 20 20 20 20 20 20 20 2a 61 70 43 6f 6c 6c           *apColl
12320 20 3d 20 61 43 6f 70 79 5b 70 45 78 70 72 2d 3e   = aCopy[pExpr->
12330 69 43 6f 6c 75 6d 6e 5d 3b 0a 20 20 20 20 20 20  iColumn];.      
12340 20 20 7d 0a 20 20 20 20 20 20 20 20 2a 70 53 6f    }.        *pSo
12350 72 74 4f 72 64 65 72 20 3d 20 70 4f 54 65 72 6d  rtOrder = pOTerm
12360 2d 3e 73 6f 72 74 4f 72 64 65 72 3b 0a 20 20 20  ->sortOrder;.   
12370 20 20 20 7d 0a 20 20 20 20 20 20 61 73 73 65 72     }.      asser
12380 74 28 20 70 2d 3e 70 52 69 67 68 74 6d 6f 73 74  t( p->pRightmost
12390 3d 3d 70 20 29 3b 0a 20 20 20 20 20 20 61 73 73  ==p );.      ass
123a0 65 72 74 28 20 70 2d 3e 61 64 64 72 4f 70 65 6e  ert( p->addrOpen
123b0 45 70 68 6d 5b 32 5d 3e 3d 30 20 29 3b 0a 20 20  Ephm[2]>=0 );.  
123c0 20 20 20 20 61 64 64 72 20 3d 20 70 2d 3e 61 64      addr = p->ad
123d0 64 72 4f 70 65 6e 45 70 68 6d 5b 32 5d 3b 0a 20  drOpenEphm[2];. 
123e0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
123f0 43 68 61 6e 67 65 50 32 28 76 2c 20 61 64 64 72  ChangeP2(v, addr
12400 2c 20 70 2d 3e 70 4f 72 64 65 72 42 79 2d 3e 6e  , p->pOrderBy->n
12410 45 78 70 72 2b 32 29 3b 0a 20 20 20 20 20 20 70  Expr+2);.      p
12420 4b 65 79 49 6e 66 6f 2d 3e 6e 46 69 65 6c 64 20  KeyInfo->nField 
12430 3d 20 6e 4f 72 64 65 72 42 79 45 78 70 72 3b 0a  = nOrderByExpr;.
12440 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
12450 65 43 68 61 6e 67 65 50 34 28 76 2c 20 61 64 64  eChangeP4(v, add
12460 72 2c 20 28 63 68 61 72 2a 29 70 4b 65 79 49 6e  r, (char*)pKeyIn
12470 66 6f 2c 20 50 34 5f 4b 45 59 49 4e 46 4f 5f 48  fo, P4_KEYINFO_H
12480 41 4e 44 4f 46 46 29 3b 0a 20 20 20 20 20 20 70  ANDOFF);.      p
12490 4b 65 79 49 6e 66 6f 20 3d 20 30 3b 0a 20 20 20  KeyInfo = 0;.   
124a0 20 20 20 67 65 6e 65 72 61 74 65 53 6f 72 74 54     generateSortT
124b0 61 69 6c 28 70 50 61 72 73 65 2c 20 70 2c 20 76  ail(pParse, p, v
124c0 2c 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78  , p->pEList->nEx
124d0 70 72 2c 20 26 64 65 73 74 29 3b 0a 20 20 20 20  pr, &dest);.    
124e0 7d 0a 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66  }..    sqlite3_f
124f0 72 65 65 28 70 4b 65 79 49 6e 66 6f 29 3b 0a 20  ree(pKeyInfo);. 
12500 20 7d 0a 0a 6d 75 6c 74 69 5f 73 65 6c 65 63 74   }..multi_select
12510 5f 65 6e 64 3a 0a 20 20 72 65 74 75 72 6e 20 72  _end:.  return r
12520 63 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53  c;.}.#endif /* S
12530 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f 4d 50 4f  QLITE_OMIT_COMPO
12540 55 4e 44 5f 53 45 4c 45 43 54 20 2a 2f 0a 0a 23  UND_SELECT */..#
12550 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
12560 49 54 5f 56 49 45 57 0a 2f 2a 20 46 6f 72 77 61  IT_VIEW./* Forwa
12570 72 64 20 44 65 63 6c 61 72 61 74 69 6f 6e 73 20  rd Declarations 
12580 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73  */.static void s
12590 75 62 73 74 45 78 70 72 4c 69 73 74 28 73 71 6c  ubstExprList(sql
125a0 69 74 65 33 2a 2c 20 45 78 70 72 4c 69 73 74 2a  ite3*, ExprList*
125b0 2c 20 69 6e 74 2c 20 45 78 70 72 4c 69 73 74 2a  , int, ExprList*
125c0 29 3b 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73  );.static void s
125d0 75 62 73 74 53 65 6c 65 63 74 28 73 71 6c 69 74  ubstSelect(sqlit
125e0 65 33 2a 2c 20 53 65 6c 65 63 74 20 2a 2c 20 69  e3*, Select *, i
125f0 6e 74 2c 20 45 78 70 72 4c 69 73 74 20 2a 29 3b  nt, ExprList *);
12600 0a 0a 2f 2a 0a 2a 2a 20 53 63 61 6e 20 74 68 72  ../*.** Scan thr
12610 6f 75 67 68 20 74 68 65 20 65 78 70 72 65 73 73  ough the express
12620 69 6f 6e 20 70 45 78 70 72 2e 20 20 52 65 70 6c  ion pExpr.  Repl
12630 61 63 65 20 65 76 65 72 79 20 72 65 66 65 72 65  ace every refere
12640 6e 63 65 20 74 6f 0a 2a 2a 20 61 20 63 6f 6c 75  nce to.** a colu
12650 6d 6e 20 69 6e 20 74 61 62 6c 65 20 6e 75 6d 62  mn in table numb
12660 65 72 20 69 54 61 62 6c 65 20 77 69 74 68 20 61  er iTable with a
12670 20 63 6f 70 79 20 6f 66 20 74 68 65 20 69 43 6f   copy of the iCo
12680 6c 75 6d 6e 2d 74 68 0a 2a 2a 20 65 6e 74 72 79  lumn-th.** entry
12690 20 69 6e 20 70 45 4c 69 73 74 2e 20 20 28 42 75   in pEList.  (Bu
126a0 74 20 6c 65 61 76 65 20 72 65 66 65 72 65 6e 63  t leave referenc
126b0 65 73 20 74 6f 20 74 68 65 20 52 4f 57 49 44 20  es to the ROWID 
126c0 63 6f 6c 75 6d 6e 20 0a 2a 2a 20 75 6e 63 68 61  column .** uncha
126d0 6e 67 65 64 2e 29 0a 2a 2a 0a 2a 2a 20 54 68 69  nged.).**.** Thi
126e0 73 20 72 6f 75 74 69 6e 65 20 69 73 20 70 61 72  s routine is par
126f0 74 20 6f 66 20 74 68 65 20 66 6c 61 74 74 65 6e  t of the flatten
12700 69 6e 67 20 70 72 6f 63 65 64 75 72 65 2e 20 20  ing procedure.  
12710 41 20 73 75 62 71 75 65 72 79 0a 2a 2a 20 77 68  A subquery.** wh
12720 6f 73 65 20 72 65 73 75 6c 74 20 73 65 74 20 69  ose result set i
12730 73 20 64 65 66 69 6e 65 64 20 62 79 20 70 45 4c  s defined by pEL
12740 69 73 74 20 61 70 70 65 61 72 73 20 61 73 20 65  ist appears as e
12750 6e 74 72 79 20 69 6e 20 74 68 65 0a 2a 2a 20 46  ntry in the.** F
12760 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20 61 20  ROM clause of a 
12770 53 45 4c 45 43 54 20 73 75 63 68 20 74 68 61 74  SELECT such that
12780 20 74 68 65 20 56 44 42 45 20 63 75 72 73 6f 72   the VDBE cursor
12790 20 61 73 73 69 67 6e 65 64 20 74 6f 20 74 68 61   assigned to tha
127a0 74 0a 2a 2a 20 46 4f 52 4d 20 63 6c 61 75 73 65  t.** FORM clause
127b0 20 65 6e 74 72 79 20 69 73 20 69 54 61 62 6c 65   entry is iTable
127c0 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  .  This routine 
127d0 6d 61 6b 65 20 74 68 65 20 6e 65 63 65 73 73 61  make the necessa
127e0 72 79 20 0a 2a 2a 20 63 68 61 6e 67 65 73 20 74  ry .** changes t
127f0 6f 20 70 45 78 70 72 20 73 6f 20 74 68 61 74 20  o pExpr so that 
12800 69 74 20 72 65 66 65 72 73 20 64 69 72 65 63 74  it refers direct
12810 6c 79 20 74 6f 20 74 68 65 20 73 6f 75 72 63 65  ly to the source
12820 20 74 61 62 6c 65 0a 2a 2a 20 6f 66 20 74 68 65   table.** of the
12830 20 73 75 62 71 75 65 72 79 20 72 61 74 68 65 72   subquery rather
12840 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 20   the result set 
12850 6f 66 20 74 68 65 20 73 75 62 71 75 65 72 79 2e  of the subquery.
12860 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
12870 73 75 62 73 74 45 78 70 72 28 0a 20 20 73 71 6c  substExpr(.  sql
12880 69 74 65 33 20 2a 64 62 2c 20 20 20 20 20 20 20  ite3 *db,       
12890 20 2f 2a 20 52 65 70 6f 72 74 20 6d 61 6c 6c 6f   /* Report mallo
128a0 63 20 65 72 72 6f 72 73 20 74 6f 20 74 68 69 73  c errors to this
128b0 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20   connection */. 
128c0 20 45 78 70 72 20 2a 70 45 78 70 72 2c 20 20 20   Expr *pExpr,   
128d0 20 20 20 20 20 2f 2a 20 45 78 70 72 20 69 6e 20       /* Expr in 
128e0 77 68 69 63 68 20 73 75 62 73 74 69 74 75 74 69  which substituti
128f0 6f 6e 20 6f 63 63 75 72 73 20 2a 2f 0a 20 20 69  on occurs */.  i
12900 6e 74 20 69 54 61 62 6c 65 2c 20 20 20 20 20 20  nt iTable,      
12910 20 20 20 2f 2a 20 54 61 62 6c 65 20 74 6f 20 62     /* Table to b
12920 65 20 73 75 62 73 74 69 74 75 74 65 64 20 2a 2f  e substituted */
12930 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c  .  ExprList *pEL
12940 69 73 74 20 20 20 20 2f 2a 20 53 75 62 73 74 69  ist    /* Substi
12950 74 75 74 65 20 65 78 70 72 65 73 73 69 6f 6e 73  tute expressions
12960 20 2a 2f 0a 29 7b 0a 20 20 69 66 28 20 70 45 78   */.){.  if( pEx
12970 70 72 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a  pr==0 ) return;.
12980 20 20 69 66 28 20 70 45 78 70 72 2d 3e 6f 70 3d    if( pExpr->op=
12990 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 26 26 20 70 45  =TK_COLUMN && pE
129a0 78 70 72 2d 3e 69 54 61 62 6c 65 3d 3d 69 54 61  xpr->iTable==iTa
129b0 62 6c 65 20 29 7b 0a 20 20 20 20 69 66 28 20 70  ble ){.    if( p
129c0 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3c 30 20  Expr->iColumn<0 
129d0 29 7b 0a 20 20 20 20 20 20 70 45 78 70 72 2d 3e  ){.      pExpr->
129e0 6f 70 20 3d 20 54 4b 5f 4e 55 4c 4c 3b 0a 20 20  op = TK_NULL;.  
129f0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 45    }else{.      E
12a00 78 70 72 20 2a 70 4e 65 77 3b 0a 20 20 20 20 20  xpr *pNew;.     
12a10 20 61 73 73 65 72 74 28 20 70 45 4c 69 73 74 21   assert( pEList!
12a20 3d 30 20 26 26 20 70 45 78 70 72 2d 3e 69 43 6f  =0 && pExpr->iCo
12a30 6c 75 6d 6e 3c 70 45 4c 69 73 74 2d 3e 6e 45 78  lumn<pEList->nEx
12a40 70 72 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  pr );.      asse
12a50 72 74 28 20 70 45 78 70 72 2d 3e 70 4c 65 66 74  rt( pExpr->pLeft
12a60 3d 3d 30 20 26 26 20 70 45 78 70 72 2d 3e 70 52  ==0 && pExpr->pR
12a70 69 67 68 74 3d 3d 30 20 26 26 20 70 45 78 70 72  ight==0 && pExpr
12a80 2d 3e 70 4c 69 73 74 3d 3d 30 20 29 3b 0a 20 20  ->pList==0 );.  
12a90 20 20 20 20 70 4e 65 77 20 3d 20 70 45 4c 69 73      pNew = pELis
12aa0 74 2d 3e 61 5b 70 45 78 70 72 2d 3e 69 43 6f 6c  t->a[pExpr->iCol
12ab0 75 6d 6e 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20  umn].pExpr;.    
12ac0 20 20 61 73 73 65 72 74 28 20 70 4e 65 77 21 3d    assert( pNew!=
12ad0 30 20 29 3b 0a 20 20 20 20 20 20 70 45 78 70 72  0 );.      pExpr
12ae0 2d 3e 6f 70 20 3d 20 70 4e 65 77 2d 3e 6f 70 3b  ->op = pNew->op;
12af0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
12b00 45 78 70 72 2d 3e 70 4c 65 66 74 3d 3d 30 20 29  Expr->pLeft==0 )
12b10 3b 0a 20 20 20 20 20 20 70 45 78 70 72 2d 3e 70  ;.      pExpr->p
12b20 4c 65 66 74 20 3d 20 73 71 6c 69 74 65 33 45 78  Left = sqlite3Ex
12b30 70 72 44 75 70 28 64 62 2c 20 70 4e 65 77 2d 3e  prDup(db, pNew->
12b40 70 4c 65 66 74 29 3b 0a 20 20 20 20 20 20 61 73  pLeft);.      as
12b50 73 65 72 74 28 20 70 45 78 70 72 2d 3e 70 52 69  sert( pExpr->pRi
12b60 67 68 74 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  ght==0 );.      
12b70 70 45 78 70 72 2d 3e 70 52 69 67 68 74 20 3d 20  pExpr->pRight = 
12b80 73 71 6c 69 74 65 33 45 78 70 72 44 75 70 28 64  sqlite3ExprDup(d
12b90 62 2c 20 70 4e 65 77 2d 3e 70 52 69 67 68 74 29  b, pNew->pRight)
12ba0 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
12bb0 70 45 78 70 72 2d 3e 70 4c 69 73 74 3d 3d 30 20  pExpr->pList==0 
12bc0 29 3b 0a 20 20 20 20 20 20 70 45 78 70 72 2d 3e  );.      pExpr->
12bd0 70 4c 69 73 74 20 3d 20 73 71 6c 69 74 65 33 45  pList = sqlite3E
12be0 78 70 72 4c 69 73 74 44 75 70 28 64 62 2c 20 70  xprListDup(db, p
12bf0 4e 65 77 2d 3e 70 4c 69 73 74 29 3b 0a 20 20 20  New->pList);.   
12c00 20 20 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65     pExpr->iTable
12c10 20 3d 20 70 4e 65 77 2d 3e 69 54 61 62 6c 65 3b   = pNew->iTable;
12c20 0a 20 20 20 20 20 20 70 45 78 70 72 2d 3e 70 54  .      pExpr->pT
12c30 61 62 20 3d 20 70 4e 65 77 2d 3e 70 54 61 62 3b  ab = pNew->pTab;
12c40 0a 20 20 20 20 20 20 70 45 78 70 72 2d 3e 69 43  .      pExpr->iC
12c50 6f 6c 75 6d 6e 20 3d 20 70 4e 65 77 2d 3e 69 43  olumn = pNew->iC
12c60 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20 20 70 45 78  olumn;.      pEx
12c70 70 72 2d 3e 69 41 67 67 20 3d 20 70 4e 65 77 2d  pr->iAgg = pNew-
12c80 3e 69 41 67 67 3b 0a 20 20 20 20 20 20 73 71 6c  >iAgg;.      sql
12c90 69 74 65 33 54 6f 6b 65 6e 43 6f 70 79 28 64 62  ite3TokenCopy(db
12ca0 2c 20 26 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2c  , &pExpr->token,
12cb0 20 26 70 4e 65 77 2d 3e 74 6f 6b 65 6e 29 3b 0a   &pNew->token);.
12cc0 20 20 20 20 20 20 73 71 6c 69 74 65 33 54 6f 6b        sqlite3Tok
12cd0 65 6e 43 6f 70 79 28 64 62 2c 20 26 70 45 78 70  enCopy(db, &pExp
12ce0 72 2d 3e 73 70 61 6e 2c 20 26 70 4e 65 77 2d 3e  r->span, &pNew->
12cf0 73 70 61 6e 29 3b 0a 20 20 20 20 20 20 70 45 78  span);.      pEx
12d00 70 72 2d 3e 70 53 65 6c 65 63 74 20 3d 20 73 71  pr->pSelect = sq
12d10 6c 69 74 65 33 53 65 6c 65 63 74 44 75 70 28 64  lite3SelectDup(d
12d20 62 2c 20 70 4e 65 77 2d 3e 70 53 65 6c 65 63 74  b, pNew->pSelect
12d30 29 3b 0a 20 20 20 20 20 20 70 45 78 70 72 2d 3e  );.      pExpr->
12d40 66 6c 61 67 73 20 3d 20 70 4e 65 77 2d 3e 66 6c  flags = pNew->fl
12d50 61 67 73 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c  ags;.    }.  }el
12d60 73 65 7b 0a 20 20 20 20 73 75 62 73 74 45 78 70  se{.    substExp
12d70 72 28 64 62 2c 20 70 45 78 70 72 2d 3e 70 4c 65  r(db, pExpr->pLe
12d80 66 74 2c 20 69 54 61 62 6c 65 2c 20 70 45 4c 69  ft, iTable, pELi
12d90 73 74 29 3b 0a 20 20 20 20 73 75 62 73 74 45 78  st);.    substEx
12da0 70 72 28 64 62 2c 20 70 45 78 70 72 2d 3e 70 52  pr(db, pExpr->pR
12db0 69 67 68 74 2c 20 69 54 61 62 6c 65 2c 20 70 45  ight, iTable, pE
12dc0 4c 69 73 74 29 3b 0a 20 20 20 20 73 75 62 73 74  List);.    subst
12dd0 53 65 6c 65 63 74 28 64 62 2c 20 70 45 78 70 72  Select(db, pExpr
12de0 2d 3e 70 53 65 6c 65 63 74 2c 20 69 54 61 62 6c  ->pSelect, iTabl
12df0 65 2c 20 70 45 4c 69 73 74 29 3b 0a 20 20 20 20  e, pEList);.    
12e00 73 75 62 73 74 45 78 70 72 4c 69 73 74 28 64 62  substExprList(db
12e10 2c 20 70 45 78 70 72 2d 3e 70 4c 69 73 74 2c 20  , pExpr->pList, 
12e20 69 54 61 62 6c 65 2c 20 70 45 4c 69 73 74 29 3b  iTable, pEList);
12e30 0a 20 20 7d 0a 7d 0a 73 74 61 74 69 63 20 76 6f  .  }.}.static vo
12e40 69 64 20 73 75 62 73 74 45 78 70 72 4c 69 73 74  id substExprList
12e50 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c  (.  sqlite3 *db,
12e60 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 70 6f           /* Repo
12e70 72 74 20 6d 61 6c 6c 6f 63 20 65 72 72 6f 72 73  rt malloc errors
12e80 20 68 65 72 65 20 2a 2f 0a 20 20 45 78 70 72 4c   here */.  ExprL
12e90 69 73 74 20 2a 70 4c 69 73 74 2c 20 20 20 20 20  ist *pList,     
12ea0 2f 2a 20 4c 69 73 74 20 74 6f 20 73 63 61 6e 20  /* List to scan 
12eb0 61 6e 64 20 69 6e 20 77 68 69 63 68 20 74 6f 20  and in which to 
12ec0 6d 61 6b 65 20 73 75 62 73 74 69 74 75 74 65 73  make substitutes
12ed0 20 2a 2f 0a 20 20 69 6e 74 20 69 54 61 62 6c 65   */.  int iTable
12ee0 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 61  ,          /* Ta
12ef0 62 6c 65 20 74 6f 20 62 65 20 73 75 62 73 74 69  ble to be substi
12f00 74 75 74 65 64 20 2a 2f 0a 20 20 45 78 70 72 4c  tuted */.  ExprL
12f10 69 73 74 20 2a 70 45 4c 69 73 74 20 20 20 20 20  ist *pEList     
12f20 2f 2a 20 53 75 62 73 74 69 74 75 74 65 20 76 61  /* Substitute va
12f30 6c 75 65 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  lues */.){.  int
12f40 20 69 3b 0a 20 20 69 66 28 20 70 4c 69 73 74 3d   i;.  if( pList=
12f50 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 66  =0 ) return;.  f
12f60 6f 72 28 69 3d 30 3b 20 69 3c 70 4c 69 73 74 2d  or(i=0; i<pList-
12f70 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20  >nExpr; i++){.  
12f80 20 20 73 75 62 73 74 45 78 70 72 28 64 62 2c 20    substExpr(db, 
12f90 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70  pList->a[i].pExp
12fa0 72 2c 20 69 54 61 62 6c 65 2c 20 70 45 4c 69 73  r, iTable, pELis
12fb0 74 29 3b 0a 20 20 7d 0a 7d 0a 73 74 61 74 69 63  t);.  }.}.static
12fc0 20 76 6f 69 64 20 73 75 62 73 74 53 65 6c 65 63   void substSelec
12fd0 74 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  t(.  sqlite3 *db
12fe0 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 70  ,         /* Rep
12ff0 6f 72 74 20 6d 61 6c 6c 6f 63 20 65 72 72 6f 72  ort malloc error
13000 73 20 68 65 72 65 20 2a 2f 0a 20 20 53 65 6c 65  s here */.  Sele
13010 63 74 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20  ct *p,          
13020 20 2f 2a 20 53 45 4c 45 43 54 20 73 74 61 74 65   /* SELECT state
13030 6d 65 6e 74 20 69 6e 20 77 68 69 63 68 20 74 6f  ment in which to
13040 20 6d 61 6b 65 20 73 75 62 73 74 69 74 75 74 69   make substituti
13050 6f 6e 73 20 2a 2f 0a 20 20 69 6e 74 20 69 54 61  ons */.  int iTa
13060 62 6c 65 2c 20 20 20 20 20 20 20 20 20 20 2f 2a  ble,          /*
13070 20 54 61 62 6c 65 20 74 6f 20 62 65 20 72 65 70   Table to be rep
13080 6c 61 63 65 64 20 2a 2f 0a 20 20 45 78 70 72 4c  laced */.  ExprL
13090 69 73 74 20 2a 70 45 4c 69 73 74 20 20 20 20 20  ist *pEList     
130a0 2f 2a 20 53 75 62 73 74 69 74 75 74 65 20 76 61  /* Substitute va
130b0 6c 75 65 73 20 2a 2f 0a 29 7b 0a 20 20 69 66 28  lues */.){.  if(
130c0 20 21 70 20 29 20 72 65 74 75 72 6e 3b 0a 20 20   !p ) return;.  
130d0 73 75 62 73 74 45 78 70 72 4c 69 73 74 28 64 62  substExprList(db
130e0 2c 20 70 2d 3e 70 45 4c 69 73 74 2c 20 69 54 61  , p->pEList, iTa
130f0 62 6c 65 2c 20 70 45 4c 69 73 74 29 3b 0a 20 20  ble, pEList);.  
13100 73 75 62 73 74 45 78 70 72 4c 69 73 74 28 64 62  substExprList(db
13110 2c 20 70 2d 3e 70 47 72 6f 75 70 42 79 2c 20 69  , p->pGroupBy, i
13120 54 61 62 6c 65 2c 20 70 45 4c 69 73 74 29 3b 0a  Table, pEList);.
13130 20 20 73 75 62 73 74 45 78 70 72 4c 69 73 74 28    substExprList(
13140 64 62 2c 20 70 2d 3e 70 4f 72 64 65 72 42 79 2c  db, p->pOrderBy,
13150 20 69 54 61 62 6c 65 2c 20 70 45 4c 69 73 74 29   iTable, pEList)
13160 3b 0a 20 20 73 75 62 73 74 45 78 70 72 28 64 62  ;.  substExpr(db
13170 2c 20 70 2d 3e 70 48 61 76 69 6e 67 2c 20 69 54  , p->pHaving, iT
13180 61 62 6c 65 2c 20 70 45 4c 69 73 74 29 3b 0a 20  able, pEList);. 
13190 20 73 75 62 73 74 45 78 70 72 28 64 62 2c 20 70   substExpr(db, p
131a0 2d 3e 70 57 68 65 72 65 2c 20 69 54 61 62 6c 65  ->pWhere, iTable
131b0 2c 20 70 45 4c 69 73 74 29 3b 0a 20 20 73 75 62  , pEList);.  sub
131c0 73 74 53 65 6c 65 63 74 28 64 62 2c 20 70 2d 3e  stSelect(db, p->
131d0 70 50 72 69 6f 72 2c 20 69 54 61 62 6c 65 2c 20  pPrior, iTable, 
131e0 70 45 4c 69 73 74 29 3b 0a 7d 0a 23 65 6e 64 69  pEList);.}.#endi
131f0 66 20 2f 2a 20 21 64 65 66 69 6e 65 64 28 53 51  f /* !defined(SQ
13200 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 29 20  LITE_OMIT_VIEW) 
13210 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  */..#ifndef SQLI
13220 54 45 5f 4f 4d 49 54 5f 56 49 45 57 0a 2f 2a 0a  TE_OMIT_VIEW./*.
13230 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
13240 61 74 74 65 6d 70 74 73 20 74 6f 20 66 6c 61 74  attempts to flat
13250 74 65 6e 20 73 75 62 71 75 65 72 69 65 73 20 69  ten subqueries i
13260 6e 20 6f 72 64 65 72 20 74 6f 20 73 70 65 65 64  n order to speed
13270 0a 2a 2a 20 65 78 65 63 75 74 69 6f 6e 2e 20 20  .** execution.  
13280 49 74 20 72 65 74 75 72 6e 73 20 31 20 69 66 20  It returns 1 if 
13290 69 74 20 6d 61 6b 65 73 20 63 68 61 6e 67 65 73  it makes changes
132a0 20 61 6e 64 20 30 20 69 66 20 6e 6f 20 66 6c 61   and 0 if no fla
132b0 74 74 65 6e 69 6e 67 0a 2a 2a 20 6f 63 63 75 72  ttening.** occur
132c0 73 2e 0a 2a 2a 0a 2a 2a 20 54 6f 20 75 6e 64 65  s..**.** To unde
132d0 72 73 74 61 6e 64 20 74 68 65 20 63 6f 6e 63 65  rstand the conce
132e0 70 74 20 6f 66 20 66 6c 61 74 74 65 6e 69 6e 67  pt of flattening
132f0 2c 20 63 6f 6e 73 69 64 65 72 20 74 68 65 20 66  , consider the f
13300 6f 6c 6c 6f 77 69 6e 67 0a 2a 2a 20 71 75 65 72  ollowing.** quer
13310 79 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 45 4c  y:.**.**     SEL
13320 45 43 54 20 61 20 46 52 4f 4d 20 28 53 45 4c 45  ECT a FROM (SELE
13330 43 54 20 78 2b 79 20 41 53 20 61 20 46 52 4f 4d  CT x+y AS a FROM
13340 20 74 31 20 57 48 45 52 45 20 7a 3c 31 30 30 29   t1 WHERE z<100)
13350 20 57 48 45 52 45 20 61 3e 35 0a 2a 2a 0a 2a 2a   WHERE a>5.**.**
13360 20 54 68 65 20 64 65 66 61 75 6c 74 20 77 61 79   The default way
13370 20 6f 66 20 69 6d 70 6c 65 6d 65 6e 74 69 6e 67   of implementing
13380 20 74 68 69 73 20 71 75 65 72 79 20 69 73 20 74   this query is t
13390 6f 20 65 78 65 63 75 74 65 20 74 68 65 0a 2a 2a  o execute the.**
133a0 20 73 75 62 71 75 65 72 79 20 66 69 72 73 74 20   subquery first 
133b0 61 6e 64 20 73 74 6f 72 65 20 74 68 65 20 72 65  and store the re
133c0 73 75 6c 74 73 20 69 6e 20 61 20 74 65 6d 70 6f  sults in a tempo
133d0 72 61 72 79 20 74 61 62 6c 65 2c 20 74 68 65 6e  rary table, then
133e0 0a 2a 2a 20 72 75 6e 20 74 68 65 20 6f 75 74 65  .** run the oute
133f0 72 20 71 75 65 72 79 20 6f 6e 20 74 68 61 74 20  r query on that 
13400 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 2e  temporary table.
13410 20 20 54 68 69 73 20 72 65 71 75 69 72 65 73 20    This requires 
13420 74 77 6f 0a 2a 2a 20 70 61 73 73 65 73 20 6f 76  two.** passes ov
13430 65 72 20 74 68 65 20 64 61 74 61 2e 20 20 46 75  er the data.  Fu
13440 72 74 68 65 72 6d 6f 72 65 2c 20 62 65 63 61 75  rthermore, becau
13450 73 65 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79  se the temporary
13460 20 74 61 62 6c 65 0a 2a 2a 20 68 61 73 20 6e 6f   table.** has no
13470 20 69 6e 64 69 63 65 73 2c 20 74 68 65 20 57 48   indices, the WH
13480 45 52 45 20 63 6c 61 75 73 65 20 6f 6e 20 74 68  ERE clause on th
13490 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 63 61  e outer query ca
134a0 6e 6e 6f 74 20 62 65 0a 2a 2a 20 6f 70 74 69 6d  nnot be.** optim
134b0 69 7a 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  ized..**.** This
134c0 20 72 6f 75 74 69 6e 65 20 61 74 74 65 6d 70 74   routine attempt
134d0 73 20 74 6f 20 72 65 77 72 69 74 65 20 71 75 65  s to rewrite que
134e0 72 69 65 73 20 73 75 63 68 20 61 73 20 74 68 65  ries such as the
134f0 20 61 62 6f 76 65 20 69 6e 74 6f 0a 2a 2a 20 61   above into.** a
13500 20 73 69 6e 67 6c 65 20 66 6c 61 74 20 73 65 6c   single flat sel
13510 65 63 74 2c 20 6c 69 6b 65 20 74 68 69 73 3a 0a  ect, like this:.
13520 2a 2a 0a 2a 2a 20 20 20 20 20 53 45 4c 45 43 54  **.**     SELECT
13530 20 78 2b 79 20 41 53 20 61 20 46 52 4f 4d 20 74   x+y AS a FROM t
13540 31 20 57 48 45 52 45 20 7a 3c 31 30 30 20 41 4e  1 WHERE z<100 AN
13550 44 20 61 3e 35 0a 2a 2a 0a 2a 2a 20 54 68 65 20  D a>5.**.** The 
13560 63 6f 64 65 20 67 65 6e 65 72 61 74 65 64 20 66  code generated f
13570 6f 72 20 74 68 69 73 20 73 69 6d 70 69 66 69 63  or this simpific
13580 61 74 69 6f 6e 20 67 69 76 65 73 20 74 68 65 20  ation gives the 
13590 73 61 6d 65 20 72 65 73 75 6c 74 0a 2a 2a 20 62  same result.** b
135a0 75 74 20 6f 6e 6c 79 20 68 61 73 20 74 6f 20 73  ut only has to s
135b0 63 61 6e 20 74 68 65 20 64 61 74 61 20 6f 6e 63  can the data onc
135c0 65 2e 20 20 41 6e 64 20 62 65 63 61 75 73 65 20  e.  And because 
135d0 69 6e 64 69 63 65 73 20 6d 69 67 68 74 20 0a 2a  indices might .*
135e0 2a 20 65 78 69 73 74 20 6f 6e 20 74 68 65 20 74  * exist on the t
135f0 61 62 6c 65 20 74 31 2c 20 61 20 63 6f 6d 70 6c  able t1, a compl
13600 65 74 65 20 73 63 61 6e 20 6f 66 20 74 68 65 20  ete scan of the 
13610 64 61 74 61 20 6d 69 67 68 74 20 62 65 0a 2a 2a  data might be.**
13620 20 61 76 6f 69 64 65 64 2e 0a 2a 2a 0a 2a 2a 20   avoided..**.** 
13630 46 6c 61 74 74 65 6e 69 6e 67 20 69 73 20 6f 6e  Flattening is on
13640 6c 79 20 61 74 74 65 6d 70 74 65 64 20 69 66 20  ly attempted if 
13650 61 6c 6c 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f  all of the follo
13660 77 69 6e 67 20 61 72 65 20 74 72 75 65 3a 0a 2a  wing are true:.*
13670 2a 0a 2a 2a 20 20 20 28 31 29 20 20 54 68 65 20  *.**   (1)  The 
13680 73 75 62 71 75 65 72 79 20 61 6e 64 20 74 68 65  subquery and the
13690 20 6f 75 74 65 72 20 71 75 65 72 79 20 64 6f 20   outer query do 
136a0 6e 6f 74 20 62 6f 74 68 20 75 73 65 20 61 67 67  not both use agg
136b0 72 65 67 61 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 20  regates..**.**  
136c0 20 28 32 29 20 20 54 68 65 20 73 75 62 71 75 65   (2)  The subque
136d0 72 79 20 69 73 20 6e 6f 74 20 61 6e 20 61 67 67  ry is not an agg
136e0 72 65 67 61 74 65 20 6f 72 20 74 68 65 20 6f 75  regate or the ou
136f0 74 65 72 20 71 75 65 72 79 20 69 73 20 6e 6f 74  ter query is not
13700 20 61 20 6a 6f 69 6e 2e 0a 2a 2a 0a 2a 2a 20 20   a join..**.**  
13710 20 28 33 29 20 20 54 68 65 20 73 75 62 71 75 65   (3)  The subque
13720 72 79 20 69 73 20 6e 6f 74 20 74 68 65 20 72 69  ry is not the ri
13730 67 68 74 20 6f 70 65 72 61 6e 64 20 6f 66 20 61  ght operand of a
13740 20 6c 65 66 74 20 6f 75 74 65 72 20 6a 6f 69 6e   left outer join
13750 2c 20 6f 72 0a 2a 2a 20 20 20 20 20 20 20 20 74  , or.**        t
13760 68 65 20 73 75 62 71 75 65 72 79 20 69 73 20 6e  he subquery is n
13770 6f 74 20 69 74 73 65 6c 66 20 61 20 6a 6f 69 6e  ot itself a join
13780 2e 20 20 28 54 69 63 6b 65 74 20 23 33 30 36 29  .  (Ticket #306)
13790 0a 2a 2a 0a 2a 2a 20 20 20 28 34 29 20 20 54 68  .**.**   (4)  Th
137a0 65 20 73 75 62 71 75 65 72 79 20 69 73 20 6e 6f  e subquery is no
137b0 74 20 44 49 53 54 49 4e 43 54 20 6f 72 20 74 68  t DISTINCT or th
137c0 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 69 73  e outer query is
137d0 20 6e 6f 74 20 61 20 6a 6f 69 6e 2e 0a 2a 2a 0a   not a join..**.
137e0 2a 2a 20 20 20 28 35 29 20 20 54 68 65 20 73 75  **   (5)  The su
137f0 62 71 75 65 72 79 20 69 73 20 6e 6f 74 20 44 49  bquery is not DI
13800 53 54 49 4e 43 54 20 6f 72 20 74 68 65 20 6f 75  STINCT or the ou
13810 74 65 72 20 71 75 65 72 79 20 64 6f 65 73 20 6e  ter query does n
13820 6f 74 20 75 73 65 0a 2a 2a 20 20 20 20 20 20 20  ot use.**       
13830 20 61 67 67 72 65 67 61 74 65 73 2e 0a 2a 2a 0a   aggregates..**.
13840 2a 2a 20 20 20 28 36 29 20 20 54 68 65 20 73 75  **   (6)  The su
13850 62 71 75 65 72 79 20 64 6f 65 73 20 6e 6f 74 20  bquery does not 
13860 75 73 65 20 61 67 67 72 65 67 61 74 65 73 20 6f  use aggregates o
13870 72 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72  r the outer quer
13880 79 20 69 73 20 6e 6f 74 0a 2a 2a 20 20 20 20 20  y is not.**     
13890 20 20 20 44 49 53 54 49 4e 43 54 2e 0a 2a 2a 0a     DISTINCT..**.
138a0 2a 2a 20 20 20 28 37 29 20 20 54 68 65 20 73 75  **   (7)  The su
138b0 62 71 75 65 72 79 20 68 61 73 20 61 20 46 52 4f  bquery has a FRO
138c0 4d 20 63 6c 61 75 73 65 2e 0a 2a 2a 0a 2a 2a 20  M clause..**.** 
138d0 20 20 28 38 29 20 20 54 68 65 20 73 75 62 71 75    (8)  The subqu
138e0 65 72 79 20 64 6f 65 73 20 6e 6f 74 20 75 73 65  ery does not use
138f0 20 4c 49 4d 49 54 20 6f 72 20 74 68 65 20 6f 75   LIMIT or the ou
13900 74 65 72 20 71 75 65 72 79 20 69 73 20 6e 6f 74  ter query is not
13910 20 61 20 6a 6f 69 6e 2e 0a 2a 2a 0a 2a 2a 20 20   a join..**.**  
13920 20 28 39 29 20 20 54 68 65 20 73 75 62 71 75 65   (9)  The subque
13930 72 79 20 64 6f 65 73 20 6e 6f 74 20 75 73 65 20  ry does not use 
13940 4c 49 4d 49 54 20 6f 72 20 74 68 65 20 6f 75 74  LIMIT or the out
13950 65 72 20 71 75 65 72 79 20 64 6f 65 73 20 6e 6f  er query does no
13960 74 20 75 73 65 0a 2a 2a 20 20 20 20 20 20 20 20  t use.**        
13970 61 67 67 72 65 67 61 74 65 73 2e 0a 2a 2a 0a 2a  aggregates..**.*
13980 2a 20 20 28 31 30 29 20 20 54 68 65 20 73 75 62  *  (10)  The sub
13990 71 75 65 72 79 20 64 6f 65 73 20 6e 6f 74 20 75  query does not u
139a0 73 65 20 61 67 67 72 65 67 61 74 65 73 20 6f 72  se aggregates or
139b0 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79   the outer query
139c0 20 64 6f 65 73 20 6e 6f 74 0a 2a 2a 20 20 20 20   does not.**    
139d0 20 20 20 20 75 73 65 20 4c 49 4d 49 54 2e 0a 2a      use LIMIT..*
139e0 2a 0a 2a 2a 20 20 28 31 31 29 20 20 54 68 65 20  *.**  (11)  The 
139f0 73 75 62 71 75 65 72 79 20 61 6e 64 20 74 68 65  subquery and the
13a00 20 6f 75 74 65 72 20 71 75 65 72 79 20 64 6f 20   outer query do 
13a10 6e 6f 74 20 62 6f 74 68 20 68 61 76 65 20 4f 52  not both have OR
13a20 44 45 52 20 42 59 20 63 6c 61 75 73 65 73 2e 0a  DER BY clauses..
13a30 2a 2a 0a 2a 2a 20 20 28 31 32 29 20 20 54 68 65  **.**  (12)  The
13a40 20 73 75 62 71 75 65 72 79 20 69 73 20 6e 6f 74   subquery is not
13a50 20 74 68 65 20 72 69 67 68 74 20 74 65 72 6d 20   the right term 
13a60 6f 66 20 61 20 4c 45 46 54 20 4f 55 54 45 52 20  of a LEFT OUTER 
13a70 4a 4f 49 4e 20 6f 72 20 74 68 65 0a 2a 2a 20 20  JOIN or the.**  
13a80 20 20 20 20 20 20 73 75 62 71 75 65 72 79 20 68        subquery h
13a90 61 73 20 6e 6f 20 57 48 45 52 45 20 63 6c 61 75  as no WHERE clau
13aa0 73 65 2e 20 20 28 61 64 64 65 64 20 62 79 20 74  se.  (added by t
13ab0 69 63 6b 65 74 20 23 33 35 30 29 0a 2a 2a 0a 2a  icket #350).**.*
13ac0 2a 20 20 28 31 33 29 20 20 54 68 65 20 73 75 62  *  (13)  The sub
13ad0 71 75 65 72 79 20 61 6e 64 20 6f 75 74 65 72 20  query and outer 
13ae0 71 75 65 72 79 20 64 6f 20 6e 6f 74 20 62 6f 74  query do not bot
13af0 68 20 75 73 65 20 4c 49 4d 49 54 0a 2a 2a 0a 2a  h use LIMIT.**.*
13b00 2a 20 20 28 31 34 29 20 20 54 68 65 20 73 75 62  *  (14)  The sub
13b10 71 75 65 72 79 20 64 6f 65 73 20 6e 6f 74 20 75  query does not u
13b20 73 65 20 4f 46 46 53 45 54 0a 2a 2a 0a 2a 2a 20  se OFFSET.**.** 
13b30 20 28 31 35 29 20 20 54 68 65 20 6f 75 74 65 72   (15)  The outer
13b40 20 71 75 65 72 79 20 69 73 20 6e 6f 74 20 70 61   query is not pa
13b50 72 74 20 6f 66 20 61 20 63 6f 6d 70 6f 75 6e 64  rt of a compound
13b60 20 73 65 6c 65 63 74 20 6f 72 20 74 68 65 0a 2a   select or the.*
13b70 2a 20 20 20 20 20 20 20 20 73 75 62 71 75 65 72  *        subquer
13b80 79 20 64 6f 65 73 20 6e 6f 74 20 68 61 76 65 20  y does not have 
13b90 62 6f 74 68 20 61 6e 20 4f 52 44 45 52 20 42 59  both an ORDER BY
13ba0 20 61 6e 64 20 61 20 4c 49 4d 49 54 20 63 6c 61   and a LIMIT cla
13bb0 75 73 65 2e 0a 2a 2a 20 20 20 20 20 20 20 20 28  use..**        (
13bc0 53 65 65 20 74 69 63 6b 65 74 20 23 32 33 33 39  See ticket #2339
13bd0 29 0a 2a 2a 0a 2a 2a 20 49 6e 20 74 68 69 73 20  ).**.** In this 
13be0 72 6f 75 74 69 6e 65 2c 20 74 68 65 20 22 70 22  routine, the "p"
13bf0 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 61 20   parameter is a 
13c00 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 6f  pointer to the o
13c10 75 74 65 72 20 71 75 65 72 79 2e 0a 2a 2a 20 54  uter query..** T
13c20 68 65 20 73 75 62 71 75 65 72 79 20 69 73 20 70  he subquery is p
13c30 2d 3e 70 53 72 63 2d 3e 61 5b 69 46 72 6f 6d 5d  ->pSrc->a[iFrom]
13c40 2e 20 20 69 73 41 67 67 20 69 73 20 74 72 75 65  .  isAgg is true
13c50 20 69 66 20 74 68 65 20 6f 75 74 65 72 20 71 75   if the outer qu
13c60 65 72 79 0a 2a 2a 20 75 73 65 73 20 61 67 67 72  ery.** uses aggr
13c70 65 67 61 74 65 73 20 61 6e 64 20 73 75 62 71 75  egates and subqu
13c80 65 72 79 49 73 41 67 67 20 69 73 20 74 72 75 65  eryIsAgg is true
13c90 20 69 66 20 74 68 65 20 73 75 62 71 75 65 72 79   if the subquery
13ca0 20 75 73 65 73 20 61 67 67 72 65 67 61 74 65 73   uses aggregates
13cb0 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 66 6c 61 74 74  ..**.** If flatt
13cc0 65 6e 69 6e 67 20 69 73 20 6e 6f 74 20 61 74 74  ening is not att
13cd0 65 6d 70 74 65 64 2c 20 74 68 69 73 20 72 6f 75  empted, this rou
13ce0 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70 20  tine is a no-op 
13cf0 61 6e 64 20 72 65 74 75 72 6e 73 20 30 2e 0a 2a  and returns 0..*
13d00 2a 20 49 66 20 66 6c 61 74 74 65 6e 69 6e 67 20  * If flattening 
13d10 69 73 20 61 74 74 65 6d 70 74 65 64 20 74 68 69  is attempted thi
13d20 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e  s routine return
13d30 73 20 31 2e 0a 2a 2a 0a 2a 2a 20 41 6c 6c 20 6f  s 1..**.** All o
13d40 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  f the expression
13d50 20 61 6e 61 6c 79 73 69 73 20 6d 75 73 74 20 6f   analysis must o
13d60 63 63 75 72 20 6f 6e 20 62 6f 74 68 20 74 68 65  ccur on both the
13d70 20 6f 75 74 65 72 20 71 75 65 72 79 20 61 6e 64   outer query and
13d80 0a 2a 2a 20 74 68 65 20 73 75 62 71 75 65 72 79  .** the subquery
13d90 20 62 65 66 6f 72 65 20 74 68 69 73 20 72 6f 75   before this rou
13da0 74 69 6e 65 20 72 75 6e 73 2e 0a 2a 2f 0a 73 74  tine runs..*/.st
13db0 61 74 69 63 20 69 6e 74 20 66 6c 61 74 74 65 6e  atic int flatten
13dc0 53 75 62 71 75 65 72 79 28 0a 20 20 73 71 6c 69  Subquery(.  sqli
13dd0 74 65 33 20 2a 64 62 2c 20 20 20 20 20 20 20 20  te3 *db,        
13de0 20 2f 2a 20 44 61 74 61 62 61 73 65 20 63 6f 6e   /* Database con
13df0 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 53 65 6c  nection */.  Sel
13e00 65 63 74 20 2a 70 2c 20 20 20 20 20 20 20 20 20  ect *p,         
13e10 20 20 2f 2a 20 54 68 65 20 70 61 72 65 6e 74 20    /* The parent 
13e20 6f 72 20 6f 75 74 65 72 20 53 45 4c 45 43 54 20  or outer SELECT 
13e30 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 69  statement */.  i
13e40 6e 74 20 69 46 72 6f 6d 2c 20 20 20 20 20 20 20  nt iFrom,       
13e50 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 69 6e 20      /* Index in 
13e60 70 2d 3e 70 53 72 63 2d 3e 61 5b 5d 20 6f 66 20  p->pSrc->a[] of 
13e70 74 68 65 20 69 6e 6e 65 72 20 73 75 62 71 75 65  the inner subque
13e80 72 79 20 2a 2f 0a 20 20 69 6e 74 20 69 73 41 67  ry */.  int isAg
13e90 67 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  g,           /* 
13ea0 54 72 75 65 20 69 66 20 6f 75 74 65 72 20 53 45  True if outer SE
13eb0 4c 45 43 54 20 75 73 65 73 20 61 67 67 72 65 67  LECT uses aggreg
13ec0 61 74 65 20 66 75 6e 63 74 69 6f 6e 73 20 2a 2f  ate functions */
13ed0 0a 20 20 69 6e 74 20 73 75 62 71 75 65 72 79 49  .  int subqueryI
13ee0 73 41 67 67 20 20 20 20 2f 2a 20 54 72 75 65 20  sAgg    /* True 
13ef0 69 66 20 74 68 65 20 73 75 62 71 75 65 72 79 20  if the subquery 
13f00 75 73 65 73 20 61 67 67 72 65 67 61 74 65 20 66  uses aggregate f
13f10 75 6e 63 74 69 6f 6e 73 20 2a 2f 0a 29 7b 0a 20  unctions */.){. 
13f20 20 53 65 6c 65 63 74 20 2a 70 53 75 62 3b 20 20   Select *pSub;  
13f30 20 20 20 20 20 2f 2a 20 54 68 65 20 69 6e 6e 65       /* The inne
13f40 72 20 71 75 65 72 79 20 6f 72 20 22 73 75 62 71  r query or "subq
13f50 75 65 72 79 22 20 2a 2f 0a 20 20 53 72 63 4c 69  uery" */.  SrcLi
13f60 73 74 20 2a 70 53 72 63 3b 20 20 20 20 20 20 2f  st *pSrc;      /
13f70 2a 20 54 68 65 20 46 52 4f 4d 20 63 6c 61 75 73  * The FROM claus
13f80 65 20 6f 66 20 74 68 65 20 6f 75 74 65 72 20 71  e of the outer q
13f90 75 65 72 79 20 2a 2f 0a 20 20 53 72 63 4c 69 73  uery */.  SrcLis
13fa0 74 20 2a 70 53 75 62 53 72 63 3b 20 20 20 2f 2a  t *pSubSrc;   /*
13fb0 20 54 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65   The FROM clause
13fc0 20 6f 66 20 74 68 65 20 73 75 62 71 75 65 72 79   of the subquery
13fd0 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a   */.  ExprList *
13fe0 70 4c 69 73 74 3b 20 20 20 20 2f 2a 20 54 68 65  pList;    /* The
13ff0 20 72 65 73 75 6c 74 20 73 65 74 20 6f 66 20 74   result set of t
14000 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 2a  he outer query *
14010 2f 0a 20 20 69 6e 74 20 69 50 61 72 65 6e 74 3b  /.  int iParent;
14020 20 20 20 20 20 20 20 20 2f 2a 20 56 44 42 45 20          /* VDBE 
14030 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 20 6f 66  cursor number of
14040 20 74 68 65 20 70 53 75 62 20 72 65 73 75 6c 74   the pSub result
14050 20 73 65 74 20 74 65 6d 70 20 74 61 62 6c 65 20   set temp table 
14060 2a 2f 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20  */.  int i;     
14070 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70           /* Loop
14080 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 45 78   counter */.  Ex
14090 70 72 20 2a 70 57 68 65 72 65 3b 20 20 20 20 20  pr *pWhere;     
140a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
140b0 2a 20 54 68 65 20 57 48 45 52 45 20 63 6c 61 75  * The WHERE clau
140c0 73 65 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 53  se */.  struct S
140d0 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 53 75  rcList_item *pSu
140e0 62 69 74 65 6d 3b 20 20 20 2f 2a 20 54 68 65 20  bitem;   /* The 
140f0 73 75 62 71 75 65 72 79 20 2a 2f 0a 0a 20 20 2f  subquery */..  /
14100 2a 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69  * Check to see i
14110 66 20 66 6c 61 74 74 65 6e 69 6e 67 20 69 73 20  f flattening is 
14120 70 65 72 6d 69 74 74 65 64 2e 20 20 52 65 74 75  permitted.  Retu
14130 72 6e 20 30 20 69 66 20 6e 6f 74 2e 0a 20 20 2a  rn 0 if not..  *
14140 2f 0a 20 20 69 66 28 20 70 3d 3d 30 20 29 20 72  /.  if( p==0 ) r
14150 65 74 75 72 6e 20 30 3b 0a 20 20 70 53 72 63 20  eturn 0;.  pSrc 
14160 3d 20 70 2d 3e 70 53 72 63 3b 0a 20 20 61 73 73  = p->pSrc;.  ass
14170 65 72 74 28 20 70 53 72 63 20 26 26 20 69 46 72  ert( pSrc && iFr
14180 6f 6d 3e 3d 30 20 26 26 20 69 46 72 6f 6d 3c 70  om>=0 && iFrom<p
14190 53 72 63 2d 3e 6e 53 72 63 20 29 3b 0a 20 20 70  Src->nSrc );.  p
141a0 53 75 62 69 74 65 6d 20 3d 20 26 70 53 72 63 2d  Subitem = &pSrc-
141b0 3e 61 5b 69 46 72 6f 6d 5d 3b 0a 20 20 70 53 75  >a[iFrom];.  pSu
141c0 62 20 3d 20 70 53 75 62 69 74 65 6d 2d 3e 70 53  b = pSubitem->pS
141d0 65 6c 65 63 74 3b 0a 20 20 61 73 73 65 72 74 28  elect;.  assert(
141e0 20 70 53 75 62 21 3d 30 20 29 3b 0a 20 20 69 66   pSub!=0 );.  if
141f0 28 20 69 73 41 67 67 20 26 26 20 73 75 62 71 75  ( isAgg && subqu
14200 65 72 79 49 73 41 67 67 20 29 20 72 65 74 75 72  eryIsAgg ) retur
14210 6e 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  n 0;            
14220 20 20 20 20 20 2f 2a 20 52 65 73 74 72 69 63 74       /* Restrict
14230 69 6f 6e 20 28 31 29 20 20 2a 2f 0a 20 20 69 66  ion (1)  */.  if
14240 28 20 73 75 62 71 75 65 72 79 49 73 41 67 67 20  ( subqueryIsAgg 
14250 26 26 20 70 53 72 63 2d 3e 6e 53 72 63 3e 31 20  && pSrc->nSrc>1 
14260 29 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20  ) return 0;     
14270 20 20 20 20 20 2f 2a 20 52 65 73 74 72 69 63 74       /* Restrict
14280 69 6f 6e 20 28 32 29 20 20 2a 2f 0a 20 20 70 53  ion (2)  */.  pS
14290 75 62 53 72 63 20 3d 20 70 53 75 62 2d 3e 70 53  ubSrc = pSub->pS
142a0 72 63 3b 0a 20 20 61 73 73 65 72 74 28 20 70 53  rc;.  assert( pS
142b0 75 62 53 72 63 20 29 3b 0a 20 20 2f 2a 20 50 72  ubSrc );.  /* Pr
142c0 69 6f 72 20 74 6f 20 76 65 72 73 69 6f 6e 20 33  ior to version 3
142d0 2e 31 2e 32 2c 20 77 68 65 6e 20 4c 49 4d 49 54  .1.2, when LIMIT
142e0 20 61 6e 64 20 4f 46 46 53 45 54 20 68 61 64 20   and OFFSET had 
142f0 74 6f 20 62 65 20 73 69 6d 70 6c 65 20 63 6f 6e  to be simple con
14300 73 74 61 6e 74 73 2c 0a 20 20 2a 2a 20 6e 6f 74  stants,.  ** not
14310 20 61 72 62 69 74 72 61 72 79 20 65 78 70 72 65   arbitrary expre
14320 73 73 73 69 6f 6e 73 2c 20 77 65 20 61 6c 6c 6f  sssions, we allo
14330 77 65 64 20 73 6f 6d 65 20 63 6f 6d 62 69 6e 69  wed some combini
14340 6e 67 20 6f 66 20 4c 49 4d 49 54 20 61 6e 64 20  ng of LIMIT and 
14350 4f 46 46 53 45 54 0a 20 20 2a 2a 20 62 65 63 61  OFFSET.  ** beca
14360 75 73 65 20 74 68 65 79 20 63 6f 75 6c 64 20 62  use they could b
14370 65 20 63 6f 6d 70 75 74 65 64 20 61 74 20 63 6f  e computed at co
14380 6d 70 69 6c 65 2d 74 69 6d 65 2e 20 20 42 75 74  mpile-time.  But
14390 20 77 68 65 6e 20 4c 49 4d 49 54 20 61 6e 64 20   when LIMIT and 
143a0 4f 46 46 53 45 54 0a 20 20 2a 2a 20 62 65 63 61  OFFSET.  ** beca
143b0 6d 65 20 61 72 62 69 74 72 61 72 79 20 65 78 70  me arbitrary exp
143c0 72 65 73 73 69 6f 6e 73 2c 20 77 65 20 77 65 72  ressions, we wer
143d0 65 20 66 6f 72 63 65 64 20 74 6f 20 61 64 64 20  e forced to add 
143e0 72 65 73 74 72 69 63 74 69 6f 6e 73 20 28 31 33  restrictions (13
143f0 29 0a 20 20 2a 2a 20 61 6e 64 20 28 31 34 29 2e  ).  ** and (14).
14400 20 2a 2f 0a 20 20 69 66 28 20 70 53 75 62 2d 3e   */.  if( pSub->
14410 70 4c 69 6d 69 74 20 26 26 20 70 2d 3e 70 4c 69  pLimit && p->pLi
14420 6d 69 74 20 29 20 72 65 74 75 72 6e 20 30 3b 20  mit ) return 0; 
14430 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
14440 52 65 73 74 72 69 63 74 69 6f 6e 20 28 31 33 29  Restriction (13)
14450 20 2a 2f 0a 20 20 69 66 28 20 70 53 75 62 2d 3e   */.  if( pSub->
14460 70 4f 66 66 73 65 74 20 29 20 72 65 74 75 72 6e  pOffset ) return
14470 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
14480 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
14490 52 65 73 74 72 69 63 74 69 6f 6e 20 28 31 34 29  Restriction (14)
144a0 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 70 52 69   */.  if( p->pRi
144b0 67 68 74 6d 6f 73 74 20 26 26 20 70 53 75 62 2d  ghtmost && pSub-
144c0 3e 70 4c 69 6d 69 74 20 26 26 20 70 53 75 62 2d  >pLimit && pSub-
144d0 3e 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20  >pOrderBy ){.   
144e0 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20   return 0;      
144f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14500 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14510 20 20 20 20 20 20 2f 2a 20 52 65 73 74 72 69 63        /* Restric
14520 74 69 6f 6e 20 28 31 35 29 20 2a 2f 0a 20 20 7d  tion (15) */.  }
14530 0a 20 20 69 66 28 20 70 53 75 62 53 72 63 2d 3e  .  if( pSubSrc->
14540 6e 53 72 63 3d 3d 30 20 29 20 72 65 74 75 72 6e  nSrc==0 ) return
14550 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
14560 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73            /* Res
14570 74 72 69 63 74 69 6f 6e 20 28 37 29 20 20 2a 2f  triction (7)  */
14580 0a 20 20 69 66 28 20 28 70 53 75 62 2d 3e 69 73  .  if( (pSub->is
14590 44 69 73 74 69 6e 63 74 20 7c 7c 20 70 53 75 62  Distinct || pSub
145a0 2d 3e 70 4c 69 6d 69 74 29 20 0a 20 20 20 20 20  ->pLimit) .     
145b0 20 20 20 20 26 26 20 28 70 53 72 63 2d 3e 6e 53      && (pSrc->nS
145c0 72 63 3e 31 20 7c 7c 20 69 73 41 67 67 29 20 29  rc>1 || isAgg) )
145d0 7b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65  {          /* Re
145e0 73 74 72 69 63 74 69 6f 6e 73 20 28 34 29 28 35  strictions (4)(5
145f0 29 28 38 29 28 39 29 20 2a 2f 0a 20 20 20 20 20  )(8)(9) */.     
14600 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20  return 0;       
14610 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e 69 73  .  }.  if( p->is
14620 44 69 73 74 69 6e 63 74 20 26 26 20 73 75 62 71  Distinct && subq
14630 75 65 72 79 49 73 41 67 67 20 29 20 72 65 74 75  ueryIsAgg ) retu
14640 72 6e 20 30 3b 20 20 20 20 20 20 20 20 20 2f 2a  rn 0;         /*
14650 20 52 65 73 74 72 69 63 74 69 6f 6e 20 28 36 29   Restriction (6)
14660 20 20 2a 2f 0a 20 20 69 66 28 20 28 70 2d 3e 64    */.  if( (p->d
14670 69 73 61 6c 6c 6f 77 4f 72 64 65 72 42 79 20 7c  isallowOrderBy |
14680 7c 20 70 2d 3e 70 4f 72 64 65 72 42 79 29 20 26  | p->pOrderBy) &
14690 26 20 70 53 75 62 2d 3e 70 4f 72 64 65 72 42 79  & pSub->pOrderBy
146a0 20 29 7b 0a 20 20 20 20 20 72 65 74 75 72 6e 20   ){.     return 
146b0 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
146c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
146d0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
146e0 52 65 73 74 72 69 63 74 69 6f 6e 20 28 31 31 29  Restriction (11)
146f0 20 2a 2f 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 65   */.  }..  /* Re
14700 73 74 72 69 63 74 69 6f 6e 20 33 3a 20 20 49 66  striction 3:  If
14710 20 74 68 65 20 73 75 62 71 75 65 72 79 20 69 73   the subquery is
14720 20 61 20 6a 6f 69 6e 2c 20 6d 61 6b 65 20 73 75   a join, make su
14730 72 65 20 74 68 65 20 73 75 62 71 75 65 72 79 20  re the subquery 
14740 69 73 20 0a 20 20 2a 2a 20 6e 6f 74 20 75 73 65  is .  ** not use
14750 64 20 61 73 20 74 68 65 20 72 69 67 68 74 20 6f  d as the right o
14760 70 65 72 61 6e 64 20 6f 66 20 61 6e 20 6f 75 74  perand of an out
14770 65 72 20 6a 6f 69 6e 2e 20 20 45 78 61 6d 70 6c  er join.  Exampl
14780 65 73 20 6f 66 20 77 68 79 20 74 68 69 73 0a 20  es of why this. 
14790 20 2a 2a 20 69 73 20 6e 6f 74 20 61 6c 6c 6f 77   ** is not allow
147a0 65 64 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20  ed:.  **.  **   
147b0 20 20 20 20 20 20 74 31 20 4c 45 46 54 20 4f 55        t1 LEFT OU
147c0 54 45 52 20 4a 4f 49 4e 20 28 74 32 20 4a 4f 49  TER JOIN (t2 JOI
147d0 4e 20 74 33 29 0a 20 20 2a 2a 0a 20 20 2a 2a 20  N t3).  **.  ** 
147e0 49 66 20 77 65 20 66 6c 61 74 74 65 6e 20 74 68  If we flatten th
147f0 65 20 61 62 6f 76 65 2c 20 77 65 20 77 6f 75 6c  e above, we woul
14800 64 20 67 65 74 0a 20 20 2a 2a 0a 20 20 2a 2a 20  d get.  **.  ** 
14810 20 20 20 20 20 20 20 20 28 74 31 20 4c 45 46 54          (t1 LEFT
14820 20 4f 55 54 45 52 20 4a 4f 49 4e 20 74 32 29 20   OUTER JOIN t2) 
14830 4a 4f 49 4e 20 74 33 0a 20 20 2a 2a 0a 20 20 2a  JOIN t3.  **.  *
14840 2a 20 77 68 69 63 68 20 69 73 20 6e 6f 74 20 61  * which is not a
14850 74 20 61 6c 6c 20 74 68 65 20 73 61 6d 65 20 74  t all the same t
14860 68 69 6e 67 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  hing..  */.  if(
14870 20 70 53 75 62 53 72 63 2d 3e 6e 53 72 63 3e 31   pSubSrc->nSrc>1
14880 20 26 26 20 28 70 53 75 62 69 74 65 6d 2d 3e 6a   && (pSubitem->j
14890 6f 69 6e 74 79 70 65 20 26 20 4a 54 5f 4f 55 54  ointype & JT_OUT
148a0 45 52 29 21 3d 30 20 29 7b 0a 20 20 20 20 72 65  ER)!=0 ){.    re
148b0 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f  turn 0;.  }..  /
148c0 2a 20 52 65 73 74 72 69 63 74 69 6f 6e 20 31 32  * Restriction 12
148d0 3a 20 20 49 66 20 74 68 65 20 73 75 62 71 75 65  :  If the subque
148e0 72 79 20 69 73 20 74 68 65 20 72 69 67 68 74 20  ry is the right 
148f0 6f 70 65 72 61 6e 64 20 6f 66 20 61 20 6c 65 66  operand of a lef
14900 74 20 6f 75 74 65 72 0a 20 20 2a 2a 20 6a 6f 69  t outer.  ** joi
14910 6e 2c 20 6d 61 6b 65 20 73 75 72 65 20 74 68 65  n, make sure the
14920 20 73 75 62 71 75 65 72 79 20 68 61 73 20 6e 6f   subquery has no
14930 20 57 48 45 52 45 20 63 6c 61 75 73 65 2e 0a 20   WHERE clause.. 
14940 20 2a 2a 20 41 6e 20 65 78 61 6d 70 6c 65 73 20   ** An examples 
14950 6f 66 20 77 68 79 20 74 68 69 73 20 69 73 20 6e  of why this is n
14960 6f 74 20 61 6c 6c 6f 77 65 64 3a 0a 20 20 2a 2a  ot allowed:.  **
14970 0a 20 20 2a 2a 20 20 20 20 20 20 20 20 20 74 31  .  **         t1
14980 20 4c 45 46 54 20 4f 55 54 45 52 20 4a 4f 49 4e   LEFT OUTER JOIN
14990 20 28 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20   (SELECT * FROM 
149a0 74 32 20 57 48 45 52 45 20 74 32 2e 78 3e 30 29  t2 WHERE t2.x>0)
149b0 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 77 65  .  **.  ** If we
149c0 20 66 6c 61 74 74 65 6e 20 74 68 65 20 61 62 6f   flatten the abo
149d0 76 65 2c 20 77 65 20 77 6f 75 6c 64 20 67 65 74  ve, we would get
149e0 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 20  .  **.  **      
149f0 20 20 20 28 74 31 20 4c 45 46 54 20 4f 55 54 45     (t1 LEFT OUTE
14a00 52 20 4a 4f 49 4e 20 74 32 29 20 57 48 45 52 45  R JOIN t2) WHERE
14a10 20 74 32 2e 78 3e 30 0a 20 20 2a 2a 0a 20 20 2a   t2.x>0.  **.  *
14a20 2a 20 42 75 74 20 74 68 65 20 74 32 2e 78 3e 30  * But the t2.x>0
14a30 20 74 65 73 74 20 77 69 6c 6c 20 61 6c 77 61 79   test will alway
14a40 73 20 66 61 69 6c 20 6f 6e 20 61 20 4e 55 4c 4c  s fail on a NULL
14a50 20 72 6f 77 20 6f 66 20 74 32 2c 20 77 68 69 63   row of t2, whic
14a60 68 0a 20 20 2a 2a 20 65 66 66 65 63 74 69 76 65  h.  ** effective
14a70 6c 79 20 63 6f 6e 76 65 72 74 73 20 74 68 65 20  ly converts the 
14a80 4f 55 54 45 52 20 4a 4f 49 4e 20 69 6e 74 6f 20  OUTER JOIN into 
14a90 61 6e 20 49 4e 4e 45 52 20 4a 4f 49 4e 2e 0a 20  an INNER JOIN.. 
14aa0 20 2a 2f 0a 20 20 69 66 28 20 28 70 53 75 62 69   */.  if( (pSubi
14ab0 74 65 6d 2d 3e 6a 6f 69 6e 74 79 70 65 20 26 20  tem->jointype & 
14ac0 4a 54 5f 4f 55 54 45 52 29 21 3d 30 20 26 26 20  JT_OUTER)!=0 && 
14ad0 70 53 75 62 2d 3e 70 57 68 65 72 65 21 3d 30 20  pSub->pWhere!=0 
14ae0 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b  ){.    return 0;
14af0 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 77 65  .  }..  /* If we
14b00 20 72 65 61 63 68 20 74 68 69 73 20 70 6f 69 6e   reach this poin
14b10 74 2c 20 69 74 20 6d 65 61 6e 73 20 66 6c 61 74  t, it means flat
14b20 74 65 6e 69 6e 67 20 69 73 20 70 65 72 6d 69 74  tening is permit
14b30 74 65 64 20 66 6f 72 20 74 68 65 0a 20 20 2a 2a  ted for the.  **
14b40 20 69 46 72 6f 6d 2d 74 68 20 65 6e 74 72 79 20   iFrom-th entry 
14b50 6f 66 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75  of the FROM clau
14b60 73 65 20 69 6e 20 74 68 65 20 6f 75 74 65 72 20  se in the outer 
14b70 71 75 65 72 79 2e 0a 20 20 2a 2f 0a 0a 20 20 2f  query..  */..  /
14b80 2a 20 4d 6f 76 65 20 61 6c 6c 20 6f 66 20 74 68  * Move all of th
14b90 65 20 46 52 4f 4d 20 65 6c 65 6d 65 6e 74 73 20  e FROM elements 
14ba0 6f 66 20 74 68 65 20 73 75 62 71 75 65 72 79 20  of the subquery 
14bb0 69 6e 74 6f 20 74 68 65 0a 20 20 2a 2a 20 74 68  into the.  ** th
14bc0 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66  e FROM clause of
14bd0 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79   the outer query
14be0 2e 20 20 42 65 66 6f 72 65 20 64 6f 69 6e 67 20  .  Before doing 
14bf0 74 68 69 73 2c 20 72 65 6d 65 6d 62 65 72 0a 20  this, remember. 
14c00 20 2a 2a 20 74 68 65 20 63 75 72 73 6f 72 20 6e   ** the cursor n
14c10 75 6d 62 65 72 20 66 6f 72 20 74 68 65 20 6f 72  umber for the or
14c20 69 67 69 6e 61 6c 20 6f 75 74 65 72 20 71 75 65  iginal outer que
14c30 72 79 20 46 52 4f 4d 20 65 6c 65 6d 65 6e 74 20  ry FROM element 
14c40 69 6e 0a 20 20 2a 2a 20 69 50 61 72 65 6e 74 2e  in.  ** iParent.
14c50 20 20 54 68 65 20 69 50 61 72 65 6e 74 20 63 75    The iParent cu
14c60 72 73 6f 72 20 77 69 6c 6c 20 6e 65 76 65 72 20  rsor will never 
14c70 62 65 20 75 73 65 64 2e 20 20 53 75 62 73 65 71  be used.  Subseq
14c80 75 65 6e 74 20 63 6f 64 65 0a 20 20 2a 2a 20 77  uent code.  ** w
14c90 69 6c 6c 20 73 63 61 6e 20 65 78 70 72 65 73 73  ill scan express
14ca0 69 6f 6e 73 20 6c 6f 6f 6b 69 6e 67 20 66 6f 72  ions looking for
14cb0 20 69 50 61 72 65 6e 74 20 72 65 66 65 72 65 6e   iParent referen
14cc0 63 65 73 20 61 6e 64 20 72 65 70 6c 61 63 65 0a  ces and replace.
14cd0 20 20 2a 2a 20 74 68 6f 73 65 20 72 65 66 65 72    ** those refer
14ce0 65 6e 63 65 73 20 77 69 74 68 20 65 78 70 72 65  ences with expre
14cf0 73 73 69 6f 6e 73 20 74 68 61 74 20 72 65 73 6f  ssions that reso
14d00 6c 76 65 20 74 6f 20 74 68 65 20 73 75 62 71 75  lve to the subqu
14d10 65 72 79 20 46 52 4f 4d 0a 20 20 2a 2a 20 65 6c  ery FROM.  ** el
14d20 65 6d 65 6e 74 73 20 77 65 20 61 72 65 20 6e 6f  ements we are no
14d30 77 20 63 6f 70 79 69 6e 67 20 69 6e 2e 0a 20 20  w copying in..  
14d40 2a 2f 0a 20 20 69 50 61 72 65 6e 74 20 3d 20 70  */.  iParent = p
14d50 53 75 62 69 74 65 6d 2d 3e 69 43 75 72 73 6f 72  Subitem->iCursor
14d60 3b 0a 20 20 7b 0a 20 20 20 20 69 6e 74 20 6e 53  ;.  {.    int nS
14d70 75 62 53 72 63 20 3d 20 70 53 75 62 53 72 63 2d  ubSrc = pSubSrc-
14d80 3e 6e 53 72 63 3b 0a 20 20 20 20 69 6e 74 20 6a  >nSrc;.    int j
14d90 6f 69 6e 74 79 70 65 20 3d 20 70 53 75 62 69 74  ointype = pSubit
14da0 65 6d 2d 3e 6a 6f 69 6e 74 79 70 65 3b 0a 0a 20  em->jointype;.. 
14db0 20 20 20 73 71 6c 69 74 65 33 44 65 6c 65 74 65     sqlite3Delete
14dc0 54 61 62 6c 65 28 70 53 75 62 69 74 65 6d 2d 3e  Table(pSubitem->
14dd0 70 54 61 62 29 3b 0a 20 20 20 20 73 71 6c 69 74  pTab);.    sqlit
14de0 65 33 5f 66 72 65 65 28 70 53 75 62 69 74 65 6d  e3_free(pSubitem
14df0 2d 3e 7a 44 61 74 61 62 61 73 65 29 3b 0a 20 20  ->zDatabase);.  
14e00 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
14e10 53 75 62 69 74 65 6d 2d 3e 7a 4e 61 6d 65 29 3b  Subitem->zName);
14e20 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65  .    sqlite3_fre
14e30 65 28 70 53 75 62 69 74 65 6d 2d 3e 7a 41 6c 69  e(pSubitem->zAli
14e40 61 73 29 3b 0a 20 20 20 20 70 53 75 62 69 74 65  as);.    pSubite
14e50 6d 2d 3e 70 54 61 62 20 3d 20 30 3b 0a 20 20 20  m->pTab = 0;.   
14e60 20 70 53 75 62 69 74 65 6d 2d 3e 7a 44 61 74 61   pSubitem->zData
14e70 62 61 73 65 20 3d 20 30 3b 0a 20 20 20 20 70 53  base = 0;.    pS
14e80 75 62 69 74 65 6d 2d 3e 7a 4e 61 6d 65 20 3d 20  ubitem->zName = 
14e90 30 3b 0a 20 20 20 20 70 53 75 62 69 74 65 6d 2d  0;.    pSubitem-
14ea0 3e 7a 41 6c 69 61 73 20 3d 20 30 3b 0a 20 20 20  >zAlias = 0;.   
14eb0 20 69 66 28 20 6e 53 75 62 53 72 63 3e 31 20 29   if( nSubSrc>1 )
14ec0 7b 0a 20 20 20 20 20 20 69 6e 74 20 65 78 74 72  {.      int extr
14ed0 61 20 3d 20 6e 53 75 62 53 72 63 20 2d 20 31 3b  a = nSubSrc - 1;
14ee0 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 31 3b 20  .      for(i=1; 
14ef0 69 3c 6e 53 75 62 53 72 63 3b 20 69 2b 2b 29 7b  i<nSubSrc; i++){
14f00 0a 20 20 20 20 20 20 20 20 70 53 72 63 20 3d 20  .        pSrc = 
14f10 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74 41 70  sqlite3SrcListAp
14f20 70 65 6e 64 28 64 62 2c 20 70 53 72 63 2c 20 30  pend(db, pSrc, 0
14f30 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 69 66  , 0);.        if
14f40 28 20 70 53 72 63 3d 3d 30 20 29 7b 0a 20 20 20  ( pSrc==0 ){.   
14f50 20 20 20 20 20 20 20 70 2d 3e 70 53 72 63 20 3d         p->pSrc =
14f60 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65   0;.          re
14f70 74 75 72 6e 20 31 3b 0a 20 20 20 20 20 20 20 20  turn 1;.        
14f80 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  }.      }.      
14f90 70 2d 3e 70 53 72 63 20 3d 20 70 53 72 63 3b 0a  p->pSrc = pSrc;.
14fa0 20 20 20 20 20 20 66 6f 72 28 69 3d 70 53 72 63        for(i=pSrc
14fb0 2d 3e 6e 53 72 63 2d 31 3b 20 69 2d 65 78 74 72  ->nSrc-1; i-extr
14fc0 61 3e 3d 69 46 72 6f 6d 3b 20 69 2d 2d 29 7b 0a  a>=iFrom; i--){.
14fd0 20 20 20 20 20 20 20 20 70 53 72 63 2d 3e 61 5b          pSrc->a[
14fe0 69 5d 20 3d 20 70 53 72 63 2d 3e 61 5b 69 2d 65  i] = pSrc->a[i-e
14ff0 78 74 72 61 5d 3b 0a 20 20 20 20 20 20 7d 0a 20  xtra];.      }. 
15000 20 20 20 7d 0a 20 20 20 20 66 6f 72 28 69 3d 30     }.    for(i=0
15010 3b 20 69 3c 6e 53 75 62 53 72 63 3b 20 69 2b 2b  ; i<nSubSrc; i++
15020 29 7b 0a 20 20 20 20 20 20 70 53 72 63 2d 3e 61  ){.      pSrc->a
15030 5b 69 2b 69 46 72 6f 6d 5d 20 3d 20 70 53 75 62  [i+iFrom] = pSub
15040 53 72 63 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20 20  Src->a[i];.     
15050 20 6d 65 6d 73 65 74 28 26 70 53 75 62 53 72 63   memset(&pSubSrc
15060 2d 3e 61 5b 69 5d 2c 20 30 2c 20 73 69 7a 65 6f  ->a[i], 0, sizeo
15070 66 28 70 53 75 62 53 72 63 2d 3e 61 5b 69 5d 29  f(pSubSrc->a[i])
15080 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 53 72  );.    }.    pSr
15090 63 2d 3e 61 5b 69 46 72 6f 6d 5d 2e 6a 6f 69 6e  c->a[iFrom].join
150a0 74 79 70 65 20 3d 20 6a 6f 69 6e 74 79 70 65 3b  type = jointype;
150b0 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4e 6f 77 20 62  .  }..  /* Now b
150c0 65 67 69 6e 20 73 75 62 73 74 69 74 75 74 69 6e  egin substitutin
150d0 67 20 73 75 62 71 75 65 72 79 20 72 65 73 75 6c  g subquery resul
150e0 74 20 73 65 74 20 65 78 70 72 65 73 73 69 6f 6e  t set expression
150f0 73 20 66 6f 72 20 0a 20 20 2a 2a 20 72 65 66 65  s for .  ** refe
15100 72 65 6e 63 65 73 20 74 6f 20 74 68 65 20 69 50  rences to the iP
15110 61 72 65 6e 74 20 69 6e 20 74 68 65 20 6f 75 74  arent in the out
15120 65 72 20 71 75 65 72 79 2e 0a 20 20 2a 2a 20 0a  er query..  ** .
15130 20 20 2a 2a 20 45 78 61 6d 70 6c 65 3a 0a 20 20    ** Example:.  
15140 2a 2a 0a 20 20 2a 2a 20 20 20 53 45 4c 45 43 54  **.  **   SELECT
15150 20 61 2b 35 2c 20 62 2a 31 30 20 46 52 4f 4d 20   a+5, b*10 FROM 
15160 28 53 45 4c 45 43 54 20 78 2a 33 20 41 53 20 61  (SELECT x*3 AS a
15170 2c 20 79 2b 31 30 20 41 53 20 62 20 46 52 4f 4d  , y+10 AS b FROM
15180 20 74 31 29 20 57 48 45 52 45 20 61 3e 62 3b 0a   t1) WHERE a>b;.
15190 20 20 2a 2a 20 20 20 5c 20 20 20 20 20 20 20 20    **   \        
151a0 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 5f 5f               \__
151b0 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 20 73 75 62 71  ___________ subq
151c0 75 65 72 79 20 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 2f  uery __________/
151d0 20 20 20 20 20 20 20 20 20 20 2f 0a 20 20 2a 2a            /.  **
151e0 20 20 20 20 5c 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f      \___________
151f0 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 20 6f 75 74 65 72  __________ outer
15200 20 71 75 65 72 79 20 5f 5f 5f 5f 5f 5f 5f 5f 5f   query _________
15210 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f  ________________
15220 5f 5f 5f 5f 5f 2f 0a 20 20 2a 2a 0a 20 20 2a 2a  _____/.  **.  **
15230 20 57 65 20 6c 6f 6f 6b 20 61 74 20 65 76 65 72   We look at ever
15240 79 20 65 78 70 72 65 73 73 69 6f 6e 20 69 6e 20  y expression in 
15250 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20  the outer query 
15260 61 6e 64 20 65 76 65 72 79 20 70 6c 61 63 65 20  and every place 
15270 77 65 20 73 65 65 0a 20 20 2a 2a 20 22 61 22 20  we see.  ** "a" 
15280 77 65 20 73 75 62 73 74 69 74 75 74 65 20 22 78  we substitute "x
15290 2a 33 22 20 61 6e 64 20 65 76 65 72 79 20 70 6c  *3" and every pl
152a0 61 63 65 20 77 65 20 73 65 65 20 22 62 22 20 77  ace we see "b" w
152b0 65 20 73 75 62 73 74 69 74 75 74 65 20 22 79 2b  e substitute "y+
152c0 31 30 22 2e 0a 20 20 2a 2f 0a 20 20 70 4c 69 73  10"..  */.  pLis
152d0 74 20 3d 20 70 2d 3e 70 45 4c 69 73 74 3b 0a 20  t = p->pEList;. 
152e0 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4c 69 73   for(i=0; i<pLis
152f0 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a  t->nExpr; i++){.
15300 20 20 20 20 45 78 70 72 20 2a 70 45 78 70 72 3b      Expr *pExpr;
15310 0a 20 20 20 20 69 66 28 20 70 4c 69 73 74 2d 3e  .    if( pList->
15320 61 5b 69 5d 2e 7a 4e 61 6d 65 3d 3d 30 20 26 26  a[i].zName==0 &&
15330 20 28 70 45 78 70 72 20 3d 20 70 4c 69 73 74 2d   (pExpr = pList-
15340 3e 61 5b 69 5d 2e 70 45 78 70 72 29 2d 3e 73 70  >a[i].pExpr)->sp
15350 61 6e 2e 7a 21 3d 30 20 29 7b 0a 20 20 20 20 20  an.z!=0 ){.     
15360 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61   pList->a[i].zNa
15370 6d 65 20 3d 20 0a 20 20 20 20 20 20 20 20 20 20  me = .          
15380 20 20 20 73 71 6c 69 74 65 33 44 62 53 74 72 4e     sqlite3DbStrN
15390 44 75 70 28 64 62 2c 20 28 63 68 61 72 2a 29 70  Dup(db, (char*)p
153a0 45 78 70 72 2d 3e 73 70 61 6e 2e 7a 2c 20 70 45  Expr->span.z, pE
153b0 78 70 72 2d 3e 73 70 61 6e 2e 6e 29 3b 0a 20 20  xpr->span.n);.  
153c0 20 20 7d 0a 20 20 7d 0a 20 20 73 75 62 73 74 45    }.  }.  substE
153d0 78 70 72 4c 69 73 74 28 64 62 2c 20 70 2d 3e 70  xprList(db, p->p
153e0 45 4c 69 73 74 2c 20 69 50 61 72 65 6e 74 2c 20  EList, iParent, 
153f0 70 53 75 62 2d 3e 70 45 4c 69 73 74 29 3b 0a 20  pSub->pEList);. 
15400 20 69 66 28 20 69 73 41 67 67 20 29 7b 0a 20 20   if( isAgg ){.  
15410 20 20 73 75 62 73 74 45 78 70 72 4c 69 73 74 28    substExprList(
15420 64 62 2c 20 70 2d 3e 70 47 72 6f 75 70 42 79 2c  db, p->pGroupBy,
15430 20 69 50 61 72 65 6e 74 2c 20 70 53 75 62 2d 3e   iParent, pSub->
15440 70 45 4c 69 73 74 29 3b 0a 20 20 20 20 73 75 62  pEList);.    sub
15450 73 74 45 78 70 72 28 64 62 2c 20 70 2d 3e 70 48  stExpr(db, p->pH
15460 61 76 69 6e 67 2c 20 69 50 61 72 65 6e 74 2c 20  aving, iParent, 
15470 70 53 75 62 2d 3e 70 45 4c 69 73 74 29 3b 0a 20  pSub->pEList);. 
15480 20 7d 0a 20 20 69 66 28 20 70 53 75 62 2d 3e 70   }.  if( pSub->p
15490 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20 61  OrderBy ){.    a
154a0 73 73 65 72 74 28 20 70 2d 3e 70 4f 72 64 65 72  ssert( p->pOrder
154b0 42 79 3d 3d 30 20 29 3b 0a 20 20 20 20 70 2d 3e  By==0 );.    p->
154c0 70 4f 72 64 65 72 42 79 20 3d 20 70 53 75 62 2d  pOrderBy = pSub-
154d0 3e 70 4f 72 64 65 72 42 79 3b 0a 20 20 20 20 70  >pOrderBy;.    p
154e0 53 75 62 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20  Sub->pOrderBy = 
154f0 30 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70  0;.  }else if( p
15500 2d 3e 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20  ->pOrderBy ){.  
15510 20 20 73 75 62 73 74 45 78 70 72 4c 69 73 74 28    substExprList(
15520 64 62 2c 20 70 2d 3e 70 4f 72 64 65 72 42 79 2c  db, p->pOrderBy,
15530 20 69 50 61 72 65 6e 74 2c 20 70 53 75 62 2d 3e   iParent, pSub->
15540 70 45 4c 69 73 74 29 3b 0a 20 20 7d 0a 20 20 69  pEList);.  }.  i
15550 66 28 20 70 53 75 62 2d 3e 70 57 68 65 72 65 20  f( pSub->pWhere 
15560 29 7b 0a 20 20 20 20 70 57 68 65 72 65 20 3d 20  ){.    pWhere = 
15570 73 71 6c 69 74 65 33 45 78 70 72 44 75 70 28 64  sqlite3ExprDup(d
15580 62 2c 20 70 53 75 62 2d 3e 70 57 68 65 72 65 29  b, pSub->pWhere)
15590 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70  ;.  }else{.    p
155a0 57 68 65 72 65 20 3d 20 30 3b 0a 20 20 7d 0a 20  Where = 0;.  }. 
155b0 20 69 66 28 20 73 75 62 71 75 65 72 79 49 73 41   if( subqueryIsA
155c0 67 67 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  gg ){.    assert
155d0 28 20 70 2d 3e 70 48 61 76 69 6e 67 3d 3d 30 20  ( p->pHaving==0 
155e0 29 3b 0a 20 20 20 20 70 2d 3e 70 48 61 76 69 6e  );.    p->pHavin
155f0 67 20 3d 20 70 2d 3e 70 57 68 65 72 65 3b 0a 20  g = p->pWhere;. 
15600 20 20 20 70 2d 3e 70 57 68 65 72 65 20 3d 20 70     p->pWhere = p
15610 57 68 65 72 65 3b 0a 20 20 20 20 73 75 62 73 74  Where;.    subst
15620 45 78 70 72 28 64 62 2c 20 70 2d 3e 70 48 61 76  Expr(db, p->pHav
15630 69 6e 67 2c 20 69 50 61 72 65 6e 74 2c 20 70 53  ing, iParent, pS
15640 75 62 2d 3e 70 45 4c 69 73 74 29 3b 0a 20 20 20  ub->pEList);.   
15650 20 70 2d 3e 70 48 61 76 69 6e 67 20 3d 20 73 71   p->pHaving = sq
15660 6c 69 74 65 33 45 78 70 72 41 6e 64 28 64 62 2c  lite3ExprAnd(db,
15670 20 70 2d 3e 70 48 61 76 69 6e 67 2c 20 0a 20 20   p->pHaving, .  
15680 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15690 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71                sq
156a0 6c 69 74 65 33 45 78 70 72 44 75 70 28 64 62 2c  lite3ExprDup(db,
156b0 20 70 53 75 62 2d 3e 70 48 61 76 69 6e 67 29 29   pSub->pHaving))
156c0 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 2d  ;.    assert( p-
156d0 3e 70 47 72 6f 75 70 42 79 3d 3d 30 20 29 3b 0a  >pGroupBy==0 );.
156e0 20 20 20 20 70 2d 3e 70 47 72 6f 75 70 42 79 20      p->pGroupBy 
156f0 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73  = sqlite3ExprLis
15700 74 44 75 70 28 64 62 2c 20 70 53 75 62 2d 3e 70  tDup(db, pSub->p
15710 47 72 6f 75 70 42 79 29 3b 0a 20 20 7d 65 6c 73  GroupBy);.  }els
15720 65 7b 0a 20 20 20 20 73 75 62 73 74 45 78 70 72  e{.    substExpr
15730 28 64 62 2c 20 70 2d 3e 70 57 68 65 72 65 2c 20  (db, p->pWhere, 
15740 69 50 61 72 65 6e 74 2c 20 70 53 75 62 2d 3e 70  iParent, pSub->p
15750 45 4c 69 73 74 29 3b 0a 20 20 20 20 70 2d 3e 70  EList);.    p->p
15760 57 68 65 72 65 20 3d 20 73 71 6c 69 74 65 33 45  Where = sqlite3E
15770 78 70 72 41 6e 64 28 64 62 2c 20 70 2d 3e 70 57  xprAnd(db, p->pW
15780 68 65 72 65 2c 20 70 57 68 65 72 65 29 3b 0a 20  here, pWhere);. 
15790 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 66 6c 61   }..  /* The fla
157a0 74 74 65 6e 65 64 20 71 75 65 72 79 20 69 73 20  ttened query is 
157b0 64 69 73 74 69 6e 63 74 20 69 66 20 65 69 74 68  distinct if eith
157c0 65 72 20 74 68 65 20 69 6e 6e 65 72 20 6f 72 20  er the inner or 
157d0 74 68 65 0a 20 20 2a 2a 20 6f 75 74 65 72 20 71  the.  ** outer q
157e0 75 65 72 79 20 69 73 20 64 69 73 74 69 6e 63 74  uery is distinct
157f0 2e 20 0a 20 20 2a 2f 0a 20 20 70 2d 3e 69 73 44  . .  */.  p->isD
15800 69 73 74 69 6e 63 74 20 3d 20 70 2d 3e 69 73 44  istinct = p->isD
15810 69 73 74 69 6e 63 74 20 7c 7c 20 70 53 75 62 2d  istinct || pSub-
15820 3e 69 73 44 69 73 74 69 6e 63 74 3b 0a 0a 20 20  >isDistinct;..  
15830 2f 2a 0a 20 20 2a 2a 20 53 45 4c 45 43 54 20 2e  /*.  ** SELECT .
15840 2e 2e 20 46 52 4f 4d 20 28 53 45 4c 45 43 54 20  .. FROM (SELECT 
15850 2e 2e 2e 20 4c 49 4d 49 54 20 61 20 4f 46 46 53  ... LIMIT a OFFS
15860 45 54 20 62 29 20 4c 49 4d 49 54 20 78 20 4f 46  ET b) LIMIT x OF
15870 46 53 45 54 20 79 3b 0a 20 20 2a 2a 0a 20 20 2a  FSET y;.  **.  *
15880 2a 20 4f 6e 65 20 69 73 20 74 65 6d 70 74 65 64  * One is tempted
15890 20 74 6f 20 74 72 79 20 74 6f 20 61 64 64 20 61   to try to add a
158a0 20 61 6e 64 20 62 20 74 6f 20 63 6f 6d 62 69 6e   and b to combin
158b0 65 20 74 68 65 20 6c 69 6d 69 74 73 2e 20 20 42  e the limits.  B
158c0 75 74 20 74 68 69 73 0a 20 20 2a 2a 20 64 6f 65  ut this.  ** doe
158d0 73 20 6e 6f 74 20 77 6f 72 6b 20 69 66 20 65 69  s not work if ei
158e0 74 68 65 72 20 6c 69 6d 69 74 20 69 73 20 6e 65  ther limit is ne
158f0 67 61 74 69 76 65 2e 0a 20 20 2a 2f 0a 20 20 69  gative..  */.  i
15900 66 28 20 70 53 75 62 2d 3e 70 4c 69 6d 69 74 20  f( pSub->pLimit 
15910 29 7b 0a 20 20 20 20 70 2d 3e 70 4c 69 6d 69 74  ){.    p->pLimit
15920 20 3d 20 70 53 75 62 2d 3e 70 4c 69 6d 69 74 3b   = pSub->pLimit;
15930 0a 20 20 20 20 70 53 75 62 2d 3e 70 4c 69 6d 69  .    pSub->pLimi
15940 74 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  t = 0;.  }..  /*
15950 20 46 69 6e 69 61 6c 6c 79 2c 20 64 65 6c 65 74   Finially, delet
15960 65 20 77 68 61 74 20 69 73 20 6c 65 66 74 20 6f  e what is left o
15970 66 20 74 68 65 20 73 75 62 71 75 65 72 79 20 61  f the subquery a
15980 6e 64 20 72 65 74 75 72 6e 0a 20 20 2a 2a 20 73  nd return.  ** s
15990 75 63 63 65 73 73 2e 0a 20 20 2a 2f 0a 20 20 73  uccess..  */.  s
159a0 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65 6c 65  qlite3SelectDele
159b0 74 65 28 70 53 75 62 29 3b 0a 20 20 72 65 74 75  te(pSub);.  retu
159c0 72 6e 20 31 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f  rn 1;.}.#endif /
159d0 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49  * SQLITE_OMIT_VI
159e0 45 57 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 41 6e 61  EW */../*.** Ana
159f0 6c 79 7a 65 20 74 68 65 20 53 45 4c 45 43 54 20  lyze the SELECT 
15a00 73 74 61 74 65 6d 65 6e 74 20 70 61 73 73 65 64  statement passed
15a10 20 69 6e 20 61 73 20 61 6e 20 61 72 67 75 6d 65   in as an argume
15a20 6e 74 20 74 6f 20 73 65 65 20 69 66 20 69 74 0a  nt to see if it.
15a30 2a 2a 20 69 73 20 61 20 73 69 6d 70 6c 65 20 6d  ** is a simple m
15a40 69 6e 28 29 20 6f 72 20 6d 61 78 28 29 20 71 75  in() or max() qu
15a50 65 72 79 2e 20 20 49 66 20 69 74 20 69 73 20 61  ery.  If it is a
15a60 6e 64 20 74 68 69 73 20 71 75 65 72 79 20 63 61  nd this query ca
15a70 6e 20 62 65 0a 2a 2a 20 73 61 74 69 73 66 69 65  n be.** satisfie
15a80 64 20 75 73 69 6e 67 20 61 20 73 69 6e 67 6c 65  d using a single
15a90 20 73 65 65 6b 20 74 6f 20 74 68 65 20 62 65 67   seek to the beg
15aa0 69 6e 6e 69 6e 67 20 6f 72 20 65 6e 64 20 6f 66  inning or end of
15ab0 20 61 6e 20 69 6e 64 65 78 2c 0a 2a 2a 20 74 68   an index,.** th
15ac0 65 6e 20 67 65 6e 65 72 61 74 65 20 74 68 65 20  en generate the 
15ad0 63 6f 64 65 20 66 6f 72 20 74 68 69 73 20 53 45  code for this SE
15ae0 4c 45 43 54 20 61 6e 64 20 72 65 74 75 72 6e 20  LECT and return 
15af0 31 2e 20 20 49 66 20 74 68 69 73 20 69 73 20 6e  1.  If this is n
15b00 6f 74 20 61 20 0a 2a 2a 20 73 69 6d 70 6c 65 20  ot a .** simple 
15b10 6d 69 6e 28 29 20 6f 72 20 6d 61 78 28 29 20 71  min() or max() q
15b20 75 65 72 79 2c 20 74 68 65 6e 20 72 65 74 75 72  uery, then retur
15b30 6e 20 30 3b 0a 2a 2a 0a 2a 2a 20 41 20 73 69 6d  n 0;.**.** A sim
15b40 70 6c 79 20 6d 69 6e 28 29 20 6f 72 20 6d 61 78  ply min() or max
15b50 28 29 20 71 75 65 72 79 20 6c 6f 6f 6b 73 20 6c  () query looks l
15b60 69 6b 65 20 74 68 69 73 3a 0a 2a 2a 0a 2a 2a 20  ike this:.**.** 
15b70 20 20 20 53 45 4c 45 43 54 20 6d 69 6e 28 61 29     SELECT min(a)
15b80 20 46 52 4f 4d 20 74 61 62 6c 65 3b 0a 2a 2a 20   FROM table;.** 
15b90 20 20 20 53 45 4c 45 43 54 20 6d 61 78 28 61 29     SELECT max(a)
15ba0 20 46 52 4f 4d 20 74 61 62 6c 65 3b 0a 2a 2a 0a   FROM table;.**.
15bb0 2a 2a 20 54 68 65 20 71 75 65 72 79 20 6d 61 79  ** The query may
15bc0 20 68 61 76 65 20 6f 6e 6c 79 20 61 20 73 69 6e   have only a sin
15bd0 67 6c 65 20 74 61 62 6c 65 20 69 6e 20 69 74 73  gle table in its
15be0 20 46 52 4f 4d 20 61 72 67 75 6d 65 6e 74 2e 20   FROM argument. 
15bf0 20 54 68 65 72 65 0a 2a 2a 20 63 61 6e 20 62 65   There.** can be
15c00 20 6e 6f 20 47 52 4f 55 50 20 42 59 20 6f 72 20   no GROUP BY or 
15c10 48 41 56 49 4e 47 20 6f 72 20 57 48 45 52 45 20  HAVING or WHERE 
15c20 63 6c 61 75 73 65 73 2e 20 20 54 68 65 20 72 65  clauses.  The re
15c30 73 75 6c 74 20 73 65 74 20 6d 75 73 74 0a 2a 2a  sult set must.**
15c40 20 62 65 20 74 68 65 20 6d 69 6e 28 29 20 6f 72   be the min() or
15c50 20 6d 61 78 28 29 20 6f 66 20 61 20 73 69 6e 67   max() of a sing
15c60 6c 65 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 68 65  le column of the
15c70 20 74 61 62 6c 65 2e 20 20 54 68 65 20 63 6f 6c   table.  The col
15c80 75 6d 6e 0a 2a 2a 20 69 6e 20 74 68 65 20 6d 69  umn.** in the mi
15c90 6e 28 29 20 6f 72 20 6d 61 78 28 29 20 66 75 6e  n() or max() fun
15ca0 63 74 69 6f 6e 20 6d 75 73 74 20 62 65 20 69 6e  ction must be in
15cb0 64 65 78 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  dexed..**.** The
15cc0 20 70 61 72 61 6d 65 74 65 72 73 20 74 6f 20 74   parameters to t
15cd0 68 69 73 20 72 6f 75 74 69 6e 65 20 61 72 65 20  his routine are 
15ce0 74 68 65 20 73 61 6d 65 20 61 73 20 66 6f 72 20  the same as for 
15cf0 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28 29 2e  sqlite3Select().
15d00 0a 2a 2a 20 53 65 65 20 74 68 65 20 68 65 61 64  .** See the head
15d10 65 72 20 63 6f 6d 6d 65 6e 74 20 6f 6e 20 74 68  er comment on th
15d20 61 74 20 72 6f 75 74 69 6e 65 20 66 6f 72 20 61  at routine for a
15d30 64 64 69 74 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d  dditional inform
15d40 61 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63  ation..*/.static
15d50 20 69 6e 74 20 73 69 6d 70 6c 65 4d 69 6e 4d 61   int simpleMinMa
15d60 78 51 75 65 72 79 28 50 61 72 73 65 20 2a 70 50  xQuery(Parse *pP
15d70 61 72 73 65 2c 20 53 65 6c 65 63 74 20 2a 70 2c  arse, Select *p,
15d80 20 53 65 6c 65 63 74 44 65 73 74 20 2a 70 44 65   SelectDest *pDe
15d90 73 74 29 7b 0a 20 20 45 78 70 72 20 2a 70 45 78  st){.  Expr *pEx
15da0 70 72 3b 0a 20 20 69 6e 74 20 69 43 6f 6c 3b 0a  pr;.  int iCol;.
15db0 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20    Table *pTab;. 
15dc0 20 49 6e 64 65 78 20 2a 70 49 64 78 3b 0a 20 20   Index *pIdx;.  
15dd0 69 6e 74 20 62 61 73 65 3b 0a 20 20 56 64 62 65  int base;.  Vdbe
15de0 20 2a 76 3b 0a 20 20 69 6e 74 20 73 65 65 6b 4f   *v;.  int seekO
15df0 70 3b 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70  p;.  ExprList *p
15e00 45 4c 69 73 74 2c 20 2a 70 4c 69 73 74 2c 20 65  EList, *pList, e
15e10 4c 69 73 74 3b 0a 20 20 73 74 72 75 63 74 20 45  List;.  struct E
15e20 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 65 4c 69  xprList_item eLi
15e30 73 74 49 74 65 6d 3b 0a 20 20 53 72 63 4c 69 73  stItem;.  SrcLis
15e40 74 20 2a 70 53 72 63 3b 0a 20 20 69 6e 74 20 62  t *pSrc;.  int b
15e50 72 6b 3b 0a 20 20 69 6e 74 20 69 44 62 3b 0a 0a  rk;.  int iDb;..
15e60 20 20 2f 2a 20 43 68 65 63 6b 20 74 6f 20 73 65    /* Check to se
15e70 65 20 69 66 20 74 68 69 73 20 71 75 65 72 79 20  e if this query 
15e80 69 73 20 61 20 73 69 6d 70 6c 65 20 6d 69 6e 28  is a simple min(
15e90 29 20 6f 72 20 6d 61 78 28 29 20 71 75 65 72 79  ) or max() query
15ea0 2e 20 20 52 65 74 75 72 6e 0a 20 20 2a 2a 20 7a  .  Return.  ** z
15eb0 65 72 6f 20 69 66 20 69 74 20 69 73 20 20 6e 6f  ero if it is  no
15ec0 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d  t..  */.  if( p-
15ed0 3e 70 47 72 6f 75 70 42 79 20 7c 7c 20 70 2d 3e  >pGroupBy || p->
15ee0 70 48 61 76 69 6e 67 20 7c 7c 20 70 2d 3e 70 57  pHaving || p->pW
15ef0 68 65 72 65 20 29 20 72 65 74 75 72 6e 20 30 3b  here ) return 0;
15f00 0a 20 20 70 53 72 63 20 3d 20 70 2d 3e 70 53 72  .  pSrc = p->pSr
15f10 63 3b 0a 20 20 69 66 28 20 70 53 72 63 2d 3e 6e  c;.  if( pSrc->n
15f20 53 72 63 21 3d 31 20 29 20 72 65 74 75 72 6e 20  Src!=1 ) return 
15f30 30 3b 0a 20 20 70 45 4c 69 73 74 20 3d 20 70 2d  0;.  pEList = p-
15f40 3e 70 45 4c 69 73 74 3b 0a 20 20 69 66 28 20 70  >pEList;.  if( p
15f50 45 4c 69 73 74 2d 3e 6e 45 78 70 72 21 3d 31 20  EList->nExpr!=1 
15f60 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 70 45  ) return 0;.  pE
15f70 78 70 72 20 3d 20 70 45 4c 69 73 74 2d 3e 61 5b  xpr = pEList->a[
15f80 30 5d 2e 70 45 78 70 72 3b 0a 20 20 69 66 28 20  0].pExpr;.  if( 
15f90 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 41 47  pExpr->op!=TK_AG
15fa0 47 5f 46 55 4e 43 54 49 4f 4e 20 29 20 72 65 74  G_FUNCTION ) ret
15fb0 75 72 6e 20 30 3b 0a 20 20 70 4c 69 73 74 20 3d  urn 0;.  pList =
15fc0 20 70 45 78 70 72 2d 3e 70 4c 69 73 74 3b 0a 20   pExpr->pList;. 
15fd0 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20 7c 7c   if( pList==0 ||
15fe0 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72 21 3d 31   pList->nExpr!=1
15ff0 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69   ) return 0;.  i
16000 66 28 20 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e  f( pExpr->token.
16010 6e 21 3d 33 20 29 20 72 65 74 75 72 6e 20 30 3b  n!=3 ) return 0;
16020 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 74  .  if( sqlite3St
16030 72 4e 49 43 6d 70 28 28 63 68 61 72 2a 29 70 45  rNICmp((char*)pE
16040 78 70 72 2d 3e 74 6f 6b 65 6e 2e 7a 2c 22 6d 69  xpr->token.z,"mi
16050 6e 22 2c 33 29 3d 3d 30 20 29 7b 0a 20 20 20 20  n",3)==0 ){.    
16060 73 65 65 6b 4f 70 20 3d 20 4f 50 5f 52 65 77 69  seekOp = OP_Rewi
16070 6e 64 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20  nd;.  }else if( 
16080 73 71 6c 69 74 65 33 53 74 72 4e 49 43 6d 70 28  sqlite3StrNICmp(
16090 28 63 68 61 72 2a 29 70 45 78 70 72 2d 3e 74 6f  (char*)pExpr->to
160a0 6b 65 6e 2e 7a 2c 22 6d 61 78 22 2c 33 29 3d 3d  ken.z,"max",3)==
160b0 30 20 29 7b 0a 20 20 20 20 73 65 65 6b 4f 70 20  0 ){.    seekOp 
160c0 3d 20 4f 50 5f 4c 61 73 74 3b 0a 20 20 7d 65 6c  = OP_Last;.  }el
160d0 73 65 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30  se{.    return 0
160e0 3b 0a 20 20 7d 0a 20 20 70 45 78 70 72 20 3d 20  ;.  }.  pExpr = 
160f0 70 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70  pList->a[0].pExp
16100 72 3b 0a 20 20 69 66 28 20 70 45 78 70 72 2d 3e  r;.  if( pExpr->
16110 6f 70 21 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29 20  op!=TK_COLUMN ) 
16120 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 43 6f 6c  return 0;.  iCol
16130 20 3d 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d   = pExpr->iColum
16140 6e 3b 0a 20 20 70 54 61 62 20 3d 20 70 53 72 63  n;.  pTab = pSrc
16150 2d 3e 61 5b 30 5d 2e 70 54 61 62 3b 0a 0a 20 20  ->a[0].pTab;..  
16160 2f 2a 20 54 68 69 73 20 6f 70 74 69 6d 69 7a 61  /* This optimiza
16170 74 69 6f 6e 20 63 61 6e 6e 6f 74 20 62 65 20 75  tion cannot be u
16180 73 65 64 20 77 69 74 68 20 76 69 72 74 75 61 6c  sed with virtual
16190 20 74 61 62 6c 65 73 2e 20 2a 2f 0a 20 20 69 66   tables. */.  if
161a0 28 20 49 73 56 69 72 74 75 61 6c 28 70 54 61 62  ( IsVirtual(pTab
161b0 29 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 0a 20  ) ) return 0;.. 
161c0 20 2f 2a 20 49 66 20 77 65 20 67 65 74 20 74 6f   /* If we get to
161d0 20 68 65 72 65 2c 20 69 74 20 6d 65 61 6e 73 20   here, it means 
161e0 74 68 65 20 71 75 65 72 79 20 69 73 20 6f 66 20  the query is of 
161f0 74 68 65 20 63 6f 72 72 65 63 74 20 66 6f 72 6d  the correct form
16200 2e 0a 20 20 2a 2a 20 43 68 65 63 6b 20 74 6f 20  ..  ** Check to 
16210 6d 61 6b 65 20 73 75 72 65 20 77 65 20 68 61 76  make sure we hav
16220 65 20 61 6e 20 69 6e 64 65 78 20 61 6e 64 20 6d  e an index and m
16230 61 6b 65 20 70 49 64 78 20 70 6f 69 6e 74 20 74  ake pIdx point t
16240 6f 20 74 68 65 0a 20 20 2a 2a 20 61 70 70 72 6f  o the.  ** appro
16250 70 72 69 61 74 65 20 69 6e 64 65 78 2e 20 20 49  priate index.  I
16260 66 20 74 68 65 20 6d 69 6e 28 29 20 6f 72 20 6d  f the min() or m
16270 61 78 28 29 20 69 73 20 6f 6e 20 61 6e 20 49 4e  ax() is on an IN
16280 54 45 47 45 52 20 50 52 49 4d 41 52 59 0a 20 20  TEGER PRIMARY.  
16290 2a 2a 20 6b 65 79 20 63 6f 6c 75 6d 6e 2c 20 6e  ** key column, n
162a0 6f 20 69 6e 64 65 78 20 69 73 20 6e 65 63 65 73  o index is neces
162b0 73 61 72 79 20 73 6f 20 73 65 74 20 70 49 64 78  sary so set pIdx
162c0 20 74 6f 20 4e 55 4c 4c 2e 20 20 49 66 20 6e 6f   to NULL.  If no
162d0 0a 20 20 2a 2a 20 75 73 61 62 6c 65 20 69 6e 64  .  ** usable ind
162e0 65 78 20 69 73 20 66 6f 75 6e 64 2c 20 72 65 74  ex is found, ret
162f0 75 72 6e 20 30 2e 0a 20 20 2a 2f 0a 20 20 69 66  urn 0..  */.  if
16300 28 20 69 43 6f 6c 3c 30 20 29 7b 0a 20 20 20 20  ( iCol<0 ){.    
16310 70 49 64 78 20 3d 20 30 3b 0a 20 20 7d 65 6c 73  pIdx = 0;.  }els
16320 65 7b 0a 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a  e{.    CollSeq *
16330 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 45  pColl = sqlite3E
16340 78 70 72 43 6f 6c 6c 53 65 71 28 70 50 61 72 73  xprCollSeq(pPars
16350 65 2c 20 70 45 78 70 72 29 3b 0a 20 20 20 20 69  e, pExpr);.    i
16360 66 28 20 70 43 6f 6c 6c 3d 3d 30 20 29 20 72 65  f( pColl==0 ) re
16370 74 75 72 6e 20 30 3b 0a 20 20 20 20 66 6f 72 28  turn 0;.    for(
16380 70 49 64 78 3d 70 54 61 62 2d 3e 70 49 6e 64 65  pIdx=pTab->pInde
16390 78 3b 20 70 49 64 78 3b 20 70 49 64 78 3d 70 49  x; pIdx; pIdx=pI
163a0 64 78 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20  dx->pNext){.    
163b0 20 20 61 73 73 65 72 74 28 20 70 49 64 78 2d 3e    assert( pIdx->
163c0 6e 43 6f 6c 75 6d 6e 3e 3d 31 20 29 3b 0a 20 20  nColumn>=1 );.  
163d0 20 20 20 20 69 66 28 20 70 49 64 78 2d 3e 61 69      if( pIdx->ai
163e0 43 6f 6c 75 6d 6e 5b 30 5d 3d 3d 69 43 6f 6c 20  Column[0]==iCol 
163f0 26 26 20 0a 20 20 20 20 20 20 20 20 20 20 30 3d  && .          0=
16400 3d 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28  =sqlite3StrICmp(
16410 70 49 64 78 2d 3e 61 7a 43 6f 6c 6c 5b 30 5d 2c  pIdx->azColl[0],
16420 20 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65 29 20 29   pColl->zName) )
16430 7b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  {.        break;
16440 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
16450 20 20 20 69 66 28 20 70 49 64 78 3d 3d 30 20 29     if( pIdx==0 )
16460 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 0a   return 0;.  }..
16470 20 20 2f 2a 20 49 64 65 6e 74 69 66 79 20 63 6f    /* Identify co
16480 6c 75 6d 6e 20 74 79 70 65 73 20 69 66 20 77 65  lumn types if we
16490 20 77 69 6c 6c 20 62 65 20 75 73 69 6e 67 20 74   will be using t
164a0 68 65 20 63 61 6c 6c 62 61 63 6b 2e 20 20 54 68  he callback.  Th
164b0 69 73 0a 20 20 2a 2a 20 73 74 65 70 20 69 73 20  is.  ** step is 
164c0 73 6b 69 70 70 65 64 20 69 66 20 74 68 65 20 6f  skipped if the o
164d0 75 74 70 75 74 20 69 73 20 67 6f 69 6e 67 20 74  utput is going t
164e0 6f 20 61 20 74 61 62 6c 65 20 6f 72 20 61 20 6d  o a table or a m
164f0 65 6d 6f 72 79 20 63 65 6c 6c 2e 0a 20 20 2a 2a  emory cell..  **
16500 20 54 68 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65   The column name
16510 73 20 68 61 76 65 20 61 6c 72 65 61 64 79 20 62  s have already b
16520 65 65 6e 20 67 65 6e 65 72 61 74 65 64 20 69 6e  een generated in
16530 20 74 68 65 20 63 61 6c 6c 69 6e 67 20 66 75 6e   the calling fun
16540 63 74 69 6f 6e 2e 0a 20 20 2a 2f 0a 20 20 76 20  ction..  */.  v 
16550 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64 62 65  = sqlite3GetVdbe
16560 28 70 50 61 72 73 65 29 3b 0a 20 20 69 66 28 20  (pParse);.  if( 
16570 76 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b  v==0 ) return 0;
16580 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 6f 75  ..  /* If the ou
16590 74 70 75 74 20 69 73 20 64 65 73 74 69 6e 65 64  tput is destined
165a0 20 66 6f 72 20 61 20 74 65 6d 70 6f 72 61 72 79   for a temporary
165b0 20 74 61 62 6c 65 2c 20 6f 70 65 6e 20 74 68 61   table, open tha
165c0 74 20 74 61 62 6c 65 2e 0a 20 20 2a 2f 0a 20 20  t table..  */.  
165d0 69 66 28 20 70 44 65 73 74 2d 3e 65 44 65 73 74  if( pDest->eDest
165e0 3d 3d 53 52 54 5f 45 70 68 65 6d 54 61 62 20 29  ==SRT_EphemTab )
165f0 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  {.    sqlite3Vdb
16600 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4f 70  eAddOp2(v, OP_Op
16610 65 6e 45 70 68 65 6d 65 72 61 6c 2c 20 70 44 65  enEphemeral, pDe
16620 73 74 2d 3e 69 50 61 72 6d 2c 20 31 29 3b 0a 20  st->iParm, 1);. 
16630 20 7d 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74   }..  /* Generat
16640 69 6e 67 20 63 6f 64 65 20 74 6f 20 66 69 6e 64  ing code to find
16650 20 74 68 65 20 6d 69 6e 20 6f 72 20 74 68 65 20   the min or the 
16660 6d 61 78 2e 20 20 42 61 73 69 63 61 6c 6c 79 20  max.  Basically 
16670 61 6c 6c 20 77 65 20 68 61 76 65 0a 20 20 2a 2a  all we have.  **
16680 20 74 6f 20 64 6f 20 69 73 20 66 69 6e 64 20 74   to do is find t
16690 68 65 20 66 69 72 73 74 20 6f 72 20 74 68 65 20  he first or the 
166a0 6c 61 73 74 20 65 6e 74 72 79 20 69 6e 20 74 68  last entry in th
166b0 65 20 63 68 6f 73 65 6e 20 69 6e 64 65 78 2e 20  e chosen index. 
166c0 20 49 66 0a 20 20 2a 2a 20 74 68 65 20 6d 69 6e   If.  ** the min
166d0 28 29 20 6f 72 20 6d 61 78 28 29 20 69 73 20 6f  () or max() is o
166e0 6e 20 74 68 65 20 49 4e 54 45 47 45 52 20 50 52  n the INTEGER PR
166f0 49 4d 41 52 59 20 4b 45 59 2c 20 74 68 65 6e 20  IMARY KEY, then 
16700 66 69 6e 64 20 74 68 65 20 66 69 72 73 74 0a 20  find the first. 
16710 20 2a 2a 20 6f 72 20 6c 61 73 74 20 65 6e 74 72   ** or last entr
16720 79 20 69 6e 20 74 68 65 20 6d 61 69 6e 20 74 61  y in the main ta
16730 62 6c 65 2e 0a 20 20 2a 2f 0a 20 20 69 44 62 20  ble..  */.  iDb 
16740 3d 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61 54  = sqlite3SchemaT
16750 6f 49 6e 64 65 78 28 70 50 61 72 73 65 2d 3e 64  oIndex(pParse->d
16760 62 2c 20 70 54 61 62 2d 3e 70 53 63 68 65 6d 61  b, pTab->pSchema
16770 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69 44 62  );.  assert( iDb
16780 3e 3d 30 20 7c 7c 20 70 54 61 62 2d 3e 69 73 45  >=0 || pTab->isE
16790 70 68 65 6d 20 29 3b 0a 20 20 73 71 6c 69 74 65  phem );.  sqlite
167a0 33 43 6f 64 65 56 65 72 69 66 79 53 63 68 65 6d  3CodeVerifySchem
167b0 61 28 70 50 61 72 73 65 2c 20 69 44 62 29 3b 0a  a(pParse, iDb);.
167c0 20 20 73 71 6c 69 74 65 33 54 61 62 6c 65 4c 6f    sqlite3TableLo
167d0 63 6b 28 70 50 61 72 73 65 2c 20 69 44 62 2c 20  ck(pParse, iDb, 
167e0 70 54 61 62 2d 3e 74 6e 75 6d 2c 20 30 2c 20 70  pTab->tnum, 0, p
167f0 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 62  Tab->zName);.  b
16800 61 73 65 20 3d 20 70 53 72 63 2d 3e 61 5b 30 5d  ase = pSrc->a[0]
16810 2e 69 43 75 72 73 6f 72 3b 0a 20 20 62 72 6b 20  .iCursor;.  brk 
16820 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b  = sqlite3VdbeMak
16830 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 63 6f 6d  eLabel(v);.  com
16840 70 75 74 65 4c 69 6d 69 74 52 65 67 69 73 74 65  puteLimitRegiste
16850 72 73 28 70 50 61 72 73 65 2c 20 70 2c 20 62 72  rs(pParse, p, br
16860 6b 29 3b 0a 20 20 69 66 28 20 70 53 72 63 2d 3e  k);.  if( pSrc->
16870 61 5b 30 5d 2e 70 53 65 6c 65 63 74 3d 3d 30 20  a[0].pSelect==0 
16880 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 70  ){.    sqlite3Op
16890 65 6e 54 61 62 6c 65 28 70 50 61 72 73 65 2c 20  enTable(pParse, 
168a0 62 61 73 65 2c 20 69 44 62 2c 20 70 54 61 62 2c  base, iDb, pTab,
168b0 20 4f 50 5f 4f 70 65 6e 52 65 61 64 29 3b 0a 20   OP_OpenRead);. 
168c0 20 7d 0a 20 20 69 66 28 20 70 49 64 78 3d 3d 30   }.  if( pIdx==0
168d0 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56   ){.    sqlite3V
168e0 64 62 65 41 64 64 4f 70 32 28 76 2c 20 73 65 65  dbeAddOp2(v, see
168f0 6b 4f 70 2c 20 62 61 73 65 2c 20 30 29 3b 0a 20  kOp, base, 0);. 
16900 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 45   }else{.    /* E
16910 76 65 6e 20 74 68 6f 75 67 68 20 74 68 65 20 63  ven though the c
16920 75 72 73 6f 72 20 75 73 65 64 20 74 6f 20 6f 70  ursor used to op
16930 65 6e 20 74 68 65 20 69 6e 64 65 78 20 68 65 72  en the index her
16940 65 20 69 73 20 63 6c 6f 73 65 64 0a 20 20 20 20  e is closed.    
16950 2a 2a 20 61 73 20 73 6f 6f 6e 20 61 73 20 61 20  ** as soon as a 
16960 73 69 6e 67 6c 65 20 76 61 6c 75 65 20 68 61 73  single value has
16970 20 62 65 65 6e 20 72 65 61 64 20 66 72 6f 6d 20   been read from 
16980 69 74 2c 20 61 6c 6c 6f 63 61 74 65 20 69 74 0a  it, allocate it.
16990 20 20 20 20 2a 2a 20 75 73 69 6e 67 20 28 70 50      ** using (pP
169a0 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 29 20 74 6f  arse->nTab++) to
169b0 20 70 72 65 76 65 6e 74 20 74 68 65 20 63 75 72   prevent the cur
169c0 73 6f 72 20 69 64 20 66 72 6f 6d 20 62 65 69 6e  sor id from bein
169d0 67 20 0a 20 20 20 20 2a 2a 20 72 65 75 73 65 64  g .    ** reused
169e0 2e 20 54 68 69 73 20 69 73 20 69 6d 70 6f 72 74  . This is import
169f0 61 6e 74 20 66 6f 72 20 73 74 61 74 65 6d 65 6e  ant for statemen
16a00 74 73 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 0a  ts of the form .
16a10 20 20 20 20 2a 2a 20 22 49 4e 53 45 52 54 20 49      ** "INSERT I
16a20 4e 54 4f 20 78 20 53 45 4c 45 43 54 20 6d 61 78  NTO x SELECT max
16a30 28 29 20 46 52 4f 4d 20 78 22 2e 0a 20 20 20 20  () FROM x"..    
16a40 2a 2f 0a 20 20 20 20 69 6e 74 20 69 49 64 78 3b  */.    int iIdx;
16a50 0a 20 20 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b  .    KeyInfo *pK
16a60 65 79 20 3d 20 73 71 6c 69 74 65 33 49 6e 64 65  ey = sqlite3Inde
16a70 78 4b 65 79 69 6e 66 6f 28 70 50 61 72 73 65 2c  xKeyinfo(pParse,
16a80 20 70 49 64 78 29 3b 0a 20 20 20 20 69 49 64 78   pIdx);.    iIdx
16a90 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b   = pParse->nTab+
16aa0 2b 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  +;.    assert( p
16ab0 49 64 78 2d 3e 70 53 63 68 65 6d 61 3d 3d 70 54  Idx->pSchema==pT
16ac0 61 62 2d 3e 70 53 63 68 65 6d 61 20 29 3b 0a 20  ab->pSchema );. 
16ad0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
16ae0 64 4f 70 34 28 76 2c 20 4f 50 5f 4f 70 65 6e 52  dOp4(v, OP_OpenR
16af0 65 61 64 2c 20 69 49 64 78 2c 20 70 49 64 78 2d  ead, iIdx, pIdx-
16b00 3e 74 6e 75 6d 2c 20 69 44 62 2c 0a 20 20 20 20  >tnum, iDb,.    
16b10 20 20 20 20 28 63 68 61 72 2a 29 70 4b 65 79 2c      (char*)pKey,
16b20 20 50 34 5f 4b 45 59 49 4e 46 4f 5f 48 41 4e 44   P4_KEYINFO_HAND
16b30 4f 46 46 29 3b 0a 20 20 20 20 69 66 28 20 73 65  OFF);.    if( se
16b40 65 6b 4f 70 3d 3d 4f 50 5f 52 65 77 69 6e 64 20  ekOp==OP_Rewind 
16b50 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
16b60 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
16b70 5f 4e 75 6c 6c 2c 20 30 2c 20 30 29 3b 0a 20 20  _Null, 0, 0);.  
16b80 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
16b90 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4d 61 6b 65  ddOp2(v, OP_Make
16ba0 52 65 63 6f 72 64 2c 20 31 2c 20 30 29 3b 0a 20  Record, 1, 0);. 
16bb0 20 20 20 20 20 73 65 65 6b 4f 70 20 3d 20 4f 50       seekOp = OP
16bc0 5f 4d 6f 76 65 47 74 3b 0a 20 20 20 20 7d 0a 20  _MoveGt;.    }. 
16bd0 20 20 20 69 66 28 20 70 49 64 78 2d 3e 61 53 6f     if( pIdx->aSo
16be0 72 74 4f 72 64 65 72 5b 30 5d 3d 3d 53 51 4c 49  rtOrder[0]==SQLI
16bf0 54 45 5f 53 4f 5f 44 45 53 43 20 29 7b 0a 20 20  TE_SO_DESC ){.  
16c00 20 20 20 20 2f 2a 20 54 69 63 6b 65 74 20 23 32      /* Ticket #2
16c10 35 31 34 3a 20 69 6e 76 65 72 74 20 74 68 65 20  514: invert the 
16c20 73 65 65 6b 20 6f 70 65 72 61 74 6f 72 20 69 66  seek operator if
16c30 20 77 65 20 61 72 65 20 75 73 69 6e 67 0a 20 20   we are using.  
16c40 20 20 20 20 2a 2a 20 61 20 64 65 73 63 65 6e 64      ** a descend
16c50 69 6e 67 20 69 6e 64 65 78 2e 20 2a 2f 0a 20 20  ing index. */.  
16c60 20 20 20 20 69 66 28 20 73 65 65 6b 4f 70 3d 3d      if( seekOp==
16c70 4f 50 5f 4c 61 73 74 20 29 7b 0a 20 20 20 20 20  OP_Last ){.     
16c80 20 20 20 73 65 65 6b 4f 70 20 3d 20 4f 50 5f 52     seekOp = OP_R
16c90 65 77 69 6e 64 3b 0a 20 20 20 20 20 20 7d 65 6c  ewind;.      }el
16ca0 73 65 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65  se{.        asse
16cb0 72 74 28 20 73 65 65 6b 4f 70 3d 3d 4f 50 5f 4d  rt( seekOp==OP_M
16cc0 6f 76 65 47 74 20 29 3b 0a 20 20 20 20 20 20 20  oveGt );.       
16cd0 20 73 65 65 6b 4f 70 20 3d 20 4f 50 5f 4d 6f 76   seekOp = OP_Mov
16ce0 65 4c 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  eLt;.      }.   
16cf0 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64   }.    sqlite3Vd
16d00 62 65 41 64 64 4f 70 32 28 76 2c 20 73 65 65 6b  beAddOp2(v, seek
16d10 4f 70 2c 20 69 49 64 78 2c 20 30 29 3b 0a 20 20  Op, iIdx, 0);.  
16d20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
16d30 4f 70 32 28 76 2c 20 4f 50 5f 49 64 78 52 6f 77  Op2(v, OP_IdxRow
16d40 69 64 2c 20 69 49 64 78 2c 20 30 29 3b 0a 20 20  id, iIdx, 0);.  
16d50 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
16d60 4f 70 32 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c  Op2(v, OP_Close,
16d70 20 69 49 64 78 2c 20 30 29 3b 0a 20 20 20 20 73   iIdx, 0);.    s
16d80 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
16d90 28 76 2c 20 4f 50 5f 4d 6f 76 65 47 65 2c 20 62  (v, OP_MoveGe, b
16da0 61 73 65 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 65  ase, 0);.  }.  e
16db0 4c 69 73 74 2e 6e 45 78 70 72 20 3d 20 31 3b 0a  List.nExpr = 1;.
16dc0 20 20 6d 65 6d 73 65 74 28 26 65 4c 69 73 74 49    memset(&eListI
16dd0 74 65 6d 2c 20 30 2c 20 73 69 7a 65 6f 66 28 65  tem, 0, sizeof(e
16de0 4c 69 73 74 49 74 65 6d 29 29 3b 0a 20 20 65 4c  ListItem));.  eL
16df0 69 73 74 2e 61 20 3d 20 26 65 4c 69 73 74 49 74  ist.a = &eListIt
16e00 65 6d 3b 0a 20 20 65 4c 69 73 74 2e 61 5b 30 5d  em;.  eList.a[0]
16e10 2e 70 45 78 70 72 20 3d 20 70 45 78 70 72 3b 0a  .pExpr = pExpr;.
16e20 20 20 73 65 6c 65 63 74 49 6e 6e 65 72 4c 6f 6f    selectInnerLoo
16e30 70 28 70 50 61 72 73 65 2c 20 70 2c 20 26 65 4c  p(pParse, p, &eL
16e40 69 73 74 2c 20 30 2c 20 30 2c 20 30 2c 20 2d 31  ist, 0, 0, 0, -1
16e50 2c 20 70 44 65 73 74 2c 20 62 72 6b 2c 20 62 72  , pDest, brk, br
16e60 6b 2c 20 30 29 3b 0a 20 20 73 71 6c 69 74 65 33  k, 0);.  sqlite3
16e70 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c  VdbeResolveLabel
16e80 28 76 2c 20 62 72 6b 29 3b 0a 20 20 73 71 6c 69  (v, brk);.  sqli
16e90 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
16ea0 20 4f 50 5f 43 6c 6f 73 65 2c 20 62 61 73 65 2c   OP_Close, base,
16eb0 20 30 29 3b 0a 20 20 0a 20 20 72 65 74 75 72 6e   0);.  .  return
16ec0 20 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69   1;.}../*.** Thi
16ed0 73 20 72 6f 75 74 69 6e 65 20 72 65 73 6f 6c 76  s routine resolv
16ee0 65 73 20 61 6e 79 20 6e 61 6d 65 73 20 75 73 65  es any names use
16ef0 64 20 69 6e 20 74 68 65 20 72 65 73 75 6c 74 20  d in the result 
16f00 73 65 74 20 6f 66 20 74 68 65 0a 2a 2a 20 73 75  set of the.** su
16f10 70 70 6c 69 65 64 20 53 45 4c 45 43 54 20 73 74  pplied SELECT st
16f20 61 74 65 6d 65 6e 74 2e 20 49 66 20 74 68 65 20  atement. If the 
16f30 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
16f40 20 62 65 69 6e 67 20 72 65 73 6f 6c 76 65 64 0a   being resolved.
16f50 2a 2a 20 69 73 20 61 20 73 75 62 2d 73 65 6c 65  ** is a sub-sele
16f60 63 74 2c 20 74 68 65 6e 20 70 4f 75 74 65 72 4e  ct, then pOuterN
16f70 43 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74  C is a pointer t
16f80 6f 20 74 68 65 20 4e 61 6d 65 43 6f 6e 74 65 78  o the NameContex
16f90 74 20 0a 2a 2a 20 6f 66 20 74 68 65 20 70 61 72  t .** of the par
16fa0 65 6e 74 20 53 45 4c 45 43 54 2e 0a 2a 2f 0a 69  ent SELECT..*/.i
16fb0 6e 74 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74  nt sqlite3Select
16fc0 52 65 73 6f 6c 76 65 28 0a 20 20 50 61 72 73 65  Resolve(.  Parse
16fd0 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20   *pParse,       
16fe0 20 20 2f 2a 20 54 68 65 20 70 61 72 73 65 72 20    /* The parser 
16ff0 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53 65 6c  context */.  Sel
17000 65 63 74 20 2a 70 2c 20 20 20 20 20 20 20 20 20  ect *p,         
17010 20 20 20 20 2f 2a 20 54 68 65 20 53 45 4c 45 43      /* The SELEC
17020 54 20 73 74 61 74 65 6d 65 6e 74 20 62 65 69 6e  T statement bein
17030 67 20 63 6f 64 65 64 2e 20 2a 2f 0a 20 20 4e 61  g coded. */.  Na
17040 6d 65 43 6f 6e 74 65 78 74 20 2a 70 4f 75 74 65  meContext *pOute
17050 72 4e 43 20 20 2f 2a 20 54 68 65 20 6f 75 74 65  rNC  /* The oute
17060 72 20 6e 61 6d 65 20 63 6f 6e 74 65 78 74 2e 20  r name context. 
17070 4d 61 79 20 62 65 20 4e 55 4c 4c 2e 20 2a 2f 0a  May be NULL. */.
17080 29 7b 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70  ){.  ExprList *p
17090 45 4c 69 73 74 3b 20 20 20 20 20 20 20 20 20 20  EList;          
170a0 2f 2a 20 52 65 73 75 6c 74 20 73 65 74 2e 20 2a  /* Result set. *
170b0 2f 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20  /.  int i;      
170c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
170d0 2a 20 46 6f 72 2d 6c 6f 6f 70 20 76 61 72 69 61  * For-loop varia
170e0 62 6c 65 20 75 73 65 64 20 69 6e 20 6d 75 6c 74  ble used in mult
170f0 69 70 6c 65 20 70 6c 61 63 65 73 20 2a 2f 0a 20  iple places */. 
17100 20 4e 61 6d 65 43 6f 6e 74 65 78 74 20 73 4e 43   NameContext sNC
17110 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c  ;           /* L
17120 6f 63 61 6c 20 6e 61 6d 65 2d 63 6f 6e 74 65 78  ocal name-contex
17130 74 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20  t */.  ExprList 
17140 2a 70 47 72 6f 75 70 42 79 3b 20 20 20 20 20 20  *pGroupBy;      
17150 20 20 2f 2a 20 54 68 65 20 67 72 6f 75 70 20 62    /* The group b
17160 79 20 63 6c 61 75 73 65 20 2a 2f 0a 0a 20 20 2f  y clause */..  /
17170 2a 20 49 66 20 74 68 69 73 20 72 6f 75 74 69 6e  * If this routin
17180 65 20 68 61 73 20 72 75 6e 20 62 65 66 6f 72 65  e has run before
17190 2c 20 72 65 74 75 72 6e 20 69 6d 6d 65 64 69 61  , return immedia
171a0 74 65 6c 79 2e 20 2a 2f 0a 20 20 69 66 28 20 70  tely. */.  if( p
171b0 2d 3e 69 73 52 65 73 6f 6c 76 65 64 20 29 7b 0a  ->isResolved ){.
171c0 20 20 20 20 61 73 73 65 72 74 28 20 21 70 4f 75      assert( !pOu
171d0 74 65 72 4e 43 20 29 3b 0a 20 20 20 20 72 65 74  terNC );.    ret
171e0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
171f0 20 7d 0a 20 20 70 2d 3e 69 73 52 65 73 6f 6c 76   }.  p->isResolv
17200 65 64 20 3d 20 31 3b 0a 0a 20 20 2f 2a 20 49 66  ed = 1;..  /* If
17210 20 74 68 65 72 65 20 68 61 76 65 20 61 6c 72 65   there have alre
17220 61 64 79 20 62 65 65 6e 20 65 72 72 6f 72 73 2c  ady been errors,
17230 20 64 6f 20 6e 6f 74 68 69 6e 67 2e 20 2a 2f 0a   do nothing. */.
17240 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 45    if( pParse->nE
17250 72 72 3e 30 20 29 7b 0a 20 20 20 20 72 65 74 75  rr>0 ){.    retu
17260 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b  rn SQLITE_ERROR;
17270 0a 20 20 7d 0a 0a 20 20 2f 2a 20 50 72 65 70 61  .  }..  /* Prepa
17280 72 65 20 74 68 65 20 73 65 6c 65 63 74 20 73 74  re the select st
17290 61 74 65 6d 65 6e 74 2e 20 54 68 69 73 20 63 61  atement. This ca
172a0 6c 6c 20 77 69 6c 6c 20 61 6c 6c 6f 63 61 74 65  ll will allocate
172b0 20 61 6c 6c 20 63 75 72 73 6f 72 73 0a 20 20 2a   all cursors.  *
172c0 2a 20 72 65 71 75 69 72 65 64 20 74 6f 20 68 61  * required to ha
172d0 6e 64 6c 65 20 74 68 65 20 74 61 62 6c 65 73 20  ndle the tables 
172e0 61 6e 64 20 73 75 62 71 75 65 72 69 65 73 20 69  and subqueries i
172f0 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73  n the FROM claus
17300 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 72  e..  */.  if( pr
17310 65 70 53 65 6c 65 63 74 53 74 6d 74 28 70 50 61  epSelectStmt(pPa
17320 72 73 65 2c 20 70 29 20 29 7b 0a 20 20 20 20 72  rse, p) ){.    r
17330 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52  eturn SQLITE_ERR
17340 4f 52 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 65  OR;.  }..  /* Re
17350 73 6f 6c 76 65 20 74 68 65 20 65 78 70 72 65 73  solve the expres
17360 73 69 6f 6e 73 20 69 6e 20 74 68 65 20 4c 49 4d  sions in the LIM
17370 49 54 20 61 6e 64 20 4f 46 46 53 45 54 20 63 6c  IT and OFFSET cl
17380 61 75 73 65 73 2e 20 54 68 65 73 65 0a 20 20 2a  auses. These.  *
17390 2a 20 61 72 65 20 6e 6f 74 20 61 6c 6c 6f 77 65  * are not allowe
173a0 64 20 74 6f 20 72 65 66 65 72 20 74 6f 20 61 6e  d to refer to an
173b0 79 20 6e 61 6d 65 73 2c 20 73 6f 20 70 61 73 73  y names, so pass
173c0 20 61 6e 20 65 6d 70 74 79 20 4e 61 6d 65 43 6f   an empty NameCo
173d0 6e 74 65 78 74 2e 0a 20 20 2a 2f 0a 20 20 6d 65  ntext..  */.  me
173e0 6d 73 65 74 28 26 73 4e 43 2c 20 30 2c 20 73 69  mset(&sNC, 0, si
173f0 7a 65 6f 66 28 73 4e 43 29 29 3b 0a 20 20 73 4e  zeof(sNC));.  sN
17400 43 2e 70 50 61 72 73 65 20 3d 20 70 50 61 72 73  C.pParse = pPars
17410 65 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33  e;.  if( sqlite3
17420 45 78 70 72 52 65 73 6f 6c 76 65 4e 61 6d 65 73  ExprResolveNames
17430 28 26 73 4e 43 2c 20 70 2d 3e 70 4c 69 6d 69 74  (&sNC, p->pLimit
17440 29 20 7c 7c 0a 20 20 20 20 20 20 73 71 6c 69 74  ) ||.      sqlit
17450 65 33 45 78 70 72 52 65 73 6f 6c 76 65 4e 61 6d  e3ExprResolveNam
17460 65 73 28 26 73 4e 43 2c 20 70 2d 3e 70 4f 66 66  es(&sNC, p->pOff
17470 73 65 74 29 20 29 7b 0a 20 20 20 20 72 65 74 75  set) ){.    retu
17480 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b  rn SQLITE_ERROR;
17490 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 65 74 20 75  .  }..  /* Set u
174a0 70 20 74 68 65 20 6c 6f 63 61 6c 20 6e 61 6d 65  p the local name
174b0 2d 63 6f 6e 74 65 78 74 20 74 6f 20 70 61 73 73  -context to pass
174c0 20 74 6f 20 45 78 70 72 52 65 73 6f 6c 76 65 4e   to ExprResolveN
174d0 61 6d 65 73 28 29 20 74 6f 0a 20 20 2a 2a 20 72  ames() to.  ** r
174e0 65 73 6f 6c 76 65 20 74 68 65 20 65 78 70 72 65  esolve the expre
174f0 73 73 69 6f 6e 2d 6c 69 73 74 2e 0a 20 20 2a 2f  ssion-list..  */
17500 0a 20 20 73 4e 43 2e 61 6c 6c 6f 77 41 67 67 20  .  sNC.allowAgg 
17510 3d 20 31 3b 0a 20 20 73 4e 43 2e 70 53 72 63 4c  = 1;.  sNC.pSrcL
17520 69 73 74 20 3d 20 70 2d 3e 70 53 72 63 3b 0a 20  ist = p->pSrc;. 
17530 20 73 4e 43 2e 70 4e 65 78 74 20 3d 20 70 4f 75   sNC.pNext = pOu
17540 74 65 72 4e 43 3b 0a 0a 20 20 2f 2a 20 52 65 73  terNC;..  /* Res
17550 6f 6c 76 65 20 6e 61 6d 65 73 20 69 6e 20 74 68  olve names in th
17560 65 20 72 65 73 75 6c 74 20 73 65 74 2e 20 2a 2f  e result set. */
17570 0a 20 20 70 45 4c 69 73 74 20 3d 20 70 2d 3e 70  .  pEList = p->p
17580 45 4c 69 73 74 3b 0a 20 20 69 66 28 20 21 70 45  EList;.  if( !pE
17590 4c 69 73 74 20 29 20 72 65 74 75 72 6e 20 53 51  List ) return SQ
175a0 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 66 6f  LITE_ERROR;.  fo
175b0 72 28 69 3d 30 3b 20 69 3c 70 45 4c 69 73 74 2d  r(i=0; i<pEList-
175c0 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20  >nExpr; i++){.  
175d0 20 20 45 78 70 72 20 2a 70 58 20 3d 20 70 45 4c    Expr *pX = pEL
175e0 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 3b  ist->a[i].pExpr;
175f0 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33  .    if( sqlite3
17600 45 78 70 72 52 65 73 6f 6c 76 65 4e 61 6d 65 73  ExprResolveNames
17610 28 26 73 4e 43 2c 20 70 58 29 20 29 7b 0a 20 20  (&sNC, pX) ){.  
17620 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
17630 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20  E_ERROR;.    }. 
17640 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 72   }..  /* If ther
17650 65 20 61 72 65 20 6e 6f 20 61 67 67 72 65 67 61  e are no aggrega
17660 74 65 20 66 75 6e 63 74 69 6f 6e 73 20 69 6e 20  te functions in 
17670 74 68 65 20 72 65 73 75 6c 74 2d 73 65 74 2c 20  the result-set, 
17680 61 6e 64 20 6e 6f 20 47 52 4f 55 50 20 42 59 20  and no GROUP BY 
17690 0a 20 20 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e  .  ** expression
176a0 2c 20 64 6f 20 6e 6f 74 20 61 6c 6c 6f 77 20 61  , do not allow a
176b0 67 67 72 65 67 61 74 65 73 20 69 6e 20 61 6e 79  ggregates in any
176c0 20 6f 66 20 74 68 65 20 6f 74 68 65 72 20 65 78   of the other ex
176d0 70 72 65 73 73 69 6f 6e 73 2e 0a 20 20 2a 2f 0a  pressions..  */.
176e0 20 20 61 73 73 65 72 74 28 20 21 70 2d 3e 69 73    assert( !p->is
176f0 41 67 67 20 29 3b 0a 20 20 70 47 72 6f 75 70 42  Agg );.  pGroupB
17700 79 20 3d 20 70 2d 3e 70 47 72 6f 75 70 42 79 3b  y = p->pGroupBy;
17710 0a 20 20 69 66 28 20 70 47 72 6f 75 70 42 79 20  .  if( pGroupBy 
17720 7c 7c 20 73 4e 43 2e 68 61 73 41 67 67 20 29 7b  || sNC.hasAgg ){
17730 0a 20 20 20 20 70 2d 3e 69 73 41 67 67 20 3d 20  .    p->isAgg = 
17740 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  1;.  }else{.    
17750 73 4e 43 2e 61 6c 6c 6f 77 41 67 67 20 3d 20 30  sNC.allowAgg = 0
17760 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 61  ;.  }..  /* If a
17770 20 48 41 56 49 4e 47 20 63 6c 61 75 73 65 20 69   HAVING clause i
17780 73 20 70 72 65 73 65 6e 74 2c 20 74 68 65 6e 20  s present, then 
17790 74 68 65 72 65 20 6d 75 73 74 20 62 65 20 61 20  there must be a 
177a0 47 52 4f 55 50 20 42 59 20 63 6c 61 75 73 65 2e  GROUP BY clause.
177b0 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 70  .  */.  if( p->p
177c0 48 61 76 69 6e 67 20 26 26 20 21 70 47 72 6f 75  Having && !pGrou
177d0 70 42 79 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  pBy ){.    sqlit
177e0 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
177f0 65 2c 20 22 61 20 47 52 4f 55 50 20 42 59 20 63  e, "a GROUP BY c
17800 6c 61 75 73 65 20 69 73 20 72 65 71 75 69 72 65  lause is require
17810 64 20 62 65 66 6f 72 65 20 48 41 56 49 4e 47 22  d before HAVING"
17820 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  );.    return SQ
17830 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a  LITE_ERROR;.  }.
17840 0a 20 20 2f 2a 20 41 64 64 20 74 68 65 20 65 78  .  /* Add the ex
17850 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 20 74 6f  pression list to
17860 20 74 68 65 20 6e 61 6d 65 2d 63 6f 6e 74 65 78   the name-contex
17870 74 20 62 65 66 6f 72 65 20 70 61 72 73 69 6e 67  t before parsing
17880 20 74 68 65 0a 20 20 2a 2a 20 6f 74 68 65 72 20   the.  ** other 
17890 65 78 70 72 65 73 73 69 6f 6e 73 20 69 6e 20 74  expressions in t
178a0 68 65 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d  he SELECT statem
178b0 65 6e 74 2e 20 54 68 69 73 20 69 73 20 73 6f 20  ent. This is so 
178c0 74 68 61 74 0a 20 20 2a 2a 20 65 78 70 72 65 73  that.  ** expres
178d0 73 69 6f 6e 73 20 69 6e 20 74 68 65 20 57 48 45  sions in the WHE
178e0 52 45 20 63 6c 61 75 73 65 20 28 65 74 63 2e 29  RE clause (etc.)
178f0 20 63 61 6e 20 72 65 66 65 72 20 74 6f 20 65 78   can refer to ex
17900 70 72 65 73 73 69 6f 6e 73 20 62 79 0a 20 20 2a  pressions by.  *
17910 2a 20 61 6c 69 61 73 65 73 20 69 6e 20 74 68 65  * aliases in the
17920 20 72 65 73 75 6c 74 20 73 65 74 2e 0a 20 20 2a   result set..  *
17930 2a 0a 20 20 2a 2a 20 4d 69 6e 6f 72 20 70 6f 69  *.  ** Minor poi
17940 6e 74 3a 20 49 66 20 74 68 69 73 20 69 73 20 74  nt: If this is t
17950 68 65 20 63 61 73 65 2c 20 74 68 65 6e 20 74 68  he case, then th
17960 65 20 65 78 70 72 65 73 73 69 6f 6e 20 77 69 6c  e expression wil
17970 6c 20 62 65 0a 20 20 2a 2a 20 72 65 2d 65 76 61  l be.  ** re-eva
17980 6c 75 61 74 65 64 20 66 6f 72 20 65 61 63 68 20  luated for each 
17990 72 65 66 65 72 65 6e 63 65 20 74 6f 20 69 74 2e  reference to it.
179a0 0a 20 20 2a 2f 0a 20 20 73 4e 43 2e 70 45 4c 69  .  */.  sNC.pELi
179b0 73 74 20 3d 20 70 2d 3e 70 45 4c 69 73 74 3b 0a  st = p->pEList;.
179c0 20 20 69 66 28 20 73 71 6c 69 74 65 33 45 78 70    if( sqlite3Exp
179d0 72 52 65 73 6f 6c 76 65 4e 61 6d 65 73 28 26 73  rResolveNames(&s
179e0 4e 43 2c 20 70 2d 3e 70 57 68 65 72 65 29 20 7c  NC, p->pWhere) |
179f0 7c 0a 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  |.     sqlite3Ex
17a00 70 72 52 65 73 6f 6c 76 65 4e 61 6d 65 73 28 26  prResolveNames(&
17a10 73 4e 43 2c 20 70 2d 3e 70 48 61 76 69 6e 67 29  sNC, p->pHaving)
17a20 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
17a30 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d  QLITE_ERROR;.  }
17a40 0a 20 20 69 66 28 20 70 2d 3e 70 50 72 69 6f 72  .  if( p->pPrior
17a50 3d 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20 70  ==0 ){.    if( p
17a60 72 6f 63 65 73 73 4f 72 64 65 72 47 72 6f 75 70  rocessOrderGroup
17a70 42 79 28 70 50 61 72 73 65 2c 20 70 2c 20 70 2d  By(pParse, p, p-
17a80 3e 70 4f 72 64 65 72 42 79 2c 20 31 2c 20 26 73  >pOrderBy, 1, &s
17a90 4e 43 2e 68 61 73 41 67 67 29 20 29 7b 0a 20 20  NC.hasAgg) ){.  
17aa0 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
17ab0 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20  E_ERROR;.    }. 
17ac0 20 7d 0a 20 20 69 66 28 20 70 72 6f 63 65 73 73   }.  if( process
17ad0 4f 72 64 65 72 47 72 6f 75 70 42 79 28 70 50 61  OrderGroupBy(pPa
17ae0 72 73 65 2c 20 70 2c 20 70 47 72 6f 75 70 42 79  rse, p, pGroupBy
17af0 2c 20 30 2c 20 26 73 4e 43 2e 68 61 73 41 67 67  , 0, &sNC.hasAgg
17b00 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  ) ){.    return 
17b10 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20  SQLITE_ERROR;.  
17b20 7d 0a 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d  }..  if( pParse-
17b30 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65  >db->mallocFaile
17b40 64 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  d ){.    return 
17b50 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
17b60 7d 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72  }..  /* Make sur
17b70 65 20 74 68 65 20 47 52 4f 55 50 20 42 59 20 63  e the GROUP BY c
17b80 6c 61 75 73 65 20 64 6f 65 73 20 6e 6f 74 20 63  lause does not c
17b90 6f 6e 74 61 69 6e 20 61 67 67 72 65 67 61 74 65  ontain aggregate
17ba0 20 66 75 6e 63 74 69 6f 6e 73 2e 0a 20 20 2a 2f   functions..  */
17bb0 0a 20 20 69 66 28 20 70 47 72 6f 75 70 42 79 20  .  if( pGroupBy 
17bc0 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20 45 78  ){.    struct Ex
17bd0 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74  prList_item *pIt
17be0 65 6d 3b 0a 20 20 0a 20 20 20 20 66 6f 72 28 69  em;.  .    for(i
17bf0 3d 30 2c 20 70 49 74 65 6d 3d 70 47 72 6f 75 70  =0, pItem=pGroup
17c00 42 79 2d 3e 61 3b 20 69 3c 70 47 72 6f 75 70 42  By->a; i<pGroupB
17c10 79 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 2c 20 70  y->nExpr; i++, p
17c20 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 69  Item++){.      i
17c30 66 28 20 45 78 70 72 48 61 73 50 72 6f 70 65 72  f( ExprHasProper
17c40 74 79 28 70 49 74 65 6d 2d 3e 70 45 78 70 72 2c  ty(pItem->pExpr,
17c50 20 45 50 5f 41 67 67 29 20 29 7b 0a 20 20 20 20   EP_Agg) ){.    
17c60 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
17c70 4d 73 67 28 70 50 61 72 73 65 2c 20 22 61 67 67  Msg(pParse, "agg
17c80 72 65 67 61 74 65 20 66 75 6e 63 74 69 6f 6e 73  regate functions
17c90 20 61 72 65 20 6e 6f 74 20 61 6c 6c 6f 77 65 64   are not allowed
17ca0 20 69 6e 20 22 0a 20 20 20 20 20 20 20 20 20 20   in ".          
17cb0 20 20 22 74 68 65 20 47 52 4f 55 50 20 42 59 20    "the GROUP BY 
17cc0 63 6c 61 75 73 65 22 29 3b 0a 20 20 20 20 20 20  clause");.      
17cd0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
17ce0 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 7d 0a 20  ERROR;.      }. 
17cf0 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49     }.  }..  /* I
17d00 66 20 74 68 69 73 20 69 73 20 6f 6e 65 20 53 45  f this is one SE
17d10 4c 45 43 54 20 6f 66 20 61 20 63 6f 6d 70 6f 75  LECT of a compou
17d20 6e 64 2c 20 62 65 20 73 75 72 65 20 74 6f 20 72  nd, be sure to r
17d30 65 73 6f 6c 76 65 20 6e 61 6d 65 73 0a 20 20 2a  esolve names.  *
17d40 2a 20 69 6e 20 74 68 65 20 6f 74 68 65 72 20 53  * in the other S
17d50 45 4c 45 43 54 73 2e 0a 20 20 2a 2f 0a 20 20 69  ELECTs..  */.  i
17d60 66 28 20 70 2d 3e 70 50 72 69 6f 72 20 29 7b 0a  f( p->pPrior ){.
17d70 20 20 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74      return sqlit
17d80 65 33 53 65 6c 65 63 74 52 65 73 6f 6c 76 65 28  e3SelectResolve(
17d90 70 50 61 72 73 65 2c 20 70 2d 3e 70 50 72 69 6f  pParse, p->pPrio
17da0 72 2c 20 70 4f 75 74 65 72 4e 43 29 3b 0a 20 20  r, pOuterNC);.  
17db0 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65 74 75 72  }else{.    retur
17dc0 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d  n SQLITE_OK;.  }
17dd0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 73 65 74 20  .}../*.** Reset 
17de0 74 68 65 20 61 67 67 72 65 67 61 74 65 20 61 63  the aggregate ac
17df0 63 75 6d 75 6c 61 74 6f 72 2e 0a 2a 2a 0a 2a 2a  cumulator..**.**
17e00 20 54 68 65 20 61 67 67 72 65 67 61 74 65 20 61   The aggregate a
17e10 63 63 75 6d 75 6c 61 74 6f 72 20 69 73 20 61 20  ccumulator is a 
17e20 73 65 74 20 6f 66 20 6d 65 6d 6f 72 79 20 63 65  set of memory ce
17e30 6c 6c 73 20 74 68 61 74 20 68 6f 6c 64 0a 2a 2a  lls that hold.**
17e40 20 69 6e 74 65 72 6d 65 64 69 61 74 65 20 72 65   intermediate re
17e50 73 75 6c 74 73 20 77 68 69 6c 65 20 63 61 6c 63  sults while calc
17e60 75 6c 61 74 69 6e 67 20 61 6e 20 61 67 67 72 65  ulating an aggre
17e70 67 61 74 65 2e 20 20 54 68 69 73 0a 2a 2a 20 72  gate.  This.** r
17e80 6f 75 74 69 6e 65 20 73 69 6d 70 6c 79 20 73 74  outine simply st
17e90 6f 72 65 73 20 4e 55 4c 4c 73 20 69 6e 20 61 6c  ores NULLs in al
17ea0 6c 20 6f 66 20 74 68 6f 73 65 20 6d 65 6d 6f 72  l of those memor
17eb0 79 20 63 65 6c 6c 73 2e 0a 2a 2f 0a 73 74 61 74  y cells..*/.stat
17ec0 69 63 20 76 6f 69 64 20 72 65 73 65 74 41 63 63  ic void resetAcc
17ed0 75 6d 75 6c 61 74 6f 72 28 50 61 72 73 65 20 2a  umulator(Parse *
17ee0 70 50 61 72 73 65 2c 20 41 67 67 49 6e 66 6f 20  pParse, AggInfo 
17ef0 2a 70 41 67 67 49 6e 66 6f 29 7b 0a 20 20 56 64  *pAggInfo){.  Vd
17f00 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e  be *v = pParse->
17f10 70 56 64 62 65 3b 0a 20 20 69 6e 74 20 69 3b 0a  pVdbe;.  int i;.
17f20 20 20 73 74 72 75 63 74 20 41 67 67 49 6e 66 6f    struct AggInfo
17f30 5f 66 75 6e 63 20 2a 70 46 75 6e 63 3b 0a 20 20  _func *pFunc;.  
17f40 69 66 28 20 70 41 67 67 49 6e 66 6f 2d 3e 6e 46  if( pAggInfo->nF
17f50 75 6e 63 2b 70 41 67 67 49 6e 66 6f 2d 3e 6e 43  unc+pAggInfo->nC
17f60 6f 6c 75 6d 6e 3d 3d 30 20 29 7b 0a 20 20 20 20  olumn==0 ){.    
17f70 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 66 6f  return;.  }.  fo
17f80 72 28 69 3d 30 3b 20 69 3c 70 41 67 67 49 6e 66  r(i=0; i<pAggInf
17f90 6f 2d 3e 6e 43 6f 6c 75 6d 6e 3b 20 69 2b 2b 29  o->nColumn; i++)
17fa0 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  {.    sqlite3Vdb
17fb0 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 75  eAddOp2(v, OP_Nu
17fc0 6c 6c 2c 20 30 2c 20 70 41 67 67 49 6e 66 6f 2d  ll, 0, pAggInfo-
17fd0 3e 61 43 6f 6c 5b 69 5d 2e 69 4d 65 6d 29 3b 0a  >aCol[i].iMem);.
17fe0 20 20 7d 0a 20 20 66 6f 72 28 70 46 75 6e 63 3d    }.  for(pFunc=
17ff0 70 41 67 67 49 6e 66 6f 2d 3e 61 46 75 6e 63 2c  pAggInfo->aFunc,
18000 20 69 3d 30 3b 20 69 3c 70 41 67 67 49 6e 66 6f   i=0; i<pAggInfo
18010 2d 3e 6e 46 75 6e 63 3b 20 69 2b 2b 2c 20 70 46  ->nFunc; i++, pF
18020 75 6e 63 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69  unc++){.    sqli
18030 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
18040 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20 70 46 75   OP_Null, 0, pFu
18050 6e 63 2d 3e 69 4d 65 6d 29 3b 0a 20 20 20 20 69  nc->iMem);.    i
18060 66 28 20 70 46 75 6e 63 2d 3e 69 44 69 73 74 69  f( pFunc->iDisti
18070 6e 63 74 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20  nct>=0 ){.      
18080 45 78 70 72 20 2a 70 45 20 3d 20 70 46 75 6e 63  Expr *pE = pFunc
18090 2d 3e 70 45 78 70 72 3b 0a 20 20 20 20 20 20 69  ->pExpr;.      i
180a0 66 28 20 70 45 2d 3e 70 4c 69 73 74 3d 3d 30 20  f( pE->pList==0 
180b0 7c 7c 20 70 45 2d 3e 70 4c 69 73 74 2d 3e 6e 45  || pE->pList->nE
180c0 78 70 72 21 3d 31 20 29 7b 0a 20 20 20 20 20 20  xpr!=1 ){.      
180d0 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
180e0 67 28 70 50 61 72 73 65 2c 20 22 44 49 53 54 49  g(pParse, "DISTI
180f0 4e 43 54 20 69 6e 20 61 67 67 72 65 67 61 74 65  NCT in aggregate
18100 20 6d 75 73 74 20 62 65 20 66 6f 6c 6c 6f 77 65   must be followe
18110 64 20 22 0a 20 20 20 20 20 20 20 20 20 20 20 22  d ".           "
18120 62 79 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e  by an expression
18130 22 29 3b 0a 20 20 20 20 20 20 20 20 70 46 75 6e  ");.        pFun
18140 63 2d 3e 69 44 69 73 74 69 6e 63 74 20 3d 20 2d  c->iDistinct = -
18150 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  1;.      }else{.
18160 20 20 20 20 20 20 20 20 4b 65 79 49 6e 66 6f 20          KeyInfo 
18170 2a 70 4b 65 79 49 6e 66 6f 20 3d 20 6b 65 79 49  *pKeyInfo = keyI
18180 6e 66 6f 46 72 6f 6d 45 78 70 72 4c 69 73 74 28  nfoFromExprList(
18190 70 50 61 72 73 65 2c 20 70 45 2d 3e 70 4c 69 73  pParse, pE->pLis
181a0 74 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  t);.        sqli
181b0 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c  te3VdbeAddOp4(v,
181c0 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61   OP_OpenEphemera
181d0 6c 2c 20 70 46 75 6e 63 2d 3e 69 44 69 73 74 69  l, pFunc->iDisti
181e0 6e 63 74 2c 20 30 2c 20 30 2c 0a 20 20 20 20 20  nct, 0, 0,.     
181f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18200 20 20 20 20 20 28 63 68 61 72 2a 29 70 4b 65 79       (char*)pKey
18210 49 6e 66 6f 2c 20 50 34 5f 4b 45 59 49 4e 46 4f  Info, P4_KEYINFO
18220 5f 48 41 4e 44 4f 46 46 29 3b 0a 20 20 20 20 20  _HANDOFF);.     
18230 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a   }.    }.  }.}..
18240 2f 2a 0a 2a 2a 20 49 6e 76 6f 6b 65 20 74 68 65  /*.** Invoke the
18250 20 4f 50 5f 41 67 67 46 69 6e 61 6c 69 7a 65 20   OP_AggFinalize 
18260 6f 70 63 6f 64 65 20 66 6f 72 20 65 76 65 72 79  opcode for every
18270 20 61 67 67 72 65 67 61 74 65 20 66 75 6e 63 74   aggregate funct
18280 69 6f 6e 0a 2a 2a 20 69 6e 20 74 68 65 20 41 67  ion.** in the Ag
18290 67 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65 2e  gInfo structure.
182a0 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
182b0 66 69 6e 61 6c 69 7a 65 41 67 67 46 75 6e 63 74  finalizeAggFunct
182c0 69 6f 6e 73 28 50 61 72 73 65 20 2a 70 50 61 72  ions(Parse *pPar
182d0 73 65 2c 20 41 67 67 49 6e 66 6f 20 2a 70 41 67  se, AggInfo *pAg
182e0 67 49 6e 66 6f 29 7b 0a 20 20 56 64 62 65 20 2a  gInfo){.  Vdbe *
182f0 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62  v = pParse->pVdb
18300 65 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 73 74  e;.  int i;.  st
18310 72 75 63 74 20 41 67 67 49 6e 66 6f 5f 66 75 6e  ruct AggInfo_fun
18320 63 20 2a 70 46 3b 0a 20 20 66 6f 72 28 69 3d 30  c *pF;.  for(i=0
18330 2c 20 70 46 3d 70 41 67 67 49 6e 66 6f 2d 3e 61  , pF=pAggInfo->a
18340 46 75 6e 63 3b 20 69 3c 70 41 67 67 49 6e 66 6f  Func; i<pAggInfo
18350 2d 3e 6e 46 75 6e 63 3b 20 69 2b 2b 2c 20 70 46  ->nFunc; i++, pF
18360 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72 4c 69 73  ++){.    ExprLis
18370 74 20 2a 70 4c 69 73 74 20 3d 20 70 46 2d 3e 70  t *pList = pF->p
18380 45 78 70 72 2d 3e 70 4c 69 73 74 3b 0a 20 20 20  Expr->pList;.   
18390 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
183a0 70 34 28 76 2c 20 4f 50 5f 41 67 67 46 69 6e 61  p4(v, OP_AggFina
183b0 6c 2c 20 70 46 2d 3e 69 4d 65 6d 2c 20 70 4c 69  l, pF->iMem, pLi
183c0 73 74 20 3f 20 70 4c 69 73 74 2d 3e 6e 45 78 70  st ? pList->nExp
183d0 72 20 3a 20 30 2c 20 30 2c 0a 20 20 20 20 20 20  r : 0, 0,.      
183e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
183f0 28 76 6f 69 64 2a 29 70 46 2d 3e 70 46 75 6e 63  (void*)pF->pFunc
18400 2c 20 50 34 5f 46 55 4e 43 44 45 46 29 3b 0a 20  , P4_FUNCDEF);. 
18410 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 70 64 61   }.}../*.** Upda
18420 74 65 20 74 68 65 20 61 63 63 75 6d 75 6c 61 74  te the accumulat
18430 6f 72 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 73 20  or memory cells 
18440 66 6f 72 20 61 6e 20 61 67 67 72 65 67 61 74 65  for an aggregate
18450 20 62 61 73 65 64 20 6f 6e 0a 2a 2a 20 74 68 65   based on.** the
18460 20 63 75 72 72 65 6e 74 20 63 75 72 73 6f 72 20   current cursor 
18470 70 6f 73 69 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61  position..*/.sta
18480 74 69 63 20 76 6f 69 64 20 75 70 64 61 74 65 41  tic void updateA
18490 63 63 75 6d 75 6c 61 74 6f 72 28 50 61 72 73 65  ccumulator(Parse
184a0 20 2a 70 50 61 72 73 65 2c 20 41 67 67 49 6e 66   *pParse, AggInf
184b0 6f 20 2a 70 41 67 67 49 6e 66 6f 29 7b 0a 20 20  o *pAggInfo){.  
184c0 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65  Vdbe *v = pParse
184d0 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74 20 69  ->pVdbe;.  int i
184e0 3b 0a 20 20 73 74 72 75 63 74 20 41 67 67 49 6e  ;.  struct AggIn
184f0 66 6f 5f 66 75 6e 63 20 2a 70 46 3b 0a 20 20 73  fo_func *pF;.  s
18500 74 72 75 63 74 20 41 67 67 49 6e 66 6f 5f 63 6f  truct AggInfo_co
18510 6c 20 2a 70 43 3b 0a 0a 20 20 70 41 67 67 49 6e  l *pC;..  pAggIn
18520 66 6f 2d 3e 64 69 72 65 63 74 4d 6f 64 65 20 3d  fo->directMode =
18530 20 31 3b 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70   1;.  for(i=0, p
18540 46 3d 70 41 67 67 49 6e 66 6f 2d 3e 61 46 75 6e  F=pAggInfo->aFun
18550 63 3b 20 69 3c 70 41 67 67 49 6e 66 6f 2d 3e 6e  c; i<pAggInfo->n
18560 46 75 6e 63 3b 20 69 2b 2b 2c 20 70 46 2b 2b 29  Func; i++, pF++)
18570 7b 0a 20 20 20 20 69 6e 74 20 6e 41 72 67 3b 0a  {.    int nArg;.
18580 20 20 20 20 69 6e 74 20 61 64 64 72 4e 65 78 74      int addrNext
18590 20 3d 20 30 3b 0a 20 20 20 20 45 78 70 72 4c 69   = 0;.    ExprLi
185a0 73 74 20 2a 70 4c 69 73 74 20 3d 20 70 46 2d 3e  st *pList = pF->
185b0 70 45 78 70 72 2d 3e 70 4c 69 73 74 3b 0a 20 20  pExpr->pList;.  
185c0 20 20 69 66 28 20 70 4c 69 73 74 20 29 7b 0a 20    if( pList ){. 
185d0 20 20 20 20 20 6e 41 72 67 20 3d 20 70 4c 69 73       nArg = pLis
185e0 74 2d 3e 6e 45 78 70 72 3b 0a 20 20 20 20 20 20  t->nExpr;.      
185f0 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 45  sqlite3ExprCodeE
18600 78 70 72 4c 69 73 74 28 70 50 61 72 73 65 2c 20  xprList(pParse, 
18610 70 4c 69 73 74 2c 20 30 29 3b 0a 20 20 20 20 7d  pList, 0);.    }
18620 65 6c 73 65 7b 0a 20 20 20 20 20 20 6e 41 72 67  else{.      nArg
18630 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20   = 0;.    }.    
18640 69 66 28 20 70 46 2d 3e 69 44 69 73 74 69 6e 63  if( pF->iDistinc
18650 74 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 61 64  t>=0 ){.      ad
18660 64 72 4e 65 78 74 20 3d 20 73 71 6c 69 74 65 33  drNext = sqlite3
18670 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29  VdbeMakeLabel(v)
18680 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
18690 6e 41 72 67 3d 3d 31 20 29 3b 0a 20 20 20 20 20  nArg==1 );.     
186a0 20 63 6f 64 65 44 69 73 74 69 6e 63 74 5f 4f 4c   codeDistinct_OL
186b0 44 28 76 2c 20 70 46 2d 3e 69 44 69 73 74 69 6e  D(v, pF->iDistin
186c0 63 74 2c 20 61 64 64 72 4e 65 78 74 2c 20 31 29  ct, addrNext, 1)
186d0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
186e0 70 46 2d 3e 70 46 75 6e 63 2d 3e 6e 65 65 64 43  pF->pFunc->needC
186f0 6f 6c 6c 53 65 71 20 29 7b 0a 20 20 20 20 20 20  ollSeq ){.      
18700 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 20 3d  CollSeq *pColl =
18710 20 30 3b 0a 20 20 20 20 20 20 73 74 72 75 63 74   0;.      struct
18720 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a   ExprList_item *
18730 70 49 74 65 6d 3b 0a 20 20 20 20 20 20 69 6e 74  pItem;.      int
18740 20 6a 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   j;.      assert
18750 28 20 70 4c 69 73 74 21 3d 30 20 29 3b 20 20 2f  ( pList!=0 );  /
18760 2a 20 70 4c 69 73 74 21 3d 30 20 69 66 20 70 46  * pList!=0 if pF
18770 2d 3e 70 46 75 6e 63 2d 3e 6e 65 65 64 43 6f 6c  ->pFunc->needCol
18780 6c 53 65 71 20 69 73 20 74 72 75 65 20 2a 2f 0a  lSeq is true */.
18790 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 2c 20 70        for(j=0, p
187a0 49 74 65 6d 3d 70 4c 69 73 74 2d 3e 61 3b 20 21  Item=pList->a; !
187b0 70 43 6f 6c 6c 20 26 26 20 6a 3c 6e 41 72 67 3b  pColl && j<nArg;
187c0 20 6a 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a   j++, pItem++){.
187d0 20 20 20 20 20 20 20 20 70 43 6f 6c 6c 20 3d 20          pColl = 
187e0 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c 53  sqlite3ExprCollS
187f0 65 71 28 70 50 61 72 73 65 2c 20 70 49 74 65 6d  eq(pParse, pItem
18800 2d 3e 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20  ->pExpr);.      
18810 7d 0a 20 20 20 20 20 20 69 66 28 20 21 70 43 6f  }.      if( !pCo
18820 6c 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 70 43  ll ){.        pC
18830 6f 6c 6c 20 3d 20 70 50 61 72 73 65 2d 3e 64 62  oll = pParse->db
18840 2d 3e 70 44 66 6c 74 43 6f 6c 6c 3b 0a 20 20 20  ->pDfltColl;.   
18850 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74     }.      sqlit
18860 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20  e3VdbeAddOp4(v, 
18870 4f 50 5f 43 6f 6c 6c 53 65 71 2c 20 30 2c 20 30  OP_CollSeq, 0, 0
18880 2c 20 30 2c 20 28 63 68 61 72 20 2a 29 70 43 6f  , 0, (char *)pCo
18890 6c 6c 2c 20 50 34 5f 43 4f 4c 4c 53 45 51 29 3b  ll, P4_COLLSEQ);
188a0 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
188b0 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20  e3VdbeAddOp4(v, 
188c0 4f 50 5f 41 67 67 53 74 65 70 2c 20 70 46 2d 3e  OP_AggStep, pF->
188d0 69 4d 65 6d 2c 20 6e 41 72 67 2c 20 30 2c 20 0a  iMem, nArg, 0, .
188e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
188f0 20 20 20 20 20 20 28 76 6f 69 64 2a 29 70 46 2d        (void*)pF-
18900 3e 70 46 75 6e 63 2c 20 50 34 5f 46 55 4e 43 44  >pFunc, P4_FUNCD
18910 45 46 29 3b 0a 20 20 20 20 69 66 28 20 61 64 64  EF);.    if( add
18920 72 4e 65 78 74 20 29 7b 0a 20 20 20 20 20 20 73  rNext ){.      s
18930 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76  qlite3VdbeResolv
18940 65 4c 61 62 65 6c 28 76 2c 20 61 64 64 72 4e 65  eLabel(v, addrNe
18950 78 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  xt);.    }.  }. 
18960 20 66 6f 72 28 69 3d 30 2c 20 70 43 3d 70 41 67   for(i=0, pC=pAg
18970 67 49 6e 66 6f 2d 3e 61 43 6f 6c 3b 20 69 3c 70  gInfo->aCol; i<p
18980 41 67 67 49 6e 66 6f 2d 3e 6e 41 63 63 75 6d 75  AggInfo->nAccumu
18990 6c 61 74 6f 72 3b 20 69 2b 2b 2c 20 70 43 2b 2b  lator; i++, pC++
189a0 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78  ){.    sqlite3Ex
189b0 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70  prCode(pParse, p
189c0 43 2d 3e 70 45 78 70 72 2c 20 70 43 2d 3e 69 4d  C->pExpr, pC->iM
189d0 65 6d 29 3b 0a 20 20 7d 0a 20 20 70 41 67 67 49  em);.  }.  pAggI
189e0 6e 66 6f 2d 3e 64 69 72 65 63 74 4d 6f 64 65 20  nfo->directMode 
189f0 3d 20 30 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20  = 0;.}..#ifndef 
18a00 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 49 47  SQLITE_OMIT_TRIG
18a10 47 45 52 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66  GER./*.** This f
18a20 75 6e 63 74 69 6f 6e 20 69 73 20 75 73 65 64 20  unction is used 
18a30 77 68 65 6e 20 61 20 53 45 4c 45 43 54 20 73 74  when a SELECT st
18a40 61 74 65 6d 65 6e 74 20 69 73 20 75 73 65 64 20  atement is used 
18a50 74 6f 20 63 72 65 61 74 65 20 61 0a 2a 2a 20 74  to create a.** t
18a60 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20 66  emporary table f
18a70 6f 72 20 69 74 65 72 61 74 69 6e 67 20 74 68 72  or iterating thr
18a80 6f 75 67 68 20 77 68 65 6e 20 72 75 6e 6e 69 6e  ough when runnin
18a90 67 20 61 6e 20 49 4e 53 54 45 41 44 20 4f 46 0a  g an INSTEAD OF.
18aa0 2a 2a 20 55 50 44 41 54 45 20 6f 72 20 49 4e 53  ** UPDATE or INS
18ab0 54 45 41 44 20 4f 46 20 44 45 4c 45 54 45 20 74  TEAD OF DELETE t
18ac0 72 69 67 67 65 72 2e 20 0a 2a 2a 0a 2a 2a 20 49  rigger. .**.** I
18ad0 66 20 70 6f 73 73 69 62 6c 65 2c 20 74 68 65 20  f possible, the 
18ae0 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
18af0 20 69 73 20 6d 6f 64 69 66 69 65 64 20 73 6f 20   is modified so 
18b00 74 68 61 74 20 4e 55 4c 4c 20 76 61 6c 75 65 73  that NULL values
18b10 0a 2a 2a 20 61 72 65 20 73 74 6f 72 65 64 20 69  .** are stored i
18b20 6e 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79 20  n the temporary 
18b30 74 61 62 6c 65 20 66 6f 72 20 61 6c 6c 20 63 6f  table for all co
18b40 6c 75 6d 6e 73 20 66 6f 72 20 77 68 69 63 68 20  lumns for which 
18b50 74 68 65 20 0a 2a 2a 20 63 6f 72 72 65 73 70 6f  the .** correspo
18b60 6e 64 69 6e 67 20 62 69 74 20 69 6e 20 61 72 67  nding bit in arg
18b70 75 6d 65 6e 74 20 6d 61 73 6b 20 69 73 20 6e 6f  ument mask is no
18b80 74 20 73 65 74 2e 20 49 66 20 6d 61 73 6b 20 74  t set. If mask t
18b90 61 6b 65 73 20 74 68 65 0a 2a 2a 20 73 70 65 63  akes the.** spec
18ba0 69 61 6c 20 76 61 6c 75 65 20 30 78 66 66 66 66  ial value 0xffff
18bb0 66 66 66 66 2c 20 74 68 65 6e 20 61 6c 6c 20 63  ffff, then all c
18bc0 6f 6c 75 6d 6e 73 20 61 72 65 20 70 6f 70 75 6c  olumns are popul
18bd0 61 74 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  ated..*/.int sql
18be0 69 74 65 33 53 65 6c 65 63 74 4d 61 73 6b 28 50  ite3SelectMask(P
18bf0 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 53 65  arse *pParse, Se
18c00 6c 65 63 74 20 2a 70 2c 20 75 33 32 20 6d 61 73  lect *p, u32 mas
18c10 6b 29 7b 0a 20 20 69 66 28 20 21 70 2d 3e 70 50  k){.  if( !p->pP
18c20 72 69 6f 72 20 26 26 20 21 70 2d 3e 69 73 44 69  rior && !p->isDi
18c30 73 74 69 6e 63 74 20 26 26 20 6d 61 73 6b 21 3d  stinct && mask!=
18c40 30 78 66 66 66 66 66 66 66 66 20 29 7b 0a 20 20  0xffffffff ){.  
18c50 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69    ExprList *pELi
18c60 73 74 3b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20  st;.    int i;. 
18c70 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 65     if( sqlite3Se
18c80 6c 65 63 74 52 65 73 6f 6c 76 65 28 70 50 61 72  lectResolve(pPar
18c90 73 65 2c 20 70 2c 20 30 29 20 29 7b 0a 20 20 20  se, p, 0) ){.   
18ca0 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
18cb0 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20  _ERROR;.    }.  
18cc0 20 20 70 45 4c 69 73 74 20 3d 20 70 2d 3e 70 45    pEList = p->pE
18cd0 4c 69 73 74 3b 0a 20 20 20 20 66 6f 72 28 69 3d  List;.    for(i=
18ce0 30 3b 20 69 3c 70 45 4c 69 73 74 2d 3e 6e 45 78  0; i<pEList->nEx
18cf0 70 72 20 26 26 20 69 3c 33 32 3b 20 69 2b 2b 29  pr && i<32; i++)
18d00 7b 0a 20 20 20 20 20 20 69 66 28 20 21 28 6d 61  {.      if( !(ma
18d10 73 6b 26 28 28 75 33 32 29 31 3c 3c 69 29 29 20  sk&((u32)1<<i)) 
18d20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
18d30 65 33 45 78 70 72 44 65 6c 65 74 65 28 70 45 4c  e3ExprDelete(pEL
18d40 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 29  ist->a[i].pExpr)
18d50 3b 0a 20 20 20 20 20 20 20 20 70 45 4c 69 73 74  ;.        pEList
18d60 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 20 3d 20 73  ->a[i].pExpr = s
18d70 71 6c 69 74 65 33 45 78 70 72 28 70 50 61 72 73  qlite3Expr(pPars
18d80 65 2d 3e 64 62 2c 20 54 4b 5f 4e 55 4c 4c 2c 20  e->db, TK_NULL, 
18d90 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20  0, 0, 0);.      
18da0 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  }.    }.  }.  re
18db0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
18dc0 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  }.#endif../*.** 
18dd0 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 66 6f  Generate code fo
18de0 72 20 74 68 65 20 67 69 76 65 6e 20 53 45 4c 45  r the given SELE
18df0 43 54 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a  CT statement..**
18e00 0a 2a 2a 20 54 68 65 20 72 65 73 75 6c 74 73 20  .** The results 
18e10 61 72 65 20 64 69 73 74 72 69 62 75 74 65 64 20  are distributed 
18e20 69 6e 20 76 61 72 69 6f 75 73 20 77 61 79 73 20  in various ways 
18e30 64 65 70 65 6e 64 69 6e 67 20 6f 6e 20 74 68 65  depending on the
18e40 0a 2a 2a 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20  .** contents of 
18e50 74 68 65 20 53 65 6c 65 63 74 44 65 73 74 20 73  the SelectDest s
18e60 74 72 75 63 74 75 72 65 20 70 6f 69 6e 74 65 64  tructure pointed
18e70 20 74 6f 20 62 79 20 61 72 67 75 6d 65 6e 74 20   to by argument 
18e80 70 44 65 73 74 0a 2a 2a 20 61 73 20 66 6f 6c 6c  pDest.** as foll
18e90 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 70  ows:.**.**     p
18ea0 44 65 73 74 2d 3e 65 44 65 73 74 20 20 20 20 52  Dest->eDest    R
18eb0 65 73 75 6c 74 0a 2a 2a 20 20 20 20 20 2d 2d 2d  esult.**     ---
18ec0 2d 2d 2d 2d 2d 2d 2d 2d 2d 20 20 20 20 2d 2d 2d  ---------    ---
18ed0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
18ee0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
18ef0 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a 20 20 20 20 20  --------.**     
18f00 53 52 54 5f 43 61 6c 6c 62 61 63 6b 20 20 20 20  SRT_Callback    
18f10 49 6e 76 6f 6b 65 20 74 68 65 20 63 61 6c 6c 62  Invoke the callb
18f20 61 63 6b 20 66 6f 72 20 65 61 63 68 20 72 6f 77  ack for each row
18f30 20 6f 66 20 74 68 65 20 72 65 73 75 6c 74 2e 0a   of the result..
18f40 2a 2a 0a 2a 2a 20 20 20 20 20 53 52 54 5f 4d 65  **.**     SRT_Me
18f50 6d 20 20 20 20 20 20 20 20 20 53 74 6f 72 65 20  m         Store 
18f60 66 69 72 73 74 20 72 65 73 75 6c 74 20 69 6e 20  first result in 
18f70 6d 65 6d 6f 72 79 20 63 65 6c 6c 20 70 44 65 73  memory cell pDes
18f80 74 2d 3e 69 50 61 72 6d 0a 2a 2a 0a 2a 2a 20 20  t->iParm.**.**  
18f90 20 20 20 53 52 54 5f 53 65 74 20 20 20 20 20 20     SRT_Set      
18fa0 20 20 20 53 74 6f 72 65 20 6e 6f 6e 2d 6e 75 6c     Store non-nul
18fb0 6c 20 72 65 73 75 6c 74 73 20 61 73 20 6b 65 79  l results as key
18fc0 73 20 6f 66 20 74 61 62 6c 65 20 70 44 65 73 74  s of table pDest
18fd0 2d 3e 69 50 61 72 6d 2e 20 0a 2a 2a 20 20 20 20  ->iParm. .**    
18fe0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18ff0 20 41 70 70 6c 79 20 74 68 65 20 61 66 66 69 6e   Apply the affin
19000 69 74 79 20 70 44 65 73 74 2d 3e 61 66 66 69 6e  ity pDest->affin
19010 69 74 79 20 62 65 66 6f 72 65 20 73 74 6f 72 69  ity before stori
19020 6e 67 20 74 68 65 6d 2e 0a 2a 2a 0a 2a 2a 20 20  ng them..**.**  
19030 20 20 20 53 52 54 5f 55 6e 69 6f 6e 20 20 20 20     SRT_Union    
19040 20 20 20 53 74 6f 72 65 20 72 65 73 75 6c 74 73     Store results
19050 20 61 73 20 61 20 6b 65 79 20 69 6e 20 61 20 74   as a key in a t
19060 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20 70  emporary table p
19070 44 65 73 74 2d 3e 69 50 61 72 6d 2e 0a 2a 2a 0a  Dest->iParm..**.
19080 2a 2a 20 20 20 20 20 53 52 54 5f 45 78 63 65 70  **     SRT_Excep
19090 74 20 20 20 20 20 20 52 65 6d 6f 76 65 20 72 65  t      Remove re
190a0 73 75 6c 74 73 20 66 72 6f 6d 20 74 68 65 20 74  sults from the t
190b0 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20 70  emporary table p
190c0 44 65 73 74 2d 3e 69 50 61 72 6d 2e 0a 2a 2a 0a  Dest->iParm..**.
190d0 2a 2a 20 20 20 20 20 53 52 54 5f 54 61 62 6c 65  **     SRT_Table
190e0 20 20 20 20 20 20 20 53 74 6f 72 65 20 72 65 73         Store res
190f0 75 6c 74 73 20 69 6e 20 74 65 6d 70 6f 72 61 72  ults in temporar
19100 79 20 74 61 62 6c 65 20 70 44 65 73 74 2d 3e 69  y table pDest->i
19110 50 61 72 6d 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53  Parm.**.**     S
19120 52 54 5f 45 70 68 65 6d 54 61 62 20 20 20 20 43  RT_EphemTab    C
19130 72 65 61 74 65 20 61 6e 20 74 65 6d 70 6f 72 61  reate an tempora
19140 72 79 20 74 61 62 6c 65 20 70 44 65 73 74 2d 3e  ry table pDest->
19150 69 50 61 72 6d 20 61 6e 64 20 73 74 6f 72 65 0a  iParm and store.
19160 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
19170 20 20 20 20 20 20 20 74 68 65 20 72 65 73 75 6c         the resul
19180 74 20 74 68 65 72 65 2e 20 54 68 65 20 63 75 72  t there. The cur
19190 73 6f 72 20 69 73 20 6c 65 66 74 20 6f 70 65 6e  sor is left open
191a0 20 61 66 74 65 72 0a 2a 2a 20 20 20 20 20 20 20   after.**       
191b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72 65                re
191c0 74 75 72 6e 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 20  turning..**.**  
191d0 20 20 20 53 52 54 5f 53 75 62 72 6f 75 74 69 6e     SRT_Subroutin
191e0 65 20 20 46 6f 72 20 65 61 63 68 20 72 6f 77 20  e  For each row 
191f0 72 65 74 75 72 6e 65 64 2c 20 70 75 73 68 20 74  returned, push t
19200 68 65 20 72 65 73 75 6c 74 73 20 6f 6e 74 6f 20  he results onto 
19210 74 68 65 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  the.**          
19220 20 20 20 20 20 20 20 20 20 20 20 76 64 62 65 20             vdbe 
19230 73 74 61 63 6b 20 61 6e 64 20 63 61 6c 6c 20 74  stack and call t
19240 68 65 20 73 75 62 72 6f 75 74 69 6e 65 20 28 76  he subroutine (v
19250 69 61 20 4f 50 5f 47 6f 73 75 62 29 0a 2a 2a 20  ia OP_Gosub).** 
19260 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19270 20 20 20 20 61 74 20 61 64 64 72 65 73 73 20 70      at address p
19280 44 65 73 74 2d 3e 69 50 61 72 6d 2e 0a 2a 2a 0a  Dest->iParm..**.
19290 2a 2a 20 20 20 20 20 53 52 54 5f 45 78 69 73 74  **     SRT_Exist
192a0 73 20 20 20 20 20 20 53 74 6f 72 65 20 61 20 31  s      Store a 1
192b0 20 69 6e 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 20   in memory cell 
192c0 70 44 65 73 74 2d 3e 69 50 61 72 6d 20 69 66 20  pDest->iParm if 
192d0 74 68 65 20 72 65 73 75 6c 74 0a 2a 2a 20 20 20  the result.**   
192e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
192f0 20 20 73 65 74 20 69 73 20 6e 6f 74 20 65 6d 70    set is not emp
19300 74 79 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 52  ty..**.**     SR
19310 54 5f 44 69 73 63 61 72 64 20 20 20 20 20 54 68  T_Discard     Th
19320 72 6f 77 20 74 68 65 20 72 65 73 75 6c 74 73 20  row the results 
19330 61 77 61 79 2e 0a 2a 2a 0a 2a 2a 20 53 65 65 20  away..**.** See 
19340 74 68 65 20 73 65 6c 65 63 74 49 6e 6e 65 72 4c  the selectInnerL
19350 6f 6f 70 28 29 20 66 75 6e 63 74 69 6f 6e 20 66  oop() function f
19360 6f 72 20 61 20 63 61 6e 6f 6e 69 63 61 6c 20 6c  or a canonical l
19370 69 73 74 69 6e 67 20 6f 66 20 74 68 65 20 0a 2a  isting of the .*
19380 2a 20 61 6c 6c 6f 77 65 64 20 76 61 6c 75 65 73  * allowed values
19390 20 6f 66 20 65 44 65 73 74 20 61 6e 64 20 74 68   of eDest and th
193a0 65 69 72 20 6d 65 61 6e 69 6e 67 73 2e 0a 2a 2a  eir meanings..**
193b0 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
193c0 20 72 65 74 75 72 6e 73 20 74 68 65 20 6e 75 6d   returns the num
193d0 62 65 72 20 6f 66 20 65 72 72 6f 72 73 2e 20 20  ber of errors.  
193e0 49 66 20 61 6e 79 20 65 72 72 6f 72 73 20 61 72  If any errors ar
193f0 65 0a 2a 2a 20 65 6e 63 6f 75 6e 74 65 72 65 64  e.** encountered
19400 2c 20 74 68 65 6e 20 61 6e 20 61 70 70 72 6f 70  , then an approp
19410 72 69 61 74 65 20 65 72 72 6f 72 20 6d 65 73 73  riate error mess
19420 61 67 65 20 69 73 20 6c 65 66 74 20 69 6e 0a 2a  age is left in.*
19430 2a 20 70 50 61 72 73 65 2d 3e 7a 45 72 72 4d 73  * pParse->zErrMs
19440 67 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  g..**.** This ro
19450 75 74 69 6e 65 20 64 6f 65 73 20 4e 4f 54 20 66  utine does NOT f
19460 72 65 65 20 74 68 65 20 53 65 6c 65 63 74 20 73  ree the Select s
19470 74 72 75 63 74 75 72 65 20 70 61 73 73 65 64 20  tructure passed 
19480 69 6e 2e 20 20 54 68 65 0a 2a 2a 20 63 61 6c 6c  in.  The.** call
19490 69 6e 67 20 66 75 6e 63 74 69 6f 6e 20 6e 65 65  ing function nee
194a0 64 73 20 74 6f 20 64 6f 20 74 68 61 74 2e 0a 2a  ds to do that..*
194b0 2a 0a 2a 2a 20 54 68 65 20 70 50 61 72 65 6e 74  *.** The pParent
194c0 2c 20 70 61 72 65 6e 74 54 61 62 2c 20 61 6e 64  , parentTab, and
194d0 20 2a 70 50 61 72 65 6e 74 41 67 67 20 66 69 65   *pParentAgg fie
194e0 6c 64 73 20 61 72 65 20 66 69 6c 6c 65 64 20 69  lds are filled i
194f0 6e 20 69 66 20 74 68 69 73 0a 2a 2a 20 53 45 4c  n if this.** SEL
19500 45 43 54 20 69 73 20 61 20 73 75 62 71 75 65 72  ECT is a subquer
19510 79 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65  y.  This routine
19520 20 6d 61 79 20 74 72 79 20 74 6f 20 63 6f 6d 62   may try to comb
19530 69 6e 65 20 74 68 69 73 20 53 45 4c 45 43 54 0a  ine this SELECT.
19540 2a 2a 20 77 69 74 68 20 69 74 73 20 70 61 72 65  ** with its pare
19550 6e 74 20 74 6f 20 66 6f 72 6d 20 61 20 73 69 6e  nt to form a sin
19560 67 6c 65 20 66 6c 61 74 20 71 75 65 72 79 2e 20  gle flat query. 
19570 20 49 6e 20 73 6f 20 64 6f 69 6e 67 2c 20 69 74   In so doing, it
19580 20 6d 69 67 68 74 0a 2a 2a 20 63 68 61 6e 67 65   might.** change
19590 20 74 68 65 20 70 61 72 65 6e 74 20 71 75 65 72   the parent quer
195a0 79 20 66 72 6f 6d 20 61 20 6e 6f 6e 2d 61 67 67  y from a non-agg
195b0 72 65 67 61 74 65 20 74 6f 20 61 6e 20 61 67 67  regate to an agg
195c0 72 65 67 61 74 65 20 71 75 65 72 79 2e 0a 2a 2a  regate query..**
195d0 20 46 6f 72 20 74 68 61 74 20 72 65 61 73 6f 6e   For that reason
195e0 2c 20 74 68 65 20 70 50 61 72 65 6e 74 41 67 67  , the pParentAgg
195f0 20 66 6c 61 67 20 69 73 20 70 61 73 73 65 64 20   flag is passed 
19600 61 73 20 61 20 70 6f 69 6e 74 65 72 2c 20 73 6f  as a pointer, so
19610 20 69 74 0a 2a 2a 20 63 61 6e 20 62 65 20 63 68   it.** can be ch
19620 61 6e 67 65 64 2e 0a 2a 2a 0a 2a 2a 20 45 78 61  anged..**.** Exa
19630 6d 70 6c 65 20 31 3a 20 20 20 54 68 65 20 6d 65  mple 1:   The me
19640 61 6e 69 6e 67 20 6f 66 20 74 68 65 20 70 50 61  aning of the pPa
19650 72 65 6e 74 20 70 61 72 61 6d 65 74 65 72 2e 0a  rent parameter..
19660 2a 2a 0a 2a 2a 20 20 20 20 53 45 4c 45 43 54 20  **.**    SELECT 
19670 2a 20 46 52 4f 4d 20 74 31 20 4a 4f 49 4e 20 28  * FROM t1 JOIN (
19680 53 45 4c 45 43 54 20 78 2c 20 63 6f 75 6e 74 28  SELECT x, count(
19690 2a 29 20 46 52 4f 4d 20 74 32 29 20 4a 4f 49 4e  *) FROM t2) JOIN
196a0 20 74 33 3b 0a 2a 2a 20 20 20 20 5c 20 20 20 20   t3;.**    \    
196b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
196c0 20 20 5c 5f 5f 5f 5f 5f 5f 5f 20 73 75 62 71 75    \_______ subqu
196d0 65 72 79 20 5f 5f 5f 5f 5f 5f 5f 2f 20 20 20 20  ery _______/    
196e0 20 20 20 20 2f 0a 2a 2a 20 20 20 20 20 5c 20 20      /.**     \  
196f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19700 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19710 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19720 20 20 20 20 2f 0a 2a 2a 20 20 20 20 20 20 5c 5f      /.**      \_
19730 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f  ________________
19740 5f 5f 5f 20 6f 75 74 65 72 20 71 75 65 72 79 20  ___ outer query 
19750 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f  ________________
19760 5f 5f 5f 2f 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ___/.**.** This 
19770 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65  routine is calle
19780 64 20 66 6f 72 20 74 68 65 20 6f 75 74 65 72 20  d for the outer 
19790 71 75 65 72 79 20 66 69 72 73 74 2e 20 20 20 46  query first.   F
197a0 6f 72 20 74 68 61 74 20 63 61 6c 6c 2c 0a 2a 2a  or that call,.**
197b0 20 70 50 61 72 65 6e 74 20 77 69 6c 6c 20 62 65   pParent will be
197c0 20 4e 55 4c 4c 2e 20 20 44 75 72 69 6e 67 20 74   NULL.  During t
197d0 68 65 20 70 72 6f 63 65 73 73 69 6e 67 20 6f 66  he processing of
197e0 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79   the outer query
197f0 2c 20 74 68 69 73 20 0a 2a 2a 20 72 6f 75 74 69  , this .** routi
19800 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 72 65 63  ne is called rec
19810 75 72 73 69 76 65 6c 79 20 74 6f 20 68 61 6e 64  ursively to hand
19820 6c 65 20 74 68 65 20 73 75 62 71 75 65 72 79 2e  le the subquery.
19830 20 20 46 6f 72 20 74 68 65 20 72 65 63 75 72 73    For the recurs
19840 69 76 65 0a 2a 2a 20 63 61 6c 6c 2c 20 70 50 61  ive.** call, pPa
19850 72 65 6e 74 20 77 69 6c 6c 20 70 6f 69 6e 74 20  rent will point 
19860 74 6f 20 74 68 65 20 6f 75 74 65 72 20 71 75 65  to the outer que
19870 72 79 2e 20 20 42 65 63 61 75 73 65 20 74 68 65  ry.  Because the
19880 20 73 75 62 71 75 65 72 79 20 69 73 0a 2a 2a 20   subquery is.** 
19890 74 68 65 20 73 65 63 6f 6e 64 20 65 6c 65 6d 65  the second eleme
198a0 6e 74 20 69 6e 20 61 20 74 68 72 65 65 2d 77 61  nt in a three-wa
198b0 79 20 6a 6f 69 6e 2c 20 74 68 65 20 70 61 72 65  y join, the pare
198c0 6e 74 54 61 62 20 70 61 72 61 6d 65 74 65 72 20  ntTab parameter 
198d0 77 69 6c 6c 0a 2a 2a 20 62 65 20 31 20 28 74 68  will.** be 1 (th
198e0 65 20 32 6e 64 20 76 61 6c 75 65 20 6f 66 20 61  e 2nd value of a
198f0 20 30 2d 69 6e 64 65 78 65 64 20 61 72 72 61 79   0-indexed array
19900 2e 29 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  .).*/.int sqlite
19910 33 53 65 6c 65 63 74 28 0a 20 20 50 61 72 73 65  3Select(.  Parse
19920 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20   *pParse,       
19930 20 20 2f 2a 20 54 68 65 20 70 61 72 73 65 72 20    /* The parser 
19940 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53 65 6c  context */.  Sel
19950 65 63 74 20 2a 70 2c 20 20 20 20 20 20 20 20 20  ect *p,         
19960 20 20 20 20 2f 2a 20 54 68 65 20 53 45 4c 45 43      /* The SELEC
19970 54 20 73 74 61 74 65 6d 65 6e 74 20 62 65 69 6e  T statement bein
19980 67 20 63 6f 64 65 64 2e 20 2a 2f 0a 20 20 53 65  g coded. */.  Se
19990 6c 65 63 74 44 65 73 74 20 2a 70 44 65 73 74 2c  lectDest *pDest,
199a0 20 20 20 20 20 2f 2a 20 57 68 61 74 20 74 6f 20       /* What to 
199b0 64 6f 20 77 69 74 68 20 74 68 65 20 71 75 65 72  do with the quer
199c0 79 20 72 65 73 75 6c 74 73 20 2a 2f 0a 20 20 53  y results */.  S
199d0 65 6c 65 63 74 20 2a 70 50 61 72 65 6e 74 2c 20  elect *pParent, 
199e0 20 20 20 20 20 20 2f 2a 20 41 6e 6f 74 68 65 72        /* Another
199f0 20 53 45 4c 45 43 54 20 66 6f 72 20 77 68 69 63   SELECT for whic
19a00 68 20 74 68 69 73 20 69 73 20 61 20 73 75 62 2d  h this is a sub-
19a10 71 75 65 72 79 20 2a 2f 0a 20 20 69 6e 74 20 70  query */.  int p
19a20 61 72 65 6e 74 54 61 62 2c 20 20 20 20 20 20 20  arentTab,       
19a30 20 20 2f 2a 20 49 6e 64 65 78 20 69 6e 20 70 50    /* Index in pP
19a40 61 72 65 6e 74 2d 3e 70 53 72 63 20 6f 66 20 74  arent->pSrc of t
19a50 68 69 73 20 71 75 65 72 79 20 2a 2f 0a 20 20 69  his query */.  i
19a60 6e 74 20 2a 70 50 61 72 65 6e 74 41 67 67 2c 20  nt *pParentAgg, 
19a70 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66        /* True if
19a80 20 70 50 61 72 65 6e 74 20 75 73 65 73 20 61 67   pParent uses ag
19a90 67 72 65 67 61 74 65 20 66 75 6e 63 74 69 6f 6e  gregate function
19aa0 73 20 2a 2f 0a 20 20 63 68 61 72 20 2a 61 66 66  s */.  char *aff
19ab0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
19ac0 20 49 66 20 65 44 65 73 74 20 69 73 20 53 52 54   If eDest is SRT
19ad0 5f 55 6e 69 6f 6e 2c 20 74 68 65 20 61 66 66 69  _Union, the affi
19ae0 6e 69 74 79 20 73 74 72 69 6e 67 20 2a 2f 0a 29  nity string */.)
19af0 7b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 20 20 20  {.  int i, j;   
19b00 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f             /* Lo
19b10 6f 70 20 63 6f 75 6e 74 65 72 73 20 2a 2f 0a 20  op counters */. 
19b20 20 57 68 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e   WhereInfo *pWIn
19b30 66 6f 3b 20 20 20 20 20 2f 2a 20 52 65 74 75 72  fo;     /* Retur
19b40 6e 20 66 72 6f 6d 20 73 71 6c 69 74 65 33 57 68  n from sqlite3Wh
19b50 65 72 65 42 65 67 69 6e 28 29 20 2a 2f 0a 20 20  ereBegin() */.  
19b60 56 64 62 65 20 2a 76 3b 20 20 20 20 20 20 20 20  Vdbe *v;        
19b70 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 76 69         /* The vi
19b80 72 74 75 61 6c 20 6d 61 63 68 69 6e 65 20 75 6e  rtual machine un
19b90 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e  der construction
19ba0 20 2a 2f 0a 20 20 69 6e 74 20 69 73 41 67 67 3b   */.  int isAgg;
19bb0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
19bc0 54 72 75 65 20 66 6f 72 20 73 65 6c 65 63 74 20  True for select 
19bd0 6c 69 73 74 73 20 6c 69 6b 65 20 22 63 6f 75 6e  lists like "coun
19be0 74 28 2a 29 22 20 2a 2f 0a 20 20 45 78 70 72 4c  t(*)" */.  ExprL
19bf0 69 73 74 20 2a 70 45 4c 69 73 74 3b 20 20 20 20  ist *pEList;    
19c00 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 63 6f 6c    /* List of col
19c10 75 6d 6e 73 20 74 6f 20 65 78 74 72 61 63 74 2e  umns to extract.
19c20 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a 70   */.  SrcList *p
19c30 54 61 62 4c 69 73 74 3b 20 20 20 20 20 2f 2a 20  TabList;     /* 
19c40 4c 69 73 74 20 6f 66 20 74 61 62 6c 65 73 20 74  List of tables t
19c50 6f 20 73 65 6c 65 63 74 20 66 72 6f 6d 20 2a 2f  o select from */
19c60 0a 20 20 45 78 70 72 20 2a 70 57 68 65 72 65 3b  .  Expr *pWhere;
19c70 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
19c80 20 57 48 45 52 45 20 63 6c 61 75 73 65 2e 20 20   WHERE clause.  
19c90 4d 61 79 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20  May be NULL */. 
19ca0 20 45 78 70 72 4c 69 73 74 20 2a 70 4f 72 64 65   ExprList *pOrde
19cb0 72 42 79 3b 20 20 20 20 2f 2a 20 54 68 65 20 4f  rBy;    /* The O
19cc0 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 2e 20  RDER BY clause. 
19cd0 20 4d 61 79 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a   May be NULL */.
19ce0 20 20 45 78 70 72 4c 69 73 74 20 2a 70 47 72 6f    ExprList *pGro
19cf0 75 70 42 79 3b 20 20 20 20 2f 2a 20 54 68 65 20  upBy;    /* The 
19d00 47 52 4f 55 50 20 42 59 20 63 6c 61 75 73 65 2e  GROUP BY clause.
19d10 20 20 4d 61 79 20 62 65 20 4e 55 4c 4c 20 2a 2f    May be NULL */
19d20 0a 20 20 45 78 70 72 20 2a 70 48 61 76 69 6e 67  .  Expr *pHaving
19d30 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65  ;         /* The
19d40 20 48 41 56 49 4e 47 20 63 6c 61 75 73 65 2e 20   HAVING clause. 
19d50 20 4d 61 79 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a   May be NULL */.
19d60 20 20 69 6e 74 20 69 73 44 69 73 74 69 6e 63 74    int isDistinct
19d70 3b 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65  ;        /* True
19d80 20 69 66 20 74 68 65 20 44 49 53 54 49 4e 43 54   if the DISTINCT
19d90 20 6b 65 79 77 6f 72 64 20 69 73 20 70 72 65 73   keyword is pres
19da0 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 64 69 73  ent */.  int dis
19db0 74 69 6e 63 74 3b 20 20 20 20 20 20 20 20 20 20  tinct;          
19dc0 2f 2a 20 54 61 62 6c 65 20 74 6f 20 75 73 65 20  /* Table to use 
19dd0 66 6f 72 20 74 68 65 20 64 69 73 74 69 6e 63 74  for the distinct
19de0 20 73 65 74 20 2a 2f 0a 20 20 69 6e 74 20 72 63   set */.  int rc
19df0 20 3d 20 31 3b 20 20 20 20 20 20 20 20 20 20 20   = 1;           
19e00 20 2f 2a 20 56 61 6c 75 65 20 74 6f 20 72 65 74   /* Value to ret
19e10 75 72 6e 20 66 72 6f 6d 20 74 68 69 73 20 66 75  urn from this fu
19e20 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20  nction */.  int 
19e30 61 64 64 72 53 6f 72 74 49 6e 64 65 78 3b 20 20  addrSortIndex;  
19e40 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66     /* Address of
19e50 20 61 6e 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d   an OP_OpenEphem
19e60 65 72 61 6c 20 69 6e 73 74 72 75 63 74 69 6f 6e  eral instruction
19e70 20 2a 2f 0a 20 20 41 67 67 49 6e 66 6f 20 73 41   */.  AggInfo sA
19e80 67 67 49 6e 66 6f 3b 20 20 20 20 20 20 2f 2a 20  ggInfo;      /* 
19e90 49 6e 66 6f 72 6d 61 74 69 6f 6e 20 75 73 65 64  Information used
19ea0 20 62 79 20 61 67 67 72 65 67 61 74 65 20 71 75   by aggregate qu
19eb0 65 72 69 65 73 20 2a 2f 0a 20 20 69 6e 74 20 69  eries */.  int i
19ec0 45 6e 64 3b 20 20 20 20 20 20 20 20 20 20 20 20  End;            
19ed0 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20    /* Address of 
19ee0 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 71  the end of the q
19ef0 75 65 72 79 20 2a 2f 0a 20 20 73 71 6c 69 74 65  uery */.  sqlite
19f00 33 20 2a 64 62 3b 20 20 20 20 20 20 20 20 20 20  3 *db;          
19f10 20 2f 2a 20 54 68 65 20 64 61 74 61 62 61 73 65   /* The database
19f20 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 0a   connection */..
19f30 20 20 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64    db = pParse->d
19f40 62 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 7c 7c  b;.  if( p==0 ||
19f50 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
19f60 64 20 7c 7c 20 70 50 61 72 73 65 2d 3e 6e 45 72  d || pParse->nEr
19f70 72 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  r ){.    return 
19f80 31 3b 0a 20 20 7d 0a 20 20 69 66 28 20 73 71 6c  1;.  }.  if( sql
19f90 69 74 65 33 41 75 74 68 43 68 65 63 6b 28 70 50  ite3AuthCheck(pP
19fa0 61 72 73 65 2c 20 53 51 4c 49 54 45 5f 53 45 4c  arse, SQLITE_SEL
19fb0 45 43 54 2c 20 30 2c 20 30 2c 20 30 29 20 29 20  ECT, 0, 0, 0) ) 
19fc0 72 65 74 75 72 6e 20 31 3b 0a 20 20 6d 65 6d 73  return 1;.  mems
19fd0 65 74 28 26 73 41 67 67 49 6e 66 6f 2c 20 30 2c  et(&sAggInfo, 0,
19fe0 20 73 69 7a 65 6f 66 28 73 41 67 67 49 6e 66 6f   sizeof(sAggInfo
19ff0 29 29 3b 0a 0a 20 20 70 4f 72 64 65 72 42 79 20  ));..  pOrderBy 
1a000 3d 20 70 2d 3e 70 4f 72 64 65 72 42 79 3b 0a 20  = p->pOrderBy;. 
1a010 20 69 66 28 20 49 67 6e 6f 72 61 62 6c 65 4f 72   if( IgnorableOr
1a020 64 65 72 62 79 28 70 44 65 73 74 29 20 29 7b 0a  derby(pDest) ){.
1a030 20 20 20 20 70 2d 3e 70 4f 72 64 65 72 42 79 20      p->pOrderBy 
1a040 3d 20 30 3b 0a 0a 20 20 20 20 2f 2a 20 49 6e 20  = 0;..    /* In 
1a050 74 68 65 73 65 20 63 61 73 65 73 20 74 68 65 20  these cases the 
1a060 44 49 53 54 49 4e 43 54 20 6f 70 65 72 61 74 6f  DISTINCT operato
1a070 72 20 6d 61 6b 65 73 20 6e 6f 20 64 69 66 66 65  r makes no diffe
1a080 72 65 6e 63 65 20 74 6f 20 74 68 65 0a 20 20 20  rence to the.   
1a090 20 2a 2a 20 72 65 73 75 6c 74 73 2c 20 73 6f 20   ** results, so 
1a0a0 72 65 6d 6f 76 65 20 69 74 20 69 66 20 69 74 20  remove it if it 
1a0b0 77 65 72 65 20 73 70 65 63 69 66 69 65 64 2e 0a  were specified..
1a0c0 20 20 20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72      */.    asser
1a0d0 74 28 70 44 65 73 74 2d 3e 65 44 65 73 74 3d 3d  t(pDest->eDest==
1a0e0 53 52 54 5f 45 78 69 73 74 73 20 7c 7c 20 70 44  SRT_Exists || pD
1a0f0 65 73 74 2d 3e 65 44 65 73 74 3d 3d 53 52 54 5f  est->eDest==SRT_
1a100 55 6e 69 6f 6e 20 7c 7c 20 0a 20 20 20 20 20 20  Union || .      
1a110 20 20 20 20 20 70 44 65 73 74 2d 3e 65 44 65 73       pDest->eDes
1a120 74 3d 3d 53 52 54 5f 45 78 63 65 70 74 20 7c 7c  t==SRT_Except ||
1a130 20 70 44 65 73 74 2d 3e 65 44 65 73 74 3d 3d 53   pDest->eDest==S
1a140 52 54 5f 44 69 73 63 61 72 64 29 3b 0a 20 20 20  RT_Discard);.   
1a150 20 70 2d 3e 69 73 44 69 73 74 69 6e 63 74 20 3d   p->isDistinct =
1a160 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 73 71   0;.  }.  if( sq
1a170 6c 69 74 65 33 53 65 6c 65 63 74 52 65 73 6f 6c  lite3SelectResol
1a180 76 65 28 70 50 61 72 73 65 2c 20 70 2c 20 30 29  ve(pParse, p, 0)
1a190 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 73 65 6c   ){.    goto sel
1a1a0 65 63 74 5f 65 6e 64 3b 0a 20 20 7d 0a 20 20 70  ect_end;.  }.  p
1a1b0 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20 70 4f 72  ->pOrderBy = pOr
1a1c0 64 65 72 42 79 3b 0a 0a 23 69 66 6e 64 65 66 20  derBy;..#ifndef 
1a1d0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f 4d 50  SQLITE_OMIT_COMP
1a1e0 4f 55 4e 44 5f 53 45 4c 45 43 54 0a 20 20 2f 2a  OUND_SELECT.  /*
1a1f0 20 49 66 20 74 68 65 72 65 20 69 73 20 61 72 65   If there is are
1a200 20 61 20 73 65 71 75 65 6e 63 65 20 6f 66 20 71   a sequence of q
1a210 75 65 72 69 65 73 2c 20 64 6f 20 74 68 65 20 65  ueries, do the e
1a220 61 72 6c 69 65 72 20 6f 6e 65 73 20 66 69 72 73  arlier ones firs
1a230 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d  t..  */.  if( p-
1a240 3e 70 50 72 69 6f 72 20 29 7b 0a 20 20 20 20 69  >pPrior ){.    i
1a250 66 28 20 70 2d 3e 70 52 69 67 68 74 6d 6f 73 74  f( p->pRightmost
1a260 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 53 65 6c  ==0 ){.      Sel
1a270 65 63 74 20 2a 70 4c 6f 6f 70 2c 20 2a 70 52 69  ect *pLoop, *pRi
1a280 67 68 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 69  ght = 0;.      i
1a290 6e 74 20 63 6e 74 20 3d 20 30 3b 0a 20 20 20 20  nt cnt = 0;.    
1a2a0 20 20 66 6f 72 28 70 4c 6f 6f 70 3d 70 3b 20 70    for(pLoop=p; p
1a2b0 4c 6f 6f 70 3b 20 70 4c 6f 6f 70 3d 70 4c 6f 6f  Loop; pLoop=pLoo
1a2c0 70 2d 3e 70 50 72 69 6f 72 2c 20 63 6e 74 2b 2b  p->pPrior, cnt++
1a2d0 29 7b 0a 20 20 20 20 20 20 20 20 70 4c 6f 6f 70  ){.        pLoop
1a2e0 2d 3e 70 52 69 67 68 74 6d 6f 73 74 20 3d 20 70  ->pRightmost = p
1a2f0 3b 0a 20 20 20 20 20 20 20 20 70 4c 6f 6f 70 2d  ;.        pLoop-
1a300 3e 70 4e 65 78 74 20 3d 20 70 52 69 67 68 74 3b  >pNext = pRight;
1a310 0a 20 20 20 20 20 20 20 20 70 52 69 67 68 74 20  .        pRight 
1a320 3d 20 70 4c 6f 6f 70 3b 0a 20 20 20 20 20 20 7d  = pLoop;.      }
1a330 0a 20 20 20 20 20 20 69 66 28 20 53 51 4c 49 54  .      if( SQLIT
1a340 45 5f 4d 41 58 5f 43 4f 4d 50 4f 55 4e 44 5f 53  E_MAX_COMPOUND_S
1a350 45 4c 45 43 54 3e 30 20 26 26 20 63 6e 74 3e 53  ELECT>0 && cnt>S
1a360 51 4c 49 54 45 5f 4d 41 58 5f 43 4f 4d 50 4f 55  QLITE_MAX_COMPOU
1a370 4e 44 5f 53 45 4c 45 43 54 20 29 7b 0a 20 20 20  ND_SELECT ){.   
1a380 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f       sqlite3Erro
1a390 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 74 6f  rMsg(pParse, "to
1a3a0 6f 20 6d 61 6e 79 20 74 65 72 6d 73 20 69 6e 20  o many terms in 
1a3b0 63 6f 6d 70 6f 75 6e 64 20 53 45 4c 45 43 54 22  compound SELECT"
1a3c0 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  );.        retur
1a3d0 6e 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  n 1;.      }.   
1a3e0 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 6d 75   }.    return mu
1a3f0 6c 74 69 53 65 6c 65 63 74 28 70 50 61 72 73 65  ltiSelect(pParse
1a400 2c 20 70 2c 20 70 44 65 73 74 2c 20 61 66 66 29  , p, pDest, aff)
1a410 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20  ;.  }.#endif..  
1a420 2f 2a 20 4d 61 6b 65 20 6c 6f 63 61 6c 20 63 6f  /* Make local co
1a430 70 69 65 73 20 6f 66 20 74 68 65 20 70 61 72 61  pies of the para
1a440 6d 65 74 65 72 73 20 66 6f 72 20 74 68 69 73 20  meters for this 
1a450 71 75 65 72 79 2e 0a 20 20 2a 2f 0a 20 20 70 54  query..  */.  pT
1a460 61 62 4c 69 73 74 20 3d 20 70 2d 3e 70 53 72 63  abList = p->pSrc
1a470 3b 0a 20 20 70 57 68 65 72 65 20 3d 20 70 2d 3e  ;.  pWhere = p->
1a480 70 57 68 65 72 65 3b 0a 20 20 70 47 72 6f 75 70  pWhere;.  pGroup
1a490 42 79 20 3d 20 70 2d 3e 70 47 72 6f 75 70 42 79  By = p->pGroupBy
1a4a0 3b 0a 20 20 70 48 61 76 69 6e 67 20 3d 20 70 2d  ;.  pHaving = p-
1a4b0 3e 70 48 61 76 69 6e 67 3b 0a 20 20 69 73 41 67  >pHaving;.  isAg
1a4c0 67 20 3d 20 70 2d 3e 69 73 41 67 67 3b 0a 20 20  g = p->isAgg;.  
1a4d0 69 73 44 69 73 74 69 6e 63 74 20 3d 20 70 2d 3e  isDistinct = p->
1a4e0 69 73 44 69 73 74 69 6e 63 74 3b 0a 20 20 70 45  isDistinct;.  pE
1a4f0 4c 69 73 74 20 3d 20 70 2d 3e 70 45 4c 69 73 74  List = p->pEList
1a500 3b 0a 20 20 69 66 28 20 70 45 4c 69 73 74 3d 3d  ;.  if( pEList==
1a510 30 20 29 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f  0 ) goto select_
1a520 65 6e 64 3b 0a 0a 20 20 2f 2a 20 0a 20 20 2a 2a  end;..  /* .  **
1a530 20 44 6f 20 6e 6f 74 20 65 76 65 6e 20 61 74 74   Do not even att
1a540 65 6d 70 74 20 74 6f 20 67 65 6e 65 72 61 74 65  empt to generate
1a550 20 61 6e 79 20 63 6f 64 65 20 69 66 20 77 65 20   any code if we 
1a560 68 61 76 65 20 61 6c 72 65 61 64 79 20 73 65 65  have already see
1a570 6e 0a 20 20 2a 2a 20 65 72 72 6f 72 73 20 62 65  n.  ** errors be
1a580 66 6f 72 65 20 74 68 69 73 20 72 6f 75 74 69 6e  fore this routin
1a590 65 20 73 74 61 72 74 73 2e 0a 20 20 2a 2f 0a 20  e starts..  */. 
1a5a0 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 45 72   if( pParse->nEr
1a5b0 72 3e 30 20 29 20 67 6f 74 6f 20 73 65 6c 65 63  r>0 ) goto selec
1a5c0 74 5f 65 6e 64 3b 0a 0a 20 20 2f 2a 20 49 66 20  t_end;..  /* If 
1a5d0 77 72 69 74 69 6e 67 20 74 6f 20 6d 65 6d 6f 72  writing to memor
1a5e0 79 20 6f 72 20 67 65 6e 65 72 61 74 69 6e 67 20  y or generating 
1a5f0 61 20 73 65 74 0a 20 20 2a 2a 20 6f 6e 6c 79 20  a set.  ** only 
1a600 61 20 73 69 6e 67 6c 65 20 63 6f 6c 75 6d 6e 20  a single column 
1a610 6d 61 79 20 62 65 20 6f 75 74 70 75 74 2e 0a 20  may be output.. 
1a620 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49   */.#ifndef SQLI
1a630 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59  TE_OMIT_SUBQUERY
1a640 0a 20 20 69 66 28 20 63 68 65 63 6b 46 6f 72 4d  .  if( checkForM
1a650 75 6c 74 69 43 6f 6c 75 6d 6e 53 65 6c 65 63 74  ultiColumnSelect
1a660 45 72 72 6f 72 28 70 50 61 72 73 65 2c 20 70 44  Error(pParse, pD
1a670 65 73 74 2c 20 70 45 4c 69 73 74 2d 3e 6e 45 78  est, pEList->nEx
1a680 70 72 29 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20  pr) ){.    goto 
1a690 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 7d 0a  select_end;.  }.
1a6a0 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 4f 52 44  #endif..  /* ORD
1a6b0 45 52 20 42 59 20 69 73 20 69 67 6e 6f 72 65 64  ER BY is ignored
1a6c0 20 66 6f 72 20 73 6f 6d 65 20 64 65 73 74 69 6e   for some destin
1a6d0 61 74 69 6f 6e 73 2e 0a 20 20 2a 2f 0a 20 20 69  ations..  */.  i
1a6e0 66 28 20 49 67 6e 6f 72 61 62 6c 65 4f 72 64 65  f( IgnorableOrde
1a6f0 72 62 79 28 70 44 65 73 74 29 20 29 7b 0a 20 20  rby(pDest) ){.  
1a700 20 20 70 4f 72 64 65 72 42 79 20 3d 20 30 3b 0a    pOrderBy = 0;.
1a710 20 20 7d 0a 0a 20 20 2f 2a 20 42 65 67 69 6e 20    }..  /* Begin 
1a720 67 65 6e 65 72 61 74 69 6e 67 20 63 6f 64 65 2e  generating code.
1a730 0a 20 20 2a 2f 0a 20 20 76 20 3d 20 73 71 6c 69  .  */.  v = sqli
1a740 74 65 33 47 65 74 56 64 62 65 28 70 50 61 72 73  te3GetVdbe(pPars
1a750 65 29 3b 0a 20 20 69 66 28 20 76 3d 3d 30 20 29  e);.  if( v==0 )
1a760 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64   goto select_end
1a770 3b 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65  ;..  /* Generate
1a780 20 63 6f 64 65 20 66 6f 72 20 61 6c 6c 20 73 75   code for all su
1a790 62 2d 71 75 65 72 69 65 73 20 69 6e 20 74 68 65  b-queries in the
1a7a0 20 46 52 4f 4d 20 63 6c 61 75 73 65 0a 20 20 2a   FROM clause.  *
1a7b0 2f 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53  /.#if !defined(S
1a7c0 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55  QLITE_OMIT_SUBQU
1a7d0 45 52 59 29 20 7c 7c 20 21 64 65 66 69 6e 65 64  ERY) || !defined
1a7e0 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45  (SQLITE_OMIT_VIE
1a7f0 57 29 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  W).  for(i=0; i<
1a800 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3b 20  pTabList->nSrc; 
1a810 69 2b 2b 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20  i++){.    const 
1a820 63 68 61 72 20 2a 7a 53 61 76 65 64 41 75 74 68  char *zSavedAuth
1a830 43 6f 6e 74 65 78 74 20 3d 20 30 3b 0a 20 20 20  Context = 0;.   
1a840 20 69 6e 74 20 6e 65 65 64 52 65 73 74 6f 72 65   int needRestore
1a850 43 6f 6e 74 65 78 74 3b 0a 20 20 20 20 73 74 72  Context;.    str
1a860 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d  uct SrcList_item
1a870 20 2a 70 49 74 65 6d 20 3d 20 26 70 54 61 62 4c   *pItem = &pTabL
1a880 69 73 74 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20 53  ist->a[i];.    S
1a890 65 6c 65 63 74 44 65 73 74 20 64 65 73 74 20 3d  electDest dest =
1a8a0 20 7b 53 52 54 5f 45 70 68 65 6d 54 61 62 2c 20   {SRT_EphemTab, 
1a8b0 30 2c 20 30 7d 3b 0a 0a 20 20 20 20 69 66 28 20  0, 0};..    if( 
1a8c0 70 49 74 65 6d 2d 3e 70 53 65 6c 65 63 74 3d 3d  pItem->pSelect==
1a8d0 30 20 7c 7c 20 70 49 74 65 6d 2d 3e 69 73 50 6f  0 || pItem->isPo
1a8e0 70 75 6c 61 74 65 64 20 29 20 63 6f 6e 74 69 6e  pulated ) contin
1a8f0 75 65 3b 0a 20 20 20 20 69 66 28 20 70 49 74 65  ue;.    if( pIte
1a900 6d 2d 3e 7a 4e 61 6d 65 21 3d 30 20 29 7b 0a 20  m->zName!=0 ){. 
1a910 20 20 20 20 20 7a 53 61 76 65 64 41 75 74 68 43       zSavedAuthC
1a920 6f 6e 74 65 78 74 20 3d 20 70 50 61 72 73 65 2d  ontext = pParse-
1a930 3e 7a 41 75 74 68 43 6f 6e 74 65 78 74 3b 0a 20  >zAuthContext;. 
1a940 20 20 20 20 20 70 50 61 72 73 65 2d 3e 7a 41 75       pParse->zAu
1a950 74 68 43 6f 6e 74 65 78 74 20 3d 20 70 49 74 65  thContext = pIte
1a960 6d 2d 3e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20  m->zName;.      
1a970 6e 65 65 64 52 65 73 74 6f 72 65 43 6f 6e 74 65  needRestoreConte
1a980 78 74 20 3d 20 31 3b 0a 20 20 20 20 7d 65 6c 73  xt = 1;.    }els
1a990 65 7b 0a 20 20 20 20 20 20 6e 65 65 64 52 65 73  e{.      needRes
1a9a0 74 6f 72 65 43 6f 6e 74 65 78 74 20 3d 20 30 3b  toreContext = 0;
1a9b0 0a 20 20 20 20 7d 0a 23 69 66 20 64 65 66 69 6e  .    }.#if defin
1a9c0 65 64 28 53 51 4c 49 54 45 5f 54 45 53 54 29 20  ed(SQLITE_TEST) 
1a9d0 7c 7c 20 53 51 4c 49 54 45 5f 4d 41 58 5f 45 58  || SQLITE_MAX_EX
1a9e0 50 52 5f 44 45 50 54 48 3e 30 0a 20 20 20 20 2f  PR_DEPTH>0.    /
1a9f0 2a 20 49 6e 63 72 65 6d 65 6e 74 20 50 61 72 73  * Increment Pars
1aa00 65 2e 6e 48 65 69 67 68 74 20 62 79 20 74 68 65  e.nHeight by the
1aa10 20 68 65 69 67 68 74 20 6f 66 20 74 68 65 20 6c   height of the l
1aa20 61 72 67 65 73 74 20 65 78 70 72 65 73 73 69 6f  argest expressio
1aa30 6e 0a 20 20 20 20 2a 2a 20 74 72 65 65 20 72 65  n.    ** tree re
1aa40 66 65 72 65 64 20 74 6f 20 62 79 20 74 68 69 73  fered to by this
1aa50 2c 20 74 68 65 20 70 61 72 65 6e 74 20 73 65 6c  , the parent sel
1aa60 65 63 74 2e 20 54 68 65 20 63 68 69 6c 64 20 73  ect. The child s
1aa70 65 6c 65 63 74 0a 20 20 20 20 2a 2a 20 6d 61 79  elect.    ** may
1aa80 20 63 6f 6e 74 61 69 6e 20 65 78 70 72 65 73 73   contain express
1aa90 69 6f 6e 20 74 72 65 65 73 20 6f 66 20 61 74 20  ion trees of at 
1aaa0 6d 6f 73 74 0a 20 20 20 20 2a 2a 20 28 53 51 4c  most.    ** (SQL
1aab0 49 54 45 5f 4d 41 58 5f 45 58 50 52 5f 44 45 50  ITE_MAX_EXPR_DEP
1aac0 54 48 2d 50 61 72 73 65 2e 6e 48 65 69 67 68 74  TH-Parse.nHeight
1aad0 29 20 68 65 69 67 68 74 2e 20 54 68 69 73 20 69  ) height. This i
1aae0 73 20 61 20 62 69 74 0a 20 20 20 20 2a 2a 20 6d  s a bit.    ** m
1aaf0 6f 72 65 20 63 6f 6e 73 65 72 76 61 74 69 76 65  ore conservative
1ab00 20 74 68 61 6e 20 6e 65 63 65 73 73 61 72 79 2c   than necessary,
1ab10 20 62 75 74 20 6d 75 63 68 20 65 61 73 69 65 72   but much easier
1ab20 20 74 68 61 6e 20 65 6e 66 6f 72 63 69 6e 67 0a   than enforcing.
1ab30 20 20 20 20 2a 2a 20 61 6e 20 65 78 61 63 74 20      ** an exact 
1ab40 6c 69 6d 69 74 2e 0a 20 20 20 20 2a 2f 0a 20 20  limit..    */.  
1ab50 20 20 70 50 61 72 73 65 2d 3e 6e 48 65 69 67 68    pParse->nHeigh
1ab60 74 20 2b 3d 20 73 71 6c 69 74 65 33 53 65 6c 65  t += sqlite3Sele
1ab70 63 74 45 78 70 72 48 65 69 67 68 74 28 70 29 3b  ctExprHeight(p);
1ab80 0a 23 65 6e 64 69 66 0a 20 20 20 20 64 65 73 74  .#endif.    dest
1ab90 2e 69 50 61 72 6d 20 3d 20 70 49 74 65 6d 2d 3e  .iParm = pItem->
1aba0 69 43 75 72 73 6f 72 3b 0a 20 20 20 20 73 71 6c  iCursor;.    sql
1abb0 69 74 65 33 53 65 6c 65 63 74 28 70 50 61 72 73  ite3Select(pPars
1abc0 65 2c 20 70 49 74 65 6d 2d 3e 70 53 65 6c 65 63  e, pItem->pSelec
1abd0 74 2c 20 26 64 65 73 74 2c 20 70 2c 20 69 2c 20  t, &dest, p, i, 
1abe0 26 69 73 41 67 67 2c 20 30 29 3b 0a 20 20 20 20  &isAgg, 0);.    
1abf0 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  if( db->mallocFa
1ac00 69 6c 65 64 20 29 7b 0a 20 20 20 20 20 20 67 6f  iled ){.      go
1ac10 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20  to select_end;. 
1ac20 20 20 20 7d 0a 23 69 66 20 64 65 66 69 6e 65 64     }.#if defined
1ac30 28 53 51 4c 49 54 45 5f 54 45 53 54 29 20 7c 7c  (SQLITE_TEST) ||
1ac40 20 53 51 4c 49 54 45 5f 4d 41 58 5f 45 58 50 52   SQLITE_MAX_EXPR
1ac50 5f 44 45 50 54 48 3e 30 0a 20 20 20 20 70 50 61  _DEPTH>0.    pPa
1ac60 72 73 65 2d 3e 6e 48 65 69 67 68 74 20 2d 3d 20  rse->nHeight -= 
1ac70 73 71 6c 69 74 65 33 53 65 6c 65 63 74 45 78 70  sqlite3SelectExp
1ac80 72 48 65 69 67 68 74 28 70 29 3b 0a 23 65 6e 64  rHeight(p);.#end
1ac90 69 66 0a 20 20 20 20 69 66 28 20 6e 65 65 64 52  if.    if( needR
1aca0 65 73 74 6f 72 65 43 6f 6e 74 65 78 74 20 29 7b  estoreContext ){
1acb0 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 7a  .      pParse->z
1acc0 41 75 74 68 43 6f 6e 74 65 78 74 20 3d 20 7a 53  AuthContext = zS
1acd0 61 76 65 64 41 75 74 68 43 6f 6e 74 65 78 74 3b  avedAuthContext;
1ace0 0a 20 20 20 20 7d 0a 20 20 20 20 70 54 61 62 4c  .    }.    pTabL
1acf0 69 73 74 20 3d 20 70 2d 3e 70 53 72 63 3b 0a 20  ist = p->pSrc;. 
1ad00 20 20 20 70 57 68 65 72 65 20 3d 20 70 2d 3e 70     pWhere = p->p
1ad10 57 68 65 72 65 3b 0a 20 20 20 20 69 66 28 20 21  Where;.    if( !
1ad20 49 67 6e 6f 72 61 62 6c 65 4f 72 64 65 72 62 79  IgnorableOrderby
1ad30 28 70 44 65 73 74 29 20 29 7b 0a 20 20 20 20 20  (pDest) ){.     
1ad40 20 70 4f 72 64 65 72 42 79 20 3d 20 70 2d 3e 70   pOrderBy = p->p
1ad50 4f 72 64 65 72 42 79 3b 0a 20 20 20 20 7d 0a 20  OrderBy;.    }. 
1ad60 20 20 20 70 47 72 6f 75 70 42 79 20 3d 20 70 2d     pGroupBy = p-
1ad70 3e 70 47 72 6f 75 70 42 79 3b 0a 20 20 20 20 70  >pGroupBy;.    p
1ad80 48 61 76 69 6e 67 20 3d 20 70 2d 3e 70 48 61 76  Having = p->pHav
1ad90 69 6e 67 3b 0a 20 20 20 20 69 73 44 69 73 74 69  ing;.    isDisti
1ada0 6e 63 74 20 3d 20 70 2d 3e 69 73 44 69 73 74 69  nct = p->isDisti
1adb0 6e 63 74 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  nct;.  }.#endif.
1adc0 0a 20 20 2f 2a 20 43 68 65 63 6b 20 66 6f 72 20  .  /* Check for 
1add0 74 68 65 20 73 70 65 63 69 61 6c 20 63 61 73 65  the special case
1ade0 20 6f 66 20 61 20 6d 69 6e 28 29 20 6f 72 20 6d   of a min() or m
1adf0 61 78 28 29 20 66 75 6e 63 74 69 6f 6e 20 62 79  ax() function by
1ae00 20 69 74 73 65 6c 66 0a 20 20 2a 2a 20 69 6e 20   itself.  ** in 
1ae10 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 2e 0a  the result set..
1ae20 20 20 2a 2f 0a 20 20 69 66 28 20 73 69 6d 70 6c    */.  if( simpl
1ae30 65 4d 69 6e 4d 61 78 51 75 65 72 79 28 70 50 61  eMinMaxQuery(pPa
1ae40 72 73 65 2c 20 70 2c 20 70 44 65 73 74 29 20 29  rse, p, pDest) )
1ae50 7b 0a 20 20 20 20 72 63 20 3d 20 30 3b 0a 20 20  {.    rc = 0;.  
1ae60 20 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e    goto select_en
1ae70 64 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 68 65  d;.  }..  /* Che
1ae80 63 6b 20 74 6f 20 73 65 65 20 69 66 20 74 68 69  ck to see if thi
1ae90 73 20 69 73 20 61 20 73 75 62 71 75 65 72 79 20  s is a subquery 
1aea0 74 68 61 74 20 63 61 6e 20 62 65 20 22 66 6c 61  that can be "fla
1aeb0 74 74 65 6e 65 64 22 20 69 6e 74 6f 20 69 74 73  ttened" into its
1aec0 20 70 61 72 65 6e 74 2e 0a 20 20 2a 2a 20 49 66   parent..  ** If
1aed0 20 66 6c 61 74 74 65 6e 69 6e 67 20 69 73 20 61   flattening is a
1aee0 20 70 6f 73 73 69 62 6c 69 74 79 2c 20 64 6f 20   possiblity, do 
1aef0 73 6f 20 61 6e 64 20 72 65 74 75 72 6e 20 69 6d  so and return im
1af00 6d 65 64 69 61 74 65 6c 79 2e 20 20 0a 20 20 2a  mediately.  .  *
1af10 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  /.#ifndef SQLITE
1af20 5f 4f 4d 49 54 5f 56 49 45 57 0a 20 20 69 66 28  _OMIT_VIEW.  if(
1af30 20 70 50 61 72 65 6e 74 20 26 26 20 70 50 61 72   pParent && pPar
1af40 65 6e 74 41 67 67 20 26 26 0a 20 20 20 20 20 20  entAgg &&.      
1af50 66 6c 61 74 74 65 6e 53 75 62 71 75 65 72 79 28  flattenSubquery(
1af60 64 62 2c 20 70 50 61 72 65 6e 74 2c 20 70 61 72  db, pParent, par
1af70 65 6e 74 54 61 62 2c 20 2a 70 50 61 72 65 6e 74  entTab, *pParent
1af80 41 67 67 2c 20 69 73 41 67 67 29 20 29 7b 0a 20  Agg, isAgg) ){. 
1af90 20 20 20 69 66 28 20 69 73 41 67 67 20 29 20 2a     if( isAgg ) *
1afa0 70 50 61 72 65 6e 74 41 67 67 20 3d 20 31 3b 0a  pParentAgg = 1;.
1afb0 20 20 20 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f      goto select_
1afc0 65 6e 64 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  end;.  }.#endif.
1afd0 0a 20 20 2f 2a 20 49 66 20 70 6f 73 73 69 62 6c  .  /* If possibl
1afe0 65 2c 20 72 65 77 72 69 74 65 20 74 68 65 20 71  e, rewrite the q
1aff0 75 65 72 79 20 74 6f 20 75 73 65 20 47 52 4f 55  uery to use GROU
1b000 50 20 42 59 20 69 6e 73 74 65 61 64 20 6f 66 20  P BY instead of 
1b010 44 49 53 54 49 4e 43 54 2e 0a 20 20 2a 2a 20 47  DISTINCT..  ** G
1b020 52 4f 55 50 20 42 59 20 6d 61 79 20 75 73 65 20  ROUP BY may use 
1b030 61 6e 20 69 6e 64 65 78 2c 20 44 49 53 54 49 4e  an index, DISTIN
1b040 43 54 20 6e 65 76 65 72 20 64 6f 65 73 2e 0a 20  CT never does.. 
1b050 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 69 73 44   */.  if( p->isD
1b060 69 73 74 69 6e 63 74 20 26 26 20 21 70 2d 3e 69  istinct && !p->i
1b070 73 41 67 67 20 26 26 20 21 70 2d 3e 70 47 72 6f  sAgg && !p->pGro
1b080 75 70 42 79 20 29 7b 0a 20 20 20 20 70 2d 3e 70  upBy ){.    p->p
1b090 47 72 6f 75 70 42 79 20 3d 20 73 71 6c 69 74 65  GroupBy = sqlite
1b0a0 33 45 78 70 72 4c 69 73 74 44 75 70 28 64 62 2c  3ExprListDup(db,
1b0b0 20 70 2d 3e 70 45 4c 69 73 74 29 3b 0a 20 20 20   p->pEList);.   
1b0c0 20 70 47 72 6f 75 70 42 79 20 3d 20 70 2d 3e 70   pGroupBy = p->p
1b0d0 47 72 6f 75 70 42 79 3b 0a 20 20 20 20 70 2d 3e  GroupBy;.    p->
1b0e0 69 73 44 69 73 74 69 6e 63 74 20 3d 20 30 3b 0a  isDistinct = 0;.
1b0f0 20 20 20 20 69 73 44 69 73 74 69 6e 63 74 20 3d      isDistinct =
1b100 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66   0;.  }..  /* If
1b110 20 74 68 65 72 65 20 69 73 20 61 6e 20 4f 52 44   there is an ORD
1b120 45 52 20 42 59 20 63 6c 61 75 73 65 2c 20 74 68  ER BY clause, th
1b130 65 6e 20 74 68 69 73 20 73 6f 72 74 69 6e 67 0a  en this sorting.
1b140 20 20 2a 2a 20 69 6e 64 65 78 20 6d 69 67 68 74    ** index might
1b150 20 65 6e 64 20 75 70 20 62 65 69 6e 67 20 75 6e   end up being un
1b160 75 73 65 64 20 69 66 20 74 68 65 20 64 61 74 61  used if the data
1b170 20 63 61 6e 20 62 65 20 0a 20 20 2a 2a 20 65 78   can be .  ** ex
1b180 74 72 61 63 74 65 64 20 69 6e 20 70 72 65 2d 73  tracted in pre-s
1b190 6f 72 74 65 64 20 6f 72 64 65 72 2e 20 20 49 66  orted order.  If
1b1a0 20 74 68 61 74 20 69 73 20 74 68 65 20 63 61 73   that is the cas
1b1b0 65 2c 20 74 68 65 6e 20 74 68 65 0a 20 20 2a 2a  e, then the.  **
1b1c0 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61   OP_OpenEphemera
1b1d0 6c 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 77 69  l instruction wi
1b1e0 6c 6c 20 62 65 20 63 68 61 6e 67 65 64 20 74 6f  ll be changed to
1b1f0 20 61 6e 20 4f 50 5f 4e 6f 6f 70 20 6f 6e 63 65   an OP_Noop once
1b200 0a 20 20 2a 2a 20 77 65 20 66 69 67 75 72 65 20  .  ** we figure 
1b210 6f 75 74 20 74 68 61 74 20 74 68 65 20 73 6f 72  out that the sor
1b220 74 69 6e 67 20 69 6e 64 65 78 20 69 73 20 6e 6f  ting index is no
1b230 74 20 6e 65 65 64 65 64 2e 20 20 54 68 65 20 61  t needed.  The a
1b240 64 64 72 53 6f 72 74 49 6e 64 65 78 0a 20 20 2a  ddrSortIndex.  *
1b250 2a 20 76 61 72 69 61 62 6c 65 20 69 73 20 75 73  * variable is us
1b260 65 64 20 74 6f 20 66 61 63 69 6c 69 74 61 74 65  ed to facilitate
1b270 20 74 68 61 74 20 63 68 61 6e 67 65 2e 0a 20 20   that change..  
1b280 2a 2f 0a 20 20 69 66 28 20 70 4f 72 64 65 72 42  */.  if( pOrderB
1b290 79 20 29 7b 0a 20 20 20 20 4b 65 79 49 6e 66 6f  y ){.    KeyInfo
1b2a0 20 2a 70 4b 65 79 49 6e 66 6f 3b 0a 20 20 20 20   *pKeyInfo;.    
1b2b0 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 45 72 72  if( pParse->nErr
1b2c0 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 73   ){.      goto s
1b2d0 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 7d  elect_end;.    }
1b2e0 0a 20 20 20 20 70 4b 65 79 49 6e 66 6f 20 3d 20  .    pKeyInfo = 
1b2f0 6b 65 79 49 6e 66 6f 46 72 6f 6d 45 78 70 72 4c  keyInfoFromExprL
1b300 69 73 74 28 70 50 61 72 73 65 2c 20 70 4f 72 64  ist(pParse, pOrd
1b310 65 72 42 79 29 3b 0a 20 20 20 20 70 4f 72 64 65  erBy);.    pOrde
1b320 72 42 79 2d 3e 69 45 43 75 72 73 6f 72 20 3d 20  rBy->iECursor = 
1b330 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a  pParse->nTab++;.
1b340 20 20 20 20 70 2d 3e 61 64 64 72 4f 70 65 6e 45      p->addrOpenE
1b350 70 68 6d 5b 32 5d 20 3d 20 61 64 64 72 53 6f 72  phm[2] = addrSor
1b360 74 49 6e 64 65 78 20 3d 0a 20 20 20 20 20 20 73  tIndex =.      s
1b370 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34  qlite3VdbeAddOp4
1b380 28 76 2c 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d  (v, OP_OpenEphem
1b390 65 72 61 6c 2c 0a 20 20 20 20 20 20 20 20 20 20  eral,.          
1b3a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b3b0 20 70 4f 72 64 65 72 42 79 2d 3e 69 45 43 75 72   pOrderBy->iECur
1b3c0 73 6f 72 2c 20 70 4f 72 64 65 72 42 79 2d 3e 6e  sor, pOrderBy->n
1b3d0 45 78 70 72 2b 32 2c 20 30 2c 0a 20 20 20 20 20  Expr+2, 0,.     
1b3e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b3f0 20 20 20 20 20 20 28 63 68 61 72 2a 29 70 4b 65        (char*)pKe
1b400 79 49 6e 66 6f 2c 20 50 34 5f 4b 45 59 49 4e 46  yInfo, P4_KEYINF
1b410 4f 5f 48 41 4e 44 4f 46 46 29 3b 0a 20 20 7d 65  O_HANDOFF);.  }e
1b420 6c 73 65 7b 0a 20 20 20 20 61 64 64 72 53 6f 72  lse{.    addrSor
1b430 74 49 6e 64 65 78 20 3d 20 2d 31 3b 0a 20 20 7d  tIndex = -1;.  }
1b440 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 6f 75  ..  /* If the ou
1b450 74 70 75 74 20 69 73 20 64 65 73 74 69 6e 65 64  tput is destined
1b460 20 66 6f 72 20 61 20 74 65 6d 70 6f 72 61 72 79   for a temporary
1b470 20 74 61 62 6c 65 2c 20 6f 70 65 6e 20 74 68 61   table, open tha
1b480 74 20 74 61 62 6c 65 2e 0a 20 20 2a 2f 0a 20 20  t table..  */.  
1b490 69 66 28 20 70 44 65 73 74 2d 3e 65 44 65 73 74  if( pDest->eDest
1b4a0 3d 3d 53 52 54 5f 45 70 68 65 6d 54 61 62 20 29  ==SRT_EphemTab )
1b4b0 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  {.    sqlite3Vdb
1b4c0 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4f 70  eAddOp2(v, OP_Op
1b4d0 65 6e 45 70 68 65 6d 65 72 61 6c 2c 20 70 44 65  enEphemeral, pDe
1b4e0 73 74 2d 3e 69 50 61 72 6d 2c 20 70 45 4c 69 73  st->iParm, pELis
1b4f0 74 2d 3e 6e 45 78 70 72 29 3b 0a 20 20 7d 0a 0a  t->nExpr);.  }..
1b500 20 20 2f 2a 20 53 65 74 20 74 68 65 20 6c 69 6d    /* Set the lim
1b510 69 74 65 72 2e 0a 20 20 2a 2f 0a 20 20 69 45 6e  iter..  */.  iEn
1b520 64 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d  d = sqlite3VdbeM
1b530 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 63  akeLabel(v);.  c
1b540 6f 6d 70 75 74 65 4c 69 6d 69 74 52 65 67 69 73  omputeLimitRegis
1b550 74 65 72 73 28 70 50 61 72 73 65 2c 20 70 2c 20  ters(pParse, p, 
1b560 69 45 6e 64 29 3b 0a 0a 20 20 2f 2a 20 4f 70 65  iEnd);..  /* Ope
1b570 6e 20 61 20 76 69 72 74 75 61 6c 20 69 6e 64 65  n a virtual inde
1b580 78 20 74 6f 20 75 73 65 20 66 6f 72 20 74 68 65  x to use for the
1b590 20 64 69 73 74 69 6e 63 74 20 73 65 74 2e 0a 20   distinct set.. 
1b5a0 20 2a 2f 0a 20 20 69 66 28 20 69 73 44 69 73 74   */.  if( isDist
1b5b0 69 6e 63 74 20 29 7b 0a 20 20 20 20 4b 65 79 49  inct ){.    KeyI
1b5c0 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 3b 0a 20  nfo *pKeyInfo;. 
1b5d0 20 20 20 61 73 73 65 72 74 28 20 69 73 41 67 67     assert( isAgg
1b5e0 20 7c 7c 20 70 47 72 6f 75 70 42 79 20 29 3b 0a   || pGroupBy );.
1b5f0 20 20 20 20 64 69 73 74 69 6e 63 74 20 3d 20 70      distinct = p
1b600 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20  Parse->nTab++;. 
1b610 20 20 20 70 4b 65 79 49 6e 66 6f 20 3d 20 6b 65     pKeyInfo = ke
1b620 79 49 6e 66 6f 46 72 6f 6d 45 78 70 72 4c 69 73  yInfoFromExprLis
1b630 74 28 70 50 61 72 73 65 2c 20 70 2d 3e 70 45 4c  t(pParse, p->pEL
1b640 69 73 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  ist);.    sqlite
1b650 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f  3VdbeAddOp4(v, O
1b660 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 2c  P_OpenEphemeral,
1b670 20 64 69 73 74 69 6e 63 74 2c 20 30 2c 20 30 2c   distinct, 0, 0,
1b680 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1b690 20 20 20 20 20 20 20 20 20 28 63 68 61 72 2a 29           (char*)
1b6a0 70 4b 65 79 49 6e 66 6f 2c 20 50 34 5f 4b 45 59  pKeyInfo, P4_KEY
1b6b0 49 4e 46 4f 5f 48 41 4e 44 4f 46 46 29 3b 0a 20  INFO_HANDOFF);. 
1b6c0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 64 69 73 74   }else{.    dist
1b6d0 69 6e 63 74 20 3d 20 2d 31 3b 0a 20 20 7d 0a 0a  inct = -1;.  }..
1b6e0 20 20 2f 2a 20 41 67 67 72 65 67 61 74 65 20 61    /* Aggregate a
1b6f0 6e 64 20 6e 6f 6e 2d 61 67 67 72 65 67 61 74 65  nd non-aggregate
1b700 20 71 75 65 72 69 65 73 20 61 72 65 20 68 61 6e   queries are han
1b710 64 6c 65 64 20 64 69 66 66 65 72 65 6e 74 6c 79  dled differently
1b720 20 2a 2f 0a 20 20 69 66 28 20 21 69 73 41 67 67   */.  if( !isAgg
1b730 20 26 26 20 70 47 72 6f 75 70 42 79 3d 3d 30 20   && pGroupBy==0 
1b740 29 7b 0a 20 20 20 20 2f 2a 20 54 68 69 73 20 63  ){.    /* This c
1b750 61 73 65 20 69 73 20 66 6f 72 20 6e 6f 6e 2d 61  ase is for non-a
1b760 67 67 72 65 67 61 74 65 20 71 75 65 72 69 65 73  ggregate queries
1b770 0a 20 20 20 20 2a 2a 20 42 65 67 69 6e 20 74 68  .    ** Begin th
1b780 65 20 64 61 74 61 62 61 73 65 20 73 63 61 6e 0a  e database scan.
1b790 20 20 20 20 2a 2f 0a 20 20 20 20 70 57 49 6e 66      */.    pWInf
1b7a0 6f 20 3d 20 73 71 6c 69 74 65 33 57 68 65 72 65  o = sqlite3Where
1b7b0 42 65 67 69 6e 28 70 50 61 72 73 65 2c 20 70 54  Begin(pParse, pT
1b7c0 61 62 4c 69 73 74 2c 20 70 57 68 65 72 65 2c 20  abList, pWhere, 
1b7d0 26 70 4f 72 64 65 72 42 79 29 3b 0a 20 20 20 20  &pOrderBy);.    
1b7e0 69 66 28 20 70 57 49 6e 66 6f 3d 3d 30 20 29 20  if( pWInfo==0 ) 
1b7f0 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b  goto select_end;
1b800 0a 0a 20 20 20 20 2f 2a 20 49 66 20 73 6f 72 74  ..    /* If sort
1b810 69 6e 67 20 69 6e 64 65 78 20 74 68 61 74 20 77  ing index that w
1b820 61 73 20 63 72 65 61 74 65 64 20 62 79 20 61 20  as created by a 
1b830 70 72 69 6f 72 20 4f 50 5f 4f 70 65 6e 45 70 68  prior OP_OpenEph
1b840 65 6d 65 72 61 6c 20 0a 20 20 20 20 2a 2a 20 69  emeral .    ** i
1b850 6e 73 74 72 75 63 74 69 6f 6e 20 65 6e 64 65 64  nstruction ended
1b860 20 75 70 20 6e 6f 74 20 62 65 69 6e 67 20 6e 65   up not being ne
1b870 65 64 65 64 2c 20 74 68 65 6e 20 63 68 61 6e 67  eded, then chang
1b880 65 20 74 68 65 20 4f 50 5f 4f 70 65 6e 45 70 68  e the OP_OpenEph
1b890 65 6d 65 72 61 6c 0a 20 20 20 20 2a 2a 20 69 6e  emeral.    ** in
1b8a0 74 6f 20 61 6e 20 4f 50 5f 4e 6f 6f 70 2e 0a 20  to an OP_Noop.. 
1b8b0 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 61 64     */.    if( ad
1b8c0 64 72 53 6f 72 74 49 6e 64 65 78 3e 3d 30 20 26  drSortIndex>=0 &
1b8d0 26 20 70 4f 72 64 65 72 42 79 3d 3d 30 20 29 7b  & pOrderBy==0 ){
1b8e0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
1b8f0 62 65 43 68 61 6e 67 65 54 6f 4e 6f 6f 70 28 76  beChangeToNoop(v
1b900 2c 20 61 64 64 72 53 6f 72 74 49 6e 64 65 78 2c  , addrSortIndex,
1b910 20 31 29 3b 0a 20 20 20 20 20 20 70 2d 3e 61 64   1);.      p->ad
1b920 64 72 4f 70 65 6e 45 70 68 6d 5b 32 5d 20 3d 20  drOpenEphm[2] = 
1b930 2d 31 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  -1;.    }..    /
1b940 2a 20 55 73 65 20 74 68 65 20 73 74 61 6e 64 61  * Use the standa
1b950 72 64 20 69 6e 6e 65 72 20 6c 6f 6f 70 0a 20 20  rd inner loop.  
1b960 20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28    */.    assert(
1b970 21 69 73 44 69 73 74 69 6e 63 74 29 3b 0a 20 20  !isDistinct);.  
1b980 20 20 69 66 28 20 73 65 6c 65 63 74 49 6e 6e 65    if( selectInne
1b990 72 4c 6f 6f 70 28 70 50 61 72 73 65 2c 20 70 2c  rLoop(pParse, p,
1b9a0 20 70 45 4c 69 73 74 2c 20 30 2c 20 30 2c 20 70   pEList, 0, 0, p
1b9b0 4f 72 64 65 72 42 79 2c 20 2d 31 2c 20 70 44 65  OrderBy, -1, pDe
1b9c0 73 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  st,.            
1b9d0 20 20 20 20 20 20 20 20 70 57 49 6e 66 6f 2d 3e          pWInfo->
1b9e0 69 43 6f 6e 74 69 6e 75 65 2c 20 70 57 49 6e 66  iContinue, pWInf
1b9f0 6f 2d 3e 69 42 72 65 61 6b 2c 20 61 66 66 29 20  o->iBreak, aff) 
1ba00 29 7b 0a 20 20 20 20 20 20 20 67 6f 74 6f 20 73  ){.       goto s
1ba10 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 7d  elect_end;.    }
1ba20 0a 0a 20 20 20 20 2f 2a 20 45 6e 64 20 74 68 65  ..    /* End the
1ba30 20 64 61 74 61 62 61 73 65 20 73 63 61 6e 20 6c   database scan l
1ba40 6f 6f 70 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  oop..    */.    
1ba50 73 71 6c 69 74 65 33 57 68 65 72 65 45 6e 64 28  sqlite3WhereEnd(
1ba60 70 57 49 6e 66 6f 29 3b 0a 20 20 7d 65 6c 73 65  pWInfo);.  }else
1ba70 7b 0a 20 20 20 20 2f 2a 20 54 68 69 73 20 69 73  {.    /* This is
1ba80 20 74 68 65 20 70 72 6f 63 65 73 73 69 6e 67 20   the processing 
1ba90 66 6f 72 20 61 67 67 72 65 67 61 74 65 20 71 75  for aggregate qu
1baa0 65 72 69 65 73 20 2a 2f 0a 20 20 20 20 4e 61 6d  eries */.    Nam
1bab0 65 43 6f 6e 74 65 78 74 20 73 4e 43 3b 20 20 20  eContext sNC;   
1bac0 20 2f 2a 20 4e 61 6d 65 20 63 6f 6e 74 65 78 74   /* Name context
1bad0 20 66 6f 72 20 70 72 6f 63 65 73 73 69 6e 67 20   for processing 
1bae0 61 67 67 72 65 67 61 74 65 20 69 6e 66 6f 72 6d  aggregate inform
1baf0 61 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 69 6e 74  ation */.    int
1bb00 20 69 41 4d 65 6d 3b 20 20 20 20 20 20 20 20 20   iAMem;         
1bb10 20 2f 2a 20 46 69 72 73 74 20 4d 65 6d 20 61 64   /* First Mem ad
1bb20 64 72 65 73 73 20 66 6f 72 20 73 74 6f 72 69 6e  dress for storin
1bb30 67 20 63 75 72 72 65 6e 74 20 47 52 4f 55 50 20  g current GROUP 
1bb40 42 59 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 42  BY */.    int iB
1bb50 4d 65 6d 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  Mem;          /*
1bb60 20 46 69 72 73 74 20 4d 65 6d 20 61 64 64 72 65   First Mem addre
1bb70 73 73 20 66 6f 72 20 70 72 65 76 69 6f 75 73 20  ss for previous 
1bb80 47 52 4f 55 50 20 42 59 20 2a 2f 0a 20 20 20 20  GROUP BY */.    
1bb90 69 6e 74 20 69 55 73 65 46 6c 61 67 3b 20 20 20  int iUseFlag;   
1bba0 20 20 20 20 2f 2a 20 4d 65 6d 20 61 64 64 72 65      /* Mem addre
1bbb0 73 73 20 68 6f 6c 64 69 6e 67 20 66 6c 61 67 20  ss holding flag 
1bbc0 69 6e 64 69 63 61 74 69 6e 67 20 74 68 61 74 20  indicating that 
1bbd0 61 74 20 6c 65 61 73 74 0a 20 20 20 20 20 20 20  at least.       
1bbe0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bbf0 20 2a 2a 20 6f 6e 65 20 72 6f 77 20 6f 66 20 74   ** one row of t
1bc00 68 65 20 69 6e 70 75 74 20 74 6f 20 74 68 65 20  he input to the 
1bc10 61 67 67 72 65 67 61 74 6f 72 20 68 61 73 20 62  aggregator has b
1bc20 65 65 6e 0a 20 20 20 20 20 20 20 20 20 20 20 20  een.            
1bc30 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 70              ** p
1bc40 72 6f 63 65 73 73 65 64 20 2a 2f 0a 20 20 20 20  rocessed */.    
1bc50 69 6e 74 20 69 41 62 6f 72 74 46 6c 61 67 3b 20  int iAbortFlag; 
1bc60 20 20 20 20 2f 2a 20 4d 65 6d 20 61 64 64 72 65      /* Mem addre
1bc70 73 73 20 77 68 69 63 68 20 63 61 75 73 65 73 20  ss which causes 
1bc80 71 75 65 72 79 20 61 62 6f 72 74 20 69 66 20 70  query abort if p
1bc90 6f 73 69 74 69 76 65 20 2a 2f 0a 20 20 20 20 69  ositive */.    i
1bca0 6e 74 20 67 72 6f 75 70 42 79 53 6f 72 74 3b 20  nt groupBySort; 
1bcb0 20 20 20 2f 2a 20 52 6f 77 73 20 63 6f 6d 65 20     /* Rows come 
1bcc0 66 72 6f 6d 20 73 6f 75 72 63 65 20 69 6e 20 47  from source in G
1bcd0 52 4f 55 50 20 42 59 20 6f 72 64 65 72 20 2a 2f  ROUP BY order */
1bce0 0a 0a 0a 20 20 20 20 2f 2a 20 54 68 65 20 66 6f  ...    /* The fo
1bcf0 6c 6c 6f 77 69 6e 67 20 76 61 72 69 61 62 6c 65  llowing variable
1bd00 73 20 68 6f 6c 64 20 61 64 64 72 65 73 73 65 73  s hold addresses
1bd10 20 6f 72 20 6c 61 62 65 6c 73 20 66 6f 72 20 70   or labels for p
1bd20 61 72 74 73 20 6f 66 20 74 68 65 0a 20 20 20 20  arts of the.    
1bd30 2a 2a 20 76 69 72 74 75 61 6c 20 6d 61 63 68 69  ** virtual machi
1bd40 6e 65 20 70 72 6f 67 72 61 6d 20 77 65 20 61 72  ne program we ar
1bd50 65 20 70 75 74 74 69 6e 67 20 74 6f 67 65 74 68  e putting togeth
1bd60 65 72 20 2a 2f 0a 20 20 20 20 69 6e 74 20 61 64  er */.    int ad
1bd70 64 72 4f 75 74 70 75 74 52 6f 77 3b 20 20 20 20  drOutputRow;    
1bd80 20 20 2f 2a 20 53 74 61 72 74 20 6f 66 20 73 75    /* Start of su
1bd90 62 72 6f 75 74 69 6e 65 20 74 68 61 74 20 6f 75  broutine that ou
1bda0 74 70 75 74 73 20 61 20 72 65 73 75 6c 74 20 72  tputs a result r
1bdb0 6f 77 20 2a 2f 0a 20 20 20 20 69 6e 74 20 61 64  ow */.    int ad
1bdc0 64 72 53 65 74 41 62 6f 72 74 3b 20 20 20 20 20  drSetAbort;     
1bdd0 20 20 2f 2a 20 53 65 74 20 74 68 65 20 61 62 6f    /* Set the abo
1bde0 72 74 20 66 6c 61 67 20 61 6e 64 20 72 65 74 75  rt flag and retu
1bdf0 72 6e 20 2a 2f 0a 20 20 20 20 69 6e 74 20 61 64  rn */.    int ad
1be00 64 72 49 6e 69 74 69 61 6c 69 7a 65 4c 6f 6f 70  drInitializeLoop
1be10 3b 20 2f 2a 20 53 74 61 72 74 20 6f 66 20 63 6f  ; /* Start of co
1be20 64 65 20 74 68 61 74 20 69 6e 69 74 69 61 6c 69  de that initiali
1be30 7a 65 73 20 74 68 65 20 69 6e 70 75 74 20 6c 6f  zes the input lo
1be40 6f 70 20 2a 2f 0a 20 20 20 20 69 6e 74 20 61 64  op */.    int ad
1be50 64 72 54 6f 70 4f 66 4c 6f 6f 70 3b 20 20 20 20  drTopOfLoop;    
1be60 20 20 2f 2a 20 54 6f 70 20 6f 66 20 74 68 65 20    /* Top of the 
1be70 69 6e 70 75 74 20 6c 6f 6f 70 20 2a 2f 0a 20 20  input loop */.  
1be80 20 20 69 6e 74 20 61 64 64 72 47 72 6f 75 70 42    int addrGroupB
1be90 79 43 68 61 6e 67 65 3b 20 20 2f 2a 20 43 6f 64  yChange;  /* Cod
1bea0 65 20 74 68 61 74 20 72 75 6e 73 20 77 68 65 6e  e that runs when
1beb0 20 61 6e 79 20 47 52 4f 55 50 20 42 59 20 74 65   any GROUP BY te
1bec0 72 6d 20 63 68 61 6e 67 65 73 20 2a 2f 0a 20 20  rm changes */.  
1bed0 20 20 69 6e 74 20 61 64 64 72 50 72 6f 63 65 73    int addrProces
1bee0 73 52 6f 77 3b 20 20 20 20 20 2f 2a 20 43 6f 64  sRow;     /* Cod
1bef0 65 20 74 6f 20 70 72 6f 63 65 73 73 20 61 20 73  e to process a s
1bf00 69 6e 67 6c 65 20 69 6e 70 75 74 20 72 6f 77 20  ingle input row 
1bf10 2a 2f 0a 20 20 20 20 69 6e 74 20 61 64 64 72 45  */.    int addrE
1bf20 6e 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  nd;            /
1bf30 2a 20 45 6e 64 20 6f 66 20 61 6c 6c 20 70 72 6f  * End of all pro
1bf40 63 65 73 73 69 6e 67 20 2a 2f 0a 20 20 20 20 69  cessing */.    i
1bf50 6e 74 20 61 64 64 72 53 6f 72 74 69 6e 67 49 64  nt addrSortingId
1bf60 78 3b 20 20 20 20 20 2f 2a 20 54 68 65 20 4f 50  x;     /* The OP
1bf70 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 20 66  _OpenEphemeral f
1bf80 6f 72 20 74 68 65 20 73 6f 72 74 69 6e 67 20 69  or the sorting i
1bf90 6e 64 65 78 20 2a 2f 0a 20 20 20 20 69 6e 74 20  ndex */.    int 
1bfa0 61 64 64 72 52 65 73 65 74 3b 20 20 20 20 20 20  addrReset;      
1bfb0 20 20 20 20 2f 2a 20 53 75 62 72 6f 75 74 69 6e      /* Subroutin
1bfc0 65 20 66 6f 72 20 72 65 73 65 74 74 69 6e 67 20  e for resetting 
1bfd0 74 68 65 20 61 63 63 75 6d 75 6c 61 74 6f 72 20  the accumulator 
1bfe0 2a 2f 0a 0a 20 20 20 20 61 64 64 72 45 6e 64 20  */..    addrEnd 
1bff0 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b  = sqlite3VdbeMak
1c000 65 4c 61 62 65 6c 28 76 29 3b 0a 0a 20 20 20 20  eLabel(v);..    
1c010 2f 2a 20 43 6f 6e 76 65 72 74 20 54 4b 5f 43 4f  /* Convert TK_CO
1c020 4c 55 4d 4e 20 6e 6f 64 65 73 20 69 6e 74 6f 20  LUMN nodes into 
1c030 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 20 61 6e  TK_AGG_COLUMN an
1c040 64 20 6d 61 6b 65 20 65 6e 74 72 69 65 73 20 69  d make entries i
1c050 6e 0a 20 20 20 20 2a 2a 20 73 41 67 67 49 6e 66  n.    ** sAggInf
1c060 6f 20 66 6f 72 20 61 6c 6c 20 54 4b 5f 41 47 47  o for all TK_AGG
1c070 5f 46 55 4e 43 54 49 4f 4e 20 6e 6f 64 65 73 20  _FUNCTION nodes 
1c080 69 6e 20 65 78 70 72 65 73 73 69 6f 6e 73 20 6f  in expressions o
1c090 66 20 74 68 65 0a 20 20 20 20 2a 2a 20 53 45 4c  f the.    ** SEL
1c0a0 45 43 54 20 73 74 61 74 65 6d 65 6e 74 2e 0a 20  ECT statement.. 
1c0b0 20 20 20 2a 2f 0a 20 20 20 20 6d 65 6d 73 65 74     */.    memset
1c0c0 28 26 73 4e 43 2c 20 30 2c 20 73 69 7a 65 6f 66  (&sNC, 0, sizeof
1c0d0 28 73 4e 43 29 29 3b 0a 20 20 20 20 73 4e 43 2e  (sNC));.    sNC.
1c0e0 70 50 61 72 73 65 20 3d 20 70 50 61 72 73 65 3b  pParse = pParse;
1c0f0 0a 20 20 20 20 73 4e 43 2e 70 53 72 63 4c 69 73  .    sNC.pSrcLis
1c100 74 20 3d 20 70 54 61 62 4c 69 73 74 3b 0a 20 20  t = pTabList;.  
1c110 20 20 73 4e 43 2e 70 41 67 67 49 6e 66 6f 20 3d    sNC.pAggInfo =
1c120 20 26 73 41 67 67 49 6e 66 6f 3b 0a 20 20 20 20   &sAggInfo;.    
1c130 73 41 67 67 49 6e 66 6f 2e 6e 53 6f 72 74 69 6e  sAggInfo.nSortin
1c140 67 43 6f 6c 75 6d 6e 20 3d 20 70 47 72 6f 75 70  gColumn = pGroup
1c150 42 79 20 3f 20 70 47 72 6f 75 70 42 79 2d 3e 6e  By ? pGroupBy->n
1c160 45 78 70 72 2b 31 20 3a 20 30 3b 0a 20 20 20 20  Expr+1 : 0;.    
1c170 73 41 67 67 49 6e 66 6f 2e 70 47 72 6f 75 70 42  sAggInfo.pGroupB
1c180 79 20 3d 20 70 47 72 6f 75 70 42 79 3b 0a 20 20  y = pGroupBy;.  
1c190 20 20 69 66 28 20 73 71 6c 69 74 65 33 45 78 70    if( sqlite3Exp
1c1a0 72 41 6e 61 6c 79 7a 65 41 67 67 4c 69 73 74 28  rAnalyzeAggList(
1c1b0 26 73 4e 43 2c 20 70 45 4c 69 73 74 29 20 29 7b  &sNC, pEList) ){
1c1c0 0a 20 20 20 20 20 20 67 6f 74 6f 20 73 65 6c 65  .      goto sele
1c1d0 63 74 5f 65 6e 64 3b 0a 20 20 20 20 7d 0a 20 20  ct_end;.    }.  
1c1e0 20 20 69 66 28 20 73 71 6c 69 74 65 33 45 78 70    if( sqlite3Exp
1c1f0 72 41 6e 61 6c 79 7a 65 41 67 67 4c 69 73 74 28  rAnalyzeAggList(
1c200 26 73 4e 43 2c 20 70 4f 72 64 65 72 42 79 29 20  &sNC, pOrderBy) 
1c210 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 73 65  ){.      goto se
1c220 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 7d 0a  lect_end;.    }.
1c230 20 20 20 20 69 66 28 20 70 48 61 76 69 6e 67 20      if( pHaving 
1c240 26 26 20 73 71 6c 69 74 65 33 45 78 70 72 41 6e  && sqlite3ExprAn
1c250 61 6c 79 7a 65 41 67 67 72 65 67 61 74 65 73 28  alyzeAggregates(
1c260 26 73 4e 43 2c 20 70 48 61 76 69 6e 67 29 20 29  &sNC, pHaving) )
1c270 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 73 65 6c  {.      goto sel
1c280 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 7d 0a 20  ect_end;.    }. 
1c290 20 20 20 73 41 67 67 49 6e 66 6f 2e 6e 41 63 63     sAggInfo.nAcc
1c2a0 75 6d 75 6c 61 74 6f 72 20 3d 20 73 41 67 67 49  umulator = sAggI
1c2b0 6e 66 6f 2e 6e 43 6f 6c 75 6d 6e 3b 0a 20 20 20  nfo.nColumn;.   
1c2c0 20 66 6f 72 28 69 3d 30 3b 20 69 3c 73 41 67 67   for(i=0; i<sAgg
1c2d0 49 6e 66 6f 2e 6e 46 75 6e 63 3b 20 69 2b 2b 29  Info.nFunc; i++)
1c2e0 7b 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69  {.      if( sqli
1c2f0 74 65 33 45 78 70 72 41 6e 61 6c 79 7a 65 41 67  te3ExprAnalyzeAg
1c300 67 4c 69 73 74 28 26 73 4e 43 2c 20 73 41 67 67  gList(&sNC, sAgg
1c310 49 6e 66 6f 2e 61 46 75 6e 63 5b 69 5d 2e 70 45  Info.aFunc[i].pE
1c320 78 70 72 2d 3e 70 4c 69 73 74 29 20 29 7b 0a 20  xpr->pList) ){. 
1c330 20 20 20 20 20 20 20 67 6f 74 6f 20 73 65 6c 65         goto sele
1c340 63 74 5f 65 6e 64 3b 0a 20 20 20 20 20 20 7d 0a  ct_end;.      }.
1c350 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 64 62      }.    if( db
1c360 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
1c370 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64   goto select_end
1c380 3b 0a 0a 20 20 20 20 2f 2a 20 50 72 6f 63 65 73  ;..    /* Proces
1c390 73 69 6e 67 20 66 6f 72 20 61 67 67 72 65 67 61  sing for aggrega
1c3a0 74 65 73 20 77 69 74 68 20 47 52 4f 55 50 20 42  tes with GROUP B
1c3b0 59 20 69 73 20 76 65 72 79 20 64 69 66 66 65 72  Y is very differ
1c3c0 65 6e 74 20 61 6e 64 0a 20 20 20 20 2a 2a 20 6d  ent and.    ** m
1c3d0 75 63 68 20 6d 6f 72 65 20 63 6f 6d 70 6c 65 78  uch more complex
1c3e0 20 74 68 61 6e 20 61 67 67 72 65 67 61 74 65 73   than aggregates
1c3f0 20 77 69 74 68 6f 75 74 20 61 20 47 52 4f 55 50   without a GROUP
1c400 20 42 59 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20   BY..    */.    
1c410 69 66 28 20 70 47 72 6f 75 70 42 79 20 29 7b 0a  if( pGroupBy ){.
1c420 20 20 20 20 20 20 4b 65 79 49 6e 66 6f 20 2a 70        KeyInfo *p
1c430 4b 65 79 49 6e 66 6f 3b 20 20 2f 2a 20 4b 65 79  KeyInfo;  /* Key
1c440 69 6e 67 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  ing information 
1c450 66 6f 72 20 74 68 65 20 67 72 6f 75 70 20 62 79  for the group by
1c460 20 63 6c 61 75 73 65 20 2a 2f 0a 0a 20 20 20 20   clause */..    
1c470 20 20 2f 2a 20 43 72 65 61 74 65 20 6c 61 62 65    /* Create labe
1c480 6c 73 20 74 68 61 74 20 77 65 20 77 69 6c 6c 20  ls that we will 
1c490 62 65 20 6e 65 65 64 69 6e 67 0a 20 20 20 20 20  be needing.     
1c4a0 20 2a 2f 0a 20 20 20 20 20 0a 20 20 20 20 20 20   */.     .      
1c4b0 61 64 64 72 49 6e 69 74 69 61 6c 69 7a 65 4c 6f  addrInitializeLo
1c4c0 6f 70 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  op = sqlite3Vdbe
1c4d0 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20  MakeLabel(v);.  
1c4e0 20 20 20 20 61 64 64 72 47 72 6f 75 70 42 79 43      addrGroupByC
1c4f0 68 61 6e 67 65 20 3d 20 73 71 6c 69 74 65 33 56  hange = sqlite3V
1c500 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b  dbeMakeLabel(v);
1c510 0a 20 20 20 20 20 20 61 64 64 72 50 72 6f 63 65  .      addrProce
1c520 73 73 52 6f 77 20 3d 20 73 71 6c 69 74 65 33 56  ssRow = sqlite3V
1c530 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b  dbeMakeLabel(v);
1c540 0a 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68  ..      /* If th
1c550 65 72 65 20 69 73 20 61 20 47 52 4f 55 50 20 42  ere is a GROUP B
1c560 59 20 63 6c 61 75 73 65 20 77 65 20 6d 69 67 68  Y clause we migh
1c570 74 20 6e 65 65 64 20 61 20 73 6f 72 74 69 6e 67  t need a sorting
1c580 20 69 6e 64 65 78 20 74 6f 0a 20 20 20 20 20 20   index to.      
1c590 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74 20 69 74 2e  ** implement it.
1c5a0 20 20 41 6c 6c 6f 63 61 74 65 20 74 68 61 74 20    Allocate that 
1c5b0 73 6f 72 74 69 6e 67 20 69 6e 64 65 78 20 6e 6f  sorting index no
1c5c0 77 2e 20 20 49 66 20 69 74 20 74 75 72 6e 73 20  w.  If it turns 
1c5d0 6f 75 74 0a 20 20 20 20 20 20 2a 2a 20 74 68 61  out.      ** tha
1c5e0 74 20 77 65 20 64 6f 20 6e 6f 74 20 6e 65 65 64  t we do not need
1c5f0 20 69 74 20 61 66 74 65 72 20 61 6c 6c 2c 20 74   it after all, t
1c600 68 65 20 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c  he OpenEphemeral
1c610 20 69 6e 73 74 72 75 63 74 69 6f 6e 0a 20 20 20   instruction.   
1c620 20 20 20 2a 2a 20 77 69 6c 6c 20 62 65 20 63 6f     ** will be co
1c630 6e 76 65 72 74 65 64 20 69 6e 74 6f 20 61 20 4e  nverted into a N
1c640 6f 6f 70 2e 20 20 0a 20 20 20 20 20 20 2a 2f 0a  oop.  .      */.
1c650 20 20 20 20 20 20 73 41 67 67 49 6e 66 6f 2e 73        sAggInfo.s
1c660 6f 72 74 69 6e 67 49 64 78 20 3d 20 70 50 61 72  ortingIdx = pPar
1c670 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20  se->nTab++;.    
1c680 20 20 70 4b 65 79 49 6e 66 6f 20 3d 20 6b 65 79    pKeyInfo = key
1c690 49 6e 66 6f 46 72 6f 6d 45 78 70 72 4c 69 73 74  InfoFromExprList
1c6a0 28 70 50 61 72 73 65 2c 20 70 47 72 6f 75 70 42  (pParse, pGroupB
1c6b0 79 29 3b 0a 20 20 20 20 20 20 61 64 64 72 53 6f  y);.      addrSo
1c6c0 72 74 69 6e 67 49 64 78 20 3d 0a 20 20 20 20 20  rtingIdx =.     
1c6d0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
1c6e0 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 4f 70 65  AddOp4(v, OP_Ope
1c6f0 6e 45 70 68 65 6d 65 72 61 6c 2c 20 73 41 67 67  nEphemeral, sAgg
1c700 49 6e 66 6f 2e 73 6f 72 74 69 6e 67 49 64 78 2c  Info.sortingIdx,
1c710 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1c720 20 20 20 20 20 20 20 20 20 20 73 41 67 67 49 6e            sAggIn
1c730 66 6f 2e 6e 53 6f 72 74 69 6e 67 43 6f 6c 75 6d  fo.nSortingColum
1c740 6e 2c 20 30 2c 0a 20 20 20 20 20 20 20 20 20 20  n, 0,.          
1c750 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28                 (
1c760 63 68 61 72 2a 29 70 4b 65 79 49 6e 66 6f 2c 20  char*)pKeyInfo, 
1c770 50 34 5f 4b 45 59 49 4e 46 4f 5f 48 41 4e 44 4f  P4_KEYINFO_HANDO
1c780 46 46 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 49  FF);..      /* I
1c790 6e 69 74 69 61 6c 69 7a 65 20 6d 65 6d 6f 72 79  nitialize memory
1c7a0 20 6c 6f 63 61 74 69 6f 6e 73 20 75 73 65 64 20   locations used 
1c7b0 62 79 20 47 52 4f 55 50 20 42 59 20 61 67 67 72  by GROUP BY aggr
1c7c0 65 67 61 74 65 20 70 72 6f 63 65 73 73 69 6e 67  egate processing
1c7d0 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
1c7e0 69 55 73 65 46 6c 61 67 20 3d 20 2b 2b 70 50 61  iUseFlag = ++pPa
1c7f0 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20  rse->nMem;.     
1c800 20 69 41 62 6f 72 74 46 6c 61 67 20 3d 20 2b 2b   iAbortFlag = ++
1c810 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20  pParse->nMem;.  
1c820 20 20 20 20 69 41 4d 65 6d 20 3d 20 70 50 61 72      iAMem = pPar
1c830 73 65 2d 3e 6e 4d 65 6d 20 2b 20 31 3b 0a 20 20  se->nMem + 1;.  
1c840 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d      pParse->nMem
1c850 20 2b 3d 20 70 47 72 6f 75 70 42 79 2d 3e 6e 45   += pGroupBy->nE
1c860 78 70 72 3b 0a 20 20 20 20 20 20 69 42 4d 65 6d  xpr;.      iBMem
1c870 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20   = pParse->nMem 
1c880 2b 20 31 3b 0a 20 20 20 20 20 20 70 50 61 72 73  + 1;.      pPars
1c890 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 70 47 72 6f 75  e->nMem += pGrou
1c8a0 70 42 79 2d 3e 6e 45 78 70 72 3b 0a 20 20 20 20  pBy->nExpr;.    
1c8b0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
1c8c0 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65  Op2(v, OP_Intege
1c8d0 72 2c 20 30 2c 20 69 41 62 6f 72 74 46 6c 61 67  r, 0, iAbortFlag
1c8e0 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 6d  );.      VdbeCom
1c8f0 6d 65 6e 74 28 28 76 2c 20 22 63 6c 65 61 72 20  ment((v, "clear 
1c900 61 62 6f 72 74 20 66 6c 61 67 22 29 29 3b 0a 20  abort flag"));. 
1c910 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
1c920 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74  AddOp2(v, OP_Int
1c930 65 67 65 72 2c 20 30 2c 20 69 55 73 65 46 6c 61  eger, 0, iUseFla
1c940 67 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f  g);.      VdbeCo
1c950 6d 6d 65 6e 74 28 28 76 2c 20 22 69 6e 64 69 63  mment((v, "indic
1c960 61 74 65 20 61 63 63 75 6d 75 6c 61 74 6f 72 20  ate accumulator 
1c970 65 6d 70 74 79 22 29 29 3b 0a 20 20 20 20 20 20  empty"));.      
1c980 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
1c990 32 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c  2(v, OP_Goto, 0,
1c9a0 20 61 64 64 72 49 6e 69 74 69 61 6c 69 7a 65 4c   addrInitializeL
1c9b0 6f 6f 70 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20  oop);..      /* 
1c9c0 47 65 6e 65 72 61 74 65 20 61 20 73 75 62 72 6f  Generate a subro
1c9d0 75 74 69 6e 65 20 74 68 61 74 20 6f 75 74 70 75  utine that outpu
1c9e0 74 73 20 61 20 73 69 6e 67 6c 65 20 72 6f 77 20  ts a single row 
1c9f0 6f 66 20 74 68 65 20 72 65 73 75 6c 74 0a 20 20  of the result.  
1ca00 20 20 20 20 2a 2a 20 73 65 74 2e 20 20 54 68 69      ** set.  Thi
1ca10 73 20 73 75 62 72 6f 75 74 69 6e 65 20 66 69 72  s subroutine fir
1ca20 73 74 20 6c 6f 6f 6b 73 20 61 74 20 74 68 65 20  st looks at the 
1ca30 69 55 73 65 46 6c 61 67 2e 20 20 49 66 20 69 55  iUseFlag.  If iU
1ca40 73 65 46 6c 61 67 0a 20 20 20 20 20 20 2a 2a 20  seFlag.      ** 
1ca50 69 73 20 6c 65 73 73 20 74 68 61 6e 20 6f 72 20  is less than or 
1ca60 65 71 75 61 6c 20 74 6f 20 7a 65 72 6f 2c 20 74  equal to zero, t
1ca70 68 65 20 73 75 62 72 6f 75 74 69 6e 65 20 69 73  he subroutine is
1ca80 20 61 20 6e 6f 2d 6f 70 2e 20 20 49 66 0a 20 20   a no-op.  If.  
1ca90 20 20 20 20 2a 2a 20 74 68 65 20 70 72 6f 63 65      ** the proce
1caa0 73 73 69 6e 67 20 63 61 6c 6c 73 20 66 6f 72 20  ssing calls for 
1cab0 74 68 65 20 71 75 65 72 79 20 74 6f 20 61 62 6f  the query to abo
1cac0 72 74 2c 20 74 68 69 73 20 73 75 62 72 6f 75 74  rt, this subrout
1cad0 69 6e 65 0a 20 20 20 20 20 20 2a 2a 20 69 6e 63  ine.      ** inc
1cae0 72 65 6d 65 6e 74 73 20 74 68 65 20 69 41 62 6f  rements the iAbo
1caf0 72 74 46 6c 61 67 20 6d 65 6d 6f 72 79 20 6c 6f  rtFlag memory lo
1cb00 63 61 74 69 6f 6e 20 62 65 66 6f 72 65 20 72 65  cation before re
1cb10 74 75 72 6e 69 6e 67 20 69 6e 0a 20 20 20 20 20  turning in.     
1cb20 20 2a 2a 20 6f 72 64 65 72 20 74 6f 20 73 69 67   ** order to sig
1cb30 6e 61 6c 20 74 68 65 20 63 61 6c 6c 65 72 20 74  nal the caller t
1cb40 6f 20 61 62 6f 72 74 2e 0a 20 20 20 20 20 20 2a  o abort..      *
1cb50 2f 0a 20 20 20 20 20 20 61 64 64 72 53 65 74 41  /.      addrSetA
1cb60 62 6f 72 74 20 3d 20 73 71 6c 69 74 65 33 56 64  bort = sqlite3Vd
1cb70 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29  beCurrentAddr(v)
1cb80 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
1cb90 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
1cba0 49 6e 74 65 67 65 72 2c 20 31 2c 20 69 41 62 6f  Integer, 1, iAbo
1cbb0 72 74 46 6c 61 67 29 3b 0a 20 20 20 20 20 20 56  rtFlag);.      V
1cbc0 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22  dbeComment((v, "
1cbd0 73 65 74 20 61 62 6f 72 74 20 66 6c 61 67 22 29  set abort flag")
1cbe0 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
1cbf0 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
1cc00 5f 52 65 74 75 72 6e 2c 20 30 2c 20 30 29 3b 0a  _Return, 0, 0);.
1cc10 20 20 20 20 20 20 61 64 64 72 4f 75 74 70 75 74        addrOutput
1cc20 52 6f 77 20 3d 20 73 71 6c 69 74 65 33 56 64 62  Row = sqlite3Vdb
1cc30 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b  eCurrentAddr(v);
1cc40 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
1cc50 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49  beAddOp2(v, OP_I
1cc60 66 4d 65 6d 50 6f 73 2c 20 69 55 73 65 46 6c 61  fMemPos, iUseFla
1cc70 67 2c 20 61 64 64 72 4f 75 74 70 75 74 52 6f 77  g, addrOutputRow
1cc80 2b 32 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43  +2);.      VdbeC
1cc90 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 47 72 6f 75  omment((v, "Grou
1cca0 70 62 79 20 72 65 73 75 6c 74 20 67 65 6e 65 72  pby result gener
1ccb0 61 74 6f 72 20 65 6e 74 72 79 20 70 6f 69 6e 74  ator entry point
1ccc0 22 29 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  "));.      sqlit
1ccd0 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
1cce0 4f 50 5f 52 65 74 75 72 6e 2c 20 30 2c 20 30 29  OP_Return, 0, 0)
1ccf0 3b 0a 20 20 20 20 20 20 66 69 6e 61 6c 69 7a 65  ;.      finalize
1cd00 41 67 67 46 75 6e 63 74 69 6f 6e 73 28 70 50 61  AggFunctions(pPa
1cd10 72 73 65 2c 20 26 73 41 67 67 49 6e 66 6f 29 3b  rse, &sAggInfo);
1cd20 0a 20 20 20 20 20 20 69 66 28 20 70 48 61 76 69  .      if( pHavi
1cd30 6e 67 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  ng ){.        sq
1cd40 6c 69 74 65 33 45 78 70 72 49 66 46 61 6c 73 65  lite3ExprIfFalse
1cd50 28 70 50 61 72 73 65 2c 20 70 48 61 76 69 6e 67  (pParse, pHaving
1cd60 2c 20 61 64 64 72 4f 75 74 70 75 74 52 6f 77 2b  , addrOutputRow+
1cd70 31 2c 20 31 29 3b 0a 20 20 20 20 20 20 7d 0a 20  1, 1);.      }. 
1cd80 20 20 20 20 20 72 63 20 3d 20 73 65 6c 65 63 74       rc = select
1cd90 49 6e 6e 65 72 4c 6f 6f 70 28 70 50 61 72 73 65  InnerLoop(pParse
1cda0 2c 20 70 2c 20 70 2d 3e 70 45 4c 69 73 74 2c 20  , p, p->pEList, 
1cdb0 30 2c 20 30 2c 20 70 4f 72 64 65 72 42 79 2c 0a  0, 0, pOrderBy,.
1cdc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1cdd0 20 20 20 20 20 20 20 20 20 20 20 64 69 73 74 69             disti
1cde0 6e 63 74 2c 20 70 44 65 73 74 2c 0a 20 20 20 20  nct, pDest,.    
1cdf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ce00 20 20 20 20 20 20 20 61 64 64 72 4f 75 74 70 75         addrOutpu
1ce10 74 52 6f 77 2b 31 2c 20 61 64 64 72 53 65 74 41  tRow+1, addrSetA
1ce20 62 6f 72 74 2c 20 61 66 66 29 3b 0a 20 20 20 20  bort, aff);.    
1ce30 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20    if( rc ){.    
1ce40 20 20 20 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f      goto select_
1ce50 65 6e 64 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  end;.      }.   
1ce60 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
1ce70 64 4f 70 32 28 76 2c 20 4f 50 5f 52 65 74 75 72  dOp2(v, OP_Retur
1ce80 6e 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20  n, 0, 0);.      
1ce90 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20  VdbeComment((v, 
1cea0 22 65 6e 64 20 67 72 6f 75 70 62 79 20 72 65 73  "end groupby res
1ceb0 75 6c 74 20 67 65 6e 65 72 61 74 6f 72 22 29 29  ult generator"))
1cec0 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 47 65 6e 65  ;..      /* Gene
1ced0 72 61 74 65 20 61 20 73 75 62 72 6f 75 74 69 6e  rate a subroutin
1cee0 65 20 74 68 61 74 20 77 69 6c 6c 20 72 65 73 65  e that will rese
1cef0 74 20 74 68 65 20 67 72 6f 75 70 2d 62 79 20 61  t the group-by a
1cf00 63 63 75 6d 75 6c 61 74 6f 72 0a 20 20 20 20 20  ccumulator.     
1cf10 20 2a 2f 0a 20 20 20 20 20 20 61 64 64 72 52 65   */.      addrRe
1cf20 73 65 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62  set = sqlite3Vdb
1cf30 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b  eCurrentAddr(v);
1cf40 0a 20 20 20 20 20 20 72 65 73 65 74 41 63 63 75  .      resetAccu
1cf50 6d 75 6c 61 74 6f 72 28 70 50 61 72 73 65 2c 20  mulator(pParse, 
1cf60 26 73 41 67 67 49 6e 66 6f 29 3b 0a 20 20 20 20  &sAggInfo);.    
1cf70 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
1cf80 4f 70 32 28 76 2c 20 4f 50 5f 52 65 74 75 72 6e  Op2(v, OP_Return
1cf90 2c 20 30 2c 20 30 29 3b 0a 0a 20 20 20 20 20 20  , 0, 0);..      
1cfa0 2f 2a 20 42 65 67 69 6e 20 61 20 6c 6f 6f 70 20  /* Begin a loop 
1cfb0 74 68 61 74 20 77 69 6c 6c 20 65 78 74 72 61 63  that will extrac
1cfc0 74 20 61 6c 6c 20 73 6f 75 72 63 65 20 72 6f 77  t all source row
1cfd0 73 20 69 6e 20 47 52 4f 55 50 20 42 59 20 6f 72  s in GROUP BY or
1cfe0 64 65 72 2e 0a 20 20 20 20 20 20 2a 2a 20 54 68  der..      ** Th
1cff0 69 73 20 6d 69 67 68 74 20 69 6e 76 6f 6c 76 65  is might involve
1d000 20 74 77 6f 20 73 65 70 61 72 61 74 65 20 6c 6f   two separate lo
1d010 6f 70 73 20 77 69 74 68 20 61 6e 20 4f 50 5f 53  ops with an OP_S
1d020 6f 72 74 20 69 6e 20 62 65 74 77 65 65 6e 2c 20  ort in between, 
1d030 6f 72 0a 20 20 20 20 20 20 2a 2a 20 69 74 20 6d  or.      ** it m
1d040 69 67 68 74 20 62 65 20 61 20 73 69 6e 67 6c 65  ight be a single
1d050 20 6c 6f 6f 70 20 74 68 61 74 20 75 73 65 73 20   loop that uses 
1d060 61 6e 20 69 6e 64 65 78 20 74 6f 20 65 78 74 72  an index to extr
1d070 61 63 74 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 0a  act information.
1d080 20 20 20 20 20 20 2a 2a 20 69 6e 20 74 68 65 20        ** in the 
1d090 72 69 67 68 74 20 6f 72 64 65 72 20 74 6f 20 62  right order to b
1d0a0 65 67 69 6e 20 77 69 74 68 2e 0a 20 20 20 20 20  egin with..     
1d0b0 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65   */.      sqlite
1d0c0 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65  3VdbeResolveLabe
1d0d0 6c 28 76 2c 20 61 64 64 72 49 6e 69 74 69 61 6c  l(v, addrInitial
1d0e0 69 7a 65 4c 6f 6f 70 29 3b 0a 20 20 20 20 20 20  izeLoop);.      
1d0f0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
1d100 32 28 76 2c 20 4f 50 5f 47 6f 73 75 62 2c 20 30  2(v, OP_Gosub, 0
1d110 2c 20 61 64 64 72 52 65 73 65 74 29 3b 0a 20 20  , addrReset);.  
1d120 20 20 20 20 70 57 49 6e 66 6f 20 3d 20 73 71 6c      pWInfo = sql
1d130 69 74 65 33 57 68 65 72 65 42 65 67 69 6e 28 70  ite3WhereBegin(p
1d140 50 61 72 73 65 2c 20 70 54 61 62 4c 69 73 74 2c  Parse, pTabList,
1d150 20 70 57 68 65 72 65 2c 20 26 70 47 72 6f 75 70   pWhere, &pGroup
1d160 42 79 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70  By);.      if( p
1d170 57 49 6e 66 6f 3d 3d 30 20 29 20 67 6f 74 6f 20  WInfo==0 ) goto 
1d180 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20  select_end;.    
1d190 20 20 69 66 28 20 70 47 72 6f 75 70 42 79 3d 3d    if( pGroupBy==
1d1a0 30 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  0 ){.        /* 
1d1b0 54 68 65 20 6f 70 74 69 6d 69 7a 65 72 20 69 73  The optimizer is
1d1c0 20 61 62 6c 65 20 74 6f 20 64 65 6c 69 76 65 72   able to deliver
1d1d0 20 72 6f 77 73 20 69 6e 20 67 72 6f 75 70 20 62   rows in group b
1d1e0 79 20 6f 72 64 65 72 20 73 6f 0a 20 20 20 20 20  y order so.     
1d1f0 20 20 20 2a 2a 20 77 65 20 64 6f 20 6e 6f 74 20     ** we do not 
1d200 68 61 76 65 20 74 6f 20 73 6f 72 74 2e 20 20 54  have to sort.  T
1d210 68 65 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65  he OP_OpenEpheme
1d220 72 61 6c 20 74 61 62 6c 65 20 77 69 6c 6c 20 62  ral table will b
1d230 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 63 61 6e  e.        ** can
1d240 63 65 6c 6c 65 64 20 6c 61 74 65 72 20 62 65 63  celled later bec
1d250 61 75 73 65 20 77 65 20 73 74 69 6c 6c 20 6e 65  ause we still ne
1d260 65 64 20 74 6f 20 75 73 65 20 74 68 65 20 70 4b  ed to use the pK
1d270 65 79 49 6e 66 6f 0a 20 20 20 20 20 20 20 20 2a  eyInfo.        *
1d280 2f 0a 20 20 20 20 20 20 20 20 70 47 72 6f 75 70  /.        pGroup
1d290 42 79 20 3d 20 70 2d 3e 70 47 72 6f 75 70 42 79  By = p->pGroupBy
1d2a0 3b 0a 20 20 20 20 20 20 20 20 67 72 6f 75 70 42  ;.        groupB
1d2b0 79 53 6f 72 74 20 3d 20 30 3b 0a 20 20 20 20 20  ySort = 0;.     
1d2c0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
1d2d0 2f 2a 20 52 6f 77 73 20 61 72 65 20 63 6f 6d 69  /* Rows are comi
1d2e0 6e 67 20 6f 75 74 20 69 6e 20 75 6e 64 65 74 65  ng out in undete
1d2f0 72 6d 69 6e 65 64 20 6f 72 64 65 72 2e 20 20 57  rmined order.  W
1d300 65 20 68 61 76 65 20 74 6f 20 70 75 73 68 0a 20  e have to push. 
1d310 20 20 20 20 20 20 20 2a 2a 20 65 61 63 68 20 72         ** each r
1d320 6f 77 20 69 6e 74 6f 20 61 20 73 6f 72 74 69 6e  ow into a sortin
1d330 67 20 69 6e 64 65 78 2c 20 74 65 72 6d 69 6e 61  g index, termina
1d340 74 65 20 74 68 65 20 66 69 72 73 74 20 6c 6f 6f  te the first loo
1d350 70 2c 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68  p,.        ** th
1d360 65 6e 20 6c 6f 6f 70 20 6f 76 65 72 20 74 68 65  en loop over the
1d370 20 73 6f 72 74 69 6e 67 20 69 6e 64 65 78 20 69   sorting index i
1d380 6e 20 6f 72 64 65 72 20 74 6f 20 67 65 74 20 74  n order to get t
1d390 68 65 20 6f 75 74 70 75 74 0a 20 20 20 20 20 20  he output.      
1d3a0 20 20 2a 2a 20 69 6e 20 73 6f 72 74 65 64 20 6f    ** in sorted o
1d3b0 72 64 65 72 0a 20 20 20 20 20 20 20 20 2a 2f 0a  rder.        */.
1d3c0 20 20 20 20 20 20 20 20 67 72 6f 75 70 42 79 53          groupByS
1d3d0 6f 72 74 20 3d 20 31 3b 0a 20 20 20 20 20 20 20  ort = 1;.       
1d3e0 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
1d3f0 45 78 70 72 4c 69 73 74 28 70 50 61 72 73 65 2c  ExprList(pParse,
1d400 20 70 47 72 6f 75 70 42 79 2c 20 30 29 3b 0a 20   pGroupBy, 0);. 
1d410 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
1d420 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 53  beAddOp2(v, OP_S
1d430 65 71 75 65 6e 63 65 2c 20 73 41 67 67 49 6e 66  equence, sAggInf
1d440 6f 2e 73 6f 72 74 69 6e 67 49 64 78 2c 20 30 29  o.sortingIdx, 0)
1d450 3b 0a 20 20 20 20 20 20 20 20 6a 20 3d 20 70 47  ;.        j = pG
1d460 72 6f 75 70 42 79 2d 3e 6e 45 78 70 72 2b 31 3b  roupBy->nExpr+1;
1d470 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30  .        for(i=0
1d480 3b 20 69 3c 73 41 67 67 49 6e 66 6f 2e 6e 43 6f  ; i<sAggInfo.nCo
1d490 6c 75 6d 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  lumn; i++){.    
1d4a0 20 20 20 20 20 20 73 74 72 75 63 74 20 41 67 67        struct Agg
1d4b0 49 6e 66 6f 5f 63 6f 6c 20 2a 70 43 6f 6c 20 3d  Info_col *pCol =
1d4c0 20 26 73 41 67 67 49 6e 66 6f 2e 61 43 6f 6c 5b   &sAggInfo.aCol[
1d4d0 69 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  i];.          if
1d4e0 28 20 70 43 6f 6c 2d 3e 69 53 6f 72 74 65 72 43  ( pCol->iSorterC
1d4f0 6f 6c 75 6d 6e 3c 6a 20 29 20 63 6f 6e 74 69 6e  olumn<j ) contin
1d500 75 65 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71  ue;.          sq
1d510 6c 69 74 65 33 45 78 70 72 43 6f 64 65 47 65 74  lite3ExprCodeGet
1d520 43 6f 6c 75 6d 6e 28 76 2c 20 70 43 6f 6c 2d 3e  Column(v, pCol->
1d530 70 54 61 62 2c 20 70 43 6f 6c 2d 3e 69 43 6f 6c  pTab, pCol->iCol
1d540 75 6d 6e 2c 70 43 6f 6c 2d 3e 69 54 61 62 6c 65  umn,pCol->iTable
1d550 2c 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 6a  ,0);.          j
1d560 2b 2b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ++;.        }.  
1d570 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
1d580 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4d 61  eAddOp2(v, OP_Ma
1d590 6b 65 52 65 63 6f 72 64 2c 20 6a 2c 20 30 29 3b  keRecord, j, 0);
1d5a0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
1d5b0 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
1d5c0 5f 49 64 78 49 6e 73 65 72 74 2c 20 73 41 67 67  _IdxInsert, sAgg
1d5d0 49 6e 66 6f 2e 73 6f 72 74 69 6e 67 49 64 78 2c  Info.sortingIdx,
1d5e0 20 30 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c   0);.        sql
1d5f0 69 74 65 33 57 68 65 72 65 45 6e 64 28 70 57 49  ite3WhereEnd(pWI
1d600 6e 66 6f 29 3b 0a 20 20 20 20 20 20 20 20 73 71  nfo);.        sq
1d610 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
1d620 76 2c 20 4f 50 5f 53 6f 72 74 2c 20 73 41 67 67  v, OP_Sort, sAgg
1d630 49 6e 66 6f 2e 73 6f 72 74 69 6e 67 49 64 78 2c  Info.sortingIdx,
1d640 20 61 64 64 72 45 6e 64 29 3b 0a 20 20 20 20 20   addrEnd);.     
1d650 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28     VdbeComment((
1d660 76 2c 20 22 47 52 4f 55 50 20 42 59 20 73 6f 72  v, "GROUP BY sor
1d670 74 22 29 29 3b 0a 20 20 20 20 20 20 20 20 73 41  t"));.        sA
1d680 67 67 49 6e 66 6f 2e 75 73 65 53 6f 72 74 69 6e  ggInfo.useSortin
1d690 67 49 64 78 20 3d 20 31 3b 0a 20 20 20 20 20 20  gIdx = 1;.      
1d6a0 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 45 76 61 6c  }..      /* Eval
1d6b0 75 61 74 65 20 74 68 65 20 63 75 72 72 65 6e 74  uate the current
1d6c0 20 47 52 4f 55 50 20 42 59 20 74 65 72 6d 73 20   GROUP BY terms 
1d6d0 61 6e 64 20 73 74 6f 72 65 20 69 6e 20 62 30 2c  and store in b0,
1d6e0 20 62 31 2c 20 62 32 2e 2e 2e 0a 20 20 20 20 20   b1, b2....     
1d6f0 20 2a 2a 20 28 62 30 20 69 73 20 6d 65 6d 6f 72   ** (b0 is memor
1d700 79 20 6c 6f 63 61 74 69 6f 6e 20 69 42 4d 65 6d  y location iBMem
1d710 2b 30 2c 20 62 31 20 69 73 20 69 42 4d 65 6d 2b  +0, b1 is iBMem+
1d720 31 2c 20 61 6e 64 20 73 6f 20 66 6f 72 74 68 29  1, and so forth)
1d730 0a 20 20 20 20 20 20 2a 2a 20 54 68 65 6e 20 63  .      ** Then c
1d740 6f 6d 70 61 72 65 20 74 68 65 20 63 75 72 72 65  ompare the curre
1d750 6e 74 20 47 52 4f 55 50 20 42 59 20 74 65 72 6d  nt GROUP BY term
1d760 73 20 61 67 61 69 6e 73 74 20 74 68 65 20 47 52  s against the GR
1d770 4f 55 50 20 42 59 20 74 65 72 6d 73 0a 20 20 20  OUP BY terms.   
1d780 20 20 20 2a 2a 20 66 72 6f 6d 20 74 68 65 20 70     ** from the p
1d790 72 65 76 69 6f 75 73 20 72 6f 77 20 63 75 72 72  revious row curr
1d7a0 65 6e 74 6c 79 20 73 74 6f 72 65 64 20 69 6e 20  ently stored in 
1d7b0 61 30 2c 20 61 31 2c 20 61 32 2e 2e 2e 0a 20 20  a0, a1, a2....  
1d7c0 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 61 64 64      */.      add
1d7d0 72 54 6f 70 4f 66 4c 6f 6f 70 20 3d 20 73 71 6c  rTopOfLoop = sql
1d7e0 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41  ite3VdbeCurrentA
1d7f0 64 64 72 28 76 29 3b 0a 20 20 20 20 20 20 66 6f  ddr(v);.      fo
1d800 72 28 6a 3d 30 3b 20 6a 3c 70 47 72 6f 75 70 42  r(j=0; j<pGroupB
1d810 79 2d 3e 6e 45 78 70 72 3b 20 6a 2b 2b 29 7b 0a  y->nExpr; j++){.
1d820 20 20 20 20 20 20 20 20 69 66 28 20 67 72 6f 75          if( grou
1d830 70 42 79 53 6f 72 74 20 29 7b 0a 20 20 20 20 20  pBySort ){.     
1d840 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
1d850 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 43 6f 6c  AddOp2(v, OP_Col
1d860 75 6d 6e 2c 20 73 41 67 67 49 6e 66 6f 2e 73 6f  umn, sAggInfo.so
1d870 72 74 69 6e 67 49 64 78 2c 20 6a 29 3b 0a 20 20  rtingIdx, j);.  
1d880 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
1d890 20 20 20 20 20 20 20 73 41 67 67 49 6e 66 6f 2e         sAggInfo.
1d8a0 64 69 72 65 63 74 4d 6f 64 65 20 3d 20 31 3b 0a  directMode = 1;.
1d8b0 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
1d8c0 33 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65  3ExprCode(pParse
1d8d0 2c 20 70 47 72 6f 75 70 42 79 2d 3e 61 5b 6a 5d  , pGroupBy->a[j]
1d8e0 2e 70 45 78 70 72 2c 20 30 29 3b 0a 20 20 20 20  .pExpr, 0);.    
1d8f0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 73 71      }.        sq
1d900 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
1d910 76 2c 20 6a 3c 70 47 72 6f 75 70 42 79 2d 3e 6e  v, j<pGroupBy->n
1d920 45 78 70 72 2d 31 3f 4f 50 5f 4d 6f 76 65 3a 4f  Expr-1?OP_Move:O
1d930 50 5f 43 6f 70 79 2c 20 30 2c 20 69 42 4d 65 6d  P_Copy, 0, iBMem
1d940 2b 6a 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  +j);.      }.   
1d950 20 20 20 66 6f 72 28 6a 3d 70 47 72 6f 75 70 42     for(j=pGroupB
1d960 79 2d 3e 6e 45 78 70 72 2d 31 3b 20 6a 3e 3d 30  y->nExpr-1; j>=0
1d970 3b 20 6a 2d 2d 29 7b 0a 20 20 20 20 20 20 20 20  ; j--){.        
1d980 69 66 28 20 6a 3c 70 47 72 6f 75 70 42 79 2d 3e  if( j<pGroupBy->
1d990 6e 45 78 70 72 2d 31 20 29 7b 0a 20 20 20 20 20  nExpr-1 ){.     
1d9a0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
1d9b0 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 53 43 6f  AddOp2(v, OP_SCo
1d9c0 70 79 2c 20 69 42 4d 65 6d 2b 6a 2c 20 30 29 3b  py, iBMem+j, 0);
1d9d0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
1d9e0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
1d9f0 64 4f 70 32 28 76 2c 20 4f 50 5f 53 43 6f 70 79  dOp2(v, OP_SCopy
1da00 2c 20 69 41 4d 65 6d 2b 6a 2c 20 30 29 3b 0a 20  , iAMem+j, 0);. 
1da10 20 20 20 20 20 20 20 69 66 28 20 6a 3d 3d 30 20         if( j==0 
1da20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  ){.          sql
1da30 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
1da40 2c 20 4f 50 5f 45 71 2c 20 30 78 32 30 30 2c 20  , OP_Eq, 0x200, 
1da50 61 64 64 72 50 72 6f 63 65 73 73 52 6f 77 29 3b  addrProcessRow);
1da60 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
1da70 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
1da80 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
1da90 50 5f 4e 65 2c 20 30 78 32 30 30 2c 20 61 64 64  P_Ne, 0x200, add
1daa0 72 47 72 6f 75 70 42 79 43 68 61 6e 67 65 29 3b  rGroupByChange);
1dab0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
1dac0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68     sqlite3VdbeCh
1dad0 61 6e 67 65 50 34 28 76 2c 20 2d 31 2c 20 28 76  angeP4(v, -1, (v
1dae0 6f 69 64 2a 29 70 4b 65 79 49 6e 66 6f 2d 3e 61  oid*)pKeyInfo->a
1daf0 43 6f 6c 6c 5b 6a 5d 2c 20 50 34 5f 43 4f 4c 4c  Coll[j], P4_COLL
1db00 53 45 51 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20  SEQ);.      }.. 
1db10 20 20 20 20 20 2f 2a 20 47 65 6e 65 72 61 74 65       /* Generate
1db20 20 63 6f 64 65 20 74 68 61 74 20 72 75 6e 73 20   code that runs 
1db30 77 68 65 6e 65 76 65 72 20 74 68 65 20 47 52 4f  whenever the GRO
1db40 55 50 20 42 59 20 63 68 61 6e 67 65 73 2e 0a 20  UP BY changes.. 
1db50 20 20 20 20 20 2a 2a 20 43 68 61 6e 67 65 20 69       ** Change i
1db60 6e 20 74 68 65 20 47 52 4f 55 50 20 42 59 20 61  n the GROUP BY a
1db70 72 65 20 64 65 74 65 63 74 65 64 20 62 79 20 74  re detected by t
1db80 68 65 20 70 72 65 76 69 6f 75 73 20 63 6f 64 65  he previous code
1db90 0a 20 20 20 20 20 20 2a 2a 20 62 6c 6f 63 6b 2e  .      ** block.
1dba0 20 20 49 66 20 74 68 65 72 65 20 77 65 72 65 20    If there were 
1dbb0 6e 6f 20 63 68 61 6e 67 65 73 2c 20 74 68 69 73  no changes, this
1dbc0 20 62 6c 6f 63 6b 20 69 73 20 73 6b 69 70 70 65   block is skippe
1dbd0 64 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20  d..      **.    
1dbe0 20 20 2a 2a 20 54 68 69 73 20 63 6f 64 65 20 63    ** This code c
1dbf0 6f 70 69 65 73 20 63 75 72 72 65 6e 74 20 67 72  opies current gr
1dc00 6f 75 70 20 62 79 20 74 65 72 6d 73 20 69 6e 20  oup by terms in 
1dc10 62 30 2c 62 31 2c 62 32 2c 2e 2e 2e 0a 20 20 20  b0,b1,b2,....   
1dc20 20 20 20 2a 2a 20 6f 76 65 72 20 74 6f 20 61 30     ** over to a0
1dc30 2c 61 31 2c 61 32 2e 20 20 49 74 20 74 68 65 6e  ,a1,a2.  It then
1dc40 20 63 61 6c 6c 73 20 74 68 65 20 6f 75 74 70 75   calls the outpu
1dc50 74 20 73 75 62 72 6f 75 74 69 6e 65 0a 20 20 20  t subroutine.   
1dc60 20 20 20 2a 2a 20 61 6e 64 20 72 65 73 65 74 73     ** and resets
1dc70 20 74 68 65 20 61 67 67 72 65 67 61 74 65 20 61   the aggregate a
1dc80 63 63 75 6d 75 6c 61 74 6f 72 20 72 65 67 69 73  ccumulator regis
1dc90 74 65 72 73 20 69 6e 20 70 72 65 70 61 72 61 74  ters in preparat
1dca0 69 6f 6e 0a 20 20 20 20 20 20 2a 2a 20 66 6f 72  ion.      ** for
1dcb0 20 74 68 65 20 6e 65 78 74 20 47 52 4f 55 50 20   the next GROUP 
1dcc0 42 59 20 62 61 74 63 68 2e 0a 20 20 20 20 20 20  BY batch..      
1dcd0 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  */.      sqlite3
1dce0 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c  VdbeResolveLabel
1dcf0 28 76 2c 20 61 64 64 72 47 72 6f 75 70 42 79 43  (v, addrGroupByC
1dd00 68 61 6e 67 65 29 3b 0a 20 20 20 20 20 20 66 6f  hange);.      fo
1dd10 72 28 6a 3d 30 3b 20 6a 3c 70 47 72 6f 75 70 42  r(j=0; j<pGroupB
1dd20 79 2d 3e 6e 45 78 70 72 3b 20 6a 2b 2b 29 7b 0a  y->nExpr; j++){.
1dd30 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
1dd40 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
1dd50 4d 6f 76 65 2c 20 69 42 4d 65 6d 2b 6a 2c 20 69  Move, iBMem+j, i
1dd60 41 4d 65 6d 2b 6a 29 3b 0a 20 20 20 20 20 20 7d  AMem+j);.      }
1dd70 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
1dd80 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47  beAddOp2(v, OP_G
1dd90 6f 73 75 62 2c 20 30 2c 20 61 64 64 72 4f 75 74  osub, 0, addrOut
1dda0 70 75 74 52 6f 77 29 3b 0a 20 20 20 20 20 20 56  putRow);.      V
1ddb0 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22  dbeComment((v, "
1ddc0 6f 75 74 70 75 74 20 6f 6e 65 20 72 6f 77 22 29  output one row")
1ddd0 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
1dde0 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
1ddf0 5f 49 66 4d 65 6d 50 6f 73 2c 20 69 41 62 6f 72  _IfMemPos, iAbor
1de00 74 46 6c 61 67 2c 20 61 64 64 72 45 6e 64 29 3b  tFlag, addrEnd);
1de10 0a 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65  .      VdbeComme
1de20 6e 74 28 28 76 2c 20 22 63 68 65 63 6b 20 61 62  nt((v, "check ab
1de30 6f 72 74 20 66 6c 61 67 22 29 29 3b 0a 20 20 20  ort flag"));.   
1de40 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
1de50 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 73 75 62  dOp2(v, OP_Gosub
1de60 2c 20 30 2c 20 61 64 64 72 52 65 73 65 74 29 3b  , 0, addrReset);
1de70 0a 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65  .      VdbeComme
1de80 6e 74 28 28 76 2c 20 22 72 65 73 65 74 20 61 63  nt((v, "reset ac
1de90 63 75 6d 75 6c 61 74 6f 72 22 29 29 3b 0a 0a 20  cumulator"));.. 
1dea0 20 20 20 20 20 2f 2a 20 55 70 64 61 74 65 20 74       /* Update t
1deb0 68 65 20 61 67 67 72 65 67 61 74 65 20 61 63 63  he aggregate acc
1dec0 75 6d 75 6c 61 74 6f 72 73 20 62 61 73 65 64 20  umulators based 
1ded0 6f 6e 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f  on the content o
1dee0 66 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20 63  f.      ** the c
1def0 75 72 72 65 6e 74 20 72 6f 77 0a 20 20 20 20 20  urrent row.     
1df00 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65   */.      sqlite
1df10 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65  3VdbeResolveLabe
1df20 6c 28 76 2c 20 61 64 64 72 50 72 6f 63 65 73 73  l(v, addrProcess
1df30 52 6f 77 29 3b 0a 20 20 20 20 20 20 75 70 64 61  Row);.      upda
1df40 74 65 41 63 63 75 6d 75 6c 61 74 6f 72 28 70 50  teAccumulator(pP
1df50 61 72 73 65 2c 20 26 73 41 67 67 49 6e 66 6f 29  arse, &sAggInfo)
1df60 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
1df70 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
1df80 49 6e 74 65 67 65 72 2c 20 31 2c 20 69 55 73 65  Integer, 1, iUse
1df90 46 6c 61 67 29 3b 0a 20 20 20 20 20 20 56 64 62  Flag);.      Vdb
1dfa0 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 69 6e  eComment((v, "in
1dfb0 64 69 63 61 74 65 20 64 61 74 61 20 69 6e 20 61  dicate data in a
1dfc0 63 63 75 6d 75 6c 61 74 6f 72 22 29 29 3b 0a 0a  ccumulator"));..
1dfd0 20 20 20 20 20 20 2f 2a 20 45 6e 64 20 6f 66 20        /* End of 
1dfe0 74 68 65 20 6c 6f 6f 70 0a 20 20 20 20 20 20 2a  the loop.      *
1dff0 2f 0a 20 20 20 20 20 20 69 66 28 20 67 72 6f 75  /.      if( grou
1e000 70 42 79 53 6f 72 74 20 29 7b 0a 20 20 20 20 20  pBySort ){.     
1e010 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
1e020 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 65 78 74 2c  dOp2(v, OP_Next,
1e030 20 73 41 67 67 49 6e 66 6f 2e 73 6f 72 74 69 6e   sAggInfo.sortin
1e040 67 49 64 78 2c 20 61 64 64 72 54 6f 70 4f 66 4c  gIdx, addrTopOfL
1e050 6f 6f 70 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  oop);.      }els
1e060 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  e{.        sqlit
1e070 65 33 57 68 65 72 65 45 6e 64 28 70 57 49 6e 66  e3WhereEnd(pWInf
1e080 6f 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  o);.        sqli
1e090 74 65 33 56 64 62 65 43 68 61 6e 67 65 54 6f 4e  te3VdbeChangeToN
1e0a0 6f 6f 70 28 76 2c 20 61 64 64 72 53 6f 72 74 69  oop(v, addrSorti
1e0b0 6e 67 49 64 78 2c 20 31 29 3b 0a 20 20 20 20 20  ngIdx, 1);.     
1e0c0 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 4f 75 74   }..      /* Out
1e0d0 70 75 74 20 74 68 65 20 66 69 6e 61 6c 20 72 6f  put the final ro
1e0e0 77 20 6f 66 20 72 65 73 75 6c 74 0a 20 20 20 20  w of result.    
1e0f0 20 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74    */.      sqlit
1e100 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
1e110 4f 50 5f 47 6f 73 75 62 2c 20 30 2c 20 61 64 64  OP_Gosub, 0, add
1e120 72 4f 75 74 70 75 74 52 6f 77 29 3b 0a 20 20 20  rOutputRow);.   
1e130 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28     VdbeComment((
1e140 76 2c 20 22 6f 75 74 70 75 74 20 66 69 6e 61 6c  v, "output final
1e150 20 72 6f 77 22 29 29 3b 0a 20 20 20 20 20 20 0a   row"));.      .
1e160 20 20 20 20 7d 20 2f 2a 20 65 6e 64 69 66 20 70      } /* endif p
1e170 47 72 6f 75 70 42 79 20 2a 2f 0a 20 20 20 20 65  GroupBy */.    e
1e180 6c 73 65 20 7b 0a 20 20 20 20 20 20 2f 2a 20 54  lse {.      /* T
1e190 68 69 73 20 63 61 73 65 20 72 75 6e 73 20 69 66  his case runs if
1e1a0 20 74 68 65 20 61 67 67 72 65 67 61 74 65 20 68   the aggregate h
1e1b0 61 73 20 6e 6f 20 47 52 4f 55 50 20 42 59 20 63  as no GROUP BY c
1e1c0 6c 61 75 73 65 2e 20 20 54 68 65 0a 20 20 20 20  lause.  The.    
1e1d0 20 20 2a 2a 20 70 72 6f 63 65 73 73 69 6e 67 20    ** processing 
1e1e0 69 73 20 6d 75 63 68 20 73 69 6d 70 6c 65 72 20  is much simpler 
1e1f0 73 69 6e 63 65 20 74 68 65 72 65 20 69 73 20 6f  since there is o
1e200 6e 6c 79 20 61 20 73 69 6e 67 6c 65 20 72 6f 77  nly a single row
1e210 0a 20 20 20 20 20 20 2a 2a 20 6f 66 20 6f 75 74  .      ** of out
1e220 70 75 74 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  put..      */.  
1e230 20 20 20 20 72 65 73 65 74 41 63 63 75 6d 75 6c      resetAccumul
1e240 61 74 6f 72 28 70 50 61 72 73 65 2c 20 26 73 41  ator(pParse, &sA
1e250 67 67 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20 70  ggInfo);.      p
1e260 57 49 6e 66 6f 20 3d 20 73 71 6c 69 74 65 33 57  WInfo = sqlite3W
1e270 68 65 72 65 42 65 67 69 6e 28 70 50 61 72 73 65  hereBegin(pParse
1e280 2c 20 70 54 61 62 4c 69 73 74 2c 20 70 57 68 65  , pTabList, pWhe
1e290 72 65 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66  re, 0);.      if
1e2a0 28 20 70 57 49 6e 66 6f 3d 3d 30 20 29 20 67 6f  ( pWInfo==0 ) go
1e2b0 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20  to select_end;. 
1e2c0 20 20 20 20 20 75 70 64 61 74 65 41 63 63 75 6d       updateAccum
1e2d0 75 6c 61 74 6f 72 28 70 50 61 72 73 65 2c 20 26  ulator(pParse, &
1e2e0 73 41 67 67 49 6e 66 6f 29 3b 0a 20 20 20 20 20  sAggInfo);.     
1e2f0 20 73 71 6c 69 74 65 33 57 68 65 72 65 45 6e 64   sqlite3WhereEnd
1e300 28 70 57 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20  (pWInfo);.      
1e310 66 69 6e 61 6c 69 7a 65 41 67 67 46 75 6e 63 74  finalizeAggFunct
1e320 69 6f 6e 73 28 70 50 61 72 73 65 2c 20 26 73 41  ions(pParse, &sA
1e330 67 67 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20 70  ggInfo);.      p
1e340 4f 72 64 65 72 42 79 20 3d 20 30 3b 0a 20 20 20  OrderBy = 0;.   
1e350 20 20 20 69 66 28 20 70 48 61 76 69 6e 67 20 29     if( pHaving )
1e360 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
1e370 33 45 78 70 72 49 66 46 61 6c 73 65 28 70 50 61  3ExprIfFalse(pPa
1e380 72 73 65 2c 20 70 48 61 76 69 6e 67 2c 20 61 64  rse, pHaving, ad
1e390 64 72 45 6e 64 2c 20 31 29 3b 0a 20 20 20 20 20  drEnd, 1);.     
1e3a0 20 7d 0a 20 20 20 20 20 20 73 65 6c 65 63 74 49   }.      selectI
1e3b0 6e 6e 65 72 4c 6f 6f 70 28 70 50 61 72 73 65 2c  nnerLoop(pParse,
1e3c0 20 70 2c 20 70 2d 3e 70 45 4c 69 73 74 2c 20 30   p, p->pEList, 0
1e3d0 2c 20 30 2c 20 30 2c 20 2d 31 2c 20 0a 20 20 20  , 0, 0, -1, .   
1e3e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e3f0 20 20 20 70 44 65 73 74 2c 20 61 64 64 72 45 6e     pDest, addrEn
1e400 64 2c 20 61 64 64 72 45 6e 64 2c 20 61 66 66 29  d, addrEnd, aff)
1e410 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  ;.    }.    sqli
1e420 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61  te3VdbeResolveLa
1e430 62 65 6c 28 76 2c 20 61 64 64 72 45 6e 64 29 3b  bel(v, addrEnd);
1e440 0a 20 20 20 20 0a 20 20 7d 20 2f 2a 20 65 6e 64  .    .  } /* end
1e450 69 66 20 61 67 67 72 65 67 61 74 65 20 71 75 65  if aggregate que
1e460 72 79 20 2a 2f 0a 0a 20 20 2f 2a 20 49 66 20 74  ry */..  /* If t
1e470 68 65 72 65 20 69 73 20 61 6e 20 4f 52 44 45 52  here is an ORDER
1e480 20 42 59 20 63 6c 61 75 73 65 2c 20 74 68 65 6e   BY clause, then
1e490 20 77 65 20 6e 65 65 64 20 74 6f 20 73 6f 72 74   we need to sort
1e4a0 20 74 68 65 20 72 65 73 75 6c 74 73 0a 20 20 2a   the results.  *
1e4b0 2a 20 61 6e 64 20 73 65 6e 64 20 74 68 65 6d 20  * and send them 
1e4c0 74 6f 20 74 68 65 20 63 61 6c 6c 62 61 63 6b 20  to the callback 
1e4d0 6f 6e 65 20 62 79 20 6f 6e 65 2e 0a 20 20 2a 2f  one by one..  */
1e4e0 0a 20 20 69 66 28 20 70 4f 72 64 65 72 42 79 20  .  if( pOrderBy 
1e4f0 29 7b 0a 20 20 20 20 67 65 6e 65 72 61 74 65 53  ){.    generateS
1e500 6f 72 74 54 61 69 6c 28 70 50 61 72 73 65 2c 20  ortTail(pParse, 
1e510 70 2c 20 76 2c 20 70 45 4c 69 73 74 2d 3e 6e 45  p, v, pEList->nE
1e520 78 70 72 2c 20 70 44 65 73 74 29 3b 0a 20 20 7d  xpr, pDest);.  }
1e530 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
1e540 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 20  _OMIT_SUBQUERY. 
1e550 20 2f 2a 20 49 66 20 74 68 69 73 20 77 61 73 20   /* If this was 
1e560 61 20 73 75 62 71 75 65 72 79 2c 20 77 65 20 68  a subquery, we h
1e570 61 76 65 20 6e 6f 77 20 63 6f 6e 76 65 72 74 65  ave now converte
1e580 64 20 74 68 65 20 73 75 62 71 75 65 72 79 20 69  d the subquery i
1e590 6e 74 6f 20 61 0a 20 20 2a 2a 20 74 65 6d 70 6f  nto a.  ** tempo
1e5a0 72 61 72 79 20 74 61 62 6c 65 2e 20 20 53 6f 20  rary table.  So 
1e5b0 73 65 74 20 74 68 65 20 53 72 63 4c 69 73 74 5f  set the SrcList_
1e5c0 69 74 65 6d 2e 69 73 50 6f 70 75 6c 61 74 65 64  item.isPopulated
1e5d0 20 66 6c 61 67 20 74 6f 20 70 72 65 76 65 6e 74   flag to prevent
1e5e0 0a 20 20 2a 2a 20 74 68 69 73 20 73 75 62 71 75  .  ** this subqu
1e5f0 65 72 79 20 66 72 6f 6d 20 62 65 69 6e 67 20 65  ery from being e
1e600 76 61 6c 75 61 74 65 64 20 61 67 61 69 6e 20 61  valuated again a
1e610 6e 64 20 74 6f 20 66 6f 72 63 65 20 74 68 65 20  nd to force the 
1e620 75 73 65 20 6f 66 0a 20 20 2a 2a 20 74 68 65 20  use of.  ** the 
1e630 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 2e  temporary table.
1e640 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 50 61 72  .  */.  if( pPar
1e650 65 6e 74 20 29 7b 0a 20 20 20 20 61 73 73 65 72  ent ){.    asser
1e660 74 28 20 70 50 61 72 65 6e 74 2d 3e 70 53 72 63  t( pParent->pSrc
1e670 2d 3e 6e 53 72 63 3e 70 61 72 65 6e 74 54 61 62  ->nSrc>parentTab
1e680 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
1e690 70 50 61 72 65 6e 74 2d 3e 70 53 72 63 2d 3e 61  pParent->pSrc->a
1e6a0 5b 70 61 72 65 6e 74 54 61 62 5d 2e 70 53 65 6c  [parentTab].pSel
1e6b0 65 63 74 3d 3d 70 20 29 3b 0a 20 20 20 20 70 50  ect==p );.    pP
1e6c0 61 72 65 6e 74 2d 3e 70 53 72 63 2d 3e 61 5b 70  arent->pSrc->a[p
1e6d0 61 72 65 6e 74 54 61 62 5d 2e 69 73 50 6f 70 75  arentTab].isPopu
1e6e0 6c 61 74 65 64 20 3d 20 31 3b 0a 20 20 7d 0a 23  lated = 1;.  }.#
1e6f0 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 4a 75 6d 70  endif..  /* Jump
1e700 20 68 65 72 65 20 74 6f 20 73 6b 69 70 20 74 68   here to skip th
1e710 69 73 20 71 75 65 72 79 0a 20 20 2a 2f 0a 20 20  is query.  */.  
1e720 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c  sqlite3VdbeResol
1e730 76 65 4c 61 62 65 6c 28 76 2c 20 69 45 6e 64 29  veLabel(v, iEnd)
1e740 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 53 45 4c 45  ;..  /* The SELE
1e750 43 54 20 77 61 73 20 73 75 63 63 65 73 73 66 75  CT was successfu
1e760 6c 6c 79 20 63 6f 64 65 64 2e 20 20 20 53 65 74  lly coded.   Set
1e770 20 74 68 65 20 72 65 74 75 72 6e 20 63 6f 64 65   the return code
1e780 20 74 6f 20 30 0a 20 20 2a 2a 20 74 6f 20 69 6e   to 0.  ** to in
1e790 64 69 63 61 74 65 20 6e 6f 20 65 72 72 6f 72 73  dicate no errors
1e7a0 2e 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20 30 3b  ..  */.  rc = 0;
1e7b0 0a 0a 20 20 2f 2a 20 43 6f 6e 74 72 6f 6c 20 6a  ..  /* Control j
1e7c0 75 6d 70 73 20 74 6f 20 68 65 72 65 20 69 66 20  umps to here if 
1e7d0 61 6e 20 65 72 72 6f 72 20 69 73 20 65 6e 63 6f  an error is enco
1e7e0 75 6e 74 65 72 65 64 20 61 62 6f 76 65 2c 20 6f  untered above, o
1e7f0 72 20 75 70 6f 6e 0a 20 20 2a 2a 20 73 75 63 63  r upon.  ** succ
1e800 65 73 73 66 75 6c 20 63 6f 64 69 6e 67 20 6f 66  essful coding of
1e810 20 74 68 65 20 53 45 4c 45 43 54 2e 0a 20 20 2a   the SELECT..  *
1e820 2f 0a 73 65 6c 65 63 74 5f 65 6e 64 3a 0a 0a 20  /.select_end:.. 
1e830 20 2f 2a 20 49 64 65 6e 74 69 66 79 20 63 6f 6c   /* Identify col
1e840 75 6d 6e 20 6e 61 6d 65 73 20 69 66 20 77 65 20  umn names if we 
1e850 77 69 6c 6c 20 62 65 20 75 73 69 6e 67 20 74 68  will be using th
1e860 65 6d 20 69 6e 20 61 20 63 61 6c 6c 62 61 63 6b  em in a callback
1e870 2e 20 20 54 68 69 73 0a 20 20 2a 2a 20 73 74 65  .  This.  ** ste
1e880 70 20 69 73 20 73 6b 69 70 70 65 64 20 69 66 20  p is skipped if 
1e890 74 68 65 20 6f 75 74 70 75 74 20 69 73 20 67 6f  the output is go
1e8a0 69 6e 67 20 74 6f 20 73 6f 6d 65 20 6f 74 68 65  ing to some othe
1e8b0 72 20 64 65 73 74 69 6e 61 74 69 6f 6e 2e 0a 20  r destination.. 
1e8c0 20 2a 2f 0a 20 20 69 66 28 20 72 63 3d 3d 53 51   */.  if( rc==SQ
1e8d0 4c 49 54 45 5f 4f 4b 20 26 26 20 70 44 65 73 74  LITE_OK && pDest
1e8e0 2d 3e 65 44 65 73 74 3d 3d 53 52 54 5f 43 61 6c  ->eDest==SRT_Cal
1e8f0 6c 62 61 63 6b 20 29 7b 0a 20 20 20 20 67 65 6e  lback ){.    gen
1e900 65 72 61 74 65 43 6f 6c 75 6d 6e 4e 61 6d 65 73  erateColumnNames
1e910 28 70 50 61 72 73 65 2c 20 70 54 61 62 4c 69 73  (pParse, pTabLis
1e920 74 2c 20 70 45 4c 69 73 74 29 3b 0a 20 20 7d 0a  t, pEList);.  }.
1e930 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28  .  sqlite3_free(
1e940 73 41 67 67 49 6e 66 6f 2e 61 43 6f 6c 29 3b 0a  sAggInfo.aCol);.
1e950 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 73    sqlite3_free(s
1e960 41 67 67 49 6e 66 6f 2e 61 46 75 6e 63 29 3b 0a  AggInfo.aFunc);.
1e970 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
1e980 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49  #if defined(SQLI
1e990 54 45 5f 44 45 42 55 47 29 0a 2f 2a 0a 2a 2a 2a  TE_DEBUG)./*.***
1e9a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1e9b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1e9c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1e9d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1e9e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 20  ************.** 
1e9f0 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 6f  The following co
1ea00 64 65 20 69 73 20 75 73 65 64 20 66 6f 72 20 74  de is used for t
1ea10 65 73 74 69 6e 67 20 61 6e 64 20 64 65 62 75 67  esting and debug
1ea20 67 69 6e 67 20 6f 6e 6c 79 2e 20 20 54 68 65 20  ging only.  The 
1ea30 63 6f 64 65 0a 2a 2a 20 74 68 61 74 20 66 6f 6c  code.** that fol
1ea40 6c 6f 77 73 20 64 6f 65 73 20 6e 6f 74 20 61 70  lows does not ap
1ea50 70 65 61 72 20 69 6e 20 6e 6f 72 6d 61 6c 20 62  pear in normal b
1ea60 75 69 6c 64 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  uilds..**.** The
1ea70 73 65 20 72 6f 75 74 69 6e 65 73 20 61 72 65 20  se routines are 
1ea80 75 73 65 64 20 74 6f 20 70 72 69 6e 74 20 6f 75  used to print ou
1ea90 74 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66  t the content of
1eaa0 20 61 6c 6c 20 6f 72 20 70 61 72 74 20 6f 66 20   all or part of 
1eab0 61 20 0a 2a 2a 20 70 61 72 73 65 20 73 74 72 75  a .** parse stru
1eac0 63 74 75 72 65 73 20 73 75 63 68 20 61 73 20 53  ctures such as S
1ead0 65 6c 65 63 74 20 6f 72 20 45 78 70 72 2e 20 20  elect or Expr.  
1eae0 53 75 63 68 20 70 72 69 6e 74 6f 75 74 73 20 61  Such printouts a
1eaf0 72 65 20 75 73 65 66 75 6c 0a 2a 2a 20 66 6f 72  re useful.** for
1eb00 20 68 65 6c 70 69 6e 67 20 74 6f 20 75 6e 64 65   helping to unde
1eb10 72 73 74 61 6e 64 20 77 68 61 74 20 69 73 20 68  rstand what is h
1eb20 61 70 70 65 6e 69 6e 67 20 69 6e 73 69 64 65 20  appening inside 
1eb30 74 68 65 20 63 6f 64 65 20 67 65 6e 65 72 61 74  the code generat
1eb40 6f 72 0a 2a 2a 20 64 75 72 69 6e 67 20 74 68 65  or.** during the
1eb50 20 65 78 65 63 75 74 69 6f 6e 20 6f 66 20 63 6f   execution of co
1eb60 6d 70 6c 65 78 20 53 45 4c 45 43 54 20 73 74 61  mplex SELECT sta
1eb70 74 65 6d 65 6e 74 73 2e 0a 2a 2a 0a 2a 2a 20 54  tements..**.** T
1eb80 68 65 73 65 20 72 6f 75 74 69 6e 65 20 61 72 65  hese routine are
1eb90 20 6e 6f 74 20 63 61 6c 6c 65 64 20 61 6e 79 77   not called anyw
1eba0 68 65 72 65 20 66 72 6f 6d 20 77 69 74 68 69 6e  here from within
1ebb0 20 74 68 65 20 6e 6f 72 6d 61 6c 0a 2a 2a 20 63   the normal.** c
1ebc0 6f 64 65 20 62 61 73 65 2e 20 20 54 68 65 6e 20  ode base.  Then 
1ebd0 61 72 65 20 69 6e 74 65 6e 64 65 64 20 74 6f 20  are intended to 
1ebe0 62 65 20 63 61 6c 6c 65 64 20 66 72 6f 6d 20 77  be called from w
1ebf0 69 74 68 69 6e 20 74 68 65 20 64 65 62 75 67 67  ithin the debugg
1ec00 65 72 0a 2a 2a 20 6f 72 20 66 72 6f 6d 20 74 65  er.** or from te
1ec10 6d 70 6f 72 61 72 79 20 22 70 72 69 6e 74 66 22  mporary "printf"
1ec20 20 73 74 61 74 65 6d 65 6e 74 73 20 69 6e 73 65   statements inse
1ec30 72 74 65 64 20 66 6f 72 20 64 65 62 75 67 67 69  rted for debuggi
1ec40 6e 67 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  ng..*/.void sqli
1ec50 74 65 33 50 72 69 6e 74 45 78 70 72 28 45 78 70  te3PrintExpr(Exp
1ec60 72 20 2a 70 29 7b 0a 20 20 69 66 28 20 70 2d 3e  r *p){.  if( p->
1ec70 74 6f 6b 65 6e 2e 7a 20 26 26 20 70 2d 3e 74 6f  token.z && p->to
1ec80 6b 65 6e 2e 6e 3e 30 20 29 7b 0a 20 20 20 20 73  ken.n>0 ){.    s
1ec90 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74  qlite3DebugPrint
1eca0 66 28 22 28 25 2e 2a 73 22 2c 20 70 2d 3e 74 6f  f("(%.*s", p->to
1ecb0 6b 65 6e 2e 6e 2c 20 70 2d 3e 74 6f 6b 65 6e 2e  ken.n, p->token.
1ecc0 7a 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  z);.  }else{.   
1ecd0 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69   sqlite3DebugPri
1ece0 6e 74 66 28 22 28 25 64 22 2c 20 70 2d 3e 6f 70  ntf("(%d", p->op
1ecf0 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e  );.  }.  if( p->
1ed00 70 4c 65 66 74 20 29 7b 0a 20 20 20 20 73 71 6c  pLeft ){.    sql
1ed10 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28  ite3DebugPrintf(
1ed20 22 20 22 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  " ");.    sqlite
1ed30 33 50 72 69 6e 74 45 78 70 72 28 70 2d 3e 70 4c  3PrintExpr(p->pL
1ed40 65 66 74 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  eft);.  }.  if( 
1ed50 70 2d 3e 70 52 69 67 68 74 20 29 7b 0a 20 20 20  p->pRight ){.   
1ed60 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69   sqlite3DebugPri
1ed70 6e 74 66 28 22 20 22 29 3b 0a 20 20 20 20 73 71  ntf(" ");.    sq
1ed80 6c 69 74 65 33 50 72 69 6e 74 45 78 70 72 28 70  lite3PrintExpr(p
1ed90 2d 3e 70 52 69 67 68 74 29 3b 0a 20 20 7d 0a 20  ->pRight);.  }. 
1eda0 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69   sqlite3DebugPri
1edb0 6e 74 66 28 22 29 22 29 3b 0a 7d 0a 76 6f 69 64  ntf(")");.}.void
1edc0 20 73 71 6c 69 74 65 33 50 72 69 6e 74 45 78 70   sqlite3PrintExp
1edd0 72 4c 69 73 74 28 45 78 70 72 4c 69 73 74 20 2a  rList(ExprList *
1ede0 70 4c 69 73 74 29 7b 0a 20 20 69 6e 74 20 69 3b  pList){.  int i;
1edf0 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4c  .  for(i=0; i<pL
1ee00 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29  ist->nExpr; i++)
1ee10 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 50 72 69  {.    sqlite3Pri
1ee20 6e 74 45 78 70 72 28 70 4c 69 73 74 2d 3e 61 5b  ntExpr(pList->a[
1ee30 69 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20 20 69  i].pExpr);.    i
1ee40 66 28 20 69 3c 70 4c 69 73 74 2d 3e 6e 45 78 70  f( i<pList->nExp
1ee50 72 2d 31 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  r-1 ){.      sql
1ee60 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28  ite3DebugPrintf(
1ee70 22 2c 20 22 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  ", ");.    }.  }
1ee80 0a 7d 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 50  .}.void sqlite3P
1ee90 72 69 6e 74 53 65 6c 65 63 74 28 53 65 6c 65 63  rintSelect(Selec
1eea0 74 20 2a 70 2c 20 69 6e 74 20 69 6e 64 65 6e 74  t *p, int indent
1eeb0 29 7b 0a 20 20 73 71 6c 69 74 65 33 44 65 62 75  ){.  sqlite3Debu
1eec0 67 50 72 69 6e 74 66 28 22 25 2a 73 53 45 4c 45  gPrintf("%*sSELE
1eed0 43 54 28 25 70 29 20 22 2c 20 69 6e 64 65 6e 74  CT(%p) ", indent
1eee0 2c 20 22 22 2c 20 70 29 3b 0a 20 20 73 71 6c 69  , "", p);.  sqli
1eef0 74 65 33 50 72 69 6e 74 45 78 70 72 4c 69 73 74  te3PrintExprList
1ef00 28 70 2d 3e 70 45 4c 69 73 74 29 3b 0a 20 20 73  (p->pEList);.  s
1ef10 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74  qlite3DebugPrint
1ef20 66 28 22 5c 6e 22 29 3b 0a 20 20 69 66 28 20 70  f("\n");.  if( p
1ef30 2d 3e 70 53 72 63 20 29 7b 0a 20 20 20 20 63 68  ->pSrc ){.    ch
1ef40 61 72 20 2a 7a 50 72 65 66 69 78 3b 0a 20 20 20  ar *zPrefix;.   
1ef50 20 69 6e 74 20 69 3b 0a 20 20 20 20 7a 50 72 65   int i;.    zPre
1ef60 66 69 78 20 3d 20 22 46 52 4f 4d 22 3b 0a 20 20  fix = "FROM";.  
1ef70 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e    for(i=0; i<p->
1ef80 70 53 72 63 2d 3e 6e 53 72 63 3b 20 69 2b 2b 29  pSrc->nSrc; i++)
1ef90 7b 0a 20 20 20 20 20 20 73 74 72 75 63 74 20 53  {.      struct S
1efa0 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74  rcList_item *pIt
1efb0 65 6d 20 3d 20 26 70 2d 3e 70 53 72 63 2d 3e 61  em = &p->pSrc->a
1efc0 5b 69 5d 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  [i];.      sqlit
1efd0 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 25  e3DebugPrintf("%
1efe0 2a 73 20 22 2c 20 69 6e 64 65 6e 74 2b 36 2c 20  *s ", indent+6, 
1eff0 7a 50 72 65 66 69 78 29 3b 0a 20 20 20 20 20 20  zPrefix);.      
1f000 7a 50 72 65 66 69 78 20 3d 20 22 22 3b 0a 20 20  zPrefix = "";.  
1f010 20 20 20 20 69 66 28 20 70 49 74 65 6d 2d 3e 70      if( pItem->p
1f020 53 65 6c 65 63 74 20 29 7b 0a 20 20 20 20 20 20  Select ){.      
1f030 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72    sqlite3DebugPr
1f040 69 6e 74 66 28 22 28 5c 6e 22 29 3b 0a 20 20 20  intf("(\n");.   
1f050 20 20 20 20 20 73 71 6c 69 74 65 33 50 72 69 6e       sqlite3Prin
1f060 74 53 65 6c 65 63 74 28 70 49 74 65 6d 2d 3e 70  tSelect(pItem->p
1f070 53 65 6c 65 63 74 2c 20 69 6e 64 65 6e 74 2b 31  Select, indent+1
1f080 30 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  0);.        sqli
1f090 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22  te3DebugPrintf("
1f0a0 25 2a 73 29 22 2c 20 69 6e 64 65 6e 74 2b 38 2c  %*s)", indent+8,
1f0b0 20 22 22 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73   "");.      }els
1f0c0 65 20 69 66 28 20 70 49 74 65 6d 2d 3e 7a 4e 61  e if( pItem->zNa
1f0d0 6d 65 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  me ){.        sq
1f0e0 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66  lite3DebugPrintf
1f0f0 28 22 25 73 22 2c 20 70 49 74 65 6d 2d 3e 7a 4e  ("%s", pItem->zN
1f100 61 6d 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ame);.      }.  
1f110 20 20 20 20 69 66 28 20 70 49 74 65 6d 2d 3e 70      if( pItem->p
1f120 54 61 62 20 29 7b 0a 20 20 20 20 20 20 20 20 73  Tab ){.        s
1f130 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74  qlite3DebugPrint
1f140 66 28 22 28 74 61 62 6c 65 3a 20 25 73 29 22 2c  f("(table: %s)",
1f150 20 70 49 74 65 6d 2d 3e 70 54 61 62 2d 3e 7a 4e   pItem->pTab->zN
1f160 61 6d 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ame);.      }.  
1f170 20 20 20 20 69 66 28 20 70 49 74 65 6d 2d 3e 7a      if( pItem->z
1f180 41 6c 69 61 73 20 29 7b 0a 20 20 20 20 20 20 20  Alias ){.       
1f190 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69   sqlite3DebugPri
1f1a0 6e 74 66 28 22 20 41 53 20 25 73 22 2c 20 70 49  ntf(" AS %s", pI
1f1b0 74 65 6d 2d 3e 7a 41 6c 69 61 73 29 3b 0a 20 20  tem->zAlias);.  
1f1c0 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
1f1d0 69 3c 70 2d 3e 70 53 72 63 2d 3e 6e 53 72 63 2d  i<p->pSrc->nSrc-
1f1e0 31 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  1 ){.        sql
1f1f0 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28  ite3DebugPrintf(
1f200 22 2c 22 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ",");.      }.  
1f210 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67      sqlite3Debug
1f220 50 72 69 6e 74 66 28 22 5c 6e 22 29 3b 0a 20 20  Printf("\n");.  
1f230 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d    }.  }.  if( p-
1f240 3e 70 57 68 65 72 65 20 29 7b 0a 20 20 20 20 73  >pWhere ){.    s
1f250 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74  qlite3DebugPrint
1f260 66 28 22 25 2a 73 20 57 48 45 52 45 20 22 2c 20  f("%*s WHERE ", 
1f270 69 6e 64 65 6e 74 2c 20 22 22 29 3b 0a 20 20 20  indent, "");.   
1f280 20 73 71 6c 69 74 65 33 50 72 69 6e 74 45 78 70   sqlite3PrintExp
1f290 72 28 70 2d 3e 70 57 68 65 72 65 29 3b 0a 20 20  r(p->pWhere);.  
1f2a0 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72    sqlite3DebugPr
1f2b0 69 6e 74 66 28 22 5c 6e 22 29 3b 0a 20 20 7d 0a  intf("\n");.  }.
1f2c0 20 20 69 66 28 20 70 2d 3e 70 47 72 6f 75 70 42    if( p->pGroupB
1f2d0 79 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  y ){.    sqlite3
1f2e0 44 65 62 75 67 50 72 69 6e 74 66 28 22 25 2a 73  DebugPrintf("%*s
1f2f0 20 47 52 4f 55 50 20 42 59 20 22 2c 20 69 6e 64   GROUP BY ", ind
1f300 65 6e 74 2c 20 22 22 29 3b 0a 20 20 20 20 73 71  ent, "");.    sq
1f310 6c 69 74 65 33 50 72 69 6e 74 45 78 70 72 4c 69  lite3PrintExprLi
1f320 73 74 28 70 2d 3e 70 47 72 6f 75 70 42 79 29 3b  st(p->pGroupBy);
1f330 0a 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75  .    sqlite3Debu
1f340 67 50 72 69 6e 74 66 28 22 5c 6e 22 29 3b 0a 20  gPrintf("\n");. 
1f350 20 7d 0a 20 20 69 66 28 20 70 2d 3e 70 48 61 76   }.  if( p->pHav
1f360 69 6e 67 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ing ){.    sqlit
1f370 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 25  e3DebugPrintf("%
1f380 2a 73 20 48 41 56 49 4e 47 20 22 2c 20 69 6e 64  *s HAVING ", ind
1f390 65 6e 74 2c 20 22 22 29 3b 0a 20 20 20 20 73 71  ent, "");.    sq
1f3a0 6c 69 74 65 33 50 72 69 6e 74 45 78 70 72 28 70  lite3PrintExpr(p
1f3b0 2d 3e 70 48 61 76 69 6e 67 29 3b 0a 20 20 20 20  ->pHaving);.    
1f3c0 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e  sqlite3DebugPrin
1f3d0 74 66 28 22 5c 6e 22 29 3b 0a 20 20 7d 0a 20 20  tf("\n");.  }.  
1f3e0 69 66 28 20 70 2d 3e 70 4f 72 64 65 72 42 79 20  if( p->pOrderBy 
1f3f0 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 65  ){.    sqlite3De
1f400 62 75 67 50 72 69 6e 74 66 28 22 25 2a 73 20 4f  bugPrintf("%*s O
1f410 52 44 45 52 20 42 59 20 22 2c 20 69 6e 64 65 6e  RDER BY ", inden
1f420 74 2c 20 22 22 29 3b 0a 20 20 20 20 73 71 6c 69  t, "");.    sqli
1f430 74 65 33 50 72 69 6e 74 45 78 70 72 4c 69 73 74  te3PrintExprList
1f440 28 70 2d 3e 70 4f 72 64 65 72 42 79 29 3b 0a 20  (p->pOrderBy);. 
1f450 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50     sqlite3DebugP
1f460 72 69 6e 74 66 28 22 5c 6e 22 29 3b 0a 20 20 7d  rintf("\n");.  }
1f470 0a 7d 0a 2f 2a 20 45 6e 64 20 6f 66 20 74 68 65  .}./* End of the
1f480 20 73 74 72 75 63 74 75 72 65 20 64 65 62 75 67   structure debug
1f490 20 70 72 69 6e 74 69 6e 67 20 63 6f 64 65 0a 2a   printing code.*
1f4a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1f4b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1f4c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1f4d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1f4e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 23 65  ************/.#e
1f4f0 6e 64 69 66 20 2f 2a 20 64 65 66 69 6e 65 64 28  ndif /* defined(
1f500 53 51 4c 49 54 45 5f 54 45 53 54 29 20 7c 7c 20  SQLITE_TEST) || 
1f510 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 44  defined(SQLITE_D
1f520 45 42 55 47 29 20 2a 2f 0a                       EBUG) */.