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

Artifact 4df152ea0cd13b37cc4e41c56cad7c8ed2d9718c:


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 35 35  select.c,v 1.355
0200: 20 32 30 30 37 2f 30 38 2f 31 36 20 30 34 3a 33   2007/08/16 04:3
0210: 30 3a 34 30 20 64 72 68 20 45 78 70 20 24 0a 2a  0:40 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 54 4b 5f   sqlite3Expr(TK_
0810: 41 4c 4c 2c 30 2c 30 2c 30 29 2c 20 30 29 3b 0a  ALL,0,0,0), 0);.
0820: 20 20 7d 0a 20 20 70 4e 65 77 2d 3e 70 45 4c 69    }.  pNew->pELi
0830: 73 74 20 3d 20 70 45 4c 69 73 74 3b 0a 20 20 70  st = pEList;.  p
0840: 4e 65 77 2d 3e 70 53 72 63 20 3d 20 70 53 72 63  New->pSrc = pSrc
0850: 3b 0a 20 20 70 4e 65 77 2d 3e 70 57 68 65 72 65  ;.  pNew->pWhere
0860: 20 3d 20 70 57 68 65 72 65 3b 0a 20 20 70 4e 65   = pWhere;.  pNe
0870: 77 2d 3e 70 47 72 6f 75 70 42 79 20 3d 20 70 47  w->pGroupBy = pG
0880: 72 6f 75 70 42 79 3b 0a 20 20 70 4e 65 77 2d 3e  roupBy;.  pNew->
0890: 70 48 61 76 69 6e 67 20 3d 20 70 48 61 76 69 6e  pHaving = pHavin
08a0: 67 3b 0a 20 20 70 4e 65 77 2d 3e 70 4f 72 64 65  g;.  pNew->pOrde
08b0: 72 42 79 20 3d 20 70 4f 72 64 65 72 42 79 3b 0a  rBy = pOrderBy;.
08c0: 20 20 70 4e 65 77 2d 3e 69 73 44 69 73 74 69 6e    pNew->isDistin
08d0: 63 74 20 3d 20 69 73 44 69 73 74 69 6e 63 74 3b  ct = isDistinct;
08e0: 0a 20 20 70 4e 65 77 2d 3e 6f 70 20 3d 20 54 4b  .  pNew->op = TK
08f0: 5f 53 45 4c 45 43 54 3b 0a 20 20 61 73 73 65 72  _SELECT;.  asser
0900: 74 28 20 70 4f 66 66 73 65 74 3d 3d 30 20 7c 7c  t( pOffset==0 ||
0910: 20 70 4c 69 6d 69 74 21 3d 30 20 29 3b 0a 20 20   pLimit!=0 );.  
0920: 70 4e 65 77 2d 3e 70 4c 69 6d 69 74 20 3d 20 70  pNew->pLimit = p
0930: 4c 69 6d 69 74 3b 0a 20 20 70 4e 65 77 2d 3e 70  Limit;.  pNew->p
0940: 4f 66 66 73 65 74 20 3d 20 70 4f 66 66 73 65 74  Offset = pOffset
0950: 3b 0a 20 20 70 4e 65 77 2d 3e 69 4c 69 6d 69 74  ;.  pNew->iLimit
0960: 20 3d 20 2d 31 3b 0a 20 20 70 4e 65 77 2d 3e 69   = -1;.  pNew->i
0970: 4f 66 66 73 65 74 20 3d 20 2d 31 3b 0a 20 20 70  Offset = -1;.  p
0980: 4e 65 77 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68  New->addrOpenEph
0990: 6d 5b 30 5d 20 3d 20 2d 31 3b 0a 20 20 70 4e 65  m[0] = -1;.  pNe
09a0: 77 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b  w->addrOpenEphm[
09b0: 31 5d 20 3d 20 2d 31 3b 0a 20 20 70 4e 65 77 2d  1] = -1;.  pNew-
09c0: 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b 32 5d  >addrOpenEphm[2]
09d0: 20 3d 20 2d 31 3b 0a 20 20 69 66 28 20 70 4e 65   = -1;.  if( pNe
09e0: 77 3d 3d 26 73 74 61 6e 64 69 6e 29 20 7b 0a 20  w==&standin) {. 
09f0: 20 20 20 63 6c 65 61 72 53 65 6c 65 63 74 28 70     clearSelect(p
0a00: 4e 65 77 29 3b 0a 20 20 20 20 70 4e 65 77 20 3d  New);.    pNew =
0a10: 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e   0;.  }.  return
0a20: 20 70 4e 65 77 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   pNew;.}../*.** 
0a30: 44 65 6c 65 74 65 20 74 68 65 20 67 69 76 65 6e  Delete the given
0a40: 20 53 65 6c 65 63 74 20 73 74 72 75 63 74 75 72   Select structur
0a50: 65 20 61 6e 64 20 61 6c 6c 20 6f 66 20 69 74 73  e and all of its
0a60: 20 73 75 62 73 74 72 75 63 74 75 72 65 73 2e 0a   substructures..
0a70: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 53  */.void sqlite3S
0a80: 65 6c 65 63 74 44 65 6c 65 74 65 28 53 65 6c 65  electDelete(Sele
0a90: 63 74 20 2a 70 29 7b 0a 20 20 69 66 28 20 70 20  ct *p){.  if( p 
0aa0: 29 7b 0a 20 20 20 20 63 6c 65 61 72 53 65 6c 65  ){.    clearSele
0ab0: 63 74 28 70 29 3b 0a 20 20 20 20 73 71 6c 69 74  ct(p);.    sqlit
0ac0: 65 33 5f 66 72 65 65 28 70 29 3b 0a 20 20 7d 0a  e3_free(p);.  }.
0ad0: 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20 31  }../*.** Given 1
0ae0: 20 74 6f 20 33 20 69 64 65 6e 74 69 66 69 65 72   to 3 identifier
0af0: 73 20 70 72 65 63 65 65 64 69 6e 67 20 74 68 65  s preceeding the
0b00: 20 4a 4f 49 4e 20 6b 65 79 77 6f 72 64 2c 20 64   JOIN keyword, d
0b10: 65 74 65 72 6d 69 6e 65 20 74 68 65 0a 2a 2a 20  etermine the.** 
0b20: 74 79 70 65 20 6f 66 20 6a 6f 69 6e 2e 20 20 52  type of join.  R
0b30: 65 74 75 72 6e 20 61 6e 20 69 6e 74 65 67 65 72  eturn an integer
0b40: 20 63 6f 6e 73 74 61 6e 74 20 74 68 61 74 20 65   constant that e
0b50: 78 70 72 65 73 73 65 73 20 74 68 61 74 20 74 79  xpresses that ty
0b60: 70 65 0a 2a 2a 20 69 6e 20 74 65 72 6d 73 20 6f  pe.** in terms o
0b70: 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  f the following 
0b80: 62 69 74 20 76 61 6c 75 65 73 3a 0a 2a 2a 0a 2a  bit values:.**.*
0b90: 2a 20 20 20 20 20 4a 54 5f 49 4e 4e 45 52 0a 2a  *     JT_INNER.*
0ba0: 2a 20 20 20 20 20 4a 54 5f 43 52 4f 53 53 0a 2a  *     JT_CROSS.*
0bb0: 2a 20 20 20 20 20 4a 54 5f 4f 55 54 45 52 0a 2a  *     JT_OUTER.*
0bc0: 2a 20 20 20 20 20 4a 54 5f 4e 41 54 55 52 41 4c  *     JT_NATURAL
0bd0: 0a 2a 2a 20 20 20 20 20 4a 54 5f 4c 45 46 54 0a  .**     JT_LEFT.
0be0: 2a 2a 20 20 20 20 20 4a 54 5f 52 49 47 48 54 0a  **     JT_RIGHT.
0bf0: 2a 2a 0a 2a 2a 20 41 20 66 75 6c 6c 20 6f 75 74  **.** A full out
0c00: 65 72 20 6a 6f 69 6e 20 69 73 20 74 68 65 20 63  er join is the c
0c10: 6f 6d 62 69 6e 61 74 69 6f 6e 20 6f 66 20 4a 54  ombination of JT
0c20: 5f 4c 45 46 54 20 61 6e 64 20 4a 54 5f 52 49 47  _LEFT and JT_RIG
0c30: 48 54 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20  HT..**.** If an 
0c40: 69 6c 6c 65 67 61 6c 20 6f 72 20 75 6e 73 75 70  illegal or unsup
0c50: 70 6f 72 74 65 64 20 6a 6f 69 6e 20 74 79 70 65  ported join type
0c60: 20 69 73 20 73 65 65 6e 2c 20 74 68 65 6e 20 73   is seen, then s
0c70: 74 69 6c 6c 20 72 65 74 75 72 6e 0a 2a 2a 20 61  till return.** a
0c80: 20 6a 6f 69 6e 20 74 79 70 65 2c 20 62 75 74 20   join type, but 
0c90: 70 75 74 20 61 6e 20 65 72 72 6f 72 20 69 6e 20  put an error in 
0ca0: 74 68 65 20 70 50 61 72 73 65 20 73 74 72 75 63  the pParse struc
0cb0: 74 75 72 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  ture..*/.int sql
0cc0: 69 74 65 33 4a 6f 69 6e 54 79 70 65 28 50 61 72  ite3JoinType(Par
0cd0: 73 65 20 2a 70 50 61 72 73 65 2c 20 54 6f 6b 65  se *pParse, Toke
0ce0: 6e 20 2a 70 41 2c 20 54 6f 6b 65 6e 20 2a 70 42  n *pA, Token *pB
0cf0: 2c 20 54 6f 6b 65 6e 20 2a 70 43 29 7b 0a 20 20  , Token *pC){.  
0d00: 69 6e 74 20 6a 6f 69 6e 74 79 70 65 20 3d 20 30  int jointype = 0
0d10: 3b 0a 20 20 54 6f 6b 65 6e 20 2a 61 70 41 6c 6c  ;.  Token *apAll
0d20: 5b 33 5d 3b 0a 20 20 54 6f 6b 65 6e 20 2a 70 3b  [3];.  Token *p;
0d30: 0a 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20  .  static const 
0d40: 73 74 72 75 63 74 20 7b 0a 20 20 20 20 63 6f 6e  struct {.    con
0d50: 73 74 20 63 68 61 72 20 7a 4b 65 79 77 6f 72 64  st char zKeyword
0d60: 5b 38 5d 3b 0a 20 20 20 20 75 38 20 6e 43 68 61  [8];.    u8 nCha
0d70: 72 3b 0a 20 20 20 20 75 38 20 63 6f 64 65 3b 0a  r;.    u8 code;.
0d80: 20 20 7d 20 6b 65 79 77 6f 72 64 73 5b 5d 20 3d    } keywords[] =
0d90: 20 7b 0a 20 20 20 20 7b 20 22 6e 61 74 75 72 61   {.    { "natura
0da0: 6c 22 2c 20 37 2c 20 4a 54 5f 4e 41 54 55 52 41  l", 7, JT_NATURA
0db0: 4c 20 7d 2c 0a 20 20 20 20 7b 20 22 6c 65 66 74  L },.    { "left
0dc0: 22 2c 20 20 20 20 34 2c 20 4a 54 5f 4c 45 46 54  ",    4, JT_LEFT
0dd0: 7c 4a 54 5f 4f 55 54 45 52 20 7d 2c 0a 20 20 20  |JT_OUTER },.   
0de0: 20 7b 20 22 72 69 67 68 74 22 2c 20 20 20 35 2c   { "right",   5,
0df0: 20 4a 54 5f 52 49 47 48 54 7c 4a 54 5f 4f 55 54   JT_RIGHT|JT_OUT
0e00: 45 52 20 7d 2c 0a 20 20 20 20 7b 20 22 66 75 6c  ER },.    { "ful
0e10: 6c 22 2c 20 20 20 20 34 2c 20 4a 54 5f 4c 45 46  l",    4, JT_LEF
0e20: 54 7c 4a 54 5f 52 49 47 48 54 7c 4a 54 5f 4f 55  T|JT_RIGHT|JT_OU
0e30: 54 45 52 20 7d 2c 0a 20 20 20 20 7b 20 22 6f 75  TER },.    { "ou
0e40: 74 65 72 22 2c 20 20 20 35 2c 20 4a 54 5f 4f 55  ter",   5, JT_OU
0e50: 54 45 52 20 7d 2c 0a 20 20 20 20 7b 20 22 69 6e  TER },.    { "in
0e60: 6e 65 72 22 2c 20 20 20 35 2c 20 4a 54 5f 49 4e  ner",   5, JT_IN
0e70: 4e 45 52 20 7d 2c 0a 20 20 20 20 7b 20 22 63 72  NER },.    { "cr
0e80: 6f 73 73 22 2c 20 20 20 35 2c 20 4a 54 5f 49 4e  oss",   5, JT_IN
0e90: 4e 45 52 7c 4a 54 5f 43 52 4f 53 53 20 7d 2c 0a  NER|JT_CROSS },.
0ea0: 20 20 7d 3b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b    };.  int i, j;
0eb0: 0a 20 20 61 70 41 6c 6c 5b 30 5d 20 3d 20 70 41  .  apAll[0] = pA
0ec0: 3b 0a 20 20 61 70 41 6c 6c 5b 31 5d 20 3d 20 70  ;.  apAll[1] = p
0ed0: 42 3b 0a 20 20 61 70 41 6c 6c 5b 32 5d 20 3d 20  B;.  apAll[2] = 
0ee0: 70 43 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69  pC;.  for(i=0; i
0ef0: 3c 33 20 26 26 20 61 70 41 6c 6c 5b 69 5d 3b 20  <3 && apAll[i]; 
0f00: 69 2b 2b 29 7b 0a 20 20 20 20 70 20 3d 20 61 70  i++){.    p = ap
0f10: 41 6c 6c 5b 69 5d 3b 0a 20 20 20 20 66 6f 72 28  All[i];.    for(
0f20: 6a 3d 30 3b 20 6a 3c 73 69 7a 65 6f 66 28 6b 65  j=0; j<sizeof(ke
0f30: 79 77 6f 72 64 73 29 2f 73 69 7a 65 6f 66 28 6b  ywords)/sizeof(k
0f40: 65 79 77 6f 72 64 73 5b 30 5d 29 3b 20 6a 2b 2b  eywords[0]); j++
0f50: 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e  ){.      if( p->
0f60: 6e 3d 3d 6b 65 79 77 6f 72 64 73 5b 6a 5d 2e 6e  n==keywords[j].n
0f70: 43 68 61 72 20 0a 20 20 20 20 20 20 20 20 20 20  Char .          
0f80: 26 26 20 73 71 6c 69 74 65 33 53 74 72 4e 49 43  && sqlite3StrNIC
0f90: 6d 70 28 28 63 68 61 72 2a 29 70 2d 3e 7a 2c 20  mp((char*)p->z, 
0fa0: 6b 65 79 77 6f 72 64 73 5b 6a 5d 2e 7a 4b 65 79  keywords[j].zKey
0fb0: 77 6f 72 64 2c 20 70 2d 3e 6e 29 3d 3d 30 20 29  word, p->n)==0 )
0fc0: 7b 0a 20 20 20 20 20 20 20 20 6a 6f 69 6e 74 79  {.        jointy
0fd0: 70 65 20 7c 3d 20 6b 65 79 77 6f 72 64 73 5b 6a  pe |= keywords[j
0fe0: 5d 2e 63 6f 64 65 3b 0a 20 20 20 20 20 20 20 20  ].code;.        
0ff0: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20  break;.      }. 
1000: 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6a 3e 3d     }.    if( j>=
1010: 73 69 7a 65 6f 66 28 6b 65 79 77 6f 72 64 73 29  sizeof(keywords)
1020: 2f 73 69 7a 65 6f 66 28 6b 65 79 77 6f 72 64 73  /sizeof(keywords
1030: 5b 30 5d 29 20 29 7b 0a 20 20 20 20 20 20 6a 6f  [0]) ){.      jo
1040: 69 6e 74 79 70 65 20 7c 3d 20 4a 54 5f 45 52 52  intype |= JT_ERR
1050: 4f 52 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  OR;.      break;
1060: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28  .    }.  }.  if(
1070: 0a 20 20 20 20 20 28 6a 6f 69 6e 74 79 70 65 20  .     (jointype 
1080: 26 20 28 4a 54 5f 49 4e 4e 45 52 7c 4a 54 5f 4f  & (JT_INNER|JT_O
1090: 55 54 45 52 29 29 3d 3d 28 4a 54 5f 49 4e 4e 45  UTER))==(JT_INNE
10a0: 52 7c 4a 54 5f 4f 55 54 45 52 29 20 7c 7c 0a 20  R|JT_OUTER) ||. 
10b0: 20 20 20 20 28 6a 6f 69 6e 74 79 70 65 20 26 20      (jointype & 
10c0: 4a 54 5f 45 52 52 4f 52 29 21 3d 30 0a 20 20 29  JT_ERROR)!=0.  )
10d0: 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72  {.    const char
10e0: 20 2a 7a 53 70 31 20 3d 20 22 20 22 3b 0a 20 20   *zSp1 = " ";.  
10f0: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53    const char *zS
1100: 70 32 20 3d 20 22 20 22 3b 0a 20 20 20 20 69 66  p2 = " ";.    if
1110: 28 20 70 42 3d 3d 30 20 29 7b 20 7a 53 70 31 2b  ( pB==0 ){ zSp1+
1120: 2b 3b 20 7d 0a 20 20 20 20 69 66 28 20 70 43 3d  +; }.    if( pC=
1130: 3d 30 20 29 7b 20 7a 53 70 32 2b 2b 3b 20 7d 0a  =0 ){ zSp2++; }.
1140: 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
1150: 4d 73 67 28 70 50 61 72 73 65 2c 20 22 75 6e 6b  Msg(pParse, "unk
1160: 6e 6f 77 6e 20 6f 72 20 75 6e 73 75 70 70 6f 72  nown or unsuppor
1170: 74 65 64 20 6a 6f 69 6e 20 74 79 70 65 3a 20 22  ted join type: "
1180: 0a 20 20 20 20 20 20 20 22 25 54 25 73 25 54 25  .       "%T%s%T%
1190: 73 25 54 22 2c 20 70 41 2c 20 7a 53 70 31 2c 20  s%T", pA, zSp1, 
11a0: 70 42 2c 20 7a 53 70 32 2c 20 70 43 29 3b 0a 20  pB, zSp2, pC);. 
11b0: 20 20 20 6a 6f 69 6e 74 79 70 65 20 3d 20 4a 54     jointype = JT
11c0: 5f 49 4e 4e 45 52 3b 0a 20 20 7d 65 6c 73 65 20  _INNER;.  }else 
11d0: 69 66 28 20 6a 6f 69 6e 74 79 70 65 20 26 20 4a  if( jointype & J
11e0: 54 5f 52 49 47 48 54 20 29 7b 0a 20 20 20 20 73  T_RIGHT ){.    s
11f0: 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
1200: 50 61 72 73 65 2c 20 0a 20 20 20 20 20 20 22 52  Parse, .      "R
1210: 49 47 48 54 20 61 6e 64 20 46 55 4c 4c 20 4f 55  IGHT and FULL OU
1220: 54 45 52 20 4a 4f 49 4e 73 20 61 72 65 20 6e 6f  TER JOINs are no
1230: 74 20 63 75 72 72 65 6e 74 6c 79 20 73 75 70 70  t currently supp
1240: 6f 72 74 65 64 22 29 3b 0a 20 20 20 20 6a 6f 69  orted");.    joi
1250: 6e 74 79 70 65 20 3d 20 4a 54 5f 49 4e 4e 45 52  ntype = JT_INNER
1260: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 6a  ;.  }.  return j
1270: 6f 69 6e 74 79 70 65 3b 0a 7d 0a 0a 2f 2a 0a 2a  ointype;.}../*.*
1280: 2a 20 52 65 74 75 72 6e 20 74 68 65 20 69 6e 64  * Return the ind
1290: 65 78 20 6f 66 20 61 20 63 6f 6c 75 6d 6e 20 69  ex of a column i
12a0: 6e 20 61 20 74 61 62 6c 65 2e 20 20 52 65 74 75  n a table.  Retu
12b0: 72 6e 20 2d 31 20 69 66 20 74 68 65 20 63 6f 6c  rn -1 if the col
12c0: 75 6d 6e 0a 2a 2a 20 69 73 20 6e 6f 74 20 63 6f  umn.** is not co
12d0: 6e 74 61 69 6e 65 64 20 69 6e 20 74 68 65 20 74  ntained in the t
12e0: 61 62 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  able..*/.static 
12f0: 69 6e 74 20 63 6f 6c 75 6d 6e 49 6e 64 65 78 28  int columnIndex(
1300: 54 61 62 6c 65 20 2a 70 54 61 62 2c 20 63 6f 6e  Table *pTab, con
1310: 73 74 20 63 68 61 72 20 2a 7a 43 6f 6c 29 7b 0a  st char *zCol){.
1320: 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69    int i;.  for(i
1330: 3d 30 3b 20 69 3c 70 54 61 62 2d 3e 6e 43 6f 6c  =0; i<pTab->nCol
1340: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20  ; i++){.    if( 
1350: 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 70  sqlite3StrICmp(p
1360: 54 61 62 2d 3e 61 43 6f 6c 5b 69 5d 2e 7a 4e 61  Tab->aCol[i].zNa
1370: 6d 65 2c 20 7a 43 6f 6c 29 3d 3d 30 20 29 20 72  me, zCol)==0 ) r
1380: 65 74 75 72 6e 20 69 3b 0a 20 20 7d 0a 20 20 72  eturn i;.  }.  r
1390: 65 74 75 72 6e 20 2d 31 3b 0a 7d 0a 0a 2f 2a 0a  eturn -1;.}../*.
13a0: 2a 2a 20 53 65 74 20 74 68 65 20 76 61 6c 75 65  ** Set the value
13b0: 20 6f 66 20 61 20 74 6f 6b 65 6e 20 74 6f 20 61   of a token to a
13c0: 20 27 5c 30 30 30 27 2d 74 65 72 6d 69 6e 61 74   '\000'-terminat
13d0: 65 64 20 73 74 72 69 6e 67 2e 0a 2a 2f 0a 73 74  ed string..*/.st
13e0: 61 74 69 63 20 76 6f 69 64 20 73 65 74 54 6f 6b  atic void setTok
13f0: 65 6e 28 54 6f 6b 65 6e 20 2a 70 2c 20 63 6f 6e  en(Token *p, con
1400: 73 74 20 63 68 61 72 20 2a 7a 29 7b 0a 20 20 70  st char *z){.  p
1410: 2d 3e 7a 20 3d 20 28 75 38 2a 29 7a 3b 0a 20 20  ->z = (u8*)z;.  
1420: 70 2d 3e 6e 20 3d 20 7a 20 3f 20 73 74 72 6c 65  p->n = z ? strle
1430: 6e 28 7a 29 20 3a 20 30 3b 0a 20 20 70 2d 3e 64  n(z) : 0;.  p->d
1440: 79 6e 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  yn = 0;.}../*.**
1450: 20 53 65 74 20 74 68 65 20 74 6f 6b 65 6e 20 74   Set the token t
1460: 6f 20 74 68 65 20 64 6f 75 62 6c 65 2d 71 75 6f  o the double-quo
1470: 74 65 64 20 61 6e 64 20 65 73 63 61 70 65 64 20  ted and escaped 
1480: 76 65 72 73 69 6f 6e 20 6f 66 20 74 68 65 20 73  version of the s
1490: 74 72 69 6e 67 20 70 6f 69 6e 74 65 64 0a 2a 2a  tring pointed.**
14a0: 20 74 6f 20 62 79 20 7a 2e 20 46 6f 72 20 65 78   to by z. For ex
14b0: 61 6d 70 6c 65 3b 0a 2a 2a 0a 2a 2a 20 20 20 20  ample;.**.**    
14c0: 7b 61 22 62 63 7d 20 20 2d 3e 20 20 7b 22 61 22  {a"bc}  ->  {"a"
14d0: 22 62 63 22 7d 0a 2a 2f 0a 73 74 61 74 69 63 20  "bc"}.*/.static 
14e0: 76 6f 69 64 20 73 65 74 51 75 6f 74 65 64 54 6f  void setQuotedTo
14f0: 6b 65 6e 28 54 6f 6b 65 6e 20 2a 70 2c 20 63 6f  ken(Token *p, co
1500: 6e 73 74 20 63 68 61 72 20 2a 7a 29 7b 0a 20 20  nst char *z){.  
1510: 70 2d 3e 7a 20 3d 20 28 75 38 20 2a 29 73 71 6c  p->z = (u8 *)sql
1520: 69 74 65 33 4d 50 72 69 6e 74 66 28 22 5c 22 25  ite3MPrintf("\"%
1530: 77 5c 22 22 2c 20 7a 29 3b 0a 20 20 70 2d 3e 64  w\"", z);.  p->d
1540: 79 6e 20 3d 20 31 3b 0a 20 20 69 66 28 20 70 2d  yn = 1;.  if( p-
1550: 3e 7a 20 29 7b 0a 20 20 20 20 70 2d 3e 6e 20 3d  >z ){.    p->n =
1560: 20 73 74 72 6c 65 6e 28 28 63 68 61 72 20 2a 29   strlen((char *)
1570: 70 2d 3e 7a 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  p->z);.  }.}../*
1580: 0a 2a 2a 20 43 72 65 61 74 65 20 61 6e 20 65 78  .** Create an ex
1590: 70 72 65 73 73 69 6f 6e 20 6e 6f 64 65 20 66 6f  pression node fo
15a0: 72 20 61 6e 20 69 64 65 6e 74 69 66 69 65 72 20  r an identifier 
15b0: 77 69 74 68 20 74 68 65 20 6e 61 6d 65 20 6f 66  with the name of
15c0: 20 7a 4e 61 6d 65 0a 2a 2f 0a 45 78 70 72 20 2a   zName.*/.Expr *
15d0: 73 71 6c 69 74 65 33 43 72 65 61 74 65 49 64 45  sqlite3CreateIdE
15e0: 78 70 72 28 50 61 72 73 65 20 2a 70 50 61 72 73  xpr(Parse *pPars
15f0: 65 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  e, const char *z
1600: 4e 61 6d 65 29 7b 0a 20 20 54 6f 6b 65 6e 20 64  Name){.  Token d
1610: 75 6d 6d 79 3b 0a 20 20 73 65 74 54 6f 6b 65 6e  ummy;.  setToken
1620: 28 26 64 75 6d 6d 79 2c 20 7a 4e 61 6d 65 29 3b  (&dummy, zName);
1630: 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65  .  return sqlite
1640: 33 50 45 78 70 72 28 70 50 61 72 73 65 2c 20 54  3PExpr(pParse, T
1650: 4b 5f 49 44 2c 20 30 2c 20 30 2c 20 26 64 75 6d  K_ID, 0, 0, &dum
1660: 6d 79 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 41  my);.}.../*.** A
1670: 64 64 20 61 20 74 65 72 6d 20 74 6f 20 74 68 65  dd a term to the
1680: 20 57 48 45 52 45 20 65 78 70 72 65 73 73 69 6f   WHERE expressio
1690: 6e 20 69 6e 20 2a 70 70 45 78 70 72 20 74 68 61  n in *ppExpr tha
16a0: 74 20 72 65 71 75 69 72 65 73 20 74 68 65 0a 2a  t requires the.*
16b0: 2a 20 7a 43 6f 6c 20 63 6f 6c 75 6d 6e 20 74 6f  * zCol column to
16c0: 20 62 65 20 65 71 75 61 6c 20 69 6e 20 74 68 65   be equal in the
16d0: 20 74 77 6f 20 74 61 62 6c 65 73 20 70 54 61 62   two tables pTab
16e0: 31 20 61 6e 64 20 70 54 61 62 32 2e 0a 2a 2f 0a  1 and pTab2..*/.
16f0: 73 74 61 74 69 63 20 76 6f 69 64 20 61 64 64 57  static void addW
1700: 68 65 72 65 54 65 72 6d 28 0a 20 20 50 61 72 73  hereTerm(.  Pars
1710: 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20  e *pParse,      
1720: 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20       /* Parsing 
1730: 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 63 6f 6e  context */.  con
1740: 73 74 20 63 68 61 72 20 2a 7a 43 6f 6c 2c 20 20  st char *zCol,  
1750: 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66        /* Name of
1760: 20 74 68 65 20 63 6f 6c 75 6d 6e 20 2a 2f 0a 20   the column */. 
1770: 20 63 6f 6e 73 74 20 54 61 62 6c 65 20 2a 70 54   const Table *pT
1780: 61 62 31 2c 20 20 20 20 20 20 2f 2a 20 46 69 72  ab1,      /* Fir
1790: 73 74 20 74 61 62 6c 65 20 2a 2f 0a 20 20 63 6f  st table */.  co
17a0: 6e 73 74 20 63 68 61 72 20 2a 7a 41 6c 69 61 73  nst char *zAlias
17b0: 31 2c 20 20 20 20 20 2f 2a 20 41 6c 69 61 73 20  1,     /* Alias 
17c0: 66 6f 72 20 66 69 72 73 74 20 74 61 62 6c 65 2e  for first table.
17d0: 20 20 4d 61 79 20 62 65 20 4e 55 4c 4c 20 2a 2f    May be NULL */
17e0: 0a 20 20 63 6f 6e 73 74 20 54 61 62 6c 65 20 2a  .  const Table *
17f0: 70 54 61 62 32 2c 20 20 20 20 20 20 2f 2a 20 53  pTab2,      /* S
1800: 65 63 6f 6e 64 20 74 61 62 6c 65 20 2a 2f 0a 20  econd table */. 
1810: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 41 6c   const char *zAl
1820: 69 61 73 32 2c 20 20 20 20 20 2f 2a 20 41 6c 69  ias2,     /* Ali
1830: 61 73 20 66 6f 72 20 73 65 63 6f 6e 64 20 74 61  as for second ta
1840: 62 6c 65 2e 20 20 4d 61 79 20 62 65 20 4e 55 4c  ble.  May be NUL
1850: 4c 20 2a 2f 0a 20 20 69 6e 74 20 69 52 69 67 68  L */.  int iRigh
1860: 74 4a 6f 69 6e 54 61 62 6c 65 2c 20 20 20 20 20  tJoinTable,     
1870: 2f 2a 20 56 44 42 45 20 63 75 72 73 6f 72 20 66  /* VDBE cursor f
1880: 6f 72 20 74 68 65 20 72 69 67 68 74 20 74 61 62  or the right tab
1890: 6c 65 20 2a 2f 0a 20 20 45 78 70 72 20 2a 2a 70  le */.  Expr **p
18a0: 70 45 78 70 72 20 20 20 20 20 20 20 20 20 20 20  pExpr           
18b0: 20 2f 2a 20 41 64 64 20 74 68 65 20 65 71 75 61   /* Add the equa
18c0: 6c 69 74 79 20 74 65 72 6d 20 74 6f 20 74 68 69  lity term to thi
18d0: 73 20 65 78 70 72 65 73 73 69 6f 6e 20 2a 2f 0a  s expression */.
18e0: 29 7b 0a 20 20 45 78 70 72 20 2a 70 45 31 61 2c  ){.  Expr *pE1a,
18f0: 20 2a 70 45 31 62 2c 20 2a 70 45 31 63 3b 0a 20   *pE1b, *pE1c;. 
1900: 20 45 78 70 72 20 2a 70 45 32 61 2c 20 2a 70 45   Expr *pE2a, *pE
1910: 32 62 2c 20 2a 70 45 32 63 3b 0a 20 20 45 78 70  2b, *pE2c;.  Exp
1920: 72 20 2a 70 45 3b 0a 0a 20 20 70 45 31 61 20 3d  r *pE;..  pE1a =
1930: 20 73 71 6c 69 74 65 33 43 72 65 61 74 65 49 64   sqlite3CreateId
1940: 45 78 70 72 28 70 50 61 72 73 65 2c 20 7a 43 6f  Expr(pParse, zCo
1950: 6c 29 3b 0a 20 20 70 45 32 61 20 3d 20 73 71 6c  l);.  pE2a = sql
1960: 69 74 65 33 43 72 65 61 74 65 49 64 45 78 70 72  ite3CreateIdExpr
1970: 28 70 50 61 72 73 65 2c 20 7a 43 6f 6c 29 3b 0a  (pParse, zCol);.
1980: 20 20 69 66 28 20 7a 41 6c 69 61 73 31 3d 3d 30    if( zAlias1==0
1990: 20 29 7b 0a 20 20 20 20 7a 41 6c 69 61 73 31 20   ){.    zAlias1 
19a0: 3d 20 70 54 61 62 31 2d 3e 7a 4e 61 6d 65 3b 0a  = pTab1->zName;.
19b0: 20 20 7d 0a 20 20 70 45 31 62 20 3d 20 73 71 6c    }.  pE1b = sql
19c0: 69 74 65 33 43 72 65 61 74 65 49 64 45 78 70 72  ite3CreateIdExpr
19d0: 28 70 50 61 72 73 65 2c 20 7a 41 6c 69 61 73 31  (pParse, zAlias1
19e0: 29 3b 0a 20 20 69 66 28 20 7a 41 6c 69 61 73 32  );.  if( zAlias2
19f0: 3d 3d 30 20 29 7b 0a 20 20 20 20 7a 41 6c 69 61  ==0 ){.    zAlia
1a00: 73 32 20 3d 20 70 54 61 62 32 2d 3e 7a 4e 61 6d  s2 = pTab2->zNam
1a10: 65 3b 0a 20 20 7d 0a 20 20 70 45 32 62 20 3d 20  e;.  }.  pE2b = 
1a20: 73 71 6c 69 74 65 33 43 72 65 61 74 65 49 64 45  sqlite3CreateIdE
1a30: 78 70 72 28 70 50 61 72 73 65 2c 20 7a 41 6c 69  xpr(pParse, zAli
1a40: 61 73 32 29 3b 0a 20 20 70 45 31 63 20 3d 20 73  as2);.  pE1c = s
1a50: 71 6c 69 74 65 33 50 45 78 70 72 28 70 50 61 72  qlite3PExpr(pPar
1a60: 73 65 2c 20 54 4b 5f 44 4f 54 2c 20 70 45 31 62  se, TK_DOT, pE1b
1a70: 2c 20 70 45 31 61 2c 20 30 29 3b 0a 20 20 70 45  , pE1a, 0);.  pE
1a80: 32 63 20 3d 20 73 71 6c 69 74 65 33 50 45 78 70  2c = sqlite3PExp
1a90: 72 28 70 50 61 72 73 65 2c 20 54 4b 5f 44 4f 54  r(pParse, TK_DOT
1aa0: 2c 20 70 45 32 62 2c 20 70 45 32 61 2c 20 30 29  , pE2b, pE2a, 0)
1ab0: 3b 0a 20 20 70 45 20 3d 20 73 71 6c 69 74 65 33  ;.  pE = sqlite3
1ac0: 44 62 45 78 70 72 28 70 50 61 72 73 65 2c 20 54  DbExpr(pParse, T
1ad0: 4b 5f 45 51 2c 20 70 45 31 63 2c 20 70 45 32 63  K_EQ, pE1c, pE2c
1ae0: 2c 20 30 29 3b 0a 20 20 69 66 28 20 70 45 20 29  , 0);.  if( pE )
1af0: 7b 0a 20 20 20 20 45 78 70 72 53 65 74 50 72 6f  {.    ExprSetPro
1b00: 70 65 72 74 79 28 70 45 2c 20 45 50 5f 46 72 6f  perty(pE, EP_Fro
1b10: 6d 4a 6f 69 6e 29 3b 0a 20 20 20 20 70 45 2d 3e  mJoin);.    pE->
1b20: 69 52 69 67 68 74 4a 6f 69 6e 54 61 62 6c 65 20  iRightJoinTable 
1b30: 3d 20 69 52 69 67 68 74 4a 6f 69 6e 54 61 62 6c  = iRightJoinTabl
1b40: 65 3b 0a 20 20 7d 0a 20 20 70 45 20 3d 20 73 71  e;.  }.  pE = sq
1b50: 6c 69 74 65 33 45 78 70 72 41 6e 64 28 70 50 61  lite3ExprAnd(pPa
1b60: 72 73 65 2d 3e 64 62 2c 2a 70 70 45 78 70 72 2c  rse->db,*ppExpr,
1b70: 20 70 45 29 3b 0a 20 20 69 66 28 20 70 45 20 29   pE);.  if( pE )
1b80: 7b 0a 20 20 20 20 2a 70 70 45 78 70 72 20 3d 20  {.    *ppExpr = 
1b90: 70 45 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  pE;.  }.}../*.**
1ba0: 20 53 65 74 20 74 68 65 20 45 50 5f 46 72 6f 6d   Set the EP_From
1bb0: 4a 6f 69 6e 20 70 72 6f 70 65 72 74 79 20 6f 6e  Join property on
1bc0: 20 61 6c 6c 20 74 65 72 6d 73 20 6f 66 20 74 68   all terms of th
1bd0: 65 20 67 69 76 65 6e 20 65 78 70 72 65 73 73 69  e given expressi
1be0: 6f 6e 2e 0a 2a 2a 20 41 6e 64 20 73 65 74 20 74  on..** And set t
1bf0: 68 65 20 45 78 70 72 2e 69 52 69 67 68 74 4a 6f  he Expr.iRightJo
1c00: 69 6e 54 61 62 6c 65 20 74 6f 20 69 54 61 62 6c  inTable to iTabl
1c10: 65 20 66 6f 72 20 65 76 65 72 79 20 74 65 72 6d  e for every term
1c20: 20 69 6e 20 74 68 65 0a 2a 2a 20 65 78 70 72 65   in the.** expre
1c30: 73 73 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  ssion..**.** The
1c40: 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 20 70 72 6f   EP_FromJoin pro
1c50: 70 65 72 74 79 20 69 73 20 75 73 65 64 20 6f 6e  perty is used on
1c60: 20 74 65 72 6d 73 20 6f 66 20 61 6e 20 65 78 70   terms of an exp
1c70: 72 65 73 73 69 6f 6e 20 74 6f 20 74 65 6c 6c 0a  ression to tell.
1c80: 2a 2a 20 74 68 65 20 4c 45 46 54 20 4f 55 54 45  ** the LEFT OUTE
1c90: 52 20 4a 4f 49 4e 20 70 72 6f 63 65 73 73 69 6e  R JOIN processin
1ca0: 67 20 6c 6f 67 69 63 20 74 68 61 74 20 74 68 69  g logic that thi
1cb0: 73 20 74 65 72 6d 20 69 73 20 70 61 72 74 20 6f  s term is part o
1cc0: 66 20 74 68 65 0a 2a 2a 20 6a 6f 69 6e 20 72 65  f the.** join re
1cd0: 73 74 72 69 63 74 69 6f 6e 20 73 70 65 63 69 66  striction specif
1ce0: 69 65 64 20 69 6e 20 74 68 65 20 4f 4e 20 6f 72  ied in the ON or
1cf0: 20 55 53 49 4e 47 20 63 6c 61 75 73 65 20 61 6e   USING clause an
1d00: 64 20 6e 6f 74 20 61 20 70 61 72 74 0a 2a 2a 20  d not a part.** 
1d10: 6f 66 20 74 68 65 20 6d 6f 72 65 20 67 65 6e 65  of the more gene
1d20: 72 61 6c 20 57 48 45 52 45 20 63 6c 61 75 73 65  ral WHERE clause
1d30: 2e 20 20 54 68 65 73 65 20 74 65 72 6d 73 20 61  .  These terms a
1d40: 72 65 20 6d 6f 76 65 64 20 6f 76 65 72 20 74 6f  re moved over to
1d50: 20 74 68 65 0a 2a 2a 20 57 48 45 52 45 20 63 6c   the.** WHERE cl
1d60: 61 75 73 65 20 64 75 72 69 6e 67 20 6a 6f 69 6e  ause during join
1d70: 20 70 72 6f 63 65 73 73 69 6e 67 20 62 75 74 20   processing but 
1d80: 77 65 20 6e 65 65 64 20 74 6f 20 72 65 6d 65 6d  we need to remem
1d90: 62 65 72 20 74 68 61 74 20 74 68 65 79 0a 2a 2a  ber that they.**
1da0: 20 6f 72 69 67 69 6e 61 74 65 64 20 69 6e 20 74   originated in t
1db0: 68 65 20 4f 4e 20 6f 72 20 55 53 49 4e 47 20 63  he ON or USING c
1dc0: 6c 61 75 73 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  lause..**.** The
1dd0: 20 45 78 70 72 2e 69 52 69 67 68 74 4a 6f 69 6e   Expr.iRightJoin
1de0: 54 61 62 6c 65 20 74 65 6c 6c 73 20 74 68 65 20  Table tells the 
1df0: 57 48 45 52 45 20 63 6c 61 75 73 65 20 70 72 6f  WHERE clause pro
1e00: 63 65 73 73 69 6e 67 20 74 68 61 74 20 74 68 65  cessing that the
1e10: 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 20 64  .** expression d
1e20: 65 70 65 6e 64 73 20 6f 6e 20 74 61 62 6c 65 20  epends on table 
1e30: 69 52 69 67 68 74 4a 6f 69 6e 54 61 62 6c 65 20  iRightJoinTable 
1e40: 65 76 65 6e 20 69 66 20 74 68 61 74 20 74 61 62  even if that tab
1e50: 6c 65 20 69 73 20 6e 6f 74 0a 2a 2a 20 65 78 70  le is not.** exp
1e60: 6c 69 63 69 74 6c 79 20 6d 65 6e 74 69 6f 6e 65  licitly mentione
1e70: 64 20 69 6e 20 74 68 65 20 65 78 70 72 65 73 73  d in the express
1e80: 69 6f 6e 2e 20 20 54 68 61 74 20 69 6e 66 6f 72  ion.  That infor
1e90: 6d 61 74 69 6f 6e 20 69 73 20 6e 65 65 64 65 64  mation is needed
1ea0: 0a 2a 2a 20 66 6f 72 20 63 61 73 65 73 20 6c 69  .** for cases li
1eb0: 6b 65 20 74 68 69 73 3a 0a 2a 2a 0a 2a 2a 20 20  ke this:.**.**  
1ec0: 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20    SELECT * FROM 
1ed0: 74 31 20 4c 45 46 54 20 4a 4f 49 4e 20 74 32 20  t1 LEFT JOIN t2 
1ee0: 4f 4e 20 74 31 2e 61 3d 74 32 2e 62 20 41 4e 44  ON t1.a=t2.b AND
1ef0: 20 74 31 2e 78 3d 35 0a 2a 2a 0a 2a 2a 20 54 68   t1.x=5.**.** Th
1f00: 65 20 77 68 65 72 65 20 63 6c 61 75 73 65 20 6e  e where clause n
1f10: 65 65 64 73 20 74 6f 20 64 65 66 65 72 20 74 68  eeds to defer th
1f20: 65 20 68 61 6e 64 6c 69 6e 67 20 6f 66 20 74 68  e handling of th
1f30: 65 20 74 31 2e 78 3d 35 0a 2a 2a 20 74 65 72 6d  e t1.x=5.** term
1f40: 20 75 6e 74 69 6c 20 61 66 74 65 72 20 74 68 65   until after the
1f50: 20 74 32 20 6c 6f 6f 70 20 6f 66 20 74 68 65 20   t2 loop of the 
1f60: 6a 6f 69 6e 2e 20 20 49 6e 20 74 68 61 74 20 77  join.  In that w
1f70: 61 79 2c 20 61 0a 2a 2a 20 4e 55 4c 4c 20 74 32  ay, a.** NULL t2
1f80: 20 72 6f 77 20 77 69 6c 6c 20 62 65 20 69 6e 73   row will be ins
1f90: 65 72 74 65 64 20 77 68 65 6e 65 76 65 72 20 74  erted whenever t
1fa0: 31 2e 78 21 3d 35 2e 20 20 49 66 20 77 65 20 64  1.x!=5.  If we d
1fb0: 6f 20 6e 6f 74 0a 2a 2a 20 64 65 66 65 72 20 74  o not.** defer t
1fc0: 68 65 20 68 61 6e 64 6c 69 6e 67 20 6f 66 20 74  he handling of t
1fd0: 31 2e 78 3d 35 2c 20 69 74 20 77 69 6c 6c 20 62  1.x=5, it will b
1fe0: 65 20 70 72 6f 63 65 73 73 65 64 20 69 6d 6d 65  e processed imme
1ff0: 64 69 61 74 65 6c 79 0a 2a 2a 20 61 66 74 65 72  diately.** after
2000: 20 74 68 65 20 74 31 20 6c 6f 6f 70 20 61 6e 64   the t1 loop and
2010: 20 72 6f 77 73 20 77 69 74 68 20 74 31 2e 78 21   rows with t1.x!
2020: 3d 35 20 77 69 6c 6c 20 6e 65 76 65 72 20 61 70  =5 will never ap
2030: 70 65 61 72 20 69 6e 0a 2a 2a 20 74 68 65 20 6f  pear in.** the o
2040: 75 74 70 75 74 2c 20 77 68 69 63 68 20 69 73 20  utput, which is 
2050: 69 6e 63 6f 72 72 65 63 74 2e 0a 2a 2f 0a 73 74  incorrect..*/.st
2060: 61 74 69 63 20 76 6f 69 64 20 73 65 74 4a 6f 69  atic void setJoi
2070: 6e 45 78 70 72 28 45 78 70 72 20 2a 70 2c 20 69  nExpr(Expr *p, i
2080: 6e 74 20 69 54 61 62 6c 65 29 7b 0a 20 20 77 68  nt iTable){.  wh
2090: 69 6c 65 28 20 70 20 29 7b 0a 20 20 20 20 45 78  ile( p ){.    Ex
20a0: 70 72 53 65 74 50 72 6f 70 65 72 74 79 28 70 2c  prSetProperty(p,
20b0: 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29 3b 0a 20   EP_FromJoin);. 
20c0: 20 20 20 70 2d 3e 69 52 69 67 68 74 4a 6f 69 6e     p->iRightJoin
20d0: 54 61 62 6c 65 20 3d 20 69 54 61 62 6c 65 3b 0a  Table = iTable;.
20e0: 20 20 20 20 73 65 74 4a 6f 69 6e 45 78 70 72 28      setJoinExpr(
20f0: 70 2d 3e 70 4c 65 66 74 2c 20 69 54 61 62 6c 65  p->pLeft, iTable
2100: 29 3b 0a 20 20 20 20 70 20 3d 20 70 2d 3e 70 52  );.    p = p->pR
2110: 69 67 68 74 3b 0a 20 20 7d 20 0a 7d 0a 0a 2f 2a  ight;.  } .}../*
2120: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
2130: 20 70 72 6f 63 65 73 73 65 73 20 74 68 65 20 6a   processes the j
2140: 6f 69 6e 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  oin information 
2150: 66 6f 72 20 61 20 53 45 4c 45 43 54 20 73 74 61  for a SELECT sta
2160: 74 65 6d 65 6e 74 2e 0a 2a 2a 20 4f 4e 20 61 6e  tement..** ON an
2170: 64 20 55 53 49 4e 47 20 63 6c 61 75 73 65 73 20  d USING clauses 
2180: 61 72 65 20 63 6f 6e 76 65 72 74 65 64 20 69 6e  are converted in
2190: 74 6f 20 65 78 74 72 61 20 74 65 72 6d 73 20 6f  to extra terms o
21a0: 66 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75  f the WHERE clau
21b0: 73 65 2e 0a 2a 2a 20 4e 41 54 55 52 41 4c 20 6a  se..** NATURAL j
21c0: 6f 69 6e 73 20 61 6c 73 6f 20 63 72 65 61 74 65  oins also create
21d0: 20 65 78 74 72 61 20 57 48 45 52 45 20 63 6c 61   extra WHERE cla
21e0: 75 73 65 20 74 65 72 6d 73 2e 0a 2a 2a 0a 2a 2a  use terms..**.**
21f0: 20 54 68 65 20 74 65 72 6d 73 20 6f 66 20 61 20   The terms of a 
2200: 46 52 4f 4d 20 63 6c 61 75 73 65 20 61 72 65 20  FROM clause are 
2210: 63 6f 6e 74 61 69 6e 65 64 20 69 6e 20 74 68 65  contained in the
2220: 20 53 65 6c 65 63 74 2e 70 53 72 63 20 73 74 72   Select.pSrc str
2230: 75 63 74 75 72 65 2e 0a 2a 2a 20 54 68 65 20 6c  ucture..** The l
2240: 65 66 74 20 6d 6f 73 74 20 74 61 62 6c 65 20 69  eft most table i
2250: 73 20 74 68 65 20 66 69 72 73 74 20 65 6e 74 72  s the first entr
2260: 79 20 69 6e 20 53 65 6c 65 63 74 2e 70 53 72 63  y in Select.pSrc
2270: 2e 20 20 54 68 65 20 72 69 67 68 74 2d 6d 6f 73  .  The right-mos
2280: 74 0a 2a 2a 20 74 61 62 6c 65 20 69 73 20 74 68  t.** table is th
2290: 65 20 6c 61 73 74 20 65 6e 74 72 79 2e 20 20 54  e last entry.  T
22a0: 68 65 20 6a 6f 69 6e 20 6f 70 65 72 61 74 6f 72  he join operator
22b0: 20 69 73 20 68 65 6c 64 20 69 6e 20 74 68 65 20   is held in the 
22c0: 65 6e 74 72 79 20 74 6f 0a 2a 2a 20 74 68 65 20  entry to.** the 
22d0: 6c 65 66 74 2e 20 20 54 68 75 73 20 65 6e 74 72  left.  Thus entr
22e0: 79 20 30 20 63 6f 6e 74 61 69 6e 73 20 74 68 65  y 0 contains the
22f0: 20 6a 6f 69 6e 20 6f 70 65 72 61 74 6f 72 20 66   join operator f
2300: 6f 72 20 74 68 65 20 6a 6f 69 6e 20 62 65 74 77  or the join betw
2310: 65 65 6e 0a 2a 2a 20 65 6e 74 72 69 65 73 20 30  een.** entries 0
2320: 20 61 6e 64 20 31 2e 20 20 41 6e 79 20 4f 4e 20   and 1.  Any ON 
2330: 6f 72 20 55 53 49 4e 47 20 63 6c 61 75 73 65 73  or USING clauses
2340: 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
2350: 20 74 68 65 20 6a 6f 69 6e 20 61 72 65 0a 2a 2a   the join are.**
2360: 20 61 6c 73 6f 20 61 74 74 61 63 68 65 64 20 74   also attached t
2370: 6f 20 74 68 65 20 6c 65 66 74 20 65 6e 74 72 79  o the left entry
2380: 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
2390: 74 69 6e 65 20 72 65 74 75 72 6e 73 20 74 68 65  tine returns the
23a0: 20 6e 75 6d 62 65 72 20 6f 66 20 65 72 72 6f 72   number of error
23b0: 73 20 65 6e 63 6f 75 6e 74 65 72 65 64 2e 0a 2a  s encountered..*
23c0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 71 6c  /.static int sql
23d0: 69 74 65 50 72 6f 63 65 73 73 4a 6f 69 6e 28 50  iteProcessJoin(P
23e0: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 53 65  arse *pParse, Se
23f0: 6c 65 63 74 20 2a 70 29 7b 0a 20 20 53 72 63 4c  lect *p){.  SrcL
2400: 69 73 74 20 2a 70 53 72 63 3b 20 20 20 20 20 20  ist *pSrc;      
2410: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
2420: 6c 6c 20 74 61 62 6c 65 73 20 69 6e 20 74 68 65  ll tables in the
2430: 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 2a 2f 0a   FROM clause */.
2440: 20 20 69 6e 74 20 69 2c 20 6a 3b 20 20 20 20 20    int i, j;     
2450: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2460: 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65    /* Loop counte
2470: 72 73 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 53  rs */.  struct S
2480: 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 4c 65  rcList_item *pLe
2490: 66 74 3b 20 20 20 20 20 2f 2a 20 4c 65 66 74 20  ft;     /* Left 
24a0: 74 61 62 6c 65 20 62 65 69 6e 67 20 6a 6f 69 6e  table being join
24b0: 65 64 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 53  ed */.  struct S
24c0: 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 52 69  rcList_item *pRi
24d0: 67 68 74 3b 20 20 20 20 2f 2a 20 52 69 67 68 74  ght;    /* Right
24e0: 20 74 61 62 6c 65 20 62 65 69 6e 67 20 6a 6f 69   table being joi
24f0: 6e 65 64 20 2a 2f 0a 0a 20 20 70 53 72 63 20 3d  ned */..  pSrc =
2500: 20 70 2d 3e 70 53 72 63 3b 0a 20 20 70 4c 65 66   p->pSrc;.  pLef
2510: 74 20 3d 20 26 70 53 72 63 2d 3e 61 5b 30 5d 3b  t = &pSrc->a[0];
2520: 0a 20 20 70 52 69 67 68 74 20 3d 20 26 70 4c 65  .  pRight = &pLe
2530: 66 74 5b 31 5d 3b 0a 20 20 66 6f 72 28 69 3d 30  ft[1];.  for(i=0
2540: 3b 20 69 3c 70 53 72 63 2d 3e 6e 53 72 63 2d 31  ; i<pSrc->nSrc-1
2550: 3b 20 69 2b 2b 2c 20 70 52 69 67 68 74 2b 2b 2c  ; i++, pRight++,
2560: 20 70 4c 65 66 74 2b 2b 29 7b 0a 20 20 20 20 54   pLeft++){.    T
2570: 61 62 6c 65 20 2a 70 4c 65 66 74 54 61 62 20 3d  able *pLeftTab =
2580: 20 70 4c 65 66 74 2d 3e 70 54 61 62 3b 0a 20 20   pLeft->pTab;.  
2590: 20 20 54 61 62 6c 65 20 2a 70 52 69 67 68 74 54    Table *pRightT
25a0: 61 62 20 3d 20 70 52 69 67 68 74 2d 3e 70 54 61  ab = pRight->pTa
25b0: 62 3b 0a 0a 20 20 20 20 69 66 28 20 70 4c 65 66  b;..    if( pLef
25c0: 74 54 61 62 3d 3d 30 20 7c 7c 20 70 52 69 67 68  tTab==0 || pRigh
25d0: 74 54 61 62 3d 3d 30 20 29 20 63 6f 6e 74 69 6e  tTab==0 ) contin
25e0: 75 65 3b 0a 0a 20 20 20 20 2f 2a 20 57 68 65 6e  ue;..    /* When
25f0: 20 74 68 65 20 4e 41 54 55 52 41 4c 20 6b 65 79   the NATURAL key
2600: 77 6f 72 64 20 69 73 20 70 72 65 73 65 6e 74 2c  word is present,
2610: 20 61 64 64 20 57 48 45 52 45 20 63 6c 61 75 73   add WHERE claus
2620: 65 20 74 65 72 6d 73 20 66 6f 72 0a 20 20 20 20  e terms for.    
2630: 2a 2a 20 65 76 65 72 79 20 63 6f 6c 75 6d 6e 20  ** every column 
2640: 74 68 61 74 20 74 68 65 20 74 77 6f 20 74 61 62  that the two tab
2650: 6c 65 73 20 68 61 76 65 20 69 6e 20 63 6f 6d 6d  les have in comm
2660: 6f 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  on..    */.    i
2670: 66 28 20 70 52 69 67 68 74 2d 3e 6a 6f 69 6e 74  f( pRight->joint
2680: 79 70 65 20 26 20 4a 54 5f 4e 41 54 55 52 41 4c  ype & JT_NATURAL
2690: 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 52   ){.      if( pR
26a0: 69 67 68 74 2d 3e 70 4f 6e 20 7c 7c 20 70 52 69  ight->pOn || pRi
26b0: 67 68 74 2d 3e 70 55 73 69 6e 67 20 29 7b 0a 20  ght->pUsing ){. 
26c0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72         sqlite3Er
26d0: 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
26e0: 61 20 4e 41 54 55 52 41 4c 20 6a 6f 69 6e 20 6d  a NATURAL join m
26f0: 61 79 20 6e 6f 74 20 68 61 76 65 20 22 0a 20 20  ay not have ".  
2700: 20 20 20 20 20 20 20 20 20 22 61 6e 20 4f 4e 20           "an ON 
2710: 6f 72 20 55 53 49 4e 47 20 63 6c 61 75 73 65 22  or USING clause"
2720: 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 72 65  , 0);.        re
2730: 74 75 72 6e 20 31 3b 0a 20 20 20 20 20 20 7d 0a  turn 1;.      }.
2740: 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a        for(j=0; j
2750: 3c 70 4c 65 66 74 54 61 62 2d 3e 6e 43 6f 6c 3b  <pLeftTab->nCol;
2760: 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 63   j++){.        c
2770: 68 61 72 20 2a 7a 4e 61 6d 65 20 3d 20 70 4c 65  har *zName = pLe
2780: 66 74 54 61 62 2d 3e 61 43 6f 6c 5b 6a 5d 2e 7a  ftTab->aCol[j].z
2790: 4e 61 6d 65 3b 0a 20 20 20 20 20 20 20 20 69 66  Name;.        if
27a0: 28 20 63 6f 6c 75 6d 6e 49 6e 64 65 78 28 70 52  ( columnIndex(pR
27b0: 69 67 68 74 54 61 62 2c 20 7a 4e 61 6d 65 29 3e  ightTab, zName)>
27c0: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
27d0: 61 64 64 57 68 65 72 65 54 65 72 6d 28 7a 4e 61  addWhereTerm(zNa
27e0: 6d 65 2c 20 70 4c 65 66 74 54 61 62 2c 20 70 4c  me, pLeftTab, pL
27f0: 65 66 74 2d 3e 7a 41 6c 69 61 73 2c 20 0a 20 20  eft->zAlias, .  
2800: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2810: 20 20 20 20 20 20 20 20 20 20 20 20 70 52 69 67              pRig
2820: 68 74 54 61 62 2c 20 70 52 69 67 68 74 2d 3e 7a  htTab, pRight->z
2830: 41 6c 69 61 73 2c 0a 20 20 20 20 20 20 20 20 20  Alias,.         
2840: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2850: 20 20 20 20 20 70 52 69 67 68 74 2d 3e 69 43 75       pRight->iCu
2860: 72 73 6f 72 2c 20 26 70 2d 3e 70 57 68 65 72 65  rsor, &p->pWhere
2870: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 0a 20 20  );.          .  
2880: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
2890: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 44 69      }..    /* Di
28a0: 73 61 6c 6c 6f 77 20 62 6f 74 68 20 4f 4e 20 61  sallow both ON a
28b0: 6e 64 20 55 53 49 4e 47 20 63 6c 61 75 73 65 73  nd USING clauses
28c0: 20 69 6e 20 74 68 65 20 73 61 6d 65 20 6a 6f 69   in the same joi
28d0: 6e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  n.    */.    if(
28e0: 20 70 52 69 67 68 74 2d 3e 70 4f 6e 20 26 26 20   pRight->pOn && 
28f0: 70 52 69 67 68 74 2d 3e 70 55 73 69 6e 67 20 29  pRight->pUsing )
2900: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  {.      sqlite3E
2910: 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
2920: 22 63 61 6e 6e 6f 74 20 68 61 76 65 20 62 6f 74  "cannot have bot
2930: 68 20 4f 4e 20 61 6e 64 20 55 53 49 4e 47 20 22  h ON and USING "
2940: 0a 20 20 20 20 20 20 20 20 22 63 6c 61 75 73 65  .        "clause
2950: 73 20 69 6e 20 74 68 65 20 73 61 6d 65 20 6a 6f  s in the same jo
2960: 69 6e 22 29 3b 0a 20 20 20 20 20 20 72 65 74 75  in");.      retu
2970: 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  rn 1;.    }..   
2980: 20 2f 2a 20 41 64 64 20 74 68 65 20 4f 4e 20 63   /* Add the ON c
2990: 6c 61 75 73 65 20 74 6f 20 74 68 65 20 65 6e 64  lause to the end
29a0: 20 6f 66 20 74 68 65 20 57 48 45 52 45 20 63 6c   of the WHERE cl
29b0: 61 75 73 65 2c 20 63 6f 6e 6e 65 63 74 65 64 20  ause, connected 
29c0: 62 79 0a 20 20 20 20 2a 2a 20 61 6e 20 41 4e 44  by.    ** an AND
29d0: 20 6f 70 65 72 61 74 6f 72 2e 0a 20 20 20 20 2a   operator..    *
29e0: 2f 0a 20 20 20 20 69 66 28 20 70 52 69 67 68 74  /.    if( pRight
29f0: 2d 3e 70 4f 6e 20 29 7b 0a 20 20 20 20 20 20 73  ->pOn ){.      s
2a00: 65 74 4a 6f 69 6e 45 78 70 72 28 70 52 69 67 68  etJoinExpr(pRigh
2a10: 74 2d 3e 70 4f 6e 2c 20 70 52 69 67 68 74 2d 3e  t->pOn, pRight->
2a20: 69 43 75 72 73 6f 72 29 3b 0a 20 20 20 20 20 20  iCursor);.      
2a30: 70 2d 3e 70 57 68 65 72 65 20 3d 20 73 71 6c 69  p->pWhere = sqli
2a40: 74 65 33 45 78 70 72 41 6e 64 28 70 50 61 72 73  te3ExprAnd(pPars
2a50: 65 2d 3e 64 62 2c 20 70 2d 3e 70 57 68 65 72 65  e->db, p->pWhere
2a60: 2c 20 70 52 69 67 68 74 2d 3e 70 4f 6e 29 3b 0a  , pRight->pOn);.
2a70: 20 20 20 20 20 20 70 52 69 67 68 74 2d 3e 70 4f        pRight->pO
2a80: 6e 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 0a 20 20  n = 0;.    }..  
2a90: 20 20 2f 2a 20 43 72 65 61 74 65 20 65 78 74 72    /* Create extr
2aa0: 61 20 74 65 72 6d 73 20 6f 6e 20 74 68 65 20 57  a terms on the W
2ab0: 48 45 52 45 20 63 6c 61 75 73 65 20 66 6f 72 20  HERE clause for 
2ac0: 65 61 63 68 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65  each column name
2ad0: 64 0a 20 20 20 20 2a 2a 20 69 6e 20 74 68 65 20  d.    ** in the 
2ae0: 55 53 49 4e 47 20 63 6c 61 75 73 65 2e 20 20 45  USING clause.  E
2af0: 78 61 6d 70 6c 65 3a 20 49 66 20 74 68 65 20 74  xample: If the t
2b00: 77 6f 20 74 61 62 6c 65 73 20 74 6f 20 62 65 20  wo tables to be 
2b10: 6a 6f 69 6e 65 64 20 61 72 65 20 0a 20 20 20 20  joined are .    
2b20: 2a 2a 20 41 20 61 6e 64 20 42 20 61 6e 64 20 74  ** A and B and t
2b30: 68 65 20 55 53 49 4e 47 20 63 6c 61 75 73 65 20  he USING clause 
2b40: 6e 61 6d 65 73 20 58 2c 20 59 2c 20 61 6e 64 20  names X, Y, and 
2b50: 5a 2c 20 74 68 65 6e 20 61 64 64 20 74 68 69 73  Z, then add this
2b60: 0a 20 20 20 20 2a 2a 20 74 6f 20 74 68 65 20 57  .    ** to the W
2b70: 48 45 52 45 20 63 6c 61 75 73 65 3a 20 20 20 20  HERE clause:    
2b80: 41 2e 58 3d 42 2e 58 20 41 4e 44 20 41 2e 59 3d  A.X=B.X AND A.Y=
2b90: 42 2e 59 20 41 4e 44 20 41 2e 5a 3d 42 2e 5a 0a  B.Y AND A.Z=B.Z.
2ba0: 20 20 20 20 2a 2a 20 52 65 70 6f 72 74 20 61 6e      ** Report an
2bb0: 20 65 72 72 6f 72 20 69 66 20 61 6e 79 20 63 6f   error if any co
2bc0: 6c 75 6d 6e 20 6d 65 6e 74 69 6f 6e 65 64 20 69  lumn mentioned i
2bd0: 6e 20 74 68 65 20 55 53 49 4e 47 20 63 6c 61 75  n the USING clau
2be0: 73 65 20 69 73 0a 20 20 20 20 2a 2a 20 6e 6f 74  se is.    ** not
2bf0: 20 63 6f 6e 74 61 69 6e 65 64 20 69 6e 20 62 6f   contained in bo
2c00: 74 68 20 74 61 62 6c 65 73 20 74 6f 20 62 65 20  th tables to be 
2c10: 6a 6f 69 6e 65 64 2e 0a 20 20 20 20 2a 2f 0a 20  joined..    */. 
2c20: 20 20 20 69 66 28 20 70 52 69 67 68 74 2d 3e 70     if( pRight->p
2c30: 55 73 69 6e 67 20 29 7b 0a 20 20 20 20 20 20 49  Using ){.      I
2c40: 64 4c 69 73 74 20 2a 70 4c 69 73 74 20 3d 20 70  dList *pList = p
2c50: 52 69 67 68 74 2d 3e 70 55 73 69 6e 67 3b 0a 20  Right->pUsing;. 
2c60: 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c       for(j=0; j<
2c70: 70 4c 69 73 74 2d 3e 6e 49 64 3b 20 6a 2b 2b 29  pList->nId; j++)
2c80: 7b 0a 20 20 20 20 20 20 20 20 63 68 61 72 20 2a  {.        char *
2c90: 7a 4e 61 6d 65 20 3d 20 70 4c 69 73 74 2d 3e 61  zName = pList->a
2ca0: 5b 6a 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20  [j].zName;.     
2cb0: 20 20 20 69 66 28 20 63 6f 6c 75 6d 6e 49 6e 64     if( columnInd
2cc0: 65 78 28 70 4c 65 66 74 54 61 62 2c 20 7a 4e 61  ex(pLeftTab, zNa
2cd0: 6d 65 29 3c 30 20 7c 7c 20 63 6f 6c 75 6d 6e 49  me)<0 || columnI
2ce0: 6e 64 65 78 28 70 52 69 67 68 74 54 61 62 2c 20  ndex(pRightTab, 
2cf0: 7a 4e 61 6d 65 29 3c 30 20 29 7b 0a 20 20 20 20  zName)<0 ){.    
2d00: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72        sqlite3Err
2d10: 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 63  orMsg(pParse, "c
2d20: 61 6e 6e 6f 74 20 6a 6f 69 6e 20 75 73 69 6e 67  annot join using
2d30: 20 63 6f 6c 75 6d 6e 20 25 73 20 2d 20 63 6f 6c   column %s - col
2d40: 75 6d 6e 20 22 0a 20 20 20 20 20 20 20 20 20 20  umn ".          
2d50: 20 20 22 6e 6f 74 20 70 72 65 73 65 6e 74 20 69    "not present i
2d60: 6e 20 62 6f 74 68 20 74 61 62 6c 65 73 22 2c 20  n both tables", 
2d70: 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20  zName);.        
2d80: 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20    return 1;.    
2d90: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 61 64      }.        ad
2da0: 64 57 68 65 72 65 54 65 72 6d 28 7a 4e 61 6d 65  dWhereTerm(zName
2db0: 2c 20 70 4c 65 66 74 54 61 62 2c 20 70 4c 65 66  , pLeftTab, pLef
2dc0: 74 2d 3e 7a 41 6c 69 61 73 2c 20 0a 20 20 20 20  t->zAlias, .    
2dd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2de0: 20 20 20 20 20 20 20 20 70 52 69 67 68 74 54 61          pRightTa
2df0: 62 2c 20 70 52 69 67 68 74 2d 3e 7a 41 6c 69 61  b, pRight->zAlia
2e00: 73 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  s,.             
2e10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
2e20: 52 69 67 68 74 2d 3e 69 43 75 72 73 6f 72 2c 20  Right->iCursor, 
2e30: 26 70 2d 3e 70 57 68 65 72 65 29 3b 0a 20 20 20  &p->pWhere);.   
2e40: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20     }.    }.  }. 
2e50: 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a   return 0;.}../*
2e60: 0a 2a 2a 20 49 6e 73 65 72 74 20 63 6f 64 65 20  .** Insert code 
2e70: 69 6e 74 6f 20 22 76 22 20 74 68 61 74 20 77 69  into "v" that wi
2e80: 6c 6c 20 70 75 73 68 20 74 68 65 20 72 65 63 6f  ll push the reco
2e90: 72 64 20 6f 6e 20 74 68 65 20 74 6f 70 20 6f 66  rd on the top of
2ea0: 20 74 68 65 0a 2a 2a 20 73 74 61 63 6b 20 69 6e   the.** stack in
2eb0: 74 6f 20 74 68 65 20 73 6f 72 74 65 72 2e 0a 2a  to the sorter..*
2ec0: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70 75  /.static void pu
2ed0: 73 68 4f 6e 74 6f 53 6f 72 74 65 72 28 0a 20 20  shOntoSorter(.  
2ee0: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
2ef0: 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 65 72         /* Parser
2f00: 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78   context */.  Ex
2f10: 70 72 4c 69 73 74 20 2a 70 4f 72 64 65 72 42 79  prList *pOrderBy
2f20: 2c 20 20 20 20 2f 2a 20 54 68 65 20 4f 52 44 45  ,    /* The ORDE
2f30: 52 20 42 59 20 63 6c 61 75 73 65 20 2a 2f 0a 20  R BY clause */. 
2f40: 20 53 65 6c 65 63 74 20 2a 70 53 65 6c 65 63 74   Select *pSelect
2f50: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 77          /* The w
2f60: 68 6f 6c 65 20 53 45 4c 45 43 54 20 73 74 61 74  hole SELECT stat
2f70: 65 6d 65 6e 74 20 2a 2f 0a 29 7b 0a 20 20 56 64  ement */.){.  Vd
2f80: 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e  be *v = pParse->
2f90: 70 56 64 62 65 3b 0a 20 20 73 71 6c 69 74 65 33  pVdbe;.  sqlite3
2fa0: 45 78 70 72 43 6f 64 65 45 78 70 72 4c 69 73 74  ExprCodeExprList
2fb0: 28 70 50 61 72 73 65 2c 20 70 4f 72 64 65 72 42  (pParse, pOrderB
2fc0: 79 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  y);.  sqlite3Vdb
2fd0: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 53 65 71  eAddOp(v, OP_Seq
2fe0: 75 65 6e 63 65 2c 20 70 4f 72 64 65 72 42 79 2d  uence, pOrderBy-
2ff0: 3e 69 45 43 75 72 73 6f 72 2c 20 30 29 3b 0a 20  >iECursor, 0);. 
3000: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
3010: 70 28 76 2c 20 4f 50 5f 50 75 6c 6c 2c 20 70 4f  p(v, OP_Pull, pO
3020: 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 20 2b 20  rderBy->nExpr + 
3030: 31 2c 20 30 29 3b 0a 20 20 73 71 6c 69 74 65 33  1, 0);.  sqlite3
3040: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
3050: 4d 61 6b 65 52 65 63 6f 72 64 2c 20 70 4f 72 64  MakeRecord, pOrd
3060: 65 72 42 79 2d 3e 6e 45 78 70 72 20 2b 20 32 2c  erBy->nExpr + 2,
3070: 20 30 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64   0);.  sqlite3Vd
3080: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49 64  beAddOp(v, OP_Id
3090: 78 49 6e 73 65 72 74 2c 20 70 4f 72 64 65 72 42  xInsert, pOrderB
30a0: 79 2d 3e 69 45 43 75 72 73 6f 72 2c 20 30 29 3b  y->iECursor, 0);
30b0: 0a 20 20 69 66 28 20 70 53 65 6c 65 63 74 2d 3e  .  if( pSelect->
30c0: 69 4c 69 6d 69 74 3e 3d 30 20 29 7b 0a 20 20 20  iLimit>=0 ){.   
30d0: 20 69 6e 74 20 61 64 64 72 31 2c 20 61 64 64 72   int addr1, addr
30e0: 32 3b 0a 20 20 20 20 61 64 64 72 31 20 3d 20 73  2;.    addr1 = s
30f0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
3100: 76 2c 20 4f 50 5f 49 66 4d 65 6d 5a 65 72 6f 2c  v, OP_IfMemZero,
3110: 20 70 53 65 6c 65 63 74 2d 3e 69 4c 69 6d 69 74   pSelect->iLimit
3120: 2b 31 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69  +1, 0);.    sqli
3130: 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
3140: 4f 50 5f 4d 65 6d 49 6e 63 72 2c 20 2d 31 2c 20  OP_MemIncr, -1, 
3150: 70 53 65 6c 65 63 74 2d 3e 69 4c 69 6d 69 74 2b  pSelect->iLimit+
3160: 31 29 3b 0a 20 20 20 20 61 64 64 72 32 20 3d 20  1);.    addr2 = 
3170: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
3180: 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20  (v, OP_Goto, 0, 
3190: 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  0);.    sqlite3V
31a0: 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61  dbeJumpHere(v, a
31b0: 64 64 72 31 29 3b 0a 20 20 20 20 73 71 6c 69 74  ddr1);.    sqlit
31c0: 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
31d0: 50 5f 4c 61 73 74 2c 20 70 4f 72 64 65 72 42 79  P_Last, pOrderBy
31e0: 2d 3e 69 45 43 75 72 73 6f 72 2c 20 30 29 3b 0a  ->iECursor, 0);.
31f0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
3200: 64 64 4f 70 28 76 2c 20 4f 50 5f 44 65 6c 65 74  ddOp(v, OP_Delet
3210: 65 2c 20 70 4f 72 64 65 72 42 79 2d 3e 69 45 43  e, pOrderBy->iEC
3220: 75 72 73 6f 72 2c 20 30 29 3b 0a 20 20 20 20 73  ursor, 0);.    s
3230: 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65  qlite3VdbeJumpHe
3240: 72 65 28 76 2c 20 61 64 64 72 32 29 3b 0a 20 20  re(v, addr2);.  
3250: 20 20 70 53 65 6c 65 63 74 2d 3e 69 4c 69 6d 69    pSelect->iLimi
3260: 74 20 3d 20 2d 31 3b 0a 20 20 7d 0a 7d 0a 0a 2f  t = -1;.  }.}../
3270: 2a 0a 2a 2a 20 41 64 64 20 63 6f 64 65 20 74 6f  *.** Add code to
3280: 20 69 6d 70 6c 65 6d 65 6e 74 20 74 68 65 20 4f   implement the O
3290: 46 46 53 45 54 0a 2a 2f 0a 73 74 61 74 69 63 20  FFSET.*/.static 
32a0: 76 6f 69 64 20 63 6f 64 65 4f 66 66 73 65 74 28  void codeOffset(
32b0: 0a 20 20 56 64 62 65 20 2a 76 2c 20 20 20 20 20  .  Vdbe *v,     
32c0: 20 20 20 20 20 2f 2a 20 47 65 6e 65 72 61 74 65       /* Generate
32d0: 20 63 6f 64 65 20 69 6e 74 6f 20 74 68 69 73 20   code into this 
32e0: 56 4d 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a  VM */.  Select *
32f0: 70 2c 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65  p,        /* The
3300: 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
3310: 74 20 62 65 69 6e 67 20 63 6f 64 65 64 20 2a 2f  t being coded */
3320: 0a 20 20 69 6e 74 20 69 43 6f 6e 74 69 6e 75 65  .  int iContinue
3330: 2c 20 20 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72  ,    /* Jump her
3340: 65 20 74 6f 20 73 6b 69 70 20 74 68 65 20 63 75  e to skip the cu
3350: 72 72 65 6e 74 20 72 65 63 6f 72 64 20 2a 2f 0a  rrent record */.
3360: 20 20 69 6e 74 20 6e 50 6f 70 20 20 20 20 20 20    int nPop      
3370: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
3380: 20 74 69 6d 65 73 20 74 6f 20 70 6f 70 20 73 74   times to pop st
3390: 61 63 6b 20 77 68 65 6e 20 6a 75 6d 70 69 6e 67  ack when jumping
33a0: 20 2a 2f 0a 29 7b 0a 20 20 69 66 28 20 70 2d 3e   */.){.  if( p->
33b0: 69 4f 66 66 73 65 74 3e 3d 30 20 26 26 20 69 43  iOffset>=0 && iC
33c0: 6f 6e 74 69 6e 75 65 21 3d 30 20 29 7b 0a 20 20  ontinue!=0 ){.  
33d0: 20 20 69 6e 74 20 61 64 64 72 3b 0a 20 20 20 20    int addr;.    
33e0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
33f0: 28 76 2c 20 4f 50 5f 4d 65 6d 49 6e 63 72 2c 20  (v, OP_MemIncr, 
3400: 2d 31 2c 20 70 2d 3e 69 4f 66 66 73 65 74 29 3b  -1, p->iOffset);
3410: 0a 20 20 20 20 61 64 64 72 20 3d 20 73 71 6c 69  .    addr = sqli
3420: 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
3430: 4f 50 5f 49 66 4d 65 6d 4e 65 67 2c 20 70 2d 3e  OP_IfMemNeg, p->
3440: 69 4f 66 66 73 65 74 2c 20 30 29 3b 0a 20 20 20  iOffset, 0);.   
3450: 20 69 66 28 20 6e 50 6f 70 3e 30 20 29 7b 0a 20   if( nPop>0 ){. 
3460: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
3470: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 50 6f 70 2c  AddOp(v, OP_Pop,
3480: 20 6e 50 6f 70 2c 20 30 29 3b 0a 20 20 20 20 7d   nPop, 0);.    }
3490: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
34a0: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 47 6f 74 6f  AddOp(v, OP_Goto
34b0: 2c 20 30 2c 20 69 43 6f 6e 74 69 6e 75 65 29 3b  , 0, iContinue);
34c0: 0a 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74  .    VdbeComment
34d0: 28 28 76 2c 20 22 23 20 73 6b 69 70 20 4f 46 46  ((v, "# skip OFF
34e0: 53 45 54 20 72 65 63 6f 72 64 73 22 29 29 3b 0a  SET records"));.
34f0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a      sqlite3VdbeJ
3500: 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72 29  umpHere(v, addr)
3510: 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  ;.  }.}../*.** A
3520: 64 64 20 63 6f 64 65 20 74 68 61 74 20 77 69 6c  dd code that wil
3530: 6c 20 63 68 65 63 6b 20 74 6f 20 6d 61 6b 65 20  l check to make 
3540: 73 75 72 65 20 74 68 65 20 74 6f 70 20 4e 20 65  sure the top N e
3550: 6c 65 6d 65 6e 74 73 20 6f 66 20 74 68 65 0a 2a  lements of the.*
3560: 2a 20 73 74 61 63 6b 20 61 72 65 20 64 69 73 74  * stack are dist
3570: 69 6e 63 74 2e 20 20 69 54 61 62 20 69 73 20 61  inct.  iTab is a
3580: 20 73 6f 72 74 69 6e 67 20 69 6e 64 65 78 20 74   sorting index t
3590: 68 61 74 20 68 6f 6c 64 73 20 70 72 65 76 69 6f  hat holds previo
35a0: 75 73 6c 79 0a 2a 2a 20 73 65 65 6e 20 63 6f 6d  usly.** seen com
35b0: 62 69 6e 61 74 69 6f 6e 73 20 6f 66 20 74 68 65  binations of the
35c0: 20 4e 20 76 61 6c 75 65 73 2e 20 20 41 20 6e 65   N values.  A ne
35d0: 77 20 65 6e 74 72 79 20 69 73 20 6d 61 64 65 20  w entry is made 
35e0: 69 6e 20 69 54 61 62 0a 2a 2a 20 69 66 20 74 68  in iTab.** if th
35f0: 65 20 63 75 72 72 65 6e 74 20 4e 20 76 61 6c 75  e current N valu
3600: 65 73 20 61 72 65 20 6e 65 77 2e 0a 2a 2a 0a 2a  es are new..**.*
3610: 2a 20 41 20 6a 75 6d 70 20 74 6f 20 61 64 64 72  * A jump to addr
3620: 52 65 70 65 61 74 20 69 73 20 6d 61 64 65 20 61  Repeat is made a
3630: 6e 64 20 74 68 65 20 4e 2b 31 20 76 61 6c 75 65  nd the N+1 value
3640: 73 20 61 72 65 20 70 6f 70 70 65 64 20 66 72 6f  s are popped fro
3650: 6d 20 74 68 65 0a 2a 2a 20 73 74 61 63 6b 20 69  m the.** stack i
3660: 66 20 74 68 65 20 74 6f 70 20 4e 20 65 6c 65 6d  f the top N elem
3670: 65 6e 74 73 20 61 72 65 20 6e 6f 74 20 64 69 73  ents are not dis
3680: 74 69 6e 63 74 2e 0a 2a 2f 0a 73 74 61 74 69 63  tinct..*/.static
3690: 20 76 6f 69 64 20 63 6f 64 65 44 69 73 74 69 6e   void codeDistin
36a0: 63 74 28 0a 20 20 56 64 62 65 20 2a 76 2c 20 20  ct(.  Vdbe *v,  
36b0: 20 20 20 20 20 20 20 20 20 2f 2a 20 47 65 6e 65           /* Gene
36c0: 72 61 74 65 20 63 6f 64 65 20 69 6e 74 6f 20 74  rate code into t
36d0: 68 69 73 20 56 4d 20 2a 2f 0a 20 20 69 6e 74 20  his VM */.  int 
36e0: 69 54 61 62 2c 20 20 20 20 20 20 20 20 20 20 2f  iTab,          /
36f0: 2a 20 41 20 73 6f 72 74 69 6e 67 20 69 6e 64 65  * A sorting inde
3700: 78 20 75 73 65 64 20 74 6f 20 74 65 73 74 20 66  x used to test f
3710: 6f 72 20 64 69 73 74 69 6e 63 74 6e 65 73 73 20  or distinctness 
3720: 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 52 65 70  */.  int addrRep
3730: 65 61 74 2c 20 20 20 20 2f 2a 20 4a 75 6d 70 20  eat,    /* Jump 
3740: 74 6f 20 68 65 72 65 20 69 66 20 6e 6f 74 20 64  to here if not d
3750: 69 73 74 69 6e 63 74 20 2a 2f 0a 20 20 69 6e 74  istinct */.  int
3760: 20 4e 20 20 20 20 20 20 20 20 20 20 20 20 20 20   N              
3770: 2f 2a 20 54 68 65 20 74 6f 70 20 4e 20 65 6c 65  /* The top N ele
3780: 6d 65 6e 74 73 20 6f 66 20 74 68 65 20 73 74 61  ments of the sta
3790: 63 6b 20 6d 75 73 74 20 62 65 20 64 69 73 74 69  ck must be disti
37a0: 6e 63 74 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69  nct */.){.  sqli
37b0: 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
37c0: 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20 2d  OP_MakeRecord, -
37d0: 4e 2c 20 30 29 3b 0a 20 20 73 71 6c 69 74 65 33  N, 0);.  sqlite3
37e0: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
37f0: 44 69 73 74 69 6e 63 74 2c 20 69 54 61 62 2c 20  Distinct, iTab, 
3800: 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65  sqlite3VdbeCurre
3810: 6e 74 41 64 64 72 28 76 29 2b 33 29 3b 0a 20 20  ntAddr(v)+3);.  
3820: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
3830: 28 76 2c 20 4f 50 5f 50 6f 70 2c 20 4e 2b 31 2c  (v, OP_Pop, N+1,
3840: 20 30 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64   0);.  sqlite3Vd
3850: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 47 6f  beAddOp(v, OP_Go
3860: 74 6f 2c 20 30 2c 20 61 64 64 72 52 65 70 65 61  to, 0, addrRepea
3870: 74 29 3b 0a 20 20 56 64 62 65 43 6f 6d 6d 65 6e  t);.  VdbeCommen
3880: 74 28 28 76 2c 20 22 23 20 73 6b 69 70 20 69 6e  t((v, "# skip in
3890: 64 69 73 74 69 6e 63 74 20 72 65 63 6f 72 64 73  distinct records
38a0: 22 29 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64  "));.  sqlite3Vd
38b0: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49 64  beAddOp(v, OP_Id
38c0: 78 49 6e 73 65 72 74 2c 20 69 54 61 62 2c 20 30  xInsert, iTab, 0
38d0: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65  );.}../*.** Gene
38e0: 72 61 74 65 20 61 6e 20 65 72 72 6f 72 20 6d 65  rate an error me
38f0: 73 73 61 67 65 20 77 68 65 6e 20 61 20 53 45 4c  ssage when a SEL
3900: 45 43 54 20 69 73 20 75 73 65 64 20 77 69 74 68  ECT is used with
3910: 69 6e 20 61 20 73 75 62 65 78 70 72 65 73 73 69  in a subexpressi
3920: 6f 6e 0a 2a 2a 20 28 65 78 61 6d 70 6c 65 3a 20  on.** (example: 
3930: 20 22 61 20 49 4e 20 28 53 45 4c 45 43 54 20 2a   "a IN (SELECT *
3940: 20 46 52 4f 4d 20 74 61 62 6c 65 29 22 29 20 62   FROM table)") b
3950: 75 74 20 69 74 20 68 61 73 20 6d 6f 72 65 20 74  ut it has more t
3960: 68 61 6e 20 31 20 72 65 73 75 6c 74 0a 2a 2a 20  han 1 result.** 
3970: 63 6f 6c 75 6d 6e 2e 20 20 57 65 20 64 6f 20 74  column.  We do t
3980: 68 69 73 20 69 6e 20 61 20 73 75 62 72 6f 75 74  his in a subrout
3990: 69 6e 65 20 62 65 63 61 75 73 65 20 74 68 65 20  ine because the 
39a0: 65 72 72 6f 72 20 6f 63 63 75 72 73 20 69 6e 20  error occurs in 
39b0: 6d 75 6c 74 69 70 6c 65 0a 2a 2a 20 70 6c 61 63  multiple.** plac
39c0: 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  es..*/.static in
39d0: 74 20 63 68 65 63 6b 46 6f 72 4d 75 6c 74 69 43  t checkForMultiC
39e0: 6f 6c 75 6d 6e 53 65 6c 65 63 74 45 72 72 6f 72  olumnSelectError
39f0: 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
3a00: 69 6e 74 20 65 44 65 73 74 2c 20 69 6e 74 20 6e  int eDest, int n
3a10: 45 78 70 72 29 7b 0a 20 20 69 66 28 20 6e 45 78  Expr){.  if( nEx
3a20: 70 72 3e 31 20 26 26 20 28 65 44 65 73 74 3d 3d  pr>1 && (eDest==
3a30: 53 52 54 5f 4d 65 6d 20 7c 7c 20 65 44 65 73 74  SRT_Mem || eDest
3a40: 3d 3d 53 52 54 5f 53 65 74 29 20 29 7b 0a 20 20  ==SRT_Set) ){.  
3a50: 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
3a60: 67 28 70 50 61 72 73 65 2c 20 22 6f 6e 6c 79 20  g(pParse, "only 
3a70: 61 20 73 69 6e 67 6c 65 20 72 65 73 75 6c 74 20  a single result 
3a80: 61 6c 6c 6f 77 65 64 20 66 6f 72 20 22 0a 20 20  allowed for ".  
3a90: 20 20 20 20 20 22 61 20 53 45 4c 45 43 54 20 74       "a SELECT t
3aa0: 68 61 74 20 69 73 20 70 61 72 74 20 6f 66 20 61  hat is part of a
3ab0: 6e 20 65 78 70 72 65 73 73 69 6f 6e 22 29 3b 0a  n expression");.
3ac0: 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20      return 1;.  
3ad0: 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65 74 75 72  }else{.    retur
3ae0: 6e 20 30 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  n 0;.  }.}../*.*
3af0: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 67  * This routine g
3b00: 65 6e 65 72 61 74 65 73 20 74 68 65 20 63 6f 64  enerates the cod
3b10: 65 20 66 6f 72 20 74 68 65 20 69 6e 73 69 64 65  e for the inside
3b20: 20 6f 66 20 74 68 65 20 69 6e 6e 65 72 20 6c 6f   of the inner lo
3b30: 6f 70 0a 2a 2a 20 6f 66 20 61 20 53 45 4c 45 43  op.** of a SELEC
3b40: 54 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 73 72 63 54  T..**.** If srcT
3b50: 61 62 20 61 6e 64 20 6e 43 6f 6c 75 6d 6e 20 61  ab and nColumn a
3b60: 72 65 20 62 6f 74 68 20 7a 65 72 6f 2c 20 74 68  re both zero, th
3b70: 65 6e 20 74 68 65 20 70 45 4c 69 73 74 20 65 78  en the pEList ex
3b80: 70 72 65 73 73 69 6f 6e 73 0a 2a 2a 20 61 72 65  pressions.** are
3b90: 20 65 76 61 6c 75 61 74 65 64 20 69 6e 20 6f 72   evaluated in or
3ba0: 64 65 72 20 74 6f 20 67 65 74 20 74 68 65 20 64  der to get the d
3bb0: 61 74 61 20 66 6f 72 20 74 68 69 73 20 72 6f 77  ata for this row
3bc0: 2e 20 20 49 66 20 6e 43 6f 6c 75 6d 6e 3e 30 0a  .  If nColumn>0.
3bd0: 2a 2a 20 74 68 65 6e 20 64 61 74 61 20 69 73 20  ** then data is 
3be0: 70 75 6c 6c 65 64 20 66 72 6f 6d 20 73 72 63 54  pulled from srcT
3bf0: 61 62 20 61 6e 64 20 70 45 4c 69 73 74 20 69 73  ab and pEList is
3c00: 20 75 73 65 64 20 6f 6e 6c 79 20 74 6f 20 67 65   used only to ge
3c10: 74 20 74 68 65 0a 2a 2a 20 64 61 74 61 74 79 70  t the.** datatyp
3c20: 65 73 20 66 6f 72 20 65 61 63 68 20 63 6f 6c 75  es for each colu
3c30: 6d 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  mn..*/.static in
3c40: 74 20 73 65 6c 65 63 74 49 6e 6e 65 72 4c 6f 6f  t selectInnerLoo
3c50: 70 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  p(.  Parse *pPar
3c60: 73 65 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20  se,          /* 
3c70: 54 68 65 20 70 61 72 73 65 72 20 63 6f 6e 74 65  The parser conte
3c80: 78 74 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a  xt */.  Select *
3c90: 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p,              
3ca0: 2f 2a 20 54 68 65 20 63 6f 6d 70 6c 65 74 65 20  /* The complete 
3cb0: 73 65 6c 65 63 74 20 73 74 61 74 65 6d 65 6e 74  select statement
3cc0: 20 62 65 69 6e 67 20 63 6f 64 65 64 20 2a 2f 0a   being coded */.
3cd0: 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69    ExprList *pELi
3ce0: 73 74 2c 20 20 20 20 20 20 20 2f 2a 20 4c 69 73  st,       /* Lis
3cf0: 74 20 6f 66 20 76 61 6c 75 65 73 20 62 65 69 6e  t of values bein
3d00: 67 20 65 78 74 72 61 63 74 65 64 20 2a 2f 0a 20  g extracted */. 
3d10: 20 69 6e 74 20 73 72 63 54 61 62 2c 20 20 20 20   int srcTab,    
3d20: 20 20 20 20 20 20 20 20 20 2f 2a 20 50 75 6c 6c           /* Pull
3d30: 20 64 61 74 61 20 66 72 6f 6d 20 74 68 69 73 20   data from this 
3d40: 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 6e  table */.  int n
3d50: 43 6f 6c 75 6d 6e 2c 20 20 20 20 20 20 20 20 20  Column,         
3d60: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
3d70: 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20 73  columns in the s
3d80: 6f 75 72 63 65 20 74 61 62 6c 65 20 2a 2f 0a 20  ource table */. 
3d90: 20 45 78 70 72 4c 69 73 74 20 2a 70 4f 72 64 65   ExprList *pOrde
3da0: 72 42 79 2c 20 20 20 20 20 2f 2a 20 49 66 20 6e  rBy,     /* If n
3db0: 6f 74 20 4e 55 4c 4c 2c 20 73 6f 72 74 20 72 65  ot NULL, sort re
3dc0: 73 75 6c 74 73 20 75 73 69 6e 67 20 74 68 69 73  sults using this
3dd0: 20 6b 65 79 20 2a 2f 0a 20 20 69 6e 74 20 64 69   key */.  int di
3de0: 73 74 69 6e 63 74 2c 20 20 20 20 20 20 20 20 20  stinct,         
3df0: 20 20 2f 2a 20 49 66 20 3e 3d 30 2c 20 6d 61 6b    /* If >=0, mak
3e00: 65 20 73 75 72 65 20 72 65 73 75 6c 74 73 20 61  e sure results a
3e10: 72 65 20 64 69 73 74 69 6e 63 74 20 2a 2f 0a 20  re distinct */. 
3e20: 20 69 6e 74 20 65 44 65 73 74 2c 20 20 20 20 20   int eDest,     
3e30: 20 20 20 20 20 20 20 20 20 2f 2a 20 48 6f 77 20           /* How 
3e40: 74 6f 20 64 69 73 70 6f 73 65 20 6f 66 20 74 68  to dispose of th
3e50: 65 20 72 65 73 75 6c 74 73 20 2a 2f 0a 20 20 69  e results */.  i
3e60: 6e 74 20 69 50 61 72 6d 2c 20 20 20 20 20 20 20  nt iParm,       
3e70: 20 20 20 20 20 20 20 2f 2a 20 41 6e 20 61 72 67         /* An arg
3e80: 75 6d 65 6e 74 20 74 6f 20 74 68 65 20 64 69 73  ument to the dis
3e90: 70 6f 73 61 6c 20 6d 65 74 68 6f 64 20 2a 2f 0a  posal method */.
3ea0: 20 20 69 6e 74 20 69 43 6f 6e 74 69 6e 75 65 2c    int iContinue,
3eb0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4a 75 6d            /* Jum
3ec0: 70 20 68 65 72 65 20 74 6f 20 63 6f 6e 74 69 6e  p here to contin
3ed0: 75 65 20 77 69 74 68 20 6e 65 78 74 20 72 6f 77  ue with next row
3ee0: 20 2a 2f 0a 20 20 69 6e 74 20 69 42 72 65 61 6b   */.  int iBreak
3ef0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ,             /*
3f00: 20 4a 75 6d 70 20 68 65 72 65 20 74 6f 20 62 72   Jump here to br
3f10: 65 61 6b 20 6f 75 74 20 6f 66 20 74 68 65 20 69  eak out of the i
3f20: 6e 6e 65 72 20 6c 6f 6f 70 20 2a 2f 0a 20 20 63  nner loop */.  c
3f30: 68 61 72 20 2a 61 66 66 20 20 20 20 20 20 20 20  har *aff        
3f40: 20 20 20 20 20 20 20 2f 2a 20 61 66 66 69 6e 69         /* affini
3f50: 74 79 20 73 74 72 69 6e 67 20 69 66 20 65 44 65  ty string if eDe
3f60: 73 74 20 69 73 20 53 52 54 5f 55 6e 69 6f 6e 20  st is SRT_Union 
3f70: 2a 2f 0a 29 7b 0a 20 20 56 64 62 65 20 2a 76 20  */.){.  Vdbe *v 
3f80: 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b  = pParse->pVdbe;
3f90: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20  .  int i;.  int 
3fa0: 68 61 73 44 69 73 74 69 6e 63 74 3b 20 20 20 20  hasDistinct;    
3fb0: 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 74      /* True if t
3fc0: 68 65 20 44 49 53 54 49 4e 43 54 20 6b 65 79 77  he DISTINCT keyw
3fd0: 6f 72 64 20 69 73 20 70 72 65 73 65 6e 74 20 2a  ord is present *
3fe0: 2f 0a 0a 20 20 69 66 28 20 76 3d 3d 30 20 29 20  /..  if( v==0 ) 
3ff0: 72 65 74 75 72 6e 20 30 3b 0a 20 20 61 73 73 65  return 0;.  asse
4000: 72 74 28 20 70 45 4c 69 73 74 21 3d 30 20 29 3b  rt( pEList!=0 );
4010: 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20  ..  /* If there 
4020: 77 61 73 20 61 20 4c 49 4d 49 54 20 63 6c 61 75  was a LIMIT clau
4030: 73 65 20 6f 6e 20 74 68 65 20 53 45 4c 45 43 54  se on the SELECT
4040: 20 73 74 61 74 65 6d 65 6e 74 2c 20 74 68 65 6e   statement, then
4050: 20 64 6f 20 74 68 65 20 63 68 65 63 6b 0a 20 20   do the check.  
4060: 2a 2a 20 74 6f 20 73 65 65 20 69 66 20 74 68 69  ** to see if thi
4070: 73 20 72 6f 77 20 73 68 6f 75 6c 64 20 62 65 20  s row should be 
4080: 6f 75 74 70 75 74 2e 0a 20 20 2a 2f 0a 20 20 68  output..  */.  h
4090: 61 73 44 69 73 74 69 6e 63 74 20 3d 20 64 69 73  asDistinct = dis
40a0: 74 69 6e 63 74 3e 3d 30 20 26 26 20 70 45 4c 69  tinct>=0 && pELi
40b0: 73 74 2d 3e 6e 45 78 70 72 3e 30 3b 0a 20 20 69  st->nExpr>0;.  i
40c0: 66 28 20 70 4f 72 64 65 72 42 79 3d 3d 30 20 26  f( pOrderBy==0 &
40d0: 26 20 21 68 61 73 44 69 73 74 69 6e 63 74 20 29  & !hasDistinct )
40e0: 7b 0a 20 20 20 20 63 6f 64 65 4f 66 66 73 65 74  {.    codeOffset
40f0: 28 76 2c 20 70 2c 20 69 43 6f 6e 74 69 6e 75 65  (v, p, iContinue
4100: 2c 20 30 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  , 0);.  }..  /* 
4110: 50 75 6c 6c 20 74 68 65 20 72 65 71 75 65 73 74  Pull the request
4120: 65 64 20 63 6f 6c 75 6d 6e 73 2e 0a 20 20 2a 2f  ed columns..  */
4130: 0a 20 20 69 66 28 20 6e 43 6f 6c 75 6d 6e 3e 30  .  if( nColumn>0
4140: 20 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b   ){.    for(i=0;
4150: 20 69 3c 6e 43 6f 6c 75 6d 6e 3b 20 69 2b 2b 29   i<nColumn; i++)
4160: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  {.      sqlite3V
4170: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 43  dbeAddOp(v, OP_C
4180: 6f 6c 75 6d 6e 2c 20 73 72 63 54 61 62 2c 20 69  olumn, srcTab, i
4190: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65  );.    }.  }else
41a0: 7b 0a 20 20 20 20 6e 43 6f 6c 75 6d 6e 20 3d 20  {.    nColumn = 
41b0: 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 0a 20  pEList->nExpr;. 
41c0: 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f     sqlite3ExprCo
41d0: 64 65 45 78 70 72 4c 69 73 74 28 70 50 61 72 73  deExprList(pPars
41e0: 65 2c 20 70 45 4c 69 73 74 29 3b 0a 20 20 7d 0a  e, pEList);.  }.
41f0: 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 44 49 53  .  /* If the DIS
4200: 54 49 4e 43 54 20 6b 65 79 77 6f 72 64 20 77 61  TINCT keyword wa
4210: 73 20 70 72 65 73 65 6e 74 20 6f 6e 20 74 68 65  s present on the
4220: 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
4230: 74 0a 20 20 2a 2a 20 61 6e 64 20 74 68 69 73 20  t.  ** and this 
4240: 72 6f 77 20 68 61 73 20 62 65 65 6e 20 73 65 65  row has been see
4250: 6e 20 62 65 66 6f 72 65 2c 20 74 68 65 6e 20 64  n before, then d
4260: 6f 20 6e 6f 74 20 6d 61 6b 65 20 74 68 69 73 20  o not make this 
4270: 72 6f 77 0a 20 20 2a 2a 20 70 61 72 74 20 6f 66  row.  ** part of
4280: 20 74 68 65 20 72 65 73 75 6c 74 2e 0a 20 20 2a   the result..  *
4290: 2f 0a 20 20 69 66 28 20 68 61 73 44 69 73 74 69  /.  if( hasDisti
42a0: 6e 63 74 20 29 7b 0a 20 20 20 20 61 73 73 65 72  nct ){.    asser
42b0: 74 28 20 70 45 4c 69 73 74 21 3d 30 20 29 3b 0a  t( pEList!=0 );.
42c0: 20 20 20 20 61 73 73 65 72 74 28 20 70 45 4c 69      assert( pELi
42d0: 73 74 2d 3e 6e 45 78 70 72 3d 3d 6e 43 6f 6c 75  st->nExpr==nColu
42e0: 6d 6e 20 29 3b 0a 20 20 20 20 63 6f 64 65 44 69  mn );.    codeDi
42f0: 73 74 69 6e 63 74 28 76 2c 20 64 69 73 74 69 6e  stinct(v, distin
4300: 63 74 2c 20 69 43 6f 6e 74 69 6e 75 65 2c 20 6e  ct, iContinue, n
4310: 43 6f 6c 75 6d 6e 29 3b 0a 20 20 20 20 69 66 28  Column);.    if(
4320: 20 70 4f 72 64 65 72 42 79 3d 3d 30 20 29 7b 0a   pOrderBy==0 ){.
4330: 20 20 20 20 20 20 63 6f 64 65 4f 66 66 73 65 74        codeOffset
4340: 28 76 2c 20 70 2c 20 69 43 6f 6e 74 69 6e 75 65  (v, p, iContinue
4350: 2c 20 6e 43 6f 6c 75 6d 6e 29 3b 0a 20 20 20 20  , nColumn);.    
4360: 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20 63 68 65  }.  }..  if( che
4370: 63 6b 46 6f 72 4d 75 6c 74 69 43 6f 6c 75 6d 6e  ckForMultiColumn
4380: 53 65 6c 65 63 74 45 72 72 6f 72 28 70 50 61 72  SelectError(pPar
4390: 73 65 2c 20 65 44 65 73 74 2c 20 70 45 4c 69 73  se, eDest, pELis
43a0: 74 2d 3e 6e 45 78 70 72 29 20 29 7b 0a 20 20 20  t->nExpr) ){.   
43b0: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 0a   return 0;.  }..
43c0: 20 20 73 77 69 74 63 68 28 20 65 44 65 73 74 20    switch( eDest 
43d0: 29 7b 0a 20 20 20 20 2f 2a 20 49 6e 20 74 68 69  ){.    /* In thi
43e0: 73 20 6d 6f 64 65 2c 20 77 72 69 74 65 20 65 61  s mode, write ea
43f0: 63 68 20 71 75 65 72 79 20 72 65 73 75 6c 74 20  ch query result 
4400: 74 6f 20 74 68 65 20 6b 65 79 20 6f 66 20 74 68  to the key of th
4410: 65 20 74 65 6d 70 6f 72 61 72 79 0a 20 20 20 20  e temporary.    
4420: 2a 2a 20 74 61 62 6c 65 20 69 50 61 72 6d 2e 0a  ** table iParm..
4430: 20 20 20 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53      */.#ifndef S
4440: 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f 4d 50 4f  QLITE_OMIT_COMPO
4450: 55 4e 44 5f 53 45 4c 45 43 54 0a 20 20 20 20 63  UND_SELECT.    c
4460: 61 73 65 20 53 52 54 5f 55 6e 69 6f 6e 3a 20 7b  ase SRT_Union: {
4470: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
4480: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 61  beAddOp(v, OP_Ma
4490: 6b 65 52 65 63 6f 72 64 2c 20 6e 43 6f 6c 75 6d  keRecord, nColum
44a0: 6e 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28  n, 0);.      if(
44b0: 20 61 66 66 20 29 7b 0a 20 20 20 20 20 20 20 20   aff ){.        
44c0: 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67  sqlite3VdbeChang
44d0: 65 50 33 28 76 2c 20 2d 31 2c 20 61 66 66 2c 20  eP3(v, -1, aff, 
44e0: 50 33 5f 53 54 41 54 49 43 29 3b 0a 20 20 20 20  P3_STATIC);.    
44f0: 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65    }.      sqlite
4500: 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
4510: 5f 49 64 78 49 6e 73 65 72 74 2c 20 69 50 61 72  _IdxInsert, iPar
4520: 6d 2c 20 30 29 3b 0a 20 20 20 20 20 20 62 72 65  m, 0);.      bre
4530: 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  ak;.    }..    /
4540: 2a 20 43 6f 6e 73 74 72 75 63 74 20 61 20 72 65  * Construct a re
4550: 63 6f 72 64 20 66 72 6f 6d 20 74 68 65 20 71 75  cord from the qu
4560: 65 72 79 20 72 65 73 75 6c 74 2c 20 62 75 74 20  ery result, but 
4570: 69 6e 73 74 65 61 64 20 6f 66 0a 20 20 20 20 2a  instead of.    *
4580: 2a 20 73 61 76 69 6e 67 20 74 68 61 74 20 72 65  * saving that re
4590: 63 6f 72 64 2c 20 75 73 65 20 69 74 20 61 73 20  cord, use it as 
45a0: 61 20 6b 65 79 20 74 6f 20 64 65 6c 65 74 65 20  a key to delete 
45b0: 65 6c 65 6d 65 6e 74 73 20 66 72 6f 6d 0a 20 20  elements from.  
45c0: 20 20 2a 2a 20 74 68 65 20 74 65 6d 70 6f 72 61    ** the tempora
45d0: 72 79 20 74 61 62 6c 65 20 69 50 61 72 6d 2e 0a  ry table iParm..
45e0: 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20      */.    case 
45f0: 53 52 54 5f 45 78 63 65 70 74 3a 20 7b 0a 20 20  SRT_Except: {.  
4600: 20 20 20 20 69 6e 74 20 61 64 64 72 3b 0a 20 20      int addr;.  
4610: 20 20 20 20 61 64 64 72 20 3d 20 73 71 6c 69 74      addr = sqlit
4620: 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
4630: 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20 6e 43  P_MakeRecord, nC
4640: 6f 6c 75 6d 6e 2c 20 30 29 3b 0a 20 20 20 20 20  olumn, 0);.     
4650: 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e   sqlite3VdbeChan
4660: 67 65 50 33 28 76 2c 20 2d 31 2c 20 61 66 66 2c  geP3(v, -1, aff,
4670: 20 50 33 5f 53 54 41 54 49 43 29 3b 0a 20 20 20   P3_STATIC);.   
4680: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
4690: 64 4f 70 28 76 2c 20 4f 50 5f 4e 6f 74 46 6f 75  dOp(v, OP_NotFou
46a0: 6e 64 2c 20 69 50 61 72 6d 2c 20 61 64 64 72 2b  nd, iParm, addr+
46b0: 33 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  3);.      sqlite
46c0: 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
46d0: 5f 44 65 6c 65 74 65 2c 20 69 50 61 72 6d 2c 20  _Delete, iParm, 
46e0: 30 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  0);.      break;
46f0: 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20  .    }.#endif.. 
4700: 20 20 20 2f 2a 20 53 74 6f 72 65 20 74 68 65 20     /* Store the 
4710: 72 65 73 75 6c 74 20 61 73 20 64 61 74 61 20 75  result as data u
4720: 73 69 6e 67 20 61 20 75 6e 69 71 75 65 20 6b 65  sing a unique ke
4730: 79 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61  y..    */.    ca
4740: 73 65 20 53 52 54 5f 54 61 62 6c 65 3a 0a 20 20  se SRT_Table:.  
4750: 20 20 63 61 73 65 20 53 52 54 5f 45 70 68 65 6d    case SRT_Ephem
4760: 54 61 62 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c  Tab: {.      sql
4770: 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
4780: 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20   OP_MakeRecord, 
4790: 6e 43 6f 6c 75 6d 6e 2c 20 30 29 3b 0a 20 20 20  nColumn, 0);.   
47a0: 20 20 20 69 66 28 20 70 4f 72 64 65 72 42 79 20     if( pOrderBy 
47b0: 29 7b 0a 20 20 20 20 20 20 20 20 70 75 73 68 4f  ){.        pushO
47c0: 6e 74 6f 53 6f 72 74 65 72 28 70 50 61 72 73 65  ntoSorter(pParse
47d0: 2c 20 70 4f 72 64 65 72 42 79 2c 20 70 29 3b 0a  , pOrderBy, p);.
47e0: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
47f0: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
4800: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4e 65 77 52  AddOp(v, OP_NewR
4810: 6f 77 69 64 2c 20 69 50 61 72 6d 2c 20 30 29 3b  owid, iParm, 0);
4820: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
4830: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
4840: 50 75 6c 6c 2c 20 31 2c 20 30 29 3b 0a 20 20 20  Pull, 1, 0);.   
4850: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
4860: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49 6e 73 65  AddOp(v, OP_Inse
4870: 72 74 2c 20 69 50 61 72 6d 2c 20 4f 50 46 4c 41  rt, iParm, OPFLA
4880: 47 5f 41 50 50 45 4e 44 29 3b 0a 20 20 20 20 20  G_APPEND);.     
4890: 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a   }.      break;.
48a0: 20 20 20 20 7d 0a 0a 23 69 66 6e 64 65 66 20 53      }..#ifndef S
48b0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55  QLITE_OMIT_SUBQU
48c0: 45 52 59 0a 20 20 20 20 2f 2a 20 49 66 20 77 65  ERY.    /* If we
48d0: 20 61 72 65 20 63 72 65 61 74 69 6e 67 20 61 20   are creating a 
48e0: 73 65 74 20 66 6f 72 20 61 6e 20 22 65 78 70 72  set for an "expr
48f0: 20 49 4e 20 28 53 45 4c 45 43 54 20 2e 2e 2e 29   IN (SELECT ...)
4900: 22 20 63 6f 6e 73 74 72 75 63 74 2c 0a 20 20 20  " construct,.   
4910: 20 2a 2a 20 74 68 65 6e 20 74 68 65 72 65 20 73   ** then there s
4920: 68 6f 75 6c 64 20 62 65 20 61 20 73 69 6e 67 6c  hould be a singl
4930: 65 20 69 74 65 6d 20 6f 6e 20 74 68 65 20 73 74  e item on the st
4940: 61 63 6b 2e 20 20 57 72 69 74 65 20 74 68 69 73  ack.  Write this
4950: 0a 20 20 20 20 2a 2a 20 69 74 65 6d 20 69 6e 74  .    ** item int
4960: 6f 20 74 68 65 20 73 65 74 20 74 61 62 6c 65 20  o the set table 
4970: 77 69 74 68 20 62 6f 67 75 73 20 64 61 74 61 2e  with bogus data.
4980: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65  .    */.    case
4990: 20 53 52 54 5f 53 65 74 3a 20 7b 0a 20 20 20 20   SRT_Set: {.    
49a0: 20 20 69 6e 74 20 61 64 64 72 31 20 3d 20 73 71    int addr1 = sq
49b0: 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74  lite3VdbeCurrent
49c0: 41 64 64 72 28 76 29 3b 0a 20 20 20 20 20 20 69  Addr(v);.      i
49d0: 6e 74 20 61 64 64 72 32 3b 0a 0a 20 20 20 20 20  nt addr2;..     
49e0: 20 61 73 73 65 72 74 28 20 6e 43 6f 6c 75 6d 6e   assert( nColumn
49f0: 3d 3d 31 20 29 3b 0a 20 20 20 20 20 20 73 71 6c  ==1 );.      sql
4a00: 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
4a10: 20 4f 50 5f 4e 6f 74 4e 75 6c 6c 2c 20 2d 31 2c   OP_NotNull, -1,
4a20: 20 61 64 64 72 31 2b 33 29 3b 0a 20 20 20 20 20   addr1+3);.     
4a30: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
4a40: 70 28 76 2c 20 4f 50 5f 50 6f 70 2c 20 31 2c 20  p(v, OP_Pop, 1, 
4a50: 30 29 3b 0a 20 20 20 20 20 20 61 64 64 72 32 20  0);.      addr2 
4a60: 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  = sqlite3VdbeAdd
4a70: 4f 70 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30  Op(v, OP_Goto, 0
4a80: 2c 20 30 29 3b 0a 20 20 20 20 20 20 70 2d 3e 61  , 0);.      p->a
4a90: 66 66 69 6e 69 74 79 20 3d 20 73 71 6c 69 74 65  ffinity = sqlite
4aa0: 33 43 6f 6d 70 61 72 65 41 66 66 69 6e 69 74 79  3CompareAffinity
4ab0: 28 70 45 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45  (pEList->a[0].pE
4ac0: 78 70 72 2c 28 69 50 61 72 6d 3e 3e 31 36 29 26  xpr,(iParm>>16)&
4ad0: 30 78 66 66 29 3b 0a 20 20 20 20 20 20 69 66 28  0xff);.      if(
4ae0: 20 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20   pOrderBy ){.   
4af0: 20 20 20 20 20 2f 2a 20 41 74 20 66 69 72 73 74       /* At first
4b00: 20 67 6c 61 6e 63 65 20 79 6f 75 20 77 6f 75 6c   glance you woul
4b10: 64 20 74 68 69 6e 6b 20 77 65 20 63 6f 75 6c 64  d think we could
4b20: 20 6f 70 74 69 6d 69 7a 65 20 6f 75 74 20 74 68   optimize out th
4b30: 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 4f 52 44  e.        ** ORD
4b40: 45 52 20 42 59 20 69 6e 20 74 68 69 73 20 63 61  ER BY in this ca
4b50: 73 65 20 73 69 6e 63 65 20 74 68 65 20 6f 72 64  se since the ord
4b60: 65 72 20 6f 66 20 65 6e 74 72 69 65 73 20 69 6e  er of entries in
4b70: 20 74 68 65 20 73 65 74 0a 20 20 20 20 20 20 20   the set.       
4b80: 20 2a 2a 20 64 6f 65 73 20 6e 6f 74 20 6d 61 74   ** does not mat
4b90: 74 65 72 2e 20 20 42 75 74 20 74 68 65 72 65 20  ter.  But there 
4ba0: 6d 69 67 68 74 20 62 65 20 61 20 4c 49 4d 49 54  might be a LIMIT
4bb0: 20 63 6c 61 75 73 65 2c 20 69 6e 20 77 68 69 63   clause, in whic
4bc0: 68 0a 20 20 20 20 20 20 20 20 2a 2a 20 63 61 73  h.        ** cas
4bd0: 65 20 74 68 65 20 6f 72 64 65 72 20 64 6f 65 73  e the order does
4be0: 20 6d 61 74 74 65 72 20 2a 2f 0a 20 20 20 20 20   matter */.     
4bf0: 20 20 20 70 75 73 68 4f 6e 74 6f 53 6f 72 74 65     pushOntoSorte
4c00: 72 28 70 50 61 72 73 65 2c 20 70 4f 72 64 65 72  r(pParse, pOrder
4c10: 42 79 2c 20 70 29 3b 0a 20 20 20 20 20 20 7d 65  By, p);.      }e
4c20: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  lse{.        sql
4c30: 69 74 65 33 56 64 62 65 4f 70 33 28 76 2c 20 4f  ite3VdbeOp3(v, O
4c40: 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20 31 2c  P_MakeRecord, 1,
4c50: 20 30 2c 20 26 70 2d 3e 61 66 66 69 6e 69 74 79   0, &p->affinity
4c60: 2c 20 31 29 3b 0a 20 20 20 20 20 20 20 20 73 71  , 1);.        sq
4c70: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
4c80: 2c 20 4f 50 5f 49 64 78 49 6e 73 65 72 74 2c 20  , OP_IdxInsert, 
4c90: 28 69 50 61 72 6d 26 30 78 30 30 30 30 46 46 46  (iParm&0x0000FFF
4ca0: 46 29 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a  F), 0);.      }.
4cb0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
4cc0: 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64  eJumpHere(v, add
4cd0: 72 32 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  r2);.      break
4ce0: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
4cf0: 49 66 20 61 6e 79 20 72 6f 77 20 65 78 69 73 74  If any row exist
4d00: 20 69 6e 20 74 68 65 20 72 65 73 75 6c 74 20 73   in the result s
4d10: 65 74 2c 20 72 65 63 6f 72 64 20 74 68 61 74 20  et, record that 
4d20: 66 61 63 74 20 61 6e 64 20 61 62 6f 72 74 2e 0a  fact and abort..
4d30: 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20      */.    case 
4d40: 53 52 54 5f 45 78 69 73 74 73 3a 20 7b 0a 20 20  SRT_Exists: {.  
4d50: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
4d60: 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 65 6d 49 6e  ddOp(v, OP_MemIn
4d70: 74 2c 20 31 2c 20 69 50 61 72 6d 29 3b 0a 20 20  t, 1, iParm);.  
4d80: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
4d90: 64 64 4f 70 28 76 2c 20 4f 50 5f 50 6f 70 2c 20  ddOp(v, OP_Pop, 
4da0: 6e 43 6f 6c 75 6d 6e 2c 20 30 29 3b 0a 20 20 20  nColumn, 0);.   
4db0: 20 20 20 2f 2a 20 54 68 65 20 4c 49 4d 49 54 20     /* The LIMIT 
4dc0: 63 6c 61 75 73 65 20 77 69 6c 6c 20 74 65 72 6d  clause will term
4dd0: 69 6e 61 74 65 20 74 68 65 20 6c 6f 6f 70 20 66  inate the loop f
4de0: 6f 72 20 75 73 20 2a 2f 0a 20 20 20 20 20 20 62  or us */.      b
4df0: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  reak;.    }..   
4e00: 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20 61   /* If this is a
4e10: 20 73 63 61 6c 61 72 20 73 65 6c 65 63 74 20 74   scalar select t
4e20: 68 61 74 20 69 73 20 70 61 72 74 20 6f 66 20 61  hat is part of a
4e30: 6e 20 65 78 70 72 65 73 73 69 6f 6e 2c 20 74 68  n expression, th
4e40: 65 6e 0a 20 20 20 20 2a 2a 20 73 74 6f 72 65 20  en.    ** store 
4e50: 74 68 65 20 72 65 73 75 6c 74 73 20 69 6e 20 74  the results in t
4e60: 68 65 20 61 70 70 72 6f 70 72 69 61 74 65 20 6d  he appropriate m
4e70: 65 6d 6f 72 79 20 63 65 6c 6c 20 61 6e 64 20 62  emory cell and b
4e80: 72 65 61 6b 20 6f 75 74 0a 20 20 20 20 2a 2a 20  reak out.    ** 
4e90: 6f 66 20 74 68 65 20 73 63 61 6e 20 6c 6f 6f 70  of the scan loop
4ea0: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73  ..    */.    cas
4eb0: 65 20 53 52 54 5f 4d 65 6d 3a 20 7b 0a 20 20 20  e SRT_Mem: {.   
4ec0: 20 20 20 61 73 73 65 72 74 28 20 6e 43 6f 6c 75     assert( nColu
4ed0: 6d 6e 3d 3d 31 20 29 3b 0a 20 20 20 20 20 20 69  mn==1 );.      i
4ee0: 66 28 20 70 4f 72 64 65 72 42 79 20 29 7b 0a 20  f( pOrderBy ){. 
4ef0: 20 20 20 20 20 20 20 70 75 73 68 4f 6e 74 6f 53         pushOntoS
4f00: 6f 72 74 65 72 28 70 50 61 72 73 65 2c 20 70 4f  orter(pParse, pO
4f10: 72 64 65 72 42 79 2c 20 70 29 3b 0a 20 20 20 20  rderBy, p);.    
4f20: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
4f30: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
4f40: 70 28 76 2c 20 4f 50 5f 4d 65 6d 53 74 6f 72 65  p(v, OP_MemStore
4f50: 2c 20 69 50 61 72 6d 2c 20 31 29 3b 0a 20 20 20  , iParm, 1);.   
4f60: 20 20 20 20 20 2f 2a 20 54 68 65 20 4c 49 4d 49       /* The LIMI
4f70: 54 20 63 6c 61 75 73 65 20 77 69 6c 6c 20 6a 75  T clause will ju
4f80: 6d 70 20 6f 75 74 20 6f 66 20 74 68 65 20 6c 6f  mp out of the lo
4f90: 6f 70 20 66 6f 72 20 75 73 20 2a 2f 0a 20 20 20  op for us */.   
4fa0: 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b     }.      break
4fb0: 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 20 2f  ;.    }.#endif /
4fc0: 2a 20 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  * #ifndef SQLITE
4fd0: 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 20 2a  _OMIT_SUBQUERY *
4fe0: 2f 0a 0a 20 20 20 20 2f 2a 20 53 65 6e 64 20 74  /..    /* Send t
4ff0: 68 65 20 64 61 74 61 20 74 6f 20 74 68 65 20 63  he data to the c
5000: 61 6c 6c 62 61 63 6b 20 66 75 6e 63 74 69 6f 6e  allback function
5010: 20 6f 72 20 74 6f 20 61 20 73 75 62 72 6f 75 74   or to a subrout
5020: 69 6e 65 2e 20 20 49 6e 20 74 68 65 0a 20 20 20  ine.  In the.   
5030: 20 2a 2a 20 63 61 73 65 20 6f 66 20 61 20 73 75   ** case of a su
5040: 62 72 6f 75 74 69 6e 65 2c 20 74 68 65 20 73 75  broutine, the su
5050: 62 72 6f 75 74 69 6e 65 20 69 74 73 65 6c 66 20  broutine itself 
5060: 69 73 20 72 65 73 70 6f 6e 73 69 62 6c 65 20 66  is responsible f
5070: 6f 72 0a 20 20 20 20 2a 2a 20 70 6f 70 70 69 6e  or.    ** poppin
5080: 67 20 74 68 65 20 64 61 74 61 20 66 72 6f 6d 20  g the data from 
5090: 74 68 65 20 73 74 61 63 6b 2e 0a 20 20 20 20 2a  the stack..    *
50a0: 2f 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f 53  /.    case SRT_S
50b0: 75 62 72 6f 75 74 69 6e 65 3a 0a 20 20 20 20 63  ubroutine:.    c
50c0: 61 73 65 20 53 52 54 5f 43 61 6c 6c 62 61 63 6b  ase SRT_Callback
50d0: 3a 20 7b 0a 20 20 20 20 20 20 69 66 28 20 70 4f  : {.      if( pO
50e0: 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20 20 20  rderBy ){.      
50f0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
5100: 4f 70 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63  Op(v, OP_MakeRec
5110: 6f 72 64 2c 20 6e 43 6f 6c 75 6d 6e 2c 20 30 29  ord, nColumn, 0)
5120: 3b 0a 20 20 20 20 20 20 20 20 70 75 73 68 4f 6e  ;.        pushOn
5130: 74 6f 53 6f 72 74 65 72 28 70 50 61 72 73 65 2c  toSorter(pParse,
5140: 20 70 4f 72 64 65 72 42 79 2c 20 70 29 3b 0a 20   pOrderBy, p);. 
5150: 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 65       }else if( e
5160: 44 65 73 74 3d 3d 53 52 54 5f 53 75 62 72 6f 75  Dest==SRT_Subrou
5170: 74 69 6e 65 20 29 7b 0a 20 20 20 20 20 20 20 20  tine ){.        
5180: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
5190: 28 76 2c 20 4f 50 5f 47 6f 73 75 62 2c 20 30 2c  (v, OP_Gosub, 0,
51a0: 20 69 50 61 72 6d 29 3b 0a 20 20 20 20 20 20 7d   iParm);.      }
51b0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71  else{.        sq
51c0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
51d0: 2c 20 4f 50 5f 43 61 6c 6c 62 61 63 6b 2c 20 6e  , OP_Callback, n
51e0: 43 6f 6c 75 6d 6e 2c 20 30 29 3b 0a 20 20 20 20  Column, 0);.    
51f0: 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b    }.      break;
5200: 0a 20 20 20 20 7d 0a 0a 23 69 66 20 21 64 65 66  .    }..#if !def
5210: 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
5220: 5f 54 52 49 47 47 45 52 29 0a 20 20 20 20 2f 2a  _TRIGGER).    /*
5230: 20 44 69 73 63 61 72 64 20 74 68 65 20 72 65 73   Discard the res
5240: 75 6c 74 73 2e 20 20 54 68 69 73 20 69 73 20 75  ults.  This is u
5250: 73 65 64 20 66 6f 72 20 53 45 4c 45 43 54 20 73  sed for SELECT s
5260: 74 61 74 65 6d 65 6e 74 73 20 69 6e 73 69 64 65  tatements inside
5270: 0a 20 20 20 20 2a 2a 20 74 68 65 20 62 6f 64 79  .    ** the body
5280: 20 6f 66 20 61 20 54 52 49 47 47 45 52 2e 20 20   of a TRIGGER.  
5290: 54 68 65 20 70 75 72 70 6f 73 65 20 6f 66 20 73  The purpose of s
52a0: 75 63 68 20 73 65 6c 65 63 74 73 20 69 73 20 74  uch selects is t
52b0: 6f 20 63 61 6c 6c 0a 20 20 20 20 2a 2a 20 75 73  o call.    ** us
52c0: 65 72 2d 64 65 66 69 6e 65 64 20 66 75 6e 63 74  er-defined funct
52d0: 69 6f 6e 73 20 74 68 61 74 20 68 61 76 65 20 73  ions that have s
52e0: 69 64 65 20 65 66 66 65 63 74 73 2e 20 20 57 65  ide effects.  We
52f0: 20 64 6f 20 6e 6f 74 20 63 61 72 65 0a 20 20 20   do not care.   
5300: 20 2a 2a 20 61 62 6f 75 74 20 74 68 65 20 61 63   ** about the ac
5310: 74 75 61 6c 20 72 65 73 75 6c 74 73 20 6f 66 20  tual results of 
5320: 74 68 65 20 73 65 6c 65 63 74 2e 0a 20 20 20 20  the select..    
5330: 2a 2f 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20  */.    default: 
5340: 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
5350: 65 44 65 73 74 3d 3d 53 52 54 5f 44 69 73 63 61  eDest==SRT_Disca
5360: 72 64 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  rd );.      sqli
5370: 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
5380: 4f 50 5f 50 6f 70 2c 20 6e 43 6f 6c 75 6d 6e 2c  OP_Pop, nColumn,
5390: 20 30 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b   0);.      break
53a0: 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20  ;.    }.#endif. 
53b0: 20 7d 0a 0a 20 20 2f 2a 20 4a 75 6d 70 20 74 6f   }..  /* Jump to
53c0: 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20   the end of the 
53d0: 6c 6f 6f 70 20 69 66 20 74 68 65 20 4c 49 4d 49  loop if the LIMI
53e0: 54 20 69 73 20 72 65 61 63 68 65 64 2e 0a 20 20  T is reached..  
53f0: 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 69 4c 69 6d  */.  if( p->iLim
5400: 69 74 3e 3d 30 20 26 26 20 70 4f 72 64 65 72 42  it>=0 && pOrderB
5410: 79 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69  y==0 ){.    sqli
5420: 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
5430: 4f 50 5f 4d 65 6d 49 6e 63 72 2c 20 2d 31 2c 20  OP_MemIncr, -1, 
5440: 70 2d 3e 69 4c 69 6d 69 74 29 3b 0a 20 20 20 20  p->iLimit);.    
5450: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
5460: 28 76 2c 20 4f 50 5f 49 66 4d 65 6d 5a 65 72 6f  (v, OP_IfMemZero
5470: 2c 20 70 2d 3e 69 4c 69 6d 69 74 2c 20 69 42 72  , p->iLimit, iBr
5480: 65 61 6b 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  eak);.  }.  retu
5490: 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47  rn 0;.}../*.** G
54a0: 69 76 65 6e 20 61 6e 20 65 78 70 72 65 73 73 69  iven an expressi
54b0: 6f 6e 20 6c 69 73 74 2c 20 67 65 6e 65 72 61 74  on list, generat
54c0: 65 20 61 20 4b 65 79 49 6e 66 6f 20 73 74 72 75  e a KeyInfo stru
54d0: 63 74 75 72 65 20 74 68 61 74 20 72 65 63 6f 72  cture that recor
54e0: 64 73 0a 2a 2a 20 74 68 65 20 63 6f 6c 6c 61 74  ds.** the collat
54f0: 69 6e 67 20 73 65 71 75 65 6e 63 65 20 66 6f 72  ing sequence for
5500: 20 65 61 63 68 20 65 78 70 72 65 73 73 69 6f 6e   each expression
5510: 20 69 6e 20 74 68 61 74 20 65 78 70 72 65 73 73   in that express
5520: 69 6f 6e 20 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a 20  ion list..**.** 
5530: 49 66 20 74 68 65 20 45 78 70 72 4c 69 73 74 20  If the ExprList 
5540: 69 73 20 61 6e 20 4f 52 44 45 52 20 42 59 20 6f  is an ORDER BY o
5550: 72 20 47 52 4f 55 50 20 42 59 20 63 6c 61 75 73  r GROUP BY claus
5560: 65 20 74 68 65 6e 20 74 68 65 20 72 65 73 75 6c  e then the resul
5570: 74 69 6e 67 0a 2a 2a 20 4b 65 79 49 6e 66 6f 20  ting.** KeyInfo 
5580: 73 74 72 75 63 74 75 72 65 20 69 73 20 61 70 70  structure is app
5590: 72 6f 70 72 69 61 74 65 20 66 6f 72 20 69 6e 69  ropriate for ini
55a0: 74 69 61 6c 69 7a 69 6e 67 20 61 20 76 69 72 74  tializing a virt
55b0: 75 61 6c 20 69 6e 64 65 78 20 74 6f 0a 2a 2a 20  ual index to.** 
55c0: 69 6d 70 6c 65 6d 65 6e 74 20 74 68 61 74 20 63  implement that c
55d0: 6c 61 75 73 65 2e 20 20 49 66 20 74 68 65 20 45  lause.  If the E
55e0: 78 70 72 4c 69 73 74 20 69 73 20 74 68 65 20 72  xprList is the r
55f0: 65 73 75 6c 74 20 73 65 74 20 6f 66 20 61 20 53  esult set of a S
5600: 45 4c 45 43 54 0a 2a 2a 20 74 68 65 6e 20 74 68  ELECT.** then th
5610: 65 20 4b 65 79 49 6e 66 6f 20 73 74 72 75 63 74  e KeyInfo struct
5620: 75 72 65 20 69 73 20 61 70 70 72 6f 70 72 69 61  ure is appropria
5630: 74 65 20 66 6f 72 20 69 6e 69 74 69 61 6c 69 7a  te for initializ
5640: 69 6e 67 20 61 20 76 69 72 74 75 61 6c 0a 2a 2a  ing a virtual.**
5650: 20 69 6e 64 65 78 20 74 6f 20 69 6d 70 6c 65 6d   index to implem
5660: 65 6e 74 20 61 20 44 49 53 54 49 4e 43 54 20 74  ent a DISTINCT t
5670: 65 73 74 2e 0a 2a 2a 0a 2a 2a 20 53 70 61 63 65  est..**.** Space
5680: 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 4b 65 79   to hold the Key
5690: 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65 20 69  Info structure i
56a0: 73 20 6f 62 74 61 69 6e 20 66 72 6f 6d 20 6d 61  s obtain from ma
56b0: 6c 6c 6f 63 2e 20 20 54 68 65 20 63 61 6c 6c 69  lloc.  The calli
56c0: 6e 67 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 69  ng.** function i
56d0: 73 20 72 65 73 70 6f 6e 73 69 62 6c 65 20 66 6f  s responsible fo
56e0: 72 20 73 65 65 69 6e 67 20 74 68 61 74 20 74 68  r seeing that th
56f0: 69 73 20 73 74 72 75 63 74 75 72 65 20 69 73 20  is structure is 
5700: 65 76 65 6e 74 75 61 6c 6c 79 0a 2a 2a 20 66 72  eventually.** fr
5710: 65 65 64 2e 20 20 41 64 64 20 74 68 65 20 4b 65  eed.  Add the Ke
5720: 79 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65 20  yInfo structure 
5730: 74 6f 20 74 68 65 20 50 33 20 66 69 65 6c 64 20  to the P3 field 
5740: 6f 66 20 61 6e 20 6f 70 63 6f 64 65 20 75 73 69  of an opcode usi
5750: 6e 67 0a 2a 2a 20 50 33 5f 4b 45 59 49 4e 46 4f  ng.** P3_KEYINFO
5760: 5f 48 41 4e 44 4f 46 46 20 69 73 20 74 68 65 20  _HANDOFF is the 
5770: 75 73 75 61 6c 20 77 61 79 20 6f 66 20 64 65 61  usual way of dea
5780: 6c 69 6e 67 20 77 69 74 68 20 74 68 69 73 2e 0a  ling with this..
5790: 2a 2f 0a 73 74 61 74 69 63 20 4b 65 79 49 6e 66  */.static KeyInf
57a0: 6f 20 2a 6b 65 79 49 6e 66 6f 46 72 6f 6d 45 78  o *keyInfoFromEx
57b0: 70 72 4c 69 73 74 28 50 61 72 73 65 20 2a 70 50  prList(Parse *pP
57c0: 61 72 73 65 2c 20 45 78 70 72 4c 69 73 74 20 2a  arse, ExprList *
57d0: 70 4c 69 73 74 29 7b 0a 20 20 73 71 6c 69 74 65  pList){.  sqlite
57e0: 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e  3 *db = pParse->
57f0: 64 62 3b 0a 20 20 69 6e 74 20 6e 45 78 70 72 3b  db;.  int nExpr;
5800: 0a 20 20 4b 65 79 49 6e 66 6f 20 2a 70 49 6e 66  .  KeyInfo *pInf
5810: 6f 3b 0a 20 20 73 74 72 75 63 74 20 45 78 70 72  o;.  struct Expr
5820: 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d  List_item *pItem
5830: 3b 0a 20 20 69 6e 74 20 69 3b 0a 0a 20 20 6e 45  ;.  int i;..  nE
5840: 78 70 72 20 3d 20 70 4c 69 73 74 2d 3e 6e 45 78  xpr = pList->nEx
5850: 70 72 3b 0a 20 20 70 49 6e 66 6f 20 3d 20 73 71  pr;.  pInfo = sq
5860: 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72  lite3DbMallocZer
5870: 6f 28 64 62 2c 20 73 69 7a 65 6f 66 28 2a 70 49  o(db, sizeof(*pI
5880: 6e 66 6f 29 20 2b 20 6e 45 78 70 72 2a 28 73 69  nfo) + nExpr*(si
5890: 7a 65 6f 66 28 43 6f 6c 6c 53 65 71 2a 29 2b 31  zeof(CollSeq*)+1
58a0: 29 20 29 3b 0a 20 20 69 66 28 20 70 49 6e 66 6f  ) );.  if( pInfo
58b0: 20 29 7b 0a 20 20 20 20 70 49 6e 66 6f 2d 3e 61   ){.    pInfo->a
58c0: 53 6f 72 74 4f 72 64 65 72 20 3d 20 28 75 38 2a  SortOrder = (u8*
58d0: 29 26 70 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b 6e  )&pInfo->aColl[n
58e0: 45 78 70 72 5d 3b 0a 20 20 20 20 70 49 6e 66 6f  Expr];.    pInfo
58f0: 2d 3e 6e 46 69 65 6c 64 20 3d 20 6e 45 78 70 72  ->nField = nExpr
5900: 3b 0a 20 20 20 20 70 49 6e 66 6f 2d 3e 65 6e 63  ;.    pInfo->enc
5910: 20 3d 20 45 4e 43 28 64 62 29 3b 0a 20 20 20 20   = ENC(db);.    
5920: 66 6f 72 28 69 3d 30 2c 20 70 49 74 65 6d 3d 70  for(i=0, pItem=p
5930: 4c 69 73 74 2d 3e 61 3b 20 69 3c 6e 45 78 70 72  List->a; i<nExpr
5940: 3b 20 69 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b  ; i++, pItem++){
5950: 0a 20 20 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a  .      CollSeq *
5960: 70 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 70 43 6f  pColl;.      pCo
5970: 6c 6c 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  ll = sqlite3Expr
5980: 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20  CollSeq(pParse, 
5990: 70 49 74 65 6d 2d 3e 70 45 78 70 72 29 3b 0a 20  pItem->pExpr);. 
59a0: 20 20 20 20 20 69 66 28 20 21 70 43 6f 6c 6c 20       if( !pColl 
59b0: 29 7b 0a 20 20 20 20 20 20 20 20 70 43 6f 6c 6c  ){.        pColl
59c0: 20 3d 20 64 62 2d 3e 70 44 66 6c 74 43 6f 6c 6c   = db->pDfltColl
59d0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
59e0: 70 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b 69 5d 20  pInfo->aColl[i] 
59f0: 3d 20 70 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 70  = pColl;.      p
5a00: 49 6e 66 6f 2d 3e 61 53 6f 72 74 4f 72 64 65 72  Info->aSortOrder
5a10: 5b 69 5d 20 3d 20 70 49 74 65 6d 2d 3e 73 6f 72  [i] = pItem->sor
5a20: 74 4f 72 64 65 72 3b 0a 20 20 20 20 7d 0a 20 20  tOrder;.    }.  
5a30: 7d 0a 20 20 72 65 74 75 72 6e 20 70 49 6e 66 6f  }.  return pInfo
5a40: 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74  ;.}.../*.** If t
5a50: 68 65 20 69 6e 6e 65 72 20 6c 6f 6f 70 20 77 61  he inner loop wa
5a60: 73 20 67 65 6e 65 72 61 74 65 64 20 75 73 69 6e  s generated usin
5a70: 67 20 61 20 6e 6f 6e 2d 6e 75 6c 6c 20 70 4f 72  g a non-null pOr
5a80: 64 65 72 42 79 20 61 72 67 75 6d 65 6e 74 2c 0a  derBy argument,.
5a90: 2a 2a 20 74 68 65 6e 20 74 68 65 20 72 65 73 75  ** then the resu
5aa0: 6c 74 73 20 77 65 72 65 20 70 6c 61 63 65 64 20  lts were placed 
5ab0: 69 6e 20 61 20 73 6f 72 74 65 72 2e 20 20 41 66  in a sorter.  Af
5ac0: 74 65 72 20 74 68 65 20 6c 6f 6f 70 20 69 73 20  ter the loop is 
5ad0: 74 65 72 6d 69 6e 61 74 65 64 0a 2a 2a 20 77 65  terminated.** we
5ae0: 20 6e 65 65 64 20 74 6f 20 72 75 6e 20 74 68 65   need to run the
5af0: 20 73 6f 72 74 65 72 20 61 6e 64 20 6f 75 74 70   sorter and outp
5b00: 75 74 20 74 68 65 20 72 65 73 75 6c 74 73 2e 20  ut the results. 
5b10: 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 0a 2a   The following.*
5b20: 2a 20 72 6f 75 74 69 6e 65 20 67 65 6e 65 72 61  * routine genera
5b30: 74 65 73 20 74 68 65 20 63 6f 64 65 20 6e 65 65  tes the code nee
5b40: 64 65 64 20 74 6f 20 64 6f 20 74 68 61 74 2e 0a  ded to do that..
5b50: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 67  */.static void g
5b60: 65 6e 65 72 61 74 65 53 6f 72 74 54 61 69 6c 28  enerateSortTail(
5b70: 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
5b80: 2c 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63  ,   /* Parsing c
5b90: 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53 65 6c 65  ontext */.  Sele
5ba0: 63 74 20 2a 70 2c 20 20 20 20 20 20 20 2f 2a 20  ct *p,       /* 
5bb0: 54 68 65 20 53 45 4c 45 43 54 20 73 74 61 74 65  The SELECT state
5bc0: 6d 65 6e 74 20 2a 2f 0a 20 20 56 64 62 65 20 2a  ment */.  Vdbe *
5bd0: 76 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 47 65  v,         /* Ge
5be0: 6e 65 72 61 74 65 20 63 6f 64 65 20 69 6e 74 6f  nerate code into
5bf0: 20 74 68 69 73 20 56 44 42 45 20 2a 2f 0a 20 20   this VDBE */.  
5c00: 69 6e 74 20 6e 43 6f 6c 75 6d 6e 2c 20 20 20 20  int nColumn,    
5c10: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 6f   /* Number of co
5c20: 6c 75 6d 6e 73 20 6f 66 20 64 61 74 61 20 2a 2f  lumns of data */
5c30: 0a 20 20 69 6e 74 20 65 44 65 73 74 2c 20 20 20  .  int eDest,   
5c40: 20 20 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65      /* Write the
5c50: 20 73 6f 72 74 65 64 20 72 65 73 75 6c 74 73 20   sorted results 
5c60: 68 65 72 65 20 2a 2f 0a 20 20 69 6e 74 20 69 50  here */.  int iP
5c70: 61 72 6d 20 20 20 20 20 20 20 20 2f 2a 20 4f 70  arm        /* Op
5c80: 74 69 6f 6e 61 6c 20 70 61 72 61 6d 65 74 65 72  tional parameter
5c90: 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
5ca0: 20 65 44 65 73 74 20 2a 2f 0a 29 7b 0a 20 20 69   eDest */.){.  i
5cb0: 6e 74 20 62 72 6b 20 3d 20 73 71 6c 69 74 65 33  nt brk = sqlite3
5cc0: 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29  VdbeMakeLabel(v)
5cd0: 3b 0a 20 20 69 6e 74 20 63 6f 6e 74 20 3d 20 73  ;.  int cont = s
5ce0: 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61  qlite3VdbeMakeLa
5cf0: 62 65 6c 28 76 29 3b 0a 20 20 69 6e 74 20 61 64  bel(v);.  int ad
5d00: 64 72 3b 0a 20 20 69 6e 74 20 69 54 61 62 3b 0a  dr;.  int iTab;.
5d10: 20 20 69 6e 74 20 70 73 65 75 64 6f 54 61 62 20    int pseudoTab 
5d20: 3d 20 30 3b 0a 20 20 45 78 70 72 4c 69 73 74 20  = 0;.  ExprList 
5d30: 2a 70 4f 72 64 65 72 42 79 20 3d 20 70 2d 3e 70  *pOrderBy = p->p
5d40: 4f 72 64 65 72 42 79 3b 0a 0a 20 20 69 54 61 62  OrderBy;..  iTab
5d50: 20 3d 20 70 4f 72 64 65 72 42 79 2d 3e 69 45 43   = pOrderBy->iEC
5d60: 75 72 73 6f 72 3b 0a 20 20 69 66 28 20 65 44 65  ursor;.  if( eDe
5d70: 73 74 3d 3d 53 52 54 5f 43 61 6c 6c 62 61 63 6b  st==SRT_Callback
5d80: 20 7c 7c 20 65 44 65 73 74 3d 3d 53 52 54 5f 53   || eDest==SRT_S
5d90: 75 62 72 6f 75 74 69 6e 65 20 29 7b 0a 20 20 20  ubroutine ){.   
5da0: 20 70 73 65 75 64 6f 54 61 62 20 3d 20 70 50 61   pseudoTab = pPa
5db0: 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20  rse->nTab++;.   
5dc0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
5dd0: 70 28 76 2c 20 4f 50 5f 4f 70 65 6e 50 73 65 75  p(v, OP_OpenPseu
5de0: 64 6f 2c 20 70 73 65 75 64 6f 54 61 62 2c 20 30  do, pseudoTab, 0
5df0: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
5e00: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 53 65  beAddOp(v, OP_Se
5e10: 74 4e 75 6d 43 6f 6c 75 6d 6e 73 2c 20 70 73 65  tNumColumns, pse
5e20: 75 64 6f 54 61 62 2c 20 6e 43 6f 6c 75 6d 6e 29  udoTab, nColumn)
5e30: 3b 0a 20 20 7d 0a 20 20 61 64 64 72 20 3d 20 31  ;.  }.  addr = 1
5e40: 20 2b 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   + sqlite3VdbeAd
5e50: 64 4f 70 28 76 2c 20 4f 50 5f 53 6f 72 74 2c 20  dOp(v, OP_Sort, 
5e60: 69 54 61 62 2c 20 62 72 6b 29 3b 0a 20 20 63 6f  iTab, brk);.  co
5e70: 64 65 4f 66 66 73 65 74 28 76 2c 20 70 2c 20 63  deOffset(v, p, c
5e80: 6f 6e 74 2c 20 30 29 3b 0a 20 20 69 66 28 20 65  ont, 0);.  if( e
5e90: 44 65 73 74 3d 3d 53 52 54 5f 43 61 6c 6c 62 61  Dest==SRT_Callba
5ea0: 63 6b 20 7c 7c 20 65 44 65 73 74 3d 3d 53 52 54  ck || eDest==SRT
5eb0: 5f 53 75 62 72 6f 75 74 69 6e 65 20 29 7b 0a 20  _Subroutine ){. 
5ec0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
5ed0: 64 4f 70 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65  dOp(v, OP_Intege
5ee0: 72 2c 20 31 2c 20 30 29 3b 0a 20 20 7d 0a 20 20  r, 1, 0);.  }.  
5ef0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
5f00: 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 69  (v, OP_Column, i
5f10: 54 61 62 2c 20 70 4f 72 64 65 72 42 79 2d 3e 6e  Tab, pOrderBy->n
5f20: 45 78 70 72 20 2b 20 31 29 3b 0a 20 20 73 77 69  Expr + 1);.  swi
5f30: 74 63 68 28 20 65 44 65 73 74 20 29 7b 0a 20 20  tch( eDest ){.  
5f40: 20 20 63 61 73 65 20 53 52 54 5f 54 61 62 6c 65    case SRT_Table
5f50: 3a 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f 45  :.    case SRT_E
5f60: 70 68 65 6d 54 61 62 3a 20 7b 0a 20 20 20 20 20  phemTab: {.     
5f70: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
5f80: 70 28 76 2c 20 4f 50 5f 4e 65 77 52 6f 77 69 64  p(v, OP_NewRowid
5f90: 2c 20 69 50 61 72 6d 2c 20 30 29 3b 0a 20 20 20  , iParm, 0);.   
5fa0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
5fb0: 64 4f 70 28 76 2c 20 4f 50 5f 50 75 6c 6c 2c 20  dOp(v, OP_Pull, 
5fc0: 31 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c  1, 0);.      sql
5fd0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
5fe0: 20 4f 50 5f 49 6e 73 65 72 74 2c 20 69 50 61 72   OP_Insert, iPar
5ff0: 6d 2c 20 4f 50 46 4c 41 47 5f 41 50 50 45 4e 44  m, OPFLAG_APPEND
6000: 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
6010: 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51      }.#ifndef SQ
6020: 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45  LITE_OMIT_SUBQUE
6030: 52 59 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f  RY.    case SRT_
6040: 53 65 74 3a 20 7b 0a 20 20 20 20 20 20 61 73 73  Set: {.      ass
6050: 65 72 74 28 20 6e 43 6f 6c 75 6d 6e 3d 3d 31 20  ert( nColumn==1 
6060: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
6070: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
6080: 4e 6f 74 4e 75 6c 6c 2c 20 2d 31 2c 20 73 71 6c  NotNull, -1, sql
6090: 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41  ite3VdbeCurrentA
60a0: 64 64 72 28 76 29 2b 33 29 3b 0a 20 20 20 20 20  ddr(v)+3);.     
60b0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
60c0: 70 28 76 2c 20 4f 50 5f 50 6f 70 2c 20 31 2c 20  p(v, OP_Pop, 1, 
60d0: 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  0);.      sqlite
60e0: 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
60f0: 5f 47 6f 74 6f 2c 20 30 2c 20 73 71 6c 69 74 65  _Goto, 0, sqlite
6100: 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72  3VdbeCurrentAddr
6110: 28 76 29 2b 33 29 3b 0a 20 20 20 20 20 20 73 71  (v)+3);.      sq
6120: 6c 69 74 65 33 56 64 62 65 4f 70 33 28 76 2c 20  lite3VdbeOp3(v, 
6130: 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20 31  OP_MakeRecord, 1
6140: 2c 20 30 2c 20 26 70 2d 3e 61 66 66 69 6e 69 74  , 0, &p->affinit
6150: 79 2c 20 31 29 3b 0a 20 20 20 20 20 20 73 71 6c  y, 1);.      sql
6160: 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
6170: 20 4f 50 5f 49 64 78 49 6e 73 65 72 74 2c 20 28   OP_IdxInsert, (
6180: 69 50 61 72 6d 26 30 78 30 30 30 30 46 46 46 46  iParm&0x0000FFFF
6190: 29 2c 20 30 29 3b 0a 20 20 20 20 20 20 62 72 65  ), 0);.      bre
61a0: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
61b0: 73 65 20 53 52 54 5f 4d 65 6d 3a 20 7b 0a 20 20  se SRT_Mem: {.  
61c0: 20 20 20 20 61 73 73 65 72 74 28 20 6e 43 6f 6c      assert( nCol
61d0: 75 6d 6e 3d 3d 31 20 29 3b 0a 20 20 20 20 20 20  umn==1 );.      
61e0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
61f0: 28 76 2c 20 4f 50 5f 4d 65 6d 53 74 6f 72 65 2c  (v, OP_MemStore,
6200: 20 69 50 61 72 6d 2c 20 31 29 3b 0a 20 20 20 20   iParm, 1);.    
6210: 20 20 2f 2a 20 54 68 65 20 4c 49 4d 49 54 20 63    /* The LIMIT c
6220: 6c 61 75 73 65 20 77 69 6c 6c 20 74 65 72 6d 69  lause will termi
6230: 6e 61 74 65 20 74 68 65 20 6c 6f 6f 70 20 66 6f  nate the loop fo
6240: 72 20 75 73 20 2a 2f 0a 20 20 20 20 20 20 62 72  r us */.      br
6250: 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69  eak;.    }.#endi
6260: 66 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f 43  f.    case SRT_C
6270: 61 6c 6c 62 61 63 6b 3a 0a 20 20 20 20 63 61 73  allback:.    cas
6280: 65 20 53 52 54 5f 53 75 62 72 6f 75 74 69 6e 65  e SRT_Subroutine
6290: 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 3b  : {.      int i;
62a0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
62b0: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49 6e  beAddOp(v, OP_In
62c0: 73 65 72 74 2c 20 70 73 65 75 64 6f 54 61 62 2c  sert, pseudoTab,
62d0: 20 30 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 69   0);.      for(i
62e0: 3d 30 3b 20 69 3c 6e 43 6f 6c 75 6d 6e 3b 20 69  =0; i<nColumn; i
62f0: 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  ++){.        sql
6300: 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
6310: 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 70 73 65 75   OP_Column, pseu
6320: 64 6f 54 61 62 2c 20 69 29 3b 0a 20 20 20 20 20  doTab, i);.     
6330: 20 7d 0a 20 20 20 20 20 20 69 66 28 20 65 44 65   }.      if( eDe
6340: 73 74 3d 3d 53 52 54 5f 43 61 6c 6c 62 61 63 6b  st==SRT_Callback
6350: 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
6360: 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
6370: 4f 50 5f 43 61 6c 6c 62 61 63 6b 2c 20 6e 43 6f  OP_Callback, nCo
6380: 6c 75 6d 6e 2c 20 30 29 3b 0a 20 20 20 20 20 20  lumn, 0);.      
6390: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73  }else{.        s
63a0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
63b0: 76 2c 20 4f 50 5f 47 6f 73 75 62 2c 20 30 2c 20  v, OP_Gosub, 0, 
63c0: 69 50 61 72 6d 29 3b 0a 20 20 20 20 20 20 7d 0a  iParm);.      }.
63d0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
63e0: 20 7d 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20   }.    default: 
63f0: 7b 0a 20 20 20 20 20 20 2f 2a 20 44 6f 20 6e 6f  {.      /* Do no
6400: 74 68 69 6e 67 20 2a 2f 0a 20 20 20 20 20 20 62  thing */.      b
6410: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  reak;.    }.  }.
6420: 0a 20 20 2f 2a 20 4a 75 6d 70 20 74 6f 20 74 68  .  /* Jump to th
6430: 65 20 65 6e 64 20 6f 66 20 74 68 65 20 6c 6f 6f  e end of the loo
6440: 70 20 77 68 65 6e 20 74 68 65 20 4c 49 4d 49 54  p when the LIMIT
6450: 20 69 73 20 72 65 61 63 68 65 64 0a 20 20 2a 2f   is reached.  */
6460: 0a 20 20 69 66 28 20 70 2d 3e 69 4c 69 6d 69 74  .  if( p->iLimit
6470: 3e 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  >=0 ){.    sqlit
6480: 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
6490: 50 5f 4d 65 6d 49 6e 63 72 2c 20 2d 31 2c 20 70  P_MemIncr, -1, p
64a0: 2d 3e 69 4c 69 6d 69 74 29 3b 0a 20 20 20 20 73  ->iLimit);.    s
64b0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
64c0: 76 2c 20 4f 50 5f 49 66 4d 65 6d 5a 65 72 6f 2c  v, OP_IfMemZero,
64d0: 20 70 2d 3e 69 4c 69 6d 69 74 2c 20 62 72 6b 29   p->iLimit, brk)
64e0: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20  ;.  }..  /* The 
64f0: 62 6f 74 74 6f 6d 20 6f 66 20 74 68 65 20 6c 6f  bottom of the lo
6500: 6f 70 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65  op.  */.  sqlite
6510: 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65  3VdbeResolveLabe
6520: 6c 28 76 2c 20 63 6f 6e 74 29 3b 0a 20 20 73 71  l(v, cont);.  sq
6530: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
6540: 2c 20 4f 50 5f 4e 65 78 74 2c 20 69 54 61 62 2c  , OP_Next, iTab,
6550: 20 61 64 64 72 29 3b 0a 20 20 73 71 6c 69 74 65   addr);.  sqlite
6560: 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65  3VdbeResolveLabe
6570: 6c 28 76 2c 20 62 72 6b 29 3b 0a 20 20 69 66 28  l(v, brk);.  if(
6580: 20 65 44 65 73 74 3d 3d 53 52 54 5f 43 61 6c 6c   eDest==SRT_Call
6590: 62 61 63 6b 20 7c 7c 20 65 44 65 73 74 3d 3d 53  back || eDest==S
65a0: 52 54 5f 53 75 62 72 6f 75 74 69 6e 65 20 29 7b  RT_Subroutine ){
65b0: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
65c0: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 43 6c 6f 73  AddOp(v, OP_Clos
65d0: 65 2c 20 70 73 65 75 64 6f 54 61 62 2c 20 30 29  e, pseudoTab, 0)
65e0: 3b 0a 20 20 7d 0a 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  ;.  }..}../*.** 
65f0: 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72  Return a pointer
6600: 20 74 6f 20 61 20 73 74 72 69 6e 67 20 63 6f 6e   to a string con
6610: 74 61 69 6e 69 6e 67 20 74 68 65 20 27 64 65 63  taining the 'dec
6620: 6c 61 72 61 74 69 6f 6e 20 74 79 70 65 27 20 6f  laration type' o
6630: 66 20 74 68 65 0a 2a 2a 20 65 78 70 72 65 73 73  f the.** express
6640: 69 6f 6e 20 70 45 78 70 72 2e 20 54 68 65 20 73  ion pExpr. The s
6650: 74 72 69 6e 67 20 6d 61 79 20 62 65 20 74 72 65  tring may be tre
6660: 61 74 65 64 20 61 73 20 73 74 61 74 69 63 20 62  ated as static b
6670: 79 20 74 68 65 20 63 61 6c 6c 65 72 2e 0a 2a 2a  y the caller..**
6680: 0a 2a 2a 20 54 68 65 20 64 65 63 6c 61 72 61 74  .** The declarat
6690: 69 6f 6e 20 74 79 70 65 20 69 73 20 74 68 65 20  ion type is the 
66a0: 65 78 61 63 74 20 64 61 74 61 74 79 70 65 20 64  exact datatype d
66b0: 65 66 69 6e 69 74 69 6f 6e 20 65 78 74 72 61 63  efinition extrac
66c0: 74 65 64 20 66 72 6f 6d 20 74 68 65 0a 2a 2a 20  ted from the.** 
66d0: 6f 72 69 67 69 6e 61 6c 20 43 52 45 41 54 45 20  original CREATE 
66e0: 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 20  TABLE statement 
66f0: 69 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  if the expressio
6700: 6e 20 69 73 20 61 20 63 6f 6c 75 6d 6e 2e 20 54  n is a column. T
6710: 68 65 0a 2a 2a 20 64 65 63 6c 61 72 61 74 69 6f  he.** declaratio
6720: 6e 20 74 79 70 65 20 66 6f 72 20 61 20 52 4f 57  n type for a ROW
6730: 49 44 20 66 69 65 6c 64 20 69 73 20 49 4e 54 45  ID field is INTE
6740: 47 45 52 2e 20 45 78 61 63 74 6c 79 20 77 68 65  GER. Exactly whe
6750: 6e 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 0a  n an expression.
6760: 2a 2a 20 69 73 20 63 6f 6e 73 69 64 65 72 65 64  ** is considered
6770: 20 61 20 63 6f 6c 75 6d 6e 20 63 61 6e 20 62 65   a column can be
6780: 20 63 6f 6d 70 6c 65 78 20 69 6e 20 74 68 65 20   complex in the 
6790: 70 72 65 73 65 6e 63 65 20 6f 66 20 73 75 62 71  presence of subq
67a0: 75 65 72 69 65 73 2e 20 54 68 65 0a 2a 2a 20 72  ueries. The.** r
67b0: 65 73 75 6c 74 2d 73 65 74 20 65 78 70 72 65 73  esult-set expres
67c0: 73 69 6f 6e 20 69 6e 20 61 6c 6c 20 6f 66 20 74  sion in all of t
67d0: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 53 45 4c  he following SEL
67e0: 45 43 54 20 73 74 61 74 65 6d 65 6e 74 73 20 69  ECT statements i
67f0: 73 20 0a 2a 2a 20 63 6f 6e 73 69 64 65 72 65 64  s .** considered
6800: 20 61 20 63 6f 6c 75 6d 6e 20 62 79 20 74 68 69   a column by thi
6810: 73 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a  s function..**.*
6820: 2a 20 20 20 53 45 4c 45 43 54 20 63 6f 6c 20 46  *   SELECT col F
6830: 52 4f 4d 20 74 62 6c 3b 0a 2a 2a 20 20 20 53 45  ROM tbl;.**   SE
6840: 4c 45 43 54 20 28 53 45 4c 45 43 54 20 63 6f 6c  LECT (SELECT col
6850: 20 46 52 4f 4d 20 74 62 6c 3b 0a 2a 2a 20 20 20   FROM tbl;.**   
6860: 53 45 4c 45 43 54 20 28 53 45 4c 45 43 54 20 63  SELECT (SELECT c
6870: 6f 6c 20 46 52 4f 4d 20 74 62 6c 29 3b 0a 2a 2a  ol FROM tbl);.**
6880: 20 20 20 53 45 4c 45 43 54 20 61 62 63 20 46 52     SELECT abc FR
6890: 4f 4d 20 28 53 45 4c 45 43 54 20 63 6f 6c 20 41  OM (SELECT col A
68a0: 53 20 61 62 63 20 46 52 4f 4d 20 74 62 6c 29 3b  S abc FROM tbl);
68b0: 0a 2a 2a 20 0a 2a 2a 20 54 68 65 20 64 65 63 6c  .** .** The decl
68c0: 61 72 61 74 69 6f 6e 20 74 79 70 65 20 66 6f 72  aration type for
68d0: 20 61 6e 79 20 65 78 70 72 65 73 73 69 6f 6e 20   any expression 
68e0: 6f 74 68 65 72 20 74 68 61 6e 20 61 20 63 6f 6c  other than a col
68f0: 75 6d 6e 20 69 73 20 4e 55 4c 4c 2e 0a 2a 2f 0a  umn is NULL..*/.
6900: 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61  static const cha
6910: 72 20 2a 63 6f 6c 75 6d 6e 54 79 70 65 28 0a 20  r *columnType(. 
6920: 20 4e 61 6d 65 43 6f 6e 74 65 78 74 20 2a 70 4e   NameContext *pN
6930: 43 2c 20 0a 20 20 45 78 70 72 20 2a 70 45 78 70  C, .  Expr *pExp
6940: 72 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  r,.  const char 
6950: 2a 2a 70 7a 4f 72 69 67 69 6e 44 62 2c 0a 20 20  **pzOriginDb,.  
6960: 63 6f 6e 73 74 20 63 68 61 72 20 2a 2a 70 7a 4f  const char **pzO
6970: 72 69 67 69 6e 54 61 62 2c 0a 20 20 63 6f 6e 73  riginTab,.  cons
6980: 74 20 63 68 61 72 20 2a 2a 70 7a 4f 72 69 67 69  t char **pzOrigi
6990: 6e 43 6f 6c 0a 29 7b 0a 20 20 63 68 61 72 20 63  nCol.){.  char c
69a0: 6f 6e 73 74 20 2a 7a 54 79 70 65 20 3d 20 30 3b  onst *zType = 0;
69b0: 0a 20 20 63 68 61 72 20 63 6f 6e 73 74 20 2a 7a  .  char const *z
69c0: 4f 72 69 67 69 6e 44 62 20 3d 20 30 3b 0a 20 20  OriginDb = 0;.  
69d0: 63 68 61 72 20 63 6f 6e 73 74 20 2a 7a 4f 72 69  char const *zOri
69e0: 67 69 6e 54 61 62 20 3d 20 30 3b 0a 20 20 63 68  ginTab = 0;.  ch
69f0: 61 72 20 63 6f 6e 73 74 20 2a 7a 4f 72 69 67 69  ar const *zOrigi
6a00: 6e 43 6f 6c 20 3d 20 30 3b 0a 20 20 69 6e 74 20  nCol = 0;.  int 
6a10: 6a 3b 0a 20 20 69 66 28 20 70 45 78 70 72 3d 3d  j;.  if( pExpr==
6a20: 30 20 7c 7c 20 70 4e 43 2d 3e 70 53 72 63 4c 69  0 || pNC->pSrcLi
6a30: 73 74 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30  st==0 ) return 0
6a40: 3b 0a 0a 20 20 73 77 69 74 63 68 28 20 70 45 78  ;..  switch( pEx
6a50: 70 72 2d 3e 6f 70 20 29 7b 0a 20 20 20 20 63 61  pr->op ){.    ca
6a60: 73 65 20 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e  se TK_AGG_COLUMN
6a70: 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 43 4f  :.    case TK_CO
6a80: 4c 55 4d 4e 3a 20 7b 0a 20 20 20 20 20 20 2f 2a  LUMN: {.      /*
6a90: 20 54 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   The expression 
6aa0: 69 73 20 61 20 63 6f 6c 75 6d 6e 2e 20 4c 6f 63  is a column. Loc
6ab0: 61 74 65 20 74 68 65 20 74 61 62 6c 65 20 74 68  ate the table th
6ac0: 65 20 63 6f 6c 75 6d 6e 20 69 73 20 62 65 69 6e  e column is bein
6ad0: 67 0a 20 20 20 20 20 20 2a 2a 20 65 78 74 72 61  g.      ** extra
6ae0: 63 74 65 64 20 66 72 6f 6d 20 69 6e 20 4e 61 6d  cted from in Nam
6af0: 65 43 6f 6e 74 65 78 74 2e 70 53 72 63 4c 69 73  eContext.pSrcLis
6b00: 74 2e 20 54 68 69 73 20 74 61 62 6c 65 20 6d 61  t. This table ma
6b10: 79 20 62 65 20 72 65 61 6c 0a 20 20 20 20 20 20  y be real.      
6b20: 2a 2a 20 64 61 74 61 62 61 73 65 20 74 61 62 6c  ** database tabl
6b30: 65 20 6f 72 20 61 20 73 75 62 71 75 65 72 79 2e  e or a subquery.
6b40: 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
6b50: 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 30 3b  Table *pTab = 0;
6b60: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
6b70: 61 62 6c 65 20 73 74 72 75 63 74 75 72 65 20 63  able structure c
6b80: 6f 6c 75 6d 6e 20 69 73 20 65 78 74 72 61 63 74  olumn is extract
6b90: 65 64 20 66 72 6f 6d 20 2a 2f 0a 20 20 20 20 20  ed from */.     
6ba0: 20 53 65 6c 65 63 74 20 2a 70 53 20 3d 20 30 3b   Select *pS = 0;
6bb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
6bc0: 53 65 6c 65 63 74 20 74 68 65 20 63 6f 6c 75 6d  Select the colum
6bd0: 6e 20 69 73 20 65 78 74 72 61 63 74 65 64 20 66  n is extracted f
6be0: 72 6f 6d 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74  rom */.      int
6bf0: 20 69 43 6f 6c 20 3d 20 70 45 78 70 72 2d 3e 69   iCol = pExpr->i
6c00: 43 6f 6c 75 6d 6e 3b 20 20 2f 2a 20 49 6e 64 65  Column;  /* Inde
6c10: 78 20 6f 66 20 63 6f 6c 75 6d 6e 20 69 6e 20 70  x of column in p
6c20: 54 61 62 20 2a 2f 0a 20 20 20 20 20 20 77 68 69  Tab */.      whi
6c30: 6c 65 28 20 70 4e 43 20 26 26 20 21 70 54 61 62  le( pNC && !pTab
6c40: 20 29 7b 0a 20 20 20 20 20 20 20 20 53 72 63 4c   ){.        SrcL
6c50: 69 73 74 20 2a 70 54 61 62 4c 69 73 74 20 3d 20  ist *pTabList = 
6c60: 70 4e 43 2d 3e 70 53 72 63 4c 69 73 74 3b 0a 20  pNC->pSrcList;. 
6c70: 20 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 6a         for(j=0;j
6c80: 3c 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 20  <pTabList->nSrc 
6c90: 26 26 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 6a  && pTabList->a[j
6ca0: 5d 2e 69 43 75 72 73 6f 72 21 3d 70 45 78 70 72  ].iCursor!=pExpr
6cb0: 2d 3e 69 54 61 62 6c 65 3b 6a 2b 2b 29 3b 0a 20  ->iTable;j++);. 
6cc0: 20 20 20 20 20 20 20 69 66 28 20 6a 3c 70 54 61         if( j<pTa
6cd0: 62 4c 69 73 74 2d 3e 6e 53 72 63 20 29 7b 0a 20  bList->nSrc ){. 
6ce0: 20 20 20 20 20 20 20 20 20 70 54 61 62 20 3d 20           pTab = 
6cf0: 70 54 61 62 4c 69 73 74 2d 3e 61 5b 6a 5d 2e 70  pTabList->a[j].p
6d00: 54 61 62 3b 0a 20 20 20 20 20 20 20 20 20 20 70  Tab;.          p
6d10: 53 20 3d 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b  S = pTabList->a[
6d20: 6a 5d 2e 70 53 65 6c 65 63 74 3b 0a 20 20 20 20  j].pSelect;.    
6d30: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
6d40: 20 20 20 20 20 70 4e 43 20 3d 20 70 4e 43 2d 3e       pNC = pNC->
6d50: 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 20 20 7d  pNext;.        }
6d60: 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20  .      }..      
6d70: 69 66 28 20 70 54 61 62 3d 3d 30 20 29 7b 0a 20  if( pTab==0 ){. 
6d80: 20 20 20 20 20 20 20 2f 2a 20 46 49 58 20 4d 45         /* FIX ME
6d90: 3a 0a 20 20 20 20 20 20 20 20 2a 2a 20 54 68 69  :.        ** Thi
6da0: 73 20 63 61 6e 20 6f 63 63 75 72 73 20 69 66 20  s can occurs if 
6db0: 79 6f 75 20 68 61 76 65 20 73 6f 6d 65 74 68 69  you have somethi
6dc0: 6e 67 20 6c 69 6b 65 20 22 53 45 4c 45 43 54 20  ng like "SELECT 
6dd0: 6e 65 77 2e 78 3b 22 20 69 6e 73 69 64 65 0a 20  new.x;" inside. 
6de0: 20 20 20 20 20 20 20 2a 2a 20 61 20 74 72 69 67         ** a trig
6df0: 67 65 72 2e 20 20 49 6e 20 6f 74 68 65 72 20 77  ger.  In other w
6e00: 6f 72 64 73 2c 20 69 66 20 79 6f 75 20 72 65 66  ords, if you ref
6e10: 65 72 65 6e 63 65 20 74 68 65 20 73 70 65 63 69  erence the speci
6e20: 61 6c 20 22 6e 65 77 22 0a 20 20 20 20 20 20 20  al "new".       
6e30: 20 2a 2a 20 74 61 62 6c 65 20 69 6e 20 74 68 65   ** table in the
6e40: 20 72 65 73 75 6c 74 20 73 65 74 20 6f 66 20 61   result set of a
6e50: 20 73 65 6c 65 63 74 2e 20 20 57 65 20 64 6f 20   select.  We do 
6e60: 6e 6f 74 20 68 61 76 65 20 61 20 67 6f 6f 64 20  not have a good 
6e70: 77 61 79 0a 20 20 20 20 20 20 20 20 2a 2a 20 74  way.        ** t
6e80: 6f 20 66 69 6e 64 20 74 68 65 20 61 63 74 75 61  o find the actua
6e90: 6c 20 74 61 62 6c 65 20 74 79 70 65 2c 20 73 6f  l table type, so
6ea0: 20 63 61 6c 6c 20 69 74 20 22 54 45 58 54 22 2e   call it "TEXT".
6eb0: 20 20 54 68 69 73 20 69 73 20 72 65 61 6c 6c 79    This is really
6ec0: 0a 20 20 20 20 20 20 20 20 2a 2a 20 73 6f 6d 65  .        ** some
6ed0: 74 68 69 6e 67 20 6f 66 20 61 20 62 75 67 2c 20  thing of a bug, 
6ee0: 62 75 74 20 49 20 64 6f 20 6e 6f 74 20 6b 6e 6f  but I do not kno
6ef0: 77 20 68 6f 77 20 74 6f 20 66 69 78 20 69 74 2e  w how to fix it.
6f00: 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20  .        **.    
6f10: 20 20 20 20 2a 2a 20 54 68 69 73 20 63 6f 64 65      ** This code
6f20: 20 64 6f 65 73 20 6e 6f 74 20 70 72 6f 64 75 63   does not produc
6f30: 65 20 74 68 65 20 63 6f 72 72 65 63 74 20 61 6e  e the correct an
6f40: 73 77 65 72 20 2d 20 69 74 20 6a 75 73 74 20 70  swer - it just p
6f50: 72 65 76 65 6e 74 73 0a 20 20 20 20 20 20 20 20  revents.        
6f60: 2a 2a 20 61 20 73 65 67 66 61 75 6c 74 2e 20 20  ** a segfault.  
6f70: 53 65 65 20 74 69 63 6b 65 74 20 23 31 32 32 39  See ticket #1229
6f80: 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20  ..        */.   
6f90: 20 20 20 20 20 7a 54 79 70 65 20 3d 20 22 54 45       zType = "TE
6fa0: 58 54 22 3b 0a 20 20 20 20 20 20 20 20 62 72 65  XT";.        bre
6fb0: 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20  ak;.      }..   
6fc0: 20 20 20 61 73 73 65 72 74 28 20 70 54 61 62 20     assert( pTab 
6fd0: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 53 20  );.      if( pS 
6fe0: 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68  ){.        /* Th
6ff0: 65 20 22 74 61 62 6c 65 22 20 69 73 20 61 63 74  e "table" is act
7000: 75 61 6c 6c 79 20 61 20 73 75 62 2d 73 65 6c 65  ually a sub-sele
7010: 63 74 20 6f 72 20 61 20 76 69 65 77 20 69 6e 20  ct or a view in 
7020: 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 0a  the FROM clause.
7030: 20 20 20 20 20 20 20 20 2a 2a 20 6f 66 20 74 68          ** of th
7040: 65 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  e SELECT stateme
7050: 6e 74 2e 20 52 65 74 75 72 6e 20 74 68 65 20 64  nt. Return the d
7060: 65 63 6c 61 72 61 74 69 6f 6e 20 74 79 70 65 20  eclaration type 
7070: 61 6e 64 20 6f 72 69 67 69 6e 0a 20 20 20 20 20  and origin.     
7080: 20 20 20 2a 2a 20 64 61 74 61 20 66 6f 72 20 74     ** data for t
7090: 68 65 20 72 65 73 75 6c 74 2d 73 65 74 20 63 6f  he result-set co
70a0: 6c 75 6d 6e 20 6f 66 20 74 68 65 20 73 75 62 2d  lumn of the sub-
70b0: 73 65 6c 65 63 74 2e 0a 20 20 20 20 20 20 20 20  select..        
70c0: 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20 69  */.        if( i
70d0: 43 6f 6c 3e 3d 30 20 26 26 20 69 43 6f 6c 3c 70  Col>=0 && iCol<p
70e0: 53 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72  S->pEList->nExpr
70f0: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a   ){.          /*
7100: 20 49 66 20 69 43 6f 6c 20 69 73 20 6c 65 73 73   If iCol is less
7110: 20 74 68 61 6e 20 7a 65 72 6f 2c 20 74 68 65 6e   than zero, then
7120: 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   the expression 
7130: 72 65 71 75 65 73 74 73 20 74 68 65 0a 20 20 20  requests the.   
7140: 20 20 20 20 20 20 20 2a 2a 20 72 6f 77 69 64 20         ** rowid 
7150: 6f 66 20 74 68 65 20 73 75 62 2d 73 65 6c 65 63  of the sub-selec
7160: 74 20 6f 72 20 76 69 65 77 2e 20 54 68 69 73 20  t or view. This 
7170: 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 6c 65  expression is le
7180: 67 61 6c 20 28 73 65 65 20 0a 20 20 20 20 20 20  gal (see .      
7190: 20 20 20 20 2a 2a 20 74 65 73 74 20 63 61 73 65      ** test case
71a0: 20 6d 69 73 63 32 2e 32 2e 32 29 20 2d 20 69 74   misc2.2.2) - it
71b0: 20 61 6c 77 61 79 73 20 65 76 61 6c 75 61 74 65   always evaluate
71c0: 73 20 74 6f 20 4e 55 4c 4c 2e 0a 20 20 20 20 20  s to NULL..     
71d0: 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
71e0: 20 20 4e 61 6d 65 43 6f 6e 74 65 78 74 20 73 4e    NameContext sN
71f0: 43 3b 0a 20 20 20 20 20 20 20 20 20 20 45 78 70  C;.          Exp
7200: 72 20 2a 70 20 3d 20 70 53 2d 3e 70 45 4c 69 73  r *p = pS->pELis
7210: 74 2d 3e 61 5b 69 43 6f 6c 5d 2e 70 45 78 70 72  t->a[iCol].pExpr
7220: 3b 0a 20 20 20 20 20 20 20 20 20 20 73 4e 43 2e  ;.          sNC.
7230: 70 53 72 63 4c 69 73 74 20 3d 20 70 53 2d 3e 70  pSrcList = pS->p
7240: 53 72 63 3b 0a 20 20 20 20 20 20 20 20 20 20 73  Src;.          s
7250: 4e 43 2e 70 4e 65 78 74 20 3d 20 30 3b 0a 20 20  NC.pNext = 0;.  
7260: 20 20 20 20 20 20 20 20 73 4e 43 2e 70 50 61 72          sNC.pPar
7270: 73 65 20 3d 20 70 4e 43 2d 3e 70 50 61 72 73 65  se = pNC->pParse
7280: 3b 0a 20 20 20 20 20 20 20 20 20 20 7a 54 79 70  ;.          zTyp
7290: 65 20 3d 20 63 6f 6c 75 6d 6e 54 79 70 65 28 26  e = columnType(&
72a0: 73 4e 43 2c 20 70 2c 20 26 7a 4f 72 69 67 69 6e  sNC, p, &zOrigin
72b0: 44 62 2c 20 26 7a 4f 72 69 67 69 6e 54 61 62 2c  Db, &zOriginTab,
72c0: 20 26 7a 4f 72 69 67 69 6e 43 6f 6c 29 3b 20 0a   &zOriginCol); .
72d0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
72e0: 7d 65 6c 73 65 20 69 66 28 20 70 54 61 62 2d 3e  }else if( pTab->
72f0: 70 53 63 68 65 6d 61 20 29 7b 0a 20 20 20 20 20  pSchema ){.     
7300: 20 20 20 2f 2a 20 41 20 72 65 61 6c 20 74 61 62     /* A real tab
7310: 6c 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 61 73  le */.        as
7320: 73 65 72 74 28 20 21 70 53 20 29 3b 0a 20 20 20  sert( !pS );.   
7330: 20 20 20 20 20 69 66 28 20 69 43 6f 6c 3c 30 20       if( iCol<0 
7340: 29 20 69 43 6f 6c 20 3d 20 70 54 61 62 2d 3e 69  ) iCol = pTab->i
7350: 50 4b 65 79 3b 0a 20 20 20 20 20 20 20 20 61 73  PKey;.        as
7360: 73 65 72 74 28 20 69 43 6f 6c 3d 3d 2d 31 20 7c  sert( iCol==-1 |
7370: 7c 20 28 69 43 6f 6c 3e 3d 30 20 26 26 20 69 43  | (iCol>=0 && iC
7380: 6f 6c 3c 70 54 61 62 2d 3e 6e 43 6f 6c 29 20 29  ol<pTab->nCol) )
7390: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 69 43  ;.        if( iC
73a0: 6f 6c 3c 30 20 29 7b 0a 20 20 20 20 20 20 20 20  ol<0 ){.        
73b0: 20 20 7a 54 79 70 65 20 3d 20 22 49 4e 54 45 47    zType = "INTEG
73c0: 45 52 22 3b 0a 20 20 20 20 20 20 20 20 20 20 7a  ER";.          z
73d0: 4f 72 69 67 69 6e 43 6f 6c 20 3d 20 22 72 6f 77  OriginCol = "row
73e0: 69 64 22 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  id";.        }el
73f0: 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 7a 54  se{.          zT
7400: 79 70 65 20 3d 20 70 54 61 62 2d 3e 61 43 6f 6c  ype = pTab->aCol
7410: 5b 69 43 6f 6c 5d 2e 7a 54 79 70 65 3b 0a 20 20  [iCol].zType;.  
7420: 20 20 20 20 20 20 20 20 7a 4f 72 69 67 69 6e 43          zOriginC
7430: 6f 6c 20 3d 20 70 54 61 62 2d 3e 61 43 6f 6c 5b  ol = pTab->aCol[
7440: 69 43 6f 6c 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20  iCol].zName;.   
7450: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7a       }.        z
7460: 4f 72 69 67 69 6e 54 61 62 20 3d 20 70 54 61 62  OriginTab = pTab
7470: 2d 3e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20 20  ->zName;.       
7480: 20 69 66 28 20 70 4e 43 2d 3e 70 50 61 72 73 65   if( pNC->pParse
7490: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 6e   ){.          in
74a0: 74 20 69 44 62 20 3d 20 73 71 6c 69 74 65 33 53  t iDb = sqlite3S
74b0: 63 68 65 6d 61 54 6f 49 6e 64 65 78 28 70 4e 43  chemaToIndex(pNC
74c0: 2d 3e 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 54  ->pParse->db, pT
74d0: 61 62 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20  ab->pSchema);.  
74e0: 20 20 20 20 20 20 20 20 7a 4f 72 69 67 69 6e 44          zOriginD
74f0: 62 20 3d 20 70 4e 43 2d 3e 70 50 61 72 73 65 2d  b = pNC->pParse-
7500: 3e 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a 4e  >db->aDb[iDb].zN
7510: 61 6d 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  ame;.        }. 
7520: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65       }.      bre
7530: 61 6b 3b 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65  ak;.    }.#ifnde
7540: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55  f SQLITE_OMIT_SU
7550: 42 51 55 45 52 59 0a 20 20 20 20 63 61 73 65 20  BQUERY.    case 
7560: 54 4b 5f 53 45 4c 45 43 54 3a 20 7b 0a 20 20 20  TK_SELECT: {.   
7570: 20 20 20 2f 2a 20 54 68 65 20 65 78 70 72 65 73     /* The expres
7580: 73 69 6f 6e 20 69 73 20 61 20 73 75 62 2d 73 65  sion is a sub-se
7590: 6c 65 63 74 2e 20 52 65 74 75 72 6e 20 74 68 65  lect. Return the
75a0: 20 64 65 63 6c 61 72 61 74 69 6f 6e 20 74 79 70   declaration typ
75b0: 65 20 61 6e 64 0a 20 20 20 20 20 20 2a 2a 20 6f  e and.      ** o
75c0: 72 69 67 69 6e 20 69 6e 66 6f 20 66 6f 72 20 74  rigin info for t
75d0: 68 65 20 73 69 6e 67 6c 65 20 63 6f 6c 75 6d 6e  he single column
75e0: 20 69 6e 20 74 68 65 20 72 65 73 75 6c 74 20 73   in the result s
75f0: 65 74 20 6f 66 20 74 68 65 20 53 45 4c 45 43 54  et of the SELECT
7600: 0a 20 20 20 20 20 20 2a 2a 20 73 74 61 74 65 6d  .      ** statem
7610: 65 6e 74 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  ent..      */.  
7620: 20 20 20 20 4e 61 6d 65 43 6f 6e 74 65 78 74 20      NameContext 
7630: 73 4e 43 3b 0a 20 20 20 20 20 20 53 65 6c 65 63  sNC;.      Selec
7640: 74 20 2a 70 53 20 3d 20 70 45 78 70 72 2d 3e 70  t *pS = pExpr->p
7650: 53 65 6c 65 63 74 3b 0a 20 20 20 20 20 20 45 78  Select;.      Ex
7660: 70 72 20 2a 70 20 3d 20 70 53 2d 3e 70 45 4c 69  pr *p = pS->pELi
7670: 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 3b 0a  st->a[0].pExpr;.
7680: 20 20 20 20 20 20 73 4e 43 2e 70 53 72 63 4c 69        sNC.pSrcLi
7690: 73 74 20 3d 20 70 53 2d 3e 70 53 72 63 3b 0a 20  st = pS->pSrc;. 
76a0: 20 20 20 20 20 73 4e 43 2e 70 4e 65 78 74 20 3d       sNC.pNext =
76b0: 20 70 4e 43 3b 0a 20 20 20 20 20 20 73 4e 43 2e   pNC;.      sNC.
76c0: 70 50 61 72 73 65 20 3d 20 70 4e 43 2d 3e 70 50  pParse = pNC->pP
76d0: 61 72 73 65 3b 0a 20 20 20 20 20 20 7a 54 79 70  arse;.      zTyp
76e0: 65 20 3d 20 63 6f 6c 75 6d 6e 54 79 70 65 28 26  e = columnType(&
76f0: 73 4e 43 2c 20 70 2c 20 26 7a 4f 72 69 67 69 6e  sNC, p, &zOrigin
7700: 44 62 2c 20 26 7a 4f 72 69 67 69 6e 54 61 62 2c  Db, &zOriginTab,
7710: 20 26 7a 4f 72 69 67 69 6e 43 6f 6c 29 3b 20 0a   &zOriginCol); .
7720: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
7730: 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 20 20   }.#endif.  }.  
7740: 0a 20 20 69 66 28 20 70 7a 4f 72 69 67 69 6e 44  .  if( pzOriginD
7750: 62 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  b ){.    assert(
7760: 20 70 7a 4f 72 69 67 69 6e 54 61 62 20 26 26 20   pzOriginTab && 
7770: 70 7a 4f 72 69 67 69 6e 43 6f 6c 20 29 3b 0a 20  pzOriginCol );. 
7780: 20 20 20 2a 70 7a 4f 72 69 67 69 6e 44 62 20 3d     *pzOriginDb =
7790: 20 7a 4f 72 69 67 69 6e 44 62 3b 0a 20 20 20 20   zOriginDb;.    
77a0: 2a 70 7a 4f 72 69 67 69 6e 54 61 62 20 3d 20 7a  *pzOriginTab = z
77b0: 4f 72 69 67 69 6e 54 61 62 3b 0a 20 20 20 20 2a  OriginTab;.    *
77c0: 70 7a 4f 72 69 67 69 6e 43 6f 6c 20 3d 20 7a 4f  pzOriginCol = zO
77d0: 72 69 67 69 6e 43 6f 6c 3b 0a 20 20 7d 0a 20 20  riginCol;.  }.  
77e0: 72 65 74 75 72 6e 20 7a 54 79 70 65 3b 0a 7d 0a  return zType;.}.
77f0: 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20  ./*.** Generate 
7800: 63 6f 64 65 20 74 68 61 74 20 77 69 6c 6c 20 74  code that will t
7810: 65 6c 6c 20 74 68 65 20 56 44 42 45 20 74 68 65  ell the VDBE the
7820: 20 64 65 63 6c 61 72 61 74 69 6f 6e 20 74 79 70   declaration typ
7830: 65 73 20 6f 66 20 63 6f 6c 75 6d 6e 73 0a 2a 2a  es of columns.**
7840: 20 69 6e 20 74 68 65 20 72 65 73 75 6c 74 20 73   in the result s
7850: 65 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  et..*/.static vo
7860: 69 64 20 67 65 6e 65 72 61 74 65 43 6f 6c 75 6d  id generateColum
7870: 6e 54 79 70 65 73 28 0a 20 20 50 61 72 73 65 20  nTypes(.  Parse 
7880: 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 2f 2a  *pParse,      /*
7890: 20 50 61 72 73 65 72 20 63 6f 6e 74 65 78 74 20   Parser context 
78a0: 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 54  */.  SrcList *pT
78b0: 61 62 4c 69 73 74 2c 20 20 2f 2a 20 4c 69 73 74  abList,  /* List
78c0: 20 6f 66 20 74 61 62 6c 65 73 20 2a 2f 0a 20 20   of tables */.  
78d0: 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74  ExprList *pEList
78e0: 20 20 20 20 2f 2a 20 45 78 70 72 65 73 73 69 6f      /* Expressio
78f0: 6e 73 20 64 65 66 69 6e 69 6e 67 20 74 68 65 20  ns defining the 
7900: 72 65 73 75 6c 74 20 73 65 74 20 2a 2f 0a 29 7b  result set */.){
7910: 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61  .  Vdbe *v = pPa
7920: 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e  rse->pVdbe;.  in
7930: 74 20 69 3b 0a 20 20 4e 61 6d 65 43 6f 6e 74 65  t i;.  NameConte
7940: 78 74 20 73 4e 43 3b 0a 20 20 73 4e 43 2e 70 53  xt sNC;.  sNC.pS
7950: 72 63 4c 69 73 74 20 3d 20 70 54 61 62 4c 69 73  rcList = pTabLis
7960: 74 3b 0a 20 20 73 4e 43 2e 70 50 61 72 73 65 20  t;.  sNC.pParse 
7970: 3d 20 70 50 61 72 73 65 3b 0a 20 20 66 6f 72 28  = pParse;.  for(
7980: 69 3d 30 3b 20 69 3c 70 45 4c 69 73 74 2d 3e 6e  i=0; i<pEList->n
7990: 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  Expr; i++){.    
79a0: 45 78 70 72 20 2a 70 20 3d 20 70 45 4c 69 73 74  Expr *p = pEList
79b0: 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20  ->a[i].pExpr;.  
79c0: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4f    const char *zO
79d0: 72 69 67 44 62 20 3d 20 30 3b 0a 20 20 20 20 63  rigDb = 0;.    c
79e0: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4f 72 69 67  onst char *zOrig
79f0: 54 61 62 20 3d 20 30 3b 0a 20 20 20 20 63 6f 6e  Tab = 0;.    con
7a00: 73 74 20 63 68 61 72 20 2a 7a 4f 72 69 67 43 6f  st char *zOrigCo
7a10: 6c 20 3d 20 30 3b 0a 20 20 20 20 63 6f 6e 73 74  l = 0;.    const
7a20: 20 63 68 61 72 20 2a 7a 54 79 70 65 20 3d 20 63   char *zType = c
7a30: 6f 6c 75 6d 6e 54 79 70 65 28 26 73 4e 43 2c 20  olumnType(&sNC, 
7a40: 70 2c 20 26 7a 4f 72 69 67 44 62 2c 20 26 7a 4f  p, &zOrigDb, &zO
7a50: 72 69 67 54 61 62 2c 20 26 7a 4f 72 69 67 43 6f  rigTab, &zOrigCo
7a60: 6c 29 3b 0a 0a 20 20 20 20 2f 2a 20 54 68 65 20  l);..    /* The 
7a70: 76 64 62 65 20 6d 75 73 74 20 6d 61 6b 65 20 69  vdbe must make i
7a80: 74 27 73 20 6f 77 6e 20 63 6f 70 79 20 6f 66 20  t's own copy of 
7a90: 74 68 65 20 63 6f 6c 75 6d 6e 2d 74 79 70 65 20  the column-type 
7aa0: 61 6e 64 20 6f 74 68 65 72 20 0a 20 20 20 20 2a  and other .    *
7ab0: 2a 20 63 6f 6c 75 6d 6e 20 73 70 65 63 69 66 69  * column specifi
7ac0: 63 20 73 74 72 69 6e 67 73 2c 20 69 6e 20 63 61  c strings, in ca
7ad0: 73 65 20 74 68 65 20 73 63 68 65 6d 61 20 69 73  se the schema is
7ae0: 20 72 65 73 65 74 20 62 65 66 6f 72 65 20 74 68   reset before th
7af0: 69 73 0a 20 20 20 20 2a 2a 20 76 69 72 74 75 61  is.    ** virtua
7b00: 6c 20 6d 61 63 68 69 6e 65 20 69 73 20 64 65 6c  l machine is del
7b10: 65 74 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  eted..    */.   
7b20: 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 74 43   sqlite3VdbeSetC
7b30: 6f 6c 4e 61 6d 65 28 76 2c 20 69 2c 20 43 4f 4c  olName(v, i, COL
7b40: 4e 41 4d 45 5f 44 45 43 4c 54 59 50 45 2c 20 7a  NAME_DECLTYPE, z
7b50: 54 79 70 65 2c 20 50 33 5f 54 52 41 4e 53 49 45  Type, P3_TRANSIE
7b60: 4e 54 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  NT);.    sqlite3
7b70: 56 64 62 65 53 65 74 43 6f 6c 4e 61 6d 65 28 76  VdbeSetColName(v
7b80: 2c 20 69 2c 20 43 4f 4c 4e 41 4d 45 5f 44 41 54  , i, COLNAME_DAT
7b90: 41 42 41 53 45 2c 20 7a 4f 72 69 67 44 62 2c 20  ABASE, zOrigDb, 
7ba0: 50 33 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a 20  P3_TRANSIENT);. 
7bb0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 53 65     sqlite3VdbeSe
7bc0: 74 43 6f 6c 4e 61 6d 65 28 76 2c 20 69 2c 20 43  tColName(v, i, C
7bd0: 4f 4c 4e 41 4d 45 5f 54 41 42 4c 45 2c 20 7a 4f  OLNAME_TABLE, zO
7be0: 72 69 67 54 61 62 2c 20 50 33 5f 54 52 41 4e 53  rigTab, P3_TRANS
7bf0: 49 45 4e 54 29 3b 0a 20 20 20 20 73 71 6c 69 74  IENT);.    sqlit
7c00: 65 33 56 64 62 65 53 65 74 43 6f 6c 4e 61 6d 65  e3VdbeSetColName
7c10: 28 76 2c 20 69 2c 20 43 4f 4c 4e 41 4d 45 5f 43  (v, i, COLNAME_C
7c20: 4f 4c 55 4d 4e 2c 20 7a 4f 72 69 67 43 6f 6c 2c  OLUMN, zOrigCol,
7c30: 20 50 33 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a   P3_TRANSIENT);.
7c40: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e    }.}../*.** Gen
7c50: 65 72 61 74 65 20 63 6f 64 65 20 74 68 61 74 20  erate code that 
7c60: 77 69 6c 6c 20 74 65 6c 6c 20 74 68 65 20 56 44  will tell the VD
7c70: 42 45 20 74 68 65 20 6e 61 6d 65 73 20 6f 66 20  BE the names of 
7c80: 63 6f 6c 75 6d 6e 73 0a 2a 2a 20 69 6e 20 74 68  columns.** in th
7c90: 65 20 72 65 73 75 6c 74 20 73 65 74 2e 20 20 54  e result set.  T
7ca0: 68 69 73 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  his information 
7cb0: 69 73 20 75 73 65 64 20 74 6f 20 70 72 6f 76 69  is used to provi
7cc0: 64 65 20 74 68 65 0a 2a 2a 20 61 7a 43 6f 6c 5b  de the.** azCol[
7cd0: 5d 20 76 61 6c 75 65 73 20 69 6e 20 74 68 65 20  ] values in the 
7ce0: 63 61 6c 6c 62 61 63 6b 2e 0a 2a 2f 0a 73 74 61  callback..*/.sta
7cf0: 74 69 63 20 76 6f 69 64 20 67 65 6e 65 72 61 74  tic void generat
7d00: 65 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 0a 20 20  eColumnNames(.  
7d10: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
7d20: 20 20 20 20 2f 2a 20 50 61 72 73 65 72 20 63 6f      /* Parser co
7d30: 6e 74 65 78 74 20 2a 2f 0a 20 20 53 72 63 4c 69  ntext */.  SrcLi
7d40: 73 74 20 2a 70 54 61 62 4c 69 73 74 2c 20 20 2f  st *pTabList,  /
7d50: 2a 20 4c 69 73 74 20 6f 66 20 74 61 62 6c 65 73  * List of tables
7d60: 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a   */.  ExprList *
7d70: 70 45 4c 69 73 74 20 20 20 20 2f 2a 20 45 78 70  pEList    /* Exp
7d80: 72 65 73 73 69 6f 6e 73 20 64 65 66 69 6e 69 6e  ressions definin
7d90: 67 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74  g the result set
7da0: 20 2a 2f 0a 29 7b 0a 20 20 56 64 62 65 20 2a 76   */.){.  Vdbe *v
7db0: 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65   = pParse->pVdbe
7dc0: 3b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20  ;.  int i, j;.  
7dd0: 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50  sqlite3 *db = pP
7de0: 61 72 73 65 2d 3e 64 62 3b 0a 20 20 69 6e 74 20  arse->db;.  int 
7df0: 66 75 6c 6c 4e 61 6d 65 73 2c 20 73 68 6f 72 74  fullNames, short
7e00: 4e 61 6d 65 73 3b 0a 0a 23 69 66 6e 64 65 66 20  Names;..#ifndef 
7e10: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 45 58 50 4c  SQLITE_OMIT_EXPL
7e20: 41 49 4e 0a 20 20 2f 2a 20 49 66 20 74 68 69 73  AIN.  /* If this
7e30: 20 69 73 20 61 6e 20 45 58 50 4c 41 49 4e 2c 20   is an EXPLAIN, 
7e40: 73 6b 69 70 20 74 68 69 73 20 73 74 65 70 20 2a  skip this step *
7e50: 2f 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e  /.  if( pParse->
7e60: 65 78 70 6c 61 69 6e 20 29 7b 0a 20 20 20 20 72  explain ){.    r
7e70: 65 74 75 72 6e 3b 0a 20 20 7d 0a 23 65 6e 64 69  eturn;.  }.#endi
7e80: 66 0a 0a 20 20 61 73 73 65 72 74 28 20 76 21 3d  f..  assert( v!=
7e90: 30 20 29 3b 0a 20 20 69 66 28 20 70 50 61 72 73  0 );.  if( pPars
7ea0: 65 2d 3e 63 6f 6c 4e 61 6d 65 73 53 65 74 20 7c  e->colNamesSet |
7eb0: 7c 20 76 3d 3d 30 20 7c 7c 20 64 62 2d 3e 6d 61  | v==0 || db->ma
7ec0: 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20 72 65 74  llocFailed ) ret
7ed0: 75 72 6e 3b 0a 20 20 70 50 61 72 73 65 2d 3e 63  urn;.  pParse->c
7ee0: 6f 6c 4e 61 6d 65 73 53 65 74 20 3d 20 31 3b 0a  olNamesSet = 1;.
7ef0: 20 20 66 75 6c 6c 4e 61 6d 65 73 20 3d 20 28 64    fullNames = (d
7f00: 62 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49 54  b->flags & SQLIT
7f10: 45 5f 46 75 6c 6c 43 6f 6c 4e 61 6d 65 73 29 21  E_FullColNames)!
7f20: 3d 30 3b 0a 20 20 73 68 6f 72 74 4e 61 6d 65 73  =0;.  shortNames
7f30: 20 3d 20 28 64 62 2d 3e 66 6c 61 67 73 20 26 20   = (db->flags & 
7f40: 53 51 4c 49 54 45 5f 53 68 6f 72 74 43 6f 6c 4e  SQLITE_ShortColN
7f50: 61 6d 65 73 29 21 3d 30 3b 0a 20 20 73 71 6c 69  ames)!=0;.  sqli
7f60: 74 65 33 56 64 62 65 53 65 74 4e 75 6d 43 6f 6c  te3VdbeSetNumCol
7f70: 73 28 76 2c 20 70 45 4c 69 73 74 2d 3e 6e 45 78  s(v, pEList->nEx
7f80: 70 72 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  pr);.  for(i=0; 
7f90: 69 3c 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b  i<pEList->nExpr;
7fa0: 20 69 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72 20   i++){.    Expr 
7fb0: 2a 70 3b 0a 20 20 20 20 70 20 3d 20 70 45 4c 69  *p;.    p = pELi
7fc0: 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 3b 0a  st->a[i].pExpr;.
7fd0: 20 20 20 20 69 66 28 20 70 3d 3d 30 20 29 20 63      if( p==0 ) c
7fe0: 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69 66 28  ontinue;.    if(
7ff0: 20 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e   pEList->a[i].zN
8000: 61 6d 65 20 29 7b 0a 20 20 20 20 20 20 63 68 61  ame ){.      cha
8010: 72 20 2a 7a 4e 61 6d 65 20 3d 20 70 45 4c 69 73  r *zName = pELis
8020: 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 3b 0a 20  t->a[i].zName;. 
8030: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
8040: 53 65 74 43 6f 6c 4e 61 6d 65 28 76 2c 20 69 2c  SetColName(v, i,
8050: 20 43 4f 4c 4e 41 4d 45 5f 4e 41 4d 45 2c 20 7a   COLNAME_NAME, z
8060: 4e 61 6d 65 2c 20 73 74 72 6c 65 6e 28 7a 4e 61  Name, strlen(zNa
8070: 6d 65 29 29 3b 0a 20 20 20 20 20 20 63 6f 6e 74  me));.      cont
8080: 69 6e 75 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20  inue;.    }.    
8090: 69 66 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f  if( p->op==TK_CO
80a0: 4c 55 4d 4e 20 26 26 20 70 54 61 62 4c 69 73 74  LUMN && pTabList
80b0: 20 29 7b 0a 20 20 20 20 20 20 54 61 62 6c 65 20   ){.      Table 
80c0: 2a 70 54 61 62 3b 0a 20 20 20 20 20 20 63 68 61  *pTab;.      cha
80d0: 72 20 2a 7a 43 6f 6c 3b 0a 20 20 20 20 20 20 69  r *zCol;.      i
80e0: 6e 74 20 69 43 6f 6c 20 3d 20 70 2d 3e 69 43 6f  nt iCol = p->iCo
80f0: 6c 75 6d 6e 3b 0a 20 20 20 20 20 20 66 6f 72 28  lumn;.      for(
8100: 6a 3d 30 3b 20 6a 3c 70 54 61 62 4c 69 73 74 2d  j=0; j<pTabList-
8110: 3e 6e 53 72 63 20 26 26 20 70 54 61 62 4c 69 73  >nSrc && pTabLis
8120: 74 2d 3e 61 5b 6a 5d 2e 69 43 75 72 73 6f 72 21  t->a[j].iCursor!
8130: 3d 70 2d 3e 69 54 61 62 6c 65 3b 20 6a 2b 2b 29  =p->iTable; j++)
8140: 7b 7d 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  {}.      assert(
8150: 20 6a 3c 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72   j<pTabList->nSr
8160: 63 20 29 3b 0a 20 20 20 20 20 20 70 54 61 62 20  c );.      pTab 
8170: 3d 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 6a 5d  = pTabList->a[j]
8180: 2e 70 54 61 62 3b 0a 20 20 20 20 20 20 69 66 28  .pTab;.      if(
8190: 20 69 43 6f 6c 3c 30 20 29 20 69 43 6f 6c 20 3d   iCol<0 ) iCol =
81a0: 20 70 54 61 62 2d 3e 69 50 4b 65 79 3b 0a 20 20   pTab->iPKey;.  
81b0: 20 20 20 20 61 73 73 65 72 74 28 20 69 43 6f 6c      assert( iCol
81c0: 3d 3d 2d 31 20 7c 7c 20 28 69 43 6f 6c 3e 3d 30  ==-1 || (iCol>=0
81d0: 20 26 26 20 69 43 6f 6c 3c 70 54 61 62 2d 3e 6e   && iCol<pTab->n
81e0: 43 6f 6c 29 20 29 3b 0a 20 20 20 20 20 20 69 66  Col) );.      if
81f0: 28 20 69 43 6f 6c 3c 30 20 29 7b 0a 20 20 20 20  ( iCol<0 ){.    
8200: 20 20 20 20 7a 43 6f 6c 20 3d 20 22 72 6f 77 69      zCol = "rowi
8210: 64 22 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  d";.      }else{
8220: 0a 20 20 20 20 20 20 20 20 7a 43 6f 6c 20 3d 20  .        zCol = 
8230: 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d  pTab->aCol[iCol]
8240: 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20 7d 0a  .zName;.      }.
8250: 20 20 20 20 20 20 69 66 28 20 21 73 68 6f 72 74        if( !short
8260: 4e 61 6d 65 73 20 26 26 20 21 66 75 6c 6c 4e 61  Names && !fullNa
8270: 6d 65 73 20 26 26 20 70 2d 3e 73 70 61 6e 2e 7a  mes && p->span.z
8280: 20 26 26 20 70 2d 3e 73 70 61 6e 2e 7a 5b 30 5d   && p->span.z[0]
8290: 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
82a0: 74 65 33 56 64 62 65 53 65 74 43 6f 6c 4e 61 6d  te3VdbeSetColNam
82b0: 65 28 76 2c 20 69 2c 20 43 4f 4c 4e 41 4d 45 5f  e(v, i, COLNAME_
82c0: 4e 41 4d 45 2c 20 28 63 68 61 72 2a 29 70 2d 3e  NAME, (char*)p->
82d0: 73 70 61 6e 2e 7a 2c 20 70 2d 3e 73 70 61 6e 2e  span.z, p->span.
82e0: 6e 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20  n);.      }else 
82f0: 69 66 28 20 66 75 6c 6c 4e 61 6d 65 73 20 7c 7c  if( fullNames ||
8300: 20 28 21 73 68 6f 72 74 4e 61 6d 65 73 20 26 26   (!shortNames &&
8310: 20 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3e   pTabList->nSrc>
8320: 31 29 20 29 7b 0a 20 20 20 20 20 20 20 20 63 68  1) ){.        ch
8330: 61 72 20 2a 7a 4e 61 6d 65 20 3d 20 30 3b 0a 20  ar *zName = 0;. 
8340: 20 20 20 20 20 20 20 63 68 61 72 20 2a 7a 54 61         char *zTa
8350: 62 3b 0a 20 0a 20 20 20 20 20 20 20 20 7a 54 61  b;. .        zTa
8360: 62 20 3d 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b  b = pTabList->a[
8370: 6a 5d 2e 7a 41 6c 69 61 73 3b 0a 20 20 20 20 20  j].zAlias;.     
8380: 20 20 20 69 66 28 20 66 75 6c 6c 4e 61 6d 65 73     if( fullNames
8390: 20 7c 7c 20 7a 54 61 62 3d 3d 30 20 29 20 7a 54   || zTab==0 ) zT
83a0: 61 62 20 3d 20 70 54 61 62 2d 3e 7a 4e 61 6d 65  ab = pTab->zName
83b0: 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
83c0: 33 53 65 74 53 74 72 69 6e 67 28 26 7a 4e 61 6d  3SetString(&zNam
83d0: 65 2c 20 7a 54 61 62 2c 20 22 2e 22 2c 20 7a 43  e, zTab, ".", zC
83e0: 6f 6c 2c 20 28 63 68 61 72 2a 29 30 29 3b 0a 20  ol, (char*)0);. 
83f0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
8400: 62 65 53 65 74 43 6f 6c 4e 61 6d 65 28 76 2c 20  beSetColName(v, 
8410: 69 2c 20 43 4f 4c 4e 41 4d 45 5f 4e 41 4d 45 2c  i, COLNAME_NAME,
8420: 20 7a 4e 61 6d 65 2c 20 50 33 5f 44 59 4e 41 4d   zName, P3_DYNAM
8430: 49 43 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  IC);.      }else
8440: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
8450: 33 56 64 62 65 53 65 74 43 6f 6c 4e 61 6d 65 28  3VdbeSetColName(
8460: 76 2c 20 69 2c 20 43 4f 4c 4e 41 4d 45 5f 4e 41  v, i, COLNAME_NA
8470: 4d 45 2c 20 7a 43 6f 6c 2c 20 73 74 72 6c 65 6e  ME, zCol, strlen
8480: 28 7a 43 6f 6c 29 29 3b 0a 20 20 20 20 20 20 7d  (zCol));.      }
8490: 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70  .    }else if( p
84a0: 2d 3e 73 70 61 6e 2e 7a 20 26 26 20 70 2d 3e 73  ->span.z && p->s
84b0: 70 61 6e 2e 7a 5b 30 5d 20 29 7b 0a 20 20 20 20  pan.z[0] ){.    
84c0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 74    sqlite3VdbeSet
84d0: 43 6f 6c 4e 61 6d 65 28 76 2c 20 69 2c 20 43 4f  ColName(v, i, CO
84e0: 4c 4e 41 4d 45 5f 4e 41 4d 45 2c 20 28 63 68 61  LNAME_NAME, (cha
84f0: 72 2a 29 70 2d 3e 73 70 61 6e 2e 7a 2c 20 70 2d  r*)p->span.z, p-
8500: 3e 73 70 61 6e 2e 6e 29 3b 0a 20 20 20 20 20 20  >span.n);.      
8510: 2f 2a 20 73 71 6c 69 74 65 33 56 64 62 65 43 6f  /* sqlite3VdbeCo
8520: 6d 70 72 65 73 73 53 70 61 63 65 28 76 2c 20 61  mpressSpace(v, a
8530: 64 64 72 29 3b 20 2a 2f 0a 20 20 20 20 7d 65 6c  ddr); */.    }el
8540: 73 65 7b 0a 20 20 20 20 20 20 63 68 61 72 20 7a  se{.      char z
8550: 4e 61 6d 65 5b 33 30 5d 3b 0a 20 20 20 20 20 20  Name[30];.      
8560: 61 73 73 65 72 74 28 20 70 2d 3e 6f 70 21 3d 54  assert( p->op!=T
8570: 4b 5f 43 4f 4c 55 4d 4e 20 7c 7c 20 70 54 61 62  K_COLUMN || pTab
8580: 4c 69 73 74 3d 3d 30 20 29 3b 0a 20 20 20 20 20  List==0 );.     
8590: 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74   sqlite3_snprint
85a0: 66 28 73 69 7a 65 6f 66 28 7a 4e 61 6d 65 29 2c  f(sizeof(zName),
85b0: 20 7a 4e 61 6d 65 2c 20 22 63 6f 6c 75 6d 6e 25   zName, "column%
85c0: 64 22 2c 20 69 2b 31 29 3b 0a 20 20 20 20 20 20  d", i+1);.      
85d0: 73 71 6c 69 74 65 33 56 64 62 65 53 65 74 43 6f  sqlite3VdbeSetCo
85e0: 6c 4e 61 6d 65 28 76 2c 20 69 2c 20 43 4f 4c 4e  lName(v, i, COLN
85f0: 41 4d 45 5f 4e 41 4d 45 2c 20 7a 4e 61 6d 65 2c  AME_NAME, zName,
8600: 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20   0);.    }.  }. 
8610: 20 67 65 6e 65 72 61 74 65 43 6f 6c 75 6d 6e 54   generateColumnT
8620: 79 70 65 73 28 70 50 61 72 73 65 2c 20 70 54 61  ypes(pParse, pTa
8630: 62 4c 69 73 74 2c 20 70 45 4c 69 73 74 29 3b 0a  bList, pEList);.
8640: 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  }..#ifndef SQLIT
8650: 45 5f 4f 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f  E_OMIT_COMPOUND_
8660: 53 45 4c 45 43 54 0a 2f 2a 0a 2a 2a 20 4e 61 6d  SELECT./*.** Nam
8670: 65 20 6f 66 20 74 68 65 20 63 6f 6e 6e 65 63 74  e of the connect
8680: 69 6f 6e 20 6f 70 65 72 61 74 6f 72 2c 20 75 73  ion operator, us
8690: 65 64 20 66 6f 72 20 65 72 72 6f 72 20 6d 65 73  ed for error mes
86a0: 73 61 67 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63  sages..*/.static
86b0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 73 65 6c   const char *sel
86c0: 65 63 74 4f 70 4e 61 6d 65 28 69 6e 74 20 69 64  ectOpName(int id
86d0: 29 7b 0a 20 20 63 68 61 72 20 2a 7a 3b 0a 20 20  ){.  char *z;.  
86e0: 73 77 69 74 63 68 28 20 69 64 20 29 7b 0a 20 20  switch( id ){.  
86f0: 20 20 63 61 73 65 20 54 4b 5f 41 4c 4c 3a 20 20    case TK_ALL:  
8700: 20 20 20 20 20 7a 20 3d 20 22 55 4e 49 4f 4e 20       z = "UNION 
8710: 41 4c 4c 22 3b 20 20 20 62 72 65 61 6b 3b 0a 20  ALL";   break;. 
8720: 20 20 20 63 61 73 65 20 54 4b 5f 49 4e 54 45 52     case TK_INTER
8730: 53 45 43 54 3a 20 7a 20 3d 20 22 49 4e 54 45 52  SECT: z = "INTER
8740: 53 45 43 54 22 3b 20 20 20 62 72 65 61 6b 3b 0a  SECT";   break;.
8750: 20 20 20 20 63 61 73 65 20 54 4b 5f 45 58 43 45      case TK_EXCE
8760: 50 54 3a 20 20 20 20 7a 20 3d 20 22 45 58 43 45  PT:    z = "EXCE
8770: 50 54 22 3b 20 20 20 20 20 20 62 72 65 61 6b 3b  PT";      break;
8780: 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20 20 20  .    default:   
8790: 20 20 20 20 20 20 20 20 7a 20 3d 20 22 55 4e 49          z = "UNI
87a0: 4f 4e 22 3b 20 20 20 20 20 20 20 62 72 65 61 6b  ON";       break
87b0: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 7a  ;.  }.  return z
87c0: 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51  ;.}.#endif /* SQ
87d0: 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f 4d 50 4f 55  LITE_OMIT_COMPOU
87e0: 4e 44 5f 53 45 4c 45 43 54 20 2a 2f 0a 0a 2f 2a  ND_SELECT */../*
87f0: 0a 2a 2a 20 46 6f 72 77 61 72 64 20 64 65 63 6c  .** Forward decl
8800: 61 72 61 74 69 6f 6e 0a 2a 2f 0a 73 74 61 74 69  aration.*/.stati
8810: 63 20 69 6e 74 20 70 72 65 70 53 65 6c 65 63 74  c int prepSelect
8820: 53 74 6d 74 28 50 61 72 73 65 2a 2c 20 53 65 6c  Stmt(Parse*, Sel
8830: 65 63 74 2a 29 3b 0a 0a 2f 2a 0a 2a 2a 20 47 69  ect*);../*.** Gi
8840: 76 65 6e 20 61 20 53 45 4c 45 43 54 20 73 74 61  ven a SELECT sta
8850: 74 65 6d 65 6e 74 2c 20 67 65 6e 65 72 61 74 65  tement, generate
8860: 20 61 20 54 61 62 6c 65 20 73 74 72 75 63 74 75   a Table structu
8870: 72 65 20 74 68 61 74 20 64 65 73 63 72 69 62 65  re that describe
8880: 73 0a 2a 2a 20 74 68 65 20 72 65 73 75 6c 74 20  s.** the result 
8890: 73 65 74 20 6f 66 20 74 68 61 74 20 53 45 4c 45  set of that SELE
88a0: 43 54 2e 0a 2a 2f 0a 54 61 62 6c 65 20 2a 73 71  CT..*/.Table *sq
88b0: 6c 69 74 65 33 52 65 73 75 6c 74 53 65 74 4f 66  lite3ResultSetOf
88c0: 53 65 6c 65 63 74 28 50 61 72 73 65 20 2a 70 50  Select(Parse *pP
88d0: 61 72 73 65 2c 20 63 68 61 72 20 2a 7a 54 61 62  arse, char *zTab
88e0: 4e 61 6d 65 2c 20 53 65 6c 65 63 74 20 2a 70 53  Name, Select *pS
88f0: 65 6c 65 63 74 29 7b 0a 20 20 54 61 62 6c 65 20  elect){.  Table 
8900: 2a 70 54 61 62 3b 0a 20 20 69 6e 74 20 69 2c 20  *pTab;.  int i, 
8910: 6a 3b 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70  j;.  ExprList *p
8920: 45 4c 69 73 74 3b 0a 20 20 43 6f 6c 75 6d 6e 20  EList;.  Column 
8930: 2a 61 43 6f 6c 2c 20 2a 70 43 6f 6c 3b 0a 20 20  *aCol, *pCol;.  
8940: 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50  sqlite3 *db = pP
8950: 61 72 73 65 2d 3e 64 62 3b 0a 0a 20 20 77 68 69  arse->db;..  whi
8960: 6c 65 28 20 70 53 65 6c 65 63 74 2d 3e 70 50 72  le( pSelect->pPr
8970: 69 6f 72 20 29 20 70 53 65 6c 65 63 74 20 3d 20  ior ) pSelect = 
8980: 70 53 65 6c 65 63 74 2d 3e 70 50 72 69 6f 72 3b  pSelect->pPrior;
8990: 0a 20 20 69 66 28 20 70 72 65 70 53 65 6c 65 63  .  if( prepSelec
89a0: 74 53 74 6d 74 28 70 50 61 72 73 65 2c 20 70 53  tStmt(pParse, pS
89b0: 65 6c 65 63 74 29 20 29 7b 0a 20 20 20 20 72 65  elect) ){.    re
89c0: 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 69 66  turn 0;.  }.  if
89d0: 28 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 52  ( sqlite3SelectR
89e0: 65 73 6f 6c 76 65 28 70 50 61 72 73 65 2c 20 70  esolve(pParse, p
89f0: 53 65 6c 65 63 74 2c 20 30 29 20 29 7b 0a 20 20  Select, 0) ){.  
8a00: 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a    return 0;.  }.
8a10: 20 20 70 54 61 62 20 3d 20 73 71 6c 69 74 65 33    pTab = sqlite3
8a20: 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c  DbMallocZero(db,
8a30: 20 73 69 7a 65 6f 66 28 54 61 62 6c 65 29 20 29   sizeof(Table) )
8a40: 3b 0a 20 20 69 66 28 20 70 54 61 62 3d 3d 30 20  ;.  if( pTab==0 
8a50: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b  ){.    return 0;
8a60: 0a 20 20 7d 0a 20 20 70 54 61 62 2d 3e 6e 52 65  .  }.  pTab->nRe
8a70: 66 20 3d 20 31 3b 0a 20 20 70 54 61 62 2d 3e 7a  f = 1;.  pTab->z
8a80: 4e 61 6d 65 20 3d 20 7a 54 61 62 4e 61 6d 65 20  Name = zTabName 
8a90: 3f 20 73 71 6c 69 74 65 33 44 62 53 74 72 44 75  ? sqlite3DbStrDu
8aa0: 70 28 64 62 2c 20 7a 54 61 62 4e 61 6d 65 29 20  p(db, zTabName) 
8ab0: 3a 20 30 3b 0a 20 20 70 45 4c 69 73 74 20 3d 20  : 0;.  pEList = 
8ac0: 70 53 65 6c 65 63 74 2d 3e 70 45 4c 69 73 74 3b  pSelect->pEList;
8ad0: 0a 20 20 70 54 61 62 2d 3e 6e 43 6f 6c 20 3d 20  .  pTab->nCol = 
8ae0: 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 0a 20  pEList->nExpr;. 
8af0: 20 61 73 73 65 72 74 28 20 70 54 61 62 2d 3e 6e   assert( pTab->n
8b00: 43 6f 6c 3e 30 20 29 3b 0a 20 20 70 54 61 62 2d  Col>0 );.  pTab-
8b10: 3e 61 43 6f 6c 20 3d 20 61 43 6f 6c 20 3d 20 73  >aCol = aCol = s
8b20: 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65  qlite3DbMallocZe
8b30: 72 6f 28 64 62 2c 20 73 69 7a 65 6f 66 28 70 54  ro(db, sizeof(pT
8b40: 61 62 2d 3e 61 43 6f 6c 5b 30 5d 29 2a 70 54 61  ab->aCol[0])*pTa
8b50: 62 2d 3e 6e 43 6f 6c 29 3b 0a 20 20 66 6f 72 28  b->nCol);.  for(
8b60: 69 3d 30 2c 20 70 43 6f 6c 3d 61 43 6f 6c 3b 20  i=0, pCol=aCol; 
8b70: 69 3c 70 54 61 62 2d 3e 6e 43 6f 6c 3b 20 69 2b  i<pTab->nCol; i+
8b80: 2b 2c 20 70 43 6f 6c 2b 2b 29 7b 0a 20 20 20 20  +, pCol++){.    
8b90: 45 78 70 72 20 2a 70 2c 20 2a 70 52 3b 0a 20 20  Expr *p, *pR;.  
8ba0: 20 20 63 68 61 72 20 2a 7a 54 79 70 65 3b 0a 20    char *zType;. 
8bb0: 20 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 3b 0a     char *zName;.
8bc0: 20 20 20 20 69 6e 74 20 6e 4e 61 6d 65 3b 0a 20      int nName;. 
8bd0: 20 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c     CollSeq *pCol
8be0: 6c 3b 0a 20 20 20 20 69 6e 74 20 63 6e 74 3b 0a  l;.    int cnt;.
8bf0: 20 20 20 20 4e 61 6d 65 43 6f 6e 74 65 78 74 20      NameContext 
8c00: 73 4e 43 3b 0a 20 20 20 20 0a 20 20 20 20 2f 2a  sNC;.    .    /*
8c10: 20 47 65 74 20 61 6e 20 61 70 70 72 6f 70 72 69   Get an appropri
8c20: 61 74 65 20 6e 61 6d 65 20 66 6f 72 20 74 68 65  ate name for the
8c30: 20 63 6f 6c 75 6d 6e 0a 20 20 20 20 2a 2f 0a 20   column.    */. 
8c40: 20 20 20 70 20 3d 20 70 45 4c 69 73 74 2d 3e 61     p = pEList->a
8c50: 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 61  [i].pExpr;.    a
8c60: 73 73 65 72 74 28 20 70 2d 3e 70 52 69 67 68 74  ssert( p->pRight
8c70: 3d 3d 30 20 7c 7c 20 70 2d 3e 70 52 69 67 68 74  ==0 || p->pRight
8c80: 2d 3e 74 6f 6b 65 6e 2e 7a 3d 3d 30 20 7c 7c 20  ->token.z==0 || 
8c90: 70 2d 3e 70 52 69 67 68 74 2d 3e 74 6f 6b 65 6e  p->pRight->token
8ca0: 2e 7a 5b 30 5d 21 3d 30 20 29 3b 0a 20 20 20 20  .z[0]!=0 );.    
8cb0: 69 66 28 20 28 7a 4e 61 6d 65 20 3d 20 70 45 4c  if( (zName = pEL
8cc0: 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 29  ist->a[i].zName)
8cd0: 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  !=0 ){.      /* 
8ce0: 49 66 20 74 68 65 20 63 6f 6c 75 6d 6e 20 63 6f  If the column co
8cf0: 6e 74 61 69 6e 73 20 61 6e 20 22 41 53 20 3c 6e  ntains an "AS <n
8d00: 61 6d 65 3e 22 20 70 68 72 61 73 65 2c 20 75 73  ame>" phrase, us
8d10: 65 20 3c 6e 61 6d 65 3e 20 61 73 20 74 68 65 20  e <name> as the 
8d20: 6e 61 6d 65 20 2a 2f 0a 20 20 20 20 20 20 7a 4e  name */.      zN
8d30: 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 44 62 53  ame = sqlite3DbS
8d40: 74 72 44 75 70 28 64 62 2c 20 7a 4e 61 6d 65 29  trDup(db, zName)
8d50: 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
8d60: 70 2d 3e 6f 70 3d 3d 54 4b 5f 44 4f 54 20 0a 20  p->op==TK_DOT . 
8d70: 20 20 20 20 20 20 20 20 20 20 20 20 20 26 26 20               && 
8d80: 28 70 52 3d 70 2d 3e 70 52 69 67 68 74 29 21 3d  (pR=p->pRight)!=
8d90: 30 20 26 26 20 70 52 2d 3e 74 6f 6b 65 6e 2e 7a  0 && pR->token.z
8da0: 20 26 26 20 70 52 2d 3e 74 6f 6b 65 6e 2e 7a 5b   && pR->token.z[
8db0: 30 5d 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 46  0] ){.      /* F
8dc0: 6f 72 20 63 6f 6c 75 6d 6e 73 20 6f 66 20 74 68  or columns of th
8dd0: 65 20 66 72 6f 6d 20 41 2e 42 20 75 73 65 20 42  e from A.B use B
8de0: 20 61 73 20 74 68 65 20 6e 61 6d 65 20 2a 2f 0a   as the name */.
8df0: 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 73 71        zName = sq
8e00: 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 64 62 2c  lite3MPrintf(db,
8e10: 20 22 25 54 22 2c 20 26 70 52 2d 3e 74 6f 6b 65   "%T", &pR->toke
8e20: 6e 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66  n);.    }else if
8e30: 28 20 70 2d 3e 73 70 61 6e 2e 7a 20 26 26 20 70  ( p->span.z && p
8e40: 2d 3e 73 70 61 6e 2e 7a 5b 30 5d 20 29 7b 0a 20  ->span.z[0] ){. 
8e50: 20 20 20 20 20 2f 2a 20 55 73 65 20 74 68 65 20       /* Use the 
8e60: 6f 72 69 67 69 6e 61 6c 20 74 65 78 74 20 6f 66  original text of
8e70: 20 74 68 65 20 63 6f 6c 75 6d 6e 20 65 78 70 72   the column expr
8e80: 65 73 73 69 6f 6e 20 61 73 20 69 74 73 20 6e 61  ession as its na
8e90: 6d 65 20 2a 2f 0a 20 20 20 20 20 20 7a 4e 61 6d  me */.      zNam
8ea0: 65 20 3d 20 73 71 6c 69 74 65 33 4d 50 72 69 6e  e = sqlite3MPrin
8eb0: 74 66 28 64 62 2c 20 22 25 54 22 2c 20 26 70 2d  tf(db, "%T", &p-
8ec0: 3e 73 70 61 6e 29 3b 0a 20 20 20 20 7d 65 6c 73  >span);.    }els
8ed0: 65 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 61  e{.      /* If a
8ee0: 6c 6c 20 65 6c 73 65 20 66 61 69 6c 73 2c 20 6d  ll else fails, m
8ef0: 61 6b 65 20 75 70 20 61 20 6e 61 6d 65 20 2a 2f  ake up a name */
8f00: 0a 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 73  .      zName = s
8f10: 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 64 62  qlite3MPrintf(db
8f20: 2c 20 22 63 6f 6c 75 6d 6e 25 64 22 2c 20 69 2b  , "column%d", i+
8f30: 31 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71  1);.    }.    sq
8f40: 6c 69 74 65 33 44 65 71 75 6f 74 65 28 7a 4e 61  lite3Dequote(zNa
8f50: 6d 65 29 3b 0a 20 20 20 20 69 66 28 20 64 62 2d  me);.    if( db-
8f60: 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b  >mallocFailed ){
8f70: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66  .      sqlite3_f
8f80: 72 65 65 28 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  ree(zName);.    
8f90: 20 20 73 71 6c 69 74 65 33 44 65 6c 65 74 65 54    sqlite3DeleteT
8fa0: 61 62 6c 65 28 70 54 61 62 29 3b 0a 20 20 20 20  able(pTab);.    
8fb0: 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20    return 0;.    
8fc0: 7d 0a 0a 20 20 20 20 2f 2a 20 4d 61 6b 65 20 73  }..    /* Make s
8fd0: 75 72 65 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6e  ure the column n
8fe0: 61 6d 65 20 69 73 20 75 6e 69 71 75 65 2e 20 20  ame is unique.  
8ff0: 49 66 20 74 68 65 20 6e 61 6d 65 20 69 73 20 6e  If the name is n
9000: 6f 74 20 75 6e 69 71 75 65 2c 0a 20 20 20 20 2a  ot unique,.    *
9010: 2a 20 61 70 70 65 6e 64 20 61 20 69 6e 74 65 67  * append a integ
9020: 65 72 20 74 6f 20 74 68 65 20 6e 61 6d 65 20 73  er to the name s
9030: 6f 20 74 68 61 74 20 69 74 20 62 65 63 6f 6d 65  o that it become
9040: 73 20 75 6e 69 71 75 65 2e 0a 20 20 20 20 2a 2f  s unique..    */
9050: 0a 20 20 20 20 6e 4e 61 6d 65 20 3d 20 73 74 72  .    nName = str
9060: 6c 65 6e 28 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  len(zName);.    
9070: 66 6f 72 28 6a 3d 63 6e 74 3d 30 3b 20 6a 3c 69  for(j=cnt=0; j<i
9080: 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66  ; j++){.      if
9090: 28 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70  ( sqlite3StrICmp
90a0: 28 61 43 6f 6c 5b 6a 5d 2e 7a 4e 61 6d 65 2c 20  (aCol[j].zName, 
90b0: 7a 4e 61 6d 65 29 3d 3d 30 20 29 7b 0a 20 20 20  zName)==0 ){.   
90c0: 20 20 20 20 20 7a 4e 61 6d 65 5b 6e 4e 61 6d 65       zName[nName
90d0: 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7a  ] = 0;.        z
90e0: 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 4d 50  Name = sqlite3MP
90f0: 72 69 6e 74 66 28 22 25 7a 3a 25 64 22 2c 20 7a  rintf("%z:%d", z
9100: 4e 61 6d 65 2c 20 2b 2b 63 6e 74 29 3b 0a 20 20  Name, ++cnt);.  
9110: 20 20 20 20 20 20 6a 20 3d 20 2d 31 3b 0a 20 20        j = -1;.  
9120: 20 20 20 20 20 20 69 66 28 20 7a 4e 61 6d 65 3d        if( zName=
9130: 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20  =0 ) break;.    
9140: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 70 43    }.    }.    pC
9150: 6f 6c 2d 3e 7a 4e 61 6d 65 20 3d 20 7a 4e 61 6d  ol->zName = zNam
9160: 65 3b 0a 0a 20 20 20 20 2f 2a 20 47 65 74 20 74  e;..    /* Get t
9170: 68 65 20 74 79 70 65 6e 61 6d 65 2c 20 74 79 70  he typename, typ
9180: 65 20 61 66 66 69 6e 69 74 79 2c 20 61 6e 64 20  e affinity, and 
9190: 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e  collating sequen
91a0: 63 65 20 66 6f 72 20 74 68 65 0a 20 20 20 20 2a  ce for the.    *
91b0: 2a 20 63 6f 6c 75 6d 6e 2e 0a 20 20 20 20 2a 2f  * column..    */
91c0: 0a 20 20 20 20 6d 65 6d 73 65 74 28 26 73 4e 43  .    memset(&sNC
91d0: 2c 20 30 2c 20 73 69 7a 65 6f 66 28 73 4e 43 29  , 0, sizeof(sNC)
91e0: 29 3b 0a 20 20 20 20 73 4e 43 2e 70 53 72 63 4c  );.    sNC.pSrcL
91f0: 69 73 74 20 3d 20 70 53 65 6c 65 63 74 2d 3e 70  ist = pSelect->p
9200: 53 72 63 3b 0a 20 20 20 20 7a 54 79 70 65 20 3d  Src;.    zType =
9210: 20 73 71 6c 69 74 65 33 44 62 53 74 72 44 75 70   sqlite3DbStrDup
9220: 28 64 62 2c 20 63 6f 6c 75 6d 6e 54 79 70 65 28  (db, columnType(
9230: 26 73 4e 43 2c 20 70 2c 20 30 2c 20 30 2c 20 30  &sNC, p, 0, 0, 0
9240: 29 29 3b 0a 20 20 20 20 70 43 6f 6c 2d 3e 7a 54  ));.    pCol->zT
9250: 79 70 65 20 3d 20 7a 54 79 70 65 3b 0a 20 20 20  ype = zType;.   
9260: 20 70 43 6f 6c 2d 3e 61 66 66 69 6e 69 74 79 20   pCol->affinity 
9270: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 41 66 66  = sqlite3ExprAff
9280: 69 6e 69 74 79 28 70 29 3b 0a 20 20 20 20 70 43  inity(p);.    pC
9290: 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 45 78 70  oll = sqlite3Exp
92a0: 72 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c  rCollSeq(pParse,
92b0: 20 70 29 3b 0a 20 20 20 20 69 66 28 20 70 43 6f   p);.    if( pCo
92c0: 6c 6c 20 29 7b 0a 20 20 20 20 20 20 70 43 6f 6c  ll ){.      pCol
92d0: 2d 3e 7a 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65  ->zColl = sqlite
92e0: 33 44 62 53 74 72 44 75 70 28 64 62 2c 20 70 43  3DbStrDup(db, pC
92f0: 6f 6c 6c 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20  oll->zName);.   
9300: 20 7d 0a 20 20 7d 0a 20 20 70 54 61 62 2d 3e 69   }.  }.  pTab->i
9310: 50 4b 65 79 20 3d 20 2d 31 3b 0a 20 20 72 65 74  PKey = -1;.  ret
9320: 75 72 6e 20 70 54 61 62 3b 0a 7d 0a 0a 2f 2a 0a  urn pTab;.}../*.
9330: 2a 2a 20 50 72 65 70 61 72 65 20 61 20 53 45 4c  ** Prepare a SEL
9340: 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 66 6f  ECT statement fo
9350: 72 20 70 72 6f 63 65 73 73 69 6e 67 20 62 79 20  r processing by 
9360: 64 6f 69 6e 67 20 74 68 65 20 66 6f 6c 6c 6f 77  doing the follow
9370: 69 6e 67 0a 2a 2a 20 74 68 69 6e 67 73 3a 0a 2a  ing.** things:.*
9380: 2a 0a 2a 2a 20 20 20 20 28 31 29 20 20 4d 61 6b  *.**    (1)  Mak
9390: 65 20 73 75 72 65 20 56 44 42 45 20 63 75 72 73  e sure VDBE curs
93a0: 6f 72 20 6e 75 6d 62 65 72 73 20 68 61 76 65 20  or numbers have 
93b0: 62 65 65 6e 20 61 73 73 69 67 6e 65 64 20 74 6f  been assigned to
93c0: 20 65 76 65 72 79 0a 2a 2a 20 20 20 20 20 20 20   every.**       
93d0: 20 20 65 6c 65 6d 65 6e 74 20 6f 66 20 74 68 65    element of the
93e0: 20 46 52 4f 4d 20 63 6c 61 75 73 65 2e 0a 2a 2a   FROM clause..**
93f0: 0a 2a 2a 20 20 20 20 28 32 29 20 20 46 69 6c 6c  .**    (2)  Fill
9400: 20 69 6e 20 74 68 65 20 70 54 61 62 4c 69 73 74   in the pTabList
9410: 2d 3e 61 5b 5d 2e 70 54 61 62 20 66 69 65 6c 64  ->a[].pTab field
9420: 73 20 69 6e 20 74 68 65 20 53 72 63 4c 69 73 74  s in the SrcList
9430: 20 74 68 61 74 20 0a 2a 2a 20 20 20 20 20 20 20   that .**       
9440: 20 20 64 65 66 69 6e 65 73 20 46 52 4f 4d 20 63    defines FROM c
9450: 6c 61 75 73 65 2e 20 20 57 68 65 6e 20 76 69 65  lause.  When vie
9460: 77 73 20 61 70 70 65 61 72 20 69 6e 20 74 68 65  ws appear in the
9470: 20 46 52 4f 4d 20 63 6c 61 75 73 65 2c 0a 2a 2a   FROM clause,.**
9480: 20 20 20 20 20 20 20 20 20 66 69 6c 6c 20 70 54           fill pT
9490: 61 62 4c 69 73 74 2d 3e 61 5b 5d 2e 70 53 65 6c  abList->a[].pSel
94a0: 65 63 74 20 77 69 74 68 20 61 20 63 6f 70 79 20  ect with a copy 
94b0: 6f 66 20 74 68 65 20 53 45 4c 45 43 54 20 73 74  of the SELECT st
94c0: 61 74 65 6d 65 6e 74 0a 2a 2a 20 20 20 20 20 20  atement.**      
94d0: 20 20 20 74 68 61 74 20 69 6d 70 6c 65 6d 65 6e     that implemen
94e0: 74 73 20 74 68 65 20 76 69 65 77 2e 20 20 41 20  ts the view.  A 
94f0: 63 6f 70 79 20 69 73 20 6d 61 64 65 20 6f 66 20  copy is made of 
9500: 74 68 65 20 76 69 65 77 27 73 20 53 45 4c 45 43  the view's SELEC
9510: 54 0a 2a 2a 20 20 20 20 20 20 20 20 20 73 74 61  T.**         sta
9520: 74 65 6d 65 6e 74 20 73 6f 20 74 68 61 74 20 77  tement so that w
9530: 65 20 63 61 6e 20 66 72 65 65 6c 79 20 6d 6f 64  e can freely mod
9540: 69 66 79 20 6f 72 20 64 65 6c 65 74 65 20 74 68  ify or delete th
9550: 61 74 20 73 74 61 74 65 6d 65 6e 74 0a 2a 2a 20  at statement.** 
9560: 20 20 20 20 20 20 20 20 77 69 74 68 6f 75 74 20          without 
9570: 77 6f 72 72 79 69 6e 67 20 61 62 6f 75 74 20 6d  worrying about m
9580: 65 73 73 69 6e 67 20 75 70 20 74 68 65 20 70 72  essing up the pr
9590: 65 73 69 73 74 65 6e 74 20 72 65 70 72 65 73 65  esistent represe
95a0: 6e 74 61 74 69 6f 6e 0a 2a 2a 20 20 20 20 20 20  ntation.**      
95b0: 20 20 20 6f 66 20 74 68 65 20 76 69 65 77 2e 0a     of the view..
95c0: 2a 2a 0a 2a 2a 20 20 20 20 28 33 29 20 20 41 64  **.**    (3)  Ad
95d0: 64 20 74 65 72 6d 73 20 74 6f 20 74 68 65 20 57  d terms to the W
95e0: 48 45 52 45 20 63 6c 61 75 73 65 20 74 6f 20 61  HERE clause to a
95f0: 63 63 6f 6d 6f 64 61 74 65 20 74 68 65 20 4e 41  ccomodate the NA
9600: 54 55 52 41 4c 20 6b 65 79 77 6f 72 64 0a 2a 2a  TURAL keyword.**
9610: 20 20 20 20 20 20 20 20 20 6f 6e 20 6a 6f 69 6e           on join
9620: 73 20 61 6e 64 20 74 68 65 20 4f 4e 20 61 6e 64  s and the ON and
9630: 20 55 53 49 4e 47 20 63 6c 61 75 73 65 20 6f 66   USING clause of
9640: 20 6a 6f 69 6e 73 2e 0a 2a 2a 0a 2a 2a 20 20 20   joins..**.**   
9650: 20 28 34 29 20 20 53 63 61 6e 20 74 68 65 20 6c   (4)  Scan the l
9660: 69 73 74 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 69  ist of columns i
9670: 6e 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74  n the result set
9680: 20 28 70 45 4c 69 73 74 29 20 6c 6f 6f 6b 69 6e   (pEList) lookin
9690: 67 0a 2a 2a 20 20 20 20 20 20 20 20 20 66 6f 72  g.**         for
96a0: 20 69 6e 73 74 61 6e 63 65 73 20 6f 66 20 74 68   instances of th
96b0: 65 20 22 2a 22 20 6f 70 65 72 61 74 6f 72 20 6f  e "*" operator o
96c0: 72 20 74 68 65 20 54 41 42 4c 45 2e 2a 20 6f 70  r the TABLE.* op
96d0: 65 72 61 74 6f 72 2e 0a 2a 2a 20 20 20 20 20 20  erator..**      
96e0: 20 20 20 49 66 20 66 6f 75 6e 64 2c 20 65 78 70     If found, exp
96f0: 61 6e 64 20 65 61 63 68 20 22 2a 22 20 74 6f 20  and each "*" to 
9700: 62 65 20 65 76 65 72 79 20 63 6f 6c 75 6d 6e 20  be every column 
9710: 69 6e 20 65 76 65 72 79 20 74 61 62 6c 65 0a 2a  in every table.*
9720: 2a 20 20 20 20 20 20 20 20 20 61 6e 64 20 54 41  *         and TA
9730: 42 4c 45 2e 2a 20 74 6f 20 62 65 20 65 76 65 72  BLE.* to be ever
9740: 79 20 63 6f 6c 75 6d 6e 20 69 6e 20 54 41 42 4c  y column in TABL
9750: 45 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  E..**.** Return 
9760: 30 20 6f 6e 20 73 75 63 63 65 73 73 2e 20 20 49  0 on success.  I
9770: 66 20 74 68 65 72 65 20 61 72 65 20 70 72 6f 62  f there are prob
9780: 6c 65 6d 73 2c 20 6c 65 61 76 65 20 61 6e 20 65  lems, leave an e
9790: 72 72 6f 72 20 6d 65 73 73 61 67 65 0a 2a 2a 20  rror message.** 
97a0: 69 6e 20 70 50 61 72 73 65 20 61 6e 64 20 72 65  in pParse and re
97b0: 74 75 72 6e 20 6e 6f 6e 2d 7a 65 72 6f 2e 0a 2a  turn non-zero..*
97c0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 72 65  /.static int pre
97d0: 70 53 65 6c 65 63 74 53 74 6d 74 28 50 61 72 73  pSelectStmt(Pars
97e0: 65 20 2a 70 50 61 72 73 65 2c 20 53 65 6c 65 63  e *pParse, Selec
97f0: 74 20 2a 70 29 7b 0a 20 20 69 6e 74 20 69 2c 20  t *p){.  int i, 
9800: 6a 2c 20 6b 2c 20 72 63 3b 0a 20 20 53 72 63 4c  j, k, rc;.  SrcL
9810: 69 73 74 20 2a 70 54 61 62 4c 69 73 74 3b 0a 20  ist *pTabList;. 
9820: 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73   ExprList *pELis
9830: 74 3b 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c  t;.  struct SrcL
9840: 69 73 74 5f 69 74 65 6d 20 2a 70 46 72 6f 6d 3b  ist_item *pFrom;
9850: 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d  .  sqlite3 *db =
9860: 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 0a 20 20   pParse->db;..  
9870: 69 66 28 20 70 3d 3d 30 20 7c 7c 20 70 2d 3e 70  if( p==0 || p->p
9880: 53 72 63 3d 3d 30 20 7c 7c 20 64 62 2d 3e 6d 61  Src==0 || db->ma
9890: 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20  llocFailed ){.  
98a0: 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a    return 1;.  }.
98b0: 20 20 70 54 61 62 4c 69 73 74 20 3d 20 70 2d 3e    pTabList = p->
98c0: 70 53 72 63 3b 0a 20 20 70 45 4c 69 73 74 20 3d  pSrc;.  pEList =
98d0: 20 70 2d 3e 70 45 4c 69 73 74 3b 0a 0a 20 20 2f   p->pEList;..  /
98e0: 2a 20 4d 61 6b 65 20 73 75 72 65 20 63 75 72 73  * Make sure curs
98f0: 6f 72 20 6e 75 6d 62 65 72 73 20 68 61 76 65 20  or numbers have 
9900: 62 65 65 6e 20 61 73 73 69 67 6e 65 64 20 74 6f  been assigned to
9910: 20 61 6c 6c 20 65 6e 74 72 69 65 73 20 69 6e 0a   all entries in.
9920: 20 20 2a 2a 20 74 68 65 20 46 52 4f 4d 20 63 6c    ** the FROM cl
9930: 61 75 73 65 20 6f 66 20 74 68 65 20 53 45 4c 45  ause of the SELE
9940: 43 54 20 73 74 61 74 65 6d 65 6e 74 2e 0a 20 20  CT statement..  
9950: 2a 2f 0a 20 20 73 71 6c 69 74 65 33 53 72 63 4c  */.  sqlite3SrcL
9960: 69 73 74 41 73 73 69 67 6e 43 75 72 73 6f 72 73  istAssignCursors
9970: 28 70 50 61 72 73 65 2c 20 70 2d 3e 70 53 72 63  (pParse, p->pSrc
9980: 29 3b 0a 0a 20 20 2f 2a 20 4c 6f 6f 6b 20 75 70  );..  /* Look up
9990: 20 65 76 65 72 79 20 74 61 62 6c 65 20 6e 61 6d   every table nam
99a0: 65 64 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63  ed in the FROM c
99b0: 6c 61 75 73 65 20 6f 66 20 74 68 65 20 73 65 6c  lause of the sel
99c0: 65 63 74 2e 20 20 49 66 0a 20 20 2a 2a 20 61 6e  ect.  If.  ** an
99d0: 20 65 6e 74 72 79 20 6f 66 20 74 68 65 20 46 52   entry of the FR
99e0: 4f 4d 20 63 6c 61 75 73 65 20 69 73 20 61 20 73  OM clause is a s
99f0: 75 62 71 75 65 72 79 20 69 6e 73 74 65 61 64 20  ubquery instead 
9a00: 6f 66 20 61 20 74 61 62 6c 65 20 6f 72 20 76 69  of a table or vi
9a10: 65 77 2c 0a 20 20 2a 2a 20 74 68 65 6e 20 63 72  ew,.  ** then cr
9a20: 65 61 74 65 20 61 20 74 72 61 6e 73 69 65 6e 74  eate a transient
9a30: 20 74 61 62 6c 65 20 73 74 72 75 63 74 75 72 65   table structure
9a40: 20 74 6f 20 64 65 73 63 72 69 62 65 20 74 68 65   to describe the
9a50: 20 73 75 62 71 75 65 72 79 2e 0a 20 20 2a 2f 0a   subquery..  */.
9a60: 20 20 66 6f 72 28 69 3d 30 2c 20 70 46 72 6f 6d    for(i=0, pFrom
9a70: 3d 70 54 61 62 4c 69 73 74 2d 3e 61 3b 20 69 3c  =pTabList->a; i<
9a80: 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3b 20  pTabList->nSrc; 
9a90: 69 2b 2b 2c 20 70 46 72 6f 6d 2b 2b 29 7b 0a 20  i++, pFrom++){. 
9aa0: 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a     Table *pTab;.
9ab0: 20 20 20 20 69 66 28 20 70 46 72 6f 6d 2d 3e 70      if( pFrom->p
9ac0: 54 61 62 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  Tab!=0 ){.      
9ad0: 2f 2a 20 54 68 69 73 20 73 74 61 74 65 6d 65 6e  /* This statemen
9ae0: 74 20 68 61 73 20 61 6c 72 65 61 64 79 20 62 65  t has already be
9af0: 65 6e 20 70 72 65 70 61 72 65 64 2e 20 20 54 68  en prepared.  Th
9b00: 65 72 65 20 69 73 20 6e 6f 20 6e 65 65 64 0a 20  ere is no need. 
9b10: 20 20 20 20 20 2a 2a 20 74 6f 20 67 6f 20 66 75       ** to go fu
9b20: 72 74 68 65 72 2e 20 2a 2f 0a 20 20 20 20 20 20  rther. */.      
9b30: 61 73 73 65 72 74 28 20 69 3d 3d 30 20 29 3b 0a  assert( i==0 );.
9b40: 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a        return 0;.
9b50: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 46      }.    if( pF
9b60: 72 6f 6d 2d 3e 7a 4e 61 6d 65 3d 3d 30 20 29 7b  rom->zName==0 ){
9b70: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
9b80: 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 20 20  OMIT_SUBQUERY.  
9b90: 20 20 20 20 2f 2a 20 41 20 73 75 62 2d 71 75 65      /* A sub-que
9ba0: 72 79 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63  ry in the FROM c
9bb0: 6c 61 75 73 65 20 6f 66 20 61 20 53 45 4c 45 43  lause of a SELEC
9bc0: 54 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72  T */.      asser
9bd0: 74 28 20 70 46 72 6f 6d 2d 3e 70 53 65 6c 65 63  t( pFrom->pSelec
9be0: 74 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 69 66  t!=0 );.      if
9bf0: 28 20 70 46 72 6f 6d 2d 3e 7a 41 6c 69 61 73 3d  ( pFrom->zAlias=
9c00: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70 46  =0 ){.        pF
9c10: 72 6f 6d 2d 3e 7a 41 6c 69 61 73 20 3d 0a 20 20  rom->zAlias =.  
9c20: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 4d          sqlite3M
9c30: 50 72 69 6e 74 66 28 22 73 71 6c 69 74 65 5f 73  Printf("sqlite_s
9c40: 75 62 71 75 65 72 79 5f 25 70 5f 22 2c 20 28 76  ubquery_%p_", (v
9c50: 6f 69 64 2a 29 70 46 72 6f 6d 2d 3e 70 53 65 6c  oid*)pFrom->pSel
9c60: 65 63 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ect);.      }.  
9c70: 20 20 20 20 61 73 73 65 72 74 28 20 70 46 72 6f      assert( pFro
9c80: 6d 2d 3e 70 54 61 62 3d 3d 30 20 29 3b 0a 20 20  m->pTab==0 );.  
9c90: 20 20 20 20 70 46 72 6f 6d 2d 3e 70 54 61 62 20      pFrom->pTab 
9ca0: 3d 20 70 54 61 62 20 3d 20 0a 20 20 20 20 20 20  = pTab = .      
9cb0: 20 20 73 71 6c 69 74 65 33 52 65 73 75 6c 74 53    sqlite3ResultS
9cc0: 65 74 4f 66 53 65 6c 65 63 74 28 70 50 61 72 73  etOfSelect(pPars
9cd0: 65 2c 20 70 46 72 6f 6d 2d 3e 7a 41 6c 69 61 73  e, pFrom->zAlias
9ce0: 2c 20 70 46 72 6f 6d 2d 3e 70 53 65 6c 65 63 74  , pFrom->pSelect
9cf0: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 54 61  );.      if( pTa
9d00: 62 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  b==0 ){.        
9d10: 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 20 20  return 1;.      
9d20: 7d 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20 69  }.      /* The i
9d30: 73 45 70 68 65 6d 20 66 6c 61 67 20 69 6e 64 69  sEphem flag indi
9d40: 63 61 74 65 73 20 74 68 61 74 20 74 68 65 20 54  cates that the T
9d50: 61 62 6c 65 20 73 74 72 75 63 74 75 72 65 20 68  able structure h
9d60: 61 73 20 62 65 65 6e 0a 20 20 20 20 20 20 2a 2a  as been.      **
9d70: 20 64 79 6e 61 6d 69 63 61 6c 6c 79 20 61 6c 6c   dynamically all
9d80: 6f 63 61 74 65 64 20 61 6e 64 20 6d 61 79 20 62  ocated and may b
9d90: 65 20 66 72 65 65 64 20 61 74 20 61 6e 79 20 74  e freed at any t
9da0: 69 6d 65 2e 20 20 49 6e 20 6f 74 68 65 72 20 77  ime.  In other w
9db0: 6f 72 64 73 2c 0a 20 20 20 20 20 20 2a 2a 20 70  ords,.      ** p
9dc0: 54 61 62 20 69 73 20 6e 6f 74 20 70 6f 69 6e 74  Tab is not point
9dd0: 69 6e 67 20 74 6f 20 61 20 70 65 72 73 69 73 74  ing to a persist
9de0: 65 6e 74 20 74 61 62 6c 65 20 73 74 72 75 63 74  ent table struct
9df0: 75 72 65 20 74 68 61 74 20 64 65 66 69 6e 65 73  ure that defines
9e00: 0a 20 20 20 20 20 20 2a 2a 20 70 61 72 74 20 6f  .      ** part o
9e10: 66 20 74 68 65 20 73 63 68 65 6d 61 2e 20 2a 2f  f the schema. */
9e20: 0a 20 20 20 20 20 20 70 54 61 62 2d 3e 69 73 45  .      pTab->isE
9e30: 70 68 65 6d 20 3d 20 31 3b 0a 23 65 6e 64 69 66  phem = 1;.#endif
9e40: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
9e50: 20 20 2f 2a 20 41 6e 20 6f 72 64 69 6e 61 72 79    /* An ordinary
9e60: 20 74 61 62 6c 65 20 6f 72 20 76 69 65 77 20 6e   table or view n
9e70: 61 6d 65 20 69 6e 20 74 68 65 20 46 52 4f 4d 20  ame in the FROM 
9e80: 63 6c 61 75 73 65 20 2a 2f 0a 20 20 20 20 20 20  clause */.      
9e90: 61 73 73 65 72 74 28 20 70 46 72 6f 6d 2d 3e 70  assert( pFrom->p
9ea0: 54 61 62 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  Tab==0 );.      
9eb0: 70 46 72 6f 6d 2d 3e 70 54 61 62 20 3d 20 70 54  pFrom->pTab = pT
9ec0: 61 62 20 3d 20 0a 20 20 20 20 20 20 20 20 73 71  ab = .        sq
9ed0: 6c 69 74 65 33 4c 6f 63 61 74 65 54 61 62 6c 65  lite3LocateTable
9ee0: 28 70 50 61 72 73 65 2c 70 46 72 6f 6d 2d 3e 7a  (pParse,pFrom->z
9ef0: 4e 61 6d 65 2c 70 46 72 6f 6d 2d 3e 7a 44 61 74  Name,pFrom->zDat
9f00: 61 62 61 73 65 29 3b 0a 20 20 20 20 20 20 69 66  abase);.      if
9f10: 28 20 70 54 61 62 3d 3d 30 20 29 7b 0a 20 20 20  ( pTab==0 ){.   
9f20: 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20       return 1;. 
9f30: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 54 61       }.      pTa
9f40: 62 2d 3e 6e 52 65 66 2b 2b 3b 0a 23 69 66 20 21  b->nRef++;.#if !
9f50: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
9f60: 4d 49 54 5f 56 49 45 57 29 20 7c 7c 20 21 64 65  MIT_VIEW) || !de
9f70: 66 69 6e 65 64 20 28 53 51 4c 49 54 45 5f 4f 4d  fined (SQLITE_OM
9f80: 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 29  IT_VIRTUALTABLE)
9f90: 0a 20 20 20 20 20 20 69 66 28 20 70 54 61 62 2d  .      if( pTab-
9fa0: 3e 70 53 65 6c 65 63 74 20 7c 7c 20 49 73 56 69  >pSelect || IsVi
9fb0: 72 74 75 61 6c 28 70 54 61 62 29 20 29 7b 0a 20  rtual(pTab) ){. 
9fc0: 20 20 20 20 20 20 20 2f 2a 20 57 65 20 72 65 61         /* We rea
9fd0: 63 68 20 68 65 72 65 20 69 66 20 74 68 65 20 6e  ch here if the n
9fe0: 61 6d 65 64 20 74 61 62 6c 65 20 69 73 20 61 20  amed table is a 
9ff0: 72 65 61 6c 6c 79 20 61 20 76 69 65 77 20 2a 2f  really a view */
a000: 0a 20 20 20 20 20 20 20 20 69 66 28 20 73 71 6c  .        if( sql
a010: 69 74 65 33 56 69 65 77 47 65 74 43 6f 6c 75 6d  ite3ViewGetColum
a020: 6e 4e 61 6d 65 73 28 70 50 61 72 73 65 2c 20 70  nNames(pParse, p
a030: 54 61 62 29 20 29 7b 0a 20 20 20 20 20 20 20 20  Tab) ){.        
a040: 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20    return 1;.    
a050: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 2f 2a      }.        /*
a060: 20 49 66 20 70 46 72 6f 6d 2d 3e 70 53 65 6c 65   If pFrom->pSele
a070: 63 74 21 3d 30 20 69 74 20 6d 65 61 6e 73 20 77  ct!=0 it means w
a080: 65 20 61 72 65 20 64 65 61 6c 69 6e 67 20 77 69  e are dealing wi
a090: 74 68 20 61 0a 20 20 20 20 20 20 20 20 2a 2a 20  th a.        ** 
a0a0: 76 69 65 77 20 77 69 74 68 69 6e 20 61 20 76 69  view within a vi
a0b0: 65 77 2e 20 20 54 68 65 20 53 45 4c 45 43 54 20  ew.  The SELECT 
a0c0: 73 74 72 75 63 74 75 72 65 20 68 61 73 20 61 6c  structure has al
a0d0: 72 65 61 64 79 20 62 65 65 6e 0a 20 20 20 20 20  ready been.     
a0e0: 20 20 20 2a 2a 20 63 6f 70 69 65 64 20 62 79 20     ** copied by 
a0f0: 74 68 65 20 6f 75 74 65 72 20 76 69 65 77 20 73  the outer view s
a100: 6f 20 77 65 20 63 61 6e 20 73 6b 69 70 20 74 68  o we can skip th
a110: 65 20 63 6f 70 79 20 73 74 65 70 20 68 65 72 65  e copy step here
a120: 0a 20 20 20 20 20 20 20 20 2a 2a 20 69 6e 20 74  .        ** in t
a130: 68 65 20 69 6e 6e 65 72 20 76 69 65 77 2e 0a 20  he inner view.. 
a140: 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
a150: 20 20 69 66 28 20 70 46 72 6f 6d 2d 3e 70 53 65    if( pFrom->pSe
a160: 6c 65 63 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20  lect==0 ){.     
a170: 20 20 20 20 20 70 46 72 6f 6d 2d 3e 70 53 65 6c       pFrom->pSel
a180: 65 63 74 20 3d 20 73 71 6c 69 74 65 33 53 65 6c  ect = sqlite3Sel
a190: 65 63 74 44 75 70 28 64 62 2c 20 70 54 61 62 2d  ectDup(db, pTab-
a1a0: 3e 70 53 65 6c 65 63 74 29 3b 0a 20 20 20 20 20  >pSelect);.     
a1b0: 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 23 65 6e     }.      }.#en
a1c0: 64 69 66 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  dif.    }.  }.. 
a1d0: 20 2f 2a 20 50 72 6f 63 65 73 73 20 4e 41 54 55   /* Process NATU
a1e0: 52 41 4c 20 6b 65 79 77 6f 72 64 73 2c 20 61 6e  RAL keywords, an
a1f0: 64 20 4f 4e 20 61 6e 64 20 55 53 49 4e 47 20 63  d ON and USING c
a200: 6c 61 75 73 65 73 20 6f 66 20 6a 6f 69 6e 73 2e  lauses of joins.
a210: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 73 71 6c 69  .  */.  if( sqli
a220: 74 65 50 72 6f 63 65 73 73 4a 6f 69 6e 28 70 50  teProcessJoin(pP
a230: 61 72 73 65 2c 20 70 29 20 29 20 72 65 74 75 72  arse, p) ) retur
a240: 6e 20 31 3b 0a 0a 20 20 2f 2a 20 46 6f 72 20 65  n 1;..  /* For e
a250: 76 65 72 79 20 22 2a 22 20 74 68 61 74 20 6f 63  very "*" that oc
a260: 63 75 72 73 20 69 6e 20 74 68 65 20 63 6f 6c 75  curs in the colu
a270: 6d 6e 20 6c 69 73 74 2c 20 69 6e 73 65 72 74 20  mn list, insert 
a280: 74 68 65 20 6e 61 6d 65 73 20 6f 66 0a 20 20 2a  the names of.  *
a290: 2a 20 61 6c 6c 20 63 6f 6c 75 6d 6e 73 20 69 6e  * all columns in
a2a0: 20 61 6c 6c 20 74 61 62 6c 65 73 2e 20 20 41 6e   all tables.  An
a2b0: 64 20 66 6f 72 20 65 76 65 72 79 20 54 41 42 4c  d for every TABL
a2c0: 45 2e 2a 20 69 6e 73 65 72 74 20 74 68 65 20 6e  E.* insert the n
a2d0: 61 6d 65 73 0a 20 20 2a 2a 20 6f 66 20 61 6c 6c  ames.  ** of all
a2e0: 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 54 41 42 4c   columns in TABL
a2f0: 45 2e 20 20 54 68 65 20 70 61 72 73 65 72 20 69  E.  The parser i
a300: 6e 73 65 72 74 65 64 20 61 20 73 70 65 63 69 61  nserted a specia
a310: 6c 20 65 78 70 72 65 73 73 69 6f 6e 0a 20 20 2a  l expression.  *
a320: 2a 20 77 69 74 68 20 74 68 65 20 54 4b 5f 41 4c  * with the TK_AL
a330: 4c 20 6f 70 65 72 61 74 6f 72 20 66 6f 72 20 65  L operator for e
a340: 61 63 68 20 22 2a 22 20 74 68 61 74 20 69 74 20  ach "*" that it 
a350: 66 6f 75 6e 64 20 69 6e 20 74 68 65 20 63 6f 6c  found in the col
a360: 75 6d 6e 20 6c 69 73 74 2e 0a 20 20 2a 2a 20 54  umn list..  ** T
a370: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 6f 64  he following cod
a380: 65 20 6a 75 73 74 20 68 61 73 20 74 6f 20 6c 6f  e just has to lo
a390: 63 61 74 65 20 74 68 65 20 54 4b 5f 41 4c 4c 20  cate the TK_ALL 
a3a0: 65 78 70 72 65 73 73 69 6f 6e 73 20 61 6e 64 20  expressions and 
a3b0: 65 78 70 61 6e 64 0a 20 20 2a 2a 20 65 61 63 68  expand.  ** each
a3c0: 20 6f 6e 65 20 74 6f 20 74 68 65 20 6c 69 73 74   one to the list
a3d0: 20 6f 66 20 61 6c 6c 20 63 6f 6c 75 6d 6e 73 20   of all columns 
a3e0: 69 6e 20 61 6c 6c 20 74 61 62 6c 65 73 2e 0a 20  in all tables.. 
a3f0: 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 66 69 72   **.  ** The fir
a400: 73 74 20 6c 6f 6f 70 20 6a 75 73 74 20 63 68 65  st loop just che
a410: 63 6b 73 20 74 6f 20 73 65 65 20 69 66 20 74 68  cks to see if th
a420: 65 72 65 20 61 72 65 20 61 6e 79 20 22 2a 22 20  ere are any "*" 
a430: 6f 70 65 72 61 74 6f 72 73 0a 20 20 2a 2a 20 74  operators.  ** t
a440: 68 61 74 20 6e 65 65 64 20 65 78 70 61 6e 64 69  hat need expandi
a450: 6e 67 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 6b  ng..  */.  for(k
a460: 3d 30 3b 20 6b 3c 70 45 4c 69 73 74 2d 3e 6e 45  =0; k<pEList->nE
a470: 78 70 72 3b 20 6b 2b 2b 29 7b 0a 20 20 20 20 45  xpr; k++){.    E
a480: 78 70 72 20 2a 70 45 20 3d 20 70 45 4c 69 73 74  xpr *pE = pEList
a490: 2d 3e 61 5b 6b 5d 2e 70 45 78 70 72 3b 0a 20 20  ->a[k].pExpr;.  
a4a0: 20 20 69 66 28 20 70 45 2d 3e 6f 70 3d 3d 54 4b    if( pE->op==TK
a4b0: 5f 41 4c 4c 20 29 20 62 72 65 61 6b 3b 0a 20 20  _ALL ) break;.  
a4c0: 20 20 69 66 28 20 70 45 2d 3e 6f 70 3d 3d 54 4b    if( pE->op==TK
a4d0: 5f 44 4f 54 20 26 26 20 70 45 2d 3e 70 52 69 67  _DOT && pE->pRig
a4e0: 68 74 20 26 26 20 70 45 2d 3e 70 52 69 67 68 74  ht && pE->pRight
a4f0: 2d 3e 6f 70 3d 3d 54 4b 5f 41 4c 4c 0a 20 20 20  ->op==TK_ALL.   
a500: 20 20 20 20 20 20 26 26 20 70 45 2d 3e 70 4c 65        && pE->pLe
a510: 66 74 20 26 26 20 70 45 2d 3e 70 4c 65 66 74 2d  ft && pE->pLeft-
a520: 3e 6f 70 3d 3d 54 4b 5f 49 44 20 29 20 62 72 65  >op==TK_ID ) bre
a530: 61 6b 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 30  ak;.  }.  rc = 0
a540: 3b 0a 20 20 69 66 28 20 6b 3c 70 45 4c 69 73 74  ;.  if( k<pEList
a550: 2d 3e 6e 45 78 70 72 20 29 7b 0a 20 20 20 20 2f  ->nExpr ){.    /
a560: 2a 0a 20 20 20 20 2a 2a 20 49 66 20 77 65 20 67  *.    ** If we g
a570: 65 74 20 68 65 72 65 20 69 74 20 6d 65 61 6e 73  et here it means
a580: 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 20   the result set 
a590: 63 6f 6e 74 61 69 6e 73 20 6f 6e 65 20 6f 72 20  contains one or 
a5a0: 6d 6f 72 65 20 22 2a 22 0a 20 20 20 20 2a 2a 20  more "*".    ** 
a5b0: 6f 70 65 72 61 74 6f 72 73 20 74 68 61 74 20 6e  operators that n
a5c0: 65 65 64 20 74 6f 20 62 65 20 65 78 70 61 6e 64  eed to be expand
a5d0: 65 64 2e 20 20 4c 6f 6f 70 20 74 68 72 6f 75 67  ed.  Loop throug
a5e0: 68 20 65 61 63 68 20 65 78 70 72 65 73 73 69 6f  h each expressio
a5f0: 6e 0a 20 20 20 20 2a 2a 20 69 6e 20 74 68 65 20  n.    ** in the 
a600: 72 65 73 75 6c 74 20 73 65 74 20 61 6e 64 20 65  result set and e
a610: 78 70 61 6e 64 20 74 68 65 6d 20 6f 6e 65 20 62  xpand them one b
a620: 79 20 6f 6e 65 2e 0a 20 20 20 20 2a 2f 0a 20 20  y one..    */.  
a630: 20 20 73 74 72 75 63 74 20 45 78 70 72 4c 69 73    struct ExprLis
a640: 74 5f 69 74 65 6d 20 2a 61 20 3d 20 70 45 4c 69  t_item *a = pELi
a650: 73 74 2d 3e 61 3b 0a 20 20 20 20 45 78 70 72 4c  st->a;.    ExprL
a660: 69 73 74 20 2a 70 4e 65 77 20 3d 20 30 3b 0a 20  ist *pNew = 0;. 
a670: 20 20 20 69 6e 74 20 66 6c 61 67 73 20 3d 20 70     int flags = p
a680: 50 61 72 73 65 2d 3e 64 62 2d 3e 66 6c 61 67 73  Parse->db->flags
a690: 3b 0a 20 20 20 20 69 6e 74 20 6c 6f 6e 67 4e 61  ;.    int longNa
a6a0: 6d 65 73 20 3d 20 28 66 6c 61 67 73 20 26 20 53  mes = (flags & S
a6b0: 51 4c 49 54 45 5f 46 75 6c 6c 43 6f 6c 4e 61 6d  QLITE_FullColNam
a6c0: 65 73 29 21 3d 30 20 26 26 0a 20 20 20 20 20 20  es)!=0 &&.      
a6d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a6e0: 28 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f  (flags & SQLITE_
a6f0: 53 68 6f 72 74 43 6f 6c 4e 61 6d 65 73 29 3d 3d  ShortColNames)==
a700: 30 3b 0a 0a 20 20 20 20 66 6f 72 28 6b 3d 30 3b  0;..    for(k=0;
a710: 20 6b 3c 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72   k<pEList->nExpr
a720: 3b 20 6b 2b 2b 29 7b 0a 20 20 20 20 20 20 45 78  ; k++){.      Ex
a730: 70 72 20 2a 70 45 20 3d 20 61 5b 6b 5d 2e 70 45  pr *pE = a[k].pE
a740: 78 70 72 3b 0a 20 20 20 20 20 20 69 66 28 20 70  xpr;.      if( p
a750: 45 2d 3e 6f 70 21 3d 54 4b 5f 41 4c 4c 20 26 26  E->op!=TK_ALL &&
a760: 0a 20 20 20 20 20 20 20 20 20 20 20 28 70 45 2d  .           (pE-
a770: 3e 6f 70 21 3d 54 4b 5f 44 4f 54 20 7c 7c 20 70  >op!=TK_DOT || p
a780: 45 2d 3e 70 52 69 67 68 74 3d 3d 30 20 7c 7c 20  E->pRight==0 || 
a790: 70 45 2d 3e 70 52 69 67 68 74 2d 3e 6f 70 21 3d  pE->pRight->op!=
a7a0: 54 4b 5f 41 4c 4c 29 20 29 7b 0a 20 20 20 20 20  TK_ALL) ){.     
a7b0: 20 20 20 2f 2a 20 54 68 69 73 20 70 61 72 74 69     /* This parti
a7c0: 63 75 6c 61 72 20 65 78 70 72 65 73 73 69 6f 6e  cular expression
a7d0: 20 64 6f 65 73 20 6e 6f 74 20 6e 65 65 64 20 74   does not need t
a7e0: 6f 20 62 65 20 65 78 70 61 6e 64 65 64 2e 0a 20  o be expanded.. 
a7f0: 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
a800: 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33    pNew = sqlite3
a810: 45 78 70 72 4c 69 73 74 41 70 70 65 6e 64 28 70  ExprListAppend(p
a820: 50 61 72 73 65 2c 20 70 4e 65 77 2c 20 61 5b 6b  Parse, pNew, a[k
a830: 5d 2e 70 45 78 70 72 2c 20 30 29 3b 0a 20 20 20  ].pExpr, 0);.   
a840: 20 20 20 20 20 69 66 28 20 70 4e 65 77 20 29 7b       if( pNew ){
a850: 0a 20 20 20 20 20 20 20 20 20 20 70 4e 65 77 2d  .          pNew-
a860: 3e 61 5b 70 4e 65 77 2d 3e 6e 45 78 70 72 2d 31  >a[pNew->nExpr-1
a870: 5d 2e 7a 4e 61 6d 65 20 3d 20 61 5b 6b 5d 2e 7a  ].zName = a[k].z
a880: 4e 61 6d 65 3b 0a 20 20 20 20 20 20 20 20 7d 65  Name;.        }e
a890: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 72  lse{.          r
a8a0: 63 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 7d  c = 1;.        }
a8b0: 0a 20 20 20 20 20 20 20 20 61 5b 6b 5d 2e 70 45  .        a[k].pE
a8c0: 78 70 72 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  xpr = 0;.       
a8d0: 20 61 5b 6b 5d 2e 7a 4e 61 6d 65 20 3d 20 30 3b   a[k].zName = 0;
a8e0: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
a8f0: 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20 65 78        /* This ex
a900: 70 72 65 73 73 69 6f 6e 20 69 73 20 61 20 22 2a  pression is a "*
a910: 22 20 6f 72 20 61 20 22 54 41 42 4c 45 2e 2a 22  " or a "TABLE.*"
a920: 20 61 6e 64 20 6e 65 65 64 73 20 74 6f 20 62 65   and needs to be
a930: 0a 20 20 20 20 20 20 20 20 2a 2a 20 65 78 70 61  .        ** expa
a940: 6e 64 65 64 2e 20 2a 2f 0a 20 20 20 20 20 20 20  nded. */.       
a950: 20 69 6e 74 20 74 61 62 6c 65 53 65 65 6e 20 3d   int tableSeen =
a960: 20 30 3b 20 20 20 20 20 20 2f 2a 20 53 65 74 20   0;      /* Set 
a970: 74 6f 20 31 20 77 68 65 6e 20 54 41 42 4c 45 20  to 1 when TABLE 
a980: 6d 61 74 63 68 65 73 20 2a 2f 0a 20 20 20 20 20  matches */.     
a990: 20 20 20 63 68 61 72 20 2a 7a 54 4e 61 6d 65 3b     char *zTName;
a9a0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 74              /* t
a9b0: 65 78 74 20 6f 66 20 6e 61 6d 65 20 6f 66 20 54  ext of name of T
a9c0: 41 42 4c 45 20 2a 2f 0a 20 20 20 20 20 20 20 20  ABLE */.        
a9d0: 69 66 28 20 70 45 2d 3e 6f 70 3d 3d 54 4b 5f 44  if( pE->op==TK_D
a9e0: 4f 54 20 26 26 20 70 45 2d 3e 70 4c 65 66 74 20  OT && pE->pLeft 
a9f0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 7a 54 4e  ){.          zTN
aa00: 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d  ame = sqlite3Nam
aa10: 65 46 72 6f 6d 54 6f 6b 65 6e 28 64 62 2c 20 26  eFromToken(db, &
aa20: 70 45 2d 3e 70 4c 65 66 74 2d 3e 74 6f 6b 65 6e  pE->pLeft->token
aa30: 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  );.        }else
aa40: 7b 0a 20 20 20 20 20 20 20 20 20 20 7a 54 4e 61  {.          zTNa
aa50: 6d 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  me = 0;.        
aa60: 7d 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d  }.        for(i=
aa70: 30 2c 20 70 46 72 6f 6d 3d 70 54 61 62 4c 69 73  0, pFrom=pTabLis
aa80: 74 2d 3e 61 3b 20 69 3c 70 54 61 62 4c 69 73 74  t->a; i<pTabList
aa90: 2d 3e 6e 53 72 63 3b 20 69 2b 2b 2c 20 70 46 72  ->nSrc; i++, pFr
aaa0: 6f 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20  om++){.         
aab0: 20 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 70   Table *pTab = p
aac0: 46 72 6f 6d 2d 3e 70 54 61 62 3b 0a 20 20 20 20  From->pTab;.    
aad0: 20 20 20 20 20 20 63 68 61 72 20 2a 7a 54 61 62        char *zTab
aae0: 4e 61 6d 65 20 3d 20 70 46 72 6f 6d 2d 3e 7a 41  Name = pFrom->zA
aaf0: 6c 69 61 73 3b 0a 20 20 20 20 20 20 20 20 20 20  lias;.          
ab00: 69 66 28 20 7a 54 61 62 4e 61 6d 65 3d 3d 30 20  if( zTabName==0 
ab10: 7c 7c 20 7a 54 61 62 4e 61 6d 65 5b 30 5d 3d 3d  || zTabName[0]==
ab20: 30 20 29 7b 20 0a 20 20 20 20 20 20 20 20 20 20  0 ){ .          
ab30: 20 20 7a 54 61 62 4e 61 6d 65 20 3d 20 70 54 61    zTabName = pTa
ab40: 62 2d 3e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20  b->zName;.      
ab50: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
ab60: 69 66 28 20 7a 54 4e 61 6d 65 20 26 26 20 28 7a  if( zTName && (z
ab70: 54 61 62 4e 61 6d 65 3d 3d 30 20 7c 7c 20 7a 54  TabName==0 || zT
ab80: 61 62 4e 61 6d 65 5b 30 5d 3d 3d 30 20 7c 7c 20  abName[0]==0 || 
ab90: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
aba0: 20 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70    sqlite3StrICmp
abb0: 28 7a 54 4e 61 6d 65 2c 20 7a 54 61 62 4e 61 6d  (zTName, zTabNam
abc0: 65 29 21 3d 30 29 20 29 7b 0a 20 20 20 20 20 20  e)!=0) ){.      
abd0: 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a        continue;.
abe0: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
abf0: 20 20 20 20 20 20 74 61 62 6c 65 53 65 65 6e 20        tableSeen 
ac00: 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20 66  = 1;.          f
ac10: 6f 72 28 6a 3d 30 3b 20 6a 3c 70 54 61 62 2d 3e  or(j=0; j<pTab->
ac20: 6e 43 6f 6c 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20  nCol; j++){.    
ac30: 20 20 20 20 20 20 20 20 45 78 70 72 20 2a 70 45          Expr *pE
ac40: 78 70 72 2c 20 2a 70 52 69 67 68 74 3b 0a 20 20  xpr, *pRight;.  
ac50: 20 20 20 20 20 20 20 20 20 20 63 68 61 72 20 2a            char *
ac60: 7a 4e 61 6d 65 20 3d 20 70 54 61 62 2d 3e 61 43  zName = pTab->aC
ac70: 6f 6c 5b 6a 5d 2e 7a 4e 61 6d 65 3b 0a 0a 20 20  ol[j].zName;..  
ac80: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20            /* If 
ac90: 61 20 63 6f 6c 75 6d 6e 20 69 73 20 6d 61 72 6b  a column is mark
aca0: 65 64 20 61 73 20 27 68 69 64 64 65 6e 27 20 28  ed as 'hidden' (
acb0: 63 75 72 72 65 6e 74 6c 79 20 6f 6e 6c 79 20 70  currently only p
acc0: 6f 73 73 69 62 6c 65 0a 20 20 20 20 20 20 20 20  ossible.        
acd0: 20 20 20 20 2a 2a 20 66 6f 72 20 76 69 72 74 75      ** for virtu
ace0: 61 6c 20 74 61 62 6c 65 73 29 2c 20 64 6f 20 6e  al tables), do n
acf0: 6f 74 20 69 6e 63 6c 75 64 65 20 69 74 20 69 6e  ot include it in
ad00: 20 74 68 65 20 65 78 70 61 6e 64 65 64 0a 20 20   the expanded.  
ad10: 20 20 20 20 20 20 20 20 20 20 2a 2a 20 72 65 73            ** res
ad20: 75 6c 74 2d 73 65 74 20 6c 69 73 74 2e 0a 20 20  ult-set list..  
ad30: 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20            */.   
ad40: 20 20 20 20 20 20 20 20 20 69 66 28 20 49 73 48           if( IsH
ad50: 69 64 64 65 6e 43 6f 6c 75 6d 6e 28 26 70 54 61  iddenColumn(&pTa
ad60: 62 2d 3e 61 43 6f 6c 5b 6a 5d 29 20 29 7b 0a 20  b->aCol[j]) ){. 
ad70: 20 20 20 20 20 20 20 20 20 20 20 20 20 61 73 73               ass
ad80: 65 72 74 28 49 73 56 69 72 74 75 61 6c 28 70 54  ert(IsVirtual(pT
ad90: 61 62 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ab));.          
ada0: 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20      continue;.  
adb0: 20 20 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20            }..   
adc0: 20 20 20 20 20 20 20 20 20 69 66 28 20 69 3e 30           if( i>0
add0: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
ade0: 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74    struct SrcList
adf0: 5f 69 74 65 6d 20 2a 70 4c 65 66 74 20 3d 20 26  _item *pLeft = &
ae00: 70 54 61 62 4c 69 73 74 2d 3e 61 5b 69 2d 31 5d  pTabList->a[i-1]
ae10: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
ae20: 69 66 28 20 28 70 4c 65 66 74 5b 31 5d 2e 6a 6f  if( (pLeft[1].jo
ae30: 69 6e 74 79 70 65 20 26 20 4a 54 5f 4e 41 54 55  intype & JT_NATU
ae40: 52 41 4c 29 21 3d 30 20 26 26 0a 20 20 20 20 20  RAL)!=0 &&.     
ae50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ae60: 20 20 20 63 6f 6c 75 6d 6e 49 6e 64 65 78 28 70     columnIndex(p
ae70: 4c 65 66 74 2d 3e 70 54 61 62 2c 20 7a 4e 61 6d  Left->pTab, zNam
ae80: 65 29 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  e)>=0 ){.       
ae90: 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 20 61           /* In a
aea0: 20 4e 41 54 55 52 41 4c 20 6a 6f 69 6e 2c 20 6f   NATURAL join, o
aeb0: 6d 69 74 20 74 68 65 20 6a 6f 69 6e 20 63 6f 6c  mit the join col
aec0: 75 6d 6e 73 20 66 72 6f 6d 20 74 68 65 20 0a 20  umns from the . 
aed0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2a                 *
aee0: 2a 20 74 61 62 6c 65 20 6f 6e 20 74 68 65 20 72  * table on the r
aef0: 69 67 68 74 20 2a 2f 0a 20 20 20 20 20 20 20 20  ight */.        
af00: 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65          continue
af10: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
af20: 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  }.              
af30: 69 66 28 20 73 71 6c 69 74 65 33 49 64 4c 69 73  if( sqlite3IdLis
af40: 74 49 6e 64 65 78 28 70 4c 65 66 74 5b 31 5d 2e  tIndex(pLeft[1].
af50: 70 55 73 69 6e 67 2c 20 7a 4e 61 6d 65 29 3e 3d  pUsing, zName)>=
af60: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  0 ){.           
af70: 20 20 20 20 20 2f 2a 20 49 6e 20 61 20 6a 6f 69       /* In a joi
af80: 6e 20 77 69 74 68 20 61 20 55 53 49 4e 47 20 63  n with a USING c
af90: 6c 61 75 73 65 2c 20 6f 6d 69 74 20 63 6f 6c 75  lause, omit colu
afa0: 6d 6e 73 20 69 6e 20 74 68 65 0a 20 20 20 20 20  mns in the.     
afb0: 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 75 73             ** us
afc0: 69 6e 67 20 63 6c 61 75 73 65 20 66 72 6f 6d 20  ing clause from 
afd0: 74 68 65 20 74 61 62 6c 65 20 6f 6e 20 74 68 65  the table on the
afe0: 20 72 69 67 68 74 2e 20 2a 2f 0a 20 20 20 20 20   right. */.     
aff0: 20 20 20 20 20 20 20 20 20 20 20 63 6f 6e 74 69             conti
b000: 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20  nue;.           
b010: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20     }.           
b020: 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 70   }.            p
b030: 52 69 67 68 74 20 3d 20 73 71 6c 69 74 65 33 45  Right = sqlite3E
b040: 78 70 72 28 54 4b 5f 49 44 2c 20 30 2c 20 30 2c  xpr(TK_ID, 0, 0,
b050: 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20   0);.           
b060: 20 69 66 28 20 70 52 69 67 68 74 3d 3d 30 20 29   if( pRight==0 )
b070: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
b080: 20 20 20 20 73 65 74 51 75 6f 74 65 64 54 6f 6b      setQuotedTok
b090: 65 6e 28 26 70 52 69 67 68 74 2d 3e 74 6f 6b 65  en(&pRight->toke
b0a0: 6e 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20  n, zName);.     
b0b0: 20 20 20 20 20 20 20 69 66 28 20 7a 54 61 62 4e         if( zTabN
b0c0: 61 6d 65 20 26 26 20 28 6c 6f 6e 67 4e 61 6d 65  ame && (longName
b0d0: 73 20 7c 7c 20 70 54 61 62 4c 69 73 74 2d 3e 6e  s || pTabList->n
b0e0: 53 72 63 3e 31 29 20 29 7b 0a 20 20 20 20 20 20  Src>1) ){.      
b0f0: 20 20 20 20 20 20 20 20 45 78 70 72 20 2a 70 4c          Expr *pL
b100: 65 66 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70  eft = sqlite3Exp
b110: 72 28 54 4b 5f 49 44 2c 20 30 2c 20 30 2c 20 30  r(TK_ID, 0, 0, 0
b120: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  );.             
b130: 20 70 45 78 70 72 20 3d 20 73 71 6c 69 74 65 33   pExpr = sqlite3
b140: 45 78 70 72 28 54 4b 5f 44 4f 54 2c 20 70 4c 65  Expr(TK_DOT, pLe
b150: 66 74 2c 20 70 52 69 67 68 74 2c 20 30 29 3b 0a  ft, pRight, 0);.
b160: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66                if
b170: 28 20 70 45 78 70 72 3d 3d 30 20 29 20 62 72 65  ( pExpr==0 ) bre
b180: 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ak;.            
b190: 20 20 73 65 74 51 75 6f 74 65 64 54 6f 6b 65 6e    setQuotedToken
b1a0: 28 26 70 4c 65 66 74 2d 3e 74 6f 6b 65 6e 2c 20  (&pLeft->token, 
b1b0: 7a 54 61 62 4e 61 6d 65 29 3b 0a 20 20 20 20 20  zTabName);.     
b1c0: 20 20 20 20 20 20 20 20 20 73 65 74 54 6f 6b 65           setToke
b1d0: 6e 28 26 70 45 78 70 72 2d 3e 73 70 61 6e 2c 20  n(&pExpr->span, 
b1e0: 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 22  sqlite3MPrintf("
b1f0: 25 73 2e 25 73 22 2c 20 7a 54 61 62 4e 61 6d 65  %s.%s", zTabName
b200: 2c 20 7a 4e 61 6d 65 29 29 3b 0a 20 20 20 20 20  , zName));.     
b210: 20 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e           pExpr->
b220: 73 70 61 6e 2e 64 79 6e 20 3d 20 31 3b 0a 20 20  span.dyn = 1;.  
b230: 20 20 20 20 20 20 20 20 20 20 20 20 70 45 78 70              pExp
b240: 72 2d 3e 74 6f 6b 65 6e 2e 7a 20 3d 20 30 3b 0a  r->token.z = 0;.
b250: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 45                pE
b260: 78 70 72 2d 3e 74 6f 6b 65 6e 2e 6e 20 3d 20 30  xpr->token.n = 0
b270: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
b280: 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 64 79 6e  pExpr->token.dyn
b290: 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20   = 0;.          
b2a0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
b2b0: 20 20 20 20 20 20 20 70 45 78 70 72 20 3d 20 70         pExpr = p
b2c0: 52 69 67 68 74 3b 0a 20 20 20 20 20 20 20 20 20  Right;.         
b2d0: 20 20 20 20 20 70 45 78 70 72 2d 3e 73 70 61 6e       pExpr->span
b2e0: 20 3d 20 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 3b   = pExpr->token;
b2f0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70  .              p
b300: 45 78 70 72 2d 3e 73 70 61 6e 2e 64 79 6e 20 3d  Expr->span.dyn =
b310: 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20   0;.            
b320: 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  }.            if
b330: 28 20 6c 6f 6e 67 4e 61 6d 65 73 20 29 7b 0a 20  ( longNames ){. 
b340: 20 20 20 20 20 20 20 20 20 20 20 20 20 70 4e 65               pNe
b350: 77 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c  w = sqlite3ExprL
b360: 69 73 74 41 70 70 65 6e 64 28 70 50 61 72 73 65  istAppend(pParse
b370: 2c 20 70 4e 65 77 2c 20 70 45 78 70 72 2c 20 26  , pNew, pExpr, &
b380: 70 45 78 70 72 2d 3e 73 70 61 6e 29 3b 0a 20 20  pExpr->span);.  
b390: 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b            }else{
b3a0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70  .              p
b3b0: 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 45 78 70  New = sqlite3Exp
b3c0: 72 4c 69 73 74 41 70 70 65 6e 64 28 70 50 61 72  rListAppend(pPar
b3d0: 73 65 2c 20 70 4e 65 77 2c 20 70 45 78 70 72 2c  se, pNew, pExpr,
b3e0: 20 26 70 52 69 67 68 74 2d 3e 74 6f 6b 65 6e 29   &pRight->token)
b3f0: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a  ;.            }.
b400: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
b410: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66      }.        if
b420: 28 20 21 74 61 62 6c 65 53 65 65 6e 20 29 7b 0a  ( !tableSeen ){.
b430: 20 20 20 20 20 20 20 20 20 20 69 66 28 20 7a 54            if( zT
b440: 4e 61 6d 65 20 29 7b 0a 20 20 20 20 20 20 20 20  Name ){.        
b450: 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
b460: 4d 73 67 28 70 50 61 72 73 65 2c 20 22 6e 6f 20  Msg(pParse, "no 
b470: 73 75 63 68 20 74 61 62 6c 65 3a 20 25 73 22 2c  such table: %s",
b480: 20 7a 54 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20   zTName);.      
b490: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
b4a0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72         sqlite3Er
b4b0: 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
b4c0: 6e 6f 20 74 61 62 6c 65 73 20 73 70 65 63 69 66  no tables specif
b4d0: 69 65 64 22 29 3b 0a 20 20 20 20 20 20 20 20 20  ied");.         
b4e0: 20 7d 0a 20 20 20 20 20 20 20 20 20 20 72 63 20   }.          rc 
b4f0: 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  = 1;.        }. 
b500: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66         sqlite3_f
b510: 72 65 65 28 7a 54 4e 61 6d 65 29 3b 0a 20 20 20  ree(zTName);.   
b520: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73     }.    }.    s
b530: 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 65  qlite3ExprListDe
b540: 6c 65 74 65 28 70 45 4c 69 73 74 29 3b 0a 20 20  lete(pEList);.  
b550: 20 20 70 2d 3e 70 45 4c 69 73 74 20 3d 20 70 4e    p->pEList = pN
b560: 65 77 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d  ew;.  }.  if( p-
b570: 3e 70 45 4c 69 73 74 20 26 26 20 70 2d 3e 70 45  >pEList && p->pE
b580: 4c 69 73 74 2d 3e 6e 45 78 70 72 3e 53 51 4c 49  List->nExpr>SQLI
b590: 54 45 5f 4d 41 58 5f 43 4f 4c 55 4d 4e 20 29 7b  TE_MAX_COLUMN ){
b5a0: 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f  .    sqlite3Erro
b5b0: 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 74 6f  rMsg(pParse, "to
b5c0: 6f 20 6d 61 6e 79 20 63 6f 6c 75 6d 6e 73 20 69  o many columns i
b5d0: 6e 20 72 65 73 75 6c 74 20 73 65 74 22 29 3b 0a  n result set");.
b5e0: 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
b5f0: 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28  ERROR;.  }.  if(
b600: 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
b610: 64 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51  d ){.    rc = SQ
b620: 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a  LITE_NOMEM;.  }.
b630: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
b640: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
b650: 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c  MIT_COMPOUND_SEL
b660: 45 43 54 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  ECT./*.** This r
b670: 6f 75 74 69 6e 65 20 61 73 73 6f 63 69 61 74 65  outine associate
b680: 73 20 65 6e 74 72 69 65 73 20 69 6e 20 61 6e 20  s entries in an 
b690: 4f 52 44 45 52 20 42 59 20 65 78 70 72 65 73 73  ORDER BY express
b6a0: 69 6f 6e 20 6c 69 73 74 20 77 69 74 68 0a 2a 2a  ion list with.**
b6b0: 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 61 20 72 65   columns in a re
b6c0: 73 75 6c 74 2e 20 20 46 6f 72 20 65 61 63 68 20  sult.  For each 
b6d0: 4f 52 44 45 52 20 42 59 20 65 78 70 72 65 73 73  ORDER BY express
b6e0: 69 6f 6e 2c 20 74 68 65 20 6f 70 63 6f 64 65 20  ion, the opcode 
b6f0: 6f 66 0a 2a 2a 20 74 68 65 20 74 6f 70 2d 6c 65  of.** the top-le
b700: 76 65 6c 20 6e 6f 64 65 20 69 73 20 63 68 61 6e  vel node is chan
b710: 67 65 64 20 74 6f 20 54 4b 5f 43 4f 4c 55 4d 4e  ged to TK_COLUMN
b720: 20 61 6e 64 20 74 68 65 20 69 43 6f 6c 75 6d 6e   and the iColumn
b730: 20 76 61 6c 75 65 20 6f 66 0a 2a 2a 20 74 68 65   value of.** the
b740: 20 74 6f 70 2d 6c 65 76 65 6c 20 6e 6f 64 65 20   top-level node 
b750: 69 73 20 66 69 6c 6c 65 64 20 69 6e 20 77 69 74  is filled in wit
b760: 68 20 63 6f 6c 75 6d 6e 20 6e 75 6d 62 65 72 20  h column number 
b770: 61 6e 64 20 74 68 65 20 69 54 61 62 6c 65 0a 2a  and the iTable.*
b780: 2a 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 74  * value of the t
b790: 6f 70 2d 6c 65 76 65 6c 20 6e 6f 64 65 20 69 73  op-level node is
b7a0: 20 66 69 6c 6c 65 64 20 77 69 74 68 20 69 54 61   filled with iTa
b7b0: 62 6c 65 20 70 61 72 61 6d 65 74 65 72 2e 0a 2a  ble parameter..*
b7c0: 2a 0a 2a 2a 20 49 66 20 74 68 65 72 65 20 61 72  *.** If there ar
b7d0: 65 20 70 72 69 6f 72 20 53 45 4c 45 43 54 20 63  e prior SELECT c
b7e0: 6c 61 75 73 65 73 2c 20 74 68 65 79 20 61 72 65  lauses, they are
b7f0: 20 70 72 6f 63 65 73 73 65 64 20 66 69 72 73 74   processed first
b800: 2e 20 20 41 20 6d 61 74 63 68 0a 2a 2a 20 69 6e  .  A match.** in
b810: 20 61 6e 20 65 61 72 6c 69 65 72 20 53 45 4c 45   an earlier SELE
b820: 43 54 20 74 61 6b 65 73 20 70 72 65 63 65 64 65  CT takes precede
b830: 6e 63 65 20 6f 76 65 72 20 61 20 6c 61 74 65 72  nce over a later
b840: 20 53 45 4c 45 43 54 2e 0a 2a 2a 0a 2a 2a 20 41   SELECT..**.** A
b850: 6e 79 20 65 6e 74 72 79 20 74 68 61 74 20 64 6f  ny entry that do
b860: 65 73 20 6e 6f 74 20 6d 61 74 63 68 20 69 73 20  es not match is 
b870: 66 6c 61 67 67 65 64 20 61 73 20 61 6e 20 65 72  flagged as an er
b880: 72 6f 72 2e 20 20 54 68 65 20 6e 75 6d 62 65 72  ror.  The number
b890: 0a 2a 2a 20 6f 66 20 65 72 72 6f 72 73 20 69 73  .** of errors is
b8a0: 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74   returned..*/.st
b8b0: 61 74 69 63 20 69 6e 74 20 6d 61 74 63 68 4f 72  atic int matchOr
b8c0: 64 65 72 62 79 54 6f 43 6f 6c 75 6d 6e 28 0a 20  derbyToColumn(. 
b8d0: 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
b8e0: 20 20 20 20 20 20 20 20 20 2f 2a 20 41 20 70 6c           /* A pl
b8f0: 61 63 65 20 74 6f 20 6c 65 61 76 65 20 65 72 72  ace to leave err
b900: 6f 72 20 6d 65 73 73 61 67 65 73 20 2a 2f 0a 20  or messages */. 
b910: 20 53 65 6c 65 63 74 20 2a 70 53 65 6c 65 63 74   Select *pSelect
b920: 2c 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 74 63  ,        /* Matc
b930: 68 20 74 6f 20 72 65 73 75 6c 74 20 63 6f 6c 75  h to result colu
b940: 6d 6e 73 20 6f 66 20 74 68 69 73 20 53 45 4c 45  mns of this SELE
b950: 43 54 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74  CT */.  ExprList
b960: 20 2a 70 4f 72 64 65 72 42 79 2c 20 20 20 20 20   *pOrderBy,     
b970: 2f 2a 20 54 68 65 20 4f 52 44 45 52 20 42 59 20  /* The ORDER BY 
b980: 76 61 6c 75 65 73 20 74 6f 20 6d 61 74 63 68 20  values to match 
b990: 61 67 61 69 6e 73 74 20 63 6f 6c 75 6d 6e 73 20  against columns 
b9a0: 2a 2f 0a 20 20 69 6e 74 20 69 54 61 62 6c 65 2c  */.  int iTable,
b9b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
b9c0: 49 6e 73 65 72 74 20 74 68 69 73 20 76 61 6c 75  Insert this valu
b9d0: 65 20 69 6e 20 69 54 61 62 6c 65 20 2a 2f 0a 20  e in iTable */. 
b9e0: 20 69 6e 74 20 6d 75 73 74 43 6f 6d 70 6c 65 74   int mustComplet
b9f0: 65 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 54  e        /* If T
ba00: 52 55 45 20 61 6c 6c 20 4f 52 44 45 52 20 42 59  RUE all ORDER BY
ba10: 73 20 6d 75 73 74 20 6d 61 74 63 68 20 2a 2f 0a  s must match */.
ba20: 29 7b 0a 20 20 69 6e 74 20 6e 45 72 72 20 3d 20  ){.  int nErr = 
ba30: 30 3b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20  0;.  int i, j;. 
ba40: 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73   ExprList *pELis
ba50: 74 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  t;.  sqlite3 *db
ba60: 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 0a   = pParse->db;..
ba70: 20 20 69 66 28 20 70 53 65 6c 65 63 74 3d 3d 30    if( pSelect==0
ba80: 20 7c 7c 20 70 4f 72 64 65 72 42 79 3d 3d 30 20   || pOrderBy==0 
ba90: 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 69 66  ) return 1;.  if
baa0: 28 20 6d 75 73 74 43 6f 6d 70 6c 65 74 65 20 29  ( mustComplete )
bab0: 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  {.    for(i=0; i
bac0: 3c 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72  <pOrderBy->nExpr
bad0: 3b 20 69 2b 2b 29 7b 20 70 4f 72 64 65 72 42 79  ; i++){ pOrderBy
bae0: 2d 3e 61 5b 69 5d 2e 64 6f 6e 65 20 3d 20 30 3b  ->a[i].done = 0;
baf0: 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 70 72 65   }.  }.  if( pre
bb00: 70 53 65 6c 65 63 74 53 74 6d 74 28 70 50 61 72  pSelectStmt(pPar
bb10: 73 65 2c 20 70 53 65 6c 65 63 74 29 20 29 7b 0a  se, pSelect) ){.
bb20: 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20      return 1;.  
bb30: 7d 0a 20 20 69 66 28 20 70 53 65 6c 65 63 74 2d  }.  if( pSelect-
bb40: 3e 70 50 72 69 6f 72 20 29 7b 0a 20 20 20 20 69  >pPrior ){.    i
bb50: 66 28 20 6d 61 74 63 68 4f 72 64 65 72 62 79 54  f( matchOrderbyT
bb60: 6f 43 6f 6c 75 6d 6e 28 70 50 61 72 73 65 2c 20  oColumn(pParse, 
bb70: 70 53 65 6c 65 63 74 2d 3e 70 50 72 69 6f 72 2c  pSelect->pPrior,
bb80: 20 70 4f 72 64 65 72 42 79 2c 20 69 54 61 62 6c   pOrderBy, iTabl
bb90: 65 2c 20 30 29 20 29 7b 0a 20 20 20 20 20 20 72  e, 0) ){.      r
bba0: 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20  eturn 1;.    }. 
bbb0: 20 7d 0a 20 20 70 45 4c 69 73 74 20 3d 20 70 53   }.  pEList = pS
bbc0: 65 6c 65 63 74 2d 3e 70 45 4c 69 73 74 3b 0a 20  elect->pEList;. 
bbd0: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4f 72 64   for(i=0; i<pOrd
bbe0: 65 72 42 79 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b  erBy->nExpr; i++
bbf0: 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20 45 78  ){.    struct Ex
bc00: 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74  prList_item *pIt
bc10: 65 6d 3b 0a 20 20 20 20 45 78 70 72 20 2a 70 45  em;.    Expr *pE
bc20: 20 3d 20 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69   = pOrderBy->a[i
bc30: 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 69 6e 74  ].pExpr;.    int
bc40: 20 69 43 6f 6c 20 3d 20 2d 31 3b 0a 20 20 20 20   iCol = -1;.    
bc50: 63 68 61 72 20 2a 7a 4c 61 62 65 6c 3b 0a 0a 20  char *zLabel;.. 
bc60: 20 20 20 69 66 28 20 70 4f 72 64 65 72 42 79 2d     if( pOrderBy-
bc70: 3e 61 5b 69 5d 2e 64 6f 6e 65 20 29 20 63 6f 6e  >a[i].done ) con
bc80: 74 69 6e 75 65 3b 0a 20 20 20 20 69 66 28 20 73  tinue;.    if( s
bc90: 71 6c 69 74 65 33 45 78 70 72 49 73 49 6e 74 65  qlite3ExprIsInte
bca0: 67 65 72 28 70 45 2c 20 26 69 43 6f 6c 29 20 29  ger(pE, &iCol) )
bcb0: 7b 0a 20 20 20 20 20 20 69 66 28 20 69 43 6f 6c  {.      if( iCol
bcc0: 3c 3d 30 20 7c 7c 20 69 43 6f 6c 3e 70 45 4c 69  <=0 || iCol>pELi
bcd0: 73 74 2d 3e 6e 45 78 70 72 20 29 7b 0a 20 20 20  st->nExpr ){.   
bce0: 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f       sqlite3Erro
bcf0: 72 4d 73 67 28 70 50 61 72 73 65 2c 0a 20 20 20  rMsg(pParse,.   
bd00: 20 20 20 20 20 20 20 22 4f 52 44 45 52 20 42 59         "ORDER BY
bd10: 20 70 6f 73 69 74 69 6f 6e 20 25 64 20 73 68 6f   position %d sho
bd20: 75 6c 64 20 62 65 20 62 65 74 77 65 65 6e 20 31  uld be between 1
bd30: 20 61 6e 64 20 25 64 22 2c 0a 20 20 20 20 20 20   and %d",.      
bd40: 20 20 20 20 69 43 6f 6c 2c 20 70 45 4c 69 73 74      iCol, pEList
bd50: 2d 3e 6e 45 78 70 72 29 3b 0a 20 20 20 20 20 20  ->nExpr);.      
bd60: 20 20 6e 45 72 72 2b 2b 3b 0a 20 20 20 20 20 20    nErr++;.      
bd70: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d    break;.      }
bd80: 0a 20 20 20 20 20 20 69 66 28 20 21 6d 75 73 74  .      if( !must
bd90: 43 6f 6d 70 6c 65 74 65 20 29 20 63 6f 6e 74 69  Complete ) conti
bda0: 6e 75 65 3b 0a 20 20 20 20 20 20 69 43 6f 6c 2d  nue;.      iCol-
bdb0: 2d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  -;.    }.    if(
bdc0: 20 69 43 6f 6c 3c 30 20 26 26 20 28 7a 4c 61 62   iCol<0 && (zLab
bdd0: 65 6c 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65  el = sqlite3Name
bde0: 46 72 6f 6d 54 6f 6b 65 6e 28 64 62 2c 20 26 70  FromToken(db, &p
bdf0: 45 2d 3e 74 6f 6b 65 6e 29 29 21 3d 30 20 29 7b  E->token))!=0 ){
be00: 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 2c 20  .      for(j=0, 
be10: 70 49 74 65 6d 3d 70 45 4c 69 73 74 2d 3e 61 3b  pItem=pEList->a;
be20: 20 6a 3c 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72   j<pEList->nExpr
be30: 3b 20 6a 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b  ; j++, pItem++){
be40: 0a 20 20 20 20 20 20 20 20 63 68 61 72 20 2a 7a  .        char *z
be50: 4e 61 6d 65 3b 0a 20 20 20 20 20 20 20 20 69 6e  Name;.        in
be60: 74 20 69 73 4d 61 74 63 68 3b 0a 20 20 20 20 20  t isMatch;.     
be70: 20 20 20 69 66 28 20 70 49 74 65 6d 2d 3e 7a 4e     if( pItem->zN
be80: 61 6d 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ame ){.         
be90: 20 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33   zName = sqlite3
bea0: 44 62 53 74 72 44 75 70 28 64 62 2c 20 70 49 74  DbStrDup(db, pIt
beb0: 65 6d 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  em->zName);.    
bec0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
bed0: 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 73 71 6c       zName = sql
bee0: 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65  ite3NameFromToke
bef0: 6e 28 64 62 2c 20 26 70 49 74 65 6d 2d 3e 70 45  n(db, &pItem->pE
bf00: 78 70 72 2d 3e 74 6f 6b 65 6e 29 3b 0a 20 20 20  xpr->token);.   
bf10: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69       }.        i
bf20: 73 4d 61 74 63 68 20 3d 20 7a 4e 61 6d 65 20 26  sMatch = zName &
bf30: 26 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70  & sqlite3StrICmp
bf40: 28 7a 4e 61 6d 65 2c 20 7a 4c 61 62 65 6c 29 3d  (zName, zLabel)=
bf50: 3d 30 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  =0;.        sqli
bf60: 74 65 33 5f 66 72 65 65 28 7a 4e 61 6d 65 29 3b  te3_free(zName);
bf70: 0a 20 20 20 20 20 20 20 20 69 66 28 20 69 73 4d  .        if( isM
bf80: 61 74 63 68 20 29 7b 0a 20 20 20 20 20 20 20 20  atch ){.        
bf90: 20 20 69 43 6f 6c 20 3d 20 6a 3b 0a 20 20 20 20    iCol = j;.    
bfa0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
bfb0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
bfc0: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65       sqlite3_fre
bfd0: 65 28 7a 4c 61 62 65 6c 29 3b 0a 20 20 20 20 7d  e(zLabel);.    }
bfe0: 0a 20 20 20 20 69 66 28 20 69 43 6f 6c 3e 3d 30  .    if( iCol>=0
bff0: 20 29 7b 0a 20 20 20 20 20 20 70 45 2d 3e 6f 70   ){.      pE->op
c000: 20 3d 20 54 4b 5f 43 4f 4c 55 4d 4e 3b 0a 20 20   = TK_COLUMN;.  
c010: 20 20 20 20 70 45 2d 3e 69 43 6f 6c 75 6d 6e 20      pE->iColumn 
c020: 3d 20 69 43 6f 6c 3b 0a 20 20 20 20 20 20 70 45  = iCol;.      pE
c030: 2d 3e 69 54 61 62 6c 65 20 3d 20 69 54 61 62 6c  ->iTable = iTabl
c040: 65 3b 0a 20 20 20 20 20 20 70 45 2d 3e 69 41 67  e;.      pE->iAg
c050: 67 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 70 4f  g = -1;.      pO
c060: 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 64 6f 6e  rderBy->a[i].don
c070: 65 20 3d 20 31 3b 0a 20 20 20 20 7d 65 6c 73 65  e = 1;.    }else
c080: 20 69 66 28 20 6d 75 73 74 43 6f 6d 70 6c 65 74   if( mustComplet
c090: 65 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  e ){.      sqlit
c0a0: 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
c0b0: 65 2c 0a 20 20 20 20 20 20 20 20 22 4f 52 44 45  e,.        "ORDE
c0c0: 52 20 42 59 20 74 65 72 6d 20 6e 75 6d 62 65 72  R BY term number
c0d0: 20 25 64 20 64 6f 65 73 20 6e 6f 74 20 6d 61 74   %d does not mat
c0e0: 63 68 20 61 6e 79 20 72 65 73 75 6c 74 20 63 6f  ch any result co
c0f0: 6c 75 6d 6e 22 2c 20 69 2b 31 29 3b 0a 20 20 20  lumn", i+1);.   
c100: 20 20 20 6e 45 72 72 2b 2b 3b 0a 20 20 20 20 20     nErr++;.     
c110: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
c120: 7d 0a 20 20 72 65 74 75 72 6e 20 6e 45 72 72 3b  }.  return nErr;
c130: 20 20 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 23    .}.#endif /* #
c140: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
c150: 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45  IT_COMPOUND_SELE
c160: 43 54 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 47 65 74  CT */../*.** Get
c170: 20 61 20 56 44 42 45 20 66 6f 72 20 74 68 65 20   a VDBE for the 
c180: 67 69 76 65 6e 20 70 61 72 73 65 72 20 63 6f 6e  given parser con
c190: 74 65 78 74 2e 20 20 43 72 65 61 74 65 20 61 20  text.  Create a 
c1a0: 6e 65 77 20 6f 6e 65 20 69 66 20 6e 65 63 65 73  new one if neces
c1b0: 73 61 72 79 2e 0a 2a 2a 20 49 66 20 61 6e 20 65  sary..** If an e
c1c0: 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 72 65 74  rror occurs, ret
c1d0: 75 72 6e 20 4e 55 4c 4c 20 61 6e 64 20 6c 65 61  urn NULL and lea
c1e0: 76 65 20 61 20 6d 65 73 73 61 67 65 20 69 6e 20  ve a message in 
c1f0: 70 50 61 72 73 65 2e 0a 2a 2f 0a 56 64 62 65 20  pParse..*/.Vdbe 
c200: 2a 73 71 6c 69 74 65 33 47 65 74 56 64 62 65 28  *sqlite3GetVdbe(
c210: 50 61 72 73 65 20 2a 70 50 61 72 73 65 29 7b 0a  Parse *pParse){.
c220: 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72    Vdbe *v = pPar
c230: 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69 66 28  se->pVdbe;.  if(
c240: 20 76 3d 3d 30 20 29 7b 0a 20 20 20 20 76 20 3d   v==0 ){.    v =
c250: 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 20 3d   pParse->pVdbe =
c260: 20 73 71 6c 69 74 65 33 56 64 62 65 43 72 65 61   sqlite3VdbeCrea
c270: 74 65 28 70 50 61 72 73 65 2d 3e 64 62 29 3b 0a  te(pParse->db);.
c280: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 76 3b 0a    }.  return v;.
c290: 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 75 74  }.../*.** Comput
c2a0: 65 20 74 68 65 20 69 4c 69 6d 69 74 20 61 6e 64  e the iLimit and
c2b0: 20 69 4f 66 66 73 65 74 20 66 69 65 6c 64 73 20   iOffset fields 
c2c0: 6f 66 20 74 68 65 20 53 45 4c 45 43 54 20 62 61  of the SELECT ba
c2d0: 73 65 64 20 6f 6e 20 74 68 65 0a 2a 2a 20 70 4c  sed on the.** pL
c2e0: 69 6d 69 74 20 61 6e 64 20 70 4f 66 66 73 65 74  imit and pOffset
c2f0: 20 65 78 70 72 65 73 73 69 6f 6e 73 2e 20 20 70   expressions.  p
c300: 4c 69 6d 69 74 20 61 6e 64 20 70 4f 66 66 73 65  Limit and pOffse
c310: 74 20 68 6f 6c 64 20 74 68 65 20 65 78 70 72 65  t hold the expre
c320: 73 73 69 6f 6e 73 0a 2a 2a 20 74 68 61 74 20 61  ssions.** that a
c330: 70 70 65 61 72 20 69 6e 20 74 68 65 20 6f 72 69  ppear in the ori
c340: 67 69 6e 61 6c 20 53 51 4c 20 73 74 61 74 65 6d  ginal SQL statem
c350: 65 6e 74 20 61 66 74 65 72 20 74 68 65 20 4c 49  ent after the LI
c360: 4d 49 54 20 61 6e 64 20 4f 46 46 53 45 54 0a 2a  MIT and OFFSET.*
c370: 2a 20 6b 65 79 77 6f 72 64 73 2e 20 20 4f 72 20  * keywords.  Or 
c380: 4e 55 4c 4c 20 69 66 20 74 68 6f 73 65 20 6b 65  NULL if those ke
c390: 79 77 6f 72 64 73 20 61 72 65 20 6f 6d 69 74 74  ywords are omitt
c3a0: 65 64 2e 20 69 4c 69 6d 69 74 20 61 6e 64 20 69  ed. iLimit and i
c3b0: 4f 66 66 73 65 74 20 0a 2a 2a 20 61 72 65 20 74  Offset .** are t
c3c0: 68 65 20 69 6e 74 65 67 65 72 20 6d 65 6d 6f 72  he integer memor
c3d0: 79 20 72 65 67 69 73 74 65 72 20 6e 75 6d 62 65  y register numbe
c3e0: 72 73 20 66 6f 72 20 63 6f 75 6e 74 65 72 73 20  rs for counters 
c3f0: 75 73 65 64 20 74 6f 20 63 6f 6d 70 75 74 65 20  used to compute 
c400: 0a 2a 2a 20 74 68 65 20 6c 69 6d 69 74 20 61 6e  .** the limit an
c410: 64 20 6f 66 66 73 65 74 2e 20 20 49 66 20 74 68  d offset.  If th
c420: 65 72 65 20 69 73 20 6e 6f 20 6c 69 6d 69 74 20  ere is no limit 
c430: 61 6e 64 2f 6f 72 20 6f 66 66 73 65 74 2c 20 74  and/or offset, t
c440: 68 65 6e 20 0a 2a 2a 20 69 4c 69 6d 69 74 20 61  hen .** iLimit a
c450: 6e 64 20 69 4f 66 66 73 65 74 20 61 72 65 20 6e  nd iOffset are n
c460: 65 67 61 74 69 76 65 2e 0a 2a 2a 0a 2a 2a 20 54  egative..**.** T
c470: 68 69 73 20 72 6f 75 74 69 6e 65 20 63 68 61 6e  his routine chan
c480: 67 65 73 20 74 68 65 20 76 61 6c 75 65 73 20 6f  ges the values o
c490: 66 20 69 4c 69 6d 69 74 20 61 6e 64 20 69 4f 66  f iLimit and iOf
c4a0: 66 73 65 74 20 6f 6e 6c 79 20 69 66 0a 2a 2a 20  fset only if.** 
c4b0: 61 20 6c 69 6d 69 74 20 6f 72 20 6f 66 66 73 65  a limit or offse
c4c0: 74 20 69 73 20 64 65 66 69 6e 65 64 20 62 79 20  t is defined by 
c4d0: 70 4c 69 6d 69 74 20 61 6e 64 20 70 4f 66 66 73  pLimit and pOffs
c4e0: 65 74 2e 20 20 69 4c 69 6d 69 74 20 61 6e 64 0a  et.  iLimit and.
c4f0: 2a 2a 20 69 4f 66 66 73 65 74 20 73 68 6f 75 6c  ** iOffset shoul
c500: 64 20 68 61 76 65 20 62 65 65 6e 20 70 72 65 73  d have been pres
c510: 65 74 20 74 6f 20 61 70 70 72 6f 70 72 69 61 74  et to appropriat
c520: 65 20 64 65 66 61 75 6c 74 20 76 61 6c 75 65 73  e default values
c530: 0a 2a 2a 20 28 75 73 75 61 6c 6c 79 20 62 75 74  .** (usually but
c540: 20 6e 6f 74 20 61 6c 77 61 79 73 20 2d 31 29 20   not always -1) 
c550: 70 72 69 6f 72 20 74 6f 20 63 61 6c 6c 69 6e 67  prior to calling
c560: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 2e 0a 2a   this routine..*
c570: 2a 20 4f 6e 6c 79 20 69 66 20 70 4c 69 6d 69 74  * Only if pLimit
c580: 21 3d 30 20 6f 72 20 70 4f 66 66 73 65 74 21 3d  !=0 or pOffset!=
c590: 30 20 64 6f 20 74 68 65 20 6c 69 6d 69 74 20 72  0 do the limit r
c5a0: 65 67 69 73 74 65 72 73 20 67 65 74 0a 2a 2a 20  egisters get.** 
c5b0: 72 65 64 65 66 69 6e 65 64 2e 20 20 54 68 65 20  redefined.  The 
c5c0: 55 4e 49 4f 4e 20 41 4c 4c 20 6f 70 65 72 61 74  UNION ALL operat
c5d0: 6f 72 20 75 73 65 73 20 74 68 69 73 20 70 72 6f  or uses this pro
c5e0: 70 65 72 74 79 20 74 6f 20 66 6f 72 63 65 0a 2a  perty to force.*
c5f0: 2a 20 74 68 65 20 72 65 75 73 65 20 6f 66 20 74  * the reuse of t
c600: 68 65 20 73 61 6d 65 20 6c 69 6d 69 74 20 61 6e  he same limit an
c610: 64 20 6f 66 66 73 65 74 20 72 65 67 69 73 74 65  d offset registe
c620: 72 73 20 61 63 72 6f 73 73 20 6d 75 6c 74 69 70  rs across multip
c630: 6c 65 0a 2a 2a 20 53 45 4c 45 43 54 20 73 74 61  le.** SELECT sta
c640: 74 65 6d 65 6e 74 73 2e 0a 2a 2f 0a 73 74 61 74  tements..*/.stat
c650: 69 63 20 76 6f 69 64 20 63 6f 6d 70 75 74 65 4c  ic void computeL
c660: 69 6d 69 74 52 65 67 69 73 74 65 72 73 28 50 61  imitRegisters(Pa
c670: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 53 65 6c  rse *pParse, Sel
c680: 65 63 74 20 2a 70 2c 20 69 6e 74 20 69 42 72 65  ect *p, int iBre
c690: 61 6b 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d  ak){.  Vdbe *v =
c6a0: 20 30 3b 0a 20 20 69 6e 74 20 69 4c 69 6d 69 74   0;.  int iLimit
c6b0: 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69 4f 66 66   = 0;.  int iOff
c6c0: 73 65 74 3b 0a 20 20 69 6e 74 20 61 64 64 72 31  set;.  int addr1
c6d0: 2c 20 61 64 64 72 32 3b 0a 0a 20 20 2f 2a 20 0a  , addr2;..  /* .
c6e0: 20 20 2a 2a 20 22 4c 49 4d 49 54 20 2d 31 22 20    ** "LIMIT -1" 
c6f0: 61 6c 77 61 79 73 20 73 68 6f 77 73 20 61 6c 6c  always shows all
c700: 20 72 6f 77 73 2e 20 20 54 68 65 72 65 20 69 73   rows.  There is
c710: 20 73 6f 6d 65 0a 20 20 2a 2a 20 63 6f 6e 74 72   some.  ** contr
c720: 61 76 65 72 73 79 20 61 62 6f 75 74 20 77 68 61  aversy about wha
c730: 74 20 74 68 65 20 63 6f 72 72 65 63 74 20 62 65  t the correct be
c740: 68 61 76 69 6f 72 20 73 68 6f 75 6c 64 20 62 65  havior should be
c750: 2e 0a 20 20 2a 2a 20 54 68 65 20 63 75 72 72 65  ..  ** The curre
c760: 6e 74 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  nt implementatio
c770: 6e 20 69 6e 74 65 72 70 72 65 74 73 20 22 4c 49  n interprets "LI
c780: 4d 49 54 20 30 22 20 74 6f 20 6d 65 61 6e 0a 20  MIT 0" to mean. 
c790: 20 2a 2a 20 6e 6f 20 72 6f 77 73 2e 0a 20 20 2a   ** no rows..  *
c7a0: 2f 0a 20 20 69 66 28 20 70 2d 3e 70 4c 69 6d 69  /.  if( p->pLimi
c7b0: 74 20 29 7b 0a 20 20 20 20 70 2d 3e 69 4c 69 6d  t ){.    p->iLim
c7c0: 69 74 20 3d 20 69 4c 69 6d 69 74 20 3d 20 70 50  it = iLimit = pP
c7d0: 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20  arse->nMem;.    
c7e0: 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d 20  pParse->nMem += 
c7f0: 32 3b 0a 20 20 20 20 76 20 3d 20 73 71 6c 69 74  2;.    v = sqlit
c800: 65 33 47 65 74 56 64 62 65 28 70 50 61 72 73 65  e3GetVdbe(pParse
c810: 29 3b 0a 20 20 20 20 69 66 28 20 76 3d 3d 30 20  );.    if( v==0 
c820: 29 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 73 71  ) return;.    sq
c830: 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28 70 50  lite3ExprCode(pP
c840: 61 72 73 65 2c 20 70 2d 3e 70 4c 69 6d 69 74 29  arse, p->pLimit)
c850: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
c860: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 75 73  eAddOp(v, OP_Mus
c870: 74 42 65 49 6e 74 2c 20 30 2c 20 30 29 3b 0a 20  tBeInt, 0, 0);. 
c880: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
c890: 64 4f 70 28 76 2c 20 4f 50 5f 4d 65 6d 53 74 6f  dOp(v, OP_MemSto
c8a0: 72 65 2c 20 69 4c 69 6d 69 74 2c 20 31 29 3b 0a  re, iLimit, 1);.
c8b0: 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28      VdbeComment(
c8c0: 28 76 2c 20 22 23 20 4c 49 4d 49 54 20 63 6f 75  (v, "# LIMIT cou
c8d0: 6e 74 65 72 22 29 29 3b 0a 20 20 20 20 73 71 6c  nter"));.    sql
c8e0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
c8f0: 20 4f 50 5f 49 66 4d 65 6d 5a 65 72 6f 2c 20 69   OP_IfMemZero, i
c900: 4c 69 6d 69 74 2c 20 69 42 72 65 61 6b 29 3b 0a  Limit, iBreak);.
c910: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
c920: 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 65 6d 4c 6f  ddOp(v, OP_MemLo
c930: 61 64 2c 20 69 4c 69 6d 69 74 2c 20 30 29 3b 0a  ad, iLimit, 0);.
c940: 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e 70 4f 66    }.  if( p->pOf
c950: 66 73 65 74 20 29 7b 0a 20 20 20 20 70 2d 3e 69  fset ){.    p->i
c960: 4f 66 66 73 65 74 20 3d 20 69 4f 66 66 73 65 74  Offset = iOffset
c970: 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b   = pParse->nMem+
c980: 2b 3b 0a 20 20 20 20 76 20 3d 20 73 71 6c 69 74  +;.    v = sqlit
c990: 65 33 47 65 74 56 64 62 65 28 70 50 61 72 73 65  e3GetVdbe(pParse
c9a0: 29 3b 0a 20 20 20 20 69 66 28 20 76 3d 3d 30 20  );.    if( v==0 
c9b0: 29 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 73 71  ) return;.    sq
c9c0: 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28 70 50  lite3ExprCode(pP
c9d0: 61 72 73 65 2c 20 70 2d 3e 70 4f 66 66 73 65 74  arse, p->pOffset
c9e0: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
c9f0: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 75  beAddOp(v, OP_Mu
ca00: 73 74 42 65 49 6e 74 2c 20 30 2c 20 30 29 3b 0a  stBeInt, 0, 0);.
ca10: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
ca20: 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 65 6d 53 74  ddOp(v, OP_MemSt
ca30: 6f 72 65 2c 20 69 4f 66 66 73 65 74 2c 20 70 2d  ore, iOffset, p-
ca40: 3e 70 4c 69 6d 69 74 3d 3d 30 29 3b 0a 20 20 20  >pLimit==0);.   
ca50: 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c   VdbeComment((v,
ca60: 20 22 23 20 4f 46 46 53 45 54 20 63 6f 75 6e 74   "# OFFSET count
ca70: 65 72 22 29 29 3b 0a 20 20 20 20 61 64 64 72 31  er"));.    addr1
ca80: 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   = sqlite3VdbeAd
ca90: 64 4f 70 28 76 2c 20 4f 50 5f 49 66 4d 65 6d 50  dOp(v, OP_IfMemP
caa0: 6f 73 2c 20 69 4f 66 66 73 65 74 2c 20 30 29 3b  os, iOffset, 0);
cab0: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
cac0: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 50 6f 70 2c  AddOp(v, OP_Pop,
cad0: 20 31 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69   1, 0);.    sqli
cae0: 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
caf0: 4f 50 5f 49 6e 74 65 67 65 72 2c 20 30 2c 20 30  OP_Integer, 0, 0
cb00: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
cb10: 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64  beJumpHere(v, ad
cb20: 64 72 31 29 3b 0a 20 20 20 20 69 66 28 20 70 2d  dr1);.    if( p-
cb30: 3e 70 4c 69 6d 69 74 20 29 7b 0a 20 20 20 20 20  >pLimit ){.     
cb40: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
cb50: 70 28 76 2c 20 4f 50 5f 41 64 64 2c 20 30 2c 20  p(v, OP_Add, 0, 
cb60: 30 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  0);.    }.  }.  
cb70: 69 66 28 20 70 2d 3e 70 4c 69 6d 69 74 20 29 7b  if( p->pLimit ){
cb80: 0a 20 20 20 20 61 64 64 72 31 20 3d 20 73 71 6c  .    addr1 = sql
cb90: 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
cba0: 20 4f 50 5f 49 66 4d 65 6d 50 6f 73 2c 20 69 4c   OP_IfMemPos, iL
cbb0: 69 6d 69 74 2c 20 30 29 3b 0a 20 20 20 20 73 71  imit, 0);.    sq
cbc0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
cbd0: 2c 20 4f 50 5f 50 6f 70 2c 20 31 2c 20 30 29 3b  , OP_Pop, 1, 0);
cbe0: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
cbf0: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 65 6d 49  AddOp(v, OP_MemI
cc00: 6e 74 2c 20 2d 31 2c 20 69 4c 69 6d 69 74 2b 31  nt, -1, iLimit+1
cc10: 29 3b 0a 20 20 20 20 61 64 64 72 32 20 3d 20 73  );.    addr2 = s
cc20: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
cc30: 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 30  v, OP_Goto, 0, 0
cc40: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
cc50: 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64  beJumpHere(v, ad
cc60: 64 72 31 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  dr1);.    sqlite
cc70: 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
cc80: 5f 4d 65 6d 53 74 6f 72 65 2c 20 69 4c 69 6d 69  _MemStore, iLimi
cc90: 74 2b 31 2c 20 31 29 3b 0a 20 20 20 20 56 64 62  t+1, 1);.    Vdb
cca0: 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 23 20  eComment((v, "# 
ccb0: 4c 49 4d 49 54 2b 4f 46 46 53 45 54 22 29 29 3b  LIMIT+OFFSET"));
ccc0: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
ccd0: 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72  JumpHere(v, addr
cce0: 32 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  2);.  }.}../*.**
ccf0: 20 41 6c 6c 6f 63 61 74 65 20 61 20 76 69 72 74   Allocate a virt
cd00: 75 61 6c 20 69 6e 64 65 78 20 74 6f 20 75 73 65  ual index to use
cd10: 20 66 6f 72 20 73 6f 72 74 69 6e 67 2e 0a 2a 2f   for sorting..*/
cd20: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63 72 65  .static void cre
cd30: 61 74 65 53 6f 72 74 69 6e 67 49 6e 64 65 78 28  ateSortingIndex(
cd40: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 53  Parse *pParse, S
cd50: 65 6c 65 63 74 20 2a 70 2c 20 45 78 70 72 4c 69  elect *p, ExprLi
cd60: 73 74 20 2a 70 4f 72 64 65 72 42 79 29 7b 0a 20  st *pOrderBy){. 
cd70: 20 69 66 28 20 70 4f 72 64 65 72 42 79 20 29 7b   if( pOrderBy ){
cd80: 0a 20 20 20 20 69 6e 74 20 61 64 64 72 3b 0a 20  .    int addr;. 
cd90: 20 20 20 61 73 73 65 72 74 28 20 70 4f 72 64 65     assert( pOrde
cda0: 72 42 79 2d 3e 69 45 43 75 72 73 6f 72 3d 3d 30  rBy->iECursor==0
cdb0: 20 29 3b 0a 20 20 20 20 70 4f 72 64 65 72 42 79   );.    pOrderBy
cdc0: 2d 3e 69 45 43 75 72 73 6f 72 20 3d 20 70 50 61  ->iECursor = pPa
cdd0: 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20  rse->nTab++;.   
cde0: 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56   addr = sqlite3V
cdf0: 64 62 65 41 64 64 4f 70 28 70 50 61 72 73 65 2d  dbeAddOp(pParse-
ce00: 3e 70 56 64 62 65 2c 20 4f 50 5f 4f 70 65 6e 45  >pVdbe, OP_OpenE
ce10: 70 68 65 6d 65 72 61 6c 2c 0a 20 20 20 20 20 20  phemeral,.      
ce20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ce30: 20 20 20 20 20 20 70 4f 72 64 65 72 42 79 2d 3e        pOrderBy->
ce40: 69 45 43 75 72 73 6f 72 2c 20 70 4f 72 64 65 72  iECursor, pOrder
ce50: 42 79 2d 3e 6e 45 78 70 72 2b 31 29 3b 0a 20 20  By->nExpr+1);.  
ce60: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 61 64 64    assert( p->add
ce70: 72 4f 70 65 6e 45 70 68 6d 5b 32 5d 20 3d 3d 20  rOpenEphm[2] == 
ce80: 2d 31 20 29 3b 0a 20 20 20 20 70 2d 3e 61 64 64  -1 );.    p->add
ce90: 72 4f 70 65 6e 45 70 68 6d 5b 32 5d 20 3d 20 61  rOpenEphm[2] = a
cea0: 64 64 72 3b 0a 20 20 7d 0a 7d 0a 0a 23 69 66 6e  ddr;.  }.}..#ifn
ceb0: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
cec0: 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45 43 54 0a  COMPOUND_SELECT.
ced0: 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  /*.** Return the
cee0: 20 61 70 70 72 6f 70 72 69 61 74 65 20 63 6f 6c   appropriate col
cef0: 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65 20  lating sequence 
cf00: 66 6f 72 20 74 68 65 20 69 43 6f 6c 2d 74 68 20  for the iCol-th 
cf10: 63 6f 6c 75 6d 6e 20 6f 66 0a 2a 2a 20 74 68 65  column of.** the
cf20: 20 72 65 73 75 6c 74 20 73 65 74 20 66 6f 72 20   result set for 
cf30: 74 68 65 20 63 6f 6d 70 6f 75 6e 64 2d 73 65 6c  the compound-sel
cf40: 65 63 74 20 73 74 61 74 65 6d 65 6e 74 20 22 70  ect statement "p
cf50: 22 2e 20 20 52 65 74 75 72 6e 20 4e 55 4c 4c 20  ".  Return NULL 
cf60: 69 66 0a 2a 2a 20 74 68 65 20 63 6f 6c 75 6d 6e  if.** the column
cf70: 20 68 61 73 20 6e 6f 20 64 65 66 61 75 6c 74 20   has no default 
cf80: 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e  collating sequen
cf90: 63 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 6f  ce..**.** The co
cfa0: 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65  llating sequence
cfb0: 20 66 6f 72 20 74 68 65 20 63 6f 6d 70 6f 75 6e   for the compoun
cfc0: 64 20 73 65 6c 65 63 74 20 69 73 20 74 61 6b 65  d select is take
cfd0: 6e 20 66 72 6f 6d 20 74 68 65 0a 2a 2a 20 6c 65  n from the.** le
cfe0: 66 74 2d 6d 6f 73 74 20 74 65 72 6d 20 6f 66 20  ft-most term of 
cff0: 74 68 65 20 73 65 6c 65 63 74 20 74 68 61 74 20  the select that 
d000: 68 61 73 20 61 20 63 6f 6c 6c 61 74 69 6e 67 20  has a collating 
d010: 73 65 71 75 65 6e 63 65 2e 0a 2a 2f 0a 73 74 61  sequence..*/.sta
d020: 74 69 63 20 43 6f 6c 6c 53 65 71 20 2a 6d 75 6c  tic CollSeq *mul
d030: 74 69 53 65 6c 65 63 74 43 6f 6c 6c 53 65 71 28  tiSelectCollSeq(
d040: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 53  Parse *pParse, S
d050: 65 6c 65 63 74 20 2a 70 2c 20 69 6e 74 20 69 43  elect *p, int iC
d060: 6f 6c 29 7b 0a 20 20 43 6f 6c 6c 53 65 71 20 2a  ol){.  CollSeq *
d070: 70 52 65 74 3b 0a 20 20 69 66 28 20 70 2d 3e 70  pRet;.  if( p->p
d080: 50 72 69 6f 72 20 29 7b 0a 20 20 20 20 70 52 65  Prior ){.    pRe
d090: 74 20 3d 20 6d 75 6c 74 69 53 65 6c 65 63 74 43  t = multiSelectC
d0a0: 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70  ollSeq(pParse, p
d0b0: 2d 3e 70 50 72 69 6f 72 2c 20 69 43 6f 6c 29 3b  ->pPrior, iCol);
d0c0: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 52  .  }else{.    pR
d0d0: 65 74 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 69 66  et = 0;.  }.  if
d0e0: 28 20 70 52 65 74 3d 3d 30 20 29 7b 0a 20 20 20  ( pRet==0 ){.   
d0f0: 20 70 52 65 74 20 3d 20 73 71 6c 69 74 65 33 45   pRet = sqlite3E
d100: 78 70 72 43 6f 6c 6c 53 65 71 28 70 50 61 72 73  xprCollSeq(pPars
d110: 65 2c 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b  e, p->pEList->a[
d120: 69 43 6f 6c 5d 2e 70 45 78 70 72 29 3b 0a 20 20  iCol].pExpr);.  
d130: 7d 0a 20 20 72 65 74 75 72 6e 20 70 52 65 74 3b  }.  return pRet;
d140: 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c  .}.#endif /* SQL
d150: 49 54 45 5f 4f 4d 49 54 5f 43 4f 4d 50 4f 55 4e  ITE_OMIT_COMPOUN
d160: 44 5f 53 45 4c 45 43 54 20 2a 2f 0a 0a 23 69 66  D_SELECT */..#if
d170: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
d180: 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45 43 54  _COMPOUND_SELECT
d190: 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
d1a0: 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 74 6f  ine is called to
d1b0: 20 70 72 6f 63 65 73 73 20 61 20 71 75 65 72 79   process a query
d1c0: 20 74 68 61 74 20 69 73 20 72 65 61 6c 6c 79 20   that is really 
d1d0: 74 68 65 20 75 6e 69 6f 6e 0a 2a 2a 20 6f 72 20  the union.** or 
d1e0: 69 6e 74 65 72 73 65 63 74 69 6f 6e 20 6f 66 20  intersection of 
d1f0: 74 77 6f 20 6f 72 20 6d 6f 72 65 20 73 65 70 61  two or more sepa
d200: 72 61 74 65 20 71 75 65 72 69 65 73 2e 0a 2a 2a  rate queries..**
d210: 0a 2a 2a 20 22 70 22 20 70 6f 69 6e 74 73 20 74  .** "p" points t
d220: 6f 20 74 68 65 20 72 69 67 68 74 2d 6d 6f 73 74  o the right-most
d230: 20 6f 66 20 74 68 65 20 74 77 6f 20 71 75 65 72   of the two quer
d240: 69 65 73 2e 20 20 74 68 65 20 71 75 65 72 79 20  ies.  the query 
d250: 6f 6e 20 74 68 65 0a 2a 2a 20 6c 65 66 74 20 69  on the.** left i
d260: 73 20 70 2d 3e 70 50 72 69 6f 72 2e 20 20 54 68  s p->pPrior.  Th
d270: 65 20 6c 65 66 74 20 71 75 65 72 79 20 63 6f 75  e left query cou
d280: 6c 64 20 61 6c 73 6f 20 62 65 20 61 20 63 6f 6d  ld also be a com
d290: 70 6f 75 6e 64 20 71 75 65 72 79 0a 2a 2a 20 69  pound query.** i
d2a0: 6e 20 77 68 69 63 68 20 63 61 73 65 20 74 68 69  n which case thi
d2b0: 73 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 62  s routine will b
d2c0: 65 20 63 61 6c 6c 65 64 20 72 65 63 75 72 73 69  e called recursi
d2d0: 76 65 6c 79 2e 20 0a 2a 2a 0a 2a 2a 20 54 68 65  vely. .**.** The
d2e0: 20 72 65 73 75 6c 74 73 20 6f 66 20 74 68 65 20   results of the 
d2f0: 74 6f 74 61 6c 20 71 75 65 72 79 20 61 72 65 20  total query are 
d300: 74 6f 20 62 65 20 77 72 69 74 74 65 6e 20 69 6e  to be written in
d310: 74 6f 20 61 20 64 65 73 74 69 6e 61 74 69 6f 6e  to a destination
d320: 0a 2a 2a 20 6f 66 20 74 79 70 65 20 65 44 65 73  .** of type eDes
d330: 74 20 77 69 74 68 20 70 61 72 61 6d 65 74 65 72  t with parameter
d340: 20 69 50 61 72 6d 2e 0a 2a 2a 0a 2a 2a 20 45 78   iParm..**.** Ex
d350: 61 6d 70 6c 65 20 31 3a 20 20 43 6f 6e 73 69 64  ample 1:  Consid
d360: 65 72 20 61 20 74 68 72 65 65 2d 77 61 79 20 63  er a three-way c
d370: 6f 6d 70 6f 75 6e 64 20 53 51 4c 20 73 74 61 74  ompound SQL stat
d380: 65 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 20 20 20  ement..**.**    
d390: 20 53 45 4c 45 43 54 20 61 20 46 52 4f 4d 20 74   SELECT a FROM t
d3a0: 31 20 55 4e 49 4f 4e 20 53 45 4c 45 43 54 20 62  1 UNION SELECT b
d3b0: 20 46 52 4f 4d 20 74 32 20 55 4e 49 4f 4e 20 53   FROM t2 UNION S
d3c0: 45 4c 45 43 54 20 63 20 46 52 4f 4d 20 74 33 0a  ELECT c FROM t3.
d3d0: 2a 2a 0a 2a 2a 20 54 68 69 73 20 73 74 61 74 65  **.** This state
d3e0: 6d 65 6e 74 20 69 73 20 70 61 72 73 65 64 20 75  ment is parsed u
d3f0: 70 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a  p as follows:.**
d400: 0a 2a 2a 20 20 20 20 20 53 45 4c 45 43 54 20 63  .**     SELECT c
d410: 20 46 52 4f 4d 20 74 33 0a 2a 2a 20 20 20 20 20   FROM t3.**     
d420: 20 7c 0a 2a 2a 20 20 20 20 20 20 60 2d 2d 2d 2d   |.**      `----
d430: 2d 3e 20 20 53 45 4c 45 43 54 20 62 20 46 52 4f  ->  SELECT b FRO
d440: 4d 20 74 32 0a 2a 2a 20 20 20 20 20 20 20 20 20  M t2.**         
d450: 20 20 20 20 20 20 20 7c 0a 2a 2a 20 20 20 20 20         |.**     
d460: 20 20 20 20 20 20 20 20 20 20 20 60 2d 2d 2d 2d             `----
d470: 2d 2d 3e 20 20 53 45 4c 45 43 54 20 61 20 46 52  -->  SELECT a FR
d480: 4f 4d 20 74 31 0a 2a 2a 0a 2a 2a 20 54 68 65 20  OM t1.**.** The 
d490: 61 72 72 6f 77 73 20 69 6e 20 74 68 65 20 64 69  arrows in the di
d4a0: 61 67 72 61 6d 20 61 62 6f 76 65 20 72 65 70 72  agram above repr
d4b0: 65 73 65 6e 74 20 74 68 65 20 53 65 6c 65 63 74  esent the Select
d4c0: 2e 70 50 72 69 6f 72 20 70 6f 69 6e 74 65 72 2e  .pPrior pointer.
d4d0: 0a 2a 2a 20 53 6f 20 69 66 20 74 68 69 73 20 72  .** So if this r
d4e0: 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64  outine is called
d4f0: 20 77 69 74 68 20 70 20 65 71 75 61 6c 20 74 6f   with p equal to
d500: 20 74 68 65 20 74 33 20 71 75 65 72 79 2c 20 74   the t3 query, t
d510: 68 65 6e 0a 2a 2a 20 70 50 72 69 6f 72 20 77 69  hen.** pPrior wi
d520: 6c 6c 20 62 65 20 74 68 65 20 74 32 20 71 75 65  ll be the t2 que
d530: 72 79 2e 20 20 70 2d 3e 6f 70 20 77 69 6c 6c 20  ry.  p->op will 
d540: 62 65 20 54 4b 5f 55 4e 49 4f 4e 20 69 6e 20 74  be TK_UNION in t
d550: 68 69 73 20 63 61 73 65 2e 0a 2a 2a 0a 2a 2a 20  his case..**.** 
d560: 4e 6f 74 69 63 65 20 74 68 61 74 20 62 65 63 61  Notice that beca
d570: 75 73 65 20 6f 66 20 74 68 65 20 77 61 79 20 53  use of the way S
d580: 51 4c 69 74 65 20 70 61 72 73 65 73 20 63 6f 6d  QLite parses com
d590: 70 6f 75 6e 64 20 53 45 4c 45 43 54 73 2c 20 74  pound SELECTs, t
d5a0: 68 65 0a 2a 2a 20 69 6e 64 69 76 69 64 75 61 6c  he.** individual
d5b0: 20 73 65 6c 65 63 74 73 20 61 6c 77 61 79 73 20   selects always 
d5c0: 67 72 6f 75 70 20 66 72 6f 6d 20 6c 65 66 74 20  group from left 
d5d0: 74 6f 20 72 69 67 68 74 2e 0a 2a 2f 0a 73 74 61  to right..*/.sta
d5e0: 74 69 63 20 69 6e 74 20 6d 75 6c 74 69 53 65 6c  tic int multiSel
d5f0: 65 63 74 28 0a 20 20 50 61 72 73 65 20 2a 70 50  ect(.  Parse *pP
d600: 61 72 73 65 2c 20 20 20 20 20 20 20 20 2f 2a 20  arse,        /* 
d610: 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20  Parsing context 
d620: 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 2c 20  */.  Select *p, 
d630: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
d640: 65 20 72 69 67 68 74 2d 6d 6f 73 74 20 6f 66 20  e right-most of 
d650: 53 45 4c 45 43 54 73 20 74 6f 20 62 65 20 63 6f  SELECTs to be co
d660: 64 65 64 20 2a 2f 0a 20 20 69 6e 74 20 65 44 65  ded */.  int eDe
d670: 73 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f  st,            /
d680: 2a 20 5c 5f 5f 5f 20 20 53 74 6f 72 65 20 71 75  * \___  Store qu
d690: 65 72 79 20 72 65 73 75 6c 74 73 20 61 73 20 73  ery results as s
d6a0: 70 65 63 69 66 69 65 64 20 2a 2f 0a 20 20 69 6e  pecified */.  in
d6b0: 74 20 69 50 61 72 6d 2c 20 20 20 20 20 20 20 20  t iParm,        
d6c0: 20 20 20 20 2f 2a 20 2f 20 20 20 20 20 62 79 20      /* /     by 
d6d0: 74 68 65 73 65 20 74 77 6f 20 70 61 72 61 6d 65  these two parame
d6e0: 74 65 72 73 2e 20 20 20 20 20 20 20 20 20 2a 2f  ters.         */
d6f0: 0a 20 20 63 68 61 72 20 2a 61 66 66 20 20 20 20  .  char *aff    
d700: 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 65           /* If e
d710: 44 65 73 74 20 69 73 20 53 52 54 5f 55 6e 69 6f  Dest is SRT_Unio
d720: 6e 2c 20 74 68 65 20 61 66 66 69 6e 69 74 79 20  n, the affinity 
d730: 73 74 72 69 6e 67 20 2a 2f 0a 29 7b 0a 20 20 69  string */.){.  i
d740: 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
d750: 4b 3b 20 20 20 2f 2a 20 53 75 63 63 65 73 73 20  K;   /* Success 
d760: 63 6f 64 65 20 66 72 6f 6d 20 61 20 73 75 62 72  code from a subr
d770: 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 53 65 6c 65  outine */.  Sele
d780: 63 74 20 2a 70 50 72 69 6f 72 3b 20 20 20 20 20  ct *pPrior;     
d790: 20 20 2f 2a 20 41 6e 6f 74 68 65 72 20 53 45 4c    /* Another SEL
d7a0: 45 43 54 20 69 6d 6d 65 64 69 61 74 65 6c 79 20  ECT immediately 
d7b0: 74 6f 20 6f 75 72 20 6c 65 66 74 20 2a 2f 0a 20  to our left */. 
d7c0: 20 56 64 62 65 20 2a 76 3b 20 20 20 20 20 20 20   Vdbe *v;       
d7d0: 20 20 20 20 20 20 20 2f 2a 20 47 65 6e 65 72 61         /* Genera
d7e0: 74 65 20 63 6f 64 65 20 74 6f 20 74 68 69 73 20  te code to this 
d7f0: 56 44 42 45 20 2a 2f 0a 20 20 69 6e 74 20 6e 43  VDBE */.  int nC
d800: 6f 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ol;             
d810: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 6f 6c  /* Number of col
d820: 75 6d 6e 73 20 69 6e 20 74 68 65 20 72 65 73 75  umns in the resu
d830: 6c 74 20 73 65 74 20 2a 2f 0a 20 20 45 78 70 72  lt set */.  Expr
d840: 4c 69 73 74 20 2a 70 4f 72 64 65 72 42 79 3b 20  List *pOrderBy; 
d850: 20 20 2f 2a 20 54 68 65 20 4f 52 44 45 52 20 42    /* The ORDER B
d860: 59 20 63 6c 61 75 73 65 20 6f 6e 20 70 20 2a 2f  Y clause on p */
d870: 0a 20 20 69 6e 74 20 61 53 65 74 50 32 5b 32 5d  .  int aSetP2[2]
d880: 3b 20 20 20 20 20 20 20 20 2f 2a 20 53 65 74 20  ;        /* Set 
d890: 50 32 20 76 61 6c 75 65 20 6f 66 20 74 68 65 73  P2 value of thes
d8a0: 65 20 6f 70 20 74 6f 20 6e 75 6d 62 65 72 20 6f  e op to number o
d8b0: 66 20 63 6f 6c 75 6d 6e 73 20 2a 2f 0a 20 20 69  f columns */.  i
d8c0: 6e 74 20 6e 53 65 74 50 32 20 3d 20 30 3b 20 20  nt nSetP2 = 0;  
d8d0: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
d8e0: 66 20 73 6c 6f 74 73 20 69 6e 20 61 53 65 74 50  f slots in aSetP
d8f0: 32 5b 5d 20 75 73 65 64 20 2a 2f 0a 0a 20 20 2f  2[] used */..  /
d900: 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65 72  * Make sure ther
d910: 65 20 69 73 20 6e 6f 20 4f 52 44 45 52 20 42 59  e is no ORDER BY
d920: 20 6f 72 20 4c 49 4d 49 54 20 63 6c 61 75 73 65   or LIMIT clause
d930: 20 6f 6e 20 70 72 69 6f 72 20 53 45 4c 45 43 54   on prior SELECT
d940: 73 2e 20 20 4f 6e 6c 79 0a 20 20 2a 2a 20 74 68  s.  Only.  ** th
d950: 65 20 6c 61 73 74 20 28 72 69 67 68 74 2d 6d 6f  e last (right-mo
d960: 73 74 29 20 53 45 4c 45 43 54 20 69 6e 20 74 68  st) SELECT in th
d970: 65 20 73 65 72 69 65 73 20 6d 61 79 20 68 61 76  e series may hav
d980: 65 20 61 6e 20 4f 52 44 45 52 20 42 59 20 6f 72  e an ORDER BY or
d990: 20 4c 49 4d 49 54 2e 0a 20 20 2a 2f 0a 20 20 69   LIMIT..  */.  i
d9a0: 66 28 20 70 3d 3d 30 20 7c 7c 20 70 2d 3e 70 50  f( p==0 || p->pP
d9b0: 72 69 6f 72 3d 3d 30 20 29 7b 0a 20 20 20 20 72  rior==0 ){.    r
d9c0: 63 20 3d 20 31 3b 0a 20 20 20 20 67 6f 74 6f 20  c = 1;.    goto 
d9d0: 6d 75 6c 74 69 5f 73 65 6c 65 63 74 5f 65 6e 64  multi_select_end
d9e0: 3b 0a 20 20 7d 0a 20 20 70 50 72 69 6f 72 20 3d  ;.  }.  pPrior =
d9f0: 20 70 2d 3e 70 50 72 69 6f 72 3b 0a 20 20 61 73   p->pPrior;.  as
da00: 73 65 72 74 28 20 70 50 72 69 6f 72 2d 3e 70 52  sert( pPrior->pR
da10: 69 67 68 74 6d 6f 73 74 21 3d 70 50 72 69 6f 72  ightmost!=pPrior
da20: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50   );.  assert( pP
da30: 72 69 6f 72 2d 3e 70 52 69 67 68 74 6d 6f 73 74  rior->pRightmost
da40: 3d 3d 70 2d 3e 70 52 69 67 68 74 6d 6f 73 74 20  ==p->pRightmost 
da50: 29 3b 0a 20 20 69 66 28 20 70 50 72 69 6f 72 2d  );.  if( pPrior-
da60: 3e 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20  >pOrderBy ){.   
da70: 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
da80: 28 70 50 61 72 73 65 2c 22 4f 52 44 45 52 20 42  (pParse,"ORDER B
da90: 59 20 63 6c 61 75 73 65 20 73 68 6f 75 6c 64 20  Y clause should 
daa0: 63 6f 6d 65 20 61 66 74 65 72 20 25 73 20 6e 6f  come after %s no
dab0: 74 20 62 65 66 6f 72 65 22 2c 0a 20 20 20 20 20  t before",.     
dac0: 20 73 65 6c 65 63 74 4f 70 4e 61 6d 65 28 70 2d   selectOpName(p-
dad0: 3e 6f 70 29 29 3b 0a 20 20 20 20 72 63 20 3d 20  >op));.    rc = 
dae0: 31 3b 0a 20 20 20 20 67 6f 74 6f 20 6d 75 6c 74  1;.    goto mult
daf0: 69 5f 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20  i_select_end;.  
db00: 7d 0a 20 20 69 66 28 20 70 50 72 69 6f 72 2d 3e  }.  if( pPrior->
db10: 70 4c 69 6d 69 74 20 29 7b 0a 20 20 20 20 73 71  pLimit ){.    sq
db20: 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
db30: 61 72 73 65 2c 22 4c 49 4d 49 54 20 63 6c 61 75  arse,"LIMIT clau
db40: 73 65 20 73 68 6f 75 6c 64 20 63 6f 6d 65 20 61  se should come a
db50: 66 74 65 72 20 25 73 20 6e 6f 74 20 62 65 66 6f  fter %s not befo
db60: 72 65 22 2c 0a 20 20 20 20 20 20 73 65 6c 65 63  re",.      selec
db70: 74 4f 70 4e 61 6d 65 28 70 2d 3e 6f 70 29 29 3b  tOpName(p->op));
db80: 0a 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 20  .    rc = 1;.   
db90: 20 67 6f 74 6f 20 6d 75 6c 74 69 5f 73 65 6c 65   goto multi_sele
dba0: 63 74 5f 65 6e 64 3b 0a 20 20 7d 0a 0a 20 20 2f  ct_end;.  }..  /
dbb0: 2a 20 4d 61 6b 65 20 73 75 72 65 20 77 65 20 68  * Make sure we h
dbc0: 61 76 65 20 61 20 76 61 6c 69 64 20 71 75 65 72  ave a valid quer
dbd0: 79 20 65 6e 67 69 6e 65 2e 20 20 49 66 20 6e 6f  y engine.  If no
dbe0: 74 2c 20 63 72 65 61 74 65 20 61 20 6e 65 77 20  t, create a new 
dbf0: 6f 6e 65 2e 0a 20 20 2a 2f 0a 20 20 76 20 3d 20  one..  */.  v = 
dc00: 73 71 6c 69 74 65 33 47 65 74 56 64 62 65 28 70  sqlite3GetVdbe(p
dc10: 50 61 72 73 65 29 3b 0a 20 20 69 66 28 20 76 3d  Parse);.  if( v=
dc20: 3d 30 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 31  =0 ){.    rc = 1
dc30: 3b 0a 20 20 20 20 67 6f 74 6f 20 6d 75 6c 74 69  ;.    goto multi
dc40: 5f 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 7d  _select_end;.  }
dc50: 0a 0a 20 20 2f 2a 20 43 72 65 61 74 65 20 74 68  ..  /* Create th
dc60: 65 20 64 65 73 74 69 6e 61 74 69 6f 6e 20 74 65  e destination te
dc70: 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20 69 66  mporary table if
dc80: 20 6e 65 63 65 73 73 61 72 79 0a 20 20 2a 2f 0a   necessary.  */.
dc90: 20 20 69 66 28 20 65 44 65 73 74 3d 3d 53 52 54    if( eDest==SRT
dca0: 5f 45 70 68 65 6d 54 61 62 20 29 7b 0a 20 20 20  _EphemTab ){.   
dcb0: 20 61 73 73 65 72 74 28 20 70 2d 3e 70 45 4c 69   assert( p->pELi
dcc0: 73 74 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  st );.    assert
dcd0: 28 20 6e 53 65 74 50 32 3c 73 69 7a 65 6f 66 28  ( nSetP2<sizeof(
dce0: 61 53 65 74 50 32 29 2f 73 69 7a 65 6f 66 28 61  aSetP2)/sizeof(a
dcf0: 53 65 74 50 32 5b 30 5d 29 20 29 3b 0a 20 20 20  SetP2[0]) );.   
dd00: 20 61 53 65 74 50 32 5b 6e 53 65 74 50 32 2b 2b   aSetP2[nSetP2++
dd10: 5d 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41  ] = sqlite3VdbeA
dd20: 64 64 4f 70 28 76 2c 20 4f 50 5f 4f 70 65 6e 45  ddOp(v, OP_OpenE
dd30: 70 68 65 6d 65 72 61 6c 2c 20 69 50 61 72 6d 2c  phemeral, iParm,
dd40: 20 30 29 3b 0a 20 20 20 20 65 44 65 73 74 20 3d   0);.    eDest =
dd50: 20 53 52 54 5f 54 61 62 6c 65 3b 0a 20 20 7d 0a   SRT_Table;.  }.
dd60: 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63  .  /* Generate c
dd70: 6f 64 65 20 66 6f 72 20 74 68 65 20 6c 65 66 74  ode for the left
dd80: 20 61 6e 64 20 72 69 67 68 74 20 53 45 4c 45 43   and right SELEC
dd90: 54 20 73 74 61 74 65 6d 65 6e 74 73 2e 0a 20 20  T statements..  
dda0: 2a 2f 0a 20 20 70 4f 72 64 65 72 42 79 20 3d 20  */.  pOrderBy = 
ddb0: 70 2d 3e 70 4f 72 64 65 72 42 79 3b 0a 20 20 73  p->pOrderBy;.  s
ddc0: 77 69 74 63 68 28 20 70 2d 3e 6f 70 20 29 7b 0a  witch( p->op ){.
ddd0: 20 20 20 20 63 61 73 65 20 54 4b 5f 41 4c 4c 3a      case TK_ALL:
dde0: 20 7b 0a 20 20 20 20 20 20 69 66 28 20 70 4f 72   {.      if( pOr
ddf0: 64 65 72 42 79 3d 3d 30 20 29 7b 0a 20 20 20 20  derBy==0 ){.    
de00: 20 20 20 20 69 6e 74 20 61 64 64 72 20 3d 20 30      int addr = 0
de10: 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ;.        assert
de20: 28 20 21 70 50 72 69 6f 72 2d 3e 70 4c 69 6d 69  ( !pPrior->pLimi
de30: 74 20 29 3b 0a 20 20 20 20 20 20 20 20 70 50 72  t );.        pPr
de40: 69 6f 72 2d 3e 70 4c 69 6d 69 74 20 3d 20 70 2d  ior->pLimit = p-
de50: 3e 70 4c 69 6d 69 74 3b 0a 20 20 20 20 20 20 20  >pLimit;.       
de60: 20 70 50 72 69 6f 72 2d 3e 70 4f 66 66 73 65 74   pPrior->pOffset
de70: 20 3d 20 70 2d 3e 70 4f 66 66 73 65 74 3b 0a 20   = p->pOffset;. 
de80: 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
de90: 74 65 33 53 65 6c 65 63 74 28 70 50 61 72 73 65  te3Select(pParse
dea0: 2c 20 70 50 72 69 6f 72 2c 20 65 44 65 73 74 2c  , pPrior, eDest,
deb0: 20 69 50 61 72 6d 2c 20 30 2c 20 30 2c 20 30 2c   iParm, 0, 0, 0,
dec0: 20 61 66 66 29 3b 0a 20 20 20 20 20 20 20 20 70   aff);.        p
ded0: 2d 3e 70 4c 69 6d 69 74 20 3d 20 30 3b 0a 20 20  ->pLimit = 0;.  
dee0: 20 20 20 20 20 20 70 2d 3e 70 4f 66 66 73 65 74        p->pOffset
def0: 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 69 66   = 0;.        if
df00: 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20  ( rc ){.        
df10: 20 20 67 6f 74 6f 20 6d 75 6c 74 69 5f 73 65 6c    goto multi_sel
df20: 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 20 20 20  ect_end;.       
df30: 20 7d 0a 20 20 20 20 20 20 20 20 70 2d 3e 70 50   }.        p->pP
df40: 72 69 6f 72 20 3d 20 30 3b 0a 20 20 20 20 20 20  rior = 0;.      
df50: 20 20 70 2d 3e 69 4c 69 6d 69 74 20 3d 20 70 50    p->iLimit = pP
df60: 72 69 6f 72 2d 3e 69 4c 69 6d 69 74 3b 0a 20 20  rior->iLimit;.  
df70: 20 20 20 20 20 20 70 2d 3e 69 4f 66 66 73 65 74        p->iOffset
df80: 20 3d 20 70 50 72 69 6f 72 2d 3e 69 4f 66 66 73   = pPrior->iOffs
df90: 65 74 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  et;.        if( 
dfa0: 70 2d 3e 69 4c 69 6d 69 74 3e 3d 30 20 29 7b 0a  p->iLimit>=0 ){.
dfb0: 20 20 20 20 20 20 20 20 20 20 61 64 64 72 20 3d            addr =
dfc0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
dfd0: 70 28 76 2c 20 4f 50 5f 49 66 4d 65 6d 5a 65 72  p(v, OP_IfMemZer
dfe0: 6f 2c 20 70 2d 3e 69 4c 69 6d 69 74 2c 20 30 29  o, p->iLimit, 0)
dff0: 3b 0a 20 20 20 20 20 20 20 20 20 20 56 64 62 65  ;.          Vdbe
e000: 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 23 20 4a  Comment((v, "# J
e010: 75 6d 70 20 61 68 65 61 64 20 69 66 20 4c 49 4d  ump ahead if LIM
e020: 49 54 20 72 65 61 63 68 65 64 22 29 29 3b 0a 20  IT reached"));. 
e030: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
e040: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 53 65 6c   rc = sqlite3Sel
e050: 65 63 74 28 70 50 61 72 73 65 2c 20 70 2c 20 65  ect(pParse, p, e
e060: 44 65 73 74 2c 20 69 50 61 72 6d 2c 20 30 2c 20  Dest, iParm, 0, 
e070: 30 2c 20 30 2c 20 61 66 66 29 3b 0a 20 20 20 20  0, 0, aff);.    
e080: 20 20 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d 20      p->pPrior = 
e090: 70 50 72 69 6f 72 3b 0a 20 20 20 20 20 20 20 20  pPrior;.        
e0a0: 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20  if( rc ){.      
e0b0: 20 20 20 20 67 6f 74 6f 20 6d 75 6c 74 69 5f 73      goto multi_s
e0c0: 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 20  elect_end;.     
e0d0: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28     }.        if(
e0e0: 20 61 64 64 72 20 29 7b 0a 20 20 20 20 20 20 20   addr ){.       
e0f0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75     sqlite3VdbeJu
e100: 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72 29 3b  mpHere(v, addr);
e110: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
e120: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
e130: 7d 0a 20 20 20 20 20 20 2f 2a 20 46 6f 72 20 55  }.      /* For U
e140: 4e 49 4f 4e 20 41 4c 4c 20 2e 2e 2e 20 4f 52 44  NION ALL ... ORD
e150: 45 52 20 42 59 20 66 61 6c 6c 20 74 68 72 6f 75  ER BY fall throu
e160: 67 68 20 74 6f 20 74 68 65 20 6e 65 78 74 20 63  gh to the next c
e170: 61 73 65 20 2a 2f 0a 20 20 20 20 7d 0a 20 20 20  ase */.    }.   
e180: 20 63 61 73 65 20 54 4b 5f 45 58 43 45 50 54 3a   case TK_EXCEPT:
e190: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 55 4e 49  .    case TK_UNI
e1a0: 4f 4e 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20  ON: {.      int 
e1b0: 75 6e 69 6f 6e 54 61 62 3b 20 20 20 20 2f 2a 20  unionTab;    /* 
e1c0: 43 75 72 73 6f 72 20 6e 75 6d 62 65 72 20 6f 66  Cursor number of
e1d0: 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79 20 74   the temporary t
e1e0: 61 62 6c 65 20 68 6f 6c 64 69 6e 67 20 72 65 73  able holding res
e1f0: 75 6c 74 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74  ult */.      int
e200: 20 6f 70 20 3d 20 30 3b 20 20 20 20 20 20 2f 2a   op = 0;      /*
e210: 20 4f 6e 65 20 6f 66 20 74 68 65 20 53 52 54 5f   One of the SRT_
e220: 20 6f 70 65 72 61 74 69 6f 6e 73 20 74 6f 20 61   operations to a
e230: 70 70 6c 79 20 74 6f 20 73 65 6c 66 20 2a 2f 0a  pply to self */.
e240: 20 20 20 20 20 20 69 6e 74 20 70 72 69 6f 72 4f        int priorO
e250: 70 3b 20 20 20 20 20 2f 2a 20 54 68 65 20 53 52  p;     /* The SR
e260: 54 5f 20 6f 70 65 72 61 74 69 6f 6e 20 74 6f 20  T_ operation to 
e270: 61 70 70 6c 79 20 74 6f 20 70 72 69 6f 72 20 73  apply to prior s
e280: 65 6c 65 63 74 73 20 2a 2f 0a 20 20 20 20 20 20  elects */.      
e290: 45 78 70 72 20 2a 70 4c 69 6d 69 74 2c 20 2a 70  Expr *pLimit, *p
e2a0: 4f 66 66 73 65 74 3b 20 2f 2a 20 53 61 76 65 64  Offset; /* Saved
e2b0: 20 76 61 6c 75 65 73 20 6f 66 20 70 2d 3e 6e 4c   values of p->nL
e2c0: 69 6d 69 74 20 61 6e 64 20 70 2d 3e 6e 4f 66 66  imit and p->nOff
e2d0: 73 65 74 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74  set */.      int
e2e0: 20 61 64 64 72 3b 0a 0a 20 20 20 20 20 20 70 72   addr;..      pr
e2f0: 69 6f 72 4f 70 20 3d 20 70 2d 3e 6f 70 3d 3d 54  iorOp = p->op==T
e300: 4b 5f 41 4c 4c 20 3f 20 53 52 54 5f 54 61 62 6c  K_ALL ? SRT_Tabl
e310: 65 20 3a 20 53 52 54 5f 55 6e 69 6f 6e 3b 0a 20  e : SRT_Union;. 
e320: 20 20 20 20 20 69 66 28 20 65 44 65 73 74 3d 3d       if( eDest==
e330: 70 72 69 6f 72 4f 70 20 26 26 20 70 4f 72 64 65  priorOp && pOrde
e340: 72 42 79 3d 3d 30 20 26 26 20 21 70 2d 3e 70 4c  rBy==0 && !p->pL
e350: 69 6d 69 74 20 26 26 20 21 70 2d 3e 70 4f 66 66  imit && !p->pOff
e360: 73 65 74 20 29 7b 0a 20 20 20 20 20 20 20 20 2f  set ){.        /
e370: 2a 20 57 65 20 63 61 6e 20 72 65 75 73 65 20 61  * We can reuse a
e380: 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65   temporary table
e390: 20 67 65 6e 65 72 61 74 65 64 20 62 79 20 61 20   generated by a 
e3a0: 53 45 4c 45 43 54 20 74 6f 20 6f 75 72 0a 20 20  SELECT to our.  
e3b0: 20 20 20 20 20 20 2a 2a 20 72 69 67 68 74 2e 0a        ** right..
e3c0: 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
e3d0: 20 20 20 75 6e 69 6f 6e 54 61 62 20 3d 20 69 50     unionTab = iP
e3e0: 61 72 6d 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  arm;.      }else
e3f0: 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 57 65 20  {.        /* We 
e400: 77 69 6c 6c 20 6e 65 65 64 20 74 6f 20 63 72 65  will need to cre
e410: 61 74 65 20 6f 75 72 20 6f 77 6e 20 74 65 6d 70  ate our own temp
e420: 6f 72 61 72 79 20 74 61 62 6c 65 20 74 6f 20 68  orary table to h
e430: 6f 6c 64 20 74 68 65 0a 20 20 20 20 20 20 20 20  old the.        
e440: 2a 2a 20 69 6e 74 65 72 6d 65 64 69 61 74 65 20  ** intermediate 
e450: 72 65 73 75 6c 74 73 2e 0a 20 20 20 20 20 20 20  results..       
e460: 20 2a 2f 0a 20 20 20 20 20 20 20 20 75 6e 69 6f   */.        unio
e470: 6e 54 61 62 20 3d 20 70 50 61 72 73 65 2d 3e 6e  nTab = pParse->n
e480: 54 61 62 2b 2b 3b 0a 20 20 20 20 20 20 20 20 69  Tab++;.        i
e490: 66 28 20 70 4f 72 64 65 72 42 79 20 26 26 20 6d  f( pOrderBy && m
e4a0: 61 74 63 68 4f 72 64 65 72 62 79 54 6f 43 6f 6c  atchOrderbyToCol
e4b0: 75 6d 6e 28 70 50 61 72 73 65 2c 20 70 2c 20 70  umn(pParse, p, p
e4c0: 4f 72 64 65 72 42 79 2c 20 75 6e 69 6f 6e 54 61  OrderBy, unionTa
e4d0: 62 2c 31 29 20 29 7b 0a 20 20 20 20 20 20 20 20  b,1) ){.        
e4e0: 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 20 20    rc = 1;.      
e4f0: 20 20 20 20 67 6f 74 6f 20 6d 75 6c 74 69 5f 73      goto multi_s
e500: 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 20  elect_end;.     
e510: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 61 64 64     }.        add
e520: 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41  r = sqlite3VdbeA
e530: 64 64 4f 70 28 76 2c 20 4f 50 5f 4f 70 65 6e 45  ddOp(v, OP_OpenE
e540: 70 68 65 6d 65 72 61 6c 2c 20 75 6e 69 6f 6e 54  phemeral, unionT
e550: 61 62 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20  ab, 0);.        
e560: 69 66 28 20 70 72 69 6f 72 4f 70 3d 3d 53 52 54  if( priorOp==SRT
e570: 5f 54 61 62 6c 65 20 29 7b 0a 20 20 20 20 20 20  _Table ){.      
e580: 20 20 20 20 61 73 73 65 72 74 28 20 6e 53 65 74      assert( nSet
e590: 50 32 3c 73 69 7a 65 6f 66 28 61 53 65 74 50 32  P2<sizeof(aSetP2
e5a0: 29 2f 73 69 7a 65 6f 66 28 61 53 65 74 50 32 5b  )/sizeof(aSetP2[
e5b0: 30 5d 29 20 29 3b 0a 20 20 20 20 20 20 20 20 20  0]) );.         
e5c0: 20 61 53 65 74 50 32 5b 6e 53 65 74 50 32 2b 2b   aSetP2[nSetP2++
e5d0: 5d 20 3d 20 61 64 64 72 3b 0a 20 20 20 20 20 20  ] = addr;.      
e5e0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
e5f0: 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 61 64     assert( p->ad
e600: 64 72 4f 70 65 6e 45 70 68 6d 5b 30 5d 20 3d 3d  drOpenEphm[0] ==
e610: 20 2d 31 20 29 3b 0a 20 20 20 20 20 20 20 20 20   -1 );.         
e620: 20 70 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d   p->addrOpenEphm
e630: 5b 30 5d 20 3d 20 61 64 64 72 3b 0a 20 20 20 20  [0] = addr;.    
e640: 20 20 20 20 20 20 70 2d 3e 70 52 69 67 68 74 6d        p->pRightm
e650: 6f 73 74 2d 3e 75 73 65 73 45 70 68 6d 20 3d 20  ost->usesEphm = 
e660: 31 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  1;.        }.   
e670: 20 20 20 20 20 63 72 65 61 74 65 53 6f 72 74 69       createSorti
e680: 6e 67 49 6e 64 65 78 28 70 50 61 72 73 65 2c 20  ngIndex(pParse, 
e690: 70 2c 20 70 4f 72 64 65 72 42 79 29 3b 0a 20 20  p, pOrderBy);.  
e6a0: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d        assert( p-
e6b0: 3e 70 45 4c 69 73 74 20 29 3b 0a 20 20 20 20 20  >pEList );.     
e6c0: 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 43 6f 64   }..      /* Cod
e6d0: 65 20 74 68 65 20 53 45 4c 45 43 54 20 73 74 61  e the SELECT sta
e6e0: 74 65 6d 65 6e 74 73 20 74 6f 20 6f 75 72 20 6c  tements to our l
e6f0: 65 66 74 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  eft.      */.   
e700: 20 20 20 61 73 73 65 72 74 28 20 21 70 50 72 69     assert( !pPri
e710: 6f 72 2d 3e 70 4f 72 64 65 72 42 79 20 29 3b 0a  or->pOrderBy );.
e720: 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
e730: 65 33 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c  e3Select(pParse,
e740: 20 70 50 72 69 6f 72 2c 20 70 72 69 6f 72 4f 70   pPrior, priorOp
e750: 2c 20 75 6e 69 6f 6e 54 61 62 2c 20 30 2c 20 30  , unionTab, 0, 0
e760: 2c 20 30 2c 20 61 66 66 29 3b 0a 20 20 20 20 20  , 0, aff);.     
e770: 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20   if( rc ){.     
e780: 20 20 20 67 6f 74 6f 20 6d 75 6c 74 69 5f 73 65     goto multi_se
e790: 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 20 20  lect_end;.      
e7a0: 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 43 6f 64 65  }..      /* Code
e7b0: 20 74 68 65 20 63 75 72 72 65 6e 74 20 53 45 4c   the current SEL
e7c0: 45 43 54 20 73 74 61 74 65 6d 65 6e 74 0a 20 20  ECT statement.  
e7d0: 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 73 77 69      */.      swi
e7e0: 74 63 68 28 20 70 2d 3e 6f 70 20 29 7b 0a 20 20  tch( p->op ){.  
e7f0: 20 20 20 20 20 20 20 63 61 73 65 20 54 4b 5f 45         case TK_E
e800: 58 43 45 50 54 3a 20 20 6f 70 20 3d 20 53 52 54  XCEPT:  op = SRT
e810: 5f 45 78 63 65 70 74 3b 20 20 20 62 72 65 61 6b  _Except;   break
e820: 3b 0a 20 20 20 20 20 20 20 20 20 63 61 73 65 20  ;.         case 
e830: 54 4b 5f 55 4e 49 4f 4e 3a 20 20 20 6f 70 20 3d  TK_UNION:   op =
e840: 20 53 52 54 5f 55 6e 69 6f 6e 3b 20 20 20 20 62   SRT_Union;    b
e850: 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 63  reak;.         c
e860: 61 73 65 20 54 4b 5f 41 4c 4c 3a 20 20 20 20 20  ase TK_ALL:     
e870: 6f 70 20 3d 20 53 52 54 5f 54 61 62 6c 65 3b 20  op = SRT_Table; 
e880: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
e890: 7d 0a 20 20 20 20 20 20 70 2d 3e 70 50 72 69 6f  }.      p->pPrio
e8a0: 72 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 2d 3e  r = 0;.      p->
e8b0: 70 4f 72 64 65 72 42 79 20 3d 20 30 3b 0a 20 20  pOrderBy = 0;.  
e8c0: 20 20 20 20 70 2d 3e 64 69 73 61 6c 6c 6f 77 4f      p->disallowO
e8d0: 72 64 65 72 42 79 20 3d 20 70 4f 72 64 65 72 42  rderBy = pOrderB
e8e0: 79 21 3d 30 3b 0a 20 20 20 20 20 20 70 4c 69 6d  y!=0;.      pLim
e8f0: 69 74 20 3d 20 70 2d 3e 70 4c 69 6d 69 74 3b 0a  it = p->pLimit;.
e900: 20 20 20 20 20 20 70 2d 3e 70 4c 69 6d 69 74 20        p->pLimit 
e910: 3d 20 30 3b 0a 20 20 20 20 20 20 70 4f 66 66 73  = 0;.      pOffs
e920: 65 74 20 3d 20 70 2d 3e 70 4f 66 66 73 65 74 3b  et = p->pOffset;
e930: 0a 20 20 20 20 20 20 70 2d 3e 70 4f 66 66 73 65  .      p->pOffse
e940: 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 72 63 20  t = 0;.      rc 
e950: 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28  = sqlite3Select(
e960: 70 50 61 72 73 65 2c 20 70 2c 20 6f 70 2c 20 75  pParse, p, op, u
e970: 6e 69 6f 6e 54 61 62 2c 20 30 2c 20 30 2c 20 30  nionTab, 0, 0, 0
e980: 2c 20 61 66 66 29 3b 0a 20 20 20 20 20 20 2f 2a  , aff);.      /*
e990: 20 51 75 65 72 79 20 66 6c 61 74 74 65 6e 69 6e   Query flattenin
e9a0: 67 20 69 6e 20 73 71 6c 69 74 65 33 53 65 6c 65  g in sqlite3Sele
e9b0: 63 74 28 29 20 6d 69 67 68 74 20 72 65 66 69 6c  ct() might refil
e9c0: 6c 20 70 2d 3e 70 4f 72 64 65 72 42 79 2e 0a 20  l p->pOrderBy.. 
e9d0: 20 20 20 20 20 2a 2a 20 42 65 20 73 75 72 65 20       ** Be sure 
e9e0: 74 6f 20 64 65 6c 65 74 65 20 70 2d 3e 70 4f 72  to delete p->pOr
e9f0: 64 65 72 42 79 2c 20 74 68 65 72 65 66 6f 72 65  derBy, therefore
ea00: 2c 20 74 6f 20 61 76 6f 69 64 20 61 20 6d 65 6d  , to avoid a mem
ea10: 6f 72 79 20 6c 65 61 6b 2e 20 2a 2f 0a 20 20 20  ory leak. */.   
ea20: 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69     sqlite3ExprLi
ea30: 73 74 44 65 6c 65 74 65 28 70 2d 3e 70 4f 72 64  stDelete(p->pOrd
ea40: 65 72 42 79 29 3b 0a 20 20 20 20 20 20 70 2d 3e  erBy);.      p->
ea50: 70 50 72 69 6f 72 20 3d 20 70 50 72 69 6f 72 3b  pPrior = pPrior;
ea60: 0a 20 20 20 20 20 20 70 2d 3e 70 4f 72 64 65 72  .      p->pOrder
ea70: 42 79 20 3d 20 70 4f 72 64 65 72 42 79 3b 0a 20  By = pOrderBy;. 
ea80: 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
ea90: 44 65 6c 65 74 65 28 70 2d 3e 70 4c 69 6d 69 74  Delete(p->pLimit
eaa0: 29 3b 0a 20 20 20 20 20 20 70 2d 3e 70 4c 69 6d  );.      p->pLim
eab0: 69 74 20 3d 20 70 4c 69 6d 69 74 3b 0a 20 20 20  it = pLimit;.   
eac0: 20 20 20 70 2d 3e 70 4f 66 66 73 65 74 20 3d 20     p->pOffset = 
ead0: 70 4f 66 66 73 65 74 3b 0a 20 20 20 20 20 20 70  pOffset;.      p
eae0: 2d 3e 69 4c 69 6d 69 74 20 3d 20 2d 31 3b 0a 20  ->iLimit = -1;. 
eaf0: 20 20 20 20 20 70 2d 3e 69 4f 66 66 73 65 74 20       p->iOffset 
eb00: 3d 20 2d 31 3b 0a 20 20 20 20 20 20 69 66 28 20  = -1;.      if( 
eb10: 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20 67 6f  rc ){.        go
eb20: 74 6f 20 6d 75 6c 74 69 5f 73 65 6c 65 63 74 5f  to multi_select_
eb30: 65 6e 64 3b 0a 20 20 20 20 20 20 7d 0a 0a 0a 20  end;.      }... 
eb40: 20 20 20 20 20 2f 2a 20 43 6f 6e 76 65 72 74 20       /* Convert 
eb50: 74 68 65 20 64 61 74 61 20 69 6e 20 74 68 65 20  the data in the 
eb60: 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20  temporary table 
eb70: 69 6e 74 6f 20 77 68 61 74 65 76 65 72 20 66 6f  into whatever fo
eb80: 72 6d 0a 20 20 20 20 20 20 2a 2a 20 69 74 20 69  rm.      ** it i
eb90: 73 20 74 68 61 74 20 77 65 20 63 75 72 72 65 6e  s that we curren
eba0: 74 6c 79 20 6e 65 65 64 2e 0a 20 20 20 20 20 20  tly need..      
ebb0: 2a 2f 20 20 20 20 20 20 0a 20 20 20 20 20 20 69  */      .      i
ebc0: 66 28 20 65 44 65 73 74 21 3d 70 72 69 6f 72 4f  f( eDest!=priorO
ebd0: 70 20 7c 7c 20 75 6e 69 6f 6e 54 61 62 21 3d 69  p || unionTab!=i
ebe0: 50 61 72 6d 20 29 7b 0a 20 20 20 20 20 20 20 20  Parm ){.        
ebf0: 69 6e 74 20 69 43 6f 6e 74 2c 20 69 42 72 65 61  int iCont, iBrea
ec00: 6b 2c 20 69 53 74 61 72 74 3b 0a 20 20 20 20 20  k, iStart;.     
ec10: 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 45     assert( p->pE
ec20: 4c 69 73 74 20 29 3b 0a 20 20 20 20 20 20 20 20  List );.        
ec30: 69 66 28 20 65 44 65 73 74 3d 3d 53 52 54 5f 43  if( eDest==SRT_C
ec40: 61 6c 6c 62 61 63 6b 20 29 7b 0a 20 20 20 20 20  allback ){.     
ec50: 20 20 20 20 20 53 65 6c 65 63 74 20 2a 70 46 69       Select *pFi
ec60: 72 73 74 20 3d 20 70 3b 0a 20 20 20 20 20 20 20  rst = p;.       
ec70: 20 20 20 77 68 69 6c 65 28 20 70 46 69 72 73 74     while( pFirst
ec80: 2d 3e 70 50 72 69 6f 72 20 29 20 70 46 69 72 73  ->pPrior ) pFirs
ec90: 74 20 3d 20 70 46 69 72 73 74 2d 3e 70 50 72 69  t = pFirst->pPri
eca0: 6f 72 3b 0a 20 20 20 20 20 20 20 20 20 20 67 65  or;.          ge
ecb0: 6e 65 72 61 74 65 43 6f 6c 75 6d 6e 4e 61 6d 65  nerateColumnName
ecc0: 73 28 70 50 61 72 73 65 2c 20 30 2c 20 70 46 69  s(pParse, 0, pFi
ecd0: 72 73 74 2d 3e 70 45 4c 69 73 74 29 3b 0a 20 20  rst->pEList);.  
ece0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
ecf0: 69 42 72 65 61 6b 20 3d 20 73 71 6c 69 74 65 33  iBreak = sqlite3
ed00: 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29  VdbeMakeLabel(v)
ed10: 3b 0a 20 20 20 20 20 20 20 20 69 43 6f 6e 74 20  ;.        iCont 
ed20: 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b  = sqlite3VdbeMak
ed30: 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 20  eLabel(v);.     
ed40: 20 20 20 63 6f 6d 70 75 74 65 4c 69 6d 69 74 52     computeLimitR
ed50: 65 67 69 73 74 65 72 73 28 70 50 61 72 73 65 2c  egisters(pParse,
ed60: 20 70 2c 20 69 42 72 65 61 6b 29 3b 0a 20 20 20   p, iBreak);.   
ed70: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
ed80: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 52 65 77 69  AddOp(v, OP_Rewi
ed90: 6e 64 2c 20 75 6e 69 6f 6e 54 61 62 2c 20 69 42  nd, unionTab, iB
eda0: 72 65 61 6b 29 3b 0a 20 20 20 20 20 20 20 20 69  reak);.        i
edb0: 53 74 61 72 74 20 3d 20 73 71 6c 69 74 65 33 56  Start = sqlite3V
edc0: 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76  dbeCurrentAddr(v
edd0: 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  );.        rc = 
ede0: 73 65 6c 65 63 74 49 6e 6e 65 72 4c 6f 6f 70 28  selectInnerLoop(
edf0: 70 50 61 72 73 65 2c 20 70 2c 20 70 2d 3e 70 45  pParse, p, p->pE
ee00: 4c 69 73 74 2c 20 75 6e 69 6f 6e 54 61 62 2c 20  List, unionTab, 
ee10: 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72  p->pEList->nExpr
ee20: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
ee30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
ee40: 4f 72 64 65 72 42 79 2c 20 2d 31 2c 20 65 44 65  OrderBy, -1, eDe
ee50: 73 74 2c 20 69 50 61 72 6d 2c 20 0a 20 20 20 20  st, iParm, .    
ee60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ee70: 20 20 20 20 20 20 20 20 20 69 43 6f 6e 74 2c 20           iCont, 
ee80: 69 42 72 65 61 6b 2c 20 30 29 3b 0a 20 20 20 20  iBreak, 0);.    
ee90: 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20      if( rc ){.  
eea0: 20 20 20 20 20 20 20 20 72 63 20 3d 20 31 3b 0a          rc = 1;.
eeb0: 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 6d            goto m
eec0: 75 6c 74 69 5f 73 65 6c 65 63 74 5f 65 6e 64 3b  ulti_select_end;
eed0: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
eee0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65     sqlite3VdbeRe
eef0: 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 69 43  solveLabel(v, iC
ef00: 6f 6e 74 29 3b 0a 20 20 20 20 20 20 20 20 73 71  ont);.        sq
ef10: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
ef20: 2c 20 4f 50 5f 4e 65 78 74 2c 20 75 6e 69 6f 6e  , OP_Next, union
ef30: 54 61 62 2c 20 69 53 74 61 72 74 29 3b 0a 20 20  Tab, iStart);.  
ef40: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
ef50: 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c  eResolveLabel(v,
ef60: 20 69 42 72 65 61 6b 29 3b 0a 20 20 20 20 20 20   iBreak);.      
ef70: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
ef80: 4f 70 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20  Op(v, OP_Close, 
ef90: 75 6e 69 6f 6e 54 61 62 2c 20 30 29 3b 0a 20 20  unionTab, 0);.  
efa0: 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61      }.      brea
efb0: 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  k;.    }.    cas
efc0: 65 20 54 4b 5f 49 4e 54 45 52 53 45 43 54 3a 20  e TK_INTERSECT: 
efd0: 7b 0a 20 20 20 20 20 20 69 6e 74 20 74 61 62 31  {.      int tab1
efe0: 2c 20 74 61 62 32 3b 0a 20 20 20 20 20 20 69 6e  , tab2;.      in
eff0: 74 20 69 43 6f 6e 74 2c 20 69 42 72 65 61 6b 2c  t iCont, iBreak,
f000: 20 69 53 74 61 72 74 3b 0a 20 20 20 20 20 20 45   iStart;.      E
f010: 78 70 72 20 2a 70 4c 69 6d 69 74 2c 20 2a 70 4f  xpr *pLimit, *pO
f020: 66 66 73 65 74 3b 0a 20 20 20 20 20 20 69 6e 74  ffset;.      int
f030: 20 61 64 64 72 3b 0a 0a 20 20 20 20 20 20 2f 2a   addr;..      /*
f040: 20 49 4e 54 45 52 53 45 43 54 20 69 73 20 64 69   INTERSECT is di
f050: 66 66 65 72 65 6e 74 20 66 72 6f 6d 20 74 68 65  fferent from the
f060: 20 6f 74 68 65 72 73 20 73 69 6e 63 65 20 69 74   others since it
f070: 20 72 65 71 75 69 72 65 73 0a 20 20 20 20 20 20   requires.      
f080: 2a 2a 20 74 77 6f 20 74 65 6d 70 6f 72 61 72 79  ** two temporary
f090: 20 74 61 62 6c 65 73 2e 20 20 48 65 6e 63 65 20   tables.  Hence 
f0a0: 69 74 20 68 61 73 20 69 74 73 20 6f 77 6e 20 63  it has its own c
f0b0: 61 73 65 2e 20 20 42 65 67 69 6e 0a 20 20 20 20  ase.  Begin.    
f0c0: 20 20 2a 2a 20 62 79 20 61 6c 6c 6f 63 61 74 69    ** by allocati
f0d0: 6e 67 20 74 68 65 20 74 61 62 6c 65 73 20 77 65  ng the tables we
f0e0: 20 77 69 6c 6c 20 6e 65 65 64 2e 0a 20 20 20 20   will need..    
f0f0: 20 20 2a 2f 0a 20 20 20 20 20 20 74 61 62 31 20    */.      tab1 
f100: 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b  = pParse->nTab++
f110: 3b 0a 20 20 20 20 20 20 74 61 62 32 20 3d 20 70  ;.      tab2 = p
f120: 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20  Parse->nTab++;. 
f130: 20 20 20 20 20 69 66 28 20 70 4f 72 64 65 72 42       if( pOrderB
f140: 79 20 26 26 20 6d 61 74 63 68 4f 72 64 65 72 62  y && matchOrderb
f150: 79 54 6f 43 6f 6c 75 6d 6e 28 70 50 61 72 73 65  yToColumn(pParse
f160: 2c 70 2c 70 4f 72 64 65 72 42 79 2c 74 61 62 31  ,p,pOrderBy,tab1
f170: 2c 31 29 20 29 7b 0a 20 20 20 20 20 20 20 20 72  ,1) ){.        r
f180: 63 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 67  c = 1;.        g
f190: 6f 74 6f 20 6d 75 6c 74 69 5f 73 65 6c 65 63 74  oto multi_select
f1a0: 5f 65 6e 64 3b 0a 20 20 20 20 20 20 7d 0a 20 20  _end;.      }.  
f1b0: 20 20 20 20 63 72 65 61 74 65 53 6f 72 74 69 6e      createSortin
f1c0: 67 49 6e 64 65 78 28 70 50 61 72 73 65 2c 20 70  gIndex(pParse, p
f1d0: 2c 20 70 4f 72 64 65 72 42 79 29 3b 0a 0a 20 20  , pOrderBy);..  
f1e0: 20 20 20 20 61 64 64 72 20 3d 20 73 71 6c 69 74      addr = sqlit
f1f0: 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
f200: 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 2c  P_OpenEphemeral,
f210: 20 74 61 62 31 2c 20 30 29 3b 0a 20 20 20 20 20   tab1, 0);.     
f220: 20 61 73 73 65 72 74 28 20 70 2d 3e 61 64 64 72   assert( p->addr
f230: 4f 70 65 6e 45 70 68 6d 5b 30 5d 20 3d 3d 20 2d  OpenEphm[0] == -
f240: 31 20 29 3b 0a 20 20 20 20 20 20 70 2d 3e 61 64  1 );.      p->ad
f250: 64 72 4f 70 65 6e 45 70 68 6d 5b 30 5d 20 3d 20  drOpenEphm[0] = 
f260: 61 64 64 72 3b 0a 20 20 20 20 20 20 70 2d 3e 70  addr;.      p->p
f270: 52 69 67 68 74 6d 6f 73 74 2d 3e 75 73 65 73 45  Rightmost->usesE
f280: 70 68 6d 20 3d 20 31 3b 0a 20 20 20 20 20 20 61  phm = 1;.      a
f290: 73 73 65 72 74 28 20 70 2d 3e 70 45 4c 69 73 74  ssert( p->pEList
f2a0: 20 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 43 6f   );..      /* Co
f2b0: 64 65 20 74 68 65 20 53 45 4c 45 43 54 73 20 74  de the SELECTs t
f2c0: 6f 20 6f 75 72 20 6c 65 66 74 20 69 6e 74 6f 20  o our left into 
f2d0: 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20  temporary table 
f2e0: 22 74 61 62 31 22 2e 0a 20 20 20 20 20 20 2a 2f  "tab1"..      */
f2f0: 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
f300: 74 65 33 53 65 6c 65 63 74 28 70 50 61 72 73 65  te3Select(pParse
f310: 2c 20 70 50 72 69 6f 72 2c 20 53 52 54 5f 55 6e  , pPrior, SRT_Un
f320: 69 6f 6e 2c 20 74 61 62 31 2c 20 30 2c 20 30 2c  ion, tab1, 0, 0,
f330: 20 30 2c 20 61 66 66 29 3b 0a 20 20 20 20 20 20   0, aff);.      
f340: 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20  if( rc ){.      
f350: 20 20 67 6f 74 6f 20 6d 75 6c 74 69 5f 73 65 6c    goto multi_sel
f360: 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 20 20 7d  ect_end;.      }
f370: 0a 0a 20 20 20 20 20 20 2f 2a 20 43 6f 64 65 20  ..      /* Code 
f380: 74 68 65 20 63 75 72 72 65 6e 74 20 53 45 4c 45  the current SELE
f390: 43 54 20 69 6e 74 6f 20 74 65 6d 70 6f 72 61 72  CT into temporar
f3a0: 79 20 74 61 62 6c 65 20 22 74 61 62 32 22 0a 20  y table "tab2". 
f3b0: 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 61 64       */.      ad
f3c0: 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  dr = sqlite3Vdbe
f3d0: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4f 70 65 6e  AddOp(v, OP_Open
f3e0: 45 70 68 65 6d 65 72 61 6c 2c 20 74 61 62 32 2c  Ephemeral, tab2,
f3f0: 20 30 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72   0);.      asser
f400: 74 28 20 70 2d 3e 61 64 64 72 4f 70 65 6e 45 70  t( p->addrOpenEp
f410: 68 6d 5b 31 5d 20 3d 3d 20 2d 31 20 29 3b 0a 20  hm[1] == -1 );. 
f420: 20 20 20 20 20 70 2d 3e 61 64 64 72 4f 70 65 6e       p->addrOpen
f430: 45 70 68 6d 5b 31 5d 20 3d 20 61 64 64 72 3b 0a  Ephm[1] = addr;.
f440: 20 20 20 20 20 20 70 2d 3e 70 50 72 69 6f 72 20        p->pPrior 
f450: 3d 20 30 3b 0a 20 20 20 20 20 20 70 4c 69 6d 69  = 0;.      pLimi
f460: 74 20 3d 20 70 2d 3e 70 4c 69 6d 69 74 3b 0a 20  t = p->pLimit;. 
f470: 20 20 20 20 20 70 2d 3e 70 4c 69 6d 69 74 20 3d       p->pLimit =
f480: 20 30 3b 0a 20 20 20 20 20 20 70 4f 66 66 73 65   0;.      pOffse
f490: 74 20 3d 20 70 2d 3e 70 4f 66 66 73 65 74 3b 0a  t = p->pOffset;.
f4a0: 20 20 20 20 20 20 70 2d 3e 70 4f 66 66 73 65 74        p->pOffset
f4b0: 20 3d 20 30 3b 0a 20 20 20 20 20 20 72 63 20 3d   = 0;.      rc =
f4c0: 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28 70   sqlite3Select(p
f4d0: 50 61 72 73 65 2c 20 70 2c 20 53 52 54 5f 55 6e  Parse, p, SRT_Un
f4e0: 69 6f 6e 2c 20 74 61 62 32 2c 20 30 2c 20 30 2c  ion, tab2, 0, 0,
f4f0: 20 30 2c 20 61 66 66 29 3b 0a 20 20 20 20 20 20   0, aff);.      
f500: 70 2d 3e 70 50 72 69 6f 72 20 3d 20 70 50 72 69  p->pPrior = pPri
f510: 6f 72 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  or;.      sqlite
f520: 33 45 78 70 72 44 65 6c 65 74 65 28 70 2d 3e 70  3ExprDelete(p->p
f530: 4c 69 6d 69 74 29 3b 0a 20 20 20 20 20 20 70 2d  Limit);.      p-
f540: 3e 70 4c 69 6d 69 74 20 3d 20 70 4c 69 6d 69 74  >pLimit = pLimit
f550: 3b 0a 20 20 20 20 20 20 70 2d 3e 70 4f 66 66 73  ;.      p->pOffs
f560: 65 74 20 3d 20 70 4f 66 66 73 65 74 3b 0a 20 20  et = pOffset;.  
f570: 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20      if( rc ){.  
f580: 20 20 20 20 20 20 67 6f 74 6f 20 6d 75 6c 74 69        goto multi
f590: 5f 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20  _select_end;.   
f5a0: 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 47     }..      /* G
f5b0: 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20  enerate code to 
f5c0: 74 61 6b 65 20 74 68 65 20 69 6e 74 65 72 73 65  take the interse
f5d0: 63 74 69 6f 6e 20 6f 66 20 74 68 65 20 74 77 6f  ction of the two
f5e0: 20 74 65 6d 70 6f 72 61 72 79 0a 20 20 20 20 20   temporary.     
f5f0: 20 2a 2a 20 74 61 62 6c 65 73 2e 0a 20 20 20 20   ** tables..    
f600: 20 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72    */.      asser
f610: 74 28 20 70 2d 3e 70 45 4c 69 73 74 20 29 3b 0a  t( p->pEList );.
f620: 20 20 20 20 20 20 69 66 28 20 65 44 65 73 74 3d        if( eDest=
f630: 3d 53 52 54 5f 43 61 6c 6c 62 61 63 6b 20 29 7b  =SRT_Callback ){
f640: 0a 20 20 20 20 20 20 20 20 53 65 6c 65 63 74 20  .        Select 
f650: 2a 70 46 69 72 73 74 20 3d 20 70 3b 0a 20 20 20  *pFirst = p;.   
f660: 20 20 20 20 20 77 68 69 6c 65 28 20 70 46 69 72       while( pFir
f670: 73 74 2d 3e 70 50 72 69 6f 72 20 29 20 70 46 69  st->pPrior ) pFi
f680: 72 73 74 20 3d 20 70 46 69 72 73 74 2d 3e 70 50  rst = pFirst->pP
f690: 72 69 6f 72 3b 0a 20 20 20 20 20 20 20 20 67 65  rior;.        ge
f6a0: 6e 65 72 61 74 65 43 6f 6c 75 6d 6e 4e 61 6d 65  nerateColumnName
f6b0: 73 28 70 50 61 72 73 65 2c 20 30 2c 20 70 46 69  s(pParse, 0, pFi
f6c0: 72 73 74 2d 3e 70 45 4c 69 73 74 29 3b 0a 20 20  rst->pEList);.  
f6d0: 20 20 20 20 7d 0a 20 20 20 20 20 20 69 42 72 65      }.      iBre
f6e0: 61 6b 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  ak = sqlite3Vdbe
f6f0: 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20  MakeLabel(v);.  
f700: 20 20 20 20 69 43 6f 6e 74 20 3d 20 73 71 6c 69      iCont = sqli
f710: 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c  te3VdbeMakeLabel
f720: 28 76 29 3b 0a 20 20 20 20 20 20 63 6f 6d 70 75  (v);.      compu
f730: 74 65 4c 69 6d 69 74 52 65 67 69 73 74 65 72 73  teLimitRegisters
f740: 28 70 50 61 72 73 65 2c 20 70 2c 20 69 42 72 65  (pParse, p, iBre
f750: 61 6b 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  ak);.      sqlit
f760: 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
f770: 50 5f 52 65 77 69 6e 64 2c 20 74 61 62 31 2c 20  P_Rewind, tab1, 
f780: 69 42 72 65 61 6b 29 3b 0a 20 20 20 20 20 20 69  iBreak);.      i
f790: 53 74 61 72 74 20 3d 20 73 71 6c 69 74 65 33 56  Start = sqlite3V
f7a0: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 52  dbeAddOp(v, OP_R
f7b0: 6f 77 4b 65 79 2c 20 74 61 62 31 2c 20 30 29 3b  owKey, tab1, 0);
f7c0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
f7d0: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4e 6f  beAddOp(v, OP_No
f7e0: 74 46 6f 75 6e 64 2c 20 74 61 62 32 2c 20 69 43  tFound, tab2, iC
f7f0: 6f 6e 74 29 3b 0a 20 20 20 20 20 20 72 63 20 3d  ont);.      rc =
f800: 20 73 65 6c 65 63 74 49 6e 6e 65 72 4c 6f 6f 70   selectInnerLoop
f810: 28 70 50 61 72 73 65 2c 20 70 2c 20 70 2d 3e 70  (pParse, p, p->p
f820: 45 4c 69 73 74 2c 20 74 61 62 31 2c 20 70 2d 3e  EList, tab1, p->
f830: 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 2c 0a 20  pEList->nExpr,. 
f840: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f850: 20 20 20 20 20 20 20 20 20 20 20 20 70 4f 72 64              pOrd
f860: 65 72 42 79 2c 20 2d 31 2c 20 65 44 65 73 74 2c  erBy, -1, eDest,
f870: 20 69 50 61 72 6d 2c 20 0a 20 20 20 20 20 20 20   iParm, .       
f880: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f890: 20 20 20 20 20 20 69 43 6f 6e 74 2c 20 69 42 72        iCont, iBr
f8a0: 65 61 6b 2c 20 30 29 3b 0a 20 20 20 20 20 20 69  eak, 0);.      i
f8b0: 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20  f( rc ){.       
f8c0: 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 20 20 20   rc = 1;.       
f8d0: 20 67 6f 74 6f 20 6d 75 6c 74 69 5f 73 65 6c 65   goto multi_sele
f8e0: 63 74 5f 65 6e 64 3b 0a 20 20 20 20 20 20 7d 0a  ct_end;.      }.
f8f0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
f900: 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c  eResolveLabel(v,
f910: 20 69 43 6f 6e 74 29 3b 0a 20 20 20 20 20 20 73   iCont);.      s
f920: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
f930: 76 2c 20 4f 50 5f 4e 65 78 74 2c 20 74 61 62 31  v, OP_Next, tab1
f940: 2c 20 69 53 74 61 72 74 29 3b 0a 20 20 20 20 20  , iStart);.     
f950: 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f   sqlite3VdbeReso
f960: 6c 76 65 4c 61 62 65 6c 28 76 2c 20 69 42 72 65  lveLabel(v, iBre
f970: 61 6b 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  ak);.      sqlit
f980: 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
f990: 50 5f 43 6c 6f 73 65 2c 20 74 61 62 32 2c 20 30  P_Close, tab2, 0
f9a0: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
f9b0: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
f9c0: 43 6c 6f 73 65 2c 20 74 61 62 31 2c 20 30 29 3b  Close, tab1, 0);
f9d0: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
f9e0: 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61    }.  }..  /* Ma
f9f0: 6b 65 20 73 75 72 65 20 61 6c 6c 20 53 45 4c 45  ke sure all SELE
fa00: 43 54 73 20 69 6e 20 74 68 65 20 73 74 61 74 65  CTs in the state
fa10: 6d 65 6e 74 20 68 61 76 65 20 74 68 65 20 73 61  ment have the sa
fa20: 6d 65 20 6e 75 6d 62 65 72 20 6f 66 20 65 6c 65  me number of ele
fa30: 6d 65 6e 74 73 0a 20 20 2a 2a 20 69 6e 20 74 68  ments.  ** in th
fa40: 65 69 72 20 72 65 73 75 6c 74 20 73 65 74 73 2e  eir result sets.
fa50: 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  .  */.  assert( 
fa60: 70 2d 3e 70 45 4c 69 73 74 20 26 26 20 70 50 72  p->pEList && pPr
fa70: 69 6f 72 2d 3e 70 45 4c 69 73 74 20 29 3b 0a 20  ior->pEList );. 
fa80: 20 69 66 28 20 70 2d 3e 70 45 4c 69 73 74 2d 3e   if( p->pEList->
fa90: 6e 45 78 70 72 21 3d 70 50 72 69 6f 72 2d 3e 70  nExpr!=pPrior->p
faa0: 45 4c 69 73 74 2d 3e 6e 45 78 70 72 20 29 7b 0a  EList->nExpr ){.
fab0: 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
fac0: 4d 73 67 28 70 50 61 72 73 65 2c 20 22 53 45 4c  Msg(pParse, "SEL
fad0: 45 43 54 73 20 74 6f 20 74 68 65 20 6c 65 66 74  ECTs to the left
fae0: 20 61 6e 64 20 72 69 67 68 74 20 6f 66 20 25 73   and right of %s
faf0: 22 0a 20 20 20 20 20 20 22 20 64 6f 20 6e 6f 74  ".      " do not
fb00: 20 68 61 76 65 20 74 68 65 20 73 61 6d 65 20 6e   have the same n
fb10: 75 6d 62 65 72 20 6f 66 20 72 65 73 75 6c 74 20  umber of result 
fb20: 63 6f 6c 75 6d 6e 73 22 2c 20 73 65 6c 65 63 74  columns", select
fb30: 4f 70 4e 61 6d 65 28 70 2d 3e 6f 70 29 29 3b 0a  OpName(p->op));.
fb40: 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20      rc = 1;.    
fb50: 67 6f 74 6f 20 6d 75 6c 74 69 5f 73 65 6c 65 63  goto multi_selec
fb60: 74 5f 65 6e 64 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  t_end;.  }..  /*
fb70: 20 53 65 74 20 74 68 65 20 6e 75 6d 62 65 72 20   Set the number 
fb80: 6f 66 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 65  of columns in te
fb90: 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 73 0a 20  mporary tables. 
fba0: 20 2a 2f 0a 20 20 6e 43 6f 6c 20 3d 20 70 2d 3e   */.  nCol = p->
fbb0: 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 0a 20  pEList->nExpr;. 
fbc0: 20 77 68 69 6c 65 28 20 6e 53 65 74 50 32 20 29   while( nSetP2 )
fbd0: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  {.    sqlite3Vdb
fbe0: 65 43 68 61 6e 67 65 50 32 28 76 2c 20 61 53 65  eChangeP2(v, aSe
fbf0: 74 50 32 5b 2d 2d 6e 53 65 74 50 32 5d 2c 20 6e  tP2[--nSetP2], n
fc00: 43 6f 6c 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  Col);.  }..  /* 
fc10: 43 6f 6d 70 75 74 65 20 63 6f 6c 6c 61 74 69 6e  Compute collatin
fc20: 67 20 73 65 71 75 65 6e 63 65 73 20 75 73 65 64  g sequences used
fc30: 20 62 79 20 65 69 74 68 65 72 20 74 68 65 20 4f   by either the O
fc40: 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 6f  RDER BY clause o
fc50: 72 0a 20 20 2a 2a 20 62 79 20 61 6e 79 20 74 65  r.  ** by any te
fc60: 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 73 20 6e  mporary tables n
fc70: 65 65 64 65 64 20 74 6f 20 69 6d 70 6c 65 6d 65  eeded to impleme
fc80: 6e 74 20 74 68 65 20 63 6f 6d 70 6f 75 6e 64 20  nt the compound 
fc90: 73 65 6c 65 63 74 2e 0a 20 20 2a 2a 20 41 74 74  select..  ** Att
fca0: 61 63 68 20 74 68 65 20 4b 65 79 49 6e 66 6f 20  ach the KeyInfo 
fcb0: 73 74 72 75 63 74 75 72 65 20 74 6f 20 61 6c 6c  structure to all
fcc0: 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65   temporary table
fcd0: 73 2e 20 20 49 6e 76 6f 6b 65 20 74 68 65 0a 20  s.  Invoke the. 
fce0: 20 2a 2a 20 4f 52 44 45 52 20 42 59 20 70 72 6f   ** ORDER BY pro
fcf0: 63 65 73 73 69 6e 67 20 69 66 20 74 68 65 72 65  cessing if there
fd00: 20 69 73 20 61 6e 20 4f 52 44 45 52 20 42 59 20   is an ORDER BY 
fd10: 63 6c 61 75 73 65 2e 0a 20 20 2a 2a 0a 20 20 2a  clause..  **.  *
fd20: 2a 20 54 68 69 73 20 73 65 63 74 69 6f 6e 20 69  * This section i
fd30: 73 20 72 75 6e 20 62 79 20 74 68 65 20 72 69 67  s run by the rig
fd40: 68 74 2d 6d 6f 73 74 20 53 45 4c 45 43 54 20 73  ht-most SELECT s
fd50: 74 61 74 65 6d 65 6e 74 20 6f 6e 6c 79 2e 0a 20  tatement only.. 
fd60: 20 2a 2a 20 53 45 4c 45 43 54 20 73 74 61 74 65   ** SELECT state
fd70: 6d 65 6e 74 73 20 74 6f 20 74 68 65 20 6c 65 66  ments to the lef
fd80: 74 20 61 6c 77 61 79 73 20 73 6b 69 70 20 74 68  t always skip th
fd90: 69 73 20 70 61 72 74 2e 20 20 54 68 65 20 72 69  is part.  The ri
fda0: 67 68 74 2d 6d 6f 73 74 0a 20 20 2a 2a 20 53 45  ght-most.  ** SE
fdb0: 4c 45 43 54 20 6d 69 67 68 74 20 61 6c 73 6f 20  LECT might also 
fdc0: 73 6b 69 70 20 74 68 69 73 20 70 61 72 74 20 69  skip this part i
fdd0: 66 20 69 74 20 68 61 73 20 6e 6f 20 4f 52 44 45  f it has no ORDE
fde0: 52 20 42 59 20 63 6c 61 75 73 65 20 61 6e 64 0a  R BY clause and.
fdf0: 20 20 2a 2a 20 6e 6f 20 74 65 6d 70 20 74 61 62    ** no temp tab
fe00: 6c 65 73 20 61 72 65 20 72 65 71 75 69 72 65 64  les are required
fe10: 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 4f 72  ..  */.  if( pOr
fe20: 64 65 72 42 79 20 7c 7c 20 70 2d 3e 75 73 65 73  derBy || p->uses
fe30: 45 70 68 6d 20 29 7b 0a 20 20 20 20 69 6e 74 20  Ephm ){.    int 
fe40: 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  i;              
fe50: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f            /* Loo
fe60: 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 20  p counter */.   
fe70: 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e   KeyInfo *pKeyIn
fe80: 66 6f 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  fo;            /
fe90: 2a 20 43 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75  * Collating sequ
fea0: 65 6e 63 65 20 66 6f 72 20 74 68 65 20 72 65 73  ence for the res
feb0: 75 6c 74 20 73 65 74 20 2a 2f 0a 20 20 20 20 53  ult set */.    S
fec0: 65 6c 65 63 74 20 2a 70 4c 6f 6f 70 3b 20 20 20  elect *pLoop;   
fed0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
fee0: 46 6f 72 20 6c 6f 6f 70 69 6e 67 20 74 68 72 6f  For looping thro
fef0: 75 67 68 20 53 45 4c 45 43 54 20 73 74 61 74 65  ugh SELECT state
ff00: 6d 65 6e 74 73 20 2a 2f 0a 20 20 20 20 69 6e 74  ments */.    int
ff10: 20 6e 4b 65 79 43 6f 6c 3b 20 20 20 20 20 20 20   nKeyCol;       
ff20: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
ff30: 6d 62 65 72 20 6f 66 20 65 6e 74 72 69 65 73 20  mber of entries 
ff40: 69 6e 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 43 6f  in pKeyInfo->aCo
ff50: 6c 5b 5d 20 2a 2f 0a 20 20 20 20 43 6f 6c 6c 53  l[] */.    CollS
ff60: 65 71 20 2a 2a 61 70 43 6f 6c 6c 3b 20 20 20 20  eq **apColl;    
ff70: 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6f 72 20           /* For 
ff80: 6c 6f 6f 70 69 6e 67 20 74 68 72 6f 75 67 68 20  looping through 
ff90: 70 4b 65 79 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b  pKeyInfo->aColl[
ffa0: 5d 20 2a 2f 0a 20 20 20 20 43 6f 6c 6c 53 65 71  ] */.    CollSeq
ffb0: 20 2a 2a 61 43 6f 70 79 3b 20 20 20 20 20 20 20   **aCopy;       
ffc0: 20 20 20 20 20 20 20 2f 2a 20 41 20 63 6f 70 79         /* A copy
ffd0: 20 6f 66 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 43   of pKeyInfo->aC
ffe0: 6f 6c 6c 5b 5d 20 2a 2f 0a 0a 20 20 20 20 61 73  oll[] */..    as
fff0: 73 65 72 74 28 20 70 2d 3e 70 52 69 67 68 74 6d  sert( p->pRightm
10000 6f 73 74 3d 3d 70 20 29 3b 0a 20 20 20 20 6e 4b  ost==p );.    nK
10010 65 79 43 6f 6c 20 3d 20 6e 43 6f 6c 20 2b 20 28  eyCol = nCol + (
10020 70 4f 72 64 65 72 42 79 20 3f 20 70 4f 72 64 65  pOrderBy ? pOrde
10030 72 42 79 2d 3e 6e 45 78 70 72 20 3a 20 30 29 3b  rBy->nExpr : 0);
10040 0a 20 20 20 20 70 4b 65 79 49 6e 66 6f 20 3d 20  .    pKeyInfo = 
10050 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a  sqlite3DbMallocZ
10060 65 72 6f 28 70 50 61 72 73 65 2d 3e 64 62 2c 0a  ero(pParse->db,.
10070 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10080 20 20 20 20 20 20 20 73 69 7a 65 6f 66 28 2a 70         sizeof(*p
10090 4b 65 79 49 6e 66 6f 29 2b 6e 4b 65 79 43 6f 6c  KeyInfo)+nKeyCol
100a0 2a 28 73 69 7a 65 6f 66 28 43 6f 6c 6c 53 65 71  *(sizeof(CollSeq
100b0 2a 29 20 2b 20 31 29 29 3b 0a 20 20 20 20 69 66  *) + 1));.    if
100c0 28 20 21 70 4b 65 79 49 6e 66 6f 20 29 7b 0a 20  ( !pKeyInfo ){. 
100d0 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
100e0 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 67 6f  _NOMEM;.      go
100f0 74 6f 20 6d 75 6c 74 69 5f 73 65 6c 65 63 74 5f  to multi_select_
10100 65 6e 64 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  end;.    }..    
10110 70 4b 65 79 49 6e 66 6f 2d 3e 65 6e 63 20 3d 20  pKeyInfo->enc = 
10120 45 4e 43 28 70 50 61 72 73 65 2d 3e 64 62 29 3b  ENC(pParse->db);
10130 0a 20 20 20 20 70 4b 65 79 49 6e 66 6f 2d 3e 6e  .    pKeyInfo->n
10140 46 69 65 6c 64 20 3d 20 6e 43 6f 6c 3b 0a 0a 20  Field = nCol;.. 
10150 20 20 20 66 6f 72 28 69 3d 30 2c 20 61 70 43 6f     for(i=0, apCo
10160 6c 6c 3d 70 4b 65 79 49 6e 66 6f 2d 3e 61 43 6f  ll=pKeyInfo->aCo
10170 6c 6c 3b 20 69 3c 6e 43 6f 6c 3b 20 69 2b 2b 2c  ll; i<nCol; i++,
10180 20 61 70 43 6f 6c 6c 2b 2b 29 7b 0a 20 20 20 20   apColl++){.    
10190 20 20 2a 61 70 43 6f 6c 6c 20 3d 20 6d 75 6c 74    *apColl = mult
101a0 69 53 65 6c 65 63 74 43 6f 6c 6c 53 65 71 28 70  iSelectCollSeq(p
101b0 50 61 72 73 65 2c 20 70 2c 20 69 29 3b 0a 20 20  Parse, p, i);.  
101c0 20 20 20 20 69 66 28 20 30 3d 3d 2a 61 70 43 6f      if( 0==*apCo
101d0 6c 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 2a 61  ll ){.        *a
101e0 70 43 6f 6c 6c 20 3d 20 70 50 61 72 73 65 2d 3e  pColl = pParse->
101f0 64 62 2d 3e 70 44 66 6c 74 43 6f 6c 6c 3b 0a 20  db->pDfltColl;. 
10200 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20       }.    }..  
10210 20 20 66 6f 72 28 70 4c 6f 6f 70 3d 70 3b 20 70    for(pLoop=p; p
10220 4c 6f 6f 70 3b 20 70 4c 6f 6f 70 3d 70 4c 6f 6f  Loop; pLoop=pLoo
10230 70 2d 3e 70 50 72 69 6f 72 29 7b 0a 20 20 20 20  p->pPrior){.    
10240 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 32 3b 20    for(i=0; i<2; 
10250 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 6e  i++){.        in
10260 74 20 61 64 64 72 20 3d 20 70 4c 6f 6f 70 2d 3e  t addr = pLoop->
10270 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b 69 5d 3b  addrOpenEphm[i];
10280 0a 20 20 20 20 20 20 20 20 69 66 28 20 61 64 64  .        if( add
10290 72 3c 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  r<0 ){.         
102a0 20 2f 2a 20 49 66 20 5b 30 5d 20 69 73 20 75 6e   /* If [0] is un
102b0 75 73 65 64 20 74 68 65 6e 20 5b 31 5d 20 69 73  used then [1] is
102c0 20 61 6c 73 6f 20 75 6e 75 73 65 64 2e 20 20 53   also unused.  S
102d0 6f 20 77 65 20 63 61 6e 0a 20 20 20 20 20 20 20  o we can.       
102e0 20 20 20 2a 2a 20 61 6c 77 61 79 73 20 73 61 66     ** always saf
102f0 65 6c 79 20 61 62 6f 72 74 20 61 73 20 73 6f 6f  ely abort as soo
10300 6e 20 61 73 20 74 68 65 20 66 69 72 73 74 20 75  n as the first u
10310 6e 75 73 65 64 20 73 6c 6f 74 20 69 73 20 66 6f  nused slot is fo
10320 75 6e 64 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  und */.         
10330 20 61 73 73 65 72 74 28 20 70 4c 6f 6f 70 2d 3e   assert( pLoop->
10340 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b 31 5d 3c  addrOpenEphm[1]<
10350 30 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 62  0 );.          b
10360 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a  reak;.        }.
10370 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
10380 64 62 65 43 68 61 6e 67 65 50 32 28 76 2c 20 61  dbeChangeP2(v, a
10390 64 64 72 2c 20 6e 43 6f 6c 29 3b 0a 20 20 20 20  ddr, nCol);.    
103a0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43      sqlite3VdbeC
103b0 68 61 6e 67 65 50 33 28 76 2c 20 61 64 64 72 2c  hangeP3(v, addr,
103c0 20 28 63 68 61 72 2a 29 70 4b 65 79 49 6e 66 6f   (char*)pKeyInfo
103d0 2c 20 50 33 5f 4b 45 59 49 4e 46 4f 29 3b 0a 20  , P3_KEYINFO);. 
103e0 20 20 20 20 20 20 20 70 4c 6f 6f 70 2d 3e 61 64         pLoop->ad
103f0 64 72 4f 70 65 6e 45 70 68 6d 5b 69 5d 20 3d 20  drOpenEphm[i] = 
10400 2d 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  -1;.      }.    
10410 7d 0a 0a 20 20 20 20 69 66 28 20 70 4f 72 64 65  }..    if( pOrde
10420 72 42 79 20 29 7b 0a 20 20 20 20 20 20 73 74 72  rBy ){.      str
10430 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65  uct ExprList_ite
10440 6d 20 2a 70 4f 54 65 72 6d 20 3d 20 70 4f 72 64  m *pOTerm = pOrd
10450 65 72 42 79 2d 3e 61 3b 0a 20 20 20 20 20 20 69  erBy->a;.      i
10460 6e 74 20 6e 4f 72 64 65 72 42 79 45 78 70 72 20  nt nOrderByExpr 
10470 3d 20 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70  = pOrderBy->nExp
10480 72 3b 0a 20 20 20 20 20 20 69 6e 74 20 61 64 64  r;.      int add
10490 72 3b 0a 20 20 20 20 20 20 75 38 20 2a 70 53 6f  r;.      u8 *pSo
104a0 72 74 4f 72 64 65 72 3b 0a 0a 20 20 20 20 20 20  rtOrder;..      
104b0 2f 2a 20 52 65 75 73 65 20 74 68 65 20 73 61 6d  /* Reuse the sam
104c0 65 20 70 4b 65 79 49 6e 66 6f 20 66 6f 72 20 74  e pKeyInfo for t
104d0 68 65 20 4f 52 44 45 52 20 42 59 20 61 73 20 77  he ORDER BY as w
104e0 61 73 20 75 73 65 64 20 61 62 6f 76 65 20 66 6f  as used above fo
104f0 72 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20 63  r.      ** the c
10500 6f 6d 70 6f 75 6e 64 20 73 65 6c 65 63 74 20 73  ompound select s
10510 74 61 74 65 6d 65 6e 74 73 2e 20 20 45 78 63 65  tatements.  Exce
10520 70 74 20 77 65 20 68 61 76 65 20 74 6f 20 63 68  pt we have to ch
10530 61 6e 67 65 20 6f 75 74 20 74 68 65 0a 20 20 20  ange out the.   
10540 20 20 20 2a 2a 20 70 4b 65 79 49 6e 66 6f 2d 3e     ** pKeyInfo->
10550 61 43 6f 6c 6c 5b 5d 20 76 61 6c 75 65 73 2e 20  aColl[] values. 
10560 20 53 6f 6d 65 20 6f 66 20 74 68 65 20 61 43 6f   Some of the aCo
10570 6c 6c 5b 5d 20 76 61 6c 75 65 73 20 77 69 6c 6c  ll[] values will
10580 20 62 65 0a 20 20 20 20 20 20 2a 2a 20 72 65 75   be.      ** reu
10590 73 65 64 20 77 68 65 6e 20 63 6f 6e 73 74 72 75  sed when constru
105a0 63 74 69 6e 67 20 74 68 65 20 70 4b 65 79 49 6e  cting the pKeyIn
105b0 66 6f 20 66 6f 72 20 74 68 65 20 4f 52 44 45 52  fo for the ORDER
105c0 20 42 59 2c 20 73 6f 20 6d 61 6b 65 0a 20 20 20   BY, so make.   
105d0 20 20 20 2a 2a 20 61 20 63 6f 70 79 2e 20 20 53     ** a copy.  S
105e0 75 66 66 69 63 69 65 6e 74 20 73 70 61 63 65 20  ufficient space 
105f0 74 6f 20 68 6f 6c 64 20 62 6f 74 68 20 74 68 65  to hold both the
10600 20 6e 43 6f 6c 20 65 6e 74 72 69 65 73 20 66 6f   nCol entries fo
10610 72 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20 63  r.      ** the c
10620 6f 6d 70 6f 75 6e 64 20 73 65 6c 65 63 74 20 61  ompound select a
10630 6e 64 20 74 68 65 20 6e 4f 72 64 65 72 62 79 45  nd the nOrderbyE
10640 78 70 72 20 65 6e 74 72 69 65 73 20 66 6f 72 20  xpr entries for 
10650 74 68 65 20 4f 52 44 45 52 20 42 59 0a 20 20 20  the ORDER BY.   
10660 20 20 20 2a 2a 20 77 61 73 20 61 6c 6c 6f 63 61     ** was alloca
10670 74 65 64 20 61 62 6f 76 65 2e 20 20 42 75 74 20  ted above.  But 
10680 77 65 20 6e 65 65 64 20 74 6f 20 6d 6f 76 65 20  we need to move 
10690 74 68 65 20 63 6f 6d 70 6f 75 6e 64 20 73 65 6c  the compound sel
106a0 65 63 74 0a 20 20 20 20 20 20 2a 2a 20 65 6e 74  ect.      ** ent
106b0 72 69 65 73 20 6f 75 74 20 6f 66 20 74 68 65 20  ries out of the 
106c0 77 61 79 20 62 65 66 6f 72 65 20 63 6f 6e 73 74  way before const
106d0 72 75 63 74 69 6e 67 20 74 68 65 20 4f 52 44 45  ructing the ORDE
106e0 52 20 42 59 20 65 6e 74 72 69 65 73 2e 0a 20 20  R BY entries..  
106f0 20 20 20 20 2a 2a 20 4d 6f 76 65 20 74 68 65 20      ** Move the 
10700 63 6f 6d 70 6f 75 6e 64 20 73 65 6c 65 63 74 20  compound select 
10710 65 6e 74 72 69 65 73 20 69 6e 74 6f 20 61 43 6f  entries into aCo
10720 70 79 5b 5d 20 77 68 65 72 65 20 74 68 65 79 20  py[] where they 
10730 63 61 6e 20 62 65 0a 20 20 20 20 20 20 2a 2a 20  can be.      ** 
10740 61 63 63 65 73 73 65 64 20 61 6e 64 20 72 65 75  accessed and reu
10750 73 65 64 20 77 68 65 6e 20 63 6f 6e 73 74 72 75  sed when constru
10760 63 74 69 6e 67 20 74 68 65 20 4f 52 44 45 52 20  cting the ORDER 
10770 42 59 20 65 6e 74 72 69 65 73 2e 0a 20 20 20 20  BY entries..    
10780 20 20 2a 2a 20 42 65 63 61 75 73 65 20 6e 43 6f    ** Because nCo
10790 6c 20 6d 69 67 68 74 20 62 65 20 67 72 65 61 74  l might be great
107a0 65 72 20 74 68 61 6e 20 6f 72 20 6c 65 73 73 20  er than or less 
107b0 74 68 61 6e 20 6e 4f 72 64 65 72 42 79 45 78 70  than nOrderByExp
107c0 72 0a 20 20 20 20 20 20 2a 2a 20 77 65 20 68 61  r.      ** we ha
107d0 76 65 20 74 6f 20 75 73 65 20 6d 65 6d 6d 6f 76  ve to use memmov
107e0 65 28 29 20 77 68 65 6e 20 64 6f 69 6e 67 20 74  e() when doing t
107f0 68 65 20 63 6f 70 79 2e 0a 20 20 20 20 20 20 2a  he copy..      *
10800 2f 0a 20 20 20 20 20 20 61 43 6f 70 79 20 3d 20  /.      aCopy = 
10810 26 70 4b 65 79 49 6e 66 6f 2d 3e 61 43 6f 6c 6c  &pKeyInfo->aColl
10820 5b 6e 4f 72 64 65 72 42 79 45 78 70 72 5d 3b 0a  [nOrderByExpr];.
10830 20 20 20 20 20 20 70 53 6f 72 74 4f 72 64 65 72        pSortOrder
10840 20 3d 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 53 6f   = pKeyInfo->aSo
10850 72 74 4f 72 64 65 72 20 3d 20 28 75 38 2a 29 26  rtOrder = (u8*)&
10860 61 43 6f 70 79 5b 6e 43 6f 6c 5d 3b 0a 20 20 20  aCopy[nCol];.   
10870 20 20 20 6d 65 6d 6d 6f 76 65 28 61 43 6f 70 79     memmove(aCopy
10880 2c 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 43 6f 6c  , pKeyInfo->aCol
10890 6c 2c 20 6e 43 6f 6c 2a 73 69 7a 65 6f 66 28 43  l, nCol*sizeof(C
108a0 6f 6c 6c 53 65 71 2a 29 29 3b 0a 0a 20 20 20 20  ollSeq*));..    
108b0 20 20 61 70 43 6f 6c 6c 20 3d 20 70 4b 65 79 49    apColl = pKeyI
108c0 6e 66 6f 2d 3e 61 43 6f 6c 6c 3b 0a 20 20 20 20  nfo->aColl;.    
108d0 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 4f 72    for(i=0; i<nOr
108e0 64 65 72 42 79 45 78 70 72 3b 20 69 2b 2b 2c 20  derByExpr; i++, 
108f0 70 4f 54 65 72 6d 2b 2b 2c 20 61 70 43 6f 6c 6c  pOTerm++, apColl
10900 2b 2b 2c 20 70 53 6f 72 74 4f 72 64 65 72 2b 2b  ++, pSortOrder++
10910 29 7b 0a 20 20 20 20 20 20 20 20 45 78 70 72 20  ){.        Expr 
10920 2a 70 45 78 70 72 20 3d 20 70 4f 54 65 72 6d 2d  *pExpr = pOTerm-
10930 3e 70 45 78 70 72 3b 0a 20 20 20 20 20 20 20 20  >pExpr;.        
10940 69 66 28 20 28 70 45 78 70 72 2d 3e 66 6c 61 67  if( (pExpr->flag
10950 73 20 26 20 45 50 5f 45 78 70 43 6f 6c 6c 61 74  s & EP_ExpCollat
10960 65 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  e) ){.          
10970 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 70  assert( pExpr->p
10980 43 6f 6c 6c 21 3d 30 20 29 3b 0a 20 20 20 20 20  Coll!=0 );.     
10990 20 20 20 20 20 2a 61 70 43 6f 6c 6c 20 3d 20 70       *apColl = p
109a0 45 78 70 72 2d 3e 70 43 6f 6c 6c 3b 0a 20 20 20  Expr->pColl;.   
109b0 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
109c0 20 20 20 20 20 20 2a 61 70 43 6f 6c 6c 20 3d 20        *apColl = 
109d0 61 43 6f 70 79 5b 70 45 78 70 72 2d 3e 69 43 6f  aCopy[pExpr->iCo
109e0 6c 75 6d 6e 5d 3b 0a 20 20 20 20 20 20 20 20 7d  lumn];.        }
109f0 0a 20 20 20 20 20 20 20 20 2a 70 53 6f 72 74 4f  .        *pSortO
10a00 72 64 65 72 20 3d 20 70 4f 54 65 72 6d 2d 3e 73  rder = pOTerm->s
10a10 6f 72 74 4f 72 64 65 72 3b 0a 20 20 20 20 20 20  ortOrder;.      
10a20 7d 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  }.      assert( 
10a30 70 2d 3e 70 52 69 67 68 74 6d 6f 73 74 3d 3d 70  p->pRightmost==p
10a40 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
10a50 28 20 70 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68  ( p->addrOpenEph
10a60 6d 5b 32 5d 3e 3d 30 20 29 3b 0a 20 20 20 20 20  m[2]>=0 );.     
10a70 20 61 64 64 72 20 3d 20 70 2d 3e 61 64 64 72 4f   addr = p->addrO
10a80 70 65 6e 45 70 68 6d 5b 32 5d 3b 0a 20 20 20 20  penEphm[2];.    
10a90 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61    sqlite3VdbeCha
10aa0 6e 67 65 50 32 28 76 2c 20 61 64 64 72 2c 20 70  ngeP2(v, addr, p
10ab0 2d 3e 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70  ->pOrderBy->nExp
10ac0 72 2b 32 29 3b 0a 20 20 20 20 20 20 70 4b 65 79  r+2);.      pKey
10ad0 49 6e 66 6f 2d 3e 6e 46 69 65 6c 64 20 3d 20 6e  Info->nField = n
10ae0 4f 72 64 65 72 42 79 45 78 70 72 3b 0a 20 20 20  OrderByExpr;.   
10af0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68     sqlite3VdbeCh
10b00 61 6e 67 65 50 33 28 76 2c 20 61 64 64 72 2c 20  angeP3(v, addr, 
10b10 28 63 68 61 72 2a 29 70 4b 65 79 49 6e 66 6f 2c  (char*)pKeyInfo,
10b20 20 50 33 5f 4b 45 59 49 4e 46 4f 5f 48 41 4e 44   P3_KEYINFO_HAND
10b30 4f 46 46 29 3b 0a 20 20 20 20 20 20 70 4b 65 79  OFF);.      pKey
10b40 49 6e 66 6f 20 3d 20 30 3b 0a 20 20 20 20 20 20  Info = 0;.      
10b50 67 65 6e 65 72 61 74 65 53 6f 72 74 54 61 69 6c  generateSortTail
10b60 28 70 50 61 72 73 65 2c 20 70 2c 20 76 2c 20 70  (pParse, p, v, p
10b70 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 2c  ->pEList->nExpr,
10b80 20 65 44 65 73 74 2c 20 69 50 61 72 6d 29 3b 0a   eDest, iParm);.
10b90 20 20 20 20 7d 0a 0a 20 20 20 20 73 71 6c 69 74      }..    sqlit
10ba0 65 33 5f 66 72 65 65 28 70 4b 65 79 49 6e 66 6f  e3_free(pKeyInfo
10bb0 29 3b 0a 20 20 7d 0a 0a 6d 75 6c 74 69 5f 73 65  );.  }..multi_se
10bc0 6c 65 63 74 5f 65 6e 64 3a 0a 20 20 72 65 74 75  lect_end:.  retu
10bd0 72 6e 20 72 63 3b 0a 7d 0a 23 65 6e 64 69 66 20  rn rc;.}.#endif 
10be0 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43  /* SQLITE_OMIT_C
10bf0 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45 43 54 20 2a  OMPOUND_SELECT *
10c00 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  /..#ifndef SQLIT
10c10 45 5f 4f 4d 49 54 5f 56 49 45 57 0a 2f 2a 20 46  E_OMIT_VIEW./* F
10c20 6f 72 77 61 72 64 20 44 65 63 6c 61 72 61 74 69  orward Declarati
10c30 6f 6e 73 20 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ons */.static vo
10c40 69 64 20 73 75 62 73 74 45 78 70 72 4c 69 73 74  id substExprList
10c50 28 73 71 6c 69 74 65 33 2a 2c 20 45 78 70 72 4c  (sqlite3*, ExprL
10c60 69 73 74 2a 2c 20 69 6e 74 2c 20 45 78 70 72 4c  ist*, int, ExprL
10c70 69 73 74 2a 29 3b 0a 73 74 61 74 69 63 20 76 6f  ist*);.static vo
10c80 69 64 20 73 75 62 73 74 53 65 6c 65 63 74 28 73  id substSelect(s
10c90 71 6c 69 74 65 33 2a 2c 20 53 65 6c 65 63 74 20  qlite3*, Select 
10ca0 2a 2c 20 69 6e 74 2c 20 45 78 70 72 4c 69 73 74  *, int, ExprList
10cb0 20 2a 29 3b 0a 0a 2f 2a 0a 2a 2a 20 53 63 61 6e   *);../*.** Scan
10cc0 20 74 68 72 6f 75 67 68 20 74 68 65 20 65 78 70   through the exp
10cd0 72 65 73 73 69 6f 6e 20 70 45 78 70 72 2e 20 20  ression pExpr.  
10ce0 52 65 70 6c 61 63 65 20 65 76 65 72 79 20 72 65  Replace every re
10cf0 66 65 72 65 6e 63 65 20 74 6f 0a 2a 2a 20 61 20  ference to.** a 
10d00 63 6f 6c 75 6d 6e 20 69 6e 20 74 61 62 6c 65 20  column in table 
10d10 6e 75 6d 62 65 72 20 69 54 61 62 6c 65 20 77 69  number iTable wi
10d20 74 68 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65  th a copy of the
10d30 20 69 43 6f 6c 75 6d 6e 2d 74 68 0a 2a 2a 20 65   iColumn-th.** e
10d40 6e 74 72 79 20 69 6e 20 70 45 4c 69 73 74 2e 20  ntry in pEList. 
10d50 20 28 42 75 74 20 6c 65 61 76 65 20 72 65 66 65   (But leave refe
10d60 72 65 6e 63 65 73 20 74 6f 20 74 68 65 20 52 4f  rences to the RO
10d70 57 49 44 20 63 6f 6c 75 6d 6e 20 0a 2a 2a 20 75  WID column .** u
10d80 6e 63 68 61 6e 67 65 64 2e 29 0a 2a 2a 0a 2a 2a  nchanged.).**.**
10d90 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
10da0 20 70 61 72 74 20 6f 66 20 74 68 65 20 66 6c 61   part of the fla
10db0 74 74 65 6e 69 6e 67 20 70 72 6f 63 65 64 75 72  ttening procedur
10dc0 65 2e 20 20 41 20 73 75 62 71 75 65 72 79 0a 2a  e.  A subquery.*
10dd0 2a 20 77 68 6f 73 65 20 72 65 73 75 6c 74 20 73  * whose result s
10de0 65 74 20 69 73 20 64 65 66 69 6e 65 64 20 62 79  et is defined by
10df0 20 70 45 4c 69 73 74 20 61 70 70 65 61 72 73 20   pEList appears 
10e00 61 73 20 65 6e 74 72 79 20 69 6e 20 74 68 65 0a  as entry in the.
10e10 2a 2a 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f  ** FROM clause o
10e20 66 20 61 20 53 45 4c 45 43 54 20 73 75 63 68 20  f a SELECT such 
10e30 74 68 61 74 20 74 68 65 20 56 44 42 45 20 63 75  that the VDBE cu
10e40 72 73 6f 72 20 61 73 73 69 67 6e 65 64 20 74 6f  rsor assigned to
10e50 20 74 68 61 74 0a 2a 2a 20 46 4f 52 4d 20 63 6c   that.** FORM cl
10e60 61 75 73 65 20 65 6e 74 72 79 20 69 73 20 69 54  ause entry is iT
10e70 61 62 6c 65 2e 20 20 54 68 69 73 20 72 6f 75 74  able.  This rout
10e80 69 6e 65 20 6d 61 6b 65 20 74 68 65 20 6e 65 63  ine make the nec
10e90 65 73 73 61 72 79 20 0a 2a 2a 20 63 68 61 6e 67  essary .** chang
10ea0 65 73 20 74 6f 20 70 45 78 70 72 20 73 6f 20 74  es to pExpr so t
10eb0 68 61 74 20 69 74 20 72 65 66 65 72 73 20 64 69  hat it refers di
10ec0 72 65 63 74 6c 79 20 74 6f 20 74 68 65 20 73 6f  rectly to the so
10ed0 75 72 63 65 20 74 61 62 6c 65 0a 2a 2a 20 6f 66  urce table.** of
10ee0 20 74 68 65 20 73 75 62 71 75 65 72 79 20 72 61   the subquery ra
10ef0 74 68 65 72 20 74 68 65 20 72 65 73 75 6c 74 20  ther the result 
10f00 73 65 74 20 6f 66 20 74 68 65 20 73 75 62 71 75  set of the subqu
10f10 65 72 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ery..*/.static v
10f20 6f 69 64 20 73 75 62 73 74 45 78 70 72 28 0a 20  oid substExpr(. 
10f30 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 20 20   sqlite3 *db,   
10f40 20 20 20 20 20 2f 2a 20 52 65 70 6f 72 74 20 6d       /* Report m
10f50 61 6c 6c 6f 63 20 65 72 72 6f 72 73 20 74 6f 20  alloc errors to 
10f60 74 68 69 73 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  this connection 
10f70 2a 2f 0a 20 20 45 78 70 72 20 2a 70 45 78 70 72  */.  Expr *pExpr
10f80 2c 20 20 20 20 20 20 20 20 2f 2a 20 45 78 70 72  ,        /* Expr
10f90 20 69 6e 20 77 68 69 63 68 20 73 75 62 73 74 69   in which substi
10fa0 74 75 74 69 6f 6e 20 6f 63 63 75 72 73 20 2a 2f  tution occurs */
10fb0 0a 20 20 69 6e 74 20 69 54 61 62 6c 65 2c 20 20  .  int iTable,  
10fc0 20 20 20 20 20 20 20 2f 2a 20 54 61 62 6c 65 20         /* Table 
10fd0 74 6f 20 62 65 20 73 75 62 73 74 69 74 75 74 65  to be substitute
10fe0 64 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20  d */.  ExprList 
10ff0 2a 70 45 4c 69 73 74 20 20 20 20 2f 2a 20 53 75  *pEList    /* Su
11000 62 73 74 69 74 75 74 65 20 65 78 70 72 65 73 73  bstitute express
11010 69 6f 6e 73 20 2a 2f 0a 29 7b 0a 20 20 69 66 28  ions */.){.  if(
11020 20 70 45 78 70 72 3d 3d 30 20 29 20 72 65 74 75   pExpr==0 ) retu
11030 72 6e 3b 0a 20 20 69 66 28 20 70 45 78 70 72 2d  rn;.  if( pExpr-
11040 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 26  >op==TK_COLUMN &
11050 26 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 3d  & pExpr->iTable=
11060 3d 69 54 61 62 6c 65 20 29 7b 0a 20 20 20 20 69  =iTable ){.    i
11070 66 28 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d  f( pExpr->iColum
11080 6e 3c 30 20 29 7b 0a 20 20 20 20 20 20 70 45 78  n<0 ){.      pEx
11090 70 72 2d 3e 6f 70 20 3d 20 54 4b 5f 4e 55 4c 4c  pr->op = TK_NULL
110a0 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
110b0 20 20 20 45 78 70 72 20 2a 70 4e 65 77 3b 0a 20     Expr *pNew;. 
110c0 20 20 20 20 20 61 73 73 65 72 74 28 20 70 45 4c       assert( pEL
110d0 69 73 74 21 3d 30 20 26 26 20 70 45 78 70 72 2d  ist!=0 && pExpr-
110e0 3e 69 43 6f 6c 75 6d 6e 3c 70 45 4c 69 73 74 2d  >iColumn<pEList-
110f0 3e 6e 45 78 70 72 20 29 3b 0a 20 20 20 20 20 20  >nExpr );.      
11100 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 70  assert( pExpr->p
11110 4c 65 66 74 3d 3d 30 20 26 26 20 70 45 78 70 72  Left==0 && pExpr
11120 2d 3e 70 52 69 67 68 74 3d 3d 30 20 26 26 20 70  ->pRight==0 && p
11130 45 78 70 72 2d 3e 70 4c 69 73 74 3d 3d 30 20 29  Expr->pList==0 )
11140 3b 0a 20 20 20 20 20 20 70 4e 65 77 20 3d 20 70  ;.      pNew = p
11150 45 4c 69 73 74 2d 3e 61 5b 70 45 78 70 72 2d 3e  EList->a[pExpr->
11160 69 43 6f 6c 75 6d 6e 5d 2e 70 45 78 70 72 3b 0a  iColumn].pExpr;.
11170 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 4e        assert( pN
11180 65 77 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 70  ew!=0 );.      p
11190 45 78 70 72 2d 3e 6f 70 20 3d 20 70 4e 65 77 2d  Expr->op = pNew-
111a0 3e 6f 70 3b 0a 20 20 20 20 20 20 61 73 73 65 72  >op;.      asser
111b0 74 28 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 3d  t( pExpr->pLeft=
111c0 3d 30 20 29 3b 0a 20 20 20 20 20 20 70 45 78 70  =0 );.      pExp
111d0 72 2d 3e 70 4c 65 66 74 20 3d 20 73 71 6c 69 74  r->pLeft = sqlit
111e0 65 33 45 78 70 72 44 75 70 28 64 62 2c 20 70 4e  e3ExprDup(db, pN
111f0 65 77 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 20 20  ew->pLeft);.    
11200 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d    assert( pExpr-
11210 3e 70 52 69 67 68 74 3d 3d 30 20 29 3b 0a 20 20  >pRight==0 );.  
11220 20 20 20 20 70 45 78 70 72 2d 3e 70 52 69 67 68      pExpr->pRigh
11230 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44  t = sqlite3ExprD
11240 75 70 28 64 62 2c 20 70 4e 65 77 2d 3e 70 52 69  up(db, pNew->pRi
11250 67 68 74 29 3b 0a 20 20 20 20 20 20 61 73 73 65  ght);.      asse
11260 72 74 28 20 70 45 78 70 72 2d 3e 70 4c 69 73 74  rt( pExpr->pList
11270 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 70 45 78  ==0 );.      pEx
11280 70 72 2d 3e 70 4c 69 73 74 20 3d 20 73 71 6c 69  pr->pList = sqli
11290 74 65 33 45 78 70 72 4c 69 73 74 44 75 70 28 64  te3ExprListDup(d
112a0 62 2c 20 70 4e 65 77 2d 3e 70 4c 69 73 74 29 3b  b, pNew->pList);
112b0 0a 20 20 20 20 20 20 70 45 78 70 72 2d 3e 69 54  .      pExpr->iT
112c0 61 62 6c 65 20 3d 20 70 4e 65 77 2d 3e 69 54 61  able = pNew->iTa
112d0 62 6c 65 3b 0a 20 20 20 20 20 20 70 45 78 70 72  ble;.      pExpr
112e0 2d 3e 70 54 61 62 20 3d 20 70 4e 65 77 2d 3e 70  ->pTab = pNew->p
112f0 54 61 62 3b 0a 20 20 20 20 20 20 70 45 78 70 72  Tab;.      pExpr
11300 2d 3e 69 43 6f 6c 75 6d 6e 20 3d 20 70 4e 65 77  ->iColumn = pNew
11310 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20  ->iColumn;.     
11320 20 70 45 78 70 72 2d 3e 69 41 67 67 20 3d 20 70   pExpr->iAgg = p
11330 4e 65 77 2d 3e 69 41 67 67 3b 0a 20 20 20 20 20  New->iAgg;.     
11340 20 73 71 6c 69 74 65 33 54 6f 6b 65 6e 43 6f 70   sqlite3TokenCop
11350 79 28 64 62 2c 20 26 70 45 78 70 72 2d 3e 74 6f  y(db, &pExpr->to
11360 6b 65 6e 2c 20 26 70 4e 65 77 2d 3e 74 6f 6b 65  ken, &pNew->toke
11370 6e 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  n);.      sqlite
11380 33 54 6f 6b 65 6e 43 6f 70 79 28 64 62 2c 20 26  3TokenCopy(db, &
11390 70 45 78 70 72 2d 3e 73 70 61 6e 2c 20 26 70 4e  pExpr->span, &pN
113a0 65 77 2d 3e 73 70 61 6e 29 3b 0a 20 20 20 20 20  ew->span);.     
113b0 20 70 45 78 70 72 2d 3e 70 53 65 6c 65 63 74 20   pExpr->pSelect 
113c0 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44  = sqlite3SelectD
113d0 75 70 28 64 62 2c 20 70 4e 65 77 2d 3e 70 53 65  up(db, pNew->pSe
113e0 6c 65 63 74 29 3b 0a 20 20 20 20 20 20 70 45 78  lect);.      pEx
113f0 70 72 2d 3e 66 6c 61 67 73 20 3d 20 70 4e 65 77  pr->flags = pNew
11400 2d 3e 66 6c 61 67 73 3b 0a 20 20 20 20 7d 0a 20  ->flags;.    }. 
11410 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 75 62 73   }else{.    subs
11420 74 45 78 70 72 28 64 62 2c 20 70 45 78 70 72 2d  tExpr(db, pExpr-
11430 3e 70 4c 65 66 74 2c 20 69 54 61 62 6c 65 2c 20  >pLeft, iTable, 
11440 70 45 4c 69 73 74 29 3b 0a 20 20 20 20 73 75 62  pEList);.    sub
11450 73 74 45 78 70 72 28 64 62 2c 20 70 45 78 70 72  stExpr(db, pExpr
11460 2d 3e 70 52 69 67 68 74 2c 20 69 54 61 62 6c 65  ->pRight, iTable
11470 2c 20 70 45 4c 69 73 74 29 3b 0a 20 20 20 20 73  , pEList);.    s
11480 75 62 73 74 53 65 6c 65 63 74 28 64 62 2c 20 70  ubstSelect(db, p
11490 45 78 70 72 2d 3e 70 53 65 6c 65 63 74 2c 20 69  Expr->pSelect, i
114a0 54 61 62 6c 65 2c 20 70 45 4c 69 73 74 29 3b 0a  Table, pEList);.
114b0 20 20 20 20 73 75 62 73 74 45 78 70 72 4c 69 73      substExprLis
114c0 74 28 64 62 2c 20 70 45 78 70 72 2d 3e 70 4c 69  t(db, pExpr->pLi
114d0 73 74 2c 20 69 54 61 62 6c 65 2c 20 70 45 4c 69  st, iTable, pELi
114e0 73 74 29 3b 0a 20 20 7d 0a 7d 0a 73 74 61 74 69  st);.  }.}.stati
114f0 63 20 76 6f 69 64 20 73 75 62 73 74 45 78 70 72  c void substExpr
11500 4c 69 73 74 28 0a 20 20 73 71 6c 69 74 65 33 20  List(.  sqlite3 
11510 2a 64 62 2c 20 20 20 20 20 20 20 20 20 2f 2a 20  *db,         /* 
11520 52 65 70 6f 72 74 20 6d 61 6c 6c 6f 63 20 65 72  Report malloc er
11530 72 6f 72 73 20 68 65 72 65 20 2a 2f 0a 20 20 45  rors here */.  E
11540 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20  xprList *pList, 
11550 20 20 20 20 2f 2a 20 4c 69 73 74 20 74 6f 20 73      /* List to s
11560 63 61 6e 20 61 6e 64 20 69 6e 20 77 68 69 63 68  can and in which
11570 20 74 6f 20 6d 61 6b 65 20 73 75 62 73 74 69 74   to make substit
11580 75 74 65 73 20 2a 2f 0a 20 20 69 6e 74 20 69 54  utes */.  int iT
11590 61 62 6c 65 2c 20 20 20 20 20 20 20 20 20 20 2f  able,          /
115a0 2a 20 54 61 62 6c 65 20 74 6f 20 62 65 20 73 75  * Table to be su
115b0 62 73 74 69 74 75 74 65 64 20 2a 2f 0a 20 20 45  bstituted */.  E
115c0 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 20  xprList *pEList 
115d0 20 20 20 20 2f 2a 20 53 75 62 73 74 69 74 75 74      /* Substitut
115e0 65 20 76 61 6c 75 65 73 20 2a 2f 0a 29 7b 0a 20  e values */.){. 
115f0 20 69 6e 74 20 69 3b 0a 20 20 69 66 28 20 70 4c   int i;.  if( pL
11600 69 73 74 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b  ist==0 ) return;
11610 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4c  .  for(i=0; i<pL
11620 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29  ist->nExpr; i++)
11630 7b 0a 20 20 20 20 73 75 62 73 74 45 78 70 72 28  {.    substExpr(
11640 64 62 2c 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e  db, pList->a[i].
11650 70 45 78 70 72 2c 20 69 54 61 62 6c 65 2c 20 70  pExpr, iTable, p
11660 45 4c 69 73 74 29 3b 0a 20 20 7d 0a 7d 0a 73 74  EList);.  }.}.st
11670 61 74 69 63 20 76 6f 69 64 20 73 75 62 73 74 53  atic void substS
11680 65 6c 65 63 74 28 0a 20 20 73 71 6c 69 74 65 33  elect(.  sqlite3
11690 20 2a 64 62 2c 20 20 20 20 20 20 20 20 20 2f 2a   *db,         /*
116a0 20 52 65 70 6f 72 74 20 6d 61 6c 6c 6f 63 20 65   Report malloc e
116b0 72 72 6f 72 73 20 68 65 72 65 20 2a 2f 0a 20 20  rrors here */.  
116c0 53 65 6c 65 63 74 20 2a 70 2c 20 20 20 20 20 20  Select *p,      
116d0 20 20 20 20 20 2f 2a 20 53 45 4c 45 43 54 20 73       /* SELECT s
116e0 74 61 74 65 6d 65 6e 74 20 69 6e 20 77 68 69 63  tatement in whic
116f0 68 20 74 6f 20 6d 61 6b 65 20 73 75 62 73 74 69  h to make substi
11700 74 75 74 69 6f 6e 73 20 2a 2f 0a 20 20 69 6e 74  tutions */.  int
11710 20 69 54 61 62 6c 65 2c 20 20 20 20 20 20 20 20   iTable,        
11720 20 20 2f 2a 20 54 61 62 6c 65 20 74 6f 20 62 65    /* Table to be
11730 20 72 65 70 6c 61 63 65 64 20 2a 2f 0a 20 20 45   replaced */.  E
11740 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 20  xprList *pEList 
11750 20 20 20 20 2f 2a 20 53 75 62 73 74 69 74 75 74      /* Substitut
11760 65 20 76 61 6c 75 65 73 20 2a 2f 0a 29 7b 0a 20  e values */.){. 
11770 20 69 66 28 20 21 70 20 29 20 72 65 74 75 72 6e   if( !p ) return
11780 3b 0a 20 20 73 75 62 73 74 45 78 70 72 4c 69 73  ;.  substExprLis
11790 74 28 64 62 2c 20 70 2d 3e 70 45 4c 69 73 74 2c  t(db, p->pEList,
117a0 20 69 54 61 62 6c 65 2c 20 70 45 4c 69 73 74 29   iTable, pEList)
117b0 3b 0a 20 20 73 75 62 73 74 45 78 70 72 4c 69 73  ;.  substExprLis
117c0 74 28 64 62 2c 20 70 2d 3e 70 47 72 6f 75 70 42  t(db, p->pGroupB
117d0 79 2c 20 69 54 61 62 6c 65 2c 20 70 45 4c 69 73  y, iTable, pELis
117e0 74 29 3b 0a 20 20 73 75 62 73 74 45 78 70 72 4c  t);.  substExprL
117f0 69 73 74 28 64 62 2c 20 70 2d 3e 70 4f 72 64 65  ist(db, p->pOrde
11800 72 42 79 2c 20 69 54 61 62 6c 65 2c 20 70 45 4c  rBy, iTable, pEL
11810 69 73 74 29 3b 0a 20 20 73 75 62 73 74 45 78 70  ist);.  substExp
11820 72 28 64 62 2c 20 70 2d 3e 70 48 61 76 69 6e 67  r(db, p->pHaving
11830 2c 20 69 54 61 62 6c 65 2c 20 70 45 4c 69 73 74  , iTable, pEList
11840 29 3b 0a 20 20 73 75 62 73 74 45 78 70 72 28 64  );.  substExpr(d
11850 62 2c 20 70 2d 3e 70 57 68 65 72 65 2c 20 69 54  b, p->pWhere, iT
11860 61 62 6c 65 2c 20 70 45 4c 69 73 74 29 3b 0a 20  able, pEList);. 
11870 20 73 75 62 73 74 53 65 6c 65 63 74 28 64 62 2c   substSelect(db,
11880 20 70 2d 3e 70 50 72 69 6f 72 2c 20 69 54 61 62   p->pPrior, iTab
11890 6c 65 2c 20 70 45 4c 69 73 74 29 3b 0a 7d 0a 23  le, pEList);.}.#
118a0 65 6e 64 69 66 20 2f 2a 20 21 64 65 66 69 6e 65  endif /* !define
118b0 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49  d(SQLITE_OMIT_VI
118c0 45 57 29 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20  EW) */..#ifndef 
118d0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57  SQLITE_OMIT_VIEW
118e0 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
118f0 69 6e 65 20 61 74 74 65 6d 70 74 73 20 74 6f 20  ine attempts to 
11900 66 6c 61 74 74 65 6e 20 73 75 62 71 75 65 72 69  flatten subqueri
11910 65 73 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 73  es in order to s
11920 70 65 65 64 0a 2a 2a 20 65 78 65 63 75 74 69 6f  peed.** executio
11930 6e 2e 20 20 49 74 20 72 65 74 75 72 6e 73 20 31  n.  It returns 1
11940 20 69 66 20 69 74 20 6d 61 6b 65 73 20 63 68 61   if it makes cha
11950 6e 67 65 73 20 61 6e 64 20 30 20 69 66 20 6e 6f  nges and 0 if no
11960 20 66 6c 61 74 74 65 6e 69 6e 67 0a 2a 2a 20 6f   flattening.** o
11970 63 63 75 72 73 2e 0a 2a 2a 0a 2a 2a 20 54 6f 20  ccurs..**.** To 
11980 75 6e 64 65 72 73 74 61 6e 64 20 74 68 65 20 63  understand the c
11990 6f 6e 63 65 70 74 20 6f 66 20 66 6c 61 74 74 65  oncept of flatte
119a0 6e 69 6e 67 2c 20 63 6f 6e 73 69 64 65 72 20 74  ning, consider t
119b0 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 0a 2a 2a 20  he following.** 
119c0 71 75 65 72 79 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  query:.**.**    
119d0 20 53 45 4c 45 43 54 20 61 20 46 52 4f 4d 20 28   SELECT a FROM (
119e0 53 45 4c 45 43 54 20 78 2b 79 20 41 53 20 61 20  SELECT x+y AS a 
119f0 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20 7a 3c  FROM t1 WHERE z<
11a00 31 30 30 29 20 57 48 45 52 45 20 61 3e 35 0a 2a  100) WHERE a>5.*
11a10 2a 0a 2a 2a 20 54 68 65 20 64 65 66 61 75 6c 74  *.** The default
11a20 20 77 61 79 20 6f 66 20 69 6d 70 6c 65 6d 65 6e   way of implemen
11a30 74 69 6e 67 20 74 68 69 73 20 71 75 65 72 79 20  ting this query 
11a40 69 73 20 74 6f 20 65 78 65 63 75 74 65 20 74 68  is to execute th
11a50 65 0a 2a 2a 20 73 75 62 71 75 65 72 79 20 66 69  e.** subquery fi
11a60 72 73 74 20 61 6e 64 20 73 74 6f 72 65 20 74 68  rst and store th
11a70 65 20 72 65 73 75 6c 74 73 20 69 6e 20 61 20 74  e results in a t
11a80 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 2c 20  emporary table, 
11a90 74 68 65 6e 0a 2a 2a 20 72 75 6e 20 74 68 65 20  then.** run the 
11aa0 6f 75 74 65 72 20 71 75 65 72 79 20 6f 6e 20 74  outer query on t
11ab0 68 61 74 20 74 65 6d 70 6f 72 61 72 79 20 74 61  hat temporary ta
11ac0 62 6c 65 2e 20 20 54 68 69 73 20 72 65 71 75 69  ble.  This requi
11ad0 72 65 73 20 74 77 6f 0a 2a 2a 20 70 61 73 73 65  res two.** passe
11ae0 73 20 6f 76 65 72 20 74 68 65 20 64 61 74 61 2e  s over the data.
11af0 20 20 46 75 72 74 68 65 72 6d 6f 72 65 2c 20 62    Furthermore, b
11b00 65 63 61 75 73 65 20 74 68 65 20 74 65 6d 70 6f  ecause the tempo
11b10 72 61 72 79 20 74 61 62 6c 65 0a 2a 2a 20 68 61  rary table.** ha
11b20 73 20 6e 6f 20 69 6e 64 69 63 65 73 2c 20 74 68  s no indices, th
11b30 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 6f  e WHERE clause o
11b40 6e 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72  n the outer quer
11b50 79 20 63 61 6e 6e 6f 74 20 62 65 0a 2a 2a 20 6f  y cannot be.** o
11b60 70 74 69 6d 69 7a 65 64 2e 0a 2a 2a 0a 2a 2a 20  ptimized..**.** 
11b70 54 68 69 73 20 72 6f 75 74 69 6e 65 20 61 74 74  This routine att
11b80 65 6d 70 74 73 20 74 6f 20 72 65 77 72 69 74 65  empts to rewrite
11b90 20 71 75 65 72 69 65 73 20 73 75 63 68 20 61 73   queries such as
11ba0 20 74 68 65 20 61 62 6f 76 65 20 69 6e 74 6f 0a   the above into.
11bb0 2a 2a 20 61 20 73 69 6e 67 6c 65 20 66 6c 61 74  ** a single flat
11bc0 20 73 65 6c 65 63 74 2c 20 6c 69 6b 65 20 74 68   select, like th
11bd0 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 45  is:.**.**     SE
11be0 4c 45 43 54 20 78 2b 79 20 41 53 20 61 20 46 52  LECT x+y AS a FR
11bf0 4f 4d 20 74 31 20 57 48 45 52 45 20 7a 3c 31 30  OM t1 WHERE z<10
11c00 30 20 41 4e 44 20 61 3e 35 0a 2a 2a 0a 2a 2a 20  0 AND a>5.**.** 
11c10 54 68 65 20 63 6f 64 65 20 67 65 6e 65 72 61 74  The code generat
11c20 65 64 20 66 6f 72 20 74 68 69 73 20 73 69 6d 70  ed for this simp
11c30 69 66 69 63 61 74 69 6f 6e 20 67 69 76 65 73 20  ification gives 
11c40 74 68 65 20 73 61 6d 65 20 72 65 73 75 6c 74 0a  the same result.
11c50 2a 2a 20 62 75 74 20 6f 6e 6c 79 20 68 61 73 20  ** but only has 
11c60 74 6f 20 73 63 61 6e 20 74 68 65 20 64 61 74 61  to scan the data
11c70 20 6f 6e 63 65 2e 20 20 41 6e 64 20 62 65 63 61   once.  And beca
11c80 75 73 65 20 69 6e 64 69 63 65 73 20 6d 69 67 68  use indices migh
11c90 74 20 0a 2a 2a 20 65 78 69 73 74 20 6f 6e 20 74  t .** exist on t
11ca0 68 65 20 74 61 62 6c 65 20 74 31 2c 20 61 20 63  he table t1, a c
11cb0 6f 6d 70 6c 65 74 65 20 73 63 61 6e 20 6f 66 20  omplete scan of 
11cc0 74 68 65 20 64 61 74 61 20 6d 69 67 68 74 20 62  the data might b
11cd0 65 0a 2a 2a 20 61 76 6f 69 64 65 64 2e 0a 2a 2a  e.** avoided..**
11ce0 0a 2a 2a 20 46 6c 61 74 74 65 6e 69 6e 67 20 69  .** Flattening i
11cf0 73 20 6f 6e 6c 79 20 61 74 74 65 6d 70 74 65 64  s only attempted
11d00 20 69 66 20 61 6c 6c 20 6f 66 20 74 68 65 20 66   if all of the f
11d10 6f 6c 6c 6f 77 69 6e 67 20 61 72 65 20 74 72 75  ollowing are tru
11d20 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 28 31 29 20 20  e:.**.**   (1)  
11d30 54 68 65 20 73 75 62 71 75 65 72 79 20 61 6e 64  The subquery and
11d40 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79   the outer query
11d50 20 64 6f 20 6e 6f 74 20 62 6f 74 68 20 75 73 65   do not both use
11d60 20 61 67 67 72 65 67 61 74 65 73 2e 0a 2a 2a 0a   aggregates..**.
11d70 2a 2a 20 20 20 28 32 29 20 20 54 68 65 20 73 75  **   (2)  The su
11d80 62 71 75 65 72 79 20 69 73 20 6e 6f 74 20 61 6e  bquery is not an
11d90 20 61 67 67 72 65 67 61 74 65 20 6f 72 20 74 68   aggregate or th
11da0 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 69 73  e outer query is
11db0 20 6e 6f 74 20 61 20 6a 6f 69 6e 2e 0a 2a 2a 0a   not a join..**.
11dc0 2a 2a 20 20 20 28 33 29 20 20 54 68 65 20 73 75  **   (3)  The su
11dd0 62 71 75 65 72 79 20 69 73 20 6e 6f 74 20 74 68  bquery is not th
11de0 65 20 72 69 67 68 74 20 6f 70 65 72 61 6e 64 20  e right operand 
11df0 6f 66 20 61 20 6c 65 66 74 20 6f 75 74 65 72 20  of a left outer 
11e00 6a 6f 69 6e 2c 20 6f 72 0a 2a 2a 20 20 20 20 20  join, or.**     
11e10 20 20 20 74 68 65 20 73 75 62 71 75 65 72 79 20     the subquery 
11e20 69 73 20 6e 6f 74 20 69 74 73 65 6c 66 20 61 20  is not itself a 
11e30 6a 6f 69 6e 2e 20 20 28 54 69 63 6b 65 74 20 23  join.  (Ticket #
11e40 33 30 36 29 0a 2a 2a 0a 2a 2a 20 20 20 28 34 29  306).**.**   (4)
11e50 20 20 54 68 65 20 73 75 62 71 75 65 72 79 20 69    The subquery i
11e60 73 20 6e 6f 74 20 44 49 53 54 49 4e 43 54 20 6f  s not DISTINCT o
11e70 72 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72  r the outer quer
11e80 79 20 69 73 20 6e 6f 74 20 61 20 6a 6f 69 6e 2e  y is not a join.
11e90 0a 2a 2a 0a 2a 2a 20 20 20 28 35 29 20 20 54 68  .**.**   (5)  Th
11ea0 65 20 73 75 62 71 75 65 72 79 20 69 73 20 6e 6f  e subquery is no
11eb0 74 20 44 49 53 54 49 4e 43 54 20 6f 72 20 74 68  t DISTINCT or th
11ec0 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 64 6f  e outer query do
11ed0 65 73 20 6e 6f 74 20 75 73 65 0a 2a 2a 20 20 20  es not use.**   
11ee0 20 20 20 20 20 61 67 67 72 65 67 61 74 65 73 2e       aggregates.
11ef0 0a 2a 2a 0a 2a 2a 20 20 20 28 36 29 20 20 54 68  .**.**   (6)  Th
11f00 65 20 73 75 62 71 75 65 72 79 20 64 6f 65 73 20  e subquery does 
11f10 6e 6f 74 20 75 73 65 20 61 67 67 72 65 67 61 74  not use aggregat
11f20 65 73 20 6f 72 20 74 68 65 20 6f 75 74 65 72 20  es or the outer 
11f30 71 75 65 72 79 20 69 73 20 6e 6f 74 0a 2a 2a 20  query is not.** 
11f40 20 20 20 20 20 20 20 44 49 53 54 49 4e 43 54 2e         DISTINCT.
11f50 0a 2a 2a 0a 2a 2a 20 20 20 28 37 29 20 20 54 68  .**.**   (7)  Th
11f60 65 20 73 75 62 71 75 65 72 79 20 68 61 73 20 61  e subquery has a
11f70 20 46 52 4f 4d 20 63 6c 61 75 73 65 2e 0a 2a 2a   FROM clause..**
11f80 0a 2a 2a 20 20 20 28 38 29 20 20 54 68 65 20 73  .**   (8)  The s
11f90 75 62 71 75 65 72 79 20 64 6f 65 73 20 6e 6f 74  ubquery does not
11fa0 20 75 73 65 20 4c 49 4d 49 54 20 6f 72 20 74 68   use LIMIT or th
11fb0 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 69 73  e outer query is
11fc0 20 6e 6f 74 20 61 20 6a 6f 69 6e 2e 0a 2a 2a 0a   not a join..**.
11fd0 2a 2a 20 20 20 28 39 29 20 20 54 68 65 20 73 75  **   (9)  The su
11fe0 62 71 75 65 72 79 20 64 6f 65 73 20 6e 6f 74 20  bquery does not 
11ff0 75 73 65 20 4c 49 4d 49 54 20 6f 72 20 74 68 65  use LIMIT or the
12000 20 6f 75 74 65 72 20 71 75 65 72 79 20 64 6f 65   outer query doe
12010 73 20 6e 6f 74 20 75 73 65 0a 2a 2a 20 20 20 20  s not use.**    
12020 20 20 20 20 61 67 67 72 65 67 61 74 65 73 2e 0a      aggregates..
12030 2a 2a 0a 2a 2a 20 20 28 31 30 29 20 20 54 68 65  **.**  (10)  The
12040 20 73 75 62 71 75 65 72 79 20 64 6f 65 73 20 6e   subquery does n
12050 6f 74 20 75 73 65 20 61 67 67 72 65 67 61 74 65  ot use aggregate
12060 73 20 6f 72 20 74 68 65 20 6f 75 74 65 72 20 71  s or the outer q
12070 75 65 72 79 20 64 6f 65 73 20 6e 6f 74 0a 2a 2a  uery does not.**
12080 20 20 20 20 20 20 20 20 75 73 65 20 4c 49 4d 49          use LIMI
12090 54 2e 0a 2a 2a 0a 2a 2a 20 20 28 31 31 29 20 20  T..**.**  (11)  
120a0 54 68 65 20 73 75 62 71 75 65 72 79 20 61 6e 64  The subquery and
120b0 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79   the outer query
120c0 20 64 6f 20 6e 6f 74 20 62 6f 74 68 20 68 61 76   do not both hav
120d0 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73  e ORDER BY claus
120e0 65 73 2e 0a 2a 2a 0a 2a 2a 20 20 28 31 32 29 20  es..**.**  (12) 
120f0 20 54 68 65 20 73 75 62 71 75 65 72 79 20 69 73   The subquery is
12100 20 6e 6f 74 20 74 68 65 20 72 69 67 68 74 20 74   not the right t
12110 65 72 6d 20 6f 66 20 61 20 4c 45 46 54 20 4f 55  erm of a LEFT OU
12120 54 45 52 20 4a 4f 49 4e 20 6f 72 20 74 68 65 0a  TER JOIN or the.
12130 2a 2a 20 20 20 20 20 20 20 20 73 75 62 71 75 65  **        subque
12140 72 79 20 68 61 73 20 6e 6f 20 57 48 45 52 45 20  ry has no WHERE 
12150 63 6c 61 75 73 65 2e 20 20 28 61 64 64 65 64 20  clause.  (added 
12160 62 79 20 74 69 63 6b 65 74 20 23 33 35 30 29 0a  by ticket #350).
12170 2a 2a 0a 2a 2a 20 20 28 31 33 29 20 20 54 68 65  **.**  (13)  The
12180 20 73 75 62 71 75 65 72 79 20 61 6e 64 20 6f 75   subquery and ou
12190 74 65 72 20 71 75 65 72 79 20 64 6f 20 6e 6f 74  ter query do not
121a0 20 62 6f 74 68 20 75 73 65 20 4c 49 4d 49 54 0a   both use LIMIT.
121b0 2a 2a 0a 2a 2a 20 20 28 31 34 29 20 20 54 68 65  **.**  (14)  The
121c0 20 73 75 62 71 75 65 72 79 20 64 6f 65 73 20 6e   subquery does n
121d0 6f 74 20 75 73 65 20 4f 46 46 53 45 54 0a 2a 2a  ot use OFFSET.**
121e0 0a 2a 2a 20 20 28 31 35 29 20 20 54 68 65 20 6f  .**  (15)  The o
121f0 75 74 65 72 20 71 75 65 72 79 20 69 73 20 6e 6f  uter query is no
12200 74 20 70 61 72 74 20 6f 66 20 61 20 63 6f 6d 70  t part of a comp
12210 6f 75 6e 64 20 73 65 6c 65 63 74 20 6f 72 20 74  ound select or t
12220 68 65 0a 2a 2a 20 20 20 20 20 20 20 20 73 75 62  he.**        sub
12230 71 75 65 72 79 20 64 6f 65 73 20 6e 6f 74 20 68  query does not h
12240 61 76 65 20 62 6f 74 68 20 61 6e 20 4f 52 44 45  ave both an ORDE
12250 52 20 42 59 20 61 6e 64 20 61 20 4c 49 4d 49 54  R BY and a LIMIT
12260 20 63 6c 61 75 73 65 2e 0a 2a 2a 20 20 20 20 20   clause..**     
12270 20 20 20 28 53 65 65 20 74 69 63 6b 65 74 20 23     (See ticket #
12280 32 33 33 39 29 0a 2a 2a 0a 2a 2a 20 49 6e 20 74  2339).**.** In t
12290 68 69 73 20 72 6f 75 74 69 6e 65 2c 20 74 68 65  his routine, the
122a0 20 22 70 22 20 70 61 72 61 6d 65 74 65 72 20 69   "p" parameter i
122b0 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74  s a pointer to t
122c0 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 2e 0a  he outer query..
122d0 2a 2a 20 54 68 65 20 73 75 62 71 75 65 72 79 20  ** The subquery 
122e0 69 73 20 70 2d 3e 70 53 72 63 2d 3e 61 5b 69 46  is p->pSrc->a[iF
122f0 72 6f 6d 5d 2e 20 20 69 73 41 67 67 20 69 73 20  rom].  isAgg is 
12300 74 72 75 65 20 69 66 20 74 68 65 20 6f 75 74 65  true if the oute
12310 72 20 71 75 65 72 79 0a 2a 2a 20 75 73 65 73 20  r query.** uses 
12320 61 67 67 72 65 67 61 74 65 73 20 61 6e 64 20 73  aggregates and s
12330 75 62 71 75 65 72 79 49 73 41 67 67 20 69 73 20  ubqueryIsAgg is 
12340 74 72 75 65 20 69 66 20 74 68 65 20 73 75 62 71  true if the subq
12350 75 65 72 79 20 75 73 65 73 20 61 67 67 72 65 67  uery uses aggreg
12360 61 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 66  ates..**.** If f
12370 6c 61 74 74 65 6e 69 6e 67 20 69 73 20 6e 6f 74  lattening is not
12380 20 61 74 74 65 6d 70 74 65 64 2c 20 74 68 69 73   attempted, this
12390 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20 6e 6f   routine is a no
123a0 2d 6f 70 20 61 6e 64 20 72 65 74 75 72 6e 73 20  -op and returns 
123b0 30 2e 0a 2a 2a 20 49 66 20 66 6c 61 74 74 65 6e  0..** If flatten
123c0 69 6e 67 20 69 73 20 61 74 74 65 6d 70 74 65 64  ing is attempted
123d0 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65   this routine re
123e0 74 75 72 6e 73 20 31 2e 0a 2a 2a 0a 2a 2a 20 41  turns 1..**.** A
123f0 6c 6c 20 6f 66 20 74 68 65 20 65 78 70 72 65 73  ll of the expres
12400 73 69 6f 6e 20 61 6e 61 6c 79 73 69 73 20 6d 75  sion analysis mu
12410 73 74 20 6f 63 63 75 72 20 6f 6e 20 62 6f 74 68  st occur on both
12420 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79   the outer query
12430 20 61 6e 64 0a 2a 2a 20 74 68 65 20 73 75 62 71   and.** the subq
12440 75 65 72 79 20 62 65 66 6f 72 65 20 74 68 69 73  uery before this
12450 20 72 6f 75 74 69 6e 65 20 72 75 6e 73 2e 0a 2a   routine runs..*
12460 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 6c 61  /.static int fla
12470 74 74 65 6e 53 75 62 71 75 65 72 79 28 0a 20 20  ttenSubquery(.  
12480 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 20 20 20  sqlite3 *db,    
12490 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65       /* Database
124a0 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20   connection */. 
124b0 20 53 65 6c 65 63 74 20 2a 70 2c 20 20 20 20 20   Select *p,     
124c0 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61 72        /* The par
124d0 65 6e 74 20 6f 72 20 6f 75 74 65 72 20 53 45 4c  ent or outer SEL
124e0 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f  ECT statement */
124f0 0a 20 20 69 6e 74 20 69 46 72 6f 6d 2c 20 20 20  .  int iFrom,   
12500 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78          /* Index
12510 20 69 6e 20 70 2d 3e 70 53 72 63 2d 3e 61 5b 5d   in p->pSrc->a[]
12520 20 6f 66 20 74 68 65 20 69 6e 6e 65 72 20 73 75   of the inner su
12530 62 71 75 65 72 79 20 2a 2f 0a 20 20 69 6e 74 20  bquery */.  int 
12540 69 73 41 67 67 2c 20 20 20 20 20 20 20 20 20 20  isAgg,          
12550 20 2f 2a 20 54 72 75 65 20 69 66 20 6f 75 74 65   /* True if oute
12560 72 20 53 45 4c 45 43 54 20 75 73 65 73 20 61 67  r SELECT uses ag
12570 67 72 65 67 61 74 65 20 66 75 6e 63 74 69 6f 6e  gregate function
12580 73 20 2a 2f 0a 20 20 69 6e 74 20 73 75 62 71 75  s */.  int subqu
12590 65 72 79 49 73 41 67 67 20 20 20 20 2f 2a 20 54  eryIsAgg    /* T
125a0 72 75 65 20 69 66 20 74 68 65 20 73 75 62 71 75  rue if the subqu
125b0 65 72 79 20 75 73 65 73 20 61 67 67 72 65 67 61  ery uses aggrega
125c0 74 65 20 66 75 6e 63 74 69 6f 6e 73 20 2a 2f 0a  te functions */.
125d0 29 7b 0a 20 20 53 65 6c 65 63 74 20 2a 70 53 75  ){.  Select *pSu
125e0 62 3b 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20  b;       /* The 
125f0 69 6e 6e 65 72 20 71 75 65 72 79 20 6f 72 20 22  inner query or "
12600 73 75 62 71 75 65 72 79 22 20 2a 2f 0a 20 20 53  subquery" */.  S
12610 72 63 4c 69 73 74 20 2a 70 53 72 63 3b 20 20 20  rcList *pSrc;   
12620 20 20 20 2f 2a 20 54 68 65 20 46 52 4f 4d 20 63     /* The FROM c
12630 6c 61 75 73 65 20 6f 66 20 74 68 65 20 6f 75 74  lause of the out
12640 65 72 20 71 75 65 72 79 20 2a 2f 0a 20 20 53 72  er query */.  Sr
12650 63 4c 69 73 74 20 2a 70 53 75 62 53 72 63 3b 20  cList *pSubSrc; 
12660 20 20 2f 2a 20 54 68 65 20 46 52 4f 4d 20 63 6c    /* The FROM cl
12670 61 75 73 65 20 6f 66 20 74 68 65 20 73 75 62 71  ause of the subq
12680 75 65 72 79 20 2a 2f 0a 20 20 45 78 70 72 4c 69  uery */.  ExprLi
12690 73 74 20 2a 70 4c 69 73 74 3b 20 20 20 20 2f 2a  st *pList;    /*
126a0 20 54 68 65 20 72 65 73 75 6c 74 20 73 65 74 20   The result set 
126b0 6f 66 20 74 68 65 20 6f 75 74 65 72 20 71 75 65  of the outer que
126c0 72 79 20 2a 2f 0a 20 20 69 6e 74 20 69 50 61 72  ry */.  int iPar
126d0 65 6e 74 3b 20 20 20 20 20 20 20 20 2f 2a 20 56  ent;        /* V
126e0 44 42 45 20 63 75 72 73 6f 72 20 6e 75 6d 62 65  DBE cursor numbe
126f0 72 20 6f 66 20 74 68 65 20 70 53 75 62 20 72 65  r of the pSub re
12700 73 75 6c 74 20 73 65 74 20 74 65 6d 70 20 74 61  sult set temp ta
12710 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 69 3b 20  ble */.  int i; 
12720 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
12730 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a  Loop counter */.
12740 20 20 45 78 70 72 20 2a 70 57 68 65 72 65 3b 20    Expr *pWhere; 
12750 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12760 20 20 20 2f 2a 20 54 68 65 20 57 48 45 52 45 20     /* The WHERE 
12770 63 6c 61 75 73 65 20 2a 2f 0a 20 20 73 74 72 75  clause */.  stru
12780 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20  ct SrcList_item 
12790 2a 70 53 75 62 69 74 65 6d 3b 20 20 20 2f 2a 20  *pSubitem;   /* 
127a0 54 68 65 20 73 75 62 71 75 65 72 79 20 2a 2f 0a  The subquery */.
127b0 0a 20 20 2f 2a 20 43 68 65 63 6b 20 74 6f 20 73  .  /* Check to s
127c0 65 65 20 69 66 20 66 6c 61 74 74 65 6e 69 6e 67  ee if flattening
127d0 20 69 73 20 70 65 72 6d 69 74 74 65 64 2e 20 20   is permitted.  
127e0 52 65 74 75 72 6e 20 30 20 69 66 20 6e 6f 74 2e  Return 0 if not.
127f0 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 3d 3d 30  .  */.  if( p==0
12800 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 70   ) return 0;.  p
12810 53 72 63 20 3d 20 70 2d 3e 70 53 72 63 3b 0a 20  Src = p->pSrc;. 
12820 20 61 73 73 65 72 74 28 20 70 53 72 63 20 26 26   assert( pSrc &&
12830 20 69 46 72 6f 6d 3e 3d 30 20 26 26 20 69 46 72   iFrom>=0 && iFr
12840 6f 6d 3c 70 53 72 63 2d 3e 6e 53 72 63 20 29 3b  om<pSrc->nSrc );
12850 0a 20 20 70 53 75 62 69 74 65 6d 20 3d 20 26 70  .  pSubitem = &p
12860 53 72 63 2d 3e 61 5b 69 46 72 6f 6d 5d 3b 0a 20  Src->a[iFrom];. 
12870 20 70 53 75 62 20 3d 20 70 53 75 62 69 74 65 6d   pSub = pSubitem
12880 2d 3e 70 53 65 6c 65 63 74 3b 0a 20 20 61 73 73  ->pSelect;.  ass
12890 65 72 74 28 20 70 53 75 62 21 3d 30 20 29 3b 0a  ert( pSub!=0 );.
128a0 20 20 69 66 28 20 69 73 41 67 67 20 26 26 20 73    if( isAgg && s
128b0 75 62 71 75 65 72 79 49 73 41 67 67 20 29 20 72  ubqueryIsAgg ) r
128c0 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20 20  eturn 0;        
128d0 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73 74           /* Rest
128e0 72 69 63 74 69 6f 6e 20 28 31 29 20 20 2a 2f 0a  riction (1)  */.
128f0 20 20 69 66 28 20 73 75 62 71 75 65 72 79 49 73    if( subqueryIs
12900 41 67 67 20 26 26 20 70 53 72 63 2d 3e 6e 53 72  Agg && pSrc->nSr
12910 63 3e 31 20 29 20 72 65 74 75 72 6e 20 30 3b 20  c>1 ) return 0; 
12920 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73 74           /* Rest
12930 72 69 63 74 69 6f 6e 20 28 32 29 20 20 2a 2f 0a  riction (2)  */.
12940 20 20 70 53 75 62 53 72 63 20 3d 20 70 53 75 62    pSubSrc = pSub
12950 2d 3e 70 53 72 63 3b 0a 20 20 61 73 73 65 72 74  ->pSrc;.  assert
12960 28 20 70 53 75 62 53 72 63 20 29 3b 0a 20 20 2f  ( pSubSrc );.  /
12970 2a 20 50 72 69 6f 72 20 74 6f 20 76 65 72 73 69  * Prior to versi
12980 6f 6e 20 33 2e 31 2e 32 2c 20 77 68 65 6e 20 4c  on 3.1.2, when L
12990 49 4d 49 54 20 61 6e 64 20 4f 46 46 53 45 54 20  IMIT and OFFSET 
129a0 68 61 64 20 74 6f 20 62 65 20 73 69 6d 70 6c 65  had to be simple
129b0 20 63 6f 6e 73 74 61 6e 74 73 2c 0a 20 20 2a 2a   constants,.  **
129c0 20 6e 6f 74 20 61 72 62 69 74 72 61 72 79 20 65   not arbitrary e
129d0 78 70 72 65 73 73 73 69 6f 6e 73 2c 20 77 65 20  xpresssions, we 
129e0 61 6c 6c 6f 77 65 64 20 73 6f 6d 65 20 63 6f 6d  allowed some com
129f0 62 69 6e 69 6e 67 20 6f 66 20 4c 49 4d 49 54 20  bining of LIMIT 
12a00 61 6e 64 20 4f 46 46 53 45 54 0a 20 20 2a 2a 20  and OFFSET.  ** 
12a10 62 65 63 61 75 73 65 20 74 68 65 79 20 63 6f 75  because they cou
12a20 6c 64 20 62 65 20 63 6f 6d 70 75 74 65 64 20 61  ld be computed a
12a30 74 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 2e 20  t compile-time. 
12a40 20 42 75 74 20 77 68 65 6e 20 4c 49 4d 49 54 20   But when LIMIT 
12a50 61 6e 64 20 4f 46 46 53 45 54 0a 20 20 2a 2a 20  and OFFSET.  ** 
12a60 62 65 63 61 6d 65 20 61 72 62 69 74 72 61 72 79  became arbitrary
12a70 20 65 78 70 72 65 73 73 69 6f 6e 73 2c 20 77 65   expressions, we
12a80 20 77 65 72 65 20 66 6f 72 63 65 64 20 74 6f 20   were forced to 
12a90 61 64 64 20 72 65 73 74 72 69 63 74 69 6f 6e 73  add restrictions
12aa0 20 28 31 33 29 0a 20 20 2a 2a 20 61 6e 64 20 28   (13).  ** and (
12ab0 31 34 29 2e 20 2a 2f 0a 20 20 69 66 28 20 70 53  14). */.  if( pS
12ac0 75 62 2d 3e 70 4c 69 6d 69 74 20 26 26 20 70 2d  ub->pLimit && p-
12ad0 3e 70 4c 69 6d 69 74 20 29 20 72 65 74 75 72 6e  >pLimit ) return
12ae0 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
12af0 20 2f 2a 20 52 65 73 74 72 69 63 74 69 6f 6e 20   /* Restriction 
12b00 28 31 33 29 20 2a 2f 0a 20 20 69 66 28 20 70 53  (13) */.  if( pS
12b10 75 62 2d 3e 70 4f 66 66 73 65 74 20 29 20 72 65  ub->pOffset ) re
12b20 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20 20 20  turn 0;         
12b30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12b40 20 2f 2a 20 52 65 73 74 72 69 63 74 69 6f 6e 20   /* Restriction 
12b50 28 31 34 29 20 2a 2f 0a 20 20 69 66 28 20 70 2d  (14) */.  if( p-
12b60 3e 70 52 69 67 68 74 6d 6f 73 74 20 26 26 20 70  >pRightmost && p
12b70 53 75 62 2d 3e 70 4c 69 6d 69 74 20 26 26 20 70  Sub->pLimit && p
12b80 53 75 62 2d 3e 70 4f 72 64 65 72 42 79 20 29 7b  Sub->pOrderBy ){
12b90 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 20 20  .    return 0;  
12ba0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12bb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12bc0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73            /* Res
12bd0 74 72 69 63 74 69 6f 6e 20 28 31 35 29 20 2a 2f  triction (15) */
12be0 0a 20 20 7d 0a 20 20 69 66 28 20 70 53 75 62 53  .  }.  if( pSubS
12bf0 72 63 2d 3e 6e 53 72 63 3d 3d 30 20 29 20 72 65  rc->nSrc==0 ) re
12c00 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20 20 20  turn 0;         
12c10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
12c20 20 52 65 73 74 72 69 63 74 69 6f 6e 20 28 37 29   Restriction (7)
12c30 20 20 2a 2f 0a 20 20 69 66 28 20 28 70 53 75 62    */.  if( (pSub
12c40 2d 3e 69 73 44 69 73 74 69 6e 63 74 20 7c 7c 20  ->isDistinct || 
12c50 70 53 75 62 2d 3e 70 4c 69 6d 69 74 29 20 0a 20  pSub->pLimit) . 
12c60 20 20 20 20 20 20 20 20 26 26 20 28 70 53 72 63          && (pSrc
12c70 2d 3e 6e 53 72 63 3e 31 20 7c 7c 20 69 73 41 67  ->nSrc>1 || isAg
12c80 67 29 20 29 7b 20 20 20 20 20 20 20 20 20 20 2f  g) ){          /
12c90 2a 20 52 65 73 74 72 69 63 74 69 6f 6e 73 20 28  * Restrictions (
12ca0 34 29 28 35 29 28 38 29 28 39 29 20 2a 2f 0a 20  4)(5)(8)(9) */. 
12cb0 20 20 20 20 72 65 74 75 72 6e 20 30 3b 20 20 20      return 0;   
12cc0 20 20 20 20 0a 20 20 7d 0a 20 20 69 66 28 20 70      .  }.  if( p
12cd0 2d 3e 69 73 44 69 73 74 69 6e 63 74 20 26 26 20  ->isDistinct && 
12ce0 73 75 62 71 75 65 72 79 49 73 41 67 67 20 29 20  subqueryIsAgg ) 
12cf0 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20  return 0;       
12d00 20 20 2f 2a 20 52 65 73 74 72 69 63 74 69 6f 6e    /* Restriction
12d10 20 28 36 29 20 20 2a 2f 0a 20 20 69 66 28 20 28   (6)  */.  if( (
12d20 70 2d 3e 64 69 73 61 6c 6c 6f 77 4f 72 64 65 72  p->disallowOrder
12d30 42 79 20 7c 7c 20 70 2d 3e 70 4f 72 64 65 72 42  By || p->pOrderB
12d40 79 29 20 26 26 20 70 53 75 62 2d 3e 70 4f 72 64  y) && pSub->pOrd
12d50 65 72 42 79 20 29 7b 0a 20 20 20 20 20 72 65 74  erBy ){.     ret
12d60 75 72 6e 20 30 3b 20 20 20 20 20 20 20 20 20 20  urn 0;          
12d70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12d80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12d90 20 2f 2a 20 52 65 73 74 72 69 63 74 69 6f 6e 20   /* Restriction 
12da0 28 31 31 29 20 2a 2f 0a 20 20 7d 0a 0a 20 20 2f  (11) */.  }..  /
12db0 2a 20 52 65 73 74 72 69 63 74 69 6f 6e 20 33 3a  * Restriction 3:
12dc0 20 20 49 66 20 74 68 65 20 73 75 62 71 75 65 72    If the subquer
12dd0 79 20 69 73 20 61 20 6a 6f 69 6e 2c 20 6d 61 6b  y is a join, mak
12de0 65 20 73 75 72 65 20 74 68 65 20 73 75 62 71 75  e sure the subqu
12df0 65 72 79 20 69 73 20 0a 20 20 2a 2a 20 6e 6f 74  ery is .  ** not
12e00 20 75 73 65 64 20 61 73 20 74 68 65 20 72 69 67   used as the rig
12e10 68 74 20 6f 70 65 72 61 6e 64 20 6f 66 20 61 6e  ht operand of an
12e20 20 6f 75 74 65 72 20 6a 6f 69 6e 2e 20 20 45 78   outer join.  Ex
12e30 61 6d 70 6c 65 73 20 6f 66 20 77 68 79 20 74 68  amples of why th
12e40 69 73 0a 20 20 2a 2a 20 69 73 20 6e 6f 74 20 61  is.  ** is not a
12e50 6c 6c 6f 77 65 64 3a 0a 20 20 2a 2a 0a 20 20 2a  llowed:.  **.  *
12e60 2a 20 20 20 20 20 20 20 20 20 74 31 20 4c 45 46  *         t1 LEF
12e70 54 20 4f 55 54 45 52 20 4a 4f 49 4e 20 28 74 32  T OUTER JOIN (t2
12e80 20 4a 4f 49 4e 20 74 33 29 0a 20 20 2a 2a 0a 20   JOIN t3).  **. 
12e90 20 2a 2a 20 49 66 20 77 65 20 66 6c 61 74 74 65   ** If we flatte
12ea0 6e 20 74 68 65 20 61 62 6f 76 65 2c 20 77 65 20  n the above, we 
12eb0 77 6f 75 6c 64 20 67 65 74 0a 20 20 2a 2a 0a 20  would get.  **. 
12ec0 20 2a 2a 20 20 20 20 20 20 20 20 20 28 74 31 20   **         (t1 
12ed0 4c 45 46 54 20 4f 55 54 45 52 20 4a 4f 49 4e 20  LEFT OUTER JOIN 
12ee0 74 32 29 20 4a 4f 49 4e 20 74 33 0a 20 20 2a 2a  t2) JOIN t3.  **
12ef0 0a 20 20 2a 2a 20 77 68 69 63 68 20 69 73 20 6e  .  ** which is n
12f00 6f 74 20 61 74 20 61 6c 6c 20 74 68 65 20 73 61  ot at all the sa
12f10 6d 65 20 74 68 69 6e 67 2e 0a 20 20 2a 2f 0a 20  me thing..  */. 
12f20 20 69 66 28 20 70 53 75 62 53 72 63 2d 3e 6e 53   if( pSubSrc->nS
12f30 72 63 3e 31 20 26 26 20 28 70 53 75 62 69 74 65  rc>1 && (pSubite
12f40 6d 2d 3e 6a 6f 69 6e 74 79 70 65 20 26 20 4a 54  m->jointype & JT
12f50 5f 4f 55 54 45 52 29 21 3d 30 20 29 7b 0a 20 20  _OUTER)!=0 ){.  
12f60 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a    return 0;.  }.
12f70 0a 20 20 2f 2a 20 52 65 73 74 72 69 63 74 69 6f  .  /* Restrictio
12f80 6e 20 31 32 3a 20 20 49 66 20 74 68 65 20 73 75  n 12:  If the su
12f90 62 71 75 65 72 79 20 69 73 20 74 68 65 20 72 69  bquery is the ri
12fa0 67 68 74 20 6f 70 65 72 61 6e 64 20 6f 66 20 61  ght operand of a
12fb0 20 6c 65 66 74 20 6f 75 74 65 72 0a 20 20 2a 2a   left outer.  **
12fc0 20 6a 6f 69 6e 2c 20 6d 61 6b 65 20 73 75 72 65   join, make sure
12fd0 20 74 68 65 20 73 75 62 71 75 65 72 79 20 68 61   the subquery ha
12fe0 73 20 6e 6f 20 57 48 45 52 45 20 63 6c 61 75 73  s no WHERE claus
12ff0 65 2e 0a 20 20 2a 2a 20 41 6e 20 65 78 61 6d 70  e..  ** An examp
13000 6c 65 73 20 6f 66 20 77 68 79 20 74 68 69 73 20  les of why this 
13010 69 73 20 6e 6f 74 20 61 6c 6c 6f 77 65 64 3a 0a  is not allowed:.
13020 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 20 20    **.  **       
13030 20 20 74 31 20 4c 45 46 54 20 4f 55 54 45 52 20    t1 LEFT OUTER 
13040 4a 4f 49 4e 20 28 53 45 4c 45 43 54 20 2a 20 46  JOIN (SELECT * F
13050 52 4f 4d 20 74 32 20 57 48 45 52 45 20 74 32 2e  ROM t2 WHERE t2.
13060 78 3e 30 29 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49  x>0).  **.  ** I
13070 66 20 77 65 20 66 6c 61 74 74 65 6e 20 74 68 65  f we flatten the
13080 20 61 62 6f 76 65 2c 20 77 65 20 77 6f 75 6c 64   above, we would
13090 20 67 65 74 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20   get.  **.  **  
130a0 20 20 20 20 20 20 20 28 74 31 20 4c 45 46 54 20         (t1 LEFT 
130b0 4f 55 54 45 52 20 4a 4f 49 4e 20 74 32 29 20 57  OUTER JOIN t2) W
130c0 48 45 52 45 20 74 32 2e 78 3e 30 0a 20 20 2a 2a  HERE t2.x>0.  **
130d0 0a 20 20 2a 2a 20 42 75 74 20 74 68 65 20 74 32  .  ** But the t2
130e0 2e 78 3e 30 20 74 65 73 74 20 77 69 6c 6c 20 61  .x>0 test will a
130f0 6c 77 61 79 73 20 66 61 69 6c 20 6f 6e 20 61 20  lways fail on a 
13100 4e 55 4c 4c 20 72 6f 77 20 6f 66 20 74 32 2c 20  NULL row of t2, 
13110 77 68 69 63 68 0a 20 20 2a 2a 20 65 66 66 65 63  which.  ** effec
13120 74 69 76 65 6c 79 20 63 6f 6e 76 65 72 74 73 20  tively converts 
13130 74 68 65 20 4f 55 54 45 52 20 4a 4f 49 4e 20 69  the OUTER JOIN i
13140 6e 74 6f 20 61 6e 20 49 4e 4e 45 52 20 4a 4f 49  nto an INNER JOI
13150 4e 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 28 70  N..  */.  if( (p
13160 53 75 62 69 74 65 6d 2d 3e 6a 6f 69 6e 74 79 70  Subitem->jointyp
13170 65 20 26 20 4a 54 5f 4f 55 54 45 52 29 21 3d 30  e & JT_OUTER)!=0
13180 20 26 26 20 70 53 75 62 2d 3e 70 57 68 65 72 65   && pSub->pWhere
13190 21 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72  !=0 ){.    retur
131a0 6e 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49  n 0;.  }..  /* I
131b0 66 20 77 65 20 72 65 61 63 68 20 74 68 69 73 20  f we reach this 
131c0 70 6f 69 6e 74 2c 20 69 74 20 6d 65 61 6e 73 20  point, it means 
131d0 66 6c 61 74 74 65 6e 69 6e 67 20 69 73 20 70 65  flattening is pe
131e0 72 6d 69 74 74 65 64 20 66 6f 72 20 74 68 65 0a  rmitted for the.
131f0 20 20 2a 2a 20 69 46 72 6f 6d 2d 74 68 20 65 6e    ** iFrom-th en
13200 74 72 79 20 6f 66 20 74 68 65 20 46 52 4f 4d 20  try of the FROM 
13210 63 6c 61 75 73 65 20 69 6e 20 74 68 65 20 6f 75  clause in the ou
13220 74 65 72 20 71 75 65 72 79 2e 0a 20 20 2a 2f 0a  ter query..  */.
13230 0a 20 20 2f 2a 20 4d 6f 76 65 20 61 6c 6c 20 6f  .  /* Move all o
13240 66 20 74 68 65 20 46 52 4f 4d 20 65 6c 65 6d 65  f the FROM eleme
13250 6e 74 73 20 6f 66 20 74 68 65 20 73 75 62 71 75  nts of the subqu
13260 65 72 79 20 69 6e 74 6f 20 74 68 65 0a 20 20 2a  ery into the.  *
13270 2a 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73  * the FROM claus
13280 65 20 6f 66 20 74 68 65 20 6f 75 74 65 72 20 71  e of the outer q
13290 75 65 72 79 2e 20 20 42 65 66 6f 72 65 20 64 6f  uery.  Before do
132a0 69 6e 67 20 74 68 69 73 2c 20 72 65 6d 65 6d 62  ing this, rememb
132b0 65 72 0a 20 20 2a 2a 20 74 68 65 20 63 75 72 73  er.  ** the curs
132c0 6f 72 20 6e 75 6d 62 65 72 20 66 6f 72 20 74 68  or number for th
132d0 65 20 6f 72 69 67 69 6e 61 6c 20 6f 75 74 65 72  e original outer
132e0 20 71 75 65 72 79 20 46 52 4f 4d 20 65 6c 65 6d   query FROM elem
132f0 65 6e 74 20 69 6e 0a 20 20 2a 2a 20 69 50 61 72  ent in.  ** iPar
13300 65 6e 74 2e 20 20 54 68 65 20 69 50 61 72 65 6e  ent.  The iParen
13310 74 20 63 75 72 73 6f 72 20 77 69 6c 6c 20 6e 65  t cursor will ne
13320 76 65 72 20 62 65 20 75 73 65 64 2e 20 20 53 75  ver be used.  Su
13330 62 73 65 71 75 65 6e 74 20 63 6f 64 65 0a 20 20  bsequent code.  
13340 2a 2a 20 77 69 6c 6c 20 73 63 61 6e 20 65 78 70  ** will scan exp
13350 72 65 73 73 69 6f 6e 73 20 6c 6f 6f 6b 69 6e 67  ressions looking
13360 20 66 6f 72 20 69 50 61 72 65 6e 74 20 72 65 66   for iParent ref
13370 65 72 65 6e 63 65 73 20 61 6e 64 20 72 65 70 6c  erences and repl
13380 61 63 65 0a 20 20 2a 2a 20 74 68 6f 73 65 20 72  ace.  ** those r
13390 65 66 65 72 65 6e 63 65 73 20 77 69 74 68 20 65  eferences with e
133a0 78 70 72 65 73 73 69 6f 6e 73 20 74 68 61 74 20  xpressions that 
133b0 72 65 73 6f 6c 76 65 20 74 6f 20 74 68 65 20 73  resolve to the s
133c0 75 62 71 75 65 72 79 20 46 52 4f 4d 0a 20 20 2a  ubquery FROM.  *
133d0 2a 20 65 6c 65 6d 65 6e 74 73 20 77 65 20 61 72  * elements we ar
133e0 65 20 6e 6f 77 20 63 6f 70 79 69 6e 67 20 69 6e  e now copying in
133f0 2e 0a 20 20 2a 2f 0a 20 20 69 50 61 72 65 6e 74  ..  */.  iParent
13400 20 3d 20 70 53 75 62 69 74 65 6d 2d 3e 69 43 75   = pSubitem->iCu
13410 72 73 6f 72 3b 0a 20 20 7b 0a 20 20 20 20 69 6e  rsor;.  {.    in
13420 74 20 6e 53 75 62 53 72 63 20 3d 20 70 53 75 62  t nSubSrc = pSub
13430 53 72 63 2d 3e 6e 53 72 63 3b 0a 20 20 20 20 69  Src->nSrc;.    i
13440 6e 74 20 6a 6f 69 6e 74 79 70 65 20 3d 20 70 53  nt jointype = pS
13450 75 62 69 74 65 6d 2d 3e 6a 6f 69 6e 74 79 70 65  ubitem->jointype
13460 3b 0a 0a 20 20 20 20 73 71 6c 69 74 65 33 44 65  ;..    sqlite3De
13470 6c 65 74 65 54 61 62 6c 65 28 70 53 75 62 69 74  leteTable(pSubit
13480 65 6d 2d 3e 70 54 61 62 29 3b 0a 20 20 20 20 73  em->pTab);.    s
13490 71 6c 69 74 65 33 5f 66 72 65 65 28 70 53 75 62  qlite3_free(pSub
134a0 69 74 65 6d 2d 3e 7a 44 61 74 61 62 61 73 65 29  item->zDatabase)
134b0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72  ;.    sqlite3_fr
134c0 65 65 28 70 53 75 62 69 74 65 6d 2d 3e 7a 4e 61  ee(pSubitem->zNa
134d0 6d 65 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  me);.    sqlite3
134e0 5f 66 72 65 65 28 70 53 75 62 69 74 65 6d 2d 3e  _free(pSubitem->
134f0 7a 41 6c 69 61 73 29 3b 0a 20 20 20 20 69 66 28  zAlias);.    if(
13500 20 6e 53 75 62 53 72 63 3e 31 20 29 7b 0a 20 20   nSubSrc>1 ){.  
13510 20 20 20 20 69 6e 74 20 65 78 74 72 61 20 3d 20      int extra = 
13520 6e 53 75 62 53 72 63 20 2d 20 31 3b 0a 20 20 20  nSubSrc - 1;.   
13530 20 20 20 66 6f 72 28 69 3d 31 3b 20 69 3c 6e 53     for(i=1; i<nS
13540 75 62 53 72 63 3b 20 69 2b 2b 29 7b 0a 20 20 20  ubSrc; i++){.   
13550 20 20 20 20 20 70 53 72 63 20 3d 20 73 71 6c 69       pSrc = sqli
13560 74 65 33 53 72 63 4c 69 73 74 41 70 70 65 6e 64  te3SrcListAppend
13570 28 64 62 2c 20 70 53 72 63 2c 20 30 2c 20 30 29  (db, pSrc, 0, 0)
13580 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
13590 70 2d 3e 70 53 72 63 20 3d 20 70 53 72 63 3b 0a  p->pSrc = pSrc;.
135a0 20 20 20 20 20 20 66 6f 72 28 69 3d 70 53 72 63        for(i=pSrc
135b0 2d 3e 6e 53 72 63 2d 31 3b 20 69 2d 65 78 74 72  ->nSrc-1; i-extr
135c0 61 3e 3d 69 46 72 6f 6d 3b 20 69 2d 2d 29 7b 0a  a>=iFrom; i--){.
135d0 20 20 20 20 20 20 20 20 70 53 72 63 2d 3e 61 5b          pSrc->a[
135e0 69 5d 20 3d 20 70 53 72 63 2d 3e 61 5b 69 2d 65  i] = pSrc->a[i-e
135f0 78 74 72 61 5d 3b 0a 20 20 20 20 20 20 7d 0a 20  xtra];.      }. 
13600 20 20 20 7d 0a 20 20 20 20 66 6f 72 28 69 3d 30     }.    for(i=0
13610 3b 20 69 3c 6e 53 75 62 53 72 63 3b 20 69 2b 2b  ; i<nSubSrc; i++
13620 29 7b 0a 20 20 20 20 20 20 70 53 72 63 2d 3e 61  ){.      pSrc->a
13630 5b 69 2b 69 46 72 6f 6d 5d 20 3d 20 70 53 75 62  [i+iFrom] = pSub
13640 53 72 63 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20 20  Src->a[i];.     
13650 20 6d 65 6d 73 65 74 28 26 70 53 75 62 53 72 63   memset(&pSubSrc
13660 2d 3e 61 5b 69 5d 2c 20 30 2c 20 73 69 7a 65 6f  ->a[i], 0, sizeo
13670 66 28 70 53 75 62 53 72 63 2d 3e 61 5b 69 5d 29  f(pSubSrc->a[i])
13680 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 53 72  );.    }.    pSr
13690 63 2d 3e 61 5b 69 46 72 6f 6d 5d 2e 6a 6f 69 6e  c->a[iFrom].join
136a0 74 79 70 65 20 3d 20 6a 6f 69 6e 74 79 70 65 3b  type = jointype;
136b0 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4e 6f 77 20 62  .  }..  /* Now b
136c0 65 67 69 6e 20 73 75 62 73 74 69 74 75 74 69 6e  egin substitutin
136d0 67 20 73 75 62 71 75 65 72 79 20 72 65 73 75 6c  g subquery resul
136e0 74 20 73 65 74 20 65 78 70 72 65 73 73 69 6f 6e  t set expression
136f0 73 20 66 6f 72 20 0a 20 20 2a 2a 20 72 65 66 65  s for .  ** refe
13700 72 65 6e 63 65 73 20 74 6f 20 74 68 65 20 69 50  rences to the iP
13710 61 72 65 6e 74 20 69 6e 20 74 68 65 20 6f 75 74  arent in the out
13720 65 72 20 71 75 65 72 79 2e 0a 20 20 2a 2a 20 0a  er query..  ** .
13730 20 20 2a 2a 20 45 78 61 6d 70 6c 65 3a 0a 20 20    ** Example:.  
13740 2a 2a 0a 20 20 2a 2a 20 20 20 53 45 4c 45 43 54  **.  **   SELECT
13750 20 61 2b 35 2c 20 62 2a 31 30 20 46 52 4f 4d 20   a+5, b*10 FROM 
13760 28 53 45 4c 45 43 54 20 78 2a 33 20 41 53 20 61  (SELECT x*3 AS a
13770 2c 20 79 2b 31 30 20 41 53 20 62 20 46 52 4f 4d  , y+10 AS b FROM
13780 20 74 31 29 20 57 48 45 52 45 20 61 3e 62 3b 0a   t1) WHERE a>b;.
13790 20 20 2a 2a 20 20 20 5c 20 20 20 20 20 20 20 20    **   \        
137a0 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 5f 5f               \__
137b0 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 20 73 75 62 71  ___________ subq
137c0 75 65 72 79 20 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 2f  uery __________/
137d0 20 20 20 20 20 20 20 20 20 20 2f 0a 20 20 2a 2a            /.  **
137e0 20 20 20 20 5c 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f      \___________
137f0 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 20 6f 75 74 65 72  __________ outer
13800 20 71 75 65 72 79 20 5f 5f 5f 5f 5f 5f 5f 5f 5f   query _________
13810 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f  ________________
13820 5f 5f 5f 5f 5f 2f 0a 20 20 2a 2a 0a 20 20 2a 2a  _____/.  **.  **
13830 20 57 65 20 6c 6f 6f 6b 20 61 74 20 65 76 65 72   We look at ever
13840 79 20 65 78 70 72 65 73 73 69 6f 6e 20 69 6e 20  y expression in 
13850 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20  the outer query 
13860 61 6e 64 20 65 76 65 72 79 20 70 6c 61 63 65 20  and every place 
13870 77 65 20 73 65 65 0a 20 20 2a 2a 20 22 61 22 20  we see.  ** "a" 
13880 77 65 20 73 75 62 73 74 69 74 75 74 65 20 22 78  we substitute "x
13890 2a 33 22 20 61 6e 64 20 65 76 65 72 79 20 70 6c  *3" and every pl
138a0 61 63 65 20 77 65 20 73 65 65 20 22 62 22 20 77  ace we see "b" w
138b0 65 20 73 75 62 73 74 69 74 75 74 65 20 22 79 2b  e substitute "y+
138c0 31 30 22 2e 0a 20 20 2a 2f 0a 20 20 70 4c 69 73  10"..  */.  pLis
138d0 74 20 3d 20 70 2d 3e 70 45 4c 69 73 74 3b 0a 20  t = p->pEList;. 
138e0 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4c 69 73   for(i=0; i<pLis
138f0 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a  t->nExpr; i++){.
13900 20 20 20 20 45 78 70 72 20 2a 70 45 78 70 72 3b      Expr *pExpr;
13910 0a 20 20 20 20 69 66 28 20 70 4c 69 73 74 2d 3e  .    if( pList->
13920 61 5b 69 5d 2e 7a 4e 61 6d 65 3d 3d 30 20 26 26  a[i].zName==0 &&
13930 20 28 70 45 78 70 72 20 3d 20 70 4c 69 73 74 2d   (pExpr = pList-
13940 3e 61 5b 69 5d 2e 70 45 78 70 72 29 2d 3e 73 70  >a[i].pExpr)->sp
13950 61 6e 2e 7a 21 3d 30 20 29 7b 0a 20 20 20 20 20  an.z!=0 ){.     
13960 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61   pList->a[i].zNa
13970 6d 65 20 3d 20 0a 20 20 20 20 20 20 20 20 20 20  me = .          
13980 20 20 20 73 71 6c 69 74 65 33 44 62 53 74 72 4e     sqlite3DbStrN
13990 44 75 70 28 64 62 2c 20 28 63 68 61 72 2a 29 70  Dup(db, (char*)p
139a0 45 78 70 72 2d 3e 73 70 61 6e 2e 7a 2c 20 70 45  Expr->span.z, pE
139b0 78 70 72 2d 3e 73 70 61 6e 2e 6e 29 3b 0a 20 20  xpr->span.n);.  
139c0 20 20 7d 0a 20 20 7d 0a 20 20 73 75 62 73 74 45    }.  }.  substE
139d0 78 70 72 4c 69 73 74 28 70 2d 3e 70 45 4c 69 73  xprList(p->pELis
139e0 74 2c 20 69 50 61 72 65 6e 74 2c 20 70 53 75 62  t, iParent, pSub
139f0 2d 3e 70 45 4c 69 73 74 29 3b 0a 20 20 69 66 28  ->pEList);.  if(
13a00 20 69 73 41 67 67 20 29 7b 0a 20 20 20 20 73 75   isAgg ){.    su
13a10 62 73 74 45 78 70 72 4c 69 73 74 28 70 2d 3e 70  bstExprList(p->p
13a20 47 72 6f 75 70 42 79 2c 20 69 50 61 72 65 6e 74  GroupBy, iParent
13a30 2c 20 70 53 75 62 2d 3e 70 45 4c 69 73 74 29 3b  , pSub->pEList);
13a40 0a 20 20 20 20 73 75 62 73 74 45 78 70 72 28 70  .    substExpr(p
13a50 2d 3e 70 48 61 76 69 6e 67 2c 20 69 50 61 72 65  ->pHaving, iPare
13a60 6e 74 2c 20 70 53 75 62 2d 3e 70 45 4c 69 73 74  nt, pSub->pEList
13a70 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 53 75  );.  }.  if( pSu
13a80 62 2d 3e 70 4f 72 64 65 72 42 79 20 29 7b 0a 20  b->pOrderBy ){. 
13a90 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 4f     assert( p->pO
13aa0 72 64 65 72 42 79 3d 3d 30 20 29 3b 0a 20 20 20  rderBy==0 );.   
13ab0 20 70 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20 70   p->pOrderBy = p
13ac0 53 75 62 2d 3e 70 4f 72 64 65 72 42 79 3b 0a 20  Sub->pOrderBy;. 
13ad0 20 20 20 70 53 75 62 2d 3e 70 4f 72 64 65 72 42     pSub->pOrderB
13ae0 79 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 20 69  y = 0;.  }else i
13af0 66 28 20 70 2d 3e 70 4f 72 64 65 72 42 79 20 29  f( p->pOrderBy )
13b00 7b 0a 20 20 20 20 73 75 62 73 74 45 78 70 72 4c  {.    substExprL
13b10 69 73 74 28 70 2d 3e 70 4f 72 64 65 72 42 79 2c  ist(p->pOrderBy,
13b20 20 69 50 61 72 65 6e 74 2c 20 70 53 75 62 2d 3e   iParent, pSub->
13b30 70 45 4c 69 73 74 29 3b 0a 20 20 7d 0a 20 20 69  pEList);.  }.  i
13b40 66 28 20 70 53 75 62 2d 3e 70 57 68 65 72 65 20  f( pSub->pWhere 
13b50 29 7b 0a 20 20 20 20 70 57 68 65 72 65 20 3d 20  ){.    pWhere = 
13b60 73 71 6c 69 74 65 33 45 78 70 72 44 75 70 28 64  sqlite3ExprDup(d
13b70 62 2c 20 70 53 75 62 2d 3e 70 57 68 65 72 65 29  b, pSub->pWhere)
13b80 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70  ;.  }else{.    p
13b90 57 68 65 72 65 20 3d 20 30 3b 0a 20 20 7d 0a 20  Where = 0;.  }. 
13ba0 20 69 66 28 20 73 75 62 71 75 65 72 79 49 73 41   if( subqueryIsA
13bb0 67 67 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  gg ){.    assert
13bc0 28 20 70 2d 3e 70 48 61 76 69 6e 67 3d 3d 30 20  ( p->pHaving==0 
13bd0 29 3b 0a 20 20 20 20 70 2d 3e 70 48 61 76 69 6e  );.    p->pHavin
13be0 67 20 3d 20 70 2d 3e 70 57 68 65 72 65 3b 0a 20  g = p->pWhere;. 
13bf0 20 20 20 70 2d 3e 70 57 68 65 72 65 20 3d 20 70     p->pWhere = p
13c00 57 68 65 72 65 3b 0a 20 20 20 20 73 75 62 73 74  Where;.    subst
13c10 45 78 70 72 28 70 2d 3e 70 48 61 76 69 6e 67 2c  Expr(p->pHaving,
13c20 20 69 50 61 72 65 6e 74 2c 20 70 53 75 62 2d 3e   iParent, pSub->
13c30 70 45 4c 69 73 74 29 3b 0a 20 20 20 20 70 2d 3e  pEList);.    p->
13c40 70 48 61 76 69 6e 67 20 3d 20 73 71 6c 69 74 65  pHaving = sqlite
13c50 33 45 78 70 72 41 6e 64 28 64 62 2c 20 70 2d 3e  3ExprAnd(db, p->
13c60 70 48 61 76 69 6e 67 2c 20 0a 20 20 20 20 20 20  pHaving, .      
13c70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13c80 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
13c90 33 45 78 70 72 44 75 70 28 64 62 2c 20 70 53 75  3ExprDup(db, pSu
13ca0 62 2d 3e 70 48 61 76 69 6e 67 29 29 3b 0a 20 20  b->pHaving));.  
13cb0 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 47 72    assert( p->pGr
13cc0 6f 75 70 42 79 3d 3d 30 20 29 3b 0a 20 20 20 20  oupBy==0 );.    
13cd0 70 2d 3e 70 47 72 6f 75 70 42 79 20 3d 20 73 71  p->pGroupBy = sq
13ce0 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 75 70  lite3ExprListDup
13cf0 28 64 62 2c 20 70 53 75 62 2d 3e 70 47 72 6f 75  (db, pSub->pGrou
13d00 70 42 79 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  pBy);.  }else{. 
13d10 20 20 20 73 75 62 73 74 45 78 70 72 28 70 2d 3e     substExpr(p->
13d20 70 57 68 65 72 65 2c 20 69 50 61 72 65 6e 74 2c  pWhere, iParent,
13d30 20 70 53 75 62 2d 3e 70 45 4c 69 73 74 29 3b 0a   pSub->pEList);.
13d40 20 20 20 20 70 2d 3e 70 57 68 65 72 65 20 3d 20      p->pWhere = 
13d50 73 71 6c 69 74 65 33 45 78 70 72 41 6e 64 28 64  sqlite3ExprAnd(d
13d60 62 2c 20 70 2d 3e 70 57 68 65 72 65 2c 20 70 57  b, p->pWhere, pW
13d70 68 65 72 65 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  here);.  }..  /*
13d80 20 54 68 65 20 66 6c 61 74 74 65 6e 65 64 20 71   The flattened q
13d90 75 65 72 79 20 69 73 20 64 69 73 74 69 6e 63 74  uery is distinct
13da0 20 69 66 20 65 69 74 68 65 72 20 74 68 65 20 69   if either the i
13db0 6e 6e 65 72 20 6f 72 20 74 68 65 0a 20 20 2a 2a  nner or the.  **
13dc0 20 6f 75 74 65 72 20 71 75 65 72 79 20 69 73 20   outer query is 
13dd0 64 69 73 74 69 6e 63 74 2e 20 0a 20 20 2a 2f 0a  distinct. .  */.
13de0 20 20 70 2d 3e 69 73 44 69 73 74 69 6e 63 74 20    p->isDistinct 
13df0 3d 20 70 2d 3e 69 73 44 69 73 74 69 6e 63 74 20  = p->isDistinct 
13e00 7c 7c 20 70 53 75 62 2d 3e 69 73 44 69 73 74 69  || pSub->isDisti
13e10 6e 63 74 3b 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20  nct;..  /*.  ** 
13e20 53 45 4c 45 43 54 20 2e 2e 2e 20 46 52 4f 4d 20  SELECT ... FROM 
13e30 28 53 45 4c 45 43 54 20 2e 2e 2e 20 4c 49 4d 49  (SELECT ... LIMI
13e40 54 20 61 20 4f 46 46 53 45 54 20 62 29 20 4c 49  T a OFFSET b) LI
13e50 4d 49 54 20 78 20 4f 46 46 53 45 54 20 79 3b 0a  MIT x OFFSET y;.
13e60 20 20 2a 2a 0a 20 20 2a 2a 20 4f 6e 65 20 69 73    **.  ** One is
13e70 20 74 65 6d 70 74 65 64 20 74 6f 20 74 72 79 20   tempted to try 
13e80 74 6f 20 61 64 64 20 61 20 61 6e 64 20 62 20 74  to add a and b t
13e90 6f 20 63 6f 6d 62 69 6e 65 20 74 68 65 20 6c 69  o combine the li
13ea0 6d 69 74 73 2e 20 20 42 75 74 20 74 68 69 73 0a  mits.  But this.
13eb0 20 20 2a 2a 20 64 6f 65 73 20 6e 6f 74 20 77 6f    ** does not wo
13ec0 72 6b 20 69 66 20 65 69 74 68 65 72 20 6c 69 6d  rk if either lim
13ed0 69 74 20 69 73 20 6e 65 67 61 74 69 76 65 2e 0a  it is negative..
13ee0 20 20 2a 2f 0a 20 20 69 66 28 20 70 53 75 62 2d    */.  if( pSub-
13ef0 3e 70 4c 69 6d 69 74 20 29 7b 0a 20 20 20 20 70  >pLimit ){.    p
13f00 2d 3e 70 4c 69 6d 69 74 20 3d 20 70 53 75 62 2d  ->pLimit = pSub-
13f10 3e 70 4c 69 6d 69 74 3b 0a 20 20 20 20 70 53 75  >pLimit;.    pSu
13f20 62 2d 3e 70 4c 69 6d 69 74 20 3d 20 30 3b 0a 20  b->pLimit = 0;. 
13f30 20 7d 0a 0a 20 20 2f 2a 20 46 69 6e 69 61 6c 6c   }..  /* Finiall
13f40 79 2c 20 64 65 6c 65 74 65 20 77 68 61 74 20 69  y, delete what i
13f50 73 20 6c 65 66 74 20 6f 66 20 74 68 65 20 73 75  s left of the su
13f60 62 71 75 65 72 79 20 61 6e 64 20 72 65 74 75 72  bquery and retur
13f70 6e 0a 20 20 2a 2a 20 73 75 63 63 65 73 73 2e 0a  n.  ** success..
13f80 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 53 65    */.  sqlite3Se
13f90 6c 65 63 74 44 65 6c 65 74 65 28 70 53 75 62 29  lectDelete(pSub)
13fa0 3b 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a 7d 0a  ;.  return 1;.}.
13fb0 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
13fc0 5f 4f 4d 49 54 5f 56 49 45 57 20 2a 2f 0a 0a 2f  _OMIT_VIEW */../
13fd0 2a 0a 2a 2a 20 41 6e 61 6c 79 7a 65 20 74 68 65  *.** Analyze the
13fe0 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
13ff0 74 20 70 61 73 73 65 64 20 69 6e 20 61 73 20 61  t passed in as a
14000 6e 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 73 65  n argument to se
14010 65 20 69 66 20 69 74 0a 2a 2a 20 69 73 20 61 20  e if it.** is a 
14020 73 69 6d 70 6c 65 20 6d 69 6e 28 29 20 6f 72 20  simple min() or 
14030 6d 61 78 28 29 20 71 75 65 72 79 2e 20 20 49 66  max() query.  If
14040 20 69 74 20 69 73 20 61 6e 64 20 74 68 69 73 20   it is and this 
14050 71 75 65 72 79 20 63 61 6e 20 62 65 0a 2a 2a 20  query can be.** 
14060 73 61 74 69 73 66 69 65 64 20 75 73 69 6e 67 20  satisfied using 
14070 61 20 73 69 6e 67 6c 65 20 73 65 65 6b 20 74 6f  a single seek to
14080 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f   the beginning o
14090 72 20 65 6e 64 20 6f 66 20 61 6e 20 69 6e 64 65  r end of an inde
140a0 78 2c 0a 2a 2a 20 74 68 65 6e 20 67 65 6e 65 72  x,.** then gener
140b0 61 74 65 20 74 68 65 20 63 6f 64 65 20 66 6f 72  ate the code for
140c0 20 74 68 69 73 20 53 45 4c 45 43 54 20 61 6e 64   this SELECT and
140d0 20 72 65 74 75 72 6e 20 31 2e 20 20 49 66 20 74   return 1.  If t
140e0 68 69 73 20 69 73 20 6e 6f 74 20 61 20 0a 2a 2a  his is not a .**
140f0 20 73 69 6d 70 6c 65 20 6d 69 6e 28 29 20 6f 72   simple min() or
14100 20 6d 61 78 28 29 20 71 75 65 72 79 2c 20 74 68   max() query, th
14110 65 6e 20 72 65 74 75 72 6e 20 30 3b 0a 2a 2a 0a  en return 0;.**.
14120 2a 2a 20 41 20 73 69 6d 70 6c 79 20 6d 69 6e 28  ** A simply min(
14130 29 20 6f 72 20 6d 61 78 28 29 20 71 75 65 72 79  ) or max() query
14140 20 6c 6f 6f 6b 73 20 6c 69 6b 65 20 74 68 69 73   looks like this
14150 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 53 45 4c 45 43  :.**.**    SELEC
14160 54 20 6d 69 6e 28 61 29 20 46 52 4f 4d 20 74 61  T min(a) FROM ta
14170 62 6c 65 3b 0a 2a 2a 20 20 20 20 53 45 4c 45 43  ble;.**    SELEC
14180 54 20 6d 61 78 28 61 29 20 46 52 4f 4d 20 74 61  T max(a) FROM ta
14190 62 6c 65 3b 0a 2a 2a 0a 2a 2a 20 54 68 65 20 71  ble;.**.** The q
141a0 75 65 72 79 20 6d 61 79 20 68 61 76 65 20 6f 6e  uery may have on
141b0 6c 79 20 61 20 73 69 6e 67 6c 65 20 74 61 62 6c  ly a single tabl
141c0 65 20 69 6e 20 69 74 73 20 46 52 4f 4d 20 61 72  e in its FROM ar
141d0 67 75 6d 65 6e 74 2e 20 20 54 68 65 72 65 0a 2a  gument.  There.*
141e0 2a 20 63 61 6e 20 62 65 20 6e 6f 20 47 52 4f 55  * can be no GROU
141f0 50 20 42 59 20 6f 72 20 48 41 56 49 4e 47 20 6f  P BY or HAVING o
14200 72 20 57 48 45 52 45 20 63 6c 61 75 73 65 73 2e  r WHERE clauses.
14210 20 20 54 68 65 20 72 65 73 75 6c 74 20 73 65 74    The result set
14220 20 6d 75 73 74 0a 2a 2a 20 62 65 20 74 68 65 20   must.** be the 
14230 6d 69 6e 28 29 20 6f 72 20 6d 61 78 28 29 20 6f  min() or max() o
14240 66 20 61 20 73 69 6e 67 6c 65 20 63 6f 6c 75 6d  f a single colum
14250 6e 20 6f 66 20 74 68 65 20 74 61 62 6c 65 2e 20  n of the table. 
14260 20 54 68 65 20 63 6f 6c 75 6d 6e 0a 2a 2a 20 69   The column.** i
14270 6e 20 74 68 65 20 6d 69 6e 28 29 20 6f 72 20 6d  n the min() or m
14280 61 78 28 29 20 66 75 6e 63 74 69 6f 6e 20 6d 75  ax() function mu
14290 73 74 20 62 65 20 69 6e 64 65 78 65 64 2e 0a 2a  st be indexed..*
142a0 2a 0a 2a 2a 20 54 68 65 20 70 61 72 61 6d 65 74  *.** The paramet
142b0 65 72 73 20 74 6f 20 74 68 69 73 20 72 6f 75 74  ers to this rout
142c0 69 6e 65 20 61 72 65 20 74 68 65 20 73 61 6d 65  ine are the same
142d0 20 61 73 20 66 6f 72 20 73 71 6c 69 74 65 33 53   as for sqlite3S
142e0 65 6c 65 63 74 28 29 2e 0a 2a 2a 20 53 65 65 20  elect()..** See 
142f0 74 68 65 20 68 65 61 64 65 72 20 63 6f 6d 6d 65  the header comme
14300 6e 74 20 6f 6e 20 74 68 61 74 20 72 6f 75 74 69  nt on that routi
14310 6e 65 20 66 6f 72 20 61 64 64 69 74 69 6f 6e 61  ne for additiona
14320 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 0a 2a  l information..*
14330 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 69 6d  /.static int sim
14340 70 6c 65 4d 69 6e 4d 61 78 51 75 65 72 79 28 50  pleMinMaxQuery(P
14350 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 53 65  arse *pParse, Se
14360 6c 65 63 74 20 2a 70 2c 20 69 6e 74 20 65 44 65  lect *p, int eDe
14370 73 74 2c 20 69 6e 74 20 69 50 61 72 6d 29 7b 0a  st, int iParm){.
14380 20 20 45 78 70 72 20 2a 70 45 78 70 72 3b 0a 20    Expr *pExpr;. 
14390 20 69 6e 74 20 69 43 6f 6c 3b 0a 20 20 54 61 62   int iCol;.  Tab
143a0 6c 65 20 2a 70 54 61 62 3b 0a 20 20 49 6e 64 65  le *pTab;.  Inde
143b0 78 20 2a 70 49 64 78 3b 0a 20 20 69 6e 74 20 62  x *pIdx;.  int b
143c0 61 73 65 3b 0a 20 20 56 64 62 65 20 2a 76 3b 0a  ase;.  Vdbe *v;.
143d0 20 20 69 6e 74 20 73 65 65 6b 4f 70 3b 0a 20 20    int seekOp;.  
143e0 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74  ExprList *pEList
143f0 2c 20 2a 70 4c 69 73 74 2c 20 65 4c 69 73 74 3b  , *pList, eList;
14400 0a 20 20 73 74 72 75 63 74 20 45 78 70 72 4c 69  .  struct ExprLi
14410 73 74 5f 69 74 65 6d 20 65 4c 69 73 74 49 74 65  st_item eListIte
14420 6d 3b 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 53  m;.  SrcList *pS
14430 72 63 3b 0a 20 20 69 6e 74 20 62 72 6b 3b 0a 20  rc;.  int brk;. 
14440 20 69 6e 74 20 69 44 62 3b 0a 0a 20 20 2f 2a 20   int iDb;..  /* 
14450 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20  Check to see if 
14460 74 68 69 73 20 71 75 65 72 79 20 69 73 20 61 20  this query is a 
14470 73 69 6d 70 6c 65 20 6d 69 6e 28 29 20 6f 72 20  simple min() or 
14480 6d 61 78 28 29 20 71 75 65 72 79 2e 20 20 52 65  max() query.  Re
14490 74 75 72 6e 0a 20 20 2a 2a 20 7a 65 72 6f 20 69  turn.  ** zero i
144a0 66 20 69 74 20 69 73 20 20 6e 6f 74 2e 0a 20 20  f it is  not..  
144b0 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 70 47 72 6f  */.  if( p->pGro
144c0 75 70 42 79 20 7c 7c 20 70 2d 3e 70 48 61 76 69  upBy || p->pHavi
144d0 6e 67 20 7c 7c 20 70 2d 3e 70 57 68 65 72 65 20  ng || p->pWhere 
144e0 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 70 53  ) return 0;.  pS
144f0 72 63 20 3d 20 70 2d 3e 70 53 72 63 3b 0a 20 20  rc = p->pSrc;.  
14500 69 66 28 20 70 53 72 63 2d 3e 6e 53 72 63 21 3d  if( pSrc->nSrc!=
14510 31 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  1 ) return 0;.  
14520 70 45 4c 69 73 74 20 3d 20 70 2d 3e 70 45 4c 69  pEList = p->pELi
14530 73 74 3b 0a 20 20 69 66 28 20 70 45 4c 69 73 74  st;.  if( pEList
14540 2d 3e 6e 45 78 70 72 21 3d 31 20 29 20 72 65 74  ->nExpr!=1 ) ret
14550 75 72 6e 20 30 3b 0a 20 20 70 45 78 70 72 20 3d  urn 0;.  pExpr =
14560 20 70 45 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45   pEList->a[0].pE
14570 78 70 72 3b 0a 20 20 69 66 28 20 70 45 78 70 72  xpr;.  if( pExpr
14580 2d 3e 6f 70 21 3d 54 4b 5f 41 47 47 5f 46 55 4e  ->op!=TK_AGG_FUN
14590 43 54 49 4f 4e 20 29 20 72 65 74 75 72 6e 20 30  CTION ) return 0
145a0 3b 0a 20 20 70 4c 69 73 74 20 3d 20 70 45 78 70  ;.  pList = pExp
145b0 72 2d 3e 70 4c 69 73 74 3b 0a 20 20 69 66 28 20  r->pList;.  if( 
145c0 70 4c 69 73 74 3d 3d 30 20 7c 7c 20 70 4c 69 73  pList==0 || pLis
145d0 74 2d 3e 6e 45 78 70 72 21 3d 31 20 29 20 72 65  t->nExpr!=1 ) re
145e0 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 70 45  turn 0;.  if( pE
145f0 78 70 72 2d 3e 74 6f 6b 65 6e 2e 6e 21 3d 33 20  xpr->token.n!=3 
14600 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66  ) return 0;.  if
14610 28 20 73 71 6c 69 74 65 33 53 74 72 4e 49 43 6d  ( sqlite3StrNICm
14620 70 28 28 63 68 61 72 2a 29 70 45 78 70 72 2d 3e  p((char*)pExpr->
14630 74 6f 6b 65 6e 2e 7a 2c 22 6d 69 6e 22 2c 33 29  token.z,"min",3)
14640 3d 3d 30 20 29 7b 0a 20 20 20 20 73 65 65 6b 4f  ==0 ){.    seekO
14650 70 20 3d 20 4f 50 5f 52 65 77 69 6e 64 3b 0a 20  p = OP_Rewind;. 
14660 20 7d 65 6c 73 65 20 69 66 28 20 73 71 6c 69 74   }else if( sqlit
14670 65 33 53 74 72 4e 49 43 6d 70 28 28 63 68 61 72  e3StrNICmp((char
14680 2a 29 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 7a  *)pExpr->token.z
14690 2c 22 6d 61 78 22 2c 33 29 3d 3d 30 20 29 7b 0a  ,"max",3)==0 ){.
146a0 20 20 20 20 73 65 65 6b 4f 70 20 3d 20 4f 50 5f      seekOp = OP_
146b0 4c 61 73 74 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  Last;.  }else{. 
146c0 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d     return 0;.  }
146d0 0a 20 20 70 45 78 70 72 20 3d 20 70 4c 69 73 74  .  pExpr = pList
146e0 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 3b 0a 20 20  ->a[0].pExpr;.  
146f0 69 66 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54  if( pExpr->op!=T
14700 4b 5f 43 4f 4c 55 4d 4e 20 29 20 72 65 74 75 72  K_COLUMN ) retur
14710 6e 20 30 3b 0a 20 20 69 43 6f 6c 20 3d 20 70 45  n 0;.  iCol = pE
14720 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20  xpr->iColumn;.  
14730 70 54 61 62 20 3d 20 70 53 72 63 2d 3e 61 5b 30  pTab = pSrc->a[0
14740 5d 2e 70 54 61 62 3b 0a 0a 20 20 2f 2a 20 54 68  ].pTab;..  /* Th
14750 69 73 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20  is optimization 
14760 63 61 6e 6e 6f 74 20 62 65 20 75 73 65 64 20 77  cannot be used w
14770 69 74 68 20 76 69 72 74 75 61 6c 20 74 61 62 6c  ith virtual tabl
14780 65 73 2e 20 2a 2f 0a 20 20 69 66 28 20 49 73 56  es. */.  if( IsV
14790 69 72 74 75 61 6c 28 70 54 61 62 29 20 29 20 72  irtual(pTab) ) r
147a0 65 74 75 72 6e 20 30 3b 0a 0a 20 20 2f 2a 20 49  eturn 0;..  /* I
147b0 66 20 77 65 20 67 65 74 20 74 6f 20 68 65 72 65  f we get to here
147c0 2c 20 69 74 20 6d 65 61 6e 73 20 74 68 65 20 71  , it means the q
147d0 75 65 72 79 20 69 73 20 6f 66 20 74 68 65 20 63  uery is of the c
147e0 6f 72 72 65 63 74 20 66 6f 72 6d 2e 0a 20 20 2a  orrect form..  *
147f0 2a 20 43 68 65 63 6b 20 74 6f 20 6d 61 6b 65 20  * Check to make 
14800 73 75 72 65 20 77 65 20 68 61 76 65 20 61 6e 20  sure we have an 
14810 69 6e 64 65 78 20 61 6e 64 20 6d 61 6b 65 20 70  index and make p
14820 49 64 78 20 70 6f 69 6e 74 20 74 6f 20 74 68 65  Idx point to the
14830 0a 20 20 2a 2a 20 61 70 70 72 6f 70 72 69 61 74  .  ** appropriat
14840 65 20 69 6e 64 65 78 2e 20 20 49 66 20 74 68 65  e index.  If the
14850 20 6d 69 6e 28 29 20 6f 72 20 6d 61 78 28 29 20   min() or max() 
14860 69 73 20 6f 6e 20 61 6e 20 49 4e 54 45 47 45 52  is on an INTEGER
14870 20 50 52 49 4d 41 52 59 0a 20 20 2a 2a 20 6b 65   PRIMARY.  ** ke
14880 79 20 63 6f 6c 75 6d 6e 2c 20 6e 6f 20 69 6e 64  y column, no ind
14890 65 78 20 69 73 20 6e 65 63 65 73 73 61 72 79 20  ex is necessary 
148a0 73 6f 20 73 65 74 20 70 49 64 78 20 74 6f 20 4e  so set pIdx to N
148b0 55 4c 4c 2e 20 20 49 66 20 6e 6f 0a 20 20 2a 2a  ULL.  If no.  **
148c0 20 75 73 61 62 6c 65 20 69 6e 64 65 78 20 69 73   usable index is
148d0 20 66 6f 75 6e 64 2c 20 72 65 74 75 72 6e 20 30   found, return 0
148e0 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 69 43 6f  ..  */.  if( iCo
148f0 6c 3c 30 20 29 7b 0a 20 20 20 20 70 49 64 78 20  l<0 ){.    pIdx 
14900 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  = 0;.  }else{.  
14910 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c    CollSeq *pColl
14920 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f   = sqlite3ExprCo
14930 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70 45  llSeq(pParse, pE
14940 78 70 72 29 3b 0a 20 20 20 20 69 66 28 20 70 43  xpr);.    if( pC
14950 6f 6c 6c 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  oll==0 ) return 
14960 30 3b 0a 20 20 20 20 66 6f 72 28 70 49 64 78 3d  0;.    for(pIdx=
14970 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b 20 70 49  pTab->pIndex; pI
14980 64 78 3b 20 70 49 64 78 3d 70 49 64 78 2d 3e 70  dx; pIdx=pIdx->p
14990 4e 65 78 74 29 7b 0a 20 20 20 20 20 20 61 73 73  Next){.      ass
149a0 65 72 74 28 20 70 49 64 78 2d 3e 6e 43 6f 6c 75  ert( pIdx->nColu
149b0 6d 6e 3e 3d 31 20 29 3b 0a 20 20 20 20 20 20 69  mn>=1 );.      i
149c0 66 28 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d  f( pIdx->aiColum
149d0 6e 5b 30 5d 3d 3d 69 43 6f 6c 20 26 26 20 0a 20  n[0]==iCol && . 
149e0 20 20 20 20 20 20 20 20 20 30 3d 3d 73 71 6c 69           0==sqli
149f0 74 65 33 53 74 72 49 43 6d 70 28 70 49 64 78 2d  te3StrICmp(pIdx-
14a00 3e 61 7a 43 6f 6c 6c 5b 30 5d 2c 20 70 43 6f 6c  >azColl[0], pCol
14a10 6c 2d 3e 7a 4e 61 6d 65 29 20 29 7b 0a 20 20 20  l->zName) ){.   
14a20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
14a30 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66    }.    }.    if
14a40 28 20 70 49 64 78 3d 3d 30 20 29 20 72 65 74 75  ( pIdx==0 ) retu
14a50 72 6e 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  rn 0;.  }..  /* 
14a60 49 64 65 6e 74 69 66 79 20 63 6f 6c 75 6d 6e 20  Identify column 
14a70 74 79 70 65 73 20 69 66 20 77 65 20 77 69 6c 6c  types if we will
14a80 20 62 65 20 75 73 69 6e 67 20 74 68 65 20 63 61   be using the ca
14a90 6c 6c 62 61 63 6b 2e 20 20 54 68 69 73 0a 20 20  llback.  This.  
14aa0 2a 2a 20 73 74 65 70 20 69 73 20 73 6b 69 70 70  ** step is skipp
14ab0 65 64 20 69 66 20 74 68 65 20 6f 75 74 70 75 74  ed if the output
14ac0 20 69 73 20 67 6f 69 6e 67 20 74 6f 20 61 20 74   is going to a t
14ad0 61 62 6c 65 20 6f 72 20 61 20 6d 65 6d 6f 72 79  able or a memory
14ae0 20 63 65 6c 6c 2e 0a 20 20 2a 2a 20 54 68 65 20   cell..  ** The 
14af0 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 68 61 76  column names hav
14b00 65 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 67  e already been g
14b10 65 6e 65 72 61 74 65 64 20 69 6e 20 74 68 65 20  enerated in the 
14b20 63 61 6c 6c 69 6e 67 20 66 75 6e 63 74 69 6f 6e  calling function
14b30 2e 0a 20 20 2a 2f 0a 20 20 76 20 3d 20 73 71 6c  ..  */.  v = sql
14b40 69 74 65 33 47 65 74 56 64 62 65 28 70 50 61 72  ite3GetVdbe(pPar
14b50 73 65 29 3b 0a 20 20 69 66 28 20 76 3d 3d 30 20  se);.  if( v==0 
14b60 29 20 72 65 74 75 72 6e 20 30 3b 0a 0a 20 20 2f  ) return 0;..  /
14b70 2a 20 49 66 20 74 68 65 20 6f 75 74 70 75 74 20  * If the output 
14b80 69 73 20 64 65 73 74 69 6e 65 64 20 66 6f 72 20  is destined for 
14b90 61 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c  a temporary tabl
14ba0 65 2c 20 6f 70 65 6e 20 74 68 61 74 20 74 61 62  e, open that tab
14bb0 6c 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 65  le..  */.  if( e
14bc0 44 65 73 74 3d 3d 53 52 54 5f 45 70 68 65 6d 54  Dest==SRT_EphemT
14bd0 61 62 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  ab ){.    sqlite
14be0 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
14bf0 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 2c 20  _OpenEphemeral, 
14c00 69 50 61 72 6d 2c 20 31 29 3b 0a 20 20 7d 0a 0a  iParm, 1);.  }..
14c10 20 20 2f 2a 20 47 65 6e 65 72 61 74 69 6e 67 20    /* Generating 
14c20 63 6f 64 65 20 74 6f 20 66 69 6e 64 20 74 68 65  code to find the
14c30 20 6d 69 6e 20 6f 72 20 74 68 65 20 6d 61 78 2e   min or the max.
14c40 20 20 42 61 73 69 63 61 6c 6c 79 20 61 6c 6c 20    Basically all 
14c50 77 65 20 68 61 76 65 0a 20 20 2a 2a 20 74 6f 20  we have.  ** to 
14c60 64 6f 20 69 73 20 66 69 6e 64 20 74 68 65 20 66  do is find the f
14c70 69 72 73 74 20 6f 72 20 74 68 65 20 6c 61 73 74  irst or the last
14c80 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20 63 68   entry in the ch
14c90 6f 73 65 6e 20 69 6e 64 65 78 2e 20 20 49 66 0a  osen index.  If.
14ca0 20 20 2a 2a 20 74 68 65 20 6d 69 6e 28 29 20 6f    ** the min() o
14cb0 72 20 6d 61 78 28 29 20 69 73 20 6f 6e 20 74 68  r max() is on th
14cc0 65 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52  e INTEGER PRIMAR
14cd0 59 20 4b 45 59 2c 20 74 68 65 6e 20 66 69 6e 64  Y KEY, then find
14ce0 20 74 68 65 20 66 69 72 73 74 0a 20 20 2a 2a 20   the first.  ** 
14cf0 6f 72 20 6c 61 73 74 20 65 6e 74 72 79 20 69 6e  or last entry in
14d00 20 74 68 65 20 6d 61 69 6e 20 74 61 62 6c 65 2e   the main table.
14d10 0a 20 20 2a 2f 0a 20 20 69 44 62 20 3d 20 73 71  .  */.  iDb = sq
14d20 6c 69 74 65 33 53 63 68 65 6d 61 54 6f 49 6e 64  lite3SchemaToInd
14d30 65 78 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70  ex(pParse->db, p
14d40 54 61 62 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20  Tab->pSchema);. 
14d50 20 61 73 73 65 72 74 28 20 69 44 62 3e 3d 30 20   assert( iDb>=0 
14d60 7c 7c 20 70 54 61 62 2d 3e 69 73 45 70 68 65 6d  || pTab->isEphem
14d70 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 43 6f 64   );.  sqlite3Cod
14d80 65 56 65 72 69 66 79 53 63 68 65 6d 61 28 70 50  eVerifySchema(pP
14d90 61 72 73 65 2c 20 69 44 62 29 3b 0a 20 20 73 71  arse, iDb);.  sq
14da0 6c 69 74 65 33 54 61 62 6c 65 4c 6f 63 6b 28 70  lite3TableLock(p
14db0 50 61 72 73 65 2c 20 69 44 62 2c 20 70 54 61 62  Parse, iDb, pTab
14dc0 2d 3e 74 6e 75 6d 2c 20 30 2c 20 70 54 61 62 2d  ->tnum, 0, pTab-
14dd0 3e 7a 4e 61 6d 65 29 3b 0a 20 20 62 61 73 65 20  >zName);.  base 
14de0 3d 20 70 53 72 63 2d 3e 61 5b 30 5d 2e 69 43 75  = pSrc->a[0].iCu
14df0 72 73 6f 72 3b 0a 20 20 62 72 6b 20 3d 20 73 71  rsor;.  brk = sq
14e00 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62  lite3VdbeMakeLab
14e10 65 6c 28 76 29 3b 0a 20 20 63 6f 6d 70 75 74 65  el(v);.  compute
14e20 4c 69 6d 69 74 52 65 67 69 73 74 65 72 73 28 70  LimitRegisters(p
14e30 50 61 72 73 65 2c 20 70 2c 20 62 72 6b 29 3b 0a  Parse, p, brk);.
14e40 20 20 69 66 28 20 70 53 72 63 2d 3e 61 5b 30 5d    if( pSrc->a[0]
14e50 2e 70 53 65 6c 65 63 74 3d 3d 30 20 29 7b 0a 20  .pSelect==0 ){. 
14e60 20 20 20 73 71 6c 69 74 65 33 4f 70 65 6e 54 61     sqlite3OpenTa
14e70 62 6c 65 28 70 50 61 72 73 65 2c 20 62 61 73 65  ble(pParse, base
14e80 2c 20 69 44 62 2c 20 70 54 61 62 2c 20 4f 50 5f  , iDb, pTab, OP_
14e90 4f 70 65 6e 52 65 61 64 29 3b 0a 20 20 7d 0a 20  OpenRead);.  }. 
14ea0 20 69 66 28 20 70 49 64 78 3d 3d 30 20 29 7b 0a   if( pIdx==0 ){.
14eb0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
14ec0 64 64 4f 70 28 76 2c 20 73 65 65 6b 4f 70 2c 20  ddOp(v, seekOp, 
14ed0 62 61 73 65 2c 20 30 29 3b 0a 20 20 7d 65 6c 73  base, 0);.  }els
14ee0 65 7b 0a 20 20 20 20 2f 2a 20 45 76 65 6e 20 74  e{.    /* Even t
14ef0 68 6f 75 67 68 20 74 68 65 20 63 75 72 73 6f 72  hough the cursor
14f00 20 75 73 65 64 20 74 6f 20 6f 70 65 6e 20 74 68   used to open th
14f10 65 20 69 6e 64 65 78 20 68 65 72 65 20 69 73 20  e index here is 
14f20 63 6c 6f 73 65 64 0a 20 20 20 20 2a 2a 20 61 73  closed.    ** as
14f30 20 73 6f 6f 6e 20 61 73 20 61 20 73 69 6e 67 6c   soon as a singl
14f40 65 20 76 61 6c 75 65 20 68 61 73 20 62 65 65 6e  e value has been
14f50 20 72 65 61 64 20 66 72 6f 6d 20 69 74 2c 20 61   read from it, a
14f60 6c 6c 6f 63 61 74 65 20 69 74 0a 20 20 20 20 2a  llocate it.    *
14f70 2a 20 75 73 69 6e 67 20 28 70 50 61 72 73 65 2d  * using (pParse-
14f80 3e 6e 54 61 62 2b 2b 29 20 74 6f 20 70 72 65 76  >nTab++) to prev
14f90 65 6e 74 20 74 68 65 20 63 75 72 73 6f 72 20 69  ent the cursor i
14fa0 64 20 66 72 6f 6d 20 62 65 69 6e 67 20 0a 20 20  d from being .  
14fb0 20 20 2a 2a 20 72 65 75 73 65 64 2e 20 54 68 69    ** reused. Thi
14fc0 73 20 69 73 20 69 6d 70 6f 72 74 61 6e 74 20 66  s is important f
14fd0 6f 72 20 73 74 61 74 65 6d 65 6e 74 73 20 6f 66  or statements of
14fe0 20 74 68 65 20 66 6f 72 6d 20 0a 20 20 20 20 2a   the form .    *
14ff0 2a 20 22 49 4e 53 45 52 54 20 49 4e 54 4f 20 78  * "INSERT INTO x
15000 20 53 45 4c 45 43 54 20 6d 61 78 28 29 20 46 52   SELECT max() FR
15010 4f 4d 20 78 22 2e 0a 20 20 20 20 2a 2f 0a 20 20  OM x"..    */.  
15020 20 20 69 6e 74 20 69 49 64 78 3b 0a 20 20 20 20    int iIdx;.    
15030 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 20 3d 20  KeyInfo *pKey = 
15040 73 71 6c 69 74 65 33 49 6e 64 65 78 4b 65 79 69  sqlite3IndexKeyi
15050 6e 66 6f 28 70 50 61 72 73 65 2c 20 70 49 64 78  nfo(pParse, pIdx
15060 29 3b 0a 20 20 20 20 69 49 64 78 20 3d 20 70 50  );.    iIdx = pP
15070 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20  arse->nTab++;.  
15080 20 20 61 73 73 65 72 74 28 20 70 49 64 78 2d 3e    assert( pIdx->
15090 70 53 63 68 65 6d 61 3d 3d 70 54 61 62 2d 3e 70  pSchema==pTab->p
150a0 53 63 68 65 6d 61 20 29 3b 0a 20 20 20 20 73 71  Schema );.    sq
150b0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
150c0 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 69 44  , OP_Integer, iD
150d0 62 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74  b, 0);.    sqlit
150e0 65 33 56 64 62 65 4f 70 33 28 76 2c 20 4f 50 5f  e3VdbeOp3(v, OP_
150f0 4f 70 65 6e 52 65 61 64 2c 20 69 49 64 78 2c 20  OpenRead, iIdx, 
15100 70 49 64 78 2d 3e 74 6e 75 6d 2c 20 0a 20 20 20  pIdx->tnum, .   
15110 20 20 20 20 20 28 63 68 61 72 2a 29 70 4b 65 79       (char*)pKey
15120 2c 20 50 33 5f 4b 45 59 49 4e 46 4f 5f 48 41 4e  , P3_KEYINFO_HAN
15130 44 4f 46 46 29 3b 0a 20 20 20 20 69 66 28 20 73  DOFF);.    if( s
15140 65 65 6b 4f 70 3d 3d 4f 50 5f 52 65 77 69 6e 64  eekOp==OP_Rewind
15150 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
15160 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
15170 5f 4e 75 6c 6c 2c 20 30 2c 20 30 29 3b 0a 20 20  _Null, 0, 0);.  
15180 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
15190 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 61 6b 65 52  ddOp(v, OP_MakeR
151a0 65 63 6f 72 64 2c 20 31 2c 20 30 29 3b 0a 20 20  ecord, 1, 0);.  
151b0 20 20 20 20 73 65 65 6b 4f 70 20 3d 20 4f 50 5f      seekOp = OP_
151c0 4d 6f 76 65 47 74 3b 0a 20 20 20 20 7d 0a 20 20  MoveGt;.    }.  
151d0 20 20 69 66 28 20 70 49 64 78 2d 3e 61 53 6f 72    if( pIdx->aSor
151e0 74 4f 72 64 65 72 5b 30 5d 3d 3d 53 51 4c 49 54  tOrder[0]==SQLIT
151f0 45 5f 53 4f 5f 44 45 53 43 20 29 7b 0a 20 20 20  E_SO_DESC ){.   
15200 20 20 20 2f 2a 20 54 69 63 6b 65 74 20 23 32 35     /* Ticket #25
15210 31 34 3a 20 69 6e 76 65 72 74 20 74 68 65 20 73  14: invert the s
15220 65 65 6b 20 6f 70 65 72 61 74 6f 72 20 69 66 20  eek operator if 
15230 77 65 20 61 72 65 20 75 73 69 6e 67 0a 20 20 20  we are using.   
15240 20 20 20 2a 2a 20 61 20 64 65 73 63 65 6e 64 69     ** a descendi
15250 6e 67 20 69 6e 64 65 78 2e 20 2a 2f 0a 20 20 20  ng index. */.   
15260 20 20 20 69 66 28 20 73 65 65 6b 4f 70 3d 3d 4f     if( seekOp==O
15270 50 5f 4c 61 73 74 20 29 7b 0a 20 20 20 20 20 20  P_Last ){.      
15280 20 20 73 65 65 6b 4f 70 20 3d 20 4f 50 5f 52 65    seekOp = OP_Re
15290 77 69 6e 64 3b 0a 20 20 20 20 20 20 7d 65 6c 73  wind;.      }els
152a0 65 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  e{.        asser
152b0 74 28 20 73 65 65 6b 4f 70 3d 3d 4f 50 5f 4d 6f  t( seekOp==OP_Mo
152c0 76 65 47 74 20 29 3b 0a 20 20 20 20 20 20 20 20  veGt );.        
152d0 73 65 65 6b 4f 70 20 3d 20 4f 50 5f 4d 6f 76 65  seekOp = OP_Move
152e0 4c 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  Lt;.      }.    
152f0 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  }.    sqlite3Vdb
15300 65 41 64 64 4f 70 28 76 2c 20 73 65 65 6b 4f 70  eAddOp(v, seekOp
15310 2c 20 69 49 64 78 2c 20 30 29 3b 0a 20 20 20 20  , iIdx, 0);.    
15320 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
15330 28 76 2c 20 4f 50 5f 49 64 78 52 6f 77 69 64 2c  (v, OP_IdxRowid,
15340 20 69 49 64 78 2c 20 30 29 3b 0a 20 20 20 20 73   iIdx, 0);.    s
15350 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
15360 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 69 49 64  v, OP_Close, iId
15370 78 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74  x, 0);.    sqlit
15380 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
15390 50 5f 4d 6f 76 65 47 65 2c 20 62 61 73 65 2c 20  P_MoveGe, base, 
153a0 30 29 3b 0a 20 20 7d 0a 20 20 65 4c 69 73 74 2e  0);.  }.  eList.
153b0 6e 45 78 70 72 20 3d 20 31 3b 0a 20 20 6d 65 6d  nExpr = 1;.  mem
153c0 73 65 74 28 26 65 4c 69 73 74 49 74 65 6d 2c 20  set(&eListItem, 
153d0 30 2c 20 73 69 7a 65 6f 66 28 65 4c 69 73 74 49  0, sizeof(eListI
153e0 74 65 6d 29 29 3b 0a 20 20 65 4c 69 73 74 2e 61  tem));.  eList.a
153f0 20 3d 20 26 65 4c 69 73 74 49 74 65 6d 3b 0a 20   = &eListItem;. 
15400 20 65 4c 69 73 74 2e 61 5b 30 5d 2e 70 45 78 70   eList.a[0].pExp
15410 72 20 3d 20 70 45 78 70 72 3b 0a 20 20 73 65 6c  r = pExpr;.  sel
15420 65 63 74 49 6e 6e 65 72 4c 6f 6f 70 28 70 50 61  ectInnerLoop(pPa
15430 72 73 65 2c 20 70 2c 20 26 65 4c 69 73 74 2c 20  rse, p, &eList, 
15440 30 2c 20 30 2c 20 30 2c 20 2d 31 2c 20 65 44 65  0, 0, 0, -1, eDe
15450 73 74 2c 20 69 50 61 72 6d 2c 20 62 72 6b 2c 20  st, iParm, brk, 
15460 62 72 6b 2c 20 30 29 3b 0a 20 20 73 71 6c 69 74  brk, 0);.  sqlit
15470 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62  e3VdbeResolveLab
15480 65 6c 28 76 2c 20 62 72 6b 29 3b 0a 20 20 73 71  el(v, brk);.  sq
15490 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
154a0 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 62 61 73 65  , OP_Close, base
154b0 2c 20 30 29 3b 0a 20 20 0a 20 20 72 65 74 75 72  , 0);.  .  retur
154c0 6e 20 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6e  n 1;.}../*.** An
154d0 61 6c 79 7a 65 20 61 6e 64 20 4f 52 44 45 52 20  alyze and ORDER 
154e0 42 59 20 6f 72 20 47 52 4f 55 50 20 42 59 20 63  BY or GROUP BY c
154f0 6c 61 75 73 65 20 69 6e 20 61 20 53 45 4c 45 43  lause in a SELEC
15500 54 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 52 65  T statement.  Re
15510 74 75 72 6e 0a 2a 2a 20 74 68 65 20 6e 75 6d 62  turn.** the numb
15520 65 72 20 6f 66 20 65 72 72 6f 72 73 20 73 65 65  er of errors see
15530 6e 2e 0a 2a 2a 0a 2a 2a 20 41 6e 20 4f 52 44 45  n..**.** An ORDE
15540 52 20 42 59 20 6f 72 20 47 52 4f 55 50 20 42 59  R BY or GROUP BY
15550 20 69 73 20 61 20 6c 69 73 74 20 6f 66 20 65 78   is a list of ex
15560 70 72 65 73 73 69 6f 6e 73 2e 20 20 49 66 20 61  pressions.  If a
15570 6e 79 20 65 78 70 72 65 73 73 69 6f 6e 0a 2a 2a  ny expression.**
15580 20 69 73 20 61 6e 20 69 6e 74 65 67 65 72 20 63   is an integer c
15590 6f 6e 73 74 61 6e 74 2c 20 74 68 65 6e 20 74 68  onstant, then th
155a0 61 74 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73  at expression is
155b0 20 72 65 70 6c 61 63 65 64 20 62 79 20 74 68 65   replaced by the
155c0 0a 2a 2a 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e  .** correspondin
155d0 67 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20 72  g entry in the r
155e0 65 73 75 6c 74 20 73 65 74 2e 0a 2a 2f 0a 73 74  esult set..*/.st
155f0 61 74 69 63 20 69 6e 74 20 70 72 6f 63 65 73 73  atic int process
15600 4f 72 64 65 72 47 72 6f 75 70 42 79 28 0a 20 20  OrderGroupBy(.  
15610 4e 61 6d 65 43 6f 6e 74 65 78 74 20 2a 70 4e 43  NameContext *pNC
15620 2c 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 63 6f  ,     /* Name co
15630 6e 74 65 78 74 20 6f 66 20 74 68 65 20 53 45 4c  ntext of the SEL
15640 45 43 54 20 73 74 61 74 65 6d 65 6e 74 2e 20 2a  ECT statement. *
15650 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4f  /.  ExprList *pO
15660 72 64 65 72 42 79 2c 20 20 20 2f 2a 20 54 68 65  rderBy,   /* The
15670 20 4f 52 44 45 52 20 42 59 20 6f 72 20 47 52 4f   ORDER BY or GRO
15680 55 50 20 42 59 20 63 6c 61 75 73 65 20 74 6f 20  UP BY clause to 
15690 62 65 20 70 72 6f 63 65 73 73 65 64 20 2a 2f 0a  be processed */.
156a0 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54    const char *zT
156b0 79 70 65 20 20 20 20 20 2f 2a 20 45 69 74 68 65  ype     /* Eithe
156c0 72 20 22 4f 52 44 45 52 22 20 6f 72 20 22 47 52  r "ORDER" or "GR
156d0 4f 55 50 22 2c 20 61 73 20 61 70 70 72 6f 70 72  OUP", as appropr
156e0 69 61 74 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  iate */.){.  int
156f0 20 69 3b 0a 20 20 45 78 70 72 4c 69 73 74 20 2a   i;.  ExprList *
15700 70 45 4c 69 73 74 20 3d 20 70 4e 43 2d 3e 70 45  pEList = pNC->pE
15710 4c 69 73 74 3b 20 20 20 20 20 2f 2a 20 54 68 65  List;     /* The
15720 20 72 65 73 75 6c 74 20 73 65 74 20 6f 66 20 74   result set of t
15730 68 65 20 53 45 4c 45 43 54 20 2a 2f 0a 20 20 50  he SELECT */.  P
15740 61 72 73 65 20 2a 70 50 61 72 73 65 20 3d 20 70  arse *pParse = p
15750 4e 43 2d 3e 70 50 61 72 73 65 3b 20 20 20 20 20  NC->pParse;     
15760 2f 2a 20 54 68 65 20 72 65 73 75 6c 74 20 73 65  /* The result se
15770 74 20 6f 66 20 74 68 65 20 53 45 4c 45 43 54 20  t of the SELECT 
15780 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 45 4c  */.  assert( pEL
15790 69 73 74 20 29 3b 0a 0a 20 20 69 66 28 20 70 4f  ist );..  if( pO
157a0 72 64 65 72 42 79 3d 3d 30 20 29 20 72 65 74 75  rderBy==0 ) retu
157b0 72 6e 20 30 3b 0a 20 20 69 66 28 20 70 4f 72 64  rn 0;.  if( pOrd
157c0 65 72 42 79 2d 3e 6e 45 78 70 72 3e 53 51 4c 49  erBy->nExpr>SQLI
157d0 54 45 5f 4d 41 58 5f 43 4f 4c 55 4d 4e 20 29 7b  TE_MAX_COLUMN ){
157e0 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f  .    sqlite3Erro
157f0 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 74 6f  rMsg(pParse, "to
15800 6f 20 6d 61 6e 79 20 74 65 72 6d 73 20 69 6e 20  o many terms in 
15810 25 73 20 42 59 20 63 6c 61 75 73 65 22 2c 20 7a  %s BY clause", z
15820 54 79 70 65 29 3b 0a 20 20 20 20 72 65 74 75 72  Type);.    retur
15830 6e 20 31 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 69  n 1;.  }.  for(i
15840 3d 30 3b 20 69 3c 70 4f 72 64 65 72 42 79 2d 3e  =0; i<pOrderBy->
15850 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20  nExpr; i++){.   
15860 20 69 6e 74 20 69 43 6f 6c 3b 0a 20 20 20 20 45   int iCol;.    E
15870 78 70 72 20 2a 70 45 20 3d 20 70 4f 72 64 65 72  xpr *pE = pOrder
15880 42 79 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 3b 0a  By->a[i].pExpr;.
15890 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 45      if( sqlite3E
158a0 78 70 72 49 73 49 6e 74 65 67 65 72 28 70 45 2c  xprIsInteger(pE,
158b0 20 26 69 43 6f 6c 29 20 29 7b 0a 20 20 20 20 20   &iCol) ){.     
158c0 20 69 66 28 20 69 43 6f 6c 3e 30 20 26 26 20 69   if( iCol>0 && i
158d0 43 6f 6c 3c 3d 70 45 4c 69 73 74 2d 3e 6e 45 78  Col<=pEList->nEx
158e0 70 72 20 29 7b 0a 20 20 20 20 20 20 20 20 43 6f  pr ){.        Co
158f0 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 20 3d 20 70  llSeq *pColl = p
15900 45 2d 3e 70 43 6f 6c 6c 3b 0a 20 20 20 20 20 20  E->pColl;.      
15910 20 20 69 6e 74 20 66 6c 61 67 73 20 3d 20 70 45    int flags = pE
15920 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f 45 78 70  ->flags & EP_Exp
15930 43 6f 6c 6c 61 74 65 3b 0a 20 20 20 20 20 20 20  Collate;.       
15940 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65   sqlite3ExprDele
15950 74 65 28 70 45 29 3b 0a 20 20 20 20 20 20 20 20  te(pE);.        
15960 70 45 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  pE = sqlite3Expr
15970 44 75 70 28 70 50 61 72 73 65 2d 3e 64 62 2c 20  Dup(pParse->db, 
15980 70 45 4c 69 73 74 2d 3e 61 5b 69 43 6f 6c 2d 31  pEList->a[iCol-1
15990 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20  ].pExpr);.      
159a0 20 20 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d    pOrderBy->a[i]
159b0 2e 70 45 78 70 72 20 3d 20 70 45 3b 0a 20 20 20  .pExpr = pE;.   
159c0 20 20 20 20 20 69 66 28 20 70 43 6f 6c 6c 20 26       if( pColl &
159d0 26 20 66 6c 61 67 73 20 29 7b 0a 20 20 20 20 20  & flags ){.     
159e0 20 20 20 20 20 70 45 2d 3e 70 43 6f 6c 6c 20 3d       pE->pColl =
159f0 20 70 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 20 20   pColl;.        
15a00 20 20 70 45 2d 3e 66 6c 61 67 73 20 7c 3d 20 66    pE->flags |= f
15a10 6c 61 67 73 3b 0a 20 20 20 20 20 20 20 20 7d 0a  lags;.        }.
15a20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
15a30 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f       sqlite3Erro
15a40 72 4d 73 67 28 70 50 61 72 73 65 2c 20 0a 20 20  rMsg(pParse, .  
15a50 20 20 20 20 20 20 20 20 20 22 25 73 20 42 59 20           "%s BY 
15a60 63 6f 6c 75 6d 6e 20 6e 75 6d 62 65 72 20 25 64  column number %d
15a70 20 6f 75 74 20 6f 66 20 72 61 6e 67 65 20 2d 20   out of range - 
15a80 73 68 6f 75 6c 64 20 62 65 20 22 0a 20 20 20 20  should be ".    
15a90 20 20 20 20 20 20 20 22 62 65 74 77 65 65 6e 20         "between 
15aa0 31 20 61 6e 64 20 25 64 22 2c 20 7a 54 79 70 65  1 and %d", zType
15ab0 2c 20 69 43 6f 6c 2c 20 70 45 4c 69 73 74 2d 3e  , iCol, pEList->
15ac0 6e 45 78 70 72 29 3b 0a 20 20 20 20 20 20 20 20  nExpr);.        
15ad0 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 20 20  return 1;.      
15ae0 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  }.    }.    if( 
15af0 73 71 6c 69 74 65 33 45 78 70 72 52 65 73 6f 6c  sqlite3ExprResol
15b00 76 65 4e 61 6d 65 73 28 70 4e 43 2c 20 70 45 29  veNames(pNC, pE)
15b10 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
15b20 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20   1;.    }.  }.  
15b30 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a  return 0;.}../*.
15b40 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
15b50 72 65 73 6f 6c 76 65 73 20 61 6e 79 20 6e 61 6d  resolves any nam
15b60 65 73 20 75 73 65 64 20 69 6e 20 74 68 65 20 72  es used in the r
15b70 65 73 75 6c 74 20 73 65 74 20 6f 66 20 74 68 65  esult set of the
15b80 0a 2a 2a 20 73 75 70 70 6c 69 65 64 20 53 45 4c  .** supplied SEL
15b90 45 43 54 20 73 74 61 74 65 6d 65 6e 74 2e 20 49  ECT statement. I
15ba0 66 20 74 68 65 20 53 45 4c 45 43 54 20 73 74 61  f the SELECT sta
15bb0 74 65 6d 65 6e 74 20 62 65 69 6e 67 20 72 65 73  tement being res
15bc0 6f 6c 76 65 64 0a 2a 2a 20 69 73 20 61 20 73 75  olved.** is a su
15bd0 62 2d 73 65 6c 65 63 74 2c 20 74 68 65 6e 20 70  b-select, then p
15be0 4f 75 74 65 72 4e 43 20 69 73 20 61 20 70 6f 69  OuterNC is a poi
15bf0 6e 74 65 72 20 74 6f 20 74 68 65 20 4e 61 6d 65  nter to the Name
15c00 43 6f 6e 74 65 78 74 20 0a 2a 2a 20 6f 66 20 74  Context .** of t
15c10 68 65 20 70 61 72 65 6e 74 20 53 45 4c 45 43 54  he parent SELECT
15c20 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
15c30 53 65 6c 65 63 74 52 65 73 6f 6c 76 65 28 0a 20  SelectResolve(. 
15c40 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
15c50 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70          /* The p
15c60 61 72 73 65 72 20 63 6f 6e 74 65 78 74 20 2a 2f  arser context */
15c70 0a 20 20 53 65 6c 65 63 74 20 2a 70 2c 20 20 20  .  Select *p,   
15c80 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
15c90 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
15ca0 74 20 62 65 69 6e 67 20 63 6f 64 65 64 2e 20 2a  t being coded. *
15cb0 2f 0a 20 20 4e 61 6d 65 43 6f 6e 74 65 78 74 20  /.  NameContext 
15cc0 2a 70 4f 75 74 65 72 4e 43 20 20 2f 2a 20 54 68  *pOuterNC  /* Th
15cd0 65 20 6f 75 74 65 72 20 6e 61 6d 65 20 63 6f 6e  e outer name con
15ce0 74 65 78 74 2e 20 4d 61 79 20 62 65 20 4e 55 4c  text. May be NUL
15cf0 4c 2e 20 2a 2f 0a 29 7b 0a 20 20 45 78 70 72 4c  L. */.){.  ExprL
15d00 69 73 74 20 2a 70 45 4c 69 73 74 3b 20 20 20 20  ist *pEList;    
15d10 20 20 20 20 20 20 2f 2a 20 52 65 73 75 6c 74 20        /* Result 
15d20 73 65 74 2e 20 2a 2f 0a 20 20 69 6e 74 20 69 3b  set. */.  int i;
15d30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15d40 20 20 20 20 20 2f 2a 20 46 6f 72 2d 6c 6f 6f 70       /* For-loop
15d50 20 76 61 72 69 61 62 6c 65 20 75 73 65 64 20 69   variable used i
15d60 6e 20 6d 75 6c 74 69 70 6c 65 20 70 6c 61 63 65  n multiple place
15d70 73 20 2a 2f 0a 20 20 4e 61 6d 65 43 6f 6e 74 65  s */.  NameConte
15d80 78 74 20 73 4e 43 3b 20 20 20 20 20 20 20 20 20  xt sNC;         
15d90 20 20 2f 2a 20 4c 6f 63 61 6c 20 6e 61 6d 65 2d    /* Local name-
15da0 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78 70  context */.  Exp
15db0 72 4c 69 73 74 20 2a 70 47 72 6f 75 70 42 79 3b  rList *pGroupBy;
15dc0 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 67          /* The g
15dd0 72 6f 75 70 20 62 79 20 63 6c 61 75 73 65 20 2a  roup by clause *
15de0 2f 0a 0a 20 20 2f 2a 20 49 66 20 74 68 69 73 20  /..  /* If this 
15df0 72 6f 75 74 69 6e 65 20 68 61 73 20 72 75 6e 20  routine has run 
15e00 62 65 66 6f 72 65 2c 20 72 65 74 75 72 6e 20 69  before, return i
15e10 6d 6d 65 64 69 61 74 65 6c 79 2e 20 2a 2f 0a 20  mmediately. */. 
15e20 20 69 66 28 20 70 2d 3e 69 73 52 65 73 6f 6c 76   if( p->isResolv
15e30 65 64 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  ed ){.    assert
15e40 28 20 21 70 4f 75 74 65 72 4e 43 20 29 3b 0a 20  ( !pOuterNC );. 
15e50 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
15e60 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 70 2d 3e 69 73  _OK;.  }.  p->is
15e70 52 65 73 6f 6c 76 65 64 20 3d 20 31 3b 0a 0a 20  Resolved = 1;.. 
15e80 20 2f 2a 20 49 66 20 74 68 65 72 65 20 68 61 76   /* If there hav
15e90 65 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 65  e already been e
15ea0 72 72 6f 72 73 2c 20 64 6f 20 6e 6f 74 68 69 6e  rrors, do nothin
15eb0 67 2e 20 2a 2f 0a 20 20 69 66 28 20 70 50 61 72  g. */.  if( pPar
15ec0 73 65 2d 3e 6e 45 72 72 3e 30 20 29 7b 0a 20 20  se->nErr>0 ){.  
15ed0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
15ee0 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  ERROR;.  }..  /*
15ef0 20 50 72 65 70 61 72 65 20 74 68 65 20 73 65 6c   Prepare the sel
15f00 65 63 74 20 73 74 61 74 65 6d 65 6e 74 2e 20 54  ect statement. T
15f10 68 69 73 20 63 61 6c 6c 20 77 69 6c 6c 20 61 6c  his call will al
15f20 6c 6f 63 61 74 65 20 61 6c 6c 20 63 75 72 73 6f  locate all curso
15f30 72 73 0a 20 20 2a 2a 20 72 65 71 75 69 72 65 64  rs.  ** required
15f40 20 74 6f 20 68 61 6e 64 6c 65 20 74 68 65 20 74   to handle the t
15f50 61 62 6c 65 73 20 61 6e 64 20 73 75 62 71 75 65  ables and subque
15f60 72 69 65 73 20 69 6e 20 74 68 65 20 46 52 4f 4d  ries in the FROM
15f70 20 63 6c 61 75 73 65 2e 0a 20 20 2a 2f 0a 20 20   clause..  */.  
15f80 69 66 28 20 70 72 65 70 53 65 6c 65 63 74 53 74  if( prepSelectSt
15f90 6d 74 28 70 50 61 72 73 65 2c 20 70 29 20 29 7b  mt(pParse, p) ){
15fa0 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
15fb0 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20  TE_ERROR;.  }.. 
15fc0 20 2f 2a 20 52 65 73 6f 6c 76 65 20 74 68 65 20   /* Resolve the 
15fd0 65 78 70 72 65 73 73 69 6f 6e 73 20 69 6e 20 74  expressions in t
15fe0 68 65 20 4c 49 4d 49 54 20 61 6e 64 20 4f 46 46  he LIMIT and OFF
15ff0 53 45 54 20 63 6c 61 75 73 65 73 2e 20 54 68 65  SET clauses. The
16000 73 65 0a 20 20 2a 2a 20 61 72 65 20 6e 6f 74 20  se.  ** are not 
16010 61 6c 6c 6f 77 65 64 20 74 6f 20 72 65 66 65 72  allowed to refer
16020 20 74 6f 20 61 6e 79 20 6e 61 6d 65 73 2c 20 73   to any names, s
16030 6f 20 70 61 73 73 20 61 6e 20 65 6d 70 74 79 20  o pass an empty 
16040 4e 61 6d 65 43 6f 6e 74 65 78 74 2e 0a 20 20 2a  NameContext..  *
16050 2f 0a 20 20 6d 65 6d 73 65 74 28 26 73 4e 43 2c  /.  memset(&sNC,
16060 20 30 2c 20 73 69 7a 65 6f 66 28 73 4e 43 29 29   0, sizeof(sNC))
16070 3b 0a 20 20 73 4e 43 2e 70 50 61 72 73 65 20 3d  ;.  sNC.pParse =
16080 20 70 50 61 72 73 65 3b 0a 20 20 69 66 28 20 73   pParse;.  if( s
16090 71 6c 69 74 65 33 45 78 70 72 52 65 73 6f 6c 76  qlite3ExprResolv
160a0 65 4e 61 6d 65 73 28 26 73 4e 43 2c 20 70 2d 3e  eNames(&sNC, p->
160b0 70 4c 69 6d 69 74 29 20 7c 7c 0a 20 20 20 20 20  pLimit) ||.     
160c0 20 73 71 6c 69 74 65 33 45 78 70 72 52 65 73 6f   sqlite3ExprReso
160d0 6c 76 65 4e 61 6d 65 73 28 26 73 4e 43 2c 20 70  lveNames(&sNC, p
160e0 2d 3e 70 4f 66 66 73 65 74 29 20 29 7b 0a 20 20  ->pOffset) ){.  
160f0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
16100 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  ERROR;.  }..  /*
16110 20 53 65 74 20 75 70 20 74 68 65 20 6c 6f 63 61   Set up the loca
16120 6c 20 6e 61 6d 65 2d 63 6f 6e 74 65 78 74 20 74  l name-context t
16130 6f 20 70 61 73 73 20 74 6f 20 45 78 70 72 52 65  o pass to ExprRe
16140 73 6f 6c 76 65 4e 61 6d 65 73 28 29 20 74 6f 0a  solveNames() to.
16150 20 20 2a 2a 20 72 65 73 6f 6c 76 65 20 74 68 65    ** resolve the
16160 20 65 78 70 72 65 73 73 69 6f 6e 2d 6c 69 73 74   expression-list
16170 2e 0a 20 20 2a 2f 0a 20 20 73 4e 43 2e 61 6c 6c  ..  */.  sNC.all
16180 6f 77 41 67 67 20 3d 20 31 3b 0a 20 20 73 4e 43  owAgg = 1;.  sNC
16190 2e 70 53 72 63 4c 69 73 74 20 3d 20 70 2d 3e 70  .pSrcList = p->p
161a0 53 72 63 3b 0a 20 20 73 4e 43 2e 70 4e 65 78 74  Src;.  sNC.pNext
161b0 20 3d 20 70 4f 75 74 65 72 4e 43 3b 0a 0a 20 20   = pOuterNC;..  
161c0 2f 2a 20 52 65 73 6f 6c 76 65 20 6e 61 6d 65 73  /* Resolve names
161d0 20 69 6e 20 74 68 65 20 72 65 73 75 6c 74 20 73   in the result s
161e0 65 74 2e 20 2a 2f 0a 20 20 70 45 4c 69 73 74 20  et. */.  pEList 
161f0 3d 20 70 2d 3e 70 45 4c 69 73 74 3b 0a 20 20 69  = p->pEList;.  i
16200 66 28 20 21 70 45 4c 69 73 74 20 29 20 72 65 74  f( !pEList ) ret
16210 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52  urn SQLITE_ERROR
16220 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70  ;.  for(i=0; i<p
16230 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b  EList->nExpr; i+
16240 2b 29 7b 0a 20 20 20 20 45 78 70 72 20 2a 70 58  +){.    Expr *pX
16250 20 3d 20 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e   = pEList->a[i].
16260 70 45 78 70 72 3b 0a 20 20 20 20 69 66 28 20 73  pExpr;.    if( s
16270 71 6c 69 74 65 33 45 78 70 72 52 65 73 6f 6c 76  qlite3ExprResolv
16280 65 4e 61 6d 65 73 28 26 73 4e 43 2c 20 70 58 29  eNames(&sNC, pX)
16290 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
162a0 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20   SQLITE_ERROR;. 
162b0 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49     }.  }..  /* I
162c0 66 20 74 68 65 72 65 20 61 72 65 20 6e 6f 20 61  f there are no a
162d0 67 67 72 65 67 61 74 65 20 66 75 6e 63 74 69 6f  ggregate functio
162e0 6e 73 20 69 6e 20 74 68 65 20 72 65 73 75 6c 74  ns in the result
162f0 2d 73 65 74 2c 20 61 6e 64 20 6e 6f 20 47 52 4f  -set, and no GRO
16300 55 50 20 42 59 20 0a 20 20 2a 2a 20 65 78 70 72  UP BY .  ** expr
16310 65 73 73 69 6f 6e 2c 20 64 6f 20 6e 6f 74 20 61  ession, do not a
16320 6c 6c 6f 77 20 61 67 67 72 65 67 61 74 65 73 20  llow aggregates 
16330 69 6e 20 61 6e 79 20 6f 66 20 74 68 65 20 6f 74  in any of the ot
16340 68 65 72 20 65 78 70 72 65 73 73 69 6f 6e 73 2e  her expressions.
16350 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  .  */.  assert( 
16360 21 70 2d 3e 69 73 41 67 67 20 29 3b 0a 20 20 70  !p->isAgg );.  p
16370 47 72 6f 75 70 42 79 20 3d 20 70 2d 3e 70 47 72  GroupBy = p->pGr
16380 6f 75 70 42 79 3b 0a 20 20 69 66 28 20 70 47 72  oupBy;.  if( pGr
16390 6f 75 70 42 79 20 7c 7c 20 73 4e 43 2e 68 61 73  oupBy || sNC.has
163a0 41 67 67 20 29 7b 0a 20 20 20 20 70 2d 3e 69 73  Agg ){.    p->is
163b0 41 67 67 20 3d 20 31 3b 0a 20 20 7d 65 6c 73 65  Agg = 1;.  }else
163c0 7b 0a 20 20 20 20 73 4e 43 2e 61 6c 6c 6f 77 41  {.    sNC.allowA
163d0 67 67 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f  gg = 0;.  }..  /
163e0 2a 20 49 66 20 61 20 48 41 56 49 4e 47 20 63 6c  * If a HAVING cl
163f0 61 75 73 65 20 69 73 20 70 72 65 73 65 6e 74 2c  ause is present,
16400 20 74 68 65 6e 20 74 68 65 72 65 20 6d 75 73 74   then there must
16410 20 62 65 20 61 20 47 52 4f 55 50 20 42 59 20 63   be a GROUP BY c
16420 6c 61 75 73 65 2e 0a 20 20 2a 2f 0a 20 20 69 66  lause..  */.  if
16430 28 20 70 2d 3e 70 48 61 76 69 6e 67 20 26 26 20  ( p->pHaving && 
16440 21 70 47 72 6f 75 70 42 79 20 29 7b 0a 20 20 20  !pGroupBy ){.   
16450 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
16460 28 70 50 61 72 73 65 2c 20 22 61 20 47 52 4f 55  (pParse, "a GROU
16470 50 20 42 59 20 63 6c 61 75 73 65 20 69 73 20 72  P BY clause is r
16480 65 71 75 69 72 65 64 20 62 65 66 6f 72 65 20 48  equired before H
16490 41 56 49 4e 47 22 29 3b 0a 20 20 20 20 72 65 74  AVING");.    ret
164a0 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52  urn SQLITE_ERROR
164b0 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 64 64 20  ;.  }..  /* Add 
164c0 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 6c  the expression l
164d0 69 73 74 20 74 6f 20 74 68 65 20 6e 61 6d 65 2d  ist to the name-
164e0 63 6f 6e 74 65 78 74 20 62 65 66 6f 72 65 20 70  context before p
164f0 61 72 73 69 6e 67 20 74 68 65 0a 20 20 2a 2a 20  arsing the.  ** 
16500 6f 74 68 65 72 20 65 78 70 72 65 73 73 69 6f 6e  other expression
16510 73 20 69 6e 20 74 68 65 20 53 45 4c 45 43 54 20  s in the SELECT 
16520 73 74 61 74 65 6d 65 6e 74 2e 20 54 68 69 73 20  statement. This 
16530 69 73 20 73 6f 20 74 68 61 74 0a 20 20 2a 2a 20  is so that.  ** 
16540 65 78 70 72 65 73 73 69 6f 6e 73 20 69 6e 20 74  expressions in t
16550 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  he WHERE clause 
16560 28 65 74 63 2e 29 20 63 61 6e 20 72 65 66 65 72  (etc.) can refer
16570 20 74 6f 20 65 78 70 72 65 73 73 69 6f 6e 73 20   to expressions 
16580 62 79 0a 20 20 2a 2a 20 61 6c 69 61 73 65 73 20  by.  ** aliases 
16590 69 6e 20 74 68 65 20 72 65 73 75 6c 74 20 73 65  in the result se
165a0 74 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 4d 69 6e  t..  **.  ** Min
165b0 6f 72 20 70 6f 69 6e 74 3a 20 49 66 20 74 68 69  or point: If thi
165c0 73 20 69 73 20 74 68 65 20 63 61 73 65 2c 20 74  s is the case, t
165d0 68 65 6e 20 74 68 65 20 65 78 70 72 65 73 73 69  hen the expressi
165e0 6f 6e 20 77 69 6c 6c 20 62 65 0a 20 20 2a 2a 20  on will be.  ** 
165f0 72 65 2d 65 76 61 6c 75 61 74 65 64 20 66 6f 72  re-evaluated for
16600 20 65 61 63 68 20 72 65 66 65 72 65 6e 63 65 20   each reference 
16610 74 6f 20 69 74 2e 0a 20 20 2a 2f 0a 20 20 73 4e  to it..  */.  sN
16620 43 2e 70 45 4c 69 73 74 20 3d 20 70 2d 3e 70 45  C.pEList = p->pE
16630 4c 69 73 74 3b 0a 20 20 69 66 28 20 73 71 6c 69  List;.  if( sqli
16640 74 65 33 45 78 70 72 52 65 73 6f 6c 76 65 4e 61  te3ExprResolveNa
16650 6d 65 73 28 26 73 4e 43 2c 20 70 2d 3e 70 57 68  mes(&sNC, p->pWh
16660 65 72 65 29 20 7c 7c 0a 20 20 20 20 20 73 71 6c  ere) ||.     sql
16670 69 74 65 33 45 78 70 72 52 65 73 6f 6c 76 65 4e  ite3ExprResolveN
16680 61 6d 65 73 28 26 73 4e 43 2c 20 70 2d 3e 70 48  ames(&sNC, p->pH
16690 61 76 69 6e 67 29 20 29 7b 0a 20 20 20 20 72 65  aving) ){.    re
166a0 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f  turn SQLITE_ERRO
166b0 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e  R;.  }.  if( p->
166c0 70 50 72 69 6f 72 3d 3d 30 20 29 7b 0a 20 20 20  pPrior==0 ){.   
166d0 20 69 66 28 20 70 72 6f 63 65 73 73 4f 72 64 65   if( processOrde
166e0 72 47 72 6f 75 70 42 79 28 26 73 4e 43 2c 20 70  rGroupBy(&sNC, p
166f0 2d 3e 70 4f 72 64 65 72 42 79 2c 20 22 4f 52 44  ->pOrderBy, "ORD
16700 45 52 22 29 20 7c 7c 0a 20 20 20 20 20 20 20 20  ER") ||.        
16710 70 72 6f 63 65 73 73 4f 72 64 65 72 47 72 6f 75  processOrderGrou
16720 70 42 79 28 26 73 4e 43 2c 20 70 47 72 6f 75 70  pBy(&sNC, pGroup
16730 42 79 2c 20 22 47 52 4f 55 50 22 29 20 29 7b 0a  By, "GROUP") ){.
16740 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
16750 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d  ITE_ERROR;.    }
16760 0a 20 20 7d 0a 0a 20 20 69 66 28 20 64 62 2d 3e  .  }..  if( db->
16770 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a  mallocFailed ){.
16780 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
16790 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 0a 20 20  E_NOMEM;.  }..  
167a0 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65  /* Make sure the
167b0 20 47 52 4f 55 50 20 42 59 20 63 6c 61 75 73 65   GROUP BY clause
167c0 20 64 6f 65 73 20 6e 6f 74 20 63 6f 6e 74 61 69   does not contai
167d0 6e 20 61 67 67 72 65 67 61 74 65 20 66 75 6e 63  n aggregate func
167e0 74 69 6f 6e 73 2e 0a 20 20 2a 2f 0a 20 20 69 66  tions..  */.  if
167f0 28 20 70 47 72 6f 75 70 42 79 20 29 7b 0a 20 20  ( pGroupBy ){.  
16800 20 20 73 74 72 75 63 74 20 45 78 70 72 4c 69 73    struct ExprLis
16810 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20  t_item *pItem;. 
16820 20 0a 20 20 20 20 66 6f 72 28 69 3d 30 2c 20 70   .    for(i=0, p
16830 49 74 65 6d 3d 70 47 72 6f 75 70 42 79 2d 3e 61  Item=pGroupBy->a
16840 3b 20 69 3c 70 47 72 6f 75 70 42 79 2d 3e 6e 45  ; i<pGroupBy->nE
16850 78 70 72 3b 20 69 2b 2b 2c 20 70 49 74 65 6d 2b  xpr; i++, pItem+
16860 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 45 78  +){.      if( Ex
16870 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 49  prHasProperty(pI
16880 74 65 6d 2d 3e 70 45 78 70 72 2c 20 45 50 5f 41  tem->pExpr, EP_A
16890 67 67 29 20 29 7b 0a 20 20 20 20 20 20 20 20 73  gg) ){.        s
168a0 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
168b0 50 61 72 73 65 2c 20 22 61 67 67 72 65 67 61 74  Parse, "aggregat
168c0 65 20 66 75 6e 63 74 69 6f 6e 73 20 61 72 65 20  e functions are 
168d0 6e 6f 74 20 61 6c 6c 6f 77 65 64 20 69 6e 20 22  not allowed in "
168e0 0a 20 20 20 20 20 20 20 20 20 20 20 20 22 74 68  .            "th
168f0 65 20 47 52 4f 55 50 20 42 59 20 63 6c 61 75 73  e GROUP BY claus
16900 65 22 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74  e");.        ret
16910 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52  urn SQLITE_ERROR
16920 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
16930 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 69    }..  /* If thi
16940 73 20 69 73 20 6f 6e 65 20 53 45 4c 45 43 54 20  s is one SELECT 
16950 6f 66 20 61 20 63 6f 6d 70 6f 75 6e 64 2c 20 62  of a compound, b
16960 65 20 73 75 72 65 20 74 6f 20 72 65 73 6f 6c 76  e sure to resolv
16970 65 20 6e 61 6d 65 73 0a 20 20 2a 2a 20 69 6e 20  e names.  ** in 
16980 74 68 65 20 6f 74 68 65 72 20 53 45 4c 45 43 54  the other SELECT
16990 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d  s..  */.  if( p-
169a0 3e 70 50 72 69 6f 72 20 29 7b 0a 20 20 20 20 72  >pPrior ){.    r
169b0 65 74 75 72 6e 20 73 71 6c 69 74 65 33 53 65 6c  eturn sqlite3Sel
169c0 65 63 74 52 65 73 6f 6c 76 65 28 70 50 61 72 73  ectResolve(pPars
169d0 65 2c 20 70 2d 3e 70 50 72 69 6f 72 2c 20 70 4f  e, p->pPrior, pO
169e0 75 74 65 72 4e 43 29 3b 0a 20 20 7d 65 6c 73 65  uterNC);.  }else
169f0 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
16a00 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 7d 0a 0a 2f  ITE_OK;.  }.}../
16a10 2a 0a 2a 2a 20 52 65 73 65 74 20 74 68 65 20 61  *.** Reset the a
16a20 67 67 72 65 67 61 74 65 20 61 63 63 75 6d 75 6c  ggregate accumul
16a30 61 74 6f 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  ator..**.** The 
16a40 61 67 67 72 65 67 61 74 65 20 61 63 63 75 6d 75  aggregate accumu
16a50 6c 61 74 6f 72 20 69 73 20 61 20 73 65 74 20 6f  lator is a set o
16a60 66 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 73 20 74  f memory cells t
16a70 68 61 74 20 68 6f 6c 64 0a 2a 2a 20 69 6e 74 65  hat hold.** inte
16a80 72 6d 65 64 69 61 74 65 20 72 65 73 75 6c 74 73  rmediate results
16a90 20 77 68 69 6c 65 20 63 61 6c 63 75 6c 61 74 69   while calculati
16aa0 6e 67 20 61 6e 20 61 67 67 72 65 67 61 74 65 2e  ng an aggregate.
16ab0 20 20 54 68 69 73 0a 2a 2a 20 72 6f 75 74 69 6e    This.** routin
16ac0 65 20 73 69 6d 70 6c 79 20 73 74 6f 72 65 73 20  e simply stores 
16ad0 4e 55 4c 4c 73 20 69 6e 20 61 6c 6c 20 6f 66 20  NULLs in all of 
16ae0 74 68 6f 73 65 20 6d 65 6d 6f 72 79 20 63 65 6c  those memory cel
16af0 6c 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ls..*/.static vo
16b00 69 64 20 72 65 73 65 74 41 63 63 75 6d 75 6c 61  id resetAccumula
16b10 74 6f 72 28 50 61 72 73 65 20 2a 70 50 61 72 73  tor(Parse *pPars
16b20 65 2c 20 41 67 67 49 6e 66 6f 20 2a 70 41 67 67  e, AggInfo *pAgg
16b30 49 6e 66 6f 29 7b 0a 20 20 56 64 62 65 20 2a 76  Info){.  Vdbe *v
16b40 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65   = pParse->pVdbe
16b50 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 73 74 72  ;.  int i;.  str
16b60 75 63 74 20 41 67 67 49 6e 66 6f 5f 66 75 6e 63  uct AggInfo_func
16b70 20 2a 70 46 75 6e 63 3b 0a 20 20 69 66 28 20 70   *pFunc;.  if( p
16b80 41 67 67 49 6e 66 6f 2d 3e 6e 46 75 6e 63 2b 70  AggInfo->nFunc+p
16b90 41 67 67 49 6e 66 6f 2d 3e 6e 43 6f 6c 75 6d 6e  AggInfo->nColumn
16ba0 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ==0 ){.    retur
16bb0 6e 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d 30  n;.  }.  for(i=0
16bc0 3b 20 69 3c 70 41 67 67 49 6e 66 6f 2d 3e 6e 43  ; i<pAggInfo->nC
16bd0 6f 6c 75 6d 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20  olumn; i++){.   
16be0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
16bf0 70 28 76 2c 20 4f 50 5f 4d 65 6d 4e 75 6c 6c 2c  p(v, OP_MemNull,
16c00 20 70 41 67 67 49 6e 66 6f 2d 3e 61 43 6f 6c 5b   pAggInfo->aCol[
16c10 69 5d 2e 69 4d 65 6d 2c 20 30 29 3b 0a 20 20 7d  i].iMem, 0);.  }
16c20 0a 20 20 66 6f 72 28 70 46 75 6e 63 3d 70 41 67  .  for(pFunc=pAg
16c30 67 49 6e 66 6f 2d 3e 61 46 75 6e 63 2c 20 69 3d  gInfo->aFunc, i=
16c40 30 3b 20 69 3c 70 41 67 67 49 6e 66 6f 2d 3e 6e  0; i<pAggInfo->n
16c50 46 75 6e 63 3b 20 69 2b 2b 2c 20 70 46 75 6e 63  Func; i++, pFunc
16c60 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  ++){.    sqlite3
16c70 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
16c80 4d 65 6d 4e 75 6c 6c 2c 20 70 46 75 6e 63 2d 3e  MemNull, pFunc->
16c90 69 4d 65 6d 2c 20 30 29 3b 0a 20 20 20 20 69 66  iMem, 0);.    if
16ca0 28 20 70 46 75 6e 63 2d 3e 69 44 69 73 74 69 6e  ( pFunc->iDistin
16cb0 63 74 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 45  ct>=0 ){.      E
16cc0 78 70 72 20 2a 70 45 20 3d 20 70 46 75 6e 63 2d  xpr *pE = pFunc-
16cd0 3e 70 45 78 70 72 3b 0a 20 20 20 20 20 20 69 66  >pExpr;.      if
16ce0 28 20 70 45 2d 3e 70 4c 69 73 74 3d 3d 30 20 7c  ( pE->pList==0 |
16cf0 7c 20 70 45 2d 3e 70 4c 69 73 74 2d 3e 6e 45 78  | pE->pList->nEx
16d00 70 72 21 3d 31 20 29 7b 0a 20 20 20 20 20 20 20  pr!=1 ){.       
16d10 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
16d20 28 70 50 61 72 73 65 2c 20 22 44 49 53 54 49 4e  (pParse, "DISTIN
16d30 43 54 20 69 6e 20 61 67 67 72 65 67 61 74 65 20  CT in aggregate 
16d40 6d 75 73 74 20 62 65 20 66 6f 6c 6c 6f 77 65 64  must be followed
16d50 20 22 0a 20 20 20 20 20 20 20 20 20 20 20 22 62   ".           "b
16d60 79 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 22  y an expression"
16d70 29 3b 0a 20 20 20 20 20 20 20 20 70 46 75 6e 63  );.        pFunc
16d80 2d 3e 69 44 69 73 74 69 6e 63 74 20 3d 20 2d 31  ->iDistinct = -1
16d90 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
16da0 20 20 20 20 20 20 20 4b 65 79 49 6e 66 6f 20 2a         KeyInfo *
16db0 70 4b 65 79 49 6e 66 6f 20 3d 20 6b 65 79 49 6e  pKeyInfo = keyIn
16dc0 66 6f 46 72 6f 6d 45 78 70 72 4c 69 73 74 28 70  foFromExprList(p
16dd0 50 61 72 73 65 2c 20 70 45 2d 3e 70 4c 69 73 74  Parse, pE->pList
16de0 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
16df0 65 33 56 64 62 65 4f 70 33 28 76 2c 20 4f 50 5f  e3VdbeOp3(v, OP_
16e00 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 2c 20 70  OpenEphemeral, p
16e10 46 75 6e 63 2d 3e 69 44 69 73 74 69 6e 63 74 2c  Func->iDistinct,
16e20 20 30 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20   0, .           
16e30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28                 (
16e40 63 68 61 72 2a 29 70 4b 65 79 49 6e 66 6f 2c 20  char*)pKeyInfo, 
16e50 50 33 5f 4b 45 59 49 4e 46 4f 5f 48 41 4e 44 4f  P3_KEYINFO_HANDO
16e60 46 46 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  FF);.      }.   
16e70 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   }.  }.}../*.** 
16e80 49 6e 76 6f 6b 65 20 74 68 65 20 4f 50 5f 41 67  Invoke the OP_Ag
16e90 67 46 69 6e 61 6c 69 7a 65 20 6f 70 63 6f 64 65  gFinalize opcode
16ea0 20 66 6f 72 20 65 76 65 72 79 20 61 67 67 72 65   for every aggre
16eb0 67 61 74 65 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a  gate function.**
16ec0 20 69 6e 20 74 68 65 20 41 67 67 49 6e 66 6f 20   in the AggInfo 
16ed0 73 74 72 75 63 74 75 72 65 2e 0a 2a 2f 0a 73 74  structure..*/.st
16ee0 61 74 69 63 20 76 6f 69 64 20 66 69 6e 61 6c 69  atic void finali
16ef0 7a 65 41 67 67 46 75 6e 63 74 69 6f 6e 73 28 50  zeAggFunctions(P
16f00 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 41 67  arse *pParse, Ag
16f10 67 49 6e 66 6f 20 2a 70 41 67 67 49 6e 66 6f 29  gInfo *pAggInfo)
16f20 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50  {.  Vdbe *v = pP
16f30 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69  arse->pVdbe;.  i
16f40 6e 74 20 69 3b 0a 20 20 73 74 72 75 63 74 20 41  nt i;.  struct A
16f50 67 67 49 6e 66 6f 5f 66 75 6e 63 20 2a 70 46 3b  ggInfo_func *pF;
16f60 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70 46 3d 70  .  for(i=0, pF=p
16f70 41 67 67 49 6e 66 6f 2d 3e 61 46 75 6e 63 3b 20  AggInfo->aFunc; 
16f80 69 3c 70 41 67 67 49 6e 66 6f 2d 3e 6e 46 75 6e  i<pAggInfo->nFun
16f90 63 3b 20 69 2b 2b 2c 20 70 46 2b 2b 29 7b 0a 20  c; i++, pF++){. 
16fa0 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69     ExprList *pLi
16fb0 73 74 20 3d 20 70 46 2d 3e 70 45 78 70 72 2d 3e  st = pF->pExpr->
16fc0 70 4c 69 73 74 3b 0a 20 20 20 20 73 71 6c 69 74  pList;.    sqlit
16fd0 65 33 56 64 62 65 4f 70 33 28 76 2c 20 4f 50 5f  e3VdbeOp3(v, OP_
16fe0 41 67 67 46 69 6e 61 6c 2c 20 70 46 2d 3e 69 4d  AggFinal, pF->iM
16ff0 65 6d 2c 20 70 4c 69 73 74 20 3f 20 70 4c 69 73  em, pList ? pLis
17000 74 2d 3e 6e 45 78 70 72 20 3a 20 30 2c 0a 20 20  t->nExpr : 0,.  
17010 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17020 20 20 20 20 28 76 6f 69 64 2a 29 70 46 2d 3e 70      (void*)pF->p
17030 46 75 6e 63 2c 20 50 33 5f 46 55 4e 43 44 45 46  Func, P3_FUNCDEF
17040 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  );.  }.}../*.** 
17050 55 70 64 61 74 65 20 74 68 65 20 61 63 63 75 6d  Update the accum
17060 75 6c 61 74 6f 72 20 6d 65 6d 6f 72 79 20 63 65  ulator memory ce
17070 6c 6c 73 20 66 6f 72 20 61 6e 20 61 67 67 72 65  lls for an aggre
17080 67 61 74 65 20 62 61 73 65 64 20 6f 6e 0a 2a 2a  gate based on.**
17090 20 74 68 65 20 63 75 72 72 65 6e 74 20 63 75 72   the current cur
170a0 73 6f 72 20 70 6f 73 69 74 69 6f 6e 2e 0a 2a 2f  sor position..*/
170b0 0a 73 74 61 74 69 63 20 76 6f 69 64 20 75 70 64  .static void upd
170c0 61 74 65 41 63 63 75 6d 75 6c 61 74 6f 72 28 50  ateAccumulator(P
170d0 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 41 67  arse *pParse, Ag
170e0 67 49 6e 66 6f 20 2a 70 41 67 67 49 6e 66 6f 29  gInfo *pAggInfo)
170f0 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50  {.  Vdbe *v = pP
17100 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69  arse->pVdbe;.  i
17110 6e 74 20 69 3b 0a 20 20 73 74 72 75 63 74 20 41  nt i;.  struct A
17120 67 67 49 6e 66 6f 5f 66 75 6e 63 20 2a 70 46 3b  ggInfo_func *pF;
17130 0a 20 20 73 74 72 75 63 74 20 41 67 67 49 6e 66  .  struct AggInf
17140 6f 5f 63 6f 6c 20 2a 70 43 3b 0a 0a 20 20 70 41  o_col *pC;..  pA
17150 67 67 49 6e 66 6f 2d 3e 64 69 72 65 63 74 4d 6f  ggInfo->directMo
17160 64 65 20 3d 20 31 3b 0a 20 20 66 6f 72 28 69 3d  de = 1;.  for(i=
17170 30 2c 20 70 46 3d 70 41 67 67 49 6e 66 6f 2d 3e  0, pF=pAggInfo->
17180 61 46 75 6e 63 3b 20 69 3c 70 41 67 67 49 6e 66  aFunc; i<pAggInf
17190 6f 2d 3e 6e 46 75 6e 63 3b 20 69 2b 2b 2c 20 70  o->nFunc; i++, p
171a0 46 2b 2b 29 7b 0a 20 20 20 20 69 6e 74 20 6e 41  F++){.    int nA
171b0 72 67 3b 0a 20 20 20 20 69 6e 74 20 61 64 64 72  rg;.    int addr
171c0 4e 65 78 74 20 3d 20 30 3b 0a 20 20 20 20 45 78  Next = 0;.    Ex
171d0 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 20 3d 20  prList *pList = 
171e0 70 46 2d 3e 70 45 78 70 72 2d 3e 70 4c 69 73 74  pF->pExpr->pList
171f0 3b 0a 20 20 20 20 69 66 28 20 70 4c 69 73 74 20  ;.    if( pList 
17200 29 7b 0a 20 20 20 20 20 20 6e 41 72 67 20 3d 20  ){.      nArg = 
17210 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 0a 20 20  pList->nExpr;.  
17220 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
17230 6f 64 65 45 78 70 72 4c 69 73 74 28 70 50 61 72  odeExprList(pPar
17240 73 65 2c 20 70 4c 69 73 74 29 3b 0a 20 20 20 20  se, pList);.    
17250 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 6e 41 72  }else{.      nAr
17260 67 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20  g = 0;.    }.   
17270 20 69 66 28 20 70 46 2d 3e 69 44 69 73 74 69 6e   if( pF->iDistin
17280 63 74 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 61  ct>=0 ){.      a
17290 64 64 72 4e 65 78 74 20 3d 20 73 71 6c 69 74 65  ddrNext = sqlite
172a0 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76  3VdbeMakeLabel(v
172b0 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
172c0 20 6e 41 72 67 3d 3d 31 20 29 3b 0a 20 20 20 20   nArg==1 );.    
172d0 20 20 63 6f 64 65 44 69 73 74 69 6e 63 74 28 76    codeDistinct(v
172e0 2c 20 70 46 2d 3e 69 44 69 73 74 69 6e 63 74 2c  , pF->iDistinct,
172f0 20 61 64 64 72 4e 65 78 74 2c 20 31 29 3b 0a 20   addrNext, 1);. 
17300 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 46 2d     }.    if( pF-
17310 3e 70 46 75 6e 63 2d 3e 6e 65 65 64 43 6f 6c 6c  >pFunc->needColl
17320 53 65 71 20 29 7b 0a 20 20 20 20 20 20 43 6f 6c  Seq ){.      Col
17330 6c 53 65 71 20 2a 70 43 6f 6c 6c 20 3d 20 30 3b  lSeq *pColl = 0;
17340 0a 20 20 20 20 20 20 73 74 72 75 63 74 20 45 78  .      struct Ex
17350 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74  prList_item *pIt
17360 65 6d 3b 0a 20 20 20 20 20 20 69 6e 74 20 6a 3b  em;.      int j;
17370 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
17380 4c 69 73 74 21 3d 30 20 29 3b 20 20 2f 2a 20 70  List!=0 );  /* p
17390 4c 69 73 74 21 3d 30 20 69 66 20 70 46 2d 3e 70  List!=0 if pF->p
173a0 46 75 6e 63 2d 3e 6e 65 65 64 43 6f 6c 6c 53 65  Func->needCollSe
173b0 71 20 69 73 20 74 72 75 65 20 2a 2f 0a 20 20 20  q is true */.   
173c0 20 20 20 66 6f 72 28 6a 3d 30 2c 20 70 49 74 65     for(j=0, pIte
173d0 6d 3d 70 4c 69 73 74 2d 3e 61 3b 20 21 70 43 6f  m=pList->a; !pCo
173e0 6c 6c 20 26 26 20 6a 3c 6e 41 72 67 3b 20 6a 2b  ll && j<nArg; j+
173f0 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20  +, pItem++){.   
17400 20 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c       pColl = sql
17410 69 74 65 33 45 78 70 72 43 6f 6c 6c 53 65 71 28  ite3ExprCollSeq(
17420 70 50 61 72 73 65 2c 20 70 49 74 65 6d 2d 3e 70  pParse, pItem->p
17430 45 78 70 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20  Expr);.      }. 
17440 20 20 20 20 20 69 66 28 20 21 70 43 6f 6c 6c 20       if( !pColl 
17450 29 7b 0a 20 20 20 20 20 20 20 20 70 43 6f 6c 6c  ){.        pColl
17460 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 70   = pParse->db->p
17470 44 66 6c 74 43 6f 6c 6c 3b 0a 20 20 20 20 20 20  DfltColl;.      
17480 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  }.      sqlite3V
17490 64 62 65 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 6c  dbeOp3(v, OP_Col
174a0 6c 53 65 71 2c 20 30 2c 20 30 2c 20 28 63 68 61  lSeq, 0, 0, (cha
174b0 72 20 2a 29 70 43 6f 6c 6c 2c 20 50 33 5f 43 4f  r *)pColl, P3_CO
174c0 4c 4c 53 45 51 29 3b 0a 20 20 20 20 7d 0a 20 20  LLSEQ);.    }.  
174d0 20 20 73 71 6c 69 74 65 33 56 64 62 65 4f 70 33    sqlite3VdbeOp3
174e0 28 76 2c 20 4f 50 5f 41 67 67 53 74 65 70 2c 20  (v, OP_AggStep, 
174f0 70 46 2d 3e 69 4d 65 6d 2c 20 6e 41 72 67 2c 20  pF->iMem, nArg, 
17500 28 76 6f 69 64 2a 29 70 46 2d 3e 70 46 75 6e 63  (void*)pF->pFunc
17510 2c 20 50 33 5f 46 55 4e 43 44 45 46 29 3b 0a 20  , P3_FUNCDEF);. 
17520 20 20 20 69 66 28 20 61 64 64 72 4e 65 78 74 20     if( addrNext 
17530 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
17540 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c  VdbeResolveLabel
17550 28 76 2c 20 61 64 64 72 4e 65 78 74 29 3b 0a 20  (v, addrNext);. 
17560 20 20 20 7d 0a 20 20 7d 0a 20 20 66 6f 72 28 69     }.  }.  for(i
17570 3d 30 2c 20 70 43 3d 70 41 67 67 49 6e 66 6f 2d  =0, pC=pAggInfo-
17580 3e 61 43 6f 6c 3b 20 69 3c 70 41 67 67 49 6e 66  >aCol; i<pAggInf
17590 6f 2d 3e 6e 41 63 63 75 6d 75 6c 61 74 6f 72 3b  o->nAccumulator;
175a0 20 69 2b 2b 2c 20 70 43 2b 2b 29 7b 0a 20 20 20   i++, pC++){.   
175b0 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
175c0 28 70 50 61 72 73 65 2c 20 70 43 2d 3e 70 45 78  (pParse, pC->pEx
175d0 70 72 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  pr);.    sqlite3
175e0 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
175f0 4d 65 6d 53 74 6f 72 65 2c 20 70 43 2d 3e 69 4d  MemStore, pC->iM
17600 65 6d 2c 20 31 29 3b 0a 20 20 7d 0a 20 20 70 41  em, 1);.  }.  pA
17610 67 67 49 6e 66 6f 2d 3e 64 69 72 65 63 74 4d 6f  ggInfo->directMo
17620 64 65 20 3d 20 30 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a  de = 0;.}.../*.*
17630 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20  * Generate code 
17640 66 6f 72 20 74 68 65 20 67 69 76 65 6e 20 53 45  for the given SE
17650 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 2e 0a  LECT statement..
17660 2a 2a 0a 2a 2a 20 54 68 65 20 72 65 73 75 6c 74  **.** The result
17670 73 20 61 72 65 20 64 69 73 74 72 69 62 75 74 65  s are distribute
17680 64 20 69 6e 20 76 61 72 69 6f 75 73 20 77 61 79  d in various way
17690 73 20 64 65 70 65 6e 64 69 6e 67 20 6f 6e 20 74  s depending on t
176a0 68 65 0a 2a 2a 20 76 61 6c 75 65 20 6f 66 20 65  he.** value of e
176b0 44 65 73 74 20 61 6e 64 20 69 50 61 72 6d 2e 0a  Dest and iParm..
176c0 2a 2a 0a 2a 2a 20 20 20 20 20 65 44 65 73 74 20  **.**     eDest 
176d0 56 61 6c 75 65 20 20 20 20 20 20 20 52 65 73 75  Value       Resu
176e0 6c 74 0a 2a 2a 20 20 20 20 20 2d 2d 2d 2d 2d 2d  lt.**     ------
176f0 2d 2d 2d 2d 2d 2d 20 20 20 20 2d 2d 2d 2d 2d 2d  ------    ------
17700 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
17710 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
17720 2d 2d 2d 2d 2d 0a 2a 2a 20 20 20 20 20 53 52 54  -----.**     SRT
17730 5f 43 61 6c 6c 62 61 63 6b 20 20 20 20 49 6e 76  _Callback    Inv
17740 6f 6b 65 20 74 68 65 20 63 61 6c 6c 62 61 63 6b  oke the callback
17750 20 66 6f 72 20 65 61 63 68 20 72 6f 77 20 6f 66   for each row of
17760 20 74 68 65 20 72 65 73 75 6c 74 2e 0a 2a 2a 0a   the result..**.
17770 2a 2a 20 20 20 20 20 53 52 54 5f 4d 65 6d 20 20  **     SRT_Mem  
17780 20 20 20 20 20 20 20 53 74 6f 72 65 20 66 69 72         Store fir
17790 73 74 20 72 65 73 75 6c 74 20 69 6e 20 6d 65 6d  st result in mem
177a0 6f 72 79 20 63 65 6c 6c 20 69 50 61 72 6d 0a 2a  ory cell iParm.*
177b0 2a 0a 2a 2a 20 20 20 20 20 53 52 54 5f 53 65 74  *.**     SRT_Set
177c0 20 20 20 20 20 20 20 20 20 53 74 6f 72 65 20 72           Store r
177d0 65 73 75 6c 74 73 20 61 73 20 6b 65 79 73 20 6f  esults as keys o
177e0 66 20 74 61 62 6c 65 20 69 50 61 72 6d 2e 0a 2a  f table iParm..*
177f0 2a 0a 2a 2a 20 20 20 20 20 53 52 54 5f 55 6e 69  *.**     SRT_Uni
17800 6f 6e 20 20 20 20 20 20 20 53 74 6f 72 65 20 72  on       Store r
17810 65 73 75 6c 74 73 20 61 73 20 61 20 6b 65 79 20  esults as a key 
17820 69 6e 20 61 20 74 65 6d 70 6f 72 61 72 79 20 74  in a temporary t
17830 61 62 6c 65 20 69 50 61 72 6d 0a 2a 2a 0a 2a 2a  able iParm.**.**
17840 20 20 20 20 20 53 52 54 5f 45 78 63 65 70 74 20       SRT_Except 
17850 20 20 20 20 20 52 65 6d 6f 76 65 20 72 65 73 75       Remove resu
17860 6c 74 73 20 66 72 6f 6d 20 74 68 65 20 74 65 6d  lts from the tem
17870 70 6f 72 61 72 79 20 74 61 62 6c 65 20 69 50 61  porary table iPa
17880 72 6d 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 52  rm..**.**     SR
17890 54 5f 54 61 62 6c 65 20 20 20 20 20 20 20 53 74  T_Table       St
178a0 6f 72 65 20 72 65 73 75 6c 74 73 20 69 6e 20 74  ore results in t
178b0 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20 69  emporary table i
178c0 50 61 72 6d 0a 2a 2a 0a 2a 2a 20 54 68 65 20 74  Parm.**.** The t
178d0 61 62 6c 65 20 61 62 6f 76 65 20 69 73 20 69 6e  able above is in
178e0 63 6f 6d 70 6c 65 74 65 2e 20 20 41 64 64 69 74  complete.  Addit
178f0 69 6f 6e 61 6c 20 65 44 69 73 74 20 76 61 6c 75  ional eDist valu
17900 65 20 68 61 76 65 20 62 65 20 61 64 64 65 64 0a  e have be added.
17910 2a 2a 20 73 69 6e 63 65 20 74 68 69 73 20 63 6f  ** since this co
17920 6d 6d 65 6e 74 20 77 61 73 20 77 72 69 74 74 65  mment was writte
17930 6e 2e 20 20 53 65 65 20 74 68 65 20 73 65 6c 65  n.  See the sele
17940 63 74 49 6e 6e 65 72 4c 6f 6f 70 28 29 20 66 75  ctInnerLoop() fu
17950 6e 63 74 69 6f 6e 20 66 6f 72 0a 2a 2a 20 61 20  nction for.** a 
17960 63 6f 6d 70 6c 65 74 65 20 6c 69 73 74 69 6e 67  complete listing
17970 20 6f 66 20 74 68 65 20 61 6c 6c 6f 77 65 64 20   of the allowed 
17980 76 61 6c 75 65 73 20 6f 66 20 65 44 65 73 74 20  values of eDest 
17990 61 6e 64 20 74 68 65 69 72 20 6d 65 61 6e 69 6e  and their meanin
179a0 67 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  gs..**.** This r
179b0 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73 20 74  outine returns t
179c0 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 65 72 72  he number of err
179d0 6f 72 73 2e 20 20 49 66 20 61 6e 79 20 65 72 72  ors.  If any err
179e0 6f 72 73 20 61 72 65 0a 2a 2a 20 65 6e 63 6f 75  ors are.** encou
179f0 6e 74 65 72 65 64 2c 20 74 68 65 6e 20 61 6e 20  ntered, then an 
17a00 61 70 70 72 6f 70 72 69 61 74 65 20 65 72 72 6f  appropriate erro
17a10 72 20 6d 65 73 73 61 67 65 20 69 73 20 6c 65 66  r message is lef
17a20 74 20 69 6e 0a 2a 2a 20 70 50 61 72 73 65 2d 3e  t in.** pParse->
17a30 7a 45 72 72 4d 73 67 2e 0a 2a 2a 0a 2a 2a 20 54  zErrMsg..**.** T
17a40 68 69 73 20 72 6f 75 74 69 6e 65 20 64 6f 65 73  his routine does
17a50 20 4e 4f 54 20 66 72 65 65 20 74 68 65 20 53 65   NOT free the Se
17a60 6c 65 63 74 20 73 74 72 75 63 74 75 72 65 20 70  lect structure p
17a70 61 73 73 65 64 20 69 6e 2e 20 20 54 68 65 0a 2a  assed in.  The.*
17a80 2a 20 63 61 6c 6c 69 6e 67 20 66 75 6e 63 74 69  * calling functi
17a90 6f 6e 20 6e 65 65 64 73 20 74 6f 20 64 6f 20 74  on needs to do t
17aa0 68 61 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70  hat..**.** The p
17ab0 50 61 72 65 6e 74 2c 20 70 61 72 65 6e 74 54 61  Parent, parentTa
17ac0 62 2c 20 61 6e 64 20 2a 70 50 61 72 65 6e 74 41  b, and *pParentA
17ad0 67 67 20 66 69 65 6c 64 73 20 61 72 65 20 66 69  gg fields are fi
17ae0 6c 6c 65 64 20 69 6e 20 69 66 20 74 68 69 73 0a  lled in if this.
17af0 2a 2a 20 53 45 4c 45 43 54 20 69 73 20 61 20 73  ** SELECT is a s
17b00 75 62 71 75 65 72 79 2e 20 20 54 68 69 73 20 72  ubquery.  This r
17b10 6f 75 74 69 6e 65 20 6d 61 79 20 74 72 79 20 74  outine may try t
17b20 6f 20 63 6f 6d 62 69 6e 65 20 74 68 69 73 20 53  o combine this S
17b30 45 4c 45 43 54 0a 2a 2a 20 77 69 74 68 20 69 74  ELECT.** with it
17b40 73 20 70 61 72 65 6e 74 20 74 6f 20 66 6f 72 6d  s parent to form
17b50 20 61 20 73 69 6e 67 6c 65 20 66 6c 61 74 20 71   a single flat q
17b60 75 65 72 79 2e 20 20 49 6e 20 73 6f 20 64 6f 69  uery.  In so doi
17b70 6e 67 2c 20 69 74 20 6d 69 67 68 74 0a 2a 2a 20  ng, it might.** 
17b80 63 68 61 6e 67 65 20 74 68 65 20 70 61 72 65 6e  change the paren
17b90 74 20 71 75 65 72 79 20 66 72 6f 6d 20 61 20 6e  t query from a n
17ba0 6f 6e 2d 61 67 67 72 65 67 61 74 65 20 74 6f 20  on-aggregate to 
17bb0 61 6e 20 61 67 67 72 65 67 61 74 65 20 71 75 65  an aggregate que
17bc0 72 79 2e 0a 2a 2a 20 46 6f 72 20 74 68 61 74 20  ry..** For that 
17bd0 72 65 61 73 6f 6e 2c 20 74 68 65 20 70 50 61 72  reason, the pPar
17be0 65 6e 74 41 67 67 20 66 6c 61 67 20 69 73 20 70  entAgg flag is p
17bf0 61 73 73 65 64 20 61 73 20 61 20 70 6f 69 6e 74  assed as a point
17c00 65 72 2c 20 73 6f 20 69 74 0a 2a 2a 20 63 61 6e  er, so it.** can
17c10 20 62 65 20 63 68 61 6e 67 65 64 2e 0a 2a 2a 0a   be changed..**.
17c20 2a 2a 20 45 78 61 6d 70 6c 65 20 31 3a 20 20 20  ** Example 1:   
17c30 54 68 65 20 6d 65 61 6e 69 6e 67 20 6f 66 20 74  The meaning of t
17c40 68 65 20 70 50 61 72 65 6e 74 20 70 61 72 61 6d  he pParent param
17c50 65 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 53  eter..**.**    S
17c60 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 20  ELECT * FROM t1 
17c70 4a 4f 49 4e 20 28 53 45 4c 45 43 54 20 78 2c 20  JOIN (SELECT x, 
17c80 63 6f 75 6e 74 28 2a 29 20 46 52 4f 4d 20 74 32  count(*) FROM t2
17c90 29 20 4a 4f 49 4e 20 74 33 3b 0a 2a 2a 20 20 20  ) JOIN t3;.**   
17ca0 20 5c 20 20 20 20 20 20 20 20 20 20 20 20 20 20   \              
17cb0 20 20 20 20 20 20 20 20 5c 5f 5f 5f 5f 5f 5f 5f          \_______
17cc0 20 73 75 62 71 75 65 72 79 20 5f 5f 5f 5f 5f 5f   subquery ______
17cd0 5f 2f 20 20 20 20 20 20 20 20 2f 0a 2a 2a 20 20  _/        /.**  
17ce0 20 20 20 5c 20 20 20 20 20 20 20 20 20 20 20 20     \            
17cf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17d00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17d10 20 20 20 20 20 20 20 20 20 20 2f 0a 2a 2a 20 20            /.**  
17d20 20 20 20 20 5c 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f      \___________
17d30 5f 5f 5f 5f 5f 5f 5f 5f 5f 20 6f 75 74 65 72 20  _________ outer 
17d40 71 75 65 72 79 20 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f  query __________
17d50 5f 5f 5f 5f 5f 5f 5f 5f 5f 2f 0a 2a 2a 0a 2a 2a  _________/.**.**
17d60 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
17d70 20 63 61 6c 6c 65 64 20 66 6f 72 20 74 68 65 20   called for the 
17d80 6f 75 74 65 72 20 71 75 65 72 79 20 66 69 72 73  outer query firs
17d90 74 2e 20 20 20 46 6f 72 20 74 68 61 74 20 63 61  t.   For that ca
17da0 6c 6c 2c 0a 2a 2a 20 70 50 61 72 65 6e 74 20 77  ll,.** pParent w
17db0 69 6c 6c 20 62 65 20 4e 55 4c 4c 2e 20 20 44 75  ill be NULL.  Du
17dc0 72 69 6e 67 20 74 68 65 20 70 72 6f 63 65 73 73  ring the process
17dd0 69 6e 67 20 6f 66 20 74 68 65 20 6f 75 74 65 72  ing of the outer
17de0 20 71 75 65 72 79 2c 20 74 68 69 73 20 0a 2a 2a   query, this .**
17df0 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c   routine is call
17e00 65 64 20 72 65 63 75 72 73 69 76 65 6c 79 20 74  ed recursively t
17e10 6f 20 68 61 6e 64 6c 65 20 74 68 65 20 73 75 62  o handle the sub
17e20 71 75 65 72 79 2e 20 20 46 6f 72 20 74 68 65 20  query.  For the 
17e30 72 65 63 75 72 73 69 76 65 0a 2a 2a 20 63 61 6c  recursive.** cal
17e40 6c 2c 20 70 50 61 72 65 6e 74 20 77 69 6c 6c 20  l, pParent will 
17e50 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 6f 75 74  point to the out
17e60 65 72 20 71 75 65 72 79 2e 20 20 42 65 63 61 75  er query.  Becau
17e70 73 65 20 74 68 65 20 73 75 62 71 75 65 72 79 20  se the subquery 
17e80 69 73 0a 2a 2a 20 74 68 65 20 73 65 63 6f 6e 64  is.** the second
17e90 20 65 6c 65 6d 65 6e 74 20 69 6e 20 61 20 74 68   element in a th
17ea0 72 65 65 2d 77 61 79 20 6a 6f 69 6e 2c 20 74 68  ree-way join, th
17eb0 65 20 70 61 72 65 6e 74 54 61 62 20 70 61 72 61  e parentTab para
17ec0 6d 65 74 65 72 20 77 69 6c 6c 0a 2a 2a 20 62 65  meter will.** be
17ed0 20 31 20 28 74 68 65 20 32 6e 64 20 76 61 6c 75   1 (the 2nd valu
17ee0 65 20 6f 66 20 61 20 30 2d 69 6e 64 65 78 65 64  e of a 0-indexed
17ef0 20 61 72 72 61 79 2e 29 0a 2a 2f 0a 69 6e 74 20   array.).*/.int 
17f00 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28 0a 20  sqlite3Select(. 
17f10 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
17f20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70          /* The p
17f30 61 72 73 65 72 20 63 6f 6e 74 65 78 74 20 2a 2f  arser context */
17f40 0a 20 20 53 65 6c 65 63 74 20 2a 70 2c 20 20 20  .  Select *p,   
17f50 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
17f60 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
17f70 74 20 62 65 69 6e 67 20 63 6f 64 65 64 2e 20 2a  t being coded. *
17f80 2f 0a 20 20 69 6e 74 20 65 44 65 73 74 2c 20 20  /.  int eDest,  
17f90 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 48 6f             /* Ho
17fa0 77 20 74 6f 20 64 69 73 70 6f 73 65 20 6f 66 20  w to dispose of 
17fb0 74 68 65 20 72 65 73 75 6c 74 73 20 2a 2f 0a 20  the results */. 
17fc0 20 69 6e 74 20 69 50 61 72 6d 2c 20 20 20 20 20   int iParm,     
17fd0 20 20 20 20 20 20 20 20 2f 2a 20 41 20 70 61 72          /* A par
17fe0 61 6d 65 74 65 72 20 75 73 65 64 20 62 79 20 74  ameter used by t
17ff0 68 65 20 65 44 65 73 74 20 64 69 73 70 6f 73 61  he eDest disposa
18000 6c 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 53 65  l method */.  Se
18010 6c 65 63 74 20 2a 70 50 61 72 65 6e 74 2c 20 20  lect *pParent,  
18020 20 20 20 20 20 2f 2a 20 41 6e 6f 74 68 65 72 20       /* Another 
18030 53 45 4c 45 43 54 20 66 6f 72 20 77 68 69 63 68  SELECT for which
18040 20 74 68 69 73 20 69 73 20 61 20 73 75 62 2d 71   this is a sub-q
18050 75 65 72 79 20 2a 2f 0a 20 20 69 6e 74 20 70 61  uery */.  int pa
18060 72 65 6e 74 54 61 62 2c 20 20 20 20 20 20 20 20  rentTab,        
18070 20 2f 2a 20 49 6e 64 65 78 20 69 6e 20 70 50 61   /* Index in pPa
18080 72 65 6e 74 2d 3e 70 53 72 63 20 6f 66 20 74 68  rent->pSrc of th
18090 69 73 20 71 75 65 72 79 20 2a 2f 0a 20 20 69 6e  is query */.  in
180a0 74 20 2a 70 50 61 72 65 6e 74 41 67 67 2c 20 20  t *pParentAgg,  
180b0 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20       /* True if 
180c0 70 50 61 72 65 6e 74 20 75 73 65 73 20 61 67 67  pParent uses agg
180d0 72 65 67 61 74 65 20 66 75 6e 63 74 69 6f 6e 73  regate functions
180e0 20 2a 2f 0a 20 20 63 68 61 72 20 2a 61 66 66 20   */.  char *aff 
180f0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
18100 49 66 20 65 44 65 73 74 20 69 73 20 53 52 54 5f  If eDest is SRT_
18110 55 6e 69 6f 6e 2c 20 74 68 65 20 61 66 66 69 6e  Union, the affin
18120 69 74 79 20 73 74 72 69 6e 67 20 2a 2f 0a 29 7b  ity string */.){
18130 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 20 20 20 20  .  int i, j;    
18140 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f            /* Loo
18150 70 20 63 6f 75 6e 74 65 72 73 20 2a 2f 0a 20 20  p counters */.  
18160 57 68 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66  WhereInfo *pWInf
18170 6f 3b 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e  o;     /* Return
18180 20 66 72 6f 6d 20 73 71 6c 69 74 65 33 57 68 65   from sqlite3Whe
18190 72 65 42 65 67 69 6e 28 29 20 2a 2f 0a 20 20 56  reBegin() */.  V
181a0 64 62 65 20 2a 76 3b 20 20 20 20 20 20 20 20 20  dbe *v;         
181b0 20 20 20 20 20 20 2f 2a 20 54 68 65 20 76 69 72        /* The vir
181c0 74 75 61 6c 20 6d 61 63 68 69 6e 65 20 75 6e 64  tual machine und
181d0 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 20  er construction 
181e0 2a 2f 0a 20 20 69 6e 74 20 69 73 41 67 67 3b 20  */.  int isAgg; 
181f0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
18200 72 75 65 20 66 6f 72 20 73 65 6c 65 63 74 20 6c  rue for select l
18210 69 73 74 73 20 6c 69 6b 65 20 22 63 6f 75 6e 74  ists like "count
18220 28 2a 29 22 20 2a 2f 0a 20 20 45 78 70 72 4c 69  (*)" */.  ExprLi
18230 73 74 20 2a 70 45 4c 69 73 74 3b 20 20 20 20 20  st *pEList;     
18240 20 2f 2a 20 4c 69 73 74 20 6f 66 20 63 6f 6c 75   /* List of colu
18250 6d 6e 73 20 74 6f 20 65 78 74 72 61 63 74 2e 20  mns to extract. 
18260 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 54  */.  SrcList *pT
18270 61 62 4c 69 73 74 3b 20 20 20 20 20 2f 2a 20 4c  abList;     /* L
18280 69 73 74 20 6f 66 20 74 61 62 6c 65 73 20 74 6f  ist of tables to
18290 20 73 65 6c 65 63 74 20 66 72 6f 6d 20 2a 2f 0a   select from */.
182a0 20 20 45 78 70 72 20 2a 70 57 68 65 72 65 3b 20    Expr *pWhere; 
182b0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
182c0 57 48 45 52 45 20 63 6c 61 75 73 65 2e 20 20 4d  WHERE clause.  M
182d0 61 79 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20  ay be NULL */.  
182e0 45 78 70 72 4c 69 73 74 20 2a 70 4f 72 64 65 72  ExprList *pOrder
182f0 42 79 3b 20 20 20 20 2f 2a 20 54 68 65 20 4f 52  By;    /* The OR
18300 44 45 52 20 42 59 20 63 6c 61 75 73 65 2e 20 20  DER BY clause.  
18310 4d 61 79 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20  May be NULL */. 
18320 20 45 78 70 72 4c 69 73 74 20 2a 70 47 72 6f 75   ExprList *pGrou
18330 70 42 79 3b 20 20 20 20 2f 2a 20 54 68 65 20 47  pBy;    /* The G
18340 52 4f 55 50 20 42 59 20 63 6c 61 75 73 65 2e 20  ROUP BY clause. 
18350 20 4d 61 79 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a   May be NULL */.
18360 20 20 45 78 70 72 20 2a 70 48 61 76 69 6e 67 3b    Expr *pHaving;
18370 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
18380 48 41 56 49 4e 47 20 63 6c 61 75 73 65 2e 20 20  HAVING clause.  
18390 4d 61 79 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20  May be NULL */. 
183a0 20 69 6e 74 20 69 73 44 69 73 74 69 6e 63 74 3b   int isDistinct;
183b0 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
183c0 69 66 20 74 68 65 20 44 49 53 54 49 4e 43 54 20  if the DISTINCT 
183d0 6b 65 79 77 6f 72 64 20 69 73 20 70 72 65 73 65  keyword is prese
183e0 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 64 69 73 74  nt */.  int dist
183f0 69 6e 63 74 3b 20 20 20 20 20 20 20 20 20 20 2f  inct;          /
18400 2a 20 54 61 62 6c 65 20 74 6f 20 75 73 65 20 66  * Table to use f
18410 6f 72 20 74 68 65 20 64 69 73 74 69 6e 63 74 20  or the distinct 
18420 73 65 74 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20  set */.  int rc 
18430 3d 20 31 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 1;            
18440 2f 2a 20 56 61 6c 75 65 20 74 6f 20 72 65 74 75  /* Value to retu
18450 72 6e 20 66 72 6f 6d 20 74 68 69 73 20 66 75 6e  rn from this fun
18460 63 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 61  ction */.  int a
18470 64 64 72 53 6f 72 74 49 6e 64 65 78 3b 20 20 20  ddrSortIndex;   
18480 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20    /* Address of 
18490 61 6e 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65  an OP_OpenEpheme
184a0 72 61 6c 20 69 6e 73 74 72 75 63 74 69 6f 6e 20  ral instruction 
184b0 2a 2f 0a 20 20 41 67 67 49 6e 66 6f 20 73 41 67  */.  AggInfo sAg
184c0 67 49 6e 66 6f 3b 20 20 20 20 20 20 2f 2a 20 49  gInfo;      /* I
184d0 6e 66 6f 72 6d 61 74 69 6f 6e 20 75 73 65 64 20  nformation used 
184e0 62 79 20 61 67 67 72 65 67 61 74 65 20 71 75 65  by aggregate que
184f0 72 69 65 73 20 2a 2f 0a 20 20 69 6e 74 20 69 45  ries */.  int iE
18500 6e 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  nd;             
18510 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20 74   /* Address of t
18520 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 71 75  he end of the qu
18530 65 72 79 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ery */.  sqlite3
18540 20 2a 64 62 3b 20 20 20 20 20 20 20 20 20 20 20   *db;           
18550 2f 2a 20 54 68 65 20 64 61 74 61 62 61 73 65 20  /* The database 
18560 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 0a 20  connection */.. 
18570 20 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62   db = pParse->db
18580 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 7c 7c 20  ;.  if( p==0 || 
18590 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
185a0 20 7c 7c 20 70 50 61 72 73 65 2d 3e 6e 45 72 72   || pParse->nErr
185b0 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 31   ){.    return 1
185c0 3b 0a 20 20 7d 0a 20 20 69 66 28 20 73 71 6c 69  ;.  }.  if( sqli
185d0 74 65 33 41 75 74 68 43 68 65 63 6b 28 70 50 61  te3AuthCheck(pPa
185e0 72 73 65 2c 20 53 51 4c 49 54 45 5f 53 45 4c 45  rse, SQLITE_SELE
185f0 43 54 2c 20 30 2c 20 30 2c 20 30 29 20 29 20 72  CT, 0, 0, 0) ) r
18600 65 74 75 72 6e 20 31 3b 0a 20 20 6d 65 6d 73 65  eturn 1;.  memse
18610 74 28 26 73 41 67 67 49 6e 66 6f 2c 20 30 2c 20  t(&sAggInfo, 0, 
18620 73 69 7a 65 6f 66 28 73 41 67 67 49 6e 66 6f 29  sizeof(sAggInfo)
18630 29 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  );..#ifndef SQLI
18640 54 45 5f 4f 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44  TE_OMIT_COMPOUND
18650 5f 53 45 4c 45 43 54 0a 20 20 2f 2a 20 49 66 20  _SELECT.  /* If 
18660 74 68 65 72 65 20 69 73 20 61 72 65 20 61 20 73  there is are a s
18670 65 71 75 65 6e 63 65 20 6f 66 20 71 75 65 72 69  equence of queri
18680 65 73 2c 20 64 6f 20 74 68 65 20 65 61 72 6c 69  es, do the earli
18690 65 72 20 6f 6e 65 73 20 66 69 72 73 74 2e 0a 20  er ones first.. 
186a0 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 70 50 72   */.  if( p->pPr
186b0 69 6f 72 20 29 7b 0a 20 20 20 20 69 66 28 20 70  ior ){.    if( p
186c0 2d 3e 70 52 69 67 68 74 6d 6f 73 74 3d 3d 30 20  ->pRightmost==0 
186d0 29 7b 0a 20 20 20 20 20 20 53 65 6c 65 63 74 20  ){.      Select 
186e0 2a 70 4c 6f 6f 70 3b 0a 20 20 20 20 20 20 69 6e  *pLoop;.      in
186f0 74 20 63 6e 74 20 3d 20 30 3b 0a 20 20 20 20 20  t cnt = 0;.     
18700 20 66 6f 72 28 70 4c 6f 6f 70 3d 70 3b 20 70 4c   for(pLoop=p; pL
18710 6f 6f 70 3b 20 70 4c 6f 6f 70 3d 70 4c 6f 6f 70  oop; pLoop=pLoop
18720 2d 3e 70 50 72 69 6f 72 2c 20 63 6e 74 2b 2b 29  ->pPrior, cnt++)
18730 7b 0a 20 20 20 20 20 20 20 20 70 4c 6f 6f 70 2d  {.        pLoop-
18740 3e 70 52 69 67 68 74 6d 6f 73 74 20 3d 20 70 3b  >pRightmost = p;
18750 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
18760 66 28 20 53 51 4c 49 54 45 5f 4d 41 58 5f 43 4f  f( SQLITE_MAX_CO
18770 4d 50 4f 55 4e 44 5f 53 45 4c 45 43 54 3e 30 20  MPOUND_SELECT>0 
18780 26 26 20 63 6e 74 3e 53 51 4c 49 54 45 5f 4d 41  && cnt>SQLITE_MA
18790 58 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45 43  X_COMPOUND_SELEC
187a0 54 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  T ){.        sql
187b0 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
187c0 72 73 65 2c 20 22 74 6f 6f 20 6d 61 6e 79 20 74  rse, "too many t
187d0 65 72 6d 73 20 69 6e 20 63 6f 6d 70 6f 75 6e 64  erms in compound
187e0 20 53 45 4c 45 43 54 22 29 3b 0a 20 20 20 20 20   SELECT");.     
187f0 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20     return 1;.   
18800 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 72     }.    }.    r
18810 65 74 75 72 6e 20 6d 75 6c 74 69 53 65 6c 65 63  eturn multiSelec
18820 74 28 70 50 61 72 73 65 2c 20 70 2c 20 65 44 65  t(pParse, p, eDe
18830 73 74 2c 20 69 50 61 72 6d 2c 20 61 66 66 29 3b  st, iParm, aff);
18840 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 70  .  }.#endif..  p
18850 4f 72 64 65 72 42 79 20 3d 20 70 2d 3e 70 4f 72  OrderBy = p->pOr
18860 64 65 72 42 79 3b 0a 20 20 69 66 28 20 49 67 6e  derBy;.  if( Ign
18870 6f 72 61 62 6c 65 4f 72 64 65 72 62 79 28 65 44  orableOrderby(eD
18880 65 73 74 29 20 29 7b 0a 20 20 20 20 70 2d 3e 70  est) ){.    p->p
18890 4f 72 64 65 72 42 79 20 3d 20 30 3b 0a 20 20 7d  OrderBy = 0;.  }
188a0 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 65  .  if( sqlite3Se
188b0 6c 65 63 74 52 65 73 6f 6c 76 65 28 70 50 61 72  lectResolve(pPar
188c0 73 65 2c 20 70 2c 20 30 29 20 29 7b 0a 20 20 20  se, p, 0) ){.   
188d0 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64   goto select_end
188e0 3b 0a 20 20 7d 0a 20 20 70 2d 3e 70 4f 72 64 65  ;.  }.  p->pOrde
188f0 72 42 79 20 3d 20 70 4f 72 64 65 72 42 79 3b 0a  rBy = pOrderBy;.
18900 0a 20 20 2f 2a 20 4d 61 6b 65 20 6c 6f 63 61 6c  .  /* Make local
18910 20 63 6f 70 69 65 73 20 6f 66 20 74 68 65 20 70   copies of the p
18920 61 72 61 6d 65 74 65 72 73 20 66 6f 72 20 74 68  arameters for th
18930 69 73 20 71 75 65 72 79 2e 0a 20 20 2a 2f 0a 20  is query..  */. 
18940 20 70 54 61 62 4c 69 73 74 20 3d 20 70 2d 3e 70   pTabList = p->p
18950 53 72 63 3b 0a 20 20 70 57 68 65 72 65 20 3d 20  Src;.  pWhere = 
18960 70 2d 3e 70 57 68 65 72 65 3b 0a 20 20 70 47 72  p->pWhere;.  pGr
18970 6f 75 70 42 79 20 3d 20 70 2d 3e 70 47 72 6f 75  oupBy = p->pGrou
18980 70 42 79 3b 0a 20 20 70 48 61 76 69 6e 67 20 3d  pBy;.  pHaving =
18990 20 70 2d 3e 70 48 61 76 69 6e 67 3b 0a 20 20 69   p->pHaving;.  i
189a0 73 41 67 67 20 3d 20 70 2d 3e 69 73 41 67 67 3b  sAgg = p->isAgg;
189b0 0a 20 20 69 73 44 69 73 74 69 6e 63 74 20 3d 20  .  isDistinct = 
189c0 70 2d 3e 69 73 44 69 73 74 69 6e 63 74 3b 0a 20  p->isDistinct;. 
189d0 20 70 45 4c 69 73 74 20 3d 20 70 2d 3e 70 45 4c   pEList = p->pEL
189e0 69 73 74 3b 0a 20 20 69 66 28 20 70 45 4c 69 73  ist;.  if( pELis
189f0 74 3d 3d 30 20 29 20 67 6f 74 6f 20 73 65 6c 65  t==0 ) goto sele
18a00 63 74 5f 65 6e 64 3b 0a 0a 20 20 2f 2a 20 0a 20  ct_end;..  /* . 
18a10 20 2a 2a 20 44 6f 20 6e 6f 74 20 65 76 65 6e 20   ** Do not even 
18a20 61 74 74 65 6d 70 74 20 74 6f 20 67 65 6e 65 72  attempt to gener
18a30 61 74 65 20 61 6e 79 20 63 6f 64 65 20 69 66 20  ate any code if 
18a40 77 65 20 68 61 76 65 20 61 6c 72 65 61 64 79 20  we have already 
18a50 73 65 65 6e 0a 20 20 2a 2a 20 65 72 72 6f 72 73  seen.  ** errors
18a60 20 62 65 66 6f 72 65 20 74 68 69 73 20 72 6f 75   before this rou
18a70 74 69 6e 65 20 73 74 61 72 74 73 2e 0a 20 20 2a  tine starts..  *
18a80 2f 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e  /.  if( pParse->
18a90 6e 45 72 72 3e 30 20 29 20 67 6f 74 6f 20 73 65  nErr>0 ) goto se
18aa0 6c 65 63 74 5f 65 6e 64 3b 0a 0a 20 20 2f 2a 20  lect_end;..  /* 
18ab0 49 66 20 77 72 69 74 69 6e 67 20 74 6f 20 6d 65  If writing to me
18ac0 6d 6f 72 79 20 6f 72 20 67 65 6e 65 72 61 74 69  mory or generati
18ad0 6e 67 20 61 20 73 65 74 0a 20 20 2a 2a 20 6f 6e  ng a set.  ** on
18ae0 6c 79 20 61 20 73 69 6e 67 6c 65 20 63 6f 6c 75  ly a single colu
18af0 6d 6e 20 6d 61 79 20 62 65 20 6f 75 74 70 75 74  mn may be output
18b00 2e 0a 20 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53  ..  */.#ifndef S
18b10 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55  QLITE_OMIT_SUBQU
18b20 45 52 59 0a 20 20 69 66 28 20 63 68 65 63 6b 46  ERY.  if( checkF
18b30 6f 72 4d 75 6c 74 69 43 6f 6c 75 6d 6e 53 65 6c  orMultiColumnSel
18b40 65 63 74 45 72 72 6f 72 28 70 50 61 72 73 65 2c  ectError(pParse,
18b50 20 65 44 65 73 74 2c 20 70 45 4c 69 73 74 2d 3e   eDest, pEList->
18b60 6e 45 78 70 72 29 20 29 7b 0a 20 20 20 20 67 6f  nExpr) ){.    go
18b70 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20  to select_end;. 
18b80 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20   }.#endif..  /* 
18b90 4f 52 44 45 52 20 42 59 20 69 73 20 69 67 6e 6f  ORDER BY is igno
18ba0 72 65 64 20 66 6f 72 20 73 6f 6d 65 20 64 65 73  red for some des
18bb0 74 69 6e 61 74 69 6f 6e 73 2e 0a 20 20 2a 2f 0a  tinations..  */.
18bc0 20 20 69 66 28 20 49 67 6e 6f 72 61 62 6c 65 4f    if( IgnorableO
18bd0 72 64 65 72 62 79 28 65 44 65 73 74 29 20 29 7b  rderby(eDest) ){
18be0 0a 20 20 20 20 70 4f 72 64 65 72 42 79 20 3d 20  .    pOrderBy = 
18bf0 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 42 65 67  0;.  }..  /* Beg
18c00 69 6e 20 67 65 6e 65 72 61 74 69 6e 67 20 63 6f  in generating co
18c10 64 65 2e 0a 20 20 2a 2f 0a 20 20 76 20 3d 20 73  de..  */.  v = s
18c20 71 6c 69 74 65 33 47 65 74 56 64 62 65 28 70 50  qlite3GetVdbe(pP
18c30 61 72 73 65 29 3b 0a 20 20 69 66 28 20 76 3d 3d  arse);.  if( v==
18c40 30 20 29 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f  0 ) goto select_
18c50 65 6e 64 3b 0a 0a 20 20 2f 2a 20 47 65 6e 65 72  end;..  /* Gener
18c60 61 74 65 20 63 6f 64 65 20 66 6f 72 20 61 6c 6c  ate code for all
18c70 20 73 75 62 2d 71 75 65 72 69 65 73 20 69 6e 20   sub-queries in 
18c80 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 0a  the FROM clause.
18c90 20 20 2a 2f 0a 23 69 66 20 21 64 65 66 69 6e 65    */.#if !define
18ca0 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55  d(SQLITE_OMIT_SU
18cb0 42 51 55 45 52 59 29 20 7c 7c 20 21 64 65 66 69  BQUERY) || !defi
18cc0 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
18cd0 56 49 45 57 29 0a 20 20 66 6f 72 28 69 3d 30 3b  VIEW).  for(i=0;
18ce0 20 69 3c 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72   i<pTabList->nSr
18cf0 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 63 6f 6e  c; i++){.    con
18d00 73 74 20 63 68 61 72 20 2a 7a 53 61 76 65 64 41  st char *zSavedA
18d10 75 74 68 43 6f 6e 74 65 78 74 20 3d 20 30 3b 0a  uthContext = 0;.
18d20 20 20 20 20 69 6e 74 20 6e 65 65 64 52 65 73 74      int needRest
18d30 6f 72 65 43 6f 6e 74 65 78 74 3b 0a 20 20 20 20  oreContext;.    
18d40 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69  struct SrcList_i
18d50 74 65 6d 20 2a 70 49 74 65 6d 20 3d 20 26 70 54  tem *pItem = &pT
18d60 61 62 4c 69 73 74 2d 3e 61 5b 69 5d 3b 0a 0a 20  abList->a[i];.. 
18d70 20 20 20 69 66 28 20 70 49 74 65 6d 2d 3e 70 53     if( pItem->pS
18d80 65 6c 65 63 74 3d 3d 30 20 7c 7c 20 70 49 74 65  elect==0 || pIte
18d90 6d 2d 3e 69 73 50 6f 70 75 6c 61 74 65 64 20 29  m->isPopulated )
18da0 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69   continue;.    i
18db0 66 28 20 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65 21  f( pItem->zName!
18dc0 3d 30 20 29 7b 0a 20 20 20 20 20 20 7a 53 61 76  =0 ){.      zSav
18dd0 65 64 41 75 74 68 43 6f 6e 74 65 78 74 20 3d 20  edAuthContext = 
18de0 70 50 61 72 73 65 2d 3e 7a 41 75 74 68 43 6f 6e  pParse->zAuthCon
18df0 74 65 78 74 3b 0a 20 20 20 20 20 20 70 50 61 72  text;.      pPar
18e00 73 65 2d 3e 7a 41 75 74 68 43 6f 6e 74 65 78 74  se->zAuthContext
18e10 20 3d 20 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65 3b   = pItem->zName;
18e20 0a 20 20 20 20 20 20 6e 65 65 64 52 65 73 74 6f  .      needResto
18e30 72 65 43 6f 6e 74 65 78 74 20 3d 20 31 3b 0a 20  reContext = 1;. 
18e40 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
18e50 6e 65 65 64 52 65 73 74 6f 72 65 43 6f 6e 74 65  needRestoreConte
18e60 78 74 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 23 69  xt = 0;.    }.#i
18e70 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f 45 58 50  f SQLITE_MAX_EXP
18e80 52 5f 44 45 50 54 48 3e 30 0a 20 20 20 20 2f 2a  R_DEPTH>0.    /*
18e90 20 49 6e 63 72 65 6d 65 6e 74 20 50 61 72 73 65   Increment Parse
18ea0 2e 6e 48 65 69 67 68 74 20 62 79 20 74 68 65 20  .nHeight by the 
18eb0 68 65 69 67 68 74 20 6f 66 20 74 68 65 20 6c 61  height of the la
18ec0 72 67 65 73 74 20 65 78 70 72 65 73 73 69 6f 6e  rgest expression
18ed0 0a 20 20 20 20 2a 2a 20 74 72 65 65 20 72 65 66  .    ** tree ref
18ee0 65 72 65 64 20 74 6f 20 62 79 20 74 68 69 73 2c  ered to by this,
18ef0 20 74 68 65 20 70 61 72 65 6e 74 20 73 65 6c 65   the parent sele
18f00 63 74 2e 20 54 68 65 20 63 68 69 6c 64 20 73 65  ct. The child se
18f10 6c 65 63 74 0a 20 20 20 20 2a 2a 20 6d 61 79 20  lect.    ** may 
18f20 63 6f 6e 74 61 69 6e 20 65 78 70 72 65 73 73 69  contain expressi
18f30 6f 6e 20 74 72 65 65 73 20 6f 66 20 61 74 20 6d  on trees of at m
18f40 6f 73 74 0a 20 20 20 20 2a 2a 20 28 53 51 4c 49  ost.    ** (SQLI
18f50 54 45 5f 4d 41 58 5f 45 58 50 52 5f 44 45 50 54  TE_MAX_EXPR_DEPT
18f60 48 2d 50 61 72 73 65 2e 6e 48 65 69 67 68 74 29  H-Parse.nHeight)
18f70 20 68 65 69 67 68 74 2e 20 54 68 69 73 20 69 73   height. This is
18f80 20 61 20 62 69 74 0a 20 20 20 20 2a 2a 20 6d 6f   a bit.    ** mo
18f90 72 65 20 63 6f 6e 73 65 72 76 61 74 69 76 65 20  re conservative 
18fa0 74 68 61 6e 20 6e 65 63 65 73 73 61 72 79 2c 20  than necessary, 
18fb0 62 75 74 20 6d 75 63 68 20 65 61 73 69 65 72 20  but much easier 
18fc0 74 68 61 6e 20 65 6e 66 6f 72 63 69 6e 67 0a 20  than enforcing. 
18fd0 20 20 20 2a 2a 20 61 6e 20 65 78 61 63 74 20 6c     ** an exact l
18fe0 69 6d 69 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  imit..    */.   
18ff0 20 70 50 61 72 73 65 2d 3e 6e 48 65 69 67 68 74   pParse->nHeight
19000 20 2b 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63   += sqlite3Selec
19010 74 45 78 70 72 48 65 69 67 68 74 28 70 29 3b 0a  tExprHeight(p);.
19020 23 65 6e 64 69 66 0a 20 20 20 20 73 71 6c 69 74  #endif.    sqlit
19030 65 33 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c  e3Select(pParse,
19040 20 70 49 74 65 6d 2d 3e 70 53 65 6c 65 63 74 2c   pItem->pSelect,
19050 20 53 52 54 5f 45 70 68 65 6d 54 61 62 2c 20 0a   SRT_EphemTab, .
19060 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19070 20 70 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72 2c   pItem->iCursor,
19080 20 70 2c 20 69 2c 20 26 69 73 41 67 67 2c 20 30   p, i, &isAgg, 0
19090 29 3b 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41  );.#if SQLITE_MA
190a0 58 5f 45 58 50 52 5f 44 45 50 54 48 3e 30 0a 20  X_EXPR_DEPTH>0. 
190b0 20 20 20 70 50 61 72 73 65 2d 3e 6e 48 65 69 67     pParse->nHeig
190c0 68 74 20 2d 3d 20 73 71 6c 69 74 65 33 53 65 6c  ht -= sqlite3Sel
190d0 65 63 74 45 78 70 72 48 65 69 67 68 74 28 70 29  ectExprHeight(p)
190e0 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 69 66 28  ;.#endif.    if(
190f0 20 6e 65 65 64 52 65 73 74 6f 72 65 43 6f 6e 74   needRestoreCont
19100 65 78 74 20 29 7b 0a 20 20 20 20 20 20 70 50 61  ext ){.      pPa
19110 72 73 65 2d 3e 7a 41 75 74 68 43 6f 6e 74 65 78  rse->zAuthContex
19120 74 20 3d 20 7a 53 61 76 65 64 41 75 74 68 43 6f  t = zSavedAuthCo
19130 6e 74 65 78 74 3b 0a 20 20 20 20 7d 0a 20 20 20  ntext;.    }.   
19140 20 70 54 61 62 4c 69 73 74 20 3d 20 70 2d 3e 70   pTabList = p->p
19150 53 72 63 3b 0a 20 20 20 20 70 57 68 65 72 65 20  Src;.    pWhere 
19160 3d 20 70 2d 3e 70 57 68 65 72 65 3b 0a 20 20 20  = p->pWhere;.   
19170 20 69 66 28 20 21 49 67 6e 6f 72 61 62 6c 65 4f   if( !IgnorableO
19180 72 64 65 72 62 79 28 65 44 65 73 74 29 20 29 7b  rderby(eDest) ){
19190 0a 20 20 20 20 20 20 70 4f 72 64 65 72 42 79 20  .      pOrderBy 
191a0 3d 20 70 2d 3e 70 4f 72 64 65 72 42 79 3b 0a 20  = p->pOrderBy;. 
191b0 20 20 20 7d 0a 20 20 20 20 70 47 72 6f 75 70 42     }.    pGroupB
191c0 79 20 3d 20 70 2d 3e 70 47 72 6f 75 70 42 79 3b  y = p->pGroupBy;
191d0 0a 20 20 20 20 70 48 61 76 69 6e 67 20 3d 20 70  .    pHaving = p
191e0 2d 3e 70 48 61 76 69 6e 67 3b 0a 20 20 20 20 69  ->pHaving;.    i
191f0 73 44 69 73 74 69 6e 63 74 20 3d 20 70 2d 3e 69  sDistinct = p->i
19200 73 44 69 73 74 69 6e 63 74 3b 0a 20 20 7d 0a 23  sDistinct;.  }.#
19210 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 43 68 65 63  endif..  /* Chec
19220 6b 20 66 6f 72 20 74 68 65 20 73 70 65 63 69 61  k for the specia
19230 6c 20 63 61 73 65 20 6f 66 20 61 20 6d 69 6e 28  l case of a min(
19240 29 20 6f 72 20 6d 61 78 28 29 20 66 75 6e 63 74  ) or max() funct
19250 69 6f 6e 20 62 79 20 69 74 73 65 6c 66 0a 20 20  ion by itself.  
19260 2a 2a 20 69 6e 20 74 68 65 20 72 65 73 75 6c 74  ** in the result
19270 20 73 65 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28   set..  */.  if(
19280 20 73 69 6d 70 6c 65 4d 69 6e 4d 61 78 51 75 65   simpleMinMaxQue
19290 72 79 28 70 50 61 72 73 65 2c 20 70 2c 20 65 44  ry(pParse, p, eD
192a0 65 73 74 2c 20 69 50 61 72 6d 29 20 29 7b 0a 20  est, iParm) ){. 
192b0 20 20 20 72 63 20 3d 20 30 3b 0a 20 20 20 20 67     rc = 0;.    g
192c0 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a  oto select_end;.
192d0 20 20 7d 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20    }..  /* Check 
192e0 74 6f 20 73 65 65 20 69 66 20 74 68 69 73 20 69  to see if this i
192f0 73 20 61 20 73 75 62 71 75 65 72 79 20 74 68 61  s a subquery tha
19300 74 20 63 61 6e 20 62 65 20 22 66 6c 61 74 74 65  t can be "flatte
19310 6e 65 64 22 20 69 6e 74 6f 20 69 74 73 20 70 61  ned" into its pa
19320 72 65 6e 74 2e 0a 20 20 2a 2a 20 49 66 20 66 6c  rent..  ** If fl
19330 61 74 74 65 6e 69 6e 67 20 69 73 20 61 20 70 6f  attening is a po
19340 73 73 69 62 6c 69 74 79 2c 20 64 6f 20 73 6f 20  ssiblity, do so 
19350 61 6e 64 20 72 65 74 75 72 6e 20 69 6d 6d 65 64  and return immed
19360 69 61 74 65 6c 79 2e 20 20 0a 20 20 2a 2f 0a 23  iately.  .  */.#
19370 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
19380 49 54 5f 56 49 45 57 0a 20 20 69 66 28 20 70 50  IT_VIEW.  if( pP
19390 61 72 65 6e 74 20 26 26 20 70 50 61 72 65 6e 74  arent && pParent
193a0 41 67 67 20 26 26 0a 20 20 20 20 20 20 66 6c 61  Agg &&.      fla
193b0 74 74 65 6e 53 75 62 71 75 65 72 79 28 64 62 2c  ttenSubquery(db,
193c0 20 70 50 61 72 65 6e 74 2c 20 70 61 72 65 6e 74   pParent, parent
193d0 54 61 62 2c 20 2a 70 50 61 72 65 6e 74 41 67 67  Tab, *pParentAgg
193e0 2c 20 69 73 41 67 67 29 20 29 7b 0a 20 20 20 20  , isAgg) ){.    
193f0 69 66 28 20 69 73 41 67 67 20 29 20 2a 70 50 61  if( isAgg ) *pPa
19400 72 65 6e 74 41 67 67 20 3d 20 31 3b 0a 20 20 20  rentAgg = 1;.   
19410 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64   goto select_end
19420 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20  ;.  }.#endif..  
19430 2f 2a 20 49 66 20 74 68 65 72 65 20 69 73 20 61  /* If there is a
19440 6e 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73  n ORDER BY claus
19450 65 2c 20 74 68 65 6e 20 74 68 69 73 20 73 6f 72  e, then this sor
19460 74 69 6e 67 0a 20 20 2a 2a 20 69 6e 64 65 78 20  ting.  ** index 
19470 6d 69 67 68 74 20 65 6e 64 20 75 70 20 62 65 69  might end up bei
19480 6e 67 20 75 6e 75 73 65 64 20 69 66 20 74 68 65  ng unused if the
19490 20 64 61 74 61 20 63 61 6e 20 62 65 20 0a 20 20   data can be .  
194a0 2a 2a 20 65 78 74 72 61 63 74 65 64 20 69 6e 20  ** extracted in 
194b0 70 72 65 2d 73 6f 72 74 65 64 20 6f 72 64 65 72  pre-sorted order
194c0 2e 20 20 49 66 20 74 68 61 74 20 69 73 20 74 68  .  If that is th
194d0 65 20 63 61 73 65 2c 20 74 68 65 6e 20 74 68 65  e case, then the
194e0 0a 20 20 2a 2a 20 4f 50 5f 4f 70 65 6e 45 70 68  .  ** OP_OpenEph
194f0 65 6d 65 72 61 6c 20 69 6e 73 74 72 75 63 74 69  emeral instructi
19500 6f 6e 20 77 69 6c 6c 20 62 65 20 63 68 61 6e 67  on will be chang
19510 65 64 20 74 6f 20 61 6e 20 4f 50 5f 4e 6f 6f 70  ed to an OP_Noop
19520 20 6f 6e 63 65 0a 20 20 2a 2a 20 77 65 20 66 69   once.  ** we fi
19530 67 75 72 65 20 6f 75 74 20 74 68 61 74 20 74 68  gure out that th
19540 65 20 73 6f 72 74 69 6e 67 20 69 6e 64 65 78 20  e sorting index 
19550 69 73 20 6e 6f 74 20 6e 65 65 64 65 64 2e 20 20  is not needed.  
19560 54 68 65 20 61 64 64 72 53 6f 72 74 49 6e 64 65  The addrSortInde
19570 78 0a 20 20 2a 2a 20 76 61 72 69 61 62 6c 65 20  x.  ** variable 
19580 69 73 20 75 73 65 64 20 74 6f 20 66 61 63 69 6c  is used to facil
19590 69 74 61 74 65 20 74 68 61 74 20 63 68 61 6e 67  itate that chang
195a0 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 4f  e..  */.  if( pO
195b0 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20 4b 65  rderBy ){.    Ke
195c0 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 3b  yInfo *pKeyInfo;
195d0 0a 20 20 20 20 69 66 28 20 70 50 61 72 73 65 2d  .    if( pParse-
195e0 3e 6e 45 72 72 20 29 7b 0a 20 20 20 20 20 20 67  >nErr ){.      g
195f0 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a  oto select_end;.
19600 20 20 20 20 7d 0a 20 20 20 20 70 4b 65 79 49 6e      }.    pKeyIn
19610 66 6f 20 3d 20 6b 65 79 49 6e 66 6f 46 72 6f 6d  fo = keyInfoFrom
19620 45 78 70 72 4c 69 73 74 28 70 50 61 72 73 65 2c  ExprList(pParse,
19630 20 70 4f 72 64 65 72 42 79 29 3b 0a 20 20 20 20   pOrderBy);.    
19640 70 4f 72 64 65 72 42 79 2d 3e 69 45 43 75 72 73  pOrderBy->iECurs
19650 6f 72 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61  or = pParse->nTa
19660 62 2b 2b 3b 0a 20 20 20 20 70 2d 3e 61 64 64 72  b++;.    p->addr
19670 4f 70 65 6e 45 70 68 6d 5b 32 5d 20 3d 20 61 64  OpenEphm[2] = ad
19680 64 72 53 6f 72 74 49 6e 64 65 78 20 3d 0a 20 20  drSortIndex =.  
19690 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4f      sqlite3VdbeO
196a0 70 33 28 76 2c 20 4f 50 5f 4f 70 65 6e 45 70 68  p3(v, OP_OpenEph
196b0 65 6d 65 72 61 6c 2c 20 70 4f 72 64 65 72 42 79  emeral, pOrderBy
196c0 2d 3e 69 45 43 75 72 73 6f 72 2c 20 70 4f 72 64  ->iECursor, pOrd
196d0 65 72 42 79 2d 3e 6e 45 78 70 72 2b 32 2c 20 20  erBy->nExpr+2,  
196e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
196f0 20 20 20 28 63 68 61 72 2a 29 70 4b 65 79 49 6e     (char*)pKeyIn
19700 66 6f 2c 20 50 33 5f 4b 45 59 49 4e 46 4f 5f 48  fo, P3_KEYINFO_H
19710 41 4e 44 4f 46 46 29 3b 0a 20 20 7d 65 6c 73 65  ANDOFF);.  }else
19720 7b 0a 20 20 20 20 61 64 64 72 53 6f 72 74 49 6e  {.    addrSortIn
19730 64 65 78 20 3d 20 2d 31 3b 0a 20 20 7d 0a 0a 20  dex = -1;.  }.. 
19740 20 2f 2a 20 49 66 20 74 68 65 20 6f 75 74 70 75   /* If the outpu
19750 74 20 69 73 20 64 65 73 74 69 6e 65 64 20 66 6f  t is destined fo
19760 72 20 61 20 74 65 6d 70 6f 72 61 72 79 20 74 61  r a temporary ta
19770 62 6c 65 2c 20 6f 70 65 6e 20 74 68 61 74 20 74  ble, open that t
19780 61 62 6c 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  able..  */.  if(
19790 20 65 44 65 73 74 3d 3d 53 52 54 5f 45 70 68 65   eDest==SRT_Ephe
197a0 6d 54 61 62 20 29 7b 0a 20 20 20 20 73 71 6c 69  mTab ){.    sqli
197b0 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
197c0 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c  OP_OpenEphemeral
197d0 2c 20 69 50 61 72 6d 2c 20 70 45 4c 69 73 74 2d  , iParm, pEList-
197e0 3e 6e 45 78 70 72 29 3b 0a 20 20 7d 0a 0a 20 20  >nExpr);.  }..  
197f0 2f 2a 20 53 65 74 20 74 68 65 20 6c 69 6d 69 74  /* Set the limit
19800 65 72 2e 0a 20 20 2a 2f 0a 20 20 69 45 6e 64 20  er..  */.  iEnd 
19810 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b  = sqlite3VdbeMak
19820 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 63 6f 6d  eLabel(v);.  com
19830 70 75 74 65 4c 69 6d 69 74 52 65 67 69 73 74 65  puteLimitRegiste
19840 72 73 28 70 50 61 72 73 65 2c 20 70 2c 20 69 45  rs(pParse, p, iE
19850 6e 64 29 3b 0a 0a 20 20 2f 2a 20 4f 70 65 6e 20  nd);..  /* Open 
19860 61 20 76 69 72 74 75 61 6c 20 69 6e 64 65 78 20  a virtual index 
19870 74 6f 20 75 73 65 20 66 6f 72 20 74 68 65 20 64  to use for the d
19880 69 73 74 69 6e 63 74 20 73 65 74 2e 0a 20 20 2a  istinct set..  *
19890 2f 0a 20 20 69 66 28 20 69 73 44 69 73 74 69 6e  /.  if( isDistin
198a0 63 74 20 29 7b 0a 20 20 20 20 4b 65 79 49 6e 66  ct ){.    KeyInf
198b0 6f 20 2a 70 4b 65 79 49 6e 66 6f 3b 0a 20 20 20  o *pKeyInfo;.   
198c0 20 64 69 73 74 69 6e 63 74 20 3d 20 70 50 61 72   distinct = pPar
198d0 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20  se->nTab++;.    
198e0 70 4b 65 79 49 6e 66 6f 20 3d 20 6b 65 79 49 6e  pKeyInfo = keyIn
198f0 66 6f 46 72 6f 6d 45 78 70 72 4c 69 73 74 28 70  foFromExprList(p
19900 50 61 72 73 65 2c 20 70 2d 3e 70 45 4c 69 73 74  Parse, p->pEList
19910 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
19920 62 65 4f 70 33 28 76 2c 20 4f 50 5f 4f 70 65 6e  beOp3(v, OP_Open
19930 45 70 68 65 6d 65 72 61 6c 2c 20 64 69 73 74 69  Ephemeral, disti
19940 6e 63 74 2c 20 30 2c 20 0a 20 20 20 20 20 20 20  nct, 0, .       
19950 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19960 20 28 63 68 61 72 2a 29 70 4b 65 79 49 6e 66 6f   (char*)pKeyInfo
19970 2c 20 50 33 5f 4b 45 59 49 4e 46 4f 5f 48 41 4e  , P3_KEYINFO_HAN
19980 44 4f 46 46 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  DOFF);.  }else{.
19990 20 20 20 20 64 69 73 74 69 6e 63 74 20 3d 20 2d      distinct = -
199a0 31 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 67 67  1;.  }..  /* Agg
199b0 72 65 67 61 74 65 20 61 6e 64 20 6e 6f 6e 2d 61  regate and non-a
199c0 67 67 72 65 67 61 74 65 20 71 75 65 72 69 65 73  ggregate queries
199d0 20 61 72 65 20 68 61 6e 64 6c 65 64 20 64 69 66   are handled dif
199e0 66 65 72 65 6e 74 6c 79 20 2a 2f 0a 20 20 69 66  ferently */.  if
199f0 28 20 21 69 73 41 67 67 20 26 26 20 70 47 72 6f  ( !isAgg && pGro
19a00 75 70 42 79 3d 3d 30 20 29 7b 0a 20 20 20 20 2f  upBy==0 ){.    /
19a10 2a 20 54 68 69 73 20 63 61 73 65 20 69 73 20 66  * This case is f
19a20 6f 72 20 6e 6f 6e 2d 61 67 67 72 65 67 61 74 65  or non-aggregate
19a30 20 71 75 65 72 69 65 73 0a 20 20 20 20 2a 2a 20   queries.    ** 
19a40 42 65 67 69 6e 20 74 68 65 20 64 61 74 61 62 61  Begin the databa
19a50 73 65 20 73 63 61 6e 0a 20 20 20 20 2a 2f 0a 20  se scan.    */. 
19a60 20 20 20 70 57 49 6e 66 6f 20 3d 20 73 71 6c 69     pWInfo = sqli
19a70 74 65 33 57 68 65 72 65 42 65 67 69 6e 28 70 50  te3WhereBegin(pP
19a80 61 72 73 65 2c 20 70 54 61 62 4c 69 73 74 2c 20  arse, pTabList, 
19a90 70 57 68 65 72 65 2c 20 26 70 4f 72 64 65 72 42  pWhere, &pOrderB
19aa0 79 29 3b 0a 20 20 20 20 69 66 28 20 70 57 49 6e  y);.    if( pWIn
19ab0 66 6f 3d 3d 30 20 29 20 67 6f 74 6f 20 73 65 6c  fo==0 ) goto sel
19ac0 65 63 74 5f 65 6e 64 3b 0a 0a 20 20 20 20 2f 2a  ect_end;..    /*
19ad0 20 49 66 20 73 6f 72 74 69 6e 67 20 69 6e 64 65   If sorting inde
19ae0 78 20 74 68 61 74 20 77 61 73 20 63 72 65 61 74  x that was creat
19af0 65 64 20 62 79 20 61 20 70 72 69 6f 72 20 4f 50  ed by a prior OP
19b00 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 20 0a  _OpenEphemeral .
19b10 20 20 20 20 2a 2a 20 69 6e 73 74 72 75 63 74 69      ** instructi
19b20 6f 6e 20 65 6e 64 65 64 20 75 70 20 6e 6f 74 20  on ended up not 
19b30 62 65 69 6e 67 20 6e 65 65 64 65 64 2c 20 74 68  being needed, th
19b40 65 6e 20 63 68 61 6e 67 65 20 74 68 65 20 4f 50  en change the OP
19b50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 0a 20  _OpenEphemeral. 
19b60 20 20 20 2a 2a 20 69 6e 74 6f 20 61 6e 20 4f 50     ** into an OP
19b70 5f 4e 6f 6f 70 2e 0a 20 20 20 20 2a 2f 0a 20 20  _Noop..    */.  
19b80 20 20 69 66 28 20 61 64 64 72 53 6f 72 74 49 6e    if( addrSortIn
19b90 64 65 78 3e 3d 30 20 26 26 20 70 4f 72 64 65 72  dex>=0 && pOrder
19ba0 42 79 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73  By==0 ){.      s
19bb0 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65  qlite3VdbeChange
19bc0 54 6f 4e 6f 6f 70 28 76 2c 20 61 64 64 72 53 6f  ToNoop(v, addrSo
19bd0 72 74 49 6e 64 65 78 2c 20 31 29 3b 0a 20 20 20  rtIndex, 1);.   
19be0 20 20 20 70 2d 3e 61 64 64 72 4f 70 65 6e 45 70     p->addrOpenEp
19bf0 68 6d 5b 32 5d 20 3d 20 2d 31 3b 0a 20 20 20 20  hm[2] = -1;.    
19c00 7d 0a 0a 20 20 20 20 2f 2a 20 55 73 65 20 74 68  }..    /* Use th
19c10 65 20 73 74 61 6e 64 61 72 64 20 69 6e 6e 65 72  e standard inner
19c20 20 6c 6f 6f 70 0a 20 20 20 20 2a 2f 0a 20 20 20   loop.    */.   
19c30 20 69 66 28 20 73 65 6c 65 63 74 49 6e 6e 65 72   if( selectInner
19c40 4c 6f 6f 70 28 70 50 61 72 73 65 2c 20 70 2c 20  Loop(pParse, p, 
19c50 70 45 4c 69 73 74 2c 20 30 2c 20 30 2c 20 70 4f  pEList, 0, 0, pO
19c60 72 64 65 72 42 79 2c 20 64 69 73 74 69 6e 63 74  rderBy, distinct
19c70 2c 20 65 44 65 73 74 2c 0a 20 20 20 20 20 20 20  , eDest,.       
19c80 20 20 20 20 20 20 20 20 20 20 20 20 20 69 50 61               iPa
19c90 72 6d 2c 20 70 57 49 6e 66 6f 2d 3e 69 43 6f 6e  rm, pWInfo->iCon
19ca0 74 69 6e 75 65 2c 20 70 57 49 6e 66 6f 2d 3e 69  tinue, pWInfo->i
19cb0 42 72 65 61 6b 2c 20 61 66 66 29 20 29 7b 0a 20  Break, aff) ){. 
19cc0 20 20 20 20 20 20 67 6f 74 6f 20 73 65 6c 65 63        goto selec
19cd0 74 5f 65 6e 64 3b 0a 20 20 20 20 7d 0a 0a 20 20  t_end;.    }..  
19ce0 20 20 2f 2a 20 45 6e 64 20 74 68 65 20 64 61 74    /* End the dat
19cf0 61 62 61 73 65 20 73 63 61 6e 20 6c 6f 6f 70 2e  abase scan loop.
19d00 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73 71 6c 69  .    */.    sqli
19d10 74 65 33 57 68 65 72 65 45 6e 64 28 70 57 49 6e  te3WhereEnd(pWIn
19d20 66 6f 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  fo);.  }else{.  
19d30 20 20 2f 2a 20 54 68 69 73 20 69 73 20 74 68 65    /* This is the
19d40 20 70 72 6f 63 65 73 73 69 6e 67 20 66 6f 72 20   processing for 
19d50 61 67 67 72 65 67 61 74 65 20 71 75 65 72 69 65  aggregate querie
19d60 73 20 2a 2f 0a 20 20 20 20 4e 61 6d 65 43 6f 6e  s */.    NameCon
19d70 74 65 78 74 20 73 4e 43 3b 20 20 20 20 2f 2a 20  text sNC;    /* 
19d80 4e 61 6d 65 20 63 6f 6e 74 65 78 74 20 66 6f 72  Name context for
19d90 20 70 72 6f 63 65 73 73 69 6e 67 20 61 67 67 72   processing aggr
19da0 65 67 61 74 65 20 69 6e 66 6f 72 6d 61 74 69 6f  egate informatio
19db0 6e 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 41 4d  n */.    int iAM
19dc0 65 6d 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  em;          /* 
19dd0 46 69 72 73 74 20 4d 65 6d 20 61 64 64 72 65 73  First Mem addres
19de0 73 20 66 6f 72 20 73 74 6f 72 69 6e 67 20 63 75  s for storing cu
19df0 72 72 65 6e 74 20 47 52 4f 55 50 20 42 59 20 2a  rrent GROUP BY *
19e00 2f 0a 20 20 20 20 69 6e 74 20 69 42 4d 65 6d 3b  /.    int iBMem;
19e10 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72            /* Fir
19e20 73 74 20 4d 65 6d 20 61 64 64 72 65 73 73 20 66  st Mem address f
19e30 6f 72 20 70 72 65 76 69 6f 75 73 20 47 52 4f 55  or previous GROU
19e40 50 20 42 59 20 2a 2f 0a 20 20 20 20 69 6e 74 20  P BY */.    int 
19e50 69 55 73 65 46 6c 61 67 3b 20 20 20 20 20 20 20  iUseFlag;       
19e60 2f 2a 20 4d 65 6d 20 61 64 64 72 65 73 73 20 68  /* Mem address h
19e70 6f 6c 64 69 6e 67 20 66 6c 61 67 20 69 6e 64 69  olding flag indi
19e80 63 61 74 69 6e 67 20 74 68 61 74 20 61 74 20 6c  cating that at l
19e90 65 61 73 74 0a 20 20 20 20 20 20 20 20 20 20 20  east.           
19ea0 20 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20               ** 
19eb0 6f 6e 65 20 72 6f 77 20 6f 66 20 74 68 65 20 69  one row of the i
19ec0 6e 70 75 74 20 74 6f 20 74 68 65 20 61 67 67 72  nput to the aggr
19ed0 65 67 61 74 6f 72 20 68 61 73 20 62 65 65 6e 0a  egator has been.
19ee0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19ef0 20 20 20 20 20 20 20 20 2a 2a 20 70 72 6f 63 65          ** proce
19f00 73 73 65 64 20 2a 2f 0a 20 20 20 20 69 6e 74 20  ssed */.    int 
19f10 69 41 62 6f 72 74 46 6c 61 67 3b 20 20 20 20 20  iAbortFlag;     
19f20 2f 2a 20 4d 65 6d 20 61 64 64 72 65 73 73 20 77  /* Mem address w
19f30 68 69 63 68 20 63 61 75 73 65 73 20 71 75 65 72  hich causes quer
19f40 79 20 61 62 6f 72 74 20 69 66 20 70 6f 73 69 74  y abort if posit
19f50 69 76 65 20 2a 2f 0a 20 20 20 20 69 6e 74 20 67  ive */.    int g
19f60 72 6f 75 70 42 79 53 6f 72 74 3b 20 20 20 20 2f  roupBySort;    /
19f70 2a 20 52 6f 77 73 20 63 6f 6d 65 20 66 72 6f 6d  * Rows come from
19f80 20 73 6f 75 72 63 65 20 69 6e 20 47 52 4f 55 50   source in GROUP
19f90 20 42 59 20 6f 72 64 65 72 20 2a 2f 0a 0a 0a 20   BY order */... 
19fa0 20 20 20 2f 2a 20 54 68 65 20 66 6f 6c 6c 6f 77     /* The follow
19fb0 69 6e 67 20 76 61 72 69 61 62 6c 65 73 20 68 6f  ing variables ho
19fc0 6c 64 20 61 64 64 72 65 73 73 65 73 20 6f 72 20  ld addresses or 
19fd0 6c 61 62 65 6c 73 20 66 6f 72 20 70 61 72 74 73  labels for parts
19fe0 20 6f 66 20 74 68 65 0a 20 20 20 20 2a 2a 20 76   of the.    ** v
19ff0 69 72 74 75 61 6c 20 6d 61 63 68 69 6e 65 20 70  irtual machine p
1a000 72 6f 67 72 61 6d 20 77 65 20 61 72 65 20 70 75  rogram we are pu
1a010 74 74 69 6e 67 20 74 6f 67 65 74 68 65 72 20 2a  tting together *
1a020 2f 0a 20 20 20 20 69 6e 74 20 61 64 64 72 4f 75  /.    int addrOu
1a030 74 70 75 74 52 6f 77 3b 20 20 20 20 20 20 2f 2a  tputRow;      /*
1a040 20 53 74 61 72 74 20 6f 66 20 73 75 62 72 6f 75   Start of subrou
1a050 74 69 6e 65 20 74 68 61 74 20 6f 75 74 70 75 74  tine that output
1a060 73 20 61 20 72 65 73 75 6c 74 20 72 6f 77 20 2a  s a result row *
1a070 2f 0a 20 20 20 20 69 6e 74 20 61 64 64 72 53 65  /.    int addrSe
1a080 74 41 62 6f 72 74 3b 20 20 20 20 20 20 20 2f 2a  tAbort;       /*
1a090 20 53 65 74 20 74 68 65 20 61 62 6f 72 74 20 66   Set the abort f
1a0a0 6c 61 67 20 61 6e 64 20 72 65 74 75 72 6e 20 2a  lag and return *
1a0b0 2f 0a 20 20 20 20 69 6e 74 20 61 64 64 72 49 6e  /.    int addrIn
1a0c0 69 74 69 61 6c 69 7a 65 4c 6f 6f 70 3b 20 2f 2a  itializeLoop; /*
1a0d0 20 53 74 61 72 74 20 6f 66 20 63 6f 64 65 20 74   Start of code t
1a0e0 68 61 74 20 69 6e 69 74 69 61 6c 69 7a 65 73 20  hat initializes 
1a0f0 74 68 65 20 69 6e 70 75 74 20 6c 6f 6f 70 20 2a  the input loop *
1a100 2f 0a 20 20 20 20 69 6e 74 20 61 64 64 72 54 6f  /.    int addrTo
1a110 70 4f 66 4c 6f 6f 70 3b 20 20 20 20 20 20 2f 2a  pOfLoop;      /*
1a120 20 54 6f 70 20 6f 66 20 74 68 65 20 69 6e 70 75   Top of the inpu
1a130 74 20 6c 6f 6f 70 20 2a 2f 0a 20 20 20 20 69 6e  t loop */.    in
1a140 74 20 61 64 64 72 47 72 6f 75 70 42 79 43 68 61  t addrGroupByCha
1a150 6e 67 65 3b 20 20 2f 2a 20 43 6f 64 65 20 74 68  nge;  /* Code th
1a160 61 74 20 72 75 6e 73 20 77 68 65 6e 20 61 6e 79  at runs when any
1a170 20 47 52 4f 55 50 20 42 59 20 74 65 72 6d 20 63   GROUP BY term c
1a180 68 61 6e 67 65 73 20 2a 2f 0a 20 20 20 20 69 6e  hanges */.    in
1a190 74 20 61 64 64 72 50 72 6f 63 65 73 73 52 6f 77  t addrProcessRow
1a1a0 3b 20 20 20 20 20 2f 2a 20 43 6f 64 65 20 74 6f  ;     /* Code to
1a1b0 20 70 72 6f 63 65 73 73 20 61 20 73 69 6e 67 6c   process a singl
1a1c0 65 20 69 6e 70 75 74 20 72 6f 77 20 2a 2f 0a 20  e input row */. 
1a1d0 20 20 20 69 6e 74 20 61 64 64 72 45 6e 64 3b 20     int addrEnd; 
1a1e0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 6e             /* En
1a1f0 64 20 6f 66 20 61 6c 6c 20 70 72 6f 63 65 73 73  d of all process
1a200 69 6e 67 20 2a 2f 0a 20 20 20 20 69 6e 74 20 61  ing */.    int a
1a210 64 64 72 53 6f 72 74 69 6e 67 49 64 78 3b 20 20  ddrSortingIdx;  
1a220 20 20 20 2f 2a 20 54 68 65 20 4f 50 5f 4f 70 65     /* The OP_Ope
1a230 6e 45 70 68 65 6d 65 72 61 6c 20 66 6f 72 20 74  nEphemeral for t
1a240 68 65 20 73 6f 72 74 69 6e 67 20 69 6e 64 65 78  he sorting index
1a250 20 2a 2f 0a 20 20 20 20 69 6e 74 20 61 64 64 72   */.    int addr
1a260 52 65 73 65 74 3b 20 20 20 20 20 20 20 20 20 20  Reset;          
1a270 2f 2a 20 53 75 62 72 6f 75 74 69 6e 65 20 66 6f  /* Subroutine fo
1a280 72 20 72 65 73 65 74 74 69 6e 67 20 74 68 65 20  r resetting the 
1a290 61 63 63 75 6d 75 6c 61 74 6f 72 20 2a 2f 0a 0a  accumulator */..
1a2a0 20 20 20 20 61 64 64 72 45 6e 64 20 3d 20 73 71      addrEnd = sq
1a2b0 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62  lite3VdbeMakeLab
1a2c0 65 6c 28 76 29 3b 0a 0a 20 20 20 20 2f 2a 20 43  el(v);..    /* C
1a2d0 6f 6e 76 65 72 74 20 54 4b 5f 43 4f 4c 55 4d 4e  onvert TK_COLUMN
1a2e0 20 6e 6f 64 65 73 20 69 6e 74 6f 20 54 4b 5f 41   nodes into TK_A
1a2f0 47 47 5f 43 4f 4c 55 4d 4e 20 61 6e 64 20 6d 61  GG_COLUMN and ma
1a300 6b 65 20 65 6e 74 72 69 65 73 20 69 6e 0a 20 20  ke entries in.  
1a310 20 20 2a 2a 20 73 41 67 67 49 6e 66 6f 20 66 6f    ** sAggInfo fo
1a320 72 20 61 6c 6c 20 54 4b 5f 41 47 47 5f 46 55 4e  r all TK_AGG_FUN
1a330 43 54 49 4f 4e 20 6e 6f 64 65 73 20 69 6e 20 65  CTION nodes in e
1a340 78 70 72 65 73 73 69 6f 6e 73 20 6f 66 20 74 68  xpressions of th
1a350 65 0a 20 20 20 20 2a 2a 20 53 45 4c 45 43 54 20  e.    ** SELECT 
1a360 73 74 61 74 65 6d 65 6e 74 2e 0a 20 20 20 20 2a  statement..    *
1a370 2f 0a 20 20 20 20 6d 65 6d 73 65 74 28 26 73 4e  /.    memset(&sN
1a380 43 2c 20 30 2c 20 73 69 7a 65 6f 66 28 73 4e 43  C, 0, sizeof(sNC
1a390 29 29 3b 0a 20 20 20 20 73 4e 43 2e 70 50 61 72  ));.    sNC.pPar
1a3a0 73 65 20 3d 20 70 50 61 72 73 65 3b 0a 20 20 20  se = pParse;.   
1a3b0 20 73 4e 43 2e 70 53 72 63 4c 69 73 74 20 3d 20   sNC.pSrcList = 
1a3c0 70 54 61 62 4c 69 73 74 3b 0a 20 20 20 20 73 4e  pTabList;.    sN
1a3d0 43 2e 70 41 67 67 49 6e 66 6f 20 3d 20 26 73 41  C.pAggInfo = &sA
1a3e0 67 67 49 6e 66 6f 3b 0a 20 20 20 20 73 41 67 67  ggInfo;.    sAgg
1a3f0 49 6e 66 6f 2e 6e 53 6f 72 74 69 6e 67 43 6f 6c  Info.nSortingCol
1a400 75 6d 6e 20 3d 20 70 47 72 6f 75 70 42 79 20 3f  umn = pGroupBy ?
1a410 20 70 47 72 6f 75 70 42 79 2d 3e 6e 45 78 70 72   pGroupBy->nExpr
1a420 2b 31 20 3a 20 30 3b 0a 20 20 20 20 73 41 67 67  +1 : 0;.    sAgg
1a430 49 6e 66 6f 2e 70 47 72 6f 75 70 42 79 20 3d 20  Info.pGroupBy = 
1a440 70 47 72 6f 75 70 42 79 3b 0a 20 20 20 20 69 66  pGroupBy;.    if
1a450 28 20 73 71 6c 69 74 65 33 45 78 70 72 41 6e 61  ( sqlite3ExprAna
1a460 6c 79 7a 65 41 67 67 4c 69 73 74 28 26 73 4e 43  lyzeAggList(&sNC
1a470 2c 20 70 45 4c 69 73 74 29 20 29 7b 0a 20 20 20  , pEList) ){.   
1a480 20 20 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65     goto select_e
1a490 6e 64 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  nd;.    }.    if
1a4a0 28 20 73 71 6c 69 74 65 33 45 78 70 72 41 6e 61  ( sqlite3ExprAna
1a4b0 6c 79 7a 65 41 67 67 4c 69 73 74 28 26 73 4e 43  lyzeAggList(&sNC
1a4c0 2c 20 70 4f 72 64 65 72 42 79 29 20 29 7b 0a 20  , pOrderBy) ){. 
1a4d0 20 20 20 20 20 67 6f 74 6f 20 73 65 6c 65 63 74       goto select
1a4e0 5f 65 6e 64 3b 0a 20 20 20 20 7d 0a 20 20 20 20  _end;.    }.    
1a4f0 69 66 28 20 70 48 61 76 69 6e 67 20 26 26 20 73  if( pHaving && s
1a500 71 6c 69 74 65 33 45 78 70 72 41 6e 61 6c 79 7a  qlite3ExprAnalyz
1a510 65 41 67 67 72 65 67 61 74 65 73 28 26 73 4e 43  eAggregates(&sNC
1a520 2c 20 70 48 61 76 69 6e 67 29 20 29 7b 0a 20 20  , pHaving) ){.  
1a530 20 20 20 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f      goto select_
1a540 65 6e 64 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73  end;.    }.    s
1a550 41 67 67 49 6e 66 6f 2e 6e 41 63 63 75 6d 75 6c  AggInfo.nAccumul
1a560 61 74 6f 72 20 3d 20 73 41 67 67 49 6e 66 6f 2e  ator = sAggInfo.
1a570 6e 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 66 6f 72  nColumn;.    for
1a580 28 69 3d 30 3b 20 69 3c 73 41 67 67 49 6e 66 6f  (i=0; i<sAggInfo
1a590 2e 6e 46 75 6e 63 3b 20 69 2b 2b 29 7b 0a 20 20  .nFunc; i++){.  
1a5a0 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 45      if( sqlite3E
1a5b0 78 70 72 41 6e 61 6c 79 7a 65 41 67 67 4c 69 73  xprAnalyzeAggLis
1a5c0 74 28 26 73 4e 43 2c 20 73 41 67 67 49 6e 66 6f  t(&sNC, sAggInfo
1a5d0 2e 61 46 75 6e 63 5b 69 5d 2e 70 45 78 70 72 2d  .aFunc[i].pExpr-
1a5e0 3e 70 4c 69 73 74 29 20 29 7b 0a 20 20 20 20 20  >pList) ){.     
1a5f0 20 20 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65     goto select_e
1a600 6e 64 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  nd;.      }.    
1a610 7d 0a 20 20 20 20 69 66 28 20 64 62 2d 3e 6d 61  }.    if( db->ma
1a620 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20 67 6f 74  llocFailed ) got
1a630 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 0a 20  o select_end;.. 
1a640 20 20 20 2f 2a 20 50 72 6f 63 65 73 73 69 6e 67     /* Processing
1a650 20 66 6f 72 20 61 67 67 72 65 67 61 74 65 73 20   for aggregates 
1a660 77 69 74 68 20 47 52 4f 55 50 20 42 59 20 69 73  with GROUP BY is
1a670 20 76 65 72 79 20 64 69 66 66 65 72 65 6e 74 20   very different 
1a680 61 6e 64 0a 20 20 20 20 2a 2a 20 6d 75 63 68 20  and.    ** much 
1a690 6d 6f 72 65 20 63 6f 6d 70 6c 65 78 20 74 68 61  more complex tha
1a6a0 20 61 67 67 72 65 67 61 74 65 73 20 77 69 74 68   aggregates with
1a6b0 6f 75 74 20 61 20 47 52 4f 55 50 20 42 59 2e 0a  out a GROUP BY..
1a6c0 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70      */.    if( p
1a6d0 47 72 6f 75 70 42 79 20 29 7b 0a 20 20 20 20 20  GroupBy ){.     
1a6e0 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e   KeyInfo *pKeyIn
1a6f0 66 6f 3b 20 20 2f 2a 20 4b 65 79 69 6e 67 20 69  fo;  /* Keying i
1a700 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 6f 72 20 74  nformation for t
1a710 68 65 20 67 72 6f 75 70 20 62 79 20 63 6c 61 75  he group by clau
1a720 73 65 20 2a 2f 0a 0a 20 20 20 20 20 20 2f 2a 20  se */..      /* 
1a730 43 72 65 61 74 65 20 6c 61 62 65 6c 73 20 74 68  Create labels th
1a740 61 74 20 77 65 20 77 69 6c 6c 20 62 65 20 6e 65  at we will be ne
1a750 65 64 69 6e 67 0a 20 20 20 20 20 20 2a 2f 0a 20  eding.      */. 
1a760 20 20 20 20 0a 20 20 20 20 20 20 61 64 64 72 49      .      addrI
1a770 6e 69 74 69 61 6c 69 7a 65 4c 6f 6f 70 20 3d 20  nitializeLoop = 
1a780 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c  sqlite3VdbeMakeL
1a790 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 20 20 61  abel(v);.      a
1a7a0 64 64 72 47 72 6f 75 70 42 79 43 68 61 6e 67 65  ddrGroupByChange
1a7b0 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61   = sqlite3VdbeMa
1a7c0 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20  keLabel(v);.    
1a7d0 20 20 61 64 64 72 50 72 6f 63 65 73 73 52 6f 77    addrProcessRow
1a7e0 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61   = sqlite3VdbeMa
1a7f0 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 0a 20 20 20  keLabel(v);..   
1a800 20 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20 69     /* If there i
1a810 73 20 61 20 47 52 4f 55 50 20 42 59 20 63 6c 61  s a GROUP BY cla
1a820 75 73 65 20 77 65 20 6d 69 67 68 74 20 6e 65 65  use we might nee
1a830 64 20 61 20 73 6f 72 74 69 6e 67 20 69 6e 64 65  d a sorting inde
1a840 78 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20 69 6d  x to.      ** im
1a850 70 6c 65 6d 65 6e 74 20 69 74 2e 20 20 41 6c 6c  plement it.  All
1a860 6f 63 61 74 65 20 74 68 61 74 20 73 6f 72 74 69  ocate that sorti
1a870 6e 67 20 69 6e 64 65 78 20 6e 6f 77 2e 20 20 49  ng index now.  I
1a880 66 20 69 74 20 74 75 72 6e 73 20 6f 75 74 0a 20  f it turns out. 
1a890 20 20 20 20 20 2a 2a 20 74 68 61 74 20 77 65 20       ** that we 
1a8a0 64 6f 20 6e 6f 74 20 6e 65 65 64 20 69 74 20 61  do not need it a
1a8b0 66 74 65 72 20 61 6c 6c 2c 20 74 68 65 20 4f 70  fter all, the Op
1a8c0 65 6e 45 70 68 65 6d 65 72 61 6c 20 69 6e 73 74  enEphemeral inst
1a8d0 72 75 63 74 69 6f 6e 0a 20 20 20 20 20 20 2a 2a  ruction.      **
1a8e0 20 77 69 6c 6c 20 62 65 20 63 6f 6e 76 65 72 74   will be convert
1a8f0 65 64 20 69 6e 74 6f 20 61 20 4e 6f 6f 70 2e 20  ed into a Noop. 
1a900 20 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20   .      */.     
1a910 20 73 41 67 67 49 6e 66 6f 2e 73 6f 72 74 69 6e   sAggInfo.sortin
1a920 67 49 64 78 20 3d 20 70 50 61 72 73 65 2d 3e 6e  gIdx = pParse->n
1a930 54 61 62 2b 2b 3b 0a 20 20 20 20 20 20 70 4b 65  Tab++;.      pKe
1a940 79 49 6e 66 6f 20 3d 20 6b 65 79 49 6e 66 6f 46  yInfo = keyInfoF
1a950 72 6f 6d 45 78 70 72 4c 69 73 74 28 70 50 61 72  romExprList(pPar
1a960 73 65 2c 20 70 47 72 6f 75 70 42 79 29 3b 0a 20  se, pGroupBy);. 
1a970 20 20 20 20 20 61 64 64 72 53 6f 72 74 69 6e 67       addrSorting
1a980 49 64 78 20 3d 0a 20 20 20 20 20 20 20 20 20 20  Idx =.          
1a990 73 71 6c 69 74 65 33 56 64 62 65 4f 70 33 28 76  sqlite3VdbeOp3(v
1a9a0 2c 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72  , OP_OpenEphemer
1a9b0 61 6c 2c 20 73 41 67 67 49 6e 66 6f 2e 73 6f 72  al, sAggInfo.sor
1a9c0 74 69 6e 67 49 64 78 2c 0a 20 20 20 20 20 20 20  tingIdx,.       
1a9d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a9e0 20 20 73 41 67 67 49 6e 66 6f 2e 6e 53 6f 72 74    sAggInfo.nSort
1a9f0 69 6e 67 43 6f 6c 75 6d 6e 2c 0a 20 20 20 20 20  ingColumn,.     
1aa00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1aa10 20 20 20 20 28 63 68 61 72 2a 29 70 4b 65 79 49      (char*)pKeyI
1aa20 6e 66 6f 2c 20 50 33 5f 4b 45 59 49 4e 46 4f 5f  nfo, P3_KEYINFO_
1aa30 48 41 4e 44 4f 46 46 29 3b 0a 0a 20 20 20 20 20  HANDOFF);..     
1aa40 20 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 6d   /* Initialize m
1aa50 65 6d 6f 72 79 20 6c 6f 63 61 74 69 6f 6e 73 20  emory locations 
1aa60 75 73 65 64 20 62 79 20 47 52 4f 55 50 20 42 59  used by GROUP BY
1aa70 20 61 67 67 72 65 67 61 74 65 20 70 72 6f 63 65   aggregate proce
1aa80 73 73 69 6e 67 0a 20 20 20 20 20 20 2a 2f 0a 20  ssing.      */. 
1aa90 20 20 20 20 20 69 55 73 65 46 6c 61 67 20 3d 20       iUseFlag = 
1aaa0 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b 2b 3b 0a  pParse->nMem++;.
1aab0 20 20 20 20 20 20 69 41 62 6f 72 74 46 6c 61 67        iAbortFlag
1aac0 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b   = pParse->nMem+
1aad0 2b 3b 0a 20 20 20 20 20 20 69 41 4d 65 6d 20 3d  +;.      iAMem =
1aae0 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20   pParse->nMem;. 
1aaf0 20 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65       pParse->nMe
1ab00 6d 20 2b 3d 20 70 47 72 6f 75 70 42 79 2d 3e 6e  m += pGroupBy->n
1ab10 45 78 70 72 3b 0a 20 20 20 20 20 20 69 42 4d 65  Expr;.      iBMe
1ab20 6d 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d  m = pParse->nMem
1ab30 3b 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e  ;.      pParse->
1ab40 6e 4d 65 6d 20 2b 3d 20 70 47 72 6f 75 70 42 79  nMem += pGroupBy
1ab50 2d 3e 6e 45 78 70 72 3b 0a 20 20 20 20 20 20 73  ->nExpr;.      s
1ab60 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
1ab70 76 2c 20 4f 50 5f 4d 65 6d 49 6e 74 2c 20 30 2c  v, OP_MemInt, 0,
1ab80 20 69 41 62 6f 72 74 46 6c 61 67 29 3b 0a 20 20   iAbortFlag);.  
1ab90 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28      VdbeComment(
1aba0 28 76 2c 20 22 23 20 63 6c 65 61 72 20 61 62 6f  (v, "# clear abo
1abb0 72 74 20 66 6c 61 67 22 29 29 3b 0a 20 20 20 20  rt flag"));.    
1abc0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
1abd0 4f 70 28 76 2c 20 4f 50 5f 4d 65 6d 49 6e 74 2c  Op(v, OP_MemInt,
1abe0 20 30 2c 20 69 55 73 65 46 6c 61 67 29 3b 0a 20   0, iUseFlag);. 
1abf0 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74       VdbeComment
1ac00 28 28 76 2c 20 22 23 20 69 6e 64 69 63 61 74 65  ((v, "# indicate
1ac10 20 61 63 63 75 6d 75 6c 61 74 6f 72 20 65 6d 70   accumulator emp
1ac20 74 79 22 29 29 3b 0a 20 20 20 20 20 20 73 71 6c  ty"));.      sql
1ac30 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
1ac40 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 61 64 64   OP_Goto, 0, add
1ac50 72 49 6e 69 74 69 61 6c 69 7a 65 4c 6f 6f 70 29  rInitializeLoop)
1ac60 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 47 65 6e 65  ;..      /* Gene
1ac70 72 61 74 65 20 61 20 73 75 62 72 6f 75 74 69 6e  rate a subroutin
1ac80 65 20 74 68 61 74 20 6f 75 74 70 75 74 73 20 61  e that outputs a
1ac90 20 73 69 6e 67 6c 65 20 72 6f 77 20 6f 66 20 74   single row of t
1aca0 68 65 20 72 65 73 75 6c 74 0a 20 20 20 20 20 20  he result.      
1acb0 2a 2a 20 73 65 74 2e 20 20 54 68 69 73 20 73 75  ** set.  This su
1acc0 62 72 6f 75 74 69 6e 65 20 66 69 72 73 74 20 6c  broutine first l
1acd0 6f 6f 6b 73 20 61 74 20 74 68 65 20 69 55 73 65  ooks at the iUse
1ace0 46 6c 61 67 2e 20 20 49 66 20 69 55 73 65 46 6c  Flag.  If iUseFl
1acf0 61 67 0a 20 20 20 20 20 20 2a 2a 20 69 73 20 6c  ag.      ** is l
1ad00 65 73 73 20 74 68 61 6e 20 6f 72 20 65 71 75 61  ess than or equa
1ad10 6c 20 74 6f 20 7a 65 72 6f 2c 20 74 68 65 20 73  l to zero, the s
1ad20 75 62 72 6f 75 74 69 6e 65 20 69 73 20 61 20 6e  ubroutine is a n
1ad30 6f 2d 6f 70 2e 20 20 49 66 0a 20 20 20 20 20 20  o-op.  If.      
1ad40 2a 2a 20 74 68 65 20 70 72 6f 63 65 73 73 69 6e  ** the processin
1ad50 67 20 63 61 6c 6c 73 20 66 6f 72 20 74 68 65 20  g calls for the 
1ad60 71 75 65 72 79 20 74 6f 20 61 62 6f 72 74 2c 20  query to abort, 
1ad70 74 68 69 73 20 73 75 62 72 6f 75 74 69 6e 65 0a  this subroutine.
1ad80 20 20 20 20 20 20 2a 2a 20 69 6e 63 72 65 6d 65        ** increme
1ad90 6e 74 73 20 74 68 65 20 69 41 62 6f 72 74 46 6c  nts the iAbortFl
1ada0 61 67 20 6d 65 6d 6f 72 79 20 6c 6f 63 61 74 69  ag memory locati
1adb0 6f 6e 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e  on before return
1adc0 69 6e 67 20 69 6e 0a 20 20 20 20 20 20 2a 2a 20  ing in.      ** 
1add0 6f 72 64 65 72 20 74 6f 20 73 69 67 6e 61 6c 20  order to signal 
1ade0 74 68 65 20 63 61 6c 6c 65 72 20 74 6f 20 61 62  the caller to ab
1adf0 6f 72 74 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  ort..      */.  
1ae00 20 20 20 20 61 64 64 72 53 65 74 41 62 6f 72 74      addrSetAbort
1ae10 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43 75   = sqlite3VdbeCu
1ae20 72 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 20 20  rrentAddr(v);.  
1ae30 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
1ae40 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 65 6d 49 6e  ddOp(v, OP_MemIn
1ae50 74 2c 20 31 2c 20 69 41 62 6f 72 74 46 6c 61 67  t, 1, iAbortFlag
1ae60 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 6d  );.      VdbeCom
1ae70 6d 65 6e 74 28 28 76 2c 20 22 23 20 73 65 74 20  ment((v, "# set 
1ae80 61 62 6f 72 74 20 66 6c 61 67 22 29 29 3b 0a 20  abort flag"));. 
1ae90 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
1aea0 41 64 64 4f 70 28 76 2c 20 4f 50 5f 52 65 74 75  AddOp(v, OP_Retu
1aeb0 72 6e 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20  rn, 0, 0);.     
1aec0 20 61 64 64 72 4f 75 74 70 75 74 52 6f 77 20 3d   addrOutputRow =
1aed0 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72   sqlite3VdbeCurr
1aee0 65 6e 74 41 64 64 72 28 76 29 3b 0a 20 20 20 20  entAddr(v);.    
1aef0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
1af00 4f 70 28 76 2c 20 4f 50 5f 49 66 4d 65 6d 50 6f  Op(v, OP_IfMemPo
1af10 73 2c 20 69 55 73 65 46 6c 61 67 2c 20 61 64 64  s, iUseFlag, add
1af20 72 4f 75 74 70 75 74 52 6f 77 2b 32 29 3b 0a 20  rOutputRow+2);. 
1af30 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74       VdbeComment
1af40 28 28 76 2c 20 22 23 20 47 72 6f 75 70 62 79 20  ((v, "# Groupby 
1af50 72 65 73 75 6c 74 20 67 65 6e 65 72 61 74 6f 72  result generator
1af60 20 65 6e 74 72 79 20 70 6f 69 6e 74 22 29 29 3b   entry point"));
1af70 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
1af80 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 52 65  beAddOp(v, OP_Re
1af90 74 75 72 6e 2c 20 30 2c 20 30 29 3b 0a 20 20 20  turn, 0, 0);.   
1afa0 20 20 20 66 69 6e 61 6c 69 7a 65 41 67 67 46 75     finalizeAggFu
1afb0 6e 63 74 69 6f 6e 73 28 70 50 61 72 73 65 2c 20  nctions(pParse, 
1afc0 26 73 41 67 67 49 6e 66 6f 29 3b 0a 20 20 20 20  &sAggInfo);.    
1afd0 20 20 69 66 28 20 70 48 61 76 69 6e 67 20 29 7b    if( pHaving ){
1afe0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
1aff0 45 78 70 72 49 66 46 61 6c 73 65 28 70 50 61 72  ExprIfFalse(pPar
1b000 73 65 2c 20 70 48 61 76 69 6e 67 2c 20 61 64 64  se, pHaving, add
1b010 72 4f 75 74 70 75 74 52 6f 77 2b 31 2c 20 31 29  rOutputRow+1, 1)
1b020 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
1b030 72 63 20 3d 20 73 65 6c 65 63 74 49 6e 6e 65 72  rc = selectInner
1b040 4c 6f 6f 70 28 70 50 61 72 73 65 2c 20 70 2c 20  Loop(pParse, p, 
1b050 70 2d 3e 70 45 4c 69 73 74 2c 20 30 2c 20 30 2c  p->pEList, 0, 0,
1b060 20 70 4f 72 64 65 72 42 79 2c 0a 20 20 20 20 20   pOrderBy,.     
1b070 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b080 20 20 20 20 20 20 64 69 73 74 69 6e 63 74 2c 20        distinct, 
1b090 65 44 65 73 74 2c 20 69 50 61 72 6d 2c 20 0a 20  eDest, iParm, . 
1b0a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b0b0 20 20 20 20 20 20 20 20 20 20 61 64 64 72 4f 75            addrOu
1b0c0 74 70 75 74 52 6f 77 2b 31 2c 20 61 64 64 72 53  tputRow+1, addrS
1b0d0 65 74 41 62 6f 72 74 2c 20 61 66 66 29 3b 0a 20  etAbort, aff);. 
1b0e0 20 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20       if( rc ){. 
1b0f0 20 20 20 20 20 20 20 67 6f 74 6f 20 73 65 6c 65         goto sele
1b100 63 74 5f 65 6e 64 3b 0a 20 20 20 20 20 20 7d 0a  ct_end;.      }.
1b110 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
1b120 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 52 65 74  eAddOp(v, OP_Ret
1b130 75 72 6e 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  urn, 0, 0);.    
1b140 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76    VdbeComment((v
1b150 2c 20 22 23 20 65 6e 64 20 67 72 6f 75 70 62 79  , "# end groupby
1b160 20 72 65 73 75 6c 74 20 67 65 6e 65 72 61 74 6f   result generato
1b170 72 22 29 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20  r"));..      /* 
1b180 47 65 6e 65 72 61 74 65 20 61 20 73 75 62 72 6f  Generate a subro
1b190 75 74 69 6e 65 20 74 68 61 74 20 77 69 6c 6c 20  utine that will 
1b1a0 72 65 73 65 74 20 74 68 65 20 67 72 6f 75 70 2d  reset the group-
1b1b0 62 79 20 61 63 63 75 6d 75 6c 61 74 6f 72 0a 20  by accumulator. 
1b1c0 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 61 64       */.      ad
1b1d0 64 72 52 65 73 65 74 20 3d 20 73 71 6c 69 74 65  drReset = sqlite
1b1e0 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72  3VdbeCurrentAddr
1b1f0 28 76 29 3b 0a 20 20 20 20 20 20 72 65 73 65 74  (v);.      reset
1b200 41 63 63 75 6d 75 6c 61 74 6f 72 28 70 50 61 72  Accumulator(pPar
1b210 73 65 2c 20 26 73 41 67 67 49 6e 66 6f 29 3b 0a  se, &sAggInfo);.
1b220 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
1b230 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 52 65 74  eAddOp(v, OP_Ret
1b240 75 72 6e 2c 20 30 2c 20 30 29 3b 0a 0a 20 20 20  urn, 0, 0);..   
1b250 20 20 20 2f 2a 20 42 65 67 69 6e 20 61 20 6c 6f     /* Begin a lo
1b260 6f 70 20 74 68 61 74 20 77 69 6c 6c 20 65 78 74  op that will ext
1b270 72 61 63 74 20 61 6c 6c 20 73 6f 75 72 63 65 20  ract all source 
1b280 72 6f 77 73 20 69 6e 20 47 52 4f 55 50 20 42 59  rows in GROUP BY
1b290 20 6f 72 64 65 72 2e 0a 20 20 20 20 20 20 2a 2a   order..      **
1b2a0 20 54 68 69 73 20 6d 69 67 68 74 20 69 6e 76 6f   This might invo
1b2b0 6c 76 65 20 74 77 6f 20 73 65 70 61 72 61 74 65  lve two separate
1b2c0 20 6c 6f 6f 70 73 20 77 69 74 68 20 61 6e 20 4f   loops with an O
1b2d0 50 5f 53 6f 72 74 20 69 6e 20 62 65 74 77 65 65  P_Sort in betwee
1b2e0 6e 2c 20 6f 72 0a 20 20 20 20 20 20 2a 2a 20 69  n, or.      ** i
1b2f0 74 20 6d 69 67 68 74 20 62 65 20 61 20 73 69 6e  t might be a sin
1b300 67 6c 65 20 6c 6f 6f 70 20 74 68 61 74 20 75 73  gle loop that us
1b310 65 73 20 61 6e 20 69 6e 64 65 78 20 74 6f 20 65  es an index to e
1b320 78 74 72 61 63 74 20 69 6e 66 6f 72 6d 61 74 69  xtract informati
1b330 6f 6e 0a 20 20 20 20 20 20 2a 2a 20 69 6e 20 74  on.      ** in t
1b340 68 65 20 72 69 67 68 74 20 6f 72 64 65 72 20 74  he right order t
1b350 6f 20 62 65 67 69 6e 20 77 69 74 68 2e 0a 20 20  o begin with..  
1b360 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c      */.      sql
1b370 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c  ite3VdbeResolveL
1b380 61 62 65 6c 28 76 2c 20 61 64 64 72 49 6e 69 74  abel(v, addrInit
1b390 69 61 6c 69 7a 65 4c 6f 6f 70 29 3b 0a 20 20 20  ializeLoop);.   
1b3a0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
1b3b0 64 4f 70 28 76 2c 20 4f 50 5f 47 6f 73 75 62 2c  dOp(v, OP_Gosub,
1b3c0 20 30 2c 20 61 64 64 72 52 65 73 65 74 29 3b 0a   0, addrReset);.
1b3d0 20 20 20 20 20 20 70 57 49 6e 66 6f 20 3d 20 73        pWInfo = s
1b3e0 71 6c 69 74 65 33 57 68 65 72 65 42 65 67 69 6e  qlite3WhereBegin
1b3f0 28 70 50 61 72 73 65 2c 20 70 54 61 62 4c 69 73  (pParse, pTabLis
1b400 74 2c 20 70 57 68 65 72 65 2c 20 26 70 47 72 6f  t, pWhere, &pGro
1b410 75 70 42 79 29 3b 0a 20 20 20 20 20 20 69 66 28  upBy);.      if(
1b420 20 70 57 49 6e 66 6f 3d 3d 30 20 29 20 67 6f 74   pWInfo==0 ) got
1b430 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20  o select_end;.  
1b440 20 20 20 20 69 66 28 20 70 47 72 6f 75 70 42 79      if( pGroupBy
1b450 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 2f  ==0 ){.        /
1b460 2a 20 54 68 65 20 6f 70 74 69 6d 69 7a 65 72 20  * The optimizer 
1b470 69 73 20 61 62 6c 65 20 74 6f 20 64 65 6c 69 76  is able to deliv
1b480 65 72 20 72 6f 77 73 20 69 6e 20 67 72 6f 75 70  er rows in group
1b490 20 62 79 20 6f 72 64 65 72 20 73 6f 0a 20 20 20   by order so.   
1b4a0 20 20 20 20 20 2a 2a 20 77 65 20 64 6f 20 6e 6f       ** we do no
1b4b0 74 20 68 61 76 65 20 74 6f 20 73 6f 72 74 2e 20  t have to sort. 
1b4c0 20 54 68 65 20 4f 50 5f 4f 70 65 6e 45 70 68 65   The OP_OpenEphe
1b4d0 6d 65 72 61 6c 20 74 61 62 6c 65 20 77 69 6c 6c  meral table will
1b4e0 20 62 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 63   be.        ** c
1b4f0 61 6e 63 65 6c 6c 65 64 20 6c 61 74 65 72 20 62  ancelled later b
1b500 65 63 61 75 73 65 20 77 65 20 73 74 69 6c 6c 20  ecause we still 
1b510 6e 65 65 64 20 74 6f 20 75 73 65 20 74 68 65 20  need to use the 
1b520 70 4b 65 79 49 6e 66 6f 0a 20 20 20 20 20 20 20  pKeyInfo.       
1b530 20 2a 2f 0a 20 20 20 20 20 20 20 20 70 47 72 6f   */.        pGro
1b540 75 70 42 79 20 3d 20 70 2d 3e 70 47 72 6f 75 70  upBy = p->pGroup
1b550 42 79 3b 0a 20 20 20 20 20 20 20 20 67 72 6f 75  By;.        grou
1b560 70 42 79 53 6f 72 74 20 3d 20 30 3b 0a 20 20 20  pBySort = 0;.   
1b570 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1b580 20 20 2f 2a 20 52 6f 77 73 20 61 72 65 20 63 6f    /* Rows are co
1b590 6d 69 6e 67 20 6f 75 74 20 69 6e 20 75 6e 64 65  ming out in unde
1b5a0 74 65 72 6d 69 6e 65 64 20 6f 72 64 65 72 2e 20  termined order. 
1b5b0 20 57 65 20 68 61 76 65 20 74 6f 20 70 75 73 68   We have to push
1b5c0 0a 20 20 20 20 20 20 20 20 2a 2a 20 65 61 63 68  .        ** each
1b5d0 20 72 6f 77 20 69 6e 74 6f 20 61 20 73 6f 72 74   row into a sort
1b5e0 69 6e 67 20 69 6e 64 65 78 2c 20 74 65 72 6d 69  ing index, termi
1b5f0 6e 61 74 65 20 74 68 65 20 66 69 72 73 74 20 6c  nate the first l
1b600 6f 6f 70 2c 0a 20 20 20 20 20 20 20 20 2a 2a 20  oop,.        ** 
1b610 74 68 65 6e 20 6c 6f 6f 70 20 6f 76 65 72 20 74  then loop over t
1b620 68 65 20 73 6f 72 74 69 6e 67 20 69 6e 64 65 78  he sorting index
1b630 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 67 65 74   in order to get
1b640 20 74 68 65 20 6f 75 74 70 75 74 0a 20 20 20 20   the output.    
1b650 20 20 20 20 2a 2a 20 69 6e 20 73 6f 72 74 65 64      ** in sorted
1b660 20 6f 72 64 65 72 0a 20 20 20 20 20 20 20 20 2a   order.        *
1b670 2f 0a 20 20 20 20 20 20 20 20 67 72 6f 75 70 42  /.        groupB
1b680 79 53 6f 72 74 20 3d 20 31 3b 0a 20 20 20 20 20  ySort = 1;.     
1b690 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f     sqlite3ExprCo
1b6a0 64 65 45 78 70 72 4c 69 73 74 28 70 50 61 72 73  deExprList(pPars
1b6b0 65 2c 20 70 47 72 6f 75 70 42 79 29 3b 0a 20 20  e, pGroupBy);.  
1b6c0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
1b6d0 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 53 65 71  eAddOp(v, OP_Seq
1b6e0 75 65 6e 63 65 2c 20 73 41 67 67 49 6e 66 6f 2e  uence, sAggInfo.
1b6f0 73 6f 72 74 69 6e 67 49 64 78 2c 20 30 29 3b 0a  sortingIdx, 0);.
1b700 20 20 20 20 20 20 20 20 6a 20 3d 20 70 47 72 6f          j = pGro
1b710 75 70 42 79 2d 3e 6e 45 78 70 72 2b 31 3b 0a 20  upBy->nExpr+1;. 
1b720 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20         for(i=0; 
1b730 69 3c 73 41 67 67 49 6e 66 6f 2e 6e 43 6f 6c 75  i<sAggInfo.nColu
1b740 6d 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  mn; i++){.      
1b750 20 20 20 20 73 74 72 75 63 74 20 41 67 67 49 6e      struct AggIn
1b760 66 6f 5f 63 6f 6c 20 2a 70 43 6f 6c 20 3d 20 26  fo_col *pCol = &
1b770 73 41 67 67 49 6e 66 6f 2e 61 43 6f 6c 5b 69 5d  sAggInfo.aCol[i]
1b780 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
1b790 70 43 6f 6c 2d 3e 69 53 6f 72 74 65 72 43 6f 6c  pCol->iSorterCol
1b7a0 75 6d 6e 3c 6a 20 29 20 63 6f 6e 74 69 6e 75 65  umn<j ) continue
1b7b0 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  ;.          sqli
1b7c0 74 65 33 45 78 70 72 43 6f 64 65 47 65 74 43 6f  te3ExprCodeGetCo
1b7d0 6c 75 6d 6e 28 76 2c 20 70 43 6f 6c 2d 3e 70 54  lumn(v, pCol->pT
1b7e0 61 62 2c 20 70 43 6f 6c 2d 3e 69 43 6f 6c 75 6d  ab, pCol->iColum
1b7f0 6e 2c 20 70 43 6f 6c 2d 3e 69 54 61 62 6c 65 29  n, pCol->iTable)
1b800 3b 0a 20 20 20 20 20 20 20 20 20 20 6a 2b 2b 3b  ;.          j++;
1b810 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
1b820 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
1b830 64 4f 70 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65  dOp(v, OP_MakeRe
1b840 63 6f 72 64 2c 20 6a 2c 20 30 29 3b 0a 20 20 20  cord, j, 0);.   
1b850 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
1b860 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49 64 78 49  AddOp(v, OP_IdxI
1b870 6e 73 65 72 74 2c 20 73 41 67 67 49 6e 66 6f 2e  nsert, sAggInfo.
1b880 73 6f 72 74 69 6e 67 49 64 78 2c 20 30 29 3b 0a  sortingIdx, 0);.
1b890 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 57          sqlite3W
1b8a0 68 65 72 65 45 6e 64 28 70 57 49 6e 66 6f 29 3b  hereEnd(pWInfo);
1b8b0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
1b8c0 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
1b8d0 53 6f 72 74 2c 20 73 41 67 67 49 6e 66 6f 2e 73  Sort, sAggInfo.s
1b8e0 6f 72 74 69 6e 67 49 64 78 2c 20 61 64 64 72 45  ortingIdx, addrE
1b8f0 6e 64 29 3b 0a 20 20 20 20 20 20 20 20 56 64 62  nd);.        Vdb
1b900 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 23 20  eComment((v, "# 
1b910 47 52 4f 55 50 20 42 59 20 73 6f 72 74 22 29 29  GROUP BY sort"))
1b920 3b 0a 20 20 20 20 20 20 20 20 73 41 67 67 49 6e  ;.        sAggIn
1b930 66 6f 2e 75 73 65 53 6f 72 74 69 6e 67 49 64 78  fo.useSortingIdx
1b940 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a 0a 20   = 1;.      }.. 
1b950 20 20 20 20 20 2f 2a 20 45 76 61 6c 75 61 74 65       /* Evaluate
1b960 20 74 68 65 20 63 75 72 72 65 6e 74 20 47 52 4f   the current GRO
1b970 55 50 20 42 59 20 74 65 72 6d 73 20 61 6e 64 20  UP BY terms and 
1b980 73 74 6f 72 65 20 69 6e 20 62 30 2c 20 62 31 2c  store in b0, b1,
1b990 20 62 32 2e 2e 2e 0a 20 20 20 20 20 20 2a 2a 20   b2....      ** 
1b9a0 28 62 30 20 69 73 20 6d 65 6d 6f 72 79 20 6c 6f  (b0 is memory lo
1b9b0 63 61 74 69 6f 6e 20 69 42 4d 65 6d 2b 30 2c 20  cation iBMem+0, 
1b9c0 62 31 20 69 73 20 69 42 4d 65 6d 2b 31 2c 20 61  b1 is iBMem+1, a
1b9d0 6e 64 20 73 6f 20 66 6f 72 74 68 29 0a 20 20 20  nd so forth).   
1b9e0 20 20 20 2a 2a 20 54 68 65 6e 20 63 6f 6d 70 61     ** Then compa
1b9f0 72 65 20 74 68 65 20 63 75 72 72 65 6e 74 20 47  re the current G
1ba00 52 4f 55 50 20 42 59 20 74 65 72 6d 73 20 61 67  ROUP BY terms ag
1ba10 61 69 6e 73 74 20 74 68 65 20 47 52 4f 55 50 20  ainst the GROUP 
1ba20 42 59 20 74 65 72 6d 73 0a 20 20 20 20 20 20 2a  BY terms.      *
1ba30 2a 20 66 72 6f 6d 20 74 68 65 20 70 72 65 76 69  * from the previ
1ba40 6f 75 73 20 72 6f 77 20 63 75 72 72 65 6e 74 6c  ous row currentl
1ba50 79 20 73 74 6f 72 65 64 20 69 6e 20 61 30 2c 20  y stored in a0, 
1ba60 61 31 2c 20 61 32 2e 2e 2e 0a 20 20 20 20 20 20  a1, a2....      
1ba70 2a 2f 0a 20 20 20 20 20 20 61 64 64 72 54 6f 70  */.      addrTop
1ba80 4f 66 4c 6f 6f 70 20 3d 20 73 71 6c 69 74 65 33  OfLoop = sqlite3
1ba90 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28  VdbeCurrentAddr(
1baa0 76 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d  v);.      for(j=
1bab0 30 3b 20 6a 3c 70 47 72 6f 75 70 42 79 2d 3e 6e  0; j<pGroupBy->n
1bac0 45 78 70 72 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20  Expr; j++){.    
1bad0 20 20 20 20 69 66 28 20 67 72 6f 75 70 42 79 53      if( groupByS
1bae0 6f 72 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ort ){.         
1baf0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
1bb00 70 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20  p(v, OP_Column, 
1bb10 73 41 67 67 49 6e 66 6f 2e 73 6f 72 74 69 6e 67  sAggInfo.sorting
1bb20 49 64 78 2c 20 6a 29 3b 0a 20 20 20 20 20 20 20  Idx, j);.       
1bb30 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
1bb40 20 20 73 41 67 67 49 6e 66 6f 2e 64 69 72 65 63    sAggInfo.direc
1bb50 74 4d 6f 64 65 20 3d 20 31 3b 0a 20 20 20 20 20  tMode = 1;.     
1bb60 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
1bb70 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70 47 72  Code(pParse, pGr
1bb80 6f 75 70 42 79 2d 3e 61 5b 6a 5d 2e 70 45 78 70  oupBy->a[j].pExp
1bb90 72 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  r);.        }.  
1bba0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
1bbb0 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 65 6d  eAddOp(v, OP_Mem
1bbc0 53 74 6f 72 65 2c 20 69 42 4d 65 6d 2b 6a 2c 20  Store, iBMem+j, 
1bbd0 6a 3c 70 47 72 6f 75 70 42 79 2d 3e 6e 45 78 70  j<pGroupBy->nExp
1bbe0 72 2d 31 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  r-1);.      }.  
1bbf0 20 20 20 20 66 6f 72 28 6a 3d 70 47 72 6f 75 70      for(j=pGroup
1bc00 42 79 2d 3e 6e 45 78 70 72 2d 31 3b 20 6a 3e 3d  By->nExpr-1; j>=
1bc10 30 3b 20 6a 2d 2d 29 7b 0a 20 20 20 20 20 20 20  0; j--){.       
1bc20 20 69 66 28 20 6a 3c 70 47 72 6f 75 70 42 79 2d   if( j<pGroupBy-
1bc30 3e 6e 45 78 70 72 2d 31 20 29 7b 0a 20 20 20 20  >nExpr-1 ){.    
1bc40 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
1bc50 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 65 6d  eAddOp(v, OP_Mem
1bc60 4c 6f 61 64 2c 20 69 42 4d 65 6d 2b 6a 2c 20 30  Load, iBMem+j, 0
1bc70 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
1bc80 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
1bc90 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 65 6d 4c  AddOp(v, OP_MemL
1bca0 6f 61 64 2c 20 69 41 4d 65 6d 2b 6a 2c 20 30 29  oad, iAMem+j, 0)
1bcb0 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 6a 3d  ;.        if( j=
1bcc0 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
1bcd0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
1bce0 28 76 2c 20 4f 50 5f 45 71 2c 20 30 78 32 30 30  (v, OP_Eq, 0x200
1bcf0 2c 20 61 64 64 72 50 72 6f 63 65 73 73 52 6f 77  , addrProcessRow
1bd00 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  );.        }else
1bd10 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  {.          sqli
1bd20 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
1bd30 4f 50 5f 4e 65 2c 20 30 78 32 30 30 2c 20 61 64  OP_Ne, 0x200, ad
1bd40 64 72 47 72 6f 75 70 42 79 43 68 61 6e 67 65 29  drGroupByChange)
1bd50 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
1bd60 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43      sqlite3VdbeC
1bd70 68 61 6e 67 65 50 33 28 76 2c 20 2d 31 2c 20 28  hangeP3(v, -1, (
1bd80 76 6f 69 64 2a 29 70 4b 65 79 49 6e 66 6f 2d 3e  void*)pKeyInfo->
1bd90 61 43 6f 6c 6c 5b 6a 5d 2c 20 50 33 5f 43 4f 4c  aColl[j], P3_COL
1bda0 4c 53 45 51 29 3b 0a 20 20 20 20 20 20 7d 0a 0a  LSEQ);.      }..
1bdb0 20 20 20 20 20 20 2f 2a 20 47 65 6e 65 72 61 74        /* Generat
1bdc0 65 20 63 6f 64 65 20 74 68 61 74 20 72 75 6e 73  e code that runs
1bdd0 20 77 68 65 6e 65 76 65 72 20 74 68 65 20 47 52   whenever the GR
1bde0 4f 55 50 20 42 59 20 63 68 61 6e 67 65 73 2e 0a  OUP BY changes..
1bdf0 20 20 20 20 20 20 2a 2a 20 43 68 61 6e 67 65 20        ** Change 
1be00 69 6e 20 74 68 65 20 47 52 4f 55 50 20 42 59 20  in the GROUP BY 
1be10 61 72 65 20 64 65 74 65 63 74 65 64 20 62 79 20  are detected by 
1be20 74 68 65 20 70 72 65 76 69 6f 75 73 20 63 6f 64  the previous cod
1be30 65 0a 20 20 20 20 20 20 2a 2a 20 62 6c 6f 63 6b  e.      ** block
1be40 2e 20 20 49 66 20 74 68 65 72 65 20 77 65 72 65  .  If there were
1be50 20 6e 6f 20 63 68 61 6e 67 65 73 2c 20 74 68 69   no changes, thi
1be60 73 20 62 6c 6f 63 6b 20 69 73 20 73 6b 69 70 70  s block is skipp
1be70 65 64 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20  ed..      **.   
1be80 20 20 20 2a 2a 20 54 68 69 73 20 63 6f 64 65 20     ** This code 
1be90 63 6f 70 69 65 73 20 63 75 72 72 65 6e 74 20 67  copies current g
1bea0 72 6f 75 70 20 62 79 20 74 65 72 6d 73 20 69 6e  roup by terms in
1beb0 20 62 30 2c 62 31 2c 62 32 2c 2e 2e 2e 0a 20 20   b0,b1,b2,....  
1bec0 20 20 20 20 2a 2a 20 6f 76 65 72 20 74 6f 20 61      ** over to a
1bed0 30 2c 61 31 2c 61 32 2e 20 20 49 74 20 74 68 65  0,a1,a2.  It the
1bee0 6e 20 63 61 6c 6c 73 20 74 68 65 20 6f 75 74 70  n calls the outp
1bef0 75 74 20 73 75 62 72 6f 75 74 69 6e 65 0a 20 20  ut subroutine.  
1bf00 20 20 20 20 2a 2a 20 61 6e 64 20 72 65 73 65 74      ** and reset
1bf10 73 20 74 68 65 20 61 67 67 72 65 67 61 74 65 20  s the aggregate 
1bf20 61 63 63 75 6d 75 6c 61 74 6f 72 20 72 65 67 69  accumulator regi
1bf30 73 74 65 72 73 20 69 6e 20 70 72 65 70 61 72 61  sters in prepara
1bf40 74 69 6f 6e 0a 20 20 20 20 20 20 2a 2a 20 66 6f  tion.      ** fo
1bf50 72 20 74 68 65 20 6e 65 78 74 20 47 52 4f 55 50  r the next GROUP
1bf60 20 42 59 20 62 61 74 63 68 2e 0a 20 20 20 20 20   BY batch..     
1bf70 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65   */.      sqlite
1bf80 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65  3VdbeResolveLabe
1bf90 6c 28 76 2c 20 61 64 64 72 47 72 6f 75 70 42 79  l(v, addrGroupBy
1bfa0 43 68 61 6e 67 65 29 3b 0a 20 20 20 20 20 20 66  Change);.      f
1bfb0 6f 72 28 6a 3d 30 3b 20 6a 3c 70 47 72 6f 75 70  or(j=0; j<pGroup
1bfc0 42 79 2d 3e 6e 45 78 70 72 3b 20 6a 2b 2b 29 7b  By->nExpr; j++){
1bfd0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
1bfe0 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
1bff0 4d 65 6d 4d 6f 76 65 2c 20 69 41 4d 65 6d 2b 6a  MemMove, iAMem+j
1c000 2c 20 69 42 4d 65 6d 2b 6a 29 3b 0a 20 20 20 20  , iBMem+j);.    
1c010 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65    }.      sqlite
1c020 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
1c030 5f 47 6f 73 75 62 2c 20 30 2c 20 61 64 64 72 4f  _Gosub, 0, addrO
1c040 75 74 70 75 74 52 6f 77 29 3b 0a 20 20 20 20 20  utputRow);.     
1c050 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c   VdbeComment((v,
1c060 20 22 23 20 6f 75 74 70 75 74 20 6f 6e 65 20 72   "# output one r
1c070 6f 77 22 29 29 3b 0a 20 20 20 20 20 20 73 71 6c  ow"));.      sql
1c080 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
1c090 20 4f 50 5f 49 66 4d 65 6d 50 6f 73 2c 20 69 41   OP_IfMemPos, iA
1c0a0 62 6f 72 74 46 6c 61 67 2c 20 61 64 64 72 45 6e  bortFlag, addrEn
1c0b0 64 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f  d);.      VdbeCo
1c0c0 6d 6d 65 6e 74 28 28 76 2c 20 22 23 20 63 68 65  mment((v, "# che
1c0d0 63 6b 20 61 62 6f 72 74 20 66 6c 61 67 22 29 29  ck abort flag"))
1c0e0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
1c0f0 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 47  dbeAddOp(v, OP_G
1c100 6f 73 75 62 2c 20 30 2c 20 61 64 64 72 52 65 73  osub, 0, addrRes
1c110 65 74 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43  et);.      VdbeC
1c120 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 23 20 72 65  omment((v, "# re
1c130 73 65 74 20 61 63 63 75 6d 75 6c 61 74 6f 72 22  set accumulator"
1c140 29 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 55 70  ));..      /* Up
1c150 64 61 74 65 20 74 68 65 20 61 67 67 72 65 67 61  date the aggrega
1c160 74 65 20 61 63 63 75 6d 75 6c 61 74 6f 72 73 20  te accumulators 
1c170 62 61 73 65 64 20 6f 6e 20 74 68 65 20 63 6f 6e  based on the con
1c180 74 65 6e 74 20 6f 66 0a 20 20 20 20 20 20 2a 2a  tent of.      **
1c190 20 74 68 65 20 63 75 72 72 65 6e 74 20 72 6f 77   the current row
1c1a0 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
1c1b0 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c  sqlite3VdbeResol
1c1c0 76 65 4c 61 62 65 6c 28 76 2c 20 61 64 64 72 50  veLabel(v, addrP
1c1d0 72 6f 63 65 73 73 52 6f 77 29 3b 0a 20 20 20 20  rocessRow);.    
1c1e0 20 20 75 70 64 61 74 65 41 63 63 75 6d 75 6c 61    updateAccumula
1c1f0 74 6f 72 28 70 50 61 72 73 65 2c 20 26 73 41 67  tor(pParse, &sAg
1c200 67 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20 73 71  gInfo);.      sq
1c210 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
1c220 2c 20 4f 50 5f 4d 65 6d 49 6e 74 2c 20 31 2c 20  , OP_MemInt, 1, 
1c230 69 55 73 65 46 6c 61 67 29 3b 0a 20 20 20 20 20  iUseFlag);.     
1c240 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c   VdbeComment((v,
1c250 20 22 23 20 69 6e 64 69 63 61 74 65 20 64 61 74   "# indicate dat
1c260 61 20 69 6e 20 61 63 63 75 6d 75 6c 61 74 6f 72  a in accumulator
1c270 22 29 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 45  "));..      /* E
1c280 6e 64 20 6f 66 20 74 68 65 20 6c 6f 6f 70 0a 20  nd of the loop. 
1c290 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66       */.      if
1c2a0 28 20 67 72 6f 75 70 42 79 53 6f 72 74 20 29 7b  ( groupBySort ){
1c2b0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
1c2c0 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
1c2d0 4e 65 78 74 2c 20 73 41 67 67 49 6e 66 6f 2e 73  Next, sAggInfo.s
1c2e0 6f 72 74 69 6e 67 49 64 78 2c 20 61 64 64 72 54  ortingIdx, addrT
1c2f0 6f 70 4f 66 4c 6f 6f 70 29 3b 0a 20 20 20 20 20  opOfLoop);.     
1c300 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
1c310 73 71 6c 69 74 65 33 57 68 65 72 65 45 6e 64 28  sqlite3WhereEnd(
1c320 70 57 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20 20  pWInfo);.       
1c330 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e   sqlite3VdbeChan
1c340 67 65 54 6f 4e 6f 6f 70 28 76 2c 20 61 64 64 72  geToNoop(v, addr
1c350 53 6f 72 74 69 6e 67 49 64 78 2c 20 31 29 3b 0a  SortingIdx, 1);.
1c360 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f        }..      /
1c370 2a 20 4f 75 74 70 75 74 20 74 68 65 20 66 69 6e  * Output the fin
1c380 61 6c 20 72 6f 77 20 6f 66 20 72 65 73 75 6c 74  al row of result
1c390 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
1c3a0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
1c3b0 28 76 2c 20 4f 50 5f 47 6f 73 75 62 2c 20 30 2c  (v, OP_Gosub, 0,
1c3c0 20 61 64 64 72 4f 75 74 70 75 74 52 6f 77 29 3b   addrOutputRow);
1c3d0 0a 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65  .      VdbeComme
1c3e0 6e 74 28 28 76 2c 20 22 23 20 6f 75 74 70 75 74  nt((v, "# output
1c3f0 20 66 69 6e 61 6c 20 72 6f 77 22 29 29 3b 0a 20   final row"));. 
1c400 20 20 20 20 20 0a 20 20 20 20 7d 20 2f 2a 20 65       .    } /* e
1c410 6e 64 69 66 20 70 47 72 6f 75 70 42 79 20 2a 2f  ndif pGroupBy */
1c420 0a 20 20 20 20 65 6c 73 65 20 7b 0a 20 20 20 20  .    else {.    
1c430 20 20 2f 2a 20 54 68 69 73 20 63 61 73 65 20 72    /* This case r
1c440 75 6e 73 20 69 66 20 74 68 65 20 61 67 67 72 65  uns if the aggre
1c450 67 61 74 65 20 68 61 73 20 6e 6f 20 47 52 4f 55  gate has no GROU
1c460 50 20 42 59 20 63 6c 61 75 73 65 2e 20 20 54 68  P BY clause.  Th
1c470 65 0a 20 20 20 20 20 20 2a 2a 20 70 72 6f 63 65  e.      ** proce
1c480 73 73 69 6e 67 20 69 73 20 6d 75 63 68 20 73 69  ssing is much si
1c490 6d 70 6c 65 72 20 73 69 6e 63 65 20 74 68 65 72  mpler since ther
1c4a0 65 20 69 73 20 6f 6e 6c 79 20 61 20 73 69 6e 67  e is only a sing
1c4b0 6c 65 20 72 6f 77 0a 20 20 20 20 20 20 2a 2a 20  le row.      ** 
1c4c0 6f 66 20 6f 75 74 70 75 74 2e 0a 20 20 20 20 20  of output..     
1c4d0 20 2a 2f 0a 20 20 20 20 20 20 72 65 73 65 74 41   */.      resetA
1c4e0 63 63 75 6d 75 6c 61 74 6f 72 28 70 50 61 72 73  ccumulator(pPars
1c4f0 65 2c 20 26 73 41 67 67 49 6e 66 6f 29 3b 0a 20  e, &sAggInfo);. 
1c500 20 20 20 20 20 70 57 49 6e 66 6f 20 3d 20 73 71       pWInfo = sq
1c510 6c 69 74 65 33 57 68 65 72 65 42 65 67 69 6e 28  lite3WhereBegin(
1c520 70 50 61 72 73 65 2c 20 70 54 61 62 4c 69 73 74  pParse, pTabList
1c530 2c 20 70 57 68 65 72 65 2c 20 30 29 3b 0a 20 20  , pWhere, 0);.  
1c540 20 20 20 20 69 66 28 20 70 57 49 6e 66 6f 3d 3d      if( pWInfo==
1c550 30 20 29 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f  0 ) goto select_
1c560 65 6e 64 3b 0a 20 20 20 20 20 20 75 70 64 61 74  end;.      updat
1c570 65 41 63 63 75 6d 75 6c 61 74 6f 72 28 70 50 61  eAccumulator(pPa
1c580 72 73 65 2c 20 26 73 41 67 67 49 6e 66 6f 29 3b  rse, &sAggInfo);
1c590 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 57 68  .      sqlite3Wh
1c5a0 65 72 65 45 6e 64 28 70 57 49 6e 66 6f 29 3b 0a  ereEnd(pWInfo);.
1c5b0 20 20 20 20 20 20 66 69 6e 61 6c 69 7a 65 41 67        finalizeAg
1c5c0 67 46 75 6e 63 74 69 6f 6e 73 28 70 50 61 72 73  gFunctions(pPars
1c5d0 65 2c 20 26 73 41 67 67 49 6e 66 6f 29 3b 0a 20  e, &sAggInfo);. 
1c5e0 20 20 20 20 20 70 4f 72 64 65 72 42 79 20 3d 20       pOrderBy = 
1c5f0 30 3b 0a 20 20 20 20 20 20 69 66 28 20 70 48 61  0;.      if( pHa
1c600 76 69 6e 67 20 29 7b 0a 20 20 20 20 20 20 20 20  ving ){.        
1c610 73 71 6c 69 74 65 33 45 78 70 72 49 66 46 61 6c  sqlite3ExprIfFal
1c620 73 65 28 70 50 61 72 73 65 2c 20 70 48 61 76 69  se(pParse, pHavi
1c630 6e 67 2c 20 61 64 64 72 45 6e 64 2c 20 31 29 3b  ng, addrEnd, 1);
1c640 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73  .      }.      s
1c650 65 6c 65 63 74 49 6e 6e 65 72 4c 6f 6f 70 28 70  electInnerLoop(p
1c660 50 61 72 73 65 2c 20 70 2c 20 70 2d 3e 70 45 4c  Parse, p, p->pEL
1c670 69 73 74 2c 20 30 2c 20 30 2c 20 30 2c 20 2d 31  ist, 0, 0, 0, -1
1c680 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  , .             
1c690 20 20 20 20 20 20 20 20 20 65 44 65 73 74 2c 20           eDest, 
1c6a0 69 50 61 72 6d 2c 20 61 64 64 72 45 6e 64 2c 20  iParm, addrEnd, 
1c6b0 61 64 64 72 45 6e 64 2c 20 61 66 66 29 3b 0a 20  addrEnd, aff);. 
1c6c0 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
1c6d0 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c  VdbeResolveLabel
1c6e0 28 76 2c 20 61 64 64 72 45 6e 64 29 3b 0a 20 20  (v, addrEnd);.  
1c6f0 20 20 0a 20 20 7d 20 2f 2a 20 65 6e 64 69 66 20    .  } /* endif 
1c700 61 67 67 72 65 67 61 74 65 20 71 75 65 72 79 20  aggregate query 
1c710 2a 2f 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 72  */..  /* If ther
1c720 65 20 69 73 20 61 6e 20 4f 52 44 45 52 20 42 59  e is an ORDER BY
1c730 20 63 6c 61 75 73 65 2c 20 74 68 65 6e 20 77 65   clause, then we
1c740 20 6e 65 65 64 20 74 6f 20 73 6f 72 74 20 74 68   need to sort th
1c750 65 20 72 65 73 75 6c 74 73 0a 20 20 2a 2a 20 61  e results.  ** a
1c760 6e 64 20 73 65 6e 64 20 74 68 65 6d 20 74 6f 20  nd send them to 
1c770 74 68 65 20 63 61 6c 6c 62 61 63 6b 20 6f 6e 65  the callback one
1c780 20 62 79 20 6f 6e 65 2e 0a 20 20 2a 2f 0a 20 20   by one..  */.  
1c790 69 66 28 20 70 4f 72 64 65 72 42 79 20 29 7b 0a  if( pOrderBy ){.
1c7a0 20 20 20 20 67 65 6e 65 72 61 74 65 53 6f 72 74      generateSort
1c7b0 54 61 69 6c 28 70 50 61 72 73 65 2c 20 70 2c 20  Tail(pParse, p, 
1c7c0 76 2c 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72  v, pEList->nExpr
1c7d0 2c 20 65 44 65 73 74 2c 20 69 50 61 72 6d 29 3b  , eDest, iParm);
1c7e0 0a 20 20 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51  .  }..#ifndef SQ
1c7f0 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45  LITE_OMIT_SUBQUE
1c800 52 59 0a 20 20 2f 2a 20 49 66 20 74 68 69 73 20  RY.  /* If this 
1c810 77 61 73 20 61 20 73 75 62 71 75 65 72 79 2c 20  was a subquery, 
1c820 77 65 20 68 61 76 65 20 6e 6f 77 20 63 6f 6e 76  we have now conv
1c830 65 72 74 65 64 20 74 68 65 20 73 75 62 71 75 65  erted the subque
1c840 72 79 20 69 6e 74 6f 20 61 0a 20 20 2a 2a 20 74  ry into a.  ** t
1c850 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 2e 20  emporary table. 
1c860 20 53 6f 20 73 65 74 20 74 68 65 20 53 72 63 4c   So set the SrcL
1c870 69 73 74 5f 69 74 65 6d 2e 69 73 50 6f 70 75 6c  ist_item.isPopul
1c880 61 74 65 64 20 66 6c 61 67 20 74 6f 20 70 72 65  ated flag to pre
1c890 76 65 6e 74 0a 20 20 2a 2a 20 74 68 69 73 20 73  vent.  ** this s
1c8a0 75 62 71 75 65 72 79 20 66 72 6f 6d 20 62 65 69  ubquery from bei
1c8b0 6e 67 20 65 76 61 6c 75 61 74 65 64 20 61 67 61  ng evaluated aga
1c8c0 69 6e 20 61 6e 64 20 74 6f 20 66 6f 72 63 65 20  in and to force 
1c8d0 74 68 65 20 75 73 65 20 6f 66 0a 20 20 2a 2a 20  the use of.  ** 
1c8e0 74 68 65 20 74 65 6d 70 6f 72 61 72 79 20 74 61  the temporary ta
1c8f0 62 6c 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ble..  */.  if( 
1c900 70 50 61 72 65 6e 74 20 29 7b 0a 20 20 20 20 61  pParent ){.    a
1c910 73 73 65 72 74 28 20 70 50 61 72 65 6e 74 2d 3e  ssert( pParent->
1c920 70 53 72 63 2d 3e 6e 53 72 63 3e 70 61 72 65 6e  pSrc->nSrc>paren
1c930 74 54 61 62 20 29 3b 0a 20 20 20 20 61 73 73 65  tTab );.    asse
1c940 72 74 28 20 70 50 61 72 65 6e 74 2d 3e 70 53 72  rt( pParent->pSr
1c950 63 2d 3e 61 5b 70 61 72 65 6e 74 54 61 62 5d 2e  c->a[parentTab].
1c960 70 53 65 6c 65 63 74 3d 3d 70 20 29 3b 0a 20 20  pSelect==p );.  
1c970 20 20 70 50 61 72 65 6e 74 2d 3e 70 53 72 63 2d    pParent->pSrc-
1c980 3e 61 5b 70 61 72 65 6e 74 54 61 62 5d 2e 69 73  >a[parentTab].is
1c990 50 6f 70 75 6c 61 74 65 64 20 3d 20 31 3b 0a 20  Populated = 1;. 
1c9a0 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20   }.#endif..  /* 
1c9b0 4a 75 6d 70 20 68 65 72 65 20 74 6f 20 73 6b 69  Jump here to ski
1c9c0 70 20 74 68 69 73 20 71 75 65 72 79 0a 20 20 2a  p this query.  *
1c9d0 2f 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 52  /.  sqlite3VdbeR
1c9e0 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 69  esolveLabel(v, i
1c9f0 45 6e 64 29 3b 0a 0a 20 20 2f 2a 20 54 68 65 20  End);..  /* The 
1ca00 53 45 4c 45 43 54 20 77 61 73 20 73 75 63 63 65  SELECT was succe
1ca10 73 73 66 75 6c 6c 79 20 63 6f 64 65 64 2e 20 20  ssfully coded.  
1ca20 20 53 65 74 20 74 68 65 20 72 65 74 75 72 6e 20   Set the return 
1ca30 63 6f 64 65 20 74 6f 20 30 0a 20 20 2a 2a 20 74  code to 0.  ** t
1ca40 6f 20 69 6e 64 69 63 61 74 65 20 6e 6f 20 65 72  o indicate no er
1ca50 72 6f 72 73 2e 0a 20 20 2a 2f 0a 20 20 72 63 20  rors..  */.  rc 
1ca60 3d 20 30 3b 0a 0a 20 20 2f 2a 20 43 6f 6e 74 72  = 0;..  /* Contr
1ca70 6f 6c 20 6a 75 6d 70 73 20 74 6f 20 68 65 72 65  ol jumps to here
1ca80 20 69 66 20 61 6e 20 65 72 72 6f 72 20 69 73 20   if an error is 
1ca90 65 6e 63 6f 75 6e 74 65 72 65 64 20 61 62 6f 76  encountered abov
1caa0 65 2c 20 6f 72 20 75 70 6f 6e 0a 20 20 2a 2a 20  e, or upon.  ** 
1cab0 73 75 63 63 65 73 73 66 75 6c 20 63 6f 64 69 6e  successful codin
1cac0 67 20 6f 66 20 74 68 65 20 53 45 4c 45 43 54 2e  g of the SELECT.
1cad0 0a 20 20 2a 2f 0a 73 65 6c 65 63 74 5f 65 6e 64  .  */.select_end
1cae0 3a 0a 0a 20 20 2f 2a 20 49 64 65 6e 74 69 66 79  :..  /* Identify
1caf0 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 69 66   column names if
1cb00 20 77 65 20 77 69 6c 6c 20 62 65 20 75 73 69 6e   we will be usin
1cb10 67 20 74 68 65 6d 20 69 6e 20 61 20 63 61 6c 6c  g them in a call
1cb20 62 61 63 6b 2e 20 20 54 68 69 73 0a 20 20 2a 2a  back.  This.  **
1cb30 20 73 74 65 70 20 69 73 20 73 6b 69 70 70 65 64   step is skipped
1cb40 20 69 66 20 74 68 65 20 6f 75 74 70 75 74 20 69   if the output i
1cb50 73 20 67 6f 69 6e 67 20 74 6f 20 73 6f 6d 65 20  s going to some 
1cb60 6f 74 68 65 72 20 64 65 73 74 69 6e 61 74 69 6f  other destinatio
1cb70 6e 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 72 63  n..  */.  if( rc
1cb80 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 65  ==SQLITE_OK && e
1cb90 44 65 73 74 3d 3d 53 52 54 5f 43 61 6c 6c 62 61  Dest==SRT_Callba
1cba0 63 6b 20 29 7b 0a 20 20 20 20 67 65 6e 65 72 61  ck ){.    genera
1cbb0 74 65 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 70 50  teColumnNames(pP
1cbc0 61 72 73 65 2c 20 70 54 61 62 4c 69 73 74 2c 20  arse, pTabList, 
1cbd0 70 45 4c 69 73 74 29 3b 0a 20 20 7d 0a 0a 20 20  pEList);.  }..  
1cbe0 73 71 6c 69 74 65 33 5f 66 72 65 65 28 73 41 67  sqlite3_free(sAg
1cbf0 67 49 6e 66 6f 2e 61 43 6f 6c 29 3b 0a 20 20 73  gInfo.aCol);.  s
1cc00 71 6c 69 74 65 33 5f 66 72 65 65 28 73 41 67 67  qlite3_free(sAgg
1cc10 49 6e 66 6f 2e 61 46 75 6e 63 29 3b 0a 20 20 72  Info.aFunc);.  r
1cc20 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66  eturn rc;.}..#if
1cc30 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f   defined(SQLITE_
1cc40 44 45 42 55 47 29 0a 2f 2a 0a 2a 2a 2a 2a 2a 2a  DEBUG)./*.******
1cc50 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1cc60 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1cc70 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1cc80 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1cc90 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 65  *********.** The
1cca0 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 6f 64 65 20   following code 
1ccb0 69 73 20 75 73 65 64 20 66 6f 72 20 74 65 73 74  is used for test
1ccc0 69 6e 67 20 61 6e 64 20 64 65 62 75 67 67 69 6e  ing and debuggin
1ccd0 67 20 6f 6e 6c 79 2e 20 20 54 68 65 20 63 6f 64  g only.  The cod
1cce0 65 0a 2a 2a 20 74 68 61 74 20 66 6f 6c 6c 6f 77  e.** that follow
1ccf0 73 20 64 6f 65 73 20 6e 6f 74 20 61 70 70 65 61  s does not appea
1cd00 72 20 69 6e 20 6e 6f 72 6d 61 6c 20 62 75 69 6c  r in normal buil
1cd10 64 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 73 65 20  ds..**.** These 
1cd20 72 6f 75 74 69 6e 65 73 20 61 72 65 20 75 73 65  routines are use
1cd30 64 20 74 6f 20 70 72 69 6e 74 20 6f 75 74 20 74  d to print out t
1cd40 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 61 6c  he content of al
1cd50 6c 20 6f 72 20 70 61 72 74 20 6f 66 20 61 20 0a  l or part of a .
1cd60 2a 2a 20 70 61 72 73 65 20 73 74 72 75 63 74 75  ** parse structu
1cd70 72 65 73 20 73 75 63 68 20 61 73 20 53 65 6c 65  res such as Sele
1cd80 63 74 20 6f 72 20 45 78 70 72 2e 20 20 53 75 63  ct or Expr.  Suc
1cd90 68 20 70 72 69 6e 74 6f 75 74 73 20 61 72 65 20  h printouts are 
1cda0 75 73 65 66 75 6c 0a 2a 2a 20 66 6f 72 20 68 65  useful.** for he
1cdb0 6c 70 69 6e 67 20 74 6f 20 75 6e 64 65 72 73 74  lping to underst
1cdc0 61 6e 64 20 77 68 61 74 20 69 73 20 68 61 70 70  and what is happ
1cdd0 65 6e 69 6e 67 20 69 6e 73 69 64 65 20 74 68 65  ening inside the
1cde0 20 63 6f 64 65 20 67 65 6e 65 72 61 74 6f 72 0a   code generator.
1cdf0 2a 2a 20 64 75 72 69 6e 67 20 74 68 65 20 65 78  ** during the ex
1ce00 65 63 75 74 69 6f 6e 20 6f 66 20 63 6f 6d 70 6c  ecution of compl
1ce10 65 78 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d  ex SELECT statem
1ce20 65 6e 74 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 73  ents..**.** Thes
1ce30 65 20 72 6f 75 74 69 6e 65 20 61 72 65 20 6e 6f  e routine are no
1ce40 74 20 63 61 6c 6c 65 64 20 61 6e 79 77 68 65 72  t called anywher
1ce50 65 20 66 72 6f 6d 20 77 69 74 68 69 6e 20 74 68  e from within th
1ce60 65 20 6e 6f 72 6d 61 6c 0a 2a 2a 20 63 6f 64 65  e normal.** code
1ce70 20 62 61 73 65 2e 20 20 54 68 65 6e 20 61 72 65   base.  Then are
1ce80 20 69 6e 74 65 6e 64 65 64 20 74 6f 20 62 65 20   intended to be 
1ce90 63 61 6c 6c 65 64 20 66 72 6f 6d 20 77 69 74 68  called from with
1cea0 69 6e 20 74 68 65 20 64 65 62 75 67 67 65 72 0a  in the debugger.
1ceb0 2a 2a 20 6f 72 20 66 72 6f 6d 20 74 65 6d 70 6f  ** or from tempo
1cec0 72 61 72 79 20 22 70 72 69 6e 74 66 22 20 73 74  rary "printf" st
1ced0 61 74 65 6d 65 6e 74 73 20 69 6e 73 65 72 74 65  atements inserte
1cee0 64 20 66 6f 72 20 64 65 62 75 67 67 69 6e 67 2e  d for debugging.
1cef0 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
1cf00 50 72 69 6e 74 45 78 70 72 28 45 78 70 72 20 2a  PrintExpr(Expr *
1cf10 70 29 7b 0a 20 20 69 66 28 20 70 2d 3e 74 6f 6b  p){.  if( p->tok
1cf20 65 6e 2e 7a 20 26 26 20 70 2d 3e 74 6f 6b 65 6e  en.z && p->token
1cf30 2e 6e 3e 30 20 29 7b 0a 20 20 20 20 73 71 6c 69  .n>0 ){.    sqli
1cf40 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22  te3DebugPrintf("
1cf50 28 25 2e 2a 73 22 2c 20 70 2d 3e 74 6f 6b 65 6e  (%.*s", p->token
1cf60 2e 6e 2c 20 70 2d 3e 74 6f 6b 65 6e 2e 7a 29 3b  .n, p->token.z);
1cf70 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71  .  }else{.    sq
1cf80 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66  lite3DebugPrintf
1cf90 28 22 28 25 64 22 2c 20 70 2d 3e 6f 70 29 3b 0a  ("(%d", p->op);.
1cfa0 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e 70 4c 65    }.  if( p->pLe
1cfb0 66 74 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  ft ){.    sqlite
1cfc0 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 20 22  3DebugPrintf(" "
1cfd0 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 50 72  );.    sqlite3Pr
1cfe0 69 6e 74 45 78 70 72 28 70 2d 3e 70 4c 65 66 74  intExpr(p->pLeft
1cff0 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e  );.  }.  if( p->
1d000 70 52 69 67 68 74 20 29 7b 0a 20 20 20 20 73 71  pRight ){.    sq
1d010 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66  lite3DebugPrintf
1d020 28 22 20 22 29 3b 0a 20 20 20 20 73 71 6c 69 74  (" ");.    sqlit
1d030 65 33 50 72 69 6e 74 45 78 70 72 28 70 2d 3e 70  e3PrintExpr(p->p
1d040 52 69 67 68 74 29 3b 0a 20 20 7d 0a 20 20 73 71  Right);.  }.  sq
1d050 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66  lite3DebugPrintf
1d060 28 22 29 22 29 3b 0a 7d 0a 76 6f 69 64 20 73 71  (")");.}.void sq
1d070 6c 69 74 65 33 50 72 69 6e 74 45 78 70 72 4c 69  lite3PrintExprLi
1d080 73 74 28 45 78 70 72 4c 69 73 74 20 2a 70 4c 69  st(ExprList *pLi
1d090 73 74 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  st){.  int i;.  
1d0a0 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4c 69 73 74  for(i=0; i<pList
1d0b0 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20  ->nExpr; i++){. 
1d0c0 20 20 20 73 71 6c 69 74 65 33 50 72 69 6e 74 45     sqlite3PrintE
1d0d0 78 70 72 28 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e  xpr(pList->a[i].
1d0e0 70 45 78 70 72 29 3b 0a 20 20 20 20 69 66 28 20  pExpr);.    if( 
1d0f0 69 3c 70 4c 69 73 74 2d 3e 6e 45 78 70 72 2d 31  i<pList->nExpr-1
1d100 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
1d110 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 2c 20  3DebugPrintf(", 
1d120 22 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a  ");.    }.  }.}.
1d130 76 6f 69 64 20 73 71 6c 69 74 65 33 50 72 69 6e  void sqlite3Prin
1d140 74 53 65 6c 65 63 74 28 53 65 6c 65 63 74 20 2a  tSelect(Select *
1d150 70 2c 20 69 6e 74 20 69 6e 64 65 6e 74 29 7b 0a  p, int indent){.
1d160 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72    sqlite3DebugPr
1d170 69 6e 74 66 28 22 25 2a 73 53 45 4c 45 43 54 28  intf("%*sSELECT(
1d180 25 70 29 20 22 2c 20 69 6e 64 65 6e 74 2c 20 22  %p) ", indent, "
1d190 22 2c 20 70 29 3b 0a 20 20 73 71 6c 69 74 65 33  ", p);.  sqlite3
1d1a0 50 72 69 6e 74 45 78 70 72 4c 69 73 74 28 70 2d  PrintExprList(p-
1d1b0 3e 70 45 4c 69 73 74 29 3b 0a 20 20 73 71 6c 69  >pEList);.  sqli
1d1c0 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22  te3DebugPrintf("
1d1d0 5c 6e 22 29 3b 0a 20 20 69 66 28 20 70 2d 3e 70  \n");.  if( p->p
1d1e0 53 72 63 20 29 7b 0a 20 20 20 20 63 68 61 72 20  Src ){.    char 
1d1f0 2a 7a 50 72 65 66 69 78 3b 0a 20 20 20 20 69 6e  *zPrefix;.    in
1d200 74 20 69 3b 0a 20 20 20 20 7a 50 72 65 66 69 78  t i;.    zPrefix
1d210 20 3d 20 22 46 52 4f 4d 22 3b 0a 20 20 20 20 66   = "FROM";.    f
1d220 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 70 53 72  or(i=0; i<p->pSr
1d230 63 2d 3e 6e 53 72 63 3b 20 69 2b 2b 29 7b 0a 20  c->nSrc; i++){. 
1d240 20 20 20 20 20 73 74 72 75 63 74 20 53 72 63 4c       struct SrcL
1d250 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 20  ist_item *pItem 
1d260 3d 20 26 70 2d 3e 70 53 72 63 2d 3e 61 5b 69 5d  = &p->pSrc->a[i]
1d270 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 44  ;.      sqlite3D
1d280 65 62 75 67 50 72 69 6e 74 66 28 22 25 2a 73 20  ebugPrintf("%*s 
1d290 22 2c 20 69 6e 64 65 6e 74 2b 36 2c 20 7a 50 72  ", indent+6, zPr
1d2a0 65 66 69 78 29 3b 0a 20 20 20 20 20 20 7a 50 72  efix);.      zPr
1d2b0 65 66 69 78 20 3d 20 22 22 3b 0a 20 20 20 20 20  efix = "";.     
1d2c0 20 69 66 28 20 70 49 74 65 6d 2d 3e 70 53 65 6c   if( pItem->pSel
1d2d0 65 63 74 20 29 7b 0a 20 20 20 20 20 20 20 20 73  ect ){.        s
1d2e0 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74  qlite3DebugPrint
1d2f0 66 28 22 28 5c 6e 22 29 3b 0a 20 20 20 20 20 20  f("(\n");.      
1d300 20 20 73 71 6c 69 74 65 33 50 72 69 6e 74 53 65    sqlite3PrintSe
1d310 6c 65 63 74 28 70 49 74 65 6d 2d 3e 70 53 65 6c  lect(pItem->pSel
1d320 65 63 74 2c 20 69 6e 64 65 6e 74 2b 31 30 29 3b  ect, indent+10);
1d330 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
1d340 44 65 62 75 67 50 72 69 6e 74 66 28 22 25 2a 73  DebugPrintf("%*s
1d350 29 22 2c 20 69 6e 64 65 6e 74 2b 38 2c 20 22 22  )", indent+8, ""
1d360 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69  );.      }else i
1d370 66 28 20 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65 20  f( pItem->zName 
1d380 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
1d390 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 25  e3DebugPrintf("%
1d3a0 73 22 2c 20 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65  s", pItem->zName
1d3b0 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
1d3c0 20 69 66 28 20 70 49 74 65 6d 2d 3e 70 54 61 62   if( pItem->pTab
1d3d0 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
1d3e0 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22  te3DebugPrintf("
1d3f0 28 74 61 62 6c 65 3a 20 25 73 29 22 2c 20 70 49  (table: %s)", pI
1d400 74 65 6d 2d 3e 70 54 61 62 2d 3e 7a 4e 61 6d 65  tem->pTab->zName
1d410 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
1d420 20 69 66 28 20 70 49 74 65 6d 2d 3e 7a 41 6c 69   if( pItem->zAli
1d430 61 73 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  as ){.        sq
1d440 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66  lite3DebugPrintf
1d450 28 22 20 41 53 20 25 73 22 2c 20 70 49 74 65 6d  (" AS %s", pItem
1d460 2d 3e 7a 41 6c 69 61 73 29 3b 0a 20 20 20 20 20  ->zAlias);.     
1d470 20 7d 0a 20 20 20 20 20 20 69 66 28 20 69 3c 70   }.      if( i<p
1d480 2d 3e 70 53 72 63 2d 3e 6e 53 72 63 2d 31 20 29  ->pSrc->nSrc-1 )
1d490 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
1d4a0 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 2c 22  3DebugPrintf(","
1d4b0 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
1d4c0 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69   sqlite3DebugPri
1d4d0 6e 74 66 28 22 5c 6e 22 29 3b 0a 20 20 20 20 7d  ntf("\n");.    }
1d4e0 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e 70 57  .  }.  if( p->pW
1d4f0 68 65 72 65 20 29 7b 0a 20 20 20 20 73 71 6c 69  here ){.    sqli
1d500 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22  te3DebugPrintf("
1d510 25 2a 73 20 57 48 45 52 45 20 22 2c 20 69 6e 64  %*s WHERE ", ind
1d520 65 6e 74 2c 20 22 22 29 3b 0a 20 20 20 20 73 71  ent, "");.    sq
1d530 6c 69 74 65 33 50 72 69 6e 74 45 78 70 72 28 70  lite3PrintExpr(p
1d540 2d 3e 70 57 68 65 72 65 29 3b 0a 20 20 20 20 73  ->pWhere);.    s
1d550 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74  qlite3DebugPrint
1d560 66 28 22 5c 6e 22 29 3b 0a 20 20 7d 0a 20 20 69  f("\n");.  }.  i
1d570 66 28 20 70 2d 3e 70 47 72 6f 75 70 42 79 20 29  f( p->pGroupBy )
1d580 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 65 62  {.    sqlite3Deb
1d590 75 67 50 72 69 6e 74 66 28 22 25 2a 73 20 47 52  ugPrintf("%*s GR
1d5a0 4f 55 50 20 42 59 20 22 2c 20 69 6e 64 65 6e 74  OUP BY ", indent
1d5b0 2c 20 22 22 29 3b 0a 20 20 20 20 73 71 6c 69 74  , "");.    sqlit
1d5c0 65 33 50 72 69 6e 74 45 78 70 72 4c 69 73 74 28  e3PrintExprList(
1d5d0 70 2d 3e 70 47 72 6f 75 70 42 79 29 3b 0a 20 20  p->pGroupBy);.  
1d5e0 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72    sqlite3DebugPr
1d5f0 69 6e 74 66 28 22 5c 6e 22 29 3b 0a 20 20 7d 0a  intf("\n");.  }.
1d600 20 20 69 66 28 20 70 2d 3e 70 48 61 76 69 6e 67    if( p->pHaving
1d610 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 44   ){.    sqlite3D
1d620 65 62 75 67 50 72 69 6e 74 66 28 22 25 2a 73 20  ebugPrintf("%*s 
1d630 48 41 56 49 4e 47 20 22 2c 20 69 6e 64 65 6e 74  HAVING ", indent
1d640 2c 20 22 22 29 3b 0a 20 20 20 20 73 71 6c 69 74  , "");.    sqlit
1d650 65 33 50 72 69 6e 74 45 78 70 72 28 70 2d 3e 70  e3PrintExpr(p->p
1d660 48 61 76 69 6e 67 29 3b 0a 20 20 20 20 73 71 6c  Having);.    sql
1d670 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28  ite3DebugPrintf(
1d680 22 5c 6e 22 29 3b 0a 20 20 7d 0a 20 20 69 66 28  "\n");.  }.  if(
1d690 20 70 2d 3e 70 4f 72 64 65 72 42 79 20 29 7b 0a   p->pOrderBy ){.
1d6a0 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67      sqlite3Debug
1d6b0 50 72 69 6e 74 66 28 22 25 2a 73 20 4f 52 44 45  Printf("%*s ORDE
1d6c0 52 20 42 59 20 22 2c 20 69 6e 64 65 6e 74 2c 20  R BY ", indent, 
1d6d0 22 22 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  "");.    sqlite3
1d6e0 50 72 69 6e 74 45 78 70 72 4c 69 73 74 28 70 2d  PrintExprList(p-
1d6f0 3e 70 4f 72 64 65 72 42 79 29 3b 0a 20 20 20 20  >pOrderBy);.    
1d700 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e  sqlite3DebugPrin
1d710 74 66 28 22 5c 6e 22 29 3b 0a 20 20 7d 0a 7d 0a  tf("\n");.  }.}.
1d720 2f 2a 20 45 6e 64 20 6f 66 20 74 68 65 20 73 74  /* End of the st
1d730 72 75 63 74 75 72 65 20 64 65 62 75 67 20 70 72  ructure debug pr
1d740 69 6e 74 69 6e 67 20 63 6f 64 65 0a 2a 2a 2a 2a  inting code.****
1d750 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1d760 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1d770 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1d780 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1d790 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 23 65 6e 64 69  *********/.#endi
1d7a0 66 20 2f 2a 20 64 65 66 69 6e 65 64 28 53 51 4c  f /* defined(SQL
1d7b0 49 54 45 5f 54 45 53 54 29 20 7c 7c 20 64 65 66  ITE_TEST) || def
1d7c0 69 6e 65 64 28 53 51 4c 49 54 45 5f 44 45 42 55  ined(SQLITE_DEBU
1d7d0 47 29 20 2a 2f 0a                                G) */.