/ Hex Artifact Content
Login

Artifact 963e2b68f7ca357cdd1a975db90c76153efca646:


0000: 2f 2a 0a 2a 2a 20 32 30 30 31 20 53 65 70 74 65  /*.** 2001 Septe
0010: 6d 62 65 72 20 31 35 0a 2a 2a 0a 2a 2a 20 54 68  mber 15.**.** Th
0020: 65 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69  e author disclai
0030: 6d 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20  ms copyright to 
0040: 74 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65  this source code
0050: 2e 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a  .  In place of.*
0060: 2a 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65  * a legal notice
0070: 2c 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73  , here is a bles
0080: 73 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d  sing:.**.**    M
0090: 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61  ay you do good a
00a0: 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20  nd not evil..** 
00b0: 20 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20     May you find 
00c0: 66 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20  forgiveness for 
00d0: 79 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72  yourself and for
00e0: 67 69 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20  give others..** 
00f0: 20 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65     May you share
0100: 20 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74   freely, never t
0110: 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20  aking more than 
0120: 79 6f 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a  you give..**.***
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66  ******.** This f
0180: 69 6c 65 20 63 6f 6e 74 61 69 6e 73 20 43 20 63  ile contains C c
0190: 6f 64 65 20 72 6f 75 74 69 6e 65 73 20 74 68 61  ode routines tha
01a0: 74 20 61 72 65 20 63 61 6c 6c 65 64 20 62 79 20  t are called by 
01b0: 74 68 65 20 70 61 72 73 65 72 0a 2a 2a 20 74 6f  the parser.** to
01c0: 20 68 61 6e 64 6c 65 20 53 45 4c 45 43 54 20 73   handle SELECT s
01d0: 74 61 74 65 6d 65 6e 74 73 20 69 6e 20 53 51 4c  tatements in SQL
01e0: 69 74 65 2e 0a 2a 2a 0a 2a 2a 20 24 49 64 3a 20  ite..**.** $Id: 
01f0: 73 65 6c 65 63 74 2e 63 2c 76 20 31 2e 33 36 32  select.c,v 1.362
0200: 20 32 30 30 37 2f 31 31 2f 32 31 20 31 35 3a 32   2007/11/21 15:2
0210: 34 3a 30 31 20 64 72 68 20 45 78 70 20 24 0a 2a  4:01 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 70 45 20 3d 20 73 71 6c  ;.  }.  pE = sql
1b90: 69 74 65 33 45 78 70 72 41 6e 64 28 70 50 61 72  ite3ExprAnd(pPar
1ba0: 73 65 2d 3e 64 62 2c 2a 70 70 45 78 70 72 2c 20  se->db,*ppExpr, 
1bb0: 70 45 29 3b 0a 20 20 69 66 28 20 70 45 20 29 7b  pE);.  if( pE ){
1bc0: 0a 20 20 20 20 2a 70 70 45 78 70 72 20 3d 20 70  .    *ppExpr = p
1bd0: 45 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  E;.  }.}../*.** 
1be0: 53 65 74 20 74 68 65 20 45 50 5f 46 72 6f 6d 4a  Set the EP_FromJ
1bf0: 6f 69 6e 20 70 72 6f 70 65 72 74 79 20 6f 6e 20  oin property on 
1c00: 61 6c 6c 20 74 65 72 6d 73 20 6f 66 20 74 68 65  all terms of the
1c10: 20 67 69 76 65 6e 20 65 78 70 72 65 73 73 69 6f   given expressio
1c20: 6e 2e 0a 2a 2a 20 41 6e 64 20 73 65 74 20 74 68  n..** And set th
1c30: 65 20 45 78 70 72 2e 69 52 69 67 68 74 4a 6f 69  e Expr.iRightJoi
1c40: 6e 54 61 62 6c 65 20 74 6f 20 69 54 61 62 6c 65  nTable to iTable
1c50: 20 66 6f 72 20 65 76 65 72 79 20 74 65 72 6d 20   for every term 
1c60: 69 6e 20 74 68 65 0a 2a 2a 20 65 78 70 72 65 73  in the.** expres
1c70: 73 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  sion..**.** The 
1c80: 45 50 5f 46 72 6f 6d 4a 6f 69 6e 20 70 72 6f 70  EP_FromJoin prop
1c90: 65 72 74 79 20 69 73 20 75 73 65 64 20 6f 6e 20  erty is used on 
1ca0: 74 65 72 6d 73 20 6f 66 20 61 6e 20 65 78 70 72  terms of an expr
1cb0: 65 73 73 69 6f 6e 20 74 6f 20 74 65 6c 6c 0a 2a  ession to tell.*
1cc0: 2a 20 74 68 65 20 4c 45 46 54 20 4f 55 54 45 52  * the LEFT OUTER
1cd0: 20 4a 4f 49 4e 20 70 72 6f 63 65 73 73 69 6e 67   JOIN processing
1ce0: 20 6c 6f 67 69 63 20 74 68 61 74 20 74 68 69 73   logic that this
1cf0: 20 74 65 72 6d 20 69 73 20 70 61 72 74 20 6f 66   term is part of
1d00: 20 74 68 65 0a 2a 2a 20 6a 6f 69 6e 20 72 65 73   the.** join res
1d10: 74 72 69 63 74 69 6f 6e 20 73 70 65 63 69 66 69  triction specifi
1d20: 65 64 20 69 6e 20 74 68 65 20 4f 4e 20 6f 72 20  ed in the ON or 
1d30: 55 53 49 4e 47 20 63 6c 61 75 73 65 20 61 6e 64  USING clause and
1d40: 20 6e 6f 74 20 61 20 70 61 72 74 0a 2a 2a 20 6f   not a part.** o
1d50: 66 20 74 68 65 20 6d 6f 72 65 20 67 65 6e 65 72  f the more gener
1d60: 61 6c 20 57 48 45 52 45 20 63 6c 61 75 73 65 2e  al WHERE clause.
1d70: 20 20 54 68 65 73 65 20 74 65 72 6d 73 20 61 72    These terms ar
1d80: 65 20 6d 6f 76 65 64 20 6f 76 65 72 20 74 6f 20  e moved over to 
1d90: 74 68 65 0a 2a 2a 20 57 48 45 52 45 20 63 6c 61  the.** WHERE cla
1da0: 75 73 65 20 64 75 72 69 6e 67 20 6a 6f 69 6e 20  use during join 
1db0: 70 72 6f 63 65 73 73 69 6e 67 20 62 75 74 20 77  processing but w
1dc0: 65 20 6e 65 65 64 20 74 6f 20 72 65 6d 65 6d 62  e need to rememb
1dd0: 65 72 20 74 68 61 74 20 74 68 65 79 0a 2a 2a 20  er that they.** 
1de0: 6f 72 69 67 69 6e 61 74 65 64 20 69 6e 20 74 68  originated in th
1df0: 65 20 4f 4e 20 6f 72 20 55 53 49 4e 47 20 63 6c  e ON or USING cl
1e00: 61 75 73 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  ause..**.** The 
1e10: 45 78 70 72 2e 69 52 69 67 68 74 4a 6f 69 6e 54  Expr.iRightJoinT
1e20: 61 62 6c 65 20 74 65 6c 6c 73 20 74 68 65 20 57  able tells the W
1e30: 48 45 52 45 20 63 6c 61 75 73 65 20 70 72 6f 63  HERE clause proc
1e40: 65 73 73 69 6e 67 20 74 68 61 74 20 74 68 65 0a  essing that the.
1e50: 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 20 64 65  ** expression de
1e60: 70 65 6e 64 73 20 6f 6e 20 74 61 62 6c 65 20 69  pends on table i
1e70: 52 69 67 68 74 4a 6f 69 6e 54 61 62 6c 65 20 65  RightJoinTable e
1e80: 76 65 6e 20 69 66 20 74 68 61 74 20 74 61 62 6c  ven if that tabl
1e90: 65 20 69 73 20 6e 6f 74 0a 2a 2a 20 65 78 70 6c  e is not.** expl
1ea0: 69 63 69 74 6c 79 20 6d 65 6e 74 69 6f 6e 65 64  icitly mentioned
1eb0: 20 69 6e 20 74 68 65 20 65 78 70 72 65 73 73 69   in the expressi
1ec0: 6f 6e 2e 20 20 54 68 61 74 20 69 6e 66 6f 72 6d  on.  That inform
1ed0: 61 74 69 6f 6e 20 69 73 20 6e 65 65 64 65 64 0a  ation is needed.
1ee0: 2a 2a 20 66 6f 72 20 63 61 73 65 73 20 6c 69 6b  ** for cases lik
1ef0: 65 20 74 68 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20  e this:.**.**   
1f00: 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74   SELECT * FROM t
1f10: 31 20 4c 45 46 54 20 4a 4f 49 4e 20 74 32 20 4f  1 LEFT JOIN t2 O
1f20: 4e 20 74 31 2e 61 3d 74 32 2e 62 20 41 4e 44 20  N t1.a=t2.b AND 
1f30: 74 31 2e 78 3d 35 0a 2a 2a 0a 2a 2a 20 54 68 65  t1.x=5.**.** The
1f40: 20 77 68 65 72 65 20 63 6c 61 75 73 65 20 6e 65   where clause ne
1f50: 65 64 73 20 74 6f 20 64 65 66 65 72 20 74 68 65  eds to defer the
1f60: 20 68 61 6e 64 6c 69 6e 67 20 6f 66 20 74 68 65   handling of the
1f70: 20 74 31 2e 78 3d 35 0a 2a 2a 20 74 65 72 6d 20   t1.x=5.** term 
1f80: 75 6e 74 69 6c 20 61 66 74 65 72 20 74 68 65 20  until after the 
1f90: 74 32 20 6c 6f 6f 70 20 6f 66 20 74 68 65 20 6a  t2 loop of the j
1fa0: 6f 69 6e 2e 20 20 49 6e 20 74 68 61 74 20 77 61  oin.  In that wa
1fb0: 79 2c 20 61 0a 2a 2a 20 4e 55 4c 4c 20 74 32 20  y, a.** NULL t2 
1fc0: 72 6f 77 20 77 69 6c 6c 20 62 65 20 69 6e 73 65  row will be inse
1fd0: 72 74 65 64 20 77 68 65 6e 65 76 65 72 20 74 31  rted whenever t1
1fe0: 2e 78 21 3d 35 2e 20 20 49 66 20 77 65 20 64 6f  .x!=5.  If we do
1ff0: 20 6e 6f 74 0a 2a 2a 20 64 65 66 65 72 20 74 68   not.** defer th
2000: 65 20 68 61 6e 64 6c 69 6e 67 20 6f 66 20 74 31  e handling of t1
2010: 2e 78 3d 35 2c 20 69 74 20 77 69 6c 6c 20 62 65  .x=5, it will be
2020: 20 70 72 6f 63 65 73 73 65 64 20 69 6d 6d 65 64   processed immed
2030: 69 61 74 65 6c 79 0a 2a 2a 20 61 66 74 65 72 20  iately.** after 
2040: 74 68 65 20 74 31 20 6c 6f 6f 70 20 61 6e 64 20  the t1 loop and 
2050: 72 6f 77 73 20 77 69 74 68 20 74 31 2e 78 21 3d  rows with t1.x!=
2060: 35 20 77 69 6c 6c 20 6e 65 76 65 72 20 61 70 70  5 will never app
2070: 65 61 72 20 69 6e 0a 2a 2a 20 74 68 65 20 6f 75  ear in.** the ou
2080: 74 70 75 74 2c 20 77 68 69 63 68 20 69 73 20 69  tput, which is i
2090: 6e 63 6f 72 72 65 63 74 2e 0a 2a 2f 0a 73 74 61  ncorrect..*/.sta
20a0: 74 69 63 20 76 6f 69 64 20 73 65 74 4a 6f 69 6e  tic void setJoin
20b0: 45 78 70 72 28 45 78 70 72 20 2a 70 2c 20 69 6e  Expr(Expr *p, in
20c0: 74 20 69 54 61 62 6c 65 29 7b 0a 20 20 77 68 69  t iTable){.  whi
20d0: 6c 65 28 20 70 20 29 7b 0a 20 20 20 20 45 78 70  le( p ){.    Exp
20e0: 72 53 65 74 50 72 6f 70 65 72 74 79 28 70 2c 20  rSetProperty(p, 
20f0: 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29 3b 0a 20 20  EP_FromJoin);.  
2100: 20 20 70 2d 3e 69 52 69 67 68 74 4a 6f 69 6e 54    p->iRightJoinT
2110: 61 62 6c 65 20 3d 20 69 54 61 62 6c 65 3b 0a 20  able = iTable;. 
2120: 20 20 20 73 65 74 4a 6f 69 6e 45 78 70 72 28 70     setJoinExpr(p
2130: 2d 3e 70 4c 65 66 74 2c 20 69 54 61 62 6c 65 29  ->pLeft, iTable)
2140: 3b 0a 20 20 20 20 70 20 3d 20 70 2d 3e 70 52 69  ;.    p = p->pRi
2150: 67 68 74 3b 0a 20 20 7d 20 0a 7d 0a 0a 2f 2a 0a  ght;.  } .}../*.
2160: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
2170: 70 72 6f 63 65 73 73 65 73 20 74 68 65 20 6a 6f  processes the jo
2180: 69 6e 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66  in information f
2190: 6f 72 20 61 20 53 45 4c 45 43 54 20 73 74 61 74  or a SELECT stat
21a0: 65 6d 65 6e 74 2e 0a 2a 2a 20 4f 4e 20 61 6e 64  ement..** ON and
21b0: 20 55 53 49 4e 47 20 63 6c 61 75 73 65 73 20 61   USING clauses a
21c0: 72 65 20 63 6f 6e 76 65 72 74 65 64 20 69 6e 74  re converted int
21d0: 6f 20 65 78 74 72 61 20 74 65 72 6d 73 20 6f 66  o extra terms of
21e0: 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73   the WHERE claus
21f0: 65 2e 0a 2a 2a 20 4e 41 54 55 52 41 4c 20 6a 6f  e..** NATURAL jo
2200: 69 6e 73 20 61 6c 73 6f 20 63 72 65 61 74 65 20  ins also create 
2210: 65 78 74 72 61 20 57 48 45 52 45 20 63 6c 61 75  extra WHERE clau
2220: 73 65 20 74 65 72 6d 73 2e 0a 2a 2a 0a 2a 2a 20  se terms..**.** 
2230: 54 68 65 20 74 65 72 6d 73 20 6f 66 20 61 20 46  The terms of a F
2240: 52 4f 4d 20 63 6c 61 75 73 65 20 61 72 65 20 63  ROM clause are c
2250: 6f 6e 74 61 69 6e 65 64 20 69 6e 20 74 68 65 20  ontained in the 
2260: 53 65 6c 65 63 74 2e 70 53 72 63 20 73 74 72 75  Select.pSrc stru
2270: 63 74 75 72 65 2e 0a 2a 2a 20 54 68 65 20 6c 65  cture..** The le
2280: 66 74 20 6d 6f 73 74 20 74 61 62 6c 65 20 69 73  ft most table is
2290: 20 74 68 65 20 66 69 72 73 74 20 65 6e 74 72 79   the first entry
22a0: 20 69 6e 20 53 65 6c 65 63 74 2e 70 53 72 63 2e   in Select.pSrc.
22b0: 20 20 54 68 65 20 72 69 67 68 74 2d 6d 6f 73 74    The right-most
22c0: 0a 2a 2a 20 74 61 62 6c 65 20 69 73 20 74 68 65  .** table is the
22d0: 20 6c 61 73 74 20 65 6e 74 72 79 2e 20 20 54 68   last entry.  Th
22e0: 65 20 6a 6f 69 6e 20 6f 70 65 72 61 74 6f 72 20  e join operator 
22f0: 69 73 20 68 65 6c 64 20 69 6e 20 74 68 65 20 65  is held in the e
2300: 6e 74 72 79 20 74 6f 0a 2a 2a 20 74 68 65 20 6c  ntry to.** the l
2310: 65 66 74 2e 20 20 54 68 75 73 20 65 6e 74 72 79  eft.  Thus entry
2320: 20 30 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20   0 contains the 
2330: 6a 6f 69 6e 20 6f 70 65 72 61 74 6f 72 20 66 6f  join operator fo
2340: 72 20 74 68 65 20 6a 6f 69 6e 20 62 65 74 77 65  r the join betwe
2350: 65 6e 0a 2a 2a 20 65 6e 74 72 69 65 73 20 30 20  en.** entries 0 
2360: 61 6e 64 20 31 2e 20 20 41 6e 79 20 4f 4e 20 6f  and 1.  Any ON o
2370: 72 20 55 53 49 4e 47 20 63 6c 61 75 73 65 73 20  r USING clauses 
2380: 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
2390: 74 68 65 20 6a 6f 69 6e 20 61 72 65 0a 2a 2a 20  the join are.** 
23a0: 61 6c 73 6f 20 61 74 74 61 63 68 65 64 20 74 6f  also attached to
23b0: 20 74 68 65 20 6c 65 66 74 20 65 6e 74 72 79 2e   the left entry.
23c0: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
23d0: 69 6e 65 20 72 65 74 75 72 6e 73 20 74 68 65 20  ine returns the 
23e0: 6e 75 6d 62 65 72 20 6f 66 20 65 72 72 6f 72 73  number of errors
23f0: 20 65 6e 63 6f 75 6e 74 65 72 65 64 2e 0a 2a 2f   encountered..*/
2400: 0a 73 74 61 74 69 63 20 69 6e 74 20 73 71 6c 69  .static int sqli
2410: 74 65 50 72 6f 63 65 73 73 4a 6f 69 6e 28 50 61  teProcessJoin(Pa
2420: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 53 65 6c  rse *pParse, Sel
2430: 65 63 74 20 2a 70 29 7b 0a 20 20 53 72 63 4c 69  ect *p){.  SrcLi
2440: 73 74 20 2a 70 53 72 63 3b 20 20 20 20 20 20 20  st *pSrc;       
2450: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6c             /* Al
2460: 6c 20 74 61 62 6c 65 73 20 69 6e 20 74 68 65 20  l tables in the 
2470: 46 52 4f 4d 20 63 6c 61 75 73 65 20 2a 2f 0a 20  FROM clause */. 
2480: 20 69 6e 74 20 69 2c 20 6a 3b 20 20 20 20 20 20   int i, j;      
2490: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24a0: 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72   /* Loop counter
24b0: 73 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 53 72  s */.  struct Sr
24c0: 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 4c 65 66  cList_item *pLef
24d0: 74 3b 20 20 20 20 20 2f 2a 20 4c 65 66 74 20 74  t;     /* Left t
24e0: 61 62 6c 65 20 62 65 69 6e 67 20 6a 6f 69 6e 65  able being joine
24f0: 64 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 53 72  d */.  struct Sr
2500: 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 52 69 67  cList_item *pRig
2510: 68 74 3b 20 20 20 20 2f 2a 20 52 69 67 68 74 20  ht;    /* Right 
2520: 74 61 62 6c 65 20 62 65 69 6e 67 20 6a 6f 69 6e  table being join
2530: 65 64 20 2a 2f 0a 0a 20 20 70 53 72 63 20 3d 20  ed */..  pSrc = 
2540: 70 2d 3e 70 53 72 63 3b 0a 20 20 70 4c 65 66 74  p->pSrc;.  pLeft
2550: 20 3d 20 26 70 53 72 63 2d 3e 61 5b 30 5d 3b 0a   = &pSrc->a[0];.
2560: 20 20 70 52 69 67 68 74 20 3d 20 26 70 4c 65 66    pRight = &pLef
2570: 74 5b 31 5d 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  t[1];.  for(i=0;
2580: 20 69 3c 70 53 72 63 2d 3e 6e 53 72 63 2d 31 3b   i<pSrc->nSrc-1;
2590: 20 69 2b 2b 2c 20 70 52 69 67 68 74 2b 2b 2c 20   i++, pRight++, 
25a0: 70 4c 65 66 74 2b 2b 29 7b 0a 20 20 20 20 54 61  pLeft++){.    Ta
25b0: 62 6c 65 20 2a 70 4c 65 66 74 54 61 62 20 3d 20  ble *pLeftTab = 
25c0: 70 4c 65 66 74 2d 3e 70 54 61 62 3b 0a 20 20 20  pLeft->pTab;.   
25d0: 20 54 61 62 6c 65 20 2a 70 52 69 67 68 74 54 61   Table *pRightTa
25e0: 62 20 3d 20 70 52 69 67 68 74 2d 3e 70 54 61 62  b = pRight->pTab
25f0: 3b 0a 0a 20 20 20 20 69 66 28 20 70 4c 65 66 74  ;..    if( pLeft
2600: 54 61 62 3d 3d 30 20 7c 7c 20 70 52 69 67 68 74  Tab==0 || pRight
2610: 54 61 62 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75  Tab==0 ) continu
2620: 65 3b 0a 0a 20 20 20 20 2f 2a 20 57 68 65 6e 20  e;..    /* When 
2630: 74 68 65 20 4e 41 54 55 52 41 4c 20 6b 65 79 77  the NATURAL keyw
2640: 6f 72 64 20 69 73 20 70 72 65 73 65 6e 74 2c 20  ord is present, 
2650: 61 64 64 20 57 48 45 52 45 20 63 6c 61 75 73 65  add WHERE clause
2660: 20 74 65 72 6d 73 20 66 6f 72 0a 20 20 20 20 2a   terms for.    *
2670: 2a 20 65 76 65 72 79 20 63 6f 6c 75 6d 6e 20 74  * every column t
2680: 68 61 74 20 74 68 65 20 74 77 6f 20 74 61 62 6c  hat the two tabl
2690: 65 73 20 68 61 76 65 20 69 6e 20 63 6f 6d 6d 6f  es have in commo
26a0: 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  n..    */.    if
26b0: 28 20 70 52 69 67 68 74 2d 3e 6a 6f 69 6e 74 79  ( pRight->jointy
26c0: 70 65 20 26 20 4a 54 5f 4e 41 54 55 52 41 4c 20  pe & JT_NATURAL 
26d0: 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 52 69  ){.      if( pRi
26e0: 67 68 74 2d 3e 70 4f 6e 20 7c 7c 20 70 52 69 67  ght->pOn || pRig
26f0: 68 74 2d 3e 70 55 73 69 6e 67 20 29 7b 0a 20 20  ht->pUsing ){.  
2700: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72        sqlite3Err
2710: 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 61  orMsg(pParse, "a
2720: 20 4e 41 54 55 52 41 4c 20 6a 6f 69 6e 20 6d 61   NATURAL join ma
2730: 79 20 6e 6f 74 20 68 61 76 65 20 22 0a 20 20 20  y not have ".   
2740: 20 20 20 20 20 20 20 20 22 61 6e 20 4f 4e 20 6f          "an ON o
2750: 72 20 55 53 49 4e 47 20 63 6c 61 75 73 65 22 2c  r USING clause",
2760: 20 30 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74   0);.        ret
2770: 75 72 6e 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20  urn 1;.      }. 
2780: 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c       for(j=0; j<
2790: 70 4c 65 66 74 54 61 62 2d 3e 6e 43 6f 6c 3b 20  pLeftTab->nCol; 
27a0: 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 63 68  j++){.        ch
27b0: 61 72 20 2a 7a 4e 61 6d 65 20 3d 20 70 4c 65 66  ar *zName = pLef
27c0: 74 54 61 62 2d 3e 61 43 6f 6c 5b 6a 5d 2e 7a 4e  tTab->aCol[j].zN
27d0: 61 6d 65 3b 0a 20 20 20 20 20 20 20 20 69 66 28  ame;.        if(
27e0: 20 63 6f 6c 75 6d 6e 49 6e 64 65 78 28 70 52 69   columnIndex(pRi
27f0: 67 68 74 54 61 62 2c 20 7a 4e 61 6d 65 29 3e 3d  ghtTab, zName)>=
2800: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 61  0 ){.          a
2810: 64 64 57 68 65 72 65 54 65 72 6d 28 70 50 61 72  ddWhereTerm(pPar
2820: 73 65 2c 20 7a 4e 61 6d 65 2c 20 70 4c 65 66 74  se, zName, pLeft
2830: 54 61 62 2c 20 70 4c 65 66 74 2d 3e 7a 41 6c 69  Tab, pLeft->zAli
2840: 61 73 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20  as, .           
2850: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2860: 20 20 20 70 52 69 67 68 74 54 61 62 2c 20 70 52     pRightTab, pR
2870: 69 67 68 74 2d 3e 7a 41 6c 69 61 73 2c 0a 20 20  ight->zAlias,.  
2880: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2890: 20 20 20 20 20 20 20 20 20 20 20 20 70 52 69 67              pRig
28a0: 68 74 2d 3e 69 43 75 72 73 6f 72 2c 20 26 70 2d  ht->iCursor, &p-
28b0: 3e 70 57 68 65 72 65 29 3b 0a 20 20 20 20 20 20  >pWhere);.      
28c0: 20 20 20 20 0a 20 20 20 20 20 20 20 20 7d 0a 20      .        }. 
28d0: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20       }.    }..  
28e0: 20 20 2f 2a 20 44 69 73 61 6c 6c 6f 77 20 62 6f    /* Disallow bo
28f0: 74 68 20 4f 4e 20 61 6e 64 20 55 53 49 4e 47 20  th ON and USING 
2900: 63 6c 61 75 73 65 73 20 69 6e 20 74 68 65 20 73  clauses in the s
2910: 61 6d 65 20 6a 6f 69 6e 0a 20 20 20 20 2a 2f 0a  ame join.    */.
2920: 20 20 20 20 69 66 28 20 70 52 69 67 68 74 2d 3e      if( pRight->
2930: 70 4f 6e 20 26 26 20 70 52 69 67 68 74 2d 3e 70  pOn && pRight->p
2940: 55 73 69 6e 67 20 29 7b 0a 20 20 20 20 20 20 73  Using ){.      s
2950: 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
2960: 50 61 72 73 65 2c 20 22 63 61 6e 6e 6f 74 20 68  Parse, "cannot h
2970: 61 76 65 20 62 6f 74 68 20 4f 4e 20 61 6e 64 20  ave both ON and 
2980: 55 53 49 4e 47 20 22 0a 20 20 20 20 20 20 20 20  USING ".        
2990: 22 63 6c 61 75 73 65 73 20 69 6e 20 74 68 65 20  "clauses in the 
29a0: 73 61 6d 65 20 6a 6f 69 6e 22 29 3b 0a 20 20 20  same join");.   
29b0: 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20     return 1;.   
29c0: 20 7d 0a 0a 20 20 20 20 2f 2a 20 41 64 64 20 74   }..    /* Add t
29d0: 68 65 20 4f 4e 20 63 6c 61 75 73 65 20 74 6f 20  he ON clause to 
29e0: 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 57  the end of the W
29f0: 48 45 52 45 20 63 6c 61 75 73 65 2c 20 63 6f 6e  HERE clause, con
2a00: 6e 65 63 74 65 64 20 62 79 0a 20 20 20 20 2a 2a  nected by.    **
2a10: 20 61 6e 20 41 4e 44 20 6f 70 65 72 61 74 6f 72   an AND operator
2a20: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
2a30: 20 70 52 69 67 68 74 2d 3e 70 4f 6e 20 29 7b 0a   pRight->pOn ){.
2a40: 20 20 20 20 20 20 73 65 74 4a 6f 69 6e 45 78 70        setJoinExp
2a50: 72 28 70 52 69 67 68 74 2d 3e 70 4f 6e 2c 20 70  r(pRight->pOn, p
2a60: 52 69 67 68 74 2d 3e 69 43 75 72 73 6f 72 29 3b  Right->iCursor);
2a70: 0a 20 20 20 20 20 20 70 2d 3e 70 57 68 65 72 65  .      p->pWhere
2a80: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 41 6e   = sqlite3ExprAn
2a90: 64 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 2d  d(pParse->db, p-
2aa0: 3e 70 57 68 65 72 65 2c 20 70 52 69 67 68 74 2d  >pWhere, pRight-
2ab0: 3e 70 4f 6e 29 3b 0a 20 20 20 20 20 20 70 52 69  >pOn);.      pRi
2ac0: 67 68 74 2d 3e 70 4f 6e 20 3d 20 30 3b 0a 20 20  ght->pOn = 0;.  
2ad0: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 72 65 61    }..    /* Crea
2ae0: 74 65 20 65 78 74 72 61 20 74 65 72 6d 73 20 6f  te extra terms o
2af0: 6e 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75  n the WHERE clau
2b00: 73 65 20 66 6f 72 20 65 61 63 68 20 63 6f 6c 75  se for each colu
2b10: 6d 6e 20 6e 61 6d 65 64 0a 20 20 20 20 2a 2a 20  mn named.    ** 
2b20: 69 6e 20 74 68 65 20 55 53 49 4e 47 20 63 6c 61  in the USING cla
2b30: 75 73 65 2e 20 20 45 78 61 6d 70 6c 65 3a 20 49  use.  Example: I
2b40: 66 20 74 68 65 20 74 77 6f 20 74 61 62 6c 65 73  f the two tables
2b50: 20 74 6f 20 62 65 20 6a 6f 69 6e 65 64 20 61 72   to be joined ar
2b60: 65 20 0a 20 20 20 20 2a 2a 20 41 20 61 6e 64 20  e .    ** A and 
2b70: 42 20 61 6e 64 20 74 68 65 20 55 53 49 4e 47 20  B and the USING 
2b80: 63 6c 61 75 73 65 20 6e 61 6d 65 73 20 58 2c 20  clause names X, 
2b90: 59 2c 20 61 6e 64 20 5a 2c 20 74 68 65 6e 20 61  Y, and Z, then a
2ba0: 64 64 20 74 68 69 73 0a 20 20 20 20 2a 2a 20 74  dd this.    ** t
2bb0: 6f 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75  o the WHERE clau
2bc0: 73 65 3a 20 20 20 20 41 2e 58 3d 42 2e 58 20 41  se:    A.X=B.X A
2bd0: 4e 44 20 41 2e 59 3d 42 2e 59 20 41 4e 44 20 41  ND A.Y=B.Y AND A
2be0: 2e 5a 3d 42 2e 5a 0a 20 20 20 20 2a 2a 20 52 65  .Z=B.Z.    ** Re
2bf0: 70 6f 72 74 20 61 6e 20 65 72 72 6f 72 20 69 66  port an error if
2c00: 20 61 6e 79 20 63 6f 6c 75 6d 6e 20 6d 65 6e 74   any column ment
2c10: 69 6f 6e 65 64 20 69 6e 20 74 68 65 20 55 53 49  ioned in the USI
2c20: 4e 47 20 63 6c 61 75 73 65 20 69 73 0a 20 20 20  NG clause is.   
2c30: 20 2a 2a 20 6e 6f 74 20 63 6f 6e 74 61 69 6e 65   ** not containe
2c40: 64 20 69 6e 20 62 6f 74 68 20 74 61 62 6c 65 73  d in both tables
2c50: 20 74 6f 20 62 65 20 6a 6f 69 6e 65 64 2e 0a 20   to be joined.. 
2c60: 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 52     */.    if( pR
2c70: 69 67 68 74 2d 3e 70 55 73 69 6e 67 20 29 7b 0a  ight->pUsing ){.
2c80: 20 20 20 20 20 20 49 64 4c 69 73 74 20 2a 70 4c        IdList *pL
2c90: 69 73 74 20 3d 20 70 52 69 67 68 74 2d 3e 70 55  ist = pRight->pU
2ca0: 73 69 6e 67 3b 0a 20 20 20 20 20 20 66 6f 72 28  sing;.      for(
2cb0: 6a 3d 30 3b 20 6a 3c 70 4c 69 73 74 2d 3e 6e 49  j=0; j<pList->nI
2cc0: 64 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20  d; j++){.       
2cd0: 20 63 68 61 72 20 2a 7a 4e 61 6d 65 20 3d 20 70   char *zName = p
2ce0: 4c 69 73 74 2d 3e 61 5b 6a 5d 2e 7a 4e 61 6d 65  List->a[j].zName
2cf0: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 63 6f  ;.        if( co
2d00: 6c 75 6d 6e 49 6e 64 65 78 28 70 4c 65 66 74 54  lumnIndex(pLeftT
2d10: 61 62 2c 20 7a 4e 61 6d 65 29 3c 30 20 7c 7c 20  ab, zName)<0 || 
2d20: 63 6f 6c 75 6d 6e 49 6e 64 65 78 28 70 52 69 67  columnIndex(pRig
2d30: 68 74 54 61 62 2c 20 7a 4e 61 6d 65 29 3c 30 20  htTab, zName)<0 
2d40: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  ){.          sql
2d50: 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
2d60: 72 73 65 2c 20 22 63 61 6e 6e 6f 74 20 6a 6f 69  rse, "cannot joi
2d70: 6e 20 75 73 69 6e 67 20 63 6f 6c 75 6d 6e 20 25  n using column %
2d80: 73 20 2d 20 63 6f 6c 75 6d 6e 20 22 0a 20 20 20  s - column ".   
2d90: 20 20 20 20 20 20 20 20 20 22 6e 6f 74 20 70 72           "not pr
2da0: 65 73 65 6e 74 20 69 6e 20 62 6f 74 68 20 74 61  esent in both ta
2db0: 62 6c 65 73 22 2c 20 7a 4e 61 6d 65 29 3b 0a 20  bles", zName);. 
2dc0: 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20           return 
2dd0: 31 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  1;.        }.   
2de0: 20 20 20 20 20 61 64 64 57 68 65 72 65 54 65 72       addWhereTer
2df0: 6d 28 70 50 61 72 73 65 2c 20 7a 4e 61 6d 65 2c  m(pParse, zName,
2e00: 20 70 4c 65 66 74 54 61 62 2c 20 70 4c 65 66 74   pLeftTab, pLeft
2e10: 2d 3e 7a 41 6c 69 61 73 2c 20 0a 20 20 20 20 20  ->zAlias, .     
2e20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e30: 20 20 20 20 20 20 20 70 52 69 67 68 74 54 61 62         pRightTab
2e40: 2c 20 70 52 69 67 68 74 2d 3e 7a 41 6c 69 61 73  , pRight->zAlias
2e50: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
2e60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 52                pR
2e70: 69 67 68 74 2d 3e 69 43 75 72 73 6f 72 2c 20 26  ight->iCursor, &
2e80: 70 2d 3e 70 57 68 65 72 65 29 3b 0a 20 20 20 20  p->pWhere);.    
2e90: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20    }.    }.  }.  
2ea0: 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a  return 0;.}../*.
2eb0: 2a 2a 20 49 6e 73 65 72 74 20 63 6f 64 65 20 69  ** Insert code i
2ec0: 6e 74 6f 20 22 76 22 20 74 68 61 74 20 77 69 6c  nto "v" that wil
2ed0: 6c 20 70 75 73 68 20 74 68 65 20 72 65 63 6f 72  l push the recor
2ee0: 64 20 6f 6e 20 74 68 65 20 74 6f 70 20 6f 66 20  d on the top of 
2ef0: 74 68 65 0a 2a 2a 20 73 74 61 63 6b 20 69 6e 74  the.** stack int
2f00: 6f 20 74 68 65 20 73 6f 72 74 65 72 2e 0a 2a 2f  o the sorter..*/
2f10: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70 75 73  .static void pus
2f20: 68 4f 6e 74 6f 53 6f 72 74 65 72 28 0a 20 20 50  hOntoSorter(.  P
2f30: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
2f40: 20 20 20 20 20 20 2f 2a 20 50 61 72 73 65 72 20        /* Parser 
2f50: 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78 70  context */.  Exp
2f60: 72 4c 69 73 74 20 2a 70 4f 72 64 65 72 42 79 2c  rList *pOrderBy,
2f70: 20 20 20 20 2f 2a 20 54 68 65 20 4f 52 44 45 52      /* The ORDER
2f80: 20 42 59 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20   BY clause */.  
2f90: 53 65 6c 65 63 74 20 2a 70 53 65 6c 65 63 74 20  Select *pSelect 
2fa0: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 77 68         /* The wh
2fb0: 6f 6c 65 20 53 45 4c 45 43 54 20 73 74 61 74 65  ole SELECT state
2fc0: 6d 65 6e 74 20 2a 2f 0a 29 7b 0a 20 20 56 64 62  ment */.){.  Vdb
2fd0: 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70  e *v = pParse->p
2fe0: 56 64 62 65 3b 0a 20 20 73 71 6c 69 74 65 33 45  Vdbe;.  sqlite3E
2ff0: 78 70 72 43 6f 64 65 45 78 70 72 4c 69 73 74 28  xprCodeExprList(
3000: 70 50 61 72 73 65 2c 20 70 4f 72 64 65 72 42 79  pParse, pOrderBy
3010: 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  );.  sqlite3Vdbe
3020: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 53 65 71 75  AddOp(v, OP_Sequ
3030: 65 6e 63 65 2c 20 70 4f 72 64 65 72 42 79 2d 3e  ence, pOrderBy->
3040: 69 45 43 75 72 73 6f 72 2c 20 30 29 3b 0a 20 20  iECursor, 0);.  
3050: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
3060: 28 76 2c 20 4f 50 5f 50 75 6c 6c 2c 20 70 4f 72  (v, OP_Pull, pOr
3070: 64 65 72 42 79 2d 3e 6e 45 78 70 72 20 2b 20 31  derBy->nExpr + 1
3080: 2c 20 30 29 3b 0a 20 20 73 71 6c 69 74 65 33 56  , 0);.  sqlite3V
3090: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d  dbeAddOp(v, OP_M
30a0: 61 6b 65 52 65 63 6f 72 64 2c 20 70 4f 72 64 65  akeRecord, pOrde
30b0: 72 42 79 2d 3e 6e 45 78 70 72 20 2b 20 32 2c 20  rBy->nExpr + 2, 
30c0: 30 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  0);.  sqlite3Vdb
30d0: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49 64 78  eAddOp(v, OP_Idx
30e0: 49 6e 73 65 72 74 2c 20 70 4f 72 64 65 72 42 79  Insert, pOrderBy
30f0: 2d 3e 69 45 43 75 72 73 6f 72 2c 20 30 29 3b 0a  ->iECursor, 0);.
3100: 20 20 69 66 28 20 70 53 65 6c 65 63 74 2d 3e 69    if( pSelect->i
3110: 4c 69 6d 69 74 3e 3d 30 20 29 7b 0a 20 20 20 20  Limit>=0 ){.    
3120: 69 6e 74 20 61 64 64 72 31 2c 20 61 64 64 72 32  int addr1, addr2
3130: 3b 0a 20 20 20 20 61 64 64 72 31 20 3d 20 73 71  ;.    addr1 = sq
3140: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
3150: 2c 20 4f 50 5f 49 66 4d 65 6d 5a 65 72 6f 2c 20  , OP_IfMemZero, 
3160: 70 53 65 6c 65 63 74 2d 3e 69 4c 69 6d 69 74 2b  pSelect->iLimit+
3170: 31 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74  1, 0);.    sqlit
3180: 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
3190: 50 5f 4d 65 6d 49 6e 63 72 2c 20 2d 31 2c 20 70  P_MemIncr, -1, p
31a0: 53 65 6c 65 63 74 2d 3e 69 4c 69 6d 69 74 2b 31  Select->iLimit+1
31b0: 29 3b 0a 20 20 20 20 61 64 64 72 32 20 3d 20 73  );.    addr2 = s
31c0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
31d0: 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 30  v, OP_Goto, 0, 0
31e0: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
31f0: 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64  beJumpHere(v, ad
3200: 64 72 31 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  dr1);.    sqlite
3210: 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
3220: 5f 4c 61 73 74 2c 20 70 4f 72 64 65 72 42 79 2d  _Last, pOrderBy-
3230: 3e 69 45 43 75 72 73 6f 72 2c 20 30 29 3b 0a 20  >iECursor, 0);. 
3240: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
3250: 64 4f 70 28 76 2c 20 4f 50 5f 44 65 6c 65 74 65  dOp(v, OP_Delete
3260: 2c 20 70 4f 72 64 65 72 42 79 2d 3e 69 45 43 75  , pOrderBy->iECu
3270: 72 73 6f 72 2c 20 30 29 3b 0a 20 20 20 20 73 71  rsor, 0);.    sq
3280: 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72  lite3VdbeJumpHer
3290: 65 28 76 2c 20 61 64 64 72 32 29 3b 0a 20 20 20  e(v, addr2);.   
32a0: 20 70 53 65 6c 65 63 74 2d 3e 69 4c 69 6d 69 74   pSelect->iLimit
32b0: 20 3d 20 2d 31 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a   = -1;.  }.}../*
32c0: 0a 2a 2a 20 41 64 64 20 63 6f 64 65 20 74 6f 20  .** Add code to 
32d0: 69 6d 70 6c 65 6d 65 6e 74 20 74 68 65 20 4f 46  implement the OF
32e0: 46 53 45 54 0a 2a 2f 0a 73 74 61 74 69 63 20 76  FSET.*/.static v
32f0: 6f 69 64 20 63 6f 64 65 4f 66 66 73 65 74 28 0a  oid codeOffset(.
3300: 20 20 56 64 62 65 20 2a 76 2c 20 20 20 20 20 20    Vdbe *v,      
3310: 20 20 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20      /* Generate 
3320: 63 6f 64 65 20 69 6e 74 6f 20 74 68 69 73 20 56  code into this V
3330: 4d 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70  M */.  Select *p
3340: 2c 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20  ,        /* The 
3350: 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
3360: 20 62 65 69 6e 67 20 63 6f 64 65 64 20 2a 2f 0a   being coded */.
3370: 20 20 69 6e 74 20 69 43 6f 6e 74 69 6e 75 65 2c    int iContinue,
3380: 20 20 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65      /* Jump here
3390: 20 74 6f 20 73 6b 69 70 20 74 68 65 20 63 75 72   to skip the cur
33a0: 72 65 6e 74 20 72 65 63 6f 72 64 20 2a 2f 0a 20  rent record */. 
33b0: 20 69 6e 74 20 6e 50 6f 70 20 20 20 20 20 20 20   int nPop       
33c0: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
33d0: 74 69 6d 65 73 20 74 6f 20 70 6f 70 20 73 74 61  times to pop sta
33e0: 63 6b 20 77 68 65 6e 20 6a 75 6d 70 69 6e 67 20  ck when jumping 
33f0: 2a 2f 0a 29 7b 0a 20 20 69 66 28 20 70 2d 3e 69  */.){.  if( p->i
3400: 4f 66 66 73 65 74 3e 3d 30 20 26 26 20 69 43 6f  Offset>=0 && iCo
3410: 6e 74 69 6e 75 65 21 3d 30 20 29 7b 0a 20 20 20  ntinue!=0 ){.   
3420: 20 69 6e 74 20 61 64 64 72 3b 0a 20 20 20 20 73   int addr;.    s
3430: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
3440: 76 2c 20 4f 50 5f 4d 65 6d 49 6e 63 72 2c 20 2d  v, OP_MemIncr, -
3450: 31 2c 20 70 2d 3e 69 4f 66 66 73 65 74 29 3b 0a  1, p->iOffset);.
3460: 20 20 20 20 61 64 64 72 20 3d 20 73 71 6c 69 74      addr = sqlit
3470: 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
3480: 50 5f 49 66 4d 65 6d 4e 65 67 2c 20 70 2d 3e 69  P_IfMemNeg, p->i
3490: 4f 66 66 73 65 74 2c 20 30 29 3b 0a 20 20 20 20  Offset, 0);.    
34a0: 69 66 28 20 6e 50 6f 70 3e 30 20 29 7b 0a 20 20  if( nPop>0 ){.  
34b0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
34c0: 64 64 4f 70 28 76 2c 20 4f 50 5f 50 6f 70 2c 20  ddOp(v, OP_Pop, 
34d0: 6e 50 6f 70 2c 20 30 29 3b 0a 20 20 20 20 7d 0a  nPop, 0);.    }.
34e0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
34f0: 64 64 4f 70 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c  ddOp(v, OP_Goto,
3500: 20 30 2c 20 69 43 6f 6e 74 69 6e 75 65 29 3b 0a   0, iContinue);.
3510: 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28      VdbeComment(
3520: 28 76 2c 20 22 23 20 73 6b 69 70 20 4f 46 46 53  (v, "# skip OFFS
3530: 45 54 20 72 65 63 6f 72 64 73 22 29 29 3b 0a 20  ET records"));. 
3540: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75     sqlite3VdbeJu
3550: 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72 29 3b  mpHere(v, addr);
3560: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64  .  }.}../*.** Ad
3570: 64 20 63 6f 64 65 20 74 68 61 74 20 77 69 6c 6c  d code that will
3580: 20 63 68 65 63 6b 20 74 6f 20 6d 61 6b 65 20 73   check to make s
3590: 75 72 65 20 74 68 65 20 74 6f 70 20 4e 20 65 6c  ure the top N el
35a0: 65 6d 65 6e 74 73 20 6f 66 20 74 68 65 0a 2a 2a  ements of the.**
35b0: 20 73 74 61 63 6b 20 61 72 65 20 64 69 73 74 69   stack are disti
35c0: 6e 63 74 2e 20 20 69 54 61 62 20 69 73 20 61 20  nct.  iTab is a 
35d0: 73 6f 72 74 69 6e 67 20 69 6e 64 65 78 20 74 68  sorting index th
35e0: 61 74 20 68 6f 6c 64 73 20 70 72 65 76 69 6f 75  at holds previou
35f0: 73 6c 79 0a 2a 2a 20 73 65 65 6e 20 63 6f 6d 62  sly.** seen comb
3600: 69 6e 61 74 69 6f 6e 73 20 6f 66 20 74 68 65 20  inations of the 
3610: 4e 20 76 61 6c 75 65 73 2e 20 20 41 20 6e 65 77  N values.  A new
3620: 20 65 6e 74 72 79 20 69 73 20 6d 61 64 65 20 69   entry is made i
3630: 6e 20 69 54 61 62 0a 2a 2a 20 69 66 20 74 68 65  n iTab.** if the
3640: 20 63 75 72 72 65 6e 74 20 4e 20 76 61 6c 75 65   current N value
3650: 73 20 61 72 65 20 6e 65 77 2e 0a 2a 2a 0a 2a 2a  s are new..**.**
3660: 20 41 20 6a 75 6d 70 20 74 6f 20 61 64 64 72 52   A jump to addrR
3670: 65 70 65 61 74 20 69 73 20 6d 61 64 65 20 61 6e  epeat is made an
3680: 64 20 74 68 65 20 4e 2b 31 20 76 61 6c 75 65 73  d the N+1 values
3690: 20 61 72 65 20 70 6f 70 70 65 64 20 66 72 6f 6d   are popped from
36a0: 20 74 68 65 0a 2a 2a 20 73 74 61 63 6b 20 69 66   the.** stack if
36b0: 20 74 68 65 20 74 6f 70 20 4e 20 65 6c 65 6d 65   the top N eleme
36c0: 6e 74 73 20 61 72 65 20 6e 6f 74 20 64 69 73 74  nts are not dist
36d0: 69 6e 63 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  inct..*/.static 
36e0: 76 6f 69 64 20 63 6f 64 65 44 69 73 74 69 6e 63  void codeDistinc
36f0: 74 28 0a 20 20 56 64 62 65 20 2a 76 2c 20 20 20  t(.  Vdbe *v,   
3700: 20 20 20 20 20 20 20 20 2f 2a 20 47 65 6e 65 72          /* Gener
3710: 61 74 65 20 63 6f 64 65 20 69 6e 74 6f 20 74 68  ate code into th
3720: 69 73 20 56 4d 20 2a 2f 0a 20 20 69 6e 74 20 69  is VM */.  int i
3730: 54 61 62 2c 20 20 20 20 20 20 20 20 20 20 2f 2a  Tab,          /*
3740: 20 41 20 73 6f 72 74 69 6e 67 20 69 6e 64 65 78   A sorting index
3750: 20 75 73 65 64 20 74 6f 20 74 65 73 74 20 66 6f   used to test fo
3760: 72 20 64 69 73 74 69 6e 63 74 6e 65 73 73 20 2a  r distinctness *
3770: 2f 0a 20 20 69 6e 74 20 61 64 64 72 52 65 70 65  /.  int addrRepe
3780: 61 74 2c 20 20 20 20 2f 2a 20 4a 75 6d 70 20 74  at,    /* Jump t
3790: 6f 20 68 65 72 65 20 69 66 20 6e 6f 74 20 64 69  o here if not di
37a0: 73 74 69 6e 63 74 20 2a 2f 0a 20 20 69 6e 74 20  stinct */.  int 
37b0: 4e 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  N              /
37c0: 2a 20 54 68 65 20 74 6f 70 20 4e 20 65 6c 65 6d  * The top N elem
37d0: 65 6e 74 73 20 6f 66 20 74 68 65 20 73 74 61 63  ents of the stac
37e0: 6b 20 6d 75 73 74 20 62 65 20 64 69 73 74 69 6e  k must be distin
37f0: 63 74 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74  ct */.){.  sqlit
3800: 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
3810: 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20 2d 4e  P_MakeRecord, -N
3820: 2c 20 30 29 3b 0a 20 20 73 71 6c 69 74 65 33 56  , 0);.  sqlite3V
3830: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 44  dbeAddOp(v, OP_D
3840: 69 73 74 69 6e 63 74 2c 20 69 54 61 62 2c 20 73  istinct, iTab, s
3850: 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e  qlite3VdbeCurren
3860: 74 41 64 64 72 28 76 29 2b 33 29 3b 0a 20 20 73  tAddr(v)+3);.  s
3870: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
3880: 76 2c 20 4f 50 5f 50 6f 70 2c 20 4e 2b 31 2c 20  v, OP_Pop, N+1, 
3890: 30 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  0);.  sqlite3Vdb
38a0: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 47 6f 74  eAddOp(v, OP_Got
38b0: 6f 2c 20 30 2c 20 61 64 64 72 52 65 70 65 61 74  o, 0, addrRepeat
38c0: 29 3b 0a 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74  );.  VdbeComment
38d0: 28 28 76 2c 20 22 23 20 73 6b 69 70 20 69 6e 64  ((v, "# skip ind
38e0: 69 73 74 69 6e 63 74 20 72 65 63 6f 72 64 73 22  istinct records"
38f0: 29 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  ));.  sqlite3Vdb
3900: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49 64 78  eAddOp(v, OP_Idx
3910: 49 6e 73 65 72 74 2c 20 69 54 61 62 2c 20 30 29  Insert, iTab, 0)
3920: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72  ;.}../*.** Gener
3930: 61 74 65 20 61 6e 20 65 72 72 6f 72 20 6d 65 73  ate an error mes
3940: 73 61 67 65 20 77 68 65 6e 20 61 20 53 45 4c 45  sage when a SELE
3950: 43 54 20 69 73 20 75 73 65 64 20 77 69 74 68 69  CT is used withi
3960: 6e 20 61 20 73 75 62 65 78 70 72 65 73 73 69 6f  n a subexpressio
3970: 6e 0a 2a 2a 20 28 65 78 61 6d 70 6c 65 3a 20 20  n.** (example:  
3980: 22 61 20 49 4e 20 28 53 45 4c 45 43 54 20 2a 20  "a IN (SELECT * 
3990: 46 52 4f 4d 20 74 61 62 6c 65 29 22 29 20 62 75  FROM table)") bu
39a0: 74 20 69 74 20 68 61 73 20 6d 6f 72 65 20 74 68  t it has more th
39b0: 61 6e 20 31 20 72 65 73 75 6c 74 0a 2a 2a 20 63  an 1 result.** c
39c0: 6f 6c 75 6d 6e 2e 20 20 57 65 20 64 6f 20 74 68  olumn.  We do th
39d0: 69 73 20 69 6e 20 61 20 73 75 62 72 6f 75 74 69  is in a subrouti
39e0: 6e 65 20 62 65 63 61 75 73 65 20 74 68 65 20 65  ne because the e
39f0: 72 72 6f 72 20 6f 63 63 75 72 73 20 69 6e 20 6d  rror occurs in m
3a00: 75 6c 74 69 70 6c 65 0a 2a 2a 20 70 6c 61 63 65  ultiple.** place
3a10: 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  s..*/.static int
3a20: 20 63 68 65 63 6b 46 6f 72 4d 75 6c 74 69 43 6f   checkForMultiCo
3a30: 6c 75 6d 6e 53 65 6c 65 63 74 45 72 72 6f 72 28  lumnSelectError(
3a40: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69  Parse *pParse, i
3a50: 6e 74 20 65 44 65 73 74 2c 20 69 6e 74 20 6e 45  nt eDest, int nE
3a60: 78 70 72 29 7b 0a 20 20 69 66 28 20 6e 45 78 70  xpr){.  if( nExp
3a70: 72 3e 31 20 26 26 20 28 65 44 65 73 74 3d 3d 53  r>1 && (eDest==S
3a80: 52 54 5f 4d 65 6d 20 7c 7c 20 65 44 65 73 74 3d  RT_Mem || eDest=
3a90: 3d 53 52 54 5f 53 65 74 29 20 29 7b 0a 20 20 20  =SRT_Set) ){.   
3aa0: 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
3ab0: 28 70 50 61 72 73 65 2c 20 22 6f 6e 6c 79 20 61  (pParse, "only a
3ac0: 20 73 69 6e 67 6c 65 20 72 65 73 75 6c 74 20 61   single result a
3ad0: 6c 6c 6f 77 65 64 20 66 6f 72 20 22 0a 20 20 20  llowed for ".   
3ae0: 20 20 20 20 22 61 20 53 45 4c 45 43 54 20 74 68      "a SELECT th
3af0: 61 74 20 69 73 20 70 61 72 74 20 6f 66 20 61 6e  at is part of an
3b00: 20 65 78 70 72 65 73 73 69 6f 6e 22 29 3b 0a 20   expression");. 
3b10: 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d     return 1;.  }
3b20: 65 6c 73 65 7b 0a 20 20 20 20 72 65 74 75 72 6e  else{.    return
3b30: 20 30 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a   0;.  }.}../*.**
3b40: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 67 65   This routine ge
3b50: 6e 65 72 61 74 65 73 20 74 68 65 20 63 6f 64 65  nerates the code
3b60: 20 66 6f 72 20 74 68 65 20 69 6e 73 69 64 65 20   for the inside 
3b70: 6f 66 20 74 68 65 20 69 6e 6e 65 72 20 6c 6f 6f  of the inner loo
3b80: 70 0a 2a 2a 20 6f 66 20 61 20 53 45 4c 45 43 54  p.** of a SELECT
3b90: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 73 72 63 54 61  ..**.** If srcTa
3ba0: 62 20 61 6e 64 20 6e 43 6f 6c 75 6d 6e 20 61 72  b and nColumn ar
3bb0: 65 20 62 6f 74 68 20 7a 65 72 6f 2c 20 74 68 65  e both zero, the
3bc0: 6e 20 74 68 65 20 70 45 4c 69 73 74 20 65 78 70  n the pEList exp
3bd0: 72 65 73 73 69 6f 6e 73 0a 2a 2a 20 61 72 65 20  ressions.** are 
3be0: 65 76 61 6c 75 61 74 65 64 20 69 6e 20 6f 72 64  evaluated in ord
3bf0: 65 72 20 74 6f 20 67 65 74 20 74 68 65 20 64 61  er to get the da
3c00: 74 61 20 66 6f 72 20 74 68 69 73 20 72 6f 77 2e  ta for this row.
3c10: 20 20 49 66 20 6e 43 6f 6c 75 6d 6e 3e 30 0a 2a    If nColumn>0.*
3c20: 2a 20 74 68 65 6e 20 64 61 74 61 20 69 73 20 70  * then data is p
3c30: 75 6c 6c 65 64 20 66 72 6f 6d 20 73 72 63 54 61  ulled from srcTa
3c40: 62 20 61 6e 64 20 70 45 4c 69 73 74 20 69 73 20  b and pEList is 
3c50: 75 73 65 64 20 6f 6e 6c 79 20 74 6f 20 67 65 74  used only to get
3c60: 20 74 68 65 0a 2a 2a 20 64 61 74 61 74 79 70 65   the.** datatype
3c70: 73 20 66 6f 72 20 65 61 63 68 20 63 6f 6c 75 6d  s for each colum
3c80: 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  n..*/.static int
3c90: 20 73 65 6c 65 63 74 49 6e 6e 65 72 4c 6f 6f 70   selectInnerLoop
3ca0: 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
3cb0: 65 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54  e,          /* T
3cc0: 68 65 20 70 61 72 73 65 72 20 63 6f 6e 74 65 78  he parser contex
3cd0: 74 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70  t */.  Select *p
3ce0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ,              /
3cf0: 2a 20 54 68 65 20 63 6f 6d 70 6c 65 74 65 20 73  * The complete s
3d00: 65 6c 65 63 74 20 73 74 61 74 65 6d 65 6e 74 20  elect statement 
3d10: 62 65 69 6e 67 20 63 6f 64 65 64 20 2a 2f 0a 20  being coded */. 
3d20: 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73   ExprList *pELis
3d30: 74 2c 20 20 20 20 20 20 20 2f 2a 20 4c 69 73 74  t,       /* List
3d40: 20 6f 66 20 76 61 6c 75 65 73 20 62 65 69 6e 67   of values being
3d50: 20 65 78 74 72 61 63 74 65 64 20 2a 2f 0a 20 20   extracted */.  
3d60: 69 6e 74 20 73 72 63 54 61 62 2c 20 20 20 20 20  int srcTab,     
3d70: 20 20 20 20 20 20 20 20 2f 2a 20 50 75 6c 6c 20          /* Pull 
3d80: 64 61 74 61 20 66 72 6f 6d 20 74 68 69 73 20 74  data from this t
3d90: 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 43  able */.  int nC
3da0: 6f 6c 75 6d 6e 2c 20 20 20 20 20 20 20 20 20 20  olumn,          
3db0: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63    /* Number of c
3dc0: 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20 73 6f  olumns in the so
3dd0: 75 72 63 65 20 74 61 62 6c 65 20 2a 2f 0a 20 20  urce table */.  
3de0: 45 78 70 72 4c 69 73 74 20 2a 70 4f 72 64 65 72  ExprList *pOrder
3df0: 42 79 2c 20 20 20 20 20 2f 2a 20 49 66 20 6e 6f  By,     /* If no
3e00: 74 20 4e 55 4c 4c 2c 20 73 6f 72 74 20 72 65 73  t NULL, sort res
3e10: 75 6c 74 73 20 75 73 69 6e 67 20 74 68 69 73 20  ults using this 
3e20: 6b 65 79 20 2a 2f 0a 20 20 69 6e 74 20 64 69 73  key */.  int dis
3e30: 74 69 6e 63 74 2c 20 20 20 20 20 20 20 20 20 20  tinct,          
3e40: 20 2f 2a 20 49 66 20 3e 3d 30 2c 20 6d 61 6b 65   /* If >=0, make
3e50: 20 73 75 72 65 20 72 65 73 75 6c 74 73 20 61 72   sure results ar
3e60: 65 20 64 69 73 74 69 6e 63 74 20 2a 2f 0a 20 20  e distinct */.  
3e70: 69 6e 74 20 65 44 65 73 74 2c 20 20 20 20 20 20  int eDest,      
3e80: 20 20 20 20 20 20 20 20 2f 2a 20 48 6f 77 20 74          /* How t
3e90: 6f 20 64 69 73 70 6f 73 65 20 6f 66 20 74 68 65  o dispose of the
3ea0: 20 72 65 73 75 6c 74 73 20 2a 2f 0a 20 20 69 6e   results */.  in
3eb0: 74 20 69 50 61 72 6d 2c 20 20 20 20 20 20 20 20  t iParm,        
3ec0: 20 20 20 20 20 20 2f 2a 20 41 6e 20 61 72 67 75        /* An argu
3ed0: 6d 65 6e 74 20 74 6f 20 74 68 65 20 64 69 73 70  ment to the disp
3ee0: 6f 73 61 6c 20 6d 65 74 68 6f 64 20 2a 2f 0a 20  osal method */. 
3ef0: 20 69 6e 74 20 69 43 6f 6e 74 69 6e 75 65 2c 20   int iContinue, 
3f00: 20 20 20 20 20 20 20 20 20 2f 2a 20 4a 75 6d 70           /* Jump
3f10: 20 68 65 72 65 20 74 6f 20 63 6f 6e 74 69 6e 75   here to continu
3f20: 65 20 77 69 74 68 20 6e 65 78 74 20 72 6f 77 20  e with next row 
3f30: 2a 2f 0a 20 20 69 6e 74 20 69 42 72 65 61 6b 2c  */.  int iBreak,
3f40: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
3f50: 4a 75 6d 70 20 68 65 72 65 20 74 6f 20 62 72 65  Jump here to bre
3f60: 61 6b 20 6f 75 74 20 6f 66 20 74 68 65 20 69 6e  ak out of the in
3f70: 6e 65 72 20 6c 6f 6f 70 20 2a 2f 0a 20 20 63 68  ner loop */.  ch
3f80: 61 72 20 2a 61 66 66 20 20 20 20 20 20 20 20 20  ar *aff         
3f90: 20 20 20 20 20 20 2f 2a 20 61 66 66 69 6e 69 74        /* affinit
3fa0: 79 20 73 74 72 69 6e 67 20 69 66 20 65 44 65 73  y string if eDes
3fb0: 74 20 69 73 20 53 52 54 5f 55 6e 69 6f 6e 20 2a  t is SRT_Union *
3fc0: 2f 0a 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d  /.){.  Vdbe *v =
3fd0: 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a   pParse->pVdbe;.
3fe0: 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 68    int i;.  int h
3ff0: 61 73 44 69 73 74 69 6e 63 74 3b 20 20 20 20 20  asDistinct;     
4000: 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 74 68     /* True if th
4010: 65 20 44 49 53 54 49 4e 43 54 20 6b 65 79 77 6f  e DISTINCT keywo
4020: 72 64 20 69 73 20 70 72 65 73 65 6e 74 20 2a 2f  rd is present */
4030: 0a 0a 20 20 69 66 28 20 76 3d 3d 30 20 29 20 72  ..  if( v==0 ) r
4040: 65 74 75 72 6e 20 30 3b 0a 20 20 61 73 73 65 72  eturn 0;.  asser
4050: 74 28 20 70 45 4c 69 73 74 21 3d 30 20 29 3b 0a  t( pEList!=0 );.
4060: 0a 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20 77  .  /* If there w
4070: 61 73 20 61 20 4c 49 4d 49 54 20 63 6c 61 75 73  as a LIMIT claus
4080: 65 20 6f 6e 20 74 68 65 20 53 45 4c 45 43 54 20  e on the SELECT 
4090: 73 74 61 74 65 6d 65 6e 74 2c 20 74 68 65 6e 20  statement, then 
40a0: 64 6f 20 74 68 65 20 63 68 65 63 6b 0a 20 20 2a  do the check.  *
40b0: 2a 20 74 6f 20 73 65 65 20 69 66 20 74 68 69 73  * to see if this
40c0: 20 72 6f 77 20 73 68 6f 75 6c 64 20 62 65 20 6f   row should be o
40d0: 75 74 70 75 74 2e 0a 20 20 2a 2f 0a 20 20 68 61  utput..  */.  ha
40e0: 73 44 69 73 74 69 6e 63 74 20 3d 20 64 69 73 74  sDistinct = dist
40f0: 69 6e 63 74 3e 3d 30 20 26 26 20 70 45 4c 69 73  inct>=0 && pELis
4100: 74 2d 3e 6e 45 78 70 72 3e 30 3b 0a 20 20 69 66  t->nExpr>0;.  if
4110: 28 20 70 4f 72 64 65 72 42 79 3d 3d 30 20 26 26  ( pOrderBy==0 &&
4120: 20 21 68 61 73 44 69 73 74 69 6e 63 74 20 29 7b   !hasDistinct ){
4130: 0a 20 20 20 20 63 6f 64 65 4f 66 66 73 65 74 28  .    codeOffset(
4140: 76 2c 20 70 2c 20 69 43 6f 6e 74 69 6e 75 65 2c  v, p, iContinue,
4150: 20 30 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 50   0);.  }..  /* P
4160: 75 6c 6c 20 74 68 65 20 72 65 71 75 65 73 74 65  ull the requeste
4170: 64 20 63 6f 6c 75 6d 6e 73 2e 0a 20 20 2a 2f 0a  d columns..  */.
4180: 20 20 69 66 28 20 6e 43 6f 6c 75 6d 6e 3e 30 20    if( nColumn>0 
4190: 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  ){.    for(i=0; 
41a0: 69 3c 6e 43 6f 6c 75 6d 6e 3b 20 69 2b 2b 29 7b  i<nColumn; i++){
41b0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
41c0: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 43 6f  beAddOp(v, OP_Co
41d0: 6c 75 6d 6e 2c 20 73 72 63 54 61 62 2c 20 69 29  lumn, srcTab, i)
41e0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b  ;.    }.  }else{
41f0: 0a 20 20 20 20 6e 43 6f 6c 75 6d 6e 20 3d 20 70  .    nColumn = p
4200: 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 0a 20 20  EList->nExpr;.  
4210: 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64    sqlite3ExprCod
4220: 65 45 78 70 72 4c 69 73 74 28 70 50 61 72 73 65  eExprList(pParse
4230: 2c 20 70 45 4c 69 73 74 29 3b 0a 20 20 7d 0a 0a  , pEList);.  }..
4240: 20 20 2f 2a 20 49 66 20 74 68 65 20 44 49 53 54    /* If the DIST
4250: 49 4e 43 54 20 6b 65 79 77 6f 72 64 20 77 61 73  INCT keyword was
4260: 20 70 72 65 73 65 6e 74 20 6f 6e 20 74 68 65 20   present on the 
4270: 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
4280: 0a 20 20 2a 2a 20 61 6e 64 20 74 68 69 73 20 72  .  ** and this r
4290: 6f 77 20 68 61 73 20 62 65 65 6e 20 73 65 65 6e  ow has been seen
42a0: 20 62 65 66 6f 72 65 2c 20 74 68 65 6e 20 64 6f   before, then do
42b0: 20 6e 6f 74 20 6d 61 6b 65 20 74 68 69 73 20 72   not make this r
42c0: 6f 77 0a 20 20 2a 2a 20 70 61 72 74 20 6f 66 20  ow.  ** part of 
42d0: 74 68 65 20 72 65 73 75 6c 74 2e 0a 20 20 2a 2f  the result..  */
42e0: 0a 20 20 69 66 28 20 68 61 73 44 69 73 74 69 6e  .  if( hasDistin
42f0: 63 74 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  ct ){.    assert
4300: 28 20 70 45 4c 69 73 74 21 3d 30 20 29 3b 0a 20  ( pEList!=0 );. 
4310: 20 20 20 61 73 73 65 72 74 28 20 70 45 4c 69 73     assert( pELis
4320: 74 2d 3e 6e 45 78 70 72 3d 3d 6e 43 6f 6c 75 6d  t->nExpr==nColum
4330: 6e 20 29 3b 0a 20 20 20 20 63 6f 64 65 44 69 73  n );.    codeDis
4340: 74 69 6e 63 74 28 76 2c 20 64 69 73 74 69 6e 63  tinct(v, distinc
4350: 74 2c 20 69 43 6f 6e 74 69 6e 75 65 2c 20 6e 43  t, iContinue, nC
4360: 6f 6c 75 6d 6e 29 3b 0a 20 20 20 20 69 66 28 20  olumn);.    if( 
4370: 70 4f 72 64 65 72 42 79 3d 3d 30 20 29 7b 0a 20  pOrderBy==0 ){. 
4380: 20 20 20 20 20 63 6f 64 65 4f 66 66 73 65 74 28       codeOffset(
4390: 76 2c 20 70 2c 20 69 43 6f 6e 74 69 6e 75 65 2c  v, p, iContinue,
43a0: 20 6e 43 6f 6c 75 6d 6e 29 3b 0a 20 20 20 20 7d   nColumn);.    }
43b0: 0a 20 20 7d 0a 0a 20 20 69 66 28 20 63 68 65 63  .  }..  if( chec
43c0: 6b 46 6f 72 4d 75 6c 74 69 43 6f 6c 75 6d 6e 53  kForMultiColumnS
43d0: 65 6c 65 63 74 45 72 72 6f 72 28 70 50 61 72 73  electError(pPars
43e0: 65 2c 20 65 44 65 73 74 2c 20 70 45 4c 69 73 74  e, eDest, pEList
43f0: 2d 3e 6e 45 78 70 72 29 20 29 7b 0a 20 20 20 20  ->nExpr) ){.    
4400: 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 0a 20  return 0;.  }.. 
4410: 20 73 77 69 74 63 68 28 20 65 44 65 73 74 20 29   switch( eDest )
4420: 7b 0a 20 20 20 20 2f 2a 20 49 6e 20 74 68 69 73  {.    /* In this
4430: 20 6d 6f 64 65 2c 20 77 72 69 74 65 20 65 61 63   mode, write eac
4440: 68 20 71 75 65 72 79 20 72 65 73 75 6c 74 20 74  h query result t
4450: 6f 20 74 68 65 20 6b 65 79 20 6f 66 20 74 68 65  o the key of the
4460: 20 74 65 6d 70 6f 72 61 72 79 0a 20 20 20 20 2a   temporary.    *
4470: 2a 20 74 61 62 6c 65 20 69 50 61 72 6d 2e 0a 20  * table iParm.. 
4480: 20 20 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51     */.#ifndef SQ
4490: 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f 4d 50 4f 55  LITE_OMIT_COMPOU
44a0: 4e 44 5f 53 45 4c 45 43 54 0a 20 20 20 20 63 61  ND_SELECT.    ca
44b0: 73 65 20 53 52 54 5f 55 6e 69 6f 6e 3a 20 7b 0a  se SRT_Union: {.
44c0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
44d0: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 61 6b  eAddOp(v, OP_Mak
44e0: 65 52 65 63 6f 72 64 2c 20 6e 43 6f 6c 75 6d 6e  eRecord, nColumn
44f0: 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20  , 0);.      if( 
4500: 61 66 66 20 29 7b 0a 20 20 20 20 20 20 20 20 73  aff ){.        s
4510: 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65  qlite3VdbeChange
4520: 50 33 28 76 2c 20 2d 31 2c 20 61 66 66 2c 20 50  P3(v, -1, aff, P
4530: 33 5f 53 54 41 54 49 43 29 3b 0a 20 20 20 20 20  3_STATIC);.     
4540: 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   }.      sqlite3
4550: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
4560: 49 64 78 49 6e 73 65 72 74 2c 20 69 50 61 72 6d  IdxInsert, iParm
4570: 2c 20 30 29 3b 0a 20 20 20 20 20 20 62 72 65 61  , 0);.      brea
4580: 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  k;.    }..    /*
4590: 20 43 6f 6e 73 74 72 75 63 74 20 61 20 72 65 63   Construct a rec
45a0: 6f 72 64 20 66 72 6f 6d 20 74 68 65 20 71 75 65  ord from the que
45b0: 72 79 20 72 65 73 75 6c 74 2c 20 62 75 74 20 69  ry result, but i
45c0: 6e 73 74 65 61 64 20 6f 66 0a 20 20 20 20 2a 2a  nstead of.    **
45d0: 20 73 61 76 69 6e 67 20 74 68 61 74 20 72 65 63   saving that rec
45e0: 6f 72 64 2c 20 75 73 65 20 69 74 20 61 73 20 61  ord, use it as a
45f0: 20 6b 65 79 20 74 6f 20 64 65 6c 65 74 65 20 65   key to delete e
4600: 6c 65 6d 65 6e 74 73 20 66 72 6f 6d 0a 20 20 20  lements from.   
4610: 20 2a 2a 20 74 68 65 20 74 65 6d 70 6f 72 61 72   ** the temporar
4620: 79 20 74 61 62 6c 65 20 69 50 61 72 6d 2e 0a 20  y table iParm.. 
4630: 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53     */.    case S
4640: 52 54 5f 45 78 63 65 70 74 3a 20 7b 0a 20 20 20  RT_Except: {.   
4650: 20 20 20 69 6e 74 20 61 64 64 72 3b 0a 20 20 20     int addr;.   
4660: 20 20 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65     addr = sqlite
4670: 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
4680: 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20 6e 43 6f  _MakeRecord, nCo
4690: 6c 75 6d 6e 2c 20 30 29 3b 0a 20 20 20 20 20 20  lumn, 0);.      
46a0: 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67  sqlite3VdbeChang
46b0: 65 50 33 28 76 2c 20 2d 31 2c 20 61 66 66 2c 20  eP3(v, -1, aff, 
46c0: 50 33 5f 53 54 41 54 49 43 29 3b 0a 20 20 20 20  P3_STATIC);.    
46d0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
46e0: 4f 70 28 76 2c 20 4f 50 5f 4e 6f 74 46 6f 75 6e  Op(v, OP_NotFoun
46f0: 64 2c 20 69 50 61 72 6d 2c 20 61 64 64 72 2b 33  d, iParm, addr+3
4700: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
4710: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
4720: 44 65 6c 65 74 65 2c 20 69 50 61 72 6d 2c 20 30  Delete, iParm, 0
4730: 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
4740: 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20      }.#endif..  
4750: 20 20 2f 2a 20 53 74 6f 72 65 20 74 68 65 20 72    /* Store the r
4760: 65 73 75 6c 74 20 61 73 20 64 61 74 61 20 75 73  esult as data us
4770: 69 6e 67 20 61 20 75 6e 69 71 75 65 20 6b 65 79  ing a unique key
4780: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73  ..    */.    cas
4790: 65 20 53 52 54 5f 54 61 62 6c 65 3a 0a 20 20 20  e SRT_Table:.   
47a0: 20 63 61 73 65 20 53 52 54 5f 45 70 68 65 6d 54   case SRT_EphemT
47b0: 61 62 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69  ab: {.      sqli
47c0: 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
47d0: 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20 6e  OP_MakeRecord, n
47e0: 43 6f 6c 75 6d 6e 2c 20 30 29 3b 0a 20 20 20 20  Column, 0);.    
47f0: 20 20 69 66 28 20 70 4f 72 64 65 72 42 79 20 29    if( pOrderBy )
4800: 7b 0a 20 20 20 20 20 20 20 20 70 75 73 68 4f 6e  {.        pushOn
4810: 74 6f 53 6f 72 74 65 72 28 70 50 61 72 73 65 2c  toSorter(pParse,
4820: 20 70 4f 72 64 65 72 42 79 2c 20 70 29 3b 0a 20   pOrderBy, p);. 
4830: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
4840: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
4850: 64 64 4f 70 28 76 2c 20 4f 50 5f 4e 65 77 52 6f  ddOp(v, OP_NewRo
4860: 77 69 64 2c 20 69 50 61 72 6d 2c 20 30 29 3b 0a  wid, iParm, 0);.
4870: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
4880: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 50  dbeAddOp(v, OP_P
4890: 75 6c 6c 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20  ull, 1, 0);.    
48a0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
48b0: 64 64 4f 70 28 76 2c 20 4f 50 5f 49 6e 73 65 72  ddOp(v, OP_Inser
48c0: 74 2c 20 69 50 61 72 6d 2c 20 4f 50 46 4c 41 47  t, iParm, OPFLAG
48d0: 5f 41 50 50 45 4e 44 29 3b 0a 20 20 20 20 20 20  _APPEND);.      
48e0: 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  }.      break;. 
48f0: 20 20 20 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51     }..#ifndef SQ
4900: 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45  LITE_OMIT_SUBQUE
4910: 52 59 0a 20 20 20 20 2f 2a 20 49 66 20 77 65 20  RY.    /* If we 
4920: 61 72 65 20 63 72 65 61 74 69 6e 67 20 61 20 73  are creating a s
4930: 65 74 20 66 6f 72 20 61 6e 20 22 65 78 70 72 20  et for an "expr 
4940: 49 4e 20 28 53 45 4c 45 43 54 20 2e 2e 2e 29 22  IN (SELECT ...)"
4950: 20 63 6f 6e 73 74 72 75 63 74 2c 0a 20 20 20 20   construct,.    
4960: 2a 2a 20 74 68 65 6e 20 74 68 65 72 65 20 73 68  ** then there sh
4970: 6f 75 6c 64 20 62 65 20 61 20 73 69 6e 67 6c 65  ould be a single
4980: 20 69 74 65 6d 20 6f 6e 20 74 68 65 20 73 74 61   item on the sta
4990: 63 6b 2e 20 20 57 72 69 74 65 20 74 68 69 73 0a  ck.  Write this.
49a0: 20 20 20 20 2a 2a 20 69 74 65 6d 20 69 6e 74 6f      ** item into
49b0: 20 74 68 65 20 73 65 74 20 74 61 62 6c 65 20 77   the set table w
49c0: 69 74 68 20 62 6f 67 75 73 20 64 61 74 61 2e 0a  ith bogus data..
49d0: 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20      */.    case 
49e0: 53 52 54 5f 53 65 74 3a 20 7b 0a 20 20 20 20 20  SRT_Set: {.     
49f0: 20 69 6e 74 20 61 64 64 72 31 20 3d 20 73 71 6c   int addr1 = sql
4a00: 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41  ite3VdbeCurrentA
4a10: 64 64 72 28 76 29 3b 0a 20 20 20 20 20 20 69 6e  ddr(v);.      in
4a20: 74 20 61 64 64 72 32 3b 0a 0a 20 20 20 20 20 20  t addr2;..      
4a30: 61 73 73 65 72 74 28 20 6e 43 6f 6c 75 6d 6e 3d  assert( nColumn=
4a40: 3d 31 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  =1 );.      sqli
4a50: 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
4a60: 4f 50 5f 4e 6f 74 4e 75 6c 6c 2c 20 2d 31 2c 20  OP_NotNull, -1, 
4a70: 61 64 64 72 31 2b 33 29 3b 0a 20 20 20 20 20 20  addr1+3);.      
4a80: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
4a90: 28 76 2c 20 4f 50 5f 50 6f 70 2c 20 31 2c 20 30  (v, OP_Pop, 1, 0
4aa0: 29 3b 0a 20 20 20 20 20 20 61 64 64 72 32 20 3d  );.      addr2 =
4ab0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
4ac0: 70 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c  p(v, OP_Goto, 0,
4ad0: 20 30 29 3b 0a 20 20 20 20 20 20 70 2d 3e 61 66   0);.      p->af
4ae0: 66 69 6e 69 74 79 20 3d 20 73 71 6c 69 74 65 33  finity = sqlite3
4af0: 43 6f 6d 70 61 72 65 41 66 66 69 6e 69 74 79 28  CompareAffinity(
4b00: 70 45 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78  pEList->a[0].pEx
4b10: 70 72 2c 28 69 50 61 72 6d 3e 3e 31 36 29 26 30  pr,(iParm>>16)&0
4b20: 78 66 66 29 3b 0a 20 20 20 20 20 20 69 66 28 20  xff);.      if( 
4b30: 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20  pOrderBy ){.    
4b40: 20 20 20 20 2f 2a 20 41 74 20 66 69 72 73 74 20      /* At first 
4b50: 67 6c 61 6e 63 65 20 79 6f 75 20 77 6f 75 6c 64  glance you would
4b60: 20 74 68 69 6e 6b 20 77 65 20 63 6f 75 6c 64 20   think we could 
4b70: 6f 70 74 69 6d 69 7a 65 20 6f 75 74 20 74 68 65  optimize out the
4b80: 0a 20 20 20 20 20 20 20 20 2a 2a 20 4f 52 44 45  .        ** ORDE
4b90: 52 20 42 59 20 69 6e 20 74 68 69 73 20 63 61 73  R BY in this cas
4ba0: 65 20 73 69 6e 63 65 20 74 68 65 20 6f 72 64 65  e since the orde
4bb0: 72 20 6f 66 20 65 6e 74 72 69 65 73 20 69 6e 20  r of entries in 
4bc0: 74 68 65 20 73 65 74 0a 20 20 20 20 20 20 20 20  the set.        
4bd0: 2a 2a 20 64 6f 65 73 20 6e 6f 74 20 6d 61 74 74  ** does not matt
4be0: 65 72 2e 20 20 42 75 74 20 74 68 65 72 65 20 6d  er.  But there m
4bf0: 69 67 68 74 20 62 65 20 61 20 4c 49 4d 49 54 20  ight be a LIMIT 
4c00: 63 6c 61 75 73 65 2c 20 69 6e 20 77 68 69 63 68  clause, in which
4c10: 0a 20 20 20 20 20 20 20 20 2a 2a 20 63 61 73 65  .        ** case
4c20: 20 74 68 65 20 6f 72 64 65 72 20 64 6f 65 73 20   the order does 
4c30: 6d 61 74 74 65 72 20 2a 2f 0a 20 20 20 20 20 20  matter */.      
4c40: 20 20 70 75 73 68 4f 6e 74 6f 53 6f 72 74 65 72    pushOntoSorter
4c50: 28 70 50 61 72 73 65 2c 20 70 4f 72 64 65 72 42  (pParse, pOrderB
4c60: 79 2c 20 70 29 3b 0a 20 20 20 20 20 20 7d 65 6c  y, p);.      }el
4c70: 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  se{.        sqli
4c80: 74 65 33 56 64 62 65 4f 70 33 28 76 2c 20 4f 50  te3VdbeOp3(v, OP
4c90: 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20 31 2c 20  _MakeRecord, 1, 
4ca0: 30 2c 20 26 70 2d 3e 61 66 66 69 6e 69 74 79 2c  0, &p->affinity,
4cb0: 20 31 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c   1);.        sql
4cc0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
4cd0: 20 4f 50 5f 49 64 78 49 6e 73 65 72 74 2c 20 28   OP_IdxInsert, (
4ce0: 69 50 61 72 6d 26 30 78 30 30 30 30 46 46 46 46  iParm&0x0000FFFF
4cf0: 29 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20  ), 0);.      }. 
4d00: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
4d10: 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72  JumpHere(v, addr
4d20: 32 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  2);.      break;
4d30: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49  .    }..    /* I
4d40: 66 20 61 6e 79 20 72 6f 77 20 65 78 69 73 74 20  f any row exist 
4d50: 69 6e 20 74 68 65 20 72 65 73 75 6c 74 20 73 65  in the result se
4d60: 74 2c 20 72 65 63 6f 72 64 20 74 68 61 74 20 66  t, record that f
4d70: 61 63 74 20 61 6e 64 20 61 62 6f 72 74 2e 0a 20  act and abort.. 
4d80: 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53     */.    case S
4d90: 52 54 5f 45 78 69 73 74 73 3a 20 7b 0a 20 20 20  RT_Exists: {.   
4da0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
4db0: 64 4f 70 28 76 2c 20 4f 50 5f 4d 65 6d 49 6e 74  dOp(v, OP_MemInt
4dc0: 2c 20 31 2c 20 69 50 61 72 6d 29 3b 0a 20 20 20  , 1, iParm);.   
4dd0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
4de0: 64 4f 70 28 76 2c 20 4f 50 5f 50 6f 70 2c 20 6e  dOp(v, OP_Pop, n
4df0: 43 6f 6c 75 6d 6e 2c 20 30 29 3b 0a 20 20 20 20  Column, 0);.    
4e00: 20 20 2f 2a 20 54 68 65 20 4c 49 4d 49 54 20 63    /* The LIMIT c
4e10: 6c 61 75 73 65 20 77 69 6c 6c 20 74 65 72 6d 69  lause will termi
4e20: 6e 61 74 65 20 74 68 65 20 6c 6f 6f 70 20 66 6f  nate the loop fo
4e30: 72 20 75 73 20 2a 2f 0a 20 20 20 20 20 20 62 72  r us */.      br
4e40: 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  eak;.    }..    
4e50: 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20 61 20  /* If this is a 
4e60: 73 63 61 6c 61 72 20 73 65 6c 65 63 74 20 74 68  scalar select th
4e70: 61 74 20 69 73 20 70 61 72 74 20 6f 66 20 61 6e  at is part of an
4e80: 20 65 78 70 72 65 73 73 69 6f 6e 2c 20 74 68 65   expression, the
4e90: 6e 0a 20 20 20 20 2a 2a 20 73 74 6f 72 65 20 74  n.    ** store t
4ea0: 68 65 20 72 65 73 75 6c 74 73 20 69 6e 20 74 68  he results in th
4eb0: 65 20 61 70 70 72 6f 70 72 69 61 74 65 20 6d 65  e appropriate me
4ec0: 6d 6f 72 79 20 63 65 6c 6c 20 61 6e 64 20 62 72  mory cell and br
4ed0: 65 61 6b 20 6f 75 74 0a 20 20 20 20 2a 2a 20 6f  eak out.    ** o
4ee0: 66 20 74 68 65 20 73 63 61 6e 20 6c 6f 6f 70 2e  f the scan loop.
4ef0: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65  .    */.    case
4f00: 20 53 52 54 5f 4d 65 6d 3a 20 7b 0a 20 20 20 20   SRT_Mem: {.    
4f10: 20 20 61 73 73 65 72 74 28 20 6e 43 6f 6c 75 6d    assert( nColum
4f20: 6e 3d 3d 31 20 29 3b 0a 20 20 20 20 20 20 69 66  n==1 );.      if
4f30: 28 20 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20  ( pOrderBy ){.  
4f40: 20 20 20 20 20 20 70 75 73 68 4f 6e 74 6f 53 6f        pushOntoSo
4f50: 72 74 65 72 28 70 50 61 72 73 65 2c 20 70 4f 72  rter(pParse, pOr
4f60: 64 65 72 42 79 2c 20 70 29 3b 0a 20 20 20 20 20  derBy, p);.     
4f70: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
4f80: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
4f90: 28 76 2c 20 4f 50 5f 4d 65 6d 53 74 6f 72 65 2c  (v, OP_MemStore,
4fa0: 20 69 50 61 72 6d 2c 20 31 29 3b 0a 20 20 20 20   iParm, 1);.    
4fb0: 20 20 20 20 2f 2a 20 54 68 65 20 4c 49 4d 49 54      /* The LIMIT
4fc0: 20 63 6c 61 75 73 65 20 77 69 6c 6c 20 6a 75 6d   clause will jum
4fd0: 70 20 6f 75 74 20 6f 66 20 74 68 65 20 6c 6f 6f  p out of the loo
4fe0: 70 20 66 6f 72 20 75 73 20 2a 2f 0a 20 20 20 20  p for us */.    
4ff0: 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b    }.      break;
5000: 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a  .    }.#endif /*
5010: 20 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f   #ifndef SQLITE_
5020: 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 20 2a 2f  OMIT_SUBQUERY */
5030: 0a 0a 20 20 20 20 2f 2a 20 53 65 6e 64 20 74 68  ..    /* Send th
5040: 65 20 64 61 74 61 20 74 6f 20 74 68 65 20 63 61  e data to the ca
5050: 6c 6c 62 61 63 6b 20 66 75 6e 63 74 69 6f 6e 20  llback function 
5060: 6f 72 20 74 6f 20 61 20 73 75 62 72 6f 75 74 69  or to a subrouti
5070: 6e 65 2e 20 20 49 6e 20 74 68 65 0a 20 20 20 20  ne.  In the.    
5080: 2a 2a 20 63 61 73 65 20 6f 66 20 61 20 73 75 62  ** case of a sub
5090: 72 6f 75 74 69 6e 65 2c 20 74 68 65 20 73 75 62  routine, the sub
50a0: 72 6f 75 74 69 6e 65 20 69 74 73 65 6c 66 20 69  routine itself i
50b0: 73 20 72 65 73 70 6f 6e 73 69 62 6c 65 20 66 6f  s responsible fo
50c0: 72 0a 20 20 20 20 2a 2a 20 70 6f 70 70 69 6e 67  r.    ** popping
50d0: 20 74 68 65 20 64 61 74 61 20 66 72 6f 6d 20 74   the data from t
50e0: 68 65 20 73 74 61 63 6b 2e 0a 20 20 20 20 2a 2f  he stack..    */
50f0: 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f 53 75  .    case SRT_Su
5100: 62 72 6f 75 74 69 6e 65 3a 0a 20 20 20 20 63 61  broutine:.    ca
5110: 73 65 20 53 52 54 5f 43 61 6c 6c 62 61 63 6b 3a  se SRT_Callback:
5120: 20 7b 0a 20 20 20 20 20 20 69 66 28 20 70 4f 72   {.      if( pOr
5130: 64 65 72 42 79 20 29 7b 0a 20 20 20 20 20 20 20  derBy ){.       
5140: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
5150: 70 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f  p(v, OP_MakeReco
5160: 72 64 2c 20 6e 43 6f 6c 75 6d 6e 2c 20 30 29 3b  rd, nColumn, 0);
5170: 0a 20 20 20 20 20 20 20 20 70 75 73 68 4f 6e 74  .        pushOnt
5180: 6f 53 6f 72 74 65 72 28 70 50 61 72 73 65 2c 20  oSorter(pParse, 
5190: 70 4f 72 64 65 72 42 79 2c 20 70 29 3b 0a 20 20  pOrderBy, p);.  
51a0: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 65 44      }else if( eD
51b0: 65 73 74 3d 3d 53 52 54 5f 53 75 62 72 6f 75 74  est==SRT_Subrout
51c0: 69 6e 65 20 29 7b 0a 20 20 20 20 20 20 20 20 73  ine ){.        s
51d0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
51e0: 76 2c 20 4f 50 5f 47 6f 73 75 62 2c 20 30 2c 20  v, OP_Gosub, 0, 
51f0: 69 50 61 72 6d 29 3b 0a 20 20 20 20 20 20 7d 65  iParm);.      }e
5200: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  lse{.        sql
5210: 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
5220: 20 4f 50 5f 43 61 6c 6c 62 61 63 6b 2c 20 6e 43   OP_Callback, nC
5230: 6f 6c 75 6d 6e 2c 20 30 29 3b 0a 20 20 20 20 20  olumn, 0);.     
5240: 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a   }.      break;.
5250: 20 20 20 20 7d 0a 0a 23 69 66 20 21 64 65 66 69      }..#if !defi
5260: 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
5270: 54 52 49 47 47 45 52 29 0a 20 20 20 20 2f 2a 20  TRIGGER).    /* 
5280: 44 69 73 63 61 72 64 20 74 68 65 20 72 65 73 75  Discard the resu
5290: 6c 74 73 2e 20 20 54 68 69 73 20 69 73 20 75 73  lts.  This is us
52a0: 65 64 20 66 6f 72 20 53 45 4c 45 43 54 20 73 74  ed for SELECT st
52b0: 61 74 65 6d 65 6e 74 73 20 69 6e 73 69 64 65 0a  atements inside.
52c0: 20 20 20 20 2a 2a 20 74 68 65 20 62 6f 64 79 20      ** the body 
52d0: 6f 66 20 61 20 54 52 49 47 47 45 52 2e 20 20 54  of a TRIGGER.  T
52e0: 68 65 20 70 75 72 70 6f 73 65 20 6f 66 20 73 75  he purpose of su
52f0: 63 68 20 73 65 6c 65 63 74 73 20 69 73 20 74 6f  ch selects is to
5300: 20 63 61 6c 6c 0a 20 20 20 20 2a 2a 20 75 73 65   call.    ** use
5310: 72 2d 64 65 66 69 6e 65 64 20 66 75 6e 63 74 69  r-defined functi
5320: 6f 6e 73 20 74 68 61 74 20 68 61 76 65 20 73 69  ons that have si
5330: 64 65 20 65 66 66 65 63 74 73 2e 20 20 57 65 20  de effects.  We 
5340: 64 6f 20 6e 6f 74 20 63 61 72 65 0a 20 20 20 20  do not care.    
5350: 2a 2a 20 61 62 6f 75 74 20 74 68 65 20 61 63 74  ** about the act
5360: 75 61 6c 20 72 65 73 75 6c 74 73 20 6f 66 20 74  ual results of t
5370: 68 65 20 73 65 6c 65 63 74 2e 0a 20 20 20 20 2a  he select..    *
5380: 2f 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20 7b  /.    default: {
5390: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 65  .      assert( e
53a0: 44 65 73 74 3d 3d 53 52 54 5f 44 69 73 63 61 72  Dest==SRT_Discar
53b0: 64 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  d );.      sqlit
53c0: 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
53d0: 50 5f 50 6f 70 2c 20 6e 43 6f 6c 75 6d 6e 2c 20  P_Pop, nColumn, 
53e0: 30 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  0);.      break;
53f0: 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  .    }.#endif.  
5400: 7d 0a 0a 20 20 2f 2a 20 4a 75 6d 70 20 74 6f 20  }..  /* Jump to 
5410: 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 6c  the end of the l
5420: 6f 6f 70 20 69 66 20 74 68 65 20 4c 49 4d 49 54  oop if the LIMIT
5430: 20 69 73 20 72 65 61 63 68 65 64 2e 0a 20 20 2a   is reached..  *
5440: 2f 0a 20 20 69 66 28 20 70 2d 3e 69 4c 69 6d 69  /.  if( p->iLimi
5450: 74 3e 3d 30 20 26 26 20 70 4f 72 64 65 72 42 79  t>=0 && pOrderBy
5460: 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ==0 ){.    sqlit
5470: 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
5480: 50 5f 4d 65 6d 49 6e 63 72 2c 20 2d 31 2c 20 70  P_MemIncr, -1, p
5490: 2d 3e 69 4c 69 6d 69 74 29 3b 0a 20 20 20 20 73  ->iLimit);.    s
54a0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
54b0: 76 2c 20 4f 50 5f 49 66 4d 65 6d 5a 65 72 6f 2c  v, OP_IfMemZero,
54c0: 20 70 2d 3e 69 4c 69 6d 69 74 2c 20 69 42 72 65   p->iLimit, iBre
54d0: 61 6b 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  ak);.  }.  retur
54e0: 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69  n 0;.}../*.** Gi
54f0: 76 65 6e 20 61 6e 20 65 78 70 72 65 73 73 69 6f  ven an expressio
5500: 6e 20 6c 69 73 74 2c 20 67 65 6e 65 72 61 74 65  n list, generate
5510: 20 61 20 4b 65 79 49 6e 66 6f 20 73 74 72 75 63   a KeyInfo struc
5520: 74 75 72 65 20 74 68 61 74 20 72 65 63 6f 72 64  ture that record
5530: 73 0a 2a 2a 20 74 68 65 20 63 6f 6c 6c 61 74 69  s.** the collati
5540: 6e 67 20 73 65 71 75 65 6e 63 65 20 66 6f 72 20  ng sequence for 
5550: 65 61 63 68 20 65 78 70 72 65 73 73 69 6f 6e 20  each expression 
5560: 69 6e 20 74 68 61 74 20 65 78 70 72 65 73 73 69  in that expressi
5570: 6f 6e 20 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a 20 49  on list..**.** I
5580: 66 20 74 68 65 20 45 78 70 72 4c 69 73 74 20 69  f the ExprList i
5590: 73 20 61 6e 20 4f 52 44 45 52 20 42 59 20 6f 72  s an ORDER BY or
55a0: 20 47 52 4f 55 50 20 42 59 20 63 6c 61 75 73 65   GROUP BY clause
55b0: 20 74 68 65 6e 20 74 68 65 20 72 65 73 75 6c 74   then the result
55c0: 69 6e 67 0a 2a 2a 20 4b 65 79 49 6e 66 6f 20 73  ing.** KeyInfo s
55d0: 74 72 75 63 74 75 72 65 20 69 73 20 61 70 70 72  tructure is appr
55e0: 6f 70 72 69 61 74 65 20 66 6f 72 20 69 6e 69 74  opriate for init
55f0: 69 61 6c 69 7a 69 6e 67 20 61 20 76 69 72 74 75  ializing a virtu
5600: 61 6c 20 69 6e 64 65 78 20 74 6f 0a 2a 2a 20 69  al index to.** i
5610: 6d 70 6c 65 6d 65 6e 74 20 74 68 61 74 20 63 6c  mplement that cl
5620: 61 75 73 65 2e 20 20 49 66 20 74 68 65 20 45 78  ause.  If the Ex
5630: 70 72 4c 69 73 74 20 69 73 20 74 68 65 20 72 65  prList is the re
5640: 73 75 6c 74 20 73 65 74 20 6f 66 20 61 20 53 45  sult set of a SE
5650: 4c 45 43 54 0a 2a 2a 20 74 68 65 6e 20 74 68 65  LECT.** then the
5660: 20 4b 65 79 49 6e 66 6f 20 73 74 72 75 63 74 75   KeyInfo structu
5670: 72 65 20 69 73 20 61 70 70 72 6f 70 72 69 61 74  re is appropriat
5680: 65 20 66 6f 72 20 69 6e 69 74 69 61 6c 69 7a 69  e for initializi
5690: 6e 67 20 61 20 76 69 72 74 75 61 6c 0a 2a 2a 20  ng a virtual.** 
56a0: 69 6e 64 65 78 20 74 6f 20 69 6d 70 6c 65 6d 65  index to impleme
56b0: 6e 74 20 61 20 44 49 53 54 49 4e 43 54 20 74 65  nt a DISTINCT te
56c0: 73 74 2e 0a 2a 2a 0a 2a 2a 20 53 70 61 63 65 20  st..**.** Space 
56d0: 74 6f 20 68 6f 6c 64 20 74 68 65 20 4b 65 79 49  to hold the KeyI
56e0: 6e 66 6f 20 73 74 72 75 63 74 75 72 65 20 69 73  nfo structure is
56f0: 20 6f 62 74 61 69 6e 20 66 72 6f 6d 20 6d 61 6c   obtain from mal
5700: 6c 6f 63 2e 20 20 54 68 65 20 63 61 6c 6c 69 6e  loc.  The callin
5710: 67 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 69 73  g.** function is
5720: 20 72 65 73 70 6f 6e 73 69 62 6c 65 20 66 6f 72   responsible for
5730: 20 73 65 65 69 6e 67 20 74 68 61 74 20 74 68 69   seeing that thi
5740: 73 20 73 74 72 75 63 74 75 72 65 20 69 73 20 65  s structure is e
5750: 76 65 6e 74 75 61 6c 6c 79 0a 2a 2a 20 66 72 65  ventually.** fre
5760: 65 64 2e 20 20 41 64 64 20 74 68 65 20 4b 65 79  ed.  Add the Key
5770: 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65 20 74  Info structure t
5780: 6f 20 74 68 65 20 50 33 20 66 69 65 6c 64 20 6f  o the P3 field o
5790: 66 20 61 6e 20 6f 70 63 6f 64 65 20 75 73 69 6e  f an opcode usin
57a0: 67 0a 2a 2a 20 50 33 5f 4b 45 59 49 4e 46 4f 5f  g.** P3_KEYINFO_
57b0: 48 41 4e 44 4f 46 46 20 69 73 20 74 68 65 20 75  HANDOFF is the u
57c0: 73 75 61 6c 20 77 61 79 20 6f 66 20 64 65 61 6c  sual way of deal
57d0: 69 6e 67 20 77 69 74 68 20 74 68 69 73 2e 0a 2a  ing with this..*
57e0: 2f 0a 73 74 61 74 69 63 20 4b 65 79 49 6e 66 6f  /.static KeyInfo
57f0: 20 2a 6b 65 79 49 6e 66 6f 46 72 6f 6d 45 78 70   *keyInfoFromExp
5800: 72 4c 69 73 74 28 50 61 72 73 65 20 2a 70 50 61  rList(Parse *pPa
5810: 72 73 65 2c 20 45 78 70 72 4c 69 73 74 20 2a 70  rse, ExprList *p
5820: 4c 69 73 74 29 7b 0a 20 20 73 71 6c 69 74 65 33  List){.  sqlite3
5830: 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64   *db = pParse->d
5840: 62 3b 0a 20 20 69 6e 74 20 6e 45 78 70 72 3b 0a  b;.  int nExpr;.
5850: 20 20 4b 65 79 49 6e 66 6f 20 2a 70 49 6e 66 6f    KeyInfo *pInfo
5860: 3b 0a 20 20 73 74 72 75 63 74 20 45 78 70 72 4c  ;.  struct ExprL
5870: 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b  ist_item *pItem;
5880: 0a 20 20 69 6e 74 20 69 3b 0a 0a 20 20 6e 45 78  .  int i;..  nEx
5890: 70 72 20 3d 20 70 4c 69 73 74 2d 3e 6e 45 78 70  pr = pList->nExp
58a0: 72 3b 0a 20 20 70 49 6e 66 6f 20 3d 20 73 71 6c  r;.  pInfo = sql
58b0: 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f  ite3DbMallocZero
58c0: 28 64 62 2c 20 73 69 7a 65 6f 66 28 2a 70 49 6e  (db, sizeof(*pIn
58d0: 66 6f 29 20 2b 20 6e 45 78 70 72 2a 28 73 69 7a  fo) + nExpr*(siz
58e0: 65 6f 66 28 43 6f 6c 6c 53 65 71 2a 29 2b 31 29  eof(CollSeq*)+1)
58f0: 20 29 3b 0a 20 20 69 66 28 20 70 49 6e 66 6f 20   );.  if( pInfo 
5900: 29 7b 0a 20 20 20 20 70 49 6e 66 6f 2d 3e 61 53  ){.    pInfo->aS
5910: 6f 72 74 4f 72 64 65 72 20 3d 20 28 75 38 2a 29  ortOrder = (u8*)
5920: 26 70 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b 6e 45  &pInfo->aColl[nE
5930: 78 70 72 5d 3b 0a 20 20 20 20 70 49 6e 66 6f 2d  xpr];.    pInfo-
5940: 3e 6e 46 69 65 6c 64 20 3d 20 6e 45 78 70 72 3b  >nField = nExpr;
5950: 0a 20 20 20 20 70 49 6e 66 6f 2d 3e 65 6e 63 20  .    pInfo->enc 
5960: 3d 20 45 4e 43 28 64 62 29 3b 0a 20 20 20 20 66  = ENC(db);.    f
5970: 6f 72 28 69 3d 30 2c 20 70 49 74 65 6d 3d 70 4c  or(i=0, pItem=pL
5980: 69 73 74 2d 3e 61 3b 20 69 3c 6e 45 78 70 72 3b  ist->a; i<nExpr;
5990: 20 69 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a   i++, pItem++){.
59a0: 20 20 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a 70        CollSeq *p
59b0: 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 70 43 6f 6c  Coll;.      pCol
59c0: 6c 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43  l = sqlite3ExprC
59d0: 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70  ollSeq(pParse, p
59e0: 49 74 65 6d 2d 3e 70 45 78 70 72 29 3b 0a 20 20  Item->pExpr);.  
59f0: 20 20 20 20 69 66 28 20 21 70 43 6f 6c 6c 20 29      if( !pColl )
5a00: 7b 0a 20 20 20 20 20 20 20 20 70 43 6f 6c 6c 20  {.        pColl 
5a10: 3d 20 64 62 2d 3e 70 44 66 6c 74 43 6f 6c 6c 3b  = db->pDfltColl;
5a20: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70  .      }.      p
5a30: 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b 69 5d 20 3d  Info->aColl[i] =
5a40: 20 70 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 70 49   pColl;.      pI
5a50: 6e 66 6f 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b  nfo->aSortOrder[
5a60: 69 5d 20 3d 20 70 49 74 65 6d 2d 3e 73 6f 72 74  i] = pItem->sort
5a70: 4f 72 64 65 72 3b 0a 20 20 20 20 7d 0a 20 20 7d  Order;.    }.  }
5a80: 0a 20 20 72 65 74 75 72 6e 20 70 49 6e 66 6f 3b  .  return pInfo;
5a90: 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68  .}.../*.** If th
5aa0: 65 20 69 6e 6e 65 72 20 6c 6f 6f 70 20 77 61 73  e inner loop was
5ab0: 20 67 65 6e 65 72 61 74 65 64 20 75 73 69 6e 67   generated using
5ac0: 20 61 20 6e 6f 6e 2d 6e 75 6c 6c 20 70 4f 72 64   a non-null pOrd
5ad0: 65 72 42 79 20 61 72 67 75 6d 65 6e 74 2c 0a 2a  erBy argument,.*
5ae0: 2a 20 74 68 65 6e 20 74 68 65 20 72 65 73 75 6c  * then the resul
5af0: 74 73 20 77 65 72 65 20 70 6c 61 63 65 64 20 69  ts were placed i
5b00: 6e 20 61 20 73 6f 72 74 65 72 2e 20 20 41 66 74  n a sorter.  Aft
5b10: 65 72 20 74 68 65 20 6c 6f 6f 70 20 69 73 20 74  er the loop is t
5b20: 65 72 6d 69 6e 61 74 65 64 0a 2a 2a 20 77 65 20  erminated.** we 
5b30: 6e 65 65 64 20 74 6f 20 72 75 6e 20 74 68 65 20  need to run the 
5b40: 73 6f 72 74 65 72 20 61 6e 64 20 6f 75 74 70 75  sorter and outpu
5b50: 74 20 74 68 65 20 72 65 73 75 6c 74 73 2e 20 20  t the results.  
5b60: 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 0a 2a 2a  The following.**
5b70: 20 72 6f 75 74 69 6e 65 20 67 65 6e 65 72 61 74   routine generat
5b80: 65 73 20 74 68 65 20 63 6f 64 65 20 6e 65 65 64  es the code need
5b90: 65 64 20 74 6f 20 64 6f 20 74 68 61 74 2e 0a 2a  ed to do that..*
5ba0: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 67 65  /.static void ge
5bb0: 6e 65 72 61 74 65 53 6f 72 74 54 61 69 6c 28 0a  nerateSortTail(.
5bc0: 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
5bd0: 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f     /* Parsing co
5be0: 6e 74 65 78 74 20 2a 2f 0a 20 20 53 65 6c 65 63  ntext */.  Selec
5bf0: 74 20 2a 70 2c 20 20 20 20 20 20 20 2f 2a 20 54  t *p,       /* T
5c00: 68 65 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d  he SELECT statem
5c10: 65 6e 74 20 2a 2f 0a 20 20 56 64 62 65 20 2a 76  ent */.  Vdbe *v
5c20: 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 47 65 6e  ,         /* Gen
5c30: 65 72 61 74 65 20 63 6f 64 65 20 69 6e 74 6f 20  erate code into 
5c40: 74 68 69 73 20 56 44 42 45 20 2a 2f 0a 20 20 69  this VDBE */.  i
5c50: 6e 74 20 6e 43 6f 6c 75 6d 6e 2c 20 20 20 20 20  nt nColumn,     
5c60: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 6f 6c  /* Number of col
5c70: 75 6d 6e 73 20 6f 66 20 64 61 74 61 20 2a 2f 0a  umns of data */.
5c80: 20 20 69 6e 74 20 65 44 65 73 74 2c 20 20 20 20    int eDest,    
5c90: 20 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20     /* Write the 
5ca0: 73 6f 72 74 65 64 20 72 65 73 75 6c 74 73 20 68  sorted results h
5cb0: 65 72 65 20 2a 2f 0a 20 20 69 6e 74 20 69 50 61  ere */.  int iPa
5cc0: 72 6d 20 20 20 20 20 20 20 20 2f 2a 20 4f 70 74  rm        /* Opt
5cd0: 69 6f 6e 61 6c 20 70 61 72 61 6d 65 74 65 72 20  ional parameter 
5ce0: 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
5cf0: 65 44 65 73 74 20 2a 2f 0a 29 7b 0a 20 20 69 6e  eDest */.){.  in
5d00: 74 20 62 72 6b 20 3d 20 73 71 6c 69 74 65 33 56  t brk = sqlite3V
5d10: 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b  dbeMakeLabel(v);
5d20: 0a 20 20 69 6e 74 20 63 6f 6e 74 20 3d 20 73 71  .  int cont = sq
5d30: 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62  lite3VdbeMakeLab
5d40: 65 6c 28 76 29 3b 0a 20 20 69 6e 74 20 61 64 64  el(v);.  int add
5d50: 72 3b 0a 20 20 69 6e 74 20 69 54 61 62 3b 0a 20  r;.  int iTab;. 
5d60: 20 69 6e 74 20 70 73 65 75 64 6f 54 61 62 20 3d   int pseudoTab =
5d70: 20 30 3b 0a 20 20 45 78 70 72 4c 69 73 74 20 2a   0;.  ExprList *
5d80: 70 4f 72 64 65 72 42 79 20 3d 20 70 2d 3e 70 4f  pOrderBy = p->pO
5d90: 72 64 65 72 42 79 3b 0a 0a 20 20 69 54 61 62 20  rderBy;..  iTab 
5da0: 3d 20 70 4f 72 64 65 72 42 79 2d 3e 69 45 43 75  = pOrderBy->iECu
5db0: 72 73 6f 72 3b 0a 20 20 69 66 28 20 65 44 65 73  rsor;.  if( eDes
5dc0: 74 3d 3d 53 52 54 5f 43 61 6c 6c 62 61 63 6b 20  t==SRT_Callback 
5dd0: 7c 7c 20 65 44 65 73 74 3d 3d 53 52 54 5f 53 75  || eDest==SRT_Su
5de0: 62 72 6f 75 74 69 6e 65 20 29 7b 0a 20 20 20 20  broutine ){.    
5df0: 70 73 65 75 64 6f 54 61 62 20 3d 20 70 50 61 72  pseudoTab = pPar
5e00: 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20  se->nTab++;.    
5e10: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
5e20: 28 76 2c 20 4f 50 5f 4f 70 65 6e 50 73 65 75 64  (v, OP_OpenPseud
5e30: 6f 2c 20 70 73 65 75 64 6f 54 61 62 2c 20 30 29  o, pseudoTab, 0)
5e40: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
5e50: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 53 65 74  eAddOp(v, OP_Set
5e60: 4e 75 6d 43 6f 6c 75 6d 6e 73 2c 20 70 73 65 75  NumColumns, pseu
5e70: 64 6f 54 61 62 2c 20 6e 43 6f 6c 75 6d 6e 29 3b  doTab, nColumn);
5e80: 0a 20 20 7d 0a 20 20 61 64 64 72 20 3d 20 31 20  .  }.  addr = 1 
5e90: 2b 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  + sqlite3VdbeAdd
5ea0: 4f 70 28 76 2c 20 4f 50 5f 53 6f 72 74 2c 20 69  Op(v, OP_Sort, i
5eb0: 54 61 62 2c 20 62 72 6b 29 3b 0a 20 20 63 6f 64  Tab, brk);.  cod
5ec0: 65 4f 66 66 73 65 74 28 76 2c 20 70 2c 20 63 6f  eOffset(v, p, co
5ed0: 6e 74 2c 20 30 29 3b 0a 20 20 69 66 28 20 65 44  nt, 0);.  if( eD
5ee0: 65 73 74 3d 3d 53 52 54 5f 43 61 6c 6c 62 61 63  est==SRT_Callbac
5ef0: 6b 20 7c 7c 20 65 44 65 73 74 3d 3d 53 52 54 5f  k || eDest==SRT_
5f00: 53 75 62 72 6f 75 74 69 6e 65 20 29 7b 0a 20 20  Subroutine ){.  
5f10: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
5f20: 4f 70 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72  Op(v, OP_Integer
5f30: 2c 20 31 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 73  , 1, 0);.  }.  s
5f40: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
5f50: 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 69 54  v, OP_Column, iT
5f60: 61 62 2c 20 70 4f 72 64 65 72 42 79 2d 3e 6e 45  ab, pOrderBy->nE
5f70: 78 70 72 20 2b 20 31 29 3b 0a 20 20 73 77 69 74  xpr + 1);.  swit
5f80: 63 68 28 20 65 44 65 73 74 20 29 7b 0a 20 20 20  ch( eDest ){.   
5f90: 20 63 61 73 65 20 53 52 54 5f 54 61 62 6c 65 3a   case SRT_Table:
5fa0: 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f 45 70  .    case SRT_Ep
5fb0: 68 65 6d 54 61 62 3a 20 7b 0a 20 20 20 20 20 20  hemTab: {.      
5fc0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
5fd0: 28 76 2c 20 4f 50 5f 4e 65 77 52 6f 77 69 64 2c  (v, OP_NewRowid,
5fe0: 20 69 50 61 72 6d 2c 20 30 29 3b 0a 20 20 20 20   iParm, 0);.    
5ff0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
6000: 4f 70 28 76 2c 20 4f 50 5f 50 75 6c 6c 2c 20 31  Op(v, OP_Pull, 1
6010: 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  , 0);.      sqli
6020: 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
6030: 4f 50 5f 49 6e 73 65 72 74 2c 20 69 50 61 72 6d  OP_Insert, iParm
6040: 2c 20 4f 50 46 4c 41 47 5f 41 50 50 45 4e 44 29  , OPFLAG_APPEND)
6050: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
6060: 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c     }.#ifndef SQL
6070: 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52  ITE_OMIT_SUBQUER
6080: 59 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f 53  Y.    case SRT_S
6090: 65 74 3a 20 7b 0a 20 20 20 20 20 20 61 73 73 65  et: {.      asse
60a0: 72 74 28 20 6e 43 6f 6c 75 6d 6e 3d 3d 31 20 29  rt( nColumn==1 )
60b0: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
60c0: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4e  dbeAddOp(v, OP_N
60d0: 6f 74 4e 75 6c 6c 2c 20 2d 31 2c 20 73 71 6c 69  otNull, -1, sqli
60e0: 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64  te3VdbeCurrentAd
60f0: 64 72 28 76 29 2b 33 29 3b 0a 20 20 20 20 20 20  dr(v)+3);.      
6100: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
6110: 28 76 2c 20 4f 50 5f 50 6f 70 2c 20 31 2c 20 30  (v, OP_Pop, 1, 0
6120: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
6130: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
6140: 47 6f 74 6f 2c 20 30 2c 20 73 71 6c 69 74 65 33  Goto, 0, sqlite3
6150: 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28  VdbeCurrentAddr(
6160: 76 29 2b 33 29 3b 0a 20 20 20 20 20 20 73 71 6c  v)+3);.      sql
6170: 69 74 65 33 56 64 62 65 4f 70 33 28 76 2c 20 4f  ite3VdbeOp3(v, O
6180: 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20 31 2c  P_MakeRecord, 1,
6190: 20 30 2c 20 26 70 2d 3e 61 66 66 69 6e 69 74 79   0, &p->affinity
61a0: 2c 20 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  , 1);.      sqli
61b0: 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
61c0: 4f 50 5f 49 64 78 49 6e 73 65 72 74 2c 20 28 69  OP_IdxInsert, (i
61d0: 50 61 72 6d 26 30 78 30 30 30 30 46 46 46 46 29  Parm&0x0000FFFF)
61e0: 2c 20 30 29 3b 0a 20 20 20 20 20 20 62 72 65 61  , 0);.      brea
61f0: 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  k;.    }.    cas
6200: 65 20 53 52 54 5f 4d 65 6d 3a 20 7b 0a 20 20 20  e SRT_Mem: {.   
6210: 20 20 20 61 73 73 65 72 74 28 20 6e 43 6f 6c 75     assert( nColu
6220: 6d 6e 3d 3d 31 20 29 3b 0a 20 20 20 20 20 20 73  mn==1 );.      s
6230: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
6240: 76 2c 20 4f 50 5f 4d 65 6d 53 74 6f 72 65 2c 20  v, OP_MemStore, 
6250: 69 50 61 72 6d 2c 20 31 29 3b 0a 20 20 20 20 20  iParm, 1);.     
6260: 20 2f 2a 20 54 68 65 20 4c 49 4d 49 54 20 63 6c   /* The LIMIT cl
6270: 61 75 73 65 20 77 69 6c 6c 20 74 65 72 6d 69 6e  ause will termin
6280: 61 74 65 20 74 68 65 20 6c 6f 6f 70 20 66 6f 72  ate the loop for
6290: 20 75 73 20 2a 2f 0a 20 20 20 20 20 20 62 72 65   us */.      bre
62a0: 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66  ak;.    }.#endif
62b0: 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f 43 61  .    case SRT_Ca
62c0: 6c 6c 62 61 63 6b 3a 0a 20 20 20 20 63 61 73 65  llback:.    case
62d0: 20 53 52 54 5f 53 75 62 72 6f 75 74 69 6e 65 3a   SRT_Subroutine:
62e0: 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 3b 0a   {.      int i;.
62f0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
6300: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49 6e 73  eAddOp(v, OP_Ins
6310: 65 72 74 2c 20 70 73 65 75 64 6f 54 61 62 2c 20  ert, pseudoTab, 
6320: 30 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d  0);.      for(i=
6330: 30 3b 20 69 3c 6e 43 6f 6c 75 6d 6e 3b 20 69 2b  0; i<nColumn; i+
6340: 2b 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  +){.        sqli
6350: 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
6360: 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 70 73 65 75 64  OP_Column, pseud
6370: 6f 54 61 62 2c 20 69 29 3b 0a 20 20 20 20 20 20  oTab, i);.      
6380: 7d 0a 20 20 20 20 20 20 69 66 28 20 65 44 65 73  }.      if( eDes
6390: 74 3d 3d 53 52 54 5f 43 61 6c 6c 62 61 63 6b 20  t==SRT_Callback 
63a0: 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
63b0: 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
63c0: 50 5f 43 61 6c 6c 62 61 63 6b 2c 20 6e 43 6f 6c  P_Callback, nCol
63d0: 75 6d 6e 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d  umn, 0);.      }
63e0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71  else{.        sq
63f0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
6400: 2c 20 4f 50 5f 47 6f 73 75 62 2c 20 30 2c 20 69  , OP_Gosub, 0, i
6410: 50 61 72 6d 29 3b 0a 20 20 20 20 20 20 7d 0a 20  Parm);.      }. 
6420: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
6430: 7d 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20 7b  }.    default: {
6440: 0a 20 20 20 20 20 20 2f 2a 20 44 6f 20 6e 6f 74  .      /* Do not
6450: 68 69 6e 67 20 2a 2f 0a 20 20 20 20 20 20 62 72  hing */.      br
6460: 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  eak;.    }.  }..
6470: 20 20 2f 2a 20 4a 75 6d 70 20 74 6f 20 74 68 65    /* Jump to the
6480: 20 65 6e 64 20 6f 66 20 74 68 65 20 6c 6f 6f 70   end of the loop
6490: 20 77 68 65 6e 20 74 68 65 20 4c 49 4d 49 54 20   when the LIMIT 
64a0: 69 73 20 72 65 61 63 68 65 64 0a 20 20 2a 2f 0a  is reached.  */.
64b0: 20 20 69 66 28 20 70 2d 3e 69 4c 69 6d 69 74 3e    if( p->iLimit>
64c0: 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  =0 ){.    sqlite
64d0: 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
64e0: 5f 4d 65 6d 49 6e 63 72 2c 20 2d 31 2c 20 70 2d  _MemIncr, -1, p-
64f0: 3e 69 4c 69 6d 69 74 29 3b 0a 20 20 20 20 73 71  >iLimit);.    sq
6500: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
6510: 2c 20 4f 50 5f 49 66 4d 65 6d 5a 65 72 6f 2c 20  , OP_IfMemZero, 
6520: 70 2d 3e 69 4c 69 6d 69 74 2c 20 62 72 6b 29 3b  p->iLimit, brk);
6530: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 62  .  }..  /* The b
6540: 6f 74 74 6f 6d 20 6f 66 20 74 68 65 20 6c 6f 6f  ottom of the loo
6550: 70 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  p.  */.  sqlite3
6560: 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c  VdbeResolveLabel
6570: 28 76 2c 20 63 6f 6e 74 29 3b 0a 20 20 73 71 6c  (v, cont);.  sql
6580: 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
6590: 20 4f 50 5f 4e 65 78 74 2c 20 69 54 61 62 2c 20   OP_Next, iTab, 
65a0: 61 64 64 72 29 3b 0a 20 20 73 71 6c 69 74 65 33  addr);.  sqlite3
65b0: 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c  VdbeResolveLabel
65c0: 28 76 2c 20 62 72 6b 29 3b 0a 20 20 69 66 28 20  (v, brk);.  if( 
65d0: 65 44 65 73 74 3d 3d 53 52 54 5f 43 61 6c 6c 62  eDest==SRT_Callb
65e0: 61 63 6b 20 7c 7c 20 65 44 65 73 74 3d 3d 53 52  ack || eDest==SR
65f0: 54 5f 53 75 62 72 6f 75 74 69 6e 65 20 29 7b 0a  T_Subroutine ){.
6600: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
6610: 64 64 4f 70 28 76 2c 20 4f 50 5f 43 6c 6f 73 65  ddOp(v, OP_Close
6620: 2c 20 70 73 65 75 64 6f 54 61 62 2c 20 30 29 3b  , pseudoTab, 0);
6630: 0a 20 20 7d 0a 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  .  }..}../*.** R
6640: 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20  eturn a pointer 
6650: 74 6f 20 61 20 73 74 72 69 6e 67 20 63 6f 6e 74  to a string cont
6660: 61 69 6e 69 6e 67 20 74 68 65 20 27 64 65 63 6c  aining the 'decl
6670: 61 72 61 74 69 6f 6e 20 74 79 70 65 27 20 6f 66  aration type' of
6680: 20 74 68 65 0a 2a 2a 20 65 78 70 72 65 73 73 69   the.** expressi
6690: 6f 6e 20 70 45 78 70 72 2e 20 54 68 65 20 73 74  on pExpr. The st
66a0: 72 69 6e 67 20 6d 61 79 20 62 65 20 74 72 65 61  ring may be trea
66b0: 74 65 64 20 61 73 20 73 74 61 74 69 63 20 62 79  ted as static by
66c0: 20 74 68 65 20 63 61 6c 6c 65 72 2e 0a 2a 2a 0a   the caller..**.
66d0: 2a 2a 20 54 68 65 20 64 65 63 6c 61 72 61 74 69  ** The declarati
66e0: 6f 6e 20 74 79 70 65 20 69 73 20 74 68 65 20 65  on type is the e
66f0: 78 61 63 74 20 64 61 74 61 74 79 70 65 20 64 65  xact datatype de
6700: 66 69 6e 69 74 69 6f 6e 20 65 78 74 72 61 63 74  finition extract
6710: 65 64 20 66 72 6f 6d 20 74 68 65 0a 2a 2a 20 6f  ed from the.** o
6720: 72 69 67 69 6e 61 6c 20 43 52 45 41 54 45 20 54  riginal CREATE T
6730: 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 20 69  ABLE statement i
6740: 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  f the expression
6750: 20 69 73 20 61 20 63 6f 6c 75 6d 6e 2e 20 54 68   is a column. Th
6760: 65 0a 2a 2a 20 64 65 63 6c 61 72 61 74 69 6f 6e  e.** declaration
6770: 20 74 79 70 65 20 66 6f 72 20 61 20 52 4f 57 49   type for a ROWI
6780: 44 20 66 69 65 6c 64 20 69 73 20 49 4e 54 45 47  D field is INTEG
6790: 45 52 2e 20 45 78 61 63 74 6c 79 20 77 68 65 6e  ER. Exactly when
67a0: 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 0a 2a   an expression.*
67b0: 2a 20 69 73 20 63 6f 6e 73 69 64 65 72 65 64 20  * is considered 
67c0: 61 20 63 6f 6c 75 6d 6e 20 63 61 6e 20 62 65 20  a column can be 
67d0: 63 6f 6d 70 6c 65 78 20 69 6e 20 74 68 65 20 70  complex in the p
67e0: 72 65 73 65 6e 63 65 20 6f 66 20 73 75 62 71 75  resence of subqu
67f0: 65 72 69 65 73 2e 20 54 68 65 0a 2a 2a 20 72 65  eries. The.** re
6800: 73 75 6c 74 2d 73 65 74 20 65 78 70 72 65 73 73  sult-set express
6810: 69 6f 6e 20 69 6e 20 61 6c 6c 20 6f 66 20 74 68  ion in all of th
6820: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 53 45 4c 45  e following SELE
6830: 43 54 20 73 74 61 74 65 6d 65 6e 74 73 20 69 73  CT statements is
6840: 20 0a 2a 2a 20 63 6f 6e 73 69 64 65 72 65 64 20   .** considered 
6850: 61 20 63 6f 6c 75 6d 6e 20 62 79 20 74 68 69 73  a column by this
6860: 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a   function..**.**
6870: 20 20 20 53 45 4c 45 43 54 20 63 6f 6c 20 46 52     SELECT col FR
6880: 4f 4d 20 74 62 6c 3b 0a 2a 2a 20 20 20 53 45 4c  OM tbl;.**   SEL
6890: 45 43 54 20 28 53 45 4c 45 43 54 20 63 6f 6c 20  ECT (SELECT col 
68a0: 46 52 4f 4d 20 74 62 6c 3b 0a 2a 2a 20 20 20 53  FROM tbl;.**   S
68b0: 45 4c 45 43 54 20 28 53 45 4c 45 43 54 20 63 6f  ELECT (SELECT co
68c0: 6c 20 46 52 4f 4d 20 74 62 6c 29 3b 0a 2a 2a 20  l FROM tbl);.** 
68d0: 20 20 53 45 4c 45 43 54 20 61 62 63 20 46 52 4f    SELECT abc FRO
68e0: 4d 20 28 53 45 4c 45 43 54 20 63 6f 6c 20 41 53  M (SELECT col AS
68f0: 20 61 62 63 20 46 52 4f 4d 20 74 62 6c 29 3b 0a   abc FROM tbl);.
6900: 2a 2a 20 0a 2a 2a 20 54 68 65 20 64 65 63 6c 61  ** .** The decla
6910: 72 61 74 69 6f 6e 20 74 79 70 65 20 66 6f 72 20  ration type for 
6920: 61 6e 79 20 65 78 70 72 65 73 73 69 6f 6e 20 6f  any expression o
6930: 74 68 65 72 20 74 68 61 6e 20 61 20 63 6f 6c 75  ther than a colu
6940: 6d 6e 20 69 73 20 4e 55 4c 4c 2e 0a 2a 2f 0a 73  mn is NULL..*/.s
6950: 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72  tatic const char
6960: 20 2a 63 6f 6c 75 6d 6e 54 79 70 65 28 0a 20 20   *columnType(.  
6970: 4e 61 6d 65 43 6f 6e 74 65 78 74 20 2a 70 4e 43  NameContext *pNC
6980: 2c 20 0a 20 20 45 78 70 72 20 2a 70 45 78 70 72  , .  Expr *pExpr
6990: 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  ,.  const char *
69a0: 2a 70 7a 4f 72 69 67 69 6e 44 62 2c 0a 20 20 63  *pzOriginDb,.  c
69b0: 6f 6e 73 74 20 63 68 61 72 20 2a 2a 70 7a 4f 72  onst char **pzOr
69c0: 69 67 69 6e 54 61 62 2c 0a 20 20 63 6f 6e 73 74  iginTab,.  const
69d0: 20 63 68 61 72 20 2a 2a 70 7a 4f 72 69 67 69 6e   char **pzOrigin
69e0: 43 6f 6c 0a 29 7b 0a 20 20 63 68 61 72 20 63 6f  Col.){.  char co
69f0: 6e 73 74 20 2a 7a 54 79 70 65 20 3d 20 30 3b 0a  nst *zType = 0;.
6a00: 20 20 63 68 61 72 20 63 6f 6e 73 74 20 2a 7a 4f    char const *zO
6a10: 72 69 67 69 6e 44 62 20 3d 20 30 3b 0a 20 20 63  riginDb = 0;.  c
6a20: 68 61 72 20 63 6f 6e 73 74 20 2a 7a 4f 72 69 67  har const *zOrig
6a30: 69 6e 54 61 62 20 3d 20 30 3b 0a 20 20 63 68 61  inTab = 0;.  cha
6a40: 72 20 63 6f 6e 73 74 20 2a 7a 4f 72 69 67 69 6e  r const *zOrigin
6a50: 43 6f 6c 20 3d 20 30 3b 0a 20 20 69 6e 74 20 6a  Col = 0;.  int j
6a60: 3b 0a 20 20 69 66 28 20 70 45 78 70 72 3d 3d 30  ;.  if( pExpr==0
6a70: 20 7c 7c 20 70 4e 43 2d 3e 70 53 72 63 4c 69 73   || pNC->pSrcLis
6a80: 74 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b  t==0 ) return 0;
6a90: 0a 0a 20 20 73 77 69 74 63 68 28 20 70 45 78 70  ..  switch( pExp
6aa0: 72 2d 3e 6f 70 20 29 7b 0a 20 20 20 20 63 61 73  r->op ){.    cas
6ab0: 65 20 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 3a  e TK_AGG_COLUMN:
6ac0: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 43 4f 4c  .    case TK_COL
6ad0: 55 4d 4e 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20  UMN: {.      /* 
6ae0: 54 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69  The expression i
6af0: 73 20 61 20 63 6f 6c 75 6d 6e 2e 20 4c 6f 63 61  s a column. Loca
6b00: 74 65 20 74 68 65 20 74 61 62 6c 65 20 74 68 65  te the table the
6b10: 20 63 6f 6c 75 6d 6e 20 69 73 20 62 65 69 6e 67   column is being
6b20: 0a 20 20 20 20 20 20 2a 2a 20 65 78 74 72 61 63  .      ** extrac
6b30: 74 65 64 20 66 72 6f 6d 20 69 6e 20 4e 61 6d 65  ted from in Name
6b40: 43 6f 6e 74 65 78 74 2e 70 53 72 63 4c 69 73 74  Context.pSrcList
6b50: 2e 20 54 68 69 73 20 74 61 62 6c 65 20 6d 61 79  . This table may
6b60: 20 62 65 20 72 65 61 6c 0a 20 20 20 20 20 20 2a   be real.      *
6b70: 2a 20 64 61 74 61 62 61 73 65 20 74 61 62 6c 65  * database table
6b80: 20 6f 72 20 61 20 73 75 62 71 75 65 72 79 2e 0a   or a subquery..
6b90: 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 54        */.      T
6ba0: 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 30 3b 20  able *pTab = 0; 
6bb0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 61             /* Ta
6bc0: 62 6c 65 20 73 74 72 75 63 74 75 72 65 20 63 6f  ble structure co
6bd0: 6c 75 6d 6e 20 69 73 20 65 78 74 72 61 63 74 65  lumn is extracte
6be0: 64 20 66 72 6f 6d 20 2a 2f 0a 20 20 20 20 20 20  d from */.      
6bf0: 53 65 6c 65 63 74 20 2a 70 53 20 3d 20 30 3b 20  Select *pS = 0; 
6c00: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
6c10: 65 6c 65 63 74 20 74 68 65 20 63 6f 6c 75 6d 6e  elect the column
6c20: 20 69 73 20 65 78 74 72 61 63 74 65 64 20 66 72   is extracted fr
6c30: 6f 6d 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20  om */.      int 
6c40: 69 43 6f 6c 20 3d 20 70 45 78 70 72 2d 3e 69 43  iCol = pExpr->iC
6c50: 6f 6c 75 6d 6e 3b 20 20 2f 2a 20 49 6e 64 65 78  olumn;  /* Index
6c60: 20 6f 66 20 63 6f 6c 75 6d 6e 20 69 6e 20 70 54   of column in pT
6c70: 61 62 20 2a 2f 0a 20 20 20 20 20 20 77 68 69 6c  ab */.      whil
6c80: 65 28 20 70 4e 43 20 26 26 20 21 70 54 61 62 20  e( pNC && !pTab 
6c90: 29 7b 0a 20 20 20 20 20 20 20 20 53 72 63 4c 69  ){.        SrcLi
6ca0: 73 74 20 2a 70 54 61 62 4c 69 73 74 20 3d 20 70  st *pTabList = p
6cb0: 4e 43 2d 3e 70 53 72 63 4c 69 73 74 3b 0a 20 20  NC->pSrcList;.  
6cc0: 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 6a 3c        for(j=0;j<
6cd0: 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 20 26  pTabList->nSrc &
6ce0: 26 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 6a 5d  & pTabList->a[j]
6cf0: 2e 69 43 75 72 73 6f 72 21 3d 70 45 78 70 72 2d  .iCursor!=pExpr-
6d00: 3e 69 54 61 62 6c 65 3b 6a 2b 2b 29 3b 0a 20 20  >iTable;j++);.  
6d10: 20 20 20 20 20 20 69 66 28 20 6a 3c 70 54 61 62        if( j<pTab
6d20: 4c 69 73 74 2d 3e 6e 53 72 63 20 29 7b 0a 20 20  List->nSrc ){.  
6d30: 20 20 20 20 20 20 20 20 70 54 61 62 20 3d 20 70          pTab = p
6d40: 54 61 62 4c 69 73 74 2d 3e 61 5b 6a 5d 2e 70 54  TabList->a[j].pT
6d50: 61 62 3b 0a 20 20 20 20 20 20 20 20 20 20 70 53  ab;.          pS
6d60: 20 3d 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 6a   = pTabList->a[j
6d70: 5d 2e 70 53 65 6c 65 63 74 3b 0a 20 20 20 20 20  ].pSelect;.     
6d80: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
6d90: 20 20 20 20 70 4e 43 20 3d 20 70 4e 43 2d 3e 70      pNC = pNC->p
6da0: 4e 65 78 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a  Next;.        }.
6db0: 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 69        }..      i
6dc0: 66 28 20 70 54 61 62 3d 3d 30 20 29 7b 0a 20 20  f( pTab==0 ){.  
6dd0: 20 20 20 20 20 20 2f 2a 20 46 49 58 20 4d 45 3a        /* FIX ME:
6de0: 0a 20 20 20 20 20 20 20 20 2a 2a 20 54 68 69 73  .        ** This
6df0: 20 63 61 6e 20 6f 63 63 75 72 73 20 69 66 20 79   can occurs if y
6e00: 6f 75 20 68 61 76 65 20 73 6f 6d 65 74 68 69 6e  ou have somethin
6e10: 67 20 6c 69 6b 65 20 22 53 45 4c 45 43 54 20 6e  g like "SELECT n
6e20: 65 77 2e 78 3b 22 20 69 6e 73 69 64 65 0a 20 20  ew.x;" inside.  
6e30: 20 20 20 20 20 20 2a 2a 20 61 20 74 72 69 67 67        ** a trigg
6e40: 65 72 2e 20 20 49 6e 20 6f 74 68 65 72 20 77 6f  er.  In other wo
6e50: 72 64 73 2c 20 69 66 20 79 6f 75 20 72 65 66 65  rds, if you refe
6e60: 72 65 6e 63 65 20 74 68 65 20 73 70 65 63 69 61  rence the specia
6e70: 6c 20 22 6e 65 77 22 0a 20 20 20 20 20 20 20 20  l "new".        
6e80: 2a 2a 20 74 61 62 6c 65 20 69 6e 20 74 68 65 20  ** table in the 
6e90: 72 65 73 75 6c 74 20 73 65 74 20 6f 66 20 61 20  result set of a 
6ea0: 73 65 6c 65 63 74 2e 20 20 57 65 20 64 6f 20 6e  select.  We do n
6eb0: 6f 74 20 68 61 76 65 20 61 20 67 6f 6f 64 20 77  ot have a good w
6ec0: 61 79 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 6f  ay.        ** to
6ed0: 20 66 69 6e 64 20 74 68 65 20 61 63 74 75 61 6c   find the actual
6ee0: 20 74 61 62 6c 65 20 74 79 70 65 2c 20 73 6f 20   table type, so 
6ef0: 63 61 6c 6c 20 69 74 20 22 54 45 58 54 22 2e 20  call it "TEXT". 
6f00: 20 54 68 69 73 20 69 73 20 72 65 61 6c 6c 79 0a   This is really.
6f10: 20 20 20 20 20 20 20 20 2a 2a 20 73 6f 6d 65 74          ** somet
6f20: 68 69 6e 67 20 6f 66 20 61 20 62 75 67 2c 20 62  hing of a bug, b
6f30: 75 74 20 49 20 64 6f 20 6e 6f 74 20 6b 6e 6f 77  ut I do not know
6f40: 20 68 6f 77 20 74 6f 20 66 69 78 20 69 74 2e 0a   how to fix it..
6f50: 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20          **.     
6f60: 20 20 20 2a 2a 20 54 68 69 73 20 63 6f 64 65 20     ** This code 
6f70: 64 6f 65 73 20 6e 6f 74 20 70 72 6f 64 75 63 65  does not produce
6f80: 20 74 68 65 20 63 6f 72 72 65 63 74 20 61 6e 73   the correct ans
6f90: 77 65 72 20 2d 20 69 74 20 6a 75 73 74 20 70 72  wer - it just pr
6fa0: 65 76 65 6e 74 73 0a 20 20 20 20 20 20 20 20 2a  events.        *
6fb0: 2a 20 61 20 73 65 67 66 61 75 6c 74 2e 20 20 53  * a segfault.  S
6fc0: 65 65 20 74 69 63 6b 65 74 20 23 31 32 32 39 2e  ee ticket #1229.
6fd0: 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  .        */.    
6fe0: 20 20 20 20 7a 54 79 70 65 20 3d 20 22 54 45 58      zType = "TEX
6ff0: 54 22 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61  T";.        brea
7000: 6b 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  k;.      }..    
7010: 20 20 61 73 73 65 72 74 28 20 70 54 61 62 20 29    assert( pTab )
7020: 3b 0a 20 20 20 20 20 20 69 66 28 20 70 53 20 29  ;.      if( pS )
7030: 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65  {.        /* The
7040: 20 22 74 61 62 6c 65 22 20 69 73 20 61 63 74 75   "table" is actu
7050: 61 6c 6c 79 20 61 20 73 75 62 2d 73 65 6c 65 63  ally a sub-selec
7060: 74 20 6f 72 20 61 20 76 69 65 77 20 69 6e 20 74  t or a view in t
7070: 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 0a 20  he FROM clause. 
7080: 20 20 20 20 20 20 20 2a 2a 20 6f 66 20 74 68 65         ** of the
7090: 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
70a0: 74 2e 20 52 65 74 75 72 6e 20 74 68 65 20 64 65  t. Return the de
70b0: 63 6c 61 72 61 74 69 6f 6e 20 74 79 70 65 20 61  claration type a
70c0: 6e 64 20 6f 72 69 67 69 6e 0a 20 20 20 20 20 20  nd origin.      
70d0: 20 20 2a 2a 20 64 61 74 61 20 66 6f 72 20 74 68    ** data for th
70e0: 65 20 72 65 73 75 6c 74 2d 73 65 74 20 63 6f 6c  e result-set col
70f0: 75 6d 6e 20 6f 66 20 74 68 65 20 73 75 62 2d 73  umn of the sub-s
7100: 65 6c 65 63 74 2e 0a 20 20 20 20 20 20 20 20 2a  elect..        *
7110: 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20 69 43  /.        if( iC
7120: 6f 6c 3e 3d 30 20 26 26 20 69 43 6f 6c 3c 70 53  ol>=0 && iCol<pS
7130: 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 20  ->pEList->nExpr 
7140: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ){.          /* 
7150: 49 66 20 69 43 6f 6c 20 69 73 20 6c 65 73 73 20  If iCol is less 
7160: 74 68 61 6e 20 7a 65 72 6f 2c 20 74 68 65 6e 20  than zero, then 
7170: 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 72  the expression r
7180: 65 71 75 65 73 74 73 20 74 68 65 0a 20 20 20 20  equests the.    
7190: 20 20 20 20 20 20 2a 2a 20 72 6f 77 69 64 20 6f        ** rowid o
71a0: 66 20 74 68 65 20 73 75 62 2d 73 65 6c 65 63 74  f the sub-select
71b0: 20 6f 72 20 76 69 65 77 2e 20 54 68 69 73 20 65   or view. This e
71c0: 78 70 72 65 73 73 69 6f 6e 20 69 73 20 6c 65 67  xpression is leg
71d0: 61 6c 20 28 73 65 65 20 0a 20 20 20 20 20 20 20  al (see .       
71e0: 20 20 20 2a 2a 20 74 65 73 74 20 63 61 73 65 20     ** test case 
71f0: 6d 69 73 63 32 2e 32 2e 32 29 20 2d 20 69 74 20  misc2.2.2) - it 
7200: 61 6c 77 61 79 73 20 65 76 61 6c 75 61 74 65 73  always evaluates
7210: 20 74 6f 20 4e 55 4c 4c 2e 0a 20 20 20 20 20 20   to NULL..      
7220: 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20      */.         
7230: 20 4e 61 6d 65 43 6f 6e 74 65 78 74 20 73 4e 43   NameContext sNC
7240: 3b 0a 20 20 20 20 20 20 20 20 20 20 45 78 70 72  ;.          Expr
7250: 20 2a 70 20 3d 20 70 53 2d 3e 70 45 4c 69 73 74   *p = pS->pEList
7260: 2d 3e 61 5b 69 43 6f 6c 5d 2e 70 45 78 70 72 3b  ->a[iCol].pExpr;
7270: 0a 20 20 20 20 20 20 20 20 20 20 73 4e 43 2e 70  .          sNC.p
7280: 53 72 63 4c 69 73 74 20 3d 20 70 53 2d 3e 70 53  SrcList = pS->pS
7290: 72 63 3b 0a 20 20 20 20 20 20 20 20 20 20 73 4e  rc;.          sN
72a0: 43 2e 70 4e 65 78 74 20 3d 20 30 3b 0a 20 20 20  C.pNext = 0;.   
72b0: 20 20 20 20 20 20 20 73 4e 43 2e 70 50 61 72 73         sNC.pPars
72c0: 65 20 3d 20 70 4e 43 2d 3e 70 50 61 72 73 65 3b  e = pNC->pParse;
72d0: 0a 20 20 20 20 20 20 20 20 20 20 7a 54 79 70 65  .          zType
72e0: 20 3d 20 63 6f 6c 75 6d 6e 54 79 70 65 28 26 73   = columnType(&s
72f0: 4e 43 2c 20 70 2c 20 26 7a 4f 72 69 67 69 6e 44  NC, p, &zOriginD
7300: 62 2c 20 26 7a 4f 72 69 67 69 6e 54 61 62 2c 20  b, &zOriginTab, 
7310: 26 7a 4f 72 69 67 69 6e 43 6f 6c 29 3b 20 0a 20  &zOriginCol); . 
7320: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
7330: 65 6c 73 65 20 69 66 28 20 70 54 61 62 2d 3e 70  else if( pTab->p
7340: 53 63 68 65 6d 61 20 29 7b 0a 20 20 20 20 20 20  Schema ){.      
7350: 20 20 2f 2a 20 41 20 72 65 61 6c 20 74 61 62 6c    /* A real tabl
7360: 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 61 73 73  e */.        ass
7370: 65 72 74 28 20 21 70 53 20 29 3b 0a 20 20 20 20  ert( !pS );.    
7380: 20 20 20 20 69 66 28 20 69 43 6f 6c 3c 30 20 29      if( iCol<0 )
7390: 20 69 43 6f 6c 20 3d 20 70 54 61 62 2d 3e 69 50   iCol = pTab->iP
73a0: 4b 65 79 3b 0a 20 20 20 20 20 20 20 20 61 73 73  Key;.        ass
73b0: 65 72 74 28 20 69 43 6f 6c 3d 3d 2d 31 20 7c 7c  ert( iCol==-1 ||
73c0: 20 28 69 43 6f 6c 3e 3d 30 20 26 26 20 69 43 6f   (iCol>=0 && iCo
73d0: 6c 3c 70 54 61 62 2d 3e 6e 43 6f 6c 29 20 29 3b  l<pTab->nCol) );
73e0: 0a 20 20 20 20 20 20 20 20 69 66 28 20 69 43 6f  .        if( iCo
73f0: 6c 3c 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  l<0 ){.         
7400: 20 7a 54 79 70 65 20 3d 20 22 49 4e 54 45 47 45   zType = "INTEGE
7410: 52 22 3b 0a 20 20 20 20 20 20 20 20 20 20 7a 4f  R";.          zO
7420: 72 69 67 69 6e 43 6f 6c 20 3d 20 22 72 6f 77 69  riginCol = "rowi
7430: 64 22 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  d";.        }els
7440: 65 7b 0a 20 20 20 20 20 20 20 20 20 20 7a 54 79  e{.          zTy
7450: 70 65 20 3d 20 70 54 61 62 2d 3e 61 43 6f 6c 5b  pe = pTab->aCol[
7460: 69 43 6f 6c 5d 2e 7a 54 79 70 65 3b 0a 20 20 20  iCol].zType;.   
7470: 20 20 20 20 20 20 20 7a 4f 72 69 67 69 6e 43 6f         zOriginCo
7480: 6c 20 3d 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 69  l = pTab->aCol[i
7490: 43 6f 6c 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20  Col].zName;.    
74a0: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7a 4f      }.        zO
74b0: 72 69 67 69 6e 54 61 62 20 3d 20 70 54 61 62 2d  riginTab = pTab-
74c0: 3e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20 20 20  >zName;.        
74d0: 69 66 28 20 70 4e 43 2d 3e 70 50 61 72 73 65 20  if( pNC->pParse 
74e0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74  ){.          int
74f0: 20 69 44 62 20 3d 20 73 71 6c 69 74 65 33 53 63   iDb = sqlite3Sc
7500: 68 65 6d 61 54 6f 49 6e 64 65 78 28 70 4e 43 2d  hemaToIndex(pNC-
7510: 3e 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 54 61  >pParse->db, pTa
7520: 62 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20 20  b->pSchema);.   
7530: 20 20 20 20 20 20 20 7a 4f 72 69 67 69 6e 44 62         zOriginDb
7540: 20 3d 20 70 4e 43 2d 3e 70 50 61 72 73 65 2d 3e   = pNC->pParse->
7550: 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a 4e 61  db->aDb[iDb].zNa
7560: 6d 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  me;.        }.  
7570: 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61      }.      brea
7580: 6b 3b 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65 66  k;.    }.#ifndef
7590: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42   SQLITE_OMIT_SUB
75a0: 51 55 45 52 59 0a 20 20 20 20 63 61 73 65 20 54  QUERY.    case T
75b0: 4b 5f 53 45 4c 45 43 54 3a 20 7b 0a 20 20 20 20  K_SELECT: {.    
75c0: 20 20 2f 2a 20 54 68 65 20 65 78 70 72 65 73 73    /* The express
75d0: 69 6f 6e 20 69 73 20 61 20 73 75 62 2d 73 65 6c  ion is a sub-sel
75e0: 65 63 74 2e 20 52 65 74 75 72 6e 20 74 68 65 20  ect. Return the 
75f0: 64 65 63 6c 61 72 61 74 69 6f 6e 20 74 79 70 65  declaration type
7600: 20 61 6e 64 0a 20 20 20 20 20 20 2a 2a 20 6f 72   and.      ** or
7610: 69 67 69 6e 20 69 6e 66 6f 20 66 6f 72 20 74 68  igin info for th
7620: 65 20 73 69 6e 67 6c 65 20 63 6f 6c 75 6d 6e 20  e single column 
7630: 69 6e 20 74 68 65 20 72 65 73 75 6c 74 20 73 65  in the result se
7640: 74 20 6f 66 20 74 68 65 20 53 45 4c 45 43 54 0a  t of the SELECT.
7650: 20 20 20 20 20 20 2a 2a 20 73 74 61 74 65 6d 65        ** stateme
7660: 6e 74 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  nt..      */.   
7670: 20 20 20 4e 61 6d 65 43 6f 6e 74 65 78 74 20 73     NameContext s
7680: 4e 43 3b 0a 20 20 20 20 20 20 53 65 6c 65 63 74  NC;.      Select
7690: 20 2a 70 53 20 3d 20 70 45 78 70 72 2d 3e 70 53   *pS = pExpr->pS
76a0: 65 6c 65 63 74 3b 0a 20 20 20 20 20 20 45 78 70  elect;.      Exp
76b0: 72 20 2a 70 20 3d 20 70 53 2d 3e 70 45 4c 69 73  r *p = pS->pELis
76c0: 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 3b 0a 20  t->a[0].pExpr;. 
76d0: 20 20 20 20 20 73 4e 43 2e 70 53 72 63 4c 69 73       sNC.pSrcLis
76e0: 74 20 3d 20 70 53 2d 3e 70 53 72 63 3b 0a 20 20  t = pS->pSrc;.  
76f0: 20 20 20 20 73 4e 43 2e 70 4e 65 78 74 20 3d 20      sNC.pNext = 
7700: 70 4e 43 3b 0a 20 20 20 20 20 20 73 4e 43 2e 70  pNC;.      sNC.p
7710: 50 61 72 73 65 20 3d 20 70 4e 43 2d 3e 70 50 61  Parse = pNC->pPa
7720: 72 73 65 3b 0a 20 20 20 20 20 20 7a 54 79 70 65  rse;.      zType
7730: 20 3d 20 63 6f 6c 75 6d 6e 54 79 70 65 28 26 73   = columnType(&s
7740: 4e 43 2c 20 70 2c 20 26 7a 4f 72 69 67 69 6e 44  NC, p, &zOriginD
7750: 62 2c 20 26 7a 4f 72 69 67 69 6e 54 61 62 2c 20  b, &zOriginTab, 
7760: 26 7a 4f 72 69 67 69 6e 43 6f 6c 29 3b 20 0a 20  &zOriginCol); . 
7770: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
7780: 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 20 20 0a  }.#endif.  }.  .
7790: 20 20 69 66 28 20 70 7a 4f 72 69 67 69 6e 44 62    if( pzOriginDb
77a0: 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
77b0: 70 7a 4f 72 69 67 69 6e 54 61 62 20 26 26 20 70  pzOriginTab && p
77c0: 7a 4f 72 69 67 69 6e 43 6f 6c 20 29 3b 0a 20 20  zOriginCol );.  
77d0: 20 20 2a 70 7a 4f 72 69 67 69 6e 44 62 20 3d 20    *pzOriginDb = 
77e0: 7a 4f 72 69 67 69 6e 44 62 3b 0a 20 20 20 20 2a  zOriginDb;.    *
77f0: 70 7a 4f 72 69 67 69 6e 54 61 62 20 3d 20 7a 4f  pzOriginTab = zO
7800: 72 69 67 69 6e 54 61 62 3b 0a 20 20 20 20 2a 70  riginTab;.    *p
7810: 7a 4f 72 69 67 69 6e 43 6f 6c 20 3d 20 7a 4f 72  zOriginCol = zOr
7820: 69 67 69 6e 43 6f 6c 3b 0a 20 20 7d 0a 20 20 72  iginCol;.  }.  r
7830: 65 74 75 72 6e 20 7a 54 79 70 65 3b 0a 7d 0a 0a  eturn zType;.}..
7840: 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63  /*.** Generate c
7850: 6f 64 65 20 74 68 61 74 20 77 69 6c 6c 20 74 65  ode that will te
7860: 6c 6c 20 74 68 65 20 56 44 42 45 20 74 68 65 20  ll the VDBE the 
7870: 64 65 63 6c 61 72 61 74 69 6f 6e 20 74 79 70 65  declaration type
7880: 73 20 6f 66 20 63 6f 6c 75 6d 6e 73 0a 2a 2a 20  s of columns.** 
7890: 69 6e 20 74 68 65 20 72 65 73 75 6c 74 20 73 65  in the result se
78a0: 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  t..*/.static voi
78b0: 64 20 67 65 6e 65 72 61 74 65 43 6f 6c 75 6d 6e  d generateColumn
78c0: 54 79 70 65 73 28 0a 20 20 50 61 72 73 65 20 2a  Types(.  Parse *
78d0: 70 50 61 72 73 65 2c 20 20 20 20 20 20 2f 2a 20  pParse,      /* 
78e0: 50 61 72 73 65 72 20 63 6f 6e 74 65 78 74 20 2a  Parser context *
78f0: 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 54 61  /.  SrcList *pTa
7900: 62 4c 69 73 74 2c 20 20 2f 2a 20 4c 69 73 74 20  bList,  /* List 
7910: 6f 66 20 74 61 62 6c 65 73 20 2a 2f 0a 20 20 45  of tables */.  E
7920: 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 20  xprList *pEList 
7930: 20 20 20 2f 2a 20 45 78 70 72 65 73 73 69 6f 6e     /* Expression
7940: 73 20 64 65 66 69 6e 69 6e 67 20 74 68 65 20 72  s defining the r
7950: 65 73 75 6c 74 20 73 65 74 20 2a 2f 0a 29 7b 0a  esult set */.){.
7960: 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72    Vdbe *v = pPar
7970: 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74  se->pVdbe;.  int
7980: 20 69 3b 0a 20 20 4e 61 6d 65 43 6f 6e 74 65 78   i;.  NameContex
7990: 74 20 73 4e 43 3b 0a 20 20 73 4e 43 2e 70 53 72  t sNC;.  sNC.pSr
79a0: 63 4c 69 73 74 20 3d 20 70 54 61 62 4c 69 73 74  cList = pTabList
79b0: 3b 0a 20 20 73 4e 43 2e 70 50 61 72 73 65 20 3d  ;.  sNC.pParse =
79c0: 20 70 50 61 72 73 65 3b 0a 20 20 66 6f 72 28 69   pParse;.  for(i
79d0: 3d 30 3b 20 69 3c 70 45 4c 69 73 74 2d 3e 6e 45  =0; i<pEList->nE
79e0: 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 45  xpr; i++){.    E
79f0: 78 70 72 20 2a 70 20 3d 20 70 45 4c 69 73 74 2d  xpr *p = pEList-
7a00: 3e 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20  >a[i].pExpr;.   
7a10: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4f 72   const char *zOr
7a20: 69 67 44 62 20 3d 20 30 3b 0a 20 20 20 20 63 6f  igDb = 0;.    co
7a30: 6e 73 74 20 63 68 61 72 20 2a 7a 4f 72 69 67 54  nst char *zOrigT
7a40: 61 62 20 3d 20 30 3b 0a 20 20 20 20 63 6f 6e 73  ab = 0;.    cons
7a50: 74 20 63 68 61 72 20 2a 7a 4f 72 69 67 43 6f 6c  t char *zOrigCol
7a60: 20 3d 20 30 3b 0a 20 20 20 20 63 6f 6e 73 74 20   = 0;.    const 
7a70: 63 68 61 72 20 2a 7a 54 79 70 65 20 3d 20 63 6f  char *zType = co
7a80: 6c 75 6d 6e 54 79 70 65 28 26 73 4e 43 2c 20 70  lumnType(&sNC, p
7a90: 2c 20 26 7a 4f 72 69 67 44 62 2c 20 26 7a 4f 72  , &zOrigDb, &zOr
7aa0: 69 67 54 61 62 2c 20 26 7a 4f 72 69 67 43 6f 6c  igTab, &zOrigCol
7ab0: 29 3b 0a 0a 20 20 20 20 2f 2a 20 54 68 65 20 76  );..    /* The v
7ac0: 64 62 65 20 6d 75 73 74 20 6d 61 6b 65 20 69 74  dbe must make it
7ad0: 27 73 20 6f 77 6e 20 63 6f 70 79 20 6f 66 20 74  's own copy of t
7ae0: 68 65 20 63 6f 6c 75 6d 6e 2d 74 79 70 65 20 61  he column-type a
7af0: 6e 64 20 6f 74 68 65 72 20 0a 20 20 20 20 2a 2a  nd other .    **
7b00: 20 63 6f 6c 75 6d 6e 20 73 70 65 63 69 66 69 63   column specific
7b10: 20 73 74 72 69 6e 67 73 2c 20 69 6e 20 63 61 73   strings, in cas
7b20: 65 20 74 68 65 20 73 63 68 65 6d 61 20 69 73 20  e the schema is 
7b30: 72 65 73 65 74 20 62 65 66 6f 72 65 20 74 68 69  reset before thi
7b40: 73 0a 20 20 20 20 2a 2a 20 76 69 72 74 75 61 6c  s.    ** virtual
7b50: 20 6d 61 63 68 69 6e 65 20 69 73 20 64 65 6c 65   machine is dele
7b60: 74 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ted..    */.    
7b70: 73 71 6c 69 74 65 33 56 64 62 65 53 65 74 43 6f  sqlite3VdbeSetCo
7b80: 6c 4e 61 6d 65 28 76 2c 20 69 2c 20 43 4f 4c 4e  lName(v, i, COLN
7b90: 41 4d 45 5f 44 45 43 4c 54 59 50 45 2c 20 7a 54  AME_DECLTYPE, zT
7ba0: 79 70 65 2c 20 50 33 5f 54 52 41 4e 53 49 45 4e  ype, P3_TRANSIEN
7bb0: 54 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  T);.    sqlite3V
7bc0: 64 62 65 53 65 74 43 6f 6c 4e 61 6d 65 28 76 2c  dbeSetColName(v,
7bd0: 20 69 2c 20 43 4f 4c 4e 41 4d 45 5f 44 41 54 41   i, COLNAME_DATA
7be0: 42 41 53 45 2c 20 7a 4f 72 69 67 44 62 2c 20 50  BASE, zOrigDb, P
7bf0: 33 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a 20 20  3_TRANSIENT);.  
7c00: 20 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 74    sqlite3VdbeSet
7c10: 43 6f 6c 4e 61 6d 65 28 76 2c 20 69 2c 20 43 4f  ColName(v, i, CO
7c20: 4c 4e 41 4d 45 5f 54 41 42 4c 45 2c 20 7a 4f 72  LNAME_TABLE, zOr
7c30: 69 67 54 61 62 2c 20 50 33 5f 54 52 41 4e 53 49  igTab, P3_TRANSI
7c40: 45 4e 54 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  ENT);.    sqlite
7c50: 33 56 64 62 65 53 65 74 43 6f 6c 4e 61 6d 65 28  3VdbeSetColName(
7c60: 76 2c 20 69 2c 20 43 4f 4c 4e 41 4d 45 5f 43 4f  v, i, COLNAME_CO
7c70: 4c 55 4d 4e 2c 20 7a 4f 72 69 67 43 6f 6c 2c 20  LUMN, zOrigCol, 
7c80: 50 33 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a 20  P3_TRANSIENT);. 
7c90: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65   }.}../*.** Gene
7ca0: 72 61 74 65 20 63 6f 64 65 20 74 68 61 74 20 77  rate code that w
7cb0: 69 6c 6c 20 74 65 6c 6c 20 74 68 65 20 56 44 42  ill tell the VDB
7cc0: 45 20 74 68 65 20 6e 61 6d 65 73 20 6f 66 20 63  E the names of c
7cd0: 6f 6c 75 6d 6e 73 0a 2a 2a 20 69 6e 20 74 68 65  olumns.** in the
7ce0: 20 72 65 73 75 6c 74 20 73 65 74 2e 20 20 54 68   result set.  Th
7cf0: 69 73 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69  is information i
7d00: 73 20 75 73 65 64 20 74 6f 20 70 72 6f 76 69 64  s used to provid
7d10: 65 20 74 68 65 0a 2a 2a 20 61 7a 43 6f 6c 5b 5d  e the.** azCol[]
7d20: 20 76 61 6c 75 65 73 20 69 6e 20 74 68 65 20 63   values in the c
7d30: 61 6c 6c 62 61 63 6b 2e 0a 2a 2f 0a 73 74 61 74  allback..*/.stat
7d40: 69 63 20 76 6f 69 64 20 67 65 6e 65 72 61 74 65  ic void generate
7d50: 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 0a 20 20 50  ColumnNames(.  P
7d60: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
7d70: 20 20 20 2f 2a 20 50 61 72 73 65 72 20 63 6f 6e     /* Parser con
7d80: 74 65 78 74 20 2a 2f 0a 20 20 53 72 63 4c 69 73  text */.  SrcLis
7d90: 74 20 2a 70 54 61 62 4c 69 73 74 2c 20 20 2f 2a  t *pTabList,  /*
7da0: 20 4c 69 73 74 20 6f 66 20 74 61 62 6c 65 73 20   List of tables 
7db0: 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70  */.  ExprList *p
7dc0: 45 4c 69 73 74 20 20 20 20 2f 2a 20 45 78 70 72  EList    /* Expr
7dd0: 65 73 73 69 6f 6e 73 20 64 65 66 69 6e 69 6e 67  essions defining
7de0: 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 20   the result set 
7df0: 2a 2f 0a 29 7b 0a 20 20 56 64 62 65 20 2a 76 20  */.){.  Vdbe *v 
7e00: 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b  = pParse->pVdbe;
7e10: 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 73  .  int i, j;.  s
7e20: 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61  qlite3 *db = pPa
7e30: 72 73 65 2d 3e 64 62 3b 0a 20 20 69 6e 74 20 66  rse->db;.  int f
7e40: 75 6c 6c 4e 61 6d 65 73 2c 20 73 68 6f 72 74 4e  ullNames, shortN
7e50: 61 6d 65 73 3b 0a 0a 23 69 66 6e 64 65 66 20 53  ames;..#ifndef S
7e60: 51 4c 49 54 45 5f 4f 4d 49 54 5f 45 58 50 4c 41  QLITE_OMIT_EXPLA
7e70: 49 4e 0a 20 20 2f 2a 20 49 66 20 74 68 69 73 20  IN.  /* If this 
7e80: 69 73 20 61 6e 20 45 58 50 4c 41 49 4e 2c 20 73  is an EXPLAIN, s
7e90: 6b 69 70 20 74 68 69 73 20 73 74 65 70 20 2a 2f  kip this step */
7ea0: 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 65  .  if( pParse->e
7eb0: 78 70 6c 61 69 6e 20 29 7b 0a 20 20 20 20 72 65  xplain ){.    re
7ec0: 74 75 72 6e 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  turn;.  }.#endif
7ed0: 0a 0a 20 20 61 73 73 65 72 74 28 20 76 21 3d 30  ..  assert( v!=0
7ee0: 20 29 3b 0a 20 20 69 66 28 20 70 50 61 72 73 65   );.  if( pParse
7ef0: 2d 3e 63 6f 6c 4e 61 6d 65 73 53 65 74 20 7c 7c  ->colNamesSet ||
7f00: 20 76 3d 3d 30 20 7c 7c 20 64 62 2d 3e 6d 61 6c   v==0 || db->mal
7f10: 6c 6f 63 46 61 69 6c 65 64 20 29 20 72 65 74 75  locFailed ) retu
7f20: 72 6e 3b 0a 20 20 70 50 61 72 73 65 2d 3e 63 6f  rn;.  pParse->co
7f30: 6c 4e 61 6d 65 73 53 65 74 20 3d 20 31 3b 0a 20  lNamesSet = 1;. 
7f40: 20 66 75 6c 6c 4e 61 6d 65 73 20 3d 20 28 64 62   fullNames = (db
7f50: 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45  ->flags & SQLITE
7f60: 5f 46 75 6c 6c 43 6f 6c 4e 61 6d 65 73 29 21 3d  _FullColNames)!=
7f70: 30 3b 0a 20 20 73 68 6f 72 74 4e 61 6d 65 73 20  0;.  shortNames 
7f80: 3d 20 28 64 62 2d 3e 66 6c 61 67 73 20 26 20 53  = (db->flags & S
7f90: 51 4c 49 54 45 5f 53 68 6f 72 74 43 6f 6c 4e 61  QLITE_ShortColNa
7fa0: 6d 65 73 29 21 3d 30 3b 0a 20 20 73 71 6c 69 74  mes)!=0;.  sqlit
7fb0: 65 33 56 64 62 65 53 65 74 4e 75 6d 43 6f 6c 73  e3VdbeSetNumCols
7fc0: 28 76 2c 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70  (v, pEList->nExp
7fd0: 72 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69  r);.  for(i=0; i
7fe0: 3c 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20  <pEList->nExpr; 
7ff0: 69 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72 20 2a  i++){.    Expr *
8000: 70 3b 0a 20 20 20 20 70 20 3d 20 70 45 4c 69 73  p;.    p = pELis
8010: 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 20  t->a[i].pExpr;. 
8020: 20 20 20 69 66 28 20 70 3d 3d 30 20 29 20 63 6f     if( p==0 ) co
8030: 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69 66 28 20  ntinue;.    if( 
8040: 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61  pEList->a[i].zNa
8050: 6d 65 20 29 7b 0a 20 20 20 20 20 20 63 68 61 72  me ){.      char
8060: 20 2a 7a 4e 61 6d 65 20 3d 20 70 45 4c 69 73 74   *zName = pEList
8070: 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 3b 0a 20 20  ->a[i].zName;.  
8080: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 53      sqlite3VdbeS
8090: 65 74 43 6f 6c 4e 61 6d 65 28 76 2c 20 69 2c 20  etColName(v, i, 
80a0: 43 4f 4c 4e 41 4d 45 5f 4e 41 4d 45 2c 20 7a 4e  COLNAME_NAME, zN
80b0: 61 6d 65 2c 20 73 74 72 6c 65 6e 28 7a 4e 61 6d  ame, strlen(zNam
80c0: 65 29 29 3b 0a 20 20 20 20 20 20 63 6f 6e 74 69  e));.      conti
80d0: 6e 75 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  nue;.    }.    i
80e0: 66 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c  f( p->op==TK_COL
80f0: 55 4d 4e 20 26 26 20 70 54 61 62 4c 69 73 74 20  UMN && pTabList 
8100: 29 7b 0a 20 20 20 20 20 20 54 61 62 6c 65 20 2a  ){.      Table *
8110: 70 54 61 62 3b 0a 20 20 20 20 20 20 63 68 61 72  pTab;.      char
8120: 20 2a 7a 43 6f 6c 3b 0a 20 20 20 20 20 20 69 6e   *zCol;.      in
8130: 74 20 69 43 6f 6c 20 3d 20 70 2d 3e 69 43 6f 6c  t iCol = p->iCol
8140: 75 6d 6e 3b 0a 20 20 20 20 20 20 66 6f 72 28 6a  umn;.      for(j
8150: 3d 30 3b 20 6a 3c 70 54 61 62 4c 69 73 74 2d 3e  =0; j<pTabList->
8160: 6e 53 72 63 20 26 26 20 70 54 61 62 4c 69 73 74  nSrc && pTabList
8170: 2d 3e 61 5b 6a 5d 2e 69 43 75 72 73 6f 72 21 3d  ->a[j].iCursor!=
8180: 70 2d 3e 69 54 61 62 6c 65 3b 20 6a 2b 2b 29 7b  p->iTable; j++){
8190: 7d 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  }.      assert( 
81a0: 6a 3c 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63  j<pTabList->nSrc
81b0: 20 29 3b 0a 20 20 20 20 20 20 70 54 61 62 20 3d   );.      pTab =
81c0: 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 6a 5d 2e   pTabList->a[j].
81d0: 70 54 61 62 3b 0a 20 20 20 20 20 20 69 66 28 20  pTab;.      if( 
81e0: 69 43 6f 6c 3c 30 20 29 20 69 43 6f 6c 20 3d 20  iCol<0 ) iCol = 
81f0: 70 54 61 62 2d 3e 69 50 4b 65 79 3b 0a 20 20 20  pTab->iPKey;.   
8200: 20 20 20 61 73 73 65 72 74 28 20 69 43 6f 6c 3d     assert( iCol=
8210: 3d 2d 31 20 7c 7c 20 28 69 43 6f 6c 3e 3d 30 20  =-1 || (iCol>=0 
8220: 26 26 20 69 43 6f 6c 3c 70 54 61 62 2d 3e 6e 43  && iCol<pTab->nC
8230: 6f 6c 29 20 29 3b 0a 20 20 20 20 20 20 69 66 28  ol) );.      if(
8240: 20 69 43 6f 6c 3c 30 20 29 7b 0a 20 20 20 20 20   iCol<0 ){.     
8250: 20 20 20 7a 43 6f 6c 20 3d 20 22 72 6f 77 69 64     zCol = "rowid
8260: 22 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  ";.      }else{.
8270: 20 20 20 20 20 20 20 20 7a 43 6f 6c 20 3d 20 70          zCol = p
8280: 54 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e  Tab->aCol[iCol].
8290: 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20 7d 0a 20  zName;.      }. 
82a0: 20 20 20 20 20 69 66 28 20 21 73 68 6f 72 74 4e       if( !shortN
82b0: 61 6d 65 73 20 26 26 20 21 66 75 6c 6c 4e 61 6d  ames && !fullNam
82c0: 65 73 20 26 26 20 70 2d 3e 73 70 61 6e 2e 7a 20  es && p->span.z 
82d0: 26 26 20 70 2d 3e 73 70 61 6e 2e 7a 5b 30 5d 20  && p->span.z[0] 
82e0: 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
82f0: 65 33 56 64 62 65 53 65 74 43 6f 6c 4e 61 6d 65  e3VdbeSetColName
8300: 28 76 2c 20 69 2c 20 43 4f 4c 4e 41 4d 45 5f 4e  (v, i, COLNAME_N
8310: 41 4d 45 2c 20 28 63 68 61 72 2a 29 70 2d 3e 73  AME, (char*)p->s
8320: 70 61 6e 2e 7a 2c 20 70 2d 3e 73 70 61 6e 2e 6e  pan.z, p->span.n
8330: 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69  );.      }else i
8340: 66 28 20 66 75 6c 6c 4e 61 6d 65 73 20 7c 7c 20  f( fullNames || 
8350: 28 21 73 68 6f 72 74 4e 61 6d 65 73 20 26 26 20  (!shortNames && 
8360: 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3e 31  pTabList->nSrc>1
8370: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 63 68 61  ) ){.        cha
8380: 72 20 2a 7a 4e 61 6d 65 20 3d 20 30 3b 0a 20 20  r *zName = 0;.  
8390: 20 20 20 20 20 20 63 68 61 72 20 2a 7a 54 61 62        char *zTab
83a0: 3b 0a 20 0a 20 20 20 20 20 20 20 20 7a 54 61 62  ;. .        zTab
83b0: 20 3d 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 6a   = pTabList->a[j
83c0: 5d 2e 7a 41 6c 69 61 73 3b 0a 20 20 20 20 20 20  ].zAlias;.      
83d0: 20 20 69 66 28 20 66 75 6c 6c 4e 61 6d 65 73 20    if( fullNames 
83e0: 7c 7c 20 7a 54 61 62 3d 3d 30 20 29 20 7a 54 61  || zTab==0 ) zTa
83f0: 62 20 3d 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 3b  b = pTab->zName;
8400: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
8410: 53 65 74 53 74 72 69 6e 67 28 26 7a 4e 61 6d 65  SetString(&zName
8420: 2c 20 7a 54 61 62 2c 20 22 2e 22 2c 20 7a 43 6f  , zTab, ".", zCo
8430: 6c 2c 20 28 63 68 61 72 2a 29 30 29 3b 0a 20 20  l, (char*)0);.  
8440: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
8450: 65 53 65 74 43 6f 6c 4e 61 6d 65 28 76 2c 20 69  eSetColName(v, i
8460: 2c 20 43 4f 4c 4e 41 4d 45 5f 4e 41 4d 45 2c 20  , COLNAME_NAME, 
8470: 7a 4e 61 6d 65 2c 20 50 33 5f 44 59 4e 41 4d 49  zName, P3_DYNAMI
8480: 43 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  C);.      }else{
8490: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
84a0: 56 64 62 65 53 65 74 43 6f 6c 4e 61 6d 65 28 76  VdbeSetColName(v
84b0: 2c 20 69 2c 20 43 4f 4c 4e 41 4d 45 5f 4e 41 4d  , i, COLNAME_NAM
84c0: 45 2c 20 7a 43 6f 6c 2c 20 73 74 72 6c 65 6e 28  E, zCol, strlen(
84d0: 7a 43 6f 6c 29 29 3b 0a 20 20 20 20 20 20 7d 0a  zCol));.      }.
84e0: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 2d      }else if( p-
84f0: 3e 73 70 61 6e 2e 7a 20 26 26 20 70 2d 3e 73 70  >span.z && p->sp
8500: 61 6e 2e 7a 5b 30 5d 20 29 7b 0a 20 20 20 20 20  an.z[0] ){.     
8510: 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 74 43   sqlite3VdbeSetC
8520: 6f 6c 4e 61 6d 65 28 76 2c 20 69 2c 20 43 4f 4c  olName(v, i, COL
8530: 4e 41 4d 45 5f 4e 41 4d 45 2c 20 28 63 68 61 72  NAME_NAME, (char
8540: 2a 29 70 2d 3e 73 70 61 6e 2e 7a 2c 20 70 2d 3e  *)p->span.z, p->
8550: 73 70 61 6e 2e 6e 29 3b 0a 20 20 20 20 20 20 2f  span.n);.      /
8560: 2a 20 73 71 6c 69 74 65 33 56 64 62 65 43 6f 6d  * sqlite3VdbeCom
8570: 70 72 65 73 73 53 70 61 63 65 28 76 2c 20 61 64  pressSpace(v, ad
8580: 64 72 29 3b 20 2a 2f 0a 20 20 20 20 7d 65 6c 73  dr); */.    }els
8590: 65 7b 0a 20 20 20 20 20 20 63 68 61 72 20 7a 4e  e{.      char zN
85a0: 61 6d 65 5b 33 30 5d 3b 0a 20 20 20 20 20 20 61  ame[30];.      a
85b0: 73 73 65 72 74 28 20 70 2d 3e 6f 70 21 3d 54 4b  ssert( p->op!=TK
85c0: 5f 43 4f 4c 55 4d 4e 20 7c 7c 20 70 54 61 62 4c  _COLUMN || pTabL
85d0: 69 73 74 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  ist==0 );.      
85e0: 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66  sqlite3_snprintf
85f0: 28 73 69 7a 65 6f 66 28 7a 4e 61 6d 65 29 2c 20  (sizeof(zName), 
8600: 7a 4e 61 6d 65 2c 20 22 63 6f 6c 75 6d 6e 25 64  zName, "column%d
8610: 22 2c 20 69 2b 31 29 3b 0a 20 20 20 20 20 20 73  ", i+1);.      s
8620: 71 6c 69 74 65 33 56 64 62 65 53 65 74 43 6f 6c  qlite3VdbeSetCol
8630: 4e 61 6d 65 28 76 2c 20 69 2c 20 43 4f 4c 4e 41  Name(v, i, COLNA
8640: 4d 45 5f 4e 41 4d 45 2c 20 7a 4e 61 6d 65 2c 20  ME_NAME, zName, 
8650: 30 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  0);.    }.  }.  
8660: 67 65 6e 65 72 61 74 65 43 6f 6c 75 6d 6e 54 79  generateColumnTy
8670: 70 65 73 28 70 50 61 72 73 65 2c 20 70 54 61 62  pes(pParse, pTab
8680: 4c 69 73 74 2c 20 70 45 4c 69 73 74 29 3b 0a 7d  List, pEList);.}
8690: 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
86a0: 5f 4f 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53  _OMIT_COMPOUND_S
86b0: 45 4c 45 43 54 0a 2f 2a 0a 2a 2a 20 4e 61 6d 65  ELECT./*.** Name
86c0: 20 6f 66 20 74 68 65 20 63 6f 6e 6e 65 63 74 69   of the connecti
86d0: 6f 6e 20 6f 70 65 72 61 74 6f 72 2c 20 75 73 65  on operator, use
86e0: 64 20 66 6f 72 20 65 72 72 6f 72 20 6d 65 73 73  d for error mess
86f0: 61 67 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ages..*/.static 
8700: 63 6f 6e 73 74 20 63 68 61 72 20 2a 73 65 6c 65  const char *sele
8710: 63 74 4f 70 4e 61 6d 65 28 69 6e 74 20 69 64 29  ctOpName(int id)
8720: 7b 0a 20 20 63 68 61 72 20 2a 7a 3b 0a 20 20 73  {.  char *z;.  s
8730: 77 69 74 63 68 28 20 69 64 20 29 7b 0a 20 20 20  witch( id ){.   
8740: 20 63 61 73 65 20 54 4b 5f 41 4c 4c 3a 20 20 20   case TK_ALL:   
8750: 20 20 20 20 7a 20 3d 20 22 55 4e 49 4f 4e 20 41      z = "UNION A
8760: 4c 4c 22 3b 20 20 20 62 72 65 61 6b 3b 0a 20 20  LL";   break;.  
8770: 20 20 63 61 73 65 20 54 4b 5f 49 4e 54 45 52 53    case TK_INTERS
8780: 45 43 54 3a 20 7a 20 3d 20 22 49 4e 54 45 52 53  ECT: z = "INTERS
8790: 45 43 54 22 3b 20 20 20 62 72 65 61 6b 3b 0a 20  ECT";   break;. 
87a0: 20 20 20 63 61 73 65 20 54 4b 5f 45 58 43 45 50     case TK_EXCEP
87b0: 54 3a 20 20 20 20 7a 20 3d 20 22 45 58 43 45 50  T:    z = "EXCEP
87c0: 54 22 3b 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  T";      break;.
87d0: 20 20 20 20 64 65 66 61 75 6c 74 3a 20 20 20 20      default:    
87e0: 20 20 20 20 20 20 20 7a 20 3d 20 22 55 4e 49 4f         z = "UNIO
87f0: 4e 22 3b 20 20 20 20 20 20 20 62 72 65 61 6b 3b  N";       break;
8800: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 7a 3b  .  }.  return z;
8810: 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c  .}.#endif /* SQL
8820: 49 54 45 5f 4f 4d 49 54 5f 43 4f 4d 50 4f 55 4e  ITE_OMIT_COMPOUN
8830: 44 5f 53 45 4c 45 43 54 20 2a 2f 0a 0a 2f 2a 0a  D_SELECT */../*.
8840: 2a 2a 20 46 6f 72 77 61 72 64 20 64 65 63 6c 61  ** Forward decla
8850: 72 61 74 69 6f 6e 0a 2a 2f 0a 73 74 61 74 69 63  ration.*/.static
8860: 20 69 6e 74 20 70 72 65 70 53 65 6c 65 63 74 53   int prepSelectS
8870: 74 6d 74 28 50 61 72 73 65 2a 2c 20 53 65 6c 65  tmt(Parse*, Sele
8880: 63 74 2a 29 3b 0a 0a 2f 2a 0a 2a 2a 20 47 69 76  ct*);../*.** Giv
8890: 65 6e 20 61 20 53 45 4c 45 43 54 20 73 74 61 74  en a SELECT stat
88a0: 65 6d 65 6e 74 2c 20 67 65 6e 65 72 61 74 65 20  ement, generate 
88b0: 61 20 54 61 62 6c 65 20 73 74 72 75 63 74 75 72  a Table structur
88c0: 65 20 74 68 61 74 20 64 65 73 63 72 69 62 65 73  e that describes
88d0: 0a 2a 2a 20 74 68 65 20 72 65 73 75 6c 74 20 73  .** the result s
88e0: 65 74 20 6f 66 20 74 68 61 74 20 53 45 4c 45 43  et of that SELEC
88f0: 54 2e 0a 2a 2f 0a 54 61 62 6c 65 20 2a 73 71 6c  T..*/.Table *sql
8900: 69 74 65 33 52 65 73 75 6c 74 53 65 74 4f 66 53  ite3ResultSetOfS
8910: 65 6c 65 63 74 28 50 61 72 73 65 20 2a 70 50 61  elect(Parse *pPa
8920: 72 73 65 2c 20 63 68 61 72 20 2a 7a 54 61 62 4e  rse, char *zTabN
8930: 61 6d 65 2c 20 53 65 6c 65 63 74 20 2a 70 53 65  ame, Select *pSe
8940: 6c 65 63 74 29 7b 0a 20 20 54 61 62 6c 65 20 2a  lect){.  Table *
8950: 70 54 61 62 3b 0a 20 20 69 6e 74 20 69 2c 20 6a  pTab;.  int i, j
8960: 3b 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45  ;.  ExprList *pE
8970: 4c 69 73 74 3b 0a 20 20 43 6f 6c 75 6d 6e 20 2a  List;.  Column *
8980: 61 43 6f 6c 2c 20 2a 70 43 6f 6c 3b 0a 20 20 73  aCol, *pCol;.  s
8990: 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61  qlite3 *db = pPa
89a0: 72 73 65 2d 3e 64 62 3b 0a 0a 20 20 77 68 69 6c  rse->db;..  whil
89b0: 65 28 20 70 53 65 6c 65 63 74 2d 3e 70 50 72 69  e( pSelect->pPri
89c0: 6f 72 20 29 20 70 53 65 6c 65 63 74 20 3d 20 70  or ) pSelect = p
89d0: 53 65 6c 65 63 74 2d 3e 70 50 72 69 6f 72 3b 0a  Select->pPrior;.
89e0: 20 20 69 66 28 20 70 72 65 70 53 65 6c 65 63 74    if( prepSelect
89f0: 53 74 6d 74 28 70 50 61 72 73 65 2c 20 70 53 65  Stmt(pParse, pSe
8a00: 6c 65 63 74 29 20 29 7b 0a 20 20 20 20 72 65 74  lect) ){.    ret
8a10: 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28  urn 0;.  }.  if(
8a20: 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 52 65   sqlite3SelectRe
8a30: 73 6f 6c 76 65 28 70 50 61 72 73 65 2c 20 70 53  solve(pParse, pS
8a40: 65 6c 65 63 74 2c 20 30 29 20 29 7b 0a 20 20 20  elect, 0) ){.   
8a50: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20   return 0;.  }. 
8a60: 20 70 54 61 62 20 3d 20 73 71 6c 69 74 65 33 44   pTab = sqlite3D
8a70: 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20  bMallocZero(db, 
8a80: 73 69 7a 65 6f 66 28 54 61 62 6c 65 29 20 29 3b  sizeof(Table) );
8a90: 0a 20 20 69 66 28 20 70 54 61 62 3d 3d 30 20 29  .  if( pTab==0 )
8aa0: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a  {.    return 0;.
8ab0: 20 20 7d 0a 20 20 70 54 61 62 2d 3e 6e 52 65 66    }.  pTab->nRef
8ac0: 20 3d 20 31 3b 0a 20 20 70 54 61 62 2d 3e 7a 4e   = 1;.  pTab->zN
8ad0: 61 6d 65 20 3d 20 7a 54 61 62 4e 61 6d 65 20 3f  ame = zTabName ?
8ae0: 20 73 71 6c 69 74 65 33 44 62 53 74 72 44 75 70   sqlite3DbStrDup
8af0: 28 64 62 2c 20 7a 54 61 62 4e 61 6d 65 29 20 3a  (db, zTabName) :
8b00: 20 30 3b 0a 20 20 70 45 4c 69 73 74 20 3d 20 70   0;.  pEList = p
8b10: 53 65 6c 65 63 74 2d 3e 70 45 4c 69 73 74 3b 0a  Select->pEList;.
8b20: 20 20 70 54 61 62 2d 3e 6e 43 6f 6c 20 3d 20 70    pTab->nCol = p
8b30: 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 0a 20 20  EList->nExpr;.  
8b40: 61 73 73 65 72 74 28 20 70 54 61 62 2d 3e 6e 43  assert( pTab->nC
8b50: 6f 6c 3e 30 20 29 3b 0a 20 20 70 54 61 62 2d 3e  ol>0 );.  pTab->
8b60: 61 43 6f 6c 20 3d 20 61 43 6f 6c 20 3d 20 73 71  aCol = aCol = sq
8b70: 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72  lite3DbMallocZer
8b80: 6f 28 64 62 2c 20 73 69 7a 65 6f 66 28 70 54 61  o(db, sizeof(pTa
8b90: 62 2d 3e 61 43 6f 6c 5b 30 5d 29 2a 70 54 61 62  b->aCol[0])*pTab
8ba0: 2d 3e 6e 43 6f 6c 29 3b 0a 20 20 66 6f 72 28 69  ->nCol);.  for(i
8bb0: 3d 30 2c 20 70 43 6f 6c 3d 61 43 6f 6c 3b 20 69  =0, pCol=aCol; i
8bc0: 3c 70 54 61 62 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b  <pTab->nCol; i++
8bd0: 2c 20 70 43 6f 6c 2b 2b 29 7b 0a 20 20 20 20 45  , pCol++){.    E
8be0: 78 70 72 20 2a 70 2c 20 2a 70 52 3b 0a 20 20 20  xpr *p, *pR;.   
8bf0: 20 63 68 61 72 20 2a 7a 54 79 70 65 3b 0a 20 20   char *zType;.  
8c00: 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 3b 0a 20    char *zName;. 
8c10: 20 20 20 69 6e 74 20 6e 4e 61 6d 65 3b 0a 20 20     int nName;.  
8c20: 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c    CollSeq *pColl
8c30: 3b 0a 20 20 20 20 69 6e 74 20 63 6e 74 3b 0a 20  ;.    int cnt;. 
8c40: 20 20 20 4e 61 6d 65 43 6f 6e 74 65 78 74 20 73     NameContext s
8c50: 4e 43 3b 0a 20 20 20 20 0a 20 20 20 20 2f 2a 20  NC;.    .    /* 
8c60: 47 65 74 20 61 6e 20 61 70 70 72 6f 70 72 69 61  Get an appropria
8c70: 74 65 20 6e 61 6d 65 20 66 6f 72 20 74 68 65 20  te name for the 
8c80: 63 6f 6c 75 6d 6e 0a 20 20 20 20 2a 2f 0a 20 20  column.    */.  
8c90: 20 20 70 20 3d 20 70 45 4c 69 73 74 2d 3e 61 5b    p = pEList->a[
8ca0: 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 61 73  i].pExpr;.    as
8cb0: 73 65 72 74 28 20 70 2d 3e 70 52 69 67 68 74 3d  sert( p->pRight=
8cc0: 3d 30 20 7c 7c 20 70 2d 3e 70 52 69 67 68 74 2d  =0 || p->pRight-
8cd0: 3e 74 6f 6b 65 6e 2e 7a 3d 3d 30 20 7c 7c 20 70  >token.z==0 || p
8ce0: 2d 3e 70 52 69 67 68 74 2d 3e 74 6f 6b 65 6e 2e  ->pRight->token.
8cf0: 7a 5b 30 5d 21 3d 30 20 29 3b 0a 20 20 20 20 69  z[0]!=0 );.    i
8d00: 66 28 20 28 7a 4e 61 6d 65 20 3d 20 70 45 4c 69  f( (zName = pELi
8d10: 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 29 21  st->a[i].zName)!
8d20: 3d 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49  =0 ){.      /* I
8d30: 66 20 74 68 65 20 63 6f 6c 75 6d 6e 20 63 6f 6e  f the column con
8d40: 74 61 69 6e 73 20 61 6e 20 22 41 53 20 3c 6e 61  tains an "AS <na
8d50: 6d 65 3e 22 20 70 68 72 61 73 65 2c 20 75 73 65  me>" phrase, use
8d60: 20 3c 6e 61 6d 65 3e 20 61 73 20 74 68 65 20 6e   <name> as the n
8d70: 61 6d 65 20 2a 2f 0a 20 20 20 20 20 20 7a 4e 61  ame */.      zNa
8d80: 6d 65 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74  me = sqlite3DbSt
8d90: 72 44 75 70 28 64 62 2c 20 7a 4e 61 6d 65 29 3b  rDup(db, zName);
8da0: 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70  .    }else if( p
8db0: 2d 3e 6f 70 3d 3d 54 4b 5f 44 4f 54 20 0a 20 20  ->op==TK_DOT .  
8dc0: 20 20 20 20 20 20 20 20 20 20 20 20 26 26 20 28              && (
8dd0: 70 52 3d 70 2d 3e 70 52 69 67 68 74 29 21 3d 30  pR=p->pRight)!=0
8de0: 20 26 26 20 70 52 2d 3e 74 6f 6b 65 6e 2e 7a 20   && pR->token.z 
8df0: 26 26 20 70 52 2d 3e 74 6f 6b 65 6e 2e 7a 5b 30  && pR->token.z[0
8e00: 5d 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 46 6f  ] ){.      /* Fo
8e10: 72 20 63 6f 6c 75 6d 6e 73 20 6f 66 20 74 68 65  r columns of the
8e20: 20 66 72 6f 6d 20 41 2e 42 20 75 73 65 20 42 20   from A.B use B 
8e30: 61 73 20 74 68 65 20 6e 61 6d 65 20 2a 2f 0a 20  as the name */. 
8e40: 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 73 71 6c       zName = sql
8e50: 69 74 65 33 4d 50 72 69 6e 74 66 28 64 62 2c 20  ite3MPrintf(db, 
8e60: 22 25 54 22 2c 20 26 70 52 2d 3e 74 6f 6b 65 6e  "%T", &pR->token
8e70: 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  );.    }else if(
8e80: 20 70 2d 3e 73 70 61 6e 2e 7a 20 26 26 20 70 2d   p->span.z && p-
8e90: 3e 73 70 61 6e 2e 7a 5b 30 5d 20 29 7b 0a 20 20  >span.z[0] ){.  
8ea0: 20 20 20 20 2f 2a 20 55 73 65 20 74 68 65 20 6f      /* Use the o
8eb0: 72 69 67 69 6e 61 6c 20 74 65 78 74 20 6f 66 20  riginal text of 
8ec0: 74 68 65 20 63 6f 6c 75 6d 6e 20 65 78 70 72 65  the column expre
8ed0: 73 73 69 6f 6e 20 61 73 20 69 74 73 20 6e 61 6d  ssion as its nam
8ee0: 65 20 2a 2f 0a 20 20 20 20 20 20 7a 4e 61 6d 65  e */.      zName
8ef0: 20 3d 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74   = sqlite3MPrint
8f00: 66 28 64 62 2c 20 22 25 54 22 2c 20 26 70 2d 3e  f(db, "%T", &p->
8f10: 73 70 61 6e 29 3b 0a 20 20 20 20 7d 65 6c 73 65  span);.    }else
8f20: 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 61 6c  {.      /* If al
8f30: 6c 20 65 6c 73 65 20 66 61 69 6c 73 2c 20 6d 61  l else fails, ma
8f40: 6b 65 20 75 70 20 61 20 6e 61 6d 65 20 2a 2f 0a  ke up a name */.
8f50: 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 73 71        zName = sq
8f60: 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 64 62 2c  lite3MPrintf(db,
8f70: 20 22 63 6f 6c 75 6d 6e 25 64 22 2c 20 69 2b 31   "column%d", i+1
8f80: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  );.    }.    if(
8f90: 20 21 7a 4e 61 6d 65 20 7c 7c 20 64 62 2d 3e 6d   !zName || db->m
8fa0: 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20  allocFailed ){. 
8fb0: 20 20 20 20 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46       db->mallocF
8fc0: 61 69 6c 65 64 20 3d 20 31 3b 0a 20 20 20 20 20  ailed = 1;.     
8fd0: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 4e   sqlite3_free(zN
8fe0: 61 6d 65 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  ame);.      sqli
8ff0: 74 65 33 44 65 6c 65 74 65 54 61 62 6c 65 28 70  te3DeleteTable(p
9000: 54 61 62 29 3b 0a 20 20 20 20 20 20 72 65 74 75  Tab);.      retu
9010: 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20  rn 0;.    }.    
9020: 73 71 6c 69 74 65 33 44 65 71 75 6f 74 65 28 7a  sqlite3Dequote(z
9030: 4e 61 6d 65 29 3b 0a 0a 20 20 20 20 2f 2a 20 4d  Name);..    /* M
9040: 61 6b 65 20 73 75 72 65 20 74 68 65 20 63 6f 6c  ake sure the col
9050: 75 6d 6e 20 6e 61 6d 65 20 69 73 20 75 6e 69 71  umn name is uniq
9060: 75 65 2e 20 20 49 66 20 74 68 65 20 6e 61 6d 65  ue.  If the name
9070: 20 69 73 20 6e 6f 74 20 75 6e 69 71 75 65 2c 0a   is not unique,.
9080: 20 20 20 20 2a 2a 20 61 70 70 65 6e 64 20 61 20      ** append a 
9090: 69 6e 74 65 67 65 72 20 74 6f 20 74 68 65 20 6e  integer to the n
90a0: 61 6d 65 20 73 6f 20 74 68 61 74 20 69 74 20 62  ame so that it b
90b0: 65 63 6f 6d 65 73 20 75 6e 69 71 75 65 2e 0a 20  ecomes unique.. 
90c0: 20 20 20 2a 2f 0a 20 20 20 20 6e 4e 61 6d 65 20     */.    nName 
90d0: 3d 20 73 74 72 6c 65 6e 28 7a 4e 61 6d 65 29 3b  = strlen(zName);
90e0: 0a 20 20 20 20 66 6f 72 28 6a 3d 63 6e 74 3d 30  .    for(j=cnt=0
90f0: 3b 20 6a 3c 69 3b 20 6a 2b 2b 29 7b 0a 20 20 20  ; j<i; j++){.   
9100: 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 74     if( sqlite3St
9110: 72 49 43 6d 70 28 61 43 6f 6c 5b 6a 5d 2e 7a 4e  rICmp(aCol[j].zN
9120: 61 6d 65 2c 20 7a 4e 61 6d 65 29 3d 3d 30 20 29  ame, zName)==0 )
9130: 7b 0a 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 5b  {.        zName[
9140: 6e 4e 61 6d 65 5d 20 3d 20 30 3b 0a 20 20 20 20  nName] = 0;.    
9150: 20 20 20 20 7a 4e 61 6d 65 20 3d 20 73 71 6c 69      zName = sqli
9160: 74 65 33 4d 50 72 69 6e 74 66 28 64 62 2c 20 22  te3MPrintf(db, "
9170: 25 7a 3a 25 64 22 2c 20 7a 4e 61 6d 65 2c 20 2b  %z:%d", zName, +
9180: 2b 63 6e 74 29 3b 0a 20 20 20 20 20 20 20 20 6a  +cnt);.        j
9190: 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 20 20 69   = -1;.        i
91a0: 66 28 20 7a 4e 61 6d 65 3d 3d 30 20 29 20 62 72  f( zName==0 ) br
91b0: 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  eak;.      }.   
91c0: 20 7d 0a 20 20 20 20 70 43 6f 6c 2d 3e 7a 4e 61   }.    pCol->zNa
91d0: 6d 65 20 3d 20 7a 4e 61 6d 65 3b 0a 0a 20 20 20  me = zName;..   
91e0: 20 2f 2a 20 47 65 74 20 74 68 65 20 74 79 70 65   /* Get the type
91f0: 6e 61 6d 65 2c 20 74 79 70 65 20 61 66 66 69 6e  name, type affin
9200: 69 74 79 2c 20 61 6e 64 20 63 6f 6c 6c 61 74 69  ity, and collati
9210: 6e 67 20 73 65 71 75 65 6e 63 65 20 66 6f 72 20  ng sequence for 
9220: 74 68 65 0a 20 20 20 20 2a 2a 20 63 6f 6c 75 6d  the.    ** colum
9230: 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 6d 65  n..    */.    me
9240: 6d 73 65 74 28 26 73 4e 43 2c 20 30 2c 20 73 69  mset(&sNC, 0, si
9250: 7a 65 6f 66 28 73 4e 43 29 29 3b 0a 20 20 20 20  zeof(sNC));.    
9260: 73 4e 43 2e 70 53 72 63 4c 69 73 74 20 3d 20 70  sNC.pSrcList = p
9270: 53 65 6c 65 63 74 2d 3e 70 53 72 63 3b 0a 20 20  Select->pSrc;.  
9280: 20 20 7a 54 79 70 65 20 3d 20 73 71 6c 69 74 65    zType = sqlite
9290: 33 44 62 53 74 72 44 75 70 28 64 62 2c 20 63 6f  3DbStrDup(db, co
92a0: 6c 75 6d 6e 54 79 70 65 28 26 73 4e 43 2c 20 70  lumnType(&sNC, p
92b0: 2c 20 30 2c 20 30 2c 20 30 29 29 3b 0a 20 20 20  , 0, 0, 0));.   
92c0: 20 70 43 6f 6c 2d 3e 7a 54 79 70 65 20 3d 20 7a   pCol->zType = z
92d0: 54 79 70 65 3b 0a 20 20 20 20 70 43 6f 6c 2d 3e  Type;.    pCol->
92e0: 61 66 66 69 6e 69 74 79 20 3d 20 73 71 6c 69 74  affinity = sqlit
92f0: 65 33 45 78 70 72 41 66 66 69 6e 69 74 79 28 70  e3ExprAffinity(p
9300: 29 3b 0a 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73  );.    pColl = s
9310: 71 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c 53 65  qlite3ExprCollSe
9320: 71 28 70 50 61 72 73 65 2c 20 70 29 3b 0a 20 20  q(pParse, p);.  
9330: 20 20 69 66 28 20 70 43 6f 6c 6c 20 29 7b 0a 20    if( pColl ){. 
9340: 20 20 20 20 20 70 43 6f 6c 2d 3e 7a 43 6f 6c 6c       pCol->zColl
9350: 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72 44   = sqlite3DbStrD
9360: 75 70 28 64 62 2c 20 70 43 6f 6c 6c 2d 3e 7a 4e  up(db, pColl->zN
9370: 61 6d 65 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  ame);.    }.  }.
9380: 20 20 70 54 61 62 2d 3e 69 50 4b 65 79 20 3d 20    pTab->iPKey = 
9390: 2d 31 3b 0a 20 20 72 65 74 75 72 6e 20 70 54 61  -1;.  return pTa
93a0: 62 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 72 65 70  b;.}../*.** Prep
93b0: 61 72 65 20 61 20 53 45 4c 45 43 54 20 73 74 61  are a SELECT sta
93c0: 74 65 6d 65 6e 74 20 66 6f 72 20 70 72 6f 63 65  tement for proce
93d0: 73 73 69 6e 67 20 62 79 20 64 6f 69 6e 67 20 74  ssing by doing t
93e0: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 0a 2a 2a 20  he following.** 
93f0: 74 68 69 6e 67 73 3a 0a 2a 2a 0a 2a 2a 20 20 20  things:.**.**   
9400: 20 28 31 29 20 20 4d 61 6b 65 20 73 75 72 65 20   (1)  Make sure 
9410: 56 44 42 45 20 63 75 72 73 6f 72 20 6e 75 6d 62  VDBE cursor numb
9420: 65 72 73 20 68 61 76 65 20 62 65 65 6e 20 61 73  ers have been as
9430: 73 69 67 6e 65 64 20 74 6f 20 65 76 65 72 79 0a  signed to every.
9440: 2a 2a 20 20 20 20 20 20 20 20 20 65 6c 65 6d 65  **         eleme
9450: 6e 74 20 6f 66 20 74 68 65 20 46 52 4f 4d 20 63  nt of the FROM c
9460: 6c 61 75 73 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 20  lause..**.**    
9470: 28 32 29 20 20 46 69 6c 6c 20 69 6e 20 74 68 65  (2)  Fill in the
9480: 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 5d 2e 70   pTabList->a[].p
9490: 54 61 62 20 66 69 65 6c 64 73 20 69 6e 20 74 68  Tab fields in th
94a0: 65 20 53 72 63 4c 69 73 74 20 74 68 61 74 20 0a  e SrcList that .
94b0: 2a 2a 20 20 20 20 20 20 20 20 20 64 65 66 69 6e  **         defin
94c0: 65 73 20 46 52 4f 4d 20 63 6c 61 75 73 65 2e 20  es FROM clause. 
94d0: 20 57 68 65 6e 20 76 69 65 77 73 20 61 70 70 65   When views appe
94e0: 61 72 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63  ar in the FROM c
94f0: 6c 61 75 73 65 2c 0a 2a 2a 20 20 20 20 20 20 20  lause,.**       
9500: 20 20 66 69 6c 6c 20 70 54 61 62 4c 69 73 74 2d    fill pTabList-
9510: 3e 61 5b 5d 2e 70 53 65 6c 65 63 74 20 77 69 74  >a[].pSelect wit
9520: 68 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20  h a copy of the 
9530: 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
9540: 0a 2a 2a 20 20 20 20 20 20 20 20 20 74 68 61 74  .**         that
9550: 20 69 6d 70 6c 65 6d 65 6e 74 73 20 74 68 65 20   implements the 
9560: 76 69 65 77 2e 20 20 41 20 63 6f 70 79 20 69 73  view.  A copy is
9570: 20 6d 61 64 65 20 6f 66 20 74 68 65 20 76 69 65   made of the vie
9580: 77 27 73 20 53 45 4c 45 43 54 0a 2a 2a 20 20 20  w's SELECT.**   
9590: 20 20 20 20 20 20 73 74 61 74 65 6d 65 6e 74 20        statement 
95a0: 73 6f 20 74 68 61 74 20 77 65 20 63 61 6e 20 66  so that we can f
95b0: 72 65 65 6c 79 20 6d 6f 64 69 66 79 20 6f 72 20  reely modify or 
95c0: 64 65 6c 65 74 65 20 74 68 61 74 20 73 74 61 74  delete that stat
95d0: 65 6d 65 6e 74 0a 2a 2a 20 20 20 20 20 20 20 20  ement.**        
95e0: 20 77 69 74 68 6f 75 74 20 77 6f 72 72 79 69 6e   without worryin
95f0: 67 20 61 62 6f 75 74 20 6d 65 73 73 69 6e 67 20  g about messing 
9600: 75 70 20 74 68 65 20 70 72 65 73 69 73 74 65 6e  up the presisten
9610: 74 20 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e  t representation
9620: 0a 2a 2a 20 20 20 20 20 20 20 20 20 6f 66 20 74  .**         of t
9630: 68 65 20 76 69 65 77 2e 0a 2a 2a 0a 2a 2a 20 20  he view..**.**  
9640: 20 20 28 33 29 20 20 41 64 64 20 74 65 72 6d 73    (3)  Add terms
9650: 20 74 6f 20 74 68 65 20 57 48 45 52 45 20 63 6c   to the WHERE cl
9660: 61 75 73 65 20 74 6f 20 61 63 63 6f 6d 6f 64 61  ause to accomoda
9670: 74 65 20 74 68 65 20 4e 41 54 55 52 41 4c 20 6b  te the NATURAL k
9680: 65 79 77 6f 72 64 0a 2a 2a 20 20 20 20 20 20 20  eyword.**       
9690: 20 20 6f 6e 20 6a 6f 69 6e 73 20 61 6e 64 20 74    on joins and t
96a0: 68 65 20 4f 4e 20 61 6e 64 20 55 53 49 4e 47 20  he ON and USING 
96b0: 63 6c 61 75 73 65 20 6f 66 20 6a 6f 69 6e 73 2e  clause of joins.
96c0: 0a 2a 2a 0a 2a 2a 20 20 20 20 28 34 29 20 20 53  .**.**    (4)  S
96d0: 63 61 6e 20 74 68 65 20 6c 69 73 74 20 6f 66 20  can the list of 
96e0: 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20 72  columns in the r
96f0: 65 73 75 6c 74 20 73 65 74 20 28 70 45 4c 69 73  esult set (pELis
9700: 74 29 20 6c 6f 6f 6b 69 6e 67 0a 2a 2a 20 20 20  t) looking.**   
9710: 20 20 20 20 20 20 66 6f 72 20 69 6e 73 74 61 6e        for instan
9720: 63 65 73 20 6f 66 20 74 68 65 20 22 2a 22 20 6f  ces of the "*" o
9730: 70 65 72 61 74 6f 72 20 6f 72 20 74 68 65 20 54  perator or the T
9740: 41 42 4c 45 2e 2a 20 6f 70 65 72 61 74 6f 72 2e  ABLE.* operator.
9750: 0a 2a 2a 20 20 20 20 20 20 20 20 20 49 66 20 66  .**         If f
9760: 6f 75 6e 64 2c 20 65 78 70 61 6e 64 20 65 61 63  ound, expand eac
9770: 68 20 22 2a 22 20 74 6f 20 62 65 20 65 76 65 72  h "*" to be ever
9780: 79 20 63 6f 6c 75 6d 6e 20 69 6e 20 65 76 65 72  y column in ever
9790: 79 20 74 61 62 6c 65 0a 2a 2a 20 20 20 20 20 20  y table.**      
97a0: 20 20 20 61 6e 64 20 54 41 42 4c 45 2e 2a 20 74     and TABLE.* t
97b0: 6f 20 62 65 20 65 76 65 72 79 20 63 6f 6c 75 6d  o be every colum
97c0: 6e 20 69 6e 20 54 41 42 4c 45 2e 0a 2a 2a 0a 2a  n in TABLE..**.*
97d0: 2a 20 52 65 74 75 72 6e 20 30 20 6f 6e 20 73 75  * Return 0 on su
97e0: 63 63 65 73 73 2e 20 20 49 66 20 74 68 65 72 65  ccess.  If there
97f0: 20 61 72 65 20 70 72 6f 62 6c 65 6d 73 2c 20 6c   are problems, l
9800: 65 61 76 65 20 61 6e 20 65 72 72 6f 72 20 6d 65  eave an error me
9810: 73 73 61 67 65 0a 2a 2a 20 69 6e 20 70 50 61 72  ssage.** in pPar
9820: 73 65 20 61 6e 64 20 72 65 74 75 72 6e 20 6e 6f  se and return no
9830: 6e 2d 7a 65 72 6f 2e 0a 2a 2f 0a 73 74 61 74 69  n-zero..*/.stati
9840: 63 20 69 6e 74 20 70 72 65 70 53 65 6c 65 63 74  c int prepSelect
9850: 53 74 6d 74 28 50 61 72 73 65 20 2a 70 50 61 72  Stmt(Parse *pPar
9860: 73 65 2c 20 53 65 6c 65 63 74 20 2a 70 29 7b 0a  se, Select *p){.
9870: 20 20 69 6e 74 20 69 2c 20 6a 2c 20 6b 2c 20 72    int i, j, k, r
9880: 63 3b 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 54  c;.  SrcList *pT
9890: 61 62 4c 69 73 74 3b 0a 20 20 45 78 70 72 4c 69  abList;.  ExprLi
98a0: 73 74 20 2a 70 45 4c 69 73 74 3b 0a 20 20 73 74  st *pEList;.  st
98b0: 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65  ruct SrcList_ite
98c0: 6d 20 2a 70 46 72 6f 6d 3b 0a 20 20 73 71 6c 69  m *pFrom;.  sqli
98d0: 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65  te3 *db = pParse
98e0: 2d 3e 64 62 3b 0a 0a 20 20 69 66 28 20 70 3d 3d  ->db;..  if( p==
98f0: 30 20 7c 7c 20 70 2d 3e 70 53 72 63 3d 3d 30 20  0 || p->pSrc==0 
9900: 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  || db->mallocFai
9910: 6c 65 64 20 29 7b 0a 20 20 20 20 72 65 74 75 72  led ){.    retur
9920: 6e 20 31 3b 0a 20 20 7d 0a 20 20 70 54 61 62 4c  n 1;.  }.  pTabL
9930: 69 73 74 20 3d 20 70 2d 3e 70 53 72 63 3b 0a 20  ist = p->pSrc;. 
9940: 20 70 45 4c 69 73 74 20 3d 20 70 2d 3e 70 45 4c   pEList = p->pEL
9950: 69 73 74 3b 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20  ist;..  /* Make 
9960: 73 75 72 65 20 63 75 72 73 6f 72 20 6e 75 6d 62  sure cursor numb
9970: 65 72 73 20 68 61 76 65 20 62 65 65 6e 20 61 73  ers have been as
9980: 73 69 67 6e 65 64 20 74 6f 20 61 6c 6c 20 65 6e  signed to all en
9990: 74 72 69 65 73 20 69 6e 0a 20 20 2a 2a 20 74 68  tries in.  ** th
99a0: 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66  e FROM clause of
99b0: 20 74 68 65 20 53 45 4c 45 43 54 20 73 74 61 74   the SELECT stat
99c0: 65 6d 65 6e 74 2e 0a 20 20 2a 2f 0a 20 20 73 71  ement..  */.  sq
99d0: 6c 69 74 65 33 53 72 63 4c 69 73 74 41 73 73 69  lite3SrcListAssi
99e0: 67 6e 43 75 72 73 6f 72 73 28 70 50 61 72 73 65  gnCursors(pParse
99f0: 2c 20 70 2d 3e 70 53 72 63 29 3b 0a 0a 20 20 2f  , p->pSrc);..  /
9a00: 2a 20 4c 6f 6f 6b 20 75 70 20 65 76 65 72 79 20  * Look up every 
9a10: 74 61 62 6c 65 20 6e 61 6d 65 64 20 69 6e 20 74  table named in t
9a20: 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f  he FROM clause o
9a30: 66 20 74 68 65 20 73 65 6c 65 63 74 2e 20 20 49  f the select.  I
9a40: 66 0a 20 20 2a 2a 20 61 6e 20 65 6e 74 72 79 20  f.  ** an entry 
9a50: 6f 66 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75  of the FROM clau
9a60: 73 65 20 69 73 20 61 20 73 75 62 71 75 65 72 79  se is a subquery
9a70: 20 69 6e 73 74 65 61 64 20 6f 66 20 61 20 74 61   instead of a ta
9a80: 62 6c 65 20 6f 72 20 76 69 65 77 2c 0a 20 20 2a  ble or view,.  *
9a90: 2a 20 74 68 65 6e 20 63 72 65 61 74 65 20 61 20  * then create a 
9aa0: 74 72 61 6e 73 69 65 6e 74 20 74 61 62 6c 65 20  transient table 
9ab0: 73 74 72 75 63 74 75 72 65 20 74 6f 20 64 65 73  structure to des
9ac0: 63 72 69 62 65 20 74 68 65 20 73 75 62 71 75 65  cribe the subque
9ad0: 72 79 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69  ry..  */.  for(i
9ae0: 3d 30 2c 20 70 46 72 6f 6d 3d 70 54 61 62 4c 69  =0, pFrom=pTabLi
9af0: 73 74 2d 3e 61 3b 20 69 3c 70 54 61 62 4c 69 73  st->a; i<pTabLis
9b00: 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b 2c 20 70 46  t->nSrc; i++, pF
9b10: 72 6f 6d 2b 2b 29 7b 0a 20 20 20 20 54 61 62 6c  rom++){.    Tabl
9b20: 65 20 2a 70 54 61 62 3b 0a 20 20 20 20 69 66 28  e *pTab;.    if(
9b30: 20 70 46 72 6f 6d 2d 3e 70 54 61 62 21 3d 30 20   pFrom->pTab!=0 
9b40: 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 69 73  ){.      /* This
9b50: 20 73 74 61 74 65 6d 65 6e 74 20 68 61 73 20 61   statement has a
9b60: 6c 72 65 61 64 79 20 62 65 65 6e 20 70 72 65 70  lready been prep
9b70: 61 72 65 64 2e 20 20 54 68 65 72 65 20 69 73 20  ared.  There is 
9b80: 6e 6f 20 6e 65 65 64 0a 20 20 20 20 20 20 2a 2a  no need.      **
9b90: 20 74 6f 20 67 6f 20 66 75 72 74 68 65 72 2e 20   to go further. 
9ba0: 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  */.      assert(
9bb0: 20 69 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 72   i==0 );.      r
9bc0: 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 20  eturn 0;.    }. 
9bd0: 20 20 20 69 66 28 20 70 46 72 6f 6d 2d 3e 7a 4e     if( pFrom->zN
9be0: 61 6d 65 3d 3d 30 20 29 7b 0a 23 69 66 6e 64 65  ame==0 ){.#ifnde
9bf0: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55  f SQLITE_OMIT_SU
9c00: 42 51 55 45 52 59 0a 20 20 20 20 20 20 2f 2a 20  BQUERY.      /* 
9c10: 41 20 73 75 62 2d 71 75 65 72 79 20 69 6e 20 74  A sub-query in t
9c20: 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f  he FROM clause o
9c30: 66 20 61 20 53 45 4c 45 43 54 20 2a 2f 0a 20 20  f a SELECT */.  
9c40: 20 20 20 20 61 73 73 65 72 74 28 20 70 46 72 6f      assert( pFro
9c50: 6d 2d 3e 70 53 65 6c 65 63 74 21 3d 30 20 29 3b  m->pSelect!=0 );
9c60: 0a 20 20 20 20 20 20 69 66 28 20 70 46 72 6f 6d  .      if( pFrom
9c70: 2d 3e 7a 41 6c 69 61 73 3d 3d 30 20 29 7b 0a 20  ->zAlias==0 ){. 
9c80: 20 20 20 20 20 20 20 70 46 72 6f 6d 2d 3e 7a 41         pFrom->zA
9c90: 6c 69 61 73 20 3d 0a 20 20 20 20 20 20 20 20 20  lias =.         
9ca0: 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28   sqlite3MPrintf(
9cb0: 64 62 2c 20 22 73 71 6c 69 74 65 5f 73 75 62 71  db, "sqlite_subq
9cc0: 75 65 72 79 5f 25 70 5f 22 2c 20 28 76 6f 69 64  uery_%p_", (void
9cd0: 2a 29 70 46 72 6f 6d 2d 3e 70 53 65 6c 65 63 74  *)pFrom->pSelect
9ce0: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
9cf0: 20 61 73 73 65 72 74 28 20 70 46 72 6f 6d 2d 3e   assert( pFrom->
9d00: 70 54 61 62 3d 3d 30 20 29 3b 0a 20 20 20 20 20  pTab==0 );.     
9d10: 20 70 46 72 6f 6d 2d 3e 70 54 61 62 20 3d 20 70   pFrom->pTab = p
9d20: 54 61 62 20 3d 20 0a 20 20 20 20 20 20 20 20 73  Tab = .        s
9d30: 71 6c 69 74 65 33 52 65 73 75 6c 74 53 65 74 4f  qlite3ResultSetO
9d40: 66 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20  fSelect(pParse, 
9d50: 70 46 72 6f 6d 2d 3e 7a 41 6c 69 61 73 2c 20 70  pFrom->zAlias, p
9d60: 46 72 6f 6d 2d 3e 70 53 65 6c 65 63 74 29 3b 0a  From->pSelect);.
9d70: 20 20 20 20 20 20 69 66 28 20 70 54 61 62 3d 3d        if( pTab==
9d80: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74  0 ){.        ret
9d90: 75 72 6e 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20  urn 1;.      }. 
9da0: 20 20 20 20 20 2f 2a 20 54 68 65 20 69 73 45 70       /* The isEp
9db0: 68 65 6d 20 66 6c 61 67 20 69 6e 64 69 63 61 74  hem flag indicat
9dc0: 65 73 20 74 68 61 74 20 74 68 65 20 54 61 62 6c  es that the Tabl
9dd0: 65 20 73 74 72 75 63 74 75 72 65 20 68 61 73 20  e structure has 
9de0: 62 65 65 6e 0a 20 20 20 20 20 20 2a 2a 20 64 79  been.      ** dy
9df0: 6e 61 6d 69 63 61 6c 6c 79 20 61 6c 6c 6f 63 61  namically alloca
9e00: 74 65 64 20 61 6e 64 20 6d 61 79 20 62 65 20 66  ted and may be f
9e10: 72 65 65 64 20 61 74 20 61 6e 79 20 74 69 6d 65  reed at any time
9e20: 2e 20 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64  .  In other word
9e30: 73 2c 0a 20 20 20 20 20 20 2a 2a 20 70 54 61 62  s,.      ** pTab
9e40: 20 69 73 20 6e 6f 74 20 70 6f 69 6e 74 69 6e 67   is not pointing
9e50: 20 74 6f 20 61 20 70 65 72 73 69 73 74 65 6e 74   to a persistent
9e60: 20 74 61 62 6c 65 20 73 74 72 75 63 74 75 72 65   table structure
9e70: 20 74 68 61 74 20 64 65 66 69 6e 65 73 0a 20 20   that defines.  
9e80: 20 20 20 20 2a 2a 20 70 61 72 74 20 6f 66 20 74      ** part of t
9e90: 68 65 20 73 63 68 65 6d 61 2e 20 2a 2f 0a 20 20  he schema. */.  
9ea0: 20 20 20 20 70 54 61 62 2d 3e 69 73 45 70 68 65      pTab->isEphe
9eb0: 6d 20 3d 20 31 3b 0a 23 65 6e 64 69 66 0a 20 20  m = 1;.#endif.  
9ec0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f    }else{.      /
9ed0: 2a 20 41 6e 20 6f 72 64 69 6e 61 72 79 20 74 61  * An ordinary ta
9ee0: 62 6c 65 20 6f 72 20 76 69 65 77 20 6e 61 6d 65  ble or view name
9ef0: 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61   in the FROM cla
9f00: 75 73 65 20 2a 2f 0a 20 20 20 20 20 20 61 73 73  use */.      ass
9f10: 65 72 74 28 20 70 46 72 6f 6d 2d 3e 70 54 61 62  ert( pFrom->pTab
9f20: 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 70 46 72  ==0 );.      pFr
9f30: 6f 6d 2d 3e 70 54 61 62 20 3d 20 70 54 61 62 20  om->pTab = pTab 
9f40: 3d 20 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  = .        sqlit
9f50: 65 33 4c 6f 63 61 74 65 54 61 62 6c 65 28 70 50  e3LocateTable(pP
9f60: 61 72 73 65 2c 70 46 72 6f 6d 2d 3e 7a 4e 61 6d  arse,pFrom->zNam
9f70: 65 2c 70 46 72 6f 6d 2d 3e 7a 44 61 74 61 62 61  e,pFrom->zDataba
9f80: 73 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70  se);.      if( p
9f90: 54 61 62 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  Tab==0 ){.      
9fa0: 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20    return 1;.    
9fb0: 20 20 7d 0a 20 20 20 20 20 20 70 54 61 62 2d 3e    }.      pTab->
9fc0: 6e 52 65 66 2b 2b 3b 0a 23 69 66 20 21 64 65 66  nRef++;.#if !def
9fd0: 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
9fe0: 5f 56 49 45 57 29 20 7c 7c 20 21 64 65 66 69 6e  _VIEW) || !defin
9ff0: 65 64 20 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ed (SQLITE_OMIT_
a000: 56 49 52 54 55 41 4c 54 41 42 4c 45 29 0a 20 20  VIRTUALTABLE).  
a010: 20 20 20 20 69 66 28 20 70 54 61 62 2d 3e 70 53      if( pTab->pS
a020: 65 6c 65 63 74 20 7c 7c 20 49 73 56 69 72 74 75  elect || IsVirtu
a030: 61 6c 28 70 54 61 62 29 20 29 7b 0a 20 20 20 20  al(pTab) ){.    
a040: 20 20 20 20 2f 2a 20 57 65 20 72 65 61 63 68 20      /* We reach 
a050: 68 65 72 65 20 69 66 20 74 68 65 20 6e 61 6d 65  here if the name
a060: 64 20 74 61 62 6c 65 20 69 73 20 61 20 72 65 61  d table is a rea
a070: 6c 6c 79 20 61 20 76 69 65 77 20 2a 2f 0a 20 20  lly a view */.  
a080: 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65        if( sqlite
a090: 33 56 69 65 77 47 65 74 43 6f 6c 75 6d 6e 4e 61  3ViewGetColumnNa
a0a0: 6d 65 73 28 70 50 61 72 73 65 2c 20 70 54 61 62  mes(pParse, pTab
a0b0: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72  ) ){.          r
a0c0: 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 20 20 20  eturn 1;.       
a0d0: 20 7d 0a 20 20 20 20 20 20 20 20 2f 2a 20 49 66   }.        /* If
a0e0: 20 70 46 72 6f 6d 2d 3e 70 53 65 6c 65 63 74 21   pFrom->pSelect!
a0f0: 3d 30 20 69 74 20 6d 65 61 6e 73 20 77 65 20 61  =0 it means we a
a100: 72 65 20 64 65 61 6c 69 6e 67 20 77 69 74 68 20  re dealing with 
a110: 61 0a 20 20 20 20 20 20 20 20 2a 2a 20 76 69 65  a.        ** vie
a120: 77 20 77 69 74 68 69 6e 20 61 20 76 69 65 77 2e  w within a view.
a130: 20 20 54 68 65 20 53 45 4c 45 43 54 20 73 74 72    The SELECT str
a140: 75 63 74 75 72 65 20 68 61 73 20 61 6c 72 65 61  ucture has alrea
a150: 64 79 20 62 65 65 6e 0a 20 20 20 20 20 20 20 20  dy been.        
a160: 2a 2a 20 63 6f 70 69 65 64 20 62 79 20 74 68 65  ** copied by the
a170: 20 6f 75 74 65 72 20 76 69 65 77 20 73 6f 20 77   outer view so w
a180: 65 20 63 61 6e 20 73 6b 69 70 20 74 68 65 20 63  e can skip the c
a190: 6f 70 79 20 73 74 65 70 20 68 65 72 65 0a 20 20  opy step here.  
a1a0: 20 20 20 20 20 20 2a 2a 20 69 6e 20 74 68 65 20        ** in the 
a1b0: 69 6e 6e 65 72 20 76 69 65 77 2e 0a 20 20 20 20  inner view..    
a1c0: 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 69      */.        i
a1d0: 66 28 20 70 46 72 6f 6d 2d 3e 70 53 65 6c 65 63  f( pFrom->pSelec
a1e0: 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  t==0 ){.        
a1f0: 20 20 70 46 72 6f 6d 2d 3e 70 53 65 6c 65 63 74    pFrom->pSelect
a200: 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74   = sqlite3Select
a210: 44 75 70 28 64 62 2c 20 70 54 61 62 2d 3e 70 53  Dup(db, pTab->pS
a220: 65 6c 65 63 74 29 3b 0a 20 20 20 20 20 20 20 20  elect);.        
a230: 7d 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66  }.      }.#endif
a240: 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
a250: 20 50 72 6f 63 65 73 73 20 4e 41 54 55 52 41 4c   Process NATURAL
a260: 20 6b 65 79 77 6f 72 64 73 2c 20 61 6e 64 20 4f   keywords, and O
a270: 4e 20 61 6e 64 20 55 53 49 4e 47 20 63 6c 61 75  N and USING clau
a280: 73 65 73 20 6f 66 20 6a 6f 69 6e 73 2e 0a 20 20  ses of joins..  
a290: 2a 2f 0a 20 20 69 66 28 20 73 71 6c 69 74 65 50  */.  if( sqliteP
a2a0: 72 6f 63 65 73 73 4a 6f 69 6e 28 70 50 61 72 73  rocessJoin(pPars
a2b0: 65 2c 20 70 29 20 29 20 72 65 74 75 72 6e 20 31  e, p) ) return 1
a2c0: 3b 0a 0a 20 20 2f 2a 20 46 6f 72 20 65 76 65 72  ;..  /* For ever
a2d0: 79 20 22 2a 22 20 74 68 61 74 20 6f 63 63 75 72  y "*" that occur
a2e0: 73 20 69 6e 20 74 68 65 20 63 6f 6c 75 6d 6e 20  s in the column 
a2f0: 6c 69 73 74 2c 20 69 6e 73 65 72 74 20 74 68 65  list, insert the
a300: 20 6e 61 6d 65 73 20 6f 66 0a 20 20 2a 2a 20 61   names of.  ** a
a310: 6c 6c 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 61 6c  ll columns in al
a320: 6c 20 74 61 62 6c 65 73 2e 20 20 41 6e 64 20 66  l tables.  And f
a330: 6f 72 20 65 76 65 72 79 20 54 41 42 4c 45 2e 2a  or every TABLE.*
a340: 20 69 6e 73 65 72 74 20 74 68 65 20 6e 61 6d 65   insert the name
a350: 73 0a 20 20 2a 2a 20 6f 66 20 61 6c 6c 20 63 6f  s.  ** of all co
a360: 6c 75 6d 6e 73 20 69 6e 20 54 41 42 4c 45 2e 20  lumns in TABLE. 
a370: 20 54 68 65 20 70 61 72 73 65 72 20 69 6e 73 65   The parser inse
a380: 72 74 65 64 20 61 20 73 70 65 63 69 61 6c 20 65  rted a special e
a390: 78 70 72 65 73 73 69 6f 6e 0a 20 20 2a 2a 20 77  xpression.  ** w
a3a0: 69 74 68 20 74 68 65 20 54 4b 5f 41 4c 4c 20 6f  ith the TK_ALL o
a3b0: 70 65 72 61 74 6f 72 20 66 6f 72 20 65 61 63 68  perator for each
a3c0: 20 22 2a 22 20 74 68 61 74 20 69 74 20 66 6f 75   "*" that it fou
a3d0: 6e 64 20 69 6e 20 74 68 65 20 63 6f 6c 75 6d 6e  nd in the column
a3e0: 20 6c 69 73 74 2e 0a 20 20 2a 2a 20 54 68 65 20   list..  ** The 
a3f0: 66 6f 6c 6c 6f 77 69 6e 67 20 63 6f 64 65 20 6a  following code j
a400: 75 73 74 20 68 61 73 20 74 6f 20 6c 6f 63 61 74  ust has to locat
a410: 65 20 74 68 65 20 54 4b 5f 41 4c 4c 20 65 78 70  e the TK_ALL exp
a420: 72 65 73 73 69 6f 6e 73 20 61 6e 64 20 65 78 70  ressions and exp
a430: 61 6e 64 0a 20 20 2a 2a 20 65 61 63 68 20 6f 6e  and.  ** each on
a440: 65 20 74 6f 20 74 68 65 20 6c 69 73 74 20 6f 66  e to the list of
a450: 20 61 6c 6c 20 63 6f 6c 75 6d 6e 73 20 69 6e 20   all columns in 
a460: 61 6c 6c 20 74 61 62 6c 65 73 2e 0a 20 20 2a 2a  all tables..  **
a470: 0a 20 20 2a 2a 20 54 68 65 20 66 69 72 73 74 20  .  ** The first 
a480: 6c 6f 6f 70 20 6a 75 73 74 20 63 68 65 63 6b 73  loop just checks
a490: 20 74 6f 20 73 65 65 20 69 66 20 74 68 65 72 65   to see if there
a4a0: 20 61 72 65 20 61 6e 79 20 22 2a 22 20 6f 70 65   are any "*" ope
a4b0: 72 61 74 6f 72 73 0a 20 20 2a 2a 20 74 68 61 74  rators.  ** that
a4c0: 20 6e 65 65 64 20 65 78 70 61 6e 64 69 6e 67 2e   need expanding.
a4d0: 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 6b 3d 30 3b  .  */.  for(k=0;
a4e0: 20 6b 3c 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72   k<pEList->nExpr
a4f0: 3b 20 6b 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72  ; k++){.    Expr
a500: 20 2a 70 45 20 3d 20 70 45 4c 69 73 74 2d 3e 61   *pE = pEList->a
a510: 5b 6b 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 69  [k].pExpr;.    i
a520: 66 28 20 70 45 2d 3e 6f 70 3d 3d 54 4b 5f 41 4c  f( pE->op==TK_AL
a530: 4c 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 69  L ) break;.    i
a540: 66 28 20 70 45 2d 3e 6f 70 3d 3d 54 4b 5f 44 4f  f( pE->op==TK_DO
a550: 54 20 26 26 20 70 45 2d 3e 70 52 69 67 68 74 20  T && pE->pRight 
a560: 26 26 20 70 45 2d 3e 70 52 69 67 68 74 2d 3e 6f  && pE->pRight->o
a570: 70 3d 3d 54 4b 5f 41 4c 4c 0a 20 20 20 20 20 20  p==TK_ALL.      
a580: 20 20 20 26 26 20 70 45 2d 3e 70 4c 65 66 74 20     && pE->pLeft 
a590: 26 26 20 70 45 2d 3e 70 4c 65 66 74 2d 3e 6f 70  && pE->pLeft->op
a5a0: 3d 3d 54 4b 5f 49 44 20 29 20 62 72 65 61 6b 3b  ==TK_ID ) break;
a5b0: 0a 20 20 7d 0a 20 20 72 63 20 3d 20 30 3b 0a 20  .  }.  rc = 0;. 
a5c0: 20 69 66 28 20 6b 3c 70 45 4c 69 73 74 2d 3e 6e   if( k<pEList->n
a5d0: 45 78 70 72 20 29 7b 0a 20 20 20 20 2f 2a 0a 20  Expr ){.    /*. 
a5e0: 20 20 20 2a 2a 20 49 66 20 77 65 20 67 65 74 20     ** If we get 
a5f0: 68 65 72 65 20 69 74 20 6d 65 61 6e 73 20 74 68  here it means th
a600: 65 20 72 65 73 75 6c 74 20 73 65 74 20 63 6f 6e  e result set con
a610: 74 61 69 6e 73 20 6f 6e 65 20 6f 72 20 6d 6f 72  tains one or mor
a620: 65 20 22 2a 22 0a 20 20 20 20 2a 2a 20 6f 70 65  e "*".    ** ope
a630: 72 61 74 6f 72 73 20 74 68 61 74 20 6e 65 65 64  rators that need
a640: 20 74 6f 20 62 65 20 65 78 70 61 6e 64 65 64 2e   to be expanded.
a650: 20 20 4c 6f 6f 70 20 74 68 72 6f 75 67 68 20 65    Loop through e
a660: 61 63 68 20 65 78 70 72 65 73 73 69 6f 6e 0a 20  ach expression. 
a670: 20 20 20 2a 2a 20 69 6e 20 74 68 65 20 72 65 73     ** in the res
a680: 75 6c 74 20 73 65 74 20 61 6e 64 20 65 78 70 61  ult set and expa
a690: 6e 64 20 74 68 65 6d 20 6f 6e 65 20 62 79 20 6f  nd them one by o
a6a0: 6e 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73  ne..    */.    s
a6b0: 74 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69  truct ExprList_i
a6c0: 74 65 6d 20 2a 61 20 3d 20 70 45 4c 69 73 74 2d  tem *a = pEList-
a6d0: 3e 61 3b 0a 20 20 20 20 45 78 70 72 4c 69 73 74  >a;.    ExprList
a6e0: 20 2a 70 4e 65 77 20 3d 20 30 3b 0a 20 20 20 20   *pNew = 0;.    
a6f0: 69 6e 74 20 66 6c 61 67 73 20 3d 20 70 50 61 72  int flags = pPar
a700: 73 65 2d 3e 64 62 2d 3e 66 6c 61 67 73 3b 0a 20  se->db->flags;. 
a710: 20 20 20 69 6e 74 20 6c 6f 6e 67 4e 61 6d 65 73     int longNames
a720: 20 3d 20 28 66 6c 61 67 73 20 26 20 53 51 4c 49   = (flags & SQLI
a730: 54 45 5f 46 75 6c 6c 43 6f 6c 4e 61 6d 65 73 29  TE_FullColNames)
a740: 21 3d 30 20 26 26 0a 20 20 20 20 20 20 20 20 20  !=0 &&.         
a750: 20 20 20 20 20 20 20 20 20 20 20 20 20 28 66 6c               (fl
a760: 61 67 73 20 26 20 53 51 4c 49 54 45 5f 53 68 6f  ags & SQLITE_Sho
a770: 72 74 43 6f 6c 4e 61 6d 65 73 29 3d 3d 30 3b 0a  rtColNames)==0;.
a780: 0a 20 20 20 20 66 6f 72 28 6b 3d 30 3b 20 6b 3c  .    for(k=0; k<
a790: 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 6b  pEList->nExpr; k
a7a0: 2b 2b 29 7b 0a 20 20 20 20 20 20 45 78 70 72 20  ++){.      Expr 
a7b0: 2a 70 45 20 3d 20 61 5b 6b 5d 2e 70 45 78 70 72  *pE = a[k].pExpr
a7c0: 3b 0a 20 20 20 20 20 20 69 66 28 20 70 45 2d 3e  ;.      if( pE->
a7d0: 6f 70 21 3d 54 4b 5f 41 4c 4c 20 26 26 0a 20 20  op!=TK_ALL &&.  
a7e0: 20 20 20 20 20 20 20 20 20 28 70 45 2d 3e 6f 70           (pE->op
a7f0: 21 3d 54 4b 5f 44 4f 54 20 7c 7c 20 70 45 2d 3e  !=TK_DOT || pE->
a800: 70 52 69 67 68 74 3d 3d 30 20 7c 7c 20 70 45 2d  pRight==0 || pE-
a810: 3e 70 52 69 67 68 74 2d 3e 6f 70 21 3d 54 4b 5f  >pRight->op!=TK_
a820: 41 4c 4c 29 20 29 7b 0a 20 20 20 20 20 20 20 20  ALL) ){.        
a830: 2f 2a 20 54 68 69 73 20 70 61 72 74 69 63 75 6c  /* This particul
a840: 61 72 20 65 78 70 72 65 73 73 69 6f 6e 20 64 6f  ar expression do
a850: 65 73 20 6e 6f 74 20 6e 65 65 64 20 74 6f 20 62  es not need to b
a860: 65 20 65 78 70 61 6e 64 65 64 2e 0a 20 20 20 20  e expanded..    
a870: 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 70      */.        p
a880: 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 45 78 70  New = sqlite3Exp
a890: 72 4c 69 73 74 41 70 70 65 6e 64 28 70 50 61 72  rListAppend(pPar
a8a0: 73 65 2c 20 70 4e 65 77 2c 20 61 5b 6b 5d 2e 70  se, pNew, a[k].p
a8b0: 45 78 70 72 2c 20 30 29 3b 0a 20 20 20 20 20 20  Expr, 0);.      
a8c0: 20 20 69 66 28 20 70 4e 65 77 20 29 7b 0a 20 20    if( pNew ){.  
a8d0: 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 61 5b          pNew->a[
a8e0: 70 4e 65 77 2d 3e 6e 45 78 70 72 2d 31 5d 2e 7a  pNew->nExpr-1].z
a8f0: 4e 61 6d 65 20 3d 20 61 5b 6b 5d 2e 7a 4e 61 6d  Name = a[k].zNam
a900: 65 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  e;.        }else
a910: 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  {.          rc =
a920: 20 31 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20   1;.        }.  
a930: 20 20 20 20 20 20 61 5b 6b 5d 2e 70 45 78 70 72        a[k].pExpr
a940: 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 61 5b   = 0;.        a[
a950: 6b 5d 2e 7a 4e 61 6d 65 20 3d 20 30 3b 0a 20 20  k].zName = 0;.  
a960: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
a970: 20 20 20 2f 2a 20 54 68 69 73 20 65 78 70 72 65     /* This expre
a980: 73 73 69 6f 6e 20 69 73 20 61 20 22 2a 22 20 6f  ssion is a "*" o
a990: 72 20 61 20 22 54 41 42 4c 45 2e 2a 22 20 61 6e  r a "TABLE.*" an
a9a0: 64 20 6e 65 65 64 73 20 74 6f 20 62 65 0a 20 20  d needs to be.  
a9b0: 20 20 20 20 20 20 2a 2a 20 65 78 70 61 6e 64 65        ** expande
a9c0: 64 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e  d. */.        in
a9d0: 74 20 74 61 62 6c 65 53 65 65 6e 20 3d 20 30 3b  t tableSeen = 0;
a9e0: 20 20 20 20 20 20 2f 2a 20 53 65 74 20 74 6f 20        /* Set to 
a9f0: 31 20 77 68 65 6e 20 54 41 42 4c 45 20 6d 61 74  1 when TABLE mat
aa00: 63 68 65 73 20 2a 2f 0a 20 20 20 20 20 20 20 20  ches */.        
aa10: 63 68 61 72 20 2a 7a 54 4e 61 6d 65 3b 20 20 20  char *zTName;   
aa20: 20 20 20 20 20 20 20 20 20 2f 2a 20 74 65 78 74           /* text
aa30: 20 6f 66 20 6e 61 6d 65 20 6f 66 20 54 41 42 4c   of name of TABL
aa40: 45 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28  E */.        if(
aa50: 20 70 45 2d 3e 6f 70 3d 3d 54 4b 5f 44 4f 54 20   pE->op==TK_DOT 
aa60: 26 26 20 70 45 2d 3e 70 4c 65 66 74 20 29 7b 0a  && pE->pLeft ){.
aa70: 20 20 20 20 20 20 20 20 20 20 7a 54 4e 61 6d 65            zTName
aa80: 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65 46 72   = sqlite3NameFr
aa90: 6f 6d 54 6f 6b 65 6e 28 64 62 2c 20 26 70 45 2d  omToken(db, &pE-
aaa0: 3e 70 4c 65 66 74 2d 3e 74 6f 6b 65 6e 29 3b 0a  >pLeft->token);.
aab0: 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
aac0: 20 20 20 20 20 20 20 20 20 7a 54 4e 61 6d 65 20           zTName 
aad0: 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  = 0;.        }. 
aae0: 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30 2c 20         for(i=0, 
aaf0: 70 46 72 6f 6d 3d 70 54 61 62 4c 69 73 74 2d 3e  pFrom=pTabList->
ab00: 61 3b 20 69 3c 70 54 61 62 4c 69 73 74 2d 3e 6e  a; i<pTabList->n
ab10: 53 72 63 3b 20 69 2b 2b 2c 20 70 46 72 6f 6d 2b  Src; i++, pFrom+
ab20: 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 54 61  +){.          Ta
ab30: 62 6c 65 20 2a 70 54 61 62 20 3d 20 70 46 72 6f  ble *pTab = pFro
ab40: 6d 2d 3e 70 54 61 62 3b 0a 20 20 20 20 20 20 20  m->pTab;.       
ab50: 20 20 20 63 68 61 72 20 2a 7a 54 61 62 4e 61 6d     char *zTabNam
ab60: 65 20 3d 20 70 46 72 6f 6d 2d 3e 7a 41 6c 69 61  e = pFrom->zAlia
ab70: 73 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  s;.          if(
ab80: 20 7a 54 61 62 4e 61 6d 65 3d 3d 30 20 7c 7c 20   zTabName==0 || 
ab90: 7a 54 61 62 4e 61 6d 65 5b 30 5d 3d 3d 30 20 29  zTabName[0]==0 )
aba0: 7b 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 7a  { .            z
abb0: 54 61 62 4e 61 6d 65 20 3d 20 70 54 61 62 2d 3e  TabName = pTab->
abc0: 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20 20 20 20  zName;.         
abd0: 20 7d 0a 20 20 20 20 20 20 20 20 20 20 69 66 28   }.          if(
abe0: 20 7a 54 4e 61 6d 65 20 26 26 20 28 7a 54 61 62   zTName && (zTab
abf0: 4e 61 6d 65 3d 3d 30 20 7c 7c 20 7a 54 61 62 4e  Name==0 || zTabN
ac00: 61 6d 65 5b 30 5d 3d 3d 30 20 7c 7c 20 0a 20 20  ame[0]==0 || .  
ac10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73                 s
ac20: 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 7a 54  qlite3StrICmp(zT
ac30: 4e 61 6d 65 2c 20 7a 54 61 62 4e 61 6d 65 29 21  Name, zTabName)!
ac40: 3d 30 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20  =0) ){.         
ac50: 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20     continue;.   
ac60: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
ac70: 20 20 20 74 61 62 6c 65 53 65 65 6e 20 3d 20 31     tableSeen = 1
ac80: 3b 0a 20 20 20 20 20 20 20 20 20 20 66 6f 72 28  ;.          for(
ac90: 6a 3d 30 3b 20 6a 3c 70 54 61 62 2d 3e 6e 43 6f  j=0; j<pTab->nCo
aca0: 6c 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20  l; j++){.       
acb0: 20 20 20 20 20 45 78 70 72 20 2a 70 45 78 70 72       Expr *pExpr
acc0: 2c 20 2a 70 52 69 67 68 74 3b 0a 20 20 20 20 20  , *pRight;.     
acd0: 20 20 20 20 20 20 20 63 68 61 72 20 2a 7a 4e 61         char *zNa
ace0: 6d 65 20 3d 20 70 54 61 62 2d 3e 61 43 6f 6c 5b  me = pTab->aCol[
acf0: 6a 5d 2e 7a 4e 61 6d 65 3b 0a 0a 20 20 20 20 20  j].zName;..     
ad00: 20 20 20 20 20 20 20 2f 2a 20 49 66 20 61 20 63         /* If a c
ad10: 6f 6c 75 6d 6e 20 69 73 20 6d 61 72 6b 65 64 20  olumn is marked 
ad20: 61 73 20 27 68 69 64 64 65 6e 27 20 28 63 75 72  as 'hidden' (cur
ad30: 72 65 6e 74 6c 79 20 6f 6e 6c 79 20 70 6f 73 73  rently only poss
ad40: 69 62 6c 65 0a 20 20 20 20 20 20 20 20 20 20 20  ible.           
ad50: 20 2a 2a 20 66 6f 72 20 76 69 72 74 75 61 6c 20   ** for virtual 
ad60: 74 61 62 6c 65 73 29 2c 20 64 6f 20 6e 6f 74 20  tables), do not 
ad70: 69 6e 63 6c 75 64 65 20 69 74 20 69 6e 20 74 68  include it in th
ad80: 65 20 65 78 70 61 6e 64 65 64 0a 20 20 20 20 20  e expanded.     
ad90: 20 20 20 20 20 20 20 2a 2a 20 72 65 73 75 6c 74         ** result
ada0: 2d 73 65 74 20 6c 69 73 74 2e 0a 20 20 20 20 20  -set list..     
adb0: 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
adc0: 20 20 20 20 20 20 69 66 28 20 49 73 48 69 64 64        if( IsHidd
add0: 65 6e 43 6f 6c 75 6d 6e 28 26 70 54 61 62 2d 3e  enColumn(&pTab->
ade0: 61 43 6f 6c 5b 6a 5d 29 20 29 7b 0a 20 20 20 20  aCol[j]) ){.    
adf0: 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74            assert
ae00: 28 49 73 56 69 72 74 75 61 6c 28 70 54 61 62 29  (IsVirtual(pTab)
ae10: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  );.             
ae20: 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
ae30: 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20         }..      
ae40: 20 20 20 20 20 20 69 66 28 20 69 3e 30 20 29 7b        if( i>0 ){
ae50: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73  .              s
ae60: 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74  truct SrcList_it
ae70: 65 6d 20 2a 70 4c 65 66 74 20 3d 20 26 70 54 61  em *pLeft = &pTa
ae80: 62 4c 69 73 74 2d 3e 61 5b 69 2d 31 5d 3b 0a 20  bList->a[i-1];. 
ae90: 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28               if(
aea0: 20 28 70 4c 65 66 74 5b 31 5d 2e 6a 6f 69 6e 74   (pLeft[1].joint
aeb0: 79 70 65 20 26 20 4a 54 5f 4e 41 54 55 52 41 4c  ype & JT_NATURAL
aec0: 29 21 3d 30 20 26 26 0a 20 20 20 20 20 20 20 20  )!=0 &&.        
aed0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
aee0: 63 6f 6c 75 6d 6e 49 6e 64 65 78 28 70 4c 65 66  columnIndex(pLef
aef0: 74 2d 3e 70 54 61 62 2c 20 7a 4e 61 6d 65 29 3e  t->pTab, zName)>
af00: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
af10: 20 20 20 20 20 20 2f 2a 20 49 6e 20 61 20 4e 41        /* In a NA
af20: 54 55 52 41 4c 20 6a 6f 69 6e 2c 20 6f 6d 69 74  TURAL join, omit
af30: 20 74 68 65 20 6a 6f 69 6e 20 63 6f 6c 75 6d 6e   the join column
af40: 73 20 66 72 6f 6d 20 74 68 65 20 0a 20 20 20 20  s from the .    
af50: 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 74              ** t
af60: 61 62 6c 65 20 6f 6e 20 74 68 65 20 72 69 67 68  able on the righ
af70: 74 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20  t */.           
af80: 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20       continue;. 
af90: 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20               }. 
afa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28               if(
afb0: 20 73 71 6c 69 74 65 33 49 64 4c 69 73 74 49 6e   sqlite3IdListIn
afc0: 64 65 78 28 70 4c 65 66 74 5b 31 5d 2e 70 55 73  dex(pLeft[1].pUs
afd0: 69 6e 67 2c 20 7a 4e 61 6d 65 29 3e 3d 30 20 29  ing, zName)>=0 )
afe0: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
aff0: 20 20 2f 2a 20 49 6e 20 61 20 6a 6f 69 6e 20 77    /* In a join w
b000: 69 74 68 20 61 20 55 53 49 4e 47 20 63 6c 61 75  ith a USING clau
b010: 73 65 2c 20 6f 6d 69 74 20 63 6f 6c 75 6d 6e 73  se, omit columns
b020: 20 69 6e 20 74 68 65 0a 20 20 20 20 20 20 20 20   in the.        
b030: 20 20 20 20 20 20 20 20 2a 2a 20 75 73 69 6e 67          ** using
b040: 20 63 6c 61 75 73 65 20 66 72 6f 6d 20 74 68 65   clause from the
b050: 20 74 61 62 6c 65 20 6f 6e 20 74 68 65 20 72 69   table on the ri
b060: 67 68 74 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20  ght. */.        
b070: 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65          continue
b080: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
b090: 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a  }.            }.
b0a0: 20 20 20 20 20 20 20 20 20 20 20 20 70 52 69 67              pRig
b0b0: 68 74 20 3d 20 73 71 6c 69 74 65 33 50 45 78 70  ht = sqlite3PExp
b0c0: 72 28 70 50 61 72 73 65 2c 20 54 4b 5f 49 44 2c  r(pParse, TK_ID,
b0d0: 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20   0, 0, 0);.     
b0e0: 20 20 20 20 20 20 20 69 66 28 20 70 52 69 67 68         if( pRigh
b0f0: 74 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20  t==0 ) break;.  
b100: 20 20 20 20 20 20 20 20 20 20 73 65 74 51 75 6f            setQuo
b110: 74 65 64 54 6f 6b 65 6e 28 70 50 61 72 73 65 2c  tedToken(pParse,
b120: 20 26 70 52 69 67 68 74 2d 3e 74 6f 6b 65 6e 2c   &pRight->token,
b130: 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20   zName);.       
b140: 20 20 20 20 20 69 66 28 20 7a 54 61 62 4e 61 6d       if( zTabNam
b150: 65 20 26 26 20 28 6c 6f 6e 67 4e 61 6d 65 73 20  e && (longNames 
b160: 7c 7c 20 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72  || pTabList->nSr
b170: 63 3e 31 29 20 29 7b 0a 20 20 20 20 20 20 20 20  c>1) ){.        
b180: 20 20 20 20 20 20 45 78 70 72 20 2a 70 4c 65 66        Expr *pLef
b190: 74 20 3d 20 73 71 6c 69 74 65 33 50 45 78 70 72  t = sqlite3PExpr
b1a0: 28 70 50 61 72 73 65 2c 20 54 4b 5f 49 44 2c 20  (pParse, TK_ID, 
b1b0: 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20  0, 0, 0);.      
b1c0: 20 20 20 20 20 20 20 20 70 45 78 70 72 20 3d 20          pExpr = 
b1d0: 73 71 6c 69 74 65 33 50 45 78 70 72 28 70 50 61  sqlite3PExpr(pPa
b1e0: 72 73 65 2c 20 54 4b 5f 44 4f 54 2c 20 70 4c 65  rse, TK_DOT, pLe
b1f0: 66 74 2c 20 70 52 69 67 68 74 2c 20 30 29 3b 0a  ft, pRight, 0);.
b200: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66                if
b210: 28 20 70 45 78 70 72 3d 3d 30 20 29 20 62 72 65  ( pExpr==0 ) bre
b220: 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ak;.            
b230: 20 20 73 65 74 51 75 6f 74 65 64 54 6f 6b 65 6e    setQuotedToken
b240: 28 70 50 61 72 73 65 2c 20 26 70 4c 65 66 74 2d  (pParse, &pLeft-
b250: 3e 74 6f 6b 65 6e 2c 20 7a 54 61 62 4e 61 6d 65  >token, zTabName
b260: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  );.             
b270: 20 73 65 74 54 6f 6b 65 6e 28 26 70 45 78 70 72   setToken(&pExpr
b280: 2d 3e 73 70 61 6e 2c 20 0a 20 20 20 20 20 20 20  ->span, .       
b290: 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
b2a0: 65 33 4d 50 72 69 6e 74 66 28 64 62 2c 20 22 25  e3MPrintf(db, "%
b2b0: 73 2e 25 73 22 2c 20 7a 54 61 62 4e 61 6d 65 2c  s.%s", zTabName,
b2c0: 20 7a 4e 61 6d 65 29 29 3b 0a 20 20 20 20 20 20   zName));.      
b2d0: 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 73          pExpr->s
b2e0: 70 61 6e 2e 64 79 6e 20 3d 20 31 3b 0a 20 20 20  pan.dyn = 1;.   
b2f0: 20 20 20 20 20 20 20 20 20 20 20 70 45 78 70 72             pExpr
b300: 2d 3e 74 6f 6b 65 6e 2e 7a 20 3d 20 30 3b 0a 20  ->token.z = 0;. 
b310: 20 20 20 20 20 20 20 20 20 20 20 20 20 70 45 78               pEx
b320: 70 72 2d 3e 74 6f 6b 65 6e 2e 6e 20 3d 20 30 3b  pr->token.n = 0;
b330: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70  .              p
b340: 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 64 79 6e 20  Expr->token.dyn 
b350: 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 20  = 0;.           
b360: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
b370: 20 20 20 20 20 20 70 45 78 70 72 20 3d 20 70 52        pExpr = pR
b380: 69 67 68 74 3b 0a 20 20 20 20 20 20 20 20 20 20  ight;.          
b390: 20 20 20 20 70 45 78 70 72 2d 3e 73 70 61 6e 20      pExpr->span 
b3a0: 3d 20 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 3b 0a  = pExpr->token;.
b3b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 45                pE
b3c0: 78 70 72 2d 3e 73 70 61 6e 2e 64 79 6e 20 3d 20  xpr->span.dyn = 
b3d0: 30 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  0;.            }
b3e0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28  .            if(
b3f0: 20 6c 6f 6e 67 4e 61 6d 65 73 20 29 7b 0a 20 20   longNames ){.  
b400: 20 20 20 20 20 20 20 20 20 20 20 20 70 4e 65 77              pNew
b410: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69   = sqlite3ExprLi
b420: 73 74 41 70 70 65 6e 64 28 70 50 61 72 73 65 2c  stAppend(pParse,
b430: 20 70 4e 65 77 2c 20 70 45 78 70 72 2c 20 26 70   pNew, pExpr, &p
b440: 45 78 70 72 2d 3e 73 70 61 6e 29 3b 0a 20 20 20  Expr->span);.   
b450: 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a           }else{.
b460: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 4e                pN
b470: 65 77 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  ew = sqlite3Expr
b480: 4c 69 73 74 41 70 70 65 6e 64 28 70 50 61 72 73  ListAppend(pPars
b490: 65 2c 20 70 4e 65 77 2c 20 70 45 78 70 72 2c 20  e, pNew, pExpr, 
b4a0: 26 70 52 69 67 68 74 2d 3e 74 6f 6b 65 6e 29 3b  &pRight->token);
b4b0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20  .            }. 
b4c0: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
b4d0: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28     }.        if(
b4e0: 20 21 74 61 62 6c 65 53 65 65 6e 20 29 7b 0a 20   !tableSeen ){. 
b4f0: 20 20 20 20 20 20 20 20 20 69 66 28 20 7a 54 4e           if( zTN
b500: 61 6d 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ame ){.         
b510: 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
b520: 73 67 28 70 50 61 72 73 65 2c 20 22 6e 6f 20 73  sg(pParse, "no s
b530: 75 63 68 20 74 61 62 6c 65 3a 20 25 73 22 2c 20  uch table: %s", 
b540: 7a 54 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20  zTName);.       
b550: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
b560: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72        sqlite3Err
b570: 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 6e  orMsg(pParse, "n
b580: 6f 20 74 61 62 6c 65 73 20 73 70 65 63 69 66 69  o tables specifi
b590: 65 64 22 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ed");.          
b5a0: 7d 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  }.          rc =
b5b0: 20 31 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20   1;.        }.  
b5c0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72        sqlite3_fr
b5d0: 65 65 28 7a 54 4e 61 6d 65 29 3b 0a 20 20 20 20  ee(zTName);.    
b5e0: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73 71    }.    }.    sq
b5f0: 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c  lite3ExprListDel
b600: 65 74 65 28 70 45 4c 69 73 74 29 3b 0a 20 20 20  ete(pEList);.   
b610: 20 70 2d 3e 70 45 4c 69 73 74 20 3d 20 70 4e 65   p->pEList = pNe
b620: 77 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e  w;.  }.  if( p->
b630: 70 45 4c 69 73 74 20 26 26 20 70 2d 3e 70 45 4c  pEList && p->pEL
b640: 69 73 74 2d 3e 6e 45 78 70 72 3e 53 51 4c 49 54  ist->nExpr>SQLIT
b650: 45 5f 4d 41 58 5f 43 4f 4c 55 4d 4e 20 29 7b 0a  E_MAX_COLUMN ){.
b660: 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
b670: 4d 73 67 28 70 50 61 72 73 65 2c 20 22 74 6f 6f  Msg(pParse, "too
b680: 20 6d 61 6e 79 20 63 6f 6c 75 6d 6e 73 20 69 6e   many columns in
b690: 20 72 65 73 75 6c 74 20 73 65 74 22 29 3b 0a 20   result set");. 
b6a0: 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 45     rc = SQLITE_E
b6b0: 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20  RROR;.  }.  if( 
b6c0: 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
b6d0: 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c   ){.    rc = SQL
b6e0: 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20  ITE_NOMEM;.  }. 
b6f0: 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23   return rc;.}..#
b700: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
b710: 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45  IT_COMPOUND_SELE
b720: 43 54 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  CT./*.** This ro
b730: 75 74 69 6e 65 20 61 73 73 6f 63 69 61 74 65 73  utine associates
b740: 20 65 6e 74 72 69 65 73 20 69 6e 20 61 6e 20 4f   entries in an O
b750: 52 44 45 52 20 42 59 20 65 78 70 72 65 73 73 69  RDER BY expressi
b760: 6f 6e 20 6c 69 73 74 20 77 69 74 68 0a 2a 2a 20  on list with.** 
b770: 63 6f 6c 75 6d 6e 73 20 69 6e 20 61 20 72 65 73  columns in a res
b780: 75 6c 74 2e 20 20 46 6f 72 20 65 61 63 68 20 4f  ult.  For each O
b790: 52 44 45 52 20 42 59 20 65 78 70 72 65 73 73 69  RDER BY expressi
b7a0: 6f 6e 2c 20 74 68 65 20 6f 70 63 6f 64 65 20 6f  on, the opcode o
b7b0: 66 0a 2a 2a 20 74 68 65 20 74 6f 70 2d 6c 65 76  f.** the top-lev
b7c0: 65 6c 20 6e 6f 64 65 20 69 73 20 63 68 61 6e 67  el node is chang
b7d0: 65 64 20 74 6f 20 54 4b 5f 43 4f 4c 55 4d 4e 20  ed to TK_COLUMN 
b7e0: 61 6e 64 20 74 68 65 20 69 43 6f 6c 75 6d 6e 20  and the iColumn 
b7f0: 76 61 6c 75 65 20 6f 66 0a 2a 2a 20 74 68 65 20  value of.** the 
b800: 74 6f 70 2d 6c 65 76 65 6c 20 6e 6f 64 65 20 69  top-level node i
b810: 73 20 66 69 6c 6c 65 64 20 69 6e 20 77 69 74 68  s filled in with
b820: 20 63 6f 6c 75 6d 6e 20 6e 75 6d 62 65 72 20 61   column number a
b830: 6e 64 20 74 68 65 20 69 54 61 62 6c 65 0a 2a 2a  nd the iTable.**
b840: 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 74 6f   value of the to
b850: 70 2d 6c 65 76 65 6c 20 6e 6f 64 65 20 69 73 20  p-level node is 
b860: 66 69 6c 6c 65 64 20 77 69 74 68 20 69 54 61 62  filled with iTab
b870: 6c 65 20 70 61 72 61 6d 65 74 65 72 2e 0a 2a 2a  le parameter..**
b880: 0a 2a 2a 20 49 66 20 74 68 65 72 65 20 61 72 65  .** If there are
b890: 20 70 72 69 6f 72 20 53 45 4c 45 43 54 20 63 6c   prior SELECT cl
b8a0: 61 75 73 65 73 2c 20 74 68 65 79 20 61 72 65 20  auses, they are 
b8b0: 70 72 6f 63 65 73 73 65 64 20 66 69 72 73 74 2e  processed first.
b8c0: 20 20 41 20 6d 61 74 63 68 0a 2a 2a 20 69 6e 20    A match.** in 
b8d0: 61 6e 20 65 61 72 6c 69 65 72 20 53 45 4c 45 43  an earlier SELEC
b8e0: 54 20 74 61 6b 65 73 20 70 72 65 63 65 64 65 6e  T takes preceden
b8f0: 63 65 20 6f 76 65 72 20 61 20 6c 61 74 65 72 20  ce over a later 
b900: 53 45 4c 45 43 54 2e 0a 2a 2a 0a 2a 2a 20 41 6e  SELECT..**.** An
b910: 79 20 65 6e 74 72 79 20 74 68 61 74 20 64 6f 65  y entry that doe
b920: 73 20 6e 6f 74 20 6d 61 74 63 68 20 69 73 20 66  s not match is f
b930: 6c 61 67 67 65 64 20 61 73 20 61 6e 20 65 72 72  lagged as an err
b940: 6f 72 2e 20 20 54 68 65 20 6e 75 6d 62 65 72 0a  or.  The number.
b950: 2a 2a 20 6f 66 20 65 72 72 6f 72 73 20 69 73 20  ** of errors is 
b960: 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61  returned..*/.sta
b970: 74 69 63 20 69 6e 74 20 6d 61 74 63 68 4f 72 64  tic int matchOrd
b980: 65 72 62 79 54 6f 43 6f 6c 75 6d 6e 28 0a 20 20  erbyToColumn(.  
b990: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
b9a0: 20 20 20 20 20 20 20 20 2f 2a 20 41 20 70 6c 61          /* A pla
b9b0: 63 65 20 74 6f 20 6c 65 61 76 65 20 65 72 72 6f  ce to leave erro
b9c0: 72 20 6d 65 73 73 61 67 65 73 20 2a 2f 0a 20 20  r messages */.  
b9d0: 53 65 6c 65 63 74 20 2a 70 53 65 6c 65 63 74 2c  Select *pSelect,
b9e0: 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 74 63 68          /* Match
b9f0: 20 74 6f 20 72 65 73 75 6c 74 20 63 6f 6c 75 6d   to result colum
ba00: 6e 73 20 6f 66 20 74 68 69 73 20 53 45 4c 45 43  ns of this SELEC
ba10: 54 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20  T */.  ExprList 
ba20: 2a 70 4f 72 64 65 72 42 79 2c 20 20 20 20 20 2f  *pOrderBy,     /
ba30: 2a 20 54 68 65 20 4f 52 44 45 52 20 42 59 20 76  * The ORDER BY v
ba40: 61 6c 75 65 73 20 74 6f 20 6d 61 74 63 68 20 61  alues to match a
ba50: 67 61 69 6e 73 74 20 63 6f 6c 75 6d 6e 73 20 2a  gainst columns *
ba60: 2f 0a 20 20 69 6e 74 20 69 54 61 62 6c 65 2c 20  /.  int iTable, 
ba70: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
ba80: 6e 73 65 72 74 20 74 68 69 73 20 76 61 6c 75 65  nsert this value
ba90: 20 69 6e 20 69 54 61 62 6c 65 20 2a 2f 0a 20 20   in iTable */.  
baa0: 69 6e 74 20 6d 75 73 74 43 6f 6d 70 6c 65 74 65  int mustComplete
bab0: 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 54 52          /* If TR
bac0: 55 45 20 61 6c 6c 20 4f 52 44 45 52 20 42 59 73  UE all ORDER BYs
bad0: 20 6d 75 73 74 20 6d 61 74 63 68 20 2a 2f 0a 29   must match */.)
bae0: 7b 0a 20 20 69 6e 74 20 6e 45 72 72 20 3d 20 30  {.  int nErr = 0
baf0: 3b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20  ;.  int i, j;.  
bb00: 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74  ExprList *pEList
bb10: 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20  ;.  sqlite3 *db 
bb20: 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 0a 20  = pParse->db;.. 
bb30: 20 69 66 28 20 70 53 65 6c 65 63 74 3d 3d 30 20   if( pSelect==0 
bb40: 7c 7c 20 70 4f 72 64 65 72 42 79 3d 3d 30 20 29  || pOrderBy==0 )
bb50: 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 69 66 28   return 1;.  if(
bb60: 20 6d 75 73 74 43 6f 6d 70 6c 65 74 65 20 29 7b   mustComplete ){
bb70: 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
bb80: 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 3b  pOrderBy->nExpr;
bb90: 20 69 2b 2b 29 7b 20 70 4f 72 64 65 72 42 79 2d   i++){ pOrderBy-
bba0: 3e 61 5b 69 5d 2e 64 6f 6e 65 20 3d 20 30 3b 20  >a[i].done = 0; 
bbb0: 7d 0a 20 20 7d 0a 20 20 69 66 28 20 70 72 65 70  }.  }.  if( prep
bbc0: 53 65 6c 65 63 74 53 74 6d 74 28 70 50 61 72 73  SelectStmt(pPars
bbd0: 65 2c 20 70 53 65 6c 65 63 74 29 20 29 7b 0a 20  e, pSelect) ){. 
bbe0: 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d     return 1;.  }
bbf0: 0a 20 20 69 66 28 20 70 53 65 6c 65 63 74 2d 3e  .  if( pSelect->
bc00: 70 50 72 69 6f 72 20 29 7b 0a 20 20 20 20 69 66  pPrior ){.    if
bc10: 28 20 6d 61 74 63 68 4f 72 64 65 72 62 79 54 6f  ( matchOrderbyTo
bc20: 43 6f 6c 75 6d 6e 28 70 50 61 72 73 65 2c 20 70  Column(pParse, p
bc30: 53 65 6c 65 63 74 2d 3e 70 50 72 69 6f 72 2c 20  Select->pPrior, 
bc40: 70 4f 72 64 65 72 42 79 2c 20 69 54 61 62 6c 65  pOrderBy, iTable
bc50: 2c 20 30 29 20 29 7b 0a 20 20 20 20 20 20 72 65  , 0) ){.      re
bc60: 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20  turn 1;.    }.  
bc70: 7d 0a 20 20 70 45 4c 69 73 74 20 3d 20 70 53 65  }.  pEList = pSe
bc80: 6c 65 63 74 2d 3e 70 45 4c 69 73 74 3b 0a 20 20  lect->pEList;.  
bc90: 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4f 72 64 65  for(i=0; i<pOrde
bca0: 72 42 79 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29  rBy->nExpr; i++)
bcb0: 7b 0a 20 20 20 20 73 74 72 75 63 74 20 45 78 70  {.    struct Exp
bcc0: 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65  rList_item *pIte
bcd0: 6d 3b 0a 20 20 20 20 45 78 70 72 20 2a 70 45 20  m;.    Expr *pE 
bce0: 3d 20 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d  = pOrderBy->a[i]
bcf0: 2e 70 45 78 70 72 3b 0a 20 20 20 20 69 6e 74 20  .pExpr;.    int 
bd00: 69 43 6f 6c 20 3d 20 2d 31 3b 0a 20 20 20 20 63  iCol = -1;.    c
bd10: 68 61 72 20 2a 7a 4c 61 62 65 6c 3b 0a 0a 20 20  har *zLabel;..  
bd20: 20 20 69 66 28 20 70 4f 72 64 65 72 42 79 2d 3e    if( pOrderBy->
bd30: 61 5b 69 5d 2e 64 6f 6e 65 20 29 20 63 6f 6e 74  a[i].done ) cont
bd40: 69 6e 75 65 3b 0a 20 20 20 20 69 66 28 20 73 71  inue;.    if( sq
bd50: 6c 69 74 65 33 45 78 70 72 49 73 49 6e 74 65 67  lite3ExprIsInteg
bd60: 65 72 28 70 45 2c 20 26 69 43 6f 6c 29 20 29 7b  er(pE, &iCol) ){
bd70: 0a 20 20 20 20 20 20 69 66 28 20 69 43 6f 6c 3c  .      if( iCol<
bd80: 3d 30 20 7c 7c 20 69 43 6f 6c 3e 70 45 4c 69 73  =0 || iCol>pELis
bd90: 74 2d 3e 6e 45 78 70 72 20 29 7b 0a 20 20 20 20  t->nExpr ){.    
bda0: 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
bdb0: 4d 73 67 28 70 50 61 72 73 65 2c 0a 20 20 20 20  Msg(pParse,.    
bdc0: 20 20 20 20 20 20 22 4f 52 44 45 52 20 42 59 20        "ORDER BY 
bdd0: 70 6f 73 69 74 69 6f 6e 20 25 64 20 73 68 6f 75  position %d shou
bde0: 6c 64 20 62 65 20 62 65 74 77 65 65 6e 20 31 20  ld be between 1 
bdf0: 61 6e 64 20 25 64 22 2c 0a 20 20 20 20 20 20 20  and %d",.       
be00: 20 20 20 69 43 6f 6c 2c 20 70 45 4c 69 73 74 2d     iCol, pEList-
be10: 3e 6e 45 78 70 72 29 3b 0a 20 20 20 20 20 20 20  >nExpr);.       
be20: 20 6e 45 72 72 2b 2b 3b 0a 20 20 20 20 20 20 20   nErr++;.       
be30: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
be40: 20 20 20 20 20 20 69 66 28 20 21 6d 75 73 74 43        if( !mustC
be50: 6f 6d 70 6c 65 74 65 20 29 20 63 6f 6e 74 69 6e  omplete ) contin
be60: 75 65 3b 0a 20 20 20 20 20 20 69 43 6f 6c 2d 2d  ue;.      iCol--
be70: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
be80: 69 43 6f 6c 3c 30 20 26 26 20 28 7a 4c 61 62 65  iCol<0 && (zLabe
be90: 6c 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65 46  l = sqlite3NameF
bea0: 72 6f 6d 54 6f 6b 65 6e 28 64 62 2c 20 26 70 45  romToken(db, &pE
beb0: 2d 3e 74 6f 6b 65 6e 29 29 21 3d 30 20 29 7b 0a  ->token))!=0 ){.
bec0: 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 2c 20 70        for(j=0, p
bed0: 49 74 65 6d 3d 70 45 4c 69 73 74 2d 3e 61 3b 20  Item=pEList->a; 
bee0: 6a 3c 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b  j<pEList->nExpr;
bef0: 20 6a 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a   j++, pItem++){.
bf00: 20 20 20 20 20 20 20 20 63 68 61 72 20 2a 7a 4e          char *zN
bf10: 61 6d 65 3b 0a 20 20 20 20 20 20 20 20 69 6e 74  ame;.        int
bf20: 20 69 73 4d 61 74 63 68 3b 0a 20 20 20 20 20 20   isMatch;.      
bf30: 20 20 69 66 28 20 70 49 74 65 6d 2d 3e 7a 4e 61    if( pItem->zNa
bf40: 6d 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  me ){.          
bf50: 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 44  zName = sqlite3D
bf60: 62 53 74 72 44 75 70 28 64 62 2c 20 70 49 74 65  bStrDup(db, pIte
bf70: 6d 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20  m->zName);.     
bf80: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
bf90: 20 20 20 20 7a 4e 61 6d 65 20 3d 20 73 71 6c 69      zName = sqli
bfa0: 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e  te3NameFromToken
bfb0: 28 64 62 2c 20 26 70 49 74 65 6d 2d 3e 70 45 78  (db, &pItem->pEx
bfc0: 70 72 2d 3e 74 6f 6b 65 6e 29 3b 0a 20 20 20 20  pr->token);.    
bfd0: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 73      }.        is
bfe0: 4d 61 74 63 68 20 3d 20 7a 4e 61 6d 65 20 26 26  Match = zName &&
bff0: 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28   sqlite3StrICmp(
c000: 7a 4e 61 6d 65 2c 20 7a 4c 61 62 65 6c 29 3d 3d  zName, zLabel)==
c010: 30 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  0;.        sqlit
c020: 65 33 5f 66 72 65 65 28 7a 4e 61 6d 65 29 3b 0a  e3_free(zName);.
c030: 20 20 20 20 20 20 20 20 69 66 28 20 69 73 4d 61          if( isMa
c040: 74 63 68 20 29 7b 0a 20 20 20 20 20 20 20 20 20  tch ){.         
c050: 20 69 43 6f 6c 20 3d 20 6a 3b 0a 20 20 20 20 20   iCol = j;.     
c060: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
c070: 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
c080: 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
c090: 28 7a 4c 61 62 65 6c 29 3b 0a 20 20 20 20 7d 0a  (zLabel);.    }.
c0a0: 20 20 20 20 69 66 28 20 69 43 6f 6c 3e 3d 30 20      if( iCol>=0 
c0b0: 29 7b 0a 20 20 20 20 20 20 70 45 2d 3e 6f 70 20  ){.      pE->op 
c0c0: 3d 20 54 4b 5f 43 4f 4c 55 4d 4e 3b 0a 20 20 20  = TK_COLUMN;.   
c0d0: 20 20 20 70 45 2d 3e 69 43 6f 6c 75 6d 6e 20 3d     pE->iColumn =
c0e0: 20 69 43 6f 6c 3b 0a 20 20 20 20 20 20 70 45 2d   iCol;.      pE-
c0f0: 3e 69 54 61 62 6c 65 20 3d 20 69 54 61 62 6c 65  >iTable = iTable
c100: 3b 0a 20 20 20 20 20 20 70 45 2d 3e 69 41 67 67  ;.      pE->iAgg
c110: 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 70 4f 72   = -1;.      pOr
c120: 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 64 6f 6e 65  derBy->a[i].done
c130: 20 3d 20 31 3b 0a 20 20 20 20 7d 65 6c 73 65 20   = 1;.    }else 
c140: 69 66 28 20 6d 75 73 74 43 6f 6d 70 6c 65 74 65  if( mustComplete
c150: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
c160: 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
c170: 2c 0a 20 20 20 20 20 20 20 20 22 4f 52 44 45 52  ,.        "ORDER
c180: 20 42 59 20 74 65 72 6d 20 6e 75 6d 62 65 72 20   BY term number 
c190: 25 64 20 64 6f 65 73 20 6e 6f 74 20 6d 61 74 63  %d does not matc
c1a0: 68 20 61 6e 79 20 72 65 73 75 6c 74 20 63 6f 6c  h any result col
c1b0: 75 6d 6e 22 2c 20 69 2b 31 29 3b 0a 20 20 20 20  umn", i+1);.    
c1c0: 20 20 6e 45 72 72 2b 2b 3b 0a 20 20 20 20 20 20    nErr++;.      
c1d0: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d  break;.    }.  }
c1e0: 0a 20 20 72 65 74 75 72 6e 20 6e 45 72 72 3b 20  .  return nErr; 
c1f0: 20 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 23 69   .}.#endif /* #i
c200: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
c210: 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45 43  T_COMPOUND_SELEC
c220: 54 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 47 65 74 20  T */../*.** Get 
c230: 61 20 56 44 42 45 20 66 6f 72 20 74 68 65 20 67  a VDBE for the g
c240: 69 76 65 6e 20 70 61 72 73 65 72 20 63 6f 6e 74  iven parser cont
c250: 65 78 74 2e 20 20 43 72 65 61 74 65 20 61 20 6e  ext.  Create a n
c260: 65 77 20 6f 6e 65 20 69 66 20 6e 65 63 65 73 73  ew one if necess
c270: 61 72 79 2e 0a 2a 2a 20 49 66 20 61 6e 20 65 72  ary..** If an er
c280: 72 6f 72 20 6f 63 63 75 72 73 2c 20 72 65 74 75  ror occurs, retu
c290: 72 6e 20 4e 55 4c 4c 20 61 6e 64 20 6c 65 61 76  rn NULL and leav
c2a0: 65 20 61 20 6d 65 73 73 61 67 65 20 69 6e 20 70  e a message in p
c2b0: 50 61 72 73 65 2e 0a 2a 2f 0a 56 64 62 65 20 2a  Parse..*/.Vdbe *
c2c0: 73 71 6c 69 74 65 33 47 65 74 56 64 62 65 28 50  sqlite3GetVdbe(P
c2d0: 61 72 73 65 20 2a 70 50 61 72 73 65 29 7b 0a 20  arse *pParse){. 
c2e0: 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73   Vdbe *v = pPars
c2f0: 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69 66 28 20  e->pVdbe;.  if( 
c300: 76 3d 3d 30 20 29 7b 0a 20 20 20 20 76 20 3d 20  v==0 ){.    v = 
c310: 70 50 61 72 73 65 2d 3e 70 56 64 62 65 20 3d 20  pParse->pVdbe = 
c320: 73 71 6c 69 74 65 33 56 64 62 65 43 72 65 61 74  sqlite3VdbeCreat
c330: 65 28 70 50 61 72 73 65 2d 3e 64 62 29 3b 0a 20  e(pParse->db);. 
c340: 20 7d 0a 20 20 72 65 74 75 72 6e 20 76 3b 0a 7d   }.  return v;.}
c350: 0a 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 75 74 65  .../*.** Compute
c360: 20 74 68 65 20 69 4c 69 6d 69 74 20 61 6e 64 20   the iLimit and 
c370: 69 4f 66 66 73 65 74 20 66 69 65 6c 64 73 20 6f  iOffset fields o
c380: 66 20 74 68 65 20 53 45 4c 45 43 54 20 62 61 73  f the SELECT bas
c390: 65 64 20 6f 6e 20 74 68 65 0a 2a 2a 20 70 4c 69  ed on the.** pLi
c3a0: 6d 69 74 20 61 6e 64 20 70 4f 66 66 73 65 74 20  mit and pOffset 
c3b0: 65 78 70 72 65 73 73 69 6f 6e 73 2e 20 20 70 4c  expressions.  pL
c3c0: 69 6d 69 74 20 61 6e 64 20 70 4f 66 66 73 65 74  imit and pOffset
c3d0: 20 68 6f 6c 64 20 74 68 65 20 65 78 70 72 65 73   hold the expres
c3e0: 73 69 6f 6e 73 0a 2a 2a 20 74 68 61 74 20 61 70  sions.** that ap
c3f0: 70 65 61 72 20 69 6e 20 74 68 65 20 6f 72 69 67  pear in the orig
c400: 69 6e 61 6c 20 53 51 4c 20 73 74 61 74 65 6d 65  inal SQL stateme
c410: 6e 74 20 61 66 74 65 72 20 74 68 65 20 4c 49 4d  nt after the LIM
c420: 49 54 20 61 6e 64 20 4f 46 46 53 45 54 0a 2a 2a  IT and OFFSET.**
c430: 20 6b 65 79 77 6f 72 64 73 2e 20 20 4f 72 20 4e   keywords.  Or N
c440: 55 4c 4c 20 69 66 20 74 68 6f 73 65 20 6b 65 79  ULL if those key
c450: 77 6f 72 64 73 20 61 72 65 20 6f 6d 69 74 74 65  words are omitte
c460: 64 2e 20 69 4c 69 6d 69 74 20 61 6e 64 20 69 4f  d. iLimit and iO
c470: 66 66 73 65 74 20 0a 2a 2a 20 61 72 65 20 74 68  ffset .** are th
c480: 65 20 69 6e 74 65 67 65 72 20 6d 65 6d 6f 72 79  e integer memory
c490: 20 72 65 67 69 73 74 65 72 20 6e 75 6d 62 65 72   register number
c4a0: 73 20 66 6f 72 20 63 6f 75 6e 74 65 72 73 20 75  s for counters u
c4b0: 73 65 64 20 74 6f 20 63 6f 6d 70 75 74 65 20 0a  sed to compute .
c4c0: 2a 2a 20 74 68 65 20 6c 69 6d 69 74 20 61 6e 64  ** the limit and
c4d0: 20 6f 66 66 73 65 74 2e 20 20 49 66 20 74 68 65   offset.  If the
c4e0: 72 65 20 69 73 20 6e 6f 20 6c 69 6d 69 74 20 61  re is no limit a
c4f0: 6e 64 2f 6f 72 20 6f 66 66 73 65 74 2c 20 74 68  nd/or offset, th
c500: 65 6e 20 0a 2a 2a 20 69 4c 69 6d 69 74 20 61 6e  en .** iLimit an
c510: 64 20 69 4f 66 66 73 65 74 20 61 72 65 20 6e 65  d iOffset are ne
c520: 67 61 74 69 76 65 2e 0a 2a 2a 0a 2a 2a 20 54 68  gative..**.** Th
c530: 69 73 20 72 6f 75 74 69 6e 65 20 63 68 61 6e 67  is routine chang
c540: 65 73 20 74 68 65 20 76 61 6c 75 65 73 20 6f 66  es the values of
c550: 20 69 4c 69 6d 69 74 20 61 6e 64 20 69 4f 66 66   iLimit and iOff
c560: 73 65 74 20 6f 6e 6c 79 20 69 66 0a 2a 2a 20 61  set only if.** a
c570: 20 6c 69 6d 69 74 20 6f 72 20 6f 66 66 73 65 74   limit or offset
c580: 20 69 73 20 64 65 66 69 6e 65 64 20 62 79 20 70   is defined by p
c590: 4c 69 6d 69 74 20 61 6e 64 20 70 4f 66 66 73 65  Limit and pOffse
c5a0: 74 2e 20 20 69 4c 69 6d 69 74 20 61 6e 64 0a 2a  t.  iLimit and.*
c5b0: 2a 20 69 4f 66 66 73 65 74 20 73 68 6f 75 6c 64  * iOffset should
c5c0: 20 68 61 76 65 20 62 65 65 6e 20 70 72 65 73 65   have been prese
c5d0: 74 20 74 6f 20 61 70 70 72 6f 70 72 69 61 74 65  t to appropriate
c5e0: 20 64 65 66 61 75 6c 74 20 76 61 6c 75 65 73 0a   default values.
c5f0: 2a 2a 20 28 75 73 75 61 6c 6c 79 20 62 75 74 20  ** (usually but 
c600: 6e 6f 74 20 61 6c 77 61 79 73 20 2d 31 29 20 70  not always -1) p
c610: 72 69 6f 72 20 74 6f 20 63 61 6c 6c 69 6e 67 20  rior to calling 
c620: 74 68 69 73 20 72 6f 75 74 69 6e 65 2e 0a 2a 2a  this routine..**
c630: 20 4f 6e 6c 79 20 69 66 20 70 4c 69 6d 69 74 21   Only if pLimit!
c640: 3d 30 20 6f 72 20 70 4f 66 66 73 65 74 21 3d 30  =0 or pOffset!=0
c650: 20 64 6f 20 74 68 65 20 6c 69 6d 69 74 20 72 65   do the limit re
c660: 67 69 73 74 65 72 73 20 67 65 74 0a 2a 2a 20 72  gisters get.** r
c670: 65 64 65 66 69 6e 65 64 2e 20 20 54 68 65 20 55  edefined.  The U
c680: 4e 49 4f 4e 20 41 4c 4c 20 6f 70 65 72 61 74 6f  NION ALL operato
c690: 72 20 75 73 65 73 20 74 68 69 73 20 70 72 6f 70  r uses this prop
c6a0: 65 72 74 79 20 74 6f 20 66 6f 72 63 65 0a 2a 2a  erty to force.**
c6b0: 20 74 68 65 20 72 65 75 73 65 20 6f 66 20 74 68   the reuse of th
c6c0: 65 20 73 61 6d 65 20 6c 69 6d 69 74 20 61 6e 64  e same limit and
c6d0: 20 6f 66 66 73 65 74 20 72 65 67 69 73 74 65 72   offset register
c6e0: 73 20 61 63 72 6f 73 73 20 6d 75 6c 74 69 70 6c  s across multipl
c6f0: 65 0a 2a 2a 20 53 45 4c 45 43 54 20 73 74 61 74  e.** SELECT stat
c700: 65 6d 65 6e 74 73 2e 0a 2a 2f 0a 73 74 61 74 69  ements..*/.stati
c710: 63 20 76 6f 69 64 20 63 6f 6d 70 75 74 65 4c 69  c void computeLi
c720: 6d 69 74 52 65 67 69 73 74 65 72 73 28 50 61 72  mitRegisters(Par
c730: 73 65 20 2a 70 50 61 72 73 65 2c 20 53 65 6c 65  se *pParse, Sele
c740: 63 74 20 2a 70 2c 20 69 6e 74 20 69 42 72 65 61  ct *p, int iBrea
c750: 6b 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20  k){.  Vdbe *v = 
c760: 30 3b 0a 20 20 69 6e 74 20 69 4c 69 6d 69 74 20  0;.  int iLimit 
c770: 3d 20 30 3b 0a 20 20 69 6e 74 20 69 4f 66 66 73  = 0;.  int iOffs
c780: 65 74 3b 0a 20 20 69 6e 74 20 61 64 64 72 31 2c  et;.  int addr1,
c790: 20 61 64 64 72 32 3b 0a 0a 20 20 2f 2a 20 0a 20   addr2;..  /* . 
c7a0: 20 2a 2a 20 22 4c 49 4d 49 54 20 2d 31 22 20 61   ** "LIMIT -1" a
c7b0: 6c 77 61 79 73 20 73 68 6f 77 73 20 61 6c 6c 20  lways shows all 
c7c0: 72 6f 77 73 2e 20 20 54 68 65 72 65 20 69 73 20  rows.  There is 
c7d0: 73 6f 6d 65 0a 20 20 2a 2a 20 63 6f 6e 74 72 61  some.  ** contra
c7e0: 76 65 72 73 79 20 61 62 6f 75 74 20 77 68 61 74  versy about what
c7f0: 20 74 68 65 20 63 6f 72 72 65 63 74 20 62 65 68   the correct beh
c800: 61 76 69 6f 72 20 73 68 6f 75 6c 64 20 62 65 2e  avior should be.
c810: 0a 20 20 2a 2a 20 54 68 65 20 63 75 72 72 65 6e  .  ** The curren
c820: 74 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  t implementation
c830: 20 69 6e 74 65 72 70 72 65 74 73 20 22 4c 49 4d   interprets "LIM
c840: 49 54 20 30 22 20 74 6f 20 6d 65 61 6e 0a 20 20  IT 0" to mean.  
c850: 2a 2a 20 6e 6f 20 72 6f 77 73 2e 0a 20 20 2a 2f  ** no rows..  */
c860: 0a 20 20 69 66 28 20 70 2d 3e 70 4c 69 6d 69 74  .  if( p->pLimit
c870: 20 29 7b 0a 20 20 20 20 70 2d 3e 69 4c 69 6d 69   ){.    p->iLimi
c880: 74 20 3d 20 69 4c 69 6d 69 74 20 3d 20 70 50 61  t = iLimit = pPa
c890: 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 70  rse->nMem;.    p
c8a0: 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 32  Parse->nMem += 2
c8b0: 3b 0a 20 20 20 20 76 20 3d 20 73 71 6c 69 74 65  ;.    v = sqlite
c8c0: 33 47 65 74 56 64 62 65 28 70 50 61 72 73 65 29  3GetVdbe(pParse)
c8d0: 3b 0a 20 20 20 20 69 66 28 20 76 3d 3d 30 20 29  ;.    if( v==0 )
c8e0: 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 73 71 6c   return;.    sql
c8f0: 69 74 65 33 45 78 70 72 43 6f 64 65 28 70 50 61  ite3ExprCode(pPa
c900: 72 73 65 2c 20 70 2d 3e 70 4c 69 6d 69 74 29 3b  rse, p->pLimit);
c910: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
c920: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 75 73 74  AddOp(v, OP_Must
c930: 42 65 49 6e 74 2c 20 30 2c 20 30 29 3b 0a 20 20  BeInt, 0, 0);.  
c940: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
c950: 4f 70 28 76 2c 20 4f 50 5f 4d 65 6d 53 74 6f 72  Op(v, OP_MemStor
c960: 65 2c 20 69 4c 69 6d 69 74 2c 20 31 29 3b 0a 20  e, iLimit, 1);. 
c970: 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28     VdbeComment((
c980: 76 2c 20 22 23 20 4c 49 4d 49 54 20 63 6f 75 6e  v, "# LIMIT coun
c990: 74 65 72 22 29 29 3b 0a 20 20 20 20 73 71 6c 69  ter"));.    sqli
c9a0: 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
c9b0: 4f 50 5f 49 66 4d 65 6d 5a 65 72 6f 2c 20 69 4c  OP_IfMemZero, iL
c9c0: 69 6d 69 74 2c 20 69 42 72 65 61 6b 29 3b 0a 20  imit, iBreak);. 
c9d0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
c9e0: 64 4f 70 28 76 2c 20 4f 50 5f 4d 65 6d 4c 6f 61  dOp(v, OP_MemLoa
c9f0: 64 2c 20 69 4c 69 6d 69 74 2c 20 30 29 3b 0a 20  d, iLimit, 0);. 
ca00: 20 7d 0a 20 20 69 66 28 20 70 2d 3e 70 4f 66 66   }.  if( p->pOff
ca10: 73 65 74 20 29 7b 0a 20 20 20 20 70 2d 3e 69 4f  set ){.    p->iO
ca20: 66 66 73 65 74 20 3d 20 69 4f 66 66 73 65 74 20  ffset = iOffset 
ca30: 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b 2b  = pParse->nMem++
ca40: 3b 0a 20 20 20 20 76 20 3d 20 73 71 6c 69 74 65  ;.    v = sqlite
ca50: 33 47 65 74 56 64 62 65 28 70 50 61 72 73 65 29  3GetVdbe(pParse)
ca60: 3b 0a 20 20 20 20 69 66 28 20 76 3d 3d 30 20 29  ;.    if( v==0 )
ca70: 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 73 71 6c   return;.    sql
ca80: 69 74 65 33 45 78 70 72 43 6f 64 65 28 70 50 61  ite3ExprCode(pPa
ca90: 72 73 65 2c 20 70 2d 3e 70 4f 66 66 73 65 74 29  rse, p->pOffset)
caa0: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
cab0: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 75 73  eAddOp(v, OP_Mus
cac0: 74 42 65 49 6e 74 2c 20 30 2c 20 30 29 3b 0a 20  tBeInt, 0, 0);. 
cad0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
cae0: 64 4f 70 28 76 2c 20 4f 50 5f 4d 65 6d 53 74 6f  dOp(v, OP_MemSto
caf0: 72 65 2c 20 69 4f 66 66 73 65 74 2c 20 70 2d 3e  re, iOffset, p->
cb00: 70 4c 69 6d 69 74 3d 3d 30 29 3b 0a 20 20 20 20  pLimit==0);.    
cb10: 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20  VdbeComment((v, 
cb20: 22 23 20 4f 46 46 53 45 54 20 63 6f 75 6e 74 65  "# OFFSET counte
cb30: 72 22 29 29 3b 0a 20 20 20 20 61 64 64 72 31 20  r"));.    addr1 
cb40: 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  = sqlite3VdbeAdd
cb50: 4f 70 28 76 2c 20 4f 50 5f 49 66 4d 65 6d 50 6f  Op(v, OP_IfMemPo
cb60: 73 2c 20 69 4f 66 66 73 65 74 2c 20 30 29 3b 0a  s, iOffset, 0);.
cb70: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
cb80: 64 64 4f 70 28 76 2c 20 4f 50 5f 50 6f 70 2c 20  ddOp(v, OP_Pop, 
cb90: 31 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74  1, 0);.    sqlit
cba0: 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
cbb0: 50 5f 49 6e 74 65 67 65 72 2c 20 30 2c 20 30 29  P_Integer, 0, 0)
cbc0: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
cbd0: 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64  eJumpHere(v, add
cbe0: 72 31 29 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e  r1);.    if( p->
cbf0: 70 4c 69 6d 69 74 20 29 7b 0a 20 20 20 20 20 20  pLimit ){.      
cc00: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
cc10: 28 76 2c 20 4f 50 5f 41 64 64 2c 20 30 2c 20 30  (v, OP_Add, 0, 0
cc20: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69  );.    }.  }.  i
cc30: 66 28 20 70 2d 3e 70 4c 69 6d 69 74 20 29 7b 0a  f( p->pLimit ){.
cc40: 20 20 20 20 61 64 64 72 31 20 3d 20 73 71 6c 69      addr1 = sqli
cc50: 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
cc60: 4f 50 5f 49 66 4d 65 6d 50 6f 73 2c 20 69 4c 69  OP_IfMemPos, iLi
cc70: 6d 69 74 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c  mit, 0);.    sql
cc80: 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
cc90: 20 4f 50 5f 50 6f 70 2c 20 31 2c 20 30 29 3b 0a   OP_Pop, 1, 0);.
cca0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
ccb0: 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 65 6d 49 6e  ddOp(v, OP_MemIn
ccc0: 74 2c 20 2d 31 2c 20 69 4c 69 6d 69 74 2b 31 29  t, -1, iLimit+1)
ccd0: 3b 0a 20 20 20 20 61 64 64 72 32 20 3d 20 73 71  ;.    addr2 = sq
cce0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
ccf0: 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 30 29  , OP_Goto, 0, 0)
cd00: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
cd10: 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64  eJumpHere(v, add
cd20: 72 31 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  r1);.    sqlite3
cd30: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
cd40: 4d 65 6d 53 74 6f 72 65 2c 20 69 4c 69 6d 69 74  MemStore, iLimit
cd50: 2b 31 2c 20 31 29 3b 0a 20 20 20 20 56 64 62 65  +1, 1);.    Vdbe
cd60: 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 23 20 4c  Comment((v, "# L
cd70: 49 4d 49 54 2b 4f 46 46 53 45 54 22 29 29 3b 0a  IMIT+OFFSET"));.
cd80: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a      sqlite3VdbeJ
cd90: 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72 32  umpHere(v, addr2
cda0: 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  );.  }.}../*.** 
cdb0: 41 6c 6c 6f 63 61 74 65 20 61 20 76 69 72 74 75  Allocate a virtu
cdc0: 61 6c 20 69 6e 64 65 78 20 74 6f 20 75 73 65 20  al index to use 
cdd0: 66 6f 72 20 73 6f 72 74 69 6e 67 2e 0a 2a 2f 0a  for sorting..*/.
cde0: 73 74 61 74 69 63 20 76 6f 69 64 20 63 72 65 61  static void crea
cdf0: 74 65 53 6f 72 74 69 6e 67 49 6e 64 65 78 28 50  teSortingIndex(P
ce00: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 53 65  arse *pParse, Se
ce10: 6c 65 63 74 20 2a 70 2c 20 45 78 70 72 4c 69 73  lect *p, ExprLis
ce20: 74 20 2a 70 4f 72 64 65 72 42 79 29 7b 0a 20 20  t *pOrderBy){.  
ce30: 69 66 28 20 70 4f 72 64 65 72 42 79 20 29 7b 0a  if( pOrderBy ){.
ce40: 20 20 20 20 69 6e 74 20 61 64 64 72 3b 0a 20 20      int addr;.  
ce50: 20 20 61 73 73 65 72 74 28 20 70 4f 72 64 65 72    assert( pOrder
ce60: 42 79 2d 3e 69 45 43 75 72 73 6f 72 3d 3d 30 20  By->iECursor==0 
ce70: 29 3b 0a 20 20 20 20 70 4f 72 64 65 72 42 79 2d  );.    pOrderBy-
ce80: 3e 69 45 43 75 72 73 6f 72 20 3d 20 70 50 61 72  >iECursor = pPar
ce90: 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20  se->nTab++;.    
cea0: 61 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64  addr = sqlite3Vd
ceb0: 62 65 41 64 64 4f 70 28 70 50 61 72 73 65 2d 3e  beAddOp(pParse->
cec0: 70 56 64 62 65 2c 20 4f 50 5f 4f 70 65 6e 45 70  pVdbe, OP_OpenEp
ced0: 68 65 6d 65 72 61 6c 2c 0a 20 20 20 20 20 20 20  hemeral,.       
cee0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cef0: 20 20 20 20 20 70 4f 72 64 65 72 42 79 2d 3e 69       pOrderBy->i
cf00: 45 43 75 72 73 6f 72 2c 20 70 4f 72 64 65 72 42  ECursor, pOrderB
cf10: 79 2d 3e 6e 45 78 70 72 2b 31 29 3b 0a 20 20 20  y->nExpr+1);.   
cf20: 20 61 73 73 65 72 74 28 20 70 2d 3e 61 64 64 72   assert( p->addr
cf30: 4f 70 65 6e 45 70 68 6d 5b 32 5d 20 3d 3d 20 2d  OpenEphm[2] == -
cf40: 31 20 29 3b 0a 20 20 20 20 70 2d 3e 61 64 64 72  1 );.    p->addr
cf50: 4f 70 65 6e 45 70 68 6d 5b 32 5d 20 3d 20 61 64  OpenEphm[2] = ad
cf60: 64 72 3b 0a 20 20 7d 0a 7d 0a 0a 23 69 66 6e 64  dr;.  }.}..#ifnd
cf70: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43  ef SQLITE_OMIT_C
cf80: 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45 43 54 0a 2f  OMPOUND_SELECT./
cf90: 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
cfa0: 61 70 70 72 6f 70 72 69 61 74 65 20 63 6f 6c 6c  appropriate coll
cfb0: 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65 20 66  ating sequence f
cfc0: 6f 72 20 74 68 65 20 69 43 6f 6c 2d 74 68 20 63  or the iCol-th c
cfd0: 6f 6c 75 6d 6e 20 6f 66 0a 2a 2a 20 74 68 65 20  olumn of.** the 
cfe0: 72 65 73 75 6c 74 20 73 65 74 20 66 6f 72 20 74  result set for t
cff0: 68 65 20 63 6f 6d 70 6f 75 6e 64 2d 73 65 6c 65  he compound-sele
d000: 63 74 20 73 74 61 74 65 6d 65 6e 74 20 22 70 22  ct statement "p"
d010: 2e 20 20 52 65 74 75 72 6e 20 4e 55 4c 4c 20 69  .  Return NULL i
d020: 66 0a 2a 2a 20 74 68 65 20 63 6f 6c 75 6d 6e 20  f.** the column 
d030: 68 61 73 20 6e 6f 20 64 65 66 61 75 6c 74 20 63  has no default c
d040: 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63  ollating sequenc
d050: 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 6f 6c  e..**.** The col
d060: 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65 20  lating sequence 
d070: 66 6f 72 20 74 68 65 20 63 6f 6d 70 6f 75 6e 64  for the compound
d080: 20 73 65 6c 65 63 74 20 69 73 20 74 61 6b 65 6e   select is taken
d090: 20 66 72 6f 6d 20 74 68 65 0a 2a 2a 20 6c 65 66   from the.** lef
d0a0: 74 2d 6d 6f 73 74 20 74 65 72 6d 20 6f 66 20 74  t-most term of t
d0b0: 68 65 20 73 65 6c 65 63 74 20 74 68 61 74 20 68  he select that h
d0c0: 61 73 20 61 20 63 6f 6c 6c 61 74 69 6e 67 20 73  as a collating s
d0d0: 65 71 75 65 6e 63 65 2e 0a 2a 2f 0a 73 74 61 74  equence..*/.stat
d0e0: 69 63 20 43 6f 6c 6c 53 65 71 20 2a 6d 75 6c 74  ic CollSeq *mult
d0f0: 69 53 65 6c 65 63 74 43 6f 6c 6c 53 65 71 28 50  iSelectCollSeq(P
d100: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 53 65  arse *pParse, Se
d110: 6c 65 63 74 20 2a 70 2c 20 69 6e 74 20 69 43 6f  lect *p, int iCo
d120: 6c 29 7b 0a 20 20 43 6f 6c 6c 53 65 71 20 2a 70  l){.  CollSeq *p
d130: 52 65 74 3b 0a 20 20 69 66 28 20 70 2d 3e 70 50  Ret;.  if( p->pP
d140: 72 69 6f 72 20 29 7b 0a 20 20 20 20 70 52 65 74  rior ){.    pRet
d150: 20 3d 20 6d 75 6c 74 69 53 65 6c 65 63 74 43 6f   = multiSelectCo
d160: 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70 2d  llSeq(pParse, p-
d170: 3e 70 50 72 69 6f 72 2c 20 69 43 6f 6c 29 3b 0a  >pPrior, iCol);.
d180: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 52 65    }else{.    pRe
d190: 74 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28  t = 0;.  }.  if(
d1a0: 20 70 52 65 74 3d 3d 30 20 29 7b 0a 20 20 20 20   pRet==0 ){.    
d1b0: 70 52 65 74 20 3d 20 73 71 6c 69 74 65 33 45 78  pRet = sqlite3Ex
d1c0: 70 72 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65  prCollSeq(pParse
d1d0: 2c 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b 69  , p->pEList->a[i
d1e0: 43 6f 6c 5d 2e 70 45 78 70 72 29 3b 0a 20 20 7d  Col].pExpr);.  }
d1f0: 0a 20 20 72 65 74 75 72 6e 20 70 52 65 74 3b 0a  .  return pRet;.
d200: 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  }.#endif /* SQLI
d210: 54 45 5f 4f 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44  TE_OMIT_COMPOUND
d220: 5f 53 45 4c 45 43 54 20 2a 2f 0a 0a 23 69 66 6e  _SELECT */..#ifn
d230: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
d240: 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45 43 54 0a  COMPOUND_SELECT.
d250: 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
d260: 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20  ne is called to 
d270: 70 72 6f 63 65 73 73 20 61 20 71 75 65 72 79 20  process a query 
d280: 74 68 61 74 20 69 73 20 72 65 61 6c 6c 79 20 74  that is really t
d290: 68 65 20 75 6e 69 6f 6e 0a 2a 2a 20 6f 72 20 69  he union.** or i
d2a0: 6e 74 65 72 73 65 63 74 69 6f 6e 20 6f 66 20 74  ntersection of t
d2b0: 77 6f 20 6f 72 20 6d 6f 72 65 20 73 65 70 61 72  wo or more separ
d2c0: 61 74 65 20 71 75 65 72 69 65 73 2e 0a 2a 2a 0a  ate queries..**.
d2d0: 2a 2a 20 22 70 22 20 70 6f 69 6e 74 73 20 74 6f  ** "p" points to
d2e0: 20 74 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 20   the right-most 
d2f0: 6f 66 20 74 68 65 20 74 77 6f 20 71 75 65 72 69  of the two queri
d300: 65 73 2e 20 20 74 68 65 20 71 75 65 72 79 20 6f  es.  the query o
d310: 6e 20 74 68 65 0a 2a 2a 20 6c 65 66 74 20 69 73  n the.** left is
d320: 20 70 2d 3e 70 50 72 69 6f 72 2e 20 20 54 68 65   p->pPrior.  The
d330: 20 6c 65 66 74 20 71 75 65 72 79 20 63 6f 75 6c   left query coul
d340: 64 20 61 6c 73 6f 20 62 65 20 61 20 63 6f 6d 70  d also be a comp
d350: 6f 75 6e 64 20 71 75 65 72 79 0a 2a 2a 20 69 6e  ound query.** in
d360: 20 77 68 69 63 68 20 63 61 73 65 20 74 68 69 73   which case this
d370: 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 62 65   routine will be
d380: 20 63 61 6c 6c 65 64 20 72 65 63 75 72 73 69 76   called recursiv
d390: 65 6c 79 2e 20 0a 2a 2a 0a 2a 2a 20 54 68 65 20  ely. .**.** The 
d3a0: 72 65 73 75 6c 74 73 20 6f 66 20 74 68 65 20 74  results of the t
d3b0: 6f 74 61 6c 20 71 75 65 72 79 20 61 72 65 20 74  otal query are t
d3c0: 6f 20 62 65 20 77 72 69 74 74 65 6e 20 69 6e 74  o be written int
d3d0: 6f 20 61 20 64 65 73 74 69 6e 61 74 69 6f 6e 0a  o a destination.
d3e0: 2a 2a 20 6f 66 20 74 79 70 65 20 65 44 65 73 74  ** of type eDest
d3f0: 20 77 69 74 68 20 70 61 72 61 6d 65 74 65 72 20   with parameter 
d400: 69 50 61 72 6d 2e 0a 2a 2a 0a 2a 2a 20 45 78 61  iParm..**.** Exa
d410: 6d 70 6c 65 20 31 3a 20 20 43 6f 6e 73 69 64 65  mple 1:  Conside
d420: 72 20 61 20 74 68 72 65 65 2d 77 61 79 20 63 6f  r a three-way co
d430: 6d 70 6f 75 6e 64 20 53 51 4c 20 73 74 61 74 65  mpound SQL state
d440: 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20  ment..**.**     
d450: 53 45 4c 45 43 54 20 61 20 46 52 4f 4d 20 74 31  SELECT a FROM t1
d460: 20 55 4e 49 4f 4e 20 53 45 4c 45 43 54 20 62 20   UNION SELECT b 
d470: 46 52 4f 4d 20 74 32 20 55 4e 49 4f 4e 20 53 45  FROM t2 UNION SE
d480: 4c 45 43 54 20 63 20 46 52 4f 4d 20 74 33 0a 2a  LECT c FROM t3.*
d490: 2a 0a 2a 2a 20 54 68 69 73 20 73 74 61 74 65 6d  *.** This statem
d4a0: 65 6e 74 20 69 73 20 70 61 72 73 65 64 20 75 70  ent is parsed up
d4b0: 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a   as follows:.**.
d4c0: 2a 2a 20 20 20 20 20 53 45 4c 45 43 54 20 63 20  **     SELECT c 
d4d0: 46 52 4f 4d 20 74 33 0a 2a 2a 20 20 20 20 20 20  FROM t3.**      
d4e0: 7c 0a 2a 2a 20 20 20 20 20 20 60 2d 2d 2d 2d 2d  |.**      `-----
d4f0: 3e 20 20 53 45 4c 45 43 54 20 62 20 46 52 4f 4d  >  SELECT b FROM
d500: 20 74 32 0a 2a 2a 20 20 20 20 20 20 20 20 20 20   t2.**          
d510: 20 20 20 20 20 20 7c 0a 2a 2a 20 20 20 20 20 20        |.**      
d520: 20 20 20 20 20 20 20 20 20 20 60 2d 2d 2d 2d 2d            `-----
d530: 2d 3e 20 20 53 45 4c 45 43 54 20 61 20 46 52 4f  ->  SELECT a FRO
d540: 4d 20 74 31 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61  M t1.**.** The a
d550: 72 72 6f 77 73 20 69 6e 20 74 68 65 20 64 69 61  rrows in the dia
d560: 67 72 61 6d 20 61 62 6f 76 65 20 72 65 70 72 65  gram above repre
d570: 73 65 6e 74 20 74 68 65 20 53 65 6c 65 63 74 2e  sent the Select.
d580: 70 50 72 69 6f 72 20 70 6f 69 6e 74 65 72 2e 0a  pPrior pointer..
d590: 2a 2a 20 53 6f 20 69 66 20 74 68 69 73 20 72 6f  ** So if this ro
d5a0: 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20  utine is called 
d5b0: 77 69 74 68 20 70 20 65 71 75 61 6c 20 74 6f 20  with p equal to 
d5c0: 74 68 65 20 74 33 20 71 75 65 72 79 2c 20 74 68  the t3 query, th
d5d0: 65 6e 0a 2a 2a 20 70 50 72 69 6f 72 20 77 69 6c  en.** pPrior wil
d5e0: 6c 20 62 65 20 74 68 65 20 74 32 20 71 75 65 72  l be the t2 quer
d5f0: 79 2e 20 20 70 2d 3e 6f 70 20 77 69 6c 6c 20 62  y.  p->op will b
d600: 65 20 54 4b 5f 55 4e 49 4f 4e 20 69 6e 20 74 68  e TK_UNION in th
d610: 69 73 20 63 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 4e  is case..**.** N
d620: 6f 74 69 63 65 20 74 68 61 74 20 62 65 63 61 75  otice that becau
d630: 73 65 20 6f 66 20 74 68 65 20 77 61 79 20 53 51  se of the way SQ
d640: 4c 69 74 65 20 70 61 72 73 65 73 20 63 6f 6d 70  Lite parses comp
d650: 6f 75 6e 64 20 53 45 4c 45 43 54 73 2c 20 74 68  ound SELECTs, th
d660: 65 0a 2a 2a 20 69 6e 64 69 76 69 64 75 61 6c 20  e.** individual 
d670: 73 65 6c 65 63 74 73 20 61 6c 77 61 79 73 20 67  selects always g
d680: 72 6f 75 70 20 66 72 6f 6d 20 6c 65 66 74 20 74  roup from left t
d690: 6f 20 72 69 67 68 74 2e 0a 2a 2f 0a 73 74 61 74  o right..*/.stat
d6a0: 69 63 20 69 6e 74 20 6d 75 6c 74 69 53 65 6c 65  ic int multiSele
d6b0: 63 74 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  ct(.  Parse *pPa
d6c0: 72 73 65 2c 20 20 20 20 20 20 20 20 2f 2a 20 50  rse,        /* P
d6d0: 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a  arsing context *
d6e0: 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 2c 20 20  /.  Select *p,  
d6f0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
d700: 20 72 69 67 68 74 2d 6d 6f 73 74 20 6f 66 20 53   right-most of S
d710: 45 4c 45 43 54 73 20 74 6f 20 62 65 20 63 6f 64  ELECTs to be cod
d720: 65 64 20 2a 2f 0a 20 20 69 6e 74 20 65 44 65 73  ed */.  int eDes
d730: 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  t,            /*
d740: 20 5c 5f 5f 5f 20 20 53 74 6f 72 65 20 71 75 65   \___  Store que
d750: 72 79 20 72 65 73 75 6c 74 73 20 61 73 20 73 70  ry results as sp
d760: 65 63 69 66 69 65 64 20 2a 2f 0a 20 20 69 6e 74  ecified */.  int
d770: 20 69 50 61 72 6d 2c 20 20 20 20 20 20 20 20 20   iParm,         
d780: 20 20 20 2f 2a 20 2f 20 20 20 20 20 62 79 20 74     /* /     by t
d790: 68 65 73 65 20 74 77 6f 20 70 61 72 61 6d 65 74  hese two paramet
d7a0: 65 72 73 2e 20 20 20 20 20 20 20 20 20 2a 2f 0a  ers.         */.
d7b0: 20 20 63 68 61 72 20 2a 61 66 66 20 20 20 20 20    char *aff     
d7c0: 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 65 44          /* If eD
d7d0: 65 73 74 20 69 73 20 53 52 54 5f 55 6e 69 6f 6e  est is SRT_Union
d7e0: 2c 20 74 68 65 20 61 66 66 69 6e 69 74 79 20 73  , the affinity s
d7f0: 74 72 69 6e 67 20 2a 2f 0a 29 7b 0a 20 20 69 6e  tring */.){.  in
d800: 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
d810: 3b 20 20 20 2f 2a 20 53 75 63 63 65 73 73 20 63  ;   /* Success c
d820: 6f 64 65 20 66 72 6f 6d 20 61 20 73 75 62 72 6f  ode from a subro
d830: 75 74 69 6e 65 20 2a 2f 0a 20 20 53 65 6c 65 63  utine */.  Selec
d840: 74 20 2a 70 50 72 69 6f 72 3b 20 20 20 20 20 20  t *pPrior;      
d850: 20 2f 2a 20 41 6e 6f 74 68 65 72 20 53 45 4c 45   /* Another SELE
d860: 43 54 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 74  CT immediately t
d870: 6f 20 6f 75 72 20 6c 65 66 74 20 2a 2f 0a 20 20  o our left */.  
d880: 56 64 62 65 20 2a 76 3b 20 20 20 20 20 20 20 20  Vdbe *v;        
d890: 20 20 20 20 20 20 2f 2a 20 47 65 6e 65 72 61 74        /* Generat
d8a0: 65 20 63 6f 64 65 20 74 6f 20 74 68 69 73 20 56  e code to this V
d8b0: 44 42 45 20 2a 2f 0a 20 20 69 6e 74 20 6e 43 6f  DBE */.  int nCo
d8c0: 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  l;             /
d8d0: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75  * Number of colu
d8e0: 6d 6e 73 20 69 6e 20 74 68 65 20 72 65 73 75 6c  mns in the resul
d8f0: 74 20 73 65 74 20 2a 2f 0a 20 20 45 78 70 72 4c  t set */.  ExprL
d900: 69 73 74 20 2a 70 4f 72 64 65 72 42 79 3b 20 20  ist *pOrderBy;  
d910: 20 2f 2a 20 54 68 65 20 4f 52 44 45 52 20 42 59   /* The ORDER BY
d920: 20 63 6c 61 75 73 65 20 6f 6e 20 70 20 2a 2f 0a   clause on p */.
d930: 20 20 69 6e 74 20 61 53 65 74 50 32 5b 32 5d 3b    int aSetP2[2];
d940: 20 20 20 20 20 20 20 20 2f 2a 20 53 65 74 20 50          /* Set P
d950: 32 20 76 61 6c 75 65 20 6f 66 20 74 68 65 73 65  2 value of these
d960: 20 6f 70 20 74 6f 20 6e 75 6d 62 65 72 20 6f 66   op to number of
d970: 20 63 6f 6c 75 6d 6e 73 20 2a 2f 0a 20 20 69 6e   columns */.  in
d980: 74 20 6e 53 65 74 50 32 20 3d 20 30 3b 20 20 20  t nSetP2 = 0;   
d990: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
d9a0: 20 73 6c 6f 74 73 20 69 6e 20 61 53 65 74 50 32   slots in aSetP2
d9b0: 5b 5d 20 75 73 65 64 20 2a 2f 0a 0a 20 20 2f 2a  [] used */..  /*
d9c0: 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65 72 65   Make sure there
d9d0: 20 69 73 20 6e 6f 20 4f 52 44 45 52 20 42 59 20   is no ORDER BY 
d9e0: 6f 72 20 4c 49 4d 49 54 20 63 6c 61 75 73 65 20  or LIMIT clause 
d9f0: 6f 6e 20 70 72 69 6f 72 20 53 45 4c 45 43 54 73  on prior SELECTs
da00: 2e 20 20 4f 6e 6c 79 0a 20 20 2a 2a 20 74 68 65  .  Only.  ** the
da10: 20 6c 61 73 74 20 28 72 69 67 68 74 2d 6d 6f 73   last (right-mos
da20: 74 29 20 53 45 4c 45 43 54 20 69 6e 20 74 68 65  t) SELECT in the
da30: 20 73 65 72 69 65 73 20 6d 61 79 20 68 61 76 65   series may have
da40: 20 61 6e 20 4f 52 44 45 52 20 42 59 20 6f 72 20   an ORDER BY or 
da50: 4c 49 4d 49 54 2e 0a 20 20 2a 2f 0a 20 20 69 66  LIMIT..  */.  if
da60: 28 20 70 3d 3d 30 20 7c 7c 20 70 2d 3e 70 50 72  ( p==0 || p->pPr
da70: 69 6f 72 3d 3d 30 20 29 7b 0a 20 20 20 20 72 63  ior==0 ){.    rc
da80: 20 3d 20 31 3b 0a 20 20 20 20 67 6f 74 6f 20 6d   = 1;.    goto m
da90: 75 6c 74 69 5f 73 65 6c 65 63 74 5f 65 6e 64 3b  ulti_select_end;
daa0: 0a 20 20 7d 0a 20 20 70 50 72 69 6f 72 20 3d 20  .  }.  pPrior = 
dab0: 70 2d 3e 70 50 72 69 6f 72 3b 0a 20 20 61 73 73  p->pPrior;.  ass
dac0: 65 72 74 28 20 70 50 72 69 6f 72 2d 3e 70 52 69  ert( pPrior->pRi
dad0: 67 68 74 6d 6f 73 74 21 3d 70 50 72 69 6f 72 20  ghtmost!=pPrior 
dae0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 72  );.  assert( pPr
daf0: 69 6f 72 2d 3e 70 52 69 67 68 74 6d 6f 73 74 3d  ior->pRightmost=
db00: 3d 70 2d 3e 70 52 69 67 68 74 6d 6f 73 74 20 29  =p->pRightmost )
db10: 3b 0a 20 20 69 66 28 20 70 50 72 69 6f 72 2d 3e  ;.  if( pPrior->
db20: 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20  pOrderBy ){.    
db30: 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
db40: 70 50 61 72 73 65 2c 22 4f 52 44 45 52 20 42 59  pParse,"ORDER BY
db50: 20 63 6c 61 75 73 65 20 73 68 6f 75 6c 64 20 63   clause should c
db60: 6f 6d 65 20 61 66 74 65 72 20 25 73 20 6e 6f 74  ome after %s not
db70: 20 62 65 66 6f 72 65 22 2c 0a 20 20 20 20 20 20   before",.      
db80: 73 65 6c 65 63 74 4f 70 4e 61 6d 65 28 70 2d 3e  selectOpName(p->
db90: 6f 70 29 29 3b 0a 20 20 20 20 72 63 20 3d 20 31  op));.    rc = 1
dba0: 3b 0a 20 20 20 20 67 6f 74 6f 20 6d 75 6c 74 69  ;.    goto multi
dbb0: 5f 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 7d  _select_end;.  }
dbc0: 0a 20 20 69 66 28 20 70 50 72 69 6f 72 2d 3e 70  .  if( pPrior->p
dbd0: 4c 69 6d 69 74 20 29 7b 0a 20 20 20 20 73 71 6c  Limit ){.    sql
dbe0: 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
dbf0: 72 73 65 2c 22 4c 49 4d 49 54 20 63 6c 61 75 73  rse,"LIMIT claus
dc00: 65 20 73 68 6f 75 6c 64 20 63 6f 6d 65 20 61 66  e should come af
dc10: 74 65 72 20 25 73 20 6e 6f 74 20 62 65 66 6f 72  ter %s not befor
dc20: 65 22 2c 0a 20 20 20 20 20 20 73 65 6c 65 63 74  e",.      select
dc30: 4f 70 4e 61 6d 65 28 70 2d 3e 6f 70 29 29 3b 0a  OpName(p->op));.
dc40: 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20      rc = 1;.    
dc50: 67 6f 74 6f 20 6d 75 6c 74 69 5f 73 65 6c 65 63  goto multi_selec
dc60: 74 5f 65 6e 64 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  t_end;.  }..  /*
dc70: 20 4d 61 6b 65 20 73 75 72 65 20 77 65 20 68 61   Make sure we ha
dc80: 76 65 20 61 20 76 61 6c 69 64 20 71 75 65 72 79  ve a valid query
dc90: 20 65 6e 67 69 6e 65 2e 20 20 49 66 20 6e 6f 74   engine.  If not
dca0: 2c 20 63 72 65 61 74 65 20 61 20 6e 65 77 20 6f  , create a new o
dcb0: 6e 65 2e 0a 20 20 2a 2f 0a 20 20 76 20 3d 20 73  ne..  */.  v = s
dcc0: 71 6c 69 74 65 33 47 65 74 56 64 62 65 28 70 50  qlite3GetVdbe(pP
dcd0: 61 72 73 65 29 3b 0a 20 20 69 66 28 20 76 3d 3d  arse);.  if( v==
dce0: 30 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 31 3b  0 ){.    rc = 1;
dcf0: 0a 20 20 20 20 67 6f 74 6f 20 6d 75 6c 74 69 5f  .    goto multi_
dd00: 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 7d 0a  select_end;.  }.
dd10: 0a 20 20 2f 2a 20 43 72 65 61 74 65 20 74 68 65  .  /* Create the
dd20: 20 64 65 73 74 69 6e 61 74 69 6f 6e 20 74 65 6d   destination tem
dd30: 70 6f 72 61 72 79 20 74 61 62 6c 65 20 69 66 20  porary table if 
dd40: 6e 65 63 65 73 73 61 72 79 0a 20 20 2a 2f 0a 20  necessary.  */. 
dd50: 20 69 66 28 20 65 44 65 73 74 3d 3d 53 52 54 5f   if( eDest==SRT_
dd60: 45 70 68 65 6d 54 61 62 20 29 7b 0a 20 20 20 20  EphemTab ){.    
dd70: 61 73 73 65 72 74 28 20 70 2d 3e 70 45 4c 69 73  assert( p->pELis
dd80: 74 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  t );.    assert(
dd90: 20 6e 53 65 74 50 32 3c 73 69 7a 65 6f 66 28 61   nSetP2<sizeof(a
dda0: 53 65 74 50 32 29 2f 73 69 7a 65 6f 66 28 61 53  SetP2)/sizeof(aS
ddb0: 65 74 50 32 5b 30 5d 29 20 29 3b 0a 20 20 20 20  etP2[0]) );.    
ddc0: 61 53 65 74 50 32 5b 6e 53 65 74 50 32 2b 2b 5d  aSetP2[nSetP2++]
ddd0: 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   = sqlite3VdbeAd
dde0: 64 4f 70 28 76 2c 20 4f 50 5f 4f 70 65 6e 45 70  dOp(v, OP_OpenEp
ddf0: 68 65 6d 65 72 61 6c 2c 20 69 50 61 72 6d 2c 20  hemeral, iParm, 
de00: 30 29 3b 0a 20 20 20 20 65 44 65 73 74 20 3d 20  0);.    eDest = 
de10: 53 52 54 5f 54 61 62 6c 65 3b 0a 20 20 7d 0a 0a  SRT_Table;.  }..
de20: 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f    /* Generate co
de30: 64 65 20 66 6f 72 20 74 68 65 20 6c 65 66 74 20  de for the left 
de40: 61 6e 64 20 72 69 67 68 74 20 53 45 4c 45 43 54  and right SELECT
de50: 20 73 74 61 74 65 6d 65 6e 74 73 2e 0a 20 20 2a   statements..  *
de60: 2f 0a 20 20 70 4f 72 64 65 72 42 79 20 3d 20 70  /.  pOrderBy = p
de70: 2d 3e 70 4f 72 64 65 72 42 79 3b 0a 20 20 73 77  ->pOrderBy;.  sw
de80: 69 74 63 68 28 20 70 2d 3e 6f 70 20 29 7b 0a 20  itch( p->op ){. 
de90: 20 20 20 63 61 73 65 20 54 4b 5f 41 4c 4c 3a 20     case TK_ALL: 
dea0: 7b 0a 20 20 20 20 20 20 69 66 28 20 70 4f 72 64  {.      if( pOrd
deb0: 65 72 42 79 3d 3d 30 20 29 7b 0a 20 20 20 20 20  erBy==0 ){.     
dec0: 20 20 20 69 6e 74 20 61 64 64 72 20 3d 20 30 3b     int addr = 0;
ded0: 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
dee0: 20 21 70 50 72 69 6f 72 2d 3e 70 4c 69 6d 69 74   !pPrior->pLimit
def0: 20 29 3b 0a 20 20 20 20 20 20 20 20 70 50 72 69   );.        pPri
df00: 6f 72 2d 3e 70 4c 69 6d 69 74 20 3d 20 70 2d 3e  or->pLimit = p->
df10: 70 4c 69 6d 69 74 3b 0a 20 20 20 20 20 20 20 20  pLimit;.        
df20: 70 50 72 69 6f 72 2d 3e 70 4f 66 66 73 65 74 20  pPrior->pOffset 
df30: 3d 20 70 2d 3e 70 4f 66 66 73 65 74 3b 0a 20 20  = p->pOffset;.  
df40: 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
df50: 65 33 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c  e3Select(pParse,
df60: 20 70 50 72 69 6f 72 2c 20 65 44 65 73 74 2c 20   pPrior, eDest, 
df70: 69 50 61 72 6d 2c 20 30 2c 20 30 2c 20 30 2c 20  iParm, 0, 0, 0, 
df80: 61 66 66 29 3b 0a 20 20 20 20 20 20 20 20 70 2d  aff);.        p-
df90: 3e 70 4c 69 6d 69 74 20 3d 20 30 3b 0a 20 20 20  >pLimit = 0;.   
dfa0: 20 20 20 20 20 70 2d 3e 70 4f 66 66 73 65 74 20       p->pOffset 
dfb0: 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 69 66 28  = 0;.        if(
dfc0: 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20 20   rc ){.         
dfd0: 20 67 6f 74 6f 20 6d 75 6c 74 69 5f 73 65 6c 65   goto multi_sele
dfe0: 63 74 5f 65 6e 64 3b 0a 20 20 20 20 20 20 20 20  ct_end;.        
dff0: 7d 0a 20 20 20 20 20 20 20 20 70 2d 3e 70 50 72  }.        p->pPr
e000: 69 6f 72 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  ior = 0;.       
e010: 20 70 2d 3e 69 4c 69 6d 69 74 20 3d 20 70 50 72   p->iLimit = pPr
e020: 69 6f 72 2d 3e 69 4c 69 6d 69 74 3b 0a 20 20 20  ior->iLimit;.   
e030: 20 20 20 20 20 70 2d 3e 69 4f 66 66 73 65 74 20       p->iOffset 
e040: 3d 20 70 50 72 69 6f 72 2d 3e 69 4f 66 66 73 65  = pPrior->iOffse
e050: 74 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  t;.        if( p
e060: 2d 3e 69 4c 69 6d 69 74 3e 3d 30 20 29 7b 0a 20  ->iLimit>=0 ){. 
e070: 20 20 20 20 20 20 20 20 20 61 64 64 72 20 3d 20           addr = 
e080: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
e090: 28 76 2c 20 4f 50 5f 49 66 4d 65 6d 5a 65 72 6f  (v, OP_IfMemZero
e0a0: 2c 20 70 2d 3e 69 4c 69 6d 69 74 2c 20 30 29 3b  , p->iLimit, 0);
e0b0: 0a 20 20 20 20 20 20 20 20 20 20 56 64 62 65 43  .          VdbeC
e0c0: 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 23 20 4a 75  omment((v, "# Ju
e0d0: 6d 70 20 61 68 65 61 64 20 69 66 20 4c 49 4d 49  mp ahead if LIMI
e0e0: 54 20 72 65 61 63 68 65 64 22 29 29 3b 0a 20 20  T reached"));.  
e0f0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
e100: 72 63 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65  rc = sqlite3Sele
e110: 63 74 28 70 50 61 72 73 65 2c 20 70 2c 20 65 44  ct(pParse, p, eD
e120: 65 73 74 2c 20 69 50 61 72 6d 2c 20 30 2c 20 30  est, iParm, 0, 0
e130: 2c 20 30 2c 20 61 66 66 29 3b 0a 20 20 20 20 20  , 0, aff);.     
e140: 20 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d 20 70     p->pPrior = p
e150: 50 72 69 6f 72 3b 0a 20 20 20 20 20 20 20 20 69  Prior;.        i
e160: 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20  f( rc ){.       
e170: 20 20 20 67 6f 74 6f 20 6d 75 6c 74 69 5f 73 65     goto multi_se
e180: 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 20 20  lect_end;.      
e190: 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20    }.        if( 
e1a0: 61 64 64 72 20 29 7b 0a 20 20 20 20 20 20 20 20  addr ){.        
e1b0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d    sqlite3VdbeJum
e1c0: 70 48 65 72 65 28 76 2c 20 61 64 64 72 29 3b 0a  pHere(v, addr);.
e1d0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
e1e0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d    break;.      }
e1f0: 0a 20 20 20 20 20 20 2f 2a 20 46 6f 72 20 55 4e  .      /* For UN
e200: 49 4f 4e 20 41 4c 4c 20 2e 2e 2e 20 4f 52 44 45  ION ALL ... ORDE
e210: 52 20 42 59 20 66 61 6c 6c 20 74 68 72 6f 75 67  R BY fall throug
e220: 68 20 74 6f 20 74 68 65 20 6e 65 78 74 20 63 61  h to the next ca
e230: 73 65 20 2a 2f 0a 20 20 20 20 7d 0a 20 20 20 20  se */.    }.    
e240: 63 61 73 65 20 54 4b 5f 45 58 43 45 50 54 3a 0a  case TK_EXCEPT:.
e250: 20 20 20 20 63 61 73 65 20 54 4b 5f 55 4e 49 4f      case TK_UNIO
e260: 4e 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 75  N: {.      int u
e270: 6e 69 6f 6e 54 61 62 3b 20 20 20 20 2f 2a 20 43  nionTab;    /* C
e280: 75 72 73 6f 72 20 6e 75 6d 62 65 72 20 6f 66 20  ursor number of 
e290: 74 68 65 20 74 65 6d 70 6f 72 61 72 79 20 74 61  the temporary ta
e2a0: 62 6c 65 20 68 6f 6c 64 69 6e 67 20 72 65 73 75  ble holding resu
e2b0: 6c 74 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20  lt */.      int 
e2c0: 6f 70 20 3d 20 30 3b 20 20 20 20 20 20 2f 2a 20  op = 0;      /* 
e2d0: 4f 6e 65 20 6f 66 20 74 68 65 20 53 52 54 5f 20  One of the SRT_ 
e2e0: 6f 70 65 72 61 74 69 6f 6e 73 20 74 6f 20 61 70  operations to ap
e2f0: 70 6c 79 20 74 6f 20 73 65 6c 66 20 2a 2f 0a 20  ply to self */. 
e300: 20 20 20 20 20 69 6e 74 20 70 72 69 6f 72 4f 70       int priorOp
e310: 3b 20 20 20 20 20 2f 2a 20 54 68 65 20 53 52 54  ;     /* The SRT
e320: 5f 20 6f 70 65 72 61 74 69 6f 6e 20 74 6f 20 61  _ operation to a
e330: 70 70 6c 79 20 74 6f 20 70 72 69 6f 72 20 73 65  pply to prior se
e340: 6c 65 63 74 73 20 2a 2f 0a 20 20 20 20 20 20 45  lects */.      E
e350: 78 70 72 20 2a 70 4c 69 6d 69 74 2c 20 2a 70 4f  xpr *pLimit, *pO
e360: 66 66 73 65 74 3b 20 2f 2a 20 53 61 76 65 64 20  ffset; /* Saved 
e370: 76 61 6c 75 65 73 20 6f 66 20 70 2d 3e 6e 4c 69  values of p->nLi
e380: 6d 69 74 20 61 6e 64 20 70 2d 3e 6e 4f 66 66 73  mit and p->nOffs
e390: 65 74 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20  et */.      int 
e3a0: 61 64 64 72 3b 0a 0a 20 20 20 20 20 20 70 72 69  addr;..      pri
e3b0: 6f 72 4f 70 20 3d 20 70 2d 3e 6f 70 3d 3d 54 4b  orOp = p->op==TK
e3c0: 5f 41 4c 4c 20 3f 20 53 52 54 5f 54 61 62 6c 65  _ALL ? SRT_Table
e3d0: 20 3a 20 53 52 54 5f 55 6e 69 6f 6e 3b 0a 20 20   : SRT_Union;.  
e3e0: 20 20 20 20 69 66 28 20 65 44 65 73 74 3d 3d 70      if( eDest==p
e3f0: 72 69 6f 72 4f 70 20 26 26 20 70 4f 72 64 65 72  riorOp && pOrder
e400: 42 79 3d 3d 30 20 26 26 20 21 70 2d 3e 70 4c 69  By==0 && !p->pLi
e410: 6d 69 74 20 26 26 20 21 70 2d 3e 70 4f 66 66 73  mit && !p->pOffs
e420: 65 74 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a  et ){.        /*
e430: 20 57 65 20 63 61 6e 20 72 65 75 73 65 20 61 20   We can reuse a 
e440: 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20  temporary table 
e450: 67 65 6e 65 72 61 74 65 64 20 62 79 20 61 20 53  generated by a S
e460: 45 4c 45 43 54 20 74 6f 20 6f 75 72 0a 20 20 20  ELECT to our.   
e470: 20 20 20 20 20 2a 2a 20 72 69 67 68 74 2e 0a 20       ** right.. 
e480: 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
e490: 20 20 75 6e 69 6f 6e 54 61 62 20 3d 20 69 50 61    unionTab = iPa
e4a0: 72 6d 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  rm;.      }else{
e4b0: 0a 20 20 20 20 20 20 20 20 2f 2a 20 57 65 20 77  .        /* We w
e4c0: 69 6c 6c 20 6e 65 65 64 20 74 6f 20 63 72 65 61  ill need to crea
e4d0: 74 65 20 6f 75 72 20 6f 77 6e 20 74 65 6d 70 6f  te our own tempo
e4e0: 72 61 72 79 20 74 61 62 6c 65 20 74 6f 20 68 6f  rary table to ho
e4f0: 6c 64 20 74 68 65 0a 20 20 20 20 20 20 20 20 2a  ld the.        *
e500: 2a 20 69 6e 74 65 72 6d 65 64 69 61 74 65 20 72  * intermediate r
e510: 65 73 75 6c 74 73 2e 0a 20 20 20 20 20 20 20 20  esults..        
e520: 2a 2f 0a 20 20 20 20 20 20 20 20 75 6e 69 6f 6e  */.        union
e530: 54 61 62 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54  Tab = pParse->nT
e540: 61 62 2b 2b 3b 0a 20 20 20 20 20 20 20 20 69 66  ab++;.        if
e550: 28 20 70 4f 72 64 65 72 42 79 20 26 26 20 6d 61  ( pOrderBy && ma
e560: 74 63 68 4f 72 64 65 72 62 79 54 6f 43 6f 6c 75  tchOrderbyToColu
e570: 6d 6e 28 70 50 61 72 73 65 2c 20 70 2c 20 70 4f  mn(pParse, p, pO
e580: 72 64 65 72 42 79 2c 20 75 6e 69 6f 6e 54 61 62  rderBy, unionTab
e590: 2c 31 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ,1) ){.         
e5a0: 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 20 20 20   rc = 1;.       
e5b0: 20 20 20 67 6f 74 6f 20 6d 75 6c 74 69 5f 73 65     goto multi_se
e5c0: 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 20 20  lect_end;.      
e5d0: 20 20 7d 0a 20 20 20 20 20 20 20 20 61 64 64 72    }.        addr
e5e0: 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   = sqlite3VdbeAd
e5f0: 64 4f 70 28 76 2c 20 4f 50 5f 4f 70 65 6e 45 70  dOp(v, OP_OpenEp
e600: 68 65 6d 65 72 61 6c 2c 20 75 6e 69 6f 6e 54 61  hemeral, unionTa
e610: 62 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 69  b, 0);.        i
e620: 66 28 20 70 72 69 6f 72 4f 70 3d 3d 53 52 54 5f  f( priorOp==SRT_
e630: 54 61 62 6c 65 20 29 7b 0a 20 20 20 20 20 20 20  Table ){.       
e640: 20 20 20 61 73 73 65 72 74 28 20 6e 53 65 74 50     assert( nSetP
e650: 32 3c 73 69 7a 65 6f 66 28 61 53 65 74 50 32 29  2<sizeof(aSetP2)
e660: 2f 73 69 7a 65 6f 66 28 61 53 65 74 50 32 5b 30  /sizeof(aSetP2[0
e670: 5d 29 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ]) );.          
e680: 61 53 65 74 50 32 5b 6e 53 65 74 50 32 2b 2b 5d  aSetP2[nSetP2++]
e690: 20 3d 20 61 64 64 72 3b 0a 20 20 20 20 20 20 20   = addr;.       
e6a0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
e6b0: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 61 64 64    assert( p->add
e6c0: 72 4f 70 65 6e 45 70 68 6d 5b 30 5d 20 3d 3d 20  rOpenEphm[0] == 
e6d0: 2d 31 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20  -1 );.          
e6e0: 70 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b  p->addrOpenEphm[
e6f0: 30 5d 20 3d 20 61 64 64 72 3b 0a 20 20 20 20 20  0] = addr;.     
e700: 20 20 20 20 20 70 2d 3e 70 52 69 67 68 74 6d 6f       p->pRightmo
e710: 73 74 2d 3e 75 73 65 73 45 70 68 6d 20 3d 20 31  st->usesEphm = 1
e720: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
e730: 20 20 20 20 63 72 65 61 74 65 53 6f 72 74 69 6e      createSortin
e740: 67 49 6e 64 65 78 28 70 50 61 72 73 65 2c 20 70  gIndex(pParse, p
e750: 2c 20 70 4f 72 64 65 72 42 79 29 3b 0a 20 20 20  , pOrderBy);.   
e760: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e       assert( p->
e770: 70 45 4c 69 73 74 20 29 3b 0a 20 20 20 20 20 20  pEList );.      
e780: 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 43 6f 64 65  }..      /* Code
e790: 20 74 68 65 20 53 45 4c 45 43 54 20 73 74 61 74   the SELECT stat
e7a0: 65 6d 65 6e 74 73 20 74 6f 20 6f 75 72 20 6c 65  ements to our le
e7b0: 66 74 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  ft.      */.    
e7c0: 20 20 61 73 73 65 72 74 28 20 21 70 50 72 69 6f    assert( !pPrio
e7d0: 72 2d 3e 70 4f 72 64 65 72 42 79 20 29 3b 0a 20  r->pOrderBy );. 
e7e0: 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
e7f0: 33 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20  3Select(pParse, 
e800: 70 50 72 69 6f 72 2c 20 70 72 69 6f 72 4f 70 2c  pPrior, priorOp,
e810: 20 75 6e 69 6f 6e 54 61 62 2c 20 30 2c 20 30 2c   unionTab, 0, 0,
e820: 20 30 2c 20 61 66 66 29 3b 0a 20 20 20 20 20 20   0, aff);.      
e830: 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20  if( rc ){.      
e840: 20 20 67 6f 74 6f 20 6d 75 6c 74 69 5f 73 65 6c    goto multi_sel
e850: 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 20 20 7d  ect_end;.      }
e860: 0a 0a 20 20 20 20 20 20 2f 2a 20 43 6f 64 65 20  ..      /* Code 
e870: 74 68 65 20 63 75 72 72 65 6e 74 20 53 45 4c 45  the current SELE
e880: 43 54 20 73 74 61 74 65 6d 65 6e 74 0a 20 20 20  CT statement.   
e890: 20 20 20 2a 2f 0a 20 20 20 20 20 20 73 77 69 74     */.      swit
e8a0: 63 68 28 20 70 2d 3e 6f 70 20 29 7b 0a 20 20 20  ch( p->op ){.   
e8b0: 20 20 20 20 20 20 63 61 73 65 20 54 4b 5f 45 58        case TK_EX
e8c0: 43 45 50 54 3a 20 20 6f 70 20 3d 20 53 52 54 5f  CEPT:  op = SRT_
e8d0: 45 78 63 65 70 74 3b 20 20 20 62 72 65 61 6b 3b  Except;   break;
e8e0: 0a 20 20 20 20 20 20 20 20 20 63 61 73 65 20 54  .         case T
e8f0: 4b 5f 55 4e 49 4f 4e 3a 20 20 20 6f 70 20 3d 20  K_UNION:   op = 
e900: 53 52 54 5f 55 6e 69 6f 6e 3b 20 20 20 20 62 72  SRT_Union;    br
e910: 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 63 61  eak;.         ca
e920: 73 65 20 54 4b 5f 41 4c 4c 3a 20 20 20 20 20 6f  se TK_ALL:     o
e930: 70 20 3d 20 53 52 54 5f 54 61 62 6c 65 3b 20 20  p = SRT_Table;  
e940: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d    break;.      }
e950: 0a 20 20 20 20 20 20 70 2d 3e 70 50 72 69 6f 72  .      p->pPrior
e960: 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 2d 3e 70   = 0;.      p->p
e970: 4f 72 64 65 72 42 79 20 3d 20 30 3b 0a 20 20 20  OrderBy = 0;.   
e980: 20 20 20 70 2d 3e 64 69 73 61 6c 6c 6f 77 4f 72     p->disallowOr
e990: 64 65 72 42 79 20 3d 20 70 4f 72 64 65 72 42 79  derBy = pOrderBy
e9a0: 21 3d 30 3b 0a 20 20 20 20 20 20 70 4c 69 6d 69  !=0;.      pLimi
e9b0: 74 20 3d 20 70 2d 3e 70 4c 69 6d 69 74 3b 0a 20  t = p->pLimit;. 
e9c0: 20 20 20 20 20 70 2d 3e 70 4c 69 6d 69 74 20 3d       p->pLimit =
e9d0: 20 30 3b 0a 20 20 20 20 20 20 70 4f 66 66 73 65   0;.      pOffse
e9e0: 74 20 3d 20 70 2d 3e 70 4f 66 66 73 65 74 3b 0a  t = p->pOffset;.
e9f0: 20 20 20 20 20 20 70 2d 3e 70 4f 66 66 73 65 74        p->pOffset
ea00: 20 3d 20 30 3b 0a 20 20 20 20 20 20 72 63 20 3d   = 0;.      rc =
ea10: 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28 70   sqlite3Select(p
ea20: 50 61 72 73 65 2c 20 70 2c 20 6f 70 2c 20 75 6e  Parse, p, op, un
ea30: 69 6f 6e 54 61 62 2c 20 30 2c 20 30 2c 20 30 2c  ionTab, 0, 0, 0,
ea40: 20 61 66 66 29 3b 0a 20 20 20 20 20 20 2f 2a 20   aff);.      /* 
ea50: 51 75 65 72 79 20 66 6c 61 74 74 65 6e 69 6e 67  Query flattening
ea60: 20 69 6e 20 73 71 6c 69 74 65 33 53 65 6c 65 63   in sqlite3Selec
ea70: 74 28 29 20 6d 69 67 68 74 20 72 65 66 69 6c 6c  t() might refill
ea80: 20 70 2d 3e 70 4f 72 64 65 72 42 79 2e 0a 20 20   p->pOrderBy..  
ea90: 20 20 20 20 2a 2a 20 42 65 20 73 75 72 65 20 74      ** Be sure t
eaa0: 6f 20 64 65 6c 65 74 65 20 70 2d 3e 70 4f 72 64  o delete p->pOrd
eab0: 65 72 42 79 2c 20 74 68 65 72 65 66 6f 72 65 2c  erBy, therefore,
eac0: 20 74 6f 20 61 76 6f 69 64 20 61 20 6d 65 6d 6f   to avoid a memo
ead0: 72 79 20 6c 65 61 6b 2e 20 2a 2f 0a 20 20 20 20  ry leak. */.    
eae0: 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73    sqlite3ExprLis
eaf0: 74 44 65 6c 65 74 65 28 70 2d 3e 70 4f 72 64 65  tDelete(p->pOrde
eb00: 72 42 79 29 3b 0a 20 20 20 20 20 20 70 2d 3e 70  rBy);.      p->p
eb10: 50 72 69 6f 72 20 3d 20 70 50 72 69 6f 72 3b 0a  Prior = pPrior;.
eb20: 20 20 20 20 20 20 70 2d 3e 70 4f 72 64 65 72 42        p->pOrderB
eb30: 79 20 3d 20 70 4f 72 64 65 72 42 79 3b 0a 20 20  y = pOrderBy;.  
eb40: 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 44      sqlite3ExprD
eb50: 65 6c 65 74 65 28 70 2d 3e 70 4c 69 6d 69 74 29  elete(p->pLimit)
eb60: 3b 0a 20 20 20 20 20 20 70 2d 3e 70 4c 69 6d 69  ;.      p->pLimi
eb70: 74 20 3d 20 70 4c 69 6d 69 74 3b 0a 20 20 20 20  t = pLimit;.    
eb80: 20 20 70 2d 3e 70 4f 66 66 73 65 74 20 3d 20 70    p->pOffset = p
eb90: 4f 66 66 73 65 74 3b 0a 20 20 20 20 20 20 70 2d  Offset;.      p-
eba0: 3e 69 4c 69 6d 69 74 20 3d 20 2d 31 3b 0a 20 20  >iLimit = -1;.  
ebb0: 20 20 20 20 70 2d 3e 69 4f 66 66 73 65 74 20 3d      p->iOffset =
ebc0: 20 2d 31 3b 0a 20 20 20 20 20 20 69 66 28 20 72   -1;.      if( r
ebd0: 63 20 29 7b 0a 20 20 20 20 20 20 20 20 67 6f 74  c ){.        got
ebe0: 6f 20 6d 75 6c 74 69 5f 73 65 6c 65 63 74 5f 65  o multi_select_e
ebf0: 6e 64 3b 0a 20 20 20 20 20 20 7d 0a 0a 0a 20 20  nd;.      }...  
ec00: 20 20 20 20 2f 2a 20 43 6f 6e 76 65 72 74 20 74      /* Convert t
ec10: 68 65 20 64 61 74 61 20 69 6e 20 74 68 65 20 74  he data in the t
ec20: 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20 69  emporary table i
ec30: 6e 74 6f 20 77 68 61 74 65 76 65 72 20 66 6f 72  nto whatever for
ec40: 6d 0a 20 20 20 20 20 20 2a 2a 20 69 74 20 69 73  m.      ** it is
ec50: 20 74 68 61 74 20 77 65 20 63 75 72 72 65 6e 74   that we current
ec60: 6c 79 20 6e 65 65 64 2e 0a 20 20 20 20 20 20 2a  ly need..      *
ec70: 2f 20 20 20 20 20 20 0a 20 20 20 20 20 20 69 66  /      .      if
ec80: 28 20 65 44 65 73 74 21 3d 70 72 69 6f 72 4f 70  ( eDest!=priorOp
ec90: 20 7c 7c 20 75 6e 69 6f 6e 54 61 62 21 3d 69 50   || unionTab!=iP
eca0: 61 72 6d 20 29 7b 0a 20 20 20 20 20 20 20 20 69  arm ){.        i
ecb0: 6e 74 20 69 43 6f 6e 74 2c 20 69 42 72 65 61 6b  nt iCont, iBreak
ecc0: 2c 20 69 53 74 61 72 74 3b 0a 20 20 20 20 20 20  , iStart;.      
ecd0: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 45 4c    assert( p->pEL
ece0: 69 73 74 20 29 3b 0a 20 20 20 20 20 20 20 20 69  ist );.        i
ecf0: 66 28 20 65 44 65 73 74 3d 3d 53 52 54 5f 43 61  f( eDest==SRT_Ca
ed00: 6c 6c 62 61 63 6b 20 29 7b 0a 20 20 20 20 20 20  llback ){.      
ed10: 20 20 20 20 53 65 6c 65 63 74 20 2a 70 46 69 72      Select *pFir
ed20: 73 74 20 3d 20 70 3b 0a 20 20 20 20 20 20 20 20  st = p;.        
ed30: 20 20 77 68 69 6c 65 28 20 70 46 69 72 73 74 2d    while( pFirst-
ed40: 3e 70 50 72 69 6f 72 20 29 20 70 46 69 72 73 74  >pPrior ) pFirst
ed50: 20 3d 20 70 46 69 72 73 74 2d 3e 70 50 72 69 6f   = pFirst->pPrio
ed60: 72 3b 0a 20 20 20 20 20 20 20 20 20 20 67 65 6e  r;.          gen
ed70: 65 72 61 74 65 43 6f 6c 75 6d 6e 4e 61 6d 65 73  erateColumnNames
ed80: 28 70 50 61 72 73 65 2c 20 30 2c 20 70 46 69 72  (pParse, 0, pFir
ed90: 73 74 2d 3e 70 45 4c 69 73 74 29 3b 0a 20 20 20  st->pEList);.   
eda0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69       }.        i
edb0: 42 72 65 61 6b 20 3d 20 73 71 6c 69 74 65 33 56  Break = sqlite3V
edc0: 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b  dbeMakeLabel(v);
edd0: 0a 20 20 20 20 20 20 20 20 69 43 6f 6e 74 20 3d  .        iCont =
ede0: 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65   sqlite3VdbeMake
edf0: 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 20 20  Label(v);.      
ee00: 20 20 63 6f 6d 70 75 74 65 4c 69 6d 69 74 52 65    computeLimitRe
ee10: 67 69 73 74 65 72 73 28 70 50 61 72 73 65 2c 20  gisters(pParse, 
ee20: 70 2c 20 69 42 72 65 61 6b 29 3b 0a 20 20 20 20  p, iBreak);.    
ee30: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
ee40: 64 64 4f 70 28 76 2c 20 4f 50 5f 52 65 77 69 6e  ddOp(v, OP_Rewin
ee50: 64 2c 20 75 6e 69 6f 6e 54 61 62 2c 20 69 42 72  d, unionTab, iBr
ee60: 65 61 6b 29 3b 0a 20 20 20 20 20 20 20 20 69 53  eak);.        iS
ee70: 74 61 72 74 20 3d 20 73 71 6c 69 74 65 33 56 64  tart = sqlite3Vd
ee80: 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29  beCurrentAddr(v)
ee90: 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73  ;.        rc = s
eea0: 65 6c 65 63 74 49 6e 6e 65 72 4c 6f 6f 70 28 70  electInnerLoop(p
eeb0: 50 61 72 73 65 2c 20 70 2c 20 70 2d 3e 70 45 4c  Parse, p, p->pEL
eec0: 69 73 74 2c 20 75 6e 69 6f 6e 54 61 62 2c 20 70  ist, unionTab, p
eed0: 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 2c  ->pEList->nExpr,
eee0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
eef0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 4f                pO
ef00: 72 64 65 72 42 79 2c 20 2d 31 2c 20 65 44 65 73  rderBy, -1, eDes
ef10: 74 2c 20 69 50 61 72 6d 2c 20 0a 20 20 20 20 20  t, iParm, .     
ef20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ef30: 20 20 20 20 20 20 20 20 69 43 6f 6e 74 2c 20 69          iCont, i
ef40: 42 72 65 61 6b 2c 20 30 29 3b 0a 20 20 20 20 20  Break, 0);.     
ef50: 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20     if( rc ){.   
ef60: 20 20 20 20 20 20 20 72 63 20 3d 20 31 3b 0a 20         rc = 1;. 
ef70: 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 6d 75           goto mu
ef80: 6c 74 69 5f 73 65 6c 65 63 74 5f 65 6e 64 3b 0a  lti_select_end;.
ef90: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
efa0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73    sqlite3VdbeRes
efb0: 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 69 43 6f  olveLabel(v, iCo
efc0: 6e 74 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  nt);.        sql
efd0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
efe0: 20 4f 50 5f 4e 65 78 74 2c 20 75 6e 69 6f 6e 54   OP_Next, unionT
eff0: 61 62 2c 20 69 53 74 61 72 74 29 3b 0a 20 20 20  ab, iStart);.   
f000: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
f010: 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20  ResolveLabel(v, 
f020: 69 42 72 65 61 6b 29 3b 0a 20 20 20 20 20 20 20  iBreak);.       
f030: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
f040: 70 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 75  p(v, OP_Close, u
f050: 6e 69 6f 6e 54 61 62 2c 20 30 29 3b 0a 20 20 20  nionTab, 0);.   
f060: 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b     }.      break
f070: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
f080: 20 54 4b 5f 49 4e 54 45 52 53 45 43 54 3a 20 7b   TK_INTERSECT: {
f090: 0a 20 20 20 20 20 20 69 6e 74 20 74 61 62 31 2c  .      int tab1,
f0a0: 20 74 61 62 32 3b 0a 20 20 20 20 20 20 69 6e 74   tab2;.      int
f0b0: 20 69 43 6f 6e 74 2c 20 69 42 72 65 61 6b 2c 20   iCont, iBreak, 
f0c0: 69 53 74 61 72 74 3b 0a 20 20 20 20 20 20 45 78  iStart;.      Ex
f0d0: 70 72 20 2a 70 4c 69 6d 69 74 2c 20 2a 70 4f 66  pr *pLimit, *pOf
f0e0: 66 73 65 74 3b 0a 20 20 20 20 20 20 69 6e 74 20  fset;.      int 
f0f0: 61 64 64 72 3b 0a 0a 20 20 20 20 20 20 2f 2a 20  addr;..      /* 
f100: 49 4e 54 45 52 53 45 43 54 20 69 73 20 64 69 66  INTERSECT is dif
f110: 66 65 72 65 6e 74 20 66 72 6f 6d 20 74 68 65 20  ferent from the 
f120: 6f 74 68 65 72 73 20 73 69 6e 63 65 20 69 74 20  others since it 
f130: 72 65 71 75 69 72 65 73 0a 20 20 20 20 20 20 2a  requires.      *
f140: 2a 20 74 77 6f 20 74 65 6d 70 6f 72 61 72 79 20  * two temporary 
f150: 74 61 62 6c 65 73 2e 20 20 48 65 6e 63 65 20 69  tables.  Hence i
f160: 74 20 68 61 73 20 69 74 73 20 6f 77 6e 20 63 61  t has its own ca
f170: 73 65 2e 20 20 42 65 67 69 6e 0a 20 20 20 20 20  se.  Begin.     
f180: 20 2a 2a 20 62 79 20 61 6c 6c 6f 63 61 74 69 6e   ** by allocatin
f190: 67 20 74 68 65 20 74 61 62 6c 65 73 20 77 65 20  g the tables we 
f1a0: 77 69 6c 6c 20 6e 65 65 64 2e 0a 20 20 20 20 20  will need..     
f1b0: 20 2a 2f 0a 20 20 20 20 20 20 74 61 62 31 20 3d   */.      tab1 =
f1c0: 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b   pParse->nTab++;
f1d0: 0a 20 20 20 20 20 20 74 61 62 32 20 3d 20 70 50  .      tab2 = pP
f1e0: 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20  arse->nTab++;.  
f1f0: 20 20 20 20 69 66 28 20 70 4f 72 64 65 72 42 79      if( pOrderBy
f200: 20 26 26 20 6d 61 74 63 68 4f 72 64 65 72 62 79   && matchOrderby
f210: 54 6f 43 6f 6c 75 6d 6e 28 70 50 61 72 73 65 2c  ToColumn(pParse,
f220: 70 2c 70 4f 72 64 65 72 42 79 2c 74 61 62 31 2c  p,pOrderBy,tab1,
f230: 31 29 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  1) ){.        rc
f240: 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 67 6f   = 1;.        go
f250: 74 6f 20 6d 75 6c 74 69 5f 73 65 6c 65 63 74 5f  to multi_select_
f260: 65 6e 64 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  end;.      }.   
f270: 20 20 20 63 72 65 61 74 65 53 6f 72 74 69 6e 67     createSorting
f280: 49 6e 64 65 78 28 70 50 61 72 73 65 2c 20 70 2c  Index(pParse, p,
f290: 20 70 4f 72 64 65 72 42 79 29 3b 0a 0a 20 20 20   pOrderBy);..   
f2a0: 20 20 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65     addr = sqlite
f2b0: 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
f2c0: 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 2c 20  _OpenEphemeral, 
f2d0: 74 61 62 31 2c 20 30 29 3b 0a 20 20 20 20 20 20  tab1, 0);.      
f2e0: 61 73 73 65 72 74 28 20 70 2d 3e 61 64 64 72 4f  assert( p->addrO
f2f0: 70 65 6e 45 70 68 6d 5b 30 5d 20 3d 3d 20 2d 31  penEphm[0] == -1
f300: 20 29 3b 0a 20 20 20 20 20 20 70 2d 3e 61 64 64   );.      p->add
f310: 72 4f 70 65 6e 45 70 68 6d 5b 30 5d 20 3d 20 61  rOpenEphm[0] = a
f320: 64 64 72 3b 0a 20 20 20 20 20 20 70 2d 3e 70 52  ddr;.      p->pR
f330: 69 67 68 74 6d 6f 73 74 2d 3e 75 73 65 73 45 70  ightmost->usesEp
f340: 68 6d 20 3d 20 31 3b 0a 20 20 20 20 20 20 61 73  hm = 1;.      as
f350: 73 65 72 74 28 20 70 2d 3e 70 45 4c 69 73 74 20  sert( p->pEList 
f360: 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 43 6f 64  );..      /* Cod
f370: 65 20 74 68 65 20 53 45 4c 45 43 54 73 20 74 6f  e the SELECTs to
f380: 20 6f 75 72 20 6c 65 66 74 20 69 6e 74 6f 20 74   our left into t
f390: 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20 22  emporary table "
f3a0: 74 61 62 31 22 2e 0a 20 20 20 20 20 20 2a 2f 0a  tab1"..      */.
f3b0: 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
f3c0: 65 33 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c  e3Select(pParse,
f3d0: 20 70 50 72 69 6f 72 2c 20 53 52 54 5f 55 6e 69   pPrior, SRT_Uni
f3e0: 6f 6e 2c 20 74 61 62 31 2c 20 30 2c 20 30 2c 20  on, tab1, 0, 0, 
f3f0: 30 2c 20 61 66 66 29 3b 0a 20 20 20 20 20 20 69  0, aff);.      i
f400: 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20  f( rc ){.       
f410: 20 67 6f 74 6f 20 6d 75 6c 74 69 5f 73 65 6c 65   goto multi_sele
f420: 63 74 5f 65 6e 64 3b 0a 20 20 20 20 20 20 7d 0a  ct_end;.      }.
f430: 0a 20 20 20 20 20 20 2f 2a 20 43 6f 64 65 20 74  .      /* Code t
f440: 68 65 20 63 75 72 72 65 6e 74 20 53 45 4c 45 43  he current SELEC
f450: 54 20 69 6e 74 6f 20 74 65 6d 70 6f 72 61 72 79  T into temporary
f460: 20 74 61 62 6c 65 20 22 74 61 62 32 22 0a 20 20   table "tab2".  
f470: 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 61 64 64      */.      add
f480: 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41  r = sqlite3VdbeA
f490: 64 64 4f 70 28 76 2c 20 4f 50 5f 4f 70 65 6e 45  ddOp(v, OP_OpenE
f4a0: 70 68 65 6d 65 72 61 6c 2c 20 74 61 62 32 2c 20  phemeral, tab2, 
f4b0: 30 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  0);.      assert
f4c0: 28 20 70 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68  ( p->addrOpenEph
f4d0: 6d 5b 31 5d 20 3d 3d 20 2d 31 20 29 3b 0a 20 20  m[1] == -1 );.  
f4e0: 20 20 20 20 70 2d 3e 61 64 64 72 4f 70 65 6e 45      p->addrOpenE
f4f0: 70 68 6d 5b 31 5d 20 3d 20 61 64 64 72 3b 0a 20  phm[1] = addr;. 
f500: 20 20 20 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d       p->pPrior =
f510: 20 30 3b 0a 20 20 20 20 20 20 70 4c 69 6d 69 74   0;.      pLimit
f520: 20 3d 20 70 2d 3e 70 4c 69 6d 69 74 3b 0a 20 20   = p->pLimit;.  
f530: 20 20 20 20 70 2d 3e 70 4c 69 6d 69 74 20 3d 20      p->pLimit = 
f540: 30 3b 0a 20 20 20 20 20 20 70 4f 66 66 73 65 74  0;.      pOffset
f550: 20 3d 20 70 2d 3e 70 4f 66 66 73 65 74 3b 0a 20   = p->pOffset;. 
f560: 20 20 20 20 20 70 2d 3e 70 4f 66 66 73 65 74 20       p->pOffset 
f570: 3d 20 30 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  = 0;.      rc = 
f580: 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28 70 50  sqlite3Select(pP
f590: 61 72 73 65 2c 20 70 2c 20 53 52 54 5f 55 6e 69  arse, p, SRT_Uni
f5a0: 6f 6e 2c 20 74 61 62 32 2c 20 30 2c 20 30 2c 20  on, tab2, 0, 0, 
f5b0: 30 2c 20 61 66 66 29 3b 0a 20 20 20 20 20 20 70  0, aff);.      p
f5c0: 2d 3e 70 50 72 69 6f 72 20 3d 20 70 50 72 69 6f  ->pPrior = pPrio
f5d0: 72 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  r;.      sqlite3
f5e0: 45 78 70 72 44 65 6c 65 74 65 28 70 2d 3e 70 4c  ExprDelete(p->pL
f5f0: 69 6d 69 74 29 3b 0a 20 20 20 20 20 20 70 2d 3e  imit);.      p->
f600: 70 4c 69 6d 69 74 20 3d 20 70 4c 69 6d 69 74 3b  pLimit = pLimit;
f610: 0a 20 20 20 20 20 20 70 2d 3e 70 4f 66 66 73 65  .      p->pOffse
f620: 74 20 3d 20 70 4f 66 66 73 65 74 3b 0a 20 20 20  t = pOffset;.   
f630: 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20     if( rc ){.   
f640: 20 20 20 20 20 67 6f 74 6f 20 6d 75 6c 74 69 5f       goto multi_
f650: 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20  select_end;.    
f660: 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 47 65    }..      /* Ge
f670: 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20 74  nerate code to t
f680: 61 6b 65 20 74 68 65 20 69 6e 74 65 72 73 65 63  ake the intersec
f690: 74 69 6f 6e 20 6f 66 20 74 68 65 20 74 77 6f 20  tion of the two 
f6a0: 74 65 6d 70 6f 72 61 72 79 0a 20 20 20 20 20 20  temporary.      
f6b0: 2a 2a 20 74 61 62 6c 65 73 2e 0a 20 20 20 20 20  ** tables..     
f6c0: 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74   */.      assert
f6d0: 28 20 70 2d 3e 70 45 4c 69 73 74 20 29 3b 0a 20  ( p->pEList );. 
f6e0: 20 20 20 20 20 69 66 28 20 65 44 65 73 74 3d 3d       if( eDest==
f6f0: 53 52 54 5f 43 61 6c 6c 62 61 63 6b 20 29 7b 0a  SRT_Callback ){.
f700: 20 20 20 20 20 20 20 20 53 65 6c 65 63 74 20 2a          Select *
f710: 70 46 69 72 73 74 20 3d 20 70 3b 0a 20 20 20 20  pFirst = p;.    
f720: 20 20 20 20 77 68 69 6c 65 28 20 70 46 69 72 73      while( pFirs
f730: 74 2d 3e 70 50 72 69 6f 72 20 29 20 70 46 69 72  t->pPrior ) pFir
f740: 73 74 20 3d 20 70 46 69 72 73 74 2d 3e 70 50 72  st = pFirst->pPr
f750: 69 6f 72 3b 0a 20 20 20 20 20 20 20 20 67 65 6e  ior;.        gen
f760: 65 72 61 74 65 43 6f 6c 75 6d 6e 4e 61 6d 65 73  erateColumnNames
f770: 28 70 50 61 72 73 65 2c 20 30 2c 20 70 46 69 72  (pParse, 0, pFir
f780: 73 74 2d 3e 70 45 4c 69 73 74 29 3b 0a 20 20 20  st->pEList);.   
f790: 20 20 20 7d 0a 20 20 20 20 20 20 69 42 72 65 61     }.      iBrea
f7a0: 6b 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d  k = sqlite3VdbeM
f7b0: 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20  akeLabel(v);.   
f7c0: 20 20 20 69 43 6f 6e 74 20 3d 20 73 71 6c 69 74     iCont = sqlit
f7d0: 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28  e3VdbeMakeLabel(
f7e0: 76 29 3b 0a 20 20 20 20 20 20 63 6f 6d 70 75 74  v);.      comput
f7f0: 65 4c 69 6d 69 74 52 65 67 69 73 74 65 72 73 28  eLimitRegisters(
f800: 70 50 61 72 73 65 2c 20 70 2c 20 69 42 72 65 61  pParse, p, iBrea
f810: 6b 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  k);.      sqlite
f820: 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
f830: 5f 52 65 77 69 6e 64 2c 20 74 61 62 31 2c 20 69  _Rewind, tab1, i
f840: 42 72 65 61 6b 29 3b 0a 20 20 20 20 20 20 69 53  Break);.      iS
f850: 74 61 72 74 20 3d 20 73 71 6c 69 74 65 33 56 64  tart = sqlite3Vd
f860: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 52 6f  beAddOp(v, OP_Ro
f870: 77 4b 65 79 2c 20 74 61 62 31 2c 20 30 29 3b 0a  wKey, tab1, 0);.
f880: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
f890: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4e 6f 74  eAddOp(v, OP_Not
f8a0: 46 6f 75 6e 64 2c 20 74 61 62 32 2c 20 69 43 6f  Found, tab2, iCo
f8b0: 6e 74 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  nt);.      rc = 
f8c0: 73 65 6c 65 63 74 49 6e 6e 65 72 4c 6f 6f 70 28  selectInnerLoop(
f8d0: 70 50 61 72 73 65 2c 20 70 2c 20 70 2d 3e 70 45  pParse, p, p->pE
f8e0: 4c 69 73 74 2c 20 74 61 62 31 2c 20 70 2d 3e 70  List, tab1, p->p
f8f0: 45 4c 69 73 74 2d 3e 6e 45 78 70 72 2c 0a 20 20  EList->nExpr,.  
f900: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f910: 20 20 20 20 20 20 20 20 20 20 20 70 4f 72 64 65             pOrde
f920: 72 42 79 2c 20 2d 31 2c 20 65 44 65 73 74 2c 20  rBy, -1, eDest, 
f930: 69 50 61 72 6d 2c 20 0a 20 20 20 20 20 20 20 20  iParm, .        
f940: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f950: 20 20 20 20 20 69 43 6f 6e 74 2c 20 69 42 72 65       iCont, iBre
f960: 61 6b 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66  ak, 0);.      if
f970: 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20  ( rc ){.        
f980: 72 63 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20  rc = 1;.        
f990: 67 6f 74 6f 20 6d 75 6c 74 69 5f 73 65 6c 65 63  goto multi_selec
f9a0: 74 5f 65 6e 64 3b 0a 20 20 20 20 20 20 7d 0a 20  t_end;.      }. 
f9b0: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
f9c0: 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20  ResolveLabel(v, 
f9d0: 69 43 6f 6e 74 29 3b 0a 20 20 20 20 20 20 73 71  iCont);.      sq
f9e0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
f9f0: 2c 20 4f 50 5f 4e 65 78 74 2c 20 74 61 62 31 2c  , OP_Next, tab1,
fa00: 20 69 53 74 61 72 74 29 3b 0a 20 20 20 20 20 20   iStart);.      
fa10: 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c  sqlite3VdbeResol
fa20: 76 65 4c 61 62 65 6c 28 76 2c 20 69 42 72 65 61  veLabel(v, iBrea
fa30: 6b 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  k);.      sqlite
fa40: 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
fa50: 5f 43 6c 6f 73 65 2c 20 74 61 62 32 2c 20 30 29  _Close, tab2, 0)
fa60: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
fa70: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 43  dbeAddOp(v, OP_C
fa80: 6c 6f 73 65 2c 20 74 61 62 31 2c 20 30 29 3b 0a  lose, tab1, 0);.
fa90: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
faa0: 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61 6b   }.  }..  /* Mak
fab0: 65 20 73 75 72 65 20 61 6c 6c 20 53 45 4c 45 43  e sure all SELEC
fac0: 54 73 20 69 6e 20 74 68 65 20 73 74 61 74 65 6d  Ts in the statem
fad0: 65 6e 74 20 68 61 76 65 20 74 68 65 20 73 61 6d  ent have the sam
fae0: 65 20 6e 75 6d 62 65 72 20 6f 66 20 65 6c 65 6d  e number of elem
faf0: 65 6e 74 73 0a 20 20 2a 2a 20 69 6e 20 74 68 65  ents.  ** in the
fb00: 69 72 20 72 65 73 75 6c 74 20 73 65 74 73 2e 0a  ir result sets..
fb10: 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70    */.  assert( p
fb20: 2d 3e 70 45 4c 69 73 74 20 26 26 20 70 50 72 69  ->pEList && pPri
fb30: 6f 72 2d 3e 70 45 4c 69 73 74 20 29 3b 0a 20 20  or->pEList );.  
fb40: 69 66 28 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e  if( p->pEList->n
fb50: 45 78 70 72 21 3d 70 50 72 69 6f 72 2d 3e 70 45  Expr!=pPrior->pE
fb60: 4c 69 73 74 2d 3e 6e 45 78 70 72 20 29 7b 0a 20  List->nExpr ){. 
fb70: 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
fb80: 73 67 28 70 50 61 72 73 65 2c 20 22 53 45 4c 45  sg(pParse, "SELE
fb90: 43 54 73 20 74 6f 20 74 68 65 20 6c 65 66 74 20  CTs to the left 
fba0: 61 6e 64 20 72 69 67 68 74 20 6f 66 20 25 73 22  and right of %s"
fbb0: 0a 20 20 20 20 20 20 22 20 64 6f 20 6e 6f 74 20  .      " do not 
fbc0: 68 61 76 65 20 74 68 65 20 73 61 6d 65 20 6e 75  have the same nu
fbd0: 6d 62 65 72 20 6f 66 20 72 65 73 75 6c 74 20 63  mber of result c
fbe0: 6f 6c 75 6d 6e 73 22 2c 20 73 65 6c 65 63 74 4f  olumns", selectO
fbf0: 70 4e 61 6d 65 28 70 2d 3e 6f 70 29 29 3b 0a 20  pName(p->op));. 
fc00: 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 67     rc = 1;.    g
fc10: 6f 74 6f 20 6d 75 6c 74 69 5f 73 65 6c 65 63 74  oto multi_select
fc20: 5f 65 6e 64 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  _end;.  }..  /* 
fc30: 53 65 74 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  Set the number o
fc40: 66 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 65 6d  f columns in tem
fc50: 70 6f 72 61 72 79 20 74 61 62 6c 65 73 0a 20 20  porary tables.  
fc60: 2a 2f 0a 20 20 6e 43 6f 6c 20 3d 20 70 2d 3e 70  */.  nCol = p->p
fc70: 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 0a 20 20  EList->nExpr;.  
fc80: 77 68 69 6c 65 28 20 6e 53 65 74 50 32 20 29 7b  while( nSetP2 ){
fc90: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
fca0: 43 68 61 6e 67 65 50 32 28 76 2c 20 61 53 65 74  ChangeP2(v, aSet
fcb0: 50 32 5b 2d 2d 6e 53 65 74 50 32 5d 2c 20 6e 43  P2[--nSetP2], nC
fcc0: 6f 6c 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43  ol);.  }..  /* C
fcd0: 6f 6d 70 75 74 65 20 63 6f 6c 6c 61 74 69 6e 67  ompute collating
fce0: 20 73 65 71 75 65 6e 63 65 73 20 75 73 65 64 20   sequences used 
fcf0: 62 79 20 65 69 74 68 65 72 20 74 68 65 20 4f 52  by either the OR
fd00: 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 6f 72  DER BY clause or
fd10: 0a 20 20 2a 2a 20 62 79 20 61 6e 79 20 74 65 6d  .  ** by any tem
fd20: 70 6f 72 61 72 79 20 74 61 62 6c 65 73 20 6e 65  porary tables ne
fd30: 65 64 65 64 20 74 6f 20 69 6d 70 6c 65 6d 65 6e  eded to implemen
fd40: 74 20 74 68 65 20 63 6f 6d 70 6f 75 6e 64 20 73  t the compound s
fd50: 65 6c 65 63 74 2e 0a 20 20 2a 2a 20 41 74 74 61  elect..  ** Atta
fd60: 63 68 20 74 68 65 20 4b 65 79 49 6e 66 6f 20 73  ch the KeyInfo s
fd70: 74 72 75 63 74 75 72 65 20 74 6f 20 61 6c 6c 20  tructure to all 
fd80: 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 73  temporary tables
fd90: 2e 20 20 49 6e 76 6f 6b 65 20 74 68 65 0a 20 20  .  Invoke the.  
fda0: 2a 2a 20 4f 52 44 45 52 20 42 59 20 70 72 6f 63  ** ORDER BY proc
fdb0: 65 73 73 69 6e 67 20 69 66 20 74 68 65 72 65 20  essing if there 
fdc0: 69 73 20 61 6e 20 4f 52 44 45 52 20 42 59 20 63  is an ORDER BY c
fdd0: 6c 61 75 73 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  lause..  **.  **
fde0: 20 54 68 69 73 20 73 65 63 74 69 6f 6e 20 69 73   This section is
fdf0: 20 72 75 6e 20 62 79 20 74 68 65 20 72 69 67 68   run by the righ
fe00: 74 2d 6d 6f 73 74 20 53 45 4c 45 43 54 20 73 74  t-most SELECT st
fe10: 61 74 65 6d 65 6e 74 20 6f 6e 6c 79 2e 0a 20 20  atement only..  
fe20: 2a 2a 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d  ** SELECT statem
fe30: 65 6e 74 73 20 74 6f 20 74 68 65 20 6c 65 66 74  ents to the left
fe40: 20 61 6c 77 61 79 73 20 73 6b 69 70 20 74 68 69   always skip thi
fe50: 73 20 70 61 72 74 2e 20 20 54 68 65 20 72 69 67  s part.  The rig
fe60: 68 74 2d 6d 6f 73 74 0a 20 20 2a 2a 20 53 45 4c  ht-most.  ** SEL
fe70: 45 43 54 20 6d 69 67 68 74 20 61 6c 73 6f 20 73  ECT might also s
fe80: 6b 69 70 20 74 68 69 73 20 70 61 72 74 20 69 66  kip this part if
fe90: 20 69 74 20 68 61 73 20 6e 6f 20 4f 52 44 45 52   it has no ORDER
fea0: 20 42 59 20 63 6c 61 75 73 65 20 61 6e 64 0a 20   BY clause and. 
feb0: 20 2a 2a 20 6e 6f 20 74 65 6d 70 20 74 61 62 6c   ** no temp tabl
fec0: 65 73 20 61 72 65 20 72 65 71 75 69 72 65 64 2e  es are required.
fed0: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 4f 72 64  .  */.  if( pOrd
fee0: 65 72 42 79 20 7c 7c 20 70 2d 3e 75 73 65 73 45  erBy || p->usesE
fef0: 70 68 6d 20 29 7b 0a 20 20 20 20 69 6e 74 20 69  phm ){.    int i
ff00: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
ff10: 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70           /* Loop
ff20: 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 20 20   counter */.    
ff30: 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66  KeyInfo *pKeyInf
ff40: 6f 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  o;            /*
ff50: 20 43 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65   Collating seque
ff60: 6e 63 65 20 66 6f 72 20 74 68 65 20 72 65 73 75  nce for the resu
ff70: 6c 74 20 73 65 74 20 2a 2f 0a 20 20 20 20 53 65  lt set */.    Se
ff80: 6c 65 63 74 20 2a 70 4c 6f 6f 70 3b 20 20 20 20  lect *pLoop;    
ff90: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
ffa0: 6f 72 20 6c 6f 6f 70 69 6e 67 20 74 68 72 6f 75  or looping throu
ffb0: 67 68 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d  gh SELECT statem
ffc0: 65 6e 74 73 20 2a 2f 0a 20 20 20 20 69 6e 74 20  ents */.    int 
ffd0: 6e 4b 65 79 43 6f 6c 3b 20 20 20 20 20 20 20 20  nKeyCol;        
ffe0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
fff0: 62 65 72 20 6f 66 20 65 6e 74 72 69 65 73 20 69  ber of entries i
10000 6e 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 43 6f 6c  n pKeyInfo->aCol
10010 5b 5d 20 2a 2f 0a 20 20 20 20 43 6f 6c 6c 53 65  [] */.    CollSe
10020 71 20 2a 2a 61 70 43 6f 6c 6c 3b 20 20 20 20 20  q **apColl;     
10030 20 20 20 20 20 20 20 20 2f 2a 20 46 6f 72 20 6c          /* For l
10040 6f 6f 70 69 6e 67 20 74 68 72 6f 75 67 68 20 70  ooping through p
10050 4b 65 79 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b 5d  KeyInfo->aColl[]
10060 20 2a 2f 0a 20 20 20 20 43 6f 6c 6c 53 65 71 20   */.    CollSeq 
10070 2a 2a 61 43 6f 70 79 3b 20 20 20 20 20 20 20 20  **aCopy;        
10080 20 20 20 20 20 20 2f 2a 20 41 20 63 6f 70 79 20        /* A copy 
10090 6f 66 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 43 6f  of pKeyInfo->aCo
100a0 6c 6c 5b 5d 20 2a 2f 0a 0a 20 20 20 20 61 73 73  ll[] */..    ass
100b0 65 72 74 28 20 70 2d 3e 70 52 69 67 68 74 6d 6f  ert( p->pRightmo
100c0 73 74 3d 3d 70 20 29 3b 0a 20 20 20 20 6e 4b 65  st==p );.    nKe
100d0 79 43 6f 6c 20 3d 20 6e 43 6f 6c 20 2b 20 28 70  yCol = nCol + (p
100e0 4f 72 64 65 72 42 79 20 3f 20 70 4f 72 64 65 72  OrderBy ? pOrder
100f0 42 79 2d 3e 6e 45 78 70 72 20 3a 20 30 29 3b 0a  By->nExpr : 0);.
10100 20 20 20 20 70 4b 65 79 49 6e 66 6f 20 3d 20 73      pKeyInfo = s
10110 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65  qlite3DbMallocZe
10120 72 6f 28 70 50 61 72 73 65 2d 3e 64 62 2c 0a 20  ro(pParse->db,. 
10130 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10140 20 20 20 20 20 20 73 69 7a 65 6f 66 28 2a 70 4b        sizeof(*pK
10150 65 79 49 6e 66 6f 29 2b 6e 4b 65 79 43 6f 6c 2a  eyInfo)+nKeyCol*
10160 28 73 69 7a 65 6f 66 28 43 6f 6c 6c 53 65 71 2a  (sizeof(CollSeq*
10170 29 20 2b 20 31 29 29 3b 0a 20 20 20 20 69 66 28  ) + 1));.    if(
10180 20 21 70 4b 65 79 49 6e 66 6f 20 29 7b 0a 20 20   !pKeyInfo ){.  
10190 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
101a0 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 67 6f 74  NOMEM;.      got
101b0 6f 20 6d 75 6c 74 69 5f 73 65 6c 65 63 74 5f 65  o multi_select_e
101c0 6e 64 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 70  nd;.    }..    p
101d0 4b 65 79 49 6e 66 6f 2d 3e 65 6e 63 20 3d 20 45  KeyInfo->enc = E
101e0 4e 43 28 70 50 61 72 73 65 2d 3e 64 62 29 3b 0a  NC(pParse->db);.
101f0 20 20 20 20 70 4b 65 79 49 6e 66 6f 2d 3e 6e 46      pKeyInfo->nF
10200 69 65 6c 64 20 3d 20 6e 43 6f 6c 3b 0a 0a 20 20  ield = nCol;..  
10210 20 20 66 6f 72 28 69 3d 30 2c 20 61 70 43 6f 6c    for(i=0, apCol
10220 6c 3d 70 4b 65 79 49 6e 66 6f 2d 3e 61 43 6f 6c  l=pKeyInfo->aCol
10230 6c 3b 20 69 3c 6e 43 6f 6c 3b 20 69 2b 2b 2c 20  l; i<nCol; i++, 
10240 61 70 43 6f 6c 6c 2b 2b 29 7b 0a 20 20 20 20 20  apColl++){.     
10250 20 2a 61 70 43 6f 6c 6c 20 3d 20 6d 75 6c 74 69   *apColl = multi
10260 53 65 6c 65 63 74 43 6f 6c 6c 53 65 71 28 70 50  SelectCollSeq(pP
10270 61 72 73 65 2c 20 70 2c 20 69 29 3b 0a 20 20 20  arse, p, i);.   
10280 20 20 20 69 66 28 20 30 3d 3d 2a 61 70 43 6f 6c     if( 0==*apCol
10290 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 2a 61 70  l ){.        *ap
102a0 43 6f 6c 6c 20 3d 20 70 50 61 72 73 65 2d 3e 64  Coll = pParse->d
102b0 62 2d 3e 70 44 66 6c 74 43 6f 6c 6c 3b 0a 20 20  b->pDfltColl;.  
102c0 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20      }.    }..   
102d0 20 66 6f 72 28 70 4c 6f 6f 70 3d 70 3b 20 70 4c   for(pLoop=p; pL
102e0 6f 6f 70 3b 20 70 4c 6f 6f 70 3d 70 4c 6f 6f 70  oop; pLoop=pLoop
102f0 2d 3e 70 50 72 69 6f 72 29 7b 0a 20 20 20 20 20  ->pPrior){.     
10300 20 66 6f 72 28 69 3d 30 3b 20 69 3c 32 3b 20 69   for(i=0; i<2; i
10310 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74  ++){.        int
10320 20 61 64 64 72 20 3d 20 70 4c 6f 6f 70 2d 3e 61   addr = pLoop->a
10330 64 64 72 4f 70 65 6e 45 70 68 6d 5b 69 5d 3b 0a  ddrOpenEphm[i];.
10340 20 20 20 20 20 20 20 20 69 66 28 20 61 64 64 72          if( addr
10350 3c 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  <0 ){.          
10360 2f 2a 20 49 66 20 5b 30 5d 20 69 73 20 75 6e 75  /* If [0] is unu
10370 73 65 64 20 74 68 65 6e 20 5b 31 5d 20 69 73 20  sed then [1] is 
10380 61 6c 73 6f 20 75 6e 75 73 65 64 2e 20 20 53 6f  also unused.  So
10390 20 77 65 20 63 61 6e 0a 20 20 20 20 20 20 20 20   we can.        
103a0 20 20 2a 2a 20 61 6c 77 61 79 73 20 73 61 66 65    ** always safe
103b0 6c 79 20 61 62 6f 72 74 20 61 73 20 73 6f 6f 6e  ly abort as soon
103c0 20 61 73 20 74 68 65 20 66 69 72 73 74 20 75 6e   as the first un
103d0 75 73 65 64 20 73 6c 6f 74 20 69 73 20 66 6f 75  used slot is fou
103e0 6e 64 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  nd */.          
103f0 61 73 73 65 72 74 28 20 70 4c 6f 6f 70 2d 3e 61  assert( pLoop->a
10400 64 64 72 4f 70 65 6e 45 70 68 6d 5b 31 5d 3c 30  ddrOpenEphm[1]<0
10410 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72   );.          br
10420 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  eak;.        }. 
10430 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
10440 62 65 43 68 61 6e 67 65 50 32 28 76 2c 20 61 64  beChangeP2(v, ad
10450 64 72 2c 20 6e 43 6f 6c 29 3b 0a 20 20 20 20 20  dr, nCol);.     
10460 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68     sqlite3VdbeCh
10470 61 6e 67 65 50 33 28 76 2c 20 61 64 64 72 2c 20  angeP3(v, addr, 
10480 28 63 68 61 72 2a 29 70 4b 65 79 49 6e 66 6f 2c  (char*)pKeyInfo,
10490 20 50 33 5f 4b 45 59 49 4e 46 4f 29 3b 0a 20 20   P3_KEYINFO);.  
104a0 20 20 20 20 20 20 70 4c 6f 6f 70 2d 3e 61 64 64        pLoop->add
104b0 72 4f 70 65 6e 45 70 68 6d 5b 69 5d 20 3d 20 2d  rOpenEphm[i] = -
104c0 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  1;.      }.    }
104d0 0a 0a 20 20 20 20 69 66 28 20 70 4f 72 64 65 72  ..    if( pOrder
104e0 42 79 20 29 7b 0a 20 20 20 20 20 20 73 74 72 75  By ){.      stru
104f0 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d  ct ExprList_item
10500 20 2a 70 4f 54 65 72 6d 20 3d 20 70 4f 72 64 65   *pOTerm = pOrde
10510 72 42 79 2d 3e 61 3b 0a 20 20 20 20 20 20 69 6e  rBy->a;.      in
10520 74 20 6e 4f 72 64 65 72 42 79 45 78 70 72 20 3d  t nOrderByExpr =
10530 20 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72   pOrderBy->nExpr
10540 3b 0a 20 20 20 20 20 20 69 6e 74 20 61 64 64 72  ;.      int addr
10550 3b 0a 20 20 20 20 20 20 75 38 20 2a 70 53 6f 72  ;.      u8 *pSor
10560 74 4f 72 64 65 72 3b 0a 0a 20 20 20 20 20 20 2f  tOrder;..      /
10570 2a 20 52 65 75 73 65 20 74 68 65 20 73 61 6d 65  * Reuse the same
10580 20 70 4b 65 79 49 6e 66 6f 20 66 6f 72 20 74 68   pKeyInfo for th
10590 65 20 4f 52 44 45 52 20 42 59 20 61 73 20 77 61  e ORDER BY as wa
105a0 73 20 75 73 65 64 20 61 62 6f 76 65 20 66 6f 72  s used above for
105b0 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20 63 6f  .      ** the co
105c0 6d 70 6f 75 6e 64 20 73 65 6c 65 63 74 20 73 74  mpound select st
105d0 61 74 65 6d 65 6e 74 73 2e 20 20 45 78 63 65 70  atements.  Excep
105e0 74 20 77 65 20 68 61 76 65 20 74 6f 20 63 68 61  t we have to cha
105f0 6e 67 65 20 6f 75 74 20 74 68 65 0a 20 20 20 20  nge out the.    
10600 20 20 2a 2a 20 70 4b 65 79 49 6e 66 6f 2d 3e 61    ** pKeyInfo->a
10610 43 6f 6c 6c 5b 5d 20 76 61 6c 75 65 73 2e 20 20  Coll[] values.  
10620 53 6f 6d 65 20 6f 66 20 74 68 65 20 61 43 6f 6c  Some of the aCol
10630 6c 5b 5d 20 76 61 6c 75 65 73 20 77 69 6c 6c 20  l[] values will 
10640 62 65 0a 20 20 20 20 20 20 2a 2a 20 72 65 75 73  be.      ** reus
10650 65 64 20 77 68 65 6e 20 63 6f 6e 73 74 72 75 63  ed when construc
10660 74 69 6e 67 20 74 68 65 20 70 4b 65 79 49 6e 66  ting the pKeyInf
10670 6f 20 66 6f 72 20 74 68 65 20 4f 52 44 45 52 20  o for the ORDER 
10680 42 59 2c 20 73 6f 20 6d 61 6b 65 0a 20 20 20 20  BY, so make.    
10690 20 20 2a 2a 20 61 20 63 6f 70 79 2e 20 20 53 75    ** a copy.  Su
106a0 66 66 69 63 69 65 6e 74 20 73 70 61 63 65 20 74  fficient space t
106b0 6f 20 68 6f 6c 64 20 62 6f 74 68 20 74 68 65 20  o hold both the 
106c0 6e 43 6f 6c 20 65 6e 74 72 69 65 73 20 66 6f 72  nCol entries for
106d0 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20 63 6f  .      ** the co
106e0 6d 70 6f 75 6e 64 20 73 65 6c 65 63 74 20 61 6e  mpound select an
106f0 64 20 74 68 65 20 6e 4f 72 64 65 72 62 79 45 78  d the nOrderbyEx
10700 70 72 20 65 6e 74 72 69 65 73 20 66 6f 72 20 74  pr entries for t
10710 68 65 20 4f 52 44 45 52 20 42 59 0a 20 20 20 20  he ORDER BY.    
10720 20 20 2a 2a 20 77 61 73 20 61 6c 6c 6f 63 61 74    ** was allocat
10730 65 64 20 61 62 6f 76 65 2e 20 20 42 75 74 20 77  ed above.  But w
10740 65 20 6e 65 65 64 20 74 6f 20 6d 6f 76 65 20 74  e need to move t
10750 68 65 20 63 6f 6d 70 6f 75 6e 64 20 73 65 6c 65  he compound sele
10760 63 74 0a 20 20 20 20 20 20 2a 2a 20 65 6e 74 72  ct.      ** entr
10770 69 65 73 20 6f 75 74 20 6f 66 20 74 68 65 20 77  ies out of the w
10780 61 79 20 62 65 66 6f 72 65 20 63 6f 6e 73 74 72  ay before constr
10790 75 63 74 69 6e 67 20 74 68 65 20 4f 52 44 45 52  ucting the ORDER
107a0 20 42 59 20 65 6e 74 72 69 65 73 2e 0a 20 20 20   BY entries..   
107b0 20 20 20 2a 2a 20 4d 6f 76 65 20 74 68 65 20 63     ** Move the c
107c0 6f 6d 70 6f 75 6e 64 20 73 65 6c 65 63 74 20 65  ompound select e
107d0 6e 74 72 69 65 73 20 69 6e 74 6f 20 61 43 6f 70  ntries into aCop
107e0 79 5b 5d 20 77 68 65 72 65 20 74 68 65 79 20 63  y[] where they c
107f0 61 6e 20 62 65 0a 20 20 20 20 20 20 2a 2a 20 61  an be.      ** a
10800 63 63 65 73 73 65 64 20 61 6e 64 20 72 65 75 73  ccessed and reus
10810 65 64 20 77 68 65 6e 20 63 6f 6e 73 74 72 75 63  ed when construc
10820 74 69 6e 67 20 74 68 65 20 4f 52 44 45 52 20 42  ting the ORDER B
10830 59 20 65 6e 74 72 69 65 73 2e 0a 20 20 20 20 20  Y entries..     
10840 20 2a 2a 20 42 65 63 61 75 73 65 20 6e 43 6f 6c   ** Because nCol
10850 20 6d 69 67 68 74 20 62 65 20 67 72 65 61 74 65   might be greate
10860 72 20 74 68 61 6e 20 6f 72 20 6c 65 73 73 20 74  r than or less t
10870 68 61 6e 20 6e 4f 72 64 65 72 42 79 45 78 70 72  han nOrderByExpr
10880 0a 20 20 20 20 20 20 2a 2a 20 77 65 20 68 61 76  .      ** we hav
10890 65 20 74 6f 20 75 73 65 20 6d 65 6d 6d 6f 76 65  e to use memmove
108a0 28 29 20 77 68 65 6e 20 64 6f 69 6e 67 20 74 68  () when doing th
108b0 65 20 63 6f 70 79 2e 0a 20 20 20 20 20 20 2a 2f  e copy..      */
108c0 0a 20 20 20 20 20 20 61 43 6f 70 79 20 3d 20 26  .      aCopy = &
108d0 70 4b 65 79 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b  pKeyInfo->aColl[
108e0 6e 4f 72 64 65 72 42 79 45 78 70 72 5d 3b 0a 20  nOrderByExpr];. 
108f0 20 20 20 20 20 70 53 6f 72 74 4f 72 64 65 72 20       pSortOrder 
10900 3d 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 53 6f 72  = pKeyInfo->aSor
10910 74 4f 72 64 65 72 20 3d 20 28 75 38 2a 29 26 61  tOrder = (u8*)&a
10920 43 6f 70 79 5b 6e 43 6f 6c 5d 3b 0a 20 20 20 20  Copy[nCol];.    
10930 20 20 6d 65 6d 6d 6f 76 65 28 61 43 6f 70 79 2c    memmove(aCopy,
10940 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 43 6f 6c 6c   pKeyInfo->aColl
10950 2c 20 6e 43 6f 6c 2a 73 69 7a 65 6f 66 28 43 6f  , nCol*sizeof(Co
10960 6c 6c 53 65 71 2a 29 29 3b 0a 0a 20 20 20 20 20  llSeq*));..     
10970 20 61 70 43 6f 6c 6c 20 3d 20 70 4b 65 79 49 6e   apColl = pKeyIn
10980 66 6f 2d 3e 61 43 6f 6c 6c 3b 0a 20 20 20 20 20  fo->aColl;.     
10990 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 4f 72 64   for(i=0; i<nOrd
109a0 65 72 42 79 45 78 70 72 3b 20 69 2b 2b 2c 20 70  erByExpr; i++, p
109b0 4f 54 65 72 6d 2b 2b 2c 20 61 70 43 6f 6c 6c 2b  OTerm++, apColl+
109c0 2b 2c 20 70 53 6f 72 74 4f 72 64 65 72 2b 2b 29  +, pSortOrder++)
109d0 7b 0a 20 20 20 20 20 20 20 20 45 78 70 72 20 2a  {.        Expr *
109e0 70 45 78 70 72 20 3d 20 70 4f 54 65 72 6d 2d 3e  pExpr = pOTerm->
109f0 70 45 78 70 72 3b 0a 20 20 20 20 20 20 20 20 69  pExpr;.        i
10a00 66 28 20 28 70 45 78 70 72 2d 3e 66 6c 61 67 73  f( (pExpr->flags
10a10 20 26 20 45 50 5f 45 78 70 43 6f 6c 6c 61 74 65   & EP_ExpCollate
10a20 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 61  ) ){.          a
10a30 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 70 43  ssert( pExpr->pC
10a40 6f 6c 6c 21 3d 30 20 29 3b 0a 20 20 20 20 20 20  oll!=0 );.      
10a50 20 20 20 20 2a 61 70 43 6f 6c 6c 20 3d 20 70 45      *apColl = pE
10a60 78 70 72 2d 3e 70 43 6f 6c 6c 3b 0a 20 20 20 20  xpr->pColl;.    
10a70 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
10a80 20 20 20 20 20 2a 61 70 43 6f 6c 6c 20 3d 20 61       *apColl = a
10a90 43 6f 70 79 5b 70 45 78 70 72 2d 3e 69 43 6f 6c  Copy[pExpr->iCol
10aa0 75 6d 6e 5d 3b 0a 20 20 20 20 20 20 20 20 7d 0a  umn];.        }.
10ab0 20 20 20 20 20 20 20 20 2a 70 53 6f 72 74 4f 72          *pSortOr
10ac0 64 65 72 20 3d 20 70 4f 54 65 72 6d 2d 3e 73 6f  der = pOTerm->so
10ad0 72 74 4f 72 64 65 72 3b 0a 20 20 20 20 20 20 7d  rtOrder;.      }
10ae0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
10af0 2d 3e 70 52 69 67 68 74 6d 6f 73 74 3d 3d 70 20  ->pRightmost==p 
10b00 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
10b10 20 70 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d   p->addrOpenEphm
10b20 5b 32 5d 3e 3d 30 20 29 3b 0a 20 20 20 20 20 20  [2]>=0 );.      
10b30 61 64 64 72 20 3d 20 70 2d 3e 61 64 64 72 4f 70  addr = p->addrOp
10b40 65 6e 45 70 68 6d 5b 32 5d 3b 0a 20 20 20 20 20  enEphm[2];.     
10b50 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e   sqlite3VdbeChan
10b60 67 65 50 32 28 76 2c 20 61 64 64 72 2c 20 70 2d  geP2(v, addr, p-
10b70 3e 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72  >pOrderBy->nExpr
10b80 2b 32 29 3b 0a 20 20 20 20 20 20 70 4b 65 79 49  +2);.      pKeyI
10b90 6e 66 6f 2d 3e 6e 46 69 65 6c 64 20 3d 20 6e 4f  nfo->nField = nO
10ba0 72 64 65 72 42 79 45 78 70 72 3b 0a 20 20 20 20  rderByExpr;.    
10bb0 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61    sqlite3VdbeCha
10bc0 6e 67 65 50 33 28 76 2c 20 61 64 64 72 2c 20 28  ngeP3(v, addr, (
10bd0 63 68 61 72 2a 29 70 4b 65 79 49 6e 66 6f 2c 20  char*)pKeyInfo, 
10be0 50 33 5f 4b 45 59 49 4e 46 4f 5f 48 41 4e 44 4f  P3_KEYINFO_HANDO
10bf0 46 46 29 3b 0a 20 20 20 20 20 20 70 4b 65 79 49  FF);.      pKeyI
10c00 6e 66 6f 20 3d 20 30 3b 0a 20 20 20 20 20 20 67  nfo = 0;.      g
10c10 65 6e 65 72 61 74 65 53 6f 72 74 54 61 69 6c 28  enerateSortTail(
10c20 70 50 61 72 73 65 2c 20 70 2c 20 76 2c 20 70 2d  pParse, p, v, p-
10c30 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 2c 20  >pEList->nExpr, 
10c40 65 44 65 73 74 2c 20 69 50 61 72 6d 29 3b 0a 20  eDest, iParm);. 
10c50 20 20 20 7d 0a 0a 20 20 20 20 73 71 6c 69 74 65     }..    sqlite
10c60 33 5f 66 72 65 65 28 70 4b 65 79 49 6e 66 6f 29  3_free(pKeyInfo)
10c70 3b 0a 20 20 7d 0a 0a 6d 75 6c 74 69 5f 73 65 6c  ;.  }..multi_sel
10c80 65 63 74 5f 65 6e 64 3a 0a 20 20 72 65 74 75 72  ect_end:.  retur
10c90 6e 20 72 63 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f  n rc;.}.#endif /
10ca0 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f  * SQLITE_OMIT_CO
10cb0 4d 50 4f 55 4e 44 5f 53 45 4c 45 43 54 20 2a 2f  MPOUND_SELECT */
10cc0 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
10cd0 5f 4f 4d 49 54 5f 56 49 45 57 0a 2f 2a 20 46 6f  _OMIT_VIEW./* Fo
10ce0 72 77 61 72 64 20 44 65 63 6c 61 72 61 74 69 6f  rward Declaratio
10cf0 6e 73 20 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  ns */.static voi
10d00 64 20 73 75 62 73 74 45 78 70 72 4c 69 73 74 28  d substExprList(
10d10 73 71 6c 69 74 65 33 2a 2c 20 45 78 70 72 4c 69  sqlite3*, ExprLi
10d20 73 74 2a 2c 20 69 6e 74 2c 20 45 78 70 72 4c 69  st*, int, ExprLi
10d30 73 74 2a 29 3b 0a 73 74 61 74 69 63 20 76 6f 69  st*);.static voi
10d40 64 20 73 75 62 73 74 53 65 6c 65 63 74 28 73 71  d substSelect(sq
10d50 6c 69 74 65 33 2a 2c 20 53 65 6c 65 63 74 20 2a  lite3*, Select *
10d60 2c 20 69 6e 74 2c 20 45 78 70 72 4c 69 73 74 20  , int, ExprList 
10d70 2a 29 3b 0a 0a 2f 2a 0a 2a 2a 20 53 63 61 6e 20  *);../*.** Scan 
10d80 74 68 72 6f 75 67 68 20 74 68 65 20 65 78 70 72  through the expr
10d90 65 73 73 69 6f 6e 20 70 45 78 70 72 2e 20 20 52  ession pExpr.  R
10da0 65 70 6c 61 63 65 20 65 76 65 72 79 20 72 65 66  eplace every ref
10db0 65 72 65 6e 63 65 20 74 6f 0a 2a 2a 20 61 20 63  erence to.** a c
10dc0 6f 6c 75 6d 6e 20 69 6e 20 74 61 62 6c 65 20 6e  olumn in table n
10dd0 75 6d 62 65 72 20 69 54 61 62 6c 65 20 77 69 74  umber iTable wit
10de0 68 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20  h a copy of the 
10df0 69 43 6f 6c 75 6d 6e 2d 74 68 0a 2a 2a 20 65 6e  iColumn-th.** en
10e00 74 72 79 20 69 6e 20 70 45 4c 69 73 74 2e 20 20  try in pEList.  
10e10 28 42 75 74 20 6c 65 61 76 65 20 72 65 66 65 72  (But leave refer
10e20 65 6e 63 65 73 20 74 6f 20 74 68 65 20 52 4f 57  ences to the ROW
10e30 49 44 20 63 6f 6c 75 6d 6e 20 0a 2a 2a 20 75 6e  ID column .** un
10e40 63 68 61 6e 67 65 64 2e 29 0a 2a 2a 0a 2a 2a 20  changed.).**.** 
10e50 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
10e60 70 61 72 74 20 6f 66 20 74 68 65 20 66 6c 61 74  part of the flat
10e70 74 65 6e 69 6e 67 20 70 72 6f 63 65 64 75 72 65  tening procedure
10e80 2e 20 20 41 20 73 75 62 71 75 65 72 79 0a 2a 2a  .  A subquery.**
10e90 20 77 68 6f 73 65 20 72 65 73 75 6c 74 20 73 65   whose result se
10ea0 74 20 69 73 20 64 65 66 69 6e 65 64 20 62 79 20  t is defined by 
10eb0 70 45 4c 69 73 74 20 61 70 70 65 61 72 73 20 61  pEList appears a
10ec0 73 20 65 6e 74 72 79 20 69 6e 20 74 68 65 0a 2a  s entry in the.*
10ed0 2a 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66  * FROM clause of
10ee0 20 61 20 53 45 4c 45 43 54 20 73 75 63 68 20 74   a SELECT such t
10ef0 68 61 74 20 74 68 65 20 56 44 42 45 20 63 75 72  hat the VDBE cur
10f00 73 6f 72 20 61 73 73 69 67 6e 65 64 20 74 6f 20  sor assigned to 
10f10 74 68 61 74 0a 2a 2a 20 46 4f 52 4d 20 63 6c 61  that.** FORM cla
10f20 75 73 65 20 65 6e 74 72 79 20 69 73 20 69 54 61  use entry is iTa
10f30 62 6c 65 2e 20 20 54 68 69 73 20 72 6f 75 74 69  ble.  This routi
10f40 6e 65 20 6d 61 6b 65 20 74 68 65 20 6e 65 63 65  ne make the nece
10f50 73 73 61 72 79 20 0a 2a 2a 20 63 68 61 6e 67 65  ssary .** change
10f60 73 20 74 6f 20 70 45 78 70 72 20 73 6f 20 74 68  s to pExpr so th
10f70 61 74 20 69 74 20 72 65 66 65 72 73 20 64 69 72  at it refers dir
10f80 65 63 74 6c 79 20 74 6f 20 74 68 65 20 73 6f 75  ectly to the sou
10f90 72 63 65 20 74 61 62 6c 65 0a 2a 2a 20 6f 66 20  rce table.** of 
10fa0 74 68 65 20 73 75 62 71 75 65 72 79 20 72 61 74  the subquery rat
10fb0 68 65 72 20 74 68 65 20 72 65 73 75 6c 74 20 73  her the result s
10fc0 65 74 20 6f 66 20 74 68 65 20 73 75 62 71 75 65  et of the subque
10fd0 72 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ry..*/.static vo
10fe0 69 64 20 73 75 62 73 74 45 78 70 72 28 0a 20 20  id substExpr(.  
10ff0 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 20 20 20  sqlite3 *db,    
11000 20 20 20 20 2f 2a 20 52 65 70 6f 72 74 20 6d 61      /* Report ma
11010 6c 6c 6f 63 20 65 72 72 6f 72 73 20 74 6f 20 74  lloc errors to t
11020 68 69 73 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a  his connection *
11030 2f 0a 20 20 45 78 70 72 20 2a 70 45 78 70 72 2c  /.  Expr *pExpr,
11040 20 20 20 20 20 20 20 20 2f 2a 20 45 78 70 72 20          /* Expr 
11050 69 6e 20 77 68 69 63 68 20 73 75 62 73 74 69 74  in which substit
11060 75 74 69 6f 6e 20 6f 63 63 75 72 73 20 2a 2f 0a  ution occurs */.
11070 20 20 69 6e 74 20 69 54 61 62 6c 65 2c 20 20 20    int iTable,   
11080 20 20 20 20 20 20 2f 2a 20 54 61 62 6c 65 20 74        /* Table t
11090 6f 20 62 65 20 73 75 62 73 74 69 74 75 74 65 64  o be substituted
110a0 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a   */.  ExprList *
110b0 70 45 4c 69 73 74 20 20 20 20 2f 2a 20 53 75 62  pEList    /* Sub
110c0 73 74 69 74 75 74 65 20 65 78 70 72 65 73 73 69  stitute expressi
110d0 6f 6e 73 20 2a 2f 0a 29 7b 0a 20 20 69 66 28 20  ons */.){.  if( 
110e0 70 45 78 70 72 3d 3d 30 20 29 20 72 65 74 75 72  pExpr==0 ) retur
110f0 6e 3b 0a 20 20 69 66 28 20 70 45 78 70 72 2d 3e  n;.  if( pExpr->
11100 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 26 26  op==TK_COLUMN &&
11110 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 3d 3d   pExpr->iTable==
11120 69 54 61 62 6c 65 20 29 7b 0a 20 20 20 20 69 66  iTable ){.    if
11130 28 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e  ( pExpr->iColumn
11140 3c 30 20 29 7b 0a 20 20 20 20 20 20 70 45 78 70  <0 ){.      pExp
11150 72 2d 3e 6f 70 20 3d 20 54 4b 5f 4e 55 4c 4c 3b  r->op = TK_NULL;
11160 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
11170 20 20 45 78 70 72 20 2a 70 4e 65 77 3b 0a 20 20    Expr *pNew;.  
11180 20 20 20 20 61 73 73 65 72 74 28 20 70 45 4c 69      assert( pELi
11190 73 74 21 3d 30 20 26 26 20 70 45 78 70 72 2d 3e  st!=0 && pExpr->
111a0 69 43 6f 6c 75 6d 6e 3c 70 45 4c 69 73 74 2d 3e  iColumn<pEList->
111b0 6e 45 78 70 72 20 29 3b 0a 20 20 20 20 20 20 61  nExpr );.      a
111c0 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 70 4c  ssert( pExpr->pL
111d0 65 66 74 3d 3d 30 20 26 26 20 70 45 78 70 72 2d  eft==0 && pExpr-
111e0 3e 70 52 69 67 68 74 3d 3d 30 20 26 26 20 70 45  >pRight==0 && pE
111f0 78 70 72 2d 3e 70 4c 69 73 74 3d 3d 30 20 29 3b  xpr->pList==0 );
11200 0a 20 20 20 20 20 20 70 4e 65 77 20 3d 20 70 45  .      pNew = pE
11210 4c 69 73 74 2d 3e 61 5b 70 45 78 70 72 2d 3e 69  List->a[pExpr->i
11220 43 6f 6c 75 6d 6e 5d 2e 70 45 78 70 72 3b 0a 20  Column].pExpr;. 
11230 20 20 20 20 20 61 73 73 65 72 74 28 20 70 4e 65       assert( pNe
11240 77 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 70 45  w!=0 );.      pE
11250 78 70 72 2d 3e 6f 70 20 3d 20 70 4e 65 77 2d 3e  xpr->op = pNew->
11260 6f 70 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  op;.      assert
11270 28 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 3d 3d  ( pExpr->pLeft==
11280 30 20 29 3b 0a 20 20 20 20 20 20 70 45 78 70 72  0 );.      pExpr
11290 2d 3e 70 4c 65 66 74 20 3d 20 73 71 6c 69 74 65  ->pLeft = sqlite
112a0 33 45 78 70 72 44 75 70 28 64 62 2c 20 70 4e 65  3ExprDup(db, pNe
112b0 77 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 20 20 20  w->pLeft);.     
112c0 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e   assert( pExpr->
112d0 70 52 69 67 68 74 3d 3d 30 20 29 3b 0a 20 20 20  pRight==0 );.   
112e0 20 20 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74     pExpr->pRight
112f0 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44 75   = sqlite3ExprDu
11300 70 28 64 62 2c 20 70 4e 65 77 2d 3e 70 52 69 67  p(db, pNew->pRig
11310 68 74 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  ht);.      asser
11320 74 28 20 70 45 78 70 72 2d 3e 70 4c 69 73 74 3d  t( pExpr->pList=
11330 3d 30 20 29 3b 0a 20 20 20 20 20 20 70 45 78 70  =0 );.      pExp
11340 72 2d 3e 70 4c 69 73 74 20 3d 20 73 71 6c 69 74  r->pList = sqlit
11350 65 33 45 78 70 72 4c 69 73 74 44 75 70 28 64 62  e3ExprListDup(db
11360 2c 20 70 4e 65 77 2d 3e 70 4c 69 73 74 29 3b 0a  , pNew->pList);.
11370 20 20 20 20 20 20 70 45 78 70 72 2d 3e 69 54 61        pExpr->iTa
11380 62 6c 65 20 3d 20 70 4e 65 77 2d 3e 69 54 61 62  ble = pNew->iTab
11390 6c 65 3b 0a 20 20 20 20 20 20 70 45 78 70 72 2d  le;.      pExpr-
113a0 3e 70 54 61 62 20 3d 20 70 4e 65 77 2d 3e 70 54  >pTab = pNew->pT
113b0 61 62 3b 0a 20 20 20 20 20 20 70 45 78 70 72 2d  ab;.      pExpr-
113c0 3e 69 43 6f 6c 75 6d 6e 20 3d 20 70 4e 65 77 2d  >iColumn = pNew-
113d0 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20 20  >iColumn;.      
113e0 70 45 78 70 72 2d 3e 69 41 67 67 20 3d 20 70 4e  pExpr->iAgg = pN
113f0 65 77 2d 3e 69 41 67 67 3b 0a 20 20 20 20 20 20  ew->iAgg;.      
11400 73 71 6c 69 74 65 33 54 6f 6b 65 6e 43 6f 70 79  sqlite3TokenCopy
11410 28 64 62 2c 20 26 70 45 78 70 72 2d 3e 74 6f 6b  (db, &pExpr->tok
11420 65 6e 2c 20 26 70 4e 65 77 2d 3e 74 6f 6b 65 6e  en, &pNew->token
11430 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
11440 54 6f 6b 65 6e 43 6f 70 79 28 64 62 2c 20 26 70  TokenCopy(db, &p
11450 45 78 70 72 2d 3e 73 70 61 6e 2c 20 26 70 4e 65  Expr->span, &pNe
11460 77 2d 3e 73 70 61 6e 29 3b 0a 20 20 20 20 20 20  w->span);.      
11470 70 45 78 70 72 2d 3e 70 53 65 6c 65 63 74 20 3d  pExpr->pSelect =
11480 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 75   sqlite3SelectDu
11490 70 28 64 62 2c 20 70 4e 65 77 2d 3e 70 53 65 6c  p(db, pNew->pSel
114a0 65 63 74 29 3b 0a 20 20 20 20 20 20 70 45 78 70  ect);.      pExp
114b0 72 2d 3e 66 6c 61 67 73 20 3d 20 70 4e 65 77 2d  r->flags = pNew-
114c0 3e 66 6c 61 67 73 3b 0a 20 20 20 20 7d 0a 20 20  >flags;.    }.  
114d0 7d 65 6c 73 65 7b 0a 20 20 20 20 73 75 62 73 74  }else{.    subst
114e0 45 78 70 72 28 64 62 2c 20 70 45 78 70 72 2d 3e  Expr(db, pExpr->
114f0 70 4c 65 66 74 2c 20 69 54 61 62 6c 65 2c 20 70  pLeft, iTable, p
11500 45 4c 69 73 74 29 3b 0a 20 20 20 20 73 75 62 73  EList);.    subs
11510 74 45 78 70 72 28 64 62 2c 20 70 45 78 70 72 2d  tExpr(db, pExpr-
11520 3e 70 52 69 67 68 74 2c 20 69 54 61 62 6c 65 2c  >pRight, iTable,
11530 20 70 45 4c 69 73 74 29 3b 0a 20 20 20 20 73 75   pEList);.    su
11540 62 73 74 53 65 6c 65 63 74 28 64 62 2c 20 70 45  bstSelect(db, pE
11550 78 70 72 2d 3e 70 53 65 6c 65 63 74 2c 20 69 54  xpr->pSelect, iT
11560 61 62 6c 65 2c 20 70 45 4c 69 73 74 29 3b 0a 20  able, pEList);. 
11570 20 20 20 73 75 62 73 74 45 78 70 72 4c 69 73 74     substExprList
11580 28 64 62 2c 20 70 45 78 70 72 2d 3e 70 4c 69 73  (db, pExpr->pLis
11590 74 2c 20 69 54 61 62 6c 65 2c 20 70 45 4c 69 73  t, iTable, pELis
115a0 74 29 3b 0a 20 20 7d 0a 7d 0a 73 74 61 74 69 63  t);.  }.}.static
115b0 20 76 6f 69 64 20 73 75 62 73 74 45 78 70 72 4c   void substExprL
115c0 69 73 74 28 0a 20 20 73 71 6c 69 74 65 33 20 2a  ist(.  sqlite3 *
115d0 64 62 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 52  db,         /* R
115e0 65 70 6f 72 74 20 6d 61 6c 6c 6f 63 20 65 72 72  eport malloc err
115f0 6f 72 73 20 68 65 72 65 20 2a 2f 0a 20 20 45 78  ors here */.  Ex
11600 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20 20  prList *pList,  
11610 20 20 20 2f 2a 20 4c 69 73 74 20 74 6f 20 73 63     /* List to sc
11620 61 6e 20 61 6e 64 20 69 6e 20 77 68 69 63 68 20  an and in which 
11630 74 6f 20 6d 61 6b 65 20 73 75 62 73 74 69 74 75  to make substitu
11640 74 65 73 20 2a 2f 0a 20 20 69 6e 74 20 69 54 61  tes */.  int iTa
11650 62 6c 65 2c 20 20 20 20 20 20 20 20 20 20 2f 2a  ble,          /*
11660 20 54 61 62 6c 65 20 74 6f 20 62 65 20 73 75 62   Table to be sub
11670 73 74 69 74 75 74 65 64 20 2a 2f 0a 20 20 45 78  stituted */.  Ex
11680 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 20 20  prList *pEList  
11690 20 20 20 2f 2a 20 53 75 62 73 74 69 74 75 74 65     /* Substitute
116a0 20 76 61 6c 75 65 73 20 2a 2f 0a 29 7b 0a 20 20   values */.){.  
116b0 69 6e 74 20 69 3b 0a 20 20 69 66 28 20 70 4c 69  int i;.  if( pLi
116c0 73 74 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a  st==0 ) return;.
116d0 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4c 69    for(i=0; i<pLi
116e0 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b  st->nExpr; i++){
116f0 0a 20 20 20 20 73 75 62 73 74 45 78 70 72 28 64  .    substExpr(d
11700 62 2c 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70  b, pList->a[i].p
11710 45 78 70 72 2c 20 69 54 61 62 6c 65 2c 20 70 45  Expr, iTable, pE
11720 4c 69 73 74 29 3b 0a 20 20 7d 0a 7d 0a 73 74 61  List);.  }.}.sta
11730 74 69 63 20 76 6f 69 64 20 73 75 62 73 74 53 65  tic void substSe
11740 6c 65 63 74 28 0a 20 20 73 71 6c 69 74 65 33 20  lect(.  sqlite3 
11750 2a 64 62 2c 20 20 20 20 20 20 20 20 20 2f 2a 20  *db,         /* 
11760 52 65 70 6f 72 74 20 6d 61 6c 6c 6f 63 20 65 72  Report malloc er
11770 72 6f 72 73 20 68 65 72 65 20 2a 2f 0a 20 20 53  rors here */.  S
11780 65 6c 65 63 74 20 2a 70 2c 20 20 20 20 20 20 20  elect *p,       
11790 20 20 20 20 2f 2a 20 53 45 4c 45 43 54 20 73 74      /* SELECT st
117a0 61 74 65 6d 65 6e 74 20 69 6e 20 77 68 69 63 68  atement in which
117b0 20 74 6f 20 6d 61 6b 65 20 73 75 62 73 74 69 74   to make substit
117c0 75 74 69 6f 6e 73 20 2a 2f 0a 20 20 69 6e 74 20  utions */.  int 
117d0 69 54 61 62 6c 65 2c 20 20 20 20 20 20 20 20 20  iTable,         
117e0 20 2f 2a 20 54 61 62 6c 65 20 74 6f 20 62 65 20   /* Table to be 
117f0 72 65 70 6c 61 63 65 64 20 2a 2f 0a 20 20 45 78  replaced */.  Ex
11800 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 20 20  prList *pEList  
11810 20 20 20 2f 2a 20 53 75 62 73 74 69 74 75 74 65     /* Substitute
11820 20 76 61 6c 75 65 73 20 2a 2f 0a 29 7b 0a 20 20   values */.){.  
11830 69 66 28 20 21 70 20 29 20 72 65 74 75 72 6e 3b  if( !p ) return;
11840 0a 20 20 73 75 62 73 74 45 78 70 72 4c 69 73 74  .  substExprList
11850 28 64 62 2c 20 70 2d 3e 70 45 4c 69 73 74 2c 20  (db, p->pEList, 
11860 69 54 61 62 6c 65 2c 20 70 45 4c 69 73 74 29 3b  iTable, pEList);
11870 0a 20 20 73 75 62 73 74 45 78 70 72 4c 69 73 74  .  substExprList
11880 28 64 62 2c 20 70 2d 3e 70 47 72 6f 75 70 42 79  (db, p->pGroupBy
11890 2c 20 69 54 61 62 6c 65 2c 20 70 45 4c 69 73 74  , iTable, pEList
118a0 29 3b 0a 20 20 73 75 62 73 74 45 78 70 72 4c 69  );.  substExprLi
118b0 73 74 28 64 62 2c 20 70 2d 3e 70 4f 72 64 65 72  st(db, p->pOrder
118c0 42 79 2c 20 69 54 61 62 6c 65 2c 20 70 45 4c 69  By, iTable, pELi
118d0 73 74 29 3b 0a 20 20 73 75 62 73 74 45 78 70 72  st);.  substExpr
118e0 28 64 62 2c 20 70 2d 3e 70 48 61 76 69 6e 67 2c  (db, p->pHaving,
118f0 20 69 54 61 62 6c 65 2c 20 70 45 4c 69 73 74 29   iTable, pEList)
11900 3b 0a 20 20 73 75 62 73 74 45 78 70 72 28 64 62  ;.  substExpr(db
11910 2c 20 70 2d 3e 70 57 68 65 72 65 2c 20 69 54 61  , p->pWhere, iTa
11920 62 6c 65 2c 20 70 45 4c 69 73 74 29 3b 0a 20 20  ble, pEList);.  
11930 73 75 62 73 74 53 65 6c 65 63 74 28 64 62 2c 20  substSelect(db, 
11940 70 2d 3e 70 50 72 69 6f 72 2c 20 69 54 61 62 6c  p->pPrior, iTabl
11950 65 2c 20 70 45 4c 69 73 74 29 3b 0a 7d 0a 23 65  e, pEList);.}.#e
11960 6e 64 69 66 20 2f 2a 20 21 64 65 66 69 6e 65 64  ndif /* !defined
11970 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45  (SQLITE_OMIT_VIE
11980 57 29 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53  W) */..#ifndef S
11990 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 0a  QLITE_OMIT_VIEW.
119a0 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
119b0 6e 65 20 61 74 74 65 6d 70 74 73 20 74 6f 20 66  ne attempts to f
119c0 6c 61 74 74 65 6e 20 73 75 62 71 75 65 72 69 65  latten subquerie
119d0 73 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 73 70  s in order to sp
119e0 65 65 64 0a 2a 2a 20 65 78 65 63 75 74 69 6f 6e  eed.** execution
119f0 2e 20 20 49 74 20 72 65 74 75 72 6e 73 20 31 20  .  It returns 1 
11a00 69 66 20 69 74 20 6d 61 6b 65 73 20 63 68 61 6e  if it makes chan
11a10 67 65 73 20 61 6e 64 20 30 20 69 66 20 6e 6f 20  ges and 0 if no 
11a20 66 6c 61 74 74 65 6e 69 6e 67 0a 2a 2a 20 6f 63  flattening.** oc
11a30 63 75 72 73 2e 0a 2a 2a 0a 2a 2a 20 54 6f 20 75  curs..**.** To u
11a40 6e 64 65 72 73 74 61 6e 64 20 74 68 65 20 63 6f  nderstand the co
11a50 6e 63 65 70 74 20 6f 66 20 66 6c 61 74 74 65 6e  ncept of flatten
11a60 69 6e 67 2c 20 63 6f 6e 73 69 64 65 72 20 74 68  ing, consider th
11a70 65 20 66 6f 6c 6c 6f 77 69 6e 67 0a 2a 2a 20 71  e following.** q
11a80 75 65 72 79 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20  uery:.**.**     
11a90 53 45 4c 45 43 54 20 61 20 46 52 4f 4d 20 28 53  SELECT a FROM (S
11aa0 45 4c 45 43 54 20 78 2b 79 20 41 53 20 61 20 46  ELECT x+y AS a F
11ab0 52 4f 4d 20 74 31 20 57 48 45 52 45 20 7a 3c 31  ROM t1 WHERE z<1
11ac0 30 30 29 20 57 48 45 52 45 20 61 3e 35 0a 2a 2a  00) WHERE a>5.**
11ad0 0a 2a 2a 20 54 68 65 20 64 65 66 61 75 6c 74 20  .** The default 
11ae0 77 61 79 20 6f 66 20 69 6d 70 6c 65 6d 65 6e 74  way of implement
11af0 69 6e 67 20 74 68 69 73 20 71 75 65 72 79 20 69  ing this query i
11b00 73 20 74 6f 20 65 78 65 63 75 74 65 20 74 68 65  s to execute the
11b10 0a 2a 2a 20 73 75 62 71 75 65 72 79 20 66 69 72  .** subquery fir
11b20 73 74 20 61 6e 64 20 73 74 6f 72 65 20 74 68 65  st and store the
11b30 20 72 65 73 75 6c 74 73 20 69 6e 20 61 20 74 65   results in a te
11b40 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 2c 20 74  mporary table, t
11b50 68 65 6e 0a 2a 2a 20 72 75 6e 20 74 68 65 20 6f  hen.** run the o
11b60 75 74 65 72 20 71 75 65 72 79 20 6f 6e 20 74 68  uter query on th
11b70 61 74 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62  at temporary tab
11b80 6c 65 2e 20 20 54 68 69 73 20 72 65 71 75 69 72  le.  This requir
11b90 65 73 20 74 77 6f 0a 2a 2a 20 70 61 73 73 65 73  es two.** passes
11ba0 20 6f 76 65 72 20 74 68 65 20 64 61 74 61 2e 20   over the data. 
11bb0 20 46 75 72 74 68 65 72 6d 6f 72 65 2c 20 62 65   Furthermore, be
11bc0 63 61 75 73 65 20 74 68 65 20 74 65 6d 70 6f 72  cause the tempor
11bd0 61 72 79 20 74 61 62 6c 65 0a 2a 2a 20 68 61 73  ary table.** has
11be0 20 6e 6f 20 69 6e 64 69 63 65 73 2c 20 74 68 65   no indices, the
11bf0 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 6f 6e   WHERE clause on
11c00 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79   the outer query
11c10 20 63 61 6e 6e 6f 74 20 62 65 0a 2a 2a 20 6f 70   cannot be.** op
11c20 74 69 6d 69 7a 65 64 2e 0a 2a 2a 0a 2a 2a 20 54  timized..**.** T
11c30 68 69 73 20 72 6f 75 74 69 6e 65 20 61 74 74 65  his routine atte
11c40 6d 70 74 73 20 74 6f 20 72 65 77 72 69 74 65 20  mpts to rewrite 
11c50 71 75 65 72 69 65 73 20 73 75 63 68 20 61 73 20  queries such as 
11c60 74 68 65 20 61 62 6f 76 65 20 69 6e 74 6f 0a 2a  the above into.*
11c70 2a 20 61 20 73 69 6e 67 6c 65 20 66 6c 61 74 20  * a single flat 
11c80 73 65 6c 65 63 74 2c 20 6c 69 6b 65 20 74 68 69  select, like thi
11c90 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 45 4c  s:.**.**     SEL
11ca0 45 43 54 20 78 2b 79 20 41 53 20 61 20 46 52 4f  ECT x+y AS a FRO
11cb0 4d 20 74 31 20 57 48 45 52 45 20 7a 3c 31 30 30  M t1 WHERE z<100
11cc0 20 41 4e 44 20 61 3e 35 0a 2a 2a 0a 2a 2a 20 54   AND a>5.**.** T
11cd0 68 65 20 63 6f 64 65 20 67 65 6e 65 72 61 74 65  he code generate
11ce0 64 20 66 6f 72 20 74 68 69 73 20 73 69 6d 70 69  d for this simpi
11cf0 66 69 63 61 74 69 6f 6e 20 67 69 76 65 73 20 74  fication gives t
11d00 68 65 20 73 61 6d 65 20 72 65 73 75 6c 74 0a 2a  he same result.*
11d10 2a 20 62 75 74 20 6f 6e 6c 79 20 68 61 73 20 74  * but only has t
11d20 6f 20 73 63 61 6e 20 74 68 65 20 64 61 74 61 20  o scan the data 
11d30 6f 6e 63 65 2e 20 20 41 6e 64 20 62 65 63 61 75  once.  And becau
11d40 73 65 20 69 6e 64 69 63 65 73 20 6d 69 67 68 74  se indices might
11d50 20 0a 2a 2a 20 65 78 69 73 74 20 6f 6e 20 74 68   .** exist on th
11d60 65 20 74 61 62 6c 65 20 74 31 2c 20 61 20 63 6f  e table t1, a co
11d70 6d 70 6c 65 74 65 20 73 63 61 6e 20 6f 66 20 74  mplete scan of t
11d80 68 65 20 64 61 74 61 20 6d 69 67 68 74 20 62 65  he data might be
11d90 0a 2a 2a 20 61 76 6f 69 64 65 64 2e 0a 2a 2a 0a  .** avoided..**.
11da0 2a 2a 20 46 6c 61 74 74 65 6e 69 6e 67 20 69 73  ** Flattening is
11db0 20 6f 6e 6c 79 20 61 74 74 65 6d 70 74 65 64 20   only attempted 
11dc0 69 66 20 61 6c 6c 20 6f 66 20 74 68 65 20 66 6f  if all of the fo
11dd0 6c 6c 6f 77 69 6e 67 20 61 72 65 20 74 72 75 65  llowing are true
11de0 3a 0a 2a 2a 0a 2a 2a 20 20 20 28 31 29 20 20 54  :.**.**   (1)  T
11df0 68 65 20 73 75 62 71 75 65 72 79 20 61 6e 64 20  he subquery and 
11e00 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20  the outer query 
11e10 64 6f 20 6e 6f 74 20 62 6f 74 68 20 75 73 65 20  do not both use 
11e20 61 67 67 72 65 67 61 74 65 73 2e 0a 2a 2a 0a 2a  aggregates..**.*
11e30 2a 20 20 20 28 32 29 20 20 54 68 65 20 73 75 62  *   (2)  The sub
11e40 71 75 65 72 79 20 69 73 20 6e 6f 74 20 61 6e 20  query is not an 
11e50 61 67 67 72 65 67 61 74 65 20 6f 72 20 74 68 65  aggregate or the
11e60 20 6f 75 74 65 72 20 71 75 65 72 79 20 69 73 20   outer query is 
11e70 6e 6f 74 20 61 20 6a 6f 69 6e 2e 0a 2a 2a 0a 2a  not a join..**.*
11e80 2a 20 20 20 28 33 29 20 20 54 68 65 20 73 75 62  *   (3)  The sub
11e90 71 75 65 72 79 20 69 73 20 6e 6f 74 20 74 68 65  query is not the
11ea0 20 72 69 67 68 74 20 6f 70 65 72 61 6e 64 20 6f   right operand o
11eb0 66 20 61 20 6c 65 66 74 20 6f 75 74 65 72 20 6a  f a left outer j
11ec0 6f 69 6e 2c 20 6f 72 0a 2a 2a 20 20 20 20 20 20  oin, or.**      
11ed0 20 20 74 68 65 20 73 75 62 71 75 65 72 79 20 69    the subquery i
11ee0 73 20 6e 6f 74 20 69 74 73 65 6c 66 20 61 20 6a  s not itself a j
11ef0 6f 69 6e 2e 20 20 28 54 69 63 6b 65 74 20 23 33  oin.  (Ticket #3
11f00 30 36 29 0a 2a 2a 0a 2a 2a 20 20 20 28 34 29 20  06).**.**   (4) 
11f10 20 54 68 65 20 73 75 62 71 75 65 72 79 20 69 73   The subquery is
11f20 20 6e 6f 74 20 44 49 53 54 49 4e 43 54 20 6f 72   not DISTINCT or
11f30 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79   the outer query
11f40 20 69 73 20 6e 6f 74 20 61 20 6a 6f 69 6e 2e 0a   is not a join..
11f50 2a 2a 0a 2a 2a 20 20 20 28 35 29 20 20 54 68 65  **.**   (5)  The
11f60 20 73 75 62 71 75 65 72 79 20 69 73 20 6e 6f 74   subquery is not
11f70 20 44 49 53 54 49 4e 43 54 20 6f 72 20 74 68 65   DISTINCT or the
11f80 20 6f 75 74 65 72 20 71 75 65 72 79 20 64 6f 65   outer query doe
11f90 73 20 6e 6f 74 20 75 73 65 0a 2a 2a 20 20 20 20  s not use.**    
11fa0 20 20 20 20 61 67 67 72 65 67 61 74 65 73 2e 0a      aggregates..
11fb0 2a 2a 0a 2a 2a 20 20 20 28 36 29 20 20 54 68 65  **.**   (6)  The
11fc0 20 73 75 62 71 75 65 72 79 20 64 6f 65 73 20 6e   subquery does n
11fd0 6f 74 20 75 73 65 20 61 67 67 72 65 67 61 74 65  ot use aggregate
11fe0 73 20 6f 72 20 74 68 65 20 6f 75 74 65 72 20 71  s or the outer q
11ff0 75 65 72 79 20 69 73 20 6e 6f 74 0a 2a 2a 20 20  uery is not.**  
12000 20 20 20 20 20 20 44 49 53 54 49 4e 43 54 2e 0a        DISTINCT..
12010 2a 2a 0a 2a 2a 20 20 20 28 37 29 20 20 54 68 65  **.**   (7)  The
12020 20 73 75 62 71 75 65 72 79 20 68 61 73 20 61 20   subquery has a 
12030 46 52 4f 4d 20 63 6c 61 75 73 65 2e 0a 2a 2a 0a  FROM clause..**.
12040 2a 2a 20 20 20 28 38 29 20 20 54 68 65 20 73 75  **   (8)  The su
12050 62 71 75 65 72 79 20 64 6f 65 73 20 6e 6f 74 20  bquery does not 
12060 75 73 65 20 4c 49 4d 49 54 20 6f 72 20 74 68 65  use LIMIT or the
12070 20 6f 75 74 65 72 20 71 75 65 72 79 20 69 73 20   outer query is 
12080 6e 6f 74 20 61 20 6a 6f 69 6e 2e 0a 2a 2a 0a 2a  not a join..**.*
12090 2a 20 20 20 28 39 29 20 20 54 68 65 20 73 75 62  *   (9)  The sub
120a0 71 75 65 72 79 20 64 6f 65 73 20 6e 6f 74 20 75  query does not u
120b0 73 65 20 4c 49 4d 49 54 20 6f 72 20 74 68 65 20  se LIMIT or the 
120c0 6f 75 74 65 72 20 71 75 65 72 79 20 64 6f 65 73  outer query does
120d0 20 6e 6f 74 20 75 73 65 0a 2a 2a 20 20 20 20 20   not use.**     
120e0 20 20 20 61 67 67 72 65 67 61 74 65 73 2e 0a 2a     aggregates..*
120f0 2a 0a 2a 2a 20 20 28 31 30 29 20 20 54 68 65 20  *.**  (10)  The 
12100 73 75 62 71 75 65 72 79 20 64 6f 65 73 20 6e 6f  subquery does no
12110 74 20 75 73 65 20 61 67 67 72 65 67 61 74 65 73  t use aggregates
12120 20 6f 72 20 74 68 65 20 6f 75 74 65 72 20 71 75   or the outer qu
12130 65 72 79 20 64 6f 65 73 20 6e 6f 74 0a 2a 2a 20  ery does not.** 
12140 20 20 20 20 20 20 20 75 73 65 20 4c 49 4d 49 54         use LIMIT
12150 2e 0a 2a 2a 0a 2a 2a 20 20 28 31 31 29 20 20 54  ..**.**  (11)  T
12160 68 65 20 73 75 62 71 75 65 72 79 20 61 6e 64 20  he subquery and 
12170 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20  the outer query 
12180 64 6f 20 6e 6f 74 20 62 6f 74 68 20 68 61 76 65  do not both have
12190 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65   ORDER BY clause
121a0 73 2e 0a 2a 2a 0a 2a 2a 20 20 28 31 32 29 20 20  s..**.**  (12)  
121b0 54 68 65 20 73 75 62 71 75 65 72 79 20 69 73 20  The subquery is 
121c0 6e 6f 74 20 74 68 65 20 72 69 67 68 74 20 74 65  not the right te
121d0 72 6d 20 6f 66 20 61 20 4c 45 46 54 20 4f 55 54  rm of a LEFT OUT
121e0 45 52 20 4a 4f 49 4e 20 6f 72 20 74 68 65 0a 2a  ER JOIN or the.*
121f0 2a 20 20 20 20 20 20 20 20 73 75 62 71 75 65 72  *        subquer
12200 79 20 68 61 73 20 6e 6f 20 57 48 45 52 45 20 63  y has no WHERE c
12210 6c 61 75 73 65 2e 20 20 28 61 64 64 65 64 20 62  lause.  (added b
12220 79 20 74 69 63 6b 65 74 20 23 33 35 30 29 0a 2a  y ticket #350).*
12230 2a 0a 2a 2a 20 20 28 31 33 29 20 20 54 68 65 20  *.**  (13)  The 
12240 73 75 62 71 75 65 72 79 20 61 6e 64 20 6f 75 74  subquery and out
12250 65 72 20 71 75 65 72 79 20 64 6f 20 6e 6f 74 20  er query do not 
12260 62 6f 74 68 20 75 73 65 20 4c 49 4d 49 54 0a 2a  both use LIMIT.*
12270 2a 0a 2a 2a 20 20 28 31 34 29 20 20 54 68 65 20  *.**  (14)  The 
12280 73 75 62 71 75 65 72 79 20 64 6f 65 73 20 6e 6f  subquery does no
12290 74 20 75 73 65 20 4f 46 46 53 45 54 0a 2a 2a 0a  t use OFFSET.**.
122a0 2a 2a 20 20 28 31 35 29 20 20 54 68 65 20 6f 75  **  (15)  The ou
122b0 74 65 72 20 71 75 65 72 79 20 69 73 20 6e 6f 74  ter query is not
122c0 20 70 61 72 74 20 6f 66 20 61 20 63 6f 6d 70 6f   part of a compo
122d0 75 6e 64 20 73 65 6c 65 63 74 20 6f 72 20 74 68  und select or th
122e0 65 0a 2a 2a 20 20 20 20 20 20 20 20 73 75 62 71  e.**        subq
122f0 75 65 72 79 20 64 6f 65 73 20 6e 6f 74 20 68 61  uery does not ha
12300 76 65 20 62 6f 74 68 20 61 6e 20 4f 52 44 45 52  ve both an ORDER
12310 20 42 59 20 61 6e 64 20 61 20 4c 49 4d 49 54 20   BY and a LIMIT 
12320 63 6c 61 75 73 65 2e 0a 2a 2a 20 20 20 20 20 20  clause..**      
12330 20 20 28 53 65 65 20 74 69 63 6b 65 74 20 23 32    (See ticket #2
12340 33 33 39 29 0a 2a 2a 0a 2a 2a 20 49 6e 20 74 68  339).**.** In th
12350 69 73 20 72 6f 75 74 69 6e 65 2c 20 74 68 65 20  is routine, the 
12360 22 70 22 20 70 61 72 61 6d 65 74 65 72 20 69 73  "p" parameter is
12370 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68   a pointer to th
12380 65 20 6f 75 74 65 72 20 71 75 65 72 79 2e 0a 2a  e outer query..*
12390 2a 20 54 68 65 20 73 75 62 71 75 65 72 79 20 69  * The subquery i
123a0 73 20 70 2d 3e 70 53 72 63 2d 3e 61 5b 69 46 72  s p->pSrc->a[iFr
123b0 6f 6d 5d 2e 20 20 69 73 41 67 67 20 69 73 20 74  om].  isAgg is t
123c0 72 75 65 20 69 66 20 74 68 65 20 6f 75 74 65 72  rue if the outer
123d0 20 71 75 65 72 79 0a 2a 2a 20 75 73 65 73 20 61   query.** uses a
123e0 67 67 72 65 67 61 74 65 73 20 61 6e 64 20 73 75  ggregates and su
123f0 62 71 75 65 72 79 49 73 41 67 67 20 69 73 20 74  bqueryIsAgg is t
12400 72 75 65 20 69 66 20 74 68 65 20 73 75 62 71 75  rue if the subqu
12410 65 72 79 20 75 73 65 73 20 61 67 67 72 65 67 61  ery uses aggrega
12420 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 66 6c  tes..**.** If fl
12430 61 74 74 65 6e 69 6e 67 20 69 73 20 6e 6f 74 20  attening is not 
12440 61 74 74 65 6d 70 74 65 64 2c 20 74 68 69 73 20  attempted, this 
12450 72 6f 75 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d  routine is a no-
12460 6f 70 20 61 6e 64 20 72 65 74 75 72 6e 73 20 30  op and returns 0
12470 2e 0a 2a 2a 20 49 66 20 66 6c 61 74 74 65 6e 69  ..** If flatteni
12480 6e 67 20 69 73 20 61 74 74 65 6d 70 74 65 64 20  ng is attempted 
12490 74 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74  this routine ret
124a0 75 72 6e 73 20 31 2e 0a 2a 2a 0a 2a 2a 20 41 6c  urns 1..**.** Al
124b0 6c 20 6f 66 20 74 68 65 20 65 78 70 72 65 73 73  l of the express
124c0 69 6f 6e 20 61 6e 61 6c 79 73 69 73 20 6d 75 73  ion analysis mus
124d0 74 20 6f 63 63 75 72 20 6f 6e 20 62 6f 74 68 20  t occur on both 
124e0 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20  the outer query 
124f0 61 6e 64 0a 2a 2a 20 74 68 65 20 73 75 62 71 75  and.** the subqu
12500 65 72 79 20 62 65 66 6f 72 65 20 74 68 69 73 20  ery before this 
12510 72 6f 75 74 69 6e 65 20 72 75 6e 73 2e 0a 2a 2f  routine runs..*/
12520 0a 73 74 61 74 69 63 20 69 6e 74 20 66 6c 61 74  .static int flat
12530 74 65 6e 53 75 62 71 75 65 72 79 28 0a 20 20 73  tenSubquery(.  s
12540 71 6c 69 74 65 33 20 2a 64 62 2c 20 20 20 20 20  qlite3 *db,     
12550 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20      /* Database 
12560 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20  connection */.  
12570 53 65 6c 65 63 74 20 2a 70 2c 20 20 20 20 20 20  Select *p,      
12580 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61 72 65       /* The pare
12590 6e 74 20 6f 72 20 6f 75 74 65 72 20 53 45 4c 45  nt or outer SELE
125a0 43 54 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a  CT statement */.
125b0 20 20 69 6e 74 20 69 46 72 6f 6d 2c 20 20 20 20    int iFrom,    
125c0 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20         /* Index 
125d0 69 6e 20 70 2d 3e 70 53 72 63 2d 3e 61 5b 5d 20  in p->pSrc->a[] 
125e0 6f 66 20 74 68 65 20 69 6e 6e 65 72 20 73 75 62  of the inner sub
125f0 71 75 65 72 79 20 2a 2f 0a 20 20 69 6e 74 20 69  query */.  int i
12600 73 41 67 67 2c 20 20 20 20 20 20 20 20 20 20 20  sAgg,           
12610 2f 2a 20 54 72 75 65 20 69 66 20 6f 75 74 65 72  /* True if outer
12620 20 53 45 4c 45 43 54 20 75 73 65 73 20 61 67 67   SELECT uses agg
12630 72 65 67 61 74 65 20 66 75 6e 63 74 69 6f 6e 73  regate functions
12640 20 2a 2f 0a 20 20 69 6e 74 20 73 75 62 71 75 65   */.  int subque
12650 72 79 49 73 41 67 67 20 20 20 20 2f 2a 20 54 72  ryIsAgg    /* Tr
12660 75 65 20 69 66 20 74 68 65 20 73 75 62 71 75 65  ue if the subque
12670 72 79 20 75 73 65 73 20 61 67 67 72 65 67 61 74  ry uses aggregat
12680 65 20 66 75 6e 63 74 69 6f 6e 73 20 2a 2f 0a 29  e functions */.)
12690 7b 0a 20 20 53 65 6c 65 63 74 20 2a 70 53 75 62  {.  Select *pSub
126a0 3b 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 69  ;       /* The i
126b0 6e 6e 65 72 20 71 75 65 72 79 20 6f 72 20 22 73  nner query or "s
126c0 75 62 71 75 65 72 79 22 20 2a 2f 0a 20 20 53 72  ubquery" */.  Sr
126d0 63 4c 69 73 74 20 2a 70 53 72 63 3b 20 20 20 20  cList *pSrc;    
126e0 20 20 2f 2a 20 54 68 65 20 46 52 4f 4d 20 63 6c    /* The FROM cl
126f0 61 75 73 65 20 6f 66 20 74 68 65 20 6f 75 74 65  ause of the oute
12700 72 20 71 75 65 72 79 20 2a 2f 0a 20 20 53 72 63  r query */.  Src
12710 4c 69 73 74 20 2a 70 53 75 62 53 72 63 3b 20 20  List *pSubSrc;  
12720 20 2f 2a 20 54 68 65 20 46 52 4f 4d 20 63 6c 61   /* The FROM cla
12730 75 73 65 20 6f 66 20 74 68 65 20 73 75 62 71 75  use of the subqu
12740 65 72 79 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73  ery */.  ExprLis
12750 74 20 2a 70 4c 69 73 74 3b 20 20 20 20 2f 2a 20  t *pList;    /* 
12760 54 68 65 20 72 65 73 75 6c 74 20 73 65 74 20 6f  The result set o
12770 66 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72  f the outer quer
12780 79 20 2a 2f 0a 20 20 69 6e 74 20 69 50 61 72 65  y */.  int iPare
12790 6e 74 3b 20 20 20 20 20 20 20 20 2f 2a 20 56 44  nt;        /* VD
127a0 42 45 20 63 75 72 73 6f 72 20 6e 75 6d 62 65 72  BE cursor number
127b0 20 6f 66 20 74 68 65 20 70 53 75 62 20 72 65 73   of the pSub res
127c0 75 6c 74 20 73 65 74 20 74 65 6d 70 20 74 61 62  ult set temp tab
127d0 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 69 3b 20 20  le */.  int i;  
127e0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
127f0 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20  oop counter */. 
12800 20 45 78 70 72 20 2a 70 57 68 65 72 65 3b 20 20   Expr *pWhere;  
12810 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12820 20 20 2f 2a 20 54 68 65 20 57 48 45 52 45 20 63    /* The WHERE c
12830 6c 61 75 73 65 20 2a 2f 0a 20 20 73 74 72 75 63  lause */.  struc
12840 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a  t SrcList_item *
12850 70 53 75 62 69 74 65 6d 3b 20 20 20 2f 2a 20 54  pSubitem;   /* T
12860 68 65 20 73 75 62 71 75 65 72 79 20 2a 2f 0a 0a  he subquery */..
12870 20 20 2f 2a 20 43 68 65 63 6b 20 74 6f 20 73 65    /* Check to se
12880 65 20 69 66 20 66 6c 61 74 74 65 6e 69 6e 67 20  e if flattening 
12890 69 73 20 70 65 72 6d 69 74 74 65 64 2e 20 20 52  is permitted.  R
128a0 65 74 75 72 6e 20 30 20 69 66 20 6e 6f 74 2e 0a  eturn 0 if not..
128b0 20 20 2a 2f 0a 20 20 69 66 28 20 70 3d 3d 30 20    */.  if( p==0 
128c0 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 70 53  ) return 0;.  pS
128d0 72 63 20 3d 20 70 2d 3e 70 53 72 63 3b 0a 20 20  rc = p->pSrc;.  
128e0 61 73 73 65 72 74 28 20 70 53 72 63 20 26 26 20  assert( pSrc && 
128f0 69 46 72 6f 6d 3e 3d 30 20 26 26 20 69 46 72 6f  iFrom>=0 && iFro
12900 6d 3c 70 53 72 63 2d 3e 6e 53 72 63 20 29 3b 0a  m<pSrc->nSrc );.
12910 20 20 70 53 75 62 69 74 65 6d 20 3d 20 26 70 53    pSubitem = &pS
12920 72 63 2d 3e 61 5b 69 46 72 6f 6d 5d 3b 0a 20 20  rc->a[iFrom];.  
12930 70 53 75 62 20 3d 20 70 53 75 62 69 74 65 6d 2d  pSub = pSubitem-
12940 3e 70 53 65 6c 65 63 74 3b 0a 20 20 61 73 73 65  >pSelect;.  asse
12950 72 74 28 20 70 53 75 62 21 3d 30 20 29 3b 0a 20  rt( pSub!=0 );. 
12960 20 69 66 28 20 69 73 41 67 67 20 26 26 20 73 75   if( isAgg && su
12970 62 71 75 65 72 79 49 73 41 67 67 20 29 20 72 65  bqueryIsAgg ) re
12980 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20 20 20  turn 0;         
12990 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73 74 72          /* Restr
129a0 69 63 74 69 6f 6e 20 28 31 29 20 20 2a 2f 0a 20  iction (1)  */. 
129b0 20 69 66 28 20 73 75 62 71 75 65 72 79 49 73 41   if( subqueryIsA
129c0 67 67 20 26 26 20 70 53 72 63 2d 3e 6e 53 72 63  gg && pSrc->nSrc
129d0 3e 31 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20  >1 ) return 0;  
129e0 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73 74 72          /* Restr
129f0 69 63 74 69 6f 6e 20 28 32 29 20 20 2a 2f 0a 20  iction (2)  */. 
12a00 20 70 53 75 62 53 72 63 20 3d 20 70 53 75 62 2d   pSubSrc = pSub-
12a10 3e 70 53 72 63 3b 0a 20 20 61 73 73 65 72 74 28  >pSrc;.  assert(
12a20 20 70 53 75 62 53 72 63 20 29 3b 0a 20 20 2f 2a   pSubSrc );.  /*
12a30 20 50 72 69 6f 72 20 74 6f 20 76 65 72 73 69 6f   Prior to versio
12a40 6e 20 33 2e 31 2e 32 2c 20 77 68 65 6e 20 4c 49  n 3.1.2, when LI
12a50 4d 49 54 20 61 6e 64 20 4f 46 46 53 45 54 20 68  MIT and OFFSET h
12a60 61 64 20 74 6f 20 62 65 20 73 69 6d 70 6c 65 20  ad to be simple 
12a70 63 6f 6e 73 74 61 6e 74 73 2c 0a 20 20 2a 2a 20  constants,.  ** 
12a80 6e 6f 74 20 61 72 62 69 74 72 61 72 79 20 65 78  not arbitrary ex
12a90 70 72 65 73 73 73 69 6f 6e 73 2c 20 77 65 20 61  presssions, we a
12aa0 6c 6c 6f 77 65 64 20 73 6f 6d 65 20 63 6f 6d 62  llowed some comb
12ab0 69 6e 69 6e 67 20 6f 66 20 4c 49 4d 49 54 20 61  ining of LIMIT a
12ac0 6e 64 20 4f 46 46 53 45 54 0a 20 20 2a 2a 20 62  nd OFFSET.  ** b
12ad0 65 63 61 75 73 65 20 74 68 65 79 20 63 6f 75 6c  ecause they coul
12ae0 64 20 62 65 20 63 6f 6d 70 75 74 65 64 20 61 74  d be computed at
12af0 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 2e 20 20   compile-time.  
12b00 42 75 74 20 77 68 65 6e 20 4c 49 4d 49 54 20 61  But when LIMIT a
12b10 6e 64 20 4f 46 46 53 45 54 0a 20 20 2a 2a 20 62  nd OFFSET.  ** b
12b20 65 63 61 6d 65 20 61 72 62 69 74 72 61 72 79 20  ecame arbitrary 
12b30 65 78 70 72 65 73 73 69 6f 6e 73 2c 20 77 65 20  expressions, we 
12b40 77 65 72 65 20 66 6f 72 63 65 64 20 74 6f 20 61  were forced to a
12b50 64 64 20 72 65 73 74 72 69 63 74 69 6f 6e 73 20  dd restrictions 
12b60 28 31 33 29 0a 20 20 2a 2a 20 61 6e 64 20 28 31  (13).  ** and (1
12b70 34 29 2e 20 2a 2f 0a 20 20 69 66 28 20 70 53 75  4). */.  if( pSu
12b80 62 2d 3e 70 4c 69 6d 69 74 20 26 26 20 70 2d 3e  b->pLimit && p->
12b90 70 4c 69 6d 69 74 20 29 20 72 65 74 75 72 6e 20  pLimit ) return 
12ba0 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
12bb0 2f 2a 20 52 65 73 74 72 69 63 74 69 6f 6e 20 28  /* Restriction (
12bc0 31 33 29 20 2a 2f 0a 20 20 69 66 28 20 70 53 75  13) */.  if( pSu
12bd0 62 2d 3e 70 4f 66 66 73 65 74 20 29 20 72 65 74  b->pOffset ) ret
12be0 75 72 6e 20 30 3b 20 20 20 20 20 20 20 20 20 20  urn 0;          
12bf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12c00 2f 2a 20 52 65 73 74 72 69 63 74 69 6f 6e 20 28  /* Restriction (
12c10 31 34 29 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e  14) */.  if( p->
12c20 70 52 69 67 68 74 6d 6f 73 74 20 26 26 20 70 53  pRightmost && pS
12c30 75 62 2d 3e 70 4c 69 6d 69 74 20 26 26 20 70 53  ub->pLimit && pS
12c40 75 62 2d 3e 70 4f 72 64 65 72 42 79 20 29 7b 0a  ub->pOrderBy ){.
12c50 20 20 20 20 72 65 74 75 72 6e 20 30 3b 20 20 20      return 0;   
12c60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12c70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12c80 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73 74           /* Rest
12c90 72 69 63 74 69 6f 6e 20 28 31 35 29 20 2a 2f 0a  riction (15) */.
12ca0 20 20 7d 0a 20 20 69 66 28 20 70 53 75 62 53 72    }.  if( pSubSr
12cb0 63 2d 3e 6e 53 72 63 3d 3d 30 20 29 20 72 65 74  c->nSrc==0 ) ret
12cc0 75 72 6e 20 30 3b 20 20 20 20 20 20 20 20 20 20  urn 0;          
12cd0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
12ce0 52 65 73 74 72 69 63 74 69 6f 6e 20 28 37 29 20  Restriction (7) 
12cf0 20 2a 2f 0a 20 20 69 66 28 20 28 70 53 75 62 2d   */.  if( (pSub-
12d00 3e 69 73 44 69 73 74 69 6e 63 74 20 7c 7c 20 70  >isDistinct || p
12d10 53 75 62 2d 3e 70 4c 69 6d 69 74 29 20 0a 20 20  Sub->pLimit) .  
12d20 20 20 20 20 20 20 20 26 26 20 28 70 53 72 63 2d         && (pSrc-
12d30 3e 6e 53 72 63 3e 31 20 7c 7c 20 69 73 41 67 67  >nSrc>1 || isAgg
12d40 29 20 29 7b 20 20 20 20 20 20 20 20 20 20 2f 2a  ) ){          /*
12d50 20 52 65 73 74 72 69 63 74 69 6f 6e 73 20 28 34   Restrictions (4
12d60 29 28 35 29 28 38 29 28 39 29 20 2a 2f 0a 20 20  )(5)(8)(9) */.  
12d70 20 20 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20     return 0;    
12d80 20 20 20 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d     .  }.  if( p-
12d90 3e 69 73 44 69 73 74 69 6e 63 74 20 26 26 20 73  >isDistinct && s
12da0 75 62 71 75 65 72 79 49 73 41 67 67 20 29 20 72  ubqueryIsAgg ) r
12db0 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20 20  eturn 0;        
12dc0 20 2f 2a 20 52 65 73 74 72 69 63 74 69 6f 6e 20   /* Restriction 
12dd0 28 36 29 20 20 2a 2f 0a 20 20 69 66 28 20 28 70  (6)  */.  if( (p
12de0 2d 3e 64 69 73 61 6c 6c 6f 77 4f 72 64 65 72 42  ->disallowOrderB
12df0 79 20 7c 7c 20 70 2d 3e 70 4f 72 64 65 72 42 79  y || p->pOrderBy
12e00 29 20 26 26 20 70 53 75 62 2d 3e 70 4f 72 64 65  ) && pSub->pOrde
12e10 72 42 79 20 29 7b 0a 20 20 20 20 20 72 65 74 75  rBy ){.     retu
12e20 72 6e 20 30 3b 20 20 20 20 20 20 20 20 20 20 20  rn 0;           
12e30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12e40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12e50 2f 2a 20 52 65 73 74 72 69 63 74 69 6f 6e 20 28  /* Restriction (
12e60 31 31 29 20 2a 2f 0a 20 20 7d 0a 0a 20 20 2f 2a  11) */.  }..  /*
12e70 20 52 65 73 74 72 69 63 74 69 6f 6e 20 33 3a 20   Restriction 3: 
12e80 20 49 66 20 74 68 65 20 73 75 62 71 75 65 72 79   If the subquery
12e90 20 69 73 20 61 20 6a 6f 69 6e 2c 20 6d 61 6b 65   is a join, make
12ea0 20 73 75 72 65 20 74 68 65 20 73 75 62 71 75 65   sure the subque
12eb0 72 79 20 69 73 20 0a 20 20 2a 2a 20 6e 6f 74 20  ry is .  ** not 
12ec0 75 73 65 64 20 61 73 20 74 68 65 20 72 69 67 68  used as the righ
12ed0 74 20 6f 70 65 72 61 6e 64 20 6f 66 20 61 6e 20  t operand of an 
12ee0 6f 75 74 65 72 20 6a 6f 69 6e 2e 20 20 45 78 61  outer join.  Exa
12ef0 6d 70 6c 65 73 20 6f 66 20 77 68 79 20 74 68 69  mples of why thi
12f00 73 0a 20 20 2a 2a 20 69 73 20 6e 6f 74 20 61 6c  s.  ** is not al
12f10 6c 6f 77 65 64 3a 0a 20 20 2a 2a 0a 20 20 2a 2a  lowed:.  **.  **
12f20 20 20 20 20 20 20 20 20 20 74 31 20 4c 45 46 54           t1 LEFT
12f30 20 4f 55 54 45 52 20 4a 4f 49 4e 20 28 74 32 20   OUTER JOIN (t2 
12f40 4a 4f 49 4e 20 74 33 29 0a 20 20 2a 2a 0a 20 20  JOIN t3).  **.  
12f50 2a 2a 20 49 66 20 77 65 20 66 6c 61 74 74 65 6e  ** If we flatten
12f60 20 74 68 65 20 61 62 6f 76 65 2c 20 77 65 20 77   the above, we w
12f70 6f 75 6c 64 20 67 65 74 0a 20 20 2a 2a 0a 20 20  ould get.  **.  
12f80 2a 2a 20 20 20 20 20 20 20 20 20 28 74 31 20 4c  **         (t1 L
12f90 45 46 54 20 4f 55 54 45 52 20 4a 4f 49 4e 20 74  EFT OUTER JOIN t
12fa0 32 29 20 4a 4f 49 4e 20 74 33 0a 20 20 2a 2a 0a  2) JOIN t3.  **.
12fb0 20 20 2a 2a 20 77 68 69 63 68 20 69 73 20 6e 6f    ** which is no
12fc0 74 20 61 74 20 61 6c 6c 20 74 68 65 20 73 61 6d  t at all the sam
12fd0 65 20 74 68 69 6e 67 2e 0a 20 20 2a 2f 0a 20 20  e thing..  */.  
12fe0 69 66 28 20 70 53 75 62 53 72 63 2d 3e 6e 53 72  if( pSubSrc->nSr
12ff0 63 3e 31 20 26 26 20 28 70 53 75 62 69 74 65 6d  c>1 && (pSubitem
13000 2d 3e 6a 6f 69 6e 74 79 70 65 20 26 20 4a 54 5f  ->jointype & JT_
13010 4f 55 54 45 52 29 21 3d 30 20 29 7b 0a 20 20 20  OUTER)!=0 ){.   
13020 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 0a   return 0;.  }..
13030 20 20 2f 2a 20 52 65 73 74 72 69 63 74 69 6f 6e    /* Restriction
13040 20 31 32 3a 20 20 49 66 20 74 68 65 20 73 75 62   12:  If the sub
13050 71 75 65 72 79 20 69 73 20 74 68 65 20 72 69 67  query is the rig
13060 68 74 20 6f 70 65 72 61 6e 64 20 6f 66 20 61 20  ht operand of a 
13070 6c 65 66 74 20 6f 75 74 65 72 0a 20 20 2a 2a 20  left outer.  ** 
13080 6a 6f 69 6e 2c 20 6d 61 6b 65 20 73 75 72 65 20  join, make sure 
13090 74 68 65 20 73 75 62 71 75 65 72 79 20 68 61 73  the subquery has
130a0 20 6e 6f 20 57 48 45 52 45 20 63 6c 61 75 73 65   no WHERE clause
130b0 2e 0a 20 20 2a 2a 20 41 6e 20 65 78 61 6d 70 6c  ..  ** An exampl
130c0 65 73 20 6f 66 20 77 68 79 20 74 68 69 73 20 69  es of why this i
130d0 73 20 6e 6f 74 20 61 6c 6c 6f 77 65 64 3a 0a 20  s not allowed:. 
130e0 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 20 20 20   **.  **        
130f0 20 74 31 20 4c 45 46 54 20 4f 55 54 45 52 20 4a   t1 LEFT OUTER J
13100 4f 49 4e 20 28 53 45 4c 45 43 54 20 2a 20 46 52  OIN (SELECT * FR
13110 4f 4d 20 74 32 20 57 48 45 52 45 20 74 32 2e 78  OM t2 WHERE t2.x
13120 3e 30 29 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66  >0).  **.  ** If
13130 20 77 65 20 66 6c 61 74 74 65 6e 20 74 68 65 20   we flatten the 
13140 61 62 6f 76 65 2c 20 77 65 20 77 6f 75 6c 64 20  above, we would 
13150 67 65 74 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20  get.  **.  **   
13160 20 20 20 20 20 20 28 74 31 20 4c 45 46 54 20 4f        (t1 LEFT O
13170 55 54 45 52 20 4a 4f 49 4e 20 74 32 29 20 57 48  UTER JOIN t2) WH
13180 45 52 45 20 74 32 2e 78 3e 30 0a 20 20 2a 2a 0a  ERE t2.x>0.  **.
13190 20 20 2a 2a 20 42 75 74 20 74 68 65 20 74 32 2e    ** But the t2.
131a0 78 3e 30 20 74 65 73 74 20 77 69 6c 6c 20 61 6c  x>0 test will al
131b0 77 61 79 73 20 66 61 69 6c 20 6f 6e 20 61 20 4e  ways fail on a N
131c0 55 4c 4c 20 72 6f 77 20 6f 66 20 74 32 2c 20 77  ULL row of t2, w
131d0 68 69 63 68 0a 20 20 2a 2a 20 65 66 66 65 63 74  hich.  ** effect
131e0 69 76 65 6c 79 20 63 6f 6e 76 65 72 74 73 20 74  ively converts t
131f0 68 65 20 4f 55 54 45 52 20 4a 4f 49 4e 20 69 6e  he OUTER JOIN in
13200 74 6f 20 61 6e 20 49 4e 4e 45 52 20 4a 4f 49 4e  to an INNER JOIN
13210 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 28 70 53  ..  */.  if( (pS
13220 75 62 69 74 65 6d 2d 3e 6a 6f 69 6e 74 79 70 65  ubitem->jointype
13230 20 26 20 4a 54 5f 4f 55 54 45 52 29 21 3d 30 20   & JT_OUTER)!=0 
13240 26 26 20 70 53 75 62 2d 3e 70 57 68 65 72 65 21  && pSub->pWhere!
13250 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  =0 ){.    return
13260 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66   0;.  }..  /* If
13270 20 77 65 20 72 65 61 63 68 20 74 68 69 73 20 70   we reach this p
13280 6f 69 6e 74 2c 20 69 74 20 6d 65 61 6e 73 20 66  oint, it means f
13290 6c 61 74 74 65 6e 69 6e 67 20 69 73 20 70 65 72  lattening is per
132a0 6d 69 74 74 65 64 20 66 6f 72 20 74 68 65 0a 20  mitted for the. 
132b0 20 2a 2a 20 69 46 72 6f 6d 2d 74 68 20 65 6e 74   ** iFrom-th ent
132c0 72 79 20 6f 66 20 74 68 65 20 46 52 4f 4d 20 63  ry of the FROM c
132d0 6c 61 75 73 65 20 69 6e 20 74 68 65 20 6f 75 74  lause in the out
132e0 65 72 20 71 75 65 72 79 2e 0a 20 20 2a 2f 0a 0a  er query..  */..
132f0 20 20 2f 2a 20 4d 6f 76 65 20 61 6c 6c 20 6f 66    /* Move all of
13300 20 74 68 65 20 46 52 4f 4d 20 65 6c 65 6d 65 6e   the FROM elemen
13310 74 73 20 6f 66 20 74 68 65 20 73 75 62 71 75 65  ts of the subque
13320 72 79 20 69 6e 74 6f 20 74 68 65 0a 20 20 2a 2a  ry into the.  **
13330 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65   the FROM clause
13340 20 6f 66 20 74 68 65 20 6f 75 74 65 72 20 71 75   of the outer qu
13350 65 72 79 2e 20 20 42 65 66 6f 72 65 20 64 6f 69  ery.  Before doi
13360 6e 67 20 74 68 69 73 2c 20 72 65 6d 65 6d 62 65  ng this, remembe
13370 72 0a 20 20 2a 2a 20 74 68 65 20 63 75 72 73 6f  r.  ** the curso
13380 72 20 6e 75 6d 62 65 72 20 66 6f 72 20 74 68 65  r number for the
13390 20 6f 72 69 67 69 6e 61 6c 20 6f 75 74 65 72 20   original outer 
133a0 71 75 65 72 79 20 46 52 4f 4d 20 65 6c 65 6d 65  query FROM eleme
133b0 6e 74 20 69 6e 0a 20 20 2a 2a 20 69 50 61 72 65  nt in.  ** iPare
133c0 6e 74 2e 20 20 54 68 65 20 69 50 61 72 65 6e 74  nt.  The iParent
133d0 20 63 75 72 73 6f 72 20 77 69 6c 6c 20 6e 65 76   cursor will nev
133e0 65 72 20 62 65 20 75 73 65 64 2e 20 20 53 75 62  er be used.  Sub
133f0 73 65 71 75 65 6e 74 20 63 6f 64 65 0a 20 20 2a  sequent code.  *
13400 2a 20 77 69 6c 6c 20 73 63 61 6e 20 65 78 70 72  * will scan expr
13410 65 73 73 69 6f 6e 73 20 6c 6f 6f 6b 69 6e 67 20  essions looking 
13420 66 6f 72 20 69 50 61 72 65 6e 74 20 72 65 66 65  for iParent refe
13430 72 65 6e 63 65 73 20 61 6e 64 20 72 65 70 6c 61  rences and repla
13440 63 65 0a 20 20 2a 2a 20 74 68 6f 73 65 20 72 65  ce.  ** those re
13450 66 65 72 65 6e 63 65 73 20 77 69 74 68 20 65 78  ferences with ex
13460 70 72 65 73 73 69 6f 6e 73 20 74 68 61 74 20 72  pressions that r
13470 65 73 6f 6c 76 65 20 74 6f 20 74 68 65 20 73 75  esolve to the su
13480 62 71 75 65 72 79 20 46 52 4f 4d 0a 20 20 2a 2a  bquery FROM.  **
13490 20 65 6c 65 6d 65 6e 74 73 20 77 65 20 61 72 65   elements we are
134a0 20 6e 6f 77 20 63 6f 70 79 69 6e 67 20 69 6e 2e   now copying in.
134b0 0a 20 20 2a 2f 0a 20 20 69 50 61 72 65 6e 74 20  .  */.  iParent 
134c0 3d 20 70 53 75 62 69 74 65 6d 2d 3e 69 43 75 72  = pSubitem->iCur
134d0 73 6f 72 3b 0a 20 20 7b 0a 20 20 20 20 69 6e 74  sor;.  {.    int
134e0 20 6e 53 75 62 53 72 63 20 3d 20 70 53 75 62 53   nSubSrc = pSubS
134f0 72 63 2d 3e 6e 53 72 63 3b 0a 20 20 20 20 69 6e  rc->nSrc;.    in
13500 74 20 6a 6f 69 6e 74 79 70 65 20 3d 20 70 53 75  t jointype = pSu
13510 62 69 74 65 6d 2d 3e 6a 6f 69 6e 74 79 70 65 3b  bitem->jointype;
13520 0a 0a 20 20 20 20 73 71 6c 69 74 65 33 44 65 6c  ..    sqlite3Del
13530 65 74 65 54 61 62 6c 65 28 70 53 75 62 69 74 65  eteTable(pSubite
13540 6d 2d 3e 70 54 61 62 29 3b 0a 20 20 20 20 73 71  m->pTab);.    sq
13550 6c 69 74 65 33 5f 66 72 65 65 28 70 53 75 62 69  lite3_free(pSubi
13560 74 65 6d 2d 3e 7a 44 61 74 61 62 61 73 65 29 3b  tem->zDatabase);
13570 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65  .    sqlite3_fre
13580 65 28 70 53 75 62 69 74 65 6d 2d 3e 7a 4e 61 6d  e(pSubitem->zNam
13590 65 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  e);.    sqlite3_
135a0 66 72 65 65 28 70 53 75 62 69 74 65 6d 2d 3e 7a  free(pSubitem->z
135b0 41 6c 69 61 73 29 3b 0a 20 20 20 20 70 53 75 62  Alias);.    pSub
135c0 69 74 65 6d 2d 3e 70 54 61 62 20 3d 20 30 3b 0a  item->pTab = 0;.
135d0 20 20 20 20 70 53 75 62 69 74 65 6d 2d 3e 7a 44      pSubitem->zD
135e0 61 74 61 62 61 73 65 20 3d 20 30 3b 0a 20 20 20  atabase = 0;.   
135f0 20 70 53 75 62 69 74 65 6d 2d 3e 7a 4e 61 6d 65   pSubitem->zName
13600 20 3d 20 30 3b 0a 20 20 20 20 70 53 75 62 69 74   = 0;.    pSubit
13610 65 6d 2d 3e 7a 41 6c 69 61 73 20 3d 20 30 3b 0a  em->zAlias = 0;.
13620 20 20 20 20 69 66 28 20 6e 53 75 62 53 72 63 3e      if( nSubSrc>
13630 31 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 65  1 ){.      int e
13640 78 74 72 61 20 3d 20 6e 53 75 62 53 72 63 20 2d  xtra = nSubSrc -
13650 20 31 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d   1;.      for(i=
13660 31 3b 20 69 3c 6e 53 75 62 53 72 63 3b 20 69 2b  1; i<nSubSrc; i+
13670 2b 29 7b 0a 20 20 20 20 20 20 20 20 70 53 72 63  +){.        pSrc
13680 20 3d 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73   = sqlite3SrcLis
13690 74 41 70 70 65 6e 64 28 64 62 2c 20 70 53 72 63  tAppend(db, pSrc
136a0 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  , 0, 0);.       
136b0 20 69 66 28 20 70 53 72 63 3d 3d 30 20 29 7b 0a   if( pSrc==0 ){.
136c0 20 20 20 20 20 20 20 20 20 20 70 2d 3e 70 53 72            p->pSr
136d0 63 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20  c = 0;.         
136e0 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 20   return 1;.     
136f0 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
13700 20 20 20 70 2d 3e 70 53 72 63 20 3d 20 70 53 72     p->pSrc = pSr
13710 63 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 70  c;.      for(i=p
13720 53 72 63 2d 3e 6e 53 72 63 2d 31 3b 20 69 2d 65  Src->nSrc-1; i-e
13730 78 74 72 61 3e 3d 69 46 72 6f 6d 3b 20 69 2d 2d  xtra>=iFrom; i--
13740 29 7b 0a 20 20 20 20 20 20 20 20 70 53 72 63 2d  ){.        pSrc-
13750 3e 61 5b 69 5d 20 3d 20 70 53 72 63 2d 3e 61 5b  >a[i] = pSrc->a[
13760 69 2d 65 78 74 72 61 5d 3b 0a 20 20 20 20 20 20  i-extra];.      
13770 7d 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f 72 28  }.    }.    for(
13780 69 3d 30 3b 20 69 3c 6e 53 75 62 53 72 63 3b 20  i=0; i<nSubSrc; 
13790 69 2b 2b 29 7b 0a 20 20 20 20 20 20 70 53 72 63  i++){.      pSrc
137a0 2d 3e 61 5b 69 2b 69 46 72 6f 6d 5d 20 3d 20 70  ->a[i+iFrom] = p
137b0 53 75 62 53 72 63 2d 3e 61 5b 69 5d 3b 0a 20 20  SubSrc->a[i];.  
137c0 20 20 20 20 6d 65 6d 73 65 74 28 26 70 53 75 62      memset(&pSub
137d0 53 72 63 2d 3e 61 5b 69 5d 2c 20 30 2c 20 73 69  Src->a[i], 0, si
137e0 7a 65 6f 66 28 70 53 75 62 53 72 63 2d 3e 61 5b  zeof(pSubSrc->a[
137f0 69 5d 29 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  i]));.    }.    
13800 70 53 72 63 2d 3e 61 5b 69 46 72 6f 6d 5d 2e 6a  pSrc->a[iFrom].j
13810 6f 69 6e 74 79 70 65 20 3d 20 6a 6f 69 6e 74 79  ointype = jointy
13820 70 65 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4e 6f  pe;.  }..  /* No
13830 77 20 62 65 67 69 6e 20 73 75 62 73 74 69 74 75  w begin substitu
13840 74 69 6e 67 20 73 75 62 71 75 65 72 79 20 72 65  ting subquery re
13850 73 75 6c 74 20 73 65 74 20 65 78 70 72 65 73 73  sult set express
13860 69 6f 6e 73 20 66 6f 72 20 0a 20 20 2a 2a 20 72  ions for .  ** r
13870 65 66 65 72 65 6e 63 65 73 20 74 6f 20 74 68 65  eferences to the
13880 20 69 50 61 72 65 6e 74 20 69 6e 20 74 68 65 20   iParent in the 
13890 6f 75 74 65 72 20 71 75 65 72 79 2e 0a 20 20 2a  outer query..  *
138a0 2a 20 0a 20 20 2a 2a 20 45 78 61 6d 70 6c 65 3a  * .  ** Example:
138b0 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 53 45 4c  .  **.  **   SEL
138c0 45 43 54 20 61 2b 35 2c 20 62 2a 31 30 20 46 52  ECT a+5, b*10 FR
138d0 4f 4d 20 28 53 45 4c 45 43 54 20 78 2a 33 20 41  OM (SELECT x*3 A
138e0 53 20 61 2c 20 79 2b 31 30 20 41 53 20 62 20 46  S a, y+10 AS b F
138f0 52 4f 4d 20 74 31 29 20 57 48 45 52 45 20 61 3e  ROM t1) WHERE a>
13900 62 3b 0a 20 20 2a 2a 20 20 20 5c 20 20 20 20 20  b;.  **   \     
13910 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13920 5c 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 20 73  \_____________ s
13930 75 62 71 75 65 72 79 20 5f 5f 5f 5f 5f 5f 5f 5f  ubquery ________
13940 5f 5f 2f 20 20 20 20 20 20 20 20 20 20 2f 0a 20  __/          /. 
13950 20 2a 2a 20 20 20 20 5c 5f 5f 5f 5f 5f 5f 5f 5f   **    \________
13960 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 20 6f 75  _____________ ou
13970 74 65 72 20 71 75 65 72 79 20 5f 5f 5f 5f 5f 5f  ter query ______
13980 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f  ________________
13990 5f 5f 5f 5f 5f 5f 5f 5f 2f 0a 20 20 2a 2a 0a 20  ________/.  **. 
139a0 20 2a 2a 20 57 65 20 6c 6f 6f 6b 20 61 74 20 65   ** We look at e
139b0 76 65 72 79 20 65 78 70 72 65 73 73 69 6f 6e 20  very expression 
139c0 69 6e 20 74 68 65 20 6f 75 74 65 72 20 71 75 65  in the outer que
139d0 72 79 20 61 6e 64 20 65 76 65 72 79 20 70 6c 61  ry and every pla
139e0 63 65 20 77 65 20 73 65 65 0a 20 20 2a 2a 20 22  ce we see.  ** "
139f0 61 22 20 77 65 20 73 75 62 73 74 69 74 75 74 65  a" we substitute
13a00 20 22 78 2a 33 22 20 61 6e 64 20 65 76 65 72 79   "x*3" and every
13a10 20 70 6c 61 63 65 20 77 65 20 73 65 65 20 22 62   place we see "b
13a20 22 20 77 65 20 73 75 62 73 74 69 74 75 74 65 20  " we substitute 
13a30 22 79 2b 31 30 22 2e 0a 20 20 2a 2f 0a 20 20 70  "y+10"..  */.  p
13a40 4c 69 73 74 20 3d 20 70 2d 3e 70 45 4c 69 73 74  List = p->pEList
13a50 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70  ;.  for(i=0; i<p
13a60 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b  List->nExpr; i++
13a70 29 7b 0a 20 20 20 20 45 78 70 72 20 2a 70 45 78  ){.    Expr *pEx
13a80 70 72 3b 0a 20 20 20 20 69 66 28 20 70 4c 69 73  pr;.    if( pLis
13a90 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 3d 3d 30  t->a[i].zName==0
13aa0 20 26 26 20 28 70 45 78 70 72 20 3d 20 70 4c 69   && (pExpr = pLi
13ab0 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 29 2d  st->a[i].pExpr)-
13ac0 3e 73 70 61 6e 2e 7a 21 3d 30 20 29 7b 0a 20 20  >span.z!=0 ){.  
13ad0 20 20 20 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e      pList->a[i].
13ae0 7a 4e 61 6d 65 20 3d 20 0a 20 20 20 20 20 20 20  zName = .       
13af0 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 53        sqlite3DbS
13b00 74 72 4e 44 75 70 28 64 62 2c 20 28 63 68 61 72  trNDup(db, (char
13b10 2a 29 70 45 78 70 72 2d 3e 73 70 61 6e 2e 7a 2c  *)pExpr->span.z,
13b20 20 70 45 78 70 72 2d 3e 73 70 61 6e 2e 6e 29 3b   pExpr->span.n);
13b30 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 75 62  .    }.  }.  sub
13b40 73 74 45 78 70 72 4c 69 73 74 28 64 62 2c 20 70  stExprList(db, p
13b50 2d 3e 70 45 4c 69 73 74 2c 20 69 50 61 72 65 6e  ->pEList, iParen
13b60 74 2c 20 70 53 75 62 2d 3e 70 45 4c 69 73 74 29  t, pSub->pEList)
13b70 3b 0a 20 20 69 66 28 20 69 73 41 67 67 20 29 7b  ;.  if( isAgg ){
13b80 0a 20 20 20 20 73 75 62 73 74 45 78 70 72 4c 69  .    substExprLi
13b90 73 74 28 64 62 2c 20 70 2d 3e 70 47 72 6f 75 70  st(db, p->pGroup
13ba0 42 79 2c 20 69 50 61 72 65 6e 74 2c 20 70 53 75  By, iParent, pSu
13bb0 62 2d 3e 70 45 4c 69 73 74 29 3b 0a 20 20 20 20  b->pEList);.    
13bc0 73 75 62 73 74 45 78 70 72 28 64 62 2c 20 70 2d  substExpr(db, p-
13bd0 3e 70 48 61 76 69 6e 67 2c 20 69 50 61 72 65 6e  >pHaving, iParen
13be0 74 2c 20 70 53 75 62 2d 3e 70 45 4c 69 73 74 29  t, pSub->pEList)
13bf0 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 53 75 62  ;.  }.  if( pSub
13c00 2d 3e 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20  ->pOrderBy ){.  
13c10 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 4f 72    assert( p->pOr
13c20 64 65 72 42 79 3d 3d 30 20 29 3b 0a 20 20 20 20  derBy==0 );.    
13c30 70 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20 70 53  p->pOrderBy = pS
13c40 75 62 2d 3e 70 4f 72 64 65 72 42 79 3b 0a 20 20  ub->pOrderBy;.  
13c50 20 20 70 53 75 62 2d 3e 70 4f 72 64 65 72 42 79    pSub->pOrderBy
13c60 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 20 69 66   = 0;.  }else if
13c70 28 20 70 2d 3e 70 4f 72 64 65 72 42 79 20 29 7b  ( p->pOrderBy ){
13c80 0a 20 20 20 20 73 75 62 73 74 45 78 70 72 4c 69  .    substExprLi
13c90 73 74 28 64 62 2c 20 70 2d 3e 70 4f 72 64 65 72  st(db, p->pOrder
13ca0 42 79 2c 20 69 50 61 72 65 6e 74 2c 20 70 53 75  By, iParent, pSu
13cb0 62 2d 3e 70 45 4c 69 73 74 29 3b 0a 20 20 7d 0a  b->pEList);.  }.
13cc0 20 20 69 66 28 20 70 53 75 62 2d 3e 70 57 68 65    if( pSub->pWhe
13cd0 72 65 20 29 7b 0a 20 20 20 20 70 57 68 65 72 65  re ){.    pWhere
13ce0 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44 75   = sqlite3ExprDu
13cf0 70 28 64 62 2c 20 70 53 75 62 2d 3e 70 57 68 65  p(db, pSub->pWhe
13d00 72 65 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  re);.  }else{.  
13d10 20 20 70 57 68 65 72 65 20 3d 20 30 3b 0a 20 20    pWhere = 0;.  
13d20 7d 0a 20 20 69 66 28 20 73 75 62 71 75 65 72 79  }.  if( subquery
13d30 49 73 41 67 67 20 29 7b 0a 20 20 20 20 61 73 73  IsAgg ){.    ass
13d40 65 72 74 28 20 70 2d 3e 70 48 61 76 69 6e 67 3d  ert( p->pHaving=
13d50 3d 30 20 29 3b 0a 20 20 20 20 70 2d 3e 70 48 61  =0 );.    p->pHa
13d60 76 69 6e 67 20 3d 20 70 2d 3e 70 57 68 65 72 65  ving = p->pWhere
13d70 3b 0a 20 20 20 20 70 2d 3e 70 57 68 65 72 65 20  ;.    p->pWhere 
13d80 3d 20 70 57 68 65 72 65 3b 0a 20 20 20 20 73 75  = pWhere;.    su
13d90 62 73 74 45 78 70 72 28 64 62 2c 20 70 2d 3e 70  bstExpr(db, p->p
13da0 48 61 76 69 6e 67 2c 20 69 50 61 72 65 6e 74 2c  Having, iParent,
13db0 20 70 53 75 62 2d 3e 70 45 4c 69 73 74 29 3b 0a   pSub->pEList);.
13dc0 20 20 20 20 70 2d 3e 70 48 61 76 69 6e 67 20 3d      p->pHaving =
13dd0 20 73 71 6c 69 74 65 33 45 78 70 72 41 6e 64 28   sqlite3ExprAnd(
13de0 64 62 2c 20 70 2d 3e 70 48 61 76 69 6e 67 2c 20  db, p->pHaving, 
13df0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
13e00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13e10 20 73 71 6c 69 74 65 33 45 78 70 72 44 75 70 28   sqlite3ExprDup(
13e20 64 62 2c 20 70 53 75 62 2d 3e 70 48 61 76 69 6e  db, pSub->pHavin
13e30 67 29 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  g));.    assert(
13e40 20 70 2d 3e 70 47 72 6f 75 70 42 79 3d 3d 30 20   p->pGroupBy==0 
13e50 29 3b 0a 20 20 20 20 70 2d 3e 70 47 72 6f 75 70  );.    p->pGroup
13e60 42 79 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  By = sqlite3Expr
13e70 4c 69 73 74 44 75 70 28 64 62 2c 20 70 53 75 62  ListDup(db, pSub
13e80 2d 3e 70 47 72 6f 75 70 42 79 29 3b 0a 20 20 7d  ->pGroupBy);.  }
13e90 65 6c 73 65 7b 0a 20 20 20 20 73 75 62 73 74 45  else{.    substE
13ea0 78 70 72 28 64 62 2c 20 70 2d 3e 70 57 68 65 72  xpr(db, p->pWher
13eb0 65 2c 20 69 50 61 72 65 6e 74 2c 20 70 53 75 62  e, iParent, pSub
13ec0 2d 3e 70 45 4c 69 73 74 29 3b 0a 20 20 20 20 70  ->pEList);.    p
13ed0 2d 3e 70 57 68 65 72 65 20 3d 20 73 71 6c 69 74  ->pWhere = sqlit
13ee0 65 33 45 78 70 72 41 6e 64 28 64 62 2c 20 70 2d  e3ExprAnd(db, p-
13ef0 3e 70 57 68 65 72 65 2c 20 70 57 68 65 72 65 29  >pWhere, pWhere)
13f00 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20  ;.  }..  /* The 
13f10 66 6c 61 74 74 65 6e 65 64 20 71 75 65 72 79 20  flattened query 
13f20 69 73 20 64 69 73 74 69 6e 63 74 20 69 66 20 65  is distinct if e
13f30 69 74 68 65 72 20 74 68 65 20 69 6e 6e 65 72 20  ither the inner 
13f40 6f 72 20 74 68 65 0a 20 20 2a 2a 20 6f 75 74 65  or the.  ** oute
13f50 72 20 71 75 65 72 79 20 69 73 20 64 69 73 74 69  r query is disti
13f60 6e 63 74 2e 20 0a 20 20 2a 2f 0a 20 20 70 2d 3e  nct. .  */.  p->
13f70 69 73 44 69 73 74 69 6e 63 74 20 3d 20 70 2d 3e  isDistinct = p->
13f80 69 73 44 69 73 74 69 6e 63 74 20 7c 7c 20 70 53  isDistinct || pS
13f90 75 62 2d 3e 69 73 44 69 73 74 69 6e 63 74 3b 0a  ub->isDistinct;.
13fa0 0a 20 20 2f 2a 0a 20 20 2a 2a 20 53 45 4c 45 43  .  /*.  ** SELEC
13fb0 54 20 2e 2e 2e 20 46 52 4f 4d 20 28 53 45 4c 45  T ... FROM (SELE
13fc0 43 54 20 2e 2e 2e 20 4c 49 4d 49 54 20 61 20 4f  CT ... LIMIT a O
13fd0 46 46 53 45 54 20 62 29 20 4c 49 4d 49 54 20 78  FFSET b) LIMIT x
13fe0 20 4f 46 46 53 45 54 20 79 3b 0a 20 20 2a 2a 0a   OFFSET y;.  **.
13ff0 20 20 2a 2a 20 4f 6e 65 20 69 73 20 74 65 6d 70    ** One is temp
14000 74 65 64 20 74 6f 20 74 72 79 20 74 6f 20 61 64  ted to try to ad
14010 64 20 61 20 61 6e 64 20 62 20 74 6f 20 63 6f 6d  d a and b to com
14020 62 69 6e 65 20 74 68 65 20 6c 69 6d 69 74 73 2e  bine the limits.
14030 20 20 42 75 74 20 74 68 69 73 0a 20 20 2a 2a 20    But this.  ** 
14040 64 6f 65 73 20 6e 6f 74 20 77 6f 72 6b 20 69 66  does not work if
14050 20 65 69 74 68 65 72 20 6c 69 6d 69 74 20 69 73   either limit is
14060 20 6e 65 67 61 74 69 76 65 2e 0a 20 20 2a 2f 0a   negative..  */.
14070 20 20 69 66 28 20 70 53 75 62 2d 3e 70 4c 69 6d    if( pSub->pLim
14080 69 74 20 29 7b 0a 20 20 20 20 70 2d 3e 70 4c 69  it ){.    p->pLi
14090 6d 69 74 20 3d 20 70 53 75 62 2d 3e 70 4c 69 6d  mit = pSub->pLim
140a0 69 74 3b 0a 20 20 20 20 70 53 75 62 2d 3e 70 4c  it;.    pSub->pL
140b0 69 6d 69 74 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20  imit = 0;.  }.. 
140c0 20 2f 2a 20 46 69 6e 69 61 6c 6c 79 2c 20 64 65   /* Finially, de
140d0 6c 65 74 65 20 77 68 61 74 20 69 73 20 6c 65 66  lete what is lef
140e0 74 20 6f 66 20 74 68 65 20 73 75 62 71 75 65 72  t of the subquer
140f0 79 20 61 6e 64 20 72 65 74 75 72 6e 0a 20 20 2a  y and return.  *
14100 2a 20 73 75 63 63 65 73 73 2e 0a 20 20 2a 2f 0a  * success..  */.
14110 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44    sqlite3SelectD
14120 65 6c 65 74 65 28 70 53 75 62 29 3b 0a 20 20 72  elete(pSub);.  r
14130 65 74 75 72 6e 20 31 3b 0a 7d 0a 23 65 6e 64 69  eturn 1;.}.#endi
14140 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54  f /* SQLITE_OMIT
14150 5f 56 49 45 57 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20  _VIEW */../*.** 
14160 41 6e 61 6c 79 7a 65 20 74 68 65 20 53 45 4c 45  Analyze the SELE
14170 43 54 20 73 74 61 74 65 6d 65 6e 74 20 70 61 73  CT statement pas
14180 73 65 64 20 69 6e 20 61 73 20 61 6e 20 61 72 67  sed in as an arg
14190 75 6d 65 6e 74 20 74 6f 20 73 65 65 20 69 66 20  ument to see if 
141a0 69 74 0a 2a 2a 20 69 73 20 61 20 73 69 6d 70 6c  it.** is a simpl
141b0 65 20 6d 69 6e 28 29 20 6f 72 20 6d 61 78 28 29  e min() or max()
141c0 20 71 75 65 72 79 2e 20 20 49 66 20 69 74 20 69   query.  If it i
141d0 73 20 61 6e 64 20 74 68 69 73 20 71 75 65 72 79  s and this query
141e0 20 63 61 6e 20 62 65 0a 2a 2a 20 73 61 74 69 73   can be.** satis
141f0 66 69 65 64 20 75 73 69 6e 67 20 61 20 73 69 6e  fied using a sin
14200 67 6c 65 20 73 65 65 6b 20 74 6f 20 74 68 65 20  gle seek to the 
14210 62 65 67 69 6e 6e 69 6e 67 20 6f 72 20 65 6e 64  beginning or end
14220 20 6f 66 20 61 6e 20 69 6e 64 65 78 2c 0a 2a 2a   of an index,.**
14230 20 74 68 65 6e 20 67 65 6e 65 72 61 74 65 20 74   then generate t
14240 68 65 20 63 6f 64 65 20 66 6f 72 20 74 68 69 73  he code for this
14250 20 53 45 4c 45 43 54 20 61 6e 64 20 72 65 74 75   SELECT and retu
14260 72 6e 20 31 2e 20 20 49 66 20 74 68 69 73 20 69  rn 1.  If this i
14270 73 20 6e 6f 74 20 61 20 0a 2a 2a 20 73 69 6d 70  s not a .** simp
14280 6c 65 20 6d 69 6e 28 29 20 6f 72 20 6d 61 78 28  le min() or max(
14290 29 20 71 75 65 72 79 2c 20 74 68 65 6e 20 72 65  ) query, then re
142a0 74 75 72 6e 20 30 3b 0a 2a 2a 0a 2a 2a 20 41 20  turn 0;.**.** A 
142b0 73 69 6d 70 6c 79 20 6d 69 6e 28 29 20 6f 72 20  simply min() or 
142c0 6d 61 78 28 29 20 71 75 65 72 79 20 6c 6f 6f 6b  max() query look
142d0 73 20 6c 69 6b 65 20 74 68 69 73 3a 0a 2a 2a 0a  s like this:.**.
142e0 2a 2a 20 20 20 20 53 45 4c 45 43 54 20 6d 69 6e  **    SELECT min
142f0 28 61 29 20 46 52 4f 4d 20 74 61 62 6c 65 3b 0a  (a) FROM table;.
14300 2a 2a 20 20 20 20 53 45 4c 45 43 54 20 6d 61 78  **    SELECT max
14310 28 61 29 20 46 52 4f 4d 20 74 61 62 6c 65 3b 0a  (a) FROM table;.
14320 2a 2a 0a 2a 2a 20 54 68 65 20 71 75 65 72 79 20  **.** The query 
14330 6d 61 79 20 68 61 76 65 20 6f 6e 6c 79 20 61 20  may have only a 
14340 73 69 6e 67 6c 65 20 74 61 62 6c 65 20 69 6e 20  single table in 
14350 69 74 73 20 46 52 4f 4d 20 61 72 67 75 6d 65 6e  its FROM argumen
14360 74 2e 20 20 54 68 65 72 65 0a 2a 2a 20 63 61 6e  t.  There.** can
14370 20 62 65 20 6e 6f 20 47 52 4f 55 50 20 42 59 20   be no GROUP BY 
14380 6f 72 20 48 41 56 49 4e 47 20 6f 72 20 57 48 45  or HAVING or WHE
14390 52 45 20 63 6c 61 75 73 65 73 2e 20 20 54 68 65  RE clauses.  The
143a0 20 72 65 73 75 6c 74 20 73 65 74 20 6d 75 73 74   result set must
143b0 0a 2a 2a 20 62 65 20 74 68 65 20 6d 69 6e 28 29  .** be the min()
143c0 20 6f 72 20 6d 61 78 28 29 20 6f 66 20 61 20 73   or max() of a s
143d0 69 6e 67 6c 65 20 63 6f 6c 75 6d 6e 20 6f 66 20  ingle column of 
143e0 74 68 65 20 74 61 62 6c 65 2e 20 20 54 68 65 20  the table.  The 
143f0 63 6f 6c 75 6d 6e 0a 2a 2a 20 69 6e 20 74 68 65  column.** in the
14400 20 6d 69 6e 28 29 20 6f 72 20 6d 61 78 28 29 20   min() or max() 
14410 66 75 6e 63 74 69 6f 6e 20 6d 75 73 74 20 62 65  function must be
14420 20 69 6e 64 65 78 65 64 2e 0a 2a 2a 0a 2a 2a 20   indexed..**.** 
14430 54 68 65 20 70 61 72 61 6d 65 74 65 72 73 20 74  The parameters t
14440 6f 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 61  o this routine a
14450 72 65 20 74 68 65 20 73 61 6d 65 20 61 73 20 66  re the same as f
14460 6f 72 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74  or sqlite3Select
14470 28 29 2e 0a 2a 2a 20 53 65 65 20 74 68 65 20 68  ()..** See the h
14480 65 61 64 65 72 20 63 6f 6d 6d 65 6e 74 20 6f 6e  eader comment on
14490 20 74 68 61 74 20 72 6f 75 74 69 6e 65 20 66 6f   that routine fo
144a0 72 20 61 64 64 69 74 69 6f 6e 61 6c 20 69 6e 66  r additional inf
144b0 6f 72 6d 61 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61  ormation..*/.sta
144c0 74 69 63 20 69 6e 74 20 73 69 6d 70 6c 65 4d 69  tic int simpleMi
144d0 6e 4d 61 78 51 75 65 72 79 28 50 61 72 73 65 20  nMaxQuery(Parse 
144e0 2a 70 50 61 72 73 65 2c 20 53 65 6c 65 63 74 20  *pParse, Select 
144f0 2a 70 2c 20 69 6e 74 20 65 44 65 73 74 2c 20 69  *p, int eDest, i
14500 6e 74 20 69 50 61 72 6d 29 7b 0a 20 20 45 78 70  nt iParm){.  Exp
14510 72 20 2a 70 45 78 70 72 3b 0a 20 20 69 6e 74 20  r *pExpr;.  int 
14520 69 43 6f 6c 3b 0a 20 20 54 61 62 6c 65 20 2a 70  iCol;.  Table *p
14530 54 61 62 3b 0a 20 20 49 6e 64 65 78 20 2a 70 49  Tab;.  Index *pI
14540 64 78 3b 0a 20 20 69 6e 74 20 62 61 73 65 3b 0a  dx;.  int base;.
14550 20 20 56 64 62 65 20 2a 76 3b 0a 20 20 69 6e 74    Vdbe *v;.  int
14560 20 73 65 65 6b 4f 70 3b 0a 20 20 45 78 70 72 4c   seekOp;.  ExprL
14570 69 73 74 20 2a 70 45 4c 69 73 74 2c 20 2a 70 4c  ist *pEList, *pL
14580 69 73 74 2c 20 65 4c 69 73 74 3b 0a 20 20 73 74  ist, eList;.  st
14590 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74  ruct ExprList_it
145a0 65 6d 20 65 4c 69 73 74 49 74 65 6d 3b 0a 20 20  em eListItem;.  
145b0 53 72 63 4c 69 73 74 20 2a 70 53 72 63 3b 0a 20  SrcList *pSrc;. 
145c0 20 69 6e 74 20 62 72 6b 3b 0a 20 20 69 6e 74 20   int brk;.  int 
145d0 69 44 62 3b 0a 0a 20 20 2f 2a 20 43 68 65 63 6b  iDb;..  /* Check
145e0 20 74 6f 20 73 65 65 20 69 66 20 74 68 69 73 20   to see if this 
145f0 71 75 65 72 79 20 69 73 20 61 20 73 69 6d 70 6c  query is a simpl
14600 65 20 6d 69 6e 28 29 20 6f 72 20 6d 61 78 28 29  e min() or max()
14610 20 71 75 65 72 79 2e 20 20 52 65 74 75 72 6e 0a   query.  Return.
14620 20 20 2a 2a 20 7a 65 72 6f 20 69 66 20 69 74 20    ** zero if it 
14630 69 73 20 20 6e 6f 74 2e 0a 20 20 2a 2f 0a 20 20  is  not..  */.  
14640 69 66 28 20 70 2d 3e 70 47 72 6f 75 70 42 79 20  if( p->pGroupBy 
14650 7c 7c 20 70 2d 3e 70 48 61 76 69 6e 67 20 7c 7c  || p->pHaving ||
14660 20 70 2d 3e 70 57 68 65 72 65 20 29 20 72 65 74   p->pWhere ) ret
14670 75 72 6e 20 30 3b 0a 20 20 70 53 72 63 20 3d 20  urn 0;.  pSrc = 
14680 70 2d 3e 70 53 72 63 3b 0a 20 20 69 66 28 20 70  p->pSrc;.  if( p
14690 53 72 63 2d 3e 6e 53 72 63 21 3d 31 20 29 20 72  Src->nSrc!=1 ) r
146a0 65 74 75 72 6e 20 30 3b 0a 20 20 70 45 4c 69 73  eturn 0;.  pELis
146b0 74 20 3d 20 70 2d 3e 70 45 4c 69 73 74 3b 0a 20  t = p->pEList;. 
146c0 20 69 66 28 20 70 45 4c 69 73 74 2d 3e 6e 45 78   if( pEList->nEx
146d0 70 72 21 3d 31 20 29 20 72 65 74 75 72 6e 20 30  pr!=1 ) return 0
146e0 3b 0a 20 20 70 45 78 70 72 20 3d 20 70 45 4c 69  ;.  pExpr = pELi
146f0 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 3b 0a  st->a[0].pExpr;.
14700 20 20 69 66 28 20 70 45 78 70 72 2d 3e 6f 70 21    if( pExpr->op!
14710 3d 54 4b 5f 41 47 47 5f 46 55 4e 43 54 49 4f 4e  =TK_AGG_FUNCTION
14720 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 70   ) return 0;.  p
14730 4c 69 73 74 20 3d 20 70 45 78 70 72 2d 3e 70 4c  List = pExpr->pL
14740 69 73 74 3b 0a 20 20 69 66 28 20 70 4c 69 73 74  ist;.  if( pList
14750 3d 3d 30 20 7c 7c 20 70 4c 69 73 74 2d 3e 6e 45  ==0 || pList->nE
14760 78 70 72 21 3d 31 20 29 20 72 65 74 75 72 6e 20  xpr!=1 ) return 
14770 30 3b 0a 20 20 69 66 28 20 70 45 78 70 72 2d 3e  0;.  if( pExpr->
14780 74 6f 6b 65 6e 2e 6e 21 3d 33 20 29 20 72 65 74  token.n!=3 ) ret
14790 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 73 71 6c  urn 0;.  if( sql
147a0 69 74 65 33 53 74 72 4e 49 43 6d 70 28 28 63 68  ite3StrNICmp((ch
147b0 61 72 2a 29 70 45 78 70 72 2d 3e 74 6f 6b 65 6e  ar*)pExpr->token
147c0 2e 7a 2c 22 6d 69 6e 22 2c 33 29 3d 3d 30 20 29  .z,"min",3)==0 )
147d0 7b 0a 20 20 20 20 73 65 65 6b 4f 70 20 3d 20 4f  {.    seekOp = O
147e0 50 5f 52 65 77 69 6e 64 3b 0a 20 20 7d 65 6c 73  P_Rewind;.  }els
147f0 65 20 69 66 28 20 73 71 6c 69 74 65 33 53 74 72  e if( sqlite3Str
14800 4e 49 43 6d 70 28 28 63 68 61 72 2a 29 70 45 78  NICmp((char*)pEx
14810 70 72 2d 3e 74 6f 6b 65 6e 2e 7a 2c 22 6d 61 78  pr->token.z,"max
14820 22 2c 33 29 3d 3d 30 20 29 7b 0a 20 20 20 20 73  ",3)==0 ){.    s
14830 65 65 6b 4f 70 20 3d 20 4f 50 5f 4c 61 73 74 3b  eekOp = OP_Last;
14840 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65  .  }else{.    re
14850 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 70 45  turn 0;.  }.  pE
14860 78 70 72 20 3d 20 70 4c 69 73 74 2d 3e 61 5b 30  xpr = pList->a[0
14870 5d 2e 70 45 78 70 72 3b 0a 20 20 69 66 28 20 70  ].pExpr;.  if( p
14880 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 43 4f 4c  Expr->op!=TK_COL
14890 55 4d 4e 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  UMN ) return 0;.
148a0 20 20 69 43 6f 6c 20 3d 20 70 45 78 70 72 2d 3e    iCol = pExpr->
148b0 69 43 6f 6c 75 6d 6e 3b 0a 20 20 70 54 61 62 20  iColumn;.  pTab 
148c0 3d 20 70 53 72 63 2d 3e 61 5b 30 5d 2e 70 54 61  = pSrc->a[0].pTa
148d0 62 3b 0a 0a 20 20 2f 2a 20 54 68 69 73 20 6f 70  b;..  /* This op
148e0 74 69 6d 69 7a 61 74 69 6f 6e 20 63 61 6e 6e 6f  timization canno
148f0 74 20 62 65 20 75 73 65 64 20 77 69 74 68 20 76  t be used with v
14900 69 72 74 75 61 6c 20 74 61 62 6c 65 73 2e 20 2a  irtual tables. *
14910 2f 0a 20 20 69 66 28 20 49 73 56 69 72 74 75 61  /.  if( IsVirtua
14920 6c 28 70 54 61 62 29 20 29 20 72 65 74 75 72 6e  l(pTab) ) return
14930 20 30 3b 0a 0a 20 20 2f 2a 20 49 66 20 77 65 20   0;..  /* If we 
14940 67 65 74 20 74 6f 20 68 65 72 65 2c 20 69 74 20  get to here, it 
14950 6d 65 61 6e 73 20 74 68 65 20 71 75 65 72 79 20  means the query 
14960 69 73 20 6f 66 20 74 68 65 20 63 6f 72 72 65 63  is of the correc
14970 74 20 66 6f 72 6d 2e 0a 20 20 2a 2a 20 43 68 65  t form..  ** Che
14980 63 6b 20 74 6f 20 6d 61 6b 65 20 73 75 72 65 20  ck to make sure 
14990 77 65 20 68 61 76 65 20 61 6e 20 69 6e 64 65 78  we have an index
149a0 20 61 6e 64 20 6d 61 6b 65 20 70 49 64 78 20 70   and make pIdx p
149b0 6f 69 6e 74 20 74 6f 20 74 68 65 0a 20 20 2a 2a  oint to the.  **
149c0 20 61 70 70 72 6f 70 72 69 61 74 65 20 69 6e 64   appropriate ind
149d0 65 78 2e 20 20 49 66 20 74 68 65 20 6d 69 6e 28  ex.  If the min(
149e0 29 20 6f 72 20 6d 61 78 28 29 20 69 73 20 6f 6e  ) or max() is on
149f0 20 61 6e 20 49 4e 54 45 47 45 52 20 50 52 49 4d   an INTEGER PRIM
14a00 41 52 59 0a 20 20 2a 2a 20 6b 65 79 20 63 6f 6c  ARY.  ** key col
14a10 75 6d 6e 2c 20 6e 6f 20 69 6e 64 65 78 20 69 73  umn, no index is
14a20 20 6e 65 63 65 73 73 61 72 79 20 73 6f 20 73 65   necessary so se
14a30 74 20 70 49 64 78 20 74 6f 20 4e 55 4c 4c 2e 20  t pIdx to NULL. 
14a40 20 49 66 20 6e 6f 0a 20 20 2a 2a 20 75 73 61 62   If no.  ** usab
14a50 6c 65 20 69 6e 64 65 78 20 69 73 20 66 6f 75 6e  le index is foun
14a60 64 2c 20 72 65 74 75 72 6e 20 30 2e 0a 20 20 2a  d, return 0..  *
14a70 2f 0a 20 20 69 66 28 20 69 43 6f 6c 3c 30 20 29  /.  if( iCol<0 )
14a80 7b 0a 20 20 20 20 70 49 64 78 20 3d 20 30 3b 0a  {.    pIdx = 0;.
14a90 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 43 6f 6c    }else{.    Col
14aa0 6c 53 65 71 20 2a 70 43 6f 6c 6c 20 3d 20 73 71  lSeq *pColl = sq
14ab0 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c 53 65 71  lite3ExprCollSeq
14ac0 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 29 3b  (pParse, pExpr);
14ad0 0a 20 20 20 20 69 66 28 20 70 43 6f 6c 6c 3d 3d  .    if( pColl==
14ae0 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  0 ) return 0;.  
14af0 20 20 66 6f 72 28 70 49 64 78 3d 70 54 61 62 2d    for(pIdx=pTab-
14b00 3e 70 49 6e 64 65 78 3b 20 70 49 64 78 3b 20 70  >pIndex; pIdx; p
14b10 49 64 78 3d 70 49 64 78 2d 3e 70 4e 65 78 74 29  Idx=pIdx->pNext)
14b20 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
14b30 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 3e 3d 31  pIdx->nColumn>=1
14b40 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 49   );.      if( pI
14b50 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 30 5d 3d  dx->aiColumn[0]=
14b60 3d 69 43 6f 6c 20 26 26 20 0a 20 20 20 20 20 20  =iCol && .      
14b70 20 20 20 20 30 3d 3d 73 71 6c 69 74 65 33 53 74      0==sqlite3St
14b80 72 49 43 6d 70 28 70 49 64 78 2d 3e 61 7a 43 6f  rICmp(pIdx->azCo
14b90 6c 6c 5b 30 5d 2c 20 70 43 6f 6c 6c 2d 3e 7a 4e  ll[0], pColl->zN
14ba0 61 6d 65 29 20 29 7b 0a 20 20 20 20 20 20 20 20  ame) ){.        
14bb0 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20  break;.      }. 
14bc0 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 49 64     }.    if( pId
14bd0 78 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b  x==0 ) return 0;
14be0 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 64 65 6e 74  .  }..  /* Ident
14bf0 69 66 79 20 63 6f 6c 75 6d 6e 20 74 79 70 65 73  ify column types
14c00 20 69 66 20 77 65 20 77 69 6c 6c 20 62 65 20 75   if we will be u
14c10 73 69 6e 67 20 74 68 65 20 63 61 6c 6c 62 61 63  sing the callbac
14c20 6b 2e 20 20 54 68 69 73 0a 20 20 2a 2a 20 73 74  k.  This.  ** st
14c30 65 70 20 69 73 20 73 6b 69 70 70 65 64 20 69 66  ep is skipped if
14c40 20 74 68 65 20 6f 75 74 70 75 74 20 69 73 20 67   the output is g
14c50 6f 69 6e 67 20 74 6f 20 61 20 74 61 62 6c 65 20  oing to a table 
14c60 6f 72 20 61 20 6d 65 6d 6f 72 79 20 63 65 6c 6c  or a memory cell
14c70 2e 0a 20 20 2a 2a 20 54 68 65 20 63 6f 6c 75 6d  ..  ** The colum
14c80 6e 20 6e 61 6d 65 73 20 68 61 76 65 20 61 6c 72  n names have alr
14c90 65 61 64 79 20 62 65 65 6e 20 67 65 6e 65 72 61  eady been genera
14ca0 74 65 64 20 69 6e 20 74 68 65 20 63 61 6c 6c 69  ted in the calli
14cb0 6e 67 20 66 75 6e 63 74 69 6f 6e 2e 0a 20 20 2a  ng function..  *
14cc0 2f 0a 20 20 76 20 3d 20 73 71 6c 69 74 65 33 47  /.  v = sqlite3G
14cd0 65 74 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a  etVdbe(pParse);.
14ce0 20 20 69 66 28 20 76 3d 3d 30 20 29 20 72 65 74    if( v==0 ) ret
14cf0 75 72 6e 20 30 3b 0a 0a 20 20 2f 2a 20 49 66 20  urn 0;..  /* If 
14d00 74 68 65 20 6f 75 74 70 75 74 20 69 73 20 64 65  the output is de
14d10 73 74 69 6e 65 64 20 66 6f 72 20 61 20 74 65 6d  stined for a tem
14d20 70 6f 72 61 72 79 20 74 61 62 6c 65 2c 20 6f 70  porary table, op
14d30 65 6e 20 74 68 61 74 20 74 61 62 6c 65 2e 0a 20  en that table.. 
14d40 20 2a 2f 0a 20 20 69 66 28 20 65 44 65 73 74 3d   */.  if( eDest=
14d50 3d 53 52 54 5f 45 70 68 65 6d 54 61 62 20 29 7b  =SRT_EphemTab ){
14d60 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
14d70 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4f 70 65 6e  AddOp(v, OP_Open
14d80 45 70 68 65 6d 65 72 61 6c 2c 20 69 50 61 72 6d  Ephemeral, iParm
14d90 2c 20 31 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  , 1);.  }..  /* 
14da0 47 65 6e 65 72 61 74 69 6e 67 20 63 6f 64 65 20  Generating code 
14db0 74 6f 20 66 69 6e 64 20 74 68 65 20 6d 69 6e 20  to find the min 
14dc0 6f 72 20 74 68 65 20 6d 61 78 2e 20 20 42 61 73  or the max.  Bas
14dd0 69 63 61 6c 6c 79 20 61 6c 6c 20 77 65 20 68 61  ically all we ha
14de0 76 65 0a 20 20 2a 2a 20 74 6f 20 64 6f 20 69 73  ve.  ** to do is
14df0 20 66 69 6e 64 20 74 68 65 20 66 69 72 73 74 20   find the first 
14e00 6f 72 20 74 68 65 20 6c 61 73 74 20 65 6e 74 72  or the last entr
14e10 79 20 69 6e 20 74 68 65 20 63 68 6f 73 65 6e 20  y in the chosen 
14e20 69 6e 64 65 78 2e 20 20 49 66 0a 20 20 2a 2a 20  index.  If.  ** 
14e30 74 68 65 20 6d 69 6e 28 29 20 6f 72 20 6d 61 78  the min() or max
14e40 28 29 20 69 73 20 6f 6e 20 74 68 65 20 49 4e 54  () is on the INT
14e50 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59  EGER PRIMARY KEY
14e60 2c 20 74 68 65 6e 20 66 69 6e 64 20 74 68 65 20  , then find the 
14e70 66 69 72 73 74 0a 20 20 2a 2a 20 6f 72 20 6c 61  first.  ** or la
14e80 73 74 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20  st entry in the 
14e90 6d 61 69 6e 20 74 61 62 6c 65 2e 0a 20 20 2a 2f  main table..  */
14ea0 0a 20 20 69 44 62 20 3d 20 73 71 6c 69 74 65 33  .  iDb = sqlite3
14eb0 53 63 68 65 6d 61 54 6f 49 6e 64 65 78 28 70 50  SchemaToIndex(pP
14ec0 61 72 73 65 2d 3e 64 62 2c 20 70 54 61 62 2d 3e  arse->db, pTab->
14ed0 70 53 63 68 65 6d 61 29 3b 0a 20 20 61 73 73 65  pSchema);.  asse
14ee0 72 74 28 20 69 44 62 3e 3d 30 20 7c 7c 20 70 54  rt( iDb>=0 || pT
14ef0 61 62 2d 3e 69 73 45 70 68 65 6d 20 29 3b 0a 20  ab->isEphem );. 
14f00 20 73 71 6c 69 74 65 33 43 6f 64 65 56 65 72 69   sqlite3CodeVeri
14f10 66 79 53 63 68 65 6d 61 28 70 50 61 72 73 65 2c  fySchema(pParse,
14f20 20 69 44 62 29 3b 0a 20 20 73 71 6c 69 74 65 33   iDb);.  sqlite3
14f30 54 61 62 6c 65 4c 6f 63 6b 28 70 50 61 72 73 65  TableLock(pParse
14f40 2c 20 69 44 62 2c 20 70 54 61 62 2d 3e 74 6e 75  , iDb, pTab->tnu
14f50 6d 2c 20 30 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d  m, 0, pTab->zNam
14f60 65 29 3b 0a 20 20 62 61 73 65 20 3d 20 70 53 72  e);.  base = pSr
14f70 63 2d 3e 61 5b 30 5d 2e 69 43 75 72 73 6f 72 3b  c->a[0].iCursor;
14f80 0a 20 20 62 72 6b 20 3d 20 73 71 6c 69 74 65 33  .  brk = sqlite3
14f90 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29  VdbeMakeLabel(v)
14fa0 3b 0a 20 20 63 6f 6d 70 75 74 65 4c 69 6d 69 74  ;.  computeLimit
14fb0 52 65 67 69 73 74 65 72 73 28 70 50 61 72 73 65  Registers(pParse
14fc0 2c 20 70 2c 20 62 72 6b 29 3b 0a 20 20 69 66 28  , p, brk);.  if(
14fd0 20 70 53 72 63 2d 3e 61 5b 30 5d 2e 70 53 65 6c   pSrc->a[0].pSel
14fe0 65 63 74 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71  ect==0 ){.    sq
14ff0 6c 69 74 65 33 4f 70 65 6e 54 61 62 6c 65 28 70  lite3OpenTable(p
15000 50 61 72 73 65 2c 20 62 61 73 65 2c 20 69 44 62  Parse, base, iDb
15010 2c 20 70 54 61 62 2c 20 4f 50 5f 4f 70 65 6e 52  , pTab, OP_OpenR
15020 65 61 64 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  ead);.  }.  if( 
15030 70 49 64 78 3d 3d 30 20 29 7b 0a 20 20 20 20 73  pIdx==0 ){.    s
15040 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
15050 76 2c 20 73 65 65 6b 4f 70 2c 20 62 61 73 65 2c  v, seekOp, base,
15060 20 30 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20   0);.  }else{.  
15070 20 20 2f 2a 20 45 76 65 6e 20 74 68 6f 75 67 68    /* Even though
15080 20 74 68 65 20 63 75 72 73 6f 72 20 75 73 65 64   the cursor used
15090 20 74 6f 20 6f 70 65 6e 20 74 68 65 20 69 6e 64   to open the ind
150a0 65 78 20 68 65 72 65 20 69 73 20 63 6c 6f 73 65  ex here is close
150b0 64 0a 20 20 20 20 2a 2a 20 61 73 20 73 6f 6f 6e  d.    ** as soon
150c0 20 61 73 20 61 20 73 69 6e 67 6c 65 20 76 61 6c   as a single val
150d0 75 65 20 68 61 73 20 62 65 65 6e 20 72 65 61 64  ue has been read
150e0 20 66 72 6f 6d 20 69 74 2c 20 61 6c 6c 6f 63 61   from it, alloca
150f0 74 65 20 69 74 0a 20 20 20 20 2a 2a 20 75 73 69  te it.    ** usi
15100 6e 67 20 28 70 50 61 72 73 65 2d 3e 6e 54 61 62  ng (pParse->nTab
15110 2b 2b 29 20 74 6f 20 70 72 65 76 65 6e 74 20 74  ++) to prevent t
15120 68 65 20 63 75 72 73 6f 72 20 69 64 20 66 72 6f  he cursor id fro
15130 6d 20 62 65 69 6e 67 20 0a 20 20 20 20 2a 2a 20  m being .    ** 
15140 72 65 75 73 65 64 2e 20 54 68 69 73 20 69 73 20  reused. This is 
15150 69 6d 70 6f 72 74 61 6e 74 20 66 6f 72 20 73 74  important for st
15160 61 74 65 6d 65 6e 74 73 20 6f 66 20 74 68 65 20  atements of the 
15170 66 6f 72 6d 20 0a 20 20 20 20 2a 2a 20 22 49 4e  form .    ** "IN
15180 53 45 52 54 20 49 4e 54 4f 20 78 20 53 45 4c 45  SERT INTO x SELE
15190 43 54 20 6d 61 78 28 29 20 46 52 4f 4d 20 78 22  CT max() FROM x"
151a0 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 6e 74  ..    */.    int
151b0 20 69 49 64 78 3b 0a 20 20 20 20 4b 65 79 49 6e   iIdx;.    KeyIn
151c0 66 6f 20 2a 70 4b 65 79 20 3d 20 73 71 6c 69 74  fo *pKey = sqlit
151d0 65 33 49 6e 64 65 78 4b 65 79 69 6e 66 6f 28 70  e3IndexKeyinfo(p
151e0 50 61 72 73 65 2c 20 70 49 64 78 29 3b 0a 20 20  Parse, pIdx);.  
151f0 20 20 69 49 64 78 20 3d 20 70 50 61 72 73 65 2d    iIdx = pParse-
15200 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20 61 73 73  >nTab++;.    ass
15210 65 72 74 28 20 70 49 64 78 2d 3e 70 53 63 68 65  ert( pIdx->pSche
15220 6d 61 3d 3d 70 54 61 62 2d 3e 70 53 63 68 65 6d  ma==pTab->pSchem
15230 61 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  a );.    sqlite3
15240 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
15250 49 6e 74 65 67 65 72 2c 20 69 44 62 2c 20 30 29  Integer, iDb, 0)
15260 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
15270 65 4f 70 33 28 76 2c 20 4f 50 5f 4f 70 65 6e 52  eOp3(v, OP_OpenR
15280 65 61 64 2c 20 69 49 64 78 2c 20 70 49 64 78 2d  ead, iIdx, pIdx-
15290 3e 74 6e 75 6d 2c 20 0a 20 20 20 20 20 20 20 20  >tnum, .        
152a0 28 63 68 61 72 2a 29 70 4b 65 79 2c 20 50 33 5f  (char*)pKey, P3_
152b0 4b 45 59 49 4e 46 4f 5f 48 41 4e 44 4f 46 46 29  KEYINFO_HANDOFF)
152c0 3b 0a 20 20 20 20 69 66 28 20 73 65 65 6b 4f 70  ;.    if( seekOp
152d0 3d 3d 4f 50 5f 52 65 77 69 6e 64 20 29 7b 0a 20  ==OP_Rewind ){. 
152e0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
152f0 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4e 75 6c 6c  AddOp(v, OP_Null
15300 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 73  , 0, 0);.      s
15310 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
15320 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64  v, OP_MakeRecord
15330 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20 20 20 73  , 1, 0);.      s
15340 65 65 6b 4f 70 20 3d 20 4f 50 5f 4d 6f 76 65 47  eekOp = OP_MoveG
15350 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  t;.    }.    if(
15360 20 70 49 64 78 2d 3e 61 53 6f 72 74 4f 72 64 65   pIdx->aSortOrde
15370 72 5b 30 5d 3d 3d 53 51 4c 49 54 45 5f 53 4f 5f  r[0]==SQLITE_SO_
15380 44 45 53 43 20 29 7b 0a 20 20 20 20 20 20 2f 2a  DESC ){.      /*
15390 20 54 69 63 6b 65 74 20 23 32 35 31 34 3a 20 69   Ticket #2514: i
153a0 6e 76 65 72 74 20 74 68 65 20 73 65 65 6b 20 6f  nvert the seek o
153b0 70 65 72 61 74 6f 72 20 69 66 20 77 65 20 61 72  perator if we ar
153c0 65 20 75 73 69 6e 67 0a 20 20 20 20 20 20 2a 2a  e using.      **
153d0 20 61 20 64 65 73 63 65 6e 64 69 6e 67 20 69 6e   a descending in
153e0 64 65 78 2e 20 2a 2f 0a 20 20 20 20 20 20 69 66  dex. */.      if
153f0 28 20 73 65 65 6b 4f 70 3d 3d 4f 50 5f 4c 61 73  ( seekOp==OP_Las
15400 74 20 29 7b 0a 20 20 20 20 20 20 20 20 73 65 65  t ){.        see
15410 6b 4f 70 20 3d 20 4f 50 5f 52 65 77 69 6e 64 3b  kOp = OP_Rewind;
15420 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
15430 20 20 20 20 20 20 61 73 73 65 72 74 28 20 73 65        assert( se
15440 65 6b 4f 70 3d 3d 4f 50 5f 4d 6f 76 65 47 74 20  ekOp==OP_MoveGt 
15450 29 3b 0a 20 20 20 20 20 20 20 20 73 65 65 6b 4f  );.        seekO
15460 70 20 3d 20 4f 50 5f 4d 6f 76 65 4c 74 3b 0a 20  p = OP_MoveLt;. 
15470 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
15480 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
15490 70 28 76 2c 20 73 65 65 6b 4f 70 2c 20 69 49 64  p(v, seekOp, iId
154a0 78 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74  x, 0);.    sqlit
154b0 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
154c0 50 5f 49 64 78 52 6f 77 69 64 2c 20 69 49 64 78  P_IdxRowid, iIdx
154d0 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  , 0);.    sqlite
154e0 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
154f0 5f 43 6c 6f 73 65 2c 20 69 49 64 78 2c 20 30 29  _Close, iIdx, 0)
15500 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
15510 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 6f 76  eAddOp(v, OP_Mov
15520 65 47 65 2c 20 62 61 73 65 2c 20 30 29 3b 0a 20  eGe, base, 0);. 
15530 20 7d 0a 20 20 65 4c 69 73 74 2e 6e 45 78 70 72   }.  eList.nExpr
15540 20 3d 20 31 3b 0a 20 20 6d 65 6d 73 65 74 28 26   = 1;.  memset(&
15550 65 4c 69 73 74 49 74 65 6d 2c 20 30 2c 20 73 69  eListItem, 0, si
15560 7a 65 6f 66 28 65 4c 69 73 74 49 74 65 6d 29 29  zeof(eListItem))
15570 3b 0a 20 20 65 4c 69 73 74 2e 61 20 3d 20 26 65  ;.  eList.a = &e
15580 4c 69 73 74 49 74 65 6d 3b 0a 20 20 65 4c 69 73  ListItem;.  eLis
15590 74 2e 61 5b 30 5d 2e 70 45 78 70 72 20 3d 20 70  t.a[0].pExpr = p
155a0 45 78 70 72 3b 0a 20 20 73 65 6c 65 63 74 49 6e  Expr;.  selectIn
155b0 6e 65 72 4c 6f 6f 70 28 70 50 61 72 73 65 2c 20  nerLoop(pParse, 
155c0 70 2c 20 26 65 4c 69 73 74 2c 20 30 2c 20 30 2c  p, &eList, 0, 0,
155d0 20 30 2c 20 2d 31 2c 20 65 44 65 73 74 2c 20 69   0, -1, eDest, i
155e0 50 61 72 6d 2c 20 62 72 6b 2c 20 62 72 6b 2c 20  Parm, brk, brk, 
155f0 30 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  0);.  sqlite3Vdb
15600 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c  eResolveLabel(v,
15610 20 62 72 6b 29 3b 0a 20 20 73 71 6c 69 74 65 33   brk);.  sqlite3
15620 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
15630 43 6c 6f 73 65 2c 20 62 61 73 65 2c 20 30 29 3b  Close, base, 0);
15640 0a 20 20 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a  .  .  return 1;.
15650 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6e 61 6c 79 7a 65  }../*.** Analyze
15660 20 61 6e 64 20 4f 52 44 45 52 20 42 59 20 6f 72   and ORDER BY or
15670 20 47 52 4f 55 50 20 42 59 20 63 6c 61 75 73 65   GROUP BY clause
15680 20 69 6e 20 61 20 53 45 4c 45 43 54 20 73 74 61   in a SELECT sta
15690 74 65 6d 65 6e 74 2e 20 20 52 65 74 75 72 6e 0a  tement.  Return.
156a0 2a 2a 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  ** the number of
156b0 20 65 72 72 6f 72 73 20 73 65 65 6e 2e 0a 2a 2a   errors seen..**
156c0 0a 2a 2a 20 41 6e 20 4f 52 44 45 52 20 42 59 20  .** An ORDER BY 
156d0 6f 72 20 47 52 4f 55 50 20 42 59 20 69 73 20 61  or GROUP BY is a
156e0 20 6c 69 73 74 20 6f 66 20 65 78 70 72 65 73 73   list of express
156f0 69 6f 6e 73 2e 20 20 49 66 20 61 6e 79 20 65 78  ions.  If any ex
15700 70 72 65 73 73 69 6f 6e 0a 2a 2a 20 69 73 20 61  pression.** is a
15710 6e 20 69 6e 74 65 67 65 72 20 63 6f 6e 73 74 61  n integer consta
15720 6e 74 2c 20 74 68 65 6e 20 74 68 61 74 20 65 78  nt, then that ex
15730 70 72 65 73 73 69 6f 6e 20 69 73 20 72 65 70 6c  pression is repl
15740 61 63 65 64 20 62 79 20 74 68 65 0a 2a 2a 20 63  aced by the.** c
15750 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 65 6e 74  orresponding ent
15760 72 79 20 69 6e 20 74 68 65 20 72 65 73 75 6c 74  ry in the result
15770 20 73 65 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20   set..*/.static 
15780 69 6e 74 20 70 72 6f 63 65 73 73 4f 72 64 65 72  int processOrder
15790 47 72 6f 75 70 42 79 28 0a 20 20 4e 61 6d 65 43  GroupBy(.  NameC
157a0 6f 6e 74 65 78 74 20 2a 70 4e 43 2c 20 20 20 20  ontext *pNC,    
157b0 20 2f 2a 20 4e 61 6d 65 20 63 6f 6e 74 65 78 74   /* Name context
157c0 20 6f 66 20 74 68 65 20 53 45 4c 45 43 54 20 73   of the SELECT s
157d0 74 61 74 65 6d 65 6e 74 2e 20 2a 2f 0a 20 20 45  tatement. */.  E
157e0 78 70 72 4c 69 73 74 20 2a 70 4f 72 64 65 72 42  xprList *pOrderB
157f0 79 2c 20 20 20 2f 2a 20 54 68 65 20 4f 52 44 45  y,   /* The ORDE
15800 52 20 42 59 20 6f 72 20 47 52 4f 55 50 20 42 59  R BY or GROUP BY
15810 20 63 6c 61 75 73 65 20 74 6f 20 62 65 20 70 72   clause to be pr
15820 6f 63 65 73 73 65 64 20 2a 2f 0a 20 20 63 6f 6e  ocessed */.  con
15830 73 74 20 63 68 61 72 20 2a 7a 54 79 70 65 20 20  st char *zType  
15840 20 20 20 2f 2a 20 45 69 74 68 65 72 20 22 4f 52     /* Either "OR
15850 44 45 52 22 20 6f 72 20 22 47 52 4f 55 50 22 2c  DER" or "GROUP",
15860 20 61 73 20 61 70 70 72 6f 70 72 69 61 74 65 20   as appropriate 
15870 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20  */.){.  int i;. 
15880 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73   ExprList *pELis
15890 74 20 3d 20 70 4e 43 2d 3e 70 45 4c 69 73 74 3b  t = pNC->pEList;
158a0 20 20 20 20 20 2f 2a 20 54 68 65 20 72 65 73 75       /* The resu
158b0 6c 74 20 73 65 74 20 6f 66 20 74 68 65 20 53 45  lt set of the SE
158c0 4c 45 43 54 20 2a 2f 0a 20 20 50 61 72 73 65 20  LECT */.  Parse 
158d0 2a 70 50 61 72 73 65 20 3d 20 70 4e 43 2d 3e 70  *pParse = pNC->p
158e0 50 61 72 73 65 3b 20 20 20 20 20 2f 2a 20 54 68  Parse;     /* Th
158f0 65 20 72 65 73 75 6c 74 20 73 65 74 20 6f 66 20  e result set of 
15900 74 68 65 20 53 45 4c 45 43 54 20 2a 2f 0a 20 20  the SELECT */.  
15910 61 73 73 65 72 74 28 20 70 45 4c 69 73 74 20 29  assert( pEList )
15920 3b 0a 0a 20 20 69 66 28 20 70 4f 72 64 65 72 42  ;..  if( pOrderB
15930 79 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b  y==0 ) return 0;
15940 0a 20 20 69 66 28 20 70 4f 72 64 65 72 42 79 2d  .  if( pOrderBy-
15950 3e 6e 45 78 70 72 3e 53 51 4c 49 54 45 5f 4d 41  >nExpr>SQLITE_MA
15960 58 5f 43 4f 4c 55 4d 4e 20 29 7b 0a 20 20 20 20  X_COLUMN ){.    
15970 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
15980 70 50 61 72 73 65 2c 20 22 74 6f 6f 20 6d 61 6e  pParse, "too man
15990 79 20 74 65 72 6d 73 20 69 6e 20 25 73 20 42 59  y terms in %s BY
159a0 20 63 6c 61 75 73 65 22 2c 20 7a 54 79 70 65 29   clause", zType)
159b0 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a  ;.    return 1;.
159c0 20 20 7d 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69    }.  for(i=0; i
159d0 3c 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72  <pOrderBy->nExpr
159e0 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 6e 74 20  ; i++){.    int 
159f0 69 43 6f 6c 3b 0a 20 20 20 20 45 78 70 72 20 2a  iCol;.    Expr *
15a00 70 45 20 3d 20 70 4f 72 64 65 72 42 79 2d 3e 61  pE = pOrderBy->a
15a10 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 69  [i].pExpr;.    i
15a20 66 28 20 73 71 6c 69 74 65 33 45 78 70 72 49 73  f( sqlite3ExprIs
15a30 49 6e 74 65 67 65 72 28 70 45 2c 20 26 69 43 6f  Integer(pE, &iCo
15a40 6c 29 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  l) ){.      if( 
15a50 69 43 6f 6c 3e 30 20 26 26 20 69 43 6f 6c 3c 3d  iCol>0 && iCol<=
15a60 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 20 29 7b  pEList->nExpr ){
15a70 0a 20 20 20 20 20 20 20 20 43 6f 6c 6c 53 65 71  .        CollSeq
15a80 20 2a 70 43 6f 6c 6c 20 3d 20 70 45 2d 3e 70 43   *pColl = pE->pC
15a90 6f 6c 6c 3b 0a 20 20 20 20 20 20 20 20 69 6e 74  oll;.        int
15aa0 20 66 6c 61 67 73 20 3d 20 70 45 2d 3e 66 6c 61   flags = pE->fla
15ab0 67 73 20 26 20 45 50 5f 45 78 70 43 6f 6c 6c 61  gs & EP_ExpColla
15ac0 74 65 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  te;.        sqli
15ad0 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 70 45  te3ExprDelete(pE
15ae0 29 3b 0a 20 20 20 20 20 20 20 20 70 45 20 3d 20  );.        pE = 
15af0 73 71 6c 69 74 65 33 45 78 70 72 44 75 70 28 70  sqlite3ExprDup(p
15b00 50 61 72 73 65 2d 3e 64 62 2c 20 70 45 4c 69 73  Parse->db, pELis
15b10 74 2d 3e 61 5b 69 43 6f 6c 2d 31 5d 2e 70 45 78  t->a[iCol-1].pEx
15b20 70 72 29 3b 0a 20 20 20 20 20 20 20 20 70 4f 72  pr);.        pOr
15b30 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 70 45 78 70  derBy->a[i].pExp
15b40 72 20 3d 20 70 45 3b 0a 20 20 20 20 20 20 20 20  r = pE;.        
15b50 69 66 28 20 70 43 6f 6c 6c 20 26 26 20 66 6c 61  if( pColl && fla
15b60 67 73 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  gs ){.          
15b70 70 45 2d 3e 70 43 6f 6c 6c 20 3d 20 70 43 6f 6c  pE->pColl = pCol
15b80 6c 3b 0a 20 20 20 20 20 20 20 20 20 20 70 45 2d  l;.          pE-
15b90 3e 66 6c 61 67 73 20 7c 3d 20 66 6c 61 67 73 3b  >flags |= flags;
15ba0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
15bb0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
15bc0 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
15bd0 70 50 61 72 73 65 2c 20 0a 20 20 20 20 20 20 20  pParse, .       
15be0 20 20 20 20 22 25 73 20 42 59 20 63 6f 6c 75 6d      "%s BY colum
15bf0 6e 20 6e 75 6d 62 65 72 20 25 64 20 6f 75 74 20  n number %d out 
15c00 6f 66 20 72 61 6e 67 65 20 2d 20 73 68 6f 75 6c  of range - shoul
15c10 64 20 62 65 20 22 0a 20 20 20 20 20 20 20 20 20  d be ".         
15c20 20 20 22 62 65 74 77 65 65 6e 20 31 20 61 6e 64    "between 1 and
15c30 20 25 64 22 2c 20 7a 54 79 70 65 2c 20 69 43 6f   %d", zType, iCo
15c40 6c 2c 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72  l, pEList->nExpr
15c50 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  );.        retur
15c60 6e 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  n 1;.      }.   
15c70 20 7d 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74   }.    if( sqlit
15c80 65 33 45 78 70 72 52 65 73 6f 6c 76 65 4e 61 6d  e3ExprResolveNam
15c90 65 73 28 70 4e 43 2c 20 70 45 29 20 29 7b 0a 20  es(pNC, pE) ){. 
15ca0 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20       return 1;. 
15cb0 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
15cc0 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  n 0;.}../*.** Th
15cd0 69 73 20 72 6f 75 74 69 6e 65 20 72 65 73 6f 6c  is routine resol
15ce0 76 65 73 20 61 6e 79 20 6e 61 6d 65 73 20 75 73  ves any names us
15cf0 65 64 20 69 6e 20 74 68 65 20 72 65 73 75 6c 74  ed in the result
15d00 20 73 65 74 20 6f 66 20 74 68 65 0a 2a 2a 20 73   set of the.** s
15d10 75 70 70 6c 69 65 64 20 53 45 4c 45 43 54 20 73  upplied SELECT s
15d20 74 61 74 65 6d 65 6e 74 2e 20 49 66 20 74 68 65  tatement. If the
15d30 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
15d40 74 20 62 65 69 6e 67 20 72 65 73 6f 6c 76 65 64  t being resolved
15d50 0a 2a 2a 20 69 73 20 61 20 73 75 62 2d 73 65 6c  .** is a sub-sel
15d60 65 63 74 2c 20 74 68 65 6e 20 70 4f 75 74 65 72  ect, then pOuter
15d70 4e 43 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20  NC is a pointer 
15d80 74 6f 20 74 68 65 20 4e 61 6d 65 43 6f 6e 74 65  to the NameConte
15d90 78 74 20 0a 2a 2a 20 6f 66 20 74 68 65 20 70 61  xt .** of the pa
15da0 72 65 6e 74 20 53 45 4c 45 43 54 2e 0a 2a 2f 0a  rent SELECT..*/.
15db0 69 6e 74 20 73 71 6c 69 74 65 33 53 65 6c 65 63  int sqlite3Selec
15dc0 74 52 65 73 6f 6c 76 65 28 0a 20 20 50 61 72 73  tResolve(.  Pars
15dd0 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20  e *pParse,      
15de0 20 20 20 2f 2a 20 54 68 65 20 70 61 72 73 65 72     /* The parser
15df0 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53 65   context */.  Se
15e00 6c 65 63 74 20 2a 70 2c 20 20 20 20 20 20 20 20  lect *p,        
15e10 20 20 20 20 20 2f 2a 20 54 68 65 20 53 45 4c 45       /* The SELE
15e20 43 54 20 73 74 61 74 65 6d 65 6e 74 20 62 65 69  CT statement bei
15e30 6e 67 20 63 6f 64 65 64 2e 20 2a 2f 0a 20 20 4e  ng coded. */.  N
15e40 61 6d 65 43 6f 6e 74 65 78 74 20 2a 70 4f 75 74  ameContext *pOut
15e50 65 72 4e 43 20 20 2f 2a 20 54 68 65 20 6f 75 74  erNC  /* The out
15e60 65 72 20 6e 61 6d 65 20 63 6f 6e 74 65 78 74 2e  er name context.
15e70 20 4d 61 79 20 62 65 20 4e 55 4c 4c 2e 20 2a 2f   May be NULL. */
15e80 0a 29 7b 0a 20 20 45 78 70 72 4c 69 73 74 20 2a  .){.  ExprList *
15e90 70 45 4c 69 73 74 3b 20 20 20 20 20 20 20 20 20  pEList;         
15ea0 20 2f 2a 20 52 65 73 75 6c 74 20 73 65 74 2e 20   /* Result set. 
15eb0 2a 2f 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20  */.  int i;     
15ec0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15ed0 2f 2a 20 46 6f 72 2d 6c 6f 6f 70 20 76 61 72 69  /* For-loop vari
15ee0 61 62 6c 65 20 75 73 65 64 20 69 6e 20 6d 75 6c  able used in mul
15ef0 74 69 70 6c 65 20 70 6c 61 63 65 73 20 2a 2f 0a  tiple places */.
15f00 20 20 4e 61 6d 65 43 6f 6e 74 65 78 74 20 73 4e    NameContext sN
15f10 43 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  C;           /* 
15f20 4c 6f 63 61 6c 20 6e 61 6d 65 2d 63 6f 6e 74 65  Local name-conte
15f30 78 74 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74  xt */.  ExprList
15f40 20 2a 70 47 72 6f 75 70 42 79 3b 20 20 20 20 20   *pGroupBy;     
15f50 20 20 20 2f 2a 20 54 68 65 20 67 72 6f 75 70 20     /* The group 
15f60 62 79 20 63 6c 61 75 73 65 20 2a 2f 0a 0a 20 20  by clause */..  
15f70 2f 2a 20 49 66 20 74 68 69 73 20 72 6f 75 74 69  /* If this routi
15f80 6e 65 20 68 61 73 20 72 75 6e 20 62 65 66 6f 72  ne has run befor
15f90 65 2c 20 72 65 74 75 72 6e 20 69 6d 6d 65 64 69  e, return immedi
15fa0 61 74 65 6c 79 2e 20 2a 2f 0a 20 20 69 66 28 20  ately. */.  if( 
15fb0 70 2d 3e 69 73 52 65 73 6f 6c 76 65 64 20 29 7b  p->isResolved ){
15fc0 0a 20 20 20 20 61 73 73 65 72 74 28 20 21 70 4f  .    assert( !pO
15fd0 75 74 65 72 4e 43 20 29 3b 0a 20 20 20 20 72 65  uterNC );.    re
15fe0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
15ff0 20 20 7d 0a 20 20 70 2d 3e 69 73 52 65 73 6f 6c    }.  p->isResol
16000 76 65 64 20 3d 20 31 3b 0a 0a 20 20 2f 2a 20 49  ved = 1;..  /* I
16010 66 20 74 68 65 72 65 20 68 61 76 65 20 61 6c 72  f there have alr
16020 65 61 64 79 20 62 65 65 6e 20 65 72 72 6f 72 73  eady been errors
16030 2c 20 64 6f 20 6e 6f 74 68 69 6e 67 2e 20 2a 2f  , do nothing. */
16040 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e  .  if( pParse->n
16050 45 72 72 3e 30 20 29 7b 0a 20 20 20 20 72 65 74  Err>0 ){.    ret
16060 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52  urn SQLITE_ERROR
16070 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 50 72 65 70  ;.  }..  /* Prep
16080 61 72 65 20 74 68 65 20 73 65 6c 65 63 74 20 73  are the select s
16090 74 61 74 65 6d 65 6e 74 2e 20 54 68 69 73 20 63  tatement. This c
160a0 61 6c 6c 20 77 69 6c 6c 20 61 6c 6c 6f 63 61 74  all will allocat
160b0 65 20 61 6c 6c 20 63 75 72 73 6f 72 73 0a 20 20  e all cursors.  
160c0 2a 2a 20 72 65 71 75 69 72 65 64 20 74 6f 20 68  ** required to h
160d0 61 6e 64 6c 65 20 74 68 65 20 74 61 62 6c 65 73  andle the tables
160e0 20 61 6e 64 20 73 75 62 71 75 65 72 69 65 73 20   and subqueries 
160f0 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75  in the FROM clau
16100 73 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  se..  */.  if( p
16110 72 65 70 53 65 6c 65 63 74 53 74 6d 74 28 70 50  repSelectStmt(pP
16120 61 72 73 65 2c 20 70 29 20 29 7b 0a 20 20 20 20  arse, p) ){.    
16130 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52  return SQLITE_ER
16140 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52  ROR;.  }..  /* R
16150 65 73 6f 6c 76 65 20 74 68 65 20 65 78 70 72 65  esolve the expre
16160 73 73 69 6f 6e 73 20 69 6e 20 74 68 65 20 4c 49  ssions in the LI
16170 4d 49 54 20 61 6e 64 20 4f 46 46 53 45 54 20 63  MIT and OFFSET c
16180 6c 61 75 73 65 73 2e 20 54 68 65 73 65 0a 20 20  lauses. These.  
16190 2a 2a 20 61 72 65 20 6e 6f 74 20 61 6c 6c 6f 77  ** are not allow
161a0 65 64 20 74 6f 20 72 65 66 65 72 20 74 6f 20 61  ed to refer to a
161b0 6e 79 20 6e 61 6d 65 73 2c 20 73 6f 20 70 61 73  ny names, so pas
161c0 73 20 61 6e 20 65 6d 70 74 79 20 4e 61 6d 65 43  s an empty NameC
161d0 6f 6e 74 65 78 74 2e 0a 20 20 2a 2f 0a 20 20 6d  ontext..  */.  m
161e0 65 6d 73 65 74 28 26 73 4e 43 2c 20 30 2c 20 73  emset(&sNC, 0, s
161f0 69 7a 65 6f 66 28 73 4e 43 29 29 3b 0a 20 20 73  izeof(sNC));.  s
16200 4e 43 2e 70 50 61 72 73 65 20 3d 20 70 50 61 72  NC.pParse = pPar
16210 73 65 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65  se;.  if( sqlite
16220 33 45 78 70 72 52 65 73 6f 6c 76 65 4e 61 6d 65  3ExprResolveName
16230 73 28 26 73 4e 43 2c 20 70 2d 3e 70 4c 69 6d 69  s(&sNC, p->pLimi
16240 74 29 20 7c 7c 0a 20 20 20 20 20 20 73 71 6c 69  t) ||.      sqli
16250 74 65 33 45 78 70 72 52 65 73 6f 6c 76 65 4e 61  te3ExprResolveNa
16260 6d 65 73 28 26 73 4e 43 2c 20 70 2d 3e 70 4f 66  mes(&sNC, p->pOf
16270 66 73 65 74 29 20 29 7b 0a 20 20 20 20 72 65 74  fset) ){.    ret
16280 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52  urn SQLITE_ERROR
16290 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 65 74 20  ;.  }..  /* Set 
162a0 75 70 20 74 68 65 20 6c 6f 63 61 6c 20 6e 61 6d  up the local nam
162b0 65 2d 63 6f 6e 74 65 78 74 20 74 6f 20 70 61 73  e-context to pas
162c0 73 20 74 6f 20 45 78 70 72 52 65 73 6f 6c 76 65  s to ExprResolve
162d0 4e 61 6d 65 73 28 29 20 74 6f 0a 20 20 2a 2a 20  Names() to.  ** 
162e0 72 65 73 6f 6c 76 65 20 74 68 65 20 65 78 70 72  resolve the expr
162f0 65 73 73 69 6f 6e 2d 6c 69 73 74 2e 0a 20 20 2a  ession-list..  *
16300 2f 0a 20 20 73 4e 43 2e 61 6c 6c 6f 77 41 67 67  /.  sNC.allowAgg
16310 20 3d 20 31 3b 0a 20 20 73 4e 43 2e 70 53 72 63   = 1;.  sNC.pSrc
16320 4c 69 73 74 20 3d 20 70 2d 3e 70 53 72 63 3b 0a  List = p->pSrc;.
16330 20 20 73 4e 43 2e 70 4e 65 78 74 20 3d 20 70 4f    sNC.pNext = pO
16340 75 74 65 72 4e 43 3b 0a 0a 20 20 2f 2a 20 52 65  uterNC;..  /* Re
16350 73 6f 6c 76 65 20 6e 61 6d 65 73 20 69 6e 20 74  solve names in t
16360 68 65 20 72 65 73 75 6c 74 20 73 65 74 2e 20 2a  he result set. *
16370 2f 0a 20 20 70 45 4c 69 73 74 20 3d 20 70 2d 3e  /.  pEList = p->
16380 70 45 4c 69 73 74 3b 0a 20 20 69 66 28 20 21 70  pEList;.  if( !p
16390 45 4c 69 73 74 20 29 20 72 65 74 75 72 6e 20 53  EList ) return S
163a0 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 66  QLITE_ERROR;.  f
163b0 6f 72 28 69 3d 30 3b 20 69 3c 70 45 4c 69 73 74  or(i=0; i<pEList
163c0 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20  ->nExpr; i++){. 
163d0 20 20 20 45 78 70 72 20 2a 70 58 20 3d 20 70 45     Expr *pX = pE
163e0 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72  List->a[i].pExpr
163f0 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65  ;.    if( sqlite
16400 33 45 78 70 72 52 65 73 6f 6c 76 65 4e 61 6d 65  3ExprResolveName
16410 73 28 26 73 4e 43 2c 20 70 58 29 20 29 7b 0a 20  s(&sNC, pX) ){. 
16420 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
16430 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a  TE_ERROR;.    }.
16440 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65    }..  /* If the
16450 72 65 20 61 72 65 20 6e 6f 20 61 67 67 72 65 67  re are no aggreg
16460 61 74 65 20 66 75 6e 63 74 69 6f 6e 73 20 69 6e  ate functions in
16470 20 74 68 65 20 72 65 73 75 6c 74 2d 73 65 74 2c   the result-set,
16480 20 61 6e 64 20 6e 6f 20 47 52 4f 55 50 20 42 59   and no GROUP BY
16490 20 0a 20 20 2a 2a 20 65 78 70 72 65 73 73 69 6f   .  ** expressio
164a0 6e 2c 20 64 6f 20 6e 6f 74 20 61 6c 6c 6f 77 20  n, do not allow 
164b0 61 67 67 72 65 67 61 74 65 73 20 69 6e 20 61 6e  aggregates in an
164c0 79 20 6f 66 20 74 68 65 20 6f 74 68 65 72 20 65  y of the other e
164d0 78 70 72 65 73 73 69 6f 6e 73 2e 0a 20 20 2a 2f  xpressions..  */
164e0 0a 20 20 61 73 73 65 72 74 28 20 21 70 2d 3e 69  .  assert( !p->i
164f0 73 41 67 67 20 29 3b 0a 20 20 70 47 72 6f 75 70  sAgg );.  pGroup
16500 42 79 20 3d 20 70 2d 3e 70 47 72 6f 75 70 42 79  By = p->pGroupBy
16510 3b 0a 20 20 69 66 28 20 70 47 72 6f 75 70 42 79  ;.  if( pGroupBy
16520 20 7c 7c 20 73 4e 43 2e 68 61 73 41 67 67 20 29   || sNC.hasAgg )
16530 7b 0a 20 20 20 20 70 2d 3e 69 73 41 67 67 20 3d  {.    p->isAgg =
16540 20 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20   1;.  }else{.   
16550 20 73 4e 43 2e 61 6c 6c 6f 77 41 67 67 20 3d 20   sNC.allowAgg = 
16560 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20  0;.  }..  /* If 
16570 61 20 48 41 56 49 4e 47 20 63 6c 61 75 73 65 20  a HAVING clause 
16580 69 73 20 70 72 65 73 65 6e 74 2c 20 74 68 65 6e  is present, then
16590 20 74 68 65 72 65 20 6d 75 73 74 20 62 65 20 61   there must be a
165a0 20 47 52 4f 55 50 20 42 59 20 63 6c 61 75 73 65   GROUP BY clause
165b0 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e  ..  */.  if( p->
165c0 70 48 61 76 69 6e 67 20 26 26 20 21 70 47 72 6f  pHaving && !pGro
165d0 75 70 42 79 20 29 7b 0a 20 20 20 20 73 71 6c 69  upBy ){.    sqli
165e0 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
165f0 73 65 2c 20 22 61 20 47 52 4f 55 50 20 42 59 20  se, "a GROUP BY 
16600 63 6c 61 75 73 65 20 69 73 20 72 65 71 75 69 72  clause is requir
16610 65 64 20 62 65 66 6f 72 65 20 48 41 56 49 4e 47  ed before HAVING
16620 22 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53  ");.    return S
16630 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d  QLITE_ERROR;.  }
16640 0a 0a 20 20 2f 2a 20 41 64 64 20 74 68 65 20 65  ..  /* Add the e
16650 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 20 74  xpression list t
16660 6f 20 74 68 65 20 6e 61 6d 65 2d 63 6f 6e 74 65  o the name-conte
16670 78 74 20 62 65 66 6f 72 65 20 70 61 72 73 69 6e  xt before parsin
16680 67 20 74 68 65 0a 20 20 2a 2a 20 6f 74 68 65 72  g the.  ** other
16690 20 65 78 70 72 65 73 73 69 6f 6e 73 20 69 6e 20   expressions in 
166a0 74 68 65 20 53 45 4c 45 43 54 20 73 74 61 74 65  the SELECT state
166b0 6d 65 6e 74 2e 20 54 68 69 73 20 69 73 20 73 6f  ment. This is so
166c0 20 74 68 61 74 0a 20 20 2a 2a 20 65 78 70 72 65   that.  ** expre
166d0 73 73 69 6f 6e 73 20 69 6e 20 74 68 65 20 57 48  ssions in the WH
166e0 45 52 45 20 63 6c 61 75 73 65 20 28 65 74 63 2e  ERE clause (etc.
166f0 29 20 63 61 6e 20 72 65 66 65 72 20 74 6f 20 65  ) can refer to e
16700 78 70 72 65 73 73 69 6f 6e 73 20 62 79 0a 20 20  xpressions by.  
16710 2a 2a 20 61 6c 69 61 73 65 73 20 69 6e 20 74 68  ** aliases in th
16720 65 20 72 65 73 75 6c 74 20 73 65 74 2e 0a 20 20  e result set..  
16730 2a 2a 0a 20 20 2a 2a 20 4d 69 6e 6f 72 20 70 6f  **.  ** Minor po
16740 69 6e 74 3a 20 49 66 20 74 68 69 73 20 69 73 20  int: If this is 
16750 74 68 65 20 63 61 73 65 2c 20 74 68 65 6e 20 74  the case, then t
16760 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 77 69  he expression wi
16770 6c 6c 20 62 65 0a 20 20 2a 2a 20 72 65 2d 65 76  ll be.  ** re-ev
16780 61 6c 75 61 74 65 64 20 66 6f 72 20 65 61 63 68  aluated for each
16790 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20 69 74   reference to it
167a0 2e 0a 20 20 2a 2f 0a 20 20 73 4e 43 2e 70 45 4c  ..  */.  sNC.pEL
167b0 69 73 74 20 3d 20 70 2d 3e 70 45 4c 69 73 74 3b  ist = p->pEList;
167c0 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 45 78  .  if( sqlite3Ex
167d0 70 72 52 65 73 6f 6c 76 65 4e 61 6d 65 73 28 26  prResolveNames(&
167e0 73 4e 43 2c 20 70 2d 3e 70 57 68 65 72 65 29 20  sNC, p->pWhere) 
167f0 7c 7c 0a 20 20 20 20 20 73 71 6c 69 74 65 33 45  ||.     sqlite3E
16800 78 70 72 52 65 73 6f 6c 76 65 4e 61 6d 65 73 28  xprResolveNames(
16810 26 73 4e 43 2c 20 70 2d 3e 70 48 61 76 69 6e 67  &sNC, p->pHaving
16820 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  ) ){.    return 
16830 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20  SQLITE_ERROR;.  
16840 7d 0a 20 20 69 66 28 20 70 2d 3e 70 50 72 69 6f  }.  if( p->pPrio
16850 72 3d 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20  r==0 ){.    if( 
16860 70 72 6f 63 65 73 73 4f 72 64 65 72 47 72 6f 75  processOrderGrou
16870 70 42 79 28 26 73 4e 43 2c 20 70 2d 3e 70 4f 72  pBy(&sNC, p->pOr
16880 64 65 72 42 79 2c 20 22 4f 52 44 45 52 22 29 20  derBy, "ORDER") 
16890 7c 7c 0a 20 20 20 20 20 20 20 20 70 72 6f 63 65  ||.        proce
168a0 73 73 4f 72 64 65 72 47 72 6f 75 70 42 79 28 26  ssOrderGroupBy(&
168b0 73 4e 43 2c 20 70 47 72 6f 75 70 42 79 2c 20 22  sNC, pGroupBy, "
168c0 47 52 4f 55 50 22 29 20 29 7b 0a 20 20 20 20 20  GROUP") ){.     
168d0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45   return SQLITE_E
168e0 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  RROR;.    }.  }.
168f0 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 64  .  if( pParse->d
16900 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
16910 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
16920 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a  LITE_NOMEM;.  }.
16930 0a 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20  .  /* Make sure 
16940 74 68 65 20 47 52 4f 55 50 20 42 59 20 63 6c 61  the GROUP BY cla
16950 75 73 65 20 64 6f 65 73 20 6e 6f 74 20 63 6f 6e  use does not con
16960 74 61 69 6e 20 61 67 67 72 65 67 61 74 65 20 66  tain aggregate f
16970 75 6e 63 74 69 6f 6e 73 2e 0a 20 20 2a 2f 0a 20  unctions..  */. 
16980 20 69 66 28 20 70 47 72 6f 75 70 42 79 20 29 7b   if( pGroupBy ){
16990 0a 20 20 20 20 73 74 72 75 63 74 20 45 78 70 72  .    struct Expr
169a0 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d  List_item *pItem
169b0 3b 0a 20 20 0a 20 20 20 20 66 6f 72 28 69 3d 30  ;.  .    for(i=0
169c0 2c 20 70 49 74 65 6d 3d 70 47 72 6f 75 70 42 79  , pItem=pGroupBy
169d0 2d 3e 61 3b 20 69 3c 70 47 72 6f 75 70 42 79 2d  ->a; i<pGroupBy-
169e0 3e 6e 45 78 70 72 3b 20 69 2b 2b 2c 20 70 49 74  >nExpr; i++, pIt
169f0 65 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28  em++){.      if(
16a00 20 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79   ExprHasProperty
16a10 28 70 49 74 65 6d 2d 3e 70 45 78 70 72 2c 20 45  (pItem->pExpr, E
16a20 50 5f 41 67 67 29 20 29 7b 0a 20 20 20 20 20 20  P_Agg) ){.      
16a30 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
16a40 67 28 70 50 61 72 73 65 2c 20 22 61 67 67 72 65  g(pParse, "aggre
16a50 67 61 74 65 20 66 75 6e 63 74 69 6f 6e 73 20 61  gate functions a
16a60 72 65 20 6e 6f 74 20 61 6c 6c 6f 77 65 64 20 69  re not allowed i
16a70 6e 20 22 0a 20 20 20 20 20 20 20 20 20 20 20 20  n ".            
16a80 22 74 68 65 20 47 52 4f 55 50 20 42 59 20 63 6c  "the GROUP BY cl
16a90 61 75 73 65 22 29 3b 0a 20 20 20 20 20 20 20 20  ause");.        
16aa0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52  return SQLITE_ER
16ab0 52 4f 52 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ROR;.      }.   
16ac0 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20   }.  }..  /* If 
16ad0 74 68 69 73 20 69 73 20 6f 6e 65 20 53 45 4c 45  this is one SELE
16ae0 43 54 20 6f 66 20 61 20 63 6f 6d 70 6f 75 6e 64  CT of a compound
16af0 2c 20 62 65 20 73 75 72 65 20 74 6f 20 72 65 73  , be sure to res
16b00 6f 6c 76 65 20 6e 61 6d 65 73 0a 20 20 2a 2a 20  olve names.  ** 
16b10 69 6e 20 74 68 65 20 6f 74 68 65 72 20 53 45 4c  in the other SEL
16b20 45 43 54 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  ECTs..  */.  if(
16b30 20 70 2d 3e 70 50 72 69 6f 72 20 29 7b 0a 20 20   p->pPrior ){.  
16b40 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33    return sqlite3
16b50 53 65 6c 65 63 74 52 65 73 6f 6c 76 65 28 70 50  SelectResolve(pP
16b60 61 72 73 65 2c 20 70 2d 3e 70 50 72 69 6f 72 2c  arse, p->pPrior,
16b70 20 70 4f 75 74 65 72 4e 43 29 3b 0a 20 20 7d 65   pOuterNC);.  }e
16b80 6c 73 65 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  lse{.    return 
16b90 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 7d  SQLITE_OK;.  }.}
16ba0 0a 0a 2f 2a 0a 2a 2a 20 52 65 73 65 74 20 74 68  ../*.** Reset th
16bb0 65 20 61 67 67 72 65 67 61 74 65 20 61 63 63 75  e aggregate accu
16bc0 6d 75 6c 61 74 6f 72 2e 0a 2a 2a 0a 2a 2a 20 54  mulator..**.** T
16bd0 68 65 20 61 67 67 72 65 67 61 74 65 20 61 63 63  he aggregate acc
16be0 75 6d 75 6c 61 74 6f 72 20 69 73 20 61 20 73 65  umulator is a se
16bf0 74 20 6f 66 20 6d 65 6d 6f 72 79 20 63 65 6c 6c  t of memory cell
16c00 73 20 74 68 61 74 20 68 6f 6c 64 0a 2a 2a 20 69  s that hold.** i
16c10 6e 74 65 72 6d 65 64 69 61 74 65 20 72 65 73 75  ntermediate resu
16c20 6c 74 73 20 77 68 69 6c 65 20 63 61 6c 63 75 6c  lts while calcul
16c30 61 74 69 6e 67 20 61 6e 20 61 67 67 72 65 67 61  ating an aggrega
16c40 74 65 2e 20 20 54 68 69 73 0a 2a 2a 20 72 6f 75  te.  This.** rou
16c50 74 69 6e 65 20 73 69 6d 70 6c 79 20 73 74 6f 72  tine simply stor
16c60 65 73 20 4e 55 4c 4c 73 20 69 6e 20 61 6c 6c 20  es NULLs in all 
16c70 6f 66 20 74 68 6f 73 65 20 6d 65 6d 6f 72 79 20  of those memory 
16c80 63 65 6c 6c 73 2e 0a 2a 2f 0a 73 74 61 74 69 63  cells..*/.static
16c90 20 76 6f 69 64 20 72 65 73 65 74 41 63 63 75 6d   void resetAccum
16ca0 75 6c 61 74 6f 72 28 50 61 72 73 65 20 2a 70 50  ulator(Parse *pP
16cb0 61 72 73 65 2c 20 41 67 67 49 6e 66 6f 20 2a 70  arse, AggInfo *p
16cc0 41 67 67 49 6e 66 6f 29 7b 0a 20 20 56 64 62 65  AggInfo){.  Vdbe
16cd0 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56   *v = pParse->pV
16ce0 64 62 65 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  dbe;.  int i;.  
16cf0 73 74 72 75 63 74 20 41 67 67 49 6e 66 6f 5f 66  struct AggInfo_f
16d00 75 6e 63 20 2a 70 46 75 6e 63 3b 0a 20 20 69 66  unc *pFunc;.  if
16d10 28 20 70 41 67 67 49 6e 66 6f 2d 3e 6e 46 75 6e  ( pAggInfo->nFun
16d20 63 2b 70 41 67 67 49 6e 66 6f 2d 3e 6e 43 6f 6c  c+pAggInfo->nCol
16d30 75 6d 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65  umn==0 ){.    re
16d40 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 66 6f 72 28  turn;.  }.  for(
16d50 69 3d 30 3b 20 69 3c 70 41 67 67 49 6e 66 6f 2d  i=0; i<pAggInfo-
16d60 3e 6e 43 6f 6c 75 6d 6e 3b 20 69 2b 2b 29 7b 0a  >nColumn; i++){.
16d70 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
16d80 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 65 6d 4e 75  ddOp(v, OP_MemNu
16d90 6c 6c 2c 20 70 41 67 67 49 6e 66 6f 2d 3e 61 43  ll, pAggInfo->aC
16da0 6f 6c 5b 69 5d 2e 69 4d 65 6d 2c 20 30 29 3b 0a  ol[i].iMem, 0);.
16db0 20 20 7d 0a 20 20 66 6f 72 28 70 46 75 6e 63 3d    }.  for(pFunc=
16dc0 70 41 67 67 49 6e 66 6f 2d 3e 61 46 75 6e 63 2c  pAggInfo->aFunc,
16dd0 20 69 3d 30 3b 20 69 3c 70 41 67 67 49 6e 66 6f   i=0; i<pAggInfo
16de0 2d 3e 6e 46 75 6e 63 3b 20 69 2b 2b 2c 20 70 46  ->nFunc; i++, pF
16df0 75 6e 63 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69  unc++){.    sqli
16e00 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
16e10 4f 50 5f 4d 65 6d 4e 75 6c 6c 2c 20 70 46 75 6e  OP_MemNull, pFun
16e20 63 2d 3e 69 4d 65 6d 2c 20 30 29 3b 0a 20 20 20  c->iMem, 0);.   
16e30 20 69 66 28 20 70 46 75 6e 63 2d 3e 69 44 69 73   if( pFunc->iDis
16e40 74 69 6e 63 74 3e 3d 30 20 29 7b 0a 20 20 20 20  tinct>=0 ){.    
16e50 20 20 45 78 70 72 20 2a 70 45 20 3d 20 70 46 75    Expr *pE = pFu
16e60 6e 63 2d 3e 70 45 78 70 72 3b 0a 20 20 20 20 20  nc->pExpr;.     
16e70 20 69 66 28 20 70 45 2d 3e 70 4c 69 73 74 3d 3d   if( pE->pList==
16e80 30 20 7c 7c 20 70 45 2d 3e 70 4c 69 73 74 2d 3e  0 || pE->pList->
16e90 6e 45 78 70 72 21 3d 31 20 29 7b 0a 20 20 20 20  nExpr!=1 ){.    
16ea0 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
16eb0 4d 73 67 28 70 50 61 72 73 65 2c 20 22 44 49 53  Msg(pParse, "DIS
16ec0 54 49 4e 43 54 20 69 6e 20 61 67 67 72 65 67 61  TINCT in aggrega
16ed0 74 65 20 6d 75 73 74 20 62 65 20 66 6f 6c 6c 6f  te must be follo
16ee0 77 65 64 20 22 0a 20 20 20 20 20 20 20 20 20 20  wed ".          
16ef0 20 22 62 79 20 61 6e 20 65 78 70 72 65 73 73 69   "by an expressi
16f00 6f 6e 22 29 3b 0a 20 20 20 20 20 20 20 20 70 46  on");.        pF
16f10 75 6e 63 2d 3e 69 44 69 73 74 69 6e 63 74 20 3d  unc->iDistinct =
16f20 20 2d 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65   -1;.      }else
16f30 7b 0a 20 20 20 20 20 20 20 20 4b 65 79 49 6e 66  {.        KeyInf
16f40 6f 20 2a 70 4b 65 79 49 6e 66 6f 20 3d 20 6b 65  o *pKeyInfo = ke
16f50 79 49 6e 66 6f 46 72 6f 6d 45 78 70 72 4c 69 73  yInfoFromExprLis
16f60 74 28 70 50 61 72 73 65 2c 20 70 45 2d 3e 70 4c  t(pParse, pE->pL
16f70 69 73 74 29 3b 0a 20 20 20 20 20 20 20 20 73 71  ist);.        sq
16f80 6c 69 74 65 33 56 64 62 65 4f 70 33 28 76 2c 20  lite3VdbeOp3(v, 
16f90 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c  OP_OpenEphemeral
16fa0 2c 20 70 46 75 6e 63 2d 3e 69 44 69 73 74 69 6e  , pFunc->iDistin
16fb0 63 74 2c 20 30 2c 20 0a 20 20 20 20 20 20 20 20  ct, 0, .        
16fc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16fd0 20 20 28 63 68 61 72 2a 29 70 4b 65 79 49 6e 66    (char*)pKeyInf
16fe0 6f 2c 20 50 33 5f 4b 45 59 49 4e 46 4f 5f 48 41  o, P3_KEYINFO_HA
16ff0 4e 44 4f 46 46 29 3b 0a 20 20 20 20 20 20 7d 0a  NDOFF);.      }.
17000 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a      }.  }.}../*.
17010 2a 2a 20 49 6e 76 6f 6b 65 20 74 68 65 20 4f 50  ** Invoke the OP
17020 5f 41 67 67 46 69 6e 61 6c 69 7a 65 20 6f 70 63  _AggFinalize opc
17030 6f 64 65 20 66 6f 72 20 65 76 65 72 79 20 61 67  ode for every ag
17040 67 72 65 67 61 74 65 20 66 75 6e 63 74 69 6f 6e  gregate function
17050 0a 2a 2a 20 69 6e 20 74 68 65 20 41 67 67 49 6e  .** in the AggIn
17060 66 6f 20 73 74 72 75 63 74 75 72 65 2e 0a 2a 2f  fo structure..*/
17070 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 69 6e  .static void fin
17080 61 6c 69 7a 65 41 67 67 46 75 6e 63 74 69 6f 6e  alizeAggFunction
17090 73 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  s(Parse *pParse,
170a0 20 41 67 67 49 6e 66 6f 20 2a 70 41 67 67 49 6e   AggInfo *pAggIn
170b0 66 6f 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d  fo){.  Vdbe *v =
170c0 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a   pParse->pVdbe;.
170d0 20 20 69 6e 74 20 69 3b 0a 20 20 73 74 72 75 63    int i;.  struc
170e0 74 20 41 67 67 49 6e 66 6f 5f 66 75 6e 63 20 2a  t AggInfo_func *
170f0 70 46 3b 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70  pF;.  for(i=0, p
17100 46 3d 70 41 67 67 49 6e 66 6f 2d 3e 61 46 75 6e  F=pAggInfo->aFun
17110 63 3b 20 69 3c 70 41 67 67 49 6e 66 6f 2d 3e 6e  c; i<pAggInfo->n
17120 46 75 6e 63 3b 20 69 2b 2b 2c 20 70 46 2b 2b 29  Func; i++, pF++)
17130 7b 0a 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a  {.    ExprList *
17140 70 4c 69 73 74 20 3d 20 70 46 2d 3e 70 45 78 70  pList = pF->pExp
17150 72 2d 3e 70 4c 69 73 74 3b 0a 20 20 20 20 73 71  r->pList;.    sq
17160 6c 69 74 65 33 56 64 62 65 4f 70 33 28 76 2c 20  lite3VdbeOp3(v, 
17170 4f 50 5f 41 67 67 46 69 6e 61 6c 2c 20 70 46 2d  OP_AggFinal, pF-
17180 3e 69 4d 65 6d 2c 20 70 4c 69 73 74 20 3f 20 70  >iMem, pList ? p
17190 4c 69 73 74 2d 3e 6e 45 78 70 72 20 3a 20 30 2c  List->nExpr : 0,
171a0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
171b0 20 20 20 20 20 20 20 28 76 6f 69 64 2a 29 70 46         (void*)pF
171c0 2d 3e 70 46 75 6e 63 2c 20 50 33 5f 46 55 4e 43  ->pFunc, P3_FUNC
171d0 44 45 46 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  DEF);.  }.}../*.
171e0 2a 2a 20 55 70 64 61 74 65 20 74 68 65 20 61 63  ** Update the ac
171f0 63 75 6d 75 6c 61 74 6f 72 20 6d 65 6d 6f 72 79  cumulator memory
17200 20 63 65 6c 6c 73 20 66 6f 72 20 61 6e 20 61 67   cells for an ag
17210 67 72 65 67 61 74 65 20 62 61 73 65 64 20 6f 6e  gregate based on
17220 0a 2a 2a 20 74 68 65 20 63 75 72 72 65 6e 74 20  .** the current 
17230 63 75 72 73 6f 72 20 70 6f 73 69 74 69 6f 6e 2e  cursor position.
17240 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
17250 75 70 64 61 74 65 41 63 63 75 6d 75 6c 61 74 6f  updateAccumulato
17260 72 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  r(Parse *pParse,
17270 20 41 67 67 49 6e 66 6f 20 2a 70 41 67 67 49 6e   AggInfo *pAggIn
17280 66 6f 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d  fo){.  Vdbe *v =
17290 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a   pParse->pVdbe;.
172a0 20 20 69 6e 74 20 69 3b 0a 20 20 73 74 72 75 63    int i;.  struc
172b0 74 20 41 67 67 49 6e 66 6f 5f 66 75 6e 63 20 2a  t AggInfo_func *
172c0 70 46 3b 0a 20 20 73 74 72 75 63 74 20 41 67 67  pF;.  struct Agg
172d0 49 6e 66 6f 5f 63 6f 6c 20 2a 70 43 3b 0a 0a 20  Info_col *pC;.. 
172e0 20 70 41 67 67 49 6e 66 6f 2d 3e 64 69 72 65 63   pAggInfo->direc
172f0 74 4d 6f 64 65 20 3d 20 31 3b 0a 20 20 66 6f 72  tMode = 1;.  for
17300 28 69 3d 30 2c 20 70 46 3d 70 41 67 67 49 6e 66  (i=0, pF=pAggInf
17310 6f 2d 3e 61 46 75 6e 63 3b 20 69 3c 70 41 67 67  o->aFunc; i<pAgg
17320 49 6e 66 6f 2d 3e 6e 46 75 6e 63 3b 20 69 2b 2b  Info->nFunc; i++
17330 2c 20 70 46 2b 2b 29 7b 0a 20 20 20 20 69 6e 74  , pF++){.    int
17340 20 6e 41 72 67 3b 0a 20 20 20 20 69 6e 74 20 61   nArg;.    int a
17350 64 64 72 4e 65 78 74 20 3d 20 30 3b 0a 20 20 20  ddrNext = 0;.   
17360 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74   ExprList *pList
17370 20 3d 20 70 46 2d 3e 70 45 78 70 72 2d 3e 70 4c   = pF->pExpr->pL
17380 69 73 74 3b 0a 20 20 20 20 69 66 28 20 70 4c 69  ist;.    if( pLi
17390 73 74 20 29 7b 0a 20 20 20 20 20 20 6e 41 72 67  st ){.      nArg
173a0 20 3d 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b   = pList->nExpr;
173b0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
173c0 70 72 43 6f 64 65 45 78 70 72 4c 69 73 74 28 70  prCodeExprList(p
173d0 50 61 72 73 65 2c 20 70 4c 69 73 74 29 3b 0a 20  Parse, pList);. 
173e0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
173f0 6e 41 72 67 20 3d 20 30 3b 0a 20 20 20 20 7d 0a  nArg = 0;.    }.
17400 20 20 20 20 69 66 28 20 70 46 2d 3e 69 44 69 73      if( pF->iDis
17410 74 69 6e 63 74 3e 3d 30 20 29 7b 0a 20 20 20 20  tinct>=0 ){.    
17420 20 20 61 64 64 72 4e 65 78 74 20 3d 20 73 71 6c    addrNext = sql
17430 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65  ite3VdbeMakeLabe
17440 6c 28 76 29 3b 0a 20 20 20 20 20 20 61 73 73 65  l(v);.      asse
17450 72 74 28 20 6e 41 72 67 3d 3d 31 20 29 3b 0a 20  rt( nArg==1 );. 
17460 20 20 20 20 20 63 6f 64 65 44 69 73 74 69 6e 63       codeDistinc
17470 74 28 76 2c 20 70 46 2d 3e 69 44 69 73 74 69 6e  t(v, pF->iDistin
17480 63 74 2c 20 61 64 64 72 4e 65 78 74 2c 20 31 29  ct, addrNext, 1)
17490 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
174a0 70 46 2d 3e 70 46 75 6e 63 2d 3e 6e 65 65 64 43  pF->pFunc->needC
174b0 6f 6c 6c 53 65 71 20 29 7b 0a 20 20 20 20 20 20  ollSeq ){.      
174c0 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 20 3d  CollSeq *pColl =
174d0 20 30 3b 0a 20 20 20 20 20 20 73 74 72 75 63 74   0;.      struct
174e0 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a   ExprList_item *
174f0 70 49 74 65 6d 3b 0a 20 20 20 20 20 20 69 6e 74  pItem;.      int
17500 20 6a 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   j;.      assert
17510 28 20 70 4c 69 73 74 21 3d 30 20 29 3b 20 20 2f  ( pList!=0 );  /
17520 2a 20 70 4c 69 73 74 21 3d 30 20 69 66 20 70 46  * pList!=0 if pF
17530 2d 3e 70 46 75 6e 63 2d 3e 6e 65 65 64 43 6f 6c  ->pFunc->needCol
17540 6c 53 65 71 20 69 73 20 74 72 75 65 20 2a 2f 0a  lSeq is true */.
17550 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 2c 20 70        for(j=0, p
17560 49 74 65 6d 3d 70 4c 69 73 74 2d 3e 61 3b 20 21  Item=pList->a; !
17570 70 43 6f 6c 6c 20 26 26 20 6a 3c 6e 41 72 67 3b  pColl && j<nArg;
17580 20 6a 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a   j++, pItem++){.
17590 20 20 20 20 20 20 20 20 70 43 6f 6c 6c 20 3d 20          pColl = 
175a0 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c 53  sqlite3ExprCollS
175b0 65 71 28 70 50 61 72 73 65 2c 20 70 49 74 65 6d  eq(pParse, pItem
175c0 2d 3e 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20  ->pExpr);.      
175d0 7d 0a 20 20 20 20 20 20 69 66 28 20 21 70 43 6f  }.      if( !pCo
175e0 6c 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 70 43  ll ){.        pC
175f0 6f 6c 6c 20 3d 20 70 50 61 72 73 65 2d 3e 64 62  oll = pParse->db
17600 2d 3e 70 44 66 6c 74 43 6f 6c 6c 3b 0a 20 20 20  ->pDfltColl;.   
17610 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74     }.      sqlit
17620 65 33 56 64 62 65 4f 70 33 28 76 2c 20 4f 50 5f  e3VdbeOp3(v, OP_
17630 43 6f 6c 6c 53 65 71 2c 20 30 2c 20 30 2c 20 28  CollSeq, 0, 0, (
17640 63 68 61 72 20 2a 29 70 43 6f 6c 6c 2c 20 50 33  char *)pColl, P3
17650 5f 43 4f 4c 4c 53 45 51 29 3b 0a 20 20 20 20 7d  _COLLSEQ);.    }
17660 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
17670 4f 70 33 28 76 2c 20 4f 50 5f 41 67 67 53 74 65  Op3(v, OP_AggSte
17680 70 2c 20 70 46 2d 3e 69 4d 65 6d 2c 20 6e 41 72  p, pF->iMem, nAr
17690 67 2c 20 28 76 6f 69 64 2a 29 70 46 2d 3e 70 46  g, (void*)pF->pF
176a0 75 6e 63 2c 20 50 33 5f 46 55 4e 43 44 45 46 29  unc, P3_FUNCDEF)
176b0 3b 0a 20 20 20 20 69 66 28 20 61 64 64 72 4e 65  ;.    if( addrNe
176c0 78 74 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  xt ){.      sqli
176d0 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61  te3VdbeResolveLa
176e0 62 65 6c 28 76 2c 20 61 64 64 72 4e 65 78 74 29  bel(v, addrNext)
176f0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 66 6f  ;.    }.  }.  fo
17700 72 28 69 3d 30 2c 20 70 43 3d 70 41 67 67 49 6e  r(i=0, pC=pAggIn
17710 66 6f 2d 3e 61 43 6f 6c 3b 20 69 3c 70 41 67 67  fo->aCol; i<pAgg
17720 49 6e 66 6f 2d 3e 6e 41 63 63 75 6d 75 6c 61 74  Info->nAccumulat
17730 6f 72 3b 20 69 2b 2b 2c 20 70 43 2b 2b 29 7b 0a  or; i++, pC++){.
17740 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
17750 6f 64 65 28 70 50 61 72 73 65 2c 20 70 43 2d 3e  ode(pParse, pC->
17760 70 45 78 70 72 29 3b 0a 20 20 20 20 73 71 6c 69  pExpr);.    sqli
17770 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
17780 4f 50 5f 4d 65 6d 53 74 6f 72 65 2c 20 70 43 2d  OP_MemStore, pC-
17790 3e 69 4d 65 6d 2c 20 31 29 3b 0a 20 20 7d 0a 20  >iMem, 1);.  }. 
177a0 20 70 41 67 67 49 6e 66 6f 2d 3e 64 69 72 65 63   pAggInfo->direc
177b0 74 4d 6f 64 65 20 3d 20 30 3b 0a 7d 0a 0a 0a 2f  tMode = 0;.}.../
177c0 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f  *.** Generate co
177d0 64 65 20 66 6f 72 20 74 68 65 20 67 69 76 65 6e  de for the given
177e0 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
177f0 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 72 65 73  t..**.** The res
17800 75 6c 74 73 20 61 72 65 20 64 69 73 74 72 69 62  ults are distrib
17810 75 74 65 64 20 69 6e 20 76 61 72 69 6f 75 73 20  uted in various 
17820 77 61 79 73 20 64 65 70 65 6e 64 69 6e 67 20 6f  ways depending o
17830 6e 20 74 68 65 0a 2a 2a 20 76 61 6c 75 65 20 6f  n the.** value o
17840 66 20 65 44 65 73 74 20 61 6e 64 20 69 50 61 72  f eDest and iPar
17850 6d 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 65 44 65  m..**.**     eDe
17860 73 74 20 56 61 6c 75 65 20 20 20 20 20 20 20 52  st Value       R
17870 65 73 75 6c 74 0a 2a 2a 20 20 20 20 20 2d 2d 2d  esult.**     ---
17880 2d 2d 2d 2d 2d 2d 2d 2d 2d 20 20 20 20 2d 2d 2d  ---------    ---
17890 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
178a0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
178b0 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a 20 20 20 20 20  --------.**     
178c0 53 52 54 5f 43 61 6c 6c 62 61 63 6b 20 20 20 20  SRT_Callback    
178d0 49 6e 76 6f 6b 65 20 74 68 65 20 63 61 6c 6c 62  Invoke the callb
178e0 61 63 6b 20 66 6f 72 20 65 61 63 68 20 72 6f 77  ack for each row
178f0 20 6f 66 20 74 68 65 20 72 65 73 75 6c 74 2e 0a   of the result..
17900 2a 2a 0a 2a 2a 20 20 20 20 20 53 52 54 5f 4d 65  **.**     SRT_Me
17910 6d 20 20 20 20 20 20 20 20 20 53 74 6f 72 65 20  m         Store 
17920 66 69 72 73 74 20 72 65 73 75 6c 74 20 69 6e 20  first result in 
17930 6d 65 6d 6f 72 79 20 63 65 6c 6c 20 69 50 61 72  memory cell iPar
17940 6d 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 52 54 5f  m.**.**     SRT_
17950 53 65 74 20 20 20 20 20 20 20 20 20 53 74 6f 72  Set         Stor
17960 65 20 72 65 73 75 6c 74 73 20 61 73 20 6b 65 79  e results as key
17970 73 20 6f 66 20 74 61 62 6c 65 20 69 50 61 72 6d  s of table iParm
17980 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 52 54 5f  ..**.**     SRT_
17990 55 6e 69 6f 6e 20 20 20 20 20 20 20 53 74 6f 72  Union       Stor
179a0 65 20 72 65 73 75 6c 74 73 20 61 73 20 61 20 6b  e results as a k
179b0 65 79 20 69 6e 20 61 20 74 65 6d 70 6f 72 61 72  ey in a temporar
179c0 79 20 74 61 62 6c 65 20 69 50 61 72 6d 0a 2a 2a  y table iParm.**
179d0 0a 2a 2a 20 20 20 20 20 53 52 54 5f 45 78 63 65  .**     SRT_Exce
179e0 70 74 20 20 20 20 20 20 52 65 6d 6f 76 65 20 72  pt      Remove r
179f0 65 73 75 6c 74 73 20 66 72 6f 6d 20 74 68 65 20  esults from the 
17a00 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20  temporary table 
17a10 69 50 61 72 6d 2e 0a 2a 2a 0a 2a 2a 20 20 20 20  iParm..**.**    
17a20 20 53 52 54 5f 54 61 62 6c 65 20 20 20 20 20 20   SRT_Table      
17a30 20 53 74 6f 72 65 20 72 65 73 75 6c 74 73 20 69   Store results i
17a40 6e 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c  n temporary tabl
17a50 65 20 69 50 61 72 6d 0a 2a 2a 0a 2a 2a 20 54 68  e iParm.**.** Th
17a60 65 20 74 61 62 6c 65 20 61 62 6f 76 65 20 69 73  e table above is
17a70 20 69 6e 63 6f 6d 70 6c 65 74 65 2e 20 20 41 64   incomplete.  Ad
17a80 64 69 74 69 6f 6e 61 6c 20 65 44 69 73 74 20 76  ditional eDist v
17a90 61 6c 75 65 20 68 61 76 65 20 62 65 20 61 64 64  alue have be add
17aa0 65 64 0a 2a 2a 20 73 69 6e 63 65 20 74 68 69 73  ed.** since this
17ab0 20 63 6f 6d 6d 65 6e 74 20 77 61 73 20 77 72 69   comment was wri
17ac0 74 74 65 6e 2e 20 20 53 65 65 20 74 68 65 20 73  tten.  See the s
17ad0 65 6c 65 63 74 49 6e 6e 65 72 4c 6f 6f 70 28 29  electInnerLoop()
17ae0 20 66 75 6e 63 74 69 6f 6e 20 66 6f 72 0a 2a 2a   function for.**
17af0 20 61 20 63 6f 6d 70 6c 65 74 65 20 6c 69 73 74   a complete list
17b00 69 6e 67 20 6f 66 20 74 68 65 20 61 6c 6c 6f 77  ing of the allow
17b10 65 64 20 76 61 6c 75 65 73 20 6f 66 20 65 44 65  ed values of eDe
17b20 73 74 20 61 6e 64 20 74 68 65 69 72 20 6d 65 61  st and their mea
17b30 6e 69 6e 67 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  nings..**.** Thi
17b40 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e  s routine return
17b50 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  s the number of 
17b60 65 72 72 6f 72 73 2e 20 20 49 66 20 61 6e 79 20  errors.  If any 
17b70 65 72 72 6f 72 73 20 61 72 65 0a 2a 2a 20 65 6e  errors are.** en
17b80 63 6f 75 6e 74 65 72 65 64 2c 20 74 68 65 6e 20  countered, then 
17b90 61 6e 20 61 70 70 72 6f 70 72 69 61 74 65 20 65  an appropriate e
17ba0 72 72 6f 72 20 6d 65 73 73 61 67 65 20 69 73 20  rror message is 
17bb0 6c 65 66 74 20 69 6e 0a 2a 2a 20 70 50 61 72 73  left in.** pPars
17bc0 65 2d 3e 7a 45 72 72 4d 73 67 2e 0a 2a 2a 0a 2a  e->zErrMsg..**.*
17bd0 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 64  * This routine d
17be0 6f 65 73 20 4e 4f 54 20 66 72 65 65 20 74 68 65  oes NOT free the
17bf0 20 53 65 6c 65 63 74 20 73 74 72 75 63 74 75 72   Select structur
17c00 65 20 70 61 73 73 65 64 20 69 6e 2e 20 20 54 68  e passed in.  Th
17c10 65 0a 2a 2a 20 63 61 6c 6c 69 6e 67 20 66 75 6e  e.** calling fun
17c20 63 74 69 6f 6e 20 6e 65 65 64 73 20 74 6f 20 64  ction needs to d
17c30 6f 20 74 68 61 74 2e 0a 2a 2a 0a 2a 2a 20 54 68  o that..**.** Th
17c40 65 20 70 50 61 72 65 6e 74 2c 20 70 61 72 65 6e  e pParent, paren
17c50 74 54 61 62 2c 20 61 6e 64 20 2a 70 50 61 72 65  tTab, and *pPare
17c60 6e 74 41 67 67 20 66 69 65 6c 64 73 20 61 72 65  ntAgg fields are
17c70 20 66 69 6c 6c 65 64 20 69 6e 20 69 66 20 74 68   filled in if th
17c80 69 73 0a 2a 2a 20 53 45 4c 45 43 54 20 69 73 20  is.** SELECT is 
17c90 61 20 73 75 62 71 75 65 72 79 2e 20 20 54 68 69  a subquery.  Thi
17ca0 73 20 72 6f 75 74 69 6e 65 20 6d 61 79 20 74 72  s routine may tr
17cb0 79 20 74 6f 20 63 6f 6d 62 69 6e 65 20 74 68 69  y to combine thi
17cc0 73 20 53 45 4c 45 43 54 0a 2a 2a 20 77 69 74 68  s SELECT.** with
17cd0 20 69 74 73 20 70 61 72 65 6e 74 20 74 6f 20 66   its parent to f
17ce0 6f 72 6d 20 61 20 73 69 6e 67 6c 65 20 66 6c 61  orm a single fla
17cf0 74 20 71 75 65 72 79 2e 20 20 49 6e 20 73 6f 20  t query.  In so 
17d00 64 6f 69 6e 67 2c 20 69 74 20 6d 69 67 68 74 0a  doing, it might.
17d10 2a 2a 20 63 68 61 6e 67 65 20 74 68 65 20 70 61  ** change the pa
17d20 72 65 6e 74 20 71 75 65 72 79 20 66 72 6f 6d 20  rent query from 
17d30 61 20 6e 6f 6e 2d 61 67 67 72 65 67 61 74 65 20  a non-aggregate 
17d40 74 6f 20 61 6e 20 61 67 67 72 65 67 61 74 65 20  to an aggregate 
17d50 71 75 65 72 79 2e 0a 2a 2a 20 46 6f 72 20 74 68  query..** For th
17d60 61 74 20 72 65 61 73 6f 6e 2c 20 74 68 65 20 70  at reason, the p
17d70 50 61 72 65 6e 74 41 67 67 20 66 6c 61 67 20 69  ParentAgg flag i
17d80 73 20 70 61 73 73 65 64 20 61 73 20 61 20 70 6f  s passed as a po
17d90 69 6e 74 65 72 2c 20 73 6f 20 69 74 0a 2a 2a 20  inter, so it.** 
17da0 63 61 6e 20 62 65 20 63 68 61 6e 67 65 64 2e 0a  can be changed..
17db0 2a 2a 0a 2a 2a 20 45 78 61 6d 70 6c 65 20 31 3a  **.** Example 1:
17dc0 20 20 20 54 68 65 20 6d 65 61 6e 69 6e 67 20 6f     The meaning o
17dd0 66 20 74 68 65 20 70 50 61 72 65 6e 74 20 70 61  f the pParent pa
17de0 72 61 6d 65 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 20  rameter..**.**  
17df0 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20    SELECT * FROM 
17e00 74 31 20 4a 4f 49 4e 20 28 53 45 4c 45 43 54 20  t1 JOIN (SELECT 
17e10 78 2c 20 63 6f 75 6e 74 28 2a 29 20 46 52 4f 4d  x, count(*) FROM
17e20 20 74 32 29 20 4a 4f 49 4e 20 74 33 3b 0a 2a 2a   t2) JOIN t3;.**
17e30 20 20 20 20 5c 20 20 20 20 20 20 20 20 20 20 20      \           
17e40 20 20 20 20 20 20 20 20 20 20 20 5c 5f 5f 5f 5f             \____
17e50 5f 5f 5f 20 73 75 62 71 75 65 72 79 20 5f 5f 5f  ___ subquery ___
17e60 5f 5f 5f 5f 2f 20 20 20 20 20 20 20 20 2f 0a 2a  ____/        /.*
17e70 2a 20 20 20 20 20 5c 20 20 20 20 20 20 20 20 20  *     \         
17e80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17e90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17ea0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 0a 2a               /.*
17eb0 2a 20 20 20 20 20 20 5c 5f 5f 5f 5f 5f 5f 5f 5f  *      \________
17ec0 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 20 6f 75 74  ____________ out
17ed0 65 72 20 71 75 65 72 79 20 5f 5f 5f 5f 5f 5f 5f  er query _______
17ee0 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 2f 0a 2a 2a  ____________/.**
17ef0 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
17f00 20 69 73 20 63 61 6c 6c 65 64 20 66 6f 72 20 74   is called for t
17f10 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 66  he outer query f
17f20 69 72 73 74 2e 20 20 20 46 6f 72 20 74 68 61 74  irst.   For that
17f30 20 63 61 6c 6c 2c 0a 2a 2a 20 70 50 61 72 65 6e   call,.** pParen
17f40 74 20 77 69 6c 6c 20 62 65 20 4e 55 4c 4c 2e 20  t will be NULL. 
17f50 20 44 75 72 69 6e 67 20 74 68 65 20 70 72 6f 63   During the proc
17f60 65 73 73 69 6e 67 20 6f 66 20 74 68 65 20 6f 75  essing of the ou
17f70 74 65 72 20 71 75 65 72 79 2c 20 74 68 69 73 20  ter query, this 
17f80 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 69 73 20 63  .** routine is c
17f90 61 6c 6c 65 64 20 72 65 63 75 72 73 69 76 65 6c  alled recursivel
17fa0 79 20 74 6f 20 68 61 6e 64 6c 65 20 74 68 65 20  y to handle the 
17fb0 73 75 62 71 75 65 72 79 2e 20 20 46 6f 72 20 74  subquery.  For t
17fc0 68 65 20 72 65 63 75 72 73 69 76 65 0a 2a 2a 20  he recursive.** 
17fd0 63 61 6c 6c 2c 20 70 50 61 72 65 6e 74 20 77 69  call, pParent wi
17fe0 6c 6c 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20  ll point to the 
17ff0 6f 75 74 65 72 20 71 75 65 72 79 2e 20 20 42 65  outer query.  Be
18000 63 61 75 73 65 20 74 68 65 20 73 75 62 71 75 65  cause the subque
18010 72 79 20 69 73 0a 2a 2a 20 74 68 65 20 73 65 63  ry is.** the sec
18020 6f 6e 64 20 65 6c 65 6d 65 6e 74 20 69 6e 20 61  ond element in a
18030 20 74 68 72 65 65 2d 77 61 79 20 6a 6f 69 6e 2c   three-way join,
18040 20 74 68 65 20 70 61 72 65 6e 74 54 61 62 20 70   the parentTab p
18050 61 72 61 6d 65 74 65 72 20 77 69 6c 6c 0a 2a 2a  arameter will.**
18060 20 62 65 20 31 20 28 74 68 65 20 32 6e 64 20 76   be 1 (the 2nd v
18070 61 6c 75 65 20 6f 66 20 61 20 30 2d 69 6e 64 65  alue of a 0-inde
18080 78 65 64 20 61 72 72 61 79 2e 29 0a 2a 2f 0a 69  xed array.).*/.i
18090 6e 74 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74  nt sqlite3Select
180a0 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
180b0 65 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68  e,         /* Th
180c0 65 20 70 61 72 73 65 72 20 63 6f 6e 74 65 78 74  e parser context
180d0 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 2c   */.  Select *p,
180e0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
180f0 54 68 65 20 53 45 4c 45 43 54 20 73 74 61 74 65  The SELECT state
18100 6d 65 6e 74 20 62 65 69 6e 67 20 63 6f 64 65 64  ment being coded
18110 2e 20 2a 2f 0a 20 20 69 6e 74 20 65 44 65 73 74  . */.  int eDest
18120 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ,             /*
18130 20 48 6f 77 20 74 6f 20 64 69 73 70 6f 73 65 20   How to dispose 
18140 6f 66 20 74 68 65 20 72 65 73 75 6c 74 73 20 2a  of the results *
18150 2f 0a 20 20 69 6e 74 20 69 50 61 72 6d 2c 20 20  /.  int iParm,  
18160 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 20             /* A 
18170 70 61 72 61 6d 65 74 65 72 20 75 73 65 64 20 62  parameter used b
18180 79 20 74 68 65 20 65 44 65 73 74 20 64 69 73 70  y the eDest disp
18190 6f 73 61 6c 20 6d 65 74 68 6f 64 20 2a 2f 0a 20  osal method */. 
181a0 20 53 65 6c 65 63 74 20 2a 70 50 61 72 65 6e 74   Select *pParent
181b0 2c 20 20 20 20 20 20 20 2f 2a 20 41 6e 6f 74 68  ,       /* Anoth
181c0 65 72 20 53 45 4c 45 43 54 20 66 6f 72 20 77 68  er SELECT for wh
181d0 69 63 68 20 74 68 69 73 20 69 73 20 61 20 73 75  ich this is a su
181e0 62 2d 71 75 65 72 79 20 2a 2f 0a 20 20 69 6e 74  b-query */.  int
181f0 20 70 61 72 65 6e 74 54 61 62 2c 20 20 20 20 20   parentTab,     
18200 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 69 6e 20      /* Index in 
18210 70 50 61 72 65 6e 74 2d 3e 70 53 72 63 20 6f 66  pParent->pSrc of
18220 20 74 68 69 73 20 71 75 65 72 79 20 2a 2f 0a 20   this query */. 
18230 20 69 6e 74 20 2a 70 50 61 72 65 6e 74 41 67 67   int *pParentAgg
18240 2c 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20  ,       /* True 
18250 69 66 20 70 50 61 72 65 6e 74 20 75 73 65 73 20  if pParent uses 
18260 61 67 67 72 65 67 61 74 65 20 66 75 6e 63 74 69  aggregate functi
18270 6f 6e 73 20 2a 2f 0a 20 20 63 68 61 72 20 2a 61  ons */.  char *a
18280 66 66 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ff              
18290 2f 2a 20 49 66 20 65 44 65 73 74 20 69 73 20 53  /* If eDest is S
182a0 52 54 5f 55 6e 69 6f 6e 2c 20 74 68 65 20 61 66  RT_Union, the af
182b0 66 69 6e 69 74 79 20 73 74 72 69 6e 67 20 2a 2f  finity string */
182c0 0a 29 7b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 20  .){.  int i, j; 
182d0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
182e0 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 73 20 2a 2f  Loop counters */
182f0 0a 20 20 57 68 65 72 65 49 6e 66 6f 20 2a 70 57  .  WhereInfo *pW
18300 49 6e 66 6f 3b 20 20 20 20 20 2f 2a 20 52 65 74  Info;     /* Ret
18310 75 72 6e 20 66 72 6f 6d 20 73 71 6c 69 74 65 33  urn from sqlite3
18320 57 68 65 72 65 42 65 67 69 6e 28 29 20 2a 2f 0a  WhereBegin() */.
18330 20 20 56 64 62 65 20 2a 76 3b 20 20 20 20 20 20    Vdbe *v;      
18340 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
18350 76 69 72 74 75 61 6c 20 6d 61 63 68 69 6e 65 20  virtual machine 
18360 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69  under constructi
18370 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 69 73 41 67  on */.  int isAg
18380 67 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  g;             /
18390 2a 20 54 72 75 65 20 66 6f 72 20 73 65 6c 65 63  * True for selec
183a0 74 20 6c 69 73 74 73 20 6c 69 6b 65 20 22 63 6f  t lists like "co
183b0 75 6e 74 28 2a 29 22 20 2a 2f 0a 20 20 45 78 70  unt(*)" */.  Exp
183c0 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 3b 20 20  rList *pEList;  
183d0 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 63      /* List of c
183e0 6f 6c 75 6d 6e 73 20 74 6f 20 65 78 74 72 61 63  olumns to extrac
183f0 74 2e 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20  t. */.  SrcList 
18400 2a 70 54 61 62 4c 69 73 74 3b 20 20 20 20 20 2f  *pTabList;     /
18410 2a 20 4c 69 73 74 20 6f 66 20 74 61 62 6c 65 73  * List of tables
18420 20 74 6f 20 73 65 6c 65 63 74 20 66 72 6f 6d 20   to select from 
18430 2a 2f 0a 20 20 45 78 70 72 20 2a 70 57 68 65 72  */.  Expr *pWher
18440 65 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54  e;          /* T
18450 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 2e  he WHERE clause.
18460 20 20 4d 61 79 20 62 65 20 4e 55 4c 4c 20 2a 2f    May be NULL */
18470 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4f 72  .  ExprList *pOr
18480 64 65 72 42 79 3b 20 20 20 20 2f 2a 20 54 68 65  derBy;    /* The
18490 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65   ORDER BY clause
184a0 2e 20 20 4d 61 79 20 62 65 20 4e 55 4c 4c 20 2a  .  May be NULL *
184b0 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 47  /.  ExprList *pG
184c0 72 6f 75 70 42 79 3b 20 20 20 20 2f 2a 20 54 68  roupBy;    /* Th
184d0 65 20 47 52 4f 55 50 20 42 59 20 63 6c 61 75 73  e GROUP BY claus
184e0 65 2e 20 20 4d 61 79 20 62 65 20 4e 55 4c 4c 20  e.  May be NULL 
184f0 2a 2f 0a 20 20 45 78 70 72 20 2a 70 48 61 76 69  */.  Expr *pHavi
18500 6e 67 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 54  ng;         /* T
18510 68 65 20 48 41 56 49 4e 47 20 63 6c 61 75 73 65  he HAVING clause
18520 2e 20 20 4d 61 79 20 62 65 20 4e 55 4c 4c 20 2a  .  May be NULL *
18530 2f 0a 20 20 69 6e 74 20 69 73 44 69 73 74 69 6e  /.  int isDistin
18540 63 74 3b 20 20 20 20 20 20 20 20 2f 2a 20 54 72  ct;        /* Tr
18550 75 65 20 69 66 20 74 68 65 20 44 49 53 54 49 4e  ue if the DISTIN
18560 43 54 20 6b 65 79 77 6f 72 64 20 69 73 20 70 72  CT keyword is pr
18570 65 73 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 64  esent */.  int d
18580 69 73 74 69 6e 63 74 3b 20 20 20 20 20 20 20 20  istinct;        
18590 20 20 2f 2a 20 54 61 62 6c 65 20 74 6f 20 75 73    /* Table to us
185a0 65 20 66 6f 72 20 74 68 65 20 64 69 73 74 69 6e  e for the distin
185b0 63 74 20 73 65 74 20 2a 2f 0a 20 20 69 6e 74 20  ct set */.  int 
185c0 72 63 20 3d 20 31 3b 20 20 20 20 20 20 20 20 20  rc = 1;         
185d0 20 20 20 2f 2a 20 56 61 6c 75 65 20 74 6f 20 72     /* Value to r
185e0 65 74 75 72 6e 20 66 72 6f 6d 20 74 68 69 73 20  eturn from this 
185f0 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e  function */.  in
18600 74 20 61 64 64 72 53 6f 72 74 49 6e 64 65 78 3b  t addrSortIndex;
18610 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20       /* Address 
18620 6f 66 20 61 6e 20 4f 50 5f 4f 70 65 6e 45 70 68  of an OP_OpenEph
18630 65 6d 65 72 61 6c 20 69 6e 73 74 72 75 63 74 69  emeral instructi
18640 6f 6e 20 2a 2f 0a 20 20 41 67 67 49 6e 66 6f 20  on */.  AggInfo 
18650 73 41 67 67 49 6e 66 6f 3b 20 20 20 20 20 20 2f  sAggInfo;      /
18660 2a 20 49 6e 66 6f 72 6d 61 74 69 6f 6e 20 75 73  * Information us
18670 65 64 20 62 79 20 61 67 67 72 65 67 61 74 65 20  ed by aggregate 
18680 71 75 65 72 69 65 73 20 2a 2f 0a 20 20 69 6e 74  queries */.  int
18690 20 69 45 6e 64 3b 20 20 20 20 20 20 20 20 20 20   iEnd;          
186a0 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f      /* Address o
186b0 66 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65  f the end of the
186c0 20 71 75 65 72 79 20 2a 2f 0a 20 20 73 71 6c 69   query */.  sqli
186d0 74 65 33 20 2a 64 62 3b 20 20 20 20 20 20 20 20  te3 *db;        
186e0 20 20 20 2f 2a 20 54 68 65 20 64 61 74 61 62 61     /* The databa
186f0 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f  se connection */
18700 0a 0a 20 20 64 62 20 3d 20 70 50 61 72 73 65 2d  ..  db = pParse-
18710 3e 64 62 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20  >db;.  if( p==0 
18720 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  || db->mallocFai
18730 6c 65 64 20 7c 7c 20 70 50 61 72 73 65 2d 3e 6e  led || pParse->n
18740 45 72 72 20 29 7b 0a 20 20 20 20 72 65 74 75 72  Err ){.    retur
18750 6e 20 31 3b 0a 20 20 7d 0a 20 20 69 66 28 20 73  n 1;.  }.  if( s
18760 71 6c 69 74 65 33 41 75 74 68 43 68 65 63 6b 28  qlite3AuthCheck(
18770 70 50 61 72 73 65 2c 20 53 51 4c 49 54 45 5f 53  pParse, SQLITE_S
18780 45 4c 45 43 54 2c 20 30 2c 20 30 2c 20 30 29 20  ELECT, 0, 0, 0) 
18790 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 6d 65  ) return 1;.  me
187a0 6d 73 65 74 28 26 73 41 67 67 49 6e 66 6f 2c 20  mset(&sAggInfo, 
187b0 30 2c 20 73 69 7a 65 6f 66 28 73 41 67 67 49 6e  0, sizeof(sAggIn
187c0 66 6f 29 29 3b 0a 0a 23 69 66 6e 64 65 66 20 53  fo));..#ifndef S
187d0 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f 4d 50 4f  QLITE_OMIT_COMPO
187e0 55 4e 44 5f 53 45 4c 45 43 54 0a 20 20 2f 2a 20  UND_SELECT.  /* 
187f0 49 66 20 74 68 65 72 65 20 69 73 20 61 72 65 20  If there is are 
18800 61 20 73 65 71 75 65 6e 63 65 20 6f 66 20 71 75  a sequence of qu
18810 65 72 69 65 73 2c 20 64 6f 20 74 68 65 20 65 61  eries, do the ea
18820 72 6c 69 65 72 20 6f 6e 65 73 20 66 69 72 73 74  rlier ones first
18830 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e  ..  */.  if( p->
18840 70 50 72 69 6f 72 20 29 7b 0a 20 20 20 20 69 66  pPrior ){.    if
18850 28 20 70 2d 3e 70 52 69 67 68 74 6d 6f 73 74 3d  ( p->pRightmost=
18860 3d 30 20 29 7b 0a 20 20 20 20 20 20 53 65 6c 65  =0 ){.      Sele
18870 63 74 20 2a 70 4c 6f 6f 70 3b 0a 20 20 20 20 20  ct *pLoop;.     
18880 20 69 6e 74 20 63 6e 74 20 3d 20 30 3b 0a 20 20   int cnt = 0;.  
18890 20 20 20 20 66 6f 72 28 70 4c 6f 6f 70 3d 70 3b      for(pLoop=p;
188a0 20 70 4c 6f 6f 70 3b 20 70 4c 6f 6f 70 3d 70 4c   pLoop; pLoop=pL
188b0 6f 6f 70 2d 3e 70 50 72 69 6f 72 2c 20 63 6e 74  oop->pPrior, cnt
188c0 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 70 4c 6f  ++){.        pLo
188d0 6f 70 2d 3e 70 52 69 67 68 74 6d 6f 73 74 20 3d  op->pRightmost =
188e0 20 70 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   p;.      }.    
188f0 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4d 41 58    if( SQLITE_MAX
18900 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45 43 54  _COMPOUND_SELECT
18910 3e 30 20 26 26 20 63 6e 74 3e 53 51 4c 49 54 45  >0 && cnt>SQLITE
18920 5f 4d 41 58 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45  _MAX_COMPOUND_SE
18930 4c 45 43 54 20 29 7b 0a 20 20 20 20 20 20 20 20  LECT ){.        
18940 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
18950 70 50 61 72 73 65 2c 20 22 74 6f 6f 20 6d 61 6e  pParse, "too man
18960 79 20 74 65 72 6d 73 20 69 6e 20 63 6f 6d 70 6f  y terms in compo
18970 75 6e 64 20 53 45 4c 45 43 54 22 29 3b 0a 20 20  und SELECT");.  
18980 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a        return 1;.
18990 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
189a0 20 20 72 65 74 75 72 6e 20 6d 75 6c 74 69 53 65    return multiSe
189b0 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70 2c 20  lect(pParse, p, 
189c0 65 44 65 73 74 2c 20 69 50 61 72 6d 2c 20 61 66  eDest, iParm, af
189d0 66 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a  f);.  }.#endif..
189e0 20 20 70 4f 72 64 65 72 42 79 20 3d 20 70 2d 3e    pOrderBy = p->
189f0 70 4f 72 64 65 72 42 79 3b 0a 20 20 69 66 28 20  pOrderBy;.  if( 
18a00 49 67 6e 6f 72 61 62 6c 65 4f 72 64 65 72 62 79  IgnorableOrderby
18a10 28 65 44 65 73 74 29 20 29 7b 0a 20 20 20 20 70  (eDest) ){.    p
18a20 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20 30 3b 0a  ->pOrderBy = 0;.
18a30 20 20 7d 0a 20 20 69 66 28 20 73 71 6c 69 74 65    }.  if( sqlite
18a40 33 53 65 6c 65 63 74 52 65 73 6f 6c 76 65 28 70  3SelectResolve(p
18a50 50 61 72 73 65 2c 20 70 2c 20 30 29 20 29 7b 0a  Parse, p, 0) ){.
18a60 20 20 20 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f      goto select_
18a70 65 6e 64 3b 0a 20 20 7d 0a 20 20 70 2d 3e 70 4f  end;.  }.  p->pO
18a80 72 64 65 72 42 79 20 3d 20 70 4f 72 64 65 72 42  rderBy = pOrderB
18a90 79 3b 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 6c 6f  y;..  /* Make lo
18aa0 63 61 6c 20 63 6f 70 69 65 73 20 6f 66 20 74 68  cal copies of th
18ab0 65 20 70 61 72 61 6d 65 74 65 72 73 20 66 6f 72  e parameters for
18ac0 20 74 68 69 73 20 71 75 65 72 79 2e 0a 20 20 2a   this query..  *
18ad0 2f 0a 20 20 70 54 61 62 4c 69 73 74 20 3d 20 70  /.  pTabList = p
18ae0 2d 3e 70 53 72 63 3b 0a 20 20 70 57 68 65 72 65  ->pSrc;.  pWhere
18af0 20 3d 20 70 2d 3e 70 57 68 65 72 65 3b 0a 20 20   = p->pWhere;.  
18b00 70 47 72 6f 75 70 42 79 20 3d 20 70 2d 3e 70 47  pGroupBy = p->pG
18b10 72 6f 75 70 42 79 3b 0a 20 20 70 48 61 76 69 6e  roupBy;.  pHavin
18b20 67 20 3d 20 70 2d 3e 70 48 61 76 69 6e 67 3b 0a  g = p->pHaving;.
18b30 20 20 69 73 41 67 67 20 3d 20 70 2d 3e 69 73 41    isAgg = p->isA
18b40 67 67 3b 0a 20 20 69 73 44 69 73 74 69 6e 63 74  gg;.  isDistinct
18b50 20 3d 20 70 2d 3e 69 73 44 69 73 74 69 6e 63 74   = p->isDistinct
18b60 3b 0a 20 20 70 45 4c 69 73 74 20 3d 20 70 2d 3e  ;.  pEList = p->
18b70 70 45 4c 69 73 74 3b 0a 20 20 69 66 28 20 70 45  pEList;.  if( pE
18b80 4c 69 73 74 3d 3d 30 20 29 20 67 6f 74 6f 20 73  List==0 ) goto s
18b90 65 6c 65 63 74 5f 65 6e 64 3b 0a 0a 20 20 2f 2a  elect_end;..  /*
18ba0 20 0a 20 20 2a 2a 20 44 6f 20 6e 6f 74 20 65 76   .  ** Do not ev
18bb0 65 6e 20 61 74 74 65 6d 70 74 20 74 6f 20 67 65  en attempt to ge
18bc0 6e 65 72 61 74 65 20 61 6e 79 20 63 6f 64 65 20  nerate any code 
18bd0 69 66 20 77 65 20 68 61 76 65 20 61 6c 72 65 61  if we have alrea
18be0 64 79 20 73 65 65 6e 0a 20 20 2a 2a 20 65 72 72  dy seen.  ** err
18bf0 6f 72 73 20 62 65 66 6f 72 65 20 74 68 69 73 20  ors before this 
18c00 72 6f 75 74 69 6e 65 20 73 74 61 72 74 73 2e 0a  routine starts..
18c10 20 20 2a 2f 0a 20 20 69 66 28 20 70 50 61 72 73    */.  if( pPars
18c20 65 2d 3e 6e 45 72 72 3e 30 20 29 20 67 6f 74 6f  e->nErr>0 ) goto
18c30 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 0a 20 20   select_end;..  
18c40 2f 2a 20 49 66 20 77 72 69 74 69 6e 67 20 74 6f  /* If writing to
18c50 20 6d 65 6d 6f 72 79 20 6f 72 20 67 65 6e 65 72   memory or gener
18c60 61 74 69 6e 67 20 61 20 73 65 74 0a 20 20 2a 2a  ating a set.  **
18c70 20 6f 6e 6c 79 20 61 20 73 69 6e 67 6c 65 20 63   only a single c
18c80 6f 6c 75 6d 6e 20 6d 61 79 20 62 65 20 6f 75 74  olumn may be out
18c90 70 75 74 2e 0a 20 20 2a 2f 0a 23 69 66 6e 64 65  put..  */.#ifnde
18ca0 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55  f SQLITE_OMIT_SU
18cb0 42 51 55 45 52 59 0a 20 20 69 66 28 20 63 68 65  BQUERY.  if( che
18cc0 63 6b 46 6f 72 4d 75 6c 74 69 43 6f 6c 75 6d 6e  ckForMultiColumn
18cd0 53 65 6c 65 63 74 45 72 72 6f 72 28 70 50 61 72  SelectError(pPar
18ce0 73 65 2c 20 65 44 65 73 74 2c 20 70 45 4c 69 73  se, eDest, pELis
18cf0 74 2d 3e 6e 45 78 70 72 29 20 29 7b 0a 20 20 20  t->nExpr) ){.   
18d00 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64   goto select_end
18d10 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20  ;.  }.#endif..  
18d20 2f 2a 20 4f 52 44 45 52 20 42 59 20 69 73 20 69  /* ORDER BY is i
18d30 67 6e 6f 72 65 64 20 66 6f 72 20 73 6f 6d 65 20  gnored for some 
18d40 64 65 73 74 69 6e 61 74 69 6f 6e 73 2e 0a 20 20  destinations..  
18d50 2a 2f 0a 20 20 69 66 28 20 49 67 6e 6f 72 61 62  */.  if( Ignorab
18d60 6c 65 4f 72 64 65 72 62 79 28 65 44 65 73 74 29  leOrderby(eDest)
18d70 20 29 7b 0a 20 20 20 20 70 4f 72 64 65 72 42 79   ){.    pOrderBy
18d80 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20   = 0;.  }..  /* 
18d90 42 65 67 69 6e 20 67 65 6e 65 72 61 74 69 6e 67  Begin generating
18da0 20 63 6f 64 65 2e 0a 20 20 2a 2f 0a 20 20 76 20   code..  */.  v 
18db0 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64 62 65  = sqlite3GetVdbe
18dc0 28 70 50 61 72 73 65 29 3b 0a 20 20 69 66 28 20  (pParse);.  if( 
18dd0 76 3d 3d 30 20 29 20 67 6f 74 6f 20 73 65 6c 65  v==0 ) goto sele
18de0 63 74 5f 65 6e 64 3b 0a 0a 20 20 2f 2a 20 47 65  ct_end;..  /* Ge
18df0 6e 65 72 61 74 65 20 63 6f 64 65 20 66 6f 72 20  nerate code for 
18e00 61 6c 6c 20 73 75 62 2d 71 75 65 72 69 65 73 20  all sub-queries 
18e10 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75  in the FROM clau
18e20 73 65 0a 20 20 2a 2f 0a 23 69 66 20 21 64 65 66  se.  */.#if !def
18e30 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
18e40 5f 53 55 42 51 55 45 52 59 29 20 7c 7c 20 21 64  _SUBQUERY) || !d
18e50 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
18e60 49 54 5f 56 49 45 57 29 0a 20 20 66 6f 72 28 69  IT_VIEW).  for(i
18e70 3d 30 3b 20 69 3c 70 54 61 62 4c 69 73 74 2d 3e  =0; i<pTabList->
18e80 6e 53 72 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  nSrc; i++){.    
18e90 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 61 76  const char *zSav
18ea0 65 64 41 75 74 68 43 6f 6e 74 65 78 74 20 3d 20  edAuthContext = 
18eb0 30 3b 0a 20 20 20 20 69 6e 74 20 6e 65 65 64 52  0;.    int needR
18ec0 65 73 74 6f 72 65 43 6f 6e 74 65 78 74 3b 0a 20  estoreContext;. 
18ed0 20 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73     struct SrcLis
18ee0 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 20 3d 20  t_item *pItem = 
18ef0 26 70 54 61 62 4c 69 73 74 2d 3e 61 5b 69 5d 3b  &pTabList->a[i];
18f00 0a 0a 20 20 20 20 69 66 28 20 70 49 74 65 6d 2d  ..    if( pItem-
18f10 3e 70 53 65 6c 65 63 74 3d 3d 30 20 7c 7c 20 70  >pSelect==0 || p
18f20 49 74 65 6d 2d 3e 69 73 50 6f 70 75 6c 61 74 65  Item->isPopulate
18f30 64 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  d ) continue;.  
18f40 20 20 69 66 28 20 70 49 74 65 6d 2d 3e 7a 4e 61    if( pItem->zNa
18f50 6d 65 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 7a  me!=0 ){.      z
18f60 53 61 76 65 64 41 75 74 68 43 6f 6e 74 65 78 74  SavedAuthContext
18f70 20 3d 20 70 50 61 72 73 65 2d 3e 7a 41 75 74 68   = pParse->zAuth
18f80 43 6f 6e 74 65 78 74 3b 0a 20 20 20 20 20 20 70  Context;.      p
18f90 50 61 72 73 65 2d 3e 7a 41 75 74 68 43 6f 6e 74  Parse->zAuthCont
18fa0 65 78 74 20 3d 20 70 49 74 65 6d 2d 3e 7a 4e 61  ext = pItem->zNa
18fb0 6d 65 3b 0a 20 20 20 20 20 20 6e 65 65 64 52 65  me;.      needRe
18fc0 73 74 6f 72 65 43 6f 6e 74 65 78 74 20 3d 20 31  storeContext = 1
18fd0 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
18fe0 20 20 20 6e 65 65 64 52 65 73 74 6f 72 65 43 6f     needRestoreCo
18ff0 6e 74 65 78 74 20 3d 20 30 3b 0a 20 20 20 20 7d  ntext = 0;.    }
19000 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c  .#if defined(SQL
19010 49 54 45 5f 54 45 53 54 29 20 7c 7c 20 53 51 4c  ITE_TEST) || SQL
19020 49 54 45 5f 4d 41 58 5f 45 58 50 52 5f 44 45 50  ITE_MAX_EXPR_DEP
19030 54 48 3e 30 0a 20 20 20 20 2f 2a 20 49 6e 63 72  TH>0.    /* Incr
19040 65 6d 65 6e 74 20 50 61 72 73 65 2e 6e 48 65 69  ement Parse.nHei
19050 67 68 74 20 62 79 20 74 68 65 20 68 65 69 67 68  ght by the heigh
19060 74 20 6f 66 20 74 68 65 20 6c 61 72 67 65 73 74  t of the largest
19070 20 65 78 70 72 65 73 73 69 6f 6e 0a 20 20 20 20   expression.    
19080 2a 2a 20 74 72 65 65 20 72 65 66 65 72 65 64 20  ** tree refered 
19090 74 6f 20 62 79 20 74 68 69 73 2c 20 74 68 65 20  to by this, the 
190a0 70 61 72 65 6e 74 20 73 65 6c 65 63 74 2e 20 54  parent select. T
190b0 68 65 20 63 68 69 6c 64 20 73 65 6c 65 63 74 0a  he child select.
190c0 20 20 20 20 2a 2a 20 6d 61 79 20 63 6f 6e 74 61      ** may conta
190d0 69 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 74 72  in expression tr
190e0 65 65 73 20 6f 66 20 61 74 20 6d 6f 73 74 0a 20  ees of at most. 
190f0 20 20 20 2a 2a 20 28 53 51 4c 49 54 45 5f 4d 41     ** (SQLITE_MA
19100 58 5f 45 58 50 52 5f 44 45 50 54 48 2d 50 61 72  X_EXPR_DEPTH-Par
19110 73 65 2e 6e 48 65 69 67 68 74 29 20 68 65 69 67  se.nHeight) heig
19120 68 74 2e 20 54 68 69 73 20 69 73 20 61 20 62 69  ht. This is a bi
19130 74 0a 20 20 20 20 2a 2a 20 6d 6f 72 65 20 63 6f  t.    ** more co
19140 6e 73 65 72 76 61 74 69 76 65 20 74 68 61 6e 20  nservative than 
19150 6e 65 63 65 73 73 61 72 79 2c 20 62 75 74 20 6d  necessary, but m
19160 75 63 68 20 65 61 73 69 65 72 20 74 68 61 6e 20  uch easier than 
19170 65 6e 66 6f 72 63 69 6e 67 0a 20 20 20 20 2a 2a  enforcing.    **
19180 20 61 6e 20 65 78 61 63 74 20 6c 69 6d 69 74 2e   an exact limit.
19190 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70 50 61 72  .    */.    pPar
191a0 73 65 2d 3e 6e 48 65 69 67 68 74 20 2b 3d 20 73  se->nHeight += s
191b0 71 6c 69 74 65 33 53 65 6c 65 63 74 45 78 70 72  qlite3SelectExpr
191c0 48 65 69 67 68 74 28 70 29 3b 0a 23 65 6e 64 69  Height(p);.#endi
191d0 66 0a 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c  f.    sqlite3Sel
191e0 65 63 74 28 70 50 61 72 73 65 2c 20 70 49 74 65  ect(pParse, pIte
191f0 6d 2d 3e 70 53 65 6c 65 63 74 2c 20 53 52 54 5f  m->pSelect, SRT_
19200 45 70 68 65 6d 54 61 62 2c 20 0a 20 20 20 20 20  EphemTab, .     
19210 20 20 20 20 20 20 20 20 20 20 20 20 70 49 74 65              pIte
19220 6d 2d 3e 69 43 75 72 73 6f 72 2c 20 70 2c 20 69  m->iCursor, p, i
19230 2c 20 26 69 73 41 67 67 2c 20 30 29 3b 0a 20 20  , &isAgg, 0);.  
19240 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63    if( db->malloc
19250 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 20 20  Failed ){.      
19260 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b  goto select_end;
19270 0a 20 20 20 20 7d 0a 23 69 66 20 64 65 66 69 6e  .    }.#if defin
19280 65 64 28 53 51 4c 49 54 45 5f 54 45 53 54 29 20  ed(SQLITE_TEST) 
19290 7c 7c 20 53 51 4c 49 54 45 5f 4d 41 58 5f 45 58  || SQLITE_MAX_EX
192a0 50 52 5f 44 45 50 54 48 3e 30 0a 20 20 20 20 70  PR_DEPTH>0.    p
192b0 50 61 72 73 65 2d 3e 6e 48 65 69 67 68 74 20 2d  Parse->nHeight -
192c0 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 45  = sqlite3SelectE
192d0 78 70 72 48 65 69 67 68 74 28 70 29 3b 0a 23 65  xprHeight(p);.#e
192e0 6e 64 69 66 0a 20 20 20 20 69 66 28 20 6e 65 65  ndif.    if( nee
192f0 64 52 65 73 74 6f 72 65 43 6f 6e 74 65 78 74 20  dRestoreContext 
19300 29 7b 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d  ){.      pParse-
19310 3e 7a 41 75 74 68 43 6f 6e 74 65 78 74 20 3d 20  >zAuthContext = 
19320 7a 53 61 76 65 64 41 75 74 68 43 6f 6e 74 65 78  zSavedAuthContex
19330 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 54 61  t;.    }.    pTa
19340 62 4c 69 73 74 20 3d 20 70 2d 3e 70 53 72 63 3b  bList = p->pSrc;
19350 0a 20 20 20 20 70 57 68 65 72 65 20 3d 20 70 2d  .    pWhere = p-
19360 3e 70 57 68 65 72 65 3b 0a 20 20 20 20 69 66 28  >pWhere;.    if(
19370 20 21 49 67 6e 6f 72 61 62 6c 65 4f 72 64 65 72   !IgnorableOrder
19380 62 79 28 65 44 65 73 74 29 20 29 7b 0a 20 20 20  by(eDest) ){.   
19390 20 20 20 70 4f 72 64 65 72 42 79 20 3d 20 70 2d     pOrderBy = p-
193a0 3e 70 4f 72 64 65 72 42 79 3b 0a 20 20 20 20 7d  >pOrderBy;.    }
193b0 0a 20 20 20 20 70 47 72 6f 75 70 42 79 20 3d 20  .    pGroupBy = 
193c0 70 2d 3e 70 47 72 6f 75 70 42 79 3b 0a 20 20 20  p->pGroupBy;.   
193d0 20 70 48 61 76 69 6e 67 20 3d 20 70 2d 3e 70 48   pHaving = p->pH
193e0 61 76 69 6e 67 3b 0a 20 20 20 20 69 73 44 69 73  aving;.    isDis
193f0 74 69 6e 63 74 20 3d 20 70 2d 3e 69 73 44 69 73  tinct = p->isDis
19400 74 69 6e 63 74 3b 0a 20 20 7d 0a 23 65 6e 64 69  tinct;.  }.#endi
19410 66 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 66 6f  f..  /* Check fo
19420 72 20 74 68 65 20 73 70 65 63 69 61 6c 20 63 61  r the special ca
19430 73 65 20 6f 66 20 61 20 6d 69 6e 28 29 20 6f 72  se of a min() or
19440 20 6d 61 78 28 29 20 66 75 6e 63 74 69 6f 6e 20   max() function 
19450 62 79 20 69 74 73 65 6c 66 0a 20 20 2a 2a 20 69  by itself.  ** i
19460 6e 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74  n the result set
19470 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 73 69 6d  ..  */.  if( sim
19480 70 6c 65 4d 69 6e 4d 61 78 51 75 65 72 79 28 70  pleMinMaxQuery(p
19490 50 61 72 73 65 2c 20 70 2c 20 65 44 65 73 74 2c  Parse, p, eDest,
194a0 20 69 50 61 72 6d 29 20 29 7b 0a 20 20 20 20 72   iParm) ){.    r
194b0 63 20 3d 20 30 3b 0a 20 20 20 20 67 6f 74 6f 20  c = 0;.    goto 
194c0 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 7d 0a  select_end;.  }.
194d0 0a 20 20 2f 2a 20 43 68 65 63 6b 20 74 6f 20 73  .  /* Check to s
194e0 65 65 20 69 66 20 74 68 69 73 20 69 73 20 61 20  ee if this is a 
194f0 73 75 62 71 75 65 72 79 20 74 68 61 74 20 63 61  subquery that ca
19500 6e 20 62 65 20 22 66 6c 61 74 74 65 6e 65 64 22  n be "flattened"
19510 20 69 6e 74 6f 20 69 74 73 20 70 61 72 65 6e 74   into its parent
19520 2e 0a 20 20 2a 2a 20 49 66 20 66 6c 61 74 74 65  ..  ** If flatte
19530 6e 69 6e 67 20 69 73 20 61 20 70 6f 73 73 69 62  ning is a possib
19540 6c 69 74 79 2c 20 64 6f 20 73 6f 20 61 6e 64 20  lity, do so and 
19550 72 65 74 75 72 6e 20 69 6d 6d 65 64 69 61 74 65  return immediate
19560 6c 79 2e 20 20 0a 20 20 2a 2f 0a 23 69 66 6e 64  ly.  .  */.#ifnd
19570 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56  ef SQLITE_OMIT_V
19580 49 45 57 0a 20 20 69 66 28 20 70 50 61 72 65 6e  IEW.  if( pParen
19590 74 20 26 26 20 70 50 61 72 65 6e 74 41 67 67 20  t && pParentAgg 
195a0 26 26 0a 20 20 20 20 20 20 66 6c 61 74 74 65 6e  &&.      flatten
195b0 53 75 62 71 75 65 72 79 28 64 62 2c 20 70 50 61  Subquery(db, pPa
195c0 72 65 6e 74 2c 20 70 61 72 65 6e 74 54 61 62 2c  rent, parentTab,
195d0 20 2a 70 50 61 72 65 6e 74 41 67 67 2c 20 69 73   *pParentAgg, is
195e0 41 67 67 29 20 29 7b 0a 20 20 20 20 69 66 28 20  Agg) ){.    if( 
195f0 69 73 41 67 67 20 29 20 2a 70 50 61 72 65 6e 74  isAgg ) *pParent
19600 41 67 67 20 3d 20 31 3b 0a 20 20 20 20 67 6f 74  Agg = 1;.    got
19610 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20  o select_end;.  
19620 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 49  }.#endif..  /* I
19630 66 20 70 6f 73 73 69 62 6c 65 2c 20 72 65 77 72  f possible, rewr
19640 69 74 65 20 74 68 65 20 71 75 65 72 79 20 74 6f  ite the query to
19650 20 75 73 65 20 47 52 4f 55 50 20 42 59 20 69 6e   use GROUP BY in
19660 73 74 65 61 64 20 6f 66 20 44 49 53 54 49 4e 43  stead of DISTINC
19670 54 2e 0a 20 20 2a 2a 20 47 52 4f 55 50 20 42 59  T..  ** GROUP BY
19680 20 6d 61 79 20 75 73 65 20 61 6e 20 69 6e 64 65   may use an inde
19690 78 2c 20 44 49 53 54 49 4e 43 54 20 6e 65 76 65  x, DISTINCT neve
196a0 72 20 64 6f 65 73 2e 0a 20 20 2a 2f 0a 20 20 69  r does..  */.  i
196b0 66 28 20 70 2d 3e 69 73 44 69 73 74 69 6e 63 74  f( p->isDistinct
196c0 20 26 26 20 21 70 2d 3e 69 73 41 67 67 20 26 26   && !p->isAgg &&
196d0 20 21 70 2d 3e 70 47 72 6f 75 70 42 79 20 29 7b   !p->pGroupBy ){
196e0 0a 20 20 20 20 70 2d 3e 70 47 72 6f 75 70 42 79  .    p->pGroupBy
196f0 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69   = sqlite3ExprLi
19700 73 74 44 75 70 28 64 62 2c 20 70 2d 3e 70 45 4c  stDup(db, p->pEL
19710 69 73 74 29 3b 0a 20 20 20 20 70 47 72 6f 75 70  ist);.    pGroup
19720 42 79 20 3d 20 70 2d 3e 70 47 72 6f 75 70 42 79  By = p->pGroupBy
19730 3b 0a 20 20 20 20 70 2d 3e 69 73 44 69 73 74 69  ;.    p->isDisti
19740 6e 63 74 20 3d 20 30 3b 0a 20 20 20 20 69 73 44  nct = 0;.    isD
19750 69 73 74 69 6e 63 74 20 3d 20 30 3b 0a 20 20 7d  istinct = 0;.  }
19760 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20  ..  /* If there 
19770 69 73 20 61 6e 20 4f 52 44 45 52 20 42 59 20 63  is an ORDER BY c
19780 6c 61 75 73 65 2c 20 74 68 65 6e 20 74 68 69 73  lause, then this
19790 20 73 6f 72 74 69 6e 67 0a 20 20 2a 2a 20 69 6e   sorting.  ** in
197a0 64 65 78 20 6d 69 67 68 74 20 65 6e 64 20 75 70  dex might end up
197b0 20 62 65 69 6e 67 20 75 6e 75 73 65 64 20 69 66   being unused if
197c0 20 74 68 65 20 64 61 74 61 20 63 61 6e 20 62 65   the data can be
197d0 20 0a 20 20 2a 2a 20 65 78 74 72 61 63 74 65 64   .  ** extracted
197e0 20 69 6e 20 70 72 65 2d 73 6f 72 74 65 64 20 6f   in pre-sorted o
197f0 72 64 65 72 2e 20 20 49 66 20 74 68 61 74 20 69  rder.  If that i
19800 73 20 74 68 65 20 63 61 73 65 2c 20 74 68 65 6e  s the case, then
19810 20 74 68 65 0a 20 20 2a 2a 20 4f 50 5f 4f 70 65   the.  ** OP_Ope
19820 6e 45 70 68 65 6d 65 72 61 6c 20 69 6e 73 74 72  nEphemeral instr
19830 75 63 74 69 6f 6e 20 77 69 6c 6c 20 62 65 20 63  uction will be c
19840 68 61 6e 67 65 64 20 74 6f 20 61 6e 20 4f 50 5f  hanged to an OP_
19850 4e 6f 6f 70 20 6f 6e 63 65 0a 20 20 2a 2a 20 77  Noop once.  ** w
19860 65 20 66 69 67 75 72 65 20 6f 75 74 20 74 68 61  e figure out tha
19870 74 20 74 68 65 20 73 6f 72 74 69 6e 67 20 69 6e  t the sorting in
19880 64 65 78 20 69 73 20 6e 6f 74 20 6e 65 65 64 65  dex is not neede
19890 64 2e 20 20 54 68 65 20 61 64 64 72 53 6f 72 74  d.  The addrSort
198a0 49 6e 64 65 78 0a 20 20 2a 2a 20 76 61 72 69 61  Index.  ** varia
198b0 62 6c 65 20 69 73 20 75 73 65 64 20 74 6f 20 66  ble is used to f
198c0 61 63 69 6c 69 74 61 74 65 20 74 68 61 74 20 63  acilitate that c
198d0 68 61 6e 67 65 2e 0a 20 20 2a 2f 0a 20 20 69 66  hange..  */.  if
198e0 28 20 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20  ( pOrderBy ){.  
198f0 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49    KeyInfo *pKeyI
19900 6e 66 6f 3b 0a 20 20 20 20 69 66 28 20 70 50 61  nfo;.    if( pPa
19910 72 73 65 2d 3e 6e 45 72 72 20 29 7b 0a 20 20 20  rse->nErr ){.   
19920 20 20 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65     goto select_e
19930 6e 64 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 4b  nd;.    }.    pK
19940 65 79 49 6e 66 6f 20 3d 20 6b 65 79 49 6e 66 6f  eyInfo = keyInfo
19950 46 72 6f 6d 45 78 70 72 4c 69 73 74 28 70 50 61  FromExprList(pPa
19960 72 73 65 2c 20 70 4f 72 64 65 72 42 79 29 3b 0a  rse, pOrderBy);.
19970 20 20 20 20 70 4f 72 64 65 72 42 79 2d 3e 69 45      pOrderBy->iE
19980 43 75 72 73 6f 72 20 3d 20 70 50 61 72 73 65 2d  Cursor = pParse-
19990 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20 70 2d 3e  >nTab++;.    p->
199a0 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b 32 5d 20  addrOpenEphm[2] 
199b0 3d 20 61 64 64 72 53 6f 72 74 49 6e 64 65 78 20  = addrSortIndex 
199c0 3d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  =.      sqlite3V
199d0 64 62 65 4f 70 33 28 76 2c 20 4f 50 5f 4f 70 65  dbeOp3(v, OP_Ope
199e0 6e 45 70 68 65 6d 65 72 61 6c 2c 20 70 4f 72 64  nEphemeral, pOrd
199f0 65 72 42 79 2d 3e 69 45 43 75 72 73 6f 72 2c 20  erBy->iECursor, 
19a00 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 2b  pOrderBy->nExpr+
19a10 32 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  2,              
19a20 20 20 20 20 20 20 20 28 63 68 61 72 2a 29 70 4b         (char*)pK
19a30 65 79 49 6e 66 6f 2c 20 50 33 5f 4b 45 59 49 4e  eyInfo, P3_KEYIN
19a40 46 4f 5f 48 41 4e 44 4f 46 46 29 3b 0a 20 20 7d  FO_HANDOFF);.  }
19a50 65 6c 73 65 7b 0a 20 20 20 20 61 64 64 72 53 6f  else{.    addrSo
19a60 72 74 49 6e 64 65 78 20 3d 20 2d 31 3b 0a 20 20  rtIndex = -1;.  
19a70 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 6f  }..  /* If the o
19a80 75 74 70 75 74 20 69 73 20 64 65 73 74 69 6e 65  utput is destine
19a90 64 20 66 6f 72 20 61 20 74 65 6d 70 6f 72 61 72  d for a temporar
19aa0 79 20 74 61 62 6c 65 2c 20 6f 70 65 6e 20 74 68  y table, open th
19ab0 61 74 20 74 61 62 6c 65 2e 0a 20 20 2a 2f 0a 20  at table..  */. 
19ac0 20 69 66 28 20 65 44 65 73 74 3d 3d 53 52 54 5f   if( eDest==SRT_
19ad0 45 70 68 65 6d 54 61 62 20 29 7b 0a 20 20 20 20  EphemTab ){.    
19ae0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
19af0 28 76 2c 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d  (v, OP_OpenEphem
19b00 65 72 61 6c 2c 20 69 50 61 72 6d 2c 20 70 45 4c  eral, iParm, pEL
19b10 69 73 74 2d 3e 6e 45 78 70 72 29 3b 0a 20 20 7d  ist->nExpr);.  }
19b20 0a 0a 20 20 2f 2a 20 53 65 74 20 74 68 65 20 6c  ..  /* Set the l
19b30 69 6d 69 74 65 72 2e 0a 20 20 2a 2f 0a 20 20 69  imiter..  */.  i
19b40 45 6e 64 20 3d 20 73 71 6c 69 74 65 33 56 64 62  End = sqlite3Vdb
19b50 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20  eMakeLabel(v);. 
19b60 20 63 6f 6d 70 75 74 65 4c 69 6d 69 74 52 65 67   computeLimitReg
19b70 69 73 74 65 72 73 28 70 50 61 72 73 65 2c 20 70  isters(pParse, p
19b80 2c 20 69 45 6e 64 29 3b 0a 0a 20 20 2f 2a 20 4f  , iEnd);..  /* O
19b90 70 65 6e 20 61 20 76 69 72 74 75 61 6c 20 69 6e  pen a virtual in
19ba0 64 65 78 20 74 6f 20 75 73 65 20 66 6f 72 20 74  dex to use for t
19bb0 68 65 20 64 69 73 74 69 6e 63 74 20 73 65 74 2e  he distinct set.
19bc0 0a 20 20 2a 2f 0a 20 20 69 66 28 20 69 73 44 69  .  */.  if( isDi
19bd0 73 74 69 6e 63 74 20 29 7b 0a 20 20 20 20 4b 65  stinct ){.    Ke
19be0 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 3b  yInfo *pKeyInfo;
19bf0 0a 20 20 20 20 61 73 73 65 72 74 28 20 69 73 41  .    assert( isA
19c00 67 67 20 7c 7c 20 70 47 72 6f 75 70 42 79 20 29  gg || pGroupBy )
19c10 3b 0a 20 20 20 20 64 69 73 74 69 6e 63 74 20 3d  ;.    distinct =
19c20 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b   pParse->nTab++;
19c30 0a 20 20 20 20 70 4b 65 79 49 6e 66 6f 20 3d 20  .    pKeyInfo = 
19c40 6b 65 79 49 6e 66 6f 46 72 6f 6d 45 78 70 72 4c  keyInfoFromExprL
19c50 69 73 74 28 70 50 61 72 73 65 2c 20 70 2d 3e 70  ist(pParse, p->p
19c60 45 4c 69 73 74 29 3b 0a 20 20 20 20 73 71 6c 69  EList);.    sqli
19c70 74 65 33 56 64 62 65 4f 70 33 28 76 2c 20 4f 50  te3VdbeOp3(v, OP
19c80 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 2c 20  _OpenEphemeral, 
19c90 64 69 73 74 69 6e 63 74 2c 20 30 2c 20 0a 20 20  distinct, 0, .  
19ca0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19cb0 20 20 20 20 20 20 28 63 68 61 72 2a 29 70 4b 65        (char*)pKe
19cc0 79 49 6e 66 6f 2c 20 50 33 5f 4b 45 59 49 4e 46  yInfo, P3_KEYINF
19cd0 4f 5f 48 41 4e 44 4f 46 46 29 3b 0a 20 20 7d 65  O_HANDOFF);.  }e
19ce0 6c 73 65 7b 0a 20 20 20 20 64 69 73 74 69 6e 63  lse{.    distinc
19cf0 74 20 3d 20 2d 31 3b 0a 20 20 7d 0a 0a 20 20 2f  t = -1;.  }..  /
19d00 2a 20 41 67 67 72 65 67 61 74 65 20 61 6e 64 20  * Aggregate and 
19d10 6e 6f 6e 2d 61 67 67 72 65 67 61 74 65 20 71 75  non-aggregate qu
19d20 65 72 69 65 73 20 61 72 65 20 68 61 6e 64 6c 65  eries are handle
19d30 64 20 64 69 66 66 65 72 65 6e 74 6c 79 20 2a 2f  d differently */
19d40 0a 20 20 69 66 28 20 21 69 73 41 67 67 20 26 26  .  if( !isAgg &&
19d50 20 70 47 72 6f 75 70 42 79 3d 3d 30 20 29 7b 0a   pGroupBy==0 ){.
19d60 20 20 20 20 2f 2a 20 54 68 69 73 20 63 61 73 65      /* This case
19d70 20 69 73 20 66 6f 72 20 6e 6f 6e 2d 61 67 67 72   is for non-aggr
19d80 65 67 61 74 65 20 71 75 65 72 69 65 73 0a 20 20  egate queries.  
19d90 20 20 2a 2a 20 42 65 67 69 6e 20 74 68 65 20 64    ** Begin the d
19da0 61 74 61 62 61 73 65 20 73 63 61 6e 0a 20 20 20  atabase scan.   
19db0 20 2a 2f 0a 20 20 20 20 70 57 49 6e 66 6f 20 3d   */.    pWInfo =
19dc0 20 73 71 6c 69 74 65 33 57 68 65 72 65 42 65 67   sqlite3WhereBeg
19dd0 69 6e 28 70 50 61 72 73 65 2c 20 70 54 61 62 4c  in(pParse, pTabL
19de0 69 73 74 2c 20 70 57 68 65 72 65 2c 20 26 70 4f  ist, pWhere, &pO
19df0 72 64 65 72 42 79 29 3b 0a 20 20 20 20 69 66 28  rderBy);.    if(
19e00 20 70 57 49 6e 66 6f 3d 3d 30 20 29 20 67 6f 74   pWInfo==0 ) got
19e10 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 0a 20  o select_end;.. 
19e20 20 20 20 2f 2a 20 49 66 20 73 6f 72 74 69 6e 67     /* If sorting
19e30 20 69 6e 64 65 78 20 74 68 61 74 20 77 61 73 20   index that was 
19e40 63 72 65 61 74 65 64 20 62 79 20 61 20 70 72 69  created by a pri
19e50 6f 72 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65  or OP_OpenEpheme
19e60 72 61 6c 20 0a 20 20 20 20 2a 2a 20 69 6e 73 74  ral .    ** inst
19e70 72 75 63 74 69 6f 6e 20 65 6e 64 65 64 20 75 70  ruction ended up
19e80 20 6e 6f 74 20 62 65 69 6e 67 20 6e 65 65 64 65   not being neede
19e90 64 2c 20 74 68 65 6e 20 63 68 61 6e 67 65 20 74  d, then change t
19ea0 68 65 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65  he OP_OpenEpheme
19eb0 72 61 6c 0a 20 20 20 20 2a 2a 20 69 6e 74 6f 20  ral.    ** into 
19ec0 61 6e 20 4f 50 5f 4e 6f 6f 70 2e 0a 20 20 20 20  an OP_Noop..    
19ed0 2a 2f 0a 20 20 20 20 69 66 28 20 61 64 64 72 53  */.    if( addrS
19ee0 6f 72 74 49 6e 64 65 78 3e 3d 30 20 26 26 20 70  ortIndex>=0 && p
19ef0 4f 72 64 65 72 42 79 3d 3d 30 20 29 7b 0a 20 20  OrderBy==0 ){.  
19f00 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43      sqlite3VdbeC
19f10 68 61 6e 67 65 54 6f 4e 6f 6f 70 28 76 2c 20 61  hangeToNoop(v, a
19f20 64 64 72 53 6f 72 74 49 6e 64 65 78 2c 20 31 29  ddrSortIndex, 1)
19f30 3b 0a 20 20 20 20 20 20 70 2d 3e 61 64 64 72 4f  ;.      p->addrO
19f40 70 65 6e 45 70 68 6d 5b 32 5d 20 3d 20 2d 31 3b  penEphm[2] = -1;
19f50 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 55  .    }..    /* U
19f60 73 65 20 74 68 65 20 73 74 61 6e 64 61 72 64 20  se the standard 
19f70 69 6e 6e 65 72 20 6c 6f 6f 70 0a 20 20 20 20 2a  inner loop.    *
19f80 2f 0a 20 20 20 20 61 73 73 65 72 74 28 21 69 73  /.    assert(!is
19f90 44 69 73 74 69 6e 63 74 29 3b 0a 20 20 20 20 69  Distinct);.    i
19fa0 66 28 20 73 65 6c 65 63 74 49 6e 6e 65 72 4c 6f  f( selectInnerLo
19fb0 6f 70 28 70 50 61 72 73 65 2c 20 70 2c 20 70 45  op(pParse, p, pE
19fc0 4c 69 73 74 2c 20 30 2c 20 30 2c 20 70 4f 72 64  List, 0, 0, pOrd
19fd0 65 72 42 79 2c 20 2d 31 2c 20 65 44 65 73 74 2c  erBy, -1, eDest,
19fe0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
19ff0 20 20 20 20 20 69 50 61 72 6d 2c 20 70 57 49 6e       iParm, pWIn
1a000 66 6f 2d 3e 69 43 6f 6e 74 69 6e 75 65 2c 20 70  fo->iContinue, p
1a010 57 49 6e 66 6f 2d 3e 69 42 72 65 61 6b 2c 20 61  WInfo->iBreak, a
1a020 66 66 29 20 29 7b 0a 20 20 20 20 20 20 20 67 6f  ff) ){.       go
1a030 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20  to select_end;. 
1a040 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 45 6e 64     }..    /* End
1a050 20 74 68 65 20 64 61 74 61 62 61 73 65 20 73 63   the database sc
1a060 61 6e 20 6c 6f 6f 70 2e 0a 20 20 20 20 2a 2f 0a  an loop..    */.
1a070 20 20 20 20 73 71 6c 69 74 65 33 57 68 65 72 65      sqlite3Where
1a080 45 6e 64 28 70 57 49 6e 66 6f 29 3b 0a 20 20 7d  End(pWInfo);.  }
1a090 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 54 68 69  else{.    /* Thi
1a0a0 73 20 69 73 20 74 68 65 20 70 72 6f 63 65 73 73  s is the process
1a0b0 69 6e 67 20 66 6f 72 20 61 67 67 72 65 67 61 74  ing for aggregat
1a0c0 65 20 71 75 65 72 69 65 73 20 2a 2f 0a 20 20 20  e queries */.   
1a0d0 20 4e 61 6d 65 43 6f 6e 74 65 78 74 20 73 4e 43   NameContext sNC
1a0e0 3b 20 20 20 20 2f 2a 20 4e 61 6d 65 20 63 6f 6e  ;    /* Name con
1a0f0 74 65 78 74 20 66 6f 72 20 70 72 6f 63 65 73 73  text for process
1a100 69 6e 67 20 61 67 67 72 65 67 61 74 65 20 69 6e  ing aggregate in
1a110 66 6f 72 6d 61 74 69 6f 6e 20 2a 2f 0a 20 20 20  formation */.   
1a120 20 69 6e 74 20 69 41 4d 65 6d 3b 20 20 20 20 20   int iAMem;     
1a130 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 4d 65       /* First Me
1a140 6d 20 61 64 64 72 65 73 73 20 66 6f 72 20 73 74  m address for st
1a150 6f 72 69 6e 67 20 63 75 72 72 65 6e 74 20 47 52  oring current GR
1a160 4f 55 50 20 42 59 20 2a 2f 0a 20 20 20 20 69 6e  OUP BY */.    in
1a170 74 20 69 42 4d 65 6d 3b 20 20 20 20 20 20 20 20  t iBMem;        
1a180 20 20 2f 2a 20 46 69 72 73 74 20 4d 65 6d 20 61    /* First Mem a
1a190 64 64 72 65 73 73 20 66 6f 72 20 70 72 65 76 69  ddress for previ
1a1a0 6f 75 73 20 47 52 4f 55 50 20 42 59 20 2a 2f 0a  ous GROUP BY */.
1a1b0 20 20 20 20 69 6e 74 20 69 55 73 65 46 6c 61 67      int iUseFlag
1a1c0 3b 20 20 20 20 20 20 20 2f 2a 20 4d 65 6d 20 61  ;       /* Mem a
1a1d0 64 64 72 65 73 73 20 68 6f 6c 64 69 6e 67 20 66  ddress holding f
1a1e0 6c 61 67 20 69 6e 64 69 63 61 74 69 6e 67 20 74  lag indicating t
1a1f0 68 61 74 20 61 74 20 6c 65 61 73 74 0a 20 20 20  hat at least.   
1a200 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a210 20 20 20 20 20 2a 2a 20 6f 6e 65 20 72 6f 77 20       ** one row 
1a220 6f 66 20 74 68 65 20 69 6e 70 75 74 20 74 6f 20  of the input to 
1a230 74 68 65 20 61 67 67 72 65 67 61 74 6f 72 20 68  the aggregator h
1a240 61 73 20 62 65 65 6e 0a 20 20 20 20 20 20 20 20  as been.        
1a250 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a260 2a 2a 20 70 72 6f 63 65 73 73 65 64 20 2a 2f 0a  ** processed */.
1a270 20 20 20 20 69 6e 74 20 69 41 62 6f 72 74 46 6c      int iAbortFl
1a280 61 67 3b 20 20 20 20 20 2f 2a 20 4d 65 6d 20 61  ag;     /* Mem a
1a290 64 64 72 65 73 73 20 77 68 69 63 68 20 63 61 75  ddress which cau
1a2a0 73 65 73 20 71 75 65 72 79 20 61 62 6f 72 74 20  ses query abort 
1a2b0 69 66 20 70 6f 73 69 74 69 76 65 20 2a 2f 0a 20  if positive */. 
1a2c0 20 20 20 69 6e 74 20 67 72 6f 75 70 42 79 53 6f     int groupBySo
1a2d0 72 74 3b 20 20 20 20 2f 2a 20 52 6f 77 73 20 63  rt;    /* Rows c
1a2e0 6f 6d 65 20 66 72 6f 6d 20 73 6f 75 72 63 65 20  ome from source 
1a2f0 69 6e 20 47 52 4f 55 50 20 42 59 20 6f 72 64 65  in GROUP BY orde
1a300 72 20 2a 2f 0a 0a 0a 20 20 20 20 2f 2a 20 54 68  r */...    /* Th
1a310 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 76 61 72 69  e following vari
1a320 61 62 6c 65 73 20 68 6f 6c 64 20 61 64 64 72 65  ables hold addre
1a330 73 73 65 73 20 6f 72 20 6c 61 62 65 6c 73 20 66  sses or labels f
1a340 6f 72 20 70 61 72 74 73 20 6f 66 20 74 68 65 0a  or parts of the.
1a350 20 20 20 20 2a 2a 20 76 69 72 74 75 61 6c 20 6d      ** virtual m
1a360 61 63 68 69 6e 65 20 70 72 6f 67 72 61 6d 20 77  achine program w
1a370 65 20 61 72 65 20 70 75 74 74 69 6e 67 20 74 6f  e are putting to
1a380 67 65 74 68 65 72 20 2a 2f 0a 20 20 20 20 69 6e  gether */.    in
1a390 74 20 61 64 64 72 4f 75 74 70 75 74 52 6f 77 3b  t addrOutputRow;
1a3a0 20 20 20 20 20 20 2f 2a 20 53 74 61 72 74 20 6f        /* Start o
1a3b0 66 20 73 75 62 72 6f 75 74 69 6e 65 20 74 68 61  f subroutine tha
1a3c0 74 20 6f 75 74 70 75 74 73 20 61 20 72 65 73 75  t outputs a resu
1a3d0 6c 74 20 72 6f 77 20 2a 2f 0a 20 20 20 20 69 6e  lt row */.    in
1a3e0 74 20 61 64 64 72 53 65 74 41 62 6f 72 74 3b 20  t addrSetAbort; 
1a3f0 20 20 20 20 20 20 2f 2a 20 53 65 74 20 74 68 65        /* Set the
1a400 20 61 62 6f 72 74 20 66 6c 61 67 20 61 6e 64 20   abort flag and 
1a410 72 65 74 75 72 6e 20 2a 2f 0a 20 20 20 20 69 6e  return */.    in
1a420 74 20 61 64 64 72 49 6e 69 74 69 61 6c 69 7a 65  t addrInitialize
1a430 4c 6f 6f 70 3b 20 2f 2a 20 53 74 61 72 74 20 6f  Loop; /* Start o
1a440 66 20 63 6f 64 65 20 74 68 61 74 20 69 6e 69 74  f code that init
1a450 69 61 6c 69 7a 65 73 20 74 68 65 20 69 6e 70 75  ializes the inpu
1a460 74 20 6c 6f 6f 70 20 2a 2f 0a 20 20 20 20 69 6e  t loop */.    in
1a470 74 20 61 64 64 72 54 6f 70 4f 66 4c 6f 6f 70 3b  t addrTopOfLoop;
1a480 20 20 20 20 20 20 2f 2a 20 54 6f 70 20 6f 66 20        /* Top of 
1a490 74 68 65 20 69 6e 70 75 74 20 6c 6f 6f 70 20 2a  the input loop *
1a4a0 2f 0a 20 20 20 20 69 6e 74 20 61 64 64 72 47 72  /.    int addrGr
1a4b0 6f 75 70 42 79 43 68 61 6e 67 65 3b 20 20 2f 2a  oupByChange;  /*
1a4c0 20 43 6f 64 65 20 74 68 61 74 20 72 75 6e 73 20   Code that runs 
1a4d0 77 68 65 6e 20 61 6e 79 20 47 52 4f 55 50 20 42  when any GROUP B
1a4e0 59 20 74 65 72 6d 20 63 68 61 6e 67 65 73 20 2a  Y term changes *
1a4f0 2f 0a 20 20 20 20 69 6e 74 20 61 64 64 72 50 72  /.    int addrPr
1a500 6f 63 65 73 73 52 6f 77 3b 20 20 20 20 20 2f 2a  ocessRow;     /*
1a510 20 43 6f 64 65 20 74 6f 20 70 72 6f 63 65 73 73   Code to process
1a520 20 61 20 73 69 6e 67 6c 65 20 69 6e 70 75 74 20   a single input 
1a530 72 6f 77 20 2a 2f 0a 20 20 20 20 69 6e 74 20 61  row */.    int a
1a540 64 64 72 45 6e 64 3b 20 20 20 20 20 20 20 20 20  ddrEnd;         
1a550 20 20 20 2f 2a 20 45 6e 64 20 6f 66 20 61 6c 6c     /* End of all
1a560 20 70 72 6f 63 65 73 73 69 6e 67 20 2a 2f 0a 20   processing */. 
1a570 20 20 20 69 6e 74 20 61 64 64 72 53 6f 72 74 69     int addrSorti
1a580 6e 67 49 64 78 3b 20 20 20 20 20 2f 2a 20 54 68  ngIdx;     /* Th
1a590 65 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72  e OP_OpenEphemer
1a5a0 61 6c 20 66 6f 72 20 74 68 65 20 73 6f 72 74 69  al for the sorti
1a5b0 6e 67 20 69 6e 64 65 78 20 2a 2f 0a 20 20 20 20  ng index */.    
1a5c0 69 6e 74 20 61 64 64 72 52 65 73 65 74 3b 20 20  int addrReset;  
1a5d0 20 20 20 20 20 20 20 20 2f 2a 20 53 75 62 72 6f          /* Subro
1a5e0 75 74 69 6e 65 20 66 6f 72 20 72 65 73 65 74 74  utine for resett
1a5f0 69 6e 67 20 74 68 65 20 61 63 63 75 6d 75 6c 61  ing the accumula
1a600 74 6f 72 20 2a 2f 0a 0a 20 20 20 20 61 64 64 72  tor */..    addr
1a610 45 6e 64 20 3d 20 73 71 6c 69 74 65 33 56 64 62  End = sqlite3Vdb
1a620 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 0a  eMakeLabel(v);..
1a630 20 20 20 20 2f 2a 20 43 6f 6e 76 65 72 74 20 54      /* Convert T
1a640 4b 5f 43 4f 4c 55 4d 4e 20 6e 6f 64 65 73 20 69  K_COLUMN nodes i
1a650 6e 74 6f 20 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d  nto TK_AGG_COLUM
1a660 4e 20 61 6e 64 20 6d 61 6b 65 20 65 6e 74 72 69  N and make entri
1a670 65 73 20 69 6e 0a 20 20 20 20 2a 2a 20 73 41 67  es in.    ** sAg
1a680 67 49 6e 66 6f 20 66 6f 72 20 61 6c 6c 20 54 4b  gInfo for all TK
1a690 5f 41 47 47 5f 46 55 4e 43 54 49 4f 4e 20 6e 6f  _AGG_FUNCTION no
1a6a0 64 65 73 20 69 6e 20 65 78 70 72 65 73 73 69 6f  des in expressio
1a6b0 6e 73 20 6f 66 20 74 68 65 0a 20 20 20 20 2a 2a  ns of the.    **
1a6c0 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
1a6d0 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 6d 65  t..    */.    me
1a6e0 6d 73 65 74 28 26 73 4e 43 2c 20 30 2c 20 73 69  mset(&sNC, 0, si
1a6f0 7a 65 6f 66 28 73 4e 43 29 29 3b 0a 20 20 20 20  zeof(sNC));.    
1a700 73 4e 43 2e 70 50 61 72 73 65 20 3d 20 70 50 61  sNC.pParse = pPa
1a710 72 73 65 3b 0a 20 20 20 20 73 4e 43 2e 70 53 72  rse;.    sNC.pSr
1a720 63 4c 69 73 74 20 3d 20 70 54 61 62 4c 69 73 74  cList = pTabList
1a730 3b 0a 20 20 20 20 73 4e 43 2e 70 41 67 67 49 6e  ;.    sNC.pAggIn
1a740 66 6f 20 3d 20 26 73 41 67 67 49 6e 66 6f 3b 0a  fo = &sAggInfo;.
1a750 20 20 20 20 73 41 67 67 49 6e 66 6f 2e 6e 53 6f      sAggInfo.nSo
1a760 72 74 69 6e 67 43 6f 6c 75 6d 6e 20 3d 20 70 47  rtingColumn = pG
1a770 72 6f 75 70 42 79 20 3f 20 70 47 72 6f 75 70 42  roupBy ? pGroupB
1a780 79 2d 3e 6e 45 78 70 72 2b 31 20 3a 20 30 3b 0a  y->nExpr+1 : 0;.
1a790 20 20 20 20 73 41 67 67 49 6e 66 6f 2e 70 47 72      sAggInfo.pGr
1a7a0 6f 75 70 42 79 20 3d 20 70 47 72 6f 75 70 42 79  oupBy = pGroupBy
1a7b0 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65  ;.    if( sqlite
1a7c0 33 45 78 70 72 41 6e 61 6c 79 7a 65 41 67 67 4c  3ExprAnalyzeAggL
1a7d0 69 73 74 28 26 73 4e 43 2c 20 70 45 4c 69 73 74  ist(&sNC, pEList
1a7e0 29 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20  ) ){.      goto 
1a7f0 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20  select_end;.    
1a800 7d 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65  }.    if( sqlite
1a810 33 45 78 70 72 41 6e 61 6c 79 7a 65 41 67 67 4c  3ExprAnalyzeAggL
1a820 69 73 74 28 26 73 4e 43 2c 20 70 4f 72 64 65 72  ist(&sNC, pOrder
1a830 42 79 29 20 29 7b 0a 20 20 20 20 20 20 67 6f 74  By) ){.      got
1a840 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20  o select_end;.  
1a850 20 20 7d 0a 20 20 20 20 69 66 28 20 70 48 61 76    }.    if( pHav
1a860 69 6e 67 20 26 26 20 73 71 6c 69 74 65 33 45 78  ing && sqlite3Ex
1a870 70 72 41 6e 61 6c 79 7a 65 41 67 67 72 65 67 61  prAnalyzeAggrega
1a880 74 65 73 28 26 73 4e 43 2c 20 70 48 61 76 69 6e  tes(&sNC, pHavin
1a890 67 29 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f  g) ){.      goto
1a8a0 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20   select_end;.   
1a8b0 20 7d 0a 20 20 20 20 73 41 67 67 49 6e 66 6f 2e   }.    sAggInfo.
1a8c0 6e 41 63 63 75 6d 75 6c 61 74 6f 72 20 3d 20 73  nAccumulator = s
1a8d0 41 67 67 49 6e 66 6f 2e 6e 43 6f 6c 75 6d 6e 3b  AggInfo.nColumn;
1a8e0 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
1a8f0 73 41 67 67 49 6e 66 6f 2e 6e 46 75 6e 63 3b 20  sAggInfo.nFunc; 
1a900 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20  i++){.      if( 
1a910 73 71 6c 69 74 65 33 45 78 70 72 41 6e 61 6c 79  sqlite3ExprAnaly
1a920 7a 65 41 67 67 4c 69 73 74 28 26 73 4e 43 2c 20  zeAggList(&sNC, 
1a930 73 41 67 67 49 6e 66 6f 2e 61 46 75 6e 63 5b 69  sAggInfo.aFunc[i
1a940 5d 2e 70 45 78 70 72 2d 3e 70 4c 69 73 74 29 20  ].pExpr->pList) 
1a950 29 7b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20  ){.        goto 
1a960 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20  select_end;.    
1a970 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66    }.    }.    if
1a980 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ( db->mallocFail
1a990 65 64 20 29 20 67 6f 74 6f 20 73 65 6c 65 63 74  ed ) goto select
1a9a0 5f 65 6e 64 3b 0a 0a 20 20 20 20 2f 2a 20 50 72  _end;..    /* Pr
1a9b0 6f 63 65 73 73 69 6e 67 20 66 6f 72 20 61 67 67  ocessing for agg
1a9c0 72 65 67 61 74 65 73 20 77 69 74 68 20 47 52 4f  regates with GRO
1a9d0 55 50 20 42 59 20 69 73 20 76 65 72 79 20 64 69  UP BY is very di
1a9e0 66 66 65 72 65 6e 74 20 61 6e 64 0a 20 20 20 20  fferent and.    
1a9f0 2a 2a 20 6d 75 63 68 20 6d 6f 72 65 20 63 6f 6d  ** much more com
1aa00 70 6c 65 78 20 74 68 61 6e 20 61 67 67 72 65 67  plex than aggreg
1aa10 61 74 65 73 20 77 69 74 68 6f 75 74 20 61 20 47  ates without a G
1aa20 52 4f 55 50 20 42 59 2e 0a 20 20 20 20 2a 2f 0a  ROUP BY..    */.
1aa30 20 20 20 20 69 66 28 20 70 47 72 6f 75 70 42 79      if( pGroupBy
1aa40 20 29 7b 0a 20 20 20 20 20 20 4b 65 79 49 6e 66   ){.      KeyInf
1aa50 6f 20 2a 70 4b 65 79 49 6e 66 6f 3b 20 20 2f 2a  o *pKeyInfo;  /*
1aa60 20 4b 65 79 69 6e 67 20 69 6e 66 6f 72 6d 61 74   Keying informat
1aa70 69 6f 6e 20 66 6f 72 20 74 68 65 20 67 72 6f 75  ion for the grou
1aa80 70 20 62 79 20 63 6c 61 75 73 65 20 2a 2f 0a 0a  p by clause */..
1aa90 20 20 20 20 20 20 2f 2a 20 43 72 65 61 74 65 20        /* Create 
1aaa0 6c 61 62 65 6c 73 20 74 68 61 74 20 77 65 20 77  labels that we w
1aab0 69 6c 6c 20 62 65 20 6e 65 65 64 69 6e 67 0a 20  ill be needing. 
1aac0 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 0a 20 20       */.     .  
1aad0 20 20 20 20 61 64 64 72 49 6e 69 74 69 61 6c 69      addrInitiali
1aae0 7a 65 4c 6f 6f 70 20 3d 20 73 71 6c 69 74 65 33  zeLoop = sqlite3
1aaf0 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29  VdbeMakeLabel(v)
1ab00 3b 0a 20 20 20 20 20 20 61 64 64 72 47 72 6f 75  ;.      addrGrou
1ab10 70 42 79 43 68 61 6e 67 65 20 3d 20 73 71 6c 69  pByChange = sqli
1ab20 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c  te3VdbeMakeLabel
1ab30 28 76 29 3b 0a 20 20 20 20 20 20 61 64 64 72 50  (v);.      addrP
1ab40 72 6f 63 65 73 73 52 6f 77 20 3d 20 73 71 6c 69  rocessRow = sqli
1ab50 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c  te3VdbeMakeLabel
1ab60 28 76 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 49  (v);..      /* I
1ab70 66 20 74 68 65 72 65 20 69 73 20 61 20 47 52 4f  f there is a GRO
1ab80 55 50 20 42 59 20 63 6c 61 75 73 65 20 77 65 20  UP BY clause we 
1ab90 6d 69 67 68 74 20 6e 65 65 64 20 61 20 73 6f 72  might need a sor
1aba0 74 69 6e 67 20 69 6e 64 65 78 20 74 6f 0a 20 20  ting index to.  
1abb0 20 20 20 20 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74      ** implement
1abc0 20 69 74 2e 20 20 41 6c 6c 6f 63 61 74 65 20 74   it.  Allocate t
1abd0 68 61 74 20 73 6f 72 74 69 6e 67 20 69 6e 64 65  hat sorting inde
1abe0 78 20 6e 6f 77 2e 20 20 49 66 20 69 74 20 74 75  x now.  If it tu
1abf0 72 6e 73 20 6f 75 74 0a 20 20 20 20 20 20 2a 2a  rns out.      **
1ac00 20 74 68 61 74 20 77 65 20 64 6f 20 6e 6f 74 20   that we do not 
1ac10 6e 65 65 64 20 69 74 20 61 66 74 65 72 20 61 6c  need it after al
1ac20 6c 2c 20 74 68 65 20 4f 70 65 6e 45 70 68 65 6d  l, the OpenEphem
1ac30 65 72 61 6c 20 69 6e 73 74 72 75 63 74 69 6f 6e  eral instruction
1ac40 0a 20 20 20 20 20 20 2a 2a 20 77 69 6c 6c 20 62  .      ** will b
1ac50 65 20 63 6f 6e 76 65 72 74 65 64 20 69 6e 74 6f  e converted into
1ac60 20 61 20 4e 6f 6f 70 2e 20 20 0a 20 20 20 20 20   a Noop.  .     
1ac70 20 2a 2f 0a 20 20 20 20 20 20 73 41 67 67 49 6e   */.      sAggIn
1ac80 66 6f 2e 73 6f 72 74 69 6e 67 49 64 78 20 3d 20  fo.sortingIdx = 
1ac90 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a  pParse->nTab++;.
1aca0 20 20 20 20 20 20 70 4b 65 79 49 6e 66 6f 20 3d        pKeyInfo =
1acb0 20 6b 65 79 49 6e 66 6f 46 72 6f 6d 45 78 70 72   keyInfoFromExpr
1acc0 4c 69 73 74 28 70 50 61 72 73 65 2c 20 70 47 72  List(pParse, pGr
1acd0 6f 75 70 42 79 29 3b 0a 20 20 20 20 20 20 61 64  oupBy);.      ad
1ace0 64 72 53 6f 72 74 69 6e 67 49 64 78 20 3d 0a 20  drSortingIdx =. 
1acf0 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
1ad00 56 64 62 65 4f 70 33 28 76 2c 20 4f 50 5f 4f 70  VdbeOp3(v, OP_Op
1ad10 65 6e 45 70 68 65 6d 65 72 61 6c 2c 20 73 41 67  enEphemeral, sAg
1ad20 67 49 6e 66 6f 2e 73 6f 72 74 69 6e 67 49 64 78  gInfo.sortingIdx
1ad30 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
1ad40 20 20 20 20 20 20 20 20 20 20 20 73 41 67 67 49             sAggI
1ad50 6e 66 6f 2e 6e 53 6f 72 74 69 6e 67 43 6f 6c 75  nfo.nSortingColu
1ad60 6d 6e 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  mn,.            
1ad70 20 20 20 20 20 20 20 20 20 20 20 20 20 28 63 68               (ch
1ad80 61 72 2a 29 70 4b 65 79 49 6e 66 6f 2c 20 50 33  ar*)pKeyInfo, P3
1ad90 5f 4b 45 59 49 4e 46 4f 5f 48 41 4e 44 4f 46 46  _KEYINFO_HANDOFF
1ada0 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 49 6e 69  );..      /* Ini
1adb0 74 69 61 6c 69 7a 65 20 6d 65 6d 6f 72 79 20 6c  tialize memory l
1adc0 6f 63 61 74 69 6f 6e 73 20 75 73 65 64 20 62 79  ocations used by
1add0 20 47 52 4f 55 50 20 42 59 20 61 67 67 72 65 67   GROUP BY aggreg
1ade0 61 74 65 20 70 72 6f 63 65 73 73 69 6e 67 0a 20  ate processing. 
1adf0 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 55       */.      iU
1ae00 73 65 46 6c 61 67 20 3d 20 70 50 61 72 73 65 2d  seFlag = pParse-
1ae10 3e 6e 4d 65 6d 2b 2b 3b 0a 20 20 20 20 20 20 69  >nMem++;.      i
1ae20 41 62 6f 72 74 46 6c 61 67 20 3d 20 70 50 61 72  AbortFlag = pPar
1ae30 73 65 2d 3e 6e 4d 65 6d 2b 2b 3b 0a 20 20 20 20  se->nMem++;.    
1ae40 20 20 69 41 4d 65 6d 20 3d 20 70 50 61 72 73 65    iAMem = pParse
1ae50 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 70 50  ->nMem;.      pP
1ae60 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 70 47  arse->nMem += pG
1ae70 72 6f 75 70 42 79 2d 3e 6e 45 78 70 72 3b 0a 20  roupBy->nExpr;. 
1ae80 20 20 20 20 20 69 42 4d 65 6d 20 3d 20 70 50 61       iBMem = pPa
1ae90 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20  rse->nMem;.     
1aea0 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d   pParse->nMem +=
1aeb0 20 70 47 72 6f 75 70 42 79 2d 3e 6e 45 78 70 72   pGroupBy->nExpr
1aec0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
1aed0 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d  dbeAddOp(v, OP_M
1aee0 65 6d 49 6e 74 2c 20 30 2c 20 69 41 62 6f 72 74  emInt, 0, iAbort
1aef0 46 6c 61 67 29 3b 0a 20 20 20 20 20 20 56 64 62  Flag);.      Vdb
1af00 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 23 20  eComment((v, "# 
1af10 63 6c 65 61 72 20 61 62 6f 72 74 20 66 6c 61 67  clear abort flag
1af20 22 29 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  "));.      sqlit
1af30 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
1af40 50 5f 4d 65 6d 49 6e 74 2c 20 30 2c 20 69 55 73  P_MemInt, 0, iUs
1af50 65 46 6c 61 67 29 3b 0a 20 20 20 20 20 20 56 64  eFlag);.      Vd
1af60 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 23  beComment((v, "#
1af70 20 69 6e 64 69 63 61 74 65 20 61 63 63 75 6d 75   indicate accumu
1af80 6c 61 74 6f 72 20 65 6d 70 74 79 22 29 29 3b 0a  lator empty"));.
1af90 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
1afa0 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 47 6f 74  eAddOp(v, OP_Got
1afb0 6f 2c 20 30 2c 20 61 64 64 72 49 6e 69 74 69 61  o, 0, addrInitia
1afc0 6c 69 7a 65 4c 6f 6f 70 29 3b 0a 0a 20 20 20 20  lizeLoop);..    
1afd0 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 61 20    /* Generate a 
1afe0 73 75 62 72 6f 75 74 69 6e 65 20 74 68 61 74 20  subroutine that 
1aff0 6f 75 74 70 75 74 73 20 61 20 73 69 6e 67 6c 65  outputs a single
1b000 20 72 6f 77 20 6f 66 20 74 68 65 20 72 65 73 75   row of the resu
1b010 6c 74 0a 20 20 20 20 20 20 2a 2a 20 73 65 74 2e  lt.      ** set.
1b020 20 20 54 68 69 73 20 73 75 62 72 6f 75 74 69 6e    This subroutin
1b030 65 20 66 69 72 73 74 20 6c 6f 6f 6b 73 20 61 74  e first looks at
1b040 20 74 68 65 20 69 55 73 65 46 6c 61 67 2e 20 20   the iUseFlag.  
1b050 49 66 20 69 55 73 65 46 6c 61 67 0a 20 20 20 20  If iUseFlag.    
1b060 20 20 2a 2a 20 69 73 20 6c 65 73 73 20 74 68 61    ** is less tha
1b070 6e 20 6f 72 20 65 71 75 61 6c 20 74 6f 20 7a 65  n or equal to ze
1b080 72 6f 2c 20 74 68 65 20 73 75 62 72 6f 75 74 69  ro, the subrouti
1b090 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 20 20  ne is a no-op.  
1b0a0 49 66 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20  If.      ** the 
1b0b0 70 72 6f 63 65 73 73 69 6e 67 20 63 61 6c 6c 73  processing calls
1b0c0 20 66 6f 72 20 74 68 65 20 71 75 65 72 79 20 74   for the query t
1b0d0 6f 20 61 62 6f 72 74 2c 20 74 68 69 73 20 73 75  o abort, this su
1b0e0 62 72 6f 75 74 69 6e 65 0a 20 20 20 20 20 20 2a  broutine.      *
1b0f0 2a 20 69 6e 63 72 65 6d 65 6e 74 73 20 74 68 65  * increments the
1b100 20 69 41 62 6f 72 74 46 6c 61 67 20 6d 65 6d 6f   iAbortFlag memo
1b110 72 79 20 6c 6f 63 61 74 69 6f 6e 20 62 65 66 6f  ry location befo
1b120 72 65 20 72 65 74 75 72 6e 69 6e 67 20 69 6e 0a  re returning in.
1b130 20 20 20 20 20 20 2a 2a 20 6f 72 64 65 72 20 74        ** order t
1b140 6f 20 73 69 67 6e 61 6c 20 74 68 65 20 63 61 6c  o signal the cal
1b150 6c 65 72 20 74 6f 20 61 62 6f 72 74 2e 0a 20 20  ler to abort..  
1b160 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 61 64 64      */.      add
1b170 72 53 65 74 41 62 6f 72 74 20 3d 20 73 71 6c 69  rSetAbort = sqli
1b180 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64  te3VdbeCurrentAd
1b190 64 72 28 76 29 3b 0a 20 20 20 20 20 20 73 71 6c  dr(v);.      sql
1b1a0 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
1b1b0 20 4f 50 5f 4d 65 6d 49 6e 74 2c 20 31 2c 20 69   OP_MemInt, 1, i
1b1c0 41 62 6f 72 74 46 6c 61 67 29 3b 0a 20 20 20 20  AbortFlag);.    
1b1d0 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76    VdbeComment((v
1b1e0 2c 20 22 23 20 73 65 74 20 61 62 6f 72 74 20 66  , "# set abort f
1b1f0 6c 61 67 22 29 29 3b 0a 20 20 20 20 20 20 73 71  lag"));.      sq
1b200 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
1b210 2c 20 4f 50 5f 52 65 74 75 72 6e 2c 20 30 2c 20  , OP_Return, 0, 
1b220 30 29 3b 0a 20 20 20 20 20 20 61 64 64 72 4f 75  0);.      addrOu
1b230 74 70 75 74 52 6f 77 20 3d 20 73 71 6c 69 74 65  tputRow = sqlite
1b240 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72  3VdbeCurrentAddr
1b250 28 76 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  (v);.      sqlit
1b260 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
1b270 50 5f 49 66 4d 65 6d 50 6f 73 2c 20 69 55 73 65  P_IfMemPos, iUse
1b280 46 6c 61 67 2c 20 61 64 64 72 4f 75 74 70 75 74  Flag, addrOutput
1b290 52 6f 77 2b 32 29 3b 0a 20 20 20 20 20 20 56 64  Row+2);.      Vd
1b2a0 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 23  beComment((v, "#
1b2b0 20 47 72 6f 75 70 62 79 20 72 65 73 75 6c 74 20   Groupby result 
1b2c0 67 65 6e 65 72 61 74 6f 72 20 65 6e 74 72 79 20  generator entry 
1b2d0 70 6f 69 6e 74 22 29 29 3b 0a 20 20 20 20 20 20  point"));.      
1b2e0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
1b2f0 28 76 2c 20 4f 50 5f 52 65 74 75 72 6e 2c 20 30  (v, OP_Return, 0
1b300 2c 20 30 29 3b 0a 20 20 20 20 20 20 66 69 6e 61  , 0);.      fina
1b310 6c 69 7a 65 41 67 67 46 75 6e 63 74 69 6f 6e 73  lizeAggFunctions
1b320 28 70 50 61 72 73 65 2c 20 26 73 41 67 67 49 6e  (pParse, &sAggIn
1b330 66 6f 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70  fo);.      if( p
1b340 48 61 76 69 6e 67 20 29 7b 0a 20 20 20 20 20 20  Having ){.      
1b350 20 20 73 71 6c 69 74 65 33 45 78 70 72 49 66 46    sqlite3ExprIfF
1b360 61 6c 73 65 28 70 50 61 72 73 65 2c 20 70 48 61  alse(pParse, pHa
1b370 76 69 6e 67 2c 20 61 64 64 72 4f 75 74 70 75 74  ving, addrOutput
1b380 52 6f 77 2b 31 2c 20 31 29 3b 0a 20 20 20 20 20  Row+1, 1);.     
1b390 20 7d 0a 20 20 20 20 20 20 72 63 20 3d 20 73 65   }.      rc = se
1b3a0 6c 65 63 74 49 6e 6e 65 72 4c 6f 6f 70 28 70 50  lectInnerLoop(pP
1b3b0 61 72 73 65 2c 20 70 2c 20 70 2d 3e 70 45 4c 69  arse, p, p->pELi
1b3c0 73 74 2c 20 30 2c 20 30 2c 20 70 4f 72 64 65 72  st, 0, 0, pOrder
1b3d0 42 79 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  By,.            
1b3e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 64                 d
1b3f0 69 73 74 69 6e 63 74 2c 20 65 44 65 73 74 2c 20  istinct, eDest, 
1b400 69 50 61 72 6d 2c 20 0a 20 20 20 20 20 20 20 20  iParm, .        
1b410 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b420 20 20 20 61 64 64 72 4f 75 74 70 75 74 52 6f 77     addrOutputRow
1b430 2b 31 2c 20 61 64 64 72 53 65 74 41 62 6f 72 74  +1, addrSetAbort
1b440 2c 20 61 66 66 29 3b 0a 20 20 20 20 20 20 69 66  , aff);.      if
1b450 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20  ( rc ){.        
1b460 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b  goto select_end;
1b470 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73  .      }.      s
1b480 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
1b490 76 2c 20 4f 50 5f 52 65 74 75 72 6e 2c 20 30 2c  v, OP_Return, 0,
1b4a0 20 30 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43   0);.      VdbeC
1b4b0 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 23 20 65 6e  omment((v, "# en
1b4c0 64 20 67 72 6f 75 70 62 79 20 72 65 73 75 6c 74  d groupby result
1b4d0 20 67 65 6e 65 72 61 74 6f 72 22 29 29 3b 0a 0a   generator"));..
1b4e0 20 20 20 20 20 20 2f 2a 20 47 65 6e 65 72 61 74        /* Generat
1b4f0 65 20 61 20 73 75 62 72 6f 75 74 69 6e 65 20 74  e a subroutine t
1b500 68 61 74 20 77 69 6c 6c 20 72 65 73 65 74 20 74  hat will reset t
1b510 68 65 20 67 72 6f 75 70 2d 62 79 20 61 63 63 75  he group-by accu
1b520 6d 75 6c 61 74 6f 72 0a 20 20 20 20 20 20 2a 2f  mulator.      */
1b530 0a 20 20 20 20 20 20 61 64 64 72 52 65 73 65 74  .      addrReset
1b540 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43 75   = sqlite3VdbeCu
1b550 72 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 20 20  rrentAddr(v);.  
1b560 20 20 20 20 72 65 73 65 74 41 63 63 75 6d 75 6c      resetAccumul
1b570 61 74 6f 72 28 70 50 61 72 73 65 2c 20 26 73 41  ator(pParse, &sA
1b580 67 67 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20 73  ggInfo);.      s
1b590 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
1b5a0 76 2c 20 4f 50 5f 52 65 74 75 72 6e 2c 20 30 2c  v, OP_Return, 0,
1b5b0 20 30 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 42   0);..      /* B
1b5c0 65 67 69 6e 20 61 20 6c 6f 6f 70 20 74 68 61 74  egin a loop that
1b5d0 20 77 69 6c 6c 20 65 78 74 72 61 63 74 20 61 6c   will extract al
1b5e0 6c 20 73 6f 75 72 63 65 20 72 6f 77 73 20 69 6e  l source rows in
1b5f0 20 47 52 4f 55 50 20 42 59 20 6f 72 64 65 72 2e   GROUP BY order.
1b600 0a 20 20 20 20 20 20 2a 2a 20 54 68 69 73 20 6d  .      ** This m
1b610 69 67 68 74 20 69 6e 76 6f 6c 76 65 20 74 77 6f  ight involve two
1b620 20 73 65 70 61 72 61 74 65 20 6c 6f 6f 70 73 20   separate loops 
1b630 77 69 74 68 20 61 6e 20 4f 50 5f 53 6f 72 74 20  with an OP_Sort 
1b640 69 6e 20 62 65 74 77 65 65 6e 2c 20 6f 72 0a 20  in between, or. 
1b650 20 20 20 20 20 2a 2a 20 69 74 20 6d 69 67 68 74       ** it might
1b660 20 62 65 20 61 20 73 69 6e 67 6c 65 20 6c 6f 6f   be a single loo
1b670 70 20 74 68 61 74 20 75 73 65 73 20 61 6e 20 69  p that uses an i
1b680 6e 64 65 78 20 74 6f 20 65 78 74 72 61 63 74 20  ndex to extract 
1b690 69 6e 66 6f 72 6d 61 74 69 6f 6e 0a 20 20 20 20  information.    
1b6a0 20 20 2a 2a 20 69 6e 20 74 68 65 20 72 69 67 68    ** in the righ
1b6b0 74 20 6f 72 64 65 72 20 74 6f 20 62 65 67 69 6e  t order to begin
1b6c0 20 77 69 74 68 2e 0a 20 20 20 20 20 20 2a 2f 0a   with..      */.
1b6d0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
1b6e0 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c  eResolveLabel(v,
1b6f0 20 61 64 64 72 49 6e 69 74 69 61 6c 69 7a 65 4c   addrInitializeL
1b700 6f 6f 70 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  oop);.      sqli
1b710 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
1b720 4f 50 5f 47 6f 73 75 62 2c 20 30 2c 20 61 64 64  OP_Gosub, 0, add
1b730 72 52 65 73 65 74 29 3b 0a 20 20 20 20 20 20 70  rReset);.      p
1b740 57 49 6e 66 6f 20 3d 20 73 71 6c 69 74 65 33 57  WInfo = sqlite3W
1b750 68 65 72 65 42 65 67 69 6e 28 70 50 61 72 73 65  hereBegin(pParse
1b760 2c 20 70 54 61 62 4c 69 73 74 2c 20 70 57 68 65  , pTabList, pWhe
1b770 72 65 2c 20 26 70 47 72 6f 75 70 42 79 29 3b 0a  re, &pGroupBy);.
1b780 20 20 20 20 20 20 69 66 28 20 70 57 49 6e 66 6f        if( pWInfo
1b790 3d 3d 30 20 29 20 67 6f 74 6f 20 73 65 6c 65 63  ==0 ) goto selec
1b7a0 74 5f 65 6e 64 3b 0a 20 20 20 20 20 20 69 66 28  t_end;.      if(
1b7b0 20 70 47 72 6f 75 70 42 79 3d 3d 30 20 29 7b 0a   pGroupBy==0 ){.
1b7c0 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6f          /* The o
1b7d0 70 74 69 6d 69 7a 65 72 20 69 73 20 61 62 6c 65  ptimizer is able
1b7e0 20 74 6f 20 64 65 6c 69 76 65 72 20 72 6f 77 73   to deliver rows
1b7f0 20 69 6e 20 67 72 6f 75 70 20 62 79 20 6f 72 64   in group by ord
1b800 65 72 20 73 6f 0a 20 20 20 20 20 20 20 20 2a 2a  er so.        **
1b810 20 77 65 20 64 6f 20 6e 6f 74 20 68 61 76 65 20   we do not have 
1b820 74 6f 20 73 6f 72 74 2e 20 20 54 68 65 20 4f 50  to sort.  The OP
1b830 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 20 74  _OpenEphemeral t
1b840 61 62 6c 65 20 77 69 6c 6c 20 62 65 0a 20 20 20  able will be.   
1b850 20 20 20 20 20 2a 2a 20 63 61 6e 63 65 6c 6c 65       ** cancelle
1b860 64 20 6c 61 74 65 72 20 62 65 63 61 75 73 65 20  d later because 
1b870 77 65 20 73 74 69 6c 6c 20 6e 65 65 64 20 74 6f  we still need to
1b880 20 75 73 65 20 74 68 65 20 70 4b 65 79 49 6e 66   use the pKeyInf
1b890 6f 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20  o.        */.   
1b8a0 20 20 20 20 20 70 47 72 6f 75 70 42 79 20 3d 20       pGroupBy = 
1b8b0 70 2d 3e 70 47 72 6f 75 70 42 79 3b 0a 20 20 20  p->pGroupBy;.   
1b8c0 20 20 20 20 20 67 72 6f 75 70 42 79 53 6f 72 74       groupBySort
1b8d0 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 65 6c 73   = 0;.      }els
1b8e0 65 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 52 6f  e{.        /* Ro
1b8f0 77 73 20 61 72 65 20 63 6f 6d 69 6e 67 20 6f 75  ws are coming ou
1b900 74 20 69 6e 20 75 6e 64 65 74 65 72 6d 69 6e 65  t in undetermine
1b910 64 20 6f 72 64 65 72 2e 20 20 57 65 20 68 61 76  d order.  We hav
1b920 65 20 74 6f 20 70 75 73 68 0a 20 20 20 20 20 20  e to push.      
1b930 20 20 2a 2a 20 65 61 63 68 20 72 6f 77 20 69 6e    ** each row in
1b940 74 6f 20 61 20 73 6f 72 74 69 6e 67 20 69 6e 64  to a sorting ind
1b950 65 78 2c 20 74 65 72 6d 69 6e 61 74 65 20 74 68  ex, terminate th
1b960 65 20 66 69 72 73 74 20 6c 6f 6f 70 2c 0a 20 20  e first loop,.  
1b970 20 20 20 20 20 20 2a 2a 20 74 68 65 6e 20 6c 6f        ** then lo
1b980 6f 70 20 6f 76 65 72 20 74 68 65 20 73 6f 72 74  op over the sort
1b990 69 6e 67 20 69 6e 64 65 78 20 69 6e 20 6f 72 64  ing index in ord
1b9a0 65 72 20 74 6f 20 67 65 74 20 74 68 65 20 6f 75  er to get the ou
1b9b0 74 70 75 74 0a 20 20 20 20 20 20 20 20 2a 2a 20  tput.        ** 
1b9c0 69 6e 20 73 6f 72 74 65 64 20 6f 72 64 65 72 0a  in sorted order.
1b9d0 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
1b9e0 20 20 20 67 72 6f 75 70 42 79 53 6f 72 74 20 3d     groupBySort =
1b9f0 20 31 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   1;.        sqli
1ba00 74 65 33 45 78 70 72 43 6f 64 65 45 78 70 72 4c  te3ExprCodeExprL
1ba10 69 73 74 28 70 50 61 72 73 65 2c 20 70 47 72 6f  ist(pParse, pGro
1ba20 75 70 42 79 29 3b 0a 20 20 20 20 20 20 20 20 73  upBy);.        s
1ba30 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
1ba40 76 2c 20 4f 50 5f 53 65 71 75 65 6e 63 65 2c 20  v, OP_Sequence, 
1ba50 73 41 67 67 49 6e 66 6f 2e 73 6f 72 74 69 6e 67  sAggInfo.sorting
1ba60 49 64 78 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  Idx, 0);.       
1ba70 20 6a 20 3d 20 70 47 72 6f 75 70 42 79 2d 3e 6e   j = pGroupBy->n
1ba80 45 78 70 72 2b 31 3b 0a 20 20 20 20 20 20 20 20  Expr+1;.        
1ba90 66 6f 72 28 69 3d 30 3b 20 69 3c 73 41 67 67 49  for(i=0; i<sAggI
1baa0 6e 66 6f 2e 6e 43 6f 6c 75 6d 6e 3b 20 69 2b 2b  nfo.nColumn; i++
1bab0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 74 72  ){.          str
1bac0 75 63 74 20 41 67 67 49 6e 66 6f 5f 63 6f 6c 20  uct AggInfo_col 
1bad0 2a 70 43 6f 6c 20 3d 20 26 73 41 67 67 49 6e 66  *pCol = &sAggInf
1bae0 6f 2e 61 43 6f 6c 5b 69 5d 3b 0a 20 20 20 20 20  o.aCol[i];.     
1baf0 20 20 20 20 20 69 66 28 20 70 43 6f 6c 2d 3e 69       if( pCol->i
1bb00 53 6f 72 74 65 72 43 6f 6c 75 6d 6e 3c 6a 20 29  SorterColumn<j )
1bb10 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
1bb20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
1bb30 43 6f 64 65 47 65 74 43 6f 6c 75 6d 6e 28 76 2c  CodeGetColumn(v,
1bb40 20 70 43 6f 6c 2d 3e 70 54 61 62 2c 20 70 43 6f   pCol->pTab, pCo
1bb50 6c 2d 3e 69 43 6f 6c 75 6d 6e 2c 20 70 43 6f 6c  l->iColumn, pCol
1bb60 2d 3e 69 54 61 62 6c 65 29 3b 0a 20 20 20 20 20  ->iTable);.     
1bb70 20 20 20 20 20 6a 2b 2b 3b 0a 20 20 20 20 20 20       j++;.      
1bb80 20 20 7d 0a 20 20 20 20 20 20 20 20 73 71 6c 69    }.        sqli
1bb90 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
1bba0 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20 6a  OP_MakeRecord, j
1bbb0 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 73 71  , 0);.        sq
1bbc0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
1bbd0 2c 20 4f 50 5f 49 64 78 49 6e 73 65 72 74 2c 20  , OP_IdxInsert, 
1bbe0 73 41 67 67 49 6e 66 6f 2e 73 6f 72 74 69 6e 67  sAggInfo.sorting
1bbf0 49 64 78 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  Idx, 0);.       
1bc00 20 73 71 6c 69 74 65 33 57 68 65 72 65 45 6e 64   sqlite3WhereEnd
1bc10 28 70 57 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20  (pWInfo);.      
1bc20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
1bc30 4f 70 28 76 2c 20 4f 50 5f 53 6f 72 74 2c 20 73  Op(v, OP_Sort, s
1bc40 41 67 67 49 6e 66 6f 2e 73 6f 72 74 69 6e 67 49  AggInfo.sortingI
1bc50 64 78 2c 20 61 64 64 72 45 6e 64 29 3b 0a 20 20  dx, addrEnd);.  
1bc60 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e        VdbeCommen
1bc70 74 28 28 76 2c 20 22 23 20 47 52 4f 55 50 20 42  t((v, "# GROUP B
1bc80 59 20 73 6f 72 74 22 29 29 3b 0a 20 20 20 20 20  Y sort"));.     
1bc90 20 20 20 73 41 67 67 49 6e 66 6f 2e 75 73 65 53     sAggInfo.useS
1bca0 6f 72 74 69 6e 67 49 64 78 20 3d 20 31 3b 0a 20  ortingIdx = 1;. 
1bcb0 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a       }..      /*
1bcc0 20 45 76 61 6c 75 61 74 65 20 74 68 65 20 63 75   Evaluate the cu
1bcd0 72 72 65 6e 74 20 47 52 4f 55 50 20 42 59 20 74  rrent GROUP BY t
1bce0 65 72 6d 73 20 61 6e 64 20 73 74 6f 72 65 20 69  erms and store i
1bcf0 6e 20 62 30 2c 20 62 31 2c 20 62 32 2e 2e 2e 0a  n b0, b1, b2....
1bd00 20 20 20 20 20 20 2a 2a 20 28 62 30 20 69 73 20        ** (b0 is 
1bd10 6d 65 6d 6f 72 79 20 6c 6f 63 61 74 69 6f 6e 20  memory location 
1bd20 69 42 4d 65 6d 2b 30 2c 20 62 31 20 69 73 20 69  iBMem+0, b1 is i
1bd30 42 4d 65 6d 2b 31 2c 20 61 6e 64 20 73 6f 20 66  BMem+1, and so f
1bd40 6f 72 74 68 29 0a 20 20 20 20 20 20 2a 2a 20 54  orth).      ** T
1bd50 68 65 6e 20 63 6f 6d 70 61 72 65 20 74 68 65 20  hen compare the 
1bd60 63 75 72 72 65 6e 74 20 47 52 4f 55 50 20 42 59  current GROUP BY
1bd70 20 74 65 72 6d 73 20 61 67 61 69 6e 73 74 20 74   terms against t
1bd80 68 65 20 47 52 4f 55 50 20 42 59 20 74 65 72 6d  he GROUP BY term
1bd90 73 0a 20 20 20 20 20 20 2a 2a 20 66 72 6f 6d 20  s.      ** from 
1bda0 74 68 65 20 70 72 65 76 69 6f 75 73 20 72 6f 77  the previous row
1bdb0 20 63 75 72 72 65 6e 74 6c 79 20 73 74 6f 72 65   currently store
1bdc0 64 20 69 6e 20 61 30 2c 20 61 31 2c 20 61 32 2e  d in a0, a1, a2.
1bdd0 2e 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  ...      */.    
1bde0 20 20 61 64 64 72 54 6f 70 4f 66 4c 6f 6f 70 20    addrTopOfLoop 
1bdf0 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72  = sqlite3VdbeCur
1be00 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 20 20 20  rentAddr(v);.   
1be10 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 47     for(j=0; j<pG
1be20 72 6f 75 70 42 79 2d 3e 6e 45 78 70 72 3b 20 6a  roupBy->nExpr; j
1be30 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  ++){.        if(
1be40 20 67 72 6f 75 70 42 79 53 6f 72 74 20 29 7b 0a   groupBySort ){.
1be50 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
1be60 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
1be70 5f 43 6f 6c 75 6d 6e 2c 20 73 41 67 67 49 6e 66  _Column, sAggInf
1be80 6f 2e 73 6f 72 74 69 6e 67 49 64 78 2c 20 6a 29  o.sortingIdx, j)
1be90 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  ;.        }else{
1bea0 0a 20 20 20 20 20 20 20 20 20 20 73 41 67 67 49  .          sAggI
1beb0 6e 66 6f 2e 64 69 72 65 63 74 4d 6f 64 65 20 3d  nfo.directMode =
1bec0 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71   1;.          sq
1bed0 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28 70 50  lite3ExprCode(pP
1bee0 61 72 73 65 2c 20 70 47 72 6f 75 70 42 79 2d 3e  arse, pGroupBy->
1bef0 61 5b 6a 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20  a[j].pExpr);.   
1bf00 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 73       }.        s
1bf10 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
1bf20 76 2c 20 4f 50 5f 4d 65 6d 53 74 6f 72 65 2c 20  v, OP_MemStore, 
1bf30 69 42 4d 65 6d 2b 6a 2c 20 6a 3c 70 47 72 6f 75  iBMem+j, j<pGrou
1bf40 70 42 79 2d 3e 6e 45 78 70 72 2d 31 29 3b 0a 20  pBy->nExpr-1);. 
1bf50 20 20 20 20 20 7d 0a 20 20 20 20 20 20 66 6f 72       }.      for
1bf60 28 6a 3d 70 47 72 6f 75 70 42 79 2d 3e 6e 45 78  (j=pGroupBy->nEx
1bf70 70 72 2d 31 3b 20 6a 3e 3d 30 3b 20 6a 2d 2d 29  pr-1; j>=0; j--)
1bf80 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 6a 3c  {.        if( j<
1bf90 70 47 72 6f 75 70 42 79 2d 3e 6e 45 78 70 72 2d  pGroupBy->nExpr-
1bfa0 31 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73  1 ){.          s
1bfb0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
1bfc0 76 2c 20 4f 50 5f 4d 65 6d 4c 6f 61 64 2c 20 69  v, OP_MemLoad, i
1bfd0 42 4d 65 6d 2b 6a 2c 20 30 29 3b 0a 20 20 20 20  BMem+j, 0);.    
1bfe0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 73 71      }.        sq
1bff0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
1c000 2c 20 4f 50 5f 4d 65 6d 4c 6f 61 64 2c 20 69 41  , OP_MemLoad, iA
1c010 4d 65 6d 2b 6a 2c 20 30 29 3b 0a 20 20 20 20 20  Mem+j, 0);.     
1c020 20 20 20 69 66 28 20 6a 3d 3d 30 20 29 7b 0a 20     if( j==0 ){. 
1c030 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
1c040 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
1c050 45 71 2c 20 30 78 32 30 30 2c 20 61 64 64 72 50  Eq, 0x200, addrP
1c060 72 6f 63 65 73 73 52 6f 77 29 3b 0a 20 20 20 20  rocessRow);.    
1c070 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1c080 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
1c090 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4e 65 2c 20  AddOp(v, OP_Ne, 
1c0a0 30 78 32 30 30 2c 20 61 64 64 72 47 72 6f 75 70  0x200, addrGroup
1c0b0 42 79 43 68 61 6e 67 65 29 3b 0a 20 20 20 20 20  ByChange);.     
1c0c0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 73 71 6c     }.        sql
1c0d0 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 33  ite3VdbeChangeP3
1c0e0 28 76 2c 20 2d 31 2c 20 28 76 6f 69 64 2a 29 70  (v, -1, (void*)p
1c0f0 4b 65 79 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b 6a  KeyInfo->aColl[j
1c100 5d 2c 20 50 33 5f 43 4f 4c 4c 53 45 51 29 3b 0a  ], P3_COLLSEQ);.
1c110 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f        }..      /
1c120 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20  * Generate code 
1c130 74 68 61 74 20 72 75 6e 73 20 77 68 65 6e 65 76  that runs whenev
1c140 65 72 20 74 68 65 20 47 52 4f 55 50 20 42 59 20  er the GROUP BY 
1c150 63 68 61 6e 67 65 73 2e 0a 20 20 20 20 20 20 2a  changes..      *
1c160 2a 20 43 68 61 6e 67 65 20 69 6e 20 74 68 65 20  * Change in the 
1c170 47 52 4f 55 50 20 42 59 20 61 72 65 20 64 65 74  GROUP BY are det
1c180 65 63 74 65 64 20 62 79 20 74 68 65 20 70 72 65  ected by the pre
1c190 76 69 6f 75 73 20 63 6f 64 65 0a 20 20 20 20 20  vious code.     
1c1a0 20 2a 2a 20 62 6c 6f 63 6b 2e 20 20 49 66 20 74   ** block.  If t
1c1b0 68 65 72 65 20 77 65 72 65 20 6e 6f 20 63 68 61  here were no cha
1c1c0 6e 67 65 73 2c 20 74 68 69 73 20 62 6c 6f 63 6b  nges, this block
1c1d0 20 69 73 20 73 6b 69 70 70 65 64 2e 0a 20 20 20   is skipped..   
1c1e0 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 54     **.      ** T
1c1f0 68 69 73 20 63 6f 64 65 20 63 6f 70 69 65 73 20  his code copies 
1c200 63 75 72 72 65 6e 74 20 67 72 6f 75 70 20 62 79  current group by
1c210 20 74 65 72 6d 73 20 69 6e 20 62 30 2c 62 31 2c   terms in b0,b1,
1c220 62 32 2c 2e 2e 2e 0a 20 20 20 20 20 20 2a 2a 20  b2,....      ** 
1c230 6f 76 65 72 20 74 6f 20 61 30 2c 61 31 2c 61 32  over to a0,a1,a2
1c240 2e 20 20 49 74 20 74 68 65 6e 20 63 61 6c 6c 73  .  It then calls
1c250 20 74 68 65 20 6f 75 74 70 75 74 20 73 75 62 72   the output subr
1c260 6f 75 74 69 6e 65 0a 20 20 20 20 20 20 2a 2a 20  outine.      ** 
1c270 61 6e 64 20 72 65 73 65 74 73 20 74 68 65 20 61  and resets the a
1c280 67 67 72 65 67 61 74 65 20 61 63 63 75 6d 75 6c  ggregate accumul
1c290 61 74 6f 72 20 72 65 67 69 73 74 65 72 73 20 69  ator registers i
1c2a0 6e 20 70 72 65 70 61 72 61 74 69 6f 6e 0a 20 20  n preparation.  
1c2b0 20 20 20 20 2a 2a 20 66 6f 72 20 74 68 65 20 6e      ** for the n
1c2c0 65 78 74 20 47 52 4f 55 50 20 42 59 20 62 61 74  ext GROUP BY bat
1c2d0 63 68 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  ch..      */.   
1c2e0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65     sqlite3VdbeRe
1c2f0 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 61 64  solveLabel(v, ad
1c300 64 72 47 72 6f 75 70 42 79 43 68 61 6e 67 65 29  drGroupByChange)
1c310 3b 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b  ;.      for(j=0;
1c320 20 6a 3c 70 47 72 6f 75 70 42 79 2d 3e 6e 45 78   j<pGroupBy->nEx
1c330 70 72 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20  pr; j++){.      
1c340 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
1c350 4f 70 28 76 2c 20 4f 50 5f 4d 65 6d 4d 6f 76 65  Op(v, OP_MemMove
1c360 2c 20 69 41 4d 65 6d 2b 6a 2c 20 69 42 4d 65 6d  , iAMem+j, iBMem
1c370 2b 6a 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  +j);.      }.   
1c380 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
1c390 64 4f 70 28 76 2c 20 4f 50 5f 47 6f 73 75 62 2c  dOp(v, OP_Gosub,
1c3a0 20 30 2c 20 61 64 64 72 4f 75 74 70 75 74 52 6f   0, addrOutputRo
1c3b0 77 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f  w);.      VdbeCo
1c3c0 6d 6d 65 6e 74 28 28 76 2c 20 22 23 20 6f 75 74  mment((v, "# out
1c3d0 70 75 74 20 6f 6e 65 20 72 6f 77 22 29 29 3b 0a  put one row"));.
1c3e0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
1c3f0 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49 66 4d  eAddOp(v, OP_IfM
1c400 65 6d 50 6f 73 2c 20 69 41 62 6f 72 74 46 6c 61  emPos, iAbortFla
1c410 67 2c 20 61 64 64 72 45 6e 64 29 3b 0a 20 20 20  g, addrEnd);.   
1c420 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28     VdbeComment((
1c430 76 2c 20 22 23 20 63 68 65 63 6b 20 61 62 6f 72  v, "# check abor
1c440 74 20 66 6c 61 67 22 29 29 3b 0a 20 20 20 20 20  t flag"));.     
1c450 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
1c460 70 28 76 2c 20 4f 50 5f 47 6f 73 75 62 2c 20 30  p(v, OP_Gosub, 0
1c470 2c 20 61 64 64 72 52 65 73 65 74 29 3b 0a 20 20  , addrReset);.  
1c480 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28      VdbeComment(
1c490 28 76 2c 20 22 23 20 72 65 73 65 74 20 61 63 63  (v, "# reset acc
1c4a0 75 6d 75 6c 61 74 6f 72 22 29 29 3b 0a 0a 20 20  umulator"));..  
1c4b0 20 20 20 20 2f 2a 20 55 70 64 61 74 65 20 74 68      /* Update th
1c4c0 65 20 61 67 67 72 65 67 61 74 65 20 61 63 63 75  e aggregate accu
1c4d0 6d 75 6c 61 74 6f 72 73 20 62 61 73 65 64 20 6f  mulators based o
1c4e0 6e 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66  n the content of
1c4f0 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20 63 75  .      ** the cu
1c500 72 72 65 6e 74 20 72 6f 77 0a 20 20 20 20 20 20  rrent row.      
1c510 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  */.      sqlite3
1c520 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c  VdbeResolveLabel
1c530 28 76 2c 20 61 64 64 72 50 72 6f 63 65 73 73 52  (v, addrProcessR
1c540 6f 77 29 3b 0a 20 20 20 20 20 20 75 70 64 61 74  ow);.      updat
1c550 65 41 63 63 75 6d 75 6c 61 74 6f 72 28 70 50 61  eAccumulator(pPa
1c560 72 73 65 2c 20 26 73 41 67 67 49 6e 66 6f 29 3b  rse, &sAggInfo);
1c570 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
1c580 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 65  beAddOp(v, OP_Me
1c590 6d 49 6e 74 2c 20 31 2c 20 69 55 73 65 46 6c 61  mInt, 1, iUseFla
1c5a0 67 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f  g);.      VdbeCo
1c5b0 6d 6d 65 6e 74 28 28 76 2c 20 22 23 20 69 6e 64  mment((v, "# ind
1c5c0 69 63 61 74 65 20 64 61 74 61 20 69 6e 20 61 63  icate data in ac
1c5d0 63 75 6d 75 6c 61 74 6f 72 22 29 29 3b 0a 0a 20  cumulator"));.. 
1c5e0 20 20 20 20 20 2f 2a 20 45 6e 64 20 6f 66 20 74       /* End of t
1c5f0 68 65 20 6c 6f 6f 70 0a 20 20 20 20 20 20 2a 2f  he loop.      */
1c600 0a 20 20 20 20 20 20 69 66 28 20 67 72 6f 75 70  .      if( group
1c610 42 79 53 6f 72 74 20 29 7b 0a 20 20 20 20 20 20  BySort ){.      
1c620 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
1c630 4f 70 28 76 2c 20 4f 50 5f 4e 65 78 74 2c 20 73  Op(v, OP_Next, s
1c640 41 67 67 49 6e 66 6f 2e 73 6f 72 74 69 6e 67 49  AggInfo.sortingI
1c650 64 78 2c 20 61 64 64 72 54 6f 70 4f 66 4c 6f 6f  dx, addrTopOfLoo
1c660 70 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  p);.      }else{
1c670 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
1c680 57 68 65 72 65 45 6e 64 28 70 57 49 6e 66 6f 29  WhereEnd(pWInfo)
1c690 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
1c6a0 33 56 64 62 65 43 68 61 6e 67 65 54 6f 4e 6f 6f  3VdbeChangeToNoo
1c6b0 70 28 76 2c 20 61 64 64 72 53 6f 72 74 69 6e 67  p(v, addrSorting
1c6c0 49 64 78 2c 20 31 29 3b 0a 20 20 20 20 20 20 7d  Idx, 1);.      }
1c6d0 0a 0a 20 20 20 20 20 20 2f 2a 20 4f 75 74 70 75  ..      /* Outpu
1c6e0 74 20 74 68 65 20 66 69 6e 61 6c 20 72 6f 77 20  t the final row 
1c6f0 6f 66 20 72 65 73 75 6c 74 0a 20 20 20 20 20 20  of result.      
1c700 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  */.      sqlite3
1c710 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
1c720 47 6f 73 75 62 2c 20 30 2c 20 61 64 64 72 4f 75  Gosub, 0, addrOu
1c730 74 70 75 74 52 6f 77 29 3b 0a 20 20 20 20 20 20  tputRow);.      
1c740 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20  VdbeComment((v, 
1c750 22 23 20 6f 75 74 70 75 74 20 66 69 6e 61 6c 20  "# output final 
1c760 72 6f 77 22 29 29 3b 0a 20 20 20 20 20 20 0a 20  row"));.      . 
1c770 20 20 20 7d 20 2f 2a 20 65 6e 64 69 66 20 70 47     } /* endif pG
1c780 72 6f 75 70 42 79 20 2a 2f 0a 20 20 20 20 65 6c  roupBy */.    el
1c790 73 65 20 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68  se {.      /* Th
1c7a0 69 73 20 63 61 73 65 20 72 75 6e 73 20 69 66 20  is case runs if 
1c7b0 74 68 65 20 61 67 67 72 65 67 61 74 65 20 68 61  the aggregate ha
1c7c0 73 20 6e 6f 20 47 52 4f 55 50 20 42 59 20 63 6c  s no GROUP BY cl
1c7d0 61 75 73 65 2e 20 20 54 68 65 0a 20 20 20 20 20  ause.  The.     
1c7e0 20 2a 2a 20 70 72 6f 63 65 73 73 69 6e 67 20 69   ** processing i
1c7f0 73 20 6d 75 63 68 20 73 69 6d 70 6c 65 72 20 73  s much simpler s
1c800 69 6e 63 65 20 74 68 65 72 65 20 69 73 20 6f 6e  ince there is on
1c810 6c 79 20 61 20 73 69 6e 67 6c 65 20 72 6f 77 0a  ly a single row.
1c820 20 20 20 20 20 20 2a 2a 20 6f 66 20 6f 75 74 70        ** of outp
1c830 75 74 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  ut..      */.   
1c840 20 20 20 72 65 73 65 74 41 63 63 75 6d 75 6c 61     resetAccumula
1c850 74 6f 72 28 70 50 61 72 73 65 2c 20 26 73 41 67  tor(pParse, &sAg
1c860 67 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20 70 57  gInfo);.      pW
1c870 49 6e 66 6f 20 3d 20 73 71 6c 69 74 65 33 57 68  Info = sqlite3Wh
1c880 65 72 65 42 65 67 69 6e 28 70 50 61 72 73 65 2c  ereBegin(pParse,
1c890 20 70 54 61 62 4c 69 73 74 2c 20 70 57 68 65 72   pTabList, pWher
1c8a0 65 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28  e, 0);.      if(
1c8b0 20 70 57 49 6e 66 6f 3d 3d 30 20 29 20 67 6f 74   pWInfo==0 ) got
1c8c0 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20  o select_end;.  
1c8d0 20 20 20 20 75 70 64 61 74 65 41 63 63 75 6d 75      updateAccumu
1c8e0 6c 61 74 6f 72 28 70 50 61 72 73 65 2c 20 26 73  lator(pParse, &s
1c8f0 41 67 67 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20  AggInfo);.      
1c900 73 71 6c 69 74 65 33 57 68 65 72 65 45 6e 64 28  sqlite3WhereEnd(
1c910 70 57 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20 66  pWInfo);.      f
1c920 69 6e 61 6c 69 7a 65 41 67 67 46 75 6e 63 74 69  inalizeAggFuncti
1c930 6f 6e 73 28 70 50 61 72 73 65 2c 20 26 73 41 67  ons(pParse, &sAg
1c940 67 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20 70 4f  gInfo);.      pO
1c950 72 64 65 72 42 79 20 3d 20 30 3b 0a 20 20 20 20  rderBy = 0;.    
1c960 20 20 69 66 28 20 70 48 61 76 69 6e 67 20 29 7b    if( pHaving ){
1c970 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
1c980 45 78 70 72 49 66 46 61 6c 73 65 28 70 50 61 72  ExprIfFalse(pPar
1c990 73 65 2c 20 70 48 61 76 69 6e 67 2c 20 61 64 64  se, pHaving, add
1c9a0 72 45 6e 64 2c 20 31 29 3b 0a 20 20 20 20 20 20  rEnd, 1);.      
1c9b0 7d 0a 20 20 20 20 20 20 73 65 6c 65 63 74 49 6e  }.      selectIn
1c9c0 6e 65 72 4c 6f 6f 70 28 70 50 61 72 73 65 2c 20  nerLoop(pParse, 
1c9d0 70 2c 20 70 2d 3e 70 45 4c 69 73 74 2c 20 30 2c  p, p->pEList, 0,
1c9e0 20 30 2c 20 30 2c 20 2d 31 2c 20 0a 20 20 20 20   0, 0, -1, .    
1c9f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ca00 20 20 65 44 65 73 74 2c 20 69 50 61 72 6d 2c 20    eDest, iParm, 
1ca10 61 64 64 72 45 6e 64 2c 20 61 64 64 72 45 6e 64  addrEnd, addrEnd
1ca20 2c 20 61 66 66 29 3b 0a 20 20 20 20 7d 0a 20 20  , aff);.    }.  
1ca30 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73    sqlite3VdbeRes
1ca40 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 61 64 64  olveLabel(v, add
1ca50 72 45 6e 64 29 3b 0a 20 20 20 20 0a 20 20 7d 20  rEnd);.    .  } 
1ca60 2f 2a 20 65 6e 64 69 66 20 61 67 67 72 65 67 61  /* endif aggrega
1ca70 74 65 20 71 75 65 72 79 20 2a 2f 0a 0a 20 20 2f  te query */..  /
1ca80 2a 20 49 66 20 74 68 65 72 65 20 69 73 20 61 6e  * If there is an
1ca90 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65   ORDER BY clause
1caa0 2c 20 74 68 65 6e 20 77 65 20 6e 65 65 64 20 74  , then we need t
1cab0 6f 20 73 6f 72 74 20 74 68 65 20 72 65 73 75 6c  o sort the resul
1cac0 74 73 0a 20 20 2a 2a 20 61 6e 64 20 73 65 6e 64  ts.  ** and send
1cad0 20 74 68 65 6d 20 74 6f 20 74 68 65 20 63 61 6c   them to the cal
1cae0 6c 62 61 63 6b 20 6f 6e 65 20 62 79 20 6f 6e 65  lback one by one
1caf0 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 4f 72  ..  */.  if( pOr
1cb00 64 65 72 42 79 20 29 7b 0a 20 20 20 20 67 65 6e  derBy ){.    gen
1cb10 65 72 61 74 65 53 6f 72 74 54 61 69 6c 28 70 50  erateSortTail(pP
1cb20 61 72 73 65 2c 20 70 2c 20 76 2c 20 70 45 4c 69  arse, p, v, pELi
1cb30 73 74 2d 3e 6e 45 78 70 72 2c 20 65 44 65 73 74  st->nExpr, eDest
1cb40 2c 20 69 50 61 72 6d 29 3b 0a 20 20 7d 0a 0a 23  , iParm);.  }..#
1cb50 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
1cb60 49 54 5f 53 55 42 51 55 45 52 59 0a 20 20 2f 2a  IT_SUBQUERY.  /*
1cb70 20 49 66 20 74 68 69 73 20 77 61 73 20 61 20 73   If this was a s
1cb80 75 62 71 75 65 72 79 2c 20 77 65 20 68 61 76 65  ubquery, we have
1cb90 20 6e 6f 77 20 63 6f 6e 76 65 72 74 65 64 20 74   now converted t
1cba0 68 65 20 73 75 62 71 75 65 72 79 20 69 6e 74 6f  he subquery into
1cbb0 20 61 0a 20 20 2a 2a 20 74 65 6d 70 6f 72 61 72   a.  ** temporar
1cbc0 79 20 74 61 62 6c 65 2e 20 20 53 6f 20 73 65 74  y table.  So set
1cbd0 20 74 68 65 20 53 72 63 4c 69 73 74 5f 69 74 65   the SrcList_ite
1cbe0 6d 2e 69 73 50 6f 70 75 6c 61 74 65 64 20 66 6c  m.isPopulated fl
1cbf0 61 67 20 74 6f 20 70 72 65 76 65 6e 74 0a 20 20  ag to prevent.  
1cc00 2a 2a 20 74 68 69 73 20 73 75 62 71 75 65 72 79  ** this subquery
1cc10 20 66 72 6f 6d 20 62 65 69 6e 67 20 65 76 61 6c   from being eval
1cc20 75 61 74 65 64 20 61 67 61 69 6e 20 61 6e 64 20  uated again and 
1cc30 74 6f 20 66 6f 72 63 65 20 74 68 65 20 75 73 65  to force the use
1cc40 20 6f 66 0a 20 20 2a 2a 20 74 68 65 20 74 65 6d   of.  ** the tem
1cc50 70 6f 72 61 72 79 20 74 61 62 6c 65 2e 0a 20 20  porary table..  
1cc60 2a 2f 0a 20 20 69 66 28 20 70 50 61 72 65 6e 74  */.  if( pParent
1cc70 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
1cc80 70 50 61 72 65 6e 74 2d 3e 70 53 72 63 2d 3e 6e  pParent->pSrc->n
1cc90 53 72 63 3e 70 61 72 65 6e 74 54 61 62 20 29 3b  Src>parentTab );
1cca0 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61  .    assert( pPa
1ccb0 72 65 6e 74 2d 3e 70 53 72 63 2d 3e 61 5b 70 61  rent->pSrc->a[pa
1ccc0 72 65 6e 74 54 61 62 5d 2e 70 53 65 6c 65 63 74  rentTab].pSelect
1ccd0 3d 3d 70 20 29 3b 0a 20 20 20 20 70 50 61 72 65  ==p );.    pPare
1cce0 6e 74 2d 3e 70 53 72 63 2d 3e 61 5b 70 61 72 65  nt->pSrc->a[pare
1ccf0 6e 74 54 61 62 5d 2e 69 73 50 6f 70 75 6c 61 74  ntTab].isPopulat
1cd00 65 64 20 3d 20 31 3b 0a 20 20 7d 0a 23 65 6e 64  ed = 1;.  }.#end
1cd10 69 66 0a 0a 20 20 2f 2a 20 4a 75 6d 70 20 68 65  if..  /* Jump he
1cd20 72 65 20 74 6f 20 73 6b 69 70 20 74 68 69 73 20  re to skip this 
1cd30 71 75 65 72 79 0a 20 20 2a 2f 0a 20 20 73 71 6c  query.  */.  sql
1cd40 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c  ite3VdbeResolveL
1cd50 61 62 65 6c 28 76 2c 20 69 45 6e 64 29 3b 0a 0a  abel(v, iEnd);..
1cd60 20 20 2f 2a 20 54 68 65 20 53 45 4c 45 43 54 20    /* The SELECT 
1cd70 77 61 73 20 73 75 63 63 65 73 73 66 75 6c 6c 79  was successfully
1cd80 20 63 6f 64 65 64 2e 20 20 20 53 65 74 20 74 68   coded.   Set th
1cd90 65 20 72 65 74 75 72 6e 20 63 6f 64 65 20 74 6f  e return code to
1cda0 20 30 0a 20 20 2a 2a 20 74 6f 20 69 6e 64 69 63   0.  ** to indic
1cdb0 61 74 65 20 6e 6f 20 65 72 72 6f 72 73 2e 0a 20  ate no errors.. 
1cdc0 20 2a 2f 0a 20 20 72 63 20 3d 20 30 3b 0a 0a 20   */.  rc = 0;.. 
1cdd0 20 2f 2a 20 43 6f 6e 74 72 6f 6c 20 6a 75 6d 70   /* Control jump
1cde0 73 20 74 6f 20 68 65 72 65 20 69 66 20 61 6e 20  s to here if an 
1cdf0 65 72 72 6f 72 20 69 73 20 65 6e 63 6f 75 6e 74  error is encount
1ce00 65 72 65 64 20 61 62 6f 76 65 2c 20 6f 72 20 75  ered above, or u
1ce10 70 6f 6e 0a 20 20 2a 2a 20 73 75 63 63 65 73 73  pon.  ** success
1ce20 66 75 6c 20 63 6f 64 69 6e 67 20 6f 66 20 74 68  ful coding of th
1ce30 65 20 53 45 4c 45 43 54 2e 0a 20 20 2a 2f 0a 73  e SELECT..  */.s
1ce40 65 6c 65 63 74 5f 65 6e 64 3a 0a 0a 20 20 2f 2a  elect_end:..  /*
1ce50 20 49 64 65 6e 74 69 66 79 20 63 6f 6c 75 6d 6e   Identify column
1ce60 20 6e 61 6d 65 73 20 69 66 20 77 65 20 77 69 6c   names if we wil
1ce70 6c 20 62 65 20 75 73 69 6e 67 20 74 68 65 6d 20  l be using them 
1ce80 69 6e 20 61 20 63 61 6c 6c 62 61 63 6b 2e 20 20  in a callback.  
1ce90 54 68 69 73 0a 20 20 2a 2a 20 73 74 65 70 20 69  This.  ** step i
1cea0 73 20 73 6b 69 70 70 65 64 20 69 66 20 74 68 65  s skipped if the
1ceb0 20 6f 75 74 70 75 74 20 69 73 20 67 6f 69 6e 67   output is going
1cec0 20 74 6f 20 73 6f 6d 65 20 6f 74 68 65 72 20 64   to some other d
1ced0 65 73 74 69 6e 61 74 69 6f 6e 2e 0a 20 20 2a 2f  estination..  */
1cee0 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
1cef0 45 5f 4f 4b 20 26 26 20 65 44 65 73 74 3d 3d 53  E_OK && eDest==S
1cf00 52 54 5f 43 61 6c 6c 62 61 63 6b 20 29 7b 0a 20  RT_Callback ){. 
1cf10 20 20 20 67 65 6e 65 72 61 74 65 43 6f 6c 75 6d     generateColum
1cf20 6e 4e 61 6d 65 73 28 70 50 61 72 73 65 2c 20 70  nNames(pParse, p
1cf30 54 61 62 4c 69 73 74 2c 20 70 45 4c 69 73 74 29  TabList, pEList)
1cf40 3b 0a 20 20 7d 0a 0a 20 20 73 71 6c 69 74 65 33  ;.  }..  sqlite3
1cf50 5f 66 72 65 65 28 73 41 67 67 49 6e 66 6f 2e 61  _free(sAggInfo.a
1cf60 43 6f 6c 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f  Col);.  sqlite3_
1cf70 66 72 65 65 28 73 41 67 67 49 6e 66 6f 2e 61 46  free(sAggInfo.aF
1cf80 75 6e 63 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  unc);.  return r
1cf90 63 3b 0a 7d 0a 0a 23 69 66 20 64 65 66 69 6e 65  c;.}..#if define
1cfa0 64 28 53 51 4c 49 54 45 5f 44 45 42 55 47 29 0a  d(SQLITE_DEBUG).
1cfb0 2f 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  /*.*************
1cfc0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1cfd0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1cfe0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1cff0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1d000 2a 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77  **.** The follow
1d010 69 6e 67 20 63 6f 64 65 20 69 73 20 75 73 65 64  ing code is used
1d020 20 66 6f 72 20 74 65 73 74 69 6e 67 20 61 6e 64   for testing and
1d030 20 64 65 62 75 67 67 69 6e 67 20 6f 6e 6c 79 2e   debugging only.
1d040 20 20 54 68 65 20 63 6f 64 65 0a 2a 2a 20 74 68    The code.** th
1d050 61 74 20 66 6f 6c 6c 6f 77 73 20 64 6f 65 73 20  at follows does 
1d060 6e 6f 74 20 61 70 70 65 61 72 20 69 6e 20 6e 6f  not appear in no
1d070 72 6d 61 6c 20 62 75 69 6c 64 73 2e 0a 2a 2a 0a  rmal builds..**.
1d080 2a 2a 20 54 68 65 73 65 20 72 6f 75 74 69 6e 65  ** These routine
1d090 73 20 61 72 65 20 75 73 65 64 20 74 6f 20 70 72  s are used to pr
1d0a0 69 6e 74 20 6f 75 74 20 74 68 65 20 63 6f 6e 74  int out the cont
1d0b0 65 6e 74 20 6f 66 20 61 6c 6c 20 6f 72 20 70 61  ent of all or pa
1d0c0 72 74 20 6f 66 20 61 20 0a 2a 2a 20 70 61 72 73  rt of a .** pars
1d0d0 65 20 73 74 72 75 63 74 75 72 65 73 20 73 75 63  e structures suc
1d0e0 68 20 61 73 20 53 65 6c 65 63 74 20 6f 72 20 45  h as Select or E
1d0f0 78 70 72 2e 20 20 53 75 63 68 20 70 72 69 6e 74  xpr.  Such print
1d100 6f 75 74 73 20 61 72 65 20 75 73 65 66 75 6c 0a  outs are useful.
1d110 2a 2a 20 66 6f 72 20 68 65 6c 70 69 6e 67 20 74  ** for helping t
1d120 6f 20 75 6e 64 65 72 73 74 61 6e 64 20 77 68 61  o understand wha
1d130 74 20 69 73 20 68 61 70 70 65 6e 69 6e 67 20 69  t is happening i
1d140 6e 73 69 64 65 20 74 68 65 20 63 6f 64 65 20 67  nside the code g
1d150 65 6e 65 72 61 74 6f 72 0a 2a 2a 20 64 75 72 69  enerator.** duri
1d160 6e 67 20 74 68 65 20 65 78 65 63 75 74 69 6f 6e  ng the execution
1d170 20 6f 66 20 63 6f 6d 70 6c 65 78 20 53 45 4c 45   of complex SELE
1d180 43 54 20 73 74 61 74 65 6d 65 6e 74 73 2e 0a 2a  CT statements..*
1d190 2a 0a 2a 2a 20 54 68 65 73 65 20 72 6f 75 74 69  *.** These routi
1d1a0 6e 65 20 61 72 65 20 6e 6f 74 20 63 61 6c 6c 65  ne are not calle
1d1b0 64 20 61 6e 79 77 68 65 72 65 20 66 72 6f 6d 20  d anywhere from 
1d1c0 77 69 74 68 69 6e 20 74 68 65 20 6e 6f 72 6d 61  within the norma
1d1d0 6c 0a 2a 2a 20 63 6f 64 65 20 62 61 73 65 2e 20  l.** code base. 
1d1e0 20 54 68 65 6e 20 61 72 65 20 69 6e 74 65 6e 64   Then are intend
1d1f0 65 64 20 74 6f 20 62 65 20 63 61 6c 6c 65 64 20  ed to be called 
1d200 66 72 6f 6d 20 77 69 74 68 69 6e 20 74 68 65 20  from within the 
1d210 64 65 62 75 67 67 65 72 0a 2a 2a 20 6f 72 20 66  debugger.** or f
1d220 72 6f 6d 20 74 65 6d 70 6f 72 61 72 79 20 22 70  rom temporary "p
1d230 72 69 6e 74 66 22 20 73 74 61 74 65 6d 65 6e 74  rintf" statement
1d240 73 20 69 6e 73 65 72 74 65 64 20 66 6f 72 20 64  s inserted for d
1d250 65 62 75 67 67 69 6e 67 2e 0a 2a 2f 0a 76 6f 69  ebugging..*/.voi
1d260 64 20 73 71 6c 69 74 65 33 50 72 69 6e 74 45 78  d sqlite3PrintEx
1d270 70 72 28 45 78 70 72 20 2a 70 29 7b 0a 20 20 69  pr(Expr *p){.  i
1d280 66 28 20 70 2d 3e 74 6f 6b 65 6e 2e 7a 20 26 26  f( p->token.z &&
1d290 20 70 2d 3e 74 6f 6b 65 6e 2e 6e 3e 30 20 29 7b   p->token.n>0 ){
1d2a0 0a 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75  .    sqlite3Debu
1d2b0 67 50 72 69 6e 74 66 28 22 28 25 2e 2a 73 22 2c  gPrintf("(%.*s",
1d2c0 20 70 2d 3e 74 6f 6b 65 6e 2e 6e 2c 20 70 2d 3e   p->token.n, p->
1d2d0 74 6f 6b 65 6e 2e 7a 29 3b 0a 20 20 7d 65 6c 73  token.z);.  }els
1d2e0 65 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 65  e{.    sqlite3De
1d2f0 62 75 67 50 72 69 6e 74 66 28 22 28 25 64 22 2c  bugPrintf("(%d",
1d300 20 70 2d 3e 6f 70 29 3b 0a 20 20 7d 0a 20 20 69   p->op);.  }.  i
1d310 66 28 20 70 2d 3e 70 4c 65 66 74 20 29 7b 0a 20  f( p->pLeft ){. 
1d320 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50     sqlite3DebugP
1d330 72 69 6e 74 66 28 22 20 22 29 3b 0a 20 20 20 20  rintf(" ");.    
1d340 73 71 6c 69 74 65 33 50 72 69 6e 74 45 78 70 72  sqlite3PrintExpr
1d350 28 70 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 7d 0a  (p->pLeft);.  }.
1d360 20 20 69 66 28 20 70 2d 3e 70 52 69 67 68 74 20    if( p->pRight 
1d370 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 65  ){.    sqlite3De
1d380 62 75 67 50 72 69 6e 74 66 28 22 20 22 29 3b 0a  bugPrintf(" ");.
1d390 20 20 20 20 73 71 6c 69 74 65 33 50 72 69 6e 74      sqlite3Print
1d3a0 45 78 70 72 28 70 2d 3e 70 52 69 67 68 74 29 3b  Expr(p->pRight);
1d3b0 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 44 65  .  }.  sqlite3De
1d3c0 62 75 67 50 72 69 6e 74 66 28 22 29 22 29 3b 0a  bugPrintf(")");.
1d3d0 7d 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 50 72  }.void sqlite3Pr
1d3e0 69 6e 74 45 78 70 72 4c 69 73 74 28 45 78 70 72  intExprList(Expr
1d3f0 4c 69 73 74 20 2a 70 4c 69 73 74 29 7b 0a 20 20  List *pList){.  
1d400 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d 30  int i;.  for(i=0
1d410 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e 45 78 70 72  ; i<pList->nExpr
1d420 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69  ; i++){.    sqli
1d430 74 65 33 50 72 69 6e 74 45 78 70 72 28 70 4c 69  te3PrintExpr(pLi
1d440 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 29 3b  st->a[i].pExpr);
1d450 0a 20 20 20 20 69 66 28 20 69 3c 70 4c 69 73 74  .    if( i<pList
1d460 2d 3e 6e 45 78 70 72 2d 31 20 29 7b 0a 20 20 20  ->nExpr-1 ){.   
1d470 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50     sqlite3DebugP
1d480 72 69 6e 74 66 28 22 2c 20 22 29 3b 0a 20 20 20  rintf(", ");.   
1d490 20 7d 0a 20 20 7d 0a 7d 0a 76 6f 69 64 20 73 71   }.  }.}.void sq
1d4a0 6c 69 74 65 33 50 72 69 6e 74 53 65 6c 65 63 74  lite3PrintSelect
1d4b0 28 53 65 6c 65 63 74 20 2a 70 2c 20 69 6e 74 20  (Select *p, int 
1d4c0 69 6e 64 65 6e 74 29 7b 0a 20 20 73 71 6c 69 74  indent){.  sqlit
1d4d0 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 25  e3DebugPrintf("%
1d4e0 2a 73 53 45 4c 45 43 54 28 25 70 29 20 22 2c 20  *sSELECT(%p) ", 
1d4f0 69 6e 64 65 6e 74 2c 20 22 22 2c 20 70 29 3b 0a  indent, "", p);.
1d500 20 20 73 71 6c 69 74 65 33 50 72 69 6e 74 45 78    sqlite3PrintEx
1d510 70 72 4c 69 73 74 28 70 2d 3e 70 45 4c 69 73 74  prList(p->pEList
1d520 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 65 62 75  );.  sqlite3Debu
1d530 67 50 72 69 6e 74 66 28 22 5c 6e 22 29 3b 0a 20  gPrintf("\n");. 
1d540 20 69 66 28 20 70 2d 3e 70 53 72 63 20 29 7b 0a   if( p->pSrc ){.
1d550 20 20 20 20 63 68 61 72 20 2a 7a 50 72 65 66 69      char *zPrefi
1d560 78 3b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20  x;.    int i;.  
1d570 20 20 7a 50 72 65 66 69 78 20 3d 20 22 46 52 4f    zPrefix = "FRO
1d580 4d 22 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b  M";.    for(i=0;
1d590 20 69 3c 70 2d 3e 70 53 72 63 2d 3e 6e 53 72 63   i<p->pSrc->nSrc
1d5a0 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 73 74  ; i++){.      st
1d5b0 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65  ruct SrcList_ite
1d5c0 6d 20 2a 70 49 74 65 6d 20 3d 20 26 70 2d 3e 70  m *pItem = &p->p
1d5d0 53 72 63 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20 20  Src->a[i];.     
1d5e0 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69   sqlite3DebugPri
1d5f0 6e 74 66 28 22 25 2a 73 20 22 2c 20 69 6e 64 65  ntf("%*s ", inde
1d600 6e 74 2b 36 2c 20 7a 50 72 65 66 69 78 29 3b 0a  nt+6, zPrefix);.
1d610 20 20 20 20 20 20 7a 50 72 65 66 69 78 20 3d 20        zPrefix = 
1d620 22 22 3b 0a 20 20 20 20 20 20 69 66 28 20 70 49  "";.      if( pI
1d630 74 65 6d 2d 3e 70 53 65 6c 65 63 74 20 29 7b 0a  tem->pSelect ){.
1d640 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 44          sqlite3D
1d650 65 62 75 67 50 72 69 6e 74 66 28 22 28 5c 6e 22  ebugPrintf("(\n"
1d660 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
1d670 65 33 50 72 69 6e 74 53 65 6c 65 63 74 28 70 49  e3PrintSelect(pI
1d680 74 65 6d 2d 3e 70 53 65 6c 65 63 74 2c 20 69 6e  tem->pSelect, in
1d690 64 65 6e 74 2b 31 30 29 3b 0a 20 20 20 20 20 20  dent+10);.      
1d6a0 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72    sqlite3DebugPr
1d6b0 69 6e 74 66 28 22 25 2a 73 29 22 2c 20 69 6e 64  intf("%*s)", ind
1d6c0 65 6e 74 2b 38 2c 20 22 22 29 3b 0a 20 20 20 20  ent+8, "");.    
1d6d0 20 20 7d 65 6c 73 65 20 69 66 28 20 70 49 74 65    }else if( pIte
1d6e0 6d 2d 3e 7a 4e 61 6d 65 20 29 7b 0a 20 20 20 20  m->zName ){.    
1d6f0 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67      sqlite3Debug
1d700 50 72 69 6e 74 66 28 22 25 73 22 2c 20 70 49 74  Printf("%s", pIt
1d710 65 6d 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  em->zName);.    
1d720 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70 49    }.      if( pI
1d730 74 65 6d 2d 3e 70 54 61 62 20 29 7b 0a 20 20 20  tem->pTab ){.   
1d740 20 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75       sqlite3Debu
1d750 67 50 72 69 6e 74 66 28 22 28 74 61 62 6c 65 3a  gPrintf("(table:
1d760 20 25 73 29 22 2c 20 70 49 74 65 6d 2d 3e 70 54   %s)", pItem->pT
1d770 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  ab->zName);.    
1d780 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70 49    }.      if( pI
1d790 74 65 6d 2d 3e 7a 41 6c 69 61 73 20 29 7b 0a 20  tem->zAlias ){. 
1d7a0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 65         sqlite3De
1d7b0 62 75 67 50 72 69 6e 74 66 28 22 20 41 53 20 25  bugPrintf(" AS %
1d7c0 73 22 2c 20 70 49 74 65 6d 2d 3e 7a 41 6c 69 61  s", pItem->zAlia
1d7d0 73 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  s);.      }.    
1d7e0 20 20 69 66 28 20 69 3c 70 2d 3e 70 53 72 63 2d    if( i<p->pSrc-
1d7f0 3e 6e 53 72 63 2d 31 20 29 7b 0a 20 20 20 20 20  >nSrc-1 ){.     
1d800 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50     sqlite3DebugP
1d810 72 69 6e 74 66 28 22 2c 22 29 3b 0a 20 20 20 20  rintf(",");.    
1d820 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65    }.      sqlite
1d830 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 5c 6e  3DebugPrintf("\n
1d840 22 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  ");.    }.  }.  
1d850 69 66 28 20 70 2d 3e 70 57 68 65 72 65 20 29 7b  if( p->pWhere ){
1d860 0a 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75  .    sqlite3Debu
1d870 67 50 72 69 6e 74 66 28 22 25 2a 73 20 57 48 45  gPrintf("%*s WHE
1d880 52 45 20 22 2c 20 69 6e 64 65 6e 74 2c 20 22 22  RE ", indent, ""
1d890 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 50 72  );.    sqlite3Pr
1d8a0 69 6e 74 45 78 70 72 28 70 2d 3e 70 57 68 65 72  intExpr(p->pWher
1d8b0 65 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44  e);.    sqlite3D
1d8c0 65 62 75 67 50 72 69 6e 74 66 28 22 5c 6e 22 29  ebugPrintf("\n")
1d8d0 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e 70  ;.  }.  if( p->p
1d8e0 47 72 6f 75 70 42 79 20 29 7b 0a 20 20 20 20 73  GroupBy ){.    s
1d8f0 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74  qlite3DebugPrint
1d900 66 28 22 25 2a 73 20 47 52 4f 55 50 20 42 59 20  f("%*s GROUP BY 
1d910 22 2c 20 69 6e 64 65 6e 74 2c 20 22 22 29 3b 0a  ", indent, "");.
1d920 20 20 20 20 73 71 6c 69 74 65 33 50 72 69 6e 74      sqlite3Print
1d930 45 78 70 72 4c 69 73 74 28 70 2d 3e 70 47 72 6f  ExprList(p->pGro
1d940 75 70 42 79 29 3b 0a 20 20 20 20 73 71 6c 69 74  upBy);.    sqlit
1d950 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 5c  e3DebugPrintf("\
1d960 6e 22 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  n");.  }.  if( p
1d970 2d 3e 70 48 61 76 69 6e 67 20 29 7b 0a 20 20 20  ->pHaving ){.   
1d980 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69   sqlite3DebugPri
1d990 6e 74 66 28 22 25 2a 73 20 48 41 56 49 4e 47 20  ntf("%*s HAVING 
1d9a0 22 2c 20 69 6e 64 65 6e 74 2c 20 22 22 29 3b 0a  ", indent, "");.
1d9b0 20 20 20 20 73 71 6c 69 74 65 33 50 72 69 6e 74      sqlite3Print
1d9c0 45 78 70 72 28 70 2d 3e 70 48 61 76 69 6e 67 29  Expr(p->pHaving)
1d9d0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 65 62  ;.    sqlite3Deb
1d9e0 75 67 50 72 69 6e 74 66 28 22 5c 6e 22 29 3b 0a  ugPrintf("\n");.
1d9f0 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e 70 4f 72    }.  if( p->pOr
1da00 64 65 72 42 79 20 29 7b 0a 20 20 20 20 73 71 6c  derBy ){.    sql
1da10 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28  ite3DebugPrintf(
1da20 22 25 2a 73 20 4f 52 44 45 52 20 42 59 20 22 2c  "%*s ORDER BY ",
1da30 20 69 6e 64 65 6e 74 2c 20 22 22 29 3b 0a 20 20   indent, "");.  
1da40 20 20 73 71 6c 69 74 65 33 50 72 69 6e 74 45 78    sqlite3PrintEx
1da50 70 72 4c 69 73 74 28 70 2d 3e 70 4f 72 64 65 72  prList(p->pOrder
1da60 42 79 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  By);.    sqlite3
1da70 44 65 62 75 67 50 72 69 6e 74 66 28 22 5c 6e 22  DebugPrintf("\n"
1da80 29 3b 0a 20 20 7d 0a 7d 0a 2f 2a 20 45 6e 64 20  );.  }.}./* End 
1da90 6f 66 20 74 68 65 20 73 74 72 75 63 74 75 72 65  of the structure
1daa0 20 64 65 62 75 67 20 70 72 69 6e 74 69 6e 67 20   debug printing 
1dab0 63 6f 64 65 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  code.***********
1dac0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1dad0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1dae0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1daf0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1db00 2a 2a 2f 0a 23 65 6e 64 69 66 20 2f 2a 20 64 65  **/.#endif /* de
1db10 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 54 45 53  fined(SQLITE_TES
1db20 54 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 53 51  T) || defined(SQ
1db30 4c 49 54 45 5f 44 45 42 55 47 29 20 2a 2f 0a     LITE_DEBUG) */.