/ Hex Artifact Content
Login

Artifact 859ea5194b05fb2f1f816368062478cda5baa9b8:


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 35 38  select.c,v 1.458
0200: 20 32 30 30 38 2f 30 37 2f 32 32 20 30 35 3a 30   2008/07/22 05:0
0210: 30 3a 35 36 20 73 68 61 6e 65 20 45 78 70 20 24  0:56 shane Exp $
0220: 0a 2a 2f 0a 23 69 6e 63 6c 75 64 65 20 22 73 71  .*/.#include "sq
0230: 6c 69 74 65 49 6e 74 2e 68 22 0a 0a 0a 2f 2a 0a  liteInt.h".../*.
0240: 2a 2a 20 44 65 6c 65 74 65 20 61 6c 6c 20 74 68  ** Delete all th
0250: 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 61 20 53  e content of a S
0260: 65 6c 65 63 74 20 73 74 72 75 63 74 75 72 65 20  elect structure 
0270: 62 75 74 20 64 6f 20 6e 6f 74 20 64 65 61 6c 6c  but do not deall
0280: 6f 63 61 74 65 0a 2a 2a 20 74 68 65 20 73 65 6c  ocate.** the sel
0290: 65 63 74 20 73 74 72 75 63 74 75 72 65 20 69 74  ect structure it
02a0: 73 65 6c 66 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  self..*/.static 
02b0: 76 6f 69 64 20 63 6c 65 61 72 53 65 6c 65 63 74  void clearSelect
02c0: 28 53 65 6c 65 63 74 20 2a 70 29 7b 0a 20 20 73  (Select *p){.  s
02d0: 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 65  qlite3ExprListDe
02e0: 6c 65 74 65 28 70 2d 3e 70 45 4c 69 73 74 29 3b  lete(p->pEList);
02f0: 0a 20 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73  .  sqlite3SrcLis
0300: 74 44 65 6c 65 74 65 28 70 2d 3e 70 53 72 63 29  tDelete(p->pSrc)
0310: 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 44  ;.  sqlite3ExprD
0320: 65 6c 65 74 65 28 70 2d 3e 70 57 68 65 72 65 29  elete(p->pWhere)
0330: 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c  ;.  sqlite3ExprL
0340: 69 73 74 44 65 6c 65 74 65 28 70 2d 3e 70 47 72  istDelete(p->pGr
0350: 6f 75 70 42 79 29 3b 0a 20 20 73 71 6c 69 74 65  oupBy);.  sqlite
0360: 33 45 78 70 72 44 65 6c 65 74 65 28 70 2d 3e 70  3ExprDelete(p->p
0370: 48 61 76 69 6e 67 29 3b 0a 20 20 73 71 6c 69 74  Having);.  sqlit
0380: 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65  e3ExprListDelete
0390: 28 70 2d 3e 70 4f 72 64 65 72 42 79 29 3b 0a 20  (p->pOrderBy);. 
03a0: 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65   sqlite3SelectDe
03b0: 6c 65 74 65 28 70 2d 3e 70 50 72 69 6f 72 29 3b  lete(p->pPrior);
03c0: 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65  .  sqlite3ExprDe
03d0: 6c 65 74 65 28 70 2d 3e 70 4c 69 6d 69 74 29 3b  lete(p->pLimit);
03e0: 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65  .  sqlite3ExprDe
03f0: 6c 65 74 65 28 70 2d 3e 70 4f 66 66 73 65 74 29  lete(p->pOffset)
0400: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69 74 69  ;.}../*.** Initi
0410: 61 6c 69 7a 65 20 61 20 53 65 6c 65 63 74 44 65  alize a SelectDe
0420: 73 74 20 73 74 72 75 63 74 75 72 65 2e 0a 2a 2f  st structure..*/
0430: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 53 65 6c  .void sqlite3Sel
0440: 65 63 74 44 65 73 74 49 6e 69 74 28 53 65 6c 65  ectDestInit(Sele
0450: 63 74 44 65 73 74 20 2a 70 44 65 73 74 2c 20 69  ctDest *pDest, i
0460: 6e 74 20 65 44 65 73 74 2c 20 69 6e 74 20 69 50  nt eDest, int iP
0470: 61 72 6d 29 7b 0a 20 20 70 44 65 73 74 2d 3e 65  arm){.  pDest->e
0480: 44 65 73 74 20 3d 20 65 44 65 73 74 3b 0a 20 20  Dest = eDest;.  
0490: 70 44 65 73 74 2d 3e 69 50 61 72 6d 20 3d 20 69  pDest->iParm = i
04a0: 50 61 72 6d 3b 0a 20 20 70 44 65 73 74 2d 3e 61  Parm;.  pDest->a
04b0: 66 66 69 6e 69 74 79 20 3d 20 30 3b 0a 20 20 70  ffinity = 0;.  p
04c0: 44 65 73 74 2d 3e 69 4d 65 6d 20 3d 20 30 3b 0a  Dest->iMem = 0;.
04d0: 20 20 70 44 65 73 74 2d 3e 6e 4d 65 6d 20 3d 20    pDest->nMem = 
04e0: 30 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c  0;.}.../*.** All
04f0: 6f 63 61 74 65 20 61 20 6e 65 77 20 53 65 6c 65  ocate a new Sele
0500: 63 74 20 73 74 72 75 63 74 75 72 65 20 61 6e 64  ct structure and
0510: 20 72 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65   return a pointe
0520: 72 20 74 6f 20 74 68 61 74 0a 2a 2a 20 73 74 72  r to that.** str
0530: 75 63 74 75 72 65 2e 0a 2a 2f 0a 53 65 6c 65 63  ucture..*/.Selec
0540: 74 20 2a 73 71 6c 69 74 65 33 53 65 6c 65 63 74  t *sqlite3Select
0550: 4e 65 77 28 0a 20 20 50 61 72 73 65 20 2a 70 50  New(.  Parse *pP
0560: 61 72 73 65 2c 20 20 20 20 20 20 20 20 2f 2a 20  arse,        /* 
0570: 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20  Parsing context 
0580: 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70  */.  ExprList *p
0590: 45 4c 69 73 74 2c 20 20 20 20 20 2f 2a 20 77 68  EList,     /* wh
05a0: 69 63 68 20 63 6f 6c 75 6d 6e 73 20 74 6f 20 69  ich columns to i
05b0: 6e 63 6c 75 64 65 20 69 6e 20 74 68 65 20 72 65  nclude in the re
05c0: 73 75 6c 74 20 2a 2f 0a 20 20 53 72 63 4c 69 73  sult */.  SrcLis
05d0: 74 20 2a 70 53 72 63 2c 20 20 20 20 20 20 20 20  t *pSrc,        
05e0: 2f 2a 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75  /* the FROM clau
05f0: 73 65 20 2d 2d 20 77 68 69 63 68 20 74 61 62 6c  se -- which tabl
0600: 65 73 20 74 6f 20 73 63 61 6e 20 2a 2f 0a 20 20  es to scan */.  
0610: 45 78 70 72 20 2a 70 57 68 65 72 65 2c 20 20 20  Expr *pWhere,   
0620: 20 20 20 20 20 20 2f 2a 20 74 68 65 20 57 48 45        /* the WHE
0630: 52 45 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 45  RE clause */.  E
0640: 78 70 72 4c 69 73 74 20 2a 70 47 72 6f 75 70 42  xprList *pGroupB
0650: 79 2c 20 20 20 2f 2a 20 74 68 65 20 47 52 4f 55  y,   /* the GROU
0660: 50 20 42 59 20 63 6c 61 75 73 65 20 2a 2f 0a 20  P BY clause */. 
0670: 20 45 78 70 72 20 2a 70 48 61 76 69 6e 67 2c 20   Expr *pHaving, 
0680: 20 20 20 20 20 20 20 2f 2a 20 74 68 65 20 48 41         /* the HA
0690: 56 49 4e 47 20 63 6c 61 75 73 65 20 2a 2f 0a 20  VING clause */. 
06a0: 20 45 78 70 72 4c 69 73 74 20 2a 70 4f 72 64 65   ExprList *pOrde
06b0: 72 42 79 2c 20 20 20 2f 2a 20 74 68 65 20 4f 52  rBy,   /* the OR
06c0: 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 2a 2f  DER BY clause */
06d0: 0a 20 20 69 6e 74 20 69 73 44 69 73 74 69 6e 63  .  int isDistinc
06e0: 74 2c 20 20 20 20 20 20 20 2f 2a 20 74 72 75 65  t,       /* true
06f0: 20 69 66 20 74 68 65 20 44 49 53 54 49 4e 43 54   if the DISTINCT
0700: 20 6b 65 79 77 6f 72 64 20 69 73 20 70 72 65 73   keyword is pres
0710: 65 6e 74 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70  ent */.  Expr *p
0720: 4c 69 6d 69 74 2c 20 20 20 20 20 20 20 20 20 2f  Limit,         /
0730: 2a 20 4c 49 4d 49 54 20 76 61 6c 75 65 2e 20 20  * LIMIT value.  
0740: 4e 55 4c 4c 20 6d 65 61 6e 73 20 6e 6f 74 20 75  NULL means not u
0750: 73 65 64 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70  sed */.  Expr *p
0760: 4f 66 66 73 65 74 20 20 20 20 20 20 20 20 20 2f  Offset         /
0770: 2a 20 4f 46 46 53 45 54 20 76 61 6c 75 65 2e 20  * OFFSET value. 
0780: 20 4e 55 4c 4c 20 6d 65 61 6e 73 20 6e 6f 20 6f   NULL means no o
0790: 66 66 73 65 74 20 2a 2f 0a 29 7b 0a 20 20 53 65  ffset */.){.  Se
07a0: 6c 65 63 74 20 2a 70 4e 65 77 3b 0a 20 20 53 65  lect *pNew;.  Se
07b0: 6c 65 63 74 20 73 74 61 6e 64 69 6e 3b 0a 20 20  lect standin;.  
07c0: 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50  sqlite3 *db = pP
07d0: 61 72 73 65 2d 3e 64 62 3b 0a 20 20 70 4e 65 77  arse->db;.  pNew
07e0: 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c   = sqlite3DbMall
07f0: 6f 63 5a 65 72 6f 28 64 62 2c 20 73 69 7a 65 6f  ocZero(db, sizeo
0800: 66 28 2a 70 4e 65 77 29 20 29 3b 0a 20 20 61 73  f(*pNew) );.  as
0810: 73 65 72 74 28 20 21 70 4f 66 66 73 65 74 20 7c  sert( !pOffset |
0820: 7c 20 70 4c 69 6d 69 74 20 29 3b 20 20 20 2f 2a  | pLimit );   /*
0830: 20 43 61 6e 27 74 20 68 61 76 65 20 4f 46 46 53   Can't have OFFS
0840: 45 54 20 77 69 74 68 6f 75 74 20 4c 49 4d 49 54  ET without LIMIT
0850: 2e 20 2a 2f 0a 20 20 69 66 28 20 70 4e 65 77 3d  . */.  if( pNew=
0860: 3d 30 20 29 7b 0a 20 20 20 20 70 4e 65 77 20 3d  =0 ){.    pNew =
0870: 20 26 73 74 61 6e 64 69 6e 3b 0a 20 20 20 20 6d   &standin;.    m
0880: 65 6d 73 65 74 28 70 4e 65 77 2c 20 30 2c 20 73  emset(pNew, 0, s
0890: 69 7a 65 6f 66 28 2a 70 4e 65 77 29 29 3b 0a 20  izeof(*pNew));. 
08a0: 20 7d 0a 20 20 69 66 28 20 70 45 4c 69 73 74 3d   }.  if( pEList=
08b0: 3d 30 20 29 7b 0a 20 20 20 20 70 45 4c 69 73 74  =0 ){.    pEList
08c0: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69   = sqlite3ExprLi
08d0: 73 74 41 70 70 65 6e 64 28 70 50 61 72 73 65 2c  stAppend(pParse,
08e0: 20 30 2c 20 73 71 6c 69 74 65 33 45 78 70 72 28   0, sqlite3Expr(
08f0: 64 62 2c 54 4b 5f 41 4c 4c 2c 30 2c 30 2c 30 29  db,TK_ALL,0,0,0)
0900: 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 70 4e 65 77  , 0);.  }.  pNew
0910: 2d 3e 70 45 4c 69 73 74 20 3d 20 70 45 4c 69 73  ->pEList = pELis
0920: 74 3b 0a 20 20 70 4e 65 77 2d 3e 70 53 72 63 20  t;.  pNew->pSrc 
0930: 3d 20 70 53 72 63 3b 0a 20 20 70 4e 65 77 2d 3e  = pSrc;.  pNew->
0940: 70 57 68 65 72 65 20 3d 20 70 57 68 65 72 65 3b  pWhere = pWhere;
0950: 0a 20 20 70 4e 65 77 2d 3e 70 47 72 6f 75 70 42  .  pNew->pGroupB
0960: 79 20 3d 20 70 47 72 6f 75 70 42 79 3b 0a 20 20  y = pGroupBy;.  
0970: 70 4e 65 77 2d 3e 70 48 61 76 69 6e 67 20 3d 20  pNew->pHaving = 
0980: 70 48 61 76 69 6e 67 3b 0a 20 20 70 4e 65 77 2d  pHaving;.  pNew-
0990: 3e 70 4f 72 64 65 72 42 79 20 3d 20 70 4f 72 64  >pOrderBy = pOrd
09a0: 65 72 42 79 3b 0a 20 20 70 4e 65 77 2d 3e 69 73  erBy;.  pNew->is
09b0: 44 69 73 74 69 6e 63 74 20 3d 20 69 73 44 69 73  Distinct = isDis
09c0: 74 69 6e 63 74 3b 0a 20 20 70 4e 65 77 2d 3e 6f  tinct;.  pNew->o
09d0: 70 20 3d 20 54 4b 5f 53 45 4c 45 43 54 3b 0a 20  p = TK_SELECT;. 
09e0: 20 61 73 73 65 72 74 28 20 70 4f 66 66 73 65 74   assert( pOffset
09f0: 3d 3d 30 20 7c 7c 20 70 4c 69 6d 69 74 21 3d 30  ==0 || pLimit!=0
0a00: 20 29 3b 0a 20 20 70 4e 65 77 2d 3e 70 4c 69 6d   );.  pNew->pLim
0a10: 69 74 20 3d 20 70 4c 69 6d 69 74 3b 0a 20 20 70  it = pLimit;.  p
0a20: 4e 65 77 2d 3e 70 4f 66 66 73 65 74 20 3d 20 70  New->pOffset = p
0a30: 4f 66 66 73 65 74 3b 0a 20 20 70 4e 65 77 2d 3e  Offset;.  pNew->
0a40: 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b 30 5d 20  addrOpenEphm[0] 
0a50: 3d 20 2d 31 3b 0a 20 20 70 4e 65 77 2d 3e 61 64  = -1;.  pNew->ad
0a60: 64 72 4f 70 65 6e 45 70 68 6d 5b 31 5d 20 3d 20  drOpenEphm[1] = 
0a70: 2d 31 3b 0a 20 20 70 4e 65 77 2d 3e 61 64 64 72  -1;.  pNew->addr
0a80: 4f 70 65 6e 45 70 68 6d 5b 32 5d 20 3d 20 2d 31  OpenEphm[2] = -1
0a90: 3b 0a 20 20 69 66 28 20 70 4e 65 77 3d 3d 26 73  ;.  if( pNew==&s
0aa0: 74 61 6e 64 69 6e 29 20 7b 0a 20 20 20 20 63 6c  tandin) {.    cl
0ab0: 65 61 72 53 65 6c 65 63 74 28 70 4e 65 77 29 3b  earSelect(pNew);
0ac0: 0a 20 20 20 20 70 4e 65 77 20 3d 20 30 3b 0a 20  .    pNew = 0;. 
0ad0: 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 4e 65 77   }.  return pNew
0ae0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74  ;.}../*.** Delet
0af0: 65 20 74 68 65 20 67 69 76 65 6e 20 53 65 6c 65  e the given Sele
0b00: 63 74 20 73 74 72 75 63 74 75 72 65 20 61 6e 64  ct structure and
0b10: 20 61 6c 6c 20 6f 66 20 69 74 73 20 73 75 62 73   all of its subs
0b20: 74 72 75 63 74 75 72 65 73 2e 0a 2a 2f 0a 76 6f  tructures..*/.vo
0b30: 69 64 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74  id sqlite3Select
0b40: 44 65 6c 65 74 65 28 53 65 6c 65 63 74 20 2a 70  Delete(Select *p
0b50: 29 7b 0a 20 20 69 66 28 20 70 20 29 7b 0a 20 20  ){.  if( p ){.  
0b60: 20 20 63 6c 65 61 72 53 65 6c 65 63 74 28 70 29    clearSelect(p)
0b70: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72  ;.    sqlite3_fr
0b80: 65 65 28 70 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  ee(p);.  }.}../*
0b90: 0a 2a 2a 20 47 69 76 65 6e 20 31 20 74 6f 20 33  .** Given 1 to 3
0ba0: 20 69 64 65 6e 74 69 66 69 65 72 73 20 70 72 65   identifiers pre
0bb0: 63 65 65 64 69 6e 67 20 74 68 65 20 4a 4f 49 4e  ceeding the JOIN
0bc0: 20 6b 65 79 77 6f 72 64 2c 20 64 65 74 65 72 6d   keyword, determ
0bd0: 69 6e 65 20 74 68 65 0a 2a 2a 20 74 79 70 65 20  ine the.** type 
0be0: 6f 66 20 6a 6f 69 6e 2e 20 20 52 65 74 75 72 6e  of join.  Return
0bf0: 20 61 6e 20 69 6e 74 65 67 65 72 20 63 6f 6e 73   an integer cons
0c00: 74 61 6e 74 20 74 68 61 74 20 65 78 70 72 65 73  tant that expres
0c10: 73 65 73 20 74 68 61 74 20 74 79 70 65 0a 2a 2a  ses that type.**
0c20: 20 69 6e 20 74 65 72 6d 73 20 6f 66 20 74 68 65   in terms of the
0c30: 20 66 6f 6c 6c 6f 77 69 6e 67 20 62 69 74 20 76   following bit v
0c40: 61 6c 75 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  alues:.**.**    
0c50: 20 4a 54 5f 49 4e 4e 45 52 0a 2a 2a 20 20 20 20   JT_INNER.**    
0c60: 20 4a 54 5f 43 52 4f 53 53 0a 2a 2a 20 20 20 20   JT_CROSS.**    
0c70: 20 4a 54 5f 4f 55 54 45 52 0a 2a 2a 20 20 20 20   JT_OUTER.**    
0c80: 20 4a 54 5f 4e 41 54 55 52 41 4c 0a 2a 2a 20 20   JT_NATURAL.**  
0c90: 20 20 20 4a 54 5f 4c 45 46 54 0a 2a 2a 20 20 20     JT_LEFT.**   
0ca0: 20 20 4a 54 5f 52 49 47 48 54 0a 2a 2a 0a 2a 2a    JT_RIGHT.**.**
0cb0: 20 41 20 66 75 6c 6c 20 6f 75 74 65 72 20 6a 6f   A full outer jo
0cc0: 69 6e 20 69 73 20 74 68 65 20 63 6f 6d 62 69 6e  in is the combin
0cd0: 61 74 69 6f 6e 20 6f 66 20 4a 54 5f 4c 45 46 54  ation of JT_LEFT
0ce0: 20 61 6e 64 20 4a 54 5f 52 49 47 48 54 2e 0a 2a   and JT_RIGHT..*
0cf0: 2a 0a 2a 2a 20 49 66 20 61 6e 20 69 6c 6c 65 67  *.** If an illeg
0d00: 61 6c 20 6f 72 20 75 6e 73 75 70 70 6f 72 74 65  al or unsupporte
0d10: 64 20 6a 6f 69 6e 20 74 79 70 65 20 69 73 20 73  d join type is s
0d20: 65 65 6e 2c 20 74 68 65 6e 20 73 74 69 6c 6c 20  een, then still 
0d30: 72 65 74 75 72 6e 0a 2a 2a 20 61 20 6a 6f 69 6e  return.** a join
0d40: 20 74 79 70 65 2c 20 62 75 74 20 70 75 74 20 61   type, but put a
0d50: 6e 20 65 72 72 6f 72 20 69 6e 20 74 68 65 20 70  n error in the p
0d60: 50 61 72 73 65 20 73 74 72 75 63 74 75 72 65 2e  Parse structure.
0d70: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 4a  .*/.int sqlite3J
0d80: 6f 69 6e 54 79 70 65 28 50 61 72 73 65 20 2a 70  oinType(Parse *p
0d90: 50 61 72 73 65 2c 20 54 6f 6b 65 6e 20 2a 70 41  Parse, Token *pA
0da0: 2c 20 54 6f 6b 65 6e 20 2a 70 42 2c 20 54 6f 6b  , Token *pB, Tok
0db0: 65 6e 20 2a 70 43 29 7b 0a 20 20 69 6e 74 20 6a  en *pC){.  int j
0dc0: 6f 69 6e 74 79 70 65 20 3d 20 30 3b 0a 20 20 54  ointype = 0;.  T
0dd0: 6f 6b 65 6e 20 2a 61 70 41 6c 6c 5b 33 5d 3b 0a  oken *apAll[3];.
0de0: 20 20 54 6f 6b 65 6e 20 2a 70 3b 0a 20 20 73 74    Token *p;.  st
0df0: 61 74 69 63 20 63 6f 6e 73 74 20 73 74 72 75 63  atic const struc
0e00: 74 20 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68  t {.    const ch
0e10: 61 72 20 7a 4b 65 79 77 6f 72 64 5b 38 5d 3b 0a  ar zKeyword[8];.
0e20: 20 20 20 20 75 38 20 6e 43 68 61 72 3b 0a 20 20      u8 nChar;.  
0e30: 20 20 75 38 20 63 6f 64 65 3b 0a 20 20 7d 20 6b    u8 code;.  } k
0e40: 65 79 77 6f 72 64 73 5b 5d 20 3d 20 7b 0a 20 20  eywords[] = {.  
0e50: 20 20 7b 20 22 6e 61 74 75 72 61 6c 22 2c 20 37    { "natural", 7
0e60: 2c 20 4a 54 5f 4e 41 54 55 52 41 4c 20 7d 2c 0a  , JT_NATURAL },.
0e70: 20 20 20 20 7b 20 22 6c 65 66 74 22 2c 20 20 20      { "left",   
0e80: 20 34 2c 20 4a 54 5f 4c 45 46 54 7c 4a 54 5f 4f   4, JT_LEFT|JT_O
0e90: 55 54 45 52 20 7d 2c 0a 20 20 20 20 7b 20 22 72  UTER },.    { "r
0ea0: 69 67 68 74 22 2c 20 20 20 35 2c 20 4a 54 5f 52  ight",   5, JT_R
0eb0: 49 47 48 54 7c 4a 54 5f 4f 55 54 45 52 20 7d 2c  IGHT|JT_OUTER },
0ec0: 0a 20 20 20 20 7b 20 22 66 75 6c 6c 22 2c 20 20  .    { "full",  
0ed0: 20 20 34 2c 20 4a 54 5f 4c 45 46 54 7c 4a 54 5f    4, JT_LEFT|JT_
0ee0: 52 49 47 48 54 7c 4a 54 5f 4f 55 54 45 52 20 7d  RIGHT|JT_OUTER }
0ef0: 2c 0a 20 20 20 20 7b 20 22 6f 75 74 65 72 22 2c  ,.    { "outer",
0f00: 20 20 20 35 2c 20 4a 54 5f 4f 55 54 45 52 20 7d     5, JT_OUTER }
0f10: 2c 0a 20 20 20 20 7b 20 22 69 6e 6e 65 72 22 2c  ,.    { "inner",
0f20: 20 20 20 35 2c 20 4a 54 5f 49 4e 4e 45 52 20 7d     5, JT_INNER }
0f30: 2c 0a 20 20 20 20 7b 20 22 63 72 6f 73 73 22 2c  ,.    { "cross",
0f40: 20 20 20 35 2c 20 4a 54 5f 49 4e 4e 45 52 7c 4a     5, JT_INNER|J
0f50: 54 5f 43 52 4f 53 53 20 7d 2c 0a 20 20 7d 3b 0a  T_CROSS },.  };.
0f60: 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 61 70    int i, j;.  ap
0f70: 41 6c 6c 5b 30 5d 20 3d 20 70 41 3b 0a 20 20 61  All[0] = pA;.  a
0f80: 70 41 6c 6c 5b 31 5d 20 3d 20 70 42 3b 0a 20 20  pAll[1] = pB;.  
0f90: 61 70 41 6c 6c 5b 32 5d 20 3d 20 70 43 3b 0a 20  apAll[2] = pC;. 
0fa0: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 33 20 26 26   for(i=0; i<3 &&
0fb0: 20 61 70 41 6c 6c 5b 69 5d 3b 20 69 2b 2b 29 7b   apAll[i]; i++){
0fc0: 0a 20 20 20 20 70 20 3d 20 61 70 41 6c 6c 5b 69  .    p = apAll[i
0fd0: 5d 3b 0a 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20  ];.    for(j=0; 
0fe0: 6a 3c 73 69 7a 65 6f 66 28 6b 65 79 77 6f 72 64  j<sizeof(keyword
0ff0: 73 29 2f 73 69 7a 65 6f 66 28 6b 65 79 77 6f 72  s)/sizeof(keywor
1000: 64 73 5b 30 5d 29 3b 20 6a 2b 2b 29 7b 0a 20 20  ds[0]); j++){.  
1010: 20 20 20 20 69 66 28 20 70 2d 3e 6e 3d 3d 6b 65      if( p->n==ke
1020: 79 77 6f 72 64 73 5b 6a 5d 2e 6e 43 68 61 72 20  ywords[j].nChar 
1030: 0a 20 20 20 20 20 20 20 20 20 20 26 26 20 73 71  .          && sq
1040: 6c 69 74 65 33 53 74 72 4e 49 43 6d 70 28 28 63  lite3StrNICmp((c
1050: 68 61 72 2a 29 70 2d 3e 7a 2c 20 6b 65 79 77 6f  har*)p->z, keywo
1060: 72 64 73 5b 6a 5d 2e 7a 4b 65 79 77 6f 72 64 2c  rds[j].zKeyword,
1070: 20 70 2d 3e 6e 29 3d 3d 30 20 29 7b 0a 20 20 20   p->n)==0 ){.   
1080: 20 20 20 20 20 6a 6f 69 6e 74 79 70 65 20 7c 3d       jointype |=
1090: 20 6b 65 79 77 6f 72 64 73 5b 6a 5d 2e 63 6f 64   keywords[j].cod
10a0: 65 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b  e;.        break
10b0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
10c0: 20 20 20 20 69 66 28 20 6a 3e 3d 73 69 7a 65 6f      if( j>=sizeo
10d0: 66 28 6b 65 79 77 6f 72 64 73 29 2f 73 69 7a 65  f(keywords)/size
10e0: 6f 66 28 6b 65 79 77 6f 72 64 73 5b 30 5d 29 20  of(keywords[0]) 
10f0: 29 7b 0a 20 20 20 20 20 20 6a 6f 69 6e 74 79 70  ){.      jointyp
1100: 65 20 7c 3d 20 4a 54 5f 45 52 52 4f 52 3b 0a 20  e |= JT_ERROR;. 
1110: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
1120: 7d 0a 20 20 7d 0a 20 20 69 66 28 0a 20 20 20 20  }.  }.  if(.    
1130: 20 28 6a 6f 69 6e 74 79 70 65 20 26 20 28 4a 54   (jointype & (JT
1140: 5f 49 4e 4e 45 52 7c 4a 54 5f 4f 55 54 45 52 29  _INNER|JT_OUTER)
1150: 29 3d 3d 28 4a 54 5f 49 4e 4e 45 52 7c 4a 54 5f  )==(JT_INNER|JT_
1160: 4f 55 54 45 52 29 20 7c 7c 0a 20 20 20 20 20 28  OUTER) ||.     (
1170: 6a 6f 69 6e 74 79 70 65 20 26 20 4a 54 5f 45 52  jointype & JT_ER
1180: 52 4f 52 29 21 3d 30 0a 20 20 29 7b 0a 20 20 20  ROR)!=0.  ){.   
1190: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 70   const char *zSp
11a0: 20 3d 20 22 20 22 3b 0a 20 20 20 20 61 73 73 65   = " ";.    asse
11b0: 72 74 28 20 70 42 21 3d 30 20 29 3b 0a 20 20 20  rt( pB!=0 );.   
11c0: 20 69 66 28 20 70 43 3d 3d 30 20 29 7b 20 7a 53   if( pC==0 ){ zS
11d0: 70 2b 2b 3b 20 7d 0a 20 20 20 20 73 71 6c 69 74  p++; }.    sqlit
11e0: 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
11f0: 65 2c 20 22 75 6e 6b 6e 6f 77 6e 20 6f 72 20 75  e, "unknown or u
1200: 6e 73 75 70 70 6f 72 74 65 64 20 6a 6f 69 6e 20  nsupported join 
1210: 74 79 70 65 3a 20 22 0a 20 20 20 20 20 20 20 22  type: ".       "
1220: 25 54 20 25 54 25 73 25 54 22 2c 20 70 41 2c 20  %T %T%s%T", pA, 
1230: 70 42 2c 20 7a 53 70 2c 20 70 43 29 3b 0a 20 20  pB, zSp, pC);.  
1240: 20 20 6a 6f 69 6e 74 79 70 65 20 3d 20 4a 54 5f    jointype = JT_
1250: 49 4e 4e 45 52 3b 0a 20 20 7d 65 6c 73 65 20 69  INNER;.  }else i
1260: 66 28 20 6a 6f 69 6e 74 79 70 65 20 26 20 4a 54  f( jointype & JT
1270: 5f 52 49 47 48 54 20 29 7b 0a 20 20 20 20 73 71  _RIGHT ){.    sq
1280: 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
1290: 61 72 73 65 2c 20 0a 20 20 20 20 20 20 22 52 49  arse, .      "RI
12a0: 47 48 54 20 61 6e 64 20 46 55 4c 4c 20 4f 55 54  GHT and FULL OUT
12b0: 45 52 20 4a 4f 49 4e 73 20 61 72 65 20 6e 6f 74  ER JOINs are not
12c0: 20 63 75 72 72 65 6e 74 6c 79 20 73 75 70 70 6f   currently suppo
12d0: 72 74 65 64 22 29 3b 0a 20 20 20 20 6a 6f 69 6e  rted");.    join
12e0: 74 79 70 65 20 3d 20 4a 54 5f 49 4e 4e 45 52 3b  type = JT_INNER;
12f0: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 6a 6f  .  }.  return jo
1300: 69 6e 74 79 70 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  intype;.}../*.**
1310: 20 52 65 74 75 72 6e 20 74 68 65 20 69 6e 64 65   Return the inde
1320: 78 20 6f 66 20 61 20 63 6f 6c 75 6d 6e 20 69 6e  x of a column in
1330: 20 61 20 74 61 62 6c 65 2e 20 20 52 65 74 75 72   a table.  Retur
1340: 6e 20 2d 31 20 69 66 20 74 68 65 20 63 6f 6c 75  n -1 if the colu
1350: 6d 6e 0a 2a 2a 20 69 73 20 6e 6f 74 20 63 6f 6e  mn.** is not con
1360: 74 61 69 6e 65 64 20 69 6e 20 74 68 65 20 74 61  tained in the ta
1370: 62 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ble..*/.static i
1380: 6e 74 20 63 6f 6c 75 6d 6e 49 6e 64 65 78 28 54  nt columnIndex(T
1390: 61 62 6c 65 20 2a 70 54 61 62 2c 20 63 6f 6e 73  able *pTab, cons
13a0: 74 20 63 68 61 72 20 2a 7a 43 6f 6c 29 7b 0a 20  t char *zCol){. 
13b0: 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d   int i;.  for(i=
13c0: 30 3b 20 69 3c 70 54 61 62 2d 3e 6e 43 6f 6c 3b  0; i<pTab->nCol;
13d0: 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 73   i++){.    if( s
13e0: 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 70 54  qlite3StrICmp(pT
13f0: 61 62 2d 3e 61 43 6f 6c 5b 69 5d 2e 7a 4e 61 6d  ab->aCol[i].zNam
1400: 65 2c 20 7a 43 6f 6c 29 3d 3d 30 20 29 20 72 65  e, zCol)==0 ) re
1410: 74 75 72 6e 20 69 3b 0a 20 20 7d 0a 20 20 72 65  turn i;.  }.  re
1420: 74 75 72 6e 20 2d 31 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn -1;.}../*.*
1430: 2a 20 53 65 74 20 74 68 65 20 76 61 6c 75 65 20  * Set the value 
1440: 6f 66 20 61 20 74 6f 6b 65 6e 20 74 6f 20 61 20  of a token to a 
1450: 27 5c 30 30 30 27 2d 74 65 72 6d 69 6e 61 74 65  '\000'-terminate
1460: 64 20 73 74 72 69 6e 67 2e 0a 2a 2f 0a 73 74 61  d string..*/.sta
1470: 74 69 63 20 76 6f 69 64 20 73 65 74 54 6f 6b 65  tic void setToke
1480: 6e 28 54 6f 6b 65 6e 20 2a 70 2c 20 63 6f 6e 73  n(Token *p, cons
1490: 74 20 63 68 61 72 20 2a 7a 29 7b 0a 20 20 70 2d  t char *z){.  p-
14a0: 3e 7a 20 3d 20 28 75 38 2a 29 7a 3b 0a 20 20 70  >z = (u8*)z;.  p
14b0: 2d 3e 6e 20 3d 20 7a 20 3f 20 73 74 72 6c 65 6e  ->n = z ? strlen
14c0: 28 7a 29 20 3a 20 30 3b 0a 20 20 70 2d 3e 64 79  (z) : 0;.  p->dy
14d0: 6e 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  n = 0;.}../*.** 
14e0: 53 65 74 20 74 68 65 20 74 6f 6b 65 6e 20 74 6f  Set the token to
14f0: 20 74 68 65 20 64 6f 75 62 6c 65 2d 71 75 6f 74   the double-quot
1500: 65 64 20 61 6e 64 20 65 73 63 61 70 65 64 20 76  ed and escaped v
1510: 65 72 73 69 6f 6e 20 6f 66 20 74 68 65 20 73 74  ersion of the st
1520: 72 69 6e 67 20 70 6f 69 6e 74 65 64 0a 2a 2a 20  ring pointed.** 
1530: 74 6f 20 62 79 20 7a 2e 20 46 6f 72 20 65 78 61  to by z. For exa
1540: 6d 70 6c 65 3b 0a 2a 2a 0a 2a 2a 20 20 20 20 7b  mple;.**.**    {
1550: 61 22 62 63 7d 20 20 2d 3e 20 20 7b 22 61 22 22  a"bc}  ->  {"a""
1560: 62 63 22 7d 0a 2a 2f 0a 73 74 61 74 69 63 20 76  bc"}.*/.static v
1570: 6f 69 64 20 73 65 74 51 75 6f 74 65 64 54 6f 6b  oid setQuotedTok
1580: 65 6e 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  en(Parse *pParse
1590: 2c 20 54 6f 6b 65 6e 20 2a 70 2c 20 63 6f 6e 73  , Token *p, cons
15a0: 74 20 63 68 61 72 20 2a 7a 29 7b 0a 0a 20 20 2f  t char *z){..  /
15b0: 2a 20 43 68 65 63 6b 20 69 66 20 74 68 65 20 73  * Check if the s
15c0: 74 72 69 6e 67 20 63 6f 6e 74 61 69 6e 73 20 61  tring contains a
15d0: 6e 79 20 22 20 63 68 61 72 61 63 74 65 72 73 2e  ny " characters.
15e0: 20 49 66 20 69 74 20 64 6f 65 73 2c 20 74 68 65   If it does, the
15f0: 6e 0a 20 20 2a 2a 20 74 68 69 73 20 66 75 6e 63  n.  ** this func
1600: 74 69 6f 6e 20 77 69 6c 6c 20 6d 61 6c 6c 6f 63  tion will malloc
1610: 20 73 70 61 63 65 20 74 6f 20 63 72 65 61 74 65   space to create
1620: 20 61 20 71 75 6f 74 65 64 20 76 65 72 73 69 6f   a quoted versio
1630: 6e 20 6f 66 0a 20 20 2a 2a 20 74 68 65 20 73 74  n of.  ** the st
1640: 72 69 6e 67 20 69 6e 2e 20 4f 74 68 65 72 77 69  ring in. Otherwi
1650: 73 65 2c 20 73 61 76 65 20 61 20 63 61 6c 6c 20  se, save a call 
1660: 74 6f 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74  to sqlite3MPrint
1670: 66 28 29 20 62 79 0a 20 20 2a 2a 20 6a 75 73 74  f() by.  ** just
1680: 20 63 6f 70 79 69 6e 67 20 74 68 65 20 70 6f 69   copying the poi
1690: 6e 74 65 72 20 74 6f 20 74 68 65 20 73 74 72 69  nter to the stri
16a0: 6e 67 2e 0a 20 20 2a 2f 0a 20 20 63 6f 6e 73 74  ng..  */.  const
16b0: 20 63 68 61 72 20 2a 7a 32 20 3d 20 7a 3b 0a 20   char *z2 = z;. 
16c0: 20 77 68 69 6c 65 28 20 2a 7a 32 20 29 7b 0a 20   while( *z2 ){. 
16d0: 20 20 20 69 66 28 20 2a 7a 32 3d 3d 27 22 27 20     if( *z2=='"' 
16e0: 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 7a 32 2b  ) break;.    z2+
16f0: 2b 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 2a 7a  +;.  }..  if( *z
1700: 32 20 29 7b 0a 20 20 20 20 2f 2a 20 53 74 72 69  2 ){.    /* Stri
1710: 6e 67 20 63 6f 6e 74 61 69 6e 73 20 22 20 63 68  ng contains " ch
1720: 61 72 61 63 74 65 72 73 20 2d 20 63 6f 70 79 20  aracters - copy 
1730: 61 6e 64 20 71 75 6f 74 65 20 74 68 65 20 73 74  and quote the st
1740: 72 69 6e 67 2e 20 2a 2f 0a 20 20 20 20 70 2d 3e  ring. */.    p->
1750: 7a 20 3d 20 28 75 38 20 2a 29 73 71 6c 69 74 65  z = (u8 *)sqlite
1760: 33 4d 50 72 69 6e 74 66 28 70 50 61 72 73 65 2d  3MPrintf(pParse-
1770: 3e 64 62 2c 20 22 5c 22 25 77 5c 22 22 2c 20 7a  >db, "\"%w\"", z
1780: 29 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 7a 20  );.    if( p->z 
1790: 29 7b 0a 20 20 20 20 20 20 70 2d 3e 6e 20 3d 20  ){.      p->n = 
17a0: 73 74 72 6c 65 6e 28 28 63 68 61 72 20 2a 29 70  strlen((char *)p
17b0: 2d 3e 7a 29 3b 0a 20 20 20 20 20 20 70 2d 3e 64  ->z);.      p->d
17c0: 79 6e 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20  yn = 1;.    }.  
17d0: 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 53 74  }else{.    /* St
17e0: 72 69 6e 67 20 63 6f 6e 74 61 69 6e 73 20 6e 6f  ring contains no
17f0: 20 22 20 63 68 61 72 61 63 74 65 72 73 20 2d 20   " characters - 
1800: 63 6f 70 79 20 74 68 65 20 70 6f 69 6e 74 65 72  copy the pointer
1810: 2e 20 2a 2f 0a 20 20 20 20 70 2d 3e 7a 20 3d 20  . */.    p->z = 
1820: 28 75 38 2a 29 7a 3b 0a 20 20 20 20 70 2d 3e 6e  (u8*)z;.    p->n
1830: 20 3d 20 28 7a 32 20 2d 20 7a 29 3b 0a 20 20 20   = (z2 - z);.   
1840: 20 70 2d 3e 64 79 6e 20 3d 20 30 3b 0a 20 20 7d   p->dyn = 0;.  }
1850: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65  .}../*.** Create
1860: 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 6e   an expression n
1870: 6f 64 65 20 66 6f 72 20 61 6e 20 69 64 65 6e 74  ode for an ident
1880: 69 66 69 65 72 20 77 69 74 68 20 74 68 65 20 6e  ifier with the n
1890: 61 6d 65 20 6f 66 20 7a 4e 61 6d 65 0a 2a 2f 0a  ame of zName.*/.
18a0: 45 78 70 72 20 2a 73 71 6c 69 74 65 33 43 72 65  Expr *sqlite3Cre
18b0: 61 74 65 49 64 45 78 70 72 28 50 61 72 73 65 20  ateIdExpr(Parse 
18c0: 2a 70 50 61 72 73 65 2c 20 63 6f 6e 73 74 20 63  *pParse, const c
18d0: 68 61 72 20 2a 7a 4e 61 6d 65 29 7b 0a 20 20 54  har *zName){.  T
18e0: 6f 6b 65 6e 20 64 75 6d 6d 79 3b 0a 20 20 73 65  oken dummy;.  se
18f0: 74 54 6f 6b 65 6e 28 26 64 75 6d 6d 79 2c 20 7a  tToken(&dummy, z
1900: 4e 61 6d 65 29 3b 0a 20 20 72 65 74 75 72 6e 20  Name);.  return 
1910: 73 71 6c 69 74 65 33 50 45 78 70 72 28 70 50 61  sqlite3PExpr(pPa
1920: 72 73 65 2c 20 54 4b 5f 49 44 2c 20 30 2c 20 30  rse, TK_ID, 0, 0
1930: 2c 20 26 64 75 6d 6d 79 29 3b 0a 7d 0a 0a 2f 2a  , &dummy);.}../*
1940: 0a 2a 2a 20 41 64 64 20 61 20 74 65 72 6d 20 74  .** Add a term t
1950: 6f 20 74 68 65 20 57 48 45 52 45 20 65 78 70 72  o the WHERE expr
1960: 65 73 73 69 6f 6e 20 69 6e 20 2a 70 70 45 78 70  ession in *ppExp
1970: 72 20 74 68 61 74 20 72 65 71 75 69 72 65 73 20  r that requires 
1980: 74 68 65 0a 2a 2a 20 7a 43 6f 6c 20 63 6f 6c 75  the.** zCol colu
1990: 6d 6e 20 74 6f 20 62 65 20 65 71 75 61 6c 20 69  mn to be equal i
19a0: 6e 20 74 68 65 20 74 77 6f 20 74 61 62 6c 65 73  n the two tables
19b0: 20 70 54 61 62 31 20 61 6e 64 20 70 54 61 62 32   pTab1 and pTab2
19c0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
19d0: 20 61 64 64 57 68 65 72 65 54 65 72 6d 28 0a 20   addWhereTerm(. 
19e0: 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
19f0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72            /* Par
1a00: 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  sing context */.
1a10: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43    const char *zC
1a20: 6f 6c 2c 20 20 20 20 20 20 20 20 2f 2a 20 4e 61  ol,        /* Na
1a30: 6d 65 20 6f 66 20 74 68 65 20 63 6f 6c 75 6d 6e  me of the column
1a40: 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 54 61 62 6c   */.  const Tabl
1a50: 65 20 2a 70 54 61 62 31 2c 20 20 20 20 20 20 2f  e *pTab1,      /
1a60: 2a 20 46 69 72 73 74 20 74 61 62 6c 65 20 2a 2f  * First table */
1a70: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
1a80: 41 6c 69 61 73 31 2c 20 20 20 20 20 2f 2a 20 41  Alias1,     /* A
1a90: 6c 69 61 73 20 66 6f 72 20 66 69 72 73 74 20 74  lias for first t
1aa0: 61 62 6c 65 2e 20 20 4d 61 79 20 62 65 20 4e 55  able.  May be NU
1ab0: 4c 4c 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 54 61  LL */.  const Ta
1ac0: 62 6c 65 20 2a 70 54 61 62 32 2c 20 20 20 20 20  ble *pTab2,     
1ad0: 20 2f 2a 20 53 65 63 6f 6e 64 20 74 61 62 6c 65   /* Second table
1ae0: 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72   */.  const char
1af0: 20 2a 7a 41 6c 69 61 73 32 2c 20 20 20 20 20 2f   *zAlias2,     /
1b00: 2a 20 41 6c 69 61 73 20 66 6f 72 20 73 65 63 6f  * Alias for seco
1b10: 6e 64 20 74 61 62 6c 65 2e 20 20 4d 61 79 20 62  nd table.  May b
1b20: 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20 69 6e 74 20  e NULL */.  int 
1b30: 69 52 69 67 68 74 4a 6f 69 6e 54 61 62 6c 65 2c  iRightJoinTable,
1b40: 20 20 20 20 20 2f 2a 20 56 44 42 45 20 63 75 72       /* VDBE cur
1b50: 73 6f 72 20 66 6f 72 20 74 68 65 20 72 69 67 68  sor for the righ
1b60: 74 20 74 61 62 6c 65 20 2a 2f 0a 20 20 45 78 70  t table */.  Exp
1b70: 72 20 2a 2a 70 70 45 78 70 72 2c 20 20 20 20 20  r **ppExpr,     
1b80: 20 20 20 20 20 20 2f 2a 20 41 64 64 20 74 68 65        /* Add the
1b90: 20 65 71 75 61 6c 69 74 79 20 74 65 72 6d 20 74   equality term t
1ba0: 6f 20 74 68 69 73 20 65 78 70 72 65 73 73 69 6f  o this expressio
1bb0: 6e 20 2a 2f 0a 20 20 69 6e 74 20 69 73 4f 75 74  n */.  int isOut
1bc0: 65 72 4a 6f 69 6e 20 20 20 20 20 20 20 20 20 20  erJoin          
1bd0: 2f 2a 20 54 72 75 65 20 69 66 20 64 65 61 6c 69  /* True if deali
1be0: 6e 67 20 77 69 74 68 20 61 6e 20 4f 55 54 45 52  ng with an OUTER
1bf0: 20 6a 6f 69 6e 20 2a 2f 0a 29 7b 0a 20 20 45 78   join */.){.  Ex
1c00: 70 72 20 2a 70 45 31 61 2c 20 2a 70 45 31 62 2c  pr *pE1a, *pE1b,
1c10: 20 2a 70 45 31 63 3b 0a 20 20 45 78 70 72 20 2a   *pE1c;.  Expr *
1c20: 70 45 32 61 2c 20 2a 70 45 32 62 2c 20 2a 70 45  pE2a, *pE2b, *pE
1c30: 32 63 3b 0a 20 20 45 78 70 72 20 2a 70 45 3b 0a  2c;.  Expr *pE;.
1c40: 0a 20 20 70 45 31 61 20 3d 20 73 71 6c 69 74 65  .  pE1a = sqlite
1c50: 33 43 72 65 61 74 65 49 64 45 78 70 72 28 70 50  3CreateIdExpr(pP
1c60: 61 72 73 65 2c 20 7a 43 6f 6c 29 3b 0a 20 20 70  arse, zCol);.  p
1c70: 45 32 61 20 3d 20 73 71 6c 69 74 65 33 43 72 65  E2a = sqlite3Cre
1c80: 61 74 65 49 64 45 78 70 72 28 70 50 61 72 73 65  ateIdExpr(pParse
1c90: 2c 20 7a 43 6f 6c 29 3b 0a 20 20 69 66 28 20 7a  , zCol);.  if( z
1ca0: 41 6c 69 61 73 31 3d 3d 30 20 29 7b 0a 20 20 20  Alias1==0 ){.   
1cb0: 20 7a 41 6c 69 61 73 31 20 3d 20 70 54 61 62 31   zAlias1 = pTab1
1cc0: 2d 3e 7a 4e 61 6d 65 3b 0a 20 20 7d 0a 20 20 70  ->zName;.  }.  p
1cd0: 45 31 62 20 3d 20 73 71 6c 69 74 65 33 43 72 65  E1b = sqlite3Cre
1ce0: 61 74 65 49 64 45 78 70 72 28 70 50 61 72 73 65  ateIdExpr(pParse
1cf0: 2c 20 7a 41 6c 69 61 73 31 29 3b 0a 20 20 69 66  , zAlias1);.  if
1d00: 28 20 7a 41 6c 69 61 73 32 3d 3d 30 20 29 7b 0a  ( zAlias2==0 ){.
1d10: 20 20 20 20 7a 41 6c 69 61 73 32 20 3d 20 70 54      zAlias2 = pT
1d20: 61 62 32 2d 3e 7a 4e 61 6d 65 3b 0a 20 20 7d 0a  ab2->zName;.  }.
1d30: 20 20 70 45 32 62 20 3d 20 73 71 6c 69 74 65 33    pE2b = sqlite3
1d40: 43 72 65 61 74 65 49 64 45 78 70 72 28 70 50 61  CreateIdExpr(pPa
1d50: 72 73 65 2c 20 7a 41 6c 69 61 73 32 29 3b 0a 20  rse, zAlias2);. 
1d60: 20 70 45 31 63 20 3d 20 73 71 6c 69 74 65 33 50   pE1c = sqlite3P
1d70: 45 78 70 72 28 70 50 61 72 73 65 2c 20 54 4b 5f  Expr(pParse, TK_
1d80: 44 4f 54 2c 20 70 45 31 62 2c 20 70 45 31 61 2c  DOT, pE1b, pE1a,
1d90: 20 30 29 3b 0a 20 20 70 45 32 63 20 3d 20 73 71   0);.  pE2c = sq
1da0: 6c 69 74 65 33 50 45 78 70 72 28 70 50 61 72 73  lite3PExpr(pPars
1db0: 65 2c 20 54 4b 5f 44 4f 54 2c 20 70 45 32 62 2c  e, TK_DOT, pE2b,
1dc0: 20 70 45 32 61 2c 20 30 29 3b 0a 20 20 70 45 20   pE2a, 0);.  pE 
1dd0: 3d 20 73 71 6c 69 74 65 33 50 45 78 70 72 28 70  = sqlite3PExpr(p
1de0: 50 61 72 73 65 2c 20 54 4b 5f 45 51 2c 20 70 45  Parse, TK_EQ, pE
1df0: 31 63 2c 20 70 45 32 63 2c 20 30 29 3b 0a 20 20  1c, pE2c, 0);.  
1e00: 69 66 28 20 70 45 20 26 26 20 69 73 4f 75 74 65  if( pE && isOute
1e10: 72 4a 6f 69 6e 20 29 7b 0a 20 20 20 20 45 78 70  rJoin ){.    Exp
1e20: 72 53 65 74 50 72 6f 70 65 72 74 79 28 70 45 2c  rSetProperty(pE,
1e30: 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29 3b 0a 20   EP_FromJoin);. 
1e40: 20 20 20 70 45 2d 3e 69 52 69 67 68 74 4a 6f 69     pE->iRightJoi
1e50: 6e 54 61 62 6c 65 20 3d 20 69 52 69 67 68 74 4a  nTable = iRightJ
1e60: 6f 69 6e 54 61 62 6c 65 3b 0a 20 20 7d 0a 20 20  oinTable;.  }.  
1e70: 2a 70 70 45 78 70 72 20 3d 20 73 71 6c 69 74 65  *ppExpr = sqlite
1e80: 33 45 78 70 72 41 6e 64 28 70 50 61 72 73 65 2d  3ExprAnd(pParse-
1e90: 3e 64 62 2c 2a 70 70 45 78 70 72 2c 20 70 45 29  >db,*ppExpr, pE)
1ea0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74  ;.}../*.** Set t
1eb0: 68 65 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 20 70  he EP_FromJoin p
1ec0: 72 6f 70 65 72 74 79 20 6f 6e 20 61 6c 6c 20 74  roperty on all t
1ed0: 65 72 6d 73 20 6f 66 20 74 68 65 20 67 69 76 65  erms of the give
1ee0: 6e 20 65 78 70 72 65 73 73 69 6f 6e 2e 0a 2a 2a  n expression..**
1ef0: 20 41 6e 64 20 73 65 74 20 74 68 65 20 45 78 70   And set the Exp
1f00: 72 2e 69 52 69 67 68 74 4a 6f 69 6e 54 61 62 6c  r.iRightJoinTabl
1f10: 65 20 74 6f 20 69 54 61 62 6c 65 20 66 6f 72 20  e to iTable for 
1f20: 65 76 65 72 79 20 74 65 72 6d 20 69 6e 20 74 68  every term in th
1f30: 65 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 2e  e.** expression.
1f40: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 45 50 5f 46 72  .**.** The EP_Fr
1f50: 6f 6d 4a 6f 69 6e 20 70 72 6f 70 65 72 74 79 20  omJoin property 
1f60: 69 73 20 75 73 65 64 20 6f 6e 20 74 65 72 6d 73  is used on terms
1f70: 20 6f 66 20 61 6e 20 65 78 70 72 65 73 73 69 6f   of an expressio
1f80: 6e 20 74 6f 20 74 65 6c 6c 0a 2a 2a 20 74 68 65  n to tell.** the
1f90: 20 4c 45 46 54 20 4f 55 54 45 52 20 4a 4f 49 4e   LEFT OUTER JOIN
1fa0: 20 70 72 6f 63 65 73 73 69 6e 67 20 6c 6f 67 69   processing logi
1fb0: 63 20 74 68 61 74 20 74 68 69 73 20 74 65 72 6d  c that this term
1fc0: 20 69 73 20 70 61 72 74 20 6f 66 20 74 68 65 0a   is part of the.
1fd0: 2a 2a 20 6a 6f 69 6e 20 72 65 73 74 72 69 63 74  ** join restrict
1fe0: 69 6f 6e 20 73 70 65 63 69 66 69 65 64 20 69 6e  ion specified in
1ff0: 20 74 68 65 20 4f 4e 20 6f 72 20 55 53 49 4e 47   the ON or USING
2000: 20 63 6c 61 75 73 65 20 61 6e 64 20 6e 6f 74 20   clause and not 
2010: 61 20 70 61 72 74 0a 2a 2a 20 6f 66 20 74 68 65  a part.** of the
2020: 20 6d 6f 72 65 20 67 65 6e 65 72 61 6c 20 57 48   more general WH
2030: 45 52 45 20 63 6c 61 75 73 65 2e 20 20 54 68 65  ERE clause.  The
2040: 73 65 20 74 65 72 6d 73 20 61 72 65 20 6d 6f 76  se terms are mov
2050: 65 64 20 6f 76 65 72 20 74 6f 20 74 68 65 0a 2a  ed over to the.*
2060: 2a 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 64  * WHERE clause d
2070: 75 72 69 6e 67 20 6a 6f 69 6e 20 70 72 6f 63 65  uring join proce
2080: 73 73 69 6e 67 20 62 75 74 20 77 65 20 6e 65 65  ssing but we nee
2090: 64 20 74 6f 20 72 65 6d 65 6d 62 65 72 20 74 68  d to remember th
20a0: 61 74 20 74 68 65 79 0a 2a 2a 20 6f 72 69 67 69  at they.** origi
20b0: 6e 61 74 65 64 20 69 6e 20 74 68 65 20 4f 4e 20  nated in the ON 
20c0: 6f 72 20 55 53 49 4e 47 20 63 6c 61 75 73 65 2e  or USING clause.
20d0: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 45 78 70 72 2e  .**.** The Expr.
20e0: 69 52 69 67 68 74 4a 6f 69 6e 54 61 62 6c 65 20  iRightJoinTable 
20f0: 74 65 6c 6c 73 20 74 68 65 20 57 48 45 52 45 20  tells the WHERE 
2100: 63 6c 61 75 73 65 20 70 72 6f 63 65 73 73 69 6e  clause processin
2110: 67 20 74 68 61 74 20 74 68 65 0a 2a 2a 20 65 78  g that the.** ex
2120: 70 72 65 73 73 69 6f 6e 20 64 65 70 65 6e 64 73  pression depends
2130: 20 6f 6e 20 74 61 62 6c 65 20 69 52 69 67 68 74   on table iRight
2140: 4a 6f 69 6e 54 61 62 6c 65 20 65 76 65 6e 20 69  JoinTable even i
2150: 66 20 74 68 61 74 20 74 61 62 6c 65 20 69 73 20  f that table is 
2160: 6e 6f 74 0a 2a 2a 20 65 78 70 6c 69 63 69 74 6c  not.** explicitl
2170: 79 20 6d 65 6e 74 69 6f 6e 65 64 20 69 6e 20 74  y mentioned in t
2180: 68 65 20 65 78 70 72 65 73 73 69 6f 6e 2e 20 20  he expression.  
2190: 54 68 61 74 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  That information
21a0: 20 69 73 20 6e 65 65 64 65 64 0a 2a 2a 20 66 6f   is needed.** fo
21b0: 72 20 63 61 73 65 73 20 6c 69 6b 65 20 74 68 69  r cases like thi
21c0: 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 53 45 4c 45  s:.**.**    SELE
21d0: 43 54 20 2a 20 46 52 4f 4d 20 74 31 20 4c 45 46  CT * FROM t1 LEF
21e0: 54 20 4a 4f 49 4e 20 74 32 20 4f 4e 20 74 31 2e  T JOIN t2 ON t1.
21f0: 61 3d 74 32 2e 62 20 41 4e 44 20 74 31 2e 78 3d  a=t2.b AND t1.x=
2200: 35 0a 2a 2a 0a 2a 2a 20 54 68 65 20 77 68 65 72  5.**.** The wher
2210: 65 20 63 6c 61 75 73 65 20 6e 65 65 64 73 20 74  e clause needs t
2220: 6f 20 64 65 66 65 72 20 74 68 65 20 68 61 6e 64  o defer the hand
2230: 6c 69 6e 67 20 6f 66 20 74 68 65 20 74 31 2e 78  ling of the t1.x
2240: 3d 35 0a 2a 2a 20 74 65 72 6d 20 75 6e 74 69 6c  =5.** term until
2250: 20 61 66 74 65 72 20 74 68 65 20 74 32 20 6c 6f   after the t2 lo
2260: 6f 70 20 6f 66 20 74 68 65 20 6a 6f 69 6e 2e 20  op of the join. 
2270: 20 49 6e 20 74 68 61 74 20 77 61 79 2c 20 61 0a   In that way, a.
2280: 2a 2a 20 4e 55 4c 4c 20 74 32 20 72 6f 77 20 77  ** NULL t2 row w
2290: 69 6c 6c 20 62 65 20 69 6e 73 65 72 74 65 64 20  ill be inserted 
22a0: 77 68 65 6e 65 76 65 72 20 74 31 2e 78 21 3d 35  whenever t1.x!=5
22b0: 2e 20 20 49 66 20 77 65 20 64 6f 20 6e 6f 74 0a  .  If we do not.
22c0: 2a 2a 20 64 65 66 65 72 20 74 68 65 20 68 61 6e  ** defer the han
22d0: 64 6c 69 6e 67 20 6f 66 20 74 31 2e 78 3d 35 2c  dling of t1.x=5,
22e0: 20 69 74 20 77 69 6c 6c 20 62 65 20 70 72 6f 63   it will be proc
22f0: 65 73 73 65 64 20 69 6d 6d 65 64 69 61 74 65 6c  essed immediatel
2300: 79 0a 2a 2a 20 61 66 74 65 72 20 74 68 65 20 74  y.** after the t
2310: 31 20 6c 6f 6f 70 20 61 6e 64 20 72 6f 77 73 20  1 loop and rows 
2320: 77 69 74 68 20 74 31 2e 78 21 3d 35 20 77 69 6c  with t1.x!=5 wil
2330: 6c 20 6e 65 76 65 72 20 61 70 70 65 61 72 20 69  l never appear i
2340: 6e 0a 2a 2a 20 74 68 65 20 6f 75 74 70 75 74 2c  n.** the output,
2350: 20 77 68 69 63 68 20 69 73 20 69 6e 63 6f 72 72   which is incorr
2360: 65 63 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ect..*/.static v
2370: 6f 69 64 20 73 65 74 4a 6f 69 6e 45 78 70 72 28  oid setJoinExpr(
2380: 45 78 70 72 20 2a 70 2c 20 69 6e 74 20 69 54 61  Expr *p, int iTa
2390: 62 6c 65 29 7b 0a 20 20 77 68 69 6c 65 28 20 70  ble){.  while( p
23a0: 20 29 7b 0a 20 20 20 20 45 78 70 72 53 65 74 50   ){.    ExprSetP
23b0: 72 6f 70 65 72 74 79 28 70 2c 20 45 50 5f 46 72  roperty(p, EP_Fr
23c0: 6f 6d 4a 6f 69 6e 29 3b 0a 20 20 20 20 70 2d 3e  omJoin);.    p->
23d0: 69 52 69 67 68 74 4a 6f 69 6e 54 61 62 6c 65 20  iRightJoinTable 
23e0: 3d 20 69 54 61 62 6c 65 3b 0a 20 20 20 20 73 65  = iTable;.    se
23f0: 74 4a 6f 69 6e 45 78 70 72 28 70 2d 3e 70 4c 65  tJoinExpr(p->pLe
2400: 66 74 2c 20 69 54 61 62 6c 65 29 3b 0a 20 20 20  ft, iTable);.   
2410: 20 70 20 3d 20 70 2d 3e 70 52 69 67 68 74 3b 0a   p = p->pRight;.
2420: 20 20 7d 20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68    } .}../*.** Th
2430: 69 73 20 72 6f 75 74 69 6e 65 20 70 72 6f 63 65  is routine proce
2440: 73 73 65 73 20 74 68 65 20 6a 6f 69 6e 20 69 6e  sses the join in
2450: 66 6f 72 6d 61 74 69 6f 6e 20 66 6f 72 20 61 20  formation for a 
2460: 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
2470: 2e 0a 2a 2a 20 4f 4e 20 61 6e 64 20 55 53 49 4e  ..** ON and USIN
2480: 47 20 63 6c 61 75 73 65 73 20 61 72 65 20 63 6f  G clauses are co
2490: 6e 76 65 72 74 65 64 20 69 6e 74 6f 20 65 78 74  nverted into ext
24a0: 72 61 20 74 65 72 6d 73 20 6f 66 20 74 68 65 20  ra terms of the 
24b0: 57 48 45 52 45 20 63 6c 61 75 73 65 2e 0a 2a 2a  WHERE clause..**
24c0: 20 4e 41 54 55 52 41 4c 20 6a 6f 69 6e 73 20 61   NATURAL joins a
24d0: 6c 73 6f 20 63 72 65 61 74 65 20 65 78 74 72 61  lso create extra
24e0: 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 74 65   WHERE clause te
24f0: 72 6d 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 74  rms..**.** The t
2500: 65 72 6d 73 20 6f 66 20 61 20 46 52 4f 4d 20 63  erms of a FROM c
2510: 6c 61 75 73 65 20 61 72 65 20 63 6f 6e 74 61 69  lause are contai
2520: 6e 65 64 20 69 6e 20 74 68 65 20 53 65 6c 65 63  ned in the Selec
2530: 74 2e 70 53 72 63 20 73 74 72 75 63 74 75 72 65  t.pSrc structure
2540: 2e 0a 2a 2a 20 54 68 65 20 6c 65 66 74 20 6d 6f  ..** The left mo
2550: 73 74 20 74 61 62 6c 65 20 69 73 20 74 68 65 20  st table is the 
2560: 66 69 72 73 74 20 65 6e 74 72 79 20 69 6e 20 53  first entry in S
2570: 65 6c 65 63 74 2e 70 53 72 63 2e 20 20 54 68 65  elect.pSrc.  The
2580: 20 72 69 67 68 74 2d 6d 6f 73 74 0a 2a 2a 20 74   right-most.** t
2590: 61 62 6c 65 20 69 73 20 74 68 65 20 6c 61 73 74  able is the last
25a0: 20 65 6e 74 72 79 2e 20 20 54 68 65 20 6a 6f 69   entry.  The joi
25b0: 6e 20 6f 70 65 72 61 74 6f 72 20 69 73 20 68 65  n operator is he
25c0: 6c 64 20 69 6e 20 74 68 65 20 65 6e 74 72 79 20  ld in the entry 
25d0: 74 6f 0a 2a 2a 20 74 68 65 20 6c 65 66 74 2e 20  to.** the left. 
25e0: 20 54 68 75 73 20 65 6e 74 72 79 20 30 20 63 6f   Thus entry 0 co
25f0: 6e 74 61 69 6e 73 20 74 68 65 20 6a 6f 69 6e 20  ntains the join 
2600: 6f 70 65 72 61 74 6f 72 20 66 6f 72 20 74 68 65  operator for the
2610: 20 6a 6f 69 6e 20 62 65 74 77 65 65 6e 0a 2a 2a   join between.**
2620: 20 65 6e 74 72 69 65 73 20 30 20 61 6e 64 20 31   entries 0 and 1
2630: 2e 20 20 41 6e 79 20 4f 4e 20 6f 72 20 55 53 49  .  Any ON or USI
2640: 4e 47 20 63 6c 61 75 73 65 73 20 61 73 73 6f 63  NG clauses assoc
2650: 69 61 74 65 64 20 77 69 74 68 20 74 68 65 20 6a  iated with the j
2660: 6f 69 6e 20 61 72 65 0a 2a 2a 20 61 6c 73 6f 20  oin are.** also 
2670: 61 74 74 61 63 68 65 64 20 74 6f 20 74 68 65 20  attached to the 
2680: 6c 65 66 74 20 65 6e 74 72 79 2e 0a 2a 2a 0a 2a  left entry..**.*
2690: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 72  * This routine r
26a0: 65 74 75 72 6e 73 20 74 68 65 20 6e 75 6d 62 65  eturns the numbe
26b0: 72 20 6f 66 20 65 72 72 6f 72 73 20 65 6e 63 6f  r of errors enco
26c0: 75 6e 74 65 72 65 64 2e 0a 2a 2f 0a 73 74 61 74  untered..*/.stat
26d0: 69 63 20 69 6e 74 20 73 71 6c 69 74 65 50 72 6f  ic int sqlitePro
26e0: 63 65 73 73 4a 6f 69 6e 28 50 61 72 73 65 20 2a  cessJoin(Parse *
26f0: 70 50 61 72 73 65 2c 20 53 65 6c 65 63 74 20 2a  pParse, Select *
2700: 70 29 7b 0a 20 20 53 72 63 4c 69 73 74 20 2a 70  p){.  SrcList *p
2710: 53 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20  Src;            
2720: 20 20 20 20 20 20 2f 2a 20 41 6c 6c 20 74 61 62        /* All tab
2730: 6c 65 73 20 69 6e 20 74 68 65 20 46 52 4f 4d 20  les in the FROM 
2740: 63 6c 61 75 73 65 20 2a 2f 0a 20 20 69 6e 74 20  clause */.  int 
2750: 69 2c 20 6a 3b 20 20 20 20 20 20 20 20 20 20 20  i, j;           
2760: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
2770: 6f 6f 70 20 63 6f 75 6e 74 65 72 73 20 2a 2f 0a  oop counters */.
2780: 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74    struct SrcList
2790: 5f 69 74 65 6d 20 2a 70 4c 65 66 74 3b 20 20 20  _item *pLeft;   
27a0: 20 20 2f 2a 20 4c 65 66 74 20 74 61 62 6c 65 20    /* Left table 
27b0: 62 65 69 6e 67 20 6a 6f 69 6e 65 64 20 2a 2f 0a  being joined */.
27c0: 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74    struct SrcList
27d0: 5f 69 74 65 6d 20 2a 70 52 69 67 68 74 3b 20 20  _item *pRight;  
27e0: 20 20 2f 2a 20 52 69 67 68 74 20 74 61 62 6c 65    /* Right table
27f0: 20 62 65 69 6e 67 20 6a 6f 69 6e 65 64 20 2a 2f   being joined */
2800: 0a 0a 20 20 70 53 72 63 20 3d 20 70 2d 3e 70 53  ..  pSrc = p->pS
2810: 72 63 3b 0a 20 20 70 4c 65 66 74 20 3d 20 26 70  rc;.  pLeft = &p
2820: 53 72 63 2d 3e 61 5b 30 5d 3b 0a 20 20 70 52 69  Src->a[0];.  pRi
2830: 67 68 74 20 3d 20 26 70 4c 65 66 74 5b 31 5d 3b  ght = &pLeft[1];
2840: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 53  .  for(i=0; i<pS
2850: 72 63 2d 3e 6e 53 72 63 2d 31 3b 20 69 2b 2b 2c  rc->nSrc-1; i++,
2860: 20 70 52 69 67 68 74 2b 2b 2c 20 70 4c 65 66 74   pRight++, pLeft
2870: 2b 2b 29 7b 0a 20 20 20 20 54 61 62 6c 65 20 2a  ++){.    Table *
2880: 70 4c 65 66 74 54 61 62 20 3d 20 70 4c 65 66 74  pLeftTab = pLeft
2890: 2d 3e 70 54 61 62 3b 0a 20 20 20 20 54 61 62 6c  ->pTab;.    Tabl
28a0: 65 20 2a 70 52 69 67 68 74 54 61 62 20 3d 20 70  e *pRightTab = p
28b0: 52 69 67 68 74 2d 3e 70 54 61 62 3b 0a 20 20 20  Right->pTab;.   
28c0: 20 69 6e 74 20 69 73 4f 75 74 65 72 3b 0a 0a 20   int isOuter;.. 
28d0: 20 20 20 69 66 28 20 70 4c 65 66 74 54 61 62 3d     if( pLeftTab=
28e0: 3d 30 20 7c 7c 20 70 52 69 67 68 74 54 61 62 3d  =0 || pRightTab=
28f0: 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  =0 ) continue;. 
2900: 20 20 20 69 73 4f 75 74 65 72 20 3d 20 28 70 52     isOuter = (pR
2910: 69 67 68 74 2d 3e 6a 6f 69 6e 74 79 70 65 20 26  ight->jointype &
2920: 20 4a 54 5f 4f 55 54 45 52 29 21 3d 30 3b 0a 0a   JT_OUTER)!=0;..
2930: 20 20 20 20 2f 2a 20 57 68 65 6e 20 74 68 65 20      /* When the 
2940: 4e 41 54 55 52 41 4c 20 6b 65 79 77 6f 72 64 20  NATURAL keyword 
2950: 69 73 20 70 72 65 73 65 6e 74 2c 20 61 64 64 20  is present, add 
2960: 57 48 45 52 45 20 63 6c 61 75 73 65 20 74 65 72  WHERE clause ter
2970: 6d 73 20 66 6f 72 0a 20 20 20 20 2a 2a 20 65 76  ms for.    ** ev
2980: 65 72 79 20 63 6f 6c 75 6d 6e 20 74 68 61 74 20  ery column that 
2990: 74 68 65 20 74 77 6f 20 74 61 62 6c 65 73 20 68  the two tables h
29a0: 61 76 65 20 69 6e 20 63 6f 6d 6d 6f 6e 2e 0a 20  ave in common.. 
29b0: 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 52     */.    if( pR
29c0: 69 67 68 74 2d 3e 6a 6f 69 6e 74 79 70 65 20 26  ight->jointype &
29d0: 20 4a 54 5f 4e 41 54 55 52 41 4c 20 29 7b 0a 20   JT_NATURAL ){. 
29e0: 20 20 20 20 20 69 66 28 20 70 52 69 67 68 74 2d       if( pRight-
29f0: 3e 70 4f 6e 20 7c 7c 20 70 52 69 67 68 74 2d 3e  >pOn || pRight->
2a00: 70 55 73 69 6e 67 20 29 7b 0a 20 20 20 20 20 20  pUsing ){.      
2a10: 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
2a20: 67 28 70 50 61 72 73 65 2c 20 22 61 20 4e 41 54  g(pParse, "a NAT
2a30: 55 52 41 4c 20 6a 6f 69 6e 20 6d 61 79 20 6e 6f  URAL join may no
2a40: 74 20 68 61 76 65 20 22 0a 20 20 20 20 20 20 20  t have ".       
2a50: 20 20 20 20 22 61 6e 20 4f 4e 20 6f 72 20 55 53      "an ON or US
2a60: 49 4e 47 20 63 6c 61 75 73 65 22 2c 20 30 29 3b  ING clause", 0);
2a70: 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
2a80: 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  1;.      }.     
2a90: 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 4c 65 66   for(j=0; j<pLef
2aa0: 74 54 61 62 2d 3e 6e 43 6f 6c 3b 20 6a 2b 2b 29  tTab->nCol; j++)
2ab0: 7b 0a 20 20 20 20 20 20 20 20 63 68 61 72 20 2a  {.        char *
2ac0: 7a 4e 61 6d 65 20 3d 20 70 4c 65 66 74 54 61 62  zName = pLeftTab
2ad0: 2d 3e 61 43 6f 6c 5b 6a 5d 2e 7a 4e 61 6d 65 3b  ->aCol[j].zName;
2ae0: 0a 20 20 20 20 20 20 20 20 69 66 28 20 63 6f 6c  .        if( col
2af0: 75 6d 6e 49 6e 64 65 78 28 70 52 69 67 68 74 54  umnIndex(pRightT
2b00: 61 62 2c 20 7a 4e 61 6d 65 29 3e 3d 30 20 29 7b  ab, zName)>=0 ){
2b10: 0a 20 20 20 20 20 20 20 20 20 20 61 64 64 57 68  .          addWh
2b20: 65 72 65 54 65 72 6d 28 70 50 61 72 73 65 2c 20  ereTerm(pParse, 
2b30: 7a 4e 61 6d 65 2c 20 70 4c 65 66 74 54 61 62 2c  zName, pLeftTab,
2b40: 20 70 4c 65 66 74 2d 3e 7a 41 6c 69 61 73 2c 20   pLeft->zAlias, 
2b50: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
2b60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
2b70: 52 69 67 68 74 54 61 62 2c 20 70 52 69 67 68 74  RightTab, pRight
2b80: 2d 3e 7a 41 6c 69 61 73 2c 0a 20 20 20 20 20 20  ->zAlias,.      
2b90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ba0: 20 20 20 20 20 20 20 20 70 52 69 67 68 74 2d 3e          pRight->
2bb0: 69 43 75 72 73 6f 72 2c 20 26 70 2d 3e 70 57 68  iCursor, &p->pWh
2bc0: 65 72 65 2c 20 69 73 4f 75 74 65 72 29 3b 0a 20  ere, isOuter);. 
2bd0: 20 20 20 20 20 20 20 20 20 0a 20 20 20 20 20 20           .      
2be0: 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
2bf0: 7d 0a 0a 20 20 20 20 2f 2a 20 44 69 73 61 6c 6c  }..    /* Disall
2c00: 6f 77 20 62 6f 74 68 20 4f 4e 20 61 6e 64 20 55  ow both ON and U
2c10: 53 49 4e 47 20 63 6c 61 75 73 65 73 20 69 6e 20  SING clauses in 
2c20: 74 68 65 20 73 61 6d 65 20 6a 6f 69 6e 0a 20 20  the same join.  
2c30: 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 52 69    */.    if( pRi
2c40: 67 68 74 2d 3e 70 4f 6e 20 26 26 20 70 52 69 67  ght->pOn && pRig
2c50: 68 74 2d 3e 70 55 73 69 6e 67 20 29 7b 0a 20 20  ht->pUsing ){.  
2c60: 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
2c70: 4d 73 67 28 70 50 61 72 73 65 2c 20 22 63 61 6e  Msg(pParse, "can
2c80: 6e 6f 74 20 68 61 76 65 20 62 6f 74 68 20 4f 4e  not have both ON
2c90: 20 61 6e 64 20 55 53 49 4e 47 20 22 0a 20 20 20   and USING ".   
2ca0: 20 20 20 20 20 22 63 6c 61 75 73 65 73 20 69 6e       "clauses in
2cb0: 20 74 68 65 20 73 61 6d 65 20 6a 6f 69 6e 22 29   the same join")
2cc0: 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 31  ;.      return 1
2cd0: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
2ce0: 41 64 64 20 74 68 65 20 4f 4e 20 63 6c 61 75 73  Add the ON claus
2cf0: 65 20 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 20  e to the end of 
2d00: 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  the WHERE clause
2d10: 2c 20 63 6f 6e 6e 65 63 74 65 64 20 62 79 0a 20  , connected by. 
2d20: 20 20 20 2a 2a 20 61 6e 20 41 4e 44 20 6f 70 65     ** an AND ope
2d30: 72 61 74 6f 72 2e 0a 20 20 20 20 2a 2f 0a 20 20  rator..    */.  
2d40: 20 20 69 66 28 20 70 52 69 67 68 74 2d 3e 70 4f    if( pRight->pO
2d50: 6e 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 69  n ){.      if( i
2d60: 73 4f 75 74 65 72 20 29 20 73 65 74 4a 6f 69 6e  sOuter ) setJoin
2d70: 45 78 70 72 28 70 52 69 67 68 74 2d 3e 70 4f 6e  Expr(pRight->pOn
2d80: 2c 20 70 52 69 67 68 74 2d 3e 69 43 75 72 73 6f  , pRight->iCurso
2d90: 72 29 3b 0a 20 20 20 20 20 20 70 2d 3e 70 57 68  r);.      p->pWh
2da0: 65 72 65 20 3d 20 73 71 6c 69 74 65 33 45 78 70  ere = sqlite3Exp
2db0: 72 41 6e 64 28 70 50 61 72 73 65 2d 3e 64 62 2c  rAnd(pParse->db,
2dc0: 20 70 2d 3e 70 57 68 65 72 65 2c 20 70 52 69 67   p->pWhere, pRig
2dd0: 68 74 2d 3e 70 4f 6e 29 3b 0a 20 20 20 20 20 20  ht->pOn);.      
2de0: 70 52 69 67 68 74 2d 3e 70 4f 6e 20 3d 20 30 3b  pRight->pOn = 0;
2df0: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43  .    }..    /* C
2e00: 72 65 61 74 65 20 65 78 74 72 61 20 74 65 72 6d  reate extra term
2e10: 73 20 6f 6e 20 74 68 65 20 57 48 45 52 45 20 63  s on the WHERE c
2e20: 6c 61 75 73 65 20 66 6f 72 20 65 61 63 68 20 63  lause for each c
2e30: 6f 6c 75 6d 6e 20 6e 61 6d 65 64 0a 20 20 20 20  olumn named.    
2e40: 2a 2a 20 69 6e 20 74 68 65 20 55 53 49 4e 47 20  ** in the USING 
2e50: 63 6c 61 75 73 65 2e 20 20 45 78 61 6d 70 6c 65  clause.  Example
2e60: 3a 20 49 66 20 74 68 65 20 74 77 6f 20 74 61 62  : If the two tab
2e70: 6c 65 73 20 74 6f 20 62 65 20 6a 6f 69 6e 65 64  les to be joined
2e80: 20 61 72 65 20 0a 20 20 20 20 2a 2a 20 41 20 61   are .    ** A a
2e90: 6e 64 20 42 20 61 6e 64 20 74 68 65 20 55 53 49  nd B and the USI
2ea0: 4e 47 20 63 6c 61 75 73 65 20 6e 61 6d 65 73 20  NG clause names 
2eb0: 58 2c 20 59 2c 20 61 6e 64 20 5a 2c 20 74 68 65  X, Y, and Z, the
2ec0: 6e 20 61 64 64 20 74 68 69 73 0a 20 20 20 20 2a  n add this.    *
2ed0: 2a 20 74 6f 20 74 68 65 20 57 48 45 52 45 20 63  * to the WHERE c
2ee0: 6c 61 75 73 65 3a 20 20 20 20 41 2e 58 3d 42 2e  lause:    A.X=B.
2ef0: 58 20 41 4e 44 20 41 2e 59 3d 42 2e 59 20 41 4e  X AND A.Y=B.Y AN
2f00: 44 20 41 2e 5a 3d 42 2e 5a 0a 20 20 20 20 2a 2a  D A.Z=B.Z.    **
2f10: 20 52 65 70 6f 72 74 20 61 6e 20 65 72 72 6f 72   Report an error
2f20: 20 69 66 20 61 6e 79 20 63 6f 6c 75 6d 6e 20 6d   if any column m
2f30: 65 6e 74 69 6f 6e 65 64 20 69 6e 20 74 68 65 20  entioned in the 
2f40: 55 53 49 4e 47 20 63 6c 61 75 73 65 20 69 73 0a  USING clause is.
2f50: 20 20 20 20 2a 2a 20 6e 6f 74 20 63 6f 6e 74 61      ** not conta
2f60: 69 6e 65 64 20 69 6e 20 62 6f 74 68 20 74 61 62  ined in both tab
2f70: 6c 65 73 20 74 6f 20 62 65 20 6a 6f 69 6e 65 64  les to be joined
2f80: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
2f90: 20 70 52 69 67 68 74 2d 3e 70 55 73 69 6e 67 20   pRight->pUsing 
2fa0: 29 7b 0a 20 20 20 20 20 20 49 64 4c 69 73 74 20  ){.      IdList 
2fb0: 2a 70 4c 69 73 74 20 3d 20 70 52 69 67 68 74 2d  *pList = pRight-
2fc0: 3e 70 55 73 69 6e 67 3b 0a 20 20 20 20 20 20 66  >pUsing;.      f
2fd0: 6f 72 28 6a 3d 30 3b 20 6a 3c 70 4c 69 73 74 2d  or(j=0; j<pList-
2fe0: 3e 6e 49 64 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20  >nId; j++){.    
2ff0: 20 20 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 20      char *zName 
3000: 3d 20 70 4c 69 73 74 2d 3e 61 5b 6a 5d 2e 7a 4e  = pList->a[j].zN
3010: 61 6d 65 3b 0a 20 20 20 20 20 20 20 20 69 66 28  ame;.        if(
3020: 20 63 6f 6c 75 6d 6e 49 6e 64 65 78 28 70 4c 65   columnIndex(pLe
3030: 66 74 54 61 62 2c 20 7a 4e 61 6d 65 29 3c 30 20  ftTab, zName)<0 
3040: 7c 7c 20 63 6f 6c 75 6d 6e 49 6e 64 65 78 28 70  || columnIndex(p
3050: 52 69 67 68 74 54 61 62 2c 20 7a 4e 61 6d 65 29  RightTab, zName)
3060: 3c 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  <0 ){.          
3070: 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
3080: 70 50 61 72 73 65 2c 20 22 63 61 6e 6e 6f 74 20  pParse, "cannot 
3090: 6a 6f 69 6e 20 75 73 69 6e 67 20 63 6f 6c 75 6d  join using colum
30a0: 6e 20 25 73 20 2d 20 63 6f 6c 75 6d 6e 20 22 0a  n %s - column ".
30b0: 20 20 20 20 20 20 20 20 20 20 20 20 22 6e 6f 74              "not
30c0: 20 70 72 65 73 65 6e 74 20 69 6e 20 62 6f 74 68   present in both
30d0: 20 74 61 62 6c 65 73 22 2c 20 7a 4e 61 6d 65 29   tables", zName)
30e0: 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75  ;.          retu
30f0: 72 6e 20 31 3b 0a 20 20 20 20 20 20 20 20 7d 0a  rn 1;.        }.
3100: 20 20 20 20 20 20 20 20 61 64 64 57 68 65 72 65          addWhere
3110: 54 65 72 6d 28 70 50 61 72 73 65 2c 20 7a 4e 61  Term(pParse, zNa
3120: 6d 65 2c 20 70 4c 65 66 74 54 61 62 2c 20 70 4c  me, pLeftTab, pL
3130: 65 66 74 2d 3e 7a 41 6c 69 61 73 2c 20 0a 20 20  eft->zAlias, .  
3140: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3150: 20 20 20 20 20 20 20 20 20 20 70 52 69 67 68 74            pRight
3160: 54 61 62 2c 20 70 52 69 67 68 74 2d 3e 7a 41 6c  Tab, pRight->zAl
3170: 69 61 73 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ias,.           
3180: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3190: 20 70 52 69 67 68 74 2d 3e 69 43 75 72 73 6f 72   pRight->iCursor
31a0: 2c 20 26 70 2d 3e 70 57 68 65 72 65 2c 20 69 73  , &p->pWhere, is
31b0: 4f 75 74 65 72 29 3b 0a 20 20 20 20 20 20 7d 0a  Outer);.      }.
31c0: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
31d0: 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49  rn 0;.}../*.** I
31e0: 6e 73 65 72 74 20 63 6f 64 65 20 69 6e 74 6f 20  nsert code into 
31f0: 22 76 22 20 74 68 61 74 20 77 69 6c 6c 20 70 75  "v" that will pu
3200: 73 68 20 74 68 65 20 72 65 63 6f 72 64 20 6f 6e  sh the record on
3210: 20 74 68 65 20 74 6f 70 20 6f 66 20 74 68 65 0a   the top of the.
3220: 2a 2a 20 73 74 61 63 6b 20 69 6e 74 6f 20 74 68  ** stack into th
3230: 65 20 73 6f 72 74 65 72 2e 0a 2a 2f 0a 73 74 61  e sorter..*/.sta
3240: 74 69 63 20 76 6f 69 64 20 70 75 73 68 4f 6e 74  tic void pushOnt
3250: 6f 53 6f 72 74 65 72 28 0a 20 20 50 61 72 73 65  oSorter(.  Parse
3260: 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20   *pParse,       
3270: 20 20 2f 2a 20 50 61 72 73 65 72 20 63 6f 6e 74    /* Parser cont
3280: 65 78 74 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73  ext */.  ExprLis
3290: 74 20 2a 70 4f 72 64 65 72 42 79 2c 20 20 20 20  t *pOrderBy,    
32a0: 2f 2a 20 54 68 65 20 4f 52 44 45 52 20 42 59 20  /* The ORDER BY 
32b0: 63 6c 61 75 73 65 20 2a 2f 0a 20 20 53 65 6c 65  clause */.  Sele
32c0: 63 74 20 2a 70 53 65 6c 65 63 74 2c 20 20 20 20  ct *pSelect,    
32d0: 20 20 20 2f 2a 20 54 68 65 20 77 68 6f 6c 65 20     /* The whole 
32e0: 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
32f0: 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 44 61 74   */.  int regDat
3300: 61 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  a            /* 
3310: 52 65 67 69 73 74 65 72 20 68 6f 6c 64 69 6e 67  Register holding
3320: 20 64 61 74 61 20 74 6f 20 62 65 20 73 6f 72 74   data to be sort
3330: 65 64 20 2a 2f 0a 29 7b 0a 20 20 56 64 62 65 20  ed */.){.  Vdbe 
3340: 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64  *v = pParse->pVd
3350: 62 65 3b 0a 20 20 69 6e 74 20 6e 45 78 70 72 20  be;.  int nExpr 
3360: 3d 20 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70  = pOrderBy->nExp
3370: 72 3b 0a 20 20 69 6e 74 20 72 65 67 42 61 73 65  r;.  int regBase
3380: 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d   = sqlite3GetTem
3390: 70 52 61 6e 67 65 28 70 50 61 72 73 65 2c 20 6e  pRange(pParse, n
33a0: 45 78 70 72 2b 32 29 3b 0a 20 20 69 6e 74 20 72  Expr+2);.  int r
33b0: 65 67 52 65 63 6f 72 64 20 3d 20 73 71 6c 69 74  egRecord = sqlit
33c0: 65 33 47 65 74 54 65 6d 70 52 65 67 28 70 50 61  e3GetTempReg(pPa
33d0: 72 73 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 45  rse);.  sqlite3E
33e0: 78 70 72 43 6f 64 65 45 78 70 72 4c 69 73 74 28  xprCodeExprList(
33f0: 70 50 61 72 73 65 2c 20 70 4f 72 64 65 72 42 79  pParse, pOrderBy
3400: 2c 20 72 65 67 42 61 73 65 2c 20 30 29 3b 0a 20  , regBase, 0);. 
3410: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
3420: 70 32 28 76 2c 20 4f 50 5f 53 65 71 75 65 6e 63  p2(v, OP_Sequenc
3430: 65 2c 20 70 4f 72 64 65 72 42 79 2d 3e 69 45 43  e, pOrderBy->iEC
3440: 75 72 73 6f 72 2c 20 72 65 67 42 61 73 65 2b 6e  ursor, regBase+n
3450: 45 78 70 72 29 3b 0a 20 20 73 71 6c 69 74 65 33  Expr);.  sqlite3
3460: 45 78 70 72 43 6f 64 65 4d 6f 76 65 28 70 50 61  ExprCodeMove(pPa
3470: 72 73 65 2c 20 72 65 67 44 61 74 61 2c 20 72 65  rse, regData, re
3480: 67 42 61 73 65 2b 6e 45 78 70 72 2b 31 2c 20 31  gBase+nExpr+1, 1
3490: 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  );.  sqlite3Vdbe
34a0: 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4d 61 6b  AddOp3(v, OP_Mak
34b0: 65 52 65 63 6f 72 64 2c 20 72 65 67 42 61 73 65  eRecord, regBase
34c0: 2c 20 6e 45 78 70 72 20 2b 20 32 2c 20 72 65 67  , nExpr + 2, reg
34d0: 52 65 63 6f 72 64 29 3b 0a 20 20 73 71 6c 69 74  Record);.  sqlit
34e0: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
34f0: 4f 50 5f 49 64 78 49 6e 73 65 72 74 2c 20 70 4f  OP_IdxInsert, pO
3500: 72 64 65 72 42 79 2d 3e 69 45 43 75 72 73 6f 72  rderBy->iECursor
3510: 2c 20 72 65 67 52 65 63 6f 72 64 29 3b 0a 20 20  , regRecord);.  
3520: 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65  sqlite3ReleaseTe
3530: 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 65  mpReg(pParse, re
3540: 67 52 65 63 6f 72 64 29 3b 0a 20 20 73 71 6c 69  gRecord);.  sqli
3550: 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 61  te3ReleaseTempRa
3560: 6e 67 65 28 70 50 61 72 73 65 2c 20 72 65 67 42  nge(pParse, regB
3570: 61 73 65 2c 20 6e 45 78 70 72 2b 32 29 3b 0a 20  ase, nExpr+2);. 
3580: 20 69 66 28 20 70 53 65 6c 65 63 74 2d 3e 69 4c   if( pSelect->iL
3590: 69 6d 69 74 20 29 7b 0a 20 20 20 20 69 6e 74 20  imit ){.    int 
35a0: 61 64 64 72 31 2c 20 61 64 64 72 32 3b 0a 20 20  addr1, addr2;.  
35b0: 20 20 69 6e 74 20 69 4c 69 6d 69 74 3b 0a 20 20    int iLimit;.  
35c0: 20 20 69 66 28 20 70 53 65 6c 65 63 74 2d 3e 69    if( pSelect->i
35d0: 4f 66 66 73 65 74 20 29 7b 0a 20 20 20 20 20 20  Offset ){.      
35e0: 69 4c 69 6d 69 74 20 3d 20 70 53 65 6c 65 63 74  iLimit = pSelect
35f0: 2d 3e 69 4f 66 66 73 65 74 2b 31 3b 0a 20 20 20  ->iOffset+1;.   
3600: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 4c   }else{.      iL
3610: 69 6d 69 74 20 3d 20 70 53 65 6c 65 63 74 2d 3e  imit = pSelect->
3620: 69 4c 69 6d 69 74 3b 0a 20 20 20 20 7d 0a 20 20  iLimit;.    }.  
3630: 20 20 61 64 64 72 31 20 3d 20 73 71 6c 69 74 65    addr1 = sqlite
3640: 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f  3VdbeAddOp1(v, O
3650: 50 5f 49 66 5a 65 72 6f 2c 20 69 4c 69 6d 69 74  P_IfZero, iLimit
3660: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
3670: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 41  beAddOp2(v, OP_A
3680: 64 64 49 6d 6d 2c 20 69 4c 69 6d 69 74 2c 20 2d  ddImm, iLimit, -
3690: 31 29 3b 0a 20 20 20 20 61 64 64 72 32 20 3d 20  1);.    addr2 = 
36a0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
36b0: 30 28 76 2c 20 4f 50 5f 47 6f 74 6f 29 3b 0a 20  0(v, OP_Goto);. 
36c0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75     sqlite3VdbeJu
36d0: 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72 31 29  mpHere(v, addr1)
36e0: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
36f0: 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 4c 61  eAddOp1(v, OP_La
3700: 73 74 2c 20 70 4f 72 64 65 72 42 79 2d 3e 69 45  st, pOrderBy->iE
3710: 43 75 72 73 6f 72 29 3b 0a 20 20 20 20 73 71 6c  Cursor);.    sql
3720: 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76  ite3VdbeAddOp1(v
3730: 2c 20 4f 50 5f 44 65 6c 65 74 65 2c 20 70 4f 72  , OP_Delete, pOr
3740: 64 65 72 42 79 2d 3e 69 45 43 75 72 73 6f 72 29  derBy->iECursor)
3750: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
3760: 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64  eJumpHere(v, add
3770: 72 32 29 3b 0a 20 20 20 20 70 53 65 6c 65 63 74  r2);.    pSelect
3780: 2d 3e 69 4c 69 6d 69 74 20 3d 20 30 3b 0a 20 20  ->iLimit = 0;.  
3790: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 63  }.}../*.** Add c
37a0: 6f 64 65 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74  ode to implement
37b0: 20 74 68 65 20 4f 46 46 53 45 54 0a 2a 2f 0a 73   the OFFSET.*/.s
37c0: 74 61 74 69 63 20 76 6f 69 64 20 63 6f 64 65 4f  tatic void codeO
37d0: 66 66 73 65 74 28 0a 20 20 56 64 62 65 20 2a 76  ffset(.  Vdbe *v
37e0: 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 47 65  ,          /* Ge
37f0: 6e 65 72 61 74 65 20 63 6f 64 65 20 69 6e 74 6f  nerate code into
3800: 20 74 68 69 73 20 56 4d 20 2a 2f 0a 20 20 53 65   this VM */.  Se
3810: 6c 65 63 74 20 2a 70 2c 20 20 20 20 20 20 20 20  lect *p,        
3820: 2f 2a 20 54 68 65 20 53 45 4c 45 43 54 20 73 74  /* The SELECT st
3830: 61 74 65 6d 65 6e 74 20 62 65 69 6e 67 20 63 6f  atement being co
3840: 64 65 64 20 2a 2f 0a 20 20 69 6e 74 20 69 43 6f  ded */.  int iCo
3850: 6e 74 69 6e 75 65 20 20 20 20 20 2f 2a 20 4a 75  ntinue     /* Ju
3860: 6d 70 20 68 65 72 65 20 74 6f 20 73 6b 69 70 20  mp here to skip 
3870: 74 68 65 20 63 75 72 72 65 6e 74 20 72 65 63 6f  the current reco
3880: 72 64 20 2a 2f 0a 29 7b 0a 20 20 69 66 28 20 70  rd */.){.  if( p
3890: 2d 3e 69 4f 66 66 73 65 74 20 26 26 20 69 43 6f  ->iOffset && iCo
38a0: 6e 74 69 6e 75 65 21 3d 30 20 29 7b 0a 20 20 20  ntinue!=0 ){.   
38b0: 20 69 6e 74 20 61 64 64 72 3b 0a 20 20 20 20 73   int addr;.    s
38c0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
38d0: 28 76 2c 20 4f 50 5f 41 64 64 49 6d 6d 2c 20 70  (v, OP_AddImm, p
38e0: 2d 3e 69 4f 66 66 73 65 74 2c 20 2d 31 29 3b 0a  ->iOffset, -1);.
38f0: 20 20 20 20 61 64 64 72 20 3d 20 73 71 6c 69 74      addr = sqlit
3900: 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20  e3VdbeAddOp1(v, 
3910: 4f 50 5f 49 66 4e 65 67 2c 20 70 2d 3e 69 4f 66  OP_IfNeg, p->iOf
3920: 66 73 65 74 29 3b 0a 20 20 20 20 73 71 6c 69 74  fset);.    sqlit
3930: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
3940: 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 69 43 6f 6e  OP_Goto, 0, iCon
3950: 74 69 6e 75 65 29 3b 0a 20 20 20 20 56 64 62 65  tinue);.    Vdbe
3960: 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 73 6b 69  Comment((v, "ski
3970: 70 20 4f 46 46 53 45 54 20 72 65 63 6f 72 64 73  p OFFSET records
3980: 22 29 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  "));.    sqlite3
3990: 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20  VdbeJumpHere(v, 
39a0: 61 64 64 72 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  addr);.  }.}../*
39b0: 0a 2a 2a 20 41 64 64 20 63 6f 64 65 20 74 68 61  .** Add code tha
39c0: 74 20 77 69 6c 6c 20 63 68 65 63 6b 20 74 6f 20  t will check to 
39d0: 6d 61 6b 65 20 73 75 72 65 20 74 68 65 20 4e 20  make sure the N 
39e0: 72 65 67 69 73 74 65 72 73 20 73 74 61 72 74 69  registers starti
39f0: 6e 67 20 61 74 20 69 4d 65 6d 0a 2a 2a 20 66 6f  ng at iMem.** fo
3a00: 72 6d 20 61 20 64 69 73 74 69 6e 63 74 20 65 6e  rm a distinct en
3a10: 74 72 79 2e 20 20 69 54 61 62 20 69 73 20 61 20  try.  iTab is a 
3a20: 73 6f 72 74 69 6e 67 20 69 6e 64 65 78 20 74 68  sorting index th
3a30: 61 74 20 68 6f 6c 64 73 20 70 72 65 76 69 6f 75  at holds previou
3a40: 73 6c 79 0a 2a 2a 20 73 65 65 6e 20 63 6f 6d 62  sly.** seen comb
3a50: 69 6e 61 74 69 6f 6e 73 20 6f 66 20 74 68 65 20  inations of the 
3a60: 4e 20 76 61 6c 75 65 73 2e 20 20 41 20 6e 65 77  N values.  A new
3a70: 20 65 6e 74 72 79 20 69 73 20 6d 61 64 65 20 69   entry is made i
3a80: 6e 20 69 54 61 62 0a 2a 2a 20 69 66 20 74 68 65  n iTab.** if the
3a90: 20 63 75 72 72 65 6e 74 20 4e 20 76 61 6c 75 65   current N value
3aa0: 73 20 61 72 65 20 6e 65 77 2e 0a 2a 2a 0a 2a 2a  s are new..**.**
3ab0: 20 41 20 6a 75 6d 70 20 74 6f 20 61 64 64 72 52   A jump to addrR
3ac0: 65 70 65 61 74 20 69 73 20 6d 61 64 65 20 61 6e  epeat is made an
3ad0: 64 20 74 68 65 20 4e 2b 31 20 76 61 6c 75 65 73  d the N+1 values
3ae0: 20 61 72 65 20 70 6f 70 70 65 64 20 66 72 6f 6d   are popped from
3af0: 20 74 68 65 0a 2a 2a 20 73 74 61 63 6b 20 69 66   the.** stack if
3b00: 20 74 68 65 20 74 6f 70 20 4e 20 65 6c 65 6d 65   the top N eleme
3b10: 6e 74 73 20 61 72 65 20 6e 6f 74 20 64 69 73 74  nts are not dist
3b20: 69 6e 63 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  inct..*/.static 
3b30: 76 6f 69 64 20 63 6f 64 65 44 69 73 74 69 6e 63  void codeDistinc
3b40: 74 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  t(.  Parse *pPar
3b50: 73 65 2c 20 20 20 20 20 2f 2a 20 50 61 72 73 69  se,     /* Parsi
3b60: 6e 67 20 61 6e 64 20 63 6f 64 65 20 67 65 6e 65  ng and code gene
3b70: 72 61 74 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a  rating context *
3b80: 2f 0a 20 20 69 6e 74 20 69 54 61 62 2c 20 20 20  /.  int iTab,   
3b90: 20 20 20 20 20 20 20 2f 2a 20 41 20 73 6f 72 74         /* A sort
3ba0: 69 6e 67 20 69 6e 64 65 78 20 75 73 65 64 20 74  ing index used t
3bb0: 6f 20 74 65 73 74 20 66 6f 72 20 64 69 73 74 69  o test for disti
3bc0: 6e 63 74 6e 65 73 73 20 2a 2f 0a 20 20 69 6e 74  nctness */.  int
3bd0: 20 61 64 64 72 52 65 70 65 61 74 2c 20 20 20 20   addrRepeat,    
3be0: 2f 2a 20 4a 75 6d 70 20 74 6f 20 68 65 72 65 20  /* Jump to here 
3bf0: 69 66 20 6e 6f 74 20 64 69 73 74 69 6e 63 74 20  if not distinct 
3c00: 2a 2f 0a 20 20 69 6e 74 20 4e 2c 20 20 20 20 20  */.  int N,     
3c10: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
3c20: 72 20 6f 66 20 65 6c 65 6d 65 6e 74 73 20 2a 2f  r of elements */
3c30: 0a 20 20 69 6e 74 20 69 4d 65 6d 20 20 20 20 20  .  int iMem     
3c40: 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 65        /* First e
3c50: 6c 65 6d 65 6e 74 20 2a 2f 0a 29 7b 0a 20 20 56  lement */.){.  V
3c60: 64 62 65 20 2a 76 3b 0a 20 20 69 6e 74 20 72 31  dbe *v;.  int r1
3c70: 3b 0a 0a 20 20 76 20 3d 20 70 50 61 72 73 65 2d  ;..  v = pParse-
3c80: 3e 70 56 64 62 65 3b 0a 20 20 72 31 20 3d 20 73  >pVdbe;.  r1 = s
3c90: 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65 67  qlite3GetTempReg
3ca0: 28 70 50 61 72 73 65 29 3b 0a 20 20 73 71 6c 69  (pParse);.  sqli
3cb0: 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
3cc0: 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20   OP_MakeRecord, 
3cd0: 69 4d 65 6d 2c 20 4e 2c 20 72 31 29 3b 0a 20 20  iMem, N, r1);.  
3ce0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
3cf0: 33 28 76 2c 20 4f 50 5f 46 6f 75 6e 64 2c 20 69  3(v, OP_Found, i
3d00: 54 61 62 2c 20 61 64 64 72 52 65 70 65 61 74 2c  Tab, addrRepeat,
3d10: 20 72 31 29 3b 0a 20 20 73 71 6c 69 74 65 33 56   r1);.  sqlite3V
3d20: 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
3d30: 49 64 78 49 6e 73 65 72 74 2c 20 69 54 61 62 2c  IdxInsert, iTab,
3d40: 20 72 31 29 3b 0a 20 20 73 71 6c 69 74 65 33 52   r1);.  sqlite3R
3d50: 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50  eleaseTempReg(pP
3d60: 61 72 73 65 2c 20 72 31 29 3b 0a 7d 0a 0a 2f 2a  arse, r1);.}../*
3d70: 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 61 6e 20  .** Generate an 
3d80: 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 77 68  error message wh
3d90: 65 6e 20 61 20 53 45 4c 45 43 54 20 69 73 20 75  en a SELECT is u
3da0: 73 65 64 20 77 69 74 68 69 6e 20 61 20 73 75 62  sed within a sub
3db0: 65 78 70 72 65 73 73 69 6f 6e 0a 2a 2a 20 28 65  expression.** (e
3dc0: 78 61 6d 70 6c 65 3a 20 20 22 61 20 49 4e 20 28  xample:  "a IN (
3dd0: 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 61  SELECT * FROM ta
3de0: 62 6c 65 29 22 29 20 62 75 74 20 69 74 20 68 61  ble)") but it ha
3df0: 73 20 6d 6f 72 65 20 74 68 61 6e 20 31 20 72 65  s more than 1 re
3e00: 73 75 6c 74 0a 2a 2a 20 63 6f 6c 75 6d 6e 2e 20  sult.** column. 
3e10: 20 57 65 20 64 6f 20 74 68 69 73 20 69 6e 20 61   We do this in a
3e20: 20 73 75 62 72 6f 75 74 69 6e 65 20 62 65 63 61   subroutine beca
3e30: 75 73 65 20 74 68 65 20 65 72 72 6f 72 20 6f 63  use the error oc
3e40: 63 75 72 73 20 69 6e 20 6d 75 6c 74 69 70 6c 65  curs in multiple
3e50: 0a 2a 2a 20 70 6c 61 63 65 73 2e 0a 2a 2f 0a 73  .** places..*/.s
3e60: 74 61 74 69 63 20 69 6e 74 20 63 68 65 63 6b 46  tatic int checkF
3e70: 6f 72 4d 75 6c 74 69 43 6f 6c 75 6d 6e 53 65 6c  orMultiColumnSel
3e80: 65 63 74 45 72 72 6f 72 28 0a 20 20 50 61 72 73  ectError(.  Pars
3e90: 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20  e *pParse,      
3ea0: 20 2f 2a 20 50 61 72 73 65 20 63 6f 6e 74 65 78   /* Parse contex
3eb0: 74 2e 20 2a 2f 0a 20 20 53 65 6c 65 63 74 44 65  t. */.  SelectDe
3ec0: 73 74 20 2a 70 44 65 73 74 2c 20 20 20 2f 2a 20  st *pDest,   /* 
3ed0: 44 65 73 74 69 6e 61 74 69 6f 6e 20 6f 66 20 53  Destination of S
3ee0: 45 4c 45 43 54 20 72 65 73 75 6c 74 73 20 2a 2f  ELECT results */
3ef0: 0a 20 20 69 6e 74 20 6e 45 78 70 72 20 20 20 20  .  int nExpr    
3f00: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
3f10: 72 20 6f 66 20 72 65 73 75 6c 74 20 63 6f 6c 75  r of result colu
3f20: 6d 6e 73 20 72 65 74 75 72 6e 65 64 20 62 79 20  mns returned by 
3f30: 53 45 4c 45 43 54 20 2a 2f 0a 29 7b 0a 20 20 69  SELECT */.){.  i
3f40: 6e 74 20 65 44 65 73 74 20 3d 20 70 44 65 73 74  nt eDest = pDest
3f50: 2d 3e 65 44 65 73 74 3b 0a 20 20 69 66 28 20 6e  ->eDest;.  if( n
3f60: 45 78 70 72 3e 31 20 26 26 20 28 65 44 65 73 74  Expr>1 && (eDest
3f70: 3d 3d 53 52 54 5f 4d 65 6d 20 7c 7c 20 65 44 65  ==SRT_Mem || eDe
3f80: 73 74 3d 3d 53 52 54 5f 53 65 74 29 20 29 7b 0a  st==SRT_Set) ){.
3f90: 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
3fa0: 4d 73 67 28 70 50 61 72 73 65 2c 20 22 6f 6e 6c  Msg(pParse, "onl
3fb0: 79 20 61 20 73 69 6e 67 6c 65 20 72 65 73 75 6c  y a single resul
3fc0: 74 20 61 6c 6c 6f 77 65 64 20 66 6f 72 20 22 0a  t allowed for ".
3fd0: 20 20 20 20 20 20 20 22 61 20 53 45 4c 45 43 54         "a SELECT
3fe0: 20 74 68 61 74 20 69 73 20 70 61 72 74 20 6f 66   that is part of
3ff0: 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 22 29   an expression")
4000: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a  ;.    return 1;.
4010: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65 74    }else{.    ret
4020: 75 72 6e 20 30 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  urn 0;.  }.}../*
4030: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
4040: 20 67 65 6e 65 72 61 74 65 73 20 74 68 65 20 63   generates the c
4050: 6f 64 65 20 66 6f 72 20 74 68 65 20 69 6e 73 69  ode for the insi
4060: 64 65 20 6f 66 20 74 68 65 20 69 6e 6e 65 72 20  de of the inner 
4070: 6c 6f 6f 70 0a 2a 2a 20 6f 66 20 61 20 53 45 4c  loop.** of a SEL
4080: 45 43 54 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 73 72  ECT..**.** If sr
4090: 63 54 61 62 20 61 6e 64 20 6e 43 6f 6c 75 6d 6e  cTab and nColumn
40a0: 20 61 72 65 20 62 6f 74 68 20 7a 65 72 6f 2c 20   are both zero, 
40b0: 74 68 65 6e 20 74 68 65 20 70 45 4c 69 73 74 20  then the pEList 
40c0: 65 78 70 72 65 73 73 69 6f 6e 73 0a 2a 2a 20 61  expressions.** a
40d0: 72 65 20 65 76 61 6c 75 61 74 65 64 20 69 6e 20  re evaluated in 
40e0: 6f 72 64 65 72 20 74 6f 20 67 65 74 20 74 68 65  order to get the
40f0: 20 64 61 74 61 20 66 6f 72 20 74 68 69 73 20 72   data for this r
4100: 6f 77 2e 20 20 49 66 20 6e 43 6f 6c 75 6d 6e 3e  ow.  If nColumn>
4110: 30 0a 2a 2a 20 74 68 65 6e 20 64 61 74 61 20 69  0.** then data i
4120: 73 20 70 75 6c 6c 65 64 20 66 72 6f 6d 20 73 72  s pulled from sr
4130: 63 54 61 62 20 61 6e 64 20 70 45 4c 69 73 74 20  cTab and pEList 
4140: 69 73 20 75 73 65 64 20 6f 6e 6c 79 20 74 6f 20  is used only to 
4150: 67 65 74 20 74 68 65 0a 2a 2a 20 64 61 74 61 74  get the.** datat
4160: 79 70 65 73 20 66 6f 72 20 65 61 63 68 20 63 6f  ypes for each co
4170: 6c 75 6d 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  lumn..*/.static 
4180: 76 6f 69 64 20 73 65 6c 65 63 74 49 6e 6e 65 72  void selectInner
4190: 4c 6f 6f 70 28 0a 20 20 50 61 72 73 65 20 2a 70  Loop(.  Parse *p
41a0: 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 20 20  Parse,          
41b0: 2f 2a 20 54 68 65 20 70 61 72 73 65 72 20 63 6f  /* The parser co
41c0: 6e 74 65 78 74 20 2a 2f 0a 20 20 53 65 6c 65 63  ntext */.  Selec
41d0: 74 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20  t *p,           
41e0: 20 20 20 2f 2a 20 54 68 65 20 63 6f 6d 70 6c 65     /* The comple
41f0: 74 65 20 73 65 6c 65 63 74 20 73 74 61 74 65 6d  te select statem
4200: 65 6e 74 20 62 65 69 6e 67 20 63 6f 64 65 64 20  ent being coded 
4210: 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70  */.  ExprList *p
4220: 45 4c 69 73 74 2c 20 20 20 20 20 20 20 2f 2a 20  EList,       /* 
4230: 4c 69 73 74 20 6f 66 20 76 61 6c 75 65 73 20 62  List of values b
4240: 65 69 6e 67 20 65 78 74 72 61 63 74 65 64 20 2a  eing extracted *
4250: 2f 0a 20 20 69 6e 74 20 73 72 63 54 61 62 2c 20  /.  int srcTab, 
4260: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
4270: 75 6c 6c 20 64 61 74 61 20 66 72 6f 6d 20 74 68  ull data from th
4280: 69 73 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e  is table */.  in
4290: 74 20 6e 43 6f 6c 75 6d 6e 2c 20 20 20 20 20 20  t nColumn,      
42a0: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
42b0: 6f 66 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68  of columns in th
42c0: 65 20 73 6f 75 72 63 65 20 74 61 62 6c 65 20 2a  e source table *
42d0: 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4f  /.  ExprList *pO
42e0: 72 64 65 72 42 79 2c 20 20 20 20 20 2f 2a 20 49  rderBy,     /* I
42f0: 66 20 6e 6f 74 20 4e 55 4c 4c 2c 20 73 6f 72 74  f not NULL, sort
4300: 20 72 65 73 75 6c 74 73 20 75 73 69 6e 67 20 74   results using t
4310: 68 69 73 20 6b 65 79 20 2a 2f 0a 20 20 69 6e 74  his key */.  int
4320: 20 64 69 73 74 69 6e 63 74 2c 20 20 20 20 20 20   distinct,      
4330: 20 20 20 20 20 2f 2a 20 49 66 20 3e 3d 30 2c 20       /* If >=0, 
4340: 6d 61 6b 65 20 73 75 72 65 20 72 65 73 75 6c 74  make sure result
4350: 73 20 61 72 65 20 64 69 73 74 69 6e 63 74 20 2a  s are distinct *
4360: 2f 0a 20 20 53 65 6c 65 63 74 44 65 73 74 20 2a  /.  SelectDest *
4370: 70 44 65 73 74 2c 20 20 20 20 20 20 2f 2a 20 48  pDest,      /* H
4380: 6f 77 20 74 6f 20 64 69 73 70 6f 73 65 20 6f 66  ow to dispose of
4390: 20 74 68 65 20 72 65 73 75 6c 74 73 20 2a 2f 0a   the results */.
43a0: 20 20 69 6e 74 20 69 43 6f 6e 74 69 6e 75 65 2c    int iContinue,
43b0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4a 75 6d            /* Jum
43c0: 70 20 68 65 72 65 20 74 6f 20 63 6f 6e 74 69 6e  p here to contin
43d0: 75 65 20 77 69 74 68 20 6e 65 78 74 20 72 6f 77  ue with next row
43e0: 20 2a 2f 0a 20 20 69 6e 74 20 69 42 72 65 61 6b   */.  int iBreak
43f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
4400: 20 4a 75 6d 70 20 68 65 72 65 20 74 6f 20 62 72   Jump here to br
4410: 65 61 6b 20 6f 75 74 20 6f 66 20 74 68 65 20 69  eak out of the i
4420: 6e 6e 65 72 20 6c 6f 6f 70 20 2a 2f 0a 29 7b 0a  nner loop */.){.
4430: 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72    Vdbe *v = pPar
4440: 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74  se->pVdbe;.  int
4450: 20 69 3b 0a 20 20 69 6e 74 20 68 61 73 44 69 73   i;.  int hasDis
4460: 74 69 6e 63 74 3b 20 20 20 20 20 20 20 20 2f 2a  tinct;        /*
4470: 20 54 72 75 65 20 69 66 20 74 68 65 20 44 49 53   True if the DIS
4480: 54 49 4e 43 54 20 6b 65 79 77 6f 72 64 20 69 73  TINCT keyword is
4490: 20 70 72 65 73 65 6e 74 20 2a 2f 0a 20 20 69 6e   present */.  in
44a0: 74 20 72 65 67 52 65 73 75 6c 74 3b 20 20 20 20  t regResult;    
44b0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 74 61            /* Sta
44c0: 72 74 20 6f 66 20 6d 65 6d 6f 72 79 20 68 6f 6c  rt of memory hol
44d0: 64 69 6e 67 20 72 65 73 75 6c 74 20 73 65 74 20  ding result set 
44e0: 2a 2f 0a 20 20 69 6e 74 20 65 44 65 73 74 20 3d  */.  int eDest =
44f0: 20 70 44 65 73 74 2d 3e 65 44 65 73 74 3b 20 20   pDest->eDest;  
4500: 20 2f 2a 20 48 6f 77 20 74 6f 20 64 69 73 70 6f   /* How to dispo
4510: 73 65 20 6f 66 20 72 65 73 75 6c 74 73 20 2a 2f  se of results */
4520: 0a 20 20 69 6e 74 20 69 50 61 72 6d 20 3d 20 70  .  int iParm = p
4530: 44 65 73 74 2d 3e 69 50 61 72 6d 3b 20 20 20 2f  Dest->iParm;   /
4540: 2a 20 46 69 72 73 74 20 61 72 67 75 6d 65 6e 74  * First argument
4550: 20 74 6f 20 64 69 73 70 6f 73 61 6c 20 6d 65 74   to disposal met
4560: 68 6f 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 52 65  hod */.  int nRe
4570: 73 75 6c 74 43 6f 6c 3b 20 20 20 20 20 20 20 20  sultCol;        
4580: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
4590: 66 20 72 65 73 75 6c 74 20 63 6f 6c 75 6d 6e 73  f result columns
45a0: 20 2a 2f 0a 0a 20 20 69 66 28 20 76 3d 3d 30 20   */..  if( v==0 
45b0: 29 20 72 65 74 75 72 6e 3b 0a 20 20 61 73 73 65  ) return;.  asse
45c0: 72 74 28 20 70 45 4c 69 73 74 21 3d 30 20 29 3b  rt( pEList!=0 );
45d0: 0a 20 20 68 61 73 44 69 73 74 69 6e 63 74 20 3d  .  hasDistinct =
45e0: 20 64 69 73 74 69 6e 63 74 3e 3d 30 3b 0a 20 20   distinct>=0;.  
45f0: 69 66 28 20 70 4f 72 64 65 72 42 79 3d 3d 30 20  if( pOrderBy==0 
4600: 26 26 20 21 68 61 73 44 69 73 74 69 6e 63 74 20  && !hasDistinct 
4610: 29 7b 0a 20 20 20 20 63 6f 64 65 4f 66 66 73 65  ){.    codeOffse
4620: 74 28 76 2c 20 70 2c 20 69 43 6f 6e 74 69 6e 75  t(v, p, iContinu
4630: 65 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 50 75  e);.  }..  /* Pu
4640: 6c 6c 20 74 68 65 20 72 65 71 75 65 73 74 65 64  ll the requested
4650: 20 63 6f 6c 75 6d 6e 73 2e 0a 20 20 2a 2f 0a 20   columns..  */. 
4660: 20 69 66 28 20 6e 43 6f 6c 75 6d 6e 3e 30 20 29   if( nColumn>0 )
4670: 7b 0a 20 20 20 20 6e 52 65 73 75 6c 74 43 6f 6c  {.    nResultCol
4680: 20 3d 20 6e 43 6f 6c 75 6d 6e 3b 0a 20 20 7d 65   = nColumn;.  }e
4690: 6c 73 65 7b 0a 20 20 20 20 6e 52 65 73 75 6c 74  lse{.    nResult
46a0: 43 6f 6c 20 3d 20 70 45 4c 69 73 74 2d 3e 6e 45  Col = pEList->nE
46b0: 78 70 72 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  xpr;.  }.  if( p
46c0: 44 65 73 74 2d 3e 69 4d 65 6d 3d 3d 30 20 29 7b  Dest->iMem==0 ){
46d0: 0a 20 20 20 20 70 44 65 73 74 2d 3e 69 4d 65 6d  .    pDest->iMem
46e0: 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b   = pParse->nMem+
46f0: 31 3b 0a 20 20 20 20 70 44 65 73 74 2d 3e 6e 4d  1;.    pDest->nM
4700: 65 6d 20 3d 20 6e 52 65 73 75 6c 74 43 6f 6c 3b  em = nResultCol;
4710: 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65  .    pParse->nMe
4720: 6d 20 2b 3d 20 6e 52 65 73 75 6c 74 43 6f 6c 3b  m += nResultCol;
4730: 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70 44 65  .  }else if( pDe
4740: 73 74 2d 3e 6e 4d 65 6d 21 3d 6e 52 65 73 75 6c  st->nMem!=nResul
4750: 74 43 6f 6c 20 29 7b 0a 20 20 20 20 2f 2a 20 54  tCol ){.    /* T
4760: 68 69 73 20 68 61 70 70 65 6e 73 20 77 68 65 6e  his happens when
4770: 20 74 77 6f 20 53 45 4c 45 43 54 73 20 6f 66 20   two SELECTs of 
4780: 61 20 63 6f 6d 70 6f 75 6e 64 20 53 45 4c 45 43  a compound SELEC
4790: 54 20 68 61 76 65 20 64 69 66 66 65 72 69 6e 67  T have differing
47a0: 0a 20 20 20 20 2a 2a 20 6e 75 6d 62 65 72 73 20  .    ** numbers 
47b0: 6f 66 20 72 65 73 75 6c 74 20 63 6f 6c 75 6d 6e  of result column
47c0: 73 2e 20 20 54 68 65 20 65 72 72 6f 72 20 6d 65  s.  The error me
47d0: 73 73 61 67 65 20 77 69 6c 6c 20 62 65 20 67 65  ssage will be ge
47e0: 6e 65 72 61 74 65 64 20 62 79 0a 20 20 20 20 2a  nerated by.    *
47f0: 2a 20 61 20 68 69 67 68 65 72 2d 6c 65 76 65 6c  * a higher-level
4800: 20 72 6f 75 74 69 6e 65 2e 20 2a 2f 0a 20 20 20   routine. */.   
4810: 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 72   return;.  }.  r
4820: 65 67 52 65 73 75 6c 74 20 3d 20 70 44 65 73 74  egResult = pDest
4830: 2d 3e 69 4d 65 6d 3b 0a 20 20 69 66 28 20 6e 43  ->iMem;.  if( nC
4840: 6f 6c 75 6d 6e 3e 30 20 29 7b 0a 20 20 20 20 66  olumn>0 ){.    f
4850: 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 6f 6c 75 6d  or(i=0; i<nColum
4860: 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 73  n; i++){.      s
4870: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
4880: 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 73  (v, OP_Column, s
4890: 72 63 54 61 62 2c 20 69 2c 20 72 65 67 52 65 73  rcTab, i, regRes
48a0: 75 6c 74 2b 69 29 3b 0a 20 20 20 20 7d 0a 20 20  ult+i);.    }.  
48b0: 7d 65 6c 73 65 20 69 66 28 20 65 44 65 73 74 21  }else if( eDest!
48c0: 3d 53 52 54 5f 45 78 69 73 74 73 20 29 7b 0a 20  =SRT_Exists ){. 
48d0: 20 20 20 2f 2a 20 49 66 20 74 68 65 20 64 65 73     /* If the des
48e0: 74 69 6e 61 74 69 6f 6e 20 69 73 20 61 6e 20 45  tination is an E
48f0: 58 49 53 54 53 28 2e 2e 2e 29 20 65 78 70 72 65  XISTS(...) expre
4900: 73 73 69 6f 6e 2c 20 74 68 65 20 61 63 74 75 61  ssion, the actua
4910: 6c 0a 20 20 20 20 2a 2a 20 76 61 6c 75 65 73 20  l.    ** values 
4920: 72 65 74 75 72 6e 65 64 20 62 79 20 74 68 65 20  returned by the 
4930: 53 45 4c 45 43 54 20 61 72 65 20 6e 6f 74 20 72  SELECT are not r
4940: 65 71 75 69 72 65 64 2e 0a 20 20 20 20 2a 2f 0a  equired..    */.
4950: 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
4960: 6f 64 65 45 78 70 72 4c 69 73 74 28 70 50 61 72  odeExprList(pPar
4970: 73 65 2c 20 70 45 4c 69 73 74 2c 20 72 65 67 52  se, pEList, regR
4980: 65 73 75 6c 74 2c 20 65 44 65 73 74 3d 3d 53 52  esult, eDest==SR
4990: 54 5f 43 61 6c 6c 62 61 63 6b 29 3b 0a 20 20 7d  T_Callback);.  }
49a0: 0a 20 20 6e 43 6f 6c 75 6d 6e 20 3d 20 6e 52 65  .  nColumn = nRe
49b0: 73 75 6c 74 43 6f 6c 3b 0a 0a 20 20 2f 2a 20 49  sultCol;..  /* I
49c0: 66 20 74 68 65 20 44 49 53 54 49 4e 43 54 20 6b  f the DISTINCT k
49d0: 65 79 77 6f 72 64 20 77 61 73 20 70 72 65 73 65  eyword was prese
49e0: 6e 74 20 6f 6e 20 74 68 65 20 53 45 4c 45 43 54  nt on the SELECT
49f0: 20 73 74 61 74 65 6d 65 6e 74 0a 20 20 2a 2a 20   statement.  ** 
4a00: 61 6e 64 20 74 68 69 73 20 72 6f 77 20 68 61 73  and this row has
4a10: 20 62 65 65 6e 20 73 65 65 6e 20 62 65 66 6f 72   been seen befor
4a20: 65 2c 20 74 68 65 6e 20 64 6f 20 6e 6f 74 20 6d  e, then do not m
4a30: 61 6b 65 20 74 68 69 73 20 72 6f 77 0a 20 20 2a  ake this row.  *
4a40: 2a 20 70 61 72 74 20 6f 66 20 74 68 65 20 72 65  * part of the re
4a50: 73 75 6c 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  sult..  */.  if(
4a60: 20 68 61 73 44 69 73 74 69 6e 63 74 20 29 7b 0a   hasDistinct ){.
4a70: 20 20 20 20 61 73 73 65 72 74 28 20 70 45 4c 69      assert( pELi
4a80: 73 74 21 3d 30 20 29 3b 0a 20 20 20 20 61 73 73  st!=0 );.    ass
4a90: 65 72 74 28 20 70 45 4c 69 73 74 2d 3e 6e 45 78  ert( pEList->nEx
4aa0: 70 72 3d 3d 6e 43 6f 6c 75 6d 6e 20 29 3b 0a 20  pr==nColumn );. 
4ab0: 20 20 20 63 6f 64 65 44 69 73 74 69 6e 63 74 28     codeDistinct(
4ac0: 70 50 61 72 73 65 2c 20 64 69 73 74 69 6e 63 74  pParse, distinct
4ad0: 2c 20 69 43 6f 6e 74 69 6e 75 65 2c 20 6e 43 6f  , iContinue, nCo
4ae0: 6c 75 6d 6e 2c 20 72 65 67 52 65 73 75 6c 74 29  lumn, regResult)
4af0: 3b 0a 20 20 20 20 69 66 28 20 70 4f 72 64 65 72  ;.    if( pOrder
4b00: 42 79 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 63  By==0 ){.      c
4b10: 6f 64 65 4f 66 66 73 65 74 28 76 2c 20 70 2c 20  odeOffset(v, p, 
4b20: 69 43 6f 6e 74 69 6e 75 65 29 3b 0a 20 20 20 20  iContinue);.    
4b30: 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20 63 68 65  }.  }..  if( che
4b40: 63 6b 46 6f 72 4d 75 6c 74 69 43 6f 6c 75 6d 6e  ckForMultiColumn
4b50: 53 65 6c 65 63 74 45 72 72 6f 72 28 70 50 61 72  SelectError(pPar
4b60: 73 65 2c 20 70 44 65 73 74 2c 20 70 45 4c 69 73  se, pDest, pELis
4b70: 74 2d 3e 6e 45 78 70 72 29 20 29 7b 0a 20 20 20  t->nExpr) ){.   
4b80: 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 0a 20 20   return;.  }..  
4b90: 73 77 69 74 63 68 28 20 65 44 65 73 74 20 29 7b  switch( eDest ){
4ba0: 0a 20 20 20 20 2f 2a 20 49 6e 20 74 68 69 73 20  .    /* In this 
4bb0: 6d 6f 64 65 2c 20 77 72 69 74 65 20 65 61 63 68  mode, write each
4bc0: 20 71 75 65 72 79 20 72 65 73 75 6c 74 20 74 6f   query result to
4bd0: 20 74 68 65 20 6b 65 79 20 6f 66 20 74 68 65 20   the key of the 
4be0: 74 65 6d 70 6f 72 61 72 79 0a 20 20 20 20 2a 2a  temporary.    **
4bf0: 20 74 61 62 6c 65 20 69 50 61 72 6d 2e 0a 20 20   table iParm..  
4c00: 20 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c    */.#ifndef SQL
4c10: 49 54 45 5f 4f 4d 49 54 5f 43 4f 4d 50 4f 55 4e  ITE_OMIT_COMPOUN
4c20: 44 5f 53 45 4c 45 43 54 0a 20 20 20 20 63 61 73  D_SELECT.    cas
4c30: 65 20 53 52 54 5f 55 6e 69 6f 6e 3a 20 7b 0a 20  e SRT_Union: {. 
4c40: 20 20 20 20 20 69 6e 74 20 72 31 3b 0a 20 20 20       int r1;.   
4c50: 20 20 20 72 31 20 3d 20 73 71 6c 69 74 65 33 47     r1 = sqlite3G
4c60: 65 74 54 65 6d 70 52 65 67 28 70 50 61 72 73 65  etTempReg(pParse
4c70: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
4c80: 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
4c90: 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20 72 65 67  _MakeRecord, reg
4ca0: 52 65 73 75 6c 74 2c 20 6e 43 6f 6c 75 6d 6e 2c  Result, nColumn,
4cb0: 20 72 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69   r1);.      sqli
4cc0: 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
4cd0: 20 4f 50 5f 49 64 78 49 6e 73 65 72 74 2c 20 69   OP_IdxInsert, i
4ce0: 50 61 72 6d 2c 20 72 31 29 3b 0a 20 20 20 20 20  Parm, r1);.     
4cf0: 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54   sqlite3ReleaseT
4d00: 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72  empReg(pParse, r
4d10: 31 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  1);.      break;
4d20: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43  .    }..    /* C
4d30: 6f 6e 73 74 72 75 63 74 20 61 20 72 65 63 6f 72  onstruct a recor
4d40: 64 20 66 72 6f 6d 20 74 68 65 20 71 75 65 72 79  d from the query
4d50: 20 72 65 73 75 6c 74 2c 20 62 75 74 20 69 6e 73   result, but ins
4d60: 74 65 61 64 20 6f 66 0a 20 20 20 20 2a 2a 20 73  tead of.    ** s
4d70: 61 76 69 6e 67 20 74 68 61 74 20 72 65 63 6f 72  aving that recor
4d80: 64 2c 20 75 73 65 20 69 74 20 61 73 20 61 20 6b  d, use it as a k
4d90: 65 79 20 74 6f 20 64 65 6c 65 74 65 20 65 6c 65  ey to delete ele
4da0: 6d 65 6e 74 73 20 66 72 6f 6d 0a 20 20 20 20 2a  ments from.    *
4db0: 2a 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79 20  * the temporary 
4dc0: 74 61 62 6c 65 20 69 50 61 72 6d 2e 0a 20 20 20  table iParm..   
4dd0: 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 52 54   */.    case SRT
4de0: 5f 45 78 63 65 70 74 3a 20 7b 0a 20 20 20 20 20  _Except: {.     
4df0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
4e00: 70 33 28 76 2c 20 4f 50 5f 49 64 78 44 65 6c 65  p3(v, OP_IdxDele
4e10: 74 65 2c 20 69 50 61 72 6d 2c 20 72 65 67 52 65  te, iParm, regRe
4e20: 73 75 6c 74 2c 20 6e 43 6f 6c 75 6d 6e 29 3b 0a  sult, nColumn);.
4e30: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
4e40: 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 2f   }.#endif..    /
4e50: 2a 20 53 74 6f 72 65 20 74 68 65 20 72 65 73 75  * Store the resu
4e60: 6c 74 20 61 73 20 64 61 74 61 20 75 73 69 6e 67  lt as data using
4e70: 20 61 20 75 6e 69 71 75 65 20 6b 65 79 2e 0a 20   a unique key.. 
4e80: 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53     */.    case S
4e90: 52 54 5f 54 61 62 6c 65 3a 0a 20 20 20 20 63 61  RT_Table:.    ca
4ea0: 73 65 20 53 52 54 5f 45 70 68 65 6d 54 61 62 3a  se SRT_EphemTab:
4eb0: 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 72 31 20   {.      int r1 
4ec0: 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70  = sqlite3GetTemp
4ed0: 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20 20  Reg(pParse);.   
4ee0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
4ef0: 64 4f 70 33 28 76 2c 20 4f 50 5f 4d 61 6b 65 52  dOp3(v, OP_MakeR
4f00: 65 63 6f 72 64 2c 20 72 65 67 52 65 73 75 6c 74  ecord, regResult
4f10: 2c 20 6e 43 6f 6c 75 6d 6e 2c 20 72 31 29 3b 0a  , nColumn, r1);.
4f20: 20 20 20 20 20 20 69 66 28 20 70 4f 72 64 65 72        if( pOrder
4f30: 42 79 20 29 7b 0a 20 20 20 20 20 20 20 20 70 75  By ){.        pu
4f40: 73 68 4f 6e 74 6f 53 6f 72 74 65 72 28 70 50 61  shOntoSorter(pPa
4f50: 72 73 65 2c 20 70 4f 72 64 65 72 42 79 2c 20 70  rse, pOrderBy, p
4f60: 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 7d 65 6c  , r1);.      }el
4f70: 73 65 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20  se{.        int 
4f80: 72 32 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54  r2 = sqlite3GetT
4f90: 65 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a  empReg(pParse);.
4fa0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
4fb0: 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
4fc0: 4e 65 77 52 6f 77 69 64 2c 20 69 50 61 72 6d 2c  NewRowid, iParm,
4fd0: 20 72 32 29 3b 0a 20 20 20 20 20 20 20 20 73 71   r2);.        sq
4fe0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
4ff0: 76 2c 20 4f 50 5f 49 6e 73 65 72 74 2c 20 69 50  v, OP_Insert, iP
5000: 61 72 6d 2c 20 72 31 2c 20 72 32 29 3b 0a 20 20  arm, r1, r2);.  
5010: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
5020: 65 43 68 61 6e 67 65 50 35 28 76 2c 20 4f 50 46  eChangeP5(v, OPF
5030: 4c 41 47 5f 41 50 50 45 4e 44 29 3b 0a 20 20 20  LAG_APPEND);.   
5040: 20 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65       sqlite3Rele
5050: 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73  aseTempReg(pPars
5060: 65 2c 20 72 32 29 3b 0a 20 20 20 20 20 20 7d 0a  e, r2);.      }.
5070: 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c        sqlite3Rel
5080: 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72  easeTempReg(pPar
5090: 73 65 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 62  se, r1);.      b
50a0: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 23 69 66  reak;.    }..#if
50b0: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
50c0: 5f 53 55 42 51 55 45 52 59 0a 20 20 20 20 2f 2a  _SUBQUERY.    /*
50d0: 20 49 66 20 77 65 20 61 72 65 20 63 72 65 61 74   If we are creat
50e0: 69 6e 67 20 61 20 73 65 74 20 66 6f 72 20 61 6e  ing a set for an
50f0: 20 22 65 78 70 72 20 49 4e 20 28 53 45 4c 45 43   "expr IN (SELEC
5100: 54 20 2e 2e 2e 29 22 20 63 6f 6e 73 74 72 75 63  T ...)" construc
5110: 74 2c 0a 20 20 20 20 2a 2a 20 74 68 65 6e 20 74  t,.    ** then t
5120: 68 65 72 65 20 73 68 6f 75 6c 64 20 62 65 20 61  here should be a
5130: 20 73 69 6e 67 6c 65 20 69 74 65 6d 20 6f 6e 20   single item on 
5140: 74 68 65 20 73 74 61 63 6b 2e 20 20 57 72 69 74  the stack.  Writ
5150: 65 20 74 68 69 73 0a 20 20 20 20 2a 2a 20 69 74  e this.    ** it
5160: 65 6d 20 69 6e 74 6f 20 74 68 65 20 73 65 74 20  em into the set 
5170: 74 61 62 6c 65 20 77 69 74 68 20 62 6f 67 75 73  table with bogus
5180: 20 64 61 74 61 2e 0a 20 20 20 20 2a 2f 0a 20 20   data..    */.  
5190: 20 20 63 61 73 65 20 53 52 54 5f 53 65 74 3a 20    case SRT_Set: 
51a0: 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
51b0: 6e 43 6f 6c 75 6d 6e 3d 3d 31 20 29 3b 0a 20 20  nColumn==1 );.  
51c0: 20 20 20 20 70 2d 3e 61 66 66 69 6e 69 74 79 20      p->affinity 
51d0: 3d 20 73 71 6c 69 74 65 33 43 6f 6d 70 61 72 65  = sqlite3Compare
51e0: 41 66 66 69 6e 69 74 79 28 70 45 4c 69 73 74 2d  Affinity(pEList-
51f0: 3e 61 5b 30 5d 2e 70 45 78 70 72 2c 20 70 44 65  >a[0].pExpr, pDe
5200: 73 74 2d 3e 61 66 66 69 6e 69 74 79 29 3b 0a 20  st->affinity);. 
5210: 20 20 20 20 20 69 66 28 20 70 4f 72 64 65 72 42       if( pOrderB
5220: 79 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  y ){.        /* 
5230: 41 74 20 66 69 72 73 74 20 67 6c 61 6e 63 65 20  At first glance 
5240: 79 6f 75 20 77 6f 75 6c 64 20 74 68 69 6e 6b 20  you would think 
5250: 77 65 20 63 6f 75 6c 64 20 6f 70 74 69 6d 69 7a  we could optimiz
5260: 65 20 6f 75 74 20 74 68 65 0a 20 20 20 20 20 20  e out the.      
5270: 20 20 2a 2a 20 4f 52 44 45 52 20 42 59 20 69 6e    ** ORDER BY in
5280: 20 74 68 69 73 20 63 61 73 65 20 73 69 6e 63 65   this case since
5290: 20 74 68 65 20 6f 72 64 65 72 20 6f 66 20 65 6e   the order of en
52a0: 74 72 69 65 73 20 69 6e 20 74 68 65 20 73 65 74  tries in the set
52b0: 0a 20 20 20 20 20 20 20 20 2a 2a 20 64 6f 65 73  .        ** does
52c0: 20 6e 6f 74 20 6d 61 74 74 65 72 2e 20 20 42 75   not matter.  Bu
52d0: 74 20 74 68 65 72 65 20 6d 69 67 68 74 20 62 65  t there might be
52e0: 20 61 20 4c 49 4d 49 54 20 63 6c 61 75 73 65 2c   a LIMIT clause,
52f0: 20 69 6e 20 77 68 69 63 68 0a 20 20 20 20 20 20   in which.      
5300: 20 20 2a 2a 20 63 61 73 65 20 74 68 65 20 6f 72    ** case the or
5310: 64 65 72 20 64 6f 65 73 20 6d 61 74 74 65 72 20  der does matter 
5320: 2a 2f 0a 20 20 20 20 20 20 20 20 70 75 73 68 4f  */.        pushO
5330: 6e 74 6f 53 6f 72 74 65 72 28 70 50 61 72 73 65  ntoSorter(pParse
5340: 2c 20 70 4f 72 64 65 72 42 79 2c 20 70 2c 20 72  , pOrderBy, p, r
5350: 65 67 52 65 73 75 6c 74 29 3b 0a 20 20 20 20 20  egResult);.     
5360: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
5370: 69 6e 74 20 72 31 20 3d 20 73 71 6c 69 74 65 33  int r1 = sqlite3
5380: 47 65 74 54 65 6d 70 52 65 67 28 70 50 61 72 73  GetTempReg(pPars
5390: 65 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  e);.        sqli
53a0: 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c  te3VdbeAddOp4(v,
53b0: 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20   OP_MakeRecord, 
53c0: 72 65 67 52 65 73 75 6c 74 2c 20 31 2c 20 72 31  regResult, 1, r1
53d0: 2c 20 26 70 2d 3e 61 66 66 69 6e 69 74 79 2c 20  , &p->affinity, 
53e0: 31 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  1);.        sqli
53f0: 74 65 33 45 78 70 72 43 61 63 68 65 41 66 66 69  te3ExprCacheAffi
5400: 6e 69 74 79 43 68 61 6e 67 65 28 70 50 61 72 73  nityChange(pPars
5410: 65 2c 20 72 65 67 52 65 73 75 6c 74 2c 20 31 29  e, regResult, 1)
5420: 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
5430: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
5440: 50 5f 49 64 78 49 6e 73 65 72 74 2c 20 69 50 61  P_IdxInsert, iPa
5450: 72 6d 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 20  rm, r1);.       
5460: 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54   sqlite3ReleaseT
5470: 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72  empReg(pParse, r
5480: 31 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  1);.      }.    
5490: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a    break;.    }..
54a0: 20 20 20 20 2f 2a 20 49 66 20 61 6e 79 20 72 6f      /* If any ro
54b0: 77 20 65 78 69 73 74 20 69 6e 20 74 68 65 20 72  w exist in the r
54c0: 65 73 75 6c 74 20 73 65 74 2c 20 72 65 63 6f 72  esult set, recor
54d0: 64 20 74 68 61 74 20 66 61 63 74 20 61 6e 64 20  d that fact and 
54e0: 61 62 6f 72 74 2e 0a 20 20 20 20 2a 2f 0a 20 20  abort..    */.  
54f0: 20 20 63 61 73 65 20 53 52 54 5f 45 78 69 73 74    case SRT_Exist
5500: 73 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  s: {.      sqlit
5510: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
5520: 4f 50 5f 49 6e 74 65 67 65 72 2c 20 31 2c 20 69  OP_Integer, 1, i
5530: 50 61 72 6d 29 3b 0a 20 20 20 20 20 20 2f 2a 20  Parm);.      /* 
5540: 54 68 65 20 4c 49 4d 49 54 20 63 6c 61 75 73 65  The LIMIT clause
5550: 20 77 69 6c 6c 20 74 65 72 6d 69 6e 61 74 65 20   will terminate 
5560: 74 68 65 20 6c 6f 6f 70 20 66 6f 72 20 75 73 20  the loop for us 
5570: 2a 2f 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  */.      break;.
5580: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66      }..    /* If
5590: 20 74 68 69 73 20 69 73 20 61 20 73 63 61 6c 61   this is a scala
55a0: 72 20 73 65 6c 65 63 74 20 74 68 61 74 20 69 73  r select that is
55b0: 20 70 61 72 74 20 6f 66 20 61 6e 20 65 78 70 72   part of an expr
55c0: 65 73 73 69 6f 6e 2c 20 74 68 65 6e 0a 20 20 20  ession, then.   
55d0: 20 2a 2a 20 73 74 6f 72 65 20 74 68 65 20 72 65   ** store the re
55e0: 73 75 6c 74 73 20 69 6e 20 74 68 65 20 61 70 70  sults in the app
55f0: 72 6f 70 72 69 61 74 65 20 6d 65 6d 6f 72 79 20  ropriate memory 
5600: 63 65 6c 6c 20 61 6e 64 20 62 72 65 61 6b 20 6f  cell and break o
5610: 75 74 0a 20 20 20 20 2a 2a 20 6f 66 20 74 68 65  ut.    ** of the
5620: 20 73 63 61 6e 20 6c 6f 6f 70 2e 0a 20 20 20 20   scan loop..    
5630: 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f  */.    case SRT_
5640: 4d 65 6d 3a 20 7b 0a 20 20 20 20 20 20 61 73 73  Mem: {.      ass
5650: 65 72 74 28 20 6e 43 6f 6c 75 6d 6e 3d 3d 31 20  ert( nColumn==1 
5660: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4f 72  );.      if( pOr
5670: 64 65 72 42 79 20 29 7b 0a 20 20 20 20 20 20 20  derBy ){.       
5680: 20 70 75 73 68 4f 6e 74 6f 53 6f 72 74 65 72 28   pushOntoSorter(
5690: 70 50 61 72 73 65 2c 20 70 4f 72 64 65 72 42 79  pParse, pOrderBy
56a0: 2c 20 70 2c 20 72 65 67 52 65 73 75 6c 74 29 3b  , p, regResult);
56b0: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
56c0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
56d0: 72 43 6f 64 65 4d 6f 76 65 28 70 50 61 72 73 65  rCodeMove(pParse
56e0: 2c 20 72 65 67 52 65 73 75 6c 74 2c 20 69 50 61  , regResult, iPa
56f0: 72 6d 2c 20 31 29 3b 0a 20 20 20 20 20 20 20 20  rm, 1);.        
5700: 2f 2a 20 54 68 65 20 4c 49 4d 49 54 20 63 6c 61  /* The LIMIT cla
5710: 75 73 65 20 77 69 6c 6c 20 6a 75 6d 70 20 6f 75  use will jump ou
5720: 74 20 6f 66 20 74 68 65 20 6c 6f 6f 70 20 66 6f  t of the loop fo
5730: 72 20 75 73 20 2a 2f 0a 20 20 20 20 20 20 7d 0a  r us */.      }.
5740: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
5750: 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 23 69 66   }.#endif /* #if
5760: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
5770: 5f 53 55 42 51 55 45 52 59 20 2a 2f 0a 0a 20 20  _SUBQUERY */..  
5780: 20 20 2f 2a 20 53 65 6e 64 20 74 68 65 20 64 61    /* Send the da
5790: 74 61 20 74 6f 20 74 68 65 20 63 61 6c 6c 62 61  ta to the callba
57a0: 63 6b 20 66 75 6e 63 74 69 6f 6e 20 6f 72 20 74  ck function or t
57b0: 6f 20 61 20 73 75 62 72 6f 75 74 69 6e 65 2e 20  o a subroutine. 
57c0: 20 49 6e 20 74 68 65 0a 20 20 20 20 2a 2a 20 63   In the.    ** c
57d0: 61 73 65 20 6f 66 20 61 20 73 75 62 72 6f 75 74  ase of a subrout
57e0: 69 6e 65 2c 20 74 68 65 20 73 75 62 72 6f 75 74  ine, the subrout
57f0: 69 6e 65 20 69 74 73 65 6c 66 20 69 73 20 72 65  ine itself is re
5800: 73 70 6f 6e 73 69 62 6c 65 20 66 6f 72 0a 20 20  sponsible for.  
5810: 20 20 2a 2a 20 70 6f 70 70 69 6e 67 20 74 68 65    ** popping the
5820: 20 64 61 74 61 20 66 72 6f 6d 20 74 68 65 20 73   data from the s
5830: 74 61 63 6b 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  tack..    */.   
5840: 20 63 61 73 65 20 53 52 54 5f 43 6f 72 6f 75 74   case SRT_Corout
5850: 69 6e 65 3a 0a 20 20 20 20 63 61 73 65 20 53 52  ine:.    case SR
5860: 54 5f 43 61 6c 6c 62 61 63 6b 3a 20 7b 0a 20 20  T_Callback: {.  
5870: 20 20 20 20 69 66 28 20 70 4f 72 64 65 72 42 79      if( pOrderBy
5880: 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20   ){.        int 
5890: 72 31 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54  r1 = sqlite3GetT
58a0: 65 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a  empReg(pParse);.
58b0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
58c0: 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
58d0: 4d 61 6b 65 52 65 63 6f 72 64 2c 20 72 65 67 52  MakeRecord, regR
58e0: 65 73 75 6c 74 2c 20 6e 43 6f 6c 75 6d 6e 2c 20  esult, nColumn, 
58f0: 72 31 29 3b 0a 20 20 20 20 20 20 20 20 70 75 73  r1);.        pus
5900: 68 4f 6e 74 6f 53 6f 72 74 65 72 28 70 50 61 72  hOntoSorter(pPar
5910: 73 65 2c 20 70 4f 72 64 65 72 42 79 2c 20 70 2c  se, pOrderBy, p,
5920: 20 72 31 29 3b 0a 20 20 20 20 20 20 20 20 73 71   r1);.        sq
5930: 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70  lite3ReleaseTemp
5940: 52 65 67 28 70 50 61 72 73 65 2c 20 72 31 29 3b  Reg(pParse, r1);
5950: 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28  .      }else if(
5960: 20 65 44 65 73 74 3d 3d 53 52 54 5f 43 6f 72 6f   eDest==SRT_Coro
5970: 75 74 69 6e 65 20 29 7b 0a 20 20 20 20 20 20 20  utine ){.       
5980: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
5990: 70 31 28 76 2c 20 4f 50 5f 59 69 65 6c 64 2c 20  p1(v, OP_Yield, 
59a0: 70 44 65 73 74 2d 3e 69 50 61 72 6d 29 3b 0a 20  pDest->iParm);. 
59b0: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
59c0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
59d0: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52 65 73 75  ddOp2(v, OP_Resu
59e0: 6c 74 52 6f 77 2c 20 72 65 67 52 65 73 75 6c 74  ltRow, regResult
59f0: 2c 20 6e 43 6f 6c 75 6d 6e 29 3b 0a 20 20 20 20  , nColumn);.    
5a00: 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
5a10: 61 63 68 65 41 66 66 69 6e 69 74 79 43 68 61 6e  acheAffinityChan
5a20: 67 65 28 70 50 61 72 73 65 2c 20 72 65 67 52 65  ge(pParse, regRe
5a30: 73 75 6c 74 2c 20 6e 43 6f 6c 75 6d 6e 29 3b 0a  sult, nColumn);.
5a40: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72        }.      br
5a50: 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 23 69 66 20  eak;.    }..#if 
5a60: 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
5a70: 4f 4d 49 54 5f 54 52 49 47 47 45 52 29 0a 20 20  OMIT_TRIGGER).  
5a80: 20 20 2f 2a 20 44 69 73 63 61 72 64 20 74 68 65    /* Discard the
5a90: 20 72 65 73 75 6c 74 73 2e 20 20 54 68 69 73 20   results.  This 
5aa0: 69 73 20 75 73 65 64 20 66 6f 72 20 53 45 4c 45  is used for SELE
5ab0: 43 54 20 73 74 61 74 65 6d 65 6e 74 73 20 69 6e  CT statements in
5ac0: 73 69 64 65 0a 20 20 20 20 2a 2a 20 74 68 65 20  side.    ** the 
5ad0: 62 6f 64 79 20 6f 66 20 61 20 54 52 49 47 47 45  body of a TRIGGE
5ae0: 52 2e 20 20 54 68 65 20 70 75 72 70 6f 73 65 20  R.  The purpose 
5af0: 6f 66 20 73 75 63 68 20 73 65 6c 65 63 74 73 20  of such selects 
5b00: 69 73 20 74 6f 20 63 61 6c 6c 0a 20 20 20 20 2a  is to call.    *
5b10: 2a 20 75 73 65 72 2d 64 65 66 69 6e 65 64 20 66  * user-defined f
5b20: 75 6e 63 74 69 6f 6e 73 20 74 68 61 74 20 68 61  unctions that ha
5b30: 76 65 20 73 69 64 65 20 65 66 66 65 63 74 73 2e  ve side effects.
5b40: 20 20 57 65 20 64 6f 20 6e 6f 74 20 63 61 72 65    We do not care
5b50: 0a 20 20 20 20 2a 2a 20 61 62 6f 75 74 20 74 68  .    ** about th
5b60: 65 20 61 63 74 75 61 6c 20 72 65 73 75 6c 74 73  e actual results
5b70: 20 6f 66 20 74 68 65 20 73 65 6c 65 63 74 2e 0a   of the select..
5b80: 20 20 20 20 2a 2f 0a 20 20 20 20 64 65 66 61 75      */.    defau
5b90: 6c 74 3a 20 7b 0a 20 20 20 20 20 20 61 73 73 65  lt: {.      asse
5ba0: 72 74 28 20 65 44 65 73 74 3d 3d 53 52 54 5f 44  rt( eDest==SRT_D
5bb0: 69 73 63 61 72 64 20 29 3b 0a 20 20 20 20 20 20  iscard );.      
5bc0: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e  break;.    }.#en
5bd0: 64 69 66 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4a 75  dif.  }..  /* Ju
5be0: 6d 70 20 74 6f 20 74 68 65 20 65 6e 64 20 6f 66  mp to the end of
5bf0: 20 74 68 65 20 6c 6f 6f 70 20 69 66 20 74 68 65   the loop if the
5c00: 20 4c 49 4d 49 54 20 69 73 20 72 65 61 63 68 65   LIMIT is reache
5c10: 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d  d..  */.  if( p-
5c20: 3e 69 4c 69 6d 69 74 20 29 7b 0a 20 20 20 20 61  >iLimit ){.    a
5c30: 73 73 65 72 74 28 20 70 4f 72 64 65 72 42 79 3d  ssert( pOrderBy=
5c40: 3d 30 20 29 3b 20 20 2f 2a 20 49 66 20 74 68 65  =0 );  /* If the
5c50: 72 65 20 69 73 20 61 6e 20 4f 52 44 45 52 20 42  re is an ORDER B
5c60: 59 2c 20 74 68 65 20 63 61 6c 6c 20 74 6f 0a 20  Y, the call to. 
5c70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5c80: 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 70 75             ** pu
5c90: 73 68 4f 6e 74 6f 53 6f 72 74 65 72 28 29 20 77  shOntoSorter() w
5ca0: 6f 75 6c 64 20 68 61 76 65 20 63 6c 65 61 72 65  ould have cleare
5cb0: 64 20 70 2d 3e 69 4c 69 6d 69 74 20 2a 2f 0a 20  d p->iLimit */. 
5cc0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
5cd0: 64 4f 70 32 28 76 2c 20 4f 50 5f 41 64 64 49 6d  dOp2(v, OP_AddIm
5ce0: 6d 2c 20 70 2d 3e 69 4c 69 6d 69 74 2c 20 2d 31  m, p->iLimit, -1
5cf0: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
5d00: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49  beAddOp2(v, OP_I
5d10: 66 5a 65 72 6f 2c 20 70 2d 3e 69 4c 69 6d 69 74  fZero, p->iLimit
5d20: 2c 20 69 42 72 65 61 6b 29 3b 0a 20 20 7d 0a 7d  , iBreak);.  }.}
5d30: 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20 61 6e  ../*.** Given an
5d40: 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74   expression list
5d50: 2c 20 67 65 6e 65 72 61 74 65 20 61 20 4b 65 79  , generate a Key
5d60: 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65 20 74  Info structure t
5d70: 68 61 74 20 72 65 63 6f 72 64 73 0a 2a 2a 20 74  hat records.** t
5d80: 68 65 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71  he collating seq
5d90: 75 65 6e 63 65 20 66 6f 72 20 65 61 63 68 20 65  uence for each e
5da0: 78 70 72 65 73 73 69 6f 6e 20 69 6e 20 74 68 61  xpression in tha
5db0: 74 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 69 73  t expression lis
5dc0: 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  t..**.** If the 
5dd0: 45 78 70 72 4c 69 73 74 20 69 73 20 61 6e 20 4f  ExprList is an O
5de0: 52 44 45 52 20 42 59 20 6f 72 20 47 52 4f 55 50  RDER BY or GROUP
5df0: 20 42 59 20 63 6c 61 75 73 65 20 74 68 65 6e 20   BY clause then 
5e00: 74 68 65 20 72 65 73 75 6c 74 69 6e 67 0a 2a 2a  the resulting.**
5e10: 20 4b 65 79 49 6e 66 6f 20 73 74 72 75 63 74 75   KeyInfo structu
5e20: 72 65 20 69 73 20 61 70 70 72 6f 70 72 69 61 74  re is appropriat
5e30: 65 20 66 6f 72 20 69 6e 69 74 69 61 6c 69 7a 69  e for initializi
5e40: 6e 67 20 61 20 76 69 72 74 75 61 6c 20 69 6e 64  ng a virtual ind
5e50: 65 78 20 74 6f 0a 2a 2a 20 69 6d 70 6c 65 6d 65  ex to.** impleme
5e60: 6e 74 20 74 68 61 74 20 63 6c 61 75 73 65 2e 20  nt that clause. 
5e70: 20 49 66 20 74 68 65 20 45 78 70 72 4c 69 73 74   If the ExprList
5e80: 20 69 73 20 74 68 65 20 72 65 73 75 6c 74 20 73   is the result s
5e90: 65 74 20 6f 66 20 61 20 53 45 4c 45 43 54 0a 2a  et of a SELECT.*
5ea0: 2a 20 74 68 65 6e 20 74 68 65 20 4b 65 79 49 6e  * then the KeyIn
5eb0: 66 6f 20 73 74 72 75 63 74 75 72 65 20 69 73 20  fo structure is 
5ec0: 61 70 70 72 6f 70 72 69 61 74 65 20 66 6f 72 20  appropriate for 
5ed0: 69 6e 69 74 69 61 6c 69 7a 69 6e 67 20 61 20 76  initializing a v
5ee0: 69 72 74 75 61 6c 0a 2a 2a 20 69 6e 64 65 78 20  irtual.** index 
5ef0: 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 61 20 44  to implement a D
5f00: 49 53 54 49 4e 43 54 20 74 65 73 74 2e 0a 2a 2a  ISTINCT test..**
5f10: 0a 2a 2a 20 53 70 61 63 65 20 74 6f 20 68 6f 6c  .** Space to hol
5f20: 64 20 74 68 65 20 4b 65 79 49 6e 66 6f 20 73 74  d the KeyInfo st
5f30: 72 75 63 74 75 72 65 20 69 73 20 6f 62 74 61 69  ructure is obtai
5f40: 6e 20 66 72 6f 6d 20 6d 61 6c 6c 6f 63 2e 20 20  n from malloc.  
5f50: 54 68 65 20 63 61 6c 6c 69 6e 67 0a 2a 2a 20 66  The calling.** f
5f60: 75 6e 63 74 69 6f 6e 20 69 73 20 72 65 73 70 6f  unction is respo
5f70: 6e 73 69 62 6c 65 20 66 6f 72 20 73 65 65 69 6e  nsible for seein
5f80: 67 20 74 68 61 74 20 74 68 69 73 20 73 74 72 75  g that this stru
5f90: 63 74 75 72 65 20 69 73 20 65 76 65 6e 74 75 61  cture is eventua
5fa0: 6c 6c 79 0a 2a 2a 20 66 72 65 65 64 2e 20 20 41  lly.** freed.  A
5fb0: 64 64 20 74 68 65 20 4b 65 79 49 6e 66 6f 20 73  dd the KeyInfo s
5fc0: 74 72 75 63 74 75 72 65 20 74 6f 20 74 68 65 20  tructure to the 
5fd0: 50 34 20 66 69 65 6c 64 20 6f 66 20 61 6e 20 6f  P4 field of an o
5fe0: 70 63 6f 64 65 20 75 73 69 6e 67 0a 2a 2a 20 50  pcode using.** P
5ff0: 34 5f 4b 45 59 49 4e 46 4f 5f 48 41 4e 44 4f 46  4_KEYINFO_HANDOF
6000: 46 20 69 73 20 74 68 65 20 75 73 75 61 6c 20 77  F is the usual w
6010: 61 79 20 6f 66 20 64 65 61 6c 69 6e 67 20 77 69  ay of dealing wi
6020: 74 68 20 74 68 69 73 2e 0a 2a 2f 0a 73 74 61 74  th this..*/.stat
6030: 69 63 20 4b 65 79 49 6e 66 6f 20 2a 6b 65 79 49  ic KeyInfo *keyI
6040: 6e 66 6f 46 72 6f 6d 45 78 70 72 4c 69 73 74 28  nfoFromExprList(
6050: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 45  Parse *pParse, E
6060: 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 29 7b  xprList *pList){
6070: 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d  .  sqlite3 *db =
6080: 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 69   pParse->db;.  i
6090: 6e 74 20 6e 45 78 70 72 3b 0a 20 20 4b 65 79 49  nt nExpr;.  KeyI
60a0: 6e 66 6f 20 2a 70 49 6e 66 6f 3b 0a 20 20 73 74  nfo *pInfo;.  st
60b0: 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74  ruct ExprList_it
60c0: 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 69 6e 74  em *pItem;.  int
60d0: 20 69 3b 0a 0a 20 20 6e 45 78 70 72 20 3d 20 70   i;..  nExpr = p
60e0: 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 0a 20 20 70  List->nExpr;.  p
60f0: 49 6e 66 6f 20 3d 20 73 71 6c 69 74 65 33 44 62  Info = sqlite3Db
6100: 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 73  MallocZero(db, s
6110: 69 7a 65 6f 66 28 2a 70 49 6e 66 6f 29 20 2b 20  izeof(*pInfo) + 
6120: 6e 45 78 70 72 2a 28 73 69 7a 65 6f 66 28 43 6f  nExpr*(sizeof(Co
6130: 6c 6c 53 65 71 2a 29 2b 31 29 20 29 3b 0a 20 20  llSeq*)+1) );.  
6140: 69 66 28 20 70 49 6e 66 6f 20 29 7b 0a 20 20 20  if( pInfo ){.   
6150: 20 70 49 6e 66 6f 2d 3e 61 53 6f 72 74 4f 72 64   pInfo->aSortOrd
6160: 65 72 20 3d 20 28 75 38 2a 29 26 70 49 6e 66 6f  er = (u8*)&pInfo
6170: 2d 3e 61 43 6f 6c 6c 5b 6e 45 78 70 72 5d 3b 0a  ->aColl[nExpr];.
6180: 20 20 20 20 70 49 6e 66 6f 2d 3e 6e 46 69 65 6c      pInfo->nFiel
6190: 64 20 3d 20 6e 45 78 70 72 3b 0a 20 20 20 20 70  d = nExpr;.    p
61a0: 49 6e 66 6f 2d 3e 65 6e 63 20 3d 20 45 4e 43 28  Info->enc = ENC(
61b0: 64 62 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30  db);.    for(i=0
61c0: 2c 20 70 49 74 65 6d 3d 70 4c 69 73 74 2d 3e 61  , pItem=pList->a
61d0: 3b 20 69 3c 6e 45 78 70 72 3b 20 69 2b 2b 2c 20  ; i<nExpr; i++, 
61e0: 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 20 20  pItem++){.      
61f0: 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 3b 0a  CollSeq *pColl;.
6200: 20 20 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71        pColl = sq
6210: 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c 53 65 71  lite3ExprCollSeq
6220: 28 70 50 61 72 73 65 2c 20 70 49 74 65 6d 2d 3e  (pParse, pItem->
6230: 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20 69 66  pExpr);.      if
6240: 28 20 21 70 43 6f 6c 6c 20 29 7b 0a 20 20 20 20  ( !pColl ){.    
6250: 20 20 20 20 70 43 6f 6c 6c 20 3d 20 64 62 2d 3e      pColl = db->
6260: 70 44 66 6c 74 43 6f 6c 6c 3b 0a 20 20 20 20 20  pDfltColl;.     
6270: 20 7d 0a 20 20 20 20 20 20 70 49 6e 66 6f 2d 3e   }.      pInfo->
6280: 61 43 6f 6c 6c 5b 69 5d 20 3d 20 70 43 6f 6c 6c  aColl[i] = pColl
6290: 3b 0a 20 20 20 20 20 20 70 49 6e 66 6f 2d 3e 61  ;.      pInfo->a
62a0: 53 6f 72 74 4f 72 64 65 72 5b 69 5d 20 3d 20 70  SortOrder[i] = p
62b0: 49 74 65 6d 2d 3e 73 6f 72 74 4f 72 64 65 72 3b  Item->sortOrder;
62c0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
62d0: 75 72 6e 20 70 49 6e 66 6f 3b 0a 7d 0a 0a 0a 2f  urn pInfo;.}.../
62e0: 2a 0a 2a 2a 20 49 66 20 74 68 65 20 69 6e 6e 65  *.** If the inne
62f0: 72 20 6c 6f 6f 70 20 77 61 73 20 67 65 6e 65 72  r loop was gener
6300: 61 74 65 64 20 75 73 69 6e 67 20 61 20 6e 6f 6e  ated using a non
6310: 2d 6e 75 6c 6c 20 70 4f 72 64 65 72 42 79 20 61  -null pOrderBy a
6320: 72 67 75 6d 65 6e 74 2c 0a 2a 2a 20 74 68 65 6e  rgument,.** then
6330: 20 74 68 65 20 72 65 73 75 6c 74 73 20 77 65 72   the results wer
6340: 65 20 70 6c 61 63 65 64 20 69 6e 20 61 20 73 6f  e placed in a so
6350: 72 74 65 72 2e 20 20 41 66 74 65 72 20 74 68 65  rter.  After the
6360: 20 6c 6f 6f 70 20 69 73 20 74 65 72 6d 69 6e 61   loop is termina
6370: 74 65 64 0a 2a 2a 20 77 65 20 6e 65 65 64 20 74  ted.** we need t
6380: 6f 20 72 75 6e 20 74 68 65 20 73 6f 72 74 65 72  o run the sorter
6390: 20 61 6e 64 20 6f 75 74 70 75 74 20 74 68 65 20   and output the 
63a0: 72 65 73 75 6c 74 73 2e 20 20 54 68 65 20 66 6f  results.  The fo
63b0: 6c 6c 6f 77 69 6e 67 0a 2a 2a 20 72 6f 75 74 69  llowing.** routi
63c0: 6e 65 20 67 65 6e 65 72 61 74 65 73 20 74 68 65  ne generates the
63d0: 20 63 6f 64 65 20 6e 65 65 64 65 64 20 74 6f 20   code needed to 
63e0: 64 6f 20 74 68 61 74 2e 0a 2a 2f 0a 73 74 61 74  do that..*/.stat
63f0: 69 63 20 76 6f 69 64 20 67 65 6e 65 72 61 74 65  ic void generate
6400: 53 6f 72 74 54 61 69 6c 28 0a 20 20 50 61 72 73  SortTail(.  Pars
6410: 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 2f 2a  e *pParse,    /*
6420: 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74   Parsing context
6430: 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 2c   */.  Select *p,
6440: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 53          /* The S
6450: 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20  ELECT statement 
6460: 2a 2f 0a 20 20 56 64 62 65 20 2a 76 2c 20 20 20  */.  Vdbe *v,   
6470: 20 20 20 20 20 20 20 2f 2a 20 47 65 6e 65 72 61         /* Genera
6480: 74 65 20 63 6f 64 65 20 69 6e 74 6f 20 74 68 69  te code into thi
6490: 73 20 56 44 42 45 20 2a 2f 0a 20 20 69 6e 74 20  s VDBE */.  int 
64a0: 6e 43 6f 6c 75 6d 6e 2c 20 20 20 20 20 20 2f 2a  nColumn,      /*
64b0: 20 4e 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d   Number of colum
64c0: 6e 73 20 6f 66 20 64 61 74 61 20 2a 2f 0a 20 20  ns of data */.  
64d0: 53 65 6c 65 63 74 44 65 73 74 20 2a 70 44 65 73  SelectDest *pDes
64e0: 74 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20 73  t /* Write the s
64f0: 6f 72 74 65 64 20 72 65 73 75 6c 74 73 20 68 65  orted results he
6500: 72 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 62  re */.){.  int b
6510: 72 6b 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  rk = sqlite3Vdbe
6520: 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20  MakeLabel(v);.  
6530: 69 6e 74 20 63 6f 6e 74 20 3d 20 73 71 6c 69 74  int cont = sqlit
6540: 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28  e3VdbeMakeLabel(
6550: 76 29 3b 0a 20 20 69 6e 74 20 61 64 64 72 3b 0a  v);.  int addr;.
6560: 20 20 69 6e 74 20 69 54 61 62 3b 0a 20 20 69 6e    int iTab;.  in
6570: 74 20 70 73 65 75 64 6f 54 61 62 20 3d 20 30 3b  t pseudoTab = 0;
6580: 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4f 72  .  ExprList *pOr
6590: 64 65 72 42 79 20 3d 20 70 2d 3e 70 4f 72 64 65  derBy = p->pOrde
65a0: 72 42 79 3b 0a 0a 20 20 69 6e 74 20 65 44 65 73  rBy;..  int eDes
65b0: 74 20 3d 20 70 44 65 73 74 2d 3e 65 44 65 73 74  t = pDest->eDest
65c0: 3b 0a 20 20 69 6e 74 20 69 50 61 72 6d 20 3d 20  ;.  int iParm = 
65d0: 70 44 65 73 74 2d 3e 69 50 61 72 6d 3b 0a 0a 20  pDest->iParm;.. 
65e0: 20 69 6e 74 20 72 65 67 52 6f 77 3b 0a 20 20 69   int regRow;.  i
65f0: 6e 74 20 72 65 67 52 6f 77 69 64 3b 0a 0a 20 20  nt regRowid;..  
6600: 69 54 61 62 20 3d 20 70 4f 72 64 65 72 42 79 2d  iTab = pOrderBy-
6610: 3e 69 45 43 75 72 73 6f 72 3b 0a 20 20 69 66 28  >iECursor;.  if(
6620: 20 65 44 65 73 74 3d 3d 53 52 54 5f 43 61 6c 6c   eDest==SRT_Call
6630: 62 61 63 6b 20 7c 7c 20 65 44 65 73 74 3d 3d 53  back || eDest==S
6640: 52 54 5f 43 6f 72 6f 75 74 69 6e 65 20 29 7b 0a  RT_Coroutine ){.
6650: 20 20 20 20 70 73 65 75 64 6f 54 61 62 20 3d 20      pseudoTab = 
6660: 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a  pParse->nTab++;.
6670: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
6680: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 53 65 74 4e  ddOp2(v, OP_SetN
6690: 75 6d 43 6f 6c 75 6d 6e 73 2c 20 30 2c 20 6e 43  umColumns, 0, nC
66a0: 6f 6c 75 6d 6e 29 3b 0a 20 20 20 20 73 71 6c 69  olumn);.    sqli
66b0: 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
66c0: 20 4f 50 5f 4f 70 65 6e 50 73 65 75 64 6f 2c 20   OP_OpenPseudo, 
66d0: 70 73 65 75 64 6f 54 61 62 2c 20 65 44 65 73 74  pseudoTab, eDest
66e0: 3d 3d 53 52 54 5f 43 61 6c 6c 62 61 63 6b 29 3b  ==SRT_Callback);
66f0: 0a 20 20 7d 0a 20 20 61 64 64 72 20 3d 20 31 20  .  }.  addr = 1 
6700: 2b 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  + sqlite3VdbeAdd
6710: 4f 70 32 28 76 2c 20 4f 50 5f 53 6f 72 74 2c 20  Op2(v, OP_Sort, 
6720: 69 54 61 62 2c 20 62 72 6b 29 3b 0a 20 20 63 6f  iTab, brk);.  co
6730: 64 65 4f 66 66 73 65 74 28 76 2c 20 70 2c 20 63  deOffset(v, p, c
6740: 6f 6e 74 29 3b 0a 20 20 72 65 67 52 6f 77 20 3d  ont);.  regRow =
6750: 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52   sqlite3GetTempR
6760: 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20 72 65  eg(pParse);.  re
6770: 67 52 6f 77 69 64 20 3d 20 73 71 6c 69 74 65 33  gRowid = sqlite3
6780: 47 65 74 54 65 6d 70 52 65 67 28 70 50 61 72 73  GetTempReg(pPars
6790: 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  e);.  sqlite3Vdb
67a0: 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f  eAddOp3(v, OP_Co
67b0: 6c 75 6d 6e 2c 20 69 54 61 62 2c 20 70 4f 72 64  lumn, iTab, pOrd
67c0: 65 72 42 79 2d 3e 6e 45 78 70 72 20 2b 20 31 2c  erBy->nExpr + 1,
67d0: 20 72 65 67 52 6f 77 29 3b 0a 20 20 73 77 69 74   regRow);.  swit
67e0: 63 68 28 20 65 44 65 73 74 20 29 7b 0a 20 20 20  ch( eDest ){.   
67f0: 20 63 61 73 65 20 53 52 54 5f 54 61 62 6c 65 3a   case SRT_Table:
6800: 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f 45 70  .    case SRT_Ep
6810: 68 65 6d 54 61 62 3a 20 7b 0a 20 20 20 20 20 20  hemTab: {.      
6820: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
6830: 32 28 76 2c 20 4f 50 5f 4e 65 77 52 6f 77 69 64  2(v, OP_NewRowid
6840: 2c 20 69 50 61 72 6d 2c 20 72 65 67 52 6f 77 69  , iParm, regRowi
6850: 64 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  d);.      sqlite
6860: 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
6870: 50 5f 49 6e 73 65 72 74 2c 20 69 50 61 72 6d 2c  P_Insert, iParm,
6880: 20 72 65 67 52 6f 77 2c 20 72 65 67 52 6f 77 69   regRow, regRowi
6890: 64 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  d);.      sqlite
68a0: 33 56 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c  3VdbeChangeP5(v,
68b0: 20 4f 50 46 4c 41 47 5f 41 50 50 45 4e 44 29 3b   OPFLAG_APPEND);
68c0: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
68d0: 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49    }.#ifndef SQLI
68e0: 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59  TE_OMIT_SUBQUERY
68f0: 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f 53 65  .    case SRT_Se
6900: 74 3a 20 7b 0a 20 20 20 20 20 20 61 73 73 65 72  t: {.      asser
6910: 74 28 20 6e 43 6f 6c 75 6d 6e 3d 3d 31 20 29 3b  t( nColumn==1 );
6920: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
6930: 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 4d  beAddOp4(v, OP_M
6940: 61 6b 65 52 65 63 6f 72 64 2c 20 72 65 67 52 6f  akeRecord, regRo
6950: 77 2c 20 31 2c 20 72 65 67 52 6f 77 69 64 2c 20  w, 1, regRowid, 
6960: 26 70 2d 3e 61 66 66 69 6e 69 74 79 2c 20 31 29  &p->affinity, 1)
6970: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  ;.      sqlite3E
6980: 78 70 72 43 61 63 68 65 41 66 66 69 6e 69 74 79  xprCacheAffinity
6990: 43 68 61 6e 67 65 28 70 50 61 72 73 65 2c 20 72  Change(pParse, r
69a0: 65 67 52 6f 77 2c 20 31 29 3b 0a 20 20 20 20 20  egRow, 1);.     
69b0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
69c0: 70 32 28 76 2c 20 4f 50 5f 49 64 78 49 6e 73 65  p2(v, OP_IdxInse
69d0: 72 74 2c 20 69 50 61 72 6d 2c 20 72 65 67 52 6f  rt, iParm, regRo
69e0: 77 69 64 29 3b 0a 20 20 20 20 20 20 62 72 65 61  wid);.      brea
69f0: 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  k;.    }.    cas
6a00: 65 20 53 52 54 5f 4d 65 6d 3a 20 7b 0a 20 20 20  e SRT_Mem: {.   
6a10: 20 20 20 61 73 73 65 72 74 28 20 6e 43 6f 6c 75     assert( nColu
6a20: 6d 6e 3d 3d 31 20 29 3b 0a 20 20 20 20 20 20 73  mn==1 );.      s
6a30: 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 4d 6f  qlite3ExprCodeMo
6a40: 76 65 28 70 50 61 72 73 65 2c 20 72 65 67 52 6f  ve(pParse, regRo
6a50: 77 2c 20 69 50 61 72 6d 2c 20 31 29 3b 0a 20 20  w, iParm, 1);.  
6a60: 20 20 20 20 2f 2a 20 54 68 65 20 4c 49 4d 49 54      /* The LIMIT
6a70: 20 63 6c 61 75 73 65 20 77 69 6c 6c 20 74 65 72   clause will ter
6a80: 6d 69 6e 61 74 65 20 74 68 65 20 6c 6f 6f 70 20  minate the loop 
6a90: 66 6f 72 20 75 73 20 2a 2f 0a 20 20 20 20 20 20  for us */.      
6aa0: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e  break;.    }.#en
6ab0: 64 69 66 0a 20 20 20 20 63 61 73 65 20 53 52 54  dif.    case SRT
6ac0: 5f 43 61 6c 6c 62 61 63 6b 3a 0a 20 20 20 20 63  _Callback:.    c
6ad0: 61 73 65 20 53 52 54 5f 43 6f 72 6f 75 74 69 6e  ase SRT_Coroutin
6ae0: 65 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 69  e: {.      int i
6af0: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
6b00: 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
6b10: 49 6e 74 65 67 65 72 2c 20 31 2c 20 72 65 67 52  Integer, 1, regR
6b20: 6f 77 69 64 29 3b 0a 20 20 20 20 20 20 73 71 6c  owid);.      sql
6b30: 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
6b40: 2c 20 4f 50 5f 49 6e 73 65 72 74 2c 20 70 73 65  , OP_Insert, pse
6b50: 75 64 6f 54 61 62 2c 20 72 65 67 52 6f 77 2c 20  udoTab, regRow, 
6b60: 72 65 67 52 6f 77 69 64 29 3b 0a 20 20 20 20 20  regRowid);.     
6b70: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 6f 6c   for(i=0; i<nCol
6b80: 75 6d 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  umn; i++){.     
6b90: 20 20 20 61 73 73 65 72 74 28 20 72 65 67 52 6f     assert( regRo
6ba0: 77 21 3d 70 44 65 73 74 2d 3e 69 4d 65 6d 2b 69  w!=pDest->iMem+i
6bb0: 20 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   );.        sqli
6bc0: 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
6bd0: 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 70 73 65 75   OP_Column, pseu
6be0: 64 6f 54 61 62 2c 20 69 2c 20 70 44 65 73 74 2d  doTab, i, pDest-
6bf0: 3e 69 4d 65 6d 2b 69 29 3b 0a 20 20 20 20 20 20  >iMem+i);.      
6c00: 7d 0a 20 20 20 20 20 20 69 66 28 20 65 44 65 73  }.      if( eDes
6c10: 74 3d 3d 53 52 54 5f 43 61 6c 6c 62 61 63 6b 20  t==SRT_Callback 
6c20: 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
6c30: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
6c40: 4f 50 5f 52 65 73 75 6c 74 52 6f 77 2c 20 70 44  OP_ResultRow, pD
6c50: 65 73 74 2d 3e 69 4d 65 6d 2c 20 6e 43 6f 6c 75  est->iMem, nColu
6c60: 6d 6e 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  mn);.        sql
6c70: 69 74 65 33 45 78 70 72 43 61 63 68 65 41 66 66  ite3ExprCacheAff
6c80: 69 6e 69 74 79 43 68 61 6e 67 65 28 70 50 61 72  inityChange(pPar
6c90: 73 65 2c 20 70 44 65 73 74 2d 3e 69 4d 65 6d 2c  se, pDest->iMem,
6ca0: 20 6e 43 6f 6c 75 6d 6e 29 3b 0a 20 20 20 20 20   nColumn);.     
6cb0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
6cc0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
6cd0: 31 28 76 2c 20 4f 50 5f 59 69 65 6c 64 2c 20 70  1(v, OP_Yield, p
6ce0: 44 65 73 74 2d 3e 69 50 61 72 6d 29 3b 0a 20 20  Dest->iParm);.  
6cf0: 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61      }.      brea
6d00: 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 64 65 66  k;.    }.    def
6d10: 61 75 6c 74 3a 20 7b 0a 20 20 20 20 20 20 2f 2a  ault: {.      /*
6d20: 20 44 6f 20 6e 6f 74 68 69 6e 67 20 2a 2f 0a 20   Do nothing */. 
6d30: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
6d40: 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 52  }.  }.  sqlite3R
6d50: 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50  eleaseTempReg(pP
6d60: 61 72 73 65 2c 20 72 65 67 52 6f 77 29 3b 0a 20  arse, regRow);. 
6d70: 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54   sqlite3ReleaseT
6d80: 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72  empReg(pParse, r
6d90: 65 67 52 6f 77 69 64 29 3b 0a 0a 20 20 2f 2a 20  egRowid);..  /* 
6da0: 4c 49 4d 49 54 20 68 61 73 20 62 65 65 6e 20 69  LIMIT has been i
6db0: 6d 70 6c 65 6d 65 6e 74 65 64 20 62 79 20 74 68  mplemented by th
6dc0: 65 20 70 75 73 68 4f 6e 74 6f 53 6f 72 74 65 72  e pushOntoSorter
6dd0: 28 29 20 72 6f 75 74 69 6e 65 2e 0a 20 20 2a 2f  () routine..  */
6de0: 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 69 4c  .  assert( p->iL
6df0: 69 6d 69 74 3d 3d 30 20 29 3b 0a 0a 20 20 2f 2a  imit==0 );..  /*
6e00: 20 54 68 65 20 62 6f 74 74 6f 6d 20 6f 66 20 74   The bottom of t
6e10: 68 65 20 6c 6f 6f 70 0a 20 20 2a 2f 0a 20 20 73  he loop.  */.  s
6e20: 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76  qlite3VdbeResolv
6e30: 65 4c 61 62 65 6c 28 76 2c 20 63 6f 6e 74 29 3b  eLabel(v, cont);
6e40: 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  .  sqlite3VdbeAd
6e50: 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 65 78 74 2c  dOp2(v, OP_Next,
6e60: 20 69 54 61 62 2c 20 61 64 64 72 29 3b 0a 20 20   iTab, addr);.  
6e70: 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c  sqlite3VdbeResol
6e80: 76 65 4c 61 62 65 6c 28 76 2c 20 62 72 6b 29 3b  veLabel(v, brk);
6e90: 0a 20 20 69 66 28 20 65 44 65 73 74 3d 3d 53 52  .  if( eDest==SR
6ea0: 54 5f 43 61 6c 6c 62 61 63 6b 20 7c 7c 20 65 44  T_Callback || eD
6eb0: 65 73 74 3d 3d 53 52 54 5f 43 6f 72 6f 75 74 69  est==SRT_Corouti
6ec0: 6e 65 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  ne ){.    sqlite
6ed0: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
6ee0: 50 5f 43 6c 6f 73 65 2c 20 70 73 65 75 64 6f 54  P_Close, pseudoT
6ef0: 61 62 2c 20 30 29 3b 0a 20 20 7d 0a 0a 7d 0a 0a  ab, 0);.  }..}..
6f00: 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 70  /*.** Return a p
6f10: 6f 69 6e 74 65 72 20 74 6f 20 61 20 73 74 72 69  ointer to a stri
6f20: 6e 67 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68  ng containing th
6f30: 65 20 27 64 65 63 6c 61 72 61 74 69 6f 6e 20 74  e 'declaration t
6f40: 79 70 65 27 20 6f 66 20 74 68 65 0a 2a 2a 20 65  ype' of the.** e
6f50: 78 70 72 65 73 73 69 6f 6e 20 70 45 78 70 72 2e  xpression pExpr.
6f60: 20 54 68 65 20 73 74 72 69 6e 67 20 6d 61 79 20   The string may 
6f70: 62 65 20 74 72 65 61 74 65 64 20 61 73 20 73 74  be treated as st
6f80: 61 74 69 63 20 62 79 20 74 68 65 20 63 61 6c 6c  atic by the call
6f90: 65 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 64 65  er..**.** The de
6fa0: 63 6c 61 72 61 74 69 6f 6e 20 74 79 70 65 20 69  claration type i
6fb0: 73 20 74 68 65 20 65 78 61 63 74 20 64 61 74 61  s the exact data
6fc0: 74 79 70 65 20 64 65 66 69 6e 69 74 69 6f 6e 20  type definition 
6fd0: 65 78 74 72 61 63 74 65 64 20 66 72 6f 6d 20 74  extracted from t
6fe0: 68 65 0a 2a 2a 20 6f 72 69 67 69 6e 61 6c 20 43  he.** original C
6ff0: 52 45 41 54 45 20 54 41 42 4c 45 20 73 74 61 74  REATE TABLE stat
7000: 65 6d 65 6e 74 20 69 66 20 74 68 65 20 65 78 70  ement if the exp
7010: 72 65 73 73 69 6f 6e 20 69 73 20 61 20 63 6f 6c  ression is a col
7020: 75 6d 6e 2e 20 54 68 65 0a 2a 2a 20 64 65 63 6c  umn. The.** decl
7030: 61 72 61 74 69 6f 6e 20 74 79 70 65 20 66 6f 72  aration type for
7040: 20 61 20 52 4f 57 49 44 20 66 69 65 6c 64 20 69   a ROWID field i
7050: 73 20 49 4e 54 45 47 45 52 2e 20 45 78 61 63 74  s INTEGER. Exact
7060: 6c 79 20 77 68 65 6e 20 61 6e 20 65 78 70 72 65  ly when an expre
7070: 73 73 69 6f 6e 0a 2a 2a 20 69 73 20 63 6f 6e 73  ssion.** is cons
7080: 69 64 65 72 65 64 20 61 20 63 6f 6c 75 6d 6e 20  idered a column 
7090: 63 61 6e 20 62 65 20 63 6f 6d 70 6c 65 78 20 69  can be complex i
70a0: 6e 20 74 68 65 20 70 72 65 73 65 6e 63 65 20 6f  n the presence o
70b0: 66 20 73 75 62 71 75 65 72 69 65 73 2e 20 54 68  f subqueries. Th
70c0: 65 0a 2a 2a 20 72 65 73 75 6c 74 2d 73 65 74 20  e.** result-set 
70d0: 65 78 70 72 65 73 73 69 6f 6e 20 69 6e 20 61 6c  expression in al
70e0: 6c 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69  l of the followi
70f0: 6e 67 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d  ng SELECT statem
7100: 65 6e 74 73 20 69 73 20 0a 2a 2a 20 63 6f 6e 73  ents is .** cons
7110: 69 64 65 72 65 64 20 61 20 63 6f 6c 75 6d 6e 20  idered a column 
7120: 62 79 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  by this function
7130: 2e 0a 2a 2a 0a 2a 2a 20 20 20 53 45 4c 45 43 54  ..**.**   SELECT
7140: 20 63 6f 6c 20 46 52 4f 4d 20 74 62 6c 3b 0a 2a   col FROM tbl;.*
7150: 2a 20 20 20 53 45 4c 45 43 54 20 28 53 45 4c 45  *   SELECT (SELE
7160: 43 54 20 63 6f 6c 20 46 52 4f 4d 20 74 62 6c 3b  CT col FROM tbl;
7170: 0a 2a 2a 20 20 20 53 45 4c 45 43 54 20 28 53 45  .**   SELECT (SE
7180: 4c 45 43 54 20 63 6f 6c 20 46 52 4f 4d 20 74 62  LECT col FROM tb
7190: 6c 29 3b 0a 2a 2a 20 20 20 53 45 4c 45 43 54 20  l);.**   SELECT 
71a0: 61 62 63 20 46 52 4f 4d 20 28 53 45 4c 45 43 54  abc FROM (SELECT
71b0: 20 63 6f 6c 20 41 53 20 61 62 63 20 46 52 4f 4d   col AS abc FROM
71c0: 20 74 62 6c 29 3b 0a 2a 2a 20 0a 2a 2a 20 54 68   tbl);.** .** Th
71d0: 65 20 64 65 63 6c 61 72 61 74 69 6f 6e 20 74 79  e declaration ty
71e0: 70 65 20 66 6f 72 20 61 6e 79 20 65 78 70 72 65  pe for any expre
71f0: 73 73 69 6f 6e 20 6f 74 68 65 72 20 74 68 61 6e  ssion other than
7200: 20 61 20 63 6f 6c 75 6d 6e 20 69 73 20 4e 55 4c   a column is NUL
7210: 4c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e  L..*/.static con
7220: 73 74 20 63 68 61 72 20 2a 63 6f 6c 75 6d 6e 54  st char *columnT
7230: 79 70 65 28 0a 20 20 4e 61 6d 65 43 6f 6e 74 65  ype(.  NameConte
7240: 78 74 20 2a 70 4e 43 2c 20 0a 20 20 45 78 70 72  xt *pNC, .  Expr
7250: 20 2a 70 45 78 70 72 2c 0a 20 20 63 6f 6e 73 74   *pExpr,.  const
7260: 20 63 68 61 72 20 2a 2a 70 7a 4f 72 69 67 69 6e   char **pzOrigin
7270: 44 62 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  Db,.  const char
7280: 20 2a 2a 70 7a 4f 72 69 67 69 6e 54 61 62 2c 0a   **pzOriginTab,.
7290: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 2a 70    const char **p
72a0: 7a 4f 72 69 67 69 6e 43 6f 6c 0a 29 7b 0a 20 20  zOriginCol.){.  
72b0: 63 68 61 72 20 63 6f 6e 73 74 20 2a 7a 54 79 70  char const *zTyp
72c0: 65 20 3d 20 30 3b 0a 20 20 63 68 61 72 20 63 6f  e = 0;.  char co
72d0: 6e 73 74 20 2a 7a 4f 72 69 67 69 6e 44 62 20 3d  nst *zOriginDb =
72e0: 20 30 3b 0a 20 20 63 68 61 72 20 63 6f 6e 73 74   0;.  char const
72f0: 20 2a 7a 4f 72 69 67 69 6e 54 61 62 20 3d 20 30   *zOriginTab = 0
7300: 3b 0a 20 20 63 68 61 72 20 63 6f 6e 73 74 20 2a  ;.  char const *
7310: 7a 4f 72 69 67 69 6e 43 6f 6c 20 3d 20 30 3b 0a  zOriginCol = 0;.
7320: 20 20 69 6e 74 20 6a 3b 0a 20 20 69 66 28 20 70    int j;.  if( p
7330: 45 78 70 72 3d 3d 30 20 7c 7c 20 70 4e 43 2d 3e  Expr==0 || pNC->
7340: 70 53 72 63 4c 69 73 74 3d 3d 30 20 29 20 72 65  pSrcList==0 ) re
7350: 74 75 72 6e 20 30 3b 0a 0a 20 20 73 77 69 74 63  turn 0;..  switc
7360: 68 28 20 70 45 78 70 72 2d 3e 6f 70 20 29 7b 0a  h( pExpr->op ){.
7370: 20 20 20 20 63 61 73 65 20 54 4b 5f 41 47 47 5f      case TK_AGG_
7380: 43 4f 4c 55 4d 4e 3a 0a 20 20 20 20 63 61 73 65  COLUMN:.    case
7390: 20 54 4b 5f 43 4f 4c 55 4d 4e 3a 20 7b 0a 20 20   TK_COLUMN: {.  
73a0: 20 20 20 20 2f 2a 20 54 68 65 20 65 78 70 72 65      /* The expre
73b0: 73 73 69 6f 6e 20 69 73 20 61 20 63 6f 6c 75 6d  ssion is a colum
73c0: 6e 2e 20 4c 6f 63 61 74 65 20 74 68 65 20 74 61  n. Locate the ta
73d0: 62 6c 65 20 74 68 65 20 63 6f 6c 75 6d 6e 20 69  ble the column i
73e0: 73 20 62 65 69 6e 67 0a 20 20 20 20 20 20 2a 2a  s being.      **
73f0: 20 65 78 74 72 61 63 74 65 64 20 66 72 6f 6d 20   extracted from 
7400: 69 6e 20 4e 61 6d 65 43 6f 6e 74 65 78 74 2e 70  in NameContext.p
7410: 53 72 63 4c 69 73 74 2e 20 54 68 69 73 20 74 61  SrcList. This ta
7420: 62 6c 65 20 6d 61 79 20 62 65 20 72 65 61 6c 0a  ble may be real.
7430: 20 20 20 20 20 20 2a 2a 20 64 61 74 61 62 61 73        ** databas
7440: 65 20 74 61 62 6c 65 20 6f 72 20 61 20 73 75 62  e table or a sub
7450: 71 75 65 72 79 2e 0a 20 20 20 20 20 20 2a 2f 0a  query..      */.
7460: 20 20 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61        Table *pTa
7470: 62 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  b = 0;          
7480: 20 20 2f 2a 20 54 61 62 6c 65 20 73 74 72 75 63    /* Table struc
7490: 74 75 72 65 20 63 6f 6c 75 6d 6e 20 69 73 20 65  ture column is e
74a0: 78 74 72 61 63 74 65 64 20 66 72 6f 6d 20 2a 2f  xtracted from */
74b0: 0a 20 20 20 20 20 20 53 65 6c 65 63 74 20 2a 70  .      Select *p
74c0: 53 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  S = 0;          
74d0: 20 20 20 2f 2a 20 53 65 6c 65 63 74 20 74 68 65     /* Select the
74e0: 20 63 6f 6c 75 6d 6e 20 69 73 20 65 78 74 72 61   column is extra
74f0: 63 74 65 64 20 66 72 6f 6d 20 2a 2f 0a 20 20 20  cted from */.   
7500: 20 20 20 69 6e 74 20 69 43 6f 6c 20 3d 20 70 45     int iCol = pE
7510: 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3b 20 20 2f  xpr->iColumn;  /
7520: 2a 20 49 6e 64 65 78 20 6f 66 20 63 6f 6c 75 6d  * Index of colum
7530: 6e 20 69 6e 20 70 54 61 62 20 2a 2f 0a 20 20 20  n in pTab */.   
7540: 20 20 20 77 68 69 6c 65 28 20 70 4e 43 20 26 26     while( pNC &&
7550: 20 21 70 54 61 62 20 29 7b 0a 20 20 20 20 20 20   !pTab ){.      
7560: 20 20 53 72 63 4c 69 73 74 20 2a 70 54 61 62 4c    SrcList *pTabL
7570: 69 73 74 20 3d 20 70 4e 43 2d 3e 70 53 72 63 4c  ist = pNC->pSrcL
7580: 69 73 74 3b 0a 20 20 20 20 20 20 20 20 66 6f 72  ist;.        for
7590: 28 6a 3d 30 3b 6a 3c 70 54 61 62 4c 69 73 74 2d  (j=0;j<pTabList-
75a0: 3e 6e 53 72 63 20 26 26 20 70 54 61 62 4c 69 73  >nSrc && pTabLis
75b0: 74 2d 3e 61 5b 6a 5d 2e 69 43 75 72 73 6f 72 21  t->a[j].iCursor!
75c0: 3d 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 3b 6a  =pExpr->iTable;j
75d0: 2b 2b 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  ++);.        if(
75e0: 20 6a 3c 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72   j<pTabList->nSr
75f0: 63 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70  c ){.          p
7600: 54 61 62 20 3d 20 70 54 61 62 4c 69 73 74 2d 3e  Tab = pTabList->
7610: 61 5b 6a 5d 2e 70 54 61 62 3b 0a 20 20 20 20 20  a[j].pTab;.     
7620: 20 20 20 20 20 70 53 20 3d 20 70 54 61 62 4c 69       pS = pTabLi
7630: 73 74 2d 3e 61 5b 6a 5d 2e 70 53 65 6c 65 63 74  st->a[j].pSelect
7640: 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  ;.        }else{
7650: 0a 20 20 20 20 20 20 20 20 20 20 70 4e 43 20 3d  .          pNC =
7660: 20 70 4e 43 2d 3e 70 4e 65 78 74 3b 0a 20 20 20   pNC->pNext;.   
7670: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 0a       }.      }..
7680: 20 20 20 20 20 20 69 66 28 20 70 54 61 62 3d 3d        if( pTab==
7690: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  0 ){.        /* 
76a0: 46 49 58 20 4d 45 3a 0a 20 20 20 20 20 20 20 20  FIX ME:.        
76b0: 2a 2a 20 54 68 69 73 20 63 61 6e 20 6f 63 63 75  ** This can occu
76c0: 72 73 20 69 66 20 79 6f 75 20 68 61 76 65 20 73  rs if you have s
76d0: 6f 6d 65 74 68 69 6e 67 20 6c 69 6b 65 20 22 53  omething like "S
76e0: 45 4c 45 43 54 20 6e 65 77 2e 78 3b 22 20 69 6e  ELECT new.x;" in
76f0: 73 69 64 65 0a 20 20 20 20 20 20 20 20 2a 2a 20  side.        ** 
7700: 61 20 74 72 69 67 67 65 72 2e 20 20 49 6e 20 6f  a trigger.  In o
7710: 74 68 65 72 20 77 6f 72 64 73 2c 20 69 66 20 79  ther words, if y
7720: 6f 75 20 72 65 66 65 72 65 6e 63 65 20 74 68 65  ou reference the
7730: 20 73 70 65 63 69 61 6c 20 22 6e 65 77 22 0a 20   special "new". 
7740: 20 20 20 20 20 20 20 2a 2a 20 74 61 62 6c 65 20         ** table 
7750: 69 6e 20 74 68 65 20 72 65 73 75 6c 74 20 73 65  in the result se
7760: 74 20 6f 66 20 61 20 73 65 6c 65 63 74 2e 20 20  t of a select.  
7770: 57 65 20 64 6f 20 6e 6f 74 20 68 61 76 65 20 61  We do not have a
7780: 20 67 6f 6f 64 20 77 61 79 0a 20 20 20 20 20 20   good way.      
7790: 20 20 2a 2a 20 74 6f 20 66 69 6e 64 20 74 68 65    ** to find the
77a0: 20 61 63 74 75 61 6c 20 74 61 62 6c 65 20 74 79   actual table ty
77b0: 70 65 2c 20 73 6f 20 63 61 6c 6c 20 69 74 20 22  pe, so call it "
77c0: 54 45 58 54 22 2e 20 20 54 68 69 73 20 69 73 20  TEXT".  This is 
77d0: 72 65 61 6c 6c 79 0a 20 20 20 20 20 20 20 20 2a  really.        *
77e0: 2a 20 73 6f 6d 65 74 68 69 6e 67 20 6f 66 20 61  * something of a
77f0: 20 62 75 67 2c 20 62 75 74 20 49 20 64 6f 20 6e   bug, but I do n
7800: 6f 74 20 6b 6e 6f 77 20 68 6f 77 20 74 6f 20 66  ot know how to f
7810: 69 78 20 69 74 2e 0a 20 20 20 20 20 20 20 20 2a  ix it..        *
7820: 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 54 68 69  *.        ** Thi
7830: 73 20 63 6f 64 65 20 64 6f 65 73 20 6e 6f 74 20  s code does not 
7840: 70 72 6f 64 75 63 65 20 74 68 65 20 63 6f 72 72  produce the corr
7850: 65 63 74 20 61 6e 73 77 65 72 20 2d 20 69 74 20  ect answer - it 
7860: 6a 75 73 74 20 70 72 65 76 65 6e 74 73 0a 20 20  just prevents.  
7870: 20 20 20 20 20 20 2a 2a 20 61 20 73 65 67 66 61        ** a segfa
7880: 75 6c 74 2e 20 20 53 65 65 20 74 69 63 6b 65 74  ult.  See ticket
7890: 20 23 31 32 32 39 2e 0a 20 20 20 20 20 20 20 20   #1229..        
78a0: 2a 2f 0a 20 20 20 20 20 20 20 20 7a 54 79 70 65  */.        zType
78b0: 20 3d 20 22 54 45 58 54 22 3b 0a 20 20 20 20 20   = "TEXT";.     
78c0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
78d0: 7d 0a 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  }..      assert(
78e0: 20 70 54 61 62 20 29 3b 0a 20 20 20 20 20 20 69   pTab );.      i
78f0: 66 28 20 70 53 20 29 7b 0a 20 20 20 20 20 20 20  f( pS ){.       
7900: 20 2f 2a 20 54 68 65 20 22 74 61 62 6c 65 22 20   /* The "table" 
7910: 69 73 20 61 63 74 75 61 6c 6c 79 20 61 20 73 75  is actually a su
7920: 62 2d 73 65 6c 65 63 74 20 6f 72 20 61 20 76 69  b-select or a vi
7930: 65 77 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63  ew in the FROM c
7940: 6c 61 75 73 65 0a 20 20 20 20 20 20 20 20 2a 2a  lause.        **
7950: 20 6f 66 20 74 68 65 20 53 45 4c 45 43 54 20 73   of the SELECT s
7960: 74 61 74 65 6d 65 6e 74 2e 20 52 65 74 75 72 6e  tatement. Return
7970: 20 74 68 65 20 64 65 63 6c 61 72 61 74 69 6f 6e   the declaration
7980: 20 74 79 70 65 20 61 6e 64 20 6f 72 69 67 69 6e   type and origin
7990: 0a 20 20 20 20 20 20 20 20 2a 2a 20 64 61 74 61  .        ** data
79a0: 20 66 6f 72 20 74 68 65 20 72 65 73 75 6c 74 2d   for the result-
79b0: 73 65 74 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 68  set column of th
79c0: 65 20 73 75 62 2d 73 65 6c 65 63 74 2e 0a 20 20  e sub-select..  
79d0: 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
79e0: 20 69 66 28 20 69 43 6f 6c 3e 3d 30 20 26 26 20   if( iCol>=0 && 
79f0: 69 43 6f 6c 3c 70 53 2d 3e 70 45 4c 69 73 74 2d  iCol<pS->pEList-
7a00: 3e 6e 45 78 70 72 20 29 7b 0a 20 20 20 20 20 20  >nExpr ){.      
7a10: 20 20 20 20 2f 2a 20 49 66 20 69 43 6f 6c 20 69      /* If iCol i
7a20: 73 20 6c 65 73 73 20 74 68 61 6e 20 7a 65 72 6f  s less than zero
7a30: 2c 20 74 68 65 6e 20 74 68 65 20 65 78 70 72 65  , then the expre
7a40: 73 73 69 6f 6e 20 72 65 71 75 65 73 74 73 20 74  ssion requests t
7a50: 68 65 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  he.          ** 
7a60: 72 6f 77 69 64 20 6f 66 20 74 68 65 20 73 75 62  rowid of the sub
7a70: 2d 73 65 6c 65 63 74 20 6f 72 20 76 69 65 77 2e  -select or view.
7a80: 20 54 68 69 73 20 65 78 70 72 65 73 73 69 6f 6e   This expression
7a90: 20 69 73 20 6c 65 67 61 6c 20 28 73 65 65 20 0a   is legal (see .
7aa0: 20 20 20 20 20 20 20 20 20 20 2a 2a 20 74 65 73            ** tes
7ab0: 74 20 63 61 73 65 20 6d 69 73 63 32 2e 32 2e 32  t case misc2.2.2
7ac0: 29 20 2d 20 69 74 20 61 6c 77 61 79 73 20 65 76  ) - it always ev
7ad0: 61 6c 75 61 74 65 73 20 74 6f 20 4e 55 4c 4c 2e  aluates to NULL.
7ae0: 0a 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  .          */.  
7af0: 20 20 20 20 20 20 20 20 4e 61 6d 65 43 6f 6e 74          NameCont
7b00: 65 78 74 20 73 4e 43 3b 0a 20 20 20 20 20 20 20  ext sNC;.       
7b10: 20 20 20 45 78 70 72 20 2a 70 20 3d 20 70 53 2d     Expr *p = pS-
7b20: 3e 70 45 4c 69 73 74 2d 3e 61 5b 69 43 6f 6c 5d  >pEList->a[iCol]
7b30: 2e 70 45 78 70 72 3b 0a 20 20 20 20 20 20 20 20  .pExpr;.        
7b40: 20 20 73 4e 43 2e 70 53 72 63 4c 69 73 74 20 3d    sNC.pSrcList =
7b50: 20 70 53 2d 3e 70 53 72 63 3b 0a 20 20 20 20 20   pS->pSrc;.     
7b60: 20 20 20 20 20 73 4e 43 2e 70 4e 65 78 74 20 3d       sNC.pNext =
7b70: 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 73 4e   0;.          sN
7b80: 43 2e 70 50 61 72 73 65 20 3d 20 70 4e 43 2d 3e  C.pParse = pNC->
7b90: 70 50 61 72 73 65 3b 0a 20 20 20 20 20 20 20 20  pParse;.        
7ba0: 20 20 7a 54 79 70 65 20 3d 20 63 6f 6c 75 6d 6e    zType = column
7bb0: 54 79 70 65 28 26 73 4e 43 2c 20 70 2c 20 26 7a  Type(&sNC, p, &z
7bc0: 4f 72 69 67 69 6e 44 62 2c 20 26 7a 4f 72 69 67  OriginDb, &zOrig
7bd0: 69 6e 54 61 62 2c 20 26 7a 4f 72 69 67 69 6e 43  inTab, &zOriginC
7be0: 6f 6c 29 3b 20 0a 20 20 20 20 20 20 20 20 7d 0a  ol); .        }.
7bf0: 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
7c00: 70 54 61 62 2d 3e 70 53 63 68 65 6d 61 20 29 7b  pTab->pSchema ){
7c10: 0a 20 20 20 20 20 20 20 20 2f 2a 20 41 20 72 65  .        /* A re
7c20: 61 6c 20 74 61 62 6c 65 20 2a 2f 0a 20 20 20 20  al table */.    
7c30: 20 20 20 20 61 73 73 65 72 74 28 20 21 70 53 20      assert( !pS 
7c40: 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 69  );.        if( i
7c50: 43 6f 6c 3c 30 20 29 20 69 43 6f 6c 20 3d 20 70  Col<0 ) iCol = p
7c60: 54 61 62 2d 3e 69 50 4b 65 79 3b 0a 20 20 20 20  Tab->iPKey;.    
7c70: 20 20 20 20 61 73 73 65 72 74 28 20 69 43 6f 6c      assert( iCol
7c80: 3d 3d 2d 31 20 7c 7c 20 28 69 43 6f 6c 3e 3d 30  ==-1 || (iCol>=0
7c90: 20 26 26 20 69 43 6f 6c 3c 70 54 61 62 2d 3e 6e   && iCol<pTab->n
7ca0: 43 6f 6c 29 20 29 3b 0a 20 20 20 20 20 20 20 20  Col) );.        
7cb0: 69 66 28 20 69 43 6f 6c 3c 30 20 29 7b 0a 20 20  if( iCol<0 ){.  
7cc0: 20 20 20 20 20 20 20 20 7a 54 79 70 65 20 3d 20          zType = 
7cd0: 22 49 4e 54 45 47 45 52 22 3b 0a 20 20 20 20 20  "INTEGER";.     
7ce0: 20 20 20 20 20 7a 4f 72 69 67 69 6e 43 6f 6c 20       zOriginCol 
7cf0: 3d 20 22 72 6f 77 69 64 22 3b 0a 20 20 20 20 20  = "rowid";.     
7d00: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
7d10: 20 20 20 20 7a 54 79 70 65 20 3d 20 70 54 61 62      zType = pTab
7d20: 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 7a 54 79  ->aCol[iCol].zTy
7d30: 70 65 3b 0a 20 20 20 20 20 20 20 20 20 20 7a 4f  pe;.          zO
7d40: 72 69 67 69 6e 43 6f 6c 20 3d 20 70 54 61 62 2d  riginCol = pTab-
7d50: 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 7a 4e 61 6d  >aCol[iCol].zNam
7d60: 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  e;.        }.   
7d70: 20 20 20 20 20 7a 4f 72 69 67 69 6e 54 61 62 20       zOriginTab 
7d80: 3d 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 3b 0a 20  = pTab->zName;. 
7d90: 20 20 20 20 20 20 20 69 66 28 20 70 4e 43 2d 3e         if( pNC->
7da0: 70 50 61 72 73 65 20 29 7b 0a 20 20 20 20 20 20  pParse ){.      
7db0: 20 20 20 20 69 6e 74 20 69 44 62 20 3d 20 73 71      int iDb = sq
7dc0: 6c 69 74 65 33 53 63 68 65 6d 61 54 6f 49 6e 64  lite3SchemaToInd
7dd0: 65 78 28 70 4e 43 2d 3e 70 50 61 72 73 65 2d 3e  ex(pNC->pParse->
7de0: 64 62 2c 20 70 54 61 62 2d 3e 70 53 63 68 65 6d  db, pTab->pSchem
7df0: 61 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7a 4f  a);.          zO
7e00: 72 69 67 69 6e 44 62 20 3d 20 70 4e 43 2d 3e 70  riginDb = pNC->p
7e10: 50 61 72 73 65 2d 3e 64 62 2d 3e 61 44 62 5b 69  Parse->db->aDb[i
7e20: 44 62 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20  Db].zName;.     
7e30: 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
7e40: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
7e50: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
7e60: 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 20 20 20  MIT_SUBQUERY.   
7e70: 20 63 61 73 65 20 54 4b 5f 53 45 4c 45 43 54 3a   case TK_SELECT:
7e80: 20 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20   {.      /* The 
7e90: 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 61 20  expression is a 
7ea0: 73 75 62 2d 73 65 6c 65 63 74 2e 20 52 65 74 75  sub-select. Retu
7eb0: 72 6e 20 74 68 65 20 64 65 63 6c 61 72 61 74 69  rn the declarati
7ec0: 6f 6e 20 74 79 70 65 20 61 6e 64 0a 20 20 20 20  on type and.    
7ed0: 20 20 2a 2a 20 6f 72 69 67 69 6e 20 69 6e 66 6f    ** origin info
7ee0: 20 66 6f 72 20 74 68 65 20 73 69 6e 67 6c 65 20   for the single 
7ef0: 63 6f 6c 75 6d 6e 20 69 6e 20 74 68 65 20 72 65  column in the re
7f00: 73 75 6c 74 20 73 65 74 20 6f 66 20 74 68 65 20  sult set of the 
7f10: 53 45 4c 45 43 54 0a 20 20 20 20 20 20 2a 2a 20  SELECT.      ** 
7f20: 73 74 61 74 65 6d 65 6e 74 2e 0a 20 20 20 20 20  statement..     
7f30: 20 2a 2f 0a 20 20 20 20 20 20 4e 61 6d 65 43 6f   */.      NameCo
7f40: 6e 74 65 78 74 20 73 4e 43 3b 0a 20 20 20 20 20  ntext sNC;.     
7f50: 20 53 65 6c 65 63 74 20 2a 70 53 20 3d 20 70 45   Select *pS = pE
7f60: 78 70 72 2d 3e 70 53 65 6c 65 63 74 3b 0a 20 20  xpr->pSelect;.  
7f70: 20 20 20 20 45 78 70 72 20 2a 70 20 3d 20 70 53      Expr *p = pS
7f80: 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70  ->pEList->a[0].p
7f90: 45 78 70 72 3b 0a 20 20 20 20 20 20 73 4e 43 2e  Expr;.      sNC.
7fa0: 70 53 72 63 4c 69 73 74 20 3d 20 70 53 2d 3e 70  pSrcList = pS->p
7fb0: 53 72 63 3b 0a 20 20 20 20 20 20 73 4e 43 2e 70  Src;.      sNC.p
7fc0: 4e 65 78 74 20 3d 20 70 4e 43 3b 0a 20 20 20 20  Next = pNC;.    
7fd0: 20 20 73 4e 43 2e 70 50 61 72 73 65 20 3d 20 70    sNC.pParse = p
7fe0: 4e 43 2d 3e 70 50 61 72 73 65 3b 0a 20 20 20 20  NC->pParse;.    
7ff0: 20 20 7a 54 79 70 65 20 3d 20 63 6f 6c 75 6d 6e    zType = column
8000: 54 79 70 65 28 26 73 4e 43 2c 20 70 2c 20 26 7a  Type(&sNC, p, &z
8010: 4f 72 69 67 69 6e 44 62 2c 20 26 7a 4f 72 69 67  OriginDb, &zOrig
8020: 69 6e 54 61 62 2c 20 26 7a 4f 72 69 67 69 6e 43  inTab, &zOriginC
8030: 6f 6c 29 3b 20 0a 20 20 20 20 20 20 62 72 65 61  ol); .      brea
8040: 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  k;.    }.#endif.
8050: 20 20 7d 0a 20 20 0a 20 20 69 66 28 20 70 7a 4f    }.  .  if( pzO
8060: 72 69 67 69 6e 44 62 20 29 7b 0a 20 20 20 20 61  riginDb ){.    a
8070: 73 73 65 72 74 28 20 70 7a 4f 72 69 67 69 6e 54  ssert( pzOriginT
8080: 61 62 20 26 26 20 70 7a 4f 72 69 67 69 6e 43 6f  ab && pzOriginCo
8090: 6c 20 29 3b 0a 20 20 20 20 2a 70 7a 4f 72 69 67  l );.    *pzOrig
80a0: 69 6e 44 62 20 3d 20 7a 4f 72 69 67 69 6e 44 62  inDb = zOriginDb
80b0: 3b 0a 20 20 20 20 2a 70 7a 4f 72 69 67 69 6e 54  ;.    *pzOriginT
80c0: 61 62 20 3d 20 7a 4f 72 69 67 69 6e 54 61 62 3b  ab = zOriginTab;
80d0: 0a 20 20 20 20 2a 70 7a 4f 72 69 67 69 6e 43 6f  .    *pzOriginCo
80e0: 6c 20 3d 20 7a 4f 72 69 67 69 6e 43 6f 6c 3b 0a  l = zOriginCol;.
80f0: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 7a 54 79    }.  return zTy
8100: 70 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e  pe;.}../*.** Gen
8110: 65 72 61 74 65 20 63 6f 64 65 20 74 68 61 74 20  erate code that 
8120: 77 69 6c 6c 20 74 65 6c 6c 20 74 68 65 20 56 44  will tell the VD
8130: 42 45 20 74 68 65 20 64 65 63 6c 61 72 61 74 69  BE the declarati
8140: 6f 6e 20 74 79 70 65 73 20 6f 66 20 63 6f 6c 75  on types of colu
8150: 6d 6e 73 0a 2a 2a 20 69 6e 20 74 68 65 20 72 65  mns.** in the re
8160: 73 75 6c 74 20 73 65 74 2e 0a 2a 2f 0a 73 74 61  sult set..*/.sta
8170: 74 69 63 20 76 6f 69 64 20 67 65 6e 65 72 61 74  tic void generat
8180: 65 43 6f 6c 75 6d 6e 54 79 70 65 73 28 0a 20 20  eColumnTypes(.  
8190: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
81a0: 20 20 20 20 2f 2a 20 50 61 72 73 65 72 20 63 6f      /* Parser co
81b0: 6e 74 65 78 74 20 2a 2f 0a 20 20 53 72 63 4c 69  ntext */.  SrcLi
81c0: 73 74 20 2a 70 54 61 62 4c 69 73 74 2c 20 20 2f  st *pTabList,  /
81d0: 2a 20 4c 69 73 74 20 6f 66 20 74 61 62 6c 65 73  * List of tables
81e0: 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a   */.  ExprList *
81f0: 70 45 4c 69 73 74 20 20 20 20 2f 2a 20 45 78 70  pEList    /* Exp
8200: 72 65 73 73 69 6f 6e 73 20 64 65 66 69 6e 69 6e  ressions definin
8210: 67 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74  g the result set
8220: 20 2a 2f 0a 29 7b 0a 23 69 66 6e 64 65 66 20 53   */.){.#ifndef S
8230: 51 4c 49 54 45 5f 4f 4d 49 54 5f 44 45 43 4c 54  QLITE_OMIT_DECLT
8240: 59 50 45 0a 20 20 56 64 62 65 20 2a 76 20 3d 20  YPE.  Vdbe *v = 
8250: 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20  pParse->pVdbe;. 
8260: 20 69 6e 74 20 69 3b 0a 20 20 4e 61 6d 65 43 6f   int i;.  NameCo
8270: 6e 74 65 78 74 20 73 4e 43 3b 0a 20 20 73 4e 43  ntext sNC;.  sNC
8280: 2e 70 53 72 63 4c 69 73 74 20 3d 20 70 54 61 62  .pSrcList = pTab
8290: 4c 69 73 74 3b 0a 20 20 73 4e 43 2e 70 50 61 72  List;.  sNC.pPar
82a0: 73 65 20 3d 20 70 50 61 72 73 65 3b 0a 20 20 66  se = pParse;.  f
82b0: 6f 72 28 69 3d 30 3b 20 69 3c 70 45 4c 69 73 74  or(i=0; i<pEList
82c0: 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20  ->nExpr; i++){. 
82d0: 20 20 20 45 78 70 72 20 2a 70 20 3d 20 70 45 4c     Expr *p = pEL
82e0: 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 3b  ist->a[i].pExpr;
82f0: 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20  .    const char 
8300: 2a 7a 54 79 70 65 3b 0a 23 69 66 64 65 66 20 53  *zType;.#ifdef S
8310: 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 43 4f 4c  QLITE_ENABLE_COL
8320: 55 4d 4e 5f 4d 45 54 41 44 41 54 41 0a 20 20 20  UMN_METADATA.   
8330: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4f 72   const char *zOr
8340: 69 67 44 62 20 3d 20 30 3b 0a 20 20 20 20 63 6f  igDb = 0;.    co
8350: 6e 73 74 20 63 68 61 72 20 2a 7a 4f 72 69 67 54  nst char *zOrigT
8360: 61 62 20 3d 20 30 3b 0a 20 20 20 20 63 6f 6e 73  ab = 0;.    cons
8370: 74 20 63 68 61 72 20 2a 7a 4f 72 69 67 43 6f 6c  t char *zOrigCol
8380: 20 3d 20 30 3b 0a 20 20 20 20 7a 54 79 70 65 20   = 0;.    zType 
8390: 3d 20 63 6f 6c 75 6d 6e 54 79 70 65 28 26 73 4e  = columnType(&sN
83a0: 43 2c 20 70 2c 20 26 7a 4f 72 69 67 44 62 2c 20  C, p, &zOrigDb, 
83b0: 26 7a 4f 72 69 67 54 61 62 2c 20 26 7a 4f 72 69  &zOrigTab, &zOri
83c0: 67 43 6f 6c 29 3b 0a 0a 20 20 20 20 2f 2a 20 54  gCol);..    /* T
83d0: 68 65 20 76 64 62 65 20 6d 75 73 74 20 6d 61 6b  he vdbe must mak
83e0: 65 20 69 74 73 20 6f 77 6e 20 63 6f 70 79 20 6f  e its own copy o
83f0: 66 20 74 68 65 20 63 6f 6c 75 6d 6e 2d 74 79 70  f the column-typ
8400: 65 20 61 6e 64 20 6f 74 68 65 72 20 0a 20 20 20  e and other .   
8410: 20 2a 2a 20 63 6f 6c 75 6d 6e 20 73 70 65 63 69   ** column speci
8420: 66 69 63 20 73 74 72 69 6e 67 73 2c 20 69 6e 20  fic strings, in 
8430: 63 61 73 65 20 74 68 65 20 73 63 68 65 6d 61 20  case the schema 
8440: 69 73 20 72 65 73 65 74 20 62 65 66 6f 72 65 20  is reset before 
8450: 74 68 69 73 0a 20 20 20 20 2a 2a 20 76 69 72 74  this.    ** virt
8460: 75 61 6c 20 6d 61 63 68 69 6e 65 20 69 73 20 64  ual machine is d
8470: 65 6c 65 74 65 64 2e 0a 20 20 20 20 2a 2f 0a 20  eleted..    */. 
8480: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 53 65     sqlite3VdbeSe
8490: 74 43 6f 6c 4e 61 6d 65 28 76 2c 20 69 2c 20 43  tColName(v, i, C
84a0: 4f 4c 4e 41 4d 45 5f 44 41 54 41 42 41 53 45 2c  OLNAME_DATABASE,
84b0: 20 7a 4f 72 69 67 44 62 2c 20 50 34 5f 54 52 41   zOrigDb, P4_TRA
84c0: 4e 53 49 45 4e 54 29 3b 0a 20 20 20 20 73 71 6c  NSIENT);.    sql
84d0: 69 74 65 33 56 64 62 65 53 65 74 43 6f 6c 4e 61  ite3VdbeSetColNa
84e0: 6d 65 28 76 2c 20 69 2c 20 43 4f 4c 4e 41 4d 45  me(v, i, COLNAME
84f0: 5f 54 41 42 4c 45 2c 20 7a 4f 72 69 67 54 61 62  _TABLE, zOrigTab
8500: 2c 20 50 34 5f 54 52 41 4e 53 49 45 4e 54 29 3b  , P4_TRANSIENT);
8510: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
8520: 53 65 74 43 6f 6c 4e 61 6d 65 28 76 2c 20 69 2c  SetColName(v, i,
8530: 20 43 4f 4c 4e 41 4d 45 5f 43 4f 4c 55 4d 4e 2c   COLNAME_COLUMN,
8540: 20 7a 4f 72 69 67 43 6f 6c 2c 20 50 34 5f 54 52   zOrigCol, P4_TR
8550: 41 4e 53 49 45 4e 54 29 3b 0a 23 65 6c 73 65 0a  ANSIENT);.#else.
8560: 20 20 20 20 7a 54 79 70 65 20 3d 20 63 6f 6c 75      zType = colu
8570: 6d 6e 54 79 70 65 28 26 73 4e 43 2c 20 70 2c 20  mnType(&sNC, p, 
8580: 30 2c 20 30 2c 20 30 29 3b 0a 23 65 6e 64 69 66  0, 0, 0);.#endif
8590: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
85a0: 53 65 74 43 6f 6c 4e 61 6d 65 28 76 2c 20 69 2c  SetColName(v, i,
85b0: 20 43 4f 4c 4e 41 4d 45 5f 44 45 43 4c 54 59 50   COLNAME_DECLTYP
85c0: 45 2c 20 7a 54 79 70 65 2c 20 50 34 5f 54 52 41  E, zType, P4_TRA
85d0: 4e 53 49 45 4e 54 29 3b 0a 20 20 7d 0a 23 65 6e  NSIENT);.  }.#en
85e0: 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d  dif /* SQLITE_OM
85f0: 49 54 5f 44 45 43 4c 54 59 50 45 20 2a 2f 0a 7d  IT_DECLTYPE */.}
8600: 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65  ../*.** Generate
8610: 20 63 6f 64 65 20 74 68 61 74 20 77 69 6c 6c 20   code that will 
8620: 74 65 6c 6c 20 74 68 65 20 56 44 42 45 20 74 68  tell the VDBE th
8630: 65 20 6e 61 6d 65 73 20 6f 66 20 63 6f 6c 75 6d  e names of colum
8640: 6e 73 0a 2a 2a 20 69 6e 20 74 68 65 20 72 65 73  ns.** in the res
8650: 75 6c 74 20 73 65 74 2e 20 20 54 68 69 73 20 69  ult set.  This i
8660: 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 73 20 75 73  nformation is us
8670: 65 64 20 74 6f 20 70 72 6f 76 69 64 65 20 74 68  ed to provide th
8680: 65 0a 2a 2a 20 61 7a 43 6f 6c 5b 5d 20 76 61 6c  e.** azCol[] val
8690: 75 65 73 20 69 6e 20 74 68 65 20 63 61 6c 6c 62  ues in the callb
86a0: 61 63 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ack..*/.static v
86b0: 6f 69 64 20 67 65 6e 65 72 61 74 65 43 6f 6c 75  oid generateColu
86c0: 6d 6e 4e 61 6d 65 73 28 0a 20 20 50 61 72 73 65  mnNames(.  Parse
86d0: 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 2f   *pParse,      /
86e0: 2a 20 50 61 72 73 65 72 20 63 6f 6e 74 65 78 74  * Parser context
86f0: 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a 70   */.  SrcList *p
8700: 54 61 62 4c 69 73 74 2c 20 20 2f 2a 20 4c 69 73  TabList,  /* Lis
8710: 74 20 6f 66 20 74 61 62 6c 65 73 20 2a 2f 0a 20  t of tables */. 
8720: 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73   ExprList *pELis
8730: 74 20 20 20 20 2f 2a 20 45 78 70 72 65 73 73 69  t    /* Expressi
8740: 6f 6e 73 20 64 65 66 69 6e 69 6e 67 20 74 68 65  ons defining the
8750: 20 72 65 73 75 6c 74 20 73 65 74 20 2a 2f 0a 29   result set */.)
8760: 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50  {.  Vdbe *v = pP
8770: 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69  arse->pVdbe;.  i
8780: 6e 74 20 69 2c 20 6a 3b 0a 20 20 73 71 6c 69 74  nt i, j;.  sqlit
8790: 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d  e3 *db = pParse-
87a0: 3e 64 62 3b 0a 20 20 69 6e 74 20 66 75 6c 6c 4e  >db;.  int fullN
87b0: 61 6d 65 73 2c 20 73 68 6f 72 74 4e 61 6d 65 73  ames, shortNames
87c0: 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  ;..#ifndef SQLIT
87d0: 45 5f 4f 4d 49 54 5f 45 58 50 4c 41 49 4e 0a 20  E_OMIT_EXPLAIN. 
87e0: 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20 61   /* If this is a
87f0: 6e 20 45 58 50 4c 41 49 4e 2c 20 73 6b 69 70 20  n EXPLAIN, skip 
8800: 74 68 69 73 20 73 74 65 70 20 2a 2f 0a 20 20 69  this step */.  i
8810: 66 28 20 70 50 61 72 73 65 2d 3e 65 78 70 6c 61  f( pParse->expla
8820: 69 6e 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  in ){.    return
8830: 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20  ;.  }.#endif..  
8840: 61 73 73 65 72 74 28 20 76 21 3d 30 20 29 3b 0a  assert( v!=0 );.
8850: 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 63 6f    if( pParse->co
8860: 6c 4e 61 6d 65 73 53 65 74 20 7c 7c 20 76 3d 3d  lNamesSet || v==
8870: 30 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46  0 || db->mallocF
8880: 61 69 6c 65 64 20 29 20 72 65 74 75 72 6e 3b 0a  ailed ) return;.
8890: 20 20 70 50 61 72 73 65 2d 3e 63 6f 6c 4e 61 6d    pParse->colNam
88a0: 65 73 53 65 74 20 3d 20 31 3b 0a 20 20 66 75 6c  esSet = 1;.  ful
88b0: 6c 4e 61 6d 65 73 20 3d 20 28 64 62 2d 3e 66 6c  lNames = (db->fl
88c0: 61 67 73 20 26 20 53 51 4c 49 54 45 5f 46 75 6c  ags & SQLITE_Ful
88d0: 6c 43 6f 6c 4e 61 6d 65 73 29 21 3d 30 3b 0a 20  lColNames)!=0;. 
88e0: 20 73 68 6f 72 74 4e 61 6d 65 73 20 3d 20 28 64   shortNames = (d
88f0: 62 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49 54  b->flags & SQLIT
8900: 45 5f 53 68 6f 72 74 43 6f 6c 4e 61 6d 65 73 29  E_ShortColNames)
8910: 21 3d 30 3b 0a 20 20 73 71 6c 69 74 65 33 56 64  !=0;.  sqlite3Vd
8920: 62 65 53 65 74 4e 75 6d 43 6f 6c 73 28 76 2c 20  beSetNumCols(v, 
8930: 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 29 3b 0a  pEList->nExpr);.
8940: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 45 4c    for(i=0; i<pEL
8950: 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29  ist->nExpr; i++)
8960: 7b 0a 20 20 20 20 45 78 70 72 20 2a 70 3b 0a 20  {.    Expr *p;. 
8970: 20 20 20 70 20 3d 20 70 45 4c 69 73 74 2d 3e 61     p = pEList->a
8980: 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 69  [i].pExpr;.    i
8990: 66 28 20 70 3d 3d 30 20 29 20 63 6f 6e 74 69 6e  f( p==0 ) contin
89a0: 75 65 3b 0a 20 20 20 20 69 66 28 20 70 45 4c 69  ue;.    if( pELi
89b0: 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 20 29  st->a[i].zName )
89c0: 7b 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a 4e  {.      char *zN
89d0: 61 6d 65 20 3d 20 70 45 4c 69 73 74 2d 3e 61 5b  ame = pEList->a[
89e0: 69 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20  i].zName;.      
89f0: 73 71 6c 69 74 65 33 56 64 62 65 53 65 74 43 6f  sqlite3VdbeSetCo
8a00: 6c 4e 61 6d 65 28 76 2c 20 69 2c 20 43 4f 4c 4e  lName(v, i, COLN
8a10: 41 4d 45 5f 4e 41 4d 45 2c 20 7a 4e 61 6d 65 2c  AME_NAME, zName,
8a20: 20 73 74 72 6c 65 6e 28 7a 4e 61 6d 65 29 29 3b   strlen(zName));
8a30: 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70  .    }else if( p
8a40: 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20  ->op==TK_COLUMN 
8a50: 26 26 20 70 54 61 62 4c 69 73 74 20 29 7b 0a 20  && pTabList ){. 
8a60: 20 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62       Table *pTab
8a70: 3b 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a 43  ;.      char *zC
8a80: 6f 6c 3b 0a 20 20 20 20 20 20 69 6e 74 20 69 43  ol;.      int iC
8a90: 6f 6c 20 3d 20 70 2d 3e 69 43 6f 6c 75 6d 6e 3b  ol = p->iColumn;
8aa0: 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20  .      for(j=0; 
8ab0: 6a 3c 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63  j<pTabList->nSrc
8ac0: 20 26 26 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b   && pTabList->a[
8ad0: 6a 5d 2e 69 43 75 72 73 6f 72 21 3d 70 2d 3e 69  j].iCursor!=p->i
8ae0: 54 61 62 6c 65 3b 20 6a 2b 2b 29 7b 7d 0a 20 20  Table; j++){}.  
8af0: 20 20 20 20 61 73 73 65 72 74 28 20 6a 3c 70 54      assert( j<pT
8b00: 61 62 4c 69 73 74 2d 3e 6e 53 72 63 20 29 3b 0a  abList->nSrc );.
8b10: 20 20 20 20 20 20 70 54 61 62 20 3d 20 70 54 61        pTab = pTa
8b20: 62 4c 69 73 74 2d 3e 61 5b 6a 5d 2e 70 54 61 62  bList->a[j].pTab
8b30: 3b 0a 20 20 20 20 20 20 69 66 28 20 69 43 6f 6c  ;.      if( iCol
8b40: 3c 30 20 29 20 69 43 6f 6c 20 3d 20 70 54 61 62  <0 ) iCol = pTab
8b50: 2d 3e 69 50 4b 65 79 3b 0a 20 20 20 20 20 20 61  ->iPKey;.      a
8b60: 73 73 65 72 74 28 20 69 43 6f 6c 3d 3d 2d 31 20  ssert( iCol==-1 
8b70: 7c 7c 20 28 69 43 6f 6c 3e 3d 30 20 26 26 20 69  || (iCol>=0 && i
8b80: 43 6f 6c 3c 70 54 61 62 2d 3e 6e 43 6f 6c 29 20  Col<pTab->nCol) 
8b90: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 69 43 6f  );.      if( iCo
8ba0: 6c 3c 30 20 29 7b 0a 20 20 20 20 20 20 20 20 7a  l<0 ){.        z
8bb0: 43 6f 6c 20 3d 20 22 72 6f 77 69 64 22 3b 0a 20  Col = "rowid";. 
8bc0: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
8bd0: 20 20 20 20 7a 43 6f 6c 20 3d 20 70 54 61 62 2d      zCol = pTab-
8be0: 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 7a 4e 61 6d  >aCol[iCol].zNam
8bf0: 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  e;.      }.     
8c00: 20 69 66 28 20 21 73 68 6f 72 74 4e 61 6d 65 73   if( !shortNames
8c10: 20 26 26 20 21 66 75 6c 6c 4e 61 6d 65 73 20 29   && !fullNames )
8c20: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
8c30: 33 56 64 62 65 53 65 74 43 6f 6c 4e 61 6d 65 28  3VdbeSetColName(
8c40: 76 2c 20 69 2c 20 43 4f 4c 4e 41 4d 45 5f 4e 41  v, i, COLNAME_NA
8c50: 4d 45 2c 20 28 63 68 61 72 2a 29 70 2d 3e 73 70  ME, (char*)p->sp
8c60: 61 6e 2e 7a 2c 20 70 2d 3e 73 70 61 6e 2e 6e 29  an.z, p->span.n)
8c70: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66  ;.      }else if
8c80: 28 20 66 75 6c 6c 4e 61 6d 65 73 20 7c 7c 20 28  ( fullNames || (
8c90: 21 73 68 6f 72 74 4e 61 6d 65 73 20 26 26 20 70  !shortNames && p
8ca0: 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3e 31 29  TabList->nSrc>1)
8cb0: 20 29 7b 0a 20 20 20 20 20 20 20 20 63 68 61 72   ){.        char
8cc0: 20 2a 7a 4e 61 6d 65 20 3d 20 30 3b 0a 20 20 20   *zName = 0;.   
8cd0: 20 20 20 20 20 63 68 61 72 20 2a 7a 54 61 62 3b       char *zTab;
8ce0: 0a 20 0a 20 20 20 20 20 20 20 20 7a 54 61 62 20  . .        zTab 
8cf0: 3d 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 6a 5d  = pTabList->a[j]
8d00: 2e 7a 41 6c 69 61 73 3b 0a 20 20 20 20 20 20 20  .zAlias;.       
8d10: 20 69 66 28 20 66 75 6c 6c 4e 61 6d 65 73 20 7c   if( fullNames |
8d20: 7c 20 7a 54 61 62 3d 3d 30 20 29 20 7a 54 61 62  | zTab==0 ) zTab
8d30: 20 3d 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 3b 0a   = pTab->zName;.
8d40: 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20          zName = 
8d50: 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 64  sqlite3MPrintf(d
8d60: 62 2c 20 22 25 73 2e 25 73 22 2c 20 7a 54 61 62  b, "%s.%s", zTab
8d70: 2c 20 7a 43 6f 6c 29 3b 0a 20 20 20 20 20 20 20  , zCol);.       
8d80: 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 74 43   sqlite3VdbeSetC
8d90: 6f 6c 4e 61 6d 65 28 76 2c 20 69 2c 20 43 4f 4c  olName(v, i, COL
8da0: 4e 41 4d 45 5f 4e 41 4d 45 2c 20 7a 4e 61 6d 65  NAME_NAME, zName
8db0: 2c 20 50 34 5f 44 59 4e 41 4d 49 43 29 3b 0a 20  , P4_DYNAMIC);. 
8dc0: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
8dd0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 53      sqlite3VdbeS
8de0: 65 74 43 6f 6c 4e 61 6d 65 28 76 2c 20 69 2c 20  etColName(v, i, 
8df0: 43 4f 4c 4e 41 4d 45 5f 4e 41 4d 45 2c 20 7a 43  COLNAME_NAME, zC
8e00: 6f 6c 2c 20 73 74 72 6c 65 6e 28 7a 43 6f 6c 29  ol, strlen(zCol)
8e10: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
8e20: 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69  else{.      sqli
8e30: 74 65 33 56 64 62 65 53 65 74 43 6f 6c 4e 61 6d  te3VdbeSetColNam
8e40: 65 28 76 2c 20 69 2c 20 43 4f 4c 4e 41 4d 45 5f  e(v, i, COLNAME_
8e50: 4e 41 4d 45 2c 20 28 63 68 61 72 2a 29 70 2d 3e  NAME, (char*)p->
8e60: 73 70 61 6e 2e 7a 2c 20 70 2d 3e 73 70 61 6e 2e  span.z, p->span.
8e70: 6e 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  n);.    }.  }.  
8e80: 67 65 6e 65 72 61 74 65 43 6f 6c 75 6d 6e 54 79  generateColumnTy
8e90: 70 65 73 28 70 50 61 72 73 65 2c 20 70 54 61 62  pes(pParse, pTab
8ea0: 4c 69 73 74 2c 20 70 45 4c 69 73 74 29 3b 0a 7d  List, pEList);.}
8eb0: 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
8ec0: 5f 4f 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53  _OMIT_COMPOUND_S
8ed0: 45 4c 45 43 54 0a 2f 2a 0a 2a 2a 20 4e 61 6d 65  ELECT./*.** Name
8ee0: 20 6f 66 20 74 68 65 20 63 6f 6e 6e 65 63 74 69   of the connecti
8ef0: 6f 6e 20 6f 70 65 72 61 74 6f 72 2c 20 75 73 65  on operator, use
8f00: 64 20 66 6f 72 20 65 72 72 6f 72 20 6d 65 73 73  d for error mess
8f10: 61 67 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ages..*/.static 
8f20: 63 6f 6e 73 74 20 63 68 61 72 20 2a 73 65 6c 65  const char *sele
8f30: 63 74 4f 70 4e 61 6d 65 28 69 6e 74 20 69 64 29  ctOpName(int id)
8f40: 7b 0a 20 20 63 68 61 72 20 2a 7a 3b 0a 20 20 73  {.  char *z;.  s
8f50: 77 69 74 63 68 28 20 69 64 20 29 7b 0a 20 20 20  witch( id ){.   
8f60: 20 63 61 73 65 20 54 4b 5f 41 4c 4c 3a 20 20 20   case TK_ALL:   
8f70: 20 20 20 20 7a 20 3d 20 22 55 4e 49 4f 4e 20 41      z = "UNION A
8f80: 4c 4c 22 3b 20 20 20 62 72 65 61 6b 3b 0a 20 20  LL";   break;.  
8f90: 20 20 63 61 73 65 20 54 4b 5f 49 4e 54 45 52 53    case TK_INTERS
8fa0: 45 43 54 3a 20 7a 20 3d 20 22 49 4e 54 45 52 53  ECT: z = "INTERS
8fb0: 45 43 54 22 3b 20 20 20 62 72 65 61 6b 3b 0a 20  ECT";   break;. 
8fc0: 20 20 20 63 61 73 65 20 54 4b 5f 45 58 43 45 50     case TK_EXCEP
8fd0: 54 3a 20 20 20 20 7a 20 3d 20 22 45 58 43 45 50  T:    z = "EXCEP
8fe0: 54 22 3b 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  T";      break;.
8ff0: 20 20 20 20 64 65 66 61 75 6c 74 3a 20 20 20 20      default:    
9000: 20 20 20 20 20 20 20 7a 20 3d 20 22 55 4e 49 4f         z = "UNIO
9010: 4e 22 3b 20 20 20 20 20 20 20 62 72 65 61 6b 3b  N";       break;
9020: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 7a 3b  .  }.  return z;
9030: 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c  .}.#endif /* SQL
9040: 49 54 45 5f 4f 4d 49 54 5f 43 4f 4d 50 4f 55 4e  ITE_OMIT_COMPOUN
9050: 44 5f 53 45 4c 45 43 54 20 2a 2f 0a 0a 2f 2a 0a  D_SELECT */../*.
9060: 2a 2a 20 46 6f 72 77 61 72 64 20 64 65 63 6c 61  ** Forward decla
9070: 72 61 74 69 6f 6e 0a 2a 2f 0a 73 74 61 74 69 63  ration.*/.static
9080: 20 69 6e 74 20 70 72 65 70 53 65 6c 65 63 74 53   int prepSelectS
9090: 74 6d 74 28 50 61 72 73 65 2a 2c 20 53 65 6c 65  tmt(Parse*, Sele
90a0: 63 74 2a 29 3b 0a 0a 2f 2a 0a 2a 2a 20 47 69 76  ct*);../*.** Giv
90b0: 65 6e 20 61 20 53 45 4c 45 43 54 20 73 74 61 74  en a SELECT stat
90c0: 65 6d 65 6e 74 2c 20 67 65 6e 65 72 61 74 65 20  ement, generate 
90d0: 61 20 54 61 62 6c 65 20 73 74 72 75 63 74 75 72  a Table structur
90e0: 65 20 74 68 61 74 20 64 65 73 63 72 69 62 65 73  e that describes
90f0: 0a 2a 2a 20 74 68 65 20 72 65 73 75 6c 74 20 73  .** the result s
9100: 65 74 20 6f 66 20 74 68 61 74 20 53 45 4c 45 43  et of that SELEC
9110: 54 2e 0a 2a 2f 0a 54 61 62 6c 65 20 2a 73 71 6c  T..*/.Table *sql
9120: 69 74 65 33 52 65 73 75 6c 74 53 65 74 4f 66 53  ite3ResultSetOfS
9130: 65 6c 65 63 74 28 50 61 72 73 65 20 2a 70 50 61  elect(Parse *pPa
9140: 72 73 65 2c 20 63 68 61 72 20 2a 7a 54 61 62 4e  rse, char *zTabN
9150: 61 6d 65 2c 20 53 65 6c 65 63 74 20 2a 70 53 65  ame, Select *pSe
9160: 6c 65 63 74 29 7b 0a 20 20 54 61 62 6c 65 20 2a  lect){.  Table *
9170: 70 54 61 62 3b 0a 20 20 69 6e 74 20 69 2c 20 6a  pTab;.  int i, j
9180: 2c 20 72 63 3b 0a 20 20 45 78 70 72 4c 69 73 74  , rc;.  ExprList
9190: 20 2a 70 45 4c 69 73 74 3b 0a 20 20 43 6f 6c 75   *pEList;.  Colu
91a0: 6d 6e 20 2a 61 43 6f 6c 2c 20 2a 70 43 6f 6c 3b  mn *aCol, *pCol;
91b0: 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d  .  sqlite3 *db =
91c0: 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 69   pParse->db;.  i
91d0: 6e 74 20 73 61 76 65 64 46 6c 61 67 73 3b 0a 0a  nt savedFlags;..
91e0: 20 20 73 61 76 65 64 46 6c 61 67 73 20 3d 20 64    savedFlags = d
91f0: 62 2d 3e 66 6c 61 67 73 3b 0a 20 20 64 62 2d 3e  b->flags;.  db->
9200: 66 6c 61 67 73 20 26 3d 20 7e 53 51 4c 49 54 45  flags &= ~SQLITE
9210: 5f 46 75 6c 6c 43 6f 6c 4e 61 6d 65 73 3b 0a 20  _FullColNames;. 
9220: 20 64 62 2d 3e 66 6c 61 67 73 20 7c 3d 20 53 51   db->flags |= SQ
9230: 4c 49 54 45 5f 53 68 6f 72 74 43 6f 6c 4e 61 6d  LITE_ShortColNam
9240: 65 73 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74  es;.  rc = sqlit
9250: 65 33 53 65 6c 65 63 74 52 65 73 6f 6c 76 65 28  e3SelectResolve(
9260: 70 50 61 72 73 65 2c 20 70 53 65 6c 65 63 74 2c  pParse, pSelect,
9270: 20 30 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53   0);.  if( rc==S
9280: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
9290: 77 68 69 6c 65 28 20 70 53 65 6c 65 63 74 2d 3e  while( pSelect->
92a0: 70 50 72 69 6f 72 20 29 20 70 53 65 6c 65 63 74  pPrior ) pSelect
92b0: 20 3d 20 70 53 65 6c 65 63 74 2d 3e 70 50 72 69   = pSelect->pPri
92c0: 6f 72 3b 0a 20 20 20 20 72 63 20 3d 20 70 72 65  or;.    rc = pre
92d0: 70 53 65 6c 65 63 74 53 74 6d 74 28 70 50 61 72  pSelectStmt(pPar
92e0: 73 65 2c 20 70 53 65 6c 65 63 74 29 3b 0a 20 20  se, pSelect);.  
92f0: 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
9300: 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 63 20  _OK ){.      rc 
9310: 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 52  = sqlite3SelectR
9320: 65 73 6f 6c 76 65 28 70 50 61 72 73 65 2c 20 70  esolve(pParse, p
9330: 53 65 6c 65 63 74 2c 20 30 29 3b 0a 20 20 20 20  Select, 0);.    
9340: 7d 0a 20 20 7d 0a 20 20 64 62 2d 3e 66 6c 61 67  }.  }.  db->flag
9350: 73 20 3d 20 73 61 76 65 64 46 6c 61 67 73 3b 0a  s = savedFlags;.
9360: 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20    if( rc ){.    
9370: 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20  return 0;.  }.  
9380: 70 54 61 62 20 3d 20 73 71 6c 69 74 65 33 44 62  pTab = sqlite3Db
9390: 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 73  MallocZero(db, s
93a0: 69 7a 65 6f 66 28 54 61 62 6c 65 29 20 29 3b 0a  izeof(Table) );.
93b0: 20 20 69 66 28 20 70 54 61 62 3d 3d 30 20 29 7b    if( pTab==0 ){
93c0: 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20  .    return 0;. 
93d0: 20 7d 0a 20 20 70 54 61 62 2d 3e 6e 52 65 66 20   }.  pTab->nRef 
93e0: 3d 20 31 3b 0a 20 20 70 54 61 62 2d 3e 7a 4e 61  = 1;.  pTab->zNa
93f0: 6d 65 20 3d 20 7a 54 61 62 4e 61 6d 65 20 3f 20  me = zTabName ? 
9400: 73 71 6c 69 74 65 33 44 62 53 74 72 44 75 70 28  sqlite3DbStrDup(
9410: 64 62 2c 20 7a 54 61 62 4e 61 6d 65 29 20 3a 20  db, zTabName) : 
9420: 30 3b 0a 20 20 70 45 4c 69 73 74 20 3d 20 70 53  0;.  pEList = pS
9430: 65 6c 65 63 74 2d 3e 70 45 4c 69 73 74 3b 0a 20  elect->pEList;. 
9440: 20 70 54 61 62 2d 3e 6e 43 6f 6c 20 3d 20 70 45   pTab->nCol = pE
9450: 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 0a 20 20 61  List->nExpr;.  a
9460: 73 73 65 72 74 28 20 70 54 61 62 2d 3e 6e 43 6f  ssert( pTab->nCo
9470: 6c 3e 30 20 29 3b 0a 20 20 70 54 61 62 2d 3e 61  l>0 );.  pTab->a
9480: 43 6f 6c 20 3d 20 61 43 6f 6c 20 3d 20 73 71 6c  Col = aCol = sql
9490: 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f  ite3DbMallocZero
94a0: 28 64 62 2c 20 73 69 7a 65 6f 66 28 70 54 61 62  (db, sizeof(pTab
94b0: 2d 3e 61 43 6f 6c 5b 30 5d 29 2a 70 54 61 62 2d  ->aCol[0])*pTab-
94c0: 3e 6e 43 6f 6c 29 3b 0a 20 20 66 6f 72 28 69 3d  >nCol);.  for(i=
94d0: 30 2c 20 70 43 6f 6c 3d 61 43 6f 6c 3b 20 69 3c  0, pCol=aCol; i<
94e0: 70 54 61 62 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b 2c  pTab->nCol; i++,
94f0: 20 70 43 6f 6c 2b 2b 29 7b 0a 20 20 20 20 45 78   pCol++){.    Ex
9500: 70 72 20 2a 70 3b 0a 20 20 20 20 63 68 61 72 20  pr *p;.    char 
9510: 2a 7a 54 79 70 65 3b 0a 20 20 20 20 63 68 61 72  *zType;.    char
9520: 20 2a 7a 4e 61 6d 65 3b 0a 20 20 20 20 69 6e 74   *zName;.    int
9530: 20 6e 4e 61 6d 65 3b 0a 20 20 20 20 43 6f 6c 6c   nName;.    Coll
9540: 53 65 71 20 2a 70 43 6f 6c 6c 3b 0a 20 20 20 20  Seq *pColl;.    
9550: 69 6e 74 20 63 6e 74 3b 0a 20 20 20 20 4e 61 6d  int cnt;.    Nam
9560: 65 43 6f 6e 74 65 78 74 20 73 4e 43 3b 0a 20 20  eContext sNC;.  
9570: 20 20 0a 20 20 20 20 2f 2a 20 47 65 74 20 61 6e    .    /* Get an
9580: 20 61 70 70 72 6f 70 72 69 61 74 65 20 6e 61 6d   appropriate nam
9590: 65 20 66 6f 72 20 74 68 65 20 63 6f 6c 75 6d 6e  e for the column
95a0: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70 20 3d 20  .    */.    p = 
95b0: 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78  pEList->a[i].pEx
95c0: 70 72 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  pr;.    assert( 
95d0: 70 2d 3e 70 52 69 67 68 74 3d 3d 30 20 7c 7c 20  p->pRight==0 || 
95e0: 70 2d 3e 70 52 69 67 68 74 2d 3e 74 6f 6b 65 6e  p->pRight->token
95f0: 2e 7a 3d 3d 30 20 7c 7c 20 70 2d 3e 70 52 69 67  .z==0 || p->pRig
9600: 68 74 2d 3e 74 6f 6b 65 6e 2e 7a 5b 30 5d 21 3d  ht->token.z[0]!=
9610: 30 20 29 3b 0a 20 20 20 20 69 66 28 20 28 7a 4e  0 );.    if( (zN
9620: 61 6d 65 20 3d 20 70 45 4c 69 73 74 2d 3e 61 5b  ame = pEList->a[
9630: 69 5d 2e 7a 4e 61 6d 65 29 21 3d 30 20 29 7b 0a  i].zName)!=0 ){.
9640: 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20        /* If the 
9650: 63 6f 6c 75 6d 6e 20 63 6f 6e 74 61 69 6e 73 20  column contains 
9660: 61 6e 20 22 41 53 20 3c 6e 61 6d 65 3e 22 20 70  an "AS <name>" p
9670: 68 72 61 73 65 2c 20 75 73 65 20 3c 6e 61 6d 65  hrase, use <name
9680: 3e 20 61 73 20 74 68 65 20 6e 61 6d 65 20 2a 2f  > as the name */
9690: 0a 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 73  .      zName = s
96a0: 71 6c 69 74 65 33 44 62 53 74 72 44 75 70 28 64  qlite3DbStrDup(d
96b0: 62 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 7d  b, zName);.    }
96c0: 65 6c 73 65 20 69 66 28 20 70 2d 3e 6f 70 3d 3d  else if( p->op==
96d0: 54 4b 5f 43 4f 4c 55 4d 4e 20 26 26 20 70 2d 3e  TK_COLUMN && p->
96e0: 70 54 61 62 20 29 7b 0a 20 20 20 20 20 20 2f 2a  pTab ){.      /*
96f0: 20 46 6f 72 20 63 6f 6c 75 6d 6e 73 20 75 73 65   For columns use
9700: 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65   the column name
9710: 20 6e 61 6d 65 20 2a 2f 0a 20 20 20 20 20 20 69   name */.      i
9720: 6e 74 20 69 43 6f 6c 20 3d 20 70 2d 3e 69 43 6f  nt iCol = p->iCo
9730: 6c 75 6d 6e 3b 0a 20 20 20 20 20 20 69 66 28 20  lumn;.      if( 
9740: 69 43 6f 6c 3c 30 20 29 20 69 43 6f 6c 20 3d 20  iCol<0 ) iCol = 
9750: 70 2d 3e 70 54 61 62 2d 3e 69 50 4b 65 79 3b 0a  p->pTab->iPKey;.
9760: 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 73 71        zName = sq
9770: 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 64 62 2c  lite3MPrintf(db,
9780: 20 22 25 73 22 2c 20 70 2d 3e 70 54 61 62 2d 3e   "%s", p->pTab->
9790: 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 7a 4e 61 6d 65  aCol[iCol].zName
97a0: 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
97b0: 20 20 20 20 2f 2a 20 55 73 65 20 74 68 65 20 6f      /* Use the o
97c0: 72 69 67 69 6e 61 6c 20 74 65 78 74 20 6f 66 20  riginal text of 
97d0: 74 68 65 20 63 6f 6c 75 6d 6e 20 65 78 70 72 65  the column expre
97e0: 73 73 69 6f 6e 20 61 73 20 69 74 73 20 6e 61 6d  ssion as its nam
97f0: 65 20 2a 2f 0a 20 20 20 20 20 20 7a 4e 61 6d 65  e */.      zName
9800: 20 3d 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74   = sqlite3MPrint
9810: 66 28 64 62 2c 20 22 25 54 22 2c 20 26 70 2d 3e  f(db, "%T", &p->
9820: 73 70 61 6e 29 3b 0a 20 20 20 20 7d 0a 20 20 20  span);.    }.   
9830: 20 69 66 28 20 21 7a 4e 61 6d 65 20 7c 7c 20 64   if( !zName || d
9840: 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
9850: 29 7b 0a 20 20 20 20 20 20 64 62 2d 3e 6d 61 6c  ){.      db->mal
9860: 6c 6f 63 46 61 69 6c 65 64 20 3d 20 31 3b 0a 20  locFailed = 1;. 
9870: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65       sqlite3_fre
9880: 65 28 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20  e(zName);.      
9890: 73 71 6c 69 74 65 33 44 65 6c 65 74 65 54 61 62  sqlite3DeleteTab
98a0: 6c 65 28 70 54 61 62 29 3b 0a 20 20 20 20 20 20  le(pTab);.      
98b0: 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a  return 0;.    }.
98c0: 20 20 20 20 73 71 6c 69 74 65 33 44 65 71 75 6f      sqlite3Dequo
98d0: 74 65 28 7a 4e 61 6d 65 29 3b 0a 0a 20 20 20 20  te(zName);..    
98e0: 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65  /* Make sure the
98f0: 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 20 69 73 20   column name is 
9900: 75 6e 69 71 75 65 2e 20 20 49 66 20 74 68 65 20  unique.  If the 
9910: 6e 61 6d 65 20 69 73 20 6e 6f 74 20 75 6e 69 71  name is not uniq
9920: 75 65 2c 0a 20 20 20 20 2a 2a 20 61 70 70 65 6e  ue,.    ** appen
9930: 64 20 61 20 69 6e 74 65 67 65 72 20 74 6f 20 74  d a integer to t
9940: 68 65 20 6e 61 6d 65 20 73 6f 20 74 68 61 74 20  he name so that 
9950: 69 74 20 62 65 63 6f 6d 65 73 20 75 6e 69 71 75  it becomes uniqu
9960: 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 6e 4e  e..    */.    nN
9970: 61 6d 65 20 3d 20 73 74 72 6c 65 6e 28 7a 4e 61  ame = strlen(zNa
9980: 6d 65 29 3b 0a 20 20 20 20 66 6f 72 28 6a 3d 63  me);.    for(j=c
9990: 6e 74 3d 30 3b 20 6a 3c 69 3b 20 6a 2b 2b 29 7b  nt=0; j<i; j++){
99a0: 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74  .      if( sqlit
99b0: 65 33 53 74 72 49 43 6d 70 28 61 43 6f 6c 5b 6a  e3StrICmp(aCol[j
99c0: 5d 2e 7a 4e 61 6d 65 2c 20 7a 4e 61 6d 65 29 3d  ].zName, zName)=
99d0: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 7a 4e  =0 ){.        zN
99e0: 61 6d 65 5b 6e 4e 61 6d 65 5d 20 3d 20 30 3b 0a  ame[nName] = 0;.
99f0: 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20          zName = 
9a00: 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 64  sqlite3MPrintf(d
9a10: 62 2c 20 22 25 7a 3a 25 64 22 2c 20 7a 4e 61 6d  b, "%z:%d", zNam
9a20: 65 2c 20 2b 2b 63 6e 74 29 3b 0a 20 20 20 20 20  e, ++cnt);.     
9a30: 20 20 20 6a 20 3d 20 2d 31 3b 0a 20 20 20 20 20     j = -1;.     
9a40: 20 20 20 69 66 28 20 7a 4e 61 6d 65 3d 3d 30 20     if( zName==0 
9a50: 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d  ) break;.      }
9a60: 0a 20 20 20 20 7d 0a 20 20 20 20 70 43 6f 6c 2d  .    }.    pCol-
9a70: 3e 7a 4e 61 6d 65 20 3d 20 7a 4e 61 6d 65 3b 0a  >zName = zName;.
9a80: 0a 20 20 20 20 2f 2a 20 47 65 74 20 74 68 65 20  .    /* Get the 
9a90: 74 79 70 65 6e 61 6d 65 2c 20 74 79 70 65 20 61  typename, type a
9aa0: 66 66 69 6e 69 74 79 2c 20 61 6e 64 20 63 6f 6c  ffinity, and col
9ab0: 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65 20  lating sequence 
9ac0: 66 6f 72 20 74 68 65 0a 20 20 20 20 2a 2a 20 63  for the.    ** c
9ad0: 6f 6c 75 6d 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20  olumn..    */.  
9ae0: 20 20 6d 65 6d 73 65 74 28 26 73 4e 43 2c 20 30    memset(&sNC, 0
9af0: 2c 20 73 69 7a 65 6f 66 28 73 4e 43 29 29 3b 0a  , sizeof(sNC));.
9b00: 20 20 20 20 73 4e 43 2e 70 53 72 63 4c 69 73 74      sNC.pSrcList
9b10: 20 3d 20 70 53 65 6c 65 63 74 2d 3e 70 53 72 63   = pSelect->pSrc
9b20: 3b 0a 20 20 20 20 7a 54 79 70 65 20 3d 20 73 71  ;.    zType = sq
9b30: 6c 69 74 65 33 44 62 53 74 72 44 75 70 28 64 62  lite3DbStrDup(db
9b40: 2c 20 63 6f 6c 75 6d 6e 54 79 70 65 28 26 73 4e  , columnType(&sN
9b50: 43 2c 20 70 2c 20 30 2c 20 30 2c 20 30 29 29 3b  C, p, 0, 0, 0));
9b60: 0a 20 20 20 20 70 43 6f 6c 2d 3e 7a 54 79 70 65  .    pCol->zType
9b70: 20 3d 20 7a 54 79 70 65 3b 0a 20 20 20 20 70 43   = zType;.    pC
9b80: 6f 6c 2d 3e 61 66 66 69 6e 69 74 79 20 3d 20 73  ol->affinity = s
9b90: 71 6c 69 74 65 33 45 78 70 72 41 66 66 69 6e 69  qlite3ExprAffini
9ba0: 74 79 28 70 29 3b 0a 20 20 20 20 70 43 6f 6c 6c  ty(p);.    pColl
9bb0: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f   = sqlite3ExprCo
9bc0: 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70 29  llSeq(pParse, p)
9bd0: 3b 0a 20 20 20 20 69 66 28 20 70 43 6f 6c 6c 20  ;.    if( pColl 
9be0: 29 7b 0a 20 20 20 20 20 20 70 43 6f 6c 2d 3e 7a  ){.      pCol->z
9bf0: 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 44 62  Coll = sqlite3Db
9c00: 53 74 72 44 75 70 28 64 62 2c 20 70 43 6f 6c 6c  StrDup(db, pColl
9c10: 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 7d 0a  ->zName);.    }.
9c20: 20 20 7d 0a 20 20 70 54 61 62 2d 3e 69 50 4b 65    }.  pTab->iPKe
9c30: 79 20 3d 20 2d 31 3b 0a 20 20 72 65 74 75 72 6e  y = -1;.  return
9c40: 20 70 54 61 62 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   pTab;.}../*.** 
9c50: 50 72 65 70 61 72 65 20 61 20 53 45 4c 45 43 54  Prepare a SELECT
9c60: 20 73 74 61 74 65 6d 65 6e 74 20 66 6f 72 20 70   statement for p
9c70: 72 6f 63 65 73 73 69 6e 67 20 62 79 20 64 6f 69  rocessing by doi
9c80: 6e 67 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  ng the following
9c90: 0a 2a 2a 20 74 68 69 6e 67 73 3a 0a 2a 2a 0a 2a  .** things:.**.*
9ca0: 2a 20 20 20 20 28 31 29 20 20 4d 61 6b 65 20 73  *    (1)  Make s
9cb0: 75 72 65 20 56 44 42 45 20 63 75 72 73 6f 72 20  ure VDBE cursor 
9cc0: 6e 75 6d 62 65 72 73 20 68 61 76 65 20 62 65 65  numbers have bee
9cd0: 6e 20 61 73 73 69 67 6e 65 64 20 74 6f 20 65 76  n assigned to ev
9ce0: 65 72 79 0a 2a 2a 20 20 20 20 20 20 20 20 20 65  ery.**         e
9cf0: 6c 65 6d 65 6e 74 20 6f 66 20 74 68 65 20 46 52  lement of the FR
9d00: 4f 4d 20 63 6c 61 75 73 65 2e 0a 2a 2a 0a 2a 2a  OM clause..**.**
9d10: 20 20 20 20 28 32 29 20 20 46 69 6c 6c 20 69 6e      (2)  Fill in
9d20: 20 74 68 65 20 70 54 61 62 4c 69 73 74 2d 3e 61   the pTabList->a
9d30: 5b 5d 2e 70 54 61 62 20 66 69 65 6c 64 73 20 69  [].pTab fields i
9d40: 6e 20 74 68 65 20 53 72 63 4c 69 73 74 20 74 68  n the SrcList th
9d50: 61 74 20 0a 2a 2a 20 20 20 20 20 20 20 20 20 64  at .**         d
9d60: 65 66 69 6e 65 73 20 46 52 4f 4d 20 63 6c 61 75  efines FROM clau
9d70: 73 65 2e 20 20 57 68 65 6e 20 76 69 65 77 73 20  se.  When views 
9d80: 61 70 70 65 61 72 20 69 6e 20 74 68 65 20 46 52  appear in the FR
9d90: 4f 4d 20 63 6c 61 75 73 65 2c 0a 2a 2a 20 20 20  OM clause,.**   
9da0: 20 20 20 20 20 20 66 69 6c 6c 20 70 54 61 62 4c        fill pTabL
9db0: 69 73 74 2d 3e 61 5b 5d 2e 70 53 65 6c 65 63 74  ist->a[].pSelect
9dc0: 20 77 69 74 68 20 61 20 63 6f 70 79 20 6f 66 20   with a copy of 
9dd0: 74 68 65 20 53 45 4c 45 43 54 20 73 74 61 74 65  the SELECT state
9de0: 6d 65 6e 74 0a 2a 2a 20 20 20 20 20 20 20 20 20  ment.**         
9df0: 74 68 61 74 20 69 6d 70 6c 65 6d 65 6e 74 73 20  that implements 
9e00: 74 68 65 20 76 69 65 77 2e 20 20 41 20 63 6f 70  the view.  A cop
9e10: 79 20 69 73 20 6d 61 64 65 20 6f 66 20 74 68 65  y is made of the
9e20: 20 76 69 65 77 27 73 20 53 45 4c 45 43 54 0a 2a   view's SELECT.*
9e30: 2a 20 20 20 20 20 20 20 20 20 73 74 61 74 65 6d  *         statem
9e40: 65 6e 74 20 73 6f 20 74 68 61 74 20 77 65 20 63  ent so that we c
9e50: 61 6e 20 66 72 65 65 6c 79 20 6d 6f 64 69 66 79  an freely modify
9e60: 20 6f 72 20 64 65 6c 65 74 65 20 74 68 61 74 20   or delete that 
9e70: 73 74 61 74 65 6d 65 6e 74 0a 2a 2a 20 20 20 20  statement.**    
9e80: 20 20 20 20 20 77 69 74 68 6f 75 74 20 77 6f 72       without wor
9e90: 72 79 69 6e 67 20 61 62 6f 75 74 20 6d 65 73 73  rying about mess
9ea0: 69 6e 67 20 75 70 20 74 68 65 20 70 72 65 73 69  ing up the presi
9eb0: 73 74 65 6e 74 20 72 65 70 72 65 73 65 6e 74 61  stent representa
9ec0: 74 69 6f 6e 0a 2a 2a 20 20 20 20 20 20 20 20 20  tion.**         
9ed0: 6f 66 20 74 68 65 20 76 69 65 77 2e 0a 2a 2a 0a  of the view..**.
9ee0: 2a 2a 20 20 20 20 28 33 29 20 20 41 64 64 20 74  **    (3)  Add t
9ef0: 65 72 6d 73 20 74 6f 20 74 68 65 20 57 48 45 52  erms to the WHER
9f00: 45 20 63 6c 61 75 73 65 20 74 6f 20 61 63 63 6f  E clause to acco
9f10: 6d 6f 64 61 74 65 20 74 68 65 20 4e 41 54 55 52  modate the NATUR
9f20: 41 4c 20 6b 65 79 77 6f 72 64 0a 2a 2a 20 20 20  AL keyword.**   
9f30: 20 20 20 20 20 20 6f 6e 20 6a 6f 69 6e 73 20 61        on joins a
9f40: 6e 64 20 74 68 65 20 4f 4e 20 61 6e 64 20 55 53  nd the ON and US
9f50: 49 4e 47 20 63 6c 61 75 73 65 20 6f 66 20 6a 6f  ING clause of jo
9f60: 69 6e 73 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 28 34  ins..**.**    (4
9f70: 29 20 20 53 63 61 6e 20 74 68 65 20 6c 69 73 74  )  Scan the list
9f80: 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74   of columns in t
9f90: 68 65 20 72 65 73 75 6c 74 20 73 65 74 20 28 70  he result set (p
9fa0: 45 4c 69 73 74 29 20 6c 6f 6f 6b 69 6e 67 0a 2a  EList) looking.*
9fb0: 2a 20 20 20 20 20 20 20 20 20 66 6f 72 20 69 6e  *         for in
9fc0: 73 74 61 6e 63 65 73 20 6f 66 20 74 68 65 20 22  stances of the "
9fd0: 2a 22 20 6f 70 65 72 61 74 6f 72 20 6f 72 20 74  *" operator or t
9fe0: 68 65 20 54 41 42 4c 45 2e 2a 20 6f 70 65 72 61  he TABLE.* opera
9ff0: 74 6f 72 2e 0a 2a 2a 20 20 20 20 20 20 20 20 20  tor..**         
a000: 49 66 20 66 6f 75 6e 64 2c 20 65 78 70 61 6e 64  If found, expand
a010: 20 65 61 63 68 20 22 2a 22 20 74 6f 20 62 65 20   each "*" to be 
a020: 65 76 65 72 79 20 63 6f 6c 75 6d 6e 20 69 6e 20  every column in 
a030: 65 76 65 72 79 20 74 61 62 6c 65 0a 2a 2a 20 20  every table.**  
a040: 20 20 20 20 20 20 20 61 6e 64 20 54 41 42 4c 45         and TABLE
a050: 2e 2a 20 74 6f 20 62 65 20 65 76 65 72 79 20 63  .* to be every c
a060: 6f 6c 75 6d 6e 20 69 6e 20 54 41 42 4c 45 2e 0a  olumn in TABLE..
a070: 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 30 20 6f  **.** Return 0 o
a080: 6e 20 73 75 63 63 65 73 73 2e 20 20 49 66 20 74  n success.  If t
a090: 68 65 72 65 20 61 72 65 20 70 72 6f 62 6c 65 6d  here are problem
a0a0: 73 2c 20 6c 65 61 76 65 20 61 6e 20 65 72 72 6f  s, leave an erro
a0b0: 72 20 6d 65 73 73 61 67 65 0a 2a 2a 20 69 6e 20  r message.** in 
a0c0: 70 50 61 72 73 65 20 61 6e 64 20 72 65 74 75 72  pParse and retur
a0d0: 6e 20 6e 6f 6e 2d 7a 65 72 6f 2e 0a 2a 2f 0a 73  n non-zero..*/.s
a0e0: 74 61 74 69 63 20 69 6e 74 20 70 72 65 70 53 65  tatic int prepSe
a0f0: 6c 65 63 74 53 74 6d 74 28 50 61 72 73 65 20 2a  lectStmt(Parse *
a100: 70 50 61 72 73 65 2c 20 53 65 6c 65 63 74 20 2a  pParse, Select *
a110: 70 29 7b 0a 20 20 69 6e 74 20 69 2c 20 6a 2c 20  p){.  int i, j, 
a120: 6b 2c 20 72 63 3b 0a 20 20 53 72 63 4c 69 73 74  k, rc;.  SrcList
a130: 20 2a 70 54 61 62 4c 69 73 74 3b 0a 20 20 45 78   *pTabList;.  Ex
a140: 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 3b 0a  prList *pEList;.
a150: 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74    struct SrcList
a160: 5f 69 74 65 6d 20 2a 70 46 72 6f 6d 3b 0a 20 20  _item *pFrom;.  
a170: 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50  sqlite3 *db = pP
a180: 61 72 73 65 2d 3e 64 62 3b 0a 0a 20 20 69 66 28  arse->db;..  if(
a190: 20 70 3d 3d 30 20 7c 7c 20 70 2d 3e 70 53 72 63   p==0 || p->pSrc
a1a0: 3d 3d 30 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f  ==0 || db->mallo
a1b0: 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 72  cFailed ){.    r
a1c0: 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 70  eturn 1;.  }.  p
a1d0: 54 61 62 4c 69 73 74 20 3d 20 70 2d 3e 70 53 72  TabList = p->pSr
a1e0: 63 3b 0a 20 20 70 45 4c 69 73 74 20 3d 20 70 2d  c;.  pEList = p-
a1f0: 3e 70 45 4c 69 73 74 3b 0a 0a 20 20 2f 2a 20 4d  >pEList;..  /* M
a200: 61 6b 65 20 73 75 72 65 20 63 75 72 73 6f 72 20  ake sure cursor 
a210: 6e 75 6d 62 65 72 73 20 68 61 76 65 20 62 65 65  numbers have bee
a220: 6e 20 61 73 73 69 67 6e 65 64 20 74 6f 20 61 6c  n assigned to al
a230: 6c 20 65 6e 74 72 69 65 73 20 69 6e 0a 20 20 2a  l entries in.  *
a240: 2a 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73  * the FROM claus
a250: 65 20 6f 66 20 74 68 65 20 53 45 4c 45 43 54 20  e of the SELECT 
a260: 73 74 61 74 65 6d 65 6e 74 2e 0a 20 20 2a 2f 0a  statement..  */.
a270: 20 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74    sqlite3SrcList
a280: 41 73 73 69 67 6e 43 75 72 73 6f 72 73 28 70 50  AssignCursors(pP
a290: 61 72 73 65 2c 20 70 2d 3e 70 53 72 63 29 3b 0a  arse, p->pSrc);.
a2a0: 0a 20 20 2f 2a 20 4c 6f 6f 6b 20 75 70 20 65 76  .  /* Look up ev
a2b0: 65 72 79 20 74 61 62 6c 65 20 6e 61 6d 65 64 20  ery table named 
a2c0: 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75  in the FROM clau
a2d0: 73 65 20 6f 66 20 74 68 65 20 73 65 6c 65 63 74  se of the select
a2e0: 2e 20 20 49 66 0a 20 20 2a 2a 20 61 6e 20 65 6e  .  If.  ** an en
a2f0: 74 72 79 20 6f 66 20 74 68 65 20 46 52 4f 4d 20  try of the FROM 
a300: 63 6c 61 75 73 65 20 69 73 20 61 20 73 75 62 71  clause is a subq
a310: 75 65 72 79 20 69 6e 73 74 65 61 64 20 6f 66 20  uery instead of 
a320: 61 20 74 61 62 6c 65 20 6f 72 20 76 69 65 77 2c  a table or view,
a330: 0a 20 20 2a 2a 20 74 68 65 6e 20 63 72 65 61 74  .  ** then creat
a340: 65 20 61 20 74 72 61 6e 73 69 65 6e 74 20 74 61  e a transient ta
a350: 62 6c 65 20 73 74 72 75 63 74 75 72 65 20 74 6f  ble structure to
a360: 20 64 65 73 63 72 69 62 65 20 74 68 65 20 73 75   describe the su
a370: 62 71 75 65 72 79 2e 0a 20 20 2a 2f 0a 20 20 66  bquery..  */.  f
a380: 6f 72 28 69 3d 30 2c 20 70 46 72 6f 6d 3d 70 54  or(i=0, pFrom=pT
a390: 61 62 4c 69 73 74 2d 3e 61 3b 20 69 3c 70 54 61  abList->a; i<pTa
a3a0: 62 4c 69 73 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b  bList->nSrc; i++
a3b0: 2c 20 70 46 72 6f 6d 2b 2b 29 7b 0a 20 20 20 20  , pFrom++){.    
a3c0: 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20 20  Table *pTab;.   
a3d0: 20 69 66 28 20 70 46 72 6f 6d 2d 3e 70 54 61 62   if( pFrom->pTab
a3e0: 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  !=0 ){.      /* 
a3f0: 54 68 69 73 20 73 74 61 74 65 6d 65 6e 74 20 68  This statement h
a400: 61 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20  as already been 
a410: 70 72 65 70 61 72 65 64 2e 20 20 54 68 65 72 65  prepared.  There
a420: 20 69 73 20 6e 6f 20 6e 65 65 64 0a 20 20 20 20   is no need.    
a430: 20 20 2a 2a 20 74 6f 20 67 6f 20 66 75 72 74 68    ** to go furth
a440: 65 72 2e 20 2a 2f 0a 20 20 20 20 20 20 61 73 73  er. */.      ass
a450: 65 72 74 28 20 69 3d 3d 30 20 29 3b 0a 20 20 20  ert( i==0 );.   
a460: 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20     return 0;.   
a470: 20 7d 0a 20 20 20 20 69 66 28 20 70 46 72 6f 6d   }.    if( pFrom
a480: 2d 3e 7a 4e 61 6d 65 3d 3d 30 20 29 7b 0a 23 69  ->zName==0 ){.#i
a490: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
a4a0: 54 5f 53 55 42 51 55 45 52 59 0a 20 20 20 20 20  T_SUBQUERY.     
a4b0: 20 2f 2a 20 41 20 73 75 62 2d 71 75 65 72 79 20   /* A sub-query 
a4c0: 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75  in the FROM clau
a4d0: 73 65 20 6f 66 20 61 20 53 45 4c 45 43 54 20 2a  se of a SELECT *
a4e0: 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  /.      assert( 
a4f0: 70 46 72 6f 6d 2d 3e 70 53 65 6c 65 63 74 21 3d  pFrom->pSelect!=
a500: 30 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70  0 );.      if( p
a510: 46 72 6f 6d 2d 3e 7a 41 6c 69 61 73 3d 3d 30 20  From->zAlias==0 
a520: 29 7b 0a 20 20 20 20 20 20 20 20 70 46 72 6f 6d  ){.        pFrom
a530: 2d 3e 7a 41 6c 69 61 73 20 3d 0a 20 20 20 20 20  ->zAlias =.     
a540: 20 20 20 20 20 73 71 6c 69 74 65 33 4d 50 72 69       sqlite3MPri
a550: 6e 74 66 28 64 62 2c 20 22 73 71 6c 69 74 65 5f  ntf(db, "sqlite_
a560: 73 75 62 71 75 65 72 79 5f 25 70 5f 22 2c 20 28  subquery_%p_", (
a570: 76 6f 69 64 2a 29 70 46 72 6f 6d 2d 3e 70 53 65  void*)pFrom->pSe
a580: 6c 65 63 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20  lect);.      }. 
a590: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 46 72       assert( pFr
a5a0: 6f 6d 2d 3e 70 54 61 62 3d 3d 30 20 29 3b 0a 20  om->pTab==0 );. 
a5b0: 20 20 20 20 20 70 46 72 6f 6d 2d 3e 70 54 61 62       pFrom->pTab
a5c0: 20 3d 20 70 54 61 62 20 3d 20 0a 20 20 20 20 20   = pTab = .     
a5d0: 20 20 20 73 71 6c 69 74 65 33 52 65 73 75 6c 74     sqlite3Result
a5e0: 53 65 74 4f 66 53 65 6c 65 63 74 28 70 50 61 72  SetOfSelect(pPar
a5f0: 73 65 2c 20 70 46 72 6f 6d 2d 3e 7a 41 6c 69 61  se, pFrom->zAlia
a600: 73 2c 20 70 46 72 6f 6d 2d 3e 70 53 65 6c 65 63  s, pFrom->pSelec
a610: 74 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 54  t);.      if( pT
a620: 61 62 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  ab==0 ){.       
a630: 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 20   return 1;.     
a640: 20 7d 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20   }.      /* The 
a650: 69 73 45 70 68 65 6d 20 66 6c 61 67 20 69 6e 64  isEphem flag ind
a660: 69 63 61 74 65 73 20 74 68 61 74 20 74 68 65 20  icates that the 
a670: 54 61 62 6c 65 20 73 74 72 75 63 74 75 72 65 20  Table structure 
a680: 68 61 73 20 62 65 65 6e 0a 20 20 20 20 20 20 2a  has been.      *
a690: 2a 20 64 79 6e 61 6d 69 63 61 6c 6c 79 20 61 6c  * dynamically al
a6a0: 6c 6f 63 61 74 65 64 20 61 6e 64 20 6d 61 79 20  located and may 
a6b0: 62 65 20 66 72 65 65 64 20 61 74 20 61 6e 79 20  be freed at any 
a6c0: 74 69 6d 65 2e 20 20 49 6e 20 6f 74 68 65 72 20  time.  In other 
a6d0: 77 6f 72 64 73 2c 0a 20 20 20 20 20 20 2a 2a 20  words,.      ** 
a6e0: 70 54 61 62 20 69 73 20 6e 6f 74 20 70 6f 69 6e  pTab is not poin
a6f0: 74 69 6e 67 20 74 6f 20 61 20 70 65 72 73 69 73  ting to a persis
a700: 74 65 6e 74 20 74 61 62 6c 65 20 73 74 72 75 63  tent table struc
a710: 74 75 72 65 20 74 68 61 74 20 64 65 66 69 6e 65  ture that define
a720: 73 0a 20 20 20 20 20 20 2a 2a 20 70 61 72 74 20  s.      ** part 
a730: 6f 66 20 74 68 65 20 73 63 68 65 6d 61 2e 20 2a  of the schema. *
a740: 2f 0a 20 20 20 20 20 20 70 54 61 62 2d 3e 69 73  /.      pTab->is
a750: 45 70 68 65 6d 20 3d 20 31 3b 0a 23 65 6e 64 69  Ephem = 1;.#endi
a760: 66 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  f.    }else{.   
a770: 20 20 20 2f 2a 20 41 6e 20 6f 72 64 69 6e 61 72     /* An ordinar
a780: 79 20 74 61 62 6c 65 20 6f 72 20 76 69 65 77 20  y table or view 
a790: 6e 61 6d 65 20 69 6e 20 74 68 65 20 46 52 4f 4d  name in the FROM
a7a0: 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 20 20 20   clause */.     
a7b0: 20 61 73 73 65 72 74 28 20 70 46 72 6f 6d 2d 3e   assert( pFrom->
a7c0: 70 54 61 62 3d 3d 30 20 29 3b 0a 20 20 20 20 20  pTab==0 );.     
a7d0: 20 70 46 72 6f 6d 2d 3e 70 54 61 62 20 3d 20 70   pFrom->pTab = p
a7e0: 54 61 62 20 3d 20 0a 20 20 20 20 20 20 20 20 73  Tab = .        s
a7f0: 71 6c 69 74 65 33 4c 6f 63 61 74 65 54 61 62 6c  qlite3LocateTabl
a800: 65 28 70 50 61 72 73 65 2c 30 2c 70 46 72 6f 6d  e(pParse,0,pFrom
a810: 2d 3e 7a 4e 61 6d 65 2c 70 46 72 6f 6d 2d 3e 7a  ->zName,pFrom->z
a820: 44 61 74 61 62 61 73 65 29 3b 0a 20 20 20 20 20  Database);.     
a830: 20 69 66 28 20 70 54 61 62 3d 3d 30 20 29 7b 0a   if( pTab==0 ){.
a840: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 31          return 1
a850: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
a860: 70 54 61 62 2d 3e 6e 52 65 66 2b 2b 3b 0a 23 69  pTab->nRef++;.#i
a870: 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  f !defined(SQLIT
a880: 45 5f 4f 4d 49 54 5f 56 49 45 57 29 20 7c 7c 20  E_OMIT_VIEW) || 
a890: 21 64 65 66 69 6e 65 64 20 28 53 51 4c 49 54 45  !defined (SQLITE
a8a0: 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42  _OMIT_VIRTUALTAB
a8b0: 4c 45 29 0a 20 20 20 20 20 20 69 66 28 20 70 54  LE).      if( pT
a8c0: 61 62 2d 3e 70 53 65 6c 65 63 74 20 7c 7c 20 49  ab->pSelect || I
a8d0: 73 56 69 72 74 75 61 6c 28 70 54 61 62 29 20 29  sVirtual(pTab) )
a8e0: 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 57 65 20  {.        /* We 
a8f0: 72 65 61 63 68 20 68 65 72 65 20 69 66 20 74 68  reach here if th
a900: 65 20 6e 61 6d 65 64 20 74 61 62 6c 65 20 69 73  e named table is
a910: 20 61 20 72 65 61 6c 6c 79 20 61 20 76 69 65 77   a really a view
a920: 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20   */.        if( 
a930: 73 71 6c 69 74 65 33 56 69 65 77 47 65 74 43 6f  sqlite3ViewGetCo
a940: 6c 75 6d 6e 4e 61 6d 65 73 28 70 50 61 72 73 65  lumnNames(pParse
a950: 2c 20 70 54 61 62 29 20 29 7b 0a 20 20 20 20 20  , pTab) ){.     
a960: 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20       return 1;. 
a970: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
a980: 20 2f 2a 20 49 66 20 70 46 72 6f 6d 2d 3e 70 53   /* If pFrom->pS
a990: 65 6c 65 63 74 21 3d 30 20 69 74 20 6d 65 61 6e  elect!=0 it mean
a9a0: 73 20 77 65 20 61 72 65 20 64 65 61 6c 69 6e 67  s we are dealing
a9b0: 20 77 69 74 68 20 61 0a 20 20 20 20 20 20 20 20   with a.        
a9c0: 2a 2a 20 76 69 65 77 20 77 69 74 68 69 6e 20 61  ** view within a
a9d0: 20 76 69 65 77 2e 20 20 54 68 65 20 53 45 4c 45   view.  The SELE
a9e0: 43 54 20 73 74 72 75 63 74 75 72 65 20 68 61 73  CT structure has
a9f0: 20 61 6c 72 65 61 64 79 20 62 65 65 6e 0a 20 20   already been.  
aa00: 20 20 20 20 20 20 2a 2a 20 63 6f 70 69 65 64 20        ** copied 
aa10: 62 79 20 74 68 65 20 6f 75 74 65 72 20 76 69 65  by the outer vie
aa20: 77 20 73 6f 20 77 65 20 63 61 6e 20 73 6b 69 70  w so we can skip
aa30: 20 74 68 65 20 63 6f 70 79 20 73 74 65 70 20 68   the copy step h
aa40: 65 72 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 69  ere.        ** i
aa50: 6e 20 74 68 65 20 69 6e 6e 65 72 20 76 69 65 77  n the inner view
aa60: 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20  ..        */.   
aa70: 20 20 20 20 20 69 66 28 20 70 46 72 6f 6d 2d 3e       if( pFrom->
aa80: 70 53 65 6c 65 63 74 3d 3d 30 20 29 7b 0a 20 20  pSelect==0 ){.  
aa90: 20 20 20 20 20 20 20 20 70 46 72 6f 6d 2d 3e 70          pFrom->p
aaa0: 53 65 6c 65 63 74 20 3d 20 73 71 6c 69 74 65 33  Select = sqlite3
aab0: 53 65 6c 65 63 74 44 75 70 28 64 62 2c 20 70 54  SelectDup(db, pT
aac0: 61 62 2d 3e 70 53 65 6c 65 63 74 29 3b 0a 20 20  ab->pSelect);.  
aad0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
aae0: 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a 20 20 7d  #endif.    }.  }
aaf0: 0a 0a 20 20 2f 2a 20 50 72 6f 63 65 73 73 20 4e  ..  /* Process N
ab00: 41 54 55 52 41 4c 20 6b 65 79 77 6f 72 64 73 2c  ATURAL keywords,
ab10: 20 61 6e 64 20 4f 4e 20 61 6e 64 20 55 53 49 4e   and ON and USIN
ab20: 47 20 63 6c 61 75 73 65 73 20 6f 66 20 6a 6f 69  G clauses of joi
ab30: 6e 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 73  ns..  */.  if( s
ab40: 71 6c 69 74 65 50 72 6f 63 65 73 73 4a 6f 69 6e  qliteProcessJoin
ab50: 28 70 50 61 72 73 65 2c 20 70 29 20 29 20 72 65  (pParse, p) ) re
ab60: 74 75 72 6e 20 31 3b 0a 0a 20 20 2f 2a 20 46 6f  turn 1;..  /* Fo
ab70: 72 20 65 76 65 72 79 20 22 2a 22 20 74 68 61 74  r every "*" that
ab80: 20 6f 63 63 75 72 73 20 69 6e 20 74 68 65 20 63   occurs in the c
ab90: 6f 6c 75 6d 6e 20 6c 69 73 74 2c 20 69 6e 73 65  olumn list, inse
aba0: 72 74 20 74 68 65 20 6e 61 6d 65 73 20 6f 66 0a  rt the names of.
abb0: 20 20 2a 2a 20 61 6c 6c 20 63 6f 6c 75 6d 6e 73    ** all columns
abc0: 20 69 6e 20 61 6c 6c 20 74 61 62 6c 65 73 2e 20   in all tables. 
abd0: 20 41 6e 64 20 66 6f 72 20 65 76 65 72 79 20 54   And for every T
abe0: 41 42 4c 45 2e 2a 20 69 6e 73 65 72 74 20 74 68  ABLE.* insert th
abf0: 65 20 6e 61 6d 65 73 0a 20 20 2a 2a 20 6f 66 20  e names.  ** of 
ac00: 61 6c 6c 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 54  all columns in T
ac10: 41 42 4c 45 2e 20 20 54 68 65 20 70 61 72 73 65  ABLE.  The parse
ac20: 72 20 69 6e 73 65 72 74 65 64 20 61 20 73 70 65  r inserted a spe
ac30: 63 69 61 6c 20 65 78 70 72 65 73 73 69 6f 6e 0a  cial expression.
ac40: 20 20 2a 2a 20 77 69 74 68 20 74 68 65 20 54 4b    ** with the TK
ac50: 5f 41 4c 4c 20 6f 70 65 72 61 74 6f 72 20 66 6f  _ALL operator fo
ac60: 72 20 65 61 63 68 20 22 2a 22 20 74 68 61 74 20  r each "*" that 
ac70: 69 74 20 66 6f 75 6e 64 20 69 6e 20 74 68 65 20  it found in the 
ac80: 63 6f 6c 75 6d 6e 20 6c 69 73 74 2e 0a 20 20 2a  column list..  *
ac90: 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  * The following 
aca0: 63 6f 64 65 20 6a 75 73 74 20 68 61 73 20 74 6f  code just has to
acb0: 20 6c 6f 63 61 74 65 20 74 68 65 20 54 4b 5f 41   locate the TK_A
acc0: 4c 4c 20 65 78 70 72 65 73 73 69 6f 6e 73 20 61  LL expressions a
acd0: 6e 64 20 65 78 70 61 6e 64 0a 20 20 2a 2a 20 65  nd expand.  ** e
ace0: 61 63 68 20 6f 6e 65 20 74 6f 20 74 68 65 20 6c  ach one to the l
acf0: 69 73 74 20 6f 66 20 61 6c 6c 20 63 6f 6c 75 6d  ist of all colum
ad00: 6e 73 20 69 6e 20 61 6c 6c 20 74 61 62 6c 65 73  ns in all tables
ad10: 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20  ..  **.  ** The 
ad20: 66 69 72 73 74 20 6c 6f 6f 70 20 6a 75 73 74 20  first loop just 
ad30: 63 68 65 63 6b 73 20 74 6f 20 73 65 65 20 69 66  checks to see if
ad40: 20 74 68 65 72 65 20 61 72 65 20 61 6e 79 20 22   there are any "
ad50: 2a 22 20 6f 70 65 72 61 74 6f 72 73 0a 20 20 2a  *" operators.  *
ad60: 2a 20 74 68 61 74 20 6e 65 65 64 20 65 78 70 61  * that need expa
ad70: 6e 64 69 6e 67 2e 0a 20 20 2a 2f 0a 20 20 66 6f  nding..  */.  fo
ad80: 72 28 6b 3d 30 3b 20 6b 3c 70 45 4c 69 73 74 2d  r(k=0; k<pEList-
ad90: 3e 6e 45 78 70 72 3b 20 6b 2b 2b 29 7b 0a 20 20  >nExpr; k++){.  
ada0: 20 20 45 78 70 72 20 2a 70 45 20 3d 20 70 45 4c    Expr *pE = pEL
adb0: 69 73 74 2d 3e 61 5b 6b 5d 2e 70 45 78 70 72 3b  ist->a[k].pExpr;
adc0: 0a 20 20 20 20 69 66 28 20 70 45 2d 3e 6f 70 3d  .    if( pE->op=
add0: 3d 54 4b 5f 41 4c 4c 20 29 20 62 72 65 61 6b 3b  =TK_ALL ) break;
ade0: 0a 20 20 20 20 69 66 28 20 70 45 2d 3e 6f 70 3d  .    if( pE->op=
adf0: 3d 54 4b 5f 44 4f 54 20 26 26 20 70 45 2d 3e 70  =TK_DOT && pE->p
ae00: 52 69 67 68 74 20 26 26 20 70 45 2d 3e 70 52 69  Right && pE->pRi
ae10: 67 68 74 2d 3e 6f 70 3d 3d 54 4b 5f 41 4c 4c 0a  ght->op==TK_ALL.
ae20: 20 20 20 20 20 20 20 20 20 26 26 20 70 45 2d 3e           && pE->
ae30: 70 4c 65 66 74 20 26 26 20 70 45 2d 3e 70 4c 65  pLeft && pE->pLe
ae40: 66 74 2d 3e 6f 70 3d 3d 54 4b 5f 49 44 20 29 20  ft->op==TK_ID ) 
ae50: 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 72 63 20  break;.  }.  rc 
ae60: 3d 20 30 3b 0a 20 20 69 66 28 20 6b 3c 70 45 4c  = 0;.  if( k<pEL
ae70: 69 73 74 2d 3e 6e 45 78 70 72 20 29 7b 0a 20 20  ist->nExpr ){.  
ae80: 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 49 66 20 77    /*.    ** If w
ae90: 65 20 67 65 74 20 68 65 72 65 20 69 74 20 6d 65  e get here it me
aea0: 61 6e 73 20 74 68 65 20 72 65 73 75 6c 74 20 73  ans the result s
aeb0: 65 74 20 63 6f 6e 74 61 69 6e 73 20 6f 6e 65 20  et contains one 
aec0: 6f 72 20 6d 6f 72 65 20 22 2a 22 0a 20 20 20 20  or more "*".    
aed0: 2a 2a 20 6f 70 65 72 61 74 6f 72 73 20 74 68 61  ** operators tha
aee0: 74 20 6e 65 65 64 20 74 6f 20 62 65 20 65 78 70  t need to be exp
aef0: 61 6e 64 65 64 2e 20 20 4c 6f 6f 70 20 74 68 72  anded.  Loop thr
af00: 6f 75 67 68 20 65 61 63 68 20 65 78 70 72 65 73  ough each expres
af10: 73 69 6f 6e 0a 20 20 20 20 2a 2a 20 69 6e 20 74  sion.    ** in t
af20: 68 65 20 72 65 73 75 6c 74 20 73 65 74 20 61 6e  he result set an
af30: 64 20 65 78 70 61 6e 64 20 74 68 65 6d 20 6f 6e  d expand them on
af40: 65 20 62 79 20 6f 6e 65 2e 0a 20 20 20 20 2a 2f  e by one..    */
af50: 0a 20 20 20 20 73 74 72 75 63 74 20 45 78 70 72  .    struct Expr
af60: 4c 69 73 74 5f 69 74 65 6d 20 2a 61 20 3d 20 70  List_item *a = p
af70: 45 4c 69 73 74 2d 3e 61 3b 0a 20 20 20 20 45 78  EList->a;.    Ex
af80: 70 72 4c 69 73 74 20 2a 70 4e 65 77 20 3d 20 30  prList *pNew = 0
af90: 3b 0a 20 20 20 20 69 6e 74 20 66 6c 61 67 73 20  ;.    int flags 
afa0: 3d 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 66 6c  = pParse->db->fl
afb0: 61 67 73 3b 0a 20 20 20 20 69 6e 74 20 6c 6f 6e  ags;.    int lon
afc0: 67 4e 61 6d 65 73 20 3d 20 28 66 6c 61 67 73 20  gNames = (flags 
afd0: 26 20 53 51 4c 49 54 45 5f 46 75 6c 6c 43 6f 6c  & SQLITE_FullCol
afe0: 4e 61 6d 65 73 29 21 3d 30 0a 20 20 20 20 20 20  Names)!=0.      
aff0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b000: 26 26 20 28 66 6c 61 67 73 20 26 20 53 51 4c 49  && (flags & SQLI
b010: 54 45 5f 53 68 6f 72 74 43 6f 6c 4e 61 6d 65 73  TE_ShortColNames
b020: 29 3d 3d 30 3b 0a 0a 20 20 20 20 66 6f 72 28 6b  )==0;..    for(k
b030: 3d 30 3b 20 6b 3c 70 45 4c 69 73 74 2d 3e 6e 45  =0; k<pEList->nE
b040: 78 70 72 3b 20 6b 2b 2b 29 7b 0a 20 20 20 20 20  xpr; k++){.     
b050: 20 45 78 70 72 20 2a 70 45 20 3d 20 61 5b 6b 5d   Expr *pE = a[k]
b060: 2e 70 45 78 70 72 3b 0a 20 20 20 20 20 20 69 66  .pExpr;.      if
b070: 28 20 70 45 2d 3e 6f 70 21 3d 54 4b 5f 41 4c 4c  ( pE->op!=TK_ALL
b080: 20 26 26 0a 20 20 20 20 20 20 20 20 20 20 20 28   &&.           (
b090: 70 45 2d 3e 6f 70 21 3d 54 4b 5f 44 4f 54 20 7c  pE->op!=TK_DOT |
b0a0: 7c 20 70 45 2d 3e 70 52 69 67 68 74 3d 3d 30 20  | pE->pRight==0 
b0b0: 7c 7c 20 70 45 2d 3e 70 52 69 67 68 74 2d 3e 6f  || pE->pRight->o
b0c0: 70 21 3d 54 4b 5f 41 4c 4c 29 20 29 7b 0a 20 20  p!=TK_ALL) ){.  
b0d0: 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20 70 61        /* This pa
b0e0: 72 74 69 63 75 6c 61 72 20 65 78 70 72 65 73 73  rticular express
b0f0: 69 6f 6e 20 64 6f 65 73 20 6e 6f 74 20 6e 65 65  ion does not nee
b100: 64 20 74 6f 20 62 65 20 65 78 70 61 6e 64 65 64  d to be expanded
b110: 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20  ..        */.   
b120: 20 20 20 20 20 70 4e 65 77 20 3d 20 73 71 6c 69       pNew = sqli
b130: 74 65 33 45 78 70 72 4c 69 73 74 41 70 70 65 6e  te3ExprListAppen
b140: 64 28 70 50 61 72 73 65 2c 20 70 4e 65 77 2c 20  d(pParse, pNew, 
b150: 61 5b 6b 5d 2e 70 45 78 70 72 2c 20 30 29 3b 0a  a[k].pExpr, 0);.
b160: 20 20 20 20 20 20 20 20 69 66 28 20 70 4e 65 77          if( pNew
b170: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 4e   ){.          pN
b180: 65 77 2d 3e 61 5b 70 4e 65 77 2d 3e 6e 45 78 70  ew->a[pNew->nExp
b190: 72 2d 31 5d 2e 7a 4e 61 6d 65 20 3d 20 61 5b 6b  r-1].zName = a[k
b1a0: 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20 20  ].zName;.       
b1b0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
b1c0: 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 20 20    rc = 1;.      
b1d0: 20 20 7d 0a 20 20 20 20 20 20 20 20 61 5b 6b 5d    }.        a[k]
b1e0: 2e 70 45 78 70 72 20 3d 20 30 3b 0a 20 20 20 20  .pExpr = 0;.    
b1f0: 20 20 20 20 61 5b 6b 5d 2e 7a 4e 61 6d 65 20 3d      a[k].zName =
b200: 20 30 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b   0;.      }else{
b210: 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68 69 73  .        /* This
b220: 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 61   expression is a
b230: 20 22 2a 22 20 6f 72 20 61 20 22 54 41 42 4c 45   "*" or a "TABLE
b240: 2e 2a 22 20 61 6e 64 20 6e 65 65 64 73 20 74 6f  .*" and needs to
b250: 20 62 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 65   be.        ** e
b260: 78 70 61 6e 64 65 64 2e 20 2a 2f 0a 20 20 20 20  xpanded. */.    
b270: 20 20 20 20 69 6e 74 20 74 61 62 6c 65 53 65 65      int tableSee
b280: 6e 20 3d 20 30 3b 20 20 20 20 20 20 2f 2a 20 53  n = 0;      /* S
b290: 65 74 20 74 6f 20 31 20 77 68 65 6e 20 54 41 42  et to 1 when TAB
b2a0: 4c 45 20 6d 61 74 63 68 65 73 20 2a 2f 0a 20 20  LE matches */.  
b2b0: 20 20 20 20 20 20 63 68 61 72 20 2a 7a 54 4e 61        char *zTNa
b2c0: 6d 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  me;            /
b2d0: 2a 20 74 65 78 74 20 6f 66 20 6e 61 6d 65 20 6f  * text of name o
b2e0: 66 20 54 41 42 4c 45 20 2a 2f 0a 20 20 20 20 20  f TABLE */.     
b2f0: 20 20 20 69 66 28 20 70 45 2d 3e 6f 70 3d 3d 54     if( pE->op==T
b300: 4b 5f 44 4f 54 20 26 26 20 70 45 2d 3e 70 4c 65  K_DOT && pE->pLe
b310: 66 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ft ){.          
b320: 7a 54 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33  zTName = sqlite3
b330: 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 64 62  NameFromToken(db
b340: 2c 20 26 70 45 2d 3e 70 4c 65 66 74 2d 3e 74 6f  , &pE->pLeft->to
b350: 6b 65 6e 29 3b 0a 20 20 20 20 20 20 20 20 7d 65  ken);.        }e
b360: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 7a  lse{.          z
b370: 54 4e 61 6d 65 20 3d 20 30 3b 0a 20 20 20 20 20  TName = 0;.     
b380: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 66 6f 72     }.        for
b390: 28 69 3d 30 2c 20 70 46 72 6f 6d 3d 70 54 61 62  (i=0, pFrom=pTab
b3a0: 4c 69 73 74 2d 3e 61 3b 20 69 3c 70 54 61 62 4c  List->a; i<pTabL
b3b0: 69 73 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b 2c 20  ist->nSrc; i++, 
b3c0: 70 46 72 6f 6d 2b 2b 29 7b 0a 20 20 20 20 20 20  pFrom++){.      
b3d0: 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20      Table *pTab 
b3e0: 3d 20 70 46 72 6f 6d 2d 3e 70 54 61 62 3b 0a 20  = pFrom->pTab;. 
b3f0: 20 20 20 20 20 20 20 20 20 63 68 61 72 20 2a 7a           char *z
b400: 54 61 62 4e 61 6d 65 20 3d 20 70 46 72 6f 6d 2d  TabName = pFrom-
b410: 3e 7a 41 6c 69 61 73 3b 0a 20 20 20 20 20 20 20  >zAlias;.       
b420: 20 20 20 69 66 28 20 7a 54 61 62 4e 61 6d 65 3d     if( zTabName=
b430: 3d 30 20 7c 7c 20 7a 54 61 62 4e 61 6d 65 5b 30  =0 || zTabName[0
b440: 5d 3d 3d 30 20 29 7b 20 0a 20 20 20 20 20 20 20  ]==0 ){ .       
b450: 20 20 20 20 20 7a 54 61 62 4e 61 6d 65 20 3d 20       zTabName = 
b460: 70 54 61 62 2d 3e 7a 4e 61 6d 65 3b 0a 20 20 20  pTab->zName;.   
b470: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
b480: 20 20 20 61 73 73 65 72 74 28 20 7a 54 61 62 4e     assert( zTabN
b490: 61 6d 65 20 29 3b 0a 20 20 20 20 20 20 20 20 20  ame );.         
b4a0: 20 69 66 28 20 7a 54 4e 61 6d 65 20 26 26 20 73   if( zTName && s
b4b0: 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 7a 54  qlite3StrICmp(zT
b4c0: 4e 61 6d 65 2c 20 7a 54 61 62 4e 61 6d 65 29 21  Name, zTabName)!
b4d0: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
b4e0: 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20    continue;.    
b4f0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
b500: 20 20 74 61 62 6c 65 53 65 65 6e 20 3d 20 31 3b    tableSeen = 1;
b510: 0a 20 20 20 20 20 20 20 20 20 20 66 6f 72 28 6a  .          for(j
b520: 3d 30 3b 20 6a 3c 70 54 61 62 2d 3e 6e 43 6f 6c  =0; j<pTab->nCol
b530: 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; j++){.        
b540: 20 20 20 20 45 78 70 72 20 2a 70 45 78 70 72 2c      Expr *pExpr,
b550: 20 2a 70 52 69 67 68 74 3b 0a 20 20 20 20 20 20   *pRight;.      
b560: 20 20 20 20 20 20 63 68 61 72 20 2a 7a 4e 61 6d        char *zNam
b570: 65 20 3d 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 6a  e = pTab->aCol[j
b580: 5d 2e 7a 4e 61 6d 65 3b 0a 0a 20 20 20 20 20 20  ].zName;..      
b590: 20 20 20 20 20 20 2f 2a 20 49 66 20 61 20 63 6f        /* If a co
b5a0: 6c 75 6d 6e 20 69 73 20 6d 61 72 6b 65 64 20 61  lumn is marked a
b5b0: 73 20 27 68 69 64 64 65 6e 27 20 28 63 75 72 72  s 'hidden' (curr
b5c0: 65 6e 74 6c 79 20 6f 6e 6c 79 20 70 6f 73 73 69  ently only possi
b5d0: 62 6c 65 0a 20 20 20 20 20 20 20 20 20 20 20 20  ble.            
b5e0: 2a 2a 20 66 6f 72 20 76 69 72 74 75 61 6c 20 74  ** for virtual t
b5f0: 61 62 6c 65 73 29 2c 20 64 6f 20 6e 6f 74 20 69  ables), do not i
b600: 6e 63 6c 75 64 65 20 69 74 20 69 6e 20 74 68 65  nclude it in the
b610: 20 65 78 70 61 6e 64 65 64 0a 20 20 20 20 20 20   expanded.      
b620: 20 20 20 20 20 20 2a 2a 20 72 65 73 75 6c 74 2d        ** result-
b630: 73 65 74 20 6c 69 73 74 2e 0a 20 20 20 20 20 20  set list..      
b640: 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
b650: 20 20 20 20 20 69 66 28 20 49 73 48 69 64 64 65       if( IsHidde
b660: 6e 43 6f 6c 75 6d 6e 28 26 70 54 61 62 2d 3e 61  nColumn(&pTab->a
b670: 43 6f 6c 5b 6a 5d 29 20 29 7b 0a 20 20 20 20 20  Col[j]) ){.     
b680: 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28           assert(
b690: 49 73 56 69 72 74 75 61 6c 28 70 54 61 62 29 29  IsVirtual(pTab))
b6a0: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
b6b0: 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
b6c0: 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20        }..       
b6d0: 20 20 20 20 20 69 66 28 20 69 3e 30 20 29 7b 0a       if( i>0 ){.
b6e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 74                st
b6f0: 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65  ruct SrcList_ite
b700: 6d 20 2a 70 4c 65 66 74 20 3d 20 26 70 54 61 62  m *pLeft = &pTab
b710: 4c 69 73 74 2d 3e 61 5b 69 2d 31 5d 3b 0a 20 20  List->a[i-1];.  
b720: 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
b730: 28 70 4c 65 66 74 5b 31 5d 2e 6a 6f 69 6e 74 79  (pLeft[1].jointy
b740: 70 65 20 26 20 4a 54 5f 4e 41 54 55 52 41 4c 29  pe & JT_NATURAL)
b750: 21 3d 30 20 26 26 0a 20 20 20 20 20 20 20 20 20  !=0 &&.         
b760: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 63                 c
b770: 6f 6c 75 6d 6e 49 6e 64 65 78 28 70 4c 65 66 74  olumnIndex(pLeft
b780: 2d 3e 70 54 61 62 2c 20 7a 4e 61 6d 65 29 3e 3d  ->pTab, zName)>=
b790: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  0 ){.           
b7a0: 20 20 20 20 20 2f 2a 20 49 6e 20 61 20 4e 41 54       /* In a NAT
b7b0: 55 52 41 4c 20 6a 6f 69 6e 2c 20 6f 6d 69 74 20  URAL join, omit 
b7c0: 74 68 65 20 6a 6f 69 6e 20 63 6f 6c 75 6d 6e 73  the join columns
b7d0: 20 66 72 6f 6d 20 74 68 65 20 0a 20 20 20 20 20   from the .     
b7e0: 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 74 61             ** ta
b7f0: 62 6c 65 20 6f 6e 20 74 68 65 20 72 69 67 68 74  ble on the right
b800: 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20   */.            
b810: 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20      continue;.  
b820: 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
b830: 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
b840: 73 71 6c 69 74 65 33 49 64 4c 69 73 74 49 6e 64  sqlite3IdListInd
b850: 65 78 28 70 4c 65 66 74 5b 31 5d 2e 70 55 73 69  ex(pLeft[1].pUsi
b860: 6e 67 2c 20 7a 4e 61 6d 65 29 3e 3d 30 20 29 7b  ng, zName)>=0 ){
b870: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
b880: 20 2f 2a 20 49 6e 20 61 20 6a 6f 69 6e 20 77 69   /* In a join wi
b890: 74 68 20 61 20 55 53 49 4e 47 20 63 6c 61 75 73  th a USING claus
b8a0: 65 2c 20 6f 6d 69 74 20 63 6f 6c 75 6d 6e 73 20  e, omit columns 
b8b0: 69 6e 20 74 68 65 0a 20 20 20 20 20 20 20 20 20  in the.         
b8c0: 20 20 20 20 20 20 20 2a 2a 20 75 73 69 6e 67 20         ** using 
b8d0: 63 6c 61 75 73 65 20 66 72 6f 6d 20 74 68 65 20  clause from the 
b8e0: 74 61 62 6c 65 20 6f 6e 20 74 68 65 20 72 69 67  table on the rig
b8f0: 68 74 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  ht. */.         
b900: 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b         continue;
b910: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d  .              }
b920: 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20  .            }. 
b930: 20 20 20 20 20 20 20 20 20 20 20 70 52 69 67 68             pRigh
b940: 74 20 3d 20 73 71 6c 69 74 65 33 50 45 78 70 72  t = sqlite3PExpr
b950: 28 70 50 61 72 73 65 2c 20 54 4b 5f 49 44 2c 20  (pParse, TK_ID, 
b960: 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20  0, 0, 0);.      
b970: 20 20 20 20 20 20 69 66 28 20 70 52 69 67 68 74        if( pRight
b980: 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  ==0 ) break;.   
b990: 20 20 20 20 20 20 20 20 20 73 65 74 51 75 6f 74           setQuot
b9a0: 65 64 54 6f 6b 65 6e 28 70 50 61 72 73 65 2c 20  edToken(pParse, 
b9b0: 26 70 52 69 67 68 74 2d 3e 74 6f 6b 65 6e 2c 20  &pRight->token, 
b9c0: 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20  zName);.        
b9d0: 20 20 20 20 69 66 28 20 6c 6f 6e 67 4e 61 6d 65      if( longName
b9e0: 73 20 7c 7c 20 70 54 61 62 4c 69 73 74 2d 3e 6e  s || pTabList->n
b9f0: 53 72 63 3e 31 20 29 7b 0a 20 20 20 20 20 20 20  Src>1 ){.       
ba00: 20 20 20 20 20 20 20 45 78 70 72 20 2a 70 4c 65         Expr *pLe
ba10: 66 74 20 3d 20 73 71 6c 69 74 65 33 50 45 78 70  ft = sqlite3PExp
ba20: 72 28 70 50 61 72 73 65 2c 20 54 4b 5f 49 44 2c  r(pParse, TK_ID,
ba30: 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20   0, 0, 0);.     
ba40: 20 20 20 20 20 20 20 20 20 70 45 78 70 72 20 3d           pExpr =
ba50: 20 73 71 6c 69 74 65 33 50 45 78 70 72 28 70 50   sqlite3PExpr(pP
ba60: 61 72 73 65 2c 20 54 4b 5f 44 4f 54 2c 20 70 4c  arse, TK_DOT, pL
ba70: 65 66 74 2c 20 70 52 69 67 68 74 2c 20 30 29 3b  eft, pRight, 0);
ba80: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69  .              i
ba90: 66 28 20 70 45 78 70 72 3d 3d 30 20 29 20 62 72  f( pExpr==0 ) br
baa0: 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 20  eak;.           
bab0: 20 20 20 73 65 74 51 75 6f 74 65 64 54 6f 6b 65     setQuotedToke
bac0: 6e 28 70 50 61 72 73 65 2c 20 26 70 4c 65 66 74  n(pParse, &pLeft
bad0: 2d 3e 74 6f 6b 65 6e 2c 20 7a 54 61 62 4e 61 6d  ->token, zTabNam
bae0: 65 29 3b 0a 23 69 66 20 31 0a 20 20 20 20 20 20  e);.#if 1.      
baf0: 20 20 20 20 20 20 20 20 73 65 74 54 6f 6b 65 6e          setToken
bb00: 28 26 70 45 78 70 72 2d 3e 73 70 61 6e 2c 20 0a  (&pExpr->span, .
bb10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bb20: 20 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66    sqlite3MPrintf
bb30: 28 64 62 2c 20 22 25 73 2e 25 73 22 2c 20 7a 54  (db, "%s.%s", zT
bb40: 61 62 4e 61 6d 65 2c 20 7a 4e 61 6d 65 29 29 3b  abName, zName));
bb50: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70  .              p
bb60: 45 78 70 72 2d 3e 73 70 61 6e 2e 64 79 6e 20 3d  Expr->span.dyn =
bb70: 20 31 3b 0a 23 65 6c 73 65 0a 20 20 20 20 20 20   1;.#else.      
bb80: 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 73          pExpr->s
bb90: 70 61 6e 20 3d 20 70 52 69 67 68 74 2d 3e 74 6f  pan = pRight->to
bba0: 6b 65 6e 3b 0a 20 20 20 20 20 20 20 20 20 20 20  ken;.           
bbb0: 20 20 20 70 45 78 70 72 2d 3e 73 70 61 6e 2e 64     pExpr->span.d
bbc0: 79 6e 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 20  yn = 0;.#endif. 
bbd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 70 45 78               pEx
bbe0: 70 72 2d 3e 74 6f 6b 65 6e 2e 7a 20 3d 20 30 3b  pr->token.z = 0;
bbf0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70  .              p
bc00: 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 6e 20 3d 20  Expr->token.n = 
bc10: 30 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  0;.             
bc20: 20 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 64 79   pExpr->token.dy
bc30: 6e 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20  n = 0;.         
bc40: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
bc50: 20 20 20 20 20 20 20 20 70 45 78 70 72 20 3d 20          pExpr = 
bc60: 70 52 69 67 68 74 3b 0a 20 20 20 20 20 20 20 20  pRight;.        
bc70: 20 20 20 20 20 20 70 45 78 70 72 2d 3e 73 70 61        pExpr->spa
bc80: 6e 20 3d 20 70 45 78 70 72 2d 3e 74 6f 6b 65 6e  n = pExpr->token
bc90: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
bca0: 70 45 78 70 72 2d 3e 73 70 61 6e 2e 64 79 6e 20  pExpr->span.dyn 
bcb0: 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 20  = 0;.           
bcc0: 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 69   }.            i
bcd0: 66 28 20 6c 6f 6e 67 4e 61 6d 65 73 20 29 7b 0a  f( longNames ){.
bce0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 4e                pN
bcf0: 65 77 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  ew = sqlite3Expr
bd00: 4c 69 73 74 41 70 70 65 6e 64 28 70 50 61 72 73  ListAppend(pPars
bd10: 65 2c 20 70 4e 65 77 2c 20 70 45 78 70 72 2c 20  e, pNew, pExpr, 
bd20: 26 70 45 78 70 72 2d 3e 73 70 61 6e 29 3b 0a 20  &pExpr->span);. 
bd30: 20 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65             }else
bd40: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
bd50: 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 45 78  pNew = sqlite3Ex
bd60: 70 72 4c 69 73 74 41 70 70 65 6e 64 28 70 50 61  prListAppend(pPa
bd70: 72 73 65 2c 20 70 4e 65 77 2c 20 70 45 78 70 72  rse, pNew, pExpr
bd80: 2c 20 26 70 52 69 67 68 74 2d 3e 74 6f 6b 65 6e  , &pRight->token
bd90: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  );.            }
bda0: 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
bdb0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69       }.        i
bdc0: 66 28 20 21 74 61 62 6c 65 53 65 65 6e 20 29 7b  f( !tableSeen ){
bdd0: 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 7a  .          if( z
bde0: 54 4e 61 6d 65 20 29 7b 0a 20 20 20 20 20 20 20  TName ){.       
bdf0: 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f       sqlite3Erro
be00: 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 6e 6f  rMsg(pParse, "no
be10: 20 73 75 63 68 20 74 61 62 6c 65 3a 20 25 73 22   such table: %s"
be20: 2c 20 7a 54 4e 61 6d 65 29 3b 0a 20 20 20 20 20  , zTName);.     
be30: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
be40: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
be50: 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
be60: 22 6e 6f 20 74 61 62 6c 65 73 20 73 70 65 63 69  "no tables speci
be70: 66 69 65 64 22 29 3b 0a 20 20 20 20 20 20 20 20  fied");.        
be80: 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 72 63    }.          rc
be90: 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 7d 0a   = 1;.        }.
bea0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
beb0: 66 72 65 65 28 7a 54 4e 61 6d 65 29 3b 0a 20 20  free(zTName);.  
bec0: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
bed0: 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44  sqlite3ExprListD
bee0: 65 6c 65 74 65 28 70 45 4c 69 73 74 29 3b 0a 20  elete(pEList);. 
bef0: 20 20 20 70 2d 3e 70 45 4c 69 73 74 20 3d 20 70     p->pEList = p
bf00: 4e 65 77 3b 0a 20 20 7d 0a 23 69 66 20 53 51 4c  New;.  }.#if SQL
bf10: 49 54 45 5f 4d 41 58 5f 43 4f 4c 55 4d 4e 0a 20  ITE_MAX_COLUMN. 
bf20: 20 69 66 28 20 70 2d 3e 70 45 4c 69 73 74 20 26   if( p->pEList &
bf30: 26 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78  & p->pEList->nEx
bf40: 70 72 3e 64 62 2d 3e 61 4c 69 6d 69 74 5b 53 51  pr>db->aLimit[SQ
bf50: 4c 49 54 45 5f 4c 49 4d 49 54 5f 43 4f 4c 55 4d  LITE_LIMIT_COLUM
bf60: 4e 5d 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  N] ){.    sqlite
bf70: 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
bf80: 2c 20 22 74 6f 6f 20 6d 61 6e 79 20 63 6f 6c 75  , "too many colu
bf90: 6d 6e 73 20 69 6e 20 72 65 73 75 6c 74 20 73 65  mns in result se
bfa0: 74 22 29 3b 0a 20 20 20 20 72 63 20 3d 20 53 51  t");.    rc = SQ
bfb0: 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a  LITE_ERROR;.  }.
bfc0: 23 65 6e 64 69 66 0a 20 20 69 66 28 20 64 62 2d  #endif.  if( db-
bfd0: 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b  >mallocFailed ){
bfe0: 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45  .    rc = SQLITE
bff0: 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20 72 65  _NOMEM;.  }.  re
c000: 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
c010: 2a 20 70 45 20 69 73 20 61 20 70 6f 69 6e 74 65  * pE is a pointe
c020: 72 20 74 6f 20 61 6e 20 65 78 70 72 65 73 73 69  r to an expressi
c030: 6f 6e 20 77 68 69 63 68 20 69 73 20 61 20 73 69  on which is a si
c040: 6e 67 6c 65 20 74 65 72 6d 20 69 6e 0a 2a 2a 20  ngle term in.** 
c050: 4f 52 44 45 52 20 42 59 20 6f 72 20 47 52 4f 55  ORDER BY or GROU
c060: 50 20 42 59 20 63 6c 61 75 73 65 2e 0a 2a 2a 0a  P BY clause..**.
c070: 2a 2a 20 41 74 20 74 68 65 20 70 6f 69 6e 74 20  ** At the point 
c080: 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  this routine is 
c090: 63 61 6c 6c 65 64 2c 20 77 65 20 61 6c 72 65 61  called, we alrea
c0a0: 64 79 20 6b 6e 6f 77 20 74 68 61 74 20 74 68 65  dy know that the
c0b0: 0a 2a 2a 20 4f 52 44 45 52 20 42 59 20 74 65 72  .** ORDER BY ter
c0c0: 6d 20 69 73 20 6e 6f 74 20 61 6e 20 69 6e 74 65  m is not an inte
c0d0: 67 65 72 20 69 6e 64 65 78 20 69 6e 74 6f 20 74  ger index into t
c0e0: 68 65 20 72 65 73 75 6c 74 20 73 65 74 2e 20 20  he result set.  
c0f0: 54 68 61 74 0a 2a 2a 20 63 61 73 65 65 20 69 73  That.** casee is
c100: 20 68 61 6e 64 6c 65 64 20 62 79 20 74 68 65 20   handled by the 
c110: 63 61 6c 6c 69 6e 67 20 72 6f 75 74 69 6e 65 2e  calling routine.
c120: 0a 2a 2a 0a 2a 2a 20 49 66 20 70 45 20 69 73 20  .**.** If pE is 
c130: 61 20 77 65 6c 6c 2d 66 6f 72 6d 65 64 20 65 78  a well-formed ex
c140: 70 72 65 73 73 69 6f 6e 20 61 6e 64 20 74 68 65  pression and the
c150: 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
c160: 74 0a 2a 2a 20 69 73 20 6e 6f 74 20 63 6f 6d 70  t.** is not comp
c170: 6f 75 6e 64 2c 20 74 68 65 6e 20 72 65 74 75 72  ound, then retur
c180: 6e 20 30 2e 20 20 54 68 69 73 20 69 6e 64 69 63  n 0.  This indic
c190: 61 74 65 73 20 74 6f 20 74 68 65 0a 2a 2a 20 63  ates to the.** c
c1a0: 61 6c 6c 65 72 20 74 68 61 74 20 69 74 20 73 68  aller that it sh
c1b0: 6f 75 6c 64 20 73 6f 72 74 20 62 79 20 74 68 65  ould sort by the
c1c0: 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 4f 52   value of the OR
c1d0: 44 45 52 20 42 59 0a 2a 2a 20 65 78 70 72 65 73  DER BY.** expres
c1e0: 73 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  sion..**.** If t
c1f0: 68 65 20 53 45 4c 45 43 54 20 69 73 20 63 6f 6d  he SELECT is com
c200: 70 6f 75 6e 64 2c 20 74 68 65 6e 20 61 74 74 65  pound, then atte
c210: 6d 70 74 20 74 6f 20 6d 61 74 63 68 20 70 45 20  mpt to match pE 
c220: 61 67 61 69 6e 73 74 0a 2a 2a 20 72 65 73 75 6c  against.** resul
c230: 74 20 73 65 74 20 63 6f 6c 75 6d 6e 73 20 69 6e  t set columns in
c240: 20 74 68 65 20 6c 65 66 74 2d 6d 6f 73 74 20 53   the left-most S
c250: 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 2e  ELECT statement.
c260: 20 20 52 65 74 75 72 6e 0a 2a 2a 20 74 68 65 20    Return.** the 
c270: 69 6e 64 65 78 20 69 20 6f 66 20 74 68 65 20 6d  index i of the m
c280: 61 74 63 68 69 6e 67 20 63 6f 6c 75 6d 6e 2c 20  atching column, 
c290: 61 73 20 61 6e 20 69 6e 64 69 63 61 74 69 6f 6e  as an indication
c2a0: 20 74 6f 20 74 68 65 20 0a 2a 2a 20 63 61 6c 6c   to the .** call
c2b0: 65 72 20 74 68 61 74 20 69 74 20 73 68 6f 75 6c  er that it shoul
c2c0: 64 20 73 6f 72 74 20 62 79 20 74 68 65 20 69 2d  d sort by the i-
c2d0: 74 68 20 63 6f 6c 75 6d 6e 2e 20 20 49 66 20 74  th column.  If t
c2e0: 68 65 72 65 20 69 73 0a 2a 2a 20 6e 6f 20 6d 61  here is.** no ma
c2f0: 74 63 68 2c 20 72 65 74 75 72 6e 20 2d 31 20 61  tch, return -1 a
c300: 6e 64 20 6c 65 61 76 65 20 61 6e 20 65 72 72 6f  nd leave an erro
c310: 72 20 6d 65 73 73 61 67 65 20 69 6e 20 70 50 61  r message in pPa
c320: 72 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  rse..*/.static i
c330: 6e 74 20 6d 61 74 63 68 4f 72 64 65 72 42 79 54  nt matchOrderByT
c340: 65 72 6d 54 6f 45 78 70 72 4c 69 73 74 28 0a 20  ermToExprList(. 
c350: 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
c360: 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63      /* Parsing c
c370: 6f 6e 74 65 78 74 20 66 6f 72 20 65 72 72 6f 72  ontext for error
c380: 20 6d 65 73 73 61 67 65 73 20 2a 2f 0a 20 20 53   messages */.  S
c390: 65 6c 65 63 74 20 2a 70 53 65 6c 65 63 74 2c 20  elect *pSelect, 
c3a0: 20 20 2f 2a 20 54 68 65 20 53 45 4c 45 43 54 20    /* The SELECT 
c3b0: 73 74 61 74 65 6d 65 6e 74 20 77 69 74 68 20 74  statement with t
c3c0: 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75  he ORDER BY clau
c3d0: 73 65 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 45  se */.  Expr *pE
c3e0: 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68  ,          /* Th
c3f0: 65 20 73 70 65 63 69 66 69 63 20 4f 52 44 45 52  e specific ORDER
c400: 20 42 59 20 74 65 72 6d 20 2a 2f 0a 20 20 69 6e   BY term */.  in
c410: 74 20 69 64 78 2c 20 20 20 20 20 20 20 20 20 20  t idx,          
c420: 20 2f 2a 20 57 68 65 6e 20 4f 52 44 45 52 20 42   /* When ORDER B
c430: 59 20 74 65 72 6d 20 69 73 20 74 68 69 73 20 2a  Y term is this *
c440: 2f 0a 20 20 69 6e 74 20 69 73 43 6f 6d 70 6f 75  /.  int isCompou
c450: 6e 64 2c 20 20 20 20 2f 2a 20 54 72 75 65 20 69  nd,    /* True i
c460: 66 20 74 68 69 73 20 69 73 20 61 20 63 6f 6d 70  f this is a comp
c470: 6f 75 6e 64 20 53 45 4c 45 43 54 20 2a 2f 0a 20  ound SELECT */. 
c480: 20 75 38 20 2a 70 48 61 73 41 67 67 20 20 20 20   u8 *pHasAgg    
c490: 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 65      /* True if e
c4a0: 78 70 72 65 73 73 69 6f 6e 20 63 6f 6e 74 61 69  xpression contai
c4b0: 6e 73 20 61 67 67 72 65 67 61 74 65 20 66 75 6e  ns aggregate fun
c4c0: 63 74 69 6f 6e 73 20 2a 2f 0a 29 7b 0a 20 20 69  ctions */.){.  i
c4d0: 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20 20 20  nt i;           
c4e0: 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65    /* Loop counte
c4f0: 72 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20  r */.  ExprList 
c500: 2a 70 45 4c 69 73 74 3b 20 20 2f 2a 20 54 68 65  *pEList;  /* The
c510: 20 63 6f 6c 75 6d 6e 73 20 6f 66 20 74 68 65 20   columns of the 
c520: 72 65 73 75 6c 74 20 73 65 74 20 2a 2f 0a 20 20  result set */.  
c530: 4e 61 6d 65 43 6f 6e 74 65 78 74 20 6e 63 3b 20  NameContext nc; 
c540: 20 20 20 2f 2a 20 4e 61 6d 65 20 63 6f 6e 74 65     /* Name conte
c550: 78 74 20 66 6f 72 20 72 65 73 6f 6c 76 69 6e 67  xt for resolving
c560: 20 70 45 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74   pE */..  assert
c570: 28 20 73 71 6c 69 74 65 33 45 78 70 72 49 73 49  ( sqlite3ExprIsI
c580: 6e 74 65 67 65 72 28 70 45 2c 20 26 69 29 3d 3d  nteger(pE, &i)==
c590: 30 20 29 3b 0a 20 20 70 45 4c 69 73 74 20 3d 20  0 );.  pEList = 
c5a0: 70 53 65 6c 65 63 74 2d 3e 70 45 4c 69 73 74 3b  pSelect->pEList;
c5b0: 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 74 65  ..  /* If the te
c5c0: 72 6d 20 69 73 20 61 20 73 69 6d 70 6c 65 20 69  rm is a simple i
c5d0: 64 65 6e 74 69 66 69 65 72 20 74 68 61 74 20 74  dentifier that t
c5e0: 72 79 20 74 6f 20 6d 61 74 63 68 20 74 68 61 74  ry to match that
c5f0: 20 69 64 65 6e 74 69 66 69 65 72 0a 20 20 2a 2a   identifier.  **
c600: 20 61 67 61 69 6e 73 74 20 61 20 63 6f 6c 75 6d   against a colum
c610: 6e 20 6e 61 6d 65 20 69 6e 20 74 68 65 20 72 65  n name in the re
c620: 73 75 6c 74 20 73 65 74 2e 0a 20 20 2a 2f 0a 20  sult set..  */. 
c630: 20 69 66 28 20 70 45 2d 3e 6f 70 3d 3d 54 4b 5f   if( pE->op==TK_
c640: 49 44 20 7c 7c 20 28 70 45 2d 3e 6f 70 3d 3d 54  ID || (pE->op==T
c650: 4b 5f 53 54 52 49 4e 47 20 26 26 20 70 45 2d 3e  K_STRING && pE->
c660: 74 6f 6b 65 6e 2e 7a 5b 30 5d 21 3d 27 5c 27 27  token.z[0]!='\''
c670: 29 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  ) ){.    sqlite3
c680: 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64   *db = pParse->d
c690: 62 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a 43 6f  b;.    char *zCo
c6a0: 6c 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65 46  l = sqlite3NameF
c6b0: 72 6f 6d 54 6f 6b 65 6e 28 64 62 2c 20 26 70 45  romToken(db, &pE
c6c0: 2d 3e 74 6f 6b 65 6e 29 3b 0a 20 20 20 20 69 66  ->token);.    if
c6d0: 28 20 7a 43 6f 6c 3d 3d 30 20 29 7b 0a 20 20 20  ( zCol==0 ){.   
c6e0: 20 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20     return -1;.  
c6f0: 20 20 7d 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b    }.    for(i=0;
c700: 20 69 3c 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72   i<pEList->nExpr
c710: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 63 68  ; i++){.      ch
c720: 61 72 20 2a 7a 41 73 20 3d 20 70 45 4c 69 73 74  ar *zAs = pEList
c730: 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 3b 0a 20 20  ->a[i].zName;.  
c740: 20 20 20 20 69 66 28 20 7a 41 73 21 3d 30 20 26      if( zAs!=0 &
c750: 26 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70  & sqlite3StrICmp
c760: 28 7a 41 73 2c 20 7a 43 6f 6c 29 3d 3d 30 20 29  (zAs, zCol)==0 )
c770: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
c780: 33 5f 66 72 65 65 28 7a 43 6f 6c 29 3b 0a 20 20  3_free(zCol);.  
c790: 20 20 20 20 20 20 72 65 74 75 72 6e 20 69 2b 31        return i+1
c7a0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
c7b0: 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
c7c0: 28 7a 43 6f 6c 29 3b 0a 20 20 7d 0a 0a 20 20 2f  (zCol);.  }..  /
c7d0: 2a 20 52 65 73 6f 6c 76 65 20 61 6c 6c 20 6e 61  * Resolve all na
c7e0: 6d 65 73 20 69 6e 20 74 68 65 20 4f 52 44 45 52  mes in the ORDER
c7f0: 20 42 59 20 74 65 72 6d 20 65 78 70 72 65 73 73   BY term express
c800: 69 6f 6e 0a 20 20 2a 2f 0a 20 20 6d 65 6d 73 65  ion.  */.  memse
c810: 74 28 26 6e 63 2c 20 30 2c 20 73 69 7a 65 6f 66  t(&nc, 0, sizeof
c820: 28 6e 63 29 29 3b 0a 20 20 6e 63 2e 70 50 61 72  (nc));.  nc.pPar
c830: 73 65 20 3d 20 70 50 61 72 73 65 3b 0a 20 20 6e  se = pParse;.  n
c840: 63 2e 70 53 72 63 4c 69 73 74 20 3d 20 70 53 65  c.pSrcList = pSe
c850: 6c 65 63 74 2d 3e 70 53 72 63 3b 0a 20 20 6e 63  lect->pSrc;.  nc
c860: 2e 70 45 4c 69 73 74 20 3d 20 70 45 4c 69 73 74  .pEList = pEList
c870: 3b 0a 20 20 6e 63 2e 61 6c 6c 6f 77 41 67 67 20  ;.  nc.allowAgg 
c880: 3d 20 31 3b 0a 20 20 6e 63 2e 6e 45 72 72 20 3d  = 1;.  nc.nErr =
c890: 20 30 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65   0;.  if( sqlite
c8a0: 33 45 78 70 72 52 65 73 6f 6c 76 65 4e 61 6d 65  3ExprResolveName
c8b0: 73 28 26 6e 63 2c 20 70 45 29 20 29 7b 0a 20 20  s(&nc, pE) ){.  
c8c0: 20 20 69 66 28 20 69 73 43 6f 6d 70 6f 75 6e 64    if( isCompound
c8d0: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
c8e0: 33 45 72 72 6f 72 43 6c 65 61 72 28 70 50 61 72  3ErrorClear(pPar
c8f0: 73 65 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  se);.      retur
c900: 6e 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  n 0;.    }else{.
c910: 20 20 20 20 20 20 72 65 74 75 72 6e 20 2d 31 3b        return -1;
c920: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28  .    }.  }.  if(
c930: 20 6e 63 2e 68 61 73 41 67 67 20 26 26 20 70 48   nc.hasAgg && pH
c940: 61 73 41 67 67 20 29 7b 0a 20 20 20 20 2a 70 48  asAgg ){.    *pH
c950: 61 73 41 67 67 20 3d 20 31 3b 0a 20 20 7d 0a 0a  asAgg = 1;.  }..
c960: 20 20 2f 2a 20 46 6f 72 20 61 20 63 6f 6d 70 6f    /* For a compo
c970: 75 6e 64 20 53 45 4c 45 43 54 2c 20 77 65 20 6e  und SELECT, we n
c980: 65 65 64 20 74 6f 20 74 72 79 20 74 6f 20 6d 61  eed to try to ma
c990: 74 63 68 20 74 68 65 20 4f 52 44 45 52 20 42 59  tch the ORDER BY
c9a0: 0a 20 20 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e  .  ** expression
c9b0: 20 61 67 61 69 6e 73 74 20 61 6e 20 65 78 70 72   against an expr
c9c0: 65 73 73 69 6f 6e 20 69 6e 20 74 68 65 20 72 65  ession in the re
c9d0: 73 75 6c 74 20 73 65 74 0a 20 20 2a 2f 0a 20 20  sult set.  */.  
c9e0: 69 66 28 20 69 73 43 6f 6d 70 6f 75 6e 64 20 29  if( isCompound )
c9f0: 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  {.    for(i=0; i
ca00: 3c 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20  <pEList->nExpr; 
ca10: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20  i++){.      if( 
ca20: 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6d 70 61  sqlite3ExprCompa
ca30: 72 65 28 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e  re(pEList->a[i].
ca40: 70 45 78 70 72 2c 20 70 45 29 20 29 7b 0a 20 20  pExpr, pE) ){.  
ca50: 20 20 20 20 20 20 72 65 74 75 72 6e 20 69 2b 31        return i+1
ca60: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
ca70: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a    }.  return 0;.
ca80: 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 41 6e 61 6c 79 7a  }.../*.** Analyz
ca90: 65 20 61 6e 64 20 4f 52 44 45 52 20 42 59 20 6f  e and ORDER BY o
caa0: 72 20 47 52 4f 55 50 20 42 59 20 63 6c 61 75 73  r GROUP BY claus
cab0: 65 20 69 6e 20 61 20 73 69 6d 70 6c 65 20 53 45  e in a simple SE
cac0: 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 2e 0a  LECT statement..
cad0: 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75  ** Return the nu
cae0: 6d 62 65 72 20 6f 66 20 65 72 72 6f 72 73 20 73  mber of errors s
caf0: 65 65 6e 2e 0a 2a 2a 0a 2a 2a 20 45 76 65 72 79  een..**.** Every
cb00: 20 74 65 72 6d 20 6f 66 20 74 68 65 20 4f 52 44   term of the ORD
cb10: 45 52 20 42 59 20 6f 72 20 47 52 4f 55 50 20 42  ER BY or GROUP B
cb20: 59 20 63 6c 61 75 73 65 20 6e 65 65 64 73 20 74  Y clause needs t
cb30: 6f 20 62 65 20 61 6e 0a 2a 2a 20 65 78 70 72 65  o be an.** expre
cb40: 73 73 69 6f 6e 2e 20 20 49 66 20 61 6e 79 20 65  ssion.  If any e
cb50: 78 70 72 65 73 73 69 6f 6e 20 69 73 20 61 6e 20  xpression is an 
cb60: 69 6e 74 65 67 65 72 20 63 6f 6e 73 74 61 6e 74  integer constant
cb70: 2c 20 74 68 65 6e 0a 2a 2a 20 74 68 61 74 20 65  , then.** that e
cb80: 78 70 72 65 73 73 69 6f 6e 20 69 73 20 72 65 70  xpression is rep
cb90: 6c 61 63 65 64 20 62 79 20 74 68 65 20 63 6f 72  laced by the cor
cba0: 72 65 73 70 6f 6e 64 69 6e 67 20 0a 2a 2a 20 65  responding .** e
cbb0: 78 70 72 65 73 73 69 6f 6e 20 66 72 6f 6d 20 74  xpression from t
cbc0: 68 65 20 72 65 73 75 6c 74 20 73 65 74 2e 0a 2a  he result set..*
cbd0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 72 6f  /.static int pro
cbe0: 63 65 73 73 4f 72 64 65 72 47 72 6f 75 70 42 79  cessOrderGroupBy
cbf0: 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
cc00: 65 2c 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72  e,        /* Par
cc10: 73 69 6e 67 20 63 6f 6e 74 65 78 74 2e 20 20 4c  sing context.  L
cc20: 65 61 76 65 20 65 72 72 6f 72 20 6d 65 73 73 61  eave error messa
cc30: 67 65 73 20 68 65 72 65 20 2a 2f 0a 20 20 53 65  ges here */.  Se
cc40: 6c 65 63 74 20 2a 70 53 65 6c 65 63 74 2c 20 20  lect *pSelect,  
cc50: 20 20 20 20 2f 2a 20 54 68 65 20 53 45 4c 45 43      /* The SELEC
cc60: 54 20 73 74 61 74 65 6d 65 6e 74 20 63 6f 6e 74  T statement cont
cc70: 61 69 6e 69 6e 67 20 74 68 65 20 63 6c 61 75 73  aining the claus
cc80: 65 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20  e */.  ExprList 
cc90: 2a 70 4f 72 64 65 72 42 79 2c 20 20 20 2f 2a 20  *pOrderBy,   /* 
cca0: 54 68 65 20 4f 52 44 45 52 20 42 59 20 6f 72 20  The ORDER BY or 
ccb0: 47 52 4f 55 50 20 42 59 20 63 6c 61 75 73 65 20  GROUP BY clause 
ccc0: 74 6f 20 62 65 20 70 72 6f 63 65 73 73 65 64 20  to be processed 
ccd0: 2a 2f 0a 20 20 69 6e 74 20 69 73 4f 72 64 65 72  */.  int isOrder
cce0: 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 31 20  ,          /* 1 
ccf0: 66 6f 72 20 4f 52 44 45 52 20 42 59 2e 20 20 30  for ORDER BY.  0
cd00: 20 66 6f 72 20 47 52 4f 55 50 20 42 59 20 2a 2f   for GROUP BY */
cd10: 0a 20 20 75 38 20 2a 70 48 61 73 41 67 67 20 20  .  u8 *pHasAgg  
cd20: 20 20 20 20 20 20 20 20 20 2f 2a 20 53 65 74 20           /* Set 
cd30: 74 6f 20 54 52 55 45 20 69 66 20 61 6e 79 20 74  to TRUE if any t
cd40: 65 72 6d 20 63 6f 6e 74 61 69 6e 73 20 61 6e 20  erm contains an 
cd50: 61 67 67 72 65 67 61 74 65 20 2a 2f 0a 29 7b 0a  aggregate */.){.
cd60: 20 20 69 6e 74 20 69 3b 0a 20 20 73 71 6c 69 74    int i;.  sqlit
cd70: 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d  e3 *db = pParse-
cd80: 3e 64 62 3b 0a 20 20 45 78 70 72 4c 69 73 74 20  >db;.  ExprList 
cd90: 2a 70 45 4c 69 73 74 3b 0a 0a 20 20 69 66 28 20  *pEList;..  if( 
cda0: 70 4f 72 64 65 72 42 79 3d 3d 30 20 7c 7c 20 70  pOrderBy==0 || p
cdb0: 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f  Parse->db->mallo
cdc0: 63 46 61 69 6c 65 64 20 29 20 72 65 74 75 72 6e  cFailed ) return
cdd0: 20 30 3b 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d   0;.#if SQLITE_M
cde0: 41 58 5f 43 4f 4c 55 4d 4e 0a 20 20 69 66 28 20  AX_COLUMN.  if( 
cdf0: 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 3e  pOrderBy->nExpr>
ce00: 64 62 2d 3e 61 4c 69 6d 69 74 5b 53 51 4c 49 54  db->aLimit[SQLIT
ce10: 45 5f 4c 49 4d 49 54 5f 43 4f 4c 55 4d 4e 5d 20  E_LIMIT_COLUMN] 
ce20: 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61  ){.    const cha
ce30: 72 20 2a 7a 54 79 70 65 20 3d 20 69 73 4f 72 64  r *zType = isOrd
ce40: 65 72 20 3f 20 22 4f 52 44 45 52 22 20 3a 20 22  er ? "ORDER" : "
ce50: 47 52 4f 55 50 22 3b 0a 20 20 20 20 73 71 6c 69  GROUP";.    sqli
ce60: 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
ce70: 73 65 2c 20 22 74 6f 6f 20 6d 61 6e 79 20 74 65  se, "too many te
ce80: 72 6d 73 20 69 6e 20 25 73 20 42 59 20 63 6c 61  rms in %s BY cla
ce90: 75 73 65 22 2c 20 7a 54 79 70 65 29 3b 0a 20 20  use", zType);.  
cea0: 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a    return 1;.  }.
ceb0: 23 65 6e 64 69 66 0a 20 20 70 45 4c 69 73 74 20  #endif.  pEList 
cec0: 3d 20 70 53 65 6c 65 63 74 2d 3e 70 45 4c 69 73  = pSelect->pELis
ced0: 74 3b 0a 20 20 69 66 28 20 70 45 4c 69 73 74 3d  t;.  if( pEList=
cee0: 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  =0 ){.    return
cef0: 20 30 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d   0;.  }.  for(i=
cf00: 30 3b 20 69 3c 70 4f 72 64 65 72 42 79 2d 3e 6e  0; i<pOrderBy->n
cf10: 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  Expr; i++){.    
cf20: 69 6e 74 20 69 43 6f 6c 3b 0a 20 20 20 20 45 78  int iCol;.    Ex
cf30: 70 72 20 2a 70 45 20 3d 20 70 4f 72 64 65 72 42  pr *pE = pOrderB
cf40: 79 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 20  y->a[i].pExpr;. 
cf50: 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 45 78     if( sqlite3Ex
cf60: 70 72 49 73 49 6e 74 65 67 65 72 28 70 45 2c 20  prIsInteger(pE, 
cf70: 26 69 43 6f 6c 29 20 29 7b 0a 20 20 20 20 20 20  &iCol) ){.      
cf80: 69 66 28 20 69 43 6f 6c 3c 3d 30 20 7c 7c 20 69  if( iCol<=0 || i
cf90: 43 6f 6c 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70  Col>pEList->nExp
cfa0: 72 20 29 7b 0a 20 20 20 20 20 20 20 20 63 6f 6e  r ){.        con
cfb0: 73 74 20 63 68 61 72 20 2a 7a 54 79 70 65 20 3d  st char *zType =
cfc0: 20 69 73 4f 72 64 65 72 20 3f 20 22 4f 52 44 45   isOrder ? "ORDE
cfd0: 52 22 20 3a 20 22 47 52 4f 55 50 22 3b 0a 20 20  R" : "GROUP";.  
cfe0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72        sqlite3Err
cff0: 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 0a 20  orMsg(pParse, . 
d000: 20 20 20 20 20 20 20 20 20 20 22 25 72 20 25 73            "%r %s
d010: 20 42 59 20 74 65 72 6d 20 6f 75 74 20 6f 66 20   BY term out of 
d020: 72 61 6e 67 65 20 2d 20 73 68 6f 75 6c 64 20 62  range - should b
d030: 65 20 22 0a 20 20 20 20 20 20 20 20 20 20 20 22  e ".           "
d040: 62 65 74 77 65 65 6e 20 31 20 61 6e 64 20 25 64  between 1 and %d
d050: 22 2c 20 69 2b 31 2c 20 7a 54 79 70 65 2c 20 70  ", i+1, zType, p
d060: 45 4c 69 73 74 2d 3e 6e 45 78 70 72 29 3b 0a 20  EList->nExpr);. 
d070: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b         return 1;
d080: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c  .      }.    }el
d090: 73 65 7b 0a 20 20 20 20 20 20 69 43 6f 6c 20 3d  se{.      iCol =
d0a0: 20 6d 61 74 63 68 4f 72 64 65 72 42 79 54 65 72   matchOrderByTer
d0b0: 6d 54 6f 45 78 70 72 4c 69 73 74 28 70 50 61 72  mToExprList(pPar
d0c0: 73 65 2c 20 70 53 65 6c 65 63 74 2c 20 70 45 2c  se, pSelect, pE,
d0d0: 20 69 2b 31 2c 20 30 2c 20 70 48 61 73 41 67 67   i+1, 0, pHasAgg
d0e0: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 69 43 6f  );.      if( iCo
d0f0: 6c 3c 30 20 29 7b 0a 20 20 20 20 20 20 20 20 72  l<0 ){.        r
d100: 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 20 20 7d  eturn 1;.      }
d110: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 69  .    }.    if( i
d120: 43 6f 6c 3e 30 20 29 7b 0a 20 20 20 20 20 20 43  Col>0 ){.      C
d130: 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 20 3d 20  ollSeq *pColl = 
d140: 70 45 2d 3e 70 43 6f 6c 6c 3b 0a 20 20 20 20 20  pE->pColl;.     
d150: 20 69 6e 74 20 66 6c 61 67 73 20 3d 20 70 45 2d   int flags = pE-
d160: 3e 66 6c 61 67 73 20 26 20 45 50 5f 45 78 70 43  >flags & EP_ExpC
d170: 6f 6c 6c 61 74 65 3b 0a 20 20 20 20 20 20 73 71  ollate;.      sq
d180: 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28  lite3ExprDelete(
d190: 70 45 29 3b 0a 20 20 20 20 20 20 70 45 20 3d 20  pE);.      pE = 
d1a0: 73 71 6c 69 74 65 33 45 78 70 72 44 75 70 28 64  sqlite3ExprDup(d
d1b0: 62 2c 20 70 45 4c 69 73 74 2d 3e 61 5b 69 43 6f  b, pEList->a[iCo
d1c0: 6c 2d 31 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20  l-1].pExpr);.   
d1d0: 20 20 20 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69     pOrderBy->a[i
d1e0: 5d 2e 70 45 78 70 72 20 3d 20 70 45 3b 0a 20 20  ].pExpr = pE;.  
d1f0: 20 20 20 20 69 66 28 20 70 45 20 26 26 20 70 43      if( pE && pC
d200: 6f 6c 6c 20 26 26 20 66 6c 61 67 73 20 29 7b 0a  oll && flags ){.
d210: 20 20 20 20 20 20 20 20 70 45 2d 3e 70 43 6f 6c          pE->pCol
d220: 6c 20 3d 20 70 43 6f 6c 6c 3b 0a 20 20 20 20 20  l = pColl;.     
d230: 20 20 20 70 45 2d 3e 66 6c 61 67 73 20 7c 3d 20     pE->flags |= 
d240: 66 6c 61 67 73 3b 0a 20 20 20 20 20 20 7d 0a 20  flags;.      }. 
d250: 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
d260: 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6e  n 0;.}../*.** An
d270: 61 6c 79 7a 65 20 61 6e 64 20 4f 52 44 45 52 20  alyze and ORDER 
d280: 42 59 20 6f 72 20 47 52 4f 55 50 20 42 59 20 63  BY or GROUP BY c
d290: 6c 61 75 73 65 20 69 6e 20 61 20 53 45 4c 45 43  lause in a SELEC
d2a0: 54 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 52 65  T statement.  Re
d2b0: 74 75 72 6e 0a 2a 2a 20 74 68 65 20 6e 75 6d 62  turn.** the numb
d2c0: 65 72 20 6f 66 20 65 72 72 6f 72 73 20 73 65 65  er of errors see
d2d0: 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 69 54 61 62  n..**.** If iTab
d2e0: 6c 65 3e 30 20 74 68 65 6e 20 6d 61 6b 65 20 74  le>0 then make t
d2f0: 68 65 20 4e 2d 74 68 20 74 65 72 6d 20 6f 66 20  he N-th term of 
d300: 74 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61  the ORDER BY cla
d310: 75 73 65 20 72 65 66 65 72 20 74 6f 0a 2a 2a 20  use refer to.** 
d320: 74 68 65 20 4e 2d 74 68 20 63 6f 6c 75 6d 6e 20  the N-th column 
d330: 6f 66 20 74 61 62 6c 65 20 69 54 61 62 6c 65 2e  of table iTable.
d340: 0a 2a 2a 0a 2a 2a 20 49 66 20 69 54 61 62 6c 65  .**.** If iTable
d350: 3d 3d 30 20 74 68 65 6e 20 74 72 61 6e 73 66 6f  ==0 then transfo
d360: 72 6d 20 65 61 63 68 20 74 65 72 6d 20 6f 66 20  rm each term of 
d370: 74 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61  the ORDER BY cla
d380: 75 73 65 20 74 6f 20 72 65 66 65 72 0a 2a 2a 20  use to refer.** 
d390: 74 6f 20 61 20 63 6f 6c 75 6d 6e 20 6f 66 20 74  to a column of t
d3a0: 68 65 20 72 65 73 75 6c 74 20 73 65 74 20 62 79  he result set by
d3b0: 20 6e 75 6d 62 65 72 2e 0a 2a 2f 0a 73 74 61 74   number..*/.stat
d3c0: 69 63 20 69 6e 74 20 70 72 6f 63 65 73 73 43 6f  ic int processCo
d3d0: 6d 70 6f 75 6e 64 4f 72 64 65 72 42 79 28 0a 20  mpoundOrderBy(. 
d3e0: 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
d3f0: 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e         /* Parsin
d400: 67 20 63 6f 6e 74 65 78 74 2e 20 20 4c 65 61 76  g context.  Leav
d410: 65 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 73  e error messages
d420: 20 68 65 72 65 20 2a 2f 0a 20 20 53 65 6c 65 63   here */.  Selec
d430: 74 20 2a 70 53 65 6c 65 63 74 20 20 20 20 20 20  t *pSelect      
d440: 20 2f 2a 20 54 68 65 20 53 45 4c 45 43 54 20 73   /* The SELECT s
d450: 74 61 74 65 6d 65 6e 74 20 63 6f 6e 74 61 69 6e  tatement contain
d460: 69 6e 67 20 74 68 65 20 4f 52 44 45 52 20 42 59  ing the ORDER BY
d470: 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 3b 0a   */.){.  int i;.
d480: 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4f 72 64    ExprList *pOrd
d490: 65 72 42 79 3b 0a 20 20 45 78 70 72 4c 69 73 74  erBy;.  ExprList
d4a0: 20 2a 70 45 4c 69 73 74 3b 0a 20 20 73 71 6c 69   *pEList;.  sqli
d4b0: 74 65 33 20 2a 64 62 3b 0a 20 20 69 6e 74 20 6d  te3 *db;.  int m
d4c0: 6f 72 65 54 6f 44 6f 20 3d 20 31 3b 0a 0a 20 20  oreToDo = 1;..  
d4d0: 70 4f 72 64 65 72 42 79 20 3d 20 70 53 65 6c 65  pOrderBy = pSele
d4e0: 63 74 2d 3e 70 4f 72 64 65 72 42 79 3b 0a 20 20  ct->pOrderBy;.  
d4f0: 69 66 28 20 70 4f 72 64 65 72 42 79 3d 3d 30 20  if( pOrderBy==0 
d500: 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 64 62  ) return 0;.  db
d510: 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 23   = pParse->db;.#
d520: 69 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f 43 4f  if SQLITE_MAX_CO
d530: 4c 55 4d 4e 0a 20 20 69 66 28 20 70 4f 72 64 65  LUMN.  if( pOrde
d540: 72 42 79 2d 3e 6e 45 78 70 72 3e 64 62 2d 3e 61  rBy->nExpr>db->a
d550: 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d  Limit[SQLITE_LIM
d560: 49 54 5f 43 4f 4c 55 4d 4e 5d 20 29 7b 0a 20 20  IT_COLUMN] ){.  
d570: 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
d580: 67 28 70 50 61 72 73 65 2c 20 22 74 6f 6f 20 6d  g(pParse, "too m
d590: 61 6e 79 20 74 65 72 6d 73 20 69 6e 20 4f 52 44  any terms in ORD
d5a0: 45 52 20 42 59 20 63 6c 61 75 73 65 22 29 3b 0a  ER BY clause");.
d5b0: 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20      return 1;.  
d5c0: 7d 0a 23 65 6e 64 69 66 0a 20 20 66 6f 72 28 69  }.#endif.  for(i
d5d0: 3d 30 3b 20 69 3c 70 4f 72 64 65 72 42 79 2d 3e  =0; i<pOrderBy->
d5e0: 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20  nExpr; i++){.   
d5f0: 20 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e   pOrderBy->a[i].
d600: 64 6f 6e 65 20 3d 20 30 3b 0a 20 20 7d 0a 20 20  done = 0;.  }.  
d610: 77 68 69 6c 65 28 20 70 53 65 6c 65 63 74 2d 3e  while( pSelect->
d620: 70 50 72 69 6f 72 20 29 7b 0a 20 20 20 20 70 53  pPrior ){.    pS
d630: 65 6c 65 63 74 20 3d 20 70 53 65 6c 65 63 74 2d  elect = pSelect-
d640: 3e 70 50 72 69 6f 72 3b 0a 20 20 7d 0a 20 20 77  >pPrior;.  }.  w
d650: 68 69 6c 65 28 20 70 53 65 6c 65 63 74 20 26 26  hile( pSelect &&
d660: 20 6d 6f 72 65 54 6f 44 6f 20 29 7b 0a 20 20 20   moreToDo ){.   
d670: 20 6d 6f 72 65 54 6f 44 6f 20 3d 20 30 3b 0a 20   moreToDo = 0;. 
d680: 20 20 20 70 45 4c 69 73 74 20 3d 20 70 53 65 6c     pEList = pSel
d690: 65 63 74 2d 3e 70 45 4c 69 73 74 3b 0a 20 20 20  ect->pEList;.   
d6a0: 20 69 66 28 20 70 45 4c 69 73 74 3d 3d 30 20 29   if( pEList==0 )
d6b0: 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 31  {.      return 1
d6c0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f 72 28  ;.    }.    for(
d6d0: 69 3d 30 3b 20 69 3c 70 4f 72 64 65 72 42 79 2d  i=0; i<pOrderBy-
d6e0: 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20  >nExpr; i++){.  
d6f0: 20 20 20 20 69 6e 74 20 69 43 6f 6c 20 3d 20 2d      int iCol = -
d700: 31 3b 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70  1;.      Expr *p
d710: 45 2c 20 2a 70 44 75 70 3b 0a 20 20 20 20 20 20  E, *pDup;.      
d720: 69 66 28 20 70 4f 72 64 65 72 42 79 2d 3e 61 5b  if( pOrderBy->a[
d730: 69 5d 2e 64 6f 6e 65 20 29 20 63 6f 6e 74 69 6e  i].done ) contin
d740: 75 65 3b 0a 20 20 20 20 20 20 70 45 20 3d 20 70  ue;.      pE = p
d750: 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 70 45  OrderBy->a[i].pE
d760: 78 70 72 3b 0a 20 20 20 20 20 20 69 66 28 20 73  xpr;.      if( s
d770: 71 6c 69 74 65 33 45 78 70 72 49 73 49 6e 74 65  qlite3ExprIsInte
d780: 67 65 72 28 70 45 2c 20 26 69 43 6f 6c 29 20 29  ger(pE, &iCol) )
d790: 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 69 43  {.        if( iC
d7a0: 6f 6c 3c 30 20 7c 7c 20 69 43 6f 6c 3e 70 45 4c  ol<0 || iCol>pEL
d7b0: 69 73 74 2d 3e 6e 45 78 70 72 20 29 7b 0a 20 20  ist->nExpr ){.  
d7c0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
d7d0: 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
d7e0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 22 25  .             "%
d7f0: 72 20 4f 52 44 45 52 20 42 59 20 74 65 72 6d 20  r ORDER BY term 
d800: 6f 75 74 20 6f 66 20 72 61 6e 67 65 20 2d 20 73  out of range - s
d810: 68 6f 75 6c 64 20 62 65 20 22 0a 20 20 20 20 20  hould be ".     
d820: 20 20 20 20 20 20 20 20 22 62 65 74 77 65 65 6e          "between
d830: 20 31 20 61 6e 64 20 25 64 22 2c 20 69 2b 31 2c   1 and %d", i+1,
d840: 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 29 3b   pEList->nExpr);
d850: 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72  .          retur
d860: 6e 20 31 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  n 1;.        }. 
d870: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
d880: 20 20 20 20 70 44 75 70 20 3d 20 73 71 6c 69 74      pDup = sqlit
d890: 65 33 45 78 70 72 44 75 70 28 64 62 2c 20 70 45  e3ExprDup(db, pE
d8a0: 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 21  );.        if( !
d8b0: 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
d8c0: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 61 73   ){.          as
d8d0: 73 65 72 74 28 70 44 75 70 29 3b 0a 20 20 20 20  sert(pDup);.    
d8e0: 20 20 20 20 20 20 69 43 6f 6c 20 3d 20 6d 61 74        iCol = mat
d8f0: 63 68 4f 72 64 65 72 42 79 54 65 72 6d 54 6f 45  chOrderByTermToE
d900: 78 70 72 4c 69 73 74 28 70 50 61 72 73 65 2c 20  xprList(pParse, 
d910: 70 53 65 6c 65 63 74 2c 20 70 44 75 70 2c 20 69  pSelect, pDup, i
d920: 2b 31 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20 20  +1, 1, 0);.     
d930: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 73 71 6c     }.        sql
d940: 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 70  ite3ExprDelete(p
d950: 44 75 70 29 3b 0a 20 20 20 20 20 20 20 20 69 66  Dup);.        if
d960: 28 20 69 43 6f 6c 3c 30 20 29 7b 0a 20 20 20 20  ( iCol<0 ){.    
d970: 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a        return 1;.
d980: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
d990: 7d 0a 20 20 20 20 20 20 69 66 28 20 69 43 6f 6c  }.      if( iCol
d9a0: 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70 45  >0 ){.        pE
d9b0: 2d 3e 6f 70 20 3d 20 54 4b 5f 49 4e 54 45 47 45  ->op = TK_INTEGE
d9c0: 52 3b 0a 20 20 20 20 20 20 20 20 70 45 2d 3e 66  R;.        pE->f
d9d0: 6c 61 67 73 20 7c 3d 20 45 50 5f 49 6e 74 56 61  lags |= EP_IntVa
d9e0: 6c 75 65 3b 0a 20 20 20 20 20 20 20 20 70 45 2d  lue;.        pE-
d9f0: 3e 69 54 61 62 6c 65 20 3d 20 69 43 6f 6c 3b 0a  >iTable = iCol;.
da00: 20 20 20 20 20 20 20 20 70 4f 72 64 65 72 42 79          pOrderBy
da10: 2d 3e 61 5b 69 5d 2e 64 6f 6e 65 20 3d 20 31 3b  ->a[i].done = 1;
da20: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
da30: 20 20 20 20 20 20 6d 6f 72 65 54 6f 44 6f 20 3d        moreToDo =
da40: 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   1;.      }.    
da50: 7d 0a 20 20 20 20 70 53 65 6c 65 63 74 20 3d 20  }.    pSelect = 
da60: 70 53 65 6c 65 63 74 2d 3e 70 4e 65 78 74 3b 0a  pSelect->pNext;.
da70: 20 20 7d 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69    }.  for(i=0; i
da80: 3c 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72  <pOrderBy->nExpr
da90: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20  ; i++){.    if( 
daa0: 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 64  pOrderBy->a[i].d
dab0: 6f 6e 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  one==0 ){.      
dac0: 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
dad0: 70 50 61 72 73 65 2c 20 22 25 72 20 4f 52 44 45  pParse, "%r ORDE
dae0: 52 20 42 59 20 74 65 72 6d 20 64 6f 65 73 20 6e  R BY term does n
daf0: 6f 74 20 6d 61 74 63 68 20 61 6e 79 20 22 0a 20  ot match any ". 
db00: 20 20 20 20 20 20 20 20 20 20 20 22 63 6f 6c 75             "colu
db10: 6d 6e 20 69 6e 20 74 68 65 20 72 65 73 75 6c 74  mn in the result
db20: 20 73 65 74 22 2c 20 69 2b 31 29 3b 0a 20 20 20   set", i+1);.   
db30: 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20     return 1;.   
db40: 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
db50: 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 74 20  0;.}../*.** Get 
db60: 61 20 56 44 42 45 20 66 6f 72 20 74 68 65 20 67  a VDBE for the g
db70: 69 76 65 6e 20 70 61 72 73 65 72 20 63 6f 6e 74  iven parser cont
db80: 65 78 74 2e 20 20 43 72 65 61 74 65 20 61 20 6e  ext.  Create a n
db90: 65 77 20 6f 6e 65 20 69 66 20 6e 65 63 65 73 73  ew one if necess
dba0: 61 72 79 2e 0a 2a 2a 20 49 66 20 61 6e 20 65 72  ary..** If an er
dbb0: 72 6f 72 20 6f 63 63 75 72 73 2c 20 72 65 74 75  ror occurs, retu
dbc0: 72 6e 20 4e 55 4c 4c 20 61 6e 64 20 6c 65 61 76  rn NULL and leav
dbd0: 65 20 61 20 6d 65 73 73 61 67 65 20 69 6e 20 70  e a message in p
dbe0: 50 61 72 73 65 2e 0a 2a 2f 0a 56 64 62 65 20 2a  Parse..*/.Vdbe *
dbf0: 73 71 6c 69 74 65 33 47 65 74 56 64 62 65 28 50  sqlite3GetVdbe(P
dc00: 61 72 73 65 20 2a 70 50 61 72 73 65 29 7b 0a 20  arse *pParse){. 
dc10: 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73   Vdbe *v = pPars
dc20: 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69 66 28 20  e->pVdbe;.  if( 
dc30: 76 3d 3d 30 20 29 7b 0a 20 20 20 20 76 20 3d 20  v==0 ){.    v = 
dc40: 70 50 61 72 73 65 2d 3e 70 56 64 62 65 20 3d 20  pParse->pVdbe = 
dc50: 73 71 6c 69 74 65 33 56 64 62 65 43 72 65 61 74  sqlite3VdbeCreat
dc60: 65 28 70 50 61 72 73 65 2d 3e 64 62 29 3b 0a 23  e(pParse->db);.#
dc70: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
dc80: 49 54 5f 54 52 41 43 45 0a 20 20 20 20 69 66 28  IT_TRACE.    if(
dc90: 20 76 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69   v ){.      sqli
dca0: 74 65 33 56 64 62 65 41 64 64 4f 70 30 28 76 2c  te3VdbeAddOp0(v,
dcb0: 20 4f 50 5f 54 72 61 63 65 29 3b 0a 20 20 20 20   OP_Trace);.    
dcc0: 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 20 20 72  }.#endif.  }.  r
dcd0: 65 74 75 72 6e 20 76 3b 0a 7d 0a 0a 0a 2f 2a 0a  eturn v;.}.../*.
dce0: 2a 2a 20 43 6f 6d 70 75 74 65 20 74 68 65 20 69  ** Compute the i
dcf0: 4c 69 6d 69 74 20 61 6e 64 20 69 4f 66 66 73 65  Limit and iOffse
dd00: 74 20 66 69 65 6c 64 73 20 6f 66 20 74 68 65 20  t fields of the 
dd10: 53 45 4c 45 43 54 20 62 61 73 65 64 20 6f 6e 20  SELECT based on 
dd20: 74 68 65 0a 2a 2a 20 70 4c 69 6d 69 74 20 61 6e  the.** pLimit an
dd30: 64 20 70 4f 66 66 73 65 74 20 65 78 70 72 65 73  d pOffset expres
dd40: 73 69 6f 6e 73 2e 20 20 70 4c 69 6d 69 74 20 61  sions.  pLimit a
dd50: 6e 64 20 70 4f 66 66 73 65 74 20 68 6f 6c 64 20  nd pOffset hold 
dd60: 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 73 0a  the expressions.
dd70: 2a 2a 20 74 68 61 74 20 61 70 70 65 61 72 20 69  ** that appear i
dd80: 6e 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 53  n the original S
dd90: 51 4c 20 73 74 61 74 65 6d 65 6e 74 20 61 66 74  QL statement aft
dda0: 65 72 20 74 68 65 20 4c 49 4d 49 54 20 61 6e 64  er the LIMIT and
ddb0: 20 4f 46 46 53 45 54 0a 2a 2a 20 6b 65 79 77 6f   OFFSET.** keywo
ddc0: 72 64 73 2e 20 20 4f 72 20 4e 55 4c 4c 20 69 66  rds.  Or NULL if
ddd0: 20 74 68 6f 73 65 20 6b 65 79 77 6f 72 64 73 20   those keywords 
dde0: 61 72 65 20 6f 6d 69 74 74 65 64 2e 20 69 4c 69  are omitted. iLi
ddf0: 6d 69 74 20 61 6e 64 20 69 4f 66 66 73 65 74 20  mit and iOffset 
de00: 0a 2a 2a 20 61 72 65 20 74 68 65 20 69 6e 74 65  .** are the inte
de10: 67 65 72 20 6d 65 6d 6f 72 79 20 72 65 67 69 73  ger memory regis
de20: 74 65 72 20 6e 75 6d 62 65 72 73 20 66 6f 72 20  ter numbers for 
de30: 63 6f 75 6e 74 65 72 73 20 75 73 65 64 20 74 6f  counters used to
de40: 20 63 6f 6d 70 75 74 65 20 0a 2a 2a 20 74 68 65   compute .** the
de50: 20 6c 69 6d 69 74 20 61 6e 64 20 6f 66 66 73 65   limit and offse
de60: 74 2e 20 20 49 66 20 74 68 65 72 65 20 69 73 20  t.  If there is 
de70: 6e 6f 20 6c 69 6d 69 74 20 61 6e 64 2f 6f 72 20  no limit and/or 
de80: 6f 66 66 73 65 74 2c 20 74 68 65 6e 20 0a 2a 2a  offset, then .**
de90: 20 69 4c 69 6d 69 74 20 61 6e 64 20 69 4f 66 66   iLimit and iOff
dea0: 73 65 74 20 61 72 65 20 6e 65 67 61 74 69 76 65  set are negative
deb0: 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
dec0: 74 69 6e 65 20 63 68 61 6e 67 65 73 20 74 68 65  tine changes the
ded0: 20 76 61 6c 75 65 73 20 6f 66 20 69 4c 69 6d 69   values of iLimi
dee0: 74 20 61 6e 64 20 69 4f 66 66 73 65 74 20 6f 6e  t and iOffset on
def0: 6c 79 20 69 66 0a 2a 2a 20 61 20 6c 69 6d 69 74  ly if.** a limit
df00: 20 6f 72 20 6f 66 66 73 65 74 20 69 73 20 64 65   or offset is de
df10: 66 69 6e 65 64 20 62 79 20 70 4c 69 6d 69 74 20  fined by pLimit 
df20: 61 6e 64 20 70 4f 66 66 73 65 74 2e 20 20 69 4c  and pOffset.  iL
df30: 69 6d 69 74 20 61 6e 64 0a 2a 2a 20 69 4f 66 66  imit and.** iOff
df40: 73 65 74 20 73 68 6f 75 6c 64 20 68 61 76 65 20  set should have 
df50: 62 65 65 6e 20 70 72 65 73 65 74 20 74 6f 20 61  been preset to a
df60: 70 70 72 6f 70 72 69 61 74 65 20 64 65 66 61 75  ppropriate defau
df70: 6c 74 20 76 61 6c 75 65 73 0a 2a 2a 20 28 75 73  lt values.** (us
df80: 75 61 6c 6c 79 20 62 75 74 20 6e 6f 74 20 61 6c  ually but not al
df90: 77 61 79 73 20 2d 31 29 20 70 72 69 6f 72 20 74  ways -1) prior t
dfa0: 6f 20 63 61 6c 6c 69 6e 67 20 74 68 69 73 20 72  o calling this r
dfb0: 6f 75 74 69 6e 65 2e 0a 2a 2a 20 4f 6e 6c 79 20  outine..** Only 
dfc0: 69 66 20 70 4c 69 6d 69 74 21 3d 30 20 6f 72 20  if pLimit!=0 or 
dfd0: 70 4f 66 66 73 65 74 21 3d 30 20 64 6f 20 74 68  pOffset!=0 do th
dfe0: 65 20 6c 69 6d 69 74 20 72 65 67 69 73 74 65 72  e limit register
dff0: 73 20 67 65 74 0a 2a 2a 20 72 65 64 65 66 69 6e  s get.** redefin
e000: 65 64 2e 20 20 54 68 65 20 55 4e 49 4f 4e 20 41  ed.  The UNION A
e010: 4c 4c 20 6f 70 65 72 61 74 6f 72 20 75 73 65 73  LL operator uses
e020: 20 74 68 69 73 20 70 72 6f 70 65 72 74 79 20 74   this property t
e030: 6f 20 66 6f 72 63 65 0a 2a 2a 20 74 68 65 20 72  o force.** the r
e040: 65 75 73 65 20 6f 66 20 74 68 65 20 73 61 6d 65  euse of the same
e050: 20 6c 69 6d 69 74 20 61 6e 64 20 6f 66 66 73 65   limit and offse
e060: 74 20 72 65 67 69 73 74 65 72 73 20 61 63 72 6f  t registers acro
e070: 73 73 20 6d 75 6c 74 69 70 6c 65 0a 2a 2a 20 53  ss multiple.** S
e080: 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 73  ELECT statements
e090: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
e0a0: 20 63 6f 6d 70 75 74 65 4c 69 6d 69 74 52 65 67   computeLimitReg
e0b0: 69 73 74 65 72 73 28 50 61 72 73 65 20 2a 70 50  isters(Parse *pP
e0c0: 61 72 73 65 2c 20 53 65 6c 65 63 74 20 2a 70 2c  arse, Select *p,
e0d0: 20 69 6e 74 20 69 42 72 65 61 6b 29 7b 0a 20 20   int iBreak){.  
e0e0: 56 64 62 65 20 2a 76 20 3d 20 30 3b 0a 20 20 69  Vdbe *v = 0;.  i
e0f0: 6e 74 20 69 4c 69 6d 69 74 20 3d 20 30 3b 0a 20  nt iLimit = 0;. 
e100: 20 69 6e 74 20 69 4f 66 66 73 65 74 3b 0a 20 20   int iOffset;.  
e110: 69 6e 74 20 61 64 64 72 31 3b 0a 20 20 69 66 28  int addr1;.  if(
e120: 20 70 2d 3e 69 4c 69 6d 69 74 20 29 20 72 65 74   p->iLimit ) ret
e130: 75 72 6e 3b 0a 0a 20 20 2f 2a 20 0a 20 20 2a 2a  urn;..  /* .  **
e140: 20 22 4c 49 4d 49 54 20 2d 31 22 20 61 6c 77 61   "LIMIT -1" alwa
e150: 79 73 20 73 68 6f 77 73 20 61 6c 6c 20 72 6f 77  ys shows all row
e160: 73 2e 20 20 54 68 65 72 65 20 69 73 20 73 6f 6d  s.  There is som
e170: 65 0a 20 20 2a 2a 20 63 6f 6e 74 72 61 76 65 72  e.  ** contraver
e180: 73 79 20 61 62 6f 75 74 20 77 68 61 74 20 74 68  sy about what th
e190: 65 20 63 6f 72 72 65 63 74 20 62 65 68 61 76 69  e correct behavi
e1a0: 6f 72 20 73 68 6f 75 6c 64 20 62 65 2e 0a 20 20  or should be..  
e1b0: 2a 2a 20 54 68 65 20 63 75 72 72 65 6e 74 20 69  ** The current i
e1c0: 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 69 6e  mplementation in
e1d0: 74 65 72 70 72 65 74 73 20 22 4c 49 4d 49 54 20  terprets "LIMIT 
e1e0: 30 22 20 74 6f 20 6d 65 61 6e 0a 20 20 2a 2a 20  0" to mean.  ** 
e1f0: 6e 6f 20 72 6f 77 73 2e 0a 20 20 2a 2f 0a 20 20  no rows..  */.  
e200: 69 66 28 20 70 2d 3e 70 4c 69 6d 69 74 20 29 7b  if( p->pLimit ){
e210: 0a 20 20 20 20 70 2d 3e 69 4c 69 6d 69 74 20 3d  .    p->iLimit =
e220: 20 69 4c 69 6d 69 74 20 3d 20 2b 2b 70 50 61 72   iLimit = ++pPar
e230: 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 76 20  se->nMem;.    v 
e240: 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64 62 65  = sqlite3GetVdbe
e250: 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 69 66  (pParse);.    if
e260: 28 20 76 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b  ( v==0 ) return;
e270: 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72  .    sqlite3Expr
e280: 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70 2d 3e  Code(pParse, p->
e290: 70 4c 69 6d 69 74 2c 20 69 4c 69 6d 69 74 29 3b  pLimit, iLimit);
e2a0: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
e2b0: 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 4d 75 73  AddOp1(v, OP_Mus
e2c0: 74 42 65 49 6e 74 2c 20 69 4c 69 6d 69 74 29 3b  tBeInt, iLimit);
e2d0: 0a 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74  .    VdbeComment
e2e0: 28 28 76 2c 20 22 4c 49 4d 49 54 20 63 6f 75 6e  ((v, "LIMIT coun
e2f0: 74 65 72 22 29 29 3b 0a 20 20 20 20 73 71 6c 69  ter"));.    sqli
e300: 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
e310: 20 4f 50 5f 49 66 5a 65 72 6f 2c 20 69 4c 69 6d   OP_IfZero, iLim
e320: 69 74 2c 20 69 42 72 65 61 6b 29 3b 0a 20 20 7d  it, iBreak);.  }
e330: 0a 20 20 69 66 28 20 70 2d 3e 70 4f 66 66 73 65  .  if( p->pOffse
e340: 74 20 29 7b 0a 20 20 20 20 70 2d 3e 69 4f 66 66  t ){.    p->iOff
e350: 73 65 74 20 3d 20 69 4f 66 66 73 65 74 20 3d 20  set = iOffset = 
e360: 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a  ++pParse->nMem;.
e370: 20 20 20 20 69 66 28 20 70 2d 3e 70 4c 69 6d 69      if( p->pLimi
e380: 74 20 29 7b 0a 20 20 20 20 20 20 70 50 61 72 73  t ){.      pPars
e390: 65 2d 3e 6e 4d 65 6d 2b 2b 3b 20 20 20 2f 2a 20  e->nMem++;   /* 
e3a0: 41 6c 6c 6f 63 61 74 65 20 61 6e 20 65 78 74 72  Allocate an extr
e3b0: 61 20 72 65 67 69 73 74 65 72 20 66 6f 72 20 6c  a register for l
e3c0: 69 6d 69 74 2b 6f 66 66 73 65 74 20 2a 2f 0a 20  imit+offset */. 
e3d0: 20 20 20 7d 0a 20 20 20 20 76 20 3d 20 73 71 6c     }.    v = sql
e3e0: 69 74 65 33 47 65 74 56 64 62 65 28 70 50 61 72  ite3GetVdbe(pPar
e3f0: 73 65 29 3b 0a 20 20 20 20 69 66 28 20 76 3d 3d  se);.    if( v==
e400: 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 20 20  0 ) return;.    
e410: 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28  sqlite3ExprCode(
e420: 70 50 61 72 73 65 2c 20 70 2d 3e 70 4f 66 66 73  pParse, p->pOffs
e430: 65 74 2c 20 69 4f 66 66 73 65 74 29 3b 0a 20 20  et, iOffset);.  
e440: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
e450: 4f 70 31 28 76 2c 20 4f 50 5f 4d 75 73 74 42 65  Op1(v, OP_MustBe
e460: 49 6e 74 2c 20 69 4f 66 66 73 65 74 29 3b 0a 20  Int, iOffset);. 
e470: 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28     VdbeComment((
e480: 76 2c 20 22 4f 46 46 53 45 54 20 63 6f 75 6e 74  v, "OFFSET count
e490: 65 72 22 29 29 3b 0a 20 20 20 20 61 64 64 72 31  er"));.    addr1
e4a0: 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   = sqlite3VdbeAd
e4b0: 64 4f 70 31 28 76 2c 20 4f 50 5f 49 66 50 6f 73  dOp1(v, OP_IfPos
e4c0: 2c 20 69 4f 66 66 73 65 74 29 3b 0a 20 20 20 20  , iOffset);.    
e4d0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
e4e0: 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c  2(v, OP_Integer,
e4f0: 20 30 2c 20 69 4f 66 66 73 65 74 29 3b 0a 20 20   0, iOffset);.  
e500: 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d    sqlite3VdbeJum
e510: 70 48 65 72 65 28 76 2c 20 61 64 64 72 31 29 3b  pHere(v, addr1);
e520: 0a 20 20 20 20 69 66 28 20 70 2d 3e 70 4c 69 6d  .    if( p->pLim
e530: 69 74 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  it ){.      sqli
e540: 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
e550: 20 4f 50 5f 41 64 64 2c 20 69 4c 69 6d 69 74 2c   OP_Add, iLimit,
e560: 20 69 4f 66 66 73 65 74 2c 20 69 4f 66 66 73 65   iOffset, iOffse
e570: 74 2b 31 29 3b 0a 20 20 20 20 20 20 56 64 62 65  t+1);.      Vdbe
e580: 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 4c 49 4d  Comment((v, "LIM
e590: 49 54 2b 4f 46 46 53 45 54 22 29 29 3b 0a 20 20  IT+OFFSET"));.  
e5a0: 20 20 20 20 61 64 64 72 31 20 3d 20 73 71 6c 69      addr1 = sqli
e5b0: 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c  te3VdbeAddOp1(v,
e5c0: 20 4f 50 5f 49 66 50 6f 73 2c 20 69 4c 69 6d 69   OP_IfPos, iLimi
e5d0: 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  t);.      sqlite
e5e0: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
e5f0: 50 5f 49 6e 74 65 67 65 72 2c 20 2d 31 2c 20 69  P_Integer, -1, i
e600: 4f 66 66 73 65 74 2b 31 29 3b 0a 20 20 20 20 20  Offset+1);.     
e610: 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70   sqlite3VdbeJump
e620: 48 65 72 65 28 76 2c 20 61 64 64 72 31 29 3b 0a  Here(v, addr1);.
e630: 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 23 69 66      }.  }.}..#if
e640: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
e650: 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45 43 54  _COMPOUND_SELECT
e660: 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  ./*.** Return th
e670: 65 20 61 70 70 72 6f 70 72 69 61 74 65 20 63 6f  e appropriate co
e680: 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65  llating sequence
e690: 20 66 6f 72 20 74 68 65 20 69 43 6f 6c 2d 74 68   for the iCol-th
e6a0: 20 63 6f 6c 75 6d 6e 20 6f 66 0a 2a 2a 20 74 68   column of.** th
e6b0: 65 20 72 65 73 75 6c 74 20 73 65 74 20 66 6f 72  e result set for
e6c0: 20 74 68 65 20 63 6f 6d 70 6f 75 6e 64 2d 73 65   the compound-se
e6d0: 6c 65 63 74 20 73 74 61 74 65 6d 65 6e 74 20 22  lect statement "
e6e0: 70 22 2e 20 20 52 65 74 75 72 6e 20 4e 55 4c 4c  p".  Return NULL
e6f0: 20 69 66 0a 2a 2a 20 74 68 65 20 63 6f 6c 75 6d   if.** the colum
e700: 6e 20 68 61 73 20 6e 6f 20 64 65 66 61 75 6c 74  n has no default
e710: 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65   collating seque
e720: 6e 63 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63  nce..**.** The c
e730: 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63  ollating sequenc
e740: 65 20 66 6f 72 20 74 68 65 20 63 6f 6d 70 6f 75  e for the compou
e750: 6e 64 20 73 65 6c 65 63 74 20 69 73 20 74 61 6b  nd select is tak
e760: 65 6e 20 66 72 6f 6d 20 74 68 65 0a 2a 2a 20 6c  en from the.** l
e770: 65 66 74 2d 6d 6f 73 74 20 74 65 72 6d 20 6f 66  eft-most term of
e780: 20 74 68 65 20 73 65 6c 65 63 74 20 74 68 61 74   the select that
e790: 20 68 61 73 20 61 20 63 6f 6c 6c 61 74 69 6e 67   has a collating
e7a0: 20 73 65 71 75 65 6e 63 65 2e 0a 2a 2f 0a 73 74   sequence..*/.st
e7b0: 61 74 69 63 20 43 6f 6c 6c 53 65 71 20 2a 6d 75  atic CollSeq *mu
e7c0: 6c 74 69 53 65 6c 65 63 74 43 6f 6c 6c 53 65 71  ltiSelectCollSeq
e7d0: 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
e7e0: 53 65 6c 65 63 74 20 2a 70 2c 20 69 6e 74 20 69  Select *p, int i
e7f0: 43 6f 6c 29 7b 0a 20 20 43 6f 6c 6c 53 65 71 20  Col){.  CollSeq 
e800: 2a 70 52 65 74 3b 0a 20 20 69 66 28 20 70 2d 3e  *pRet;.  if( p->
e810: 70 50 72 69 6f 72 20 29 7b 0a 20 20 20 20 70 52  pPrior ){.    pR
e820: 65 74 20 3d 20 6d 75 6c 74 69 53 65 6c 65 63 74  et = multiSelect
e830: 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20  CollSeq(pParse, 
e840: 70 2d 3e 70 50 72 69 6f 72 2c 20 69 43 6f 6c 29  p->pPrior, iCol)
e850: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70  ;.  }else{.    p
e860: 52 65 74 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 69  Ret = 0;.  }.  i
e870: 66 28 20 70 52 65 74 3d 3d 30 20 29 7b 0a 20 20  f( pRet==0 ){.  
e880: 20 20 70 52 65 74 20 3d 20 73 71 6c 69 74 65 33    pRet = sqlite3
e890: 45 78 70 72 43 6f 6c 6c 53 65 71 28 70 50 61 72  ExprCollSeq(pPar
e8a0: 73 65 2c 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 61  se, p->pEList->a
e8b0: 5b 69 43 6f 6c 5d 2e 70 45 78 70 72 29 3b 0a 20  [iCol].pExpr);. 
e8c0: 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 52 65 74   }.  return pRet
e8d0: 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51  ;.}.#endif /* SQ
e8e0: 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f 4d 50 4f 55  LITE_OMIT_COMPOU
e8f0: 4e 44 5f 53 45 4c 45 43 54 20 2a 2f 0a 0a 2f 2a  ND_SELECT */../*
e900: 20 46 6f 72 77 61 72 64 20 72 65 66 65 72 65 6e   Forward referen
e910: 63 65 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  ce */.static int
e920: 20 6d 75 6c 74 69 53 65 6c 65 63 74 4f 72 64 65   multiSelectOrde
e930: 72 42 79 28 0a 20 20 50 61 72 73 65 20 2a 70 50  rBy(.  Parse *pP
e940: 61 72 73 65 2c 20 20 20 20 20 20 20 20 2f 2a 20  arse,        /* 
e950: 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20  Parsing context 
e960: 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 2c 20  */.  Select *p, 
e970: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
e980: 65 20 72 69 67 68 74 2d 6d 6f 73 74 20 6f 66 20  e right-most of 
e990: 53 45 4c 45 43 54 73 20 74 6f 20 62 65 20 63 6f  SELECTs to be co
e9a0: 64 65 64 20 2a 2f 0a 20 20 53 65 6c 65 63 74 44  ded */.  SelectD
e9b0: 65 73 74 20 2a 70 44 65 73 74 20 20 20 20 20 2f  est *pDest     /
e9c0: 2a 20 57 68 61 74 20 74 6f 20 64 6f 20 77 69 74  * What to do wit
e9d0: 68 20 71 75 65 72 79 20 72 65 73 75 6c 74 73 20  h query results 
e9e0: 2a 2f 0a 29 3b 0a 0a 0a 23 69 66 6e 64 65 66 20  */.);...#ifndef 
e9f0: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f 4d 50  SQLITE_OMIT_COMP
ea00: 4f 55 4e 44 5f 53 45 4c 45 43 54 0a 2f 2a 0a 2a  OUND_SELECT./*.*
ea10: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
ea20: 73 20 63 61 6c 6c 65 64 20 74 6f 20 70 72 6f 63  s called to proc
ea30: 65 73 73 20 61 20 63 6f 6d 70 6f 75 6e 64 20 71  ess a compound q
ea40: 75 65 72 79 20 66 6f 72 6d 20 66 72 6f 6d 0a 2a  uery form from.*
ea50: 2a 20 74 77 6f 20 6f 72 20 6d 6f 72 65 20 73 65  * two or more se
ea60: 70 61 72 61 74 65 20 71 75 65 72 69 65 73 20 75  parate queries u
ea70: 73 69 6e 67 20 55 4e 49 4f 4e 2c 20 55 4e 49 4f  sing UNION, UNIO
ea80: 4e 20 41 4c 4c 2c 20 45 58 43 45 50 54 2c 20 6f  N ALL, EXCEPT, o
ea90: 72 0a 2a 2a 20 49 4e 54 45 52 53 45 43 54 0a 2a  r.** INTERSECT.*
eaa0: 2a 0a 2a 2a 20 22 70 22 20 70 6f 69 6e 74 73 20  *.** "p" points 
eab0: 74 6f 20 74 68 65 20 72 69 67 68 74 2d 6d 6f 73  to the right-mos
eac0: 74 20 6f 66 20 74 68 65 20 74 77 6f 20 71 75 65  t of the two que
ead0: 72 69 65 73 2e 20 20 74 68 65 20 71 75 65 72 79  ries.  the query
eae0: 20 6f 6e 20 74 68 65 0a 2a 2a 20 6c 65 66 74 20   on the.** left 
eaf0: 69 73 20 70 2d 3e 70 50 72 69 6f 72 2e 20 20 54  is p->pPrior.  T
eb00: 68 65 20 6c 65 66 74 20 71 75 65 72 79 20 63 6f  he left query co
eb10: 75 6c 64 20 61 6c 73 6f 20 62 65 20 61 20 63 6f  uld also be a co
eb20: 6d 70 6f 75 6e 64 20 71 75 65 72 79 0a 2a 2a 20  mpound query.** 
eb30: 69 6e 20 77 68 69 63 68 20 63 61 73 65 20 74 68  in which case th
eb40: 69 73 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20  is routine will 
eb50: 62 65 20 63 61 6c 6c 65 64 20 72 65 63 75 72 73  be called recurs
eb60: 69 76 65 6c 79 2e 20 0a 2a 2a 0a 2a 2a 20 54 68  ively. .**.** Th
eb70: 65 20 72 65 73 75 6c 74 73 20 6f 66 20 74 68 65  e results of the
eb80: 20 74 6f 74 61 6c 20 71 75 65 72 79 20 61 72 65   total query are
eb90: 20 74 6f 20 62 65 20 77 72 69 74 74 65 6e 20 69   to be written i
eba0: 6e 74 6f 20 61 20 64 65 73 74 69 6e 61 74 69 6f  nto a destinatio
ebb0: 6e 0a 2a 2a 20 6f 66 20 74 79 70 65 20 65 44 65  n.** of type eDe
ebc0: 73 74 20 77 69 74 68 20 70 61 72 61 6d 65 74 65  st with paramete
ebd0: 72 20 69 50 61 72 6d 2e 0a 2a 2a 0a 2a 2a 20 45  r iParm..**.** E
ebe0: 78 61 6d 70 6c 65 20 31 3a 20 20 43 6f 6e 73 69  xample 1:  Consi
ebf0: 64 65 72 20 61 20 74 68 72 65 65 2d 77 61 79 20  der a three-way 
ec00: 63 6f 6d 70 6f 75 6e 64 20 53 51 4c 20 73 74 61  compound SQL sta
ec10: 74 65 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 20 20  tement..**.**   
ec20: 20 20 53 45 4c 45 43 54 20 61 20 46 52 4f 4d 20    SELECT a FROM 
ec30: 74 31 20 55 4e 49 4f 4e 20 53 45 4c 45 43 54 20  t1 UNION SELECT 
ec40: 62 20 46 52 4f 4d 20 74 32 20 55 4e 49 4f 4e 20  b FROM t2 UNION 
ec50: 53 45 4c 45 43 54 20 63 20 46 52 4f 4d 20 74 33  SELECT c FROM t3
ec60: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 73 74 61 74  .**.** This stat
ec70: 65 6d 65 6e 74 20 69 73 20 70 61 72 73 65 64 20  ement is parsed 
ec80: 75 70 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a  up as follows:.*
ec90: 2a 0a 2a 2a 20 20 20 20 20 53 45 4c 45 43 54 20  *.**     SELECT 
eca0: 63 20 46 52 4f 4d 20 74 33 0a 2a 2a 20 20 20 20  c FROM t3.**    
ecb0: 20 20 7c 0a 2a 2a 20 20 20 20 20 20 60 2d 2d 2d    |.**      `---
ecc0: 2d 2d 3e 20 20 53 45 4c 45 43 54 20 62 20 46 52  -->  SELECT b FR
ecd0: 4f 4d 20 74 32 0a 2a 2a 20 20 20 20 20 20 20 20  OM t2.**        
ece0: 20 20 20 20 20 20 20 20 7c 0a 2a 2a 20 20 20 20          |.**    
ecf0: 20 20 20 20 20 20 20 20 20 20 20 20 60 2d 2d 2d              `---
ed00: 2d 2d 2d 3e 20 20 53 45 4c 45 43 54 20 61 20 46  --->  SELECT a F
ed10: 52 4f 4d 20 74 31 0a 2a 2a 0a 2a 2a 20 54 68 65  ROM t1.**.** The
ed20: 20 61 72 72 6f 77 73 20 69 6e 20 74 68 65 20 64   arrows in the d
ed30: 69 61 67 72 61 6d 20 61 62 6f 76 65 20 72 65 70  iagram above rep
ed40: 72 65 73 65 6e 74 20 74 68 65 20 53 65 6c 65 63  resent the Selec
ed50: 74 2e 70 50 72 69 6f 72 20 70 6f 69 6e 74 65 72  t.pPrior pointer
ed60: 2e 0a 2a 2a 20 53 6f 20 69 66 20 74 68 69 73 20  ..** So if this 
ed70: 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65  routine is calle
ed80: 64 20 77 69 74 68 20 70 20 65 71 75 61 6c 20 74  d with p equal t
ed90: 6f 20 74 68 65 20 74 33 20 71 75 65 72 79 2c 20  o the t3 query, 
eda0: 74 68 65 6e 0a 2a 2a 20 70 50 72 69 6f 72 20 77  then.** pPrior w
edb0: 69 6c 6c 20 62 65 20 74 68 65 20 74 32 20 71 75  ill be the t2 qu
edc0: 65 72 79 2e 20 20 70 2d 3e 6f 70 20 77 69 6c 6c  ery.  p->op will
edd0: 20 62 65 20 54 4b 5f 55 4e 49 4f 4e 20 69 6e 20   be TK_UNION in 
ede0: 74 68 69 73 20 63 61 73 65 2e 0a 2a 2a 0a 2a 2a  this case..**.**
edf0: 20 4e 6f 74 69 63 65 20 74 68 61 74 20 62 65 63   Notice that bec
ee00: 61 75 73 65 20 6f 66 20 74 68 65 20 77 61 79 20  ause of the way 
ee10: 53 51 4c 69 74 65 20 70 61 72 73 65 73 20 63 6f  SQLite parses co
ee20: 6d 70 6f 75 6e 64 20 53 45 4c 45 43 54 73 2c 20  mpound SELECTs, 
ee30: 74 68 65 0a 2a 2a 20 69 6e 64 69 76 69 64 75 61  the.** individua
ee40: 6c 20 73 65 6c 65 63 74 73 20 61 6c 77 61 79 73  l selects always
ee50: 20 67 72 6f 75 70 20 66 72 6f 6d 20 6c 65 66 74   group from left
ee60: 20 74 6f 20 72 69 67 68 74 2e 0a 2a 2f 0a 73 74   to right..*/.st
ee70: 61 74 69 63 20 69 6e 74 20 6d 75 6c 74 69 53 65  atic int multiSe
ee80: 6c 65 63 74 28 0a 20 20 50 61 72 73 65 20 2a 70  lect(.  Parse *p
ee90: 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 2f 2a  Parse,        /*
eea0: 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74   Parsing context
eeb0: 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 2c   */.  Select *p,
eec0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
eed0: 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 20 6f 66  he right-most of
eee0: 20 53 45 4c 45 43 54 73 20 74 6f 20 62 65 20 63   SELECTs to be c
eef0: 6f 64 65 64 20 2a 2f 0a 20 20 53 65 6c 65 63 74  oded */.  Select
ef00: 44 65 73 74 20 2a 70 44 65 73 74 20 20 20 20 20  Dest *pDest     
ef10: 2f 2a 20 57 68 61 74 20 74 6f 20 64 6f 20 77 69  /* What to do wi
ef20: 74 68 20 71 75 65 72 79 20 72 65 73 75 6c 74 73  th query results
ef30: 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 20   */.){.  int rc 
ef40: 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 2f  = SQLITE_OK;   /
ef50: 2a 20 53 75 63 63 65 73 73 20 63 6f 64 65 20 66  * Success code f
ef60: 72 6f 6d 20 61 20 73 75 62 72 6f 75 74 69 6e 65  rom a subroutine
ef70: 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 50   */.  Select *pP
ef80: 72 69 6f 72 3b 20 20 20 20 20 20 20 2f 2a 20 41  rior;       /* A
ef90: 6e 6f 74 68 65 72 20 53 45 4c 45 43 54 20 69 6d  nother SELECT im
efa0: 6d 65 64 69 61 74 65 6c 79 20 74 6f 20 6f 75 72  mediately to our
efb0: 20 6c 65 66 74 20 2a 2f 0a 20 20 56 64 62 65 20   left */.  Vdbe 
efc0: 2a 76 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  *v;             
efd0: 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64   /* Generate cod
efe0: 65 20 74 6f 20 74 68 69 73 20 56 44 42 45 20 2a  e to this VDBE *
eff0: 2f 0a 20 20 53 65 6c 65 63 74 44 65 73 74 20 64  /.  SelectDest d
f000: 65 73 74 3b 20 20 20 20 20 20 2f 2a 20 41 6c 74  est;      /* Alt
f010: 65 72 6e 61 74 69 76 65 20 64 61 74 61 20 64 65  ernative data de
f020: 73 74 69 6e 61 74 69 6f 6e 20 2a 2f 0a 20 20 53  stination */.  S
f030: 65 6c 65 63 74 20 2a 70 44 65 6c 65 74 65 20 3d  elect *pDelete =
f040: 20 30 3b 20 20 2f 2a 20 43 68 61 69 6e 20 6f 66   0;  /* Chain of
f050: 20 73 69 6d 70 6c 65 20 73 65 6c 65 63 74 73 20   simple selects 
f060: 74 6f 20 64 65 6c 65 74 65 20 2a 2f 0a 0a 20 20  to delete */..  
f070: 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65  /* Make sure the
f080: 72 65 20 69 73 20 6e 6f 20 4f 52 44 45 52 20 42  re is no ORDER B
f090: 59 20 6f 72 20 4c 49 4d 49 54 20 63 6c 61 75 73  Y or LIMIT claus
f0a0: 65 20 6f 6e 20 70 72 69 6f 72 20 53 45 4c 45 43  e on prior SELEC
f0b0: 54 73 2e 20 20 4f 6e 6c 79 0a 20 20 2a 2a 20 74  Ts.  Only.  ** t
f0c0: 68 65 20 6c 61 73 74 20 28 72 69 67 68 74 2d 6d  he last (right-m
f0d0: 6f 73 74 29 20 53 45 4c 45 43 54 20 69 6e 20 74  ost) SELECT in t
f0e0: 68 65 20 73 65 72 69 65 73 20 6d 61 79 20 68 61  he series may ha
f0f0: 76 65 20 61 6e 20 4f 52 44 45 52 20 42 59 20 6f  ve an ORDER BY o
f100: 72 20 4c 49 4d 49 54 2e 0a 20 20 2a 2f 0a 20 20  r LIMIT..  */.  
f110: 69 66 28 20 70 3d 3d 30 20 7c 7c 20 70 2d 3e 70  if( p==0 || p->p
f120: 50 72 69 6f 72 3d 3d 30 20 29 7b 0a 20 20 20 20  Prior==0 ){.    
f130: 72 63 20 3d 20 31 3b 0a 20 20 20 20 67 6f 74 6f  rc = 1;.    goto
f140: 20 6d 75 6c 74 69 5f 73 65 6c 65 63 74 5f 65 6e   multi_select_en
f150: 64 3b 0a 20 20 7d 0a 20 20 70 50 72 69 6f 72 20  d;.  }.  pPrior 
f160: 3d 20 70 2d 3e 70 50 72 69 6f 72 3b 0a 20 20 61  = p->pPrior;.  a
f170: 73 73 65 72 74 28 20 70 50 72 69 6f 72 2d 3e 70  ssert( pPrior->p
f180: 52 69 67 68 74 6d 6f 73 74 21 3d 70 50 72 69 6f  Rightmost!=pPrio
f190: 72 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  r );.  assert( p
f1a0: 50 72 69 6f 72 2d 3e 70 52 69 67 68 74 6d 6f 73  Prior->pRightmos
f1b0: 74 3d 3d 70 2d 3e 70 52 69 67 68 74 6d 6f 73 74  t==p->pRightmost
f1c0: 20 29 3b 0a 20 20 69 66 28 20 70 50 72 69 6f 72   );.  if( pPrior
f1d0: 2d 3e 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20  ->pOrderBy ){.  
f1e0: 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
f1f0: 67 28 70 50 61 72 73 65 2c 22 4f 52 44 45 52 20  g(pParse,"ORDER 
f200: 42 59 20 63 6c 61 75 73 65 20 73 68 6f 75 6c 64  BY clause should
f210: 20 63 6f 6d 65 20 61 66 74 65 72 20 25 73 20 6e   come after %s n
f220: 6f 74 20 62 65 66 6f 72 65 22 2c 0a 20 20 20 20  ot before",.    
f230: 20 20 73 65 6c 65 63 74 4f 70 4e 61 6d 65 28 70    selectOpName(p
f240: 2d 3e 6f 70 29 29 3b 0a 20 20 20 20 72 63 20 3d  ->op));.    rc =
f250: 20 31 3b 0a 20 20 20 20 67 6f 74 6f 20 6d 75 6c   1;.    goto mul
f260: 74 69 5f 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20  ti_select_end;. 
f270: 20 7d 0a 20 20 69 66 28 20 70 50 72 69 6f 72 2d   }.  if( pPrior-
f280: 3e 70 4c 69 6d 69 74 20 29 7b 0a 20 20 20 20 73  >pLimit ){.    s
f290: 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
f2a0: 50 61 72 73 65 2c 22 4c 49 4d 49 54 20 63 6c 61  Parse,"LIMIT cla
f2b0: 75 73 65 20 73 68 6f 75 6c 64 20 63 6f 6d 65 20  use should come 
f2c0: 61 66 74 65 72 20 25 73 20 6e 6f 74 20 62 65 66  after %s not bef
f2d0: 6f 72 65 22 2c 0a 20 20 20 20 20 20 73 65 6c 65  ore",.      sele
f2e0: 63 74 4f 70 4e 61 6d 65 28 70 2d 3e 6f 70 29 29  ctOpName(p->op))
f2f0: 3b 0a 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20  ;.    rc = 1;.  
f300: 20 20 67 6f 74 6f 20 6d 75 6c 74 69 5f 73 65 6c    goto multi_sel
f310: 65 63 74 5f 65 6e 64 3b 0a 20 20 7d 0a 0a 20 20  ect_end;.  }..  
f320: 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 77 65 20  /* Make sure we 
f330: 68 61 76 65 20 61 20 76 61 6c 69 64 20 71 75 65  have a valid que
f340: 72 79 20 65 6e 67 69 6e 65 2e 20 20 49 66 20 6e  ry engine.  If n
f350: 6f 74 2c 20 63 72 65 61 74 65 20 61 20 6e 65 77  ot, create a new
f360: 20 6f 6e 65 2e 0a 20 20 2a 2f 0a 20 20 76 20 3d   one..  */.  v =
f370: 20 73 71 6c 69 74 65 33 47 65 74 56 64 62 65 28   sqlite3GetVdbe(
f380: 70 50 61 72 73 65 29 3b 0a 20 20 69 66 28 20 76  pParse);.  if( v
f390: 3d 3d 30 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  ==0 ){.    rc = 
f3a0: 31 3b 0a 20 20 20 20 67 6f 74 6f 20 6d 75 6c 74  1;.    goto mult
f3b0: 69 5f 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20  i_select_end;.  
f3c0: 7d 0a 0a 20 20 2f 2a 20 43 72 65 61 74 65 20 74  }..  /* Create t
f3d0: 68 65 20 64 65 73 74 69 6e 61 74 69 6f 6e 20 74  he destination t
f3e0: 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20 69  emporary table i
f3f0: 66 20 6e 65 63 65 73 73 61 72 79 0a 20 20 2a 2f  f necessary.  */
f400: 0a 20 20 64 65 73 74 20 3d 20 2a 70 44 65 73 74  .  dest = *pDest
f410: 3b 0a 20 20 69 66 28 20 64 65 73 74 2e 65 44 65  ;.  if( dest.eDe
f420: 73 74 3d 3d 53 52 54 5f 45 70 68 65 6d 54 61 62  st==SRT_EphemTab
f430: 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
f440: 70 2d 3e 70 45 4c 69 73 74 20 29 3b 0a 20 20 20  p->pEList );.   
f450: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
f460: 70 32 28 76 2c 20 4f 50 5f 4f 70 65 6e 45 70 68  p2(v, OP_OpenEph
f470: 65 6d 65 72 61 6c 2c 20 64 65 73 74 2e 69 50 61  emeral, dest.iPa
f480: 72 6d 2c 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e  rm, p->pEList->n
f490: 45 78 70 72 29 3b 0a 20 20 20 20 64 65 73 74 2e  Expr);.    dest.
f4a0: 65 44 65 73 74 20 3d 20 53 52 54 5f 54 61 62 6c  eDest = SRT_Tabl
f4b0: 65 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61 6b  e;.  }..  /* Mak
f4c0: 65 20 73 75 72 65 20 61 6c 6c 20 53 45 4c 45 43  e sure all SELEC
f4d0: 54 73 20 69 6e 20 74 68 65 20 73 74 61 74 65 6d  Ts in the statem
f4e0: 65 6e 74 20 68 61 76 65 20 74 68 65 20 73 61 6d  ent have the sam
f4f0: 65 20 6e 75 6d 62 65 72 20 6f 66 20 65 6c 65 6d  e number of elem
f500: 65 6e 74 73 0a 20 20 2a 2a 20 69 6e 20 74 68 65  ents.  ** in the
f510: 69 72 20 72 65 73 75 6c 74 20 73 65 74 73 2e 0a  ir result sets..
f520: 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70    */.  assert( p
f530: 2d 3e 70 45 4c 69 73 74 20 26 26 20 70 50 72 69  ->pEList && pPri
f540: 6f 72 2d 3e 70 45 4c 69 73 74 20 29 3b 0a 20 20  or->pEList );.  
f550: 69 66 28 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e  if( p->pEList->n
f560: 45 78 70 72 21 3d 70 50 72 69 6f 72 2d 3e 70 45  Expr!=pPrior->pE
f570: 4c 69 73 74 2d 3e 6e 45 78 70 72 20 29 7b 0a 20  List->nExpr ){. 
f580: 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
f590: 73 67 28 70 50 61 72 73 65 2c 20 22 53 45 4c 45  sg(pParse, "SELE
f5a0: 43 54 73 20 74 6f 20 74 68 65 20 6c 65 66 74 20  CTs to the left 
f5b0: 61 6e 64 20 72 69 67 68 74 20 6f 66 20 25 73 22  and right of %s"
f5c0: 0a 20 20 20 20 20 20 22 20 64 6f 20 6e 6f 74 20  .      " do not 
f5d0: 68 61 76 65 20 74 68 65 20 73 61 6d 65 20 6e 75  have the same nu
f5e0: 6d 62 65 72 20 6f 66 20 72 65 73 75 6c 74 20 63  mber of result c
f5f0: 6f 6c 75 6d 6e 73 22 2c 20 73 65 6c 65 63 74 4f  olumns", selectO
f600: 70 4e 61 6d 65 28 70 2d 3e 6f 70 29 29 3b 0a 20  pName(p->op));. 
f610: 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 67     rc = 1;.    g
f620: 6f 74 6f 20 6d 75 6c 74 69 5f 73 65 6c 65 63 74  oto multi_select
f630: 5f 65 6e 64 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  _end;.  }..  /* 
f640: 43 6f 6d 70 6f 75 6e 64 20 53 45 4c 45 43 54 73  Compound SELECTs
f650: 20 74 68 61 74 20 68 61 76 65 20 61 6e 20 4f 52   that have an OR
f660: 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 61 72  DER BY clause ar
f670: 65 20 68 61 6e 64 6c 65 64 20 73 65 70 61 72 61  e handled separa
f680: 74 65 6c 79 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  tely..  */.  if(
f690: 20 70 2d 3e 70 4f 72 64 65 72 42 79 20 29 7b 0a   p->pOrderBy ){.
f6a0: 20 20 20 20 72 65 74 75 72 6e 20 6d 75 6c 74 69      return multi
f6b0: 53 65 6c 65 63 74 4f 72 64 65 72 42 79 28 70 50  SelectOrderBy(pP
f6c0: 61 72 73 65 2c 20 70 2c 20 70 44 65 73 74 29 3b  arse, p, pDest);
f6d0: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 47 65 6e 65 72  .  }..  /* Gener
f6e0: 61 74 65 20 63 6f 64 65 20 66 6f 72 20 74 68 65  ate code for the
f6f0: 20 6c 65 66 74 20 61 6e 64 20 72 69 67 68 74 20   left and right 
f700: 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
f710: 73 2e 0a 20 20 2a 2f 0a 20 20 73 77 69 74 63 68  s..  */.  switch
f720: 28 20 70 2d 3e 6f 70 20 29 7b 0a 20 20 20 20 63  ( p->op ){.    c
f730: 61 73 65 20 54 4b 5f 41 4c 4c 3a 20 7b 0a 20 20  ase TK_ALL: {.  
f740: 20 20 20 20 69 6e 74 20 61 64 64 72 20 3d 20 30      int addr = 0
f750: 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
f760: 21 70 50 72 69 6f 72 2d 3e 70 4c 69 6d 69 74 20  !pPrior->pLimit 
f770: 29 3b 0a 20 20 20 20 20 20 70 50 72 69 6f 72 2d  );.      pPrior-
f780: 3e 70 4c 69 6d 69 74 20 3d 20 70 2d 3e 70 4c 69  >pLimit = p->pLi
f790: 6d 69 74 3b 0a 20 20 20 20 20 20 70 50 72 69 6f  mit;.      pPrio
f7a0: 72 2d 3e 70 4f 66 66 73 65 74 20 3d 20 70 2d 3e  r->pOffset = p->
f7b0: 70 4f 66 66 73 65 74 3b 0a 20 20 20 20 20 20 72  pOffset;.      r
f7c0: 63 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63  c = sqlite3Selec
f7d0: 74 28 70 50 61 72 73 65 2c 20 70 50 72 69 6f 72  t(pParse, pPrior
f7e0: 2c 20 26 64 65 73 74 2c 20 30 2c 20 30 2c 20 30  , &dest, 0, 0, 0
f7f0: 29 3b 0a 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 70 2d  it = 0;.      p-
f810: 3e 70 4f 66 66 73 65 74 20 3d 20 30 3b 0a 20 20  >pOffset = 0;.  
f820: 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20      if( rc ){.  
f830: 20 20 20 20 20 20 67 6f 74 6f 20 6d 75 6c 74 69        goto multi
f840: 5f 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20  _select_end;.   
f850: 20 20 20 7d 0a 20 20 20 20 20 20 70 2d 3e 70 50     }.      p->pP
f860: 72 69 6f 72 20 3d 20 30 3b 0a 20 20 20 20 20 20  rior = 0;.      
f870: 70 2d 3e 69 4c 69 6d 69 74 20 3d 20 70 50 72 69  p->iLimit = pPri
f880: 6f 72 2d 3e 69 4c 69 6d 69 74 3b 0a 20 20 20 20  or->iLimit;.    
f890: 20 20 70 2d 3e 69 4f 66 66 73 65 74 20 3d 20 70    p->iOffset = p
f8a0: 50 72 69 6f 72 2d 3e 69 4f 66 66 73 65 74 3b 0a  Prior->iOffset;.
f8b0: 20 20 20 20 20 20 69 66 28 20 70 2d 3e 69 4c 69        if( p->iLi
f8c0: 6d 69 74 20 29 7b 0a 20 20 20 20 20 20 20 20 61  mit ){.        a
f8d0: 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62  ddr = sqlite3Vdb
f8e0: 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 49 66  eAddOp1(v, OP_If
f8f0: 5a 65 72 6f 2c 20 70 2d 3e 69 4c 69 6d 69 74 29  Zero, p->iLimit)
f900: 3b 0a 20 20 20 20 20 20 20 20 56 64 62 65 43 6f  ;.        VdbeCo
f910: 6d 6d 65 6e 74 28 28 76 2c 20 22 4a 75 6d 70 20  mment((v, "Jump 
f920: 61 68 65 61 64 20 69 66 20 4c 49 4d 49 54 20 72  ahead if LIMIT r
f930: 65 61 63 68 65 64 22 29 29 3b 0a 20 20 20 20 20  eached"));.     
f940: 20 7d 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71   }.      rc = sq
f950: 6c 69 74 65 33 53 65 6c 65 63 74 28 70 50 61 72  lite3Select(pPar
f960: 73 65 2c 20 70 2c 20 26 64 65 73 74 2c 20 30 2c  se, p, &dest, 0,
f970: 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 70 44   0, 0);.      pD
f980: 65 6c 65 74 65 20 3d 20 70 2d 3e 70 50 72 69 6f  elete = p->pPrio
f990: 72 3b 0a 20 20 20 20 20 20 70 2d 3e 70 50 72 69  r;.      p->pPri
f9a0: 6f 72 20 3d 20 70 50 72 69 6f 72 3b 0a 20 20 20  or = pPrior;.   
f9b0: 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20     if( rc ){.   
f9c0: 20 20 20 20 20 67 6f 74 6f 20 6d 75 6c 74 69 5f       goto multi_
f9d0: 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20  select_end;.    
f9e0: 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 61 64    }.      if( ad
f9f0: 64 72 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  dr ){.        sq
fa00: 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72  lite3VdbeJumpHer
fa10: 65 28 76 2c 20 61 64 64 72 29 3b 0a 20 20 20 20  e(v, addr);.    
fa20: 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b    }.      break;
fa30: 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
fa40: 54 4b 5f 45 58 43 45 50 54 3a 0a 20 20 20 20 63  TK_EXCEPT:.    c
fa50: 61 73 65 20 54 4b 5f 55 4e 49 4f 4e 3a 20 7b 0a  ase TK_UNION: {.
fa60: 20 20 20 20 20 20 69 6e 74 20 75 6e 69 6f 6e 54        int unionT
fa70: 61 62 3b 20 20 20 20 2f 2a 20 43 75 72 73 6f 72  ab;    /* Cursor
fa80: 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20 74   number of the t
fa90: 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20 68  emporary table h
faa0: 6f 6c 64 69 6e 67 20 72 65 73 75 6c 74 20 2a 2f  olding result */
fab0: 0a 20 20 20 20 20 20 69 6e 74 20 6f 70 20 3d 20  .      int op = 
fac0: 30 3b 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20 6f  0;      /* One o
fad0: 66 20 74 68 65 20 53 52 54 5f 20 6f 70 65 72 61  f the SRT_ opera
fae0: 74 69 6f 6e 73 20 74 6f 20 61 70 70 6c 79 20 74  tions to apply t
faf0: 6f 20 73 65 6c 66 20 2a 2f 0a 20 20 20 20 20 20  o self */.      
fb00: 69 6e 74 20 70 72 69 6f 72 4f 70 3b 20 20 20 20  int priorOp;    
fb10: 20 2f 2a 20 54 68 65 20 53 52 54 5f 20 6f 70 65   /* The SRT_ ope
fb20: 72 61 74 69 6f 6e 20 74 6f 20 61 70 70 6c 79 20  ration to apply 
fb30: 74 6f 20 70 72 69 6f 72 20 73 65 6c 65 63 74 73  to prior selects
fb40: 20 2a 2f 0a 20 20 20 20 20 20 45 78 70 72 20 2a   */.      Expr *
fb50: 70 4c 69 6d 69 74 2c 20 2a 70 4f 66 66 73 65 74  pLimit, *pOffset
fb60: 3b 20 2f 2a 20 53 61 76 65 64 20 76 61 6c 75 65  ; /* Saved value
fb70: 73 20 6f 66 20 70 2d 3e 6e 4c 69 6d 69 74 20 61  s of p->nLimit a
fb80: 6e 64 20 70 2d 3e 6e 4f 66 66 73 65 74 20 2a 2f  nd p->nOffset */
fb90: 0a 20 20 20 20 20 20 69 6e 74 20 61 64 64 72 3b  .      int addr;
fba0: 0a 20 20 20 20 20 20 53 65 6c 65 63 74 44 65 73  .      SelectDes
fbb0: 74 20 75 6e 69 6f 6e 64 65 73 74 3b 0a 0a 20 20  t uniondest;..  
fbc0: 20 20 20 20 70 72 69 6f 72 4f 70 20 3d 20 53 52      priorOp = SR
fbd0: 54 5f 55 6e 69 6f 6e 3b 0a 20 20 20 20 20 20 69  T_Union;.      i
fbe0: 66 28 20 64 65 73 74 2e 65 44 65 73 74 3d 3d 70  f( dest.eDest==p
fbf0: 72 69 6f 72 4f 70 20 26 26 20 21 70 2d 3e 70 4c  riorOp && !p->pL
fc00: 69 6d 69 74 20 26 26 20 21 70 2d 3e 70 4f 66 66  imit && !p->pOff
fc10: 73 65 74 20 29 7b 0a 20 20 20 20 20 20 20 20 2f  set ){.        /
fc20: 2a 20 57 65 20 63 61 6e 20 72 65 75 73 65 20 61  * We can reuse a
fc30: 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65   temporary table
fc40: 20 67 65 6e 65 72 61 74 65 64 20 62 79 20 61 20   generated by a 
fc50: 53 45 4c 45 43 54 20 74 6f 20 6f 75 72 0a 20 20  SELECT to our.  
fc60: 20 20 20 20 20 20 2a 2a 20 72 69 67 68 74 2e 0a        ** right..
fc70: 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
fc80: 20 20 20 75 6e 69 6f 6e 54 61 62 20 3d 20 64 65     unionTab = de
fc90: 73 74 2e 69 50 61 72 6d 3b 0a 20 20 20 20 20 20  st.iParm;.      
fca0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 2f  }else{.        /
fcb0: 2a 20 57 65 20 77 69 6c 6c 20 6e 65 65 64 20 74  * We will need t
fcc0: 6f 20 63 72 65 61 74 65 20 6f 75 72 20 6f 77 6e  o create our own
fcd0: 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65   temporary table
fce0: 20 74 6f 20 68 6f 6c 64 20 74 68 65 0a 20 20 20   to hold the.   
fcf0: 20 20 20 20 20 2a 2a 20 69 6e 74 65 72 6d 65 64       ** intermed
fd00: 69 61 74 65 20 72 65 73 75 6c 74 73 2e 0a 20 20  iate results..  
fd10: 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
fd20: 20 75 6e 69 6f 6e 54 61 62 20 3d 20 70 50 61 72   unionTab = pPar
fd30: 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20  se->nTab++;.    
fd40: 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70      assert( p->p
fd50: 4f 72 64 65 72 42 79 3d 3d 30 20 29 3b 0a 20 20  OrderBy==0 );.  
fd60: 20 20 20 20 20 20 61 64 64 72 20 3d 20 73 71 6c        addr = sql
fd70: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
fd80: 2c 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72  , OP_OpenEphemer
fd90: 61 6c 2c 20 75 6e 69 6f 6e 54 61 62 2c 20 30 29  al, unionTab, 0)
fda0: 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ;.        assert
fdb0: 28 20 70 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68  ( p->addrOpenEph
fdc0: 6d 5b 30 5d 20 3d 3d 20 2d 31 20 29 3b 0a 20 20  m[0] == -1 );.  
fdd0: 20 20 20 20 20 20 70 2d 3e 61 64 64 72 4f 70 65        p->addrOpe
fde0: 6e 45 70 68 6d 5b 30 5d 20 3d 20 61 64 64 72 3b  nEphm[0] = addr;
fdf0: 0a 20 20 20 20 20 20 20 20 70 2d 3e 70 52 69 67  .        p->pRig
fe00: 68 74 6d 6f 73 74 2d 3e 75 73 65 73 45 70 68 6d  htmost->usesEphm
fe10: 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 61 73   = 1;.        as
fe20: 73 65 72 74 28 20 70 2d 3e 70 45 4c 69 73 74 20  sert( p->pEList 
fe30: 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  );.      }..    
fe40: 20 20 2f 2a 20 43 6f 64 65 20 74 68 65 20 53 45    /* Code the SE
fe50: 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 73 20  LECT statements 
fe60: 74 6f 20 6f 75 72 20 6c 65 66 74 0a 20 20 20 20  to our left.    
fe70: 20 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72    */.      asser
fe80: 74 28 20 21 70 50 72 69 6f 72 2d 3e 70 4f 72 64  t( !pPrior->pOrd
fe90: 65 72 42 79 20 29 3b 0a 20 20 20 20 20 20 73 71  erBy );.      sq
fea0: 6c 69 74 65 33 53 65 6c 65 63 74 44 65 73 74 49  lite3SelectDestI
feb0: 6e 69 74 28 26 75 6e 69 6f 6e 64 65 73 74 2c 20  nit(&uniondest, 
fec0: 70 72 69 6f 72 4f 70 2c 20 75 6e 69 6f 6e 54 61  priorOp, unionTa
fed0: 62 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73  b);.      rc = s
fee0: 71 6c 69 74 65 33 53 65 6c 65 63 74 28 70 50 61  qlite3Select(pPa
fef0: 72 73 65 2c 20 70 50 72 69 6f 72 2c 20 26 75 6e  rse, pPrior, &un
ff00: 69 6f 6e 64 65 73 74 2c 20 30 2c 20 30 2c 20 30  iondest, 0, 0, 0
ff10: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 20  );.      if( rc 
ff20: 29 7b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20  ){.        goto 
ff30: 6d 75 6c 74 69 5f 73 65 6c 65 63 74 5f 65 6e 64  multi_select_end
ff40: 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20  ;.      }..     
ff50: 20 2f 2a 20 43 6f 64 65 20 74 68 65 20 63 75 72   /* Code the cur
ff60: 72 65 6e 74 20 53 45 4c 45 43 54 20 73 74 61 74  rent SELECT stat
ff70: 65 6d 65 6e 74 0a 20 20 20 20 20 20 2a 2f 0a 20  ement.      */. 
ff80: 20 20 20 20 20 73 77 69 74 63 68 28 20 70 2d 3e       switch( p->
ff90: 6f 70 20 29 7b 0a 20 20 20 20 20 20 20 20 20 63  op ){.         c
ffa0: 61 73 65 20 54 4b 5f 45 58 43 45 50 54 3a 20 20  ase TK_EXCEPT:  
ffb0: 6f 70 20 3d 20 53 52 54 5f 45 78 63 65 70 74 3b  op = SRT_Except;
ffc0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
ffd0: 20 20 20 63 61 73 65 20 54 4b 5f 55 4e 49 4f 4e     case TK_UNION
ffe0: 3a 20 20 20 6f 70 20 3d 20 53 52 54 5f 55 6e 69  :   op = SRT_Uni
fff0: 6f 6e 3b 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  on;    break;.  
10000 20 20 20 20 20 20 20 63 61 73 65 20 54 4b 5f 41         case TK_A
10010 4c 4c 3a 20 20 20 20 20 6f 70 20 3d 20 53 52 54  LL:     op = SRT
10020 5f 54 61 62 6c 65 3b 20 20 20 20 62 72 65 61 6b  _Table;    break
10030 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
10040 70 2d 3e 70 50 72 69 6f 72 20 3d 20 30 3b 0a 20  p->pPrior = 0;. 
10050 20 20 20 20 20 70 2d 3e 64 69 73 61 6c 6c 6f 77       p->disallow
10060 4f 72 64 65 72 42 79 20 3d 20 30 3b 0a 20 20 20  OrderBy = 0;.   
10070 20 20 20 70 4c 69 6d 69 74 20 3d 20 70 2d 3e 70     pLimit = p->p
10080 4c 69 6d 69 74 3b 0a 20 20 20 20 20 20 70 2d 3e  Limit;.      p->
10090 70 4c 69 6d 69 74 20 3d 20 30 3b 0a 20 20 20 20  pLimit = 0;.    
100a0 20 20 70 4f 66 66 73 65 74 20 3d 20 70 2d 3e 70    pOffset = p->p
100b0 4f 66 66 73 65 74 3b 0a 20 20 20 20 20 20 70 2d  Offset;.      p-
100c0 3e 70 4f 66 66 73 65 74 20 3d 20 30 3b 0a 20 20  >pOffset = 0;.  
100d0 20 20 20 20 75 6e 69 6f 6e 64 65 73 74 2e 65 44      uniondest.eD
100e0 65 73 74 20 3d 20 6f 70 3b 0a 20 20 20 20 20 20  est = op;.      
100f0 72 63 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65  rc = sqlite3Sele
10100 63 74 28 70 50 61 72 73 65 2c 20 70 2c 20 26 75  ct(pParse, p, &u
10110 6e 69 6f 6e 64 65 73 74 2c 20 30 2c 20 30 2c 20  niondest, 0, 0, 
10120 30 29 3b 0a 20 20 20 20 20 20 2f 2a 20 51 75 65  0);.      /* Que
10130 72 79 20 66 6c 61 74 74 65 6e 69 6e 67 20 69 6e  ry flattening in
10140 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28 29   sqlite3Select()
10150 20 6d 69 67 68 74 20 72 65 66 69 6c 6c 20 70 2d   might refill p-
10160 3e 70 4f 72 64 65 72 42 79 2e 0a 20 20 20 20 20  >pOrderBy..     
10170 20 2a 2a 20 42 65 20 73 75 72 65 20 74 6f 20 64   ** Be sure to d
10180 65 6c 65 74 65 20 70 2d 3e 70 4f 72 64 65 72 42  elete p->pOrderB
10190 79 2c 20 74 68 65 72 65 66 6f 72 65 2c 20 74 6f  y, therefore, to
101a0 20 61 76 6f 69 64 20 61 20 6d 65 6d 6f 72 79 20   avoid a memory 
101b0 6c 65 61 6b 2e 20 2a 2f 0a 20 20 20 20 20 20 73  leak. */.      s
101c0 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 65  qlite3ExprListDe
101d0 6c 65 74 65 28 70 2d 3e 70 4f 72 64 65 72 42 79  lete(p->pOrderBy
101e0 29 3b 0a 20 20 20 20 20 20 70 44 65 6c 65 74 65  );.      pDelete
101f0 20 3d 20 70 2d 3e 70 50 72 69 6f 72 3b 0a 20 20   = p->pPrior;.  
10200 20 20 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d 20      p->pPrior = 
10210 70 50 72 69 6f 72 3b 0a 20 20 20 20 20 20 70 2d  pPrior;.      p-
10220 3e 70 4f 72 64 65 72 42 79 20 3d 20 30 3b 0a 20  >pOrderBy = 0;. 
10230 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
10240 44 65 6c 65 74 65 28 70 2d 3e 70 4c 69 6d 69 74  Delete(p->pLimit
10250 29 3b 0a 20 20 20 20 20 20 70 2d 3e 70 4c 69 6d  );.      p->pLim
10260 69 74 20 3d 20 70 4c 69 6d 69 74 3b 0a 20 20 20  it = pLimit;.   
10270 20 20 20 70 2d 3e 70 4f 66 66 73 65 74 20 3d 20     p->pOffset = 
10280 70 4f 66 66 73 65 74 3b 0a 20 20 20 20 20 20 70  pOffset;.      p
10290 2d 3e 69 4c 69 6d 69 74 20 3d 20 30 3b 0a 20 20  ->iLimit = 0;.  
102a0 20 20 20 20 70 2d 3e 69 4f 66 66 73 65 74 20 3d      p->iOffset =
102b0 20 30 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63   0;.      if( rc
102c0 20 29 7b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f   ){.        goto
102d0 20 6d 75 6c 74 69 5f 73 65 6c 65 63 74 5f 65 6e   multi_select_en
102e0 64 3b 0a 20 20 20 20 20 20 7d 0a 0a 0a 20 20 20  d;.      }...   
102f0 20 20 20 2f 2a 20 43 6f 6e 76 65 72 74 20 74 68     /* Convert th
10300 65 20 64 61 74 61 20 69 6e 20 74 68 65 20 74 65  e data in the te
10310 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20 69 6e  mporary table in
10320 74 6f 20 77 68 61 74 65 76 65 72 20 66 6f 72 6d  to whatever form
10330 0a 20 20 20 20 20 20 2a 2a 20 69 74 20 69 73 20  .      ** it is 
10340 74 68 61 74 20 77 65 20 63 75 72 72 65 6e 74 6c  that we currentl
10350 79 20 6e 65 65 64 2e 0a 20 20 20 20 20 20 2a 2f  y need..      */
10360 20 20 20 20 20 20 0a 20 20 20 20 20 20 69 66 28        .      if(
10370 20 64 65 73 74 2e 65 44 65 73 74 21 3d 70 72 69   dest.eDest!=pri
10380 6f 72 4f 70 20 7c 7c 20 75 6e 69 6f 6e 54 61 62  orOp || unionTab
10390 21 3d 64 65 73 74 2e 69 50 61 72 6d 20 29 7b 0a  !=dest.iParm ){.
103a0 20 20 20 20 20 20 20 20 69 6e 74 20 69 43 6f 6e          int iCon
103b0 74 2c 20 69 42 72 65 61 6b 2c 20 69 53 74 61 72  t, iBreak, iStar
103c0 74 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  t;.        asser
103d0 74 28 20 70 2d 3e 70 45 4c 69 73 74 20 29 3b 0a  t( p->pEList );.
103e0 20 20 20 20 20 20 20 20 69 66 28 20 64 65 73 74          if( dest
103f0 2e 65 44 65 73 74 3d 3d 53 52 54 5f 43 61 6c 6c  .eDest==SRT_Call
10400 62 61 63 6b 20 29 7b 0a 20 20 20 20 20 20 20 20  back ){.        
10410 20 20 53 65 6c 65 63 74 20 2a 70 46 69 72 73 74    Select *pFirst
10420 20 3d 20 70 3b 0a 20 20 20 20 20 20 20 20 20 20   = p;.          
10430 77 68 69 6c 65 28 20 70 46 69 72 73 74 2d 3e 70  while( pFirst->p
10440 50 72 69 6f 72 20 29 20 70 46 69 72 73 74 20 3d  Prior ) pFirst =
10450 20 70 46 69 72 73 74 2d 3e 70 50 72 69 6f 72 3b   pFirst->pPrior;
10460 0a 20 20 20 20 20 20 20 20 20 20 67 65 6e 65 72  .          gener
10470 61 74 65 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 70  ateColumnNames(p
10480 50 61 72 73 65 2c 20 30 2c 20 70 46 69 72 73 74  Parse, 0, pFirst
10490 2d 3e 70 45 4c 69 73 74 29 3b 0a 20 20 20 20 20  ->pEList);.     
104a0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 42 72     }.        iBr
104b0 65 61 6b 20 3d 20 73 71 6c 69 74 65 33 56 64 62  eak = sqlite3Vdb
104c0 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20  eMakeLabel(v);. 
104d0 20 20 20 20 20 20 20 69 43 6f 6e 74 20 3d 20 73         iCont = s
104e0 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61  qlite3VdbeMakeLa
104f0 62 65 6c 28 76 29 3b 0a 20 20 20 20 20 20 20 20  bel(v);.        
10500 63 6f 6d 70 75 74 65 4c 69 6d 69 74 52 65 67 69  computeLimitRegi
10510 73 74 65 72 73 28 70 50 61 72 73 65 2c 20 70 2c  sters(pParse, p,
10520 20 69 42 72 65 61 6b 29 3b 0a 20 20 20 20 20 20   iBreak);.      
10530 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
10540 4f 70 32 28 76 2c 20 4f 50 5f 52 65 77 69 6e 64  Op2(v, OP_Rewind
10550 2c 20 75 6e 69 6f 6e 54 61 62 2c 20 69 42 72 65  , unionTab, iBre
10560 61 6b 29 3b 0a 20 20 20 20 20 20 20 20 69 53 74  ak);.        iSt
10570 61 72 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62  art = sqlite3Vdb
10580 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b  eCurrentAddr(v);
10590 0a 20 20 20 20 20 20 20 20 73 65 6c 65 63 74 49  .        selectI
105a0 6e 6e 65 72 4c 6f 6f 70 28 70 50 61 72 73 65 2c  nnerLoop(pParse,
105b0 20 70 2c 20 70 2d 3e 70 45 4c 69 73 74 2c 20 75   p, p->pEList, u
105c0 6e 69 6f 6e 54 61 62 2c 20 70 2d 3e 70 45 4c 69  nionTab, p->pELi
105d0 73 74 2d 3e 6e 45 78 70 72 2c 0a 20 20 20 20 20  st->nExpr,.     
105e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
105f0 20 20 20 30 2c 20 2d 31 2c 20 26 64 65 73 74 2c     0, -1, &dest,
10600 20 69 43 6f 6e 74 2c 20 69 42 72 65 61 6b 29 3b   iCont, iBreak);
10610 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
10620 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c  VdbeResolveLabel
10630 28 76 2c 20 69 43 6f 6e 74 29 3b 0a 20 20 20 20  (v, iCont);.    
10640 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
10650 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 65 78 74  ddOp2(v, OP_Next
10660 2c 20 75 6e 69 6f 6e 54 61 62 2c 20 69 53 74 61  , unionTab, iSta
10670 72 74 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  rt);.        sql
10680 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c  ite3VdbeResolveL
10690 61 62 65 6c 28 76 2c 20 69 42 72 65 61 6b 29 3b  abel(v, iBreak);
106a0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
106b0 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
106c0 5f 43 6c 6f 73 65 2c 20 75 6e 69 6f 6e 54 61 62  _Close, unionTab
106d0 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  , 0);.      }.  
106e0 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
106f0 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49 4e 54  .    case TK_INT
10700 45 52 53 45 43 54 3a 20 7b 0a 20 20 20 20 20 20  ERSECT: {.      
10710 69 6e 74 20 74 61 62 31 2c 20 74 61 62 32 3b 0a  int tab1, tab2;.
10720 20 20 20 20 20 20 69 6e 74 20 69 43 6f 6e 74 2c        int iCont,
10730 20 69 42 72 65 61 6b 2c 20 69 53 74 61 72 74 3b   iBreak, iStart;
10740 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 4c 69  .      Expr *pLi
10750 6d 69 74 2c 20 2a 70 4f 66 66 73 65 74 3b 0a 20  mit, *pOffset;. 
10760 20 20 20 20 20 69 6e 74 20 61 64 64 72 3b 0a 20       int addr;. 
10770 20 20 20 20 20 53 65 6c 65 63 74 44 65 73 74 20       SelectDest 
10780 69 6e 74 65 72 73 65 63 74 64 65 73 74 3b 0a 20  intersectdest;. 
10790 20 20 20 20 20 69 6e 74 20 72 31 3b 0a 0a 20 20       int r1;..  
107a0 20 20 20 20 2f 2a 20 49 4e 54 45 52 53 45 43 54      /* INTERSECT
107b0 20 69 73 20 64 69 66 66 65 72 65 6e 74 20 66 72   is different fr
107c0 6f 6d 20 74 68 65 20 6f 74 68 65 72 73 20 73 69  om the others si
107d0 6e 63 65 20 69 74 20 72 65 71 75 69 72 65 73 0a  nce it requires.
107e0 20 20 20 20 20 20 2a 2a 20 74 77 6f 20 74 65 6d        ** two tem
107f0 70 6f 72 61 72 79 20 74 61 62 6c 65 73 2e 20 20  porary tables.  
10800 48 65 6e 63 65 20 69 74 20 68 61 73 20 69 74 73  Hence it has its
10810 20 6f 77 6e 20 63 61 73 65 2e 20 20 42 65 67 69   own case.  Begi
10820 6e 0a 20 20 20 20 20 20 2a 2a 20 62 79 20 61 6c  n.      ** by al
10830 6c 6f 63 61 74 69 6e 67 20 74 68 65 20 74 61 62  locating the tab
10840 6c 65 73 20 77 65 20 77 69 6c 6c 20 6e 65 65 64  les we will need
10850 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
10860 20 74 61 62 31 20 3d 20 70 50 61 72 73 65 2d 3e   tab1 = pParse->
10870 6e 54 61 62 2b 2b 3b 0a 20 20 20 20 20 20 74 61  nTab++;.      ta
10880 62 32 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61  b2 = pParse->nTa
10890 62 2b 2b 3b 0a 20 20 20 20 20 20 61 73 73 65 72  b++;.      asser
108a0 74 28 20 70 2d 3e 70 4f 72 64 65 72 42 79 3d 3d  t( p->pOrderBy==
108b0 30 20 29 3b 0a 0a 20 20 20 20 20 20 61 64 64 72  0 );..      addr
108c0 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   = sqlite3VdbeAd
108d0 64 4f 70 32 28 76 2c 20 4f 50 5f 4f 70 65 6e 45  dOp2(v, OP_OpenE
108e0 70 68 65 6d 65 72 61 6c 2c 20 74 61 62 31 2c 20  phemeral, tab1, 
108f0 30 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  0);.      assert
10900 28 20 70 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68  ( p->addrOpenEph
10910 6d 5b 30 5d 20 3d 3d 20 2d 31 20 29 3b 0a 20 20  m[0] == -1 );.  
10920 20 20 20 20 70 2d 3e 61 64 64 72 4f 70 65 6e 45      p->addrOpenE
10930 70 68 6d 5b 30 5d 20 3d 20 61 64 64 72 3b 0a 20  phm[0] = addr;. 
10940 20 20 20 20 20 70 2d 3e 70 52 69 67 68 74 6d 6f       p->pRightmo
10950 73 74 2d 3e 75 73 65 73 45 70 68 6d 20 3d 20 31  st->usesEphm = 1
10960 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
10970 70 2d 3e 70 45 4c 69 73 74 20 29 3b 0a 0a 20 20  p->pEList );..  
10980 20 20 20 20 2f 2a 20 43 6f 64 65 20 74 68 65 20      /* Code the 
10990 53 45 4c 45 43 54 73 20 74 6f 20 6f 75 72 20 6c  SELECTs to our l
109a0 65 66 74 20 69 6e 74 6f 20 74 65 6d 70 6f 72 61  eft into tempora
109b0 72 79 20 74 61 62 6c 65 20 22 74 61 62 31 22 2e  ry table "tab1".
109c0 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
109d0 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65 73  sqlite3SelectDes
109e0 74 49 6e 69 74 28 26 69 6e 74 65 72 73 65 63 74  tInit(&intersect
109f0 64 65 73 74 2c 20 53 52 54 5f 55 6e 69 6f 6e 2c  dest, SRT_Union,
10a00 20 74 61 62 31 29 3b 0a 20 20 20 20 20 20 72 63   tab1);.      rc
10a10 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74   = sqlite3Select
10a20 28 70 50 61 72 73 65 2c 20 70 50 72 69 6f 72 2c  (pParse, pPrior,
10a30 20 26 69 6e 74 65 72 73 65 63 74 64 65 73 74 2c   &intersectdest,
10a40 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20   0, 0, 0);.     
10a50 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20   if( rc ){.     
10a60 20 20 20 67 6f 74 6f 20 6d 75 6c 74 69 5f 73 65     goto multi_se
10a70 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 20 20  lect_end;.      
10a80 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 43 6f 64 65  }..      /* Code
10a90 20 74 68 65 20 63 75 72 72 65 6e 74 20 53 45 4c   the current SEL
10aa0 45 43 54 20 69 6e 74 6f 20 74 65 6d 70 6f 72 61  ECT into tempora
10ab0 72 79 20 74 61 62 6c 65 20 22 74 61 62 32 22 0a  ry table "tab2".
10ac0 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 61        */.      a
10ad0 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62  ddr = sqlite3Vdb
10ae0 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4f 70  eAddOp2(v, OP_Op
10af0 65 6e 45 70 68 65 6d 65 72 61 6c 2c 20 74 61 62  enEphemeral, tab
10b00 32 2c 20 30 29 3b 0a 20 20 20 20 20 20 61 73 73  2, 0);.      ass
10b10 65 72 74 28 20 70 2d 3e 61 64 64 72 4f 70 65 6e  ert( p->addrOpen
10b20 45 70 68 6d 5b 31 5d 20 3d 3d 20 2d 31 20 29 3b  Ephm[1] == -1 );
10b30 0a 20 20 20 20 20 20 70 2d 3e 61 64 64 72 4f 70  .      p->addrOp
10b40 65 6e 45 70 68 6d 5b 31 5d 20 3d 20 61 64 64 72  enEphm[1] = addr
10b50 3b 0a 20 20 20 20 20 20 70 2d 3e 70 50 72 69 6f  ;.      p->pPrio
10b60 72 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 4c 69  r = 0;.      pLi
10b70 6d 69 74 20 3d 20 70 2d 3e 70 4c 69 6d 69 74 3b  mit = p->pLimit;
10b80 0a 20 20 20 20 20 20 70 2d 3e 70 4c 69 6d 69 74  .      p->pLimit
10b90 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 4f 66 66   = 0;.      pOff
10ba0 73 65 74 20 3d 20 70 2d 3e 70 4f 66 66 73 65 74  set = p->pOffset
10bb0 3b 0a 20 20 20 20 20 20 70 2d 3e 70 4f 66 66 73  ;.      p->pOffs
10bc0 65 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 69 6e  et = 0;.      in
10bd0 74 65 72 73 65 63 74 64 65 73 74 2e 69 50 61 72  tersectdest.iPar
10be0 6d 20 3d 20 74 61 62 32 3b 0a 20 20 20 20 20 20  m = tab2;.      
10bf0 72 63 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65  rc = sqlite3Sele
10c00 63 74 28 70 50 61 72 73 65 2c 20 70 2c 20 26 69  ct(pParse, p, &i
10c10 6e 74 65 72 73 65 63 74 64 65 73 74 2c 20 30 2c  ntersectdest, 0,
10c20 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 70 44   0, 0);.      pD
10c30 65 6c 65 74 65 20 3d 20 70 2d 3e 70 50 72 69 6f  elete = p->pPrio
10c40 72 3b 0a 20 20 20 20 20 20 70 2d 3e 70 50 72 69  r;.      p->pPri
10c50 6f 72 20 3d 20 70 50 72 69 6f 72 3b 0a 20 20 20  or = pPrior;.   
10c60 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65     sqlite3ExprDe
10c70 6c 65 74 65 28 70 2d 3e 70 4c 69 6d 69 74 29 3b  lete(p->pLimit);
10c80 0a 20 20 20 20 20 20 70 2d 3e 70 4c 69 6d 69 74  .      p->pLimit
10c90 20 3d 20 70 4c 69 6d 69 74 3b 0a 20 20 20 20 20   = pLimit;.     
10ca0 20 70 2d 3e 70 4f 66 66 73 65 74 20 3d 20 70 4f   p->pOffset = pO
10cb0 66 66 73 65 74 3b 0a 20 20 20 20 20 20 69 66 28  ffset;.      if(
10cc0 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20 67   rc ){.        g
10cd0 6f 74 6f 20 6d 75 6c 74 69 5f 73 65 6c 65 63 74  oto multi_select
10ce0 5f 65 6e 64 3b 0a 20 20 20 20 20 20 7d 0a 0a 20  _end;.      }.. 
10cf0 20 20 20 20 20 2f 2a 20 47 65 6e 65 72 61 74 65       /* Generate
10d00 20 63 6f 64 65 20 74 6f 20 74 61 6b 65 20 74 68   code to take th
10d10 65 20 69 6e 74 65 72 73 65 63 74 69 6f 6e 20 6f  e intersection o
10d20 66 20 74 68 65 20 74 77 6f 20 74 65 6d 70 6f 72  f the two tempor
10d30 61 72 79 0a 20 20 20 20 20 20 2a 2a 20 74 61 62  ary.      ** tab
10d40 6c 65 73 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  les..      */.  
10d50 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70      assert( p->p
10d60 45 4c 69 73 74 20 29 3b 0a 20 20 20 20 20 20 69  EList );.      i
10d70 66 28 20 64 65 73 74 2e 65 44 65 73 74 3d 3d 53  f( dest.eDest==S
10d80 52 54 5f 43 61 6c 6c 62 61 63 6b 20 29 7b 0a 20  RT_Callback ){. 
10d90 20 20 20 20 20 20 20 53 65 6c 65 63 74 20 2a 70         Select *p
10da0 46 69 72 73 74 20 3d 20 70 3b 0a 20 20 20 20 20  First = p;.     
10db0 20 20 20 77 68 69 6c 65 28 20 70 46 69 72 73 74     while( pFirst
10dc0 2d 3e 70 50 72 69 6f 72 20 29 20 70 46 69 72 73  ->pPrior ) pFirs
10dd0 74 20 3d 20 70 46 69 72 73 74 2d 3e 70 50 72 69  t = pFirst->pPri
10de0 6f 72 3b 0a 20 20 20 20 20 20 20 20 67 65 6e 65  or;.        gene
10df0 72 61 74 65 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28  rateColumnNames(
10e00 70 50 61 72 73 65 2c 20 30 2c 20 70 46 69 72 73  pParse, 0, pFirs
10e10 74 2d 3e 70 45 4c 69 73 74 29 3b 0a 20 20 20 20  t->pEList);.    
10e20 20 20 7d 0a 20 20 20 20 20 20 69 42 72 65 61 6b    }.      iBreak
10e30 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61   = sqlite3VdbeMa
10e40 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20  keLabel(v);.    
10e50 20 20 69 43 6f 6e 74 20 3d 20 73 71 6c 69 74 65    iCont = sqlite
10e60 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76  3VdbeMakeLabel(v
10e70 29 3b 0a 20 20 20 20 20 20 63 6f 6d 70 75 74 65  );.      compute
10e80 4c 69 6d 69 74 52 65 67 69 73 74 65 72 73 28 70  LimitRegisters(p
10e90 50 61 72 73 65 2c 20 70 2c 20 69 42 72 65 61 6b  Parse, p, iBreak
10ea0 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
10eb0 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
10ec0 5f 52 65 77 69 6e 64 2c 20 74 61 62 31 2c 20 69  _Rewind, tab1, i
10ed0 42 72 65 61 6b 29 3b 0a 20 20 20 20 20 20 72 31  Break);.      r1
10ee0 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d   = sqlite3GetTem
10ef0 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20  pReg(pParse);.  
10f00 20 20 20 20 69 53 74 61 72 74 20 3d 20 73 71 6c      iStart = sql
10f10 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
10f20 2c 20 4f 50 5f 52 6f 77 4b 65 79 2c 20 74 61 62  , OP_RowKey, tab
10f30 31 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 73 71  1, r1);.      sq
10f40 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
10f50 76 2c 20 4f 50 5f 4e 6f 74 46 6f 75 6e 64 2c 20  v, OP_NotFound, 
10f60 74 61 62 32 2c 20 69 43 6f 6e 74 2c 20 72 31 29  tab2, iCont, r1)
10f70 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 52  ;.      sqlite3R
10f80 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50  eleaseTempReg(pP
10f90 61 72 73 65 2c 20 72 31 29 3b 0a 20 20 20 20 20  arse, r1);.     
10fa0 20 73 65 6c 65 63 74 49 6e 6e 65 72 4c 6f 6f 70   selectInnerLoop
10fb0 28 70 50 61 72 73 65 2c 20 70 2c 20 70 2d 3e 70  (pParse, p, p->p
10fc0 45 4c 69 73 74 2c 20 74 61 62 31 2c 20 70 2d 3e  EList, tab1, p->
10fd0 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 2c 0a 20  pEList->nExpr,. 
10fe0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10ff0 20 20 20 20 20 30 2c 20 2d 31 2c 20 26 64 65 73       0, -1, &des
11000 74 2c 20 69 43 6f 6e 74 2c 20 69 42 72 65 61 6b  t, iCont, iBreak
11010 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
11020 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c  VdbeResolveLabel
11030 28 76 2c 20 69 43 6f 6e 74 29 3b 0a 20 20 20 20  (v, iCont);.    
11040 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
11050 4f 70 32 28 76 2c 20 4f 50 5f 4e 65 78 74 2c 20  Op2(v, OP_Next, 
11060 74 61 62 31 2c 20 69 53 74 61 72 74 29 3b 0a 20  tab1, iStart);. 
11070 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
11080 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20  ResolveLabel(v, 
11090 69 42 72 65 61 6b 29 3b 0a 20 20 20 20 20 20 73  iBreak);.      s
110a0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
110b0 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 74 61  (v, OP_Close, ta
110c0 62 32 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71  b2, 0);.      sq
110d0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
110e0 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 74 61 62  v, OP_Close, tab
110f0 31 2c 20 30 29 3b 0a 20 20 20 20 20 20 62 72 65  1, 0);.      bre
11100 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  ak;.    }.  }.. 
11110 20 2f 2a 20 43 6f 6d 70 75 74 65 20 63 6f 6c 6c   /* Compute coll
11120 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65 73 20  ating sequences 
11130 75 73 65 64 20 62 79 20 0a 20 20 2a 2a 20 74 65  used by .  ** te
11140 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 73 20 6e  mporary tables n
11150 65 65 64 65 64 20 74 6f 20 69 6d 70 6c 65 6d 65  eeded to impleme
11160 6e 74 20 74 68 65 20 63 6f 6d 70 6f 75 6e 64 20  nt the compound 
11170 73 65 6c 65 63 74 2e 0a 20 20 2a 2a 20 41 74 74  select..  ** Att
11180 61 63 68 20 74 68 65 20 4b 65 79 49 6e 66 6f 20  ach the KeyInfo 
11190 73 74 72 75 63 74 75 72 65 20 74 6f 20 61 6c 6c  structure to all
111a0 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65   temporary table
111b0 73 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 69  s..  **.  ** Thi
111c0 73 20 73 65 63 74 69 6f 6e 20 69 73 20 72 75 6e  s section is run
111d0 20 62 79 20 74 68 65 20 72 69 67 68 74 2d 6d 6f   by the right-mo
111e0 73 74 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d  st SELECT statem
111f0 65 6e 74 20 6f 6e 6c 79 2e 0a 20 20 2a 2a 20 53  ent only..  ** S
11200 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 73  ELECT statements
11210 20 74 6f 20 74 68 65 20 6c 65 66 74 20 61 6c 77   to the left alw
11220 61 79 73 20 73 6b 69 70 20 74 68 69 73 20 70 61  ays skip this pa
11230 72 74 2e 20 20 54 68 65 20 72 69 67 68 74 2d 6d  rt.  The right-m
11240 6f 73 74 0a 20 20 2a 2a 20 53 45 4c 45 43 54 20  ost.  ** SELECT 
11250 6d 69 67 68 74 20 61 6c 73 6f 20 73 6b 69 70 20  might also skip 
11260 74 68 69 73 20 70 61 72 74 20 69 66 20 69 74 20  this part if it 
11270 68 61 73 20 6e 6f 20 4f 52 44 45 52 20 42 59 20  has no ORDER BY 
11280 63 6c 61 75 73 65 20 61 6e 64 0a 20 20 2a 2a 20  clause and.  ** 
11290 6e 6f 20 74 65 6d 70 20 74 61 62 6c 65 73 20 61  no temp tables a
112a0 72 65 20 72 65 71 75 69 72 65 64 2e 0a 20 20 2a  re required..  *
112b0 2f 0a 20 20 69 66 28 20 70 2d 3e 75 73 65 73 45  /.  if( p->usesE
112c0 70 68 6d 20 29 7b 0a 20 20 20 20 69 6e 74 20 69  phm ){.    int i
112d0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
112e0 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70           /* Loop
112f0 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 20 20   counter */.    
11300 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66  KeyInfo *pKeyInf
11310 6f 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  o;            /*
11320 20 43 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65   Collating seque
11330 6e 63 65 20 66 6f 72 20 74 68 65 20 72 65 73 75  nce for the resu
11340 6c 74 20 73 65 74 20 2a 2f 0a 20 20 20 20 53 65  lt set */.    Se
11350 6c 65 63 74 20 2a 70 4c 6f 6f 70 3b 20 20 20 20  lect *pLoop;    
11360 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
11370 6f 72 20 6c 6f 6f 70 69 6e 67 20 74 68 72 6f 75  or looping throu
11380 67 68 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d  gh SELECT statem
11390 65 6e 74 73 20 2a 2f 0a 20 20 20 20 43 6f 6c 6c  ents */.    Coll
113a0 53 65 71 20 2a 2a 61 70 43 6f 6c 6c 3b 20 20 20  Seq **apColl;   
113b0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6f 72            /* For
113c0 20 6c 6f 6f 70 69 6e 67 20 74 68 72 6f 75 67 68   looping through
113d0 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 43 6f 6c 6c   pKeyInfo->aColl
113e0 5b 5d 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 43  [] */.    int nC
113f0 6f 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ol;             
11400 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
11410 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 69 6e 20  r of columns in 
11420 72 65 73 75 6c 74 20 73 65 74 20 2a 2f 0a 0a 20  result set */.. 
11430 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 52     assert( p->pR
11440 69 67 68 74 6d 6f 73 74 3d 3d 70 20 29 3b 0a 20  ightmost==p );. 
11450 20 20 20 6e 43 6f 6c 20 3d 20 70 2d 3e 70 45 4c     nCol = p->pEL
11460 69 73 74 2d 3e 6e 45 78 70 72 3b 0a 20 20 20 20  ist->nExpr;.    
11470 70 4b 65 79 49 6e 66 6f 20 3d 20 73 71 6c 69 74  pKeyInfo = sqlit
11480 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 70  e3DbMallocZero(p
11490 50 61 72 73 65 2d 3e 64 62 2c 0a 20 20 20 20 20  Parse->db,.     
114a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
114b0 20 20 73 69 7a 65 6f 66 28 2a 70 4b 65 79 49 6e    sizeof(*pKeyIn
114c0 66 6f 29 2b 6e 43 6f 6c 2a 28 73 69 7a 65 6f 66  fo)+nCol*(sizeof
114d0 28 43 6f 6c 6c 53 65 71 2a 29 20 2b 20 31 29 29  (CollSeq*) + 1))
114e0 3b 0a 20 20 20 20 69 66 28 20 21 70 4b 65 79 49  ;.    if( !pKeyI
114f0 6e 66 6f 20 29 7b 0a 20 20 20 20 20 20 72 63 20  nfo ){.      rc 
11500 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  = SQLITE_NOMEM;.
11510 20 20 20 20 20 20 67 6f 74 6f 20 6d 75 6c 74 69        goto multi
11520 5f 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20  _select_end;.   
11530 20 7d 0a 0a 20 20 20 20 70 4b 65 79 49 6e 66 6f   }..    pKeyInfo
11540 2d 3e 65 6e 63 20 3d 20 45 4e 43 28 70 50 61 72  ->enc = ENC(pPar
11550 73 65 2d 3e 64 62 29 3b 0a 20 20 20 20 70 4b 65  se->db);.    pKe
11560 79 49 6e 66 6f 2d 3e 6e 46 69 65 6c 64 20 3d 20  yInfo->nField = 
11570 6e 43 6f 6c 3b 0a 0a 20 20 20 20 66 6f 72 28 69  nCol;..    for(i
11580 3d 30 2c 20 61 70 43 6f 6c 6c 3d 70 4b 65 79 49  =0, apColl=pKeyI
11590 6e 66 6f 2d 3e 61 43 6f 6c 6c 3b 20 69 3c 6e 43  nfo->aColl; i<nC
115a0 6f 6c 3b 20 69 2b 2b 2c 20 61 70 43 6f 6c 6c 2b  ol; i++, apColl+
115b0 2b 29 7b 0a 20 20 20 20 20 20 2a 61 70 43 6f 6c  +){.      *apCol
115c0 6c 20 3d 20 6d 75 6c 74 69 53 65 6c 65 63 74 43  l = multiSelectC
115d0 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70  ollSeq(pParse, p
115e0 2c 20 69 29 3b 0a 20 20 20 20 20 20 69 66 28 20  , i);.      if( 
115f0 30 3d 3d 2a 61 70 43 6f 6c 6c 20 29 7b 0a 20 20  0==*apColl ){.  
11600 20 20 20 20 20 20 2a 61 70 43 6f 6c 6c 20 3d 20        *apColl = 
11610 70 50 61 72 73 65 2d 3e 64 62 2d 3e 70 44 66 6c  pParse->db->pDfl
11620 74 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 7d 0a 20  tColl;.      }. 
11630 20 20 20 7d 0a 0a 20 20 20 20 66 6f 72 28 70 4c     }..    for(pL
11640 6f 6f 70 3d 70 3b 20 70 4c 6f 6f 70 3b 20 70 4c  oop=p; pLoop; pL
11650 6f 6f 70 3d 70 4c 6f 6f 70 2d 3e 70 50 72 69 6f  oop=pLoop->pPrio
11660 72 29 7b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d  r){.      for(i=
11670 30 3b 20 69 3c 32 3b 20 69 2b 2b 29 7b 0a 20 20  0; i<2; i++){.  
11680 20 20 20 20 20 20 69 6e 74 20 61 64 64 72 20 3d        int addr =
11690 20 70 4c 6f 6f 70 2d 3e 61 64 64 72 4f 70 65 6e   pLoop->addrOpen
116a0 45 70 68 6d 5b 69 5d 3b 0a 20 20 20 20 20 20 20  Ephm[i];.       
116b0 20 69 66 28 20 61 64 64 72 3c 30 20 29 7b 0a 20   if( addr<0 ){. 
116c0 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 5b           /* If [
116d0 30 5d 20 69 73 20 75 6e 75 73 65 64 20 74 68 65  0] is unused the
116e0 6e 20 5b 31 5d 20 69 73 20 61 6c 73 6f 20 75 6e  n [1] is also un
116f0 75 73 65 64 2e 20 20 53 6f 20 77 65 20 63 61 6e  used.  So we can
11700 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 61 6c  .          ** al
11710 77 61 79 73 20 73 61 66 65 6c 79 20 61 62 6f 72  ways safely abor
11720 74 20 61 73 20 73 6f 6f 6e 20 61 73 20 74 68 65  t as soon as the
11730 20 66 69 72 73 74 20 75 6e 75 73 65 64 20 73 6c   first unused sl
11740 6f 74 20 69 73 20 66 6f 75 6e 64 20 2a 2f 0a 20  ot is found */. 
11750 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28           assert(
11760 20 70 4c 6f 6f 70 2d 3e 61 64 64 72 4f 70 65 6e   pLoop->addrOpen
11770 45 70 68 6d 5b 31 5d 3c 30 20 29 3b 0a 20 20 20  Ephm[1]<0 );.   
11780 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
11790 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
117a0 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67  sqlite3VdbeChang
117b0 65 50 32 28 76 2c 20 61 64 64 72 2c 20 6e 43 6f  eP2(v, addr, nCo
117c0 6c 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  l);.        sqli
117d0 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 34 28  te3VdbeChangeP4(
117e0 76 2c 20 61 64 64 72 2c 20 28 63 68 61 72 2a 29  v, addr, (char*)
117f0 70 4b 65 79 49 6e 66 6f 2c 20 50 34 5f 4b 45 59  pKeyInfo, P4_KEY
11800 49 4e 46 4f 29 3b 0a 20 20 20 20 20 20 20 20 70  INFO);.        p
11810 4c 6f 6f 70 2d 3e 61 64 64 72 4f 70 65 6e 45 70  Loop->addrOpenEp
11820 68 6d 5b 69 5d 20 3d 20 2d 31 3b 0a 20 20 20 20  hm[i] = -1;.    
11830 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73 71    }.    }.    sq
11840 6c 69 74 65 33 5f 66 72 65 65 28 70 4b 65 79 49  lite3_free(pKeyI
11850 6e 66 6f 29 3b 0a 20 20 7d 0a 0a 6d 75 6c 74 69  nfo);.  }..multi
11860 5f 73 65 6c 65 63 74 5f 65 6e 64 3a 0a 20 20 70  _select_end:.  p
11870 44 65 73 74 2d 3e 69 4d 65 6d 20 3d 20 64 65 73  Dest->iMem = des
11880 74 2e 69 4d 65 6d 3b 0a 20 20 70 44 65 73 74 2d  t.iMem;.  pDest-
11890 3e 6e 4d 65 6d 20 3d 20 64 65 73 74 2e 6e 4d 65  >nMem = dest.nMe
118a0 6d 3b 0a 20 20 73 71 6c 69 74 65 33 53 65 6c 65  m;.  sqlite3Sele
118b0 63 74 44 65 6c 65 74 65 28 70 44 65 6c 65 74 65  ctDelete(pDelete
118c0 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
118d0 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  }.#endif /* SQLI
118e0 54 45 5f 4f 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44  TE_OMIT_COMPOUND
118f0 5f 53 45 4c 45 43 54 20 2a 2f 0a 0a 2f 2a 0a 2a  _SELECT */../*.*
11900 2a 20 43 6f 64 65 20 61 6e 20 6f 75 74 70 75 74  * Code an output
11910 20 73 75 62 72 6f 75 74 69 6e 65 20 66 6f 72 20   subroutine for 
11920 61 20 63 6f 72 6f 75 74 69 6e 65 20 69 6d 70 6c  a coroutine impl
11930 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 61 0a  ementation of a.
11940 2a 2a 20 53 45 4c 45 43 54 20 73 74 61 74 6d 65  ** SELECT statme
11950 6e 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 64 61  nt..**.** The da
11960 74 61 20 74 6f 20 62 65 20 6f 75 74 70 75 74 20  ta to be output 
11970 69 73 20 63 6f 6e 74 61 69 6e 65 64 20 69 6e 20  is contained in 
11980 70 49 6e 2d 3e 69 4d 65 6d 2e 20 20 54 68 65 72  pIn->iMem.  Ther
11990 65 20 61 72 65 0a 2a 2a 20 70 49 6e 2d 3e 6e 4d  e are.** pIn->nM
119a0 65 6d 20 63 6f 6c 75 6d 6e 73 20 74 6f 20 62 65  em columns to be
119b0 20 6f 75 74 70 75 74 2e 20 20 70 44 65 73 74 20   output.  pDest 
119c0 69 73 20 77 68 65 72 65 20 74 68 65 20 6f 75 74  is where the out
119d0 70 75 74 20 73 68 6f 75 6c 64 0a 2a 2a 20 62 65  put should.** be
119e0 20 73 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 72 65 67   sent..**.** reg
119f0 52 65 74 75 72 6e 20 69 73 20 74 68 65 20 6e 75  Return is the nu
11a00 6d 62 65 72 20 6f 66 20 74 68 65 20 72 65 67 69  mber of the regi
11a10 73 74 65 72 20 68 6f 6c 64 69 6e 67 20 74 68 65  ster holding the
11a20 20 73 75 62 72 6f 75 74 69 6e 65 0a 2a 2a 20 72   subroutine.** r
11a30 65 74 75 72 6e 20 61 64 64 72 65 73 73 2e 0a 2a  eturn address..*
11a40 2a 0a 2a 2a 20 49 66 20 72 65 67 50 72 65 76 3e  *.** If regPrev>
11a50 30 20 74 68 65 6e 20 69 74 20 69 73 20 61 20 74  0 then it is a t
11a60 68 65 20 66 69 72 73 74 20 72 65 67 69 73 74 65  he first registe
11a70 72 20 69 6e 20 61 20 76 65 63 74 6f 72 20 74 68  r in a vector th
11a80 61 74 0a 2a 2a 20 72 65 63 6f 72 64 73 20 74 68  at.** records th
11a90 65 20 70 72 65 76 69 6f 75 73 20 6f 75 74 70 75  e previous outpu
11aa0 74 2e 20 20 6d 65 6d 5b 72 65 67 50 72 65 76 5d  t.  mem[regPrev]
11ab0 20 69 73 20 61 20 66 6c 61 67 20 74 68 61 74 20   is a flag that 
11ac0 69 73 20 66 61 6c 73 65 0a 2a 2a 20 69 66 20 74  is false.** if t
11ad0 68 65 72 65 20 68 61 73 20 62 65 65 6e 20 6e 6f  here has been no
11ae0 20 70 72 65 76 69 6f 75 73 20 6f 75 74 70 75 74   previous output
11af0 2e 20 20 49 66 20 72 65 67 50 72 65 76 3e 30 20  .  If regPrev>0 
11b00 74 68 65 6e 20 63 6f 64 65 20 69 73 0a 2a 2a 20  then code is.** 
11b10 67 65 6e 65 72 61 74 65 64 20 74 6f 20 73 75 70  generated to sup
11b20 70 72 65 73 73 20 64 75 70 6c 69 63 61 74 65 73  press duplicates
11b30 2e 20 20 70 4b 65 79 49 6e 66 6f 20 69 73 20 75  .  pKeyInfo is u
11b40 73 65 64 20 66 6f 72 20 63 6f 6d 70 61 72 69 6e  sed for comparin
11b50 67 0a 2a 2a 20 6b 65 79 73 2e 0a 2a 2a 0a 2a 2a  g.** keys..**.**
11b60 20 49 66 20 74 68 65 20 4c 49 4d 49 54 20 66 6f   If the LIMIT fo
11b70 75 6e 64 20 69 6e 20 70 2d 3e 69 4c 69 6d 69 74  und in p->iLimit
11b80 20 69 73 20 72 65 61 63 68 65 64 2c 20 6a 75 6d   is reached, jum
11b90 70 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 74 6f  p immediately to
11ba0 0a 2a 2a 20 69 42 72 65 61 6b 2e 0a 2a 2f 0a 73  .** iBreak..*/.s
11bb0 74 61 74 69 63 20 69 6e 74 20 67 65 6e 65 72 61  tatic int genera
11bc0 74 65 4f 75 74 70 75 74 53 75 62 72 6f 75 74 69  teOutputSubrouti
11bd0 6e 65 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  ne(.  Parse *pPa
11be0 72 73 65 2c 20 20 20 20 20 20 20 20 20 20 2f 2a  rse,          /*
11bf0 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74   Parsing context
11c00 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 2c   */.  Select *p,
11c10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
11c20 20 54 68 65 20 53 45 4c 45 43 54 20 73 74 61 74   The SELECT stat
11c30 65 6d 65 6e 74 20 2a 2f 0a 20 20 53 65 6c 65 63  ement */.  Selec
11c40 74 44 65 73 74 20 2a 70 49 6e 2c 20 20 20 20 20  tDest *pIn,     
11c50 20 20 20 2f 2a 20 43 6f 72 6f 75 74 69 6e 65 20     /* Coroutine 
11c60 73 75 70 70 6c 79 69 6e 67 20 64 61 74 61 20 2a  supplying data *
11c70 2f 0a 20 20 53 65 6c 65 63 74 44 65 73 74 20 2a  /.  SelectDest *
11c80 70 44 65 73 74 2c 20 20 20 20 20 20 2f 2a 20 57  pDest,      /* W
11c90 68 65 72 65 20 74 6f 20 73 65 6e 64 20 74 68 65  here to send the
11ca0 20 64 61 74 61 20 2a 2f 0a 20 20 69 6e 74 20 72   data */.  int r
11cb0 65 67 52 65 74 75 72 6e 2c 20 20 20 20 20 20 20  egReturn,       
11cc0 20 20 20 2f 2a 20 54 68 65 20 72 65 74 75 72 6e     /* The return
11cd0 20 61 64 64 72 65 73 73 20 72 65 67 69 73 74 65   address registe
11ce0 72 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 50 72  r */.  int regPr
11cf0 65 76 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f  ev,            /
11d00 2a 20 50 72 65 76 69 6f 75 73 20 72 65 73 75 6c  * Previous resul
11d10 74 20 72 65 67 69 73 74 65 72 2e 20 20 4e 6f 20  t register.  No 
11d20 75 6e 69 71 75 65 6e 65 73 73 20 69 66 20 30 20  uniqueness if 0 
11d30 2a 2f 0a 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b  */.  KeyInfo *pK
11d40 65 79 49 6e 66 6f 2c 20 20 20 20 20 20 2f 2a 20  eyInfo,      /* 
11d50 46 6f 72 20 63 6f 6d 70 61 72 69 6e 67 20 77 69  For comparing wi
11d60 74 68 20 70 72 65 76 69 6f 75 73 20 65 6e 74 72  th previous entr
11d70 79 20 2a 2f 0a 20 20 69 6e 74 20 70 34 74 79 70  y */.  int p4typ
11d80 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  e,             /
11d90 2a 20 54 68 65 20 70 34 20 74 79 70 65 20 66 6f  * The p4 type fo
11da0 72 20 70 4b 65 79 49 6e 66 6f 20 2a 2f 0a 20 20  r pKeyInfo */.  
11db0 69 6e 74 20 69 42 72 65 61 6b 20 20 20 20 20 20  int iBreak      
11dc0 20 20 20 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20          /* Jump 
11dd0 68 65 72 65 20 69 66 20 77 65 20 68 69 74 20 74  here if we hit t
11de0 68 65 20 4c 49 4d 49 54 20 2a 2f 0a 29 7b 0a 20  he LIMIT */.){. 
11df0 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73   Vdbe *v = pPars
11e00 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74 20  e->pVdbe;.  int 
11e10 69 43 6f 6e 74 69 6e 75 65 3b 0a 20 20 69 6e 74  iContinue;.  int
11e20 20 61 64 64 72 3b 0a 0a 20 20 61 64 64 72 20 3d   addr;..  addr =
11e30 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72   sqlite3VdbeCurr
11e40 65 6e 74 41 64 64 72 28 76 29 3b 0a 20 20 69 43  entAddr(v);.  iC
11e50 6f 6e 74 69 6e 75 65 20 3d 20 73 71 6c 69 74 65  ontinue = sqlite
11e60 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76  3VdbeMakeLabel(v
11e70 29 3b 0a 0a 20 20 2f 2a 20 53 75 70 70 72 65 73  );..  /* Suppres
11e80 73 20 64 75 70 6c 69 63 61 74 65 73 20 66 6f 72  s duplicates for
11e90 20 55 4e 49 4f 4e 2c 20 45 58 43 45 50 54 2c 20   UNION, EXCEPT, 
11ea0 61 6e 64 20 49 4e 54 45 52 53 45 43 54 20 0a 20  and INTERSECT . 
11eb0 20 2a 2f 0a 20 20 69 66 28 20 72 65 67 50 72 65   */.  if( regPre
11ec0 76 20 29 7b 0a 20 20 20 20 69 6e 74 20 6a 31 2c  v ){.    int j1,
11ed0 20 6a 32 3b 0a 20 20 20 20 6a 31 20 3d 20 73 71   j2;.    j1 = sq
11ee0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28  lite3VdbeAddOp1(
11ef0 76 2c 20 4f 50 5f 49 66 4e 6f 74 2c 20 72 65 67  v, OP_IfNot, reg
11f00 50 72 65 76 29 3b 0a 20 20 20 20 6a 32 20 3d 20  Prev);.    j2 = 
11f10 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
11f20 34 28 76 2c 20 4f 50 5f 43 6f 6d 70 61 72 65 2c  4(v, OP_Compare,
11f30 20 70 49 6e 2d 3e 69 4d 65 6d 2c 20 72 65 67 50   pIn->iMem, regP
11f40 72 65 76 2b 31 2c 20 70 49 6e 2d 3e 6e 4d 65 6d  rev+1, pIn->nMem
11f50 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
11f60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11f70 28 63 68 61 72 2a 29 70 4b 65 79 49 6e 66 6f 2c  (char*)pKeyInfo,
11f80 20 70 34 74 79 70 65 29 3b 0a 20 20 20 20 73 71   p4type);.    sq
11f90 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
11fa0 76 2c 20 4f 50 5f 4a 75 6d 70 2c 20 6a 32 2b 32  v, OP_Jump, j2+2
11fb0 2c 20 69 43 6f 6e 74 69 6e 75 65 2c 20 6a 32 2b  , iContinue, j2+
11fc0 32 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  2);.    sqlite3V
11fd0 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 6a  dbeJumpHere(v, j
11fe0 31 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45  1);.    sqlite3E
11ff0 78 70 72 43 6f 64 65 43 6f 70 79 28 70 50 61 72  xprCodeCopy(pPar
12000 73 65 2c 20 70 49 6e 2d 3e 69 4d 65 6d 2c 20 72  se, pIn->iMem, r
12010 65 67 50 72 65 76 2b 31 2c 20 70 49 6e 2d 3e 6e  egPrev+1, pIn->n
12020 4d 65 6d 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  Mem);.    sqlite
12030 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
12040 50 5f 49 6e 74 65 67 65 72 2c 20 31 2c 20 72 65  P_Integer, 1, re
12050 67 50 72 65 76 29 3b 0a 20 20 7d 0a 20 20 69 66  gPrev);.  }.  if
12060 28 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61  ( pParse->db->ma
12070 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20 72 65 74  llocFailed ) ret
12080 75 72 6e 20 30 3b 0a 0a 20 20 2f 2a 20 53 75 70  urn 0;..  /* Sup
12090 70 72 65 73 73 20 74 68 65 20 74 68 65 20 66 69  press the the fi
120a0 72 73 74 20 4f 46 46 53 45 54 20 65 6e 74 72 69  rst OFFSET entri
120b0 65 73 20 69 66 20 74 68 65 72 65 20 69 73 20 61  es if there is a
120c0 6e 20 4f 46 46 53 45 54 20 63 6c 61 75 73 65 0a  n OFFSET clause.
120d0 20 20 2a 2f 0a 20 20 63 6f 64 65 4f 66 66 73 65    */.  codeOffse
120e0 74 28 76 2c 20 70 2c 20 69 43 6f 6e 74 69 6e 75  t(v, p, iContinu
120f0 65 29 3b 0a 0a 20 20 73 77 69 74 63 68 28 20 70  e);..  switch( p
12100 44 65 73 74 2d 3e 65 44 65 73 74 20 29 7b 0a 20  Dest->eDest ){. 
12110 20 20 20 2f 2a 20 53 74 6f 72 65 20 74 68 65 20     /* Store the 
12120 72 65 73 75 6c 74 20 61 73 20 64 61 74 61 20 75  result as data u
12130 73 69 6e 67 20 61 20 75 6e 69 71 75 65 20 6b 65  sing a unique ke
12140 79 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61  y..    */.    ca
12150 73 65 20 53 52 54 5f 54 61 62 6c 65 3a 0a 20 20  se SRT_Table:.  
12160 20 20 63 61 73 65 20 53 52 54 5f 45 70 68 65 6d    case SRT_Ephem
12170 54 61 62 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74  Tab: {.      int
12180 20 72 31 20 3d 20 73 71 6c 69 74 65 33 47 65 74   r1 = sqlite3Get
12190 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b  TempReg(pParse);
121a0 0a 20 20 20 20 20 20 69 6e 74 20 72 32 20 3d 20  .      int r2 = 
121b0 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65  sqlite3GetTempRe
121c0 67 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20  g(pParse);.     
121d0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
121e0 70 33 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63  p3(v, OP_MakeRec
121f0 6f 72 64 2c 20 70 49 6e 2d 3e 69 4d 65 6d 2c 20  ord, pIn->iMem, 
12200 70 49 6e 2d 3e 6e 4d 65 6d 2c 20 72 31 29 3b 0a  pIn->nMem, r1);.
12210 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
12220 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 65  eAddOp2(v, OP_Ne
12230 77 52 6f 77 69 64 2c 20 70 44 65 73 74 2d 3e 69  wRowid, pDest->i
12240 50 61 72 6d 2c 20 72 32 29 3b 0a 20 20 20 20 20  Parm, r2);.     
12250 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
12260 70 33 28 76 2c 20 4f 50 5f 49 6e 73 65 72 74 2c  p3(v, OP_Insert,
12270 20 70 44 65 73 74 2d 3e 69 50 61 72 6d 2c 20 72   pDest->iParm, r
12280 31 2c 20 72 32 29 3b 0a 20 20 20 20 20 20 73 71  1, r2);.      sq
12290 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50  lite3VdbeChangeP
122a0 35 28 76 2c 20 4f 50 46 4c 41 47 5f 41 50 50 45  5(v, OPFLAG_APPE
122b0 4e 44 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  ND);.      sqlit
122c0 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67  e3ReleaseTempReg
122d0 28 70 50 61 72 73 65 2c 20 72 32 29 3b 0a 20 20  (pParse, r2);.  
122e0 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61      sqlite3Relea
122f0 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65  seTempReg(pParse
12300 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 62 72 65  , r1);.      bre
12310 61 6b 3b 0a 20 20 20 20 7d 0a 0a 23 69 66 6e 64  ak;.    }..#ifnd
12320 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53  ef SQLITE_OMIT_S
12330 55 42 51 55 45 52 59 0a 20 20 20 20 2f 2a 20 49  UBQUERY.    /* I
12340 66 20 77 65 20 61 72 65 20 63 72 65 61 74 69 6e  f we are creatin
12350 67 20 61 20 73 65 74 20 66 6f 72 20 61 6e 20 22  g a set for an "
12360 65 78 70 72 20 49 4e 20 28 53 45 4c 45 43 54 20  expr IN (SELECT 
12370 2e 2e 2e 29 22 20 63 6f 6e 73 74 72 75 63 74 2c  ...)" construct,
12380 0a 20 20 20 20 2a 2a 20 74 68 65 6e 20 74 68 65  .    ** then the
12390 72 65 20 73 68 6f 75 6c 64 20 62 65 20 61 20 73  re should be a s
123a0 69 6e 67 6c 65 20 69 74 65 6d 20 6f 6e 20 74 68  ingle item on th
123b0 65 20 73 74 61 63 6b 2e 20 20 57 72 69 74 65 20  e stack.  Write 
123c0 74 68 69 73 0a 20 20 20 20 2a 2a 20 69 74 65 6d  this.    ** item
123d0 20 69 6e 74 6f 20 74 68 65 20 73 65 74 20 74 61   into the set ta
123e0 62 6c 65 20 77 69 74 68 20 62 6f 67 75 73 20 64  ble with bogus d
123f0 61 74 61 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ata..    */.    
12400 63 61 73 65 20 53 52 54 5f 53 65 74 3a 20 7b 0a  case SRT_Set: {.
12410 20 20 20 20 20 20 69 6e 74 20 72 31 3b 0a 20 20        int r1;.  
12420 20 20 20 20 61 73 73 65 72 74 28 20 70 49 6e 2d      assert( pIn-
12430 3e 6e 4d 65 6d 3d 3d 31 20 29 3b 0a 20 20 20 20  >nMem==1 );.    
12440 20 20 70 2d 3e 61 66 66 69 6e 69 74 79 20 3d 20    p->affinity = 
12450 0a 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  .         sqlite
12460 33 43 6f 6d 70 61 72 65 41 66 66 69 6e 69 74 79  3CompareAffinity
12470 28 70 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b 30 5d  (p->pEList->a[0]
12480 2e 70 45 78 70 72 2c 20 70 44 65 73 74 2d 3e 61  .pExpr, pDest->a
12490 66 66 69 6e 69 74 79 29 3b 0a 20 20 20 20 20 20  ffinity);.      
124a0 72 31 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54  r1 = sqlite3GetT
124b0 65 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a  empReg(pParse);.
124c0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
124d0 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 4d 61  eAddOp4(v, OP_Ma
124e0 6b 65 52 65 63 6f 72 64 2c 20 70 49 6e 2d 3e 69  keRecord, pIn->i
124f0 4d 65 6d 2c 20 31 2c 20 72 31 2c 20 26 70 2d 3e  Mem, 1, r1, &p->
12500 61 66 66 69 6e 69 74 79 2c 20 31 29 3b 0a 20 20  affinity, 1);.  
12510 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
12520 61 63 68 65 41 66 66 69 6e 69 74 79 43 68 61 6e  acheAffinityChan
12530 67 65 28 70 50 61 72 73 65 2c 20 70 49 6e 2d 3e  ge(pParse, pIn->
12540 69 4d 65 6d 2c 20 31 29 3b 0a 20 20 20 20 20 20  iMem, 1);.      
12550 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
12560 32 28 76 2c 20 4f 50 5f 49 64 78 49 6e 73 65 72  2(v, OP_IdxInser
12570 74 2c 20 70 44 65 73 74 2d 3e 69 50 61 72 6d 2c  t, pDest->iParm,
12580 20 72 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69   r1);.      sqli
12590 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65  te3ReleaseTempRe
125a0 67 28 70 50 61 72 73 65 2c 20 72 31 29 3b 0a 20  g(pParse, r1);. 
125b0 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
125c0 7d 0a 0a 23 69 66 20 30 20 20 2f 2a 20 4e 65 76  }..#if 0  /* Nev
125d0 65 72 20 6f 63 63 75 72 73 20 6f 6e 20 61 6e 20  er occurs on an 
125e0 4f 52 44 45 52 20 42 59 20 71 75 65 72 79 20 2a  ORDER BY query *
125f0 2f 0a 20 20 20 20 2f 2a 20 49 66 20 61 6e 79 20  /.    /* If any 
12600 72 6f 77 20 65 78 69 73 74 20 69 6e 20 74 68 65  row exist in the
12610 20 72 65 73 75 6c 74 20 73 65 74 2c 20 72 65 63   result set, rec
12620 6f 72 64 20 74 68 61 74 20 66 61 63 74 20 61 6e  ord that fact an
12630 64 20 61 62 6f 72 74 2e 0a 20 20 20 20 2a 2f 0a  d abort..    */.
12640 20 20 20 20 63 61 73 65 20 53 52 54 5f 45 78 69      case SRT_Exi
12650 73 74 73 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c  sts: {.      sql
12660 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
12670 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 31 2c  , OP_Integer, 1,
12680 20 70 44 65 73 74 2d 3e 69 50 61 72 6d 29 3b 0a   pDest->iParm);.
12690 20 20 20 20 20 20 2f 2a 20 54 68 65 20 4c 49 4d        /* The LIM
126a0 49 54 20 63 6c 61 75 73 65 20 77 69 6c 6c 20 74  IT clause will t
126b0 65 72 6d 69 6e 61 74 65 20 74 68 65 20 6c 6f 6f  erminate the loo
126c0 70 20 66 6f 72 20 75 73 20 2a 2f 0a 20 20 20 20  p for us */.    
126d0 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23    break;.    }.#
126e0 65 6e 64 69 66 0a 0a 20 20 20 20 2f 2a 20 49 66  endif..    /* If
126f0 20 74 68 69 73 20 69 73 20 61 20 73 63 61 6c 61   this is a scala
12700 72 20 73 65 6c 65 63 74 20 74 68 61 74 20 69 73  r select that is
12710 20 70 61 72 74 20 6f 66 20 61 6e 20 65 78 70 72   part of an expr
12720 65 73 73 69 6f 6e 2c 20 74 68 65 6e 0a 20 20 20  ession, then.   
12730 20 2a 2a 20 73 74 6f 72 65 20 74 68 65 20 72 65   ** store the re
12740 73 75 6c 74 73 20 69 6e 20 74 68 65 20 61 70 70  sults in the app
12750 72 6f 70 72 69 61 74 65 20 6d 65 6d 6f 72 79 20  ropriate memory 
12760 63 65 6c 6c 20 61 6e 64 20 62 72 65 61 6b 20 6f  cell and break o
12770 75 74 0a 20 20 20 20 2a 2a 20 6f 66 20 74 68 65  ut.    ** of the
12780 20 73 63 61 6e 20 6c 6f 6f 70 2e 0a 20 20 20 20   scan loop..    
12790 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f  */.    case SRT_
127a0 4d 65 6d 3a 20 7b 0a 20 20 20 20 20 20 61 73 73  Mem: {.      ass
127b0 65 72 74 28 20 70 49 6e 2d 3e 6e 4d 65 6d 3d 3d  ert( pIn->nMem==
127c0 31 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  1 );.      sqlit
127d0 65 33 45 78 70 72 43 6f 64 65 4d 6f 76 65 28 70  e3ExprCodeMove(p
127e0 50 61 72 73 65 2c 20 70 49 6e 2d 3e 69 4d 65 6d  Parse, pIn->iMem
127f0 2c 20 70 44 65 73 74 2d 3e 69 50 61 72 6d 2c 20  , pDest->iParm, 
12800 31 29 3b 0a 20 20 20 20 20 20 2f 2a 20 54 68 65  1);.      /* The
12810 20 4c 49 4d 49 54 20 63 6c 61 75 73 65 20 77 69   LIMIT clause wi
12820 6c 6c 20 6a 75 6d 70 20 6f 75 74 20 6f 66 20 74  ll jump out of t
12830 68 65 20 6c 6f 6f 70 20 66 6f 72 20 75 73 20 2a  he loop for us *
12840 2f 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  /.      break;. 
12850 20 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 23     }.#endif /* #
12860 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
12870 49 54 5f 53 55 42 51 55 45 52 59 20 2a 2f 0a 0a  IT_SUBQUERY */..
12880 20 20 20 20 2f 2a 20 53 65 6e 64 20 74 68 65 20      /* Send the 
12890 64 61 74 61 20 74 6f 20 74 68 65 20 63 61 6c 6c  data to the call
128a0 62 61 63 6b 20 66 75 6e 63 74 69 6f 6e 20 6f 72  back function or
128b0 20 74 6f 20 61 20 73 75 62 72 6f 75 74 69 6e 65   to a subroutine
128c0 2e 20 20 49 6e 20 74 68 65 0a 20 20 20 20 2a 2a  .  In the.    **
128d0 20 63 61 73 65 20 6f 66 20 61 20 73 75 62 72 6f   case of a subro
128e0 75 74 69 6e 65 2c 20 74 68 65 20 73 75 62 72 6f  utine, the subro
128f0 75 74 69 6e 65 20 69 74 73 65 6c 66 20 69 73 20  utine itself is 
12900 72 65 73 70 6f 6e 73 69 62 6c 65 20 66 6f 72 0a  responsible for.
12910 20 20 20 20 2a 2a 20 70 6f 70 70 69 6e 67 20 74      ** popping t
12920 68 65 20 64 61 74 61 20 66 72 6f 6d 20 74 68 65  he data from the
12930 20 73 74 61 63 6b 2e 0a 20 20 20 20 2a 2f 0a 20   stack..    */. 
12940 20 20 20 63 61 73 65 20 53 52 54 5f 43 6f 72 6f     case SRT_Coro
12950 75 74 69 6e 65 3a 20 7b 0a 20 20 20 20 20 20 69  utine: {.      i
12960 66 28 20 70 44 65 73 74 2d 3e 69 4d 65 6d 3d 3d  f( pDest->iMem==
12970 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70 44 65  0 ){.        pDe
12980 73 74 2d 3e 69 4d 65 6d 20 3d 20 73 71 6c 69 74  st->iMem = sqlit
12990 65 33 47 65 74 54 65 6d 70 52 61 6e 67 65 28 70  e3GetTempRange(p
129a0 50 61 72 73 65 2c 20 70 49 6e 2d 3e 6e 4d 65 6d  Parse, pIn->nMem
129b0 29 3b 0a 20 20 20 20 20 20 20 20 70 44 65 73 74  );.        pDest
129c0 2d 3e 6e 4d 65 6d 20 3d 20 70 49 6e 2d 3e 6e 4d  ->nMem = pIn->nM
129d0 65 6d 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  em;.      }.    
129e0 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64    sqlite3ExprCod
129f0 65 4d 6f 76 65 28 70 50 61 72 73 65 2c 20 70 49  eMove(pParse, pI
12a00 6e 2d 3e 69 4d 65 6d 2c 20 70 44 65 73 74 2d 3e  n->iMem, pDest->
12a10 69 4d 65 6d 2c 20 70 44 65 73 74 2d 3e 6e 4d 65  iMem, pDest->nMe
12a20 6d 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  m);.      sqlite
12a30 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f  3VdbeAddOp1(v, O
12a40 50 5f 59 69 65 6c 64 2c 20 70 44 65 73 74 2d 3e  P_Yield, pDest->
12a50 69 50 61 72 6d 29 3b 0a 20 20 20 20 20 20 62 72  iParm);.      br
12a60 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  eak;.    }..    
12a70 63 61 73 65 20 53 52 54 5f 43 61 6c 6c 62 61 63  case SRT_Callbac
12a80 6b 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  k: {.      sqlit
12a90 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
12aa0 4f 50 5f 52 65 73 75 6c 74 52 6f 77 2c 20 70 49  OP_ResultRow, pI
12ab0 6e 2d 3e 69 4d 65 6d 2c 20 70 49 6e 2d 3e 6e 4d  n->iMem, pIn->nM
12ac0 65 6d 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  em);.      sqlit
12ad0 65 33 45 78 70 72 43 61 63 68 65 41 66 66 69 6e  e3ExprCacheAffin
12ae0 69 74 79 43 68 61 6e 67 65 28 70 50 61 72 73 65  ityChange(pParse
12af0 2c 20 70 49 6e 2d 3e 69 4d 65 6d 2c 20 70 49 6e  , pIn->iMem, pIn
12b00 2d 3e 6e 4d 65 6d 29 3b 0a 20 20 20 20 20 20 62  ->nMem);.      b
12b10 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 23 69 66  reak;.    }..#if
12b20 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
12b30 5f 4f 4d 49 54 5f 54 52 49 47 47 45 52 29 0a 20  _OMIT_TRIGGER). 
12b40 20 20 20 2f 2a 20 44 69 73 63 61 72 64 20 74 68     /* Discard th
12b50 65 20 72 65 73 75 6c 74 73 2e 20 20 54 68 69 73  e results.  This
12b60 20 69 73 20 75 73 65 64 20 66 6f 72 20 53 45 4c   is used for SEL
12b70 45 43 54 20 73 74 61 74 65 6d 65 6e 74 73 20 69  ECT statements i
12b80 6e 73 69 64 65 0a 20 20 20 20 2a 2a 20 74 68 65  nside.    ** the
12b90 20 62 6f 64 79 20 6f 66 20 61 20 54 52 49 47 47   body of a TRIGG
12ba0 45 52 2e 20 20 54 68 65 20 70 75 72 70 6f 73 65  ER.  The purpose
12bb0 20 6f 66 20 73 75 63 68 20 73 65 6c 65 63 74 73   of such selects
12bc0 20 69 73 20 74 6f 20 63 61 6c 6c 0a 20 20 20 20   is to call.    
12bd0 2a 2a 20 75 73 65 72 2d 64 65 66 69 6e 65 64 20  ** user-defined 
12be0 66 75 6e 63 74 69 6f 6e 73 20 74 68 61 74 20 68  functions that h
12bf0 61 76 65 20 73 69 64 65 20 65 66 66 65 63 74 73  ave side effects
12c00 2e 20 20 57 65 20 64 6f 20 6e 6f 74 20 63 61 72  .  We do not car
12c10 65 0a 20 20 20 20 2a 2a 20 61 62 6f 75 74 20 74  e.    ** about t
12c20 68 65 20 61 63 74 75 61 6c 20 72 65 73 75 6c 74  he actual result
12c30 73 20 6f 66 20 74 68 65 20 73 65 6c 65 63 74 2e  s of the select.
12c40 0a 20 20 20 20 2a 2f 0a 20 20 20 20 64 65 66 61  .    */.    defa
12c50 75 6c 74 3a 20 7b 0a 20 20 20 20 20 20 62 72 65  ult: {.      bre
12c60 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66  ak;.    }.#endif
12c70 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4a 75 6d 70 20  .  }..  /* Jump 
12c80 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68  to the end of th
12c90 65 20 6c 6f 6f 70 20 69 66 20 74 68 65 20 4c 49  e loop if the LI
12ca0 4d 49 54 20 69 73 20 72 65 61 63 68 65 64 2e 0a  MIT is reached..
12cb0 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 69 4c    */.  if( p->iL
12cc0 69 6d 69 74 20 29 7b 0a 20 20 20 20 73 71 6c 69  imit ){.    sqli
12cd0 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
12ce0 20 4f 50 5f 41 64 64 49 6d 6d 2c 20 70 2d 3e 69   OP_AddImm, p->i
12cf0 4c 69 6d 69 74 2c 20 2d 31 29 3b 0a 20 20 20 20  Limit, -1);.    
12d00 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
12d10 32 28 76 2c 20 4f 50 5f 49 66 5a 65 72 6f 2c 20  2(v, OP_IfZero, 
12d20 70 2d 3e 69 4c 69 6d 69 74 2c 20 69 42 72 65 61  p->iLimit, iBrea
12d30 6b 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 47 65  k);.  }..  /* Ge
12d40 6e 65 72 61 74 65 20 74 68 65 20 73 75 62 72 6f  nerate the subro
12d50 75 74 69 6e 65 20 72 65 74 75 72 6e 0a 20 20 2a  utine return.  *
12d60 2f 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 52  /.  sqlite3VdbeR
12d70 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 69  esolveLabel(v, i
12d80 43 6f 6e 74 69 6e 75 65 29 3b 0a 20 20 73 71 6c  Continue);.  sql
12d90 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76  ite3VdbeAddOp1(v
12da0 2c 20 4f 50 5f 52 65 74 75 72 6e 2c 20 72 65 67  , OP_Return, reg
12db0 52 65 74 75 72 6e 29 3b 0a 0a 20 20 72 65 74 75  Return);..  retu
12dc0 72 6e 20 61 64 64 72 3b 0a 7d 0a 0a 2f 2a 0a 2a  rn addr;.}../*.*
12dd0 2a 20 41 6c 74 65 72 6e 61 74 69 76 65 20 63 6f  * Alternative co
12de0 6d 70 6f 75 6e 64 20 73 65 6c 65 63 74 20 63 6f  mpound select co
12df0 64 65 20 67 65 6e 65 72 61 74 6f 72 20 66 6f 72  de generator for
12e00 20 63 61 73 65 73 20 77 68 65 6e 20 74 68 65 72   cases when ther
12e10 65 0a 2a 2a 20 69 73 20 61 6e 20 4f 52 44 45 52  e.** is an ORDER
12e20 20 42 59 20 63 6c 61 75 73 65 2e 0a 2a 2a 0a 2a   BY clause..**.*
12e30 2a 20 57 65 20 61 73 73 75 6d 65 20 61 20 71 75  * We assume a qu
12e40 65 72 79 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f  ery of the follo
12e50 77 69 6e 67 20 66 6f 72 6d 3a 0a 2a 2a 0a 2a 2a  wing form:.**.**
12e60 20 20 20 20 20 20 3c 73 65 6c 65 63 74 41 3e 20        <selectA> 
12e70 20 3c 6f 70 65 72 61 74 6f 72 3e 20 20 3c 73 65   <operator>  <se
12e80 6c 65 63 74 42 3e 20 20 4f 52 44 45 52 20 42 59  lectB>  ORDER BY
12e90 20 3c 6f 72 64 65 72 62 79 6c 69 73 74 3e 0a 2a   <orderbylist>.*
12ea0 2a 0a 2a 2a 20 3c 6f 70 65 72 61 74 6f 72 3e 20  *.** <operator> 
12eb0 69 73 20 6f 6e 65 20 6f 66 20 55 4e 49 4f 4e 20  is one of UNION 
12ec0 41 4c 4c 2c 20 55 4e 49 4f 4e 2c 20 45 58 43 45  ALL, UNION, EXCE
12ed0 50 54 2c 20 6f 72 20 49 4e 54 45 52 53 45 43 54  PT, or INTERSECT
12ee0 2e 20 20 54 68 65 20 69 64 65 61 0a 2a 2a 20 69  .  The idea.** i
12ef0 73 20 74 6f 20 63 6f 64 65 20 62 6f 74 68 20 3c  s to code both <
12f00 73 65 6c 65 63 74 41 3e 20 61 6e 64 20 3c 73 65  selectA> and <se
12f10 6c 65 63 74 42 3e 20 77 69 74 68 20 74 68 65 20  lectB> with the 
12f20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20  ORDER BY clause 
12f30 61 73 0a 2a 2a 20 63 6f 2d 72 6f 75 74 69 6e 65  as.** co-routine
12f40 73 2e 20 20 54 68 65 6e 20 72 75 6e 20 74 68 65  s.  Then run the
12f50 20 63 6f 2d 72 6f 75 74 69 6e 65 73 20 69 6e 20   co-routines in 
12f60 70 61 72 61 6c 6c 65 6c 20 61 6e 64 20 6d 65 72  parallel and mer
12f70 67 65 20 74 68 65 20 72 65 73 75 6c 74 73 0a 2a  ge the results.*
12f80 2a 20 69 6e 74 6f 20 74 68 65 20 6f 75 74 70 75  * into the outpu
12f90 74 2e 20 20 49 6e 20 61 64 64 69 74 69 6f 6e 20  t.  In addition 
12fa0 74 6f 20 74 68 65 20 74 77 6f 20 63 6f 72 6f 75  to the two corou
12fb0 74 69 6e 65 73 20 28 63 61 6c 6c 65 64 20 73 65  tines (called se
12fc0 6c 65 63 74 41 20 61 6e 64 0a 2a 2a 20 73 65 6c  lectA and.** sel
12fd0 65 63 74 42 29 20 74 68 65 72 65 20 61 72 65 20  ectB) there are 
12fe0 37 20 73 75 62 72 6f 75 74 69 6e 65 73 3a 0a 2a  7 subroutines:.*
12ff0 2a 0a 2a 2a 20 20 20 20 6f 75 74 41 3a 20 20 20  *.**    outA:   
13000 20 4d 6f 76 65 20 74 68 65 20 6f 75 74 70 75 74   Move the output
13010 20 6f 66 20 74 68 65 20 73 65 6c 65 63 74 41 20   of the selectA 
13020 63 6f 72 6f 75 74 69 6e 65 20 69 6e 74 6f 20 74  coroutine into t
13030 68 65 20 6f 75 74 70 75 74 0a 2a 2a 20 20 20 20  he output.**    
13040 20 20 20 20 20 20 20 20 20 6f 66 20 74 68 65 20           of the 
13050 63 6f 6d 70 6f 75 6e 64 20 71 75 65 72 79 2e 0a  compound query..
13060 2a 2a 0a 2a 2a 20 20 20 20 6f 75 74 42 3a 20 20  **.**    outB:  
13070 20 20 4d 6f 76 65 20 74 68 65 20 6f 75 74 70 75    Move the outpu
13080 74 20 6f 66 20 74 68 65 20 73 65 6c 65 63 74 42  t of the selectB
13090 20 63 6f 72 6f 75 74 69 6e 65 20 69 6e 74 6f 20   coroutine into 
130a0 74 68 65 20 6f 75 74 70 75 74 0a 2a 2a 20 20 20  the output.**   
130b0 20 20 20 20 20 20 20 20 20 20 6f 66 20 74 68 65            of the
130c0 20 63 6f 6d 70 6f 75 6e 64 20 71 75 65 72 79 2e   compound query.
130d0 20 20 28 4f 6e 6c 79 20 67 65 6e 65 72 61 74 65    (Only generate
130e0 64 20 66 6f 72 20 55 4e 49 4f 4e 20 61 6e 64 0a  d for UNION and.
130f0 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 55  **             U
13100 4e 49 4f 4e 20 41 4c 4c 2e 20 20 45 58 43 45 50  NION ALL.  EXCEP
13110 54 20 61 6e 64 20 49 4e 53 45 52 54 53 45 43 54  T and INSERTSECT
13120 20 6e 65 76 65 72 20 6f 75 74 70 75 74 20 61 20   never output a 
13130 72 6f 77 20 74 68 61 74 0a 2a 2a 20 20 20 20 20  row that.**     
13140 20 20 20 20 20 20 20 20 61 70 70 65 61 72 73 20          appears 
13150 6f 6e 6c 79 20 69 6e 20 42 2e 29 0a 2a 2a 0a 2a  only in B.).**.*
13160 2a 20 20 20 20 41 6c 74 42 3a 20 20 20 20 43 61  *    AltB:    Ca
13170 6c 6c 65 64 20 77 68 65 6e 20 74 68 65 72 65 20  lled when there 
13180 69 73 20 64 61 74 61 20 66 72 6f 6d 20 62 6f 74  is data from bot
13190 68 20 63 6f 72 6f 75 74 69 6e 65 73 20 61 6e 64  h coroutines and
131a0 20 41 3c 42 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 41   A<B..**.**    A
131b0 65 71 42 3a 20 20 20 20 43 61 6c 6c 65 64 20 77  eqB:    Called w
131c0 68 65 6e 20 74 68 65 72 65 20 69 73 20 64 61 74  hen there is dat
131d0 61 20 66 72 6f 6d 20 62 6f 74 68 20 63 6f 72 6f  a from both coro
131e0 75 74 69 6e 65 73 20 61 6e 64 20 41 3d 3d 42 2e  utines and A==B.
131f0 0a 2a 2a 0a 2a 2a 20 20 20 20 41 67 74 42 3a 20  .**.**    AgtB: 
13200 20 20 20 43 61 6c 6c 65 64 20 77 68 65 6e 20 74     Called when t
13210 68 65 72 65 20 69 73 20 64 61 74 61 20 66 72 6f  here is data fro
13220 6d 20 62 6f 74 68 20 63 6f 72 6f 75 74 69 6e 65  m both coroutine
13230 73 20 61 6e 64 20 41 3e 42 2e 0a 2a 2a 0a 2a 2a  s and A>B..**.**
13240 20 20 20 20 45 6f 66 41 3a 20 20 20 20 43 61 6c      EofA:    Cal
13250 6c 65 64 20 77 68 65 6e 20 64 61 74 61 20 69 73  led when data is
13260 20 65 78 68 61 75 73 74 65 64 20 66 72 6f 6d 20   exhausted from 
13270 73 65 6c 65 63 74 41 2e 0a 2a 2a 0a 2a 2a 20 20  selectA..**.**  
13280 20 20 45 6f 66 42 3a 20 20 20 20 43 61 6c 6c 65    EofB:    Calle
13290 64 20 77 68 65 6e 20 64 61 74 61 20 69 73 20 65  d when data is e
132a0 78 68 61 75 73 74 65 64 20 66 72 6f 6d 20 73 65  xhausted from se
132b0 6c 65 63 74 42 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  lectB..**.** The
132c0 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20   implementation 
132d0 6f 66 20 74 68 65 20 6c 61 74 74 65 72 20 66 69  of the latter fi
132e0 76 65 20 73 75 62 72 6f 75 74 69 6e 65 73 20 64  ve subroutines d
132f0 65 70 65 6e 64 20 6f 6e 20 77 68 69 63 68 20 0a  epend on which .
13300 2a 2a 20 3c 6f 70 65 72 61 74 6f 72 3e 20 69 73  ** <operator> is
13310 20 75 73 65 64 3a 0a 2a 2a 0a 2a 2a 0a 2a 2a 20   used:.**.**.** 
13320 20 20 20 20 20 20 20 20 20 20 20 20 55 4e 49 4f              UNIO
13330 4e 20 41 4c 4c 20 20 20 20 20 20 20 20 20 55 4e  N ALL         UN
13340 49 4f 4e 20 20 20 20 20 20 20 20 20 20 20 20 45  ION            E
13350 58 43 45 50 54 20 20 20 20 20 20 20 20 20 20 49  XCEPT          I
13360 4e 54 45 52 53 45 43 54 0a 2a 2a 20 20 20 20 20  NTERSECT.**     
13370 20 20 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d       -----------
13380 2d 2d 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  --  ------------
13390 2d 2d 2d 2d 2d 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d  -----  ---------
133a0 2d 2d 2d 2d 2d 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d  -----  ---------
133b0 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a 20 20 20 41 6c  --------.**   Al
133c0 74 42 3a 20 20 20 6f 75 74 41 2c 20 6e 65 78 74  tB:   outA, next
133d0 41 20 20 20 20 20 20 6f 75 74 41 2c 20 6e 65 78  A      outA, nex
133e0 74 41 20 20 20 20 20 20 20 6f 75 74 41 2c 20 6e  tA       outA, n
133f0 65 78 74 41 20 20 20 20 20 20 20 20 20 6e 65 78  extA         nex
13400 74 41 0a 2a 2a 0a 2a 2a 20 20 20 41 65 71 42 3a  tA.**.**   AeqB:
13410 20 20 20 6f 75 74 41 2c 20 6e 65 78 74 41 20 20     outA, nextA  
13420 20 20 20 20 20 20 20 6e 65 78 74 41 20 20 20 20         nextA    
13430 20 20 20 20 20 20 20 20 20 6e 65 78 74 41 20 20           nextA  
13440 20 20 20 20 20 20 20 6f 75 74 41 2c 20 6e 65 78         outA, nex
13450 74 41 0a 2a 2a 0a 2a 2a 20 20 20 41 67 74 42 3a  tA.**.**   AgtB:
13460 20 20 20 6f 75 74 42 2c 20 6e 65 78 74 42 20 20     outB, nextB  
13470 20 20 20 20 6f 75 74 42 2c 20 6e 65 78 74 42 20      outB, nextB 
13480 20 20 20 20 20 20 20 20 20 6e 65 78 74 42 20 20           nextB  
13490 20 20 20 20 20 20 20 20 20 20 6e 65 78 74 42 0a            nextB.
134a0 2a 2a 0a 2a 2a 20 20 20 45 6f 66 41 3a 20 20 20  **.**   EofA:   
134b0 6f 75 74 42 2c 20 6e 65 78 74 42 20 20 20 20 20  outB, nextB     
134c0 20 6f 75 74 42 2c 20 6e 65 78 74 42 20 20 20 20   outB, nextB    
134d0 20 20 20 20 20 20 68 61 6c 74 20 20 20 20 20 20        halt      
134e0 20 20 20 20 20 20 20 68 61 6c 74 0a 2a 2a 0a 2a         halt.**.*
134f0 2a 20 20 20 45 6f 66 42 3a 20 20 20 6f 75 74 41  *   EofB:   outA
13500 2c 20 6e 65 78 74 41 20 20 20 20 20 20 6f 75 74  , nextA      out
13510 41 2c 20 6e 65 78 74 41 20 20 20 20 20 20 20 6f  A, nextA       o
13520 75 74 41 2c 20 6e 65 78 74 41 20 20 20 20 20 20  utA, nextA      
13530 20 20 20 68 61 6c 74 0a 2a 2a 0a 2a 2a 20 49 6e     halt.**.** In
13540 20 74 68 65 20 41 6c 74 42 2c 20 41 65 71 42 2c   the AltB, AeqB,
13550 20 61 6e 64 20 41 67 74 42 20 73 75 62 72 6f 75   and AgtB subrou
13560 74 69 6e 65 73 2c 20 61 6e 20 45 4f 46 20 6f 6e  tines, an EOF on
13570 20 41 20 66 6f 6c 6c 6f 77 69 6e 67 20 6e 65 78   A following nex
13580 74 41 0a 2a 2a 20 63 61 75 73 65 73 20 61 6e 20  tA.** causes an 
13590 69 6d 6d 65 64 69 61 74 65 20 6a 75 6d 70 20 74  immediate jump t
135a0 6f 20 45 6f 66 41 20 61 6e 64 20 61 6e 20 45 4f  o EofA and an EO
135b0 46 20 6f 6e 20 42 20 66 6f 6c 6c 6f 77 69 6e 67  F on B following
135c0 20 6e 65 78 74 42 20 63 61 75 73 65 73 0a 2a 2a   nextB causes.**
135d0 20 61 6e 20 69 6d 6d 65 64 69 61 74 65 20 6a 75   an immediate ju
135e0 6d 70 20 74 6f 20 45 6f 66 42 2e 20 20 57 69 74  mp to EofB.  Wit
135f0 68 69 6e 20 45 6f 66 41 20 61 6e 64 20 45 6f 66  hin EofA and Eof
13600 42 2c 20 61 6e 64 20 45 4f 46 20 6f 6e 20 65 6e  B, and EOF on en
13610 74 72 79 20 6f 72 0a 2a 2a 20 66 6f 6c 6c 6f 77  try or.** follow
13620 69 6e 67 20 6e 65 78 74 58 20 63 61 75 73 65 73  ing nextX causes
13630 20 61 20 6a 75 6d 70 20 74 6f 20 74 68 65 20 65   a jump to the e
13640 6e 64 20 6f 66 20 74 68 65 20 73 65 6c 65 63 74  nd of the select
13650 20 70 72 6f 63 65 73 73 69 6e 67 2e 0a 2a 2a 0a   processing..**.
13660 2a 2a 20 44 75 70 6c 69 63 61 74 65 20 72 65 6d  ** Duplicate rem
13670 6f 76 61 6c 20 69 6e 20 74 68 65 20 55 4e 49 4f  oval in the UNIO
13680 4e 2c 20 45 58 43 45 50 54 2c 20 61 6e 64 20 49  N, EXCEPT, and I
13690 4e 54 45 52 53 45 43 54 20 63 61 73 65 73 20 69  NTERSECT cases i
136a0 73 20 68 61 6e 64 6c 65 64 0a 2a 2a 20 77 69 74  s handled.** wit
136b0 68 69 6e 20 74 68 65 20 6f 75 74 70 75 74 20 73  hin the output s
136c0 75 62 72 6f 75 74 69 6e 65 2e 20 20 54 68 65 20  ubroutine.  The 
136d0 72 65 67 50 72 65 76 20 72 65 67 69 73 74 65 72  regPrev register
136e0 20 73 65 74 20 68 6f 6c 64 73 20 74 68 65 20 70   set holds the p
136f0 72 65 76 69 6f 75 73 6c 79 0a 2a 2a 20 6f 75 74  reviously.** out
13700 70 75 74 20 76 61 6c 75 65 2e 20 20 41 20 63 6f  put value.  A co
13710 6d 70 61 72 69 73 6f 6e 20 69 73 20 6d 61 64 65  mparison is made
13720 20 61 67 61 69 6e 73 74 20 74 68 69 73 20 76 61   against this va
13730 6c 75 65 20 61 6e 64 20 74 68 65 20 6f 75 74 70  lue and the outp
13740 75 74 0a 2a 2a 20 69 73 20 73 6b 69 70 70 65 64  ut.** is skipped
13750 20 69 66 20 74 68 65 20 6e 65 78 74 20 72 65 73   if the next res
13760 75 6c 74 73 20 77 6f 75 6c 64 20 62 65 20 74 68  ults would be th
13770 65 20 73 61 6d 65 20 61 73 20 74 68 65 20 70 72  e same as the pr
13780 65 76 69 6f 75 73 2e 0a 2a 2a 0a 2a 2a 20 54 68  evious..**.** Th
13790 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  e implementation
137a0 20 70 6c 61 6e 20 69 73 20 74 6f 20 69 6d 70 6c   plan is to impl
137b0 65 6d 65 6e 74 20 74 68 65 20 74 77 6f 20 63 6f  ement the two co
137c0 72 6f 75 74 69 6e 65 73 20 61 6e 64 20 73 65 76  routines and sev
137d0 65 6e 0a 2a 2a 20 73 75 62 72 6f 75 74 69 6e 65  en.** subroutine
137e0 73 20 66 69 72 73 74 2c 20 74 68 65 6e 20 70 75  s first, then pu
137f0 74 20 74 68 65 20 63 6f 6e 74 72 6f 6c 20 6c 6f  t the control lo
13800 67 69 63 20 61 74 20 74 68 65 20 62 6f 74 74 6f  gic at the botto
13810 6d 2e 20 20 4c 69 6b 65 20 74 68 69 73 3a 0a 2a  m.  Like this:.*
13820 2a 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 67 6f  *.**          go
13830 74 6f 20 49 6e 69 74 0a 2a 2a 20 20 20 20 20 63  to Init.**     c
13840 6f 41 3a 20 63 6f 72 6f 75 74 69 6e 65 20 66 6f  oA: coroutine fo
13850 72 20 6c 65 66 74 20 71 75 65 72 79 20 28 41 29  r left query (A)
13860 0a 2a 2a 20 20 20 20 20 63 6f 42 3a 20 63 6f 72  .**     coB: cor
13870 6f 75 74 69 6e 65 20 66 6f 72 20 72 69 67 68 74  outine for right
13880 20 71 75 65 72 79 20 28 42 29 0a 2a 2a 20 20 20   query (B).**   
13890 20 6f 75 74 41 3a 20 6f 75 74 70 75 74 20 6f 6e   outA: output on
138a0 65 20 72 6f 77 20 6f 66 20 41 0a 2a 2a 20 20 20  e row of A.**   
138b0 20 6f 75 74 42 3a 20 6f 75 74 70 75 74 20 6f 6e   outB: output on
138c0 65 20 72 6f 77 20 6f 66 20 42 20 28 55 4e 49 4f  e row of B (UNIO
138d0 4e 20 61 6e 64 20 55 4e 49 4f 4e 20 41 4c 4c 20  N and UNION ALL 
138e0 6f 6e 6c 79 29 0a 2a 2a 20 20 20 20 45 6f 66 41  only).**    EofA
138f0 3a 20 2e 2e 2e 0a 2a 2a 20 20 20 20 45 6f 66 42  : ....**    EofB
13900 3a 20 2e 2e 2e 0a 2a 2a 20 20 20 20 41 6c 74 42  : ....**    AltB
13910 3a 20 2e 2e 2e 0a 2a 2a 20 20 20 20 41 65 71 42  : ....**    AeqB
13920 3a 20 2e 2e 2e 0a 2a 2a 20 20 20 20 41 67 74 42  : ....**    AgtB
13930 3a 20 2e 2e 2e 0a 2a 2a 20 20 20 20 49 6e 69 74  : ....**    Init
13940 3a 20 69 6e 69 74 69 61 6c 69 7a 65 20 63 6f 72  : initialize cor
13950 6f 75 74 69 6e 65 20 72 65 67 69 73 74 65 72 73  outine registers
13960 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 79 69 65  .**          yie
13970 6c 64 20 63 6f 41 0a 2a 2a 20 20 20 20 20 20 20  ld coA.**       
13980 20 20 20 69 66 20 65 6f 66 28 41 29 20 67 6f 74     if eof(A) got
13990 6f 20 45 6f 66 41 0a 2a 2a 20 20 20 20 20 20 20  o EofA.**       
139a0 20 20 20 79 69 65 6c 64 20 63 6f 42 0a 2a 2a 20     yield coB.** 
139b0 20 20 20 20 20 20 20 20 20 69 66 20 65 6f 66 28           if eof(
139c0 42 29 20 67 6f 74 6f 20 45 6f 66 42 0a 2a 2a 20  B) goto EofB.** 
139d0 20 20 20 43 6d 70 72 3a 20 43 6f 6d 70 61 72 65     Cmpr: Compare
139e0 20 41 2c 20 42 0a 2a 2a 20 20 20 20 20 20 20 20   A, B.**        
139f0 20 20 4a 75 6d 70 20 41 6c 74 42 2c 20 41 65 71    Jump AltB, Aeq
13a00 42 2c 20 41 67 74 42 0a 2a 2a 20 20 20 20 20 45  B, AgtB.**     E
13a10 6e 64 3a 20 2e 2e 2e 0a 2a 2a 0a 2a 2a 20 57 65  nd: ....**.** We
13a20 20 63 61 6c 6c 20 41 6c 74 42 2c 20 41 65 71 42   call AltB, AeqB
13a30 2c 20 41 67 74 42 2c 20 45 6f 66 41 2c 20 61 6e  , AgtB, EofA, an
13a40 64 20 45 6f 66 42 20 22 73 75 62 72 6f 75 74 69  d EofB "subrouti
13a50 6e 65 73 22 20 62 75 74 20 74 68 65 79 20 61 72  nes" but they ar
13a60 65 20 6e 6f 74 0a 2a 2a 20 61 63 74 75 61 6c 6c  e not.** actuall
13a70 79 20 63 61 6c 6c 65 64 20 75 73 69 6e 67 20 47  y called using G
13a80 6f 73 75 62 20 61 6e 64 20 74 68 65 79 20 64 6f  osub and they do
13a90 20 6e 6f 74 20 52 65 74 75 72 6e 2e 20 20 45 6f   not Return.  Eo
13aa0 66 41 20 61 6e 64 20 45 6f 66 42 20 6c 6f 6f 70  fA and EofB loop
13ab0 0a 2a 2a 20 75 6e 74 69 6c 20 61 6c 6c 20 64 61  .** until all da
13ac0 74 61 20 69 73 20 65 78 68 61 75 73 74 65 64 20  ta is exhausted 
13ad0 74 68 65 6e 20 6a 75 6d 70 20 74 6f 20 74 68 65  then jump to the
13ae0 20 22 65 6e 64 22 20 6c 61 62 65 2e 20 20 41 6c   "end" labe.  Al
13af0 74 42 2c 20 41 65 71 42 2c 0a 2a 2a 20 61 6e 64  tB, AeqB,.** and
13b00 20 41 67 74 42 20 6a 75 6d 70 20 74 6f 20 65 69   AgtB jump to ei
13b10 74 68 65 72 20 4c 32 20 6f 72 20 74 6f 20 6f 6e  ther L2 or to on
13b20 65 20 6f 66 20 45 6f 66 41 20 6f 72 20 45 6f 66  e of EofA or Eof
13b30 42 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  B..*/.static int
13b40 20 6d 75 6c 74 69 53 65 6c 65 63 74 4f 72 64 65   multiSelectOrde
13b50 72 42 79 28 0a 20 20 50 61 72 73 65 20 2a 70 50  rBy(.  Parse *pP
13b60 61 72 73 65 2c 20 20 20 20 20 20 20 20 2f 2a 20  arse,        /* 
13b70 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20  Parsing context 
13b80 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 2c 20  */.  Select *p, 
13b90 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
13ba0 65 20 72 69 67 68 74 2d 6d 6f 73 74 20 6f 66 20  e right-most of 
13bb0 53 45 4c 45 43 54 73 20 74 6f 20 62 65 20 63 6f  SELECTs to be co
13bc0 64 65 64 20 2a 2f 0a 20 20 53 65 6c 65 63 74 44  ded */.  SelectD
13bd0 65 73 74 20 2a 70 44 65 73 74 20 20 20 20 20 2f  est *pDest     /
13be0 2a 20 57 68 61 74 20 74 6f 20 64 6f 20 77 69 74  * What to do wit
13bf0 68 20 71 75 65 72 79 20 72 65 73 75 6c 74 73 20  h query results 
13c00 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 2c 20 6a  */.){.  int i, j
13c10 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
13c20 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 73 20 2a   Loop counters *
13c30 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 50 72 69  /.  Select *pPri
13c40 6f 72 3b 20 20 20 20 20 20 20 2f 2a 20 41 6e 6f  or;       /* Ano
13c50 74 68 65 72 20 53 45 4c 45 43 54 20 69 6d 6d 65  ther SELECT imme
13c60 64 69 61 74 65 6c 79 20 74 6f 20 6f 75 72 20 6c  diately to our l
13c70 65 66 74 20 2a 2f 0a 20 20 56 64 62 65 20 2a 76  eft */.  Vdbe *v
13c80 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
13c90 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20  * Generate code 
13ca0 74 6f 20 74 68 69 73 20 56 44 42 45 20 2a 2f 0a  to this VDBE */.
13cb0 20 20 53 65 6c 65 63 74 44 65 73 74 20 64 65 73    SelectDest des
13cc0 74 41 3b 20 20 20 20 20 2f 2a 20 44 65 73 74 69  tA;     /* Desti
13cd0 6e 61 74 69 6f 6e 20 66 6f 72 20 63 6f 72 6f 75  nation for corou
13ce0 74 69 6e 65 20 41 20 2a 2f 0a 20 20 53 65 6c 65  tine A */.  Sele
13cf0 63 74 44 65 73 74 20 64 65 73 74 42 3b 20 20 20  ctDest destB;   
13d00 20 20 2f 2a 20 44 65 73 74 69 6e 61 74 69 6f 6e    /* Destination
13d10 20 66 6f 72 20 63 6f 72 6f 75 74 69 6e 65 20 42   for coroutine B
13d20 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 41 64 64   */.  int regAdd
13d30 72 41 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 41  rA;         /* A
13d40 64 64 72 65 73 73 20 72 65 67 69 73 74 65 72 20  ddress register 
13d50 66 6f 72 20 73 65 6c 65 63 74 2d 41 20 63 6f 72  for select-A cor
13d60 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20  outine */.  int 
13d70 72 65 67 45 6f 66 41 3b 20 20 20 20 20 20 20 20  regEofA;        
13d80 20 20 2f 2a 20 46 6c 61 67 20 74 6f 20 69 6e 64    /* Flag to ind
13d90 69 63 61 74 65 20 77 68 65 6e 20 73 65 6c 65 63  icate when selec
13da0 74 2d 41 20 69 73 20 63 6f 6d 70 6c 65 74 65 20  t-A is complete 
13db0 2a 2f 0a 20 20 69 6e 74 20 72 65 67 41 64 64 72  */.  int regAddr
13dc0 42 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64  B;         /* Ad
13dd0 64 72 65 73 73 20 72 65 67 69 73 74 65 72 20 66  dress register f
13de0 6f 72 20 73 65 6c 65 63 74 2d 42 20 63 6f 72 6f  or select-B coro
13df0 75 74 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 72  utine */.  int r
13e00 65 67 45 6f 66 42 3b 20 20 20 20 20 20 20 20 20  egEofB;         
13e10 20 2f 2a 20 46 6c 61 67 20 74 6f 20 69 6e 64 69   /* Flag to indi
13e20 63 61 74 65 20 77 68 65 6e 20 73 65 6c 65 63 74  cate when select
13e30 2d 42 20 69 73 20 63 6f 6d 70 6c 65 74 65 20 2a  -B is complete *
13e40 2f 0a 20 20 69 6e 74 20 61 64 64 72 53 65 6c 65  /.  int addrSele
13e50 63 74 41 3b 20 20 20 20 20 20 2f 2a 20 41 64 64  ctA;      /* Add
13e60 72 65 73 73 20 6f 66 20 74 68 65 20 73 65 6c 65  ress of the sele
13e70 63 74 2d 41 20 63 6f 72 6f 75 74 69 6e 65 20 2a  ct-A coroutine *
13e80 2f 0a 20 20 69 6e 74 20 61 64 64 72 53 65 6c 65  /.  int addrSele
13e90 63 74 42 3b 20 20 20 20 20 20 2f 2a 20 41 64 64  ctB;      /* Add
13ea0 72 65 73 73 20 6f 66 20 74 68 65 20 73 65 6c 65  ress of the sele
13eb0 63 74 2d 42 20 63 6f 72 6f 75 74 69 6e 65 20 2a  ct-B coroutine *
13ec0 2f 0a 20 20 69 6e 74 20 72 65 67 4f 75 74 41 3b  /.  int regOutA;
13ed0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64            /* Add
13ee0 72 65 73 73 20 72 65 67 69 73 74 65 72 20 66 6f  ress register fo
13ef0 72 20 74 68 65 20 6f 75 74 70 75 74 2d 41 20 73  r the output-A s
13f00 75 62 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 69  ubroutine */.  i
13f10 6e 74 20 72 65 67 4f 75 74 42 3b 20 20 20 20 20  nt regOutB;     
13f20 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20       /* Address 
13f30 72 65 67 69 73 74 65 72 20 66 6f 72 20 74 68 65  register for the
13f40 20 6f 75 74 70 75 74 2d 42 20 73 75 62 72 6f 75   output-B subrou
13f50 74 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 61 64  tine */.  int ad
13f60 64 72 4f 75 74 41 3b 20 20 20 20 20 20 20 20 20  drOutA;         
13f70 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20 74 68  /* Address of th
13f80 65 20 6f 75 74 70 75 74 2d 41 20 73 75 62 72 6f  e output-A subro
13f90 75 74 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 61  utine */.  int a
13fa0 64 64 72 4f 75 74 42 3b 20 20 20 20 20 20 20 20  ddrOutB;        
13fb0 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20 74   /* Address of t
13fc0 68 65 20 6f 75 74 70 75 74 2d 42 20 73 75 62 72  he output-B subr
13fd0 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20  outine */.  int 
13fe0 61 64 64 72 45 6f 66 41 3b 20 20 20 20 20 20 20  addrEofA;       
13ff0 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20    /* Address of 
14000 74 68 65 20 73 65 6c 65 63 74 2d 41 2d 65 78 68  the select-A-exh
14010 61 75 73 74 65 64 20 73 75 62 72 6f 75 74 69 6e  austed subroutin
14020 65 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 45  e */.  int addrE
14030 6f 66 42 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  ofB;         /* 
14040 41 64 64 72 65 73 73 20 6f 66 20 74 68 65 20 73  Address of the s
14050 65 6c 65 63 74 2d 42 2d 65 78 68 61 75 73 74 65  elect-B-exhauste
14060 64 20 73 75 62 72 6f 75 74 69 6e 65 20 2a 2f 0a  d subroutine */.
14070 20 20 69 6e 74 20 61 64 64 72 41 6c 74 42 3b 20    int addrAltB; 
14080 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65          /* Addre
14090 73 73 20 6f 66 20 74 68 65 20 41 3c 42 20 73 75  ss of the A<B su
140a0 62 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 69 6e  broutine */.  in
140b0 74 20 61 64 64 72 41 65 71 42 3b 20 20 20 20 20  t addrAeqB;     
140c0 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f      /* Address o
140d0 66 20 74 68 65 20 41 3d 3d 42 20 73 75 62 72 6f  f the A==B subro
140e0 75 74 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 61  utine */.  int a
140f0 64 64 72 41 67 74 42 3b 20 20 20 20 20 20 20 20  ddrAgtB;        
14100 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20 74   /* Address of t
14110 68 65 20 41 3e 42 20 73 75 62 72 6f 75 74 69 6e  he A>B subroutin
14120 65 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 4c 69  e */.  int regLi
14130 6d 69 74 41 3b 20 20 20 20 20 20 20 20 2f 2a 20  mitA;        /* 
14140 4c 69 6d 69 74 20 72 65 67 69 73 74 65 72 20 66  Limit register f
14150 6f 72 20 73 65 6c 65 63 74 2d 41 20 2a 2f 0a 20  or select-A */. 
14160 20 69 6e 74 20 72 65 67 4c 69 6d 69 74 42 3b 20   int regLimitB; 
14170 20 20 20 20 20 20 20 2f 2a 20 4c 69 6d 69 74 20         /* Limit 
14180 72 65 67 69 73 74 65 72 20 66 6f 72 20 73 65 6c  register for sel
14190 65 63 74 2d 41 20 2a 2f 0a 20 20 69 6e 74 20 72  ect-A */.  int r
141a0 65 67 50 72 65 76 3b 20 20 20 20 20 20 20 20 20  egPrev;         
141b0 20 2f 2a 20 41 20 72 61 6e 67 65 20 6f 66 20 72   /* A range of r
141c0 65 67 69 73 74 65 72 73 20 74 6f 20 68 6f 6c 64  egisters to hold
141d0 20 70 72 65 76 69 6f 75 73 20 6f 75 74 70 75 74   previous output
141e0 20 2a 2f 0a 20 20 69 6e 74 20 73 61 76 65 64 4c   */.  int savedL
141f0 69 6d 69 74 3b 20 20 20 20 20 20 20 2f 2a 20 53  imit;       /* S
14200 61 76 65 64 20 76 61 6c 75 65 20 6f 66 20 70 2d  aved value of p-
14210 3e 69 4c 69 6d 69 74 20 2a 2f 0a 20 20 69 6e 74  >iLimit */.  int
14220 20 73 61 76 65 64 4f 66 66 73 65 74 3b 20 20 20   savedOffset;   
14230 20 20 20 2f 2a 20 53 61 76 65 64 20 76 61 6c 75     /* Saved valu
14240 65 20 6f 66 20 70 2d 3e 69 4f 66 66 73 65 74 20  e of p->iOffset 
14250 2a 2f 0a 20 20 69 6e 74 20 6c 61 62 65 6c 43 6d  */.  int labelCm
14260 70 72 3b 20 20 20 20 20 20 20 20 2f 2a 20 4c 61  pr;        /* La
14270 62 65 6c 20 66 6f 72 20 74 68 65 20 73 74 61 72  bel for the star
14280 74 20 6f 66 20 74 68 65 20 6d 65 72 67 65 20 61  t of the merge a
14290 6c 67 6f 72 69 74 68 6d 20 2a 2f 0a 20 20 69 6e  lgorithm */.  in
142a0 74 20 6c 61 62 65 6c 45 6e 64 3b 20 20 20 20 20  t labelEnd;     
142b0 20 20 20 20 2f 2a 20 4c 61 62 65 6c 20 66 6f 72      /* Label for
142c0 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20   the end of the 
142d0 6f 76 65 72 61 6c 6c 20 53 45 4c 45 43 54 20 73  overall SELECT s
142e0 74 6d 74 20 2a 2f 0a 20 20 69 6e 74 20 6a 31 3b  tmt */.  int j1;
142f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
14300 2a 20 4a 75 6d 70 20 69 6e 73 74 72 75 63 74 69  * Jump instructi
14310 6f 6e 73 20 74 68 61 74 20 67 65 74 20 72 65 74  ons that get ret
14320 61 72 67 65 74 74 65 64 20 2a 2f 0a 20 20 69 6e  argetted */.  in
14330 74 20 6f 70 3b 20 20 20 20 20 20 20 20 20 20 20  t op;           
14340 20 20 20 20 2f 2a 20 4f 6e 65 20 6f 66 20 54 4b      /* One of TK
14350 5f 41 4c 4c 2c 20 54 4b 5f 55 4e 49 4f 4e 2c 20  _ALL, TK_UNION, 
14360 54 4b 5f 45 58 43 45 50 54 2c 20 54 4b 5f 49 4e  TK_EXCEPT, TK_IN
14370 54 45 52 53 45 43 54 20 2a 2f 0a 20 20 4b 65 79  TERSECT */.  Key
14380 49 6e 66 6f 20 2a 70 4b 65 79 44 75 70 3b 20 20  Info *pKeyDup;  
14390 20 20 20 2f 2a 20 43 6f 6d 70 61 72 69 73 6f 6e     /* Comparison
143a0 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 6f 72   information for
143b0 20 64 75 70 6c 69 63 61 74 65 20 72 65 6d 6f 76   duplicate remov
143c0 61 6c 20 2a 2f 0a 20 20 4b 65 79 49 6e 66 6f 20  al */.  KeyInfo 
143d0 2a 70 4b 65 79 4d 65 72 67 65 3b 20 20 20 2f 2a  *pKeyMerge;   /*
143e0 20 43 6f 6d 70 61 72 69 73 6f 6e 20 69 6e 66 6f   Comparison info
143f0 72 6d 61 74 69 6f 6e 20 66 6f 72 20 6d 65 72 67  rmation for merg
14400 69 6e 67 20 72 6f 77 73 20 2a 2f 0a 20 20 73 71  ing rows */.  sq
14410 6c 69 74 65 33 20 2a 64 62 3b 20 20 20 20 20 20  lite3 *db;      
14420 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20      /* Database 
14430 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20  connection */.  
14440 45 78 70 72 4c 69 73 74 20 2a 70 4f 72 64 65 72  ExprList *pOrder
14450 42 79 3b 20 20 20 2f 2a 20 54 68 65 20 4f 52 44  By;   /* The ORD
14460 45 52 20 42 59 20 63 6c 61 75 73 65 20 2a 2f 0a  ER BY clause */.
14470 20 20 69 6e 74 20 6e 4f 72 64 65 72 42 79 3b 20    int nOrderBy; 
14480 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
14490 72 20 6f 66 20 74 65 72 6d 73 20 69 6e 20 74 68  r of terms in th
144a0 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73  e ORDER BY claus
144b0 65 20 2a 2f 0a 20 20 69 6e 74 20 2a 61 50 65 72  e */.  int *aPer
144c0 6d 75 74 65 3b 20 20 20 20 20 20 20 20 2f 2a 20  mute;        /* 
144d0 4d 61 70 70 69 6e 67 20 66 72 6f 6d 20 4f 52 44  Mapping from ORD
144e0 45 52 20 42 59 20 74 65 72 6d 73 20 74 6f 20 72  ER BY terms to r
144f0 65 73 75 6c 74 20 73 65 74 20 63 6f 6c 75 6d 6e  esult set column
14500 73 20 2a 2f 0a 20 20 75 38 20 4e 6f 74 55 73 65  s */.  u8 NotUse
14510 64 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  d;           /* 
14520 44 75 6d 6d 79 20 76 61 72 69 61 62 6c 65 73 20  Dummy variables 
14530 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70 2d  */..  assert( p-
14540 3e 70 4f 72 64 65 72 42 79 21 3d 30 20 29 3b 0a  >pOrderBy!=0 );.
14550 20 20 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64    db = pParse->d
14560 62 3b 0a 20 20 76 20 3d 20 70 50 61 72 73 65 2d  b;.  v = pParse-
14570 3e 70 56 64 62 65 3b 0a 20 20 69 66 28 20 76 3d  >pVdbe;.  if( v=
14580 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49  =0 ) return SQLI
14590 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 6c 61 62 65  TE_NOMEM;.  labe
145a0 6c 45 6e 64 20 3d 20 73 71 6c 69 74 65 33 56 64  lEnd = sqlite3Vd
145b0 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a  beMakeLabel(v);.
145c0 20 20 6c 61 62 65 6c 43 6d 70 72 20 3d 20 73 71    labelCmpr = sq
145d0 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62  lite3VdbeMakeLab
145e0 65 6c 28 76 29 3b 0a 0a 0a 20 20 2f 2a 20 50 61  el(v);...  /* Pa
145f0 74 63 68 20 75 70 20 74 68 65 20 4f 52 44 45 52  tch up the ORDER
14600 20 42 59 20 63 6c 61 75 73 65 0a 20 20 2a 2f 0a   BY clause.  */.
14610 20 20 6f 70 20 3d 20 70 2d 3e 6f 70 3b 20 20 0a    op = p->op;  .
14620 20 20 70 50 72 69 6f 72 20 3d 20 70 2d 3e 70 50    pPrior = p->pP
14630 72 69 6f 72 3b 0a 20 20 61 73 73 65 72 74 28 20  rior;.  assert( 
14640 70 50 72 69 6f 72 2d 3e 70 4f 72 64 65 72 42 79  pPrior->pOrderBy
14650 3d 3d 30 20 29 3b 0a 20 20 70 4f 72 64 65 72 42  ==0 );.  pOrderB
14660 79 20 3d 20 70 2d 3e 70 4f 72 64 65 72 42 79 3b  y = p->pOrderBy;
14670 0a 20 20 61 73 73 65 72 74 28 20 70 4f 72 64 65  .  assert( pOrde
14680 72 42 79 20 29 3b 0a 20 20 69 66 28 20 70 72 6f  rBy );.  if( pro
14690 63 65 73 73 43 6f 6d 70 6f 75 6e 64 4f 72 64 65  cessCompoundOrde
146a0 72 42 79 28 70 50 61 72 73 65 2c 20 70 29 20 29  rBy(pParse, p) )
146b0 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
146c0 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20  ITE_ERROR;.  }. 
146d0 20 6e 4f 72 64 65 72 42 79 20 3d 20 70 4f 72 64   nOrderBy = pOrd
146e0 65 72 42 79 2d 3e 6e 45 78 70 72 3b 0a 0a 20 20  erBy->nExpr;..  
146f0 2f 2a 20 46 6f 72 20 6f 70 65 72 61 74 6f 72 73  /* For operators
14700 20 6f 74 68 65 72 20 74 68 61 6e 20 55 4e 49 4f   other than UNIO
14710 4e 20 41 4c 4c 20 77 65 20 68 61 76 65 20 74 6f  N ALL we have to
14720 20 6d 61 6b 65 20 73 75 72 65 20 74 68 61 74 0a   make sure that.
14730 20 20 2a 2a 20 74 68 65 20 4f 52 44 45 52 20 42    ** the ORDER B
14740 59 20 63 6c 61 75 73 65 20 63 6f 76 65 72 73 20  Y clause covers 
14750 65 76 65 72 79 20 74 65 72 6d 20 6f 66 20 74 68  every term of th
14760 65 20 72 65 73 75 6c 74 20 73 65 74 2e 20 20 41  e result set.  A
14770 64 64 0a 20 20 2a 2a 20 74 65 72 6d 73 20 74 6f  dd.  ** terms to
14780 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c   the ORDER BY cl
14790 61 75 73 65 20 61 73 20 6e 65 63 65 73 73 61 72  ause as necessar
147a0 79 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6f 70  y..  */.  if( op
147b0 21 3d 54 4b 5f 41 4c 4c 20 29 7b 0a 20 20 20 20  !=TK_ALL ){.    
147c0 66 6f 72 28 69 3d 31 3b 20 64 62 2d 3e 6d 61 6c  for(i=1; db->mal
147d0 6c 6f 63 46 61 69 6c 65 64 3d 3d 30 20 26 26 20  locFailed==0 && 
147e0 69 3c 3d 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45  i<=p->pEList->nE
147f0 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  xpr; i++){.     
14800 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 6e 4f 72 64   for(j=0; j<nOrd
14810 65 72 42 79 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20  erBy; j++){.    
14820 20 20 20 20 45 78 70 72 20 2a 70 54 65 72 6d 20      Expr *pTerm 
14830 3d 20 70 4f 72 64 65 72 42 79 2d 3e 61 5b 6a 5d  = pOrderBy->a[j]
14840 2e 70 45 78 70 72 3b 0a 20 20 20 20 20 20 20 20  .pExpr;.        
14850 61 73 73 65 72 74 28 20 70 54 65 72 6d 2d 3e 6f  assert( pTerm->o
14860 70 3d 3d 54 4b 5f 49 4e 54 45 47 45 52 20 29 3b  p==TK_INTEGER );
14870 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
14880 20 28 70 54 65 72 6d 2d 3e 66 6c 61 67 73 20 26   (pTerm->flags &
14890 20 45 50 5f 49 6e 74 56 61 6c 75 65 29 21 3d 30   EP_IntValue)!=0
148a0 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20   );.        if( 
148b0 70 54 65 72 6d 2d 3e 69 54 61 62 6c 65 3d 3d 69  pTerm->iTable==i
148c0 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20   ) break;.      
148d0 7d 0a 20 20 20 20 20 20 69 66 28 20 6a 3d 3d 6e  }.      if( j==n
148e0 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20 20  OrderBy ){.     
148f0 20 20 20 45 78 70 72 20 2a 70 4e 65 77 20 3d 20     Expr *pNew = 
14900 73 71 6c 69 74 65 33 50 45 78 70 72 28 70 50 61  sqlite3PExpr(pPa
14910 72 73 65 2c 20 54 4b 5f 49 4e 54 45 47 45 52 2c  rse, TK_INTEGER,
14920 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20   0, 0, 0);.     
14930 20 20 20 69 66 28 20 70 4e 65 77 3d 3d 30 20 29     if( pNew==0 )
14940 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e   return SQLITE_N
14950 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 20 20 70 4e  OMEM;.        pN
14960 65 77 2d 3e 66 6c 61 67 73 20 7c 3d 20 45 50 5f  ew->flags |= EP_
14970 49 6e 74 56 61 6c 75 65 3b 0a 20 20 20 20 20 20  IntValue;.      
14980 20 20 70 4e 65 77 2d 3e 69 54 61 62 6c 65 20 3d    pNew->iTable =
14990 20 69 3b 0a 20 20 20 20 20 20 20 20 70 4f 72 64   i;.        pOrd
149a0 65 72 42 79 20 3d 20 73 71 6c 69 74 65 33 45 78  erBy = sqlite3Ex
149b0 70 72 4c 69 73 74 41 70 70 65 6e 64 28 70 50 61  prListAppend(pPa
149c0 72 73 65 2c 20 70 4f 72 64 65 72 42 79 2c 20 70  rse, pOrderBy, p
149d0 4e 65 77 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  New, 0);.       
149e0 20 6e 4f 72 64 65 72 42 79 2b 2b 3b 0a 20 20 20   nOrderBy++;.   
149f0 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a     }.    }.  }..
14a00 20 20 2f 2a 20 43 6f 6d 70 75 74 65 20 74 68 65    /* Compute the
14a10 20 63 6f 6d 70 61 72 69 73 6f 6e 20 70 65 72 6d   comparison perm
14a20 75 74 61 74 69 6f 6e 20 61 6e 64 20 6b 65 79 69  utation and keyi
14a30 6e 66 6f 20 74 68 61 74 20 69 73 20 75 73 65 64  nfo that is used
14a40 20 77 69 74 68 0a 20 20 2a 2a 20 74 68 65 20 70   with.  ** the p
14a50 65 72 6d 75 74 61 74 69 6f 6e 20 69 6e 20 6f 72  ermutation in or
14a60 64 65 72 20 74 6f 20 63 6f 6d 70 61 72 69 73 6f  der to compariso
14a70 6e 73 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20  ns to determine 
14a80 69 66 20 74 68 65 20 6e 65 78 74 0a 20 20 2a 2a  if the next.  **
14a90 20 72 6f 77 20 6f 66 20 72 65 73 75 6c 74 73 20   row of results 
14aa0 63 6f 6d 65 73 20 66 72 6f 6d 20 73 65 6c 65 63  comes from selec
14ab0 74 41 20 6f 72 20 73 65 6c 65 63 74 42 2e 20 20  tA or selectB.  
14ac0 41 6c 73 6f 20 61 64 64 20 65 78 70 6c 69 63 69  Also add explici
14ad0 74 0a 20 20 2a 2a 20 63 6f 6c 6c 61 74 69 6f 6e  t.  ** collation
14ae0 73 20 74 6f 20 74 68 65 20 4f 52 44 45 52 20 42  s to the ORDER B
14af0 59 20 63 6c 61 75 73 65 20 74 65 72 6d 73 20 73  Y clause terms s
14b00 6f 20 74 68 61 74 20 77 68 65 6e 20 74 68 65 20  o that when the 
14b10 73 75 62 71 75 65 72 69 65 73 0a 20 20 2a 2a 20  subqueries.  ** 
14b20 74 6f 20 74 68 65 20 72 69 67 68 74 20 61 6e 64  to the right and
14b30 20 74 68 65 20 6c 65 66 74 20 61 72 65 20 65 76   the left are ev
14b40 61 6c 75 61 74 65 64 2c 20 74 68 65 79 20 75 73  aluated, they us
14b50 65 20 74 68 65 20 63 6f 72 72 65 63 74 0a 20 20  e the correct.  
14b60 2a 2a 20 63 6f 6c 6c 61 74 69 6f 6e 2e 0a 20 20  ** collation..  
14b70 2a 2f 0a 20 20 61 50 65 72 6d 75 74 65 20 3d 20  */.  aPermute = 
14b80 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52  sqlite3DbMallocR
14b90 61 77 28 64 62 2c 20 73 69 7a 65 6f 66 28 69 6e  aw(db, sizeof(in
14ba0 74 29 2a 6e 4f 72 64 65 72 42 79 29 3b 0a 20 20  t)*nOrderBy);.  
14bb0 69 66 28 20 61 50 65 72 6d 75 74 65 20 29 7b 0a  if( aPermute ){.
14bc0 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e      for(i=0; i<n
14bd0 4f 72 64 65 72 42 79 3b 20 69 2b 2b 29 7b 0a 20  OrderBy; i++){. 
14be0 20 20 20 20 20 45 78 70 72 20 2a 70 54 65 72 6d       Expr *pTerm
14bf0 20 3d 20 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69   = pOrderBy->a[i
14c00 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 20 20 61  ].pExpr;.      a
14c10 73 73 65 72 74 28 20 70 54 65 72 6d 2d 3e 6f 70  ssert( pTerm->op
14c20 3d 3d 54 4b 5f 49 4e 54 45 47 45 52 20 29 3b 0a  ==TK_INTEGER );.
14c30 20 20 20 20 20 20 61 73 73 65 72 74 28 20 28 70        assert( (p
14c40 54 65 72 6d 2d 3e 66 6c 61 67 73 20 26 20 45 50  Term->flags & EP
14c50 5f 49 6e 74 56 61 6c 75 65 29 21 3d 30 20 29 3b  _IntValue)!=0 );
14c60 0a 20 20 20 20 20 20 61 50 65 72 6d 75 74 65 5b  .      aPermute[
14c70 69 5d 20 3d 20 70 54 65 72 6d 2d 3e 69 54 61 62  i] = pTerm->iTab
14c80 6c 65 2d 31 3b 0a 20 20 20 20 20 20 61 73 73 65  le-1;.      asse
14c90 72 74 28 20 61 50 65 72 6d 75 74 65 5b 69 5d 3e  rt( aPermute[i]>
14ca0 3d 30 20 26 26 20 61 50 65 72 6d 75 74 65 5b 69  =0 && aPermute[i
14cb0 5d 3c 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78  ]<p->pEList->nEx
14cc0 70 72 20 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  pr );.    }.    
14cd0 70 4b 65 79 4d 65 72 67 65 20 3d 0a 20 20 20 20  pKeyMerge =.    
14ce0 20 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f    sqlite3DbMallo
14cf0 63 52 61 77 28 64 62 2c 20 73 69 7a 65 6f 66 28  cRaw(db, sizeof(
14d00 2a 70 4b 65 79 4d 65 72 67 65 29 2b 6e 4f 72 64  *pKeyMerge)+nOrd
14d10 65 72 42 79 2a 28 73 69 7a 65 6f 66 28 43 6f 6c  erBy*(sizeof(Col
14d20 6c 53 65 71 2a 29 2b 31 29 29 3b 0a 20 20 20 20  lSeq*)+1));.    
14d30 69 66 28 20 70 4b 65 79 4d 65 72 67 65 20 29 7b  if( pKeyMerge ){
14d40 0a 20 20 20 20 20 20 70 4b 65 79 4d 65 72 67 65  .      pKeyMerge
14d50 2d 3e 61 53 6f 72 74 4f 72 64 65 72 20 3d 20 28  ->aSortOrder = (
14d60 75 38 2a 29 26 70 4b 65 79 4d 65 72 67 65 2d 3e  u8*)&pKeyMerge->
14d70 61 43 6f 6c 6c 5b 6e 4f 72 64 65 72 42 79 5d 3b  aColl[nOrderBy];
14d80 0a 20 20 20 20 20 20 70 4b 65 79 4d 65 72 67 65  .      pKeyMerge
14d90 2d 3e 6e 46 69 65 6c 64 20 3d 20 6e 4f 72 64 65  ->nField = nOrde
14da0 72 42 79 3b 0a 20 20 20 20 20 20 70 4b 65 79 4d  rBy;.      pKeyM
14db0 65 72 67 65 2d 3e 65 6e 63 20 3d 20 45 4e 43 28  erge->enc = ENC(
14dc0 64 62 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 69  db);.      for(i
14dd0 3d 30 3b 20 69 3c 6e 4f 72 64 65 72 42 79 3b 20  =0; i<nOrderBy; 
14de0 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 43 6f  i++){.        Co
14df0 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 3b 0a 20 20  llSeq *pColl;.  
14e00 20 20 20 20 20 20 45 78 70 72 20 2a 70 54 65 72        Expr *pTer
14e10 6d 20 3d 20 70 4f 72 64 65 72 42 79 2d 3e 61 5b  m = pOrderBy->a[
14e20 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 20 20  i].pExpr;.      
14e30 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 66 6c 61    if( pTerm->fla
14e40 67 73 20 26 20 45 50 5f 45 78 70 43 6f 6c 6c 61  gs & EP_ExpColla
14e50 74 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  te ){.          
14e60 70 43 6f 6c 6c 20 3d 20 70 54 65 72 6d 2d 3e 70  pColl = pTerm->p
14e70 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 20 20 7d 65  Coll;.        }e
14e80 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 70  lse{.          p
14e90 43 6f 6c 6c 20 3d 20 6d 75 6c 74 69 53 65 6c 65  Coll = multiSele
14ea0 63 74 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65  ctCollSeq(pParse
14eb0 2c 20 70 2c 20 61 50 65 72 6d 75 74 65 5b 69 5d  , p, aPermute[i]
14ec0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70 54 65  );.          pTe
14ed0 72 6d 2d 3e 66 6c 61 67 73 20 7c 3d 20 45 50 5f  rm->flags |= EP_
14ee0 45 78 70 43 6f 6c 6c 61 74 65 3b 0a 20 20 20 20  ExpCollate;.    
14ef0 20 20 20 20 20 20 70 54 65 72 6d 2d 3e 70 43 6f        pTerm->pCo
14f00 6c 6c 20 3d 20 70 43 6f 6c 6c 3b 0a 20 20 20 20  ll = pColl;.    
14f10 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 70 4b      }.        pK
14f20 65 79 4d 65 72 67 65 2d 3e 61 43 6f 6c 6c 5b 69  eyMerge->aColl[i
14f30 5d 20 3d 20 70 43 6f 6c 6c 3b 0a 20 20 20 20 20  ] = pColl;.     
14f40 20 20 20 70 4b 65 79 4d 65 72 67 65 2d 3e 61 53     pKeyMerge->aS
14f50 6f 72 74 4f 72 64 65 72 5b 69 5d 20 3d 20 70 4f  ortOrder[i] = pO
14f60 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 73 6f 72  rderBy->a[i].sor
14f70 74 4f 72 64 65 72 3b 0a 20 20 20 20 20 20 7d 0a  tOrder;.      }.
14f80 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20      }.  }else{. 
14f90 20 20 20 70 4b 65 79 4d 65 72 67 65 20 3d 20 30     pKeyMerge = 0
14fa0 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 65 61 74  ;.  }..  /* Reat
14fb0 74 61 63 68 20 74 68 65 20 4f 52 44 45 52 20 42  tach the ORDER B
14fc0 59 20 63 6c 61 75 73 65 20 74 6f 20 74 68 65 20  Y clause to the 
14fd0 71 75 65 72 79 2e 0a 20 20 2a 2f 0a 20 20 70 2d  query..  */.  p-
14fe0 3e 70 4f 72 64 65 72 42 79 20 3d 20 70 4f 72 64  >pOrderBy = pOrd
14ff0 65 72 42 79 3b 0a 20 20 70 50 72 69 6f 72 2d 3e  erBy;.  pPrior->
15000 70 4f 72 64 65 72 42 79 20 3d 20 73 71 6c 69 74  pOrderBy = sqlit
15010 65 33 45 78 70 72 4c 69 73 74 44 75 70 28 70 50  e3ExprListDup(pP
15020 61 72 73 65 2d 3e 64 62 2c 20 70 4f 72 64 65 72  arse->db, pOrder
15030 42 79 29 3b 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63  By);..  /* Alloc
15040 61 74 65 20 61 20 72 61 6e 67 65 20 6f 66 20 74  ate a range of t
15050 65 6d 70 6f 72 61 72 79 20 72 65 67 69 73 74 65  emporary registe
15060 72 73 20 61 6e 64 20 74 68 65 20 4b 65 79 49 6e  rs and the KeyIn
15070 66 6f 20 6e 65 65 64 65 64 0a 20 20 2a 2a 20 66  fo needed.  ** f
15080 6f 72 20 74 68 65 20 6c 6f 67 69 63 20 74 68 61  or the logic tha
15090 74 20 72 65 6d 6f 76 65 73 20 64 75 70 6c 69 63  t removes duplic
150a0 61 74 65 20 72 65 73 75 6c 74 20 72 6f 77 73 20  ate result rows 
150b0 77 68 65 6e 20 74 68 65 0a 20 20 2a 2a 20 6f 70  when the.  ** op
150c0 65 72 61 74 6f 72 20 69 73 20 55 4e 49 4f 4e 2c  erator is UNION,
150d0 20 45 58 43 45 50 54 2c 20 6f 72 20 49 4e 54 45   EXCEPT, or INTE
150e0 52 53 45 43 54 20 28 62 75 74 20 6e 6f 74 20 55  RSECT (but not U
150f0 4e 49 4f 4e 20 41 4c 4c 29 2e 0a 20 20 2a 2f 0a  NION ALL)..  */.
15100 20 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 41 4c 4c    if( op==TK_ALL
15110 20 29 7b 0a 20 20 20 20 72 65 67 50 72 65 76 20   ){.    regPrev 
15120 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  = 0;.  }else{.  
15130 20 20 69 6e 74 20 6e 45 78 70 72 20 3d 20 70 2d    int nExpr = p-
15140 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 0a  >pEList->nExpr;.
15150 20 20 20 20 61 73 73 65 72 74 28 20 6e 4f 72 64      assert( nOrd
15160 65 72 42 79 3e 3d 6e 45 78 70 72 20 29 3b 0a 20  erBy>=nExpr );. 
15170 20 20 20 72 65 67 50 72 65 76 20 3d 20 73 71 6c     regPrev = sql
15180 69 74 65 33 47 65 74 54 65 6d 70 52 61 6e 67 65  ite3GetTempRange
15190 28 70 50 61 72 73 65 2c 20 6e 45 78 70 72 2b 31  (pParse, nExpr+1
151a0 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
151b0 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49  beAddOp2(v, OP_I
151c0 6e 74 65 67 65 72 2c 20 30 2c 20 72 65 67 50 72  nteger, 0, regPr
151d0 65 76 29 3b 0a 20 20 20 20 70 4b 65 79 44 75 70  ev);.    pKeyDup
151e0 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c   = sqlite3DbMall
151f0 6f 63 5a 65 72 6f 28 64 62 2c 0a 20 20 20 20 20  ocZero(db,.     
15200 20 20 20 20 20 20 20 20 20 20 20 20 20 73 69 7a               siz
15210 65 6f 66 28 2a 70 4b 65 79 44 75 70 29 20 2b 20  eof(*pKeyDup) + 
15220 6e 45 78 70 72 2a 28 73 69 7a 65 6f 66 28 43 6f  nExpr*(sizeof(Co
15230 6c 6c 53 65 71 2a 29 2b 31 29 20 29 3b 0a 20 20  llSeq*)+1) );.  
15240 20 20 69 66 28 20 70 4b 65 79 44 75 70 20 29 7b    if( pKeyDup ){
15250 0a 20 20 20 20 20 20 70 4b 65 79 44 75 70 2d 3e  .      pKeyDup->
15260 61 53 6f 72 74 4f 72 64 65 72 20 3d 20 28 75 38  aSortOrder = (u8
15270 2a 29 26 70 4b 65 79 44 75 70 2d 3e 61 43 6f 6c  *)&pKeyDup->aCol
15280 6c 5b 6e 45 78 70 72 5d 3b 0a 20 20 20 20 20 20  l[nExpr];.      
15290 70 4b 65 79 44 75 70 2d 3e 6e 46 69 65 6c 64 20  pKeyDup->nField 
152a0 3d 20 6e 45 78 70 72 3b 0a 20 20 20 20 20 20 70  = nExpr;.      p
152b0 4b 65 79 44 75 70 2d 3e 65 6e 63 20 3d 20 45 4e  KeyDup->enc = EN
152c0 43 28 64 62 29 3b 0a 20 20 20 20 20 20 66 6f 72  C(db);.      for
152d0 28 69 3d 30 3b 20 69 3c 6e 45 78 70 72 3b 20 69  (i=0; i<nExpr; i
152e0 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 70 4b 65  ++){.        pKe
152f0 79 44 75 70 2d 3e 61 43 6f 6c 6c 5b 69 5d 20 3d  yDup->aColl[i] =
15300 20 6d 75 6c 74 69 53 65 6c 65 63 74 43 6f 6c 6c   multiSelectColl
15310 53 65 71 28 70 50 61 72 73 65 2c 20 70 2c 20 69  Seq(pParse, p, i
15320 29 3b 0a 20 20 20 20 20 20 20 20 70 4b 65 79 44  );.        pKeyD
15330 75 70 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b 69  up->aSortOrder[i
15340 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20  ] = 0;.      }. 
15350 20 20 20 7d 0a 20 20 7d 0a 20 0a 20 20 2f 2a 20     }.  }. .  /* 
15360 53 65 70 61 72 61 74 65 20 74 68 65 20 6c 65 66  Separate the lef
15370 74 20 61 6e 64 20 74 68 65 20 72 69 67 68 74 20  t and the right 
15380 71 75 65 72 79 20 66 72 6f 6d 20 6f 6e 65 20 61  query from one a
15390 6e 6f 74 68 65 72 0a 20 20 2a 2f 0a 20 20 70 2d  nother.  */.  p-
153a0 3e 70 50 72 69 6f 72 20 3d 20 30 3b 0a 20 20 70  >pPrior = 0;.  p
153b0 50 72 69 6f 72 2d 3e 70 52 69 67 68 74 6d 6f 73  Prior->pRightmos
153c0 74 20 3d 20 30 3b 0a 20 20 70 72 6f 63 65 73 73  t = 0;.  process
153d0 4f 72 64 65 72 47 72 6f 75 70 42 79 28 70 50 61  OrderGroupBy(pPa
153e0 72 73 65 2c 20 70 2c 20 70 2d 3e 70 4f 72 64 65  rse, p, p->pOrde
153f0 72 42 79 2c 20 31 2c 20 26 4e 6f 74 55 73 65 64  rBy, 1, &NotUsed
15400 29 3b 0a 20 20 69 66 28 20 70 50 72 69 6f 72 2d  );.  if( pPrior-
15410 3e 70 50 72 69 6f 72 3d 3d 30 20 29 7b 0a 20 20  >pPrior==0 ){.  
15420 20 20 70 72 6f 63 65 73 73 4f 72 64 65 72 47 72    processOrderGr
15430 6f 75 70 42 79 28 70 50 61 72 73 65 2c 20 70 50  oupBy(pParse, pP
15440 72 69 6f 72 2c 20 70 50 72 69 6f 72 2d 3e 70 4f  rior, pPrior->pO
15450 72 64 65 72 42 79 2c 20 31 2c 20 26 4e 6f 74 55  rderBy, 1, &NotU
15460 73 65 64 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  sed);.  }..  /* 
15470 43 6f 6d 70 75 74 65 20 74 68 65 20 6c 69 6d 69  Compute the limi
15480 74 20 72 65 67 69 73 74 65 72 73 20 2a 2f 0a 20  t registers */. 
15490 20 63 6f 6d 70 75 74 65 4c 69 6d 69 74 52 65 67   computeLimitReg
154a0 69 73 74 65 72 73 28 70 50 61 72 73 65 2c 20 70  isters(pParse, p
154b0 2c 20 6c 61 62 65 6c 45 6e 64 29 3b 0a 20 20 69  , labelEnd);.  i
154c0 66 28 20 70 2d 3e 69 4c 69 6d 69 74 20 26 26 20  f( p->iLimit && 
154d0 6f 70 3d 3d 54 4b 5f 41 4c 4c 20 29 7b 0a 20 20  op==TK_ALL ){.  
154e0 20 20 72 65 67 4c 69 6d 69 74 41 20 3d 20 2b 2b    regLimitA = ++
154f0 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20  pParse->nMem;.  
15500 20 20 72 65 67 4c 69 6d 69 74 42 20 3d 20 2b 2b    regLimitB = ++
15510 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20  pParse->nMem;.  
15520 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
15530 4f 70 32 28 76 2c 20 4f 50 5f 43 6f 70 79 2c 20  Op2(v, OP_Copy, 
15540 70 2d 3e 69 4f 66 66 73 65 74 20 3f 20 70 2d 3e  p->iOffset ? p->
15550 69 4f 66 66 73 65 74 2b 31 20 3a 20 70 2d 3e 69  iOffset+1 : p->i
15560 4c 69 6d 69 74 2c 0a 20 20 20 20 20 20 20 20 20  Limit,.         
15570 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15580 20 20 20 20 20 20 20 20 20 72 65 67 4c 69 6d 69           regLimi
15590 74 41 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  tA);.    sqlite3
155a0 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
155b0 5f 43 6f 70 79 2c 20 72 65 67 4c 69 6d 69 74 41  _Copy, regLimitA
155c0 2c 20 72 65 67 4c 69 6d 69 74 42 29 3b 0a 20 20  , regLimitB);.  
155d0 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65 67 4c 69  }else{.    regLi
155e0 6d 69 74 41 20 3d 20 72 65 67 4c 69 6d 69 74 42  mitA = regLimitB
155f0 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 73 71 6c 69   = 0;.  }.  sqli
15600 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 70 2d  te3ExprDelete(p-
15610 3e 70 4c 69 6d 69 74 29 3b 0a 20 20 70 2d 3e 70  >pLimit);.  p->p
15620 4c 69 6d 69 74 20 3d 20 30 3b 0a 20 20 73 71 6c  Limit = 0;.  sql
15630 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 70  ite3ExprDelete(p
15640 2d 3e 70 4f 66 66 73 65 74 29 3b 0a 20 20 70 2d  ->pOffset);.  p-
15650 3e 70 4f 66 66 73 65 74 20 3d 20 30 3b 0a 0a 20  >pOffset = 0;.. 
15660 20 72 65 67 41 64 64 72 41 20 3d 20 2b 2b 70 50   regAddrA = ++pP
15670 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 72 65  arse->nMem;.  re
15680 67 45 6f 66 41 20 3d 20 2b 2b 70 50 61 72 73 65  gEofA = ++pParse
15690 2d 3e 6e 4d 65 6d 3b 0a 20 20 72 65 67 41 64 64  ->nMem;.  regAdd
156a0 72 42 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e  rB = ++pParse->n
156b0 4d 65 6d 3b 0a 20 20 72 65 67 45 6f 66 42 20 3d  Mem;.  regEofB =
156c0 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b   ++pParse->nMem;
156d0 0a 20 20 72 65 67 4f 75 74 41 20 3d 20 2b 2b 70  .  regOutA = ++p
156e0 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 72  Parse->nMem;.  r
156f0 65 67 4f 75 74 42 20 3d 20 2b 2b 70 50 61 72 73  egOutB = ++pPars
15700 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 73 71 6c 69 74  e->nMem;.  sqlit
15710 65 33 53 65 6c 65 63 74 44 65 73 74 49 6e 69 74  e3SelectDestInit
15720 28 26 64 65 73 74 41 2c 20 53 52 54 5f 43 6f 72  (&destA, SRT_Cor
15730 6f 75 74 69 6e 65 2c 20 72 65 67 41 64 64 72 41  outine, regAddrA
15740 29 3b 0a 20 20 73 71 6c 69 74 65 33 53 65 6c 65  );.  sqlite3Sele
15750 63 74 44 65 73 74 49 6e 69 74 28 26 64 65 73 74  ctDestInit(&dest
15760 42 2c 20 53 52 54 5f 43 6f 72 6f 75 74 69 6e 65  B, SRT_Coroutine
15770 2c 20 72 65 67 41 64 64 72 42 29 3b 0a 0a 20 20  , regAddrB);..  
15780 2f 2a 20 4a 75 6d 70 20 70 61 73 74 20 74 68 65  /* Jump past the
15790 20 76 61 72 69 6f 75 73 20 73 75 62 72 6f 75 74   various subrout
157a0 69 6e 65 73 20 61 6e 64 20 63 6f 72 6f 75 74 69  ines and corouti
157b0 6e 65 73 20 74 6f 20 74 68 65 20 6d 61 69 6e 0a  nes to the main.
157c0 20 20 2a 2a 20 6d 65 72 67 65 20 6c 6f 6f 70 0a    ** merge loop.
157d0 20 20 2a 2f 0a 20 20 6a 31 20 3d 20 73 71 6c 69    */.  j1 = sqli
157e0 74 65 33 56 64 62 65 41 64 64 4f 70 30 28 76 2c  te3VdbeAddOp0(v,
157f0 20 4f 50 5f 47 6f 74 6f 29 3b 0a 20 20 61 64 64   OP_Goto);.  add
15800 72 53 65 6c 65 63 74 41 20 3d 20 73 71 6c 69 74  rSelectA = sqlit
15810 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64  e3VdbeCurrentAdd
15820 72 28 76 29 3b 0a 0a 0a 20 20 2f 2a 20 47 65 6e  r(v);...  /* Gen
15830 65 72 61 74 65 20 61 20 63 6f 72 6f 75 74 69 6e  erate a coroutin
15840 65 20 74 6f 20 65 76 61 6c 75 61 74 65 20 74 68  e to evaluate th
15850 65 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  e SELECT stateme
15860 6e 74 20 74 6f 20 74 68 65 0a 20 20 2a 2a 20 6c  nt to the.  ** l
15870 65 66 74 20 6f 66 20 74 68 65 20 63 6f 6d 70 6f  eft of the compo
15880 75 6e 64 20 6f 70 65 72 61 74 6f 72 20 2d 20 74  und operator - t
15890 68 65 20 22 41 22 20 73 65 6c 65 63 74 2e 0a 20  he "A" select.. 
158a0 20 2a 2f 0a 20 20 56 64 62 65 4e 6f 6f 70 43 6f   */.  VdbeNoopCo
158b0 6d 6d 65 6e 74 28 28 76 2c 20 22 42 65 67 69 6e  mment((v, "Begin
158c0 20 63 6f 72 6f 75 74 69 6e 65 20 66 6f 72 20 6c   coroutine for l
158d0 65 66 74 20 53 45 4c 45 43 54 22 29 29 3b 0a 20  eft SELECT"));. 
158e0 20 70 50 72 69 6f 72 2d 3e 69 4c 69 6d 69 74 20   pPrior->iLimit 
158f0 3d 20 72 65 67 4c 69 6d 69 74 41 3b 0a 20 20 73  = regLimitA;.  s
15900 71 6c 69 74 65 33 53 65 6c 65 63 74 28 70 50 61  qlite3Select(pPa
15910 72 73 65 2c 20 70 50 72 69 6f 72 2c 20 26 64 65  rse, pPrior, &de
15920 73 74 41 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20  stA, 0, 0, 0);. 
15930 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
15940 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72  p2(v, OP_Integer
15950 2c 20 31 2c 20 72 65 67 45 6f 66 41 29 3b 0a 20  , 1, regEofA);. 
15960 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
15970 70 31 28 76 2c 20 4f 50 5f 59 69 65 6c 64 2c 20  p1(v, OP_Yield, 
15980 72 65 67 41 64 64 72 41 29 3b 0a 20 20 56 64 62  regAddrA);.  Vdb
15990 65 4e 6f 6f 70 43 6f 6d 6d 65 6e 74 28 28 76 2c  eNoopComment((v,
159a0 20 22 45 6e 64 20 63 6f 72 6f 75 74 69 6e 65 20   "End coroutine 
159b0 66 6f 72 20 6c 65 66 74 20 53 45 4c 45 43 54 22  for left SELECT"
159c0 29 29 3b 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61  ));..  /* Genera
159d0 74 65 20 61 20 63 6f 72 6f 75 74 69 6e 65 20 74  te a coroutine t
159e0 6f 20 65 76 61 6c 75 61 74 65 20 74 68 65 20 53  o evaluate the S
159f0 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20  ELECT statement 
15a00 6f 6e 20 0a 20 20 2a 2a 20 74 68 65 20 72 69 67  on .  ** the rig
15a10 68 74 20 2d 20 74 68 65 20 22 42 22 20 73 65 6c  ht - the "B" sel
15a20 65 63 74 0a 20 20 2a 2f 0a 20 20 61 64 64 72 53  ect.  */.  addrS
15a30 65 6c 65 63 74 42 20 3d 20 73 71 6c 69 74 65 33  electB = sqlite3
15a40 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28  VdbeCurrentAddr(
15a50 76 29 3b 0a 20 20 56 64 62 65 4e 6f 6f 70 43 6f  v);.  VdbeNoopCo
15a60 6d 6d 65 6e 74 28 28 76 2c 20 22 42 65 67 69 6e  mment((v, "Begin
15a70 20 63 6f 72 6f 75 74 69 6e 65 20 66 6f 72 20 72   coroutine for r
15a80 69 67 68 74 20 53 45 4c 45 43 54 22 29 29 3b 0a  ight SELECT"));.
15a90 20 20 73 61 76 65 64 4c 69 6d 69 74 20 3d 20 70    savedLimit = p
15aa0 2d 3e 69 4c 69 6d 69 74 3b 0a 20 20 73 61 76 65  ->iLimit;.  save
15ab0 64 4f 66 66 73 65 74 20 3d 20 70 2d 3e 69 4f 66  dOffset = p->iOf
15ac0 66 73 65 74 3b 0a 20 20 70 2d 3e 69 4c 69 6d 69  fset;.  p->iLimi
15ad0 74 20 3d 20 72 65 67 4c 69 6d 69 74 42 3b 0a 20  t = regLimitB;. 
15ae0 20 70 2d 3e 69 4f 66 66 73 65 74 20 3d 20 30 3b   p->iOffset = 0;
15af0 20 20 0a 20 20 73 71 6c 69 74 65 33 53 65 6c 65    .  sqlite3Sele
15b00 63 74 28 70 50 61 72 73 65 2c 20 70 2c 20 26 64  ct(pParse, p, &d
15b10 65 73 74 42 2c 20 30 2c 20 30 2c 20 30 29 3b 0a  estB, 0, 0, 0);.
15b20 20 20 70 2d 3e 69 4c 69 6d 69 74 20 3d 20 73 61    p->iLimit = sa
15b30 76 65 64 4c 69 6d 69 74 3b 0a 20 20 70 2d 3e 69  vedLimit;.  p->i
15b40 4f 66 66 73 65 74 20 3d 20 73 61 76 65 64 4f 66  Offset = savedOf
15b50 66 73 65 74 3b 0a 20 20 73 71 6c 69 74 65 33 56  fset;.  sqlite3V
15b60 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
15b70 49 6e 74 65 67 65 72 2c 20 31 2c 20 72 65 67 45  Integer, 1, regE
15b80 6f 66 42 29 3b 0a 20 20 73 71 6c 69 74 65 33 56  ofB);.  sqlite3V
15b90 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f  dbeAddOp1(v, OP_
15ba0 59 69 65 6c 64 2c 20 72 65 67 41 64 64 72 42 29  Yield, regAddrB)
15bb0 3b 0a 20 20 56 64 62 65 4e 6f 6f 70 43 6f 6d 6d  ;.  VdbeNoopComm
15bc0 65 6e 74 28 28 76 2c 20 22 45 6e 64 20 63 6f 72  ent((v, "End cor
15bd0 6f 75 74 69 6e 65 20 66 6f 72 20 72 69 67 68 74  outine for right
15be0 20 53 45 4c 45 43 54 22 29 29 3b 0a 0a 20 20 2f   SELECT"));..  /
15bf0 2a 20 47 65 6e 65 72 61 74 65 20 61 20 73 75 62  * Generate a sub
15c00 72 6f 75 74 69 6e 65 20 74 68 61 74 20 6f 75 74  routine that out
15c10 70 75 74 73 20 74 68 65 20 63 75 72 72 65 6e 74  puts the current
15c20 20 72 6f 77 20 6f 66 20 74 68 65 20 41 0a 20 20   row of the A.  
15c30 2a 2a 20 73 65 6c 65 63 74 20 61 73 20 74 68 65  ** select as the
15c40 20 6e 65 78 74 20 6f 75 74 70 75 74 20 72 6f 77   next output row
15c50 20 6f 66 20 74 68 65 20 63 6f 6d 70 6f 75 6e 64   of the compound
15c60 20 73 65 6c 65 63 74 2e 0a 20 20 2a 2f 0a 20 20   select..  */.  
15c70 56 64 62 65 4e 6f 6f 70 43 6f 6d 6d 65 6e 74 28  VdbeNoopComment(
15c80 28 76 2c 20 22 4f 75 74 70 75 74 20 72 6f 75 74  (v, "Output rout
15c90 69 6e 65 20 66 6f 72 20 41 22 29 29 3b 0a 20 20  ine for A"));.  
15ca0 61 64 64 72 4f 75 74 41 20 3d 20 67 65 6e 65 72  addrOutA = gener
15cb0 61 74 65 4f 75 74 70 75 74 53 75 62 72 6f 75 74  ateOutputSubrout
15cc0 69 6e 65 28 70 50 61 72 73 65 2c 0a 20 20 20 20  ine(pParse,.    
15cd0 20 20 20 20 20 20 20 20 20 20 20 20 20 70 2c 20               p, 
15ce0 26 64 65 73 74 41 2c 20 70 44 65 73 74 2c 20 72  &destA, pDest, r
15cf0 65 67 4f 75 74 41 2c 0a 20 20 20 20 20 20 20 20  egOutA,.        
15d00 20 20 20 20 20 20 20 20 20 72 65 67 50 72 65 76           regPrev
15d10 2c 20 70 4b 65 79 44 75 70 2c 20 50 34 5f 4b 45  , pKeyDup, P4_KE
15d20 59 49 4e 46 4f 5f 48 41 4e 44 4f 46 46 2c 20 6c  YINFO_HANDOFF, l
15d30 61 62 65 6c 45 6e 64 29 3b 0a 20 20 0a 20 20 2f  abelEnd);.  .  /
15d40 2a 20 47 65 6e 65 72 61 74 65 20 61 20 73 75 62  * Generate a sub
15d50 72 6f 75 74 69 6e 65 20 74 68 61 74 20 6f 75 74  routine that out
15d60 70 75 74 73 20 74 68 65 20 63 75 72 72 65 6e 74  puts the current
15d70 20 72 6f 77 20 6f 66 20 74 68 65 20 42 0a 20 20   row of the B.  
15d80 2a 2a 20 73 65 6c 65 63 74 20 61 73 20 74 68 65  ** select as the
15d90 20 6e 65 78 74 20 6f 75 74 70 75 74 20 72 6f 77   next output row
15da0 20 6f 66 20 74 68 65 20 63 6f 6d 70 6f 75 6e 64   of the compound
15db0 20 73 65 6c 65 63 74 2e 0a 20 20 2a 2f 0a 20 20   select..  */.  
15dc0 69 66 28 20 6f 70 3d 3d 54 4b 5f 41 4c 4c 20 7c  if( op==TK_ALL |
15dd0 7c 20 6f 70 3d 3d 54 4b 5f 55 4e 49 4f 4e 20 29  | op==TK_UNION )
15de0 7b 0a 20 20 20 20 56 64 62 65 4e 6f 6f 70 43 6f  {.    VdbeNoopCo
15df0 6d 6d 65 6e 74 28 28 76 2c 20 22 4f 75 74 70 75  mment((v, "Outpu
15e00 74 20 72 6f 75 74 69 6e 65 20 66 6f 72 20 42 22  t routine for B"
15e10 29 29 3b 0a 20 20 20 20 61 64 64 72 4f 75 74 42  ));.    addrOutB
15e20 20 3d 20 67 65 6e 65 72 61 74 65 4f 75 74 70 75   = generateOutpu
15e30 74 53 75 62 72 6f 75 74 69 6e 65 28 70 50 61 72  tSubroutine(pPar
15e40 73 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  se,.            
15e50 20 20 20 20 20 70 2c 20 26 64 65 73 74 42 2c 20       p, &destB, 
15e60 70 44 65 73 74 2c 20 72 65 67 4f 75 74 42 2c 0a  pDest, regOutB,.
15e70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15e80 20 72 65 67 50 72 65 76 2c 20 70 4b 65 79 44 75   regPrev, pKeyDu
15e90 70 2c 20 50 34 5f 4b 45 59 49 4e 46 4f 5f 53 54  p, P4_KEYINFO_ST
15ea0 41 54 49 43 2c 20 6c 61 62 65 6c 45 6e 64 29 3b  ATIC, labelEnd);
15eb0 0a 20 20 7d 0a 0a 20 20 2f 2a 20 47 65 6e 65 72  .  }..  /* Gener
15ec0 61 74 65 20 61 20 73 75 62 72 6f 75 74 69 6e 65  ate a subroutine
15ed0 20 74 6f 20 72 75 6e 20 77 68 65 6e 20 74 68 65   to run when the
15ee0 20 72 65 73 75 6c 74 73 20 66 72 6f 6d 20 73 65   results from se
15ef0 6c 65 63 74 20 41 0a 20 20 2a 2a 20 61 72 65 20  lect A.  ** are 
15f00 65 78 68 61 75 73 74 65 64 20 61 6e 64 20 6f 6e  exhausted and on
15f10 6c 79 20 64 61 74 61 20 69 6e 20 73 65 6c 65 63  ly data in selec
15f20 74 20 42 20 72 65 6d 61 69 6e 73 2e 0a 20 20 2a  t B remains..  *
15f30 2f 0a 20 20 56 64 62 65 4e 6f 6f 70 43 6f 6d 6d  /.  VdbeNoopComm
15f40 65 6e 74 28 28 76 2c 20 22 65 6f 66 2d 41 20 73  ent((v, "eof-A s
15f50 75 62 72 6f 75 74 69 6e 65 22 29 29 3b 0a 20 20  ubroutine"));.  
15f60 69 66 28 20 6f 70 3d 3d 54 4b 5f 45 58 43 45 50  if( op==TK_EXCEP
15f70 54 20 7c 7c 20 6f 70 3d 3d 54 4b 5f 49 4e 54 45  T || op==TK_INTE
15f80 52 53 45 43 54 20 29 7b 0a 20 20 20 20 61 64 64  RSECT ){.    add
15f90 72 45 6f 66 41 20 3d 20 73 71 6c 69 74 65 33 56  rEofA = sqlite3V
15fa0 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
15fb0 47 6f 74 6f 2c 20 30 2c 20 6c 61 62 65 6c 45 6e  Goto, 0, labelEn
15fc0 64 29 3b 0a 20 20 7d 65 6c 73 65 7b 20 20 0a 20  d);.  }else{  . 
15fd0 20 20 20 61 64 64 72 45 6f 66 41 20 3d 20 73 71     addrEofA = sq
15fe0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
15ff0 76 2c 20 4f 50 5f 49 66 2c 20 72 65 67 45 6f 66  v, OP_If, regEof
16000 42 2c 20 6c 61 62 65 6c 45 6e 64 29 3b 0a 20 20  B, labelEnd);.  
16010 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
16020 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 73 75 62 2c  Op2(v, OP_Gosub,
16030 20 72 65 67 4f 75 74 42 2c 20 61 64 64 72 4f 75   regOutB, addrOu
16040 74 42 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  tB);.    sqlite3
16050 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50  VdbeAddOp1(v, OP
16060 5f 59 69 65 6c 64 2c 20 72 65 67 41 64 64 72 42  _Yield, regAddrB
16070 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
16080 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47  beAddOp2(v, OP_G
16090 6f 74 6f 2c 20 30 2c 20 61 64 64 72 45 6f 66 41  oto, 0, addrEofA
160a0 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 47 65 6e  );.  }..  /* Gen
160b0 65 72 61 74 65 20 61 20 73 75 62 72 6f 75 74 69  erate a subrouti
160c0 6e 65 20 74 6f 20 72 75 6e 20 77 68 65 6e 20 74  ne to run when t
160d0 68 65 20 72 65 73 75 6c 74 73 20 66 72 6f 6d 20  he results from 
160e0 73 65 6c 65 63 74 20 42 0a 20 20 2a 2a 20 61 72  select B.  ** ar
160f0 65 20 65 78 68 61 75 73 74 65 64 20 61 6e 64 20  e exhausted and 
16100 6f 6e 6c 79 20 64 61 74 61 20 69 6e 20 73 65 6c  only data in sel
16110 65 63 74 20 41 20 72 65 6d 61 69 6e 73 2e 0a 20  ect A remains.. 
16120 20 2a 2f 0a 20 20 69 66 28 20 6f 70 3d 3d 54 4b   */.  if( op==TK
16130 5f 49 4e 54 45 52 53 45 43 54 20 29 7b 0a 20 20  _INTERSECT ){.  
16140 20 20 61 64 64 72 45 6f 66 42 20 3d 20 61 64 64    addrEofB = add
16150 72 45 6f 66 41 3b 0a 20 20 7d 65 6c 73 65 7b 20  rEofA;.  }else{ 
16160 20 0a 20 20 20 20 56 64 62 65 4e 6f 6f 70 43 6f   .    VdbeNoopCo
16170 6d 6d 65 6e 74 28 28 76 2c 20 22 65 6f 66 2d 42  mment((v, "eof-B
16180 20 73 75 62 72 6f 75 74 69 6e 65 22 29 29 3b 0a   subroutine"));.
16190 20 20 20 20 61 64 64 72 45 6f 66 42 20 3d 20 73      addrEofB = s
161a0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
161b0 28 76 2c 20 4f 50 5f 49 66 2c 20 72 65 67 45 6f  (v, OP_If, regEo
161c0 66 41 2c 20 6c 61 62 65 6c 45 6e 64 29 3b 0a 20  fA, labelEnd);. 
161d0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
161e0 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 73 75 62  dOp2(v, OP_Gosub
161f0 2c 20 72 65 67 4f 75 74 41 2c 20 61 64 64 72 4f  , regOutA, addrO
16200 75 74 41 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  utA);.    sqlite
16210 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f  3VdbeAddOp1(v, O
16220 50 5f 59 69 65 6c 64 2c 20 72 65 67 41 64 64 72  P_Yield, regAddr
16230 41 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  A);.    sqlite3V
16240 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
16250 47 6f 74 6f 2c 20 30 2c 20 61 64 64 72 45 6f 66  Goto, 0, addrEof
16260 42 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 47 65  B);.  }..  /* Ge
16270 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20 68  nerate code to h
16280 61 6e 64 6c 65 20 74 68 65 20 63 61 73 65 20 6f  andle the case o
16290 66 20 41 3c 42 0a 20 20 2a 2f 0a 20 20 56 64 62  f A<B.  */.  Vdb
162a0 65 4e 6f 6f 70 43 6f 6d 6d 65 6e 74 28 28 76 2c  eNoopComment((v,
162b0 20 22 41 2d 6c 74 2d 42 20 73 75 62 72 6f 75 74   "A-lt-B subrout
162c0 69 6e 65 22 29 29 3b 0a 20 20 61 64 64 72 41 6c  ine"));.  addrAl
162d0 74 42 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  tB = sqlite3Vdbe
162e0 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 73  AddOp2(v, OP_Gos
162f0 75 62 2c 20 72 65 67 4f 75 74 41 2c 20 61 64 64  ub, regOutA, add
16300 72 4f 75 74 41 29 3b 0a 20 20 73 71 6c 69 74 65  rOutA);.  sqlite
16310 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f  3VdbeAddOp1(v, O
16320 50 5f 59 69 65 6c 64 2c 20 72 65 67 41 64 64 72  P_Yield, regAddr
16330 41 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  A);.  sqlite3Vdb
16340 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 66  eAddOp2(v, OP_If
16350 2c 20 72 65 67 45 6f 66 41 2c 20 61 64 64 72 45  , regEofA, addrE
16360 6f 66 41 29 3b 0a 20 20 73 71 6c 69 74 65 33 56  ofA);.  sqlite3V
16370 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
16380 47 6f 74 6f 2c 20 30 2c 20 6c 61 62 65 6c 43 6d  Goto, 0, labelCm
16390 70 72 29 3b 0a 0a 20 20 2f 2a 20 47 65 6e 65 72  pr);..  /* Gener
163a0 61 74 65 20 63 6f 64 65 20 74 6f 20 68 61 6e 64  ate code to hand
163b0 6c 65 20 74 68 65 20 63 61 73 65 20 6f 66 20 41  le the case of A
163c0 3d 3d 42 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6f  ==B.  */.  if( o
163d0 70 3d 3d 54 4b 5f 41 4c 4c 20 29 7b 0a 20 20 20  p==TK_ALL ){.   
163e0 20 61 64 64 72 41 65 71 42 20 3d 20 61 64 64 72   addrAeqB = addr
163f0 41 6c 74 42 3b 0a 20 20 7d 65 6c 73 65 20 69 66  AltB;.  }else if
16400 28 20 6f 70 3d 3d 54 4b 5f 49 4e 54 45 52 53 45  ( op==TK_INTERSE
16410 43 54 20 29 7b 0a 20 20 20 20 61 64 64 72 41 65  CT ){.    addrAe
16420 71 42 20 3d 20 61 64 64 72 41 6c 74 42 3b 0a 20  qB = addrAltB;. 
16430 20 20 20 61 64 64 72 41 6c 74 42 2b 2b 3b 0a 20     addrAltB++;. 
16440 20 7d 65 6c 73 65 7b 0a 20 20 20 20 56 64 62 65   }else{.    Vdbe
16450 4e 6f 6f 70 43 6f 6d 6d 65 6e 74 28 28 76 2c 20  NoopComment((v, 
16460 22 41 2d 65 71 2d 42 20 73 75 62 72 6f 75 74 69  "A-eq-B subrouti
16470 6e 65 22 29 29 3b 0a 20 20 20 20 61 64 64 72 41  ne"));.    addrA
16480 65 71 42 20 3d 0a 20 20 20 20 73 71 6c 69 74 65  eqB =.    sqlite
16490 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f  3VdbeAddOp1(v, O
164a0 50 5f 59 69 65 6c 64 2c 20 72 65 67 41 64 64 72  P_Yield, regAddr
164b0 41 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  A);.    sqlite3V
164c0 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
164d0 49 66 2c 20 72 65 67 45 6f 66 41 2c 20 61 64 64  If, regEofA, add
164e0 72 45 6f 66 41 29 3b 0a 20 20 20 20 73 71 6c 69  rEofA);.    sqli
164f0 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
16500 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 6c 61 62   OP_Goto, 0, lab
16510 65 6c 43 6d 70 72 29 3b 0a 20 20 7d 0a 0a 20 20  elCmpr);.  }..  
16520 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65  /* Generate code
16530 20 74 6f 20 68 61 6e 64 6c 65 20 74 68 65 20 63   to handle the c
16540 61 73 65 20 6f 66 20 41 3e 42 0a 20 20 2a 2f 0a  ase of A>B.  */.
16550 20 20 56 64 62 65 4e 6f 6f 70 43 6f 6d 6d 65 6e    VdbeNoopCommen
16560 74 28 28 76 2c 20 22 41 2d 67 74 2d 42 20 73 75  t((v, "A-gt-B su
16570 62 72 6f 75 74 69 6e 65 22 29 29 3b 0a 20 20 61  broutine"));.  a
16580 64 64 72 41 67 74 42 20 3d 20 73 71 6c 69 74 65  ddrAgtB = sqlite
16590 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72  3VdbeCurrentAddr
165a0 28 76 29 3b 0a 20 20 69 66 28 20 6f 70 3d 3d 54  (v);.  if( op==T
165b0 4b 5f 41 4c 4c 20 7c 7c 20 6f 70 3d 3d 54 4b 5f  K_ALL || op==TK_
165c0 55 4e 49 4f 4e 20 29 7b 0a 20 20 20 20 73 71 6c  UNION ){.    sql
165d0 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
165e0 2c 20 4f 50 5f 47 6f 73 75 62 2c 20 72 65 67 4f  , OP_Gosub, regO
165f0 75 74 42 2c 20 61 64 64 72 4f 75 74 42 29 3b 0a  utB, addrOutB);.
16600 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 56 64 62    }.  sqlite3Vdb
16610 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 59 69  eAddOp1(v, OP_Yi
16620 65 6c 64 2c 20 72 65 67 41 64 64 72 42 29 3b 0a  eld, regAddrB);.
16630 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
16640 4f 70 32 28 76 2c 20 4f 50 5f 49 66 2c 20 72 65  Op2(v, OP_If, re
16650 67 45 6f 66 42 2c 20 61 64 64 72 45 6f 66 42 29  gEofB, addrEofB)
16660 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41  ;.  sqlite3VdbeA
16670 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 74 6f  ddOp2(v, OP_Goto
16680 2c 20 30 2c 20 6c 61 62 65 6c 43 6d 70 72 29 3b  , 0, labelCmpr);
16690 0a 0a 20 20 2f 2a 20 54 68 69 73 20 63 6f 64 65  ..  /* This code
166a0 20 72 75 6e 73 20 6f 6e 63 65 20 74 6f 20 69 6e   runs once to in
166b0 69 74 69 61 6c 69 7a 65 20 65 76 65 72 79 74 68  itialize everyth
166c0 69 6e 67 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69  ing..  */.  sqli
166d0 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28  te3VdbeJumpHere(
166e0 76 2c 20 6a 31 29 3b 0a 20 20 73 71 6c 69 74 65  v, j1);.  sqlite
166f0 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
16700 50 5f 49 6e 74 65 67 65 72 2c 20 30 2c 20 72 65  P_Integer, 0, re
16710 67 45 6f 66 41 29 3b 0a 20 20 73 71 6c 69 74 65  gEofA);.  sqlite
16720 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
16730 50 5f 49 6e 74 65 67 65 72 2c 20 30 2c 20 72 65  P_Integer, 0, re
16740 67 45 6f 66 42 29 3b 0a 20 20 73 71 6c 69 74 65  gEofB);.  sqlite
16750 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
16760 50 5f 47 6f 73 75 62 2c 20 72 65 67 41 64 64 72  P_Gosub, regAddr
16770 41 2c 20 61 64 64 72 53 65 6c 65 63 74 41 29 3b  A, addrSelectA);
16780 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  .  sqlite3VdbeAd
16790 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 73 75 62  dOp2(v, OP_Gosub
167a0 2c 20 72 65 67 41 64 64 72 42 2c 20 61 64 64 72  , regAddrB, addr
167b0 53 65 6c 65 63 74 42 29 3b 0a 20 20 73 71 6c 69  SelectB);.  sqli
167c0 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
167d0 20 4f 50 5f 49 66 2c 20 72 65 67 45 6f 66 41 2c   OP_If, regEofA,
167e0 20 61 64 64 72 45 6f 66 41 29 3b 0a 20 20 73 71   addrEofA);.  sq
167f0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
16800 76 2c 20 4f 50 5f 49 66 2c 20 72 65 67 45 6f 66  v, OP_If, regEof
16810 42 2c 20 61 64 64 72 45 6f 66 42 29 3b 0a 0a 20  B, addrEofB);.. 
16820 20 2f 2a 20 49 6d 70 6c 65 6d 65 6e 74 20 74 68   /* Implement th
16830 65 20 6d 61 69 6e 20 6d 65 72 67 65 20 6c 6f 6f  e main merge loo
16840 70 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  p.  */.  sqlite3
16850 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c  VdbeResolveLabel
16860 28 76 2c 20 6c 61 62 65 6c 43 6d 70 72 29 3b 0a  (v, labelCmpr);.
16870 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
16880 4f 70 34 28 76 2c 20 4f 50 5f 50 65 72 6d 75 74  Op4(v, OP_Permut
16890 61 74 69 6f 6e 2c 20 30 2c 20 30 2c 20 30 2c 20  ation, 0, 0, 0, 
168a0 28 63 68 61 72 2a 29 61 50 65 72 6d 75 74 65 2c  (char*)aPermute,
168b0 20 50 34 5f 49 4e 54 41 52 52 41 59 29 3b 0a 20   P4_INTARRAY);. 
168c0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
168d0 70 34 28 76 2c 20 4f 50 5f 43 6f 6d 70 61 72 65  p4(v, OP_Compare
168e0 2c 20 64 65 73 74 41 2e 69 4d 65 6d 2c 20 64 65  , destA.iMem, de
168f0 73 74 42 2e 69 4d 65 6d 2c 20 6e 4f 72 64 65 72  stB.iMem, nOrder
16900 42 79 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  By,.            
16910 20 20 20 20 20 20 20 20 20 20 20 20 20 28 63 68               (ch
16920 61 72 2a 29 70 4b 65 79 4d 65 72 67 65 2c 20 50  ar*)pKeyMerge, P
16930 34 5f 4b 45 59 49 4e 46 4f 5f 48 41 4e 44 4f 46  4_KEYINFO_HANDOF
16940 46 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  F);.  sqlite3Vdb
16950 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4a 75  eAddOp3(v, OP_Ju
16960 6d 70 2c 20 61 64 64 72 41 6c 74 42 2c 20 61 64  mp, addrAltB, ad
16970 64 72 41 65 71 42 2c 20 61 64 64 72 41 67 74 42  drAeqB, addrAgtB
16980 29 3b 0a 0a 20 20 2f 2a 20 52 65 6c 65 61 73 65  );..  /* Release
16990 20 74 65 6d 70 6f 72 61 72 79 20 72 65 67 69 73   temporary regis
169a0 74 65 72 73 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ters.  */.  if( 
169b0 72 65 67 50 72 65 76 20 29 7b 0a 20 20 20 20 73  regPrev ){.    s
169c0 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d  qlite3ReleaseTem
169d0 70 52 61 6e 67 65 28 70 50 61 72 73 65 2c 20 72  pRange(pParse, r
169e0 65 67 50 72 65 76 2c 20 6e 4f 72 64 65 72 42 79  egPrev, nOrderBy
169f0 2b 31 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4a  +1);.  }..  /* J
16a00 75 6d 70 20 74 6f 20 74 68 65 20 74 68 69 73 20  ump to the this 
16a10 70 6f 69 6e 74 20 69 6e 20 6f 72 64 65 72 20 74  point in order t
16a20 6f 20 74 65 72 6d 69 6e 61 74 65 20 74 68 65 20  o terminate the 
16a30 71 75 65 72 79 2e 0a 20 20 2a 2f 0a 20 20 73 71  query..  */.  sq
16a40 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65  lite3VdbeResolve
16a50 4c 61 62 65 6c 28 76 2c 20 6c 61 62 65 6c 45 6e  Label(v, labelEn
16a60 64 29 3b 0a 0a 20 20 2f 2a 20 53 65 74 20 74 68  d);..  /* Set th
16a70 65 20 6e 75 6d 62 65 72 20 6f 66 20 6f 75 74 70  e number of outp
16a80 75 74 20 63 6f 6c 75 6d 6e 73 0a 20 20 2a 2f 0a  ut columns.  */.
16a90 20 20 69 66 28 20 70 44 65 73 74 2d 3e 65 44 65    if( pDest->eDe
16aa0 73 74 3d 3d 53 52 54 5f 43 61 6c 6c 62 61 63 6b  st==SRT_Callback
16ab0 20 29 7b 0a 20 20 20 20 53 65 6c 65 63 74 20 2a   ){.    Select *
16ac0 70 46 69 72 73 74 20 3d 20 70 50 72 69 6f 72 3b  pFirst = pPrior;
16ad0 0a 20 20 20 20 77 68 69 6c 65 28 20 70 46 69 72  .    while( pFir
16ae0 73 74 2d 3e 70 50 72 69 6f 72 20 29 20 70 46 69  st->pPrior ) pFi
16af0 72 73 74 20 3d 20 70 46 69 72 73 74 2d 3e 70 50  rst = pFirst->pP
16b00 72 69 6f 72 3b 0a 20 20 20 20 67 65 6e 65 72 61  rior;.    genera
16b10 74 65 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 70 50  teColumnNames(pP
16b20 61 72 73 65 2c 20 30 2c 20 70 46 69 72 73 74 2d  arse, 0, pFirst-
16b30 3e 70 45 4c 69 73 74 29 3b 0a 20 20 7d 0a 0a 20  >pEList);.  }.. 
16b40 20 2f 2a 20 52 65 61 73 73 65 6d 62 6c 79 20 74   /* Reassembly t
16b50 68 65 20 63 6f 6d 70 6f 75 6e 64 20 71 75 65 72  he compound quer
16b60 79 20 73 6f 20 74 68 61 74 20 69 74 20 77 69 6c  y so that it wil
16b70 6c 20 62 65 20 66 72 65 65 64 20 63 6f 72 72 65  l be freed corre
16b80 63 74 6c 79 0a 20 20 2a 2a 20 62 79 20 74 68 65  ctly.  ** by the
16b90 20 63 61 6c 6c 69 6e 67 20 66 75 6e 63 74 69 6f   calling functio
16ba0 6e 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 70 50  n */.  if( p->pP
16bb0 72 69 6f 72 20 29 7b 0a 20 20 20 20 73 71 6c 69  rior ){.    sqli
16bc0 74 65 33 53 65 6c 65 63 74 44 65 6c 65 74 65 28  te3SelectDelete(
16bd0 70 2d 3e 70 50 72 69 6f 72 29 3b 0a 20 20 7d 0a  p->pPrior);.  }.
16be0 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d 20 70 50    p->pPrior = pP
16bf0 72 69 6f 72 3b 0a 0a 20 20 2f 2a 2a 2a 20 54 42  rior;..  /*** TB
16c00 44 3a 20 20 49 6e 73 65 72 74 20 73 75 62 72 6f  D:  Insert subro
16c10 75 74 69 6e 65 20 63 61 6c 6c 73 20 74 6f 20 63  utine calls to c
16c20 6c 6f 73 65 20 63 75 72 73 6f 72 73 20 6f 6e 20  lose cursors on 
16c30 69 6e 63 6f 6d 70 6c 65 74 65 0a 20 20 2a 2a 2a  incomplete.  ***
16c40 2a 20 73 75 62 71 75 65 72 69 65 73 20 2a 2a 2a  * subqueries ***
16c50 2a 2f 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  */.  return SQLI
16c60 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23 69 66 20 21 64  TE_OK;.}..#if !d
16c70 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
16c80 49 54 5f 53 55 42 51 55 45 52 59 29 20 7c 7c 20  IT_SUBQUERY) || 
16c90 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
16ca0 4f 4d 49 54 5f 56 49 45 57 29 0a 2f 2a 20 46 6f  OMIT_VIEW)./* Fo
16cb0 72 77 61 72 64 20 44 65 63 6c 61 72 61 74 69 6f  rward Declaratio
16cc0 6e 73 20 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  ns */.static voi
16cd0 64 20 73 75 62 73 74 45 78 70 72 4c 69 73 74 28  d substExprList(
16ce0 73 71 6c 69 74 65 33 2a 2c 20 45 78 70 72 4c 69  sqlite3*, ExprLi
16cf0 73 74 2a 2c 20 69 6e 74 2c 20 45 78 70 72 4c 69  st*, int, ExprLi
16d00 73 74 2a 29 3b 0a 73 74 61 74 69 63 20 76 6f 69  st*);.static voi
16d10 64 20 73 75 62 73 74 53 65 6c 65 63 74 28 73 71  d substSelect(sq
16d20 6c 69 74 65 33 2a 2c 20 53 65 6c 65 63 74 20 2a  lite3*, Select *
16d30 2c 20 69 6e 74 2c 20 45 78 70 72 4c 69 73 74 20  , int, ExprList 
16d40 2a 29 3b 0a 0a 2f 2a 0a 2a 2a 20 53 63 61 6e 20  *);../*.** Scan 
16d50 74 68 72 6f 75 67 68 20 74 68 65 20 65 78 70 72  through the expr
16d60 65 73 73 69 6f 6e 20 70 45 78 70 72 2e 20 20 52  ession pExpr.  R
16d70 65 70 6c 61 63 65 20 65 76 65 72 79 20 72 65 66  eplace every ref
16d80 65 72 65 6e 63 65 20 74 6f 0a 2a 2a 20 61 20 63  erence to.** a c
16d90 6f 6c 75 6d 6e 20 69 6e 20 74 61 62 6c 65 20 6e  olumn in table n
16da0 75 6d 62 65 72 20 69 54 61 62 6c 65 20 77 69 74  umber iTable wit
16db0 68 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20  h a copy of the 
16dc0 69 43 6f 6c 75 6d 6e 2d 74 68 0a 2a 2a 20 65 6e  iColumn-th.** en
16dd0 74 72 79 20 69 6e 20 70 45 4c 69 73 74 2e 20 20  try in pEList.  
16de0 28 42 75 74 20 6c 65 61 76 65 20 72 65 66 65 72  (But leave refer
16df0 65 6e 63 65 73 20 74 6f 20 74 68 65 20 52 4f 57  ences to the ROW
16e00 49 44 20 63 6f 6c 75 6d 6e 20 0a 2a 2a 20 75 6e  ID column .** un
16e10 63 68 61 6e 67 65 64 2e 29 0a 2a 2a 0a 2a 2a 20  changed.).**.** 
16e20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
16e30 70 61 72 74 20 6f 66 20 74 68 65 20 66 6c 61 74  part of the flat
16e40 74 65 6e 69 6e 67 20 70 72 6f 63 65 64 75 72 65  tening procedure
16e50 2e 20 20 41 20 73 75 62 71 75 65 72 79 0a 2a 2a  .  A subquery.**
16e60 20 77 68 6f 73 65 20 72 65 73 75 6c 74 20 73 65   whose result se
16e70 74 20 69 73 20 64 65 66 69 6e 65 64 20 62 79 20  t is defined by 
16e80 70 45 4c 69 73 74 20 61 70 70 65 61 72 73 20 61  pEList appears a
16e90 73 20 65 6e 74 72 79 20 69 6e 20 74 68 65 0a 2a  s entry in the.*
16ea0 2a 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66  * FROM clause of
16eb0 20 61 20 53 45 4c 45 43 54 20 73 75 63 68 20 74   a SELECT such t
16ec0 68 61 74 20 74 68 65 20 56 44 42 45 20 63 75 72  hat the VDBE cur
16ed0 73 6f 72 20 61 73 73 69 67 6e 65 64 20 74 6f 20  sor assigned to 
16ee0 74 68 61 74 0a 2a 2a 20 46 4f 52 4d 20 63 6c 61  that.** FORM cla
16ef0 75 73 65 20 65 6e 74 72 79 20 69 73 20 69 54 61  use entry is iTa
16f00 62 6c 65 2e 20 20 54 68 69 73 20 72 6f 75 74 69  ble.  This routi
16f10 6e 65 20 6d 61 6b 65 20 74 68 65 20 6e 65 63 65  ne make the nece
16f20 73 73 61 72 79 20 0a 2a 2a 20 63 68 61 6e 67 65  ssary .** change
16f30 73 20 74 6f 20 70 45 78 70 72 20 73 6f 20 74 68  s to pExpr so th
16f40 61 74 20 69 74 20 72 65 66 65 72 73 20 64 69 72  at it refers dir
16f50 65 63 74 6c 79 20 74 6f 20 74 68 65 20 73 6f 75  ectly to the sou
16f60 72 63 65 20 74 61 62 6c 65 0a 2a 2a 20 6f 66 20  rce table.** of 
16f70 74 68 65 20 73 75 62 71 75 65 72 79 20 72 61 74  the subquery rat
16f80 68 65 72 20 74 68 65 20 72 65 73 75 6c 74 20 73  her the result s
16f90 65 74 20 6f 66 20 74 68 65 20 73 75 62 71 75 65  et of the subque
16fa0 72 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ry..*/.static vo
16fb0 69 64 20 73 75 62 73 74 45 78 70 72 28 0a 20 20  id substExpr(.  
16fc0 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 20 20 20  sqlite3 *db,    
16fd0 20 20 20 20 2f 2a 20 52 65 70 6f 72 74 20 6d 61      /* Report ma
16fe0 6c 6c 6f 63 20 65 72 72 6f 72 73 20 74 6f 20 74  lloc errors to t
16ff0 68 69 73 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a  his connection *
17000 2f 0a 20 20 45 78 70 72 20 2a 70 45 78 70 72 2c  /.  Expr *pExpr,
17010 20 20 20 20 20 20 20 20 2f 2a 20 45 78 70 72 20          /* Expr 
17020 69 6e 20 77 68 69 63 68 20 73 75 62 73 74 69 74  in which substit
17030 75 74 69 6f 6e 20 6f 63 63 75 72 73 20 2a 2f 0a  ution occurs */.
17040 20 20 69 6e 74 20 69 54 61 62 6c 65 2c 20 20 20    int iTable,   
17050 20 20 20 20 20 20 2f 2a 20 54 61 62 6c 65 20 74        /* Table t
17060 6f 20 62 65 20 73 75 62 73 74 69 74 75 74 65 64  o be substituted
17070 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a   */.  ExprList *
17080 70 45 4c 69 73 74 20 20 20 20 2f 2a 20 53 75 62  pEList    /* Sub
17090 73 74 69 74 75 74 65 20 65 78 70 72 65 73 73 69  stitute expressi
170a0 6f 6e 73 20 2a 2f 0a 29 7b 0a 20 20 69 66 28 20  ons */.){.  if( 
170b0 70 45 78 70 72 3d 3d 30 20 29 20 72 65 74 75 72  pExpr==0 ) retur
170c0 6e 3b 0a 20 20 69 66 28 20 70 45 78 70 72 2d 3e  n;.  if( pExpr->
170d0 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 26 26  op==TK_COLUMN &&
170e0 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 3d 3d   pExpr->iTable==
170f0 69 54 61 62 6c 65 20 29 7b 0a 20 20 20 20 69 66  iTable ){.    if
17100 28 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e  ( pExpr->iColumn
17110 3c 30 20 29 7b 0a 20 20 20 20 20 20 70 45 78 70  <0 ){.      pExp
17120 72 2d 3e 6f 70 20 3d 20 54 4b 5f 4e 55 4c 4c 3b  r->op = TK_NULL;
17130 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
17140 20 20 45 78 70 72 20 2a 70 4e 65 77 3b 0a 20 20    Expr *pNew;.  
17150 20 20 20 20 61 73 73 65 72 74 28 20 70 45 4c 69      assert( pELi
17160 73 74 21 3d 30 20 26 26 20 70 45 78 70 72 2d 3e  st!=0 && pExpr->
17170 69 43 6f 6c 75 6d 6e 3c 70 45 4c 69 73 74 2d 3e  iColumn<pEList->
17180 6e 45 78 70 72 20 29 3b 0a 20 20 20 20 20 20 61  nExpr );.      a
17190 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 70 4c  ssert( pExpr->pL
171a0 65 66 74 3d 3d 30 20 26 26 20 70 45 78 70 72 2d  eft==0 && pExpr-
171b0 3e 70 52 69 67 68 74 3d 3d 30 20 26 26 20 70 45  >pRight==0 && pE
171c0 78 70 72 2d 3e 70 4c 69 73 74 3d 3d 30 20 29 3b  xpr->pList==0 );
171d0 0a 20 20 20 20 20 20 70 4e 65 77 20 3d 20 70 45  .      pNew = pE
171e0 4c 69 73 74 2d 3e 61 5b 70 45 78 70 72 2d 3e 69  List->a[pExpr->i
171f0 43 6f 6c 75 6d 6e 5d 2e 70 45 78 70 72 3b 0a 20  Column].pExpr;. 
17200 20 20 20 20 20 61 73 73 65 72 74 28 20 70 4e 65       assert( pNe
17210 77 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 70 45  w!=0 );.      pE
17220 78 70 72 2d 3e 6f 70 20 3d 20 70 4e 65 77 2d 3e  xpr->op = pNew->
17230 6f 70 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  op;.      assert
17240 28 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 3d 3d  ( pExpr->pLeft==
17250 30 20 29 3b 0a 20 20 20 20 20 20 70 45 78 70 72  0 );.      pExpr
17260 2d 3e 70 4c 65 66 74 20 3d 20 73 71 6c 69 74 65  ->pLeft = sqlite
17270 33 45 78 70 72 44 75 70 28 64 62 2c 20 70 4e 65  3ExprDup(db, pNe
17280 77 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 20 20 20  w->pLeft);.     
17290 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e   assert( pExpr->
172a0 70 52 69 67 68 74 3d 3d 30 20 29 3b 0a 20 20 20  pRight==0 );.   
172b0 20 20 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74     pExpr->pRight
172c0 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44 75   = sqlite3ExprDu
172d0 70 28 64 62 2c 20 70 4e 65 77 2d 3e 70 52 69 67  p(db, pNew->pRig
172e0 68 74 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  ht);.      asser
172f0 74 28 20 70 45 78 70 72 2d 3e 70 4c 69 73 74 3d  t( pExpr->pList=
17300 3d 30 20 29 3b 0a 20 20 20 20 20 20 70 45 78 70  =0 );.      pExp
17310 72 2d 3e 70 4c 69 73 74 20 3d 20 73 71 6c 69 74  r->pList = sqlit
17320 65 33 45 78 70 72 4c 69 73 74 44 75 70 28 64 62  e3ExprListDup(db
17330 2c 20 70 4e 65 77 2d 3e 70 4c 69 73 74 29 3b 0a  , pNew->pList);.
17340 20 20 20 20 20 20 70 45 78 70 72 2d 3e 69 54 61        pExpr->iTa
17350 62 6c 65 20 3d 20 70 4e 65 77 2d 3e 69 54 61 62  ble = pNew->iTab
17360 6c 65 3b 0a 20 20 20 20 20 20 70 45 78 70 72 2d  le;.      pExpr-
17370 3e 70 54 61 62 20 3d 20 70 4e 65 77 2d 3e 70 54  >pTab = pNew->pT
17380 61 62 3b 0a 20 20 20 20 20 20 70 45 78 70 72 2d  ab;.      pExpr-
17390 3e 69 43 6f 6c 75 6d 6e 20 3d 20 70 4e 65 77 2d  >iColumn = pNew-
173a0 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20 20  >iColumn;.      
173b0 70 45 78 70 72 2d 3e 69 41 67 67 20 3d 20 70 4e  pExpr->iAgg = pN
173c0 65 77 2d 3e 69 41 67 67 3b 0a 20 20 20 20 20 20  ew->iAgg;.      
173d0 73 71 6c 69 74 65 33 54 6f 6b 65 6e 43 6f 70 79  sqlite3TokenCopy
173e0 28 64 62 2c 20 26 70 45 78 70 72 2d 3e 74 6f 6b  (db, &pExpr->tok
173f0 65 6e 2c 20 26 70 4e 65 77 2d 3e 74 6f 6b 65 6e  en, &pNew->token
17400 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
17410 54 6f 6b 65 6e 43 6f 70 79 28 64 62 2c 20 26 70  TokenCopy(db, &p
17420 45 78 70 72 2d 3e 73 70 61 6e 2c 20 26 70 4e 65  Expr->span, &pNe
17430 77 2d 3e 73 70 61 6e 29 3b 0a 20 20 20 20 20 20  w->span);.      
17440 70 45 78 70 72 2d 3e 70 53 65 6c 65 63 74 20 3d  pExpr->pSelect =
17450 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 75   sqlite3SelectDu
17460 70 28 64 62 2c 20 70 4e 65 77 2d 3e 70 53 65 6c  p(db, pNew->pSel
17470 65 63 74 29 3b 0a 20 20 20 20 20 20 70 45 78 70  ect);.      pExp
17480 72 2d 3e 66 6c 61 67 73 20 3d 20 70 4e 65 77 2d  r->flags = pNew-
17490 3e 66 6c 61 67 73 3b 0a 20 20 20 20 7d 0a 20 20  >flags;.    }.  
174a0 7d 65 6c 73 65 7b 0a 20 20 20 20 73 75 62 73 74  }else{.    subst
174b0 45 78 70 72 28 64 62 2c 20 70 45 78 70 72 2d 3e  Expr(db, pExpr->
174c0 70 4c 65 66 74 2c 20 69 54 61 62 6c 65 2c 20 70  pLeft, iTable, p
174d0 45 4c 69 73 74 29 3b 0a 20 20 20 20 73 75 62 73  EList);.    subs
174e0 74 45 78 70 72 28 64 62 2c 20 70 45 78 70 72 2d  tExpr(db, pExpr-
174f0 3e 70 52 69 67 68 74 2c 20 69 54 61 62 6c 65 2c  >pRight, iTable,
17500 20 70 45 4c 69 73 74 29 3b 0a 20 20 20 20 73 75   pEList);.    su
17510 62 73 74 53 65 6c 65 63 74 28 64 62 2c 20 70 45  bstSelect(db, pE
17520 78 70 72 2d 3e 70 53 65 6c 65 63 74 2c 20 69 54  xpr->pSelect, iT
17530 61 62 6c 65 2c 20 70 45 4c 69 73 74 29 3b 0a 20  able, pEList);. 
17540 20 20 20 73 75 62 73 74 45 78 70 72 4c 69 73 74     substExprList
17550 28 64 62 2c 20 70 45 78 70 72 2d 3e 70 4c 69 73  (db, pExpr->pLis
17560 74 2c 20 69 54 61 62 6c 65 2c 20 70 45 4c 69 73  t, iTable, pELis
17570 74 29 3b 0a 20 20 7d 0a 7d 0a 73 74 61 74 69 63  t);.  }.}.static
17580 20 76 6f 69 64 20 73 75 62 73 74 45 78 70 72 4c   void substExprL
17590 69 73 74 28 0a 20 20 73 71 6c 69 74 65 33 20 2a  ist(.  sqlite3 *
175a0 64 62 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 52  db,         /* R
175b0 65 70 6f 72 74 20 6d 61 6c 6c 6f 63 20 65 72 72  eport malloc err
175c0 6f 72 73 20 68 65 72 65 20 2a 2f 0a 20 20 45 78  ors here */.  Ex
175d0 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20 20  prList *pList,  
175e0 20 20 20 2f 2a 20 4c 69 73 74 20 74 6f 20 73 63     /* List to sc
175f0 61 6e 20 61 6e 64 20 69 6e 20 77 68 69 63 68 20  an and in which 
17600 74 6f 20 6d 61 6b 65 20 73 75 62 73 74 69 74 75  to make substitu
17610 74 65 73 20 2a 2f 0a 20 20 69 6e 74 20 69 54 61  tes */.  int iTa
17620 62 6c 65 2c 20 20 20 20 20 20 20 20 20 20 2f 2a  ble,          /*
17630 20 54 61 62 6c 65 20 74 6f 20 62 65 20 73 75 62   Table to be sub
17640 73 74 69 74 75 74 65 64 20 2a 2f 0a 20 20 45 78  stituted */.  Ex
17650 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 20 20  prList *pEList  
17660 20 20 20 2f 2a 20 53 75 62 73 74 69 74 75 74 65     /* Substitute
17670 20 76 61 6c 75 65 73 20 2a 2f 0a 29 7b 0a 20 20   values */.){.  
17680 69 6e 74 20 69 3b 0a 20 20 69 66 28 20 70 4c 69  int i;.  if( pLi
17690 73 74 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a  st==0 ) return;.
176a0 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4c 69    for(i=0; i<pLi
176b0 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b  st->nExpr; i++){
176c0 0a 20 20 20 20 73 75 62 73 74 45 78 70 72 28 64  .    substExpr(d
176d0 62 2c 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70  b, pList->a[i].p
176e0 45 78 70 72 2c 20 69 54 61 62 6c 65 2c 20 70 45  Expr, iTable, pE
176f0 4c 69 73 74 29 3b 0a 20 20 7d 0a 7d 0a 73 74 61  List);.  }.}.sta
17700 74 69 63 20 76 6f 69 64 20 73 75 62 73 74 53 65  tic void substSe
17710 6c 65 63 74 28 0a 20 20 73 71 6c 69 74 65 33 20  lect(.  sqlite3 
17720 2a 64 62 2c 20 20 20 20 20 20 20 20 20 2f 2a 20  *db,         /* 
17730 52 65 70 6f 72 74 20 6d 61 6c 6c 6f 63 20 65 72  Report malloc er
17740 72 6f 72 73 20 68 65 72 65 20 2a 2f 0a 20 20 53  rors here */.  S
17750 65 6c 65 63 74 20 2a 70 2c 20 20 20 20 20 20 20  elect *p,       
17760 20 20 20 20 2f 2a 20 53 45 4c 45 43 54 20 73 74      /* SELECT st
17770 61 74 65 6d 65 6e 74 20 69 6e 20 77 68 69 63 68  atement in which
17780 20 74 6f 20 6d 61 6b 65 20 73 75 62 73 74 69 74   to make substit
17790 75 74 69 6f 6e 73 20 2a 2f 0a 20 20 69 6e 74 20  utions */.  int 
177a0 69 54 61 62 6c 65 2c 20 20 20 20 20 20 20 20 20  iTable,         
177b0 20 2f 2a 20 54 61 62 6c 65 20 74 6f 20 62 65 20   /* Table to be 
177c0 72 65 70 6c 61 63 65 64 20 2a 2f 0a 20 20 45 78  replaced */.  Ex
177d0 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 20 20  prList *pEList  
177e0 20 20 20 2f 2a 20 53 75 62 73 74 69 74 75 74 65     /* Substitute
177f0 20 76 61 6c 75 65 73 20 2a 2f 0a 29 7b 0a 20 20   values */.){.  
17800 69 66 28 20 21 70 20 29 20 72 65 74 75 72 6e 3b  if( !p ) return;
17810 0a 20 20 73 75 62 73 74 45 78 70 72 4c 69 73 74  .  substExprList
17820 28 64 62 2c 20 70 2d 3e 70 45 4c 69 73 74 2c 20  (db, p->pEList, 
17830 69 54 61 62 6c 65 2c 20 70 45 4c 69 73 74 29 3b  iTable, pEList);
17840 0a 20 20 73 75 62 73 74 45 78 70 72 4c 69 73 74  .  substExprList
17850 28 64 62 2c 20 70 2d 3e 70 47 72 6f 75 70 42 79  (db, p->pGroupBy
17860 2c 20 69 54 61 62 6c 65 2c 20 70 45 4c 69 73 74  , iTable, pEList
17870 29 3b 0a 20 20 73 75 62 73 74 45 78 70 72 4c 69  );.  substExprLi
17880 73 74 28 64 62 2c 20 70 2d 3e 70 4f 72 64 65 72  st(db, p->pOrder
17890 42 79 2c 20 69 54 61 62 6c 65 2c 20 70 45 4c 69  By, iTable, pELi
178a0 73 74 29 3b 0a 20 20 73 75 62 73 74 45 78 70 72  st);.  substExpr
178b0 28 64 62 2c 20 70 2d 3e 70 48 61 76 69 6e 67 2c  (db, p->pHaving,
178c0 20 69 54 61 62 6c 65 2c 20 70 45 4c 69 73 74 29   iTable, pEList)
178d0 3b 0a 20 20 73 75 62 73 74 45 78 70 72 28 64 62  ;.  substExpr(db
178e0 2c 20 70 2d 3e 70 57 68 65 72 65 2c 20 69 54 61  , p->pWhere, iTa
178f0 62 6c 65 2c 20 70 45 4c 69 73 74 29 3b 0a 20 20  ble, pEList);.  
17900 73 75 62 73 74 53 65 6c 65 63 74 28 64 62 2c 20  substSelect(db, 
17910 70 2d 3e 70 50 72 69 6f 72 2c 20 69 54 61 62 6c  p->pPrior, iTabl
17920 65 2c 20 70 45 4c 69 73 74 29 3b 0a 7d 0a 23 65  e, pEList);.}.#e
17930 6e 64 69 66 20 2f 2a 20 21 64 65 66 69 6e 65 64  ndif /* !defined
17940 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42  (SQLITE_OMIT_SUB
17950 51 55 45 52 59 29 20 7c 7c 20 21 64 65 66 69 6e  QUERY) || !defin
17960 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56  ed(SQLITE_OMIT_V
17970 49 45 57 29 20 2a 2f 0a 0a 23 69 66 20 21 64 65  IEW) */..#if !de
17980 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
17990 54 5f 53 55 42 51 55 45 52 59 29 20 7c 7c 20 21  T_SUBQUERY) || !
179a0 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
179b0 4d 49 54 5f 56 49 45 57 29 0a 2f 2a 0a 2a 2a 20  MIT_VIEW)./*.** 
179c0 54 68 69 73 20 72 6f 75 74 69 6e 65 20 61 74 74  This routine att
179d0 65 6d 70 74 73 20 74 6f 20 66 6c 61 74 74 65 6e  empts to flatten
179e0 20 73 75 62 71 75 65 72 69 65 73 20 69 6e 20 6f   subqueries in o
179f0 72 64 65 72 20 74 6f 20 73 70 65 65 64 0a 2a 2a  rder to speed.**
17a00 20 65 78 65 63 75 74 69 6f 6e 2e 20 20 49 74 20   execution.  It 
17a10 72 65 74 75 72 6e 73 20 31 20 69 66 20 69 74 20  returns 1 if it 
17a20 6d 61 6b 65 73 20 63 68 61 6e 67 65 73 20 61 6e  makes changes an
17a30 64 20 30 20 69 66 20 6e 6f 20 66 6c 61 74 74 65  d 0 if no flatte
17a40 6e 69 6e 67 0a 2a 2a 20 6f 63 63 75 72 73 2e 0a  ning.** occurs..
17a50 2a 2a 0a 2a 2a 20 54 6f 20 75 6e 64 65 72 73 74  **.** To underst
17a60 61 6e 64 20 74 68 65 20 63 6f 6e 63 65 70 74 20  and the concept 
17a70 6f 66 20 66 6c 61 74 74 65 6e 69 6e 67 2c 20 63  of flattening, c
17a80 6f 6e 73 69 64 65 72 20 74 68 65 20 66 6f 6c 6c  onsider the foll
17a90 6f 77 69 6e 67 0a 2a 2a 20 71 75 65 72 79 3a 0a  owing.** query:.
17aa0 2a 2a 0a 2a 2a 20 20 20 20 20 53 45 4c 45 43 54  **.**     SELECT
17ab0 20 61 20 46 52 4f 4d 20 28 53 45 4c 45 43 54 20   a FROM (SELECT 
17ac0 78 2b 79 20 41 53 20 61 20 46 52 4f 4d 20 74 31  x+y AS a FROM t1
17ad0 20 57 48 45 52 45 20 7a 3c 31 30 30 29 20 57 48   WHERE z<100) WH
17ae0 45 52 45 20 61 3e 35 0a 2a 2a 0a 2a 2a 20 54 68  ERE a>5.**.** Th
17af0 65 20 64 65 66 61 75 6c 74 20 77 61 79 20 6f 66  e default way of
17b00 20 69 6d 70 6c 65 6d 65 6e 74 69 6e 67 20 74 68   implementing th
17b10 69 73 20 71 75 65 72 79 20 69 73 20 74 6f 20 65  is query is to e
17b20 78 65 63 75 74 65 20 74 68 65 0a 2a 2a 20 73 75  xecute the.** su
17b30 62 71 75 65 72 79 20 66 69 72 73 74 20 61 6e 64  bquery first and
17b40 20 73 74 6f 72 65 20 74 68 65 20 72 65 73 75 6c   store the resul
17b50 74 73 20 69 6e 20 61 20 74 65 6d 70 6f 72 61 72  ts in a temporar
17b60 79 20 74 61 62 6c 65 2c 20 74 68 65 6e 0a 2a 2a  y table, then.**
17b70 20 72 75 6e 20 74 68 65 20 6f 75 74 65 72 20 71   run the outer q
17b80 75 65 72 79 20 6f 6e 20 74 68 61 74 20 74 65 6d  uery on that tem
17b90 70 6f 72 61 72 79 20 74 61 62 6c 65 2e 20 20 54  porary table.  T
17ba0 68 69 73 20 72 65 71 75 69 72 65 73 20 74 77 6f  his requires two
17bb0 0a 2a 2a 20 70 61 73 73 65 73 20 6f 76 65 72 20  .** passes over 
17bc0 74 68 65 20 64 61 74 61 2e 20 20 46 75 72 74 68  the data.  Furth
17bd0 65 72 6d 6f 72 65 2c 20 62 65 63 61 75 73 65 20  ermore, because 
17be0 74 68 65 20 74 65 6d 70 6f 72 61 72 79 20 74 61  the temporary ta
17bf0 62 6c 65 0a 2a 2a 20 68 61 73 20 6e 6f 20 69 6e  ble.** has no in
17c00 64 69 63 65 73 2c 20 74 68 65 20 57 48 45 52 45  dices, the WHERE
17c10 20 63 6c 61 75 73 65 20 6f 6e 20 74 68 65 20 6f   clause on the o
17c20 75 74 65 72 20 71 75 65 72 79 20 63 61 6e 6e 6f  uter query canno
17c30 74 20 62 65 0a 2a 2a 20 6f 70 74 69 6d 69 7a 65  t be.** optimize
17c40 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  d..**.** This ro
17c50 75 74 69 6e 65 20 61 74 74 65 6d 70 74 73 20 74  utine attempts t
17c60 6f 20 72 65 77 72 69 74 65 20 71 75 65 72 69 65  o rewrite querie
17c70 73 20 73 75 63 68 20 61 73 20 74 68 65 20 61 62  s such as the ab
17c80 6f 76 65 20 69 6e 74 6f 0a 2a 2a 20 61 20 73 69  ove into.** a si
17c90 6e 67 6c 65 20 66 6c 61 74 20 73 65 6c 65 63 74  ngle flat select
17ca0 2c 20 6c 69 6b 65 20 74 68 69 73 3a 0a 2a 2a 0a  , like this:.**.
17cb0 2a 2a 20 20 20 20 20 53 45 4c 45 43 54 20 78 2b  **     SELECT x+
17cc0 79 20 41 53 20 61 20 46 52 4f 4d 20 74 31 20 57  y AS a FROM t1 W
17cd0 48 45 52 45 20 7a 3c 31 30 30 20 41 4e 44 20 61  HERE z<100 AND a
17ce0 3e 35 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 6f 64  >5.**.** The cod
17cf0 65 20 67 65 6e 65 72 61 74 65 64 20 66 6f 72 20  e generated for 
17d00 74 68 69 73 20 73 69 6d 70 69 66 69 63 61 74 69  this simpificati
17d10 6f 6e 20 67 69 76 65 73 20 74 68 65 20 73 61 6d  on gives the sam
17d20 65 20 72 65 73 75 6c 74 0a 2a 2a 20 62 75 74 20  e result.** but 
17d30 6f 6e 6c 79 20 68 61 73 20 74 6f 20 73 63 61 6e  only has to scan
17d40 20 74 68 65 20 64 61 74 61 20 6f 6e 63 65 2e 20   the data once. 
17d50 20 41 6e 64 20 62 65 63 61 75 73 65 20 69 6e 64   And because ind
17d60 69 63 65 73 20 6d 69 67 68 74 20 0a 2a 2a 20 65  ices might .** e
17d70 78 69 73 74 20 6f 6e 20 74 68 65 20 74 61 62 6c  xist on the tabl
17d80 65 20 74 31 2c 20 61 20 63 6f 6d 70 6c 65 74 65  e t1, a complete
17d90 20 73 63 61 6e 20 6f 66 20 74 68 65 20 64 61 74   scan of the dat
17da0 61 20 6d 69 67 68 74 20 62 65 0a 2a 2a 20 61 76  a might be.** av
17db0 6f 69 64 65 64 2e 0a 2a 2a 0a 2a 2a 20 46 6c 61  oided..**.** Fla
17dc0 74 74 65 6e 69 6e 67 20 69 73 20 6f 6e 6c 79 20  ttening is only 
17dd0 61 74 74 65 6d 70 74 65 64 20 69 66 20 61 6c 6c  attempted if all
17de0 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   of the followin
17df0 67 20 61 72 65 20 74 72 75 65 3a 0a 2a 2a 0a 2a  g are true:.**.*
17e00 2a 20 20 20 28 31 29 20 20 54 68 65 20 73 75 62  *   (1)  The sub
17e10 71 75 65 72 79 20 61 6e 64 20 74 68 65 20 6f 75  query and the ou
17e20 74 65 72 20 71 75 65 72 79 20 64 6f 20 6e 6f 74  ter query do not
17e30 20 62 6f 74 68 20 75 73 65 20 61 67 67 72 65 67   both use aggreg
17e40 61 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 20 20 28 32  ates..**.**   (2
17e50 29 20 20 54 68 65 20 73 75 62 71 75 65 72 79 20  )  The subquery 
17e60 69 73 20 6e 6f 74 20 61 6e 20 61 67 67 72 65 67  is not an aggreg
17e70 61 74 65 20 6f 72 20 74 68 65 20 6f 75 74 65 72  ate or the outer
17e80 20 71 75 65 72 79 20 69 73 20 6e 6f 74 20 61 20   query is not a 
17e90 6a 6f 69 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20 28 33  join..**.**   (3
17ea0 29 20 20 54 68 65 20 73 75 62 71 75 65 72 79 20  )  The subquery 
17eb0 69 73 20 6e 6f 74 20 74 68 65 20 72 69 67 68 74  is not the right
17ec0 20 6f 70 65 72 61 6e 64 20 6f 66 20 61 20 6c 65   operand of a le
17ed0 66 74 20 6f 75 74 65 72 20 6a 6f 69 6e 2c 20 6f  ft outer join, o
17ee0 72 0a 2a 2a 20 20 20 20 20 20 20 20 74 68 65 20  r.**        the 
17ef0 73 75 62 71 75 65 72 79 20 69 73 20 6e 6f 74 20  subquery is not 
17f00 69 74 73 65 6c 66 20 61 20 6a 6f 69 6e 2e 20 20  itself a join.  
17f10 28 54 69 63 6b 65 74 20 23 33 30 36 29 0a 2a 2a  (Ticket #306).**
17f20 0a 2a 2a 20 20 20 28 34 29 20 20 54 68 65 20 73  .**   (4)  The s
17f30 75 62 71 75 65 72 79 20 69 73 20 6e 6f 74 20 44  ubquery is not D
17f40 49 53 54 49 4e 43 54 20 6f 72 20 74 68 65 20 6f  ISTINCT or the o
17f50 75 74 65 72 20 71 75 65 72 79 20 69 73 20 6e 6f  uter query is no
17f60 74 20 61 20 6a 6f 69 6e 2e 0a 2a 2a 0a 2a 2a 20  t a join..**.** 
17f70 20 20 28 35 29 20 20 54 68 65 20 73 75 62 71 75    (5)  The subqu
17f80 65 72 79 20 69 73 20 6e 6f 74 20 44 49 53 54 49  ery is not DISTI
17f90 4e 43 54 20 6f 72 20 74 68 65 20 6f 75 74 65 72  NCT or the outer
17fa0 20 71 75 65 72 79 20 64 6f 65 73 20 6e 6f 74 20   query does not 
17fb0 75 73 65 0a 2a 2a 20 20 20 20 20 20 20 20 61 67  use.**        ag
17fc0 67 72 65 67 61 74 65 73 2e 0a 2a 2a 0a 2a 2a 20  gregates..**.** 
17fd0 20 20 28 36 29 20 20 54 68 65 20 73 75 62 71 75    (6)  The subqu
17fe0 65 72 79 20 64 6f 65 73 20 6e 6f 74 20 75 73 65  ery does not use
17ff0 20 61 67 67 72 65 67 61 74 65 73 20 6f 72 20 74   aggregates or t
18000 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 69  he outer query i
18010 73 20 6e 6f 74 0a 2a 2a 20 20 20 20 20 20 20 20  s not.**        
18020 44 49 53 54 49 4e 43 54 2e 0a 2a 2a 0a 2a 2a 20  DISTINCT..**.** 
18030 20 20 28 37 29 20 20 54 68 65 20 73 75 62 71 75    (7)  The subqu
18040 65 72 79 20 68 61 73 20 61 20 46 52 4f 4d 20 63  ery has a FROM c
18050 6c 61 75 73 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 28  lause..**.**   (
18060 38 29 20 20 54 68 65 20 73 75 62 71 75 65 72 79  8)  The subquery
18070 20 64 6f 65 73 20 6e 6f 74 20 75 73 65 20 4c 49   does not use LI
18080 4d 49 54 20 6f 72 20 74 68 65 20 6f 75 74 65 72  MIT or the outer
18090 20 71 75 65 72 79 20 69 73 20 6e 6f 74 20 61 20   query is not a 
180a0 6a 6f 69 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20 28 39  join..**.**   (9
180b0 29 20 20 54 68 65 20 73 75 62 71 75 65 72 79 20  )  The subquery 
180c0 64 6f 65 73 20 6e 6f 74 20 75 73 65 20 4c 49 4d  does not use LIM
180d0 49 54 20 6f 72 20 74 68 65 20 6f 75 74 65 72 20  IT or the outer 
180e0 71 75 65 72 79 20 64 6f 65 73 20 6e 6f 74 20 75  query does not u
180f0 73 65 0a 2a 2a 20 20 20 20 20 20 20 20 61 67 67  se.**        agg
18100 72 65 67 61 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 20  regates..**.**  
18110 28 31 30 29 20 20 54 68 65 20 73 75 62 71 75 65  (10)  The subque
18120 72 79 20 64 6f 65 73 20 6e 6f 74 20 75 73 65 20  ry does not use 
18130 61 67 67 72 65 67 61 74 65 73 20 6f 72 20 74 68  aggregates or th
18140 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 64 6f  e outer query do
18150 65 73 20 6e 6f 74 0a 2a 2a 20 20 20 20 20 20 20  es not.**       
18160 20 75 73 65 20 4c 49 4d 49 54 2e 0a 2a 2a 0a 2a   use LIMIT..**.*
18170 2a 20 20 28 31 31 29 20 20 54 68 65 20 73 75 62  *  (11)  The sub
18180 71 75 65 72 79 20 61 6e 64 20 74 68 65 20 6f 75  query and the ou
18190 74 65 72 20 71 75 65 72 79 20 64 6f 20 6e 6f 74  ter query do not
181a0 20 62 6f 74 68 20 68 61 76 65 20 4f 52 44 45 52   both have ORDER
181b0 20 42 59 20 63 6c 61 75 73 65 73 2e 0a 2a 2a 0a   BY clauses..**.
181c0 2a 2a 20 20 28 31 32 29 20 20 54 68 65 20 73 75  **  (12)  The su
181d0 62 71 75 65 72 79 20 69 73 20 6e 6f 74 20 74 68  bquery is not th
181e0 65 20 72 69 67 68 74 20 74 65 72 6d 20 6f 66 20  e right term of 
181f0 61 20 4c 45 46 54 20 4f 55 54 45 52 20 4a 4f 49  a LEFT OUTER JOI
18200 4e 20 6f 72 20 74 68 65 0a 2a 2a 20 20 20 20 20  N or the.**     
18210 20 20 20 73 75 62 71 75 65 72 79 20 68 61 73 20     subquery has 
18220 6e 6f 20 57 48 45 52 45 20 63 6c 61 75 73 65 2e  no WHERE clause.
18230 20 20 28 61 64 64 65 64 20 62 79 20 74 69 63 6b    (added by tick
18240 65 74 20 23 33 35 30 29 0a 2a 2a 0a 2a 2a 20 20  et #350).**.**  
18250 28 31 33 29 20 20 54 68 65 20 73 75 62 71 75 65  (13)  The subque
18260 72 79 20 61 6e 64 20 6f 75 74 65 72 20 71 75 65  ry and outer que
18270 72 79 20 64 6f 20 6e 6f 74 20 62 6f 74 68 20 75  ry do not both u
18280 73 65 20 4c 49 4d 49 54 0a 2a 2a 0a 2a 2a 20 20  se LIMIT.**.**  
18290 28 31 34 29 20 20 54 68 65 20 73 75 62 71 75 65  (14)  The subque
182a0 72 79 20 64 6f 65 73 20 6e 6f 74 20 75 73 65 20  ry does not use 
182b0 4f 46 46 53 45 54 0a 2a 2a 0a 2a 2a 20 20 28 31  OFFSET.**.**  (1
182c0 35 29 20 20 54 68 65 20 6f 75 74 65 72 20 71 75  5)  The outer qu
182d0 65 72 79 20 69 73 20 6e 6f 74 20 70 61 72 74 20  ery is not part 
182e0 6f 66 20 61 20 63 6f 6d 70 6f 75 6e 64 20 73 65  of a compound se
182f0 6c 65 63 74 20 6f 72 20 74 68 65 0a 2a 2a 20 20  lect or the.**  
18300 20 20 20 20 20 20 73 75 62 71 75 65 72 79 20 64        subquery d
18310 6f 65 73 20 6e 6f 74 20 68 61 76 65 20 62 6f 74  oes not have bot
18320 68 20 61 6e 20 4f 52 44 45 52 20 42 59 20 61 6e  h an ORDER BY an
18330 64 20 61 20 4c 49 4d 49 54 20 63 6c 61 75 73 65  d a LIMIT clause
18340 2e 0a 2a 2a 20 20 20 20 20 20 20 20 28 53 65 65  ..**        (See
18350 20 74 69 63 6b 65 74 20 23 32 33 33 39 29 0a 2a   ticket #2339).*
18360 2a 0a 2a 2a 20 20 28 31 36 29 20 20 54 68 65 20  *.**  (16)  The 
18370 6f 75 74 65 72 20 71 75 65 72 79 20 69 73 20 6e  outer query is n
18380 6f 74 20 61 6e 20 61 67 67 72 65 67 61 74 65 20  ot an aggregate 
18390 6f 72 20 74 68 65 20 73 75 62 71 75 65 72 79 20  or the subquery 
183a0 64 6f 65 73 0a 2a 2a 20 20 20 20 20 20 20 20 6e  does.**        n
183b0 6f 74 20 63 6f 6e 74 61 69 6e 20 4f 52 44 45 52  ot contain ORDER
183c0 20 42 59 2e 20 20 28 54 69 63 6b 65 74 20 23 32   BY.  (Ticket #2
183d0 39 34 32 29 20 20 54 68 69 73 20 75 73 65 64 20  942)  This used 
183e0 74 6f 20 6e 6f 74 20 6d 61 74 74 65 72 0a 2a 2a  to not matter.**
183f0 20 20 20 20 20 20 20 20 75 6e 74 69 6c 20 77 65          until we
18400 20 69 6e 74 72 6f 64 75 63 65 64 20 74 68 65 20   introduced the 
18410 67 72 6f 75 70 5f 63 6f 6e 63 61 74 28 29 20 66  group_concat() f
18420 75 6e 63 74 69 6f 6e 2e 20 20 0a 2a 2a 0a 2a 2a  unction.  .**.**
18430 20 20 28 31 37 29 20 20 54 68 65 20 73 75 62 2d    (17)  The sub-
18440 71 75 65 72 79 20 69 73 20 6e 6f 74 20 61 20 63  query is not a c
18450 6f 6d 70 6f 75 6e 64 20 73 65 6c 65 63 74 2c 20  ompound select, 
18460 6f 72 20 69 74 20 69 73 20 61 20 55 4e 49 4f 4e  or it is a UNION
18470 20 41 4c 4c 20 0a 2a 2a 20 20 20 20 20 20 20 20   ALL .**        
18480 63 6f 6d 70 6f 75 6e 64 20 63 6c 61 75 73 65 20  compound clause 
18490 6d 61 64 65 20 75 70 20 65 6e 74 69 72 65 6c 79  made up entirely
184a0 20 6f 66 20 6e 6f 6e 2d 61 67 67 72 65 67 61 74   of non-aggregat
184b0 65 20 71 75 65 72 69 65 73 2c 20 61 6e 64 20 0a  e queries, and .
184c0 2a 2a 20 20 20 20 20 20 20 20 74 68 65 20 70 61  **        the pa
184d0 72 65 6e 74 20 71 75 65 72 79 3a 0a 2a 2a 0a 2a  rent query:.**.*
184e0 2a 20 20 20 20 20 20 20 20 20 20 2a 20 69 73 20  *          * is 
184f0 6e 6f 74 20 69 74 73 65 6c 66 20 70 61 72 74 20  not itself part 
18500 6f 66 20 61 20 63 6f 6d 70 6f 75 6e 64 20 73 65  of a compound se
18510 6c 65 63 74 2c 0a 2a 2a 20 20 20 20 20 20 20 20  lect,.**        
18520 20 20 2a 20 69 73 20 6e 6f 74 20 61 6e 20 61 67    * is not an ag
18530 67 72 65 67 61 74 65 20 6f 72 20 44 49 53 54 49  gregate or DISTI
18540 4e 43 54 20 71 75 65 72 79 2c 20 61 6e 64 0a 2a  NCT query, and.*
18550 2a 20 20 20 20 20 20 20 20 20 20 2a 20 68 61 73  *          * has
18560 20 6e 6f 20 6f 74 68 65 72 20 74 61 62 6c 65 73   no other tables
18570 20 6f 72 20 73 75 62 2d 73 65 6c 65 63 74 73 20   or sub-selects 
18580 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75  in the FROM clau
18590 73 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20  se..**.**       
185a0 20 54 68 65 20 70 61 72 65 6e 74 20 61 6e 64 20   The parent and 
185b0 73 75 62 2d 71 75 65 72 79 20 6d 61 79 20 63 6f  sub-query may co
185c0 6e 74 61 69 6e 20 57 48 45 52 45 20 63 6c 61 75  ntain WHERE clau
185d0 73 65 73 2e 20 53 75 62 6a 65 63 74 20 74 6f 0a  ses. Subject to.
185e0 2a 2a 20 20 20 20 20 20 20 20 72 75 6c 65 73 20  **        rules 
185f0 28 31 31 29 2c 20 28 31 33 29 20 61 6e 64 20 28  (11), (13) and (
18600 31 34 29 2c 20 74 68 65 79 20 6d 61 79 20 61 6c  14), they may al
18610 73 6f 20 63 6f 6e 74 61 69 6e 20 4f 52 44 45 52  so contain ORDER
18620 20 42 59 2c 0a 2a 2a 20 20 20 20 20 20 20 20 4c   BY,.**        L
18630 49 4d 49 54 20 61 6e 64 20 4f 46 46 53 45 54 20  IMIT and OFFSET 
18640 63 6c 61 75 73 65 73 2e 0a 2a 2a 0a 2a 2a 20 20  clauses..**.**  
18650 28 31 38 29 20 20 49 66 20 74 68 65 20 73 75 62  (18)  If the sub
18660 2d 71 75 65 72 79 20 69 73 20 61 20 63 6f 6d 70  -query is a comp
18670 6f 75 6e 64 20 73 65 6c 65 63 74 2c 20 74 68 65  ound select, the
18680 6e 20 61 6c 6c 20 74 65 72 6d 73 20 6f 66 20 74  n all terms of t
18690 68 65 0a 2a 2a 20 20 20 20 20 20 20 20 4f 52 44  he.**        ORD
186a0 45 52 20 62 79 20 63 6c 61 75 73 65 20 6f 66 20  ER by clause of 
186b0 74 68 65 20 70 61 72 65 6e 74 20 6d 75 73 74 20  the parent must 
186c0 62 65 20 73 69 6d 70 6c 65 20 72 65 66 65 72 65  be simple refere
186d0 6e 63 65 73 20 74 6f 20 0a 2a 2a 20 20 20 20 20  nces to .**     
186e0 20 20 20 63 6f 6c 75 6d 6e 73 20 6f 66 20 74 68     columns of th
186f0 65 20 73 75 62 2d 71 75 65 72 79 2e 0a 2a 2a 0a  e sub-query..**.
18700 2a 2a 20 49 6e 20 74 68 69 73 20 72 6f 75 74 69  ** In this routi
18710 6e 65 2c 20 74 68 65 20 22 70 22 20 70 61 72 61  ne, the "p" para
18720 6d 65 74 65 72 20 69 73 20 61 20 70 6f 69 6e 74  meter is a point
18730 65 72 20 74 6f 20 74 68 65 20 6f 75 74 65 72 20  er to the outer 
18740 71 75 65 72 79 2e 0a 2a 2a 20 54 68 65 20 73 75  query..** The su
18750 62 71 75 65 72 79 20 69 73 20 70 2d 3e 70 53 72  bquery is p->pSr
18760 63 2d 3e 61 5b 69 46 72 6f 6d 5d 2e 20 20 69 73  c->a[iFrom].  is
18770 41 67 67 20 69 73 20 74 72 75 65 20 69 66 20 74  Agg is true if t
18780 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 0a 2a  he outer query.*
18790 2a 20 75 73 65 73 20 61 67 67 72 65 67 61 74 65  * uses aggregate
187a0 73 20 61 6e 64 20 73 75 62 71 75 65 72 79 49 73  s and subqueryIs
187b0 41 67 67 20 69 73 20 74 72 75 65 20 69 66 20 74  Agg is true if t
187c0 68 65 20 73 75 62 71 75 65 72 79 20 75 73 65 73  he subquery uses
187d0 20 61 67 67 72 65 67 61 74 65 73 2e 0a 2a 2a 0a   aggregates..**.
187e0 2a 2a 20 49 66 20 66 6c 61 74 74 65 6e 69 6e 67  ** If flattening
187f0 20 69 73 20 6e 6f 74 20 61 74 74 65 6d 70 74 65   is not attempte
18800 64 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  d, this routine 
18810 69 73 20 61 20 6e 6f 2d 6f 70 20 61 6e 64 20 72  is a no-op and r
18820 65 74 75 72 6e 73 20 30 2e 0a 2a 2a 20 49 66 20  eturns 0..** If 
18830 66 6c 61 74 74 65 6e 69 6e 67 20 69 73 20 61 74  flattening is at
18840 74 65 6d 70 74 65 64 20 74 68 69 73 20 72 6f 75  tempted this rou
18850 74 69 6e 65 20 72 65 74 75 72 6e 73 20 31 2e 0a  tine returns 1..
18860 2a 2a 0a 2a 2a 20 41 6c 6c 20 6f 66 20 74 68 65  **.** All of the
18870 20 65 78 70 72 65 73 73 69 6f 6e 20 61 6e 61 6c   expression anal
18880 79 73 69 73 20 6d 75 73 74 20 6f 63 63 75 72 20  ysis must occur 
18890 6f 6e 20 62 6f 74 68 20 74 68 65 20 6f 75 74 65  on both the oute
188a0 72 20 71 75 65 72 79 20 61 6e 64 0a 2a 2a 20 74  r query and.** t
188b0 68 65 20 73 75 62 71 75 65 72 79 20 62 65 66 6f  he subquery befo
188c0 72 65 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  re this routine 
188d0 72 75 6e 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  runs..*/.static 
188e0 69 6e 74 20 66 6c 61 74 74 65 6e 53 75 62 71 75  int flattenSubqu
188f0 65 72 79 28 0a 20 20 50 61 72 73 65 20 2a 70 50  ery(.  Parse *pP
18900 61 72 73 65 2c 20 20 20 20 20 20 20 2f 2a 20 50  arse,       /* P
18910 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a  arsing context *
18920 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 2c 20 20  /.  Select *p,  
18930 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
18940 70 61 72 65 6e 74 20 6f 72 20 6f 75 74 65 72 20  parent or outer 
18950 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
18960 20 2a 2f 0a 20 20 69 6e 74 20 69 46 72 6f 6d 2c   */.  int iFrom,
18970 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
18980 64 65 78 20 69 6e 20 70 2d 3e 70 53 72 63 2d 3e  dex in p->pSrc->
18990 61 5b 5d 20 6f 66 20 74 68 65 20 69 6e 6e 65 72  a[] of the inner
189a0 20 73 75 62 71 75 65 72 79 20 2a 2f 0a 20 20 69   subquery */.  i
189b0 6e 74 20 69 73 41 67 67 2c 20 20 20 20 20 20 20  nt isAgg,       
189c0 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 6f      /* True if o
189d0 75 74 65 72 20 53 45 4c 45 43 54 20 75 73 65 73  uter SELECT uses
189e0 20 61 67 67 72 65 67 61 74 65 20 66 75 6e 63 74   aggregate funct
189f0 69 6f 6e 73 20 2a 2f 0a 20 20 69 6e 74 20 73 75  ions */.  int su
18a00 62 71 75 65 72 79 49 73 41 67 67 20 20 20 20 2f  bqueryIsAgg    /
18a10 2a 20 54 72 75 65 20 69 66 20 74 68 65 20 73 75  * True if the su
18a20 62 71 75 65 72 79 20 75 73 65 73 20 61 67 67 72  bquery uses aggr
18a30 65 67 61 74 65 20 66 75 6e 63 74 69 6f 6e 73 20  egate functions 
18a40 2a 2f 0a 29 7b 0a 20 20 63 6f 6e 73 74 20 63 68  */.){.  const ch
18a50 61 72 20 2a 7a 53 61 76 65 64 41 75 74 68 43 6f  ar *zSavedAuthCo
18a60 6e 74 65 78 74 20 3d 20 70 50 61 72 73 65 2d 3e  ntext = pParse->
18a70 7a 41 75 74 68 43 6f 6e 74 65 78 74 3b 0a 20 20  zAuthContext;.  
18a80 53 65 6c 65 63 74 20 2a 70 50 61 72 65 6e 74 3b  Select *pParent;
18a90 0a 20 20 53 65 6c 65 63 74 20 2a 70 53 75 62 3b  .  Select *pSub;
18aa0 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 69 6e         /* The in
18ab0 6e 65 72 20 71 75 65 72 79 20 6f 72 20 22 73 75  ner query or "su
18ac0 62 71 75 65 72 79 22 20 2a 2f 0a 20 20 53 65 6c  bquery" */.  Sel
18ad0 65 63 74 20 2a 70 53 75 62 31 3b 20 20 20 20 20  ect *pSub1;     
18ae0 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 74   /* Pointer to t
18af0 68 65 20 72 69 67 68 74 6d 6f 73 74 20 73 65 6c  he rightmost sel
18b00 65 63 74 20 69 6e 20 73 75 62 2d 71 75 65 72 79  ect in sub-query
18b10 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a 70   */.  SrcList *p
18b20 53 72 63 3b 20 20 20 20 20 20 2f 2a 20 54 68 65  Src;      /* The
18b30 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20   FROM clause of 
18b40 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20  the outer query 
18b50 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 53  */.  SrcList *pS
18b60 75 62 53 72 63 3b 20 20 20 2f 2a 20 54 68 65 20  ubSrc;   /* The 
18b70 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20 74  FROM clause of t
18b80 68 65 20 73 75 62 71 75 65 72 79 20 2a 2f 0a 20  he subquery */. 
18b90 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74   ExprList *pList
18ba0 3b 20 20 20 20 2f 2a 20 54 68 65 20 72 65 73 75  ;    /* The resu
18bb0 6c 74 20 73 65 74 20 6f 66 20 74 68 65 20 6f 75  lt set of the ou
18bc0 74 65 72 20 71 75 65 72 79 20 2a 2f 0a 20 20 69  ter query */.  i
18bd0 6e 74 20 69 50 61 72 65 6e 74 3b 20 20 20 20 20  nt iParent;     
18be0 20 20 20 2f 2a 20 56 44 42 45 20 63 75 72 73 6f     /* VDBE curso
18bf0 72 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20  r number of the 
18c00 70 53 75 62 20 72 65 73 75 6c 74 20 73 65 74 20  pSub result set 
18c10 74 65 6d 70 20 74 61 62 6c 65 20 2a 2f 0a 20 20  temp table */.  
18c20 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20 20  int i;          
18c30 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e      /* Loop coun
18c40 74 65 72 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70  ter */.  Expr *p
18c50 57 68 65 72 65 3b 20 20 20 20 20 20 20 20 20 20  Where;          
18c60 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
18c70 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 2a 2f   WHERE clause */
18c80 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73  .  struct SrcLis
18c90 74 5f 69 74 65 6d 20 2a 70 53 75 62 69 74 65 6d  t_item *pSubitem
18ca0 3b 20 20 20 2f 2a 20 54 68 65 20 73 75 62 71 75  ;   /* The subqu
18cb0 65 72 79 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ery */.  sqlite3
18cc0 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64   *db = pParse->d
18cd0 62 3b 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 74  b;..  /* Check t
18ce0 6f 20 73 65 65 20 69 66 20 66 6c 61 74 74 65 6e  o see if flatten
18cf0 69 6e 67 20 69 73 20 70 65 72 6d 69 74 74 65 64  ing is permitted
18d00 2e 20 20 52 65 74 75 72 6e 20 30 20 69 66 20 6e  .  Return 0 if n
18d10 6f 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  ot..  */.  if( p
18d20 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  ==0 ) return 0;.
18d30 20 20 70 53 72 63 20 3d 20 70 2d 3e 70 53 72 63    pSrc = p->pSrc
18d40 3b 0a 20 20 61 73 73 65 72 74 28 20 70 53 72 63  ;.  assert( pSrc
18d50 20 26 26 20 69 46 72 6f 6d 3e 3d 30 20 26 26 20   && iFrom>=0 && 
18d60 69 46 72 6f 6d 3c 70 53 72 63 2d 3e 6e 53 72 63  iFrom<pSrc->nSrc
18d70 20 29 3b 0a 20 20 70 53 75 62 69 74 65 6d 20 3d   );.  pSubitem =
18d80 20 26 70 53 72 63 2d 3e 61 5b 69 46 72 6f 6d 5d   &pSrc->a[iFrom]
18d90 3b 0a 20 20 69 50 61 72 65 6e 74 20 3d 20 70 53  ;.  iParent = pS
18da0 75 62 69 74 65 6d 2d 3e 69 43 75 72 73 6f 72 3b  ubitem->iCursor;
18db0 0a 20 20 70 53 75 62 20 3d 20 70 53 75 62 69 74  .  pSub = pSubit
18dc0 65 6d 2d 3e 70 53 65 6c 65 63 74 3b 0a 20 20 61  em->pSelect;.  a
18dd0 73 73 65 72 74 28 20 70 53 75 62 21 3d 30 20 29  ssert( pSub!=0 )
18de0 3b 0a 20 20 69 66 28 20 69 73 41 67 67 20 26 26  ;.  if( isAgg &&
18df0 20 73 75 62 71 75 65 72 79 49 73 41 67 67 20 29   subqueryIsAgg )
18e00 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20   return 0;      
18e10 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
18e20 73 74 72 69 63 74 69 6f 6e 20 28 31 29 20 20 2a  striction (1)  *
18e30 2f 0a 20 20 69 66 28 20 73 75 62 71 75 65 72 79  /.  if( subquery
18e40 49 73 41 67 67 20 26 26 20 70 53 72 63 2d 3e 6e  IsAgg && pSrc->n
18e50 53 72 63 3e 31 20 29 20 72 65 74 75 72 6e 20 30  Src>1 ) return 0
18e60 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65  ;          /* Re
18e70 73 74 72 69 63 74 69 6f 6e 20 28 32 29 20 20 2a  striction (2)  *
18e80 2f 0a 20 20 70 53 75 62 53 72 63 20 3d 20 70 53  /.  pSubSrc = pS
18e90 75 62 2d 3e 70 53 72 63 3b 0a 20 20 61 73 73 65  ub->pSrc;.  asse
18ea0 72 74 28 20 70 53 75 62 53 72 63 20 29 3b 0a 20  rt( pSubSrc );. 
18eb0 20 2f 2a 20 50 72 69 6f 72 20 74 6f 20 76 65 72   /* Prior to ver
18ec0 73 69 6f 6e 20 33 2e 31 2e 32 2c 20 77 68 65 6e  sion 3.1.2, when
18ed0 20 4c 49 4d 49 54 20 61 6e 64 20 4f 46 46 53 45   LIMIT and OFFSE
18ee0 54 20 68 61 64 20 74 6f 20 62 65 20 73 69 6d 70  T had to be simp
18ef0 6c 65 20 63 6f 6e 73 74 61 6e 74 73 2c 0a 20 20  le constants,.  
18f00 2a 2a 20 6e 6f 74 20 61 72 62 69 74 72 61 72 79  ** not arbitrary
18f10 20 65 78 70 72 65 73 73 73 69 6f 6e 73 2c 20 77   expresssions, w
18f20 65 20 61 6c 6c 6f 77 65 64 20 73 6f 6d 65 20 63  e allowed some c
18f30 6f 6d 62 69 6e 69 6e 67 20 6f 66 20 4c 49 4d 49  ombining of LIMI
18f40 54 20 61 6e 64 20 4f 46 46 53 45 54 0a 20 20 2a  T and OFFSET.  *
18f50 2a 20 62 65 63 61 75 73 65 20 74 68 65 79 20 63  * because they c
18f60 6f 75 6c 64 20 62 65 20 63 6f 6d 70 75 74 65 64  ould be computed
18f70 20 61 74 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65   at compile-time
18f80 2e 20 20 42 75 74 20 77 68 65 6e 20 4c 49 4d 49  .  But when LIMI
18f90 54 20 61 6e 64 20 4f 46 46 53 45 54 0a 20 20 2a  T and OFFSET.  *
18fa0 2a 20 62 65 63 61 6d 65 20 61 72 62 69 74 72 61  * became arbitra
18fb0 72 79 20 65 78 70 72 65 73 73 69 6f 6e 73 2c 20  ry expressions, 
18fc0 77 65 20 77 65 72 65 20 66 6f 72 63 65 64 20 74  we were forced t
18fd0 6f 20 61 64 64 20 72 65 73 74 72 69 63 74 69 6f  o add restrictio
18fe0 6e 73 20 28 31 33 29 0a 20 20 2a 2a 20 61 6e 64  ns (13).  ** and
18ff0 20 28 31 34 29 2e 20 2a 2f 0a 20 20 69 66 28 20   (14). */.  if( 
19000 70 53 75 62 2d 3e 70 4c 69 6d 69 74 20 26 26 20  pSub->pLimit && 
19010 70 2d 3e 70 4c 69 6d 69 74 20 29 20 72 65 74 75  p->pLimit ) retu
19020 72 6e 20 30 3b 20 20 20 20 20 20 20 20 20 20 20  rn 0;           
19030 20 20 20 2f 2a 20 52 65 73 74 72 69 63 74 69 6f     /* Restrictio
19040 6e 20 28 31 33 29 20 2a 2f 0a 20 20 69 66 28 20  n (13) */.  if( 
19050 70 53 75 62 2d 3e 70 4f 66 66 73 65 74 20 29 20  pSub->pOffset ) 
19060 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20  return 0;       
19070 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19080 20 20 20 2f 2a 20 52 65 73 74 72 69 63 74 69 6f     /* Restrictio
19090 6e 20 28 31 34 29 20 2a 2f 0a 20 20 69 66 28 20  n (14) */.  if( 
190a0 70 2d 3e 70 52 69 67 68 74 6d 6f 73 74 20 26 26  p->pRightmost &&
190b0 20 70 53 75 62 2d 3e 70 4c 69 6d 69 74 20 26 26   pSub->pLimit &&
190c0 20 70 53 75 62 2d 3e 70 4f 72 64 65 72 42 79 20   pSub->pOrderBy 
190d0 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b  ){.    return 0;
190e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
190f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19100 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
19110 65 73 74 72 69 63 74 69 6f 6e 20 28 31 35 29 20  estriction (15) 
19120 2a 2f 0a 20 20 7d 0a 20 20 69 66 28 20 70 53 75  */.  }.  if( pSu
19130 62 53 72 63 2d 3e 6e 53 72 63 3d 3d 30 20 29 20  bSrc->nSrc==0 ) 
19140 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20  return 0;       
19150 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19160 2f 2a 20 52 65 73 74 72 69 63 74 69 6f 6e 20 28  /* Restriction (
19170 37 29 20 20 2a 2f 0a 20 20 69 66 28 20 28 70 53  7)  */.  if( (pS
19180 75 62 2d 3e 69 73 44 69 73 74 69 6e 63 74 20 7c  ub->isDistinct |
19190 7c 20 70 53 75 62 2d 3e 70 4c 69 6d 69 74 29 20  | pSub->pLimit) 
191a0 0a 20 20 20 20 20 20 20 20 20 26 26 20 28 70 53  .         && (pS
191b0 72 63 2d 3e 6e 53 72 63 3e 31 20 7c 7c 20 69 73  rc->nSrc>1 || is
191c0 41 67 67 29 20 29 7b 20 20 20 20 20 20 20 20 20  Agg) ){         
191d0 20 2f 2a 20 52 65 73 74 72 69 63 74 69 6f 6e 73   /* Restrictions
191e0 20 28 34 29 28 35 29 28 38 29 28 39 29 20 2a 2f   (4)(5)(8)(9) */
191f0 0a 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 20  .     return 0; 
19200 20 20 20 20 20 20 0a 20 20 7d 0a 20 20 69 66 28        .  }.  if(
19210 20 70 2d 3e 69 73 44 69 73 74 69 6e 63 74 20 26   p->isDistinct &
19220 26 20 73 75 62 71 75 65 72 79 49 73 41 67 67 20  & subqueryIsAgg 
19230 29 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20  ) return 0;     
19240 20 20 20 20 2f 2a 20 52 65 73 74 72 69 63 74 69      /* Restricti
19250 6f 6e 20 28 36 29 20 20 2a 2f 0a 20 20 69 66 28  on (6)  */.  if(
19260 20 28 70 2d 3e 64 69 73 61 6c 6c 6f 77 4f 72 64   (p->disallowOrd
19270 65 72 42 79 20 7c 7c 20 70 2d 3e 70 4f 72 64 65  erBy || p->pOrde
19280 72 42 79 29 20 26 26 20 70 53 75 62 2d 3e 70 4f  rBy) && pSub->pO
19290 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20 20 72  rderBy ){.     r
192a0 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20 20  eturn 0;        
192b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
192c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
192d0 20 20 20 2f 2a 20 52 65 73 74 72 69 63 74 69 6f     /* Restrictio
192e0 6e 20 28 31 31 29 20 2a 2f 0a 20 20 7d 0a 20 20  n (11) */.  }.  
192f0 69 66 28 20 69 73 41 67 67 20 26 26 20 70 53 75  if( isAgg && pSu
19300 62 2d 3e 70 4f 72 64 65 72 42 79 20 29 20 72 65  b->pOrderBy ) re
19310 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20 20 20  turn 0;         
19320 20 20 20 20 20 20 20 2f 2a 20 52 65 73 74 72 69         /* Restri
19330 63 74 69 6f 6e 20 28 31 36 29 20 2a 2f 0a 0a 20  ction (16) */.. 
19340 20 2f 2a 20 52 65 73 74 72 69 63 74 69 6f 6e 20   /* Restriction 
19350 33 3a 20 20 49 66 20 74 68 65 20 73 75 62 71 75  3:  If the subqu
19360 65 72 79 20 69 73 20 61 20 6a 6f 69 6e 2c 20 6d  ery is a join, m
19370 61 6b 65 20 73 75 72 65 20 74 68 65 20 73 75 62  ake sure the sub
19380 71 75 65 72 79 20 69 73 20 0a 20 20 2a 2a 20 6e  query is .  ** n
19390 6f 74 20 75 73 65 64 20 61 73 20 74 68 65 20 72  ot used as the r
193a0 69 67 68 74 20 6f 70 65 72 61 6e 64 20 6f 66 20  ight operand of 
193b0 61 6e 20 6f 75 74 65 72 20 6a 6f 69 6e 2e 20 20  an outer join.  
193c0 45 78 61 6d 70 6c 65 73 20 6f 66 20 77 68 79 20  Examples of why 
193d0 74 68 69 73 0a 20 20 2a 2a 20 69 73 20 6e 6f 74  this.  ** is not
193e0 20 61 6c 6c 6f 77 65 64 3a 0a 20 20 2a 2a 0a 20   allowed:.  **. 
193f0 20 2a 2a 20 20 20 20 20 20 20 20 20 74 31 20 4c   **         t1 L
19400 45 46 54 20 4f 55 54 45 52 20 4a 4f 49 4e 20 28  EFT OUTER JOIN (
19410 74 32 20 4a 4f 49 4e 20 74 33 29 0a 20 20 2a 2a  t2 JOIN t3).  **
19420 0a 20 20 2a 2a 20 49 66 20 77 65 20 66 6c 61 74  .  ** If we flat
19430 74 65 6e 20 74 68 65 20 61 62 6f 76 65 2c 20 77  ten the above, w
19440 65 20 77 6f 75 6c 64 20 67 65 74 0a 20 20 2a 2a  e would get.  **
19450 0a 20 20 2a 2a 20 20 20 20 20 20 20 20 20 28 74  .  **         (t
19460 31 20 4c 45 46 54 20 4f 55 54 45 52 20 4a 4f 49  1 LEFT OUTER JOI
19470 4e 20 74 32 29 20 4a 4f 49 4e 20 74 33 0a 20 20  N t2) JOIN t3.  
19480 2a 2a 0a 20 20 2a 2a 20 77 68 69 63 68 20 69 73  **.  ** which is
19490 20 6e 6f 74 20 61 74 20 61 6c 6c 20 74 68 65 20   not at all the 
194a0 73 61 6d 65 20 74 68 69 6e 67 2e 0a 20 20 2a 2f  same thing..  */
194b0 0a 20 20 69 66 28 20 70 53 75 62 53 72 63 2d 3e  .  if( pSubSrc->
194c0 6e 53 72 63 3e 31 20 26 26 20 28 70 53 75 62 69  nSrc>1 && (pSubi
194d0 74 65 6d 2d 3e 6a 6f 69 6e 74 79 70 65 20 26 20  tem->jointype & 
194e0 4a 54 5f 4f 55 54 45 52 29 21 3d 30 20 29 7b 0a  JT_OUTER)!=0 ){.
194f0 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
19500 7d 0a 0a 20 20 2f 2a 20 52 65 73 74 72 69 63 74  }..  /* Restrict
19510 69 6f 6e 20 31 32 3a 20 20 49 66 20 74 68 65 20  ion 12:  If the 
19520 73 75 62 71 75 65 72 79 20 69 73 20 74 68 65 20  subquery is the 
19530 72 69 67 68 74 20 6f 70 65 72 61 6e 64 20 6f 66  right operand of
19540 20 61 20 6c 65 66 74 20 6f 75 74 65 72 0a 20 20   a left outer.  
19550 2a 2a 20 6a 6f 69 6e 2c 20 6d 61 6b 65 20 73 75  ** join, make su
19560 72 65 20 74 68 65 20 73 75 62 71 75 65 72 79 20  re the subquery 
19570 68 61 73 20 6e 6f 20 57 48 45 52 45 20 63 6c 61  has no WHERE cla
19580 75 73 65 2e 0a 20 20 2a 2a 20 41 6e 20 65 78 61  use..  ** An exa
19590 6d 70 6c 65 73 20 6f 66 20 77 68 79 20 74 68 69  mples of why thi
195a0 73 20 69 73 20 6e 6f 74 20 61 6c 6c 6f 77 65 64  s is not allowed
195b0 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20  :.  **.  **     
195c0 20 20 20 20 74 31 20 4c 45 46 54 20 4f 55 54 45      t1 LEFT OUTE
195d0 52 20 4a 4f 49 4e 20 28 53 45 4c 45 43 54 20 2a  R JOIN (SELECT *
195e0 20 46 52 4f 4d 20 74 32 20 57 48 45 52 45 20 74   FROM t2 WHERE t
195f0 32 2e 78 3e 30 29 0a 20 20 2a 2a 0a 20 20 2a 2a  2.x>0).  **.  **
19600 20 49 66 20 77 65 20 66 6c 61 74 74 65 6e 20 74   If we flatten t
19610 68 65 20 61 62 6f 76 65 2c 20 77 65 20 77 6f 75  he above, we wou
19620 6c 64 20 67 65 74 0a 20 20 2a 2a 0a 20 20 2a 2a  ld get.  **.  **
19630 20 20 20 20 20 20 20 20 20 28 74 31 20 4c 45 46           (t1 LEF
19640 54 20 4f 55 54 45 52 20 4a 4f 49 4e 20 74 32 29  T OUTER JOIN t2)
19650 20 57 48 45 52 45 20 74 32 2e 78 3e 30 0a 20 20   WHERE t2.x>0.  
19660 2a 2a 0a 20 20 2a 2a 20 42 75 74 20 74 68 65 20  **.  ** But the 
19670 74 32 2e 78 3e 30 20 74 65 73 74 20 77 69 6c 6c  t2.x>0 test will
19680 20 61 6c 77 61 79 73 20 66 61 69 6c 20 6f 6e 20   always fail on 
19690 61 20 4e 55 4c 4c 20 72 6f 77 20 6f 66 20 74 32  a NULL row of t2
196a0 2c 20 77 68 69 63 68 0a 20 20 2a 2a 20 65 66 66  , which.  ** eff
196b0 65 63 74 69 76 65 6c 79 20 63 6f 6e 76 65 72 74  ectively convert
196c0 73 20 74 68 65 20 4f 55 54 45 52 20 4a 4f 49 4e  s the OUTER JOIN
196d0 20 69 6e 74 6f 20 61 6e 20 49 4e 4e 45 52 20 4a   into an INNER J
196e0 4f 49 4e 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  OIN..  */.  if( 
196f0 28 70 53 75 62 69 74 65 6d 2d 3e 6a 6f 69 6e 74  (pSubitem->joint
19700 79 70 65 20 26 20 4a 54 5f 4f 55 54 45 52 29 21  ype & JT_OUTER)!
19710 3d 30 20 26 26 20 70 53 75 62 2d 3e 70 57 68 65  =0 && pSub->pWhe
19720 72 65 21 3d 30 20 29 7b 0a 20 20 20 20 72 65 74  re!=0 ){.    ret
19730 75 72 6e 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  urn 0;.  }..  /*
19740 20 52 65 73 74 72 69 63 74 69 6f 6e 20 31 37 3a   Restriction 17:
19750 20 49 66 20 74 68 65 20 73 75 62 2d 71 75 65 72   If the sub-quer
19760 79 20 69 73 20 61 20 63 6f 6d 70 6f 75 6e 64 20  y is a compound 
19770 53 45 4c 45 43 54 2c 20 74 68 65 6e 20 69 74 20  SELECT, then it 
19780 6d 75 73 74 0a 20 20 2a 2a 20 75 73 65 20 6f 6e  must.  ** use on
19790 6c 79 20 74 68 65 20 55 4e 49 4f 4e 20 41 4c 4c  ly the UNION ALL
197a0 20 6f 70 65 72 61 74 6f 72 2e 20 41 6e 64 20 6e   operator. And n
197b0 6f 6e 65 20 6f 66 20 74 68 65 20 73 69 6d 70 6c  one of the simpl
197c0 65 20 73 65 6c 65 63 74 20 71 75 65 72 69 65 73  e select queries
197d0 0a 20 20 2a 2a 20 74 68 61 74 20 6d 61 6b 65 20  .  ** that make 
197e0 75 70 20 74 68 65 20 63 6f 6d 70 6f 75 6e 64 20  up the compound 
197f0 53 45 4c 45 43 54 20 61 72 65 20 61 6c 6c 6f 77  SELECT are allow
19800 65 64 20 74 6f 20 62 65 20 61 67 67 72 65 67 61  ed to be aggrega
19810 74 65 20 6f 72 20 64 69 73 74 69 6e 63 74 0a 20  te or distinct. 
19820 20 2a 2a 20 71 75 65 72 69 65 73 2e 0a 20 20 2a   ** queries..  *
19830 2f 0a 20 20 69 66 28 20 70 53 75 62 2d 3e 70 50  /.  if( pSub->pP
19840 72 69 6f 72 20 29 7b 0a 20 20 20 20 69 66 28 20  rior ){.    if( 
19850 70 2d 3e 70 50 72 69 6f 72 20 7c 7c 20 69 73 41  p->pPrior || isA
19860 67 67 20 7c 7c 20 70 2d 3e 69 73 44 69 73 74 69  gg || p->isDisti
19870 6e 63 74 20 7c 7c 20 70 53 72 63 2d 3e 6e 53 72  nct || pSrc->nSr
19880 63 21 3d 31 20 29 7b 0a 20 20 20 20 20 20 72 65  c!=1 ){.      re
19890 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 20 20  turn 0;.    }.  
198a0 20 20 66 6f 72 28 70 53 75 62 31 3d 70 53 75 62    for(pSub1=pSub
198b0 3b 20 70 53 75 62 31 3b 20 70 53 75 62 31 3d 70  ; pSub1; pSub1=p
198c0 53 75 62 31 2d 3e 70 50 72 69 6f 72 29 7b 0a 20  Sub1->pPrior){. 
198d0 20 20 20 20 20 69 66 28 20 70 53 75 62 31 2d 3e       if( pSub1->
198e0 69 73 41 67 67 20 7c 7c 20 70 53 75 62 31 2d 3e  isAgg || pSub1->
198f0 69 73 44 69 73 74 69 6e 63 74 20 0a 20 20 20 20  isDistinct .    
19900 20 20 20 7c 7c 20 28 70 53 75 62 31 2d 3e 70 50     || (pSub1->pP
19910 72 69 6f 72 20 26 26 20 70 53 75 62 31 2d 3e 6f  rior && pSub1->o
19920 70 21 3d 54 4b 5f 41 4c 4c 29 20 0a 20 20 20 20  p!=TK_ALL) .    
19930 20 20 20 7c 7c 20 21 70 53 75 62 31 2d 3e 70 53     || !pSub1->pS
19940 72 63 20 7c 7c 20 70 53 75 62 31 2d 3e 70 53 72  rc || pSub1->pSr
19950 63 2d 3e 6e 53 72 63 21 3d 31 0a 20 20 20 20 20  c->nSrc!=1.     
19960 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75   ){.        retu
19970 72 6e 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20  rn 0;.      }.  
19980 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 52 65 73 74    }..    /* Rest
19990 72 69 63 74 69 6f 6e 20 31 38 2e 20 2a 2f 0a 20  riction 18. */. 
199a0 20 20 20 69 66 28 20 70 2d 3e 70 4f 72 64 65 72     if( p->pOrder
199b0 42 79 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  By ){.      int 
199c0 69 69 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 69  ii;.      for(ii
199d0 3d 30 3b 20 69 69 3c 70 2d 3e 70 4f 72 64 65 72  =0; ii<p->pOrder
199e0 42 79 2d 3e 6e 45 78 70 72 3b 20 69 69 2b 2b 29  By->nExpr; ii++)
199f0 7b 0a 20 20 20 20 20 20 20 20 45 78 70 72 20 2a  {.        Expr *
19a00 70 45 78 70 72 20 3d 20 70 2d 3e 70 4f 72 64 65  pExpr = p->pOrde
19a10 72 42 79 2d 3e 61 5b 69 69 5d 2e 70 45 78 70 72  rBy->a[ii].pExpr
19a20 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 45  ;.        if( pE
19a30 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 43 4f 4c 55  xpr->op!=TK_COLU
19a40 4d 4e 20 7c 7c 20 70 45 78 70 72 2d 3e 69 54 61  MN || pExpr->iTa
19a50 62 6c 65 21 3d 69 50 61 72 65 6e 74 20 29 7b 20  ble!=iParent ){ 
19a60 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72  .          retur
19a70 6e 20 30 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  n 0;.        }. 
19a80 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
19a90 0a 0a 20 20 70 50 61 72 73 65 2d 3e 7a 41 75 74  ..  pParse->zAut
19aa0 68 43 6f 6e 74 65 78 74 20 3d 20 70 53 75 62 69  hContext = pSubi
19ab0 74 65 6d 2d 3e 7a 4e 61 6d 65 3b 0a 20 20 73 71  tem->zName;.  sq
19ac0 6c 69 74 65 33 41 75 74 68 43 68 65 63 6b 28 70  lite3AuthCheck(p
19ad0 50 61 72 73 65 2c 20 53 51 4c 49 54 45 5f 53 45  Parse, SQLITE_SE
19ae0 4c 45 43 54 2c 20 30 2c 20 30 2c 20 30 29 3b 0a  LECT, 0, 0, 0);.
19af0 20 20 70 50 61 72 73 65 2d 3e 7a 41 75 74 68 43    pParse->zAuthC
19b00 6f 6e 74 65 78 74 20 3d 20 7a 53 61 76 65 64 41  ontext = zSavedA
19b10 75 74 68 43 6f 6e 74 65 78 74 3b 0a 0a 20 20 2f  uthContext;..  /
19b20 2a 20 49 66 20 74 68 65 20 73 75 62 2d 71 75 65  * If the sub-que
19b30 72 79 20 69 73 20 61 20 63 6f 6d 70 6f 75 6e 64  ry is a compound
19b40 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
19b50 74 2c 20 74 68 65 6e 20 69 74 20 6d 75 73 74 20  t, then it must 
19b60 62 65 0a 20 20 2a 2a 20 61 20 55 4e 49 4f 4e 20  be.  ** a UNION 
19b70 41 4c 4c 20 61 6e 64 20 74 68 65 20 70 61 72 65  ALL and the pare
19b80 6e 74 20 71 75 65 72 79 20 6d 75 73 74 20 62 65  nt query must be
19b90 20 6f 66 20 74 68 65 20 66 6f 72 6d 3a 0a 20 20   of the form:.  
19ba0 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 53 45 4c 45  **.  **     SELE
19bb0 43 54 20 3c 65 78 70 72 2d 6c 69 73 74 3e 20 46  CT <expr-list> F
19bc0 52 4f 4d 20 28 3c 73 75 62 2d 71 75 65 72 79 3e  ROM (<sub-query>
19bd0 29 20 3c 77 68 65 72 65 2d 63 6c 61 75 73 65 3e  ) <where-clause>
19be0 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20 66 6f 6c 6c   .  **.  ** foll
19bf0 6f 77 65 64 20 62 79 20 61 6e 79 20 4f 52 44 45  owed by any ORDE
19c00 52 20 42 59 2c 20 4c 49 4d 49 54 20 61 6e 64 2f  R BY, LIMIT and/
19c10 6f 72 20 4f 46 46 53 45 54 20 63 6c 61 75 73 65  or OFFSET clause
19c20 73 2e 20 54 68 69 73 20 62 6c 6f 63 6b 0a 20 20  s. This block.  
19c30 2a 2a 20 63 72 65 61 74 65 73 20 4e 20 63 6f 70  ** creates N cop
19c40 69 65 73 20 6f 66 20 74 68 65 20 70 61 72 65 6e  ies of the paren
19c50 74 20 71 75 65 72 79 20 77 69 74 68 6f 75 74 20  t query without 
19c60 61 6e 79 20 4f 52 44 45 52 20 42 59 2c 20 4c 49  any ORDER BY, LI
19c70 4d 49 54 20 6f 72 20 0a 20 20 2a 2a 20 4f 46 46  MIT or .  ** OFF
19c80 53 45 54 20 63 6c 61 75 73 65 73 20 61 6e 64 20  SET clauses and 
19c90 6a 6f 69 6e 73 20 74 68 65 6d 20 74 6f 20 74 68  joins them to th
19ca0 65 20 6c 65 66 74 2d 68 61 6e 64 2d 73 69 64 65  e left-hand-side
19cb0 20 6f 66 20 74 68 65 20 6f 72 69 67 69 6e 61 6c   of the original
19cc0 0a 20 20 2a 2a 20 75 73 69 6e 67 20 55 4e 49 4f  .  ** using UNIO
19cd0 4e 20 41 4c 4c 20 6f 70 65 72 61 74 6f 72 73 2e  N ALL operators.
19ce0 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 4e 20   In this case N 
19cf0 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  is the number of
19d00 20 73 69 6d 70 6c 65 0a 20 20 2a 2a 20 73 65 6c   simple.  ** sel
19d10 65 63 74 20 73 74 61 74 65 6d 65 6e 74 73 20 69  ect statements i
19d20 6e 20 74 68 65 20 63 6f 6d 70 6f 75 6e 64 20 73  n the compound s
19d30 75 62 2d 71 75 65 72 79 2e 0a 20 20 2a 2f 0a 20  ub-query..  */. 
19d40 20 66 6f 72 28 70 53 75 62 3d 70 53 75 62 2d 3e   for(pSub=pSub->
19d50 70 50 72 69 6f 72 3b 20 70 53 75 62 3b 20 70 53  pPrior; pSub; pS
19d60 75 62 3d 70 53 75 62 2d 3e 70 50 72 69 6f 72 29  ub=pSub->pPrior)
19d70 7b 0a 20 20 20 20 53 65 6c 65 63 74 20 2a 70 4e  {.    Select *pN
19d80 65 77 3b 0a 20 20 20 20 45 78 70 72 4c 69 73 74  ew;.    ExprList
19d90 20 2a 70 4f 72 64 65 72 42 79 20 3d 20 70 2d 3e   *pOrderBy = p->
19da0 70 4f 72 64 65 72 42 79 3b 0a 20 20 20 20 45 78  pOrderBy;.    Ex
19db0 70 72 20 2a 70 4c 69 6d 69 74 20 3d 20 70 2d 3e  pr *pLimit = p->
19dc0 70 4c 69 6d 69 74 3b 0a 20 20 20 20 45 78 70 72  pLimit;.    Expr
19dd0 20 2a 70 4f 66 66 73 65 74 20 3d 20 70 2d 3e 70   *pOffset = p->p
19de0 4f 66 66 73 65 74 3b 0a 20 20 20 20 53 65 6c 65  Offset;.    Sele
19df0 63 74 20 2a 70 50 72 69 6f 72 20 3d 20 70 2d 3e  ct *pPrior = p->
19e00 70 50 72 69 6f 72 3b 0a 20 20 20 20 70 2d 3e 70  pPrior;.    p->p
19e10 4f 72 64 65 72 42 79 20 3d 20 30 3b 0a 20 20 20  OrderBy = 0;.   
19e20 20 70 2d 3e 70 53 72 63 20 3d 20 30 3b 0a 20 20   p->pSrc = 0;.  
19e30 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d 20 30 3b    p->pPrior = 0;
19e40 0a 20 20 20 20 70 2d 3e 70 4c 69 6d 69 74 20 3d  .    p->pLimit =
19e50 20 30 3b 0a 20 20 20 20 70 4e 65 77 20 3d 20 73   0;.    pNew = s
19e60 71 6c 69 74 65 33 53 65 6c 65 63 74 44 75 70 28  qlite3SelectDup(
19e70 64 62 2c 20 70 29 3b 0a 20 20 20 20 70 4e 65 77  db, p);.    pNew
19e80 2d 3e 70 50 72 69 6f 72 20 3d 20 70 50 72 69 6f  ->pPrior = pPrio
19e90 72 3b 0a 20 20 20 20 70 2d 3e 70 50 72 69 6f 72  r;.    p->pPrior
19ea0 20 3d 20 70 4e 65 77 3b 0a 20 20 20 20 70 2d 3e   = pNew;.    p->
19eb0 70 4f 72 64 65 72 42 79 20 3d 20 70 4f 72 64 65  pOrderBy = pOrde
19ec0 72 42 79 3b 0a 20 20 20 20 70 2d 3e 6f 70 20 3d  rBy;.    p->op =
19ed0 20 54 4b 5f 41 4c 4c 3b 0a 20 20 20 20 70 2d 3e   TK_ALL;.    p->
19ee0 70 53 72 63 20 3d 20 70 53 72 63 3b 0a 20 20 20  pSrc = pSrc;.   
19ef0 20 70 2d 3e 70 4c 69 6d 69 74 20 3d 20 70 4c 69   p->pLimit = pLi
19f00 6d 69 74 3b 0a 20 20 20 20 70 2d 3e 70 4f 66 66  mit;.    p->pOff
19f10 73 65 74 20 3d 20 70 4f 66 66 73 65 74 3b 0a 20  set = pOffset;. 
19f20 20 20 20 70 2d 3e 70 52 69 67 68 74 6d 6f 73 74     p->pRightmost
19f30 20 3d 20 30 3b 0a 20 20 20 20 70 4e 65 77 2d 3e   = 0;.    pNew->
19f40 70 52 69 67 68 74 6d 6f 73 74 20 3d 20 30 3b 0a  pRightmost = 0;.
19f50 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 77 65 20    }..  /* If we 
19f60 72 65 61 63 68 20 74 68 69 73 20 70 6f 69 6e 74  reach this point
19f70 2c 20 69 74 20 6d 65 61 6e 73 20 66 6c 61 74 74  , it means flatt
19f80 65 6e 69 6e 67 20 69 73 20 70 65 72 6d 69 74 74  ening is permitt
19f90 65 64 20 66 6f 72 20 74 68 65 0a 20 20 2a 2a 20  ed for the.  ** 
19fa0 69 46 72 6f 6d 2d 74 68 20 65 6e 74 72 79 20 6f  iFrom-th entry o
19fb0 66 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73  f the FROM claus
19fc0 65 20 69 6e 20 74 68 65 20 6f 75 74 65 72 20 71  e in the outer q
19fd0 75 65 72 79 2e 0a 20 20 2a 2f 0a 20 20 70 53 75  uery..  */.  pSu
19fe0 62 20 3d 20 70 53 75 62 31 20 3d 20 70 53 75 62  b = pSub1 = pSub
19ff0 69 74 65 6d 2d 3e 70 53 65 6c 65 63 74 3b 0a 20  item->pSelect;. 
1a000 20 66 6f 72 28 70 50 61 72 65 6e 74 3d 70 3b 20   for(pParent=p; 
1a010 70 50 61 72 65 6e 74 3b 20 70 50 61 72 65 6e 74  pParent; pParent
1a020 3d 70 50 61 72 65 6e 74 2d 3e 70 50 72 69 6f 72  =pParent->pPrior
1a030 2c 20 70 53 75 62 3d 70 53 75 62 2d 3e 70 50 72  , pSub=pSub->pPr
1a040 69 6f 72 29 7b 0a 20 20 20 20 69 6e 74 20 6e 53  ior){.    int nS
1a050 75 62 53 72 63 20 3d 20 70 53 75 62 53 72 63 2d  ubSrc = pSubSrc-
1a060 3e 6e 53 72 63 3b 0a 20 20 20 20 69 6e 74 20 6a  >nSrc;.    int j
1a070 6f 69 6e 74 79 70 65 20 3d 20 30 3b 0a 20 20 20  ointype = 0;.   
1a080 20 70 53 75 62 53 72 63 20 3d 20 70 53 75 62 2d   pSubSrc = pSub-
1a090 3e 70 53 72 63 3b 0a 20 20 20 20 70 53 72 63 20  >pSrc;.    pSrc 
1a0a0 3d 20 70 50 61 72 65 6e 74 2d 3e 70 53 72 63 3b  = pParent->pSrc;
1a0b0 0a 0a 20 20 20 20 2f 2a 20 4d 6f 76 65 20 61 6c  ..    /* Move al
1a0c0 6c 20 6f 66 20 74 68 65 20 46 52 4f 4d 20 65 6c  l of the FROM el
1a0d0 65 6d 65 6e 74 73 20 6f 66 20 74 68 65 20 73 75  ements of the su
1a0e0 62 71 75 65 72 79 20 69 6e 74 6f 20 74 68 65 0a  bquery into the.
1a0f0 20 20 20 20 2a 2a 20 74 68 65 20 46 52 4f 4d 20      ** the FROM 
1a100 63 6c 61 75 73 65 20 6f 66 20 74 68 65 20 6f 75  clause of the ou
1a110 74 65 72 20 71 75 65 72 79 2e 20 20 42 65 66 6f  ter query.  Befo
1a120 72 65 20 64 6f 69 6e 67 20 74 68 69 73 2c 20 72  re doing this, r
1a130 65 6d 65 6d 62 65 72 0a 20 20 20 20 2a 2a 20 74  emember.    ** t
1a140 68 65 20 63 75 72 73 6f 72 20 6e 75 6d 62 65 72  he cursor number
1a150 20 66 6f 72 20 74 68 65 20 6f 72 69 67 69 6e 61   for the origina
1a160 6c 20 6f 75 74 65 72 20 71 75 65 72 79 20 46 52  l outer query FR
1a170 4f 4d 20 65 6c 65 6d 65 6e 74 20 69 6e 0a 20 20  OM element in.  
1a180 20 20 2a 2a 20 69 50 61 72 65 6e 74 2e 20 20 54    ** iParent.  T
1a190 68 65 20 69 50 61 72 65 6e 74 20 63 75 72 73 6f  he iParent curso
1a1a0 72 20 77 69 6c 6c 20 6e 65 76 65 72 20 62 65 20  r will never be 
1a1b0 75 73 65 64 2e 20 20 53 75 62 73 65 71 75 65 6e  used.  Subsequen
1a1c0 74 20 63 6f 64 65 0a 20 20 20 20 2a 2a 20 77 69  t code.    ** wi
1a1d0 6c 6c 20 73 63 61 6e 20 65 78 70 72 65 73 73 69  ll scan expressi
1a1e0 6f 6e 73 20 6c 6f 6f 6b 69 6e 67 20 66 6f 72 20  ons looking for 
1a1f0 69 50 61 72 65 6e 74 20 72 65 66 65 72 65 6e 63  iParent referenc
1a200 65 73 20 61 6e 64 20 72 65 70 6c 61 63 65 0a 20  es and replace. 
1a210 20 20 20 2a 2a 20 74 68 6f 73 65 20 72 65 66 65     ** those refe
1a220 72 65 6e 63 65 73 20 77 69 74 68 20 65 78 70 72  rences with expr
1a230 65 73 73 69 6f 6e 73 20 74 68 61 74 20 72 65 73  essions that res
1a240 6f 6c 76 65 20 74 6f 20 74 68 65 20 73 75 62 71  olve to the subq
1a250 75 65 72 79 20 46 52 4f 4d 0a 20 20 20 20 2a 2a  uery FROM.    **
1a260 20 65 6c 65 6d 65 6e 74 73 20 77 65 20 61 72 65   elements we are
1a270 20 6e 6f 77 20 63 6f 70 79 69 6e 67 20 69 6e 2e   now copying in.
1a280 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
1a290 70 53 72 63 20 29 7b 0a 20 20 20 20 20 20 70 53  pSrc ){.      pS
1a2a0 75 62 69 74 65 6d 20 3d 20 26 70 53 72 63 2d 3e  ubitem = &pSrc->
1a2b0 61 5b 69 46 72 6f 6d 5d 3b 0a 20 20 20 20 20 20  a[iFrom];.      
1a2c0 6e 53 75 62 53 72 63 20 3d 20 70 53 75 62 53 72  nSubSrc = pSubSr
1a2d0 63 2d 3e 6e 53 72 63 3b 0a 20 20 20 20 20 20 6a  c->nSrc;.      j
1a2e0 6f 69 6e 74 79 70 65 20 3d 20 70 53 75 62 69 74  ointype = pSubit
1a2f0 65 6d 2d 3e 6a 6f 69 6e 74 79 70 65 3b 0a 20 20  em->jointype;.  
1a300 20 20 20 20 73 71 6c 69 74 65 33 44 65 6c 65 74      sqlite3Delet
1a310 65 54 61 62 6c 65 28 70 53 75 62 69 74 65 6d 2d  eTable(pSubitem-
1a320 3e 70 54 61 62 29 3b 0a 20 20 20 20 20 20 73 71  >pTab);.      sq
1a330 6c 69 74 65 33 5f 66 72 65 65 28 70 53 75 62 69  lite3_free(pSubi
1a340 74 65 6d 2d 3e 7a 44 61 74 61 62 61 73 65 29 3b  tem->zDatabase);
1a350 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66  .      sqlite3_f
1a360 72 65 65 28 70 53 75 62 69 74 65 6d 2d 3e 7a 4e  ree(pSubitem->zN
1a370 61 6d 65 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  ame);.      sqli
1a380 74 65 33 5f 66 72 65 65 28 70 53 75 62 69 74 65  te3_free(pSubite
1a390 6d 2d 3e 7a 41 6c 69 61 73 29 3b 0a 20 20 20 20  m->zAlias);.    
1a3a0 20 20 70 53 75 62 69 74 65 6d 2d 3e 70 54 61 62    pSubitem->pTab
1a3b0 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 53 75 62   = 0;.      pSub
1a3c0 69 74 65 6d 2d 3e 7a 44 61 74 61 62 61 73 65 20  item->zDatabase 
1a3d0 3d 20 30 3b 0a 20 20 20 20 20 20 70 53 75 62 69  = 0;.      pSubi
1a3e0 74 65 6d 2d 3e 7a 4e 61 6d 65 20 3d 20 30 3b 0a  tem->zName = 0;.
1a3f0 20 20 20 20 20 20 70 53 75 62 69 74 65 6d 2d 3e        pSubitem->
1a400 7a 41 6c 69 61 73 20 3d 20 30 3b 0a 20 20 20 20  zAlias = 0;.    
1a410 7d 0a 20 20 20 20 69 66 28 20 6e 53 75 62 53 72  }.    if( nSubSr
1a420 63 21 3d 31 20 7c 7c 20 21 70 53 72 63 20 29 7b  c!=1 || !pSrc ){
1a430 0a 20 20 20 20 20 20 69 6e 74 20 65 78 74 72 61  .      int extra
1a440 20 3d 20 6e 53 75 62 53 72 63 20 2d 20 31 3b 0a   = nSubSrc - 1;.
1a450 20 20 20 20 20 20 66 6f 72 28 69 3d 28 70 53 72        for(i=(pSr
1a460 63 3f 31 3a 30 29 3b 20 69 3c 6e 53 75 62 53 72  c?1:0); i<nSubSr
1a470 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20  c; i++){.       
1a480 20 70 53 72 63 20 3d 20 73 71 6c 69 74 65 33 53   pSrc = sqlite3S
1a490 72 63 4c 69 73 74 41 70 70 65 6e 64 28 64 62 2c  rcListAppend(db,
1a4a0 20 70 53 72 63 2c 20 30 2c 20 30 29 3b 0a 20 20   pSrc, 0, 0);.  
1a4b0 20 20 20 20 20 20 69 66 28 20 70 53 72 63 3d 3d        if( pSrc==
1a4c0 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70  0 ){.          p
1a4d0 50 61 72 65 6e 74 2d 3e 70 53 72 63 20 3d 20 30  Parent->pSrc = 0
1a4e0 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75  ;.          retu
1a4f0 72 6e 20 31 3b 0a 20 20 20 20 20 20 20 20 7d 0a  rn 1;.        }.
1a500 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 50        }.      pP
1a510 61 72 65 6e 74 2d 3e 70 53 72 63 20 3d 20 70 53  arent->pSrc = pS
1a520 72 63 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d  rc;.      for(i=
1a530 70 53 72 63 2d 3e 6e 53 72 63 2d 31 3b 20 69 2d  pSrc->nSrc-1; i-
1a540 65 78 74 72 61 3e 3d 69 46 72 6f 6d 3b 20 69 2d  extra>=iFrom; i-
1a550 2d 29 7b 0a 20 20 20 20 20 20 20 20 70 53 72 63  -){.        pSrc
1a560 2d 3e 61 5b 69 5d 20 3d 20 70 53 72 63 2d 3e 61  ->a[i] = pSrc->a
1a570 5b 69 2d 65 78 74 72 61 5d 3b 0a 20 20 20 20 20  [i-extra];.     
1a580 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f 72   }.    }.    for
1a590 28 69 3d 30 3b 20 69 3c 6e 53 75 62 53 72 63 3b  (i=0; i<nSubSrc;
1a5a0 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 70 53 72   i++){.      pSr
1a5b0 63 2d 3e 61 5b 69 2b 69 46 72 6f 6d 5d 20 3d 20  c->a[i+iFrom] = 
1a5c0 70 53 75 62 53 72 63 2d 3e 61 5b 69 5d 3b 0a 20  pSubSrc->a[i];. 
1a5d0 20 20 20 20 20 6d 65 6d 73 65 74 28 26 70 53 75       memset(&pSu
1a5e0 62 53 72 63 2d 3e 61 5b 69 5d 2c 20 30 2c 20 73  bSrc->a[i], 0, s
1a5f0 69 7a 65 6f 66 28 70 53 75 62 53 72 63 2d 3e 61  izeof(pSubSrc->a
1a600 5b 69 5d 29 29 3b 0a 20 20 20 20 7d 0a 20 20 20  [i]));.    }.   
1a610 20 70 53 72 63 2d 3e 61 5b 69 46 72 6f 6d 5d 2e   pSrc->a[iFrom].
1a620 6a 6f 69 6e 74 79 70 65 20 3d 20 6a 6f 69 6e 74  jointype = joint
1a630 79 70 65 3b 0a 20 20 0a 20 20 20 20 2f 2a 20 4e  ype;.  .    /* N
1a640 6f 77 20 62 65 67 69 6e 20 73 75 62 73 74 69 74  ow begin substit
1a650 75 74 69 6e 67 20 73 75 62 71 75 65 72 79 20 72  uting subquery r
1a660 65 73 75 6c 74 20 73 65 74 20 65 78 70 72 65 73  esult set expres
1a670 73 69 6f 6e 73 20 66 6f 72 20 0a 20 20 20 20 2a  sions for .    *
1a680 2a 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20  * references to 
1a690 74 68 65 20 69 50 61 72 65 6e 74 20 69 6e 20 74  the iParent in t
1a6a0 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 2e 0a  he outer query..
1a6b0 20 20 20 20 2a 2a 20 0a 20 20 20 20 2a 2a 20 45      ** .    ** E
1a6c0 78 61 6d 70 6c 65 3a 0a 20 20 20 20 2a 2a 0a 20  xample:.    **. 
1a6d0 20 20 20 2a 2a 20 20 20 53 45 4c 45 43 54 20 61     **   SELECT a
1a6e0 2b 35 2c 20 62 2a 31 30 20 46 52 4f 4d 20 28 53  +5, b*10 FROM (S
1a6f0 45 4c 45 43 54 20 78 2a 33 20 41 53 20 61 2c 20  ELECT x*3 AS a, 
1a700 79 2b 31 30 20 41 53 20 62 20 46 52 4f 4d 20 74  y+10 AS b FROM t
1a710 31 29 20 57 48 45 52 45 20 61 3e 62 3b 0a 20 20  1) WHERE a>b;.  
1a720 20 20 2a 2a 20 20 20 5c 20 20 20 20 20 20 20 20    **   \        
1a730 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 5f 5f               \__
1a740 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 20 73 75 62 71  ___________ subq
1a750 75 65 72 79 20 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 2f  uery __________/
1a760 20 20 20 20 20 20 20 20 20 20 2f 0a 20 20 20 20            /.    
1a770 2a 2a 20 20 20 20 5c 5f 5f 5f 5f 5f 5f 5f 5f 5f  **    \_________
1a780 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 20 6f 75 74  ____________ out
1a790 65 72 20 71 75 65 72 79 20 5f 5f 5f 5f 5f 5f 5f  er query _______
1a7a0 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f  ________________
1a7b0 5f 5f 5f 5f 5f 5f 5f 2f 0a 20 20 20 20 2a 2a 0a  _______/.    **.
1a7c0 20 20 20 20 2a 2a 20 57 65 20 6c 6f 6f 6b 20 61      ** We look a
1a7d0 74 20 65 76 65 72 79 20 65 78 70 72 65 73 73 69  t every expressi
1a7e0 6f 6e 20 69 6e 20 74 68 65 20 6f 75 74 65 72 20  on in the outer 
1a7f0 71 75 65 72 79 20 61 6e 64 20 65 76 65 72 79 20  query and every 
1a800 70 6c 61 63 65 20 77 65 20 73 65 65 0a 20 20 20  place we see.   
1a810 20 2a 2a 20 22 61 22 20 77 65 20 73 75 62 73 74   ** "a" we subst
1a820 69 74 75 74 65 20 22 78 2a 33 22 20 61 6e 64 20  itute "x*3" and 
1a830 65 76 65 72 79 20 70 6c 61 63 65 20 77 65 20 73  every place we s
1a840 65 65 20 22 62 22 20 77 65 20 73 75 62 73 74 69  ee "b" we substi
1a850 74 75 74 65 20 22 79 2b 31 30 22 2e 0a 20 20 20  tute "y+10"..   
1a860 20 2a 2f 0a 20 20 20 20 70 4c 69 73 74 20 3d 20   */.    pList = 
1a870 70 50 61 72 65 6e 74 2d 3e 70 45 4c 69 73 74 3b  pParent->pEList;
1a880 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
1a890 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b  pList->nExpr; i+
1a8a0 2b 29 7b 0a 20 20 20 20 20 20 45 78 70 72 20 2a  +){.      Expr *
1a8b0 70 45 78 70 72 3b 0a 20 20 20 20 20 20 69 66 28  pExpr;.      if(
1a8c0 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61   pList->a[i].zNa
1a8d0 6d 65 3d 3d 30 20 26 26 20 28 70 45 78 70 72 20  me==0 && (pExpr 
1a8e0 3d 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45  = pList->a[i].pE
1a8f0 78 70 72 29 2d 3e 73 70 61 6e 2e 7a 21 3d 30 20  xpr)->span.z!=0 
1a900 29 7b 0a 20 20 20 20 20 20 20 20 70 4c 69 73 74  ){.        pList
1a910 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 20 3d 20 0a  ->a[i].zName = .
1a920 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73                 s
1a930 71 6c 69 74 65 33 44 62 53 74 72 4e 44 75 70 28  qlite3DbStrNDup(
1a940 64 62 2c 20 28 63 68 61 72 2a 29 70 45 78 70 72  db, (char*)pExpr
1a950 2d 3e 73 70 61 6e 2e 7a 2c 20 70 45 78 70 72 2d  ->span.z, pExpr-
1a960 3e 73 70 61 6e 2e 6e 29 3b 0a 20 20 20 20 20 20  >span.n);.      
1a970 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73 75 62 73  }.    }.    subs
1a980 74 45 78 70 72 4c 69 73 74 28 64 62 2c 20 70 50  tExprList(db, pP
1a990 61 72 65 6e 74 2d 3e 70 45 4c 69 73 74 2c 20 69  arent->pEList, i
1a9a0 50 61 72 65 6e 74 2c 20 70 53 75 62 2d 3e 70 45  Parent, pSub->pE
1a9b0 4c 69 73 74 29 3b 0a 20 20 20 20 69 66 28 20 69  List);.    if( i
1a9c0 73 41 67 67 20 29 7b 0a 20 20 20 20 20 20 73 75  sAgg ){.      su
1a9d0 62 73 74 45 78 70 72 4c 69 73 74 28 64 62 2c 20  bstExprList(db, 
1a9e0 70 50 61 72 65 6e 74 2d 3e 70 47 72 6f 75 70 42  pParent->pGroupB
1a9f0 79 2c 20 69 50 61 72 65 6e 74 2c 20 70 53 75 62  y, iParent, pSub
1aa00 2d 3e 70 45 4c 69 73 74 29 3b 0a 20 20 20 20 20  ->pEList);.     
1aa10 20 73 75 62 73 74 45 78 70 72 28 64 62 2c 20 70   substExpr(db, p
1aa20 50 61 72 65 6e 74 2d 3e 70 48 61 76 69 6e 67 2c  Parent->pHaving,
1aa30 20 69 50 61 72 65 6e 74 2c 20 70 53 75 62 2d 3e   iParent, pSub->
1aa40 70 45 4c 69 73 74 29 3b 0a 20 20 20 20 7d 0a 20  pEList);.    }. 
1aa50 20 20 20 69 66 28 20 70 53 75 62 2d 3e 70 4f 72     if( pSub->pOr
1aa60 64 65 72 42 79 20 29 7b 0a 20 20 20 20 20 20 61  derBy ){.      a
1aa70 73 73 65 72 74 28 20 70 50 61 72 65 6e 74 2d 3e  ssert( pParent->
1aa80 70 4f 72 64 65 72 42 79 3d 3d 30 20 29 3b 0a 20  pOrderBy==0 );. 
1aa90 20 20 20 20 20 70 50 61 72 65 6e 74 2d 3e 70 4f       pParent->pO
1aaa0 72 64 65 72 42 79 20 3d 20 70 53 75 62 2d 3e 70  rderBy = pSub->p
1aab0 4f 72 64 65 72 42 79 3b 0a 20 20 20 20 20 20 70  OrderBy;.      p
1aac0 53 75 62 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20  Sub->pOrderBy = 
1aad0 30 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  0;.    }else if(
1aae0 20 70 50 61 72 65 6e 74 2d 3e 70 4f 72 64 65 72   pParent->pOrder
1aaf0 42 79 20 29 7b 0a 20 20 20 20 20 20 73 75 62 73  By ){.      subs
1ab00 74 45 78 70 72 4c 69 73 74 28 64 62 2c 20 70 50  tExprList(db, pP
1ab10 61 72 65 6e 74 2d 3e 70 4f 72 64 65 72 42 79 2c  arent->pOrderBy,
1ab20 20 69 50 61 72 65 6e 74 2c 20 70 53 75 62 2d 3e   iParent, pSub->
1ab30 70 45 4c 69 73 74 29 3b 0a 20 20 20 20 7d 0a 20  pEList);.    }. 
1ab40 20 20 20 69 66 28 20 70 53 75 62 2d 3e 70 57 68     if( pSub->pWh
1ab50 65 72 65 20 29 7b 0a 20 20 20 20 20 20 70 57 68  ere ){.      pWh
1ab60 65 72 65 20 3d 20 73 71 6c 69 74 65 33 45 78 70  ere = sqlite3Exp
1ab70 72 44 75 70 28 64 62 2c 20 70 53 75 62 2d 3e 70  rDup(db, pSub->p
1ab80 57 68 65 72 65 29 3b 0a 20 20 20 20 7d 65 6c 73  Where);.    }els
1ab90 65 7b 0a 20 20 20 20 20 20 70 57 68 65 72 65 20  e{.      pWhere 
1aba0 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  = 0;.    }.    i
1abb0 66 28 20 73 75 62 71 75 65 72 79 49 73 41 67 67  f( subqueryIsAgg
1abc0 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74   ){.      assert
1abd0 28 20 70 50 61 72 65 6e 74 2d 3e 70 48 61 76 69  ( pParent->pHavi
1abe0 6e 67 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 70  ng==0 );.      p
1abf0 50 61 72 65 6e 74 2d 3e 70 48 61 76 69 6e 67 20  Parent->pHaving 
1ac00 3d 20 70 50 61 72 65 6e 74 2d 3e 70 57 68 65 72  = pParent->pWher
1ac10 65 3b 0a 20 20 20 20 20 20 70 50 61 72 65 6e 74  e;.      pParent
1ac20 2d 3e 70 57 68 65 72 65 20 3d 20 70 57 68 65 72  ->pWhere = pWher
1ac30 65 3b 0a 20 20 20 20 20 20 73 75 62 73 74 45 78  e;.      substEx
1ac40 70 72 28 64 62 2c 20 70 50 61 72 65 6e 74 2d 3e  pr(db, pParent->
1ac50 70 48 61 76 69 6e 67 2c 20 69 50 61 72 65 6e 74  pHaving, iParent
1ac60 2c 20 70 53 75 62 2d 3e 70 45 4c 69 73 74 29 3b  , pSub->pEList);
1ac70 0a 20 20 20 20 20 20 70 50 61 72 65 6e 74 2d 3e  .      pParent->
1ac80 70 48 61 76 69 6e 67 20 3d 20 73 71 6c 69 74 65  pHaving = sqlite
1ac90 33 45 78 70 72 41 6e 64 28 64 62 2c 20 70 50 61  3ExprAnd(db, pPa
1aca0 72 65 6e 74 2d 3e 70 48 61 76 69 6e 67 2c 20 0a  rent->pHaving, .
1acb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1acc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1acd0 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 75 70    sqlite3ExprDup
1ace0 28 64 62 2c 20 70 53 75 62 2d 3e 70 48 61 76 69  (db, pSub->pHavi
1acf0 6e 67 29 29 3b 0a 20 20 20 20 20 20 61 73 73 65  ng));.      asse
1ad00 72 74 28 20 70 50 61 72 65 6e 74 2d 3e 70 47 72  rt( pParent->pGr
1ad10 6f 75 70 42 79 3d 3d 30 20 29 3b 0a 20 20 20 20  oupBy==0 );.    
1ad20 20 20 70 50 61 72 65 6e 74 2d 3e 70 47 72 6f 75    pParent->pGrou
1ad30 70 42 79 20 3d 20 73 71 6c 69 74 65 33 45 78 70  pBy = sqlite3Exp
1ad40 72 4c 69 73 74 44 75 70 28 64 62 2c 20 70 53 75  rListDup(db, pSu
1ad50 62 2d 3e 70 47 72 6f 75 70 42 79 29 3b 0a 20 20  b->pGroupBy);.  
1ad60 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73    }else{.      s
1ad70 75 62 73 74 45 78 70 72 28 64 62 2c 20 70 50 61  ubstExpr(db, pPa
1ad80 72 65 6e 74 2d 3e 70 57 68 65 72 65 2c 20 69 50  rent->pWhere, iP
1ad90 61 72 65 6e 74 2c 20 70 53 75 62 2d 3e 70 45 4c  arent, pSub->pEL
1ada0 69 73 74 29 3b 0a 20 20 20 20 20 20 70 50 61 72  ist);.      pPar
1adb0 65 6e 74 2d 3e 70 57 68 65 72 65 20 3d 20 73 71  ent->pWhere = sq
1adc0 6c 69 74 65 33 45 78 70 72 41 6e 64 28 64 62 2c  lite3ExprAnd(db,
1add0 20 70 50 61 72 65 6e 74 2d 3e 70 57 68 65 72 65   pParent->pWhere
1ade0 2c 20 70 57 68 65 72 65 29 3b 0a 20 20 20 20 7d  , pWhere);.    }
1adf0 0a 20 20 0a 20 20 20 20 2f 2a 20 54 68 65 20 66  .  .    /* The f
1ae00 6c 61 74 74 65 6e 65 64 20 71 75 65 72 79 20 69  lattened query i
1ae10 73 20 64 69 73 74 69 6e 63 74 20 69 66 20 65 69  s distinct if ei
1ae20 74 68 65 72 20 74 68 65 20 69 6e 6e 65 72 20 6f  ther the inner o
1ae30 72 20 74 68 65 0a 20 20 20 20 2a 2a 20 6f 75 74  r the.    ** out
1ae40 65 72 20 71 75 65 72 79 20 69 73 20 64 69 73 74  er query is dist
1ae50 69 6e 63 74 2e 20 0a 20 20 20 20 2a 2f 0a 20 20  inct. .    */.  
1ae60 20 20 70 50 61 72 65 6e 74 2d 3e 69 73 44 69 73    pParent->isDis
1ae70 74 69 6e 63 74 20 3d 20 70 50 61 72 65 6e 74 2d  tinct = pParent-
1ae80 3e 69 73 44 69 73 74 69 6e 63 74 20 7c 7c 20 70  >isDistinct || p
1ae90 53 75 62 2d 3e 69 73 44 69 73 74 69 6e 63 74 3b  Sub->isDistinct;
1aea0 0a 20 20 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a  .  .    /*.    *
1aeb0 2a 20 53 45 4c 45 43 54 20 2e 2e 2e 20 46 52 4f  * SELECT ... FRO
1aec0 4d 20 28 53 45 4c 45 43 54 20 2e 2e 2e 20 4c 49  M (SELECT ... LI
1aed0 4d 49 54 20 61 20 4f 46 46 53 45 54 20 62 29 20  MIT a OFFSET b) 
1aee0 4c 49 4d 49 54 20 78 20 4f 46 46 53 45 54 20 79  LIMIT x OFFSET y
1aef0 3b 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  ;.    **.    ** 
1af00 4f 6e 65 20 69 73 20 74 65 6d 70 74 65 64 20 74  One is tempted t
1af10 6f 20 74 72 79 20 74 6f 20 61 64 64 20 61 20 61  o try to add a a
1af20 6e 64 20 62 20 74 6f 20 63 6f 6d 62 69 6e 65 20  nd b to combine 
1af30 74 68 65 20 6c 69 6d 69 74 73 2e 20 20 42 75 74  the limits.  But
1af40 20 74 68 69 73 0a 20 20 20 20 2a 2a 20 64 6f 65   this.    ** doe
1af50 73 20 6e 6f 74 20 77 6f 72 6b 20 69 66 20 65 69  s not work if ei
1af60 74 68 65 72 20 6c 69 6d 69 74 20 69 73 20 6e 65  ther limit is ne
1af70 67 61 74 69 76 65 2e 0a 20 20 20 20 2a 2f 0a 20  gative..    */. 
1af80 20 20 20 69 66 28 20 70 53 75 62 2d 3e 70 4c 69     if( pSub->pLi
1af90 6d 69 74 20 29 7b 0a 20 20 20 20 20 20 70 50 61  mit ){.      pPa
1afa0 72 65 6e 74 2d 3e 70 4c 69 6d 69 74 20 3d 20 70  rent->pLimit = p
1afb0 53 75 62 2d 3e 70 4c 69 6d 69 74 3b 0a 20 20 20  Sub->pLimit;.   
1afc0 20 20 20 70 53 75 62 2d 3e 70 4c 69 6d 69 74 20     pSub->pLimit 
1afd0 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  = 0;.    }.  }..
1afe0 20 20 2f 2a 20 46 69 6e 69 61 6c 6c 79 2c 20 64    /* Finially, d
1aff0 65 6c 65 74 65 20 77 68 61 74 20 69 73 20 6c 65  elete what is le
1b000 66 74 20 6f 66 20 74 68 65 20 73 75 62 71 75 65  ft of the subque
1b010 72 79 20 61 6e 64 20 72 65 74 75 72 6e 0a 20 20  ry and return.  
1b020 2a 2a 20 73 75 63 63 65 73 73 2e 0a 20 20 2a 2f  ** success..  */
1b030 0a 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74  .  sqlite3Select
1b040 44 65 6c 65 74 65 28 70 53 75 62 31 29 3b 0a 0a  Delete(pSub1);..
1b050 20 20 72 65 74 75 72 6e 20 31 3b 0a 7d 0a 23 65    return 1;.}.#e
1b060 6e 64 69 66 20 2f 2a 20 21 64 65 66 69 6e 65 64  ndif /* !defined
1b070 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42  (SQLITE_OMIT_SUB
1b080 51 55 45 52 59 29 20 7c 7c 20 21 64 65 66 69 6e  QUERY) || !defin
1b090 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56  ed(SQLITE_OMIT_V
1b0a0 49 45 57 29 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 41  IEW) */../*.** A
1b0b0 6e 61 6c 79 7a 65 20 74 68 65 20 53 45 4c 45 43  nalyze the SELEC
1b0c0 54 20 73 74 61 74 65 6d 65 6e 74 20 70 61 73 73  T statement pass
1b0d0 65 64 20 61 73 20 61 6e 20 61 72 67 75 6d 65 6e  ed as an argumen
1b0e0 74 20 74 6f 20 73 65 65 20 69 66 20 69 74 0a 2a  t to see if it.*
1b0f0 2a 20 69 73 20 61 20 6d 69 6e 28 29 20 6f 72 20  * is a min() or 
1b100 6d 61 78 28 29 20 71 75 65 72 79 2e 20 52 65 74  max() query. Ret
1b110 75 72 6e 20 57 48 45 52 45 5f 4f 52 44 45 52 42  urn WHERE_ORDERB
1b120 59 5f 4d 49 4e 20 6f 72 20 57 48 45 52 45 5f 4f  Y_MIN or WHERE_O
1b130 52 44 45 52 42 59 5f 4d 41 58 20 69 66 20 0a 2a  RDERBY_MAX if .*
1b140 2a 20 69 74 20 69 73 2c 20 6f 72 20 30 20 6f 74  * it is, or 0 ot
1b150 68 65 72 77 69 73 65 2e 20 41 74 20 70 72 65 73  herwise. At pres
1b160 65 6e 74 2c 20 61 20 71 75 65 72 79 20 69 73 20  ent, a query is 
1b170 63 6f 6e 73 69 64 65 72 65 64 20 74 6f 20 62 65  considered to be
1b180 0a 2a 2a 20 61 20 6d 69 6e 28 29 2f 6d 61 78 28  .** a min()/max(
1b190 29 20 71 75 65 72 79 20 69 66 3a 0a 2a 2a 0a 2a  ) query if:.**.*
1b1a0 2a 20 20 20 31 2e 20 54 68 65 72 65 20 69 73 20  *   1. There is 
1b1b0 61 20 73 69 6e 67 6c 65 20 6f 62 6a 65 63 74 20  a single object 
1b1c0 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75  in the FROM clau
1b1d0 73 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 32 2e 20 54  se..**.**   2. T
1b1e0 68 65 72 65 20 69 73 20 61 20 73 69 6e 67 6c 65  here is a single
1b1f0 20 65 78 70 72 65 73 73 69 6f 6e 20 69 6e 20 74   expression in t
1b200 68 65 20 72 65 73 75 6c 74 20 73 65 74 2c 20 61  he result set, a
1b210 6e 64 20 69 74 20 69 73 0a 2a 2a 20 20 20 20 20  nd it is.**     
1b220 20 65 69 74 68 65 72 20 6d 69 6e 28 78 29 20 6f   either min(x) o
1b230 72 20 6d 61 78 28 78 29 2c 20 77 68 65 72 65 20  r max(x), where 
1b240 78 20 69 73 20 61 20 63 6f 6c 75 6d 6e 20 72 65  x is a column re
1b250 66 65 72 65 6e 63 65 2e 0a 2a 2f 0a 73 74 61 74  ference..*/.stat
1b260 69 63 20 69 6e 74 20 6d 69 6e 4d 61 78 51 75 65  ic int minMaxQue
1b270 72 79 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  ry(Parse *pParse
1b280 2c 20 53 65 6c 65 63 74 20 2a 70 29 7b 0a 20 20  , Select *p){.  
1b290 45 78 70 72 20 2a 70 45 78 70 72 3b 0a 20 20 45  Expr *pExpr;.  E
1b2a0 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 20  xprList *pEList 
1b2b0 3d 20 70 2d 3e 70 45 4c 69 73 74 3b 0a 0a 20 20  = p->pEList;..  
1b2c0 69 66 28 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70  if( pEList->nExp
1b2d0 72 21 3d 31 20 29 20 72 65 74 75 72 6e 20 57 48  r!=1 ) return WH
1b2e0 45 52 45 5f 4f 52 44 45 52 42 59 5f 4e 4f 52 4d  ERE_ORDERBY_NORM
1b2f0 41 4c 3b 0a 20 20 70 45 78 70 72 20 3d 20 70 45  AL;.  pExpr = pE
1b300 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72  List->a[0].pExpr
1b310 3b 0a 20 20 70 45 4c 69 73 74 20 3d 20 70 45 78  ;.  pEList = pEx
1b320 70 72 2d 3e 70 4c 69 73 74 3b 0a 20 20 69 66 28  pr->pList;.  if(
1b330 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 41   pExpr->op!=TK_A
1b340 47 47 5f 46 55 4e 43 54 49 4f 4e 20 7c 7c 20 70  GG_FUNCTION || p
1b350 45 4c 69 73 74 3d 3d 30 20 7c 7c 20 70 45 4c 69  EList==0 || pELi
1b360 73 74 2d 3e 6e 45 78 70 72 21 3d 31 20 29 20 72  st->nExpr!=1 ) r
1b370 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 70  eturn 0;.  if( p
1b380 45 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70  EList->a[0].pExp
1b390 72 2d 3e 6f 70 21 3d 54 4b 5f 41 47 47 5f 43 4f  r->op!=TK_AGG_CO
1b3a0 4c 55 4d 4e 20 29 20 72 65 74 75 72 6e 20 57 48  LUMN ) return WH
1b3b0 45 52 45 5f 4f 52 44 45 52 42 59 5f 4e 4f 52 4d  ERE_ORDERBY_NORM
1b3c0 41 4c 3b 0a 20 20 69 66 28 20 70 45 78 70 72 2d  AL;.  if( pExpr-
1b3d0 3e 74 6f 6b 65 6e 2e 6e 21 3d 33 20 29 20 72 65  >token.n!=3 ) re
1b3e0 74 75 72 6e 20 57 48 45 52 45 5f 4f 52 44 45 52  turn WHERE_ORDER
1b3f0 42 59 5f 4e 4f 52 4d 41 4c 3b 0a 20 20 69 66 28  BY_NORMAL;.  if(
1b400 20 73 71 6c 69 74 65 33 53 74 72 4e 49 43 6d 70   sqlite3StrNICmp
1b410 28 28 63 68 61 72 2a 29 70 45 78 70 72 2d 3e 74  ((char*)pExpr->t
1b420 6f 6b 65 6e 2e 7a 2c 22 6d 69 6e 22 2c 33 29 3d  oken.z,"min",3)=
1b430 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  =0 ){.    return
1b440 20 57 48 45 52 45 5f 4f 52 44 45 52 42 59 5f 4d   WHERE_ORDERBY_M
1b450 49 4e 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20  IN;.  }else if( 
1b460 73 71 6c 69 74 65 33 53 74 72 4e 49 43 6d 70 28  sqlite3StrNICmp(
1b470 28 63 68 61 72 2a 29 70 45 78 70 72 2d 3e 74 6f  (char*)pExpr->to
1b480 6b 65 6e 2e 7a 2c 22 6d 61 78 22 2c 33 29 3d 3d  ken.z,"max",3)==
1b490 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  0 ){.    return 
1b4a0 57 48 45 52 45 5f 4f 52 44 45 52 42 59 5f 4d 41  WHERE_ORDERBY_MA
1b4b0 58 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  X;.  }.  return 
1b4c0 57 48 45 52 45 5f 4f 52 44 45 52 42 59 5f 4e 4f  WHERE_ORDERBY_NO
1b4d0 52 4d 41 4c 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  RMAL;.}../*.** T
1b4e0 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 73 6f  his routine reso
1b4f0 6c 76 65 73 20 61 6e 79 20 6e 61 6d 65 73 20 75  lves any names u
1b500 73 65 64 20 69 6e 20 74 68 65 20 72 65 73 75 6c  sed in the resul
1b510 74 20 73 65 74 20 6f 66 20 74 68 65 0a 2a 2a 20  t set of the.** 
1b520 73 75 70 70 6c 69 65 64 20 53 45 4c 45 43 54 20  supplied SELECT 
1b530 73 74 61 74 65 6d 65 6e 74 2e 20 49 66 20 74 68  statement. If th
1b540 65 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  e SELECT stateme
1b550 6e 74 20 62 65 69 6e 67 20 72 65 73 6f 6c 76 65  nt being resolve
1b560 64 0a 2a 2a 20 69 73 20 61 20 73 75 62 2d 73 65  d.** is a sub-se
1b570 6c 65 63 74 2c 20 74 68 65 6e 20 70 4f 75 74 65  lect, then pOute
1b580 72 4e 43 20 69 73 20 61 20 70 6f 69 6e 74 65 72  rNC is a pointer
1b590 20 74 6f 20 74 68 65 20 4e 61 6d 65 43 6f 6e 74   to the NameCont
1b5a0 65 78 74 20 0a 2a 2a 20 6f 66 20 74 68 65 20 70  ext .** of the p
1b5b0 61 72 65 6e 74 20 53 45 4c 45 43 54 2e 0a 2a 2f  arent SELECT..*/
1b5c0 0a 69 6e 74 20 73 71 6c 69 74 65 33 53 65 6c 65  .int sqlite3Sele
1b5d0 63 74 52 65 73 6f 6c 76 65 28 0a 20 20 50 61 72  ctResolve(.  Par
1b5e0 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20  se *pParse,     
1b5f0 20 20 20 20 2f 2a 20 54 68 65 20 70 61 72 73 65      /* The parse
1b600 72 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53  r context */.  S
1b610 65 6c 65 63 74 20 2a 70 2c 20 20 20 20 20 20 20  elect *p,       
1b620 20 20 20 20 20 20 2f 2a 20 54 68 65 20 53 45 4c        /* The SEL
1b630 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 62 65  ECT statement be
1b640 69 6e 67 20 63 6f 64 65 64 2e 20 2a 2f 0a 20 20  ing coded. */.  
1b650 4e 61 6d 65 43 6f 6e 74 65 78 74 20 2a 70 4f 75  NameContext *pOu
1b660 74 65 72 4e 43 20 20 2f 2a 20 54 68 65 20 6f 75  terNC  /* The ou
1b670 74 65 72 20 6e 61 6d 65 20 63 6f 6e 74 65 78 74  ter name context
1b680 2e 20 4d 61 79 20 62 65 20 4e 55 4c 4c 2e 20 2a  . May be NULL. *
1b690 2f 0a 29 7b 0a 20 20 45 78 70 72 4c 69 73 74 20  /.){.  ExprList 
1b6a0 2a 70 45 4c 69 73 74 3b 20 20 20 20 20 20 20 20  *pEList;        
1b6b0 20 20 2f 2a 20 52 65 73 75 6c 74 20 73 65 74 2e    /* Result set.
1b6c0 20 2a 2f 0a 20 20 69 6e 74 20 69 3b 20 20 20 20   */.  int i;    
1b6d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b6e0 20 2f 2a 20 46 6f 72 2d 6c 6f 6f 70 20 76 61 72   /* For-loop var
1b6f0 69 61 62 6c 65 20 75 73 65 64 20 69 6e 20 6d 75  iable used in mu
1b700 6c 74 69 70 6c 65 20 70 6c 61 63 65 73 20 2a 2f  ltiple places */
1b710 0a 20 20 4e 61 6d 65 43 6f 6e 74 65 78 74 20 73  .  NameContext s
1b720 4e 43 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  NC;           /*
1b730 20 4c 6f 63 61 6c 20 6e 61 6d 65 2d 63 6f 6e 74   Local name-cont
1b740 65 78 74 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73  ext */.  ExprLis
1b750 74 20 2a 70 47 72 6f 75 70 42 79 3b 20 20 20 20  t *pGroupBy;    
1b760 20 20 20 20 2f 2a 20 54 68 65 20 67 72 6f 75 70      /* The group
1b770 20 62 79 20 63 6c 61 75 73 65 20 2a 2f 0a 0a 20   by clause */.. 
1b780 20 2f 2a 20 49 66 20 74 68 69 73 20 72 6f 75 74   /* If this rout
1b790 69 6e 65 20 68 61 73 20 72 75 6e 20 62 65 66 6f  ine has run befo
1b7a0 72 65 2c 20 72 65 74 75 72 6e 20 69 6d 6d 65 64  re, return immed
1b7b0 69 61 74 65 6c 79 2e 20 2a 2f 0a 20 20 69 66 28  iately. */.  if(
1b7c0 20 70 2d 3e 69 73 52 65 73 6f 6c 76 65 64 20 29   p->isResolved )
1b7d0 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 21 70  {.    assert( !p
1b7e0 4f 75 74 65 72 4e 43 20 29 3b 0a 20 20 20 20 72  OuterNC );.    r
1b7f0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
1b800 0a 20 20 7d 0a 20 20 70 2d 3e 69 73 52 65 73 6f  .  }.  p->isReso
1b810 6c 76 65 64 20 3d 20 31 3b 0a 0a 20 20 2f 2a 20  lved = 1;..  /* 
1b820 49 66 20 74 68 65 72 65 20 68 61 76 65 20 61 6c  If there have al
1b830 72 65 61 64 79 20 62 65 65 6e 20 65 72 72 6f 72  ready been error
1b840 73 2c 20 64 6f 20 6e 6f 74 68 69 6e 67 2e 20 2a  s, do nothing. *
1b850 2f 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e  /.  if( pParse->
1b860 6e 45 72 72 3e 30 20 29 7b 0a 20 20 20 20 72 65  nErr>0 ){.    re
1b870 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f  turn SQLITE_ERRO
1b880 52 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 50 72 65  R;.  }..  /* Pre
1b890 70 61 72 65 20 74 68 65 20 73 65 6c 65 63 74 20  pare the select 
1b8a0 73 74 61 74 65 6d 65 6e 74 2e 20 54 68 69 73 20  statement. This 
1b8b0 63 61 6c 6c 20 77 69 6c 6c 20 61 6c 6c 6f 63 61  call will alloca
1b8c0 74 65 20 61 6c 6c 20 63 75 72 73 6f 72 73 0a 20  te all cursors. 
1b8d0 20 2a 2a 20 72 65 71 75 69 72 65 64 20 74 6f 20   ** required to 
1b8e0 68 61 6e 64 6c 65 20 74 68 65 20 74 61 62 6c 65  handle the table
1b8f0 73 20 61 6e 64 20 73 75 62 71 75 65 72 69 65 73  s and subqueries
1b900 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61   in the FROM cla
1b910 75 73 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  use..  */.  if( 
1b920 70 72 65 70 53 65 6c 65 63 74 53 74 6d 74 28 70  prepSelectStmt(p
1b930 50 61 72 73 65 2c 20 70 29 20 29 7b 0a 20 20 20  Parse, p) ){.   
1b940 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45   return SQLITE_E
1b950 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  RROR;.  }..  /* 
1b960 52 65 73 6f 6c 76 65 20 74 68 65 20 65 78 70 72  Resolve the expr
1b970 65 73 73 69 6f 6e 73 20 69 6e 20 74 68 65 20 4c  essions in the L
1b980 49 4d 49 54 20 61 6e 64 20 4f 46 46 53 45 54 20  IMIT and OFFSET 
1b990 63 6c 61 75 73 65 73 2e 20 54 68 65 73 65 0a 20  clauses. These. 
1b9a0 20 2a 2a 20 61 72 65 20 6e 6f 74 20 61 6c 6c 6f   ** are not allo
1b9b0 77 65 64 20 74 6f 20 72 65 66 65 72 20 74 6f 20  wed to refer to 
1b9c0 61 6e 79 20 6e 61 6d 65 73 2c 20 73 6f 20 70 61  any names, so pa
1b9d0 73 73 20 61 6e 20 65 6d 70 74 79 20 4e 61 6d 65  ss an empty Name
1b9e0 43 6f 6e 74 65 78 74 2e 0a 20 20 2a 2f 0a 20 20  Context..  */.  
1b9f0 6d 65 6d 73 65 74 28 26 73 4e 43 2c 20 30 2c 20  memset(&sNC, 0, 
1ba00 73 69 7a 65 6f 66 28 73 4e 43 29 29 3b 0a 20 20  sizeof(sNC));.  
1ba10 73 4e 43 2e 70 50 61 72 73 65 20 3d 20 70 50 61  sNC.pParse = pPa
1ba20 72 73 65 3b 0a 20 20 69 66 28 20 73 71 6c 69 74  rse;.  if( sqlit
1ba30 65 33 45 78 70 72 52 65 73 6f 6c 76 65 4e 61 6d  e3ExprResolveNam
1ba40 65 73 28 26 73 4e 43 2c 20 70 2d 3e 70 4c 69 6d  es(&sNC, p->pLim
1ba50 69 74 29 20 7c 7c 0a 20 20 20 20 20 20 73 71 6c  it) ||.      sql
1ba60 69 74 65 33 45 78 70 72 52 65 73 6f 6c 76 65 4e  ite3ExprResolveN
1ba70 61 6d 65 73 28 26 73 4e 43 2c 20 70 2d 3e 70 4f  ames(&sNC, p->pO
1ba80 66 66 73 65 74 29 20 29 7b 0a 20 20 20 20 72 65  ffset) ){.    re
1ba90 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f  turn SQLITE_ERRO
1baa0 52 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 65 74  R;.  }..  /* Set
1bab0 20 75 70 20 74 68 65 20 6c 6f 63 61 6c 20 6e 61   up the local na
1bac0 6d 65 2d 63 6f 6e 74 65 78 74 20 74 6f 20 70 61  me-context to pa
1bad0 73 73 20 74 6f 20 45 78 70 72 52 65 73 6f 6c 76  ss to ExprResolv
1bae0 65 4e 61 6d 65 73 28 29 20 74 6f 0a 20 20 2a 2a  eNames() to.  **
1baf0 20 72 65 73 6f 6c 76 65 20 74 68 65 20 65 78 70   resolve the exp
1bb00 72 65 73 73 69 6f 6e 2d 6c 69 73 74 2e 0a 20 20  ression-list..  
1bb10 2a 2f 0a 20 20 73 4e 43 2e 61 6c 6c 6f 77 41 67  */.  sNC.allowAg
1bb20 67 20 3d 20 31 3b 0a 20 20 73 4e 43 2e 70 53 72  g = 1;.  sNC.pSr
1bb30 63 4c 69 73 74 20 3d 20 70 2d 3e 70 53 72 63 3b  cList = p->pSrc;
1bb40 0a 20 20 73 4e 43 2e 70 4e 65 78 74 20 3d 20 70  .  sNC.pNext = p
1bb50 4f 75 74 65 72 4e 43 3b 0a 0a 20 20 2f 2a 20 52  OuterNC;..  /* R
1bb60 65 73 6f 6c 76 65 20 6e 61 6d 65 73 20 69 6e 20  esolve names in 
1bb70 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 2e 20  the result set. 
1bb80 2a 2f 0a 20 20 70 45 4c 69 73 74 20 3d 20 70 2d  */.  pEList = p-
1bb90 3e 70 45 4c 69 73 74 3b 0a 20 20 69 66 28 20 21  >pEList;.  if( !
1bba0 70 45 4c 69 73 74 20 29 20 72 65 74 75 72 6e 20  pEList ) return 
1bbb0 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20  SQLITE_ERROR;.  
1bbc0 66 6f 72 28 69 3d 30 3b 20 69 3c 70 45 4c 69 73  for(i=0; i<pELis
1bbd0 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a  t->nExpr; i++){.
1bbe0 20 20 20 20 45 78 70 72 20 2a 70 58 20 3d 20 70      Expr *pX = p
1bbf0 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70  EList->a[i].pExp
1bc00 72 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74  r;.    if( sqlit
1bc10 65 33 45 78 70 72 52 65 73 6f 6c 76 65 4e 61 6d  e3ExprResolveNam
1bc20 65 73 28 26 73 4e 43 2c 20 70 58 29 20 29 7b 0a  es(&sNC, pX) ){.
1bc30 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
1bc40 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d  ITE_ERROR;.    }
1bc50 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68  .  }..  /* If th
1bc60 65 72 65 20 61 72 65 20 6e 6f 20 61 67 67 72 65  ere are no aggre
1bc70 67 61 74 65 20 66 75 6e 63 74 69 6f 6e 73 20 69  gate functions i
1bc80 6e 20 74 68 65 20 72 65 73 75 6c 74 2d 73 65 74  n the result-set
1bc90 2c 20 61 6e 64 20 6e 6f 20 47 52 4f 55 50 20 42  , and no GROUP B
1bca0 59 20 0a 20 20 2a 2a 20 65 78 70 72 65 73 73 69  Y .  ** expressi
1bcb0 6f 6e 2c 20 64 6f 20 6e 6f 74 20 61 6c 6c 6f 77  on, do not allow
1bcc0 20 61 67 67 72 65 67 61 74 65 73 20 69 6e 20 61   aggregates in a
1bcd0 6e 79 20 6f 66 20 74 68 65 20 6f 74 68 65 72 20  ny of the other 
1bce0 65 78 70 72 65 73 73 69 6f 6e 73 2e 0a 20 20 2a  expressions..  *
1bcf0 2f 0a 20 20 61 73 73 65 72 74 28 20 21 70 2d 3e  /.  assert( !p->
1bd00 69 73 41 67 67 20 29 3b 0a 20 20 70 47 72 6f 75  isAgg );.  pGrou
1bd10 70 42 79 20 3d 20 70 2d 3e 70 47 72 6f 75 70 42  pBy = p->pGroupB
1bd20 79 3b 0a 20 20 69 66 28 20 70 47 72 6f 75 70 42  y;.  if( pGroupB
1bd30 79 20 7c 7c 20 73 4e 43 2e 68 61 73 41 67 67 20  y || sNC.hasAgg 
1bd40 29 7b 0a 20 20 20 20 70 2d 3e 69 73 41 67 67 20  ){.    p->isAgg 
1bd50 3d 20 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  = 1;.  }else{.  
1bd60 20 20 73 4e 43 2e 61 6c 6c 6f 77 41 67 67 20 3d    sNC.allowAgg =
1bd70 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66   0;.  }..  /* If
1bd80 20 61 20 48 41 56 49 4e 47 20 63 6c 61 75 73 65   a HAVING clause
1bd90 20 69 73 20 70 72 65 73 65 6e 74 2c 20 74 68 65   is present, the
1bda0 6e 20 74 68 65 72 65 20 6d 75 73 74 20 62 65 20  n there must be 
1bdb0 61 20 47 52 4f 55 50 20 42 59 20 63 6c 61 75 73  a GROUP BY claus
1bdc0 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d  e..  */.  if( p-
1bdd0 3e 70 48 61 76 69 6e 67 20 26 26 20 21 70 47 72  >pHaving && !pGr
1bde0 6f 75 70 42 79 20 29 7b 0a 20 20 20 20 73 71 6c  oupBy ){.    sql
1bdf0 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
1be00 72 73 65 2c 20 22 61 20 47 52 4f 55 50 20 42 59  rse, "a GROUP BY
1be10 20 63 6c 61 75 73 65 20 69 73 20 72 65 71 75 69   clause is requi
1be20 72 65 64 20 62 65 66 6f 72 65 20 48 41 56 49 4e  red before HAVIN
1be30 47 22 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  G");.    return 
1be40 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20  SQLITE_ERROR;.  
1be50 7d 0a 0a 20 20 2f 2a 20 41 64 64 20 74 68 65 20  }..  /* Add the 
1be60 65 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 20  expression list 
1be70 74 6f 20 74 68 65 20 6e 61 6d 65 2d 63 6f 6e 74  to the name-cont
1be80 65 78 74 20 62 65 66 6f 72 65 20 70 61 72 73 69  ext before parsi
1be90 6e 67 20 74 68 65 0a 20 20 2a 2a 20 6f 74 68 65  ng the.  ** othe
1bea0 72 20 65 78 70 72 65 73 73 69 6f 6e 73 20 69 6e  r expressions in
1beb0 20 74 68 65 20 53 45 4c 45 43 54 20 73 74 61 74   the SELECT stat
1bec0 65 6d 65 6e 74 2e 20 54 68 69 73 20 69 73 20 73  ement. This is s
1bed0 6f 20 74 68 61 74 0a 20 20 2a 2a 20 65 78 70 72  o that.  ** expr
1bee0 65 73 73 69 6f 6e 73 20 69 6e 20 74 68 65 20 57  essions in the W
1bef0 48 45 52 45 20 63 6c 61 75 73 65 20 28 65 74 63  HERE clause (etc
1bf00 2e 29 20 63 61 6e 20 72 65 66 65 72 20 74 6f 20  .) can refer to 
1bf10 65 78 70 72 65 73 73 69 6f 6e 73 20 62 79 0a 20  expressions by. 
1bf20 20 2a 2a 20 61 6c 69 61 73 65 73 20 69 6e 20 74   ** aliases in t
1bf30 68 65 20 72 65 73 75 6c 74 20 73 65 74 2e 0a 20  he result set.. 
1bf40 20 2a 2a 0a 20 20 2a 2a 20 4d 69 6e 6f 72 20 70   **.  ** Minor p
1bf50 6f 69 6e 74 3a 20 49 66 20 74 68 69 73 20 69 73  oint: If this is
1bf60 20 74 68 65 20 63 61 73 65 2c 20 74 68 65 6e 20   the case, then 
1bf70 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 77  the expression w
1bf80 69 6c 6c 20 62 65 0a 20 20 2a 2a 20 72 65 2d 65  ill be.  ** re-e
1bf90 76 61 6c 75 61 74 65 64 20 66 6f 72 20 65 61 63  valuated for eac
1bfa0 68 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20 69  h reference to i
1bfb0 74 2e 0a 20 20 2a 2f 0a 20 20 73 4e 43 2e 70 45  t..  */.  sNC.pE
1bfc0 4c 69 73 74 20 3d 20 70 2d 3e 70 45 4c 69 73 74  List = p->pEList
1bfd0 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 45  ;.  if( sqlite3E
1bfe0 78 70 72 52 65 73 6f 6c 76 65 4e 61 6d 65 73 28  xprResolveNames(
1bff0 26 73 4e 43 2c 20 70 2d 3e 70 57 68 65 72 65 29  &sNC, p->pWhere)
1c000 20 7c 7c 0a 20 20 20 20 20 73 71 6c 69 74 65 33   ||.     sqlite3
1c010 45 78 70 72 52 65 73 6f 6c 76 65 4e 61 6d 65 73  ExprResolveNames
1c020 28 26 73 4e 43 2c 20 70 2d 3e 70 48 61 76 69 6e  (&sNC, p->pHavin
1c030 67 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  g) ){.    return
1c040 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20   SQLITE_ERROR;. 
1c050 20 7d 0a 20 20 69 66 28 20 70 2d 3e 70 50 72 69   }.  if( p->pPri
1c060 6f 72 3d 3d 30 20 29 7b 0a 20 20 20 20 69 66 28  or==0 ){.    if(
1c070 20 70 72 6f 63 65 73 73 4f 72 64 65 72 47 72 6f   processOrderGro
1c080 75 70 42 79 28 70 50 61 72 73 65 2c 20 70 2c 20  upBy(pParse, p, 
1c090 70 2d 3e 70 4f 72 64 65 72 42 79 2c 20 31 2c 20  p->pOrderBy, 1, 
1c0a0 26 73 4e 43 2e 68 61 73 41 67 67 29 20 29 7b 0a  &sNC.hasAgg) ){.
1c0b0 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
1c0c0 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d  ITE_ERROR;.    }
1c0d0 0a 20 20 7d 0a 20 20 69 66 28 20 70 72 6f 63 65  .  }.  if( proce
1c0e0 73 73 4f 72 64 65 72 47 72 6f 75 70 42 79 28 70  ssOrderGroupBy(p
1c0f0 50 61 72 73 65 2c 20 70 2c 20 70 47 72 6f 75 70  Parse, p, pGroup
1c100 42 79 2c 20 30 2c 20 26 73 4e 43 2e 68 61 73 41  By, 0, &sNC.hasA
1c110 67 67 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72  gg) ){.    retur
1c120 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a  n SQLITE_ERROR;.
1c130 20 20 7d 0a 0a 20 20 69 66 28 20 70 50 61 72 73    }..  if( pPars
1c140 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  e->db->mallocFai
1c150 6c 65 64 20 29 7b 0a 20 20 20 20 72 65 74 75 72  led ){.    retur
1c160 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  n SQLITE_NOMEM;.
1c170 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 73    }..  /* Make s
1c180 75 72 65 20 74 68 65 20 47 52 4f 55 50 20 42 59  ure the GROUP BY
1c190 20 63 6c 61 75 73 65 20 64 6f 65 73 20 6e 6f 74   clause does not
1c1a0 20 63 6f 6e 74 61 69 6e 20 61 67 67 72 65 67 61   contain aggrega
1c1b0 74 65 20 66 75 6e 63 74 69 6f 6e 73 2e 0a 20 20  te functions..  
1c1c0 2a 2f 0a 20 20 69 66 28 20 70 47 72 6f 75 70 42  */.  if( pGroupB
1c1d0 79 20 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20  y ){.    struct 
1c1e0 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70  ExprList_item *p
1c1f0 49 74 65 6d 3b 0a 20 20 0a 20 20 20 20 66 6f 72  Item;.  .    for
1c200 28 69 3d 30 2c 20 70 49 74 65 6d 3d 70 47 72 6f  (i=0, pItem=pGro
1c210 75 70 42 79 2d 3e 61 3b 20 69 3c 70 47 72 6f 75  upBy->a; i<pGrou
1c220 70 42 79 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 2c  pBy->nExpr; i++,
1c230 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 20   pItem++){.     
1c240 20 69 66 28 20 45 78 70 72 48 61 73 50 72 6f 70   if( ExprHasProp
1c250 65 72 74 79 28 70 49 74 65 6d 2d 3e 70 45 78 70  erty(pItem->pExp
1c260 72 2c 20 45 50 5f 41 67 67 29 20 29 7b 0a 20 20  r, EP_Agg) ){.  
1c270 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72        sqlite3Err
1c280 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 61  orMsg(pParse, "a
1c290 67 67 72 65 67 61 74 65 20 66 75 6e 63 74 69 6f  ggregate functio
1c2a0 6e 73 20 61 72 65 20 6e 6f 74 20 61 6c 6c 6f 77  ns are not allow
1c2b0 65 64 20 69 6e 20 22 0a 20 20 20 20 20 20 20 20  ed in ".        
1c2c0 20 20 20 20 22 74 68 65 20 47 52 4f 55 50 20 42      "the GROUP B
1c2d0 59 20 63 6c 61 75 73 65 22 29 3b 0a 20 20 20 20  Y clause");.    
1c2e0 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
1c2f0 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 7d  E_ERROR;.      }
1c300 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
1c310 20 49 66 20 74 68 69 73 20 69 73 20 6f 6e 65 20   If this is one 
1c320 53 45 4c 45 43 54 20 6f 66 20 61 20 63 6f 6d 70  SELECT of a comp
1c330 6f 75 6e 64 2c 20 62 65 20 73 75 72 65 20 74 6f  ound, be sure to
1c340 20 72 65 73 6f 6c 76 65 20 6e 61 6d 65 73 0a 20   resolve names. 
1c350 20 2a 2a 20 69 6e 20 74 68 65 20 6f 74 68 65 72   ** in the other
1c360 20 53 45 4c 45 43 54 73 2e 0a 20 20 2a 2f 0a 20   SELECTs..  */. 
1c370 20 69 66 28 20 70 2d 3e 70 50 72 69 6f 72 20 29   if( p->pPrior )
1c380 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 73 71 6c  {.    return sql
1c390 69 74 65 33 53 65 6c 65 63 74 52 65 73 6f 6c 76  ite3SelectResolv
1c3a0 65 28 70 50 61 72 73 65 2c 20 70 2d 3e 70 50 72  e(pParse, p->pPr
1c3b0 69 6f 72 2c 20 70 4f 75 74 65 72 4e 43 29 3b 0a  ior, pOuterNC);.
1c3c0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65 74    }else{.    ret
1c3d0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
1c3e0 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 73 65   }.}../*.** Rese
1c3f0 74 20 74 68 65 20 61 67 67 72 65 67 61 74 65 20  t the aggregate 
1c400 61 63 63 75 6d 75 6c 61 74 6f 72 2e 0a 2a 2a 0a  accumulator..**.
1c410 2a 2a 20 54 68 65 20 61 67 67 72 65 67 61 74 65  ** The aggregate
1c420 20 61 63 63 75 6d 75 6c 61 74 6f 72 20 69 73 20   accumulator is 
1c430 61 20 73 65 74 20 6f 66 20 6d 65 6d 6f 72 79 20  a set of memory 
1c440 63 65 6c 6c 73 20 74 68 61 74 20 68 6f 6c 64 0a  cells that hold.
1c450 2a 2a 20 69 6e 74 65 72 6d 65 64 69 61 74 65 20  ** intermediate 
1c460 72 65 73 75 6c 74 73 20 77 68 69 6c 65 20 63 61  results while ca
1c470 6c 63 75 6c 61 74 69 6e 67 20 61 6e 20 61 67 67  lculating an agg
1c480 72 65 67 61 74 65 2e 20 20 54 68 69 73 0a 2a 2a  regate.  This.**
1c490 20 72 6f 75 74 69 6e 65 20 73 69 6d 70 6c 79 20   routine simply 
1c4a0 73 74 6f 72 65 73 20 4e 55 4c 4c 73 20 69 6e 20  stores NULLs in 
1c4b0 61 6c 6c 20 6f 66 20 74 68 6f 73 65 20 6d 65 6d  all of those mem
1c4c0 6f 72 79 20 63 65 6c 6c 73 2e 0a 2a 2f 0a 73 74  ory cells..*/.st
1c4d0 61 74 69 63 20 76 6f 69 64 20 72 65 73 65 74 41  atic void resetA
1c4e0 63 63 75 6d 75 6c 61 74 6f 72 28 50 61 72 73 65  ccumulator(Parse
1c4f0 20 2a 70 50 61 72 73 65 2c 20 41 67 67 49 6e 66   *pParse, AggInf
1c500 6f 20 2a 70 41 67 67 49 6e 66 6f 29 7b 0a 20 20  o *pAggInfo){.  
1c510 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65  Vdbe *v = pParse
1c520 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74 20 69  ->pVdbe;.  int i
1c530 3b 0a 20 20 73 74 72 75 63 74 20 41 67 67 49 6e  ;.  struct AggIn
1c540 66 6f 5f 66 75 6e 63 20 2a 70 46 75 6e 63 3b 0a  fo_func *pFunc;.
1c550 20 20 69 66 28 20 70 41 67 67 49 6e 66 6f 2d 3e    if( pAggInfo->
1c560 6e 46 75 6e 63 2b 70 41 67 67 49 6e 66 6f 2d 3e  nFunc+pAggInfo->
1c570 6e 43 6f 6c 75 6d 6e 3d 3d 30 20 29 7b 0a 20 20  nColumn==0 ){.  
1c580 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20    return;.  }.  
1c590 66 6f 72 28 69 3d 30 3b 20 69 3c 70 41 67 67 49  for(i=0; i<pAggI
1c5a0 6e 66 6f 2d 3e 6e 43 6f 6c 75 6d 6e 3b 20 69 2b  nfo->nColumn; i+
1c5b0 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  +){.    sqlite3V
1c5c0 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
1c5d0 4e 75 6c 6c 2c 20 30 2c 20 70 41 67 67 49 6e 66  Null, 0, pAggInf
1c5e0 6f 2d 3e 61 43 6f 6c 5b 69 5d 2e 69 4d 65 6d 29  o->aCol[i].iMem)
1c5f0 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 70 46 75 6e  ;.  }.  for(pFun
1c600 63 3d 70 41 67 67 49 6e 66 6f 2d 3e 61 46 75 6e  c=pAggInfo->aFun
1c610 63 2c 20 69 3d 30 3b 20 69 3c 70 41 67 67 49 6e  c, i=0; i<pAggIn
1c620 66 6f 2d 3e 6e 46 75 6e 63 3b 20 69 2b 2b 2c 20  fo->nFunc; i++, 
1c630 70 46 75 6e 63 2b 2b 29 7b 0a 20 20 20 20 73 71  pFunc++){.    sq
1c640 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
1c650 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20 70  v, OP_Null, 0, p
1c660 46 75 6e 63 2d 3e 69 4d 65 6d 29 3b 0a 20 20 20  Func->iMem);.   
1c670 20 69 66 28 20 70 46 75 6e 63 2d 3e 69 44 69 73   if( pFunc->iDis
1c680 74 69 6e 63 74 3e 3d 30 20 29 7b 0a 20 20 20 20  tinct>=0 ){.    
1c690 20 20 45 78 70 72 20 2a 70 45 20 3d 20 70 46 75    Expr *pE = pFu
1c6a0 6e 63 2d 3e 70 45 78 70 72 3b 0a 20 20 20 20 20  nc->pExpr;.     
1c6b0 20 69 66 28 20 70 45 2d 3e 70 4c 69 73 74 3d 3d   if( pE->pList==
1c6c0 30 20 7c 7c 20 70 45 2d 3e 70 4c 69 73 74 2d 3e  0 || pE->pList->
1c6d0 6e 45 78 70 72 21 3d 31 20 29 7b 0a 20 20 20 20  nExpr!=1 ){.    
1c6e0 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
1c6f0 4d 73 67 28 70 50 61 72 73 65 2c 20 22 44 49 53  Msg(pParse, "DIS
1c700 54 49 4e 43 54 20 69 6e 20 61 67 67 72 65 67 61  TINCT in aggrega
1c710 74 65 20 6d 75 73 74 20 62 65 20 66 6f 6c 6c 6f  te must be follo
1c720 77 65 64 20 22 0a 20 20 20 20 20 20 20 20 20 20  wed ".          
1c730 20 22 62 79 20 61 6e 20 65 78 70 72 65 73 73 69   "by an expressi
1c740 6f 6e 22 29 3b 0a 20 20 20 20 20 20 20 20 70 46  on");.        pF
1c750 75 6e 63 2d 3e 69 44 69 73 74 69 6e 63 74 20 3d  unc->iDistinct =
1c760 20 2d 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65   -1;.      }else
1c770 7b 0a 20 20 20 20 20 20 20 20 4b 65 79 49 6e 66  {.        KeyInf
1c780 6f 20 2a 70 4b 65 79 49 6e 66 6f 20 3d 20 6b 65  o *pKeyInfo = ke
1c790 79 49 6e 66 6f 46 72 6f 6d 45 78 70 72 4c 69 73  yInfoFromExprLis
1c7a0 74 28 70 50 61 72 73 65 2c 20 70 45 2d 3e 70 4c  t(pParse, pE->pL
1c7b0 69 73 74 29 3b 0a 20 20 20 20 20 20 20 20 73 71  ist);.        sq
1c7c0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28  lite3VdbeAddOp4(
1c7d0 76 2c 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65  v, OP_OpenEpheme
1c7e0 72 61 6c 2c 20 70 46 75 6e 63 2d 3e 69 44 69 73  ral, pFunc->iDis
1c7f0 74 69 6e 63 74 2c 20 30 2c 20 30 2c 0a 20 20 20  tinct, 0, 0,.   
1c800 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c810 20 20 20 20 20 20 20 28 63 68 61 72 2a 29 70 4b         (char*)pK
1c820 65 79 49 6e 66 6f 2c 20 50 34 5f 4b 45 59 49 4e  eyInfo, P4_KEYIN
1c830 46 4f 5f 48 41 4e 44 4f 46 46 29 3b 0a 20 20 20  FO_HANDOFF);.   
1c840 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d     }.    }.  }.}
1c850 0a 0a 2f 2a 0a 2a 2a 20 49 6e 76 6f 6b 65 20 74  ../*.** Invoke t
1c860 68 65 20 4f 50 5f 41 67 67 46 69 6e 61 6c 69 7a  he OP_AggFinaliz
1c870 65 20 6f 70 63 6f 64 65 20 66 6f 72 20 65 76 65  e opcode for eve
1c880 72 79 20 61 67 67 72 65 67 61 74 65 20 66 75 6e  ry aggregate fun
1c890 63 74 69 6f 6e 0a 2a 2a 20 69 6e 20 74 68 65 20  ction.** in the 
1c8a0 41 67 67 49 6e 66 6f 20 73 74 72 75 63 74 75 72  AggInfo structur
1c8b0 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  e..*/.static voi
1c8c0 64 20 66 69 6e 61 6c 69 7a 65 41 67 67 46 75 6e  d finalizeAggFun
1c8d0 63 74 69 6f 6e 73 28 50 61 72 73 65 20 2a 70 50  ctions(Parse *pP
1c8e0 61 72 73 65 2c 20 41 67 67 49 6e 66 6f 20 2a 70  arse, AggInfo *p
1c8f0 41 67 67 49 6e 66 6f 29 7b 0a 20 20 56 64 62 65  AggInfo){.  Vdbe
1c900 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56   *v = pParse->pV
1c910 64 62 65 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  dbe;.  int i;.  
1c920 73 74 72 75 63 74 20 41 67 67 49 6e 66 6f 5f 66  struct AggInfo_f
1c930 75 6e 63 20 2a 70 46 3b 0a 20 20 66 6f 72 28 69  unc *pF;.  for(i
1c940 3d 30 2c 20 70 46 3d 70 41 67 67 49 6e 66 6f 2d  =0, pF=pAggInfo-
1c950 3e 61 46 75 6e 63 3b 20 69 3c 70 41 67 67 49 6e  >aFunc; i<pAggIn
1c960 66 6f 2d 3e 6e 46 75 6e 63 3b 20 69 2b 2b 2c 20  fo->nFunc; i++, 
1c970 70 46 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72 4c  pF++){.    ExprL
1c980 69 73 74 20 2a 70 4c 69 73 74 20 3d 20 70 46 2d  ist *pList = pF-
1c990 3e 70 45 78 70 72 2d 3e 70 4c 69 73 74 3b 0a 20  >pExpr->pList;. 
1c9a0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
1c9b0 64 4f 70 34 28 76 2c 20 4f 50 5f 41 67 67 46 69  dOp4(v, OP_AggFi
1c9c0 6e 61 6c 2c 20 70 46 2d 3e 69 4d 65 6d 2c 20 70  nal, pF->iMem, p
1c9d0 4c 69 73 74 20 3f 20 70 4c 69 73 74 2d 3e 6e 45  List ? pList->nE
1c9e0 78 70 72 20 3a 20 30 2c 20 30 2c 0a 20 20 20 20  xpr : 0, 0,.    
1c9f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ca00 20 20 28 76 6f 69 64 2a 29 70 46 2d 3e 70 46 75    (void*)pF->pFu
1ca10 6e 63 2c 20 50 34 5f 46 55 4e 43 44 45 46 29 3b  nc, P4_FUNCDEF);
1ca20 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 70  .  }.}../*.** Up
1ca30 64 61 74 65 20 74 68 65 20 61 63 63 75 6d 75 6c  date the accumul
1ca40 61 74 6f 72 20 6d 65 6d 6f 72 79 20 63 65 6c 6c  ator memory cell
1ca50 73 20 66 6f 72 20 61 6e 20 61 67 67 72 65 67 61  s for an aggrega
1ca60 74 65 20 62 61 73 65 64 20 6f 6e 0a 2a 2a 20 74  te based on.** t
1ca70 68 65 20 63 75 72 72 65 6e 74 20 63 75 72 73 6f  he current curso
1ca80 72 20 70 6f 73 69 74 69 6f 6e 2e 0a 2a 2f 0a 73  r position..*/.s
1ca90 74 61 74 69 63 20 76 6f 69 64 20 75 70 64 61 74  tatic void updat
1caa0 65 41 63 63 75 6d 75 6c 61 74 6f 72 28 50 61 72  eAccumulator(Par
1cab0 73 65 20 2a 70 50 61 72 73 65 2c 20 41 67 67 49  se *pParse, AggI
1cac0 6e 66 6f 20 2a 70 41 67 67 49 6e 66 6f 29 7b 0a  nfo *pAggInfo){.
1cad0 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72    Vdbe *v = pPar
1cae0 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74  se->pVdbe;.  int
1caf0 20 69 3b 0a 20 20 73 74 72 75 63 74 20 41 67 67   i;.  struct Agg
1cb00 49 6e 66 6f 5f 66 75 6e 63 20 2a 70 46 3b 0a 20  Info_func *pF;. 
1cb10 20 73 74 72 75 63 74 20 41 67 67 49 6e 66 6f 5f   struct AggInfo_
1cb20 63 6f 6c 20 2a 70 43 3b 0a 0a 20 20 70 41 67 67  col *pC;..  pAgg
1cb30 49 6e 66 6f 2d 3e 64 69 72 65 63 74 4d 6f 64 65  Info->directMode
1cb40 20 3d 20 31 3b 0a 20 20 66 6f 72 28 69 3d 30 2c   = 1;.  for(i=0,
1cb50 20 70 46 3d 70 41 67 67 49 6e 66 6f 2d 3e 61 46   pF=pAggInfo->aF
1cb60 75 6e 63 3b 20 69 3c 70 41 67 67 49 6e 66 6f 2d  unc; i<pAggInfo-
1cb70 3e 6e 46 75 6e 63 3b 20 69 2b 2b 2c 20 70 46 2b  >nFunc; i++, pF+
1cb80 2b 29 7b 0a 20 20 20 20 69 6e 74 20 6e 41 72 67  +){.    int nArg
1cb90 3b 0a 20 20 20 20 69 6e 74 20 61 64 64 72 4e 65  ;.    int addrNe
1cba0 78 74 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20  xt = 0;.    int 
1cbb0 72 65 67 41 67 67 3b 0a 20 20 20 20 45 78 70 72  regAgg;.    Expr
1cbc0 4c 69 73 74 20 2a 70 4c 69 73 74 20 3d 20 70 46  List *pList = pF
1cbd0 2d 3e 70 45 78 70 72 2d 3e 70 4c 69 73 74 3b 0a  ->pExpr->pList;.
1cbe0 20 20 20 20 69 66 28 20 70 4c 69 73 74 20 29 7b      if( pList ){
1cbf0 0a 20 20 20 20 20 20 6e 41 72 67 20 3d 20 70 4c  .      nArg = pL
1cc00 69 73 74 2d 3e 6e 45 78 70 72 3b 0a 20 20 20 20  ist->nExpr;.    
1cc10 20 20 72 65 67 41 67 67 20 3d 20 73 71 6c 69 74    regAgg = sqlit
1cc20 65 33 47 65 74 54 65 6d 70 52 61 6e 67 65 28 70  e3GetTempRange(p
1cc30 50 61 72 73 65 2c 20 6e 41 72 67 29 3b 0a 20 20  Parse, nArg);.  
1cc40 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
1cc50 6f 64 65 45 78 70 72 4c 69 73 74 28 70 50 61 72  odeExprList(pPar
1cc60 73 65 2c 20 70 4c 69 73 74 2c 20 72 65 67 41 67  se, pList, regAg
1cc70 67 2c 20 30 29 3b 0a 20 20 20 20 7d 65 6c 73 65  g, 0);.    }else
1cc80 7b 0a 20 20 20 20 20 20 6e 41 72 67 20 3d 20 30  {.      nArg = 0
1cc90 3b 0a 20 20 20 20 20 20 72 65 67 41 67 67 20 3d  ;.      regAgg =
1cca0 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66   0;.    }.    if
1ccb0 28 20 70 46 2d 3e 69 44 69 73 74 69 6e 63 74 3e  ( pF->iDistinct>
1ccc0 3d 30 20 29 7b 0a 20 20 20 20 20 20 61 64 64 72  =0 ){.      addr
1ccd0 4e 65 78 74 20 3d 20 73 71 6c 69 74 65 33 56 64  Next = sqlite3Vd
1cce0 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a  beMakeLabel(v);.
1ccf0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6e 41        assert( nA
1cd00 72 67 3d 3d 31 20 29 3b 0a 20 20 20 20 20 20 63  rg==1 );.      c
1cd10 6f 64 65 44 69 73 74 69 6e 63 74 28 70 50 61 72  odeDistinct(pPar
1cd20 73 65 2c 20 70 46 2d 3e 69 44 69 73 74 69 6e 63  se, pF->iDistinc
1cd30 74 2c 20 61 64 64 72 4e 65 78 74 2c 20 31 2c 20  t, addrNext, 1, 
1cd40 72 65 67 41 67 67 29 3b 0a 20 20 20 20 7d 0a 20  regAgg);.    }. 
1cd50 20 20 20 69 66 28 20 70 46 2d 3e 70 46 75 6e 63     if( pF->pFunc
1cd60 2d 3e 6e 65 65 64 43 6f 6c 6c 53 65 71 20 29 7b  ->needCollSeq ){
1cd70 0a 20 20 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a  .      CollSeq *
1cd80 70 43 6f 6c 6c 20 3d 20 30 3b 0a 20 20 20 20 20  pColl = 0;.     
1cd90 20 73 74 72 75 63 74 20 45 78 70 72 4c 69 73 74   struct ExprList
1cda0 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20  _item *pItem;.  
1cdb0 20 20 20 20 69 6e 74 20 6a 3b 0a 20 20 20 20 20      int j;.     
1cdc0 20 61 73 73 65 72 74 28 20 70 4c 69 73 74 21 3d   assert( pList!=
1cdd0 30 20 29 3b 20 20 2f 2a 20 70 4c 69 73 74 21 3d  0 );  /* pList!=
1cde0 30 20 69 66 20 70 46 2d 3e 70 46 75 6e 63 2d 3e  0 if pF->pFunc->
1cdf0 6e 65 65 64 43 6f 6c 6c 53 65 71 20 69 73 20 74  needCollSeq is t
1ce00 72 75 65 20 2a 2f 0a 20 20 20 20 20 20 66 6f 72  rue */.      for
1ce10 28 6a 3d 30 2c 20 70 49 74 65 6d 3d 70 4c 69 73  (j=0, pItem=pLis
1ce20 74 2d 3e 61 3b 20 21 70 43 6f 6c 6c 20 26 26 20  t->a; !pColl && 
1ce30 6a 3c 6e 41 72 67 3b 20 6a 2b 2b 2c 20 70 49 74  j<nArg; j++, pIt
1ce40 65 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 70  em++){.        p
1ce50 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 45 78  Coll = sqlite3Ex
1ce60 70 72 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65  prCollSeq(pParse
1ce70 2c 20 70 49 74 65 6d 2d 3e 70 45 78 70 72 29 3b  , pItem->pExpr);
1ce80 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
1ce90 66 28 20 21 70 43 6f 6c 6c 20 29 7b 0a 20 20 20  f( !pColl ){.   
1cea0 20 20 20 20 20 70 43 6f 6c 6c 20 3d 20 70 50 61       pColl = pPa
1ceb0 72 73 65 2d 3e 64 62 2d 3e 70 44 66 6c 74 43 6f  rse->db->pDfltCo
1cec0 6c 6c 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ll;.      }.    
1ced0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
1cee0 4f 70 34 28 76 2c 20 4f 50 5f 43 6f 6c 6c 53 65  Op4(v, OP_CollSe
1cef0 71 2c 20 30 2c 20 30 2c 20 30 2c 20 28 63 68 61  q, 0, 0, 0, (cha
1cf00 72 20 2a 29 70 43 6f 6c 6c 2c 20 50 34 5f 43 4f  r *)pColl, P4_CO
1cf10 4c 4c 53 45 51 29 3b 0a 20 20 20 20 7d 0a 20 20  LLSEQ);.    }.  
1cf20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
1cf30 4f 70 34 28 76 2c 20 4f 50 5f 41 67 67 53 74 65  Op4(v, OP_AggSte
1cf40 70 2c 20 30 2c 20 72 65 67 41 67 67 2c 20 70 46  p, 0, regAgg, pF
1cf50 2d 3e 69 4d 65 6d 2c 0a 20 20 20 20 20 20 20 20  ->iMem,.        
1cf60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 76                (v
1cf70 6f 69 64 2a 29 70 46 2d 3e 70 46 75 6e 63 2c 20  oid*)pF->pFunc, 
1cf80 50 34 5f 46 55 4e 43 44 45 46 29 3b 0a 20 20 20  P4_FUNCDEF);.   
1cf90 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e   sqlite3VdbeChan
1cfa0 67 65 50 35 28 76 2c 20 6e 41 72 67 29 3b 0a 20  geP5(v, nArg);. 
1cfb0 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73     sqlite3Releas
1cfc0 65 54 65 6d 70 52 61 6e 67 65 28 70 50 61 72 73  eTempRange(pPars
1cfd0 65 2c 20 72 65 67 41 67 67 2c 20 6e 41 72 67 29  e, regAgg, nArg)
1cfe0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70  ;.    sqlite3Exp
1cff0 72 43 61 63 68 65 41 66 66 69 6e 69 74 79 43 68  rCacheAffinityCh
1d000 61 6e 67 65 28 70 50 61 72 73 65 2c 20 72 65 67  ange(pParse, reg
1d010 41 67 67 2c 20 6e 41 72 67 29 3b 0a 20 20 20 20  Agg, nArg);.    
1d020 69 66 28 20 61 64 64 72 4e 65 78 74 20 29 7b 0a  if( addrNext ){.
1d030 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
1d040 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c  eResolveLabel(v,
1d050 20 61 64 64 72 4e 65 78 74 29 3b 0a 20 20 20 20   addrNext);.    
1d060 7d 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d 30 2c  }.  }.  for(i=0,
1d070 20 70 43 3d 70 41 67 67 49 6e 66 6f 2d 3e 61 43   pC=pAggInfo->aC
1d080 6f 6c 3b 20 69 3c 70 41 67 67 49 6e 66 6f 2d 3e  ol; i<pAggInfo->
1d090 6e 41 63 63 75 6d 75 6c 61 74 6f 72 3b 20 69 2b  nAccumulator; i+
1d0a0 2b 2c 20 70 43 2b 2b 29 7b 0a 20 20 20 20 73 71  +, pC++){.    sq
1d0b0 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28 70 50  lite3ExprCode(pP
1d0c0 61 72 73 65 2c 20 70 43 2d 3e 70 45 78 70 72 2c  arse, pC->pExpr,
1d0d0 20 70 43 2d 3e 69 4d 65 6d 29 3b 0a 20 20 7d 0a   pC->iMem);.  }.
1d0e0 20 20 70 41 67 67 49 6e 66 6f 2d 3e 64 69 72 65    pAggInfo->dire
1d0f0 63 74 4d 6f 64 65 20 3d 20 30 3b 0a 7d 0a 0a 23  ctMode = 0;.}..#
1d100 69 66 20 30 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  if 0./*.** This 
1d110 66 75 6e 63 74 69 6f 6e 20 69 73 20 75 73 65 64  function is used
1d120 20 77 68 65 6e 20 61 20 53 45 4c 45 43 54 20 73   when a SELECT s
1d130 74 61 74 65 6d 65 6e 74 20 69 73 20 75 73 65 64  tatement is used
1d140 20 74 6f 20 63 72 65 61 74 65 20 61 0a 2a 2a 20   to create a.** 
1d150 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20  temporary table 
1d160 66 6f 72 20 69 74 65 72 61 74 69 6e 67 20 74 68  for iterating th
1d170 72 6f 75 67 68 20 77 68 65 6e 20 72 75 6e 6e 69  rough when runni
1d180 6e 67 20 61 6e 20 49 4e 53 54 45 41 44 20 4f 46  ng an INSTEAD OF
1d190 0a 2a 2a 20 55 50 44 41 54 45 20 6f 72 20 49 4e  .** UPDATE or IN
1d1a0 53 54 45 41 44 20 4f 46 20 44 45 4c 45 54 45 20  STEAD OF DELETE 
1d1b0 74 72 69 67 67 65 72 2e 20 0a 2a 2a 0a 2a 2a 20  trigger. .**.** 
1d1c0 49 66 20 70 6f 73 73 69 62 6c 65 2c 20 74 68 65  If possible, the
1d1d0 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
1d1e0 74 20 69 73 20 6d 6f 64 69 66 69 65 64 20 73 6f  t is modified so
1d1f0 20 74 68 61 74 20 4e 55 4c 4c 20 76 61 6c 75 65   that NULL value
1d200 73 0a 2a 2a 20 61 72 65 20 73 74 6f 72 65 64 20  s.** are stored 
1d210 69 6e 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79  in the temporary
1d220 20 74 61 62 6c 65 20 66 6f 72 20 61 6c 6c 20 63   table for all c
1d230 6f 6c 75 6d 6e 73 20 66 6f 72 20 77 68 69 63 68  olumns for which
1d240 20 74 68 65 20 0a 2a 2a 20 63 6f 72 72 65 73 70   the .** corresp
1d250 6f 6e 64 69 6e 67 20 62 69 74 20 69 6e 20 61 72  onding bit in ar
1d260 67 75 6d 65 6e 74 20 6d 61 73 6b 20 69 73 20 6e  gument mask is n
1d270 6f 74 20 73 65 74 2e 20 49 66 20 6d 61 73 6b 20  ot set. If mask 
1d280 74 61 6b 65 73 20 74 68 65 0a 2a 2a 20 73 70 65  takes the.** spe
1d290 63 69 61 6c 20 76 61 6c 75 65 20 30 78 66 66 66  cial value 0xfff
1d2a0 66 66 66 66 66 2c 20 74 68 65 6e 20 61 6c 6c 20  fffff, then all 
1d2b0 63 6f 6c 75 6d 6e 73 20 61 72 65 20 70 6f 70 75  columns are popu
1d2c0 6c 61 74 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73  lated..*/.void s
1d2d0 71 6c 69 74 65 33 53 65 6c 65 63 74 4d 61 73 6b  qlite3SelectMask
1d2e0 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
1d2f0 53 65 6c 65 63 74 20 2a 70 2c 20 75 33 32 20 6d  Select *p, u32 m
1d300 61 73 6b 29 7b 0a 20 20 69 66 28 20 70 20 26 26  ask){.  if( p &&
1d310 20 21 70 2d 3e 70 50 72 69 6f 72 20 26 26 20 21   !p->pPrior && !
1d320 70 2d 3e 69 73 44 69 73 74 69 6e 63 74 20 26 26  p->isDistinct &&
1d330 20 6d 61 73 6b 21 3d 30 78 66 66 66 66 66 66 66   mask!=0xfffffff
1d340 66 20 29 7b 0a 20 20 20 20 45 78 70 72 4c 69 73  f ){.    ExprLis
1d350 74 20 2a 70 45 4c 69 73 74 3b 0a 20 20 20 20 69  t *pEList;.    i
1d360 6e 74 20 69 3b 0a 20 20 20 20 73 71 6c 69 74 65  nt i;.    sqlite
1d370 33 53 65 6c 65 63 74 52 65 73 6f 6c 76 65 28 70  3SelectResolve(p
1d380 50 61 72 73 65 2c 20 70 2c 20 30 29 3b 0a 20 20  Parse, p, 0);.  
1d390 20 20 70 45 4c 69 73 74 20 3d 20 70 2d 3e 70 45    pEList = p->pE
1d3a0 4c 69 73 74 3b 0a 20 20 20 20 66 6f 72 28 69 3d  List;.    for(i=
1d3b0 30 3b 20 70 45 4c 69 73 74 20 26 26 20 69 3c 70  0; pEList && i<p
1d3c0 45 4c 69 73 74 2d 3e 6e 45 78 70 72 20 26 26 20  EList->nExpr && 
1d3d0 69 3c 33 32 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  i<32; i++){.    
1d3e0 20 20 69 66 28 20 21 28 6d 61 73 6b 26 28 28 75    if( !(mask&((u
1d3f0 33 32 29 31 3c 3c 69 29 29 20 29 7b 0a 20 20 20  32)1<<i)) ){.   
1d400 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
1d410 44 65 6c 65 74 65 28 70 45 4c 69 73 74 2d 3e 61  Delete(pEList->a
1d420 5b 69 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20 20  [i].pExpr);.    
1d430 20 20 20 20 70 45 4c 69 73 74 2d 3e 61 5b 69 5d      pEList->a[i]
1d440 2e 70 45 78 70 72 20 3d 20 73 71 6c 69 74 65 33  .pExpr = sqlite3
1d450 45 78 70 72 28 70 50 61 72 73 65 2d 3e 64 62 2c  Expr(pParse->db,
1d460 20 54 4b 5f 4e 55 4c 4c 2c 20 30 2c 20 30 2c 20   TK_NULL, 0, 0, 
1d470 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  0);.      }.    
1d480 7d 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a  }.  }.}.#endif..
1d490 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63  /*.** Generate c
1d4a0 6f 64 65 20 66 6f 72 20 74 68 65 20 67 69 76 65  ode for the give
1d4b0 6e 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  n SELECT stateme
1d4c0 6e 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 72 65  nt..**.** The re
1d4d0 73 75 6c 74 73 20 61 72 65 20 64 69 73 74 72 69  sults are distri
1d4e0 62 75 74 65 64 20 69 6e 20 76 61 72 69 6f 75 73  buted in various
1d4f0 20 77 61 79 73 20 64 65 70 65 6e 64 69 6e 67 20   ways depending 
1d500 6f 6e 20 74 68 65 0a 2a 2a 20 63 6f 6e 74 65 6e  on the.** conten
1d510 74 73 20 6f 66 20 74 68 65 20 53 65 6c 65 63 74  ts of the Select
1d520 44 65 73 74 20 73 74 72 75 63 74 75 72 65 20 70  Dest structure p
1d530 6f 69 6e 74 65 64 20 74 6f 20 62 79 20 61 72 67  ointed to by arg
1d540 75 6d 65 6e 74 20 70 44 65 73 74 0a 2a 2a 20 61  ument pDest.** a
1d550 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a  s follows:.**.**
1d560 20 20 20 20 20 70 44 65 73 74 2d 3e 65 44 65 73       pDest->eDes
1d570 74 20 20 20 20 52 65 73 75 6c 74 0a 2a 2a 20 20  t    Result.**  
1d580 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 20     ------------ 
1d590 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d     -------------
1d5a0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1d5b0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a  --------------.*
1d5c0 2a 20 20 20 20 20 53 52 54 5f 43 61 6c 6c 62 61  *     SRT_Callba
1d5d0 63 6b 20 20 20 20 49 6e 76 6f 6b 65 20 74 68 65  ck    Invoke the
1d5e0 20 63 61 6c 6c 62 61 63 6b 20 66 6f 72 20 65 61   callback for ea
1d5f0 63 68 20 72 6f 77 20 6f 66 20 74 68 65 20 72 65  ch row of the re
1d600 73 75 6c 74 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20  sult..**.**     
1d610 53 52 54 5f 4d 65 6d 20 20 20 20 20 20 20 20 20  SRT_Mem         
1d620 53 74 6f 72 65 20 66 69 72 73 74 20 72 65 73 75  Store first resu
1d630 6c 74 20 69 6e 20 6d 65 6d 6f 72 79 20 63 65 6c  lt in memory cel
1d640 6c 20 70 44 65 73 74 2d 3e 69 50 61 72 6d 0a 2a  l pDest->iParm.*
1d650 2a 0a 2a 2a 20 20 20 20 20 53 52 54 5f 53 65 74  *.**     SRT_Set
1d660 20 20 20 20 20 20 20 20 20 53 74 6f 72 65 20 72           Store r
1d670 65 73 75 6c 74 73 20 61 73 20 6b 65 79 73 20 6f  esults as keys o
1d680 66 20 74 61 62 6c 65 20 70 44 65 73 74 2d 3e 69  f table pDest->i
1d690 50 61 72 6d 2e 20 0a 2a 2a 20 20 20 20 20 20 20  Parm. .**       
1d6a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 41 70                Ap
1d6b0 70 6c 79 20 74 68 65 20 61 66 66 69 6e 69 74 79  ply the affinity
1d6c0 20 70 44 65 73 74 2d 3e 61 66 66 69 6e 69 74 79   pDest->affinity
1d6d0 20 62 65 66 6f 72 65 20 73 74 6f 72 69 6e 67 20   before storing 
1d6e0 74 68 65 6d 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20  them..**.**     
1d6f0 53 52 54 5f 55 6e 69 6f 6e 20 20 20 20 20 20 20  SRT_Union       
1d700 53 74 6f 72 65 20 72 65 73 75 6c 74 73 20 61 73  Store results as
1d710 20 61 20 6b 65 79 20 69 6e 20 61 20 74 65 6d 70   a key in a temp
1d720 6f 72 61 72 79 20 74 61 62 6c 65 20 70 44 65 73  orary table pDes
1d730 74 2d 3e 69 50 61 72 6d 2e 0a 2a 2a 0a 2a 2a 20  t->iParm..**.** 
1d740 20 20 20 20 53 52 54 5f 45 78 63 65 70 74 20 20      SRT_Except  
1d750 20 20 20 20 52 65 6d 6f 76 65 20 72 65 73 75 6c      Remove resul
1d760 74 73 20 66 72 6f 6d 20 74 68 65 20 74 65 6d 70  ts from the temp
1d770 6f 72 61 72 79 20 74 61 62 6c 65 20 70 44 65 73  orary table pDes
1d780 74 2d 3e 69 50 61 72 6d 2e 0a 2a 2a 0a 2a 2a 20  t->iParm..**.** 
1d790 20 20 20 20 53 52 54 5f 54 61 62 6c 65 20 20 20      SRT_Table   
1d7a0 20 20 20 20 53 74 6f 72 65 20 72 65 73 75 6c 74      Store result
1d7b0 73 20 69 6e 20 74 65 6d 70 6f 72 61 72 79 20 74  s in temporary t
1d7c0 61 62 6c 65 20 70 44 65 73 74 2d 3e 69 50 61 72  able pDest->iPar
1d7d0 6d 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 52 54 5f  m.**.**     SRT_
1d7e0 45 70 68 65 6d 54 61 62 20 20 20 20 43 72 65 61  EphemTab    Crea
1d7f0 74 65 20 61 6e 20 74 65 6d 70 6f 72 61 72 79 20  te an temporary 
1d800 74 61 62 6c 65 20 70 44 65 73 74 2d 3e 69 50 61  table pDest->iPa
1d810 72 6d 20 61 6e 64 20 73 74 6f 72 65 0a 2a 2a 20  rm and store.** 
1d820 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d830 20 20 20 20 74 68 65 20 72 65 73 75 6c 74 20 74      the result t
1d840 68 65 72 65 2e 20 54 68 65 20 63 75 72 73 6f 72  here. The cursor
1d850 20 69 73 20 6c 65 66 74 20 6f 70 65 6e 20 61 66   is left open af
1d860 74 65 72 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  ter.**          
1d870 20 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72             retur
1d880 6e 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20  ning..**.**     
1d890 53 52 54 5f 43 6f 72 6f 75 74 69 6e 65 20 20 20  SRT_Coroutine   
1d8a0 49 6e 76 6f 6b 65 20 61 20 63 6f 2d 72 6f 75 74  Invoke a co-rout
1d8b0 69 6e 65 20 74 6f 20 63 6f 6d 70 75 74 65 20 61  ine to compute a
1d8c0 20 73 69 6e 67 6c 65 20 72 6f 77 20 6f 66 20 0a   single row of .
1d8d0 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
1d8e0 20 20 20 20 20 20 20 74 68 65 20 72 65 73 75 6c         the resul
1d8f0 74 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 52 54 5f  t.**.**     SRT_
1d900 45 78 69 73 74 73 20 20 20 20 20 20 53 74 6f 72  Exists      Stor
1d910 65 20 61 20 31 20 69 6e 20 6d 65 6d 6f 72 79 20  e a 1 in memory 
1d920 63 65 6c 6c 20 70 44 65 73 74 2d 3e 69 50 61 72  cell pDest->iPar
1d930 6d 20 69 66 20 74 68 65 20 72 65 73 75 6c 74 0a  m if the result.
1d940 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
1d950 20 20 20 20 20 20 20 73 65 74 20 69 73 20 6e 6f         set is no
1d960 74 20 65 6d 70 74 79 2e 0a 2a 2a 0a 2a 2a 20 20  t empty..**.**  
1d970 20 20 20 53 52 54 5f 44 69 73 63 61 72 64 20 20     SRT_Discard  
1d980 20 20 20 54 68 72 6f 77 20 74 68 65 20 72 65 73     Throw the res
1d990 75 6c 74 73 20 61 77 61 79 2e 0a 2a 2a 0a 2a 2a  ults away..**.**
1d9a0 20 53 65 65 20 74 68 65 20 73 65 6c 65 63 74 49   See the selectI
1d9b0 6e 6e 65 72 4c 6f 6f 70 28 29 20 66 75 6e 63 74  nnerLoop() funct
1d9c0 69 6f 6e 20 66 6f 72 20 61 20 63 61 6e 6f 6e 69  ion for a canoni
1d9d0 63 61 6c 20 6c 69 73 74 69 6e 67 20 6f 66 20 74  cal listing of t
1d9e0 68 65 20 0a 2a 2a 20 61 6c 6c 6f 77 65 64 20 76  he .** allowed v
1d9f0 61 6c 75 65 73 20 6f 66 20 65 44 65 73 74 20 61  alues of eDest a
1da00 6e 64 20 74 68 65 69 72 20 6d 65 61 6e 69 6e 67  nd their meaning
1da10 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  s..**.** This ro
1da20 75 74 69 6e 65 20 72 65 74 75 72 6e 73 20 74 68  utine returns th
1da30 65 20 6e 75 6d 62 65 72 20 6f 66 20 65 72 72 6f  e number of erro
1da40 72 73 2e 20 20 49 66 20 61 6e 79 20 65 72 72 6f  rs.  If any erro
1da50 72 73 20 61 72 65 0a 2a 2a 20 65 6e 63 6f 75 6e  rs are.** encoun
1da60 74 65 72 65 64 2c 20 74 68 65 6e 20 61 6e 20 61  tered, then an a
1da70 70 70 72 6f 70 72 69 61 74 65 20 65 72 72 6f 72  ppropriate error
1da80 20 6d 65 73 73 61 67 65 20 69 73 20 6c 65 66 74   message is left
1da90 20 69 6e 0a 2a 2a 20 70 50 61 72 73 65 2d 3e 7a   in.** pParse->z
1daa0 45 72 72 4d 73 67 2e 0a 2a 2a 0a 2a 2a 20 54 68  ErrMsg..**.** Th
1dab0 69 73 20 72 6f 75 74 69 6e 65 20 64 6f 65 73 20  is routine does 
1dac0 4e 4f 54 20 66 72 65 65 20 74 68 65 20 53 65 6c  NOT free the Sel
1dad0 65 63 74 20 73 74 72 75 63 74 75 72 65 20 70 61  ect structure pa
1dae0 73 73 65 64 20 69 6e 2e 20 20 54 68 65 0a 2a 2a  ssed in.  The.**
1daf0 20 63 61 6c 6c 69 6e 67 20 66 75 6e 63 74 69 6f   calling functio
1db00 6e 20 6e 65 65 64 73 20 74 6f 20 64 6f 20 74 68  n needs to do th
1db10 61 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 50  at..**.** The pP
1db20 61 72 65 6e 74 2c 20 70 61 72 65 6e 74 54 61 62  arent, parentTab
1db30 2c 20 61 6e 64 20 2a 70 50 61 72 65 6e 74 41 67  , and *pParentAg
1db40 67 20 66 69 65 6c 64 73 20 61 72 65 20 66 69 6c  g fields are fil
1db50 6c 65 64 20 69 6e 20 69 66 20 74 68 69 73 0a 2a  led in if this.*
1db60 2a 20 53 45 4c 45 43 54 20 69 73 20 61 20 73 75  * SELECT is a su
1db70 62 71 75 65 72 79 2e 20 20 54 68 69 73 20 72 6f  bquery.  This ro
1db80 75 74 69 6e 65 20 6d 61 79 20 74 72 79 20 74 6f  utine may try to
1db90 20 63 6f 6d 62 69 6e 65 20 74 68 69 73 20 53 45   combine this SE
1dba0 4c 45 43 54 0a 2a 2a 20 77 69 74 68 20 69 74 73  LECT.** with its
1dbb0 20 70 61 72 65 6e 74 20 74 6f 20 66 6f 72 6d 20   parent to form 
1dbc0 61 20 73 69 6e 67 6c 65 20 66 6c 61 74 20 71 75  a single flat qu
1dbd0 65 72 79 2e 20 20 49 6e 20 73 6f 20 64 6f 69 6e  ery.  In so doin
1dbe0 67 2c 20 69 74 20 6d 69 67 68 74 0a 2a 2a 20 63  g, it might.** c
1dbf0 68 61 6e 67 65 20 74 68 65 20 70 61 72 65 6e 74  hange the parent
1dc00 20 71 75 65 72 79 20 66 72 6f 6d 20 61 20 6e 6f   query from a no
1dc10 6e 2d 61 67 67 72 65 67 61 74 65 20 74 6f 20 61  n-aggregate to a
1dc20 6e 20 61 67 67 72 65 67 61 74 65 20 71 75 65 72  n aggregate quer
1dc30 79 2e 0a 2a 2a 20 46 6f 72 20 74 68 61 74 20 72  y..** For that r
1dc40 65 61 73 6f 6e 2c 20 74 68 65 20 70 50 61 72 65  eason, the pPare
1dc50 6e 74 41 67 67 20 66 6c 61 67 20 69 73 20 70 61  ntAgg flag is pa
1dc60 73 73 65 64 20 61 73 20 61 20 70 6f 69 6e 74 65  ssed as a pointe
1dc70 72 2c 20 73 6f 20 69 74 0a 2a 2a 20 63 61 6e 20  r, so it.** can 
1dc80 62 65 20 63 68 61 6e 67 65 64 2e 0a 2a 2a 0a 2a  be changed..**.*
1dc90 2a 20 45 78 61 6d 70 6c 65 20 31 3a 20 20 20 54  * Example 1:   T
1dca0 68 65 20 6d 65 61 6e 69 6e 67 20 6f 66 20 74 68  he meaning of th
1dcb0 65 20 70 50 61 72 65 6e 74 20 70 61 72 61 6d 65  e pParent parame
1dcc0 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 53 45  ter..**.**    SE
1dcd0 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 20 4a  LECT * FROM t1 J
1dce0 4f 49 4e 20 28 53 45 4c 45 43 54 20 78 2c 20 63  OIN (SELECT x, c
1dcf0 6f 75 6e 74 28 2a 29 20 46 52 4f 4d 20 74 32 29  ount(*) FROM t2)
1dd00 20 4a 4f 49 4e 20 74 33 3b 0a 2a 2a 20 20 20 20   JOIN t3;.**    
1dd10 5c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  \               
1dd20 20 20 20 20 20 20 20 5c 5f 5f 5f 5f 5f 5f 5f 20         \_______ 
1dd30 73 75 62 71 75 65 72 79 20 5f 5f 5f 5f 5f 5f 5f  subquery _______
1dd40 2f 20 20 20 20 20 20 20 20 2f 0a 2a 2a 20 20 20  /        /.**   
1dd50 20 20 5c 20 20 20 20 20 20 20 20 20 20 20 20 20    \             
1dd60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1dd70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1dd80 20 20 20 20 20 20 20 20 20 2f 0a 2a 2a 20 20 20           /.**   
1dd90 20 20 20 5c 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f     \____________
1dda0 5f 5f 5f 5f 5f 5f 5f 5f 20 6f 75 74 65 72 20 71  ________ outer q
1ddb0 75 65 72 79 20 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f  uery ___________
1ddc0 5f 5f 5f 5f 5f 5f 5f 5f 2f 0a 2a 2a 0a 2a 2a 20  ________/.**.** 
1ddd0 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
1dde0 63 61 6c 6c 65 64 20 66 6f 72 20 74 68 65 20 6f  called for the o
1ddf0 75 74 65 72 20 71 75 65 72 79 20 66 69 72 73 74  uter query first
1de00 2e 20 20 20 46 6f 72 20 74 68 61 74 20 63 61 6c  .   For that cal
1de10 6c 2c 0a 2a 2a 20 70 50 61 72 65 6e 74 20 77 69  l,.** pParent wi
1de20 6c 6c 20 62 65 20 4e 55 4c 4c 2e 20 20 44 75 72  ll be NULL.  Dur
1de30 69 6e 67 20 74 68 65 20 70 72 6f 63 65 73 73 69  ing the processi
1de40 6e 67 20 6f 66 20 74 68 65 20 6f 75 74 65 72 20  ng of the outer 
1de50 71 75 65 72 79 2c 20 74 68 69 73 20 0a 2a 2a 20  query, this .** 
1de60 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65  routine is calle
1de70 64 20 72 65 63 75 72 73 69 76 65 6c 79 20 74 6f  d recursively to
1de80 20 68 61 6e 64 6c 65 20 74 68 65 20 73 75 62 71   handle the subq
1de90 75 65 72 79 2e 20 20 46 6f 72 20 74 68 65 20 72  uery.  For the r
1dea0 65 63 75 72 73 69 76 65 0a 2a 2a 20 63 61 6c 6c  ecursive.** call
1deb0 2c 20 70 50 61 72 65 6e 74 20 77 69 6c 6c 20 70  , pParent will p
1dec0 6f 69 6e 74 20 74 6f 20 74 68 65 20 6f 75 74 65  oint to the oute
1ded0 72 20 71 75 65 72 79 2e 20 20 42 65 63 61 75 73  r query.  Becaus
1dee0 65 20 74 68 65 20 73 75 62 71 75 65 72 79 20 69  e the subquery i
1def0 73 0a 2a 2a 20 74 68 65 20 73 65 63 6f 6e 64 20  s.** the second 
1df00 65 6c 65 6d 65 6e 74 20 69 6e 20 61 20 74 68 72  element in a thr
1df10 65 65 2d 77 61 79 20 6a 6f 69 6e 2c 20 74 68 65  ee-way join, the
1df20 20 70 61 72 65 6e 74 54 61 62 20 70 61 72 61 6d   parentTab param
1df30 65 74 65 72 20 77 69 6c 6c 0a 2a 2a 20 62 65 20  eter will.** be 
1df40 31 20 28 74 68 65 20 32 6e 64 20 76 61 6c 75 65  1 (the 2nd value
1df50 20 6f 66 20 61 20 30 2d 69 6e 64 65 78 65 64 20   of a 0-indexed 
1df60 61 72 72 61 79 2e 29 0a 2a 2f 0a 69 6e 74 20 73  array.).*/.int s
1df70 71 6c 69 74 65 33 53 65 6c 65 63 74 28 0a 20 20  qlite3Select(.  
1df80 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
1df90 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61         /* The pa
1dfa0 72 73 65 72 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  rser context */.
1dfb0 20 20 53 65 6c 65 63 74 20 2a 70 2c 20 20 20 20    Select *p,    
1dfc0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
1dfd0 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
1dfe0 20 62 65 69 6e 67 20 63 6f 64 65 64 2e 20 2a 2f   being coded. */
1dff0 0a 20 20 53 65 6c 65 63 74 44 65 73 74 20 2a 70  .  SelectDest *p
1e000 44 65 73 74 2c 20 20 20 20 20 2f 2a 20 57 68 61  Dest,     /* Wha
1e010 74 20 74 6f 20 64 6f 20 77 69 74 68 20 74 68 65  t to do with the
1e020 20 71 75 65 72 79 20 72 65 73 75 6c 74 73 20 2a   query results *
1e030 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 50 61 72  /.  Select *pPar
1e040 65 6e 74 2c 20 20 20 20 20 20 20 2f 2a 20 41 6e  ent,       /* An
1e050 6f 74 68 65 72 20 53 45 4c 45 43 54 20 66 6f 72  other SELECT for
1e060 20 77 68 69 63 68 20 74 68 69 73 20 69 73 20 61   which this is a
1e070 20 73 75 62 2d 71 75 65 72 79 20 2a 2f 0a 20 20   sub-query */.  
1e080 69 6e 74 20 70 61 72 65 6e 74 54 61 62 2c 20 20  int parentTab,  
1e090 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20         /* Index 
1e0a0 69 6e 20 70 50 61 72 65 6e 74 2d 3e 70 53 72 63  in pParent->pSrc
1e0b0 20 6f 66 20 74 68 69 73 20 71 75 65 72 79 20 2a   of this query *
1e0c0 2f 0a 20 20 69 6e 74 20 2a 70 50 61 72 65 6e 74  /.  int *pParent
1e0d0 41 67 67 20 20 20 20 20 20 20 20 2f 2a 20 54 72  Agg        /* Tr
1e0e0 75 65 20 69 66 20 70 50 61 72 65 6e 74 20 75 73  ue if pParent us
1e0f0 65 73 20 61 67 67 72 65 67 61 74 65 20 66 75 6e  es aggregate fun
1e100 63 74 69 6f 6e 73 20 2a 2f 0a 29 7b 0a 20 20 69  ctions */.){.  i
1e110 6e 74 20 69 2c 20 6a 3b 20 20 20 20 20 20 20 20  nt i, j;        
1e120 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f        /* Loop co
1e130 75 6e 74 65 72 73 20 2a 2f 0a 20 20 57 68 65 72  unters */.  Wher
1e140 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 3b 20 20  eInfo *pWInfo;  
1e150 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 66 72 6f     /* Return fro
1e160 6d 20 73 71 6c 69 74 65 33 57 68 65 72 65 42 65  m sqlite3WhereBe
1e170 67 69 6e 28 29 20 2a 2f 0a 20 20 56 64 62 65 20  gin() */.  Vdbe 
1e180 2a 76 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  *v;             
1e190 20 20 2f 2a 20 54 68 65 20 76 69 72 74 75 61 6c    /* The virtual
1e1a0 20 6d 61 63 68 69 6e 65 20 75 6e 64 65 72 20 63   machine under c
1e1b0 6f 6e 73 74 72 75 63 74 69 6f 6e 20 2a 2f 0a 20  onstruction */. 
1e1c0 20 69 6e 74 20 69 73 41 67 67 3b 20 20 20 20 20   int isAgg;     
1e1d0 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
1e1e0 66 6f 72 20 73 65 6c 65 63 74 20 6c 69 73 74 73  for select lists
1e1f0 20 6c 69 6b 65 20 22 63 6f 75 6e 74 28 2a 29 22   like "count(*)"
1e200 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a   */.  ExprList *
1e210 70 45 4c 69 73 74 3b 20 20 20 20 20 20 2f 2a 20  pEList;      /* 
1e220 4c 69 73 74 20 6f 66 20 63 6f 6c 75 6d 6e 73 20  List of columns 
1e230 74 6f 20 65 78 74 72 61 63 74 2e 20 2a 2f 0a 20  to extract. */. 
1e240 20 53 72 63 4c 69 73 74 20 2a 70 54 61 62 4c 69   SrcList *pTabLi
1e250 73 74 3b 20 20 20 20 20 2f 2a 20 4c 69 73 74 20  st;     /* List 
1e260 6f 66 20 74 61 62 6c 65 73 20 74 6f 20 73 65 6c  of tables to sel
1e270 65 63 74 20 66 72 6f 6d 20 2a 2f 0a 20 20 45 78  ect from */.  Ex
1e280 70 72 20 2a 70 57 68 65 72 65 3b 20 20 20 20 20  pr *pWhere;     
1e290 20 20 20 20 20 2f 2a 20 54 68 65 20 57 48 45 52       /* The WHER
1e2a0 45 20 63 6c 61 75 73 65 2e 20 20 4d 61 79 20 62  E clause.  May b
1e2b0 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20 45 78 70 72  e NULL */.  Expr
1e2c0 4c 69 73 74 20 2a 70 4f 72 64 65 72 42 79 3b 20  List *pOrderBy; 
1e2d0 20 20 20 2f 2a 20 54 68 65 20 4f 52 44 45 52 20     /* The ORDER 
1e2e0 42 59 20 63 6c 61 75 73 65 2e 20 20 4d 61 79 20  BY clause.  May 
1e2f0 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20 45 78 70  be NULL */.  Exp
1e300 72 4c 69 73 74 20 2a 70 47 72 6f 75 70 42 79 3b  rList *pGroupBy;
1e310 20 20 20 20 2f 2a 20 54 68 65 20 47 52 4f 55 50      /* The GROUP
1e320 20 42 59 20 63 6c 61 75 73 65 2e 20 20 4d 61 79   BY clause.  May
1e330 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20 45 78   be NULL */.  Ex
1e340 70 72 20 2a 70 48 61 76 69 6e 67 3b 20 20 20 20  pr *pHaving;    
1e350 20 20 20 20 20 2f 2a 20 54 68 65 20 48 41 56 49       /* The HAVI
1e360 4e 47 20 63 6c 61 75 73 65 2e 20 20 4d 61 79 20  NG clause.  May 
1e370 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20 69 6e 74  be NULL */.  int
1e380 20 69 73 44 69 73 74 69 6e 63 74 3b 20 20 20 20   isDistinct;    
1e390 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 74      /* True if t
1e3a0 68 65 20 44 49 53 54 49 4e 43 54 20 6b 65 79 77  he DISTINCT keyw
1e3b0 6f 72 64 20 69 73 20 70 72 65 73 65 6e 74 20 2a  ord is present *
1e3c0 2f 0a 20 20 69 6e 74 20 64 69 73 74 69 6e 63 74  /.  int distinct
1e3d0 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 61  ;          /* Ta
1e3e0 62 6c 65 20 74 6f 20 75 73 65 20 66 6f 72 20 74  ble to use for t
1e3f0 68 65 20 64 69 73 74 69 6e 63 74 20 73 65 74 20  he distinct set 
1e400 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20 31 3b  */.  int rc = 1;
1e410 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56              /* V
1e420 61 6c 75 65 20 74 6f 20 72 65 74 75 72 6e 20 66  alue to return f
1e430 72 6f 6d 20 74 68 69 73 20 66 75 6e 63 74 69 6f  rom this functio
1e440 6e 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 53  n */.  int addrS
1e450 6f 72 74 49 6e 64 65 78 3b 20 20 20 20 20 2f 2a  ortIndex;     /*
1e460 20 41 64 64 72 65 73 73 20 6f 66 20 61 6e 20 4f   Address of an O
1e470 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 20  P_OpenEphemeral 
1e480 69 6e 73 74 72 75 63 74 69 6f 6e 20 2a 2f 0a 20  instruction */. 
1e490 20 41 67 67 49 6e 66 6f 20 73 41 67 67 49 6e 66   AggInfo sAggInf
1e4a0 6f 3b 20 20 20 20 20 20 2f 2a 20 49 6e 66 6f 72  o;      /* Infor
1e4b0 6d 61 74 69 6f 6e 20 75 73 65 64 20 62 79 20 61  mation used by a
1e4c0 67 67 72 65 67 61 74 65 20 71 75 65 72 69 65 73  ggregate queries
1e4d0 20 2a 2f 0a 20 20 69 6e 74 20 69 45 6e 64 3b 20   */.  int iEnd; 
1e4e0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1e4f0 41 64 64 72 65 73 73 20 6f 66 20 74 68 65 20 65  Address of the e
1e500 6e 64 20 6f 66 20 74 68 65 20 71 75 65 72 79 20  nd of the query 
1e510 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  */.  sqlite3 *db
1e520 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54  ;           /* T
1e530 68 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e  he database conn
1e540 65 63 74 69 6f 6e 20 2a 2f 0a 0a 20 20 64 62 20  ection */..  db 
1e550 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20  = pParse->db;.  
1e560 69 66 28 20 70 3d 3d 30 20 7c 7c 20 64 62 2d 3e  if( p==0 || db->
1e570 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 7c 7c 20  mallocFailed || 
1e580 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 29 7b 0a  pParse->nErr ){.
1e590 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20      return 1;.  
1e5a0 7d 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 41  }.  if( sqlite3A
1e5b0 75 74 68 43 68 65 63 6b 28 70 50 61 72 73 65 2c  uthCheck(pParse,
1e5c0 20 53 51 4c 49 54 45 5f 53 45 4c 45 43 54 2c 20   SQLITE_SELECT, 
1e5d0 30 2c 20 30 2c 20 30 29 20 29 20 72 65 74 75 72  0, 0, 0) ) retur
1e5e0 6e 20 31 3b 0a 20 20 6d 65 6d 73 65 74 28 26 73  n 1;.  memset(&s
1e5f0 41 67 67 49 6e 66 6f 2c 20 30 2c 20 73 69 7a 65  AggInfo, 0, size
1e600 6f 66 28 73 41 67 67 49 6e 66 6f 29 29 3b 0a 0a  of(sAggInfo));..
1e610 20 20 70 4f 72 64 65 72 42 79 20 3d 20 70 2d 3e    pOrderBy = p->
1e620 70 4f 72 64 65 72 42 79 3b 0a 20 20 69 66 28 20  pOrderBy;.  if( 
1e630 49 67 6e 6f 72 61 62 6c 65 4f 72 64 65 72 62 79  IgnorableOrderby
1e640 28 70 44 65 73 74 29 20 29 7b 0a 20 20 20 20 70  (pDest) ){.    p
1e650 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20 30 3b 0a  ->pOrderBy = 0;.
1e660 0a 20 20 20 20 2f 2a 20 49 6e 20 74 68 65 73 65  .    /* In these
1e670 20 63 61 73 65 73 20 74 68 65 20 44 49 53 54 49   cases the DISTI
1e680 4e 43 54 20 6f 70 65 72 61 74 6f 72 20 6d 61 6b  NCT operator mak
1e690 65 73 20 6e 6f 20 64 69 66 66 65 72 65 6e 63 65  es no difference
1e6a0 20 74 6f 20 74 68 65 0a 20 20 20 20 2a 2a 20 72   to the.    ** r
1e6b0 65 73 75 6c 74 73 2c 20 73 6f 20 72 65 6d 6f 76  esults, so remov
1e6c0 65 20 69 74 20 69 66 20 69 74 20 77 65 72 65 20  e it if it were 
1e6d0 73 70 65 63 69 66 69 65 64 2e 0a 20 20 20 20 2a  specified..    *
1e6e0 2f 0a 20 20 20 20 61 73 73 65 72 74 28 70 44 65  /.    assert(pDe
1e6f0 73 74 2d 3e 65 44 65 73 74 3d 3d 53 52 54 5f 45  st->eDest==SRT_E
1e700 78 69 73 74 73 20 7c 7c 20 70 44 65 73 74 2d 3e  xists || pDest->
1e710 65 44 65 73 74 3d 3d 53 52 54 5f 55 6e 69 6f 6e  eDest==SRT_Union
1e720 20 7c 7c 20 0a 20 20 20 20 20 20 20 20 20 20 20   || .           
1e730 70 44 65 73 74 2d 3e 65 44 65 73 74 3d 3d 53 52  pDest->eDest==SR
1e740 54 5f 45 78 63 65 70 74 20 7c 7c 20 70 44 65 73  T_Except || pDes
1e750 74 2d 3e 65 44 65 73 74 3d 3d 53 52 54 5f 44 69  t->eDest==SRT_Di
1e760 73 63 61 72 64 29 3b 0a 20 20 20 20 70 2d 3e 69  scard);.    p->i
1e770 73 44 69 73 74 69 6e 63 74 20 3d 20 30 3b 0a 20  sDistinct = 0;. 
1e780 20 7d 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33   }.  if( sqlite3
1e790 53 65 6c 65 63 74 52 65 73 6f 6c 76 65 28 70 50  SelectResolve(pP
1e7a0 61 72 73 65 2c 20 70 2c 20 30 29 20 29 7b 0a 20  arse, p, 0) ){. 
1e7b0 20 20 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65     goto select_e
1e7c0 6e 64 3b 0a 20 20 7d 0a 20 20 70 2d 3e 70 4f 72  nd;.  }.  p->pOr
1e7d0 64 65 72 42 79 20 3d 20 70 4f 72 64 65 72 42 79  derBy = pOrderBy
1e7e0 3b 0a 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 6c 6f  ;...  /* Make lo
1e7f0 63 61 6c 20 63 6f 70 69 65 73 20 6f 66 20 74 68  cal copies of th
1e800 65 20 70 61 72 61 6d 65 74 65 72 73 20 66 6f 72  e parameters for
1e810 20 74 68 69 73 20 71 75 65 72 79 2e 0a 20 20 2a   this query..  *
1e820 2f 0a 20 20 70 54 61 62 4c 69 73 74 20 3d 20 70  /.  pTabList = p
1e830 2d 3e 70 53 72 63 3b 0a 20 20 69 73 41 67 67 20  ->pSrc;.  isAgg 
1e840 3d 20 70 2d 3e 69 73 41 67 67 3b 0a 20 20 70 45  = p->isAgg;.  pE
1e850 4c 69 73 74 20 3d 20 70 2d 3e 70 45 4c 69 73 74  List = p->pEList
1e860 3b 0a 20 20 69 66 28 20 70 45 4c 69 73 74 3d 3d  ;.  if( pEList==
1e870 30 20 29 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f  0 ) goto select_
1e880 65 6e 64 3b 0a 0a 20 20 2f 2a 20 0a 20 20 2a 2a  end;..  /* .  **
1e890 20 44 6f 20 6e 6f 74 20 65 76 65 6e 20 61 74 74   Do not even att
1e8a0 65 6d 70 74 20 74 6f 20 67 65 6e 65 72 61 74 65  empt to generate
1e8b0 20 61 6e 79 20 63 6f 64 65 20 69 66 20 77 65 20   any code if we 
1e8c0 68 61 76 65 20 61 6c 72 65 61 64 79 20 73 65 65  have already see
1e8d0 6e 0a 20 20 2a 2a 20 65 72 72 6f 72 73 20 62 65  n.  ** errors be
1e8e0 66 6f 72 65 20 74 68 69 73 20 72 6f 75 74 69 6e  fore this routin
1e8f0 65 20 73 74 61 72 74 73 2e 0a 20 20 2a 2f 0a 20  e starts..  */. 
1e900 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 45 72   if( pParse->nEr
1e910 72 3e 30 20 29 20 67 6f 74 6f 20 73 65 6c 65 63  r>0 ) goto selec
1e920 74 5f 65 6e 64 3b 0a 0a 20 20 2f 2a 20 4f 52 44  t_end;..  /* ORD
1e930 45 52 20 42 59 20 69 73 20 69 67 6e 6f 72 65 64  ER BY is ignored
1e940 20 66 6f 72 20 73 6f 6d 65 20 64 65 73 74 69 6e   for some destin
1e950 61 74 69 6f 6e 73 2e 0a 20 20 2a 2f 0a 20 20 69  ations..  */.  i
1e960 66 28 20 49 67 6e 6f 72 61 62 6c 65 4f 72 64 65  f( IgnorableOrde
1e970 72 62 79 28 70 44 65 73 74 29 20 29 7b 0a 20 20  rby(pDest) ){.  
1e980 20 20 70 4f 72 64 65 72 42 79 20 3d 20 30 3b 0a    pOrderBy = 0;.
1e990 20 20 7d 0a 0a 20 20 2f 2a 20 42 65 67 69 6e 20    }..  /* Begin 
1e9a0 67 65 6e 65 72 61 74 69 6e 67 20 63 6f 64 65 2e  generating code.
1e9b0 0a 20 20 2a 2f 0a 20 20 76 20 3d 20 73 71 6c 69  .  */.  v = sqli
1e9c0 74 65 33 47 65 74 56 64 62 65 28 70 50 61 72 73  te3GetVdbe(pPars
1e9d0 65 29 3b 0a 20 20 69 66 28 20 76 3d 3d 30 20 29  e);.  if( v==0 )
1e9e0 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64   goto select_end
1e9f0 3b 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65  ;..  /* Generate
1ea00 20 63 6f 64 65 20 66 6f 72 20 61 6c 6c 20 73 75   code for all su
1ea10 62 2d 71 75 65 72 69 65 73 20 69 6e 20 74 68 65  b-queries in the
1ea20 20 46 52 4f 4d 20 63 6c 61 75 73 65 0a 20 20 2a   FROM clause.  *
1ea30 2f 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53  /.#if !defined(S
1ea40 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55  QLITE_OMIT_SUBQU
1ea50 45 52 59 29 20 7c 7c 20 21 64 65 66 69 6e 65 64  ERY) || !defined
1ea60 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45  (SQLITE_OMIT_VIE
1ea70 57 29 0a 20 20 66 6f 72 28 69 3d 30 3b 20 21 70  W).  for(i=0; !p
1ea80 2d 3e 70 50 72 69 6f 72 20 26 26 20 69 3c 70 54  ->pPrior && i<pT
1ea90 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3b 20 69 2b  abList->nSrc; i+
1eaa0 2b 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20 53  +){.    struct S
1eab0 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74  rcList_item *pIt
1eac0 65 6d 20 3d 20 26 70 54 61 62 4c 69 73 74 2d 3e  em = &pTabList->
1ead0 61 5b 69 5d 3b 0a 20 20 20 20 53 65 6c 65 63 74  a[i];.    Select
1eae0 44 65 73 74 20 64 65 73 74 3b 0a 20 20 20 20 53  Dest dest;.    S
1eaf0 65 6c 65 63 74 20 2a 70 53 75 62 20 3d 20 70 49  elect *pSub = pI
1eb00 74 65 6d 2d 3e 70 53 65 6c 65 63 74 3b 0a 20 20  tem->pSelect;.  
1eb10 20 20 69 6e 74 20 69 73 41 67 67 53 75 62 3b 0a    int isAggSub;.
1eb20 20 20 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 20      char *zName 
1eb30 3d 20 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65 3b 0a  = pItem->zName;.
1eb40 0a 20 20 20 20 69 66 28 20 70 53 75 62 3d 3d 30  .    if( pSub==0
1eb50 20 7c 7c 20 70 49 74 65 6d 2d 3e 69 73 50 6f 70   || pItem->isPop
1eb60 75 6c 61 74 65 64 20 29 20 63 6f 6e 74 69 6e 75  ulated ) continu
1eb70 65 3b 0a 20 20 20 20 69 66 28 20 7a 4e 61 6d 65  e;.    if( zName
1eb80 21 3d 30 20 29 7b 20 20 20 2f 2a 20 41 6e 20 73  !=0 ){   /* An s
1eb90 71 6c 20 76 69 65 77 20 2a 2f 0a 20 20 20 20 20  ql view */.     
1eba0 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 61   const char *zSa
1ebb0 76 65 64 41 75 74 68 43 6f 6e 74 65 78 74 20 3d  vedAuthContext =
1ebc0 20 70 50 61 72 73 65 2d 3e 7a 41 75 74 68 43 6f   pParse->zAuthCo
1ebd0 6e 74 65 78 74 3b 0a 20 20 20 20 20 20 70 50 61  ntext;.      pPa
1ebe0 72 73 65 2d 3e 7a 41 75 74 68 43 6f 6e 74 65 78  rse->zAuthContex
1ebf0 74 20 3d 20 7a 4e 61 6d 65 3b 0a 20 20 20 20 20  t = zName;.     
1ec00 20 72 63 20 3d 20 73 71 6c 69 74 65 33 53 65 6c   rc = sqlite3Sel
1ec10 65 63 74 52 65 73 6f 6c 76 65 28 70 50 61 72 73  ectResolve(pPars
1ec20 65 2c 20 70 53 75 62 2c 20 30 29 3b 0a 20 20 20  e, pSub, 0);.   
1ec30 20 20 20 70 50 61 72 73 65 2d 3e 7a 41 75 74 68     pParse->zAuth
1ec40 43 6f 6e 74 65 78 74 20 3d 20 7a 53 61 76 65 64  Context = zSaved
1ec50 41 75 74 68 43 6f 6e 74 65 78 74 3b 0a 20 20 20  AuthContext;.   
1ec60 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20     if( rc ){.   
1ec70 20 20 20 20 20 67 6f 74 6f 20 73 65 6c 65 63 74       goto select
1ec80 5f 65 6e 64 3b 0a 20 20 20 20 20 20 7d 0a 20 20  _end;.      }.  
1ec90 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 6e 63 72    }..    /* Incr
1eca0 65 6d 65 6e 74 20 50 61 72 73 65 2e 6e 48 65 69  ement Parse.nHei
1ecb0 67 68 74 20 62 79 20 74 68 65 20 68 65 69 67 68  ght by the heigh
1ecc0 74 20 6f 66 20 74 68 65 20 6c 61 72 67 65 73 74  t of the largest
1ecd0 20 65 78 70 72 65 73 73 69 6f 6e 0a 20 20 20 20   expression.    
1ece0 2a 2a 20 74 72 65 65 20 72 65 66 65 72 65 64 20  ** tree refered 
1ecf0 74 6f 20 62 79 20 74 68 69 73 2c 20 74 68 65 20  to by this, the 
1ed00 70 61 72 65 6e 74 20 73 65 6c 65 63 74 2e 20 54  parent select. T
1ed10 68 65 20 63 68 69 6c 64 20 73 65 6c 65 63 74 0a  he child select.
1ed20 20 20 20 20 2a 2a 20 6d 61 79 20 63 6f 6e 74 61      ** may conta
1ed30 69 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 74 72  in expression tr
1ed40 65 65 73 20 6f 66 20 61 74 20 6d 6f 73 74 0a 20  ees of at most. 
1ed50 20 20 20 2a 2a 20 28 53 51 4c 49 54 45 5f 4d 41     ** (SQLITE_MA
1ed60 58 5f 45 58 50 52 5f 44 45 50 54 48 2d 50 61 72  X_EXPR_DEPTH-Par
1ed70 73 65 2e 6e 48 65 69 67 68 74 29 20 68 65 69 67  se.nHeight) heig
1ed80 68 74 2e 20 54 68 69 73 20 69 73 20 61 20 62 69  ht. This is a bi
1ed90 74 0a 20 20 20 20 2a 2a 20 6d 6f 72 65 20 63 6f  t.    ** more co
1eda0 6e 73 65 72 76 61 74 69 76 65 20 74 68 61 6e 20  nservative than 
1edb0 6e 65 63 65 73 73 61 72 79 2c 20 62 75 74 20 6d  necessary, but m
1edc0 75 63 68 20 65 61 73 69 65 72 20 74 68 61 6e 20  uch easier than 
1edd0 65 6e 66 6f 72 63 69 6e 67 0a 20 20 20 20 2a 2a  enforcing.    **
1ede0 20 61 6e 20 65 78 61 63 74 20 6c 69 6d 69 74 2e   an exact limit.
1edf0 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70 50 61 72  .    */.    pPar
1ee00 73 65 2d 3e 6e 48 65 69 67 68 74 20 2b 3d 20 73  se->nHeight += s
1ee10 71 6c 69 74 65 33 53 65 6c 65 63 74 45 78 70 72  qlite3SelectExpr
1ee20 48 65 69 67 68 74 28 70 29 3b 0a 0a 20 20 20 20  Height(p);..    
1ee30 2f 2a 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20  /* Check to see 
1ee40 69 66 20 74 68 65 20 73 75 62 71 75 65 72 79 20  if the subquery 
1ee50 63 61 6e 20 62 65 20 61 62 73 6f 72 62 65 64 20  can be absorbed 
1ee60 69 6e 74 6f 20 74 68 65 20 70 61 72 65 6e 74 2e  into the parent.
1ee70 20 2a 2f 0a 20 20 20 20 69 73 41 67 67 53 75 62   */.    isAggSub
1ee80 20 3d 20 70 53 75 62 2d 3e 69 73 41 67 67 3b 0a   = pSub->isAgg;.
1ee90 20 20 20 20 69 66 28 20 66 6c 61 74 74 65 6e 53      if( flattenS
1eea0 75 62 71 75 65 72 79 28 70 50 61 72 73 65 2c 20  ubquery(pParse, 
1eeb0 70 2c 20 69 2c 20 69 73 41 67 67 2c 20 69 73 41  p, i, isAgg, isA
1eec0 67 67 53 75 62 29 20 29 7b 0a 20 20 20 20 20 20  ggSub) ){.      
1eed0 69 66 28 20 69 73 41 67 67 53 75 62 20 29 7b 0a  if( isAggSub ){.
1eee0 20 20 20 20 20 20 20 20 70 2d 3e 69 73 41 67 67          p->isAgg
1eef0 20 3d 20 69 73 41 67 67 20 3d 20 31 3b 0a 20 20   = isAgg = 1;.  
1ef00 20 20 20 20 7d 0a 20 20 20 20 20 20 69 20 3d 20      }.      i = 
1ef10 2d 31 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  -1;.    }else{. 
1ef20 20 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65       sqlite3Sele
1ef30 63 74 44 65 73 74 49 6e 69 74 28 26 64 65 73 74  ctDestInit(&dest
1ef40 2c 20 53 52 54 5f 45 70 68 65 6d 54 61 62 2c 20  , SRT_EphemTab, 
1ef50 70 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72 29 3b  pItem->iCursor);
1ef60 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 53 65  .      sqlite3Se
1ef70 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70 53 75  lect(pParse, pSu
1ef80 62 2c 20 26 64 65 73 74 2c 20 70 2c 20 69 2c 20  b, &dest, p, i, 
1ef90 26 69 73 41 67 67 29 3b 0a 20 20 20 20 7d 0a 20  &isAgg);.    }. 
1efa0 20 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e     if( pParse->n
1efb0 45 72 72 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f  Err || db->mallo
1efc0 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 20  cFailed ){.     
1efd0 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64   goto select_end
1efe0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 61 72  ;.    }.    pPar
1eff0 73 65 2d 3e 6e 48 65 69 67 68 74 20 2d 3d 20 73  se->nHeight -= s
1f000 71 6c 69 74 65 33 53 65 6c 65 63 74 45 78 70 72  qlite3SelectExpr
1f010 48 65 69 67 68 74 28 70 29 3b 0a 20 20 20 20 70  Height(p);.    p
1f020 54 61 62 4c 69 73 74 20 3d 20 70 2d 3e 70 53 72  TabList = p->pSr
1f030 63 3b 0a 20 20 20 20 69 66 28 20 21 49 67 6e 6f  c;.    if( !Igno
1f040 72 61 62 6c 65 4f 72 64 65 72 62 79 28 70 44 65  rableOrderby(pDe
1f050 73 74 29 20 29 7b 0a 20 20 20 20 20 20 70 4f 72  st) ){.      pOr
1f060 64 65 72 42 79 20 3d 20 70 2d 3e 70 4f 72 64 65  derBy = p->pOrde
1f070 72 42 79 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  rBy;.    }.  }. 
1f080 20 70 45 4c 69 73 74 20 3d 20 70 2d 3e 70 45 4c   pEList = p->pEL
1f090 69 73 74 3b 0a 23 65 6e 64 69 66 0a 20 20 70 57  ist;.#endif.  pW
1f0a0 68 65 72 65 20 3d 20 70 2d 3e 70 57 68 65 72 65  here = p->pWhere
1f0b0 3b 0a 20 20 70 47 72 6f 75 70 42 79 20 3d 20 70  ;.  pGroupBy = p
1f0c0 2d 3e 70 47 72 6f 75 70 42 79 3b 0a 20 20 70 48  ->pGroupBy;.  pH
1f0d0 61 76 69 6e 67 20 3d 20 70 2d 3e 70 48 61 76 69  aving = p->pHavi
1f0e0 6e 67 3b 0a 20 20 69 73 44 69 73 74 69 6e 63 74  ng;.  isDistinct
1f0f0 20 3d 20 70 2d 3e 69 73 44 69 73 74 69 6e 63 74   = p->isDistinct
1f100 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  ;..#ifndef SQLIT
1f110 45 5f 4f 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f  E_OMIT_COMPOUND_
1f120 53 45 4c 45 43 54 0a 20 20 2f 2a 20 49 66 20 74  SELECT.  /* If t
1f130 68 65 72 65 20 69 73 20 61 72 65 20 61 20 73 65  here is are a se
1f140 71 75 65 6e 63 65 20 6f 66 20 71 75 65 72 69 65  quence of querie
1f150 73 2c 20 64 6f 20 74 68 65 20 65 61 72 6c 69 65  s, do the earlie
1f160 72 20 6f 6e 65 73 20 66 69 72 73 74 2e 0a 20 20  r ones first..  
1f170 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 70 50 72 69  */.  if( p->pPri
1f180 6f 72 20 29 7b 0a 20 20 20 20 69 66 28 20 70 2d  or ){.    if( p-
1f190 3e 70 52 69 67 68 74 6d 6f 73 74 3d 3d 30 20 29  >pRightmost==0 )
1f1a0 7b 0a 20 20 20 20 20 20 53 65 6c 65 63 74 20 2a  {.      Select *
1f1b0 70 4c 6f 6f 70 2c 20 2a 70 52 69 67 68 74 20 3d  pLoop, *pRight =
1f1c0 20 30 3b 0a 20 20 20 20 20 20 69 6e 74 20 63 6e   0;.      int cn
1f1d0 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 69 6e 74  t = 0;.      int
1f1e0 20 6d 78 53 65 6c 65 63 74 3b 0a 20 20 20 20 20   mxSelect;.     
1f1f0 20 66 6f 72 28 70 4c 6f 6f 70 3d 70 3b 20 70 4c   for(pLoop=p; pL
1f200 6f 6f 70 3b 20 70 4c 6f 6f 70 3d 70 4c 6f 6f 70  oop; pLoop=pLoop
1f210 2d 3e 70 50 72 69 6f 72 2c 20 63 6e 74 2b 2b 29  ->pPrior, cnt++)
1f220 7b 0a 20 20 20 20 20 20 20 20 70 4c 6f 6f 70 2d  {.        pLoop-
1f230 3e 70 52 69 67 68 74 6d 6f 73 74 20 3d 20 70 3b  >pRightmost = p;
1f240 0a 20 20 20 20 20 20 20 20 70 4c 6f 6f 70 2d 3e  .        pLoop->
1f250 70 4e 65 78 74 20 3d 20 70 52 69 67 68 74 3b 0a  pNext = pRight;.
1f260 20 20 20 20 20 20 20 20 70 52 69 67 68 74 20 3d          pRight =
1f270 20 70 4c 6f 6f 70 3b 0a 20 20 20 20 20 20 7d 0a   pLoop;.      }.
1f280 20 20 20 20 20 20 6d 78 53 65 6c 65 63 74 20 3d        mxSelect =
1f290 20 64 62 2d 3e 61 4c 69 6d 69 74 5b 53 51 4c 49   db->aLimit[SQLI
1f2a0 54 45 5f 4c 49 4d 49 54 5f 43 4f 4d 50 4f 55 4e  TE_LIMIT_COMPOUN
1f2b0 44 5f 53 45 4c 45 43 54 5d 3b 0a 20 20 20 20 20  D_SELECT];.     
1f2c0 20 69 66 28 20 6d 78 53 65 6c 65 63 74 20 26 26   if( mxSelect &&
1f2d0 20 63 6e 74 3e 6d 78 53 65 6c 65 63 74 20 29 7b   cnt>mxSelect ){
1f2e0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
1f2f0 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
1f300 20 22 74 6f 6f 20 6d 61 6e 79 20 74 65 72 6d 73   "too many terms
1f310 20 69 6e 20 63 6f 6d 70 6f 75 6e 64 20 53 45 4c   in compound SEL
1f320 45 43 54 22 29 3b 0a 20 20 20 20 20 20 20 20 72  ECT");.        r
1f330 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 20 20 7d  eturn 1;.      }
1f340 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72  .    }.    retur
1f350 6e 20 6d 75 6c 74 69 53 65 6c 65 63 74 28 70 50  n multiSelect(pP
1f360 61 72 73 65 2c 20 70 2c 20 70 44 65 73 74 29 3b  arse, p, pDest);
1f370 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f  .  }.#endif..  /
1f380 2a 20 49 66 20 77 72 69 74 69 6e 67 20 74 6f 20  * If writing to 
1f390 6d 65 6d 6f 72 79 20 6f 72 20 67 65 6e 65 72 61  memory or genera
1f3a0 74 69 6e 67 20 61 20 73 65 74 0a 20 20 2a 2a 20  ting a set.  ** 
1f3b0 6f 6e 6c 79 20 61 20 73 69 6e 67 6c 65 20 63 6f  only a single co
1f3c0 6c 75 6d 6e 20 6d 61 79 20 62 65 20 6f 75 74 70  lumn may be outp
1f3d0 75 74 2e 0a 20 20 2a 2f 0a 23 69 66 6e 64 65 66  ut..  */.#ifndef
1f3e0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42   SQLITE_OMIT_SUB
1f3f0 51 55 45 52 59 0a 20 20 69 66 28 20 63 68 65 63  QUERY.  if( chec
1f400 6b 46 6f 72 4d 75 6c 74 69 43 6f 6c 75 6d 6e 53  kForMultiColumnS
1f410 65 6c 65 63 74 45 72 72 6f 72 28 70 50 61 72 73  electError(pPars
1f420 65 2c 20 70 44 65 73 74 2c 20 70 45 4c 69 73 74  e, pDest, pEList
1f430 2d 3e 6e 45 78 70 72 29 20 29 7b 0a 20 20 20 20  ->nExpr) ){.    
1f440 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b  goto select_end;
1f450 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f  .  }.#endif..  /
1f460 2a 20 49 66 20 70 6f 73 73 69 62 6c 65 2c 20 72  * If possible, r
1f470 65 77 72 69 74 65 20 74 68 65 20 71 75 65 72 79  ewrite the query
1f480 20 74 6f 20 75 73 65 20 47 52 4f 55 50 20 42 59   to use GROUP BY
1f490 20 69 6e 73 74 65 61 64 20 6f 66 20 44 49 53 54   instead of DIST
1f4a0 49 4e 43 54 2e 0a 20 20 2a 2a 20 47 52 4f 55 50  INCT..  ** GROUP
1f4b0 20 42 59 20 6d 61 79 20 75 73 65 20 61 6e 20 69   BY may use an i
1f4c0 6e 64 65 78 2c 20 44 49 53 54 49 4e 43 54 20 6e  ndex, DISTINCT n
1f4d0 65 76 65 72 20 64 6f 65 73 2e 0a 20 20 2a 2f 0a  ever does..  */.
1f4e0 20 20 69 66 28 20 70 2d 3e 69 73 44 69 73 74 69    if( p->isDisti
1f4f0 6e 63 74 20 26 26 20 21 70 2d 3e 69 73 41 67 67  nct && !p->isAgg
1f500 20 26 26 20 21 70 2d 3e 70 47 72 6f 75 70 42 79   && !p->pGroupBy
1f510 20 29 7b 0a 20 20 20 20 70 2d 3e 70 47 72 6f 75   ){.    p->pGrou
1f520 70 42 79 20 3d 20 73 71 6c 69 74 65 33 45 78 70  pBy = sqlite3Exp
1f530 72 4c 69 73 74 44 75 70 28 64 62 2c 20 70 2d 3e  rListDup(db, p->
1f540 70 45 4c 69 73 74 29 3b 0a 20 20 20 20 70 47 72  pEList);.    pGr
1f550 6f 75 70 42 79 20 3d 20 70 2d 3e 70 47 72 6f 75  oupBy = p->pGrou
1f560 70 42 79 3b 0a 20 20 20 20 70 2d 3e 69 73 44 69  pBy;.    p->isDi
1f570 73 74 69 6e 63 74 20 3d 20 30 3b 0a 20 20 20 20  stinct = 0;.    
1f580 69 73 44 69 73 74 69 6e 63 74 20 3d 20 30 3b 0a  isDistinct = 0;.
1f590 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65    }..  /* If the
1f5a0 72 65 20 69 73 20 61 6e 20 4f 52 44 45 52 20 42  re is an ORDER B
1f5b0 59 20 63 6c 61 75 73 65 2c 20 74 68 65 6e 20 74  Y clause, then t
1f5c0 68 69 73 20 73 6f 72 74 69 6e 67 0a 20 20 2a 2a  his sorting.  **
1f5d0 20 69 6e 64 65 78 20 6d 69 67 68 74 20 65 6e 64   index might end
1f5e0 20 75 70 20 62 65 69 6e 67 20 75 6e 75 73 65 64   up being unused
1f5f0 20 69 66 20 74 68 65 20 64 61 74 61 20 63 61 6e   if the data can
1f600 20 62 65 20 0a 20 20 2a 2a 20 65 78 74 72 61 63   be .  ** extrac
1f610 74 65 64 20 69 6e 20 70 72 65 2d 73 6f 72 74 65  ted in pre-sorte
1f620 64 20 6f 72 64 65 72 2e 20 20 49 66 20 74 68 61  d order.  If tha
1f630 74 20 69 73 20 74 68 65 20 63 61 73 65 2c 20 74  t is the case, t
1f640 68 65 6e 20 74 68 65 0a 20 20 2a 2a 20 4f 50 5f  hen the.  ** OP_
1f650 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 20 69 6e  OpenEphemeral in
1f660 73 74 72 75 63 74 69 6f 6e 20 77 69 6c 6c 20 62  struction will b
1f670 65 20 63 68 61 6e 67 65 64 20 74 6f 20 61 6e 20  e changed to an 
1f680 4f 50 5f 4e 6f 6f 70 20 6f 6e 63 65 0a 20 20 2a  OP_Noop once.  *
1f690 2a 20 77 65 20 66 69 67 75 72 65 20 6f 75 74 20  * we figure out 
1f6a0 74 68 61 74 20 74 68 65 20 73 6f 72 74 69 6e 67  that the sorting
1f6b0 20 69 6e 64 65 78 20 69 73 20 6e 6f 74 20 6e 65   index is not ne
1f6c0 65 64 65 64 2e 20 20 54 68 65 20 61 64 64 72 53  eded.  The addrS
1f6d0 6f 72 74 49 6e 64 65 78 0a 20 20 2a 2a 20 76 61  ortIndex.  ** va
1f6e0 72 69 61 62 6c 65 20 69 73 20 75 73 65 64 20 74  riable is used t
1f6f0 6f 20 66 61 63 69 6c 69 74 61 74 65 20 74 68 61  o facilitate tha
1f700 74 20 63 68 61 6e 67 65 2e 0a 20 20 2a 2f 0a 20  t change..  */. 
1f710 20 69 66 28 20 70 4f 72 64 65 72 42 79 20 29 7b   if( pOrderBy ){
1f720 0a 20 20 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b  .    KeyInfo *pK
1f730 65 79 49 6e 66 6f 3b 0a 20 20 20 20 70 4b 65 79  eyInfo;.    pKey
1f740 49 6e 66 6f 20 3d 20 6b 65 79 49 6e 66 6f 46 72  Info = keyInfoFr
1f750 6f 6d 45 78 70 72 4c 69 73 74 28 70 50 61 72 73  omExprList(pPars
1f760 65 2c 20 70 4f 72 64 65 72 42 79 29 3b 0a 20 20  e, pOrderBy);.  
1f770 20 20 70 4f 72 64 65 72 42 79 2d 3e 69 45 43 75    pOrderBy->iECu
1f780 72 73 6f 72 20 3d 20 70 50 61 72 73 65 2d 3e 6e  rsor = pParse->n
1f790 54 61 62 2b 2b 3b 0a 20 20 20 20 70 2d 3e 61 64  Tab++;.    p->ad
1f7a0 64 72 4f 70 65 6e 45 70 68 6d 5b 32 5d 20 3d 20  drOpenEphm[2] = 
1f7b0 61 64 64 72 53 6f 72 74 49 6e 64 65 78 20 3d 0a  addrSortIndex =.
1f7c0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
1f7d0 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 4f 70  eAddOp4(v, OP_Op
1f7e0 65 6e 45 70 68 65 6d 65 72 61 6c 2c 0a 20 20 20  enEphemeral,.   
1f7f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f800 20 20 20 20 20 20 20 20 70 4f 72 64 65 72 42 79          pOrderBy
1f810 2d 3e 69 45 43 75 72 73 6f 72 2c 20 70 4f 72 64  ->iECursor, pOrd
1f820 65 72 42 79 2d 3e 6e 45 78 70 72 2b 32 2c 20 30  erBy->nExpr+2, 0
1f830 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
1f840 20 20 20 20 20 20 20 20 20 20 20 20 20 28 63 68               (ch
1f850 61 72 2a 29 70 4b 65 79 49 6e 66 6f 2c 20 50 34  ar*)pKeyInfo, P4
1f860 5f 4b 45 59 49 4e 46 4f 5f 48 41 4e 44 4f 46 46  _KEYINFO_HANDOFF
1f870 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
1f880 61 64 64 72 53 6f 72 74 49 6e 64 65 78 20 3d 20  addrSortIndex = 
1f890 2d 31 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66  -1;.  }..  /* If
1f8a0 20 74 68 65 20 6f 75 74 70 75 74 20 69 73 20 64   the output is d
1f8b0 65 73 74 69 6e 65 64 20 66 6f 72 20 61 20 74 65  estined for a te
1f8c0 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 2c 20 6f  mporary table, o
1f8d0 70 65 6e 20 74 68 61 74 20 74 61 62 6c 65 2e 0a  pen that table..
1f8e0 20 20 2a 2f 0a 20 20 69 66 28 20 70 44 65 73 74    */.  if( pDest
1f8f0 2d 3e 65 44 65 73 74 3d 3d 53 52 54 5f 45 70 68  ->eDest==SRT_Eph
1f900 65 6d 54 61 62 20 29 7b 0a 20 20 20 20 73 71 6c  emTab ){.    sql
1f910 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
1f920 2c 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72  , OP_OpenEphemer
1f930 61 6c 2c 20 70 44 65 73 74 2d 3e 69 50 61 72 6d  al, pDest->iParm
1f940 2c 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 29  , pEList->nExpr)
1f950 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 65 74 20  ;.  }..  /* Set 
1f960 74 68 65 20 6c 69 6d 69 74 65 72 2e 0a 20 20 2a  the limiter..  *
1f970 2f 0a 20 20 69 45 6e 64 20 3d 20 73 71 6c 69 74  /.  iEnd = sqlit
1f980 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28  e3VdbeMakeLabel(
1f990 76 29 3b 0a 20 20 63 6f 6d 70 75 74 65 4c 69 6d  v);.  computeLim
1f9a0 69 74 52 65 67 69 73 74 65 72 73 28 70 50 61 72  itRegisters(pPar
1f9b0 73 65 2c 20 70 2c 20 69 45 6e 64 29 3b 0a 0a 20  se, p, iEnd);.. 
1f9c0 20 2f 2a 20 4f 70 65 6e 20 61 20 76 69 72 74 75   /* Open a virtu
1f9d0 61 6c 20 69 6e 64 65 78 20 74 6f 20 75 73 65 20  al index to use 
1f9e0 66 6f 72 20 74 68 65 20 64 69 73 74 69 6e 63 74  for the distinct
1f9f0 20 73 65 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28   set..  */.  if(
1fa00 20 69 73 44 69 73 74 69 6e 63 74 20 29 7b 0a 20   isDistinct ){. 
1fa10 20 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79     KeyInfo *pKey
1fa20 49 6e 66 6f 3b 0a 20 20 20 20 61 73 73 65 72 74  Info;.    assert
1fa30 28 20 69 73 41 67 67 20 7c 7c 20 70 47 72 6f 75  ( isAgg || pGrou
1fa40 70 42 79 20 29 3b 0a 20 20 20 20 64 69 73 74 69  pBy );.    disti
1fa50 6e 63 74 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54  nct = pParse->nT
1fa60 61 62 2b 2b 3b 0a 20 20 20 20 70 4b 65 79 49 6e  ab++;.    pKeyIn
1fa70 66 6f 20 3d 20 6b 65 79 49 6e 66 6f 46 72 6f 6d  fo = keyInfoFrom
1fa80 45 78 70 72 4c 69 73 74 28 70 50 61 72 73 65 2c  ExprList(pParse,
1fa90 20 70 2d 3e 70 45 4c 69 73 74 29 3b 0a 20 20 20   p->pEList);.   
1faa0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
1fab0 70 34 28 76 2c 20 4f 50 5f 4f 70 65 6e 45 70 68  p4(v, OP_OpenEph
1fac0 65 6d 65 72 61 6c 2c 20 64 69 73 74 69 6e 63 74  emeral, distinct
1fad0 2c 20 30 2c 20 30 2c 0a 20 20 20 20 20 20 20 20  , 0, 0,.        
1fae0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1faf0 28 63 68 61 72 2a 29 70 4b 65 79 49 6e 66 6f 2c  (char*)pKeyInfo,
1fb00 20 50 34 5f 4b 45 59 49 4e 46 4f 5f 48 41 4e 44   P4_KEYINFO_HAND
1fb10 4f 46 46 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  OFF);.  }else{. 
1fb20 20 20 20 64 69 73 74 69 6e 63 74 20 3d 20 2d 31     distinct = -1
1fb30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 67 67 72  ;.  }..  /* Aggr
1fb40 65 67 61 74 65 20 61 6e 64 20 6e 6f 6e 2d 61 67  egate and non-ag
1fb50 67 72 65 67 61 74 65 20 71 75 65 72 69 65 73 20  gregate queries 
1fb60 61 72 65 20 68 61 6e 64 6c 65 64 20 64 69 66 66  are handled diff
1fb70 65 72 65 6e 74 6c 79 20 2a 2f 0a 20 20 69 66 28  erently */.  if(
1fb80 20 21 69 73 41 67 67 20 26 26 20 70 47 72 6f 75   !isAgg && pGrou
1fb90 70 42 79 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a  pBy==0 ){.    /*
1fba0 20 54 68 69 73 20 63 61 73 65 20 69 73 20 66 6f   This case is fo
1fbb0 72 20 6e 6f 6e 2d 61 67 67 72 65 67 61 74 65 20  r non-aggregate 
1fbc0 71 75 65 72 69 65 73 0a 20 20 20 20 2a 2a 20 42  queries.    ** B
1fbd0 65 67 69 6e 20 74 68 65 20 64 61 74 61 62 61 73  egin the databas
1fbe0 65 20 73 63 61 6e 0a 20 20 20 20 2a 2f 0a 20 20  e scan.    */.  
1fbf0 20 20 70 57 49 6e 66 6f 20 3d 20 73 71 6c 69 74    pWInfo = sqlit
1fc00 65 33 57 68 65 72 65 42 65 67 69 6e 28 70 50 61  e3WhereBegin(pPa
1fc10 72 73 65 2c 20 70 54 61 62 4c 69 73 74 2c 20 70  rse, pTabList, p
1fc20 57 68 65 72 65 2c 20 26 70 4f 72 64 65 72 42 79  Where, &pOrderBy
1fc30 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 70 57  , 0);.    if( pW
1fc40 49 6e 66 6f 3d 3d 30 20 29 20 67 6f 74 6f 20 73  Info==0 ) goto s
1fc50 65 6c 65 63 74 5f 65 6e 64 3b 0a 0a 20 20 20 20  elect_end;..    
1fc60 2f 2a 20 49 66 20 73 6f 72 74 69 6e 67 20 69 6e  /* If sorting in
1fc70 64 65 78 20 74 68 61 74 20 77 61 73 20 63 72 65  dex that was cre
1fc80 61 74 65 64 20 62 79 20 61 20 70 72 69 6f 72 20  ated by a prior 
1fc90 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c  OP_OpenEphemeral
1fca0 20 0a 20 20 20 20 2a 2a 20 69 6e 73 74 72 75 63   .    ** instruc
1fcb0 74 69 6f 6e 20 65 6e 64 65 64 20 75 70 20 6e 6f  tion ended up no
1fcc0 74 20 62 65 69 6e 67 20 6e 65 65 64 65 64 2c 20  t being needed, 
1fcd0 74 68 65 6e 20 63 68 61 6e 67 65 20 74 68 65 20  then change the 
1fce0 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c  OP_OpenEphemeral
1fcf0 0a 20 20 20 20 2a 2a 20 69 6e 74 6f 20 61 6e 20  .    ** into an 
1fd00 4f 50 5f 4e 6f 6f 70 2e 0a 20 20 20 20 2a 2f 0a  OP_Noop..    */.
1fd10 20 20 20 20 69 66 28 20 61 64 64 72 53 6f 72 74      if( addrSort
1fd20 49 6e 64 65 78 3e 3d 30 20 26 26 20 70 4f 72 64  Index>=0 && pOrd
1fd30 65 72 42 79 3d 3d 30 20 29 7b 0a 20 20 20 20 20  erBy==0 ){.     
1fd40 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e   sqlite3VdbeChan
1fd50 67 65 54 6f 4e 6f 6f 70 28 76 2c 20 61 64 64 72  geToNoop(v, addr
1fd60 53 6f 72 74 49 6e 64 65 78 2c 20 31 29 3b 0a 20  SortIndex, 1);. 
1fd70 20 20 20 20 20 70 2d 3e 61 64 64 72 4f 70 65 6e       p->addrOpen
1fd80 45 70 68 6d 5b 32 5d 20 3d 20 2d 31 3b 0a 20 20  Ephm[2] = -1;.  
1fd90 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 55 73 65 20    }..    /* Use 
1fda0 74 68 65 20 73 74 61 6e 64 61 72 64 20 69 6e 6e  the standard inn
1fdb0 65 72 20 6c 6f 6f 70 0a 20 20 20 20 2a 2f 0a 20  er loop.    */. 
1fdc0 20 20 20 61 73 73 65 72 74 28 21 69 73 44 69 73     assert(!isDis
1fdd0 74 69 6e 63 74 29 3b 0a 20 20 20 20 73 65 6c 65  tinct);.    sele
1fde0 63 74 49 6e 6e 65 72 4c 6f 6f 70 28 70 50 61 72  ctInnerLoop(pPar
1fdf0 73 65 2c 20 70 2c 20 70 45 4c 69 73 74 2c 20 30  se, p, pEList, 0
1fe00 2c 20 30 2c 20 70 4f 72 64 65 72 42 79 2c 20 2d  , 0, pOrderBy, -
1fe10 31 2c 20 70 44 65 73 74 2c 0a 20 20 20 20 20 20  1, pDest,.      
1fe20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 57                pW
1fe30 49 6e 66 6f 2d 3e 69 43 6f 6e 74 69 6e 75 65 2c  Info->iContinue,
1fe40 20 70 57 49 6e 66 6f 2d 3e 69 42 72 65 61 6b 29   pWInfo->iBreak)
1fe50 3b 0a 0a 20 20 20 20 2f 2a 20 45 6e 64 20 74 68  ;..    /* End th
1fe60 65 20 64 61 74 61 62 61 73 65 20 73 63 61 6e 20  e database scan 
1fe70 6c 6f 6f 70 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  loop..    */.   
1fe80 20 73 71 6c 69 74 65 33 57 68 65 72 65 45 6e 64   sqlite3WhereEnd
1fe90 28 70 57 49 6e 66 6f 29 3b 0a 20 20 7d 65 6c 73  (pWInfo);.  }els
1fea0 65 7b 0a 20 20 20 20 2f 2a 20 54 68 69 73 20 69  e{.    /* This i
1feb0 73 20 74 68 65 20 70 72 6f 63 65 73 73 69 6e 67  s the processing
1fec0 20 66 6f 72 20 61 67 67 72 65 67 61 74 65 20 71   for aggregate q
1fed0 75 65 72 69 65 73 20 2a 2f 0a 20 20 20 20 4e 61  ueries */.    Na
1fee0 6d 65 43 6f 6e 74 65 78 74 20 73 4e 43 3b 20 20  meContext sNC;  
1fef0 20 20 2f 2a 20 4e 61 6d 65 20 63 6f 6e 74 65 78    /* Name contex
1ff00 74 20 66 6f 72 20 70 72 6f 63 65 73 73 69 6e 67  t for processing
1ff10 20 61 67 67 72 65 67 61 74 65 20 69 6e 66 6f 72   aggregate infor
1ff20 6d 61 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 69 6e  mation */.    in
1ff30 74 20 69 41 4d 65 6d 3b 20 20 20 20 20 20 20 20  t iAMem;        
1ff40 20 20 2f 2a 20 46 69 72 73 74 20 4d 65 6d 20 61    /* First Mem a
1ff50 64 64 72 65 73 73 20 66 6f 72 20 73 74 6f 72 69  ddress for stori
1ff60 6e 67 20 63 75 72 72 65 6e 74 20 47 52 4f 55 50  ng current GROUP
1ff70 20 42 59 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69   BY */.    int i
1ff80 42 4d 65 6d 3b 20 20 20 20 20 20 20 20 20 20 2f  BMem;          /
1ff90 2a 20 46 69 72 73 74 20 4d 65 6d 20 61 64 64 72  * First Mem addr
1ffa0 65 73 73 20 66 6f 72 20 70 72 65 76 69 6f 75 73  ess for previous
1ffb0 20 47 52 4f 55 50 20 42 59 20 2a 2f 0a 20 20 20   GROUP BY */.   
1ffc0 20 69 6e 74 20 69 55 73 65 46 6c 61 67 3b 20 20   int iUseFlag;  
1ffd0 20 20 20 20 20 2f 2a 20 4d 65 6d 20 61 64 64 72       /* Mem addr
1ffe0 65 73 73 20 68 6f 6c 64 69 6e 67 20 66 6c 61 67  ess holding flag
1fff0 20 69 6e 64 69 63 61 74 69 6e 67 20 74 68 61 74   indicating that
20000 20 61 74 20 6c 65 61 73 74 0a 20 20 20 20 20 20   at least.      
20010 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20020 20 20 2a 2a 20 6f 6e 65 20 72 6f 77 20 6f 66 20    ** one row of 
20030 74 68 65 20 69 6e 70 75 74 20 74 6f 20 74 68 65  the input to the
20040 20 61 67 67 72 65 67 61 74 6f 72 20 68 61 73 20   aggregator has 
20050 62 65 65 6e 0a 20 20 20 20 20 20 20 20 20 20 20  been.           
20060 20 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20               ** 
20070 70 72 6f 63 65 73 73 65 64 20 2a 2f 0a 20 20 20  processed */.   
20080 20 69 6e 74 20 69 41 62 6f 72 74 46 6c 61 67 3b   int iAbortFlag;
20090 20 20 20 20 20 2f 2a 20 4d 65 6d 20 61 64 64 72       /* Mem addr
200a0 65 73 73 20 77 68 69 63 68 20 63 61 75 73 65 73  ess which causes
200b0 20 71 75 65 72 79 20 61 62 6f 72 74 20 69 66 20   query abort if 
200c0 70 6f 73 69 74 69 76 65 20 2a 2f 0a 20 20 20 20  positive */.    
200d0 69 6e 74 20 67 72 6f 75 70 42 79 53 6f 72 74 3b  int groupBySort;
200e0 20 20 20 20 2f 2a 20 52 6f 77 73 20 63 6f 6d 65      /* Rows come
200f0 20 66 72 6f 6d 20 73 6f 75 72 63 65 20 69 6e 20   from source in 
20100 47 52 4f 55 50 20 42 59 20 6f 72 64 65 72 20 2a  GROUP BY order *
20110 2f 0a 0a 0a 20 20 20 20 2f 2a 20 54 68 65 20 66  /...    /* The f
20120 6f 6c 6c 6f 77 69 6e 67 20 76 61 72 69 61 62 6c  ollowing variabl
20130 65 73 20 68 6f 6c 64 20 61 64 64 72 65 73 73 65  es hold addresse
20140 73 20 6f 72 20 6c 61 62 65 6c 73 20 66 6f 72 20  s or labels for 
20150 70 61 72 74 73 20 6f 66 20 74 68 65 0a 20 20 20  parts of the.   
20160 20 2a 2a 20 76 69 72 74 75 61 6c 20 6d 61 63 68   ** virtual mach
20170 69 6e 65 20 70 72 6f 67 72 61 6d 20 77 65 20 61  ine program we a
20180 72 65 20 70 75 74 74 69 6e 67 20 74 6f 67 65 74  re putting toget
20190 68 65 72 20 2a 2f 0a 20 20 20 20 69 6e 74 20 61  her */.    int a
201a0 64 64 72 4f 75 74 70 75 74 52 6f 77 3b 20 20 20  ddrOutputRow;   
201b0 20 20 20 2f 2a 20 53 74 61 72 74 20 6f 66 20 73     /* Start of s
201c0 75 62 72 6f 75 74 69 6e 65 20 74 68 61 74 20 6f  ubroutine that o
201d0 75 74 70 75 74 73 20 61 20 72 65 73 75 6c 74 20  utputs a result 
201e0 72 6f 77 20 2a 2f 0a 20 20 20 20 69 6e 74 20 72  row */.    int r
201f0 65 67 4f 75 74 70 75 74 52 6f 77 3b 20 20 20 20  egOutputRow;    
20200 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 61 64 64     /* Return add
20210 72 65 73 73 20 72 65 67 69 73 74 65 72 20 66 6f  ress register fo
20220 72 20 6f 75 74 70 75 74 20 73 75 62 72 6f 75 74  r output subrout
20230 69 6e 65 20 2a 2f 0a 20 20 20 20 69 6e 74 20 61  ine */.    int a
20240 64 64 72 53 65 74 41 62 6f 72 74 3b 20 20 20 20  ddrSetAbort;    
20250 20 20 20 2f 2a 20 53 65 74 20 74 68 65 20 61 62     /* Set the ab
20260 6f 72 74 20 66 6c 61 67 20 61 6e 64 20 72 65 74  ort flag and ret
20270 75 72 6e 20 2a 2f 0a 20 20 20 20 69 6e 74 20 61  urn */.    int a
20280 64 64 72 49 6e 69 74 69 61 6c 69 7a 65 4c 6f 6f  ddrInitializeLoo
20290 70 3b 20 2f 2a 20 53 74 61 72 74 20 6f 66 20 63  p; /* Start of c
202a0 6f 64 65 20 74 68 61 74 20 69 6e 69 74 69 61 6c  ode that initial
202b0 69 7a 65 73 20 74 68 65 20 69 6e 70 75 74 20 6c  izes the input l
202c0 6f 6f 70 20 2a 2f 0a 20 20 20 20 69 6e 74 20 61  oop */.    int a
202d0 64 64 72 54 6f 70 4f 66 4c 6f 6f 70 3b 20 20 20  ddrTopOfLoop;   
202e0 20 20 20 2f 2a 20 54 6f 70 20 6f 66 20 74 68 65     /* Top of the
202f0 20 69 6e 70 75 74 20 6c 6f 6f 70 20 2a 2f 0a 20   input loop */. 
20300 20 20 20 69 6e 74 20 61 64 64 72 45 6e 64 3b 20     int addrEnd; 
20310 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 6e             /* En
20320 64 20 6f 66 20 61 6c 6c 20 70 72 6f 63 65 73 73  d of all process
20330 69 6e 67 20 2a 2f 0a 20 20 20 20 69 6e 74 20 61  ing */.    int a
20340 64 64 72 53 6f 72 74 69 6e 67 49 64 78 3b 20 20  ddrSortingIdx;  
20350 20 20 20 2f 2a 20 54 68 65 20 4f 50 5f 4f 70 65     /* The OP_Ope
20360 6e 45 70 68 65 6d 65 72 61 6c 20 66 6f 72 20 74  nEphemeral for t
20370 68 65 20 73 6f 72 74 69 6e 67 20 69 6e 64 65 78  he sorting index
20380 20 2a 2f 0a 20 20 20 20 69 6e 74 20 61 64 64 72   */.    int addr
20390 52 65 73 65 74 3b 20 20 20 20 20 20 20 20 20 20  Reset;          
203a0 2f 2a 20 53 75 62 72 6f 75 74 69 6e 65 20 66 6f  /* Subroutine fo
203b0 72 20 72 65 73 65 74 74 69 6e 67 20 74 68 65 20  r resetting the 
203c0 61 63 63 75 6d 75 6c 61 74 6f 72 20 2a 2f 0a 20  accumulator */. 
203d0 20 20 20 69 6e 74 20 72 65 67 52 65 73 65 74 3b     int regReset;
203e0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
203f0 74 75 72 6e 20 61 64 64 72 65 73 73 20 72 65 67  turn address reg
20400 69 73 74 65 72 20 66 6f 72 20 72 65 73 65 74 20  ister for reset 
20410 73 75 62 72 6f 75 74 69 6e 65 20 2a 2f 0a 0a 20  subroutine */.. 
20420 20 20 20 61 64 64 72 45 6e 64 20 3d 20 73 71 6c     addrEnd = sql
20430 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65  ite3VdbeMakeLabe
20440 6c 28 76 29 3b 0a 0a 20 20 20 20 2f 2a 20 43 6f  l(v);..    /* Co
20450 6e 76 65 72 74 20 54 4b 5f 43 4f 4c 55 4d 4e 20  nvert TK_COLUMN 
20460 6e 6f 64 65 73 20 69 6e 74 6f 20 54 4b 5f 41 47  nodes into TK_AG
20470 47 5f 43 4f 4c 55 4d 4e 20 61 6e 64 20 6d 61 6b  G_COLUMN and mak
20480 65 20 65 6e 74 72 69 65 73 20 69 6e 0a 20 20 20  e entries in.   
20490 20 2a 2a 20 73 41 67 67 49 6e 66 6f 20 66 6f 72   ** sAggInfo for
204a0 20 61 6c 6c 20 54 4b 5f 41 47 47 5f 46 55 4e 43   all TK_AGG_FUNC
204b0 54 49 4f 4e 20 6e 6f 64 65 73 20 69 6e 20 65 78  TION nodes in ex
204c0 70 72 65 73 73 69 6f 6e 73 20 6f 66 20 74 68 65  pressions of the
204d0 0a 20 20 20 20 2a 2a 20 53 45 4c 45 43 54 20 73  .    ** SELECT s
204e0 74 61 74 65 6d 65 6e 74 2e 0a 20 20 20 20 2a 2f  tatement..    */
204f0 0a 20 20 20 20 6d 65 6d 73 65 74 28 26 73 4e 43  .    memset(&sNC
20500 2c 20 30 2c 20 73 69 7a 65 6f 66 28 73 4e 43 29  , 0, sizeof(sNC)
20510 29 3b 0a 20 20 20 20 73 4e 43 2e 70 50 61 72 73  );.    sNC.pPars
20520 65 20 3d 20 70 50 61 72 73 65 3b 0a 20 20 20 20  e = pParse;.    
20530 73 4e 43 2e 70 53 72 63 4c 69 73 74 20 3d 20 70  sNC.pSrcList = p
20540 54 61 62 4c 69 73 74 3b 0a 20 20 20 20 73 4e 43  TabList;.    sNC
20550 2e 70 41 67 67 49 6e 66 6f 20 3d 20 26 73 41 67  .pAggInfo = &sAg
20560 67 49 6e 66 6f 3b 0a 20 20 20 20 73 41 67 67 49  gInfo;.    sAggI
20570 6e 66 6f 2e 6e 53 6f 72 74 69 6e 67 43 6f 6c 75  nfo.nSortingColu
20580 6d 6e 20 3d 20 70 47 72 6f 75 70 42 79 20 3f 20  mn = pGroupBy ? 
20590 70 47 72 6f 75 70 42 79 2d 3e 6e 45 78 70 72 2b  pGroupBy->nExpr+
205a0 31 20 3a 20 30 3b 0a 20 20 20 20 73 41 67 67 49  1 : 0;.    sAggI
205b0 6e 66 6f 2e 70 47 72 6f 75 70 42 79 20 3d 20 70  nfo.pGroupBy = p
205c0 47 72 6f 75 70 42 79 3b 0a 20 20 20 20 73 71 6c  GroupBy;.    sql
205d0 69 74 65 33 45 78 70 72 41 6e 61 6c 79 7a 65 41  ite3ExprAnalyzeA
205e0 67 67 4c 69 73 74 28 26 73 4e 43 2c 20 70 45 4c  ggList(&sNC, pEL
205f0 69 73 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  ist);.    sqlite
20600 33 45 78 70 72 41 6e 61 6c 79 7a 65 41 67 67 4c  3ExprAnalyzeAggL
20610 69 73 74 28 26 73 4e 43 2c 20 70 4f 72 64 65 72  ist(&sNC, pOrder
20620 42 79 29 3b 0a 20 20 20 20 69 66 28 20 70 48 61  By);.    if( pHa
20630 76 69 6e 67 20 29 7b 0a 20 20 20 20 20 20 73 71  ving ){.      sq
20640 6c 69 74 65 33 45 78 70 72 41 6e 61 6c 79 7a 65  lite3ExprAnalyze
20650 41 67 67 72 65 67 61 74 65 73 28 26 73 4e 43 2c  Aggregates(&sNC,
20660 20 70 48 61 76 69 6e 67 29 3b 0a 20 20 20 20 7d   pHaving);.    }
20670 0a 20 20 20 20 73 41 67 67 49 6e 66 6f 2e 6e 41  .    sAggInfo.nA
20680 63 63 75 6d 75 6c 61 74 6f 72 20 3d 20 73 41 67  ccumulator = sAg
20690 67 49 6e 66 6f 2e 6e 43 6f 6c 75 6d 6e 3b 0a 20  gInfo.nColumn;. 
206a0 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 73 41     for(i=0; i<sA
206b0 67 67 49 6e 66 6f 2e 6e 46 75 6e 63 3b 20 69 2b  ggInfo.nFunc; i+
206c0 2b 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  +){.      sqlite
206d0 33 45 78 70 72 41 6e 61 6c 79 7a 65 41 67 67 4c  3ExprAnalyzeAggL
206e0 69 73 74 28 26 73 4e 43 2c 20 73 41 67 67 49 6e  ist(&sNC, sAggIn
206f0 66 6f 2e 61 46 75 6e 63 5b 69 5d 2e 70 45 78 70  fo.aFunc[i].pExp
20700 72 2d 3e 70 4c 69 73 74 29 3b 0a 20 20 20 20 7d  r->pList);.    }
20710 0a 20 20 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c  .    if( db->mal
20720 6c 6f 63 46 61 69 6c 65 64 20 29 20 67 6f 74 6f  locFailed ) goto
20730 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 0a 20 20   select_end;..  
20740 20 20 2f 2a 20 50 72 6f 63 65 73 73 69 6e 67 20    /* Processing 
20750 66 6f 72 20 61 67 67 72 65 67 61 74 65 73 20 77  for aggregates w
20760 69 74 68 20 47 52 4f 55 50 20 42 59 20 69 73 20  ith GROUP BY is 
20770 76 65 72 79 20 64 69 66 66 65 72 65 6e 74 20 61  very different a
20780 6e 64 0a 20 20 20 20 2a 2a 20 6d 75 63 68 20 6d  nd.    ** much m
20790 6f 72 65 20 63 6f 6d 70 6c 65 78 20 74 68 61 6e  ore complex than
207a0 20 61 67 67 72 65 67 61 74 65 73 20 77 69 74 68   aggregates with
207b0 6f 75 74 20 61 20 47 52 4f 55 50 20 42 59 2e 0a  out a GROUP BY..
207c0 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70      */.    if( p
207d0 47 72 6f 75 70 42 79 20 29 7b 0a 20 20 20 20 20  GroupBy ){.     
207e0 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e   KeyInfo *pKeyIn
207f0 66 6f 3b 20 20 2f 2a 20 4b 65 79 69 6e 67 20 69  fo;  /* Keying i
20800 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 6f 72 20 74  nformation for t
20810 68 65 20 67 72 6f 75 70 20 62 79 20 63 6c 61 75  he group by clau
20820 73 65 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20  se */.      int 
20830 6a 31 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 43 72  j1;..      /* Cr
20840 65 61 74 65 20 6c 61 62 65 6c 73 20 74 68 61 74  eate labels that
20850 20 77 65 20 77 69 6c 6c 20 62 65 20 6e 65 65 64   we will be need
20860 69 6e 67 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  ing.      */.   
20870 20 20 20 61 64 64 72 49 6e 69 74 69 61 6c 69 7a     addrInitializ
20880 65 4c 6f 6f 70 20 3d 20 73 71 6c 69 74 65 33 56  eLoop = sqlite3V
20890 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b  dbeMakeLabel(v);
208a0 0a 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68  ..      /* If th
208b0 65 72 65 20 69 73 20 61 20 47 52 4f 55 50 20 42  ere is a GROUP B
208c0 59 20 63 6c 61 75 73 65 20 77 65 20 6d 69 67 68  Y clause we migh
208d0 74 20 6e 65 65 64 20 61 20 73 6f 72 74 69 6e 67  t need a sorting
208e0 20 69 6e 64 65 78 20 74 6f 0a 20 20 20 20 20 20   index to.      
208f0 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74 20 69 74 2e  ** implement it.
20900 20 20 41 6c 6c 6f 63 61 74 65 20 74 68 61 74 20    Allocate that 
20910 73 6f 72 74 69 6e 67 20 69 6e 64 65 78 20 6e 6f  sorting index no
20920 77 2e 20 20 49 66 20 69 74 20 74 75 72 6e 73 20  w.  If it turns 
20930 6f 75 74 0a 20 20 20 20 20 20 2a 2a 20 74 68 61  out.      ** tha
20940 74 20 77 65 20 64 6f 20 6e 6f 74 20 6e 65 65 64  t we do not need
20950 20 69 74 20 61 66 74 65 72 20 61 6c 6c 2c 20 74   it after all, t
20960 68 65 20 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c  he OpenEphemeral
20970 20 69 6e 73 74 72 75 63 74 69 6f 6e 0a 20 20 20   instruction.   
20980 20 20 20 2a 2a 20 77 69 6c 6c 20 62 65 20 63 6f     ** will be co
20990 6e 76 65 72 74 65 64 20 69 6e 74 6f 20 61 20 4e  nverted into a N
209a0 6f 6f 70 2e 20 20 0a 20 20 20 20 20 20 2a 2f 0a  oop.  .      */.
209b0 20 20 20 20 20 20 73 41 67 67 49 6e 66 6f 2e 73        sAggInfo.s
209c0 6f 72 74 69 6e 67 49 64 78 20 3d 20 70 50 61 72  ortingIdx = pPar
209d0 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20  se->nTab++;.    
209e0 20 20 70 4b 65 79 49 6e 66 6f 20 3d 20 6b 65 79    pKeyInfo = key
209f0 49 6e 66 6f 46 72 6f 6d 45 78 70 72 4c 69 73 74  InfoFromExprList
20a00 28 70 50 61 72 73 65 2c 20 70 47 72 6f 75 70 42  (pParse, pGroupB
20a10 79 29 3b 0a 20 20 20 20 20 20 61 64 64 72 53 6f  y);.      addrSo
20a20 72 74 69 6e 67 49 64 78 20 3d 20 73 71 6c 69 74  rtingIdx = sqlit
20a30 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20  e3VdbeAddOp4(v, 
20a40 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c  OP_OpenEphemeral
20a50 2c 20 0a 20 20 20 20 20 20 20 20 20 20 73 41 67  , .          sAg
20a60 67 49 6e 66 6f 2e 73 6f 72 74 69 6e 67 49 64 78  gInfo.sortingIdx
20a70 2c 20 73 41 67 67 49 6e 66 6f 2e 6e 53 6f 72 74  , sAggInfo.nSort
20a80 69 6e 67 43 6f 6c 75 6d 6e 2c 20 0a 20 20 20 20  ingColumn, .    
20a90 20 20 20 20 20 20 30 2c 20 28 63 68 61 72 2a 29        0, (char*)
20aa0 70 4b 65 79 49 6e 66 6f 2c 20 50 34 5f 4b 45 59  pKeyInfo, P4_KEY
20ab0 49 4e 46 4f 5f 48 41 4e 44 4f 46 46 29 3b 0a 0a  INFO_HANDOFF);..
20ac0 20 20 20 20 20 20 2f 2a 20 49 6e 69 74 69 61 6c        /* Initial
20ad0 69 7a 65 20 6d 65 6d 6f 72 79 20 6c 6f 63 61 74  ize memory locat
20ae0 69 6f 6e 73 20 75 73 65 64 20 62 79 20 47 52 4f  ions used by GRO
20af0 55 50 20 42 59 20 61 67 67 72 65 67 61 74 65 20  UP BY aggregate 
20b00 70 72 6f 63 65 73 73 69 6e 67 0a 20 20 20 20 20  processing.     
20b10 20 2a 2f 0a 20 20 20 20 20 20 69 55 73 65 46 6c   */.      iUseFl
20b20 61 67 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e  ag = ++pParse->n
20b30 4d 65 6d 3b 0a 20 20 20 20 20 20 69 41 62 6f 72  Mem;.      iAbor
20b40 74 46 6c 61 67 20 3d 20 2b 2b 70 50 61 72 73 65  tFlag = ++pParse
20b50 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 69 41  ->nMem;.      iA
20b60 4d 65 6d 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d  Mem = pParse->nM
20b70 65 6d 20 2b 20 31 3b 0a 20 20 20 20 20 20 70 50  em + 1;.      pP
20b80 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 70 47  arse->nMem += pG
20b90 72 6f 75 70 42 79 2d 3e 6e 45 78 70 72 3b 0a 20  roupBy->nExpr;. 
20ba0 20 20 20 20 20 69 42 4d 65 6d 20 3d 20 70 50 61       iBMem = pPa
20bb0 72 73 65 2d 3e 6e 4d 65 6d 20 2b 20 31 3b 0a 20  rse->nMem + 1;. 
20bc0 20 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65       pParse->nMe
20bd0 6d 20 2b 3d 20 70 47 72 6f 75 70 42 79 2d 3e 6e  m += pGroupBy->n
20be0 45 78 70 72 3b 0a 20 20 20 20 20 20 73 71 6c 69  Expr;.      sqli
20bf0 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
20c00 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 30 2c 20   OP_Integer, 0, 
20c10 69 41 62 6f 72 74 46 6c 61 67 29 3b 0a 20 20 20  iAbortFlag);.   
20c20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28     VdbeComment((
20c30 76 2c 20 22 63 6c 65 61 72 20 61 62 6f 72 74 20  v, "clear abort 
20c40 66 6c 61 67 22 29 29 3b 0a 20 20 20 20 20 20 73  flag"));.      s
20c50 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
20c60 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20  (v, OP_Integer, 
20c70 30 2c 20 69 55 73 65 46 6c 61 67 29 3b 0a 20 20  0, iUseFlag);.  
20c80 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28      VdbeComment(
20c90 28 76 2c 20 22 69 6e 64 69 63 61 74 65 20 61 63  (v, "indicate ac
20ca0 63 75 6d 75 6c 61 74 6f 72 20 65 6d 70 74 79 22  cumulator empty"
20cb0 29 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  ));.      sqlite
20cc0 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
20cd0 50 5f 47 6f 74 6f 2c 20 30 2c 20 61 64 64 72 49  P_Goto, 0, addrI
20ce0 6e 69 74 69 61 6c 69 7a 65 4c 6f 6f 70 29 3b 0a  nitializeLoop);.
20cf0 0a 20 20 20 20 20 20 2f 2a 20 47 65 6e 65 72 61  .      /* Genera
20d00 74 65 20 61 20 73 75 62 72 6f 75 74 69 6e 65 20  te a subroutine 
20d10 74 68 61 74 20 6f 75 74 70 75 74 73 20 61 20 73  that outputs a s
20d20 69 6e 67 6c 65 20 72 6f 77 20 6f 66 20 74 68 65  ingle row of the
20d30 20 72 65 73 75 6c 74 0a 20 20 20 20 20 20 2a 2a   result.      **
20d40 20 73 65 74 2e 20 20 54 68 69 73 20 73 75 62 72   set.  This subr
20d50 6f 75 74 69 6e 65 20 66 69 72 73 74 20 6c 6f 6f  outine first loo
20d60 6b 73 20 61 74 20 74 68 65 20 69 55 73 65 46 6c  ks at the iUseFl
20d70 61 67 2e 20 20 49 66 20 69 55 73 65 46 6c 61 67  ag.  If iUseFlag
20d80 0a 20 20 20 20 20 20 2a 2a 20 69 73 20 6c 65 73  .      ** is les
20d90 73 20 74 68 61 6e 20 6f 72 20 65 71 75 61 6c 20  s than or equal 
20da0 74 6f 20 7a 65 72 6f 2c 20 74 68 65 20 73 75 62  to zero, the sub
20db0 72 6f 75 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d  routine is a no-
20dc0 6f 70 2e 20 20 49 66 0a 20 20 20 20 20 20 2a 2a  op.  If.      **
20dd0 20 74 68 65 20 70 72 6f 63 65 73 73 69 6e 67 20   the processing 
20de0 63 61 6c 6c 73 20 66 6f 72 20 74 68 65 20 71 75  calls for the qu
20df0 65 72 79 20 74 6f 20 61 62 6f 72 74 2c 20 74 68  ery to abort, th
20e00 69 73 20 73 75 62 72 6f 75 74 69 6e 65 0a 20 20  is subroutine.  
20e10 20 20 20 20 2a 2a 20 69 6e 63 72 65 6d 65 6e 74      ** increment
20e20 73 20 74 68 65 20 69 41 62 6f 72 74 46 6c 61 67  s the iAbortFlag
20e30 20 6d 65 6d 6f 72 79 20 6c 6f 63 61 74 69 6f 6e   memory location
20e40 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e   before returnin
20e50 67 20 69 6e 0a 20 20 20 20 20 20 2a 2a 20 6f 72  g in.      ** or
20e60 64 65 72 20 74 6f 20 73 69 67 6e 61 6c 20 74 68  der to signal th
20e70 65 20 63 61 6c 6c 65 72 20 74 6f 20 61 62 6f 72  e caller to abor
20e80 74 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  t..      */.    
20e90 20 20 61 64 64 72 53 65 74 41 62 6f 72 74 20 3d    addrSetAbort =
20ea0 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72   sqlite3VdbeCurr
20eb0 65 6e 74 41 64 64 72 28 76 29 3b 0a 20 20 20 20  entAddr(v);.    
20ec0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
20ed0 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65  Op2(v, OP_Intege
20ee0 72 2c 20 31 2c 20 69 41 62 6f 72 74 46 6c 61 67  r, 1, iAbortFlag
20ef0 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 6d  );.      VdbeCom
20f00 6d 65 6e 74 28 28 76 2c 20 22 73 65 74 20 61 62  ment((v, "set ab
20f10 6f 72 74 20 66 6c 61 67 22 29 29 3b 0a 20 20 20  ort flag"));.   
20f20 20 20 20 72 65 67 4f 75 74 70 75 74 52 6f 77 20     regOutputRow 
20f30 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d  = ++pParse->nMem
20f40 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
20f50 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f  dbeAddOp1(v, OP_
20f60 52 65 74 75 72 6e 2c 20 72 65 67 4f 75 74 70 75  Return, regOutpu
20f70 74 52 6f 77 29 3b 0a 20 20 20 20 20 20 61 64 64  tRow);.      add
20f80 72 4f 75 74 70 75 74 52 6f 77 20 3d 20 73 71 6c  rOutputRow = sql
20f90 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41  ite3VdbeCurrentA
20fa0 64 64 72 28 76 29 3b 0a 20 20 20 20 20 20 73 71  ddr(v);.      sq
20fb0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
20fc0 76 2c 20 4f 50 5f 49 66 50 6f 73 2c 20 69 55 73  v, OP_IfPos, iUs
20fd0 65 46 6c 61 67 2c 20 61 64 64 72 4f 75 74 70 75  eFlag, addrOutpu
20fe0 74 52 6f 77 2b 32 29 3b 0a 20 20 20 20 20 20 56  tRow+2);.      V
20ff0 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22  dbeComment((v, "
21000 47 72 6f 75 70 62 79 20 72 65 73 75 6c 74 20 67  Groupby result g
21010 65 6e 65 72 61 74 6f 72 20 65 6e 74 72 79 20 70  enerator entry p
21020 6f 69 6e 74 22 29 29 3b 0a 20 20 20 20 20 20 73  oint"));.      s
21030 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31  qlite3VdbeAddOp1
21040 28 76 2c 20 4f 50 5f 52 65 74 75 72 6e 2c 20 72  (v, OP_Return, r
21050 65 67 4f 75 74 70 75 74 52 6f 77 29 3b 0a 20 20  egOutputRow);.  
21060 20 20 20 20 66 69 6e 61 6c 69 7a 65 41 67 67 46      finalizeAggF
21070 75 6e 63 74 69 6f 6e 73 28 70 50 61 72 73 65 2c  unctions(pParse,
21080 20 26 73 41 67 67 49 6e 66 6f 29 3b 0a 20 20 20   &sAggInfo);.   
21090 20 20 20 69 66 28 20 70 48 61 76 69 6e 67 20 29     if( pHaving )
210a0 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
210b0 33 45 78 70 72 49 66 46 61 6c 73 65 28 70 50 61  3ExprIfFalse(pPa
210c0 72 73 65 2c 20 70 48 61 76 69 6e 67 2c 20 61 64  rse, pHaving, ad
210d0 64 72 4f 75 74 70 75 74 52 6f 77 2b 31 2c 20 53  drOutputRow+1, S
210e0 51 4c 49 54 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c  QLITE_JUMPIFNULL
210f0 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
21100 20 73 65 6c 65 63 74 49 6e 6e 65 72 4c 6f 6f 70   selectInnerLoop
21110 28 70 50 61 72 73 65 2c 20 70 2c 20 70 2d 3e 70  (pParse, p, p->p
21120 45 4c 69 73 74 2c 20 30 2c 20 30 2c 20 70 4f 72  EList, 0, 0, pOr
21130 64 65 72 42 79 2c 0a 20 20 20 20 20 20 20 20 20  derBy,.         
21140 20 20 20 20 20 20 20 20 20 20 20 20 20 64 69 73               dis
21150 74 69 6e 63 74 2c 20 70 44 65 73 74 2c 0a 20 20  tinct, pDest,.  
21160 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21170 20 20 20 20 61 64 64 72 4f 75 74 70 75 74 52 6f      addrOutputRo
21180 77 2b 31 2c 20 61 64 64 72 53 65 74 41 62 6f 72  w+1, addrSetAbor
21190 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  t);.      sqlite
211a0 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f  3VdbeAddOp1(v, O
211b0 50 5f 52 65 74 75 72 6e 2c 20 72 65 67 4f 75 74  P_Return, regOut
211c0 70 75 74 52 6f 77 29 3b 0a 20 20 20 20 20 20 56  putRow);.      V
211d0 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22  dbeComment((v, "
211e0 65 6e 64 20 67 72 6f 75 70 62 79 20 72 65 73 75  end groupby resu
211f0 6c 74 20 67 65 6e 65 72 61 74 6f 72 22 29 29 3b  lt generator"));
21200 0a 0a 20 20 20 20 20 20 2f 2a 20 47 65 6e 65 72  ..      /* Gener
21210 61 74 65 20 61 20 73 75 62 72 6f 75 74 69 6e 65  ate a subroutine
21220 20 74 68 61 74 20 77 69 6c 6c 20 72 65 73 65 74   that will reset
21230 20 74 68 65 20 67 72 6f 75 70 2d 62 79 20 61 63   the group-by ac
21240 63 75 6d 75 6c 61 74 6f 72 0a 20 20 20 20 20 20  cumulator.      
21250 2a 2f 0a 20 20 20 20 20 20 61 64 64 72 52 65 73  */.      addrRes
21260 65 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  et = sqlite3Vdbe
21270 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b 0a  CurrentAddr(v);.
21280 20 20 20 20 20 20 72 65 67 52 65 73 65 74 20 3d        regReset =
21290 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b   ++pParse->nMem;
212a0 0a 20 20 20 20 20 20 72 65 73 65 74 41 63 63 75  .      resetAccu
212b0 6d 75 6c 61 74 6f 72 28 70 50 61 72 73 65 2c 20  mulator(pParse, 
212c0 26 73 41 67 67 49 6e 66 6f 29 3b 0a 20 20 20 20  &sAggInfo);.    
212d0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
212e0 4f 70 31 28 76 2c 20 4f 50 5f 52 65 74 75 72 6e  Op1(v, OP_Return
212f0 2c 20 72 65 67 52 65 73 65 74 29 3b 0a 0a 20 20  , regReset);..  
21300 20 20 20 20 2f 2a 20 42 65 67 69 6e 20 61 20 6c      /* Begin a l
21310 6f 6f 70 20 74 68 61 74 20 77 69 6c 6c 20 65 78  oop that will ex
21320 74 72 61 63 74 20 61 6c 6c 20 73 6f 75 72 63 65  tract all source
21330 20 72 6f 77 73 20 69 6e 20 47 52 4f 55 50 20 42   rows in GROUP B
21340 59 20 6f 72 64 65 72 2e 0a 20 20 20 20 20 20 2a  Y order..      *
21350 2a 20 54 68 69 73 20 6d 69 67 68 74 20 69 6e 76  * This might inv
21360 6f 6c 76 65 20 74 77 6f 20 73 65 70 61 72 61 74  olve two separat
21370 65 20 6c 6f 6f 70 73 20 77 69 74 68 20 61 6e 20  e loops with an 
21380 4f 50 5f 53 6f 72 74 20 69 6e 20 62 65 74 77 65  OP_Sort in betwe
21390 65 6e 2c 20 6f 72 0a 20 20 20 20 20 20 2a 2a 20  en, or.      ** 
213a0 69 74 20 6d 69 67 68 74 20 62 65 20 61 20 73 69  it might be a si
213b0 6e 67 6c 65 20 6c 6f 6f 70 20 74 68 61 74 20 75  ngle loop that u
213c0 73 65 73 20 61 6e 20 69 6e 64 65 78 20 74 6f 20  ses an index to 
213d0 65 78 74 72 61 63 74 20 69 6e 66 6f 72 6d 61 74  extract informat
213e0 69 6f 6e 0a 20 20 20 20 20 20 2a 2a 20 69 6e 20  ion.      ** in 
213f0 74 68 65 20 72 69 67 68 74 20 6f 72 64 65 72 20  the right order 
21400 74 6f 20 62 65 67 69 6e 20 77 69 74 68 2e 0a 20  to begin with.. 
21410 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 73 71       */.      sq
21420 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65  lite3VdbeResolve
21430 4c 61 62 65 6c 28 76 2c 20 61 64 64 72 49 6e 69  Label(v, addrIni
21440 74 69 61 6c 69 7a 65 4c 6f 6f 70 29 3b 0a 20 20  tializeLoop);.  
21450 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
21460 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 73 75  ddOp2(v, OP_Gosu
21470 62 2c 20 72 65 67 52 65 73 65 74 2c 20 61 64 64  b, regReset, add
21480 72 52 65 73 65 74 29 3b 0a 20 20 20 20 20 20 70  rReset);.      p
21490 57 49 6e 66 6f 20 3d 20 73 71 6c 69 74 65 33 57  WInfo = sqlite3W
214a0 68 65 72 65 42 65 67 69 6e 28 70 50 61 72 73 65  hereBegin(pParse
214b0 2c 20 70 54 61 62 4c 69 73 74 2c 20 70 57 68 65  , pTabList, pWhe
214c0 72 65 2c 20 26 70 47 72 6f 75 70 42 79 2c 20 30  re, &pGroupBy, 0
214d0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 57 49  );.      if( pWI
214e0 6e 66 6f 3d 3d 30 20 29 20 67 6f 74 6f 20 73 65  nfo==0 ) goto se
214f0 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 20 20  lect_end;.      
21500 69 66 28 20 70 47 72 6f 75 70 42 79 3d 3d 30 20  if( pGroupBy==0 
21510 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68  ){.        /* Th
21520 65 20 6f 70 74 69 6d 69 7a 65 72 20 69 73 20 61  e optimizer is a
21530 62 6c 65 20 74 6f 20 64 65 6c 69 76 65 72 20 72  ble to deliver r
21540 6f 77 73 20 69 6e 20 67 72 6f 75 70 20 62 79 20  ows in group by 
21550 6f 72 64 65 72 20 73 6f 0a 20 20 20 20 20 20 20  order so.       
21560 20 2a 2a 20 77 65 20 64 6f 20 6e 6f 74 20 68 61   ** we do not ha
21570 76 65 20 74 6f 20 73 6f 72 74 2e 20 20 54 68 65  ve to sort.  The
21580 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61   OP_OpenEphemera
21590 6c 20 74 61 62 6c 65 20 77 69 6c 6c 20 62 65 0a  l table will be.
215a0 20 20 20 20 20 20 20 20 2a 2a 20 63 61 6e 63 65          ** cance
215b0 6c 6c 65 64 20 6c 61 74 65 72 20 62 65 63 61 75  lled later becau
215c0 73 65 20 77 65 20 73 74 69 6c 6c 20 6e 65 65 64  se we still need
215d0 20 74 6f 20 75 73 65 20 74 68 65 20 70 4b 65 79   to use the pKey
215e0 49 6e 66 6f 0a 20 20 20 20 20 20 20 20 2a 2f 0a  Info.        */.
215f0 20 20 20 20 20 20 20 20 70 47 72 6f 75 70 42 79          pGroupBy
21600 20 3d 20 70 2d 3e 70 47 72 6f 75 70 42 79 3b 0a   = p->pGroupBy;.
21610 20 20 20 20 20 20 20 20 67 72 6f 75 70 42 79 53          groupByS
21620 6f 72 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d  ort = 0;.      }
21630 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 2f 2a  else{.        /*
21640 20 52 6f 77 73 20 61 72 65 20 63 6f 6d 69 6e 67   Rows are coming
21650 20 6f 75 74 20 69 6e 20 75 6e 64 65 74 65 72 6d   out in undeterm
21660 69 6e 65 64 20 6f 72 64 65 72 2e 20 20 57 65 20  ined order.  We 
21670 68 61 76 65 20 74 6f 20 70 75 73 68 0a 20 20 20  have to push.   
21680 20 20 20 20 20 2a 2a 20 65 61 63 68 20 72 6f 77       ** each row
21690 20 69 6e 74 6f 20 61 20 73 6f 72 74 69 6e 67 20   into a sorting 
216a0 69 6e 64 65 78 2c 20 74 65 72 6d 69 6e 61 74 65  index, terminate
216b0 20 74 68 65 20 66 69 72 73 74 20 6c 6f 6f 70 2c   the first loop,
216c0 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65 6e  .        ** then
216d0 20 6c 6f 6f 70 20 6f 76 65 72 20 74 68 65 20 73   loop over the s
216e0 6f 72 74 69 6e 67 20 69 6e 64 65 78 20 69 6e 20  orting index in 
216f0 6f 72 64 65 72 20 74 6f 20 67 65 74 20 74 68 65  order to get the
21700 20 6f 75 74 70 75 74 0a 20 20 20 20 20 20 20 20   output.        
21710 2a 2a 20 69 6e 20 73 6f 72 74 65 64 20 6f 72 64  ** in sorted ord
21720 65 72 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  er.        */.  
21730 20 20 20 20 20 20 69 6e 74 20 72 65 67 42 61 73        int regBas
21740 65 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 72  e;.        int r
21750 65 67 52 65 63 6f 72 64 3b 0a 20 20 20 20 20 20  egRecord;.      
21760 20 20 69 6e 74 20 6e 43 6f 6c 3b 0a 20 20 20 20    int nCol;.    
21770 20 20 20 20 69 6e 74 20 6e 47 72 6f 75 70 42 79      int nGroupBy
21780 3b 0a 0a 20 20 20 20 20 20 20 20 67 72 6f 75 70  ;..        group
21790 42 79 53 6f 72 74 20 3d 20 31 3b 0a 20 20 20 20  BySort = 1;.    
217a0 20 20 20 20 6e 47 72 6f 75 70 42 79 20 3d 20 70      nGroupBy = p
217b0 47 72 6f 75 70 42 79 2d 3e 6e 45 78 70 72 3b 0a  GroupBy->nExpr;.
217c0 20 20 20 20 20 20 20 20 6e 43 6f 6c 20 3d 20 6e          nCol = n
217d0 47 72 6f 75 70 42 79 20 2b 20 31 3b 0a 20 20 20  GroupBy + 1;.   
217e0 20 20 20 20 20 6a 20 3d 20 6e 47 72 6f 75 70 42       j = nGroupB
217f0 79 2b 31 3b 0a 20 20 20 20 20 20 20 20 66 6f 72  y+1;.        for
21800 28 69 3d 30 3b 20 69 3c 73 41 67 67 49 6e 66 6f  (i=0; i<sAggInfo
21810 2e 6e 43 6f 6c 75 6d 6e 3b 20 69 2b 2b 29 7b 0a  .nColumn; i++){.
21820 20 20 20 20 20 20 20 20 20 20 69 66 28 20 73 41            if( sA
21830 67 67 49 6e 66 6f 2e 61 43 6f 6c 5b 69 5d 2e 69  ggInfo.aCol[i].i
21840 53 6f 72 74 65 72 43 6f 6c 75 6d 6e 3e 3d 6a 20  SorterColumn>=j 
21850 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 6e  ){.            n
21860 43 6f 6c 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20  Col++;.         
21870 20 20 20 6a 2b 2b 3b 0a 20 20 20 20 20 20 20 20     j++;.        
21880 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20    }.        }.  
21890 20 20 20 20 20 20 72 65 67 42 61 73 65 20 3d 20        regBase = 
218a0 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 61  sqlite3GetTempRa
218b0 6e 67 65 28 70 50 61 72 73 65 2c 20 6e 43 6f 6c  nge(pParse, nCol
218c0 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
218d0 65 33 45 78 70 72 43 6f 64 65 45 78 70 72 4c 69  e3ExprCodeExprLi
218e0 73 74 28 70 50 61 72 73 65 2c 20 70 47 72 6f 75  st(pParse, pGrou
218f0 70 42 79 2c 20 72 65 67 42 61 73 65 2c 20 30 29  pBy, regBase, 0)
21900 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
21910 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
21920 50 5f 53 65 71 75 65 6e 63 65 2c 20 73 41 67 67  P_Sequence, sAgg
21930 49 6e 66 6f 2e 73 6f 72 74 69 6e 67 49 64 78 2c  Info.sortingIdx,
21940 72 65 67 42 61 73 65 2b 6e 47 72 6f 75 70 42 79  regBase+nGroupBy
21950 29 3b 0a 20 20 20 20 20 20 20 20 6a 20 3d 20 6e  );.        j = n
21960 47 72 6f 75 70 42 79 2b 31 3b 0a 20 20 20 20 20  GroupBy+1;.     
21970 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 73 41     for(i=0; i<sA
21980 67 67 49 6e 66 6f 2e 6e 43 6f 6c 75 6d 6e 3b 20  ggInfo.nColumn; 
21990 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20  i++){.          
219a0 73 74 72 75 63 74 20 41 67 67 49 6e 66 6f 5f 63  struct AggInfo_c
219b0 6f 6c 20 2a 70 43 6f 6c 20 3d 20 26 73 41 67 67  ol *pCol = &sAgg
219c0 49 6e 66 6f 2e 61 43 6f 6c 5b 69 5d 3b 0a 20 20  Info.aCol[i];.  
219d0 20 20 20 20 20 20 20 20 69 66 28 20 70 43 6f 6c          if( pCol
219e0 2d 3e 69 53 6f 72 74 65 72 43 6f 6c 75 6d 6e 3e  ->iSorterColumn>
219f0 3d 6a 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =j ){.          
21a00 20 20 69 6e 74 20 72 31 20 3d 20 6a 20 2b 20 72    int r1 = j + r
21a10 65 67 42 61 73 65 3b 0a 20 20 20 20 20 20 20 20  egBase;.        
21a20 20 20 20 20 69 6e 74 20 72 32 20 3d 20 73 71 6c      int r2 = sql
21a30 69 74 65 33 45 78 70 72 43 6f 64 65 47 65 74 43  ite3ExprCodeGetC
21a40 6f 6c 75 6d 6e 28 70 50 61 72 73 65 2c 20 0a 20  olumn(pParse, . 
21a50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21a60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 43                pC
21a70 6f 6c 2d 3e 70 54 61 62 2c 20 70 43 6f 6c 2d 3e  ol->pTab, pCol->
21a80 69 43 6f 6c 75 6d 6e 2c 20 70 43 6f 6c 2d 3e 69  iColumn, pCol->i
21a90 54 61 62 6c 65 2c 20 72 31 2c 20 30 29 3b 0a 20  Table, r1, 0);. 
21aa0 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72             if( r
21ab0 31 21 3d 72 32 20 29 7b 0a 20 20 20 20 20 20 20  1!=r2 ){.       
21ac0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
21ad0 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 53  beAddOp2(v, OP_S
21ae0 43 6f 70 79 2c 20 72 32 2c 20 72 31 29 3b 0a 20  Copy, r2, r1);. 
21af0 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
21b00 20 20 20 20 20 20 20 20 20 6a 2b 2b 3b 0a 20 20           j++;.  
21b10 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
21b20 20 20 7d 0a 20 20 20 20 20 20 20 20 72 65 67 52    }.        regR
21b30 65 63 6f 72 64 20 3d 20 73 71 6c 69 74 65 33 47  ecord = sqlite3G
21b40 65 74 54 65 6d 70 52 65 67 28 70 50 61 72 73 65  etTempReg(pParse
21b50 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
21b60 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
21b70 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20 72  OP_MakeRecord, r
21b80 65 67 42 61 73 65 2c 20 6e 43 6f 6c 2c 20 72 65  egBase, nCol, re
21b90 67 52 65 63 6f 72 64 29 3b 0a 20 20 20 20 20 20  gRecord);.      
21ba0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
21bb0 4f 70 32 28 76 2c 20 4f 50 5f 49 64 78 49 6e 73  Op2(v, OP_IdxIns
21bc0 65 72 74 2c 20 73 41 67 67 49 6e 66 6f 2e 73 6f  ert, sAggInfo.so
21bd0 72 74 69 6e 67 49 64 78 2c 20 72 65 67 52 65 63  rtingIdx, regRec
21be0 6f 72 64 29 3b 0a 20 20 20 20 20 20 20 20 73 71  ord);.        sq
21bf0 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70  lite3ReleaseTemp
21c00 52 65 67 28 70 50 61 72 73 65 2c 20 72 65 67 52  Reg(pParse, regR
21c10 65 63 6f 72 64 29 3b 0a 20 20 20 20 20 20 20 20  ecord);.        
21c20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65  sqlite3ReleaseTe
21c30 6d 70 52 61 6e 67 65 28 70 50 61 72 73 65 2c 20  mpRange(pParse, 
21c40 72 65 67 42 61 73 65 2c 20 6e 43 6f 6c 29 3b 0a  regBase, nCol);.
21c50 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 57          sqlite3W
21c60 68 65 72 65 45 6e 64 28 70 57 49 6e 66 6f 29 3b  hereEnd(pWInfo);
21c70 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
21c80 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
21c90 5f 53 6f 72 74 2c 20 73 41 67 67 49 6e 66 6f 2e  _Sort, sAggInfo.
21ca0 73 6f 72 74 69 6e 67 49 64 78 2c 20 61 64 64 72  sortingIdx, addr
21cb0 45 6e 64 29 3b 0a 20 20 20 20 20 20 20 20 56 64  End);.        Vd
21cc0 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 47  beComment((v, "G
21cd0 52 4f 55 50 20 42 59 20 73 6f 72 74 22 29 29 3b  ROUP BY sort"));
21ce0 0a 20 20 20 20 20 20 20 20 73 41 67 67 49 6e 66  .        sAggInf
21cf0 6f 2e 75 73 65 53 6f 72 74 69 6e 67 49 64 78 20  o.useSortingIdx 
21d00 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20  = 1;.      }..  
21d10 20 20 20 20 2f 2a 20 45 76 61 6c 75 61 74 65 20      /* Evaluate 
21d20 74 68 65 20 63 75 72 72 65 6e 74 20 47 52 4f 55  the current GROU
21d30 50 20 42 59 20 74 65 72 6d 73 20 61 6e 64 20 73  P BY terms and s
21d40 74 6f 72 65 20 69 6e 20 62 30 2c 20 62 31 2c 20  tore in b0, b1, 
21d50 62 32 2e 2e 2e 0a 20 20 20 20 20 20 2a 2a 20 28  b2....      ** (
21d60 62 30 20 69 73 20 6d 65 6d 6f 72 79 20 6c 6f 63  b0 is memory loc
21d70 61 74 69 6f 6e 20 69 42 4d 65 6d 2b 30 2c 20 62  ation iBMem+0, b
21d80 31 20 69 73 20 69 42 4d 65 6d 2b 31 2c 20 61 6e  1 is iBMem+1, an
21d90 64 20 73 6f 20 66 6f 72 74 68 29 0a 20 20 20 20  d so forth).    
21da0 20 20 2a 2a 20 54 68 65 6e 20 63 6f 6d 70 61 72    ** Then compar
21db0 65 20 74 68 65 20 63 75 72 72 65 6e 74 20 47 52  e the current GR
21dc0 4f 55 50 20 42 59 20 74 65 72 6d 73 20 61 67 61  OUP BY terms aga
21dd0 69 6e 73 74 20 74 68 65 20 47 52 4f 55 50 20 42  inst the GROUP B
21de0 59 20 74 65 72 6d 73 0a 20 20 20 20 20 20 2a 2a  Y terms.      **
21df0 20 66 72 6f 6d 20 74 68 65 20 70 72 65 76 69 6f   from the previo
21e00 75 73 20 72 6f 77 20 63 75 72 72 65 6e 74 6c 79  us row currently
21e10 20 73 74 6f 72 65 64 20 69 6e 20 61 30 2c 20 61   stored in a0, a
21e20 31 2c 20 61 32 2e 2e 2e 0a 20 20 20 20 20 20 2a  1, a2....      *
21e30 2f 0a 20 20 20 20 20 20 61 64 64 72 54 6f 70 4f  /.      addrTopO
21e40 66 4c 6f 6f 70 20 3d 20 73 71 6c 69 74 65 33 56  fLoop = sqlite3V
21e50 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76  dbeCurrentAddr(v
21e60 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d 30  );.      for(j=0
21e70 3b 20 6a 3c 70 47 72 6f 75 70 42 79 2d 3e 6e 45  ; j<pGroupBy->nE
21e80 78 70 72 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20  xpr; j++){.     
21e90 20 20 20 69 66 28 20 67 72 6f 75 70 42 79 53 6f     if( groupBySo
21ea0 72 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  rt ){.          
21eb0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
21ec0 33 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20  3(v, OP_Column, 
21ed0 73 41 67 67 49 6e 66 6f 2e 73 6f 72 74 69 6e 67  sAggInfo.sorting
21ee0 49 64 78 2c 20 6a 2c 20 69 42 4d 65 6d 2b 6a 29  Idx, j, iBMem+j)
21ef0 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  ;.        }else{
21f00 0a 20 20 20 20 20 20 20 20 20 20 73 41 67 67 49  .          sAggI
21f10 6e 66 6f 2e 64 69 72 65 63 74 4d 6f 64 65 20 3d  nfo.directMode =
21f20 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71   1;.          sq
21f30 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28 70 50  lite3ExprCode(pP
21f40 61 72 73 65 2c 20 70 47 72 6f 75 70 42 79 2d 3e  arse, pGroupBy->
21f50 61 5b 6a 5d 2e 70 45 78 70 72 2c 20 69 42 4d 65  a[j].pExpr, iBMe
21f60 6d 2b 6a 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  m+j);.        }.
21f70 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71        }.      sq
21f80 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28  lite3VdbeAddOp4(
21f90 76 2c 20 4f 50 5f 43 6f 6d 70 61 72 65 2c 20 69  v, OP_Compare, i
21fa0 41 4d 65 6d 2c 20 69 42 4d 65 6d 2c 20 70 47 72  AMem, iBMem, pGr
21fb0 6f 75 70 42 79 2d 3e 6e 45 78 70 72 2c 0a 20 20  oupBy->nExpr,.  
21fc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21fd0 20 20 20 20 20 20 20 20 28 63 68 61 72 2a 29 70          (char*)p
21fe0 4b 65 79 49 6e 66 6f 2c 20 50 34 5f 4b 45 59 49  KeyInfo, P4_KEYI
21ff0 4e 46 4f 29 3b 0a 20 20 20 20 20 20 6a 31 20 3d  NFO);.      j1 =
22000 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72   sqlite3VdbeCurr
22010 65 6e 74 41 64 64 72 28 76 29 3b 0a 20 20 20 20  entAddr(v);.    
22020 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
22030 4f 70 33 28 76 2c 20 4f 50 5f 4a 75 6d 70 2c 20  Op3(v, OP_Jump, 
22040 6a 31 2b 31 2c 20 30 2c 20 6a 31 2b 31 29 3b 0a  j1+1, 0, j1+1);.
22050 0a 20 20 20 20 20 20 2f 2a 20 47 65 6e 65 72 61  .      /* Genera
22060 74 65 20 63 6f 64 65 20 74 68 61 74 20 72 75 6e  te code that run
22070 73 20 77 68 65 6e 65 76 65 72 20 74 68 65 20 47  s whenever the G
22080 52 4f 55 50 20 42 59 20 63 68 61 6e 67 65 73 2e  ROUP BY changes.
22090 0a 20 20 20 20 20 20 2a 2a 20 43 68 61 6e 67 65  .      ** Change
220a0 73 20 69 6e 20 74 68 65 20 47 52 4f 55 50 20 42  s in the GROUP B
220b0 59 20 61 72 65 20 64 65 74 65 63 74 65 64 20 62  Y are detected b
220c0 79 20 74 68 65 20 70 72 65 76 69 6f 75 73 20 63  y the previous c
220d0 6f 64 65 0a 20 20 20 20 20 20 2a 2a 20 62 6c 6f  ode.      ** blo
220e0 63 6b 2e 20 20 49 66 20 74 68 65 72 65 20 77 65  ck.  If there we
220f0 72 65 20 6e 6f 20 63 68 61 6e 67 65 73 2c 20 74  re no changes, t
22100 68 69 73 20 62 6c 6f 63 6b 20 69 73 20 73 6b 69  his block is ski
22110 70 70 65 64 2e 0a 20 20 20 20 20 20 2a 2a 0a 20  pped..      **. 
22120 20 20 20 20 20 2a 2a 20 54 68 69 73 20 63 6f 64       ** This cod
22130 65 20 63 6f 70 69 65 73 20 63 75 72 72 65 6e 74  e copies current
22140 20 67 72 6f 75 70 20 62 79 20 74 65 72 6d 73 20   group by terms 
22150 69 6e 20 62 30 2c 62 31 2c 62 32 2c 2e 2e 2e 0a  in b0,b1,b2,....
22160 20 20 20 20 20 20 2a 2a 20 6f 76 65 72 20 74 6f        ** over to
22170 20 61 30 2c 61 31 2c 61 32 2e 20 20 49 74 20 74   a0,a1,a2.  It t
22180 68 65 6e 20 63 61 6c 6c 73 20 74 68 65 20 6f 75  hen calls the ou
22190 74 70 75 74 20 73 75 62 72 6f 75 74 69 6e 65 0a  tput subroutine.
221a0 20 20 20 20 20 20 2a 2a 20 61 6e 64 20 72 65 73        ** and res
221b0 65 74 73 20 74 68 65 20 61 67 67 72 65 67 61 74  ets the aggregat
221c0 65 20 61 63 63 75 6d 75 6c 61 74 6f 72 20 72 65  e accumulator re
221d0 67 69 73 74 65 72 73 20 69 6e 20 70 72 65 70 61  gisters in prepa
221e0 72 61 74 69 6f 6e 0a 20 20 20 20 20 20 2a 2a 20  ration.      ** 
221f0 66 6f 72 20 74 68 65 20 6e 65 78 74 20 47 52 4f  for the next GRO
22200 55 50 20 42 59 20 62 61 74 63 68 2e 0a 20 20 20  UP BY batch..   
22210 20 20 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69     */.      sqli
22220 74 65 33 45 78 70 72 43 6f 64 65 4d 6f 76 65 28  te3ExprCodeMove(
22230 70 50 61 72 73 65 2c 20 69 42 4d 65 6d 2c 20 69  pParse, iBMem, i
22240 41 4d 65 6d 2c 20 70 47 72 6f 75 70 42 79 2d 3e  AMem, pGroupBy->
22250 6e 45 78 70 72 29 3b 0a 20 20 20 20 20 20 73 71  nExpr);.      sq
22260 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
22270 76 2c 20 4f 50 5f 47 6f 73 75 62 2c 20 72 65 67  v, OP_Gosub, reg
22280 4f 75 74 70 75 74 52 6f 77 2c 20 61 64 64 72 4f  OutputRow, addrO
22290 75 74 70 75 74 52 6f 77 29 3b 0a 20 20 20 20 20  utputRow);.     
222a0 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c   VdbeComment((v,
222b0 20 22 6f 75 74 70 75 74 20 6f 6e 65 20 72 6f 77   "output one row
222c0 22 29 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  "));.      sqlit
222d0 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
222e0 4f 50 5f 49 66 50 6f 73 2c 20 69 41 62 6f 72 74  OP_IfPos, iAbort
222f0 46 6c 61 67 2c 20 61 64 64 72 45 6e 64 29 3b 0a  Flag, addrEnd);.
22300 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e        VdbeCommen
22310 74 28 28 76 2c 20 22 63 68 65 63 6b 20 61 62 6f  t((v, "check abo
22320 72 74 20 66 6c 61 67 22 29 29 3b 0a 20 20 20 20  rt flag"));.    
22330 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
22340 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 73 75 62 2c  Op2(v, OP_Gosub,
22350 20 72 65 67 52 65 73 65 74 2c 20 61 64 64 72 52   regReset, addrR
22360 65 73 65 74 29 3b 0a 20 20 20 20 20 20 56 64 62  eset);.      Vdb
22370 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 72 65  eComment((v, "re
22380 73 65 74 20 61 63 63 75 6d 75 6c 61 74 6f 72 22  set accumulator"
22390 29 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 55 70  ));..      /* Up
223a0 64 61 74 65 20 74 68 65 20 61 67 67 72 65 67 61  date the aggrega
223b0 74 65 20 61 63 63 75 6d 75 6c 61 74 6f 72 73 20  te accumulators 
223c0 62 61 73 65 64 20 6f 6e 20 74 68 65 20 63 6f 6e  based on the con
223d0 74 65 6e 74 20 6f 66 0a 20 20 20 20 20 20 2a 2a  tent of.      **
223e0 20 74 68 65 20 63 75 72 72 65 6e 74 20 72 6f 77   the current row
223f0 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
22400 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48  sqlite3VdbeJumpH
22410 65 72 65 28 76 2c 20 6a 31 29 3b 0a 20 20 20 20  ere(v, j1);.    
22420 20 20 75 70 64 61 74 65 41 63 63 75 6d 75 6c 61    updateAccumula
22430 74 6f 72 28 70 50 61 72 73 65 2c 20 26 73 41 67  tor(pParse, &sAg
22440 67 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20 73 71  gInfo);.      sq
22450 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
22460 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 31  v, OP_Integer, 1
22470 2c 20 69 55 73 65 46 6c 61 67 29 3b 0a 20 20 20  , iUseFlag);.   
22480 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28     VdbeComment((
22490 76 2c 20 22 69 6e 64 69 63 61 74 65 20 64 61 74  v, "indicate dat
224a0 61 20 69 6e 20 61 63 63 75 6d 75 6c 61 74 6f 72  a in accumulator
224b0 22 29 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 45  "));..      /* E
224c0 6e 64 20 6f 66 20 74 68 65 20 6c 6f 6f 70 0a 20  nd of the loop. 
224d0 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66       */.      if
224e0 28 20 67 72 6f 75 70 42 79 53 6f 72 74 20 29 7b  ( groupBySort ){
224f0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
22500 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
22510 5f 4e 65 78 74 2c 20 73 41 67 67 49 6e 66 6f 2e  _Next, sAggInfo.
22520 73 6f 72 74 69 6e 67 49 64 78 2c 20 61 64 64 72  sortingIdx, addr
22530 54 6f 70 4f 66 4c 6f 6f 70 29 3b 0a 20 20 20 20  TopOfLoop);.    
22540 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
22550 20 73 71 6c 69 74 65 33 57 68 65 72 65 45 6e 64   sqlite3WhereEnd
22560 28 70 57 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20  (pWInfo);.      
22570 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61    sqlite3VdbeCha
22580 6e 67 65 54 6f 4e 6f 6f 70 28 76 2c 20 61 64 64  ngeToNoop(v, add
22590 72 53 6f 72 74 69 6e 67 49 64 78 2c 20 31 29 3b  rSortingIdx, 1);
225a0 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20  .      }..      
225b0 2f 2a 20 4f 75 74 70 75 74 20 74 68 65 20 66 69  /* Output the fi
225c0 6e 61 6c 20 72 6f 77 20 6f 66 20 72 65 73 75 6c  nal row of resul
225d0 74 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  t.      */.     
225e0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
225f0 70 32 28 76 2c 20 4f 50 5f 47 6f 73 75 62 2c 20  p2(v, OP_Gosub, 
22600 72 65 67 4f 75 74 70 75 74 52 6f 77 2c 20 61 64  regOutputRow, ad
22610 64 72 4f 75 74 70 75 74 52 6f 77 29 3b 0a 20 20  drOutputRow);.  
22620 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28      VdbeComment(
22630 28 76 2c 20 22 6f 75 74 70 75 74 20 66 69 6e 61  (v, "output fina
22640 6c 20 72 6f 77 22 29 29 3b 0a 20 20 20 20 20 20  l row"));.      
22650 0a 20 20 20 20 7d 20 2f 2a 20 65 6e 64 69 66 20  .    } /* endif 
22660 70 47 72 6f 75 70 42 79 20 2a 2f 0a 20 20 20 20  pGroupBy */.    
22670 65 6c 73 65 20 7b 0a 20 20 20 20 20 20 45 78 70  else {.      Exp
22680 72 4c 69 73 74 20 2a 70 4d 69 6e 4d 61 78 20 3d  rList *pMinMax =
22690 20 30 3b 0a 20 20 20 20 20 20 45 78 70 72 4c 69   0;.      ExprLi
226a0 73 74 20 2a 70 44 65 6c 20 3d 20 30 3b 0a 20 20  st *pDel = 0;.  
226b0 20 20 20 20 75 38 20 66 6c 61 67 3b 0a 0a 20 20      u8 flag;..  
226c0 20 20 20 20 2f 2a 20 43 68 65 63 6b 20 69 66 20      /* Check if 
226d0 74 68 65 20 71 75 65 72 79 20 69 73 20 6f 66 20  the query is of 
226e0 6f 6e 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f  one of the follo
226f0 77 69 6e 67 20 66 6f 72 6d 73 3a 0a 20 20 20 20  wing forms:.    
22700 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 20 20    **.      **   
22710 53 45 4c 45 43 54 20 6d 69 6e 28 78 29 20 46 52  SELECT min(x) FR
22720 4f 4d 20 2e 2e 2e 0a 20 20 20 20 20 20 2a 2a 20  OM ....      ** 
22730 20 20 53 45 4c 45 43 54 20 6d 61 78 28 78 29 20    SELECT max(x) 
22740 46 52 4f 4d 20 2e 2e 2e 0a 20 20 20 20 20 20 2a  FROM ....      *
22750 2a 0a 20 20 20 20 20 20 2a 2a 20 49 66 20 69 74  *.      ** If it
22760 20 69 73 2c 20 74 68 65 6e 20 61 73 6b 20 74 68   is, then ask th
22770 65 20 63 6f 64 65 20 69 6e 20 77 68 65 72 65 2e  e code in where.
22780 63 20 74 6f 20 61 74 74 65 6d 70 74 20 74 6f 20  c to attempt to 
22790 73 6f 72 74 20 72 65 73 75 6c 74 73 0a 20 20 20  sort results.   
227a0 20 20 20 2a 2a 20 61 73 20 69 66 20 74 68 65 72     ** as if ther
227b0 65 20 77 61 73 20 61 6e 20 22 4f 52 44 45 52 20  e was an "ORDER 
227c0 4f 4e 20 78 22 20 6f 72 20 22 4f 52 44 45 52 20  ON x" or "ORDER 
227d0 4f 4e 20 78 20 44 45 53 43 22 20 63 6c 61 75 73  ON x DESC" claus
227e0 65 2e 20 0a 20 20 20 20 20 20 2a 2a 20 49 66 20  e. .      ** If 
227f0 77 68 65 72 65 2e 63 20 69 73 20 61 62 6c 65 20  where.c is able 
22800 74 6f 20 70 72 6f 64 75 63 65 20 72 65 73 75 6c  to produce resul
22810 74 73 20 73 6f 72 74 65 64 20 69 6e 20 74 68 69  ts sorted in thi
22820 73 20 6f 72 64 65 72 2c 20 74 68 65 6e 0a 20 20  s order, then.  
22830 20 20 20 20 2a 2a 20 61 64 64 20 76 64 62 65 20      ** add vdbe 
22840 63 6f 64 65 20 74 6f 20 62 72 65 61 6b 20 6f 75  code to break ou
22850 74 20 6f 66 20 74 68 65 20 70 72 6f 63 65 73 73  t of the process
22860 69 6e 67 20 6c 6f 6f 70 20 61 66 74 65 72 20 74  ing loop after t
22870 68 65 20 0a 20 20 20 20 20 20 2a 2a 20 66 69 72  he .      ** fir
22880 73 74 20 69 74 65 72 61 74 69 6f 6e 20 28 73 69  st iteration (si
22890 6e 63 65 20 74 68 65 20 66 69 72 73 74 20 69 74  nce the first it
228a0 65 72 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 6c  eration of the l
228b0 6f 6f 70 20 69 73 20 0a 20 20 20 20 20 20 2a 2a  oop is .      **
228c0 20 67 75 61 72 61 6e 74 65 65 64 20 74 6f 20 6f   guaranteed to o
228d0 70 65 72 61 74 65 20 6f 6e 20 74 68 65 20 72 6f  perate on the ro
228e0 77 20 77 69 74 68 20 74 68 65 20 6d 69 6e 69 6d  w with the minim
228f0 75 6d 20 6f 72 20 6d 61 78 69 6d 75 6d 20 0a 20  um or maximum . 
22900 20 20 20 20 20 2a 2a 20 76 61 6c 75 65 20 6f 66       ** value of
22910 20 78 2c 20 74 68 65 20 6f 6e 6c 79 20 72 6f 77   x, the only row
22920 20 72 65 71 75 69 72 65 64 29 2e 0a 20 20 20 20   required)..    
22930 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 41 20    **.      ** A 
22940 73 70 65 63 69 61 6c 20 66 6c 61 67 20 6d 75 73  special flag mus
22950 74 20 62 65 20 70 61 73 73 65 64 20 74 6f 20 73  t be passed to s
22960 71 6c 69 74 65 33 57 68 65 72 65 42 65 67 69 6e  qlite3WhereBegin
22970 28 29 20 74 6f 20 73 6c 69 67 68 74 6c 79 0a 20  () to slightly. 
22980 20 20 20 20 20 2a 2a 20 6d 6f 64 69 66 79 20 62       ** modify b
22990 65 68 61 76 69 6f 75 72 20 61 73 20 66 6f 6c 6c  ehaviour as foll
229a0 6f 77 73 3a 0a 20 20 20 20 20 20 2a 2a 0a 20 20  ows:.      **.  
229b0 20 20 20 20 2a 2a 20 20 20 2b 20 49 66 20 74 68      **   + If th
229c0 65 20 71 75 65 72 79 20 69 73 20 61 20 22 53 45  e query is a "SE
229d0 4c 45 43 54 20 6d 69 6e 28 78 29 22 2c 20 74 68  LECT min(x)", th
229e0 65 6e 20 74 68 65 20 6c 6f 6f 70 20 63 6f 64 65  en the loop code
229f0 64 20 62 79 0a 20 20 20 20 20 20 2a 2a 20 20 20  d by.      **   
22a00 20 20 77 68 65 72 65 2e 63 20 73 68 6f 75 6c 64    where.c should
22a10 20 6e 6f 74 20 69 74 65 72 61 74 65 20 6f 76 65   not iterate ove
22a20 72 20 61 6e 79 20 76 61 6c 75 65 73 20 77 69 74  r any values wit
22a30 68 20 61 20 4e 55 4c 4c 20 76 61 6c 75 65 0a 20  h a NULL value. 
22a40 20 20 20 20 20 2a 2a 20 20 20 20 20 66 6f 72 20       **     for 
22a50 78 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20  x..      **.    
22a60 20 20 2a 2a 20 20 20 2b 20 54 68 65 20 6f 70 74    **   + The opt
22a70 69 6d 69 7a 65 72 20 63 6f 64 65 20 69 6e 20 77  imizer code in w
22a80 68 65 72 65 2e 63 20 28 74 68 65 20 74 68 69 6e  here.c (the thin
22a90 67 20 74 68 61 74 20 64 65 63 69 64 65 73 20 77  g that decides w
22aa0 68 69 63 68 0a 20 20 20 20 20 20 2a 2a 20 20 20  hich.      **   
22ab0 20 20 69 6e 64 65 78 20 6f 72 20 69 6e 64 69 63    index or indic
22ac0 65 73 20 74 6f 20 75 73 65 29 20 73 68 6f 75 6c  es to use) shoul
22ad0 64 20 70 6c 61 63 65 20 61 20 64 69 66 66 65 72  d place a differ
22ae0 65 6e 74 20 70 72 69 6f 72 69 74 79 20 6f 6e 20  ent priority on 
22af0 0a 20 20 20 20 20 20 2a 2a 20 20 20 20 20 73 61  .      **     sa
22b00 74 69 73 66 79 69 6e 67 20 74 68 65 20 27 4f 52  tisfying the 'OR
22b10 44 45 52 20 42 59 27 20 63 6c 61 75 73 65 20 74  DER BY' clause t
22b20 68 61 6e 20 69 74 20 64 6f 65 73 20 69 6e 20 6f  han it does in o
22b30 74 68 65 72 20 63 61 73 65 73 2e 0a 20 20 20 20  ther cases..    
22b40 20 20 2a 2a 20 20 20 20 20 52 65 66 65 72 20 74    **     Refer t
22b50 6f 20 63 6f 64 65 20 61 6e 64 20 63 6f 6d 6d 65  o code and comme
22b60 6e 74 73 20 69 6e 20 77 68 65 72 65 2e 63 20 66  nts in where.c f
22b70 6f 72 20 64 65 74 61 69 6c 73 2e 0a 20 20 20 20  or details..    
22b80 20 20 2a 2f 0a 20 20 20 20 20 20 66 6c 61 67 20    */.      flag 
22b90 3d 20 6d 69 6e 4d 61 78 51 75 65 72 79 28 70 50  = minMaxQuery(pP
22ba0 61 72 73 65 2c 20 70 29 3b 0a 20 20 20 20 20 20  arse, p);.      
22bb0 69 66 28 20 66 6c 61 67 20 29 7b 0a 20 20 20 20  if( flag ){.    
22bc0 20 20 20 20 70 44 65 6c 20 3d 20 70 4d 69 6e 4d      pDel = pMinM
22bd0 61 78 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  ax = sqlite3Expr
22be0 4c 69 73 74 44 75 70 28 64 62 2c 20 70 2d 3e 70  ListDup(db, p->p
22bf0 45 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70  EList->a[0].pExp
22c00 72 2d 3e 70 4c 69 73 74 29 3b 0a 20 20 20 20 20  r->pList);.     
22c10 20 20 20 69 66 28 20 70 4d 69 6e 4d 61 78 20 26     if( pMinMax &
22c20 26 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  & !db->mallocFai
22c30 6c 65 64 20 29 7b 0a 20 20 20 20 20 20 20 20 20  led ){.         
22c40 20 70 4d 69 6e 4d 61 78 2d 3e 61 5b 30 5d 2e 73   pMinMax->a[0].s
22c50 6f 72 74 4f 72 64 65 72 20 3d 20 66 6c 61 67 21  ortOrder = flag!
22c60 3d 57 48 45 52 45 5f 4f 52 44 45 52 42 59 5f 4d  =WHERE_ORDERBY_M
22c70 49 4e 3b 0a 20 20 20 20 20 20 20 20 20 20 70 4d  IN;.          pM
22c80 69 6e 4d 61 78 2d 3e 61 5b 30 5d 2e 70 45 78 70  inMax->a[0].pExp
22c90 72 2d 3e 6f 70 20 3d 20 54 4b 5f 43 4f 4c 55 4d  r->op = TK_COLUM
22ca0 4e 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  N;.        }.   
22cb0 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 54     }..      /* T
22cc0 68 69 73 20 63 61 73 65 20 72 75 6e 73 20 69 66  his case runs if
22cd0 20 74 68 65 20 61 67 67 72 65 67 61 74 65 20 68   the aggregate h
22ce0 61 73 20 6e 6f 20 47 52 4f 55 50 20 42 59 20 63  as no GROUP BY c
22cf0 6c 61 75 73 65 2e 20 20 54 68 65 0a 20 20 20 20  lause.  The.    
22d00 20 20 2a 2a 20 70 72 6f 63 65 73 73 69 6e 67 20    ** processing 
22d10 69 73 20 6d 75 63 68 20 73 69 6d 70 6c 65 72 20  is much simpler 
22d20 73 69 6e 63 65 20 74 68 65 72 65 20 69 73 20 6f  since there is o
22d30 6e 6c 79 20 61 20 73 69 6e 67 6c 65 20 72 6f 77  nly a single row
22d40 0a 20 20 20 20 20 20 2a 2a 20 6f 66 20 6f 75 74  .      ** of out
22d50 70 75 74 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  put..      */.  
22d60 20 20 20 20 72 65 73 65 74 41 63 63 75 6d 75 6c      resetAccumul
22d70 61 74 6f 72 28 70 50 61 72 73 65 2c 20 26 73 41  ator(pParse, &sA
22d80 67 67 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20 70  ggInfo);.      p
22d90 57 49 6e 66 6f 20 3d 20 73 71 6c 69 74 65 33 57  WInfo = sqlite3W
22da0 68 65 72 65 42 65 67 69 6e 28 70 50 61 72 73 65  hereBegin(pParse
22db0 2c 20 70 54 61 62 4c 69 73 74 2c 20 70 57 68 65  , pTabList, pWhe
22dc0 72 65 2c 20 26 70 4d 69 6e 4d 61 78 2c 20 66 6c  re, &pMinMax, fl
22dd0 61 67 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70  ag);.      if( p
22de0 57 49 6e 66 6f 3d 3d 30 20 29 7b 0a 20 20 20 20  WInfo==0 ){.    
22df0 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c      sqlite3ExprL
22e00 69 73 74 44 65 6c 65 74 65 28 70 44 65 6c 29 3b  istDelete(pDel);
22e10 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 73 65  .        goto se
22e20 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 20 20  lect_end;.      
22e30 7d 0a 20 20 20 20 20 20 75 70 64 61 74 65 41 63  }.      updateAc
22e40 63 75 6d 75 6c 61 74 6f 72 28 70 50 61 72 73 65  cumulator(pParse
22e50 2c 20 26 73 41 67 67 49 6e 66 6f 29 3b 0a 20 20  , &sAggInfo);.  
22e60 20 20 20 20 69 66 28 20 21 70 4d 69 6e 4d 61 78      if( !pMinMax
22e70 20 26 26 20 66 6c 61 67 20 29 7b 0a 20 20 20 20   && flag ){.    
22e80 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
22e90 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 74 6f  ddOp2(v, OP_Goto
22ea0 2c 20 30 2c 20 70 57 49 6e 66 6f 2d 3e 69 42 72  , 0, pWInfo->iBr
22eb0 65 61 6b 29 3b 0a 20 20 20 20 20 20 20 20 56 64  eak);.        Vd
22ec0 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 25  beComment((v, "%
22ed0 73 28 29 20 62 79 20 69 6e 64 65 78 22 2c 28 66  s() by index",(f
22ee0 6c 61 67 3d 3d 57 48 45 52 45 5f 4f 52 44 45 52  lag==WHERE_ORDER
22ef0 42 59 5f 4d 49 4e 3f 22 6d 69 6e 22 3a 22 6d 61  BY_MIN?"min":"ma
22f00 78 22 29 29 29 3b 0a 20 20 20 20 20 20 7d 0a 20  x")));.      }. 
22f10 20 20 20 20 20 73 71 6c 69 74 65 33 57 68 65 72       sqlite3Wher
22f20 65 45 6e 64 28 70 57 49 6e 66 6f 29 3b 0a 20 20  eEnd(pWInfo);.  
22f30 20 20 20 20 66 69 6e 61 6c 69 7a 65 41 67 67 46      finalizeAggF
22f40 75 6e 63 74 69 6f 6e 73 28 70 50 61 72 73 65 2c  unctions(pParse,
22f50 20 26 73 41 67 67 49 6e 66 6f 29 3b 0a 20 20 20   &sAggInfo);.   
22f60 20 20 20 70 4f 72 64 65 72 42 79 20 3d 20 30 3b     pOrderBy = 0;
22f70 0a 20 20 20 20 20 20 69 66 28 20 70 48 61 76 69  .      if( pHavi
22f80 6e 67 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  ng ){.        sq
22f90 6c 69 74 65 33 45 78 70 72 49 66 46 61 6c 73 65  lite3ExprIfFalse
22fa0 28 70 50 61 72 73 65 2c 20 70 48 61 76 69 6e 67  (pParse, pHaving
22fb0 2c 20 61 64 64 72 45 6e 64 2c 20 53 51 4c 49 54  , addrEnd, SQLIT
22fc0 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c 29 3b 0a 20  E_JUMPIFNULL);. 
22fd0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 65 6c       }.      sel
22fe0 65 63 74 49 6e 6e 65 72 4c 6f 6f 70 28 70 50 61  ectInnerLoop(pPa
22ff0 72 73 65 2c 20 70 2c 20 70 2d 3e 70 45 4c 69 73  rse, p, p->pELis
23000 74 2c 20 30 2c 20 30 2c 20 30 2c 20 2d 31 2c 20  t, 0, 0, 0, -1, 
23010 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
23020 20 20 20 20 20 20 20 70 44 65 73 74 2c 20 61 64         pDest, ad
23030 64 72 45 6e 64 2c 20 61 64 64 72 45 6e 64 29 3b  drEnd, addrEnd);
23040 0a 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  ..      sqlite3E
23050 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28 70 44  xprListDelete(pD
23060 65 6c 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73  el);.    }.    s
23070 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76  qlite3VdbeResolv
23080 65 4c 61 62 65 6c 28 76 2c 20 61 64 64 72 45 6e  eLabel(v, addrEn
23090 64 29 3b 0a 20 20 20 20 0a 20 20 7d 20 2f 2a 20  d);.    .  } /* 
230a0 65 6e 64 69 66 20 61 67 67 72 65 67 61 74 65 20  endif aggregate 
230b0 71 75 65 72 79 20 2a 2f 0a 0a 20 20 2f 2a 20 49  query */..  /* I
230c0 66 20 74 68 65 72 65 20 69 73 20 61 6e 20 4f 52  f there is an OR
230d0 44 45 52 20 42 59 20 63 6c 61 75 73 65 2c 20 74  DER BY clause, t
230e0 68 65 6e 20 77 65 20 6e 65 65 64 20 74 6f 20 73  hen we need to s
230f0 6f 72 74 20 74 68 65 20 72 65 73 75 6c 74 73 0a  ort the results.
23100 20 20 2a 2a 20 61 6e 64 20 73 65 6e 64 20 74 68    ** and send th
23110 65 6d 20 74 6f 20 74 68 65 20 63 61 6c 6c 62 61  em to the callba
23120 63 6b 20 6f 6e 65 20 62 79 20 6f 6e 65 2e 0a 20  ck one by one.. 
23130 20 2a 2f 0a 20 20 69 66 28 20 70 4f 72 64 65 72   */.  if( pOrder
23140 42 79 20 29 7b 0a 20 20 20 20 67 65 6e 65 72 61  By ){.    genera
23150 74 65 53 6f 72 74 54 61 69 6c 28 70 50 61 72 73  teSortTail(pPars
23160 65 2c 20 70 2c 20 76 2c 20 70 45 4c 69 73 74 2d  e, p, v, pEList-
23170 3e 6e 45 78 70 72 2c 20 70 44 65 73 74 29 3b 0a  >nExpr, pDest);.
23180 20 20 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c    }..#ifndef SQL
23190 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52  ITE_OMIT_SUBQUER
231a0 59 0a 20 20 2f 2a 20 49 66 20 74 68 69 73 20 77  Y.  /* If this w
231b0 61 73 20 61 20 73 75 62 71 75 65 72 79 2c 20 77  as a subquery, w
231c0 65 20 68 61 76 65 20 6e 6f 77 20 63 6f 6e 76 65  e have now conve
231d0 72 74 65 64 20 74 68 65 20 73 75 62 71 75 65 72  rted the subquer
231e0 79 20 69 6e 74 6f 20 61 0a 20 20 2a 2a 20 74 65  y into a.  ** te
231f0 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 2e 20 20  mporary table.  
23200 53 6f 20 73 65 74 20 74 68 65 20 53 72 63 4c 69  So set the SrcLi
23210 73 74 5f 69 74 65 6d 2e 69 73 50 6f 70 75 6c 61  st_item.isPopula
23220 74 65 64 20 66 6c 61 67 20 74 6f 20 70 72 65 76  ted flag to prev
23230 65 6e 74 0a 20 20 2a 2a 20 74 68 69 73 20 73 75  ent.  ** this su
23240 62 71 75 65 72 79 20 66 72 6f 6d 20 62 65 69 6e  bquery from bein
23250 67 20 65 76 61 6c 75 61 74 65 64 20 61 67 61 69  g evaluated agai
23260 6e 20 61 6e 64 20 74 6f 20 66 6f 72 63 65 20 74  n and to force t
23270 68 65 20 75 73 65 20 6f 66 0a 20 20 2a 2a 20 74  he use of.  ** t
23280 68 65 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62  he temporary tab
23290 6c 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  le..  */.  if( p
232a0 50 61 72 65 6e 74 20 29 7b 0a 20 20 20 20 61 73  Parent ){.    as
232b0 73 65 72 74 28 20 70 50 61 72 65 6e 74 2d 3e 70  sert( pParent->p
232c0 53 72 63 2d 3e 6e 53 72 63 3e 70 61 72 65 6e 74  Src->nSrc>parent
232d0 54 61 62 20 29 3b 0a 20 20 20 20 61 73 73 65 72  Tab );.    asser
232e0 74 28 20 70 50 61 72 65 6e 74 2d 3e 70 53 72 63  t( pParent->pSrc
232f0 2d 3e 61 5b 70 61 72 65 6e 74 54 61 62 5d 2e 70  ->a[parentTab].p
23300 53 65 6c 65 63 74 3d 3d 70 20 29 3b 0a 20 20 20  Select==p );.   
23310 20 70 50 61 72 65 6e 74 2d 3e 70 53 72 63 2d 3e   pParent->pSrc->
23320 61 5b 70 61 72 65 6e 74 54 61 62 5d 2e 69 73 50  a[parentTab].isP
23330 6f 70 75 6c 61 74 65 64 20 3d 20 31 3b 0a 20 20  opulated = 1;.  
23340 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 4a  }.#endif..  /* J
23350 75 6d 70 20 68 65 72 65 20 74 6f 20 73 6b 69 70  ump here to skip
23360 20 74 68 69 73 20 71 75 65 72 79 0a 20 20 2a 2f   this query.  */
23370 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65  .  sqlite3VdbeRe
23380 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 69 45  solveLabel(v, iE
23390 6e 64 29 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 53  nd);..  /* The S
233a0 45 4c 45 43 54 20 77 61 73 20 73 75 63 63 65 73  ELECT was succes
233b0 73 66 75 6c 6c 79 20 63 6f 64 65 64 2e 20 20 20  sfully coded.   
233c0 53 65 74 20 74 68 65 20 72 65 74 75 72 6e 20 63  Set the return c
233d0 6f 64 65 20 74 6f 20 30 0a 20 20 2a 2a 20 74 6f  ode to 0.  ** to
233e0 20 69 6e 64 69 63 61 74 65 20 6e 6f 20 65 72 72   indicate no err
233f0 6f 72 73 2e 0a 20 20 2a 2f 0a 20 20 72 63 20 3d  ors..  */.  rc =
23400 20 30 3b 0a 0a 20 20 2f 2a 20 43 6f 6e 74 72 6f   0;..  /* Contro
23410 6c 20 6a 75 6d 70 73 20 74 6f 20 68 65 72 65 20  l jumps to here 
23420 69 66 20 61 6e 20 65 72 72 6f 72 20 69 73 20 65  if an error is e
23430 6e 63 6f 75 6e 74 65 72 65 64 20 61 62 6f 76 65  ncountered above
23440 2c 20 6f 72 20 75 70 6f 6e 0a 20 20 2a 2a 20 73  , or upon.  ** s
23450 75 63 63 65 73 73 66 75 6c 20 63 6f 64 69 6e 67  uccessful coding
23460 20 6f 66 20 74 68 65 20 53 45 4c 45 43 54 2e 0a   of the SELECT..
23470 20 20 2a 2f 0a 73 65 6c 65 63 74 5f 65 6e 64 3a    */.select_end:
23480 0a 0a 20 20 2f 2a 20 49 64 65 6e 74 69 66 79 20  ..  /* Identify 
23490 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 69 66 20  column names if 
234a0 77 65 20 77 69 6c 6c 20 62 65 20 75 73 69 6e 67  we will be using
234b0 20 74 68 65 6d 20 69 6e 20 61 20 63 61 6c 6c 62   them in a callb
234c0 61 63 6b 2e 20 20 54 68 69 73 0a 20 20 2a 2a 20  ack.  This.  ** 
234d0 73 74 65 70 20 69 73 20 73 6b 69 70 70 65 64 20  step is skipped 
234e0 69 66 20 74 68 65 20 6f 75 74 70 75 74 20 69 73  if the output is
234f0 20 67 6f 69 6e 67 20 74 6f 20 73 6f 6d 65 20 6f   going to some o
23500 74 68 65 72 20 64 65 73 74 69 6e 61 74 69 6f 6e  ther destination
23510 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 72 63 3d  ..  */.  if( rc=
23520 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 44  =SQLITE_OK && pD
23530 65 73 74 2d 3e 65 44 65 73 74 3d 3d 53 52 54 5f  est->eDest==SRT_
23540 43 61 6c 6c 62 61 63 6b 20 29 7b 0a 20 20 20 20  Callback ){.    
23550 67 65 6e 65 72 61 74 65 43 6f 6c 75 6d 6e 4e 61  generateColumnNa
23560 6d 65 73 28 70 50 61 72 73 65 2c 20 70 54 61 62  mes(pParse, pTab
23570 4c 69 73 74 2c 20 70 45 4c 69 73 74 29 3b 0a 20  List, pEList);. 
23580 20 7d 0a 0a 20 20 73 71 6c 69 74 65 33 5f 66 72   }..  sqlite3_fr
23590 65 65 28 73 41 67 67 49 6e 66 6f 2e 61 43 6f 6c  ee(sAggInfo.aCol
235a0 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65  );.  sqlite3_fre
235b0 65 28 73 41 67 67 49 6e 66 6f 2e 61 46 75 6e 63  e(sAggInfo.aFunc
235c0 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
235d0 7d 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53  }..#if defined(S
235e0 51 4c 49 54 45 5f 44 45 42 55 47 29 0a 2f 2a 0a  QLITE_DEBUG)./*.
235f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
23600 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
23610 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
23620 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
23630 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a  ***************.
23640 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  ** The following
23650 20 63 6f 64 65 20 69 73 20 75 73 65 64 20 66 6f   code is used fo
23660 72 20 74 65 73 74 69 6e 67 20 61 6e 64 20 64 65  r testing and de
23670 62 75 67 67 69 6e 67 20 6f 6e 6c 79 2e 20 20 54  bugging only.  T
23680 68 65 20 63 6f 64 65 0a 2a 2a 20 74 68 61 74 20  he code.** that 
23690 66 6f 6c 6c 6f 77 73 20 64 6f 65 73 20 6e 6f 74  follows does not
236a0 20 61 70 70 65 61 72 20 69 6e 20 6e 6f 72 6d 61   appear in norma
236b0 6c 20 62 75 69 6c 64 73 2e 0a 2a 2a 0a 2a 2a 20  l builds..**.** 
236c0 54 68 65 73 65 20 72 6f 75 74 69 6e 65 73 20 61  These routines a
236d0 72 65 20 75 73 65 64 20 74 6f 20 70 72 69 6e 74  re used to print
236e0 20 6f 75 74 20 74 68 65 20 63 6f 6e 74 65 6e 74   out the content
236f0 20 6f 66 20 61 6c 6c 20 6f 72 20 70 61 72 74 20   of all or part 
23700 6f 66 20 61 20 0a 2a 2a 20 70 61 72 73 65 20 73  of a .** parse s
23710 74 72 75 63 74 75 72 65 73 20 73 75 63 68 20 61  tructures such a
23720 73 20 53 65 6c 65 63 74 20 6f 72 20 45 78 70 72  s Select or Expr
23730 2e 20 20 53 75 63 68 20 70 72 69 6e 74 6f 75 74  .  Such printout
23740 73 20 61 72 65 20 75 73 65 66 75 6c 0a 2a 2a 20  s are useful.** 
23750 66 6f 72 20 68 65 6c 70 69 6e 67 20 74 6f 20 75  for helping to u
23760 6e 64 65 72 73 74 61 6e 64 20 77 68 61 74 20 69  nderstand what i
23770 73 20 68 61 70 70 65 6e 69 6e 67 20 69 6e 73 69  s happening insi
23780 64 65 20 74 68 65 20 63 6f 64 65 20 67 65 6e 65  de the code gene
23790 72 61 74 6f 72 0a 2a 2a 20 64 75 72 69 6e 67 20  rator.** during 
237a0 74 68 65 20 65 78 65 63 75 74 69 6f 6e 20 6f 66  the execution of
237b0 20 63 6f 6d 70 6c 65 78 20 53 45 4c 45 43 54 20   complex SELECT 
237c0 73 74 61 74 65 6d 65 6e 74 73 2e 0a 2a 2a 0a 2a  statements..**.*
237d0 2a 20 54 68 65 73 65 20 72 6f 75 74 69 6e 65 20  * These routine 
237e0 61 72 65 20 6e 6f 74 20 63 61 6c 6c 65 64 20 61  are not called a
237f0 6e 79 77 68 65 72 65 20 66 72 6f 6d 20 77 69 74  nywhere from wit
23800 68 69 6e 20 74 68 65 20 6e 6f 72 6d 61 6c 0a 2a  hin the normal.*
23810 2a 20 63 6f 64 65 20 62 61 73 65 2e 20 20 54 68  * code base.  Th
23820 65 6e 20 61 72 65 20 69 6e 74 65 6e 64 65 64 20  en are intended 
23830 74 6f 20 62 65 20 63 61 6c 6c 65 64 20 66 72 6f  to be called fro
23840 6d 20 77 69 74 68 69 6e 20 74 68 65 20 64 65 62  m within the deb
23850 75 67 67 65 72 0a 2a 2a 20 6f 72 20 66 72 6f 6d  ugger.** or from
23860 20 74 65 6d 70 6f 72 61 72 79 20 22 70 72 69 6e   temporary "prin
23870 74 66 22 20 73 74 61 74 65 6d 65 6e 74 73 20 69  tf" statements i
23880 6e 73 65 72 74 65 64 20 66 6f 72 20 64 65 62 75  nserted for debu
23890 67 67 69 6e 67 2e 0a 2a 2f 0a 76 6f 69 64 20 73  gging..*/.void s
238a0 71 6c 69 74 65 33 50 72 69 6e 74 45 78 70 72 28  qlite3PrintExpr(
238b0 45 78 70 72 20 2a 70 29 7b 0a 20 20 69 66 28 20  Expr *p){.  if( 
238c0 70 2d 3e 74 6f 6b 65 6e 2e 7a 20 26 26 20 70 2d  p->token.z && p-
238d0 3e 74 6f 6b 65 6e 2e 6e 3e 30 20 29 7b 0a 20 20  >token.n>0 ){.  
238e0 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72    sqlite3DebugPr
238f0 69 6e 74 66 28 22 28 25 2e 2a 73 22 2c 20 70 2d  intf("(%.*s", p-
23900 3e 74 6f 6b 65 6e 2e 6e 2c 20 70 2d 3e 74 6f 6b  >token.n, p->tok
23910 65 6e 2e 7a 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  en.z);.  }else{.
23920 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67      sqlite3Debug
23930 50 72 69 6e 74 66 28 22 28 25 64 22 2c 20 70 2d  Printf("(%d", p-
23940 3e 6f 70 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  >op);.  }.  if( 
23950 70 2d 3e 70 4c 65 66 74 20 29 7b 0a 20 20 20 20  p->pLeft ){.    
23960 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e  sqlite3DebugPrin
23970 74 66 28 22 20 22 29 3b 0a 20 20 20 20 73 71 6c  tf(" ");.    sql
23980 69 74 65 33 50 72 69 6e 74 45 78 70 72 28 70 2d  ite3PrintExpr(p-
23990 3e 70 4c 65 66 74 29 3b 0a 20 20 7d 0a 20 20 69  >pLeft);.  }.  i
239a0 66 28 20 70 2d 3e 70 52 69 67 68 74 20 29 7b 0a  f( p->pRight ){.
239b0 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67      sqlite3Debug
239c0 50 72 69 6e 74 66 28 22 20 22 29 3b 0a 20 20 20  Printf(" ");.   
239d0 20 73 71 6c 69 74 65 33 50 72 69 6e 74 45 78 70   sqlite3PrintExp
239e0 72 28 70 2d 3e 70 52 69 67 68 74 29 3b 0a 20 20  r(p->pRight);.  
239f0 7d 0a 20 20 73 71 6c 69 74 65 33 44 65 62 75 67  }.  sqlite3Debug
23a00 50 72 69 6e 74 66 28 22 29 22 29 3b 0a 7d 0a 76  Printf(")");.}.v
23a10 6f 69 64 20 73 71 6c 69 74 65 33 50 72 69 6e 74  oid sqlite3Print
23a20 45 78 70 72 4c 69 73 74 28 45 78 70 72 4c 69 73  ExprList(ExprLis
23a30 74 20 2a 70 4c 69 73 74 29 7b 0a 20 20 69 6e 74  t *pList){.  int
23a40 20 69 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69   i;.  for(i=0; i
23a50 3c 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69  <pList->nExpr; i
23a60 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  ++){.    sqlite3
23a70 50 72 69 6e 74 45 78 70 72 28 70 4c 69 73 74 2d  PrintExpr(pList-
23a80 3e 61 5b 69 5d 2e 70 45 78 70 72 29 3b 0a 20 20  >a[i].pExpr);.  
23a90 20 20 69 66 28 20 69 3c 70 4c 69 73 74 2d 3e 6e    if( i<pList->n
23aa0 45 78 70 72 2d 31 20 29 7b 0a 20 20 20 20 20 20  Expr-1 ){.      
23ab0 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e  sqlite3DebugPrin
23ac0 74 66 28 22 2c 20 22 29 3b 0a 20 20 20 20 7d 0a  tf(", ");.    }.
23ad0 20 20 7d 0a 7d 0a 76 6f 69 64 20 73 71 6c 69 74    }.}.void sqlit
23ae0 65 33 50 72 69 6e 74 53 65 6c 65 63 74 28 53 65  e3PrintSelect(Se
23af0 6c 65 63 74 20 2a 70 2c 20 69 6e 74 20 69 6e 64  lect *p, int ind
23b00 65 6e 74 29 7b 0a 20 20 73 71 6c 69 74 65 33 44  ent){.  sqlite3D
23b10 65 62 75 67 50 72 69 6e 74 66 28 22 25 2a 73 53  ebugPrintf("%*sS
23b20 45 4c 45 43 54 28 25 70 29 20 22 2c 20 69 6e 64  ELECT(%p) ", ind
23b30 65 6e 74 2c 20 22 22 2c 20 70 29 3b 0a 20 20 73  ent, "", p);.  s
23b40 71 6c 69 74 65 33 50 72 69 6e 74 45 78 70 72 4c  qlite3PrintExprL
23b50 69 73 74 28 70 2d 3e 70 45 4c 69 73 74 29 3b 0a  ist(p->pEList);.
23b60 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72    sqlite3DebugPr
23b70 69 6e 74 66 28 22 5c 6e 22 29 3b 0a 20 20 69 66  intf("\n");.  if
23b80 28 20 70 2d 3e 70 53 72 63 20 29 7b 0a 20 20 20  ( p->pSrc ){.   
23b90 20 63 68 61 72 20 2a 7a 50 72 65 66 69 78 3b 0a   char *zPrefix;.
23ba0 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 7a      int i;.    z
23bb0 50 72 65 66 69 78 20 3d 20 22 46 52 4f 4d 22 3b  Prefix = "FROM";
23bc0 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
23bd0 70 2d 3e 70 53 72 63 2d 3e 6e 53 72 63 3b 20 69  p->pSrc->nSrc; i
23be0 2b 2b 29 7b 0a 20 20 20 20 20 20 73 74 72 75 63  ++){.      struc
23bf0 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a  t SrcList_item *
23c00 70 49 74 65 6d 20 3d 20 26 70 2d 3e 70 53 72 63  pItem = &p->pSrc
23c10 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20 20 20 73 71  ->a[i];.      sq
23c20 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66  lite3DebugPrintf
23c30 28 22 25 2a 73 20 22 2c 20 69 6e 64 65 6e 74 2b  ("%*s ", indent+
23c40 36 2c 20 7a 50 72 65 66 69 78 29 3b 0a 20 20 20  6, zPrefix);.   
23c50 20 20 20 7a 50 72 65 66 69 78 20 3d 20 22 22 3b     zPrefix = "";
23c60 0a 20 20 20 20 20 20 69 66 28 20 70 49 74 65 6d  .      if( pItem
23c70 2d 3e 70 53 65 6c 65 63 74 20 29 7b 0a 20 20 20  ->pSelect ){.   
23c80 20 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75       sqlite3Debu
23c90 67 50 72 69 6e 74 66 28 22 28 5c 6e 22 29 3b 0a  gPrintf("(\n");.
23ca0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 50          sqlite3P
23cb0 72 69 6e 74 53 65 6c 65 63 74 28 70 49 74 65 6d  rintSelect(pItem
23cc0 2d 3e 70 53 65 6c 65 63 74 2c 20 69 6e 64 65 6e  ->pSelect, inden
23cd0 74 2b 31 30 29 3b 0a 20 20 20 20 20 20 20 20 73  t+10);.        s
23ce0 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74  qlite3DebugPrint
23cf0 66 28 22 25 2a 73 29 22 2c 20 69 6e 64 65 6e 74  f("%*s)", indent
23d00 2b 38 2c 20 22 22 29 3b 0a 20 20 20 20 20 20 7d  +8, "");.      }
23d10 65 6c 73 65 20 69 66 28 20 70 49 74 65 6d 2d 3e  else if( pItem->
23d20 7a 4e 61 6d 65 20 29 7b 0a 20 20 20 20 20 20 20  zName ){.       
23d30 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69   sqlite3DebugPri
23d40 6e 74 66 28 22 25 73 22 2c 20 70 49 74 65 6d 2d  ntf("%s", pItem-
23d50 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 7d  >zName);.      }
23d60 0a 20 20 20 20 20 20 69 66 28 20 70 49 74 65 6d  .      if( pItem
23d70 2d 3e 70 54 61 62 20 29 7b 0a 20 20 20 20 20 20  ->pTab ){.      
23d80 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72    sqlite3DebugPr
23d90 69 6e 74 66 28 22 28 74 61 62 6c 65 3a 20 25 73  intf("(table: %s
23da0 29 22 2c 20 70 49 74 65 6d 2d 3e 70 54 61 62 2d  )", pItem->pTab-
23db0 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 7d  >zName);.      }
23dc0 0a 20 20 20 20 20 20 69 66 28 20 70 49 74 65 6d  .      if( pItem
23dd0 2d 3e 7a 41 6c 69 61 73 20 29 7b 0a 20 20 20 20  ->zAlias ){.    
23de0 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67      sqlite3Debug
23df0 50 72 69 6e 74 66 28 22 20 41 53 20 25 73 22 2c  Printf(" AS %s",
23e00 20 70 49 74 65 6d 2d 3e 7a 41 6c 69 61 73 29 3b   pItem->zAlias);
23e10 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
23e20 66 28 20 69 3c 70 2d 3e 70 53 72 63 2d 3e 6e 53  f( i<p->pSrc->nS
23e30 72 63 2d 31 20 29 7b 0a 20 20 20 20 20 20 20 20  rc-1 ){.        
23e40 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e  sqlite3DebugPrin
23e50 74 66 28 22 2c 22 29 3b 0a 20 20 20 20 20 20 7d  tf(",");.      }
23e60 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 65  .      sqlite3De
23e70 62 75 67 50 72 69 6e 74 66 28 22 5c 6e 22 29 3b  bugPrintf("\n");
23e80 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28  .    }.  }.  if(
23e90 20 70 2d 3e 70 57 68 65 72 65 20 29 7b 0a 20 20   p->pWhere ){.  
23ea0 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72    sqlite3DebugPr
23eb0 69 6e 74 66 28 22 25 2a 73 20 57 48 45 52 45 20  intf("%*s WHERE 
23ec0 22 2c 20 69 6e 64 65 6e 74 2c 20 22 22 29 3b 0a  ", indent, "");.
23ed0 20 20 20 20 73 71 6c 69 74 65 33 50 72 69 6e 74      sqlite3Print
23ee0 45 78 70 72 28 70 2d 3e 70 57 68 65 72 65 29 3b  Expr(p->pWhere);
23ef0 0a 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75  .    sqlite3Debu
23f00 67 50 72 69 6e 74 66 28 22 5c 6e 22 29 3b 0a 20  gPrintf("\n");. 
23f10 20 7d 0a 20 20 69 66 28 20 70 2d 3e 70 47 72 6f   }.  if( p->pGro
23f20 75 70 42 79 20 29 7b 0a 20 20 20 20 73 71 6c 69  upBy ){.    sqli
23f30 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22  te3DebugPrintf("
23f40 25 2a 73 20 47 52 4f 55 50 20 42 59 20 22 2c 20  %*s GROUP BY ", 
23f50 69 6e 64 65 6e 74 2c 20 22 22 29 3b 0a 20 20 20  indent, "");.   
23f60 20 73 71 6c 69 74 65 33 50 72 69 6e 74 45 78 70   sqlite3PrintExp
23f70 72 4c 69 73 74 28 70 2d 3e 70 47 72 6f 75 70 42  rList(p->pGroupB
23f80 79 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44  y);.    sqlite3D
23f90 65 62 75 67 50 72 69 6e 74 66 28 22 5c 6e 22 29  ebugPrintf("\n")
23fa0 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e 70  ;.  }.  if( p->p
23fb0 48 61 76 69 6e 67 20 29 7b 0a 20 20 20 20 73 71  Having ){.    sq
23fc0 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66  lite3DebugPrintf
23fd0 28 22 25 2a 73 20 48 41 56 49 4e 47 20 22 2c 20  ("%*s HAVING ", 
23fe0 69 6e 64 65 6e 74 2c 20 22 22 29 3b 0a 20 20 20  indent, "");.   
23ff0 20 73 71 6c 69 74 65 33 50 72 69 6e 74 45 78 70   sqlite3PrintExp
24000 72 28 70 2d 3e 70 48 61 76 69 6e 67 29 3b 0a 20  r(p->pHaving);. 
24010 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50     sqlite3DebugP
24020 72 69 6e 74 66 28 22 5c 6e 22 29 3b 0a 20 20 7d  rintf("\n");.  }
24030 0a 20 20 69 66 28 20 70 2d 3e 70 4f 72 64 65 72  .  if( p->pOrder
24040 42 79 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  By ){.    sqlite
24050 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 25 2a  3DebugPrintf("%*
24060 73 20 4f 52 44 45 52 20 42 59 20 22 2c 20 69 6e  s ORDER BY ", in
24070 64 65 6e 74 2c 20 22 22 29 3b 0a 20 20 20 20 73  dent, "");.    s
24080 71 6c 69 74 65 33 50 72 69 6e 74 45 78 70 72 4c  qlite3PrintExprL
24090 69 73 74 28 70 2d 3e 70 4f 72 64 65 72 42 79 29  ist(p->pOrderBy)
240a0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 65 62  ;.    sqlite3Deb
240b0 75 67 50 72 69 6e 74 66 28 22 5c 6e 22 29 3b 0a  ugPrintf("\n");.
240c0 20 20 7d 0a 7d 0a 2f 2a 20 45 6e 64 20 6f 66 20    }.}./* End of 
240d0 74 68 65 20 73 74 72 75 63 74 75 72 65 20 64 65  the structure de
240e0 62 75 67 20 70 72 69 6e 74 69 6e 67 20 63 6f 64  bug printing cod
240f0 65 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  e.**************
24100 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
24110 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
24120 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
24130 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f  ***************/
24140 0a 23 65 6e 64 69 66 20 2f 2a 20 64 65 66 69 6e  .#endif /* defin
24150 65 64 28 53 51 4c 49 54 45 5f 54 45 53 54 29 20  ed(SQLITE_TEST) 
24160 7c 7c 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  || defined(SQLIT
24170 45 5f 44 45 42 55 47 29 20 2a 2f 0a              E_DEBUG) */.