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

Artifact d0a1e01a2a6c05bd60324e843c7e4581d3605950:


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 34 31 35  select.c,v 1.415
0200: 20 32 30 30 38 2f 30 33 2f 30 34 20 31 37 3a 34   2008/03/04 17:4
0210: 35 3a 30 31 20 6d 6c 63 72 65 65 63 68 20 45 78  5:01 mlcreech Ex
0220: 70 20 24 0a 2a 2f 0a 23 69 6e 63 6c 75 64 65 20  p $.*/.#include 
0230: 22 73 71 6c 69 74 65 49 6e 74 2e 68 22 0a 0a 0a  "sqliteInt.h"...
0240: 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 61 6c 6c  /*.** Delete all
0250: 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20   the content of 
0260: 61 20 53 65 6c 65 63 74 20 73 74 72 75 63 74 75  a Select structu
0270: 72 65 20 62 75 74 20 64 6f 20 6e 6f 74 20 64 65  re but do not de
0280: 61 6c 6c 6f 63 61 74 65 0a 2a 2a 20 74 68 65 20  allocate.** the 
0290: 73 65 6c 65 63 74 20 73 74 72 75 63 74 75 72 65  select structure
02a0: 20 69 74 73 65 6c 66 2e 0a 2a 2f 0a 73 74 61 74   itself..*/.stat
02b0: 69 63 20 76 6f 69 64 20 63 6c 65 61 72 53 65 6c  ic void clearSel
02c0: 65 63 74 28 53 65 6c 65 63 74 20 2a 70 29 7b 0a  ect(Select *p){.
02d0: 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73    sqlite3ExprLis
02e0: 74 44 65 6c 65 74 65 28 70 2d 3e 70 45 4c 69 73  tDelete(p->pELis
02f0: 74 29 3b 0a 20 20 73 71 6c 69 74 65 33 53 72 63  t);.  sqlite3Src
0300: 4c 69 73 74 44 65 6c 65 74 65 28 70 2d 3e 70 53  ListDelete(p->pS
0310: 72 63 29 3b 0a 20 20 73 71 6c 69 74 65 33 45 78  rc);.  sqlite3Ex
0320: 70 72 44 65 6c 65 74 65 28 70 2d 3e 70 57 68 65  prDelete(p->pWhe
0330: 72 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 45 78  re);.  sqlite3Ex
0340: 70 72 4c 69 73 74 44 65 6c 65 74 65 28 70 2d 3e  prListDelete(p->
0350: 70 47 72 6f 75 70 42 79 29 3b 0a 20 20 73 71 6c  pGroupBy);.  sql
0360: 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 70  ite3ExprDelete(p
0370: 2d 3e 70 48 61 76 69 6e 67 29 3b 0a 20 20 73 71  ->pHaving);.  sq
0380: 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c  lite3ExprListDel
0390: 65 74 65 28 70 2d 3e 70 4f 72 64 65 72 42 79 29  ete(p->pOrderBy)
03a0: 3b 0a 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63  ;.  sqlite3Selec
03b0: 74 44 65 6c 65 74 65 28 70 2d 3e 70 50 72 69 6f  tDelete(p->pPrio
03c0: 72 29 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70  r);.  sqlite3Exp
03d0: 72 44 65 6c 65 74 65 28 70 2d 3e 70 4c 69 6d 69  rDelete(p->pLimi
03e0: 74 29 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70  t);.  sqlite3Exp
03f0: 72 44 65 6c 65 74 65 28 70 2d 3e 70 4f 66 66 73  rDelete(p->pOffs
0400: 65 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e  et);.}../*.** In
0410: 69 74 69 61 6c 69 7a 65 20 61 20 53 65 6c 65 63  itialize a Selec
0420: 74 44 65 73 74 20 73 74 72 75 63 74 75 72 65 2e  tDest structure.
0430: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
0440: 53 65 6c 65 63 74 44 65 73 74 49 6e 69 74 28 53  SelectDestInit(S
0450: 65 6c 65 63 74 44 65 73 74 20 2a 70 44 65 73 74  electDest *pDest
0460: 2c 20 69 6e 74 20 65 44 65 73 74 2c 20 69 6e 74  , int eDest, int
0470: 20 69 50 61 72 6d 29 7b 0a 20 20 70 44 65 73 74   iParm){.  pDest
0480: 2d 3e 65 44 65 73 74 20 3d 20 65 44 65 73 74 3b  ->eDest = eDest;
0490: 0a 20 20 70 44 65 73 74 2d 3e 69 50 61 72 6d 20  .  pDest->iParm 
04a0: 3d 20 69 50 61 72 6d 3b 0a 20 20 70 44 65 73 74  = iParm;.  pDest
04b0: 2d 3e 61 66 66 69 6e 69 74 79 20 3d 20 30 3b 0a  ->affinity = 0;.
04c0: 20 20 70 44 65 73 74 2d 3e 69 4d 65 6d 20 3d 20    pDest->iMem = 
04d0: 30 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c  0;.}.../*.** All
04e0: 6f 63 61 74 65 20 61 20 6e 65 77 20 53 65 6c 65  ocate a new Sele
04f0: 63 74 20 73 74 72 75 63 74 75 72 65 20 61 6e 64  ct structure and
0500: 20 72 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65   return a pointe
0510: 72 20 74 6f 20 74 68 61 74 0a 2a 2a 20 73 74 72  r to that.** str
0520: 75 63 74 75 72 65 2e 0a 2a 2f 0a 53 65 6c 65 63  ucture..*/.Selec
0530: 74 20 2a 73 71 6c 69 74 65 33 53 65 6c 65 63 74  t *sqlite3Select
0540: 4e 65 77 28 0a 20 20 50 61 72 73 65 20 2a 70 50  New(.  Parse *pP
0550: 61 72 73 65 2c 20 20 20 20 20 20 20 20 2f 2a 20  arse,        /* 
0560: 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20  Parsing context 
0570: 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70  */.  ExprList *p
0580: 45 4c 69 73 74 2c 20 20 20 20 20 2f 2a 20 77 68  EList,     /* wh
0590: 69 63 68 20 63 6f 6c 75 6d 6e 73 20 74 6f 20 69  ich columns to i
05a0: 6e 63 6c 75 64 65 20 69 6e 20 74 68 65 20 72 65  nclude in the re
05b0: 73 75 6c 74 20 2a 2f 0a 20 20 53 72 63 4c 69 73  sult */.  SrcLis
05c0: 74 20 2a 70 53 72 63 2c 20 20 20 20 20 20 20 20  t *pSrc,        
05d0: 2f 2a 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75  /* the FROM clau
05e0: 73 65 20 2d 2d 20 77 68 69 63 68 20 74 61 62 6c  se -- which tabl
05f0: 65 73 20 74 6f 20 73 63 61 6e 20 2a 2f 0a 20 20  es to scan */.  
0600: 45 78 70 72 20 2a 70 57 68 65 72 65 2c 20 20 20  Expr *pWhere,   
0610: 20 20 20 20 20 20 2f 2a 20 74 68 65 20 57 48 45        /* the WHE
0620: 52 45 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 45  RE clause */.  E
0630: 78 70 72 4c 69 73 74 20 2a 70 47 72 6f 75 70 42  xprList *pGroupB
0640: 79 2c 20 20 20 2f 2a 20 74 68 65 20 47 52 4f 55  y,   /* the GROU
0650: 50 20 42 59 20 63 6c 61 75 73 65 20 2a 2f 0a 20  P BY clause */. 
0660: 20 45 78 70 72 20 2a 70 48 61 76 69 6e 67 2c 20   Expr *pHaving, 
0670: 20 20 20 20 20 20 20 2f 2a 20 74 68 65 20 48 41         /* the HA
0680: 56 49 4e 47 20 63 6c 61 75 73 65 20 2a 2f 0a 20  VING clause */. 
0690: 20 45 78 70 72 4c 69 73 74 20 2a 70 4f 72 64 65   ExprList *pOrde
06a0: 72 42 79 2c 20 20 20 2f 2a 20 74 68 65 20 4f 52  rBy,   /* the OR
06b0: 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 2a 2f  DER BY clause */
06c0: 0a 20 20 69 6e 74 20 69 73 44 69 73 74 69 6e 63  .  int isDistinc
06d0: 74 2c 20 20 20 20 20 20 20 2f 2a 20 74 72 75 65  t,       /* true
06e0: 20 69 66 20 74 68 65 20 44 49 53 54 49 4e 43 54   if the DISTINCT
06f0: 20 6b 65 79 77 6f 72 64 20 69 73 20 70 72 65 73   keyword is pres
0700: 65 6e 74 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70  ent */.  Expr *p
0710: 4c 69 6d 69 74 2c 20 20 20 20 20 20 20 20 20 2f  Limit,         /
0720: 2a 20 4c 49 4d 49 54 20 76 61 6c 75 65 2e 20 20  * LIMIT value.  
0730: 4e 55 4c 4c 20 6d 65 61 6e 73 20 6e 6f 74 20 75  NULL means not u
0740: 73 65 64 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70  sed */.  Expr *p
0750: 4f 66 66 73 65 74 20 20 20 20 20 20 20 20 20 2f  Offset         /
0760: 2a 20 4f 46 46 53 45 54 20 76 61 6c 75 65 2e 20  * OFFSET value. 
0770: 20 4e 55 4c 4c 20 6d 65 61 6e 73 20 6e 6f 20 6f   NULL means no o
0780: 66 66 73 65 74 20 2a 2f 0a 29 7b 0a 20 20 53 65  ffset */.){.  Se
0790: 6c 65 63 74 20 2a 70 4e 65 77 3b 0a 20 20 53 65  lect *pNew;.  Se
07a0: 6c 65 63 74 20 73 74 61 6e 64 69 6e 3b 0a 20 20  lect standin;.  
07b0: 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50  sqlite3 *db = pP
07c0: 61 72 73 65 2d 3e 64 62 3b 0a 20 20 70 4e 65 77  arse->db;.  pNew
07d0: 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c   = sqlite3DbMall
07e0: 6f 63 5a 65 72 6f 28 64 62 2c 20 73 69 7a 65 6f  ocZero(db, sizeo
07f0: 66 28 2a 70 4e 65 77 29 20 29 3b 0a 20 20 61 73  f(*pNew) );.  as
0800: 73 65 72 74 28 20 21 70 4f 66 66 73 65 74 20 7c  sert( !pOffset |
0810: 7c 20 70 4c 69 6d 69 74 20 29 3b 20 20 20 2f 2a  | pLimit );   /*
0820: 20 43 61 6e 27 74 20 68 61 76 65 20 4f 46 46 53   Can't have OFFS
0830: 45 54 20 77 69 74 68 6f 75 74 20 4c 49 4d 49 54  ET without LIMIT
0840: 2e 20 2a 2f 0a 20 20 69 66 28 20 70 4e 65 77 3d  . */.  if( pNew=
0850: 3d 30 20 29 7b 0a 20 20 20 20 70 4e 65 77 20 3d  =0 ){.    pNew =
0860: 20 26 73 74 61 6e 64 69 6e 3b 0a 20 20 20 20 6d   &standin;.    m
0870: 65 6d 73 65 74 28 70 4e 65 77 2c 20 30 2c 20 73  emset(pNew, 0, s
0880: 69 7a 65 6f 66 28 2a 70 4e 65 77 29 29 3b 0a 20  izeof(*pNew));. 
0890: 20 7d 0a 20 20 69 66 28 20 70 45 4c 69 73 74 3d   }.  if( pEList=
08a0: 3d 30 20 29 7b 0a 20 20 20 20 70 45 4c 69 73 74  =0 ){.    pEList
08b0: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69   = sqlite3ExprLi
08c0: 73 74 41 70 70 65 6e 64 28 70 50 61 72 73 65 2c  stAppend(pParse,
08d0: 20 30 2c 20 73 71 6c 69 74 65 33 45 78 70 72 28   0, sqlite3Expr(
08e0: 64 62 2c 54 4b 5f 41 4c 4c 2c 30 2c 30 2c 30 29  db,TK_ALL,0,0,0)
08f0: 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 70 4e 65 77  , 0);.  }.  pNew
0900: 2d 3e 70 45 4c 69 73 74 20 3d 20 70 45 4c 69 73  ->pEList = pELis
0910: 74 3b 0a 20 20 70 4e 65 77 2d 3e 70 53 72 63 20  t;.  pNew->pSrc 
0920: 3d 20 70 53 72 63 3b 0a 20 20 70 4e 65 77 2d 3e  = pSrc;.  pNew->
0930: 70 57 68 65 72 65 20 3d 20 70 57 68 65 72 65 3b  pWhere = pWhere;
0940: 0a 20 20 70 4e 65 77 2d 3e 70 47 72 6f 75 70 42  .  pNew->pGroupB
0950: 79 20 3d 20 70 47 72 6f 75 70 42 79 3b 0a 20 20  y = pGroupBy;.  
0960: 70 4e 65 77 2d 3e 70 48 61 76 69 6e 67 20 3d 20  pNew->pHaving = 
0970: 70 48 61 76 69 6e 67 3b 0a 20 20 70 4e 65 77 2d  pHaving;.  pNew-
0980: 3e 70 4f 72 64 65 72 42 79 20 3d 20 70 4f 72 64  >pOrderBy = pOrd
0990: 65 72 42 79 3b 0a 20 20 70 4e 65 77 2d 3e 69 73  erBy;.  pNew->is
09a0: 44 69 73 74 69 6e 63 74 20 3d 20 69 73 44 69 73  Distinct = isDis
09b0: 74 69 6e 63 74 3b 0a 20 20 70 4e 65 77 2d 3e 6f  tinct;.  pNew->o
09c0: 70 20 3d 20 54 4b 5f 53 45 4c 45 43 54 3b 0a 20  p = TK_SELECT;. 
09d0: 20 61 73 73 65 72 74 28 20 70 4f 66 66 73 65 74   assert( pOffset
09e0: 3d 3d 30 20 7c 7c 20 70 4c 69 6d 69 74 21 3d 30  ==0 || pLimit!=0
09f0: 20 29 3b 0a 20 20 70 4e 65 77 2d 3e 70 4c 69 6d   );.  pNew->pLim
0a00: 69 74 20 3d 20 70 4c 69 6d 69 74 3b 0a 20 20 70  it = pLimit;.  p
0a10: 4e 65 77 2d 3e 70 4f 66 66 73 65 74 20 3d 20 70  New->pOffset = p
0a20: 4f 66 66 73 65 74 3b 0a 20 20 70 4e 65 77 2d 3e  Offset;.  pNew->
0a30: 69 4c 69 6d 69 74 20 3d 20 2d 31 3b 0a 20 20 70  iLimit = -1;.  p
0a40: 4e 65 77 2d 3e 69 4f 66 66 73 65 74 20 3d 20 2d  New->iOffset = -
0a50: 31 3b 0a 20 20 70 4e 65 77 2d 3e 61 64 64 72 4f  1;.  pNew->addrO
0a60: 70 65 6e 45 70 68 6d 5b 30 5d 20 3d 20 2d 31 3b  penEphm[0] = -1;
0a70: 0a 20 20 70 4e 65 77 2d 3e 61 64 64 72 4f 70 65  .  pNew->addrOpe
0a80: 6e 45 70 68 6d 5b 31 5d 20 3d 20 2d 31 3b 0a 20  nEphm[1] = -1;. 
0a90: 20 70 4e 65 77 2d 3e 61 64 64 72 4f 70 65 6e 45   pNew->addrOpenE
0aa0: 70 68 6d 5b 32 5d 20 3d 20 2d 31 3b 0a 20 20 69  phm[2] = -1;.  i
0ab0: 66 28 20 70 4e 65 77 3d 3d 26 73 74 61 6e 64 69  f( pNew==&standi
0ac0: 6e 29 20 7b 0a 20 20 20 20 63 6c 65 61 72 53 65  n) {.    clearSe
0ad0: 6c 65 63 74 28 70 4e 65 77 29 3b 0a 20 20 20 20  lect(pNew);.    
0ae0: 70 4e 65 77 20 3d 20 30 3b 0a 20 20 7d 0a 20 20  pNew = 0;.  }.  
0af0: 72 65 74 75 72 6e 20 70 4e 65 77 3b 0a 7d 0a 0a  return pNew;.}..
0b00: 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 74 68 65  /*.** Delete the
0b10: 20 67 69 76 65 6e 20 53 65 6c 65 63 74 20 73 74   given Select st
0b20: 72 75 63 74 75 72 65 20 61 6e 64 20 61 6c 6c 20  ructure and all 
0b30: 6f 66 20 69 74 73 20 73 75 62 73 74 72 75 63 74  of its substruct
0b40: 75 72 65 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  ures..*/.void sq
0b50: 6c 69 74 65 33 53 65 6c 65 63 74 44 65 6c 65 74  lite3SelectDelet
0b60: 65 28 53 65 6c 65 63 74 20 2a 70 29 7b 0a 20 20  e(Select *p){.  
0b70: 69 66 28 20 70 20 29 7b 0a 20 20 20 20 63 6c 65  if( p ){.    cle
0b80: 61 72 53 65 6c 65 63 74 28 70 29 3b 0a 20 20 20  arSelect(p);.   
0b90: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 29   sqlite3_free(p)
0ba0: 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47  ;.  }.}../*.** G
0bb0: 69 76 65 6e 20 31 20 74 6f 20 33 20 69 64 65 6e  iven 1 to 3 iden
0bc0: 74 69 66 69 65 72 73 20 70 72 65 63 65 65 64 69  tifiers preceedi
0bd0: 6e 67 20 74 68 65 20 4a 4f 49 4e 20 6b 65 79 77  ng the JOIN keyw
0be0: 6f 72 64 2c 20 64 65 74 65 72 6d 69 6e 65 20 74  ord, determine t
0bf0: 68 65 0a 2a 2a 20 74 79 70 65 20 6f 66 20 6a 6f  he.** type of jo
0c00: 69 6e 2e 20 20 52 65 74 75 72 6e 20 61 6e 20 69  in.  Return an i
0c10: 6e 74 65 67 65 72 20 63 6f 6e 73 74 61 6e 74 20  nteger constant 
0c20: 74 68 61 74 20 65 78 70 72 65 73 73 65 73 20 74  that expresses t
0c30: 68 61 74 20 74 79 70 65 0a 2a 2a 20 69 6e 20 74  hat type.** in t
0c40: 65 72 6d 73 20 6f 66 20 74 68 65 20 66 6f 6c 6c  erms of the foll
0c50: 6f 77 69 6e 67 20 62 69 74 20 76 61 6c 75 65 73  owing bit values
0c60: 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 4a 54 5f 49  :.**.**     JT_I
0c70: 4e 4e 45 52 0a 2a 2a 20 20 20 20 20 4a 54 5f 43  NNER.**     JT_C
0c80: 52 4f 53 53 0a 2a 2a 20 20 20 20 20 4a 54 5f 4f  ROSS.**     JT_O
0c90: 55 54 45 52 0a 2a 2a 20 20 20 20 20 4a 54 5f 4e  UTER.**     JT_N
0ca0: 41 54 55 52 41 4c 0a 2a 2a 20 20 20 20 20 4a 54  ATURAL.**     JT
0cb0: 5f 4c 45 46 54 0a 2a 2a 20 20 20 20 20 4a 54 5f  _LEFT.**     JT_
0cc0: 52 49 47 48 54 0a 2a 2a 0a 2a 2a 20 41 20 66 75  RIGHT.**.** A fu
0cd0: 6c 6c 20 6f 75 74 65 72 20 6a 6f 69 6e 20 69 73  ll outer join is
0ce0: 20 74 68 65 20 63 6f 6d 62 69 6e 61 74 69 6f 6e   the combination
0cf0: 20 6f 66 20 4a 54 5f 4c 45 46 54 20 61 6e 64 20   of JT_LEFT and 
0d00: 4a 54 5f 52 49 47 48 54 2e 0a 2a 2a 0a 2a 2a 20  JT_RIGHT..**.** 
0d10: 49 66 20 61 6e 20 69 6c 6c 65 67 61 6c 20 6f 72  If an illegal or
0d20: 20 75 6e 73 75 70 70 6f 72 74 65 64 20 6a 6f 69   unsupported joi
0d30: 6e 20 74 79 70 65 20 69 73 20 73 65 65 6e 2c 20  n type is seen, 
0d40: 74 68 65 6e 20 73 74 69 6c 6c 20 72 65 74 75 72  then still retur
0d50: 6e 0a 2a 2a 20 61 20 6a 6f 69 6e 20 74 79 70 65  n.** a join type
0d60: 2c 20 62 75 74 20 70 75 74 20 61 6e 20 65 72 72  , but put an err
0d70: 6f 72 20 69 6e 20 74 68 65 20 70 50 61 72 73 65  or in the pParse
0d80: 20 73 74 72 75 63 74 75 72 65 2e 0a 2a 2f 0a 69   structure..*/.i
0d90: 6e 74 20 73 71 6c 69 74 65 33 4a 6f 69 6e 54 79  nt sqlite3JoinTy
0da0: 70 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  pe(Parse *pParse
0db0: 2c 20 54 6f 6b 65 6e 20 2a 70 41 2c 20 54 6f 6b  , Token *pA, Tok
0dc0: 65 6e 20 2a 70 42 2c 20 54 6f 6b 65 6e 20 2a 70  en *pB, Token *p
0dd0: 43 29 7b 0a 20 20 69 6e 74 20 6a 6f 69 6e 74 79  C){.  int jointy
0de0: 70 65 20 3d 20 30 3b 0a 20 20 54 6f 6b 65 6e 20  pe = 0;.  Token 
0df0: 2a 61 70 41 6c 6c 5b 33 5d 3b 0a 20 20 54 6f 6b  *apAll[3];.  Tok
0e00: 65 6e 20 2a 70 3b 0a 20 20 73 74 61 74 69 63 20  en *p;.  static 
0e10: 63 6f 6e 73 74 20 73 74 72 75 63 74 20 7b 0a 20  const struct {. 
0e20: 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 7a 4b     const char zK
0e30: 65 79 77 6f 72 64 5b 38 5d 3b 0a 20 20 20 20 75  eyword[8];.    u
0e40: 38 20 6e 43 68 61 72 3b 0a 20 20 20 20 75 38 20  8 nChar;.    u8 
0e50: 63 6f 64 65 3b 0a 20 20 7d 20 6b 65 79 77 6f 72  code;.  } keywor
0e60: 64 73 5b 5d 20 3d 20 7b 0a 20 20 20 20 7b 20 22  ds[] = {.    { "
0e70: 6e 61 74 75 72 61 6c 22 2c 20 37 2c 20 4a 54 5f  natural", 7, JT_
0e80: 4e 41 54 55 52 41 4c 20 7d 2c 0a 20 20 20 20 7b  NATURAL },.    {
0e90: 20 22 6c 65 66 74 22 2c 20 20 20 20 34 2c 20 4a   "left",    4, J
0ea0: 54 5f 4c 45 46 54 7c 4a 54 5f 4f 55 54 45 52 20  T_LEFT|JT_OUTER 
0eb0: 7d 2c 0a 20 20 20 20 7b 20 22 72 69 67 68 74 22  },.    { "right"
0ec0: 2c 20 20 20 35 2c 20 4a 54 5f 52 49 47 48 54 7c  ,   5, JT_RIGHT|
0ed0: 4a 54 5f 4f 55 54 45 52 20 7d 2c 0a 20 20 20 20  JT_OUTER },.    
0ee0: 7b 20 22 66 75 6c 6c 22 2c 20 20 20 20 34 2c 20  { "full",    4, 
0ef0: 4a 54 5f 4c 45 46 54 7c 4a 54 5f 52 49 47 48 54  JT_LEFT|JT_RIGHT
0f00: 7c 4a 54 5f 4f 55 54 45 52 20 7d 2c 0a 20 20 20  |JT_OUTER },.   
0f10: 20 7b 20 22 6f 75 74 65 72 22 2c 20 20 20 35 2c   { "outer",   5,
0f20: 20 4a 54 5f 4f 55 54 45 52 20 7d 2c 0a 20 20 20   JT_OUTER },.   
0f30: 20 7b 20 22 69 6e 6e 65 72 22 2c 20 20 20 35 2c   { "inner",   5,
0f40: 20 4a 54 5f 49 4e 4e 45 52 20 7d 2c 0a 20 20 20   JT_INNER },.   
0f50: 20 7b 20 22 63 72 6f 73 73 22 2c 20 20 20 35 2c   { "cross",   5,
0f60: 20 4a 54 5f 49 4e 4e 45 52 7c 4a 54 5f 43 52 4f   JT_INNER|JT_CRO
0f70: 53 53 20 7d 2c 0a 20 20 7d 3b 0a 20 20 69 6e 74  SS },.  };.  int
0f80: 20 69 2c 20 6a 3b 0a 20 20 61 70 41 6c 6c 5b 30   i, j;.  apAll[0
0f90: 5d 20 3d 20 70 41 3b 0a 20 20 61 70 41 6c 6c 5b  ] = pA;.  apAll[
0fa0: 31 5d 20 3d 20 70 42 3b 0a 20 20 61 70 41 6c 6c  1] = pB;.  apAll
0fb0: 5b 32 5d 20 3d 20 70 43 3b 0a 20 20 66 6f 72 28  [2] = pC;.  for(
0fc0: 69 3d 30 3b 20 69 3c 33 20 26 26 20 61 70 41 6c  i=0; i<3 && apAl
0fd0: 6c 5b 69 5d 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  l[i]; i++){.    
0fe0: 70 20 3d 20 61 70 41 6c 6c 5b 69 5d 3b 0a 20 20  p = apAll[i];.  
0ff0: 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 73 69 7a    for(j=0; j<siz
1000: 65 6f 66 28 6b 65 79 77 6f 72 64 73 29 2f 73 69  eof(keywords)/si
1010: 7a 65 6f 66 28 6b 65 79 77 6f 72 64 73 5b 30 5d  zeof(keywords[0]
1020: 29 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 69  ); j++){.      i
1030: 66 28 20 70 2d 3e 6e 3d 3d 6b 65 79 77 6f 72 64  f( p->n==keyword
1040: 73 5b 6a 5d 2e 6e 43 68 61 72 20 0a 20 20 20 20  s[j].nChar .    
1050: 20 20 20 20 20 20 26 26 20 73 71 6c 69 74 65 33        && sqlite3
1060: 53 74 72 4e 49 43 6d 70 28 28 63 68 61 72 2a 29  StrNICmp((char*)
1070: 70 2d 3e 7a 2c 20 6b 65 79 77 6f 72 64 73 5b 6a  p->z, keywords[j
1080: 5d 2e 7a 4b 65 79 77 6f 72 64 2c 20 70 2d 3e 6e  ].zKeyword, p->n
1090: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )==0 ){.        
10a0: 6a 6f 69 6e 74 79 70 65 20 7c 3d 20 6b 65 79 77  jointype |= keyw
10b0: 6f 72 64 73 5b 6a 5d 2e 63 6f 64 65 3b 0a 20 20  ords[j].code;.  
10c0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
10d0: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69     }.    }.    i
10e0: 66 28 20 6a 3e 3d 73 69 7a 65 6f 66 28 6b 65 79  f( j>=sizeof(key
10f0: 77 6f 72 64 73 29 2f 73 69 7a 65 6f 66 28 6b 65  words)/sizeof(ke
1100: 79 77 6f 72 64 73 5b 30 5d 29 20 29 7b 0a 20 20  ywords[0]) ){.  
1110: 20 20 20 20 6a 6f 69 6e 74 79 70 65 20 7c 3d 20      jointype |= 
1120: 4a 54 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20  JT_ERROR;.      
1130: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d  break;.    }.  }
1140: 0a 20 20 69 66 28 0a 20 20 20 20 20 28 6a 6f 69  .  if(.     (joi
1150: 6e 74 79 70 65 20 26 20 28 4a 54 5f 49 4e 4e 45  ntype & (JT_INNE
1160: 52 7c 4a 54 5f 4f 55 54 45 52 29 29 3d 3d 28 4a  R|JT_OUTER))==(J
1170: 54 5f 49 4e 4e 45 52 7c 4a 54 5f 4f 55 54 45 52  T_INNER|JT_OUTER
1180: 29 20 7c 7c 0a 20 20 20 20 20 28 6a 6f 69 6e 74  ) ||.     (joint
1190: 79 70 65 20 26 20 4a 54 5f 45 52 52 4f 52 29 21  ype & JT_ERROR)!
11a0: 3d 30 0a 20 20 29 7b 0a 20 20 20 20 63 6f 6e 73  =0.  ){.    cons
11b0: 74 20 63 68 61 72 20 2a 7a 53 70 31 20 3d 20 22  t char *zSp1 = "
11c0: 20 22 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68   ";.    const ch
11d0: 61 72 20 2a 7a 53 70 32 20 3d 20 22 20 22 3b 0a  ar *zSp2 = " ";.
11e0: 20 20 20 20 69 66 28 20 70 42 3d 3d 30 20 29 7b      if( pB==0 ){
11f0: 20 7a 53 70 31 2b 2b 3b 20 7d 0a 20 20 20 20 69   zSp1++; }.    i
1200: 66 28 20 70 43 3d 3d 30 20 29 7b 20 7a 53 70 32  f( pC==0 ){ zSp2
1210: 2b 2b 3b 20 7d 0a 20 20 20 20 73 71 6c 69 74 65  ++; }.    sqlite
1220: 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
1230: 2c 20 22 75 6e 6b 6e 6f 77 6e 20 6f 72 20 75 6e  , "unknown or un
1240: 73 75 70 70 6f 72 74 65 64 20 6a 6f 69 6e 20 74  supported join t
1250: 79 70 65 3a 20 22 0a 20 20 20 20 20 20 20 22 25  ype: ".       "%
1260: 54 25 73 25 54 25 73 25 54 22 2c 20 70 41 2c 20  T%s%T%s%T", pA, 
1270: 7a 53 70 31 2c 20 70 42 2c 20 7a 53 70 32 2c 20  zSp1, pB, zSp2, 
1280: 70 43 29 3b 0a 20 20 20 20 6a 6f 69 6e 74 79 70  pC);.    jointyp
1290: 65 20 3d 20 4a 54 5f 49 4e 4e 45 52 3b 0a 20 20  e = JT_INNER;.  
12a0: 7d 65 6c 73 65 20 69 66 28 20 6a 6f 69 6e 74 79  }else if( jointy
12b0: 70 65 20 26 20 4a 54 5f 52 49 47 48 54 20 29 7b  pe & JT_RIGHT ){
12c0: 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f  .    sqlite3Erro
12d0: 72 4d 73 67 28 70 50 61 72 73 65 2c 20 0a 20 20  rMsg(pParse, .  
12e0: 20 20 20 20 22 52 49 47 48 54 20 61 6e 64 20 46      "RIGHT and F
12f0: 55 4c 4c 20 4f 55 54 45 52 20 4a 4f 49 4e 73 20  ULL OUTER JOINs 
1300: 61 72 65 20 6e 6f 74 20 63 75 72 72 65 6e 74 6c  are not currentl
1310: 79 20 73 75 70 70 6f 72 74 65 64 22 29 3b 0a 20  y supported");. 
1320: 20 20 20 6a 6f 69 6e 74 79 70 65 20 3d 20 4a 54     jointype = JT
1330: 5f 49 4e 4e 45 52 3b 0a 20 20 7d 0a 20 20 72 65  _INNER;.  }.  re
1340: 74 75 72 6e 20 6a 6f 69 6e 74 79 70 65 3b 0a 7d  turn jointype;.}
1350: 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
1360: 68 65 20 69 6e 64 65 78 20 6f 66 20 61 20 63 6f  he index of a co
1370: 6c 75 6d 6e 20 69 6e 20 61 20 74 61 62 6c 65 2e  lumn in a table.
1380: 20 20 52 65 74 75 72 6e 20 2d 31 20 69 66 20 74    Return -1 if t
1390: 68 65 20 63 6f 6c 75 6d 6e 0a 2a 2a 20 69 73 20  he column.** is 
13a0: 6e 6f 74 20 63 6f 6e 74 61 69 6e 65 64 20 69 6e  not contained in
13b0: 20 74 68 65 20 74 61 62 6c 65 2e 0a 2a 2f 0a 73   the table..*/.s
13c0: 74 61 74 69 63 20 69 6e 74 20 63 6f 6c 75 6d 6e  tatic int column
13d0: 49 6e 64 65 78 28 54 61 62 6c 65 20 2a 70 54 61  Index(Table *pTa
13e0: 62 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  b, const char *z
13f0: 43 6f 6c 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20  Col){.  int i;. 
1400: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 54 61 62   for(i=0; i<pTab
1410: 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20  ->nCol; i++){.  
1420: 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 74 72    if( sqlite3Str
1430: 49 43 6d 70 28 70 54 61 62 2d 3e 61 43 6f 6c 5b  ICmp(pTab->aCol[
1440: 69 5d 2e 7a 4e 61 6d 65 2c 20 7a 43 6f 6c 29 3d  i].zName, zCol)=
1450: 3d 30 20 29 20 72 65 74 75 72 6e 20 69 3b 0a 20  =0 ) return i;. 
1460: 20 7d 0a 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a   }.  return -1;.
1470: 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65  }../*.** Set the
1480: 20 76 61 6c 75 65 20 6f 66 20 61 20 74 6f 6b 65   value of a toke
1490: 6e 20 74 6f 20 61 20 27 5c 30 30 30 27 2d 74 65  n to a '\000'-te
14a0: 72 6d 69 6e 61 74 65 64 20 73 74 72 69 6e 67 2e  rminated string.
14b0: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
14c0: 73 65 74 54 6f 6b 65 6e 28 54 6f 6b 65 6e 20 2a  setToken(Token *
14d0: 70 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  p, const char *z
14e0: 29 7b 0a 20 20 70 2d 3e 7a 20 3d 20 28 75 38 2a  ){.  p->z = (u8*
14f0: 29 7a 3b 0a 20 20 70 2d 3e 6e 20 3d 20 7a 20 3f  )z;.  p->n = z ?
1500: 20 73 74 72 6c 65 6e 28 7a 29 20 3a 20 30 3b 0a   strlen(z) : 0;.
1510: 20 20 70 2d 3e 64 79 6e 20 3d 20 30 3b 0a 7d 0a    p->dyn = 0;.}.
1520: 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 74  ./*.** Set the t
1530: 6f 6b 65 6e 20 74 6f 20 74 68 65 20 64 6f 75 62  oken to the doub
1540: 6c 65 2d 71 75 6f 74 65 64 20 61 6e 64 20 65 73  le-quoted and es
1550: 63 61 70 65 64 20 76 65 72 73 69 6f 6e 20 6f 66  caped version of
1560: 20 74 68 65 20 73 74 72 69 6e 67 20 70 6f 69 6e   the string poin
1570: 74 65 64 0a 2a 2a 20 74 6f 20 62 79 20 7a 2e 20  ted.** to by z. 
1580: 46 6f 72 20 65 78 61 6d 70 6c 65 3b 0a 2a 2a 0a  For example;.**.
1590: 2a 2a 20 20 20 20 7b 61 22 62 63 7d 20 20 2d 3e  **    {a"bc}  ->
15a0: 20 20 7b 22 61 22 22 62 63 22 7d 0a 2a 2f 0a 73    {"a""bc"}.*/.s
15b0: 74 61 74 69 63 20 76 6f 69 64 20 73 65 74 51 75  tatic void setQu
15c0: 6f 74 65 64 54 6f 6b 65 6e 28 50 61 72 73 65 20  otedToken(Parse 
15d0: 2a 70 50 61 72 73 65 2c 20 54 6f 6b 65 6e 20 2a  *pParse, Token *
15e0: 70 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  p, const char *z
15f0: 29 7b 0a 20 20 70 2d 3e 7a 20 3d 20 28 75 38 20  ){.  p->z = (u8 
1600: 2a 29 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66  *)sqlite3MPrintf
1610: 28 30 2c 20 22 5c 22 25 77 5c 22 22 2c 20 7a 29  (0, "\"%w\"", z)
1620: 3b 0a 20 20 70 2d 3e 64 79 6e 20 3d 20 31 3b 0a  ;.  p->dyn = 1;.
1630: 20 20 69 66 28 20 70 2d 3e 7a 20 29 7b 0a 20 20    if( p->z ){.  
1640: 20 20 70 2d 3e 6e 20 3d 20 73 74 72 6c 65 6e 28    p->n = strlen(
1650: 28 63 68 61 72 20 2a 29 70 2d 3e 7a 29 3b 0a 20  (char *)p->z);. 
1660: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 50 61 72   }else{.    pPar
1670: 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  se->db->mallocFa
1680: 69 6c 65 64 20 3d 20 31 3b 0a 20 20 7d 0a 7d 0a  iled = 1;.  }.}.
1690: 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20 61 6e  ./*.** Create an
16a0: 20 65 78 70 72 65 73 73 69 6f 6e 20 6e 6f 64 65   expression node
16b0: 20 66 6f 72 20 61 6e 20 69 64 65 6e 74 69 66 69   for an identifi
16c0: 65 72 20 77 69 74 68 20 74 68 65 20 6e 61 6d 65  er with the name
16d0: 20 6f 66 20 7a 4e 61 6d 65 0a 2a 2f 0a 45 78 70   of zName.*/.Exp
16e0: 72 20 2a 73 71 6c 69 74 65 33 43 72 65 61 74 65  r *sqlite3Create
16f0: 49 64 45 78 70 72 28 50 61 72 73 65 20 2a 70 50  IdExpr(Parse *pP
1700: 61 72 73 65 2c 20 63 6f 6e 73 74 20 63 68 61 72  arse, const char
1710: 20 2a 7a 4e 61 6d 65 29 7b 0a 20 20 54 6f 6b 65   *zName){.  Toke
1720: 6e 20 64 75 6d 6d 79 3b 0a 20 20 73 65 74 54 6f  n dummy;.  setTo
1730: 6b 65 6e 28 26 64 75 6d 6d 79 2c 20 7a 4e 61 6d  ken(&dummy, zNam
1740: 65 29 3b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c  e);.  return sql
1750: 69 74 65 33 50 45 78 70 72 28 70 50 61 72 73 65  ite3PExpr(pParse
1760: 2c 20 54 4b 5f 49 44 2c 20 30 2c 20 30 2c 20 26  , TK_ID, 0, 0, &
1770: 64 75 6d 6d 79 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a  dummy);.}.../*.*
1780: 2a 20 41 64 64 20 61 20 74 65 72 6d 20 74 6f 20  * Add a term to 
1790: 74 68 65 20 57 48 45 52 45 20 65 78 70 72 65 73  the WHERE expres
17a0: 73 69 6f 6e 20 69 6e 20 2a 70 70 45 78 70 72 20  sion in *ppExpr 
17b0: 74 68 61 74 20 72 65 71 75 69 72 65 73 20 74 68  that requires th
17c0: 65 0a 2a 2a 20 7a 43 6f 6c 20 63 6f 6c 75 6d 6e  e.** zCol column
17d0: 20 74 6f 20 62 65 20 65 71 75 61 6c 20 69 6e 20   to be equal in 
17e0: 74 68 65 20 74 77 6f 20 74 61 62 6c 65 73 20 70  the two tables p
17f0: 54 61 62 31 20 61 6e 64 20 70 54 61 62 32 2e 0a  Tab1 and pTab2..
1800: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 61  */.static void a
1810: 64 64 57 68 65 72 65 54 65 72 6d 28 0a 20 20 50  ddWhereTerm(.  P
1820: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
1830: 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69          /* Parsi
1840: 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  ng context */.  
1850: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43 6f 6c  const char *zCol
1860: 2c 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65  ,        /* Name
1870: 20 6f 66 20 74 68 65 20 63 6f 6c 75 6d 6e 20 2a   of the column *
1880: 2f 0a 20 20 63 6f 6e 73 74 20 54 61 62 6c 65 20  /.  const Table 
1890: 2a 70 54 61 62 31 2c 20 20 20 20 20 20 2f 2a 20  *pTab1,      /* 
18a0: 46 69 72 73 74 20 74 61 62 6c 65 20 2a 2f 0a 20  First table */. 
18b0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 41 6c   const char *zAl
18c0: 69 61 73 31 2c 20 20 20 20 20 2f 2a 20 41 6c 69  ias1,     /* Ali
18d0: 61 73 20 66 6f 72 20 66 69 72 73 74 20 74 61 62  as for first tab
18e0: 6c 65 2e 20 20 4d 61 79 20 62 65 20 4e 55 4c 4c  le.  May be NULL
18f0: 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 54 61 62 6c   */.  const Tabl
1900: 65 20 2a 70 54 61 62 32 2c 20 20 20 20 20 20 2f  e *pTab2,      /
1910: 2a 20 53 65 63 6f 6e 64 20 74 61 62 6c 65 20 2a  * Second table *
1920: 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  /.  const char *
1930: 7a 41 6c 69 61 73 32 2c 20 20 20 20 20 2f 2a 20  zAlias2,     /* 
1940: 41 6c 69 61 73 20 66 6f 72 20 73 65 63 6f 6e 64  Alias for second
1950: 20 74 61 62 6c 65 2e 20 20 4d 61 79 20 62 65 20   table.  May be 
1960: 4e 55 4c 4c 20 2a 2f 0a 20 20 69 6e 74 20 69 52  NULL */.  int iR
1970: 69 67 68 74 4a 6f 69 6e 54 61 62 6c 65 2c 20 20  ightJoinTable,  
1980: 20 20 20 2f 2a 20 56 44 42 45 20 63 75 72 73 6f     /* VDBE curso
1990: 72 20 66 6f 72 20 74 68 65 20 72 69 67 68 74 20  r for the right 
19a0: 74 61 62 6c 65 20 2a 2f 0a 20 20 45 78 70 72 20  table */.  Expr 
19b0: 2a 2a 70 70 45 78 70 72 20 20 20 20 20 20 20 20  **ppExpr        
19c0: 20 20 20 20 2f 2a 20 41 64 64 20 74 68 65 20 65      /* Add the e
19d0: 71 75 61 6c 69 74 79 20 74 65 72 6d 20 74 6f 20  quality term to 
19e0: 74 68 69 73 20 65 78 70 72 65 73 73 69 6f 6e 20  this expression 
19f0: 2a 2f 0a 29 7b 0a 20 20 45 78 70 72 20 2a 70 45  */.){.  Expr *pE
1a00: 31 61 2c 20 2a 70 45 31 62 2c 20 2a 70 45 31 63  1a, *pE1b, *pE1c
1a10: 3b 0a 20 20 45 78 70 72 20 2a 70 45 32 61 2c 20  ;.  Expr *pE2a, 
1a20: 2a 70 45 32 62 2c 20 2a 70 45 32 63 3b 0a 20 20  *pE2b, *pE2c;.  
1a30: 45 78 70 72 20 2a 70 45 3b 0a 0a 20 20 70 45 31  Expr *pE;..  pE1
1a40: 61 20 3d 20 73 71 6c 69 74 65 33 43 72 65 61 74  a = sqlite3Creat
1a50: 65 49 64 45 78 70 72 28 70 50 61 72 73 65 2c 20  eIdExpr(pParse, 
1a60: 7a 43 6f 6c 29 3b 0a 20 20 70 45 32 61 20 3d 20  zCol);.  pE2a = 
1a70: 73 71 6c 69 74 65 33 43 72 65 61 74 65 49 64 45  sqlite3CreateIdE
1a80: 78 70 72 28 70 50 61 72 73 65 2c 20 7a 43 6f 6c  xpr(pParse, zCol
1a90: 29 3b 0a 20 20 69 66 28 20 7a 41 6c 69 61 73 31  );.  if( zAlias1
1aa0: 3d 3d 30 20 29 7b 0a 20 20 20 20 7a 41 6c 69 61  ==0 ){.    zAlia
1ab0: 73 31 20 3d 20 70 54 61 62 31 2d 3e 7a 4e 61 6d  s1 = pTab1->zNam
1ac0: 65 3b 0a 20 20 7d 0a 20 20 70 45 31 62 20 3d 20  e;.  }.  pE1b = 
1ad0: 73 71 6c 69 74 65 33 43 72 65 61 74 65 49 64 45  sqlite3CreateIdE
1ae0: 78 70 72 28 70 50 61 72 73 65 2c 20 7a 41 6c 69  xpr(pParse, zAli
1af0: 61 73 31 29 3b 0a 20 20 69 66 28 20 7a 41 6c 69  as1);.  if( zAli
1b00: 61 73 32 3d 3d 30 20 29 7b 0a 20 20 20 20 7a 41  as2==0 ){.    zA
1b10: 6c 69 61 73 32 20 3d 20 70 54 61 62 32 2d 3e 7a  lias2 = pTab2->z
1b20: 4e 61 6d 65 3b 0a 20 20 7d 0a 20 20 70 45 32 62  Name;.  }.  pE2b
1b30: 20 3d 20 73 71 6c 69 74 65 33 43 72 65 61 74 65   = sqlite3Create
1b40: 49 64 45 78 70 72 28 70 50 61 72 73 65 2c 20 7a  IdExpr(pParse, z
1b50: 41 6c 69 61 73 32 29 3b 0a 20 20 70 45 31 63 20  Alias2);.  pE1c 
1b60: 3d 20 73 71 6c 69 74 65 33 50 45 78 70 72 28 70  = sqlite3PExpr(p
1b70: 50 61 72 73 65 2c 20 54 4b 5f 44 4f 54 2c 20 70  Parse, TK_DOT, p
1b80: 45 31 62 2c 20 70 45 31 61 2c 20 30 29 3b 0a 20  E1b, pE1a, 0);. 
1b90: 20 70 45 32 63 20 3d 20 73 71 6c 69 74 65 33 50   pE2c = sqlite3P
1ba0: 45 78 70 72 28 70 50 61 72 73 65 2c 20 54 4b 5f  Expr(pParse, TK_
1bb0: 44 4f 54 2c 20 70 45 32 62 2c 20 70 45 32 61 2c  DOT, pE2b, pE2a,
1bc0: 20 30 29 3b 0a 20 20 70 45 20 3d 20 73 71 6c 69   0);.  pE = sqli
1bd0: 74 65 33 50 45 78 70 72 28 70 50 61 72 73 65 2c  te3PExpr(pParse,
1be0: 20 54 4b 5f 45 51 2c 20 70 45 31 63 2c 20 70 45   TK_EQ, pE1c, pE
1bf0: 32 63 2c 20 30 29 3b 0a 20 20 69 66 28 20 70 45  2c, 0);.  if( pE
1c00: 20 29 7b 0a 20 20 20 20 45 78 70 72 53 65 74 50   ){.    ExprSetP
1c10: 72 6f 70 65 72 74 79 28 70 45 2c 20 45 50 5f 46  roperty(pE, EP_F
1c20: 72 6f 6d 4a 6f 69 6e 29 3b 0a 20 20 20 20 70 45  romJoin);.    pE
1c30: 2d 3e 69 52 69 67 68 74 4a 6f 69 6e 54 61 62 6c  ->iRightJoinTabl
1c40: 65 20 3d 20 69 52 69 67 68 74 4a 6f 69 6e 54 61  e = iRightJoinTa
1c50: 62 6c 65 3b 0a 20 20 7d 0a 20 20 2a 70 70 45 78  ble;.  }.  *ppEx
1c60: 70 72 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  pr = sqlite3Expr
1c70: 41 6e 64 28 70 50 61 72 73 65 2d 3e 64 62 2c 2a  And(pParse->db,*
1c80: 70 70 45 78 70 72 2c 20 70 45 29 3b 0a 7d 0a 0a  ppExpr, pE);.}..
1c90: 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 45 50  /*.** Set the EP
1ca0: 5f 46 72 6f 6d 4a 6f 69 6e 20 70 72 6f 70 65 72  _FromJoin proper
1cb0: 74 79 20 6f 6e 20 61 6c 6c 20 74 65 72 6d 73 20  ty on all terms 
1cc0: 6f 66 20 74 68 65 20 67 69 76 65 6e 20 65 78 70  of the given exp
1cd0: 72 65 73 73 69 6f 6e 2e 0a 2a 2a 20 41 6e 64 20  ression..** And 
1ce0: 73 65 74 20 74 68 65 20 45 78 70 72 2e 69 52 69  set the Expr.iRi
1cf0: 67 68 74 4a 6f 69 6e 54 61 62 6c 65 20 74 6f 20  ghtJoinTable to 
1d00: 69 54 61 62 6c 65 20 66 6f 72 20 65 76 65 72 79  iTable for every
1d10: 20 74 65 72 6d 20 69 6e 20 74 68 65 0a 2a 2a 20   term in the.** 
1d20: 65 78 70 72 65 73 73 69 6f 6e 2e 0a 2a 2a 0a 2a  expression..**.*
1d30: 2a 20 54 68 65 20 45 50 5f 46 72 6f 6d 4a 6f 69  * The EP_FromJoi
1d40: 6e 20 70 72 6f 70 65 72 74 79 20 69 73 20 75 73  n property is us
1d50: 65 64 20 6f 6e 20 74 65 72 6d 73 20 6f 66 20 61  ed on terms of a
1d60: 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 74 6f 20  n expression to 
1d70: 74 65 6c 6c 0a 2a 2a 20 74 68 65 20 4c 45 46 54  tell.** the LEFT
1d80: 20 4f 55 54 45 52 20 4a 4f 49 4e 20 70 72 6f 63   OUTER JOIN proc
1d90: 65 73 73 69 6e 67 20 6c 6f 67 69 63 20 74 68 61  essing logic tha
1da0: 74 20 74 68 69 73 20 74 65 72 6d 20 69 73 20 70  t this term is p
1db0: 61 72 74 20 6f 66 20 74 68 65 0a 2a 2a 20 6a 6f  art of the.** jo
1dc0: 69 6e 20 72 65 73 74 72 69 63 74 69 6f 6e 20 73  in restriction s
1dd0: 70 65 63 69 66 69 65 64 20 69 6e 20 74 68 65 20  pecified in the 
1de0: 4f 4e 20 6f 72 20 55 53 49 4e 47 20 63 6c 61 75  ON or USING clau
1df0: 73 65 20 61 6e 64 20 6e 6f 74 20 61 20 70 61 72  se and not a par
1e00: 74 0a 2a 2a 20 6f 66 20 74 68 65 20 6d 6f 72 65  t.** of the more
1e10: 20 67 65 6e 65 72 61 6c 20 57 48 45 52 45 20 63   general WHERE c
1e20: 6c 61 75 73 65 2e 20 20 54 68 65 73 65 20 74 65  lause.  These te
1e30: 72 6d 73 20 61 72 65 20 6d 6f 76 65 64 20 6f 76  rms are moved ov
1e40: 65 72 20 74 6f 20 74 68 65 0a 2a 2a 20 57 48 45  er to the.** WHE
1e50: 52 45 20 63 6c 61 75 73 65 20 64 75 72 69 6e 67  RE clause during
1e60: 20 6a 6f 69 6e 20 70 72 6f 63 65 73 73 69 6e 67   join processing
1e70: 20 62 75 74 20 77 65 20 6e 65 65 64 20 74 6f 20   but we need to 
1e80: 72 65 6d 65 6d 62 65 72 20 74 68 61 74 20 74 68  remember that th
1e90: 65 79 0a 2a 2a 20 6f 72 69 67 69 6e 61 74 65 64  ey.** originated
1ea0: 20 69 6e 20 74 68 65 20 4f 4e 20 6f 72 20 55 53   in the ON or US
1eb0: 49 4e 47 20 63 6c 61 75 73 65 2e 0a 2a 2a 0a 2a  ING clause..**.*
1ec0: 2a 20 54 68 65 20 45 78 70 72 2e 69 52 69 67 68  * The Expr.iRigh
1ed0: 74 4a 6f 69 6e 54 61 62 6c 65 20 74 65 6c 6c 73  tJoinTable tells
1ee0: 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73   the WHERE claus
1ef0: 65 20 70 72 6f 63 65 73 73 69 6e 67 20 74 68 61  e processing tha
1f00: 74 20 74 68 65 0a 2a 2a 20 65 78 70 72 65 73 73  t the.** express
1f10: 69 6f 6e 20 64 65 70 65 6e 64 73 20 6f 6e 20 74  ion depends on t
1f20: 61 62 6c 65 20 69 52 69 67 68 74 4a 6f 69 6e 54  able iRightJoinT
1f30: 61 62 6c 65 20 65 76 65 6e 20 69 66 20 74 68 61  able even if tha
1f40: 74 20 74 61 62 6c 65 20 69 73 20 6e 6f 74 0a 2a  t table is not.*
1f50: 2a 20 65 78 70 6c 69 63 69 74 6c 79 20 6d 65 6e  * explicitly men
1f60: 74 69 6f 6e 65 64 20 69 6e 20 74 68 65 20 65 78  tioned in the ex
1f70: 70 72 65 73 73 69 6f 6e 2e 20 20 54 68 61 74 20  pression.  That 
1f80: 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 73 20 6e  information is n
1f90: 65 65 64 65 64 0a 2a 2a 20 66 6f 72 20 63 61 73  eeded.** for cas
1fa0: 65 73 20 6c 69 6b 65 20 74 68 69 73 3a 0a 2a 2a  es like this:.**
1fb0: 0a 2a 2a 20 20 20 20 53 45 4c 45 43 54 20 2a 20  .**    SELECT * 
1fc0: 46 52 4f 4d 20 74 31 20 4c 45 46 54 20 4a 4f 49  FROM t1 LEFT JOI
1fd0: 4e 20 74 32 20 4f 4e 20 74 31 2e 61 3d 74 32 2e  N t2 ON t1.a=t2.
1fe0: 62 20 41 4e 44 20 74 31 2e 78 3d 35 0a 2a 2a 0a  b AND t1.x=5.**.
1ff0: 2a 2a 20 54 68 65 20 77 68 65 72 65 20 63 6c 61  ** The where cla
2000: 75 73 65 20 6e 65 65 64 73 20 74 6f 20 64 65 66  use needs to def
2010: 65 72 20 74 68 65 20 68 61 6e 64 6c 69 6e 67 20  er the handling 
2020: 6f 66 20 74 68 65 20 74 31 2e 78 3d 35 0a 2a 2a  of the t1.x=5.**
2030: 20 74 65 72 6d 20 75 6e 74 69 6c 20 61 66 74 65   term until afte
2040: 72 20 74 68 65 20 74 32 20 6c 6f 6f 70 20 6f 66  r the t2 loop of
2050: 20 74 68 65 20 6a 6f 69 6e 2e 20 20 49 6e 20 74   the join.  In t
2060: 68 61 74 20 77 61 79 2c 20 61 0a 2a 2a 20 4e 55  hat way, a.** NU
2070: 4c 4c 20 74 32 20 72 6f 77 20 77 69 6c 6c 20 62  LL t2 row will b
2080: 65 20 69 6e 73 65 72 74 65 64 20 77 68 65 6e 65  e inserted whene
2090: 76 65 72 20 74 31 2e 78 21 3d 35 2e 20 20 49 66  ver t1.x!=5.  If
20a0: 20 77 65 20 64 6f 20 6e 6f 74 0a 2a 2a 20 64 65   we do not.** de
20b0: 66 65 72 20 74 68 65 20 68 61 6e 64 6c 69 6e 67  fer the handling
20c0: 20 6f 66 20 74 31 2e 78 3d 35 2c 20 69 74 20 77   of t1.x=5, it w
20d0: 69 6c 6c 20 62 65 20 70 72 6f 63 65 73 73 65 64  ill be processed
20e0: 20 69 6d 6d 65 64 69 61 74 65 6c 79 0a 2a 2a 20   immediately.** 
20f0: 61 66 74 65 72 20 74 68 65 20 74 31 20 6c 6f 6f  after the t1 loo
2100: 70 20 61 6e 64 20 72 6f 77 73 20 77 69 74 68 20  p and rows with 
2110: 74 31 2e 78 21 3d 35 20 77 69 6c 6c 20 6e 65 76  t1.x!=5 will nev
2120: 65 72 20 61 70 70 65 61 72 20 69 6e 0a 2a 2a 20  er appear in.** 
2130: 74 68 65 20 6f 75 74 70 75 74 2c 20 77 68 69 63  the output, whic
2140: 68 20 69 73 20 69 6e 63 6f 72 72 65 63 74 2e 0a  h is incorrect..
2150: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73  */.static void s
2160: 65 74 4a 6f 69 6e 45 78 70 72 28 45 78 70 72 20  etJoinExpr(Expr 
2170: 2a 70 2c 20 69 6e 74 20 69 54 61 62 6c 65 29 7b  *p, int iTable){
2180: 0a 20 20 77 68 69 6c 65 28 20 70 20 29 7b 0a 20  .  while( p ){. 
2190: 20 20 20 45 78 70 72 53 65 74 50 72 6f 70 65 72     ExprSetProper
21a0: 74 79 28 70 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69  ty(p, EP_FromJoi
21b0: 6e 29 3b 0a 20 20 20 20 70 2d 3e 69 52 69 67 68  n);.    p->iRigh
21c0: 74 4a 6f 69 6e 54 61 62 6c 65 20 3d 20 69 54 61  tJoinTable = iTa
21d0: 62 6c 65 3b 0a 20 20 20 20 73 65 74 4a 6f 69 6e  ble;.    setJoin
21e0: 45 78 70 72 28 70 2d 3e 70 4c 65 66 74 2c 20 69  Expr(p->pLeft, i
21f0: 54 61 62 6c 65 29 3b 0a 20 20 20 20 70 20 3d 20  Table);.    p = 
2200: 70 2d 3e 70 52 69 67 68 74 3b 0a 20 20 7d 20 0a  p->pRight;.  } .
2210: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  }../*.** This ro
2220: 75 74 69 6e 65 20 70 72 6f 63 65 73 73 65 73 20  utine processes 
2230: 74 68 65 20 6a 6f 69 6e 20 69 6e 66 6f 72 6d 61  the join informa
2240: 74 69 6f 6e 20 66 6f 72 20 61 20 53 45 4c 45 43  tion for a SELEC
2250: 54 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 20  T statement..** 
2260: 4f 4e 20 61 6e 64 20 55 53 49 4e 47 20 63 6c 61  ON and USING cla
2270: 75 73 65 73 20 61 72 65 20 63 6f 6e 76 65 72 74  uses are convert
2280: 65 64 20 69 6e 74 6f 20 65 78 74 72 61 20 74 65  ed into extra te
2290: 72 6d 73 20 6f 66 20 74 68 65 20 57 48 45 52 45  rms of the WHERE
22a0: 20 63 6c 61 75 73 65 2e 0a 2a 2a 20 4e 41 54 55   clause..** NATU
22b0: 52 41 4c 20 6a 6f 69 6e 73 20 61 6c 73 6f 20 63  RAL joins also c
22c0: 72 65 61 74 65 20 65 78 74 72 61 20 57 48 45 52  reate extra WHER
22d0: 45 20 63 6c 61 75 73 65 20 74 65 72 6d 73 2e 0a  E clause terms..
22e0: 2a 2a 0a 2a 2a 20 54 68 65 20 74 65 72 6d 73 20  **.** The terms 
22f0: 6f 66 20 61 20 46 52 4f 4d 20 63 6c 61 75 73 65  of a FROM clause
2300: 20 61 72 65 20 63 6f 6e 74 61 69 6e 65 64 20 69   are contained i
2310: 6e 20 74 68 65 20 53 65 6c 65 63 74 2e 70 53 72  n the Select.pSr
2320: 63 20 73 74 72 75 63 74 75 72 65 2e 0a 2a 2a 20  c structure..** 
2330: 54 68 65 20 6c 65 66 74 20 6d 6f 73 74 20 74 61  The left most ta
2340: 62 6c 65 20 69 73 20 74 68 65 20 66 69 72 73 74  ble is the first
2350: 20 65 6e 74 72 79 20 69 6e 20 53 65 6c 65 63 74   entry in Select
2360: 2e 70 53 72 63 2e 20 20 54 68 65 20 72 69 67 68  .pSrc.  The righ
2370: 74 2d 6d 6f 73 74 0a 2a 2a 20 74 61 62 6c 65 20  t-most.** table 
2380: 69 73 20 74 68 65 20 6c 61 73 74 20 65 6e 74 72  is the last entr
2390: 79 2e 20 20 54 68 65 20 6a 6f 69 6e 20 6f 70 65  y.  The join ope
23a0: 72 61 74 6f 72 20 69 73 20 68 65 6c 64 20 69 6e  rator is held in
23b0: 20 74 68 65 20 65 6e 74 72 79 20 74 6f 0a 2a 2a   the entry to.**
23c0: 20 74 68 65 20 6c 65 66 74 2e 20 20 54 68 75 73   the left.  Thus
23d0: 20 65 6e 74 72 79 20 30 20 63 6f 6e 74 61 69 6e   entry 0 contain
23e0: 73 20 74 68 65 20 6a 6f 69 6e 20 6f 70 65 72 61  s the join opera
23f0: 74 6f 72 20 66 6f 72 20 74 68 65 20 6a 6f 69 6e  tor for the join
2400: 20 62 65 74 77 65 65 6e 0a 2a 2a 20 65 6e 74 72   between.** entr
2410: 69 65 73 20 30 20 61 6e 64 20 31 2e 20 20 41 6e  ies 0 and 1.  An
2420: 79 20 4f 4e 20 6f 72 20 55 53 49 4e 47 20 63 6c  y ON or USING cl
2430: 61 75 73 65 73 20 61 73 73 6f 63 69 61 74 65 64  auses associated
2440: 20 77 69 74 68 20 74 68 65 20 6a 6f 69 6e 20 61   with the join a
2450: 72 65 0a 2a 2a 20 61 6c 73 6f 20 61 74 74 61 63  re.** also attac
2460: 68 65 64 20 74 6f 20 74 68 65 20 6c 65 66 74 20  hed to the left 
2470: 65 6e 74 72 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  entry..**.** Thi
2480: 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e  s routine return
2490: 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  s the number of 
24a0: 65 72 72 6f 72 73 20 65 6e 63 6f 75 6e 74 65 72  errors encounter
24b0: 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ed..*/.static in
24c0: 74 20 73 71 6c 69 74 65 50 72 6f 63 65 73 73 4a  t sqliteProcessJ
24d0: 6f 69 6e 28 50 61 72 73 65 20 2a 70 50 61 72 73  oin(Parse *pPars
24e0: 65 2c 20 53 65 6c 65 63 74 20 2a 70 29 7b 0a 20  e, Select *p){. 
24f0: 20 53 72 63 4c 69 73 74 20 2a 70 53 72 63 3b 20   SrcList *pSrc; 
2500: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2510: 20 2f 2a 20 41 6c 6c 20 74 61 62 6c 65 73 20 69   /* All tables i
2520: 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73  n the FROM claus
2530: 65 20 2a 2f 0a 20 20 69 6e 74 20 69 2c 20 6a 3b  e */.  int i, j;
2540: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2550: 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63         /* Loop c
2560: 6f 75 6e 74 65 72 73 20 2a 2f 0a 20 20 73 74 72  ounters */.  str
2570: 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d  uct SrcList_item
2580: 20 2a 70 4c 65 66 74 3b 20 20 20 20 20 2f 2a 20   *pLeft;     /* 
2590: 4c 65 66 74 20 74 61 62 6c 65 20 62 65 69 6e 67  Left table being
25a0: 20 6a 6f 69 6e 65 64 20 2a 2f 0a 20 20 73 74 72   joined */.  str
25b0: 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d  uct SrcList_item
25c0: 20 2a 70 52 69 67 68 74 3b 20 20 20 20 2f 2a 20   *pRight;    /* 
25d0: 52 69 67 68 74 20 74 61 62 6c 65 20 62 65 69 6e  Right table bein
25e0: 67 20 6a 6f 69 6e 65 64 20 2a 2f 0a 0a 20 20 70  g joined */..  p
25f0: 53 72 63 20 3d 20 70 2d 3e 70 53 72 63 3b 0a 20  Src = p->pSrc;. 
2600: 20 70 4c 65 66 74 20 3d 20 26 70 53 72 63 2d 3e   pLeft = &pSrc->
2610: 61 5b 30 5d 3b 0a 20 20 70 52 69 67 68 74 20 3d  a[0];.  pRight =
2620: 20 26 70 4c 65 66 74 5b 31 5d 3b 0a 20 20 66 6f   &pLeft[1];.  fo
2630: 72 28 69 3d 30 3b 20 69 3c 70 53 72 63 2d 3e 6e  r(i=0; i<pSrc->n
2640: 53 72 63 2d 31 3b 20 69 2b 2b 2c 20 70 52 69 67  Src-1; i++, pRig
2650: 68 74 2b 2b 2c 20 70 4c 65 66 74 2b 2b 29 7b 0a  ht++, pLeft++){.
2660: 20 20 20 20 54 61 62 6c 65 20 2a 70 4c 65 66 74      Table *pLeft
2670: 54 61 62 20 3d 20 70 4c 65 66 74 2d 3e 70 54 61  Tab = pLeft->pTa
2680: 62 3b 0a 20 20 20 20 54 61 62 6c 65 20 2a 70 52  b;.    Table *pR
2690: 69 67 68 74 54 61 62 20 3d 20 70 52 69 67 68 74  ightTab = pRight
26a0: 2d 3e 70 54 61 62 3b 0a 0a 20 20 20 20 69 66 28  ->pTab;..    if(
26b0: 20 70 4c 65 66 74 54 61 62 3d 3d 30 20 7c 7c 20   pLeftTab==0 || 
26c0: 70 52 69 67 68 74 54 61 62 3d 3d 30 20 29 20 63  pRightTab==0 ) c
26d0: 6f 6e 74 69 6e 75 65 3b 0a 0a 20 20 20 20 2f 2a  ontinue;..    /*
26e0: 20 57 68 65 6e 20 74 68 65 20 4e 41 54 55 52 41   When the NATURA
26f0: 4c 20 6b 65 79 77 6f 72 64 20 69 73 20 70 72 65  L keyword is pre
2700: 73 65 6e 74 2c 20 61 64 64 20 57 48 45 52 45 20  sent, add WHERE 
2710: 63 6c 61 75 73 65 20 74 65 72 6d 73 20 66 6f 72  clause terms for
2720: 0a 20 20 20 20 2a 2a 20 65 76 65 72 79 20 63 6f  .    ** every co
2730: 6c 75 6d 6e 20 74 68 61 74 20 74 68 65 20 74 77  lumn that the tw
2740: 6f 20 74 61 62 6c 65 73 20 68 61 76 65 20 69 6e  o tables have in
2750: 20 63 6f 6d 6d 6f 6e 2e 0a 20 20 20 20 2a 2f 0a   common..    */.
2760: 20 20 20 20 69 66 28 20 70 52 69 67 68 74 2d 3e      if( pRight->
2770: 6a 6f 69 6e 74 79 70 65 20 26 20 4a 54 5f 4e 41  jointype & JT_NA
2780: 54 55 52 41 4c 20 29 7b 0a 20 20 20 20 20 20 69  TURAL ){.      i
2790: 66 28 20 70 52 69 67 68 74 2d 3e 70 4f 6e 20 7c  f( pRight->pOn |
27a0: 7c 20 70 52 69 67 68 74 2d 3e 70 55 73 69 6e 67  | pRight->pUsing
27b0: 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
27c0: 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
27d0: 73 65 2c 20 22 61 20 4e 41 54 55 52 41 4c 20 6a  se, "a NATURAL j
27e0: 6f 69 6e 20 6d 61 79 20 6e 6f 74 20 68 61 76 65  oin may not have
27f0: 20 22 0a 20 20 20 20 20 20 20 20 20 20 20 22 61   ".           "a
2800: 6e 20 4f 4e 20 6f 72 20 55 53 49 4e 47 20 63 6c  n ON or USING cl
2810: 61 75 73 65 22 2c 20 30 29 3b 0a 20 20 20 20 20  ause", 0);.     
2820: 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20     return 1;.   
2830: 20 20 20 7d 0a 20 20 20 20 20 20 66 6f 72 28 6a     }.      for(j
2840: 3d 30 3b 20 6a 3c 70 4c 65 66 74 54 61 62 2d 3e  =0; j<pLeftTab->
2850: 6e 43 6f 6c 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20  nCol; j++){.    
2860: 20 20 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 20      char *zName 
2870: 3d 20 70 4c 65 66 74 54 61 62 2d 3e 61 43 6f 6c  = pLeftTab->aCol
2880: 5b 6a 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20  [j].zName;.     
2890: 20 20 20 69 66 28 20 63 6f 6c 75 6d 6e 49 6e 64     if( columnInd
28a0: 65 78 28 70 52 69 67 68 74 54 61 62 2c 20 7a 4e  ex(pRightTab, zN
28b0: 61 6d 65 29 3e 3d 30 20 29 7b 0a 20 20 20 20 20  ame)>=0 ){.     
28c0: 20 20 20 20 20 61 64 64 57 68 65 72 65 54 65 72       addWhereTer
28d0: 6d 28 70 50 61 72 73 65 2c 20 7a 4e 61 6d 65 2c  m(pParse, zName,
28e0: 20 70 4c 65 66 74 54 61 62 2c 20 70 4c 65 66 74   pLeftTab, pLeft
28f0: 2d 3e 7a 41 6c 69 61 73 2c 20 0a 20 20 20 20 20  ->zAlias, .     
2900: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2910: 20 20 20 20 20 20 20 20 20 70 52 69 67 68 74 54           pRightT
2920: 61 62 2c 20 70 52 69 67 68 74 2d 3e 7a 41 6c 69  ab, pRight->zAli
2930: 61 73 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  as,.            
2940: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2950: 20 20 70 52 69 67 68 74 2d 3e 69 43 75 72 73 6f    pRight->iCurso
2960: 72 2c 20 26 70 2d 3e 70 57 68 65 72 65 29 3b 0a  r, &p->pWhere);.
2970: 20 20 20 20 20 20 20 20 20 20 0a 20 20 20 20 20            .     
2980: 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
2990: 20 7d 0a 0a 20 20 20 20 2f 2a 20 44 69 73 61 6c   }..    /* Disal
29a0: 6c 6f 77 20 62 6f 74 68 20 4f 4e 20 61 6e 64 20  low both ON and 
29b0: 55 53 49 4e 47 20 63 6c 61 75 73 65 73 20 69 6e  USING clauses in
29c0: 20 74 68 65 20 73 61 6d 65 20 6a 6f 69 6e 0a 20   the same join. 
29d0: 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 52     */.    if( pR
29e0: 69 67 68 74 2d 3e 70 4f 6e 20 26 26 20 70 52 69  ight->pOn && pRi
29f0: 67 68 74 2d 3e 70 55 73 69 6e 67 20 29 7b 0a 20  ght->pUsing ){. 
2a00: 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f       sqlite3Erro
2a10: 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 63 61  rMsg(pParse, "ca
2a20: 6e 6e 6f 74 20 68 61 76 65 20 62 6f 74 68 20 4f  nnot have both O
2a30: 4e 20 61 6e 64 20 55 53 49 4e 47 20 22 0a 20 20  N and USING ".  
2a40: 20 20 20 20 20 20 22 63 6c 61 75 73 65 73 20 69        "clauses i
2a50: 6e 20 74 68 65 20 73 61 6d 65 20 6a 6f 69 6e 22  n the same join"
2a60: 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
2a70: 31 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  1;.    }..    /*
2a80: 20 41 64 64 20 74 68 65 20 4f 4e 20 63 6c 61 75   Add the ON clau
2a90: 73 65 20 74 6f 20 74 68 65 20 65 6e 64 20 6f 66  se to the end of
2aa0: 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73   the WHERE claus
2ab0: 65 2c 20 63 6f 6e 6e 65 63 74 65 64 20 62 79 0a  e, connected by.
2ac0: 20 20 20 20 2a 2a 20 61 6e 20 41 4e 44 20 6f 70      ** an AND op
2ad0: 65 72 61 74 6f 72 2e 0a 20 20 20 20 2a 2f 0a 20  erator..    */. 
2ae0: 20 20 20 69 66 28 20 70 52 69 67 68 74 2d 3e 70     if( pRight->p
2af0: 4f 6e 20 29 7b 0a 20 20 20 20 20 20 73 65 74 4a  On ){.      setJ
2b00: 6f 69 6e 45 78 70 72 28 70 52 69 67 68 74 2d 3e  oinExpr(pRight->
2b10: 70 4f 6e 2c 20 70 52 69 67 68 74 2d 3e 69 43 75  pOn, pRight->iCu
2b20: 72 73 6f 72 29 3b 0a 20 20 20 20 20 20 70 2d 3e  rsor);.      p->
2b30: 70 57 68 65 72 65 20 3d 20 73 71 6c 69 74 65 33  pWhere = sqlite3
2b40: 45 78 70 72 41 6e 64 28 70 50 61 72 73 65 2d 3e  ExprAnd(pParse->
2b50: 64 62 2c 20 70 2d 3e 70 57 68 65 72 65 2c 20 70  db, p->pWhere, p
2b60: 52 69 67 68 74 2d 3e 70 4f 6e 29 3b 0a 20 20 20  Right->pOn);.   
2b70: 20 20 20 70 52 69 67 68 74 2d 3e 70 4f 6e 20 3d     pRight->pOn =
2b80: 20 30 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f   0;.    }..    /
2b90: 2a 20 43 72 65 61 74 65 20 65 78 74 72 61 20 74  * Create extra t
2ba0: 65 72 6d 73 20 6f 6e 20 74 68 65 20 57 48 45 52  erms on the WHER
2bb0: 45 20 63 6c 61 75 73 65 20 66 6f 72 20 65 61 63  E clause for eac
2bc0: 68 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 64 0a 20  h column named. 
2bd0: 20 20 20 2a 2a 20 69 6e 20 74 68 65 20 55 53 49     ** in the USI
2be0: 4e 47 20 63 6c 61 75 73 65 2e 20 20 45 78 61 6d  NG clause.  Exam
2bf0: 70 6c 65 3a 20 49 66 20 74 68 65 20 74 77 6f 20  ple: If the two 
2c00: 74 61 62 6c 65 73 20 74 6f 20 62 65 20 6a 6f 69  tables to be joi
2c10: 6e 65 64 20 61 72 65 20 0a 20 20 20 20 2a 2a 20  ned are .    ** 
2c20: 41 20 61 6e 64 20 42 20 61 6e 64 20 74 68 65 20  A and B and the 
2c30: 55 53 49 4e 47 20 63 6c 61 75 73 65 20 6e 61 6d  USING clause nam
2c40: 65 73 20 58 2c 20 59 2c 20 61 6e 64 20 5a 2c 20  es X, Y, and Z, 
2c50: 74 68 65 6e 20 61 64 64 20 74 68 69 73 0a 20 20  then add this.  
2c60: 20 20 2a 2a 20 74 6f 20 74 68 65 20 57 48 45 52    ** to the WHER
2c70: 45 20 63 6c 61 75 73 65 3a 20 20 20 20 41 2e 58  E clause:    A.X
2c80: 3d 42 2e 58 20 41 4e 44 20 41 2e 59 3d 42 2e 59  =B.X AND A.Y=B.Y
2c90: 20 41 4e 44 20 41 2e 5a 3d 42 2e 5a 0a 20 20 20   AND A.Z=B.Z.   
2ca0: 20 2a 2a 20 52 65 70 6f 72 74 20 61 6e 20 65 72   ** Report an er
2cb0: 72 6f 72 20 69 66 20 61 6e 79 20 63 6f 6c 75 6d  ror if any colum
2cc0: 6e 20 6d 65 6e 74 69 6f 6e 65 64 20 69 6e 20 74  n mentioned in t
2cd0: 68 65 20 55 53 49 4e 47 20 63 6c 61 75 73 65 20  he USING clause 
2ce0: 69 73 0a 20 20 20 20 2a 2a 20 6e 6f 74 20 63 6f  is.    ** not co
2cf0: 6e 74 61 69 6e 65 64 20 69 6e 20 62 6f 74 68 20  ntained in both 
2d00: 74 61 62 6c 65 73 20 74 6f 20 62 65 20 6a 6f 69  tables to be joi
2d10: 6e 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ned..    */.    
2d20: 69 66 28 20 70 52 69 67 68 74 2d 3e 70 55 73 69  if( pRight->pUsi
2d30: 6e 67 20 29 7b 0a 20 20 20 20 20 20 49 64 4c 69  ng ){.      IdLi
2d40: 73 74 20 2a 70 4c 69 73 74 20 3d 20 70 52 69 67  st *pList = pRig
2d50: 68 74 2d 3e 70 55 73 69 6e 67 3b 0a 20 20 20 20  ht->pUsing;.    
2d60: 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 4c 69    for(j=0; j<pLi
2d70: 73 74 2d 3e 6e 49 64 3b 20 6a 2b 2b 29 7b 0a 20  st->nId; j++){. 
2d80: 20 20 20 20 20 20 20 63 68 61 72 20 2a 7a 4e 61         char *zNa
2d90: 6d 65 20 3d 20 70 4c 69 73 74 2d 3e 61 5b 6a 5d  me = pList->a[j]
2da0: 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20 20 20  .zName;.        
2db0: 69 66 28 20 63 6f 6c 75 6d 6e 49 6e 64 65 78 28  if( columnIndex(
2dc0: 70 4c 65 66 74 54 61 62 2c 20 7a 4e 61 6d 65 29  pLeftTab, zName)
2dd0: 3c 30 20 7c 7c 20 63 6f 6c 75 6d 6e 49 6e 64 65  <0 || columnInde
2de0: 78 28 70 52 69 67 68 74 54 61 62 2c 20 7a 4e 61  x(pRightTab, zNa
2df0: 6d 65 29 3c 30 20 29 7b 0a 20 20 20 20 20 20 20  me)<0 ){.       
2e00: 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
2e10: 73 67 28 70 50 61 72 73 65 2c 20 22 63 61 6e 6e  sg(pParse, "cann
2e20: 6f 74 20 6a 6f 69 6e 20 75 73 69 6e 67 20 63 6f  ot join using co
2e30: 6c 75 6d 6e 20 25 73 20 2d 20 63 6f 6c 75 6d 6e  lumn %s - column
2e40: 20 22 0a 20 20 20 20 20 20 20 20 20 20 20 20 22   ".            "
2e50: 6e 6f 74 20 70 72 65 73 65 6e 74 20 69 6e 20 62  not present in b
2e60: 6f 74 68 20 74 61 62 6c 65 73 22 2c 20 7a 4e 61  oth tables", zNa
2e70: 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72  me);.          r
2e80: 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 20 20 20  eturn 1;.       
2e90: 20 7d 0a 20 20 20 20 20 20 20 20 61 64 64 57 68   }.        addWh
2ea0: 65 72 65 54 65 72 6d 28 70 50 61 72 73 65 2c 20  ereTerm(pParse, 
2eb0: 7a 4e 61 6d 65 2c 20 70 4c 65 66 74 54 61 62 2c  zName, pLeftTab,
2ec0: 20 70 4c 65 66 74 2d 3e 7a 41 6c 69 61 73 2c 20   pLeft->zAlias, 
2ed0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
2ee0: 20 20 20 20 20 20 20 20 20 20 20 20 20 70 52 69               pRi
2ef0: 67 68 74 54 61 62 2c 20 70 52 69 67 68 74 2d 3e  ghtTab, pRight->
2f00: 7a 41 6c 69 61 73 2c 0a 20 20 20 20 20 20 20 20  zAlias,.        
2f10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2f20: 20 20 20 20 70 52 69 67 68 74 2d 3e 69 43 75 72      pRight->iCur
2f30: 73 6f 72 2c 20 26 70 2d 3e 70 57 68 65 72 65 29  sor, &p->pWhere)
2f40: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
2f50: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a    }.  return 0;.
2f60: 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 73 65 72 74 20  }../*.** Insert 
2f70: 63 6f 64 65 20 69 6e 74 6f 20 22 76 22 20 74 68  code into "v" th
2f80: 61 74 20 77 69 6c 6c 20 70 75 73 68 20 74 68 65  at will push the
2f90: 20 72 65 63 6f 72 64 20 6f 6e 20 74 68 65 20 74   record on the t
2fa0: 6f 70 20 6f 66 20 74 68 65 0a 2a 2a 20 73 74 61  op of the.** sta
2fb0: 63 6b 20 69 6e 74 6f 20 74 68 65 20 73 6f 72 74  ck into the sort
2fc0: 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  er..*/.static vo
2fd0: 69 64 20 70 75 73 68 4f 6e 74 6f 53 6f 72 74 65  id pushOntoSorte
2fe0: 72 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  r(.  Parse *pPar
2ff0: 73 65 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 50  se,         /* P
3000: 61 72 73 65 72 20 63 6f 6e 74 65 78 74 20 2a 2f  arser context */
3010: 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4f 72  .  ExprList *pOr
3020: 64 65 72 42 79 2c 20 20 20 20 2f 2a 20 54 68 65  derBy,    /* The
3030: 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65   ORDER BY clause
3040: 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 53   */.  Select *pS
3050: 65 6c 65 63 74 2c 20 20 20 20 20 20 20 2f 2a 20  elect,       /* 
3060: 54 68 65 20 77 68 6f 6c 65 20 53 45 4c 45 43 54  The whole SELECT
3070: 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20   statement */.  
3080: 69 6e 74 20 72 65 67 44 61 74 61 20 20 20 20 20  int regData     
3090: 20 20 20 20 20 20 20 2f 2a 20 52 65 67 69 73 74         /* Regist
30a0: 65 72 20 68 6f 6c 64 69 6e 67 20 64 61 74 61 20  er holding data 
30b0: 74 6f 20 62 65 20 73 6f 72 74 65 64 20 2a 2f 0a  to be sorted */.
30c0: 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70  ){.  Vdbe *v = p
30d0: 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20  Parse->pVdbe;.  
30e0: 69 6e 74 20 6e 45 78 70 72 20 3d 20 70 4f 72 64  int nExpr = pOrd
30f0: 65 72 42 79 2d 3e 6e 45 78 70 72 3b 0a 20 20 69  erBy->nExpr;.  i
3100: 6e 74 20 72 65 67 42 61 73 65 20 3d 20 73 71 6c  nt regBase = sql
3110: 69 74 65 33 47 65 74 54 65 6d 70 52 61 6e 67 65  ite3GetTempRange
3120: 28 70 50 61 72 73 65 2c 20 6e 45 78 70 72 2b 32  (pParse, nExpr+2
3130: 29 3b 0a 20 20 69 6e 74 20 72 65 67 52 65 63 6f  );.  int regReco
3140: 72 64 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54  rd = sqlite3GetT
3150: 65 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a  empReg(pParse);.
3160: 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64    sqlite3ExprCod
3170: 65 45 78 70 72 4c 69 73 74 28 70 50 61 72 73 65  eExprList(pParse
3180: 2c 20 70 4f 72 64 65 72 42 79 2c 20 72 65 67 42  , pOrderBy, regB
3190: 61 73 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 56  ase);.  sqlite3V
31a0: 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
31b0: 53 65 71 75 65 6e 63 65 2c 20 70 4f 72 64 65 72  Sequence, pOrder
31c0: 42 79 2d 3e 69 45 43 75 72 73 6f 72 2c 20 72 65  By->iECursor, re
31d0: 67 42 61 73 65 2b 6e 45 78 70 72 29 3b 0a 20 20  gBase+nExpr);.  
31e0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
31f0: 32 28 76 2c 20 4f 50 5f 4d 6f 76 65 2c 20 72 65  2(v, OP_Move, re
3200: 67 44 61 74 61 2c 20 72 65 67 42 61 73 65 2b 6e  gData, regBase+n
3210: 45 78 70 72 2b 31 29 3b 0a 20 20 73 71 6c 69 74  Expr+1);.  sqlit
3220: 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
3230: 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20 72  OP_MakeRecord, r
3240: 65 67 42 61 73 65 2c 20 6e 45 78 70 72 20 2b 20  egBase, nExpr + 
3250: 32 2c 20 72 65 67 52 65 63 6f 72 64 29 3b 0a 20  2, regRecord);. 
3260: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
3270: 70 32 28 76 2c 20 4f 50 5f 49 64 78 49 6e 73 65  p2(v, OP_IdxInse
3280: 72 74 2c 20 70 4f 72 64 65 72 42 79 2d 3e 69 45  rt, pOrderBy->iE
3290: 43 75 72 73 6f 72 2c 20 72 65 67 52 65 63 6f 72  Cursor, regRecor
32a0: 64 29 3b 0a 20 20 73 71 6c 69 74 65 33 52 65 6c  d);.  sqlite3Rel
32b0: 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72  easeTempReg(pPar
32c0: 73 65 2c 20 72 65 67 52 65 63 6f 72 64 29 3b 0a  se, regRecord);.
32d0: 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65    sqlite3Release
32e0: 54 65 6d 70 52 61 6e 67 65 28 70 50 61 72 73 65  TempRange(pParse
32f0: 2c 20 72 65 67 42 61 73 65 2c 20 6e 45 78 70 72  , regBase, nExpr
3300: 2b 32 29 3b 0a 20 20 69 66 28 20 70 53 65 6c 65  +2);.  if( pSele
3310: 63 74 2d 3e 69 4c 69 6d 69 74 3e 3d 30 20 29 7b  ct->iLimit>=0 ){
3320: 0a 20 20 20 20 69 6e 74 20 61 64 64 72 31 2c 20  .    int addr1, 
3330: 61 64 64 72 32 3b 0a 20 20 20 20 69 6e 74 20 69  addr2;.    int i
3340: 4c 69 6d 69 74 3b 0a 20 20 20 20 69 66 28 20 70  Limit;.    if( p
3350: 53 65 6c 65 63 74 2d 3e 70 4f 66 66 73 65 74 20  Select->pOffset 
3360: 29 7b 0a 20 20 20 20 20 20 69 4c 69 6d 69 74 20  ){.      iLimit 
3370: 3d 20 70 53 65 6c 65 63 74 2d 3e 69 4f 66 66 73  = pSelect->iOffs
3380: 65 74 2b 31 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  et+1;.    }else{
3390: 0a 20 20 20 20 20 20 69 4c 69 6d 69 74 20 3d 20  .      iLimit = 
33a0: 70 53 65 6c 65 63 74 2d 3e 69 4c 69 6d 69 74 3b  pSelect->iLimit;
33b0: 0a 20 20 20 20 7d 0a 20 20 20 20 61 64 64 72 31  .    }.    addr1
33c0: 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   = sqlite3VdbeAd
33d0: 64 4f 70 31 28 76 2c 20 4f 50 5f 49 66 5a 65 72  dOp1(v, OP_IfZer
33e0: 6f 2c 20 69 4c 69 6d 69 74 29 3b 0a 20 20 20 20  o, iLimit);.    
33f0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
3400: 32 28 76 2c 20 4f 50 5f 41 64 64 49 6d 6d 2c 20  2(v, OP_AddImm, 
3410: 69 4c 69 6d 69 74 2c 20 2d 31 29 3b 0a 20 20 20  iLimit, -1);.   
3420: 20 61 64 64 72 32 20 3d 20 73 71 6c 69 74 65 33   addr2 = sqlite3
3430: 56 64 62 65 41 64 64 4f 70 30 28 76 2c 20 4f 50  VdbeAddOp0(v, OP
3440: 5f 47 6f 74 6f 29 3b 0a 20 20 20 20 73 71 6c 69  _Goto);.    sqli
3450: 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28  te3VdbeJumpHere(
3460: 76 2c 20 61 64 64 72 31 29 3b 0a 20 20 20 20 73  v, addr1);.    s
3470: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31  qlite3VdbeAddOp1
3480: 28 76 2c 20 4f 50 5f 4c 61 73 74 2c 20 70 4f 72  (v, OP_Last, pOr
3490: 64 65 72 42 79 2d 3e 69 45 43 75 72 73 6f 72 29  derBy->iECursor)
34a0: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
34b0: 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 44 65  eAddOp1(v, OP_De
34c0: 6c 65 74 65 2c 20 70 4f 72 64 65 72 42 79 2d 3e  lete, pOrderBy->
34d0: 69 45 43 75 72 73 6f 72 29 3b 0a 20 20 20 20 73  iECursor);.    s
34e0: 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65  qlite3VdbeJumpHe
34f0: 72 65 28 76 2c 20 61 64 64 72 32 29 3b 0a 20 20  re(v, addr2);.  
3500: 20 20 70 53 65 6c 65 63 74 2d 3e 69 4c 69 6d 69    pSelect->iLimi
3510: 74 20 3d 20 2d 31 3b 0a 20 20 7d 0a 7d 0a 0a 2f  t = -1;.  }.}../
3520: 2a 0a 2a 2a 20 41 64 64 20 63 6f 64 65 20 74 6f  *.** Add code to
3530: 20 69 6d 70 6c 65 6d 65 6e 74 20 74 68 65 20 4f   implement the O
3540: 46 46 53 45 54 0a 2a 2f 0a 73 74 61 74 69 63 20  FFSET.*/.static 
3550: 76 6f 69 64 20 63 6f 64 65 4f 66 66 73 65 74 28  void codeOffset(
3560: 0a 20 20 56 64 62 65 20 2a 76 2c 20 20 20 20 20  .  Vdbe *v,     
3570: 20 20 20 20 20 2f 2a 20 47 65 6e 65 72 61 74 65       /* Generate
3580: 20 63 6f 64 65 20 69 6e 74 6f 20 74 68 69 73 20   code into this 
3590: 56 4d 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a  VM */.  Select *
35a0: 70 2c 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65  p,        /* The
35b0: 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
35c0: 74 20 62 65 69 6e 67 20 63 6f 64 65 64 20 2a 2f  t being coded */
35d0: 0a 20 20 69 6e 74 20 69 43 6f 6e 74 69 6e 75 65  .  int iContinue
35e0: 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72       /* Jump her
35f0: 65 20 74 6f 20 73 6b 69 70 20 74 68 65 20 63 75  e to skip the cu
3600: 72 72 65 6e 74 20 72 65 63 6f 72 64 20 2a 2f 0a  rrent record */.
3610: 29 7b 0a 20 20 69 66 28 20 70 2d 3e 69 4f 66 66  ){.  if( p->iOff
3620: 73 65 74 3e 3d 30 20 26 26 20 69 43 6f 6e 74 69  set>=0 && iConti
3630: 6e 75 65 21 3d 30 20 29 7b 0a 20 20 20 20 69 6e  nue!=0 ){.    in
3640: 74 20 61 64 64 72 3b 0a 20 20 20 20 73 71 6c 69  t addr;.    sqli
3650: 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
3660: 20 4f 50 5f 41 64 64 49 6d 6d 2c 20 70 2d 3e 69   OP_AddImm, p->i
3670: 4f 66 66 73 65 74 2c 20 2d 31 29 3b 0a 20 20 20  Offset, -1);.   
3680: 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56   addr = sqlite3V
3690: 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f  dbeAddOp1(v, OP_
36a0: 49 66 4e 65 67 2c 20 70 2d 3e 69 4f 66 66 73 65  IfNeg, p->iOffse
36b0: 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  t);.    sqlite3V
36c0: 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
36d0: 47 6f 74 6f 2c 20 30 2c 20 69 43 6f 6e 74 69 6e  Goto, 0, iContin
36e0: 75 65 29 3b 0a 20 20 20 20 56 64 62 65 43 6f 6d  ue);.    VdbeCom
36f0: 6d 65 6e 74 28 28 76 2c 20 22 73 6b 69 70 20 4f  ment((v, "skip O
3700: 46 46 53 45 54 20 72 65 63 6f 72 64 73 22 29 29  FFSET records"))
3710: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
3720: 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64  eJumpHere(v, add
3730: 72 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  r);.  }.}../*.**
3740: 20 41 64 64 20 63 6f 64 65 20 74 68 61 74 20 77   Add code that w
3750: 69 6c 6c 20 63 68 65 63 6b 20 74 6f 20 6d 61 6b  ill check to mak
3760: 65 20 73 75 72 65 20 74 68 65 20 4e 20 72 65 67  e sure the N reg
3770: 69 73 74 65 72 73 20 73 74 61 72 74 69 6e 67 20  isters starting 
3780: 61 74 20 69 4d 65 6d 0a 2a 2a 20 66 6f 72 6d 20  at iMem.** form 
3790: 61 20 64 69 73 74 69 6e 63 74 20 65 6e 74 72 79  a distinct entry
37a0: 2e 20 20 69 54 61 62 20 69 73 20 61 20 73 6f 72  .  iTab is a sor
37b0: 74 69 6e 67 20 69 6e 64 65 78 20 74 68 61 74 20  ting index that 
37c0: 68 6f 6c 64 73 20 70 72 65 76 69 6f 75 73 6c 79  holds previously
37d0: 0a 2a 2a 20 73 65 65 6e 20 63 6f 6d 62 69 6e 61  .** seen combina
37e0: 74 69 6f 6e 73 20 6f 66 20 74 68 65 20 4e 20 76  tions of the N v
37f0: 61 6c 75 65 73 2e 20 20 41 20 6e 65 77 20 65 6e  alues.  A new en
3800: 74 72 79 20 69 73 20 6d 61 64 65 20 69 6e 20 69  try is made in i
3810: 54 61 62 0a 2a 2a 20 69 66 20 74 68 65 20 63 75  Tab.** if the cu
3820: 72 72 65 6e 74 20 4e 20 76 61 6c 75 65 73 20 61  rrent N values a
3830: 72 65 20 6e 65 77 2e 0a 2a 2a 0a 2a 2a 20 41 20  re new..**.** A 
3840: 6a 75 6d 70 20 74 6f 20 61 64 64 72 52 65 70 65  jump to addrRepe
3850: 61 74 20 69 73 20 6d 61 64 65 20 61 6e 64 20 74  at is made and t
3860: 68 65 20 4e 2b 31 20 76 61 6c 75 65 73 20 61 72  he N+1 values ar
3870: 65 20 70 6f 70 70 65 64 20 66 72 6f 6d 20 74 68  e popped from th
3880: 65 0a 2a 2a 20 73 74 61 63 6b 20 69 66 20 74 68  e.** stack if th
3890: 65 20 74 6f 70 20 4e 20 65 6c 65 6d 65 6e 74 73  e top N elements
38a0: 20 61 72 65 20 6e 6f 74 20 64 69 73 74 69 6e 63   are not distinc
38b0: 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  t..*/.static voi
38c0: 64 20 63 6f 64 65 44 69 73 74 69 6e 63 74 28 0a  d codeDistinct(.
38d0: 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
38e0: 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20       /* Parsing 
38f0: 61 6e 64 20 63 6f 64 65 20 67 65 6e 65 72 61 74  and code generat
3900: 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  ing context */. 
3910: 20 69 6e 74 20 69 54 61 62 2c 20 20 20 20 20 20   int iTab,      
3920: 20 20 20 20 2f 2a 20 41 20 73 6f 72 74 69 6e 67      /* A sorting
3930: 20 69 6e 64 65 78 20 75 73 65 64 20 74 6f 20 74   index used to t
3940: 65 73 74 20 66 6f 72 20 64 69 73 74 69 6e 63 74  est for distinct
3950: 6e 65 73 73 20 2a 2f 0a 20 20 69 6e 74 20 61 64  ness */.  int ad
3960: 64 72 52 65 70 65 61 74 2c 20 20 20 20 2f 2a 20  drRepeat,    /* 
3970: 4a 75 6d 70 20 74 6f 20 68 65 72 65 20 69 66 20  Jump to here if 
3980: 6e 6f 74 20 64 69 73 74 69 6e 63 74 20 2a 2f 0a  not distinct */.
3990: 20 20 69 6e 74 20 4e 2c 20 20 20 20 20 20 20 20    int N,        
39a0: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
39b0: 66 20 65 6c 65 6d 65 6e 74 73 20 2a 2f 0a 20 20  f elements */.  
39c0: 69 6e 74 20 69 4d 65 6d 20 20 20 20 20 20 20 20  int iMem        
39d0: 20 20 20 2f 2a 20 46 69 72 73 74 20 65 6c 65 6d     /* First elem
39e0: 65 6e 74 20 2a 2f 0a 29 7b 0a 20 20 56 64 62 65  ent */.){.  Vdbe
39f0: 20 2a 76 3b 0a 20 20 69 6e 74 20 72 31 3b 0a 0a   *v;.  int r1;..
3a00: 20 20 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56    v = pParse->pV
3a10: 64 62 65 3b 0a 20 20 72 31 20 3d 20 73 71 6c 69  dbe;.  r1 = sqli
3a20: 74 65 33 47 65 74 54 65 6d 70 52 65 67 28 70 50  te3GetTempReg(pP
3a30: 61 72 73 65 29 3b 0a 20 20 73 71 6c 69 74 65 33  arse);.  sqlite3
3a40: 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
3a50: 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20 69 4d 65  _MakeRecord, iMe
3a60: 6d 2c 20 4e 2c 20 72 31 29 3b 0a 20 20 73 71 6c  m, N, r1);.  sql
3a70: 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
3a80: 2c 20 4f 50 5f 46 6f 75 6e 64 2c 20 69 54 61 62  , OP_Found, iTab
3a90: 2c 20 61 64 64 72 52 65 70 65 61 74 2c 20 72 31  , addrRepeat, r1
3aa0: 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  );.  sqlite3Vdbe
3ab0: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 64 78  AddOp2(v, OP_Idx
3ac0: 49 6e 73 65 72 74 2c 20 69 54 61 62 2c 20 72 31  Insert, iTab, r1
3ad0: 29 3b 0a 20 20 73 71 6c 69 74 65 33 52 65 6c 65  );.  sqlite3Rele
3ae0: 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73  aseTempReg(pPars
3af0: 65 2c 20 72 31 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  e, r1);.}../*.**
3b00: 20 47 65 6e 65 72 61 74 65 20 61 6e 20 65 72 72   Generate an err
3b10: 6f 72 20 6d 65 73 73 61 67 65 20 77 68 65 6e 20  or message when 
3b20: 61 20 53 45 4c 45 43 54 20 69 73 20 75 73 65 64  a SELECT is used
3b30: 20 77 69 74 68 69 6e 20 61 20 73 75 62 65 78 70   within a subexp
3b40: 72 65 73 73 69 6f 6e 0a 2a 2a 20 28 65 78 61 6d  ression.** (exam
3b50: 70 6c 65 3a 20 20 22 61 20 49 4e 20 28 53 45 4c  ple:  "a IN (SEL
3b60: 45 43 54 20 2a 20 46 52 4f 4d 20 74 61 62 6c 65  ECT * FROM table
3b70: 29 22 29 20 62 75 74 20 69 74 20 68 61 73 20 6d  )") but it has m
3b80: 6f 72 65 20 74 68 61 6e 20 31 20 72 65 73 75 6c  ore than 1 resul
3b90: 74 0a 2a 2a 20 63 6f 6c 75 6d 6e 2e 20 20 57 65  t.** column.  We
3ba0: 20 64 6f 20 74 68 69 73 20 69 6e 20 61 20 73 75   do this in a su
3bb0: 62 72 6f 75 74 69 6e 65 20 62 65 63 61 75 73 65  broutine because
3bc0: 20 74 68 65 20 65 72 72 6f 72 20 6f 63 63 75 72   the error occur
3bd0: 73 20 69 6e 20 6d 75 6c 74 69 70 6c 65 0a 2a 2a  s in multiple.**
3be0: 20 70 6c 61 63 65 73 2e 0a 2a 2f 0a 73 74 61 74   places..*/.stat
3bf0: 69 63 20 69 6e 74 20 63 68 65 63 6b 46 6f 72 4d  ic int checkForM
3c00: 75 6c 74 69 43 6f 6c 75 6d 6e 53 65 6c 65 63 74  ultiColumnSelect
3c10: 45 72 72 6f 72 28 0a 20 20 50 61 72 73 65 20 2a  Error(.  Parse *
3c20: 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 2f 2a  pParse,       /*
3c30: 20 50 61 72 73 65 20 63 6f 6e 74 65 78 74 2e 20   Parse context. 
3c40: 2a 2f 0a 20 20 53 65 6c 65 63 74 44 65 73 74 20  */.  SelectDest 
3c50: 2a 70 44 65 73 74 2c 20 20 20 2f 2a 20 44 65 73  *pDest,   /* Des
3c60: 74 69 6e 61 74 69 6f 6e 20 6f 66 20 53 45 4c 45  tination of SELE
3c70: 43 54 20 72 65 73 75 6c 74 73 20 2a 2f 0a 20 20  CT results */.  
3c80: 69 6e 74 20 6e 45 78 70 72 20 20 20 20 20 20 20  int nExpr       
3c90: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
3ca0: 66 20 72 65 73 75 6c 74 20 63 6f 6c 75 6d 6e 73  f result columns
3cb0: 20 72 65 74 75 72 6e 65 64 20 62 79 20 53 45 4c   returned by SEL
3cc0: 45 43 54 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  ECT */.){.  int 
3cd0: 65 44 65 73 74 20 3d 20 70 44 65 73 74 2d 3e 65  eDest = pDest->e
3ce0: 44 65 73 74 3b 0a 20 20 69 66 28 20 6e 45 78 70  Dest;.  if( nExp
3cf0: 72 3e 31 20 26 26 20 28 65 44 65 73 74 3d 3d 53  r>1 && (eDest==S
3d00: 52 54 5f 4d 65 6d 20 7c 7c 20 65 44 65 73 74 3d  RT_Mem || eDest=
3d10: 3d 53 52 54 5f 53 65 74 29 20 29 7b 0a 20 20 20  =SRT_Set) ){.   
3d20: 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
3d30: 28 70 50 61 72 73 65 2c 20 22 6f 6e 6c 79 20 61  (pParse, "only a
3d40: 20 73 69 6e 67 6c 65 20 72 65 73 75 6c 74 20 61   single result a
3d50: 6c 6c 6f 77 65 64 20 66 6f 72 20 22 0a 20 20 20  llowed for ".   
3d60: 20 20 20 20 22 61 20 53 45 4c 45 43 54 20 74 68      "a SELECT th
3d70: 61 74 20 69 73 20 70 61 72 74 20 6f 66 20 61 6e  at is part of an
3d80: 20 65 78 70 72 65 73 73 69 6f 6e 22 29 3b 0a 20   expression");. 
3d90: 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d     return 1;.  }
3da0: 65 6c 73 65 7b 0a 20 20 20 20 72 65 74 75 72 6e  else{.    return
3db0: 20 30 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a   0;.  }.}../*.**
3dc0: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 67 65   This routine ge
3dd0: 6e 65 72 61 74 65 73 20 74 68 65 20 63 6f 64 65  nerates the code
3de0: 20 66 6f 72 20 74 68 65 20 69 6e 73 69 64 65 20   for the inside 
3df0: 6f 66 20 74 68 65 20 69 6e 6e 65 72 20 6c 6f 6f  of the inner loo
3e00: 70 0a 2a 2a 20 6f 66 20 61 20 53 45 4c 45 43 54  p.** of a SELECT
3e10: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 73 72 63 54 61  ..**.** If srcTa
3e20: 62 20 61 6e 64 20 6e 43 6f 6c 75 6d 6e 20 61 72  b and nColumn ar
3e30: 65 20 62 6f 74 68 20 7a 65 72 6f 2c 20 74 68 65  e both zero, the
3e40: 6e 20 74 68 65 20 70 45 4c 69 73 74 20 65 78 70  n the pEList exp
3e50: 72 65 73 73 69 6f 6e 73 0a 2a 2a 20 61 72 65 20  ressions.** are 
3e60: 65 76 61 6c 75 61 74 65 64 20 69 6e 20 6f 72 64  evaluated in ord
3e70: 65 72 20 74 6f 20 67 65 74 20 74 68 65 20 64 61  er to get the da
3e80: 74 61 20 66 6f 72 20 74 68 69 73 20 72 6f 77 2e  ta for this row.
3e90: 20 20 49 66 20 6e 43 6f 6c 75 6d 6e 3e 30 0a 2a    If nColumn>0.*
3ea0: 2a 20 74 68 65 6e 20 64 61 74 61 20 69 73 20 70  * then data is p
3eb0: 75 6c 6c 65 64 20 66 72 6f 6d 20 73 72 63 54 61  ulled from srcTa
3ec0: 62 20 61 6e 64 20 70 45 4c 69 73 74 20 69 73 20  b and pEList is 
3ed0: 75 73 65 64 20 6f 6e 6c 79 20 74 6f 20 67 65 74  used only to get
3ee0: 20 74 68 65 0a 2a 2a 20 64 61 74 61 74 79 70 65   the.** datatype
3ef0: 73 20 66 6f 72 20 65 61 63 68 20 63 6f 6c 75 6d  s for each colum
3f00: 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  n..*/.static voi
3f10: 64 20 73 65 6c 65 63 74 49 6e 6e 65 72 4c 6f 6f  d selectInnerLoo
3f20: 70 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  p(.  Parse *pPar
3f30: 73 65 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20  se,          /* 
3f40: 54 68 65 20 70 61 72 73 65 72 20 63 6f 6e 74 65  The parser conte
3f50: 78 74 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a  xt */.  Select *
3f60: 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p,              
3f70: 2f 2a 20 54 68 65 20 63 6f 6d 70 6c 65 74 65 20  /* The complete 
3f80: 73 65 6c 65 63 74 20 73 74 61 74 65 6d 65 6e 74  select statement
3f90: 20 62 65 69 6e 67 20 63 6f 64 65 64 20 2a 2f 0a   being coded */.
3fa0: 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69    ExprList *pELi
3fb0: 73 74 2c 20 20 20 20 20 20 20 2f 2a 20 4c 69 73  st,       /* Lis
3fc0: 74 20 6f 66 20 76 61 6c 75 65 73 20 62 65 69 6e  t of values bein
3fd0: 67 20 65 78 74 72 61 63 74 65 64 20 2a 2f 0a 20  g extracted */. 
3fe0: 20 69 6e 74 20 73 72 63 54 61 62 2c 20 20 20 20   int srcTab,    
3ff0: 20 20 20 20 20 20 20 20 20 2f 2a 20 50 75 6c 6c           /* Pull
4000: 20 64 61 74 61 20 66 72 6f 6d 20 74 68 69 73 20   data from this 
4010: 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 6e  table */.  int n
4020: 43 6f 6c 75 6d 6e 2c 20 20 20 20 20 20 20 20 20  Column,         
4030: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
4040: 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20 73  columns in the s
4050: 6f 75 72 63 65 20 74 61 62 6c 65 20 2a 2f 0a 20  ource table */. 
4060: 20 45 78 70 72 4c 69 73 74 20 2a 70 4f 72 64 65   ExprList *pOrde
4070: 72 42 79 2c 20 20 20 20 20 2f 2a 20 49 66 20 6e  rBy,     /* If n
4080: 6f 74 20 4e 55 4c 4c 2c 20 73 6f 72 74 20 72 65  ot NULL, sort re
4090: 73 75 6c 74 73 20 75 73 69 6e 67 20 74 68 69 73  sults using this
40a0: 20 6b 65 79 20 2a 2f 0a 20 20 69 6e 74 20 64 69   key */.  int di
40b0: 73 74 69 6e 63 74 2c 20 20 20 20 20 20 20 20 20  stinct,         
40c0: 20 20 2f 2a 20 49 66 20 3e 3d 30 2c 20 6d 61 6b    /* If >=0, mak
40d0: 65 20 73 75 72 65 20 72 65 73 75 6c 74 73 20 61  e sure results a
40e0: 72 65 20 64 69 73 74 69 6e 63 74 20 2a 2f 0a 20  re distinct */. 
40f0: 20 53 65 6c 65 63 74 44 65 73 74 20 2a 70 44 65   SelectDest *pDe
4100: 73 74 2c 20 20 20 20 20 20 2f 2a 20 48 6f 77 20  st,      /* How 
4110: 74 6f 20 64 69 73 70 6f 73 65 20 6f 66 20 74 68  to dispose of th
4120: 65 20 72 65 73 75 6c 74 73 20 2a 2f 0a 20 20 69  e results */.  i
4130: 6e 74 20 69 43 6f 6e 74 69 6e 75 65 2c 20 20 20  nt iContinue,   
4140: 20 20 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20 68         /* Jump h
4150: 65 72 65 20 74 6f 20 63 6f 6e 74 69 6e 75 65 20  ere to continue 
4160: 77 69 74 68 20 6e 65 78 74 20 72 6f 77 20 2a 2f  with next row */
4170: 0a 20 20 69 6e 74 20 69 42 72 65 61 6b 2c 20 20  .  int iBreak,  
4180: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4a 75             /* Ju
4190: 6d 70 20 68 65 72 65 20 74 6f 20 62 72 65 61 6b  mp here to break
41a0: 20 6f 75 74 20 6f 66 20 74 68 65 20 69 6e 6e 65   out of the inne
41b0: 72 20 6c 6f 6f 70 20 2a 2f 0a 20 20 63 68 61 72  r loop */.  char
41c0: 20 2a 61 66 66 20 20 20 20 20 20 20 20 20 20 20   *aff           
41d0: 20 20 20 20 2f 2a 20 61 66 66 69 6e 69 74 79 20      /* affinity 
41e0: 73 74 72 69 6e 67 20 69 66 20 65 44 65 73 74 20  string if eDest 
41f0: 69 73 20 53 52 54 5f 55 6e 69 6f 6e 20 2a 2f 0a  is SRT_Union */.
4200: 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70  ){.  Vdbe *v = p
4210: 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20  Parse->pVdbe;.  
4220: 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 68 61 73  int i;.  int has
4230: 44 69 73 74 69 6e 63 74 3b 20 20 20 20 20 20 20  Distinct;       
4240: 20 2f 2a 20 54 72 75 65 20 69 66 20 74 68 65 20   /* True if the 
4250: 44 49 53 54 49 4e 43 54 20 6b 65 79 77 6f 72 64  DISTINCT keyword
4260: 20 69 73 20 70 72 65 73 65 6e 74 20 2a 2f 0a 20   is present */. 
4270: 20 69 6e 74 20 72 65 67 52 65 73 75 6c 74 3b 20   int regResult; 
4280: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
4290: 53 74 61 72 74 20 6f 66 20 6d 65 6d 6f 72 79 20  Start of memory 
42a0: 68 6f 6c 64 69 6e 67 20 72 65 73 75 6c 74 20 73  holding result s
42b0: 65 74 20 2a 2f 0a 20 20 69 6e 74 20 65 44 65 73  et */.  int eDes
42c0: 74 20 3d 20 70 44 65 73 74 2d 3e 65 44 65 73 74  t = pDest->eDest
42d0: 3b 20 20 20 2f 2a 20 48 6f 77 20 74 6f 20 64 69  ;   /* How to di
42e0: 73 70 6f 73 65 20 6f 66 20 72 65 73 75 6c 74 73  spose of results
42f0: 20 2a 2f 0a 20 20 69 6e 74 20 69 50 61 72 6d 20   */.  int iParm 
4300: 3d 20 70 44 65 73 74 2d 3e 69 50 61 72 6d 3b 20  = pDest->iParm; 
4310: 20 20 2f 2a 20 46 69 72 73 74 20 61 72 67 75 6d    /* First argum
4320: 65 6e 74 20 74 6f 20 64 69 73 70 6f 73 61 6c 20  ent to disposal 
4330: 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 69 6e 74 20  method */.  int 
4340: 6e 52 65 73 75 6c 74 43 6f 6c 3b 20 20 20 20 20  nResultCol;     
4350: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
4360: 72 20 6f 66 20 72 65 73 75 6c 74 20 63 6f 6c 75  r of result colu
4370: 6d 6e 73 20 2a 2f 0a 0a 20 20 69 66 28 20 76 3d  mns */..  if( v=
4380: 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 61  =0 ) return;.  a
4390: 73 73 65 72 74 28 20 70 45 4c 69 73 74 21 3d 30  ssert( pEList!=0
43a0: 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65   );..  /* If the
43b0: 72 65 20 77 61 73 20 61 20 4c 49 4d 49 54 20 63  re was a LIMIT c
43c0: 6c 61 75 73 65 20 6f 6e 20 74 68 65 20 53 45 4c  lause on the SEL
43d0: 45 43 54 20 73 74 61 74 65 6d 65 6e 74 2c 20 74  ECT statement, t
43e0: 68 65 6e 20 64 6f 20 74 68 65 20 63 68 65 63 6b  hen do the check
43f0: 0a 20 20 2a 2a 20 74 6f 20 73 65 65 20 69 66 20  .  ** to see if 
4400: 74 68 69 73 20 72 6f 77 20 73 68 6f 75 6c 64 20  this row should 
4410: 62 65 20 6f 75 74 70 75 74 2e 0a 20 20 2a 2f 0a  be output..  */.
4420: 20 20 68 61 73 44 69 73 74 69 6e 63 74 20 3d 20    hasDistinct = 
4430: 64 69 73 74 69 6e 63 74 3e 3d 30 20 26 26 20 70  distinct>=0 && p
4440: 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3e 30 3b 0a  EList->nExpr>0;.
4450: 20 20 69 66 28 20 70 4f 72 64 65 72 42 79 3d 3d    if( pOrderBy==
4460: 30 20 26 26 20 21 68 61 73 44 69 73 74 69 6e 63  0 && !hasDistinc
4470: 74 20 29 7b 0a 20 20 20 20 63 6f 64 65 4f 66 66  t ){.    codeOff
4480: 73 65 74 28 76 2c 20 70 2c 20 69 43 6f 6e 74 69  set(v, p, iConti
4490: 6e 75 65 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  nue);.  }..  /* 
44a0: 50 75 6c 6c 20 74 68 65 20 72 65 71 75 65 73 74  Pull the request
44b0: 65 64 20 63 6f 6c 75 6d 6e 73 2e 0a 20 20 2a 2f  ed columns..  */
44c0: 0a 20 20 69 66 28 20 6e 43 6f 6c 75 6d 6e 3e 30  .  if( nColumn>0
44d0: 20 29 7b 0a 20 20 20 20 6e 52 65 73 75 6c 74 43   ){.    nResultC
44e0: 6f 6c 20 3d 20 6e 43 6f 6c 75 6d 6e 3b 0a 20 20  ol = nColumn;.  
44f0: 7d 65 6c 73 65 7b 0a 20 20 20 20 6e 52 65 73 75  }else{.    nResu
4500: 6c 74 43 6f 6c 20 3d 20 70 45 4c 69 73 74 2d 3e  ltCol = pEList->
4510: 6e 45 78 70 72 3b 0a 20 20 7d 0a 20 20 69 66 28  nExpr;.  }.  if(
4520: 20 70 44 65 73 74 2d 3e 69 4d 65 6d 3d 3d 30 20   pDest->iMem==0 
4530: 29 7b 0a 20 20 20 20 70 44 65 73 74 2d 3e 69 4d  ){.    pDest->iM
4540: 65 6d 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54  em = sqlite3GetT
4550: 65 6d 70 52 61 6e 67 65 28 70 50 61 72 73 65 2c  empRange(pParse,
4560: 20 6e 52 65 73 75 6c 74 43 6f 6c 29 3b 0a 20 20   nResultCol);.  
4570: 7d 0a 20 20 72 65 67 52 65 73 75 6c 74 20 3d 20  }.  regResult = 
4580: 70 44 65 73 74 2d 3e 69 4d 65 6d 3b 0a 20 20 69  pDest->iMem;.  i
4590: 66 28 20 6e 43 6f 6c 75 6d 6e 3e 30 20 29 7b 0a  f( nColumn>0 ){.
45a0: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e      for(i=0; i<n
45b0: 43 6f 6c 75 6d 6e 3b 20 69 2b 2b 29 7b 0a 20 20  Column; i++){.  
45c0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
45d0: 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 6c 75  ddOp3(v, OP_Colu
45e0: 6d 6e 2c 20 73 72 63 54 61 62 2c 20 69 2c 20 72  mn, srcTab, i, r
45f0: 65 67 52 65 73 75 6c 74 2b 69 29 3b 0a 20 20 20  egResult+i);.   
4600: 20 7d 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 65   }.  }else if( e
4610: 44 65 73 74 21 3d 53 52 54 5f 45 78 69 73 74 73  Dest!=SRT_Exists
4620: 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20 74 68   ){.    /* If th
4630: 65 20 64 65 73 74 69 6e 61 74 69 6f 6e 20 69 73  e destination is
4640: 20 61 6e 20 45 58 49 53 54 53 28 2e 2e 2e 29 20   an EXISTS(...) 
4650: 65 78 70 72 65 73 73 69 6f 6e 2c 20 74 68 65 20  expression, the 
4660: 61 63 74 75 61 6c 0a 20 20 20 20 2a 2a 20 76 61  actual.    ** va
4670: 6c 75 65 73 20 72 65 74 75 72 6e 65 64 20 62 79  lues returned by
4680: 20 74 68 65 20 53 45 4c 45 43 54 20 61 72 65 20   the SELECT are 
4690: 6e 6f 74 20 72 65 71 75 69 72 65 64 2e 0a 20 20  not required..  
46a0: 20 20 2a 2f 0a 20 20 20 20 66 6f 72 28 69 3d 30    */.    for(i=0
46b0: 3b 20 69 3c 6e 52 65 73 75 6c 74 43 6f 6c 3b 20  ; i<nResultCol; 
46c0: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  i++){.      sqli
46d0: 74 65 33 45 78 70 72 43 6f 64 65 28 70 50 61 72  te3ExprCode(pPar
46e0: 73 65 2c 20 70 45 4c 69 73 74 2d 3e 61 5b 69 5d  se, pEList->a[i]
46f0: 2e 70 45 78 70 72 2c 20 72 65 67 52 65 73 75 6c  .pExpr, regResul
4700: 74 2b 69 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  t+i);.    }.  }.
4710: 20 20 6e 43 6f 6c 75 6d 6e 20 3d 20 6e 52 65 73    nColumn = nRes
4720: 75 6c 74 43 6f 6c 3b 0a 0a 20 20 2f 2a 20 49 66  ultCol;..  /* If
4730: 20 74 68 65 20 44 49 53 54 49 4e 43 54 20 6b 65   the DISTINCT ke
4740: 79 77 6f 72 64 20 77 61 73 20 70 72 65 73 65 6e  yword was presen
4750: 74 20 6f 6e 20 74 68 65 20 53 45 4c 45 43 54 20  t on the SELECT 
4760: 73 74 61 74 65 6d 65 6e 74 0a 20 20 2a 2a 20 61  statement.  ** a
4770: 6e 64 20 74 68 69 73 20 72 6f 77 20 68 61 73 20  nd this row has 
4780: 62 65 65 6e 20 73 65 65 6e 20 62 65 66 6f 72 65  been seen before
4790: 2c 20 74 68 65 6e 20 64 6f 20 6e 6f 74 20 6d 61  , then do not ma
47a0: 6b 65 20 74 68 69 73 20 72 6f 77 0a 20 20 2a 2a  ke this row.  **
47b0: 20 70 61 72 74 20 6f 66 20 74 68 65 20 72 65 73   part of the res
47c0: 75 6c 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ult..  */.  if( 
47d0: 68 61 73 44 69 73 74 69 6e 63 74 20 29 7b 0a 20  hasDistinct ){. 
47e0: 20 20 20 61 73 73 65 72 74 28 20 70 45 4c 69 73     assert( pELis
47f0: 74 21 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65  t!=0 );.    asse
4800: 72 74 28 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70  rt( pEList->nExp
4810: 72 3d 3d 6e 43 6f 6c 75 6d 6e 20 29 3b 0a 20 20  r==nColumn );.  
4820: 20 20 63 6f 64 65 44 69 73 74 69 6e 63 74 28 70    codeDistinct(p
4830: 50 61 72 73 65 2c 20 64 69 73 74 69 6e 63 74 2c  Parse, distinct,
4840: 20 69 43 6f 6e 74 69 6e 75 65 2c 20 6e 43 6f 6c   iContinue, nCol
4850: 75 6d 6e 2c 20 72 65 67 52 65 73 75 6c 74 29 3b  umn, regResult);
4860: 0a 20 20 20 20 69 66 28 20 70 4f 72 64 65 72 42  .    if( pOrderB
4870: 79 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 63 6f  y==0 ){.      co
4880: 64 65 4f 66 66 73 65 74 28 76 2c 20 70 2c 20 69  deOffset(v, p, i
4890: 43 6f 6e 74 69 6e 75 65 29 3b 0a 20 20 20 20 7d  Continue);.    }
48a0: 0a 20 20 7d 0a 0a 20 20 69 66 28 20 63 68 65 63  .  }..  if( chec
48b0: 6b 46 6f 72 4d 75 6c 74 69 43 6f 6c 75 6d 6e 53  kForMultiColumnS
48c0: 65 6c 65 63 74 45 72 72 6f 72 28 70 50 61 72 73  electError(pPars
48d0: 65 2c 20 70 44 65 73 74 2c 20 70 45 4c 69 73 74  e, pDest, pEList
48e0: 2d 3e 6e 45 78 70 72 29 20 29 7b 0a 20 20 20 20  ->nExpr) ){.    
48f0: 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 0a 20 20 73  return;.  }..  s
4900: 77 69 74 63 68 28 20 65 44 65 73 74 20 29 7b 0a  witch( eDest ){.
4910: 20 20 20 20 2f 2a 20 49 6e 20 74 68 69 73 20 6d      /* In this m
4920: 6f 64 65 2c 20 77 72 69 74 65 20 65 61 63 68 20  ode, write each 
4930: 71 75 65 72 79 20 72 65 73 75 6c 74 20 74 6f 20  query result to 
4940: 74 68 65 20 6b 65 79 20 6f 66 20 74 68 65 20 74  the key of the t
4950: 65 6d 70 6f 72 61 72 79 0a 20 20 20 20 2a 2a 20  emporary.    ** 
4960: 74 61 62 6c 65 20 69 50 61 72 6d 2e 0a 20 20 20  table iParm..   
4970: 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49   */.#ifndef SQLI
4980: 54 45 5f 4f 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44  TE_OMIT_COMPOUND
4990: 5f 53 45 4c 45 43 54 0a 20 20 20 20 63 61 73 65  _SELECT.    case
49a0: 20 53 52 54 5f 55 6e 69 6f 6e 3a 20 7b 0a 20 20   SRT_Union: {.  
49b0: 20 20 20 20 69 6e 74 20 72 31 3b 0a 20 20 20 20      int r1;.    
49c0: 20 20 72 31 20 3d 20 73 71 6c 69 74 65 33 47 65    r1 = sqlite3Ge
49d0: 74 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 29  tTempReg(pParse)
49e0: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
49f0: 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
4a00: 4d 61 6b 65 52 65 63 6f 72 64 2c 20 72 65 67 52  MakeRecord, regR
4a10: 65 73 75 6c 74 2c 20 6e 43 6f 6c 75 6d 6e 2c 20  esult, nColumn, 
4a20: 72 31 29 3b 0a 20 20 20 20 20 20 69 66 28 20 61  r1);.      if( a
4a30: 66 66 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  ff ){.        sq
4a40: 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50  lite3VdbeChangeP
4a50: 34 28 76 2c 20 2d 31 2c 20 61 66 66 2c 20 50 34  4(v, -1, aff, P4
4a60: 5f 53 54 41 54 49 43 29 3b 0a 20 20 20 20 20 20  _STATIC);.      
4a70: 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  }.      sqlite3V
4a80: 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
4a90: 49 64 78 49 6e 73 65 72 74 2c 20 69 50 61 72 6d  IdxInsert, iParm
4aa0: 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 73 71 6c  , r1);.      sql
4ab0: 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52  ite3ReleaseTempR
4ac0: 65 67 28 70 50 61 72 73 65 2c 20 72 31 29 3b 0a  eg(pParse, r1);.
4ad0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
4ae0: 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 6f 6e 73 74   }..    /* Const
4af0: 72 75 63 74 20 61 20 72 65 63 6f 72 64 20 66 72  ruct a record fr
4b00: 6f 6d 20 74 68 65 20 71 75 65 72 79 20 72 65 73  om the query res
4b10: 75 6c 74 2c 20 62 75 74 20 69 6e 73 74 65 61 64  ult, but instead
4b20: 20 6f 66 0a 20 20 20 20 2a 2a 20 73 61 76 69 6e   of.    ** savin
4b30: 67 20 74 68 61 74 20 72 65 63 6f 72 64 2c 20 75  g that record, u
4b40: 73 65 20 69 74 20 61 73 20 61 20 6b 65 79 20 74  se it as a key t
4b50: 6f 20 64 65 6c 65 74 65 20 65 6c 65 6d 65 6e 74  o delete element
4b60: 73 20 66 72 6f 6d 0a 20 20 20 20 2a 2a 20 74 68  s from.    ** th
4b70: 65 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c  e temporary tabl
4b80: 65 20 69 50 61 72 6d 2e 0a 20 20 20 20 2a 2f 0a  e iParm..    */.
4b90: 20 20 20 20 63 61 73 65 20 53 52 54 5f 45 78 63      case SRT_Exc
4ba0: 65 70 74 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74  ept: {.      int
4bb0: 20 72 31 3b 0a 20 20 20 20 20 20 72 31 20 3d 20   r1;.      r1 = 
4bc0: 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65  sqlite3GetTempRe
4bd0: 67 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20  g(pParse);.     
4be0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
4bf0: 70 33 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63  p3(v, OP_MakeRec
4c00: 6f 72 64 2c 20 72 65 67 52 65 73 75 6c 74 2c 20  ord, regResult, 
4c10: 6e 43 6f 6c 75 6d 6e 2c 20 72 31 29 3b 0a 20 20  nColumn, r1);.  
4c20: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43      sqlite3VdbeC
4c30: 68 61 6e 67 65 50 34 28 76 2c 20 2d 31 2c 20 61  hangeP4(v, -1, a
4c40: 66 66 2c 20 50 34 5f 53 54 41 54 49 43 29 3b 0a  ff, P4_STATIC);.
4c50: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
4c60: 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 64  eAddOp2(v, OP_Id
4c70: 78 44 65 6c 65 74 65 2c 20 69 50 61 72 6d 2c 20  xDelete, iParm, 
4c80: 72 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  r1);.      sqlit
4c90: 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67  e3ReleaseTempReg
4ca0: 28 70 50 61 72 73 65 2c 20 72 31 29 3b 0a 20 20  (pParse, r1);.  
4cb0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
4cc0: 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 2f 2a 20  .#endif..    /* 
4cd0: 53 74 6f 72 65 20 74 68 65 20 72 65 73 75 6c 74  Store the result
4ce0: 20 61 73 20 64 61 74 61 20 75 73 69 6e 67 20 61   as data using a
4cf0: 20 75 6e 69 71 75 65 20 6b 65 79 2e 0a 20 20 20   unique key..   
4d00: 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 52 54   */.    case SRT
4d10: 5f 54 61 62 6c 65 3a 0a 20 20 20 20 63 61 73 65  _Table:.    case
4d20: 20 53 52 54 5f 45 70 68 65 6d 54 61 62 3a 20 7b   SRT_EphemTab: {
4d30: 0a 20 20 20 20 20 20 69 6e 74 20 72 31 20 3d 20  .      int r1 = 
4d40: 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65  sqlite3GetTempRe
4d50: 67 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20  g(pParse);.     
4d60: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
4d70: 70 33 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63  p3(v, OP_MakeRec
4d80: 6f 72 64 2c 20 72 65 67 52 65 73 75 6c 74 2c 20  ord, regResult, 
4d90: 6e 43 6f 6c 75 6d 6e 2c 20 72 31 29 3b 0a 20 20  nColumn, r1);.  
4da0: 20 20 20 20 69 66 28 20 70 4f 72 64 65 72 42 79      if( pOrderBy
4db0: 20 29 7b 0a 20 20 20 20 20 20 20 20 70 75 73 68   ){.        push
4dc0: 4f 6e 74 6f 53 6f 72 74 65 72 28 70 50 61 72 73  OntoSorter(pPars
4dd0: 65 2c 20 70 4f 72 64 65 72 42 79 2c 20 70 2c 20  e, pOrderBy, p, 
4de0: 72 31 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  r1);.      }else
4df0: 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 72 32  {.        int r2
4e00: 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d   = sqlite3GetTem
4e10: 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20  pReg(pParse);.  
4e20: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
4e30: 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 65  eAddOp2(v, OP_Ne
4e40: 77 52 6f 77 69 64 2c 20 69 50 61 72 6d 2c 20 72  wRowid, iParm, r
4e50: 32 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  2);.        sqli
4e60: 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
4e70: 20 4f 50 5f 49 6e 73 65 72 74 2c 20 69 50 61 72   OP_Insert, iPar
4e80: 6d 2c 20 72 31 2c 20 72 32 29 3b 0a 20 20 20 20  m, r1, r2);.    
4e90: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43      sqlite3VdbeC
4ea0: 68 61 6e 67 65 50 35 28 76 2c 20 4f 50 46 4c 41  hangeP5(v, OPFLA
4eb0: 47 5f 41 50 50 45 4e 44 29 3b 0a 20 20 20 20 20  G_APPEND);.     
4ec0: 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73     sqlite3Releas
4ed0: 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c  eTempReg(pParse,
4ee0: 20 72 32 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20   r2);.      }.  
4ef0: 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61      sqlite3Relea
4f00: 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65  seTempReg(pParse
4f10: 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 62 72 65  , r1);.      bre
4f20: 61 6b 3b 0a 20 20 20 20 7d 0a 0a 23 69 66 6e 64  ak;.    }..#ifnd
4f30: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53  ef SQLITE_OMIT_S
4f40: 55 42 51 55 45 52 59 0a 20 20 20 20 2f 2a 20 49  UBQUERY.    /* I
4f50: 66 20 77 65 20 61 72 65 20 63 72 65 61 74 69 6e  f we are creatin
4f60: 67 20 61 20 73 65 74 20 66 6f 72 20 61 6e 20 22  g a set for an "
4f70: 65 78 70 72 20 49 4e 20 28 53 45 4c 45 43 54 20  expr IN (SELECT 
4f80: 2e 2e 2e 29 22 20 63 6f 6e 73 74 72 75 63 74 2c  ...)" construct,
4f90: 0a 20 20 20 20 2a 2a 20 74 68 65 6e 20 74 68 65  .    ** then the
4fa0: 72 65 20 73 68 6f 75 6c 64 20 62 65 20 61 20 73  re should be a s
4fb0: 69 6e 67 6c 65 20 69 74 65 6d 20 6f 6e 20 74 68  ingle item on th
4fc0: 65 20 73 74 61 63 6b 2e 20 20 57 72 69 74 65 20  e stack.  Write 
4fd0: 74 68 69 73 0a 20 20 20 20 2a 2a 20 69 74 65 6d  this.    ** item
4fe0: 20 69 6e 74 6f 20 74 68 65 20 73 65 74 20 74 61   into the set ta
4ff0: 62 6c 65 20 77 69 74 68 20 62 6f 67 75 73 20 64  ble with bogus d
5000: 61 74 61 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ata..    */.    
5010: 63 61 73 65 20 53 52 54 5f 53 65 74 3a 20 7b 0a  case SRT_Set: {.
5020: 20 20 20 20 20 20 69 6e 74 20 61 64 64 72 32 3b        int addr2;
5030: 0a 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ..      assert( 
5040: 6e 43 6f 6c 75 6d 6e 3d 3d 31 20 29 3b 0a 20 20  nColumn==1 );.  
5050: 20 20 20 20 61 64 64 72 32 20 3d 20 73 71 6c 69      addr2 = sqli
5060: 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c  te3VdbeAddOp1(v,
5070: 20 4f 50 5f 49 73 4e 75 6c 6c 2c 20 72 65 67 52   OP_IsNull, regR
5080: 65 73 75 6c 74 29 3b 0a 20 20 20 20 20 20 70 2d  esult);.      p-
5090: 3e 61 66 66 69 6e 69 74 79 20 3d 20 73 71 6c 69  >affinity = sqli
50a0: 74 65 33 43 6f 6d 70 61 72 65 41 66 66 69 6e 69  te3CompareAffini
50b0: 74 79 28 70 45 4c 69 73 74 2d 3e 61 5b 30 5d 2e  ty(pEList->a[0].
50c0: 70 45 78 70 72 2c 20 70 44 65 73 74 2d 3e 61 66  pExpr, pDest->af
50d0: 66 69 6e 69 74 79 29 3b 0a 20 20 20 20 20 20 69  finity);.      i
50e0: 66 28 20 70 4f 72 64 65 72 42 79 20 29 7b 0a 20  f( pOrderBy ){. 
50f0: 20 20 20 20 20 20 20 2f 2a 20 41 74 20 66 69 72         /* At fir
5100: 73 74 20 67 6c 61 6e 63 65 20 79 6f 75 20 77 6f  st glance you wo
5110: 75 6c 64 20 74 68 69 6e 6b 20 77 65 20 63 6f 75  uld think we cou
5120: 6c 64 20 6f 70 74 69 6d 69 7a 65 20 6f 75 74 20  ld optimize out 
5130: 74 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 4f  the.        ** O
5140: 52 44 45 52 20 42 59 20 69 6e 20 74 68 69 73 20  RDER BY in this 
5150: 63 61 73 65 20 73 69 6e 63 65 20 74 68 65 20 6f  case since the o
5160: 72 64 65 72 20 6f 66 20 65 6e 74 72 69 65 73 20  rder of entries 
5170: 69 6e 20 74 68 65 20 73 65 74 0a 20 20 20 20 20  in the set.     
5180: 20 20 20 2a 2a 20 64 6f 65 73 20 6e 6f 74 20 6d     ** does not m
5190: 61 74 74 65 72 2e 20 20 42 75 74 20 74 68 65 72  atter.  But ther
51a0: 65 20 6d 69 67 68 74 20 62 65 20 61 20 4c 49 4d  e might be a LIM
51b0: 49 54 20 63 6c 61 75 73 65 2c 20 69 6e 20 77 68  IT clause, in wh
51c0: 69 63 68 0a 20 20 20 20 20 20 20 20 2a 2a 20 63  ich.        ** c
51d0: 61 73 65 20 74 68 65 20 6f 72 64 65 72 20 64 6f  ase the order do
51e0: 65 73 20 6d 61 74 74 65 72 20 2a 2f 0a 20 20 20  es matter */.   
51f0: 20 20 20 20 20 70 75 73 68 4f 6e 74 6f 53 6f 72       pushOntoSor
5200: 74 65 72 28 70 50 61 72 73 65 2c 20 70 4f 72 64  ter(pParse, pOrd
5210: 65 72 42 79 2c 20 70 2c 20 72 65 67 52 65 73 75  erBy, p, regResu
5220: 6c 74 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  lt);.      }else
5230: 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 72 31  {.        int r1
5240: 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d   = sqlite3GetTem
5250: 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20  pReg(pParse);.  
5260: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
5270: 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 4d 61  eAddOp4(v, OP_Ma
5280: 6b 65 52 65 63 6f 72 64 2c 20 72 65 67 52 65 73  keRecord, regRes
5290: 75 6c 74 2c 20 31 2c 20 72 31 2c 20 26 70 2d 3e  ult, 1, r1, &p->
52a0: 61 66 66 69 6e 69 74 79 2c 20 31 29 3b 0a 20 20  affinity, 1);.  
52b0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
52c0: 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 64  eAddOp2(v, OP_Id
52d0: 78 49 6e 73 65 72 74 2c 20 69 50 61 72 6d 2c 20  xInsert, iParm, 
52e0: 72 31 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  r1);.        sql
52f0: 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52  ite3ReleaseTempR
5300: 65 67 28 70 50 61 72 73 65 2c 20 72 31 29 3b 0a  eg(pParse, r1);.
5310: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71        }.      sq
5320: 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72  lite3VdbeJumpHer
5330: 65 28 76 2c 20 61 64 64 72 32 29 3b 0a 20 20 20  e(v, addr2);.   
5340: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
5350: 0a 20 20 20 20 2f 2a 20 49 66 20 61 6e 79 20 72  .    /* If any r
5360: 6f 77 20 65 78 69 73 74 20 69 6e 20 74 68 65 20  ow exist in the 
5370: 72 65 73 75 6c 74 20 73 65 74 2c 20 72 65 63 6f  result set, reco
5380: 72 64 20 74 68 61 74 20 66 61 63 74 20 61 6e 64  rd that fact and
5390: 20 61 62 6f 72 74 2e 0a 20 20 20 20 2a 2f 0a 20   abort..    */. 
53a0: 20 20 20 63 61 73 65 20 53 52 54 5f 45 78 69 73     case SRT_Exis
53b0: 74 73 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69  ts: {.      sqli
53c0: 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
53d0: 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 31 2c 20   OP_Integer, 1, 
53e0: 69 50 61 72 6d 29 3b 0a 20 20 20 20 20 20 2f 2a  iParm);.      /*
53f0: 20 54 68 65 20 4c 49 4d 49 54 20 63 6c 61 75 73   The LIMIT claus
5400: 65 20 77 69 6c 6c 20 74 65 72 6d 69 6e 61 74 65  e will terminate
5410: 20 74 68 65 20 6c 6f 6f 70 20 66 6f 72 20 75 73   the loop for us
5420: 20 2a 2f 0a 20 20 20 20 20 20 62 72 65 61 6b 3b   */.      break;
5430: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49  .    }..    /* I
5440: 66 20 74 68 69 73 20 69 73 20 61 20 73 63 61 6c  f this is a scal
5450: 61 72 20 73 65 6c 65 63 74 20 74 68 61 74 20 69  ar select that i
5460: 73 20 70 61 72 74 20 6f 66 20 61 6e 20 65 78 70  s part of an exp
5470: 72 65 73 73 69 6f 6e 2c 20 74 68 65 6e 0a 20 20  ression, then.  
5480: 20 20 2a 2a 20 73 74 6f 72 65 20 74 68 65 20 72    ** store the r
5490: 65 73 75 6c 74 73 20 69 6e 20 74 68 65 20 61 70  esults in the ap
54a0: 70 72 6f 70 72 69 61 74 65 20 6d 65 6d 6f 72 79  propriate memory
54b0: 20 63 65 6c 6c 20 61 6e 64 20 62 72 65 61 6b 20   cell and break 
54c0: 6f 75 74 0a 20 20 20 20 2a 2a 20 6f 66 20 74 68  out.    ** of th
54d0: 65 20 73 63 61 6e 20 6c 6f 6f 70 2e 0a 20 20 20  e scan loop..   
54e0: 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 52 54   */.    case SRT
54f0: 5f 4d 65 6d 3a 20 7b 0a 20 20 20 20 20 20 61 73  _Mem: {.      as
5500: 73 65 72 74 28 20 6e 43 6f 6c 75 6d 6e 3d 3d 31  sert( nColumn==1
5510: 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4f   );.      if( pO
5520: 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20 20 20  rderBy ){.      
5530: 20 20 70 75 73 68 4f 6e 74 6f 53 6f 72 74 65 72    pushOntoSorter
5540: 28 70 50 61 72 73 65 2c 20 70 4f 72 64 65 72 42  (pParse, pOrderB
5550: 79 2c 20 70 2c 20 72 65 67 52 65 73 75 6c 74 29  y, p, regResult)
5560: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
5570: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
5580: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4d  beAddOp2(v, OP_M
5590: 6f 76 65 2c 20 72 65 67 52 65 73 75 6c 74 2c 20  ove, regResult, 
55a0: 69 50 61 72 6d 29 3b 0a 20 20 20 20 20 20 20 20  iParm);.        
55b0: 2f 2a 20 54 68 65 20 4c 49 4d 49 54 20 63 6c 61  /* The LIMIT cla
55c0: 75 73 65 20 77 69 6c 6c 20 6a 75 6d 70 20 6f 75  use will jump ou
55d0: 74 20 6f 66 20 74 68 65 20 6c 6f 6f 70 20 66 6f  t of the loop fo
55e0: 72 20 75 73 20 2a 2f 0a 20 20 20 20 20 20 7d 0a  r us */.      }.
55f0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
5600: 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 23 69 66   }.#endif /* #if
5610: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
5620: 5f 53 55 42 51 55 45 52 59 20 2a 2f 0a 0a 20 20  _SUBQUERY */..  
5630: 20 20 2f 2a 20 53 65 6e 64 20 74 68 65 20 64 61    /* Send the da
5640: 74 61 20 74 6f 20 74 68 65 20 63 61 6c 6c 62 61  ta to the callba
5650: 63 6b 20 66 75 6e 63 74 69 6f 6e 20 6f 72 20 74  ck function or t
5660: 6f 20 61 20 73 75 62 72 6f 75 74 69 6e 65 2e 20  o a subroutine. 
5670: 20 49 6e 20 74 68 65 0a 20 20 20 20 2a 2a 20 63   In the.    ** c
5680: 61 73 65 20 6f 66 20 61 20 73 75 62 72 6f 75 74  ase of a subrout
5690: 69 6e 65 2c 20 74 68 65 20 73 75 62 72 6f 75 74  ine, the subrout
56a0: 69 6e 65 20 69 74 73 65 6c 66 20 69 73 20 72 65  ine itself is re
56b0: 73 70 6f 6e 73 69 62 6c 65 20 66 6f 72 0a 20 20  sponsible for.  
56c0: 20 20 2a 2a 20 70 6f 70 70 69 6e 67 20 74 68 65    ** popping the
56d0: 20 64 61 74 61 20 66 72 6f 6d 20 74 68 65 20 73   data from the s
56e0: 74 61 63 6b 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  tack..    */.   
56f0: 20 63 61 73 65 20 53 52 54 5f 53 75 62 72 6f 75   case SRT_Subrou
5700: 74 69 6e 65 3a 0a 20 20 20 20 63 61 73 65 20 53  tine:.    case S
5710: 52 54 5f 43 61 6c 6c 62 61 63 6b 3a 20 7b 0a 20  RT_Callback: {. 
5720: 20 20 20 20 20 69 66 28 20 70 4f 72 64 65 72 42       if( pOrderB
5730: 79 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74  y ){.        int
5740: 20 72 31 20 3d 20 73 71 6c 69 74 65 33 47 65 74   r1 = sqlite3Get
5750: 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b  TempReg(pParse);
5760: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
5770: 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
5780: 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20 72 65 67  _MakeRecord, reg
5790: 52 65 73 75 6c 74 2c 20 6e 43 6f 6c 75 6d 6e 2c  Result, nColumn,
57a0: 20 72 31 29 3b 0a 20 20 20 20 20 20 20 20 70 75   r1);.        pu
57b0: 73 68 4f 6e 74 6f 53 6f 72 74 65 72 28 70 50 61  shOntoSorter(pPa
57c0: 72 73 65 2c 20 70 4f 72 64 65 72 42 79 2c 20 70  rse, pOrderBy, p
57d0: 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 20 20 73  , r1);.        s
57e0: 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d  qlite3ReleaseTem
57f0: 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 31 29  pReg(pParse, r1)
5800: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66  ;.      }else if
5810: 28 20 65 44 65 73 74 3d 3d 53 52 54 5f 53 75 62  ( eDest==SRT_Sub
5820: 72 6f 75 74 69 6e 65 20 29 7b 0a 20 20 20 20 20  routine ){.     
5830: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
5840: 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 73 75 62  dOp2(v, OP_Gosub
5850: 2c 20 30 2c 20 69 50 61 72 6d 29 3b 0a 20 20 20  , 0, iParm);.   
5860: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
5870: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
5880: 4f 70 32 28 76 2c 20 4f 50 5f 52 65 73 75 6c 74  Op2(v, OP_Result
5890: 52 6f 77 2c 20 72 65 67 52 65 73 75 6c 74 2c 20  Row, regResult, 
58a0: 6e 43 6f 6c 75 6d 6e 29 3b 0a 20 20 20 20 20 20  nColumn);.      
58b0: 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  }.      break;. 
58c0: 20 20 20 7d 0a 0a 23 69 66 20 21 64 65 66 69 6e     }..#if !defin
58d0: 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54  ed(SQLITE_OMIT_T
58e0: 52 49 47 47 45 52 29 0a 20 20 20 20 2f 2a 20 44  RIGGER).    /* D
58f0: 69 73 63 61 72 64 20 74 68 65 20 72 65 73 75 6c  iscard the resul
5900: 74 73 2e 20 20 54 68 69 73 20 69 73 20 75 73 65  ts.  This is use
5910: 64 20 66 6f 72 20 53 45 4c 45 43 54 20 73 74 61  d for SELECT sta
5920: 74 65 6d 65 6e 74 73 20 69 6e 73 69 64 65 0a 20  tements inside. 
5930: 20 20 20 2a 2a 20 74 68 65 20 62 6f 64 79 20 6f     ** the body o
5940: 66 20 61 20 54 52 49 47 47 45 52 2e 20 20 54 68  f a TRIGGER.  Th
5950: 65 20 70 75 72 70 6f 73 65 20 6f 66 20 73 75 63  e purpose of suc
5960: 68 20 73 65 6c 65 63 74 73 20 69 73 20 74 6f 20  h selects is to 
5970: 63 61 6c 6c 0a 20 20 20 20 2a 2a 20 75 73 65 72  call.    ** user
5980: 2d 64 65 66 69 6e 65 64 20 66 75 6e 63 74 69 6f  -defined functio
5990: 6e 73 20 74 68 61 74 20 68 61 76 65 20 73 69 64  ns that have sid
59a0: 65 20 65 66 66 65 63 74 73 2e 20 20 57 65 20 64  e effects.  We d
59b0: 6f 20 6e 6f 74 20 63 61 72 65 0a 20 20 20 20 2a  o not care.    *
59c0: 2a 20 61 62 6f 75 74 20 74 68 65 20 61 63 74 75  * about the actu
59d0: 61 6c 20 72 65 73 75 6c 74 73 20 6f 66 20 74 68  al results of th
59e0: 65 20 73 65 6c 65 63 74 2e 0a 20 20 20 20 2a 2f  e select..    */
59f0: 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a  .    default: {.
5a00: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 65 44        assert( eD
5a10: 65 73 74 3d 3d 53 52 54 5f 44 69 73 63 61 72 64  est==SRT_Discard
5a20: 20 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b   );.      break;
5a30: 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  .    }.#endif.  
5a40: 7d 0a 0a 20 20 2f 2a 20 4a 75 6d 70 20 74 6f 20  }..  /* Jump to 
5a50: 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 6c  the end of the l
5a60: 6f 6f 70 20 69 66 20 74 68 65 20 4c 49 4d 49 54  oop if the LIMIT
5a70: 20 69 73 20 72 65 61 63 68 65 64 2e 0a 20 20 2a   is reached..  *
5a80: 2f 0a 20 20 69 66 28 20 70 2d 3e 69 4c 69 6d 69  /.  if( p->iLimi
5a90: 74 3e 3d 30 20 26 26 20 70 4f 72 64 65 72 42 79  t>=0 && pOrderBy
5aa0: 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ==0 ){.    sqlit
5ab0: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
5ac0: 4f 50 5f 41 64 64 49 6d 6d 2c 20 70 2d 3e 69 4c  OP_AddImm, p->iL
5ad0: 69 6d 69 74 2c 20 2d 31 29 3b 0a 20 20 20 20 73  imit, -1);.    s
5ae0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
5af0: 28 76 2c 20 4f 50 5f 49 66 5a 65 72 6f 2c 20 70  (v, OP_IfZero, p
5b00: 2d 3e 69 4c 69 6d 69 74 2c 20 69 42 72 65 61 6b  ->iLimit, iBreak
5b10: 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  );.  }.}../*.** 
5b20: 47 69 76 65 6e 20 61 6e 20 65 78 70 72 65 73 73  Given an express
5b30: 69 6f 6e 20 6c 69 73 74 2c 20 67 65 6e 65 72 61  ion list, genera
5b40: 74 65 20 61 20 4b 65 79 49 6e 66 6f 20 73 74 72  te a KeyInfo str
5b50: 75 63 74 75 72 65 20 74 68 61 74 20 72 65 63 6f  ucture that reco
5b60: 72 64 73 0a 2a 2a 20 74 68 65 20 63 6f 6c 6c 61  rds.** the colla
5b70: 74 69 6e 67 20 73 65 71 75 65 6e 63 65 20 66 6f  ting sequence fo
5b80: 72 20 65 61 63 68 20 65 78 70 72 65 73 73 69 6f  r each expressio
5b90: 6e 20 69 6e 20 74 68 61 74 20 65 78 70 72 65 73  n in that expres
5ba0: 73 69 6f 6e 20 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a  sion list..**.**
5bb0: 20 49 66 20 74 68 65 20 45 78 70 72 4c 69 73 74   If the ExprList
5bc0: 20 69 73 20 61 6e 20 4f 52 44 45 52 20 42 59 20   is an ORDER BY 
5bd0: 6f 72 20 47 52 4f 55 50 20 42 59 20 63 6c 61 75  or GROUP BY clau
5be0: 73 65 20 74 68 65 6e 20 74 68 65 20 72 65 73 75  se then the resu
5bf0: 6c 74 69 6e 67 0a 2a 2a 20 4b 65 79 49 6e 66 6f  lting.** KeyInfo
5c00: 20 73 74 72 75 63 74 75 72 65 20 69 73 20 61 70   structure is ap
5c10: 70 72 6f 70 72 69 61 74 65 20 66 6f 72 20 69 6e  propriate for in
5c20: 69 74 69 61 6c 69 7a 69 6e 67 20 61 20 76 69 72  itializing a vir
5c30: 74 75 61 6c 20 69 6e 64 65 78 20 74 6f 0a 2a 2a  tual index to.**
5c40: 20 69 6d 70 6c 65 6d 65 6e 74 20 74 68 61 74 20   implement that 
5c50: 63 6c 61 75 73 65 2e 20 20 49 66 20 74 68 65 20  clause.  If the 
5c60: 45 78 70 72 4c 69 73 74 20 69 73 20 74 68 65 20  ExprList is the 
5c70: 72 65 73 75 6c 74 20 73 65 74 20 6f 66 20 61 20  result set of a 
5c80: 53 45 4c 45 43 54 0a 2a 2a 20 74 68 65 6e 20 74  SELECT.** then t
5c90: 68 65 20 4b 65 79 49 6e 66 6f 20 73 74 72 75 63  he KeyInfo struc
5ca0: 74 75 72 65 20 69 73 20 61 70 70 72 6f 70 72 69  ture is appropri
5cb0: 61 74 65 20 66 6f 72 20 69 6e 69 74 69 61 6c 69  ate for initiali
5cc0: 7a 69 6e 67 20 61 20 76 69 72 74 75 61 6c 0a 2a  zing a virtual.*
5cd0: 2a 20 69 6e 64 65 78 20 74 6f 20 69 6d 70 6c 65  * index to imple
5ce0: 6d 65 6e 74 20 61 20 44 49 53 54 49 4e 43 54 20  ment a DISTINCT 
5cf0: 74 65 73 74 2e 0a 2a 2a 0a 2a 2a 20 53 70 61 63  test..**.** Spac
5d00: 65 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 4b 65  e to hold the Ke
5d10: 79 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65 20  yInfo structure 
5d20: 69 73 20 6f 62 74 61 69 6e 20 66 72 6f 6d 20 6d  is obtain from m
5d30: 61 6c 6c 6f 63 2e 20 20 54 68 65 20 63 61 6c 6c  alloc.  The call
5d40: 69 6e 67 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20  ing.** function 
5d50: 69 73 20 72 65 73 70 6f 6e 73 69 62 6c 65 20 66  is responsible f
5d60: 6f 72 20 73 65 65 69 6e 67 20 74 68 61 74 20 74  or seeing that t
5d70: 68 69 73 20 73 74 72 75 63 74 75 72 65 20 69 73  his structure is
5d80: 20 65 76 65 6e 74 75 61 6c 6c 79 0a 2a 2a 20 66   eventually.** f
5d90: 72 65 65 64 2e 20 20 41 64 64 20 74 68 65 20 4b  reed.  Add the K
5da0: 65 79 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65  eyInfo structure
5db0: 20 74 6f 20 74 68 65 20 50 34 20 66 69 65 6c 64   to the P4 field
5dc0: 20 6f 66 20 61 6e 20 6f 70 63 6f 64 65 20 75 73   of an opcode us
5dd0: 69 6e 67 0a 2a 2a 20 50 34 5f 4b 45 59 49 4e 46  ing.** P4_KEYINF
5de0: 4f 5f 48 41 4e 44 4f 46 46 20 69 73 20 74 68 65  O_HANDOFF is the
5df0: 20 75 73 75 61 6c 20 77 61 79 20 6f 66 20 64 65   usual way of de
5e00: 61 6c 69 6e 67 20 77 69 74 68 20 74 68 69 73 2e  aling with this.
5e10: 0a 2a 2f 0a 73 74 61 74 69 63 20 4b 65 79 49 6e  .*/.static KeyIn
5e20: 66 6f 20 2a 6b 65 79 49 6e 66 6f 46 72 6f 6d 45  fo *keyInfoFromE
5e30: 78 70 72 4c 69 73 74 28 50 61 72 73 65 20 2a 70  xprList(Parse *p
5e40: 50 61 72 73 65 2c 20 45 78 70 72 4c 69 73 74 20  Parse, ExprList 
5e50: 2a 70 4c 69 73 74 29 7b 0a 20 20 73 71 6c 69 74  *pList){.  sqlit
5e60: 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d  e3 *db = pParse-
5e70: 3e 64 62 3b 0a 20 20 69 6e 74 20 6e 45 78 70 72  >db;.  int nExpr
5e80: 3b 0a 20 20 4b 65 79 49 6e 66 6f 20 2a 70 49 6e  ;.  KeyInfo *pIn
5e90: 66 6f 3b 0a 20 20 73 74 72 75 63 74 20 45 78 70  fo;.  struct Exp
5ea0: 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65  rList_item *pIte
5eb0: 6d 3b 0a 20 20 69 6e 74 20 69 3b 0a 0a 20 20 6e  m;.  int i;..  n
5ec0: 45 78 70 72 20 3d 20 70 4c 69 73 74 2d 3e 6e 45  Expr = pList->nE
5ed0: 78 70 72 3b 0a 20 20 70 49 6e 66 6f 20 3d 20 73  xpr;.  pInfo = s
5ee0: 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65  qlite3DbMallocZe
5ef0: 72 6f 28 64 62 2c 20 73 69 7a 65 6f 66 28 2a 70  ro(db, sizeof(*p
5f00: 49 6e 66 6f 29 20 2b 20 6e 45 78 70 72 2a 28 73  Info) + nExpr*(s
5f10: 69 7a 65 6f 66 28 43 6f 6c 6c 53 65 71 2a 29 2b  izeof(CollSeq*)+
5f20: 31 29 20 29 3b 0a 20 20 69 66 28 20 70 49 6e 66  1) );.  if( pInf
5f30: 6f 20 29 7b 0a 20 20 20 20 70 49 6e 66 6f 2d 3e  o ){.    pInfo->
5f40: 61 53 6f 72 74 4f 72 64 65 72 20 3d 20 28 75 38  aSortOrder = (u8
5f50: 2a 29 26 70 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b  *)&pInfo->aColl[
5f60: 6e 45 78 70 72 5d 3b 0a 20 20 20 20 70 49 6e 66  nExpr];.    pInf
5f70: 6f 2d 3e 6e 46 69 65 6c 64 20 3d 20 6e 45 78 70  o->nField = nExp
5f80: 72 3b 0a 20 20 20 20 70 49 6e 66 6f 2d 3e 65 6e  r;.    pInfo->en
5f90: 63 20 3d 20 45 4e 43 28 64 62 29 3b 0a 20 20 20  c = ENC(db);.   
5fa0: 20 66 6f 72 28 69 3d 30 2c 20 70 49 74 65 6d 3d   for(i=0, pItem=
5fb0: 70 4c 69 73 74 2d 3e 61 3b 20 69 3c 6e 45 78 70  pList->a; i<nExp
5fc0: 72 3b 20 69 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29  r; i++, pItem++)
5fd0: 7b 0a 20 20 20 20 20 20 43 6f 6c 6c 53 65 71 20  {.      CollSeq 
5fe0: 2a 70 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 70 43  *pColl;.      pC
5ff0: 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 45 78 70  oll = sqlite3Exp
6000: 72 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c  rCollSeq(pParse,
6010: 20 70 49 74 65 6d 2d 3e 70 45 78 70 72 29 3b 0a   pItem->pExpr);.
6020: 20 20 20 20 20 20 69 66 28 20 21 70 43 6f 6c 6c        if( !pColl
6030: 20 29 7b 0a 20 20 20 20 20 20 20 20 70 43 6f 6c   ){.        pCol
6040: 6c 20 3d 20 64 62 2d 3e 70 44 66 6c 74 43 6f 6c  l = db->pDfltCol
6050: 6c 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  l;.      }.     
6060: 20 70 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b 69 5d   pInfo->aColl[i]
6070: 20 3d 20 70 43 6f 6c 6c 3b 0a 20 20 20 20 20 20   = pColl;.      
6080: 70 49 6e 66 6f 2d 3e 61 53 6f 72 74 4f 72 64 65  pInfo->aSortOrde
6090: 72 5b 69 5d 20 3d 20 70 49 74 65 6d 2d 3e 73 6f  r[i] = pItem->so
60a0: 72 74 4f 72 64 65 72 3b 0a 20 20 20 20 7d 0a 20  rtOrder;.    }. 
60b0: 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 49 6e 66   }.  return pInf
60c0: 6f 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 49 66 20  o;.}.../*.** If 
60d0: 74 68 65 20 69 6e 6e 65 72 20 6c 6f 6f 70 20 77  the inner loop w
60e0: 61 73 20 67 65 6e 65 72 61 74 65 64 20 75 73 69  as generated usi
60f0: 6e 67 20 61 20 6e 6f 6e 2d 6e 75 6c 6c 20 70 4f  ng a non-null pO
6100: 72 64 65 72 42 79 20 61 72 67 75 6d 65 6e 74 2c  rderBy argument,
6110: 0a 2a 2a 20 74 68 65 6e 20 74 68 65 20 72 65 73  .** then the res
6120: 75 6c 74 73 20 77 65 72 65 20 70 6c 61 63 65 64  ults were placed
6130: 20 69 6e 20 61 20 73 6f 72 74 65 72 2e 20 20 41   in a sorter.  A
6140: 66 74 65 72 20 74 68 65 20 6c 6f 6f 70 20 69 73  fter the loop is
6150: 20 74 65 72 6d 69 6e 61 74 65 64 0a 2a 2a 20 77   terminated.** w
6160: 65 20 6e 65 65 64 20 74 6f 20 72 75 6e 20 74 68  e need to run th
6170: 65 20 73 6f 72 74 65 72 20 61 6e 64 20 6f 75 74  e sorter and out
6180: 70 75 74 20 74 68 65 20 72 65 73 75 6c 74 73 2e  put the results.
6190: 20 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 0a    The following.
61a0: 2a 2a 20 72 6f 75 74 69 6e 65 20 67 65 6e 65 72  ** routine gener
61b0: 61 74 65 73 20 74 68 65 20 63 6f 64 65 20 6e 65  ates the code ne
61c0: 65 64 65 64 20 74 6f 20 64 6f 20 74 68 61 74 2e  eded to do that.
61d0: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
61e0: 67 65 6e 65 72 61 74 65 53 6f 72 74 54 61 69 6c  generateSortTail
61f0: 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
6200: 65 2c 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67  e,    /* Parsing
6210: 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53 65   context */.  Se
6220: 6c 65 63 74 20 2a 70 2c 20 20 20 20 20 20 20 20  lect *p,        
6230: 2f 2a 20 54 68 65 20 53 45 4c 45 43 54 20 73 74  /* The SELECT st
6240: 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 56 64 62  atement */.  Vdb
6250: 65 20 2a 76 2c 20 20 20 20 20 20 20 20 20 20 2f  e *v,          /
6260: 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20  * Generate code 
6270: 69 6e 74 6f 20 74 68 69 73 20 56 44 42 45 20 2a  into this VDBE *
6280: 2f 0a 20 20 69 6e 74 20 6e 43 6f 6c 75 6d 6e 2c  /.  int nColumn,
6290: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
62a0: 6f 66 20 63 6f 6c 75 6d 6e 73 20 6f 66 20 64 61  of columns of da
62b0: 74 61 20 2a 2f 0a 20 20 53 65 6c 65 63 74 44 65  ta */.  SelectDe
62c0: 73 74 20 2a 70 44 65 73 74 20 2f 2a 20 57 72 69  st *pDest /* Wri
62d0: 74 65 20 74 68 65 20 73 6f 72 74 65 64 20 72 65  te the sorted re
62e0: 73 75 6c 74 73 20 68 65 72 65 20 2a 2f 0a 29 7b  sults here */.){
62f0: 0a 20 20 69 6e 74 20 62 72 6b 20 3d 20 73 71 6c  .  int brk = sql
6300: 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65  ite3VdbeMakeLabe
6310: 6c 28 76 29 3b 0a 20 20 69 6e 74 20 63 6f 6e 74  l(v);.  int cont
6320: 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61   = sqlite3VdbeMa
6330: 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 69 6e  keLabel(v);.  in
6340: 74 20 61 64 64 72 3b 0a 20 20 69 6e 74 20 69 54  t addr;.  int iT
6350: 61 62 3b 0a 20 20 69 6e 74 20 70 73 65 75 64 6f  ab;.  int pseudo
6360: 54 61 62 20 3d 20 30 3b 0a 20 20 45 78 70 72 4c  Tab = 0;.  ExprL
6370: 69 73 74 20 2a 70 4f 72 64 65 72 42 79 20 3d 20  ist *pOrderBy = 
6380: 70 2d 3e 70 4f 72 64 65 72 42 79 3b 0a 0a 20 20  p->pOrderBy;..  
6390: 69 6e 74 20 65 44 65 73 74 20 3d 20 70 44 65 73  int eDest = pDes
63a0: 74 2d 3e 65 44 65 73 74 3b 0a 20 20 69 6e 74 20  t->eDest;.  int 
63b0: 69 50 61 72 6d 20 3d 20 70 44 65 73 74 2d 3e 69  iParm = pDest->i
63c0: 50 61 72 6d 3b 0a 0a 20 20 69 6e 74 20 72 65 67  Parm;..  int reg
63d0: 52 6f 77 3b 0a 20 20 69 6e 74 20 72 65 67 52 6f  Row;.  int regRo
63e0: 77 69 64 3b 0a 0a 20 20 69 54 61 62 20 3d 20 70  wid;..  iTab = p
63f0: 4f 72 64 65 72 42 79 2d 3e 69 45 43 75 72 73 6f  OrderBy->iECurso
6400: 72 3b 0a 20 20 69 66 28 20 65 44 65 73 74 3d 3d  r;.  if( eDest==
6410: 53 52 54 5f 43 61 6c 6c 62 61 63 6b 20 7c 7c 20  SRT_Callback || 
6420: 65 44 65 73 74 3d 3d 53 52 54 5f 53 75 62 72 6f  eDest==SRT_Subro
6430: 75 74 69 6e 65 20 29 7b 0a 20 20 20 20 70 73 65  utine ){.    pse
6440: 75 64 6f 54 61 62 20 3d 20 70 50 61 72 73 65 2d  udoTab = pParse-
6450: 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20 73 71 6c  >nTab++;.    sql
6460: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
6470: 2c 20 4f 50 5f 4f 70 65 6e 50 73 65 75 64 6f 2c  , OP_OpenPseudo,
6480: 20 70 73 65 75 64 6f 54 61 62 2c 20 30 29 3b 0a   pseudoTab, 0);.
6490: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
64a0: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 53 65 74 4e  ddOp2(v, OP_SetN
64b0: 75 6d 43 6f 6c 75 6d 6e 73 2c 20 70 73 65 75 64  umColumns, pseud
64c0: 6f 54 61 62 2c 20 6e 43 6f 6c 75 6d 6e 29 3b 0a  oTab, nColumn);.
64d0: 20 20 7d 0a 20 20 61 64 64 72 20 3d 20 31 20 2b    }.  addr = 1 +
64e0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
64f0: 70 32 28 76 2c 20 4f 50 5f 53 6f 72 74 2c 20 69  p2(v, OP_Sort, i
6500: 54 61 62 2c 20 62 72 6b 29 3b 0a 20 20 63 6f 64  Tab, brk);.  cod
6510: 65 4f 66 66 73 65 74 28 76 2c 20 70 2c 20 63 6f  eOffset(v, p, co
6520: 6e 74 29 3b 0a 20 20 72 65 67 52 6f 77 20 3d 20  nt);.  regRow = 
6530: 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65  sqlite3GetTempRe
6540: 67 28 70 50 61 72 73 65 29 3b 0a 20 20 72 65 67  g(pParse);.  reg
6550: 52 6f 77 69 64 20 3d 20 73 71 6c 69 74 65 33 47  Rowid = sqlite3G
6560: 65 74 54 65 6d 70 52 65 67 28 70 50 61 72 73 65  etTempReg(pParse
6570: 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  );.  sqlite3Vdbe
6580: 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 6c  AddOp3(v, OP_Col
6590: 75 6d 6e 2c 20 69 54 61 62 2c 20 70 4f 72 64 65  umn, iTab, pOrde
65a0: 72 42 79 2d 3e 6e 45 78 70 72 20 2b 20 31 2c 20  rBy->nExpr + 1, 
65b0: 72 65 67 52 6f 77 29 3b 0a 20 20 73 77 69 74 63  regRow);.  switc
65c0: 68 28 20 65 44 65 73 74 20 29 7b 0a 20 20 20 20  h( eDest ){.    
65d0: 63 61 73 65 20 53 52 54 5f 54 61 62 6c 65 3a 0a  case SRT_Table:.
65e0: 20 20 20 20 63 61 73 65 20 53 52 54 5f 45 70 68      case SRT_Eph
65f0: 65 6d 54 61 62 3a 20 7b 0a 20 20 20 20 20 20 73  emTab: {.      s
6600: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
6610: 28 76 2c 20 4f 50 5f 4e 65 77 52 6f 77 69 64 2c  (v, OP_NewRowid,
6620: 20 69 50 61 72 6d 2c 20 72 65 67 52 6f 77 69 64   iParm, regRowid
6630: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
6640: 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
6650: 5f 49 6e 73 65 72 74 2c 20 69 50 61 72 6d 2c 20  _Insert, iParm, 
6660: 72 65 67 52 6f 77 2c 20 72 65 67 52 6f 77 69 64  regRow, regRowid
6670: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
6680: 56 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20  VdbeChangeP5(v, 
6690: 4f 50 46 4c 41 47 5f 41 50 50 45 4e 44 29 3b 0a  OPFLAG_APPEND);.
66a0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
66b0: 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54   }.#ifndef SQLIT
66c0: 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a  E_OMIT_SUBQUERY.
66d0: 20 20 20 20 63 61 73 65 20 53 52 54 5f 53 65 74      case SRT_Set
66e0: 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 6a 31  : {.      int j1
66f0: 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
6700: 6e 43 6f 6c 75 6d 6e 3d 3d 31 20 29 3b 0a 20 20  nColumn==1 );.  
6710: 20 20 20 20 6a 31 20 3d 20 73 71 6c 69 74 65 33      j1 = sqlite3
6720: 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50  VdbeAddOp1(v, OP
6730: 5f 49 73 4e 75 6c 6c 2c 20 72 65 67 52 6f 77 29  _IsNull, regRow)
6740: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
6750: 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f  dbeAddOp4(v, OP_
6760: 4d 61 6b 65 52 65 63 6f 72 64 2c 20 72 65 67 52  MakeRecord, regR
6770: 6f 77 2c 20 31 2c 20 72 65 67 52 6f 77 69 64 2c  ow, 1, regRowid,
6780: 20 26 70 2d 3e 61 66 66 69 6e 69 74 79 2c 20 31   &p->affinity, 1
6790: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
67a0: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
67b0: 5f 49 64 78 49 6e 73 65 72 74 2c 20 69 50 61 72  _IdxInsert, iPar
67c0: 6d 2c 20 72 65 67 52 6f 77 69 64 29 3b 0a 20 20  m, regRowid);.  
67d0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a      sqlite3VdbeJ
67e0: 75 6d 70 48 65 72 65 28 76 2c 20 6a 31 29 3b 0a  umpHere(v, j1);.
67f0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
6800: 20 7d 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f   }.    case SRT_
6810: 4d 65 6d 3a 20 7b 0a 20 20 20 20 20 20 61 73 73  Mem: {.      ass
6820: 65 72 74 28 20 6e 43 6f 6c 75 6d 6e 3d 3d 31 20  ert( nColumn==1 
6830: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
6840: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
6850: 5f 4d 6f 76 65 2c 20 72 65 67 52 6f 77 2c 20 69  _Move, regRow, i
6860: 50 61 72 6d 29 3b 0a 20 20 20 20 20 20 2f 2a 20  Parm);.      /* 
6870: 54 68 65 20 4c 49 4d 49 54 20 63 6c 61 75 73 65  The LIMIT clause
6880: 20 77 69 6c 6c 20 74 65 72 6d 69 6e 61 74 65 20   will terminate 
6890: 74 68 65 20 6c 6f 6f 70 20 66 6f 72 20 75 73 20  the loop for us 
68a0: 2a 2f 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  */.      break;.
68b0: 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20      }.#endif.   
68c0: 20 63 61 73 65 20 53 52 54 5f 43 61 6c 6c 62 61   case SRT_Callba
68d0: 63 6b 3a 0a 20 20 20 20 63 61 73 65 20 53 52 54  ck:.    case SRT
68e0: 5f 53 75 62 72 6f 75 74 69 6e 65 3a 20 7b 0a 20  _Subroutine: {. 
68f0: 20 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20       int i;.    
6900: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
6910: 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65  Op2(v, OP_Intege
6920: 72 2c 20 31 2c 20 72 65 67 52 6f 77 69 64 29 3b  r, 1, regRowid);
6930: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
6940: 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 49  beAddOp3(v, OP_I
6950: 6e 73 65 72 74 2c 20 70 73 65 75 64 6f 54 61 62  nsert, pseudoTab
6960: 2c 20 72 65 67 52 6f 77 2c 20 72 65 67 52 6f 77  , regRow, regRow
6970: 69 64 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 69  id);.      for(i
6980: 3d 30 3b 20 69 3c 6e 43 6f 6c 75 6d 6e 3b 20 69  =0; i<nColumn; i
6990: 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  ++){.        sql
69a0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
69b0: 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 70 73 65  , OP_Column, pse
69c0: 75 64 6f 54 61 62 2c 20 69 2c 20 70 44 65 73 74  udoTab, i, pDest
69d0: 2d 3e 69 4d 65 6d 2b 69 29 3b 0a 20 20 20 20 20  ->iMem+i);.     
69e0: 20 7d 0a 20 20 20 20 20 20 69 66 28 20 65 44 65   }.      if( eDe
69f0: 73 74 3d 3d 53 52 54 5f 43 61 6c 6c 62 61 63 6b  st==SRT_Callback
6a00: 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
6a10: 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
6a20: 20 4f 50 5f 52 65 73 75 6c 74 52 6f 77 2c 20 70   OP_ResultRow, p
6a30: 44 65 73 74 2d 3e 69 4d 65 6d 2c 20 6e 43 6f 6c  Dest->iMem, nCol
6a40: 75 6d 6e 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  umn);.      }els
6a50: 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  e{.        sqlit
6a60: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
6a70: 4f 50 5f 47 6f 73 75 62 2c 20 30 2c 20 69 50 61  OP_Gosub, 0, iPa
6a80: 72 6d 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  rm);.      }.   
6a90: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
6aa0: 20 20 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20      default: {. 
6ab0: 20 20 20 20 20 2f 2a 20 44 6f 20 6e 6f 74 68 69       /* Do nothi
6ac0: 6e 67 20 2a 2f 0a 20 20 20 20 20 20 62 72 65 61  ng */.      brea
6ad0: 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73  k;.    }.  }.  s
6ae0: 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d  qlite3ReleaseTem
6af0: 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 65 67  pReg(pParse, reg
6b00: 52 6f 77 29 3b 0a 20 20 73 71 6c 69 74 65 33 52  Row);.  sqlite3R
6b10: 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50  eleaseTempReg(pP
6b20: 61 72 73 65 2c 20 72 65 67 52 6f 77 69 64 29 3b  arse, regRowid);
6b30: 0a 0a 20 20 2f 2a 20 4a 75 6d 70 20 74 6f 20 74  ..  /* Jump to t
6b40: 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 6c 6f  he end of the lo
6b50: 6f 70 20 77 68 65 6e 20 74 68 65 20 4c 49 4d 49  op when the LIMI
6b60: 54 20 69 73 20 72 65 61 63 68 65 64 0a 20 20 2a  T is reached.  *
6b70: 2f 0a 20 20 69 66 28 20 70 2d 3e 69 4c 69 6d 69  /.  if( p->iLimi
6b80: 74 3e 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69  t>=0 ){.    sqli
6b90: 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
6ba0: 20 4f 50 5f 41 64 64 49 6d 6d 2c 20 70 2d 3e 69   OP_AddImm, p->i
6bb0: 4c 69 6d 69 74 2c 20 2d 31 29 3b 0a 20 20 20 20  Limit, -1);.    
6bc0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
6bd0: 32 28 76 2c 20 4f 50 5f 49 66 5a 65 72 6f 2c 20  2(v, OP_IfZero, 
6be0: 70 2d 3e 69 4c 69 6d 69 74 2c 20 62 72 6b 29 3b  p->iLimit, brk);
6bf0: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 62  .  }..  /* The b
6c00: 6f 74 74 6f 6d 20 6f 66 20 74 68 65 20 6c 6f 6f  ottom of the loo
6c10: 70 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  p.  */.  sqlite3
6c20: 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c  VdbeResolveLabel
6c30: 28 76 2c 20 63 6f 6e 74 29 3b 0a 20 20 73 71 6c  (v, cont);.  sql
6c40: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
6c50: 2c 20 4f 50 5f 4e 65 78 74 2c 20 69 54 61 62 2c  , OP_Next, iTab,
6c60: 20 61 64 64 72 29 3b 0a 20 20 73 71 6c 69 74 65   addr);.  sqlite
6c70: 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65  3VdbeResolveLabe
6c80: 6c 28 76 2c 20 62 72 6b 29 3b 0a 20 20 69 66 28  l(v, brk);.  if(
6c90: 20 65 44 65 73 74 3d 3d 53 52 54 5f 43 61 6c 6c   eDest==SRT_Call
6ca0: 62 61 63 6b 20 7c 7c 20 65 44 65 73 74 3d 3d 53  back || eDest==S
6cb0: 52 54 5f 53 75 62 72 6f 75 74 69 6e 65 20 29 7b  RT_Subroutine ){
6cc0: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
6cd0: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 43 6c 6f  AddOp2(v, OP_Clo
6ce0: 73 65 2c 20 70 73 65 75 64 6f 54 61 62 2c 20 30  se, pseudoTab, 0
6cf0: 29 3b 0a 20 20 7d 0a 0a 7d 0a 0a 2f 2a 0a 2a 2a  );.  }..}../*.**
6d00: 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65   Return a pointe
6d10: 72 20 74 6f 20 61 20 73 74 72 69 6e 67 20 63 6f  r to a string co
6d20: 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 27 64 65  ntaining the 'de
6d30: 63 6c 61 72 61 74 69 6f 6e 20 74 79 70 65 27 20  claration type' 
6d40: 6f 66 20 74 68 65 0a 2a 2a 20 65 78 70 72 65 73  of the.** expres
6d50: 73 69 6f 6e 20 70 45 78 70 72 2e 20 54 68 65 20  sion pExpr. The 
6d60: 73 74 72 69 6e 67 20 6d 61 79 20 62 65 20 74 72  string may be tr
6d70: 65 61 74 65 64 20 61 73 20 73 74 61 74 69 63 20  eated as static 
6d80: 62 79 20 74 68 65 20 63 61 6c 6c 65 72 2e 0a 2a  by the caller..*
6d90: 2a 0a 2a 2a 20 54 68 65 20 64 65 63 6c 61 72 61  *.** The declara
6da0: 74 69 6f 6e 20 74 79 70 65 20 69 73 20 74 68 65  tion type is the
6db0: 20 65 78 61 63 74 20 64 61 74 61 74 79 70 65 20   exact datatype 
6dc0: 64 65 66 69 6e 69 74 69 6f 6e 20 65 78 74 72 61  definition extra
6dd0: 63 74 65 64 20 66 72 6f 6d 20 74 68 65 0a 2a 2a  cted from the.**
6de0: 20 6f 72 69 67 69 6e 61 6c 20 43 52 45 41 54 45   original CREATE
6df0: 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74   TABLE statement
6e00: 20 69 66 20 74 68 65 20 65 78 70 72 65 73 73 69   if the expressi
6e10: 6f 6e 20 69 73 20 61 20 63 6f 6c 75 6d 6e 2e 20  on is a column. 
6e20: 54 68 65 0a 2a 2a 20 64 65 63 6c 61 72 61 74 69  The.** declarati
6e30: 6f 6e 20 74 79 70 65 20 66 6f 72 20 61 20 52 4f  on type for a RO
6e40: 57 49 44 20 66 69 65 6c 64 20 69 73 20 49 4e 54  WID field is INT
6e50: 45 47 45 52 2e 20 45 78 61 63 74 6c 79 20 77 68  EGER. Exactly wh
6e60: 65 6e 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e  en an expression
6e70: 0a 2a 2a 20 69 73 20 63 6f 6e 73 69 64 65 72 65  .** is considere
6e80: 64 20 61 20 63 6f 6c 75 6d 6e 20 63 61 6e 20 62  d a column can b
6e90: 65 20 63 6f 6d 70 6c 65 78 20 69 6e 20 74 68 65  e complex in the
6ea0: 20 70 72 65 73 65 6e 63 65 20 6f 66 20 73 75 62   presence of sub
6eb0: 71 75 65 72 69 65 73 2e 20 54 68 65 0a 2a 2a 20  queries. The.** 
6ec0: 72 65 73 75 6c 74 2d 73 65 74 20 65 78 70 72 65  result-set expre
6ed0: 73 73 69 6f 6e 20 69 6e 20 61 6c 6c 20 6f 66 20  ssion in all of 
6ee0: 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 53 45  the following SE
6ef0: 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 73 20  LECT statements 
6f00: 69 73 20 0a 2a 2a 20 63 6f 6e 73 69 64 65 72 65  is .** considere
6f10: 64 20 61 20 63 6f 6c 75 6d 6e 20 62 79 20 74 68  d a column by th
6f20: 69 73 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a  is function..**.
6f30: 2a 2a 20 20 20 53 45 4c 45 43 54 20 63 6f 6c 20  **   SELECT col 
6f40: 46 52 4f 4d 20 74 62 6c 3b 0a 2a 2a 20 20 20 53  FROM tbl;.**   S
6f50: 45 4c 45 43 54 20 28 53 45 4c 45 43 54 20 63 6f  ELECT (SELECT co
6f60: 6c 20 46 52 4f 4d 20 74 62 6c 3b 0a 2a 2a 20 20  l FROM tbl;.**  
6f70: 20 53 45 4c 45 43 54 20 28 53 45 4c 45 43 54 20   SELECT (SELECT 
6f80: 63 6f 6c 20 46 52 4f 4d 20 74 62 6c 29 3b 0a 2a  col FROM tbl);.*
6f90: 2a 20 20 20 53 45 4c 45 43 54 20 61 62 63 20 46  *   SELECT abc F
6fa0: 52 4f 4d 20 28 53 45 4c 45 43 54 20 63 6f 6c 20  ROM (SELECT col 
6fb0: 41 53 20 61 62 63 20 46 52 4f 4d 20 74 62 6c 29  AS abc FROM tbl)
6fc0: 3b 0a 2a 2a 20 0a 2a 2a 20 54 68 65 20 64 65 63  ;.** .** The dec
6fd0: 6c 61 72 61 74 69 6f 6e 20 74 79 70 65 20 66 6f  laration type fo
6fe0: 72 20 61 6e 79 20 65 78 70 72 65 73 73 69 6f 6e  r any expression
6ff0: 20 6f 74 68 65 72 20 74 68 61 6e 20 61 20 63 6f   other than a co
7000: 6c 75 6d 6e 20 69 73 20 4e 55 4c 4c 2e 0a 2a 2f  lumn is NULL..*/
7010: 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68  .static const ch
7020: 61 72 20 2a 63 6f 6c 75 6d 6e 54 79 70 65 28 0a  ar *columnType(.
7030: 20 20 4e 61 6d 65 43 6f 6e 74 65 78 74 20 2a 70    NameContext *p
7040: 4e 43 2c 20 0a 20 20 45 78 70 72 20 2a 70 45 78  NC, .  Expr *pEx
7050: 70 72 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  pr,.  const char
7060: 20 2a 2a 70 7a 4f 72 69 67 69 6e 44 62 2c 0a 20   **pzOriginDb,. 
7070: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 2a 70 7a   const char **pz
7080: 4f 72 69 67 69 6e 54 61 62 2c 0a 20 20 63 6f 6e  OriginTab,.  con
7090: 73 74 20 63 68 61 72 20 2a 2a 70 7a 4f 72 69 67  st char **pzOrig
70a0: 69 6e 43 6f 6c 0a 29 7b 0a 20 20 63 68 61 72 20  inCol.){.  char 
70b0: 63 6f 6e 73 74 20 2a 7a 54 79 70 65 20 3d 20 30  const *zType = 0
70c0: 3b 0a 20 20 63 68 61 72 20 63 6f 6e 73 74 20 2a  ;.  char const *
70d0: 7a 4f 72 69 67 69 6e 44 62 20 3d 20 30 3b 0a 20  zOriginDb = 0;. 
70e0: 20 63 68 61 72 20 63 6f 6e 73 74 20 2a 7a 4f 72   char const *zOr
70f0: 69 67 69 6e 54 61 62 20 3d 20 30 3b 0a 20 20 63  iginTab = 0;.  c
7100: 68 61 72 20 63 6f 6e 73 74 20 2a 7a 4f 72 69 67  har const *zOrig
7110: 69 6e 43 6f 6c 20 3d 20 30 3b 0a 20 20 69 6e 74  inCol = 0;.  int
7120: 20 6a 3b 0a 20 20 69 66 28 20 70 45 78 70 72 3d   j;.  if( pExpr=
7130: 3d 30 20 7c 7c 20 70 4e 43 2d 3e 70 53 72 63 4c  =0 || pNC->pSrcL
7140: 69 73 74 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  ist==0 ) return 
7150: 30 3b 0a 0a 20 20 73 77 69 74 63 68 28 20 70 45  0;..  switch( pE
7160: 78 70 72 2d 3e 6f 70 20 29 7b 0a 20 20 20 20 63  xpr->op ){.    c
7170: 61 73 65 20 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d  ase TK_AGG_COLUM
7180: 4e 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 43  N:.    case TK_C
7190: 4f 4c 55 4d 4e 3a 20 7b 0a 20 20 20 20 20 20 2f  OLUMN: {.      /
71a0: 2a 20 54 68 65 20 65 78 70 72 65 73 73 69 6f 6e  * The expression
71b0: 20 69 73 20 61 20 63 6f 6c 75 6d 6e 2e 20 4c 6f   is a column. Lo
71c0: 63 61 74 65 20 74 68 65 20 74 61 62 6c 65 20 74  cate the table t
71d0: 68 65 20 63 6f 6c 75 6d 6e 20 69 73 20 62 65 69  he column is bei
71e0: 6e 67 0a 20 20 20 20 20 20 2a 2a 20 65 78 74 72  ng.      ** extr
71f0: 61 63 74 65 64 20 66 72 6f 6d 20 69 6e 20 4e 61  acted from in Na
7200: 6d 65 43 6f 6e 74 65 78 74 2e 70 53 72 63 4c 69  meContext.pSrcLi
7210: 73 74 2e 20 54 68 69 73 20 74 61 62 6c 65 20 6d  st. This table m
7220: 61 79 20 62 65 20 72 65 61 6c 0a 20 20 20 20 20  ay be real.     
7230: 20 2a 2a 20 64 61 74 61 62 61 73 65 20 74 61 62   ** database tab
7240: 6c 65 20 6f 72 20 61 20 73 75 62 71 75 65 72 79  le or a subquery
7250: 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
7260: 20 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 30   Table *pTab = 0
7270: 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
7280: 54 61 62 6c 65 20 73 74 72 75 63 74 75 72 65 20  Table structure 
7290: 63 6f 6c 75 6d 6e 20 69 73 20 65 78 74 72 61 63  column is extrac
72a0: 74 65 64 20 66 72 6f 6d 20 2a 2f 0a 20 20 20 20  ted from */.    
72b0: 20 20 53 65 6c 65 63 74 20 2a 70 53 20 3d 20 30    Select *pS = 0
72c0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
72d0: 20 53 65 6c 65 63 74 20 74 68 65 20 63 6f 6c 75   Select the colu
72e0: 6d 6e 20 69 73 20 65 78 74 72 61 63 74 65 64 20  mn is extracted 
72f0: 66 72 6f 6d 20 2a 2f 0a 20 20 20 20 20 20 69 6e  from */.      in
7300: 74 20 69 43 6f 6c 20 3d 20 70 45 78 70 72 2d 3e  t iCol = pExpr->
7310: 69 43 6f 6c 75 6d 6e 3b 20 20 2f 2a 20 49 6e 64  iColumn;  /* Ind
7320: 65 78 20 6f 66 20 63 6f 6c 75 6d 6e 20 69 6e 20  ex of column in 
7330: 70 54 61 62 20 2a 2f 0a 20 20 20 20 20 20 77 68  pTab */.      wh
7340: 69 6c 65 28 20 70 4e 43 20 26 26 20 21 70 54 61  ile( pNC && !pTa
7350: 62 20 29 7b 0a 20 20 20 20 20 20 20 20 53 72 63  b ){.        Src
7360: 4c 69 73 74 20 2a 70 54 61 62 4c 69 73 74 20 3d  List *pTabList =
7370: 20 70 4e 43 2d 3e 70 53 72 63 4c 69 73 74 3b 0a   pNC->pSrcList;.
7380: 20 20 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b          for(j=0;
7390: 6a 3c 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63  j<pTabList->nSrc
73a0: 20 26 26 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b   && pTabList->a[
73b0: 6a 5d 2e 69 43 75 72 73 6f 72 21 3d 70 45 78 70  j].iCursor!=pExp
73c0: 72 2d 3e 69 54 61 62 6c 65 3b 6a 2b 2b 29 3b 0a  r->iTable;j++);.
73d0: 20 20 20 20 20 20 20 20 69 66 28 20 6a 3c 70 54          if( j<pT
73e0: 61 62 4c 69 73 74 2d 3e 6e 53 72 63 20 29 7b 0a  abList->nSrc ){.
73f0: 20 20 20 20 20 20 20 20 20 20 70 54 61 62 20 3d            pTab =
7400: 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 6a 5d 2e   pTabList->a[j].
7410: 70 54 61 62 3b 0a 20 20 20 20 20 20 20 20 20 20  pTab;.          
7420: 70 53 20 3d 20 70 54 61 62 4c 69 73 74 2d 3e 61  pS = pTabList->a
7430: 5b 6a 5d 2e 70 53 65 6c 65 63 74 3b 0a 20 20 20  [j].pSelect;.   
7440: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
7450: 20 20 20 20 20 20 70 4e 43 20 3d 20 70 4e 43 2d        pNC = pNC-
7460: 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 20 20  >pNext;.        
7470: 7d 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20  }.      }..     
7480: 20 69 66 28 20 70 54 61 62 3d 3d 30 20 29 7b 0a   if( pTab==0 ){.
7490: 20 20 20 20 20 20 20 20 2f 2a 20 46 49 58 20 4d          /* FIX M
74a0: 45 3a 0a 20 20 20 20 20 20 20 20 2a 2a 20 54 68  E:.        ** Th
74b0: 69 73 20 63 61 6e 20 6f 63 63 75 72 73 20 69 66  is can occurs if
74c0: 20 79 6f 75 20 68 61 76 65 20 73 6f 6d 65 74 68   you have someth
74d0: 69 6e 67 20 6c 69 6b 65 20 22 53 45 4c 45 43 54  ing like "SELECT
74e0: 20 6e 65 77 2e 78 3b 22 20 69 6e 73 69 64 65 0a   new.x;" inside.
74f0: 20 20 20 20 20 20 20 20 2a 2a 20 61 20 74 72 69          ** a tri
7500: 67 67 65 72 2e 20 20 49 6e 20 6f 74 68 65 72 20  gger.  In other 
7510: 77 6f 72 64 73 2c 20 69 66 20 79 6f 75 20 72 65  words, if you re
7520: 66 65 72 65 6e 63 65 20 74 68 65 20 73 70 65 63  ference the spec
7530: 69 61 6c 20 22 6e 65 77 22 0a 20 20 20 20 20 20  ial "new".      
7540: 20 20 2a 2a 20 74 61 62 6c 65 20 69 6e 20 74 68    ** table in th
7550: 65 20 72 65 73 75 6c 74 20 73 65 74 20 6f 66 20  e result set of 
7560: 61 20 73 65 6c 65 63 74 2e 20 20 57 65 20 64 6f  a select.  We do
7570: 20 6e 6f 74 20 68 61 76 65 20 61 20 67 6f 6f 64   not have a good
7580: 20 77 61 79 0a 20 20 20 20 20 20 20 20 2a 2a 20   way.        ** 
7590: 74 6f 20 66 69 6e 64 20 74 68 65 20 61 63 74 75  to find the actu
75a0: 61 6c 20 74 61 62 6c 65 20 74 79 70 65 2c 20 73  al table type, s
75b0: 6f 20 63 61 6c 6c 20 69 74 20 22 54 45 58 54 22  o call it "TEXT"
75c0: 2e 20 20 54 68 69 73 20 69 73 20 72 65 61 6c 6c  .  This is reall
75d0: 79 0a 20 20 20 20 20 20 20 20 2a 2a 20 73 6f 6d  y.        ** som
75e0: 65 74 68 69 6e 67 20 6f 66 20 61 20 62 75 67 2c  ething of a bug,
75f0: 20 62 75 74 20 49 20 64 6f 20 6e 6f 74 20 6b 6e   but I do not kn
7600: 6f 77 20 68 6f 77 20 74 6f 20 66 69 78 20 69 74  ow how to fix it
7610: 2e 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20  ..        **.   
7620: 20 20 20 20 20 2a 2a 20 54 68 69 73 20 63 6f 64       ** This cod
7630: 65 20 64 6f 65 73 20 6e 6f 74 20 70 72 6f 64 75  e does not produ
7640: 63 65 20 74 68 65 20 63 6f 72 72 65 63 74 20 61  ce the correct a
7650: 6e 73 77 65 72 20 2d 20 69 74 20 6a 75 73 74 20  nswer - it just 
7660: 70 72 65 76 65 6e 74 73 0a 20 20 20 20 20 20 20  prevents.       
7670: 20 2a 2a 20 61 20 73 65 67 66 61 75 6c 74 2e 20   ** a segfault. 
7680: 20 53 65 65 20 74 69 63 6b 65 74 20 23 31 32 32   See ticket #122
7690: 39 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  9..        */.  
76a0: 20 20 20 20 20 20 7a 54 79 70 65 20 3d 20 22 54        zType = "T
76b0: 45 58 54 22 3b 0a 20 20 20 20 20 20 20 20 62 72  EXT";.        br
76c0: 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20  eak;.      }..  
76d0: 20 20 20 20 61 73 73 65 72 74 28 20 70 54 61 62      assert( pTab
76e0: 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 53   );.      if( pS
76f0: 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54   ){.        /* T
7700: 68 65 20 22 74 61 62 6c 65 22 20 69 73 20 61 63  he "table" is ac
7710: 74 75 61 6c 6c 79 20 61 20 73 75 62 2d 73 65 6c  tually a sub-sel
7720: 65 63 74 20 6f 72 20 61 20 76 69 65 77 20 69 6e  ect or a view in
7730: 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65   the FROM clause
7740: 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f 66 20 74  .        ** of t
7750: 68 65 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d  he SELECT statem
7760: 65 6e 74 2e 20 52 65 74 75 72 6e 20 74 68 65 20  ent. Return the 
7770: 64 65 63 6c 61 72 61 74 69 6f 6e 20 74 79 70 65  declaration type
7780: 20 61 6e 64 20 6f 72 69 67 69 6e 0a 20 20 20 20   and origin.    
7790: 20 20 20 20 2a 2a 20 64 61 74 61 20 66 6f 72 20      ** data for 
77a0: 74 68 65 20 72 65 73 75 6c 74 2d 73 65 74 20 63  the result-set c
77b0: 6f 6c 75 6d 6e 20 6f 66 20 74 68 65 20 73 75 62  olumn of the sub
77c0: 2d 73 65 6c 65 63 74 2e 0a 20 20 20 20 20 20 20  -select..       
77d0: 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20   */.        if( 
77e0: 69 43 6f 6c 3e 3d 30 20 26 26 20 69 43 6f 6c 3c  iCol>=0 && iCol<
77f0: 70 53 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70  pS->pEList->nExp
7800: 72 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f  r ){.          /
7810: 2a 20 49 66 20 69 43 6f 6c 20 69 73 20 6c 65 73  * If iCol is les
7820: 73 20 74 68 61 6e 20 7a 65 72 6f 2c 20 74 68 65  s than zero, the
7830: 6e 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  n the expression
7840: 20 72 65 71 75 65 73 74 73 20 74 68 65 0a 20 20   requests the.  
7850: 20 20 20 20 20 20 20 20 2a 2a 20 72 6f 77 69 64          ** rowid
7860: 20 6f 66 20 74 68 65 20 73 75 62 2d 73 65 6c 65   of the sub-sele
7870: 63 74 20 6f 72 20 76 69 65 77 2e 20 54 68 69 73  ct or view. This
7880: 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 6c   expression is l
7890: 65 67 61 6c 20 28 73 65 65 20 0a 20 20 20 20 20  egal (see .     
78a0: 20 20 20 20 20 2a 2a 20 74 65 73 74 20 63 61 73       ** test cas
78b0: 65 20 6d 69 73 63 32 2e 32 2e 32 29 20 2d 20 69  e misc2.2.2) - i
78c0: 74 20 61 6c 77 61 79 73 20 65 76 61 6c 75 61 74  t always evaluat
78d0: 65 73 20 74 6f 20 4e 55 4c 4c 2e 0a 20 20 20 20  es to NULL..    
78e0: 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
78f0: 20 20 20 4e 61 6d 65 43 6f 6e 74 65 78 74 20 73     NameContext s
7900: 4e 43 3b 0a 20 20 20 20 20 20 20 20 20 20 45 78  NC;.          Ex
7910: 70 72 20 2a 70 20 3d 20 70 53 2d 3e 70 45 4c 69  pr *p = pS->pELi
7920: 73 74 2d 3e 61 5b 69 43 6f 6c 5d 2e 70 45 78 70  st->a[iCol].pExp
7930: 72 3b 0a 20 20 20 20 20 20 20 20 20 20 73 4e 43  r;.          sNC
7940: 2e 70 53 72 63 4c 69 73 74 20 3d 20 70 53 2d 3e  .pSrcList = pS->
7950: 70 53 72 63 3b 0a 20 20 20 20 20 20 20 20 20 20  pSrc;.          
7960: 73 4e 43 2e 70 4e 65 78 74 20 3d 20 30 3b 0a 20  sNC.pNext = 0;. 
7970: 20 20 20 20 20 20 20 20 20 73 4e 43 2e 70 50 61           sNC.pPa
7980: 72 73 65 20 3d 20 70 4e 43 2d 3e 70 50 61 72 73  rse = pNC->pPars
7990: 65 3b 0a 20 20 20 20 20 20 20 20 20 20 7a 54 79  e;.          zTy
79a0: 70 65 20 3d 20 63 6f 6c 75 6d 6e 54 79 70 65 28  pe = columnType(
79b0: 26 73 4e 43 2c 20 70 2c 20 26 7a 4f 72 69 67 69  &sNC, p, &zOrigi
79c0: 6e 44 62 2c 20 26 7a 4f 72 69 67 69 6e 54 61 62  nDb, &zOriginTab
79d0: 2c 20 26 7a 4f 72 69 67 69 6e 43 6f 6c 29 3b 20  , &zOriginCol); 
79e0: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
79f0: 20 7d 65 6c 73 65 20 69 66 28 20 70 54 61 62 2d   }else if( pTab-
7a00: 3e 70 53 63 68 65 6d 61 20 29 7b 0a 20 20 20 20  >pSchema ){.    
7a10: 20 20 20 20 2f 2a 20 41 20 72 65 61 6c 20 74 61      /* A real ta
7a20: 62 6c 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 61  ble */.        a
7a30: 73 73 65 72 74 28 20 21 70 53 20 29 3b 0a 20 20  ssert( !pS );.  
7a40: 20 20 20 20 20 20 69 66 28 20 69 43 6f 6c 3c 30        if( iCol<0
7a50: 20 29 20 69 43 6f 6c 20 3d 20 70 54 61 62 2d 3e   ) iCol = pTab->
7a60: 69 50 4b 65 79 3b 0a 20 20 20 20 20 20 20 20 61  iPKey;.        a
7a70: 73 73 65 72 74 28 20 69 43 6f 6c 3d 3d 2d 31 20  ssert( iCol==-1 
7a80: 7c 7c 20 28 69 43 6f 6c 3e 3d 30 20 26 26 20 69  || (iCol>=0 && i
7a90: 43 6f 6c 3c 70 54 61 62 2d 3e 6e 43 6f 6c 29 20  Col<pTab->nCol) 
7aa0: 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 69  );.        if( i
7ab0: 43 6f 6c 3c 30 20 29 7b 0a 20 20 20 20 20 20 20  Col<0 ){.       
7ac0: 20 20 20 7a 54 79 70 65 20 3d 20 22 49 4e 54 45     zType = "INTE
7ad0: 47 45 52 22 3b 0a 20 20 20 20 20 20 20 20 20 20  GER";.          
7ae0: 7a 4f 72 69 67 69 6e 43 6f 6c 20 3d 20 22 72 6f  zOriginCol = "ro
7af0: 77 69 64 22 3b 0a 20 20 20 20 20 20 20 20 7d 65  wid";.        }e
7b00: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 7a  lse{.          z
7b10: 54 79 70 65 20 3d 20 70 54 61 62 2d 3e 61 43 6f  Type = pTab->aCo
7b20: 6c 5b 69 43 6f 6c 5d 2e 7a 54 79 70 65 3b 0a 20  l[iCol].zType;. 
7b30: 20 20 20 20 20 20 20 20 20 7a 4f 72 69 67 69 6e           zOrigin
7b40: 43 6f 6c 20 3d 20 70 54 61 62 2d 3e 61 43 6f 6c  Col = pTab->aCol
7b50: 5b 69 43 6f 6c 5d 2e 7a 4e 61 6d 65 3b 0a 20 20  [iCol].zName;.  
7b60: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
7b70: 7a 4f 72 69 67 69 6e 54 61 62 20 3d 20 70 54 61  zOriginTab = pTa
7b80: 62 2d 3e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20  b->zName;.      
7b90: 20 20 69 66 28 20 70 4e 43 2d 3e 70 50 61 72 73    if( pNC->pPars
7ba0: 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69  e ){.          i
7bb0: 6e 74 20 69 44 62 20 3d 20 73 71 6c 69 74 65 33  nt iDb = sqlite3
7bc0: 53 63 68 65 6d 61 54 6f 49 6e 64 65 78 28 70 4e  SchemaToIndex(pN
7bd0: 43 2d 3e 70 50 61 72 73 65 2d 3e 64 62 2c 20 70  C->pParse->db, p
7be0: 54 61 62 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20  Tab->pSchema);. 
7bf0: 20 20 20 20 20 20 20 20 20 7a 4f 72 69 67 69 6e           zOrigin
7c00: 44 62 20 3d 20 70 4e 43 2d 3e 70 50 61 72 73 65  Db = pNC->pParse
7c10: 2d 3e 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a  ->db->aDb[iDb].z
7c20: 4e 61 6d 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a  Name;.        }.
7c30: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72        }.      br
7c40: 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 69 66 6e 64  eak;.    }.#ifnd
7c50: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53  ef SQLITE_OMIT_S
7c60: 55 42 51 55 45 52 59 0a 20 20 20 20 63 61 73 65  UBQUERY.    case
7c70: 20 54 4b 5f 53 45 4c 45 43 54 3a 20 7b 0a 20 20   TK_SELECT: {.  
7c80: 20 20 20 20 2f 2a 20 54 68 65 20 65 78 70 72 65      /* The expre
7c90: 73 73 69 6f 6e 20 69 73 20 61 20 73 75 62 2d 73  ssion is a sub-s
7ca0: 65 6c 65 63 74 2e 20 52 65 74 75 72 6e 20 74 68  elect. Return th
7cb0: 65 20 64 65 63 6c 61 72 61 74 69 6f 6e 20 74 79  e declaration ty
7cc0: 70 65 20 61 6e 64 0a 20 20 20 20 20 20 2a 2a 20  pe and.      ** 
7cd0: 6f 72 69 67 69 6e 20 69 6e 66 6f 20 66 6f 72 20  origin info for 
7ce0: 74 68 65 20 73 69 6e 67 6c 65 20 63 6f 6c 75 6d  the single colum
7cf0: 6e 20 69 6e 20 74 68 65 20 72 65 73 75 6c 74 20  n in the result 
7d00: 73 65 74 20 6f 66 20 74 68 65 20 53 45 4c 45 43  set of the SELEC
7d10: 54 0a 20 20 20 20 20 20 2a 2a 20 73 74 61 74 65  T.      ** state
7d20: 6d 65 6e 74 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  ment..      */. 
7d30: 20 20 20 20 20 4e 61 6d 65 43 6f 6e 74 65 78 74       NameContext
7d40: 20 73 4e 43 3b 0a 20 20 20 20 20 20 53 65 6c 65   sNC;.      Sele
7d50: 63 74 20 2a 70 53 20 3d 20 70 45 78 70 72 2d 3e  ct *pS = pExpr->
7d60: 70 53 65 6c 65 63 74 3b 0a 20 20 20 20 20 20 45  pSelect;.      E
7d70: 78 70 72 20 2a 70 20 3d 20 70 53 2d 3e 70 45 4c  xpr *p = pS->pEL
7d80: 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 3b  ist->a[0].pExpr;
7d90: 0a 20 20 20 20 20 20 73 4e 43 2e 70 53 72 63 4c  .      sNC.pSrcL
7da0: 69 73 74 20 3d 20 70 53 2d 3e 70 53 72 63 3b 0a  ist = pS->pSrc;.
7db0: 20 20 20 20 20 20 73 4e 43 2e 70 4e 65 78 74 20        sNC.pNext 
7dc0: 3d 20 70 4e 43 3b 0a 20 20 20 20 20 20 73 4e 43  = pNC;.      sNC
7dd0: 2e 70 50 61 72 73 65 20 3d 20 70 4e 43 2d 3e 70  .pParse = pNC->p
7de0: 50 61 72 73 65 3b 0a 20 20 20 20 20 20 7a 54 79  Parse;.      zTy
7df0: 70 65 20 3d 20 63 6f 6c 75 6d 6e 54 79 70 65 28  pe = columnType(
7e00: 26 73 4e 43 2c 20 70 2c 20 26 7a 4f 72 69 67 69  &sNC, p, &zOrigi
7e10: 6e 44 62 2c 20 26 7a 4f 72 69 67 69 6e 54 61 62  nDb, &zOriginTab
7e20: 2c 20 26 7a 4f 72 69 67 69 6e 43 6f 6c 29 3b 20  , &zOriginCol); 
7e30: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
7e40: 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 20    }.#endif.  }. 
7e50: 20 0a 20 20 69 66 28 20 70 7a 4f 72 69 67 69 6e   .  if( pzOrigin
7e60: 44 62 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  Db ){.    assert
7e70: 28 20 70 7a 4f 72 69 67 69 6e 54 61 62 20 26 26  ( pzOriginTab &&
7e80: 20 70 7a 4f 72 69 67 69 6e 43 6f 6c 20 29 3b 0a   pzOriginCol );.
7e90: 20 20 20 20 2a 70 7a 4f 72 69 67 69 6e 44 62 20      *pzOriginDb 
7ea0: 3d 20 7a 4f 72 69 67 69 6e 44 62 3b 0a 20 20 20  = zOriginDb;.   
7eb0: 20 2a 70 7a 4f 72 69 67 69 6e 54 61 62 20 3d 20   *pzOriginTab = 
7ec0: 7a 4f 72 69 67 69 6e 54 61 62 3b 0a 20 20 20 20  zOriginTab;.    
7ed0: 2a 70 7a 4f 72 69 67 69 6e 43 6f 6c 20 3d 20 7a  *pzOriginCol = z
7ee0: 4f 72 69 67 69 6e 43 6f 6c 3b 0a 20 20 7d 0a 20  OriginCol;.  }. 
7ef0: 20 72 65 74 75 72 6e 20 7a 54 79 70 65 3b 0a 7d   return zType;.}
7f00: 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65  ../*.** Generate
7f10: 20 63 6f 64 65 20 74 68 61 74 20 77 69 6c 6c 20   code that will 
7f20: 74 65 6c 6c 20 74 68 65 20 56 44 42 45 20 74 68  tell the VDBE th
7f30: 65 20 64 65 63 6c 61 72 61 74 69 6f 6e 20 74 79  e declaration ty
7f40: 70 65 73 20 6f 66 20 63 6f 6c 75 6d 6e 73 0a 2a  pes of columns.*
7f50: 2a 20 69 6e 20 74 68 65 20 72 65 73 75 6c 74 20  * in the result 
7f60: 73 65 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  set..*/.static v
7f70: 6f 69 64 20 67 65 6e 65 72 61 74 65 43 6f 6c 75  oid generateColu
7f80: 6d 6e 54 79 70 65 73 28 0a 20 20 50 61 72 73 65  mnTypes(.  Parse
7f90: 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 2f   *pParse,      /
7fa0: 2a 20 50 61 72 73 65 72 20 63 6f 6e 74 65 78 74  * Parser context
7fb0: 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a 70   */.  SrcList *p
7fc0: 54 61 62 4c 69 73 74 2c 20 20 2f 2a 20 4c 69 73  TabList,  /* Lis
7fd0: 74 20 6f 66 20 74 61 62 6c 65 73 20 2a 2f 0a 20  t of tables */. 
7fe0: 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73   ExprList *pELis
7ff0: 74 20 20 20 20 2f 2a 20 45 78 70 72 65 73 73 69  t    /* Expressi
8000: 6f 6e 73 20 64 65 66 69 6e 69 6e 67 20 74 68 65  ons defining the
8010: 20 72 65 73 75 6c 74 20 73 65 74 20 2a 2f 0a 29   result set */.)
8020: 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50  {.  Vdbe *v = pP
8030: 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69  arse->pVdbe;.  i
8040: 6e 74 20 69 3b 0a 20 20 4e 61 6d 65 43 6f 6e 74  nt i;.  NameCont
8050: 65 78 74 20 73 4e 43 3b 0a 20 20 73 4e 43 2e 70  ext sNC;.  sNC.p
8060: 53 72 63 4c 69 73 74 20 3d 20 70 54 61 62 4c 69  SrcList = pTabLi
8070: 73 74 3b 0a 20 20 73 4e 43 2e 70 50 61 72 73 65  st;.  sNC.pParse
8080: 20 3d 20 70 50 61 72 73 65 3b 0a 20 20 66 6f 72   = pParse;.  for
8090: 28 69 3d 30 3b 20 69 3c 70 45 4c 69 73 74 2d 3e  (i=0; i<pEList->
80a0: 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20  nExpr; i++){.   
80b0: 20 45 78 70 72 20 2a 70 20 3d 20 70 45 4c 69 73   Expr *p = pELis
80c0: 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 20  t->a[i].pExpr;. 
80d0: 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
80e0: 4f 72 69 67 44 62 20 3d 20 30 3b 0a 20 20 20 20  OrigDb = 0;.    
80f0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4f 72 69  const char *zOri
8100: 67 54 61 62 20 3d 20 30 3b 0a 20 20 20 20 63 6f  gTab = 0;.    co
8110: 6e 73 74 20 63 68 61 72 20 2a 7a 4f 72 69 67 43  nst char *zOrigC
8120: 6f 6c 20 3d 20 30 3b 0a 20 20 20 20 63 6f 6e 73  ol = 0;.    cons
8130: 74 20 63 68 61 72 20 2a 7a 54 79 70 65 20 3d 20  t char *zType = 
8140: 63 6f 6c 75 6d 6e 54 79 70 65 28 26 73 4e 43 2c  columnType(&sNC,
8150: 20 70 2c 20 26 7a 4f 72 69 67 44 62 2c 20 26 7a   p, &zOrigDb, &z
8160: 4f 72 69 67 54 61 62 2c 20 26 7a 4f 72 69 67 43  OrigTab, &zOrigC
8170: 6f 6c 29 3b 0a 0a 20 20 20 20 2f 2a 20 54 68 65  ol);..    /* The
8180: 20 76 64 62 65 20 6d 75 73 74 20 6d 61 6b 65 20   vdbe must make 
8190: 69 74 73 20 6f 77 6e 20 63 6f 70 79 20 6f 66 20  its own copy of 
81a0: 74 68 65 20 63 6f 6c 75 6d 6e 2d 74 79 70 65 20  the column-type 
81b0: 61 6e 64 20 6f 74 68 65 72 20 0a 20 20 20 20 2a  and other .    *
81c0: 2a 20 63 6f 6c 75 6d 6e 20 73 70 65 63 69 66 69  * column specifi
81d0: 63 20 73 74 72 69 6e 67 73 2c 20 69 6e 20 63 61  c strings, in ca
81e0: 73 65 20 74 68 65 20 73 63 68 65 6d 61 20 69 73  se the schema is
81f0: 20 72 65 73 65 74 20 62 65 66 6f 72 65 20 74 68   reset before th
8200: 69 73 0a 20 20 20 20 2a 2a 20 76 69 72 74 75 61  is.    ** virtua
8210: 6c 20 6d 61 63 68 69 6e 65 20 69 73 20 64 65 6c  l machine is del
8220: 65 74 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  eted..    */.   
8230: 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 74 43   sqlite3VdbeSetC
8240: 6f 6c 4e 61 6d 65 28 76 2c 20 69 2c 20 43 4f 4c  olName(v, i, COL
8250: 4e 41 4d 45 5f 44 45 43 4c 54 59 50 45 2c 20 7a  NAME_DECLTYPE, z
8260: 54 79 70 65 2c 20 50 34 5f 54 52 41 4e 53 49 45  Type, P4_TRANSIE
8270: 4e 54 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  NT);.    sqlite3
8280: 56 64 62 65 53 65 74 43 6f 6c 4e 61 6d 65 28 76  VdbeSetColName(v
8290: 2c 20 69 2c 20 43 4f 4c 4e 41 4d 45 5f 44 41 54  , i, COLNAME_DAT
82a0: 41 42 41 53 45 2c 20 7a 4f 72 69 67 44 62 2c 20  ABASE, zOrigDb, 
82b0: 50 34 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a 20  P4_TRANSIENT);. 
82c0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 53 65     sqlite3VdbeSe
82d0: 74 43 6f 6c 4e 61 6d 65 28 76 2c 20 69 2c 20 43  tColName(v, i, C
82e0: 4f 4c 4e 41 4d 45 5f 54 41 42 4c 45 2c 20 7a 4f  OLNAME_TABLE, zO
82f0: 72 69 67 54 61 62 2c 20 50 34 5f 54 52 41 4e 53  rigTab, P4_TRANS
8300: 49 45 4e 54 29 3b 0a 20 20 20 20 73 71 6c 69 74  IENT);.    sqlit
8310: 65 33 56 64 62 65 53 65 74 43 6f 6c 4e 61 6d 65  e3VdbeSetColName
8320: 28 76 2c 20 69 2c 20 43 4f 4c 4e 41 4d 45 5f 43  (v, i, COLNAME_C
8330: 4f 4c 55 4d 4e 2c 20 7a 4f 72 69 67 43 6f 6c 2c  OLUMN, zOrigCol,
8340: 20 50 34 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a   P4_TRANSIENT);.
8350: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e    }.}../*.** Gen
8360: 65 72 61 74 65 20 63 6f 64 65 20 74 68 61 74 20  erate code that 
8370: 77 69 6c 6c 20 74 65 6c 6c 20 74 68 65 20 56 44  will tell the VD
8380: 42 45 20 74 68 65 20 6e 61 6d 65 73 20 6f 66 20  BE the names of 
8390: 63 6f 6c 75 6d 6e 73 0a 2a 2a 20 69 6e 20 74 68  columns.** in th
83a0: 65 20 72 65 73 75 6c 74 20 73 65 74 2e 20 20 54  e result set.  T
83b0: 68 69 73 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  his information 
83c0: 69 73 20 75 73 65 64 20 74 6f 20 70 72 6f 76 69  is used to provi
83d0: 64 65 20 74 68 65 0a 2a 2a 20 61 7a 43 6f 6c 5b  de the.** azCol[
83e0: 5d 20 76 61 6c 75 65 73 20 69 6e 20 74 68 65 20  ] values in the 
83f0: 63 61 6c 6c 62 61 63 6b 2e 0a 2a 2f 0a 73 74 61  callback..*/.sta
8400: 74 69 63 20 76 6f 69 64 20 67 65 6e 65 72 61 74  tic void generat
8410: 65 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 0a 20 20  eColumnNames(.  
8420: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
8430: 20 20 20 20 2f 2a 20 50 61 72 73 65 72 20 63 6f      /* Parser co
8440: 6e 74 65 78 74 20 2a 2f 0a 20 20 53 72 63 4c 69  ntext */.  SrcLi
8450: 73 74 20 2a 70 54 61 62 4c 69 73 74 2c 20 20 2f  st *pTabList,  /
8460: 2a 20 4c 69 73 74 20 6f 66 20 74 61 62 6c 65 73  * List of tables
8470: 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a   */.  ExprList *
8480: 70 45 4c 69 73 74 20 20 20 20 2f 2a 20 45 78 70  pEList    /* Exp
8490: 72 65 73 73 69 6f 6e 73 20 64 65 66 69 6e 69 6e  ressions definin
84a0: 67 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74  g the result set
84b0: 20 2a 2f 0a 29 7b 0a 20 20 56 64 62 65 20 2a 76   */.){.  Vdbe *v
84c0: 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65   = pParse->pVdbe
84d0: 3b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20  ;.  int i, j;.  
84e0: 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50  sqlite3 *db = pP
84f0: 61 72 73 65 2d 3e 64 62 3b 0a 20 20 69 6e 74 20  arse->db;.  int 
8500: 66 75 6c 6c 4e 61 6d 65 73 2c 20 73 68 6f 72 74  fullNames, short
8510: 4e 61 6d 65 73 3b 0a 0a 23 69 66 6e 64 65 66 20  Names;..#ifndef 
8520: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 45 58 50 4c  SQLITE_OMIT_EXPL
8530: 41 49 4e 0a 20 20 2f 2a 20 49 66 20 74 68 69 73  AIN.  /* If this
8540: 20 69 73 20 61 6e 20 45 58 50 4c 41 49 4e 2c 20   is an EXPLAIN, 
8550: 73 6b 69 70 20 74 68 69 73 20 73 74 65 70 20 2a  skip this step *
8560: 2f 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e  /.  if( pParse->
8570: 65 78 70 6c 61 69 6e 20 29 7b 0a 20 20 20 20 72  explain ){.    r
8580: 65 74 75 72 6e 3b 0a 20 20 7d 0a 23 65 6e 64 69  eturn;.  }.#endi
8590: 66 0a 0a 20 20 61 73 73 65 72 74 28 20 76 21 3d  f..  assert( v!=
85a0: 30 20 29 3b 0a 20 20 69 66 28 20 70 50 61 72 73  0 );.  if( pPars
85b0: 65 2d 3e 63 6f 6c 4e 61 6d 65 73 53 65 74 20 7c  e->colNamesSet |
85c0: 7c 20 76 3d 3d 30 20 7c 7c 20 64 62 2d 3e 6d 61  | v==0 || db->ma
85d0: 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20 72 65 74  llocFailed ) ret
85e0: 75 72 6e 3b 0a 20 20 70 50 61 72 73 65 2d 3e 63  urn;.  pParse->c
85f0: 6f 6c 4e 61 6d 65 73 53 65 74 20 3d 20 31 3b 0a  olNamesSet = 1;.
8600: 20 20 66 75 6c 6c 4e 61 6d 65 73 20 3d 20 28 64    fullNames = (d
8610: 62 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49 54  b->flags & SQLIT
8620: 45 5f 46 75 6c 6c 43 6f 6c 4e 61 6d 65 73 29 21  E_FullColNames)!
8630: 3d 30 3b 0a 20 20 73 68 6f 72 74 4e 61 6d 65 73  =0;.  shortNames
8640: 20 3d 20 28 64 62 2d 3e 66 6c 61 67 73 20 26 20   = (db->flags & 
8650: 53 51 4c 49 54 45 5f 53 68 6f 72 74 43 6f 6c 4e  SQLITE_ShortColN
8660: 61 6d 65 73 29 21 3d 30 3b 0a 20 20 73 71 6c 69  ames)!=0;.  sqli
8670: 74 65 33 56 64 62 65 53 65 74 4e 75 6d 43 6f 6c  te3VdbeSetNumCol
8680: 73 28 76 2c 20 70 45 4c 69 73 74 2d 3e 6e 45 78  s(v, pEList->nEx
8690: 70 72 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  pr);.  for(i=0; 
86a0: 69 3c 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b  i<pEList->nExpr;
86b0: 20 69 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72 20   i++){.    Expr 
86c0: 2a 70 3b 0a 20 20 20 20 70 20 3d 20 70 45 4c 69  *p;.    p = pELi
86d0: 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 3b 0a  st->a[i].pExpr;.
86e0: 20 20 20 20 69 66 28 20 70 3d 3d 30 20 29 20 63      if( p==0 ) c
86f0: 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69 66 28  ontinue;.    if(
8700: 20 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e   pEList->a[i].zN
8710: 61 6d 65 20 29 7b 0a 20 20 20 20 20 20 63 68 61  ame ){.      cha
8720: 72 20 2a 7a 4e 61 6d 65 20 3d 20 70 45 4c 69 73  r *zName = pELis
8730: 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 3b 0a 20  t->a[i].zName;. 
8740: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
8750: 53 65 74 43 6f 6c 4e 61 6d 65 28 76 2c 20 69 2c  SetColName(v, i,
8760: 20 43 4f 4c 4e 41 4d 45 5f 4e 41 4d 45 2c 20 7a   COLNAME_NAME, z
8770: 4e 61 6d 65 2c 20 73 74 72 6c 65 6e 28 7a 4e 61  Name, strlen(zNa
8780: 6d 65 29 29 3b 0a 20 20 20 20 20 20 63 6f 6e 74  me));.      cont
8790: 69 6e 75 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20  inue;.    }.    
87a0: 69 66 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f  if( p->op==TK_CO
87b0: 4c 55 4d 4e 20 26 26 20 70 54 61 62 4c 69 73 74  LUMN && pTabList
87c0: 20 29 7b 0a 20 20 20 20 20 20 54 61 62 6c 65 20   ){.      Table 
87d0: 2a 70 54 61 62 3b 0a 20 20 20 20 20 20 63 68 61  *pTab;.      cha
87e0: 72 20 2a 7a 43 6f 6c 3b 0a 20 20 20 20 20 20 69  r *zCol;.      i
87f0: 6e 74 20 69 43 6f 6c 20 3d 20 70 2d 3e 69 43 6f  nt iCol = p->iCo
8800: 6c 75 6d 6e 3b 0a 20 20 20 20 20 20 66 6f 72 28  lumn;.      for(
8810: 6a 3d 30 3b 20 6a 3c 70 54 61 62 4c 69 73 74 2d  j=0; j<pTabList-
8820: 3e 6e 53 72 63 20 26 26 20 70 54 61 62 4c 69 73  >nSrc && pTabLis
8830: 74 2d 3e 61 5b 6a 5d 2e 69 43 75 72 73 6f 72 21  t->a[j].iCursor!
8840: 3d 70 2d 3e 69 54 61 62 6c 65 3b 20 6a 2b 2b 29  =p->iTable; j++)
8850: 7b 7d 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  {}.      assert(
8860: 20 6a 3c 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72   j<pTabList->nSr
8870: 63 20 29 3b 0a 20 20 20 20 20 20 70 54 61 62 20  c );.      pTab 
8880: 3d 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 6a 5d  = pTabList->a[j]
8890: 2e 70 54 61 62 3b 0a 20 20 20 20 20 20 69 66 28  .pTab;.      if(
88a0: 20 69 43 6f 6c 3c 30 20 29 20 69 43 6f 6c 20 3d   iCol<0 ) iCol =
88b0: 20 70 54 61 62 2d 3e 69 50 4b 65 79 3b 0a 20 20   pTab->iPKey;.  
88c0: 20 20 20 20 61 73 73 65 72 74 28 20 69 43 6f 6c      assert( iCol
88d0: 3d 3d 2d 31 20 7c 7c 20 28 69 43 6f 6c 3e 3d 30  ==-1 || (iCol>=0
88e0: 20 26 26 20 69 43 6f 6c 3c 70 54 61 62 2d 3e 6e   && iCol<pTab->n
88f0: 43 6f 6c 29 20 29 3b 0a 20 20 20 20 20 20 69 66  Col) );.      if
8900: 28 20 69 43 6f 6c 3c 30 20 29 7b 0a 20 20 20 20  ( iCol<0 ){.    
8910: 20 20 20 20 7a 43 6f 6c 20 3d 20 22 72 6f 77 69      zCol = "rowi
8920: 64 22 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  d";.      }else{
8930: 0a 20 20 20 20 20 20 20 20 7a 43 6f 6c 20 3d 20  .        zCol = 
8940: 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d  pTab->aCol[iCol]
8950: 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20 7d 0a  .zName;.      }.
8960: 20 20 20 20 20 20 69 66 28 20 21 73 68 6f 72 74        if( !short
8970: 4e 61 6d 65 73 20 26 26 20 21 66 75 6c 6c 4e 61  Names && !fullNa
8980: 6d 65 73 20 26 26 20 70 2d 3e 73 70 61 6e 2e 7a  mes && p->span.z
8990: 20 26 26 20 70 2d 3e 73 70 61 6e 2e 7a 5b 30 5d   && p->span.z[0]
89a0: 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
89b0: 74 65 33 56 64 62 65 53 65 74 43 6f 6c 4e 61 6d  te3VdbeSetColNam
89c0: 65 28 76 2c 20 69 2c 20 43 4f 4c 4e 41 4d 45 5f  e(v, i, COLNAME_
89d0: 4e 41 4d 45 2c 20 28 63 68 61 72 2a 29 70 2d 3e  NAME, (char*)p->
89e0: 73 70 61 6e 2e 7a 2c 20 70 2d 3e 73 70 61 6e 2e  span.z, p->span.
89f0: 6e 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20  n);.      }else 
8a00: 69 66 28 20 66 75 6c 6c 4e 61 6d 65 73 20 7c 7c  if( fullNames ||
8a10: 20 28 21 73 68 6f 72 74 4e 61 6d 65 73 20 26 26   (!shortNames &&
8a20: 20 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3e   pTabList->nSrc>
8a30: 31 29 20 29 7b 0a 20 20 20 20 20 20 20 20 63 68  1) ){.        ch
8a40: 61 72 20 2a 7a 4e 61 6d 65 20 3d 20 30 3b 0a 20  ar *zName = 0;. 
8a50: 20 20 20 20 20 20 20 63 68 61 72 20 2a 7a 54 61         char *zTa
8a60: 62 3b 0a 20 0a 20 20 20 20 20 20 20 20 7a 54 61  b;. .        zTa
8a70: 62 20 3d 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b  b = pTabList->a[
8a80: 6a 5d 2e 7a 41 6c 69 61 73 3b 0a 20 20 20 20 20  j].zAlias;.     
8a90: 20 20 20 69 66 28 20 66 75 6c 6c 4e 61 6d 65 73     if( fullNames
8aa0: 20 7c 7c 20 7a 54 61 62 3d 3d 30 20 29 20 7a 54   || zTab==0 ) zT
8ab0: 61 62 20 3d 20 70 54 61 62 2d 3e 7a 4e 61 6d 65  ab = pTab->zName
8ac0: 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
8ad0: 33 53 65 74 53 74 72 69 6e 67 28 26 7a 4e 61 6d  3SetString(&zNam
8ae0: 65 2c 20 7a 54 61 62 2c 20 22 2e 22 2c 20 7a 43  e, zTab, ".", zC
8af0: 6f 6c 2c 20 28 63 68 61 72 2a 29 30 29 3b 0a 20  ol, (char*)0);. 
8b00: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
8b10: 62 65 53 65 74 43 6f 6c 4e 61 6d 65 28 76 2c 20  beSetColName(v, 
8b20: 69 2c 20 43 4f 4c 4e 41 4d 45 5f 4e 41 4d 45 2c  i, COLNAME_NAME,
8b30: 20 7a 4e 61 6d 65 2c 20 50 34 5f 44 59 4e 41 4d   zName, P4_DYNAM
8b40: 49 43 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  IC);.      }else
8b50: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
8b60: 33 56 64 62 65 53 65 74 43 6f 6c 4e 61 6d 65 28  3VdbeSetColName(
8b70: 76 2c 20 69 2c 20 43 4f 4c 4e 41 4d 45 5f 4e 41  v, i, COLNAME_NA
8b80: 4d 45 2c 20 7a 43 6f 6c 2c 20 73 74 72 6c 65 6e  ME, zCol, strlen
8b90: 28 7a 43 6f 6c 29 29 3b 0a 20 20 20 20 20 20 7d  (zCol));.      }
8ba0: 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70  .    }else if( p
8bb0: 2d 3e 73 70 61 6e 2e 7a 20 26 26 20 70 2d 3e 73  ->span.z && p->s
8bc0: 70 61 6e 2e 7a 5b 30 5d 20 29 7b 0a 20 20 20 20  pan.z[0] ){.    
8bd0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 74    sqlite3VdbeSet
8be0: 43 6f 6c 4e 61 6d 65 28 76 2c 20 69 2c 20 43 4f  ColName(v, i, CO
8bf0: 4c 4e 41 4d 45 5f 4e 41 4d 45 2c 20 28 63 68 61  LNAME_NAME, (cha
8c00: 72 2a 29 70 2d 3e 73 70 61 6e 2e 7a 2c 20 70 2d  r*)p->span.z, p-
8c10: 3e 73 70 61 6e 2e 6e 29 3b 0a 20 20 20 20 20 20  >span.n);.      
8c20: 2f 2a 20 73 71 6c 69 74 65 33 56 64 62 65 43 6f  /* sqlite3VdbeCo
8c30: 6d 70 72 65 73 73 53 70 61 63 65 28 76 2c 20 61  mpressSpace(v, a
8c40: 64 64 72 29 3b 20 2a 2f 0a 20 20 20 20 7d 65 6c  ddr); */.    }el
8c50: 73 65 7b 0a 20 20 20 20 20 20 63 68 61 72 20 7a  se{.      char z
8c60: 4e 61 6d 65 5b 33 30 5d 3b 0a 20 20 20 20 20 20  Name[30];.      
8c70: 61 73 73 65 72 74 28 20 70 2d 3e 6f 70 21 3d 54  assert( p->op!=T
8c80: 4b 5f 43 4f 4c 55 4d 4e 20 7c 7c 20 70 54 61 62  K_COLUMN || pTab
8c90: 4c 69 73 74 3d 3d 30 20 29 3b 0a 20 20 20 20 20  List==0 );.     
8ca0: 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74   sqlite3_snprint
8cb0: 66 28 73 69 7a 65 6f 66 28 7a 4e 61 6d 65 29 2c  f(sizeof(zName),
8cc0: 20 7a 4e 61 6d 65 2c 20 22 63 6f 6c 75 6d 6e 25   zName, "column%
8cd0: 64 22 2c 20 69 2b 31 29 3b 0a 20 20 20 20 20 20  d", i+1);.      
8ce0: 73 71 6c 69 74 65 33 56 64 62 65 53 65 74 43 6f  sqlite3VdbeSetCo
8cf0: 6c 4e 61 6d 65 28 76 2c 20 69 2c 20 43 4f 4c 4e  lName(v, i, COLN
8d00: 41 4d 45 5f 4e 41 4d 45 2c 20 7a 4e 61 6d 65 2c  AME_NAME, zName,
8d10: 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20   0);.    }.  }. 
8d20: 20 67 65 6e 65 72 61 74 65 43 6f 6c 75 6d 6e 54   generateColumnT
8d30: 79 70 65 73 28 70 50 61 72 73 65 2c 20 70 54 61  ypes(pParse, pTa
8d40: 62 4c 69 73 74 2c 20 70 45 4c 69 73 74 29 3b 0a  bList, pEList);.
8d50: 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  }..#ifndef SQLIT
8d60: 45 5f 4f 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f  E_OMIT_COMPOUND_
8d70: 53 45 4c 45 43 54 0a 2f 2a 0a 2a 2a 20 4e 61 6d  SELECT./*.** Nam
8d80: 65 20 6f 66 20 74 68 65 20 63 6f 6e 6e 65 63 74  e of the connect
8d90: 69 6f 6e 20 6f 70 65 72 61 74 6f 72 2c 20 75 73  ion operator, us
8da0: 65 64 20 66 6f 72 20 65 72 72 6f 72 20 6d 65 73  ed for error mes
8db0: 73 61 67 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63  sages..*/.static
8dc0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 73 65 6c   const char *sel
8dd0: 65 63 74 4f 70 4e 61 6d 65 28 69 6e 74 20 69 64  ectOpName(int id
8de0: 29 7b 0a 20 20 63 68 61 72 20 2a 7a 3b 0a 20 20  ){.  char *z;.  
8df0: 73 77 69 74 63 68 28 20 69 64 20 29 7b 0a 20 20  switch( id ){.  
8e00: 20 20 63 61 73 65 20 54 4b 5f 41 4c 4c 3a 20 20    case TK_ALL:  
8e10: 20 20 20 20 20 7a 20 3d 20 22 55 4e 49 4f 4e 20       z = "UNION 
8e20: 41 4c 4c 22 3b 20 20 20 62 72 65 61 6b 3b 0a 20  ALL";   break;. 
8e30: 20 20 20 63 61 73 65 20 54 4b 5f 49 4e 54 45 52     case TK_INTER
8e40: 53 45 43 54 3a 20 7a 20 3d 20 22 49 4e 54 45 52  SECT: z = "INTER
8e50: 53 45 43 54 22 3b 20 20 20 62 72 65 61 6b 3b 0a  SECT";   break;.
8e60: 20 20 20 20 63 61 73 65 20 54 4b 5f 45 58 43 45      case TK_EXCE
8e70: 50 54 3a 20 20 20 20 7a 20 3d 20 22 45 58 43 45  PT:    z = "EXCE
8e80: 50 54 22 3b 20 20 20 20 20 20 62 72 65 61 6b 3b  PT";      break;
8e90: 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20 20 20  .    default:   
8ea0: 20 20 20 20 20 20 20 20 7a 20 3d 20 22 55 4e 49          z = "UNI
8eb0: 4f 4e 22 3b 20 20 20 20 20 20 20 62 72 65 61 6b  ON";       break
8ec0: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 7a  ;.  }.  return z
8ed0: 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51  ;.}.#endif /* SQ
8ee0: 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f 4d 50 4f 55  LITE_OMIT_COMPOU
8ef0: 4e 44 5f 53 45 4c 45 43 54 20 2a 2f 0a 0a 2f 2a  ND_SELECT */../*
8f00: 0a 2a 2a 20 46 6f 72 77 61 72 64 20 64 65 63 6c  .** Forward decl
8f10: 61 72 61 74 69 6f 6e 0a 2a 2f 0a 73 74 61 74 69  aration.*/.stati
8f20: 63 20 69 6e 74 20 70 72 65 70 53 65 6c 65 63 74  c int prepSelect
8f30: 53 74 6d 74 28 50 61 72 73 65 2a 2c 20 53 65 6c  Stmt(Parse*, Sel
8f40: 65 63 74 2a 29 3b 0a 0a 2f 2a 0a 2a 2a 20 47 69  ect*);../*.** Gi
8f50: 76 65 6e 20 61 20 53 45 4c 45 43 54 20 73 74 61  ven a SELECT sta
8f60: 74 65 6d 65 6e 74 2c 20 67 65 6e 65 72 61 74 65  tement, generate
8f70: 20 61 20 54 61 62 6c 65 20 73 74 72 75 63 74 75   a Table structu
8f80: 72 65 20 74 68 61 74 20 64 65 73 63 72 69 62 65  re that describe
8f90: 73 0a 2a 2a 20 74 68 65 20 72 65 73 75 6c 74 20  s.** the result 
8fa0: 73 65 74 20 6f 66 20 74 68 61 74 20 53 45 4c 45  set of that SELE
8fb0: 43 54 2e 0a 2a 2f 0a 54 61 62 6c 65 20 2a 73 71  CT..*/.Table *sq
8fc0: 6c 69 74 65 33 52 65 73 75 6c 74 53 65 74 4f 66  lite3ResultSetOf
8fd0: 53 65 6c 65 63 74 28 50 61 72 73 65 20 2a 70 50  Select(Parse *pP
8fe0: 61 72 73 65 2c 20 63 68 61 72 20 2a 7a 54 61 62  arse, char *zTab
8ff0: 4e 61 6d 65 2c 20 53 65 6c 65 63 74 20 2a 70 53  Name, Select *pS
9000: 65 6c 65 63 74 29 7b 0a 20 20 54 61 62 6c 65 20  elect){.  Table 
9010: 2a 70 54 61 62 3b 0a 20 20 69 6e 74 20 69 2c 20  *pTab;.  int i, 
9020: 6a 3b 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70  j;.  ExprList *p
9030: 45 4c 69 73 74 3b 0a 20 20 43 6f 6c 75 6d 6e 20  EList;.  Column 
9040: 2a 61 43 6f 6c 2c 20 2a 70 43 6f 6c 3b 0a 20 20  *aCol, *pCol;.  
9050: 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50  sqlite3 *db = pP
9060: 61 72 73 65 2d 3e 64 62 3b 0a 0a 20 20 77 68 69  arse->db;..  whi
9070: 6c 65 28 20 70 53 65 6c 65 63 74 2d 3e 70 50 72  le( pSelect->pPr
9080: 69 6f 72 20 29 20 70 53 65 6c 65 63 74 20 3d 20  ior ) pSelect = 
9090: 70 53 65 6c 65 63 74 2d 3e 70 50 72 69 6f 72 3b  pSelect->pPrior;
90a0: 0a 20 20 69 66 28 20 70 72 65 70 53 65 6c 65 63  .  if( prepSelec
90b0: 74 53 74 6d 74 28 70 50 61 72 73 65 2c 20 70 53  tStmt(pParse, pS
90c0: 65 6c 65 63 74 29 20 29 7b 0a 20 20 20 20 72 65  elect) ){.    re
90d0: 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 69 66  turn 0;.  }.  if
90e0: 28 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 52  ( sqlite3SelectR
90f0: 65 73 6f 6c 76 65 28 70 50 61 72 73 65 2c 20 70  esolve(pParse, p
9100: 53 65 6c 65 63 74 2c 20 30 29 20 29 7b 0a 20 20  Select, 0) ){.  
9110: 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a    return 0;.  }.
9120: 20 20 70 54 61 62 20 3d 20 73 71 6c 69 74 65 33    pTab = sqlite3
9130: 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c  DbMallocZero(db,
9140: 20 73 69 7a 65 6f 66 28 54 61 62 6c 65 29 20 29   sizeof(Table) )
9150: 3b 0a 20 20 69 66 28 20 70 54 61 62 3d 3d 30 20  ;.  if( pTab==0 
9160: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b  ){.    return 0;
9170: 0a 20 20 7d 0a 20 20 70 54 61 62 2d 3e 6e 52 65  .  }.  pTab->nRe
9180: 66 20 3d 20 31 3b 0a 20 20 70 54 61 62 2d 3e 7a  f = 1;.  pTab->z
9190: 4e 61 6d 65 20 3d 20 7a 54 61 62 4e 61 6d 65 20  Name = zTabName 
91a0: 3f 20 73 71 6c 69 74 65 33 44 62 53 74 72 44 75  ? sqlite3DbStrDu
91b0: 70 28 64 62 2c 20 7a 54 61 62 4e 61 6d 65 29 20  p(db, zTabName) 
91c0: 3a 20 30 3b 0a 20 20 70 45 4c 69 73 74 20 3d 20  : 0;.  pEList = 
91d0: 70 53 65 6c 65 63 74 2d 3e 70 45 4c 69 73 74 3b  pSelect->pEList;
91e0: 0a 20 20 70 54 61 62 2d 3e 6e 43 6f 6c 20 3d 20  .  pTab->nCol = 
91f0: 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 0a 20  pEList->nExpr;. 
9200: 20 61 73 73 65 72 74 28 20 70 54 61 62 2d 3e 6e   assert( pTab->n
9210: 43 6f 6c 3e 30 20 29 3b 0a 20 20 70 54 61 62 2d  Col>0 );.  pTab-
9220: 3e 61 43 6f 6c 20 3d 20 61 43 6f 6c 20 3d 20 73  >aCol = aCol = s
9230: 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65  qlite3DbMallocZe
9240: 72 6f 28 64 62 2c 20 73 69 7a 65 6f 66 28 70 54  ro(db, sizeof(pT
9250: 61 62 2d 3e 61 43 6f 6c 5b 30 5d 29 2a 70 54 61  ab->aCol[0])*pTa
9260: 62 2d 3e 6e 43 6f 6c 29 3b 0a 20 20 66 6f 72 28  b->nCol);.  for(
9270: 69 3d 30 2c 20 70 43 6f 6c 3d 61 43 6f 6c 3b 20  i=0, pCol=aCol; 
9280: 69 3c 70 54 61 62 2d 3e 6e 43 6f 6c 3b 20 69 2b  i<pTab->nCol; i+
9290: 2b 2c 20 70 43 6f 6c 2b 2b 29 7b 0a 20 20 20 20  +, pCol++){.    
92a0: 45 78 70 72 20 2a 70 2c 20 2a 70 52 3b 0a 20 20  Expr *p, *pR;.  
92b0: 20 20 63 68 61 72 20 2a 7a 54 79 70 65 3b 0a 20    char *zType;. 
92c0: 20 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 3b 0a     char *zName;.
92d0: 20 20 20 20 69 6e 74 20 6e 4e 61 6d 65 3b 0a 20      int nName;. 
92e0: 20 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c     CollSeq *pCol
92f0: 6c 3b 0a 20 20 20 20 69 6e 74 20 63 6e 74 3b 0a  l;.    int cnt;.
9300: 20 20 20 20 4e 61 6d 65 43 6f 6e 74 65 78 74 20      NameContext 
9310: 73 4e 43 3b 0a 20 20 20 20 0a 20 20 20 20 2f 2a  sNC;.    .    /*
9320: 20 47 65 74 20 61 6e 20 61 70 70 72 6f 70 72 69   Get an appropri
9330: 61 74 65 20 6e 61 6d 65 20 66 6f 72 20 74 68 65  ate name for the
9340: 20 63 6f 6c 75 6d 6e 0a 20 20 20 20 2a 2f 0a 20   column.    */. 
9350: 20 20 20 70 20 3d 20 70 45 4c 69 73 74 2d 3e 61     p = pEList->a
9360: 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 61  [i].pExpr;.    a
9370: 73 73 65 72 74 28 20 70 2d 3e 70 52 69 67 68 74  ssert( p->pRight
9380: 3d 3d 30 20 7c 7c 20 70 2d 3e 70 52 69 67 68 74  ==0 || p->pRight
9390: 2d 3e 74 6f 6b 65 6e 2e 7a 3d 3d 30 20 7c 7c 20  ->token.z==0 || 
93a0: 70 2d 3e 70 52 69 67 68 74 2d 3e 74 6f 6b 65 6e  p->pRight->token
93b0: 2e 7a 5b 30 5d 21 3d 30 20 29 3b 0a 20 20 20 20  .z[0]!=0 );.    
93c0: 69 66 28 20 28 7a 4e 61 6d 65 20 3d 20 70 45 4c  if( (zName = pEL
93d0: 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 29  ist->a[i].zName)
93e0: 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  !=0 ){.      /* 
93f0: 49 66 20 74 68 65 20 63 6f 6c 75 6d 6e 20 63 6f  If the column co
9400: 6e 74 61 69 6e 73 20 61 6e 20 22 41 53 20 3c 6e  ntains an "AS <n
9410: 61 6d 65 3e 22 20 70 68 72 61 73 65 2c 20 75 73  ame>" phrase, us
9420: 65 20 3c 6e 61 6d 65 3e 20 61 73 20 74 68 65 20  e <name> as the 
9430: 6e 61 6d 65 20 2a 2f 0a 20 20 20 20 20 20 7a 4e  name */.      zN
9440: 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 44 62 53  ame = sqlite3DbS
9450: 74 72 44 75 70 28 64 62 2c 20 7a 4e 61 6d 65 29  trDup(db, zName)
9460: 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
9470: 70 2d 3e 6f 70 3d 3d 54 4b 5f 44 4f 54 20 0a 20  p->op==TK_DOT . 
9480: 20 20 20 20 20 20 20 20 20 20 20 20 20 26 26 20               && 
9490: 28 70 52 3d 70 2d 3e 70 52 69 67 68 74 29 21 3d  (pR=p->pRight)!=
94a0: 30 20 26 26 20 70 52 2d 3e 74 6f 6b 65 6e 2e 7a  0 && pR->token.z
94b0: 20 26 26 20 70 52 2d 3e 74 6f 6b 65 6e 2e 7a 5b   && pR->token.z[
94c0: 30 5d 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 46  0] ){.      /* F
94d0: 6f 72 20 63 6f 6c 75 6d 6e 73 20 6f 66 20 74 68  or columns of th
94e0: 65 20 66 72 6f 6d 20 41 2e 42 20 75 73 65 20 42  e from A.B use B
94f0: 20 61 73 20 74 68 65 20 6e 61 6d 65 20 2a 2f 0a   as the name */.
9500: 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 73 71        zName = sq
9510: 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 64 62 2c  lite3MPrintf(db,
9520: 20 22 25 54 22 2c 20 26 70 52 2d 3e 74 6f 6b 65   "%T", &pR->toke
9530: 6e 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66  n);.    }else if
9540: 28 20 70 2d 3e 73 70 61 6e 2e 7a 20 26 26 20 70  ( p->span.z && p
9550: 2d 3e 73 70 61 6e 2e 7a 5b 30 5d 20 29 7b 0a 20  ->span.z[0] ){. 
9560: 20 20 20 20 20 2f 2a 20 55 73 65 20 74 68 65 20       /* Use the 
9570: 6f 72 69 67 69 6e 61 6c 20 74 65 78 74 20 6f 66  original text of
9580: 20 74 68 65 20 63 6f 6c 75 6d 6e 20 65 78 70 72   the column expr
9590: 65 73 73 69 6f 6e 20 61 73 20 69 74 73 20 6e 61  ession as its na
95a0: 6d 65 20 2a 2f 0a 20 20 20 20 20 20 7a 4e 61 6d  me */.      zNam
95b0: 65 20 3d 20 73 71 6c 69 74 65 33 4d 50 72 69 6e  e = sqlite3MPrin
95c0: 74 66 28 64 62 2c 20 22 25 54 22 2c 20 26 70 2d  tf(db, "%T", &p-
95d0: 3e 73 70 61 6e 29 3b 0a 20 20 20 20 7d 65 6c 73  >span);.    }els
95e0: 65 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 61  e{.      /* If a
95f0: 6c 6c 20 65 6c 73 65 20 66 61 69 6c 73 2c 20 6d  ll else fails, m
9600: 61 6b 65 20 75 70 20 61 20 6e 61 6d 65 20 2a 2f  ake up a name */
9610: 0a 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 73  .      zName = s
9620: 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 64 62  qlite3MPrintf(db
9630: 2c 20 22 63 6f 6c 75 6d 6e 25 64 22 2c 20 69 2b  , "column%d", i+
9640: 31 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  1);.    }.    if
9650: 28 20 21 7a 4e 61 6d 65 20 7c 7c 20 64 62 2d 3e  ( !zName || db->
9660: 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a  mallocFailed ){.
9670: 20 20 20 20 20 20 64 62 2d 3e 6d 61 6c 6c 6f 63        db->malloc
9680: 46 61 69 6c 65 64 20 3d 20 31 3b 0a 20 20 20 20  Failed = 1;.    
9690: 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
96a0: 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 73 71 6c  Name);.      sql
96b0: 69 74 65 33 44 65 6c 65 74 65 54 61 62 6c 65 28  ite3DeleteTable(
96c0: 70 54 61 62 29 3b 0a 20 20 20 20 20 20 72 65 74  pTab);.      ret
96d0: 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20  urn 0;.    }.   
96e0: 20 73 71 6c 69 74 65 33 44 65 71 75 6f 74 65 28   sqlite3Dequote(
96f0: 7a 4e 61 6d 65 29 3b 0a 0a 20 20 20 20 2f 2a 20  zName);..    /* 
9700: 4d 61 6b 65 20 73 75 72 65 20 74 68 65 20 63 6f  Make sure the co
9710: 6c 75 6d 6e 20 6e 61 6d 65 20 69 73 20 75 6e 69  lumn name is uni
9720: 71 75 65 2e 20 20 49 66 20 74 68 65 20 6e 61 6d  que.  If the nam
9730: 65 20 69 73 20 6e 6f 74 20 75 6e 69 71 75 65 2c  e is not unique,
9740: 0a 20 20 20 20 2a 2a 20 61 70 70 65 6e 64 20 61  .    ** append a
9750: 20 69 6e 74 65 67 65 72 20 74 6f 20 74 68 65 20   integer to the 
9760: 6e 61 6d 65 20 73 6f 20 74 68 61 74 20 69 74 20  name so that it 
9770: 62 65 63 6f 6d 65 73 20 75 6e 69 71 75 65 2e 0a  becomes unique..
9780: 20 20 20 20 2a 2f 0a 20 20 20 20 6e 4e 61 6d 65      */.    nName
9790: 20 3d 20 73 74 72 6c 65 6e 28 7a 4e 61 6d 65 29   = strlen(zName)
97a0: 3b 0a 20 20 20 20 66 6f 72 28 6a 3d 63 6e 74 3d  ;.    for(j=cnt=
97b0: 30 3b 20 6a 3c 69 3b 20 6a 2b 2b 29 7b 0a 20 20  0; j<i; j++){.  
97c0: 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 53      if( sqlite3S
97d0: 74 72 49 43 6d 70 28 61 43 6f 6c 5b 6a 5d 2e 7a  trICmp(aCol[j].z
97e0: 4e 61 6d 65 2c 20 7a 4e 61 6d 65 29 3d 3d 30 20  Name, zName)==0 
97f0: 29 7b 0a 20 20 20 20 20 20 20 20 7a 4e 61 6d 65  ){.        zName
9800: 5b 6e 4e 61 6d 65 5d 20 3d 20 30 3b 0a 20 20 20  [nName] = 0;.   
9810: 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 73 71 6c       zName = sql
9820: 69 74 65 33 4d 50 72 69 6e 74 66 28 64 62 2c 20  ite3MPrintf(db, 
9830: 22 25 7a 3a 25 64 22 2c 20 7a 4e 61 6d 65 2c 20  "%z:%d", zName, 
9840: 2b 2b 63 6e 74 29 3b 0a 20 20 20 20 20 20 20 20  ++cnt);.        
9850: 6a 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 20 20  j = -1;.        
9860: 69 66 28 20 7a 4e 61 6d 65 3d 3d 30 20 29 20 62  if( zName==0 ) b
9870: 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  reak;.      }.  
9880: 20 20 7d 0a 20 20 20 20 70 43 6f 6c 2d 3e 7a 4e    }.    pCol->zN
9890: 61 6d 65 20 3d 20 7a 4e 61 6d 65 3b 0a 0a 20 20  ame = zName;..  
98a0: 20 20 2f 2a 20 47 65 74 20 74 68 65 20 74 79 70    /* Get the typ
98b0: 65 6e 61 6d 65 2c 20 74 79 70 65 20 61 66 66 69  ename, type affi
98c0: 6e 69 74 79 2c 20 61 6e 64 20 63 6f 6c 6c 61 74  nity, and collat
98d0: 69 6e 67 20 73 65 71 75 65 6e 63 65 20 66 6f 72  ing sequence for
98e0: 20 74 68 65 0a 20 20 20 20 2a 2a 20 63 6f 6c 75   the.    ** colu
98f0: 6d 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 6d  mn..    */.    m
9900: 65 6d 73 65 74 28 26 73 4e 43 2c 20 30 2c 20 73  emset(&sNC, 0, s
9910: 69 7a 65 6f 66 28 73 4e 43 29 29 3b 0a 20 20 20  izeof(sNC));.   
9920: 20 73 4e 43 2e 70 53 72 63 4c 69 73 74 20 3d 20   sNC.pSrcList = 
9930: 70 53 65 6c 65 63 74 2d 3e 70 53 72 63 3b 0a 20  pSelect->pSrc;. 
9940: 20 20 20 7a 54 79 70 65 20 3d 20 73 71 6c 69 74     zType = sqlit
9950: 65 33 44 62 53 74 72 44 75 70 28 64 62 2c 20 63  e3DbStrDup(db, c
9960: 6f 6c 75 6d 6e 54 79 70 65 28 26 73 4e 43 2c 20  olumnType(&sNC, 
9970: 70 2c 20 30 2c 20 30 2c 20 30 29 29 3b 0a 20 20  p, 0, 0, 0));.  
9980: 20 20 70 43 6f 6c 2d 3e 7a 54 79 70 65 20 3d 20    pCol->zType = 
9990: 7a 54 79 70 65 3b 0a 20 20 20 20 70 43 6f 6c 2d  zType;.    pCol-
99a0: 3e 61 66 66 69 6e 69 74 79 20 3d 20 73 71 6c 69  >affinity = sqli
99b0: 74 65 33 45 78 70 72 41 66 66 69 6e 69 74 79 28  te3ExprAffinity(
99c0: 70 29 3b 0a 20 20 20 20 70 43 6f 6c 6c 20 3d 20  p);.    pColl = 
99d0: 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c 53  sqlite3ExprCollS
99e0: 65 71 28 70 50 61 72 73 65 2c 20 70 29 3b 0a 20  eq(pParse, p);. 
99f0: 20 20 20 69 66 28 20 70 43 6f 6c 6c 20 29 7b 0a     if( pColl ){.
9a00: 20 20 20 20 20 20 70 43 6f 6c 2d 3e 7a 43 6f 6c        pCol->zCol
9a10: 6c 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72  l = sqlite3DbStr
9a20: 44 75 70 28 64 62 2c 20 70 43 6f 6c 6c 2d 3e 7a  Dup(db, pColl->z
9a30: 4e 61 6d 65 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  Name);.    }.  }
9a40: 0a 20 20 70 54 61 62 2d 3e 69 50 4b 65 79 20 3d  .  pTab->iPKey =
9a50: 20 2d 31 3b 0a 20 20 72 65 74 75 72 6e 20 70 54   -1;.  return pT
9a60: 61 62 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 72 65  ab;.}../*.** Pre
9a70: 70 61 72 65 20 61 20 53 45 4c 45 43 54 20 73 74  pare a SELECT st
9a80: 61 74 65 6d 65 6e 74 20 66 6f 72 20 70 72 6f 63  atement for proc
9a90: 65 73 73 69 6e 67 20 62 79 20 64 6f 69 6e 67 20  essing by doing 
9aa0: 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 0a 2a 2a  the following.**
9ab0: 20 74 68 69 6e 67 73 3a 0a 2a 2a 0a 2a 2a 20 20   things:.**.**  
9ac0: 20 20 28 31 29 20 20 4d 61 6b 65 20 73 75 72 65    (1)  Make sure
9ad0: 20 56 44 42 45 20 63 75 72 73 6f 72 20 6e 75 6d   VDBE cursor num
9ae0: 62 65 72 73 20 68 61 76 65 20 62 65 65 6e 20 61  bers have been a
9af0: 73 73 69 67 6e 65 64 20 74 6f 20 65 76 65 72 79  ssigned to every
9b00: 0a 2a 2a 20 20 20 20 20 20 20 20 20 65 6c 65 6d  .**         elem
9b10: 65 6e 74 20 6f 66 20 74 68 65 20 46 52 4f 4d 20  ent of the FROM 
9b20: 63 6c 61 75 73 65 2e 0a 2a 2a 0a 2a 2a 20 20 20  clause..**.**   
9b30: 20 28 32 29 20 20 46 69 6c 6c 20 69 6e 20 74 68   (2)  Fill in th
9b40: 65 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 5d 2e  e pTabList->a[].
9b50: 70 54 61 62 20 66 69 65 6c 64 73 20 69 6e 20 74  pTab fields in t
9b60: 68 65 20 53 72 63 4c 69 73 74 20 74 68 61 74 20  he SrcList that 
9b70: 0a 2a 2a 20 20 20 20 20 20 20 20 20 64 65 66 69  .**         defi
9b80: 6e 65 73 20 46 52 4f 4d 20 63 6c 61 75 73 65 2e  nes FROM clause.
9b90: 20 20 57 68 65 6e 20 76 69 65 77 73 20 61 70 70    When views app
9ba0: 65 61 72 20 69 6e 20 74 68 65 20 46 52 4f 4d 20  ear in the FROM 
9bb0: 63 6c 61 75 73 65 2c 0a 2a 2a 20 20 20 20 20 20  clause,.**      
9bc0: 20 20 20 66 69 6c 6c 20 70 54 61 62 4c 69 73 74     fill pTabList
9bd0: 2d 3e 61 5b 5d 2e 70 53 65 6c 65 63 74 20 77 69  ->a[].pSelect wi
9be0: 74 68 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65  th a copy of the
9bf0: 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
9c00: 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 74 68 61  t.**         tha
9c10: 74 20 69 6d 70 6c 65 6d 65 6e 74 73 20 74 68 65  t implements the
9c20: 20 76 69 65 77 2e 20 20 41 20 63 6f 70 79 20 69   view.  A copy i
9c30: 73 20 6d 61 64 65 20 6f 66 20 74 68 65 20 76 69  s made of the vi
9c40: 65 77 27 73 20 53 45 4c 45 43 54 0a 2a 2a 20 20  ew's SELECT.**  
9c50: 20 20 20 20 20 20 20 73 74 61 74 65 6d 65 6e 74         statement
9c60: 20 73 6f 20 74 68 61 74 20 77 65 20 63 61 6e 20   so that we can 
9c70: 66 72 65 65 6c 79 20 6d 6f 64 69 66 79 20 6f 72  freely modify or
9c80: 20 64 65 6c 65 74 65 20 74 68 61 74 20 73 74 61   delete that sta
9c90: 74 65 6d 65 6e 74 0a 2a 2a 20 20 20 20 20 20 20  tement.**       
9ca0: 20 20 77 69 74 68 6f 75 74 20 77 6f 72 72 79 69    without worryi
9cb0: 6e 67 20 61 62 6f 75 74 20 6d 65 73 73 69 6e 67  ng about messing
9cc0: 20 75 70 20 74 68 65 20 70 72 65 73 69 73 74 65   up the presiste
9cd0: 6e 74 20 72 65 70 72 65 73 65 6e 74 61 74 69 6f  nt representatio
9ce0: 6e 0a 2a 2a 20 20 20 20 20 20 20 20 20 6f 66 20  n.**         of 
9cf0: 74 68 65 20 76 69 65 77 2e 0a 2a 2a 0a 2a 2a 20  the view..**.** 
9d00: 20 20 20 28 33 29 20 20 41 64 64 20 74 65 72 6d     (3)  Add term
9d10: 73 20 74 6f 20 74 68 65 20 57 48 45 52 45 20 63  s to the WHERE c
9d20: 6c 61 75 73 65 20 74 6f 20 61 63 63 6f 6d 6f 64  lause to accomod
9d30: 61 74 65 20 74 68 65 20 4e 41 54 55 52 41 4c 20  ate the NATURAL 
9d40: 6b 65 79 77 6f 72 64 0a 2a 2a 20 20 20 20 20 20  keyword.**      
9d50: 20 20 20 6f 6e 20 6a 6f 69 6e 73 20 61 6e 64 20     on joins and 
9d60: 74 68 65 20 4f 4e 20 61 6e 64 20 55 53 49 4e 47  the ON and USING
9d70: 20 63 6c 61 75 73 65 20 6f 66 20 6a 6f 69 6e 73   clause of joins
9d80: 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 28 34 29 20 20  ..**.**    (4)  
9d90: 53 63 61 6e 20 74 68 65 20 6c 69 73 74 20 6f 66  Scan the list of
9da0: 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20   columns in the 
9db0: 72 65 73 75 6c 74 20 73 65 74 20 28 70 45 4c 69  result set (pELi
9dc0: 73 74 29 20 6c 6f 6f 6b 69 6e 67 0a 2a 2a 20 20  st) looking.**  
9dd0: 20 20 20 20 20 20 20 66 6f 72 20 69 6e 73 74 61         for insta
9de0: 6e 63 65 73 20 6f 66 20 74 68 65 20 22 2a 22 20  nces of the "*" 
9df0: 6f 70 65 72 61 74 6f 72 20 6f 72 20 74 68 65 20  operator or the 
9e00: 54 41 42 4c 45 2e 2a 20 6f 70 65 72 61 74 6f 72  TABLE.* operator
9e10: 2e 0a 2a 2a 20 20 20 20 20 20 20 20 20 49 66 20  ..**         If 
9e20: 66 6f 75 6e 64 2c 20 65 78 70 61 6e 64 20 65 61  found, expand ea
9e30: 63 68 20 22 2a 22 20 74 6f 20 62 65 20 65 76 65  ch "*" to be eve
9e40: 72 79 20 63 6f 6c 75 6d 6e 20 69 6e 20 65 76 65  ry column in eve
9e50: 72 79 20 74 61 62 6c 65 0a 2a 2a 20 20 20 20 20  ry table.**     
9e60: 20 20 20 20 61 6e 64 20 54 41 42 4c 45 2e 2a 20      and TABLE.* 
9e70: 74 6f 20 62 65 20 65 76 65 72 79 20 63 6f 6c 75  to be every colu
9e80: 6d 6e 20 69 6e 20 54 41 42 4c 45 2e 0a 2a 2a 0a  mn in TABLE..**.
9e90: 2a 2a 20 52 65 74 75 72 6e 20 30 20 6f 6e 20 73  ** Return 0 on s
9ea0: 75 63 63 65 73 73 2e 20 20 49 66 20 74 68 65 72  uccess.  If ther
9eb0: 65 20 61 72 65 20 70 72 6f 62 6c 65 6d 73 2c 20  e are problems, 
9ec0: 6c 65 61 76 65 20 61 6e 20 65 72 72 6f 72 20 6d  leave an error m
9ed0: 65 73 73 61 67 65 0a 2a 2a 20 69 6e 20 70 50 61  essage.** in pPa
9ee0: 72 73 65 20 61 6e 64 20 72 65 74 75 72 6e 20 6e  rse and return n
9ef0: 6f 6e 2d 7a 65 72 6f 2e 0a 2a 2f 0a 73 74 61 74  on-zero..*/.stat
9f00: 69 63 20 69 6e 74 20 70 72 65 70 53 65 6c 65 63  ic int prepSelec
9f10: 74 53 74 6d 74 28 50 61 72 73 65 20 2a 70 50 61  tStmt(Parse *pPa
9f20: 72 73 65 2c 20 53 65 6c 65 63 74 20 2a 70 29 7b  rse, Select *p){
9f30: 0a 20 20 69 6e 74 20 69 2c 20 6a 2c 20 6b 2c 20  .  int i, j, k, 
9f40: 72 63 3b 0a 20 20 53 72 63 4c 69 73 74 20 2a 70  rc;.  SrcList *p
9f50: 54 61 62 4c 69 73 74 3b 0a 20 20 45 78 70 72 4c  TabList;.  ExprL
9f60: 69 73 74 20 2a 70 45 4c 69 73 74 3b 0a 20 20 73  ist *pEList;.  s
9f70: 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74  truct SrcList_it
9f80: 65 6d 20 2a 70 46 72 6f 6d 3b 0a 20 20 73 71 6c  em *pFrom;.  sql
9f90: 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73  ite3 *db = pPars
9fa0: 65 2d 3e 64 62 3b 0a 0a 20 20 69 66 28 20 70 3d  e->db;..  if( p=
9fb0: 3d 30 20 7c 7c 20 70 2d 3e 70 53 72 63 3d 3d 30  =0 || p->pSrc==0
9fc0: 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61   || db->mallocFa
9fd0: 69 6c 65 64 20 29 7b 0a 20 20 20 20 72 65 74 75  iled ){.    retu
9fe0: 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 70 54 61 62  rn 1;.  }.  pTab
9ff0: 4c 69 73 74 20 3d 20 70 2d 3e 70 53 72 63 3b 0a  List = p->pSrc;.
a000: 20 20 70 45 4c 69 73 74 20 3d 20 70 2d 3e 70 45    pEList = p->pE
a010: 4c 69 73 74 3b 0a 0a 20 20 2f 2a 20 4d 61 6b 65  List;..  /* Make
a020: 20 73 75 72 65 20 63 75 72 73 6f 72 20 6e 75 6d   sure cursor num
a030: 62 65 72 73 20 68 61 76 65 20 62 65 65 6e 20 61  bers have been a
a040: 73 73 69 67 6e 65 64 20 74 6f 20 61 6c 6c 20 65  ssigned to all e
a050: 6e 74 72 69 65 73 20 69 6e 0a 20 20 2a 2a 20 74  ntries in.  ** t
a060: 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f  he FROM clause o
a070: 66 20 74 68 65 20 53 45 4c 45 43 54 20 73 74 61  f the SELECT sta
a080: 74 65 6d 65 6e 74 2e 0a 20 20 2a 2f 0a 20 20 73  tement..  */.  s
a090: 71 6c 69 74 65 33 53 72 63 4c 69 73 74 41 73 73  qlite3SrcListAss
a0a0: 69 67 6e 43 75 72 73 6f 72 73 28 70 50 61 72 73  ignCursors(pPars
a0b0: 65 2c 20 70 2d 3e 70 53 72 63 29 3b 0a 0a 20 20  e, p->pSrc);..  
a0c0: 2f 2a 20 4c 6f 6f 6b 20 75 70 20 65 76 65 72 79  /* Look up every
a0d0: 20 74 61 62 6c 65 20 6e 61 6d 65 64 20 69 6e 20   table named in 
a0e0: 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20  the FROM clause 
a0f0: 6f 66 20 74 68 65 20 73 65 6c 65 63 74 2e 20 20  of the select.  
a100: 49 66 0a 20 20 2a 2a 20 61 6e 20 65 6e 74 72 79  If.  ** an entry
a110: 20 6f 66 20 74 68 65 20 46 52 4f 4d 20 63 6c 61   of the FROM cla
a120: 75 73 65 20 69 73 20 61 20 73 75 62 71 75 65 72  use is a subquer
a130: 79 20 69 6e 73 74 65 61 64 20 6f 66 20 61 20 74  y instead of a t
a140: 61 62 6c 65 20 6f 72 20 76 69 65 77 2c 0a 20 20  able or view,.  
a150: 2a 2a 20 74 68 65 6e 20 63 72 65 61 74 65 20 61  ** then create a
a160: 20 74 72 61 6e 73 69 65 6e 74 20 74 61 62 6c 65   transient table
a170: 20 73 74 72 75 63 74 75 72 65 20 74 6f 20 64 65   structure to de
a180: 73 63 72 69 62 65 20 74 68 65 20 73 75 62 71 75  scribe the subqu
a190: 65 72 79 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28  ery..  */.  for(
a1a0: 69 3d 30 2c 20 70 46 72 6f 6d 3d 70 54 61 62 4c  i=0, pFrom=pTabL
a1b0: 69 73 74 2d 3e 61 3b 20 69 3c 70 54 61 62 4c 69  ist->a; i<pTabLi
a1c0: 73 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b 2c 20 70  st->nSrc; i++, p
a1d0: 46 72 6f 6d 2b 2b 29 7b 0a 20 20 20 20 54 61 62  From++){.    Tab
a1e0: 6c 65 20 2a 70 54 61 62 3b 0a 20 20 20 20 69 66  le *pTab;.    if
a1f0: 28 20 70 46 72 6f 6d 2d 3e 70 54 61 62 21 3d 30  ( pFrom->pTab!=0
a200: 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 69   ){.      /* Thi
a210: 73 20 73 74 61 74 65 6d 65 6e 74 20 68 61 73 20  s statement has 
a220: 61 6c 72 65 61 64 79 20 62 65 65 6e 20 70 72 65  already been pre
a230: 70 61 72 65 64 2e 20 20 54 68 65 72 65 20 69 73  pared.  There is
a240: 20 6e 6f 20 6e 65 65 64 0a 20 20 20 20 20 20 2a   no need.      *
a250: 2a 20 74 6f 20 67 6f 20 66 75 72 74 68 65 72 2e  * to go further.
a260: 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74   */.      assert
a270: 28 20 69 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  ( i==0 );.      
a280: 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a  return 0;.    }.
a290: 20 20 20 20 69 66 28 20 70 46 72 6f 6d 2d 3e 7a      if( pFrom->z
a2a0: 4e 61 6d 65 3d 3d 30 20 29 7b 0a 23 69 66 6e 64  Name==0 ){.#ifnd
a2b0: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53  ef SQLITE_OMIT_S
a2c0: 55 42 51 55 45 52 59 0a 20 20 20 20 20 20 2f 2a  UBQUERY.      /*
a2d0: 20 41 20 73 75 62 2d 71 75 65 72 79 20 69 6e 20   A sub-query in 
a2e0: 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20  the FROM clause 
a2f0: 6f 66 20 61 20 53 45 4c 45 43 54 20 2a 2f 0a 20  of a SELECT */. 
a300: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 46 72       assert( pFr
a310: 6f 6d 2d 3e 70 53 65 6c 65 63 74 21 3d 30 20 29  om->pSelect!=0 )
a320: 3b 0a 20 20 20 20 20 20 69 66 28 20 70 46 72 6f  ;.      if( pFro
a330: 6d 2d 3e 7a 41 6c 69 61 73 3d 3d 30 20 29 7b 0a  m->zAlias==0 ){.
a340: 20 20 20 20 20 20 20 20 70 46 72 6f 6d 2d 3e 7a          pFrom->z
a350: 41 6c 69 61 73 20 3d 0a 20 20 20 20 20 20 20 20  Alias =.        
a360: 20 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66    sqlite3MPrintf
a370: 28 64 62 2c 20 22 73 71 6c 69 74 65 5f 73 75 62  (db, "sqlite_sub
a380: 71 75 65 72 79 5f 25 70 5f 22 2c 20 28 76 6f 69  query_%p_", (voi
a390: 64 2a 29 70 46 72 6f 6d 2d 3e 70 53 65 6c 65 63  d*)pFrom->pSelec
a3a0: 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  t);.      }.    
a3b0: 20 20 61 73 73 65 72 74 28 20 70 46 72 6f 6d 2d    assert( pFrom-
a3c0: 3e 70 54 61 62 3d 3d 30 20 29 3b 0a 20 20 20 20  >pTab==0 );.    
a3d0: 20 20 70 46 72 6f 6d 2d 3e 70 54 61 62 20 3d 20    pFrom->pTab = 
a3e0: 70 54 61 62 20 3d 20 0a 20 20 20 20 20 20 20 20  pTab = .        
a3f0: 73 71 6c 69 74 65 33 52 65 73 75 6c 74 53 65 74  sqlite3ResultSet
a400: 4f 66 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c  OfSelect(pParse,
a410: 20 70 46 72 6f 6d 2d 3e 7a 41 6c 69 61 73 2c 20   pFrom->zAlias, 
a420: 70 46 72 6f 6d 2d 3e 70 53 65 6c 65 63 74 29 3b  pFrom->pSelect);
a430: 0a 20 20 20 20 20 20 69 66 28 20 70 54 61 62 3d  .      if( pTab=
a440: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65  =0 ){.        re
a450: 74 75 72 6e 20 31 3b 0a 20 20 20 20 20 20 7d 0a  turn 1;.      }.
a460: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 69 73 45        /* The isE
a470: 70 68 65 6d 20 66 6c 61 67 20 69 6e 64 69 63 61  phem flag indica
a480: 74 65 73 20 74 68 61 74 20 74 68 65 20 54 61 62  tes that the Tab
a490: 6c 65 20 73 74 72 75 63 74 75 72 65 20 68 61 73  le structure has
a4a0: 20 62 65 65 6e 0a 20 20 20 20 20 20 2a 2a 20 64   been.      ** d
a4b0: 79 6e 61 6d 69 63 61 6c 6c 79 20 61 6c 6c 6f 63  ynamically alloc
a4c0: 61 74 65 64 20 61 6e 64 20 6d 61 79 20 62 65 20  ated and may be 
a4d0: 66 72 65 65 64 20 61 74 20 61 6e 79 20 74 69 6d  freed at any tim
a4e0: 65 2e 20 20 49 6e 20 6f 74 68 65 72 20 77 6f 72  e.  In other wor
a4f0: 64 73 2c 0a 20 20 20 20 20 20 2a 2a 20 70 54 61  ds,.      ** pTa
a500: 62 20 69 73 20 6e 6f 74 20 70 6f 69 6e 74 69 6e  b is not pointin
a510: 67 20 74 6f 20 61 20 70 65 72 73 69 73 74 65 6e  g to a persisten
a520: 74 20 74 61 62 6c 65 20 73 74 72 75 63 74 75 72  t table structur
a530: 65 20 74 68 61 74 20 64 65 66 69 6e 65 73 0a 20  e that defines. 
a540: 20 20 20 20 20 2a 2a 20 70 61 72 74 20 6f 66 20       ** part of 
a550: 74 68 65 20 73 63 68 65 6d 61 2e 20 2a 2f 0a 20  the schema. */. 
a560: 20 20 20 20 20 70 54 61 62 2d 3e 69 73 45 70 68       pTab->isEph
a570: 65 6d 20 3d 20 31 3b 0a 23 65 6e 64 69 66 0a 20  em = 1;.#endif. 
a580: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
a590: 2f 2a 20 41 6e 20 6f 72 64 69 6e 61 72 79 20 74  /* An ordinary t
a5a0: 61 62 6c 65 20 6f 72 20 76 69 65 77 20 6e 61 6d  able or view nam
a5b0: 65 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c  e in the FROM cl
a5c0: 61 75 73 65 20 2a 2f 0a 20 20 20 20 20 20 61 73  ause */.      as
a5d0: 73 65 72 74 28 20 70 46 72 6f 6d 2d 3e 70 54 61  sert( pFrom->pTa
a5e0: 62 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 70 46  b==0 );.      pF
a5f0: 72 6f 6d 2d 3e 70 54 61 62 20 3d 20 70 54 61 62  rom->pTab = pTab
a600: 20 3d 20 0a 20 20 20 20 20 20 20 20 73 71 6c 69   = .        sqli
a610: 74 65 33 4c 6f 63 61 74 65 54 61 62 6c 65 28 70  te3LocateTable(p
a620: 50 61 72 73 65 2c 30 2c 70 46 72 6f 6d 2d 3e 7a  Parse,0,pFrom->z
a630: 4e 61 6d 65 2c 70 46 72 6f 6d 2d 3e 7a 44 61 74  Name,pFrom->zDat
a640: 61 62 61 73 65 29 3b 0a 20 20 20 20 20 20 69 66  abase);.      if
a650: 28 20 70 54 61 62 3d 3d 30 20 29 7b 0a 20 20 20  ( pTab==0 ){.   
a660: 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20       return 1;. 
a670: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 54 61       }.      pTa
a680: 62 2d 3e 6e 52 65 66 2b 2b 3b 0a 23 69 66 20 21  b->nRef++;.#if !
a690: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
a6a0: 4d 49 54 5f 56 49 45 57 29 20 7c 7c 20 21 64 65  MIT_VIEW) || !de
a6b0: 66 69 6e 65 64 20 28 53 51 4c 49 54 45 5f 4f 4d  fined (SQLITE_OM
a6c0: 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 29  IT_VIRTUALTABLE)
a6d0: 0a 20 20 20 20 20 20 69 66 28 20 70 54 61 62 2d  .      if( pTab-
a6e0: 3e 70 53 65 6c 65 63 74 20 7c 7c 20 49 73 56 69  >pSelect || IsVi
a6f0: 72 74 75 61 6c 28 70 54 61 62 29 20 29 7b 0a 20  rtual(pTab) ){. 
a700: 20 20 20 20 20 20 20 2f 2a 20 57 65 20 72 65 61         /* We rea
a710: 63 68 20 68 65 72 65 20 69 66 20 74 68 65 20 6e  ch here if the n
a720: 61 6d 65 64 20 74 61 62 6c 65 20 69 73 20 61 20  amed table is a 
a730: 72 65 61 6c 6c 79 20 61 20 76 69 65 77 20 2a 2f  really a view */
a740: 0a 20 20 20 20 20 20 20 20 69 66 28 20 73 71 6c  .        if( sql
a750: 69 74 65 33 56 69 65 77 47 65 74 43 6f 6c 75 6d  ite3ViewGetColum
a760: 6e 4e 61 6d 65 73 28 70 50 61 72 73 65 2c 20 70  nNames(pParse, p
a770: 54 61 62 29 20 29 7b 0a 20 20 20 20 20 20 20 20  Tab) ){.        
a780: 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20    return 1;.    
a790: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 2f 2a      }.        /*
a7a0: 20 49 66 20 70 46 72 6f 6d 2d 3e 70 53 65 6c 65   If pFrom->pSele
a7b0: 63 74 21 3d 30 20 69 74 20 6d 65 61 6e 73 20 77  ct!=0 it means w
a7c0: 65 20 61 72 65 20 64 65 61 6c 69 6e 67 20 77 69  e are dealing wi
a7d0: 74 68 20 61 0a 20 20 20 20 20 20 20 20 2a 2a 20  th a.        ** 
a7e0: 76 69 65 77 20 77 69 74 68 69 6e 20 61 20 76 69  view within a vi
a7f0: 65 77 2e 20 20 54 68 65 20 53 45 4c 45 43 54 20  ew.  The SELECT 
a800: 73 74 72 75 63 74 75 72 65 20 68 61 73 20 61 6c  structure has al
a810: 72 65 61 64 79 20 62 65 65 6e 0a 20 20 20 20 20  ready been.     
a820: 20 20 20 2a 2a 20 63 6f 70 69 65 64 20 62 79 20     ** copied by 
a830: 74 68 65 20 6f 75 74 65 72 20 76 69 65 77 20 73  the outer view s
a840: 6f 20 77 65 20 63 61 6e 20 73 6b 69 70 20 74 68  o we can skip th
a850: 65 20 63 6f 70 79 20 73 74 65 70 20 68 65 72 65  e copy step here
a860: 0a 20 20 20 20 20 20 20 20 2a 2a 20 69 6e 20 74  .        ** in t
a870: 68 65 20 69 6e 6e 65 72 20 76 69 65 77 2e 0a 20  he inner view.. 
a880: 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
a890: 20 20 69 66 28 20 70 46 72 6f 6d 2d 3e 70 53 65    if( pFrom->pSe
a8a0: 6c 65 63 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20  lect==0 ){.     
a8b0: 20 20 20 20 20 70 46 72 6f 6d 2d 3e 70 53 65 6c       pFrom->pSel
a8c0: 65 63 74 20 3d 20 73 71 6c 69 74 65 33 53 65 6c  ect = sqlite3Sel
a8d0: 65 63 74 44 75 70 28 64 62 2c 20 70 54 61 62 2d  ectDup(db, pTab-
a8e0: 3e 70 53 65 6c 65 63 74 29 3b 0a 20 20 20 20 20  >pSelect);.     
a8f0: 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 23 65 6e     }.      }.#en
a900: 64 69 66 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  dif.    }.  }.. 
a910: 20 2f 2a 20 50 72 6f 63 65 73 73 20 4e 41 54 55   /* Process NATU
a920: 52 41 4c 20 6b 65 79 77 6f 72 64 73 2c 20 61 6e  RAL keywords, an
a930: 64 20 4f 4e 20 61 6e 64 20 55 53 49 4e 47 20 63  d ON and USING c
a940: 6c 61 75 73 65 73 20 6f 66 20 6a 6f 69 6e 73 2e  lauses of joins.
a950: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 73 71 6c 69  .  */.  if( sqli
a960: 74 65 50 72 6f 63 65 73 73 4a 6f 69 6e 28 70 50  teProcessJoin(pP
a970: 61 72 73 65 2c 20 70 29 20 29 20 72 65 74 75 72  arse, p) ) retur
a980: 6e 20 31 3b 0a 0a 20 20 2f 2a 20 46 6f 72 20 65  n 1;..  /* For e
a990: 76 65 72 79 20 22 2a 22 20 74 68 61 74 20 6f 63  very "*" that oc
a9a0: 63 75 72 73 20 69 6e 20 74 68 65 20 63 6f 6c 75  curs in the colu
a9b0: 6d 6e 20 6c 69 73 74 2c 20 69 6e 73 65 72 74 20  mn list, insert 
a9c0: 74 68 65 20 6e 61 6d 65 73 20 6f 66 0a 20 20 2a  the names of.  *
a9d0: 2a 20 61 6c 6c 20 63 6f 6c 75 6d 6e 73 20 69 6e  * all columns in
a9e0: 20 61 6c 6c 20 74 61 62 6c 65 73 2e 20 20 41 6e   all tables.  An
a9f0: 64 20 66 6f 72 20 65 76 65 72 79 20 54 41 42 4c  d for every TABL
aa00: 45 2e 2a 20 69 6e 73 65 72 74 20 74 68 65 20 6e  E.* insert the n
aa10: 61 6d 65 73 0a 20 20 2a 2a 20 6f 66 20 61 6c 6c  ames.  ** of all
aa20: 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 54 41 42 4c   columns in TABL
aa30: 45 2e 20 20 54 68 65 20 70 61 72 73 65 72 20 69  E.  The parser i
aa40: 6e 73 65 72 74 65 64 20 61 20 73 70 65 63 69 61  nserted a specia
aa50: 6c 20 65 78 70 72 65 73 73 69 6f 6e 0a 20 20 2a  l expression.  *
aa60: 2a 20 77 69 74 68 20 74 68 65 20 54 4b 5f 41 4c  * with the TK_AL
aa70: 4c 20 6f 70 65 72 61 74 6f 72 20 66 6f 72 20 65  L operator for e
aa80: 61 63 68 20 22 2a 22 20 74 68 61 74 20 69 74 20  ach "*" that it 
aa90: 66 6f 75 6e 64 20 69 6e 20 74 68 65 20 63 6f 6c  found in the col
aaa0: 75 6d 6e 20 6c 69 73 74 2e 0a 20 20 2a 2a 20 54  umn list..  ** T
aab0: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 6f 64  he following cod
aac0: 65 20 6a 75 73 74 20 68 61 73 20 74 6f 20 6c 6f  e just has to lo
aad0: 63 61 74 65 20 74 68 65 20 54 4b 5f 41 4c 4c 20  cate the TK_ALL 
aae0: 65 78 70 72 65 73 73 69 6f 6e 73 20 61 6e 64 20  expressions and 
aaf0: 65 78 70 61 6e 64 0a 20 20 2a 2a 20 65 61 63 68  expand.  ** each
ab00: 20 6f 6e 65 20 74 6f 20 74 68 65 20 6c 69 73 74   one to the list
ab10: 20 6f 66 20 61 6c 6c 20 63 6f 6c 75 6d 6e 73 20   of all columns 
ab20: 69 6e 20 61 6c 6c 20 74 61 62 6c 65 73 2e 0a 20  in all tables.. 
ab30: 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 66 69 72   **.  ** The fir
ab40: 73 74 20 6c 6f 6f 70 20 6a 75 73 74 20 63 68 65  st loop just che
ab50: 63 6b 73 20 74 6f 20 73 65 65 20 69 66 20 74 68  cks to see if th
ab60: 65 72 65 20 61 72 65 20 61 6e 79 20 22 2a 22 20  ere are any "*" 
ab70: 6f 70 65 72 61 74 6f 72 73 0a 20 20 2a 2a 20 74  operators.  ** t
ab80: 68 61 74 20 6e 65 65 64 20 65 78 70 61 6e 64 69  hat need expandi
ab90: 6e 67 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 6b  ng..  */.  for(k
aba0: 3d 30 3b 20 6b 3c 70 45 4c 69 73 74 2d 3e 6e 45  =0; k<pEList->nE
abb0: 78 70 72 3b 20 6b 2b 2b 29 7b 0a 20 20 20 20 45  xpr; k++){.    E
abc0: 78 70 72 20 2a 70 45 20 3d 20 70 45 4c 69 73 74  xpr *pE = pEList
abd0: 2d 3e 61 5b 6b 5d 2e 70 45 78 70 72 3b 0a 20 20  ->a[k].pExpr;.  
abe0: 20 20 69 66 28 20 70 45 2d 3e 6f 70 3d 3d 54 4b    if( pE->op==TK
abf0: 5f 41 4c 4c 20 29 20 62 72 65 61 6b 3b 0a 20 20  _ALL ) break;.  
ac00: 20 20 69 66 28 20 70 45 2d 3e 6f 70 3d 3d 54 4b    if( pE->op==TK
ac10: 5f 44 4f 54 20 26 26 20 70 45 2d 3e 70 52 69 67  _DOT && pE->pRig
ac20: 68 74 20 26 26 20 70 45 2d 3e 70 52 69 67 68 74  ht && pE->pRight
ac30: 2d 3e 6f 70 3d 3d 54 4b 5f 41 4c 4c 0a 20 20 20  ->op==TK_ALL.   
ac40: 20 20 20 20 20 20 26 26 20 70 45 2d 3e 70 4c 65        && pE->pLe
ac50: 66 74 20 26 26 20 70 45 2d 3e 70 4c 65 66 74 2d  ft && pE->pLeft-
ac60: 3e 6f 70 3d 3d 54 4b 5f 49 44 20 29 20 62 72 65  >op==TK_ID ) bre
ac70: 61 6b 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 30  ak;.  }.  rc = 0
ac80: 3b 0a 20 20 69 66 28 20 6b 3c 70 45 4c 69 73 74  ;.  if( k<pEList
ac90: 2d 3e 6e 45 78 70 72 20 29 7b 0a 20 20 20 20 2f  ->nExpr ){.    /
aca0: 2a 0a 20 20 20 20 2a 2a 20 49 66 20 77 65 20 67  *.    ** If we g
acb0: 65 74 20 68 65 72 65 20 69 74 20 6d 65 61 6e 73  et here it means
acc0: 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 20   the result set 
acd0: 63 6f 6e 74 61 69 6e 73 20 6f 6e 65 20 6f 72 20  contains one or 
ace0: 6d 6f 72 65 20 22 2a 22 0a 20 20 20 20 2a 2a 20  more "*".    ** 
acf0: 6f 70 65 72 61 74 6f 72 73 20 74 68 61 74 20 6e  operators that n
ad00: 65 65 64 20 74 6f 20 62 65 20 65 78 70 61 6e 64  eed to be expand
ad10: 65 64 2e 20 20 4c 6f 6f 70 20 74 68 72 6f 75 67  ed.  Loop throug
ad20: 68 20 65 61 63 68 20 65 78 70 72 65 73 73 69 6f  h each expressio
ad30: 6e 0a 20 20 20 20 2a 2a 20 69 6e 20 74 68 65 20  n.    ** in the 
ad40: 72 65 73 75 6c 74 20 73 65 74 20 61 6e 64 20 65  result set and e
ad50: 78 70 61 6e 64 20 74 68 65 6d 20 6f 6e 65 20 62  xpand them one b
ad60: 79 20 6f 6e 65 2e 0a 20 20 20 20 2a 2f 0a 20 20  y one..    */.  
ad70: 20 20 73 74 72 75 63 74 20 45 78 70 72 4c 69 73    struct ExprLis
ad80: 74 5f 69 74 65 6d 20 2a 61 20 3d 20 70 45 4c 69  t_item *a = pELi
ad90: 73 74 2d 3e 61 3b 0a 20 20 20 20 45 78 70 72 4c  st->a;.    ExprL
ada0: 69 73 74 20 2a 70 4e 65 77 20 3d 20 30 3b 0a 20  ist *pNew = 0;. 
adb0: 20 20 20 69 6e 74 20 66 6c 61 67 73 20 3d 20 70     int flags = p
adc0: 50 61 72 73 65 2d 3e 64 62 2d 3e 66 6c 61 67 73  Parse->db->flags
add0: 3b 0a 20 20 20 20 69 6e 74 20 6c 6f 6e 67 4e 61  ;.    int longNa
ade0: 6d 65 73 20 3d 20 28 66 6c 61 67 73 20 26 20 53  mes = (flags & S
adf0: 51 4c 49 54 45 5f 46 75 6c 6c 43 6f 6c 4e 61 6d  QLITE_FullColNam
ae00: 65 73 29 21 3d 30 20 26 26 0a 20 20 20 20 20 20  es)!=0 &&.      
ae10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ae20: 28 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f  (flags & SQLITE_
ae30: 53 68 6f 72 74 43 6f 6c 4e 61 6d 65 73 29 3d 3d  ShortColNames)==
ae40: 30 3b 0a 0a 20 20 20 20 66 6f 72 28 6b 3d 30 3b  0;..    for(k=0;
ae50: 20 6b 3c 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72   k<pEList->nExpr
ae60: 3b 20 6b 2b 2b 29 7b 0a 20 20 20 20 20 20 45 78  ; k++){.      Ex
ae70: 70 72 20 2a 70 45 20 3d 20 61 5b 6b 5d 2e 70 45  pr *pE = a[k].pE
ae80: 78 70 72 3b 0a 20 20 20 20 20 20 69 66 28 20 70  xpr;.      if( p
ae90: 45 2d 3e 6f 70 21 3d 54 4b 5f 41 4c 4c 20 26 26  E->op!=TK_ALL &&
aea0: 0a 20 20 20 20 20 20 20 20 20 20 20 28 70 45 2d  .           (pE-
aeb0: 3e 6f 70 21 3d 54 4b 5f 44 4f 54 20 7c 7c 20 70  >op!=TK_DOT || p
aec0: 45 2d 3e 70 52 69 67 68 74 3d 3d 30 20 7c 7c 20  E->pRight==0 || 
aed0: 70 45 2d 3e 70 52 69 67 68 74 2d 3e 6f 70 21 3d  pE->pRight->op!=
aee0: 54 4b 5f 41 4c 4c 29 20 29 7b 0a 20 20 20 20 20  TK_ALL) ){.     
aef0: 20 20 20 2f 2a 20 54 68 69 73 20 70 61 72 74 69     /* This parti
af00: 63 75 6c 61 72 20 65 78 70 72 65 73 73 69 6f 6e  cular expression
af10: 20 64 6f 65 73 20 6e 6f 74 20 6e 65 65 64 20 74   does not need t
af20: 6f 20 62 65 20 65 78 70 61 6e 64 65 64 2e 0a 20  o be expanded.. 
af30: 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
af40: 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33    pNew = sqlite3
af50: 45 78 70 72 4c 69 73 74 41 70 70 65 6e 64 28 70  ExprListAppend(p
af60: 50 61 72 73 65 2c 20 70 4e 65 77 2c 20 61 5b 6b  Parse, pNew, a[k
af70: 5d 2e 70 45 78 70 72 2c 20 30 29 3b 0a 20 20 20  ].pExpr, 0);.   
af80: 20 20 20 20 20 69 66 28 20 70 4e 65 77 20 29 7b       if( pNew ){
af90: 0a 20 20 20 20 20 20 20 20 20 20 70 4e 65 77 2d  .          pNew-
afa0: 3e 61 5b 70 4e 65 77 2d 3e 6e 45 78 70 72 2d 31  >a[pNew->nExpr-1
afb0: 5d 2e 7a 4e 61 6d 65 20 3d 20 61 5b 6b 5d 2e 7a  ].zName = a[k].z
afc0: 4e 61 6d 65 3b 0a 20 20 20 20 20 20 20 20 7d 65  Name;.        }e
afd0: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 72  lse{.          r
afe0: 63 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 7d  c = 1;.        }
aff0: 0a 20 20 20 20 20 20 20 20 61 5b 6b 5d 2e 70 45  .        a[k].pE
b000: 78 70 72 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  xpr = 0;.       
b010: 20 61 5b 6b 5d 2e 7a 4e 61 6d 65 20 3d 20 30 3b   a[k].zName = 0;
b020: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
b030: 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20 65 78        /* This ex
b040: 70 72 65 73 73 69 6f 6e 20 69 73 20 61 20 22 2a  pression is a "*
b050: 22 20 6f 72 20 61 20 22 54 41 42 4c 45 2e 2a 22  " or a "TABLE.*"
b060: 20 61 6e 64 20 6e 65 65 64 73 20 74 6f 20 62 65   and needs to be
b070: 0a 20 20 20 20 20 20 20 20 2a 2a 20 65 78 70 61  .        ** expa
b080: 6e 64 65 64 2e 20 2a 2f 0a 20 20 20 20 20 20 20  nded. */.       
b090: 20 69 6e 74 20 74 61 62 6c 65 53 65 65 6e 20 3d   int tableSeen =
b0a0: 20 30 3b 20 20 20 20 20 20 2f 2a 20 53 65 74 20   0;      /* Set 
b0b0: 74 6f 20 31 20 77 68 65 6e 20 54 41 42 4c 45 20  to 1 when TABLE 
b0c0: 6d 61 74 63 68 65 73 20 2a 2f 0a 20 20 20 20 20  matches */.     
b0d0: 20 20 20 63 68 61 72 20 2a 7a 54 4e 61 6d 65 3b     char *zTName;
b0e0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 74              /* t
b0f0: 65 78 74 20 6f 66 20 6e 61 6d 65 20 6f 66 20 54  ext of name of T
b100: 41 42 4c 45 20 2a 2f 0a 20 20 20 20 20 20 20 20  ABLE */.        
b110: 69 66 28 20 70 45 2d 3e 6f 70 3d 3d 54 4b 5f 44  if( pE->op==TK_D
b120: 4f 54 20 26 26 20 70 45 2d 3e 70 4c 65 66 74 20  OT && pE->pLeft 
b130: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 7a 54 4e  ){.          zTN
b140: 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d  ame = sqlite3Nam
b150: 65 46 72 6f 6d 54 6f 6b 65 6e 28 64 62 2c 20 26  eFromToken(db, &
b160: 70 45 2d 3e 70 4c 65 66 74 2d 3e 74 6f 6b 65 6e  pE->pLeft->token
b170: 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  );.        }else
b180: 7b 0a 20 20 20 20 20 20 20 20 20 20 7a 54 4e 61  {.          zTNa
b190: 6d 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  me = 0;.        
b1a0: 7d 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d  }.        for(i=
b1b0: 30 2c 20 70 46 72 6f 6d 3d 70 54 61 62 4c 69 73  0, pFrom=pTabLis
b1c0: 74 2d 3e 61 3b 20 69 3c 70 54 61 62 4c 69 73 74  t->a; i<pTabList
b1d0: 2d 3e 6e 53 72 63 3b 20 69 2b 2b 2c 20 70 46 72  ->nSrc; i++, pFr
b1e0: 6f 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20  om++){.         
b1f0: 20 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 70   Table *pTab = p
b200: 46 72 6f 6d 2d 3e 70 54 61 62 3b 0a 20 20 20 20  From->pTab;.    
b210: 20 20 20 20 20 20 63 68 61 72 20 2a 7a 54 61 62        char *zTab
b220: 4e 61 6d 65 20 3d 20 70 46 72 6f 6d 2d 3e 7a 41  Name = pFrom->zA
b230: 6c 69 61 73 3b 0a 20 20 20 20 20 20 20 20 20 20  lias;.          
b240: 69 66 28 20 7a 54 61 62 4e 61 6d 65 3d 3d 30 20  if( zTabName==0 
b250: 7c 7c 20 7a 54 61 62 4e 61 6d 65 5b 30 5d 3d 3d  || zTabName[0]==
b260: 30 20 29 7b 20 0a 20 20 20 20 20 20 20 20 20 20  0 ){ .          
b270: 20 20 7a 54 61 62 4e 61 6d 65 20 3d 20 70 54 61    zTabName = pTa
b280: 62 2d 3e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20  b->zName;.      
b290: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
b2a0: 69 66 28 20 7a 54 4e 61 6d 65 20 26 26 20 28 7a  if( zTName && (z
b2b0: 54 61 62 4e 61 6d 65 3d 3d 30 20 7c 7c 20 7a 54  TabName==0 || zT
b2c0: 61 62 4e 61 6d 65 5b 30 5d 3d 3d 30 20 7c 7c 20  abName[0]==0 || 
b2d0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
b2e0: 20 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70    sqlite3StrICmp
b2f0: 28 7a 54 4e 61 6d 65 2c 20 7a 54 61 62 4e 61 6d  (zTName, zTabNam
b300: 65 29 21 3d 30 29 20 29 7b 0a 20 20 20 20 20 20  e)!=0) ){.      
b310: 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a        continue;.
b320: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
b330: 20 20 20 20 20 20 74 61 62 6c 65 53 65 65 6e 20        tableSeen 
b340: 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20 66  = 1;.          f
b350: 6f 72 28 6a 3d 30 3b 20 6a 3c 70 54 61 62 2d 3e  or(j=0; j<pTab->
b360: 6e 43 6f 6c 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20  nCol; j++){.    
b370: 20 20 20 20 20 20 20 20 45 78 70 72 20 2a 70 45          Expr *pE
b380: 78 70 72 2c 20 2a 70 52 69 67 68 74 3b 0a 20 20  xpr, *pRight;.  
b390: 20 20 20 20 20 20 20 20 20 20 63 68 61 72 20 2a            char *
b3a0: 7a 4e 61 6d 65 20 3d 20 70 54 61 62 2d 3e 61 43  zName = pTab->aC
b3b0: 6f 6c 5b 6a 5d 2e 7a 4e 61 6d 65 3b 0a 0a 20 20  ol[j].zName;..  
b3c0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20            /* If 
b3d0: 61 20 63 6f 6c 75 6d 6e 20 69 73 20 6d 61 72 6b  a column is mark
b3e0: 65 64 20 61 73 20 27 68 69 64 64 65 6e 27 20 28  ed as 'hidden' (
b3f0: 63 75 72 72 65 6e 74 6c 79 20 6f 6e 6c 79 20 70  currently only p
b400: 6f 73 73 69 62 6c 65 0a 20 20 20 20 20 20 20 20  ossible.        
b410: 20 20 20 20 2a 2a 20 66 6f 72 20 76 69 72 74 75      ** for virtu
b420: 61 6c 20 74 61 62 6c 65 73 29 2c 20 64 6f 20 6e  al tables), do n
b430: 6f 74 20 69 6e 63 6c 75 64 65 20 69 74 20 69 6e  ot include it in
b440: 20 74 68 65 20 65 78 70 61 6e 64 65 64 0a 20 20   the expanded.  
b450: 20 20 20 20 20 20 20 20 20 20 2a 2a 20 72 65 73            ** res
b460: 75 6c 74 2d 73 65 74 20 6c 69 73 74 2e 0a 20 20  ult-set list..  
b470: 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20            */.   
b480: 20 20 20 20 20 20 20 20 20 69 66 28 20 49 73 48           if( IsH
b490: 69 64 64 65 6e 43 6f 6c 75 6d 6e 28 26 70 54 61  iddenColumn(&pTa
b4a0: 62 2d 3e 61 43 6f 6c 5b 6a 5d 29 20 29 7b 0a 20  b->aCol[j]) ){. 
b4b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 61 73 73               ass
b4c0: 65 72 74 28 49 73 56 69 72 74 75 61 6c 28 70 54  ert(IsVirtual(pT
b4d0: 61 62 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ab));.          
b4e0: 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20      continue;.  
b4f0: 20 20 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20            }..   
b500: 20 20 20 20 20 20 20 20 20 69 66 28 20 69 3e 30           if( i>0
b510: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
b520: 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74    struct SrcList
b530: 5f 69 74 65 6d 20 2a 70 4c 65 66 74 20 3d 20 26  _item *pLeft = &
b540: 70 54 61 62 4c 69 73 74 2d 3e 61 5b 69 2d 31 5d  pTabList->a[i-1]
b550: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
b560: 69 66 28 20 28 70 4c 65 66 74 5b 31 5d 2e 6a 6f  if( (pLeft[1].jo
b570: 69 6e 74 79 70 65 20 26 20 4a 54 5f 4e 41 54 55  intype & JT_NATU
b580: 52 41 4c 29 21 3d 30 20 26 26 0a 20 20 20 20 20  RAL)!=0 &&.     
b590: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b5a0: 20 20 20 63 6f 6c 75 6d 6e 49 6e 64 65 78 28 70     columnIndex(p
b5b0: 4c 65 66 74 2d 3e 70 54 61 62 2c 20 7a 4e 61 6d  Left->pTab, zNam
b5c0: 65 29 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  e)>=0 ){.       
b5d0: 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 20 61           /* In a
b5e0: 20 4e 41 54 55 52 41 4c 20 6a 6f 69 6e 2c 20 6f   NATURAL join, o
b5f0: 6d 69 74 20 74 68 65 20 6a 6f 69 6e 20 63 6f 6c  mit the join col
b600: 75 6d 6e 73 20 66 72 6f 6d 20 74 68 65 20 0a 20  umns from the . 
b610: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2a                 *
b620: 2a 20 74 61 62 6c 65 20 6f 6e 20 74 68 65 20 72  * table on the r
b630: 69 67 68 74 20 2a 2f 0a 20 20 20 20 20 20 20 20  ight */.        
b640: 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65          continue
b650: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
b660: 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  }.              
b670: 69 66 28 20 73 71 6c 69 74 65 33 49 64 4c 69 73  if( sqlite3IdLis
b680: 74 49 6e 64 65 78 28 70 4c 65 66 74 5b 31 5d 2e  tIndex(pLeft[1].
b690: 70 55 73 69 6e 67 2c 20 7a 4e 61 6d 65 29 3e 3d  pUsing, zName)>=
b6a0: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  0 ){.           
b6b0: 20 20 20 20 20 2f 2a 20 49 6e 20 61 20 6a 6f 69       /* In a joi
b6c0: 6e 20 77 69 74 68 20 61 20 55 53 49 4e 47 20 63  n with a USING c
b6d0: 6c 61 75 73 65 2c 20 6f 6d 69 74 20 63 6f 6c 75  lause, omit colu
b6e0: 6d 6e 73 20 69 6e 20 74 68 65 0a 20 20 20 20 20  mns in the.     
b6f0: 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 75 73             ** us
b700: 69 6e 67 20 63 6c 61 75 73 65 20 66 72 6f 6d 20  ing clause from 
b710: 74 68 65 20 74 61 62 6c 65 20 6f 6e 20 74 68 65  the table on the
b720: 20 72 69 67 68 74 2e 20 2a 2f 0a 20 20 20 20 20   right. */.     
b730: 20 20 20 20 20 20 20 20 20 20 20 63 6f 6e 74 69             conti
b740: 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20  nue;.           
b750: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20     }.           
b760: 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 70   }.            p
b770: 52 69 67 68 74 20 3d 20 73 71 6c 69 74 65 33 50  Right = sqlite3P
b780: 45 78 70 72 28 70 50 61 72 73 65 2c 20 54 4b 5f  Expr(pParse, TK_
b790: 49 44 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20  ID, 0, 0, 0);.  
b7a0: 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70 52            if( pR
b7b0: 69 67 68 74 3d 3d 30 20 29 20 62 72 65 61 6b 3b  ight==0 ) break;
b7c0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 65 74  .            set
b7d0: 51 75 6f 74 65 64 54 6f 6b 65 6e 28 70 50 61 72  QuotedToken(pPar
b7e0: 73 65 2c 20 26 70 52 69 67 68 74 2d 3e 74 6f 6b  se, &pRight->tok
b7f0: 65 6e 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  en, zName);.    
b800: 20 20 20 20 20 20 20 20 69 66 28 20 7a 54 61 62          if( zTab
b810: 4e 61 6d 65 20 26 26 20 28 6c 6f 6e 67 4e 61 6d  Name && (longNam
b820: 65 73 20 7c 7c 20 70 54 61 62 4c 69 73 74 2d 3e  es || pTabList->
b830: 6e 53 72 63 3e 31 29 20 29 7b 0a 20 20 20 20 20  nSrc>1) ){.     
b840: 20 20 20 20 20 20 20 20 20 45 78 70 72 20 2a 70           Expr *p
b850: 4c 65 66 74 20 3d 20 73 71 6c 69 74 65 33 50 45  Left = sqlite3PE
b860: 78 70 72 28 70 50 61 72 73 65 2c 20 54 4b 5f 49  xpr(pParse, TK_I
b870: 44 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20  D, 0, 0, 0);.   
b880: 20 20 20 20 20 20 20 20 20 20 20 70 45 78 70 72             pExpr
b890: 20 3d 20 73 71 6c 69 74 65 33 50 45 78 70 72 28   = sqlite3PExpr(
b8a0: 70 50 61 72 73 65 2c 20 54 4b 5f 44 4f 54 2c 20  pParse, TK_DOT, 
b8b0: 70 4c 65 66 74 2c 20 70 52 69 67 68 74 2c 20 30  pLeft, pRight, 0
b8c0: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  );.             
b8d0: 20 69 66 28 20 70 45 78 70 72 3d 3d 30 20 29 20   if( pExpr==0 ) 
b8e0: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20  break;.         
b8f0: 20 20 20 20 20 73 65 74 51 75 6f 74 65 64 54 6f       setQuotedTo
b900: 6b 65 6e 28 70 50 61 72 73 65 2c 20 26 70 4c 65  ken(pParse, &pLe
b910: 66 74 2d 3e 74 6f 6b 65 6e 2c 20 7a 54 61 62 4e  ft->token, zTabN
b920: 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ame);.          
b930: 20 20 20 20 73 65 74 54 6f 6b 65 6e 28 26 70 45      setToken(&pE
b940: 78 70 72 2d 3e 73 70 61 6e 2c 20 0a 20 20 20 20  xpr->span, .    
b950: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71                sq
b960: 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 64 62 2c  lite3MPrintf(db,
b970: 20 22 25 73 2e 25 73 22 2c 20 7a 54 61 62 4e 61   "%s.%s", zTabNa
b980: 6d 65 2c 20 7a 4e 61 6d 65 29 29 3b 0a 20 20 20  me, zName));.   
b990: 20 20 20 20 20 20 20 20 20 20 20 70 45 78 70 72             pExpr
b9a0: 2d 3e 73 70 61 6e 2e 64 79 6e 20 3d 20 31 3b 0a  ->span.dyn = 1;.
b9b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 45                pE
b9c0: 78 70 72 2d 3e 74 6f 6b 65 6e 2e 7a 20 3d 20 30  xpr->token.z = 0
b9d0: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
b9e0: 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 6e 20 3d  pExpr->token.n =
b9f0: 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20   0;.            
ba00: 20 20 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 64    pExpr->token.d
ba10: 79 6e 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  yn = 0;.        
ba20: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
ba30: 20 20 20 20 20 20 20 20 20 70 45 78 70 72 20 3d           pExpr =
ba40: 20 70 52 69 67 68 74 3b 0a 20 20 20 20 20 20 20   pRight;.       
ba50: 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 73 70         pExpr->sp
ba60: 61 6e 20 3d 20 70 45 78 70 72 2d 3e 74 6f 6b 65  an = pExpr->toke
ba70: 6e 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  n;.             
ba80: 20 70 45 78 70 72 2d 3e 73 70 61 6e 2e 64 79 6e   pExpr->span.dyn
ba90: 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20   = 0;.          
baa0: 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20    }.            
bab0: 69 66 28 20 6c 6f 6e 67 4e 61 6d 65 73 20 29 7b  if( longNames ){
bac0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70  .              p
bad0: 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 45 78 70  New = sqlite3Exp
bae0: 72 4c 69 73 74 41 70 70 65 6e 64 28 70 50 61 72  rListAppend(pPar
baf0: 73 65 2c 20 70 4e 65 77 2c 20 70 45 78 70 72 2c  se, pNew, pExpr,
bb00: 20 26 70 45 78 70 72 2d 3e 73 70 61 6e 29 3b 0a   &pExpr->span);.
bb10: 20 20 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73              }els
bb20: 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  e{.             
bb30: 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 45   pNew = sqlite3E
bb40: 78 70 72 4c 69 73 74 41 70 70 65 6e 64 28 70 50  xprListAppend(pP
bb50: 61 72 73 65 2c 20 70 4e 65 77 2c 20 70 45 78 70  arse, pNew, pExp
bb60: 72 2c 20 26 70 52 69 67 68 74 2d 3e 74 6f 6b 65  r, &pRight->toke
bb70: 6e 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  n);.            
bb80: 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  }.          }.  
bb90: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
bba0: 69 66 28 20 21 74 61 62 6c 65 53 65 65 6e 20 29  if( !tableSeen )
bbb0: 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  {.          if( 
bbc0: 7a 54 4e 61 6d 65 20 29 7b 0a 20 20 20 20 20 20  zTName ){.      
bbd0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72        sqlite3Err
bbe0: 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 6e  orMsg(pParse, "n
bbf0: 6f 20 73 75 63 68 20 74 61 62 6c 65 3a 20 25 73  o such table: %s
bc00: 22 2c 20 7a 54 4e 61 6d 65 29 3b 0a 20 20 20 20  ", zTName);.    
bc10: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
bc20: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
bc30: 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
bc40: 20 22 6e 6f 20 74 61 62 6c 65 73 20 73 70 65 63   "no tables spec
bc50: 69 66 69 65 64 22 29 3b 0a 20 20 20 20 20 20 20  ified");.       
bc60: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 72     }.          r
bc70: 63 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 7d  c = 1;.        }
bc80: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
bc90: 5f 66 72 65 65 28 7a 54 4e 61 6d 65 29 3b 0a 20  _free(zTName);. 
bca0: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
bcb0: 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
bcc0: 44 65 6c 65 74 65 28 70 45 4c 69 73 74 29 3b 0a  Delete(pEList);.
bcd0: 20 20 20 20 70 2d 3e 70 45 4c 69 73 74 20 3d 20      p->pEList = 
bce0: 70 4e 65 77 3b 0a 20 20 7d 0a 20 20 69 66 28 20  pNew;.  }.  if( 
bcf0: 70 2d 3e 70 45 4c 69 73 74 20 26 26 20 70 2d 3e  p->pEList && p->
bd00: 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3e 53 51  pEList->nExpr>SQ
bd10: 4c 49 54 45 5f 4d 41 58 5f 43 4f 4c 55 4d 4e 20  LITE_MAX_COLUMN 
bd20: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72  ){.    sqlite3Er
bd30: 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
bd40: 74 6f 6f 20 6d 61 6e 79 20 63 6f 6c 75 6d 6e 73  too many columns
bd50: 20 69 6e 20 72 65 73 75 6c 74 20 73 65 74 22 29   in result set")
bd60: 3b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54  ;.    rc = SQLIT
bd70: 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69  E_ERROR;.  }.  i
bd80: 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  f( db->mallocFai
bd90: 6c 65 64 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  led ){.    rc = 
bda0: 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
bdb0: 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
bdc0: 0a 0a 2f 2a 0a 2a 2a 20 70 45 20 69 73 20 61 20  ../*.** pE is a 
bdd0: 70 6f 69 6e 74 65 72 20 74 6f 20 61 6e 20 65 78  pointer to an ex
bde0: 70 72 65 73 73 69 6f 6e 20 77 68 69 63 68 20 69  pression which i
bdf0: 73 20 61 20 73 69 6e 67 6c 65 20 74 65 72 6d 20  s a single term 
be00: 69 6e 0a 2a 2a 20 4f 52 44 45 52 20 42 59 20 6f  in.** ORDER BY o
be10: 72 20 47 52 4f 55 50 20 42 59 20 63 6c 61 75 73  r GROUP BY claus
be20: 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 45 20 65  e..**.** If pE e
be30: 76 61 6c 75 61 74 65 73 20 74 6f 20 61 6e 20 69  valuates to an i
be40: 6e 74 65 67 65 72 20 63 6f 6e 73 74 61 6e 74 20  nteger constant 
be50: 69 2c 20 74 68 65 6e 20 72 65 74 75 72 6e 20 69  i, then return i
be60: 2e 0a 2a 2a 20 54 68 69 73 20 69 73 20 61 6e 20  ..** This is an 
be70: 69 6e 64 69 63 61 74 69 6f 6e 20 74 6f 20 74 68  indication to th
be80: 65 20 63 61 6c 6c 65 72 20 74 68 61 74 20 69 74  e caller that it
be90: 20 73 68 6f 75 6c 64 20 73 6f 72 74 0a 2a 2a 20   should sort.** 
bea0: 62 79 20 74 68 65 20 69 2d 74 68 20 63 6f 6c 75  by the i-th colu
beb0: 6d 6e 20 6f 66 20 74 68 65 20 72 65 73 75 6c 74  mn of the result
bec0: 20 73 65 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70   set..**.** If p
bed0: 45 20 69 73 20 61 20 77 65 6c 6c 2d 66 6f 72 6d  E is a well-form
bee0: 65 64 20 65 78 70 72 65 73 73 69 6f 6e 20 61 6e  ed expression an
bef0: 64 20 74 68 65 20 53 45 4c 45 43 54 20 73 74 61  d the SELECT sta
bf00: 74 65 6d 65 6e 74 0a 2a 2a 20 69 73 20 6e 6f 74  tement.** is not
bf10: 20 63 6f 6d 70 6f 75 6e 64 2c 20 74 68 65 6e 20   compound, then 
bf20: 72 65 74 75 72 6e 20 30 2e 20 20 54 68 69 73 20  return 0.  This 
bf30: 69 6e 64 69 63 61 74 65 73 20 74 6f 20 74 68 65  indicates to the
bf40: 0a 2a 2a 20 63 61 6c 6c 65 72 20 74 68 61 74 20  .** caller that 
bf50: 69 74 20 73 68 6f 75 6c 64 20 73 6f 72 74 20 62  it should sort b
bf60: 79 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74  y the value of t
bf70: 68 65 20 4f 52 44 45 52 20 42 59 0a 2a 2a 20 65  he ORDER BY.** e
bf80: 78 70 72 65 73 73 69 6f 6e 2e 0a 2a 2a 0a 2a 2a  xpression..**.**
bf90: 20 49 66 20 74 68 65 20 53 45 4c 45 43 54 20 69   If the SELECT i
bfa0: 73 20 63 6f 6d 70 6f 75 6e 64 2c 20 74 68 65 6e  s compound, then
bfb0: 20 61 74 74 65 6d 70 74 20 74 6f 20 6d 61 74 63   attempt to matc
bfc0: 68 20 70 45 20 61 67 61 69 6e 73 74 0a 2a 2a 20  h pE against.** 
bfd0: 72 65 73 75 6c 74 20 73 65 74 20 63 6f 6c 75 6d  result set colum
bfe0: 6e 73 20 69 6e 20 74 68 65 20 6c 65 66 74 2d 6d  ns in the left-m
bff0: 6f 73 74 20 53 45 4c 45 43 54 20 73 74 61 74 65  ost SELECT state
c000: 6d 65 6e 74 2e 20 20 52 65 74 75 72 6e 0a 2a 2a  ment.  Return.**
c010: 20 74 68 65 20 69 6e 64 65 78 20 69 20 6f 66 20   the index i of 
c020: 74 68 65 20 6d 61 74 63 68 69 6e 67 20 63 6f 6c  the matching col
c030: 75 6d 6e 2c 20 61 73 20 61 6e 20 69 6e 64 69 63  umn, as an indic
c040: 61 74 69 6f 6e 20 74 6f 20 74 68 65 20 0a 2a 2a  ation to the .**
c050: 20 63 61 6c 6c 65 72 20 74 68 61 74 20 69 74 20   caller that it 
c060: 73 68 6f 75 6c 64 20 73 6f 72 74 20 62 79 20 74  should sort by t
c070: 68 65 20 69 2d 74 68 20 63 6f 6c 75 6d 6e 2e 20  he i-th column. 
c080: 20 49 66 20 74 68 65 72 65 20 69 73 0a 2a 2a 20   If there is.** 
c090: 6e 6f 20 6d 61 74 63 68 2c 20 72 65 74 75 72 6e  no match, return
c0a0: 20 2d 31 20 61 6e 64 20 6c 65 61 76 65 20 61 6e   -1 and leave an
c0b0: 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 69   error message i
c0c0: 6e 20 70 50 61 72 73 65 2e 0a 2a 2f 0a 73 74 61  n pParse..*/.sta
c0d0: 74 69 63 20 69 6e 74 20 6d 61 74 63 68 4f 72 64  tic int matchOrd
c0e0: 65 72 42 79 54 65 72 6d 54 6f 45 78 70 72 4c 69  erByTermToExprLi
c0f0: 73 74 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  st(.  Parse *pPa
c100: 72 73 65 2c 20 20 20 20 20 2f 2a 20 50 61 72 73  rse,     /* Pars
c110: 69 6e 67 20 63 6f 6e 74 65 78 74 20 66 6f 72 20  ing context for 
c120: 65 72 72 6f 72 20 6d 65 73 73 61 67 65 73 20 2a  error messages *
c130: 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 53 65 6c  /.  Select *pSel
c140: 65 63 74 2c 20 20 20 2f 2a 20 54 68 65 20 53 45  ect,   /* The SE
c150: 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 77  LECT statement w
c160: 69 74 68 20 74 68 65 20 4f 52 44 45 52 20 42 59  ith the ORDER BY
c170: 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 45 78 70   clause */.  Exp
c180: 72 20 2a 70 45 2c 20 20 20 20 20 20 20 20 20 20  r *pE,          
c190: 2f 2a 20 54 68 65 20 73 70 65 63 69 66 69 63 20  /* The specific 
c1a0: 4f 52 44 45 52 20 42 59 20 74 65 72 6d 20 2a 2f  ORDER BY term */
c1b0: 0a 20 20 69 6e 74 20 69 64 78 2c 20 20 20 20 20  .  int idx,     
c1c0: 20 20 20 20 20 20 2f 2a 20 57 68 65 6e 20 4f 52        /* When OR
c1d0: 44 45 52 20 42 59 20 74 65 72 6d 20 69 73 20 74  DER BY term is t
c1e0: 68 69 73 20 2a 2f 0a 20 20 69 6e 74 20 69 73 43  his */.  int isC
c1f0: 6f 6d 70 6f 75 6e 64 2c 20 20 20 20 2f 2a 20 54  ompound,    /* T
c200: 72 75 65 20 69 66 20 74 68 69 73 20 69 73 20 61  rue if this is a
c210: 20 63 6f 6d 70 6f 75 6e 64 20 53 45 4c 45 43 54   compound SELECT
c220: 20 2a 2f 0a 20 20 75 38 20 2a 70 48 61 73 41 67   */.  u8 *pHasAg
c230: 67 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65  g        /* True
c240: 20 69 66 20 65 78 70 72 65 73 73 69 6f 6e 20 63   if expression c
c250: 6f 6e 74 61 69 6e 73 20 61 67 67 72 65 67 61 74  ontains aggregat
c260: 65 20 66 75 6e 63 74 69 6f 6e 73 20 2a 2f 0a 29  e functions */.)
c270: 7b 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20  {.  int i;      
c280: 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63         /* Loop c
c290: 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 45 78 70 72  ounter */.  Expr
c2a0: 4c 69 73 74 20 2a 70 45 4c 69 73 74 3b 20 20 2f  List *pEList;  /
c2b0: 2a 20 54 68 65 20 63 6f 6c 75 6d 6e 73 20 6f 66  * The columns of
c2c0: 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 20   the result set 
c2d0: 2a 2f 0a 20 20 4e 61 6d 65 43 6f 6e 74 65 78 74  */.  NameContext
c2e0: 20 6e 63 3b 20 20 20 20 2f 2a 20 4e 61 6d 65 20   nc;    /* Name 
c2f0: 63 6f 6e 74 65 78 74 20 66 6f 72 20 72 65 73 6f  context for reso
c300: 6c 76 69 6e 67 20 70 45 20 2a 2f 0a 0a 0a 20 20  lving pE */...  
c310: 2f 2a 20 49 66 20 74 68 65 20 74 65 72 6d 20 69  /* If the term i
c320: 73 20 61 6e 20 69 6e 74 65 67 65 72 20 63 6f 6e  s an integer con
c330: 73 74 61 6e 74 2c 20 72 65 74 75 72 6e 20 74 68  stant, return th
c340: 65 20 76 61 6c 75 65 20 6f 66 20 74 68 61 74 0a  e value of that.
c350: 20 20 2a 2a 20 63 6f 6e 73 74 61 6e 74 20 2a 2f    ** constant */
c360: 0a 20 20 70 45 4c 69 73 74 20 3d 20 70 53 65 6c  .  pEList = pSel
c370: 65 63 74 2d 3e 70 45 4c 69 73 74 3b 0a 20 20 69  ect->pEList;.  i
c380: 66 28 20 73 71 6c 69 74 65 33 45 78 70 72 49 73  f( sqlite3ExprIs
c390: 49 6e 74 65 67 65 72 28 70 45 2c 20 26 69 29 20  Integer(pE, &i) 
c3a0: 29 7b 0a 20 20 20 20 69 66 28 20 69 3c 3d 30 20  ){.    if( i<=0 
c3b0: 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 69  ){.      /* If i
c3c0: 20 69 73 20 74 6f 6f 20 73 6d 61 6c 6c 2c 20 6d   is too small, m
c3d0: 61 6b 65 20 69 74 20 74 6f 6f 20 62 69 67 2e 20  ake it too big. 
c3e0: 20 54 68 61 74 20 77 61 79 20 74 68 65 20 63 61   That way the ca
c3f0: 6c 6c 69 6e 67 0a 20 20 20 20 20 20 2a 2a 20 66  lling.      ** f
c400: 75 6e 63 74 69 6f 6e 20 73 74 69 6c 6c 20 73 65  unction still se
c410: 65 73 20 61 20 76 61 6c 75 65 20 74 68 61 74 20  es a value that 
c420: 69 73 20 6f 75 74 20 6f 66 20 72 61 6e 67 65 2c  is out of range,
c430: 20 62 75 74 20 64 6f 65 73 0a 20 20 20 20 20 20   but does.      
c440: 2a 2a 20 6e 6f 74 20 63 6f 6e 66 75 73 65 20 74  ** not confuse t
c450: 68 65 20 63 6f 6c 75 6d 6e 20 6e 75 6d 62 65 72  he column number
c460: 20 77 69 74 68 20 30 20 6f 72 20 2d 31 20 72 65   with 0 or -1 re
c470: 73 75 6c 74 20 63 6f 64 65 2e 0a 20 20 20 20 20  sult code..     
c480: 20 2a 2f 0a 20 20 20 20 20 20 69 20 3d 20 70 45   */.      i = pE
c490: 4c 69 73 74 2d 3e 6e 45 78 70 72 2b 31 3b 0a 20  List->nExpr+1;. 
c4a0: 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20     }.    return 
c4b0: 69 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20  i;.  }..  /* If 
c4c0: 74 68 65 20 74 65 72 6d 20 69 73 20 61 20 73 69  the term is a si
c4d0: 6d 70 6c 65 20 69 64 65 6e 74 69 66 69 65 72 20  mple identifier 
c4e0: 74 68 61 74 20 74 72 79 20 74 6f 20 6d 61 74 63  that try to matc
c4f0: 68 20 74 68 61 74 20 69 64 65 6e 74 69 66 69 65  h that identifie
c500: 72 0a 20 20 2a 2a 20 61 67 61 69 6e 73 74 20 61  r.  ** against a
c510: 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 20 69 6e 20   column name in 
c520: 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 2e 0a  the result set..
c530: 20 20 2a 2f 0a 20 20 69 66 28 20 70 45 2d 3e 6f    */.  if( pE->o
c540: 70 3d 3d 54 4b 5f 49 44 20 7c 7c 20 28 70 45 2d  p==TK_ID || (pE-
c550: 3e 6f 70 3d 3d 54 4b 5f 53 54 52 49 4e 47 20 26  >op==TK_STRING &
c560: 26 20 70 45 2d 3e 74 6f 6b 65 6e 2e 7a 5b 30 5d  & pE->token.z[0]
c570: 21 3d 27 5c 27 27 29 20 29 7b 0a 20 20 20 20 73  !='\'') ){.    s
c580: 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61  qlite3 *db = pPa
c590: 72 73 65 2d 3e 64 62 3b 0a 20 20 20 20 63 68 61  rse->db;.    cha
c5a0: 72 20 2a 7a 43 6f 6c 20 3d 20 73 71 6c 69 74 65  r *zCol = sqlite
c5b0: 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 64  3NameFromToken(d
c5c0: 62 2c 20 26 70 45 2d 3e 74 6f 6b 65 6e 29 3b 0a  b, &pE->token);.
c5d0: 20 20 20 20 69 66 28 20 7a 43 6f 6c 3d 3d 30 20      if( zCol==0 
c5e0: 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
c5f0: 2d 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f  -1;.    }.    fo
c600: 72 28 69 3d 30 3b 20 69 3c 70 45 4c 69 73 74 2d  r(i=0; i<pEList-
c610: 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20  >nExpr; i++){.  
c620: 20 20 20 20 63 68 61 72 20 2a 7a 41 73 20 3d 20      char *zAs = 
c630: 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61  pEList->a[i].zNa
c640: 6d 65 3b 0a 20 20 20 20 20 20 69 66 28 20 7a 41  me;.      if( zA
c650: 73 21 3d 30 20 26 26 20 73 71 6c 69 74 65 33 53  s!=0 && sqlite3S
c660: 74 72 49 43 6d 70 28 7a 41 73 2c 20 7a 43 6f 6c  trICmp(zAs, zCol
c670: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )==0 ){.        
c680: 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 43 6f  sqlite3_free(zCo
c690: 6c 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75  l);.        retu
c6a0: 72 6e 20 69 2b 31 3b 0a 20 20 20 20 20 20 7d 0a  rn i+1;.      }.
c6b0: 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
c6c0: 33 5f 66 72 65 65 28 7a 43 6f 6c 29 3b 0a 20 20  3_free(zCol);.  
c6d0: 7d 0a 0a 20 20 2f 2a 20 52 65 73 6f 6c 76 65 20  }..  /* Resolve 
c6e0: 61 6c 6c 20 6e 61 6d 65 73 20 69 6e 20 74 68 65  all names in the
c6f0: 20 4f 52 44 45 52 20 42 59 20 74 65 72 6d 20 65   ORDER BY term e
c700: 78 70 72 65 73 73 69 6f 6e 0a 20 20 2a 2f 0a 20  xpression.  */. 
c710: 20 6d 65 6d 73 65 74 28 26 6e 63 2c 20 30 2c 20   memset(&nc, 0, 
c720: 73 69 7a 65 6f 66 28 6e 63 29 29 3b 0a 20 20 6e  sizeof(nc));.  n
c730: 63 2e 70 50 61 72 73 65 20 3d 20 70 50 61 72 73  c.pParse = pPars
c740: 65 3b 0a 20 20 6e 63 2e 70 53 72 63 4c 69 73 74  e;.  nc.pSrcList
c750: 20 3d 20 70 53 65 6c 65 63 74 2d 3e 70 53 72 63   = pSelect->pSrc
c760: 3b 0a 20 20 6e 63 2e 70 45 4c 69 73 74 20 3d 20  ;.  nc.pEList = 
c770: 70 45 4c 69 73 74 3b 0a 20 20 6e 63 2e 61 6c 6c  pEList;.  nc.all
c780: 6f 77 41 67 67 20 3d 20 31 3b 0a 20 20 6e 63 2e  owAgg = 1;.  nc.
c790: 6e 45 72 72 20 3d 20 30 3b 0a 20 20 69 66 28 20  nErr = 0;.  if( 
c7a0: 73 71 6c 69 74 65 33 45 78 70 72 52 65 73 6f 6c  sqlite3ExprResol
c7b0: 76 65 4e 61 6d 65 73 28 26 6e 63 2c 20 70 45 29  veNames(&nc, pE)
c7c0: 20 29 7b 0a 20 20 20 20 69 66 28 20 69 73 43 6f   ){.    if( isCo
c7d0: 6d 70 6f 75 6e 64 20 29 7b 0a 20 20 20 20 20 20  mpound ){.      
c7e0: 73 71 6c 69 74 65 33 45 72 72 6f 72 43 6c 65 61  sqlite3ErrorClea
c7f0: 72 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20  r(pParse);.     
c800: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d   return 0;.    }
c810: 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 65 74 75  else{.      retu
c820: 72 6e 20 2d 31 3b 0a 20 20 20 20 7d 0a 20 20 7d  rn -1;.    }.  }
c830: 0a 20 20 69 66 28 20 6e 63 2e 68 61 73 41 67 67  .  if( nc.hasAgg
c840: 20 26 26 20 70 48 61 73 41 67 67 20 29 7b 0a 20   && pHasAgg ){. 
c850: 20 20 20 2a 70 48 61 73 41 67 67 20 3d 20 31 3b     *pHasAgg = 1;
c860: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46 6f 72 20 61  .  }..  /* For a
c870: 20 63 6f 6d 70 6f 75 6e 64 20 53 45 4c 45 43 54   compound SELECT
c880: 2c 20 77 65 20 6e 65 65 64 20 74 6f 20 74 72 79  , we need to try
c890: 20 74 6f 20 6d 61 74 63 68 20 74 68 65 20 4f 52   to match the OR
c8a0: 44 45 52 20 42 59 0a 20 20 2a 2a 20 65 78 70 72  DER BY.  ** expr
c8b0: 65 73 73 69 6f 6e 20 61 67 61 69 6e 73 74 20 61  ession against a
c8c0: 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 69 6e 20  n expression in 
c8d0: 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 0a 20  the result set. 
c8e0: 20 2a 2f 0a 20 20 69 66 28 20 69 73 43 6f 6d 70   */.  if( isComp
c8f0: 6f 75 6e 64 20 29 7b 0a 20 20 20 20 66 6f 72 28  ound ){.    for(
c900: 69 3d 30 3b 20 69 3c 70 45 4c 69 73 74 2d 3e 6e  i=0; i<pEList->n
c910: 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  Expr; i++){.    
c920: 20 20 69 66 28 20 73 71 6c 69 74 65 33 45 78 70    if( sqlite3Exp
c930: 72 43 6f 6d 70 61 72 65 28 70 45 4c 69 73 74 2d  rCompare(pEList-
c940: 3e 61 5b 69 5d 2e 70 45 78 70 72 2c 20 70 45 29  >a[i].pExpr, pE)
c950: 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75   ){.        retu
c960: 72 6e 20 69 2b 31 3b 0a 20 20 20 20 20 20 7d 0a  rn i+1;.      }.
c970: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
c980: 72 6e 20 30 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  rn 0;.}.../*.** 
c990: 41 6e 61 6c 79 7a 65 20 61 6e 64 20 4f 52 44 45  Analyze and ORDE
c9a0: 52 20 42 59 20 6f 72 20 47 52 4f 55 50 20 42 59  R BY or GROUP BY
c9b0: 20 63 6c 61 75 73 65 20 69 6e 20 61 20 73 69 6d   clause in a sim
c9c0: 70 6c 65 20 53 45 4c 45 43 54 20 73 74 61 74 65  ple SELECT state
c9d0: 6d 65 6e 74 2e 0a 2a 2a 20 52 65 74 75 72 6e 20  ment..** Return 
c9e0: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 65 72  the number of er
c9f0: 72 6f 72 73 20 73 65 65 6e 2e 0a 2a 2a 0a 2a 2a  rors seen..**.**
ca00: 20 45 76 65 72 79 20 74 65 72 6d 20 6f 66 20 74   Every term of t
ca10: 68 65 20 4f 52 44 45 52 20 42 59 20 6f 72 20 47  he ORDER BY or G
ca20: 52 4f 55 50 20 42 59 20 63 6c 61 75 73 65 20 6e  ROUP BY clause n
ca30: 65 65 64 73 20 74 6f 20 62 65 20 61 6e 0a 2a 2a  eeds to be an.**
ca40: 20 65 78 70 72 65 73 73 69 6f 6e 2e 20 20 49 66   expression.  If
ca50: 20 61 6e 79 20 65 78 70 72 65 73 73 69 6f 6e 20   any expression 
ca60: 69 73 20 61 6e 20 69 6e 74 65 67 65 72 20 63 6f  is an integer co
ca70: 6e 73 74 61 6e 74 2c 20 74 68 65 6e 0a 2a 2a 20  nstant, then.** 
ca80: 74 68 61 74 20 65 78 70 72 65 73 73 69 6f 6e 20  that expression 
ca90: 69 73 20 72 65 70 6c 61 63 65 64 20 62 79 20 74  is replaced by t
caa0: 68 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67  he corresponding
cab0: 20 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 20   .** expression 
cac0: 66 72 6f 6d 20 74 68 65 20 72 65 73 75 6c 74 20  from the result 
cad0: 73 65 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  set..*/.static i
cae0: 6e 74 20 70 72 6f 63 65 73 73 4f 72 64 65 72 47  nt processOrderG
caf0: 72 6f 75 70 42 79 28 0a 20 20 50 61 72 73 65 20  roupBy(.  Parse 
cb00: 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20  *pParse,        
cb10: 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65  /* Parsing conte
cb20: 78 74 2e 20 20 4c 65 61 76 65 20 65 72 72 6f 72  xt.  Leave error
cb30: 20 6d 65 73 73 61 67 65 73 20 68 65 72 65 20 2a   messages here *
cb40: 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 53 65 6c  /.  Select *pSel
cb50: 65 63 74 2c 20 20 20 20 20 20 2f 2a 20 54 68 65  ect,      /* The
cb60: 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
cb70: 74 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65  t containing the
cb80: 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 45 78 70   clause */.  Exp
cb90: 72 4c 69 73 74 20 2a 70 4f 72 64 65 72 42 79 2c  rList *pOrderBy,
cba0: 20 20 20 2f 2a 20 54 68 65 20 4f 52 44 45 52 20     /* The ORDER 
cbb0: 42 59 20 6f 72 20 47 52 4f 55 50 20 42 59 20 63  BY or GROUP BY c
cbc0: 6c 61 75 73 65 20 74 6f 20 62 65 20 70 72 6f 63  lause to be proc
cbd0: 65 73 73 65 64 20 2a 2f 0a 20 20 69 6e 74 20 69  essed */.  int i
cbe0: 73 4f 72 64 65 72 2c 20 20 20 20 20 20 20 20 20  sOrder,         
cbf0: 20 2f 2a 20 31 20 66 6f 72 20 4f 52 44 45 52 20   /* 1 for ORDER 
cc00: 42 59 2e 20 20 30 20 66 6f 72 20 47 52 4f 55 50  BY.  0 for GROUP
cc10: 20 42 59 20 2a 2f 0a 20 20 75 38 20 2a 70 48 61   BY */.  u8 *pHa
cc20: 73 41 67 67 20 20 20 20 20 20 20 20 20 20 20 2f  sAgg           /
cc30: 2a 20 53 65 74 20 74 6f 20 54 52 55 45 20 69 66  * Set to TRUE if
cc40: 20 61 6e 79 20 74 65 72 6d 20 63 6f 6e 74 61 69   any term contai
cc50: 6e 73 20 61 6e 20 61 67 67 72 65 67 61 74 65 20  ns an aggregate 
cc60: 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20  */.){.  int i;. 
cc70: 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70   sqlite3 *db = p
cc80: 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 45 78 70  Parse->db;.  Exp
cc90: 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 3b 0a 0a  rList *pEList;..
cca0: 20 20 69 66 28 20 70 4f 72 64 65 72 42 79 3d 3d    if( pOrderBy==
ccb0: 30 20 7c 7c 20 70 50 61 72 73 65 2d 3e 64 62 2d  0 || pParse->db-
ccc0: 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20  >mallocFailed ) 
ccd0: 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20  return 0;.  if( 
cce0: 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 3e  pOrderBy->nExpr>
ccf0: 53 51 4c 49 54 45 5f 4d 41 58 5f 43 4f 4c 55 4d  SQLITE_MAX_COLUM
cd00: 4e 20 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63  N ){.    const c
cd10: 68 61 72 20 2a 7a 54 79 70 65 20 3d 20 69 73 4f  har *zType = isO
cd20: 72 64 65 72 20 3f 20 22 4f 52 44 45 52 22 20 3a  rder ? "ORDER" :
cd30: 20 22 47 52 4f 55 50 22 3b 0a 20 20 20 20 73 71   "GROUP";.    sq
cd40: 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
cd50: 61 72 73 65 2c 20 22 74 6f 6f 20 6d 61 6e 79 20  arse, "too many 
cd60: 74 65 72 6d 73 20 69 6e 20 25 73 20 42 59 20 63  terms in %s BY c
cd70: 6c 61 75 73 65 22 2c 20 7a 54 79 70 65 29 3b 0a  lause", zType);.
cd80: 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20      return 1;.  
cd90: 7d 0a 20 20 70 45 4c 69 73 74 20 3d 20 70 53 65  }.  pEList = pSe
cda0: 6c 65 63 74 2d 3e 70 45 4c 69 73 74 3b 0a 20 20  lect->pEList;.  
cdb0: 69 66 28 20 70 45 4c 69 73 74 3d 3d 30 20 29 7b  if( pEList==0 ){
cdc0: 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20  .    return 0;. 
cdd0: 20 7d 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c   }.  for(i=0; i<
cde0: 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 3b  pOrderBy->nExpr;
cdf0: 20 69 2b 2b 29 7b 0a 20 20 20 20 69 6e 74 20 69   i++){.    int i
ce00: 43 6f 6c 3b 0a 20 20 20 20 45 78 70 72 20 2a 70  Col;.    Expr *p
ce10: 45 20 3d 20 70 4f 72 64 65 72 42 79 2d 3e 61 5b  E = pOrderBy->a[
ce20: 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 69 43  i].pExpr;.    iC
ce30: 6f 6c 20 3d 20 6d 61 74 63 68 4f 72 64 65 72 42  ol = matchOrderB
ce40: 79 54 65 72 6d 54 6f 45 78 70 72 4c 69 73 74 28  yTermToExprList(
ce50: 70 50 61 72 73 65 2c 20 70 53 65 6c 65 63 74 2c  pParse, pSelect,
ce60: 20 70 45 2c 20 69 2b 31 2c 20 30 2c 20 70 48 61   pE, i+1, 0, pHa
ce70: 73 41 67 67 29 3b 0a 20 20 20 20 69 66 28 20 69  sAgg);.    if( i
ce80: 43 6f 6c 3c 30 20 29 7b 0a 20 20 20 20 20 20 72  Col<0 ){.      r
ce90: 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20  eturn 1;.    }. 
cea0: 20 20 20 69 66 28 20 69 43 6f 6c 3e 70 45 4c 69     if( iCol>pELi
ceb0: 73 74 2d 3e 6e 45 78 70 72 20 29 7b 0a 20 20 20  st->nExpr ){.   
cec0: 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
ced0: 54 79 70 65 20 3d 20 69 73 4f 72 64 65 72 20 3f  Type = isOrder ?
cee0: 20 22 4f 52 44 45 52 22 20 3a 20 22 47 52 4f 55   "ORDER" : "GROU
cef0: 50 22 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  P";.      sqlite
cf00: 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
cf10: 2c 20 0a 20 20 20 20 20 20 20 20 20 22 25 72 20  , .         "%r 
cf20: 25 73 20 42 59 20 74 65 72 6d 20 6f 75 74 20 6f  %s BY term out o
cf30: 66 20 72 61 6e 67 65 20 2d 20 73 68 6f 75 6c 64  f range - should
cf40: 20 62 65 20 22 0a 20 20 20 20 20 20 20 20 20 22   be ".         "
cf50: 62 65 74 77 65 65 6e 20 31 20 61 6e 64 20 25 64  between 1 and %d
cf60: 22 2c 20 69 2b 31 2c 20 7a 54 79 70 65 2c 20 70  ", i+1, zType, p
cf70: 45 4c 69 73 74 2d 3e 6e 45 78 70 72 29 3b 0a 20  EList->nExpr);. 
cf80: 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20       return 1;. 
cf90: 20 20 20 7d 0a 20 20 20 20 69 66 28 20 69 43 6f     }.    if( iCo
cfa0: 6c 3e 30 20 29 7b 0a 20 20 20 20 20 20 43 6f 6c  l>0 ){.      Col
cfb0: 6c 53 65 71 20 2a 70 43 6f 6c 6c 20 3d 20 70 45  lSeq *pColl = pE
cfc0: 2d 3e 70 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 69  ->pColl;.      i
cfd0: 6e 74 20 66 6c 61 67 73 20 3d 20 70 45 2d 3e 66  nt flags = pE->f
cfe0: 6c 61 67 73 20 26 20 45 50 5f 45 78 70 43 6f 6c  lags & EP_ExpCol
cff0: 6c 61 74 65 3b 0a 20 20 20 20 20 20 73 71 6c 69  late;.      sqli
d000: 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 70 45  te3ExprDelete(pE
d010: 29 3b 0a 20 20 20 20 20 20 70 45 20 3d 20 73 71  );.      pE = sq
d020: 6c 69 74 65 33 45 78 70 72 44 75 70 28 64 62 2c  lite3ExprDup(db,
d030: 20 70 45 4c 69 73 74 2d 3e 61 5b 69 43 6f 6c 2d   pEList->a[iCol-
d040: 31 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20 20 20  1].pExpr);.     
d050: 20 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e   pOrderBy->a[i].
d060: 70 45 78 70 72 20 3d 20 70 45 3b 0a 20 20 20 20  pExpr = pE;.    
d070: 20 20 69 66 28 20 70 45 20 26 26 20 70 43 6f 6c    if( pE && pCol
d080: 6c 20 26 26 20 66 6c 61 67 73 20 29 7b 0a 20 20  l && flags ){.  
d090: 20 20 20 20 20 20 70 45 2d 3e 70 43 6f 6c 6c 20        pE->pColl 
d0a0: 3d 20 70 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 20  = pColl;.       
d0b0: 20 70 45 2d 3e 66 6c 61 67 73 20 7c 3d 20 66 6c   pE->flags |= fl
d0c0: 61 67 73 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ags;.      }.   
d0d0: 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
d0e0: 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6e 61 6c  0;.}../*.** Anal
d0f0: 79 7a 65 20 61 6e 64 20 4f 52 44 45 52 20 42 59  yze and ORDER BY
d100: 20 6f 72 20 47 52 4f 55 50 20 42 59 20 63 6c 61   or GROUP BY cla
d110: 75 73 65 20 69 6e 20 61 20 53 45 4c 45 43 54 20  use in a SELECT 
d120: 73 74 61 74 65 6d 65 6e 74 2e 20 20 52 65 74 75  statement.  Retu
d130: 72 6e 0a 2a 2a 20 74 68 65 20 6e 75 6d 62 65 72  rn.** the number
d140: 20 6f 66 20 65 72 72 6f 72 73 20 73 65 65 6e 2e   of errors seen.
d150: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 72 6f 63 65  .**.** The proce
d160: 73 73 69 6e 67 20 64 65 70 65 6e 64 73 20 6f 6e  ssing depends on
d170: 20 77 68 65 74 68 65 72 20 74 68 65 20 53 45 4c   whether the SEL
d180: 45 43 54 20 69 73 20 73 69 6d 70 6c 65 20 6f 72  ECT is simple or
d190: 20 63 6f 6d 70 6f 75 6e 64 2e 0a 2a 2a 20 46 6f   compound..** Fo
d1a0: 72 20 61 20 73 69 6d 70 6c 65 20 53 45 4c 45 43  r a simple SELEC
d1b0: 54 20 73 74 61 74 65 6d 65 6e 74 2c 20 65 76 72  T statement, evr
d1c0: 79 20 74 65 72 6d 20 6f 66 20 74 68 65 20 4f 52  y term of the OR
d1d0: 44 45 52 20 42 59 20 6f 72 20 47 52 4f 55 50 20  DER BY or GROUP 
d1e0: 42 59 0a 2a 2a 20 63 6c 61 75 73 65 20 6e 65 65  BY.** clause nee
d1f0: 64 73 20 74 6f 20 62 65 20 61 6e 20 65 78 70 72  ds to be an expr
d200: 65 73 73 69 6f 6e 2e 20 20 49 66 20 61 6e 79 20  ession.  If any 
d210: 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 61 6e  expression is an
d220: 20 69 6e 74 65 67 65 72 0a 2a 2a 20 63 6f 6e 73   integer.** cons
d230: 74 61 6e 74 2c 20 74 68 65 6e 20 74 68 61 74 20  tant, then that 
d240: 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 72 65  expression is re
d250: 70 6c 61 63 65 64 20 62 79 20 74 68 65 20 63 6f  placed by the co
d260: 72 72 65 73 70 6f 6e 64 69 6e 67 20 0a 2a 2a 20  rresponding .** 
d270: 65 78 70 72 65 73 73 69 6f 6e 20 66 72 6f 6d 20  expression from 
d280: 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 2e 0a  the result set..
d290: 2a 2a 0a 2a 2a 20 46 6f 72 20 63 6f 6d 70 6f 75  **.** For compou
d2a0: 6e 64 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d  nd SELECT statem
d2b0: 65 6e 74 73 2c 20 65 76 65 72 79 20 65 78 70 72  ents, every expr
d2c0: 65 73 73 69 6f 6e 20 6e 65 65 64 73 20 74 6f 20  ession needs to 
d2d0: 62 65 20 6f 66 0a 2a 2a 20 74 79 70 65 20 54 4b  be of.** type TK
d2e0: 5f 43 4f 4c 55 4d 4e 20 77 69 74 68 20 61 20 69  _COLUMN with a i
d2f0: 54 61 62 6c 65 20 76 61 6c 75 65 20 61 73 20 67  Table value as g
d300: 69 76 65 6e 20 69 6e 20 74 68 65 20 34 74 68 20  iven in the 4th 
d310: 70 61 72 61 6d 65 74 65 72 2e 0a 2a 2a 20 49 66  parameter..** If
d320: 20 61 6e 79 20 65 78 70 72 65 73 73 69 6f 6e 20   any expression 
d330: 69 73 20 61 6e 20 69 6e 74 65 67 65 72 2c 20 74  is an integer, t
d340: 68 61 74 20 62 65 63 6f 6d 65 73 20 74 68 65 20  hat becomes the 
d350: 63 6f 6c 75 6d 6e 20 6e 75 6d 62 65 72 2e 0a 2a  column number..*
d360: 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 6d 61 74  * Otherwise, mat
d370: 63 68 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  ch the expressio
d380: 6e 20 61 67 61 69 6e 73 74 20 72 65 73 75 6c 74  n against result
d390: 20 73 65 74 20 63 6f 6c 75 6d 6e 73 20 66 72 6f   set columns fro
d3a0: 6d 0a 2a 2a 20 74 68 65 20 6c 65 66 74 2d 6d 6f  m.** the left-mo
d3b0: 73 74 20 53 45 4c 45 43 54 2e 0a 2a 2f 0a 73 74  st SELECT..*/.st
d3c0: 61 74 69 63 20 69 6e 74 20 70 72 6f 63 65 73 73  atic int process
d3d0: 43 6f 6d 70 6f 75 6e 64 4f 72 64 65 72 42 79 28  CompoundOrderBy(
d3e0: 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
d3f0: 2c 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73  ,        /* Pars
d400: 69 6e 67 20 63 6f 6e 74 65 78 74 2e 20 20 4c 65  ing context.  Le
d410: 61 76 65 20 65 72 72 6f 72 20 6d 65 73 73 61 67  ave error messag
d420: 65 73 20 68 65 72 65 20 2a 2f 0a 20 20 53 65 6c  es here */.  Sel
d430: 65 63 74 20 2a 70 53 65 6c 65 63 74 2c 20 20 20  ect *pSelect,   
d440: 20 20 20 2f 2a 20 54 68 65 20 53 45 4c 45 43 54     /* The SELECT
d450: 20 73 74 61 74 65 6d 65 6e 74 20 63 6f 6e 74 61   statement conta
d460: 69 6e 69 6e 67 20 74 68 65 20 4f 52 44 45 52 20  ining the ORDER 
d470: 42 59 20 2a 2f 0a 20 20 69 6e 74 20 69 54 61 62  BY */.  int iTab
d480: 6c 65 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  le            /*
d490: 20 4f 75 74 70 75 74 20 74 61 62 6c 65 20 66 6f   Output table fo
d4a0: 72 20 63 6f 6d 70 6f 75 6e 64 20 53 45 4c 45 43  r compound SELEC
d4b0: 54 20 73 74 61 74 65 6d 65 6e 74 73 20 2a 2f 0a  T statements */.
d4c0: 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 45 78  ){.  int i;.  Ex
d4d0: 70 72 4c 69 73 74 20 2a 70 4f 72 64 65 72 42 79  prList *pOrderBy
d4e0: 3b 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45  ;.  ExprList *pE
d4f0: 4c 69 73 74 3b 0a 20 20 73 71 6c 69 74 65 33 20  List;.  sqlite3 
d500: 2a 64 62 3b 0a 20 20 69 6e 74 20 6d 6f 72 65 54  *db;.  int moreT
d510: 6f 44 6f 20 3d 20 31 3b 0a 0a 20 20 70 4f 72 64  oDo = 1;..  pOrd
d520: 65 72 42 79 20 3d 20 70 53 65 6c 65 63 74 2d 3e  erBy = pSelect->
d530: 70 4f 72 64 65 72 42 79 3b 0a 20 20 69 66 28 20  pOrderBy;.  if( 
d540: 70 4f 72 64 65 72 42 79 3d 3d 30 20 29 20 72 65  pOrderBy==0 ) re
d550: 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 70 4f  turn 0;.  if( pO
d560: 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 3e 53 51  rderBy->nExpr>SQ
d570: 4c 49 54 45 5f 4d 41 58 5f 43 4f 4c 55 4d 4e 20  LITE_MAX_COLUMN 
d580: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72  ){.    sqlite3Er
d590: 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
d5a0: 74 6f 6f 20 6d 61 6e 79 20 74 65 72 6d 73 20 69  too many terms i
d5b0: 6e 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73  n ORDER BY claus
d5c0: 65 22 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  e");.    return 
d5d0: 31 3b 0a 20 20 7d 0a 20 20 64 62 20 3d 20 70 50  1;.  }.  db = pP
d5e0: 61 72 73 65 2d 3e 64 62 3b 0a 20 20 66 6f 72 28  arse->db;.  for(
d5f0: 69 3d 30 3b 20 69 3c 70 4f 72 64 65 72 42 79 2d  i=0; i<pOrderBy-
d600: 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20  >nExpr; i++){.  
d610: 20 20 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d    pOrderBy->a[i]
d620: 2e 64 6f 6e 65 20 3d 20 30 3b 0a 20 20 7d 0a 20  .done = 0;.  }. 
d630: 20 77 68 69 6c 65 28 20 70 53 65 6c 65 63 74 2d   while( pSelect-
d640: 3e 70 50 72 69 6f 72 20 29 7b 0a 20 20 20 20 70  >pPrior ){.    p
d650: 53 65 6c 65 63 74 20 3d 20 70 53 65 6c 65 63 74  Select = pSelect
d660: 2d 3e 70 50 72 69 6f 72 3b 0a 20 20 7d 0a 20 20  ->pPrior;.  }.  
d670: 77 68 69 6c 65 28 20 70 53 65 6c 65 63 74 20 26  while( pSelect &
d680: 26 20 6d 6f 72 65 54 6f 44 6f 20 29 7b 0a 20 20  & moreToDo ){.  
d690: 20 20 6d 6f 72 65 54 6f 44 6f 20 3d 20 30 3b 0a    moreToDo = 0;.
d6a0: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70      for(i=0; i<p
d6b0: 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 3b 20  OrderBy->nExpr; 
d6c0: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  i++){.      int 
d6d0: 69 43 6f 6c 20 3d 20 2d 31 3b 0a 20 20 20 20 20  iCol = -1;.     
d6e0: 20 45 78 70 72 20 2a 70 45 2c 20 2a 70 44 75 70   Expr *pE, *pDup
d6f0: 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4f 72 64  ;.      if( pOrd
d700: 65 72 42 79 2d 3e 61 5b 69 5d 2e 64 6f 6e 65 20  erBy->a[i].done 
d710: 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
d720: 20 20 70 45 20 3d 20 70 4f 72 64 65 72 42 79 2d    pE = pOrderBy-
d730: 3e 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20  >a[i].pExpr;.   
d740: 20 20 20 70 44 75 70 20 3d 20 73 71 6c 69 74 65     pDup = sqlite
d750: 33 45 78 70 72 44 75 70 28 64 62 2c 20 70 45 29  3ExprDup(db, pE)
d760: 3b 0a 20 20 20 20 20 20 69 66 28 20 21 64 62 2d  ;.      if( !db-
d770: 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b  >mallocFailed ){
d780: 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
d790: 70 44 75 70 29 3b 0a 20 20 20 20 20 20 20 20 69  pDup);.        i
d7a0: 43 6f 6c 20 3d 20 6d 61 74 63 68 4f 72 64 65 72  Col = matchOrder
d7b0: 42 79 54 65 72 6d 54 6f 45 78 70 72 4c 69 73 74  ByTermToExprList
d7c0: 28 70 50 61 72 73 65 2c 20 70 53 65 6c 65 63 74  (pParse, pSelect
d7d0: 2c 20 70 44 75 70 2c 20 69 2b 31 2c 20 31 2c 20  , pDup, i+1, 1, 
d7e0: 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  0);.      }.    
d7f0: 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c    sqlite3ExprDel
d800: 65 74 65 28 70 44 75 70 29 3b 0a 20 20 20 20 20  ete(pDup);.     
d810: 20 69 66 28 20 69 43 6f 6c 3c 30 20 29 7b 0a 20   if( iCol<0 ){. 
d820: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b         return 1;
d830: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70  .      }.      p
d840: 45 4c 69 73 74 20 3d 20 70 53 65 6c 65 63 74 2d  EList = pSelect-
d850: 3e 70 45 4c 69 73 74 3b 0a 20 20 20 20 20 20 69  >pEList;.      i
d860: 66 28 20 70 45 4c 69 73 74 3d 3d 30 20 29 7b 0a  f( pEList==0 ){.
d870: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 31          return 1
d880: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
d890: 69 66 28 20 69 43 6f 6c 3e 70 45 4c 69 73 74 2d  if( iCol>pEList-
d8a0: 3e 6e 45 78 70 72 20 29 7b 0a 20 20 20 20 20 20  >nExpr ){.      
d8b0: 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
d8c0: 67 28 70 50 61 72 73 65 2c 20 0a 20 20 20 20 20  g(pParse, .     
d8d0: 20 20 20 20 20 20 22 25 72 20 4f 52 44 45 52 20        "%r ORDER 
d8e0: 42 59 20 74 65 72 6d 20 6f 75 74 20 6f 66 20 72  BY term out of r
d8f0: 61 6e 67 65 20 2d 20 73 68 6f 75 6c 64 20 62 65  ange - should be
d900: 20 22 0a 20 20 20 20 20 20 20 20 20 20 20 22 62   ".           "b
d910: 65 74 77 65 65 6e 20 31 20 61 6e 64 20 25 64 22  etween 1 and %d"
d920: 2c 20 69 2b 31 2c 20 70 45 4c 69 73 74 2d 3e 6e  , i+1, pEList->n
d930: 45 78 70 72 29 3b 0a 20 20 20 20 20 20 20 20 72  Expr);.        r
d940: 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 20 20 7d  eturn 1;.      }
d950: 0a 20 20 20 20 20 20 69 66 28 20 69 43 6f 6c 3e  .      if( iCol>
d960: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70 45 2d  0 ){.        pE-
d970: 3e 6f 70 20 3d 20 54 4b 5f 43 4f 4c 55 4d 4e 3b  >op = TK_COLUMN;
d980: 0a 20 20 20 20 20 20 20 20 70 45 2d 3e 69 54 61  .        pE->iTa
d990: 62 6c 65 20 3d 20 69 54 61 62 6c 65 3b 0a 20 20  ble = iTable;.  
d9a0: 20 20 20 20 20 20 70 45 2d 3e 69 41 67 67 20 3d        pE->iAgg =
d9b0: 20 2d 31 3b 0a 20 20 20 20 20 20 20 20 70 45 2d   -1;.        pE-
d9c0: 3e 69 43 6f 6c 75 6d 6e 20 3d 20 69 43 6f 6c 2d  >iColumn = iCol-
d9d0: 31 3b 0a 20 20 20 20 20 20 20 20 70 45 2d 3e 70  1;.        pE->p
d9e0: 54 61 62 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  Tab = 0;.       
d9f0: 20 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e   pOrderBy->a[i].
da00: 64 6f 6e 65 20 3d 20 31 3b 0a 20 20 20 20 20 20  done = 1;.      
da10: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 6d  }else{.        m
da20: 6f 72 65 54 6f 44 6f 20 3d 20 31 3b 0a 20 20 20  oreToDo = 1;.   
da30: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 70     }.    }.    p
da40: 53 65 6c 65 63 74 20 3d 20 70 53 65 6c 65 63 74  Select = pSelect
da50: 2d 3e 70 4e 65 78 74 3b 0a 20 20 7d 0a 20 20 66  ->pNext;.  }.  f
da60: 6f 72 28 69 3d 30 3b 20 69 3c 70 4f 72 64 65 72  or(i=0; i<pOrder
da70: 42 79 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b  By->nExpr; i++){
da80: 0a 20 20 20 20 69 66 28 20 70 4f 72 64 65 72 42  .    if( pOrderB
da90: 79 2d 3e 61 5b 69 5d 2e 64 6f 6e 65 3d 3d 30 20  y->a[i].done==0 
daa0: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
dab0: 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
dac0: 20 22 25 72 20 4f 52 44 45 52 20 42 59 20 74 65   "%r ORDER BY te
dad0: 72 6d 20 64 6f 65 73 20 6e 6f 74 20 6d 61 74 63  rm does not matc
dae0: 68 20 61 6e 79 20 22 0a 20 20 20 20 20 20 20 20  h any ".        
daf0: 20 20 20 20 22 63 6f 6c 75 6d 6e 20 69 6e 20 74      "column in t
db00: 68 65 20 72 65 73 75 6c 74 20 73 65 74 22 2c 20  he result set", 
db10: 69 2b 31 29 3b 0a 20 20 20 20 20 20 72 65 74 75  i+1);.      retu
db20: 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  rn 1;.    }.  }.
db30: 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f    return 0;.}../
db40: 2a 0a 2a 2a 20 47 65 74 20 61 20 56 44 42 45 20  *.** Get a VDBE 
db50: 66 6f 72 20 74 68 65 20 67 69 76 65 6e 20 70 61  for the given pa
db60: 72 73 65 72 20 63 6f 6e 74 65 78 74 2e 20 20 43  rser context.  C
db70: 72 65 61 74 65 20 61 20 6e 65 77 20 6f 6e 65 20  reate a new one 
db80: 69 66 20 6e 65 63 65 73 73 61 72 79 2e 0a 2a 2a  if necessary..**
db90: 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63   If an error occ
dba0: 75 72 73 2c 20 72 65 74 75 72 6e 20 4e 55 4c 4c  urs, return NULL
dbb0: 20 61 6e 64 20 6c 65 61 76 65 20 61 20 6d 65 73   and leave a mes
dbc0: 73 61 67 65 20 69 6e 20 70 50 61 72 73 65 2e 0a  sage in pParse..
dbd0: 2a 2f 0a 56 64 62 65 20 2a 73 71 6c 69 74 65 33  */.Vdbe *sqlite3
dbe0: 47 65 74 56 64 62 65 28 50 61 72 73 65 20 2a 70  GetVdbe(Parse *p
dbf0: 50 61 72 73 65 29 7b 0a 20 20 56 64 62 65 20 2a  Parse){.  Vdbe *
dc00: 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62  v = pParse->pVdb
dc10: 65 3b 0a 20 20 69 66 28 20 76 3d 3d 30 20 29 7b  e;.  if( v==0 ){
dc20: 0a 20 20 20 20 76 20 3d 20 70 50 61 72 73 65 2d  .    v = pParse-
dc30: 3e 70 56 64 62 65 20 3d 20 73 71 6c 69 74 65 33  >pVdbe = sqlite3
dc40: 56 64 62 65 43 72 65 61 74 65 28 70 50 61 72 73  VdbeCreate(pPars
dc50: 65 2d 3e 64 62 29 3b 0a 23 69 66 6e 64 65 66 20  e->db);.#ifndef 
dc60: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 41 43  SQLITE_OMIT_TRAC
dc70: 45 0a 20 20 20 20 69 66 28 20 76 20 29 7b 0a 20  E.    if( v ){. 
dc80: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
dc90: 41 64 64 4f 70 30 28 76 2c 20 4f 50 5f 54 72 61  AddOp0(v, OP_Tra
dca0: 63 65 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69  ce);.    }.#endi
dcb0: 66 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 76  f.  }.  return v
dcc0: 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70  ;.}.../*.** Comp
dcd0: 75 74 65 20 74 68 65 20 69 4c 69 6d 69 74 20 61  ute the iLimit a
dce0: 6e 64 20 69 4f 66 66 73 65 74 20 66 69 65 6c 64  nd iOffset field
dcf0: 73 20 6f 66 20 74 68 65 20 53 45 4c 45 43 54 20  s of the SELECT 
dd00: 62 61 73 65 64 20 6f 6e 20 74 68 65 0a 2a 2a 20  based on the.** 
dd10: 70 4c 69 6d 69 74 20 61 6e 64 20 70 4f 66 66 73  pLimit and pOffs
dd20: 65 74 20 65 78 70 72 65 73 73 69 6f 6e 73 2e 20  et expressions. 
dd30: 20 70 4c 69 6d 69 74 20 61 6e 64 20 70 4f 66 66   pLimit and pOff
dd40: 73 65 74 20 68 6f 6c 64 20 74 68 65 20 65 78 70  set hold the exp
dd50: 72 65 73 73 69 6f 6e 73 0a 2a 2a 20 74 68 61 74  ressions.** that
dd60: 20 61 70 70 65 61 72 20 69 6e 20 74 68 65 20 6f   appear in the o
dd70: 72 69 67 69 6e 61 6c 20 53 51 4c 20 73 74 61 74  riginal SQL stat
dd80: 65 6d 65 6e 74 20 61 66 74 65 72 20 74 68 65 20  ement after the 
dd90: 4c 49 4d 49 54 20 61 6e 64 20 4f 46 46 53 45 54  LIMIT and OFFSET
dda0: 0a 2a 2a 20 6b 65 79 77 6f 72 64 73 2e 20 20 4f  .** keywords.  O
ddb0: 72 20 4e 55 4c 4c 20 69 66 20 74 68 6f 73 65 20  r NULL if those 
ddc0: 6b 65 79 77 6f 72 64 73 20 61 72 65 20 6f 6d 69  keywords are omi
ddd0: 74 74 65 64 2e 20 69 4c 69 6d 69 74 20 61 6e 64  tted. iLimit and
dde0: 20 69 4f 66 66 73 65 74 20 0a 2a 2a 20 61 72 65   iOffset .** are
ddf0: 20 74 68 65 20 69 6e 74 65 67 65 72 20 6d 65 6d   the integer mem
de00: 6f 72 79 20 72 65 67 69 73 74 65 72 20 6e 75 6d  ory register num
de10: 62 65 72 73 20 66 6f 72 20 63 6f 75 6e 74 65 72  bers for counter
de20: 73 20 75 73 65 64 20 74 6f 20 63 6f 6d 70 75 74  s used to comput
de30: 65 20 0a 2a 2a 20 74 68 65 20 6c 69 6d 69 74 20  e .** the limit 
de40: 61 6e 64 20 6f 66 66 73 65 74 2e 20 20 49 66 20  and offset.  If 
de50: 74 68 65 72 65 20 69 73 20 6e 6f 20 6c 69 6d 69  there is no limi
de60: 74 20 61 6e 64 2f 6f 72 20 6f 66 66 73 65 74 2c  t and/or offset,
de70: 20 74 68 65 6e 20 0a 2a 2a 20 69 4c 69 6d 69 74   then .** iLimit
de80: 20 61 6e 64 20 69 4f 66 66 73 65 74 20 61 72 65   and iOffset are
de90: 20 6e 65 67 61 74 69 76 65 2e 0a 2a 2a 0a 2a 2a   negative..**.**
dea0: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 63 68   This routine ch
deb0: 61 6e 67 65 73 20 74 68 65 20 76 61 6c 75 65 73  anges the values
dec0: 20 6f 66 20 69 4c 69 6d 69 74 20 61 6e 64 20 69   of iLimit and i
ded0: 4f 66 66 73 65 74 20 6f 6e 6c 79 20 69 66 0a 2a  Offset only if.*
dee0: 2a 20 61 20 6c 69 6d 69 74 20 6f 72 20 6f 66 66  * a limit or off
def0: 73 65 74 20 69 73 20 64 65 66 69 6e 65 64 20 62  set is defined b
df00: 79 20 70 4c 69 6d 69 74 20 61 6e 64 20 70 4f 66  y pLimit and pOf
df10: 66 73 65 74 2e 20 20 69 4c 69 6d 69 74 20 61 6e  fset.  iLimit an
df20: 64 0a 2a 2a 20 69 4f 66 66 73 65 74 20 73 68 6f  d.** iOffset sho
df30: 75 6c 64 20 68 61 76 65 20 62 65 65 6e 20 70 72  uld have been pr
df40: 65 73 65 74 20 74 6f 20 61 70 70 72 6f 70 72 69  eset to appropri
df50: 61 74 65 20 64 65 66 61 75 6c 74 20 76 61 6c 75  ate default valu
df60: 65 73 0a 2a 2a 20 28 75 73 75 61 6c 6c 79 20 62  es.** (usually b
df70: 75 74 20 6e 6f 74 20 61 6c 77 61 79 73 20 2d 31  ut not always -1
df80: 29 20 70 72 69 6f 72 20 74 6f 20 63 61 6c 6c 69  ) prior to calli
df90: 6e 67 20 74 68 69 73 20 72 6f 75 74 69 6e 65 2e  ng this routine.
dfa0: 0a 2a 2a 20 4f 6e 6c 79 20 69 66 20 70 4c 69 6d  .** Only if pLim
dfb0: 69 74 21 3d 30 20 6f 72 20 70 4f 66 66 73 65 74  it!=0 or pOffset
dfc0: 21 3d 30 20 64 6f 20 74 68 65 20 6c 69 6d 69 74  !=0 do the limit
dfd0: 20 72 65 67 69 73 74 65 72 73 20 67 65 74 0a 2a   registers get.*
dfe0: 2a 20 72 65 64 65 66 69 6e 65 64 2e 20 20 54 68  * redefined.  Th
dff0: 65 20 55 4e 49 4f 4e 20 41 4c 4c 20 6f 70 65 72  e UNION ALL oper
e000: 61 74 6f 72 20 75 73 65 73 20 74 68 69 73 20 70  ator uses this p
e010: 72 6f 70 65 72 74 79 20 74 6f 20 66 6f 72 63 65  roperty to force
e020: 0a 2a 2a 20 74 68 65 20 72 65 75 73 65 20 6f 66  .** the reuse of
e030: 20 74 68 65 20 73 61 6d 65 20 6c 69 6d 69 74 20   the same limit 
e040: 61 6e 64 20 6f 66 66 73 65 74 20 72 65 67 69 73  and offset regis
e050: 74 65 72 73 20 61 63 72 6f 73 73 20 6d 75 6c 74  ters across mult
e060: 69 70 6c 65 0a 2a 2a 20 53 45 4c 45 43 54 20 73  iple.** SELECT s
e070: 74 61 74 65 6d 65 6e 74 73 2e 0a 2a 2f 0a 73 74  tatements..*/.st
e080: 61 74 69 63 20 76 6f 69 64 20 63 6f 6d 70 75 74  atic void comput
e090: 65 4c 69 6d 69 74 52 65 67 69 73 74 65 72 73 28  eLimitRegisters(
e0a0: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 53  Parse *pParse, S
e0b0: 65 6c 65 63 74 20 2a 70 2c 20 69 6e 74 20 69 42  elect *p, int iB
e0c0: 72 65 61 6b 29 7b 0a 20 20 56 64 62 65 20 2a 76  reak){.  Vdbe *v
e0d0: 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69 4c 69 6d   = 0;.  int iLim
e0e0: 69 74 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69 4f  it = 0;.  int iO
e0f0: 66 66 73 65 74 3b 0a 20 20 69 6e 74 20 61 64 64  ffset;.  int add
e100: 72 31 3b 0a 0a 20 20 2f 2a 20 0a 20 20 2a 2a 20  r1;..  /* .  ** 
e110: 22 4c 49 4d 49 54 20 2d 31 22 20 61 6c 77 61 79  "LIMIT -1" alway
e120: 73 20 73 68 6f 77 73 20 61 6c 6c 20 72 6f 77 73  s shows all rows
e130: 2e 20 20 54 68 65 72 65 20 69 73 20 73 6f 6d 65  .  There is some
e140: 0a 20 20 2a 2a 20 63 6f 6e 74 72 61 76 65 72 73  .  ** contravers
e150: 79 20 61 62 6f 75 74 20 77 68 61 74 20 74 68 65  y about what the
e160: 20 63 6f 72 72 65 63 74 20 62 65 68 61 76 69 6f   correct behavio
e170: 72 20 73 68 6f 75 6c 64 20 62 65 2e 0a 20 20 2a  r should be..  *
e180: 2a 20 54 68 65 20 63 75 72 72 65 6e 74 20 69 6d  * The current im
e190: 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 69 6e 74  plementation int
e1a0: 65 72 70 72 65 74 73 20 22 4c 49 4d 49 54 20 30  erprets "LIMIT 0
e1b0: 22 20 74 6f 20 6d 65 61 6e 0a 20 20 2a 2a 20 6e  " to mean.  ** n
e1c0: 6f 20 72 6f 77 73 2e 0a 20 20 2a 2f 0a 20 20 69  o rows..  */.  i
e1d0: 66 28 20 70 2d 3e 70 4c 69 6d 69 74 20 29 7b 0a  f( p->pLimit ){.
e1e0: 20 20 20 20 70 2d 3e 69 4c 69 6d 69 74 20 3d 20      p->iLimit = 
e1f0: 69 4c 69 6d 69 74 20 3d 20 2b 2b 70 50 61 72 73  iLimit = ++pPars
e200: 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 76 20 3d  e->nMem;.    v =
e210: 20 73 71 6c 69 74 65 33 47 65 74 56 64 62 65 28   sqlite3GetVdbe(
e220: 70 50 61 72 73 65 29 3b 0a 20 20 20 20 69 66 28  pParse);.    if(
e230: 20 76 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a   v==0 ) return;.
e240: 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
e250: 6f 64 65 28 70 50 61 72 73 65 2c 20 70 2d 3e 70  ode(pParse, p->p
e260: 4c 69 6d 69 74 2c 20 69 4c 69 6d 69 74 29 3b 0a  Limit, iLimit);.
e270: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
e280: 64 64 4f 70 31 28 76 2c 20 4f 50 5f 4d 75 73 74  ddOp1(v, OP_Must
e290: 42 65 49 6e 74 2c 20 69 4c 69 6d 69 74 29 3b 0a  BeInt, iLimit);.
e2a0: 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28      VdbeComment(
e2b0: 28 76 2c 20 22 4c 49 4d 49 54 20 63 6f 75 6e 74  (v, "LIMIT count
e2c0: 65 72 22 29 29 3b 0a 20 20 20 20 73 71 6c 69 74  er"));.    sqlit
e2d0: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
e2e0: 4f 50 5f 49 66 5a 65 72 6f 2c 20 69 4c 69 6d 69  OP_IfZero, iLimi
e2f0: 74 2c 20 69 42 72 65 61 6b 29 3b 0a 20 20 7d 0a  t, iBreak);.  }.
e300: 20 20 69 66 28 20 70 2d 3e 70 4f 66 66 73 65 74    if( p->pOffset
e310: 20 29 7b 0a 20 20 20 20 70 2d 3e 69 4f 66 66 73   ){.    p->iOffs
e320: 65 74 20 3d 20 69 4f 66 66 73 65 74 20 3d 20 2b  et = iOffset = +
e330: 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20  +pParse->nMem;. 
e340: 20 20 20 69 66 28 20 70 2d 3e 70 4c 69 6d 69 74     if( p->pLimit
e350: 20 29 7b 0a 20 20 20 20 20 20 70 50 61 72 73 65   ){.      pParse
e360: 2d 3e 6e 4d 65 6d 2b 2b 3b 20 20 20 2f 2a 20 41  ->nMem++;   /* A
e370: 6c 6c 6f 63 61 74 65 20 61 6e 20 65 78 74 72 61  llocate an extra
e380: 20 72 65 67 69 73 74 65 72 20 66 6f 72 20 6c 69   register for li
e390: 6d 69 74 2b 6f 66 66 73 65 74 20 2a 2f 0a 20 20  mit+offset */.  
e3a0: 20 20 7d 0a 20 20 20 20 76 20 3d 20 73 71 6c 69    }.    v = sqli
e3b0: 74 65 33 47 65 74 56 64 62 65 28 70 50 61 72 73  te3GetVdbe(pPars
e3c0: 65 29 3b 0a 20 20 20 20 69 66 28 20 76 3d 3d 30  e);.    if( v==0
e3d0: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 73   ) return;.    s
e3e0: 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28 70  qlite3ExprCode(p
e3f0: 50 61 72 73 65 2c 20 70 2d 3e 70 4f 66 66 73 65  Parse, p->pOffse
e400: 74 2c 20 69 4f 66 66 73 65 74 29 3b 0a 20 20 20  t, iOffset);.   
e410: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
e420: 70 31 28 76 2c 20 4f 50 5f 4d 75 73 74 42 65 49  p1(v, OP_MustBeI
e430: 6e 74 2c 20 69 4f 66 66 73 65 74 29 3b 0a 20 20  nt, iOffset);.  
e440: 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76    VdbeComment((v
e450: 2c 20 22 4f 46 46 53 45 54 20 63 6f 75 6e 74 65  , "OFFSET counte
e460: 72 22 29 29 3b 0a 20 20 20 20 61 64 64 72 31 20  r"));.    addr1 
e470: 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  = sqlite3VdbeAdd
e480: 4f 70 31 28 76 2c 20 4f 50 5f 49 66 50 6f 73 2c  Op1(v, OP_IfPos,
e490: 20 69 4f 66 66 73 65 74 29 3b 0a 20 20 20 20 73   iOffset);.    s
e4a0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
e4b0: 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20  (v, OP_Integer, 
e4c0: 30 2c 20 69 4f 66 66 73 65 74 29 3b 0a 20 20 20  0, iOffset);.   
e4d0: 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70   sqlite3VdbeJump
e4e0: 48 65 72 65 28 76 2c 20 61 64 64 72 31 29 3b 0a  Here(v, addr1);.
e4f0: 20 20 20 20 69 66 28 20 70 2d 3e 70 4c 69 6d 69      if( p->pLimi
e500: 74 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  t ){.      sqlit
e510: 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
e520: 4f 50 5f 41 64 64 2c 20 69 4c 69 6d 69 74 2c 20  OP_Add, iLimit, 
e530: 69 4f 66 66 73 65 74 2c 20 69 4f 66 66 73 65 74  iOffset, iOffset
e540: 2b 31 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43  +1);.      VdbeC
e550: 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 4c 49 4d 49  omment((v, "LIMI
e560: 54 2b 4f 46 46 53 45 54 22 29 29 3b 0a 20 20 20  T+OFFSET"));.   
e570: 20 20 20 61 64 64 72 31 20 3d 20 73 71 6c 69 74     addr1 = sqlit
e580: 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20  e3VdbeAddOp1(v, 
e590: 4f 50 5f 49 66 50 6f 73 2c 20 69 4c 69 6d 69 74  OP_IfPos, iLimit
e5a0: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
e5b0: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
e5c0: 5f 49 6e 74 65 67 65 72 2c 20 2d 31 2c 20 69 4f  _Integer, -1, iO
e5d0: 66 66 73 65 74 2b 31 29 3b 0a 20 20 20 20 20 20  ffset+1);.      
e5e0: 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48  sqlite3VdbeJumpH
e5f0: 65 72 65 28 76 2c 20 61 64 64 72 31 29 3b 0a 20  ere(v, addr1);. 
e600: 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a     }.  }.}../*.*
e610: 2a 20 41 6c 6c 6f 63 61 74 65 20 61 20 76 69 72  * Allocate a vir
e620: 74 75 61 6c 20 69 6e 64 65 78 20 74 6f 20 75 73  tual index to us
e630: 65 20 66 6f 72 20 73 6f 72 74 69 6e 67 2e 0a 2a  e for sorting..*
e640: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63 72  /.static void cr
e650: 65 61 74 65 53 6f 72 74 69 6e 67 49 6e 64 65 78  eateSortingIndex
e660: 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
e670: 53 65 6c 65 63 74 20 2a 70 2c 20 45 78 70 72 4c  Select *p, ExprL
e680: 69 73 74 20 2a 70 4f 72 64 65 72 42 79 29 7b 0a  ist *pOrderBy){.
e690: 20 20 69 66 28 20 70 4f 72 64 65 72 42 79 20 29    if( pOrderBy )
e6a0: 7b 0a 20 20 20 20 69 6e 74 20 61 64 64 72 3b 0a  {.    int addr;.
e6b0: 20 20 20 20 61 73 73 65 72 74 28 20 70 4f 72 64      assert( pOrd
e6c0: 65 72 42 79 2d 3e 69 45 43 75 72 73 6f 72 3d 3d  erBy->iECursor==
e6d0: 30 20 29 3b 0a 20 20 20 20 70 4f 72 64 65 72 42  0 );.    pOrderB
e6e0: 79 2d 3e 69 45 43 75 72 73 6f 72 20 3d 20 70 50  y->iECursor = pP
e6f0: 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20  arse->nTab++;.  
e700: 20 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65 33    addr = sqlite3
e710: 56 64 62 65 41 64 64 4f 70 32 28 70 50 61 72 73  VdbeAddOp2(pPars
e720: 65 2d 3e 70 56 64 62 65 2c 20 4f 50 5f 4f 70 65  e->pVdbe, OP_Ope
e730: 6e 45 70 68 65 6d 65 72 61 6c 2c 0a 20 20 20 20  nEphemeral,.    
e740: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e750: 20 20 20 20 20 20 20 20 70 4f 72 64 65 72 42 79          pOrderBy
e760: 2d 3e 69 45 43 75 72 73 6f 72 2c 20 70 4f 72 64  ->iECursor, pOrd
e770: 65 72 42 79 2d 3e 6e 45 78 70 72 2b 31 29 3b 0a  erBy->nExpr+1);.
e780: 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 61      assert( p->a
e790: 64 64 72 4f 70 65 6e 45 70 68 6d 5b 32 5d 20 3d  ddrOpenEphm[2] =
e7a0: 3d 20 2d 31 20 29 3b 0a 20 20 20 20 70 2d 3e 61  = -1 );.    p->a
e7b0: 64 64 72 4f 70 65 6e 45 70 68 6d 5b 32 5d 20 3d  ddrOpenEphm[2] =
e7c0: 20 61 64 64 72 3b 0a 20 20 7d 0a 7d 0a 0a 23 69   addr;.  }.}..#i
e7d0: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
e7e0: 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45 43  T_COMPOUND_SELEC
e7f0: 54 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  T./*.** Return t
e800: 68 65 20 61 70 70 72 6f 70 72 69 61 74 65 20 63  he appropriate c
e810: 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63  ollating sequenc
e820: 65 20 66 6f 72 20 74 68 65 20 69 43 6f 6c 2d 74  e for the iCol-t
e830: 68 20 63 6f 6c 75 6d 6e 20 6f 66 0a 2a 2a 20 74  h column of.** t
e840: 68 65 20 72 65 73 75 6c 74 20 73 65 74 20 66 6f  he result set fo
e850: 72 20 74 68 65 20 63 6f 6d 70 6f 75 6e 64 2d 73  r the compound-s
e860: 65 6c 65 63 74 20 73 74 61 74 65 6d 65 6e 74 20  elect statement 
e870: 22 70 22 2e 20 20 52 65 74 75 72 6e 20 4e 55 4c  "p".  Return NUL
e880: 4c 20 69 66 0a 2a 2a 20 74 68 65 20 63 6f 6c 75  L if.** the colu
e890: 6d 6e 20 68 61 73 20 6e 6f 20 64 65 66 61 75 6c  mn has no defaul
e8a0: 74 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75  t collating sequ
e8b0: 65 6e 63 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  ence..**.** The 
e8c0: 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e  collating sequen
e8d0: 63 65 20 66 6f 72 20 74 68 65 20 63 6f 6d 70 6f  ce for the compo
e8e0: 75 6e 64 20 73 65 6c 65 63 74 20 69 73 20 74 61  und select is ta
e8f0: 6b 65 6e 20 66 72 6f 6d 20 74 68 65 0a 2a 2a 20  ken from the.** 
e900: 6c 65 66 74 2d 6d 6f 73 74 20 74 65 72 6d 20 6f  left-most term o
e910: 66 20 74 68 65 20 73 65 6c 65 63 74 20 74 68 61  f the select tha
e920: 74 20 68 61 73 20 61 20 63 6f 6c 6c 61 74 69 6e  t has a collatin
e930: 67 20 73 65 71 75 65 6e 63 65 2e 0a 2a 2f 0a 73  g sequence..*/.s
e940: 74 61 74 69 63 20 43 6f 6c 6c 53 65 71 20 2a 6d  tatic CollSeq *m
e950: 75 6c 74 69 53 65 6c 65 63 74 43 6f 6c 6c 53 65  ultiSelectCollSe
e960: 71 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  q(Parse *pParse,
e970: 20 53 65 6c 65 63 74 20 2a 70 2c 20 69 6e 74 20   Select *p, int 
e980: 69 43 6f 6c 29 7b 0a 20 20 43 6f 6c 6c 53 65 71  iCol){.  CollSeq
e990: 20 2a 70 52 65 74 3b 0a 20 20 69 66 28 20 70 2d   *pRet;.  if( p-
e9a0: 3e 70 50 72 69 6f 72 20 29 7b 0a 20 20 20 20 70  >pPrior ){.    p
e9b0: 52 65 74 20 3d 20 6d 75 6c 74 69 53 65 6c 65 63  Ret = multiSelec
e9c0: 74 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c  tCollSeq(pParse,
e9d0: 20 70 2d 3e 70 50 72 69 6f 72 2c 20 69 43 6f 6c   p->pPrior, iCol
e9e0: 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
e9f0: 70 52 65 74 20 3d 20 30 3b 0a 20 20 7d 0a 20 20  pRet = 0;.  }.  
ea00: 69 66 28 20 70 52 65 74 3d 3d 30 20 29 7b 0a 20  if( pRet==0 ){. 
ea10: 20 20 20 70 52 65 74 20 3d 20 73 71 6c 69 74 65     pRet = sqlite
ea20: 33 45 78 70 72 43 6f 6c 6c 53 65 71 28 70 50 61  3ExprCollSeq(pPa
ea30: 72 73 65 2c 20 70 2d 3e 70 45 4c 69 73 74 2d 3e  rse, p->pEList->
ea40: 61 5b 69 43 6f 6c 5d 2e 70 45 78 70 72 29 3b 0a  a[iCol].pExpr);.
ea50: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 52 65    }.  return pRe
ea60: 74 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53  t;.}.#endif /* S
ea70: 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f 4d 50 4f  QLITE_OMIT_COMPO
ea80: 55 4e 44 5f 53 45 4c 45 43 54 20 2a 2f 0a 0a 23  UND_SELECT */..#
ea90: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
eaa0: 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45  IT_COMPOUND_SELE
eab0: 43 54 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  CT./*.** This ro
eac0: 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20  utine is called 
ead0: 74 6f 20 70 72 6f 63 65 73 73 20 61 20 71 75 65  to process a que
eae0: 72 79 20 74 68 61 74 20 69 73 20 72 65 61 6c 6c  ry that is reall
eaf0: 79 20 74 68 65 20 75 6e 69 6f 6e 0a 2a 2a 20 6f  y the union.** o
eb00: 72 20 69 6e 74 65 72 73 65 63 74 69 6f 6e 20 6f  r intersection o
eb10: 66 20 74 77 6f 20 6f 72 20 6d 6f 72 65 20 73 65  f two or more se
eb20: 70 61 72 61 74 65 20 71 75 65 72 69 65 73 2e 0a  parate queries..
eb30: 2a 2a 0a 2a 2a 20 22 70 22 20 70 6f 69 6e 74 73  **.** "p" points
eb40: 20 74 6f 20 74 68 65 20 72 69 67 68 74 2d 6d 6f   to the right-mo
eb50: 73 74 20 6f 66 20 74 68 65 20 74 77 6f 20 71 75  st of the two qu
eb60: 65 72 69 65 73 2e 20 20 74 68 65 20 71 75 65 72  eries.  the quer
eb70: 79 20 6f 6e 20 74 68 65 0a 2a 2a 20 6c 65 66 74  y on the.** left
eb80: 20 69 73 20 70 2d 3e 70 50 72 69 6f 72 2e 20 20   is p->pPrior.  
eb90: 54 68 65 20 6c 65 66 74 20 71 75 65 72 79 20 63  The left query c
eba0: 6f 75 6c 64 20 61 6c 73 6f 20 62 65 20 61 20 63  ould also be a c
ebb0: 6f 6d 70 6f 75 6e 64 20 71 75 65 72 79 0a 2a 2a  ompound query.**
ebc0: 20 69 6e 20 77 68 69 63 68 20 63 61 73 65 20 74   in which case t
ebd0: 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c  his routine will
ebe0: 20 62 65 20 63 61 6c 6c 65 64 20 72 65 63 75 72   be called recur
ebf0: 73 69 76 65 6c 79 2e 20 0a 2a 2a 0a 2a 2a 20 54  sively. .**.** T
ec00: 68 65 20 72 65 73 75 6c 74 73 20 6f 66 20 74 68  he results of th
ec10: 65 20 74 6f 74 61 6c 20 71 75 65 72 79 20 61 72  e total query ar
ec20: 65 20 74 6f 20 62 65 20 77 72 69 74 74 65 6e 20  e to be written 
ec30: 69 6e 74 6f 20 61 20 64 65 73 74 69 6e 61 74 69  into a destinati
ec40: 6f 6e 0a 2a 2a 20 6f 66 20 74 79 70 65 20 65 44  on.** of type eD
ec50: 65 73 74 20 77 69 74 68 20 70 61 72 61 6d 65 74  est with paramet
ec60: 65 72 20 69 50 61 72 6d 2e 0a 2a 2a 0a 2a 2a 20  er iParm..**.** 
ec70: 45 78 61 6d 70 6c 65 20 31 3a 20 20 43 6f 6e 73  Example 1:  Cons
ec80: 69 64 65 72 20 61 20 74 68 72 65 65 2d 77 61 79  ider a three-way
ec90: 20 63 6f 6d 70 6f 75 6e 64 20 53 51 4c 20 73 74   compound SQL st
eca0: 61 74 65 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 20  atement..**.**  
ecb0: 20 20 20 53 45 4c 45 43 54 20 61 20 46 52 4f 4d     SELECT a FROM
ecc0: 20 74 31 20 55 4e 49 4f 4e 20 53 45 4c 45 43 54   t1 UNION SELECT
ecd0: 20 62 20 46 52 4f 4d 20 74 32 20 55 4e 49 4f 4e   b FROM t2 UNION
ece0: 20 53 45 4c 45 43 54 20 63 20 46 52 4f 4d 20 74   SELECT c FROM t
ecf0: 33 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 73 74 61  3.**.** This sta
ed00: 74 65 6d 65 6e 74 20 69 73 20 70 61 72 73 65 64  tement is parsed
ed10: 20 75 70 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a   up as follows:.
ed20: 2a 2a 0a 2a 2a 20 20 20 20 20 53 45 4c 45 43 54  **.**     SELECT
ed30: 20 63 20 46 52 4f 4d 20 74 33 0a 2a 2a 20 20 20   c FROM t3.**   
ed40: 20 20 20 7c 0a 2a 2a 20 20 20 20 20 20 60 2d 2d     |.**      `--
ed50: 2d 2d 2d 3e 20 20 53 45 4c 45 43 54 20 62 20 46  --->  SELECT b F
ed60: 52 4f 4d 20 74 32 0a 2a 2a 20 20 20 20 20 20 20  ROM t2.**       
ed70: 20 20 20 20 20 20 20 20 20 7c 0a 2a 2a 20 20 20           |.**   
ed80: 20 20 20 20 20 20 20 20 20 20 20 20 20 60 2d 2d               `--
ed90: 2d 2d 2d 2d 3e 20 20 53 45 4c 45 43 54 20 61 20  ---->  SELECT a 
eda0: 46 52 4f 4d 20 74 31 0a 2a 2a 0a 2a 2a 20 54 68  FROM t1.**.** Th
edb0: 65 20 61 72 72 6f 77 73 20 69 6e 20 74 68 65 20  e arrows in the 
edc0: 64 69 61 67 72 61 6d 20 61 62 6f 76 65 20 72 65  diagram above re
edd0: 70 72 65 73 65 6e 74 20 74 68 65 20 53 65 6c 65  present the Sele
ede0: 63 74 2e 70 50 72 69 6f 72 20 70 6f 69 6e 74 65  ct.pPrior pointe
edf0: 72 2e 0a 2a 2a 20 53 6f 20 69 66 20 74 68 69 73  r..** So if this
ee00: 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c   routine is call
ee10: 65 64 20 77 69 74 68 20 70 20 65 71 75 61 6c 20  ed with p equal 
ee20: 74 6f 20 74 68 65 20 74 33 20 71 75 65 72 79 2c  to the t3 query,
ee30: 20 74 68 65 6e 0a 2a 2a 20 70 50 72 69 6f 72 20   then.** pPrior 
ee40: 77 69 6c 6c 20 62 65 20 74 68 65 20 74 32 20 71  will be the t2 q
ee50: 75 65 72 79 2e 20 20 70 2d 3e 6f 70 20 77 69 6c  uery.  p->op wil
ee60: 6c 20 62 65 20 54 4b 5f 55 4e 49 4f 4e 20 69 6e  l be TK_UNION in
ee70: 20 74 68 69 73 20 63 61 73 65 2e 0a 2a 2a 0a 2a   this case..**.*
ee80: 2a 20 4e 6f 74 69 63 65 20 74 68 61 74 20 62 65  * Notice that be
ee90: 63 61 75 73 65 20 6f 66 20 74 68 65 20 77 61 79  cause of the way
eea0: 20 53 51 4c 69 74 65 20 70 61 72 73 65 73 20 63   SQLite parses c
eeb0: 6f 6d 70 6f 75 6e 64 20 53 45 4c 45 43 54 73 2c  ompound SELECTs,
eec0: 20 74 68 65 0a 2a 2a 20 69 6e 64 69 76 69 64 75   the.** individu
eed0: 61 6c 20 73 65 6c 65 63 74 73 20 61 6c 77 61 79  al selects alway
eee0: 73 20 67 72 6f 75 70 20 66 72 6f 6d 20 6c 65 66  s group from lef
eef0: 74 20 74 6f 20 72 69 67 68 74 2e 0a 2a 2f 0a 73  t to right..*/.s
ef00: 74 61 74 69 63 20 69 6e 74 20 6d 75 6c 74 69 53  tatic int multiS
ef10: 65 6c 65 63 74 28 0a 20 20 50 61 72 73 65 20 2a  elect(.  Parse *
ef20: 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 2f  pParse,        /
ef30: 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78  * Parsing contex
ef40: 74 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70  t */.  Select *p
ef50: 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ,            /* 
ef60: 54 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 20 6f  The right-most o
ef70: 66 20 53 45 4c 45 43 54 73 20 74 6f 20 62 65 20  f SELECTs to be 
ef80: 63 6f 64 65 64 20 2a 2f 0a 20 20 53 65 6c 65 63  coded */.  Selec
ef90: 74 44 65 73 74 20 2a 70 44 65 73 74 2c 20 20 20  tDest *pDest,   
efa0: 20 2f 2a 20 57 68 61 74 20 74 6f 20 64 6f 20 77   /* What to do w
efb0: 69 74 68 20 71 75 65 72 79 20 72 65 73 75 6c 74  ith query result
efc0: 73 20 2a 2f 0a 20 20 63 68 61 72 20 2a 61 66 66  s */.  char *aff
efd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
efe0: 49 66 20 65 44 65 73 74 20 69 73 20 53 52 54 5f  If eDest is SRT_
eff0: 55 6e 69 6f 6e 2c 20 74 68 65 20 61 66 66 69 6e  Union, the affin
f000: 69 74 79 20 73 74 72 69 6e 67 20 2a 2f 0a 29 7b  ity string */.){
f010: 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
f020: 54 45 5f 4f 4b 3b 20 20 20 2f 2a 20 53 75 63 63  TE_OK;   /* Succ
f030: 65 73 73 20 63 6f 64 65 20 66 72 6f 6d 20 61 20  ess code from a 
f040: 73 75 62 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20  subroutine */.  
f050: 53 65 6c 65 63 74 20 2a 70 50 72 69 6f 72 3b 20  Select *pPrior; 
f060: 20 20 20 20 20 20 2f 2a 20 41 6e 6f 74 68 65 72        /* Another
f070: 20 53 45 4c 45 43 54 20 69 6d 6d 65 64 69 61 74   SELECT immediat
f080: 65 6c 79 20 74 6f 20 6f 75 72 20 6c 65 66 74 20  ely to our left 
f090: 2a 2f 0a 20 20 56 64 62 65 20 2a 76 3b 20 20 20  */.  Vdbe *v;   
f0a0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 47 65             /* Ge
f0b0: 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20 74  nerate code to t
f0c0: 68 69 73 20 56 44 42 45 20 2a 2f 0a 20 20 69 6e  his VDBE */.  in
f0d0: 74 20 6e 43 6f 6c 3b 20 20 20 20 20 20 20 20 20  t nCol;         
f0e0: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
f0f0: 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20   columns in the 
f100: 72 65 73 75 6c 74 20 73 65 74 20 2a 2f 0a 20 20  result set */.  
f110: 45 78 70 72 4c 69 73 74 20 2a 70 4f 72 64 65 72  ExprList *pOrder
f120: 42 79 3b 20 20 20 2f 2a 20 54 68 65 20 4f 52 44  By;   /* The ORD
f130: 45 52 20 42 59 20 63 6c 61 75 73 65 20 6f 6e 20  ER BY clause on 
f140: 70 20 2a 2f 0a 20 20 69 6e 74 20 61 53 65 74 50  p */.  int aSetP
f150: 32 5b 32 5d 3b 20 20 20 20 20 20 20 20 2f 2a 20  2[2];        /* 
f160: 53 65 74 20 50 32 20 76 61 6c 75 65 20 6f 66 20  Set P2 value of 
f170: 74 68 65 73 65 20 6f 70 20 74 6f 20 6e 75 6d 62  these op to numb
f180: 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 2a 2f  er of columns */
f190: 0a 20 20 69 6e 74 20 6e 53 65 74 50 32 20 3d 20  .  int nSetP2 = 
f1a0: 30 3b 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62  0;       /* Numb
f1b0: 65 72 20 6f 66 20 73 6c 6f 74 73 20 69 6e 20 61  er of slots in a
f1c0: 53 65 74 50 32 5b 5d 20 75 73 65 64 20 2a 2f 0a  SetP2[] used */.
f1d0: 20 20 53 65 6c 65 63 74 44 65 73 74 20 64 65 73    SelectDest des
f1e0: 74 3b 20 20 20 20 20 20 2f 2a 20 41 6c 74 65 72  t;      /* Alter
f1f0: 6e 61 74 69 76 65 20 64 61 74 61 20 64 65 73 74  native data dest
f200: 69 6e 61 74 69 6f 6e 20 2a 2f 0a 0a 20 20 64 65  ination */..  de
f210: 73 74 20 3d 20 2a 70 44 65 73 74 3b 0a 0a 20 20  st = *pDest;..  
f220: 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65  /* Make sure the
f230: 72 65 20 69 73 20 6e 6f 20 4f 52 44 45 52 20 42  re is no ORDER B
f240: 59 20 6f 72 20 4c 49 4d 49 54 20 63 6c 61 75 73  Y or LIMIT claus
f250: 65 20 6f 6e 20 70 72 69 6f 72 20 53 45 4c 45 43  e on prior SELEC
f260: 54 73 2e 20 20 4f 6e 6c 79 0a 20 20 2a 2a 20 74  Ts.  Only.  ** t
f270: 68 65 20 6c 61 73 74 20 28 72 69 67 68 74 2d 6d  he last (right-m
f280: 6f 73 74 29 20 53 45 4c 45 43 54 20 69 6e 20 74  ost) SELECT in t
f290: 68 65 20 73 65 72 69 65 73 20 6d 61 79 20 68 61  he series may ha
f2a0: 76 65 20 61 6e 20 4f 52 44 45 52 20 42 59 20 6f  ve an ORDER BY o
f2b0: 72 20 4c 49 4d 49 54 2e 0a 20 20 2a 2f 0a 20 20  r LIMIT..  */.  
f2c0: 69 66 28 20 70 3d 3d 30 20 7c 7c 20 70 2d 3e 70  if( p==0 || p->p
f2d0: 50 72 69 6f 72 3d 3d 30 20 29 7b 0a 20 20 20 20  Prior==0 ){.    
f2e0: 72 63 20 3d 20 31 3b 0a 20 20 20 20 67 6f 74 6f  rc = 1;.    goto
f2f0: 20 6d 75 6c 74 69 5f 73 65 6c 65 63 74 5f 65 6e   multi_select_en
f300: 64 3b 0a 20 20 7d 0a 20 20 70 50 72 69 6f 72 20  d;.  }.  pPrior 
f310: 3d 20 70 2d 3e 70 50 72 69 6f 72 3b 0a 20 20 61  = p->pPrior;.  a
f320: 73 73 65 72 74 28 20 70 50 72 69 6f 72 2d 3e 70  ssert( pPrior->p
f330: 52 69 67 68 74 6d 6f 73 74 21 3d 70 50 72 69 6f  Rightmost!=pPrio
f340: 72 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  r );.  assert( p
f350: 50 72 69 6f 72 2d 3e 70 52 69 67 68 74 6d 6f 73  Prior->pRightmos
f360: 74 3d 3d 70 2d 3e 70 52 69 67 68 74 6d 6f 73 74  t==p->pRightmost
f370: 20 29 3b 0a 20 20 69 66 28 20 70 50 72 69 6f 72   );.  if( pPrior
f380: 2d 3e 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20  ->pOrderBy ){.  
f390: 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
f3a0: 67 28 70 50 61 72 73 65 2c 22 4f 52 44 45 52 20  g(pParse,"ORDER 
f3b0: 42 59 20 63 6c 61 75 73 65 20 73 68 6f 75 6c 64  BY clause should
f3c0: 20 63 6f 6d 65 20 61 66 74 65 72 20 25 73 20 6e   come after %s n
f3d0: 6f 74 20 62 65 66 6f 72 65 22 2c 0a 20 20 20 20  ot before",.    
f3e0: 20 20 73 65 6c 65 63 74 4f 70 4e 61 6d 65 28 70    selectOpName(p
f3f0: 2d 3e 6f 70 29 29 3b 0a 20 20 20 20 72 63 20 3d  ->op));.    rc =
f400: 20 31 3b 0a 20 20 20 20 67 6f 74 6f 20 6d 75 6c   1;.    goto mul
f410: 74 69 5f 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20  ti_select_end;. 
f420: 20 7d 0a 20 20 69 66 28 20 70 50 72 69 6f 72 2d   }.  if( pPrior-
f430: 3e 70 4c 69 6d 69 74 20 29 7b 0a 20 20 20 20 73  >pLimit ){.    s
f440: 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
f450: 50 61 72 73 65 2c 22 4c 49 4d 49 54 20 63 6c 61  Parse,"LIMIT cla
f460: 75 73 65 20 73 68 6f 75 6c 64 20 63 6f 6d 65 20  use should come 
f470: 61 66 74 65 72 20 25 73 20 6e 6f 74 20 62 65 66  after %s not bef
f480: 6f 72 65 22 2c 0a 20 20 20 20 20 20 73 65 6c 65  ore",.      sele
f490: 63 74 4f 70 4e 61 6d 65 28 70 2d 3e 6f 70 29 29  ctOpName(p->op))
f4a0: 3b 0a 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20  ;.    rc = 1;.  
f4b0: 20 20 67 6f 74 6f 20 6d 75 6c 74 69 5f 73 65 6c    goto multi_sel
f4c0: 65 63 74 5f 65 6e 64 3b 0a 20 20 7d 0a 0a 20 20  ect_end;.  }..  
f4d0: 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 77 65 20  /* Make sure we 
f4e0: 68 61 76 65 20 61 20 76 61 6c 69 64 20 71 75 65  have a valid que
f4f0: 72 79 20 65 6e 67 69 6e 65 2e 20 20 49 66 20 6e  ry engine.  If n
f500: 6f 74 2c 20 63 72 65 61 74 65 20 61 20 6e 65 77  ot, create a new
f510: 20 6f 6e 65 2e 0a 20 20 2a 2f 0a 20 20 76 20 3d   one..  */.  v =
f520: 20 73 71 6c 69 74 65 33 47 65 74 56 64 62 65 28   sqlite3GetVdbe(
f530: 70 50 61 72 73 65 29 3b 0a 20 20 69 66 28 20 76  pParse);.  if( v
f540: 3d 3d 30 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  ==0 ){.    rc = 
f550: 31 3b 0a 20 20 20 20 67 6f 74 6f 20 6d 75 6c 74  1;.    goto mult
f560: 69 5f 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20  i_select_end;.  
f570: 7d 0a 0a 20 20 2f 2a 20 43 72 65 61 74 65 20 74  }..  /* Create t
f580: 68 65 20 64 65 73 74 69 6e 61 74 69 6f 6e 20 74  he destination t
f590: 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20 69  emporary table i
f5a0: 66 20 6e 65 63 65 73 73 61 72 79 0a 20 20 2a 2f  f necessary.  */
f5b0: 0a 20 20 69 66 28 20 64 65 73 74 2e 65 44 65 73  .  if( dest.eDes
f5c0: 74 3d 3d 53 52 54 5f 45 70 68 65 6d 54 61 62 20  t==SRT_EphemTab 
f5d0: 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
f5e0: 2d 3e 70 45 4c 69 73 74 20 29 3b 0a 20 20 20 20  ->pEList );.    
f5f0: 61 73 73 65 72 74 28 20 6e 53 65 74 50 32 3c 73  assert( nSetP2<s
f600: 69 7a 65 6f 66 28 61 53 65 74 50 32 29 2f 73 69  izeof(aSetP2)/si
f610: 7a 65 6f 66 28 61 53 65 74 50 32 5b 30 5d 29 20  zeof(aSetP2[0]) 
f620: 29 3b 0a 20 20 20 20 61 53 65 74 50 32 5b 6e 53  );.    aSetP2[nS
f630: 65 74 50 32 2b 2b 5d 20 3d 20 73 71 6c 69 74 65  etP2++] = sqlite
f640: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
f650: 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 2c  P_OpenEphemeral,
f660: 20 64 65 73 74 2e 69 50 61 72 6d 2c 20 30 29 3b   dest.iParm, 0);
f670: 0a 20 20 20 20 64 65 73 74 2e 65 44 65 73 74 20  .    dest.eDest 
f680: 3d 20 53 52 54 5f 54 61 62 6c 65 3b 0a 20 20 7d  = SRT_Table;.  }
f690: 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20  ..  /* Generate 
f6a0: 63 6f 64 65 20 66 6f 72 20 74 68 65 20 6c 65 66  code for the lef
f6b0: 74 20 61 6e 64 20 72 69 67 68 74 20 53 45 4c 45  t and right SELE
f6c0: 43 54 20 73 74 61 74 65 6d 65 6e 74 73 2e 0a 20  CT statements.. 
f6d0: 20 2a 2f 0a 20 20 70 4f 72 64 65 72 42 79 20 3d   */.  pOrderBy =
f6e0: 20 70 2d 3e 70 4f 72 64 65 72 42 79 3b 0a 20 20   p->pOrderBy;.  
f6f0: 73 77 69 74 63 68 28 20 70 2d 3e 6f 70 20 29 7b  switch( p->op ){
f700: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 41 4c 4c  .    case TK_ALL
f710: 3a 20 7b 0a 20 20 20 20 20 20 69 66 28 20 70 4f  : {.      if( pO
f720: 72 64 65 72 42 79 3d 3d 30 20 29 7b 0a 20 20 20  rderBy==0 ){.   
f730: 20 20 20 20 20 69 6e 74 20 61 64 64 72 20 3d 20       int addr = 
f740: 30 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  0;.        asser
f750: 74 28 20 21 70 50 72 69 6f 72 2d 3e 70 4c 69 6d  t( !pPrior->pLim
f760: 69 74 20 29 3b 0a 20 20 20 20 20 20 20 20 70 50  it );.        pP
f770: 72 69 6f 72 2d 3e 70 4c 69 6d 69 74 20 3d 20 70  rior->pLimit = p
f780: 2d 3e 70 4c 69 6d 69 74 3b 0a 20 20 20 20 20 20  ->pLimit;.      
f790: 20 20 70 50 72 69 6f 72 2d 3e 70 4f 66 66 73 65    pPrior->pOffse
f7a0: 74 20 3d 20 70 2d 3e 70 4f 66 66 73 65 74 3b 0a  t = p->pOffset;.
f7b0: 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
f7c0: 69 74 65 33 53 65 6c 65 63 74 28 70 50 61 72 73  ite3Select(pPars
f7d0: 65 2c 20 70 50 72 69 6f 72 2c 20 26 64 65 73 74  e, pPrior, &dest
f7e0: 2c 20 30 2c 20 30 2c 20 30 2c 20 61 66 66 29 3b  , 0, 0, 0, aff);
f7f0: 0a 20 20 20 20 20 20 20 20 70 2d 3e 70 4c 69 6d  .        p->pLim
f800: 69 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  it = 0;.        
f810: 70 2d 3e 70 4f 66 66 73 65 74 20 3d 20 30 3b 0a  p->pOffset = 0;.
f820: 20 20 20 20 20 20 20 20 69 66 28 20 72 63 20 29          if( rc )
f830: 7b 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f  {.          goto
f840: 20 6d 75 6c 74 69 5f 73 65 6c 65 63 74 5f 65 6e   multi_select_en
f850: 64 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  d;.        }.   
f860: 20 20 20 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d       p->pPrior =
f870: 20 30 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 69   0;.        p->i
f880: 4c 69 6d 69 74 20 3d 20 70 50 72 69 6f 72 2d 3e  Limit = pPrior->
f890: 69 4c 69 6d 69 74 3b 0a 20 20 20 20 20 20 20 20  iLimit;.        
f8a0: 70 2d 3e 69 4f 66 66 73 65 74 20 3d 20 70 50 72  p->iOffset = pPr
f8b0: 69 6f 72 2d 3e 69 4f 66 66 73 65 74 3b 0a 20 20  ior->iOffset;.  
f8c0: 20 20 20 20 20 20 69 66 28 20 70 2d 3e 69 4c 69        if( p->iLi
f8d0: 6d 69 74 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20  mit>=0 ){.      
f8e0: 20 20 20 20 61 64 64 72 20 3d 20 73 71 6c 69 74      addr = sqlit
f8f0: 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20  e3VdbeAddOp1(v, 
f900: 4f 50 5f 49 66 5a 65 72 6f 2c 20 70 2d 3e 69 4c  OP_IfZero, p->iL
f910: 69 6d 69 74 29 3b 0a 20 20 20 20 20 20 20 20 20  imit);.         
f920: 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c   VdbeComment((v,
f930: 20 22 4a 75 6d 70 20 61 68 65 61 64 20 69 66 20   "Jump ahead if 
f940: 4c 49 4d 49 54 20 72 65 61 63 68 65 64 22 29 29  LIMIT reached"))
f950: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
f960: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
f970: 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70  Select(pParse, p
f980: 2c 20 26 64 65 73 74 2c 20 30 2c 20 30 2c 20 30  , &dest, 0, 0, 0
f990: 2c 20 61 66 66 29 3b 0a 20 20 20 20 20 20 20 20  , aff);.        
f9a0: 70 2d 3e 70 50 72 69 6f 72 20 3d 20 70 50 72 69  p->pPrior = pPri
f9b0: 6f 72 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  or;.        if( 
f9c0: 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  rc ){.          
f9d0: 67 6f 74 6f 20 6d 75 6c 74 69 5f 73 65 6c 65 63  goto multi_selec
f9e0: 74 5f 65 6e 64 3b 0a 20 20 20 20 20 20 20 20 7d  t_end;.        }
f9f0: 0a 20 20 20 20 20 20 20 20 69 66 28 20 61 64 64  .        if( add
fa00: 72 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73  r ){.          s
fa10: 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65  qlite3VdbeJumpHe
fa20: 72 65 28 76 2c 20 61 64 64 72 29 3b 0a 20 20 20  re(v, addr);.   
fa30: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 62       }.        b
fa40: 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  reak;.      }.  
fa50: 20 20 20 20 2f 2a 20 46 6f 72 20 55 4e 49 4f 4e      /* For UNION
fa60: 20 41 4c 4c 20 2e 2e 2e 20 4f 52 44 45 52 20 42   ALL ... ORDER B
fa70: 59 20 66 61 6c 6c 20 74 68 72 6f 75 67 68 20 74  Y fall through t
fa80: 6f 20 74 68 65 20 6e 65 78 74 20 63 61 73 65 20  o the next case 
fa90: 2a 2f 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  */.    }.    cas
faa0: 65 20 54 4b 5f 45 58 43 45 50 54 3a 0a 20 20 20  e TK_EXCEPT:.   
fab0: 20 63 61 73 65 20 54 4b 5f 55 4e 49 4f 4e 3a 20   case TK_UNION: 
fac0: 7b 0a 20 20 20 20 20 20 69 6e 74 20 75 6e 69 6f  {.      int unio
fad0: 6e 54 61 62 3b 20 20 20 20 2f 2a 20 43 75 72 73  nTab;    /* Curs
fae0: 6f 72 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65  or number of the
faf0: 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65   temporary table
fb00: 20 68 6f 6c 64 69 6e 67 20 72 65 73 75 6c 74 20   holding result 
fb10: 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 6f 70 20  */.      int op 
fb20: 3d 20 30 3b 20 20 20 20 20 20 2f 2a 20 4f 6e 65  = 0;      /* One
fb30: 20 6f 66 20 74 68 65 20 53 52 54 5f 20 6f 70 65   of the SRT_ ope
fb40: 72 61 74 69 6f 6e 73 20 74 6f 20 61 70 70 6c 79  rations to apply
fb50: 20 74 6f 20 73 65 6c 66 20 2a 2f 0a 20 20 20 20   to self */.    
fb60: 20 20 69 6e 74 20 70 72 69 6f 72 4f 70 3b 20 20    int priorOp;  
fb70: 20 20 20 2f 2a 20 54 68 65 20 53 52 54 5f 20 6f     /* The SRT_ o
fb80: 70 65 72 61 74 69 6f 6e 20 74 6f 20 61 70 70 6c  peration to appl
fb90: 79 20 74 6f 20 70 72 69 6f 72 20 73 65 6c 65 63  y to prior selec
fba0: 74 73 20 2a 2f 0a 20 20 20 20 20 20 45 78 70 72  ts */.      Expr
fbb0: 20 2a 70 4c 69 6d 69 74 2c 20 2a 70 4f 66 66 73   *pLimit, *pOffs
fbc0: 65 74 3b 20 2f 2a 20 53 61 76 65 64 20 76 61 6c  et; /* Saved val
fbd0: 75 65 73 20 6f 66 20 70 2d 3e 6e 4c 69 6d 69 74  ues of p->nLimit
fbe0: 20 61 6e 64 20 70 2d 3e 6e 4f 66 66 73 65 74 20   and p->nOffset 
fbf0: 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 61 64 64  */.      int add
fc00: 72 3b 0a 20 20 20 20 20 20 53 65 6c 65 63 74 44  r;.      SelectD
fc10: 65 73 74 20 75 6e 69 6f 6e 64 65 73 74 3b 0a 0a  est uniondest;..
fc20: 20 20 20 20 20 20 70 72 69 6f 72 4f 70 20 3d 20        priorOp = 
fc30: 70 2d 3e 6f 70 3d 3d 54 4b 5f 41 4c 4c 20 3f 20  p->op==TK_ALL ? 
fc40: 53 52 54 5f 54 61 62 6c 65 20 3a 20 53 52 54 5f  SRT_Table : SRT_
fc50: 55 6e 69 6f 6e 3b 0a 20 20 20 20 20 20 69 66 28  Union;.      if(
fc60: 20 64 65 73 74 2e 65 44 65 73 74 3d 3d 70 72 69   dest.eDest==pri
fc70: 6f 72 4f 70 20 26 26 20 70 4f 72 64 65 72 42 79  orOp && pOrderBy
fc80: 3d 3d 30 20 26 26 20 21 70 2d 3e 70 4c 69 6d 69  ==0 && !p->pLimi
fc90: 74 20 26 26 20 21 70 2d 3e 70 4f 66 66 73 65 74  t && !p->pOffset
fca0: 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 57   ){.        /* W
fcb0: 65 20 63 61 6e 20 72 65 75 73 65 20 61 20 74 65  e can reuse a te
fcc0: 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20 67 65  mporary table ge
fcd0: 6e 65 72 61 74 65 64 20 62 79 20 61 20 53 45 4c  nerated by a SEL
fce0: 45 43 54 20 74 6f 20 6f 75 72 0a 20 20 20 20 20  ECT to our.     
fcf0: 20 20 20 2a 2a 20 72 69 67 68 74 2e 0a 20 20 20     ** right..   
fd00: 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
fd10: 75 6e 69 6f 6e 54 61 62 20 3d 20 64 65 73 74 2e  unionTab = dest.
fd20: 69 50 61 72 6d 3b 0a 20 20 20 20 20 20 7d 65 6c  iParm;.      }el
fd30: 73 65 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 57  se{.        /* W
fd40: 65 20 77 69 6c 6c 20 6e 65 65 64 20 74 6f 20 63  e will need to c
fd50: 72 65 61 74 65 20 6f 75 72 20 6f 77 6e 20 74 65  reate our own te
fd60: 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20 74 6f  mporary table to
fd70: 20 68 6f 6c 64 20 74 68 65 0a 20 20 20 20 20 20   hold the.      
fd80: 20 20 2a 2a 20 69 6e 74 65 72 6d 65 64 69 61 74    ** intermediat
fd90: 65 20 72 65 73 75 6c 74 73 2e 0a 20 20 20 20 20  e results..     
fda0: 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 75 6e     */.        un
fdb0: 69 6f 6e 54 61 62 20 3d 20 70 50 61 72 73 65 2d  ionTab = pParse-
fdc0: 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20 20 20 20  >nTab++;.       
fdd0: 20 69 66 28 20 70 72 6f 63 65 73 73 43 6f 6d 70   if( processComp
fde0: 6f 75 6e 64 4f 72 64 65 72 42 79 28 70 50 61 72  oundOrderBy(pPar
fdf0: 73 65 2c 20 70 2c 20 75 6e 69 6f 6e 54 61 62 29  se, p, unionTab)
fe00: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63   ){.          rc
fe10: 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20   = 1;.          
fe20: 67 6f 74 6f 20 6d 75 6c 74 69 5f 73 65 6c 65 63  goto multi_selec
fe30: 74 5f 65 6e 64 3b 0a 20 20 20 20 20 20 20 20 7d  t_end;.        }
fe40: 0a 20 20 20 20 20 20 20 20 61 64 64 72 20 3d 20  .        addr = 
fe50: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
fe60: 32 28 76 2c 20 4f 50 5f 4f 70 65 6e 45 70 68 65  2(v, OP_OpenEphe
fe70: 6d 65 72 61 6c 2c 20 75 6e 69 6f 6e 54 61 62 2c  meral, unionTab,
fe80: 20 30 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28   0);.        if(
fe90: 20 70 72 69 6f 72 4f 70 3d 3d 53 52 54 5f 54 61   priorOp==SRT_Ta
fea0: 62 6c 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ble ){.         
feb0: 20 61 73 73 65 72 74 28 20 6e 53 65 74 50 32 3c   assert( nSetP2<
fec0: 73 69 7a 65 6f 66 28 61 53 65 74 50 32 29 2f 73  sizeof(aSetP2)/s
fed0: 69 7a 65 6f 66 28 61 53 65 74 50 32 5b 30 5d 29  izeof(aSetP2[0])
fee0: 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 61 53   );.          aS
fef0: 65 74 50 32 5b 6e 53 65 74 50 32 2b 2b 5d 20 3d  etP2[nSetP2++] =
ff00: 20 61 64 64 72 3b 0a 20 20 20 20 20 20 20 20 7d   addr;.        }
ff10: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
ff20: 61 73 73 65 72 74 28 20 70 2d 3e 61 64 64 72 4f  assert( p->addrO
ff30: 70 65 6e 45 70 68 6d 5b 30 5d 20 3d 3d 20 2d 31  penEphm[0] == -1
ff40: 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70 2d   );.          p-
ff50: 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b 30 5d  >addrOpenEphm[0]
ff60: 20 3d 20 61 64 64 72 3b 0a 20 20 20 20 20 20 20   = addr;.       
ff70: 20 20 20 70 2d 3e 70 52 69 67 68 74 6d 6f 73 74     p->pRightmost
ff80: 2d 3e 75 73 65 73 45 70 68 6d 20 3d 20 31 3b 0a  ->usesEphm = 1;.
ff90: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
ffa0: 20 20 63 72 65 61 74 65 53 6f 72 74 69 6e 67 49    createSortingI
ffb0: 6e 64 65 78 28 70 50 61 72 73 65 2c 20 70 2c 20  ndex(pParse, p, 
ffc0: 70 4f 72 64 65 72 42 79 29 3b 0a 20 20 20 20 20  pOrderBy);.     
ffd0: 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 45     assert( p->pE
ffe0: 4c 69 73 74 20 29 3b 0a 20 20 20 20 20 20 7d 0a  List );.      }.
fff0: 0a 20 20 20 20 20 20 2f 2a 20 43 6f 64 65 20 74  .      /* Code t
10000 68 65 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d  he SELECT statem
10010 65 6e 74 73 20 74 6f 20 6f 75 72 20 6c 65 66 74  ents to our left
10020 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
10030 61 73 73 65 72 74 28 20 21 70 50 72 69 6f 72 2d  assert( !pPrior-
10040 3e 70 4f 72 64 65 72 42 79 20 29 3b 0a 20 20 20  >pOrderBy );.   
10050 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74     sqlite3Select
10060 44 65 73 74 49 6e 69 74 28 26 75 6e 69 6f 6e 64  DestInit(&uniond
10070 65 73 74 2c 20 70 72 69 6f 72 4f 70 2c 20 75 6e  est, priorOp, un
10080 69 6f 6e 54 61 62 29 3b 0a 20 20 20 20 20 20 72  ionTab);.      r
10090 63 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63  c = sqlite3Selec
100a0 74 28 70 50 61 72 73 65 2c 20 70 50 72 69 6f 72  t(pParse, pPrior
100b0 2c 20 26 75 6e 69 6f 6e 64 65 73 74 2c 20 30 2c  , &uniondest, 0,
100c0 20 30 2c 20 30 2c 20 61 66 66 29 3b 0a 20 20 20   0, 0, aff);.   
100d0 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20     if( rc ){.   
100e0 20 20 20 20 20 67 6f 74 6f 20 6d 75 6c 74 69 5f       goto multi_
100f0 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20  select_end;.    
10100 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 43 6f    }..      /* Co
10110 64 65 20 74 68 65 20 63 75 72 72 65 6e 74 20 53  de the current S
10120 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 0a  ELECT statement.
10130 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 73        */.      s
10140 77 69 74 63 68 28 20 70 2d 3e 6f 70 20 29 7b 0a  witch( p->op ){.
10150 20 20 20 20 20 20 20 20 20 63 61 73 65 20 54 4b           case TK
10160 5f 45 58 43 45 50 54 3a 20 20 6f 70 20 3d 20 53  _EXCEPT:  op = S
10170 52 54 5f 45 78 63 65 70 74 3b 20 20 20 62 72 65  RT_Except;   bre
10180 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 63 61 73  ak;.         cas
10190 65 20 54 4b 5f 55 4e 49 4f 4e 3a 20 20 20 6f 70  e TK_UNION:   op
101a0 20 3d 20 53 52 54 5f 55 6e 69 6f 6e 3b 20 20 20   = SRT_Union;   
101b0 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
101c0 20 63 61 73 65 20 54 4b 5f 41 4c 4c 3a 20 20 20   case TK_ALL:   
101d0 20 20 6f 70 20 3d 20 53 52 54 5f 54 61 62 6c 65    op = SRT_Table
101e0 3b 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20  ;    break;.    
101f0 20 20 7d 0a 20 20 20 20 20 20 70 2d 3e 70 50 72    }.      p->pPr
10200 69 6f 72 20 3d 20 30 3b 0a 20 20 20 20 20 20 70  ior = 0;.      p
10210 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20 30 3b 0a  ->pOrderBy = 0;.
10220 20 20 20 20 20 20 70 2d 3e 64 69 73 61 6c 6c 6f        p->disallo
10230 77 4f 72 64 65 72 42 79 20 3d 20 70 4f 72 64 65  wOrderBy = pOrde
10240 72 42 79 21 3d 30 3b 0a 20 20 20 20 20 20 70 4c  rBy!=0;.      pL
10250 69 6d 69 74 20 3d 20 70 2d 3e 70 4c 69 6d 69 74  imit = p->pLimit
10260 3b 0a 20 20 20 20 20 20 70 2d 3e 70 4c 69 6d 69  ;.      p->pLimi
10270 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 4f 66  t = 0;.      pOf
10280 66 73 65 74 20 3d 20 70 2d 3e 70 4f 66 66 73 65  fset = p->pOffse
10290 74 3b 0a 20 20 20 20 20 20 70 2d 3e 70 4f 66 66  t;.      p->pOff
102a0 73 65 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 75  set = 0;.      u
102b0 6e 69 6f 6e 64 65 73 74 2e 65 44 65 73 74 20 3d  niondest.eDest =
102c0 20 6f 70 3b 0a 20 20 20 20 20 20 72 63 20 3d 20   op;.      rc = 
102d0 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28 70 50  sqlite3Select(pP
102e0 61 72 73 65 2c 20 70 2c 20 26 75 6e 69 6f 6e 64  arse, p, &uniond
102f0 65 73 74 2c 20 30 2c 20 30 2c 20 30 2c 20 61 66  est, 0, 0, 0, af
10300 66 29 3b 0a 20 20 20 20 20 20 2f 2a 20 51 75 65  f);.      /* Que
10310 72 79 20 66 6c 61 74 74 65 6e 69 6e 67 20 69 6e  ry flattening in
10320 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28 29   sqlite3Select()
10330 20 6d 69 67 68 74 20 72 65 66 69 6c 6c 20 70 2d   might refill p-
10340 3e 70 4f 72 64 65 72 42 79 2e 0a 20 20 20 20 20  >pOrderBy..     
10350 20 2a 2a 20 42 65 20 73 75 72 65 20 74 6f 20 64   ** Be sure to d
10360 65 6c 65 74 65 20 70 2d 3e 70 4f 72 64 65 72 42  elete p->pOrderB
10370 79 2c 20 74 68 65 72 65 66 6f 72 65 2c 20 74 6f  y, therefore, to
10380 20 61 76 6f 69 64 20 61 20 6d 65 6d 6f 72 79 20   avoid a memory 
10390 6c 65 61 6b 2e 20 2a 2f 0a 20 20 20 20 20 20 73  leak. */.      s
103a0 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 65  qlite3ExprListDe
103b0 6c 65 74 65 28 70 2d 3e 70 4f 72 64 65 72 42 79  lete(p->pOrderBy
103c0 29 3b 0a 20 20 20 20 20 20 70 2d 3e 70 50 72 69  );.      p->pPri
103d0 6f 72 20 3d 20 70 50 72 69 6f 72 3b 0a 20 20 20  or = pPrior;.   
103e0 20 20 20 70 2d 3e 70 4f 72 64 65 72 42 79 20 3d     p->pOrderBy =
103f0 20 70 4f 72 64 65 72 42 79 3b 0a 20 20 20 20 20   pOrderBy;.     
10400 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65   sqlite3ExprDele
10410 74 65 28 70 2d 3e 70 4c 69 6d 69 74 29 3b 0a 20  te(p->pLimit);. 
10420 20 20 20 20 20 70 2d 3e 70 4c 69 6d 69 74 20 3d       p->pLimit =
10430 20 70 4c 69 6d 69 74 3b 0a 20 20 20 20 20 20 70   pLimit;.      p
10440 2d 3e 70 4f 66 66 73 65 74 20 3d 20 70 4f 66 66  ->pOffset = pOff
10450 73 65 74 3b 0a 20 20 20 20 20 20 70 2d 3e 69 4c  set;.      p->iL
10460 69 6d 69 74 20 3d 20 2d 31 3b 0a 20 20 20 20 20  imit = -1;.     
10470 20 70 2d 3e 69 4f 66 66 73 65 74 20 3d 20 2d 31   p->iOffset = -1
10480 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 20 29  ;.      if( rc )
10490 7b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 6d  {.        goto m
104a0 75 6c 74 69 5f 73 65 6c 65 63 74 5f 65 6e 64 3b  ulti_select_end;
104b0 0a 20 20 20 20 20 20 7d 0a 0a 0a 20 20 20 20 20  .      }...     
104c0 20 2f 2a 20 43 6f 6e 76 65 72 74 20 74 68 65 20   /* Convert the 
104d0 64 61 74 61 20 69 6e 20 74 68 65 20 74 65 6d 70  data in the temp
104e0 6f 72 61 72 79 20 74 61 62 6c 65 20 69 6e 74 6f  orary table into
104f0 20 77 68 61 74 65 76 65 72 20 66 6f 72 6d 0a 20   whatever form. 
10500 20 20 20 20 20 2a 2a 20 69 74 20 69 73 20 74 68       ** it is th
10510 61 74 20 77 65 20 63 75 72 72 65 6e 74 6c 79 20  at we currently 
10520 6e 65 65 64 2e 0a 20 20 20 20 20 20 2a 2f 20 20  need..      */  
10530 20 20 20 20 0a 20 20 20 20 20 20 69 66 28 20 64      .      if( d
10540 65 73 74 2e 65 44 65 73 74 21 3d 70 72 69 6f 72  est.eDest!=prior
10550 4f 70 20 7c 7c 20 75 6e 69 6f 6e 54 61 62 21 3d  Op || unionTab!=
10560 64 65 73 74 2e 69 50 61 72 6d 20 29 7b 0a 20 20  dest.iParm ){.  
10570 20 20 20 20 20 20 69 6e 74 20 69 43 6f 6e 74 2c        int iCont,
10580 20 69 42 72 65 61 6b 2c 20 69 53 74 61 72 74 3b   iBreak, iStart;
10590 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
105a0 20 70 2d 3e 70 45 4c 69 73 74 20 29 3b 0a 20 20   p->pEList );.  
105b0 20 20 20 20 20 20 69 66 28 20 64 65 73 74 2e 65        if( dest.e
105c0 44 65 73 74 3d 3d 53 52 54 5f 43 61 6c 6c 62 61  Dest==SRT_Callba
105d0 63 6b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ck ){.          
105e0 53 65 6c 65 63 74 20 2a 70 46 69 72 73 74 20 3d  Select *pFirst =
105f0 20 70 3b 0a 20 20 20 20 20 20 20 20 20 20 77 68   p;.          wh
10600 69 6c 65 28 20 70 46 69 72 73 74 2d 3e 70 50 72  ile( pFirst->pPr
10610 69 6f 72 20 29 20 70 46 69 72 73 74 20 3d 20 70  ior ) pFirst = p
10620 46 69 72 73 74 2d 3e 70 50 72 69 6f 72 3b 0a 20  First->pPrior;. 
10630 20 20 20 20 20 20 20 20 20 67 65 6e 65 72 61 74           generat
10640 65 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 70 50 61  eColumnNames(pPa
10650 72 73 65 2c 20 30 2c 20 70 46 69 72 73 74 2d 3e  rse, 0, pFirst->
10660 70 45 4c 69 73 74 29 3b 0a 20 20 20 20 20 20 20  pEList);.       
10670 20 7d 0a 20 20 20 20 20 20 20 20 69 42 72 65 61   }.        iBrea
10680 6b 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d  k = sqlite3VdbeM
10690 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20  akeLabel(v);.   
106a0 20 20 20 20 20 69 43 6f 6e 74 20 3d 20 73 71 6c       iCont = sql
106b0 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65  ite3VdbeMakeLabe
106c0 6c 28 76 29 3b 0a 20 20 20 20 20 20 20 20 63 6f  l(v);.        co
106d0 6d 70 75 74 65 4c 69 6d 69 74 52 65 67 69 73 74  mputeLimitRegist
106e0 65 72 73 28 70 50 61 72 73 65 2c 20 70 2c 20 69  ers(pParse, p, i
106f0 42 72 65 61 6b 29 3b 0a 20 20 20 20 20 20 20 20  Break);.        
10700 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
10710 32 28 76 2c 20 4f 50 5f 52 65 77 69 6e 64 2c 20  2(v, OP_Rewind, 
10720 75 6e 69 6f 6e 54 61 62 2c 20 69 42 72 65 61 6b  unionTab, iBreak
10730 29 3b 0a 20 20 20 20 20 20 20 20 69 53 74 61 72  );.        iStar
10740 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43  t = sqlite3VdbeC
10750 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 20  urrentAddr(v);. 
10760 20 20 20 20 20 20 20 73 65 6c 65 63 74 49 6e 6e         selectInn
10770 65 72 4c 6f 6f 70 28 70 50 61 72 73 65 2c 20 70  erLoop(pParse, p
10780 2c 20 70 2d 3e 70 45 4c 69 73 74 2c 20 75 6e 69  , p->pEList, uni
10790 6f 6e 54 61 62 2c 20 70 2d 3e 70 45 4c 69 73 74  onTab, p->pEList
107a0 2d 3e 6e 45 78 70 72 2c 0a 20 20 20 20 20 20 20  ->nExpr,.       
107b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
107c0 20 70 4f 72 64 65 72 42 79 2c 20 2d 31 2c 20 26   pOrderBy, -1, &
107d0 64 65 73 74 2c 20 69 43 6f 6e 74 2c 20 69 42 72  dest, iCont, iBr
107e0 65 61 6b 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  eak, 0);.       
107f0 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f   sqlite3VdbeReso
10800 6c 76 65 4c 61 62 65 6c 28 76 2c 20 69 43 6f 6e  lveLabel(v, iCon
10810 74 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  t);.        sqli
10820 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
10830 20 4f 50 5f 4e 65 78 74 2c 20 75 6e 69 6f 6e 54   OP_Next, unionT
10840 61 62 2c 20 69 53 74 61 72 74 29 3b 0a 20 20 20  ab, iStart);.   
10850 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
10860 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20  ResolveLabel(v, 
10870 69 42 72 65 61 6b 29 3b 0a 20 20 20 20 20 20 20  iBreak);.       
10880 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
10890 70 32 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20  p2(v, OP_Close, 
108a0 75 6e 69 6f 6e 54 61 62 2c 20 30 29 3b 0a 20 20  unionTab, 0);.  
108b0 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61      }.      brea
108c0 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  k;.    }.    cas
108d0 65 20 54 4b 5f 49 4e 54 45 52 53 45 43 54 3a 20  e TK_INTERSECT: 
108e0 7b 0a 20 20 20 20 20 20 69 6e 74 20 74 61 62 31  {.      int tab1
108f0 2c 20 74 61 62 32 3b 0a 20 20 20 20 20 20 69 6e  , tab2;.      in
10900 74 20 69 43 6f 6e 74 2c 20 69 42 72 65 61 6b 2c  t iCont, iBreak,
10910 20 69 53 74 61 72 74 3b 0a 20 20 20 20 20 20 45   iStart;.      E
10920 78 70 72 20 2a 70 4c 69 6d 69 74 2c 20 2a 70 4f  xpr *pLimit, *pO
10930 66 66 73 65 74 3b 0a 20 20 20 20 20 20 69 6e 74  ffset;.      int
10940 20 61 64 64 72 3b 0a 20 20 20 20 20 20 53 65 6c   addr;.      Sel
10950 65 63 74 44 65 73 74 20 69 6e 74 65 72 73 65 63  ectDest intersec
10960 74 64 65 73 74 3b 0a 20 20 20 20 20 20 69 6e 74  tdest;.      int
10970 20 72 31 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 49   r1;..      /* I
10980 4e 54 45 52 53 45 43 54 20 69 73 20 64 69 66 66  NTERSECT is diff
10990 65 72 65 6e 74 20 66 72 6f 6d 20 74 68 65 20 6f  erent from the o
109a0 74 68 65 72 73 20 73 69 6e 63 65 20 69 74 20 72  thers since it r
109b0 65 71 75 69 72 65 73 0a 20 20 20 20 20 20 2a 2a  equires.      **
109c0 20 74 77 6f 20 74 65 6d 70 6f 72 61 72 79 20 74   two temporary t
109d0 61 62 6c 65 73 2e 20 20 48 65 6e 63 65 20 69 74  ables.  Hence it
109e0 20 68 61 73 20 69 74 73 20 6f 77 6e 20 63 61 73   has its own cas
109f0 65 2e 20 20 42 65 67 69 6e 0a 20 20 20 20 20 20  e.  Begin.      
10a00 2a 2a 20 62 79 20 61 6c 6c 6f 63 61 74 69 6e 67  ** by allocating
10a10 20 74 68 65 20 74 61 62 6c 65 73 20 77 65 20 77   the tables we w
10a20 69 6c 6c 20 6e 65 65 64 2e 0a 20 20 20 20 20 20  ill need..      
10a30 2a 2f 0a 20 20 20 20 20 20 74 61 62 31 20 3d 20  */.      tab1 = 
10a40 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a  pParse->nTab++;.
10a50 20 20 20 20 20 20 74 61 62 32 20 3d 20 70 50 61        tab2 = pPa
10a60 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20  rse->nTab++;.   
10a70 20 20 20 69 66 28 20 70 72 6f 63 65 73 73 43 6f     if( processCo
10a80 6d 70 6f 75 6e 64 4f 72 64 65 72 42 79 28 70 50  mpoundOrderBy(pP
10a90 61 72 73 65 2c 20 70 2c 20 74 61 62 31 29 20 29  arse, p, tab1) )
10aa0 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 31  {.        rc = 1
10ab0 3b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 6d  ;.        goto m
10ac0 75 6c 74 69 5f 73 65 6c 65 63 74 5f 65 6e 64 3b  ulti_select_end;
10ad0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 63  .      }.      c
10ae0 72 65 61 74 65 53 6f 72 74 69 6e 67 49 6e 64 65  reateSortingInde
10af0 78 28 70 50 61 72 73 65 2c 20 70 2c 20 70 4f 72  x(pParse, p, pOr
10b00 64 65 72 42 79 29 3b 0a 0a 20 20 20 20 20 20 61  derBy);..      a
10b10 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62  ddr = sqlite3Vdb
10b20 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4f 70  eAddOp2(v, OP_Op
10b30 65 6e 45 70 68 65 6d 65 72 61 6c 2c 20 74 61 62  enEphemeral, tab
10b40 31 2c 20 30 29 3b 0a 20 20 20 20 20 20 61 73 73  1, 0);.      ass
10b50 65 72 74 28 20 70 2d 3e 61 64 64 72 4f 70 65 6e  ert( p->addrOpen
10b60 45 70 68 6d 5b 30 5d 20 3d 3d 20 2d 31 20 29 3b  Ephm[0] == -1 );
10b70 0a 20 20 20 20 20 20 70 2d 3e 61 64 64 72 4f 70  .      p->addrOp
10b80 65 6e 45 70 68 6d 5b 30 5d 20 3d 20 61 64 64 72  enEphm[0] = addr
10b90 3b 0a 20 20 20 20 20 20 70 2d 3e 70 52 69 67 68  ;.      p->pRigh
10ba0 74 6d 6f 73 74 2d 3e 75 73 65 73 45 70 68 6d 20  tmost->usesEphm 
10bb0 3d 20 31 3b 0a 20 20 20 20 20 20 61 73 73 65 72  = 1;.      asser
10bc0 74 28 20 70 2d 3e 70 45 4c 69 73 74 20 29 3b 0a  t( p->pEList );.
10bd0 0a 20 20 20 20 20 20 2f 2a 20 43 6f 64 65 20 74  .      /* Code t
10be0 68 65 20 53 45 4c 45 43 54 73 20 74 6f 20 6f 75  he SELECTs to ou
10bf0 72 20 6c 65 66 74 20 69 6e 74 6f 20 74 65 6d 70  r left into temp
10c00 6f 72 61 72 79 20 74 61 62 6c 65 20 22 74 61 62  orary table "tab
10c10 31 22 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  1"..      */.   
10c20 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74     sqlite3Select
10c30 44 65 73 74 49 6e 69 74 28 26 69 6e 74 65 72 73  DestInit(&inters
10c40 65 63 74 64 65 73 74 2c 20 53 52 54 5f 55 6e 69  ectdest, SRT_Uni
10c50 6f 6e 2c 20 74 61 62 31 29 3b 0a 20 20 20 20 20  on, tab1);.     
10c60 20 72 63 20 3d 20 73 71 6c 69 74 65 33 53 65 6c   rc = sqlite3Sel
10c70 65 63 74 28 70 50 61 72 73 65 2c 20 70 50 72 69  ect(pParse, pPri
10c80 6f 72 2c 20 26 69 6e 74 65 72 73 65 63 74 64 65  or, &intersectde
10c90 73 74 2c 20 30 2c 20 30 2c 20 30 2c 20 61 66 66  st, 0, 0, 0, aff
10ca0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 20  );.      if( rc 
10cb0 29 7b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20  ){.        goto 
10cc0 6d 75 6c 74 69 5f 73 65 6c 65 63 74 5f 65 6e 64  multi_select_end
10cd0 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20  ;.      }..     
10ce0 20 2f 2a 20 43 6f 64 65 20 74 68 65 20 63 75 72   /* Code the cur
10cf0 72 65 6e 74 20 53 45 4c 45 43 54 20 69 6e 74 6f  rent SELECT into
10d00 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65   temporary table
10d10 20 22 74 61 62 32 22 0a 20 20 20 20 20 20 2a 2f   "tab2".      */
10d20 0a 20 20 20 20 20 20 61 64 64 72 20 3d 20 73 71  .      addr = sq
10d30 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
10d40 76 2c 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65  v, OP_OpenEpheme
10d50 72 61 6c 2c 20 74 61 62 32 2c 20 30 29 3b 0a 20  ral, tab2, 0);. 
10d60 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e       assert( p->
10d70 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b 31 5d 20  addrOpenEphm[1] 
10d80 3d 3d 20 2d 31 20 29 3b 0a 20 20 20 20 20 20 70  == -1 );.      p
10d90 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b 31  ->addrOpenEphm[1
10da0 5d 20 3d 20 61 64 64 72 3b 0a 20 20 20 20 20 20  ] = addr;.      
10db0 70 2d 3e 70 50 72 69 6f 72 20 3d 20 30 3b 0a 20  p->pPrior = 0;. 
10dc0 20 20 20 20 20 70 4c 69 6d 69 74 20 3d 20 70 2d       pLimit = p-
10dd0 3e 70 4c 69 6d 69 74 3b 0a 20 20 20 20 20 20 70  >pLimit;.      p
10de0 2d 3e 70 4c 69 6d 69 74 20 3d 20 30 3b 0a 20 20  ->pLimit = 0;.  
10df0 20 20 20 20 70 4f 66 66 73 65 74 20 3d 20 70 2d      pOffset = p-
10e00 3e 70 4f 66 66 73 65 74 3b 0a 20 20 20 20 20 20  >pOffset;.      
10e10 70 2d 3e 70 4f 66 66 73 65 74 20 3d 20 30 3b 0a  p->pOffset = 0;.
10e20 20 20 20 20 20 20 69 6e 74 65 72 73 65 63 74 64        intersectd
10e30 65 73 74 2e 69 50 61 72 6d 20 3d 20 74 61 62 32  est.iParm = tab2
10e40 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  ;.      rc = sql
10e50 69 74 65 33 53 65 6c 65 63 74 28 70 50 61 72 73  ite3Select(pPars
10e60 65 2c 20 70 2c 20 26 69 6e 74 65 72 73 65 63 74  e, p, &intersect
10e70 64 65 73 74 2c 20 30 2c 20 30 2c 20 30 2c 20 61  dest, 0, 0, 0, a
10e80 66 66 29 3b 0a 20 20 20 20 20 20 70 2d 3e 70 50  ff);.      p->pP
10e90 72 69 6f 72 20 3d 20 70 50 72 69 6f 72 3b 0a 20  rior = pPrior;. 
10ea0 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
10eb0 44 65 6c 65 74 65 28 70 2d 3e 70 4c 69 6d 69 74  Delete(p->pLimit
10ec0 29 3b 0a 20 20 20 20 20 20 70 2d 3e 70 4c 69 6d  );.      p->pLim
10ed0 69 74 20 3d 20 70 4c 69 6d 69 74 3b 0a 20 20 20  it = pLimit;.   
10ee0 20 20 20 70 2d 3e 70 4f 66 66 73 65 74 20 3d 20     p->pOffset = 
10ef0 70 4f 66 66 73 65 74 3b 0a 20 20 20 20 20 20 69  pOffset;.      i
10f00 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20  f( rc ){.       
10f10 20 67 6f 74 6f 20 6d 75 6c 74 69 5f 73 65 6c 65   goto multi_sele
10f20 63 74 5f 65 6e 64 3b 0a 20 20 20 20 20 20 7d 0a  ct_end;.      }.
10f30 0a 20 20 20 20 20 20 2f 2a 20 47 65 6e 65 72 61  .      /* Genera
10f40 74 65 20 63 6f 64 65 20 74 6f 20 74 61 6b 65 20  te code to take 
10f50 74 68 65 20 69 6e 74 65 72 73 65 63 74 69 6f 6e  the intersection
10f60 20 6f 66 20 74 68 65 20 74 77 6f 20 74 65 6d 70   of the two temp
10f70 6f 72 61 72 79 0a 20 20 20 20 20 20 2a 2a 20 74  orary.      ** t
10f80 61 62 6c 65 73 2e 0a 20 20 20 20 20 20 2a 2f 0a  ables..      */.
10f90 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d        assert( p-
10fa0 3e 70 45 4c 69 73 74 20 29 3b 0a 20 20 20 20 20  >pEList );.     
10fb0 20 69 66 28 20 64 65 73 74 2e 65 44 65 73 74 3d   if( dest.eDest=
10fc0 3d 53 52 54 5f 43 61 6c 6c 62 61 63 6b 20 29 7b  =SRT_Callback ){
10fd0 0a 20 20 20 20 20 20 20 20 53 65 6c 65 63 74 20  .        Select 
10fe0 2a 70 46 69 72 73 74 20 3d 20 70 3b 0a 20 20 20  *pFirst = p;.   
10ff0 20 20 20 20 20 77 68 69 6c 65 28 20 70 46 69 72       while( pFir
11000 73 74 2d 3e 70 50 72 69 6f 72 20 29 20 70 46 69  st->pPrior ) pFi
11010 72 73 74 20 3d 20 70 46 69 72 73 74 2d 3e 70 50  rst = pFirst->pP
11020 72 69 6f 72 3b 0a 20 20 20 20 20 20 20 20 67 65  rior;.        ge
11030 6e 65 72 61 74 65 43 6f 6c 75 6d 6e 4e 61 6d 65  nerateColumnName
11040 73 28 70 50 61 72 73 65 2c 20 30 2c 20 70 46 69  s(pParse, 0, pFi
11050 72 73 74 2d 3e 70 45 4c 69 73 74 29 3b 0a 20 20  rst->pEList);.  
11060 20 20 20 20 7d 0a 20 20 20 20 20 20 69 42 72 65      }.      iBre
11070 61 6b 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  ak = sqlite3Vdbe
11080 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20  MakeLabel(v);.  
11090 20 20 20 20 69 43 6f 6e 74 20 3d 20 73 71 6c 69      iCont = sqli
110a0 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c  te3VdbeMakeLabel
110b0 28 76 29 3b 0a 20 20 20 20 20 20 63 6f 6d 70 75  (v);.      compu
110c0 74 65 4c 69 6d 69 74 52 65 67 69 73 74 65 72 73  teLimitRegisters
110d0 28 70 50 61 72 73 65 2c 20 70 2c 20 69 42 72 65  (pParse, p, iBre
110e0 61 6b 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  ak);.      sqlit
110f0 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
11100 4f 50 5f 52 65 77 69 6e 64 2c 20 74 61 62 31 2c  OP_Rewind, tab1,
11110 20 69 42 72 65 61 6b 29 3b 0a 20 20 20 20 20 20   iBreak);.      
11120 72 31 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54  r1 = sqlite3GetT
11130 65 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a  empReg(pParse);.
11140 20 20 20 20 20 20 69 53 74 61 72 74 20 3d 20 73        iStart = s
11150 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
11160 28 76 2c 20 4f 50 5f 52 6f 77 4b 65 79 2c 20 74  (v, OP_RowKey, t
11170 61 62 31 2c 20 72 31 29 3b 0a 20 20 20 20 20 20  ab1, r1);.      
11180 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
11190 33 28 76 2c 20 4f 50 5f 4e 6f 74 46 6f 75 6e 64  3(v, OP_NotFound
111a0 2c 20 74 61 62 32 2c 20 69 43 6f 6e 74 2c 20 72  , tab2, iCont, r
111b0 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  1);.      sqlite
111c0 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28  3ReleaseTempReg(
111d0 70 50 61 72 73 65 2c 20 72 31 29 3b 0a 20 20 20  pParse, r1);.   
111e0 20 20 20 73 65 6c 65 63 74 49 6e 6e 65 72 4c 6f     selectInnerLo
111f0 6f 70 28 70 50 61 72 73 65 2c 20 70 2c 20 70 2d  op(pParse, p, p-
11200 3e 70 45 4c 69 73 74 2c 20 74 61 62 31 2c 20 70  >pEList, tab1, p
11210 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 2c  ->pEList->nExpr,
11220 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
11230 20 20 20 20 20 20 20 70 4f 72 64 65 72 42 79 2c         pOrderBy,
11240 20 2d 31 2c 20 26 64 65 73 74 2c 20 69 43 6f 6e   -1, &dest, iCon
11250 74 2c 20 69 42 72 65 61 6b 2c 20 30 29 3b 0a 20  t, iBreak, 0);. 
11260 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
11270 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20  ResolveLabel(v, 
11280 69 43 6f 6e 74 29 3b 0a 20 20 20 20 20 20 73 71  iCont);.      sq
11290 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
112a0 76 2c 20 4f 50 5f 4e 65 78 74 2c 20 74 61 62 31  v, OP_Next, tab1
112b0 2c 20 69 53 74 61 72 74 29 3b 0a 20 20 20 20 20  , iStart);.     
112c0 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f   sqlite3VdbeReso
112d0 6c 76 65 4c 61 62 65 6c 28 76 2c 20 69 42 72 65  lveLabel(v, iBre
112e0 61 6b 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  ak);.      sqlit
112f0 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
11300 4f 50 5f 43 6c 6f 73 65 2c 20 74 61 62 32 2c 20  OP_Close, tab2, 
11310 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  0);.      sqlite
11320 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
11330 50 5f 43 6c 6f 73 65 2c 20 74 61 62 31 2c 20 30  P_Close, tab1, 0
11340 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
11350 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
11360 4d 61 6b 65 20 73 75 72 65 20 61 6c 6c 20 53 45  Make sure all SE
11370 4c 45 43 54 73 20 69 6e 20 74 68 65 20 73 74 61  LECTs in the sta
11380 74 65 6d 65 6e 74 20 68 61 76 65 20 74 68 65 20  tement have the 
11390 73 61 6d 65 20 6e 75 6d 62 65 72 20 6f 66 20 65  same number of e
113a0 6c 65 6d 65 6e 74 73 0a 20 20 2a 2a 20 69 6e 20  lements.  ** in 
113b0 74 68 65 69 72 20 72 65 73 75 6c 74 20 73 65 74  their result set
113c0 73 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74  s..  */.  assert
113d0 28 20 70 2d 3e 70 45 4c 69 73 74 20 26 26 20 70  ( p->pEList && p
113e0 50 72 69 6f 72 2d 3e 70 45 4c 69 73 74 20 29 3b  Prior->pEList );
113f0 0a 20 20 69 66 28 20 70 2d 3e 70 45 4c 69 73 74  .  if( p->pEList
11400 2d 3e 6e 45 78 70 72 21 3d 70 50 72 69 6f 72 2d  ->nExpr!=pPrior-
11410 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 20 29  >pEList->nExpr )
11420 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72  {.    sqlite3Err
11430 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 53  orMsg(pParse, "S
11440 45 4c 45 43 54 73 20 74 6f 20 74 68 65 20 6c 65  ELECTs to the le
11450 66 74 20 61 6e 64 20 72 69 67 68 74 20 6f 66 20  ft and right of 
11460 25 73 22 0a 20 20 20 20 20 20 22 20 64 6f 20 6e  %s".      " do n
11470 6f 74 20 68 61 76 65 20 74 68 65 20 73 61 6d 65  ot have the same
11480 20 6e 75 6d 62 65 72 20 6f 66 20 72 65 73 75 6c   number of resul
11490 74 20 63 6f 6c 75 6d 6e 73 22 2c 20 73 65 6c 65  t columns", sele
114a0 63 74 4f 70 4e 61 6d 65 28 70 2d 3e 6f 70 29 29  ctOpName(p->op))
114b0 3b 0a 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20  ;.    rc = 1;.  
114c0 20 20 67 6f 74 6f 20 6d 75 6c 74 69 5f 73 65 6c    goto multi_sel
114d0 65 63 74 5f 65 6e 64 3b 0a 20 20 7d 0a 0a 20 20  ect_end;.  }..  
114e0 2f 2a 20 53 65 74 20 74 68 65 20 6e 75 6d 62 65  /* Set the numbe
114f0 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 69 6e 20  r of columns in 
11500 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 73  temporary tables
11510 0a 20 20 2a 2f 0a 20 20 6e 43 6f 6c 20 3d 20 70  .  */.  nCol = p
11520 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b  ->pEList->nExpr;
11530 0a 20 20 77 68 69 6c 65 28 20 6e 53 65 74 50 32  .  while( nSetP2
11540 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56   ){.    sqlite3V
11550 64 62 65 43 68 61 6e 67 65 50 32 28 76 2c 20 61  dbeChangeP2(v, a
11560 53 65 74 50 32 5b 2d 2d 6e 53 65 74 50 32 5d 2c  SetP2[--nSetP2],
11570 20 6e 43 6f 6c 29 3b 0a 20 20 7d 0a 0a 20 20 2f   nCol);.  }..  /
11580 2a 20 43 6f 6d 70 75 74 65 20 63 6f 6c 6c 61 74  * Compute collat
11590 69 6e 67 20 73 65 71 75 65 6e 63 65 73 20 75 73  ing sequences us
115a0 65 64 20 62 79 20 65 69 74 68 65 72 20 74 68 65  ed by either the
115b0 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65   ORDER BY clause
115c0 20 6f 72 0a 20 20 2a 2a 20 62 79 20 61 6e 79 20   or.  ** by any 
115d0 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 73  temporary tables
115e0 20 6e 65 65 64 65 64 20 74 6f 20 69 6d 70 6c 65   needed to imple
115f0 6d 65 6e 74 20 74 68 65 20 63 6f 6d 70 6f 75 6e  ment the compoun
11600 64 20 73 65 6c 65 63 74 2e 0a 20 20 2a 2a 20 41  d select..  ** A
11610 74 74 61 63 68 20 74 68 65 20 4b 65 79 49 6e 66  ttach the KeyInf
11620 6f 20 73 74 72 75 63 74 75 72 65 20 74 6f 20 61  o structure to a
11630 6c 6c 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62  ll temporary tab
11640 6c 65 73 2e 20 20 49 6e 76 6f 6b 65 20 74 68 65  les.  Invoke the
11650 0a 20 20 2a 2a 20 4f 52 44 45 52 20 42 59 20 70  .  ** ORDER BY p
11660 72 6f 63 65 73 73 69 6e 67 20 69 66 20 74 68 65  rocessing if the
11670 72 65 20 69 73 20 61 6e 20 4f 52 44 45 52 20 42  re is an ORDER B
11680 59 20 63 6c 61 75 73 65 2e 0a 20 20 2a 2a 0a 20  Y clause..  **. 
11690 20 2a 2a 20 54 68 69 73 20 73 65 63 74 69 6f 6e   ** This section
116a0 20 69 73 20 72 75 6e 20 62 79 20 74 68 65 20 72   is run by the r
116b0 69 67 68 74 2d 6d 6f 73 74 20 53 45 4c 45 43 54  ight-most SELECT
116c0 20 73 74 61 74 65 6d 65 6e 74 20 6f 6e 6c 79 2e   statement only.
116d0 0a 20 20 2a 2a 20 53 45 4c 45 43 54 20 73 74 61  .  ** SELECT sta
116e0 74 65 6d 65 6e 74 73 20 74 6f 20 74 68 65 20 6c  tements to the l
116f0 65 66 74 20 61 6c 77 61 79 73 20 73 6b 69 70 20  eft always skip 
11700 74 68 69 73 20 70 61 72 74 2e 20 20 54 68 65 20  this part.  The 
11710 72 69 67 68 74 2d 6d 6f 73 74 0a 20 20 2a 2a 20  right-most.  ** 
11720 53 45 4c 45 43 54 20 6d 69 67 68 74 20 61 6c 73  SELECT might als
11730 6f 20 73 6b 69 70 20 74 68 69 73 20 70 61 72 74  o skip this part
11740 20 69 66 20 69 74 20 68 61 73 20 6e 6f 20 4f 52   if it has no OR
11750 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 61 6e  DER BY clause an
11760 64 0a 20 20 2a 2a 20 6e 6f 20 74 65 6d 70 20 74  d.  ** no temp t
11770 61 62 6c 65 73 20 61 72 65 20 72 65 71 75 69 72  ables are requir
11780 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  ed..  */.  if( p
11790 4f 72 64 65 72 42 79 20 7c 7c 20 70 2d 3e 75 73  OrderBy || p->us
117a0 65 73 45 70 68 6d 20 29 7b 0a 20 20 20 20 69 6e  esEphm ){.    in
117b0 74 20 69 3b 20 20 20 20 20 20 20 20 20 20 20 20  t i;            
117c0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
117d0 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20  oop counter */. 
117e0 20 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79     KeyInfo *pKey
117f0 49 6e 66 6f 3b 20 20 20 20 20 20 20 20 20 20 20  Info;           
11800 20 2f 2a 20 43 6f 6c 6c 61 74 69 6e 67 20 73 65   /* Collating se
11810 71 75 65 6e 63 65 20 66 6f 72 20 74 68 65 20 72  quence for the r
11820 65 73 75 6c 74 20 73 65 74 20 2a 2f 0a 20 20 20  esult set */.   
11830 20 53 65 6c 65 63 74 20 2a 70 4c 6f 6f 70 3b 20   Select *pLoop; 
11840 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
11850 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e 67 20 74 68  * For looping th
11860 72 6f 75 67 68 20 53 45 4c 45 43 54 20 73 74 61  rough SELECT sta
11870 74 65 6d 65 6e 74 73 20 2a 2f 0a 20 20 20 20 69  tements */.    i
11880 6e 74 20 6e 4b 65 79 43 6f 6c 3b 20 20 20 20 20  nt nKeyCol;     
11890 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
118a0 4e 75 6d 62 65 72 20 6f 66 20 65 6e 74 72 69 65  Number of entrie
118b0 73 20 69 6e 20 70 4b 65 79 49 6e 66 6f 2d 3e 61  s in pKeyInfo->a
118c0 43 6f 6c 5b 5d 20 2a 2f 0a 20 20 20 20 43 6f 6c  Col[] */.    Col
118d0 6c 53 65 71 20 2a 2a 61 70 43 6f 6c 6c 3b 20 20  lSeq **apColl;  
118e0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6f             /* Fo
118f0 72 20 6c 6f 6f 70 69 6e 67 20 74 68 72 6f 75 67  r looping throug
11900 68 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 43 6f 6c  h pKeyInfo->aCol
11910 6c 5b 5d 20 2a 2f 0a 20 20 20 20 43 6f 6c 6c 53  l[] */.    CollS
11920 65 71 20 2a 2a 61 43 6f 70 79 3b 20 20 20 20 20  eq **aCopy;     
11930 20 20 20 20 20 20 20 20 20 2f 2a 20 41 20 63 6f           /* A co
11940 70 79 20 6f 66 20 70 4b 65 79 49 6e 66 6f 2d 3e  py of pKeyInfo->
11950 61 43 6f 6c 6c 5b 5d 20 2a 2f 0a 0a 20 20 20 20  aColl[] */..    
11960 61 73 73 65 72 74 28 20 70 2d 3e 70 52 69 67 68  assert( p->pRigh
11970 74 6d 6f 73 74 3d 3d 70 20 29 3b 0a 20 20 20 20  tmost==p );.    
11980 6e 4b 65 79 43 6f 6c 20 3d 20 6e 43 6f 6c 20 2b  nKeyCol = nCol +
11990 20 28 70 4f 72 64 65 72 42 79 20 3f 20 70 4f 72   (pOrderBy ? pOr
119a0 64 65 72 42 79 2d 3e 6e 45 78 70 72 20 3a 20 30  derBy->nExpr : 0
119b0 29 3b 0a 20 20 20 20 70 4b 65 79 49 6e 66 6f 20  );.    pKeyInfo 
119c0 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f  = sqlite3DbMallo
119d0 63 5a 65 72 6f 28 70 50 61 72 73 65 2d 3e 64 62  cZero(pParse->db
119e0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
119f0 20 20 20 20 20 20 20 20 20 73 69 7a 65 6f 66 28           sizeof(
11a00 2a 70 4b 65 79 49 6e 66 6f 29 2b 6e 4b 65 79 43  *pKeyInfo)+nKeyC
11a10 6f 6c 2a 28 73 69 7a 65 6f 66 28 43 6f 6c 6c 53  ol*(sizeof(CollS
11a20 65 71 2a 29 20 2b 20 31 29 29 3b 0a 20 20 20 20  eq*) + 1));.    
11a30 69 66 28 20 21 70 4b 65 79 49 6e 66 6f 20 29 7b  if( !pKeyInfo ){
11a40 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49  .      rc = SQLI
11a50 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20  TE_NOMEM;.      
11a60 67 6f 74 6f 20 6d 75 6c 74 69 5f 73 65 6c 65 63  goto multi_selec
11a70 74 5f 65 6e 64 3b 0a 20 20 20 20 7d 0a 0a 20 20  t_end;.    }..  
11a80 20 20 70 4b 65 79 49 6e 66 6f 2d 3e 65 6e 63 20    pKeyInfo->enc 
11a90 3d 20 45 4e 43 28 70 50 61 72 73 65 2d 3e 64 62  = ENC(pParse->db
11aa0 29 3b 0a 20 20 20 20 70 4b 65 79 49 6e 66 6f 2d  );.    pKeyInfo-
11ab0 3e 6e 46 69 65 6c 64 20 3d 20 6e 43 6f 6c 3b 0a  >nField = nCol;.
11ac0 0a 20 20 20 20 66 6f 72 28 69 3d 30 2c 20 61 70  .    for(i=0, ap
11ad0 43 6f 6c 6c 3d 70 4b 65 79 49 6e 66 6f 2d 3e 61  Coll=pKeyInfo->a
11ae0 43 6f 6c 6c 3b 20 69 3c 6e 43 6f 6c 3b 20 69 2b  Coll; i<nCol; i+
11af0 2b 2c 20 61 70 43 6f 6c 6c 2b 2b 29 7b 0a 20 20  +, apColl++){.  
11b00 20 20 20 20 2a 61 70 43 6f 6c 6c 20 3d 20 6d 75      *apColl = mu
11b10 6c 74 69 53 65 6c 65 63 74 43 6f 6c 6c 53 65 71  ltiSelectCollSeq
11b20 28 70 50 61 72 73 65 2c 20 70 2c 20 69 29 3b 0a  (pParse, p, i);.
11b30 20 20 20 20 20 20 69 66 28 20 30 3d 3d 2a 61 70        if( 0==*ap
11b40 43 6f 6c 6c 20 29 7b 0a 20 20 20 20 20 20 20 20  Coll ){.        
11b50 2a 61 70 43 6f 6c 6c 20 3d 20 70 50 61 72 73 65  *apColl = pParse
11b60 2d 3e 64 62 2d 3e 70 44 66 6c 74 43 6f 6c 6c 3b  ->db->pDfltColl;
11b70 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a  .      }.    }..
11b80 20 20 20 20 66 6f 72 28 70 4c 6f 6f 70 3d 70 3b      for(pLoop=p;
11b90 20 70 4c 6f 6f 70 3b 20 70 4c 6f 6f 70 3d 70 4c   pLoop; pLoop=pL
11ba0 6f 6f 70 2d 3e 70 50 72 69 6f 72 29 7b 0a 20 20  oop->pPrior){.  
11bb0 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 32      for(i=0; i<2
11bc0 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; i++){.        
11bd0 69 6e 74 20 61 64 64 72 20 3d 20 70 4c 6f 6f 70  int addr = pLoop
11be0 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b 69  ->addrOpenEphm[i
11bf0 5d 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 61  ];.        if( a
11c00 64 64 72 3c 30 20 29 7b 0a 20 20 20 20 20 20 20  ddr<0 ){.       
11c10 20 20 20 2f 2a 20 49 66 20 5b 30 5d 20 69 73 20     /* If [0] is 
11c20 75 6e 75 73 65 64 20 74 68 65 6e 20 5b 31 5d 20  unused then [1] 
11c30 69 73 20 61 6c 73 6f 20 75 6e 75 73 65 64 2e 20  is also unused. 
11c40 20 53 6f 20 77 65 20 63 61 6e 0a 20 20 20 20 20   So we can.     
11c50 20 20 20 20 20 2a 2a 20 61 6c 77 61 79 73 20 73       ** always s
11c60 61 66 65 6c 79 20 61 62 6f 72 74 20 61 73 20 73  afely abort as s
11c70 6f 6f 6e 20 61 73 20 74 68 65 20 66 69 72 73 74  oon as the first
11c80 20 75 6e 75 73 65 64 20 73 6c 6f 74 20 69 73 20   unused slot is 
11c90 66 6f 75 6e 64 20 2a 2f 0a 20 20 20 20 20 20 20  found */.       
11ca0 20 20 20 61 73 73 65 72 74 28 20 70 4c 6f 6f 70     assert( pLoop
11cb0 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b 31  ->addrOpenEphm[1
11cc0 5d 3c 30 20 29 3b 0a 20 20 20 20 20 20 20 20 20  ]<0 );.         
11cd0 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
11ce0 7d 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  }.        sqlite
11cf0 33 56 64 62 65 43 68 61 6e 67 65 50 32 28 76 2c  3VdbeChangeP2(v,
11d00 20 61 64 64 72 2c 20 6e 43 6f 6c 29 3b 0a 20 20   addr, nCol);.  
11d10 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
11d20 65 43 68 61 6e 67 65 50 34 28 76 2c 20 61 64 64  eChangeP4(v, add
11d30 72 2c 20 28 63 68 61 72 2a 29 70 4b 65 79 49 6e  r, (char*)pKeyIn
11d40 66 6f 2c 20 50 34 5f 4b 45 59 49 4e 46 4f 29 3b  fo, P4_KEYINFO);
11d50 0a 20 20 20 20 20 20 20 20 70 4c 6f 6f 70 2d 3e  .        pLoop->
11d60 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b 69 5d 20  addrOpenEphm[i] 
11d70 3d 20 2d 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20  = -1;.      }.  
11d80 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 70 4f 72    }..    if( pOr
11d90 64 65 72 42 79 20 29 7b 0a 20 20 20 20 20 20 73  derBy ){.      s
11da0 74 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69  truct ExprList_i
11db0 74 65 6d 20 2a 70 4f 54 65 72 6d 20 3d 20 70 4f  tem *pOTerm = pO
11dc0 72 64 65 72 42 79 2d 3e 61 3b 0a 20 20 20 20 20  rderBy->a;.     
11dd0 20 69 6e 74 20 6e 4f 72 64 65 72 42 79 45 78 70   int nOrderByExp
11de0 72 20 3d 20 70 4f 72 64 65 72 42 79 2d 3e 6e 45  r = pOrderBy->nE
11df0 78 70 72 3b 0a 20 20 20 20 20 20 69 6e 74 20 61  xpr;.      int a
11e00 64 64 72 3b 0a 20 20 20 20 20 20 75 38 20 2a 70  ddr;.      u8 *p
11e10 53 6f 72 74 4f 72 64 65 72 3b 0a 0a 20 20 20 20  SortOrder;..    
11e20 20 20 2f 2a 20 52 65 75 73 65 20 74 68 65 20 73    /* Reuse the s
11e30 61 6d 65 20 70 4b 65 79 49 6e 66 6f 20 66 6f 72  ame pKeyInfo for
11e40 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 61 73   the ORDER BY as
11e50 20 77 61 73 20 75 73 65 64 20 61 62 6f 76 65 20   was used above 
11e60 66 6f 72 0a 20 20 20 20 20 20 2a 2a 20 74 68 65  for.      ** the
11e70 20 63 6f 6d 70 6f 75 6e 64 20 73 65 6c 65 63 74   compound select
11e80 20 73 74 61 74 65 6d 65 6e 74 73 2e 20 20 45 78   statements.  Ex
11e90 63 65 70 74 20 77 65 20 68 61 76 65 20 74 6f 20  cept we have to 
11ea0 63 68 61 6e 67 65 20 6f 75 74 20 74 68 65 0a 20  change out the. 
11eb0 20 20 20 20 20 2a 2a 20 70 4b 65 79 49 6e 66 6f       ** pKeyInfo
11ec0 2d 3e 61 43 6f 6c 6c 5b 5d 20 76 61 6c 75 65 73  ->aColl[] values
11ed0 2e 20 20 53 6f 6d 65 20 6f 66 20 74 68 65 20 61  .  Some of the a
11ee0 43 6f 6c 6c 5b 5d 20 76 61 6c 75 65 73 20 77 69  Coll[] values wi
11ef0 6c 6c 20 62 65 0a 20 20 20 20 20 20 2a 2a 20 72  ll be.      ** r
11f00 65 75 73 65 64 20 77 68 65 6e 20 63 6f 6e 73 74  eused when const
11f10 72 75 63 74 69 6e 67 20 74 68 65 20 70 4b 65 79  ructing the pKey
11f20 49 6e 66 6f 20 66 6f 72 20 74 68 65 20 4f 52 44  Info for the ORD
11f30 45 52 20 42 59 2c 20 73 6f 20 6d 61 6b 65 0a 20  ER BY, so make. 
11f40 20 20 20 20 20 2a 2a 20 61 20 63 6f 70 79 2e 20       ** a copy. 
11f50 20 53 75 66 66 69 63 69 65 6e 74 20 73 70 61 63   Sufficient spac
11f60 65 20 74 6f 20 68 6f 6c 64 20 62 6f 74 68 20 74  e to hold both t
11f70 68 65 20 6e 43 6f 6c 20 65 6e 74 72 69 65 73 20  he nCol entries 
11f80 66 6f 72 0a 20 20 20 20 20 20 2a 2a 20 74 68 65  for.      ** the
11f90 20 63 6f 6d 70 6f 75 6e 64 20 73 65 6c 65 63 74   compound select
11fa0 20 61 6e 64 20 74 68 65 20 6e 4f 72 64 65 72 62   and the nOrderb
11fb0 79 45 78 70 72 20 65 6e 74 72 69 65 73 20 66 6f  yExpr entries fo
11fc0 72 20 74 68 65 20 4f 52 44 45 52 20 42 59 0a 20  r the ORDER BY. 
11fd0 20 20 20 20 20 2a 2a 20 77 61 73 20 61 6c 6c 6f       ** was allo
11fe0 63 61 74 65 64 20 61 62 6f 76 65 2e 20 20 42 75  cated above.  Bu
11ff0 74 20 77 65 20 6e 65 65 64 20 74 6f 20 6d 6f 76  t we need to mov
12000 65 20 74 68 65 20 63 6f 6d 70 6f 75 6e 64 20 73  e the compound s
12010 65 6c 65 63 74 0a 20 20 20 20 20 20 2a 2a 20 65  elect.      ** e
12020 6e 74 72 69 65 73 20 6f 75 74 20 6f 66 20 74 68  ntries out of th
12030 65 20 77 61 79 20 62 65 66 6f 72 65 20 63 6f 6e  e way before con
12040 73 74 72 75 63 74 69 6e 67 20 74 68 65 20 4f 52  structing the OR
12050 44 45 52 20 42 59 20 65 6e 74 72 69 65 73 2e 0a  DER BY entries..
12060 20 20 20 20 20 20 2a 2a 20 4d 6f 76 65 20 74 68        ** Move th
12070 65 20 63 6f 6d 70 6f 75 6e 64 20 73 65 6c 65 63  e compound selec
12080 74 20 65 6e 74 72 69 65 73 20 69 6e 74 6f 20 61  t entries into a
12090 43 6f 70 79 5b 5d 20 77 68 65 72 65 20 74 68 65  Copy[] where the
120a0 79 20 63 61 6e 20 62 65 0a 20 20 20 20 20 20 2a  y can be.      *
120b0 2a 20 61 63 63 65 73 73 65 64 20 61 6e 64 20 72  * accessed and r
120c0 65 75 73 65 64 20 77 68 65 6e 20 63 6f 6e 73 74  eused when const
120d0 72 75 63 74 69 6e 67 20 74 68 65 20 4f 52 44 45  ructing the ORDE
120e0 52 20 42 59 20 65 6e 74 72 69 65 73 2e 0a 20 20  R BY entries..  
120f0 20 20 20 20 2a 2a 20 42 65 63 61 75 73 65 20 6e      ** Because n
12100 43 6f 6c 20 6d 69 67 68 74 20 62 65 20 67 72 65  Col might be gre
12110 61 74 65 72 20 74 68 61 6e 20 6f 72 20 6c 65 73  ater than or les
12120 73 20 74 68 61 6e 20 6e 4f 72 64 65 72 42 79 45  s than nOrderByE
12130 78 70 72 0a 20 20 20 20 20 20 2a 2a 20 77 65 20  xpr.      ** we 
12140 68 61 76 65 20 74 6f 20 75 73 65 20 6d 65 6d 6d  have to use memm
12150 6f 76 65 28 29 20 77 68 65 6e 20 64 6f 69 6e 67  ove() when doing
12160 20 74 68 65 20 63 6f 70 79 2e 0a 20 20 20 20 20   the copy..     
12170 20 2a 2f 0a 20 20 20 20 20 20 61 43 6f 70 79 20   */.      aCopy 
12180 3d 20 26 70 4b 65 79 49 6e 66 6f 2d 3e 61 43 6f  = &pKeyInfo->aCo
12190 6c 6c 5b 6e 4f 72 64 65 72 42 79 45 78 70 72 5d  ll[nOrderByExpr]
121a0 3b 0a 20 20 20 20 20 20 70 53 6f 72 74 4f 72 64  ;.      pSortOrd
121b0 65 72 20 3d 20 70 4b 65 79 49 6e 66 6f 2d 3e 61  er = pKeyInfo->a
121c0 53 6f 72 74 4f 72 64 65 72 20 3d 20 28 75 38 2a  SortOrder = (u8*
121d0 29 26 61 43 6f 70 79 5b 6e 43 6f 6c 5d 3b 0a 20  )&aCopy[nCol];. 
121e0 20 20 20 20 20 6d 65 6d 6d 6f 76 65 28 61 43 6f       memmove(aCo
121f0 70 79 2c 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 43  py, pKeyInfo->aC
12200 6f 6c 6c 2c 20 6e 43 6f 6c 2a 73 69 7a 65 6f 66  oll, nCol*sizeof
12210 28 43 6f 6c 6c 53 65 71 2a 29 29 3b 0a 0a 20 20  (CollSeq*));..  
12220 20 20 20 20 61 70 43 6f 6c 6c 20 3d 20 70 4b 65      apColl = pKe
12230 79 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 3b 0a 20 20  yInfo->aColl;.  
12240 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e      for(i=0; i<n
12250 4f 72 64 65 72 42 79 45 78 70 72 3b 20 69 2b 2b  OrderByExpr; i++
12260 2c 20 70 4f 54 65 72 6d 2b 2b 2c 20 61 70 43 6f  , pOTerm++, apCo
12270 6c 6c 2b 2b 2c 20 70 53 6f 72 74 4f 72 64 65 72  ll++, pSortOrder
12280 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 45 78 70  ++){.        Exp
12290 72 20 2a 70 45 78 70 72 20 3d 20 70 4f 54 65 72  r *pExpr = pOTer
122a0 6d 2d 3e 70 45 78 70 72 3b 0a 20 20 20 20 20 20  m->pExpr;.      
122b0 20 20 69 66 28 20 28 70 45 78 70 72 2d 3e 66 6c    if( (pExpr->fl
122c0 61 67 73 20 26 20 45 50 5f 45 78 70 43 6f 6c 6c  ags & EP_ExpColl
122d0 61 74 65 29 20 29 7b 0a 20 20 20 20 20 20 20 20  ate) ){.        
122e0 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d    assert( pExpr-
122f0 3e 70 43 6f 6c 6c 21 3d 30 20 29 3b 0a 20 20 20  >pColl!=0 );.   
12300 20 20 20 20 20 20 20 2a 61 70 43 6f 6c 6c 20 3d         *apColl =
12310 20 70 45 78 70 72 2d 3e 70 43 6f 6c 6c 3b 0a 20   pExpr->pColl;. 
12320 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
12330 20 20 20 20 20 20 20 20 2a 61 70 43 6f 6c 6c 20          *apColl 
12340 3d 20 61 43 6f 70 79 5b 70 45 78 70 72 2d 3e 69  = aCopy[pExpr->i
12350 43 6f 6c 75 6d 6e 5d 3b 0a 20 20 20 20 20 20 20  Column];.       
12360 20 7d 0a 20 20 20 20 20 20 20 20 2a 70 53 6f 72   }.        *pSor
12370 74 4f 72 64 65 72 20 3d 20 70 4f 54 65 72 6d 2d  tOrder = pOTerm-
12380 3e 73 6f 72 74 4f 72 64 65 72 3b 0a 20 20 20 20  >sortOrder;.    
12390 20 20 7d 0a 20 20 20 20 20 20 61 73 73 65 72 74    }.      assert
123a0 28 20 70 2d 3e 70 52 69 67 68 74 6d 6f 73 74 3d  ( p->pRightmost=
123b0 3d 70 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  =p );.      asse
123c0 72 74 28 20 70 2d 3e 61 64 64 72 4f 70 65 6e 45  rt( p->addrOpenE
123d0 70 68 6d 5b 32 5d 3e 3d 30 20 29 3b 0a 20 20 20  phm[2]>=0 );.   
123e0 20 20 20 61 64 64 72 20 3d 20 70 2d 3e 61 64 64     addr = p->add
123f0 72 4f 70 65 6e 45 70 68 6d 5b 32 5d 3b 0a 20 20  rOpenEphm[2];.  
12400 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43      sqlite3VdbeC
12410 68 61 6e 67 65 50 32 28 76 2c 20 61 64 64 72 2c  hangeP2(v, addr,
12420 20 70 2d 3e 70 4f 72 64 65 72 42 79 2d 3e 6e 45   p->pOrderBy->nE
12430 78 70 72 2b 32 29 3b 0a 20 20 20 20 20 20 70 4b  xpr+2);.      pK
12440 65 79 49 6e 66 6f 2d 3e 6e 46 69 65 6c 64 20 3d  eyInfo->nField =
12450 20 6e 4f 72 64 65 72 42 79 45 78 70 72 3b 0a 20   nOrderByExpr;. 
12460 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
12470 43 68 61 6e 67 65 50 34 28 76 2c 20 61 64 64 72  ChangeP4(v, addr
12480 2c 20 28 63 68 61 72 2a 29 70 4b 65 79 49 6e 66  , (char*)pKeyInf
12490 6f 2c 20 50 34 5f 4b 45 59 49 4e 46 4f 5f 48 41  o, P4_KEYINFO_HA
124a0 4e 44 4f 46 46 29 3b 0a 20 20 20 20 20 20 70 4b  NDOFF);.      pK
124b0 65 79 49 6e 66 6f 20 3d 20 30 3b 0a 20 20 20 20  eyInfo = 0;.    
124c0 20 20 67 65 6e 65 72 61 74 65 53 6f 72 74 54 61    generateSortTa
124d0 69 6c 28 70 50 61 72 73 65 2c 20 70 2c 20 76 2c  il(pParse, p, v,
124e0 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70   p->pEList->nExp
124f0 72 2c 20 26 64 65 73 74 29 3b 0a 20 20 20 20 7d  r, &dest);.    }
12500 0a 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72  ..    sqlite3_fr
12510 65 65 28 70 4b 65 79 49 6e 66 6f 29 3b 0a 20 20  ee(pKeyInfo);.  
12520 7d 0a 0a 6d 75 6c 74 69 5f 73 65 6c 65 63 74 5f  }..multi_select_
12530 65 6e 64 3a 0a 20 20 70 44 65 73 74 2d 3e 69 4d  end:.  pDest->iM
12540 65 6d 20 3d 20 64 65 73 74 2e 69 4d 65 6d 3b 0a  em = dest.iMem;.
12550 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 23    return rc;.}.#
12560 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
12570 4f 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45  OMIT_COMPOUND_SE
12580 4c 45 43 54 20 2a 2f 0a 0a 23 69 66 6e 64 65 66  LECT */..#ifndef
12590 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45   SQLITE_OMIT_VIE
125a0 57 0a 2f 2a 20 46 6f 72 77 61 72 64 20 44 65 63  W./* Forward Dec
125b0 6c 61 72 61 74 69 6f 6e 73 20 2a 2f 0a 73 74 61  larations */.sta
125c0 74 69 63 20 76 6f 69 64 20 73 75 62 73 74 45 78  tic void substEx
125d0 70 72 4c 69 73 74 28 73 71 6c 69 74 65 33 2a 2c  prList(sqlite3*,
125e0 20 45 78 70 72 4c 69 73 74 2a 2c 20 69 6e 74 2c   ExprList*, int,
125f0 20 45 78 70 72 4c 69 73 74 2a 29 3b 0a 73 74 61   ExprList*);.sta
12600 74 69 63 20 76 6f 69 64 20 73 75 62 73 74 53 65  tic void substSe
12610 6c 65 63 74 28 73 71 6c 69 74 65 33 2a 2c 20 53  lect(sqlite3*, S
12620 65 6c 65 63 74 20 2a 2c 20 69 6e 74 2c 20 45 78  elect *, int, Ex
12630 70 72 4c 69 73 74 20 2a 29 3b 0a 0a 2f 2a 0a 2a  prList *);../*.*
12640 2a 20 53 63 61 6e 20 74 68 72 6f 75 67 68 20 74  * Scan through t
12650 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 70 45  he expression pE
12660 78 70 72 2e 20 20 52 65 70 6c 61 63 65 20 65 76  xpr.  Replace ev
12670 65 72 79 20 72 65 66 65 72 65 6e 63 65 20 74 6f  ery reference to
12680 0a 2a 2a 20 61 20 63 6f 6c 75 6d 6e 20 69 6e 20  .** a column in 
12690 74 61 62 6c 65 20 6e 75 6d 62 65 72 20 69 54 61  table number iTa
126a0 62 6c 65 20 77 69 74 68 20 61 20 63 6f 70 79 20  ble with a copy 
126b0 6f 66 20 74 68 65 20 69 43 6f 6c 75 6d 6e 2d 74  of the iColumn-t
126c0 68 0a 2a 2a 20 65 6e 74 72 79 20 69 6e 20 70 45  h.** entry in pE
126d0 4c 69 73 74 2e 20 20 28 42 75 74 20 6c 65 61 76  List.  (But leav
126e0 65 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20  e references to 
126f0 74 68 65 20 52 4f 57 49 44 20 63 6f 6c 75 6d 6e  the ROWID column
12700 20 0a 2a 2a 20 75 6e 63 68 61 6e 67 65 64 2e 29   .** unchanged.)
12710 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
12720 69 6e 65 20 69 73 20 70 61 72 74 20 6f 66 20 74  ine is part of t
12730 68 65 20 66 6c 61 74 74 65 6e 69 6e 67 20 70 72  he flattening pr
12740 6f 63 65 64 75 72 65 2e 20 20 41 20 73 75 62 71  ocedure.  A subq
12750 75 65 72 79 0a 2a 2a 20 77 68 6f 73 65 20 72 65  uery.** whose re
12760 73 75 6c 74 20 73 65 74 20 69 73 20 64 65 66 69  sult set is defi
12770 6e 65 64 20 62 79 20 70 45 4c 69 73 74 20 61 70  ned by pEList ap
12780 70 65 61 72 73 20 61 73 20 65 6e 74 72 79 20 69  pears as entry i
12790 6e 20 74 68 65 0a 2a 2a 20 46 52 4f 4d 20 63 6c  n the.** FROM cl
127a0 61 75 73 65 20 6f 66 20 61 20 53 45 4c 45 43 54  ause of a SELECT
127b0 20 73 75 63 68 20 74 68 61 74 20 74 68 65 20 56   such that the V
127c0 44 42 45 20 63 75 72 73 6f 72 20 61 73 73 69 67  DBE cursor assig
127d0 6e 65 64 20 74 6f 20 74 68 61 74 0a 2a 2a 20 46  ned to that.** F
127e0 4f 52 4d 20 63 6c 61 75 73 65 20 65 6e 74 72 79  ORM clause entry
127f0 20 69 73 20 69 54 61 62 6c 65 2e 20 20 54 68 69   is iTable.  Thi
12800 73 20 72 6f 75 74 69 6e 65 20 6d 61 6b 65 20 74  s routine make t
12810 68 65 20 6e 65 63 65 73 73 61 72 79 20 0a 2a 2a  he necessary .**
12820 20 63 68 61 6e 67 65 73 20 74 6f 20 70 45 78 70   changes to pExp
12830 72 20 73 6f 20 74 68 61 74 20 69 74 20 72 65 66  r so that it ref
12840 65 72 73 20 64 69 72 65 63 74 6c 79 20 74 6f 20  ers directly to 
12850 74 68 65 20 73 6f 75 72 63 65 20 74 61 62 6c 65  the source table
12860 0a 2a 2a 20 6f 66 20 74 68 65 20 73 75 62 71 75  .** of the subqu
12870 65 72 79 20 72 61 74 68 65 72 20 74 68 65 20 72  ery rather the r
12880 65 73 75 6c 74 20 73 65 74 20 6f 66 20 74 68 65  esult set of the
12890 20 73 75 62 71 75 65 72 79 2e 0a 2a 2f 0a 73 74   subquery..*/.st
128a0 61 74 69 63 20 76 6f 69 64 20 73 75 62 73 74 45  atic void substE
128b0 78 70 72 28 0a 20 20 73 71 6c 69 74 65 33 20 2a  xpr(.  sqlite3 *
128c0 64 62 2c 20 20 20 20 20 20 20 20 2f 2a 20 52 65  db,        /* Re
128d0 70 6f 72 74 20 6d 61 6c 6c 6f 63 20 65 72 72 6f  port malloc erro
128e0 72 73 20 74 6f 20 74 68 69 73 20 63 6f 6e 6e 65  rs to this conne
128f0 63 74 69 6f 6e 20 2a 2f 0a 20 20 45 78 70 72 20  ction */.  Expr 
12900 2a 70 45 78 70 72 2c 20 20 20 20 20 20 20 20 2f  *pExpr,        /
12910 2a 20 45 78 70 72 20 69 6e 20 77 68 69 63 68 20  * Expr in which 
12920 73 75 62 73 74 69 74 75 74 69 6f 6e 20 6f 63 63  substitution occ
12930 75 72 73 20 2a 2f 0a 20 20 69 6e 74 20 69 54 61  urs */.  int iTa
12940 62 6c 65 2c 20 20 20 20 20 20 20 20 20 2f 2a 20  ble,         /* 
12950 54 61 62 6c 65 20 74 6f 20 62 65 20 73 75 62 73  Table to be subs
12960 74 69 74 75 74 65 64 20 2a 2f 0a 20 20 45 78 70  tituted */.  Exp
12970 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 20 20 20  rList *pEList   
12980 20 2f 2a 20 53 75 62 73 74 69 74 75 74 65 20 65   /* Substitute e
12990 78 70 72 65 73 73 69 6f 6e 73 20 2a 2f 0a 29 7b  xpressions */.){
129a0 0a 20 20 69 66 28 20 70 45 78 70 72 3d 3d 30 20  .  if( pExpr==0 
129b0 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20  ) return;.  if( 
129c0 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f  pExpr->op==TK_CO
129d0 4c 55 4d 4e 20 26 26 20 70 45 78 70 72 2d 3e 69  LUMN && pExpr->i
129e0 54 61 62 6c 65 3d 3d 69 54 61 62 6c 65 20 29 7b  Table==iTable ){
129f0 0a 20 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e  .    if( pExpr->
12a00 69 43 6f 6c 75 6d 6e 3c 30 20 29 7b 0a 20 20 20  iColumn<0 ){.   
12a10 20 20 20 70 45 78 70 72 2d 3e 6f 70 20 3d 20 54     pExpr->op = T
12a20 4b 5f 4e 55 4c 4c 3b 0a 20 20 20 20 7d 65 6c 73  K_NULL;.    }els
12a30 65 7b 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70  e{.      Expr *p
12a40 4e 65 77 3b 0a 20 20 20 20 20 20 61 73 73 65 72  New;.      asser
12a50 74 28 20 70 45 4c 69 73 74 21 3d 30 20 26 26 20  t( pEList!=0 && 
12a60 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3c 70  pExpr->iColumn<p
12a70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 20 29 3b 0a  EList->nExpr );.
12a80 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 45        assert( pE
12a90 78 70 72 2d 3e 70 4c 65 66 74 3d 3d 30 20 26 26  xpr->pLeft==0 &&
12aa0 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 3d 3d   pExpr->pRight==
12ab0 30 20 26 26 20 70 45 78 70 72 2d 3e 70 4c 69 73  0 && pExpr->pLis
12ac0 74 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 70 4e  t==0 );.      pN
12ad0 65 77 20 3d 20 70 45 4c 69 73 74 2d 3e 61 5b 70  ew = pEList->a[p
12ae0 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 5d 2e 70  Expr->iColumn].p
12af0 45 78 70 72 3b 0a 20 20 20 20 20 20 61 73 73 65  Expr;.      asse
12b00 72 74 28 20 70 4e 65 77 21 3d 30 20 29 3b 0a 20  rt( pNew!=0 );. 
12b10 20 20 20 20 20 70 45 78 70 72 2d 3e 6f 70 20 3d       pExpr->op =
12b20 20 70 4e 65 77 2d 3e 6f 70 3b 0a 20 20 20 20 20   pNew->op;.     
12b30 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e   assert( pExpr->
12b40 70 4c 65 66 74 3d 3d 30 20 29 3b 0a 20 20 20 20  pLeft==0 );.    
12b50 20 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 20 3d    pExpr->pLeft =
12b60 20 73 71 6c 69 74 65 33 45 78 70 72 44 75 70 28   sqlite3ExprDup(
12b70 64 62 2c 20 70 4e 65 77 2d 3e 70 4c 65 66 74 29  db, pNew->pLeft)
12b80 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
12b90 70 45 78 70 72 2d 3e 70 52 69 67 68 74 3d 3d 30  pExpr->pRight==0
12ba0 20 29 3b 0a 20 20 20 20 20 20 70 45 78 70 72 2d   );.      pExpr-
12bb0 3e 70 52 69 67 68 74 20 3d 20 73 71 6c 69 74 65  >pRight = sqlite
12bc0 33 45 78 70 72 44 75 70 28 64 62 2c 20 70 4e 65  3ExprDup(db, pNe
12bd0 77 2d 3e 70 52 69 67 68 74 29 3b 0a 20 20 20 20  w->pRight);.    
12be0 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d    assert( pExpr-
12bf0 3e 70 4c 69 73 74 3d 3d 30 20 29 3b 0a 20 20 20  >pList==0 );.   
12c00 20 20 20 70 45 78 70 72 2d 3e 70 4c 69 73 74 20     pExpr->pList 
12c10 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73  = sqlite3ExprLis
12c20 74 44 75 70 28 64 62 2c 20 70 4e 65 77 2d 3e 70  tDup(db, pNew->p
12c30 4c 69 73 74 29 3b 0a 20 20 20 20 20 20 70 45 78  List);.      pEx
12c40 70 72 2d 3e 69 54 61 62 6c 65 20 3d 20 70 4e 65  pr->iTable = pNe
12c50 77 2d 3e 69 54 61 62 6c 65 3b 0a 20 20 20 20 20  w->iTable;.     
12c60 20 70 45 78 70 72 2d 3e 70 54 61 62 20 3d 20 70   pExpr->pTab = p
12c70 4e 65 77 2d 3e 70 54 61 62 3b 0a 20 20 20 20 20  New->pTab;.     
12c80 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 20   pExpr->iColumn 
12c90 3d 20 70 4e 65 77 2d 3e 69 43 6f 6c 75 6d 6e 3b  = pNew->iColumn;
12ca0 0a 20 20 20 20 20 20 70 45 78 70 72 2d 3e 69 41  .      pExpr->iA
12cb0 67 67 20 3d 20 70 4e 65 77 2d 3e 69 41 67 67 3b  gg = pNew->iAgg;
12cc0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 54 6f  .      sqlite3To
12cd0 6b 65 6e 43 6f 70 79 28 64 62 2c 20 26 70 45 78  kenCopy(db, &pEx
12ce0 70 72 2d 3e 74 6f 6b 65 6e 2c 20 26 70 4e 65 77  pr->token, &pNew
12cf0 2d 3e 74 6f 6b 65 6e 29 3b 0a 20 20 20 20 20 20  ->token);.      
12d00 73 71 6c 69 74 65 33 54 6f 6b 65 6e 43 6f 70 79  sqlite3TokenCopy
12d10 28 64 62 2c 20 26 70 45 78 70 72 2d 3e 73 70 61  (db, &pExpr->spa
12d20 6e 2c 20 26 70 4e 65 77 2d 3e 73 70 61 6e 29 3b  n, &pNew->span);
12d30 0a 20 20 20 20 20 20 70 45 78 70 72 2d 3e 70 53  .      pExpr->pS
12d40 65 6c 65 63 74 20 3d 20 73 71 6c 69 74 65 33 53  elect = sqlite3S
12d50 65 6c 65 63 74 44 75 70 28 64 62 2c 20 70 4e 65  electDup(db, pNe
12d60 77 2d 3e 70 53 65 6c 65 63 74 29 3b 0a 20 20 20  w->pSelect);.   
12d70 20 20 20 70 45 78 70 72 2d 3e 66 6c 61 67 73 20     pExpr->flags 
12d80 3d 20 70 4e 65 77 2d 3e 66 6c 61 67 73 3b 0a 20  = pNew->flags;. 
12d90 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20     }.  }else{.  
12da0 20 20 73 75 62 73 74 45 78 70 72 28 64 62 2c 20    substExpr(db, 
12db0 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 69 54  pExpr->pLeft, iT
12dc0 61 62 6c 65 2c 20 70 45 4c 69 73 74 29 3b 0a 20  able, pEList);. 
12dd0 20 20 20 73 75 62 73 74 45 78 70 72 28 64 62 2c     substExpr(db,
12de0 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20   pExpr->pRight, 
12df0 69 54 61 62 6c 65 2c 20 70 45 4c 69 73 74 29 3b  iTable, pEList);
12e00 0a 20 20 20 20 73 75 62 73 74 53 65 6c 65 63 74  .    substSelect
12e10 28 64 62 2c 20 70 45 78 70 72 2d 3e 70 53 65 6c  (db, pExpr->pSel
12e20 65 63 74 2c 20 69 54 61 62 6c 65 2c 20 70 45 4c  ect, iTable, pEL
12e30 69 73 74 29 3b 0a 20 20 20 20 73 75 62 73 74 45  ist);.    substE
12e40 78 70 72 4c 69 73 74 28 64 62 2c 20 70 45 78 70  xprList(db, pExp
12e50 72 2d 3e 70 4c 69 73 74 2c 20 69 54 61 62 6c 65  r->pList, iTable
12e60 2c 20 70 45 4c 69 73 74 29 3b 0a 20 20 7d 0a 7d  , pEList);.  }.}
12e70 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 75 62  .static void sub
12e80 73 74 45 78 70 72 4c 69 73 74 28 0a 20 20 73 71  stExprList(.  sq
12e90 6c 69 74 65 33 20 2a 64 62 2c 20 20 20 20 20 20  lite3 *db,      
12ea0 20 20 20 2f 2a 20 52 65 70 6f 72 74 20 6d 61 6c     /* Report mal
12eb0 6c 6f 63 20 65 72 72 6f 72 73 20 68 65 72 65 20  loc errors here 
12ec0 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70  */.  ExprList *p
12ed0 4c 69 73 74 2c 20 20 20 20 20 2f 2a 20 4c 69 73  List,     /* Lis
12ee0 74 20 74 6f 20 73 63 61 6e 20 61 6e 64 20 69 6e  t to scan and in
12ef0 20 77 68 69 63 68 20 74 6f 20 6d 61 6b 65 20 73   which to make s
12f00 75 62 73 74 69 74 75 74 65 73 20 2a 2f 0a 20 20  ubstitutes */.  
12f10 69 6e 74 20 69 54 61 62 6c 65 2c 20 20 20 20 20  int iTable,     
12f20 20 20 20 20 20 2f 2a 20 54 61 62 6c 65 20 74 6f       /* Table to
12f30 20 62 65 20 73 75 62 73 74 69 74 75 74 65 64 20   be substituted 
12f40 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70  */.  ExprList *p
12f50 45 4c 69 73 74 20 20 20 20 20 2f 2a 20 53 75 62  EList     /* Sub
12f60 73 74 69 74 75 74 65 20 76 61 6c 75 65 73 20 2a  stitute values *
12f70 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  /.){.  int i;.  
12f80 69 66 28 20 70 4c 69 73 74 3d 3d 30 20 29 20 72  if( pList==0 ) r
12f90 65 74 75 72 6e 3b 0a 20 20 66 6f 72 28 69 3d 30  eturn;.  for(i=0
12fa0 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e 45 78 70 72  ; i<pList->nExpr
12fb0 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 75 62 73  ; i++){.    subs
12fc0 74 45 78 70 72 28 64 62 2c 20 70 4c 69 73 74 2d  tExpr(db, pList-
12fd0 3e 61 5b 69 5d 2e 70 45 78 70 72 2c 20 69 54 61  >a[i].pExpr, iTa
12fe0 62 6c 65 2c 20 70 45 4c 69 73 74 29 3b 0a 20 20  ble, pEList);.  
12ff0 7d 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20  }.}.static void 
13000 73 75 62 73 74 53 65 6c 65 63 74 28 0a 20 20 73  substSelect(.  s
13010 71 6c 69 74 65 33 20 2a 64 62 2c 20 20 20 20 20  qlite3 *db,     
13020 20 20 20 20 2f 2a 20 52 65 70 6f 72 74 20 6d 61      /* Report ma
13030 6c 6c 6f 63 20 65 72 72 6f 72 73 20 68 65 72 65  lloc errors here
13040 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 2c   */.  Select *p,
13050 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 45             /* SE
13060 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 69  LECT statement i
13070 6e 20 77 68 69 63 68 20 74 6f 20 6d 61 6b 65 20  n which to make 
13080 73 75 62 73 74 69 74 75 74 69 6f 6e 73 20 2a 2f  substitutions */
13090 0a 20 20 69 6e 74 20 69 54 61 62 6c 65 2c 20 20  .  int iTable,  
130a0 20 20 20 20 20 20 20 20 2f 2a 20 54 61 62 6c 65          /* Table
130b0 20 74 6f 20 62 65 20 72 65 70 6c 61 63 65 64 20   to be replaced 
130c0 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70  */.  ExprList *p
130d0 45 4c 69 73 74 20 20 20 20 20 2f 2a 20 53 75 62  EList     /* Sub
130e0 73 74 69 74 75 74 65 20 76 61 6c 75 65 73 20 2a  stitute values *
130f0 2f 0a 29 7b 0a 20 20 69 66 28 20 21 70 20 29 20  /.){.  if( !p ) 
13100 72 65 74 75 72 6e 3b 0a 20 20 73 75 62 73 74 45  return;.  substE
13110 78 70 72 4c 69 73 74 28 64 62 2c 20 70 2d 3e 70  xprList(db, p->p
13120 45 4c 69 73 74 2c 20 69 54 61 62 6c 65 2c 20 70  EList, iTable, p
13130 45 4c 69 73 74 29 3b 0a 20 20 73 75 62 73 74 45  EList);.  substE
13140 78 70 72 4c 69 73 74 28 64 62 2c 20 70 2d 3e 70  xprList(db, p->p
13150 47 72 6f 75 70 42 79 2c 20 69 54 61 62 6c 65 2c  GroupBy, iTable,
13160 20 70 45 4c 69 73 74 29 3b 0a 20 20 73 75 62 73   pEList);.  subs
13170 74 45 78 70 72 4c 69 73 74 28 64 62 2c 20 70 2d  tExprList(db, p-
13180 3e 70 4f 72 64 65 72 42 79 2c 20 69 54 61 62 6c  >pOrderBy, iTabl
13190 65 2c 20 70 45 4c 69 73 74 29 3b 0a 20 20 73 75  e, pEList);.  su
131a0 62 73 74 45 78 70 72 28 64 62 2c 20 70 2d 3e 70  bstExpr(db, p->p
131b0 48 61 76 69 6e 67 2c 20 69 54 61 62 6c 65 2c 20  Having, iTable, 
131c0 70 45 4c 69 73 74 29 3b 0a 20 20 73 75 62 73 74  pEList);.  subst
131d0 45 78 70 72 28 64 62 2c 20 70 2d 3e 70 57 68 65  Expr(db, p->pWhe
131e0 72 65 2c 20 69 54 61 62 6c 65 2c 20 70 45 4c 69  re, iTable, pELi
131f0 73 74 29 3b 0a 20 20 73 75 62 73 74 53 65 6c 65  st);.  substSele
13200 63 74 28 64 62 2c 20 70 2d 3e 70 50 72 69 6f 72  ct(db, p->pPrior
13210 2c 20 69 54 61 62 6c 65 2c 20 70 45 4c 69 73 74  , iTable, pEList
13220 29 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 21  );.}.#endif /* !
13230 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
13240 4d 49 54 5f 56 49 45 57 29 20 2a 2f 0a 0a 23 69  MIT_VIEW) */..#i
13250 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
13260 54 5f 56 49 45 57 0a 2f 2a 0a 2a 2a 20 54 68 69  T_VIEW./*.** Thi
13270 73 20 72 6f 75 74 69 6e 65 20 61 74 74 65 6d 70  s routine attemp
13280 74 73 20 74 6f 20 66 6c 61 74 74 65 6e 20 73 75  ts to flatten su
13290 62 71 75 65 72 69 65 73 20 69 6e 20 6f 72 64 65  bqueries in orde
132a0 72 20 74 6f 20 73 70 65 65 64 0a 2a 2a 20 65 78  r to speed.** ex
132b0 65 63 75 74 69 6f 6e 2e 20 20 49 74 20 72 65 74  ecution.  It ret
132c0 75 72 6e 73 20 31 20 69 66 20 69 74 20 6d 61 6b  urns 1 if it mak
132d0 65 73 20 63 68 61 6e 67 65 73 20 61 6e 64 20 30  es changes and 0
132e0 20 69 66 20 6e 6f 20 66 6c 61 74 74 65 6e 69 6e   if no flattenin
132f0 67 0a 2a 2a 20 6f 63 63 75 72 73 2e 0a 2a 2a 0a  g.** occurs..**.
13300 2a 2a 20 54 6f 20 75 6e 64 65 72 73 74 61 6e 64  ** To understand
13310 20 74 68 65 20 63 6f 6e 63 65 70 74 20 6f 66 20   the concept of 
13320 66 6c 61 74 74 65 6e 69 6e 67 2c 20 63 6f 6e 73  flattening, cons
13330 69 64 65 72 20 74 68 65 20 66 6f 6c 6c 6f 77 69  ider the followi
13340 6e 67 0a 2a 2a 20 71 75 65 72 79 3a 0a 2a 2a 0a  ng.** query:.**.
13350 2a 2a 20 20 20 20 20 53 45 4c 45 43 54 20 61 20  **     SELECT a 
13360 46 52 4f 4d 20 28 53 45 4c 45 43 54 20 78 2b 79  FROM (SELECT x+y
13370 20 41 53 20 61 20 46 52 4f 4d 20 74 31 20 57 48   AS a FROM t1 WH
13380 45 52 45 20 7a 3c 31 30 30 29 20 57 48 45 52 45  ERE z<100) WHERE
13390 20 61 3e 35 0a 2a 2a 0a 2a 2a 20 54 68 65 20 64   a>5.**.** The d
133a0 65 66 61 75 6c 74 20 77 61 79 20 6f 66 20 69 6d  efault way of im
133b0 70 6c 65 6d 65 6e 74 69 6e 67 20 74 68 69 73 20  plementing this 
133c0 71 75 65 72 79 20 69 73 20 74 6f 20 65 78 65 63  query is to exec
133d0 75 74 65 20 74 68 65 0a 2a 2a 20 73 75 62 71 75  ute the.** subqu
133e0 65 72 79 20 66 69 72 73 74 20 61 6e 64 20 73 74  ery first and st
133f0 6f 72 65 20 74 68 65 20 72 65 73 75 6c 74 73 20  ore the results 
13400 69 6e 20 61 20 74 65 6d 70 6f 72 61 72 79 20 74  in a temporary t
13410 61 62 6c 65 2c 20 74 68 65 6e 0a 2a 2a 20 72 75  able, then.** ru
13420 6e 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72  n the outer quer
13430 79 20 6f 6e 20 74 68 61 74 20 74 65 6d 70 6f 72  y on that tempor
13440 61 72 79 20 74 61 62 6c 65 2e 20 20 54 68 69 73  ary table.  This
13450 20 72 65 71 75 69 72 65 73 20 74 77 6f 0a 2a 2a   requires two.**
13460 20 70 61 73 73 65 73 20 6f 76 65 72 20 74 68 65   passes over the
13470 20 64 61 74 61 2e 20 20 46 75 72 74 68 65 72 6d   data.  Furtherm
13480 6f 72 65 2c 20 62 65 63 61 75 73 65 20 74 68 65  ore, because the
13490 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65   temporary table
134a0 0a 2a 2a 20 68 61 73 20 6e 6f 20 69 6e 64 69 63  .** has no indic
134b0 65 73 2c 20 74 68 65 20 57 48 45 52 45 20 63 6c  es, the WHERE cl
134c0 61 75 73 65 20 6f 6e 20 74 68 65 20 6f 75 74 65  ause on the oute
134d0 72 20 71 75 65 72 79 20 63 61 6e 6e 6f 74 20 62  r query cannot b
134e0 65 0a 2a 2a 20 6f 70 74 69 6d 69 7a 65 64 2e 0a  e.** optimized..
134f0 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
13500 6e 65 20 61 74 74 65 6d 70 74 73 20 74 6f 20 72  ne attempts to r
13510 65 77 72 69 74 65 20 71 75 65 72 69 65 73 20 73  ewrite queries s
13520 75 63 68 20 61 73 20 74 68 65 20 61 62 6f 76 65  uch as the above
13530 20 69 6e 74 6f 0a 2a 2a 20 61 20 73 69 6e 67 6c   into.** a singl
13540 65 20 66 6c 61 74 20 73 65 6c 65 63 74 2c 20 6c  e flat select, l
13550 69 6b 65 20 74 68 69 73 3a 0a 2a 2a 0a 2a 2a 20  ike this:.**.** 
13560 20 20 20 20 53 45 4c 45 43 54 20 78 2b 79 20 41      SELECT x+y A
13570 53 20 61 20 46 52 4f 4d 20 74 31 20 57 48 45 52  S a FROM t1 WHER
13580 45 20 7a 3c 31 30 30 20 41 4e 44 20 61 3e 35 0a  E z<100 AND a>5.
13590 2a 2a 0a 2a 2a 20 54 68 65 20 63 6f 64 65 20 67  **.** The code g
135a0 65 6e 65 72 61 74 65 64 20 66 6f 72 20 74 68 69  enerated for thi
135b0 73 20 73 69 6d 70 69 66 69 63 61 74 69 6f 6e 20  s simpification 
135c0 67 69 76 65 73 20 74 68 65 20 73 61 6d 65 20 72  gives the same r
135d0 65 73 75 6c 74 0a 2a 2a 20 62 75 74 20 6f 6e 6c  esult.** but onl
135e0 79 20 68 61 73 20 74 6f 20 73 63 61 6e 20 74 68  y has to scan th
135f0 65 20 64 61 74 61 20 6f 6e 63 65 2e 20 20 41 6e  e data once.  An
13600 64 20 62 65 63 61 75 73 65 20 69 6e 64 69 63 65  d because indice
13610 73 20 6d 69 67 68 74 20 0a 2a 2a 20 65 78 69 73  s might .** exis
13620 74 20 6f 6e 20 74 68 65 20 74 61 62 6c 65 20 74  t on the table t
13630 31 2c 20 61 20 63 6f 6d 70 6c 65 74 65 20 73 63  1, a complete sc
13640 61 6e 20 6f 66 20 74 68 65 20 64 61 74 61 20 6d  an of the data m
13650 69 67 68 74 20 62 65 0a 2a 2a 20 61 76 6f 69 64  ight be.** avoid
13660 65 64 2e 0a 2a 2a 0a 2a 2a 20 46 6c 61 74 74 65  ed..**.** Flatte
13670 6e 69 6e 67 20 69 73 20 6f 6e 6c 79 20 61 74 74  ning is only att
13680 65 6d 70 74 65 64 20 69 66 20 61 6c 6c 20 6f 66  empted if all of
13690 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61   the following a
136a0 72 65 20 74 72 75 65 3a 0a 2a 2a 0a 2a 2a 20 20  re true:.**.**  
136b0 20 28 31 29 20 20 54 68 65 20 73 75 62 71 75 65   (1)  The subque
136c0 72 79 20 61 6e 64 20 74 68 65 20 6f 75 74 65 72  ry and the outer
136d0 20 71 75 65 72 79 20 64 6f 20 6e 6f 74 20 62 6f   query do not bo
136e0 74 68 20 75 73 65 20 61 67 67 72 65 67 61 74 65  th use aggregate
136f0 73 2e 0a 2a 2a 0a 2a 2a 20 20 20 28 32 29 20 20  s..**.**   (2)  
13700 54 68 65 20 73 75 62 71 75 65 72 79 20 69 73 20  The subquery is 
13710 6e 6f 74 20 61 6e 20 61 67 67 72 65 67 61 74 65  not an aggregate
13720 20 6f 72 20 74 68 65 20 6f 75 74 65 72 20 71 75   or the outer qu
13730 65 72 79 20 69 73 20 6e 6f 74 20 61 20 6a 6f 69  ery is not a joi
13740 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20 28 33 29 20 20  n..**.**   (3)  
13750 54 68 65 20 73 75 62 71 75 65 72 79 20 69 73 20  The subquery is 
13760 6e 6f 74 20 74 68 65 20 72 69 67 68 74 20 6f 70  not the right op
13770 65 72 61 6e 64 20 6f 66 20 61 20 6c 65 66 74 20  erand of a left 
13780 6f 75 74 65 72 20 6a 6f 69 6e 2c 20 6f 72 0a 2a  outer join, or.*
13790 2a 20 20 20 20 20 20 20 20 74 68 65 20 73 75 62  *        the sub
137a0 71 75 65 72 79 20 69 73 20 6e 6f 74 20 69 74 73  query is not its
137b0 65 6c 66 20 61 20 6a 6f 69 6e 2e 20 20 28 54 69  elf a join.  (Ti
137c0 63 6b 65 74 20 23 33 30 36 29 0a 2a 2a 0a 2a 2a  cket #306).**.**
137d0 20 20 20 28 34 29 20 20 54 68 65 20 73 75 62 71     (4)  The subq
137e0 75 65 72 79 20 69 73 20 6e 6f 74 20 44 49 53 54  uery is not DIST
137f0 49 4e 43 54 20 6f 72 20 74 68 65 20 6f 75 74 65  INCT or the oute
13800 72 20 71 75 65 72 79 20 69 73 20 6e 6f 74 20 61  r query is not a
13810 20 6a 6f 69 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20 28   join..**.**   (
13820 35 29 20 20 54 68 65 20 73 75 62 71 75 65 72 79  5)  The subquery
13830 20 69 73 20 6e 6f 74 20 44 49 53 54 49 4e 43 54   is not DISTINCT
13840 20 6f 72 20 74 68 65 20 6f 75 74 65 72 20 71 75   or the outer qu
13850 65 72 79 20 64 6f 65 73 20 6e 6f 74 20 75 73 65  ery does not use
13860 0a 2a 2a 20 20 20 20 20 20 20 20 61 67 67 72 65  .**        aggre
13870 67 61 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 20 20 28  gates..**.**   (
13880 36 29 20 20 54 68 65 20 73 75 62 71 75 65 72 79  6)  The subquery
13890 20 64 6f 65 73 20 6e 6f 74 20 75 73 65 20 61 67   does not use ag
138a0 67 72 65 67 61 74 65 73 20 6f 72 20 74 68 65 20  gregates or the 
138b0 6f 75 74 65 72 20 71 75 65 72 79 20 69 73 20 6e  outer query is n
138c0 6f 74 0a 2a 2a 20 20 20 20 20 20 20 20 44 49 53  ot.**        DIS
138d0 54 49 4e 43 54 2e 0a 2a 2a 0a 2a 2a 20 20 20 28  TINCT..**.**   (
138e0 37 29 20 20 54 68 65 20 73 75 62 71 75 65 72 79  7)  The subquery
138f0 20 68 61 73 20 61 20 46 52 4f 4d 20 63 6c 61 75   has a FROM clau
13900 73 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 28 38 29 20  se..**.**   (8) 
13910 20 54 68 65 20 73 75 62 71 75 65 72 79 20 64 6f   The subquery do
13920 65 73 20 6e 6f 74 20 75 73 65 20 4c 49 4d 49 54  es not use LIMIT
13930 20 6f 72 20 74 68 65 20 6f 75 74 65 72 20 71 75   or the outer qu
13940 65 72 79 20 69 73 20 6e 6f 74 20 61 20 6a 6f 69  ery is not a joi
13950 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20 28 39 29 20 20  n..**.**   (9)  
13960 54 68 65 20 73 75 62 71 75 65 72 79 20 64 6f 65  The subquery doe
13970 73 20 6e 6f 74 20 75 73 65 20 4c 49 4d 49 54 20  s not use LIMIT 
13980 6f 72 20 74 68 65 20 6f 75 74 65 72 20 71 75 65  or the outer que
13990 72 79 20 64 6f 65 73 20 6e 6f 74 20 75 73 65 0a  ry does not use.
139a0 2a 2a 20 20 20 20 20 20 20 20 61 67 67 72 65 67  **        aggreg
139b0 61 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 20 28 31 30  ates..**.**  (10
139c0 29 20 20 54 68 65 20 73 75 62 71 75 65 72 79 20  )  The subquery 
139d0 64 6f 65 73 20 6e 6f 74 20 75 73 65 20 61 67 67  does not use agg
139e0 72 65 67 61 74 65 73 20 6f 72 20 74 68 65 20 6f  regates or the o
139f0 75 74 65 72 20 71 75 65 72 79 20 64 6f 65 73 20  uter query does 
13a00 6e 6f 74 0a 2a 2a 20 20 20 20 20 20 20 20 75 73  not.**        us
13a10 65 20 4c 49 4d 49 54 2e 0a 2a 2a 0a 2a 2a 20 20  e LIMIT..**.**  
13a20 28 31 31 29 20 20 54 68 65 20 73 75 62 71 75 65  (11)  The subque
13a30 72 79 20 61 6e 64 20 74 68 65 20 6f 75 74 65 72  ry and the outer
13a40 20 71 75 65 72 79 20 64 6f 20 6e 6f 74 20 62 6f   query do not bo
13a50 74 68 20 68 61 76 65 20 4f 52 44 45 52 20 42 59  th have ORDER BY
13a60 20 63 6c 61 75 73 65 73 2e 0a 2a 2a 0a 2a 2a 20   clauses..**.** 
13a70 20 28 31 32 29 20 20 54 68 65 20 73 75 62 71 75   (12)  The subqu
13a80 65 72 79 20 69 73 20 6e 6f 74 20 74 68 65 20 72  ery is not the r
13a90 69 67 68 74 20 74 65 72 6d 20 6f 66 20 61 20 4c  ight term of a L
13aa0 45 46 54 20 4f 55 54 45 52 20 4a 4f 49 4e 20 6f  EFT OUTER JOIN o
13ab0 72 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 20 20  r the.**        
13ac0 73 75 62 71 75 65 72 79 20 68 61 73 20 6e 6f 20  subquery has no 
13ad0 57 48 45 52 45 20 63 6c 61 75 73 65 2e 20 20 28  WHERE clause.  (
13ae0 61 64 64 65 64 20 62 79 20 74 69 63 6b 65 74 20  added by ticket 
13af0 23 33 35 30 29 0a 2a 2a 0a 2a 2a 20 20 28 31 33  #350).**.**  (13
13b00 29 20 20 54 68 65 20 73 75 62 71 75 65 72 79 20  )  The subquery 
13b10 61 6e 64 20 6f 75 74 65 72 20 71 75 65 72 79 20  and outer query 
13b20 64 6f 20 6e 6f 74 20 62 6f 74 68 20 75 73 65 20  do not both use 
13b30 4c 49 4d 49 54 0a 2a 2a 0a 2a 2a 20 20 28 31 34  LIMIT.**.**  (14
13b40 29 20 20 54 68 65 20 73 75 62 71 75 65 72 79 20  )  The subquery 
13b50 64 6f 65 73 20 6e 6f 74 20 75 73 65 20 4f 46 46  does not use OFF
13b60 53 45 54 0a 2a 2a 0a 2a 2a 20 20 28 31 35 29 20  SET.**.**  (15) 
13b70 20 54 68 65 20 6f 75 74 65 72 20 71 75 65 72 79   The outer query
13b80 20 69 73 20 6e 6f 74 20 70 61 72 74 20 6f 66 20   is not part of 
13b90 61 20 63 6f 6d 70 6f 75 6e 64 20 73 65 6c 65 63  a compound selec
13ba0 74 20 6f 72 20 74 68 65 0a 2a 2a 20 20 20 20 20  t or the.**     
13bb0 20 20 20 73 75 62 71 75 65 72 79 20 64 6f 65 73     subquery does
13bc0 20 6e 6f 74 20 68 61 76 65 20 62 6f 74 68 20 61   not have both a
13bd0 6e 20 4f 52 44 45 52 20 42 59 20 61 6e 64 20 61  n ORDER BY and a
13be0 20 4c 49 4d 49 54 20 63 6c 61 75 73 65 2e 0a 2a   LIMIT clause..*
13bf0 2a 20 20 20 20 20 20 20 20 28 53 65 65 20 74 69  *        (See ti
13c00 63 6b 65 74 20 23 32 33 33 39 29 0a 2a 2a 0a 2a  cket #2339).**.*
13c10 2a 20 20 28 31 36 29 20 20 54 68 65 20 6f 75 74  *  (16)  The out
13c20 65 72 20 71 75 65 72 79 20 69 73 20 6e 6f 74 20  er query is not 
13c30 61 6e 20 61 67 67 72 65 67 61 74 65 20 6f 72 20  an aggregate or 
13c40 74 68 65 20 73 75 62 71 75 65 72 79 20 64 6f 65  the subquery doe
13c50 73 0a 2a 2a 20 20 20 20 20 20 20 20 6e 6f 74 20  s.**        not 
13c60 63 6f 6e 74 61 69 6e 20 4f 52 44 45 52 20 42 59  contain ORDER BY
13c70 2e 20 20 28 54 69 63 6b 65 74 20 23 32 39 34 32  .  (Ticket #2942
13c80 29 20 20 54 68 69 73 20 75 73 65 64 20 74 6f 20  )  This used to 
13c90 6e 6f 74 20 6d 61 74 74 65 72 0a 2a 2a 20 20 20  not matter.**   
13ca0 20 20 20 20 20 75 6e 74 69 6c 20 77 65 20 69 6e       until we in
13cb0 74 72 6f 64 75 63 65 64 20 74 68 65 20 67 72 6f  troduced the gro
13cc0 75 70 5f 63 6f 6e 63 61 74 28 29 20 66 75 6e 63  up_concat() func
13cd0 74 69 6f 6e 2e 20 20 0a 2a 2a 0a 2a 2a 20 49 6e  tion.  .**.** In
13ce0 20 74 68 69 73 20 72 6f 75 74 69 6e 65 2c 20 74   this routine, t
13cf0 68 65 20 22 70 22 20 70 61 72 61 6d 65 74 65 72  he "p" parameter
13d00 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f   is a pointer to
13d10 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79   the outer query
13d20 2e 0a 2a 2a 20 54 68 65 20 73 75 62 71 75 65 72  ..** The subquer
13d30 79 20 69 73 20 70 2d 3e 70 53 72 63 2d 3e 61 5b  y is p->pSrc->a[
13d40 69 46 72 6f 6d 5d 2e 20 20 69 73 41 67 67 20 69  iFrom].  isAgg i
13d50 73 20 74 72 75 65 20 69 66 20 74 68 65 20 6f 75  s true if the ou
13d60 74 65 72 20 71 75 65 72 79 0a 2a 2a 20 75 73 65  ter query.** use
13d70 73 20 61 67 67 72 65 67 61 74 65 73 20 61 6e 64  s aggregates and
13d80 20 73 75 62 71 75 65 72 79 49 73 41 67 67 20 69   subqueryIsAgg i
13d90 73 20 74 72 75 65 20 69 66 20 74 68 65 20 73 75  s true if the su
13da0 62 71 75 65 72 79 20 75 73 65 73 20 61 67 67 72  bquery uses aggr
13db0 65 67 61 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 49 66  egates..**.** If
13dc0 20 66 6c 61 74 74 65 6e 69 6e 67 20 69 73 20 6e   flattening is n
13dd0 6f 74 20 61 74 74 65 6d 70 74 65 64 2c 20 74 68  ot attempted, th
13de0 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20  is routine is a 
13df0 6e 6f 2d 6f 70 20 61 6e 64 20 72 65 74 75 72 6e  no-op and return
13e00 73 20 30 2e 0a 2a 2a 20 49 66 20 66 6c 61 74 74  s 0..** If flatt
13e10 65 6e 69 6e 67 20 69 73 20 61 74 74 65 6d 70 74  ening is attempt
13e20 65 64 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  ed this routine 
13e30 72 65 74 75 72 6e 73 20 31 2e 0a 2a 2a 0a 2a 2a  returns 1..**.**
13e40 20 41 6c 6c 20 6f 66 20 74 68 65 20 65 78 70 72   All of the expr
13e50 65 73 73 69 6f 6e 20 61 6e 61 6c 79 73 69 73 20  ession analysis 
13e60 6d 75 73 74 20 6f 63 63 75 72 20 6f 6e 20 62 6f  must occur on bo
13e70 74 68 20 74 68 65 20 6f 75 74 65 72 20 71 75 65  th the outer que
13e80 72 79 20 61 6e 64 0a 2a 2a 20 74 68 65 20 73 75  ry and.** the su
13e90 62 71 75 65 72 79 20 62 65 66 6f 72 65 20 74 68  bquery before th
13ea0 69 73 20 72 6f 75 74 69 6e 65 20 72 75 6e 73 2e  is routine runs.
13eb0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66  .*/.static int f
13ec0 6c 61 74 74 65 6e 53 75 62 71 75 65 72 79 28 0a  lattenSubquery(.
13ed0 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 20    sqlite3 *db,  
13ee0 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61         /* Databa
13ef0 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f  se connection */
13f00 0a 20 20 53 65 6c 65 63 74 20 2a 70 2c 20 20 20  .  Select *p,   
13f10 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70          /* The p
13f20 61 72 65 6e 74 20 6f 72 20 6f 75 74 65 72 20 53  arent or outer S
13f30 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20  ELECT statement 
13f40 2a 2f 0a 20 20 69 6e 74 20 69 46 72 6f 6d 2c 20  */.  int iFrom, 
13f50 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64            /* Ind
13f60 65 78 20 69 6e 20 70 2d 3e 70 53 72 63 2d 3e 61  ex in p->pSrc->a
13f70 5b 5d 20 6f 66 20 74 68 65 20 69 6e 6e 65 72 20  [] of the inner 
13f80 73 75 62 71 75 65 72 79 20 2a 2f 0a 20 20 69 6e  subquery */.  in
13f90 74 20 69 73 41 67 67 2c 20 20 20 20 20 20 20 20  t isAgg,        
13fa0 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 6f 75     /* True if ou
13fb0 74 65 72 20 53 45 4c 45 43 54 20 75 73 65 73 20  ter SELECT uses 
13fc0 61 67 67 72 65 67 61 74 65 20 66 75 6e 63 74 69  aggregate functi
13fd0 6f 6e 73 20 2a 2f 0a 20 20 69 6e 74 20 73 75 62  ons */.  int sub
13fe0 71 75 65 72 79 49 73 41 67 67 20 20 20 20 2f 2a  queryIsAgg    /*
13ff0 20 54 72 75 65 20 69 66 20 74 68 65 20 73 75 62   True if the sub
14000 71 75 65 72 79 20 75 73 65 73 20 61 67 67 72 65  query uses aggre
14010 67 61 74 65 20 66 75 6e 63 74 69 6f 6e 73 20 2a  gate functions *
14020 2f 0a 29 7b 0a 20 20 53 65 6c 65 63 74 20 2a 70  /.){.  Select *p
14030 53 75 62 3b 20 20 20 20 20 20 20 2f 2a 20 54 68  Sub;       /* Th
14040 65 20 69 6e 6e 65 72 20 71 75 65 72 79 20 6f 72  e inner query or
14050 20 22 73 75 62 71 75 65 72 79 22 20 2a 2f 0a 20   "subquery" */. 
14060 20 53 72 63 4c 69 73 74 20 2a 70 53 72 63 3b 20   SrcList *pSrc; 
14070 20 20 20 20 20 2f 2a 20 54 68 65 20 46 52 4f 4d       /* The FROM
14080 20 63 6c 61 75 73 65 20 6f 66 20 74 68 65 20 6f   clause of the o
14090 75 74 65 72 20 71 75 65 72 79 20 2a 2f 0a 20 20  uter query */.  
140a0 53 72 63 4c 69 73 74 20 2a 70 53 75 62 53 72 63  SrcList *pSubSrc
140b0 3b 20 20 20 2f 2a 20 54 68 65 20 46 52 4f 4d 20  ;   /* The FROM 
140c0 63 6c 61 75 73 65 20 6f 66 20 74 68 65 20 73 75  clause of the su
140d0 62 71 75 65 72 79 20 2a 2f 0a 20 20 45 78 70 72  bquery */.  Expr
140e0 4c 69 73 74 20 2a 70 4c 69 73 74 3b 20 20 20 20  List *pList;    
140f0 2f 2a 20 54 68 65 20 72 65 73 75 6c 74 20 73 65  /* The result se
14100 74 20 6f 66 20 74 68 65 20 6f 75 74 65 72 20 71  t of the outer q
14110 75 65 72 79 20 2a 2f 0a 20 20 69 6e 74 20 69 50  uery */.  int iP
14120 61 72 65 6e 74 3b 20 20 20 20 20 20 20 20 2f 2a  arent;        /*
14130 20 56 44 42 45 20 63 75 72 73 6f 72 20 6e 75 6d   VDBE cursor num
14140 62 65 72 20 6f 66 20 74 68 65 20 70 53 75 62 20  ber of the pSub 
14150 72 65 73 75 6c 74 20 73 65 74 20 74 65 6d 70 20  result set temp 
14160 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 69  table */.  int i
14170 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
14180 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a  * Loop counter *
14190 2f 0a 20 20 45 78 70 72 20 2a 70 57 68 65 72 65  /.  Expr *pWhere
141a0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
141b0 20 20 20 20 20 2f 2a 20 54 68 65 20 57 48 45 52       /* The WHER
141c0 45 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 73 74  E clause */.  st
141d0 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65  ruct SrcList_ite
141e0 6d 20 2a 70 53 75 62 69 74 65 6d 3b 20 20 20 2f  m *pSubitem;   /
141f0 2a 20 54 68 65 20 73 75 62 71 75 65 72 79 20 2a  * The subquery *
14200 2f 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 74 6f  /..  /* Check to
14210 20 73 65 65 20 69 66 20 66 6c 61 74 74 65 6e 69   see if flatteni
14220 6e 67 20 69 73 20 70 65 72 6d 69 74 74 65 64 2e  ng is permitted.
14230 20 20 52 65 74 75 72 6e 20 30 20 69 66 20 6e 6f    Return 0 if no
14240 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 3d  t..  */.  if( p=
14250 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  =0 ) return 0;. 
14260 20 70 53 72 63 20 3d 20 70 2d 3e 70 53 72 63 3b   pSrc = p->pSrc;
14270 0a 20 20 61 73 73 65 72 74 28 20 70 53 72 63 20  .  assert( pSrc 
14280 26 26 20 69 46 72 6f 6d 3e 3d 30 20 26 26 20 69  && iFrom>=0 && i
14290 46 72 6f 6d 3c 70 53 72 63 2d 3e 6e 53 72 63 20  From<pSrc->nSrc 
142a0 29 3b 0a 20 20 70 53 75 62 69 74 65 6d 20 3d 20  );.  pSubitem = 
142b0 26 70 53 72 63 2d 3e 61 5b 69 46 72 6f 6d 5d 3b  &pSrc->a[iFrom];
142c0 0a 20 20 70 53 75 62 20 3d 20 70 53 75 62 69 74  .  pSub = pSubit
142d0 65 6d 2d 3e 70 53 65 6c 65 63 74 3b 0a 20 20 61  em->pSelect;.  a
142e0 73 73 65 72 74 28 20 70 53 75 62 21 3d 30 20 29  ssert( pSub!=0 )
142f0 3b 0a 20 20 69 66 28 20 69 73 41 67 67 20 26 26  ;.  if( isAgg &&
14300 20 73 75 62 71 75 65 72 79 49 73 41 67 67 20 29   subqueryIsAgg )
14310 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20   return 0;      
14320 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
14330 73 74 72 69 63 74 69 6f 6e 20 28 31 29 20 20 2a  striction (1)  *
14340 2f 0a 20 20 69 66 28 20 73 75 62 71 75 65 72 79  /.  if( subquery
14350 49 73 41 67 67 20 26 26 20 70 53 72 63 2d 3e 6e  IsAgg && pSrc->n
14360 53 72 63 3e 31 20 29 20 72 65 74 75 72 6e 20 30  Src>1 ) return 0
14370 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65  ;          /* Re
14380 73 74 72 69 63 74 69 6f 6e 20 28 32 29 20 20 2a  striction (2)  *
14390 2f 0a 20 20 70 53 75 62 53 72 63 20 3d 20 70 53  /.  pSubSrc = pS
143a0 75 62 2d 3e 70 53 72 63 3b 0a 20 20 61 73 73 65  ub->pSrc;.  asse
143b0 72 74 28 20 70 53 75 62 53 72 63 20 29 3b 0a 20  rt( pSubSrc );. 
143c0 20 2f 2a 20 50 72 69 6f 72 20 74 6f 20 76 65 72   /* Prior to ver
143d0 73 69 6f 6e 20 33 2e 31 2e 32 2c 20 77 68 65 6e  sion 3.1.2, when
143e0 20 4c 49 4d 49 54 20 61 6e 64 20 4f 46 46 53 45   LIMIT and OFFSE
143f0 54 20 68 61 64 20 74 6f 20 62 65 20 73 69 6d 70  T had to be simp
14400 6c 65 20 63 6f 6e 73 74 61 6e 74 73 2c 0a 20 20  le constants,.  
14410 2a 2a 20 6e 6f 74 20 61 72 62 69 74 72 61 72 79  ** not arbitrary
14420 20 65 78 70 72 65 73 73 73 69 6f 6e 73 2c 20 77   expresssions, w
14430 65 20 61 6c 6c 6f 77 65 64 20 73 6f 6d 65 20 63  e allowed some c
14440 6f 6d 62 69 6e 69 6e 67 20 6f 66 20 4c 49 4d 49  ombining of LIMI
14450 54 20 61 6e 64 20 4f 46 46 53 45 54 0a 20 20 2a  T and OFFSET.  *
14460 2a 20 62 65 63 61 75 73 65 20 74 68 65 79 20 63  * because they c
14470 6f 75 6c 64 20 62 65 20 63 6f 6d 70 75 74 65 64  ould be computed
14480 20 61 74 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65   at compile-time
14490 2e 20 20 42 75 74 20 77 68 65 6e 20 4c 49 4d 49  .  But when LIMI
144a0 54 20 61 6e 64 20 4f 46 46 53 45 54 0a 20 20 2a  T and OFFSET.  *
144b0 2a 20 62 65 63 61 6d 65 20 61 72 62 69 74 72 61  * became arbitra
144c0 72 79 20 65 78 70 72 65 73 73 69 6f 6e 73 2c 20  ry expressions, 
144d0 77 65 20 77 65 72 65 20 66 6f 72 63 65 64 20 74  we were forced t
144e0 6f 20 61 64 64 20 72 65 73 74 72 69 63 74 69 6f  o add restrictio
144f0 6e 73 20 28 31 33 29 0a 20 20 2a 2a 20 61 6e 64  ns (13).  ** and
14500 20 28 31 34 29 2e 20 2a 2f 0a 20 20 69 66 28 20   (14). */.  if( 
14510 70 53 75 62 2d 3e 70 4c 69 6d 69 74 20 26 26 20  pSub->pLimit && 
14520 70 2d 3e 70 4c 69 6d 69 74 20 29 20 72 65 74 75  p->pLimit ) retu
14530 72 6e 20 30 3b 20 20 20 20 20 20 20 20 20 20 20  rn 0;           
14540 20 20 20 2f 2a 20 52 65 73 74 72 69 63 74 69 6f     /* Restrictio
14550 6e 20 28 31 33 29 20 2a 2f 0a 20 20 69 66 28 20  n (13) */.  if( 
14560 70 53 75 62 2d 3e 70 4f 66 66 73 65 74 20 29 20  pSub->pOffset ) 
14570 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20  return 0;       
14580 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14590 20 20 20 2f 2a 20 52 65 73 74 72 69 63 74 69 6f     /* Restrictio
145a0 6e 20 28 31 34 29 20 2a 2f 0a 20 20 69 66 28 20  n (14) */.  if( 
145b0 70 2d 3e 70 52 69 67 68 74 6d 6f 73 74 20 26 26  p->pRightmost &&
145c0 20 70 53 75 62 2d 3e 70 4c 69 6d 69 74 20 26 26   pSub->pLimit &&
145d0 20 70 53 75 62 2d 3e 70 4f 72 64 65 72 42 79 20   pSub->pOrderBy 
145e0 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b  ){.    return 0;
145f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14600 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14610 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
14620 65 73 74 72 69 63 74 69 6f 6e 20 28 31 35 29 20  estriction (15) 
14630 2a 2f 0a 20 20 7d 0a 20 20 69 66 28 20 70 53 75  */.  }.  if( pSu
14640 62 53 72 63 2d 3e 6e 53 72 63 3d 3d 30 20 29 20  bSrc->nSrc==0 ) 
14650 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20  return 0;       
14660 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14670 2f 2a 20 52 65 73 74 72 69 63 74 69 6f 6e 20 28  /* Restriction (
14680 37 29 20 20 2a 2f 0a 20 20 69 66 28 20 28 70 53  7)  */.  if( (pS
14690 75 62 2d 3e 69 73 44 69 73 74 69 6e 63 74 20 7c  ub->isDistinct |
146a0 7c 20 70 53 75 62 2d 3e 70 4c 69 6d 69 74 29 20  | pSub->pLimit) 
146b0 0a 20 20 20 20 20 20 20 20 20 26 26 20 28 70 53  .         && (pS
146c0 72 63 2d 3e 6e 53 72 63 3e 31 20 7c 7c 20 69 73  rc->nSrc>1 || is
146d0 41 67 67 29 20 29 7b 20 20 20 20 20 20 20 20 20  Agg) ){         
146e0 20 2f 2a 20 52 65 73 74 72 69 63 74 69 6f 6e 73   /* Restrictions
146f0 20 28 34 29 28 35 29 28 38 29 28 39 29 20 2a 2f   (4)(5)(8)(9) */
14700 0a 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 20  .     return 0; 
14710 20 20 20 20 20 20 0a 20 20 7d 0a 20 20 69 66 28        .  }.  if(
14720 20 70 2d 3e 69 73 44 69 73 74 69 6e 63 74 20 26   p->isDistinct &
14730 26 20 73 75 62 71 75 65 72 79 49 73 41 67 67 20  & subqueryIsAgg 
14740 29 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20  ) return 0;     
14750 20 20 20 20 2f 2a 20 52 65 73 74 72 69 63 74 69      /* Restricti
14760 6f 6e 20 28 36 29 20 20 2a 2f 0a 20 20 69 66 28  on (6)  */.  if(
14770 20 28 70 2d 3e 64 69 73 61 6c 6c 6f 77 4f 72 64   (p->disallowOrd
14780 65 72 42 79 20 7c 7c 20 70 2d 3e 70 4f 72 64 65  erBy || p->pOrde
14790 72 42 79 29 20 26 26 20 70 53 75 62 2d 3e 70 4f  rBy) && pSub->pO
147a0 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20 20 72  rderBy ){.     r
147b0 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20 20  eturn 0;        
147c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
147d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
147e0 20 20 20 2f 2a 20 52 65 73 74 72 69 63 74 69 6f     /* Restrictio
147f0 6e 20 28 31 31 29 20 2a 2f 0a 20 20 7d 0a 20 20  n (11) */.  }.  
14800 69 66 28 20 69 73 41 67 67 20 26 26 20 70 53 75  if( isAgg && pSu
14810 62 2d 3e 70 4f 72 64 65 72 42 79 20 29 20 72 65  b->pOrderBy ) re
14820 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20 20 20  turn 0;         
14830 20 20 20 20 20 20 20 2f 2a 20 52 65 73 74 72 69         /* Restri
14840 63 74 69 6f 6e 20 28 31 36 29 20 2a 2f 0a 0a 20  ction (16) */.. 
14850 20 2f 2a 20 52 65 73 74 72 69 63 74 69 6f 6e 20   /* Restriction 
14860 33 3a 20 20 49 66 20 74 68 65 20 73 75 62 71 75  3:  If the subqu
14870 65 72 79 20 69 73 20 61 20 6a 6f 69 6e 2c 20 6d  ery is a join, m
14880 61 6b 65 20 73 75 72 65 20 74 68 65 20 73 75 62  ake sure the sub
14890 71 75 65 72 79 20 69 73 20 0a 20 20 2a 2a 20 6e  query is .  ** n
148a0 6f 74 20 75 73 65 64 20 61 73 20 74 68 65 20 72  ot used as the r
148b0 69 67 68 74 20 6f 70 65 72 61 6e 64 20 6f 66 20  ight operand of 
148c0 61 6e 20 6f 75 74 65 72 20 6a 6f 69 6e 2e 20 20  an outer join.  
148d0 45 78 61 6d 70 6c 65 73 20 6f 66 20 77 68 79 20  Examples of why 
148e0 74 68 69 73 0a 20 20 2a 2a 20 69 73 20 6e 6f 74  this.  ** is not
148f0 20 61 6c 6c 6f 77 65 64 3a 0a 20 20 2a 2a 0a 20   allowed:.  **. 
14900 20 2a 2a 20 20 20 20 20 20 20 20 20 74 31 20 4c   **         t1 L
14910 45 46 54 20 4f 55 54 45 52 20 4a 4f 49 4e 20 28  EFT OUTER JOIN (
14920 74 32 20 4a 4f 49 4e 20 74 33 29 0a 20 20 2a 2a  t2 JOIN t3).  **
14930 0a 20 20 2a 2a 20 49 66 20 77 65 20 66 6c 61 74  .  ** If we flat
14940 74 65 6e 20 74 68 65 20 61 62 6f 76 65 2c 20 77  ten the above, w
14950 65 20 77 6f 75 6c 64 20 67 65 74 0a 20 20 2a 2a  e would get.  **
14960 0a 20 20 2a 2a 20 20 20 20 20 20 20 20 20 28 74  .  **         (t
14970 31 20 4c 45 46 54 20 4f 55 54 45 52 20 4a 4f 49  1 LEFT OUTER JOI
14980 4e 20 74 32 29 20 4a 4f 49 4e 20 74 33 0a 20 20  N t2) JOIN t3.  
14990 2a 2a 0a 20 20 2a 2a 20 77 68 69 63 68 20 69 73  **.  ** which is
149a0 20 6e 6f 74 20 61 74 20 61 6c 6c 20 74 68 65 20   not at all the 
149b0 73 61 6d 65 20 74 68 69 6e 67 2e 0a 20 20 2a 2f  same thing..  */
149c0 0a 20 20 69 66 28 20 70 53 75 62 53 72 63 2d 3e  .  if( pSubSrc->
149d0 6e 53 72 63 3e 31 20 26 26 20 28 70 53 75 62 69  nSrc>1 && (pSubi
149e0 74 65 6d 2d 3e 6a 6f 69 6e 74 79 70 65 20 26 20  tem->jointype & 
149f0 4a 54 5f 4f 55 54 45 52 29 21 3d 30 20 29 7b 0a  JT_OUTER)!=0 ){.
14a00 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
14a10 7d 0a 0a 20 20 2f 2a 20 52 65 73 74 72 69 63 74  }..  /* Restrict
14a20 69 6f 6e 20 31 32 3a 20 20 49 66 20 74 68 65 20  ion 12:  If the 
14a30 73 75 62 71 75 65 72 79 20 69 73 20 74 68 65 20  subquery is the 
14a40 72 69 67 68 74 20 6f 70 65 72 61 6e 64 20 6f 66  right operand of
14a50 20 61 20 6c 65 66 74 20 6f 75 74 65 72 0a 20 20   a left outer.  
14a60 2a 2a 20 6a 6f 69 6e 2c 20 6d 61 6b 65 20 73 75  ** join, make su
14a70 72 65 20 74 68 65 20 73 75 62 71 75 65 72 79 20  re the subquery 
14a80 68 61 73 20 6e 6f 20 57 48 45 52 45 20 63 6c 61  has no WHERE cla
14a90 75 73 65 2e 0a 20 20 2a 2a 20 41 6e 20 65 78 61  use..  ** An exa
14aa0 6d 70 6c 65 73 20 6f 66 20 77 68 79 20 74 68 69  mples of why thi
14ab0 73 20 69 73 20 6e 6f 74 20 61 6c 6c 6f 77 65 64  s is not allowed
14ac0 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20  :.  **.  **     
14ad0 20 20 20 20 74 31 20 4c 45 46 54 20 4f 55 54 45      t1 LEFT OUTE
14ae0 52 20 4a 4f 49 4e 20 28 53 45 4c 45 43 54 20 2a  R JOIN (SELECT *
14af0 20 46 52 4f 4d 20 74 32 20 57 48 45 52 45 20 74   FROM t2 WHERE t
14b00 32 2e 78 3e 30 29 0a 20 20 2a 2a 0a 20 20 2a 2a  2.x>0).  **.  **
14b10 20 49 66 20 77 65 20 66 6c 61 74 74 65 6e 20 74   If we flatten t
14b20 68 65 20 61 62 6f 76 65 2c 20 77 65 20 77 6f 75  he above, we wou
14b30 6c 64 20 67 65 74 0a 20 20 2a 2a 0a 20 20 2a 2a  ld get.  **.  **
14b40 20 20 20 20 20 20 20 20 20 28 74 31 20 4c 45 46           (t1 LEF
14b50 54 20 4f 55 54 45 52 20 4a 4f 49 4e 20 74 32 29  T OUTER JOIN t2)
14b60 20 57 48 45 52 45 20 74 32 2e 78 3e 30 0a 20 20   WHERE t2.x>0.  
14b70 2a 2a 0a 20 20 2a 2a 20 42 75 74 20 74 68 65 20  **.  ** But the 
14b80 74 32 2e 78 3e 30 20 74 65 73 74 20 77 69 6c 6c  t2.x>0 test will
14b90 20 61 6c 77 61 79 73 20 66 61 69 6c 20 6f 6e 20   always fail on 
14ba0 61 20 4e 55 4c 4c 20 72 6f 77 20 6f 66 20 74 32  a NULL row of t2
14bb0 2c 20 77 68 69 63 68 0a 20 20 2a 2a 20 65 66 66  , which.  ** eff
14bc0 65 63 74 69 76 65 6c 79 20 63 6f 6e 76 65 72 74  ectively convert
14bd0 73 20 74 68 65 20 4f 55 54 45 52 20 4a 4f 49 4e  s the OUTER JOIN
14be0 20 69 6e 74 6f 20 61 6e 20 49 4e 4e 45 52 20 4a   into an INNER J
14bf0 4f 49 4e 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  OIN..  */.  if( 
14c00 28 70 53 75 62 69 74 65 6d 2d 3e 6a 6f 69 6e 74  (pSubitem->joint
14c10 79 70 65 20 26 20 4a 54 5f 4f 55 54 45 52 29 21  ype & JT_OUTER)!
14c20 3d 30 20 26 26 20 70 53 75 62 2d 3e 70 57 68 65  =0 && pSub->pWhe
14c30 72 65 21 3d 30 20 29 7b 0a 20 20 20 20 72 65 74  re!=0 ){.    ret
14c40 75 72 6e 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  urn 0;.  }..  /*
14c50 20 49 66 20 77 65 20 72 65 61 63 68 20 74 68 69   If we reach thi
14c60 73 20 70 6f 69 6e 74 2c 20 69 74 20 6d 65 61 6e  s point, it mean
14c70 73 20 66 6c 61 74 74 65 6e 69 6e 67 20 69 73 20  s flattening is 
14c80 70 65 72 6d 69 74 74 65 64 20 66 6f 72 20 74 68  permitted for th
14c90 65 0a 20 20 2a 2a 20 69 46 72 6f 6d 2d 74 68 20  e.  ** iFrom-th 
14ca0 65 6e 74 72 79 20 6f 66 20 74 68 65 20 46 52 4f  entry of the FRO
14cb0 4d 20 63 6c 61 75 73 65 20 69 6e 20 74 68 65 20  M clause in the 
14cc0 6f 75 74 65 72 20 71 75 65 72 79 2e 0a 20 20 2a  outer query..  *
14cd0 2f 0a 0a 20 20 2f 2a 20 4d 6f 76 65 20 61 6c 6c  /..  /* Move all
14ce0 20 6f 66 20 74 68 65 20 46 52 4f 4d 20 65 6c 65   of the FROM ele
14cf0 6d 65 6e 74 73 20 6f 66 20 74 68 65 20 73 75 62  ments of the sub
14d00 71 75 65 72 79 20 69 6e 74 6f 20 74 68 65 0a 20  query into the. 
14d10 20 2a 2a 20 74 68 65 20 46 52 4f 4d 20 63 6c 61   ** the FROM cla
14d20 75 73 65 20 6f 66 20 74 68 65 20 6f 75 74 65 72  use of the outer
14d30 20 71 75 65 72 79 2e 20 20 42 65 66 6f 72 65 20   query.  Before 
14d40 64 6f 69 6e 67 20 74 68 69 73 2c 20 72 65 6d 65  doing this, reme
14d50 6d 62 65 72 0a 20 20 2a 2a 20 74 68 65 20 63 75  mber.  ** the cu
14d60 72 73 6f 72 20 6e 75 6d 62 65 72 20 66 6f 72 20  rsor number for 
14d70 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 6f 75 74  the original out
14d80 65 72 20 71 75 65 72 79 20 46 52 4f 4d 20 65 6c  er query FROM el
14d90 65 6d 65 6e 74 20 69 6e 0a 20 20 2a 2a 20 69 50  ement in.  ** iP
14da0 61 72 65 6e 74 2e 20 20 54 68 65 20 69 50 61 72  arent.  The iPar
14db0 65 6e 74 20 63 75 72 73 6f 72 20 77 69 6c 6c 20  ent cursor will 
14dc0 6e 65 76 65 72 20 62 65 20 75 73 65 64 2e 20 20  never be used.  
14dd0 53 75 62 73 65 71 75 65 6e 74 20 63 6f 64 65 0a  Subsequent code.
14de0 20 20 2a 2a 20 77 69 6c 6c 20 73 63 61 6e 20 65    ** will scan e
14df0 78 70 72 65 73 73 69 6f 6e 73 20 6c 6f 6f 6b 69  xpressions looki
14e00 6e 67 20 66 6f 72 20 69 50 61 72 65 6e 74 20 72  ng for iParent r
14e10 65 66 65 72 65 6e 63 65 73 20 61 6e 64 20 72 65  eferences and re
14e20 70 6c 61 63 65 0a 20 20 2a 2a 20 74 68 6f 73 65  place.  ** those
14e30 20 72 65 66 65 72 65 6e 63 65 73 20 77 69 74 68   references with
14e40 20 65 78 70 72 65 73 73 69 6f 6e 73 20 74 68 61   expressions tha
14e50 74 20 72 65 73 6f 6c 76 65 20 74 6f 20 74 68 65  t resolve to the
14e60 20 73 75 62 71 75 65 72 79 20 46 52 4f 4d 0a 20   subquery FROM. 
14e70 20 2a 2a 20 65 6c 65 6d 65 6e 74 73 20 77 65 20   ** elements we 
14e80 61 72 65 20 6e 6f 77 20 63 6f 70 79 69 6e 67 20  are now copying 
14e90 69 6e 2e 0a 20 20 2a 2f 0a 20 20 69 50 61 72 65  in..  */.  iPare
14ea0 6e 74 20 3d 20 70 53 75 62 69 74 65 6d 2d 3e 69  nt = pSubitem->i
14eb0 43 75 72 73 6f 72 3b 0a 20 20 7b 0a 20 20 20 20  Cursor;.  {.    
14ec0 69 6e 74 20 6e 53 75 62 53 72 63 20 3d 20 70 53  int nSubSrc = pS
14ed0 75 62 53 72 63 2d 3e 6e 53 72 63 3b 0a 20 20 20  ubSrc->nSrc;.   
14ee0 20 69 6e 74 20 6a 6f 69 6e 74 79 70 65 20 3d 20   int jointype = 
14ef0 70 53 75 62 69 74 65 6d 2d 3e 6a 6f 69 6e 74 79  pSubitem->jointy
14f00 70 65 3b 0a 0a 20 20 20 20 73 71 6c 69 74 65 33  pe;..    sqlite3
14f10 44 65 6c 65 74 65 54 61 62 6c 65 28 70 53 75 62  DeleteTable(pSub
14f20 69 74 65 6d 2d 3e 70 54 61 62 29 3b 0a 20 20 20  item->pTab);.   
14f30 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 53   sqlite3_free(pS
14f40 75 62 69 74 65 6d 2d 3e 7a 44 61 74 61 62 61 73  ubitem->zDatabas
14f50 65 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  e);.    sqlite3_
14f60 66 72 65 65 28 70 53 75 62 69 74 65 6d 2d 3e 7a  free(pSubitem->z
14f70 4e 61 6d 65 29 3b 0a 20 20 20 20 73 71 6c 69 74  Name);.    sqlit
14f80 65 33 5f 66 72 65 65 28 70 53 75 62 69 74 65 6d  e3_free(pSubitem
14f90 2d 3e 7a 41 6c 69 61 73 29 3b 0a 20 20 20 20 70  ->zAlias);.    p
14fa0 53 75 62 69 74 65 6d 2d 3e 70 54 61 62 20 3d 20  Subitem->pTab = 
14fb0 30 3b 0a 20 20 20 20 70 53 75 62 69 74 65 6d 2d  0;.    pSubitem-
14fc0 3e 7a 44 61 74 61 62 61 73 65 20 3d 20 30 3b 0a  >zDatabase = 0;.
14fd0 20 20 20 20 70 53 75 62 69 74 65 6d 2d 3e 7a 4e      pSubitem->zN
14fe0 61 6d 65 20 3d 20 30 3b 0a 20 20 20 20 70 53 75  ame = 0;.    pSu
14ff0 62 69 74 65 6d 2d 3e 7a 41 6c 69 61 73 20 3d 20  bitem->zAlias = 
15000 30 3b 0a 20 20 20 20 69 66 28 20 6e 53 75 62 53  0;.    if( nSubS
15010 72 63 3e 31 20 29 7b 0a 20 20 20 20 20 20 69 6e  rc>1 ){.      in
15020 74 20 65 78 74 72 61 20 3d 20 6e 53 75 62 53 72  t extra = nSubSr
15030 63 20 2d 20 31 3b 0a 20 20 20 20 20 20 66 6f 72  c - 1;.      for
15040 28 69 3d 31 3b 20 69 3c 6e 53 75 62 53 72 63 3b  (i=1; i<nSubSrc;
15050 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 70   i++){.        p
15060 53 72 63 20 3d 20 73 71 6c 69 74 65 33 53 72 63  Src = sqlite3Src
15070 4c 69 73 74 41 70 70 65 6e 64 28 64 62 2c 20 70  ListAppend(db, p
15080 53 72 63 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  Src, 0, 0);.    
15090 20 20 20 20 69 66 28 20 70 53 72 63 3d 3d 30 20      if( pSrc==0 
150a0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e  ){.          p->
150b0 70 53 72 63 20 3d 20 30 3b 0a 20 20 20 20 20 20  pSrc = 0;.      
150c0 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20      return 1;.  
150d0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
150e0 20 20 20 20 20 20 70 2d 3e 70 53 72 63 20 3d 20        p->pSrc = 
150f0 70 53 72 63 3b 0a 20 20 20 20 20 20 66 6f 72 28  pSrc;.      for(
15100 69 3d 70 53 72 63 2d 3e 6e 53 72 63 2d 31 3b 20  i=pSrc->nSrc-1; 
15110 69 2d 65 78 74 72 61 3e 3d 69 46 72 6f 6d 3b 20  i-extra>=iFrom; 
15120 69 2d 2d 29 7b 0a 20 20 20 20 20 20 20 20 70 53  i--){.        pS
15130 72 63 2d 3e 61 5b 69 5d 20 3d 20 70 53 72 63 2d  rc->a[i] = pSrc-
15140 3e 61 5b 69 2d 65 78 74 72 61 5d 3b 0a 20 20 20  >a[i-extra];.   
15150 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 66     }.    }.    f
15160 6f 72 28 69 3d 30 3b 20 69 3c 6e 53 75 62 53 72  or(i=0; i<nSubSr
15170 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 70  c; i++){.      p
15180 53 72 63 2d 3e 61 5b 69 2b 69 46 72 6f 6d 5d 20  Src->a[i+iFrom] 
15190 3d 20 70 53 75 62 53 72 63 2d 3e 61 5b 69 5d 3b  = pSubSrc->a[i];
151a0 0a 20 20 20 20 20 20 6d 65 6d 73 65 74 28 26 70  .      memset(&p
151b0 53 75 62 53 72 63 2d 3e 61 5b 69 5d 2c 20 30 2c  SubSrc->a[i], 0,
151c0 20 73 69 7a 65 6f 66 28 70 53 75 62 53 72 63 2d   sizeof(pSubSrc-
151d0 3e 61 5b 69 5d 29 29 3b 0a 20 20 20 20 7d 0a 20  >a[i]));.    }. 
151e0 20 20 20 70 53 72 63 2d 3e 61 5b 69 46 72 6f 6d     pSrc->a[iFrom
151f0 5d 2e 6a 6f 69 6e 74 79 70 65 20 3d 20 6a 6f 69  ].jointype = joi
15200 6e 74 79 70 65 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  ntype;.  }..  /*
15210 20 4e 6f 77 20 62 65 67 69 6e 20 73 75 62 73 74   Now begin subst
15220 69 74 75 74 69 6e 67 20 73 75 62 71 75 65 72 79  ituting subquery
15230 20 72 65 73 75 6c 74 20 73 65 74 20 65 78 70 72   result set expr
15240 65 73 73 69 6f 6e 73 20 66 6f 72 20 0a 20 20 2a  essions for .  *
15250 2a 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20  * references to 
15260 74 68 65 20 69 50 61 72 65 6e 74 20 69 6e 20 74  the iParent in t
15270 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 2e 0a  he outer query..
15280 20 20 2a 2a 20 0a 20 20 2a 2a 20 45 78 61 6d 70    ** .  ** Examp
15290 6c 65 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20  le:.  **.  **   
152a0 53 45 4c 45 43 54 20 61 2b 35 2c 20 62 2a 31 30  SELECT a+5, b*10
152b0 20 46 52 4f 4d 20 28 53 45 4c 45 43 54 20 78 2a   FROM (SELECT x*
152c0 33 20 41 53 20 61 2c 20 79 2b 31 30 20 41 53 20  3 AS a, y+10 AS 
152d0 62 20 46 52 4f 4d 20 74 31 29 20 57 48 45 52 45  b FROM t1) WHERE
152e0 20 61 3e 62 3b 0a 20 20 2a 2a 20 20 20 5c 20 20   a>b;.  **   \  
152f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15300 20 20 20 5c 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f     \____________
15310 5f 20 73 75 62 71 75 65 72 79 20 5f 5f 5f 5f 5f  _ subquery _____
15320 5f 5f 5f 5f 5f 2f 20 20 20 20 20 20 20 20 20 20  _____/          
15330 2f 0a 20 20 2a 2a 20 20 20 20 5c 5f 5f 5f 5f 5f  /.  **    \_____
15340 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f  ________________
15350 20 6f 75 74 65 72 20 71 75 65 72 79 20 5f 5f 5f   outer query ___
15360 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f  ________________
15370 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 2f 0a 20 20 2a  ___________/.  *
15380 2a 0a 20 20 2a 2a 20 57 65 20 6c 6f 6f 6b 20 61  *.  ** We look a
15390 74 20 65 76 65 72 79 20 65 78 70 72 65 73 73 69  t every expressi
153a0 6f 6e 20 69 6e 20 74 68 65 20 6f 75 74 65 72 20  on in the outer 
153b0 71 75 65 72 79 20 61 6e 64 20 65 76 65 72 79 20  query and every 
153c0 70 6c 61 63 65 20 77 65 20 73 65 65 0a 20 20 2a  place we see.  *
153d0 2a 20 22 61 22 20 77 65 20 73 75 62 73 74 69 74  * "a" we substit
153e0 75 74 65 20 22 78 2a 33 22 20 61 6e 64 20 65 76  ute "x*3" and ev
153f0 65 72 79 20 70 6c 61 63 65 20 77 65 20 73 65 65  ery place we see
15400 20 22 62 22 20 77 65 20 73 75 62 73 74 69 74 75   "b" we substitu
15410 74 65 20 22 79 2b 31 30 22 2e 0a 20 20 2a 2f 0a  te "y+10"..  */.
15420 20 20 70 4c 69 73 74 20 3d 20 70 2d 3e 70 45 4c    pList = p->pEL
15430 69 73 74 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  ist;.  for(i=0; 
15440 69 3c 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20  i<pList->nExpr; 
15450 69 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72 20 2a  i++){.    Expr *
15460 70 45 78 70 72 3b 0a 20 20 20 20 69 66 28 20 70  pExpr;.    if( p
15470 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65  List->a[i].zName
15480 3d 3d 30 20 26 26 20 28 70 45 78 70 72 20 3d 20  ==0 && (pExpr = 
15490 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70  pList->a[i].pExp
154a0 72 29 2d 3e 73 70 61 6e 2e 7a 21 3d 30 20 29 7b  r)->span.z!=0 ){
154b0 0a 20 20 20 20 20 20 70 4c 69 73 74 2d 3e 61 5b  .      pList->a[
154c0 69 5d 2e 7a 4e 61 6d 65 20 3d 20 0a 20 20 20 20  i].zName = .    
154d0 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
154e0 44 62 53 74 72 4e 44 75 70 28 64 62 2c 20 28 63  DbStrNDup(db, (c
154f0 68 61 72 2a 29 70 45 78 70 72 2d 3e 73 70 61 6e  har*)pExpr->span
15500 2e 7a 2c 20 70 45 78 70 72 2d 3e 73 70 61 6e 2e  .z, pExpr->span.
15510 6e 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  n);.    }.  }.  
15520 73 75 62 73 74 45 78 70 72 4c 69 73 74 28 64 62  substExprList(db
15530 2c 20 70 2d 3e 70 45 4c 69 73 74 2c 20 69 50 61  , p->pEList, iPa
15540 72 65 6e 74 2c 20 70 53 75 62 2d 3e 70 45 4c 69  rent, pSub->pELi
15550 73 74 29 3b 0a 20 20 69 66 28 20 69 73 41 67 67  st);.  if( isAgg
15560 20 29 7b 0a 20 20 20 20 73 75 62 73 74 45 78 70   ){.    substExp
15570 72 4c 69 73 74 28 64 62 2c 20 70 2d 3e 70 47 72  rList(db, p->pGr
15580 6f 75 70 42 79 2c 20 69 50 61 72 65 6e 74 2c 20  oupBy, iParent, 
15590 70 53 75 62 2d 3e 70 45 4c 69 73 74 29 3b 0a 20  pSub->pEList);. 
155a0 20 20 20 73 75 62 73 74 45 78 70 72 28 64 62 2c     substExpr(db,
155b0 20 70 2d 3e 70 48 61 76 69 6e 67 2c 20 69 50 61   p->pHaving, iPa
155c0 72 65 6e 74 2c 20 70 53 75 62 2d 3e 70 45 4c 69  rent, pSub->pELi
155d0 73 74 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  st);.  }.  if( p
155e0 53 75 62 2d 3e 70 4f 72 64 65 72 42 79 20 29 7b  Sub->pOrderBy ){
155f0 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e  .    assert( p->
15600 70 4f 72 64 65 72 42 79 3d 3d 30 20 29 3b 0a 20  pOrderBy==0 );. 
15610 20 20 20 70 2d 3e 70 4f 72 64 65 72 42 79 20 3d     p->pOrderBy =
15620 20 70 53 75 62 2d 3e 70 4f 72 64 65 72 42 79 3b   pSub->pOrderBy;
15630 0a 20 20 20 20 70 53 75 62 2d 3e 70 4f 72 64 65  .    pSub->pOrde
15640 72 42 79 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65  rBy = 0;.  }else
15650 20 69 66 28 20 70 2d 3e 70 4f 72 64 65 72 42 79   if( p->pOrderBy
15660 20 29 7b 0a 20 20 20 20 73 75 62 73 74 45 78 70   ){.    substExp
15670 72 4c 69 73 74 28 64 62 2c 20 70 2d 3e 70 4f 72  rList(db, p->pOr
15680 64 65 72 42 79 2c 20 69 50 61 72 65 6e 74 2c 20  derBy, iParent, 
15690 70 53 75 62 2d 3e 70 45 4c 69 73 74 29 3b 0a 20  pSub->pEList);. 
156a0 20 7d 0a 20 20 69 66 28 20 70 53 75 62 2d 3e 70   }.  if( pSub->p
156b0 57 68 65 72 65 20 29 7b 0a 20 20 20 20 70 57 68  Where ){.    pWh
156c0 65 72 65 20 3d 20 73 71 6c 69 74 65 33 45 78 70  ere = sqlite3Exp
156d0 72 44 75 70 28 64 62 2c 20 70 53 75 62 2d 3e 70  rDup(db, pSub->p
156e0 57 68 65 72 65 29 3b 0a 20 20 7d 65 6c 73 65 7b  Where);.  }else{
156f0 0a 20 20 20 20 70 57 68 65 72 65 20 3d 20 30 3b  .    pWhere = 0;
15700 0a 20 20 7d 0a 20 20 69 66 28 20 73 75 62 71 75  .  }.  if( subqu
15710 65 72 79 49 73 41 67 67 20 29 7b 0a 20 20 20 20  eryIsAgg ){.    
15720 61 73 73 65 72 74 28 20 70 2d 3e 70 48 61 76 69  assert( p->pHavi
15730 6e 67 3d 3d 30 20 29 3b 0a 20 20 20 20 70 2d 3e  ng==0 );.    p->
15740 70 48 61 76 69 6e 67 20 3d 20 70 2d 3e 70 57 68  pHaving = p->pWh
15750 65 72 65 3b 0a 20 20 20 20 70 2d 3e 70 57 68 65  ere;.    p->pWhe
15760 72 65 20 3d 20 70 57 68 65 72 65 3b 0a 20 20 20  re = pWhere;.   
15770 20 73 75 62 73 74 45 78 70 72 28 64 62 2c 20 70   substExpr(db, p
15780 2d 3e 70 48 61 76 69 6e 67 2c 20 69 50 61 72 65  ->pHaving, iPare
15790 6e 74 2c 20 70 53 75 62 2d 3e 70 45 4c 69 73 74  nt, pSub->pEList
157a0 29 3b 0a 20 20 20 20 70 2d 3e 70 48 61 76 69 6e  );.    p->pHavin
157b0 67 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 41  g = sqlite3ExprA
157c0 6e 64 28 64 62 2c 20 70 2d 3e 70 48 61 76 69 6e  nd(db, p->pHavin
157d0 67 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  g, .            
157e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
157f0 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 44      sqlite3ExprD
15800 75 70 28 64 62 2c 20 70 53 75 62 2d 3e 70 48 61  up(db, pSub->pHa
15810 76 69 6e 67 29 29 3b 0a 20 20 20 20 61 73 73 65  ving));.    asse
15820 72 74 28 20 70 2d 3e 70 47 72 6f 75 70 42 79 3d  rt( p->pGroupBy=
15830 3d 30 20 29 3b 0a 20 20 20 20 70 2d 3e 70 47 72  =0 );.    p->pGr
15840 6f 75 70 42 79 20 3d 20 73 71 6c 69 74 65 33 45  oupBy = sqlite3E
15850 78 70 72 4c 69 73 74 44 75 70 28 64 62 2c 20 70  xprListDup(db, p
15860 53 75 62 2d 3e 70 47 72 6f 75 70 42 79 29 3b 0a  Sub->pGroupBy);.
15870 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 75 62    }else{.    sub
15880 73 74 45 78 70 72 28 64 62 2c 20 70 2d 3e 70 57  stExpr(db, p->pW
15890 68 65 72 65 2c 20 69 50 61 72 65 6e 74 2c 20 70  here, iParent, p
158a0 53 75 62 2d 3e 70 45 4c 69 73 74 29 3b 0a 20 20  Sub->pEList);.  
158b0 20 20 70 2d 3e 70 57 68 65 72 65 20 3d 20 73 71    p->pWhere = sq
158c0 6c 69 74 65 33 45 78 70 72 41 6e 64 28 64 62 2c  lite3ExprAnd(db,
158d0 20 70 2d 3e 70 57 68 65 72 65 2c 20 70 57 68 65   p->pWhere, pWhe
158e0 72 65 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54  re);.  }..  /* T
158f0 68 65 20 66 6c 61 74 74 65 6e 65 64 20 71 75 65  he flattened que
15900 72 79 20 69 73 20 64 69 73 74 69 6e 63 74 20 69  ry is distinct i
15910 66 20 65 69 74 68 65 72 20 74 68 65 20 69 6e 6e  f either the inn
15920 65 72 20 6f 72 20 74 68 65 0a 20 20 2a 2a 20 6f  er or the.  ** o
15930 75 74 65 72 20 71 75 65 72 79 20 69 73 20 64 69  uter query is di
15940 73 74 69 6e 63 74 2e 20 0a 20 20 2a 2f 0a 20 20  stinct. .  */.  
15950 70 2d 3e 69 73 44 69 73 74 69 6e 63 74 20 3d 20  p->isDistinct = 
15960 70 2d 3e 69 73 44 69 73 74 69 6e 63 74 20 7c 7c  p->isDistinct ||
15970 20 70 53 75 62 2d 3e 69 73 44 69 73 74 69 6e 63   pSub->isDistinc
15980 74 3b 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 53 45  t;..  /*.  ** SE
15990 4c 45 43 54 20 2e 2e 2e 20 46 52 4f 4d 20 28 53  LECT ... FROM (S
159a0 45 4c 45 43 54 20 2e 2e 2e 20 4c 49 4d 49 54 20  ELECT ... LIMIT 
159b0 61 20 4f 46 46 53 45 54 20 62 29 20 4c 49 4d 49  a OFFSET b) LIMI
159c0 54 20 78 20 4f 46 46 53 45 54 20 79 3b 0a 20 20  T x OFFSET y;.  
159d0 2a 2a 0a 20 20 2a 2a 20 4f 6e 65 20 69 73 20 74  **.  ** One is t
159e0 65 6d 70 74 65 64 20 74 6f 20 74 72 79 20 74 6f  empted to try to
159f0 20 61 64 64 20 61 20 61 6e 64 20 62 20 74 6f 20   add a and b to 
15a00 63 6f 6d 62 69 6e 65 20 74 68 65 20 6c 69 6d 69  combine the limi
15a10 74 73 2e 20 20 42 75 74 20 74 68 69 73 0a 20 20  ts.  But this.  
15a20 2a 2a 20 64 6f 65 73 20 6e 6f 74 20 77 6f 72 6b  ** does not work
15a30 20 69 66 20 65 69 74 68 65 72 20 6c 69 6d 69 74   if either limit
15a40 20 69 73 20 6e 65 67 61 74 69 76 65 2e 0a 20 20   is negative..  
15a50 2a 2f 0a 20 20 69 66 28 20 70 53 75 62 2d 3e 70  */.  if( pSub->p
15a60 4c 69 6d 69 74 20 29 7b 0a 20 20 20 20 70 2d 3e  Limit ){.    p->
15a70 70 4c 69 6d 69 74 20 3d 20 70 53 75 62 2d 3e 70  pLimit = pSub->p
15a80 4c 69 6d 69 74 3b 0a 20 20 20 20 70 53 75 62 2d  Limit;.    pSub-
15a90 3e 70 4c 69 6d 69 74 20 3d 20 30 3b 0a 20 20 7d  >pLimit = 0;.  }
15aa0 0a 0a 20 20 2f 2a 20 46 69 6e 69 61 6c 6c 79 2c  ..  /* Finially,
15ab0 20 64 65 6c 65 74 65 20 77 68 61 74 20 69 73 20   delete what is 
15ac0 6c 65 66 74 20 6f 66 20 74 68 65 20 73 75 62 71  left of the subq
15ad0 75 65 72 79 20 61 6e 64 20 72 65 74 75 72 6e 0a  uery and return.
15ae0 20 20 2a 2a 20 73 75 63 63 65 73 73 2e 0a 20 20    ** success..  
15af0 2a 2f 0a 20 20 73 71 6c 69 74 65 33 53 65 6c 65  */.  sqlite3Sele
15b00 63 74 44 65 6c 65 74 65 28 70 53 75 62 29 3b 0a  ctDelete(pSub);.
15b10 20 20 72 65 74 75 72 6e 20 31 3b 0a 7d 0a 23 65    return 1;.}.#e
15b20 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f  ndif /* SQLITE_O
15b30 4d 49 54 5f 56 49 45 57 20 2a 2f 0a 0a 2f 2a 0a  MIT_VIEW */../*.
15b40 2a 2a 20 41 6e 61 6c 79 7a 65 20 74 68 65 20 53  ** Analyze the S
15b50 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20  ELECT statement 
15b60 70 61 73 73 65 64 20 61 73 20 61 6e 20 61 72 67  passed as an arg
15b70 75 6d 65 6e 74 20 74 6f 20 73 65 65 20 69 66 20  ument to see if 
15b80 69 74 0a 2a 2a 20 69 73 20 61 20 6d 69 6e 28 29  it.** is a min()
15b90 20 6f 72 20 6d 61 78 28 29 20 71 75 65 72 79 2e   or max() query.
15ba0 20 52 65 74 75 72 6e 20 4f 52 44 45 52 42 59 5f   Return ORDERBY_
15bb0 4d 49 4e 20 6f 72 20 4f 52 44 45 52 42 59 5f 4d  MIN or ORDERBY_M
15bc0 41 58 20 69 66 20 0a 2a 2a 20 69 74 20 69 73 2c  AX if .** it is,
15bd0 20 6f 72 20 30 20 6f 74 68 65 72 77 69 73 65 2e   or 0 otherwise.
15be0 20 41 74 20 70 72 65 73 65 6e 74 2c 20 61 20 71   At present, a q
15bf0 75 65 72 79 20 69 73 20 63 6f 6e 73 69 64 65 72  uery is consider
15c00 65 64 20 74 6f 20 62 65 0a 2a 2a 20 61 20 6d 69  ed to be.** a mi
15c10 6e 28 29 2f 6d 61 78 28 29 20 71 75 65 72 79 20  n()/max() query 
15c20 69 66 3a 0a 2a 2a 0a 2a 2a 20 20 20 31 2e 20 54  if:.**.**   1. T
15c30 68 65 72 65 20 69 73 20 61 20 73 69 6e 67 6c 65  here is a single
15c40 20 6f 62 6a 65 63 74 20 69 6e 20 74 68 65 20 46   object in the F
15c50 52 4f 4d 20 63 6c 61 75 73 65 2e 0a 2a 2a 0a 2a  ROM clause..**.*
15c60 2a 20 20 20 32 2e 20 54 68 65 72 65 20 69 73 20  *   2. There is 
15c70 61 20 73 69 6e 67 6c 65 20 65 78 70 72 65 73 73  a single express
15c80 69 6f 6e 20 69 6e 20 74 68 65 20 72 65 73 75 6c  ion in the resul
15c90 74 20 73 65 74 2c 20 61 6e 64 20 69 74 20 69 73  t set, and it is
15ca0 0a 2a 2a 20 20 20 20 20 20 65 69 74 68 65 72 20  .**      either 
15cb0 6d 69 6e 28 78 29 20 6f 72 20 6d 61 78 28 78 29  min(x) or max(x)
15cc0 2c 20 77 68 65 72 65 20 78 20 69 73 20 61 20 63  , where x is a c
15cd0 6f 6c 75 6d 6e 20 72 65 66 65 72 65 6e 63 65 2e  olumn reference.
15ce0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6d  .*/.static int m
15cf0 69 6e 4d 61 78 51 75 65 72 79 28 50 61 72 73 65  inMaxQuery(Parse
15d00 20 2a 70 50 61 72 73 65 2c 20 53 65 6c 65 63 74   *pParse, Select
15d10 20 2a 70 29 7b 0a 20 20 45 78 70 72 20 2a 70 45   *p){.  Expr *pE
15d20 78 70 72 3b 0a 20 20 45 78 70 72 4c 69 73 74 20  xpr;.  ExprList 
15d30 2a 70 45 4c 69 73 74 20 3d 20 70 2d 3e 70 45 4c  *pEList = p->pEL
15d40 69 73 74 3b 0a 0a 20 20 69 66 28 20 70 45 4c 69  ist;..  if( pELi
15d50 73 74 2d 3e 6e 45 78 70 72 21 3d 31 20 29 20 72  st->nExpr!=1 ) r
15d60 65 74 75 72 6e 20 4f 52 44 45 52 42 59 5f 4e 4f  eturn ORDERBY_NO
15d70 52 4d 41 4c 3b 0a 20 20 70 45 78 70 72 20 3d 20  RMAL;.  pExpr = 
15d80 70 45 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78  pEList->a[0].pEx
15d90 70 72 3b 0a 20 20 70 45 4c 69 73 74 20 3d 20 70  pr;.  pEList = p
15da0 45 78 70 72 2d 3e 70 4c 69 73 74 3b 0a 20 20 69  Expr->pList;.  i
15db0 66 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b  f( pExpr->op!=TK
15dc0 5f 41 47 47 5f 46 55 4e 43 54 49 4f 4e 20 7c 7c  _AGG_FUNCTION ||
15dd0 20 70 45 4c 69 73 74 3d 3d 30 20 7c 7c 20 70 45   pEList==0 || pE
15de0 4c 69 73 74 2d 3e 6e 45 78 70 72 21 3d 31 20 29  List->nExpr!=1 )
15df0 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28   return 0;.  if(
15e00 20 70 45 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45   pEList->a[0].pE
15e10 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 41 47 47 5f  xpr->op!=TK_AGG_
15e20 43 4f 4c 55 4d 4e 20 29 20 72 65 74 75 72 6e 20  COLUMN ) return 
15e30 4f 52 44 45 52 42 59 5f 4e 4f 52 4d 41 4c 3b 0a  ORDERBY_NORMAL;.
15e40 20 20 69 66 28 20 70 45 78 70 72 2d 3e 74 6f 6b    if( pExpr->tok
15e50 65 6e 2e 6e 21 3d 33 20 29 20 72 65 74 75 72 6e  en.n!=3 ) return
15e60 20 4f 52 44 45 52 42 59 5f 4e 4f 52 4d 41 4c 3b   ORDERBY_NORMAL;
15e70 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 74  .  if( sqlite3St
15e80 72 4e 49 43 6d 70 28 28 63 68 61 72 2a 29 70 45  rNICmp((char*)pE
15e90 78 70 72 2d 3e 74 6f 6b 65 6e 2e 7a 2c 22 6d 69  xpr->token.z,"mi
15ea0 6e 22 2c 33 29 3d 3d 30 20 29 7b 0a 20 20 20 20  n",3)==0 ){.    
15eb0 72 65 74 75 72 6e 20 4f 52 44 45 52 42 59 5f 4d  return ORDERBY_M
15ec0 49 4e 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20  IN;.  }else if( 
15ed0 73 71 6c 69 74 65 33 53 74 72 4e 49 43 6d 70 28  sqlite3StrNICmp(
15ee0 28 63 68 61 72 2a 29 70 45 78 70 72 2d 3e 74 6f  (char*)pExpr->to
15ef0 6b 65 6e 2e 7a 2c 22 6d 61 78 22 2c 33 29 3d 3d  ken.z,"max",3)==
15f00 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  0 ){.    return 
15f10 4f 52 44 45 52 42 59 5f 4d 41 58 3b 0a 20 20 7d  ORDERBY_MAX;.  }
15f20 0a 20 20 72 65 74 75 72 6e 20 4f 52 44 45 52 42  .  return ORDERB
15f30 59 5f 4e 4f 52 4d 41 4c 3b 0a 7d 0a 0a 2f 2a 0a  Y_NORMAL;.}../*.
15f40 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
15f50 72 65 73 6f 6c 76 65 73 20 61 6e 79 20 6e 61 6d  resolves any nam
15f60 65 73 20 75 73 65 64 20 69 6e 20 74 68 65 20 72  es used in the r
15f70 65 73 75 6c 74 20 73 65 74 20 6f 66 20 74 68 65  esult set of the
15f80 0a 2a 2a 20 73 75 70 70 6c 69 65 64 20 53 45 4c  .** supplied SEL
15f90 45 43 54 20 73 74 61 74 65 6d 65 6e 74 2e 20 49  ECT statement. I
15fa0 66 20 74 68 65 20 53 45 4c 45 43 54 20 73 74 61  f the SELECT sta
15fb0 74 65 6d 65 6e 74 20 62 65 69 6e 67 20 72 65 73  tement being res
15fc0 6f 6c 76 65 64 0a 2a 2a 20 69 73 20 61 20 73 75  olved.** is a su
15fd0 62 2d 73 65 6c 65 63 74 2c 20 74 68 65 6e 20 70  b-select, then p
15fe0 4f 75 74 65 72 4e 43 20 69 73 20 61 20 70 6f 69  OuterNC is a poi
15ff0 6e 74 65 72 20 74 6f 20 74 68 65 20 4e 61 6d 65  nter to the Name
16000 43 6f 6e 74 65 78 74 20 0a 2a 2a 20 6f 66 20 74  Context .** of t
16010 68 65 20 70 61 72 65 6e 74 20 53 45 4c 45 43 54  he parent SELECT
16020 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
16030 53 65 6c 65 63 74 52 65 73 6f 6c 76 65 28 0a 20  SelectResolve(. 
16040 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
16050 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70          /* The p
16060 61 72 73 65 72 20 63 6f 6e 74 65 78 74 20 2a 2f  arser context */
16070 0a 20 20 53 65 6c 65 63 74 20 2a 70 2c 20 20 20  .  Select *p,   
16080 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
16090 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
160a0 74 20 62 65 69 6e 67 20 63 6f 64 65 64 2e 20 2a  t being coded. *
160b0 2f 0a 20 20 4e 61 6d 65 43 6f 6e 74 65 78 74 20  /.  NameContext 
160c0 2a 70 4f 75 74 65 72 4e 43 20 20 2f 2a 20 54 68  *pOuterNC  /* Th
160d0 65 20 6f 75 74 65 72 20 6e 61 6d 65 20 63 6f 6e  e outer name con
160e0 74 65 78 74 2e 20 4d 61 79 20 62 65 20 4e 55 4c  text. May be NUL
160f0 4c 2e 20 2a 2f 0a 29 7b 0a 20 20 45 78 70 72 4c  L. */.){.  ExprL
16100 69 73 74 20 2a 70 45 4c 69 73 74 3b 20 20 20 20  ist *pEList;    
16110 20 20 20 20 20 20 2f 2a 20 52 65 73 75 6c 74 20        /* Result 
16120 73 65 74 2e 20 2a 2f 0a 20 20 69 6e 74 20 69 3b  set. */.  int i;
16130 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16140 20 20 20 20 20 2f 2a 20 46 6f 72 2d 6c 6f 6f 70       /* For-loop
16150 20 76 61 72 69 61 62 6c 65 20 75 73 65 64 20 69   variable used i
16160 6e 20 6d 75 6c 74 69 70 6c 65 20 70 6c 61 63 65  n multiple place
16170 73 20 2a 2f 0a 20 20 4e 61 6d 65 43 6f 6e 74 65  s */.  NameConte
16180 78 74 20 73 4e 43 3b 20 20 20 20 20 20 20 20 20  xt sNC;         
16190 20 20 2f 2a 20 4c 6f 63 61 6c 20 6e 61 6d 65 2d    /* Local name-
161a0 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78 70  context */.  Exp
161b0 72 4c 69 73 74 20 2a 70 47 72 6f 75 70 42 79 3b  rList *pGroupBy;
161c0 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 67          /* The g
161d0 72 6f 75 70 20 62 79 20 63 6c 61 75 73 65 20 2a  roup by clause *
161e0 2f 0a 0a 20 20 2f 2a 20 49 66 20 74 68 69 73 20  /..  /* If this 
161f0 72 6f 75 74 69 6e 65 20 68 61 73 20 72 75 6e 20  routine has run 
16200 62 65 66 6f 72 65 2c 20 72 65 74 75 72 6e 20 69  before, return i
16210 6d 6d 65 64 69 61 74 65 6c 79 2e 20 2a 2f 0a 20  mmediately. */. 
16220 20 69 66 28 20 70 2d 3e 69 73 52 65 73 6f 6c 76   if( p->isResolv
16230 65 64 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  ed ){.    assert
16240 28 20 21 70 4f 75 74 65 72 4e 43 20 29 3b 0a 20  ( !pOuterNC );. 
16250 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
16260 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 70 2d 3e 69 73  _OK;.  }.  p->is
16270 52 65 73 6f 6c 76 65 64 20 3d 20 31 3b 0a 0a 20  Resolved = 1;.. 
16280 20 2f 2a 20 49 66 20 74 68 65 72 65 20 68 61 76   /* If there hav
16290 65 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 65  e already been e
162a0 72 72 6f 72 73 2c 20 64 6f 20 6e 6f 74 68 69 6e  rrors, do nothin
162b0 67 2e 20 2a 2f 0a 20 20 69 66 28 20 70 50 61 72  g. */.  if( pPar
162c0 73 65 2d 3e 6e 45 72 72 3e 30 20 29 7b 0a 20 20  se->nErr>0 ){.  
162d0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
162e0 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  ERROR;.  }..  /*
162f0 20 50 72 65 70 61 72 65 20 74 68 65 20 73 65 6c   Prepare the sel
16300 65 63 74 20 73 74 61 74 65 6d 65 6e 74 2e 20 54  ect statement. T
16310 68 69 73 20 63 61 6c 6c 20 77 69 6c 6c 20 61 6c  his call will al
16320 6c 6f 63 61 74 65 20 61 6c 6c 20 63 75 72 73 6f  locate all curso
16330 72 73 0a 20 20 2a 2a 20 72 65 71 75 69 72 65 64  rs.  ** required
16340 20 74 6f 20 68 61 6e 64 6c 65 20 74 68 65 20 74   to handle the t
16350 61 62 6c 65 73 20 61 6e 64 20 73 75 62 71 75 65  ables and subque
16360 72 69 65 73 20 69 6e 20 74 68 65 20 46 52 4f 4d  ries in the FROM
16370 20 63 6c 61 75 73 65 2e 0a 20 20 2a 2f 0a 20 20   clause..  */.  
16380 69 66 28 20 70 72 65 70 53 65 6c 65 63 74 53 74  if( prepSelectSt
16390 6d 74 28 70 50 61 72 73 65 2c 20 70 29 20 29 7b  mt(pParse, p) ){
163a0 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
163b0 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20  TE_ERROR;.  }.. 
163c0 20 2f 2a 20 52 65 73 6f 6c 76 65 20 74 68 65 20   /* Resolve the 
163d0 65 78 70 72 65 73 73 69 6f 6e 73 20 69 6e 20 74  expressions in t
163e0 68 65 20 4c 49 4d 49 54 20 61 6e 64 20 4f 46 46  he LIMIT and OFF
163f0 53 45 54 20 63 6c 61 75 73 65 73 2e 20 54 68 65  SET clauses. The
16400 73 65 0a 20 20 2a 2a 20 61 72 65 20 6e 6f 74 20  se.  ** are not 
16410 61 6c 6c 6f 77 65 64 20 74 6f 20 72 65 66 65 72  allowed to refer
16420 20 74 6f 20 61 6e 79 20 6e 61 6d 65 73 2c 20 73   to any names, s
16430 6f 20 70 61 73 73 20 61 6e 20 65 6d 70 74 79 20  o pass an empty 
16440 4e 61 6d 65 43 6f 6e 74 65 78 74 2e 0a 20 20 2a  NameContext..  *
16450 2f 0a 20 20 6d 65 6d 73 65 74 28 26 73 4e 43 2c  /.  memset(&sNC,
16460 20 30 2c 20 73 69 7a 65 6f 66 28 73 4e 43 29 29   0, sizeof(sNC))
16470 3b 0a 20 20 73 4e 43 2e 70 50 61 72 73 65 20 3d  ;.  sNC.pParse =
16480 20 70 50 61 72 73 65 3b 0a 20 20 69 66 28 20 73   pParse;.  if( s
16490 71 6c 69 74 65 33 45 78 70 72 52 65 73 6f 6c 76  qlite3ExprResolv
164a0 65 4e 61 6d 65 73 28 26 73 4e 43 2c 20 70 2d 3e  eNames(&sNC, p->
164b0 70 4c 69 6d 69 74 29 20 7c 7c 0a 20 20 20 20 20  pLimit) ||.     
164c0 20 73 71 6c 69 74 65 33 45 78 70 72 52 65 73 6f   sqlite3ExprReso
164d0 6c 76 65 4e 61 6d 65 73 28 26 73 4e 43 2c 20 70  lveNames(&sNC, p
164e0 2d 3e 70 4f 66 66 73 65 74 29 20 29 7b 0a 20 20  ->pOffset) ){.  
164f0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
16500 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  ERROR;.  }..  /*
16510 20 53 65 74 20 75 70 20 74 68 65 20 6c 6f 63 61   Set up the loca
16520 6c 20 6e 61 6d 65 2d 63 6f 6e 74 65 78 74 20 74  l name-context t
16530 6f 20 70 61 73 73 20 74 6f 20 45 78 70 72 52 65  o pass to ExprRe
16540 73 6f 6c 76 65 4e 61 6d 65 73 28 29 20 74 6f 0a  solveNames() to.
16550 20 20 2a 2a 20 72 65 73 6f 6c 76 65 20 74 68 65    ** resolve the
16560 20 65 78 70 72 65 73 73 69 6f 6e 2d 6c 69 73 74   expression-list
16570 2e 0a 20 20 2a 2f 0a 20 20 73 4e 43 2e 61 6c 6c  ..  */.  sNC.all
16580 6f 77 41 67 67 20 3d 20 31 3b 0a 20 20 73 4e 43  owAgg = 1;.  sNC
16590 2e 70 53 72 63 4c 69 73 74 20 3d 20 70 2d 3e 70  .pSrcList = p->p
165a0 53 72 63 3b 0a 20 20 73 4e 43 2e 70 4e 65 78 74  Src;.  sNC.pNext
165b0 20 3d 20 70 4f 75 74 65 72 4e 43 3b 0a 0a 20 20   = pOuterNC;..  
165c0 2f 2a 20 52 65 73 6f 6c 76 65 20 6e 61 6d 65 73  /* Resolve names
165d0 20 69 6e 20 74 68 65 20 72 65 73 75 6c 74 20 73   in the result s
165e0 65 74 2e 20 2a 2f 0a 20 20 70 45 4c 69 73 74 20  et. */.  pEList 
165f0 3d 20 70 2d 3e 70 45 4c 69 73 74 3b 0a 20 20 69  = p->pEList;.  i
16600 66 28 20 21 70 45 4c 69 73 74 20 29 20 72 65 74  f( !pEList ) ret
16610 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52  urn SQLITE_ERROR
16620 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70  ;.  for(i=0; i<p
16630 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b  EList->nExpr; i+
16640 2b 29 7b 0a 20 20 20 20 45 78 70 72 20 2a 70 58  +){.    Expr *pX
16650 20 3d 20 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e   = pEList->a[i].
16660 70 45 78 70 72 3b 0a 20 20 20 20 69 66 28 20 73  pExpr;.    if( s
16670 71 6c 69 74 65 33 45 78 70 72 52 65 73 6f 6c 76  qlite3ExprResolv
16680 65 4e 61 6d 65 73 28 26 73 4e 43 2c 20 70 58 29  eNames(&sNC, pX)
16690 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
166a0 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20   SQLITE_ERROR;. 
166b0 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49     }.  }..  /* I
166c0 66 20 74 68 65 72 65 20 61 72 65 20 6e 6f 20 61  f there are no a
166d0 67 67 72 65 67 61 74 65 20 66 75 6e 63 74 69 6f  ggregate functio
166e0 6e 73 20 69 6e 20 74 68 65 20 72 65 73 75 6c 74  ns in the result
166f0 2d 73 65 74 2c 20 61 6e 64 20 6e 6f 20 47 52 4f  -set, and no GRO
16700 55 50 20 42 59 20 0a 20 20 2a 2a 20 65 78 70 72  UP BY .  ** expr
16710 65 73 73 69 6f 6e 2c 20 64 6f 20 6e 6f 74 20 61  ession, do not a
16720 6c 6c 6f 77 20 61 67 67 72 65 67 61 74 65 73 20  llow aggregates 
16730 69 6e 20 61 6e 79 20 6f 66 20 74 68 65 20 6f 74  in any of the ot
16740 68 65 72 20 65 78 70 72 65 73 73 69 6f 6e 73 2e  her expressions.
16750 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  .  */.  assert( 
16760 21 70 2d 3e 69 73 41 67 67 20 29 3b 0a 20 20 70  !p->isAgg );.  p
16770 47 72 6f 75 70 42 79 20 3d 20 70 2d 3e 70 47 72  GroupBy = p->pGr
16780 6f 75 70 42 79 3b 0a 20 20 69 66 28 20 70 47 72  oupBy;.  if( pGr
16790 6f 75 70 42 79 20 7c 7c 20 73 4e 43 2e 68 61 73  oupBy || sNC.has
167a0 41 67 67 20 29 7b 0a 20 20 20 20 70 2d 3e 69 73  Agg ){.    p->is
167b0 41 67 67 20 3d 20 31 3b 0a 20 20 7d 65 6c 73 65  Agg = 1;.  }else
167c0 7b 0a 20 20 20 20 73 4e 43 2e 61 6c 6c 6f 77 41  {.    sNC.allowA
167d0 67 67 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f  gg = 0;.  }..  /
167e0 2a 20 49 66 20 61 20 48 41 56 49 4e 47 20 63 6c  * If a HAVING cl
167f0 61 75 73 65 20 69 73 20 70 72 65 73 65 6e 74 2c  ause is present,
16800 20 74 68 65 6e 20 74 68 65 72 65 20 6d 75 73 74   then there must
16810 20 62 65 20 61 20 47 52 4f 55 50 20 42 59 20 63   be a GROUP BY c
16820 6c 61 75 73 65 2e 0a 20 20 2a 2f 0a 20 20 69 66  lause..  */.  if
16830 28 20 70 2d 3e 70 48 61 76 69 6e 67 20 26 26 20  ( p->pHaving && 
16840 21 70 47 72 6f 75 70 42 79 20 29 7b 0a 20 20 20  !pGroupBy ){.   
16850 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
16860 28 70 50 61 72 73 65 2c 20 22 61 20 47 52 4f 55  (pParse, "a GROU
16870 50 20 42 59 20 63 6c 61 75 73 65 20 69 73 20 72  P BY clause is r
16880 65 71 75 69 72 65 64 20 62 65 66 6f 72 65 20 48  equired before H
16890 41 56 49 4e 47 22 29 3b 0a 20 20 20 20 72 65 74  AVING");.    ret
168a0 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52  urn SQLITE_ERROR
168b0 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 64 64 20  ;.  }..  /* Add 
168c0 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 6c  the expression l
168d0 69 73 74 20 74 6f 20 74 68 65 20 6e 61 6d 65 2d  ist to the name-
168e0 63 6f 6e 74 65 78 74 20 62 65 66 6f 72 65 20 70  context before p
168f0 61 72 73 69 6e 67 20 74 68 65 0a 20 20 2a 2a 20  arsing the.  ** 
16900 6f 74 68 65 72 20 65 78 70 72 65 73 73 69 6f 6e  other expression
16910 73 20 69 6e 20 74 68 65 20 53 45 4c 45 43 54 20  s in the SELECT 
16920 73 74 61 74 65 6d 65 6e 74 2e 20 54 68 69 73 20  statement. This 
16930 69 73 20 73 6f 20 74 68 61 74 0a 20 20 2a 2a 20  is so that.  ** 
16940 65 78 70 72 65 73 73 69 6f 6e 73 20 69 6e 20 74  expressions in t
16950 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  he WHERE clause 
16960 28 65 74 63 2e 29 20 63 61 6e 20 72 65 66 65 72  (etc.) can refer
16970 20 74 6f 20 65 78 70 72 65 73 73 69 6f 6e 73 20   to expressions 
16980 62 79 0a 20 20 2a 2a 20 61 6c 69 61 73 65 73 20  by.  ** aliases 
16990 69 6e 20 74 68 65 20 72 65 73 75 6c 74 20 73 65  in the result se
169a0 74 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 4d 69 6e  t..  **.  ** Min
169b0 6f 72 20 70 6f 69 6e 74 3a 20 49 66 20 74 68 69  or point: If thi
169c0 73 20 69 73 20 74 68 65 20 63 61 73 65 2c 20 74  s is the case, t
169d0 68 65 6e 20 74 68 65 20 65 78 70 72 65 73 73 69  hen the expressi
169e0 6f 6e 20 77 69 6c 6c 20 62 65 0a 20 20 2a 2a 20  on will be.  ** 
169f0 72 65 2d 65 76 61 6c 75 61 74 65 64 20 66 6f 72  re-evaluated for
16a00 20 65 61 63 68 20 72 65 66 65 72 65 6e 63 65 20   each reference 
16a10 74 6f 20 69 74 2e 0a 20 20 2a 2f 0a 20 20 73 4e  to it..  */.  sN
16a20 43 2e 70 45 4c 69 73 74 20 3d 20 70 2d 3e 70 45  C.pEList = p->pE
16a30 4c 69 73 74 3b 0a 20 20 69 66 28 20 73 71 6c 69  List;.  if( sqli
16a40 74 65 33 45 78 70 72 52 65 73 6f 6c 76 65 4e 61  te3ExprResolveNa
16a50 6d 65 73 28 26 73 4e 43 2c 20 70 2d 3e 70 57 68  mes(&sNC, p->pWh
16a60 65 72 65 29 20 7c 7c 0a 20 20 20 20 20 73 71 6c  ere) ||.     sql
16a70 69 74 65 33 45 78 70 72 52 65 73 6f 6c 76 65 4e  ite3ExprResolveN
16a80 61 6d 65 73 28 26 73 4e 43 2c 20 70 2d 3e 70 48  ames(&sNC, p->pH
16a90 61 76 69 6e 67 29 20 29 7b 0a 20 20 20 20 72 65  aving) ){.    re
16aa0 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f  turn SQLITE_ERRO
16ab0 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e  R;.  }.  if( p->
16ac0 70 50 72 69 6f 72 3d 3d 30 20 29 7b 0a 20 20 20  pPrior==0 ){.   
16ad0 20 69 66 28 20 70 72 6f 63 65 73 73 4f 72 64 65   if( processOrde
16ae0 72 47 72 6f 75 70 42 79 28 70 50 61 72 73 65 2c  rGroupBy(pParse,
16af0 20 70 2c 20 70 2d 3e 70 4f 72 64 65 72 42 79 2c   p, p->pOrderBy,
16b00 20 31 2c 20 26 73 4e 43 2e 68 61 73 41 67 67 29   1, &sNC.hasAgg)
16b10 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
16b20 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20   SQLITE_ERROR;. 
16b30 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 70     }.  }.  if( p
16b40 72 6f 63 65 73 73 4f 72 64 65 72 47 72 6f 75 70  rocessOrderGroup
16b50 42 79 28 70 50 61 72 73 65 2c 20 70 2c 20 70 47  By(pParse, p, pG
16b60 72 6f 75 70 42 79 2c 20 30 2c 20 26 73 4e 43 2e  roupBy, 0, &sNC.
16b70 68 61 73 41 67 67 29 20 29 7b 0a 20 20 20 20 72  hasAgg) ){.    r
16b80 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52  eturn SQLITE_ERR
16b90 4f 52 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70  OR;.  }..  if( p
16ba0 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f  Parse->db->mallo
16bb0 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 72  cFailed ){.    r
16bc0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d  eturn SQLITE_NOM
16bd0 45 4d 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61  EM;.  }..  /* Ma
16be0 6b 65 20 73 75 72 65 20 74 68 65 20 47 52 4f 55  ke sure the GROU
16bf0 50 20 42 59 20 63 6c 61 75 73 65 20 64 6f 65 73  P BY clause does
16c00 20 6e 6f 74 20 63 6f 6e 74 61 69 6e 20 61 67 67   not contain agg
16c10 72 65 67 61 74 65 20 66 75 6e 63 74 69 6f 6e 73  regate functions
16c20 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 47 72  ..  */.  if( pGr
16c30 6f 75 70 42 79 20 29 7b 0a 20 20 20 20 73 74 72  oupBy ){.    str
16c40 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65  uct ExprList_ite
16c50 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 0a 20 20 20  m *pItem;.  .   
16c60 20 66 6f 72 28 69 3d 30 2c 20 70 49 74 65 6d 3d   for(i=0, pItem=
16c70 70 47 72 6f 75 70 42 79 2d 3e 61 3b 20 69 3c 70  pGroupBy->a; i<p
16c80 47 72 6f 75 70 42 79 2d 3e 6e 45 78 70 72 3b 20  GroupBy->nExpr; 
16c90 69 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20  i++, pItem++){. 
16ca0 20 20 20 20 20 69 66 28 20 45 78 70 72 48 61 73       if( ExprHas
16cb0 50 72 6f 70 65 72 74 79 28 70 49 74 65 6d 2d 3e  Property(pItem->
16cc0 70 45 78 70 72 2c 20 45 50 5f 41 67 67 29 20 29  pExpr, EP_Agg) )
16cd0 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
16ce0 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
16cf0 2c 20 22 61 67 67 72 65 67 61 74 65 20 66 75 6e  , "aggregate fun
16d00 63 74 69 6f 6e 73 20 61 72 65 20 6e 6f 74 20 61  ctions are not a
16d10 6c 6c 6f 77 65 64 20 69 6e 20 22 0a 20 20 20 20  llowed in ".    
16d20 20 20 20 20 20 20 20 20 22 74 68 65 20 47 52 4f          "the GRO
16d30 55 50 20 42 59 20 63 6c 61 75 73 65 22 29 3b 0a  UP BY clause");.
16d40 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53          return S
16d50 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20  QLITE_ERROR;.   
16d60 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a     }.    }.  }..
16d70 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20    /* If this is 
16d80 6f 6e 65 20 53 45 4c 45 43 54 20 6f 66 20 61 20  one SELECT of a 
16d90 63 6f 6d 70 6f 75 6e 64 2c 20 62 65 20 73 75 72  compound, be sur
16da0 65 20 74 6f 20 72 65 73 6f 6c 76 65 20 6e 61 6d  e to resolve nam
16db0 65 73 0a 20 20 2a 2a 20 69 6e 20 74 68 65 20 6f  es.  ** in the o
16dc0 74 68 65 72 20 53 45 4c 45 43 54 73 2e 0a 20 20  ther SELECTs..  
16dd0 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 70 50 72 69  */.  if( p->pPri
16de0 6f 72 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  or ){.    return
16df0 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 52 65   sqlite3SelectRe
16e00 73 6f 6c 76 65 28 70 50 61 72 73 65 2c 20 70 2d  solve(pParse, p-
16e10 3e 70 50 72 69 6f 72 2c 20 70 4f 75 74 65 72 4e  >pPrior, pOuterN
16e20 43 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  C);.  }else{.   
16e30 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
16e40 4b 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  K;.  }.}../*.** 
16e50 52 65 73 65 74 20 74 68 65 20 61 67 67 72 65 67  Reset the aggreg
16e60 61 74 65 20 61 63 63 75 6d 75 6c 61 74 6f 72 2e  ate accumulator.
16e70 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 67 67 72 65  .**.** The aggre
16e80 67 61 74 65 20 61 63 63 75 6d 75 6c 61 74 6f 72  gate accumulator
16e90 20 69 73 20 61 20 73 65 74 20 6f 66 20 6d 65 6d   is a set of mem
16ea0 6f 72 79 20 63 65 6c 6c 73 20 74 68 61 74 20 68  ory cells that h
16eb0 6f 6c 64 0a 2a 2a 20 69 6e 74 65 72 6d 65 64 69  old.** intermedi
16ec0 61 74 65 20 72 65 73 75 6c 74 73 20 77 68 69 6c  ate results whil
16ed0 65 20 63 61 6c 63 75 6c 61 74 69 6e 67 20 61 6e  e calculating an
16ee0 20 61 67 67 72 65 67 61 74 65 2e 20 20 54 68 69   aggregate.  Thi
16ef0 73 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 73 69 6d  s.** routine sim
16f00 70 6c 79 20 73 74 6f 72 65 73 20 4e 55 4c 4c 73  ply stores NULLs
16f10 20 69 6e 20 61 6c 6c 20 6f 66 20 74 68 6f 73 65   in all of those
16f20 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 73 2e 0a 2a   memory cells..*
16f30 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72 65  /.static void re
16f40 73 65 74 41 63 63 75 6d 75 6c 61 74 6f 72 28 50  setAccumulator(P
16f50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 41 67  arse *pParse, Ag
16f60 67 49 6e 66 6f 20 2a 70 41 67 67 49 6e 66 6f 29  gInfo *pAggInfo)
16f70 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50  {.  Vdbe *v = pP
16f80 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69  arse->pVdbe;.  i
16f90 6e 74 20 69 3b 0a 20 20 73 74 72 75 63 74 20 41  nt i;.  struct A
16fa0 67 67 49 6e 66 6f 5f 66 75 6e 63 20 2a 70 46 75  ggInfo_func *pFu
16fb0 6e 63 3b 0a 20 20 69 66 28 20 70 41 67 67 49 6e  nc;.  if( pAggIn
16fc0 66 6f 2d 3e 6e 46 75 6e 63 2b 70 41 67 67 49 6e  fo->nFunc+pAggIn
16fd0 66 6f 2d 3e 6e 43 6f 6c 75 6d 6e 3d 3d 30 20 29  fo->nColumn==0 )
16fe0 7b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20  {.    return;.  
16ff0 7d 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70  }.  for(i=0; i<p
17000 41 67 67 49 6e 66 6f 2d 3e 6e 43 6f 6c 75 6d 6e  AggInfo->nColumn
17010 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69  ; i++){.    sqli
17020 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
17030 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20 70 41 67   OP_Null, 0, pAg
17040 67 49 6e 66 6f 2d 3e 61 43 6f 6c 5b 69 5d 2e 69  gInfo->aCol[i].i
17050 4d 65 6d 29 3b 0a 20 20 7d 0a 20 20 66 6f 72 28  Mem);.  }.  for(
17060 70 46 75 6e 63 3d 70 41 67 67 49 6e 66 6f 2d 3e  pFunc=pAggInfo->
17070 61 46 75 6e 63 2c 20 69 3d 30 3b 20 69 3c 70 41  aFunc, i=0; i<pA
17080 67 67 49 6e 66 6f 2d 3e 6e 46 75 6e 63 3b 20 69  ggInfo->nFunc; i
17090 2b 2b 2c 20 70 46 75 6e 63 2b 2b 29 7b 0a 20 20  ++, pFunc++){.  
170a0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
170b0 4f 70 32 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20  Op2(v, OP_Null, 
170c0 30 2c 20 70 46 75 6e 63 2d 3e 69 4d 65 6d 29 3b  0, pFunc->iMem);
170d0 0a 20 20 20 20 69 66 28 20 70 46 75 6e 63 2d 3e  .    if( pFunc->
170e0 69 44 69 73 74 69 6e 63 74 3e 3d 30 20 29 7b 0a  iDistinct>=0 ){.
170f0 20 20 20 20 20 20 45 78 70 72 20 2a 70 45 20 3d        Expr *pE =
17100 20 70 46 75 6e 63 2d 3e 70 45 78 70 72 3b 0a 20   pFunc->pExpr;. 
17110 20 20 20 20 20 69 66 28 20 70 45 2d 3e 70 4c 69       if( pE->pLi
17120 73 74 3d 3d 30 20 7c 7c 20 70 45 2d 3e 70 4c 69  st==0 || pE->pLi
17130 73 74 2d 3e 6e 45 78 70 72 21 3d 31 20 29 7b 0a  st->nExpr!=1 ){.
17140 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
17150 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
17160 22 44 49 53 54 49 4e 43 54 20 69 6e 20 61 67 67  "DISTINCT in agg
17170 72 65 67 61 74 65 20 6d 75 73 74 20 62 65 20 66  regate must be f
17180 6f 6c 6c 6f 77 65 64 20 22 0a 20 20 20 20 20 20  ollowed ".      
17190 20 20 20 20 20 22 62 79 20 61 6e 20 65 78 70 72       "by an expr
171a0 65 73 73 69 6f 6e 22 29 3b 0a 20 20 20 20 20 20  ession");.      
171b0 20 20 70 46 75 6e 63 2d 3e 69 44 69 73 74 69 6e    pFunc->iDistin
171c0 63 74 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 7d  ct = -1;.      }
171d0 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 4b 65  else{.        Ke
171e0 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 20  yInfo *pKeyInfo 
171f0 3d 20 6b 65 79 49 6e 66 6f 46 72 6f 6d 45 78 70  = keyInfoFromExp
17200 72 4c 69 73 74 28 70 50 61 72 73 65 2c 20 70 45  rList(pParse, pE
17210 2d 3e 70 4c 69 73 74 29 3b 0a 20 20 20 20 20 20  ->pList);.      
17220 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
17230 4f 70 34 28 76 2c 20 4f 50 5f 4f 70 65 6e 45 70  Op4(v, OP_OpenEp
17240 68 65 6d 65 72 61 6c 2c 20 70 46 75 6e 63 2d 3e  hemeral, pFunc->
17250 69 44 69 73 74 69 6e 63 74 2c 20 30 2c 20 30 2c  iDistinct, 0, 0,
17260 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
17270 20 20 20 20 20 20 20 20 20 20 20 28 63 68 61 72             (char
17280 2a 29 70 4b 65 79 49 6e 66 6f 2c 20 50 34 5f 4b  *)pKeyInfo, P4_K
17290 45 59 49 4e 46 4f 5f 48 41 4e 44 4f 46 46 29 3b  EYINFO_HANDOFF);
172a0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
172b0 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 76 6f   }.}../*.** Invo
172c0 6b 65 20 74 68 65 20 4f 50 5f 41 67 67 46 69 6e  ke the OP_AggFin
172d0 61 6c 69 7a 65 20 6f 70 63 6f 64 65 20 66 6f 72  alize opcode for
172e0 20 65 76 65 72 79 20 61 67 67 72 65 67 61 74 65   every aggregate
172f0 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 69 6e 20   function.** in 
17300 74 68 65 20 41 67 67 49 6e 66 6f 20 73 74 72 75  the AggInfo stru
17310 63 74 75 72 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  cture..*/.static
17320 20 76 6f 69 64 20 66 69 6e 61 6c 69 7a 65 41 67   void finalizeAg
17330 67 46 75 6e 63 74 69 6f 6e 73 28 50 61 72 73 65  gFunctions(Parse
17340 20 2a 70 50 61 72 73 65 2c 20 41 67 67 49 6e 66   *pParse, AggInf
17350 6f 20 2a 70 41 67 67 49 6e 66 6f 29 7b 0a 20 20  o *pAggInfo){.  
17360 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65  Vdbe *v = pParse
17370 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74 20 69  ->pVdbe;.  int i
17380 3b 0a 20 20 73 74 72 75 63 74 20 41 67 67 49 6e  ;.  struct AggIn
17390 66 6f 5f 66 75 6e 63 20 2a 70 46 3b 0a 20 20 66  fo_func *pF;.  f
173a0 6f 72 28 69 3d 30 2c 20 70 46 3d 70 41 67 67 49  or(i=0, pF=pAggI
173b0 6e 66 6f 2d 3e 61 46 75 6e 63 3b 20 69 3c 70 41  nfo->aFunc; i<pA
173c0 67 67 49 6e 66 6f 2d 3e 6e 46 75 6e 63 3b 20 69  ggInfo->nFunc; i
173d0 2b 2b 2c 20 70 46 2b 2b 29 7b 0a 20 20 20 20 45  ++, pF++){.    E
173e0 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 20 3d  xprList *pList =
173f0 20 70 46 2d 3e 70 45 78 70 72 2d 3e 70 4c 69 73   pF->pExpr->pLis
17400 74 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  t;.    sqlite3Vd
17410 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 41  beAddOp4(v, OP_A
17420 67 67 46 69 6e 61 6c 2c 20 70 46 2d 3e 69 4d 65  ggFinal, pF->iMe
17430 6d 2c 20 70 4c 69 73 74 20 3f 20 70 4c 69 73 74  m, pList ? pList
17440 2d 3e 6e 45 78 70 72 20 3a 20 30 2c 20 30 2c 0a  ->nExpr : 0, 0,.
17450 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17460 20 20 20 20 20 20 28 76 6f 69 64 2a 29 70 46 2d        (void*)pF-
17470 3e 70 46 75 6e 63 2c 20 50 34 5f 46 55 4e 43 44  >pFunc, P4_FUNCD
17480 45 46 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  EF);.  }.}../*.*
17490 2a 20 55 70 64 61 74 65 20 74 68 65 20 61 63 63  * Update the acc
174a0 75 6d 75 6c 61 74 6f 72 20 6d 65 6d 6f 72 79 20  umulator memory 
174b0 63 65 6c 6c 73 20 66 6f 72 20 61 6e 20 61 67 67  cells for an agg
174c0 72 65 67 61 74 65 20 62 61 73 65 64 20 6f 6e 0a  regate based on.
174d0 2a 2a 20 74 68 65 20 63 75 72 72 65 6e 74 20 63  ** the current c
174e0 75 72 73 6f 72 20 70 6f 73 69 74 69 6f 6e 2e 0a  ursor position..
174f0 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 75  */.static void u
17500 70 64 61 74 65 41 63 63 75 6d 75 6c 61 74 6f 72  pdateAccumulator
17510 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
17520 41 67 67 49 6e 66 6f 20 2a 70 41 67 67 49 6e 66  AggInfo *pAggInf
17530 6f 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20  o){.  Vdbe *v = 
17540 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20  pParse->pVdbe;. 
17550 20 69 6e 74 20 69 3b 0a 20 20 73 74 72 75 63 74   int i;.  struct
17560 20 41 67 67 49 6e 66 6f 5f 66 75 6e 63 20 2a 70   AggInfo_func *p
17570 46 3b 0a 20 20 73 74 72 75 63 74 20 41 67 67 49  F;.  struct AggI
17580 6e 66 6f 5f 63 6f 6c 20 2a 70 43 3b 0a 0a 20 20  nfo_col *pC;..  
17590 70 41 67 67 49 6e 66 6f 2d 3e 64 69 72 65 63 74  pAggInfo->direct
175a0 4d 6f 64 65 20 3d 20 31 3b 0a 20 20 66 6f 72 28  Mode = 1;.  for(
175b0 69 3d 30 2c 20 70 46 3d 70 41 67 67 49 6e 66 6f  i=0, pF=pAggInfo
175c0 2d 3e 61 46 75 6e 63 3b 20 69 3c 70 41 67 67 49  ->aFunc; i<pAggI
175d0 6e 66 6f 2d 3e 6e 46 75 6e 63 3b 20 69 2b 2b 2c  nfo->nFunc; i++,
175e0 20 70 46 2b 2b 29 7b 0a 20 20 20 20 69 6e 74 20   pF++){.    int 
175f0 6e 41 72 67 3b 0a 20 20 20 20 69 6e 74 20 61 64  nArg;.    int ad
17600 64 72 4e 65 78 74 20 3d 20 30 3b 0a 20 20 20 20  drNext = 0;.    
17610 69 6e 74 20 72 65 67 41 67 67 3b 0a 20 20 20 20  int regAgg;.    
17620 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 20  ExprList *pList 
17630 3d 20 70 46 2d 3e 70 45 78 70 72 2d 3e 70 4c 69  = pF->pExpr->pLi
17640 73 74 3b 0a 20 20 20 20 69 66 28 20 70 4c 69 73  st;.    if( pLis
17650 74 20 29 7b 0a 20 20 20 20 20 20 6e 41 72 67 20  t ){.      nArg 
17660 3d 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 0a  = pList->nExpr;.
17670 20 20 20 20 20 20 72 65 67 41 67 67 20 3d 20 73        regAgg = s
17680 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 61 6e  qlite3GetTempRan
17690 67 65 28 70 50 61 72 73 65 2c 20 6e 41 72 67 29  ge(pParse, nArg)
176a0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  ;.      sqlite3E
176b0 78 70 72 43 6f 64 65 45 78 70 72 4c 69 73 74 28  xprCodeExprList(
176c0 70 50 61 72 73 65 2c 20 70 4c 69 73 74 2c 20 72  pParse, pList, r
176d0 65 67 41 67 67 29 3b 0a 20 20 20 20 7d 65 6c 73  egAgg);.    }els
176e0 65 7b 0a 20 20 20 20 20 20 6e 41 72 67 20 3d 20  e{.      nArg = 
176f0 30 3b 0a 20 20 20 20 20 20 72 65 67 41 67 67 20  0;.      regAgg 
17700 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  = 0;.    }.    i
17710 66 28 20 70 46 2d 3e 69 44 69 73 74 69 6e 63 74  f( pF->iDistinct
17720 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 61 64 64  >=0 ){.      add
17730 72 4e 65 78 74 20 3d 20 73 71 6c 69 74 65 33 56  rNext = sqlite3V
17740 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b  dbeMakeLabel(v);
17750 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6e  .      assert( n
17760 41 72 67 3d 3d 31 20 29 3b 0a 20 20 20 20 20 20  Arg==1 );.      
17770 63 6f 64 65 44 69 73 74 69 6e 63 74 28 70 50 61  codeDistinct(pPa
17780 72 73 65 2c 20 70 46 2d 3e 69 44 69 73 74 69 6e  rse, pF->iDistin
17790 63 74 2c 20 61 64 64 72 4e 65 78 74 2c 20 31 2c  ct, addrNext, 1,
177a0 20 72 65 67 41 67 67 29 3b 0a 20 20 20 20 7d 0a   regAgg);.    }.
177b0 20 20 20 20 69 66 28 20 70 46 2d 3e 70 46 75 6e      if( pF->pFun
177c0 63 2d 3e 6e 65 65 64 43 6f 6c 6c 53 65 71 20 29  c->needCollSeq )
177d0 7b 0a 20 20 20 20 20 20 43 6f 6c 6c 53 65 71 20  {.      CollSeq 
177e0 2a 70 43 6f 6c 6c 20 3d 20 30 3b 0a 20 20 20 20  *pColl = 0;.    
177f0 20 20 73 74 72 75 63 74 20 45 78 70 72 4c 69 73    struct ExprLis
17800 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20  t_item *pItem;. 
17810 20 20 20 20 20 69 6e 74 20 6a 3b 0a 20 20 20 20       int j;.    
17820 20 20 61 73 73 65 72 74 28 20 70 4c 69 73 74 21    assert( pList!
17830 3d 30 20 29 3b 20 20 2f 2a 20 70 4c 69 73 74 21  =0 );  /* pList!
17840 3d 30 20 69 66 20 70 46 2d 3e 70 46 75 6e 63 2d  =0 if pF->pFunc-
17850 3e 6e 65 65 64 43 6f 6c 6c 53 65 71 20 69 73 20  >needCollSeq is 
17860 74 72 75 65 20 2a 2f 0a 20 20 20 20 20 20 66 6f  true */.      fo
17870 72 28 6a 3d 30 2c 20 70 49 74 65 6d 3d 70 4c 69  r(j=0, pItem=pLi
17880 73 74 2d 3e 61 3b 20 21 70 43 6f 6c 6c 20 26 26  st->a; !pColl &&
17890 20 6a 3c 6e 41 72 67 3b 20 6a 2b 2b 2c 20 70 49   j<nArg; j++, pI
178a0 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  tem++){.        
178b0 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 45  pColl = sqlite3E
178c0 78 70 72 43 6f 6c 6c 53 65 71 28 70 50 61 72 73  xprCollSeq(pPars
178d0 65 2c 20 70 49 74 65 6d 2d 3e 70 45 78 70 72 29  e, pItem->pExpr)
178e0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
178f0 69 66 28 20 21 70 43 6f 6c 6c 20 29 7b 0a 20 20  if( !pColl ){.  
17900 20 20 20 20 20 20 70 43 6f 6c 6c 20 3d 20 70 50        pColl = pP
17910 61 72 73 65 2d 3e 64 62 2d 3e 70 44 66 6c 74 43  arse->db->pDfltC
17920 6f 6c 6c 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  oll;.      }.   
17930 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
17940 64 4f 70 34 28 76 2c 20 4f 50 5f 43 6f 6c 6c 53  dOp4(v, OP_CollS
17950 65 71 2c 20 30 2c 20 30 2c 20 30 2c 20 28 63 68  eq, 0, 0, 0, (ch
17960 61 72 20 2a 29 70 43 6f 6c 6c 2c 20 50 34 5f 43  ar *)pColl, P4_C
17970 4f 4c 4c 53 45 51 29 3b 0a 20 20 20 20 7d 0a 20  OLLSEQ);.    }. 
17980 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
17990 64 4f 70 34 28 76 2c 20 4f 50 5f 41 67 67 53 74  dOp4(v, OP_AggSt
179a0 65 70 2c 20 30 2c 20 72 65 67 41 67 67 2c 20 70  ep, 0, regAgg, p
179b0 46 2d 3e 69 4d 65 6d 2c 0a 20 20 20 20 20 20 20  F->iMem,.       
179c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28                 (
179d0 76 6f 69 64 2a 29 70 46 2d 3e 70 46 75 6e 63 2c  void*)pF->pFunc,
179e0 20 50 34 5f 46 55 4e 43 44 45 46 29 3b 0a 20 20   P4_FUNCDEF);.  
179f0 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61    sqlite3VdbeCha
17a00 6e 67 65 50 35 28 76 2c 20 6e 41 72 67 29 3b 0a  ngeP5(v, nArg);.
17a10 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61      sqlite3Relea
17a20 73 65 54 65 6d 70 52 61 6e 67 65 28 70 50 61 72  seTempRange(pPar
17a30 73 65 2c 20 72 65 67 41 67 67 2c 20 6e 41 72 67  se, regAgg, nArg
17a40 29 3b 0a 20 20 20 20 69 66 28 20 61 64 64 72 4e  );.    if( addrN
17a50 65 78 74 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  ext ){.      sql
17a60 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c  ite3VdbeResolveL
17a70 61 62 65 6c 28 76 2c 20 61 64 64 72 4e 65 78 74  abel(v, addrNext
17a80 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 66  );.    }.  }.  f
17a90 6f 72 28 69 3d 30 2c 20 70 43 3d 70 41 67 67 49  or(i=0, pC=pAggI
17aa0 6e 66 6f 2d 3e 61 43 6f 6c 3b 20 69 3c 70 41 67  nfo->aCol; i<pAg
17ab0 67 49 6e 66 6f 2d 3e 6e 41 63 63 75 6d 75 6c 61  gInfo->nAccumula
17ac0 74 6f 72 3b 20 69 2b 2b 2c 20 70 43 2b 2b 29 7b  tor; i++, pC++){
17ad0 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72  .    sqlite3Expr
17ae0 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70 43 2d  Code(pParse, pC-
17af0 3e 70 45 78 70 72 2c 20 70 43 2d 3e 69 4d 65 6d  >pExpr, pC->iMem
17b00 29 3b 0a 20 20 7d 0a 20 20 70 41 67 67 49 6e 66  );.  }.  pAggInf
17b10 6f 2d 3e 64 69 72 65 63 74 4d 6f 64 65 20 3d 20  o->directMode = 
17b20 30 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51  0;.}..#ifndef SQ
17b30 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 49 47 47 45  LITE_OMIT_TRIGGE
17b40 52 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  R./*.** This fun
17b50 63 74 69 6f 6e 20 69 73 20 75 73 65 64 20 77 68  ction is used wh
17b60 65 6e 20 61 20 53 45 4c 45 43 54 20 73 74 61 74  en a SELECT stat
17b70 65 6d 65 6e 74 20 69 73 20 75 73 65 64 20 74 6f  ement is used to
17b80 20 63 72 65 61 74 65 20 61 0a 2a 2a 20 74 65 6d   create a.** tem
17b90 70 6f 72 61 72 79 20 74 61 62 6c 65 20 66 6f 72  porary table for
17ba0 20 69 74 65 72 61 74 69 6e 67 20 74 68 72 6f 75   iterating throu
17bb0 67 68 20 77 68 65 6e 20 72 75 6e 6e 69 6e 67 20  gh when running 
17bc0 61 6e 20 49 4e 53 54 45 41 44 20 4f 46 0a 2a 2a  an INSTEAD OF.**
17bd0 20 55 50 44 41 54 45 20 6f 72 20 49 4e 53 54 45   UPDATE or INSTE
17be0 41 44 20 4f 46 20 44 45 4c 45 54 45 20 74 72 69  AD OF DELETE tri
17bf0 67 67 65 72 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20  gger. .**.** If 
17c00 70 6f 73 73 69 62 6c 65 2c 20 74 68 65 20 53 45  possible, the SE
17c10 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 69  LECT statement i
17c20 73 20 6d 6f 64 69 66 69 65 64 20 73 6f 20 74 68  s modified so th
17c30 61 74 20 4e 55 4c 4c 20 76 61 6c 75 65 73 0a 2a  at NULL values.*
17c40 2a 20 61 72 65 20 73 74 6f 72 65 64 20 69 6e 20  * are stored in 
17c50 74 68 65 20 74 65 6d 70 6f 72 61 72 79 20 74 61  the temporary ta
17c60 62 6c 65 20 66 6f 72 20 61 6c 6c 20 63 6f 6c 75  ble for all colu
17c70 6d 6e 73 20 66 6f 72 20 77 68 69 63 68 20 74 68  mns for which th
17c80 65 20 0a 2a 2a 20 63 6f 72 72 65 73 70 6f 6e 64  e .** correspond
17c90 69 6e 67 20 62 69 74 20 69 6e 20 61 72 67 75 6d  ing bit in argum
17ca0 65 6e 74 20 6d 61 73 6b 20 69 73 20 6e 6f 74 20  ent mask is not 
17cb0 73 65 74 2e 20 49 66 20 6d 61 73 6b 20 74 61 6b  set. If mask tak
17cc0 65 73 20 74 68 65 0a 2a 2a 20 73 70 65 63 69 61  es the.** specia
17cd0 6c 20 76 61 6c 75 65 20 30 78 66 66 66 66 66 66  l value 0xffffff
17ce0 66 66 2c 20 74 68 65 6e 20 61 6c 6c 20 63 6f 6c  ff, then all col
17cf0 75 6d 6e 73 20 61 72 65 20 70 6f 70 75 6c 61 74  umns are populat
17d00 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  ed..*/.void sqli
17d10 74 65 33 53 65 6c 65 63 74 4d 61 73 6b 28 50 61  te3SelectMask(Pa
17d20 72 73 65 20 2a 70 50 61 72 73 65 2c 20 53 65 6c  rse *pParse, Sel
17d30 65 63 74 20 2a 70 2c 20 75 33 32 20 6d 61 73 6b  ect *p, u32 mask
17d40 29 7b 0a 20 20 69 66 28 20 70 20 26 26 20 21 70  ){.  if( p && !p
17d50 2d 3e 70 50 72 69 6f 72 20 26 26 20 21 70 2d 3e  ->pPrior && !p->
17d60 69 73 44 69 73 74 69 6e 63 74 20 26 26 20 6d 61  isDistinct && ma
17d70 73 6b 21 3d 30 78 66 66 66 66 66 66 66 66 20 29  sk!=0xffffffff )
17d80 7b 0a 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a  {.    ExprList *
17d90 70 45 4c 69 73 74 3b 0a 20 20 20 20 69 6e 74 20  pEList;.    int 
17da0 69 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 53 65  i;.    sqlite3Se
17db0 6c 65 63 74 52 65 73 6f 6c 76 65 28 70 50 61 72  lectResolve(pPar
17dc0 73 65 2c 20 70 2c 20 30 29 3b 0a 20 20 20 20 70  se, p, 0);.    p
17dd0 45 4c 69 73 74 20 3d 20 70 2d 3e 70 45 4c 69 73  EList = p->pELis
17de0 74 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  t;.    for(i=0; 
17df0 70 45 4c 69 73 74 20 26 26 20 69 3c 70 45 4c 69  pEList && i<pELi
17e00 73 74 2d 3e 6e 45 78 70 72 20 26 26 20 69 3c 33  st->nExpr && i<3
17e10 32 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69  2; i++){.      i
17e20 66 28 20 21 28 6d 61 73 6b 26 28 28 75 33 32 29  f( !(mask&((u32)
17e30 31 3c 3c 69 29 29 20 29 7b 0a 20 20 20 20 20 20  1<<i)) ){.      
17e40 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c    sqlite3ExprDel
17e50 65 74 65 28 70 45 4c 69 73 74 2d 3e 61 5b 69 5d  ete(pEList->a[i]
17e60 2e 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20 20  .pExpr);.       
17e70 20 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45   pEList->a[i].pE
17e80 78 70 72 20 3d 20 73 71 6c 69 74 65 33 45 78 70  xpr = sqlite3Exp
17e90 72 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 54 4b  r(pParse->db, TK
17ea0 5f 4e 55 4c 4c 2c 20 30 2c 20 30 2c 20 30 29 3b  _NULL, 0, 0, 0);
17eb0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
17ec0 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a   }.}.#endif../*.
17ed0 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65  ** Generate code
17ee0 20 66 6f 72 20 74 68 65 20 67 69 76 65 6e 20 53   for the given S
17ef0 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 2e  ELECT statement.
17f00 0a 2a 2a 0a 2a 2a 20 54 68 65 20 72 65 73 75 6c  .**.** The resul
17f10 74 73 20 61 72 65 20 64 69 73 74 72 69 62 75 74  ts are distribut
17f20 65 64 20 69 6e 20 76 61 72 69 6f 75 73 20 77 61  ed in various wa
17f30 79 73 20 64 65 70 65 6e 64 69 6e 67 20 6f 6e 20  ys depending on 
17f40 74 68 65 0a 2a 2a 20 63 6f 6e 74 65 6e 74 73 20  the.** contents 
17f50 6f 66 20 74 68 65 20 53 65 6c 65 63 74 44 65 73  of the SelectDes
17f60 74 20 73 74 72 75 63 74 75 72 65 20 70 6f 69 6e  t structure poin
17f70 74 65 64 20 74 6f 20 62 79 20 61 72 67 75 6d 65  ted to by argume
17f80 6e 74 20 70 44 65 73 74 0a 2a 2a 20 61 73 20 66  nt pDest.** as f
17f90 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20  ollows:.**.**   
17fa0 20 20 70 44 65 73 74 2d 3e 65 44 65 73 74 20 20    pDest->eDest  
17fb0 20 20 52 65 73 75 6c 74 0a 2a 2a 20 20 20 20 20    Result.**     
17fc0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 20 20 20 20  ------------    
17fd0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
17fe0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
17ff0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a 20 20  -----------.**  
18000 20 20 20 53 52 54 5f 43 61 6c 6c 62 61 63 6b 20     SRT_Callback 
18010 20 20 20 49 6e 76 6f 6b 65 20 74 68 65 20 63 61     Invoke the ca
18020 6c 6c 62 61 63 6b 20 66 6f 72 20 65 61 63 68 20  llback for each 
18030 72 6f 77 20 6f 66 20 74 68 65 20 72 65 73 75 6c  row of the resul
18040 74 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 52 54  t..**.**     SRT
18050 5f 4d 65 6d 20 20 20 20 20 20 20 20 20 53 74 6f  _Mem         Sto
18060 72 65 20 66 69 72 73 74 20 72 65 73 75 6c 74 20  re first result 
18070 69 6e 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 20 70  in memory cell p
18080 44 65 73 74 2d 3e 69 50 61 72 6d 0a 2a 2a 0a 2a  Dest->iParm.**.*
18090 2a 20 20 20 20 20 53 52 54 5f 53 65 74 20 20 20  *     SRT_Set   
180a0 20 20 20 20 20 20 53 74 6f 72 65 20 6e 6f 6e 2d        Store non-
180b0 6e 75 6c 6c 20 72 65 73 75 6c 74 73 20 61 73 20  null results as 
180c0 6b 65 79 73 20 6f 66 20 74 61 62 6c 65 20 70 44  keys of table pD
180d0 65 73 74 2d 3e 69 50 61 72 6d 2e 20 0a 2a 2a 20  est->iParm. .** 
180e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
180f0 20 20 20 20 41 70 70 6c 79 20 74 68 65 20 61 66      Apply the af
18100 66 69 6e 69 74 79 20 70 44 65 73 74 2d 3e 61 66  finity pDest->af
18110 66 69 6e 69 74 79 20 62 65 66 6f 72 65 20 73 74  finity before st
18120 6f 72 69 6e 67 20 74 68 65 6d 2e 0a 2a 2a 0a 2a  oring them..**.*
18130 2a 20 20 20 20 20 53 52 54 5f 55 6e 69 6f 6e 20  *     SRT_Union 
18140 20 20 20 20 20 20 53 74 6f 72 65 20 72 65 73 75        Store resu
18150 6c 74 73 20 61 73 20 61 20 6b 65 79 20 69 6e 20  lts as a key in 
18160 61 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c  a temporary tabl
18170 65 20 70 44 65 73 74 2d 3e 69 50 61 72 6d 2e 0a  e pDest->iParm..
18180 2a 2a 0a 2a 2a 20 20 20 20 20 53 52 54 5f 45 78  **.**     SRT_Ex
18190 63 65 70 74 20 20 20 20 20 20 52 65 6d 6f 76 65  cept      Remove
181a0 20 72 65 73 75 6c 74 73 20 66 72 6f 6d 20 74 68   results from th
181b0 65 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c  e temporary tabl
181c0 65 20 70 44 65 73 74 2d 3e 69 50 61 72 6d 2e 0a  e pDest->iParm..
181d0 2a 2a 0a 2a 2a 20 20 20 20 20 53 52 54 5f 54 61  **.**     SRT_Ta
181e0 62 6c 65 20 20 20 20 20 20 20 53 74 6f 72 65 20  ble       Store 
181f0 72 65 73 75 6c 74 73 20 69 6e 20 74 65 6d 70 6f  results in tempo
18200 72 61 72 79 20 74 61 62 6c 65 20 70 44 65 73 74  rary table pDest
18210 2d 3e 69 50 61 72 6d 0a 2a 2a 0a 2a 2a 20 20 20  ->iParm.**.**   
18220 20 20 53 52 54 5f 45 70 68 65 6d 54 61 62 20 20    SRT_EphemTab  
18230 20 20 43 72 65 61 74 65 20 61 6e 20 74 65 6d 70    Create an temp
18240 6f 72 61 72 79 20 74 61 62 6c 65 20 70 44 65 73  orary table pDes
18250 74 2d 3e 69 50 61 72 6d 20 61 6e 64 20 73 74 6f  t->iParm and sto
18260 72 65 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  re.**           
18270 20 20 20 20 20 20 20 20 20 20 74 68 65 20 72 65            the re
18280 73 75 6c 74 20 74 68 65 72 65 2e 20 54 68 65 20  sult there. The 
18290 63 75 72 73 6f 72 20 69 73 20 6c 65 66 74 20 6f  cursor is left o
182a0 70 65 6e 20 61 66 74 65 72 0a 2a 2a 20 20 20 20  pen after.**    
182b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
182c0 20 72 65 74 75 72 6e 69 6e 67 2e 0a 2a 2a 0a 2a   returning..**.*
182d0 2a 20 20 20 20 20 53 52 54 5f 53 75 62 72 6f 75  *     SRT_Subrou
182e0 74 69 6e 65 20 20 46 6f 72 20 65 61 63 68 20 72  tine  For each r
182f0 6f 77 20 72 65 74 75 72 6e 65 64 2c 20 70 75 73  ow returned, pus
18300 68 20 74 68 65 20 72 65 73 75 6c 74 73 20 6f 6e  h the results on
18310 74 6f 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 20  to the.**       
18320 20 20 20 20 20 20 20 20 20 20 20 20 20 20 76 64                vd
18330 62 65 20 73 74 61 63 6b 20 61 6e 64 20 63 61 6c  be stack and cal
18340 6c 20 74 68 65 20 73 75 62 72 6f 75 74 69 6e 65  l the subroutine
18350 20 28 76 69 61 20 4f 50 5f 47 6f 73 75 62 29 0a   (via OP_Gosub).
18360 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
18370 20 20 20 20 20 20 20 61 74 20 61 64 64 72 65 73         at addres
18380 73 20 70 44 65 73 74 2d 3e 69 50 61 72 6d 2e 0a  s pDest->iParm..
18390 2a 2a 0a 2a 2a 20 20 20 20 20 53 52 54 5f 45 78  **.**     SRT_Ex
183a0 69 73 74 73 20 20 20 20 20 20 53 74 6f 72 65 20  ists      Store 
183b0 61 20 31 20 69 6e 20 6d 65 6d 6f 72 79 20 63 65  a 1 in memory ce
183c0 6c 6c 20 70 44 65 73 74 2d 3e 69 50 61 72 6d 20  ll pDest->iParm 
183d0 69 66 20 74 68 65 20 72 65 73 75 6c 74 0a 2a 2a  if the result.**
183e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
183f0 20 20 20 20 20 73 65 74 20 69 73 20 6e 6f 74 20       set is not 
18400 65 6d 70 74 79 2e 0a 2a 2a 0a 2a 2a 20 20 20 20  empty..**.**    
18410 20 53 52 54 5f 44 69 73 63 61 72 64 20 20 20 20   SRT_Discard    
18420 20 54 68 72 6f 77 20 74 68 65 20 72 65 73 75 6c   Throw the resul
18430 74 73 20 61 77 61 79 2e 0a 2a 2a 0a 2a 2a 20 53  ts away..**.** S
18440 65 65 20 74 68 65 20 73 65 6c 65 63 74 49 6e 6e  ee the selectInn
18450 65 72 4c 6f 6f 70 28 29 20 66 75 6e 63 74 69 6f  erLoop() functio
18460 6e 20 66 6f 72 20 61 20 63 61 6e 6f 6e 69 63 61  n for a canonica
18470 6c 20 6c 69 73 74 69 6e 67 20 6f 66 20 74 68 65  l listing of the
18480 20 0a 2a 2a 20 61 6c 6c 6f 77 65 64 20 76 61 6c   .** allowed val
18490 75 65 73 20 6f 66 20 65 44 65 73 74 20 61 6e 64  ues of eDest and
184a0 20 74 68 65 69 72 20 6d 65 61 6e 69 6e 67 73 2e   their meanings.
184b0 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
184c0 69 6e 65 20 72 65 74 75 72 6e 73 20 74 68 65 20  ine returns the 
184d0 6e 75 6d 62 65 72 20 6f 66 20 65 72 72 6f 72 73  number of errors
184e0 2e 20 20 49 66 20 61 6e 79 20 65 72 72 6f 72 73  .  If any errors
184f0 20 61 72 65 0a 2a 2a 20 65 6e 63 6f 75 6e 74 65   are.** encounte
18500 72 65 64 2c 20 74 68 65 6e 20 61 6e 20 61 70 70  red, then an app
18510 72 6f 70 72 69 61 74 65 20 65 72 72 6f 72 20 6d  ropriate error m
18520 65 73 73 61 67 65 20 69 73 20 6c 65 66 74 20 69  essage is left i
18530 6e 0a 2a 2a 20 70 50 61 72 73 65 2d 3e 7a 45 72  n.** pParse->zEr
18540 72 4d 73 67 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  rMsg..**.** This
18550 20 72 6f 75 74 69 6e 65 20 64 6f 65 73 20 4e 4f   routine does NO
18560 54 20 66 72 65 65 20 74 68 65 20 53 65 6c 65 63  T free the Selec
18570 74 20 73 74 72 75 63 74 75 72 65 20 70 61 73 73  t structure pass
18580 65 64 20 69 6e 2e 20 20 54 68 65 0a 2a 2a 20 63  ed in.  The.** c
18590 61 6c 6c 69 6e 67 20 66 75 6e 63 74 69 6f 6e 20  alling function 
185a0 6e 65 65 64 73 20 74 6f 20 64 6f 20 74 68 61 74  needs to do that
185b0 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 50 61 72  ..**.** The pPar
185c0 65 6e 74 2c 20 70 61 72 65 6e 74 54 61 62 2c 20  ent, parentTab, 
185d0 61 6e 64 20 2a 70 50 61 72 65 6e 74 41 67 67 20  and *pParentAgg 
185e0 66 69 65 6c 64 73 20 61 72 65 20 66 69 6c 6c 65  fields are fille
185f0 64 20 69 6e 20 69 66 20 74 68 69 73 0a 2a 2a 20  d in if this.** 
18600 53 45 4c 45 43 54 20 69 73 20 61 20 73 75 62 71  SELECT is a subq
18610 75 65 72 79 2e 20 20 54 68 69 73 20 72 6f 75 74  uery.  This rout
18620 69 6e 65 20 6d 61 79 20 74 72 79 20 74 6f 20 63  ine may try to c
18630 6f 6d 62 69 6e 65 20 74 68 69 73 20 53 45 4c 45  ombine this SELE
18640 43 54 0a 2a 2a 20 77 69 74 68 20 69 74 73 20 70  CT.** with its p
18650 61 72 65 6e 74 20 74 6f 20 66 6f 72 6d 20 61 20  arent to form a 
18660 73 69 6e 67 6c 65 20 66 6c 61 74 20 71 75 65 72  single flat quer
18670 79 2e 20 20 49 6e 20 73 6f 20 64 6f 69 6e 67 2c  y.  In so doing,
18680 20 69 74 20 6d 69 67 68 74 0a 2a 2a 20 63 68 61   it might.** cha
18690 6e 67 65 20 74 68 65 20 70 61 72 65 6e 74 20 71  nge the parent q
186a0 75 65 72 79 20 66 72 6f 6d 20 61 20 6e 6f 6e 2d  uery from a non-
186b0 61 67 67 72 65 67 61 74 65 20 74 6f 20 61 6e 20  aggregate to an 
186c0 61 67 67 72 65 67 61 74 65 20 71 75 65 72 79 2e  aggregate query.
186d0 0a 2a 2a 20 46 6f 72 20 74 68 61 74 20 72 65 61  .** For that rea
186e0 73 6f 6e 2c 20 74 68 65 20 70 50 61 72 65 6e 74  son, the pParent
186f0 41 67 67 20 66 6c 61 67 20 69 73 20 70 61 73 73  Agg flag is pass
18700 65 64 20 61 73 20 61 20 70 6f 69 6e 74 65 72 2c  ed as a pointer,
18710 20 73 6f 20 69 74 0a 2a 2a 20 63 61 6e 20 62 65   so it.** can be
18720 20 63 68 61 6e 67 65 64 2e 0a 2a 2a 0a 2a 2a 20   changed..**.** 
18730 45 78 61 6d 70 6c 65 20 31 3a 20 20 20 54 68 65  Example 1:   The
18740 20 6d 65 61 6e 69 6e 67 20 6f 66 20 74 68 65 20   meaning of the 
18750 70 50 61 72 65 6e 74 20 70 61 72 61 6d 65 74 65  pParent paramete
18760 72 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 53 45 4c 45  r..**.**    SELE
18770 43 54 20 2a 20 46 52 4f 4d 20 74 31 20 4a 4f 49  CT * FROM t1 JOI
18780 4e 20 28 53 45 4c 45 43 54 20 78 2c 20 63 6f 75  N (SELECT x, cou
18790 6e 74 28 2a 29 20 46 52 4f 4d 20 74 32 29 20 4a  nt(*) FROM t2) J
187a0 4f 49 4e 20 74 33 3b 0a 2a 2a 20 20 20 20 5c 20  OIN t3;.**    \ 
187b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
187c0 20 20 20 20 20 5c 5f 5f 5f 5f 5f 5f 5f 20 73 75       \_______ su
187d0 62 71 75 65 72 79 20 5f 5f 5f 5f 5f 5f 5f 2f 20  bquery _______/ 
187e0 20 20 20 20 20 20 20 2f 0a 2a 2a 20 20 20 20 20         /.**     
187f0 5c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  \               
18800 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18810 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18820 20 20 20 20 20 20 20 2f 0a 2a 2a 20 20 20 20 20         /.**     
18830 20 5c 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f   \______________
18840 5f 5f 5f 5f 5f 5f 20 6f 75 74 65 72 20 71 75 65  ______ outer que
18850 72 79 20 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f  ry _____________
18860 5f 5f 5f 5f 5f 5f 2f 0a 2a 2a 0a 2a 2a 20 54 68  ______/.**.** Th
18870 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61  is routine is ca
18880 6c 6c 65 64 20 66 6f 72 20 74 68 65 20 6f 75 74  lled for the out
18890 65 72 20 71 75 65 72 79 20 66 69 72 73 74 2e 20  er query first. 
188a0 20 20 46 6f 72 20 74 68 61 74 20 63 61 6c 6c 2c    For that call,
188b0 0a 2a 2a 20 70 50 61 72 65 6e 74 20 77 69 6c 6c  .** pParent will
188c0 20 62 65 20 4e 55 4c 4c 2e 20 20 44 75 72 69 6e   be NULL.  Durin
188d0 67 20 74 68 65 20 70 72 6f 63 65 73 73 69 6e 67  g the processing
188e0 20 6f 66 20 74 68 65 20 6f 75 74 65 72 20 71 75   of the outer qu
188f0 65 72 79 2c 20 74 68 69 73 20 0a 2a 2a 20 72 6f  ery, this .** ro
18900 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20  utine is called 
18910 72 65 63 75 72 73 69 76 65 6c 79 20 74 6f 20 68  recursively to h
18920 61 6e 64 6c 65 20 74 68 65 20 73 75 62 71 75 65  andle the subque
18930 72 79 2e 20 20 46 6f 72 20 74 68 65 20 72 65 63  ry.  For the rec
18940 75 72 73 69 76 65 0a 2a 2a 20 63 61 6c 6c 2c 20  ursive.** call, 
18950 70 50 61 72 65 6e 74 20 77 69 6c 6c 20 70 6f 69  pParent will poi
18960 6e 74 20 74 6f 20 74 68 65 20 6f 75 74 65 72 20  nt to the outer 
18970 71 75 65 72 79 2e 20 20 42 65 63 61 75 73 65 20  query.  Because 
18980 74 68 65 20 73 75 62 71 75 65 72 79 20 69 73 0a  the subquery is.
18990 2a 2a 20 74 68 65 20 73 65 63 6f 6e 64 20 65 6c  ** the second el
189a0 65 6d 65 6e 74 20 69 6e 20 61 20 74 68 72 65 65  ement in a three
189b0 2d 77 61 79 20 6a 6f 69 6e 2c 20 74 68 65 20 70  -way join, the p
189c0 61 72 65 6e 74 54 61 62 20 70 61 72 61 6d 65 74  arentTab paramet
189d0 65 72 20 77 69 6c 6c 0a 2a 2a 20 62 65 20 31 20  er will.** be 1 
189e0 28 74 68 65 20 32 6e 64 20 76 61 6c 75 65 20 6f  (the 2nd value o
189f0 66 20 61 20 30 2d 69 6e 64 65 78 65 64 20 61 72  f a 0-indexed ar
18a00 72 61 79 2e 29 0a 2a 2f 0a 69 6e 74 20 73 71 6c  ray.).*/.int sql
18a10 69 74 65 33 53 65 6c 65 63 74 28 0a 20 20 50 61  ite3Select(.  Pa
18a20 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20  rse *pParse,    
18a30 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61 72 73       /* The pars
18a40 65 72 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  er context */.  
18a50 53 65 6c 65 63 74 20 2a 70 2c 20 20 20 20 20 20  Select *p,      
18a60 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 53 45         /* The SE
18a70 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 62  LECT statement b
18a80 65 69 6e 67 20 63 6f 64 65 64 2e 20 2a 2f 0a 20  eing coded. */. 
18a90 20 53 65 6c 65 63 74 44 65 73 74 20 2a 70 44 65   SelectDest *pDe
18aa0 73 74 2c 20 20 20 20 20 2f 2a 20 57 68 61 74 20  st,     /* What 
18ab0 74 6f 20 64 6f 20 77 69 74 68 20 74 68 65 20 71  to do with the q
18ac0 75 65 72 79 20 72 65 73 75 6c 74 73 20 2a 2f 0a  uery results */.
18ad0 20 20 53 65 6c 65 63 74 20 2a 70 50 61 72 65 6e    Select *pParen
18ae0 74 2c 20 20 20 20 20 20 20 2f 2a 20 41 6e 6f 74  t,       /* Anot
18af0 68 65 72 20 53 45 4c 45 43 54 20 66 6f 72 20 77  her SELECT for w
18b00 68 69 63 68 20 74 68 69 73 20 69 73 20 61 20 73  hich this is a s
18b10 75 62 2d 71 75 65 72 79 20 2a 2f 0a 20 20 69 6e  ub-query */.  in
18b20 74 20 70 61 72 65 6e 74 54 61 62 2c 20 20 20 20  t parentTab,    
18b30 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 69 6e       /* Index in
18b40 20 70 50 61 72 65 6e 74 2d 3e 70 53 72 63 20 6f   pParent->pSrc o
18b50 66 20 74 68 69 73 20 71 75 65 72 79 20 2a 2f 0a  f this query */.
18b60 20 20 69 6e 74 20 2a 70 50 61 72 65 6e 74 41 67    int *pParentAg
18b70 67 2c 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65  g,       /* True
18b80 20 69 66 20 70 50 61 72 65 6e 74 20 75 73 65 73   if pParent uses
18b90 20 61 67 67 72 65 67 61 74 65 20 66 75 6e 63 74   aggregate funct
18ba0 69 6f 6e 73 20 2a 2f 0a 20 20 63 68 61 72 20 2a  ions */.  char *
18bb0 61 66 66 20 20 20 20 20 20 20 20 20 20 20 20 20  aff             
18bc0 20 2f 2a 20 49 66 20 65 44 65 73 74 20 69 73 20   /* If eDest is 
18bd0 53 52 54 5f 55 6e 69 6f 6e 2c 20 74 68 65 20 61  SRT_Union, the a
18be0 66 66 69 6e 69 74 79 20 73 74 72 69 6e 67 20 2a  ffinity string *
18bf0 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b  /.){.  int i, j;
18c00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
18c10 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 73 20 2a   Loop counters *
18c20 2f 0a 20 20 57 68 65 72 65 49 6e 66 6f 20 2a 70  /.  WhereInfo *p
18c30 57 49 6e 66 6f 3b 20 20 20 20 20 2f 2a 20 52 65  WInfo;     /* Re
18c40 74 75 72 6e 20 66 72 6f 6d 20 73 71 6c 69 74 65  turn from sqlite
18c50 33 57 68 65 72 65 42 65 67 69 6e 28 29 20 2a 2f  3WhereBegin() */
18c60 0a 20 20 56 64 62 65 20 2a 76 3b 20 20 20 20 20  .  Vdbe *v;     
18c70 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
18c80 20 76 69 72 74 75 61 6c 20 6d 61 63 68 69 6e 65   virtual machine
18c90 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74   under construct
18ca0 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 69 73 41  ion */.  int isA
18cb0 67 67 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  gg;             
18cc0 2f 2a 20 54 72 75 65 20 66 6f 72 20 73 65 6c 65  /* True for sele
18cd0 63 74 20 6c 69 73 74 73 20 6c 69 6b 65 20 22 63  ct lists like "c
18ce0 6f 75 6e 74 28 2a 29 22 20 2a 2f 0a 20 20 45 78  ount(*)" */.  Ex
18cf0 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 3b 20  prList *pEList; 
18d00 20 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20       /* List of 
18d10 63 6f 6c 75 6d 6e 73 20 74 6f 20 65 78 74 72 61  columns to extra
18d20 63 74 2e 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74  ct. */.  SrcList
18d30 20 2a 70 54 61 62 4c 69 73 74 3b 20 20 20 20 20   *pTabList;     
18d40 2f 2a 20 4c 69 73 74 20 6f 66 20 74 61 62 6c 65  /* List of table
18d50 73 20 74 6f 20 73 65 6c 65 63 74 20 66 72 6f 6d  s to select from
18d60 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 57 68 65   */.  Expr *pWhe
18d70 72 65 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  re;          /* 
18d80 54 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  The WHERE clause
18d90 2e 20 20 4d 61 79 20 62 65 20 4e 55 4c 4c 20 2a  .  May be NULL *
18da0 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4f  /.  ExprList *pO
18db0 72 64 65 72 42 79 3b 20 20 20 20 2f 2a 20 54 68  rderBy;    /* Th
18dc0 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73  e ORDER BY claus
18dd0 65 2e 20 20 4d 61 79 20 62 65 20 4e 55 4c 4c 20  e.  May be NULL 
18de0 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70  */.  ExprList *p
18df0 47 72 6f 75 70 42 79 3b 20 20 20 20 2f 2a 20 54  GroupBy;    /* T
18e00 68 65 20 47 52 4f 55 50 20 42 59 20 63 6c 61 75  he GROUP BY clau
18e10 73 65 2e 20 20 4d 61 79 20 62 65 20 4e 55 4c 4c  se.  May be NULL
18e20 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 48 61 76   */.  Expr *pHav
18e30 69 6e 67 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  ing;         /* 
18e40 54 68 65 20 48 41 56 49 4e 47 20 63 6c 61 75 73  The HAVING claus
18e50 65 2e 20 20 4d 61 79 20 62 65 20 4e 55 4c 4c 20  e.  May be NULL 
18e60 2a 2f 0a 20 20 69 6e 74 20 69 73 44 69 73 74 69  */.  int isDisti
18e70 6e 63 74 3b 20 20 20 20 20 20 20 20 2f 2a 20 54  nct;        /* T
18e80 72 75 65 20 69 66 20 74 68 65 20 44 49 53 54 49  rue if the DISTI
18e90 4e 43 54 20 6b 65 79 77 6f 72 64 20 69 73 20 70  NCT keyword is p
18ea0 72 65 73 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20  resent */.  int 
18eb0 64 69 73 74 69 6e 63 74 3b 20 20 20 20 20 20 20  distinct;       
18ec0 20 20 20 2f 2a 20 54 61 62 6c 65 20 74 6f 20 75     /* Table to u
18ed0 73 65 20 66 6f 72 20 74 68 65 20 64 69 73 74 69  se for the disti
18ee0 6e 63 74 20 73 65 74 20 2a 2f 0a 20 20 69 6e 74  nct set */.  int
18ef0 20 72 63 20 3d 20 31 3b 20 20 20 20 20 20 20 20   rc = 1;        
18f00 20 20 20 20 2f 2a 20 56 61 6c 75 65 20 74 6f 20      /* Value to 
18f10 72 65 74 75 72 6e 20 66 72 6f 6d 20 74 68 69 73  return from this
18f20 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 69   function */.  i
18f30 6e 74 20 61 64 64 72 53 6f 72 74 49 6e 64 65 78  nt addrSortIndex
18f40 3b 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73  ;     /* Address
18f50 20 6f 66 20 61 6e 20 4f 50 5f 4f 70 65 6e 45 70   of an OP_OpenEp
18f60 68 65 6d 65 72 61 6c 20 69 6e 73 74 72 75 63 74  hemeral instruct
18f70 69 6f 6e 20 2a 2f 0a 20 20 41 67 67 49 6e 66 6f  ion */.  AggInfo
18f80 20 73 41 67 67 49 6e 66 6f 3b 20 20 20 20 20 20   sAggInfo;      
18f90 2f 2a 20 49 6e 66 6f 72 6d 61 74 69 6f 6e 20 75  /* Information u
18fa0 73 65 64 20 62 79 20 61 67 67 72 65 67 61 74 65  sed by aggregate
18fb0 20 71 75 65 72 69 65 73 20 2a 2f 0a 20 20 69 6e   queries */.  in
18fc0 74 20 69 45 6e 64 3b 20 20 20 20 20 20 20 20 20  t iEnd;         
18fd0 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20       /* Address 
18fe0 6f 66 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68  of the end of th
18ff0 65 20 71 75 65 72 79 20 2a 2f 0a 20 20 73 71 6c  e query */.  sql
19000 69 74 65 33 20 2a 64 62 3b 20 20 20 20 20 20 20  ite3 *db;       
19010 20 20 20 20 2f 2a 20 54 68 65 20 64 61 74 61 62      /* The datab
19020 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a  ase connection *
19030 2f 0a 0a 20 20 64 62 20 3d 20 70 50 61 72 73 65  /..  db = pParse
19040 2d 3e 64 62 3b 0a 20 20 69 66 28 20 70 3d 3d 30  ->db;.  if( p==0
19050 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61   || db->mallocFa
19060 69 6c 65 64 20 7c 7c 20 70 50 61 72 73 65 2d 3e  iled || pParse->
19070 6e 45 72 72 20 29 7b 0a 20 20 20 20 72 65 74 75  nErr ){.    retu
19080 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 69 66 28 20  rn 1;.  }.  if( 
19090 73 71 6c 69 74 65 33 41 75 74 68 43 68 65 63 6b  sqlite3AuthCheck
190a0 28 70 50 61 72 73 65 2c 20 53 51 4c 49 54 45 5f  (pParse, SQLITE_
190b0 53 45 4c 45 43 54 2c 20 30 2c 20 30 2c 20 30 29  SELECT, 0, 0, 0)
190c0 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 6d   ) return 1;.  m
190d0 65 6d 73 65 74 28 26 73 41 67 67 49 6e 66 6f 2c  emset(&sAggInfo,
190e0 20 30 2c 20 73 69 7a 65 6f 66 28 73 41 67 67 49   0, sizeof(sAggI
190f0 6e 66 6f 29 29 3b 0a 0a 20 20 70 4f 72 64 65 72  nfo));..  pOrder
19100 42 79 20 3d 20 70 2d 3e 70 4f 72 64 65 72 42 79  By = p->pOrderBy
19110 3b 0a 20 20 69 66 28 20 49 67 6e 6f 72 61 62 6c  ;.  if( Ignorabl
19120 65 4f 72 64 65 72 62 79 28 70 44 65 73 74 29 20  eOrderby(pDest) 
19130 29 7b 0a 20 20 20 20 70 2d 3e 70 4f 72 64 65 72  ){.    p->pOrder
19140 42 79 20 3d 20 30 3b 0a 0a 20 20 20 20 2f 2a 20  By = 0;..    /* 
19150 49 6e 20 74 68 65 73 65 20 63 61 73 65 73 20 74  In these cases t
19160 68 65 20 44 49 53 54 49 4e 43 54 20 6f 70 65 72  he DISTINCT oper
19170 61 74 6f 72 20 6d 61 6b 65 73 20 6e 6f 20 64 69  ator makes no di
19180 66 66 65 72 65 6e 63 65 20 74 6f 20 74 68 65 0a  fference to the.
19190 20 20 20 20 2a 2a 20 72 65 73 75 6c 74 73 2c 20      ** results, 
191a0 73 6f 20 72 65 6d 6f 76 65 20 69 74 20 69 66 20  so remove it if 
191b0 69 74 20 77 65 72 65 20 73 70 65 63 69 66 69 65  it were specifie
191c0 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61 73  d..    */.    as
191d0 73 65 72 74 28 70 44 65 73 74 2d 3e 65 44 65 73  sert(pDest->eDes
191e0 74 3d 3d 53 52 54 5f 45 78 69 73 74 73 20 7c 7c  t==SRT_Exists ||
191f0 20 70 44 65 73 74 2d 3e 65 44 65 73 74 3d 3d 53   pDest->eDest==S
19200 52 54 5f 55 6e 69 6f 6e 20 7c 7c 20 0a 20 20 20  RT_Union || .   
19210 20 20 20 20 20 20 20 20 70 44 65 73 74 2d 3e 65          pDest->e
19220 44 65 73 74 3d 3d 53 52 54 5f 45 78 63 65 70 74  Dest==SRT_Except
19230 20 7c 7c 20 70 44 65 73 74 2d 3e 65 44 65 73 74   || pDest->eDest
19240 3d 3d 53 52 54 5f 44 69 73 63 61 72 64 29 3b 0a  ==SRT_Discard);.
19250 20 20 20 20 70 2d 3e 69 73 44 69 73 74 69 6e 63      p->isDistinc
19260 74 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28  t = 0;.  }.  if(
19270 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 52 65   sqlite3SelectRe
19280 73 6f 6c 76 65 28 70 50 61 72 73 65 2c 20 70 2c  solve(pParse, p,
19290 20 30 29 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20   0) ){.    goto 
192a0 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 7d 0a  select_end;.  }.
192b0 20 20 70 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20    p->pOrderBy = 
192c0 70 4f 72 64 65 72 42 79 3b 0a 0a 23 69 66 6e 64  pOrderBy;..#ifnd
192d0 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43  ef SQLITE_OMIT_C
192e0 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45 43 54 0a 20  OMPOUND_SELECT. 
192f0 20 2f 2a 20 49 66 20 74 68 65 72 65 20 69 73 20   /* If there is 
19300 61 72 65 20 61 20 73 65 71 75 65 6e 63 65 20 6f  are a sequence o
19310 66 20 71 75 65 72 69 65 73 2c 20 64 6f 20 74 68  f queries, do th
19320 65 20 65 61 72 6c 69 65 72 20 6f 6e 65 73 20 66  e earlier ones f
19330 69 72 73 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  irst..  */.  if(
19340 20 70 2d 3e 70 50 72 69 6f 72 20 29 7b 0a 20 20   p->pPrior ){.  
19350 20 20 69 66 28 20 70 2d 3e 70 52 69 67 68 74 6d    if( p->pRightm
19360 6f 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ost==0 ){.      
19370 53 65 6c 65 63 74 20 2a 70 4c 6f 6f 70 2c 20 2a  Select *pLoop, *
19380 70 52 69 67 68 74 20 3d 20 30 3b 0a 20 20 20 20  pRight = 0;.    
19390 20 20 69 6e 74 20 63 6e 74 20 3d 20 30 3b 0a 20    int cnt = 0;. 
193a0 20 20 20 20 20 66 6f 72 28 70 4c 6f 6f 70 3d 70       for(pLoop=p
193b0 3b 20 70 4c 6f 6f 70 3b 20 70 4c 6f 6f 70 3d 70  ; pLoop; pLoop=p
193c0 4c 6f 6f 70 2d 3e 70 50 72 69 6f 72 2c 20 63 6e  Loop->pPrior, cn
193d0 74 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 70 4c  t++){.        pL
193e0 6f 6f 70 2d 3e 70 52 69 67 68 74 6d 6f 73 74 20  oop->pRightmost 
193f0 3d 20 70 3b 0a 20 20 20 20 20 20 20 20 70 4c 6f  = p;.        pLo
19400 6f 70 2d 3e 70 4e 65 78 74 20 3d 20 70 52 69 67  op->pNext = pRig
19410 68 74 3b 0a 20 20 20 20 20 20 20 20 70 52 69 67  ht;.        pRig
19420 68 74 20 3d 20 70 4c 6f 6f 70 3b 0a 20 20 20 20  ht = pLoop;.    
19430 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 53 51    }.      if( SQ
19440 4c 49 54 45 5f 4d 41 58 5f 43 4f 4d 50 4f 55 4e  LITE_MAX_COMPOUN
19450 44 5f 53 45 4c 45 43 54 3e 30 20 26 26 20 63 6e  D_SELECT>0 && cn
19460 74 3e 53 51 4c 49 54 45 5f 4d 41 58 5f 43 4f 4d  t>SQLITE_MAX_COM
19470 50 4f 55 4e 44 5f 53 45 4c 45 43 54 20 29 7b 0a  POUND_SELECT ){.
19480 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
19490 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
194a0 22 74 6f 6f 20 6d 61 6e 79 20 74 65 72 6d 73 20  "too many terms 
194b0 69 6e 20 63 6f 6d 70 6f 75 6e 64 20 53 45 4c 45  in compound SELE
194c0 43 54 22 29 3b 0a 20 20 20 20 20 20 20 20 72 65  CT");.        re
194d0 74 75 72 6e 20 31 3b 0a 20 20 20 20 20 20 7d 0a  turn 1;.      }.
194e0 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e      }.    return
194f0 20 6d 75 6c 74 69 53 65 6c 65 63 74 28 70 50 61   multiSelect(pPa
19500 72 73 65 2c 20 70 2c 20 70 44 65 73 74 2c 20 61  rse, p, pDest, a
19510 66 66 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  ff);.  }.#endif.
19520 0a 20 20 2f 2a 20 4d 61 6b 65 20 6c 6f 63 61 6c  .  /* Make local
19530 20 63 6f 70 69 65 73 20 6f 66 20 74 68 65 20 70   copies of the p
19540 61 72 61 6d 65 74 65 72 73 20 66 6f 72 20 74 68  arameters for th
19550 69 73 20 71 75 65 72 79 2e 0a 20 20 2a 2f 0a 20  is query..  */. 
19560 20 70 54 61 62 4c 69 73 74 20 3d 20 70 2d 3e 70   pTabList = p->p
19570 53 72 63 3b 0a 20 20 70 57 68 65 72 65 20 3d 20  Src;.  pWhere = 
19580 70 2d 3e 70 57 68 65 72 65 3b 0a 20 20 70 47 72  p->pWhere;.  pGr
19590 6f 75 70 42 79 20 3d 20 70 2d 3e 70 47 72 6f 75  oupBy = p->pGrou
195a0 70 42 79 3b 0a 20 20 70 48 61 76 69 6e 67 20 3d  pBy;.  pHaving =
195b0 20 70 2d 3e 70 48 61 76 69 6e 67 3b 0a 20 20 69   p->pHaving;.  i
195c0 73 41 67 67 20 3d 20 70 2d 3e 69 73 41 67 67 3b  sAgg = p->isAgg;
195d0 0a 20 20 69 73 44 69 73 74 69 6e 63 74 20 3d 20  .  isDistinct = 
195e0 70 2d 3e 69 73 44 69 73 74 69 6e 63 74 3b 0a 20  p->isDistinct;. 
195f0 20 70 45 4c 69 73 74 20 3d 20 70 2d 3e 70 45 4c   pEList = p->pEL
19600 69 73 74 3b 0a 20 20 69 66 28 20 70 45 4c 69 73  ist;.  if( pELis
19610 74 3d 3d 30 20 29 20 67 6f 74 6f 20 73 65 6c 65  t==0 ) goto sele
19620 63 74 5f 65 6e 64 3b 0a 0a 20 20 2f 2a 20 0a 20  ct_end;..  /* . 
19630 20 2a 2a 20 44 6f 20 6e 6f 74 20 65 76 65 6e 20   ** Do not even 
19640 61 74 74 65 6d 70 74 20 74 6f 20 67 65 6e 65 72  attempt to gener
19650 61 74 65 20 61 6e 79 20 63 6f 64 65 20 69 66 20  ate any code if 
19660 77 65 20 68 61 76 65 20 61 6c 72 65 61 64 79 20  we have already 
19670 73 65 65 6e 0a 20 20 2a 2a 20 65 72 72 6f 72 73  seen.  ** errors
19680 20 62 65 66 6f 72 65 20 74 68 69 73 20 72 6f 75   before this rou
19690 74 69 6e 65 20 73 74 61 72 74 73 2e 0a 20 20 2a  tine starts..  *
196a0 2f 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e  /.  if( pParse->
196b0 6e 45 72 72 3e 30 20 29 20 67 6f 74 6f 20 73 65  nErr>0 ) goto se
196c0 6c 65 63 74 5f 65 6e 64 3b 0a 0a 20 20 2f 2a 20  lect_end;..  /* 
196d0 49 66 20 77 72 69 74 69 6e 67 20 74 6f 20 6d 65  If writing to me
196e0 6d 6f 72 79 20 6f 72 20 67 65 6e 65 72 61 74 69  mory or generati
196f0 6e 67 20 61 20 73 65 74 0a 20 20 2a 2a 20 6f 6e  ng a set.  ** on
19700 6c 79 20 61 20 73 69 6e 67 6c 65 20 63 6f 6c 75  ly a single colu
19710 6d 6e 20 6d 61 79 20 62 65 20 6f 75 74 70 75 74  mn may be output
19720 2e 0a 20 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53  ..  */.#ifndef S
19730 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55  QLITE_OMIT_SUBQU
19740 45 52 59 0a 20 20 69 66 28 20 63 68 65 63 6b 46  ERY.  if( checkF
19750 6f 72 4d 75 6c 74 69 43 6f 6c 75 6d 6e 53 65 6c  orMultiColumnSel
19760 65 63 74 45 72 72 6f 72 28 70 50 61 72 73 65 2c  ectError(pParse,
19770 20 70 44 65 73 74 2c 20 70 45 4c 69 73 74 2d 3e   pDest, pEList->
19780 6e 45 78 70 72 29 20 29 7b 0a 20 20 20 20 67 6f  nExpr) ){.    go
19790 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20  to select_end;. 
197a0 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20   }.#endif..  /* 
197b0 4f 52 44 45 52 20 42 59 20 69 73 20 69 67 6e 6f  ORDER BY is igno
197c0 72 65 64 20 66 6f 72 20 73 6f 6d 65 20 64 65 73  red for some des
197d0 74 69 6e 61 74 69 6f 6e 73 2e 0a 20 20 2a 2f 0a  tinations..  */.
197e0 20 20 69 66 28 20 49 67 6e 6f 72 61 62 6c 65 4f    if( IgnorableO
197f0 72 64 65 72 62 79 28 70 44 65 73 74 29 20 29 7b  rderby(pDest) ){
19800 0a 20 20 20 20 70 4f 72 64 65 72 42 79 20 3d 20  .    pOrderBy = 
19810 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 42 65 67  0;.  }..  /* Beg
19820 69 6e 20 67 65 6e 65 72 61 74 69 6e 67 20 63 6f  in generating co
19830 64 65 2e 0a 20 20 2a 2f 0a 20 20 76 20 3d 20 73  de..  */.  v = s
19840 71 6c 69 74 65 33 47 65 74 56 64 62 65 28 70 50  qlite3GetVdbe(pP
19850 61 72 73 65 29 3b 0a 20 20 69 66 28 20 76 3d 3d  arse);.  if( v==
19860 30 20 29 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f  0 ) goto select_
19870 65 6e 64 3b 0a 0a 20 20 2f 2a 20 47 65 6e 65 72  end;..  /* Gener
19880 61 74 65 20 63 6f 64 65 20 66 6f 72 20 61 6c 6c  ate code for all
19890 20 73 75 62 2d 71 75 65 72 69 65 73 20 69 6e 20   sub-queries in 
198a0 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 0a  the FROM clause.
198b0 20 20 2a 2f 0a 23 69 66 20 21 64 65 66 69 6e 65    */.#if !define
198c0 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55  d(SQLITE_OMIT_SU
198d0 42 51 55 45 52 59 29 20 7c 7c 20 21 64 65 66 69  BQUERY) || !defi
198e0 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
198f0 56 49 45 57 29 0a 20 20 66 6f 72 28 69 3d 30 3b  VIEW).  for(i=0;
19900 20 69 3c 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72   i<pTabList->nSr
19910 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 63 6f 6e  c; i++){.    con
19920 73 74 20 63 68 61 72 20 2a 7a 53 61 76 65 64 41  st char *zSavedA
19930 75 74 68 43 6f 6e 74 65 78 74 20 3d 20 30 3b 0a  uthContext = 0;.
19940 20 20 20 20 69 6e 74 20 6e 65 65 64 52 65 73 74      int needRest
19950 6f 72 65 43 6f 6e 74 65 78 74 3b 0a 20 20 20 20  oreContext;.    
19960 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69  struct SrcList_i
19970 74 65 6d 20 2a 70 49 74 65 6d 20 3d 20 26 70 54  tem *pItem = &pT
19980 61 62 4c 69 73 74 2d 3e 61 5b 69 5d 3b 0a 20 20  abList->a[i];.  
19990 20 20 53 65 6c 65 63 74 44 65 73 74 20 64 65 73    SelectDest des
199a0 74 3b 0a 0a 20 20 20 20 69 66 28 20 70 49 74 65  t;..    if( pIte
199b0 6d 2d 3e 70 53 65 6c 65 63 74 3d 3d 30 20 7c 7c  m->pSelect==0 ||
199c0 20 70 49 74 65 6d 2d 3e 69 73 50 6f 70 75 6c 61   pItem->isPopula
199d0 74 65 64 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  ted ) continue;.
199e0 20 20 20 20 69 66 28 20 70 49 74 65 6d 2d 3e 7a      if( pItem->z
199f0 4e 61 6d 65 21 3d 30 20 29 7b 0a 20 20 20 20 20  Name!=0 ){.     
19a00 20 7a 53 61 76 65 64 41 75 74 68 43 6f 6e 74 65   zSavedAuthConte
19a10 78 74 20 3d 20 70 50 61 72 73 65 2d 3e 7a 41 75  xt = pParse->zAu
19a20 74 68 43 6f 6e 74 65 78 74 3b 0a 20 20 20 20 20  thContext;.     
19a30 20 70 50 61 72 73 65 2d 3e 7a 41 75 74 68 43 6f   pParse->zAuthCo
19a40 6e 74 65 78 74 20 3d 20 70 49 74 65 6d 2d 3e 7a  ntext = pItem->z
19a50 4e 61 6d 65 3b 0a 20 20 20 20 20 20 6e 65 65 64  Name;.      need
19a60 52 65 73 74 6f 72 65 43 6f 6e 74 65 78 74 20 3d  RestoreContext =
19a70 20 31 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20   1;.    }else{. 
19a80 20 20 20 20 20 6e 65 65 64 52 65 73 74 6f 72 65       needRestore
19a90 43 6f 6e 74 65 78 74 20 3d 20 30 3b 0a 20 20 20  Context = 0;.   
19aa0 20 7d 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53   }.#if defined(S
19ab0 51 4c 49 54 45 5f 54 45 53 54 29 20 7c 7c 20 53  QLITE_TEST) || S
19ac0 51 4c 49 54 45 5f 4d 41 58 5f 45 58 50 52 5f 44  QLITE_MAX_EXPR_D
19ad0 45 50 54 48 3e 30 0a 20 20 20 20 2f 2a 20 49 6e  EPTH>0.    /* In
19ae0 63 72 65 6d 65 6e 74 20 50 61 72 73 65 2e 6e 48  crement Parse.nH
19af0 65 69 67 68 74 20 62 79 20 74 68 65 20 68 65 69  eight by the hei
19b00 67 68 74 20 6f 66 20 74 68 65 20 6c 61 72 67 65  ght of the large
19b10 73 74 20 65 78 70 72 65 73 73 69 6f 6e 0a 20 20  st expression.  
19b20 20 20 2a 2a 20 74 72 65 65 20 72 65 66 65 72 65    ** tree refere
19b30 64 20 74 6f 20 62 79 20 74 68 69 73 2c 20 74 68  d to by this, th
19b40 65 20 70 61 72 65 6e 74 20 73 65 6c 65 63 74 2e  e parent select.
19b50 20 54 68 65 20 63 68 69 6c 64 20 73 65 6c 65 63   The child selec
19b60 74 0a 20 20 20 20 2a 2a 20 6d 61 79 20 63 6f 6e  t.    ** may con
19b70 74 61 69 6e 20 65 78 70 72 65 73 73 69 6f 6e 20  tain expression 
19b80 74 72 65 65 73 20 6f 66 20 61 74 20 6d 6f 73 74  trees of at most
19b90 0a 20 20 20 20 2a 2a 20 28 53 51 4c 49 54 45 5f  .    ** (SQLITE_
19ba0 4d 41 58 5f 45 58 50 52 5f 44 45 50 54 48 2d 50  MAX_EXPR_DEPTH-P
19bb0 61 72 73 65 2e 6e 48 65 69 67 68 74 29 20 68 65  arse.nHeight) he
19bc0 69 67 68 74 2e 20 54 68 69 73 20 69 73 20 61 20  ight. This is a 
19bd0 62 69 74 0a 20 20 20 20 2a 2a 20 6d 6f 72 65 20  bit.    ** more 
19be0 63 6f 6e 73 65 72 76 61 74 69 76 65 20 74 68 61  conservative tha
19bf0 6e 20 6e 65 63 65 73 73 61 72 79 2c 20 62 75 74  n necessary, but
19c00 20 6d 75 63 68 20 65 61 73 69 65 72 20 74 68 61   much easier tha
19c10 6e 20 65 6e 66 6f 72 63 69 6e 67 0a 20 20 20 20  n enforcing.    
19c20 2a 2a 20 61 6e 20 65 78 61 63 74 20 6c 69 6d 69  ** an exact limi
19c30 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70 50  t..    */.    pP
19c40 61 72 73 65 2d 3e 6e 48 65 69 67 68 74 20 2b 3d  arse->nHeight +=
19c50 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 45 78   sqlite3SelectEx
19c60 70 72 48 65 69 67 68 74 28 70 29 3b 0a 23 65 6e  prHeight(p);.#en
19c70 64 69 66 0a 20 20 20 20 73 71 6c 69 74 65 33 53  dif.    sqlite3S
19c80 65 6c 65 63 74 44 65 73 74 49 6e 69 74 28 26 64  electDestInit(&d
19c90 65 73 74 2c 20 53 52 54 5f 45 70 68 65 6d 54 61  est, SRT_EphemTa
19ca0 62 2c 20 70 49 74 65 6d 2d 3e 69 43 75 72 73 6f  b, pItem->iCurso
19cb0 72 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 53  r);.    sqlite3S
19cc0 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70 49  elect(pParse, pI
19cd0 74 65 6d 2d 3e 70 53 65 6c 65 63 74 2c 20 26 64  tem->pSelect, &d
19ce0 65 73 74 2c 20 70 2c 20 69 2c 20 26 69 73 41 67  est, p, i, &isAg
19cf0 67 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 64  g, 0);.    if( d
19d00 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
19d10 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 73 65  ){.      goto se
19d20 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 7d 0a  lect_end;.    }.
19d30 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49  #if defined(SQLI
19d40 54 45 5f 54 45 53 54 29 20 7c 7c 20 53 51 4c 49  TE_TEST) || SQLI
19d50 54 45 5f 4d 41 58 5f 45 58 50 52 5f 44 45 50 54  TE_MAX_EXPR_DEPT
19d60 48 3e 30 0a 20 20 20 20 70 50 61 72 73 65 2d 3e  H>0.    pParse->
19d70 6e 48 65 69 67 68 74 20 2d 3d 20 73 71 6c 69 74  nHeight -= sqlit
19d80 65 33 53 65 6c 65 63 74 45 78 70 72 48 65 69 67  e3SelectExprHeig
19d90 68 74 28 70 29 3b 0a 23 65 6e 64 69 66 0a 20 20  ht(p);.#endif.  
19da0 20 20 69 66 28 20 6e 65 65 64 52 65 73 74 6f 72    if( needRestor
19db0 65 43 6f 6e 74 65 78 74 20 29 7b 0a 20 20 20 20  eContext ){.    
19dc0 20 20 70 50 61 72 73 65 2d 3e 7a 41 75 74 68 43    pParse->zAuthC
19dd0 6f 6e 74 65 78 74 20 3d 20 7a 53 61 76 65 64 41  ontext = zSavedA
19de0 75 74 68 43 6f 6e 74 65 78 74 3b 0a 20 20 20 20  uthContext;.    
19df0 7d 0a 20 20 20 20 70 54 61 62 4c 69 73 74 20 3d  }.    pTabList =
19e00 20 70 2d 3e 70 53 72 63 3b 0a 20 20 20 20 70 57   p->pSrc;.    pW
19e10 68 65 72 65 20 3d 20 70 2d 3e 70 57 68 65 72 65  here = p->pWhere
19e20 3b 0a 20 20 20 20 69 66 28 20 21 49 67 6e 6f 72  ;.    if( !Ignor
19e30 61 62 6c 65 4f 72 64 65 72 62 79 28 70 44 65 73  ableOrderby(pDes
19e40 74 29 20 29 7b 0a 20 20 20 20 20 20 70 4f 72 64  t) ){.      pOrd
19e50 65 72 42 79 20 3d 20 70 2d 3e 70 4f 72 64 65 72  erBy = p->pOrder
19e60 42 79 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 47  By;.    }.    pG
19e70 72 6f 75 70 42 79 20 3d 20 70 2d 3e 70 47 72 6f  roupBy = p->pGro
19e80 75 70 42 79 3b 0a 20 20 20 20 70 48 61 76 69 6e  upBy;.    pHavin
19e90 67 20 3d 20 70 2d 3e 70 48 61 76 69 6e 67 3b 0a  g = p->pHaving;.
19ea0 20 20 20 20 69 73 44 69 73 74 69 6e 63 74 20 3d      isDistinct =
19eb0 20 70 2d 3e 69 73 44 69 73 74 69 6e 63 74 3b 0a   p->isDistinct;.
19ec0 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a    }.#endif..  /*
19ed0 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66   Check to see if
19ee0 20 74 68 69 73 20 69 73 20 61 20 73 75 62 71 75   this is a subqu
19ef0 65 72 79 20 74 68 61 74 20 63 61 6e 20 62 65 20  ery that can be 
19f00 22 66 6c 61 74 74 65 6e 65 64 22 20 69 6e 74 6f  "flattened" into
19f10 20 69 74 73 20 70 61 72 65 6e 74 2e 0a 20 20 2a   its parent..  *
19f20 2a 20 49 66 20 66 6c 61 74 74 65 6e 69 6e 67 20  * If flattening 
19f30 69 73 20 61 20 70 6f 73 73 69 62 6c 69 74 79 2c  is a possiblity,
19f40 20 64 6f 20 73 6f 20 61 6e 64 20 72 65 74 75 72   do so and retur
19f50 6e 20 69 6d 6d 65 64 69 61 74 65 6c 79 2e 20 20  n immediately.  
19f60 0a 20 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51  .  */.#ifndef SQ
19f70 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 0a 20  LITE_OMIT_VIEW. 
19f80 20 69 66 28 20 70 50 61 72 65 6e 74 20 26 26 20   if( pParent && 
19f90 70 50 61 72 65 6e 74 41 67 67 20 26 26 0a 20 20  pParentAgg &&.  
19fa0 20 20 20 20 66 6c 61 74 74 65 6e 53 75 62 71 75      flattenSubqu
19fb0 65 72 79 28 64 62 2c 20 70 50 61 72 65 6e 74 2c  ery(db, pParent,
19fc0 20 70 61 72 65 6e 74 54 61 62 2c 20 2a 70 50 61   parentTab, *pPa
19fd0 72 65 6e 74 41 67 67 2c 20 69 73 41 67 67 29 20  rentAgg, isAgg) 
19fe0 29 7b 0a 20 20 20 20 69 66 28 20 69 73 41 67 67  ){.    if( isAgg
19ff0 20 29 20 2a 70 50 61 72 65 6e 74 41 67 67 20 3d   ) *pParentAgg =
1a000 20 31 3b 0a 20 20 20 20 67 6f 74 6f 20 73 65 6c   1;.    goto sel
1a010 65 63 74 5f 65 6e 64 3b 0a 20 20 7d 0a 23 65 6e  ect_end;.  }.#en
1a020 64 69 66 0a 0a 20 20 2f 2a 20 49 66 20 70 6f 73  dif..  /* If pos
1a030 73 69 62 6c 65 2c 20 72 65 77 72 69 74 65 20 74  sible, rewrite t
1a040 68 65 20 71 75 65 72 79 20 74 6f 20 75 73 65 20  he query to use 
1a050 47 52 4f 55 50 20 42 59 20 69 6e 73 74 65 61 64  GROUP BY instead
1a060 20 6f 66 20 44 49 53 54 49 4e 43 54 2e 0a 20 20   of DISTINCT..  
1a070 2a 2a 20 47 52 4f 55 50 20 42 59 20 6d 61 79 20  ** GROUP BY may 
1a080 75 73 65 20 61 6e 20 69 6e 64 65 78 2c 20 44 49  use an index, DI
1a090 53 54 49 4e 43 54 20 6e 65 76 65 72 20 64 6f 65  STINCT never doe
1a0a0 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d  s..  */.  if( p-
1a0b0 3e 69 73 44 69 73 74 69 6e 63 74 20 26 26 20 21  >isDistinct && !
1a0c0 70 2d 3e 69 73 41 67 67 20 26 26 20 21 70 2d 3e  p->isAgg && !p->
1a0d0 70 47 72 6f 75 70 42 79 20 29 7b 0a 20 20 20 20  pGroupBy ){.    
1a0e0 70 2d 3e 70 47 72 6f 75 70 42 79 20 3d 20 73 71  p->pGroupBy = sq
1a0f0 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 75 70  lite3ExprListDup
1a100 28 64 62 2c 20 70 2d 3e 70 45 4c 69 73 74 29 3b  (db, p->pEList);
1a110 0a 20 20 20 20 70 47 72 6f 75 70 42 79 20 3d 20  .    pGroupBy = 
1a120 70 2d 3e 70 47 72 6f 75 70 42 79 3b 0a 20 20 20  p->pGroupBy;.   
1a130 20 70 2d 3e 69 73 44 69 73 74 69 6e 63 74 20 3d   p->isDistinct =
1a140 20 30 3b 0a 20 20 20 20 69 73 44 69 73 74 69 6e   0;.    isDistin
1a150 63 74 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f  ct = 0;.  }..  /
1a160 2a 20 49 66 20 74 68 65 72 65 20 69 73 20 61 6e  * If there is an
1a170 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65   ORDER BY clause
1a180 2c 20 74 68 65 6e 20 74 68 69 73 20 73 6f 72 74  , then this sort
1a190 69 6e 67 0a 20 20 2a 2a 20 69 6e 64 65 78 20 6d  ing.  ** index m
1a1a0 69 67 68 74 20 65 6e 64 20 75 70 20 62 65 69 6e  ight end up bein
1a1b0 67 20 75 6e 75 73 65 64 20 69 66 20 74 68 65 20  g unused if the 
1a1c0 64 61 74 61 20 63 61 6e 20 62 65 20 0a 20 20 2a  data can be .  *
1a1d0 2a 20 65 78 74 72 61 63 74 65 64 20 69 6e 20 70  * extracted in p
1a1e0 72 65 2d 73 6f 72 74 65 64 20 6f 72 64 65 72 2e  re-sorted order.
1a1f0 20 20 49 66 20 74 68 61 74 20 69 73 20 74 68 65    If that is the
1a200 20 63 61 73 65 2c 20 74 68 65 6e 20 74 68 65 0a   case, then the.
1a210 20 20 2a 2a 20 4f 50 5f 4f 70 65 6e 45 70 68 65    ** OP_OpenEphe
1a220 6d 65 72 61 6c 20 69 6e 73 74 72 75 63 74 69 6f  meral instructio
1a230 6e 20 77 69 6c 6c 20 62 65 20 63 68 61 6e 67 65  n will be change
1a240 64 20 74 6f 20 61 6e 20 4f 50 5f 4e 6f 6f 70 20  d to an OP_Noop 
1a250 6f 6e 63 65 0a 20 20 2a 2a 20 77 65 20 66 69 67  once.  ** we fig
1a260 75 72 65 20 6f 75 74 20 74 68 61 74 20 74 68 65  ure out that the
1a270 20 73 6f 72 74 69 6e 67 20 69 6e 64 65 78 20 69   sorting index i
1a280 73 20 6e 6f 74 20 6e 65 65 64 65 64 2e 20 20 54  s not needed.  T
1a290 68 65 20 61 64 64 72 53 6f 72 74 49 6e 64 65 78  he addrSortIndex
1a2a0 0a 20 20 2a 2a 20 76 61 72 69 61 62 6c 65 20 69  .  ** variable i
1a2b0 73 20 75 73 65 64 20 74 6f 20 66 61 63 69 6c 69  s used to facili
1a2c0 74 61 74 65 20 74 68 61 74 20 63 68 61 6e 67 65  tate that change
1a2d0 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 4f 72  ..  */.  if( pOr
1a2e0 64 65 72 42 79 20 29 7b 0a 20 20 20 20 4b 65 79  derBy ){.    Key
1a2f0 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 3b 0a  Info *pKeyInfo;.
1a300 20 20 20 20 70 4b 65 79 49 6e 66 6f 20 3d 20 6b      pKeyInfo = k
1a310 65 79 49 6e 66 6f 46 72 6f 6d 45 78 70 72 4c 69  eyInfoFromExprLi
1a320 73 74 28 70 50 61 72 73 65 2c 20 70 4f 72 64 65  st(pParse, pOrde
1a330 72 42 79 29 3b 0a 20 20 20 20 70 4f 72 64 65 72  rBy);.    pOrder
1a340 42 79 2d 3e 69 45 43 75 72 73 6f 72 20 3d 20 70  By->iECursor = p
1a350 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20  Parse->nTab++;. 
1a360 20 20 20 70 2d 3e 61 64 64 72 4f 70 65 6e 45 70     p->addrOpenEp
1a370 68 6d 5b 32 5d 20 3d 20 61 64 64 72 53 6f 72 74  hm[2] = addrSort
1a380 49 6e 64 65 78 20 3d 0a 20 20 20 20 20 20 73 71  Index =.      sq
1a390 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28  lite3VdbeAddOp4(
1a3a0 76 2c 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65  v, OP_OpenEpheme
1a3b0 72 61 6c 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ral,.           
1a3c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a3d0 70 4f 72 64 65 72 42 79 2d 3e 69 45 43 75 72 73  pOrderBy->iECurs
1a3e0 6f 72 2c 20 70 4f 72 64 65 72 42 79 2d 3e 6e 45  or, pOrderBy->nE
1a3f0 78 70 72 2b 32 2c 20 30 2c 0a 20 20 20 20 20 20  xpr+2, 0,.      
1a400 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a410 20 20 20 20 20 28 63 68 61 72 2a 29 70 4b 65 79       (char*)pKey
1a420 49 6e 66 6f 2c 20 50 34 5f 4b 45 59 49 4e 46 4f  Info, P4_KEYINFO
1a430 5f 48 41 4e 44 4f 46 46 29 3b 0a 20 20 7d 65 6c  _HANDOFF);.  }el
1a440 73 65 7b 0a 20 20 20 20 61 64 64 72 53 6f 72 74  se{.    addrSort
1a450 49 6e 64 65 78 20 3d 20 2d 31 3b 0a 20 20 7d 0a  Index = -1;.  }.
1a460 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 6f 75 74  .  /* If the out
1a470 70 75 74 20 69 73 20 64 65 73 74 69 6e 65 64 20  put is destined 
1a480 66 6f 72 20 61 20 74 65 6d 70 6f 72 61 72 79 20  for a temporary 
1a490 74 61 62 6c 65 2c 20 6f 70 65 6e 20 74 68 61 74  table, open that
1a4a0 20 74 61 62 6c 65 2e 0a 20 20 2a 2f 0a 20 20 69   table..  */.  i
1a4b0 66 28 20 70 44 65 73 74 2d 3e 65 44 65 73 74 3d  f( pDest->eDest=
1a4c0 3d 53 52 54 5f 45 70 68 65 6d 54 61 62 20 29 7b  =SRT_EphemTab ){
1a4d0 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
1a4e0 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4f 70 65  AddOp2(v, OP_Ope
1a4f0 6e 45 70 68 65 6d 65 72 61 6c 2c 20 70 44 65 73  nEphemeral, pDes
1a500 74 2d 3e 69 50 61 72 6d 2c 20 70 45 4c 69 73 74  t->iParm, pEList
1a510 2d 3e 6e 45 78 70 72 29 3b 0a 20 20 7d 0a 0a 20  ->nExpr);.  }.. 
1a520 20 2f 2a 20 53 65 74 20 74 68 65 20 6c 69 6d 69   /* Set the limi
1a530 74 65 72 2e 0a 20 20 2a 2f 0a 20 20 69 45 6e 64  ter..  */.  iEnd
1a540 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61   = sqlite3VdbeMa
1a550 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 63 6f  keLabel(v);.  co
1a560 6d 70 75 74 65 4c 69 6d 69 74 52 65 67 69 73 74  mputeLimitRegist
1a570 65 72 73 28 70 50 61 72 73 65 2c 20 70 2c 20 69  ers(pParse, p, i
1a580 45 6e 64 29 3b 0a 0a 20 20 2f 2a 20 4f 70 65 6e  End);..  /* Open
1a590 20 61 20 76 69 72 74 75 61 6c 20 69 6e 64 65 78   a virtual index
1a5a0 20 74 6f 20 75 73 65 20 66 6f 72 20 74 68 65 20   to use for the 
1a5b0 64 69 73 74 69 6e 63 74 20 73 65 74 2e 0a 20 20  distinct set..  
1a5c0 2a 2f 0a 20 20 69 66 28 20 69 73 44 69 73 74 69  */.  if( isDisti
1a5d0 6e 63 74 20 29 7b 0a 20 20 20 20 4b 65 79 49 6e  nct ){.    KeyIn
1a5e0 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 3b 0a 20 20  fo *pKeyInfo;.  
1a5f0 20 20 61 73 73 65 72 74 28 20 69 73 41 67 67 20    assert( isAgg 
1a600 7c 7c 20 70 47 72 6f 75 70 42 79 20 29 3b 0a 20  || pGroupBy );. 
1a610 20 20 20 64 69 73 74 69 6e 63 74 20 3d 20 70 50     distinct = pP
1a620 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20  arse->nTab++;.  
1a630 20 20 70 4b 65 79 49 6e 66 6f 20 3d 20 6b 65 79    pKeyInfo = key
1a640 49 6e 66 6f 46 72 6f 6d 45 78 70 72 4c 69 73 74  InfoFromExprList
1a650 28 70 50 61 72 73 65 2c 20 70 2d 3e 70 45 4c 69  (pParse, p->pELi
1a660 73 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  st);.    sqlite3
1a670 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50  VdbeAddOp4(v, OP
1a680 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 2c 20  _OpenEphemeral, 
1a690 64 69 73 74 69 6e 63 74 2c 20 30 2c 20 30 2c 0a  distinct, 0, 0,.
1a6a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a6b0 20 20 20 20 20 20 20 20 28 63 68 61 72 2a 29 70          (char*)p
1a6c0 4b 65 79 49 6e 66 6f 2c 20 50 34 5f 4b 45 59 49  KeyInfo, P4_KEYI
1a6d0 4e 46 4f 5f 48 41 4e 44 4f 46 46 29 3b 0a 20 20  NFO_HANDOFF);.  
1a6e0 7d 65 6c 73 65 7b 0a 20 20 20 20 64 69 73 74 69  }else{.    disti
1a6f0 6e 63 74 20 3d 20 2d 31 3b 0a 20 20 7d 0a 0a 20  nct = -1;.  }.. 
1a700 20 2f 2a 20 41 67 67 72 65 67 61 74 65 20 61 6e   /* Aggregate an
1a710 64 20 6e 6f 6e 2d 61 67 67 72 65 67 61 74 65 20  d non-aggregate 
1a720 71 75 65 72 69 65 73 20 61 72 65 20 68 61 6e 64  queries are hand
1a730 6c 65 64 20 64 69 66 66 65 72 65 6e 74 6c 79 20  led differently 
1a740 2a 2f 0a 20 20 69 66 28 20 21 69 73 41 67 67 20  */.  if( !isAgg 
1a750 26 26 20 70 47 72 6f 75 70 42 79 3d 3d 30 20 29  && pGroupBy==0 )
1a760 7b 0a 20 20 20 20 2f 2a 20 54 68 69 73 20 63 61  {.    /* This ca
1a770 73 65 20 69 73 20 66 6f 72 20 6e 6f 6e 2d 61 67  se is for non-ag
1a780 67 72 65 67 61 74 65 20 71 75 65 72 69 65 73 0a  gregate queries.
1a790 20 20 20 20 2a 2a 20 42 65 67 69 6e 20 74 68 65      ** Begin the
1a7a0 20 64 61 74 61 62 61 73 65 20 73 63 61 6e 0a 20   database scan. 
1a7b0 20 20 20 2a 2f 0a 20 20 20 20 70 57 49 6e 66 6f     */.    pWInfo
1a7c0 20 3d 20 73 71 6c 69 74 65 33 57 68 65 72 65 42   = sqlite3WhereB
1a7d0 65 67 69 6e 28 70 50 61 72 73 65 2c 20 70 54 61  egin(pParse, pTa
1a7e0 62 4c 69 73 74 2c 20 70 57 68 65 72 65 2c 20 26  bList, pWhere, &
1a7f0 70 4f 72 64 65 72 42 79 2c 20 30 29 3b 0a 20 20  pOrderBy, 0);.  
1a800 20 20 69 66 28 20 70 57 49 6e 66 6f 3d 3d 30 20    if( pWInfo==0 
1a810 29 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e  ) goto select_en
1a820 64 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 73 6f  d;..    /* If so
1a830 72 74 69 6e 67 20 69 6e 64 65 78 20 74 68 61 74  rting index that
1a840 20 77 61 73 20 63 72 65 61 74 65 64 20 62 79 20   was created by 
1a850 61 20 70 72 69 6f 72 20 4f 50 5f 4f 70 65 6e 45  a prior OP_OpenE
1a860 70 68 65 6d 65 72 61 6c 20 0a 20 20 20 20 2a 2a  phemeral .    **
1a870 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 65 6e 64   instruction end
1a880 65 64 20 75 70 20 6e 6f 74 20 62 65 69 6e 67 20  ed up not being 
1a890 6e 65 65 64 65 64 2c 20 74 68 65 6e 20 63 68 61  needed, then cha
1a8a0 6e 67 65 20 74 68 65 20 4f 50 5f 4f 70 65 6e 45  nge the OP_OpenE
1a8b0 70 68 65 6d 65 72 61 6c 0a 20 20 20 20 2a 2a 20  phemeral.    ** 
1a8c0 69 6e 74 6f 20 61 6e 20 4f 50 5f 4e 6f 6f 70 2e  into an OP_Noop.
1a8d0 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
1a8e0 61 64 64 72 53 6f 72 74 49 6e 64 65 78 3e 3d 30  addrSortIndex>=0
1a8f0 20 26 26 20 70 4f 72 64 65 72 42 79 3d 3d 30 20   && pOrderBy==0 
1a900 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
1a910 56 64 62 65 43 68 61 6e 67 65 54 6f 4e 6f 6f 70  VdbeChangeToNoop
1a920 28 76 2c 20 61 64 64 72 53 6f 72 74 49 6e 64 65  (v, addrSortInde
1a930 78 2c 20 31 29 3b 0a 20 20 20 20 20 20 70 2d 3e  x, 1);.      p->
1a940 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b 32 5d 20  addrOpenEphm[2] 
1a950 3d 20 2d 31 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  = -1;.    }..   
1a960 20 2f 2a 20 55 73 65 20 74 68 65 20 73 74 61 6e   /* Use the stan
1a970 64 61 72 64 20 69 6e 6e 65 72 20 6c 6f 6f 70 0a  dard inner loop.
1a980 20 20 20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72      */.    asser
1a990 74 28 21 69 73 44 69 73 74 69 6e 63 74 29 3b 0a  t(!isDistinct);.
1a9a0 20 20 20 20 73 65 6c 65 63 74 49 6e 6e 65 72 4c      selectInnerL
1a9b0 6f 6f 70 28 70 50 61 72 73 65 2c 20 70 2c 20 70  oop(pParse, p, p
1a9c0 45 4c 69 73 74 2c 20 30 2c 20 30 2c 20 70 4f 72  EList, 0, 0, pOr
1a9d0 64 65 72 42 79 2c 20 2d 31 2c 20 70 44 65 73 74  derBy, -1, pDest
1a9e0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
1a9f0 20 20 20 20 20 20 70 57 49 6e 66 6f 2d 3e 69 43        pWInfo->iC
1aa00 6f 6e 74 69 6e 75 65 2c 20 70 57 49 6e 66 6f 2d  ontinue, pWInfo-
1aa10 3e 69 42 72 65 61 6b 2c 20 61 66 66 29 3b 0a 0a  >iBreak, aff);..
1aa20 20 20 20 20 2f 2a 20 45 6e 64 20 74 68 65 20 64      /* End the d
1aa30 61 74 61 62 61 73 65 20 73 63 61 6e 20 6c 6f 6f  atabase scan loo
1aa40 70 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73 71  p..    */.    sq
1aa50 6c 69 74 65 33 57 68 65 72 65 45 6e 64 28 70 57  lite3WhereEnd(pW
1aa60 49 6e 66 6f 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  Info);.  }else{.
1aa70 20 20 20 20 2f 2a 20 54 68 69 73 20 69 73 20 74      /* This is t
1aa80 68 65 20 70 72 6f 63 65 73 73 69 6e 67 20 66 6f  he processing fo
1aa90 72 20 61 67 67 72 65 67 61 74 65 20 71 75 65 72  r aggregate quer
1aaa0 69 65 73 20 2a 2f 0a 20 20 20 20 4e 61 6d 65 43  ies */.    NameC
1aab0 6f 6e 74 65 78 74 20 73 4e 43 3b 20 20 20 20 2f  ontext sNC;    /
1aac0 2a 20 4e 61 6d 65 20 63 6f 6e 74 65 78 74 20 66  * Name context f
1aad0 6f 72 20 70 72 6f 63 65 73 73 69 6e 67 20 61 67  or processing ag
1aae0 67 72 65 67 61 74 65 20 69 6e 66 6f 72 6d 61 74  gregate informat
1aaf0 69 6f 6e 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69  ion */.    int i
1ab00 41 4d 65 6d 3b 20 20 20 20 20 20 20 20 20 20 2f  AMem;          /
1ab10 2a 20 46 69 72 73 74 20 4d 65 6d 20 61 64 64 72  * First Mem addr
1ab20 65 73 73 20 66 6f 72 20 73 74 6f 72 69 6e 67 20  ess for storing 
1ab30 63 75 72 72 65 6e 74 20 47 52 4f 55 50 20 42 59  current GROUP BY
1ab40 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 42 4d 65   */.    int iBMe
1ab50 6d 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46  m;          /* F
1ab60 69 72 73 74 20 4d 65 6d 20 61 64 64 72 65 73 73  irst Mem address
1ab70 20 66 6f 72 20 70 72 65 76 69 6f 75 73 20 47 52   for previous GR
1ab80 4f 55 50 20 42 59 20 2a 2f 0a 20 20 20 20 69 6e  OUP BY */.    in
1ab90 74 20 69 55 73 65 46 6c 61 67 3b 20 20 20 20 20  t iUseFlag;     
1aba0 20 20 2f 2a 20 4d 65 6d 20 61 64 64 72 65 73 73    /* Mem address
1abb0 20 68 6f 6c 64 69 6e 67 20 66 6c 61 67 20 69 6e   holding flag in
1abc0 64 69 63 61 74 69 6e 67 20 74 68 61 74 20 61 74  dicating that at
1abd0 20 6c 65 61 73 74 0a 20 20 20 20 20 20 20 20 20   least.         
1abe0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2a                 *
1abf0 2a 20 6f 6e 65 20 72 6f 77 20 6f 66 20 74 68 65  * one row of the
1ac00 20 69 6e 70 75 74 20 74 6f 20 74 68 65 20 61 67   input to the ag
1ac10 67 72 65 67 61 74 6f 72 20 68 61 73 20 62 65 65  gregator has bee
1ac20 6e 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  n.              
1ac30 20 20 20 20 20 20 20 20 20 20 2a 2a 20 70 72 6f            ** pro
1ac40 63 65 73 73 65 64 20 2a 2f 0a 20 20 20 20 69 6e  cessed */.    in
1ac50 74 20 69 41 62 6f 72 74 46 6c 61 67 3b 20 20 20  t iAbortFlag;   
1ac60 20 20 2f 2a 20 4d 65 6d 20 61 64 64 72 65 73 73    /* Mem address
1ac70 20 77 68 69 63 68 20 63 61 75 73 65 73 20 71 75   which causes qu
1ac80 65 72 79 20 61 62 6f 72 74 20 69 66 20 70 6f 73  ery abort if pos
1ac90 69 74 69 76 65 20 2a 2f 0a 20 20 20 20 69 6e 74  itive */.    int
1aca0 20 67 72 6f 75 70 42 79 53 6f 72 74 3b 20 20 20   groupBySort;   
1acb0 20 2f 2a 20 52 6f 77 73 20 63 6f 6d 65 20 66 72   /* Rows come fr
1acc0 6f 6d 20 73 6f 75 72 63 65 20 69 6e 20 47 52 4f  om source in GRO
1acd0 55 50 20 42 59 20 6f 72 64 65 72 20 2a 2f 0a 0a  UP BY order */..
1ace0 0a 20 20 20 20 2f 2a 20 54 68 65 20 66 6f 6c 6c  .    /* The foll
1acf0 6f 77 69 6e 67 20 76 61 72 69 61 62 6c 65 73 20  owing variables 
1ad00 68 6f 6c 64 20 61 64 64 72 65 73 73 65 73 20 6f  hold addresses o
1ad10 72 20 6c 61 62 65 6c 73 20 66 6f 72 20 70 61 72  r labels for par
1ad20 74 73 20 6f 66 20 74 68 65 0a 20 20 20 20 2a 2a  ts of the.    **
1ad30 20 76 69 72 74 75 61 6c 20 6d 61 63 68 69 6e 65   virtual machine
1ad40 20 70 72 6f 67 72 61 6d 20 77 65 20 61 72 65 20   program we are 
1ad50 70 75 74 74 69 6e 67 20 74 6f 67 65 74 68 65 72  putting together
1ad60 20 2a 2f 0a 20 20 20 20 69 6e 74 20 61 64 64 72   */.    int addr
1ad70 4f 75 74 70 75 74 52 6f 77 3b 20 20 20 20 20 20  OutputRow;      
1ad80 2f 2a 20 53 74 61 72 74 20 6f 66 20 73 75 62 72  /* Start of subr
1ad90 6f 75 74 69 6e 65 20 74 68 61 74 20 6f 75 74 70  outine that outp
1ada0 75 74 73 20 61 20 72 65 73 75 6c 74 20 72 6f 77  uts a result row
1adb0 20 2a 2f 0a 20 20 20 20 69 6e 74 20 61 64 64 72   */.    int addr
1adc0 53 65 74 41 62 6f 72 74 3b 20 20 20 20 20 20 20  SetAbort;       
1add0 2f 2a 20 53 65 74 20 74 68 65 20 61 62 6f 72 74  /* Set the abort
1ade0 20 66 6c 61 67 20 61 6e 64 20 72 65 74 75 72 6e   flag and return
1adf0 20 2a 2f 0a 20 20 20 20 69 6e 74 20 61 64 64 72   */.    int addr
1ae00 49 6e 69 74 69 61 6c 69 7a 65 4c 6f 6f 70 3b 20  InitializeLoop; 
1ae10 2f 2a 20 53 74 61 72 74 20 6f 66 20 63 6f 64 65  /* Start of code
1ae20 20 74 68 61 74 20 69 6e 69 74 69 61 6c 69 7a 65   that initialize
1ae30 73 20 74 68 65 20 69 6e 70 75 74 20 6c 6f 6f 70  s the input loop
1ae40 20 2a 2f 0a 20 20 20 20 69 6e 74 20 61 64 64 72   */.    int addr
1ae50 54 6f 70 4f 66 4c 6f 6f 70 3b 20 20 20 20 20 20  TopOfLoop;      
1ae60 2f 2a 20 54 6f 70 20 6f 66 20 74 68 65 20 69 6e  /* Top of the in
1ae70 70 75 74 20 6c 6f 6f 70 20 2a 2f 0a 20 20 20 20  put loop */.    
1ae80 69 6e 74 20 61 64 64 72 47 72 6f 75 70 42 79 43  int addrGroupByC
1ae90 68 61 6e 67 65 3b 20 20 2f 2a 20 43 6f 64 65 20  hange;  /* Code 
1aea0 74 68 61 74 20 72 75 6e 73 20 77 68 65 6e 20 61  that runs when a
1aeb0 6e 79 20 47 52 4f 55 50 20 42 59 20 74 65 72 6d  ny GROUP BY term
1aec0 20 63 68 61 6e 67 65 73 20 2a 2f 0a 20 20 20 20   changes */.    
1aed0 69 6e 74 20 61 64 64 72 50 72 6f 63 65 73 73 52  int addrProcessR
1aee0 6f 77 3b 20 20 20 20 20 2f 2a 20 43 6f 64 65 20  ow;     /* Code 
1aef0 74 6f 20 70 72 6f 63 65 73 73 20 61 20 73 69 6e  to process a sin
1af00 67 6c 65 20 69 6e 70 75 74 20 72 6f 77 20 2a 2f  gle input row */
1af10 0a 20 20 20 20 69 6e 74 20 61 64 64 72 45 6e 64  .    int addrEnd
1af20 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
1af30 45 6e 64 20 6f 66 20 61 6c 6c 20 70 72 6f 63 65  End of all proce
1af40 73 73 69 6e 67 20 2a 2f 0a 20 20 20 20 69 6e 74  ssing */.    int
1af50 20 61 64 64 72 53 6f 72 74 69 6e 67 49 64 78 3b   addrSortingIdx;
1af60 20 20 20 20 20 2f 2a 20 54 68 65 20 4f 50 5f 4f       /* The OP_O
1af70 70 65 6e 45 70 68 65 6d 65 72 61 6c 20 66 6f 72  penEphemeral for
1af80 20 74 68 65 20 73 6f 72 74 69 6e 67 20 69 6e 64   the sorting ind
1af90 65 78 20 2a 2f 0a 20 20 20 20 69 6e 74 20 61 64  ex */.    int ad
1afa0 64 72 52 65 73 65 74 3b 20 20 20 20 20 20 20 20  drReset;        
1afb0 20 20 2f 2a 20 53 75 62 72 6f 75 74 69 6e 65 20    /* Subroutine 
1afc0 66 6f 72 20 72 65 73 65 74 74 69 6e 67 20 74 68  for resetting th
1afd0 65 20 61 63 63 75 6d 75 6c 61 74 6f 72 20 2a 2f  e accumulator */
1afe0 0a 0a 20 20 20 20 61 64 64 72 45 6e 64 20 3d 20  ..    addrEnd = 
1aff0 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c  sqlite3VdbeMakeL
1b000 61 62 65 6c 28 76 29 3b 0a 0a 20 20 20 20 2f 2a  abel(v);..    /*
1b010 20 43 6f 6e 76 65 72 74 20 54 4b 5f 43 4f 4c 55   Convert TK_COLU
1b020 4d 4e 20 6e 6f 64 65 73 20 69 6e 74 6f 20 54 4b  MN nodes into TK
1b030 5f 41 47 47 5f 43 4f 4c 55 4d 4e 20 61 6e 64 20  _AGG_COLUMN and 
1b040 6d 61 6b 65 20 65 6e 74 72 69 65 73 20 69 6e 0a  make entries in.
1b050 20 20 20 20 2a 2a 20 73 41 67 67 49 6e 66 6f 20      ** sAggInfo 
1b060 66 6f 72 20 61 6c 6c 20 54 4b 5f 41 47 47 5f 46  for all TK_AGG_F
1b070 55 4e 43 54 49 4f 4e 20 6e 6f 64 65 73 20 69 6e  UNCTION nodes in
1b080 20 65 78 70 72 65 73 73 69 6f 6e 73 20 6f 66 20   expressions of 
1b090 74 68 65 0a 20 20 20 20 2a 2a 20 53 45 4c 45 43  the.    ** SELEC
1b0a0 54 20 73 74 61 74 65 6d 65 6e 74 2e 0a 20 20 20  T statement..   
1b0b0 20 2a 2f 0a 20 20 20 20 6d 65 6d 73 65 74 28 26   */.    memset(&
1b0c0 73 4e 43 2c 20 30 2c 20 73 69 7a 65 6f 66 28 73  sNC, 0, sizeof(s
1b0d0 4e 43 29 29 3b 0a 20 20 20 20 73 4e 43 2e 70 50  NC));.    sNC.pP
1b0e0 61 72 73 65 20 3d 20 70 50 61 72 73 65 3b 0a 20  arse = pParse;. 
1b0f0 20 20 20 73 4e 43 2e 70 53 72 63 4c 69 73 74 20     sNC.pSrcList 
1b100 3d 20 70 54 61 62 4c 69 73 74 3b 0a 20 20 20 20  = pTabList;.    
1b110 73 4e 43 2e 70 41 67 67 49 6e 66 6f 20 3d 20 26  sNC.pAggInfo = &
1b120 73 41 67 67 49 6e 66 6f 3b 0a 20 20 20 20 73 41  sAggInfo;.    sA
1b130 67 67 49 6e 66 6f 2e 6e 53 6f 72 74 69 6e 67 43  ggInfo.nSortingC
1b140 6f 6c 75 6d 6e 20 3d 20 70 47 72 6f 75 70 42 79  olumn = pGroupBy
1b150 20 3f 20 70 47 72 6f 75 70 42 79 2d 3e 6e 45 78   ? pGroupBy->nEx
1b160 70 72 2b 31 20 3a 20 30 3b 0a 20 20 20 20 73 41  pr+1 : 0;.    sA
1b170 67 67 49 6e 66 6f 2e 70 47 72 6f 75 70 42 79 20  ggInfo.pGroupBy 
1b180 3d 20 70 47 72 6f 75 70 42 79 3b 0a 20 20 20 20  = pGroupBy;.    
1b190 73 71 6c 69 74 65 33 45 78 70 72 41 6e 61 6c 79  sqlite3ExprAnaly
1b1a0 7a 65 41 67 67 4c 69 73 74 28 26 73 4e 43 2c 20  zeAggList(&sNC, 
1b1b0 70 45 4c 69 73 74 29 3b 0a 20 20 20 20 73 71 6c  pEList);.    sql
1b1c0 69 74 65 33 45 78 70 72 41 6e 61 6c 79 7a 65 41  ite3ExprAnalyzeA
1b1d0 67 67 4c 69 73 74 28 26 73 4e 43 2c 20 70 4f 72  ggList(&sNC, pOr
1b1e0 64 65 72 42 79 29 3b 0a 20 20 20 20 69 66 28 20  derBy);.    if( 
1b1f0 70 48 61 76 69 6e 67 20 29 7b 0a 20 20 20 20 20  pHaving ){.     
1b200 20 73 71 6c 69 74 65 33 45 78 70 72 41 6e 61 6c   sqlite3ExprAnal
1b210 79 7a 65 41 67 67 72 65 67 61 74 65 73 28 26 73  yzeAggregates(&s
1b220 4e 43 2c 20 70 48 61 76 69 6e 67 29 3b 0a 20 20  NC, pHaving);.  
1b230 20 20 7d 0a 20 20 20 20 73 41 67 67 49 6e 66 6f    }.    sAggInfo
1b240 2e 6e 41 63 63 75 6d 75 6c 61 74 6f 72 20 3d 20  .nAccumulator = 
1b250 73 41 67 67 49 6e 66 6f 2e 6e 43 6f 6c 75 6d 6e  sAggInfo.nColumn
1b260 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  ;.    for(i=0; i
1b270 3c 73 41 67 67 49 6e 66 6f 2e 6e 46 75 6e 63 3b  <sAggInfo.nFunc;
1b280 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 73 71 6c   i++){.      sql
1b290 69 74 65 33 45 78 70 72 41 6e 61 6c 79 7a 65 41  ite3ExprAnalyzeA
1b2a0 67 67 4c 69 73 74 28 26 73 4e 43 2c 20 73 41 67  ggList(&sNC, sAg
1b2b0 67 49 6e 66 6f 2e 61 46 75 6e 63 5b 69 5d 2e 70  gInfo.aFunc[i].p
1b2c0 45 78 70 72 2d 3e 70 4c 69 73 74 29 3b 0a 20 20  Expr->pList);.  
1b2d0 20 20 7d 0a 20 20 20 20 69 66 28 20 64 62 2d 3e    }.    if( db->
1b2e0 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20 67  mallocFailed ) g
1b2f0 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a  oto select_end;.
1b300 0a 20 20 20 20 2f 2a 20 50 72 6f 63 65 73 73 69  .    /* Processi
1b310 6e 67 20 66 6f 72 20 61 67 67 72 65 67 61 74 65  ng for aggregate
1b320 73 20 77 69 74 68 20 47 52 4f 55 50 20 42 59 20  s with GROUP BY 
1b330 69 73 20 76 65 72 79 20 64 69 66 66 65 72 65 6e  is very differen
1b340 74 20 61 6e 64 0a 20 20 20 20 2a 2a 20 6d 75 63  t and.    ** muc
1b350 68 20 6d 6f 72 65 20 63 6f 6d 70 6c 65 78 20 74  h more complex t
1b360 68 61 6e 20 61 67 67 72 65 67 61 74 65 73 20 77  han aggregates w
1b370 69 74 68 6f 75 74 20 61 20 47 52 4f 55 50 20 42  ithout a GROUP B
1b380 59 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  Y..    */.    if
1b390 28 20 70 47 72 6f 75 70 42 79 20 29 7b 0a 20 20  ( pGroupBy ){.  
1b3a0 20 20 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65      KeyInfo *pKe
1b3b0 79 49 6e 66 6f 3b 20 20 2f 2a 20 4b 65 79 69 6e  yInfo;  /* Keyin
1b3c0 67 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 6f  g information fo
1b3d0 72 20 74 68 65 20 67 72 6f 75 70 20 62 79 20 63  r the group by c
1b3e0 6c 61 75 73 65 20 2a 2f 0a 0a 20 20 20 20 20 20  lause */..      
1b3f0 2f 2a 20 43 72 65 61 74 65 20 6c 61 62 65 6c 73  /* Create labels
1b400 20 74 68 61 74 20 77 65 20 77 69 6c 6c 20 62 65   that we will be
1b410 20 6e 65 65 64 69 6e 67 0a 20 20 20 20 20 20 2a   needing.      *
1b420 2f 0a 20 20 20 20 20 0a 20 20 20 20 20 20 61 64  /.     .      ad
1b430 64 72 49 6e 69 74 69 61 6c 69 7a 65 4c 6f 6f 70  drInitializeLoop
1b440 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61   = sqlite3VdbeMa
1b450 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20  keLabel(v);.    
1b460 20 20 61 64 64 72 47 72 6f 75 70 42 79 43 68 61    addrGroupByCha
1b470 6e 67 65 20 3d 20 73 71 6c 69 74 65 33 56 64 62  nge = sqlite3Vdb
1b480 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20  eMakeLabel(v);. 
1b490 20 20 20 20 20 61 64 64 72 50 72 6f 63 65 73 73       addrProcess
1b4a0 52 6f 77 20 3d 20 73 71 6c 69 74 65 33 56 64 62  Row = sqlite3Vdb
1b4b0 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 0a  eMakeLabel(v);..
1b4c0 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 72        /* If ther
1b4d0 65 20 69 73 20 61 20 47 52 4f 55 50 20 42 59 20  e is a GROUP BY 
1b4e0 63 6c 61 75 73 65 20 77 65 20 6d 69 67 68 74 20  clause we might 
1b4f0 6e 65 65 64 20 61 20 73 6f 72 74 69 6e 67 20 69  need a sorting i
1b500 6e 64 65 78 20 74 6f 0a 20 20 20 20 20 20 2a 2a  ndex to.      **
1b510 20 69 6d 70 6c 65 6d 65 6e 74 20 69 74 2e 20 20   implement it.  
1b520 41 6c 6c 6f 63 61 74 65 20 74 68 61 74 20 73 6f  Allocate that so
1b530 72 74 69 6e 67 20 69 6e 64 65 78 20 6e 6f 77 2e  rting index now.
1b540 20 20 49 66 20 69 74 20 74 75 72 6e 73 20 6f 75    If it turns ou
1b550 74 0a 20 20 20 20 20 20 2a 2a 20 74 68 61 74 20  t.      ** that 
1b560 77 65 20 64 6f 20 6e 6f 74 20 6e 65 65 64 20 69  we do not need i
1b570 74 20 61 66 74 65 72 20 61 6c 6c 2c 20 74 68 65  t after all, the
1b580 20 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 20 69   OpenEphemeral i
1b590 6e 73 74 72 75 63 74 69 6f 6e 0a 20 20 20 20 20  nstruction.     
1b5a0 20 2a 2a 20 77 69 6c 6c 20 62 65 20 63 6f 6e 76   ** will be conv
1b5b0 65 72 74 65 64 20 69 6e 74 6f 20 61 20 4e 6f 6f  erted into a Noo
1b5c0 70 2e 20 20 0a 20 20 20 20 20 20 2a 2f 0a 20 20  p.  .      */.  
1b5d0 20 20 20 20 73 41 67 67 49 6e 66 6f 2e 73 6f 72      sAggInfo.sor
1b5e0 74 69 6e 67 49 64 78 20 3d 20 70 50 61 72 73 65  tingIdx = pParse
1b5f0 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20 20 20  ->nTab++;.      
1b600 70 4b 65 79 49 6e 66 6f 20 3d 20 6b 65 79 49 6e  pKeyInfo = keyIn
1b610 66 6f 46 72 6f 6d 45 78 70 72 4c 69 73 74 28 70  foFromExprList(p
1b620 50 61 72 73 65 2c 20 70 47 72 6f 75 70 42 79 29  Parse, pGroupBy)
1b630 3b 0a 20 20 20 20 20 20 61 64 64 72 53 6f 72 74  ;.      addrSort
1b640 69 6e 67 49 64 78 20 3d 0a 20 20 20 20 20 20 20  ingIdx =.       
1b650 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
1b660 64 4f 70 34 28 76 2c 20 4f 50 5f 4f 70 65 6e 45  dOp4(v, OP_OpenE
1b670 70 68 65 6d 65 72 61 6c 2c 20 73 41 67 67 49 6e  phemeral, sAggIn
1b680 66 6f 2e 73 6f 72 74 69 6e 67 49 64 78 2c 0a 20  fo.sortingIdx,. 
1b690 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b6a0 20 20 20 20 20 20 20 20 73 41 67 67 49 6e 66 6f          sAggInfo
1b6b0 2e 6e 53 6f 72 74 69 6e 67 43 6f 6c 75 6d 6e 2c  .nSortingColumn,
1b6c0 20 30 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20   0,.            
1b6d0 20 20 20 20 20 20 20 20 20 20 20 20 20 28 63 68               (ch
1b6e0 61 72 2a 29 70 4b 65 79 49 6e 66 6f 2c 20 50 34  ar*)pKeyInfo, P4
1b6f0 5f 4b 45 59 49 4e 46 4f 5f 48 41 4e 44 4f 46 46  _KEYINFO_HANDOFF
1b700 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 49 6e 69  );..      /* Ini
1b710 74 69 61 6c 69 7a 65 20 6d 65 6d 6f 72 79 20 6c  tialize memory l
1b720 6f 63 61 74 69 6f 6e 73 20 75 73 65 64 20 62 79  ocations used by
1b730 20 47 52 4f 55 50 20 42 59 20 61 67 67 72 65 67   GROUP BY aggreg
1b740 61 74 65 20 70 72 6f 63 65 73 73 69 6e 67 0a 20  ate processing. 
1b750 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 55       */.      iU
1b760 73 65 46 6c 61 67 20 3d 20 2b 2b 70 50 61 72 73  seFlag = ++pPars
1b770 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 69  e->nMem;.      i
1b780 41 62 6f 72 74 46 6c 61 67 20 3d 20 2b 2b 70 50  AbortFlag = ++pP
1b790 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20  arse->nMem;.    
1b7a0 20 20 69 41 4d 65 6d 20 3d 20 70 50 61 72 73 65    iAMem = pParse
1b7b0 2d 3e 6e 4d 65 6d 20 2b 20 31 3b 0a 20 20 20 20  ->nMem + 1;.    
1b7c0 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b    pParse->nMem +
1b7d0 3d 20 70 47 72 6f 75 70 42 79 2d 3e 6e 45 78 70  = pGroupBy->nExp
1b7e0 72 3b 0a 20 20 20 20 20 20 69 42 4d 65 6d 20 3d  r;.      iBMem =
1b7f0 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 20   pParse->nMem + 
1b800 31 3b 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d  1;.      pParse-
1b810 3e 6e 4d 65 6d 20 2b 3d 20 70 47 72 6f 75 70 42  >nMem += pGroupB
1b820 79 2d 3e 6e 45 78 70 72 3b 0a 20 20 20 20 20 20  y->nExpr;.      
1b830 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
1b840 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c  2(v, OP_Integer,
1b850 20 30 2c 20 69 41 62 6f 72 74 46 6c 61 67 29 3b   0, iAbortFlag);
1b860 0a 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65  .      VdbeComme
1b870 6e 74 28 28 76 2c 20 22 63 6c 65 61 72 20 61 62  nt((v, "clear ab
1b880 6f 72 74 20 66 6c 61 67 22 29 29 3b 0a 20 20 20  ort flag"));.   
1b890 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
1b8a0 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67  dOp2(v, OP_Integ
1b8b0 65 72 2c 20 30 2c 20 69 55 73 65 46 6c 61 67 29  er, 0, iUseFlag)
1b8c0 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d  ;.      VdbeComm
1b8d0 65 6e 74 28 28 76 2c 20 22 69 6e 64 69 63 61 74  ent((v, "indicat
1b8e0 65 20 61 63 63 75 6d 75 6c 61 74 6f 72 20 65 6d  e accumulator em
1b8f0 70 74 79 22 29 29 3b 0a 20 20 20 20 20 20 73 71  pty"));.      sq
1b900 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
1b910 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 61  v, OP_Goto, 0, a
1b920 64 64 72 49 6e 69 74 69 61 6c 69 7a 65 4c 6f 6f  ddrInitializeLoo
1b930 70 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 47 65  p);..      /* Ge
1b940 6e 65 72 61 74 65 20 61 20 73 75 62 72 6f 75 74  nerate a subrout
1b950 69 6e 65 20 74 68 61 74 20 6f 75 74 70 75 74 73  ine that outputs
1b960 20 61 20 73 69 6e 67 6c 65 20 72 6f 77 20 6f 66   a single row of
1b970 20 74 68 65 20 72 65 73 75 6c 74 0a 20 20 20 20   the result.    
1b980 20 20 2a 2a 20 73 65 74 2e 20 20 54 68 69 73 20    ** set.  This 
1b990 73 75 62 72 6f 75 74 69 6e 65 20 66 69 72 73 74  subroutine first
1b9a0 20 6c 6f 6f 6b 73 20 61 74 20 74 68 65 20 69 55   looks at the iU
1b9b0 73 65 46 6c 61 67 2e 20 20 49 66 20 69 55 73 65  seFlag.  If iUse
1b9c0 46 6c 61 67 0a 20 20 20 20 20 20 2a 2a 20 69 73  Flag.      ** is
1b9d0 20 6c 65 73 73 20 74 68 61 6e 20 6f 72 20 65 71   less than or eq
1b9e0 75 61 6c 20 74 6f 20 7a 65 72 6f 2c 20 74 68 65  ual to zero, the
1b9f0 20 73 75 62 72 6f 75 74 69 6e 65 20 69 73 20 61   subroutine is a
1ba00 20 6e 6f 2d 6f 70 2e 20 20 49 66 0a 20 20 20 20   no-op.  If.    
1ba10 20 20 2a 2a 20 74 68 65 20 70 72 6f 63 65 73 73    ** the process
1ba20 69 6e 67 20 63 61 6c 6c 73 20 66 6f 72 20 74 68  ing calls for th
1ba30 65 20 71 75 65 72 79 20 74 6f 20 61 62 6f 72 74  e query to abort
1ba40 2c 20 74 68 69 73 20 73 75 62 72 6f 75 74 69 6e  , this subroutin
1ba50 65 0a 20 20 20 20 20 20 2a 2a 20 69 6e 63 72 65  e.      ** incre
1ba60 6d 65 6e 74 73 20 74 68 65 20 69 41 62 6f 72 74  ments the iAbort
1ba70 46 6c 61 67 20 6d 65 6d 6f 72 79 20 6c 6f 63 61  Flag memory loca
1ba80 74 69 6f 6e 20 62 65 66 6f 72 65 20 72 65 74 75  tion before retu
1ba90 72 6e 69 6e 67 20 69 6e 0a 20 20 20 20 20 20 2a  rning in.      *
1baa0 2a 20 6f 72 64 65 72 20 74 6f 20 73 69 67 6e 61  * order to signa
1bab0 6c 20 74 68 65 20 63 61 6c 6c 65 72 20 74 6f 20  l the caller to 
1bac0 61 62 6f 72 74 2e 0a 20 20 20 20 20 20 2a 2f 0a  abort..      */.
1bad0 20 20 20 20 20 20 61 64 64 72 53 65 74 41 62 6f        addrSetAbo
1bae0 72 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  rt = sqlite3Vdbe
1baf0 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b 0a  CurrentAddr(v);.
1bb00 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
1bb10 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e  eAddOp2(v, OP_In
1bb20 74 65 67 65 72 2c 20 31 2c 20 69 41 62 6f 72 74  teger, 1, iAbort
1bb30 46 6c 61 67 29 3b 0a 20 20 20 20 20 20 56 64 62  Flag);.      Vdb
1bb40 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 73 65  eComment((v, "se
1bb50 74 20 61 62 6f 72 74 20 66 6c 61 67 22 29 29 3b  t abort flag"));
1bb60 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
1bb70 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52  beAddOp2(v, OP_R
1bb80 65 74 75 72 6e 2c 20 30 2c 20 30 29 3b 0a 20 20  eturn, 0, 0);.  
1bb90 20 20 20 20 61 64 64 72 4f 75 74 70 75 74 52 6f      addrOutputRo
1bba0 77 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43  w = sqlite3VdbeC
1bbb0 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 20  urrentAddr(v);. 
1bbc0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
1bbd0 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 66 50  AddOp2(v, OP_IfP
1bbe0 6f 73 2c 20 69 55 73 65 46 6c 61 67 2c 20 61 64  os, iUseFlag, ad
1bbf0 64 72 4f 75 74 70 75 74 52 6f 77 2b 32 29 3b 0a  drOutputRow+2);.
1bc00 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e        VdbeCommen
1bc10 74 28 28 76 2c 20 22 47 72 6f 75 70 62 79 20 72  t((v, "Groupby r
1bc20 65 73 75 6c 74 20 67 65 6e 65 72 61 74 6f 72 20  esult generator 
1bc30 65 6e 74 72 79 20 70 6f 69 6e 74 22 29 29 3b 0a  entry point"));.
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 32 28 76 2c 20 4f 50 5f 52 65  eAddOp2(v, OP_Re
1bc60 74 75 72 6e 2c 20 30 2c 20 30 29 3b 0a 20 20 20  turn, 0, 0);.   
1bc70 20 20 20 66 69 6e 61 6c 69 7a 65 41 67 67 46 75     finalizeAggFu
1bc80 6e 63 74 69 6f 6e 73 28 70 50 61 72 73 65 2c 20  nctions(pParse, 
1bc90 26 73 41 67 67 49 6e 66 6f 29 3b 0a 20 20 20 20  &sAggInfo);.    
1bca0 20 20 69 66 28 20 70 48 61 76 69 6e 67 20 29 7b    if( pHaving ){
1bcb0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
1bcc0 45 78 70 72 49 66 46 61 6c 73 65 28 70 50 61 72  ExprIfFalse(pPar
1bcd0 73 65 2c 20 70 48 61 76 69 6e 67 2c 20 61 64 64  se, pHaving, add
1bce0 72 4f 75 74 70 75 74 52 6f 77 2b 31 2c 20 53 51  rOutputRow+1, SQ
1bcf0 4c 49 54 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c 29  LITE_JUMPIFNULL)
1bd00 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
1bd10 73 65 6c 65 63 74 49 6e 6e 65 72 4c 6f 6f 70 28  selectInnerLoop(
1bd20 70 50 61 72 73 65 2c 20 70 2c 20 70 2d 3e 70 45  pParse, p, p->pE
1bd30 4c 69 73 74 2c 20 30 2c 20 30 2c 20 70 4f 72 64  List, 0, 0, pOrd
1bd40 65 72 42 79 2c 0a 20 20 20 20 20 20 20 20 20 20  erBy,.          
1bd50 20 20 20 20 20 20 20 20 20 20 20 20 64 69 73 74              dist
1bd60 69 6e 63 74 2c 20 70 44 65 73 74 2c 0a 20 20 20  inct, pDest,.   
1bd70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bd80 20 20 20 61 64 64 72 4f 75 74 70 75 74 52 6f 77     addrOutputRow
1bd90 2b 31 2c 20 61 64 64 72 53 65 74 41 62 6f 72 74  +1, addrSetAbort
1bda0 2c 20 61 66 66 29 3b 0a 20 20 20 20 20 20 73 71  , aff);.      sq
1bdb0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
1bdc0 76 2c 20 4f 50 5f 52 65 74 75 72 6e 2c 20 30 2c  v, OP_Return, 0,
1bdd0 20 30 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43   0);.      VdbeC
1bde0 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 65 6e 64 20  omment((v, "end 
1bdf0 67 72 6f 75 70 62 79 20 72 65 73 75 6c 74 20 67  groupby result g
1be00 65 6e 65 72 61 74 6f 72 22 29 29 3b 0a 0a 20 20  enerator"));..  
1be10 20 20 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20      /* Generate 
1be20 61 20 73 75 62 72 6f 75 74 69 6e 65 20 74 68 61  a subroutine tha
1be30 74 20 77 69 6c 6c 20 72 65 73 65 74 20 74 68 65  t will reset the
1be40 20 67 72 6f 75 70 2d 62 79 20 61 63 63 75 6d 75   group-by accumu
1be50 6c 61 74 6f 72 0a 20 20 20 20 20 20 2a 2f 0a 20  lator.      */. 
1be60 20 20 20 20 20 61 64 64 72 52 65 73 65 74 20 3d       addrReset =
1be70 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72   sqlite3VdbeCurr
1be80 65 6e 74 41 64 64 72 28 76 29 3b 0a 20 20 20 20  entAddr(v);.    
1be90 20 20 72 65 73 65 74 41 63 63 75 6d 75 6c 61 74    resetAccumulat
1bea0 6f 72 28 70 50 61 72 73 65 2c 20 26 73 41 67 67  or(pParse, &sAgg
1beb0 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20 73 71 6c  Info);.      sql
1bec0 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
1bed0 2c 20 4f 50 5f 52 65 74 75 72 6e 2c 20 30 2c 20  , OP_Return, 0, 
1bee0 30 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 42 65  0);..      /* Be
1bef0 67 69 6e 20 61 20 6c 6f 6f 70 20 74 68 61 74 20  gin a loop that 
1bf00 77 69 6c 6c 20 65 78 74 72 61 63 74 20 61 6c 6c  will extract all
1bf10 20 73 6f 75 72 63 65 20 72 6f 77 73 20 69 6e 20   source rows in 
1bf20 47 52 4f 55 50 20 42 59 20 6f 72 64 65 72 2e 0a  GROUP BY order..
1bf30 20 20 20 20 20 20 2a 2a 20 54 68 69 73 20 6d 69        ** This mi
1bf40 67 68 74 20 69 6e 76 6f 6c 76 65 20 74 77 6f 20  ght involve two 
1bf50 73 65 70 61 72 61 74 65 20 6c 6f 6f 70 73 20 77  separate loops w
1bf60 69 74 68 20 61 6e 20 4f 50 5f 53 6f 72 74 20 69  ith an OP_Sort i
1bf70 6e 20 62 65 74 77 65 65 6e 2c 20 6f 72 0a 20 20  n between, or.  
1bf80 20 20 20 20 2a 2a 20 69 74 20 6d 69 67 68 74 20      ** it might 
1bf90 62 65 20 61 20 73 69 6e 67 6c 65 20 6c 6f 6f 70  be a single loop
1bfa0 20 74 68 61 74 20 75 73 65 73 20 61 6e 20 69 6e   that uses an in
1bfb0 64 65 78 20 74 6f 20 65 78 74 72 61 63 74 20 69  dex to extract i
1bfc0 6e 66 6f 72 6d 61 74 69 6f 6e 0a 20 20 20 20 20  nformation.     
1bfd0 20 2a 2a 20 69 6e 20 74 68 65 20 72 69 67 68 74   ** in the right
1bfe0 20 6f 72 64 65 72 20 74 6f 20 62 65 67 69 6e 20   order to begin 
1bff0 77 69 74 68 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  with..      */. 
1c000 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
1c010 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20  ResolveLabel(v, 
1c020 61 64 64 72 49 6e 69 74 69 61 6c 69 7a 65 4c 6f  addrInitializeLo
1c030 6f 70 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  op);.      sqlit
1c040 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
1c050 4f 50 5f 47 6f 73 75 62 2c 20 30 2c 20 61 64 64  OP_Gosub, 0, add
1c060 72 52 65 73 65 74 29 3b 0a 20 20 20 20 20 20 70  rReset);.      p
1c070 57 49 6e 66 6f 20 3d 20 73 71 6c 69 74 65 33 57  WInfo = sqlite3W
1c080 68 65 72 65 42 65 67 69 6e 28 70 50 61 72 73 65  hereBegin(pParse
1c090 2c 20 70 54 61 62 4c 69 73 74 2c 20 70 57 68 65  , pTabList, pWhe
1c0a0 72 65 2c 20 26 70 47 72 6f 75 70 42 79 2c 20 30  re, &pGroupBy, 0
1c0b0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 57 49  );.      if( pWI
1c0c0 6e 66 6f 3d 3d 30 20 29 20 67 6f 74 6f 20 73 65  nfo==0 ) goto se
1c0d0 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 20 20  lect_end;.      
1c0e0 69 66 28 20 70 47 72 6f 75 70 42 79 3d 3d 30 20  if( pGroupBy==0 
1c0f0 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68  ){.        /* Th
1c100 65 20 6f 70 74 69 6d 69 7a 65 72 20 69 73 20 61  e optimizer is a
1c110 62 6c 65 20 74 6f 20 64 65 6c 69 76 65 72 20 72  ble to deliver r
1c120 6f 77 73 20 69 6e 20 67 72 6f 75 70 20 62 79 20  ows in group by 
1c130 6f 72 64 65 72 20 73 6f 0a 20 20 20 20 20 20 20  order so.       
1c140 20 2a 2a 20 77 65 20 64 6f 20 6e 6f 74 20 68 61   ** we do not ha
1c150 76 65 20 74 6f 20 73 6f 72 74 2e 20 20 54 68 65  ve to sort.  The
1c160 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61   OP_OpenEphemera
1c170 6c 20 74 61 62 6c 65 20 77 69 6c 6c 20 62 65 0a  l table will be.
1c180 20 20 20 20 20 20 20 20 2a 2a 20 63 61 6e 63 65          ** cance
1c190 6c 6c 65 64 20 6c 61 74 65 72 20 62 65 63 61 75  lled later becau
1c1a0 73 65 20 77 65 20 73 74 69 6c 6c 20 6e 65 65 64  se we still need
1c1b0 20 74 6f 20 75 73 65 20 74 68 65 20 70 4b 65 79   to use the pKey
1c1c0 49 6e 66 6f 0a 20 20 20 20 20 20 20 20 2a 2f 0a  Info.        */.
1c1d0 20 20 20 20 20 20 20 20 70 47 72 6f 75 70 42 79          pGroupBy
1c1e0 20 3d 20 70 2d 3e 70 47 72 6f 75 70 42 79 3b 0a   = p->pGroupBy;.
1c1f0 20 20 20 20 20 20 20 20 67 72 6f 75 70 42 79 53          groupByS
1c200 6f 72 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d  ort = 0;.      }
1c210 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 2f 2a  else{.        /*
1c220 20 52 6f 77 73 20 61 72 65 20 63 6f 6d 69 6e 67   Rows are coming
1c230 20 6f 75 74 20 69 6e 20 75 6e 64 65 74 65 72 6d   out in undeterm
1c240 69 6e 65 64 20 6f 72 64 65 72 2e 20 20 57 65 20  ined order.  We 
1c250 68 61 76 65 20 74 6f 20 70 75 73 68 0a 20 20 20  have to push.   
1c260 20 20 20 20 20 2a 2a 20 65 61 63 68 20 72 6f 77       ** each row
1c270 20 69 6e 74 6f 20 61 20 73 6f 72 74 69 6e 67 20   into a sorting 
1c280 69 6e 64 65 78 2c 20 74 65 72 6d 69 6e 61 74 65  index, terminate
1c290 20 74 68 65 20 66 69 72 73 74 20 6c 6f 6f 70 2c   the first loop,
1c2a0 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65 6e  .        ** then
1c2b0 20 6c 6f 6f 70 20 6f 76 65 72 20 74 68 65 20 73   loop over the s
1c2c0 6f 72 74 69 6e 67 20 69 6e 64 65 78 20 69 6e 20  orting index in 
1c2d0 6f 72 64 65 72 20 74 6f 20 67 65 74 20 74 68 65  order to get the
1c2e0 20 6f 75 74 70 75 74 0a 20 20 20 20 20 20 20 20   output.        
1c2f0 2a 2a 20 69 6e 20 73 6f 72 74 65 64 20 6f 72 64  ** in sorted ord
1c300 65 72 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  er.        */.  
1c310 20 20 20 20 20 20 69 6e 74 20 72 65 67 42 61 73        int regBas
1c320 65 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 72  e;.        int r
1c330 65 67 52 65 63 6f 72 64 3b 0a 20 20 20 20 20 20  egRecord;.      
1c340 20 20 69 6e 74 20 6e 43 6f 6c 3b 0a 20 20 20 20    int nCol;.    
1c350 20 20 20 20 69 6e 74 20 6e 47 72 6f 75 70 42 79      int nGroupBy
1c360 3b 0a 0a 20 20 20 20 20 20 20 20 67 72 6f 75 70  ;..        group
1c370 42 79 53 6f 72 74 20 3d 20 31 3b 0a 20 20 20 20  BySort = 1;.    
1c380 20 20 20 20 6e 47 72 6f 75 70 42 79 20 3d 20 70      nGroupBy = p
1c390 47 72 6f 75 70 42 79 2d 3e 6e 45 78 70 72 3b 0a  GroupBy->nExpr;.
1c3a0 20 20 20 20 20 20 20 20 6e 43 6f 6c 20 3d 20 6e          nCol = n
1c3b0 47 72 6f 75 70 42 79 20 2b 20 31 3b 0a 20 20 20  GroupBy + 1;.   
1c3c0 20 20 20 20 20 6a 20 3d 20 6e 47 72 6f 75 70 42       j = nGroupB
1c3d0 79 2b 31 3b 0a 20 20 20 20 20 20 20 20 66 6f 72  y+1;.        for
1c3e0 28 69 3d 30 3b 20 69 3c 73 41 67 67 49 6e 66 6f  (i=0; i<sAggInfo
1c3f0 2e 6e 43 6f 6c 75 6d 6e 3b 20 69 2b 2b 29 7b 0a  .nColumn; i++){.
1c400 20 20 20 20 20 20 20 20 20 20 69 66 28 20 73 41            if( sA
1c410 67 67 49 6e 66 6f 2e 61 43 6f 6c 5b 69 5d 2e 69  ggInfo.aCol[i].i
1c420 53 6f 72 74 65 72 43 6f 6c 75 6d 6e 3e 3d 6a 20  SorterColumn>=j 
1c430 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 6e  ){.            n
1c440 43 6f 6c 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20  Col++;.         
1c450 20 20 20 6a 2b 2b 3b 0a 20 20 20 20 20 20 20 20     j++;.        
1c460 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20    }.        }.  
1c470 20 20 20 20 20 20 72 65 67 42 61 73 65 20 3d 20        regBase = 
1c480 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 61  sqlite3GetTempRa
1c490 6e 67 65 28 70 50 61 72 73 65 2c 20 6e 43 6f 6c  nge(pParse, nCol
1c4a0 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
1c4b0 65 33 45 78 70 72 43 6f 64 65 45 78 70 72 4c 69  e3ExprCodeExprLi
1c4c0 73 74 28 70 50 61 72 73 65 2c 20 70 47 72 6f 75  st(pParse, pGrou
1c4d0 70 42 79 2c 20 72 65 67 42 61 73 65 29 3b 0a 20  pBy, regBase);. 
1c4e0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
1c4f0 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 53  beAddOp2(v, OP_S
1c500 65 71 75 65 6e 63 65 2c 20 73 41 67 67 49 6e 66  equence, sAggInf
1c510 6f 2e 73 6f 72 74 69 6e 67 49 64 78 2c 72 65 67  o.sortingIdx,reg
1c520 42 61 73 65 2b 6e 47 72 6f 75 70 42 79 29 3b 0a  Base+nGroupBy);.
1c530 20 20 20 20 20 20 20 20 6a 20 3d 20 6e 47 72 6f          j = nGro
1c540 75 70 42 79 2b 31 3b 0a 20 20 20 20 20 20 20 20  upBy+1;.        
1c550 66 6f 72 28 69 3d 30 3b 20 69 3c 73 41 67 67 49  for(i=0; i<sAggI
1c560 6e 66 6f 2e 6e 43 6f 6c 75 6d 6e 3b 20 69 2b 2b  nfo.nColumn; i++
1c570 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 74 72  ){.          str
1c580 75 63 74 20 41 67 67 49 6e 66 6f 5f 63 6f 6c 20  uct AggInfo_col 
1c590 2a 70 43 6f 6c 20 3d 20 26 73 41 67 67 49 6e 66  *pCol = &sAggInf
1c5a0 6f 2e 61 43 6f 6c 5b 69 5d 3b 0a 20 20 20 20 20  o.aCol[i];.     
1c5b0 20 20 20 20 20 69 66 28 20 70 43 6f 6c 2d 3e 69       if( pCol->i
1c5c0 53 6f 72 74 65 72 43 6f 6c 75 6d 6e 3e 3d 6a 20  SorterColumn>=j 
1c5d0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73  ){.            s
1c5e0 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 47 65  qlite3ExprCodeGe
1c5f0 74 43 6f 6c 75 6d 6e 28 76 2c 20 70 43 6f 6c 2d  tColumn(v, pCol-
1c600 3e 70 54 61 62 2c 20 70 43 6f 6c 2d 3e 69 43 6f  >pTab, pCol->iCo
1c610 6c 75 6d 6e 2c 20 70 43 6f 6c 2d 3e 69 54 61 62  lumn, pCol->iTab
1c620 6c 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  le,.            
1c630 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c640 20 20 20 20 20 20 20 20 20 6a 20 2b 20 72 65 67           j + reg
1c650 42 61 73 65 29 3b 0a 20 20 20 20 20 20 20 20 20  Base);.         
1c660 20 20 20 6a 2b 2b 3b 0a 20 20 20 20 20 20 20 20     j++;.        
1c670 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20    }.        }.  
1c680 20 20 20 20 20 20 72 65 67 52 65 63 6f 72 64 20        regRecord 
1c690 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70  = sqlite3GetTemp
1c6a0 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20 20  Reg(pParse);.   
1c6b0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
1c6c0 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4d 61 6b  AddOp3(v, OP_Mak
1c6d0 65 52 65 63 6f 72 64 2c 20 72 65 67 42 61 73 65  eRecord, regBase
1c6e0 2c 20 6e 43 6f 6c 2c 20 72 65 67 52 65 63 6f 72  , nCol, regRecor
1c6f0 64 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  d);.        sqli
1c700 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
1c710 20 4f 50 5f 49 64 78 49 6e 73 65 72 74 2c 20 73   OP_IdxInsert, s
1c720 41 67 67 49 6e 66 6f 2e 73 6f 72 74 69 6e 67 49  AggInfo.sortingI
1c730 64 78 2c 20 72 65 67 52 65 63 6f 72 64 29 3b 0a  dx, regRecord);.
1c740 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 52          sqlite3R
1c750 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50  eleaseTempReg(pP
1c760 61 72 73 65 2c 20 72 65 67 52 65 63 6f 72 64 29  arse, regRecord)
1c770 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
1c780 33 52 65 6c 65 61 73 65 54 65 6d 70 52 61 6e 67  3ReleaseTempRang
1c790 65 28 70 50 61 72 73 65 2c 20 72 65 67 42 61 73  e(pParse, regBas
1c7a0 65 2c 20 6e 43 6f 6c 29 3b 0a 20 20 20 20 20 20  e, nCol);.      
1c7b0 20 20 73 71 6c 69 74 65 33 57 68 65 72 65 45 6e    sqlite3WhereEn
1c7c0 64 28 70 57 49 6e 66 6f 29 3b 0a 20 20 20 20 20  d(pWInfo);.     
1c7d0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
1c7e0 64 4f 70 32 28 76 2c 20 4f 50 5f 53 6f 72 74 2c  dOp2(v, OP_Sort,
1c7f0 20 73 41 67 67 49 6e 66 6f 2e 73 6f 72 74 69 6e   sAggInfo.sortin
1c800 67 49 64 78 2c 20 61 64 64 72 45 6e 64 29 3b 0a  gIdx, addrEnd);.
1c810 20 20 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d          VdbeComm
1c820 65 6e 74 28 28 76 2c 20 22 47 52 4f 55 50 20 42  ent((v, "GROUP B
1c830 59 20 73 6f 72 74 22 29 29 3b 0a 20 20 20 20 20  Y sort"));.     
1c840 20 20 20 73 41 67 67 49 6e 66 6f 2e 75 73 65 53     sAggInfo.useS
1c850 6f 72 74 69 6e 67 49 64 78 20 3d 20 31 3b 0a 20  ortingIdx = 1;. 
1c860 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a       }..      /*
1c870 20 45 76 61 6c 75 61 74 65 20 74 68 65 20 63 75   Evaluate the cu
1c880 72 72 65 6e 74 20 47 52 4f 55 50 20 42 59 20 74  rrent GROUP BY t
1c890 65 72 6d 73 20 61 6e 64 20 73 74 6f 72 65 20 69  erms and store i
1c8a0 6e 20 62 30 2c 20 62 31 2c 20 62 32 2e 2e 2e 0a  n b0, b1, b2....
1c8b0 20 20 20 20 20 20 2a 2a 20 28 62 30 20 69 73 20        ** (b0 is 
1c8c0 6d 65 6d 6f 72 79 20 6c 6f 63 61 74 69 6f 6e 20  memory location 
1c8d0 69 42 4d 65 6d 2b 30 2c 20 62 31 20 69 73 20 69  iBMem+0, b1 is i
1c8e0 42 4d 65 6d 2b 31 2c 20 61 6e 64 20 73 6f 20 66  BMem+1, and so f
1c8f0 6f 72 74 68 29 0a 20 20 20 20 20 20 2a 2a 20 54  orth).      ** T
1c900 68 65 6e 20 63 6f 6d 70 61 72 65 20 74 68 65 20  hen compare the 
1c910 63 75 72 72 65 6e 74 20 47 52 4f 55 50 20 42 59  current GROUP BY
1c920 20 74 65 72 6d 73 20 61 67 61 69 6e 73 74 20 74   terms against t
1c930 68 65 20 47 52 4f 55 50 20 42 59 20 74 65 72 6d  he GROUP BY term
1c940 73 0a 20 20 20 20 20 20 2a 2a 20 66 72 6f 6d 20  s.      ** from 
1c950 74 68 65 20 70 72 65 76 69 6f 75 73 20 72 6f 77  the previous row
1c960 20 63 75 72 72 65 6e 74 6c 79 20 73 74 6f 72 65   currently store
1c970 64 20 69 6e 20 61 30 2c 20 61 31 2c 20 61 32 2e  d in a0, a1, a2.
1c980 2e 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  ...      */.    
1c990 20 20 61 64 64 72 54 6f 70 4f 66 4c 6f 6f 70 20    addrTopOfLoop 
1c9a0 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72  = sqlite3VdbeCur
1c9b0 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 20 20 20  rentAddr(v);.   
1c9c0 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 47     for(j=0; j<pG
1c9d0 72 6f 75 70 42 79 2d 3e 6e 45 78 70 72 3b 20 6a  roupBy->nExpr; j
1c9e0 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  ++){.        if(
1c9f0 20 67 72 6f 75 70 42 79 53 6f 72 74 20 29 7b 0a   groupBySort ){.
1ca00 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
1ca10 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
1ca20 50 5f 43 6f 6c 75 6d 6e 2c 20 73 41 67 67 49 6e  P_Column, sAggIn
1ca30 66 6f 2e 73 6f 72 74 69 6e 67 49 64 78 2c 20 6a  fo.sortingIdx, j
1ca40 2c 20 69 42 4d 65 6d 2b 6a 29 3b 0a 20 20 20 20  , iBMem+j);.    
1ca50 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1ca60 20 20 20 20 20 73 41 67 67 49 6e 66 6f 2e 64 69       sAggInfo.di
1ca70 72 65 63 74 4d 6f 64 65 20 3d 20 31 3b 0a 20 20  rectMode = 1;.  
1ca80 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
1ca90 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20  xprCode(pParse, 
1caa0 70 47 72 6f 75 70 42 79 2d 3e 61 5b 6a 5d 2e 70  pGroupBy->a[j].p
1cab0 45 78 70 72 2c 20 69 42 4d 65 6d 2b 6a 29 3b 0a  Expr, iBMem+j);.
1cac0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
1cad0 7d 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d 70 47  }.      for(j=pG
1cae0 72 6f 75 70 42 79 2d 3e 6e 45 78 70 72 2d 31 3b  roupBy->nExpr-1;
1caf0 20 6a 3e 3d 30 3b 20 6a 2d 2d 29 7b 0a 20 20 20   j>=0; j--){.   
1cb00 20 20 20 20 20 69 66 28 20 6a 3d 3d 30 20 29 7b       if( j==0 ){
1cb10 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
1cb20 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
1cb30 4f 50 5f 45 71 2c 20 69 41 4d 65 6d 2b 6a 2c 20  OP_Eq, iAMem+j, 
1cb40 61 64 64 72 50 72 6f 63 65 73 73 52 6f 77 2c 20  addrProcessRow, 
1cb50 69 42 4d 65 6d 2b 6a 29 3b 0a 20 20 20 20 20 20  iBMem+j);.      
1cb60 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
1cb70 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
1cb80 64 4f 70 33 28 76 2c 20 4f 50 5f 4e 65 2c 20 69  dOp3(v, OP_Ne, i
1cb90 41 4d 65 6d 2b 6a 2c 20 61 64 64 72 47 72 6f 75  AMem+j, addrGrou
1cba0 70 42 79 43 68 61 6e 67 65 2c 20 69 42 4d 65 6d  pByChange, iBMem
1cbb0 2b 6a 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  +j);.        }. 
1cbc0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
1cbd0 62 65 43 68 61 6e 67 65 50 34 28 76 2c 20 2d 31  beChangeP4(v, -1
1cbe0 2c 20 28 76 6f 69 64 2a 29 70 4b 65 79 49 6e 66  , (void*)pKeyInf
1cbf0 6f 2d 3e 61 43 6f 6c 6c 5b 6a 5d 2c 20 50 34 5f  o->aColl[j], P4_
1cc00 43 4f 4c 4c 53 45 51 29 3b 0a 20 20 20 20 20 20  COLLSEQ);.      
1cc10 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61    sqlite3VdbeCha
1cc20 6e 67 65 50 35 28 76 2c 20 53 51 4c 49 54 45 5f  ngeP5(v, SQLITE_
1cc30 4e 55 4c 4c 45 51 55 41 4c 29 3b 0a 20 20 20 20  NULLEQUAL);.    
1cc40 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 47 65    }..      /* Ge
1cc50 6e 65 72 61 74 65 20 63 6f 64 65 20 74 68 61 74  nerate code that
1cc60 20 72 75 6e 73 20 77 68 65 6e 65 76 65 72 20 74   runs whenever t
1cc70 68 65 20 47 52 4f 55 50 20 42 59 20 63 68 61 6e  he GROUP BY chan
1cc80 67 65 73 2e 0a 20 20 20 20 20 20 2a 2a 20 43 68  ges..      ** Ch
1cc90 61 6e 67 65 20 69 6e 20 74 68 65 20 47 52 4f 55  ange in the GROU
1cca0 50 20 42 59 20 61 72 65 20 64 65 74 65 63 74 65  P BY are detecte
1ccb0 64 20 62 79 20 74 68 65 20 70 72 65 76 69 6f 75  d by the previou
1ccc0 73 20 63 6f 64 65 0a 20 20 20 20 20 20 2a 2a 20  s code.      ** 
1ccd0 62 6c 6f 63 6b 2e 20 20 49 66 20 74 68 65 72 65  block.  If there
1cce0 20 77 65 72 65 20 6e 6f 20 63 68 61 6e 67 65 73   were no changes
1ccf0 2c 20 74 68 69 73 20 62 6c 6f 63 6b 20 69 73 20  , this block is 
1cd00 73 6b 69 70 70 65 64 2e 0a 20 20 20 20 20 20 2a  skipped..      *
1cd10 2a 0a 20 20 20 20 20 20 2a 2a 20 54 68 69 73 20  *.      ** This 
1cd20 63 6f 64 65 20 63 6f 70 69 65 73 20 63 75 72 72  code copies curr
1cd30 65 6e 74 20 67 72 6f 75 70 20 62 79 20 74 65 72  ent group by ter
1cd40 6d 73 20 69 6e 20 62 30 2c 62 31 2c 62 32 2c 2e  ms in b0,b1,b2,.
1cd50 2e 2e 0a 20 20 20 20 20 20 2a 2a 20 6f 76 65 72  ...      ** over
1cd60 20 74 6f 20 61 30 2c 61 31 2c 61 32 2e 20 20 49   to a0,a1,a2.  I
1cd70 74 20 74 68 65 6e 20 63 61 6c 6c 73 20 74 68 65  t then calls the
1cd80 20 6f 75 74 70 75 74 20 73 75 62 72 6f 75 74 69   output subrouti
1cd90 6e 65 0a 20 20 20 20 20 20 2a 2a 20 61 6e 64 20  ne.      ** and 
1cda0 72 65 73 65 74 73 20 74 68 65 20 61 67 67 72 65  resets the aggre
1cdb0 67 61 74 65 20 61 63 63 75 6d 75 6c 61 74 6f 72  gate accumulator
1cdc0 20 72 65 67 69 73 74 65 72 73 20 69 6e 20 70 72   registers in pr
1cdd0 65 70 61 72 61 74 69 6f 6e 0a 20 20 20 20 20 20  eparation.      
1cde0 2a 2a 20 66 6f 72 20 74 68 65 20 6e 65 78 74 20  ** for the next 
1cdf0 47 52 4f 55 50 20 42 59 20 62 61 74 63 68 2e 0a  GROUP BY batch..
1ce00 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 73        */.      s
1ce10 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76  qlite3VdbeResolv
1ce20 65 4c 61 62 65 6c 28 76 2c 20 61 64 64 72 47 72  eLabel(v, addrGr
1ce30 6f 75 70 42 79 43 68 61 6e 67 65 29 3b 0a 20 20  oupByChange);.  
1ce40 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70      for(j=0; j<p
1ce50 47 72 6f 75 70 42 79 2d 3e 6e 45 78 70 72 3b 20  GroupBy->nExpr; 
1ce60 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 73 71  j++){.        sq
1ce70 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
1ce80 76 2c 20 4f 50 5f 4d 6f 76 65 2c 20 69 42 4d 65  v, OP_Move, iBMe
1ce90 6d 2b 6a 2c 20 69 41 4d 65 6d 2b 6a 29 3b 0a 20  m+j, iAMem+j);. 
1cea0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c       }.      sql
1ceb0 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
1cec0 2c 20 4f 50 5f 47 6f 73 75 62 2c 20 30 2c 20 61  , OP_Gosub, 0, a
1ced0 64 64 72 4f 75 74 70 75 74 52 6f 77 29 3b 0a 20  ddrOutputRow);. 
1cee0 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74       VdbeComment
1cef0 28 28 76 2c 20 22 6f 75 74 70 75 74 20 6f 6e 65  ((v, "output one
1cf00 20 72 6f 77 22 29 29 3b 0a 20 20 20 20 20 20 73   row"));.      s
1cf10 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
1cf20 28 76 2c 20 4f 50 5f 49 66 50 6f 73 2c 20 69 41  (v, OP_IfPos, iA
1cf30 62 6f 72 74 46 6c 61 67 2c 20 61 64 64 72 45 6e  bortFlag, addrEn
1cf40 64 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f  d);.      VdbeCo
1cf50 6d 6d 65 6e 74 28 28 76 2c 20 22 63 68 65 63 6b  mment((v, "check
1cf60 20 61 62 6f 72 74 20 66 6c 61 67 22 29 29 3b 0a   abort flag"));.
1cf70 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
1cf80 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f  eAddOp2(v, OP_Go
1cf90 73 75 62 2c 20 30 2c 20 61 64 64 72 52 65 73 65  sub, 0, addrRese
1cfa0 74 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f  t);.      VdbeCo
1cfb0 6d 6d 65 6e 74 28 28 76 2c 20 22 72 65 73 65 74  mment((v, "reset
1cfc0 20 61 63 63 75 6d 75 6c 61 74 6f 72 22 29 29 3b   accumulator"));
1cfd0 0a 0a 20 20 20 20 20 20 2f 2a 20 55 70 64 61 74  ..      /* Updat
1cfe0 65 20 74 68 65 20 61 67 67 72 65 67 61 74 65 20  e the aggregate 
1cff0 61 63 63 75 6d 75 6c 61 74 6f 72 73 20 62 61 73  accumulators bas
1d000 65 64 20 6f 6e 20 74 68 65 20 63 6f 6e 74 65 6e  ed on the conten
1d010 74 20 6f 66 0a 20 20 20 20 20 20 2a 2a 20 74 68  t of.      ** th
1d020 65 20 63 75 72 72 65 6e 74 20 72 6f 77 0a 20 20  e current row.  
1d030 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c      */.      sql
1d040 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c  ite3VdbeResolveL
1d050 61 62 65 6c 28 76 2c 20 61 64 64 72 50 72 6f 63  abel(v, addrProc
1d060 65 73 73 52 6f 77 29 3b 0a 20 20 20 20 20 20 75  essRow);.      u
1d070 70 64 61 74 65 41 63 63 75 6d 75 6c 61 74 6f 72  pdateAccumulator
1d080 28 70 50 61 72 73 65 2c 20 26 73 41 67 67 49 6e  (pParse, &sAggIn
1d090 66 6f 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  fo);.      sqlit
1d0a0 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
1d0b0 4f 50 5f 49 6e 74 65 67 65 72 2c 20 31 2c 20 69  OP_Integer, 1, i
1d0c0 55 73 65 46 6c 61 67 29 3b 0a 20 20 20 20 20 20  UseFlag);.      
1d0d0 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20  VdbeComment((v, 
1d0e0 22 69 6e 64 69 63 61 74 65 20 64 61 74 61 20 69  "indicate data i
1d0f0 6e 20 61 63 63 75 6d 75 6c 61 74 6f 72 22 29 29  n accumulator"))
1d100 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 45 6e 64 20  ;..      /* End 
1d110 6f 66 20 74 68 65 20 6c 6f 6f 70 0a 20 20 20 20  of the loop.    
1d120 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 67    */.      if( g
1d130 72 6f 75 70 42 79 53 6f 72 74 20 29 7b 0a 20 20  roupBySort ){.  
1d140 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
1d150 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 65  eAddOp2(v, OP_Ne
1d160 78 74 2c 20 73 41 67 67 49 6e 66 6f 2e 73 6f 72  xt, sAggInfo.sor
1d170 74 69 6e 67 49 64 78 2c 20 61 64 64 72 54 6f 70  tingIdx, addrTop
1d180 4f 66 4c 6f 6f 70 29 3b 0a 20 20 20 20 20 20 7d  OfLoop);.      }
1d190 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71  else{.        sq
1d1a0 6c 69 74 65 33 57 68 65 72 65 45 6e 64 28 70 57  lite3WhereEnd(pW
1d1b0 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20 20 20 73  Info);.        s
1d1c0 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65  qlite3VdbeChange
1d1d0 54 6f 4e 6f 6f 70 28 76 2c 20 61 64 64 72 53 6f  ToNoop(v, addrSo
1d1e0 72 74 69 6e 67 49 64 78 2c 20 31 29 3b 0a 20 20  rtingIdx, 1);.  
1d1f0 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20      }..      /* 
1d200 4f 75 74 70 75 74 20 74 68 65 20 66 69 6e 61 6c  Output the final
1d210 20 72 6f 77 20 6f 66 20 72 65 73 75 6c 74 0a 20   row of result. 
1d220 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 73 71       */.      sq
1d230 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
1d240 76 2c 20 4f 50 5f 47 6f 73 75 62 2c 20 30 2c 20  v, OP_Gosub, 0, 
1d250 61 64 64 72 4f 75 74 70 75 74 52 6f 77 29 3b 0a  addrOutputRow);.
1d260 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e        VdbeCommen
1d270 74 28 28 76 2c 20 22 6f 75 74 70 75 74 20 66 69  t((v, "output fi
1d280 6e 61 6c 20 72 6f 77 22 29 29 3b 0a 20 20 20 20  nal row"));.    
1d290 20 20 0a 20 20 20 20 7d 20 2f 2a 20 65 6e 64 69    .    } /* endi
1d2a0 66 20 70 47 72 6f 75 70 42 79 20 2a 2f 0a 20 20  f pGroupBy */.  
1d2b0 20 20 65 6c 73 65 20 7b 0a 20 20 20 20 20 20 45    else {.      E
1d2c0 78 70 72 4c 69 73 74 20 2a 70 4d 69 6e 4d 61 78  xprList *pMinMax
1d2d0 20 3d 20 30 3b 0a 20 20 20 20 20 20 45 78 70 72   = 0;.      Expr
1d2e0 4c 69 73 74 20 2a 70 44 65 6c 20 3d 20 30 3b 0a  List *pDel = 0;.
1d2f0 20 20 20 20 20 20 75 38 20 66 6c 61 67 3b 0a 0a        u8 flag;..
1d300 20 20 20 20 20 20 2f 2a 20 43 68 65 63 6b 20 69        /* Check i
1d310 66 20 74 68 65 20 71 75 65 72 79 20 69 73 20 6f  f the query is o
1d320 66 20 6f 6e 65 20 6f 66 20 74 68 65 20 66 6f 6c  f one of the fol
1d330 6c 6f 77 69 6e 67 20 66 6f 72 6d 73 3a 0a 20 20  lowing forms:.  
1d340 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20      **.      ** 
1d350 20 20 53 45 4c 45 43 54 20 6d 69 6e 28 78 29 20    SELECT min(x) 
1d360 46 52 4f 4d 20 2e 2e 2e 0a 20 20 20 20 20 20 2a  FROM ....      *
1d370 2a 20 20 20 53 45 4c 45 43 54 20 6d 61 78 28 78  *   SELECT max(x
1d380 29 20 46 52 4f 4d 20 2e 2e 2e 0a 20 20 20 20 20  ) FROM ....     
1d390 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 49 66 20   **.      ** If 
1d3a0 69 74 20 69 73 2c 20 74 68 65 6e 20 61 73 6b 20  it is, then ask 
1d3b0 74 68 65 20 63 6f 64 65 20 69 6e 20 77 68 65 72  the code in wher
1d3c0 65 2e 63 20 74 6f 20 61 74 74 65 6d 70 74 20 74  e.c to attempt t
1d3d0 6f 20 73 6f 72 74 20 72 65 73 75 6c 74 73 0a 20  o sort results. 
1d3e0 20 20 20 20 20 2a 2a 20 61 73 20 69 66 20 74 68       ** as if th
1d3f0 65 72 65 20 77 61 73 20 61 6e 20 22 4f 52 44 45  ere was an "ORDE
1d400 52 20 4f 4e 20 78 22 20 6f 72 20 22 4f 52 44 45  R ON x" or "ORDE
1d410 52 20 4f 4e 20 78 20 44 45 53 43 22 20 63 6c 61  R ON x DESC" cla
1d420 75 73 65 2e 20 0a 20 20 20 20 20 20 2a 2a 20 49  use. .      ** I
1d430 66 20 77 68 65 72 65 2e 63 20 69 73 20 61 62 6c  f where.c is abl
1d440 65 20 74 6f 20 70 72 6f 64 75 63 65 20 72 65 73  e to produce res
1d450 75 6c 74 73 20 73 6f 72 74 65 64 20 69 6e 20 74  ults sorted in t
1d460 68 69 73 20 6f 72 64 65 72 2c 20 74 68 65 6e 0a  his order, then.
1d470 20 20 20 20 20 20 2a 2a 20 61 64 64 20 76 64 62        ** add vdb
1d480 65 20 63 6f 64 65 20 74 6f 20 62 72 65 61 6b 20  e code to break 
1d490 6f 75 74 20 6f 66 20 74 68 65 20 70 72 6f 63 65  out of the proce
1d4a0 73 73 69 6e 67 20 6c 6f 6f 70 20 61 66 74 65 72  ssing loop after
1d4b0 20 74 68 65 20 0a 20 20 20 20 20 20 2a 2a 20 66   the .      ** f
1d4c0 69 72 73 74 20 69 74 65 72 61 74 69 6f 6e 20 28  irst iteration (
1d4d0 73 69 6e 63 65 20 74 68 65 20 66 69 72 73 74 20  since the first 
1d4e0 69 74 65 72 61 74 69 6f 6e 20 6f 66 20 74 68 65  iteration of the
1d4f0 20 6c 6f 6f 70 20 69 73 20 0a 20 20 20 20 20 20   loop is .      
1d500 2a 2a 20 67 75 61 72 61 6e 74 65 65 64 20 74 6f  ** guaranteed to
1d510 20 6f 70 65 72 61 74 65 20 6f 6e 20 74 68 65 20   operate on the 
1d520 72 6f 77 20 77 69 74 68 20 74 68 65 20 6d 69 6e  row with the min
1d530 69 6d 75 6d 20 6f 72 20 6d 61 78 69 6d 75 6d 20  imum or maximum 
1d540 0a 20 20 20 20 20 20 2a 2a 20 76 61 6c 75 65 20  .      ** value 
1d550 6f 66 20 78 2c 20 74 68 65 20 6f 6e 6c 79 20 72  of x, the only r
1d560 6f 77 20 72 65 71 75 69 72 65 64 29 2e 0a 20 20  ow required)..  
1d570 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20      **.      ** 
1d580 41 20 73 70 65 63 69 61 6c 20 66 6c 61 67 20 6d  A special flag m
1d590 75 73 74 20 62 65 20 70 61 73 73 65 64 20 74 6f  ust be passed to
1d5a0 20 73 71 6c 69 74 65 33 57 68 65 72 65 42 65 67   sqlite3WhereBeg
1d5b0 69 6e 28 29 20 74 6f 20 73 6c 69 67 68 74 6c 79  in() to slightly
1d5c0 0a 20 20 20 20 20 20 2a 2a 20 6d 6f 64 69 66 79  .      ** modify
1d5d0 20 62 65 68 61 76 69 6f 75 72 20 61 73 20 66 6f   behaviour as fo
1d5e0 6c 6c 6f 77 73 3a 0a 20 20 20 20 20 20 2a 2a 0a  llows:.      **.
1d5f0 20 20 20 20 20 20 2a 2a 20 20 20 2b 20 49 66 20        **   + If 
1d600 74 68 65 20 71 75 65 72 79 20 69 73 20 61 20 22  the query is a "
1d610 53 45 4c 45 43 54 20 6d 69 6e 28 78 29 22 2c 20  SELECT min(x)", 
1d620 74 68 65 6e 20 74 68 65 20 6c 6f 6f 70 20 63 6f  then the loop co
1d630 64 65 64 20 62 79 0a 20 20 20 20 20 20 2a 2a 20  ded by.      ** 
1d640 20 20 20 20 77 68 65 72 65 2e 63 20 73 68 6f 75      where.c shou
1d650 6c 64 20 6e 6f 74 20 69 74 65 72 61 74 65 20 6f  ld not iterate o
1d660 76 65 72 20 61 6e 79 20 76 61 6c 75 65 73 20 77  ver any values w
1d670 69 74 68 20 61 20 4e 55 4c 4c 20 76 61 6c 75 65  ith a NULL value
1d680 0a 20 20 20 20 20 20 2a 2a 20 20 20 20 20 66 6f  .      **     fo
1d690 72 20 78 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20  r x..      **.  
1d6a0 20 20 20 20 2a 2a 20 20 20 2b 20 54 68 65 20 6f      **   + The o
1d6b0 70 74 69 6d 69 7a 65 72 20 63 6f 64 65 20 69 6e  ptimizer code in
1d6c0 20 77 68 65 72 65 2e 63 20 28 74 68 65 20 74 68   where.c (the th
1d6d0 69 6e 67 20 74 68 61 74 20 64 65 63 69 64 65 73  ing that decides
1d6e0 20 77 68 69 63 68 0a 20 20 20 20 20 20 2a 2a 20   which.      ** 
1d6f0 20 20 20 20 69 6e 64 65 78 20 6f 72 20 69 6e 64      index or ind
1d700 69 63 65 73 20 74 6f 20 75 73 65 29 20 73 68 6f  ices to use) sho
1d710 75 6c 64 20 70 6c 61 63 65 20 61 20 64 69 66 66  uld place a diff
1d720 65 72 65 6e 74 20 70 72 69 6f 72 69 74 79 20 6f  erent priority o
1d730 6e 20 0a 20 20 20 20 20 20 2a 2a 20 20 20 20 20  n .      **     
1d740 73 61 74 69 73 66 79 69 6e 67 20 74 68 65 20 27  satisfying the '
1d750 4f 52 44 45 52 20 42 59 27 20 63 6c 61 75 73 65  ORDER BY' clause
1d760 20 74 68 61 6e 20 69 74 20 64 6f 65 73 20 69 6e   than it does in
1d770 20 6f 74 68 65 72 20 63 61 73 65 73 2e 0a 20 20   other cases..  
1d780 20 20 20 20 2a 2a 20 20 20 20 20 52 65 66 65 72      **     Refer
1d790 20 74 6f 20 63 6f 64 65 20 61 6e 64 20 63 6f 6d   to code and com
1d7a0 6d 65 6e 74 73 20 69 6e 20 77 68 65 72 65 2e 63  ments in where.c
1d7b0 20 66 6f 72 20 64 65 74 61 69 6c 73 2e 0a 20 20   for details..  
1d7c0 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 66 6c 61      */.      fla
1d7d0 67 20 3d 20 6d 69 6e 4d 61 78 51 75 65 72 79 28  g = minMaxQuery(
1d7e0 70 50 61 72 73 65 2c 20 70 29 3b 0a 20 20 20 20  pParse, p);.    
1d7f0 20 20 69 66 28 20 66 6c 61 67 20 29 7b 0a 20 20    if( flag ){.  
1d800 20 20 20 20 20 20 70 44 65 6c 20 3d 20 70 4d 69        pDel = pMi
1d810 6e 4d 61 78 20 3d 20 73 71 6c 69 74 65 33 45 78  nMax = sqlite3Ex
1d820 70 72 4c 69 73 74 44 75 70 28 64 62 2c 20 70 2d  prListDup(db, p-
1d830 3e 70 45 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45  >pEList->a[0].pE
1d840 78 70 72 2d 3e 70 4c 69 73 74 29 3b 0a 20 20 20  xpr->pList);.   
1d850 20 20 20 20 20 69 66 28 20 70 4d 69 6e 4d 61 78       if( pMinMax
1d860 20 26 26 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46   && !db->mallocF
1d870 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 20 20 20  ailed ){.       
1d880 20 20 20 70 4d 69 6e 4d 61 78 2d 3e 61 5b 30 5d     pMinMax->a[0]
1d890 2e 73 6f 72 74 4f 72 64 65 72 20 3d 20 28 28 66  .sortOrder = ((f
1d8a0 6c 61 67 3d 3d 4f 52 44 45 52 42 59 5f 4d 49 4e  lag==ORDERBY_MIN
1d8b0 29 3f 30 3a 31 29 3b 0a 20 20 20 20 20 20 20 20  )?0:1);.        
1d8c0 20 20 70 4d 69 6e 4d 61 78 2d 3e 61 5b 30 5d 2e    pMinMax->a[0].
1d8d0 70 45 78 70 72 2d 3e 6f 70 20 3d 20 54 4b 5f 43  pExpr->op = TK_C
1d8e0 4f 4c 55 4d 4e 3b 0a 20 20 20 20 20 20 20 20 7d  OLUMN;.        }
1d8f0 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20  .      }..      
1d900 2f 2a 20 54 68 69 73 20 63 61 73 65 20 72 75 6e  /* This case run
1d910 73 20 69 66 20 74 68 65 20 61 67 67 72 65 67 61  s if the aggrega
1d920 74 65 20 68 61 73 20 6e 6f 20 47 52 4f 55 50 20  te has no GROUP 
1d930 42 59 20 63 6c 61 75 73 65 2e 20 20 54 68 65 0a  BY clause.  The.
1d940 20 20 20 20 20 20 2a 2a 20 70 72 6f 63 65 73 73        ** process
1d950 69 6e 67 20 69 73 20 6d 75 63 68 20 73 69 6d 70  ing is much simp
1d960 6c 65 72 20 73 69 6e 63 65 20 74 68 65 72 65 20  ler since there 
1d970 69 73 20 6f 6e 6c 79 20 61 20 73 69 6e 67 6c 65  is only a single
1d980 20 72 6f 77 0a 20 20 20 20 20 20 2a 2a 20 6f 66   row.      ** of
1d990 20 6f 75 74 70 75 74 2e 0a 20 20 20 20 20 20 2a   output..      *
1d9a0 2f 0a 20 20 20 20 20 20 72 65 73 65 74 41 63 63  /.      resetAcc
1d9b0 75 6d 75 6c 61 74 6f 72 28 70 50 61 72 73 65 2c  umulator(pParse,
1d9c0 20 26 73 41 67 67 49 6e 66 6f 29 3b 0a 20 20 20   &sAggInfo);.   
1d9d0 20 20 20 70 57 49 6e 66 6f 20 3d 20 73 71 6c 69     pWInfo = sqli
1d9e0 74 65 33 57 68 65 72 65 42 65 67 69 6e 28 70 50  te3WhereBegin(pP
1d9f0 61 72 73 65 2c 20 70 54 61 62 4c 69 73 74 2c 20  arse, pTabList, 
1da00 70 57 68 65 72 65 2c 20 26 70 4d 69 6e 4d 61 78  pWhere, &pMinMax
1da10 2c 20 66 6c 61 67 29 3b 0a 20 20 20 20 20 20 69  , flag);.      i
1da20 66 28 20 70 57 49 6e 66 6f 3d 3d 30 20 29 7b 0a  f( pWInfo==0 ){.
1da30 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
1da40 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28 70 44  xprListDelete(pD
1da50 65 6c 29 3b 0a 20 20 20 20 20 20 20 20 67 6f 74  el);.        got
1da60 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20  o select_end;.  
1da70 20 20 20 20 7d 0a 20 20 20 20 20 20 75 70 64 61      }.      upda
1da80 74 65 41 63 63 75 6d 75 6c 61 74 6f 72 28 70 50  teAccumulator(pP
1da90 61 72 73 65 2c 20 26 73 41 67 67 49 6e 66 6f 29  arse, &sAggInfo)
1daa0 3b 0a 20 20 20 20 20 20 69 66 28 20 21 70 4d 69  ;.      if( !pMi
1dab0 6e 4d 61 78 20 26 26 20 66 6c 61 67 20 29 7b 0a  nMax && flag ){.
1dac0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
1dad0 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
1dae0 47 6f 74 6f 2c 20 30 2c 20 70 57 49 6e 66 6f 2d  Goto, 0, pWInfo-
1daf0 3e 69 42 72 65 61 6b 29 3b 0a 20 20 20 20 20 20  >iBreak);.      
1db00 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76    VdbeComment((v
1db10 2c 20 22 25 73 28 29 20 62 79 20 69 6e 64 65 78  , "%s() by index
1db20 22 2c 20 28 66 6c 61 67 3d 3d 4f 52 44 45 52 42  ", (flag==ORDERB
1db30 59 5f 4d 49 4e 3f 22 6d 69 6e 22 3a 22 6d 61 78  Y_MIN?"min":"max
1db40 22 29 29 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ")));.      }.  
1db50 20 20 20 20 73 71 6c 69 74 65 33 57 68 65 72 65      sqlite3Where
1db60 45 6e 64 28 70 57 49 6e 66 6f 29 3b 0a 20 20 20  End(pWInfo);.   
1db70 20 20 20 66 69 6e 61 6c 69 7a 65 41 67 67 46 75     finalizeAggFu
1db80 6e 63 74 69 6f 6e 73 28 70 50 61 72 73 65 2c 20  nctions(pParse, 
1db90 26 73 41 67 67 49 6e 66 6f 29 3b 0a 20 20 20 20  &sAggInfo);.    
1dba0 20 20 70 4f 72 64 65 72 42 79 20 3d 20 30 3b 0a    pOrderBy = 0;.
1dbb0 20 20 20 20 20 20 69 66 28 20 70 48 61 76 69 6e        if( pHavin
1dbc0 67 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  g ){.        sql
1dbd0 69 74 65 33 45 78 70 72 49 66 46 61 6c 73 65 28  ite3ExprIfFalse(
1dbe0 70 50 61 72 73 65 2c 20 70 48 61 76 69 6e 67 2c  pParse, pHaving,
1dbf0 20 61 64 64 72 45 6e 64 2c 20 53 51 4c 49 54 45   addrEnd, SQLITE
1dc00 5f 4a 55 4d 50 49 46 4e 55 4c 4c 29 3b 0a 20 20  _JUMPIFNULL);.  
1dc10 20 20 20 20 7d 0a 20 20 20 20 20 20 73 65 6c 65      }.      sele
1dc20 63 74 49 6e 6e 65 72 4c 6f 6f 70 28 70 50 61 72  ctInnerLoop(pPar
1dc30 73 65 2c 20 70 2c 20 70 2d 3e 70 45 4c 69 73 74  se, p, p->pEList
1dc40 2c 20 30 2c 20 30 2c 20 30 2c 20 2d 31 2c 20 0a  , 0, 0, 0, -1, .
1dc50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1dc60 20 20 20 20 20 20 70 44 65 73 74 2c 20 61 64 64        pDest, add
1dc70 72 45 6e 64 2c 20 61 64 64 72 45 6e 64 2c 20 61  rEnd, addrEnd, a
1dc80 66 66 29 3b 0a 0a 20 20 20 20 20 20 73 71 6c 69  ff);..      sqli
1dc90 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74  te3ExprListDelet
1dca0 65 28 70 44 65 6c 29 3b 0a 20 20 20 20 7d 0a 20  e(pDel);.    }. 
1dcb0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65     sqlite3VdbeRe
1dcc0 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 61 64  solveLabel(v, ad
1dcd0 64 72 45 6e 64 29 3b 0a 20 20 20 20 0a 20 20 7d  drEnd);.    .  }
1dce0 20 2f 2a 20 65 6e 64 69 66 20 61 67 67 72 65 67   /* endif aggreg
1dcf0 61 74 65 20 71 75 65 72 79 20 2a 2f 0a 0a 20 20  ate query */..  
1dd00 2f 2a 20 49 66 20 74 68 65 72 65 20 69 73 20 61  /* If there is a
1dd10 6e 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73  n ORDER BY claus
1dd20 65 2c 20 74 68 65 6e 20 77 65 20 6e 65 65 64 20  e, then we need 
1dd30 74 6f 20 73 6f 72 74 20 74 68 65 20 72 65 73 75  to sort the resu
1dd40 6c 74 73 0a 20 20 2a 2a 20 61 6e 64 20 73 65 6e  lts.  ** and sen
1dd50 64 20 74 68 65 6d 20 74 6f 20 74 68 65 20 63 61  d them to the ca
1dd60 6c 6c 62 61 63 6b 20 6f 6e 65 20 62 79 20 6f 6e  llback one by on
1dd70 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 4f  e..  */.  if( pO
1dd80 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20 67 65  rderBy ){.    ge
1dd90 6e 65 72 61 74 65 53 6f 72 74 54 61 69 6c 28 70  nerateSortTail(p
1dda0 50 61 72 73 65 2c 20 70 2c 20 76 2c 20 70 45 4c  Parse, p, v, pEL
1ddb0 69 73 74 2d 3e 6e 45 78 70 72 2c 20 70 44 65 73  ist->nExpr, pDes
1ddc0 74 29 3b 0a 20 20 7d 0a 0a 23 69 66 6e 64 65 66  t);.  }..#ifndef
1ddd0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42   SQLITE_OMIT_SUB
1dde0 51 55 45 52 59 0a 20 20 2f 2a 20 49 66 20 74 68  QUERY.  /* If th
1ddf0 69 73 20 77 61 73 20 61 20 73 75 62 71 75 65 72  is was a subquer
1de00 79 2c 20 77 65 20 68 61 76 65 20 6e 6f 77 20 63  y, we have now c
1de10 6f 6e 76 65 72 74 65 64 20 74 68 65 20 73 75 62  onverted the sub
1de20 71 75 65 72 79 20 69 6e 74 6f 20 61 0a 20 20 2a  query into a.  *
1de30 2a 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c  * temporary tabl
1de40 65 2e 20 20 53 6f 20 73 65 74 20 74 68 65 20 53  e.  So set the S
1de50 72 63 4c 69 73 74 5f 69 74 65 6d 2e 69 73 50 6f  rcList_item.isPo
1de60 70 75 6c 61 74 65 64 20 66 6c 61 67 20 74 6f 20  pulated flag to 
1de70 70 72 65 76 65 6e 74 0a 20 20 2a 2a 20 74 68 69  prevent.  ** thi
1de80 73 20 73 75 62 71 75 65 72 79 20 66 72 6f 6d 20  s subquery from 
1de90 62 65 69 6e 67 20 65 76 61 6c 75 61 74 65 64 20  being evaluated 
1dea0 61 67 61 69 6e 20 61 6e 64 20 74 6f 20 66 6f 72  again and to for
1deb0 63 65 20 74 68 65 20 75 73 65 20 6f 66 0a 20 20  ce the use of.  
1dec0 2a 2a 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79  ** the temporary
1ded0 20 74 61 62 6c 65 2e 0a 20 20 2a 2f 0a 20 20 69   table..  */.  i
1dee0 66 28 20 70 50 61 72 65 6e 74 20 29 7b 0a 20 20  f( pParent ){.  
1def0 20 20 61 73 73 65 72 74 28 20 70 50 61 72 65 6e    assert( pParen
1df00 74 2d 3e 70 53 72 63 2d 3e 6e 53 72 63 3e 70 61  t->pSrc->nSrc>pa
1df10 72 65 6e 74 54 61 62 20 29 3b 0a 20 20 20 20 61  rentTab );.    a
1df20 73 73 65 72 74 28 20 70 50 61 72 65 6e 74 2d 3e  ssert( pParent->
1df30 70 53 72 63 2d 3e 61 5b 70 61 72 65 6e 74 54 61  pSrc->a[parentTa
1df40 62 5d 2e 70 53 65 6c 65 63 74 3d 3d 70 20 29 3b  b].pSelect==p );
1df50 0a 20 20 20 20 70 50 61 72 65 6e 74 2d 3e 70 53  .    pParent->pS
1df60 72 63 2d 3e 61 5b 70 61 72 65 6e 74 54 61 62 5d  rc->a[parentTab]
1df70 2e 69 73 50 6f 70 75 6c 61 74 65 64 20 3d 20 31  .isPopulated = 1
1df80 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20  ;.  }.#endif..  
1df90 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20 74 6f 20  /* Jump here to 
1dfa0 73 6b 69 70 20 74 68 69 73 20 71 75 65 72 79 0a  skip this query.
1dfb0 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 56 64    */.  sqlite3Vd
1dfc0 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76  beResolveLabel(v
1dfd0 2c 20 69 45 6e 64 29 3b 0a 0a 20 20 2f 2a 20 54  , iEnd);..  /* T
1dfe0 68 65 20 53 45 4c 45 43 54 20 77 61 73 20 73 75  he SELECT was su
1dff0 63 63 65 73 73 66 75 6c 6c 79 20 63 6f 64 65 64  ccessfully coded
1e000 2e 20 20 20 53 65 74 20 74 68 65 20 72 65 74 75  .   Set the retu
1e010 72 6e 20 63 6f 64 65 20 74 6f 20 30 0a 20 20 2a  rn code to 0.  *
1e020 2a 20 74 6f 20 69 6e 64 69 63 61 74 65 20 6e 6f  * to indicate no
1e030 20 65 72 72 6f 72 73 2e 0a 20 20 2a 2f 0a 20 20   errors..  */.  
1e040 72 63 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20 43 6f  rc = 0;..  /* Co
1e050 6e 74 72 6f 6c 20 6a 75 6d 70 73 20 74 6f 20 68  ntrol jumps to h
1e060 65 72 65 20 69 66 20 61 6e 20 65 72 72 6f 72 20  ere if an error 
1e070 69 73 20 65 6e 63 6f 75 6e 74 65 72 65 64 20 61  is encountered a
1e080 62 6f 76 65 2c 20 6f 72 20 75 70 6f 6e 0a 20 20  bove, or upon.  
1e090 2a 2a 20 73 75 63 63 65 73 73 66 75 6c 20 63 6f  ** successful co
1e0a0 64 69 6e 67 20 6f 66 20 74 68 65 20 53 45 4c 45  ding of the SELE
1e0b0 43 54 2e 0a 20 20 2a 2f 0a 73 65 6c 65 63 74 5f  CT..  */.select_
1e0c0 65 6e 64 3a 0a 0a 20 20 2f 2a 20 49 64 65 6e 74  end:..  /* Ident
1e0d0 69 66 79 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73  ify column names
1e0e0 20 69 66 20 77 65 20 77 69 6c 6c 20 62 65 20 75   if we will be u
1e0f0 73 69 6e 67 20 74 68 65 6d 20 69 6e 20 61 20 63  sing them in a c
1e100 61 6c 6c 62 61 63 6b 2e 20 20 54 68 69 73 0a 20  allback.  This. 
1e110 20 2a 2a 20 73 74 65 70 20 69 73 20 73 6b 69 70   ** step is skip
1e120 70 65 64 20 69 66 20 74 68 65 20 6f 75 74 70 75  ped if the outpu
1e130 74 20 69 73 20 67 6f 69 6e 67 20 74 6f 20 73 6f  t is going to so
1e140 6d 65 20 6f 74 68 65 72 20 64 65 73 74 69 6e 61  me other destina
1e150 74 69 6f 6e 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  tion..  */.  if(
1e160 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
1e170 26 20 70 44 65 73 74 2d 3e 65 44 65 73 74 3d 3d  & pDest->eDest==
1e180 53 52 54 5f 43 61 6c 6c 62 61 63 6b 20 29 7b 0a  SRT_Callback ){.
1e190 20 20 20 20 67 65 6e 65 72 61 74 65 43 6f 6c 75      generateColu
1e1a0 6d 6e 4e 61 6d 65 73 28 70 50 61 72 73 65 2c 20  mnNames(pParse, 
1e1b0 70 54 61 62 4c 69 73 74 2c 20 70 45 4c 69 73 74  pTabList, pEList
1e1c0 29 3b 0a 20 20 7d 0a 0a 20 20 73 71 6c 69 74 65  );.  }..  sqlite
1e1d0 33 5f 66 72 65 65 28 73 41 67 67 49 6e 66 6f 2e  3_free(sAggInfo.
1e1e0 61 43 6f 6c 29 3b 0a 20 20 73 71 6c 69 74 65 33  aCol);.  sqlite3
1e1f0 5f 66 72 65 65 28 73 41 67 67 49 6e 66 6f 2e 61  _free(sAggInfo.a
1e200 46 75 6e 63 29 3b 0a 20 20 72 65 74 75 72 6e 20  Func);.  return 
1e210 72 63 3b 0a 7d 0a 0a 23 69 66 20 64 65 66 69 6e  rc;.}..#if defin
1e220 65 64 28 53 51 4c 49 54 45 5f 44 45 42 55 47 29  ed(SQLITE_DEBUG)
1e230 0a 2f 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ./*.************
1e240 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1e250 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1e260 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1e270 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1e280 2a 2a 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f  ***.** The follo
1e290 77 69 6e 67 20 63 6f 64 65 20 69 73 20 75 73 65  wing code is use
1e2a0 64 20 66 6f 72 20 74 65 73 74 69 6e 67 20 61 6e  d for testing an
1e2b0 64 20 64 65 62 75 67 67 69 6e 67 20 6f 6e 6c 79  d debugging only
1e2c0 2e 20 20 54 68 65 20 63 6f 64 65 0a 2a 2a 20 74  .  The code.** t
1e2d0 68 61 74 20 66 6f 6c 6c 6f 77 73 20 64 6f 65 73  hat follows does
1e2e0 20 6e 6f 74 20 61 70 70 65 61 72 20 69 6e 20 6e   not appear in n
1e2f0 6f 72 6d 61 6c 20 62 75 69 6c 64 73 2e 0a 2a 2a  ormal builds..**
1e300 0a 2a 2a 20 54 68 65 73 65 20 72 6f 75 74 69 6e  .** These routin
1e310 65 73 20 61 72 65 20 75 73 65 64 20 74 6f 20 70  es are used to p
1e320 72 69 6e 74 20 6f 75 74 20 74 68 65 20 63 6f 6e  rint out the con
1e330 74 65 6e 74 20 6f 66 20 61 6c 6c 20 6f 72 20 70  tent of all or p
1e340 61 72 74 20 6f 66 20 61 20 0a 2a 2a 20 70 61 72  art of a .** par
1e350 73 65 20 73 74 72 75 63 74 75 72 65 73 20 73 75  se structures su
1e360 63 68 20 61 73 20 53 65 6c 65 63 74 20 6f 72 20  ch as Select or 
1e370 45 78 70 72 2e 20 20 53 75 63 68 20 70 72 69 6e  Expr.  Such prin
1e380 74 6f 75 74 73 20 61 72 65 20 75 73 65 66 75 6c  touts are useful
1e390 0a 2a 2a 20 66 6f 72 20 68 65 6c 70 69 6e 67 20  .** for helping 
1e3a0 74 6f 20 75 6e 64 65 72 73 74 61 6e 64 20 77 68  to understand wh
1e3b0 61 74 20 69 73 20 68 61 70 70 65 6e 69 6e 67 20  at is happening 
1e3c0 69 6e 73 69 64 65 20 74 68 65 20 63 6f 64 65 20  inside the code 
1e3d0 67 65 6e 65 72 61 74 6f 72 0a 2a 2a 20 64 75 72  generator.** dur
1e3e0 69 6e 67 20 74 68 65 20 65 78 65 63 75 74 69 6f  ing the executio
1e3f0 6e 20 6f 66 20 63 6f 6d 70 6c 65 78 20 53 45 4c  n of complex SEL
1e400 45 43 54 20 73 74 61 74 65 6d 65 6e 74 73 2e 0a  ECT statements..
1e410 2a 2a 0a 2a 2a 20 54 68 65 73 65 20 72 6f 75 74  **.** These rout
1e420 69 6e 65 20 61 72 65 20 6e 6f 74 20 63 61 6c 6c  ine are not call
1e430 65 64 20 61 6e 79 77 68 65 72 65 20 66 72 6f 6d  ed anywhere from
1e440 20 77 69 74 68 69 6e 20 74 68 65 20 6e 6f 72 6d   within the norm
1e450 61 6c 0a 2a 2a 20 63 6f 64 65 20 62 61 73 65 2e  al.** code base.
1e460 20 20 54 68 65 6e 20 61 72 65 20 69 6e 74 65 6e    Then are inten
1e470 64 65 64 20 74 6f 20 62 65 20 63 61 6c 6c 65 64  ded to be called
1e480 20 66 72 6f 6d 20 77 69 74 68 69 6e 20 74 68 65   from within the
1e490 20 64 65 62 75 67 67 65 72 0a 2a 2a 20 6f 72 20   debugger.** or 
1e4a0 66 72 6f 6d 20 74 65 6d 70 6f 72 61 72 79 20 22  from temporary "
1e4b0 70 72 69 6e 74 66 22 20 73 74 61 74 65 6d 65 6e  printf" statemen
1e4c0 74 73 20 69 6e 73 65 72 74 65 64 20 66 6f 72 20  ts inserted for 
1e4d0 64 65 62 75 67 67 69 6e 67 2e 0a 2a 2f 0a 73 74  debugging..*/.st
1e4e0 61 74 69 63 20 76 6f 69 64 20 73 71 6c 69 74 65  atic void sqlite
1e4f0 33 50 72 69 6e 74 45 78 70 72 28 45 78 70 72 20  3PrintExpr(Expr 
1e500 2a 70 29 7b 0a 20 20 69 66 28 20 70 2d 3e 74 6f  *p){.  if( p->to
1e510 6b 65 6e 2e 7a 20 26 26 20 70 2d 3e 74 6f 6b 65  ken.z && p->toke
1e520 6e 2e 6e 3e 30 20 29 7b 0a 20 20 20 20 73 71 6c  n.n>0 ){.    sql
1e530 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28  ite3DebugPrintf(
1e540 22 28 25 2e 2a 73 22 2c 20 70 2d 3e 74 6f 6b 65  "(%.*s", p->toke
1e550 6e 2e 6e 2c 20 70 2d 3e 74 6f 6b 65 6e 2e 7a 29  n.n, p->token.z)
1e560 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73  ;.  }else{.    s
1e570 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74  qlite3DebugPrint
1e580 66 28 22 28 25 64 22 2c 20 70 2d 3e 6f 70 29 3b  f("(%d", p->op);
1e590 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e 70 4c  .  }.  if( p->pL
1e5a0 65 66 74 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  eft ){.    sqlit
1e5b0 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 20  e3DebugPrintf(" 
1e5c0 22 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 50  ");.    sqlite3P
1e5d0 72 69 6e 74 45 78 70 72 28 70 2d 3e 70 4c 65 66  rintExpr(p->pLef
1e5e0 74 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d  t);.  }.  if( p-
1e5f0 3e 70 52 69 67 68 74 20 29 7b 0a 20 20 20 20 73  >pRight ){.    s
1e600 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74  qlite3DebugPrint
1e610 66 28 22 20 22 29 3b 0a 20 20 20 20 73 71 6c 69  f(" ");.    sqli
1e620 74 65 33 50 72 69 6e 74 45 78 70 72 28 70 2d 3e  te3PrintExpr(p->
1e630 70 52 69 67 68 74 29 3b 0a 20 20 7d 0a 20 20 73  pRight);.  }.  s
1e640 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74  qlite3DebugPrint
1e650 66 28 22 29 22 29 3b 0a 7d 0a 73 74 61 74 69 63  f(")");.}.static
1e660 20 76 6f 69 64 20 73 71 6c 69 74 65 33 50 72 69   void sqlite3Pri
1e670 6e 74 45 78 70 72 4c 69 73 74 28 45 78 70 72 4c  ntExprList(ExprL
1e680 69 73 74 20 2a 70 4c 69 73 74 29 7b 0a 20 20 69  ist *pList){.  i
1e690 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  nt i;.  for(i=0;
1e6a0 20 69 3c 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b   i<pList->nExpr;
1e6b0 20 69 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74   i++){.    sqlit
1e6c0 65 33 50 72 69 6e 74 45 78 70 72 28 70 4c 69 73  e3PrintExpr(pLis
1e6d0 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 29 3b 0a  t->a[i].pExpr);.
1e6e0 20 20 20 20 69 66 28 20 69 3c 70 4c 69 73 74 2d      if( i<pList-
1e6f0 3e 6e 45 78 70 72 2d 31 20 29 7b 0a 20 20 20 20  >nExpr-1 ){.    
1e700 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72    sqlite3DebugPr
1e710 69 6e 74 66 28 22 2c 20 22 29 3b 0a 20 20 20 20  intf(", ");.    
1e720 7d 0a 20 20 7d 0a 7d 0a 73 74 61 74 69 63 20 76  }.  }.}.static v
1e730 6f 69 64 20 73 71 6c 69 74 65 33 50 72 69 6e 74  oid sqlite3Print
1e740 53 65 6c 65 63 74 28 53 65 6c 65 63 74 20 2a 70  Select(Select *p
1e750 2c 20 69 6e 74 20 69 6e 64 65 6e 74 29 7b 0a 20  , int indent){. 
1e760 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69   sqlite3DebugPri
1e770 6e 74 66 28 22 25 2a 73 53 45 4c 45 43 54 28 25  ntf("%*sSELECT(%
1e780 70 29 20 22 2c 20 69 6e 64 65 6e 74 2c 20 22 22  p) ", indent, ""
1e790 2c 20 70 29 3b 0a 20 20 73 71 6c 69 74 65 33 50  , p);.  sqlite3P
1e7a0 72 69 6e 74 45 78 70 72 4c 69 73 74 28 70 2d 3e  rintExprList(p->
1e7b0 70 45 4c 69 73 74 29 3b 0a 20 20 73 71 6c 69 74  pEList);.  sqlit
1e7c0 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 5c  e3DebugPrintf("\
1e7d0 6e 22 29 3b 0a 20 20 69 66 28 20 70 2d 3e 70 53  n");.  if( p->pS
1e7e0 72 63 20 29 7b 0a 20 20 20 20 63 68 61 72 20 2a  rc ){.    char *
1e7f0 7a 50 72 65 66 69 78 3b 0a 20 20 20 20 69 6e 74  zPrefix;.    int
1e800 20 69 3b 0a 20 20 20 20 7a 50 72 65 66 69 78 20   i;.    zPrefix 
1e810 3d 20 22 46 52 4f 4d 22 3b 0a 20 20 20 20 66 6f  = "FROM";.    fo
1e820 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 70 53 72 63  r(i=0; i<p->pSrc
1e830 2d 3e 6e 53 72 63 3b 20 69 2b 2b 29 7b 0a 20 20  ->nSrc; i++){.  
1e840 20 20 20 20 73 74 72 75 63 74 20 53 72 63 4c 69      struct SrcLi
1e850 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 20 3d  st_item *pItem =
1e860 20 26 70 2d 3e 70 53 72 63 2d 3e 61 5b 69 5d 3b   &p->pSrc->a[i];
1e870 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 65  .      sqlite3De
1e880 62 75 67 50 72 69 6e 74 66 28 22 25 2a 73 20 22  bugPrintf("%*s "
1e890 2c 20 69 6e 64 65 6e 74 2b 36 2c 20 7a 50 72 65  , indent+6, zPre
1e8a0 66 69 78 29 3b 0a 20 20 20 20 20 20 7a 50 72 65  fix);.      zPre
1e8b0 66 69 78 20 3d 20 22 22 3b 0a 20 20 20 20 20 20  fix = "";.      
1e8c0 69 66 28 20 70 49 74 65 6d 2d 3e 70 53 65 6c 65  if( pItem->pSele
1e8d0 63 74 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  ct ){.        sq
1e8e0 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66  lite3DebugPrintf
1e8f0 28 22 28 5c 6e 22 29 3b 0a 20 20 20 20 20 20 20  ("(\n");.       
1e900 20 73 71 6c 69 74 65 33 50 72 69 6e 74 53 65 6c   sqlite3PrintSel
1e910 65 63 74 28 70 49 74 65 6d 2d 3e 70 53 65 6c 65  ect(pItem->pSele
1e920 63 74 2c 20 69 6e 64 65 6e 74 2b 31 30 29 3b 0a  ct, indent+10);.
1e930 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 44          sqlite3D
1e940 65 62 75 67 50 72 69 6e 74 66 28 22 25 2a 73 29  ebugPrintf("%*s)
1e950 22 2c 20 69 6e 64 65 6e 74 2b 38 2c 20 22 22 29  ", indent+8, "")
1e960 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66  ;.      }else if
1e970 28 20 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65 20 29  ( pItem->zName )
1e980 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
1e990 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 25 73  3DebugPrintf("%s
1e9a0 22 2c 20 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65 29  ", pItem->zName)
1e9b0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
1e9c0 69 66 28 20 70 49 74 65 6d 2d 3e 70 54 61 62 20  if( pItem->pTab 
1e9d0 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
1e9e0 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 28  e3DebugPrintf("(
1e9f0 74 61 62 6c 65 3a 20 25 73 29 22 2c 20 70 49 74  table: %s)", pIt
1ea00 65 6d 2d 3e 70 54 61 62 2d 3e 7a 4e 61 6d 65 29  em->pTab->zName)
1ea10 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
1ea20 69 66 28 20 70 49 74 65 6d 2d 3e 7a 41 6c 69 61  if( pItem->zAlia
1ea30 73 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  s ){.        sql
1ea40 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28  ite3DebugPrintf(
1ea50 22 20 41 53 20 25 73 22 2c 20 70 49 74 65 6d 2d  " AS %s", pItem-
1ea60 3e 7a 41 6c 69 61 73 29 3b 0a 20 20 20 20 20 20  >zAlias);.      
1ea70 7d 0a 20 20 20 20 20 20 69 66 28 20 69 3c 70 2d  }.      if( i<p-
1ea80 3e 70 53 72 63 2d 3e 6e 53 72 63 2d 31 20 29 7b  >pSrc->nSrc-1 ){
1ea90 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
1eaa0 44 65 62 75 67 50 72 69 6e 74 66 28 22 2c 22 29  DebugPrintf(",")
1eab0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
1eac0 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e  sqlite3DebugPrin
1ead0 74 66 28 22 5c 6e 22 29 3b 0a 20 20 20 20 7d 0a  tf("\n");.    }.
1eae0 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e 70 57 68    }.  if( p->pWh
1eaf0 65 72 65 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ere ){.    sqlit
1eb00 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 25  e3DebugPrintf("%
1eb10 2a 73 20 57 48 45 52 45 20 22 2c 20 69 6e 64 65  *s WHERE ", inde
1eb20 6e 74 2c 20 22 22 29 3b 0a 20 20 20 20 73 71 6c  nt, "");.    sql
1eb30 69 74 65 33 50 72 69 6e 74 45 78 70 72 28 70 2d  ite3PrintExpr(p-
1eb40 3e 70 57 68 65 72 65 29 3b 0a 20 20 20 20 73 71  >pWhere);.    sq
1eb50 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66  lite3DebugPrintf
1eb60 28 22 5c 6e 22 29 3b 0a 20 20 7d 0a 20 20 69 66  ("\n");.  }.  if
1eb70 28 20 70 2d 3e 70 47 72 6f 75 70 42 79 20 29 7b  ( p->pGroupBy ){
1eb80 0a 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75  .    sqlite3Debu
1eb90 67 50 72 69 6e 74 66 28 22 25 2a 73 20 47 52 4f  gPrintf("%*s GRO
1eba0 55 50 20 42 59 20 22 2c 20 69 6e 64 65 6e 74 2c  UP BY ", indent,
1ebb0 20 22 22 29 3b 0a 20 20 20 20 73 71 6c 69 74 65   "");.    sqlite
1ebc0 33 50 72 69 6e 74 45 78 70 72 4c 69 73 74 28 70  3PrintExprList(p
1ebd0 2d 3e 70 47 72 6f 75 70 42 79 29 3b 0a 20 20 20  ->pGroupBy);.   
1ebe0 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69   sqlite3DebugPri
1ebf0 6e 74 66 28 22 5c 6e 22 29 3b 0a 20 20 7d 0a 20  ntf("\n");.  }. 
1ec00 20 69 66 28 20 70 2d 3e 70 48 61 76 69 6e 67 20   if( p->pHaving 
1ec10 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 65  ){.    sqlite3De
1ec20 62 75 67 50 72 69 6e 74 66 28 22 25 2a 73 20 48  bugPrintf("%*s H
1ec30 41 56 49 4e 47 20 22 2c 20 69 6e 64 65 6e 74 2c  AVING ", indent,
1ec40 20 22 22 29 3b 0a 20 20 20 20 73 71 6c 69 74 65   "");.    sqlite
1ec50 33 50 72 69 6e 74 45 78 70 72 28 70 2d 3e 70 48  3PrintExpr(p->pH
1ec60 61 76 69 6e 67 29 3b 0a 20 20 20 20 73 71 6c 69  aving);.    sqli
1ec70 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22  te3DebugPrintf("
1ec80 5c 6e 22 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  \n");.  }.  if( 
1ec90 70 2d 3e 70 4f 72 64 65 72 42 79 20 29 7b 0a 20  p->pOrderBy ){. 
1eca0 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50     sqlite3DebugP
1ecb0 72 69 6e 74 66 28 22 25 2a 73 20 4f 52 44 45 52  rintf("%*s ORDER
1ecc0 20 42 59 20 22 2c 20 69 6e 64 65 6e 74 2c 20 22   BY ", indent, "
1ecd0 22 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 50  ");.    sqlite3P
1ece0 72 69 6e 74 45 78 70 72 4c 69 73 74 28 70 2d 3e  rintExprList(p->
1ecf0 70 4f 72 64 65 72 42 79 29 3b 0a 20 20 20 20 73  pOrderBy);.    s
1ed00 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74  qlite3DebugPrint
1ed10 66 28 22 5c 6e 22 29 3b 0a 20 20 7d 0a 7d 0a 2f  f("\n");.  }.}./
1ed20 2a 20 45 6e 64 20 6f 66 20 74 68 65 20 73 74 72  * End of the str
1ed30 75 63 74 75 72 65 20 64 65 62 75 67 20 70 72 69  ucture debug pri
1ed40 6e 74 69 6e 67 20 63 6f 64 65 0a 2a 2a 2a 2a 2a  nting code.*****
1ed50 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1ed60 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1ed70 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1ed80 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1ed90 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 23 65 6e 64 69 66  ********/.#endif
1eda0 20 2f 2a 20 64 65 66 69 6e 65 64 28 53 51 4c 49   /* defined(SQLI
1edb0 54 45 5f 54 45 53 54 29 20 7c 7c 20 64 65 66 69  TE_TEST) || defi
1edc0 6e 65 64 28 53 51 4c 49 54 45 5f 44 45 42 55 47  ned(SQLITE_DEBUG
1edd0 29 20 2a 2f 0a                                   ) */.