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

Artifact dfc7e6ba4c987105799372ab7c8b58a305237c01:


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 33 35  select.c,v 1.435
0200: 20 32 30 30 38 2f 30 36 2f 32 34 20 31 32 3a 34   2008/06/24 12:4
0210: 36 3a 33 31 20 64 72 68 20 45 78 70 20 24 0a 2a  6:31 drh Exp $.*
0220: 2f 0a 23 69 6e 63 6c 75 64 65 20 22 73 71 6c 69  /.#include "sqli
0230: 74 65 49 6e 74 2e 68 22 0a 0a 0a 2f 2a 0a 2a 2a  teInt.h".../*.**
0240: 20 44 65 6c 65 74 65 20 61 6c 6c 20 74 68 65 20   Delete all the 
0250: 63 6f 6e 74 65 6e 74 20 6f 66 20 61 20 53 65 6c  content of a Sel
0260: 65 63 74 20 73 74 72 75 63 74 75 72 65 20 62 75  ect structure bu
0270: 74 20 64 6f 20 6e 6f 74 20 64 65 61 6c 6c 6f 63  t do not dealloc
0280: 61 74 65 0a 2a 2a 20 74 68 65 20 73 65 6c 65 63  ate.** the selec
0290: 74 20 73 74 72 75 63 74 75 72 65 20 69 74 73 65  t structure itse
02a0: 6c 66 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  lf..*/.static vo
02b0: 69 64 20 63 6c 65 61 72 53 65 6c 65 63 74 28 53  id clearSelect(S
02c0: 65 6c 65 63 74 20 2a 70 29 7b 0a 20 20 73 71 6c  elect *p){.  sql
02d0: 69 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65  ite3ExprListDele
02e0: 74 65 28 70 2d 3e 70 45 4c 69 73 74 29 3b 0a 20  te(p->pEList);. 
02f0: 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74 44   sqlite3SrcListD
0300: 65 6c 65 74 65 28 70 2d 3e 70 53 72 63 29 3b 0a  elete(p->pSrc);.
0310: 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c    sqlite3ExprDel
0320: 65 74 65 28 70 2d 3e 70 57 68 65 72 65 29 3b 0a  ete(p->pWhere);.
0330: 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73    sqlite3ExprLis
0340: 74 44 65 6c 65 74 65 28 70 2d 3e 70 47 72 6f 75  tDelete(p->pGrou
0350: 70 42 79 29 3b 0a 20 20 73 71 6c 69 74 65 33 45  pBy);.  sqlite3E
0360: 78 70 72 44 65 6c 65 74 65 28 70 2d 3e 70 48 61  xprDelete(p->pHa
0370: 76 69 6e 67 29 3b 0a 20 20 73 71 6c 69 74 65 33  ving);.  sqlite3
0380: 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28 70  ExprListDelete(p
0390: 2d 3e 70 4f 72 64 65 72 42 79 29 3b 0a 20 20 73  ->pOrderBy);.  s
03a0: 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65 6c 65  qlite3SelectDele
03b0: 74 65 28 70 2d 3e 70 50 72 69 6f 72 29 3b 0a 20  te(p->pPrior);. 
03c0: 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65   sqlite3ExprDele
03d0: 74 65 28 70 2d 3e 70 4c 69 6d 69 74 29 3b 0a 20  te(p->pLimit);. 
03e0: 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65   sqlite3ExprDele
03f0: 74 65 28 70 2d 3e 70 4f 66 66 73 65 74 29 3b 0a  te(p->pOffset);.
0400: 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69 74 69 61 6c  }../*.** Initial
0410: 69 7a 65 20 61 20 53 65 6c 65 63 74 44 65 73 74  ize a SelectDest
0420: 20 73 74 72 75 63 74 75 72 65 2e 0a 2a 2f 0a 76   structure..*/.v
0430: 6f 69 64 20 73 71 6c 69 74 65 33 53 65 6c 65 63  oid sqlite3Selec
0440: 74 44 65 73 74 49 6e 69 74 28 53 65 6c 65 63 74  tDestInit(Select
0450: 44 65 73 74 20 2a 70 44 65 73 74 2c 20 69 6e 74  Dest *pDest, int
0460: 20 65 44 65 73 74 2c 20 69 6e 74 20 69 50 61 72   eDest, int iPar
0470: 6d 29 7b 0a 20 20 70 44 65 73 74 2d 3e 65 44 65  m){.  pDest->eDe
0480: 73 74 20 3d 20 65 44 65 73 74 3b 0a 20 20 70 44  st = eDest;.  pD
0490: 65 73 74 2d 3e 69 50 61 72 6d 20 3d 20 69 50 61  est->iParm = iPa
04a0: 72 6d 3b 0a 20 20 70 44 65 73 74 2d 3e 61 66 66  rm;.  pDest->aff
04b0: 69 6e 69 74 79 20 3d 20 30 3b 0a 20 20 70 44 65  inity = 0;.  pDe
04c0: 73 74 2d 3e 69 4d 65 6d 20 3d 20 30 3b 0a 20 20  st->iMem = 0;.  
04d0: 70 44 65 73 74 2d 3e 6e 4d 65 6d 20 3d 20 30 3b  pDest->nMem = 0;
04e0: 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63  .}.../*.** Alloc
04f0: 61 74 65 20 61 20 6e 65 77 20 53 65 6c 65 63 74  ate a new Select
0500: 20 73 74 72 75 63 74 75 72 65 20 61 6e 64 20 72   structure and r
0510: 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20  eturn a pointer 
0520: 74 6f 20 74 68 61 74 0a 2a 2a 20 73 74 72 75 63  to that.** struc
0530: 74 75 72 65 2e 0a 2a 2f 0a 53 65 6c 65 63 74 20  ture..*/.Select 
0540: 2a 73 71 6c 69 74 65 33 53 65 6c 65 63 74 4e 65  *sqlite3SelectNe
0550: 77 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  w(.  Parse *pPar
0560: 73 65 2c 20 20 20 20 20 20 20 20 2f 2a 20 50 61  se,        /* Pa
0570: 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f  rsing context */
0580: 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c  .  ExprList *pEL
0590: 69 73 74 2c 20 20 20 20 20 2f 2a 20 77 68 69 63  ist,     /* whic
05a0: 68 20 63 6f 6c 75 6d 6e 73 20 74 6f 20 69 6e 63  h columns to inc
05b0: 6c 75 64 65 20 69 6e 20 74 68 65 20 72 65 73 75  lude in the resu
05c0: 6c 74 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20  lt */.  SrcList 
05d0: 2a 70 53 72 63 2c 20 20 20 20 20 20 20 20 2f 2a  *pSrc,        /*
05e0: 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65   the FROM clause
05f0: 20 2d 2d 20 77 68 69 63 68 20 74 61 62 6c 65 73   -- which tables
0600: 20 74 6f 20 73 63 61 6e 20 2a 2f 0a 20 20 45 78   to scan */.  Ex
0610: 70 72 20 2a 70 57 68 65 72 65 2c 20 20 20 20 20  pr *pWhere,     
0620: 20 20 20 20 2f 2a 20 74 68 65 20 57 48 45 52 45      /* the WHERE
0630: 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 45 78 70   clause */.  Exp
0640: 72 4c 69 73 74 20 2a 70 47 72 6f 75 70 42 79 2c  rList *pGroupBy,
0650: 20 20 20 2f 2a 20 74 68 65 20 47 52 4f 55 50 20     /* the GROUP 
0660: 42 59 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 45  BY clause */.  E
0670: 78 70 72 20 2a 70 48 61 76 69 6e 67 2c 20 20 20  xpr *pHaving,   
0680: 20 20 20 20 20 2f 2a 20 74 68 65 20 48 41 56 49       /* the HAVI
0690: 4e 47 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 45  NG clause */.  E
06a0: 78 70 72 4c 69 73 74 20 2a 70 4f 72 64 65 72 42  xprList *pOrderB
06b0: 79 2c 20 20 20 2f 2a 20 74 68 65 20 4f 52 44 45  y,   /* the ORDE
06c0: 52 20 42 59 20 63 6c 61 75 73 65 20 2a 2f 0a 20  R BY clause */. 
06d0: 20 69 6e 74 20 69 73 44 69 73 74 69 6e 63 74 2c   int isDistinct,
06e0: 20 20 20 20 20 20 20 2f 2a 20 74 72 75 65 20 69         /* true i
06f0: 66 20 74 68 65 20 44 49 53 54 49 4e 43 54 20 6b  f the DISTINCT k
0700: 65 79 77 6f 72 64 20 69 73 20 70 72 65 73 65 6e  eyword is presen
0710: 74 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 4c 69  t */.  Expr *pLi
0720: 6d 69 74 2c 20 20 20 20 20 20 20 20 20 2f 2a 20  mit,         /* 
0730: 4c 49 4d 49 54 20 76 61 6c 75 65 2e 20 20 4e 55  LIMIT value.  NU
0740: 4c 4c 20 6d 65 61 6e 73 20 6e 6f 74 20 75 73 65  LL means not use
0750: 64 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 4f 66  d */.  Expr *pOf
0760: 66 73 65 74 20 20 20 20 20 20 20 20 20 2f 2a 20  fset         /* 
0770: 4f 46 46 53 45 54 20 76 61 6c 75 65 2e 20 20 4e  OFFSET value.  N
0780: 55 4c 4c 20 6d 65 61 6e 73 20 6e 6f 20 6f 66 66  ULL means no off
0790: 73 65 74 20 2a 2f 0a 29 7b 0a 20 20 53 65 6c 65  set */.){.  Sele
07a0: 63 74 20 2a 70 4e 65 77 3b 0a 20 20 53 65 6c 65  ct *pNew;.  Sele
07b0: 63 74 20 73 74 61 6e 64 69 6e 3b 0a 20 20 73 71  ct standin;.  sq
07c0: 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72  lite3 *db = pPar
07d0: 73 65 2d 3e 64 62 3b 0a 20 20 70 4e 65 77 20 3d  se->db;.  pNew =
07e0: 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63   sqlite3DbMalloc
07f0: 5a 65 72 6f 28 64 62 2c 20 73 69 7a 65 6f 66 28  Zero(db, sizeof(
0800: 2a 70 4e 65 77 29 20 29 3b 0a 20 20 61 73 73 65  *pNew) );.  asse
0810: 72 74 28 20 21 70 4f 66 66 73 65 74 20 7c 7c 20  rt( !pOffset || 
0820: 70 4c 69 6d 69 74 20 29 3b 20 20 20 2f 2a 20 43  pLimit );   /* C
0830: 61 6e 27 74 20 68 61 76 65 20 4f 46 46 53 45 54  an't have OFFSET
0840: 20 77 69 74 68 6f 75 74 20 4c 49 4d 49 54 2e 20   without LIMIT. 
0850: 2a 2f 0a 20 20 69 66 28 20 70 4e 65 77 3d 3d 30  */.  if( pNew==0
0860: 20 29 7b 0a 20 20 20 20 70 4e 65 77 20 3d 20 26   ){.    pNew = &
0870: 73 74 61 6e 64 69 6e 3b 0a 20 20 20 20 6d 65 6d  standin;.    mem
0880: 73 65 74 28 70 4e 65 77 2c 20 30 2c 20 73 69 7a  set(pNew, 0, siz
0890: 65 6f 66 28 2a 70 4e 65 77 29 29 3b 0a 20 20 7d  eof(*pNew));.  }
08a0: 0a 20 20 69 66 28 20 70 45 4c 69 73 74 3d 3d 30  .  if( pEList==0
08b0: 20 29 7b 0a 20 20 20 20 70 45 4c 69 73 74 20 3d   ){.    pEList =
08c0: 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
08d0: 41 70 70 65 6e 64 28 70 50 61 72 73 65 2c 20 30  Append(pParse, 0
08e0: 2c 20 73 71 6c 69 74 65 33 45 78 70 72 28 64 62  , sqlite3Expr(db
08f0: 2c 54 4b 5f 41 4c 4c 2c 30 2c 30 2c 30 29 2c 20  ,TK_ALL,0,0,0), 
0900: 30 29 3b 0a 20 20 7d 0a 20 20 70 4e 65 77 2d 3e  0);.  }.  pNew->
0910: 70 45 4c 69 73 74 20 3d 20 70 45 4c 69 73 74 3b  pEList = pEList;
0920: 0a 20 20 70 4e 65 77 2d 3e 70 53 72 63 20 3d 20  .  pNew->pSrc = 
0930: 70 53 72 63 3b 0a 20 20 70 4e 65 77 2d 3e 70 57  pSrc;.  pNew->pW
0940: 68 65 72 65 20 3d 20 70 57 68 65 72 65 3b 0a 20  here = pWhere;. 
0950: 20 70 4e 65 77 2d 3e 70 47 72 6f 75 70 42 79 20   pNew->pGroupBy 
0960: 3d 20 70 47 72 6f 75 70 42 79 3b 0a 20 20 70 4e  = pGroupBy;.  pN
0970: 65 77 2d 3e 70 48 61 76 69 6e 67 20 3d 20 70 48  ew->pHaving = pH
0980: 61 76 69 6e 67 3b 0a 20 20 70 4e 65 77 2d 3e 70  aving;.  pNew->p
0990: 4f 72 64 65 72 42 79 20 3d 20 70 4f 72 64 65 72  OrderBy = pOrder
09a0: 42 79 3b 0a 20 20 70 4e 65 77 2d 3e 69 73 44 69  By;.  pNew->isDi
09b0: 73 74 69 6e 63 74 20 3d 20 69 73 44 69 73 74 69  stinct = isDisti
09c0: 6e 63 74 3b 0a 20 20 70 4e 65 77 2d 3e 6f 70 20  nct;.  pNew->op 
09d0: 3d 20 54 4b 5f 53 45 4c 45 43 54 3b 0a 20 20 61  = TK_SELECT;.  a
09e0: 73 73 65 72 74 28 20 70 4f 66 66 73 65 74 3d 3d  ssert( pOffset==
09f0: 30 20 7c 7c 20 70 4c 69 6d 69 74 21 3d 30 20 29  0 || pLimit!=0 )
0a00: 3b 0a 20 20 70 4e 65 77 2d 3e 70 4c 69 6d 69 74  ;.  pNew->pLimit
0a10: 20 3d 20 70 4c 69 6d 69 74 3b 0a 20 20 70 4e 65   = pLimit;.  pNe
0a20: 77 2d 3e 70 4f 66 66 73 65 74 20 3d 20 70 4f 66  w->pOffset = pOf
0a30: 66 73 65 74 3b 0a 20 20 70 4e 65 77 2d 3e 61 64  fset;.  pNew->ad
0a40: 64 72 4f 70 65 6e 45 70 68 6d 5b 30 5d 20 3d 20  drOpenEphm[0] = 
0a50: 2d 31 3b 0a 20 20 70 4e 65 77 2d 3e 61 64 64 72  -1;.  pNew->addr
0a60: 4f 70 65 6e 45 70 68 6d 5b 31 5d 20 3d 20 2d 31  OpenEphm[1] = -1
0a70: 3b 0a 20 20 70 4e 65 77 2d 3e 61 64 64 72 4f 70  ;.  pNew->addrOp
0a80: 65 6e 45 70 68 6d 5b 32 5d 20 3d 20 2d 31 3b 0a  enEphm[2] = -1;.
0a90: 20 20 69 66 28 20 70 4e 65 77 3d 3d 26 73 74 61    if( pNew==&sta
0aa0: 6e 64 69 6e 29 20 7b 0a 20 20 20 20 63 6c 65 61  ndin) {.    clea
0ab0: 72 53 65 6c 65 63 74 28 70 4e 65 77 29 3b 0a 20  rSelect(pNew);. 
0ac0: 20 20 20 70 4e 65 77 20 3d 20 30 3b 0a 20 20 7d     pNew = 0;.  }
0ad0: 0a 20 20 72 65 74 75 72 6e 20 70 4e 65 77 3b 0a  .  return pNew;.
0ae0: 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65 20  }../*.** Delete 
0af0: 74 68 65 20 67 69 76 65 6e 20 53 65 6c 65 63 74  the given Select
0b00: 20 73 74 72 75 63 74 75 72 65 20 61 6e 64 20 61   structure and a
0b10: 6c 6c 20 6f 66 20 69 74 73 20 73 75 62 73 74 72  ll of its substr
0b20: 75 63 74 75 72 65 73 2e 0a 2a 2f 0a 76 6f 69 64  uctures..*/.void
0b30: 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65   sqlite3SelectDe
0b40: 6c 65 74 65 28 53 65 6c 65 63 74 20 2a 70 29 7b  lete(Select *p){
0b50: 0a 20 20 69 66 28 20 70 20 29 7b 0a 20 20 20 20  .  if( p ){.    
0b60: 63 6c 65 61 72 53 65 6c 65 63 74 28 70 29 3b 0a  clearSelect(p);.
0b70: 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
0b80: 28 70 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  (p);.  }.}../*.*
0b90: 2a 20 47 69 76 65 6e 20 31 20 74 6f 20 33 20 69  * Given 1 to 3 i
0ba0: 64 65 6e 74 69 66 69 65 72 73 20 70 72 65 63 65  dentifiers prece
0bb0: 65 64 69 6e 67 20 74 68 65 20 4a 4f 49 4e 20 6b  eding the JOIN k
0bc0: 65 79 77 6f 72 64 2c 20 64 65 74 65 72 6d 69 6e  eyword, determin
0bd0: 65 20 74 68 65 0a 2a 2a 20 74 79 70 65 20 6f 66  e the.** type of
0be0: 20 6a 6f 69 6e 2e 20 20 52 65 74 75 72 6e 20 61   join.  Return a
0bf0: 6e 20 69 6e 74 65 67 65 72 20 63 6f 6e 73 74 61  n integer consta
0c00: 6e 74 20 74 68 61 74 20 65 78 70 72 65 73 73 65  nt that expresse
0c10: 73 20 74 68 61 74 20 74 79 70 65 0a 2a 2a 20 69  s that type.** i
0c20: 6e 20 74 65 72 6d 73 20 6f 66 20 74 68 65 20 66  n terms of the f
0c30: 6f 6c 6c 6f 77 69 6e 67 20 62 69 74 20 76 61 6c  ollowing bit val
0c40: 75 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 4a  ues:.**.**     J
0c50: 54 5f 49 4e 4e 45 52 0a 2a 2a 20 20 20 20 20 4a  T_INNER.**     J
0c60: 54 5f 43 52 4f 53 53 0a 2a 2a 20 20 20 20 20 4a  T_CROSS.**     J
0c70: 54 5f 4f 55 54 45 52 0a 2a 2a 20 20 20 20 20 4a  T_OUTER.**     J
0c80: 54 5f 4e 41 54 55 52 41 4c 0a 2a 2a 20 20 20 20  T_NATURAL.**    
0c90: 20 4a 54 5f 4c 45 46 54 0a 2a 2a 20 20 20 20 20   JT_LEFT.**     
0ca0: 4a 54 5f 52 49 47 48 54 0a 2a 2a 0a 2a 2a 20 41  JT_RIGHT.**.** A
0cb0: 20 66 75 6c 6c 20 6f 75 74 65 72 20 6a 6f 69 6e   full outer join
0cc0: 20 69 73 20 74 68 65 20 63 6f 6d 62 69 6e 61 74   is the combinat
0cd0: 69 6f 6e 20 6f 66 20 4a 54 5f 4c 45 46 54 20 61  ion of JT_LEFT a
0ce0: 6e 64 20 4a 54 5f 52 49 47 48 54 2e 0a 2a 2a 0a  nd JT_RIGHT..**.
0cf0: 2a 2a 20 49 66 20 61 6e 20 69 6c 6c 65 67 61 6c  ** If an illegal
0d00: 20 6f 72 20 75 6e 73 75 70 70 6f 72 74 65 64 20   or unsupported 
0d10: 6a 6f 69 6e 20 74 79 70 65 20 69 73 20 73 65 65  join type is see
0d20: 6e 2c 20 74 68 65 6e 20 73 74 69 6c 6c 20 72 65  n, then still re
0d30: 74 75 72 6e 0a 2a 2a 20 61 20 6a 6f 69 6e 20 74  turn.** a join t
0d40: 79 70 65 2c 20 62 75 74 20 70 75 74 20 61 6e 20  ype, but put an 
0d50: 65 72 72 6f 72 20 69 6e 20 74 68 65 20 70 50 61  error in the pPa
0d60: 72 73 65 20 73 74 72 75 63 74 75 72 65 2e 0a 2a  rse structure..*
0d70: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 4a 6f 69  /.int sqlite3Joi
0d80: 6e 54 79 70 65 28 50 61 72 73 65 20 2a 70 50 61  nType(Parse *pPa
0d90: 72 73 65 2c 20 54 6f 6b 65 6e 20 2a 70 41 2c 20  rse, Token *pA, 
0da0: 54 6f 6b 65 6e 20 2a 70 42 2c 20 54 6f 6b 65 6e  Token *pB, Token
0db0: 20 2a 70 43 29 7b 0a 20 20 69 6e 74 20 6a 6f 69   *pC){.  int joi
0dc0: 6e 74 79 70 65 20 3d 20 30 3b 0a 20 20 54 6f 6b  ntype = 0;.  Tok
0dd0: 65 6e 20 2a 61 70 41 6c 6c 5b 33 5d 3b 0a 20 20  en *apAll[3];.  
0de0: 54 6f 6b 65 6e 20 2a 70 3b 0a 20 20 73 74 61 74  Token *p;.  stat
0df0: 69 63 20 63 6f 6e 73 74 20 73 74 72 75 63 74 20  ic const struct 
0e00: 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72  {.    const char
0e10: 20 7a 4b 65 79 77 6f 72 64 5b 38 5d 3b 0a 20 20   zKeyword[8];.  
0e20: 20 20 75 38 20 6e 43 68 61 72 3b 0a 20 20 20 20    u8 nChar;.    
0e30: 75 38 20 63 6f 64 65 3b 0a 20 20 7d 20 6b 65 79  u8 code;.  } key
0e40: 77 6f 72 64 73 5b 5d 20 3d 20 7b 0a 20 20 20 20  words[] = {.    
0e50: 7b 20 22 6e 61 74 75 72 61 6c 22 2c 20 37 2c 20  { "natural", 7, 
0e60: 4a 54 5f 4e 41 54 55 52 41 4c 20 7d 2c 0a 20 20  JT_NATURAL },.  
0e70: 20 20 7b 20 22 6c 65 66 74 22 2c 20 20 20 20 34    { "left",    4
0e80: 2c 20 4a 54 5f 4c 45 46 54 7c 4a 54 5f 4f 55 54  , JT_LEFT|JT_OUT
0e90: 45 52 20 7d 2c 0a 20 20 20 20 7b 20 22 72 69 67  ER },.    { "rig
0ea0: 68 74 22 2c 20 20 20 35 2c 20 4a 54 5f 52 49 47  ht",   5, JT_RIG
0eb0: 48 54 7c 4a 54 5f 4f 55 54 45 52 20 7d 2c 0a 20  HT|JT_OUTER },. 
0ec0: 20 20 20 7b 20 22 66 75 6c 6c 22 2c 20 20 20 20     { "full",    
0ed0: 34 2c 20 4a 54 5f 4c 45 46 54 7c 4a 54 5f 52 49  4, JT_LEFT|JT_RI
0ee0: 47 48 54 7c 4a 54 5f 4f 55 54 45 52 20 7d 2c 0a  GHT|JT_OUTER },.
0ef0: 20 20 20 20 7b 20 22 6f 75 74 65 72 22 2c 20 20      { "outer",  
0f00: 20 35 2c 20 4a 54 5f 4f 55 54 45 52 20 7d 2c 0a   5, JT_OUTER },.
0f10: 20 20 20 20 7b 20 22 69 6e 6e 65 72 22 2c 20 20      { "inner",  
0f20: 20 35 2c 20 4a 54 5f 49 4e 4e 45 52 20 7d 2c 0a   5, JT_INNER },.
0f30: 20 20 20 20 7b 20 22 63 72 6f 73 73 22 2c 20 20      { "cross",  
0f40: 20 35 2c 20 4a 54 5f 49 4e 4e 45 52 7c 4a 54 5f   5, JT_INNER|JT_
0f50: 43 52 4f 53 53 20 7d 2c 0a 20 20 7d 3b 0a 20 20  CROSS },.  };.  
0f60: 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 61 70 41 6c  int i, j;.  apAl
0f70: 6c 5b 30 5d 20 3d 20 70 41 3b 0a 20 20 61 70 41  l[0] = pA;.  apA
0f80: 6c 6c 5b 31 5d 20 3d 20 70 42 3b 0a 20 20 61 70  ll[1] = pB;.  ap
0f90: 41 6c 6c 5b 32 5d 20 3d 20 70 43 3b 0a 20 20 66  All[2] = pC;.  f
0fa0: 6f 72 28 69 3d 30 3b 20 69 3c 33 20 26 26 20 61  or(i=0; i<3 && a
0fb0: 70 41 6c 6c 5b 69 5d 3b 20 69 2b 2b 29 7b 0a 20  pAll[i]; i++){. 
0fc0: 20 20 20 70 20 3d 20 61 70 41 6c 6c 5b 69 5d 3b     p = apAll[i];
0fd0: 0a 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c  .    for(j=0; j<
0fe0: 73 69 7a 65 6f 66 28 6b 65 79 77 6f 72 64 73 29  sizeof(keywords)
0ff0: 2f 73 69 7a 65 6f 66 28 6b 65 79 77 6f 72 64 73  /sizeof(keywords
1000: 5b 30 5d 29 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20  [0]); j++){.    
1010: 20 20 69 66 28 20 70 2d 3e 6e 3d 3d 6b 65 79 77    if( p->n==keyw
1020: 6f 72 64 73 5b 6a 5d 2e 6e 43 68 61 72 20 0a 20  ords[j].nChar . 
1030: 20 20 20 20 20 20 20 20 20 26 26 20 73 71 6c 69           && sqli
1040: 74 65 33 53 74 72 4e 49 43 6d 70 28 28 63 68 61  te3StrNICmp((cha
1050: 72 2a 29 70 2d 3e 7a 2c 20 6b 65 79 77 6f 72 64  r*)p->z, keyword
1060: 73 5b 6a 5d 2e 7a 4b 65 79 77 6f 72 64 2c 20 70  s[j].zKeyword, p
1070: 2d 3e 6e 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  ->n)==0 ){.     
1080: 20 20 20 6a 6f 69 6e 74 79 70 65 20 7c 3d 20 6b     jointype |= k
1090: 65 79 77 6f 72 64 73 5b 6a 5d 2e 63 6f 64 65 3b  eywords[j].code;
10a0: 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  .        break;.
10b0: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
10c0: 20 20 69 66 28 20 6a 3e 3d 73 69 7a 65 6f 66 28    if( j>=sizeof(
10d0: 6b 65 79 77 6f 72 64 73 29 2f 73 69 7a 65 6f 66  keywords)/sizeof
10e0: 28 6b 65 79 77 6f 72 64 73 5b 30 5d 29 20 29 7b  (keywords[0]) ){
10f0: 0a 20 20 20 20 20 20 6a 6f 69 6e 74 79 70 65 20  .      jointype 
1100: 7c 3d 20 4a 54 5f 45 52 52 4f 52 3b 0a 20 20 20  |= JT_ERROR;.   
1110: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
1120: 20 20 7d 0a 20 20 69 66 28 0a 20 20 20 20 20 28    }.  if(.     (
1130: 6a 6f 69 6e 74 79 70 65 20 26 20 28 4a 54 5f 49  jointype & (JT_I
1140: 4e 4e 45 52 7c 4a 54 5f 4f 55 54 45 52 29 29 3d  NNER|JT_OUTER))=
1150: 3d 28 4a 54 5f 49 4e 4e 45 52 7c 4a 54 5f 4f 55  =(JT_INNER|JT_OU
1160: 54 45 52 29 20 7c 7c 0a 20 20 20 20 20 28 6a 6f  TER) ||.     (jo
1170: 69 6e 74 79 70 65 20 26 20 4a 54 5f 45 52 52 4f  intype & JT_ERRO
1180: 52 29 21 3d 30 0a 20 20 29 7b 0a 20 20 20 20 63  R)!=0.  ){.    c
1190: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 70 31 20  onst char *zSp1 
11a0: 3d 20 22 20 22 3b 0a 20 20 20 20 63 6f 6e 73 74  = " ";.    const
11b0: 20 63 68 61 72 20 2a 7a 53 70 32 20 3d 20 22 20   char *zSp2 = " 
11c0: 22 3b 0a 20 20 20 20 69 66 28 20 70 42 3d 3d 30  ";.    if( pB==0
11d0: 20 29 7b 20 7a 53 70 31 2b 2b 3b 20 7d 0a 20 20   ){ zSp1++; }.  
11e0: 20 20 69 66 28 20 70 43 3d 3d 30 20 29 7b 20 7a    if( pC==0 ){ z
11f0: 53 70 32 2b 2b 3b 20 7d 0a 20 20 20 20 73 71 6c  Sp2++; }.    sql
1200: 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
1210: 72 73 65 2c 20 22 75 6e 6b 6e 6f 77 6e 20 6f 72  rse, "unknown or
1220: 20 75 6e 73 75 70 70 6f 72 74 65 64 20 6a 6f 69   unsupported joi
1230: 6e 20 74 79 70 65 3a 20 22 0a 20 20 20 20 20 20  n type: ".      
1240: 20 22 25 54 25 73 25 54 25 73 25 54 22 2c 20 70   "%T%s%T%s%T", p
1250: 41 2c 20 7a 53 70 31 2c 20 70 42 2c 20 7a 53 70  A, zSp1, pB, zSp
1260: 32 2c 20 70 43 29 3b 0a 20 20 20 20 6a 6f 69 6e  2, pC);.    join
1270: 74 79 70 65 20 3d 20 4a 54 5f 49 4e 4e 45 52 3b  type = JT_INNER;
1280: 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 6a 6f 69  .  }else if( joi
1290: 6e 74 79 70 65 20 26 20 4a 54 5f 52 49 47 48 54  ntype & JT_RIGHT
12a0: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45   ){.    sqlite3E
12b0: 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
12c0: 0a 20 20 20 20 20 20 22 52 49 47 48 54 20 61 6e  .      "RIGHT an
12d0: 64 20 46 55 4c 4c 20 4f 55 54 45 52 20 4a 4f 49  d FULL OUTER JOI
12e0: 4e 73 20 61 72 65 20 6e 6f 74 20 63 75 72 72 65  Ns are not curre
12f0: 6e 74 6c 79 20 73 75 70 70 6f 72 74 65 64 22 29  ntly supported")
1300: 3b 0a 20 20 20 20 6a 6f 69 6e 74 79 70 65 20 3d  ;.    jointype =
1310: 20 4a 54 5f 49 4e 4e 45 52 3b 0a 20 20 7d 0a 20   JT_INNER;.  }. 
1320: 20 72 65 74 75 72 6e 20 6a 6f 69 6e 74 79 70 65   return jointype
1330: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
1340: 6e 20 74 68 65 20 69 6e 64 65 78 20 6f 66 20 61  n the index of a
1350: 20 63 6f 6c 75 6d 6e 20 69 6e 20 61 20 74 61 62   column in a tab
1360: 6c 65 2e 20 20 52 65 74 75 72 6e 20 2d 31 20 69  le.  Return -1 i
1370: 66 20 74 68 65 20 63 6f 6c 75 6d 6e 0a 2a 2a 20  f the column.** 
1380: 69 73 20 6e 6f 74 20 63 6f 6e 74 61 69 6e 65 64  is not contained
1390: 20 69 6e 20 74 68 65 20 74 61 62 6c 65 2e 0a 2a   in the table..*
13a0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 63 6f 6c  /.static int col
13b0: 75 6d 6e 49 6e 64 65 78 28 54 61 62 6c 65 20 2a  umnIndex(Table *
13c0: 70 54 61 62 2c 20 63 6f 6e 73 74 20 63 68 61 72  pTab, const char
13d0: 20 2a 7a 43 6f 6c 29 7b 0a 20 20 69 6e 74 20 69   *zCol){.  int i
13e0: 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70  ;.  for(i=0; i<p
13f0: 54 61 62 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b 29 7b  Tab->nCol; i++){
1400: 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33  .    if( sqlite3
1410: 53 74 72 49 43 6d 70 28 70 54 61 62 2d 3e 61 43  StrICmp(pTab->aC
1420: 6f 6c 5b 69 5d 2e 7a 4e 61 6d 65 2c 20 7a 43 6f  ol[i].zName, zCo
1430: 6c 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 69  l)==0 ) return i
1440: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 2d  ;.  }.  return -
1450: 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20  1;.}../*.** Set 
1460: 74 68 65 20 76 61 6c 75 65 20 6f 66 20 61 20 74  the value of a t
1470: 6f 6b 65 6e 20 74 6f 20 61 20 27 5c 30 30 30 27  oken to a '\000'
1480: 2d 74 65 72 6d 69 6e 61 74 65 64 20 73 74 72 69  -terminated stri
1490: 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ng..*/.static vo
14a0: 69 64 20 73 65 74 54 6f 6b 65 6e 28 54 6f 6b 65  id setToken(Toke
14b0: 6e 20 2a 70 2c 20 63 6f 6e 73 74 20 63 68 61 72  n *p, const char
14c0: 20 2a 7a 29 7b 0a 20 20 70 2d 3e 7a 20 3d 20 28   *z){.  p->z = (
14d0: 75 38 2a 29 7a 3b 0a 20 20 70 2d 3e 6e 20 3d 20  u8*)z;.  p->n = 
14e0: 7a 20 3f 20 73 74 72 6c 65 6e 28 7a 29 20 3a 20  z ? strlen(z) : 
14f0: 30 3b 0a 20 20 70 2d 3e 64 79 6e 20 3d 20 30 3b  0;.  p->dyn = 0;
1500: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68  .}../*.** Set th
1510: 65 20 74 6f 6b 65 6e 20 74 6f 20 74 68 65 20 64  e token to the d
1520: 6f 75 62 6c 65 2d 71 75 6f 74 65 64 20 61 6e 64  ouble-quoted and
1530: 20 65 73 63 61 70 65 64 20 76 65 72 73 69 6f 6e   escaped version
1540: 20 6f 66 20 74 68 65 20 73 74 72 69 6e 67 20 70   of the string p
1550: 6f 69 6e 74 65 64 0a 2a 2a 20 74 6f 20 62 79 20  ointed.** to by 
1560: 7a 2e 20 46 6f 72 20 65 78 61 6d 70 6c 65 3b 0a  z. For example;.
1570: 2a 2a 0a 2a 2a 20 20 20 20 7b 61 22 62 63 7d 20  **.**    {a"bc} 
1580: 20 2d 3e 20 20 7b 22 61 22 22 62 63 22 7d 0a 2a   ->  {"a""bc"}.*
1590: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 65  /.static void se
15a0: 74 51 75 6f 74 65 64 54 6f 6b 65 6e 28 50 61 72  tQuotedToken(Par
15b0: 73 65 20 2a 70 50 61 72 73 65 2c 20 54 6f 6b 65  se *pParse, Toke
15c0: 6e 20 2a 70 2c 20 63 6f 6e 73 74 20 63 68 61 72  n *p, const char
15d0: 20 2a 7a 29 7b 0a 0a 20 20 2f 2a 20 43 68 65 63   *z){..  /* Chec
15e0: 6b 20 69 66 20 74 68 65 20 73 74 72 69 6e 67 20  k if the string 
15f0: 63 6f 6e 74 61 69 6e 73 20 61 6e 79 20 22 20 63  contains any " c
1600: 68 61 72 61 63 74 65 72 73 2e 20 49 66 20 69 74  haracters. If it
1610: 20 64 6f 65 73 2c 20 74 68 65 6e 0a 20 20 2a 2a   does, then.  **
1620: 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 77   this function w
1630: 69 6c 6c 20 6d 61 6c 6c 6f 63 20 73 70 61 63 65  ill malloc space
1640: 20 74 6f 20 63 72 65 61 74 65 20 61 20 71 75 6f   to create a quo
1650: 74 65 64 20 76 65 72 73 69 6f 6e 20 6f 66 0a 20  ted version of. 
1660: 20 2a 2a 20 74 68 65 20 73 74 72 69 6e 67 20 69   ** the string i
1670: 6e 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 73 61  n. Otherwise, sa
1680: 76 65 20 61 20 63 61 6c 6c 20 74 6f 20 73 71 6c  ve a call to sql
1690: 69 74 65 33 4d 50 72 69 6e 74 66 28 29 20 62 79  ite3MPrintf() by
16a0: 0a 20 20 2a 2a 20 6a 75 73 74 20 63 6f 70 79 69  .  ** just copyi
16b0: 6e 67 20 74 68 65 20 70 6f 69 6e 74 65 72 20 74  ng the pointer t
16c0: 6f 20 74 68 65 20 73 74 72 69 6e 67 2e 0a 20 20  o the string..  
16d0: 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  */.  const char 
16e0: 2a 7a 32 20 3d 20 7a 3b 0a 20 20 77 68 69 6c 65  *z2 = z;.  while
16f0: 28 20 2a 7a 32 20 29 7b 0a 20 20 20 20 69 66 28  ( *z2 ){.    if(
1700: 20 2a 7a 32 3d 3d 27 22 27 20 29 20 62 72 65 61   *z2=='"' ) brea
1710: 6b 3b 0a 20 20 20 20 7a 32 2b 2b 3b 0a 20 20 7d  k;.    z2++;.  }
1720: 0a 0a 20 20 69 66 28 20 2a 7a 32 20 29 7b 0a 20  ..  if( *z2 ){. 
1730: 20 20 20 2f 2a 20 53 74 72 69 6e 67 20 63 6f 6e     /* String con
1740: 74 61 69 6e 73 20 22 20 63 68 61 72 61 63 74 65  tains " characte
1750: 72 73 20 2d 20 63 6f 70 79 20 61 6e 64 20 71 75  rs - copy and qu
1760: 6f 74 65 20 74 68 65 20 73 74 72 69 6e 67 2e 20  ote the string. 
1770: 2a 2f 0a 20 20 20 20 70 2d 3e 7a 20 3d 20 28 75  */.    p->z = (u
1780: 38 20 2a 29 73 71 6c 69 74 65 33 4d 50 72 69 6e  8 *)sqlite3MPrin
1790: 74 66 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 22  tf(pParse->db, "
17a0: 5c 22 25 77 5c 22 22 2c 20 7a 29 3b 0a 20 20 20  \"%w\"", z);.   
17b0: 20 69 66 28 20 70 2d 3e 7a 20 29 7b 0a 20 20 20   if( p->z ){.   
17c0: 20 20 20 70 2d 3e 6e 20 3d 20 73 74 72 6c 65 6e     p->n = strlen
17d0: 28 28 63 68 61 72 20 2a 29 70 2d 3e 7a 29 3b 0a  ((char *)p->z);.
17e0: 20 20 20 20 20 20 70 2d 3e 64 79 6e 20 3d 20 31        p->dyn = 1
17f0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b  ;.    }.  }else{
1800: 0a 20 20 20 20 2f 2a 20 53 74 72 69 6e 67 20 63  .    /* String c
1810: 6f 6e 74 61 69 6e 73 20 6e 6f 20 22 20 63 68 61  ontains no " cha
1820: 72 61 63 74 65 72 73 20 2d 20 63 6f 70 79 20 74  racters - copy t
1830: 68 65 20 70 6f 69 6e 74 65 72 2e 20 2a 2f 0a 20  he pointer. */. 
1840: 20 20 20 70 2d 3e 7a 20 3d 20 28 75 38 2a 29 7a     p->z = (u8*)z
1850: 3b 0a 20 20 20 20 70 2d 3e 6e 20 3d 20 28 7a 32  ;.    p->n = (z2
1860: 20 2d 20 7a 29 3b 0a 20 20 20 20 70 2d 3e 64 79   - z);.    p->dy
1870: 6e 20 3d 20 30 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  n = 0;.  }.}../*
1880: 0a 2a 2a 20 43 72 65 61 74 65 20 61 6e 20 65 78  .** Create an ex
1890: 70 72 65 73 73 69 6f 6e 20 6e 6f 64 65 20 66 6f  pression node fo
18a0: 72 20 61 6e 20 69 64 65 6e 74 69 66 69 65 72 20  r an identifier 
18b0: 77 69 74 68 20 74 68 65 20 6e 61 6d 65 20 6f 66  with the name of
18c0: 20 7a 4e 61 6d 65 0a 2a 2f 0a 45 78 70 72 20 2a   zName.*/.Expr *
18d0: 73 71 6c 69 74 65 33 43 72 65 61 74 65 49 64 45  sqlite3CreateIdE
18e0: 78 70 72 28 50 61 72 73 65 20 2a 70 50 61 72 73  xpr(Parse *pPars
18f0: 65 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  e, const char *z
1900: 4e 61 6d 65 29 7b 0a 20 20 54 6f 6b 65 6e 20 64  Name){.  Token d
1910: 75 6d 6d 79 3b 0a 20 20 73 65 74 54 6f 6b 65 6e  ummy;.  setToken
1920: 28 26 64 75 6d 6d 79 2c 20 7a 4e 61 6d 65 29 3b  (&dummy, zName);
1930: 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65  .  return sqlite
1940: 33 50 45 78 70 72 28 70 50 61 72 73 65 2c 20 54  3PExpr(pParse, T
1950: 4b 5f 49 44 2c 20 30 2c 20 30 2c 20 26 64 75 6d  K_ID, 0, 0, &dum
1960: 6d 79 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64  my);.}../*.** Ad
1970: 64 20 61 20 74 65 72 6d 20 74 6f 20 74 68 65 20  d a term to the 
1980: 57 48 45 52 45 20 65 78 70 72 65 73 73 69 6f 6e  WHERE expression
1990: 20 69 6e 20 2a 70 70 45 78 70 72 20 74 68 61 74   in *ppExpr that
19a0: 20 72 65 71 75 69 72 65 73 20 74 68 65 0a 2a 2a   requires the.**
19b0: 20 7a 43 6f 6c 20 63 6f 6c 75 6d 6e 20 74 6f 20   zCol column to 
19c0: 62 65 20 65 71 75 61 6c 20 69 6e 20 74 68 65 20  be equal in the 
19d0: 74 77 6f 20 74 61 62 6c 65 73 20 70 54 61 62 31  two tables pTab1
19e0: 20 61 6e 64 20 70 54 61 62 32 2e 0a 2a 2f 0a 73   and pTab2..*/.s
19f0: 74 61 74 69 63 20 76 6f 69 64 20 61 64 64 57 68  tatic void addWh
1a00: 65 72 65 54 65 72 6d 28 0a 20 20 50 61 72 73 65  ereTerm(.  Parse
1a10: 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20   *pParse,       
1a20: 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63      /* Parsing c
1a30: 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 63 6f 6e 73  ontext */.  cons
1a40: 74 20 63 68 61 72 20 2a 7a 43 6f 6c 2c 20 20 20  t char *zCol,   
1a50: 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20       /* Name of 
1a60: 74 68 65 20 63 6f 6c 75 6d 6e 20 2a 2f 0a 20 20  the column */.  
1a70: 63 6f 6e 73 74 20 54 61 62 6c 65 20 2a 70 54 61  const Table *pTa
1a80: 62 31 2c 20 20 20 20 20 20 2f 2a 20 46 69 72 73  b1,      /* Firs
1a90: 74 20 74 61 62 6c 65 20 2a 2f 0a 20 20 63 6f 6e  t table */.  con
1aa0: 73 74 20 63 68 61 72 20 2a 7a 41 6c 69 61 73 31  st char *zAlias1
1ab0: 2c 20 20 20 20 20 2f 2a 20 41 6c 69 61 73 20 66  ,     /* Alias f
1ac0: 6f 72 20 66 69 72 73 74 20 74 61 62 6c 65 2e 20  or first table. 
1ad0: 20 4d 61 79 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a   May be NULL */.
1ae0: 20 20 63 6f 6e 73 74 20 54 61 62 6c 65 20 2a 70    const Table *p
1af0: 54 61 62 32 2c 20 20 20 20 20 20 2f 2a 20 53 65  Tab2,      /* Se
1b00: 63 6f 6e 64 20 74 61 62 6c 65 20 2a 2f 0a 20 20  cond table */.  
1b10: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 41 6c 69  const char *zAli
1b20: 61 73 32 2c 20 20 20 20 20 2f 2a 20 41 6c 69 61  as2,     /* Alia
1b30: 73 20 66 6f 72 20 73 65 63 6f 6e 64 20 74 61 62  s for second tab
1b40: 6c 65 2e 20 20 4d 61 79 20 62 65 20 4e 55 4c 4c  le.  May be NULL
1b50: 20 2a 2f 0a 20 20 69 6e 74 20 69 52 69 67 68 74   */.  int iRight
1b60: 4a 6f 69 6e 54 61 62 6c 65 2c 20 20 20 20 20 2f  JoinTable,     /
1b70: 2a 20 56 44 42 45 20 63 75 72 73 6f 72 20 66 6f  * VDBE cursor fo
1b80: 72 20 74 68 65 20 72 69 67 68 74 20 74 61 62 6c  r the right tabl
1b90: 65 20 2a 2f 0a 20 20 45 78 70 72 20 2a 2a 70 70  e */.  Expr **pp
1ba0: 45 78 70 72 2c 20 20 20 20 20 20 20 20 20 20 20  Expr,           
1bb0: 2f 2a 20 41 64 64 20 74 68 65 20 65 71 75 61 6c  /* Add the equal
1bc0: 69 74 79 20 74 65 72 6d 20 74 6f 20 74 68 69 73  ity term to this
1bd0: 20 65 78 70 72 65 73 73 69 6f 6e 20 2a 2f 0a 20   expression */. 
1be0: 20 69 6e 74 20 69 73 4f 75 74 65 72 4a 6f 69 6e   int isOuterJoin
1bf0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
1c00: 65 20 69 66 20 64 65 61 6c 69 6e 67 20 77 69 74  e if dealing wit
1c10: 68 20 61 6e 20 4f 55 54 45 52 20 6a 6f 69 6e 20  h an OUTER join 
1c20: 2a 2f 0a 29 7b 0a 20 20 45 78 70 72 20 2a 70 45  */.){.  Expr *pE
1c30: 31 61 2c 20 2a 70 45 31 62 2c 20 2a 70 45 31 63  1a, *pE1b, *pE1c
1c40: 3b 0a 20 20 45 78 70 72 20 2a 70 45 32 61 2c 20  ;.  Expr *pE2a, 
1c50: 2a 70 45 32 62 2c 20 2a 70 45 32 63 3b 0a 20 20  *pE2b, *pE2c;.  
1c60: 45 78 70 72 20 2a 70 45 3b 0a 0a 20 20 70 45 31  Expr *pE;..  pE1
1c70: 61 20 3d 20 73 71 6c 69 74 65 33 43 72 65 61 74  a = sqlite3Creat
1c80: 65 49 64 45 78 70 72 28 70 50 61 72 73 65 2c 20  eIdExpr(pParse, 
1c90: 7a 43 6f 6c 29 3b 0a 20 20 70 45 32 61 20 3d 20  zCol);.  pE2a = 
1ca0: 73 71 6c 69 74 65 33 43 72 65 61 74 65 49 64 45  sqlite3CreateIdE
1cb0: 78 70 72 28 70 50 61 72 73 65 2c 20 7a 43 6f 6c  xpr(pParse, zCol
1cc0: 29 3b 0a 20 20 69 66 28 20 7a 41 6c 69 61 73 31  );.  if( zAlias1
1cd0: 3d 3d 30 20 29 7b 0a 20 20 20 20 7a 41 6c 69 61  ==0 ){.    zAlia
1ce0: 73 31 20 3d 20 70 54 61 62 31 2d 3e 7a 4e 61 6d  s1 = pTab1->zNam
1cf0: 65 3b 0a 20 20 7d 0a 20 20 70 45 31 62 20 3d 20  e;.  }.  pE1b = 
1d00: 73 71 6c 69 74 65 33 43 72 65 61 74 65 49 64 45  sqlite3CreateIdE
1d10: 78 70 72 28 70 50 61 72 73 65 2c 20 7a 41 6c 69  xpr(pParse, zAli
1d20: 61 73 31 29 3b 0a 20 20 69 66 28 20 7a 41 6c 69  as1);.  if( zAli
1d30: 61 73 32 3d 3d 30 20 29 7b 0a 20 20 20 20 7a 41  as2==0 ){.    zA
1d40: 6c 69 61 73 32 20 3d 20 70 54 61 62 32 2d 3e 7a  lias2 = pTab2->z
1d50: 4e 61 6d 65 3b 0a 20 20 7d 0a 20 20 70 45 32 62  Name;.  }.  pE2b
1d60: 20 3d 20 73 71 6c 69 74 65 33 43 72 65 61 74 65   = sqlite3Create
1d70: 49 64 45 78 70 72 28 70 50 61 72 73 65 2c 20 7a  IdExpr(pParse, z
1d80: 41 6c 69 61 73 32 29 3b 0a 20 20 70 45 31 63 20  Alias2);.  pE1c 
1d90: 3d 20 73 71 6c 69 74 65 33 50 45 78 70 72 28 70  = sqlite3PExpr(p
1da0: 50 61 72 73 65 2c 20 54 4b 5f 44 4f 54 2c 20 70  Parse, TK_DOT, p
1db0: 45 31 62 2c 20 70 45 31 61 2c 20 30 29 3b 0a 20  E1b, pE1a, 0);. 
1dc0: 20 70 45 32 63 20 3d 20 73 71 6c 69 74 65 33 50   pE2c = sqlite3P
1dd0: 45 78 70 72 28 70 50 61 72 73 65 2c 20 54 4b 5f  Expr(pParse, TK_
1de0: 44 4f 54 2c 20 70 45 32 62 2c 20 70 45 32 61 2c  DOT, pE2b, pE2a,
1df0: 20 30 29 3b 0a 20 20 70 45 20 3d 20 73 71 6c 69   0);.  pE = sqli
1e00: 74 65 33 50 45 78 70 72 28 70 50 61 72 73 65 2c  te3PExpr(pParse,
1e10: 20 54 4b 5f 45 51 2c 20 70 45 31 63 2c 20 70 45   TK_EQ, pE1c, pE
1e20: 32 63 2c 20 30 29 3b 0a 20 20 69 66 28 20 70 45  2c, 0);.  if( pE
1e30: 20 26 26 20 69 73 4f 75 74 65 72 4a 6f 69 6e 20   && isOuterJoin 
1e40: 29 7b 0a 20 20 20 20 45 78 70 72 53 65 74 50 72  ){.    ExprSetPr
1e50: 6f 70 65 72 74 79 28 70 45 2c 20 45 50 5f 46 72  operty(pE, EP_Fr
1e60: 6f 6d 4a 6f 69 6e 29 3b 0a 20 20 20 20 70 45 2d  omJoin);.    pE-
1e70: 3e 69 52 69 67 68 74 4a 6f 69 6e 54 61 62 6c 65  >iRightJoinTable
1e80: 20 3d 20 69 52 69 67 68 74 4a 6f 69 6e 54 61 62   = iRightJoinTab
1e90: 6c 65 3b 0a 20 20 7d 0a 20 20 2a 70 70 45 78 70  le;.  }.  *ppExp
1ea0: 72 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 41  r = sqlite3ExprA
1eb0: 6e 64 28 70 50 61 72 73 65 2d 3e 64 62 2c 2a 70  nd(pParse->db,*p
1ec0: 70 45 78 70 72 2c 20 70 45 29 3b 0a 7d 0a 0a 2f  pExpr, pE);.}../
1ed0: 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 45 50 5f  *.** Set the EP_
1ee0: 46 72 6f 6d 4a 6f 69 6e 20 70 72 6f 70 65 72 74  FromJoin propert
1ef0: 79 20 6f 6e 20 61 6c 6c 20 74 65 72 6d 73 20 6f  y on all terms o
1f00: 66 20 74 68 65 20 67 69 76 65 6e 20 65 78 70 72  f the given expr
1f10: 65 73 73 69 6f 6e 2e 0a 2a 2a 20 41 6e 64 20 73  ession..** And s
1f20: 65 74 20 74 68 65 20 45 78 70 72 2e 69 52 69 67  et the Expr.iRig
1f30: 68 74 4a 6f 69 6e 54 61 62 6c 65 20 74 6f 20 69  htJoinTable to i
1f40: 54 61 62 6c 65 20 66 6f 72 20 65 76 65 72 79 20  Table for every 
1f50: 74 65 72 6d 20 69 6e 20 74 68 65 0a 2a 2a 20 65  term in the.** e
1f60: 78 70 72 65 73 73 69 6f 6e 2e 0a 2a 2a 0a 2a 2a  xpression..**.**
1f70: 20 54 68 65 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e   The EP_FromJoin
1f80: 20 70 72 6f 70 65 72 74 79 20 69 73 20 75 73 65   property is use
1f90: 64 20 6f 6e 20 74 65 72 6d 73 20 6f 66 20 61 6e  d on terms of an
1fa0: 20 65 78 70 72 65 73 73 69 6f 6e 20 74 6f 20 74   expression to t
1fb0: 65 6c 6c 0a 2a 2a 20 74 68 65 20 4c 45 46 54 20  ell.** the LEFT 
1fc0: 4f 55 54 45 52 20 4a 4f 49 4e 20 70 72 6f 63 65  OUTER JOIN proce
1fd0: 73 73 69 6e 67 20 6c 6f 67 69 63 20 74 68 61 74  ssing logic that
1fe0: 20 74 68 69 73 20 74 65 72 6d 20 69 73 20 70 61   this term is pa
1ff0: 72 74 20 6f 66 20 74 68 65 0a 2a 2a 20 6a 6f 69  rt of the.** joi
2000: 6e 20 72 65 73 74 72 69 63 74 69 6f 6e 20 73 70  n restriction sp
2010: 65 63 69 66 69 65 64 20 69 6e 20 74 68 65 20 4f  ecified in the O
2020: 4e 20 6f 72 20 55 53 49 4e 47 20 63 6c 61 75 73  N or USING claus
2030: 65 20 61 6e 64 20 6e 6f 74 20 61 20 70 61 72 74  e and not a part
2040: 0a 2a 2a 20 6f 66 20 74 68 65 20 6d 6f 72 65 20  .** of the more 
2050: 67 65 6e 65 72 61 6c 20 57 48 45 52 45 20 63 6c  general WHERE cl
2060: 61 75 73 65 2e 20 20 54 68 65 73 65 20 74 65 72  ause.  These ter
2070: 6d 73 20 61 72 65 20 6d 6f 76 65 64 20 6f 76 65  ms are moved ove
2080: 72 20 74 6f 20 74 68 65 0a 2a 2a 20 57 48 45 52  r to the.** WHER
2090: 45 20 63 6c 61 75 73 65 20 64 75 72 69 6e 67 20  E clause during 
20a0: 6a 6f 69 6e 20 70 72 6f 63 65 73 73 69 6e 67 20  join processing 
20b0: 62 75 74 20 77 65 20 6e 65 65 64 20 74 6f 20 72  but we need to r
20c0: 65 6d 65 6d 62 65 72 20 74 68 61 74 20 74 68 65  emember that the
20d0: 79 0a 2a 2a 20 6f 72 69 67 69 6e 61 74 65 64 20  y.** originated 
20e0: 69 6e 20 74 68 65 20 4f 4e 20 6f 72 20 55 53 49  in the ON or USI
20f0: 4e 47 20 63 6c 61 75 73 65 2e 0a 2a 2a 0a 2a 2a  NG clause..**.**
2100: 20 54 68 65 20 45 78 70 72 2e 69 52 69 67 68 74   The Expr.iRight
2110: 4a 6f 69 6e 54 61 62 6c 65 20 74 65 6c 6c 73 20  JoinTable tells 
2120: 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  the WHERE clause
2130: 20 70 72 6f 63 65 73 73 69 6e 67 20 74 68 61 74   processing that
2140: 20 74 68 65 0a 2a 2a 20 65 78 70 72 65 73 73 69   the.** expressi
2150: 6f 6e 20 64 65 70 65 6e 64 73 20 6f 6e 20 74 61  on depends on ta
2160: 62 6c 65 20 69 52 69 67 68 74 4a 6f 69 6e 54 61  ble iRightJoinTa
2170: 62 6c 65 20 65 76 65 6e 20 69 66 20 74 68 61 74  ble even if that
2180: 20 74 61 62 6c 65 20 69 73 20 6e 6f 74 0a 2a 2a   table is not.**
2190: 20 65 78 70 6c 69 63 69 74 6c 79 20 6d 65 6e 74   explicitly ment
21a0: 69 6f 6e 65 64 20 69 6e 20 74 68 65 20 65 78 70  ioned in the exp
21b0: 72 65 73 73 69 6f 6e 2e 20 20 54 68 61 74 20 69  ression.  That i
21c0: 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 73 20 6e 65  nformation is ne
21d0: 65 64 65 64 0a 2a 2a 20 66 6f 72 20 63 61 73 65  eded.** for case
21e0: 73 20 6c 69 6b 65 20 74 68 69 73 3a 0a 2a 2a 0a  s like this:.**.
21f0: 2a 2a 20 20 20 20 53 45 4c 45 43 54 20 2a 20 46  **    SELECT * F
2200: 52 4f 4d 20 74 31 20 4c 45 46 54 20 4a 4f 49 4e  ROM t1 LEFT JOIN
2210: 20 74 32 20 4f 4e 20 74 31 2e 61 3d 74 32 2e 62   t2 ON t1.a=t2.b
2220: 20 41 4e 44 20 74 31 2e 78 3d 35 0a 2a 2a 0a 2a   AND t1.x=5.**.*
2230: 2a 20 54 68 65 20 77 68 65 72 65 20 63 6c 61 75  * The where clau
2240: 73 65 20 6e 65 65 64 73 20 74 6f 20 64 65 66 65  se needs to defe
2250: 72 20 74 68 65 20 68 61 6e 64 6c 69 6e 67 20 6f  r the handling o
2260: 66 20 74 68 65 20 74 31 2e 78 3d 35 0a 2a 2a 20  f the t1.x=5.** 
2270: 74 65 72 6d 20 75 6e 74 69 6c 20 61 66 74 65 72  term until after
2280: 20 74 68 65 20 74 32 20 6c 6f 6f 70 20 6f 66 20   the t2 loop of 
2290: 74 68 65 20 6a 6f 69 6e 2e 20 20 49 6e 20 74 68  the join.  In th
22a0: 61 74 20 77 61 79 2c 20 61 0a 2a 2a 20 4e 55 4c  at way, a.** NUL
22b0: 4c 20 74 32 20 72 6f 77 20 77 69 6c 6c 20 62 65  L t2 row will be
22c0: 20 69 6e 73 65 72 74 65 64 20 77 68 65 6e 65 76   inserted whenev
22d0: 65 72 20 74 31 2e 78 21 3d 35 2e 20 20 49 66 20  er t1.x!=5.  If 
22e0: 77 65 20 64 6f 20 6e 6f 74 0a 2a 2a 20 64 65 66  we do not.** def
22f0: 65 72 20 74 68 65 20 68 61 6e 64 6c 69 6e 67 20  er the handling 
2300: 6f 66 20 74 31 2e 78 3d 35 2c 20 69 74 20 77 69  of t1.x=5, it wi
2310: 6c 6c 20 62 65 20 70 72 6f 63 65 73 73 65 64 20  ll be processed 
2320: 69 6d 6d 65 64 69 61 74 65 6c 79 0a 2a 2a 20 61  immediately.** a
2330: 66 74 65 72 20 74 68 65 20 74 31 20 6c 6f 6f 70  fter the t1 loop
2340: 20 61 6e 64 20 72 6f 77 73 20 77 69 74 68 20 74   and rows with t
2350: 31 2e 78 21 3d 35 20 77 69 6c 6c 20 6e 65 76 65  1.x!=5 will neve
2360: 72 20 61 70 70 65 61 72 20 69 6e 0a 2a 2a 20 74  r appear in.** t
2370: 68 65 20 6f 75 74 70 75 74 2c 20 77 68 69 63 68  he output, which
2380: 20 69 73 20 69 6e 63 6f 72 72 65 63 74 2e 0a 2a   is incorrect..*
2390: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 65  /.static void se
23a0: 74 4a 6f 69 6e 45 78 70 72 28 45 78 70 72 20 2a  tJoinExpr(Expr *
23b0: 70 2c 20 69 6e 74 20 69 54 61 62 6c 65 29 7b 0a  p, int iTable){.
23c0: 20 20 77 68 69 6c 65 28 20 70 20 29 7b 0a 20 20    while( p ){.  
23d0: 20 20 45 78 70 72 53 65 74 50 72 6f 70 65 72 74    ExprSetPropert
23e0: 79 28 70 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e  y(p, EP_FromJoin
23f0: 29 3b 0a 20 20 20 20 70 2d 3e 69 52 69 67 68 74  );.    p->iRight
2400: 4a 6f 69 6e 54 61 62 6c 65 20 3d 20 69 54 61 62  JoinTable = iTab
2410: 6c 65 3b 0a 20 20 20 20 73 65 74 4a 6f 69 6e 45  le;.    setJoinE
2420: 78 70 72 28 70 2d 3e 70 4c 65 66 74 2c 20 69 54  xpr(p->pLeft, iT
2430: 61 62 6c 65 29 3b 0a 20 20 20 20 70 20 3d 20 70  able);.    p = p
2440: 2d 3e 70 52 69 67 68 74 3b 0a 20 20 7d 20 0a 7d  ->pRight;.  } .}
2450: 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ../*.** This rou
2460: 74 69 6e 65 20 70 72 6f 63 65 73 73 65 73 20 74  tine processes t
2470: 68 65 20 6a 6f 69 6e 20 69 6e 66 6f 72 6d 61 74  he join informat
2480: 69 6f 6e 20 66 6f 72 20 61 20 53 45 4c 45 43 54  ion for a SELECT
2490: 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 20 4f   statement..** O
24a0: 4e 20 61 6e 64 20 55 53 49 4e 47 20 63 6c 61 75  N and USING clau
24b0: 73 65 73 20 61 72 65 20 63 6f 6e 76 65 72 74 65  ses are converte
24c0: 64 20 69 6e 74 6f 20 65 78 74 72 61 20 74 65 72  d into extra ter
24d0: 6d 73 20 6f 66 20 74 68 65 20 57 48 45 52 45 20  ms of the WHERE 
24e0: 63 6c 61 75 73 65 2e 0a 2a 2a 20 4e 41 54 55 52  clause..** NATUR
24f0: 41 4c 20 6a 6f 69 6e 73 20 61 6c 73 6f 20 63 72  AL joins also cr
2500: 65 61 74 65 20 65 78 74 72 61 20 57 48 45 52 45  eate extra WHERE
2510: 20 63 6c 61 75 73 65 20 74 65 72 6d 73 2e 0a 2a   clause terms..*
2520: 2a 0a 2a 2a 20 54 68 65 20 74 65 72 6d 73 20 6f  *.** The terms o
2530: 66 20 61 20 46 52 4f 4d 20 63 6c 61 75 73 65 20  f a FROM clause 
2540: 61 72 65 20 63 6f 6e 74 61 69 6e 65 64 20 69 6e  are contained in
2550: 20 74 68 65 20 53 65 6c 65 63 74 2e 70 53 72 63   the Select.pSrc
2560: 20 73 74 72 75 63 74 75 72 65 2e 0a 2a 2a 20 54   structure..** T
2570: 68 65 20 6c 65 66 74 20 6d 6f 73 74 20 74 61 62  he left most tab
2580: 6c 65 20 69 73 20 74 68 65 20 66 69 72 73 74 20  le is the first 
2590: 65 6e 74 72 79 20 69 6e 20 53 65 6c 65 63 74 2e  entry in Select.
25a0: 70 53 72 63 2e 20 20 54 68 65 20 72 69 67 68 74  pSrc.  The right
25b0: 2d 6d 6f 73 74 0a 2a 2a 20 74 61 62 6c 65 20 69  -most.** table i
25c0: 73 20 74 68 65 20 6c 61 73 74 20 65 6e 74 72 79  s the last entry
25d0: 2e 20 20 54 68 65 20 6a 6f 69 6e 20 6f 70 65 72  .  The join oper
25e0: 61 74 6f 72 20 69 73 20 68 65 6c 64 20 69 6e 20  ator is held in 
25f0: 74 68 65 20 65 6e 74 72 79 20 74 6f 0a 2a 2a 20  the entry to.** 
2600: 74 68 65 20 6c 65 66 74 2e 20 20 54 68 75 73 20  the left.  Thus 
2610: 65 6e 74 72 79 20 30 20 63 6f 6e 74 61 69 6e 73  entry 0 contains
2620: 20 74 68 65 20 6a 6f 69 6e 20 6f 70 65 72 61 74   the join operat
2630: 6f 72 20 66 6f 72 20 74 68 65 20 6a 6f 69 6e 20  or for the join 
2640: 62 65 74 77 65 65 6e 0a 2a 2a 20 65 6e 74 72 69  between.** entri
2650: 65 73 20 30 20 61 6e 64 20 31 2e 20 20 41 6e 79  es 0 and 1.  Any
2660: 20 4f 4e 20 6f 72 20 55 53 49 4e 47 20 63 6c 61   ON or USING cla
2670: 75 73 65 73 20 61 73 73 6f 63 69 61 74 65 64 20  uses associated 
2680: 77 69 74 68 20 74 68 65 20 6a 6f 69 6e 20 61 72  with the join ar
2690: 65 0a 2a 2a 20 61 6c 73 6f 20 61 74 74 61 63 68  e.** also attach
26a0: 65 64 20 74 6f 20 74 68 65 20 6c 65 66 74 20 65  ed to the left e
26b0: 6e 74 72 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  ntry..**.** This
26c0: 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73   routine returns
26d0: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 65   the number of e
26e0: 72 72 6f 72 73 20 65 6e 63 6f 75 6e 74 65 72 65  rrors encountere
26f0: 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  d..*/.static int
2700: 20 73 71 6c 69 74 65 50 72 6f 63 65 73 73 4a 6f   sqliteProcessJo
2710: 69 6e 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  in(Parse *pParse
2720: 2c 20 53 65 6c 65 63 74 20 2a 70 29 7b 0a 20 20  , Select *p){.  
2730: 53 72 63 4c 69 73 74 20 2a 70 53 72 63 3b 20 20  SrcList *pSrc;  
2740: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2750: 2f 2a 20 41 6c 6c 20 74 61 62 6c 65 73 20 69 6e  /* All tables in
2760: 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65   the FROM clause
2770: 20 2a 2f 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 20   */.  int i, j; 
2780: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2790: 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f        /* Loop co
27a0: 75 6e 74 65 72 73 20 2a 2f 0a 20 20 73 74 72 75  unters */.  stru
27b0: 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20  ct SrcList_item 
27c0: 2a 70 4c 65 66 74 3b 20 20 20 20 20 2f 2a 20 4c  *pLeft;     /* L
27d0: 65 66 74 20 74 61 62 6c 65 20 62 65 69 6e 67 20  eft table being 
27e0: 6a 6f 69 6e 65 64 20 2a 2f 0a 20 20 73 74 72 75  joined */.  stru
27f0: 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20  ct SrcList_item 
2800: 2a 70 52 69 67 68 74 3b 20 20 20 20 2f 2a 20 52  *pRight;    /* R
2810: 69 67 68 74 20 74 61 62 6c 65 20 62 65 69 6e 67  ight table being
2820: 20 6a 6f 69 6e 65 64 20 2a 2f 0a 0a 20 20 70 53   joined */..  pS
2830: 72 63 20 3d 20 70 2d 3e 70 53 72 63 3b 0a 20 20  rc = p->pSrc;.  
2840: 70 4c 65 66 74 20 3d 20 26 70 53 72 63 2d 3e 61  pLeft = &pSrc->a
2850: 5b 30 5d 3b 0a 20 20 70 52 69 67 68 74 20 3d 20  [0];.  pRight = 
2860: 26 70 4c 65 66 74 5b 31 5d 3b 0a 20 20 66 6f 72  &pLeft[1];.  for
2870: 28 69 3d 30 3b 20 69 3c 70 53 72 63 2d 3e 6e 53  (i=0; i<pSrc->nS
2880: 72 63 2d 31 3b 20 69 2b 2b 2c 20 70 52 69 67 68  rc-1; i++, pRigh
2890: 74 2b 2b 2c 20 70 4c 65 66 74 2b 2b 29 7b 0a 20  t++, pLeft++){. 
28a0: 20 20 20 54 61 62 6c 65 20 2a 70 4c 65 66 74 54     Table *pLeftT
28b0: 61 62 20 3d 20 70 4c 65 66 74 2d 3e 70 54 61 62  ab = pLeft->pTab
28c0: 3b 0a 20 20 20 20 54 61 62 6c 65 20 2a 70 52 69  ;.    Table *pRi
28d0: 67 68 74 54 61 62 20 3d 20 70 52 69 67 68 74 2d  ghtTab = pRight-
28e0: 3e 70 54 61 62 3b 0a 20 20 20 20 69 6e 74 20 69  >pTab;.    int i
28f0: 73 4f 75 74 65 72 3b 0a 0a 20 20 20 20 69 66 28  sOuter;..    if(
2900: 20 70 4c 65 66 74 54 61 62 3d 3d 30 20 7c 7c 20   pLeftTab==0 || 
2910: 70 52 69 67 68 74 54 61 62 3d 3d 30 20 29 20 63  pRightTab==0 ) c
2920: 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69 73 4f  ontinue;.    isO
2930: 75 74 65 72 20 3d 20 28 70 52 69 67 68 74 2d 3e  uter = (pRight->
2940: 6a 6f 69 6e 74 79 70 65 20 26 20 4a 54 5f 4f 55  jointype & JT_OU
2950: 54 45 52 29 21 3d 30 3b 0a 0a 20 20 20 20 2f 2a  TER)!=0;..    /*
2960: 20 57 68 65 6e 20 74 68 65 20 4e 41 54 55 52 41   When the NATURA
2970: 4c 20 6b 65 79 77 6f 72 64 20 69 73 20 70 72 65  L keyword is pre
2980: 73 65 6e 74 2c 20 61 64 64 20 57 48 45 52 45 20  sent, add WHERE 
2990: 63 6c 61 75 73 65 20 74 65 72 6d 73 20 66 6f 72  clause terms for
29a0: 0a 20 20 20 20 2a 2a 20 65 76 65 72 79 20 63 6f  .    ** every co
29b0: 6c 75 6d 6e 20 74 68 61 74 20 74 68 65 20 74 77  lumn that the tw
29c0: 6f 20 74 61 62 6c 65 73 20 68 61 76 65 20 69 6e  o tables have in
29d0: 20 63 6f 6d 6d 6f 6e 2e 0a 20 20 20 20 2a 2f 0a   common..    */.
29e0: 20 20 20 20 69 66 28 20 70 52 69 67 68 74 2d 3e      if( pRight->
29f0: 6a 6f 69 6e 74 79 70 65 20 26 20 4a 54 5f 4e 41  jointype & JT_NA
2a00: 54 55 52 41 4c 20 29 7b 0a 20 20 20 20 20 20 69  TURAL ){.      i
2a10: 66 28 20 70 52 69 67 68 74 2d 3e 70 4f 6e 20 7c  f( pRight->pOn |
2a20: 7c 20 70 52 69 67 68 74 2d 3e 70 55 73 69 6e 67  | pRight->pUsing
2a30: 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
2a40: 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
2a50: 73 65 2c 20 22 61 20 4e 41 54 55 52 41 4c 20 6a  se, "a NATURAL j
2a60: 6f 69 6e 20 6d 61 79 20 6e 6f 74 20 68 61 76 65  oin may not have
2a70: 20 22 0a 20 20 20 20 20 20 20 20 20 20 20 22 61   ".           "a
2a80: 6e 20 4f 4e 20 6f 72 20 55 53 49 4e 47 20 63 6c  n ON or USING cl
2a90: 61 75 73 65 22 2c 20 30 29 3b 0a 20 20 20 20 20  ause", 0);.     
2aa0: 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20     return 1;.   
2ab0: 20 20 20 7d 0a 20 20 20 20 20 20 66 6f 72 28 6a     }.      for(j
2ac0: 3d 30 3b 20 6a 3c 70 4c 65 66 74 54 61 62 2d 3e  =0; j<pLeftTab->
2ad0: 6e 43 6f 6c 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20  nCol; j++){.    
2ae0: 20 20 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 20      char *zName 
2af0: 3d 20 70 4c 65 66 74 54 61 62 2d 3e 61 43 6f 6c  = pLeftTab->aCol
2b00: 5b 6a 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20  [j].zName;.     
2b10: 20 20 20 69 66 28 20 63 6f 6c 75 6d 6e 49 6e 64     if( columnInd
2b20: 65 78 28 70 52 69 67 68 74 54 61 62 2c 20 7a 4e  ex(pRightTab, zN
2b30: 61 6d 65 29 3e 3d 30 20 29 7b 0a 20 20 20 20 20  ame)>=0 ){.     
2b40: 20 20 20 20 20 61 64 64 57 68 65 72 65 54 65 72       addWhereTer
2b50: 6d 28 70 50 61 72 73 65 2c 20 7a 4e 61 6d 65 2c  m(pParse, zName,
2b60: 20 70 4c 65 66 74 54 61 62 2c 20 70 4c 65 66 74   pLeftTab, pLeft
2b70: 2d 3e 7a 41 6c 69 61 73 2c 20 0a 20 20 20 20 20  ->zAlias, .     
2b80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b90: 20 20 20 20 20 20 20 20 20 70 52 69 67 68 74 54           pRightT
2ba0: 61 62 2c 20 70 52 69 67 68 74 2d 3e 7a 41 6c 69  ab, pRight->zAli
2bb0: 61 73 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  as,.            
2bc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2bd0: 20 20 70 52 69 67 68 74 2d 3e 69 43 75 72 73 6f    pRight->iCurso
2be0: 72 2c 20 26 70 2d 3e 70 57 68 65 72 65 2c 20 69  r, &p->pWhere, i
2bf0: 73 4f 75 74 65 72 29 3b 0a 20 20 20 20 20 20 20  sOuter);.       
2c00: 20 20 20 0a 20 20 20 20 20 20 20 20 7d 0a 20 20     .        }.  
2c10: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20      }.    }..   
2c20: 20 2f 2a 20 44 69 73 61 6c 6c 6f 77 20 62 6f 74   /* Disallow bot
2c30: 68 20 4f 4e 20 61 6e 64 20 55 53 49 4e 47 20 63  h ON and USING c
2c40: 6c 61 75 73 65 73 20 69 6e 20 74 68 65 20 73 61  lauses in the sa
2c50: 6d 65 20 6a 6f 69 6e 0a 20 20 20 20 2a 2f 0a 20  me join.    */. 
2c60: 20 20 20 69 66 28 20 70 52 69 67 68 74 2d 3e 70     if( pRight->p
2c70: 4f 6e 20 26 26 20 70 52 69 67 68 74 2d 3e 70 55  On && pRight->pU
2c80: 73 69 6e 67 20 29 7b 0a 20 20 20 20 20 20 73 71  sing ){.      sq
2c90: 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
2ca0: 61 72 73 65 2c 20 22 63 61 6e 6e 6f 74 20 68 61  arse, "cannot ha
2cb0: 76 65 20 62 6f 74 68 20 4f 4e 20 61 6e 64 20 55  ve both ON and U
2cc0: 53 49 4e 47 20 22 0a 20 20 20 20 20 20 20 20 22  SING ".        "
2cd0: 63 6c 61 75 73 65 73 20 69 6e 20 74 68 65 20 73  clauses in the s
2ce0: 61 6d 65 20 6a 6f 69 6e 22 29 3b 0a 20 20 20 20  ame join");.    
2cf0: 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20    return 1;.    
2d00: 7d 0a 0a 20 20 20 20 2f 2a 20 41 64 64 20 74 68  }..    /* Add th
2d10: 65 20 4f 4e 20 63 6c 61 75 73 65 20 74 6f 20 74  e ON clause to t
2d20: 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 57 48  he end of the WH
2d30: 45 52 45 20 63 6c 61 75 73 65 2c 20 63 6f 6e 6e  ERE clause, conn
2d40: 65 63 74 65 64 20 62 79 0a 20 20 20 20 2a 2a 20  ected by.    ** 
2d50: 61 6e 20 41 4e 44 20 6f 70 65 72 61 74 6f 72 2e  an AND operator.
2d60: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
2d70: 70 52 69 67 68 74 2d 3e 70 4f 6e 20 29 7b 0a 20  pRight->pOn ){. 
2d80: 20 20 20 20 20 69 66 28 20 69 73 4f 75 74 65 72       if( isOuter
2d90: 20 29 20 73 65 74 4a 6f 69 6e 45 78 70 72 28 70   ) setJoinExpr(p
2da0: 52 69 67 68 74 2d 3e 70 4f 6e 2c 20 70 52 69 67  Right->pOn, pRig
2db0: 68 74 2d 3e 69 43 75 72 73 6f 72 29 3b 0a 20 20  ht->iCursor);.  
2dc0: 20 20 20 20 70 2d 3e 70 57 68 65 72 65 20 3d 20      p->pWhere = 
2dd0: 73 71 6c 69 74 65 33 45 78 70 72 41 6e 64 28 70  sqlite3ExprAnd(p
2de0: 50 61 72 73 65 2d 3e 64 62 2c 20 70 2d 3e 70 57  Parse->db, p->pW
2df0: 68 65 72 65 2c 20 70 52 69 67 68 74 2d 3e 70 4f  here, pRight->pO
2e00: 6e 29 3b 0a 20 20 20 20 20 20 70 52 69 67 68 74  n);.      pRight
2e10: 2d 3e 70 4f 6e 20 3d 20 30 3b 0a 20 20 20 20 7d  ->pOn = 0;.    }
2e20: 0a 0a 20 20 20 20 2f 2a 20 43 72 65 61 74 65 20  ..    /* Create 
2e30: 65 78 74 72 61 20 74 65 72 6d 73 20 6f 6e 20 74  extra terms on t
2e40: 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  he WHERE clause 
2e50: 66 6f 72 20 65 61 63 68 20 63 6f 6c 75 6d 6e 20  for each column 
2e60: 6e 61 6d 65 64 0a 20 20 20 20 2a 2a 20 69 6e 20  named.    ** in 
2e70: 74 68 65 20 55 53 49 4e 47 20 63 6c 61 75 73 65  the USING clause
2e80: 2e 20 20 45 78 61 6d 70 6c 65 3a 20 49 66 20 74  .  Example: If t
2e90: 68 65 20 74 77 6f 20 74 61 62 6c 65 73 20 74 6f  he two tables to
2ea0: 20 62 65 20 6a 6f 69 6e 65 64 20 61 72 65 20 0a   be joined are .
2eb0: 20 20 20 20 2a 2a 20 41 20 61 6e 64 20 42 20 61      ** A and B a
2ec0: 6e 64 20 74 68 65 20 55 53 49 4e 47 20 63 6c 61  nd the USING cla
2ed0: 75 73 65 20 6e 61 6d 65 73 20 58 2c 20 59 2c 20  use names X, Y, 
2ee0: 61 6e 64 20 5a 2c 20 74 68 65 6e 20 61 64 64 20  and Z, then add 
2ef0: 74 68 69 73 0a 20 20 20 20 2a 2a 20 74 6f 20 74  this.    ** to t
2f00: 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 3a  he WHERE clause:
2f10: 20 20 20 20 41 2e 58 3d 42 2e 58 20 41 4e 44 20      A.X=B.X AND 
2f20: 41 2e 59 3d 42 2e 59 20 41 4e 44 20 41 2e 5a 3d  A.Y=B.Y AND A.Z=
2f30: 42 2e 5a 0a 20 20 20 20 2a 2a 20 52 65 70 6f 72  B.Z.    ** Repor
2f40: 74 20 61 6e 20 65 72 72 6f 72 20 69 66 20 61 6e  t an error if an
2f50: 79 20 63 6f 6c 75 6d 6e 20 6d 65 6e 74 69 6f 6e  y column mention
2f60: 65 64 20 69 6e 20 74 68 65 20 55 53 49 4e 47 20  ed in the USING 
2f70: 63 6c 61 75 73 65 20 69 73 0a 20 20 20 20 2a 2a  clause is.    **
2f80: 20 6e 6f 74 20 63 6f 6e 74 61 69 6e 65 64 20 69   not contained i
2f90: 6e 20 62 6f 74 68 20 74 61 62 6c 65 73 20 74 6f  n both tables to
2fa0: 20 62 65 20 6a 6f 69 6e 65 64 2e 0a 20 20 20 20   be joined..    
2fb0: 2a 2f 0a 20 20 20 20 69 66 28 20 70 52 69 67 68  */.    if( pRigh
2fc0: 74 2d 3e 70 55 73 69 6e 67 20 29 7b 0a 20 20 20  t->pUsing ){.   
2fd0: 20 20 20 49 64 4c 69 73 74 20 2a 70 4c 69 73 74     IdList *pList
2fe0: 20 3d 20 70 52 69 67 68 74 2d 3e 70 55 73 69 6e   = pRight->pUsin
2ff0: 67 3b 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d 30  g;.      for(j=0
3000: 3b 20 6a 3c 70 4c 69 73 74 2d 3e 6e 49 64 3b 20  ; j<pList->nId; 
3010: 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 63 68  j++){.        ch
3020: 61 72 20 2a 7a 4e 61 6d 65 20 3d 20 70 4c 69 73  ar *zName = pLis
3030: 74 2d 3e 61 5b 6a 5d 2e 7a 4e 61 6d 65 3b 0a 20  t->a[j].zName;. 
3040: 20 20 20 20 20 20 20 69 66 28 20 63 6f 6c 75 6d         if( colum
3050: 6e 49 6e 64 65 78 28 70 4c 65 66 74 54 61 62 2c  nIndex(pLeftTab,
3060: 20 7a 4e 61 6d 65 29 3c 30 20 7c 7c 20 63 6f 6c   zName)<0 || col
3070: 75 6d 6e 49 6e 64 65 78 28 70 52 69 67 68 74 54  umnIndex(pRightT
3080: 61 62 2c 20 7a 4e 61 6d 65 29 3c 30 20 29 7b 0a  ab, zName)<0 ){.
3090: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
30a0: 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
30b0: 2c 20 22 63 61 6e 6e 6f 74 20 6a 6f 69 6e 20 75  , "cannot join u
30c0: 73 69 6e 67 20 63 6f 6c 75 6d 6e 20 25 73 20 2d  sing column %s -
30d0: 20 63 6f 6c 75 6d 6e 20 22 0a 20 20 20 20 20 20   column ".      
30e0: 20 20 20 20 20 20 22 6e 6f 74 20 70 72 65 73 65        "not prese
30f0: 6e 74 20 69 6e 20 62 6f 74 68 20 74 61 62 6c 65  nt in both table
3100: 73 22 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  s", zName);.    
3110: 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a        return 1;.
3120: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
3130: 20 20 61 64 64 57 68 65 72 65 54 65 72 6d 28 70    addWhereTerm(p
3140: 50 61 72 73 65 2c 20 7a 4e 61 6d 65 2c 20 70 4c  Parse, zName, pL
3150: 65 66 74 54 61 62 2c 20 70 4c 65 66 74 2d 3e 7a  eftTab, pLeft->z
3160: 41 6c 69 61 73 2c 20 0a 20 20 20 20 20 20 20 20  Alias, .        
3170: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3180: 20 20 20 20 70 52 69 67 68 74 54 61 62 2c 20 70      pRightTab, p
3190: 52 69 67 68 74 2d 3e 7a 41 6c 69 61 73 2c 0a 20  Right->zAlias,. 
31a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31b0: 20 20 20 20 20 20 20 20 20 20 20 70 52 69 67 68             pRigh
31c0: 74 2d 3e 69 43 75 72 73 6f 72 2c 20 26 70 2d 3e  t->iCursor, &p->
31d0: 70 57 68 65 72 65 2c 20 69 73 4f 75 74 65 72 29  pWhere, isOuter)
31e0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
31f0: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a    }.  return 0;.
3200: 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 73 65 72 74 20  }../*.** Insert 
3210: 63 6f 64 65 20 69 6e 74 6f 20 22 76 22 20 74 68  code into "v" th
3220: 61 74 20 77 69 6c 6c 20 70 75 73 68 20 74 68 65  at will push the
3230: 20 72 65 63 6f 72 64 20 6f 6e 20 74 68 65 20 74   record on the t
3240: 6f 70 20 6f 66 20 74 68 65 0a 2a 2a 20 73 74 61  op of the.** sta
3250: 63 6b 20 69 6e 74 6f 20 74 68 65 20 73 6f 72 74  ck into the sort
3260: 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  er..*/.static vo
3270: 69 64 20 70 75 73 68 4f 6e 74 6f 53 6f 72 74 65  id pushOntoSorte
3280: 72 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  r(.  Parse *pPar
3290: 73 65 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 50  se,         /* P
32a0: 61 72 73 65 72 20 63 6f 6e 74 65 78 74 20 2a 2f  arser context */
32b0: 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4f 72  .  ExprList *pOr
32c0: 64 65 72 42 79 2c 20 20 20 20 2f 2a 20 54 68 65  derBy,    /* The
32d0: 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65   ORDER BY clause
32e0: 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 53   */.  Select *pS
32f0: 65 6c 65 63 74 2c 20 20 20 20 20 20 20 2f 2a 20  elect,       /* 
3300: 54 68 65 20 77 68 6f 6c 65 20 53 45 4c 45 43 54  The whole SELECT
3310: 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20   statement */.  
3320: 69 6e 74 20 72 65 67 44 61 74 61 20 20 20 20 20  int regData     
3330: 20 20 20 20 20 20 20 2f 2a 20 52 65 67 69 73 74         /* Regist
3340: 65 72 20 68 6f 6c 64 69 6e 67 20 64 61 74 61 20  er holding data 
3350: 74 6f 20 62 65 20 73 6f 72 74 65 64 20 2a 2f 0a  to be sorted */.
3360: 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70  ){.  Vdbe *v = p
3370: 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20  Parse->pVdbe;.  
3380: 69 6e 74 20 6e 45 78 70 72 20 3d 20 70 4f 72 64  int nExpr = pOrd
3390: 65 72 42 79 2d 3e 6e 45 78 70 72 3b 0a 20 20 69  erBy->nExpr;.  i
33a0: 6e 74 20 72 65 67 42 61 73 65 20 3d 20 73 71 6c  nt regBase = sql
33b0: 69 74 65 33 47 65 74 54 65 6d 70 52 61 6e 67 65  ite3GetTempRange
33c0: 28 70 50 61 72 73 65 2c 20 6e 45 78 70 72 2b 32  (pParse, nExpr+2
33d0: 29 3b 0a 20 20 69 6e 74 20 72 65 67 52 65 63 6f  );.  int regReco
33e0: 72 64 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54  rd = sqlite3GetT
33f0: 65 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a  empReg(pParse);.
3400: 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64    sqlite3ExprCod
3410: 65 45 78 70 72 4c 69 73 74 28 70 50 61 72 73 65  eExprList(pParse
3420: 2c 20 70 4f 72 64 65 72 42 79 2c 20 72 65 67 42  , pOrderBy, regB
3430: 61 73 65 2c 20 30 29 3b 0a 20 20 73 71 6c 69 74  ase, 0);.  sqlit
3440: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
3450: 4f 50 5f 53 65 71 75 65 6e 63 65 2c 20 70 4f 72  OP_Sequence, pOr
3460: 64 65 72 42 79 2d 3e 69 45 43 75 72 73 6f 72 2c  derBy->iECursor,
3470: 20 72 65 67 42 61 73 65 2b 6e 45 78 70 72 29 3b   regBase+nExpr);
3480: 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f  .  sqlite3ExprCo
3490: 64 65 4d 6f 76 65 28 70 50 61 72 73 65 2c 20 72  deMove(pParse, r
34a0: 65 67 44 61 74 61 2c 20 72 65 67 42 61 73 65 2b  egData, regBase+
34b0: 6e 45 78 70 72 2b 31 2c 20 31 29 3b 0a 20 20 73  nExpr+1, 1);.  s
34c0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
34d0: 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72  (v, OP_MakeRecor
34e0: 64 2c 20 72 65 67 42 61 73 65 2c 20 6e 45 78 70  d, regBase, nExp
34f0: 72 20 2b 20 32 2c 20 72 65 67 52 65 63 6f 72 64  r + 2, regRecord
3500: 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  );.  sqlite3Vdbe
3510: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 64 78  AddOp2(v, OP_Idx
3520: 49 6e 73 65 72 74 2c 20 70 4f 72 64 65 72 42 79  Insert, pOrderBy
3530: 2d 3e 69 45 43 75 72 73 6f 72 2c 20 72 65 67 52  ->iECursor, regR
3540: 65 63 6f 72 64 29 3b 0a 20 20 73 71 6c 69 74 65  ecord);.  sqlite
3550: 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28  3ReleaseTempReg(
3560: 70 50 61 72 73 65 2c 20 72 65 67 52 65 63 6f 72  pParse, regRecor
3570: 64 29 3b 0a 20 20 73 71 6c 69 74 65 33 52 65 6c  d);.  sqlite3Rel
3580: 65 61 73 65 54 65 6d 70 52 61 6e 67 65 28 70 50  easeTempRange(pP
3590: 61 72 73 65 2c 20 72 65 67 42 61 73 65 2c 20 6e  arse, regBase, n
35a0: 45 78 70 72 2b 32 29 3b 0a 20 20 69 66 28 20 70  Expr+2);.  if( p
35b0: 53 65 6c 65 63 74 2d 3e 69 4c 69 6d 69 74 20 29  Select->iLimit )
35c0: 7b 0a 20 20 20 20 69 6e 74 20 61 64 64 72 31 2c  {.    int addr1,
35d0: 20 61 64 64 72 32 3b 0a 20 20 20 20 69 6e 74 20   addr2;.    int 
35e0: 69 4c 69 6d 69 74 3b 0a 20 20 20 20 69 66 28 20  iLimit;.    if( 
35f0: 70 53 65 6c 65 63 74 2d 3e 70 4f 66 66 73 65 74  pSelect->pOffset
3600: 20 29 7b 0a 20 20 20 20 20 20 69 4c 69 6d 69 74   ){.      iLimit
3610: 20 3d 20 70 53 65 6c 65 63 74 2d 3e 69 4f 66 66   = pSelect->iOff
3620: 73 65 74 2b 31 3b 0a 20 20 20 20 7d 65 6c 73 65  set+1;.    }else
3630: 7b 0a 20 20 20 20 20 20 69 4c 69 6d 69 74 20 3d  {.      iLimit =
3640: 20 70 53 65 6c 65 63 74 2d 3e 69 4c 69 6d 69 74   pSelect->iLimit
3650: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 64 64 72  ;.    }.    addr
3660: 31 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41  1 = sqlite3VdbeA
3670: 64 64 4f 70 31 28 76 2c 20 4f 50 5f 49 66 5a 65  ddOp1(v, OP_IfZe
3680: 72 6f 2c 20 69 4c 69 6d 69 74 29 3b 0a 20 20 20  ro, iLimit);.   
3690: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
36a0: 70 32 28 76 2c 20 4f 50 5f 41 64 64 49 6d 6d 2c  p2(v, OP_AddImm,
36b0: 20 69 4c 69 6d 69 74 2c 20 2d 31 29 3b 0a 20 20   iLimit, -1);.  
36c0: 20 20 61 64 64 72 32 20 3d 20 73 71 6c 69 74 65    addr2 = sqlite
36d0: 33 56 64 62 65 41 64 64 4f 70 30 28 76 2c 20 4f  3VdbeAddOp0(v, O
36e0: 50 5f 47 6f 74 6f 29 3b 0a 20 20 20 20 73 71 6c  P_Goto);.    sql
36f0: 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65  ite3VdbeJumpHere
3700: 28 76 2c 20 61 64 64 72 31 29 3b 0a 20 20 20 20  (v, addr1);.    
3710: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
3720: 31 28 76 2c 20 4f 50 5f 4c 61 73 74 2c 20 70 4f  1(v, OP_Last, pO
3730: 72 64 65 72 42 79 2d 3e 69 45 43 75 72 73 6f 72  rderBy->iECursor
3740: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
3750: 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 44  beAddOp1(v, OP_D
3760: 65 6c 65 74 65 2c 20 70 4f 72 64 65 72 42 79 2d  elete, pOrderBy-
3770: 3e 69 45 43 75 72 73 6f 72 29 3b 0a 20 20 20 20  >iECursor);.    
3780: 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48  sqlite3VdbeJumpH
3790: 65 72 65 28 76 2c 20 61 64 64 72 32 29 3b 0a 20  ere(v, addr2);. 
37a0: 20 20 20 70 53 65 6c 65 63 74 2d 3e 69 4c 69 6d     pSelect->iLim
37b0: 69 74 20 3d 20 30 3b 0a 20 20 7d 0a 7d 0a 0a 2f  it = 0;.  }.}../
37c0: 2a 0a 2a 2a 20 41 64 64 20 63 6f 64 65 20 74 6f  *.** Add code to
37d0: 20 69 6d 70 6c 65 6d 65 6e 74 20 74 68 65 20 4f   implement the O
37e0: 46 46 53 45 54 0a 2a 2f 0a 73 74 61 74 69 63 20  FFSET.*/.static 
37f0: 76 6f 69 64 20 63 6f 64 65 4f 66 66 73 65 74 28  void codeOffset(
3800: 0a 20 20 56 64 62 65 20 2a 76 2c 20 20 20 20 20  .  Vdbe *v,     
3810: 20 20 20 20 20 2f 2a 20 47 65 6e 65 72 61 74 65       /* Generate
3820: 20 63 6f 64 65 20 69 6e 74 6f 20 74 68 69 73 20   code into this 
3830: 56 4d 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a  VM */.  Select *
3840: 70 2c 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65  p,        /* The
3850: 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
3860: 74 20 62 65 69 6e 67 20 63 6f 64 65 64 20 2a 2f  t being coded */
3870: 0a 20 20 69 6e 74 20 69 43 6f 6e 74 69 6e 75 65  .  int iContinue
3880: 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72       /* Jump her
3890: 65 20 74 6f 20 73 6b 69 70 20 74 68 65 20 63 75  e to skip the cu
38a0: 72 72 65 6e 74 20 72 65 63 6f 72 64 20 2a 2f 0a  rrent record */.
38b0: 29 7b 0a 20 20 69 66 28 20 70 2d 3e 69 4f 66 66  ){.  if( p->iOff
38c0: 73 65 74 20 26 26 20 69 43 6f 6e 74 69 6e 75 65  set && iContinue
38d0: 21 3d 30 20 29 7b 0a 20 20 20 20 69 6e 74 20 61  !=0 ){.    int a
38e0: 64 64 72 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  ddr;.    sqlite3
38f0: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
3900: 5f 41 64 64 49 6d 6d 2c 20 70 2d 3e 69 4f 66 66  _AddImm, p->iOff
3910: 73 65 74 2c 20 2d 31 29 3b 0a 20 20 20 20 61 64  set, -1);.    ad
3920: 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  dr = sqlite3Vdbe
3930: 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 49 66 4e  AddOp1(v, OP_IfN
3940: 65 67 2c 20 70 2d 3e 69 4f 66 66 73 65 74 29 3b  eg, p->iOffset);
3950: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
3960: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 74  AddOp2(v, OP_Got
3970: 6f 2c 20 30 2c 20 69 43 6f 6e 74 69 6e 75 65 29  o, 0, iContinue)
3980: 3b 0a 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e  ;.    VdbeCommen
3990: 74 28 28 76 2c 20 22 73 6b 69 70 20 4f 46 46 53  t((v, "skip OFFS
39a0: 45 54 20 72 65 63 6f 72 64 73 22 29 29 3b 0a 20  ET records"));. 
39b0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75     sqlite3VdbeJu
39c0: 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72 29 3b  mpHere(v, addr);
39d0: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64  .  }.}../*.** Ad
39e0: 64 20 63 6f 64 65 20 74 68 61 74 20 77 69 6c 6c  d code that will
39f0: 20 63 68 65 63 6b 20 74 6f 20 6d 61 6b 65 20 73   check to make s
3a00: 75 72 65 20 74 68 65 20 4e 20 72 65 67 69 73 74  ure the N regist
3a10: 65 72 73 20 73 74 61 72 74 69 6e 67 20 61 74 20  ers starting at 
3a20: 69 4d 65 6d 0a 2a 2a 20 66 6f 72 6d 20 61 20 64  iMem.** form a d
3a30: 69 73 74 69 6e 63 74 20 65 6e 74 72 79 2e 20 20  istinct entry.  
3a40: 69 54 61 62 20 69 73 20 61 20 73 6f 72 74 69 6e  iTab is a sortin
3a50: 67 20 69 6e 64 65 78 20 74 68 61 74 20 68 6f 6c  g index that hol
3a60: 64 73 20 70 72 65 76 69 6f 75 73 6c 79 0a 2a 2a  ds previously.**
3a70: 20 73 65 65 6e 20 63 6f 6d 62 69 6e 61 74 69 6f   seen combinatio
3a80: 6e 73 20 6f 66 20 74 68 65 20 4e 20 76 61 6c 75  ns of the N valu
3a90: 65 73 2e 20 20 41 20 6e 65 77 20 65 6e 74 72 79  es.  A new entry
3aa0: 20 69 73 20 6d 61 64 65 20 69 6e 20 69 54 61 62   is made in iTab
3ab0: 0a 2a 2a 20 69 66 20 74 68 65 20 63 75 72 72 65  .** if the curre
3ac0: 6e 74 20 4e 20 76 61 6c 75 65 73 20 61 72 65 20  nt N values are 
3ad0: 6e 65 77 2e 0a 2a 2a 0a 2a 2a 20 41 20 6a 75 6d  new..**.** A jum
3ae0: 70 20 74 6f 20 61 64 64 72 52 65 70 65 61 74 20  p to addrRepeat 
3af0: 69 73 20 6d 61 64 65 20 61 6e 64 20 74 68 65 20  is made and the 
3b00: 4e 2b 31 20 76 61 6c 75 65 73 20 61 72 65 20 70  N+1 values are p
3b10: 6f 70 70 65 64 20 66 72 6f 6d 20 74 68 65 0a 2a  opped from the.*
3b20: 2a 20 73 74 61 63 6b 20 69 66 20 74 68 65 20 74  * stack if the t
3b30: 6f 70 20 4e 20 65 6c 65 6d 65 6e 74 73 20 61 72  op N elements ar
3b40: 65 20 6e 6f 74 20 64 69 73 74 69 6e 63 74 2e 0a  e not distinct..
3b50: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63  */.static void c
3b60: 6f 64 65 44 69 73 74 69 6e 63 74 28 0a 20 20 50  odeDistinct(.  P
3b70: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
3b80: 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 61 6e 64    /* Parsing and
3b90: 20 63 6f 64 65 20 67 65 6e 65 72 61 74 69 6e 67   code generating
3ba0: 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 69 6e   context */.  in
3bb0: 74 20 69 54 61 62 2c 20 20 20 20 20 20 20 20 20  t iTab,         
3bc0: 20 2f 2a 20 41 20 73 6f 72 74 69 6e 67 20 69 6e   /* A sorting in
3bd0: 64 65 78 20 75 73 65 64 20 74 6f 20 74 65 73 74  dex used to test
3be0: 20 66 6f 72 20 64 69 73 74 69 6e 63 74 6e 65 73   for distinctnes
3bf0: 73 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 52  s */.  int addrR
3c00: 65 70 65 61 74 2c 20 20 20 20 2f 2a 20 4a 75 6d  epeat,    /* Jum
3c10: 70 20 74 6f 20 68 65 72 65 20 69 66 20 6e 6f 74  p to here if not
3c20: 20 64 69 73 74 69 6e 63 74 20 2a 2f 0a 20 20 69   distinct */.  i
3c30: 6e 74 20 4e 2c 20 20 20 20 20 20 20 20 20 20 20  nt N,           
3c40: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 65    /* Number of e
3c50: 6c 65 6d 65 6e 74 73 20 2a 2f 0a 20 20 69 6e 74  lements */.  int
3c60: 20 69 4d 65 6d 20 20 20 20 20 20 20 20 20 20 20   iMem           
3c70: 2f 2a 20 46 69 72 73 74 20 65 6c 65 6d 65 6e 74  /* First element
3c80: 20 2a 2f 0a 29 7b 0a 20 20 56 64 62 65 20 2a 76   */.){.  Vdbe *v
3c90: 3b 0a 20 20 69 6e 74 20 72 31 3b 0a 0a 20 20 76  ;.  int r1;..  v
3ca0: 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65   = pParse->pVdbe
3cb0: 3b 0a 20 20 72 31 20 3d 20 73 71 6c 69 74 65 33  ;.  r1 = sqlite3
3cc0: 47 65 74 54 65 6d 70 52 65 67 28 70 50 61 72 73  GetTempReg(pPars
3cd0: 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  e);.  sqlite3Vdb
3ce0: 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4d 61  eAddOp3(v, OP_Ma
3cf0: 6b 65 52 65 63 6f 72 64 2c 20 69 4d 65 6d 2c 20  keRecord, iMem, 
3d00: 4e 2c 20 72 31 29 3b 0a 20 20 73 71 6c 69 74 65  N, r1);.  sqlite
3d10: 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
3d20: 50 5f 46 6f 75 6e 64 2c 20 69 54 61 62 2c 20 61  P_Found, iTab, a
3d30: 64 64 72 52 65 70 65 61 74 2c 20 72 31 29 3b 0a  ddrRepeat, r1);.
3d40: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
3d50: 4f 70 32 28 76 2c 20 4f 50 5f 49 64 78 49 6e 73  Op2(v, OP_IdxIns
3d60: 65 72 74 2c 20 69 54 61 62 2c 20 72 31 29 3b 0a  ert, iTab, r1);.
3d70: 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65    sqlite3Release
3d80: 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20  TempReg(pParse, 
3d90: 72 31 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65  r1);.}../*.** Ge
3da0: 6e 65 72 61 74 65 20 61 6e 20 65 72 72 6f 72 20  nerate an error 
3db0: 6d 65 73 73 61 67 65 20 77 68 65 6e 20 61 20 53  message when a S
3dc0: 45 4c 45 43 54 20 69 73 20 75 73 65 64 20 77 69  ELECT is used wi
3dd0: 74 68 69 6e 20 61 20 73 75 62 65 78 70 72 65 73  thin a subexpres
3de0: 73 69 6f 6e 0a 2a 2a 20 28 65 78 61 6d 70 6c 65  sion.** (example
3df0: 3a 20 20 22 61 20 49 4e 20 28 53 45 4c 45 43 54  :  "a IN (SELECT
3e00: 20 2a 20 46 52 4f 4d 20 74 61 62 6c 65 29 22 29   * FROM table)")
3e10: 20 62 75 74 20 69 74 20 68 61 73 20 6d 6f 72 65   but it has more
3e20: 20 74 68 61 6e 20 31 20 72 65 73 75 6c 74 0a 2a   than 1 result.*
3e30: 2a 20 63 6f 6c 75 6d 6e 2e 20 20 57 65 20 64 6f  * column.  We do
3e40: 20 74 68 69 73 20 69 6e 20 61 20 73 75 62 72 6f   this in a subro
3e50: 75 74 69 6e 65 20 62 65 63 61 75 73 65 20 74 68  utine because th
3e60: 65 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 69  e error occurs i
3e70: 6e 20 6d 75 6c 74 69 70 6c 65 0a 2a 2a 20 70 6c  n multiple.** pl
3e80: 61 63 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  aces..*/.static 
3e90: 69 6e 74 20 63 68 65 63 6b 46 6f 72 4d 75 6c 74  int checkForMult
3ea0: 69 43 6f 6c 75 6d 6e 53 65 6c 65 63 74 45 72 72  iColumnSelectErr
3eb0: 6f 72 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  or(.  Parse *pPa
3ec0: 72 73 65 2c 20 20 20 20 20 20 20 2f 2a 20 50 61  rse,       /* Pa
3ed0: 72 73 65 20 63 6f 6e 74 65 78 74 2e 20 2a 2f 0a  rse context. */.
3ee0: 20 20 53 65 6c 65 63 74 44 65 73 74 20 2a 70 44    SelectDest *pD
3ef0: 65 73 74 2c 20 20 20 2f 2a 20 44 65 73 74 69 6e  est,   /* Destin
3f00: 61 74 69 6f 6e 20 6f 66 20 53 45 4c 45 43 54 20  ation of SELECT 
3f10: 72 65 73 75 6c 74 73 20 2a 2f 0a 20 20 69 6e 74  results */.  int
3f20: 20 6e 45 78 70 72 20 20 20 20 20 20 20 20 20 20   nExpr          
3f30: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 72    /* Number of r
3f40: 65 73 75 6c 74 20 63 6f 6c 75 6d 6e 73 20 72 65  esult columns re
3f50: 74 75 72 6e 65 64 20 62 79 20 53 45 4c 45 43 54  turned by SELECT
3f60: 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 65 44 65   */.){.  int eDe
3f70: 73 74 20 3d 20 70 44 65 73 74 2d 3e 65 44 65 73  st = pDest->eDes
3f80: 74 3b 0a 20 20 69 66 28 20 6e 45 78 70 72 3e 31  t;.  if( nExpr>1
3f90: 20 26 26 20 28 65 44 65 73 74 3d 3d 53 52 54 5f   && (eDest==SRT_
3fa0: 4d 65 6d 20 7c 7c 20 65 44 65 73 74 3d 3d 53 52  Mem || eDest==SR
3fb0: 54 5f 53 65 74 29 20 29 7b 0a 20 20 20 20 73 71  T_Set) ){.    sq
3fc0: 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
3fd0: 61 72 73 65 2c 20 22 6f 6e 6c 79 20 61 20 73 69  arse, "only a si
3fe0: 6e 67 6c 65 20 72 65 73 75 6c 74 20 61 6c 6c 6f  ngle result allo
3ff0: 77 65 64 20 66 6f 72 20 22 0a 20 20 20 20 20 20  wed for ".      
4000: 20 22 61 20 53 45 4c 45 43 54 20 74 68 61 74 20   "a SELECT that 
4010: 69 73 20 70 61 72 74 20 6f 66 20 61 6e 20 65 78  is part of an ex
4020: 70 72 65 73 73 69 6f 6e 22 29 3b 0a 20 20 20 20  pression");.    
4030: 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 65 6c 73  return 1;.  }els
4040: 65 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b  e{.    return 0;
4050: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  .  }.}../*.** Th
4060: 69 73 20 72 6f 75 74 69 6e 65 20 67 65 6e 65 72  is routine gener
4070: 61 74 65 73 20 74 68 65 20 63 6f 64 65 20 66 6f  ates the code fo
4080: 72 20 74 68 65 20 69 6e 73 69 64 65 20 6f 66 20  r the inside of 
4090: 74 68 65 20 69 6e 6e 65 72 20 6c 6f 6f 70 0a 2a  the inner loop.*
40a0: 2a 20 6f 66 20 61 20 53 45 4c 45 43 54 2e 0a 2a  * of a SELECT..*
40b0: 2a 0a 2a 2a 20 49 66 20 73 72 63 54 61 62 20 61  *.** If srcTab a
40c0: 6e 64 20 6e 43 6f 6c 75 6d 6e 20 61 72 65 20 62  nd nColumn are b
40d0: 6f 74 68 20 7a 65 72 6f 2c 20 74 68 65 6e 20 74  oth zero, then t
40e0: 68 65 20 70 45 4c 69 73 74 20 65 78 70 72 65 73  he pEList expres
40f0: 73 69 6f 6e 73 0a 2a 2a 20 61 72 65 20 65 76 61  sions.** are eva
4100: 6c 75 61 74 65 64 20 69 6e 20 6f 72 64 65 72 20  luated in order 
4110: 74 6f 20 67 65 74 20 74 68 65 20 64 61 74 61 20  to get the data 
4120: 66 6f 72 20 74 68 69 73 20 72 6f 77 2e 20 20 49  for this row.  I
4130: 66 20 6e 43 6f 6c 75 6d 6e 3e 30 0a 2a 2a 20 74  f nColumn>0.** t
4140: 68 65 6e 20 64 61 74 61 20 69 73 20 70 75 6c 6c  hen data is pull
4150: 65 64 20 66 72 6f 6d 20 73 72 63 54 61 62 20 61  ed from srcTab a
4160: 6e 64 20 70 45 4c 69 73 74 20 69 73 20 75 73 65  nd pEList is use
4170: 64 20 6f 6e 6c 79 20 74 6f 20 67 65 74 20 74 68  d only to get th
4180: 65 0a 2a 2a 20 64 61 74 61 74 79 70 65 73 20 66  e.** datatypes f
4190: 6f 72 20 65 61 63 68 20 63 6f 6c 75 6d 6e 2e 0a  or each column..
41a0: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73  */.static void s
41b0: 65 6c 65 63 74 49 6e 6e 65 72 4c 6f 6f 70 28 0a  electInnerLoop(.
41c0: 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
41d0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
41e0: 20 70 61 72 73 65 72 20 63 6f 6e 74 65 78 74 20   parser context 
41f0: 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 2c 20  */.  Select *p, 
4200: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
4210: 54 68 65 20 63 6f 6d 70 6c 65 74 65 20 73 65 6c  The complete sel
4220: 65 63 74 20 73 74 61 74 65 6d 65 6e 74 20 62 65  ect statement be
4230: 69 6e 67 20 63 6f 64 65 64 20 2a 2f 0a 20 20 45  ing coded */.  E
4240: 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 2c  xprList *pEList,
4250: 20 20 20 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f         /* List o
4260: 66 20 76 61 6c 75 65 73 20 62 65 69 6e 67 20 65  f values being e
4270: 78 74 72 61 63 74 65 64 20 2a 2f 0a 20 20 69 6e  xtracted */.  in
4280: 74 20 73 72 63 54 61 62 2c 20 20 20 20 20 20 20  t srcTab,       
4290: 20 20 20 20 20 20 2f 2a 20 50 75 6c 6c 20 64 61        /* Pull da
42a0: 74 61 20 66 72 6f 6d 20 74 68 69 73 20 74 61 62  ta from this tab
42b0: 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 43 6f 6c  le */.  int nCol
42c0: 75 6d 6e 2c 20 20 20 20 20 20 20 20 20 20 20 20  umn,            
42d0: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 6f 6c  /* Number of col
42e0: 75 6d 6e 73 20 69 6e 20 74 68 65 20 73 6f 75 72  umns in the sour
42f0: 63 65 20 74 61 62 6c 65 20 2a 2f 0a 20 20 45 78  ce table */.  Ex
4300: 70 72 4c 69 73 74 20 2a 70 4f 72 64 65 72 42 79  prList *pOrderBy
4310: 2c 20 20 20 20 20 2f 2a 20 49 66 20 6e 6f 74 20  ,     /* If not 
4320: 4e 55 4c 4c 2c 20 73 6f 72 74 20 72 65 73 75 6c  NULL, sort resul
4330: 74 73 20 75 73 69 6e 67 20 74 68 69 73 20 6b 65  ts using this ke
4340: 79 20 2a 2f 0a 20 20 69 6e 74 20 64 69 73 74 69  y */.  int disti
4350: 6e 63 74 2c 20 20 20 20 20 20 20 20 20 20 20 2f  nct,           /
4360: 2a 20 49 66 20 3e 3d 30 2c 20 6d 61 6b 65 20 73  * If >=0, make s
4370: 75 72 65 20 72 65 73 75 6c 74 73 20 61 72 65 20  ure results are 
4380: 64 69 73 74 69 6e 63 74 20 2a 2f 0a 20 20 53 65  distinct */.  Se
4390: 6c 65 63 74 44 65 73 74 20 2a 70 44 65 73 74 2c  lectDest *pDest,
43a0: 20 20 20 20 20 20 2f 2a 20 48 6f 77 20 74 6f 20        /* How to 
43b0: 64 69 73 70 6f 73 65 20 6f 66 20 74 68 65 20 72  dispose of the r
43c0: 65 73 75 6c 74 73 20 2a 2f 0a 20 20 69 6e 74 20  esults */.  int 
43d0: 69 43 6f 6e 74 69 6e 75 65 2c 20 20 20 20 20 20  iContinue,      
43e0: 20 20 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65      /* Jump here
43f0: 20 74 6f 20 63 6f 6e 74 69 6e 75 65 20 77 69 74   to continue wit
4400: 68 20 6e 65 78 74 20 72 6f 77 20 2a 2f 0a 20 20  h next row */.  
4410: 69 6e 74 20 69 42 72 65 61 6b 2c 20 20 20 20 20  int iBreak,     
4420: 20 20 20 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20          /* Jump 
4430: 68 65 72 65 20 74 6f 20 62 72 65 61 6b 20 6f 75  here to break ou
4440: 74 20 6f 66 20 74 68 65 20 69 6e 6e 65 72 20 6c  t of the inner l
4450: 6f 6f 70 20 2a 2f 0a 20 20 63 68 61 72 20 2a 61  oop */.  char *a
4460: 66 66 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ff              
4470: 20 2f 2a 20 61 66 66 69 6e 69 74 79 20 73 74 72   /* affinity str
4480: 69 6e 67 20 69 66 20 65 44 65 73 74 20 69 73 20  ing if eDest is 
4490: 53 52 54 5f 55 6e 69 6f 6e 20 2a 2f 0a 29 7b 0a  SRT_Union */.){.
44a0: 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72    Vdbe *v = pPar
44b0: 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74  se->pVdbe;.  int
44c0: 20 69 3b 0a 20 20 69 6e 74 20 68 61 73 44 69 73   i;.  int hasDis
44d0: 74 69 6e 63 74 3b 20 20 20 20 20 20 20 20 2f 2a  tinct;        /*
44e0: 20 54 72 75 65 20 69 66 20 74 68 65 20 44 49 53   True if the DIS
44f0: 54 49 4e 43 54 20 6b 65 79 77 6f 72 64 20 69 73  TINCT keyword is
4500: 20 70 72 65 73 65 6e 74 20 2a 2f 0a 20 20 69 6e   present */.  in
4510: 74 20 72 65 67 52 65 73 75 6c 74 3b 20 20 20 20  t regResult;    
4520: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 74 61            /* Sta
4530: 72 74 20 6f 66 20 6d 65 6d 6f 72 79 20 68 6f 6c  rt of memory hol
4540: 64 69 6e 67 20 72 65 73 75 6c 74 20 73 65 74 20  ding result set 
4550: 2a 2f 0a 20 20 69 6e 74 20 65 44 65 73 74 20 3d  */.  int eDest =
4560: 20 70 44 65 73 74 2d 3e 65 44 65 73 74 3b 20 20   pDest->eDest;  
4570: 20 2f 2a 20 48 6f 77 20 74 6f 20 64 69 73 70 6f   /* How to dispo
4580: 73 65 20 6f 66 20 72 65 73 75 6c 74 73 20 2a 2f  se of results */
4590: 0a 20 20 69 6e 74 20 69 50 61 72 6d 20 3d 20 70  .  int iParm = p
45a0: 44 65 73 74 2d 3e 69 50 61 72 6d 3b 20 20 20 2f  Dest->iParm;   /
45b0: 2a 20 46 69 72 73 74 20 61 72 67 75 6d 65 6e 74  * First argument
45c0: 20 74 6f 20 64 69 73 70 6f 73 61 6c 20 6d 65 74   to disposal met
45d0: 68 6f 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 52 65  hod */.  int nRe
45e0: 73 75 6c 74 43 6f 6c 3b 20 20 20 20 20 20 20 20  sultCol;        
45f0: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
4600: 66 20 72 65 73 75 6c 74 20 63 6f 6c 75 6d 6e 73  f result columns
4610: 20 2a 2f 0a 0a 20 20 69 66 28 20 76 3d 3d 30 20   */..  if( v==0 
4620: 29 20 72 65 74 75 72 6e 3b 0a 20 20 61 73 73 65  ) return;.  asse
4630: 72 74 28 20 70 45 4c 69 73 74 21 3d 30 20 29 3b  rt( pEList!=0 );
4640: 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20  ..  /* If there 
4650: 77 61 73 20 61 20 4c 49 4d 49 54 20 63 6c 61 75  was a LIMIT clau
4660: 73 65 20 6f 6e 20 74 68 65 20 53 45 4c 45 43 54  se on the SELECT
4670: 20 73 74 61 74 65 6d 65 6e 74 2c 20 74 68 65 6e   statement, then
4680: 20 64 6f 20 74 68 65 20 63 68 65 63 6b 0a 20 20   do the check.  
4690: 2a 2a 20 74 6f 20 73 65 65 20 69 66 20 74 68 69  ** to see if thi
46a0: 73 20 72 6f 77 20 73 68 6f 75 6c 64 20 62 65 20  s row should be 
46b0: 6f 75 74 70 75 74 2e 0a 20 20 2a 2f 0a 20 20 68  output..  */.  h
46c0: 61 73 44 69 73 74 69 6e 63 74 20 3d 20 64 69 73  asDistinct = dis
46d0: 74 69 6e 63 74 3e 3d 30 20 26 26 20 70 45 4c 69  tinct>=0 && pELi
46e0: 73 74 2d 3e 6e 45 78 70 72 3e 30 3b 0a 20 20 69  st->nExpr>0;.  i
46f0: 66 28 20 70 4f 72 64 65 72 42 79 3d 3d 30 20 26  f( pOrderBy==0 &
4700: 26 20 21 68 61 73 44 69 73 74 69 6e 63 74 20 29  & !hasDistinct )
4710: 7b 0a 20 20 20 20 63 6f 64 65 4f 66 66 73 65 74  {.    codeOffset
4720: 28 76 2c 20 70 2c 20 69 43 6f 6e 74 69 6e 75 65  (v, p, iContinue
4730: 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 50 75 6c  );.  }..  /* Pul
4740: 6c 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20  l the requested 
4750: 63 6f 6c 75 6d 6e 73 2e 0a 20 20 2a 2f 0a 20 20  columns..  */.  
4760: 69 66 28 20 6e 43 6f 6c 75 6d 6e 3e 30 20 29 7b  if( nColumn>0 ){
4770: 0a 20 20 20 20 6e 52 65 73 75 6c 74 43 6f 6c 20  .    nResultCol 
4780: 3d 20 6e 43 6f 6c 75 6d 6e 3b 0a 20 20 7d 65 6c  = nColumn;.  }el
4790: 73 65 7b 0a 20 20 20 20 6e 52 65 73 75 6c 74 43  se{.    nResultC
47a0: 6f 6c 20 3d 20 70 45 4c 69 73 74 2d 3e 6e 45 78  ol = pEList->nEx
47b0: 70 72 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 44  pr;.  }.  if( pD
47c0: 65 73 74 2d 3e 69 4d 65 6d 3d 3d 30 20 29 7b 0a  est->iMem==0 ){.
47d0: 20 20 20 20 70 44 65 73 74 2d 3e 69 4d 65 6d 20      pDest->iMem 
47e0: 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70  = sqlite3GetTemp
47f0: 52 61 6e 67 65 28 70 50 61 72 73 65 2c 20 6e 52  Range(pParse, nR
4800: 65 73 75 6c 74 43 6f 6c 29 3b 0a 20 20 20 20 70  esultCol);.    p
4810: 44 65 73 74 2d 3e 6e 4d 65 6d 20 3d 20 6e 52 65  Dest->nMem = nRe
4820: 73 75 6c 74 43 6f 6c 3b 0a 20 20 7d 65 6c 73 65  sultCol;.  }else
4830: 20 69 66 28 20 70 44 65 73 74 2d 3e 6e 4d 65 6d   if( pDest->nMem
4840: 21 3d 6e 52 65 73 75 6c 74 43 6f 6c 20 29 7b 0a  !=nResultCol ){.
4850: 20 20 20 20 2f 2a 20 54 68 69 73 20 68 61 70 70      /* This happ
4860: 65 6e 73 20 77 68 65 6e 20 74 77 6f 20 53 45 4c  ens when two SEL
4870: 45 43 54 73 20 6f 66 20 61 20 63 6f 6d 70 6f 75  ECTs of a compou
4880: 6e 64 20 53 45 4c 45 43 54 20 68 61 76 65 20 64  nd SELECT have d
4890: 69 66 66 65 72 69 6e 67 0a 20 20 20 20 2a 2a 20  iffering.    ** 
48a0: 6e 75 6d 62 65 72 73 20 6f 66 20 72 65 73 75 6c  numbers of resul
48b0: 74 20 63 6f 6c 75 6d 6e 73 2e 20 20 54 68 65 20  t columns.  The 
48c0: 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 77 69  error message wi
48d0: 6c 6c 20 62 65 20 67 65 6e 65 72 61 74 65 64 20  ll be generated 
48e0: 62 79 0a 20 20 20 20 2a 2a 20 61 20 68 69 67 68  by.    ** a high
48f0: 65 72 2d 6c 65 76 65 6c 20 72 6f 75 74 69 6e 65  er-level routine
4900: 2e 20 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e 3b  . */.    return;
4910: 0a 20 20 7d 0a 20 20 72 65 67 52 65 73 75 6c 74  .  }.  regResult
4920: 20 3d 20 70 44 65 73 74 2d 3e 69 4d 65 6d 3b 0a   = pDest->iMem;.
4930: 20 20 69 66 28 20 6e 43 6f 6c 75 6d 6e 3e 30 20    if( nColumn>0 
4940: 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  ){.    for(i=0; 
4950: 69 3c 6e 43 6f 6c 75 6d 6e 3b 20 69 2b 2b 29 7b  i<nColumn; i++){
4960: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
4970: 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43  beAddOp3(v, OP_C
4980: 6f 6c 75 6d 6e 2c 20 73 72 63 54 61 62 2c 20 69  olumn, srcTab, i
4990: 2c 20 72 65 67 52 65 73 75 6c 74 2b 69 29 3b 0a  , regResult+i);.
49a0: 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 20 69 66      }.  }else if
49b0: 28 20 65 44 65 73 74 21 3d 53 52 54 5f 45 78 69  ( eDest!=SRT_Exi
49c0: 73 74 73 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66  sts ){.    /* If
49d0: 20 74 68 65 20 64 65 73 74 69 6e 61 74 69 6f 6e   the destination
49e0: 20 69 73 20 61 6e 20 45 58 49 53 54 53 28 2e 2e   is an EXISTS(..
49f0: 2e 29 20 65 78 70 72 65 73 73 69 6f 6e 2c 20 74  .) expression, t
4a00: 68 65 20 61 63 74 75 61 6c 0a 20 20 20 20 2a 2a  he actual.    **
4a10: 20 76 61 6c 75 65 73 20 72 65 74 75 72 6e 65 64   values returned
4a20: 20 62 79 20 74 68 65 20 53 45 4c 45 43 54 20 61   by the SELECT a
4a30: 72 65 20 6e 6f 74 20 72 65 71 75 69 72 65 64 2e  re not required.
4a40: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73 71 6c 69  .    */.    sqli
4a50: 74 65 33 45 78 70 72 43 6f 64 65 45 78 70 72 4c  te3ExprCodeExprL
4a60: 69 73 74 28 70 50 61 72 73 65 2c 20 70 45 4c 69  ist(pParse, pELi
4a70: 73 74 2c 20 72 65 67 52 65 73 75 6c 74 2c 20 65  st, regResult, e
4a80: 44 65 73 74 3d 3d 53 52 54 5f 43 61 6c 6c 62 61  Dest==SRT_Callba
4a90: 63 6b 29 3b 0a 20 20 7d 0a 20 20 6e 43 6f 6c 75  ck);.  }.  nColu
4aa0: 6d 6e 20 3d 20 6e 52 65 73 75 6c 74 43 6f 6c 3b  mn = nResultCol;
4ab0: 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 44 49  ..  /* If the DI
4ac0: 53 54 49 4e 43 54 20 6b 65 79 77 6f 72 64 20 77  STINCT keyword w
4ad0: 61 73 20 70 72 65 73 65 6e 74 20 6f 6e 20 74 68  as present on th
4ae0: 65 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  e SELECT stateme
4af0: 6e 74 0a 20 20 2a 2a 20 61 6e 64 20 74 68 69 73  nt.  ** and this
4b00: 20 72 6f 77 20 68 61 73 20 62 65 65 6e 20 73 65   row has been se
4b10: 65 6e 20 62 65 66 6f 72 65 2c 20 74 68 65 6e 20  en before, then 
4b20: 64 6f 20 6e 6f 74 20 6d 61 6b 65 20 74 68 69 73  do not make this
4b30: 20 72 6f 77 0a 20 20 2a 2a 20 70 61 72 74 20 6f   row.  ** part o
4b40: 66 20 74 68 65 20 72 65 73 75 6c 74 2e 0a 20 20  f the result..  
4b50: 2a 2f 0a 20 20 69 66 28 20 68 61 73 44 69 73 74  */.  if( hasDist
4b60: 69 6e 63 74 20 29 7b 0a 20 20 20 20 61 73 73 65  inct ){.    asse
4b70: 72 74 28 20 70 45 4c 69 73 74 21 3d 30 20 29 3b  rt( pEList!=0 );
4b80: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 45 4c  .    assert( pEL
4b90: 69 73 74 2d 3e 6e 45 78 70 72 3d 3d 6e 43 6f 6c  ist->nExpr==nCol
4ba0: 75 6d 6e 20 29 3b 0a 20 20 20 20 63 6f 64 65 44  umn );.    codeD
4bb0: 69 73 74 69 6e 63 74 28 70 50 61 72 73 65 2c 20  istinct(pParse, 
4bc0: 64 69 73 74 69 6e 63 74 2c 20 69 43 6f 6e 74 69  distinct, iConti
4bd0: 6e 75 65 2c 20 6e 43 6f 6c 75 6d 6e 2c 20 72 65  nue, nColumn, re
4be0: 67 52 65 73 75 6c 74 29 3b 0a 20 20 20 20 69 66  gResult);.    if
4bf0: 28 20 70 4f 72 64 65 72 42 79 3d 3d 30 20 29 7b  ( pOrderBy==0 ){
4c00: 0a 20 20 20 20 20 20 63 6f 64 65 4f 66 66 73 65  .      codeOffse
4c10: 74 28 76 2c 20 70 2c 20 69 43 6f 6e 74 69 6e 75  t(v, p, iContinu
4c20: 65 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  e);.    }.  }.. 
4c30: 20 69 66 28 20 63 68 65 63 6b 46 6f 72 4d 75 6c   if( checkForMul
4c40: 74 69 43 6f 6c 75 6d 6e 53 65 6c 65 63 74 45 72  tiColumnSelectEr
4c50: 72 6f 72 28 70 50 61 72 73 65 2c 20 70 44 65 73  ror(pParse, pDes
4c60: 74 2c 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72  t, pEList->nExpr
4c70: 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 3b  ) ){.    return;
4c80: 0a 20 20 7d 0a 0a 20 20 73 77 69 74 63 68 28 20  .  }..  switch( 
4c90: 65 44 65 73 74 20 29 7b 0a 20 20 20 20 2f 2a 20  eDest ){.    /* 
4ca0: 49 6e 20 74 68 69 73 20 6d 6f 64 65 2c 20 77 72  In this mode, wr
4cb0: 69 74 65 20 65 61 63 68 20 71 75 65 72 79 20 72  ite each query r
4cc0: 65 73 75 6c 74 20 74 6f 20 74 68 65 20 6b 65 79  esult to the key
4cd0: 20 6f 66 20 74 68 65 20 74 65 6d 70 6f 72 61 72   of the temporar
4ce0: 79 0a 20 20 20 20 2a 2a 20 74 61 62 6c 65 20 69  y.    ** table i
4cf0: 50 61 72 6d 2e 0a 20 20 20 20 2a 2f 0a 23 69 66  Parm..    */.#if
4d00: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
4d10: 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45 43 54  _COMPOUND_SELECT
4d20: 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f 55 6e  .    case SRT_Un
4d30: 69 6f 6e 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74  ion: {.      int
4d40: 20 72 31 3b 0a 20 20 20 20 20 20 72 31 20 3d 20   r1;.      r1 = 
4d50: 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65  sqlite3GetTempRe
4d60: 67 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20  g(pParse);.     
4d70: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
4d80: 70 33 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63  p3(v, OP_MakeRec
4d90: 6f 72 64 2c 20 72 65 67 52 65 73 75 6c 74 2c 20  ord, regResult, 
4da0: 6e 43 6f 6c 75 6d 6e 2c 20 72 31 29 3b 0a 20 20  nColumn, r1);.  
4db0: 20 20 20 20 69 66 28 20 61 66 66 20 29 7b 0a 20      if( aff ){. 
4dc0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
4dd0: 62 65 43 68 61 6e 67 65 50 34 28 76 2c 20 2d 31  beChangeP4(v, -1
4de0: 2c 20 61 66 66 2c 20 50 34 5f 53 54 41 54 49 43  , aff, P4_STATIC
4df0: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
4e00: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
4e10: 70 32 28 76 2c 20 4f 50 5f 49 64 78 49 6e 73 65  p2(v, OP_IdxInse
4e20: 72 74 2c 20 69 50 61 72 6d 2c 20 72 31 29 3b 0a  rt, iParm, r1);.
4e30: 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c        sqlite3Rel
4e40: 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72  easeTempReg(pPar
4e50: 73 65 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 62  se, r1);.      b
4e60: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  reak;.    }..   
4e70: 20 2f 2a 20 43 6f 6e 73 74 72 75 63 74 20 61 20   /* Construct a 
4e80: 72 65 63 6f 72 64 20 66 72 6f 6d 20 74 68 65 20  record from the 
4e90: 71 75 65 72 79 20 72 65 73 75 6c 74 2c 20 62 75  query result, bu
4ea0: 74 20 69 6e 73 74 65 61 64 20 6f 66 0a 20 20 20  t instead of.   
4eb0: 20 2a 2a 20 73 61 76 69 6e 67 20 74 68 61 74 20   ** saving that 
4ec0: 72 65 63 6f 72 64 2c 20 75 73 65 20 69 74 20 61  record, use it a
4ed0: 73 20 61 20 6b 65 79 20 74 6f 20 64 65 6c 65 74  s a key to delet
4ee0: 65 20 65 6c 65 6d 65 6e 74 73 20 66 72 6f 6d 0a  e elements from.
4ef0: 20 20 20 20 2a 2a 20 74 68 65 20 74 65 6d 70 6f      ** the tempo
4f00: 72 61 72 79 20 74 61 62 6c 65 20 69 50 61 72 6d  rary table iParm
4f10: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73  ..    */.    cas
4f20: 65 20 53 52 54 5f 45 78 63 65 70 74 3a 20 7b 0a  e SRT_Except: {.
4f30: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
4f40: 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 49 64  eAddOp3(v, OP_Id
4f50: 78 44 65 6c 65 74 65 2c 20 69 50 61 72 6d 2c 20  xDelete, iParm, 
4f60: 72 65 67 52 65 73 75 6c 74 2c 20 6e 43 6f 6c 75  regResult, nColu
4f70: 6d 6e 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  mn);.      break
4f80: 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a  ;.    }.#endif..
4f90: 20 20 20 20 2f 2a 20 53 74 6f 72 65 20 74 68 65      /* Store the
4fa0: 20 72 65 73 75 6c 74 20 61 73 20 64 61 74 61 20   result as data 
4fb0: 75 73 69 6e 67 20 61 20 75 6e 69 71 75 65 20 6b  using a unique k
4fc0: 65 79 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63  ey..    */.    c
4fd0: 61 73 65 20 53 52 54 5f 54 61 62 6c 65 3a 0a 20  ase SRT_Table:. 
4fe0: 20 20 20 63 61 73 65 20 53 52 54 5f 45 70 68 65     case SRT_Ephe
4ff0: 6d 54 61 62 3a 20 7b 0a 20 20 20 20 20 20 69 6e  mTab: {.      in
5000: 74 20 72 31 20 3d 20 73 71 6c 69 74 65 33 47 65  t r1 = sqlite3Ge
5010: 74 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 29  tTempReg(pParse)
5020: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
5030: 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
5040: 4d 61 6b 65 52 65 63 6f 72 64 2c 20 72 65 67 52  MakeRecord, regR
5050: 65 73 75 6c 74 2c 20 6e 43 6f 6c 75 6d 6e 2c 20  esult, nColumn, 
5060: 72 31 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70  r1);.      if( p
5070: 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20 20  OrderBy ){.     
5080: 20 20 20 70 75 73 68 4f 6e 74 6f 53 6f 72 74 65     pushOntoSorte
5090: 72 28 70 50 61 72 73 65 2c 20 70 4f 72 64 65 72  r(pParse, pOrder
50a0: 42 79 2c 20 70 2c 20 72 31 29 3b 0a 20 20 20 20  By, p, r1);.    
50b0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
50c0: 20 69 6e 74 20 72 32 20 3d 20 73 71 6c 69 74 65   int r2 = sqlite
50d0: 33 47 65 74 54 65 6d 70 52 65 67 28 70 50 61 72  3GetTempReg(pPar
50e0: 73 65 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  se);.        sql
50f0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
5100: 2c 20 4f 50 5f 4e 65 77 52 6f 77 69 64 2c 20 69  , OP_NewRowid, i
5110: 50 61 72 6d 2c 20 72 32 29 3b 0a 20 20 20 20 20  Parm, r2);.     
5120: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
5130: 64 4f 70 33 28 76 2c 20 4f 50 5f 49 6e 73 65 72  dOp3(v, OP_Inser
5140: 74 2c 20 69 50 61 72 6d 2c 20 72 31 2c 20 72 32  t, iParm, r1, r2
5150: 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
5160: 65 33 56 64 62 65 43 68 61 6e 67 65 50 35 28 76  e3VdbeChangeP5(v
5170: 2c 20 4f 50 46 4c 41 47 5f 41 50 50 45 4e 44 29  , OPFLAG_APPEND)
5180: 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
5190: 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28  3ReleaseTempReg(
51a0: 70 50 61 72 73 65 2c 20 72 32 29 3b 0a 20 20 20  pParse, r2);.   
51b0: 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74     }.      sqlit
51c0: 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67  e3ReleaseTempReg
51d0: 28 70 50 61 72 73 65 2c 20 72 31 29 3b 0a 20 20  (pParse, r1);.  
51e0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
51f0: 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
5200: 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 20  _OMIT_SUBQUERY. 
5210: 20 20 20 2f 2a 20 49 66 20 77 65 20 61 72 65 20     /* If we are 
5220: 63 72 65 61 74 69 6e 67 20 61 20 73 65 74 20 66  creating a set f
5230: 6f 72 20 61 6e 20 22 65 78 70 72 20 49 4e 20 28  or an "expr IN (
5240: 53 45 4c 45 43 54 20 2e 2e 2e 29 22 20 63 6f 6e  SELECT ...)" con
5250: 73 74 72 75 63 74 2c 0a 20 20 20 20 2a 2a 20 74  struct,.    ** t
5260: 68 65 6e 20 74 68 65 72 65 20 73 68 6f 75 6c 64  hen there should
5270: 20 62 65 20 61 20 73 69 6e 67 6c 65 20 69 74 65   be a single ite
5280: 6d 20 6f 6e 20 74 68 65 20 73 74 61 63 6b 2e 20  m on the stack. 
5290: 20 57 72 69 74 65 20 74 68 69 73 0a 20 20 20 20   Write this.    
52a0: 2a 2a 20 69 74 65 6d 20 69 6e 74 6f 20 74 68 65  ** item into the
52b0: 20 73 65 74 20 74 61 62 6c 65 20 77 69 74 68 20   set table with 
52c0: 62 6f 67 75 73 20 64 61 74 61 2e 0a 20 20 20 20  bogus data..    
52d0: 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f  */.    case SRT_
52e0: 53 65 74 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74  Set: {.      int
52f0: 20 61 64 64 72 32 3b 0a 0a 20 20 20 20 20 20 61   addr2;..      a
5300: 73 73 65 72 74 28 20 6e 43 6f 6c 75 6d 6e 3d 3d  ssert( nColumn==
5310: 31 20 29 3b 0a 20 20 20 20 20 20 61 64 64 72 32  1 );.      addr2
5320: 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   = sqlite3VdbeAd
5330: 64 4f 70 31 28 76 2c 20 4f 50 5f 49 73 4e 75 6c  dOp1(v, OP_IsNul
5340: 6c 2c 20 72 65 67 52 65 73 75 6c 74 29 3b 0a 20  l, regResult);. 
5350: 20 20 20 20 20 70 2d 3e 61 66 66 69 6e 69 74 79       p->affinity
5360: 20 3d 20 73 71 6c 69 74 65 33 43 6f 6d 70 61 72   = sqlite3Compar
5370: 65 41 66 66 69 6e 69 74 79 28 70 45 4c 69 73 74  eAffinity(pEList
5380: 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 2c 20 70 44  ->a[0].pExpr, pD
5390: 65 73 74 2d 3e 61 66 66 69 6e 69 74 79 29 3b 0a  est->affinity);.
53a0: 20 20 20 20 20 20 69 66 28 20 70 4f 72 64 65 72        if( pOrder
53b0: 42 79 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a  By ){.        /*
53c0: 20 41 74 20 66 69 72 73 74 20 67 6c 61 6e 63 65   At first glance
53d0: 20 79 6f 75 20 77 6f 75 6c 64 20 74 68 69 6e 6b   you would think
53e0: 20 77 65 20 63 6f 75 6c 64 20 6f 70 74 69 6d 69   we could optimi
53f0: 7a 65 20 6f 75 74 20 74 68 65 0a 20 20 20 20 20  ze out the.     
5400: 20 20 20 2a 2a 20 4f 52 44 45 52 20 42 59 20 69     ** ORDER BY i
5410: 6e 20 74 68 69 73 20 63 61 73 65 20 73 69 6e 63  n this case sinc
5420: 65 20 74 68 65 20 6f 72 64 65 72 20 6f 66 20 65  e the order of e
5430: 6e 74 72 69 65 73 20 69 6e 20 74 68 65 20 73 65  ntries in the se
5440: 74 0a 20 20 20 20 20 20 20 20 2a 2a 20 64 6f 65  t.        ** doe
5450: 73 20 6e 6f 74 20 6d 61 74 74 65 72 2e 20 20 42  s not matter.  B
5460: 75 74 20 74 68 65 72 65 20 6d 69 67 68 74 20 62  ut there might b
5470: 65 20 61 20 4c 49 4d 49 54 20 63 6c 61 75 73 65  e a LIMIT clause
5480: 2c 20 69 6e 20 77 68 69 63 68 0a 20 20 20 20 20  , in which.     
5490: 20 20 20 2a 2a 20 63 61 73 65 20 74 68 65 20 6f     ** case the o
54a0: 72 64 65 72 20 64 6f 65 73 20 6d 61 74 74 65 72  rder does matter
54b0: 20 2a 2f 0a 20 20 20 20 20 20 20 20 70 75 73 68   */.        push
54c0: 4f 6e 74 6f 53 6f 72 74 65 72 28 70 50 61 72 73  OntoSorter(pPars
54d0: 65 2c 20 70 4f 72 64 65 72 42 79 2c 20 70 2c 20  e, pOrderBy, p, 
54e0: 72 65 67 52 65 73 75 6c 74 29 3b 0a 20 20 20 20  regResult);.    
54f0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
5500: 20 69 6e 74 20 72 31 20 3d 20 73 71 6c 69 74 65   int r1 = sqlite
5510: 33 47 65 74 54 65 6d 70 52 65 67 28 70 50 61 72  3GetTempReg(pPar
5520: 73 65 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  se);.        sql
5530: 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76  ite3VdbeAddOp4(v
5540: 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c  , OP_MakeRecord,
5550: 20 72 65 67 52 65 73 75 6c 74 2c 20 31 2c 20 72   regResult, 1, r
5560: 31 2c 20 26 70 2d 3e 61 66 66 69 6e 69 74 79 2c  1, &p->affinity,
5570: 20 31 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c   1);.        sql
5580: 69 74 65 33 45 78 70 72 43 61 63 68 65 41 66 66  ite3ExprCacheAff
5590: 69 6e 69 74 79 43 68 61 6e 67 65 28 70 50 61 72  inityChange(pPar
55a0: 73 65 2c 20 72 65 67 52 65 73 75 6c 74 2c 20 31  se, regResult, 1
55b0: 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
55c0: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
55d0: 4f 50 5f 49 64 78 49 6e 73 65 72 74 2c 20 69 50  OP_IdxInsert, iP
55e0: 61 72 6d 2c 20 72 31 29 3b 0a 20 20 20 20 20 20  arm, r1);.      
55f0: 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65    sqlite3Release
5600: 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20  TempReg(pParse, 
5610: 72 31 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  r1);.      }.   
5620: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75     sqlite3VdbeJu
5630: 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72 32 29  mpHere(v, addr2)
5640: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
5650: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20     }..    /* If 
5660: 61 6e 79 20 72 6f 77 20 65 78 69 73 74 20 69 6e  any row exist in
5670: 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 2c   the result set,
5680: 20 72 65 63 6f 72 64 20 74 68 61 74 20 66 61 63   record that fac
5690: 74 20 61 6e 64 20 61 62 6f 72 74 2e 0a 20 20 20  t and abort..   
56a0: 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 52 54   */.    case SRT
56b0: 5f 45 78 69 73 74 73 3a 20 7b 0a 20 20 20 20 20  _Exists: {.     
56c0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
56d0: 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72  p2(v, OP_Integer
56e0: 2c 20 31 2c 20 69 50 61 72 6d 29 3b 0a 20 20 20  , 1, iParm);.   
56f0: 20 20 20 2f 2a 20 54 68 65 20 4c 49 4d 49 54 20     /* The LIMIT 
5700: 63 6c 61 75 73 65 20 77 69 6c 6c 20 74 65 72 6d  clause will term
5710: 69 6e 61 74 65 20 74 68 65 20 6c 6f 6f 70 20 66  inate the loop f
5720: 6f 72 20 75 73 20 2a 2f 0a 20 20 20 20 20 20 62  or us */.      b
5730: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  reak;.    }..   
5740: 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20 61   /* If this is a
5750: 20 73 63 61 6c 61 72 20 73 65 6c 65 63 74 20 74   scalar select t
5760: 68 61 74 20 69 73 20 70 61 72 74 20 6f 66 20 61  hat is part of a
5770: 6e 20 65 78 70 72 65 73 73 69 6f 6e 2c 20 74 68  n expression, th
5780: 65 6e 0a 20 20 20 20 2a 2a 20 73 74 6f 72 65 20  en.    ** store 
5790: 74 68 65 20 72 65 73 75 6c 74 73 20 69 6e 20 74  the results in t
57a0: 68 65 20 61 70 70 72 6f 70 72 69 61 74 65 20 6d  he appropriate m
57b0: 65 6d 6f 72 79 20 63 65 6c 6c 20 61 6e 64 20 62  emory cell and b
57c0: 72 65 61 6b 20 6f 75 74 0a 20 20 20 20 2a 2a 20  reak out.    ** 
57d0: 6f 66 20 74 68 65 20 73 63 61 6e 20 6c 6f 6f 70  of the scan loop
57e0: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73  ..    */.    cas
57f0: 65 20 53 52 54 5f 4d 65 6d 3a 20 7b 0a 20 20 20  e SRT_Mem: {.   
5800: 20 20 20 61 73 73 65 72 74 28 20 6e 43 6f 6c 75     assert( nColu
5810: 6d 6e 3d 3d 31 20 29 3b 0a 20 20 20 20 20 20 69  mn==1 );.      i
5820: 66 28 20 70 4f 72 64 65 72 42 79 20 29 7b 0a 20  f( pOrderBy ){. 
5830: 20 20 20 20 20 20 20 70 75 73 68 4f 6e 74 6f 53         pushOntoS
5840: 6f 72 74 65 72 28 70 50 61 72 73 65 2c 20 70 4f  orter(pParse, pO
5850: 72 64 65 72 42 79 2c 20 70 2c 20 72 65 67 52 65  rderBy, p, regRe
5860: 73 75 6c 74 29 3b 0a 20 20 20 20 20 20 7d 65 6c  sult);.      }el
5870: 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  se{.        sqli
5880: 74 65 33 45 78 70 72 43 6f 64 65 4d 6f 76 65 28  te3ExprCodeMove(
5890: 70 50 61 72 73 65 2c 20 72 65 67 52 65 73 75 6c  pParse, regResul
58a0: 74 2c 20 69 50 61 72 6d 2c 20 31 29 3b 0a 20 20  t, iParm, 1);.  
58b0: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 4c 49 4d        /* The LIM
58c0: 49 54 20 63 6c 61 75 73 65 20 77 69 6c 6c 20 6a  IT clause will j
58d0: 75 6d 70 20 6f 75 74 20 6f 66 20 74 68 65 20 6c  ump out of the l
58e0: 6f 6f 70 20 66 6f 72 20 75 73 20 2a 2f 0a 20 20  oop for us */.  
58f0: 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61      }.      brea
5900: 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 20  k;.    }.#endif 
5910: 2f 2a 20 23 69 66 6e 64 65 66 20 53 51 4c 49 54  /* #ifndef SQLIT
5920: 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 20  E_OMIT_SUBQUERY 
5930: 2a 2f 0a 0a 20 20 20 20 2f 2a 20 53 65 6e 64 20  */..    /* Send 
5940: 74 68 65 20 64 61 74 61 20 74 6f 20 74 68 65 20  the data to the 
5950: 63 61 6c 6c 62 61 63 6b 20 66 75 6e 63 74 69 6f  callback functio
5960: 6e 20 6f 72 20 74 6f 20 61 20 73 75 62 72 6f 75  n or to a subrou
5970: 74 69 6e 65 2e 20 20 49 6e 20 74 68 65 0a 20 20  tine.  In the.  
5980: 20 20 2a 2a 20 63 61 73 65 20 6f 66 20 61 20 73    ** case of a s
5990: 75 62 72 6f 75 74 69 6e 65 2c 20 74 68 65 20 73  ubroutine, the s
59a0: 75 62 72 6f 75 74 69 6e 65 20 69 74 73 65 6c 66  ubroutine itself
59b0: 20 69 73 20 72 65 73 70 6f 6e 73 69 62 6c 65 20   is responsible 
59c0: 66 6f 72 0a 20 20 20 20 2a 2a 20 70 6f 70 70 69  for.    ** poppi
59d0: 6e 67 20 74 68 65 20 64 61 74 61 20 66 72 6f 6d  ng the data from
59e0: 20 74 68 65 20 73 74 61 63 6b 2e 0a 20 20 20 20   the stack..    
59f0: 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f  */.    case SRT_
5a00: 43 6f 72 6f 75 74 69 6e 65 3a 0a 20 20 20 20 63  Coroutine:.    c
5a10: 61 73 65 20 53 52 54 5f 43 61 6c 6c 62 61 63 6b  ase SRT_Callback
5a20: 3a 20 7b 0a 20 20 20 20 20 20 69 66 28 20 70 4f  : {.      if( pO
5a30: 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20 20 20  rderBy ){.      
5a40: 20 20 69 6e 74 20 72 31 20 3d 20 73 71 6c 69 74    int r1 = sqlit
5a50: 65 33 47 65 74 54 65 6d 70 52 65 67 28 70 50 61  e3GetTempReg(pPa
5a60: 72 73 65 29 3b 0a 20 20 20 20 20 20 20 20 73 71  rse);.        sq
5a70: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
5a80: 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64  v, OP_MakeRecord
5a90: 2c 20 72 65 67 52 65 73 75 6c 74 2c 20 6e 43 6f  , regResult, nCo
5aa0: 6c 75 6d 6e 2c 20 72 31 29 3b 0a 20 20 20 20 20  lumn, r1);.     
5ab0: 20 20 20 70 75 73 68 4f 6e 74 6f 53 6f 72 74 65     pushOntoSorte
5ac0: 72 28 70 50 61 72 73 65 2c 20 70 4f 72 64 65 72  r(pParse, pOrder
5ad0: 42 79 2c 20 70 2c 20 72 31 29 3b 0a 20 20 20 20  By, p, r1);.    
5ae0: 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61      sqlite3Relea
5af0: 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65  seTempReg(pParse
5b00: 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 7d 65 6c  , r1);.      }el
5b10: 73 65 20 69 66 28 20 65 44 65 73 74 3d 3d 53 52  se if( eDest==SR
5b20: 54 5f 43 6f 72 6f 75 74 69 6e 65 20 29 7b 0a 20  T_Coroutine ){. 
5b30: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
5b40: 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 59  beAddOp1(v, OP_Y
5b50: 69 65 6c 64 2c 20 70 44 65 73 74 2d 3e 69 50 61  ield, pDest->iPa
5b60: 72 6d 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  rm);.      }else
5b70: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
5b80: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
5b90: 50 5f 52 65 73 75 6c 74 52 6f 77 2c 20 72 65 67  P_ResultRow, reg
5ba0: 52 65 73 75 6c 74 2c 20 6e 43 6f 6c 75 6d 6e 29  Result, nColumn)
5bb0: 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
5bc0: 33 45 78 70 72 43 61 63 68 65 41 66 66 69 6e 69  3ExprCacheAffini
5bd0: 74 79 43 68 61 6e 67 65 28 70 50 61 72 73 65 2c  tyChange(pParse,
5be0: 20 72 65 67 52 65 73 75 6c 74 2c 20 6e 43 6f 6c   regResult, nCol
5bf0: 75 6d 6e 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  umn);.      }.  
5c00: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
5c10: 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53  ..#if !defined(S
5c20: 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 49 47 47  QLITE_OMIT_TRIGG
5c30: 45 52 29 0a 20 20 20 20 2f 2a 20 44 69 73 63 61  ER).    /* Disca
5c40: 72 64 20 74 68 65 20 72 65 73 75 6c 74 73 2e 20  rd the results. 
5c50: 20 54 68 69 73 20 69 73 20 75 73 65 64 20 66 6f   This is used fo
5c60: 72 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  r SELECT stateme
5c70: 6e 74 73 20 69 6e 73 69 64 65 0a 20 20 20 20 2a  nts inside.    *
5c80: 2a 20 74 68 65 20 62 6f 64 79 20 6f 66 20 61 20  * the body of a 
5c90: 54 52 49 47 47 45 52 2e 20 20 54 68 65 20 70 75  TRIGGER.  The pu
5ca0: 72 70 6f 73 65 20 6f 66 20 73 75 63 68 20 73 65  rpose of such se
5cb0: 6c 65 63 74 73 20 69 73 20 74 6f 20 63 61 6c 6c  lects is to call
5cc0: 0a 20 20 20 20 2a 2a 20 75 73 65 72 2d 64 65 66  .    ** user-def
5cd0: 69 6e 65 64 20 66 75 6e 63 74 69 6f 6e 73 20 74  ined functions t
5ce0: 68 61 74 20 68 61 76 65 20 73 69 64 65 20 65 66  hat have side ef
5cf0: 66 65 63 74 73 2e 20 20 57 65 20 64 6f 20 6e 6f  fects.  We do no
5d00: 74 20 63 61 72 65 0a 20 20 20 20 2a 2a 20 61 62  t care.    ** ab
5d10: 6f 75 74 20 74 68 65 20 61 63 74 75 61 6c 20 72  out the actual r
5d20: 65 73 75 6c 74 73 20 6f 66 20 74 68 65 20 73 65  esults of the se
5d30: 6c 65 63 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  lect..    */.   
5d40: 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20   default: {.    
5d50: 20 20 61 73 73 65 72 74 28 20 65 44 65 73 74 3d    assert( eDest=
5d60: 3d 53 52 54 5f 44 69 73 63 61 72 64 20 29 3b 0a  =SRT_Discard );.
5d70: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
5d80: 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 0a 20   }.#endif.  }.. 
5d90: 20 2f 2a 20 4a 75 6d 70 20 74 6f 20 74 68 65 20   /* Jump to the 
5da0: 65 6e 64 20 6f 66 20 74 68 65 20 6c 6f 6f 70 20  end of the loop 
5db0: 69 66 20 74 68 65 20 4c 49 4d 49 54 20 69 73 20  if the LIMIT is 
5dc0: 72 65 61 63 68 65 64 2e 0a 20 20 2a 2f 0a 20 20  reached..  */.  
5dd0: 69 66 28 20 70 2d 3e 69 4c 69 6d 69 74 20 26 26  if( p->iLimit &&
5de0: 20 70 4f 72 64 65 72 42 79 3d 3d 30 20 29 7b 0a   pOrderBy==0 ){.
5df0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
5e00: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 41 64 64 49  ddOp2(v, OP_AddI
5e10: 6d 6d 2c 20 70 2d 3e 69 4c 69 6d 69 74 2c 20 2d  mm, p->iLimit, -
5e20: 31 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  1);.    sqlite3V
5e30: 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
5e40: 49 66 5a 65 72 6f 2c 20 70 2d 3e 69 4c 69 6d 69  IfZero, p->iLimi
5e50: 74 2c 20 69 42 72 65 61 6b 29 3b 0a 20 20 7d 0a  t, iBreak);.  }.
5e60: 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20 61  }../*.** Given a
5e70: 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 69 73  n expression lis
5e80: 74 2c 20 67 65 6e 65 72 61 74 65 20 61 20 4b 65  t, generate a Ke
5e90: 79 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65 20  yInfo structure 
5ea0: 74 68 61 74 20 72 65 63 6f 72 64 73 0a 2a 2a 20  that records.** 
5eb0: 74 68 65 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65  the collating se
5ec0: 71 75 65 6e 63 65 20 66 6f 72 20 65 61 63 68 20  quence for each 
5ed0: 65 78 70 72 65 73 73 69 6f 6e 20 69 6e 20 74 68  expression in th
5ee0: 61 74 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 69  at expression li
5ef0: 73 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  st..**.** If the
5f00: 20 45 78 70 72 4c 69 73 74 20 69 73 20 61 6e 20   ExprList is an 
5f10: 4f 52 44 45 52 20 42 59 20 6f 72 20 47 52 4f 55  ORDER BY or GROU
5f20: 50 20 42 59 20 63 6c 61 75 73 65 20 74 68 65 6e  P BY clause then
5f30: 20 74 68 65 20 72 65 73 75 6c 74 69 6e 67 0a 2a   the resulting.*
5f40: 2a 20 4b 65 79 49 6e 66 6f 20 73 74 72 75 63 74  * KeyInfo struct
5f50: 75 72 65 20 69 73 20 61 70 70 72 6f 70 72 69 61  ure is appropria
5f60: 74 65 20 66 6f 72 20 69 6e 69 74 69 61 6c 69 7a  te for initializ
5f70: 69 6e 67 20 61 20 76 69 72 74 75 61 6c 20 69 6e  ing a virtual in
5f80: 64 65 78 20 74 6f 0a 2a 2a 20 69 6d 70 6c 65 6d  dex to.** implem
5f90: 65 6e 74 20 74 68 61 74 20 63 6c 61 75 73 65 2e  ent that clause.
5fa0: 20 20 49 66 20 74 68 65 20 45 78 70 72 4c 69 73    If the ExprLis
5fb0: 74 20 69 73 20 74 68 65 20 72 65 73 75 6c 74 20  t is the result 
5fc0: 73 65 74 20 6f 66 20 61 20 53 45 4c 45 43 54 0a  set of a SELECT.
5fd0: 2a 2a 20 74 68 65 6e 20 74 68 65 20 4b 65 79 49  ** then the KeyI
5fe0: 6e 66 6f 20 73 74 72 75 63 74 75 72 65 20 69 73  nfo structure is
5ff0: 20 61 70 70 72 6f 70 72 69 61 74 65 20 66 6f 72   appropriate for
6000: 20 69 6e 69 74 69 61 6c 69 7a 69 6e 67 20 61 20   initializing a 
6010: 76 69 72 74 75 61 6c 0a 2a 2a 20 69 6e 64 65 78  virtual.** index
6020: 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 61 20   to implement a 
6030: 44 49 53 54 49 4e 43 54 20 74 65 73 74 2e 0a 2a  DISTINCT test..*
6040: 2a 0a 2a 2a 20 53 70 61 63 65 20 74 6f 20 68 6f  *.** Space to ho
6050: 6c 64 20 74 68 65 20 4b 65 79 49 6e 66 6f 20 73  ld the KeyInfo s
6060: 74 72 75 63 74 75 72 65 20 69 73 20 6f 62 74 61  tructure is obta
6070: 69 6e 20 66 72 6f 6d 20 6d 61 6c 6c 6f 63 2e 20  in from malloc. 
6080: 20 54 68 65 20 63 61 6c 6c 69 6e 67 0a 2a 2a 20   The calling.** 
6090: 66 75 6e 63 74 69 6f 6e 20 69 73 20 72 65 73 70  function is resp
60a0: 6f 6e 73 69 62 6c 65 20 66 6f 72 20 73 65 65 69  onsible for seei
60b0: 6e 67 20 74 68 61 74 20 74 68 69 73 20 73 74 72  ng that this str
60c0: 75 63 74 75 72 65 20 69 73 20 65 76 65 6e 74 75  ucture is eventu
60d0: 61 6c 6c 79 0a 2a 2a 20 66 72 65 65 64 2e 20 20  ally.** freed.  
60e0: 41 64 64 20 74 68 65 20 4b 65 79 49 6e 66 6f 20  Add the KeyInfo 
60f0: 73 74 72 75 63 74 75 72 65 20 74 6f 20 74 68 65  structure to the
6100: 20 50 34 20 66 69 65 6c 64 20 6f 66 20 61 6e 20   P4 field of an 
6110: 6f 70 63 6f 64 65 20 75 73 69 6e 67 0a 2a 2a 20  opcode using.** 
6120: 50 34 5f 4b 45 59 49 4e 46 4f 5f 48 41 4e 44 4f  P4_KEYINFO_HANDO
6130: 46 46 20 69 73 20 74 68 65 20 75 73 75 61 6c 20  FF is the usual 
6140: 77 61 79 20 6f 66 20 64 65 61 6c 69 6e 67 20 77  way of dealing w
6150: 69 74 68 20 74 68 69 73 2e 0a 2a 2f 0a 73 74 61  ith this..*/.sta
6160: 74 69 63 20 4b 65 79 49 6e 66 6f 20 2a 6b 65 79  tic KeyInfo *key
6170: 49 6e 66 6f 46 72 6f 6d 45 78 70 72 4c 69 73 74  InfoFromExprList
6180: 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
6190: 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 29  ExprList *pList)
61a0: 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20  {.  sqlite3 *db 
61b0: 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20  = pParse->db;.  
61c0: 69 6e 74 20 6e 45 78 70 72 3b 0a 20 20 4b 65 79  int nExpr;.  Key
61d0: 49 6e 66 6f 20 2a 70 49 6e 66 6f 3b 0a 20 20 73  Info *pInfo;.  s
61e0: 74 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69  truct ExprList_i
61f0: 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 69 6e  tem *pItem;.  in
6200: 74 20 69 3b 0a 0a 20 20 6e 45 78 70 72 20 3d 20  t i;..  nExpr = 
6210: 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 0a 20 20  pList->nExpr;.  
6220: 70 49 6e 66 6f 20 3d 20 73 71 6c 69 74 65 33 44  pInfo = sqlite3D
6230: 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20  bMallocZero(db, 
6240: 73 69 7a 65 6f 66 28 2a 70 49 6e 66 6f 29 20 2b  sizeof(*pInfo) +
6250: 20 6e 45 78 70 72 2a 28 73 69 7a 65 6f 66 28 43   nExpr*(sizeof(C
6260: 6f 6c 6c 53 65 71 2a 29 2b 31 29 20 29 3b 0a 20  ollSeq*)+1) );. 
6270: 20 69 66 28 20 70 49 6e 66 6f 20 29 7b 0a 20 20   if( pInfo ){.  
6280: 20 20 70 49 6e 66 6f 2d 3e 61 53 6f 72 74 4f 72    pInfo->aSortOr
6290: 64 65 72 20 3d 20 28 75 38 2a 29 26 70 49 6e 66  der = (u8*)&pInf
62a0: 6f 2d 3e 61 43 6f 6c 6c 5b 6e 45 78 70 72 5d 3b  o->aColl[nExpr];
62b0: 0a 20 20 20 20 70 49 6e 66 6f 2d 3e 6e 46 69 65  .    pInfo->nFie
62c0: 6c 64 20 3d 20 6e 45 78 70 72 3b 0a 20 20 20 20  ld = nExpr;.    
62d0: 70 49 6e 66 6f 2d 3e 65 6e 63 20 3d 20 45 4e 43  pInfo->enc = ENC
62e0: 28 64 62 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d  (db);.    for(i=
62f0: 30 2c 20 70 49 74 65 6d 3d 70 4c 69 73 74 2d 3e  0, pItem=pList->
6300: 61 3b 20 69 3c 6e 45 78 70 72 3b 20 69 2b 2b 2c  a; i<nExpr; i++,
6310: 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 20   pItem++){.     
6320: 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 3b   CollSeq *pColl;
6330: 0a 20 20 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73  .      pColl = s
6340: 71 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c 53 65  qlite3ExprCollSe
6350: 71 28 70 50 61 72 73 65 2c 20 70 49 74 65 6d 2d  q(pParse, pItem-
6360: 3e 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20 69  >pExpr);.      i
6370: 66 28 20 21 70 43 6f 6c 6c 20 29 7b 0a 20 20 20  f( !pColl ){.   
6380: 20 20 20 20 20 70 43 6f 6c 6c 20 3d 20 64 62 2d       pColl = db-
6390: 3e 70 44 66 6c 74 43 6f 6c 6c 3b 0a 20 20 20 20  >pDfltColl;.    
63a0: 20 20 7d 0a 20 20 20 20 20 20 70 49 6e 66 6f 2d    }.      pInfo-
63b0: 3e 61 43 6f 6c 6c 5b 69 5d 20 3d 20 70 43 6f 6c  >aColl[i] = pCol
63c0: 6c 3b 0a 20 20 20 20 20 20 70 49 6e 66 6f 2d 3e  l;.      pInfo->
63d0: 61 53 6f 72 74 4f 72 64 65 72 5b 69 5d 20 3d 20  aSortOrder[i] = 
63e0: 70 49 74 65 6d 2d 3e 73 6f 72 74 4f 72 64 65 72  pItem->sortOrder
63f0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  ;.    }.  }.  re
6400: 74 75 72 6e 20 70 49 6e 66 6f 3b 0a 7d 0a 0a 0a  turn pInfo;.}...
6410: 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20 69 6e 6e  /*.** If the inn
6420: 65 72 20 6c 6f 6f 70 20 77 61 73 20 67 65 6e 65  er loop was gene
6430: 72 61 74 65 64 20 75 73 69 6e 67 20 61 20 6e 6f  rated using a no
6440: 6e 2d 6e 75 6c 6c 20 70 4f 72 64 65 72 42 79 20  n-null pOrderBy 
6450: 61 72 67 75 6d 65 6e 74 2c 0a 2a 2a 20 74 68 65  argument,.** the
6460: 6e 20 74 68 65 20 72 65 73 75 6c 74 73 20 77 65  n the results we
6470: 72 65 20 70 6c 61 63 65 64 20 69 6e 20 61 20 73  re placed in a s
6480: 6f 72 74 65 72 2e 20 20 41 66 74 65 72 20 74 68  orter.  After th
6490: 65 20 6c 6f 6f 70 20 69 73 20 74 65 72 6d 69 6e  e loop is termin
64a0: 61 74 65 64 0a 2a 2a 20 77 65 20 6e 65 65 64 20  ated.** we need 
64b0: 74 6f 20 72 75 6e 20 74 68 65 20 73 6f 72 74 65  to run the sorte
64c0: 72 20 61 6e 64 20 6f 75 74 70 75 74 20 74 68 65  r and output the
64d0: 20 72 65 73 75 6c 74 73 2e 20 20 54 68 65 20 66   results.  The f
64e0: 6f 6c 6c 6f 77 69 6e 67 0a 2a 2a 20 72 6f 75 74  ollowing.** rout
64f0: 69 6e 65 20 67 65 6e 65 72 61 74 65 73 20 74 68  ine generates th
6500: 65 20 63 6f 64 65 20 6e 65 65 64 65 64 20 74 6f  e code needed to
6510: 20 64 6f 20 74 68 61 74 2e 0a 2a 2f 0a 73 74 61   do that..*/.sta
6520: 74 69 63 20 76 6f 69 64 20 67 65 6e 65 72 61 74  tic void generat
6530: 65 53 6f 72 74 54 61 69 6c 28 0a 20 20 50 61 72  eSortTail(.  Par
6540: 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 2f  se *pParse,    /
6550: 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78  * Parsing contex
6560: 74 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70  t */.  Select *p
6570: 2c 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20  ,        /* The 
6580: 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
6590: 20 2a 2f 0a 20 20 56 64 62 65 20 2a 76 2c 20 20   */.  Vdbe *v,  
65a0: 20 20 20 20 20 20 20 20 2f 2a 20 47 65 6e 65 72          /* Gener
65b0: 61 74 65 20 63 6f 64 65 20 69 6e 74 6f 20 74 68  ate code into th
65c0: 69 73 20 56 44 42 45 20 2a 2f 0a 20 20 69 6e 74  is VDBE */.  int
65d0: 20 6e 43 6f 6c 75 6d 6e 2c 20 20 20 20 20 20 2f   nColumn,      /
65e0: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75  * Number of colu
65f0: 6d 6e 73 20 6f 66 20 64 61 74 61 20 2a 2f 0a 20  mns of data */. 
6600: 20 53 65 6c 65 63 74 44 65 73 74 20 2a 70 44 65   SelectDest *pDe
6610: 73 74 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20  st /* Write the 
6620: 73 6f 72 74 65 64 20 72 65 73 75 6c 74 73 20 68  sorted results h
6630: 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  ere */.){.  int 
6640: 62 72 6b 20 3d 20 73 71 6c 69 74 65 33 56 64 62  brk = sqlite3Vdb
6650: 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20  eMakeLabel(v);. 
6660: 20 69 6e 74 20 63 6f 6e 74 20 3d 20 73 71 6c 69   int cont = sqli
6670: 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c  te3VdbeMakeLabel
6680: 28 76 29 3b 0a 20 20 69 6e 74 20 61 64 64 72 3b  (v);.  int addr;
6690: 0a 20 20 69 6e 74 20 69 54 61 62 3b 0a 20 20 69  .  int iTab;.  i
66a0: 6e 74 20 70 73 65 75 64 6f 54 61 62 20 3d 20 30  nt pseudoTab = 0
66b0: 3b 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4f  ;.  ExprList *pO
66c0: 72 64 65 72 42 79 20 3d 20 70 2d 3e 70 4f 72 64  rderBy = p->pOrd
66d0: 65 72 42 79 3b 0a 0a 20 20 69 6e 74 20 65 44 65  erBy;..  int eDe
66e0: 73 74 20 3d 20 70 44 65 73 74 2d 3e 65 44 65 73  st = pDest->eDes
66f0: 74 3b 0a 20 20 69 6e 74 20 69 50 61 72 6d 20 3d  t;.  int iParm =
6700: 20 70 44 65 73 74 2d 3e 69 50 61 72 6d 3b 0a 0a   pDest->iParm;..
6710: 20 20 69 6e 74 20 72 65 67 52 6f 77 3b 0a 20 20    int regRow;.  
6720: 69 6e 74 20 72 65 67 52 6f 77 69 64 3b 0a 0a 20  int regRowid;.. 
6730: 20 69 54 61 62 20 3d 20 70 4f 72 64 65 72 42 79   iTab = pOrderBy
6740: 2d 3e 69 45 43 75 72 73 6f 72 3b 0a 20 20 69 66  ->iECursor;.  if
6750: 28 20 65 44 65 73 74 3d 3d 53 52 54 5f 43 61 6c  ( eDest==SRT_Cal
6760: 6c 62 61 63 6b 20 7c 7c 20 65 44 65 73 74 3d 3d  lback || eDest==
6770: 53 52 54 5f 43 6f 72 6f 75 74 69 6e 65 20 29 7b  SRT_Coroutine ){
6780: 0a 20 20 20 20 70 73 65 75 64 6f 54 61 62 20 3d  .    pseudoTab =
6790: 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b   pParse->nTab++;
67a0: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
67b0: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 53 65 74  AddOp2(v, OP_Set
67c0: 4e 75 6d 43 6f 6c 75 6d 6e 73 2c 20 30 2c 20 6e  NumColumns, 0, n
67d0: 43 6f 6c 75 6d 6e 29 3b 0a 20 20 20 20 73 71 6c  Column);.    sql
67e0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
67f0: 2c 20 4f 50 5f 4f 70 65 6e 50 73 65 75 64 6f 2c  , OP_OpenPseudo,
6800: 20 70 73 65 75 64 6f 54 61 62 2c 20 65 44 65 73   pseudoTab, eDes
6810: 74 3d 3d 53 52 54 5f 43 61 6c 6c 62 61 63 6b 29  t==SRT_Callback)
6820: 3b 0a 20 20 7d 0a 20 20 61 64 64 72 20 3d 20 31  ;.  }.  addr = 1
6830: 20 2b 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   + sqlite3VdbeAd
6840: 64 4f 70 32 28 76 2c 20 4f 50 5f 53 6f 72 74 2c  dOp2(v, OP_Sort,
6850: 20 69 54 61 62 2c 20 62 72 6b 29 3b 0a 20 20 63   iTab, brk);.  c
6860: 6f 64 65 4f 66 66 73 65 74 28 76 2c 20 70 2c 20  odeOffset(v, p, 
6870: 63 6f 6e 74 29 3b 0a 20 20 72 65 67 52 6f 77 20  cont);.  regRow 
6880: 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70  = sqlite3GetTemp
6890: 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20 72  Reg(pParse);.  r
68a0: 65 67 52 6f 77 69 64 20 3d 20 73 71 6c 69 74 65  egRowid = sqlite
68b0: 33 47 65 74 54 65 6d 70 52 65 67 28 70 50 61 72  3GetTempReg(pPar
68c0: 73 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64  se);.  sqlite3Vd
68d0: 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43  beAddOp3(v, OP_C
68e0: 6f 6c 75 6d 6e 2c 20 69 54 61 62 2c 20 70 4f 72  olumn, iTab, pOr
68f0: 64 65 72 42 79 2d 3e 6e 45 78 70 72 20 2b 20 31  derBy->nExpr + 1
6900: 2c 20 72 65 67 52 6f 77 29 3b 0a 20 20 73 77 69  , regRow);.  swi
6910: 74 63 68 28 20 65 44 65 73 74 20 29 7b 0a 20 20  tch( eDest ){.  
6920: 20 20 63 61 73 65 20 53 52 54 5f 54 61 62 6c 65    case SRT_Table
6930: 3a 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f 45  :.    case SRT_E
6940: 70 68 65 6d 54 61 62 3a 20 7b 0a 20 20 20 20 20  phemTab: {.     
6950: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
6960: 70 32 28 76 2c 20 4f 50 5f 4e 65 77 52 6f 77 69  p2(v, OP_NewRowi
6970: 64 2c 20 69 50 61 72 6d 2c 20 72 65 67 52 6f 77  d, iParm, regRow
6980: 69 64 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  id);.      sqlit
6990: 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
69a0: 4f 50 5f 49 6e 73 65 72 74 2c 20 69 50 61 72 6d  OP_Insert, iParm
69b0: 2c 20 72 65 67 52 6f 77 2c 20 72 65 67 52 6f 77  , regRow, regRow
69c0: 69 64 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  id);.      sqlit
69d0: 65 33 56 64 62 65 43 68 61 6e 67 65 50 35 28 76  e3VdbeChangeP5(v
69e0: 2c 20 4f 50 46 4c 41 47 5f 41 50 50 45 4e 44 29  , OPFLAG_APPEND)
69f0: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
6a00: 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c     }.#ifndef SQL
6a10: 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52  ITE_OMIT_SUBQUER
6a20: 59 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f 53  Y.    case SRT_S
6a30: 65 74 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20  et: {.      int 
6a40: 6a 31 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  j1;.      assert
6a50: 28 20 6e 43 6f 6c 75 6d 6e 3d 3d 31 20 29 3b 0a  ( nColumn==1 );.
6a60: 20 20 20 20 20 20 6a 31 20 3d 20 73 71 6c 69 74        j1 = sqlit
6a70: 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20  e3VdbeAddOp1(v, 
6a80: 4f 50 5f 49 73 4e 75 6c 6c 2c 20 72 65 67 52 6f  OP_IsNull, regRo
6a90: 77 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  w);.      sqlite
6aa0: 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f  3VdbeAddOp4(v, O
6ab0: 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20 72 65  P_MakeRecord, re
6ac0: 67 52 6f 77 2c 20 31 2c 20 72 65 67 52 6f 77 69  gRow, 1, regRowi
6ad0: 64 2c 20 26 70 2d 3e 61 66 66 69 6e 69 74 79 2c  d, &p->affinity,
6ae0: 20 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74   1);.      sqlit
6af0: 65 33 45 78 70 72 43 61 63 68 65 41 66 66 69 6e  e3ExprCacheAffin
6b00: 69 74 79 43 68 61 6e 67 65 28 70 50 61 72 73 65  ityChange(pParse
6b10: 2c 20 72 65 67 52 6f 77 2c 20 31 29 3b 0a 20 20  , regRow, 1);.  
6b20: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
6b30: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 64 78 49  ddOp2(v, OP_IdxI
6b40: 6e 73 65 72 74 2c 20 69 50 61 72 6d 2c 20 72 65  nsert, iParm, re
6b50: 67 52 6f 77 69 64 29 3b 0a 20 20 20 20 20 20 73  gRowid);.      s
6b60: 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65  qlite3VdbeJumpHe
6b70: 72 65 28 76 2c 20 6a 31 29 3b 0a 20 20 20 20 20  re(v, j1);.     
6b80: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
6b90: 20 20 63 61 73 65 20 53 52 54 5f 4d 65 6d 3a 20    case SRT_Mem: 
6ba0: 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
6bb0: 6e 43 6f 6c 75 6d 6e 3d 3d 31 20 29 3b 0a 20 20  nColumn==1 );.  
6bc0: 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
6bd0: 6f 64 65 4d 6f 76 65 28 70 50 61 72 73 65 2c 20  odeMove(pParse, 
6be0: 72 65 67 52 6f 77 2c 20 69 50 61 72 6d 2c 20 31  regRow, iParm, 1
6bf0: 29 3b 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20  );.      /* The 
6c00: 4c 49 4d 49 54 20 63 6c 61 75 73 65 20 77 69 6c  LIMIT clause wil
6c10: 6c 20 74 65 72 6d 69 6e 61 74 65 20 74 68 65 20  l terminate the 
6c20: 6c 6f 6f 70 20 66 6f 72 20 75 73 20 2a 2f 0a 20  loop for us */. 
6c30: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
6c40: 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 63 61 73  }.#endif.    cas
6c50: 65 20 53 52 54 5f 43 61 6c 6c 62 61 63 6b 3a 0a  e SRT_Callback:.
6c60: 20 20 20 20 63 61 73 65 20 53 52 54 5f 43 6f 72      case SRT_Cor
6c70: 6f 75 74 69 6e 65 3a 20 7b 0a 20 20 20 20 20 20  outine: {.      
6c80: 69 6e 74 20 69 3b 0a 20 20 20 20 20 20 73 71 6c  int i;.      sql
6c90: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
6ca0: 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 31 2c  , OP_Integer, 1,
6cb0: 20 72 65 67 52 6f 77 69 64 29 3b 0a 20 20 20 20   regRowid);.    
6cc0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
6cd0: 4f 70 33 28 76 2c 20 4f 50 5f 49 6e 73 65 72 74  Op3(v, OP_Insert
6ce0: 2c 20 70 73 65 75 64 6f 54 61 62 2c 20 72 65 67  , pseudoTab, reg
6cf0: 52 6f 77 2c 20 72 65 67 52 6f 77 69 64 29 3b 0a  Row, regRowid);.
6d00: 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69        for(i=0; i
6d10: 3c 6e 43 6f 6c 75 6d 6e 3b 20 69 2b 2b 29 7b 0a  <nColumn; i++){.
6d20: 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
6d30: 72 65 67 52 6f 77 21 3d 70 44 65 73 74 2d 3e 69  regRow!=pDest->i
6d40: 4d 65 6d 2b 69 20 29 3b 0a 20 20 20 20 20 20 20  Mem+i );.       
6d50: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
6d60: 70 33 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c  p3(v, OP_Column,
6d70: 20 70 73 65 75 64 6f 54 61 62 2c 20 69 2c 20 70   pseudoTab, i, p
6d80: 44 65 73 74 2d 3e 69 4d 65 6d 2b 69 29 3b 0a 20  Dest->iMem+i);. 
6d90: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
6da0: 20 65 44 65 73 74 3d 3d 53 52 54 5f 43 61 6c 6c   eDest==SRT_Call
6db0: 62 61 63 6b 20 29 7b 0a 20 20 20 20 20 20 20 20  back ){.        
6dc0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
6dd0: 32 28 76 2c 20 4f 50 5f 52 65 73 75 6c 74 52 6f  2(v, OP_ResultRo
6de0: 77 2c 20 70 44 65 73 74 2d 3e 69 4d 65 6d 2c 20  w, pDest->iMem, 
6df0: 6e 43 6f 6c 75 6d 6e 29 3b 0a 20 20 20 20 20 20  nColumn);.      
6e00: 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63    sqlite3ExprCac
6e10: 68 65 41 66 66 69 6e 69 74 79 43 68 61 6e 67 65  heAffinityChange
6e20: 28 70 50 61 72 73 65 2c 20 70 44 65 73 74 2d 3e  (pParse, pDest->
6e30: 69 4d 65 6d 2c 20 6e 43 6f 6c 75 6d 6e 29 3b 0a  iMem, nColumn);.
6e40: 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
6e50: 65 44 65 73 74 3d 3d 53 52 54 5f 43 6f 72 6f 75  eDest==SRT_Corou
6e60: 74 69 6e 65 20 29 7b 0a 20 20 20 20 20 20 20 20  tine ){.        
6e70: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
6e80: 31 28 76 2c 20 4f 50 5f 59 69 65 6c 64 2c 20 70  1(v, OP_Yield, p
6e90: 44 65 73 74 2d 3e 69 50 61 72 6d 29 3b 0a 20 20  Dest->iParm);.  
6ea0: 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61      }.      brea
6eb0: 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 64 65 66  k;.    }.    def
6ec0: 61 75 6c 74 3a 20 7b 0a 20 20 20 20 20 20 2f 2a  ault: {.      /*
6ed0: 20 44 6f 20 6e 6f 74 68 69 6e 67 20 2a 2f 0a 20   Do nothing */. 
6ee0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
6ef0: 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 52  }.  }.  sqlite3R
6f00: 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50  eleaseTempReg(pP
6f10: 61 72 73 65 2c 20 72 65 67 52 6f 77 29 3b 0a 20  arse, regRow);. 
6f20: 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54   sqlite3ReleaseT
6f30: 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72  empReg(pParse, r
6f40: 65 67 52 6f 77 69 64 29 3b 0a 0a 20 20 2f 2a 20  egRowid);..  /* 
6f50: 4a 75 6d 70 20 74 6f 20 74 68 65 20 65 6e 64 20  Jump to the end 
6f60: 6f 66 20 74 68 65 20 6c 6f 6f 70 20 77 68 65 6e  of the loop when
6f70: 20 74 68 65 20 4c 49 4d 49 54 20 69 73 20 72 65   the LIMIT is re
6f80: 61 63 68 65 64 0a 20 20 2a 2f 0a 20 20 69 66 28  ached.  */.  if(
6f90: 20 70 2d 3e 69 4c 69 6d 69 74 20 29 7b 0a 20 20   p->iLimit ){.  
6fa0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
6fb0: 4f 70 32 28 76 2c 20 4f 50 5f 41 64 64 49 6d 6d  Op2(v, OP_AddImm
6fc0: 2c 20 70 2d 3e 69 4c 69 6d 69 74 2c 20 2d 31 29  , p->iLimit, -1)
6fd0: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
6fe0: 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 66  eAddOp2(v, OP_If
6ff0: 5a 65 72 6f 2c 20 70 2d 3e 69 4c 69 6d 69 74 2c  Zero, p->iLimit,
7000: 20 62 72 6b 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a   brk);.  }..  /*
7010: 20 54 68 65 20 62 6f 74 74 6f 6d 20 6f 66 20 74   The bottom of t
7020: 68 65 20 6c 6f 6f 70 0a 20 20 2a 2f 0a 20 20 73  he loop.  */.  s
7030: 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76  qlite3VdbeResolv
7040: 65 4c 61 62 65 6c 28 76 2c 20 63 6f 6e 74 29 3b  eLabel(v, cont);
7050: 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  .  sqlite3VdbeAd
7060: 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 65 78 74 2c  dOp2(v, OP_Next,
7070: 20 69 54 61 62 2c 20 61 64 64 72 29 3b 0a 20 20   iTab, addr);.  
7080: 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c  sqlite3VdbeResol
7090: 76 65 4c 61 62 65 6c 28 76 2c 20 62 72 6b 29 3b  veLabel(v, brk);
70a0: 0a 20 20 69 66 28 20 65 44 65 73 74 3d 3d 53 52  .  if( eDest==SR
70b0: 54 5f 43 61 6c 6c 62 61 63 6b 20 7c 7c 20 65 44  T_Callback || eD
70c0: 65 73 74 3d 3d 53 52 54 5f 43 6f 72 6f 75 74 69  est==SRT_Corouti
70d0: 6e 65 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  ne ){.    sqlite
70e0: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
70f0: 50 5f 43 6c 6f 73 65 2c 20 70 73 65 75 64 6f 54  P_Close, pseudoT
7100: 61 62 2c 20 30 29 3b 0a 20 20 7d 0a 0a 7d 0a 0a  ab, 0);.  }..}..
7110: 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 70  /*.** Return a p
7120: 6f 69 6e 74 65 72 20 74 6f 20 61 20 73 74 72 69  ointer to a stri
7130: 6e 67 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68  ng containing th
7140: 65 20 27 64 65 63 6c 61 72 61 74 69 6f 6e 20 74  e 'declaration t
7150: 79 70 65 27 20 6f 66 20 74 68 65 0a 2a 2a 20 65  ype' of the.** e
7160: 78 70 72 65 73 73 69 6f 6e 20 70 45 78 70 72 2e  xpression pExpr.
7170: 20 54 68 65 20 73 74 72 69 6e 67 20 6d 61 79 20   The string may 
7180: 62 65 20 74 72 65 61 74 65 64 20 61 73 20 73 74  be treated as st
7190: 61 74 69 63 20 62 79 20 74 68 65 20 63 61 6c 6c  atic by the call
71a0: 65 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 64 65  er..**.** The de
71b0: 63 6c 61 72 61 74 69 6f 6e 20 74 79 70 65 20 69  claration type i
71c0: 73 20 74 68 65 20 65 78 61 63 74 20 64 61 74 61  s the exact data
71d0: 74 79 70 65 20 64 65 66 69 6e 69 74 69 6f 6e 20  type definition 
71e0: 65 78 74 72 61 63 74 65 64 20 66 72 6f 6d 20 74  extracted from t
71f0: 68 65 0a 2a 2a 20 6f 72 69 67 69 6e 61 6c 20 43  he.** original C
7200: 52 45 41 54 45 20 54 41 42 4c 45 20 73 74 61 74  REATE TABLE stat
7210: 65 6d 65 6e 74 20 69 66 20 74 68 65 20 65 78 70  ement if the exp
7220: 72 65 73 73 69 6f 6e 20 69 73 20 61 20 63 6f 6c  ression is a col
7230: 75 6d 6e 2e 20 54 68 65 0a 2a 2a 20 64 65 63 6c  umn. The.** decl
7240: 61 72 61 74 69 6f 6e 20 74 79 70 65 20 66 6f 72  aration type for
7250: 20 61 20 52 4f 57 49 44 20 66 69 65 6c 64 20 69   a ROWID field i
7260: 73 20 49 4e 54 45 47 45 52 2e 20 45 78 61 63 74  s INTEGER. Exact
7270: 6c 79 20 77 68 65 6e 20 61 6e 20 65 78 70 72 65  ly when an expre
7280: 73 73 69 6f 6e 0a 2a 2a 20 69 73 20 63 6f 6e 73  ssion.** is cons
7290: 69 64 65 72 65 64 20 61 20 63 6f 6c 75 6d 6e 20  idered a column 
72a0: 63 61 6e 20 62 65 20 63 6f 6d 70 6c 65 78 20 69  can be complex i
72b0: 6e 20 74 68 65 20 70 72 65 73 65 6e 63 65 20 6f  n the presence o
72c0: 66 20 73 75 62 71 75 65 72 69 65 73 2e 20 54 68  f subqueries. Th
72d0: 65 0a 2a 2a 20 72 65 73 75 6c 74 2d 73 65 74 20  e.** result-set 
72e0: 65 78 70 72 65 73 73 69 6f 6e 20 69 6e 20 61 6c  expression in al
72f0: 6c 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69  l of the followi
7300: 6e 67 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d  ng SELECT statem
7310: 65 6e 74 73 20 69 73 20 0a 2a 2a 20 63 6f 6e 73  ents is .** cons
7320: 69 64 65 72 65 64 20 61 20 63 6f 6c 75 6d 6e 20  idered a column 
7330: 62 79 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  by this function
7340: 2e 0a 2a 2a 0a 2a 2a 20 20 20 53 45 4c 45 43 54  ..**.**   SELECT
7350: 20 63 6f 6c 20 46 52 4f 4d 20 74 62 6c 3b 0a 2a   col FROM tbl;.*
7360: 2a 20 20 20 53 45 4c 45 43 54 20 28 53 45 4c 45  *   SELECT (SELE
7370: 43 54 20 63 6f 6c 20 46 52 4f 4d 20 74 62 6c 3b  CT col FROM tbl;
7380: 0a 2a 2a 20 20 20 53 45 4c 45 43 54 20 28 53 45  .**   SELECT (SE
7390: 4c 45 43 54 20 63 6f 6c 20 46 52 4f 4d 20 74 62  LECT col FROM tb
73a0: 6c 29 3b 0a 2a 2a 20 20 20 53 45 4c 45 43 54 20  l);.**   SELECT 
73b0: 61 62 63 20 46 52 4f 4d 20 28 53 45 4c 45 43 54  abc FROM (SELECT
73c0: 20 63 6f 6c 20 41 53 20 61 62 63 20 46 52 4f 4d   col AS abc FROM
73d0: 20 74 62 6c 29 3b 0a 2a 2a 20 0a 2a 2a 20 54 68   tbl);.** .** Th
73e0: 65 20 64 65 63 6c 61 72 61 74 69 6f 6e 20 74 79  e declaration ty
73f0: 70 65 20 66 6f 72 20 61 6e 79 20 65 78 70 72 65  pe for any expre
7400: 73 73 69 6f 6e 20 6f 74 68 65 72 20 74 68 61 6e  ssion other than
7410: 20 61 20 63 6f 6c 75 6d 6e 20 69 73 20 4e 55 4c   a column is NUL
7420: 4c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e  L..*/.static con
7430: 73 74 20 63 68 61 72 20 2a 63 6f 6c 75 6d 6e 54  st char *columnT
7440: 79 70 65 28 0a 20 20 4e 61 6d 65 43 6f 6e 74 65  ype(.  NameConte
7450: 78 74 20 2a 70 4e 43 2c 20 0a 20 20 45 78 70 72  xt *pNC, .  Expr
7460: 20 2a 70 45 78 70 72 2c 0a 20 20 63 6f 6e 73 74   *pExpr,.  const
7470: 20 63 68 61 72 20 2a 2a 70 7a 4f 72 69 67 69 6e   char **pzOrigin
7480: 44 62 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  Db,.  const char
7490: 20 2a 2a 70 7a 4f 72 69 67 69 6e 54 61 62 2c 0a   **pzOriginTab,.
74a0: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 2a 70    const char **p
74b0: 7a 4f 72 69 67 69 6e 43 6f 6c 0a 29 7b 0a 20 20  zOriginCol.){.  
74c0: 63 68 61 72 20 63 6f 6e 73 74 20 2a 7a 54 79 70  char const *zTyp
74d0: 65 20 3d 20 30 3b 0a 20 20 63 68 61 72 20 63 6f  e = 0;.  char co
74e0: 6e 73 74 20 2a 7a 4f 72 69 67 69 6e 44 62 20 3d  nst *zOriginDb =
74f0: 20 30 3b 0a 20 20 63 68 61 72 20 63 6f 6e 73 74   0;.  char const
7500: 20 2a 7a 4f 72 69 67 69 6e 54 61 62 20 3d 20 30   *zOriginTab = 0
7510: 3b 0a 20 20 63 68 61 72 20 63 6f 6e 73 74 20 2a  ;.  char const *
7520: 7a 4f 72 69 67 69 6e 43 6f 6c 20 3d 20 30 3b 0a  zOriginCol = 0;.
7530: 20 20 69 6e 74 20 6a 3b 0a 20 20 69 66 28 20 70    int j;.  if( p
7540: 45 78 70 72 3d 3d 30 20 7c 7c 20 70 4e 43 2d 3e  Expr==0 || pNC->
7550: 70 53 72 63 4c 69 73 74 3d 3d 30 20 29 20 72 65  pSrcList==0 ) re
7560: 74 75 72 6e 20 30 3b 0a 0a 20 20 73 77 69 74 63  turn 0;..  switc
7570: 68 28 20 70 45 78 70 72 2d 3e 6f 70 20 29 7b 0a  h( pExpr->op ){.
7580: 20 20 20 20 63 61 73 65 20 54 4b 5f 41 47 47 5f      case TK_AGG_
7590: 43 4f 4c 55 4d 4e 3a 0a 20 20 20 20 63 61 73 65  COLUMN:.    case
75a0: 20 54 4b 5f 43 4f 4c 55 4d 4e 3a 20 7b 0a 20 20   TK_COLUMN: {.  
75b0: 20 20 20 20 2f 2a 20 54 68 65 20 65 78 70 72 65      /* The expre
75c0: 73 73 69 6f 6e 20 69 73 20 61 20 63 6f 6c 75 6d  ssion is a colum
75d0: 6e 2e 20 4c 6f 63 61 74 65 20 74 68 65 20 74 61  n. Locate the ta
75e0: 62 6c 65 20 74 68 65 20 63 6f 6c 75 6d 6e 20 69  ble the column i
75f0: 73 20 62 65 69 6e 67 0a 20 20 20 20 20 20 2a 2a  s being.      **
7600: 20 65 78 74 72 61 63 74 65 64 20 66 72 6f 6d 20   extracted from 
7610: 69 6e 20 4e 61 6d 65 43 6f 6e 74 65 78 74 2e 70  in NameContext.p
7620: 53 72 63 4c 69 73 74 2e 20 54 68 69 73 20 74 61  SrcList. This ta
7630: 62 6c 65 20 6d 61 79 20 62 65 20 72 65 61 6c 0a  ble may be real.
7640: 20 20 20 20 20 20 2a 2a 20 64 61 74 61 62 61 73        ** databas
7650: 65 20 74 61 62 6c 65 20 6f 72 20 61 20 73 75 62  e table or a sub
7660: 71 75 65 72 79 2e 0a 20 20 20 20 20 20 2a 2f 0a  query..      */.
7670: 20 20 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61        Table *pTa
7680: 62 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  b = 0;          
7690: 20 20 2f 2a 20 54 61 62 6c 65 20 73 74 72 75 63    /* Table struc
76a0: 74 75 72 65 20 63 6f 6c 75 6d 6e 20 69 73 20 65  ture column is e
76b0: 78 74 72 61 63 74 65 64 20 66 72 6f 6d 20 2a 2f  xtracted from */
76c0: 0a 20 20 20 20 20 20 53 65 6c 65 63 74 20 2a 70  .      Select *p
76d0: 53 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  S = 0;          
76e0: 20 20 20 2f 2a 20 53 65 6c 65 63 74 20 74 68 65     /* Select the
76f0: 20 63 6f 6c 75 6d 6e 20 69 73 20 65 78 74 72 61   column is extra
7700: 63 74 65 64 20 66 72 6f 6d 20 2a 2f 0a 20 20 20  cted from */.   
7710: 20 20 20 69 6e 74 20 69 43 6f 6c 20 3d 20 70 45     int iCol = pE
7720: 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3b 20 20 2f  xpr->iColumn;  /
7730: 2a 20 49 6e 64 65 78 20 6f 66 20 63 6f 6c 75 6d  * Index of colum
7740: 6e 20 69 6e 20 70 54 61 62 20 2a 2f 0a 20 20 20  n in pTab */.   
7750: 20 20 20 77 68 69 6c 65 28 20 70 4e 43 20 26 26     while( pNC &&
7760: 20 21 70 54 61 62 20 29 7b 0a 20 20 20 20 20 20   !pTab ){.      
7770: 20 20 53 72 63 4c 69 73 74 20 2a 70 54 61 62 4c    SrcList *pTabL
7780: 69 73 74 20 3d 20 70 4e 43 2d 3e 70 53 72 63 4c  ist = pNC->pSrcL
7790: 69 73 74 3b 0a 20 20 20 20 20 20 20 20 66 6f 72  ist;.        for
77a0: 28 6a 3d 30 3b 6a 3c 70 54 61 62 4c 69 73 74 2d  (j=0;j<pTabList-
77b0: 3e 6e 53 72 63 20 26 26 20 70 54 61 62 4c 69 73  >nSrc && pTabLis
77c0: 74 2d 3e 61 5b 6a 5d 2e 69 43 75 72 73 6f 72 21  t->a[j].iCursor!
77d0: 3d 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 3b 6a  =pExpr->iTable;j
77e0: 2b 2b 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  ++);.        if(
77f0: 20 6a 3c 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72   j<pTabList->nSr
7800: 63 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70  c ){.          p
7810: 54 61 62 20 3d 20 70 54 61 62 4c 69 73 74 2d 3e  Tab = pTabList->
7820: 61 5b 6a 5d 2e 70 54 61 62 3b 0a 20 20 20 20 20  a[j].pTab;.     
7830: 20 20 20 20 20 70 53 20 3d 20 70 54 61 62 4c 69       pS = pTabLi
7840: 73 74 2d 3e 61 5b 6a 5d 2e 70 53 65 6c 65 63 74  st->a[j].pSelect
7850: 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  ;.        }else{
7860: 0a 20 20 20 20 20 20 20 20 20 20 70 4e 43 20 3d  .          pNC =
7870: 20 70 4e 43 2d 3e 70 4e 65 78 74 3b 0a 20 20 20   pNC->pNext;.   
7880: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 0a       }.      }..
7890: 20 20 20 20 20 20 69 66 28 20 70 54 61 62 3d 3d        if( pTab==
78a0: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  0 ){.        /* 
78b0: 46 49 58 20 4d 45 3a 0a 20 20 20 20 20 20 20 20  FIX ME:.        
78c0: 2a 2a 20 54 68 69 73 20 63 61 6e 20 6f 63 63 75  ** This can occu
78d0: 72 73 20 69 66 20 79 6f 75 20 68 61 76 65 20 73  rs if you have s
78e0: 6f 6d 65 74 68 69 6e 67 20 6c 69 6b 65 20 22 53  omething like "S
78f0: 45 4c 45 43 54 20 6e 65 77 2e 78 3b 22 20 69 6e  ELECT new.x;" in
7900: 73 69 64 65 0a 20 20 20 20 20 20 20 20 2a 2a 20  side.        ** 
7910: 61 20 74 72 69 67 67 65 72 2e 20 20 49 6e 20 6f  a trigger.  In o
7920: 74 68 65 72 20 77 6f 72 64 73 2c 20 69 66 20 79  ther words, if y
7930: 6f 75 20 72 65 66 65 72 65 6e 63 65 20 74 68 65  ou reference the
7940: 20 73 70 65 63 69 61 6c 20 22 6e 65 77 22 0a 20   special "new". 
7950: 20 20 20 20 20 20 20 2a 2a 20 74 61 62 6c 65 20         ** table 
7960: 69 6e 20 74 68 65 20 72 65 73 75 6c 74 20 73 65  in the result se
7970: 74 20 6f 66 20 61 20 73 65 6c 65 63 74 2e 20 20  t of a select.  
7980: 57 65 20 64 6f 20 6e 6f 74 20 68 61 76 65 20 61  We do not have a
7990: 20 67 6f 6f 64 20 77 61 79 0a 20 20 20 20 20 20   good way.      
79a0: 20 20 2a 2a 20 74 6f 20 66 69 6e 64 20 74 68 65    ** to find the
79b0: 20 61 63 74 75 61 6c 20 74 61 62 6c 65 20 74 79   actual table ty
79c0: 70 65 2c 20 73 6f 20 63 61 6c 6c 20 69 74 20 22  pe, so call it "
79d0: 54 45 58 54 22 2e 20 20 54 68 69 73 20 69 73 20  TEXT".  This is 
79e0: 72 65 61 6c 6c 79 0a 20 20 20 20 20 20 20 20 2a  really.        *
79f0: 2a 20 73 6f 6d 65 74 68 69 6e 67 20 6f 66 20 61  * something of a
7a00: 20 62 75 67 2c 20 62 75 74 20 49 20 64 6f 20 6e   bug, but I do n
7a10: 6f 74 20 6b 6e 6f 77 20 68 6f 77 20 74 6f 20 66  ot know how to f
7a20: 69 78 20 69 74 2e 0a 20 20 20 20 20 20 20 20 2a  ix it..        *
7a30: 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 54 68 69  *.        ** Thi
7a40: 73 20 63 6f 64 65 20 64 6f 65 73 20 6e 6f 74 20  s code does not 
7a50: 70 72 6f 64 75 63 65 20 74 68 65 20 63 6f 72 72  produce the corr
7a60: 65 63 74 20 61 6e 73 77 65 72 20 2d 20 69 74 20  ect answer - it 
7a70: 6a 75 73 74 20 70 72 65 76 65 6e 74 73 0a 20 20  just prevents.  
7a80: 20 20 20 20 20 20 2a 2a 20 61 20 73 65 67 66 61        ** a segfa
7a90: 75 6c 74 2e 20 20 53 65 65 20 74 69 63 6b 65 74  ult.  See ticket
7aa0: 20 23 31 32 32 39 2e 0a 20 20 20 20 20 20 20 20   #1229..        
7ab0: 2a 2f 0a 20 20 20 20 20 20 20 20 7a 54 79 70 65  */.        zType
7ac0: 20 3d 20 22 54 45 58 54 22 3b 0a 20 20 20 20 20   = "TEXT";.     
7ad0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
7ae0: 7d 0a 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  }..      assert(
7af0: 20 70 54 61 62 20 29 3b 0a 20 20 20 20 20 20 69   pTab );.      i
7b00: 66 28 20 70 53 20 29 7b 0a 20 20 20 20 20 20 20  f( pS ){.       
7b10: 20 2f 2a 20 54 68 65 20 22 74 61 62 6c 65 22 20   /* The "table" 
7b20: 69 73 20 61 63 74 75 61 6c 6c 79 20 61 20 73 75  is actually a su
7b30: 62 2d 73 65 6c 65 63 74 20 6f 72 20 61 20 76 69  b-select or a vi
7b40: 65 77 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63  ew in the FROM c
7b50: 6c 61 75 73 65 0a 20 20 20 20 20 20 20 20 2a 2a  lause.        **
7b60: 20 6f 66 20 74 68 65 20 53 45 4c 45 43 54 20 73   of the SELECT s
7b70: 74 61 74 65 6d 65 6e 74 2e 20 52 65 74 75 72 6e  tatement. Return
7b80: 20 74 68 65 20 64 65 63 6c 61 72 61 74 69 6f 6e   the declaration
7b90: 20 74 79 70 65 20 61 6e 64 20 6f 72 69 67 69 6e   type and origin
7ba0: 0a 20 20 20 20 20 20 20 20 2a 2a 20 64 61 74 61  .        ** data
7bb0: 20 66 6f 72 20 74 68 65 20 72 65 73 75 6c 74 2d   for the result-
7bc0: 73 65 74 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 68  set column of th
7bd0: 65 20 73 75 62 2d 73 65 6c 65 63 74 2e 0a 20 20  e sub-select..  
7be0: 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
7bf0: 20 69 66 28 20 69 43 6f 6c 3e 3d 30 20 26 26 20   if( iCol>=0 && 
7c00: 69 43 6f 6c 3c 70 53 2d 3e 70 45 4c 69 73 74 2d  iCol<pS->pEList-
7c10: 3e 6e 45 78 70 72 20 29 7b 0a 20 20 20 20 20 20  >nExpr ){.      
7c20: 20 20 20 20 2f 2a 20 49 66 20 69 43 6f 6c 20 69      /* If iCol i
7c30: 73 20 6c 65 73 73 20 74 68 61 6e 20 7a 65 72 6f  s less than zero
7c40: 2c 20 74 68 65 6e 20 74 68 65 20 65 78 70 72 65  , then the expre
7c50: 73 73 69 6f 6e 20 72 65 71 75 65 73 74 73 20 74  ssion requests t
7c60: 68 65 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  he.          ** 
7c70: 72 6f 77 69 64 20 6f 66 20 74 68 65 20 73 75 62  rowid of the sub
7c80: 2d 73 65 6c 65 63 74 20 6f 72 20 76 69 65 77 2e  -select or view.
7c90: 20 54 68 69 73 20 65 78 70 72 65 73 73 69 6f 6e   This expression
7ca0: 20 69 73 20 6c 65 67 61 6c 20 28 73 65 65 20 0a   is legal (see .
7cb0: 20 20 20 20 20 20 20 20 20 20 2a 2a 20 74 65 73            ** tes
7cc0: 74 20 63 61 73 65 20 6d 69 73 63 32 2e 32 2e 32  t case misc2.2.2
7cd0: 29 20 2d 20 69 74 20 61 6c 77 61 79 73 20 65 76  ) - it always ev
7ce0: 61 6c 75 61 74 65 73 20 74 6f 20 4e 55 4c 4c 2e  aluates to NULL.
7cf0: 0a 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  .          */.  
7d00: 20 20 20 20 20 20 20 20 4e 61 6d 65 43 6f 6e 74          NameCont
7d10: 65 78 74 20 73 4e 43 3b 0a 20 20 20 20 20 20 20  ext sNC;.       
7d20: 20 20 20 45 78 70 72 20 2a 70 20 3d 20 70 53 2d     Expr *p = pS-
7d30: 3e 70 45 4c 69 73 74 2d 3e 61 5b 69 43 6f 6c 5d  >pEList->a[iCol]
7d40: 2e 70 45 78 70 72 3b 0a 20 20 20 20 20 20 20 20  .pExpr;.        
7d50: 20 20 73 4e 43 2e 70 53 72 63 4c 69 73 74 20 3d    sNC.pSrcList =
7d60: 20 70 53 2d 3e 70 53 72 63 3b 0a 20 20 20 20 20   pS->pSrc;.     
7d70: 20 20 20 20 20 73 4e 43 2e 70 4e 65 78 74 20 3d       sNC.pNext =
7d80: 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 73 4e   0;.          sN
7d90: 43 2e 70 50 61 72 73 65 20 3d 20 70 4e 43 2d 3e  C.pParse = pNC->
7da0: 70 50 61 72 73 65 3b 0a 20 20 20 20 20 20 20 20  pParse;.        
7db0: 20 20 7a 54 79 70 65 20 3d 20 63 6f 6c 75 6d 6e    zType = column
7dc0: 54 79 70 65 28 26 73 4e 43 2c 20 70 2c 20 26 7a  Type(&sNC, p, &z
7dd0: 4f 72 69 67 69 6e 44 62 2c 20 26 7a 4f 72 69 67  OriginDb, &zOrig
7de0: 69 6e 54 61 62 2c 20 26 7a 4f 72 69 67 69 6e 43  inTab, &zOriginC
7df0: 6f 6c 29 3b 20 0a 20 20 20 20 20 20 20 20 7d 0a  ol); .        }.
7e00: 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
7e10: 70 54 61 62 2d 3e 70 53 63 68 65 6d 61 20 29 7b  pTab->pSchema ){
7e20: 0a 20 20 20 20 20 20 20 20 2f 2a 20 41 20 72 65  .        /* A re
7e30: 61 6c 20 74 61 62 6c 65 20 2a 2f 0a 20 20 20 20  al table */.    
7e40: 20 20 20 20 61 73 73 65 72 74 28 20 21 70 53 20      assert( !pS 
7e50: 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 69  );.        if( i
7e60: 43 6f 6c 3c 30 20 29 20 69 43 6f 6c 20 3d 20 70  Col<0 ) iCol = p
7e70: 54 61 62 2d 3e 69 50 4b 65 79 3b 0a 20 20 20 20  Tab->iPKey;.    
7e80: 20 20 20 20 61 73 73 65 72 74 28 20 69 43 6f 6c      assert( iCol
7e90: 3d 3d 2d 31 20 7c 7c 20 28 69 43 6f 6c 3e 3d 30  ==-1 || (iCol>=0
7ea0: 20 26 26 20 69 43 6f 6c 3c 70 54 61 62 2d 3e 6e   && iCol<pTab->n
7eb0: 43 6f 6c 29 20 29 3b 0a 20 20 20 20 20 20 20 20  Col) );.        
7ec0: 69 66 28 20 69 43 6f 6c 3c 30 20 29 7b 0a 20 20  if( iCol<0 ){.  
7ed0: 20 20 20 20 20 20 20 20 7a 54 79 70 65 20 3d 20          zType = 
7ee0: 22 49 4e 54 45 47 45 52 22 3b 0a 20 20 20 20 20  "INTEGER";.     
7ef0: 20 20 20 20 20 7a 4f 72 69 67 69 6e 43 6f 6c 20       zOriginCol 
7f00: 3d 20 22 72 6f 77 69 64 22 3b 0a 20 20 20 20 20  = "rowid";.     
7f10: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
7f20: 20 20 20 20 7a 54 79 70 65 20 3d 20 70 54 61 62      zType = pTab
7f30: 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 7a 54 79  ->aCol[iCol].zTy
7f40: 70 65 3b 0a 20 20 20 20 20 20 20 20 20 20 7a 4f  pe;.          zO
7f50: 72 69 67 69 6e 43 6f 6c 20 3d 20 70 54 61 62 2d  riginCol = pTab-
7f60: 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 7a 4e 61 6d  >aCol[iCol].zNam
7f70: 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  e;.        }.   
7f80: 20 20 20 20 20 7a 4f 72 69 67 69 6e 54 61 62 20       zOriginTab 
7f90: 3d 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 3b 0a 20  = pTab->zName;. 
7fa0: 20 20 20 20 20 20 20 69 66 28 20 70 4e 43 2d 3e         if( pNC->
7fb0: 70 50 61 72 73 65 20 29 7b 0a 20 20 20 20 20 20  pParse ){.      
7fc0: 20 20 20 20 69 6e 74 20 69 44 62 20 3d 20 73 71      int iDb = sq
7fd0: 6c 69 74 65 33 53 63 68 65 6d 61 54 6f 49 6e 64  lite3SchemaToInd
7fe0: 65 78 28 70 4e 43 2d 3e 70 50 61 72 73 65 2d 3e  ex(pNC->pParse->
7ff0: 64 62 2c 20 70 54 61 62 2d 3e 70 53 63 68 65 6d  db, pTab->pSchem
8000: 61 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7a 4f  a);.          zO
8010: 72 69 67 69 6e 44 62 20 3d 20 70 4e 43 2d 3e 70  riginDb = pNC->p
8020: 50 61 72 73 65 2d 3e 64 62 2d 3e 61 44 62 5b 69  Parse->db->aDb[i
8030: 44 62 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20  Db].zName;.     
8040: 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
8050: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
8060: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
8070: 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 20 20 20  MIT_SUBQUERY.   
8080: 20 63 61 73 65 20 54 4b 5f 53 45 4c 45 43 54 3a   case TK_SELECT:
8090: 20 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20   {.      /* The 
80a0: 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 61 20  expression is a 
80b0: 73 75 62 2d 73 65 6c 65 63 74 2e 20 52 65 74 75  sub-select. Retu
80c0: 72 6e 20 74 68 65 20 64 65 63 6c 61 72 61 74 69  rn the declarati
80d0: 6f 6e 20 74 79 70 65 20 61 6e 64 0a 20 20 20 20  on type and.    
80e0: 20 20 2a 2a 20 6f 72 69 67 69 6e 20 69 6e 66 6f    ** origin info
80f0: 20 66 6f 72 20 74 68 65 20 73 69 6e 67 6c 65 20   for the single 
8100: 63 6f 6c 75 6d 6e 20 69 6e 20 74 68 65 20 72 65  column in the re
8110: 73 75 6c 74 20 73 65 74 20 6f 66 20 74 68 65 20  sult set of the 
8120: 53 45 4c 45 43 54 0a 20 20 20 20 20 20 2a 2a 20  SELECT.      ** 
8130: 73 74 61 74 65 6d 65 6e 74 2e 0a 20 20 20 20 20  statement..     
8140: 20 2a 2f 0a 20 20 20 20 20 20 4e 61 6d 65 43 6f   */.      NameCo
8150: 6e 74 65 78 74 20 73 4e 43 3b 0a 20 20 20 20 20  ntext sNC;.     
8160: 20 53 65 6c 65 63 74 20 2a 70 53 20 3d 20 70 45   Select *pS = pE
8170: 78 70 72 2d 3e 70 53 65 6c 65 63 74 3b 0a 20 20  xpr->pSelect;.  
8180: 20 20 20 20 45 78 70 72 20 2a 70 20 3d 20 70 53      Expr *p = pS
8190: 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70  ->pEList->a[0].p
81a0: 45 78 70 72 3b 0a 20 20 20 20 20 20 73 4e 43 2e  Expr;.      sNC.
81b0: 70 53 72 63 4c 69 73 74 20 3d 20 70 53 2d 3e 70  pSrcList = pS->p
81c0: 53 72 63 3b 0a 20 20 20 20 20 20 73 4e 43 2e 70  Src;.      sNC.p
81d0: 4e 65 78 74 20 3d 20 70 4e 43 3b 0a 20 20 20 20  Next = pNC;.    
81e0: 20 20 73 4e 43 2e 70 50 61 72 73 65 20 3d 20 70    sNC.pParse = p
81f0: 4e 43 2d 3e 70 50 61 72 73 65 3b 0a 20 20 20 20  NC->pParse;.    
8200: 20 20 7a 54 79 70 65 20 3d 20 63 6f 6c 75 6d 6e    zType = column
8210: 54 79 70 65 28 26 73 4e 43 2c 20 70 2c 20 26 7a  Type(&sNC, p, &z
8220: 4f 72 69 67 69 6e 44 62 2c 20 26 7a 4f 72 69 67  OriginDb, &zOrig
8230: 69 6e 54 61 62 2c 20 26 7a 4f 72 69 67 69 6e 43  inTab, &zOriginC
8240: 6f 6c 29 3b 20 0a 20 20 20 20 20 20 62 72 65 61  ol); .      brea
8250: 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  k;.    }.#endif.
8260: 20 20 7d 0a 20 20 0a 20 20 69 66 28 20 70 7a 4f    }.  .  if( pzO
8270: 72 69 67 69 6e 44 62 20 29 7b 0a 20 20 20 20 61  riginDb ){.    a
8280: 73 73 65 72 74 28 20 70 7a 4f 72 69 67 69 6e 54  ssert( pzOriginT
8290: 61 62 20 26 26 20 70 7a 4f 72 69 67 69 6e 43 6f  ab && pzOriginCo
82a0: 6c 20 29 3b 0a 20 20 20 20 2a 70 7a 4f 72 69 67  l );.    *pzOrig
82b0: 69 6e 44 62 20 3d 20 7a 4f 72 69 67 69 6e 44 62  inDb = zOriginDb
82c0: 3b 0a 20 20 20 20 2a 70 7a 4f 72 69 67 69 6e 54  ;.    *pzOriginT
82d0: 61 62 20 3d 20 7a 4f 72 69 67 69 6e 54 61 62 3b  ab = zOriginTab;
82e0: 0a 20 20 20 20 2a 70 7a 4f 72 69 67 69 6e 43 6f  .    *pzOriginCo
82f0: 6c 20 3d 20 7a 4f 72 69 67 69 6e 43 6f 6c 3b 0a  l = zOriginCol;.
8300: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 7a 54 79    }.  return zTy
8310: 70 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e  pe;.}../*.** Gen
8320: 65 72 61 74 65 20 63 6f 64 65 20 74 68 61 74 20  erate code that 
8330: 77 69 6c 6c 20 74 65 6c 6c 20 74 68 65 20 56 44  will tell the VD
8340: 42 45 20 74 68 65 20 64 65 63 6c 61 72 61 74 69  BE the declarati
8350: 6f 6e 20 74 79 70 65 73 20 6f 66 20 63 6f 6c 75  on types of colu
8360: 6d 6e 73 0a 2a 2a 20 69 6e 20 74 68 65 20 72 65  mns.** in the re
8370: 73 75 6c 74 20 73 65 74 2e 0a 2a 2f 0a 73 74 61  sult set..*/.sta
8380: 74 69 63 20 76 6f 69 64 20 67 65 6e 65 72 61 74  tic void generat
8390: 65 43 6f 6c 75 6d 6e 54 79 70 65 73 28 0a 20 20  eColumnTypes(.  
83a0: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
83b0: 20 20 20 20 2f 2a 20 50 61 72 73 65 72 20 63 6f      /* Parser co
83c0: 6e 74 65 78 74 20 2a 2f 0a 20 20 53 72 63 4c 69  ntext */.  SrcLi
83d0: 73 74 20 2a 70 54 61 62 4c 69 73 74 2c 20 20 2f  st *pTabList,  /
83e0: 2a 20 4c 69 73 74 20 6f 66 20 74 61 62 6c 65 73  * List of tables
83f0: 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a   */.  ExprList *
8400: 70 45 4c 69 73 74 20 20 20 20 2f 2a 20 45 78 70  pEList    /* Exp
8410: 72 65 73 73 69 6f 6e 73 20 64 65 66 69 6e 69 6e  ressions definin
8420: 67 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74  g the result set
8430: 20 2a 2f 0a 29 7b 0a 23 69 66 6e 64 65 66 20 53   */.){.#ifndef S
8440: 51 4c 49 54 45 5f 4f 4d 49 54 5f 44 45 43 4c 54  QLITE_OMIT_DECLT
8450: 59 50 45 0a 20 20 56 64 62 65 20 2a 76 20 3d 20  YPE.  Vdbe *v = 
8460: 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20  pParse->pVdbe;. 
8470: 20 69 6e 74 20 69 3b 0a 20 20 4e 61 6d 65 43 6f   int i;.  NameCo
8480: 6e 74 65 78 74 20 73 4e 43 3b 0a 20 20 73 4e 43  ntext sNC;.  sNC
8490: 2e 70 53 72 63 4c 69 73 74 20 3d 20 70 54 61 62  .pSrcList = pTab
84a0: 4c 69 73 74 3b 0a 20 20 73 4e 43 2e 70 50 61 72  List;.  sNC.pPar
84b0: 73 65 20 3d 20 70 50 61 72 73 65 3b 0a 20 20 66  se = pParse;.  f
84c0: 6f 72 28 69 3d 30 3b 20 69 3c 70 45 4c 69 73 74  or(i=0; i<pEList
84d0: 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20  ->nExpr; i++){. 
84e0: 20 20 20 45 78 70 72 20 2a 70 20 3d 20 70 45 4c     Expr *p = pEL
84f0: 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 3b  ist->a[i].pExpr;
8500: 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20  .    const char 
8510: 2a 7a 54 79 70 65 3b 0a 23 69 66 64 65 66 20 53  *zType;.#ifdef S
8520: 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 43 4f 4c  QLITE_ENABLE_COL
8530: 55 4d 4e 5f 4d 45 54 41 44 41 54 41 0a 20 20 20  UMN_METADATA.   
8540: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4f 72   const char *zOr
8550: 69 67 44 62 20 3d 20 30 3b 0a 20 20 20 20 63 6f  igDb = 0;.    co
8560: 6e 73 74 20 63 68 61 72 20 2a 7a 4f 72 69 67 54  nst char *zOrigT
8570: 61 62 20 3d 20 30 3b 0a 20 20 20 20 63 6f 6e 73  ab = 0;.    cons
8580: 74 20 63 68 61 72 20 2a 7a 4f 72 69 67 43 6f 6c  t char *zOrigCol
8590: 20 3d 20 30 3b 0a 20 20 20 20 7a 54 79 70 65 20   = 0;.    zType 
85a0: 3d 20 63 6f 6c 75 6d 6e 54 79 70 65 28 26 73 4e  = columnType(&sN
85b0: 43 2c 20 70 2c 20 26 7a 4f 72 69 67 44 62 2c 20  C, p, &zOrigDb, 
85c0: 26 7a 4f 72 69 67 54 61 62 2c 20 26 7a 4f 72 69  &zOrigTab, &zOri
85d0: 67 43 6f 6c 29 3b 0a 0a 20 20 20 20 2f 2a 20 54  gCol);..    /* T
85e0: 68 65 20 76 64 62 65 20 6d 75 73 74 20 6d 61 6b  he vdbe must mak
85f0: 65 20 69 74 73 20 6f 77 6e 20 63 6f 70 79 20 6f  e its own copy o
8600: 66 20 74 68 65 20 63 6f 6c 75 6d 6e 2d 74 79 70  f the column-typ
8610: 65 20 61 6e 64 20 6f 74 68 65 72 20 0a 20 20 20  e and other .   
8620: 20 2a 2a 20 63 6f 6c 75 6d 6e 20 73 70 65 63 69   ** column speci
8630: 66 69 63 20 73 74 72 69 6e 67 73 2c 20 69 6e 20  fic strings, in 
8640: 63 61 73 65 20 74 68 65 20 73 63 68 65 6d 61 20  case the schema 
8650: 69 73 20 72 65 73 65 74 20 62 65 66 6f 72 65 20  is reset before 
8660: 74 68 69 73 0a 20 20 20 20 2a 2a 20 76 69 72 74  this.    ** virt
8670: 75 61 6c 20 6d 61 63 68 69 6e 65 20 69 73 20 64  ual machine is d
8680: 65 6c 65 74 65 64 2e 0a 20 20 20 20 2a 2f 0a 20  eleted..    */. 
8690: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 53 65     sqlite3VdbeSe
86a0: 74 43 6f 6c 4e 61 6d 65 28 76 2c 20 69 2c 20 43  tColName(v, i, C
86b0: 4f 4c 4e 41 4d 45 5f 44 41 54 41 42 41 53 45 2c  OLNAME_DATABASE,
86c0: 20 7a 4f 72 69 67 44 62 2c 20 50 34 5f 54 52 41   zOrigDb, P4_TRA
86d0: 4e 53 49 45 4e 54 29 3b 0a 20 20 20 20 73 71 6c  NSIENT);.    sql
86e0: 69 74 65 33 56 64 62 65 53 65 74 43 6f 6c 4e 61  ite3VdbeSetColNa
86f0: 6d 65 28 76 2c 20 69 2c 20 43 4f 4c 4e 41 4d 45  me(v, i, COLNAME
8700: 5f 54 41 42 4c 45 2c 20 7a 4f 72 69 67 54 61 62  _TABLE, zOrigTab
8710: 2c 20 50 34 5f 54 52 41 4e 53 49 45 4e 54 29 3b  , P4_TRANSIENT);
8720: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
8730: 53 65 74 43 6f 6c 4e 61 6d 65 28 76 2c 20 69 2c  SetColName(v, i,
8740: 20 43 4f 4c 4e 41 4d 45 5f 43 4f 4c 55 4d 4e 2c   COLNAME_COLUMN,
8750: 20 7a 4f 72 69 67 43 6f 6c 2c 20 50 34 5f 54 52   zOrigCol, P4_TR
8760: 41 4e 53 49 45 4e 54 29 3b 0a 23 65 6c 73 65 0a  ANSIENT);.#else.
8770: 20 20 20 20 7a 54 79 70 65 20 3d 20 63 6f 6c 75      zType = colu
8780: 6d 6e 54 79 70 65 28 26 73 4e 43 2c 20 70 2c 20  mnType(&sNC, p, 
8790: 30 2c 20 30 2c 20 30 29 3b 0a 23 65 6e 64 69 66  0, 0, 0);.#endif
87a0: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
87b0: 53 65 74 43 6f 6c 4e 61 6d 65 28 76 2c 20 69 2c  SetColName(v, i,
87c0: 20 43 4f 4c 4e 41 4d 45 5f 44 45 43 4c 54 59 50   COLNAME_DECLTYP
87d0: 45 2c 20 7a 54 79 70 65 2c 20 50 34 5f 54 52 41  E, zType, P4_TRA
87e0: 4e 53 49 45 4e 54 29 3b 0a 20 20 7d 0a 23 65 6e  NSIENT);.  }.#en
87f0: 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d  dif /* SQLITE_OM
8800: 49 54 5f 44 45 43 4c 54 59 50 45 20 2a 2f 0a 7d  IT_DECLTYPE */.}
8810: 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65  ../*.** Generate
8820: 20 63 6f 64 65 20 74 68 61 74 20 77 69 6c 6c 20   code that will 
8830: 74 65 6c 6c 20 74 68 65 20 56 44 42 45 20 74 68  tell the VDBE th
8840: 65 20 6e 61 6d 65 73 20 6f 66 20 63 6f 6c 75 6d  e names of colum
8850: 6e 73 0a 2a 2a 20 69 6e 20 74 68 65 20 72 65 73  ns.** in the res
8860: 75 6c 74 20 73 65 74 2e 20 20 54 68 69 73 20 69  ult set.  This i
8870: 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 73 20 75 73  nformation is us
8880: 65 64 20 74 6f 20 70 72 6f 76 69 64 65 20 74 68  ed to provide th
8890: 65 0a 2a 2a 20 61 7a 43 6f 6c 5b 5d 20 76 61 6c  e.** azCol[] val
88a0: 75 65 73 20 69 6e 20 74 68 65 20 63 61 6c 6c 62  ues in the callb
88b0: 61 63 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ack..*/.static v
88c0: 6f 69 64 20 67 65 6e 65 72 61 74 65 43 6f 6c 75  oid generateColu
88d0: 6d 6e 4e 61 6d 65 73 28 0a 20 20 50 61 72 73 65  mnNames(.  Parse
88e0: 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 2f   *pParse,      /
88f0: 2a 20 50 61 72 73 65 72 20 63 6f 6e 74 65 78 74  * Parser context
8900: 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a 70   */.  SrcList *p
8910: 54 61 62 4c 69 73 74 2c 20 20 2f 2a 20 4c 69 73  TabList,  /* Lis
8920: 74 20 6f 66 20 74 61 62 6c 65 73 20 2a 2f 0a 20  t of tables */. 
8930: 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73   ExprList *pELis
8940: 74 20 20 20 20 2f 2a 20 45 78 70 72 65 73 73 69  t    /* Expressi
8950: 6f 6e 73 20 64 65 66 69 6e 69 6e 67 20 74 68 65  ons defining the
8960: 20 72 65 73 75 6c 74 20 73 65 74 20 2a 2f 0a 29   result set */.)
8970: 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50  {.  Vdbe *v = pP
8980: 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69  arse->pVdbe;.  i
8990: 6e 74 20 69 2c 20 6a 3b 0a 20 20 73 71 6c 69 74  nt i, j;.  sqlit
89a0: 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d  e3 *db = pParse-
89b0: 3e 64 62 3b 0a 20 20 69 6e 74 20 66 75 6c 6c 4e  >db;.  int fullN
89c0: 61 6d 65 73 2c 20 73 68 6f 72 74 4e 61 6d 65 73  ames, shortNames
89d0: 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  ;..#ifndef SQLIT
89e0: 45 5f 4f 4d 49 54 5f 45 58 50 4c 41 49 4e 0a 20  E_OMIT_EXPLAIN. 
89f0: 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20 61   /* If this is a
8a00: 6e 20 45 58 50 4c 41 49 4e 2c 20 73 6b 69 70 20  n EXPLAIN, skip 
8a10: 74 68 69 73 20 73 74 65 70 20 2a 2f 0a 20 20 69  this step */.  i
8a20: 66 28 20 70 50 61 72 73 65 2d 3e 65 78 70 6c 61  f( pParse->expla
8a30: 69 6e 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  in ){.    return
8a40: 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20  ;.  }.#endif..  
8a50: 61 73 73 65 72 74 28 20 76 21 3d 30 20 29 3b 0a  assert( v!=0 );.
8a60: 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 63 6f    if( pParse->co
8a70: 6c 4e 61 6d 65 73 53 65 74 20 7c 7c 20 76 3d 3d  lNamesSet || v==
8a80: 30 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46  0 || db->mallocF
8a90: 61 69 6c 65 64 20 29 20 72 65 74 75 72 6e 3b 0a  ailed ) return;.
8aa0: 20 20 70 50 61 72 73 65 2d 3e 63 6f 6c 4e 61 6d    pParse->colNam
8ab0: 65 73 53 65 74 20 3d 20 31 3b 0a 20 20 66 75 6c  esSet = 1;.  ful
8ac0: 6c 4e 61 6d 65 73 20 3d 20 28 64 62 2d 3e 66 6c  lNames = (db->fl
8ad0: 61 67 73 20 26 20 53 51 4c 49 54 45 5f 46 75 6c  ags & SQLITE_Ful
8ae0: 6c 43 6f 6c 4e 61 6d 65 73 29 21 3d 30 3b 0a 20  lColNames)!=0;. 
8af0: 20 73 68 6f 72 74 4e 61 6d 65 73 20 3d 20 28 64   shortNames = (d
8b00: 62 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49 54  b->flags & SQLIT
8b10: 45 5f 53 68 6f 72 74 43 6f 6c 4e 61 6d 65 73 29  E_ShortColNames)
8b20: 21 3d 30 3b 0a 20 20 73 71 6c 69 74 65 33 56 64  !=0;.  sqlite3Vd
8b30: 62 65 53 65 74 4e 75 6d 43 6f 6c 73 28 76 2c 20  beSetNumCols(v, 
8b40: 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 29 3b 0a  pEList->nExpr);.
8b50: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 45 4c    for(i=0; i<pEL
8b60: 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29  ist->nExpr; i++)
8b70: 7b 0a 20 20 20 20 45 78 70 72 20 2a 70 3b 0a 20  {.    Expr *p;. 
8b80: 20 20 20 70 20 3d 20 70 45 4c 69 73 74 2d 3e 61     p = pEList->a
8b90: 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 69  [i].pExpr;.    i
8ba0: 66 28 20 70 3d 3d 30 20 29 20 63 6f 6e 74 69 6e  f( p==0 ) contin
8bb0: 75 65 3b 0a 20 20 20 20 69 66 28 20 70 45 4c 69  ue;.    if( pELi
8bc0: 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 20 29  st->a[i].zName )
8bd0: 7b 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a 4e  {.      char *zN
8be0: 61 6d 65 20 3d 20 70 45 4c 69 73 74 2d 3e 61 5b  ame = pEList->a[
8bf0: 69 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20  i].zName;.      
8c00: 73 71 6c 69 74 65 33 56 64 62 65 53 65 74 43 6f  sqlite3VdbeSetCo
8c10: 6c 4e 61 6d 65 28 76 2c 20 69 2c 20 43 4f 4c 4e  lName(v, i, COLN
8c20: 41 4d 45 5f 4e 41 4d 45 2c 20 7a 4e 61 6d 65 2c  AME_NAME, zName,
8c30: 20 73 74 72 6c 65 6e 28 7a 4e 61 6d 65 29 29 3b   strlen(zName));
8c40: 0a 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b  .      continue;
8c50: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70  .    }.    if( p
8c60: 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20  ->op==TK_COLUMN 
8c70: 26 26 20 70 54 61 62 4c 69 73 74 20 29 7b 0a 20  && pTabList ){. 
8c80: 20 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62       Table *pTab
8c90: 3b 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a 43  ;.      char *zC
8ca0: 6f 6c 3b 0a 20 20 20 20 20 20 69 6e 74 20 69 43  ol;.      int iC
8cb0: 6f 6c 20 3d 20 70 2d 3e 69 43 6f 6c 75 6d 6e 3b  ol = p->iColumn;
8cc0: 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20  .      for(j=0; 
8cd0: 6a 3c 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63  j<pTabList->nSrc
8ce0: 20 26 26 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b   && pTabList->a[
8cf0: 6a 5d 2e 69 43 75 72 73 6f 72 21 3d 70 2d 3e 69  j].iCursor!=p->i
8d00: 54 61 62 6c 65 3b 20 6a 2b 2b 29 7b 7d 0a 20 20  Table; j++){}.  
8d10: 20 20 20 20 61 73 73 65 72 74 28 20 6a 3c 70 54      assert( j<pT
8d20: 61 62 4c 69 73 74 2d 3e 6e 53 72 63 20 29 3b 0a  abList->nSrc );.
8d30: 20 20 20 20 20 20 70 54 61 62 20 3d 20 70 54 61        pTab = pTa
8d40: 62 4c 69 73 74 2d 3e 61 5b 6a 5d 2e 70 54 61 62  bList->a[j].pTab
8d50: 3b 0a 20 20 20 20 20 20 69 66 28 20 69 43 6f 6c  ;.      if( iCol
8d60: 3c 30 20 29 20 69 43 6f 6c 20 3d 20 70 54 61 62  <0 ) iCol = pTab
8d70: 2d 3e 69 50 4b 65 79 3b 0a 20 20 20 20 20 20 61  ->iPKey;.      a
8d80: 73 73 65 72 74 28 20 69 43 6f 6c 3d 3d 2d 31 20  ssert( iCol==-1 
8d90: 7c 7c 20 28 69 43 6f 6c 3e 3d 30 20 26 26 20 69  || (iCol>=0 && i
8da0: 43 6f 6c 3c 70 54 61 62 2d 3e 6e 43 6f 6c 29 20  Col<pTab->nCol) 
8db0: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 69 43 6f  );.      if( iCo
8dc0: 6c 3c 30 20 29 7b 0a 20 20 20 20 20 20 20 20 7a  l<0 ){.        z
8dd0: 43 6f 6c 20 3d 20 22 72 6f 77 69 64 22 3b 0a 20  Col = "rowid";. 
8de0: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
8df0: 20 20 20 20 7a 43 6f 6c 20 3d 20 70 54 61 62 2d      zCol = pTab-
8e00: 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 7a 4e 61 6d  >aCol[iCol].zNam
8e10: 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  e;.      }.     
8e20: 20 69 66 28 20 21 73 68 6f 72 74 4e 61 6d 65 73   if( !shortNames
8e30: 20 26 26 20 21 66 75 6c 6c 4e 61 6d 65 73 20 26   && !fullNames &
8e40: 26 20 70 2d 3e 73 70 61 6e 2e 7a 20 26 26 20 70  & p->span.z && p
8e50: 2d 3e 73 70 61 6e 2e 7a 5b 30 5d 20 29 7b 0a 20  ->span.z[0] ){. 
8e60: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
8e70: 62 65 53 65 74 43 6f 6c 4e 61 6d 65 28 76 2c 20  beSetColName(v, 
8e80: 69 2c 20 43 4f 4c 4e 41 4d 45 5f 4e 41 4d 45 2c  i, COLNAME_NAME,
8e90: 20 28 63 68 61 72 2a 29 70 2d 3e 73 70 61 6e 2e   (char*)p->span.
8ea0: 7a 2c 20 70 2d 3e 73 70 61 6e 2e 6e 29 3b 0a 20  z, p->span.n);. 
8eb0: 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 66       }else if( f
8ec0: 75 6c 6c 4e 61 6d 65 73 20 7c 7c 20 28 21 73 68  ullNames || (!sh
8ed0: 6f 72 74 4e 61 6d 65 73 20 26 26 20 70 54 61 62  ortNames && pTab
8ee0: 4c 69 73 74 2d 3e 6e 53 72 63 3e 31 29 20 29 7b  List->nSrc>1) ){
8ef0: 0a 20 20 20 20 20 20 20 20 63 68 61 72 20 2a 7a  .        char *z
8f00: 4e 61 6d 65 20 3d 20 30 3b 0a 20 20 20 20 20 20  Name = 0;.      
8f10: 20 20 63 68 61 72 20 2a 7a 54 61 62 3b 0a 20 0a    char *zTab;. .
8f20: 20 20 20 20 20 20 20 20 7a 54 61 62 20 3d 20 70          zTab = p
8f30: 54 61 62 4c 69 73 74 2d 3e 61 5b 6a 5d 2e 7a 41  TabList->a[j].zA
8f40: 6c 69 61 73 3b 0a 20 20 20 20 20 20 20 20 69 66  lias;.        if
8f50: 28 20 66 75 6c 6c 4e 61 6d 65 73 20 7c 7c 20 7a  ( fullNames || z
8f60: 54 61 62 3d 3d 30 20 29 20 7a 54 61 62 20 3d 20  Tab==0 ) zTab = 
8f70: 70 54 61 62 2d 3e 7a 4e 61 6d 65 3b 0a 20 20 20  pTab->zName;.   
8f80: 20 20 20 20 20 73 71 6c 69 74 65 33 53 65 74 53       sqlite3SetS
8f90: 74 72 69 6e 67 28 26 7a 4e 61 6d 65 2c 20 7a 54  tring(&zName, zT
8fa0: 61 62 2c 20 22 2e 22 2c 20 7a 43 6f 6c 2c 20 28  ab, ".", zCol, (
8fb0: 63 68 61 72 2a 29 30 29 3b 0a 20 20 20 20 20 20  char*)0);.      
8fc0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 74    sqlite3VdbeSet
8fd0: 43 6f 6c 4e 61 6d 65 28 76 2c 20 69 2c 20 43 4f  ColName(v, i, CO
8fe0: 4c 4e 41 4d 45 5f 4e 41 4d 45 2c 20 7a 4e 61 6d  LNAME_NAME, zNam
8ff0: 65 2c 20 50 34 5f 44 59 4e 41 4d 49 43 29 3b 0a  e, P4_DYNAMIC);.
9000: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
9010: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
9020: 53 65 74 43 6f 6c 4e 61 6d 65 28 76 2c 20 69 2c  SetColName(v, i,
9030: 20 43 4f 4c 4e 41 4d 45 5f 4e 41 4d 45 2c 20 7a   COLNAME_NAME, z
9040: 43 6f 6c 2c 20 73 74 72 6c 65 6e 28 7a 43 6f 6c  Col, strlen(zCol
9050: 29 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ));.      }.    
9060: 7d 65 6c 73 65 20 69 66 28 20 70 2d 3e 73 70 61  }else if( p->spa
9070: 6e 2e 7a 20 26 26 20 70 2d 3e 73 70 61 6e 2e 7a  n.z && p->span.z
9080: 5b 30 5d 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  [0] ){.      sql
9090: 69 74 65 33 56 64 62 65 53 65 74 43 6f 6c 4e 61  ite3VdbeSetColNa
90a0: 6d 65 28 76 2c 20 69 2c 20 43 4f 4c 4e 41 4d 45  me(v, i, COLNAME
90b0: 5f 4e 41 4d 45 2c 20 28 63 68 61 72 2a 29 70 2d  _NAME, (char*)p-
90c0: 3e 73 70 61 6e 2e 7a 2c 20 70 2d 3e 73 70 61 6e  >span.z, p->span
90d0: 2e 6e 29 3b 0a 20 20 20 20 20 20 2f 2a 20 73 71  .n);.      /* sq
90e0: 6c 69 74 65 33 56 64 62 65 43 6f 6d 70 72 65 73  lite3VdbeCompres
90f0: 73 53 70 61 63 65 28 76 2c 20 61 64 64 72 29 3b  sSpace(v, addr);
9100: 20 2a 2f 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20   */.    }else{. 
9110: 20 20 20 20 20 63 68 61 72 20 7a 4e 61 6d 65 5b       char zName[
9120: 33 30 5d 3b 0a 20 20 20 20 20 20 61 73 73 65 72  30];.      asser
9130: 74 28 20 70 2d 3e 6f 70 21 3d 54 4b 5f 43 4f 4c  t( p->op!=TK_COL
9140: 55 4d 4e 20 7c 7c 20 70 54 61 62 4c 69 73 74 3d  UMN || pTabList=
9150: 3d 30 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  =0 );.      sqli
9160: 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a  te3_snprintf(siz
9170: 65 6f 66 28 7a 4e 61 6d 65 29 2c 20 7a 4e 61 6d  eof(zName), zNam
9180: 65 2c 20 22 63 6f 6c 75 6d 6e 25 64 22 2c 20 69  e, "column%d", i
9190: 2b 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  +1);.      sqlit
91a0: 65 33 56 64 62 65 53 65 74 43 6f 6c 4e 61 6d 65  e3VdbeSetColName
91b0: 28 76 2c 20 69 2c 20 43 4f 4c 4e 41 4d 45 5f 4e  (v, i, COLNAME_N
91c0: 41 4d 45 2c 20 7a 4e 61 6d 65 2c 20 30 29 3b 0a  AME, zName, 0);.
91d0: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 67 65 6e 65      }.  }.  gene
91e0: 72 61 74 65 43 6f 6c 75 6d 6e 54 79 70 65 73 28  rateColumnTypes(
91f0: 70 50 61 72 73 65 2c 20 70 54 61 62 4c 69 73 74  pParse, pTabList
9200: 2c 20 70 45 4c 69 73 74 29 3b 0a 7d 0a 0a 23 69  , pEList);.}..#i
9210: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
9220: 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45 43  T_COMPOUND_SELEC
9230: 54 0a 2f 2a 0a 2a 2a 20 4e 61 6d 65 20 6f 66 20  T./*.** Name of 
9240: 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 6f  the connection o
9250: 70 65 72 61 74 6f 72 2c 20 75 73 65 64 20 66 6f  perator, used fo
9260: 72 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 73  r error messages
9270: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73  ..*/.static cons
9280: 74 20 63 68 61 72 20 2a 73 65 6c 65 63 74 4f 70  t char *selectOp
9290: 4e 61 6d 65 28 69 6e 74 20 69 64 29 7b 0a 20 20  Name(int id){.  
92a0: 63 68 61 72 20 2a 7a 3b 0a 20 20 73 77 69 74 63  char *z;.  switc
92b0: 68 28 20 69 64 20 29 7b 0a 20 20 20 20 63 61 73  h( id ){.    cas
92c0: 65 20 54 4b 5f 41 4c 4c 3a 20 20 20 20 20 20 20  e TK_ALL:       
92d0: 7a 20 3d 20 22 55 4e 49 4f 4e 20 41 4c 4c 22 3b  z = "UNION ALL";
92e0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61     break;.    ca
92f0: 73 65 20 54 4b 5f 49 4e 54 45 52 53 45 43 54 3a  se TK_INTERSECT:
9300: 20 7a 20 3d 20 22 49 4e 54 45 52 53 45 43 54 22   z = "INTERSECT"
9310: 3b 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63  ;   break;.    c
9320: 61 73 65 20 54 4b 5f 45 58 43 45 50 54 3a 20 20  ase TK_EXCEPT:  
9330: 20 20 7a 20 3d 20 22 45 58 43 45 50 54 22 3b 20    z = "EXCEPT"; 
9340: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
9350: 64 65 66 61 75 6c 74 3a 20 20 20 20 20 20 20 20  default:        
9360: 20 20 20 7a 20 3d 20 22 55 4e 49 4f 4e 22 3b 20     z = "UNION"; 
9370: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d        break;.  }
9380: 0a 20 20 72 65 74 75 72 6e 20 7a 3b 0a 7d 0a 23  .  return z;.}.#
9390: 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
93a0: 4f 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45  OMIT_COMPOUND_SE
93b0: 4c 45 43 54 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 46  LECT */../*.** F
93c0: 6f 72 77 61 72 64 20 64 65 63 6c 61 72 61 74 69  orward declarati
93d0: 6f 6e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  on.*/.static int
93e0: 20 70 72 65 70 53 65 6c 65 63 74 53 74 6d 74 28   prepSelectStmt(
93f0: 50 61 72 73 65 2a 2c 20 53 65 6c 65 63 74 2a 29  Parse*, Select*)
9400: 3b 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20 61  ;../*.** Given a
9410: 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
9420: 74 2c 20 67 65 6e 65 72 61 74 65 20 61 20 54 61  t, generate a Ta
9430: 62 6c 65 20 73 74 72 75 63 74 75 72 65 20 74 68  ble structure th
9440: 61 74 20 64 65 73 63 72 69 62 65 73 0a 2a 2a 20  at describes.** 
9450: 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 20 6f  the result set o
9460: 66 20 74 68 61 74 20 53 45 4c 45 43 54 2e 0a 2a  f that SELECT..*
9470: 2f 0a 54 61 62 6c 65 20 2a 73 71 6c 69 74 65 33  /.Table *sqlite3
9480: 52 65 73 75 6c 74 53 65 74 4f 66 53 65 6c 65 63  ResultSetOfSelec
9490: 74 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  t(Parse *pParse,
94a0: 20 63 68 61 72 20 2a 7a 54 61 62 4e 61 6d 65 2c   char *zTabName,
94b0: 20 53 65 6c 65 63 74 20 2a 70 53 65 6c 65 63 74   Select *pSelect
94c0: 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62  ){.  Table *pTab
94d0: 3b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20  ;.  int i, j;.  
94e0: 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74  ExprList *pEList
94f0: 3b 0a 20 20 43 6f 6c 75 6d 6e 20 2a 61 43 6f 6c  ;.  Column *aCol
9500: 2c 20 2a 70 43 6f 6c 3b 0a 20 20 73 71 6c 69 74  , *pCol;.  sqlit
9510: 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d  e3 *db = pParse-
9520: 3e 64 62 3b 0a 0a 20 20 77 68 69 6c 65 28 20 70  >db;..  while( p
9530: 53 65 6c 65 63 74 2d 3e 70 50 72 69 6f 72 20 29  Select->pPrior )
9540: 20 70 53 65 6c 65 63 74 20 3d 20 70 53 65 6c 65   pSelect = pSele
9550: 63 74 2d 3e 70 50 72 69 6f 72 3b 0a 20 20 69 66  ct->pPrior;.  if
9560: 28 20 70 72 65 70 53 65 6c 65 63 74 53 74 6d 74  ( prepSelectStmt
9570: 28 70 50 61 72 73 65 2c 20 70 53 65 6c 65 63 74  (pParse, pSelect
9580: 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  ) ){.    return 
9590: 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 73 71 6c  0;.  }.  if( sql
95a0: 69 74 65 33 53 65 6c 65 63 74 52 65 73 6f 6c 76  ite3SelectResolv
95b0: 65 28 70 50 61 72 73 65 2c 20 70 53 65 6c 65 63  e(pParse, pSelec
95c0: 74 2c 20 30 29 20 29 7b 0a 20 20 20 20 72 65 74  t, 0) ){.    ret
95d0: 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 70 54 61  urn 0;.  }.  pTa
95e0: 62 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c  b = sqlite3DbMal
95f0: 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 73 69 7a 65  locZero(db, size
9600: 6f 66 28 54 61 62 6c 65 29 20 29 3b 0a 20 20 69  of(Table) );.  i
9610: 66 28 20 70 54 61 62 3d 3d 30 20 29 7b 0a 20 20  f( pTab==0 ){.  
9620: 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a    return 0;.  }.
9630: 20 20 70 54 61 62 2d 3e 6e 52 65 66 20 3d 20 31    pTab->nRef = 1
9640: 3b 0a 20 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 20  ;.  pTab->zName 
9650: 3d 20 7a 54 61 62 4e 61 6d 65 20 3f 20 73 71 6c  = zTabName ? sql
9660: 69 74 65 33 44 62 53 74 72 44 75 70 28 64 62 2c  ite3DbStrDup(db,
9670: 20 7a 54 61 62 4e 61 6d 65 29 20 3a 20 30 3b 0a   zTabName) : 0;.
9680: 20 20 70 45 4c 69 73 74 20 3d 20 70 53 65 6c 65    pEList = pSele
9690: 63 74 2d 3e 70 45 4c 69 73 74 3b 0a 20 20 70 54  ct->pEList;.  pT
96a0: 61 62 2d 3e 6e 43 6f 6c 20 3d 20 70 45 4c 69 73  ab->nCol = pELis
96b0: 74 2d 3e 6e 45 78 70 72 3b 0a 20 20 61 73 73 65  t->nExpr;.  asse
96c0: 72 74 28 20 70 54 61 62 2d 3e 6e 43 6f 6c 3e 30  rt( pTab->nCol>0
96d0: 20 29 3b 0a 20 20 70 54 61 62 2d 3e 61 43 6f 6c   );.  pTab->aCol
96e0: 20 3d 20 61 43 6f 6c 20 3d 20 73 71 6c 69 74 65   = aCol = sqlite
96f0: 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62  3DbMallocZero(db
9700: 2c 20 73 69 7a 65 6f 66 28 70 54 61 62 2d 3e 61  , sizeof(pTab->a
9710: 43 6f 6c 5b 30 5d 29 2a 70 54 61 62 2d 3e 6e 43  Col[0])*pTab->nC
9720: 6f 6c 29 3b 0a 20 20 66 6f 72 28 69 3d 30 2c 20  ol);.  for(i=0, 
9730: 70 43 6f 6c 3d 61 43 6f 6c 3b 20 69 3c 70 54 61  pCol=aCol; i<pTa
9740: 62 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b 2c 20 70 43  b->nCol; i++, pC
9750: 6f 6c 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72 20  ol++){.    Expr 
9760: 2a 70 2c 20 2a 70 52 3b 0a 20 20 20 20 63 68 61  *p, *pR;.    cha
9770: 72 20 2a 7a 54 79 70 65 3b 0a 20 20 20 20 63 68  r *zType;.    ch
9780: 61 72 20 2a 7a 4e 61 6d 65 3b 0a 20 20 20 20 69  ar *zName;.    i
9790: 6e 74 20 6e 4e 61 6d 65 3b 0a 20 20 20 20 43 6f  nt nName;.    Co
97a0: 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 3b 0a 20 20  llSeq *pColl;.  
97b0: 20 20 69 6e 74 20 63 6e 74 3b 0a 20 20 20 20 4e    int cnt;.    N
97c0: 61 6d 65 43 6f 6e 74 65 78 74 20 73 4e 43 3b 0a  ameContext sNC;.
97d0: 20 20 20 20 0a 20 20 20 20 2f 2a 20 47 65 74 20      .    /* Get 
97e0: 61 6e 20 61 70 70 72 6f 70 72 69 61 74 65 20 6e  an appropriate n
97f0: 61 6d 65 20 66 6f 72 20 74 68 65 20 63 6f 6c 75  ame for the colu
9800: 6d 6e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70 20  mn.    */.    p 
9810: 3d 20 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70  = pEList->a[i].p
9820: 45 78 70 72 3b 0a 20 20 20 20 61 73 73 65 72 74  Expr;.    assert
9830: 28 20 70 2d 3e 70 52 69 67 68 74 3d 3d 30 20 7c  ( p->pRight==0 |
9840: 7c 20 70 2d 3e 70 52 69 67 68 74 2d 3e 74 6f 6b  | p->pRight->tok
9850: 65 6e 2e 7a 3d 3d 30 20 7c 7c 20 70 2d 3e 70 52  en.z==0 || p->pR
9860: 69 67 68 74 2d 3e 74 6f 6b 65 6e 2e 7a 5b 30 5d  ight->token.z[0]
9870: 21 3d 30 20 29 3b 0a 20 20 20 20 69 66 28 20 28  !=0 );.    if( (
9880: 7a 4e 61 6d 65 20 3d 20 70 45 4c 69 73 74 2d 3e  zName = pEList->
9890: 61 5b 69 5d 2e 7a 4e 61 6d 65 29 21 3d 30 20 29  a[i].zName)!=0 )
98a0: 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68  {.      /* If th
98b0: 65 20 63 6f 6c 75 6d 6e 20 63 6f 6e 74 61 69 6e  e column contain
98c0: 73 20 61 6e 20 22 41 53 20 3c 6e 61 6d 65 3e 22  s an "AS <name>"
98d0: 20 70 68 72 61 73 65 2c 20 75 73 65 20 3c 6e 61   phrase, use <na
98e0: 6d 65 3e 20 61 73 20 74 68 65 20 6e 61 6d 65 20  me> as the name 
98f0: 2a 2f 0a 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d  */.      zName =
9900: 20 73 71 6c 69 74 65 33 44 62 53 74 72 44 75 70   sqlite3DbStrDup
9910: 28 64 62 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20  (db, zName);.   
9920: 20 7d 65 6c 73 65 20 69 66 28 20 70 2d 3e 6f 70   }else if( p->op
9930: 3d 3d 54 4b 5f 44 4f 54 20 0a 20 20 20 20 20 20  ==TK_DOT .      
9940: 20 20 20 20 20 20 20 20 26 26 20 28 70 52 3d 70          && (pR=p
9950: 2d 3e 70 52 69 67 68 74 29 21 3d 30 20 26 26 20  ->pRight)!=0 && 
9960: 70 52 2d 3e 74 6f 6b 65 6e 2e 7a 20 26 26 20 70  pR->token.z && p
9970: 52 2d 3e 74 6f 6b 65 6e 2e 7a 5b 30 5d 20 29 7b  R->token.z[0] ){
9980: 0a 20 20 20 20 20 20 2f 2a 20 46 6f 72 20 63 6f  .      /* For co
9990: 6c 75 6d 6e 73 20 6f 66 20 74 68 65 20 66 72 6f  lumns of the fro
99a0: 6d 20 41 2e 42 20 75 73 65 20 42 20 61 73 20 74  m A.B use B as t
99b0: 68 65 20 6e 61 6d 65 20 2a 2f 0a 20 20 20 20 20  he name */.     
99c0: 20 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33   zName = sqlite3
99d0: 4d 50 72 69 6e 74 66 28 64 62 2c 20 22 25 54 22  MPrintf(db, "%T"
99e0: 2c 20 26 70 52 2d 3e 74 6f 6b 65 6e 29 3b 0a 20  , &pR->token);. 
99f0: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 2d 3e     }else if( p->
9a00: 73 70 61 6e 2e 7a 20 26 26 20 70 2d 3e 73 70 61  span.z && p->spa
9a10: 6e 2e 7a 5b 30 5d 20 29 7b 0a 20 20 20 20 20 20  n.z[0] ){.      
9a20: 2f 2a 20 55 73 65 20 74 68 65 20 6f 72 69 67 69  /* Use the origi
9a30: 6e 61 6c 20 74 65 78 74 20 6f 66 20 74 68 65 20  nal text of the 
9a40: 63 6f 6c 75 6d 6e 20 65 78 70 72 65 73 73 69 6f  column expressio
9a50: 6e 20 61 73 20 69 74 73 20 6e 61 6d 65 20 2a 2f  n as its name */
9a60: 0a 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 73  .      zName = s
9a70: 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 64 62  qlite3MPrintf(db
9a80: 2c 20 22 25 54 22 2c 20 26 70 2d 3e 73 70 61 6e  , "%T", &p->span
9a90: 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
9aa0: 20 20 20 20 2f 2a 20 49 66 20 61 6c 6c 20 65 6c      /* If all el
9ab0: 73 65 20 66 61 69 6c 73 2c 20 6d 61 6b 65 20 75  se fails, make u
9ac0: 70 20 61 20 6e 61 6d 65 20 2a 2f 0a 20 20 20 20  p a name */.    
9ad0: 20 20 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65    zName = sqlite
9ae0: 33 4d 50 72 69 6e 74 66 28 64 62 2c 20 22 63 6f  3MPrintf(db, "co
9af0: 6c 75 6d 6e 25 64 22 2c 20 69 2b 31 29 3b 0a 20  lumn%d", i+1);. 
9b00: 20 20 20 7d 0a 20 20 20 20 69 66 28 20 21 7a 4e     }.    if( !zN
9b10: 61 6d 65 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f  ame || db->mallo
9b20: 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 20  cFailed ){.     
9b30: 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
9b40: 64 20 3d 20 31 3b 0a 20 20 20 20 20 20 73 71 6c  d = 1;.      sql
9b50: 69 74 65 33 5f 66 72 65 65 28 7a 4e 61 6d 65 29  ite3_free(zName)
9b60: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 44  ;.      sqlite3D
9b70: 65 6c 65 74 65 54 61 62 6c 65 28 70 54 61 62 29  eleteTable(pTab)
9b80: 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 30  ;.      return 0
9b90: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  ;.    }.    sqli
9ba0: 74 65 33 44 65 71 75 6f 74 65 28 7a 4e 61 6d 65  te3Dequote(zName
9bb0: 29 3b 0a 0a 20 20 20 20 2f 2a 20 4d 61 6b 65 20  );..    /* Make 
9bc0: 73 75 72 65 20 74 68 65 20 63 6f 6c 75 6d 6e 20  sure the column 
9bd0: 6e 61 6d 65 20 69 73 20 75 6e 69 71 75 65 2e 20  name is unique. 
9be0: 20 49 66 20 74 68 65 20 6e 61 6d 65 20 69 73 20   If the name is 
9bf0: 6e 6f 74 20 75 6e 69 71 75 65 2c 0a 20 20 20 20  not unique,.    
9c00: 2a 2a 20 61 70 70 65 6e 64 20 61 20 69 6e 74 65  ** append a inte
9c10: 67 65 72 20 74 6f 20 74 68 65 20 6e 61 6d 65 20  ger to the name 
9c20: 73 6f 20 74 68 61 74 20 69 74 20 62 65 63 6f 6d  so that it becom
9c30: 65 73 20 75 6e 69 71 75 65 2e 0a 20 20 20 20 2a  es unique..    *
9c40: 2f 0a 20 20 20 20 6e 4e 61 6d 65 20 3d 20 73 74  /.    nName = st
9c50: 72 6c 65 6e 28 7a 4e 61 6d 65 29 3b 0a 20 20 20  rlen(zName);.   
9c60: 20 66 6f 72 28 6a 3d 63 6e 74 3d 30 3b 20 6a 3c   for(j=cnt=0; j<
9c70: 69 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 69  i; j++){.      i
9c80: 66 28 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d  f( sqlite3StrICm
9c90: 70 28 61 43 6f 6c 5b 6a 5d 2e 7a 4e 61 6d 65 2c  p(aCol[j].zName,
9ca0: 20 7a 4e 61 6d 65 29 3d 3d 30 20 29 7b 0a 20 20   zName)==0 ){.  
9cb0: 20 20 20 20 20 20 7a 4e 61 6d 65 5b 6e 4e 61 6d        zName[nNam
9cc0: 65 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  e] = 0;.        
9cd0: 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 4d  zName = sqlite3M
9ce0: 50 72 69 6e 74 66 28 64 62 2c 20 22 25 7a 3a 25  Printf(db, "%z:%
9cf0: 64 22 2c 20 7a 4e 61 6d 65 2c 20 2b 2b 63 6e 74  d", zName, ++cnt
9d00: 29 3b 0a 20 20 20 20 20 20 20 20 6a 20 3d 20 2d  );.        j = -
9d10: 31 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 7a  1;.        if( z
9d20: 4e 61 6d 65 3d 3d 30 20 29 20 62 72 65 61 6b 3b  Name==0 ) break;
9d30: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
9d40: 20 20 20 70 43 6f 6c 2d 3e 7a 4e 61 6d 65 20 3d     pCol->zName =
9d50: 20 7a 4e 61 6d 65 3b 0a 0a 20 20 20 20 2f 2a 20   zName;..    /* 
9d60: 47 65 74 20 74 68 65 20 74 79 70 65 6e 61 6d 65  Get the typename
9d70: 2c 20 74 79 70 65 20 61 66 66 69 6e 69 74 79 2c  , type affinity,
9d80: 20 61 6e 64 20 63 6f 6c 6c 61 74 69 6e 67 20 73   and collating s
9d90: 65 71 75 65 6e 63 65 20 66 6f 72 20 74 68 65 0a  equence for the.
9da0: 20 20 20 20 2a 2a 20 63 6f 6c 75 6d 6e 2e 0a 20      ** column.. 
9db0: 20 20 20 2a 2f 0a 20 20 20 20 6d 65 6d 73 65 74     */.    memset
9dc0: 28 26 73 4e 43 2c 20 30 2c 20 73 69 7a 65 6f 66  (&sNC, 0, sizeof
9dd0: 28 73 4e 43 29 29 3b 0a 20 20 20 20 73 4e 43 2e  (sNC));.    sNC.
9de0: 70 53 72 63 4c 69 73 74 20 3d 20 70 53 65 6c 65  pSrcList = pSele
9df0: 63 74 2d 3e 70 53 72 63 3b 0a 20 20 20 20 7a 54  ct->pSrc;.    zT
9e00: 79 70 65 20 3d 20 73 71 6c 69 74 65 33 44 62 53  ype = sqlite3DbS
9e10: 74 72 44 75 70 28 64 62 2c 20 63 6f 6c 75 6d 6e  trDup(db, column
9e20: 54 79 70 65 28 26 73 4e 43 2c 20 70 2c 20 30 2c  Type(&sNC, p, 0,
9e30: 20 30 2c 20 30 29 29 3b 0a 20 20 20 20 70 43 6f   0, 0));.    pCo
9e40: 6c 2d 3e 7a 54 79 70 65 20 3d 20 7a 54 79 70 65  l->zType = zType
9e50: 3b 0a 20 20 20 20 70 43 6f 6c 2d 3e 61 66 66 69  ;.    pCol->affi
9e60: 6e 69 74 79 20 3d 20 73 71 6c 69 74 65 33 45 78  nity = sqlite3Ex
9e70: 70 72 41 66 66 69 6e 69 74 79 28 70 29 3b 0a 20  prAffinity(p);. 
9e80: 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74     pColl = sqlit
9e90: 65 33 45 78 70 72 43 6f 6c 6c 53 65 71 28 70 50  e3ExprCollSeq(pP
9ea0: 61 72 73 65 2c 20 70 29 3b 0a 20 20 20 20 69 66  arse, p);.    if
9eb0: 28 20 70 43 6f 6c 6c 20 29 7b 0a 20 20 20 20 20  ( pColl ){.     
9ec0: 20 70 43 6f 6c 2d 3e 7a 43 6f 6c 6c 20 3d 20 73   pCol->zColl = s
9ed0: 71 6c 69 74 65 33 44 62 53 74 72 44 75 70 28 64  qlite3DbStrDup(d
9ee0: 62 2c 20 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65 29  b, pColl->zName)
9ef0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70 54  ;.    }.  }.  pT
9f00: 61 62 2d 3e 69 50 4b 65 79 20 3d 20 2d 31 3b 0a  ab->iPKey = -1;.
9f10: 20 20 72 65 74 75 72 6e 20 70 54 61 62 3b 0a 7d    return pTab;.}
9f20: 0a 0a 2f 2a 0a 2a 2a 20 50 72 65 70 61 72 65 20  ../*.** Prepare 
9f30: 61 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  a SELECT stateme
9f40: 6e 74 20 66 6f 72 20 70 72 6f 63 65 73 73 69 6e  nt for processin
9f50: 67 20 62 79 20 64 6f 69 6e 67 20 74 68 65 20 66  g by doing the f
9f60: 6f 6c 6c 6f 77 69 6e 67 0a 2a 2a 20 74 68 69 6e  ollowing.** thin
9f70: 67 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 28 31 29  gs:.**.**    (1)
9f80: 20 20 4d 61 6b 65 20 73 75 72 65 20 56 44 42 45    Make sure VDBE
9f90: 20 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 73 20   cursor numbers 
9fa0: 68 61 76 65 20 62 65 65 6e 20 61 73 73 69 67 6e  have been assign
9fb0: 65 64 20 74 6f 20 65 76 65 72 79 0a 2a 2a 20 20  ed to every.**  
9fc0: 20 20 20 20 20 20 20 65 6c 65 6d 65 6e 74 20 6f         element o
9fd0: 66 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73  f the FROM claus
9fe0: 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 28 32 29 20  e..**.**    (2) 
9ff0: 20 46 69 6c 6c 20 69 6e 20 74 68 65 20 70 54 61   Fill in the pTa
a000: 62 4c 69 73 74 2d 3e 61 5b 5d 2e 70 54 61 62 20  bList->a[].pTab 
a010: 66 69 65 6c 64 73 20 69 6e 20 74 68 65 20 53 72  fields in the Sr
a020: 63 4c 69 73 74 20 74 68 61 74 20 0a 2a 2a 20 20  cList that .**  
a030: 20 20 20 20 20 20 20 64 65 66 69 6e 65 73 20 46         defines F
a040: 52 4f 4d 20 63 6c 61 75 73 65 2e 20 20 57 68 65  ROM clause.  Whe
a050: 6e 20 76 69 65 77 73 20 61 70 70 65 61 72 20 69  n views appear i
a060: 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73  n the FROM claus
a070: 65 2c 0a 2a 2a 20 20 20 20 20 20 20 20 20 66 69  e,.**         fi
a080: 6c 6c 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 5d  ll pTabList->a[]
a090: 2e 70 53 65 6c 65 63 74 20 77 69 74 68 20 61 20  .pSelect with a 
a0a0: 63 6f 70 79 20 6f 66 20 74 68 65 20 53 45 4c 45  copy of the SELE
a0b0: 43 54 20 73 74 61 74 65 6d 65 6e 74 0a 2a 2a 20  CT statement.** 
a0c0: 20 20 20 20 20 20 20 20 74 68 61 74 20 69 6d 70          that imp
a0d0: 6c 65 6d 65 6e 74 73 20 74 68 65 20 76 69 65 77  lements the view
a0e0: 2e 20 20 41 20 63 6f 70 79 20 69 73 20 6d 61 64  .  A copy is mad
a0f0: 65 20 6f 66 20 74 68 65 20 76 69 65 77 27 73 20  e of the view's 
a100: 53 45 4c 45 43 54 0a 2a 2a 20 20 20 20 20 20 20  SELECT.**       
a110: 20 20 73 74 61 74 65 6d 65 6e 74 20 73 6f 20 74    statement so t
a120: 68 61 74 20 77 65 20 63 61 6e 20 66 72 65 65 6c  hat we can freel
a130: 79 20 6d 6f 64 69 66 79 20 6f 72 20 64 65 6c 65  y modify or dele
a140: 74 65 20 74 68 61 74 20 73 74 61 74 65 6d 65 6e  te that statemen
a150: 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 77 69 74  t.**         wit
a160: 68 6f 75 74 20 77 6f 72 72 79 69 6e 67 20 61 62  hout worrying ab
a170: 6f 75 74 20 6d 65 73 73 69 6e 67 20 75 70 20 74  out messing up t
a180: 68 65 20 70 72 65 73 69 73 74 65 6e 74 20 72 65  he presistent re
a190: 70 72 65 73 65 6e 74 61 74 69 6f 6e 0a 2a 2a 20  presentation.** 
a1a0: 20 20 20 20 20 20 20 20 6f 66 20 74 68 65 20 76          of the v
a1b0: 69 65 77 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 28 33  iew..**.**    (3
a1c0: 29 20 20 41 64 64 20 74 65 72 6d 73 20 74 6f 20  )  Add terms to 
a1d0: 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  the WHERE clause
a1e0: 20 74 6f 20 61 63 63 6f 6d 6f 64 61 74 65 20 74   to accomodate t
a1f0: 68 65 20 4e 41 54 55 52 41 4c 20 6b 65 79 77 6f  he NATURAL keywo
a200: 72 64 0a 2a 2a 20 20 20 20 20 20 20 20 20 6f 6e  rd.**         on
a210: 20 6a 6f 69 6e 73 20 61 6e 64 20 74 68 65 20 4f   joins and the O
a220: 4e 20 61 6e 64 20 55 53 49 4e 47 20 63 6c 61 75  N and USING clau
a230: 73 65 20 6f 66 20 6a 6f 69 6e 73 2e 0a 2a 2a 0a  se of joins..**.
a240: 2a 2a 20 20 20 20 28 34 29 20 20 53 63 61 6e 20  **    (4)  Scan 
a250: 74 68 65 20 6c 69 73 74 20 6f 66 20 63 6f 6c 75  the list of colu
a260: 6d 6e 73 20 69 6e 20 74 68 65 20 72 65 73 75 6c  mns in the resul
a270: 74 20 73 65 74 20 28 70 45 4c 69 73 74 29 20 6c  t set (pEList) l
a280: 6f 6f 6b 69 6e 67 0a 2a 2a 20 20 20 20 20 20 20  ooking.**       
a290: 20 20 66 6f 72 20 69 6e 73 74 61 6e 63 65 73 20    for instances 
a2a0: 6f 66 20 74 68 65 20 22 2a 22 20 6f 70 65 72 61  of the "*" opera
a2b0: 74 6f 72 20 6f 72 20 74 68 65 20 54 41 42 4c 45  tor or the TABLE
a2c0: 2e 2a 20 6f 70 65 72 61 74 6f 72 2e 0a 2a 2a 20  .* operator..** 
a2d0: 20 20 20 20 20 20 20 20 49 66 20 66 6f 75 6e 64          If found
a2e0: 2c 20 65 78 70 61 6e 64 20 65 61 63 68 20 22 2a  , expand each "*
a2f0: 22 20 74 6f 20 62 65 20 65 76 65 72 79 20 63 6f  " to be every co
a300: 6c 75 6d 6e 20 69 6e 20 65 76 65 72 79 20 74 61  lumn in every ta
a310: 62 6c 65 0a 2a 2a 20 20 20 20 20 20 20 20 20 61  ble.**         a
a320: 6e 64 20 54 41 42 4c 45 2e 2a 20 74 6f 20 62 65  nd TABLE.* to be
a330: 20 65 76 65 72 79 20 63 6f 6c 75 6d 6e 20 69 6e   every column in
a340: 20 54 41 42 4c 45 2e 0a 2a 2a 0a 2a 2a 20 52 65   TABLE..**.** Re
a350: 74 75 72 6e 20 30 20 6f 6e 20 73 75 63 63 65 73  turn 0 on succes
a360: 73 2e 20 20 49 66 20 74 68 65 72 65 20 61 72 65  s.  If there are
a370: 20 70 72 6f 62 6c 65 6d 73 2c 20 6c 65 61 76 65   problems, leave
a380: 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67   an error messag
a390: 65 0a 2a 2a 20 69 6e 20 70 50 61 72 73 65 20 61  e.** in pParse a
a3a0: 6e 64 20 72 65 74 75 72 6e 20 6e 6f 6e 2d 7a 65  nd return non-ze
a3b0: 72 6f 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ro..*/.static in
a3c0: 74 20 70 72 65 70 53 65 6c 65 63 74 53 74 6d 74  t prepSelectStmt
a3d0: 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
a3e0: 53 65 6c 65 63 74 20 2a 70 29 7b 0a 20 20 69 6e  Select *p){.  in
a3f0: 74 20 69 2c 20 6a 2c 20 6b 2c 20 72 63 3b 0a 20  t i, j, k, rc;. 
a400: 20 53 72 63 4c 69 73 74 20 2a 70 54 61 62 4c 69   SrcList *pTabLi
a410: 73 74 3b 0a 20 20 45 78 70 72 4c 69 73 74 20 2a  st;.  ExprList *
a420: 70 45 4c 69 73 74 3b 0a 20 20 73 74 72 75 63 74  pEList;.  struct
a430: 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70   SrcList_item *p
a440: 46 72 6f 6d 3b 0a 20 20 73 71 6c 69 74 65 33 20  From;.  sqlite3 
a450: 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62  *db = pParse->db
a460: 3b 0a 0a 20 20 69 66 28 20 70 3d 3d 30 20 7c 7c  ;..  if( p==0 ||
a470: 20 70 2d 3e 70 53 72 63 3d 3d 30 20 7c 7c 20 64   p->pSrc==0 || d
a480: 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
a490: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 31 3b  ){.    return 1;
a4a0: 0a 20 20 7d 0a 20 20 70 54 61 62 4c 69 73 74 20  .  }.  pTabList 
a4b0: 3d 20 70 2d 3e 70 53 72 63 3b 0a 20 20 70 45 4c  = p->pSrc;.  pEL
a4c0: 69 73 74 20 3d 20 70 2d 3e 70 45 4c 69 73 74 3b  ist = p->pEList;
a4d0: 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65  ..  /* Make sure
a4e0: 20 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 73 20   cursor numbers 
a4f0: 68 61 76 65 20 62 65 65 6e 20 61 73 73 69 67 6e  have been assign
a500: 65 64 20 74 6f 20 61 6c 6c 20 65 6e 74 72 69 65  ed to all entrie
a510: 73 20 69 6e 0a 20 20 2a 2a 20 74 68 65 20 46 52  s in.  ** the FR
a520: 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20 74 68 65  OM clause of the
a530: 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
a540: 74 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65  t..  */.  sqlite
a550: 33 53 72 63 4c 69 73 74 41 73 73 69 67 6e 43 75  3SrcListAssignCu
a560: 72 73 6f 72 73 28 70 50 61 72 73 65 2c 20 70 2d  rsors(pParse, p-
a570: 3e 70 53 72 63 29 3b 0a 0a 20 20 2f 2a 20 4c 6f  >pSrc);..  /* Lo
a580: 6f 6b 20 75 70 20 65 76 65 72 79 20 74 61 62 6c  ok up every tabl
a590: 65 20 6e 61 6d 65 64 20 69 6e 20 74 68 65 20 46  e named in the F
a5a0: 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20 74 68  ROM clause of th
a5b0: 65 20 73 65 6c 65 63 74 2e 20 20 49 66 0a 20 20  e select.  If.  
a5c0: 2a 2a 20 61 6e 20 65 6e 74 72 79 20 6f 66 20 74  ** an entry of t
a5d0: 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 69  he FROM clause i
a5e0: 73 20 61 20 73 75 62 71 75 65 72 79 20 69 6e 73  s a subquery ins
a5f0: 74 65 61 64 20 6f 66 20 61 20 74 61 62 6c 65 20  tead of a table 
a600: 6f 72 20 76 69 65 77 2c 0a 20 20 2a 2a 20 74 68  or view,.  ** th
a610: 65 6e 20 63 72 65 61 74 65 20 61 20 74 72 61 6e  en create a tran
a620: 73 69 65 6e 74 20 74 61 62 6c 65 20 73 74 72 75  sient table stru
a630: 63 74 75 72 65 20 74 6f 20 64 65 73 63 72 69 62  cture to describ
a640: 65 20 74 68 65 20 73 75 62 71 75 65 72 79 2e 0a  e the subquery..
a650: 20 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 2c 20    */.  for(i=0, 
a660: 70 46 72 6f 6d 3d 70 54 61 62 4c 69 73 74 2d 3e  pFrom=pTabList->
a670: 61 3b 20 69 3c 70 54 61 62 4c 69 73 74 2d 3e 6e  a; i<pTabList->n
a680: 53 72 63 3b 20 69 2b 2b 2c 20 70 46 72 6f 6d 2b  Src; i++, pFrom+
a690: 2b 29 7b 0a 20 20 20 20 54 61 62 6c 65 20 2a 70  +){.    Table *p
a6a0: 54 61 62 3b 0a 20 20 20 20 69 66 28 20 70 46 72  Tab;.    if( pFr
a6b0: 6f 6d 2d 3e 70 54 61 62 21 3d 30 20 29 7b 0a 20  om->pTab!=0 ){. 
a6c0: 20 20 20 20 20 2f 2a 20 54 68 69 73 20 73 74 61       /* This sta
a6d0: 74 65 6d 65 6e 74 20 68 61 73 20 61 6c 72 65 61  tement has alrea
a6e0: 64 79 20 62 65 65 6e 20 70 72 65 70 61 72 65 64  dy been prepared
a6f0: 2e 20 20 54 68 65 72 65 20 69 73 20 6e 6f 20 6e  .  There is no n
a700: 65 65 64 0a 20 20 20 20 20 20 2a 2a 20 74 6f 20  eed.      ** to 
a710: 67 6f 20 66 75 72 74 68 65 72 2e 20 2a 2f 0a 20  go further. */. 
a720: 20 20 20 20 20 61 73 73 65 72 74 28 20 69 3d 3d       assert( i==
a730: 30 20 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  0 );.      retur
a740: 6e 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  n 0;.    }.    i
a750: 66 28 20 70 46 72 6f 6d 2d 3e 7a 4e 61 6d 65 3d  f( pFrom->zName=
a760: 3d 30 20 29 7b 0a 23 69 66 6e 64 65 66 20 53 51  =0 ){.#ifndef SQ
a770: 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45  LITE_OMIT_SUBQUE
a780: 52 59 0a 20 20 20 20 20 20 2f 2a 20 41 20 73 75  RY.      /* A su
a790: 62 2d 71 75 65 72 79 20 69 6e 20 74 68 65 20 46  b-query in the F
a7a0: 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20 61 20  ROM clause of a 
a7b0: 53 45 4c 45 43 54 20 2a 2f 0a 20 20 20 20 20 20  SELECT */.      
a7c0: 61 73 73 65 72 74 28 20 70 46 72 6f 6d 2d 3e 70  assert( pFrom->p
a7d0: 53 65 6c 65 63 74 21 3d 30 20 29 3b 0a 20 20 20  Select!=0 );.   
a7e0: 20 20 20 69 66 28 20 70 46 72 6f 6d 2d 3e 7a 41     if( pFrom->zA
a7f0: 6c 69 61 73 3d 3d 30 20 29 7b 0a 20 20 20 20 20  lias==0 ){.     
a800: 20 20 20 70 46 72 6f 6d 2d 3e 7a 41 6c 69 61 73     pFrom->zAlias
a810: 20 3d 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c   =.          sql
a820: 69 74 65 33 4d 50 72 69 6e 74 66 28 64 62 2c 20  ite3MPrintf(db, 
a830: 22 73 71 6c 69 74 65 5f 73 75 62 71 75 65 72 79  "sqlite_subquery
a840: 5f 25 70 5f 22 2c 20 28 76 6f 69 64 2a 29 70 46  _%p_", (void*)pF
a850: 72 6f 6d 2d 3e 70 53 65 6c 65 63 74 29 3b 0a 20  rom->pSelect);. 
a860: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 61 73 73       }.      ass
a870: 65 72 74 28 20 70 46 72 6f 6d 2d 3e 70 54 61 62  ert( pFrom->pTab
a880: 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 70 46 72  ==0 );.      pFr
a890: 6f 6d 2d 3e 70 54 61 62 20 3d 20 70 54 61 62 20  om->pTab = pTab 
a8a0: 3d 20 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  = .        sqlit
a8b0: 65 33 52 65 73 75 6c 74 53 65 74 4f 66 53 65 6c  e3ResultSetOfSel
a8c0: 65 63 74 28 70 50 61 72 73 65 2c 20 70 46 72 6f  ect(pParse, pFro
a8d0: 6d 2d 3e 7a 41 6c 69 61 73 2c 20 70 46 72 6f 6d  m->zAlias, pFrom
a8e0: 2d 3e 70 53 65 6c 65 63 74 29 3b 0a 20 20 20 20  ->pSelect);.    
a8f0: 20 20 69 66 28 20 70 54 61 62 3d 3d 30 20 29 7b    if( pTab==0 ){
a900: 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
a910: 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  1;.      }.     
a920: 20 2f 2a 20 54 68 65 20 69 73 45 70 68 65 6d 20   /* The isEphem 
a930: 66 6c 61 67 20 69 6e 64 69 63 61 74 65 73 20 74  flag indicates t
a940: 68 61 74 20 74 68 65 20 54 61 62 6c 65 20 73 74  hat the Table st
a950: 72 75 63 74 75 72 65 20 68 61 73 20 62 65 65 6e  ructure has been
a960: 0a 20 20 20 20 20 20 2a 2a 20 64 79 6e 61 6d 69  .      ** dynami
a970: 63 61 6c 6c 79 20 61 6c 6c 6f 63 61 74 65 64 20  cally allocated 
a980: 61 6e 64 20 6d 61 79 20 62 65 20 66 72 65 65 64  and may be freed
a990: 20 61 74 20 61 6e 79 20 74 69 6d 65 2e 20 20 49   at any time.  I
a9a0: 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 0a 20  n other words,. 
a9b0: 20 20 20 20 20 2a 2a 20 70 54 61 62 20 69 73 20       ** pTab is 
a9c0: 6e 6f 74 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20  not pointing to 
a9d0: 61 20 70 65 72 73 69 73 74 65 6e 74 20 74 61 62  a persistent tab
a9e0: 6c 65 20 73 74 72 75 63 74 75 72 65 20 74 68 61  le structure tha
a9f0: 74 20 64 65 66 69 6e 65 73 0a 20 20 20 20 20 20  t defines.      
aa00: 2a 2a 20 70 61 72 74 20 6f 66 20 74 68 65 20 73  ** part of the s
aa10: 63 68 65 6d 61 2e 20 2a 2f 0a 20 20 20 20 20 20  chema. */.      
aa20: 70 54 61 62 2d 3e 69 73 45 70 68 65 6d 20 3d 20  pTab->isEphem = 
aa30: 31 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 65  1;.#endif.    }e
aa40: 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20 41 6e  lse{.      /* An
aa50: 20 6f 72 64 69 6e 61 72 79 20 74 61 62 6c 65 20   ordinary table 
aa60: 6f 72 20 76 69 65 77 20 6e 61 6d 65 20 69 6e 20  or view name in 
aa70: 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20  the FROM clause 
aa80: 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  */.      assert(
aa90: 20 70 46 72 6f 6d 2d 3e 70 54 61 62 3d 3d 30 20   pFrom->pTab==0 
aaa0: 29 3b 0a 20 20 20 20 20 20 70 46 72 6f 6d 2d 3e  );.      pFrom->
aab0: 70 54 61 62 20 3d 20 70 54 61 62 20 3d 20 0a 20  pTab = pTab = . 
aac0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 4c 6f         sqlite3Lo
aad0: 63 61 74 65 54 61 62 6c 65 28 70 50 61 72 73 65  cateTable(pParse
aae0: 2c 30 2c 70 46 72 6f 6d 2d 3e 7a 4e 61 6d 65 2c  ,0,pFrom->zName,
aaf0: 70 46 72 6f 6d 2d 3e 7a 44 61 74 61 62 61 73 65  pFrom->zDatabase
ab00: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 54 61  );.      if( pTa
ab10: 62 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  b==0 ){.        
ab20: 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 20 20  return 1;.      
ab30: 7d 0a 20 20 20 20 20 20 70 54 61 62 2d 3e 6e 52  }.      pTab->nR
ab40: 65 66 2b 2b 3b 0a 23 69 66 20 21 64 65 66 69 6e  ef++;.#if !defin
ab50: 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56  ed(SQLITE_OMIT_V
ab60: 49 45 57 29 20 7c 7c 20 21 64 65 66 69 6e 65 64  IEW) || !defined
ab70: 20 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49   (SQLITE_OMIT_VI
ab80: 52 54 55 41 4c 54 41 42 4c 45 29 0a 20 20 20 20  RTUALTABLE).    
ab90: 20 20 69 66 28 20 70 54 61 62 2d 3e 70 53 65 6c    if( pTab->pSel
aba0: 65 63 74 20 7c 7c 20 49 73 56 69 72 74 75 61 6c  ect || IsVirtual
abb0: 28 70 54 61 62 29 20 29 7b 0a 20 20 20 20 20 20  (pTab) ){.      
abc0: 20 20 2f 2a 20 57 65 20 72 65 61 63 68 20 68 65    /* We reach he
abd0: 72 65 20 69 66 20 74 68 65 20 6e 61 6d 65 64 20  re if the named 
abe0: 74 61 62 6c 65 20 69 73 20 61 20 72 65 61 6c 6c  table is a reall
abf0: 79 20 61 20 76 69 65 77 20 2a 2f 0a 20 20 20 20  y a view */.    
ac00: 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 56      if( sqlite3V
ac10: 69 65 77 47 65 74 43 6f 6c 75 6d 6e 4e 61 6d 65  iewGetColumnName
ac20: 73 28 70 50 61 72 73 65 2c 20 70 54 61 62 29 20  s(pParse, pTab) 
ac30: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74  ){.          ret
ac40: 75 72 6e 20 31 3b 0a 20 20 20 20 20 20 20 20 7d  urn 1;.        }
ac50: 0a 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 70  .        /* If p
ac60: 46 72 6f 6d 2d 3e 70 53 65 6c 65 63 74 21 3d 30  From->pSelect!=0
ac70: 20 69 74 20 6d 65 61 6e 73 20 77 65 20 61 72 65   it means we are
ac80: 20 64 65 61 6c 69 6e 67 20 77 69 74 68 20 61 0a   dealing with a.
ac90: 20 20 20 20 20 20 20 20 2a 2a 20 76 69 65 77 20          ** view 
aca0: 77 69 74 68 69 6e 20 61 20 76 69 65 77 2e 20 20  within a view.  
acb0: 54 68 65 20 53 45 4c 45 43 54 20 73 74 72 75 63  The SELECT struc
acc0: 74 75 72 65 20 68 61 73 20 61 6c 72 65 61 64 79  ture has already
acd0: 20 62 65 65 6e 0a 20 20 20 20 20 20 20 20 2a 2a   been.        **
ace0: 20 63 6f 70 69 65 64 20 62 79 20 74 68 65 20 6f   copied by the o
acf0: 75 74 65 72 20 76 69 65 77 20 73 6f 20 77 65 20  uter view so we 
ad00: 63 61 6e 20 73 6b 69 70 20 74 68 65 20 63 6f 70  can skip the cop
ad10: 79 20 73 74 65 70 20 68 65 72 65 0a 20 20 20 20  y step here.    
ad20: 20 20 20 20 2a 2a 20 69 6e 20 74 68 65 20 69 6e      ** in the in
ad30: 6e 65 72 20 76 69 65 77 2e 0a 20 20 20 20 20 20  ner view..      
ad40: 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28    */.        if(
ad50: 20 70 46 72 6f 6d 2d 3e 70 53 65 6c 65 63 74 3d   pFrom->pSelect=
ad60: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
ad70: 70 46 72 6f 6d 2d 3e 70 53 65 6c 65 63 74 20 3d  pFrom->pSelect =
ad80: 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 75   sqlite3SelectDu
ad90: 70 28 64 62 2c 20 70 54 61 62 2d 3e 70 53 65 6c  p(db, pTab->pSel
ada0: 65 63 74 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  ect);.        }.
adb0: 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20        }.#endif. 
adc0: 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 50     }.  }..  /* P
add0: 72 6f 63 65 73 73 20 4e 41 54 55 52 41 4c 20 6b  rocess NATURAL k
ade0: 65 79 77 6f 72 64 73 2c 20 61 6e 64 20 4f 4e 20  eywords, and ON 
adf0: 61 6e 64 20 55 53 49 4e 47 20 63 6c 61 75 73 65  and USING clause
ae00: 73 20 6f 66 20 6a 6f 69 6e 73 2e 0a 20 20 2a 2f  s of joins..  */
ae10: 0a 20 20 69 66 28 20 73 71 6c 69 74 65 50 72 6f  .  if( sqlitePro
ae20: 63 65 73 73 4a 6f 69 6e 28 70 50 61 72 73 65 2c  cessJoin(pParse,
ae30: 20 70 29 20 29 20 72 65 74 75 72 6e 20 31 3b 0a   p) ) return 1;.
ae40: 0a 20 20 2f 2a 20 46 6f 72 20 65 76 65 72 79 20  .  /* For every 
ae50: 22 2a 22 20 74 68 61 74 20 6f 63 63 75 72 73 20  "*" that occurs 
ae60: 69 6e 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6c 69  in the column li
ae70: 73 74 2c 20 69 6e 73 65 72 74 20 74 68 65 20 6e  st, insert the n
ae80: 61 6d 65 73 20 6f 66 0a 20 20 2a 2a 20 61 6c 6c  ames of.  ** all
ae90: 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 61 6c 6c 20   columns in all 
aea0: 74 61 62 6c 65 73 2e 20 20 41 6e 64 20 66 6f 72  tables.  And for
aeb0: 20 65 76 65 72 79 20 54 41 42 4c 45 2e 2a 20 69   every TABLE.* i
aec0: 6e 73 65 72 74 20 74 68 65 20 6e 61 6d 65 73 0a  nsert the names.
aed0: 20 20 2a 2a 20 6f 66 20 61 6c 6c 20 63 6f 6c 75    ** of all colu
aee0: 6d 6e 73 20 69 6e 20 54 41 42 4c 45 2e 20 20 54  mns in TABLE.  T
aef0: 68 65 20 70 61 72 73 65 72 20 69 6e 73 65 72 74  he parser insert
af00: 65 64 20 61 20 73 70 65 63 69 61 6c 20 65 78 70  ed a special exp
af10: 72 65 73 73 69 6f 6e 0a 20 20 2a 2a 20 77 69 74  ression.  ** wit
af20: 68 20 74 68 65 20 54 4b 5f 41 4c 4c 20 6f 70 65  h the TK_ALL ope
af30: 72 61 74 6f 72 20 66 6f 72 20 65 61 63 68 20 22  rator for each "
af40: 2a 22 20 74 68 61 74 20 69 74 20 66 6f 75 6e 64  *" that it found
af50: 20 69 6e 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6c   in the column l
af60: 69 73 74 2e 0a 20 20 2a 2a 20 54 68 65 20 66 6f  ist..  ** The fo
af70: 6c 6c 6f 77 69 6e 67 20 63 6f 64 65 20 6a 75 73  llowing code jus
af80: 74 20 68 61 73 20 74 6f 20 6c 6f 63 61 74 65 20  t has to locate 
af90: 74 68 65 20 54 4b 5f 41 4c 4c 20 65 78 70 72 65  the TK_ALL expre
afa0: 73 73 69 6f 6e 73 20 61 6e 64 20 65 78 70 61 6e  ssions and expan
afb0: 64 0a 20 20 2a 2a 20 65 61 63 68 20 6f 6e 65 20  d.  ** each one 
afc0: 74 6f 20 74 68 65 20 6c 69 73 74 20 6f 66 20 61  to the list of a
afd0: 6c 6c 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 61 6c  ll columns in al
afe0: 6c 20 74 61 62 6c 65 73 2e 0a 20 20 2a 2a 0a 20  l tables..  **. 
aff0: 20 2a 2a 20 54 68 65 20 66 69 72 73 74 20 6c 6f   ** The first lo
b000: 6f 70 20 6a 75 73 74 20 63 68 65 63 6b 73 20 74  op just checks t
b010: 6f 20 73 65 65 20 69 66 20 74 68 65 72 65 20 61  o see if there a
b020: 72 65 20 61 6e 79 20 22 2a 22 20 6f 70 65 72 61  re any "*" opera
b030: 74 6f 72 73 0a 20 20 2a 2a 20 74 68 61 74 20 6e  tors.  ** that n
b040: 65 65 64 20 65 78 70 61 6e 64 69 6e 67 2e 0a 20  eed expanding.. 
b050: 20 2a 2f 0a 20 20 66 6f 72 28 6b 3d 30 3b 20 6b   */.  for(k=0; k
b060: 3c 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20  <pEList->nExpr; 
b070: 6b 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72 20 2a  k++){.    Expr *
b080: 70 45 20 3d 20 70 45 4c 69 73 74 2d 3e 61 5b 6b  pE = pEList->a[k
b090: 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 69 66 28  ].pExpr;.    if(
b0a0: 20 70 45 2d 3e 6f 70 3d 3d 54 4b 5f 41 4c 4c 20   pE->op==TK_ALL 
b0b0: 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 69 66 28  ) break;.    if(
b0c0: 20 70 45 2d 3e 6f 70 3d 3d 54 4b 5f 44 4f 54 20   pE->op==TK_DOT 
b0d0: 26 26 20 70 45 2d 3e 70 52 69 67 68 74 20 26 26  && pE->pRight &&
b0e0: 20 70 45 2d 3e 70 52 69 67 68 74 2d 3e 6f 70 3d   pE->pRight->op=
b0f0: 3d 54 4b 5f 41 4c 4c 0a 20 20 20 20 20 20 20 20  =TK_ALL.        
b100: 20 26 26 20 70 45 2d 3e 70 4c 65 66 74 20 26 26   && pE->pLeft &&
b110: 20 70 45 2d 3e 70 4c 65 66 74 2d 3e 6f 70 3d 3d   pE->pLeft->op==
b120: 54 4b 5f 49 44 20 29 20 62 72 65 61 6b 3b 0a 20  TK_ID ) break;. 
b130: 20 7d 0a 20 20 72 63 20 3d 20 30 3b 0a 20 20 69   }.  rc = 0;.  i
b140: 66 28 20 6b 3c 70 45 4c 69 73 74 2d 3e 6e 45 78  f( k<pEList->nEx
b150: 70 72 20 29 7b 0a 20 20 20 20 2f 2a 0a 20 20 20  pr ){.    /*.   
b160: 20 2a 2a 20 49 66 20 77 65 20 67 65 74 20 68 65   ** If we get he
b170: 72 65 20 69 74 20 6d 65 61 6e 73 20 74 68 65 20  re it means the 
b180: 72 65 73 75 6c 74 20 73 65 74 20 63 6f 6e 74 61  result set conta
b190: 69 6e 73 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20  ins one or more 
b1a0: 22 2a 22 0a 20 20 20 20 2a 2a 20 6f 70 65 72 61  "*".    ** opera
b1b0: 74 6f 72 73 20 74 68 61 74 20 6e 65 65 64 20 74  tors that need t
b1c0: 6f 20 62 65 20 65 78 70 61 6e 64 65 64 2e 20 20  o be expanded.  
b1d0: 4c 6f 6f 70 20 74 68 72 6f 75 67 68 20 65 61 63  Loop through eac
b1e0: 68 20 65 78 70 72 65 73 73 69 6f 6e 0a 20 20 20  h expression.   
b1f0: 20 2a 2a 20 69 6e 20 74 68 65 20 72 65 73 75 6c   ** in the resul
b200: 74 20 73 65 74 20 61 6e 64 20 65 78 70 61 6e 64  t set and expand
b210: 20 74 68 65 6d 20 6f 6e 65 20 62 79 20 6f 6e 65   them one by one
b220: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73 74 72  ..    */.    str
b230: 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65  uct ExprList_ite
b240: 6d 20 2a 61 20 3d 20 70 45 4c 69 73 74 2d 3e 61  m *a = pEList->a
b250: 3b 0a 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a  ;.    ExprList *
b260: 70 4e 65 77 20 3d 20 30 3b 0a 20 20 20 20 69 6e  pNew = 0;.    in
b270: 74 20 66 6c 61 67 73 20 3d 20 70 50 61 72 73 65  t flags = pParse
b280: 2d 3e 64 62 2d 3e 66 6c 61 67 73 3b 0a 20 20 20  ->db->flags;.   
b290: 20 69 6e 74 20 6c 6f 6e 67 4e 61 6d 65 73 20 3d   int longNames =
b2a0: 20 28 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45   (flags & SQLITE
b2b0: 5f 46 75 6c 6c 43 6f 6c 4e 61 6d 65 73 29 21 3d  _FullColNames)!=
b2c0: 30 20 26 26 0a 20 20 20 20 20 20 20 20 20 20 20  0 &&.           
b2d0: 20 20 20 20 20 20 20 20 20 20 20 28 66 6c 61 67             (flag
b2e0: 73 20 26 20 53 51 4c 49 54 45 5f 53 68 6f 72 74  s & SQLITE_Short
b2f0: 43 6f 6c 4e 61 6d 65 73 29 3d 3d 30 3b 0a 0a 20  ColNames)==0;.. 
b300: 20 20 20 66 6f 72 28 6b 3d 30 3b 20 6b 3c 70 45     for(k=0; k<pE
b310: 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 6b 2b 2b  List->nExpr; k++
b320: 29 7b 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70  ){.      Expr *p
b330: 45 20 3d 20 61 5b 6b 5d 2e 70 45 78 70 72 3b 0a  E = a[k].pExpr;.
b340: 20 20 20 20 20 20 69 66 28 20 70 45 2d 3e 6f 70        if( pE->op
b350: 21 3d 54 4b 5f 41 4c 4c 20 26 26 0a 20 20 20 20  !=TK_ALL &&.    
b360: 20 20 20 20 20 20 20 28 70 45 2d 3e 6f 70 21 3d         (pE->op!=
b370: 54 4b 5f 44 4f 54 20 7c 7c 20 70 45 2d 3e 70 52  TK_DOT || pE->pR
b380: 69 67 68 74 3d 3d 30 20 7c 7c 20 70 45 2d 3e 70  ight==0 || pE->p
b390: 52 69 67 68 74 2d 3e 6f 70 21 3d 54 4b 5f 41 4c  Right->op!=TK_AL
b3a0: 4c 29 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a  L) ){.        /*
b3b0: 20 54 68 69 73 20 70 61 72 74 69 63 75 6c 61 72   This particular
b3c0: 20 65 78 70 72 65 73 73 69 6f 6e 20 64 6f 65 73   expression does
b3d0: 20 6e 6f 74 20 6e 65 65 64 20 74 6f 20 62 65 20   not need to be 
b3e0: 65 78 70 61 6e 64 65 64 2e 0a 20 20 20 20 20 20  expanded..      
b3f0: 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 70 4e 65    */.        pNe
b400: 77 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c  w = sqlite3ExprL
b410: 69 73 74 41 70 70 65 6e 64 28 70 50 61 72 73 65  istAppend(pParse
b420: 2c 20 70 4e 65 77 2c 20 61 5b 6b 5d 2e 70 45 78  , pNew, a[k].pEx
b430: 70 72 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20  pr, 0);.        
b440: 69 66 28 20 70 4e 65 77 20 29 7b 0a 20 20 20 20  if( pNew ){.    
b450: 20 20 20 20 20 20 70 4e 65 77 2d 3e 61 5b 70 4e        pNew->a[pN
b460: 65 77 2d 3e 6e 45 78 70 72 2d 31 5d 2e 7a 4e 61  ew->nExpr-1].zNa
b470: 6d 65 20 3d 20 61 5b 6b 5d 2e 7a 4e 61 6d 65 3b  me = a[k].zName;
b480: 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
b490: 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 31            rc = 1
b4a0: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
b4b0: 20 20 20 20 61 5b 6b 5d 2e 70 45 78 70 72 20 3d      a[k].pExpr =
b4c0: 20 30 3b 0a 20 20 20 20 20 20 20 20 61 5b 6b 5d   0;.        a[k]
b4d0: 2e 7a 4e 61 6d 65 20 3d 20 30 3b 0a 20 20 20 20  .zName = 0;.    
b4e0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
b4f0: 20 2f 2a 20 54 68 69 73 20 65 78 70 72 65 73 73   /* This express
b500: 69 6f 6e 20 69 73 20 61 20 22 2a 22 20 6f 72 20  ion is a "*" or 
b510: 61 20 22 54 41 42 4c 45 2e 2a 22 20 61 6e 64 20  a "TABLE.*" and 
b520: 6e 65 65 64 73 20 74 6f 20 62 65 0a 20 20 20 20  needs to be.    
b530: 20 20 20 20 2a 2a 20 65 78 70 61 6e 64 65 64 2e      ** expanded.
b540: 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e 74 20   */.        int 
b550: 74 61 62 6c 65 53 65 65 6e 20 3d 20 30 3b 20 20  tableSeen = 0;  
b560: 20 20 20 20 2f 2a 20 53 65 74 20 74 6f 20 31 20      /* Set to 1 
b570: 77 68 65 6e 20 54 41 42 4c 45 20 6d 61 74 63 68  when TABLE match
b580: 65 73 20 2a 2f 0a 20 20 20 20 20 20 20 20 63 68  es */.        ch
b590: 61 72 20 2a 7a 54 4e 61 6d 65 3b 20 20 20 20 20  ar *zTName;     
b5a0: 20 20 20 20 20 20 20 2f 2a 20 74 65 78 74 20 6f         /* text o
b5b0: 66 20 6e 61 6d 65 20 6f 66 20 54 41 42 4c 45 20  f name of TABLE 
b5c0: 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  */.        if( p
b5d0: 45 2d 3e 6f 70 3d 3d 54 4b 5f 44 4f 54 20 26 26  E->op==TK_DOT &&
b5e0: 20 70 45 2d 3e 70 4c 65 66 74 20 29 7b 0a 20 20   pE->pLeft ){.  
b5f0: 20 20 20 20 20 20 20 20 7a 54 4e 61 6d 65 20 3d          zTName =
b600: 20 73 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d   sqlite3NameFrom
b610: 54 6f 6b 65 6e 28 64 62 2c 20 26 70 45 2d 3e 70  Token(db, &pE->p
b620: 4c 65 66 74 2d 3e 74 6f 6b 65 6e 29 3b 0a 20 20  Left->token);.  
b630: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
b640: 20 20 20 20 20 20 20 7a 54 4e 61 6d 65 20 3d 20         zTName = 
b650: 30 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  0;.        }.   
b660: 20 20 20 20 20 66 6f 72 28 69 3d 30 2c 20 70 46       for(i=0, pF
b670: 72 6f 6d 3d 70 54 61 62 4c 69 73 74 2d 3e 61 3b  rom=pTabList->a;
b680: 20 69 3c 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72   i<pTabList->nSr
b690: 63 3b 20 69 2b 2b 2c 20 70 46 72 6f 6d 2b 2b 29  c; i++, pFrom++)
b6a0: 7b 0a 20 20 20 20 20 20 20 20 20 20 54 61 62 6c  {.          Tabl
b6b0: 65 20 2a 70 54 61 62 20 3d 20 70 46 72 6f 6d 2d  e *pTab = pFrom-
b6c0: 3e 70 54 61 62 3b 0a 20 20 20 20 20 20 20 20 20  >pTab;.         
b6d0: 20 63 68 61 72 20 2a 7a 54 61 62 4e 61 6d 65 20   char *zTabName 
b6e0: 3d 20 70 46 72 6f 6d 2d 3e 7a 41 6c 69 61 73 3b  = pFrom->zAlias;
b6f0: 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 7a  .          if( z
b700: 54 61 62 4e 61 6d 65 3d 3d 30 20 7c 7c 20 7a 54  TabName==0 || zT
b710: 61 62 4e 61 6d 65 5b 30 5d 3d 3d 30 20 29 7b 20  abName[0]==0 ){ 
b720: 0a 20 20 20 20 20 20 20 20 20 20 20 20 7a 54 61  .            zTa
b730: 62 4e 61 6d 65 20 3d 20 70 54 61 62 2d 3e 7a 4e  bName = pTab->zN
b740: 61 6d 65 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  ame;.          }
b750: 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 7a  .          if( z
b760: 54 4e 61 6d 65 20 26 26 20 28 7a 54 61 62 4e 61  TName && (zTabNa
b770: 6d 65 3d 3d 30 20 7c 7c 20 7a 54 61 62 4e 61 6d  me==0 || zTabNam
b780: 65 5b 30 5d 3d 3d 30 20 7c 7c 20 0a 20 20 20 20  e[0]==0 || .    
b790: 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c               sql
b7a0: 69 74 65 33 53 74 72 49 43 6d 70 28 7a 54 4e 61  ite3StrICmp(zTNa
b7b0: 6d 65 2c 20 7a 54 61 62 4e 61 6d 65 29 21 3d 30  me, zTabName)!=0
b7c0: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  ) ){.           
b7d0: 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
b7e0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
b7f0: 20 74 61 62 6c 65 53 65 65 6e 20 3d 20 31 3b 0a   tableSeen = 1;.
b800: 20 20 20 20 20 20 20 20 20 20 66 6f 72 28 6a 3d            for(j=
b810: 30 3b 20 6a 3c 70 54 61 62 2d 3e 6e 43 6f 6c 3b  0; j<pTab->nCol;
b820: 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20   j++){.         
b830: 20 20 20 45 78 70 72 20 2a 70 45 78 70 72 2c 20     Expr *pExpr, 
b840: 2a 70 52 69 67 68 74 3b 0a 20 20 20 20 20 20 20  *pRight;.       
b850: 20 20 20 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65       char *zName
b860: 20 3d 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 6a 5d   = pTab->aCol[j]
b870: 2e 7a 4e 61 6d 65 3b 0a 0a 20 20 20 20 20 20 20  .zName;..       
b880: 20 20 20 20 20 2f 2a 20 49 66 20 61 20 63 6f 6c       /* If a col
b890: 75 6d 6e 20 69 73 20 6d 61 72 6b 65 64 20 61 73  umn is marked as
b8a0: 20 27 68 69 64 64 65 6e 27 20 28 63 75 72 72 65   'hidden' (curre
b8b0: 6e 74 6c 79 20 6f 6e 6c 79 20 70 6f 73 73 69 62  ntly only possib
b8c0: 6c 65 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a  le.            *
b8d0: 2a 20 66 6f 72 20 76 69 72 74 75 61 6c 20 74 61  * for virtual ta
b8e0: 62 6c 65 73 29 2c 20 64 6f 20 6e 6f 74 20 69 6e  bles), do not in
b8f0: 63 6c 75 64 65 20 69 74 20 69 6e 20 74 68 65 20  clude it in the 
b900: 65 78 70 61 6e 64 65 64 0a 20 20 20 20 20 20 20  expanded.       
b910: 20 20 20 20 20 2a 2a 20 72 65 73 75 6c 74 2d 73       ** result-s
b920: 65 74 20 6c 69 73 74 2e 0a 20 20 20 20 20 20 20  et list..       
b930: 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
b940: 20 20 20 20 69 66 28 20 49 73 48 69 64 64 65 6e      if( IsHidden
b950: 43 6f 6c 75 6d 6e 28 26 70 54 61 62 2d 3e 61 43  Column(&pTab->aC
b960: 6f 6c 5b 6a 5d 29 20 29 7b 0a 20 20 20 20 20 20  ol[j]) ){.      
b970: 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 49          assert(I
b980: 73 56 69 72 74 75 61 6c 28 70 54 61 62 29 29 3b  sVirtual(pTab));
b990: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 63  .              c
b9a0: 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20  ontinue;.       
b9b0: 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20       }..        
b9c0: 20 20 20 20 69 66 28 20 69 3e 30 20 29 7b 0a 20      if( i>0 ){. 
b9d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 73 74 72               str
b9e0: 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d  uct SrcList_item
b9f0: 20 2a 70 4c 65 66 74 20 3d 20 26 70 54 61 62 4c   *pLeft = &pTabL
ba00: 69 73 74 2d 3e 61 5b 69 2d 31 5d 3b 0a 20 20 20  ist->a[i-1];.   
ba10: 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 28             if( (
ba20: 70 4c 65 66 74 5b 31 5d 2e 6a 6f 69 6e 74 79 70  pLeft[1].jointyp
ba30: 65 20 26 20 4a 54 5f 4e 41 54 55 52 41 4c 29 21  e & JT_NATURAL)!
ba40: 3d 30 20 26 26 0a 20 20 20 20 20 20 20 20 20 20  =0 &&.          
ba50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 63 6f                co
ba60: 6c 75 6d 6e 49 6e 64 65 78 28 70 4c 65 66 74 2d  lumnIndex(pLeft-
ba70: 3e 70 54 61 62 2c 20 7a 4e 61 6d 65 29 3e 3d 30  >pTab, zName)>=0
ba80: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
ba90: 20 20 20 20 2f 2a 20 49 6e 20 61 20 4e 41 54 55      /* In a NATU
baa0: 52 41 4c 20 6a 6f 69 6e 2c 20 6f 6d 69 74 20 74  RAL join, omit t
bab0: 68 65 20 6a 6f 69 6e 20 63 6f 6c 75 6d 6e 73 20  he join columns 
bac0: 66 72 6f 6d 20 74 68 65 20 0a 20 20 20 20 20 20  from the .      
bad0: 20 20 20 20 20 20 20 20 20 20 2a 2a 20 74 61 62            ** tab
bae0: 6c 65 20 6f 6e 20 74 68 65 20 72 69 67 68 74 20  le on the right 
baf0: 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  */.             
bb00: 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20     continue;.   
bb10: 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
bb20: 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 73             if( s
bb30: 71 6c 69 74 65 33 49 64 4c 69 73 74 49 6e 64 65  qlite3IdListInde
bb40: 78 28 70 4c 65 66 74 5b 31 5d 2e 70 55 73 69 6e  x(pLeft[1].pUsin
bb50: 67 2c 20 7a 4e 61 6d 65 29 3e 3d 30 20 29 7b 0a  g, zName)>=0 ){.
bb60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bb70: 2f 2a 20 49 6e 20 61 20 6a 6f 69 6e 20 77 69 74  /* In a join wit
bb80: 68 20 61 20 55 53 49 4e 47 20 63 6c 61 75 73 65  h a USING clause
bb90: 2c 20 6f 6d 69 74 20 63 6f 6c 75 6d 6e 73 20 69  , omit columns i
bba0: 6e 20 74 68 65 0a 20 20 20 20 20 20 20 20 20 20  n the.          
bbb0: 20 20 20 20 20 20 2a 2a 20 75 73 69 6e 67 20 63        ** using c
bbc0: 6c 61 75 73 65 20 66 72 6f 6d 20 74 68 65 20 74  lause from the t
bbd0: 61 62 6c 65 20 6f 6e 20 74 68 65 20 72 69 67 68  able on the righ
bbe0: 74 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  t. */.          
bbf0: 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a        continue;.
bc00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a                }.
bc10: 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
bc20: 20 20 20 20 20 20 20 20 20 20 70 52 69 67 68 74            pRight
bc30: 20 3d 20 73 71 6c 69 74 65 33 50 45 78 70 72 28   = sqlite3PExpr(
bc40: 70 50 61 72 73 65 2c 20 54 4b 5f 49 44 2c 20 30  pParse, TK_ID, 0
bc50: 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  , 0, 0);.       
bc60: 20 20 20 20 20 69 66 28 20 70 52 69 67 68 74 3d       if( pRight=
bc70: 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20  =0 ) break;.    
bc80: 20 20 20 20 20 20 20 20 73 65 74 51 75 6f 74 65          setQuote
bc90: 64 54 6f 6b 65 6e 28 70 50 61 72 73 65 2c 20 26  dToken(pParse, &
bca0: 70 52 69 67 68 74 2d 3e 74 6f 6b 65 6e 2c 20 7a  pRight->token, z
bcb0: 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 20  Name);.         
bcc0: 20 20 20 69 66 28 20 7a 54 61 62 4e 61 6d 65 20     if( zTabName 
bcd0: 26 26 20 28 6c 6f 6e 67 4e 61 6d 65 73 20 7c 7c  && (longNames ||
bce0: 20 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3e   pTabList->nSrc>
bcf0: 31 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  1) ){.          
bd00: 20 20 20 20 45 78 70 72 20 2a 70 4c 65 66 74 20      Expr *pLeft 
bd10: 3d 20 73 71 6c 69 74 65 33 50 45 78 70 72 28 70  = sqlite3PExpr(p
bd20: 50 61 72 73 65 2c 20 54 4b 5f 49 44 2c 20 30 2c  Parse, TK_ID, 0,
bd30: 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20   0, 0);.        
bd40: 20 20 20 20 20 20 70 45 78 70 72 20 3d 20 73 71        pExpr = sq
bd50: 6c 69 74 65 33 50 45 78 70 72 28 70 50 61 72 73  lite3PExpr(pPars
bd60: 65 2c 20 54 4b 5f 44 4f 54 2c 20 70 4c 65 66 74  e, TK_DOT, pLeft
bd70: 2c 20 70 52 69 67 68 74 2c 20 30 29 3b 0a 20 20  , pRight, 0);.  
bd80: 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
bd90: 70 45 78 70 72 3d 3d 30 20 29 20 62 72 65 61 6b  pExpr==0 ) break
bda0: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
bdb0: 73 65 74 51 75 6f 74 65 64 54 6f 6b 65 6e 28 70  setQuotedToken(p
bdc0: 50 61 72 73 65 2c 20 26 70 4c 65 66 74 2d 3e 74  Parse, &pLeft->t
bdd0: 6f 6b 65 6e 2c 20 7a 54 61 62 4e 61 6d 65 29 3b  oken, zTabName);
bde0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73  .              s
bdf0: 65 74 54 6f 6b 65 6e 28 26 70 45 78 70 72 2d 3e  etToken(&pExpr->
be00: 73 70 61 6e 2c 20 0a 20 20 20 20 20 20 20 20 20  span, .         
be10: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
be20: 4d 50 72 69 6e 74 66 28 64 62 2c 20 22 25 73 2e  MPrintf(db, "%s.
be30: 25 73 22 2c 20 7a 54 61 62 4e 61 6d 65 2c 20 7a  %s", zTabName, z
be40: 4e 61 6d 65 29 29 3b 0a 20 20 20 20 20 20 20 20  Name));.        
be50: 20 20 20 20 20 20 70 45 78 70 72 2d 3e 73 70 61        pExpr->spa
be60: 6e 2e 64 79 6e 20 3d 20 31 3b 0a 20 20 20 20 20  n.dyn = 1;.     
be70: 20 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e           pExpr->
be80: 74 6f 6b 65 6e 2e 7a 20 3d 20 30 3b 0a 20 20 20  token.z = 0;.   
be90: 20 20 20 20 20 20 20 20 20 20 20 70 45 78 70 72             pExpr
bea0: 2d 3e 74 6f 6b 65 6e 2e 6e 20 3d 20 30 3b 0a 20  ->token.n = 0;. 
beb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 70 45 78               pEx
bec0: 70 72 2d 3e 74 6f 6b 65 6e 2e 64 79 6e 20 3d 20  pr->token.dyn = 
bed0: 30 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  0;.            }
bee0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
bef0: 20 20 20 20 70 45 78 70 72 20 3d 20 70 52 69 67      pExpr = pRig
bf00: 68 74 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ht;.            
bf10: 20 20 70 45 78 70 72 2d 3e 73 70 61 6e 20 3d 20    pExpr->span = 
bf20: 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 3b 0a 20 20  pExpr->token;.  
bf30: 20 20 20 20 20 20 20 20 20 20 20 20 70 45 78 70              pExp
bf40: 72 2d 3e 73 70 61 6e 2e 64 79 6e 20 3d 20 30 3b  r->span.dyn = 0;
bf50: 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20  .            }. 
bf60: 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 6c             if( l
bf70: 6f 6e 67 4e 61 6d 65 73 20 29 7b 0a 20 20 20 20  ongNames ){.    
bf80: 20 20 20 20 20 20 20 20 20 20 70 4e 65 77 20 3d            pNew =
bf90: 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
bfa0: 41 70 70 65 6e 64 28 70 50 61 72 73 65 2c 20 70  Append(pParse, p
bfb0: 4e 65 77 2c 20 70 45 78 70 72 2c 20 26 70 45 78  New, pExpr, &pEx
bfc0: 70 72 2d 3e 73 70 61 6e 29 3b 0a 20 20 20 20 20  pr->span);.     
bfd0: 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
bfe0: 20 20 20 20 20 20 20 20 20 20 20 20 70 4e 65 77              pNew
bff0: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69   = sqlite3ExprLi
c000: 73 74 41 70 70 65 6e 64 28 70 50 61 72 73 65 2c  stAppend(pParse,
c010: 20 70 4e 65 77 2c 20 70 45 78 70 72 2c 20 26 70   pNew, pExpr, &p
c020: 52 69 67 68 74 2d 3e 74 6f 6b 65 6e 29 3b 0a 20  Right->token);. 
c030: 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
c040: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
c050: 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 21   }.        if( !
c060: 74 61 62 6c 65 53 65 65 6e 20 29 7b 0a 20 20 20  tableSeen ){.   
c070: 20 20 20 20 20 20 20 69 66 28 20 7a 54 4e 61 6d         if( zTNam
c080: 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  e ){.           
c090: 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
c0a0: 28 70 50 61 72 73 65 2c 20 22 6e 6f 20 73 75 63  (pParse, "no suc
c0b0: 68 20 74 61 62 6c 65 3a 20 25 73 22 2c 20 7a 54  h table: %s", zT
c0c0: 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 20  Name);.         
c0d0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
c0e0: 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
c0f0: 4d 73 67 28 70 50 61 72 73 65 2c 20 22 6e 6f 20  Msg(pParse, "no 
c100: 74 61 62 6c 65 73 20 73 70 65 63 69 66 69 65 64  tables specified
c110: 22 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  ");.          }.
c120: 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 31            rc = 1
c130: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
c140: 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
c150: 28 7a 54 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20  (zTName);.      
c160: 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  }.    }.    sqli
c170: 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74  te3ExprListDelet
c180: 65 28 70 45 4c 69 73 74 29 3b 0a 20 20 20 20 70  e(pEList);.    p
c190: 2d 3e 70 45 4c 69 73 74 20 3d 20 70 4e 65 77 3b  ->pEList = pNew;
c1a0: 0a 20 20 7d 0a 23 69 66 20 53 51 4c 49 54 45 5f  .  }.#if SQLITE_
c1b0: 4d 41 58 5f 43 4f 4c 55 4d 4e 0a 20 20 69 66 28  MAX_COLUMN.  if(
c1c0: 20 70 2d 3e 70 45 4c 69 73 74 20 26 26 20 70 2d   p->pEList && p-
c1d0: 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3e 64  >pEList->nExpr>d
c1e0: 62 2d 3e 61 4c 69 6d 69 74 5b 53 51 4c 49 54 45  b->aLimit[SQLITE
c1f0: 5f 4c 49 4d 49 54 5f 43 4f 4c 55 4d 4e 5d 20 29  _LIMIT_COLUMN] )
c200: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72  {.    sqlite3Err
c210: 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 74  orMsg(pParse, "t
c220: 6f 6f 20 6d 61 6e 79 20 63 6f 6c 75 6d 6e 73 20  oo many columns 
c230: 69 6e 20 72 65 73 75 6c 74 20 73 65 74 22 29 3b  in result set");
c240: 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45  .    rc = SQLITE
c250: 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 23 65 6e 64  _ERROR;.  }.#end
c260: 69 66 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c  if.  if( db->mal
c270: 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20  locFailed ){.   
c280: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d   rc = SQLITE_NOM
c290: 45 4d 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  EM;.  }.  return
c2a0: 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 70 45   rc;.}../*.** pE
c2b0: 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f   is a pointer to
c2c0: 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 77   an expression w
c2d0: 68 69 63 68 20 69 73 20 61 20 73 69 6e 67 6c 65  hich is a single
c2e0: 20 74 65 72 6d 20 69 6e 0a 2a 2a 20 4f 52 44 45   term in.** ORDE
c2f0: 52 20 42 59 20 6f 72 20 47 52 4f 55 50 20 42 59  R BY or GROUP BY
c300: 20 63 6c 61 75 73 65 2e 0a 2a 2a 0a 2a 2a 20 41   clause..**.** A
c310: 74 20 74 68 65 20 70 6f 69 6e 74 20 74 68 69 73  t the point this
c320: 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c   routine is call
c330: 65 64 2c 20 77 65 20 61 6c 72 65 61 64 79 20 6b  ed, we already k
c340: 6e 6f 77 20 74 68 61 74 20 74 68 65 0a 2a 2a 20  now that the.** 
c350: 4f 52 44 45 52 20 42 59 20 74 65 72 6d 20 69 73  ORDER BY term is
c360: 20 6e 6f 74 20 61 6e 20 69 6e 74 65 67 65 72 20   not an integer 
c370: 69 6e 64 65 78 20 69 6e 74 6f 20 74 68 65 20 72  index into the r
c380: 65 73 75 6c 74 20 73 65 74 2e 20 20 54 68 61 74  esult set.  That
c390: 0a 2a 2a 20 63 61 73 65 65 20 69 73 20 68 61 6e  .** casee is han
c3a0: 64 6c 65 64 20 62 79 20 74 68 65 20 63 61 6c 6c  dled by the call
c3b0: 69 6e 67 20 72 6f 75 74 69 6e 65 2e 0a 2a 2a 0a  ing routine..**.
c3c0: 2a 2a 20 49 66 20 70 45 20 69 73 20 61 20 77 65  ** If pE is a we
c3d0: 6c 6c 2d 66 6f 72 6d 65 64 20 65 78 70 72 65 73  ll-formed expres
c3e0: 73 69 6f 6e 20 61 6e 64 20 74 68 65 20 53 45 4c  sion and the SEL
c3f0: 45 43 54 20 73 74 61 74 65 6d 65 6e 74 0a 2a 2a  ECT statement.**
c400: 20 69 73 20 6e 6f 74 20 63 6f 6d 70 6f 75 6e 64   is not compound
c410: 2c 20 74 68 65 6e 20 72 65 74 75 72 6e 20 30 2e  , then return 0.
c420: 20 20 54 68 69 73 20 69 6e 64 69 63 61 74 65 73    This indicates
c430: 20 74 6f 20 74 68 65 0a 2a 2a 20 63 61 6c 6c 65   to the.** calle
c440: 72 20 74 68 61 74 20 69 74 20 73 68 6f 75 6c 64  r that it should
c450: 20 73 6f 72 74 20 62 79 20 74 68 65 20 76 61 6c   sort by the val
c460: 75 65 20 6f 66 20 74 68 65 20 4f 52 44 45 52 20  ue of the ORDER 
c470: 42 59 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e  BY.** expression
c480: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 53  ..**.** If the S
c490: 45 4c 45 43 54 20 69 73 20 63 6f 6d 70 6f 75 6e  ELECT is compoun
c4a0: 64 2c 20 74 68 65 6e 20 61 74 74 65 6d 70 74 20  d, then attempt 
c4b0: 74 6f 20 6d 61 74 63 68 20 70 45 20 61 67 61 69  to match pE agai
c4c0: 6e 73 74 0a 2a 2a 20 72 65 73 75 6c 74 20 73 65  nst.** result se
c4d0: 74 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65  t columns in the
c4e0: 20 6c 65 66 74 2d 6d 6f 73 74 20 53 45 4c 45 43   left-most SELEC
c4f0: 54 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 52 65  T statement.  Re
c500: 74 75 72 6e 0a 2a 2a 20 74 68 65 20 69 6e 64 65  turn.** the inde
c510: 78 20 69 20 6f 66 20 74 68 65 20 6d 61 74 63 68  x i of the match
c520: 69 6e 67 20 63 6f 6c 75 6d 6e 2c 20 61 73 20 61  ing column, as a
c530: 6e 20 69 6e 64 69 63 61 74 69 6f 6e 20 74 6f 20  n indication to 
c540: 74 68 65 20 0a 2a 2a 20 63 61 6c 6c 65 72 20 74  the .** caller t
c550: 68 61 74 20 69 74 20 73 68 6f 75 6c 64 20 73 6f  hat it should so
c560: 72 74 20 62 79 20 74 68 65 20 69 2d 74 68 20 63  rt by the i-th c
c570: 6f 6c 75 6d 6e 2e 20 20 49 66 20 74 68 65 72 65  olumn.  If there
c580: 20 69 73 0a 2a 2a 20 6e 6f 20 6d 61 74 63 68 2c   is.** no match,
c590: 20 72 65 74 75 72 6e 20 2d 31 20 61 6e 64 20 6c   return -1 and l
c5a0: 65 61 76 65 20 61 6e 20 65 72 72 6f 72 20 6d 65  eave an error me
c5b0: 73 73 61 67 65 20 69 6e 20 70 50 61 72 73 65 2e  ssage in pParse.
c5c0: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6d  .*/.static int m
c5d0: 61 74 63 68 4f 72 64 65 72 42 79 54 65 72 6d 54  atchOrderByTermT
c5e0: 6f 45 78 70 72 4c 69 73 74 28 0a 20 20 50 61 72  oExprList(.  Par
c5f0: 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20  se *pParse,     
c600: 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65  /* Parsing conte
c610: 78 74 20 66 6f 72 20 65 72 72 6f 72 20 6d 65 73  xt for error mes
c620: 73 61 67 65 73 20 2a 2f 0a 20 20 53 65 6c 65 63  sages */.  Selec
c630: 74 20 2a 70 53 65 6c 65 63 74 2c 20 20 20 2f 2a  t *pSelect,   /*
c640: 20 54 68 65 20 53 45 4c 45 43 54 20 73 74 61 74   The SELECT stat
c650: 65 6d 65 6e 74 20 77 69 74 68 20 74 68 65 20 4f  ement with the O
c660: 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 2a  RDER BY clause *
c670: 2f 0a 20 20 45 78 70 72 20 2a 70 45 2c 20 20 20  /.  Expr *pE,   
c680: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 73 70         /* The sp
c690: 65 63 69 66 69 63 20 4f 52 44 45 52 20 42 59 20  ecific ORDER BY 
c6a0: 74 65 72 6d 20 2a 2f 0a 20 20 69 6e 74 20 69 64  term */.  int id
c6b0: 78 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  x,           /* 
c6c0: 57 68 65 6e 20 4f 52 44 45 52 20 42 59 20 74 65  When ORDER BY te
c6d0: 72 6d 20 69 73 20 74 68 69 73 20 2a 2f 0a 20 20  rm is this */.  
c6e0: 69 6e 74 20 69 73 43 6f 6d 70 6f 75 6e 64 2c 20  int isCompound, 
c6f0: 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 74 68     /* True if th
c700: 69 73 20 69 73 20 61 20 63 6f 6d 70 6f 75 6e 64  is is a compound
c710: 20 53 45 4c 45 43 54 20 2a 2f 0a 20 20 75 38 20   SELECT */.  u8 
c720: 2a 70 48 61 73 41 67 67 20 20 20 20 20 20 20 20  *pHasAgg        
c730: 2f 2a 20 54 72 75 65 20 69 66 20 65 78 70 72 65  /* True if expre
c740: 73 73 69 6f 6e 20 63 6f 6e 74 61 69 6e 73 20 61  ssion contains a
c750: 67 67 72 65 67 61 74 65 20 66 75 6e 63 74 69 6f  ggregate functio
c760: 6e 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69  ns */.){.  int i
c770: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
c780: 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f   Loop counter */
c790: 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c  .  ExprList *pEL
c7a0: 69 73 74 3b 20 20 2f 2a 20 54 68 65 20 63 6f 6c  ist;  /* The col
c7b0: 75 6d 6e 73 20 6f 66 20 74 68 65 20 72 65 73 75  umns of the resu
c7c0: 6c 74 20 73 65 74 20 2a 2f 0a 20 20 4e 61 6d 65  lt set */.  Name
c7d0: 43 6f 6e 74 65 78 74 20 6e 63 3b 20 20 20 20 2f  Context nc;    /
c7e0: 2a 20 4e 61 6d 65 20 63 6f 6e 74 65 78 74 20 66  * Name context f
c7f0: 6f 72 20 72 65 73 6f 6c 76 69 6e 67 20 70 45 20  or resolving pE 
c800: 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71  */..  assert( sq
c810: 6c 69 74 65 33 45 78 70 72 49 73 49 6e 74 65 67  lite3ExprIsInteg
c820: 65 72 28 70 45 2c 20 26 69 29 3d 3d 30 20 29 3b  er(pE, &i)==0 );
c830: 0a 20 20 70 45 4c 69 73 74 20 3d 20 70 53 65 6c  .  pEList = pSel
c840: 65 63 74 2d 3e 70 45 4c 69 73 74 3b 0a 0a 20 20  ect->pEList;..  
c850: 2f 2a 20 49 66 20 74 68 65 20 74 65 72 6d 20 69  /* If the term i
c860: 73 20 61 20 73 69 6d 70 6c 65 20 69 64 65 6e 74  s a simple ident
c870: 69 66 69 65 72 20 74 68 61 74 20 74 72 79 20 74  ifier that try t
c880: 6f 20 6d 61 74 63 68 20 74 68 61 74 20 69 64 65  o match that ide
c890: 6e 74 69 66 69 65 72 0a 20 20 2a 2a 20 61 67 61  ntifier.  ** aga
c8a0: 69 6e 73 74 20 61 20 63 6f 6c 75 6d 6e 20 6e 61  inst a column na
c8b0: 6d 65 20 69 6e 20 74 68 65 20 72 65 73 75 6c 74  me in the result
c8c0: 20 73 65 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28   set..  */.  if(
c8d0: 20 70 45 2d 3e 6f 70 3d 3d 54 4b 5f 49 44 20 7c   pE->op==TK_ID |
c8e0: 7c 20 28 70 45 2d 3e 6f 70 3d 3d 54 4b 5f 53 54  | (pE->op==TK_ST
c8f0: 52 49 4e 47 20 26 26 20 70 45 2d 3e 74 6f 6b 65  RING && pE->toke
c900: 6e 2e 7a 5b 30 5d 21 3d 27 5c 27 27 29 20 29 7b  n.z[0]!='\'') ){
c910: 0a 20 20 20 20 73 71 6c 69 74 65 33 20 2a 64 62  .    sqlite3 *db
c920: 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20   = pParse->db;. 
c930: 20 20 20 63 68 61 72 20 2a 7a 43 6f 6c 20 3d 20     char *zCol = 
c940: 73 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54  sqlite3NameFromT
c950: 6f 6b 65 6e 28 64 62 2c 20 26 70 45 2d 3e 74 6f  oken(db, &pE->to
c960: 6b 65 6e 29 3b 0a 20 20 20 20 69 66 28 20 7a 43  ken);.    if( zC
c970: 6f 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72  ol==0 ){.      r
c980: 65 74 75 72 6e 20 2d 31 3b 0a 20 20 20 20 7d 0a  eturn -1;.    }.
c990: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70      for(i=0; i<p
c9a0: 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b  EList->nExpr; i+
c9b0: 2b 29 7b 0a 20 20 20 20 20 20 63 68 61 72 20 2a  +){.      char *
c9c0: 7a 41 73 20 3d 20 70 45 4c 69 73 74 2d 3e 61 5b  zAs = pEList->a[
c9d0: 69 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20  i].zName;.      
c9e0: 69 66 28 20 7a 41 73 21 3d 30 20 26 26 20 73 71  if( zAs!=0 && sq
c9f0: 6c 69 74 65 33 53 74 72 49 43 6d 70 28 7a 41 73  lite3StrICmp(zAs
ca00: 2c 20 7a 43 6f 6c 29 3d 3d 30 20 29 7b 0a 20 20  , zCol)==0 ){.  
ca10: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72        sqlite3_fr
ca20: 65 65 28 7a 43 6f 6c 29 3b 0a 20 20 20 20 20 20  ee(zCol);.      
ca30: 20 20 72 65 74 75 72 6e 20 69 2b 31 3b 0a 20 20    return i+1;.  
ca40: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
ca50: 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 43 6f  sqlite3_free(zCo
ca60: 6c 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 65  l);.  }..  /* Re
ca70: 73 6f 6c 76 65 20 61 6c 6c 20 6e 61 6d 65 73 20  solve all names 
ca80: 69 6e 20 74 68 65 20 4f 52 44 45 52 20 42 59 20  in the ORDER BY 
ca90: 74 65 72 6d 20 65 78 70 72 65 73 73 69 6f 6e 0a  term expression.
caa0: 20 20 2a 2f 0a 20 20 6d 65 6d 73 65 74 28 26 6e    */.  memset(&n
cab0: 63 2c 20 30 2c 20 73 69 7a 65 6f 66 28 6e 63 29  c, 0, sizeof(nc)
cac0: 29 3b 0a 20 20 6e 63 2e 70 50 61 72 73 65 20 3d  );.  nc.pParse =
cad0: 20 70 50 61 72 73 65 3b 0a 20 20 6e 63 2e 70 53   pParse;.  nc.pS
cae0: 72 63 4c 69 73 74 20 3d 20 70 53 65 6c 65 63 74  rcList = pSelect
caf0: 2d 3e 70 53 72 63 3b 0a 20 20 6e 63 2e 70 45 4c  ->pSrc;.  nc.pEL
cb00: 69 73 74 20 3d 20 70 45 4c 69 73 74 3b 0a 20 20  ist = pEList;.  
cb10: 6e 63 2e 61 6c 6c 6f 77 41 67 67 20 3d 20 31 3b  nc.allowAgg = 1;
cb20: 0a 20 20 6e 63 2e 6e 45 72 72 20 3d 20 30 3b 0a  .  nc.nErr = 0;.
cb30: 20 20 69 66 28 20 73 71 6c 69 74 65 33 45 78 70    if( sqlite3Exp
cb40: 72 52 65 73 6f 6c 76 65 4e 61 6d 65 73 28 26 6e  rResolveNames(&n
cb50: 63 2c 20 70 45 29 20 29 7b 0a 20 20 20 20 69 66  c, pE) ){.    if
cb60: 28 20 69 73 43 6f 6d 70 6f 75 6e 64 20 29 7b 0a  ( isCompound ){.
cb70: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72        sqlite3Err
cb80: 6f 72 43 6c 65 61 72 28 70 50 61 72 73 65 29 3b  orClear(pParse);
cb90: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b  .      return 0;
cba0: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
cbb0: 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20 20    return -1;.   
cbc0: 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 6e 63 2e   }.  }.  if( nc.
cbd0: 68 61 73 41 67 67 20 26 26 20 70 48 61 73 41 67  hasAgg && pHasAg
cbe0: 67 20 29 7b 0a 20 20 20 20 2a 70 48 61 73 41 67  g ){.    *pHasAg
cbf0: 67 20 3d 20 31 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  g = 1;.  }..  /*
cc00: 20 46 6f 72 20 61 20 63 6f 6d 70 6f 75 6e 64 20   For a compound 
cc10: 53 45 4c 45 43 54 2c 20 77 65 20 6e 65 65 64 20  SELECT, we need 
cc20: 74 6f 20 74 72 79 20 74 6f 20 6d 61 74 63 68 20  to try to match 
cc30: 74 68 65 20 4f 52 44 45 52 20 42 59 0a 20 20 2a  the ORDER BY.  *
cc40: 2a 20 65 78 70 72 65 73 73 69 6f 6e 20 61 67 61  * expression aga
cc50: 69 6e 73 74 20 61 6e 20 65 78 70 72 65 73 73 69  inst an expressi
cc60: 6f 6e 20 69 6e 20 74 68 65 20 72 65 73 75 6c 74  on in the result
cc70: 20 73 65 74 0a 20 20 2a 2f 0a 20 20 69 66 28 20   set.  */.  if( 
cc80: 69 73 43 6f 6d 70 6f 75 6e 64 20 29 7b 0a 20 20  isCompound ){.  
cc90: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 45 4c    for(i=0; i<pEL
cca0: 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29  ist->nExpr; i++)
ccb0: 7b 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69  {.      if( sqli
ccc0: 74 65 33 45 78 70 72 43 6f 6d 70 61 72 65 28 70  te3ExprCompare(p
ccd0: 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70  EList->a[i].pExp
cce0: 72 2c 20 70 45 29 20 29 7b 0a 20 20 20 20 20 20  r, pE) ){.      
ccf0: 20 20 72 65 74 75 72 6e 20 69 2b 31 3b 0a 20 20    return i+1;.  
cd00: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
cd10: 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 0a    return 0;.}...
cd20: 2f 2a 0a 2a 2a 20 41 6e 61 6c 79 7a 65 20 61 6e  /*.** Analyze an
cd30: 64 20 4f 52 44 45 52 20 42 59 20 6f 72 20 47 52  d ORDER BY or GR
cd40: 4f 55 50 20 42 59 20 63 6c 61 75 73 65 20 69 6e  OUP BY clause in
cd50: 20 61 20 73 69 6d 70 6c 65 20 53 45 4c 45 43 54   a simple SELECT
cd60: 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 20 52   statement..** R
cd70: 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72  eturn the number
cd80: 20 6f 66 20 65 72 72 6f 72 73 20 73 65 65 6e 2e   of errors seen.
cd90: 0a 2a 2a 0a 2a 2a 20 45 76 65 72 79 20 74 65 72  .**.** Every ter
cda0: 6d 20 6f 66 20 74 68 65 20 4f 52 44 45 52 20 42  m of the ORDER B
cdb0: 59 20 6f 72 20 47 52 4f 55 50 20 42 59 20 63 6c  Y or GROUP BY cl
cdc0: 61 75 73 65 20 6e 65 65 64 73 20 74 6f 20 62 65  ause needs to be
cdd0: 20 61 6e 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f   an.** expressio
cde0: 6e 2e 20 20 49 66 20 61 6e 79 20 65 78 70 72 65  n.  If any expre
cdf0: 73 73 69 6f 6e 20 69 73 20 61 6e 20 69 6e 74 65  ssion is an inte
ce00: 67 65 72 20 63 6f 6e 73 74 61 6e 74 2c 20 74 68  ger constant, th
ce10: 65 6e 0a 2a 2a 20 74 68 61 74 20 65 78 70 72 65  en.** that expre
ce20: 73 73 69 6f 6e 20 69 73 20 72 65 70 6c 61 63 65  ssion is replace
ce30: 64 20 62 79 20 74 68 65 20 63 6f 72 72 65 73 70  d by the corresp
ce40: 6f 6e 64 69 6e 67 20 0a 2a 2a 20 65 78 70 72 65  onding .** expre
ce50: 73 73 69 6f 6e 20 66 72 6f 6d 20 74 68 65 20 72  ssion from the r
ce60: 65 73 75 6c 74 20 73 65 74 2e 0a 2a 2f 0a 73 74  esult set..*/.st
ce70: 61 74 69 63 20 69 6e 74 20 70 72 6f 63 65 73 73  atic int process
ce80: 4f 72 64 65 72 47 72 6f 75 70 42 79 28 0a 20 20  OrderGroupBy(.  
ce90: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
cea0: 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67        /* Parsing
ceb0: 20 63 6f 6e 74 65 78 74 2e 20 20 4c 65 61 76 65   context.  Leave
cec0: 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 73 20   error messages 
ced0: 68 65 72 65 20 2a 2f 0a 20 20 53 65 6c 65 63 74  here */.  Select
cee0: 20 2a 70 53 65 6c 65 63 74 2c 20 20 20 20 20 20   *pSelect,      
cef0: 2f 2a 20 54 68 65 20 53 45 4c 45 43 54 20 73 74  /* The SELECT st
cf00: 61 74 65 6d 65 6e 74 20 63 6f 6e 74 61 69 6e 69  atement containi
cf10: 6e 67 20 74 68 65 20 63 6c 61 75 73 65 20 2a 2f  ng the clause */
cf20: 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4f 72  .  ExprList *pOr
cf30: 64 65 72 42 79 2c 20 20 20 2f 2a 20 54 68 65 20  derBy,   /* The 
cf40: 4f 52 44 45 52 20 42 59 20 6f 72 20 47 52 4f 55  ORDER BY or GROU
cf50: 50 20 42 59 20 63 6c 61 75 73 65 20 74 6f 20 62  P BY clause to b
cf60: 65 20 70 72 6f 63 65 73 73 65 64 20 2a 2f 0a 20  e processed */. 
cf70: 20 69 6e 74 20 69 73 4f 72 64 65 72 2c 20 20 20   int isOrder,   
cf80: 20 20 20 20 20 20 20 2f 2a 20 31 20 66 6f 72 20         /* 1 for 
cf90: 4f 52 44 45 52 20 42 59 2e 20 20 30 20 66 6f 72  ORDER BY.  0 for
cfa0: 20 47 52 4f 55 50 20 42 59 20 2a 2f 0a 20 20 75   GROUP BY */.  u
cfb0: 38 20 2a 70 48 61 73 41 67 67 20 20 20 20 20 20  8 *pHasAgg      
cfc0: 20 20 20 20 20 2f 2a 20 53 65 74 20 74 6f 20 54       /* Set to T
cfd0: 52 55 45 20 69 66 20 61 6e 79 20 74 65 72 6d 20  RUE if any term 
cfe0: 63 6f 6e 74 61 69 6e 73 20 61 6e 20 61 67 67 72  contains an aggr
cff0: 65 67 61 74 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e  egate */.){.  in
d000: 74 20 69 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a  t i;.  sqlite3 *
d010: 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b  db = pParse->db;
d020: 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c  .  ExprList *pEL
d030: 69 73 74 3b 0a 0a 20 20 69 66 28 20 70 4f 72 64  ist;..  if( pOrd
d040: 65 72 42 79 3d 3d 30 20 7c 7c 20 70 50 61 72 73  erBy==0 || pPars
d050: 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  e->db->mallocFai
d060: 6c 65 64 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  led ) return 0;.
d070: 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f 43  #if SQLITE_MAX_C
d080: 4f 4c 55 4d 4e 0a 20 20 69 66 28 20 70 4f 72 64  OLUMN.  if( pOrd
d090: 65 72 42 79 2d 3e 6e 45 78 70 72 3e 64 62 2d 3e  erBy->nExpr>db->
d0a0: 61 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49  aLimit[SQLITE_LI
d0b0: 4d 49 54 5f 43 4f 4c 55 4d 4e 5d 20 29 7b 0a 20  MIT_COLUMN] ){. 
d0c0: 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
d0d0: 54 79 70 65 20 3d 20 69 73 4f 72 64 65 72 20 3f  Type = isOrder ?
d0e0: 20 22 4f 52 44 45 52 22 20 3a 20 22 47 52 4f 55   "ORDER" : "GROU
d0f0: 50 22 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45  P";.    sqlite3E
d100: 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
d110: 22 74 6f 6f 20 6d 61 6e 79 20 74 65 72 6d 73 20  "too many terms 
d120: 69 6e 20 25 73 20 42 59 20 63 6c 61 75 73 65 22  in %s BY clause"
d130: 2c 20 7a 54 79 70 65 29 3b 0a 20 20 20 20 72 65  , zType);.    re
d140: 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 23 65 6e 64  turn 1;.  }.#end
d150: 69 66 0a 20 20 70 45 4c 69 73 74 20 3d 20 70 53  if.  pEList = pS
d160: 65 6c 65 63 74 2d 3e 70 45 4c 69 73 74 3b 0a 20  elect->pEList;. 
d170: 20 69 66 28 20 70 45 4c 69 73 74 3d 3d 30 20 29   if( pEList==0 )
d180: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a  {.    return 0;.
d190: 20 20 7d 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69    }.  for(i=0; i
d1a0: 3c 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72  <pOrderBy->nExpr
d1b0: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 6e 74 20  ; i++){.    int 
d1c0: 69 43 6f 6c 3b 0a 20 20 20 20 45 78 70 72 20 2a  iCol;.    Expr *
d1d0: 70 45 20 3d 20 70 4f 72 64 65 72 42 79 2d 3e 61  pE = pOrderBy->a
d1e0: 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 69  [i].pExpr;.    i
d1f0: 66 28 20 73 71 6c 69 74 65 33 45 78 70 72 49 73  f( sqlite3ExprIs
d200: 49 6e 74 65 67 65 72 28 70 45 2c 20 26 69 43 6f  Integer(pE, &iCo
d210: 6c 29 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  l) ){.      if( 
d220: 69 43 6f 6c 3c 3d 30 20 7c 7c 20 69 43 6f 6c 3e  iCol<=0 || iCol>
d230: 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 20 29 7b  pEList->nExpr ){
d240: 0a 20 20 20 20 20 20 20 20 63 6f 6e 73 74 20 63  .        const c
d250: 68 61 72 20 2a 7a 54 79 70 65 20 3d 20 69 73 4f  har *zType = isO
d260: 72 64 65 72 20 3f 20 22 4f 52 44 45 52 22 20 3a  rder ? "ORDER" :
d270: 20 22 47 52 4f 55 50 22 3b 0a 20 20 20 20 20 20   "GROUP";.      
d280: 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
d290: 67 28 70 50 61 72 73 65 2c 20 0a 20 20 20 20 20  g(pParse, .     
d2a0: 20 20 20 20 20 20 22 25 72 20 25 73 20 42 59 20        "%r %s BY 
d2b0: 74 65 72 6d 20 6f 75 74 20 6f 66 20 72 61 6e 67  term out of rang
d2c0: 65 20 2d 20 73 68 6f 75 6c 64 20 62 65 20 22 0a  e - should be ".
d2d0: 20 20 20 20 20 20 20 20 20 20 20 22 62 65 74 77             "betw
d2e0: 65 65 6e 20 31 20 61 6e 64 20 25 64 22 2c 20 69  een 1 and %d", i
d2f0: 2b 31 2c 20 7a 54 79 70 65 2c 20 70 45 4c 69 73  +1, zType, pELis
d300: 74 2d 3e 6e 45 78 70 72 29 3b 0a 20 20 20 20 20  t->nExpr);.     
d310: 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20     return 1;.   
d320: 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a     }.    }else{.
d330: 20 20 20 20 20 20 69 43 6f 6c 20 3d 20 6d 61 74        iCol = mat
d340: 63 68 4f 72 64 65 72 42 79 54 65 72 6d 54 6f 45  chOrderByTermToE
d350: 78 70 72 4c 69 73 74 28 70 50 61 72 73 65 2c 20  xprList(pParse, 
d360: 70 53 65 6c 65 63 74 2c 20 70 45 2c 20 69 2b 31  pSelect, pE, i+1
d370: 2c 20 30 2c 20 70 48 61 73 41 67 67 29 3b 0a 20  , 0, pHasAgg);. 
d380: 20 20 20 20 20 69 66 28 20 69 43 6f 6c 3c 30 20       if( iCol<0 
d390: 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  ){.        retur
d3a0: 6e 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  n 1;.      }.   
d3b0: 20 7d 0a 20 20 20 20 69 66 28 20 69 43 6f 6c 3e   }.    if( iCol>
d3c0: 30 20 29 7b 0a 20 20 20 20 20 20 43 6f 6c 6c 53  0 ){.      CollS
d3d0: 65 71 20 2a 70 43 6f 6c 6c 20 3d 20 70 45 2d 3e  eq *pColl = pE->
d3e0: 70 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 69 6e 74  pColl;.      int
d3f0: 20 66 6c 61 67 73 20 3d 20 70 45 2d 3e 66 6c 61   flags = pE->fla
d400: 67 73 20 26 20 45 50 5f 45 78 70 43 6f 6c 6c 61  gs & EP_ExpColla
d410: 74 65 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  te;.      sqlite
d420: 33 45 78 70 72 44 65 6c 65 74 65 28 70 45 29 3b  3ExprDelete(pE);
d430: 0a 20 20 20 20 20 20 70 45 20 3d 20 73 71 6c 69  .      pE = sqli
d440: 74 65 33 45 78 70 72 44 75 70 28 64 62 2c 20 70  te3ExprDup(db, p
d450: 45 4c 69 73 74 2d 3e 61 5b 69 43 6f 6c 2d 31 5d  EList->a[iCol-1]
d460: 2e 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20 70  .pExpr);.      p
d470: 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 70 45  OrderBy->a[i].pE
d480: 78 70 72 20 3d 20 70 45 3b 0a 20 20 20 20 20 20  xpr = pE;.      
d490: 69 66 28 20 70 45 20 26 26 20 70 43 6f 6c 6c 20  if( pE && pColl 
d4a0: 26 26 20 66 6c 61 67 73 20 29 7b 0a 20 20 20 20  && flags ){.    
d4b0: 20 20 20 20 70 45 2d 3e 70 43 6f 6c 6c 20 3d 20      pE->pColl = 
d4c0: 70 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 20 20 70  pColl;.        p
d4d0: 45 2d 3e 66 6c 61 67 73 20 7c 3d 20 66 6c 61 67  E->flags |= flag
d4e0: 73 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  s;.      }.    }
d4f0: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b  .  }.  return 0;
d500: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6e 61 6c 79 7a  .}../*.** Analyz
d510: 65 20 61 6e 64 20 4f 52 44 45 52 20 42 59 20 6f  e and ORDER BY o
d520: 72 20 47 52 4f 55 50 20 42 59 20 63 6c 61 75 73  r GROUP BY claus
d530: 65 20 69 6e 20 61 20 53 45 4c 45 43 54 20 73 74  e in a SELECT st
d540: 61 74 65 6d 65 6e 74 2e 20 20 52 65 74 75 72 6e  atement.  Return
d550: 0a 2a 2a 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  .** the number o
d560: 66 20 65 72 72 6f 72 73 20 73 65 65 6e 2e 0a 2a  f errors seen..*
d570: 2a 0a 2a 2a 20 49 66 20 69 54 61 62 6c 65 3e 30  *.** If iTable>0
d580: 20 74 68 65 6e 20 6d 61 6b 65 20 74 68 65 20 4e   then make the N
d590: 2d 74 68 20 74 65 72 6d 20 6f 66 20 74 68 65 20  -th term of the 
d5a0: 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20  ORDER BY clause 
d5b0: 72 65 66 65 72 20 74 6f 0a 2a 2a 20 74 68 65 20  refer to.** the 
d5c0: 4e 2d 74 68 20 63 6f 6c 75 6d 6e 20 6f 66 20 74  N-th column of t
d5d0: 61 62 6c 65 20 69 54 61 62 6c 65 2e 0a 2a 2a 0a  able iTable..**.
d5e0: 2a 2a 20 49 66 20 69 54 61 62 6c 65 3d 3d 30 20  ** If iTable==0 
d5f0: 74 68 65 6e 20 74 72 61 6e 73 66 6f 72 6d 20 65  then transform e
d600: 61 63 68 20 74 65 72 6d 20 6f 66 20 74 68 65 20  ach term of the 
d610: 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20  ORDER BY clause 
d620: 74 6f 20 72 65 66 65 72 0a 2a 2a 20 74 6f 20 61  to refer.** to a
d630: 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 68 65 20 72   column of the r
d640: 65 73 75 6c 74 20 73 65 74 20 62 79 20 6e 75 6d  esult set by num
d650: 62 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ber..*/.static i
d660: 6e 74 20 70 72 6f 63 65 73 73 43 6f 6d 70 6f 75  nt processCompou
d670: 6e 64 4f 72 64 65 72 42 79 28 0a 20 20 50 61 72  ndOrderBy(.  Par
d680: 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20  se *pParse,     
d690: 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f     /* Parsing co
d6a0: 6e 74 65 78 74 2e 20 20 4c 65 61 76 65 20 65 72  ntext.  Leave er
d6b0: 72 6f 72 20 6d 65 73 73 61 67 65 73 20 68 65 72  ror messages her
d6c0: 65 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70  e */.  Select *p
d6d0: 53 65 6c 65 63 74 2c 20 20 20 20 20 20 2f 2a 20  Select,      /* 
d6e0: 54 68 65 20 53 45 4c 45 43 54 20 73 74 61 74 65  The SELECT state
d6f0: 6d 65 6e 74 20 63 6f 6e 74 61 69 6e 69 6e 67 20  ment containing 
d700: 74 68 65 20 4f 52 44 45 52 20 42 59 20 2a 2f 0a  the ORDER BY */.
d710: 20 20 69 6e 74 20 69 54 61 62 6c 65 20 20 20 20    int iTable    
d720: 20 20 20 20 20 20 20 20 2f 2a 20 4f 75 74 70 75          /* Outpu
d730: 74 20 74 61 62 6c 65 20 66 6f 72 20 63 6f 6d 70  t table for comp
d740: 6f 75 6e 64 20 53 45 4c 45 43 54 20 73 74 61 74  ound SELECT stat
d750: 65 6d 65 6e 74 73 20 2a 2f 0a 29 7b 0a 20 20 69  ements */.){.  i
d760: 6e 74 20 69 3b 0a 20 20 45 78 70 72 4c 69 73 74  nt i;.  ExprList
d770: 20 2a 70 4f 72 64 65 72 42 79 3b 0a 20 20 45 78   *pOrderBy;.  Ex
d780: 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 3b 0a  prList *pEList;.
d790: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20    sqlite3 *db;. 
d7a0: 20 69 6e 74 20 6d 6f 72 65 54 6f 44 6f 20 3d 20   int moreToDo = 
d7b0: 31 3b 0a 0a 20 20 70 4f 72 64 65 72 42 79 20 3d  1;..  pOrderBy =
d7c0: 20 70 53 65 6c 65 63 74 2d 3e 70 4f 72 64 65 72   pSelect->pOrder
d7d0: 42 79 3b 0a 20 20 69 66 28 20 70 4f 72 64 65 72  By;.  if( pOrder
d7e0: 42 79 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30  By==0 ) return 0
d7f0: 3b 0a 20 20 64 62 20 3d 20 70 50 61 72 73 65 2d  ;.  db = pParse-
d800: 3e 64 62 3b 0a 23 69 66 20 53 51 4c 49 54 45 5f  >db;.#if SQLITE_
d810: 4d 41 58 5f 43 4f 4c 55 4d 4e 0a 20 20 69 66 28  MAX_COLUMN.  if(
d820: 20 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72   pOrderBy->nExpr
d830: 3e 64 62 2d 3e 61 4c 69 6d 69 74 5b 53 51 4c 49  >db->aLimit[SQLI
d840: 54 45 5f 4c 49 4d 49 54 5f 43 4f 4c 55 4d 4e 5d  TE_LIMIT_COLUMN]
d850: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45   ){.    sqlite3E
d860: 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
d870: 22 74 6f 6f 20 6d 61 6e 79 20 74 65 72 6d 73 20  "too many terms 
d880: 69 6e 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75  in ORDER BY clau
d890: 73 65 22 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  se");.    return
d8a0: 20 31 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20   1;.  }.#endif. 
d8b0: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4f 72 64   for(i=0; i<pOrd
d8c0: 65 72 42 79 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b  erBy->nExpr; i++
d8d0: 29 7b 0a 20 20 20 20 70 4f 72 64 65 72 42 79 2d  ){.    pOrderBy-
d8e0: 3e 61 5b 69 5d 2e 64 6f 6e 65 20 3d 20 30 3b 0a  >a[i].done = 0;.
d8f0: 20 20 7d 0a 20 20 77 68 69 6c 65 28 20 70 53 65    }.  while( pSe
d900: 6c 65 63 74 2d 3e 70 50 72 69 6f 72 20 29 7b 0a  lect->pPrior ){.
d910: 20 20 20 20 70 53 65 6c 65 63 74 20 3d 20 70 53      pSelect = pS
d920: 65 6c 65 63 74 2d 3e 70 50 72 69 6f 72 3b 0a 20  elect->pPrior;. 
d930: 20 7d 0a 20 20 77 68 69 6c 65 28 20 70 53 65 6c   }.  while( pSel
d940: 65 63 74 20 26 26 20 6d 6f 72 65 54 6f 44 6f 20  ect && moreToDo 
d950: 29 7b 0a 20 20 20 20 6d 6f 72 65 54 6f 44 6f 20  ){.    moreToDo 
d960: 3d 20 30 3b 0a 20 20 20 20 70 45 4c 69 73 74 20  = 0;.    pEList 
d970: 3d 20 70 53 65 6c 65 63 74 2d 3e 70 45 4c 69 73  = pSelect->pELis
d980: 74 3b 0a 20 20 20 20 69 66 28 20 70 45 4c 69 73  t;.    if( pELis
d990: 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 65  t==0 ){.      re
d9a0: 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20  turn 1;.    }.  
d9b0: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4f 72    for(i=0; i<pOr
d9c0: 64 65 72 42 79 2d 3e 6e 45 78 70 72 3b 20 69 2b  derBy->nExpr; i+
d9d0: 2b 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 43  +){.      int iC
d9e0: 6f 6c 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 45  ol = -1;.      E
d9f0: 78 70 72 20 2a 70 45 2c 20 2a 70 44 75 70 3b 0a  xpr *pE, *pDup;.
da00: 20 20 20 20 20 20 69 66 28 20 70 4f 72 64 65 72        if( pOrder
da10: 42 79 2d 3e 61 5b 69 5d 2e 64 6f 6e 65 20 29 20  By->a[i].done ) 
da20: 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
da30: 70 45 20 3d 20 70 4f 72 64 65 72 42 79 2d 3e 61  pE = pOrderBy->a
da40: 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 20  [i].pExpr;.     
da50: 20 69 66 28 20 73 71 6c 69 74 65 33 45 78 70 72   if( sqlite3Expr
da60: 49 73 49 6e 74 65 67 65 72 28 70 45 2c 20 26 69  IsInteger(pE, &i
da70: 43 6f 6c 29 20 29 7b 0a 20 20 20 20 20 20 20 20  Col) ){.        
da80: 69 66 28 20 69 43 6f 6c 3c 30 20 7c 7c 20 69 43  if( iCol<0 || iC
da90: 6f 6c 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72  ol>pEList->nExpr
daa0: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71   ){.          sq
dab0: 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
dac0: 61 72 73 65 2c 20 0a 20 20 20 20 20 20 20 20 20  arse, .         
dad0: 20 20 20 20 22 25 72 20 4f 52 44 45 52 20 42 59      "%r ORDER BY
dae0: 20 74 65 72 6d 20 6f 75 74 20 6f 66 20 72 61 6e   term out of ran
daf0: 67 65 20 2d 20 73 68 6f 75 6c 64 20 62 65 20 22  ge - should be "
db00: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 22 62  .             "b
db10: 65 74 77 65 65 6e 20 31 20 61 6e 64 20 25 64 22  etween 1 and %d"
db20: 2c 20 69 2b 31 2c 20 70 45 4c 69 73 74 2d 3e 6e  , i+1, pEList->n
db30: 45 78 70 72 29 3b 0a 20 20 20 20 20 20 20 20 20  Expr);.         
db40: 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 20   return 1;.     
db50: 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65     }.      }else
db60: 7b 0a 20 20 20 20 20 20 20 20 70 44 75 70 20 3d  {.        pDup =
db70: 20 73 71 6c 69 74 65 33 45 78 70 72 44 75 70 28   sqlite3ExprDup(
db80: 64 62 2c 20 70 45 29 3b 0a 20 20 20 20 20 20 20  db, pE);.       
db90: 20 69 66 28 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63   if( !db->malloc
dba0: 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 20 20  Failed ){.      
dbb0: 20 20 20 20 61 73 73 65 72 74 28 70 44 75 70 29      assert(pDup)
dbc0: 3b 0a 20 20 20 20 20 20 20 20 20 20 69 43 6f 6c  ;.          iCol
dbd0: 20 3d 20 6d 61 74 63 68 4f 72 64 65 72 42 79 54   = matchOrderByT
dbe0: 65 72 6d 54 6f 45 78 70 72 4c 69 73 74 28 70 50  ermToExprList(pP
dbf0: 61 72 73 65 2c 20 70 53 65 6c 65 63 74 2c 20 70  arse, pSelect, p
dc00: 44 75 70 2c 20 69 2b 31 2c 20 31 2c 20 30 29 3b  Dup, i+1, 1, 0);
dc10: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
dc20: 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65     sqlite3ExprDe
dc30: 6c 65 74 65 28 70 44 75 70 29 3b 0a 20 20 20 20  lete(pDup);.    
dc40: 20 20 20 20 69 66 28 20 69 43 6f 6c 3c 30 20 29      if( iCol<0 )
dc50: 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75  {.          retu
dc60: 72 6e 20 31 3b 0a 20 20 20 20 20 20 20 20 7d 0a  rn 1;.        }.
dc70: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
dc80: 28 20 69 43 6f 6c 3e 30 20 29 7b 0a 20 20 20 20  ( iCol>0 ){.    
dc90: 20 20 20 20 69 66 28 20 69 54 61 62 6c 65 20 29      if( iTable )
dca0: 7b 0a 20 20 20 20 20 20 20 20 20 20 70 45 2d 3e  {.          pE->
dcb0: 6f 70 20 3d 20 54 4b 5f 43 4f 4c 55 4d 4e 3b 0a  op = TK_COLUMN;.
dcc0: 20 20 20 20 20 20 20 20 20 20 70 45 2d 3e 69 54            pE->iT
dcd0: 61 62 6c 65 20 3d 20 69 54 61 62 6c 65 3b 0a 20  able = iTable;. 
dce0: 20 20 20 20 20 20 20 20 20 70 45 2d 3e 69 41 67           pE->iAg
dcf0: 67 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 20 20  g = -1;.        
dd00: 20 20 70 45 2d 3e 69 43 6f 6c 75 6d 6e 20 3d 20    pE->iColumn = 
dd10: 69 43 6f 6c 2d 31 3b 0a 20 20 20 20 20 20 20 20  iCol-1;.        
dd20: 20 20 70 45 2d 3e 70 54 61 62 20 3d 20 30 3b 0a    pE->pTab = 0;.
dd30: 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
dd40: 20 20 20 20 20 20 20 20 20 70 45 2d 3e 6f 70 20           pE->op 
dd50: 3d 20 54 4b 5f 49 4e 54 45 47 45 52 3b 0a 20 20  = TK_INTEGER;.  
dd60: 20 20 20 20 20 20 20 20 70 45 2d 3e 66 6c 61 67          pE->flag
dd70: 73 20 7c 3d 20 45 50 5f 49 6e 74 56 61 6c 75 65  s |= EP_IntValue
dd80: 3b 0a 20 20 20 20 20 20 20 20 20 20 70 45 2d 3e  ;.          pE->
dd90: 69 54 61 62 6c 65 20 3d 20 69 43 6f 6c 3b 0a 20  iTable = iCol;. 
dda0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
ddb0: 20 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e   pOrderBy->a[i].
ddc0: 64 6f 6e 65 20 3d 20 31 3b 0a 20 20 20 20 20 20  done = 1;.      
ddd0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 6d  }else{.        m
dde0: 6f 72 65 54 6f 44 6f 20 3d 20 31 3b 0a 20 20 20  oreToDo = 1;.   
ddf0: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 70     }.    }.    p
de00: 53 65 6c 65 63 74 20 3d 20 70 53 65 6c 65 63 74  Select = pSelect
de10: 2d 3e 70 4e 65 78 74 3b 0a 20 20 7d 0a 20 20 66  ->pNext;.  }.  f
de20: 6f 72 28 69 3d 30 3b 20 69 3c 70 4f 72 64 65 72  or(i=0; i<pOrder
de30: 42 79 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b  By->nExpr; i++){
de40: 0a 20 20 20 20 69 66 28 20 70 4f 72 64 65 72 42  .    if( pOrderB
de50: 79 2d 3e 61 5b 69 5d 2e 64 6f 6e 65 3d 3d 30 20  y->a[i].done==0 
de60: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
de70: 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
de80: 20 22 25 72 20 4f 52 44 45 52 20 42 59 20 74 65   "%r ORDER BY te
de90: 72 6d 20 64 6f 65 73 20 6e 6f 74 20 6d 61 74 63  rm does not matc
dea0: 68 20 61 6e 79 20 22 0a 20 20 20 20 20 20 20 20  h any ".        
deb0: 20 20 20 20 22 63 6f 6c 75 6d 6e 20 69 6e 20 74      "column in t
dec0: 68 65 20 72 65 73 75 6c 74 20 73 65 74 22 2c 20  he result set", 
ded0: 69 2b 31 29 3b 0a 20 20 20 20 20 20 72 65 74 75  i+1);.      retu
dee0: 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  rn 1;.    }.  }.
def0: 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f    return 0;.}../
df00: 2a 0a 2a 2a 20 47 65 74 20 61 20 56 44 42 45 20  *.** Get a VDBE 
df10: 66 6f 72 20 74 68 65 20 67 69 76 65 6e 20 70 61  for the given pa
df20: 72 73 65 72 20 63 6f 6e 74 65 78 74 2e 20 20 43  rser context.  C
df30: 72 65 61 74 65 20 61 20 6e 65 77 20 6f 6e 65 20  reate a new one 
df40: 69 66 20 6e 65 63 65 73 73 61 72 79 2e 0a 2a 2a  if necessary..**
df50: 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63   If an error occ
df60: 75 72 73 2c 20 72 65 74 75 72 6e 20 4e 55 4c 4c  urs, return NULL
df70: 20 61 6e 64 20 6c 65 61 76 65 20 61 20 6d 65 73   and leave a mes
df80: 73 61 67 65 20 69 6e 20 70 50 61 72 73 65 2e 0a  sage in pParse..
df90: 2a 2f 0a 56 64 62 65 20 2a 73 71 6c 69 74 65 33  */.Vdbe *sqlite3
dfa0: 47 65 74 56 64 62 65 28 50 61 72 73 65 20 2a 70  GetVdbe(Parse *p
dfb0: 50 61 72 73 65 29 7b 0a 20 20 56 64 62 65 20 2a  Parse){.  Vdbe *
dfc0: 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62  v = pParse->pVdb
dfd0: 65 3b 0a 20 20 69 66 28 20 76 3d 3d 30 20 29 7b  e;.  if( v==0 ){
dfe0: 0a 20 20 20 20 76 20 3d 20 70 50 61 72 73 65 2d  .    v = pParse-
dff0: 3e 70 56 64 62 65 20 3d 20 73 71 6c 69 74 65 33  >pVdbe = sqlite3
e000: 56 64 62 65 43 72 65 61 74 65 28 70 50 61 72 73  VdbeCreate(pPars
e010: 65 2d 3e 64 62 29 3b 0a 23 69 66 6e 64 65 66 20  e->db);.#ifndef 
e020: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 41 43  SQLITE_OMIT_TRAC
e030: 45 0a 20 20 20 20 69 66 28 20 76 20 29 7b 0a 20  E.    if( v ){. 
e040: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
e050: 41 64 64 4f 70 30 28 76 2c 20 4f 50 5f 54 72 61  AddOp0(v, OP_Tra
e060: 63 65 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69  ce);.    }.#endi
e070: 66 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 76  f.  }.  return v
e080: 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70  ;.}.../*.** Comp
e090: 75 74 65 20 74 68 65 20 69 4c 69 6d 69 74 20 61  ute the iLimit a
e0a0: 6e 64 20 69 4f 66 66 73 65 74 20 66 69 65 6c 64  nd iOffset field
e0b0: 73 20 6f 66 20 74 68 65 20 53 45 4c 45 43 54 20  s of the SELECT 
e0c0: 62 61 73 65 64 20 6f 6e 20 74 68 65 0a 2a 2a 20  based on the.** 
e0d0: 70 4c 69 6d 69 74 20 61 6e 64 20 70 4f 66 66 73  pLimit and pOffs
e0e0: 65 74 20 65 78 70 72 65 73 73 69 6f 6e 73 2e 20  et expressions. 
e0f0: 20 70 4c 69 6d 69 74 20 61 6e 64 20 70 4f 66 66   pLimit and pOff
e100: 73 65 74 20 68 6f 6c 64 20 74 68 65 20 65 78 70  set hold the exp
e110: 72 65 73 73 69 6f 6e 73 0a 2a 2a 20 74 68 61 74  ressions.** that
e120: 20 61 70 70 65 61 72 20 69 6e 20 74 68 65 20 6f   appear in the o
e130: 72 69 67 69 6e 61 6c 20 53 51 4c 20 73 74 61 74  riginal SQL stat
e140: 65 6d 65 6e 74 20 61 66 74 65 72 20 74 68 65 20  ement after the 
e150: 4c 49 4d 49 54 20 61 6e 64 20 4f 46 46 53 45 54  LIMIT and OFFSET
e160: 0a 2a 2a 20 6b 65 79 77 6f 72 64 73 2e 20 20 4f  .** keywords.  O
e170: 72 20 4e 55 4c 4c 20 69 66 20 74 68 6f 73 65 20  r NULL if those 
e180: 6b 65 79 77 6f 72 64 73 20 61 72 65 20 6f 6d 69  keywords are omi
e190: 74 74 65 64 2e 20 69 4c 69 6d 69 74 20 61 6e 64  tted. iLimit and
e1a0: 20 69 4f 66 66 73 65 74 20 0a 2a 2a 20 61 72 65   iOffset .** are
e1b0: 20 74 68 65 20 69 6e 74 65 67 65 72 20 6d 65 6d   the integer mem
e1c0: 6f 72 79 20 72 65 67 69 73 74 65 72 20 6e 75 6d  ory register num
e1d0: 62 65 72 73 20 66 6f 72 20 63 6f 75 6e 74 65 72  bers for counter
e1e0: 73 20 75 73 65 64 20 74 6f 20 63 6f 6d 70 75 74  s used to comput
e1f0: 65 20 0a 2a 2a 20 74 68 65 20 6c 69 6d 69 74 20  e .** the limit 
e200: 61 6e 64 20 6f 66 66 73 65 74 2e 20 20 49 66 20  and offset.  If 
e210: 74 68 65 72 65 20 69 73 20 6e 6f 20 6c 69 6d 69  there is no limi
e220: 74 20 61 6e 64 2f 6f 72 20 6f 66 66 73 65 74 2c  t and/or offset,
e230: 20 74 68 65 6e 20 0a 2a 2a 20 69 4c 69 6d 69 74   then .** iLimit
e240: 20 61 6e 64 20 69 4f 66 66 73 65 74 20 61 72 65   and iOffset are
e250: 20 6e 65 67 61 74 69 76 65 2e 0a 2a 2a 0a 2a 2a   negative..**.**
e260: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 63 68   This routine ch
e270: 61 6e 67 65 73 20 74 68 65 20 76 61 6c 75 65 73  anges the values
e280: 20 6f 66 20 69 4c 69 6d 69 74 20 61 6e 64 20 69   of iLimit and i
e290: 4f 66 66 73 65 74 20 6f 6e 6c 79 20 69 66 0a 2a  Offset only if.*
e2a0: 2a 20 61 20 6c 69 6d 69 74 20 6f 72 20 6f 66 66  * a limit or off
e2b0: 73 65 74 20 69 73 20 64 65 66 69 6e 65 64 20 62  set is defined b
e2c0: 79 20 70 4c 69 6d 69 74 20 61 6e 64 20 70 4f 66  y pLimit and pOf
e2d0: 66 73 65 74 2e 20 20 69 4c 69 6d 69 74 20 61 6e  fset.  iLimit an
e2e0: 64 0a 2a 2a 20 69 4f 66 66 73 65 74 20 73 68 6f  d.** iOffset sho
e2f0: 75 6c 64 20 68 61 76 65 20 62 65 65 6e 20 70 72  uld have been pr
e300: 65 73 65 74 20 74 6f 20 61 70 70 72 6f 70 72 69  eset to appropri
e310: 61 74 65 20 64 65 66 61 75 6c 74 20 76 61 6c 75  ate default valu
e320: 65 73 0a 2a 2a 20 28 75 73 75 61 6c 6c 79 20 62  es.** (usually b
e330: 75 74 20 6e 6f 74 20 61 6c 77 61 79 73 20 2d 31  ut not always -1
e340: 29 20 70 72 69 6f 72 20 74 6f 20 63 61 6c 6c 69  ) prior to calli
e350: 6e 67 20 74 68 69 73 20 72 6f 75 74 69 6e 65 2e  ng this routine.
e360: 0a 2a 2a 20 4f 6e 6c 79 20 69 66 20 70 4c 69 6d  .** Only if pLim
e370: 69 74 21 3d 30 20 6f 72 20 70 4f 66 66 73 65 74  it!=0 or pOffset
e380: 21 3d 30 20 64 6f 20 74 68 65 20 6c 69 6d 69 74  !=0 do the limit
e390: 20 72 65 67 69 73 74 65 72 73 20 67 65 74 0a 2a   registers get.*
e3a0: 2a 20 72 65 64 65 66 69 6e 65 64 2e 20 20 54 68  * redefined.  Th
e3b0: 65 20 55 4e 49 4f 4e 20 41 4c 4c 20 6f 70 65 72  e UNION ALL oper
e3c0: 61 74 6f 72 20 75 73 65 73 20 74 68 69 73 20 70  ator uses this p
e3d0: 72 6f 70 65 72 74 79 20 74 6f 20 66 6f 72 63 65  roperty to force
e3e0: 0a 2a 2a 20 74 68 65 20 72 65 75 73 65 20 6f 66  .** the reuse of
e3f0: 20 74 68 65 20 73 61 6d 65 20 6c 69 6d 69 74 20   the same limit 
e400: 61 6e 64 20 6f 66 66 73 65 74 20 72 65 67 69 73  and offset regis
e410: 74 65 72 73 20 61 63 72 6f 73 73 20 6d 75 6c 74  ters across mult
e420: 69 70 6c 65 0a 2a 2a 20 53 45 4c 45 43 54 20 73  iple.** SELECT s
e430: 74 61 74 65 6d 65 6e 74 73 2e 0a 2a 2f 0a 73 74  tatements..*/.st
e440: 61 74 69 63 20 76 6f 69 64 20 63 6f 6d 70 75 74  atic void comput
e450: 65 4c 69 6d 69 74 52 65 67 69 73 74 65 72 73 28  eLimitRegisters(
e460: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 53  Parse *pParse, S
e470: 65 6c 65 63 74 20 2a 70 2c 20 69 6e 74 20 69 42  elect *p, int iB
e480: 72 65 61 6b 29 7b 0a 20 20 56 64 62 65 20 2a 76  reak){.  Vdbe *v
e490: 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69 4c 69 6d   = 0;.  int iLim
e4a0: 69 74 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69 4f  it = 0;.  int iO
e4b0: 66 66 73 65 74 3b 0a 20 20 69 6e 74 20 61 64 64  ffset;.  int add
e4c0: 72 31 3b 0a 0a 20 20 2f 2a 20 0a 20 20 2a 2a 20  r1;..  /* .  ** 
e4d0: 22 4c 49 4d 49 54 20 2d 31 22 20 61 6c 77 61 79  "LIMIT -1" alway
e4e0: 73 20 73 68 6f 77 73 20 61 6c 6c 20 72 6f 77 73  s shows all rows
e4f0: 2e 20 20 54 68 65 72 65 20 69 73 20 73 6f 6d 65  .  There is some
e500: 0a 20 20 2a 2a 20 63 6f 6e 74 72 61 76 65 72 73  .  ** contravers
e510: 79 20 61 62 6f 75 74 20 77 68 61 74 20 74 68 65  y about what the
e520: 20 63 6f 72 72 65 63 74 20 62 65 68 61 76 69 6f   correct behavio
e530: 72 20 73 68 6f 75 6c 64 20 62 65 2e 0a 20 20 2a  r should be..  *
e540: 2a 20 54 68 65 20 63 75 72 72 65 6e 74 20 69 6d  * The current im
e550: 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 69 6e 74  plementation int
e560: 65 72 70 72 65 74 73 20 22 4c 49 4d 49 54 20 30  erprets "LIMIT 0
e570: 22 20 74 6f 20 6d 65 61 6e 0a 20 20 2a 2a 20 6e  " to mean.  ** n
e580: 6f 20 72 6f 77 73 2e 0a 20 20 2a 2f 0a 20 20 69  o rows..  */.  i
e590: 66 28 20 70 2d 3e 70 4c 69 6d 69 74 20 29 7b 0a  f( p->pLimit ){.
e5a0: 20 20 20 20 70 2d 3e 69 4c 69 6d 69 74 20 3d 20      p->iLimit = 
e5b0: 69 4c 69 6d 69 74 20 3d 20 2b 2b 70 50 61 72 73  iLimit = ++pPars
e5c0: 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 76 20 3d  e->nMem;.    v =
e5d0: 20 73 71 6c 69 74 65 33 47 65 74 56 64 62 65 28   sqlite3GetVdbe(
e5e0: 70 50 61 72 73 65 29 3b 0a 20 20 20 20 69 66 28  pParse);.    if(
e5f0: 20 76 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a   v==0 ) return;.
e600: 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
e610: 6f 64 65 28 70 50 61 72 73 65 2c 20 70 2d 3e 70  ode(pParse, p->p
e620: 4c 69 6d 69 74 2c 20 69 4c 69 6d 69 74 29 3b 0a  Limit, iLimit);.
e630: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
e640: 64 64 4f 70 31 28 76 2c 20 4f 50 5f 4d 75 73 74  ddOp1(v, OP_Must
e650: 42 65 49 6e 74 2c 20 69 4c 69 6d 69 74 29 3b 0a  BeInt, iLimit);.
e660: 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28      VdbeComment(
e670: 28 76 2c 20 22 4c 49 4d 49 54 20 63 6f 75 6e 74  (v, "LIMIT count
e680: 65 72 22 29 29 3b 0a 20 20 20 20 73 71 6c 69 74  er"));.    sqlit
e690: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
e6a0: 4f 50 5f 49 66 5a 65 72 6f 2c 20 69 4c 69 6d 69  OP_IfZero, iLimi
e6b0: 74 2c 20 69 42 72 65 61 6b 29 3b 0a 20 20 7d 0a  t, iBreak);.  }.
e6c0: 20 20 69 66 28 20 70 2d 3e 70 4f 66 66 73 65 74    if( p->pOffset
e6d0: 20 29 7b 0a 20 20 20 20 70 2d 3e 69 4f 66 66 73   ){.    p->iOffs
e6e0: 65 74 20 3d 20 69 4f 66 66 73 65 74 20 3d 20 2b  et = iOffset = +
e6f0: 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20  +pParse->nMem;. 
e700: 20 20 20 69 66 28 20 70 2d 3e 70 4c 69 6d 69 74     if( p->pLimit
e710: 20 29 7b 0a 20 20 20 20 20 20 70 50 61 72 73 65   ){.      pParse
e720: 2d 3e 6e 4d 65 6d 2b 2b 3b 20 20 20 2f 2a 20 41  ->nMem++;   /* A
e730: 6c 6c 6f 63 61 74 65 20 61 6e 20 65 78 74 72 61  llocate an extra
e740: 20 72 65 67 69 73 74 65 72 20 66 6f 72 20 6c 69   register for li
e750: 6d 69 74 2b 6f 66 66 73 65 74 20 2a 2f 0a 20 20  mit+offset */.  
e760: 20 20 7d 0a 20 20 20 20 76 20 3d 20 73 71 6c 69    }.    v = sqli
e770: 74 65 33 47 65 74 56 64 62 65 28 70 50 61 72 73  te3GetVdbe(pPars
e780: 65 29 3b 0a 20 20 20 20 69 66 28 20 76 3d 3d 30  e);.    if( v==0
e790: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 73   ) return;.    s
e7a0: 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28 70  qlite3ExprCode(p
e7b0: 50 61 72 73 65 2c 20 70 2d 3e 70 4f 66 66 73 65  Parse, p->pOffse
e7c0: 74 2c 20 69 4f 66 66 73 65 74 29 3b 0a 20 20 20  t, iOffset);.   
e7d0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
e7e0: 70 31 28 76 2c 20 4f 50 5f 4d 75 73 74 42 65 49  p1(v, OP_MustBeI
e7f0: 6e 74 2c 20 69 4f 66 66 73 65 74 29 3b 0a 20 20  nt, iOffset);.  
e800: 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76    VdbeComment((v
e810: 2c 20 22 4f 46 46 53 45 54 20 63 6f 75 6e 74 65  , "OFFSET counte
e820: 72 22 29 29 3b 0a 20 20 20 20 61 64 64 72 31 20  r"));.    addr1 
e830: 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  = sqlite3VdbeAdd
e840: 4f 70 31 28 76 2c 20 4f 50 5f 49 66 50 6f 73 2c  Op1(v, OP_IfPos,
e850: 20 69 4f 66 66 73 65 74 29 3b 0a 20 20 20 20 73   iOffset);.    s
e860: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
e870: 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20  (v, OP_Integer, 
e880: 30 2c 20 69 4f 66 66 73 65 74 29 3b 0a 20 20 20  0, iOffset);.   
e890: 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70   sqlite3VdbeJump
e8a0: 48 65 72 65 28 76 2c 20 61 64 64 72 31 29 3b 0a  Here(v, addr1);.
e8b0: 20 20 20 20 69 66 28 20 70 2d 3e 70 4c 69 6d 69      if( p->pLimi
e8c0: 74 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  t ){.      sqlit
e8d0: 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
e8e0: 4f 50 5f 41 64 64 2c 20 69 4c 69 6d 69 74 2c 20  OP_Add, iLimit, 
e8f0: 69 4f 66 66 73 65 74 2c 20 69 4f 66 66 73 65 74  iOffset, iOffset
e900: 2b 31 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43  +1);.      VdbeC
e910: 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 4c 49 4d 49  omment((v, "LIMI
e920: 54 2b 4f 46 46 53 45 54 22 29 29 3b 0a 20 20 20  T+OFFSET"));.   
e930: 20 20 20 61 64 64 72 31 20 3d 20 73 71 6c 69 74     addr1 = sqlit
e940: 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20  e3VdbeAddOp1(v, 
e950: 4f 50 5f 49 66 50 6f 73 2c 20 69 4c 69 6d 69 74  OP_IfPos, iLimit
e960: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
e970: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
e980: 5f 49 6e 74 65 67 65 72 2c 20 2d 31 2c 20 69 4f  _Integer, -1, iO
e990: 66 66 73 65 74 2b 31 29 3b 0a 20 20 20 20 20 20  ffset+1);.      
e9a0: 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48  sqlite3VdbeJumpH
e9b0: 65 72 65 28 76 2c 20 61 64 64 72 31 29 3b 0a 20  ere(v, addr1);. 
e9c0: 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a     }.  }.}../*.*
e9d0: 2a 20 41 6c 6c 6f 63 61 74 65 20 61 20 76 69 72  * Allocate a vir
e9e0: 74 75 61 6c 20 69 6e 64 65 78 20 74 6f 20 75 73  tual index to us
e9f0: 65 20 66 6f 72 20 73 6f 72 74 69 6e 67 2e 0a 2a  e for sorting..*
ea00: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63 72  /.static void cr
ea10: 65 61 74 65 53 6f 72 74 69 6e 67 49 6e 64 65 78  eateSortingIndex
ea20: 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
ea30: 53 65 6c 65 63 74 20 2a 70 2c 20 45 78 70 72 4c  Select *p, ExprL
ea40: 69 73 74 20 2a 70 4f 72 64 65 72 42 79 29 7b 0a  ist *pOrderBy){.
ea50: 20 20 69 66 28 20 70 4f 72 64 65 72 42 79 20 29    if( pOrderBy )
ea60: 7b 0a 20 20 20 20 69 6e 74 20 61 64 64 72 3b 0a  {.    int addr;.
ea70: 20 20 20 20 61 73 73 65 72 74 28 20 70 4f 72 64      assert( pOrd
ea80: 65 72 42 79 2d 3e 69 45 43 75 72 73 6f 72 3d 3d  erBy->iECursor==
ea90: 30 20 29 3b 0a 20 20 20 20 70 4f 72 64 65 72 42  0 );.    pOrderB
eaa0: 79 2d 3e 69 45 43 75 72 73 6f 72 20 3d 20 70 50  y->iECursor = pP
eab0: 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20  arse->nTab++;.  
eac0: 20 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65 33    addr = sqlite3
ead0: 56 64 62 65 41 64 64 4f 70 32 28 70 50 61 72 73  VdbeAddOp2(pPars
eae0: 65 2d 3e 70 56 64 62 65 2c 20 4f 50 5f 4f 70 65  e->pVdbe, OP_Ope
eaf0: 6e 45 70 68 65 6d 65 72 61 6c 2c 0a 20 20 20 20  nEphemeral,.    
eb00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
eb10: 20 20 20 20 20 20 20 20 70 4f 72 64 65 72 42 79          pOrderBy
eb20: 2d 3e 69 45 43 75 72 73 6f 72 2c 20 70 4f 72 64  ->iECursor, pOrd
eb30: 65 72 42 79 2d 3e 6e 45 78 70 72 2b 31 29 3b 0a  erBy->nExpr+1);.
eb40: 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 61      assert( p->a
eb50: 64 64 72 4f 70 65 6e 45 70 68 6d 5b 32 5d 20 3d  ddrOpenEphm[2] =
eb60: 3d 20 2d 31 20 29 3b 0a 20 20 20 20 70 2d 3e 61  = -1 );.    p->a
eb70: 64 64 72 4f 70 65 6e 45 70 68 6d 5b 32 5d 20 3d  ddrOpenEphm[2] =
eb80: 20 61 64 64 72 3b 0a 20 20 7d 0a 7d 0a 0a 23 69   addr;.  }.}..#i
eb90: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
eba0: 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45 43  T_COMPOUND_SELEC
ebb0: 54 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  T./*.** Return t
ebc0: 68 65 20 61 70 70 72 6f 70 72 69 61 74 65 20 63  he appropriate c
ebd0: 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63  ollating sequenc
ebe0: 65 20 66 6f 72 20 74 68 65 20 69 43 6f 6c 2d 74  e for the iCol-t
ebf0: 68 20 63 6f 6c 75 6d 6e 20 6f 66 0a 2a 2a 20 74  h column of.** t
ec00: 68 65 20 72 65 73 75 6c 74 20 73 65 74 20 66 6f  he result set fo
ec10: 72 20 74 68 65 20 63 6f 6d 70 6f 75 6e 64 2d 73  r the compound-s
ec20: 65 6c 65 63 74 20 73 74 61 74 65 6d 65 6e 74 20  elect statement 
ec30: 22 70 22 2e 20 20 52 65 74 75 72 6e 20 4e 55 4c  "p".  Return NUL
ec40: 4c 20 69 66 0a 2a 2a 20 74 68 65 20 63 6f 6c 75  L if.** the colu
ec50: 6d 6e 20 68 61 73 20 6e 6f 20 64 65 66 61 75 6c  mn has no defaul
ec60: 74 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75  t collating sequ
ec70: 65 6e 63 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  ence..**.** The 
ec80: 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e  collating sequen
ec90: 63 65 20 66 6f 72 20 74 68 65 20 63 6f 6d 70 6f  ce for the compo
eca0: 75 6e 64 20 73 65 6c 65 63 74 20 69 73 20 74 61  und select is ta
ecb0: 6b 65 6e 20 66 72 6f 6d 20 74 68 65 0a 2a 2a 20  ken from the.** 
ecc0: 6c 65 66 74 2d 6d 6f 73 74 20 74 65 72 6d 20 6f  left-most term o
ecd0: 66 20 74 68 65 20 73 65 6c 65 63 74 20 74 68 61  f the select tha
ece0: 74 20 68 61 73 20 61 20 63 6f 6c 6c 61 74 69 6e  t has a collatin
ecf0: 67 20 73 65 71 75 65 6e 63 65 2e 0a 2a 2f 0a 73  g sequence..*/.s
ed00: 74 61 74 69 63 20 43 6f 6c 6c 53 65 71 20 2a 6d  tatic CollSeq *m
ed10: 75 6c 74 69 53 65 6c 65 63 74 43 6f 6c 6c 53 65  ultiSelectCollSe
ed20: 71 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  q(Parse *pParse,
ed30: 20 53 65 6c 65 63 74 20 2a 70 2c 20 69 6e 74 20   Select *p, int 
ed40: 69 43 6f 6c 29 7b 0a 20 20 43 6f 6c 6c 53 65 71  iCol){.  CollSeq
ed50: 20 2a 70 52 65 74 3b 0a 20 20 69 66 28 20 70 2d   *pRet;.  if( p-
ed60: 3e 70 50 72 69 6f 72 20 29 7b 0a 20 20 20 20 70  >pPrior ){.    p
ed70: 52 65 74 20 3d 20 6d 75 6c 74 69 53 65 6c 65 63  Ret = multiSelec
ed80: 74 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c  tCollSeq(pParse,
ed90: 20 70 2d 3e 70 50 72 69 6f 72 2c 20 69 43 6f 6c   p->pPrior, iCol
eda0: 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
edb0: 70 52 65 74 20 3d 20 30 3b 0a 20 20 7d 0a 20 20  pRet = 0;.  }.  
edc0: 69 66 28 20 70 52 65 74 3d 3d 30 20 29 7b 0a 20  if( pRet==0 ){. 
edd0: 20 20 20 70 52 65 74 20 3d 20 73 71 6c 69 74 65     pRet = sqlite
ede0: 33 45 78 70 72 43 6f 6c 6c 53 65 71 28 70 50 61  3ExprCollSeq(pPa
edf0: 72 73 65 2c 20 70 2d 3e 70 45 4c 69 73 74 2d 3e  rse, p->pEList->
ee00: 61 5b 69 43 6f 6c 5d 2e 70 45 78 70 72 29 3b 0a  a[iCol].pExpr);.
ee10: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 52 65    }.  return pRe
ee20: 74 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53  t;.}.#endif /* S
ee30: 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f 4d 50 4f  QLITE_OMIT_COMPO
ee40: 55 4e 44 5f 53 45 4c 45 43 54 20 2a 2f 0a 0a 2f  UND_SELECT */../
ee50: 2a 20 46 6f 72 77 61 72 64 20 72 65 66 65 72 65  * Forward refere
ee60: 6e 63 65 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e  nce */.static in
ee70: 74 20 6d 75 6c 74 69 53 65 6c 65 63 74 4f 72 64  t multiSelectOrd
ee80: 65 72 42 79 28 0a 20 20 50 61 72 73 65 20 2a 70  erBy(.  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 2c 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 20 20 63 68 61 72 20 2a 61 66 66 20   */.  char *aff 
ef40: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
ef50: 66 20 65 44 65 73 74 20 69 73 20 53 52 54 5f 55  f eDest is SRT_U
ef60: 6e 69 6f 6e 2c 20 74 68 65 20 61 66 66 69 6e 69  nion, the affini
ef70: 74 79 20 73 74 72 69 6e 67 20 2a 2f 0a 29 3b 0a  ty string */.);.
ef80: 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
ef90: 5f 4f 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53  _OMIT_COMPOUND_S
efa0: 45 4c 45 43 54 0a 2f 2a 0a 2a 2a 20 54 68 69 73  ELECT./*.** This
efb0: 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c   routine is call
efc0: 65 64 20 74 6f 20 70 72 6f 63 65 73 73 20 61 20  ed to process a 
efd0: 63 6f 6d 70 6f 75 6e 64 20 71 75 65 72 79 20 66  compound query f
efe0: 6f 72 6d 20 66 72 6f 6d 0a 2a 2a 20 74 77 6f 20  orm from.** two 
eff0: 6f 72 20 6d 6f 72 65 20 73 65 70 61 72 61 74 65  or more separate
f000: 20 71 75 65 72 69 65 73 20 75 73 69 6e 67 20 55   queries using U
f010: 4e 49 4f 4e 2c 20 55 4e 49 4f 4e 20 41 4c 4c 2c  NION, UNION ALL,
f020: 20 45 58 43 45 50 54 2c 20 6f 72 0a 2a 2a 20 49   EXCEPT, or.** I
f030: 4e 54 45 52 53 45 43 54 0a 2a 2a 0a 2a 2a 20 22  NTERSECT.**.** "
f040: 70 22 20 70 6f 69 6e 74 73 20 74 6f 20 74 68 65  p" points to the
f050: 20 72 69 67 68 74 2d 6d 6f 73 74 20 6f 66 20 74   right-most of t
f060: 68 65 20 74 77 6f 20 71 75 65 72 69 65 73 2e 20  he two queries. 
f070: 20 74 68 65 20 71 75 65 72 79 20 6f 6e 20 74 68   the query on th
f080: 65 0a 2a 2a 20 6c 65 66 74 20 69 73 20 70 2d 3e  e.** left is p->
f090: 70 50 72 69 6f 72 2e 20 20 54 68 65 20 6c 65 66  pPrior.  The lef
f0a0: 74 20 71 75 65 72 79 20 63 6f 75 6c 64 20 61 6c  t query could al
f0b0: 73 6f 20 62 65 20 61 20 63 6f 6d 70 6f 75 6e 64  so be a compound
f0c0: 20 71 75 65 72 79 0a 2a 2a 20 69 6e 20 77 68 69   query.** in whi
f0d0: 63 68 20 63 61 73 65 20 74 68 69 73 20 72 6f 75  ch case this rou
f0e0: 74 69 6e 65 20 77 69 6c 6c 20 62 65 20 63 61 6c  tine will be cal
f0f0: 6c 65 64 20 72 65 63 75 72 73 69 76 65 6c 79 2e  led recursively.
f100: 20 0a 2a 2a 0a 2a 2a 20 54 68 65 20 72 65 73 75   .**.** The resu
f110: 6c 74 73 20 6f 66 20 74 68 65 20 74 6f 74 61 6c  lts of the total
f120: 20 71 75 65 72 79 20 61 72 65 20 74 6f 20 62 65   query are to be
f130: 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 61 20   written into a 
f140: 64 65 73 74 69 6e 61 74 69 6f 6e 0a 2a 2a 20 6f  destination.** o
f150: 66 20 74 79 70 65 20 65 44 65 73 74 20 77 69 74  f type eDest wit
f160: 68 20 70 61 72 61 6d 65 74 65 72 20 69 50 61 72  h parameter iPar
f170: 6d 2e 0a 2a 2a 0a 2a 2a 20 45 78 61 6d 70 6c 65  m..**.** Example
f180: 20 31 3a 20 20 43 6f 6e 73 69 64 65 72 20 61 20   1:  Consider a 
f190: 74 68 72 65 65 2d 77 61 79 20 63 6f 6d 70 6f 75  three-way compou
f1a0: 6e 64 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74  nd SQL statement
f1b0: 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 45 4c 45  ..**.**     SELE
f1c0: 43 54 20 61 20 46 52 4f 4d 20 74 31 20 55 4e 49  CT a FROM t1 UNI
f1d0: 4f 4e 20 53 45 4c 45 43 54 20 62 20 46 52 4f 4d  ON SELECT b FROM
f1e0: 20 74 32 20 55 4e 49 4f 4e 20 53 45 4c 45 43 54   t2 UNION SELECT
f1f0: 20 63 20 46 52 4f 4d 20 74 33 0a 2a 2a 0a 2a 2a   c FROM t3.**.**
f200: 20 54 68 69 73 20 73 74 61 74 65 6d 65 6e 74 20   This statement 
f210: 69 73 20 70 61 72 73 65 64 20 75 70 20 61 73 20  is parsed up as 
f220: 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20  follows:.**.**  
f230: 20 20 20 53 45 4c 45 43 54 20 63 20 46 52 4f 4d     SELECT c FROM
f240: 20 74 33 0a 2a 2a 20 20 20 20 20 20 7c 0a 2a 2a   t3.**      |.**
f250: 20 20 20 20 20 20 60 2d 2d 2d 2d 2d 3e 20 20 53        `----->  S
f260: 45 4c 45 43 54 20 62 20 46 52 4f 4d 20 74 32 0a  ELECT b FROM t2.
f270: 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
f280: 20 20 7c 0a 2a 2a 20 20 20 20 20 20 20 20 20 20    |.**          
f290: 20 20 20 20 20 20 60 2d 2d 2d 2d 2d 2d 3e 20 20        `------>  
f2a0: 53 45 4c 45 43 54 20 61 20 46 52 4f 4d 20 74 31  SELECT a FROM t1
f2b0: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 72 72 6f 77  .**.** The arrow
f2c0: 73 20 69 6e 20 74 68 65 20 64 69 61 67 72 61 6d  s in the diagram
f2d0: 20 61 62 6f 76 65 20 72 65 70 72 65 73 65 6e 74   above represent
f2e0: 20 74 68 65 20 53 65 6c 65 63 74 2e 70 50 72 69   the Select.pPri
f2f0: 6f 72 20 70 6f 69 6e 74 65 72 2e 0a 2a 2a 20 53  or pointer..** S
f300: 6f 20 69 66 20 74 68 69 73 20 72 6f 75 74 69 6e  o if this routin
f310: 65 20 69 73 20 63 61 6c 6c 65 64 20 77 69 74 68  e is called with
f320: 20 70 20 65 71 75 61 6c 20 74 6f 20 74 68 65 20   p equal to the 
f330: 74 33 20 71 75 65 72 79 2c 20 74 68 65 6e 0a 2a  t3 query, then.*
f340: 2a 20 70 50 72 69 6f 72 20 77 69 6c 6c 20 62 65  * pPrior will be
f350: 20 74 68 65 20 74 32 20 71 75 65 72 79 2e 20 20   the t2 query.  
f360: 70 2d 3e 6f 70 20 77 69 6c 6c 20 62 65 20 54 4b  p->op will be TK
f370: 5f 55 4e 49 4f 4e 20 69 6e 20 74 68 69 73 20 63  _UNION in this c
f380: 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 69 63  ase..**.** Notic
f390: 65 20 74 68 61 74 20 62 65 63 61 75 73 65 20 6f  e that because o
f3a0: 66 20 74 68 65 20 77 61 79 20 53 51 4c 69 74 65  f the way SQLite
f3b0: 20 70 61 72 73 65 73 20 63 6f 6d 70 6f 75 6e 64   parses compound
f3c0: 20 53 45 4c 45 43 54 73 2c 20 74 68 65 0a 2a 2a   SELECTs, the.**
f3d0: 20 69 6e 64 69 76 69 64 75 61 6c 20 73 65 6c 65   individual sele
f3e0: 63 74 73 20 61 6c 77 61 79 73 20 67 72 6f 75 70  cts always group
f3f0: 20 66 72 6f 6d 20 6c 65 66 74 20 74 6f 20 72 69   from left to ri
f400: 67 68 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ght..*/.static i
f410: 6e 74 20 6d 75 6c 74 69 53 65 6c 65 63 74 28 0a  nt multiSelect(.
f420: 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
f430: 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69          /* Parsi
f440: 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  ng context */.  
f450: 53 65 6c 65 63 74 20 2a 70 2c 20 20 20 20 20 20  Select *p,      
f460: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 72 69 67        /* The rig
f470: 68 74 2d 6d 6f 73 74 20 6f 66 20 53 45 4c 45 43  ht-most of SELEC
f480: 54 73 20 74 6f 20 62 65 20 63 6f 64 65 64 20 2a  Ts to be coded *
f490: 2f 0a 20 20 53 65 6c 65 63 74 44 65 73 74 20 2a  /.  SelectDest *
f4a0: 70 44 65 73 74 2c 20 20 20 20 2f 2a 20 57 68 61  pDest,    /* Wha
f4b0: 74 20 74 6f 20 64 6f 20 77 69 74 68 20 71 75 65  t to do with que
f4c0: 72 79 20 72 65 73 75 6c 74 73 20 2a 2f 0a 20 20  ry results */.  
f4d0: 63 68 61 72 20 2a 61 66 66 20 20 20 20 20 20 20  char *aff       
f4e0: 20 20 20 20 20 20 2f 2a 20 49 66 20 65 44 65 73        /* If eDes
f4f0: 74 20 69 73 20 53 52 54 5f 55 6e 69 6f 6e 2c 20  t is SRT_Union, 
f500: 74 68 65 20 61 66 66 69 6e 69 74 79 20 73 74 72  the affinity str
f510: 69 6e 67 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  ing */.){.  int 
f520: 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20  rc = SQLITE_OK; 
f530: 20 20 2f 2a 20 53 75 63 63 65 73 73 20 63 6f 64    /* Success cod
f540: 65 20 66 72 6f 6d 20 61 20 73 75 62 72 6f 75 74  e from a subrout
f550: 69 6e 65 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20  ine */.  Select 
f560: 2a 70 50 72 69 6f 72 3b 20 20 20 20 20 20 20 2f  *pPrior;       /
f570: 2a 20 41 6e 6f 74 68 65 72 20 53 45 4c 45 43 54  * Another SELECT
f580: 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 74 6f 20   immediately to 
f590: 6f 75 72 20 6c 65 66 74 20 2a 2f 0a 20 20 56 64  our left */.  Vd
f5a0: 62 65 20 2a 76 3b 20 20 20 20 20 20 20 20 20 20  be *v;          
f5b0: 20 20 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20      /* Generate 
f5c0: 63 6f 64 65 20 74 6f 20 74 68 69 73 20 56 44 42  code to this VDB
f5d0: 45 20 2a 2f 0a 20 20 69 6e 74 20 6e 43 6f 6c 3b  E */.  int nCol;
f5e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
f5f0: 4e 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e  Number of column
f600: 73 20 69 6e 20 74 68 65 20 72 65 73 75 6c 74 20  s in the result 
f610: 73 65 74 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73  set */.  ExprLis
f620: 74 20 2a 70 4f 72 64 65 72 42 79 3b 20 20 20 2f  t *pOrderBy;   /
f630: 2a 20 54 68 65 20 4f 52 44 45 52 20 42 59 20 63  * The ORDER BY c
f640: 6c 61 75 73 65 20 6f 6e 20 70 20 2a 2f 0a 20 20  lause on p */.  
f650: 69 6e 74 20 61 53 65 74 50 32 5b 32 5d 3b 20 20  int aSetP2[2];  
f660: 20 20 20 20 20 20 2f 2a 20 53 65 74 20 50 32 20        /* Set P2 
f670: 76 61 6c 75 65 20 6f 66 20 74 68 65 73 65 20 6f  value of these o
f680: 70 20 74 6f 20 6e 75 6d 62 65 72 20 6f 66 20 63  p to number of c
f690: 6f 6c 75 6d 6e 73 20 2a 2f 0a 20 20 69 6e 74 20  olumns */.  int 
f6a0: 6e 53 65 74 50 32 20 3d 20 30 3b 20 20 20 20 20  nSetP2 = 0;     
f6b0: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 73    /* Number of s
f6c0: 6c 6f 74 73 20 69 6e 20 61 53 65 74 50 32 5b 5d  lots in aSetP2[]
f6d0: 20 75 73 65 64 20 2a 2f 0a 20 20 53 65 6c 65 63   used */.  Selec
f6e0: 74 44 65 73 74 20 64 65 73 74 3b 20 20 20 20 20  tDest dest;     
f6f0: 20 2f 2a 20 41 6c 74 65 72 6e 61 74 69 76 65 20   /* Alternative 
f700: 64 61 74 61 20 64 65 73 74 69 6e 61 74 69 6f 6e  data destination
f710: 20 2a 2f 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 73   */..  /* Make s
f720: 75 72 65 20 74 68 65 72 65 20 69 73 20 6e 6f 20  ure there is no 
f730: 4f 52 44 45 52 20 42 59 20 6f 72 20 4c 49 4d 49  ORDER BY or LIMI
f740: 54 20 63 6c 61 75 73 65 20 6f 6e 20 70 72 69 6f  T clause on prio
f750: 72 20 53 45 4c 45 43 54 73 2e 20 20 4f 6e 6c 79  r SELECTs.  Only
f760: 0a 20 20 2a 2a 20 74 68 65 20 6c 61 73 74 20 28  .  ** the last (
f770: 72 69 67 68 74 2d 6d 6f 73 74 29 20 53 45 4c 45  right-most) SELE
f780: 43 54 20 69 6e 20 74 68 65 20 73 65 72 69 65 73  CT in the series
f790: 20 6d 61 79 20 68 61 76 65 20 61 6e 20 4f 52 44   may have an ORD
f7a0: 45 52 20 42 59 20 6f 72 20 4c 49 4d 49 54 2e 0a  ER BY or LIMIT..
f7b0: 20 20 2a 2f 0a 20 20 69 66 28 20 70 3d 3d 30 20    */.  if( p==0 
f7c0: 7c 7c 20 70 2d 3e 70 50 72 69 6f 72 3d 3d 30 20  || p->pPrior==0 
f7d0: 29 7b 0a 20 20 20 20 72 63 20 3d 20 31 3b 0a 20  ){.    rc = 1;. 
f7e0: 20 20 20 67 6f 74 6f 20 6d 75 6c 74 69 5f 73 65     goto multi_se
f7f0: 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 7d 0a 20 20  lect_end;.  }.  
f800: 70 50 72 69 6f 72 20 3d 20 70 2d 3e 70 50 72 69  pPrior = p->pPri
f810: 6f 72 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50  or;.  assert( pP
f820: 72 69 6f 72 2d 3e 70 52 69 67 68 74 6d 6f 73 74  rior->pRightmost
f830: 21 3d 70 50 72 69 6f 72 20 29 3b 0a 20 20 61 73  !=pPrior );.  as
f840: 73 65 72 74 28 20 70 50 72 69 6f 72 2d 3e 70 52  sert( pPrior->pR
f850: 69 67 68 74 6d 6f 73 74 3d 3d 70 2d 3e 70 52 69  ightmost==p->pRi
f860: 67 68 74 6d 6f 73 74 20 29 3b 0a 20 20 69 66 28  ghtmost );.  if(
f870: 20 70 50 72 69 6f 72 2d 3e 70 4f 72 64 65 72 42   pPrior->pOrderB
f880: 79 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  y ){.    sqlite3
f890: 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
f8a0: 22 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65  "ORDER BY clause
f8b0: 20 73 68 6f 75 6c 64 20 63 6f 6d 65 20 61 66 74   should come aft
f8c0: 65 72 20 25 73 20 6e 6f 74 20 62 65 66 6f 72 65  er %s not before
f8d0: 22 2c 0a 20 20 20 20 20 20 73 65 6c 65 63 74 4f  ",.      selectO
f8e0: 70 4e 61 6d 65 28 70 2d 3e 6f 70 29 29 3b 0a 20  pName(p->op));. 
f8f0: 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 67     rc = 1;.    g
f900: 6f 74 6f 20 6d 75 6c 74 69 5f 73 65 6c 65 63 74  oto multi_select
f910: 5f 65 6e 64 3b 0a 20 20 7d 0a 20 20 69 66 28 20  _end;.  }.  if( 
f920: 70 50 72 69 6f 72 2d 3e 70 4c 69 6d 69 74 20 29  pPrior->pLimit )
f930: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72  {.    sqlite3Err
f940: 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 22 4c 49  orMsg(pParse,"LI
f950: 4d 49 54 20 63 6c 61 75 73 65 20 73 68 6f 75 6c  MIT clause shoul
f960: 64 20 63 6f 6d 65 20 61 66 74 65 72 20 25 73 20  d come after %s 
f970: 6e 6f 74 20 62 65 66 6f 72 65 22 2c 0a 20 20 20  not before",.   
f980: 20 20 20 73 65 6c 65 63 74 4f 70 4e 61 6d 65 28     selectOpName(
f990: 70 2d 3e 6f 70 29 29 3b 0a 20 20 20 20 72 63 20  p->op));.    rc 
f9a0: 3d 20 31 3b 0a 20 20 20 20 67 6f 74 6f 20 6d 75  = 1;.    goto mu
f9b0: 6c 74 69 5f 73 65 6c 65 63 74 5f 65 6e 64 3b 0a  lti_select_end;.
f9c0: 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 73    }..  /* Make s
f9d0: 75 72 65 20 77 65 20 68 61 76 65 20 61 20 76 61  ure we have a va
f9e0: 6c 69 64 20 71 75 65 72 79 20 65 6e 67 69 6e 65  lid query engine
f9f0: 2e 20 20 49 66 20 6e 6f 74 2c 20 63 72 65 61 74  .  If not, creat
fa00: 65 20 61 20 6e 65 77 20 6f 6e 65 2e 0a 20 20 2a  e a new one..  *
fa10: 2f 0a 20 20 76 20 3d 20 73 71 6c 69 74 65 33 47  /.  v = sqlite3G
fa20: 65 74 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a  etVdbe(pParse);.
fa30: 20 20 69 66 28 20 76 3d 3d 30 20 29 7b 0a 20 20    if( v==0 ){.  
fa40: 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 67 6f    rc = 1;.    go
fa50: 74 6f 20 6d 75 6c 74 69 5f 73 65 6c 65 63 74 5f  to multi_select_
fa60: 65 6e 64 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43  end;.  }..  /* C
fa70: 72 65 61 74 65 20 74 68 65 20 64 65 73 74 69 6e  reate the destin
fa80: 61 74 69 6f 6e 20 74 65 6d 70 6f 72 61 72 79 20  ation temporary 
fa90: 74 61 62 6c 65 20 69 66 20 6e 65 63 65 73 73 61  table if necessa
faa0: 72 79 0a 20 20 2a 2f 0a 20 20 64 65 73 74 20 3d  ry.  */.  dest =
fab0: 20 2a 70 44 65 73 74 3b 0a 20 20 69 66 28 20 64   *pDest;.  if( d
fac0: 65 73 74 2e 65 44 65 73 74 3d 3d 53 52 54 5f 45  est.eDest==SRT_E
fad0: 70 68 65 6d 54 61 62 20 29 7b 0a 20 20 20 20 61  phemTab ){.    a
fae0: 73 73 65 72 74 28 20 70 2d 3e 70 45 4c 69 73 74  ssert( p->pEList
faf0: 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56   );.    sqlite3V
fb00: 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
fb10: 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 2c 20 64  OpenEphemeral, d
fb20: 65 73 74 2e 69 50 61 72 6d 2c 20 70 2d 3e 70 45  est.iParm, p->pE
fb30: 4c 69 73 74 2d 3e 6e 45 78 70 72 29 3b 0a 20 20  List->nExpr);.  
fb40: 20 20 64 65 73 74 2e 65 44 65 73 74 20 3d 20 53    dest.eDest = S
fb50: 52 54 5f 54 61 62 6c 65 3b 0a 20 20 7d 0a 0a 20  RT_Table;.  }.. 
fb60: 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 61 6c   /* Make sure al
fb70: 6c 20 53 45 4c 45 43 54 73 20 69 6e 20 74 68 65  l SELECTs in the
fb80: 20 73 74 61 74 65 6d 65 6e 74 20 68 61 76 65 20   statement have 
fb90: 74 68 65 20 73 61 6d 65 20 6e 75 6d 62 65 72 20  the same number 
fba0: 6f 66 20 65 6c 65 6d 65 6e 74 73 0a 20 20 2a 2a  of elements.  **
fbb0: 20 69 6e 20 74 68 65 69 72 20 72 65 73 75 6c 74   in their result
fbc0: 20 73 65 74 73 2e 0a 20 20 2a 2f 0a 20 20 61 73   sets..  */.  as
fbd0: 73 65 72 74 28 20 70 2d 3e 70 45 4c 69 73 74 20  sert( p->pEList 
fbe0: 26 26 20 70 50 72 69 6f 72 2d 3e 70 45 4c 69 73  && pPrior->pELis
fbf0: 74 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e 70 45  t );.  if( p->pE
fc00: 4c 69 73 74 2d 3e 6e 45 78 70 72 21 3d 70 50 72  List->nExpr!=pPr
fc10: 69 6f 72 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78  ior->pEList->nEx
fc20: 70 72 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  pr ){.    sqlite
fc30: 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
fc40: 2c 20 22 53 45 4c 45 43 54 73 20 74 6f 20 74 68  , "SELECTs to th
fc50: 65 20 6c 65 66 74 20 61 6e 64 20 72 69 67 68 74  e left and right
fc60: 20 6f 66 20 25 73 22 0a 20 20 20 20 20 20 22 20   of %s".      " 
fc70: 64 6f 20 6e 6f 74 20 68 61 76 65 20 74 68 65 20  do not have the 
fc80: 73 61 6d 65 20 6e 75 6d 62 65 72 20 6f 66 20 72  same number of r
fc90: 65 73 75 6c 74 20 63 6f 6c 75 6d 6e 73 22 2c 20  esult columns", 
fca0: 73 65 6c 65 63 74 4f 70 4e 61 6d 65 28 70 2d 3e  selectOpName(p->
fcb0: 6f 70 29 29 3b 0a 20 20 20 20 72 63 20 3d 20 31  op));.    rc = 1
fcc0: 3b 0a 20 20 20 20 67 6f 74 6f 20 6d 75 6c 74 69  ;.    goto multi
fcd0: 5f 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 7d  _select_end;.  }
fce0: 0a 0a 23 69 66 20 30 0a 20 20 69 66 28 20 70 2d  ..#if 0.  if( p-
fcf0: 3e 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20  >pOrderBy ){.   
fd00: 20 72 65 74 75 72 6e 20 6d 75 6c 74 69 53 65 6c   return multiSel
fd10: 65 63 74 4f 72 64 65 72 42 79 28 70 50 61 72 73  ectOrderBy(pPars
fd20: 65 2c 20 70 2c 20 70 44 65 73 74 2c 20 61 66 66  e, p, pDest, aff
fd30: 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20  );.  }.#endif.. 
fd40: 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64   /* Generate cod
fd50: 65 20 66 6f 72 20 74 68 65 20 6c 65 66 74 20 61  e for the left a
fd60: 6e 64 20 72 69 67 68 74 20 53 45 4c 45 43 54 20  nd right SELECT 
fd70: 73 74 61 74 65 6d 65 6e 74 73 2e 0a 20 20 2a 2f  statements..  */
fd80: 0a 20 20 70 4f 72 64 65 72 42 79 20 3d 20 70 2d  .  pOrderBy = p-
fd90: 3e 70 4f 72 64 65 72 42 79 3b 0a 20 20 73 77 69  >pOrderBy;.  swi
fda0: 74 63 68 28 20 70 2d 3e 6f 70 20 29 7b 0a 20 20  tch( p->op ){.  
fdb0: 20 20 63 61 73 65 20 54 4b 5f 41 4c 4c 3a 20 7b    case TK_ALL: {
fdc0: 0a 20 20 20 20 20 20 69 66 28 20 70 4f 72 64 65  .      if( pOrde
fdd0: 72 42 79 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  rBy==0 ){.      
fde0: 20 20 69 6e 74 20 61 64 64 72 20 3d 20 30 3b 0a    int addr = 0;.
fdf0: 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
fe00: 21 70 50 72 69 6f 72 2d 3e 70 4c 69 6d 69 74 20  !pPrior->pLimit 
fe10: 29 3b 0a 20 20 20 20 20 20 20 20 70 50 72 69 6f  );.        pPrio
fe20: 72 2d 3e 70 4c 69 6d 69 74 20 3d 20 70 2d 3e 70  r->pLimit = p->p
fe30: 4c 69 6d 69 74 3b 0a 20 20 20 20 20 20 20 20 70  Limit;.        p
fe40: 50 72 69 6f 72 2d 3e 70 4f 66 66 73 65 74 20 3d  Prior->pOffset =
fe50: 20 70 2d 3e 70 4f 66 66 73 65 74 3b 0a 20 20 20   p->pOffset;.   
fe60: 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
fe70: 33 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20  3Select(pParse, 
fe80: 70 50 72 69 6f 72 2c 20 26 64 65 73 74 2c 20 30  pPrior, &dest, 0
fe90: 2c 20 30 2c 20 30 2c 20 61 66 66 29 3b 0a 20 20  , 0, 0, aff);.  
fea0: 20 20 20 20 20 20 70 2d 3e 70 4c 69 6d 69 74 20        p->pLimit 
feb0: 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e  = 0;.        p->
fec0: 70 4f 66 66 73 65 74 20 3d 20 30 3b 0a 20 20 20  pOffset = 0;.   
fed0: 20 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20       if( rc ){. 
fee0: 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 6d 75           goto mu
fef0: 6c 74 69 5f 73 65 6c 65 63 74 5f 65 6e 64 3b 0a  lti_select_end;.
ff00: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
ff10: 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d 20 30 3b    p->pPrior = 0;
ff20: 0a 20 20 20 20 20 20 20 20 70 2d 3e 69 4c 69 6d  .        p->iLim
ff30: 69 74 20 3d 20 70 50 72 69 6f 72 2d 3e 69 4c 69  it = pPrior->iLi
ff40: 6d 69 74 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e  mit;.        p->
ff50: 69 4f 66 66 73 65 74 20 3d 20 70 50 72 69 6f 72  iOffset = pPrior
ff60: 2d 3e 69 4f 66 66 73 65 74 3b 0a 20 20 20 20 20  ->iOffset;.     
ff70: 20 20 20 69 66 28 20 70 2d 3e 69 4c 69 6d 69 74     if( p->iLimit
ff80: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 61 64   ){.          ad
ff90: 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  dr = sqlite3Vdbe
ffa0: 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 49 66 5a  AddOp1(v, OP_IfZ
ffb0: 65 72 6f 2c 20 70 2d 3e 69 4c 69 6d 69 74 29 3b  ero, p->iLimit);
ffc0: 0a 20 20 20 20 20 20 20 20 20 20 56 64 62 65 43  .          VdbeC
ffd0: 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 4a 75 6d 70  omment((v, "Jump
ffe0: 20 61 68 65 61 64 20 69 66 20 4c 49 4d 49 54 20   ahead if LIMIT 
fff0: 72 65 61 63 68 65 64 22 29 29 3b 0a 20 20 20 20  reached"));.    
10000 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 72 63      }.        rc
10010 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74   = sqlite3Select
10020 28 70 50 61 72 73 65 2c 20 70 2c 20 26 64 65 73  (pParse, p, &des
10030 74 2c 20 30 2c 20 30 2c 20 30 2c 20 61 66 66 29  t, 0, 0, 0, aff)
10040 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 70 50 72  ;.        p->pPr
10050 69 6f 72 20 3d 20 70 50 72 69 6f 72 3b 0a 20 20  ior = pPrior;.  
10060 20 20 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a        if( rc ){.
10070 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 6d            goto m
10080 75 6c 74 69 5f 73 65 6c 65 63 74 5f 65 6e 64 3b  ulti_select_end;
10090 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
100a0 20 20 20 69 66 28 20 61 64 64 72 20 29 7b 0a 20     if( addr ){. 
100b0 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
100c0 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20  VdbeJumpHere(v, 
100d0 61 64 64 72 29 3b 0a 20 20 20 20 20 20 20 20 7d  addr);.        }
100e0 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  .        break;.
100f0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 2f 2a        }.      /*
10100 20 46 6f 72 20 55 4e 49 4f 4e 20 41 4c 4c 20 2e   For UNION ALL .
10110 2e 2e 20 4f 52 44 45 52 20 42 59 20 66 61 6c 6c  .. ORDER BY fall
10120 20 74 68 72 6f 75 67 68 20 74 6f 20 74 68 65 20   through to the 
10130 6e 65 78 74 20 63 61 73 65 20 2a 2f 0a 20 20 20  next case */.   
10140 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 45   }.    case TK_E
10150 58 43 45 50 54 3a 0a 20 20 20 20 63 61 73 65 20  XCEPT:.    case 
10160 54 4b 5f 55 4e 49 4f 4e 3a 20 7b 0a 20 20 20 20  TK_UNION: {.    
10170 20 20 69 6e 74 20 75 6e 69 6f 6e 54 61 62 3b 20    int unionTab; 
10180 20 20 20 2f 2a 20 43 75 72 73 6f 72 20 6e 75 6d     /* Cursor num
10190 62 65 72 20 6f 66 20 74 68 65 20 74 65 6d 70 6f  ber of the tempo
101a0 72 61 72 79 20 74 61 62 6c 65 20 68 6f 6c 64 69  rary table holdi
101b0 6e 67 20 72 65 73 75 6c 74 20 2a 2f 0a 20 20 20  ng result */.   
101c0 20 20 20 69 6e 74 20 6f 70 20 3d 20 30 3b 20 20     int op = 0;  
101d0 20 20 20 20 2f 2a 20 4f 6e 65 20 6f 66 20 74 68      /* One of th
101e0 65 20 53 52 54 5f 20 6f 70 65 72 61 74 69 6f 6e  e SRT_ operation
101f0 73 20 74 6f 20 61 70 70 6c 79 20 74 6f 20 73 65  s to apply to se
10200 6c 66 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20  lf */.      int 
10210 70 72 69 6f 72 4f 70 3b 20 20 20 20 20 2f 2a 20  priorOp;     /* 
10220 54 68 65 20 53 52 54 5f 20 6f 70 65 72 61 74 69  The SRT_ operati
10230 6f 6e 20 74 6f 20 61 70 70 6c 79 20 74 6f 20 70  on to apply to p
10240 72 69 6f 72 20 73 65 6c 65 63 74 73 20 2a 2f 0a  rior selects */.
10250 20 20 20 20 20 20 45 78 70 72 20 2a 70 4c 69 6d        Expr *pLim
10260 69 74 2c 20 2a 70 4f 66 66 73 65 74 3b 20 2f 2a  it, *pOffset; /*
10270 20 53 61 76 65 64 20 76 61 6c 75 65 73 20 6f 66   Saved values of
10280 20 70 2d 3e 6e 4c 69 6d 69 74 20 61 6e 64 20 70   p->nLimit and p
10290 2d 3e 6e 4f 66 66 73 65 74 20 2a 2f 0a 20 20 20  ->nOffset */.   
102a0 20 20 20 69 6e 74 20 61 64 64 72 3b 0a 20 20 20     int addr;.   
102b0 20 20 20 53 65 6c 65 63 74 44 65 73 74 20 75 6e     SelectDest un
102c0 69 6f 6e 64 65 73 74 3b 0a 0a 20 20 20 20 20 20  iondest;..      
102d0 70 72 69 6f 72 4f 70 20 3d 20 70 2d 3e 6f 70 3d  priorOp = p->op=
102e0 3d 54 4b 5f 41 4c 4c 20 3f 20 53 52 54 5f 54 61  =TK_ALL ? SRT_Ta
102f0 62 6c 65 20 3a 20 53 52 54 5f 55 6e 69 6f 6e 3b  ble : SRT_Union;
10300 0a 20 20 20 20 20 20 69 66 28 20 64 65 73 74 2e  .      if( dest.
10310 65 44 65 73 74 3d 3d 70 72 69 6f 72 4f 70 20 26  eDest==priorOp &
10320 26 20 70 4f 72 64 65 72 42 79 3d 3d 30 20 26 26  & pOrderBy==0 &&
10330 20 21 70 2d 3e 70 4c 69 6d 69 74 20 26 26 20 21   !p->pLimit && !
10340 70 2d 3e 70 4f 66 66 73 65 74 20 29 7b 0a 20 20  p->pOffset ){.  
10350 20 20 20 20 20 20 2f 2a 20 57 65 20 63 61 6e 20        /* We can 
10360 72 65 75 73 65 20 61 20 74 65 6d 70 6f 72 61 72  reuse a temporar
10370 79 20 74 61 62 6c 65 20 67 65 6e 65 72 61 74 65  y table generate
10380 64 20 62 79 20 61 20 53 45 4c 45 43 54 20 74 6f  d by a SELECT to
10390 20 6f 75 72 0a 20 20 20 20 20 20 20 20 2a 2a 20   our.        ** 
103a0 72 69 67 68 74 2e 0a 20 20 20 20 20 20 20 20 2a  right..        *
103b0 2f 0a 20 20 20 20 20 20 20 20 75 6e 69 6f 6e 54  /.        unionT
103c0 61 62 20 3d 20 64 65 73 74 2e 69 50 61 72 6d 3b  ab = dest.iParm;
103d0 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
103e0 20 20 20 20 20 20 2f 2a 20 57 65 20 77 69 6c 6c        /* We will
103f0 20 6e 65 65 64 20 74 6f 20 63 72 65 61 74 65 20   need to create 
10400 6f 75 72 20 6f 77 6e 20 74 65 6d 70 6f 72 61 72  our own temporar
10410 79 20 74 61 62 6c 65 20 74 6f 20 68 6f 6c 64 20  y table to hold 
10420 74 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 69  the.        ** i
10430 6e 74 65 72 6d 65 64 69 61 74 65 20 72 65 73 75  ntermediate resu
10440 6c 74 73 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a  lts..        */.
10450 20 20 20 20 20 20 20 20 75 6e 69 6f 6e 54 61 62          unionTab
10460 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b   = pParse->nTab+
10470 2b 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  +;.        if( p
10480 72 6f 63 65 73 73 43 6f 6d 70 6f 75 6e 64 4f 72  rocessCompoundOr
10490 64 65 72 42 79 28 70 50 61 72 73 65 2c 20 70 2c  derBy(pParse, p,
104a0 20 75 6e 69 6f 6e 54 61 62 29 20 29 7b 0a 20 20   unionTab) ){.  
104b0 20 20 20 20 20 20 20 20 72 63 20 3d 20 31 3b 0a          rc = 1;.
104c0 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 6d            goto m
104d0 75 6c 74 69 5f 73 65 6c 65 63 74 5f 65 6e 64 3b  ulti_select_end;
104e0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
104f0 20 20 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65     addr = sqlite
10500 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
10510 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 2c  P_OpenEphemeral,
10520 20 75 6e 69 6f 6e 54 61 62 2c 20 30 29 3b 0a 20   unionTab, 0);. 
10530 20 20 20 20 20 20 20 69 66 28 20 70 72 69 6f 72         if( prior
10540 4f 70 3d 3d 53 52 54 5f 54 61 62 6c 65 20 29 7b  Op==SRT_Table ){
10550 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72  .          asser
10560 74 28 20 6e 53 65 74 50 32 3c 73 69 7a 65 6f 66  t( nSetP2<sizeof
10570 28 61 53 65 74 50 32 29 2f 73 69 7a 65 6f 66 28  (aSetP2)/sizeof(
10580 61 53 65 74 50 32 5b 30 5d 29 20 29 3b 0a 20 20  aSetP2[0]) );.  
10590 20 20 20 20 20 20 20 20 61 53 65 74 50 32 5b 6e          aSetP2[n
105a0 53 65 74 50 32 2b 2b 5d 20 3d 20 61 64 64 72 3b  SetP2++] = addr;
105b0 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
105c0 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74            assert
105d0 28 20 70 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68  ( p->addrOpenEph
105e0 6d 5b 30 5d 20 3d 3d 20 2d 31 20 29 3b 0a 20 20  m[0] == -1 );.  
105f0 20 20 20 20 20 20 20 20 70 2d 3e 61 64 64 72 4f          p->addrO
10600 70 65 6e 45 70 68 6d 5b 30 5d 20 3d 20 61 64 64  penEphm[0] = add
10610 72 3b 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e  r;.          p->
10620 70 52 69 67 68 74 6d 6f 73 74 2d 3e 75 73 65 73  pRightmost->uses
10630 45 70 68 6d 20 3d 20 31 3b 0a 20 20 20 20 20 20  Ephm = 1;.      
10640 20 20 7d 0a 20 20 20 20 20 20 20 20 63 72 65 61    }.        crea
10650 74 65 53 6f 72 74 69 6e 67 49 6e 64 65 78 28 70  teSortingIndex(p
10660 50 61 72 73 65 2c 20 70 2c 20 70 4f 72 64 65 72  Parse, p, pOrder
10670 42 79 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73  By);.        ass
10680 65 72 74 28 20 70 2d 3e 70 45 4c 69 73 74 20 29  ert( p->pEList )
10690 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20  ;.      }..     
106a0 20 2f 2a 20 43 6f 64 65 20 74 68 65 20 53 45 4c   /* Code the SEL
106b0 45 43 54 20 73 74 61 74 65 6d 65 6e 74 73 20 74  ECT statements t
106c0 6f 20 6f 75 72 20 6c 65 66 74 0a 20 20 20 20 20  o our left.     
106d0 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74   */.      assert
106e0 28 20 21 70 50 72 69 6f 72 2d 3e 70 4f 72 64 65  ( !pPrior->pOrde
106f0 72 42 79 20 29 3b 0a 20 20 20 20 20 20 73 71 6c  rBy );.      sql
10700 69 74 65 33 53 65 6c 65 63 74 44 65 73 74 49 6e  ite3SelectDestIn
10710 69 74 28 26 75 6e 69 6f 6e 64 65 73 74 2c 20 70  it(&uniondest, p
10720 72 69 6f 72 4f 70 2c 20 75 6e 69 6f 6e 54 61 62  riorOp, unionTab
10730 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  );.      rc = sq
10740 6c 69 74 65 33 53 65 6c 65 63 74 28 70 50 61 72  lite3Select(pPar
10750 73 65 2c 20 70 50 72 69 6f 72 2c 20 26 75 6e 69  se, pPrior, &uni
10760 6f 6e 64 65 73 74 2c 20 30 2c 20 30 2c 20 30 2c  ondest, 0, 0, 0,
10770 20 61 66 66 29 3b 0a 20 20 20 20 20 20 69 66 28   aff);.      if(
10780 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20 67   rc ){.        g
10790 6f 74 6f 20 6d 75 6c 74 69 5f 73 65 6c 65 63 74  oto multi_select
107a0 5f 65 6e 64 3b 0a 20 20 20 20 20 20 7d 0a 0a 20  _end;.      }.. 
107b0 20 20 20 20 20 2f 2a 20 43 6f 64 65 20 74 68 65       /* Code the
107c0 20 63 75 72 72 65 6e 74 20 53 45 4c 45 43 54 20   current SELECT 
107d0 73 74 61 74 65 6d 65 6e 74 0a 20 20 20 20 20 20  statement.      
107e0 2a 2f 0a 20 20 20 20 20 20 73 77 69 74 63 68 28  */.      switch(
107f0 20 70 2d 3e 6f 70 20 29 7b 0a 20 20 20 20 20 20   p->op ){.      
10800 20 20 20 63 61 73 65 20 54 4b 5f 45 58 43 45 50     case TK_EXCEP
10810 54 3a 20 20 6f 70 20 3d 20 53 52 54 5f 45 78 63  T:  op = SRT_Exc
10820 65 70 74 3b 20 20 20 62 72 65 61 6b 3b 0a 20 20  ept;   break;.  
10830 20 20 20 20 20 20 20 63 61 73 65 20 54 4b 5f 55         case TK_U
10840 4e 49 4f 4e 3a 20 20 20 6f 70 20 3d 20 53 52 54  NION:   op = SRT
10850 5f 55 6e 69 6f 6e 3b 20 20 20 20 62 72 65 61 6b  _Union;    break
10860 3b 0a 20 20 20 20 20 20 20 20 20 63 61 73 65 20  ;.         case 
10870 54 4b 5f 41 4c 4c 3a 20 20 20 20 20 6f 70 20 3d  TK_ALL:     op =
10880 20 53 52 54 5f 54 61 62 6c 65 3b 20 20 20 20 62   SRT_Table;    b
10890 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  reak;.      }.  
108a0 20 20 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d 20      p->pPrior = 
108b0 30 3b 0a 20 20 20 20 20 20 70 2d 3e 70 4f 72 64  0;.      p->pOrd
108c0 65 72 42 79 20 3d 20 30 3b 0a 20 20 20 20 20 20  erBy = 0;.      
108d0 70 2d 3e 64 69 73 61 6c 6c 6f 77 4f 72 64 65 72  p->disallowOrder
108e0 42 79 20 3d 20 70 4f 72 64 65 72 42 79 21 3d 30  By = pOrderBy!=0
108f0 3b 0a 20 20 20 20 20 20 70 4c 69 6d 69 74 20 3d  ;.      pLimit =
10900 20 70 2d 3e 70 4c 69 6d 69 74 3b 0a 20 20 20 20   p->pLimit;.    
10910 20 20 70 2d 3e 70 4c 69 6d 69 74 20 3d 20 30 3b    p->pLimit = 0;
10920 0a 20 20 20 20 20 20 70 4f 66 66 73 65 74 20 3d  .      pOffset =
10930 20 70 2d 3e 70 4f 66 66 73 65 74 3b 0a 20 20 20   p->pOffset;.   
10940 20 20 20 70 2d 3e 70 4f 66 66 73 65 74 20 3d 20     p->pOffset = 
10950 30 3b 0a 20 20 20 20 20 20 75 6e 69 6f 6e 64 65  0;.      unionde
10960 73 74 2e 65 44 65 73 74 20 3d 20 6f 70 3b 0a 20  st.eDest = op;. 
10970 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
10980 33 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20  3Select(pParse, 
10990 70 2c 20 26 75 6e 69 6f 6e 64 65 73 74 2c 20 30  p, &uniondest, 0
109a0 2c 20 30 2c 20 30 2c 20 61 66 66 29 3b 0a 20 20  , 0, 0, aff);.  
109b0 20 20 20 20 2f 2a 20 51 75 65 72 79 20 66 6c 61      /* Query fla
109c0 74 74 65 6e 69 6e 67 20 69 6e 20 73 71 6c 69 74  ttening in sqlit
109d0 65 33 53 65 6c 65 63 74 28 29 20 6d 69 67 68 74  e3Select() might
109e0 20 72 65 66 69 6c 6c 20 70 2d 3e 70 4f 72 64 65   refill p->pOrde
109f0 72 42 79 2e 0a 20 20 20 20 20 20 2a 2a 20 42 65  rBy..      ** Be
10a00 20 73 75 72 65 20 74 6f 20 64 65 6c 65 74 65 20   sure to delete 
10a10 70 2d 3e 70 4f 72 64 65 72 42 79 2c 20 74 68 65  p->pOrderBy, the
10a20 72 65 66 6f 72 65 2c 20 74 6f 20 61 76 6f 69 64  refore, to avoid
10a30 20 61 20 6d 65 6d 6f 72 79 20 6c 65 61 6b 2e 20   a memory leak. 
10a40 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  */.      sqlite3
10a50 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28 70  ExprListDelete(p
10a60 2d 3e 70 4f 72 64 65 72 42 79 29 3b 0a 20 20 20  ->pOrderBy);.   
10a70 20 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d 20 70     p->pPrior = p
10a80 50 72 69 6f 72 3b 0a 20 20 20 20 20 20 70 2d 3e  Prior;.      p->
10a90 70 4f 72 64 65 72 42 79 20 3d 20 70 4f 72 64 65  pOrderBy = pOrde
10aa0 72 42 79 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  rBy;.      sqlit
10ab0 65 33 45 78 70 72 44 65 6c 65 74 65 28 70 2d 3e  e3ExprDelete(p->
10ac0 70 4c 69 6d 69 74 29 3b 0a 20 20 20 20 20 20 70  pLimit);.      p
10ad0 2d 3e 70 4c 69 6d 69 74 20 3d 20 70 4c 69 6d 69  ->pLimit = pLimi
10ae0 74 3b 0a 20 20 20 20 20 20 70 2d 3e 70 4f 66 66  t;.      p->pOff
10af0 73 65 74 20 3d 20 70 4f 66 66 73 65 74 3b 0a 20  set = pOffset;. 
10b00 20 20 20 20 20 70 2d 3e 69 4c 69 6d 69 74 20 3d       p->iLimit =
10b10 20 30 3b 0a 20 20 20 20 20 20 70 2d 3e 69 4f 66   0;.      p->iOf
10b20 66 73 65 74 20 3d 20 30 3b 0a 20 20 20 20 20 20  fset = 0;.      
10b30 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20  if( rc ){.      
10b40 20 20 67 6f 74 6f 20 6d 75 6c 74 69 5f 73 65 6c    goto multi_sel
10b50 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 20 20 7d  ect_end;.      }
10b60 0a 0a 0a 20 20 20 20 20 20 2f 2a 20 43 6f 6e 76  ...      /* Conv
10b70 65 72 74 20 74 68 65 20 64 61 74 61 20 69 6e 20  ert the data in 
10b80 74 68 65 20 74 65 6d 70 6f 72 61 72 79 20 74 61  the temporary ta
10b90 62 6c 65 20 69 6e 74 6f 20 77 68 61 74 65 76 65  ble into whateve
10ba0 72 20 66 6f 72 6d 0a 20 20 20 20 20 20 2a 2a 20  r form.      ** 
10bb0 69 74 20 69 73 20 74 68 61 74 20 77 65 20 63 75  it is that we cu
10bc0 72 72 65 6e 74 6c 79 20 6e 65 65 64 2e 0a 20 20  rrently need..  
10bd0 20 20 20 20 2a 2f 20 20 20 20 20 20 0a 20 20 20      */      .   
10be0 20 20 20 69 66 28 20 64 65 73 74 2e 65 44 65 73     if( dest.eDes
10bf0 74 21 3d 70 72 69 6f 72 4f 70 20 7c 7c 20 75 6e  t!=priorOp || un
10c00 69 6f 6e 54 61 62 21 3d 64 65 73 74 2e 69 50 61  ionTab!=dest.iPa
10c10 72 6d 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e  rm ){.        in
10c20 74 20 69 43 6f 6e 74 2c 20 69 42 72 65 61 6b 2c  t iCont, iBreak,
10c30 20 69 53 74 61 72 74 3b 0a 20 20 20 20 20 20 20   iStart;.       
10c40 20 61 73 73 65 72 74 28 20 70 2d 3e 70 45 4c 69   assert( p->pELi
10c50 73 74 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66  st );.        if
10c60 28 20 64 65 73 74 2e 65 44 65 73 74 3d 3d 53 52  ( dest.eDest==SR
10c70 54 5f 43 61 6c 6c 62 61 63 6b 20 29 7b 0a 20 20  T_Callback ){.  
10c80 20 20 20 20 20 20 20 20 53 65 6c 65 63 74 20 2a          Select *
10c90 70 46 69 72 73 74 20 3d 20 70 3b 0a 20 20 20 20  pFirst = p;.    
10ca0 20 20 20 20 20 20 77 68 69 6c 65 28 20 70 46 69        while( pFi
10cb0 72 73 74 2d 3e 70 50 72 69 6f 72 20 29 20 70 46  rst->pPrior ) pF
10cc0 69 72 73 74 20 3d 20 70 46 69 72 73 74 2d 3e 70  irst = pFirst->p
10cd0 50 72 69 6f 72 3b 0a 20 20 20 20 20 20 20 20 20  Prior;.         
10ce0 20 67 65 6e 65 72 61 74 65 43 6f 6c 75 6d 6e 4e   generateColumnN
10cf0 61 6d 65 73 28 70 50 61 72 73 65 2c 20 30 2c 20  ames(pParse, 0, 
10d00 70 46 69 72 73 74 2d 3e 70 45 4c 69 73 74 29 3b  pFirst->pEList);
10d10 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
10d20 20 20 20 69 42 72 65 61 6b 20 3d 20 73 71 6c 69     iBreak = sqli
10d30 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c  te3VdbeMakeLabel
10d40 28 76 29 3b 0a 20 20 20 20 20 20 20 20 69 43 6f  (v);.        iCo
10d50 6e 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  nt = sqlite3Vdbe
10d60 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20  MakeLabel(v);.  
10d70 20 20 20 20 20 20 63 6f 6d 70 75 74 65 4c 69 6d        computeLim
10d80 69 74 52 65 67 69 73 74 65 72 73 28 70 50 61 72  itRegisters(pPar
10d90 73 65 2c 20 70 2c 20 69 42 72 65 61 6b 29 3b 0a  se, p, iBreak);.
10da0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
10db0 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
10dc0 52 65 77 69 6e 64 2c 20 75 6e 69 6f 6e 54 61 62  Rewind, unionTab
10dd0 2c 20 69 42 72 65 61 6b 29 3b 0a 20 20 20 20 20  , iBreak);.     
10de0 20 20 20 69 53 74 61 72 74 20 3d 20 73 71 6c 69     iStart = sqli
10df0 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64  te3VdbeCurrentAd
10e00 64 72 28 76 29 3b 0a 20 20 20 20 20 20 20 20 73  dr(v);.        s
10e10 65 6c 65 63 74 49 6e 6e 65 72 4c 6f 6f 70 28 70  electInnerLoop(p
10e20 50 61 72 73 65 2c 20 70 2c 20 70 2d 3e 70 45 4c  Parse, p, p->pEL
10e30 69 73 74 2c 20 75 6e 69 6f 6e 54 61 62 2c 20 70  ist, unionTab, p
10e40 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 2c  ->pEList->nExpr,
10e50 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
10e60 20 20 20 20 20 20 20 20 20 70 4f 72 64 65 72 42           pOrderB
10e70 79 2c 20 2d 31 2c 20 26 64 65 73 74 2c 20 69 43  y, -1, &dest, iC
10e80 6f 6e 74 2c 20 69 42 72 65 61 6b 2c 20 30 29 3b  ont, iBreak, 0);
10e90 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
10ea0 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c  VdbeResolveLabel
10eb0 28 76 2c 20 69 43 6f 6e 74 29 3b 0a 20 20 20 20  (v, iCont);.    
10ec0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
10ed0 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 65 78 74  ddOp2(v, OP_Next
10ee0 2c 20 75 6e 69 6f 6e 54 61 62 2c 20 69 53 74 61  , unionTab, iSta
10ef0 72 74 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  rt);.        sql
10f00 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c  ite3VdbeResolveL
10f10 61 62 65 6c 28 76 2c 20 69 42 72 65 61 6b 29 3b  abel(v, iBreak);
10f20 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
10f30 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
10f40 5f 43 6c 6f 73 65 2c 20 75 6e 69 6f 6e 54 61 62  _Close, unionTab
10f50 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  , 0);.      }.  
10f60 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
10f70 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49 4e 54  .    case TK_INT
10f80 45 52 53 45 43 54 3a 20 7b 0a 20 20 20 20 20 20  ERSECT: {.      
10f90 69 6e 74 20 74 61 62 31 2c 20 74 61 62 32 3b 0a  int tab1, tab2;.
10fa0 20 20 20 20 20 20 69 6e 74 20 69 43 6f 6e 74 2c        int iCont,
10fb0 20 69 42 72 65 61 6b 2c 20 69 53 74 61 72 74 3b   iBreak, iStart;
10fc0 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 4c 69  .      Expr *pLi
10fd0 6d 69 74 2c 20 2a 70 4f 66 66 73 65 74 3b 0a 20  mit, *pOffset;. 
10fe0 20 20 20 20 20 69 6e 74 20 61 64 64 72 3b 0a 20       int addr;. 
10ff0 20 20 20 20 20 53 65 6c 65 63 74 44 65 73 74 20       SelectDest 
11000 69 6e 74 65 72 73 65 63 74 64 65 73 74 3b 0a 20  intersectdest;. 
11010 20 20 20 20 20 69 6e 74 20 72 31 3b 0a 0a 20 20       int r1;..  
11020 20 20 20 20 2f 2a 20 49 4e 54 45 52 53 45 43 54      /* INTERSECT
11030 20 69 73 20 64 69 66 66 65 72 65 6e 74 20 66 72   is different fr
11040 6f 6d 20 74 68 65 20 6f 74 68 65 72 73 20 73 69  om the others si
11050 6e 63 65 20 69 74 20 72 65 71 75 69 72 65 73 0a  nce it requires.
11060 20 20 20 20 20 20 2a 2a 20 74 77 6f 20 74 65 6d        ** two tem
11070 70 6f 72 61 72 79 20 74 61 62 6c 65 73 2e 20 20  porary tables.  
11080 48 65 6e 63 65 20 69 74 20 68 61 73 20 69 74 73  Hence it has its
11090 20 6f 77 6e 20 63 61 73 65 2e 20 20 42 65 67 69   own case.  Begi
110a0 6e 0a 20 20 20 20 20 20 2a 2a 20 62 79 20 61 6c  n.      ** by al
110b0 6c 6f 63 61 74 69 6e 67 20 74 68 65 20 74 61 62  locating the tab
110c0 6c 65 73 20 77 65 20 77 69 6c 6c 20 6e 65 65 64  les we will need
110d0 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
110e0 20 74 61 62 31 20 3d 20 70 50 61 72 73 65 2d 3e   tab1 = pParse->
110f0 6e 54 61 62 2b 2b 3b 0a 20 20 20 20 20 20 74 61  nTab++;.      ta
11100 62 32 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61  b2 = pParse->nTa
11110 62 2b 2b 3b 0a 20 20 20 20 20 20 69 66 28 20 70  b++;.      if( p
11120 72 6f 63 65 73 73 43 6f 6d 70 6f 75 6e 64 4f 72  rocessCompoundOr
11130 64 65 72 42 79 28 70 50 61 72 73 65 2c 20 70 2c  derBy(pParse, p,
11140 20 74 61 62 31 29 20 29 7b 0a 20 20 20 20 20 20   tab1) ){.      
11150 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 20 20    rc = 1;.      
11160 20 20 67 6f 74 6f 20 6d 75 6c 74 69 5f 73 65 6c    goto multi_sel
11170 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 20 20 7d  ect_end;.      }
11180 0a 20 20 20 20 20 20 63 72 65 61 74 65 53 6f 72  .      createSor
11190 74 69 6e 67 49 6e 64 65 78 28 70 50 61 72 73 65  tingIndex(pParse
111a0 2c 20 70 2c 20 70 4f 72 64 65 72 42 79 29 3b 0a  , p, pOrderBy);.
111b0 0a 20 20 20 20 20 20 61 64 64 72 20 3d 20 73 71  .      addr = sq
111c0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
111d0 76 2c 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65  v, OP_OpenEpheme
111e0 72 61 6c 2c 20 74 61 62 31 2c 20 30 29 3b 0a 20  ral, tab1, 0);. 
111f0 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e       assert( p->
11200 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b 30 5d 20  addrOpenEphm[0] 
11210 3d 3d 20 2d 31 20 29 3b 0a 20 20 20 20 20 20 70  == -1 );.      p
11220 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b 30  ->addrOpenEphm[0
11230 5d 20 3d 20 61 64 64 72 3b 0a 20 20 20 20 20 20  ] = addr;.      
11240 70 2d 3e 70 52 69 67 68 74 6d 6f 73 74 2d 3e 75  p->pRightmost->u
11250 73 65 73 45 70 68 6d 20 3d 20 31 3b 0a 20 20 20  sesEphm = 1;.   
11260 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 45     assert( p->pE
11270 4c 69 73 74 20 29 3b 0a 0a 20 20 20 20 20 20 2f  List );..      /
11280 2a 20 43 6f 64 65 20 74 68 65 20 53 45 4c 45 43  * Code the SELEC
11290 54 73 20 74 6f 20 6f 75 72 20 6c 65 66 74 20 69  Ts to our left i
112a0 6e 74 6f 20 74 65 6d 70 6f 72 61 72 79 20 74 61  nto temporary ta
112b0 62 6c 65 20 22 74 61 62 31 22 2e 0a 20 20 20 20  ble "tab1"..    
112c0 20 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74    */.      sqlit
112d0 65 33 53 65 6c 65 63 74 44 65 73 74 49 6e 69 74  e3SelectDestInit
112e0 28 26 69 6e 74 65 72 73 65 63 74 64 65 73 74 2c  (&intersectdest,
112f0 20 53 52 54 5f 55 6e 69 6f 6e 2c 20 74 61 62 31   SRT_Union, tab1
11300 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  );.      rc = sq
11310 6c 69 74 65 33 53 65 6c 65 63 74 28 70 50 61 72  lite3Select(pPar
11320 73 65 2c 20 70 50 72 69 6f 72 2c 20 26 69 6e 74  se, pPrior, &int
11330 65 72 73 65 63 74 64 65 73 74 2c 20 30 2c 20 30  ersectdest, 0, 0
11340 2c 20 30 2c 20 61 66 66 29 3b 0a 20 20 20 20 20  , 0, aff);.     
11350 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20   if( rc ){.     
11360 20 20 20 67 6f 74 6f 20 6d 75 6c 74 69 5f 73 65     goto multi_se
11370 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 20 20  lect_end;.      
11380 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 43 6f 64 65  }..      /* Code
11390 20 74 68 65 20 63 75 72 72 65 6e 74 20 53 45 4c   the current SEL
113a0 45 43 54 20 69 6e 74 6f 20 74 65 6d 70 6f 72 61  ECT into tempora
113b0 72 79 20 74 61 62 6c 65 20 22 74 61 62 32 22 0a  ry table "tab2".
113c0 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 61        */.      a
113d0 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62  ddr = sqlite3Vdb
113e0 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4f 70  eAddOp2(v, OP_Op
113f0 65 6e 45 70 68 65 6d 65 72 61 6c 2c 20 74 61 62  enEphemeral, tab
11400 32 2c 20 30 29 3b 0a 20 20 20 20 20 20 61 73 73  2, 0);.      ass
11410 65 72 74 28 20 70 2d 3e 61 64 64 72 4f 70 65 6e  ert( p->addrOpen
11420 45 70 68 6d 5b 31 5d 20 3d 3d 20 2d 31 20 29 3b  Ephm[1] == -1 );
11430 0a 20 20 20 20 20 20 70 2d 3e 61 64 64 72 4f 70  .      p->addrOp
11440 65 6e 45 70 68 6d 5b 31 5d 20 3d 20 61 64 64 72  enEphm[1] = addr
11450 3b 0a 20 20 20 20 20 20 70 2d 3e 70 50 72 69 6f  ;.      p->pPrio
11460 72 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 4c 69  r = 0;.      pLi
11470 6d 69 74 20 3d 20 70 2d 3e 70 4c 69 6d 69 74 3b  mit = p->pLimit;
11480 0a 20 20 20 20 20 20 70 2d 3e 70 4c 69 6d 69 74  .      p->pLimit
11490 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 4f 66 66   = 0;.      pOff
114a0 73 65 74 20 3d 20 70 2d 3e 70 4f 66 66 73 65 74  set = p->pOffset
114b0 3b 0a 20 20 20 20 20 20 70 2d 3e 70 4f 66 66 73  ;.      p->pOffs
114c0 65 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 69 6e  et = 0;.      in
114d0 74 65 72 73 65 63 74 64 65 73 74 2e 69 50 61 72  tersectdest.iPar
114e0 6d 20 3d 20 74 61 62 32 3b 0a 20 20 20 20 20 20  m = tab2;.      
114f0 72 63 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65  rc = sqlite3Sele
11500 63 74 28 70 50 61 72 73 65 2c 20 70 2c 20 26 69  ct(pParse, p, &i
11510 6e 74 65 72 73 65 63 74 64 65 73 74 2c 20 30 2c  ntersectdest, 0,
11520 20 30 2c 20 30 2c 20 61 66 66 29 3b 0a 20 20 20   0, 0, aff);.   
11530 20 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d 20 70     p->pPrior = p
11540 50 72 69 6f 72 3b 0a 20 20 20 20 20 20 73 71 6c  Prior;.      sql
11550 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 70  ite3ExprDelete(p
11560 2d 3e 70 4c 69 6d 69 74 29 3b 0a 20 20 20 20 20  ->pLimit);.     
11570 20 70 2d 3e 70 4c 69 6d 69 74 20 3d 20 70 4c 69   p->pLimit = pLi
11580 6d 69 74 3b 0a 20 20 20 20 20 20 70 2d 3e 70 4f  mit;.      p->pO
11590 66 66 73 65 74 20 3d 20 70 4f 66 66 73 65 74 3b  ffset = pOffset;
115a0 0a 20 20 20 20 20 20 69 66 28 20 72 63 20 29 7b  .      if( rc ){
115b0 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 6d 75  .        goto mu
115c0 6c 74 69 5f 73 65 6c 65 63 74 5f 65 6e 64 3b 0a  lti_select_end;.
115d0 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f        }..      /
115e0 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20  * Generate code 
115f0 74 6f 20 74 61 6b 65 20 74 68 65 20 69 6e 74 65  to take the inte
11600 72 73 65 63 74 69 6f 6e 20 6f 66 20 74 68 65 20  rsection of the 
11610 74 77 6f 20 74 65 6d 70 6f 72 61 72 79 0a 20 20  two temporary.  
11620 20 20 20 20 2a 2a 20 74 61 62 6c 65 73 2e 0a 20      ** tables.. 
11630 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 61 73       */.      as
11640 73 65 72 74 28 20 70 2d 3e 70 45 4c 69 73 74 20  sert( p->pEList 
11650 29 3b 0a 20 20 20 20 20 20 69 66 28 20 64 65 73  );.      if( des
11660 74 2e 65 44 65 73 74 3d 3d 53 52 54 5f 43 61 6c  t.eDest==SRT_Cal
11670 6c 62 61 63 6b 20 29 7b 0a 20 20 20 20 20 20 20  lback ){.       
11680 20 53 65 6c 65 63 74 20 2a 70 46 69 72 73 74 20   Select *pFirst 
11690 3d 20 70 3b 0a 20 20 20 20 20 20 20 20 77 68 69  = p;.        whi
116a0 6c 65 28 20 70 46 69 72 73 74 2d 3e 70 50 72 69  le( pFirst->pPri
116b0 6f 72 20 29 20 70 46 69 72 73 74 20 3d 20 70 46  or ) pFirst = pF
116c0 69 72 73 74 2d 3e 70 50 72 69 6f 72 3b 0a 20 20  irst->pPrior;.  
116d0 20 20 20 20 20 20 67 65 6e 65 72 61 74 65 43 6f        generateCo
116e0 6c 75 6d 6e 4e 61 6d 65 73 28 70 50 61 72 73 65  lumnNames(pParse
116f0 2c 20 30 2c 20 70 46 69 72 73 74 2d 3e 70 45 4c  , 0, pFirst->pEL
11700 69 73 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ist);.      }.  
11710 20 20 20 20 69 42 72 65 61 6b 20 3d 20 73 71 6c      iBreak = sql
11720 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65  ite3VdbeMakeLabe
11730 6c 28 76 29 3b 0a 20 20 20 20 20 20 69 43 6f 6e  l(v);.      iCon
11740 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d  t = sqlite3VdbeM
11750 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20  akeLabel(v);.   
11760 20 20 20 63 6f 6d 70 75 74 65 4c 69 6d 69 74 52     computeLimitR
11770 65 67 69 73 74 65 72 73 28 70 50 61 72 73 65 2c  egisters(pParse,
11780 20 70 2c 20 69 42 72 65 61 6b 29 3b 0a 20 20 20   p, iBreak);.   
11790 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
117a0 64 4f 70 32 28 76 2c 20 4f 50 5f 52 65 77 69 6e  dOp2(v, OP_Rewin
117b0 64 2c 20 74 61 62 31 2c 20 69 42 72 65 61 6b 29  d, tab1, iBreak)
117c0 3b 0a 20 20 20 20 20 20 72 31 20 3d 20 73 71 6c  ;.      r1 = sql
117d0 69 74 65 33 47 65 74 54 65 6d 70 52 65 67 28 70  ite3GetTempReg(p
117e0 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 69 53  Parse);.      iS
117f0 74 61 72 74 20 3d 20 73 71 6c 69 74 65 33 56 64  tart = sqlite3Vd
11800 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52  beAddOp2(v, OP_R
11810 6f 77 4b 65 79 2c 20 74 61 62 31 2c 20 72 31 29  owKey, tab1, r1)
11820 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
11830 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
11840 4e 6f 74 46 6f 75 6e 64 2c 20 74 61 62 32 2c 20  NotFound, tab2, 
11850 69 43 6f 6e 74 2c 20 72 31 29 3b 0a 20 20 20 20  iCont, r1);.    
11860 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65    sqlite3Release
11870 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20  TempReg(pParse, 
11880 72 31 29 3b 0a 20 20 20 20 20 20 73 65 6c 65 63  r1);.      selec
11890 74 49 6e 6e 65 72 4c 6f 6f 70 28 70 50 61 72 73  tInnerLoop(pPars
118a0 65 2c 20 70 2c 20 70 2d 3e 70 45 4c 69 73 74 2c  e, p, p->pEList,
118b0 20 74 61 62 31 2c 20 70 2d 3e 70 45 4c 69 73 74   tab1, p->pEList
118c0 2d 3e 6e 45 78 70 72 2c 0a 20 20 20 20 20 20 20  ->nExpr,.       
118d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
118e0 4f 72 64 65 72 42 79 2c 20 2d 31 2c 20 26 64 65  OrderBy, -1, &de
118f0 73 74 2c 20 69 43 6f 6e 74 2c 20 69 42 72 65 61  st, iCont, iBrea
11900 6b 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c  k, 0);.      sql
11910 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c  ite3VdbeResolveL
11920 61 62 65 6c 28 76 2c 20 69 43 6f 6e 74 29 3b 0a  abel(v, iCont);.
11930 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
11940 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 65  eAddOp2(v, OP_Ne
11950 78 74 2c 20 74 61 62 31 2c 20 69 53 74 61 72 74  xt, tab1, iStart
11960 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
11970 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c  VdbeResolveLabel
11980 28 76 2c 20 69 42 72 65 61 6b 29 3b 0a 20 20 20  (v, iBreak);.   
11990 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
119a0 64 4f 70 32 28 76 2c 20 4f 50 5f 43 6c 6f 73 65  dOp2(v, OP_Close
119b0 2c 20 74 61 62 32 2c 20 30 29 3b 0a 20 20 20 20  , tab2, 0);.    
119c0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
119d0 4f 70 32 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c  Op2(v, OP_Close,
119e0 20 74 61 62 31 2c 20 30 29 3b 0a 20 20 20 20 20   tab1, 0);.     
119f0 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
11a00 7d 0a 0a 20 20 2f 2a 20 53 65 74 20 74 68 65 20  }..  /* Set the 
11a10 6e 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e  number of column
11a20 73 20 69 6e 20 74 65 6d 70 6f 72 61 72 79 20 74  s in temporary t
11a30 61 62 6c 65 73 0a 20 20 2a 2f 0a 20 20 6e 43 6f  ables.  */.  nCo
11a40 6c 20 3d 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e  l = p->pEList->n
11a50 45 78 70 72 3b 0a 20 20 77 68 69 6c 65 28 20 6e  Expr;.  while( n
11a60 53 65 74 50 32 20 29 7b 0a 20 20 20 20 73 71 6c  SetP2 ){.    sql
11a70 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 32  ite3VdbeChangeP2
11a80 28 76 2c 20 61 53 65 74 50 32 5b 2d 2d 6e 53 65  (v, aSetP2[--nSe
11a90 74 50 32 5d 2c 20 6e 43 6f 6c 29 3b 0a 20 20 7d  tP2], nCol);.  }
11aa0 0a 0a 20 20 2f 2a 20 43 6f 6d 70 75 74 65 20 63  ..  /* Compute c
11ab0 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63  ollating sequenc
11ac0 65 73 20 75 73 65 64 20 62 79 20 65 69 74 68 65  es used by eithe
11ad0 72 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 63  r the ORDER BY c
11ae0 6c 61 75 73 65 20 6f 72 0a 20 20 2a 2a 20 62 79  lause or.  ** by
11af0 20 61 6e 79 20 74 65 6d 70 6f 72 61 72 79 20 74   any temporary t
11b00 61 62 6c 65 73 20 6e 65 65 64 65 64 20 74 6f 20  ables needed to 
11b10 69 6d 70 6c 65 6d 65 6e 74 20 74 68 65 20 63 6f  implement the co
11b20 6d 70 6f 75 6e 64 20 73 65 6c 65 63 74 2e 0a 20  mpound select.. 
11b30 20 2a 2a 20 41 74 74 61 63 68 20 74 68 65 20 4b   ** Attach the K
11b40 65 79 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65  eyInfo structure
11b50 20 74 6f 20 61 6c 6c 20 74 65 6d 70 6f 72 61 72   to all temporar
11b60 79 20 74 61 62 6c 65 73 2e 20 20 49 6e 76 6f 6b  y tables.  Invok
11b70 65 20 74 68 65 0a 20 20 2a 2a 20 4f 52 44 45 52  e the.  ** ORDER
11b80 20 42 59 20 70 72 6f 63 65 73 73 69 6e 67 20 69   BY processing i
11b90 66 20 74 68 65 72 65 20 69 73 20 61 6e 20 4f 52  f there is an OR
11ba0 44 45 52 20 42 59 20 63 6c 61 75 73 65 2e 0a 20  DER BY clause.. 
11bb0 20 2a 2a 0a 20 20 2a 2a 20 54 68 69 73 20 73 65   **.  ** This se
11bc0 63 74 69 6f 6e 20 69 73 20 72 75 6e 20 62 79 20  ction is run by 
11bd0 74 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 20 53  the right-most S
11be0 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20  ELECT statement 
11bf0 6f 6e 6c 79 2e 0a 20 20 2a 2a 20 53 45 4c 45 43  only..  ** SELEC
11c00 54 20 73 74 61 74 65 6d 65 6e 74 73 20 74 6f 20  T statements to 
11c10 74 68 65 20 6c 65 66 74 20 61 6c 77 61 79 73 20  the left always 
11c20 73 6b 69 70 20 74 68 69 73 20 70 61 72 74 2e 20  skip this part. 
11c30 20 54 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 0a   The right-most.
11c40 20 20 2a 2a 20 53 45 4c 45 43 54 20 6d 69 67 68    ** SELECT migh
11c50 74 20 61 6c 73 6f 20 73 6b 69 70 20 74 68 69 73  t also skip this
11c60 20 70 61 72 74 20 69 66 20 69 74 20 68 61 73 20   part if it has 
11c70 6e 6f 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75  no ORDER BY clau
11c80 73 65 20 61 6e 64 0a 20 20 2a 2a 20 6e 6f 20 74  se and.  ** no t
11c90 65 6d 70 20 74 61 62 6c 65 73 20 61 72 65 20 72  emp tables are r
11ca0 65 71 75 69 72 65 64 2e 0a 20 20 2a 2f 0a 20 20  equired..  */.  
11cb0 69 66 28 20 70 4f 72 64 65 72 42 79 20 7c 7c 20  if( pOrderBy || 
11cc0 70 2d 3e 75 73 65 73 45 70 68 6d 20 29 7b 0a 20  p->usesEphm ){. 
11cd0 20 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20     int i;       
11ce0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11cf0 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72   /* Loop counter
11d00 20 2a 2f 0a 20 20 20 20 4b 65 79 49 6e 66 6f 20   */.    KeyInfo 
11d10 2a 70 4b 65 79 49 6e 66 6f 3b 20 20 20 20 20 20  *pKeyInfo;      
11d20 20 20 20 20 20 20 2f 2a 20 43 6f 6c 6c 61 74 69        /* Collati
11d30 6e 67 20 73 65 71 75 65 6e 63 65 20 66 6f 72 20  ng sequence for 
11d40 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 20 2a  the result set *
11d50 2f 0a 20 20 20 20 53 65 6c 65 63 74 20 2a 70 4c  /.    Select *pL
11d60 6f 6f 70 3b 20 20 20 20 20 20 20 20 20 20 20 20  oop;            
11d70 20 20 20 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69      /* For loopi
11d80 6e 67 20 74 68 72 6f 75 67 68 20 53 45 4c 45 43  ng through SELEC
11d90 54 20 73 74 61 74 65 6d 65 6e 74 73 20 2a 2f 0a  T statements */.
11da0 20 20 20 20 69 6e 74 20 6e 4b 65 79 43 6f 6c 3b      int nKeyCol;
11db0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11dc0 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 65    /* Number of e
11dd0 6e 74 72 69 65 73 20 69 6e 20 70 4b 65 79 49 6e  ntries in pKeyIn
11de0 66 6f 2d 3e 61 43 6f 6c 5b 5d 20 2a 2f 0a 20 20  fo->aCol[] */.  
11df0 20 20 43 6f 6c 6c 53 65 71 20 2a 2a 61 70 43 6f    CollSeq **apCo
11e00 6c 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ll;             
11e10 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e 67 20 74  /* For looping t
11e20 68 72 6f 75 67 68 20 70 4b 65 79 49 6e 66 6f 2d  hrough pKeyInfo-
11e30 3e 61 43 6f 6c 6c 5b 5d 20 2a 2f 0a 20 20 20 20  >aColl[] */.    
11e40 43 6f 6c 6c 53 65 71 20 2a 2a 61 43 6f 70 79 3b  CollSeq **aCopy;
11e50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
11e60 20 41 20 63 6f 70 79 20 6f 66 20 70 4b 65 79 49   A copy of pKeyI
11e70 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b 5d 20 2a 2f 0a  nfo->aColl[] */.
11e80 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e  .    assert( p->
11e90 70 52 69 67 68 74 6d 6f 73 74 3d 3d 70 20 29 3b  pRightmost==p );
11ea0 0a 20 20 20 20 6e 4b 65 79 43 6f 6c 20 3d 20 6e  .    nKeyCol = n
11eb0 43 6f 6c 20 2b 20 28 70 4f 72 64 65 72 42 79 20  Col + (pOrderBy 
11ec0 3f 20 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70  ? pOrderBy->nExp
11ed0 72 20 3a 20 30 29 3b 0a 20 20 20 20 70 4b 65 79  r : 0);.    pKey
11ee0 49 6e 66 6f 20 3d 20 73 71 6c 69 74 65 33 44 62  Info = sqlite3Db
11ef0 4d 61 6c 6c 6f 63 5a 65 72 6f 28 70 50 61 72 73  MallocZero(pPars
11f00 65 2d 3e 64 62 2c 0a 20 20 20 20 20 20 20 20 20  e->db,.         
11f10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 69                si
11f20 7a 65 6f 66 28 2a 70 4b 65 79 49 6e 66 6f 29 2b  zeof(*pKeyInfo)+
11f30 6e 4b 65 79 43 6f 6c 2a 28 73 69 7a 65 6f 66 28  nKeyCol*(sizeof(
11f40 43 6f 6c 6c 53 65 71 2a 29 20 2b 20 31 29 29 3b  CollSeq*) + 1));
11f50 0a 20 20 20 20 69 66 28 20 21 70 4b 65 79 49 6e  .    if( !pKeyIn
11f60 66 6f 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  fo ){.      rc =
11f70 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
11f80 20 20 20 20 20 67 6f 74 6f 20 6d 75 6c 74 69 5f       goto multi_
11f90 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20  select_end;.    
11fa0 7d 0a 0a 20 20 20 20 70 4b 65 79 49 6e 66 6f 2d  }..    pKeyInfo-
11fb0 3e 65 6e 63 20 3d 20 45 4e 43 28 70 50 61 72 73  >enc = ENC(pPars
11fc0 65 2d 3e 64 62 29 3b 0a 20 20 20 20 70 4b 65 79  e->db);.    pKey
11fd0 49 6e 66 6f 2d 3e 6e 46 69 65 6c 64 20 3d 20 6e  Info->nField = n
11fe0 43 6f 6c 3b 0a 0a 20 20 20 20 66 6f 72 28 69 3d  Col;..    for(i=
11ff0 30 2c 20 61 70 43 6f 6c 6c 3d 70 4b 65 79 49 6e  0, apColl=pKeyIn
12000 66 6f 2d 3e 61 43 6f 6c 6c 3b 20 69 3c 6e 43 6f  fo->aColl; i<nCo
12010 6c 3b 20 69 2b 2b 2c 20 61 70 43 6f 6c 6c 2b 2b  l; i++, apColl++
12020 29 7b 0a 20 20 20 20 20 20 2a 61 70 43 6f 6c 6c  ){.      *apColl
12030 20 3d 20 6d 75 6c 74 69 53 65 6c 65 63 74 43 6f   = multiSelectCo
12040 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70 2c  llSeq(pParse, p,
12050 20 69 29 3b 0a 20 20 20 20 20 20 69 66 28 20 30   i);.      if( 0
12060 3d 3d 2a 61 70 43 6f 6c 6c 20 29 7b 0a 20 20 20  ==*apColl ){.   
12070 20 20 20 20 20 2a 61 70 43 6f 6c 6c 20 3d 20 70       *apColl = p
12080 50 61 72 73 65 2d 3e 64 62 2d 3e 70 44 66 6c 74  Parse->db->pDflt
12090 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 7d 0a 20 20  Coll;.      }.  
120a0 20 20 7d 0a 0a 20 20 20 20 66 6f 72 28 70 4c 6f    }..    for(pLo
120b0 6f 70 3d 70 3b 20 70 4c 6f 6f 70 3b 20 70 4c 6f  op=p; pLoop; pLo
120c0 6f 70 3d 70 4c 6f 6f 70 2d 3e 70 50 72 69 6f 72  op=pLoop->pPrior
120d0 29 7b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30  ){.      for(i=0
120e0 3b 20 69 3c 32 3b 20 69 2b 2b 29 7b 0a 20 20 20  ; i<2; i++){.   
120f0 20 20 20 20 20 69 6e 74 20 61 64 64 72 20 3d 20       int addr = 
12100 70 4c 6f 6f 70 2d 3e 61 64 64 72 4f 70 65 6e 45  pLoop->addrOpenE
12110 70 68 6d 5b 69 5d 3b 0a 20 20 20 20 20 20 20 20  phm[i];.        
12120 69 66 28 20 61 64 64 72 3c 30 20 29 7b 0a 20 20  if( addr<0 ){.  
12130 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 5b 30          /* If [0
12140 5d 20 69 73 20 75 6e 75 73 65 64 20 74 68 65 6e  ] is unused then
12150 20 5b 31 5d 20 69 73 20 61 6c 73 6f 20 75 6e 75   [1] is also unu
12160 73 65 64 2e 20 20 53 6f 20 77 65 20 63 61 6e 0a  sed.  So we can.
12170 20 20 20 20 20 20 20 20 20 20 2a 2a 20 61 6c 77            ** alw
12180 61 79 73 20 73 61 66 65 6c 79 20 61 62 6f 72 74  ays safely abort
12190 20 61 73 20 73 6f 6f 6e 20 61 73 20 74 68 65 20   as soon as the 
121a0 66 69 72 73 74 20 75 6e 75 73 65 64 20 73 6c 6f  first unused slo
121b0 74 20 69 73 20 66 6f 75 6e 64 20 2a 2f 0a 20 20  t is found */.  
121c0 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
121d0 70 4c 6f 6f 70 2d 3e 61 64 64 72 4f 70 65 6e 45  pLoop->addrOpenE
121e0 70 68 6d 5b 31 5d 3c 30 20 29 3b 0a 20 20 20 20  phm[1]<0 );.    
121f0 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
12200 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 73       }.        s
12210 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65  qlite3VdbeChange
12220 50 32 28 76 2c 20 61 64 64 72 2c 20 6e 43 6f 6c  P2(v, addr, nCol
12230 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
12240 65 33 56 64 62 65 43 68 61 6e 67 65 50 34 28 76  e3VdbeChangeP4(v
12250 2c 20 61 64 64 72 2c 20 28 63 68 61 72 2a 29 70  , addr, (char*)p
12260 4b 65 79 49 6e 66 6f 2c 20 50 34 5f 4b 45 59 49  KeyInfo, P4_KEYI
12270 4e 46 4f 29 3b 0a 20 20 20 20 20 20 20 20 70 4c  NFO);.        pL
12280 6f 6f 70 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68  oop->addrOpenEph
12290 6d 5b 69 5d 20 3d 20 2d 31 3b 0a 20 20 20 20 20  m[i] = -1;.     
122a0 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66   }.    }..    if
122b0 28 20 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20  ( pOrderBy ){.  
122c0 20 20 20 20 73 74 72 75 63 74 20 45 78 70 72 4c      struct ExprL
122d0 69 73 74 5f 69 74 65 6d 20 2a 70 4f 54 65 72 6d  ist_item *pOTerm
122e0 20 3d 20 70 4f 72 64 65 72 42 79 2d 3e 61 3b 0a   = pOrderBy->a;.
122f0 20 20 20 20 20 20 69 6e 74 20 6e 4f 72 64 65 72        int nOrder
12300 42 79 45 78 70 72 20 3d 20 70 4f 72 64 65 72 42  ByExpr = pOrderB
12310 79 2d 3e 6e 45 78 70 72 3b 0a 20 20 20 20 20 20  y->nExpr;.      
12320 69 6e 74 20 61 64 64 72 3b 0a 20 20 20 20 20 20  int addr;.      
12330 75 38 20 2a 70 53 6f 72 74 4f 72 64 65 72 3b 0a  u8 *pSortOrder;.
12340 0a 20 20 20 20 20 20 2f 2a 20 52 65 75 73 65 20  .      /* Reuse 
12350 74 68 65 20 73 61 6d 65 20 70 4b 65 79 49 6e 66  the same pKeyInf
12360 6f 20 66 6f 72 20 74 68 65 20 4f 52 44 45 52 20  o for the ORDER 
12370 42 59 20 61 73 20 77 61 73 20 75 73 65 64 20 61  BY as was used a
12380 62 6f 76 65 20 66 6f 72 0a 20 20 20 20 20 20 2a  bove for.      *
12390 2a 20 74 68 65 20 63 6f 6d 70 6f 75 6e 64 20 73  * the compound s
123a0 65 6c 65 63 74 20 73 74 61 74 65 6d 65 6e 74 73  elect statements
123b0 2e 20 20 45 78 63 65 70 74 20 77 65 20 68 61 76  .  Except we hav
123c0 65 20 74 6f 20 63 68 61 6e 67 65 20 6f 75 74 20  e to change out 
123d0 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 70 4b 65  the.      ** pKe
123e0 79 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b 5d 20 76  yInfo->aColl[] v
123f0 61 6c 75 65 73 2e 20 20 53 6f 6d 65 20 6f 66 20  alues.  Some of 
12400 74 68 65 20 61 43 6f 6c 6c 5b 5d 20 76 61 6c 75  the aColl[] valu
12410 65 73 20 77 69 6c 6c 20 62 65 0a 20 20 20 20 20  es will be.     
12420 20 2a 2a 20 72 65 75 73 65 64 20 77 68 65 6e 20   ** reused when 
12430 63 6f 6e 73 74 72 75 63 74 69 6e 67 20 74 68 65  constructing the
12440 20 70 4b 65 79 49 6e 66 6f 20 66 6f 72 20 74 68   pKeyInfo for th
12450 65 20 4f 52 44 45 52 20 42 59 2c 20 73 6f 20 6d  e ORDER BY, so m
12460 61 6b 65 0a 20 20 20 20 20 20 2a 2a 20 61 20 63  ake.      ** a c
12470 6f 70 79 2e 20 20 53 75 66 66 69 63 69 65 6e 74  opy.  Sufficient
12480 20 73 70 61 63 65 20 74 6f 20 68 6f 6c 64 20 62   space to hold b
12490 6f 74 68 20 74 68 65 20 6e 43 6f 6c 20 65 6e 74  oth the nCol ent
124a0 72 69 65 73 20 66 6f 72 0a 20 20 20 20 20 20 2a  ries for.      *
124b0 2a 20 74 68 65 20 63 6f 6d 70 6f 75 6e 64 20 73  * the compound s
124c0 65 6c 65 63 74 20 61 6e 64 20 74 68 65 20 6e 4f  elect and the nO
124d0 72 64 65 72 62 79 45 78 70 72 20 65 6e 74 72 69  rderbyExpr entri
124e0 65 73 20 66 6f 72 20 74 68 65 20 4f 52 44 45 52  es for the ORDER
124f0 20 42 59 0a 20 20 20 20 20 20 2a 2a 20 77 61 73   BY.      ** was
12500 20 61 6c 6c 6f 63 61 74 65 64 20 61 62 6f 76 65   allocated above
12510 2e 20 20 42 75 74 20 77 65 20 6e 65 65 64 20 74  .  But we need t
12520 6f 20 6d 6f 76 65 20 74 68 65 20 63 6f 6d 70 6f  o move the compo
12530 75 6e 64 20 73 65 6c 65 63 74 0a 20 20 20 20 20  und select.     
12540 20 2a 2a 20 65 6e 74 72 69 65 73 20 6f 75 74 20   ** entries out 
12550 6f 66 20 74 68 65 20 77 61 79 20 62 65 66 6f 72  of the way befor
12560 65 20 63 6f 6e 73 74 72 75 63 74 69 6e 67 20 74  e constructing t
12570 68 65 20 4f 52 44 45 52 20 42 59 20 65 6e 74 72  he ORDER BY entr
12580 69 65 73 2e 0a 20 20 20 20 20 20 2a 2a 20 4d 6f  ies..      ** Mo
12590 76 65 20 74 68 65 20 63 6f 6d 70 6f 75 6e 64 20  ve the compound 
125a0 73 65 6c 65 63 74 20 65 6e 74 72 69 65 73 20 69  select entries i
125b0 6e 74 6f 20 61 43 6f 70 79 5b 5d 20 77 68 65 72  nto aCopy[] wher
125c0 65 20 74 68 65 79 20 63 61 6e 20 62 65 0a 20 20  e they can be.  
125d0 20 20 20 20 2a 2a 20 61 63 63 65 73 73 65 64 20      ** accessed 
125e0 61 6e 64 20 72 65 75 73 65 64 20 77 68 65 6e 20  and reused when 
125f0 63 6f 6e 73 74 72 75 63 74 69 6e 67 20 74 68 65  constructing the
12600 20 4f 52 44 45 52 20 42 59 20 65 6e 74 72 69 65   ORDER BY entrie
12610 73 2e 0a 20 20 20 20 20 20 2a 2a 20 42 65 63 61  s..      ** Beca
12620 75 73 65 20 6e 43 6f 6c 20 6d 69 67 68 74 20 62  use nCol might b
12630 65 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 6f  e greater than o
12640 72 20 6c 65 73 73 20 74 68 61 6e 20 6e 4f 72 64  r less than nOrd
12650 65 72 42 79 45 78 70 72 0a 20 20 20 20 20 20 2a  erByExpr.      *
12660 2a 20 77 65 20 68 61 76 65 20 74 6f 20 75 73 65  * we have to use
12670 20 6d 65 6d 6d 6f 76 65 28 29 20 77 68 65 6e 20   memmove() when 
12680 64 6f 69 6e 67 20 74 68 65 20 63 6f 70 79 2e 0a  doing the copy..
12690 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 61        */.      a
126a0 43 6f 70 79 20 3d 20 26 70 4b 65 79 49 6e 66 6f  Copy = &pKeyInfo
126b0 2d 3e 61 43 6f 6c 6c 5b 6e 4f 72 64 65 72 42 79  ->aColl[nOrderBy
126c0 45 78 70 72 5d 3b 0a 20 20 20 20 20 20 70 53 6f  Expr];.      pSo
126d0 72 74 4f 72 64 65 72 20 3d 20 70 4b 65 79 49 6e  rtOrder = pKeyIn
126e0 66 6f 2d 3e 61 53 6f 72 74 4f 72 64 65 72 20 3d  fo->aSortOrder =
126f0 20 28 75 38 2a 29 26 61 43 6f 70 79 5b 6e 43 6f   (u8*)&aCopy[nCo
12700 6c 5d 3b 0a 20 20 20 20 20 20 6d 65 6d 6d 6f 76  l];.      memmov
12710 65 28 61 43 6f 70 79 2c 20 70 4b 65 79 49 6e 66  e(aCopy, pKeyInf
12720 6f 2d 3e 61 43 6f 6c 6c 2c 20 6e 43 6f 6c 2a 73  o->aColl, nCol*s
12730 69 7a 65 6f 66 28 43 6f 6c 6c 53 65 71 2a 29 29  izeof(CollSeq*))
12740 3b 0a 0a 20 20 20 20 20 20 61 70 43 6f 6c 6c 20  ;..      apColl 
12750 3d 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 43 6f 6c  = pKeyInfo->aCol
12760 6c 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30  l;.      for(i=0
12770 3b 20 69 3c 6e 4f 72 64 65 72 42 79 45 78 70 72  ; i<nOrderByExpr
12780 3b 20 69 2b 2b 2c 20 70 4f 54 65 72 6d 2b 2b 2c  ; i++, pOTerm++,
12790 20 61 70 43 6f 6c 6c 2b 2b 2c 20 70 53 6f 72 74   apColl++, pSort
127a0 4f 72 64 65 72 2b 2b 29 7b 0a 20 20 20 20 20 20  Order++){.      
127b0 20 20 45 78 70 72 20 2a 70 45 78 70 72 20 3d 20    Expr *pExpr = 
127c0 70 4f 54 65 72 6d 2d 3e 70 45 78 70 72 3b 0a 20  pOTerm->pExpr;. 
127d0 20 20 20 20 20 20 20 69 66 28 20 28 70 45 78 70         if( (pExp
127e0 72 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f 45 78  r->flags & EP_Ex
127f0 70 43 6f 6c 6c 61 74 65 29 20 29 7b 0a 20 20 20  pCollate) ){.   
12800 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
12810 45 78 70 72 2d 3e 70 43 6f 6c 6c 21 3d 30 20 29  Expr->pColl!=0 )
12820 3b 0a 20 20 20 20 20 20 20 20 20 20 2a 61 70 43  ;.          *apC
12830 6f 6c 6c 20 3d 20 70 45 78 70 72 2d 3e 70 43 6f  oll = pExpr->pCo
12840 6c 6c 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  ll;.        }els
12850 65 7b 0a 20 20 20 20 20 20 20 20 20 20 2a 61 70  e{.          *ap
12860 43 6f 6c 6c 20 3d 20 61 43 6f 70 79 5b 70 45 78  Coll = aCopy[pEx
12870 70 72 2d 3e 69 43 6f 6c 75 6d 6e 5d 3b 0a 20 20  pr->iColumn];.  
12880 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
12890 2a 70 53 6f 72 74 4f 72 64 65 72 20 3d 20 70 4f  *pSortOrder = pO
128a0 54 65 72 6d 2d 3e 73 6f 72 74 4f 72 64 65 72 3b  Term->sortOrder;
128b0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 61  .      }.      a
128c0 73 73 65 72 74 28 20 70 2d 3e 70 52 69 67 68 74  ssert( p->pRight
128d0 6d 6f 73 74 3d 3d 70 20 29 3b 0a 20 20 20 20 20  most==p );.     
128e0 20 61 73 73 65 72 74 28 20 70 2d 3e 61 64 64 72   assert( p->addr
128f0 4f 70 65 6e 45 70 68 6d 5b 32 5d 3e 3d 30 20 29  OpenEphm[2]>=0 )
12900 3b 0a 20 20 20 20 20 20 61 64 64 72 20 3d 20 70  ;.      addr = p
12910 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b 32  ->addrOpenEphm[2
12920 5d 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ];.      sqlite3
12930 56 64 62 65 43 68 61 6e 67 65 50 32 28 76 2c 20  VdbeChangeP2(v, 
12940 61 64 64 72 2c 20 70 2d 3e 70 4f 72 64 65 72 42  addr, p->pOrderB
12950 79 2d 3e 6e 45 78 70 72 2b 32 29 3b 0a 20 20 20  y->nExpr+2);.   
12960 20 20 20 70 4b 65 79 49 6e 66 6f 2d 3e 6e 46 69     pKeyInfo->nFi
12970 65 6c 64 20 3d 20 6e 4f 72 64 65 72 42 79 45 78  eld = nOrderByEx
12980 70 72 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  pr;.      sqlite
12990 33 56 64 62 65 43 68 61 6e 67 65 50 34 28 76 2c  3VdbeChangeP4(v,
129a0 20 61 64 64 72 2c 20 28 63 68 61 72 2a 29 70 4b   addr, (char*)pK
129b0 65 79 49 6e 66 6f 2c 20 50 34 5f 4b 45 59 49 4e  eyInfo, P4_KEYIN
129c0 46 4f 5f 48 41 4e 44 4f 46 46 29 3b 0a 20 20 20  FO_HANDOFF);.   
129d0 20 20 20 70 4b 65 79 49 6e 66 6f 20 3d 20 30 3b     pKeyInfo = 0;
129e0 0a 20 20 20 20 20 20 67 65 6e 65 72 61 74 65 53  .      generateS
129f0 6f 72 74 54 61 69 6c 28 70 50 61 72 73 65 2c 20  ortTail(pParse, 
12a00 70 2c 20 76 2c 20 70 2d 3e 70 45 4c 69 73 74 2d  p, v, p->pEList-
12a10 3e 6e 45 78 70 72 2c 20 26 64 65 73 74 29 3b 0a  >nExpr, &dest);.
12a20 20 20 20 20 7d 0a 0a 20 20 20 20 73 71 6c 69 74      }..    sqlit
12a30 65 33 5f 66 72 65 65 28 70 4b 65 79 49 6e 66 6f  e3_free(pKeyInfo
12a40 29 3b 0a 20 20 7d 0a 0a 6d 75 6c 74 69 5f 73 65  );.  }..multi_se
12a50 6c 65 63 74 5f 65 6e 64 3a 0a 20 20 70 44 65 73  lect_end:.  pDes
12a60 74 2d 3e 69 4d 65 6d 20 3d 20 64 65 73 74 2e 69  t->iMem = dest.i
12a70 4d 65 6d 3b 0a 20 20 70 44 65 73 74 2d 3e 6e 4d  Mem;.  pDest->nM
12a80 65 6d 20 3d 20 64 65 73 74 2e 6e 4d 65 6d 3b 0a  em = dest.nMem;.
12a90 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 23    return rc;.}.#
12aa0 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
12ab0 4f 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45  OMIT_COMPOUND_SE
12ac0 4c 45 43 54 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 43  LECT */../*.** C
12ad0 6f 64 65 20 61 6e 20 6f 75 74 70 75 74 20 73 75  ode an output su
12ae0 62 72 6f 75 74 69 6e 65 20 66 6f 72 20 61 20 63  broutine for a c
12af0 6f 72 6f 75 74 69 6e 65 20 69 6d 70 6c 65 6d 65  oroutine impleme
12b00 6e 74 61 74 69 6f 6e 20 6f 66 20 61 0a 2a 2a 20  ntation of a.** 
12b10 53 45 4c 45 43 54 20 73 74 61 74 6d 65 6e 74 2e  SELECT statment.
12b20 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6f  .*/.static int o
12b30 75 74 70 75 74 53 75 62 72 6f 75 74 69 6e 65 28  utputSubroutine(
12b40 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
12b50 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61  ,          /* Pa
12b60 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f  rsing context */
12b70 0a 20 20 53 65 6c 65 63 74 20 2a 70 2c 20 20 20  .  Select *p,   
12b80 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
12b90 65 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  e SELECT stateme
12ba0 6e 74 20 2a 2f 0a 20 20 53 65 6c 65 63 74 44 65  nt */.  SelectDe
12bb0 73 74 20 2a 70 49 6e 2c 20 20 20 20 20 20 20 20  st *pIn,        
12bc0 2f 2a 20 43 6f 72 6f 75 74 69 6e 65 20 73 75 70  /* Coroutine sup
12bd0 70 6c 79 69 6e 67 20 64 61 74 61 20 2a 2f 0a 20  plying data */. 
12be0 20 53 65 6c 65 63 74 44 65 73 74 20 2a 70 44 65   SelectDest *pDe
12bf0 73 74 2c 20 20 20 20 20 20 2f 2a 20 57 68 65 72  st,      /* Wher
12c00 65 20 74 6f 20 73 65 6e 64 20 74 68 65 20 64 61  e to send the da
12c10 74 61 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 52  ta */.  int regR
12c20 65 74 75 72 6e 2c 20 20 20 20 20 20 20 20 20 20  eturn,          
12c30 2f 2a 20 54 68 65 20 72 65 74 75 72 6e 20 61 64  /* The return ad
12c40 64 72 65 73 73 20 72 65 67 69 73 74 65 72 20 2a  dress register *
12c50 2f 0a 20 20 69 6e 74 20 69 42 72 65 61 6b 20 20  /.  int iBreak  
12c60 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4a              /* J
12c70 75 6d 70 20 68 65 72 65 20 69 66 20 77 65 20 68  ump here if we h
12c80 69 74 20 74 68 65 20 4c 49 4d 49 54 20 2a 2f 0a  it the LIMIT */.
12c90 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70  ){.  Vdbe *v = p
12ca0 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20  Parse->pVdbe;.  
12cb0 69 6e 74 20 69 43 6f 6e 74 69 6e 75 65 3b 0a 20  int iContinue;. 
12cc0 20 69 6e 74 20 61 64 64 72 3b 0a 20 20 69 66 28   int addr;.  if(
12cd0 20 76 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30   v==0 ) return 0
12ce0 3b 0a 0a 20 20 61 64 64 72 20 3d 20 73 71 6c 69  ;..  addr = sqli
12cf0 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64  te3VdbeCurrentAd
12d00 64 72 28 76 29 3b 0a 20 20 69 43 6f 6e 74 69 6e  dr(v);.  iContin
12d10 75 65 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  ue = sqlite3Vdbe
12d20 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20  MakeLabel(v);.  
12d30 63 6f 64 65 4f 66 66 73 65 74 28 76 2c 20 70 2c  codeOffset(v, p,
12d40 20 69 43 6f 6e 74 69 6e 75 65 29 3b 0a 0a 20 20   iContinue);..  
12d50 73 77 69 74 63 68 28 20 70 44 65 73 74 2d 3e 65  switch( pDest->e
12d60 44 65 73 74 20 29 7b 0a 20 20 20 20 2f 2a 20 53  Dest ){.    /* S
12d70 74 6f 72 65 20 74 68 65 20 72 65 73 75 6c 74 20  tore the result 
12d80 61 73 20 64 61 74 61 20 75 73 69 6e 67 20 61 20  as data using a 
12d90 75 6e 69 71 75 65 20 6b 65 79 2e 0a 20 20 20 20  unique key..    
12da0 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f  */.    case SRT_
12db0 54 61 62 6c 65 3a 0a 20 20 20 20 63 61 73 65 20  Table:.    case 
12dc0 53 52 54 5f 45 70 68 65 6d 54 61 62 3a 20 7b 0a  SRT_EphemTab: {.
12dd0 20 20 20 20 20 20 69 6e 74 20 72 31 20 3d 20 73        int r1 = s
12de0 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65 67  qlite3GetTempReg
12df0 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20  (pParse);.      
12e00 69 6e 74 20 72 32 20 3d 20 73 71 6c 69 74 65 33  int r2 = sqlite3
12e10 47 65 74 54 65 6d 70 52 65 67 28 70 50 61 72 73  GetTempReg(pPars
12e20 65 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  e);.      sqlite
12e30 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
12e40 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20 70 49  P_MakeRecord, pI
12e50 6e 2d 3e 69 4d 65 6d 2c 20 70 49 6e 2d 3e 6e 4d  n->iMem, pIn->nM
12e60 65 6d 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 73  em, r1);.      s
12e70 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
12e80 28 76 2c 20 4f 50 5f 4e 65 77 52 6f 77 69 64 2c  (v, OP_NewRowid,
12e90 20 70 44 65 73 74 2d 3e 69 50 61 72 6d 2c 20 72   pDest->iParm, r
12ea0 32 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  2);.      sqlite
12eb0 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
12ec0 50 5f 49 6e 73 65 72 74 2c 20 70 44 65 73 74 2d  P_Insert, pDest-
12ed0 3e 69 50 61 72 6d 2c 20 72 31 2c 20 72 32 29 3b  >iParm, r1, r2);
12ee0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
12ef0 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20 4f 50  beChangeP5(v, OP
12f00 46 4c 41 47 5f 41 50 50 45 4e 44 29 3b 0a 20 20  FLAG_APPEND);.  
12f10 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61      sqlite3Relea
12f20 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65  seTempReg(pParse
12f30 2c 20 72 32 29 3b 0a 20 20 20 20 20 20 73 71 6c  , r2);.      sql
12f40 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52  ite3ReleaseTempR
12f50 65 67 28 70 50 61 72 73 65 2c 20 72 31 29 3b 0a  eg(pParse, r1);.
12f60 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
12f70 20 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49   }..#ifndef SQLI
12f80 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59  TE_OMIT_SUBQUERY
12f90 0a 20 20 20 20 2f 2a 20 49 66 20 77 65 20 61 72  .    /* If we ar
12fa0 65 20 63 72 65 61 74 69 6e 67 20 61 20 73 65 74  e creating a set
12fb0 20 66 6f 72 20 61 6e 20 22 65 78 70 72 20 49 4e   for an "expr IN
12fc0 20 28 53 45 4c 45 43 54 20 2e 2e 2e 29 22 20 63   (SELECT ...)" c
12fd0 6f 6e 73 74 72 75 63 74 2c 0a 20 20 20 20 2a 2a  onstruct,.    **
12fe0 20 74 68 65 6e 20 74 68 65 72 65 20 73 68 6f 75   then there shou
12ff0 6c 64 20 62 65 20 61 20 73 69 6e 67 6c 65 20 69  ld be a single i
13000 74 65 6d 20 6f 6e 20 74 68 65 20 73 74 61 63 6b  tem on the stack
13010 2e 20 20 57 72 69 74 65 20 74 68 69 73 0a 20 20  .  Write this.  
13020 20 20 2a 2a 20 69 74 65 6d 20 69 6e 74 6f 20 74    ** item into t
13030 68 65 20 73 65 74 20 74 61 62 6c 65 20 77 69 74  he set table wit
13040 68 20 62 6f 67 75 73 20 64 61 74 61 2e 0a 20 20  h bogus data..  
13050 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 52    */.    case SR
13060 54 5f 53 65 74 3a 20 7b 0a 20 20 20 20 20 20 69  T_Set: {.      i
13070 6e 74 20 61 64 64 72 32 2c 20 72 31 3b 0a 20 20  nt addr2, r1;.  
13080 20 20 20 20 61 73 73 65 72 74 28 20 70 49 6e 2d      assert( pIn-
13090 3e 6e 4d 65 6d 3d 3d 31 20 29 3b 0a 20 20 20 20  >nMem==1 );.    
130a0 20 20 61 64 64 72 32 20 3d 20 73 71 6c 69 74 65    addr2 = sqlite
130b0 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f  3VdbeAddOp1(v, O
130c0 50 5f 49 73 4e 75 6c 6c 2c 20 70 49 6e 2d 3e 69  P_IsNull, pIn->i
130d0 4d 65 6d 29 3b 0a 20 20 20 20 20 20 70 2d 3e 61  Mem);.      p->a
130e0 66 66 69 6e 69 74 79 20 3d 20 0a 20 20 20 20 20  ffinity = .     
130f0 20 20 20 20 73 71 6c 69 74 65 33 43 6f 6d 70 61      sqlite3Compa
13100 72 65 41 66 66 69 6e 69 74 79 28 70 2d 3e 70 45  reAffinity(p->pE
13110 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72  List->a[0].pExpr
13120 2c 20 70 44 65 73 74 2d 3e 61 66 66 69 6e 69 74  , pDest->affinit
13130 79 29 3b 0a 20 20 20 20 20 20 72 31 20 3d 20 73  y);.      r1 = s
13140 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65 67  qlite3GetTempReg
13150 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20  (pParse);.      
13160 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
13170 34 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f  4(v, OP_MakeReco
13180 72 64 2c 20 70 49 6e 2d 3e 69 4d 65 6d 2c 20 31  rd, pIn->iMem, 1
13190 2c 20 72 31 2c 20 26 70 2d 3e 61 66 66 69 6e 69  , r1, &p->affini
131a0 74 79 2c 20 31 29 3b 0a 20 20 20 20 20 20 73 71  ty, 1);.      sq
131b0 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 41 66  lite3ExprCacheAf
131c0 66 69 6e 69 74 79 43 68 61 6e 67 65 28 70 50 61  finityChange(pPa
131d0 72 73 65 2c 20 70 49 6e 2d 3e 69 4d 65 6d 2c 20  rse, pIn->iMem, 
131e0 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  1);.      sqlite
131f0 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
13200 50 5f 49 64 78 49 6e 73 65 72 74 2c 20 70 44 65  P_IdxInsert, pDe
13210 73 74 2d 3e 69 50 61 72 6d 2c 20 72 31 29 3b 0a  st->iParm, r1);.
13220 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c        sqlite3Rel
13230 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72  easeTempReg(pPar
13240 73 65 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 73  se, r1);.      s
13250 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65  qlite3VdbeJumpHe
13260 72 65 28 76 2c 20 61 64 64 72 32 29 3b 0a 20 20  re(v, addr2);.  
13270 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
13280 0a 0a 20 20 20 20 2f 2a 20 49 66 20 61 6e 79 20  ..    /* If any 
13290 72 6f 77 20 65 78 69 73 74 20 69 6e 20 74 68 65  row exist in the
132a0 20 72 65 73 75 6c 74 20 73 65 74 2c 20 72 65 63   result set, rec
132b0 6f 72 64 20 74 68 61 74 20 66 61 63 74 20 61 6e  ord that fact an
132c0 64 20 61 62 6f 72 74 2e 0a 20 20 20 20 2a 2f 0a  d abort..    */.
132d0 20 20 20 20 63 61 73 65 20 53 52 54 5f 45 78 69      case SRT_Exi
132e0 73 74 73 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c  sts: {.      sql
132f0 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
13300 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 31 2c  , OP_Integer, 1,
13310 20 70 44 65 73 74 2d 3e 69 50 61 72 6d 29 3b 0a   pDest->iParm);.
13320 20 20 20 20 20 20 2f 2a 20 54 68 65 20 4c 49 4d        /* The LIM
13330 49 54 20 63 6c 61 75 73 65 20 77 69 6c 6c 20 74  IT clause will t
13340 65 72 6d 69 6e 61 74 65 20 74 68 65 20 6c 6f 6f  erminate the loo
13350 70 20 66 6f 72 20 75 73 20 2a 2f 0a 20 20 20 20  p for us */.    
13360 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a    break;.    }..
13370 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69      /* If this i
13380 73 20 61 20 73 63 61 6c 61 72 20 73 65 6c 65 63  s a scalar selec
13390 74 20 74 68 61 74 20 69 73 20 70 61 72 74 20 6f  t that is part o
133a0 66 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 2c  f an expression,
133b0 20 74 68 65 6e 0a 20 20 20 20 2a 2a 20 73 74 6f   then.    ** sto
133c0 72 65 20 74 68 65 20 72 65 73 75 6c 74 73 20 69  re the results i
133d0 6e 20 74 68 65 20 61 70 70 72 6f 70 72 69 61 74  n the appropriat
133e0 65 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 20 61 6e  e memory cell an
133f0 64 20 62 72 65 61 6b 20 6f 75 74 0a 20 20 20 20  d break out.    
13400 2a 2a 20 6f 66 20 74 68 65 20 73 63 61 6e 20 6c  ** of the scan l
13410 6f 6f 70 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  oop..    */.    
13420 63 61 73 65 20 53 52 54 5f 4d 65 6d 3a 20 7b 0a  case SRT_Mem: {.
13430 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 49        assert( pI
13440 6e 2d 3e 6e 4d 65 6d 3d 3d 31 20 29 3b 0a 20 20  n->nMem==1 );.  
13450 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
13460 6f 64 65 4d 6f 76 65 28 70 50 61 72 73 65 2c 20  odeMove(pParse, 
13470 70 49 6e 2d 3e 69 4d 65 6d 2c 20 70 44 65 73 74  pIn->iMem, pDest
13480 2d 3e 69 50 61 72 6d 2c 20 31 29 3b 0a 20 20 20  ->iParm, 1);.   
13490 20 20 20 2f 2a 20 54 68 65 20 4c 49 4d 49 54 20     /* The LIMIT 
134a0 63 6c 61 75 73 65 20 77 69 6c 6c 20 6a 75 6d 70  clause will jump
134b0 20 6f 75 74 20 6f 66 20 74 68 65 20 6c 6f 6f 70   out of the loop
134c0 20 66 6f 72 20 75 73 20 2a 2f 0a 20 20 20 20 20   for us */.     
134d0 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65   break;.    }.#e
134e0 6e 64 69 66 20 2f 2a 20 23 69 66 6e 64 65 66 20  ndif /* #ifndef 
134f0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51  SQLITE_OMIT_SUBQ
13500 55 45 52 59 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20  UERY */..    /* 
13510 53 65 6e 64 20 74 68 65 20 64 61 74 61 20 74 6f  Send the data to
13520 20 74 68 65 20 63 61 6c 6c 62 61 63 6b 20 66 75   the callback fu
13530 6e 63 74 69 6f 6e 20 6f 72 20 74 6f 20 61 20 73  nction or to a s
13540 75 62 72 6f 75 74 69 6e 65 2e 20 20 49 6e 20 74  ubroutine.  In t
13550 68 65 0a 20 20 20 20 2a 2a 20 63 61 73 65 20 6f  he.    ** case o
13560 66 20 61 20 73 75 62 72 6f 75 74 69 6e 65 2c 20  f a subroutine, 
13570 74 68 65 20 73 75 62 72 6f 75 74 69 6e 65 20 69  the subroutine i
13580 74 73 65 6c 66 20 69 73 20 72 65 73 70 6f 6e 73  tself is respons
13590 69 62 6c 65 20 66 6f 72 0a 20 20 20 20 2a 2a 20  ible for.    ** 
135a0 70 6f 70 70 69 6e 67 20 74 68 65 20 64 61 74 61  popping the data
135b0 20 66 72 6f 6d 20 74 68 65 20 73 74 61 63 6b 2e   from the stack.
135c0 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65  .    */.    case
135d0 20 53 52 54 5f 43 6f 72 6f 75 74 69 6e 65 3a 20   SRT_Coroutine: 
135e0 7b 0a 20 20 20 20 20 20 69 66 28 20 70 44 65 73  {.      if( pDes
135f0 74 2d 3e 69 4d 65 6d 3d 3d 30 20 29 7b 0a 20 20  t->iMem==0 ){.  
13600 20 20 20 20 20 20 70 44 65 73 74 2d 3e 69 4d 65        pDest->iMe
13610 6d 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65  m = sqlite3GetTe
13620 6d 70 52 61 6e 67 65 28 70 50 61 72 73 65 2c 20  mpRange(pParse, 
13630 70 49 6e 2d 3e 6e 4d 65 6d 29 3b 0a 20 20 20 20  pIn->nMem);.    
13640 20 20 20 20 70 44 65 73 74 2d 3e 6e 4d 65 6d 20      pDest->nMem 
13650 3d 20 70 49 6e 2d 3e 6e 4d 65 6d 3b 0a 20 20 20  = pIn->nMem;.   
13660 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74     }.      sqlit
13670 65 33 45 78 70 72 43 6f 64 65 4d 6f 76 65 28 70  e3ExprCodeMove(p
13680 50 61 72 73 65 2c 20 70 49 6e 2d 3e 69 4d 65 6d  Parse, pIn->iMem
13690 2c 20 70 44 65 73 74 2d 3e 69 4d 65 6d 2c 20 70  , pDest->iMem, p
136a0 44 65 73 74 2d 3e 6e 4d 65 6d 29 3b 0a 20 20 20  Dest->nMem);.   
136b0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
136c0 64 4f 70 31 28 76 2c 20 4f 50 5f 59 69 65 6c 64  dOp1(v, OP_Yield
136d0 2c 20 70 44 65 73 74 2d 3e 69 50 61 72 6d 29 3b  , pDest->iParm);
136e0 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
136f0 20 20 7d 0a 0a 20 20 20 20 63 61 73 65 20 53 52    }..    case SR
13700 54 5f 43 61 6c 6c 62 61 63 6b 3a 20 7b 0a 20 20  T_Callback: {.  
13710 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
13720 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52 65 73 75  ddOp2(v, OP_Resu
13730 6c 74 52 6f 77 2c 20 70 49 6e 2d 3e 69 4d 65 6d  ltRow, pIn->iMem
13740 2c 20 70 49 6e 2d 3e 6e 4d 65 6d 29 3b 0a 20 20  , pIn->nMem);.  
13750 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
13760 61 63 68 65 41 66 66 69 6e 69 74 79 43 68 61 6e  acheAffinityChan
13770 67 65 28 70 50 61 72 73 65 2c 20 70 49 6e 2d 3e  ge(pParse, pIn->
13780 69 4d 65 6d 2c 20 70 49 6e 2d 3e 6e 4d 65 6d 29  iMem, pIn->nMem)
13790 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
137a0 20 20 20 7d 0a 0a 23 69 66 20 21 64 65 66 69 6e     }..#if !defin
137b0 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54  ed(SQLITE_OMIT_T
137c0 52 49 47 47 45 52 29 0a 20 20 20 20 2f 2a 20 44  RIGGER).    /* D
137d0 69 73 63 61 72 64 20 74 68 65 20 72 65 73 75 6c  iscard the resul
137e0 74 73 2e 20 20 54 68 69 73 20 69 73 20 75 73 65  ts.  This is use
137f0 64 20 66 6f 72 20 53 45 4c 45 43 54 20 73 74 61  d for SELECT sta
13800 74 65 6d 65 6e 74 73 20 69 6e 73 69 64 65 0a 20  tements inside. 
13810 20 20 20 2a 2a 20 74 68 65 20 62 6f 64 79 20 6f     ** the body o
13820 66 20 61 20 54 52 49 47 47 45 52 2e 20 20 54 68  f a TRIGGER.  Th
13830 65 20 70 75 72 70 6f 73 65 20 6f 66 20 73 75 63  e purpose of suc
13840 68 20 73 65 6c 65 63 74 73 20 69 73 20 74 6f 20  h selects is to 
13850 63 61 6c 6c 0a 20 20 20 20 2a 2a 20 75 73 65 72  call.    ** user
13860 2d 64 65 66 69 6e 65 64 20 66 75 6e 63 74 69 6f  -defined functio
13870 6e 73 20 74 68 61 74 20 68 61 76 65 20 73 69 64  ns that have sid
13880 65 20 65 66 66 65 63 74 73 2e 20 20 57 65 20 64  e effects.  We d
13890 6f 20 6e 6f 74 20 63 61 72 65 0a 20 20 20 20 2a  o not care.    *
138a0 2a 20 61 62 6f 75 74 20 74 68 65 20 61 63 74 75  * about the actu
138b0 61 6c 20 72 65 73 75 6c 74 73 20 6f 66 20 74 68  al results of th
138c0 65 20 73 65 6c 65 63 74 2e 0a 20 20 20 20 2a 2f  e select..    */
138d0 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a  .    default: {.
138e0 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
138f0 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 0a 20   }.#endif.  }.. 
13900 20 2f 2a 20 4a 75 6d 70 20 74 6f 20 74 68 65 20   /* Jump to the 
13910 65 6e 64 20 6f 66 20 74 68 65 20 6c 6f 6f 70 20  end of the loop 
13920 69 66 20 74 68 65 20 4c 49 4d 49 54 20 69 73 20  if the LIMIT is 
13930 72 65 61 63 68 65 64 2e 0a 20 20 2a 2f 0a 20 20  reached..  */.  
13940 69 66 28 20 70 2d 3e 69 4c 69 6d 69 74 20 29 7b  if( p->iLimit ){
13950 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
13960 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 41 64 64  AddOp2(v, OP_Add
13970 49 6d 6d 2c 20 70 2d 3e 69 4c 69 6d 69 74 2c 20  Imm, p->iLimit, 
13980 2d 31 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  -1);.    sqlite3
13990 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
139a0 5f 49 66 5a 65 72 6f 2c 20 70 2d 3e 69 4c 69 6d  _IfZero, p->iLim
139b0 69 74 2c 20 69 42 72 65 61 6b 29 3b 0a 20 20 7d  it, iBreak);.  }
139c0 0a 0a 20 20 2f 2a 20 41 64 76 61 6e 63 65 20 74  ..  /* Advance t
139d0 68 65 20 63 6f 72 6f 75 74 69 6e 65 20 74 6f 20  he coroutine to 
139e0 69 74 73 20 6e 65 78 74 20 76 61 6c 75 65 2e 0a  its next value..
139f0 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 56 64    */.  sqlite3Vd
13a00 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76  beResolveLabel(v
13a10 2c 20 69 43 6f 6e 74 69 6e 75 65 29 3b 0a 20 20  , iContinue);.  
13a20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
13a30 31 28 76 2c 20 4f 50 5f 59 69 65 6c 64 2c 20 70  1(v, OP_Yield, p
13a40 49 6e 2d 3e 69 50 61 72 6d 29 3b 0a 0a 20 20 2f  In->iParm);..  /
13a50 2a 20 47 65 6e 65 72 61 74 65 20 74 68 65 20 73  * Generate the s
13a60 75 62 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e  ubroutine return
13a70 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 56  .  */.  sqlite3V
13a80 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f  dbeAddOp1(v, OP_
13a90 52 65 74 75 72 6e 2c 20 72 65 67 52 65 74 75 72  Return, regRetur
13aa0 6e 29 3b 0a 0a 20 20 72 65 74 75 72 6e 20 61 64  n);..  return ad
13ab0 64 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c 74  dr;.}../*.** Alt
13ac0 65 72 6e 61 74 69 76 65 20 63 6f 6d 70 6f 75 6e  ernative compoun
13ad0 64 20 73 65 6c 65 63 74 20 63 6f 64 65 20 67 65  d select code ge
13ae0 6e 65 72 61 74 6f 72 20 66 6f 72 20 63 61 73 65  nerator for case
13af0 73 20 77 68 65 6e 20 74 68 65 72 65 0a 2a 2a 20  s when there.** 
13b00 69 73 20 61 6e 20 4f 52 44 45 52 20 42 59 20 63  is an ORDER BY c
13b10 6c 61 75 73 65 2e 0a 2a 2a 0a 2a 2a 20 57 65 20  lause..**.** We 
13b20 61 73 73 75 6d 65 20 61 20 71 75 65 72 79 20 6f  assume a query o
13b30 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  f the following 
13b40 66 6f 72 6d 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20  form:.**.**     
13b50 20 3c 73 65 6c 65 63 74 41 3e 20 20 3c 6f 70 65   <selectA>  <ope
13b60 72 61 74 6f 72 3e 20 20 3c 73 65 6c 65 63 74 42  rator>  <selectB
13b70 3e 20 20 4f 52 44 45 52 20 42 59 20 3c 6f 72 64  >  ORDER BY <ord
13b80 65 72 62 79 6c 69 73 74 3e 0a 2a 2a 0a 2a 2a 20  erbylist>.**.** 
13b90 3c 6f 70 65 72 61 74 6f 72 3e 20 69 73 20 6f 6e  <operator> is on
13ba0 65 20 6f 66 20 55 4e 49 4f 4e 20 41 4c 4c 2c 20  e of UNION ALL, 
13bb0 55 4e 49 4f 4e 2c 20 45 58 43 45 50 54 2c 20 6f  UNION, EXCEPT, o
13bc0 72 20 49 4e 54 45 52 53 45 43 54 2e 20 20 54 68  r INTERSECT.  Th
13bd0 65 20 69 64 65 61 0a 2a 2a 20 69 73 20 74 6f 20  e idea.** is to 
13be0 63 6f 64 65 20 62 6f 74 68 20 3c 73 65 6c 65 63  code both <selec
13bf0 74 41 3e 20 61 6e 64 20 3c 73 65 6c 65 63 74 42  tA> and <selectB
13c00 3e 20 77 69 74 68 20 74 68 65 20 4f 52 44 45 52  > with the ORDER
13c10 20 42 59 20 63 6c 61 75 73 65 20 61 73 0a 2a 2a   BY clause as.**
13c20 20 63 6f 2d 72 6f 75 74 69 6e 65 73 2e 20 20 54   co-routines.  T
13c30 68 65 6e 20 72 75 6e 20 74 68 65 20 63 6f 2d 72  hen run the co-r
13c40 6f 75 74 69 6e 65 73 20 69 6e 20 70 61 72 61 6c  outines in paral
13c50 6c 65 6c 20 61 6e 64 20 6d 65 72 67 65 20 74 68  lel and merge th
13c60 65 20 72 65 73 75 6c 74 73 0a 2a 2a 20 69 6e 74  e results.** int
13c70 6f 20 74 68 65 20 6f 75 74 70 75 74 2e 20 20 49  o the output.  I
13c80 6e 20 61 64 64 69 74 69 6f 6e 20 74 6f 20 74 68  n addition to th
13c90 65 20 74 77 6f 20 63 6f 72 6f 75 74 69 6e 65 73  e two coroutines
13ca0 20 28 63 61 6c 6c 65 64 20 73 65 6c 65 63 74 41   (called selectA
13cb0 20 61 6e 64 0a 2a 2a 20 73 65 6c 65 63 74 42 29   and.** selectB)
13cc0 20 74 68 65 72 65 20 61 72 65 20 37 20 73 75 62   there are 7 sub
13cd0 72 6f 75 74 69 6e 65 73 3a 0a 2a 2a 0a 2a 2a 20  routines:.**.** 
13ce0 20 20 20 6f 75 74 41 3a 20 20 20 20 4d 6f 76 65     outA:    Move
13cf0 20 74 68 65 20 6f 75 74 70 75 74 20 6f 66 20 74   the output of t
13d00 68 65 20 73 65 6c 65 63 74 41 20 63 6f 72 6f 75  he selectA corou
13d10 74 69 6e 65 20 69 6e 74 6f 20 74 68 65 20 6f 75  tine into the ou
13d20 74 70 75 74 0a 2a 2a 20 20 20 20 20 20 20 20 20  tput.**         
13d30 20 20 20 20 6f 66 20 74 68 65 20 63 6f 6d 70 6f      of the compo
13d40 75 6e 64 20 71 75 65 72 79 2e 0a 2a 2a 0a 2a 2a  und query..**.**
13d50 20 20 20 20 6f 75 74 42 3a 20 20 20 20 4d 6f 76      outB:    Mov
13d60 65 20 74 68 65 20 6f 75 74 70 75 74 20 6f 66 20  e the output of 
13d70 74 68 65 20 73 65 6c 65 63 74 42 20 63 6f 72 6f  the selectB coro
13d80 75 74 69 6e 65 20 69 6e 74 6f 20 74 68 65 20 6f  utine into the o
13d90 75 74 70 75 74 0a 2a 2a 20 20 20 20 20 20 20 20  utput.**        
13da0 20 20 20 20 20 6f 66 20 74 68 65 20 63 6f 6d 70       of the comp
13db0 6f 75 6e 64 20 71 75 65 72 79 2e 20 20 28 4f 6e  ound query.  (On
13dc0 6c 79 20 67 65 6e 65 72 61 74 65 64 20 66 6f 72  ly generated for
13dd0 20 55 4e 49 4f 4e 20 61 6e 64 0a 2a 2a 20 20 20   UNION and.**   
13de0 20 20 20 20 20 20 20 20 20 20 55 4e 49 4f 4e 20            UNION 
13df0 41 4c 4c 2e 20 20 45 58 43 45 50 54 20 61 6e 64  ALL.  EXCEPT and
13e00 20 49 4e 53 45 52 54 53 45 43 54 20 6e 65 76 65   INSERTSECT neve
13e10 72 20 6f 75 74 70 75 74 20 61 20 72 6f 77 20 74  r output a row t
13e20 68 61 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  hat.**          
13e30 20 20 20 61 70 70 65 61 72 73 20 6f 6e 6c 79 20     appears only 
13e40 69 6e 20 42 2e 29 0a 2a 2a 0a 2a 2a 20 20 20 20  in B.).**.**    
13e50 41 6c 74 42 3a 20 20 20 20 43 61 6c 6c 65 64 20  AltB:    Called 
13e60 77 68 65 6e 20 74 68 65 72 65 20 69 73 20 64 61  when there is da
13e70 74 61 20 66 72 6f 6d 20 62 6f 74 68 20 63 6f 72  ta from both cor
13e80 6f 75 74 69 6e 65 73 20 61 6e 64 20 41 3c 42 2e  outines and A<B.
13e90 0a 2a 2a 0a 2a 2a 20 20 20 20 41 65 71 42 3a 20  .**.**    AeqB: 
13ea0 20 20 20 43 61 6c 6c 65 64 20 77 68 65 6e 20 74     Called when t
13eb0 68 65 72 65 20 69 73 20 64 61 74 61 20 66 72 6f  here is data fro
13ec0 6d 20 62 6f 74 68 20 63 6f 72 6f 75 74 69 6e 65  m both coroutine
13ed0 73 20 61 6e 64 20 41 3d 3d 42 2e 0a 2a 2a 0a 2a  s and A==B..**.*
13ee0 2a 20 20 20 20 41 67 74 42 3a 20 20 20 20 43 61  *    AgtB:    Ca
13ef0 6c 6c 65 64 20 77 68 65 6e 20 74 68 65 72 65 20  lled when there 
13f00 69 73 20 64 61 74 61 20 66 72 6f 6d 20 62 6f 74  is data from bot
13f10 68 20 63 6f 72 6f 75 74 69 6e 65 73 20 61 6e 64  h coroutines and
13f20 20 41 3e 42 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 45   A>B..**.**    E
13f30 6f 66 41 3a 20 20 20 20 43 61 6c 6c 65 64 20 77  ofA:    Called w
13f40 68 65 6e 20 64 61 74 61 20 69 73 20 65 78 68 61  hen data is exha
13f50 75 73 74 65 64 20 66 72 6f 6d 20 73 65 6c 65 63  usted from selec
13f60 74 41 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 45 6f 66  tA..**.**    Eof
13f70 42 3a 20 20 20 20 43 61 6c 6c 65 64 20 77 68 65  B:    Called whe
13f80 6e 20 64 61 74 61 20 69 73 20 65 78 68 61 75 73  n data is exhaus
13f90 74 65 64 20 66 72 6f 6d 20 73 65 6c 65 63 74 42  ted from selectB
13fa0 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 69 6d 70 6c  ..**.** The impl
13fb0 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68  ementation of th
13fc0 65 20 6c 61 74 74 65 72 20 66 69 76 65 20 73 75  e latter five su
13fd0 62 72 6f 75 74 69 6e 65 73 20 64 65 70 65 6e 64  broutines depend
13fe0 20 6f 6e 20 77 68 69 63 68 20 0a 2a 2a 20 3c 6f   on which .** <o
13ff0 70 65 72 61 74 6f 72 3e 20 69 73 20 75 73 65 64  perator> is used
14000 3a 0a 2a 2a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20  :.**.**.**      
14010 20 20 20 20 20 20 20 55 4e 49 4f 4e 20 41 4c 4c         UNION ALL
14020 20 20 20 20 20 20 20 20 20 55 4e 49 4f 4e 20 20           UNION  
14030 20 20 20 20 20 20 20 20 20 20 45 58 43 45 50 54            EXCEPT
14040 20 20 20 20 20 20 20 20 20 20 49 4e 54 45 52 53            INTERS
14050 45 43 54 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  ECT.**          
14060 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 20 20 2d  -------------  -
14070 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
14080 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d    --------------
14090 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d    --------------
140a0 2d 2d 2d 0a 2a 2a 20 20 20 41 6c 74 42 3a 20 20  ---.**   AltB:  
140b0 20 6f 75 74 41 2c 20 6e 65 78 74 41 20 20 20 20   outA, nextA    
140c0 20 20 6f 75 74 41 2c 20 6e 65 78 74 41 20 20 20    outA, nextA   
140d0 20 20 20 20 6f 75 74 41 2c 20 6e 65 78 74 41 20      outA, nextA 
140e0 20 20 20 20 20 20 20 6e 65 78 74 41 0a 2a 2a 0a         nextA.**.
140f0 2a 2a 20 20 20 41 65 71 42 3a 20 20 20 6f 75 74  **   AeqB:   out
14100 41 2c 20 6e 65 78 74 41 20 20 20 20 20 20 20 20  A, nextA        
14110 20 6e 65 78 74 41 20 20 20 20 20 20 20 20 20 20   nextA          
14120 20 20 20 6e 65 78 74 41 20 20 20 20 20 20 20 20     nextA        
14130 20 20 20 6f 75 74 41 0a 2a 2a 20 20 20 20 20 20     outA.**      
14140 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14150 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14160 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14170 20 20 20 20 20 20 6e 65 78 74 41 20 77 68 69 6c        nextA whil
14180 65 20 41 3d 3d 42 0a 2a 2a 0a 2a 2a 20 20 20 41  e A==B.**.**   A
14190 67 74 42 3a 20 20 20 6f 75 74 42 2c 20 6e 65 78  gtB:   outB, nex
141a0 74 42 20 20 20 20 20 20 6f 75 74 42 2c 20 6e 65  tB      outB, ne
141b0 78 74 42 20 20 20 20 20 20 20 20 20 20 6e 65 78  xtB          nex
141c0 74 42 20 20 20 20 20 20 20 20 20 20 20 6e 65 78  tB           nex
141d0 74 42 0a 2a 2a 0a 2a 2a 20 20 20 45 6f 66 41 3a  tB.**.**   EofA:
141e0 20 20 20 6f 75 74 42 2c 20 6e 65 78 74 42 20 20     outB, nextB  
141f0 20 20 20 20 41 3c 2d 42 2c 20 6f 75 74 42 2c 20      A<-B, outB, 
14200 20 20 20 20 20 20 20 20 20 68 61 6c 74 20 20 20           halt   
14210 20 20 20 20 20 20 20 20 20 68 61 6c 74 0a 2a 2a           halt.**
14220 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14230 20 20 20 20 20 20 20 20 20 20 6e 65 78 74 42 20            nextB 
14240 77 68 69 6c 65 20 41 3d 3d 42 0a 2a 2a 0a 2a 2a  while A==B.**.**
14250 20 20 20 45 6f 66 42 3a 20 20 20 6f 75 74 41 2c     EofB:   outA,
14260 20 6e 65 78 74 41 20 20 20 20 20 20 42 3c 2d 41   nextA      B<-A
14270 2c 20 6f 75 74 41 20 20 20 20 20 20 20 20 6f 75  , outA        ou
14280 74 41 2c 20 6e 65 78 74 41 20 20 20 20 20 20 20  tA, nextA       
14290 20 68 61 6c 74 0a 2a 2a 20 20 20 20 20 20 20 20   halt.**        
142a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
142b0 20 20 6e 65 78 74 41 20 77 68 69 6c 65 20 41 3d    nextA while A=
142c0 3d 42 0a 2a 2a 0a 2a 2a 20 54 68 65 20 69 6d 70  =B.**.** The imp
142d0 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 70 6c 61 6e  lementation plan
142e0 20 69 73 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74   is to implement
142f0 20 74 68 65 20 74 77 6f 20 63 6f 72 6f 75 74 69   the two corouti
14300 6e 65 73 20 61 6e 64 20 73 65 76 65 6e 0a 2a 2a  nes and seven.**
14310 20 73 75 62 72 6f 75 74 69 6e 65 73 20 66 69 72   subroutines fir
14320 73 74 2c 20 74 68 65 6e 20 70 75 74 20 74 68 65  st, then put the
14330 20 63 6f 6e 74 72 6f 6c 20 6c 6f 67 69 63 20 61   control logic a
14340 74 20 74 68 65 20 62 6f 74 74 6f 6d 2e 20 20 4c  t the bottom.  L
14350 69 6b 65 20 74 68 69 73 3a 0a 2a 2a 0a 2a 2a 20  ike this:.**.** 
14360 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 49 6e           goto In
14370 69 74 0a 2a 2a 20 20 20 20 20 63 6f 41 3a 20 63  it.**     coA: c
14380 6f 72 6f 75 74 69 6e 65 20 66 6f 72 20 6c 65 66  oroutine for lef
14390 74 20 71 75 65 72 79 20 28 41 29 0a 2a 2a 20 20  t query (A).**  
143a0 20 20 20 63 6f 42 3a 20 63 6f 72 6f 75 74 69 6e     coB: coroutin
143b0 65 20 66 6f 72 20 72 69 67 68 74 20 71 75 65 72  e for right quer
143c0 79 20 28 42 29 0a 2a 2a 20 20 20 20 6f 75 74 41  y (B).**    outA
143d0 3a 20 6f 75 74 70 75 74 20 6f 6e 65 20 72 6f 77  : output one row
143e0 20 6f 66 20 41 0a 2a 2a 20 20 20 20 6f 75 74 42   of A.**    outB
143f0 3a 20 6f 75 74 70 75 74 20 6f 6e 65 20 72 6f 77  : output one row
14400 20 6f 66 20 42 20 28 55 4e 49 4f 4e 20 61 6e 64   of B (UNION and
14410 20 55 4e 49 4f 4e 20 41 4c 4c 20 6f 6e 6c 79 29   UNION ALL only)
14420 0a 2a 2a 20 20 20 20 45 6f 66 41 3a 20 2e 2e 2e  .**    EofA: ...
14430 0a 2a 2a 20 20 20 20 45 6f 66 42 3a 20 2e 2e 2e  .**    EofB: ...
14440 0a 2a 2a 20 20 20 20 41 6c 74 42 3a 20 2e 2e 2e  .**    AltB: ...
14450 0a 2a 2a 20 20 20 20 41 65 71 42 3a 20 2e 2e 2e  .**    AeqB: ...
14460 0a 2a 2a 20 20 20 20 41 67 74 42 3a 20 2e 2e 2e  .**    AgtB: ...
14470 0a 2a 2a 20 20 20 20 49 6e 69 74 3a 20 69 6e 69  .**    Init: ini
14480 74 69 61 6c 69 7a 65 20 63 6f 72 6f 75 74 69 6e  tialize coroutin
14490 65 20 72 65 67 69 73 74 65 72 73 0a 2a 2a 20 20  e registers.**  
144a0 20 20 20 20 20 20 20 20 79 69 65 6c 64 20 63 6f          yield co
144b0 41 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 69 66  A.**          if
144c0 20 65 6f 66 28 41 29 20 67 6f 74 6f 20 45 6f 66   eof(A) goto Eof
144d0 41 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 79 69  A.**          yi
144e0 65 6c 64 20 63 6f 42 0a 2a 2a 20 20 20 20 20 20  eld coB.**      
144f0 20 20 20 20 69 66 20 65 6f 66 28 42 29 20 67 6f      if eof(B) go
14500 74 6f 20 45 6f 66 42 0a 2a 2a 20 20 20 20 43 6d  to EofB.**    Cm
14510 70 72 3a 20 43 6f 6d 70 61 72 65 20 41 2c 20 42  pr: Compare A, B
14520 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 4a 75 6d  .**          Jum
14530 70 20 41 6c 74 42 2c 20 41 65 71 42 2c 20 41 67  p AltB, AeqB, Ag
14540 74 42 0a 2a 2a 20 20 20 20 20 45 6e 64 3a 20 2e  tB.**     End: .
14550 2e 2e 0a 2a 2a 0a 2a 2a 20 57 65 20 63 61 6c 6c  ...**.** We call
14560 20 41 6c 74 42 2c 20 41 65 71 42 2c 20 41 67 74   AltB, AeqB, Agt
14570 42 2c 20 45 6f 66 41 2c 20 61 6e 64 20 45 6f 66  B, EofA, and Eof
14580 42 20 22 73 75 62 72 6f 75 74 69 6e 65 73 22 20  B "subroutines" 
14590 62 75 74 20 74 68 65 79 20 61 72 65 20 6e 6f 74  but they are not
145a0 0a 2a 2a 20 61 63 74 75 61 6c 6c 79 20 63 61 6c  .** actually cal
145b0 6c 65 64 20 75 73 69 6e 67 20 47 6f 73 75 62 20  led using Gosub 
145c0 61 6e 64 20 74 68 65 79 20 64 6f 20 6e 6f 74 20  and they do not 
145d0 52 65 74 75 72 6e 2e 20 20 45 6f 66 41 20 61 6e  Return.  EofA an
145e0 64 20 45 6f 66 42 20 6c 6f 6f 70 0a 2a 2a 20 75  d EofB loop.** u
145f0 6e 74 69 6c 20 61 6c 6c 20 64 61 74 61 20 69 73  ntil all data is
14600 20 65 78 68 61 75 73 74 65 64 20 74 68 65 6e 20   exhausted then 
14610 6a 75 6d 70 20 74 6f 20 74 68 65 20 22 65 6e 64  jump to the "end
14620 22 20 6c 61 62 65 2e 20 20 41 6c 74 42 2c 20 41  " labe.  AltB, A
14630 65 71 42 2c 0a 2a 2a 20 61 6e 64 20 41 67 74 42  eqB,.** and AgtB
14640 20 6a 75 6d 70 20 74 6f 20 65 69 74 68 65 72 20   jump to either 
14650 4c 32 20 6f 72 20 74 6f 20 6f 6e 65 20 6f 66 20  L2 or to one of 
14660 45 6f 66 41 20 6f 72 20 45 6f 66 42 2e 0a 2a 2f  EofA or EofB..*/
14670 0a 73 74 61 74 69 63 20 69 6e 74 20 6d 75 6c 74  .static int mult
14680 69 53 65 6c 65 63 74 4f 72 64 65 72 42 79 28 0a  iSelectOrderBy(.
14690 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
146a0 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69          /* Parsi
146b0 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  ng context */.  
146c0 53 65 6c 65 63 74 20 2a 70 2c 20 20 20 20 20 20  Select *p,      
146d0 20 20 20 20 20 20 2f 2a 20 54 68 65 20 72 69 67        /* The rig
146e0 68 74 2d 6d 6f 73 74 20 6f 66 20 53 45 4c 45 43  ht-most of SELEC
146f0 54 73 20 74 6f 20 62 65 20 63 6f 64 65 64 20 2a  Ts to be coded *
14700 2f 0a 20 20 53 65 6c 65 63 74 44 65 73 74 20 2a  /.  SelectDest *
14710 70 44 65 73 74 2c 20 20 20 20 2f 2a 20 57 68 61  pDest,    /* Wha
14720 74 20 74 6f 20 64 6f 20 77 69 74 68 20 71 75 65  t to do with que
14730 72 79 20 72 65 73 75 6c 74 73 20 2a 2f 0a 20 20  ry results */.  
14740 63 68 61 72 20 2a 61 66 66 20 20 20 20 20 20 20  char *aff       
14750 20 20 20 20 20 20 2f 2a 20 49 66 20 65 44 65 73        /* If eDes
14760 74 20 69 73 20 53 52 54 5f 55 6e 69 6f 6e 2c 20  t is SRT_Union, 
14770 74 68 65 20 61 66 66 69 6e 69 74 79 20 73 74 72  the affinity str
14780 69 6e 67 20 2a 2f 0a 29 7b 0a 20 20 53 65 6c 65  ing */.){.  Sele
14790 63 74 20 2a 70 50 72 69 6f 72 3b 20 20 20 20 20  ct *pPrior;     
147a0 20 20 2f 2a 20 41 6e 6f 74 68 65 72 20 53 45 4c    /* Another SEL
147b0 45 43 54 20 69 6d 6d 65 64 69 61 74 65 6c 79 20  ECT immediately 
147c0 74 6f 20 6f 75 72 20 6c 65 66 74 20 2a 2f 0a 20  to our left */. 
147d0 20 56 64 62 65 20 2a 76 3b 20 20 20 20 20 20 20   Vdbe *v;       
147e0 20 20 20 20 20 20 20 2f 2a 20 47 65 6e 65 72 61         /* Genera
147f0 74 65 20 63 6f 64 65 20 74 6f 20 74 68 69 73 20  te code to this 
14800 56 44 42 45 20 2a 2f 0a 20 20 53 65 6c 65 63 74  VDBE */.  Select
14810 44 65 73 74 20 64 65 73 74 41 3b 20 20 20 20 20  Dest destA;     
14820 2f 2a 20 44 65 73 74 69 6e 61 74 69 6f 6e 20 66  /* Destination f
14830 6f 72 20 63 6f 72 6f 75 74 69 6e 65 20 41 20 2a  or coroutine A *
14840 2f 0a 20 20 53 65 6c 65 63 74 44 65 73 74 20 64  /.  SelectDest d
14850 65 73 74 42 3b 20 20 20 20 20 2f 2a 20 44 65 73  estB;     /* Des
14860 74 69 6e 61 74 69 6f 6e 20 66 6f 72 20 63 6f 72  tination for cor
14870 6f 75 74 69 6e 65 20 42 20 2a 2f 0a 20 20 69 6e  outine B */.  in
14880 74 20 72 65 67 41 64 64 72 41 3b 20 20 20 20 20  t regAddrA;     
14890 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 72      /* Address r
148a0 65 67 69 73 74 65 72 20 66 6f 72 20 73 65 6c 65  egister for sele
148b0 63 74 2d 41 20 63 6f 72 6f 75 74 69 6e 65 20 2a  ct-A coroutine *
148c0 2f 0a 20 20 69 6e 74 20 72 65 67 45 6f 66 41 3b  /.  int regEofA;
148d0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6c 61            /* Fla
148e0 67 20 74 6f 20 69 6e 64 69 63 61 74 65 20 77 68  g to indicate wh
148f0 65 6e 20 73 65 6c 65 63 74 2d 41 20 69 73 20 63  en select-A is c
14900 6f 6d 70 6c 65 74 65 20 2a 2f 0a 20 20 69 6e 74  omplete */.  int
14910 20 72 65 67 41 64 64 72 42 3b 20 20 20 20 20 20   regAddrB;      
14920 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 72 65     /* Address re
14930 67 69 73 74 65 72 20 66 6f 72 20 73 65 6c 65 63  gister for selec
14940 74 2d 42 20 63 6f 72 6f 75 74 69 6e 65 20 2a 2f  t-B coroutine */
14950 0a 20 20 69 6e 74 20 72 65 67 45 6f 66 42 3b 20  .  int regEofB; 
14960 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6c 61 67           /* Flag
14970 20 74 6f 20 69 6e 64 69 63 61 74 65 20 77 68 65   to indicate whe
14980 6e 20 73 65 6c 65 63 74 2d 42 20 69 73 20 63 6f  n select-B is co
14990 6d 70 6c 65 74 65 20 2a 2f 0a 20 20 69 6e 74 20  mplete */.  int 
149a0 61 64 64 72 53 65 6c 65 63 74 41 3b 20 20 20 20  addrSelectA;    
149b0 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20    /* Address of 
149c0 74 68 65 20 73 65 6c 65 63 74 2d 41 20 63 6f 72  the select-A cor
149d0 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20  outine */.  int 
149e0 61 64 64 72 53 65 6c 65 63 74 42 3b 20 20 20 20  addrSelectB;    
149f0 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20    /* Address of 
14a00 74 68 65 20 73 65 6c 65 63 74 2d 42 20 63 6f 72  the select-B cor
14a10 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20  outine */.  int 
14a20 72 65 67 4f 75 74 41 3b 20 20 20 20 20 20 20 20  regOutA;        
14a30 20 20 2f 2a 20 41 64 64 72 65 73 73 20 72 65 67    /* Address reg
14a40 69 73 74 65 72 20 66 6f 72 20 74 68 65 20 6f 75  ister for the ou
14a50 74 70 75 74 2d 41 20 73 75 62 72 6f 75 74 69 6e  tput-A subroutin
14a60 65 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 4f 75  e */.  int regOu
14a70 74 42 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  tB;          /* 
14a80 41 64 64 72 65 73 73 20 72 65 67 69 73 74 65 72  Address register
14a90 20 66 6f 72 20 74 68 65 20 6f 75 74 70 75 74 2d   for the output-
14aa0 42 20 73 75 62 72 6f 75 74 69 6e 65 20 2a 2f 0a  B subroutine */.
14ab0 20 20 69 6e 74 20 61 64 64 72 4f 75 74 41 3b 20    int addrOutA; 
14ac0 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65          /* Addre
14ad0 73 73 20 6f 66 20 74 68 65 20 6f 75 74 70 75 74  ss of the output
14ae0 2d 41 20 73 75 62 72 6f 75 74 69 6e 65 20 2a 2f  -A subroutine */
14af0 0a 20 20 69 6e 74 20 61 64 64 72 4f 75 74 42 3b  .  int addrOutB;
14b00 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72           /* Addr
14b10 65 73 73 20 6f 66 20 74 68 65 20 6f 75 74 70 75  ess of the outpu
14b20 74 2d 42 20 73 75 62 72 6f 75 74 69 6e 65 20 2a  t-B subroutine *
14b30 2f 0a 20 20 69 6e 74 20 61 64 64 72 45 6f 66 41  /.  int addrEofA
14b40 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64  ;         /* Add
14b50 72 65 73 73 20 6f 66 20 74 68 65 20 73 65 6c 65  ress of the sele
14b60 63 74 2d 41 2d 65 78 68 61 75 73 74 65 64 20 73  ct-A-exhausted s
14b70 75 62 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 69  ubroutine */.  i
14b80 6e 74 20 61 64 64 72 45 6f 66 42 3b 20 20 20 20  nt addrEofB;    
14b90 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20       /* Address 
14ba0 6f 66 20 74 68 65 20 73 65 6c 65 63 74 2d 42 2d  of the select-B-
14bb0 65 78 68 61 75 73 74 65 64 20 73 75 62 72 6f 75  exhausted subrou
14bc0 74 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 61 64  tine */.  int ad
14bd0 64 72 41 6c 74 42 3b 20 20 20 20 20 20 20 20 20  drAltB;         
14be0 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20 74 68  /* Address of th
14bf0 65 20 41 3c 42 20 73 75 62 72 6f 75 74 69 6e 65  e A<B subroutine
14c00 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 41 65   */.  int addrAe
14c10 71 42 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 41  qB;         /* A
14c20 64 64 72 65 73 73 20 6f 66 20 74 68 65 20 41 3d  ddress of the A=
14c30 3d 42 20 73 75 62 72 6f 75 74 69 6e 65 20 2a 2f  =B subroutine */
14c40 0a 20 20 69 6e 74 20 61 64 64 72 41 67 74 42 3b  .  int addrAgtB;
14c50 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72           /* Addr
14c60 65 73 73 20 6f 66 20 74 68 65 20 41 3e 42 20 73  ess of the A>B s
14c70 75 62 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 69  ubroutine */.  i
14c80 6e 74 20 72 65 67 4c 69 6d 69 74 41 3b 20 20 20  nt regLimitA;   
14c90 20 20 20 20 20 2f 2a 20 4c 69 6d 69 74 20 72 65       /* Limit re
14ca0 67 69 73 74 65 72 20 66 6f 72 20 73 65 6c 65 63  gister for selec
14cb0 74 2d 41 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67  t-A */.  int reg
14cc0 4c 69 6d 69 74 42 3b 20 20 20 20 20 20 20 20 2f  LimitB;        /
14cd0 2a 20 4c 69 6d 69 74 20 72 65 67 69 73 74 65 72  * Limit register
14ce0 20 66 6f 72 20 73 65 6c 65 63 74 2d 41 20 2a 2f   for select-A */
14cf0 0a 20 20 69 6e 74 20 73 61 76 65 64 4c 69 6d 69  .  int savedLimi
14d00 74 3b 20 20 20 20 20 20 20 2f 2a 20 53 61 76 65  t;       /* Save
14d10 64 20 76 61 6c 75 65 20 6f 66 20 70 2d 3e 69 4c  d value of p->iL
14d20 69 6d 69 74 20 2a 2f 0a 20 20 69 6e 74 20 73 61  imit */.  int sa
14d30 76 65 64 4f 66 66 73 65 74 3b 20 20 20 20 20 20  vedOffset;      
14d40 2f 2a 20 53 61 76 65 64 20 76 61 6c 75 65 20 6f  /* Saved value o
14d50 66 20 70 2d 3e 69 4f 66 66 73 65 74 20 2a 2f 0a  f p->iOffset */.
14d60 20 20 69 6e 74 20 6c 61 62 65 6c 43 6d 70 72 3b    int labelCmpr;
14d70 20 20 20 20 20 20 20 20 2f 2a 20 4c 61 62 65 6c          /* Label
14d80 20 66 6f 72 20 74 68 65 20 73 74 61 72 74 20 6f   for the start o
14d90 66 20 74 68 65 20 6d 65 72 67 65 20 61 6c 67 6f  f the merge algo
14da0 72 69 74 68 6d 20 2a 2f 0a 20 20 69 6e 74 20 6c  rithm */.  int l
14db0 61 62 65 6c 45 6e 64 3b 20 20 20 20 20 20 20 20  abelEnd;        
14dc0 20 2f 2a 20 4c 61 62 65 6c 20 66 6f 72 20 74 68   /* Label for th
14dd0 65 20 65 6e 64 20 6f 66 20 74 68 65 20 6f 76 65  e end of the ove
14de0 72 61 6c 6c 20 53 45 4c 45 43 54 20 73 74 6d 74  rall SELECT stmt
14df0 20 2a 2f 0a 20 20 69 6e 74 20 6a 31 2c 20 6a 32   */.  int j1, j2
14e00 2c 20 6a 33 3b 20 20 20 20 20 20 20 2f 2a 20 4a  , j3;       /* J
14e10 75 6d 70 20 69 6e 73 74 72 75 63 74 69 6f 6e 73  ump instructions
14e20 20 74 68 61 74 20 67 65 74 20 72 65 74 61 72 67   that get retarg
14e30 65 74 74 65 64 20 2a 2f 0a 20 20 69 6e 74 20 6f  etted */.  int o
14e40 70 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p;              
14e50 20 2f 2a 20 4f 6e 65 20 6f 66 20 54 4b 5f 41 4c   /* One of TK_AL
14e60 4c 2c 20 54 4b 5f 55 4e 49 4f 4e 2c 20 54 4b 5f  L, TK_UNION, TK_
14e70 45 58 43 45 50 54 2c 20 54 4b 5f 49 4e 54 45 52  EXCEPT, TK_INTER
14e80 53 45 43 54 20 2a 2f 0a 20 20 4b 65 79 49 6e 66  SECT */.  KeyInf
14e90 6f 20 2a 70 4b 65 79 49 6e 66 6f 3b 20 20 20 20  o *pKeyInfo;    
14ea0 2f 2a 20 54 79 70 65 20 64 61 74 61 20 66 6f 72  /* Type data for
14eb0 20 63 6f 6d 70 61 72 69 73 6f 6e 73 20 2a 2f 0a   comparisons */.
14ec0 20 20 69 6e 74 20 70 34 74 79 70 65 3b 20 20 20    int p4type;   
14ed0 20 20 20 20 20 20 20 20 2f 2a 20 50 34 20 74 79          /* P4 ty
14ee0 70 65 20 75 73 65 64 20 66 6f 72 20 70 4b 65 79  pe used for pKey
14ef0 49 6e 66 6f 20 2a 2f 0a 0a 20 20 61 73 73 65 72  Info */..  asser
14f00 74 28 20 70 2d 3e 70 4f 72 64 65 72 42 79 21 3d  t( p->pOrderBy!=
14f10 30 20 29 3b 0a 20 20 76 20 3d 20 70 50 61 72 73  0 );.  v = pPars
14f20 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69 66 28 20  e->pVdbe;.  if( 
14f30 76 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51  v==0 ) return SQ
14f40 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 6c 61  LITE_NOMEM;.  la
14f50 62 65 6c 45 6e 64 20 3d 20 73 71 6c 69 74 65 33  belEnd = sqlite3
14f60 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29  VdbeMakeLabel(v)
14f70 3b 0a 20 20 6c 61 62 65 6c 43 6d 70 72 20 3d 20  ;.  labelCmpr = 
14f80 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c  sqlite3VdbeMakeL
14f90 61 62 65 6c 28 76 29 3b 0a 20 20 70 4b 65 79 49  abel(v);.  pKeyI
14fa0 6e 66 6f 20 3d 20 6b 65 79 49 6e 66 6f 46 72 6f  nfo = keyInfoFro
14fb0 6d 45 78 70 72 4c 69 73 74 28 70 50 61 72 73 65  mExprList(pParse
14fc0 2c 20 70 2d 3e 70 45 4c 69 73 74 29 3b 0a 20 20  , p->pEList);.  
14fd0 70 34 74 79 70 65 20 3d 20 50 34 5f 4b 45 59 49  p4type = P4_KEYI
14fe0 4e 46 4f 5f 48 41 4e 44 4f 46 46 3b 0a 0a 20 20  NFO_HANDOFF;..  
14ff0 2f 2a 20 50 61 74 63 68 20 75 70 20 74 68 65 20  /* Patch up the 
15000 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 0a  ORDER BY clause.
15010 20 20 2a 2f 0a 20 20 6f 70 20 3d 20 70 2d 3e 6f    */.  op = p->o
15020 70 3b 20 20 0a 20 20 70 50 72 69 6f 72 20 3d 20  p;  .  pPrior = 
15030 70 2d 3e 70 50 72 69 6f 72 3b 0a 20 20 61 73 73  p->pPrior;.  ass
15040 65 72 74 28 20 70 50 72 69 6f 72 2d 3e 70 4f 72  ert( pPrior->pOr
15050 64 65 72 42 79 3d 3d 30 20 29 3b 0a 20 20 69 66  derBy==0 );.  if
15060 28 20 70 72 6f 63 65 73 73 43 6f 6d 70 6f 75 6e  ( processCompoun
15070 64 4f 72 64 65 72 42 79 28 70 50 61 72 73 65 2c  dOrderBy(pParse,
15080 20 70 2c 20 30 29 20 29 7b 0a 20 20 20 20 72 65   p, 0) ){.    re
15090 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f  turn SQLITE_ERRO
150a0 52 3b 0a 20 20 7d 0a 20 20 70 50 72 69 6f 72 2d  R;.  }.  pPrior-
150b0 3e 70 4f 72 64 65 72 42 79 20 3d 20 73 71 6c 69  >pOrderBy = sqli
150c0 74 65 33 45 78 70 72 4c 69 73 74 44 75 70 28 70  te3ExprListDup(p
150d0 50 61 72 73 65 2d 3e 64 62 2c 20 70 2d 3e 70 4f  Parse->db, p->pO
150e0 72 64 65 72 42 79 29 3b 0a 20 0a 20 20 2f 2a 20  rderBy);. .  /* 
150f0 53 65 70 61 72 61 74 65 20 74 68 65 20 6c 65 66  Separate the lef
15100 74 20 61 6e 64 20 74 68 65 20 72 69 67 68 74 20  t and the right 
15110 71 75 65 72 79 20 66 72 6f 6d 20 6f 6e 65 20 61  query from one a
15120 6e 6f 74 68 65 72 0a 20 20 2a 2f 0a 20 20 70 2d  nother.  */.  p-
15130 3e 70 50 72 69 6f 72 20 3d 20 30 3b 0a 20 20 70  >pPrior = 0;.  p
15140 50 72 69 6f 72 2d 3e 70 52 69 67 68 74 6d 6f 73  Prior->pRightmos
15150 74 20 3d 20 30 3b 0a 20 20 0a 20 20 2f 2a 20 43  t = 0;.  .  /* C
15160 6f 6d 70 75 74 65 20 74 68 65 20 6c 69 6d 69 74  ompute the limit
15170 20 72 65 67 69 73 74 65 72 73 20 2a 2f 0a 20 20   registers */.  
15180 63 6f 6d 70 75 74 65 4c 69 6d 69 74 52 65 67 69  computeLimitRegi
15190 73 74 65 72 73 28 70 50 61 72 73 65 2c 20 70 2c  sters(pParse, p,
151a0 20 6c 61 62 65 6c 45 6e 64 29 3b 0a 20 20 69 66   labelEnd);.  if
151b0 28 20 70 2d 3e 69 4c 69 6d 69 74 20 29 7b 0a 20  ( p->iLimit ){. 
151c0 20 20 20 72 65 67 4c 69 6d 69 74 41 20 3d 20 2b     regLimitA = +
151d0 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20  +pParse->nMem;. 
151e0 20 20 20 72 65 67 4c 69 6d 69 74 42 20 3d 20 2b     regLimitB = +
151f0 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20  +pParse->nMem;. 
15200 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
15210 64 4f 70 32 28 76 2c 20 4f 50 5f 43 6f 70 79 2c  dOp2(v, OP_Copy,
15220 20 70 2d 3e 69 4f 66 66 73 65 74 20 3f 20 70 2d   p->iOffset ? p-
15230 3e 69 4f 66 66 73 65 74 2b 31 20 3a 20 70 2d 3e  >iOffset+1 : p->
15240 69 4c 69 6d 69 74 2c 0a 20 20 20 20 20 20 20 20  iLimit,.        
15250 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15260 20 20 20 20 20 20 20 20 20 20 72 65 67 4c 69 6d            regLim
15270 69 74 41 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  itA);.    sqlite
15280 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
15290 50 5f 43 6f 70 79 2c 20 72 65 67 4c 69 6d 69 74  P_Copy, regLimit
152a0 41 2c 20 72 65 67 4c 69 6d 69 74 42 29 3b 0a 20  A, regLimitB);. 
152b0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65 67 4c   }else{.    regL
152c0 69 6d 69 74 41 20 3d 20 72 65 67 4c 69 6d 69 74  imitA = regLimit
152d0 42 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 72 65  B = 0;.  }..  re
152e0 67 41 64 64 72 41 20 3d 20 2b 2b 70 50 61 72 73  gAddrA = ++pPars
152f0 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 72 65 67 45 6f  e->nMem;.  regEo
15300 66 41 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e  fA = ++pParse->n
15310 4d 65 6d 3b 0a 20 20 72 65 67 41 64 64 72 42 20  Mem;.  regAddrB 
15320 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d  = ++pParse->nMem
15330 3b 0a 20 20 72 65 67 45 6f 66 42 20 3d 20 2b 2b  ;.  regEofB = ++
15340 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20  pParse->nMem;.  
15350 72 65 67 4f 75 74 41 20 3d 20 2b 2b 70 50 61 72  regOutA = ++pPar
15360 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 72 65 67 4f  se->nMem;.  regO
15370 75 74 42 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e  utB = ++pParse->
15380 6e 4d 65 6d 3b 0a 20 20 73 71 6c 69 74 65 33 53  nMem;.  sqlite3S
15390 65 6c 65 63 74 44 65 73 74 49 6e 69 74 28 26 64  electDestInit(&d
153a0 65 73 74 41 2c 20 53 52 54 5f 43 6f 72 6f 75 74  estA, SRT_Corout
153b0 69 6e 65 2c 20 72 65 67 41 64 64 72 41 29 3b 0a  ine, regAddrA);.
153c0 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44    sqlite3SelectD
153d0 65 73 74 49 6e 69 74 28 26 64 65 73 74 42 2c 20  estInit(&destB, 
153e0 53 52 54 5f 43 6f 72 6f 75 74 69 6e 65 2c 20 72  SRT_Coroutine, r
153f0 65 67 41 64 64 72 42 29 3b 0a 0a 20 20 2f 2a 20  egAddrB);..  /* 
15400 4a 75 6d 70 20 70 61 73 74 20 74 68 65 20 76 61  Jump past the va
15410 72 69 6f 75 73 20 73 75 62 72 6f 75 74 69 6e 65  rious subroutine
15420 73 20 61 6e 64 20 63 6f 72 6f 75 74 69 6e 65 73  s and coroutines
15430 20 74 6f 20 74 68 65 20 6d 61 69 6e 0a 20 20 2a   to the main.  *
15440 2a 20 6d 65 72 67 65 20 6c 6f 6f 70 0a 20 20 2a  * merge loop.  *
15450 2f 0a 20 20 6a 31 20 3d 20 73 71 6c 69 74 65 33  /.  j1 = sqlite3
15460 56 64 62 65 41 64 64 4f 70 30 28 76 2c 20 4f 50  VdbeAddOp0(v, OP
15470 5f 47 6f 74 6f 29 3b 0a 20 20 61 64 64 72 53 65  _Goto);.  addrSe
15480 6c 65 63 74 41 20 3d 20 73 71 6c 69 74 65 33 56  lectA = sqlite3V
15490 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76  dbeCurrentAddr(v
154a0 29 3b 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74  );..  /* Generat
154b0 65 20 61 20 63 6f 72 6f 75 74 69 6e 65 20 74 6f  e a coroutine to
154c0 20 65 76 61 6c 75 61 74 65 20 74 68 65 20 53 45   evaluate the SE
154d0 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 74  LECT statement t
154e0 6f 20 74 68 65 0a 20 20 2a 2a 20 6c 65 66 74 20  o the.  ** left 
154f0 6f 66 20 74 68 65 20 63 6f 6d 70 6f 75 6e 64 20  of the compound 
15500 6f 70 65 72 61 74 6f 72 20 2d 20 74 68 65 20 22  operator - the "
15510 41 22 20 73 65 6c 65 63 74 2e 20 2a 2f 0a 20 20  A" select. */.  
15520 56 64 62 65 4e 6f 6f 70 43 6f 6d 6d 65 6e 74 28  VdbeNoopComment(
15530 28 76 2c 20 22 42 65 67 69 6e 20 63 6f 72 6f 75  (v, "Begin corou
15540 74 69 6e 65 20 66 6f 72 20 6c 65 66 74 20 53 45  tine for left SE
15550 4c 45 43 54 22 29 29 3b 0a 20 20 70 50 72 69 6f  LECT"));.  pPrio
15560 72 2d 3e 69 4c 69 6d 69 74 20 3d 20 72 65 67 4c  r->iLimit = regL
15570 69 6d 69 74 41 3b 0a 20 20 73 71 6c 69 74 65 33  imitA;.  sqlite3
15580 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70  Select(pParse, p
15590 50 72 69 6f 72 2c 20 26 64 65 73 74 41 2c 20 30  Prior, &destA, 0
155a0 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 73 71  , 0, 0, 0);.  sq
155b0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
155c0 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 31  v, OP_Integer, 1
155d0 2c 20 72 65 67 45 6f 66 41 29 3b 0a 20 20 73 71  , regEofA);.  sq
155e0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28  lite3VdbeAddOp1(
155f0 76 2c 20 4f 50 5f 59 69 65 6c 64 2c 20 72 65 67  v, OP_Yield, reg
15600 41 64 64 72 41 29 3b 0a 20 20 56 64 62 65 4e 6f  AddrA);.  VdbeNo
15610 6f 70 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 45  opComment((v, "E
15620 6e 64 20 63 6f 72 6f 75 74 69 6e 65 20 66 6f 72  nd coroutine for
15630 20 6c 65 66 74 20 53 45 4c 45 43 54 22 29 29 3b   left SELECT"));
15640 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20  ..  /* Generate 
15650 61 20 63 6f 72 6f 75 74 69 6e 65 20 74 6f 20 65  a coroutine to e
15660 76 61 6c 75 61 74 65 20 74 68 65 20 53 45 4c 45  valuate the SELE
15670 43 54 20 73 74 61 74 65 6d 65 6e 74 20 6f 6e 20  CT statement on 
15680 0a 20 20 2a 2a 20 74 68 65 20 72 69 67 68 74 20  .  ** the right 
15690 2d 20 74 68 65 20 22 42 22 20 73 65 6c 65 63 74  - the "B" select
156a0 0a 20 20 2a 2f 0a 20 20 61 64 64 72 53 65 6c 65  .  */.  addrSele
156b0 63 74 42 20 3d 20 73 71 6c 69 74 65 33 56 64 62  ctB = sqlite3Vdb
156c0 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b  eCurrentAddr(v);
156d0 0a 20 20 56 64 62 65 4e 6f 6f 70 43 6f 6d 6d 65  .  VdbeNoopComme
156e0 6e 74 28 28 76 2c 20 22 42 65 67 69 6e 20 63 6f  nt((v, "Begin co
156f0 72 6f 75 74 69 6e 65 20 66 6f 72 20 72 69 67 68  routine for righ
15700 74 20 53 45 4c 45 43 54 22 29 29 3b 0a 20 20 73  t SELECT"));.  s
15710 61 76 65 64 4c 69 6d 69 74 20 3d 20 70 2d 3e 69  avedLimit = p->i
15720 4c 69 6d 69 74 3b 0a 20 20 73 61 76 65 64 4f 66  Limit;.  savedOf
15730 66 73 65 74 20 3d 20 70 2d 3e 69 4f 66 66 73 65  fset = p->iOffse
15740 74 3b 0a 20 20 70 2d 3e 69 4c 69 6d 69 74 20 3d  t;.  p->iLimit =
15750 20 72 65 67 4c 69 6d 69 74 42 3b 0a 20 20 70 2d   regLimitB;.  p-
15760 3e 69 4f 66 66 73 65 74 20 3d 20 30 3b 20 20 0a  >iOffset = 0;  .
15770 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28    sqlite3Select(
15780 70 50 61 72 73 65 2c 20 70 2c 20 26 64 65 73 74  pParse, p, &dest
15790 42 2c 20 30 2c 20 30 2c 20 30 2c 20 30 29 3b 0a  B, 0, 0, 0, 0);.
157a0 20 20 70 2d 3e 69 4c 69 6d 69 74 20 3d 20 73 61    p->iLimit = sa
157b0 76 65 64 4c 69 6d 69 74 3b 0a 20 20 70 2d 3e 69  vedLimit;.  p->i
157c0 4f 66 66 73 65 74 20 3d 20 73 61 76 65 64 4f 66  Offset = savedOf
157d0 66 73 65 74 3b 0a 20 20 73 71 6c 69 74 65 33 56  fset;.  sqlite3V
157e0 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
157f0 49 6e 74 65 67 65 72 2c 20 31 2c 20 72 65 67 45  Integer, 1, regE
15800 6f 66 42 29 3b 0a 20 20 73 71 6c 69 74 65 33 56  ofB);.  sqlite3V
15810 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f  dbeAddOp1(v, OP_
15820 59 69 65 6c 64 2c 20 72 65 67 41 64 64 72 42 29  Yield, regAddrB)
15830 3b 0a 20 20 56 64 62 65 4e 6f 6f 70 43 6f 6d 6d  ;.  VdbeNoopComm
15840 65 6e 74 28 28 76 2c 20 22 45 6e 64 20 63 6f 72  ent((v, "End cor
15850 6f 75 74 69 6e 65 20 66 6f 72 20 72 69 67 68 74  outine for right
15860 20 53 45 4c 45 43 54 22 29 29 3b 0a 0a 20 20 2f   SELECT"));..  /
15870 2a 20 47 65 6e 65 72 61 74 65 20 61 20 73 75 62  * Generate a sub
15880 72 6f 75 74 69 6e 65 20 74 68 61 74 20 6f 75 74  routine that out
15890 70 75 74 73 20 74 68 65 20 63 75 72 72 65 6e 74  puts the current
158a0 20 72 6f 77 20 6f 66 20 74 68 65 20 41 0a 20 20   row of the A.  
158b0 2a 2a 20 73 65 6c 65 63 74 20 61 73 20 74 68 65  ** select as the
158c0 20 6e 65 78 74 20 6f 75 74 70 75 74 20 72 6f 77   next output row
158d0 20 6f 66 20 74 68 65 20 63 6f 6d 70 6f 75 6e 64   of the compound
158e0 20 73 65 6c 65 63 74 20 61 6e 64 20 74 68 65 6e   select and then
158f0 0a 20 20 2a 2a 20 61 64 76 61 6e 63 65 73 20 74  .  ** advances t
15900 68 65 20 41 20 73 65 6c 65 63 74 20 74 6f 20 69  he A select to i
15910 74 73 20 6e 65 78 74 20 72 6f 77 0a 20 20 2a 2f  ts next row.  */
15920 0a 20 20 56 64 62 65 4e 6f 6f 70 43 6f 6d 6d 65  .  VdbeNoopComme
15930 6e 74 28 28 76 2c 20 22 4f 75 74 70 75 74 20 72  nt((v, "Output r
15940 6f 75 74 69 6e 65 20 66 6f 72 20 41 22 29 29 3b  outine for A"));
15950 0a 20 20 61 64 64 72 4f 75 74 41 20 3d 20 6f 75  .  addrOutA = ou
15960 74 70 75 74 53 75 62 72 6f 75 74 69 6e 65 28 70  tputSubroutine(p
15970 50 61 72 73 65 2c 20 70 2c 20 26 64 65 73 74 41  Parse, p, &destA
15980 2c 20 70 44 65 73 74 2c 20 72 65 67 4f 75 74 41  , pDest, regOutA
15990 2c 20 6c 61 62 65 6c 45 6e 64 29 3b 0a 20 20 0a  , labelEnd);.  .
159a0 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 61 20    /* Generate a 
159b0 73 75 62 72 6f 75 74 69 6e 65 20 74 68 61 74 20  subroutine that 
159c0 6f 75 74 70 75 74 73 20 74 68 65 20 63 75 72 72  outputs the curr
159d0 65 6e 74 20 72 6f 77 20 6f 66 20 74 68 65 20 42  ent row of the B
159e0 0a 20 20 2a 2a 20 73 65 6c 65 63 74 20 61 73 20  .  ** select as 
159f0 74 68 65 20 6e 65 78 74 20 6f 75 74 70 75 74 20  the next output 
15a00 72 6f 77 20 6f 66 20 74 68 65 20 63 6f 6d 70 6f  row of the compo
15a10 75 6e 64 20 73 65 6c 65 63 74 20 61 6e 64 20 74  und select and t
15a20 68 65 6e 0a 20 20 2a 2a 20 61 64 76 61 6e 63 65  hen.  ** advance
15a30 73 20 74 68 65 20 42 20 73 65 6c 65 63 74 20 74  s the B select t
15a40 6f 20 69 74 73 20 6e 65 78 74 20 72 6f 77 0a 20  o its next row. 
15a50 20 2a 2f 0a 20 20 56 64 62 65 4e 6f 6f 70 43 6f   */.  VdbeNoopCo
15a60 6d 6d 65 6e 74 28 28 76 2c 20 22 4f 75 74 70 75  mment((v, "Outpu
15a70 74 20 72 6f 75 74 69 6e 65 20 66 6f 72 20 42 22  t routine for B"
15a80 29 29 3b 0a 20 20 61 64 64 72 4f 75 74 42 20 3d  ));.  addrOutB =
15a90 20 6f 75 74 70 75 74 53 75 62 72 6f 75 74 69 6e   outputSubroutin
15aa0 65 28 70 50 61 72 73 65 2c 20 70 2c 20 26 64 65  e(pParse, p, &de
15ab0 73 74 42 2c 20 70 44 65 73 74 2c 20 72 65 67 4f  stB, pDest, regO
15ac0 75 74 42 2c 20 6c 61 62 65 6c 45 6e 64 29 3b 0a  utB, labelEnd);.
15ad0 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 61  .  /* Generate a
15ae0 20 73 75 62 72 6f 75 74 69 6e 65 20 74 6f 20 72   subroutine to r
15af0 75 6e 20 77 68 65 6e 20 74 68 65 20 72 65 73 75  un when the resu
15b00 6c 74 73 20 66 72 6f 6d 20 73 65 6c 65 63 74 20  lts from select 
15b10 41 0a 20 20 2a 2a 20 61 72 65 20 65 78 68 61 75  A.  ** are exhau
15b20 73 74 65 64 20 61 6e 64 20 6f 6e 6c 79 20 64 61  sted and only da
15b30 74 61 20 69 6e 20 73 65 6c 65 63 74 20 42 20 72  ta in select B r
15b40 65 6d 61 69 6e 73 2e 0a 20 20 2a 2f 0a 20 20 56  emains..  */.  V
15b50 64 62 65 4e 6f 6f 70 43 6f 6d 6d 65 6e 74 28 28  dbeNoopComment((
15b60 76 2c 20 22 65 6f 66 2d 41 20 73 75 62 72 6f 75  v, "eof-A subrou
15b70 74 69 6e 65 22 29 29 3b 0a 20 20 61 64 64 72 45  tine"));.  addrE
15b80 6f 66 41 20 3d 20 73 71 6c 69 74 65 33 56 64 62  ofA = sqlite3Vdb
15b90 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b  eCurrentAddr(v);
15ba0 0a 20 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 45 58  .  if( op==TK_EX
15bb0 43 45 50 54 20 7c 7c 20 6f 70 3d 3d 54 4b 5f 49  CEPT || op==TK_I
15bc0 4e 54 45 52 53 45 43 54 20 29 7b 0a 20 20 20 20  NTERSECT ){.    
15bd0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
15be0 32 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c  2(v, OP_Goto, 0,
15bf0 20 6c 61 62 65 6c 45 6e 64 29 3b 0a 20 20 7d 65   labelEnd);.  }e
15c00 6c 73 65 7b 20 20 0a 20 20 20 20 69 66 28 20 6f  lse{  .    if( o
15c10 70 3d 3d 54 4b 5f 41 4c 4c 20 29 7b 0a 20 20 20  p==TK_ALL ){.   
15c20 20 20 20 6a 32 20 3d 20 73 71 6c 69 74 65 33 56     j2 = sqlite3V
15c30 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
15c40 49 66 2c 20 72 65 67 45 6f 66 42 2c 20 6c 61 62  If, regEofB, lab
15c50 65 6c 45 6e 64 29 3b 0a 20 20 20 20 20 20 73 71  elEnd);.      sq
15c60 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
15c70 76 2c 20 4f 50 5f 47 6f 73 75 62 2c 20 72 65 67  v, OP_Gosub, reg
15c80 4f 75 74 42 2c 20 61 64 64 72 4f 75 74 42 29 3b  OutB, addrOutB);
15c90 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
15ca0 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47  beAddOp2(v, OP_G
15cb0 6f 74 6f 2c 20 30 2c 20 6a 32 29 3b 0a 20 20 20  oto, 0, j2);.   
15cc0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 61 73   }else{.      as
15cd0 73 65 72 74 28 20 6f 70 3d 3d 54 4b 5f 55 4e 49  sert( op==TK_UNI
15ce0 4f 4e 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  ON );.      sqli
15cf0 74 65 33 45 78 70 72 43 6f 64 65 43 6f 70 79 28  te3ExprCodeCopy(
15d00 70 50 61 72 73 65 2c 20 64 65 73 74 42 2e 69 4d  pParse, destB.iM
15d10 65 6d 2c 20 64 65 73 74 41 2e 69 4d 65 6d 2c 20  em, destA.iMem, 
15d20 64 65 73 74 42 2e 6e 4d 65 6d 29 3b 0a 20 20 20  destB.nMem);.   
15d30 20 20 20 6a 32 20 3d 20 73 71 6c 69 74 65 33 56     j2 = sqlite3V
15d40 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
15d50 47 6f 73 75 62 2c 20 72 65 67 4f 75 74 42 2c 20  Gosub, regOutB, 
15d60 61 64 64 72 4f 75 74 42 29 3b 0a 20 20 20 20 20  addrOutB);.     
15d70 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
15d80 70 32 28 76 2c 20 4f 50 5f 49 66 2c 20 72 65 67  p2(v, OP_If, reg
15d90 45 6f 66 42 2c 20 6c 61 62 65 6c 45 6e 64 29 3b  EofB, labelEnd);
15da0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
15db0 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 43  beAddOp4(v, OP_C
15dc0 6f 6d 70 61 72 65 2c 20 64 65 73 74 41 2e 69 4d  ompare, destA.iM
15dd0 65 6d 2c 20 64 65 73 74 42 2e 69 4d 65 6d 2c 20  em, destB.iMem, 
15de0 64 65 73 74 42 2e 6e 4d 65 6d 2c 0a 20 20 20 20  destB.nMem,.    
15df0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15e00 20 20 20 20 20 20 20 28 63 68 61 72 2a 29 70 4b         (char*)pK
15e10 65 79 49 6e 66 6f 2c 20 70 34 74 79 70 65 29 3b  eyInfo, p4type);
15e20 0a 20 20 20 20 20 20 70 34 74 79 70 65 20 3d 20  .      p4type = 
15e30 50 34 5f 4b 45 59 49 4e 46 4f 5f 53 54 41 54 49  P4_KEYINFO_STATI
15e40 43 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  C;.      sqlite3
15e50 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
15e60 5f 4a 75 6d 70 2c 20 6a 32 2c 20 6a 32 2b 34 2c  _Jump, j2, j2+4,
15e70 20 6a 32 29 3b 0a 20 20 20 20 20 20 73 71 6c 69   j2);.      sqli
15e80 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c  te3VdbeAddOp1(v,
15e90 20 4f 50 5f 59 69 65 6c 64 2c 20 72 65 67 41 64   OP_Yield, regAd
15ea0 64 72 42 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  drB);.      sqli
15eb0 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
15ec0 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 6a 32 2b   OP_Goto, 0, j2+
15ed0 31 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  1);.    }.  }.. 
15ee0 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 61 20 73   /* Generate a s
15ef0 75 62 72 6f 75 74 69 6e 65 20 74 6f 20 72 75 6e  ubroutine to run
15f00 20 77 68 65 6e 20 74 68 65 20 72 65 73 75 6c 74   when the result
15f10 73 20 66 72 6f 6d 20 73 65 6c 65 63 74 20 42 0a  s from select B.
15f20 20 20 2a 2a 20 61 72 65 20 65 78 68 61 75 73 74    ** are exhaust
15f30 65 64 20 61 6e 64 20 6f 6e 6c 79 20 64 61 74 61  ed and only data
15f40 20 69 6e 20 73 65 6c 65 63 74 20 41 20 72 65 6d   in select A rem
15f50 61 69 6e 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  ains..  */.  if(
15f60 20 6f 70 3d 3d 54 4b 5f 49 4e 54 45 52 53 45 43   op==TK_INTERSEC
15f70 54 20 29 7b 0a 20 20 20 20 61 64 64 72 45 6f 66  T ){.    addrEof
15f80 42 20 3d 20 61 64 64 72 45 6f 66 41 3b 0a 20 20  B = addrEofA;.  
15f90 7d 65 6c 73 65 7b 20 20 0a 20 20 20 20 56 64 62  }else{  .    Vdb
15fa0 65 4e 6f 6f 70 43 6f 6d 6d 65 6e 74 28 28 76 2c  eNoopComment((v,
15fb0 20 22 65 6f 66 2d 42 20 73 75 62 72 6f 75 74 69   "eof-B subrouti
15fc0 6e 65 22 29 29 3b 0a 20 20 20 20 61 64 64 72 45  ne"));.    addrE
15fd0 6f 66 42 20 3d 20 73 71 6c 69 74 65 33 56 64 62  ofB = sqlite3Vdb
15fe0 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b  eCurrentAddr(v);
15ff0 0a 20 20 20 20 69 66 28 20 6f 70 3d 3d 54 4b 5f  .    if( op==TK_
16000 41 4c 4c 20 7c 7c 20 6f 70 3d 3d 54 4b 5f 45 58  ALL || op==TK_EX
16010 43 45 50 54 20 29 7b 0a 20 20 20 20 20 20 6a 32  CEPT ){.      j2
16020 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   = sqlite3VdbeAd
16030 64 4f 70 32 28 76 2c 20 4f 50 5f 49 66 2c 20 72  dOp2(v, OP_If, r
16040 65 67 45 6f 66 41 2c 20 6c 61 62 65 6c 45 6e 64  egEofA, labelEnd
16050 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
16060 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
16070 5f 47 6f 73 75 62 2c 20 72 65 67 4f 75 74 41 2c  _Gosub, regOutA,
16080 20 61 64 64 72 4f 75 74 41 29 3b 0a 20 20 20 20   addrOutA);.    
16090 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
160a0 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20  Op2(v, OP_Goto, 
160b0 30 2c 20 6a 32 29 3b 0a 20 20 20 20 7d 65 6c 73  0, j2);.    }els
160c0 65 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  e{.      assert(
160d0 20 6f 70 3d 3d 54 4b 5f 55 4e 49 4f 4e 20 29 3b   op==TK_UNION );
160e0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
160f0 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49  beAddOp2(v, OP_I
16100 66 2c 20 72 65 67 45 6f 66 41 2c 20 6c 61 62 65  f, regEofA, labe
16110 6c 45 6e 64 29 3b 0a 20 20 20 20 20 20 73 71 6c  lEnd);.      sql
16120 69 74 65 33 45 78 70 72 43 6f 64 65 43 6f 70 79  ite3ExprCodeCopy
16130 28 70 50 61 72 73 65 2c 20 64 65 73 74 41 2e 69  (pParse, destA.i
16140 4d 65 6d 2c 20 64 65 73 74 42 2e 69 4d 65 6d 2c  Mem, destB.iMem,
16150 20 64 65 73 74 41 2e 6e 4d 65 6d 29 3b 0a 20 20   destA.nMem);.  
16160 20 20 20 20 6a 32 20 3d 20 73 71 6c 69 74 65 33      j2 = sqlite3
16170 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
16180 5f 47 6f 73 75 62 2c 20 72 65 67 4f 75 74 41 2c  _Gosub, regOutA,
16190 20 61 64 64 72 4f 75 74 41 29 3b 0a 20 20 20 20   addrOutA);.    
161a0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
161b0 4f 70 32 28 76 2c 20 4f 50 5f 49 66 2c 20 72 65  Op2(v, OP_If, re
161c0 67 45 6f 66 41 2c 20 6c 61 62 65 6c 45 6e 64 29  gEofA, labelEnd)
161d0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
161e0 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f  dbeAddOp4(v, OP_
161f0 43 6f 6d 70 61 72 65 2c 20 64 65 73 74 41 2e 69  Compare, destA.i
16200 4d 65 6d 2c 20 64 65 73 74 42 2e 69 4d 65 6d 2c  Mem, destB.iMem,
16210 20 64 65 73 74 42 2e 6e 4d 65 6d 2c 0a 20 20 20   destB.nMem,.   
16220 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16230 20 20 20 20 20 20 20 20 28 63 68 61 72 2a 29 70          (char*)p
16240 4b 65 79 49 6e 66 6f 2c 20 70 34 74 79 70 65 29  KeyInfo, p4type)
16250 3b 0a 20 20 20 20 20 20 70 34 74 79 70 65 20 3d  ;.      p4type =
16260 20 50 34 5f 4b 45 59 49 4e 46 4f 5f 53 54 41 54   P4_KEYINFO_STAT
16270 49 43 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  IC;.      sqlite
16280 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
16290 50 5f 4a 75 6d 70 2c 20 6a 32 2c 20 6a 32 2b 34  P_Jump, j2, j2+4
162a0 2c 20 6a 32 29 3b 0a 20 20 20 20 20 20 73 71 6c  , j2);.      sql
162b0 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76  ite3VdbeAddOp1(v
162c0 2c 20 4f 50 5f 59 69 65 6c 64 2c 20 72 65 67 41  , OP_Yield, regA
162d0 64 64 72 41 29 3b 0a 20 20 20 20 20 20 73 71 6c  ddrA);.      sql
162e0 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
162f0 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 6a 32  , OP_Goto, 0, j2
16300 2b 31 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  +1);.    }.  }..
16310 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f    /* Generate co
16320 64 65 20 74 6f 20 68 61 6e 64 6c 65 20 74 68 65  de to handle the
16330 20 63 61 73 65 20 6f 66 20 41 3c 42 0a 20 20 2a   case of A<B.  *
16340 2f 0a 20 20 56 64 62 65 4e 6f 6f 70 43 6f 6d 6d  /.  VdbeNoopComm
16350 65 6e 74 28 28 76 2c 20 22 41 2d 6c 74 2d 42 20  ent((v, "A-lt-B 
16360 73 75 62 72 6f 75 74 69 6e 65 22 29 29 3b 0a 20  subroutine"));. 
16370 20 61 64 64 72 41 6c 74 42 20 3d 20 73 71 6c 69   addrAltB = sqli
16380 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64  te3VdbeCurrentAd
16390 64 72 28 76 29 3b 0a 20 20 69 66 28 20 6f 70 3d  dr(v);.  if( op=
163a0 3d 54 4b 5f 49 4e 54 45 52 53 45 43 54 20 29 7b  =TK_INTERSECT ){
163b0 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
163c0 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 59 69 65  AddOp1(v, OP_Yie
163d0 6c 64 2c 20 72 65 67 41 64 64 72 41 29 3b 0a 20  ld, regAddrA);. 
163e0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69   }else{.    sqli
163f0 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
16400 20 4f 50 5f 47 6f 73 75 62 2c 20 72 65 67 4f 75   OP_Gosub, regOu
16410 74 41 2c 20 61 64 64 72 4f 75 74 41 29 3b 0a 20  tA, addrOutA);. 
16420 20 7d 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65   }.  sqlite3Vdbe
16430 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 66 2c  AddOp2(v, OP_If,
16440 20 72 65 67 45 6f 66 41 2c 20 61 64 64 72 45 6f   regEofA, addrEo
16450 66 41 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64  fA);.  sqlite3Vd
16460 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47  beAddOp2(v, OP_G
16470 6f 74 6f 2c 20 30 2c 20 6c 61 62 65 6c 43 6d 70  oto, 0, labelCmp
16480 72 29 3b 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61  r);..  /* Genera
16490 74 65 20 63 6f 64 65 20 74 6f 20 68 61 6e 64 6c  te code to handl
164a0 65 20 74 68 65 20 63 61 73 65 20 6f 66 20 41 3d  e the case of A=
164b0 3d 42 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6f 70  =B.  */.  if( op
164c0 3d 3d 54 4b 5f 41 4c 4c 20 29 7b 0a 20 20 20 20  ==TK_ALL ){.    
164d0 61 64 64 72 41 65 71 42 20 3d 20 61 64 64 72 41  addrAeqB = addrA
164e0 6c 74 42 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  ltB;.  }else{.  
164f0 20 20 56 64 62 65 4e 6f 6f 70 43 6f 6d 6d 65 6e    VdbeNoopCommen
16500 74 28 28 76 2c 20 22 41 2d 65 71 2d 42 20 73 75  t((v, "A-eq-B su
16510 62 72 6f 75 74 69 6e 65 22 29 29 3b 0a 20 20 20  broutine"));.   
16520 20 61 64 64 72 41 65 71 42 20 3d 20 73 71 6c 69   addrAeqB = sqli
16530 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64  te3VdbeCurrentAd
16540 64 72 28 76 29 3b 0a 20 20 20 20 69 66 28 20 6f  dr(v);.    if( o
16550 70 3d 3d 54 4b 5f 49 4e 54 45 52 53 45 43 54 20  p==TK_INTERSECT 
16560 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
16570 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
16580 5f 47 6f 73 75 62 2c 20 72 65 67 4f 75 74 41 2c  _Gosub, regOutA,
16590 20 61 64 64 72 4f 75 74 41 29 3b 0a 20 20 20 20   addrOutA);.    
165a0 20 20 6a 32 20 3d 20 73 71 6c 69 74 65 33 56 64    j2 = sqlite3Vd
165b0 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 59  beAddOp1(v, OP_Y
165c0 69 65 6c 64 2c 20 72 65 67 41 64 64 72 41 29 3b  ield, regAddrA);
165d0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
165e0 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49  beAddOp2(v, OP_I
165f0 66 2c 20 72 65 67 45 6f 66 41 2c 20 61 64 64 72  f, regEofA, addr
16600 45 6f 66 41 29 3b 0a 20 20 20 20 20 20 73 71 6c  EofA);.      sql
16610 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76  ite3VdbeAddOp4(v
16620 2c 20 4f 50 5f 43 6f 6d 70 61 72 65 2c 20 64 65  , OP_Compare, de
16630 73 74 41 2e 69 4d 65 6d 2c 20 64 65 73 74 42 2e  stA.iMem, destB.
16640 69 4d 65 6d 2c 20 64 65 73 74 41 2e 6e 4d 65 6d  iMem, destA.nMem
16650 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
16660 20 20 20 20 20 20 20 20 20 20 20 20 20 28 63 68               (ch
16670 61 72 2a 29 70 4b 65 79 49 6e 66 6f 2c 20 70 34  ar*)pKeyInfo, p4
16680 74 79 70 65 29 3b 0a 20 20 20 20 20 20 70 34 74  type);.      p4t
16690 79 70 65 20 3d 20 50 34 5f 4b 45 59 49 4e 46 4f  ype = P4_KEYINFO
166a0 5f 53 54 41 54 49 43 3b 0a 20 20 20 20 20 20 6a  _STATIC;.      j
166b0 33 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43  3 = sqlite3VdbeC
166c0 75 72 72 65 6e 74 41 64 64 72 28 76 29 2b 31 3b  urrentAddr(v)+1;
166d0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
166e0 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4a  beAddOp3(v, OP_J
166f0 75 6d 70 2c 20 6a 33 2c 20 6a 32 2c 20 6a 33 29  ump, j3, j2, j3)
16700 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
16710 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
16720 47 6f 74 6f 2c 20 30 2c 20 6c 61 62 65 6c 43 6d  Goto, 0, labelCm
16730 70 72 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  pr);.    }else{.
16740 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
16750 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 59 69  eAddOp1(v, OP_Yi
16760 65 6c 64 2c 20 72 65 67 41 64 64 72 41 29 3b 0a  eld, regAddrA);.
16770 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
16780 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 66  eAddOp2(v, OP_If
16790 2c 20 72 65 67 45 6f 66 41 2c 20 61 64 64 72 45  , regEofA, addrE
167a0 6f 66 41 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  ofA);.      sqli
167b0 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
167c0 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 6c 61 62   OP_Goto, 0, lab
167d0 65 6c 43 6d 70 72 29 3b 0a 20 20 20 20 7d 0a 20  elCmpr);.    }. 
167e0 20 7d 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74   }..  /* Generat
167f0 65 20 63 6f 64 65 20 74 6f 20 68 61 6e 64 6c 65  e code to handle
16800 20 74 68 65 20 63 61 73 65 20 6f 66 20 41 3e 42   the case of A>B
16810 0a 20 20 2a 2f 0a 20 20 56 64 62 65 4e 6f 6f 70  .  */.  VdbeNoop
16820 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 41 2d 67  Comment((v, "A-g
16830 74 2d 42 20 73 75 62 72 6f 75 74 69 6e 65 22 29  t-B subroutine")
16840 29 3b 0a 20 20 61 64 64 72 41 67 74 42 20 3d 20  );.  addrAgtB = 
16850 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65  sqlite3VdbeCurre
16860 6e 74 41 64 64 72 28 76 29 3b 0a 20 20 69 66 28  ntAddr(v);.  if(
16870 20 6f 70 3d 3d 54 4b 5f 41 4c 4c 20 7c 7c 20 6f   op==TK_ALL || o
16880 70 3d 3d 54 4b 5f 55 4e 49 4f 4e 20 29 7b 0a 20  p==TK_UNION ){. 
16890 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
168a0 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 73 75 62  dOp2(v, OP_Gosub
168b0 2c 20 72 65 67 4f 75 74 42 2c 20 61 64 64 72 4f  , regOutB, addrO
168c0 75 74 42 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  utB);.  }else{. 
168d0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
168e0 64 4f 70 31 28 76 2c 20 4f 50 5f 59 69 65 6c 64  dOp1(v, OP_Yield
168f0 2c 20 72 65 67 41 64 64 72 42 29 3b 0a 20 20 7d  , regAddrB);.  }
16900 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  .  sqlite3VdbeAd
16910 64 4f 70 32 28 76 2c 20 4f 50 5f 49 66 2c 20 72  dOp2(v, OP_If, r
16920 65 67 45 6f 66 42 2c 20 61 64 64 72 45 6f 66 42  egEofB, addrEofB
16930 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  );.  sqlite3Vdbe
16940 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 74  AddOp2(v, OP_Got
16950 6f 2c 20 30 2c 20 6c 61 62 65 6c 43 6d 70 72 29  o, 0, labelCmpr)
16960 3b 0a 0a 20 20 2f 2a 20 54 68 69 73 20 63 6f 64  ;..  /* This cod
16970 65 20 72 75 6e 73 20 6f 6e 63 65 20 74 6f 20 69  e runs once to i
16980 6e 69 74 69 61 6c 69 7a 65 20 65 76 65 72 79 74  nitialize everyt
16990 68 69 6e 67 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c  hing..  */.  sql
169a0 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65  ite3VdbeJumpHere
169b0 28 76 2c 20 6a 31 29 3b 0a 20 20 73 71 6c 69 74  (v, j1);.  sqlit
169c0 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
169d0 4f 50 5f 49 6e 74 65 67 65 72 2c 20 30 2c 20 72  OP_Integer, 0, r
169e0 65 67 45 6f 66 41 29 3b 0a 20 20 73 71 6c 69 74  egEofA);.  sqlit
169f0 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
16a00 4f 50 5f 49 6e 74 65 67 65 72 2c 20 30 2c 20 72  OP_Integer, 0, r
16a10 65 67 45 6f 66 42 29 3b 0a 20 20 73 71 6c 69 74  egEofB);.  sqlit
16a20 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
16a30 4f 50 5f 49 6e 74 65 67 65 72 2c 20 61 64 64 72  OP_Integer, addr
16a40 53 65 6c 65 63 74 42 2c 20 72 65 67 41 64 64 72  SelectB, regAddr
16a50 42 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  B);.  sqlite3Vdb
16a60 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f  eAddOp2(v, OP_Go
16a70 73 75 62 2c 20 72 65 67 41 64 64 72 41 2c 20 61  sub, regAddrA, a
16a80 64 64 72 53 65 6c 65 63 74 41 29 3b 0a 20 20 73  ddrSelectA);.  s
16a90 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
16aa0 28 76 2c 20 4f 50 5f 49 66 2c 20 72 65 67 45 6f  (v, OP_If, regEo
16ab0 66 41 2c 20 61 64 64 72 45 6f 66 41 29 3b 0a 20  fA, addrEofA);. 
16ac0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
16ad0 70 31 28 76 2c 20 4f 50 5f 59 69 65 6c 64 2c 20  p1(v, OP_Yield, 
16ae0 72 65 67 41 64 64 72 42 29 3b 0a 20 20 73 71 6c  regAddrB);.  sql
16af0 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
16b00 2c 20 4f 50 5f 49 66 2c 20 72 65 67 45 6f 66 42  , OP_If, regEofB
16b10 2c 20 61 64 64 72 45 6f 66 42 29 3b 0a 0a 20 20  , addrEofB);..  
16b20 2f 2a 20 49 6d 70 6c 65 6d 65 6e 74 20 74 68 65  /* Implement the
16b30 20 6d 61 69 6e 20 6d 65 72 67 65 20 6c 6f 6f 70   main merge loop
16b40 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 56  .  */.  sqlite3V
16b50 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28  dbeResolveLabel(
16b60 76 2c 20 6c 61 62 65 6c 43 6d 70 72 29 3b 0a 20  v, labelCmpr);. 
16b70 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
16b80 70 34 28 76 2c 20 4f 50 5f 43 6f 6d 70 61 72 65  p4(v, OP_Compare
16b90 2c 20 64 65 73 74 41 2e 69 4d 65 6d 2c 20 64 65  , destA.iMem, de
16ba0 73 74 42 2e 69 4d 65 6d 2c 20 64 65 73 74 41 2e  stB.iMem, destA.
16bb0 6e 4d 65 6d 2c 0a 20 20 20 20 20 20 20 20 20 20  nMem,.          
16bc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28                 (
16bd0 63 68 61 72 2a 29 70 4b 65 79 49 6e 66 6f 2c 20  char*)pKeyInfo, 
16be0 70 34 74 79 70 65 29 3b 0a 20 20 70 34 74 79 70  p4type);.  p4typ
16bf0 65 20 3d 20 50 34 5f 4b 45 59 49 4e 46 4f 5f 53  e = P4_KEYINFO_S
16c00 54 41 54 49 43 3b 0a 20 20 73 71 6c 69 74 65 33  TATIC;.  sqlite3
16c10 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
16c20 5f 4a 75 6d 70 2c 20 61 64 64 72 41 6c 74 42 2c  _Jump, addrAltB,
16c30 20 61 64 64 72 41 65 71 42 2c 20 61 64 64 72 41   addrAeqB, addrA
16c40 67 74 42 29 3b 0a 0a 20 20 2f 2a 20 4a 75 6d 70  gtB);..  /* Jump
16c50 20 74 6f 20 74 68 65 20 74 68 69 73 20 70 6f 69   to the this poi
16c60 6e 74 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 74  nt in order to t
16c70 65 72 6d 69 6e 61 74 65 20 74 68 65 20 71 75 65  erminate the que
16c80 72 79 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74  ry..  */.  sqlit
16c90 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62  e3VdbeResolveLab
16ca0 65 6c 28 76 2c 20 6c 61 62 65 6c 45 6e 64 29 3b  el(v, labelEnd);
16cb0 0a 0a 20 20 2f 2a 20 53 65 74 20 74 68 65 20 6e  ..  /* Set the n
16cc0 75 6d 62 65 72 20 6f 66 20 6f 75 74 70 75 74 20  umber of output 
16cd0 63 6f 6c 75 6d 6e 73 0a 20 20 2a 2f 0a 20 20 69  columns.  */.  i
16ce0 66 28 20 70 44 65 73 74 2d 3e 65 44 65 73 74 3d  f( pDest->eDest=
16cf0 3d 53 52 54 5f 43 61 6c 6c 62 61 63 6b 20 29 7b  =SRT_Callback ){
16d00 0a 20 20 20 20 53 65 6c 65 63 74 20 2a 70 46 69  .    Select *pFi
16d10 72 73 74 20 3d 20 70 3b 0a 20 20 20 20 77 68 69  rst = p;.    whi
16d20 6c 65 28 20 70 46 69 72 73 74 2d 3e 70 50 72 69  le( pFirst->pPri
16d30 6f 72 20 29 20 70 46 69 72 73 74 20 3d 20 70 46  or ) pFirst = pF
16d40 69 72 73 74 2d 3e 70 50 72 69 6f 72 3b 0a 20 20  irst->pPrior;.  
16d50 20 20 67 65 6e 65 72 61 74 65 43 6f 6c 75 6d 6e    generateColumn
16d60 4e 61 6d 65 73 28 70 50 61 72 73 65 2c 20 30 2c  Names(pParse, 0,
16d70 20 70 46 69 72 73 74 2d 3e 70 45 4c 69 73 74 29   pFirst->pEList)
16d80 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46 72 65 65  ;.  }..  /* Free
16d90 20 74 68 65 20 4b 65 79 49 6e 66 6f 20 69 66 20   the KeyInfo if 
16da0 75 6e 75 73 65 64 2e 0a 20 20 2a 2f 0a 20 20 69  unused..  */.  i
16db0 66 28 20 70 34 74 79 70 65 3d 3d 50 34 5f 4b 45  f( p4type==P4_KE
16dc0 59 49 4e 46 4f 5f 48 41 4e 44 4f 46 46 20 29 7b  YINFO_HANDOFF ){
16dd0 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65  .    sqlite3_fre
16de0 65 28 70 4b 65 79 49 6e 66 6f 29 3b 0a 20 20 7d  e(pKeyInfo);.  }
16df0 0a 0a 20 20 2f 2a 2a 2a 20 54 42 44 3a 20 20 49  ..  /*** TBD:  I
16e00 6e 73 65 72 74 20 73 75 62 72 6f 75 74 69 6e 65  nsert subroutine
16e10 20 63 61 6c 6c 73 20 74 6f 20 63 6c 6f 73 65 20   calls to close 
16e20 63 75 72 73 6f 72 73 20 6f 6e 20 69 6e 63 6f 6d  cursors on incom
16e30 70 6c 65 74 65 0a 20 20 2a 2a 2a 2a 20 73 75 62  plete.  **** sub
16e40 71 75 65 72 69 65 73 20 2a 2a 2a 2a 2f 0a 20 20  queries ****/.  
16e50 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
16e60 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c  ;.}..#ifndef SQL
16e70 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 0a 2f 2a  ITE_OMIT_VIEW./*
16e80 20 46 6f 72 77 61 72 64 20 44 65 63 6c 61 72 61   Forward Declara
16e90 74 69 6f 6e 73 20 2a 2f 0a 73 74 61 74 69 63 20  tions */.static 
16ea0 76 6f 69 64 20 73 75 62 73 74 45 78 70 72 4c 69  void substExprLi
16eb0 73 74 28 73 71 6c 69 74 65 33 2a 2c 20 45 78 70  st(sqlite3*, Exp
16ec0 72 4c 69 73 74 2a 2c 20 69 6e 74 2c 20 45 78 70  rList*, int, Exp
16ed0 72 4c 69 73 74 2a 29 3b 0a 73 74 61 74 69 63 20  rList*);.static 
16ee0 76 6f 69 64 20 73 75 62 73 74 53 65 6c 65 63 74  void substSelect
16ef0 28 73 71 6c 69 74 65 33 2a 2c 20 53 65 6c 65 63  (sqlite3*, Selec
16f00 74 20 2a 2c 20 69 6e 74 2c 20 45 78 70 72 4c 69  t *, int, ExprLi
16f10 73 74 20 2a 29 3b 0a 0a 2f 2a 0a 2a 2a 20 53 63  st *);../*.** Sc
16f20 61 6e 20 74 68 72 6f 75 67 68 20 74 68 65 20 65  an through the e
16f30 78 70 72 65 73 73 69 6f 6e 20 70 45 78 70 72 2e  xpression pExpr.
16f40 20 20 52 65 70 6c 61 63 65 20 65 76 65 72 79 20    Replace every 
16f50 72 65 66 65 72 65 6e 63 65 20 74 6f 0a 2a 2a 20  reference to.** 
16f60 61 20 63 6f 6c 75 6d 6e 20 69 6e 20 74 61 62 6c  a column in tabl
16f70 65 20 6e 75 6d 62 65 72 20 69 54 61 62 6c 65 20  e number iTable 
16f80 77 69 74 68 20 61 20 63 6f 70 79 20 6f 66 20 74  with a copy of t
16f90 68 65 20 69 43 6f 6c 75 6d 6e 2d 74 68 0a 2a 2a  he iColumn-th.**
16fa0 20 65 6e 74 72 79 20 69 6e 20 70 45 4c 69 73 74   entry in pEList
16fb0 2e 20 20 28 42 75 74 20 6c 65 61 76 65 20 72 65  .  (But leave re
16fc0 66 65 72 65 6e 63 65 73 20 74 6f 20 74 68 65 20  ferences to the 
16fd0 52 4f 57 49 44 20 63 6f 6c 75 6d 6e 20 0a 2a 2a  ROWID column .**
16fe0 20 75 6e 63 68 61 6e 67 65 64 2e 29 0a 2a 2a 0a   unchanged.).**.
16ff0 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
17000 69 73 20 70 61 72 74 20 6f 66 20 74 68 65 20 66  is part of the f
17010 6c 61 74 74 65 6e 69 6e 67 20 70 72 6f 63 65 64  lattening proced
17020 75 72 65 2e 20 20 41 20 73 75 62 71 75 65 72 79  ure.  A subquery
17030 0a 2a 2a 20 77 68 6f 73 65 20 72 65 73 75 6c 74  .** whose result
17040 20 73 65 74 20 69 73 20 64 65 66 69 6e 65 64 20   set is defined 
17050 62 79 20 70 45 4c 69 73 74 20 61 70 70 65 61 72  by pEList appear
17060 73 20 61 73 20 65 6e 74 72 79 20 69 6e 20 74 68  s as entry in th
17070 65 0a 2a 2a 20 46 52 4f 4d 20 63 6c 61 75 73 65  e.** FROM clause
17080 20 6f 66 20 61 20 53 45 4c 45 43 54 20 73 75 63   of a SELECT suc
17090 68 20 74 68 61 74 20 74 68 65 20 56 44 42 45 20  h that the VDBE 
170a0 63 75 72 73 6f 72 20 61 73 73 69 67 6e 65 64 20  cursor assigned 
170b0 74 6f 20 74 68 61 74 0a 2a 2a 20 46 4f 52 4d 20  to that.** FORM 
170c0 63 6c 61 75 73 65 20 65 6e 74 72 79 20 69 73 20  clause entry is 
170d0 69 54 61 62 6c 65 2e 20 20 54 68 69 73 20 72 6f  iTable.  This ro
170e0 75 74 69 6e 65 20 6d 61 6b 65 20 74 68 65 20 6e  utine make the n
170f0 65 63 65 73 73 61 72 79 20 0a 2a 2a 20 63 68 61  ecessary .** cha
17100 6e 67 65 73 20 74 6f 20 70 45 78 70 72 20 73 6f  nges to pExpr so
17110 20 74 68 61 74 20 69 74 20 72 65 66 65 72 73 20   that it refers 
17120 64 69 72 65 63 74 6c 79 20 74 6f 20 74 68 65 20  directly to the 
17130 73 6f 75 72 63 65 20 74 61 62 6c 65 0a 2a 2a 20  source table.** 
17140 6f 66 20 74 68 65 20 73 75 62 71 75 65 72 79 20  of the subquery 
17150 72 61 74 68 65 72 20 74 68 65 20 72 65 73 75 6c  rather the resul
17160 74 20 73 65 74 20 6f 66 20 74 68 65 20 73 75 62  t set of the sub
17170 71 75 65 72 79 2e 0a 2a 2f 0a 73 74 61 74 69 63  query..*/.static
17180 20 76 6f 69 64 20 73 75 62 73 74 45 78 70 72 28   void substExpr(
17190 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  .  sqlite3 *db, 
171a0 20 20 20 20 20 20 20 2f 2a 20 52 65 70 6f 72 74         /* Report
171b0 20 6d 61 6c 6c 6f 63 20 65 72 72 6f 72 73 20 74   malloc errors t
171c0 6f 20 74 68 69 73 20 63 6f 6e 6e 65 63 74 69 6f  o this connectio
171d0 6e 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 45 78  n */.  Expr *pEx
171e0 70 72 2c 20 20 20 20 20 20 20 20 2f 2a 20 45 78  pr,        /* Ex
171f0 70 72 20 69 6e 20 77 68 69 63 68 20 73 75 62 73  pr in which subs
17200 74 69 74 75 74 69 6f 6e 20 6f 63 63 75 72 73 20  titution occurs 
17210 2a 2f 0a 20 20 69 6e 74 20 69 54 61 62 6c 65 2c  */.  int iTable,
17220 20 20 20 20 20 20 20 20 20 2f 2a 20 54 61 62 6c           /* Tabl
17230 65 20 74 6f 20 62 65 20 73 75 62 73 74 69 74 75  e to be substitu
17240 74 65 64 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73  ted */.  ExprLis
17250 74 20 2a 70 45 4c 69 73 74 20 20 20 20 2f 2a 20  t *pEList    /* 
17260 53 75 62 73 74 69 74 75 74 65 20 65 78 70 72 65  Substitute expre
17270 73 73 69 6f 6e 73 20 2a 2f 0a 29 7b 0a 20 20 69  ssions */.){.  i
17280 66 28 20 70 45 78 70 72 3d 3d 30 20 29 20 72 65  f( pExpr==0 ) re
17290 74 75 72 6e 3b 0a 20 20 69 66 28 20 70 45 78 70  turn;.  if( pExp
172a0 72 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e  r->op==TK_COLUMN
172b0 20 26 26 20 70 45 78 70 72 2d 3e 69 54 61 62 6c   && pExpr->iTabl
172c0 65 3d 3d 69 54 61 62 6c 65 20 29 7b 0a 20 20 20  e==iTable ){.   
172d0 20 69 66 28 20 70 45 78 70 72 2d 3e 69 43 6f 6c   if( pExpr->iCol
172e0 75 6d 6e 3c 30 20 29 7b 0a 20 20 20 20 20 20 70  umn<0 ){.      p
172f0 45 78 70 72 2d 3e 6f 70 20 3d 20 54 4b 5f 4e 55  Expr->op = TK_NU
17300 4c 4c 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  LL;.    }else{. 
17310 20 20 20 20 20 45 78 70 72 20 2a 70 4e 65 77 3b       Expr *pNew;
17320 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
17330 45 4c 69 73 74 21 3d 30 20 26 26 20 70 45 78 70  EList!=0 && pExp
17340 72 2d 3e 69 43 6f 6c 75 6d 6e 3c 70 45 4c 69 73  r->iColumn<pELis
17350 74 2d 3e 6e 45 78 70 72 20 29 3b 0a 20 20 20 20  t->nExpr );.    
17360 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d    assert( pExpr-
17370 3e 70 4c 65 66 74 3d 3d 30 20 26 26 20 70 45 78  >pLeft==0 && pEx
17380 70 72 2d 3e 70 52 69 67 68 74 3d 3d 30 20 26 26  pr->pRight==0 &&
17390 20 70 45 78 70 72 2d 3e 70 4c 69 73 74 3d 3d 30   pExpr->pList==0
173a0 20 29 3b 0a 20 20 20 20 20 20 70 4e 65 77 20 3d   );.      pNew =
173b0 20 70 45 4c 69 73 74 2d 3e 61 5b 70 45 78 70 72   pEList->a[pExpr
173c0 2d 3e 69 43 6f 6c 75 6d 6e 5d 2e 70 45 78 70 72  ->iColumn].pExpr
173d0 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
173e0 70 4e 65 77 21 3d 30 20 29 3b 0a 20 20 20 20 20  pNew!=0 );.     
173f0 20 70 45 78 70 72 2d 3e 6f 70 20 3d 20 70 4e 65   pExpr->op = pNe
17400 77 2d 3e 6f 70 3b 0a 20 20 20 20 20 20 61 73 73  w->op;.      ass
17410 65 72 74 28 20 70 45 78 70 72 2d 3e 70 4c 65 66  ert( pExpr->pLef
17420 74 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 70 45  t==0 );.      pE
17430 78 70 72 2d 3e 70 4c 65 66 74 20 3d 20 73 71 6c  xpr->pLeft = sql
17440 69 74 65 33 45 78 70 72 44 75 70 28 64 62 2c 20  ite3ExprDup(db, 
17450 70 4e 65 77 2d 3e 70 4c 65 66 74 29 3b 0a 20 20  pNew->pLeft);.  
17460 20 20 20 20 61 73 73 65 72 74 28 20 70 45 78 70      assert( pExp
17470 72 2d 3e 70 52 69 67 68 74 3d 3d 30 20 29 3b 0a  r->pRight==0 );.
17480 20 20 20 20 20 20 70 45 78 70 72 2d 3e 70 52 69        pExpr->pRi
17490 67 68 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70  ght = sqlite3Exp
174a0 72 44 75 70 28 64 62 2c 20 70 4e 65 77 2d 3e 70  rDup(db, pNew->p
174b0 52 69 67 68 74 29 3b 0a 20 20 20 20 20 20 61 73  Right);.      as
174c0 73 65 72 74 28 20 70 45 78 70 72 2d 3e 70 4c 69  sert( pExpr->pLi
174d0 73 74 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 70  st==0 );.      p
174e0 45 78 70 72 2d 3e 70 4c 69 73 74 20 3d 20 73 71  Expr->pList = sq
174f0 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 75 70  lite3ExprListDup
17500 28 64 62 2c 20 70 4e 65 77 2d 3e 70 4c 69 73 74  (db, pNew->pList
17510 29 3b 0a 20 20 20 20 20 20 70 45 78 70 72 2d 3e  );.      pExpr->
17520 69 54 61 62 6c 65 20 3d 20 70 4e 65 77 2d 3e 69  iTable = pNew->i
17530 54 61 62 6c 65 3b 0a 20 20 20 20 20 20 70 45 78  Table;.      pEx
17540 70 72 2d 3e 70 54 61 62 20 3d 20 70 4e 65 77 2d  pr->pTab = pNew-
17550 3e 70 54 61 62 3b 0a 20 20 20 20 20 20 70 45 78  >pTab;.      pEx
17560 70 72 2d 3e 69 43 6f 6c 75 6d 6e 20 3d 20 70 4e  pr->iColumn = pN
17570 65 77 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20  ew->iColumn;.   
17580 20 20 20 70 45 78 70 72 2d 3e 69 41 67 67 20 3d     pExpr->iAgg =
17590 20 70 4e 65 77 2d 3e 69 41 67 67 3b 0a 20 20 20   pNew->iAgg;.   
175a0 20 20 20 73 71 6c 69 74 65 33 54 6f 6b 65 6e 43     sqlite3TokenC
175b0 6f 70 79 28 64 62 2c 20 26 70 45 78 70 72 2d 3e  opy(db, &pExpr->
175c0 74 6f 6b 65 6e 2c 20 26 70 4e 65 77 2d 3e 74 6f  token, &pNew->to
175d0 6b 65 6e 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  ken);.      sqli
175e0 74 65 33 54 6f 6b 65 6e 43 6f 70 79 28 64 62 2c  te3TokenCopy(db,
175f0 20 26 70 45 78 70 72 2d 3e 73 70 61 6e 2c 20 26   &pExpr->span, &
17600 70 4e 65 77 2d 3e 73 70 61 6e 29 3b 0a 20 20 20  pNew->span);.   
17610 20 20 20 70 45 78 70 72 2d 3e 70 53 65 6c 65 63     pExpr->pSelec
17620 74 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63  t = sqlite3Selec
17630 74 44 75 70 28 64 62 2c 20 70 4e 65 77 2d 3e 70  tDup(db, pNew->p
17640 53 65 6c 65 63 74 29 3b 0a 20 20 20 20 20 20 70  Select);.      p
17650 45 78 70 72 2d 3e 66 6c 61 67 73 20 3d 20 70 4e  Expr->flags = pN
17660 65 77 2d 3e 66 6c 61 67 73 3b 0a 20 20 20 20 7d  ew->flags;.    }
17670 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 75  .  }else{.    su
17680 62 73 74 45 78 70 72 28 64 62 2c 20 70 45 78 70  bstExpr(db, pExp
17690 72 2d 3e 70 4c 65 66 74 2c 20 69 54 61 62 6c 65  r->pLeft, iTable
176a0 2c 20 70 45 4c 69 73 74 29 3b 0a 20 20 20 20 73  , pEList);.    s
176b0 75 62 73 74 45 78 70 72 28 64 62 2c 20 70 45 78  ubstExpr(db, pEx
176c0 70 72 2d 3e 70 52 69 67 68 74 2c 20 69 54 61 62  pr->pRight, iTab
176d0 6c 65 2c 20 70 45 4c 69 73 74 29 3b 0a 20 20 20  le, pEList);.   
176e0 20 73 75 62 73 74 53 65 6c 65 63 74 28 64 62 2c   substSelect(db,
176f0 20 70 45 78 70 72 2d 3e 70 53 65 6c 65 63 74 2c   pExpr->pSelect,
17700 20 69 54 61 62 6c 65 2c 20 70 45 4c 69 73 74 29   iTable, pEList)
17710 3b 0a 20 20 20 20 73 75 62 73 74 45 78 70 72 4c  ;.    substExprL
17720 69 73 74 28 64 62 2c 20 70 45 78 70 72 2d 3e 70  ist(db, pExpr->p
17730 4c 69 73 74 2c 20 69 54 61 62 6c 65 2c 20 70 45  List, iTable, pE
17740 4c 69 73 74 29 3b 0a 20 20 7d 0a 7d 0a 73 74 61  List);.  }.}.sta
17750 74 69 63 20 76 6f 69 64 20 73 75 62 73 74 45 78  tic void substEx
17760 70 72 4c 69 73 74 28 0a 20 20 73 71 6c 69 74 65  prList(.  sqlite
17770 33 20 2a 64 62 2c 20 20 20 20 20 20 20 20 20 2f  3 *db,         /
17780 2a 20 52 65 70 6f 72 74 20 6d 61 6c 6c 6f 63 20  * Report malloc 
17790 65 72 72 6f 72 73 20 68 65 72 65 20 2a 2f 0a 20  errors here */. 
177a0 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74   ExprList *pList
177b0 2c 20 20 20 20 20 2f 2a 20 4c 69 73 74 20 74 6f  ,     /* List to
177c0 20 73 63 61 6e 20 61 6e 64 20 69 6e 20 77 68 69   scan and in whi
177d0 63 68 20 74 6f 20 6d 61 6b 65 20 73 75 62 73 74  ch to make subst
177e0 69 74 75 74 65 73 20 2a 2f 0a 20 20 69 6e 74 20  itutes */.  int 
177f0 69 54 61 62 6c 65 2c 20 20 20 20 20 20 20 20 20  iTable,         
17800 20 2f 2a 20 54 61 62 6c 65 20 74 6f 20 62 65 20   /* Table to be 
17810 73 75 62 73 74 69 74 75 74 65 64 20 2a 2f 0a 20  substituted */. 
17820 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73   ExprList *pELis
17830 74 20 20 20 20 20 2f 2a 20 53 75 62 73 74 69 74  t     /* Substit
17840 75 74 65 20 76 61 6c 75 65 73 20 2a 2f 0a 29 7b  ute values */.){
17850 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 66 28 20  .  int i;.  if( 
17860 70 4c 69 73 74 3d 3d 30 20 29 20 72 65 74 75 72  pList==0 ) retur
17870 6e 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  n;.  for(i=0; i<
17880 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b  pList->nExpr; i+
17890 2b 29 7b 0a 20 20 20 20 73 75 62 73 74 45 78 70  +){.    substExp
178a0 72 28 64 62 2c 20 70 4c 69 73 74 2d 3e 61 5b 69  r(db, pList->a[i
178b0 5d 2e 70 45 78 70 72 2c 20 69 54 61 62 6c 65 2c  ].pExpr, iTable,
178c0 20 70 45 4c 69 73 74 29 3b 0a 20 20 7d 0a 7d 0a   pEList);.  }.}.
178d0 73 74 61 74 69 63 20 76 6f 69 64 20 73 75 62 73  static void subs
178e0 74 53 65 6c 65 63 74 28 0a 20 20 73 71 6c 69 74  tSelect(.  sqlit
178f0 65 33 20 2a 64 62 2c 20 20 20 20 20 20 20 20 20  e3 *db,         
17900 2f 2a 20 52 65 70 6f 72 74 20 6d 61 6c 6c 6f 63  /* Report malloc
17910 20 65 72 72 6f 72 73 20 68 65 72 65 20 2a 2f 0a   errors here */.
17920 20 20 53 65 6c 65 63 74 20 2a 70 2c 20 20 20 20    Select *p,    
17930 20 20 20 20 20 20 20 2f 2a 20 53 45 4c 45 43 54         /* SELECT
17940 20 73 74 61 74 65 6d 65 6e 74 20 69 6e 20 77 68   statement in wh
17950 69 63 68 20 74 6f 20 6d 61 6b 65 20 73 75 62 73  ich to make subs
17960 74 69 74 75 74 69 6f 6e 73 20 2a 2f 0a 20 20 69  titutions */.  i
17970 6e 74 20 69 54 61 62 6c 65 2c 20 20 20 20 20 20  nt iTable,      
17980 20 20 20 20 2f 2a 20 54 61 62 6c 65 20 74 6f 20      /* Table to 
17990 62 65 20 72 65 70 6c 61 63 65 64 20 2a 2f 0a 20  be replaced */. 
179a0 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73   ExprList *pELis
179b0 74 20 20 20 20 20 2f 2a 20 53 75 62 73 74 69 74  t     /* Substit
179c0 75 74 65 20 76 61 6c 75 65 73 20 2a 2f 0a 29 7b  ute values */.){
179d0 0a 20 20 69 66 28 20 21 70 20 29 20 72 65 74 75  .  if( !p ) retu
179e0 72 6e 3b 0a 20 20 73 75 62 73 74 45 78 70 72 4c  rn;.  substExprL
179f0 69 73 74 28 64 62 2c 20 70 2d 3e 70 45 4c 69 73  ist(db, p->pELis
17a00 74 2c 20 69 54 61 62 6c 65 2c 20 70 45 4c 69 73  t, iTable, pELis
17a10 74 29 3b 0a 20 20 73 75 62 73 74 45 78 70 72 4c  t);.  substExprL
17a20 69 73 74 28 64 62 2c 20 70 2d 3e 70 47 72 6f 75  ist(db, p->pGrou
17a30 70 42 79 2c 20 69 54 61 62 6c 65 2c 20 70 45 4c  pBy, iTable, pEL
17a40 69 73 74 29 3b 0a 20 20 73 75 62 73 74 45 78 70  ist);.  substExp
17a50 72 4c 69 73 74 28 64 62 2c 20 70 2d 3e 70 4f 72  rList(db, p->pOr
17a60 64 65 72 42 79 2c 20 69 54 61 62 6c 65 2c 20 70  derBy, iTable, p
17a70 45 4c 69 73 74 29 3b 0a 20 20 73 75 62 73 74 45  EList);.  substE
17a80 78 70 72 28 64 62 2c 20 70 2d 3e 70 48 61 76 69  xpr(db, p->pHavi
17a90 6e 67 2c 20 69 54 61 62 6c 65 2c 20 70 45 4c 69  ng, iTable, pELi
17aa0 73 74 29 3b 0a 20 20 73 75 62 73 74 45 78 70 72  st);.  substExpr
17ab0 28 64 62 2c 20 70 2d 3e 70 57 68 65 72 65 2c 20  (db, p->pWhere, 
17ac0 69 54 61 62 6c 65 2c 20 70 45 4c 69 73 74 29 3b  iTable, pEList);
17ad0 0a 20 20 73 75 62 73 74 53 65 6c 65 63 74 28 64  .  substSelect(d
17ae0 62 2c 20 70 2d 3e 70 50 72 69 6f 72 2c 20 69 54  b, p->pPrior, iT
17af0 61 62 6c 65 2c 20 70 45 4c 69 73 74 29 3b 0a 7d  able, pEList);.}
17b00 0a 23 65 6e 64 69 66 20 2f 2a 20 21 64 65 66 69  .#endif /* !defi
17b10 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
17b20 56 49 45 57 29 20 2a 2f 0a 0a 23 69 66 6e 64 65  VIEW) */..#ifnde
17b30 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49  f SQLITE_OMIT_VI
17b40 45 57 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  EW./*.** This ro
17b50 75 74 69 6e 65 20 61 74 74 65 6d 70 74 73 20 74  utine attempts t
17b60 6f 20 66 6c 61 74 74 65 6e 20 73 75 62 71 75 65  o flatten subque
17b70 72 69 65 73 20 69 6e 20 6f 72 64 65 72 20 74 6f  ries in order to
17b80 20 73 70 65 65 64 0a 2a 2a 20 65 78 65 63 75 74   speed.** execut
17b90 69 6f 6e 2e 20 20 49 74 20 72 65 74 75 72 6e 73  ion.  It returns
17ba0 20 31 20 69 66 20 69 74 20 6d 61 6b 65 73 20 63   1 if it makes c
17bb0 68 61 6e 67 65 73 20 61 6e 64 20 30 20 69 66 20  hanges and 0 if 
17bc0 6e 6f 20 66 6c 61 74 74 65 6e 69 6e 67 0a 2a 2a  no flattening.**
17bd0 20 6f 63 63 75 72 73 2e 0a 2a 2a 0a 2a 2a 20 54   occurs..**.** T
17be0 6f 20 75 6e 64 65 72 73 74 61 6e 64 20 74 68 65  o understand the
17bf0 20 63 6f 6e 63 65 70 74 20 6f 66 20 66 6c 61 74   concept of flat
17c00 74 65 6e 69 6e 67 2c 20 63 6f 6e 73 69 64 65 72  tening, consider
17c10 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 0a 2a   the following.*
17c20 2a 20 71 75 65 72 79 3a 0a 2a 2a 0a 2a 2a 20 20  * query:.**.**  
17c30 20 20 20 53 45 4c 45 43 54 20 61 20 46 52 4f 4d     SELECT a FROM
17c40 20 28 53 45 4c 45 43 54 20 78 2b 79 20 41 53 20   (SELECT x+y AS 
17c50 61 20 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20  a FROM t1 WHERE 
17c60 7a 3c 31 30 30 29 20 57 48 45 52 45 20 61 3e 35  z<100) WHERE a>5
17c70 0a 2a 2a 0a 2a 2a 20 54 68 65 20 64 65 66 61 75  .**.** The defau
17c80 6c 74 20 77 61 79 20 6f 66 20 69 6d 70 6c 65 6d  lt way of implem
17c90 65 6e 74 69 6e 67 20 74 68 69 73 20 71 75 65 72  enting this quer
17ca0 79 20 69 73 20 74 6f 20 65 78 65 63 75 74 65 20  y is to execute 
17cb0 74 68 65 0a 2a 2a 20 73 75 62 71 75 65 72 79 20  the.** subquery 
17cc0 66 69 72 73 74 20 61 6e 64 20 73 74 6f 72 65 20  first and store 
17cd0 74 68 65 20 72 65 73 75 6c 74 73 20 69 6e 20 61  the results in a
17ce0 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65   temporary table
17cf0 2c 20 74 68 65 6e 0a 2a 2a 20 72 75 6e 20 74 68  , then.** run th
17d00 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 6f 6e  e outer query on
17d10 20 74 68 61 74 20 74 65 6d 70 6f 72 61 72 79 20   that temporary 
17d20 74 61 62 6c 65 2e 20 20 54 68 69 73 20 72 65 71  table.  This req
17d30 75 69 72 65 73 20 74 77 6f 0a 2a 2a 20 70 61 73  uires two.** pas
17d40 73 65 73 20 6f 76 65 72 20 74 68 65 20 64 61 74  ses over the dat
17d50 61 2e 20 20 46 75 72 74 68 65 72 6d 6f 72 65 2c  a.  Furthermore,
17d60 20 62 65 63 61 75 73 65 20 74 68 65 20 74 65 6d   because the tem
17d70 70 6f 72 61 72 79 20 74 61 62 6c 65 0a 2a 2a 20  porary table.** 
17d80 68 61 73 20 6e 6f 20 69 6e 64 69 63 65 73 2c 20  has no indices, 
17d90 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  the WHERE clause
17da0 20 6f 6e 20 74 68 65 20 6f 75 74 65 72 20 71 75   on the outer qu
17db0 65 72 79 20 63 61 6e 6e 6f 74 20 62 65 0a 2a 2a  ery cannot be.**
17dc0 20 6f 70 74 69 6d 69 7a 65 64 2e 0a 2a 2a 0a 2a   optimized..**.*
17dd0 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 61  * This routine a
17de0 74 74 65 6d 70 74 73 20 74 6f 20 72 65 77 72 69  ttempts to rewri
17df0 74 65 20 71 75 65 72 69 65 73 20 73 75 63 68 20  te queries such 
17e00 61 73 20 74 68 65 20 61 62 6f 76 65 20 69 6e 74  as the above int
17e10 6f 0a 2a 2a 20 61 20 73 69 6e 67 6c 65 20 66 6c  o.** a single fl
17e20 61 74 20 73 65 6c 65 63 74 2c 20 6c 69 6b 65 20  at select, like 
17e30 74 68 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20  this:.**.**     
17e40 53 45 4c 45 43 54 20 78 2b 79 20 41 53 20 61 20  SELECT x+y AS a 
17e50 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20 7a 3c  FROM t1 WHERE z<
17e60 31 30 30 20 41 4e 44 20 61 3e 35 0a 2a 2a 0a 2a  100 AND a>5.**.*
17e70 2a 20 54 68 65 20 63 6f 64 65 20 67 65 6e 65 72  * The code gener
17e80 61 74 65 64 20 66 6f 72 20 74 68 69 73 20 73 69  ated for this si
17e90 6d 70 69 66 69 63 61 74 69 6f 6e 20 67 69 76 65  mpification give
17ea0 73 20 74 68 65 20 73 61 6d 65 20 72 65 73 75 6c  s the same resul
17eb0 74 0a 2a 2a 20 62 75 74 20 6f 6e 6c 79 20 68 61  t.** but only ha
17ec0 73 20 74 6f 20 73 63 61 6e 20 74 68 65 20 64 61  s to scan the da
17ed0 74 61 20 6f 6e 63 65 2e 20 20 41 6e 64 20 62 65  ta once.  And be
17ee0 63 61 75 73 65 20 69 6e 64 69 63 65 73 20 6d 69  cause indices mi
17ef0 67 68 74 20 0a 2a 2a 20 65 78 69 73 74 20 6f 6e  ght .** exist on
17f00 20 74 68 65 20 74 61 62 6c 65 20 74 31 2c 20 61   the table t1, a
17f10 20 63 6f 6d 70 6c 65 74 65 20 73 63 61 6e 20 6f   complete scan o
17f20 66 20 74 68 65 20 64 61 74 61 20 6d 69 67 68 74  f the data might
17f30 20 62 65 0a 2a 2a 20 61 76 6f 69 64 65 64 2e 0a   be.** avoided..
17f40 2a 2a 0a 2a 2a 20 46 6c 61 74 74 65 6e 69 6e 67  **.** Flattening
17f50 20 69 73 20 6f 6e 6c 79 20 61 74 74 65 6d 70 74   is only attempt
17f60 65 64 20 69 66 20 61 6c 6c 20 6f 66 20 74 68 65  ed if all of the
17f70 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 72 65 20 74   following are t
17f80 72 75 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 28 31 29  rue:.**.**   (1)
17f90 20 20 54 68 65 20 73 75 62 71 75 65 72 79 20 61    The subquery a
17fa0 6e 64 20 74 68 65 20 6f 75 74 65 72 20 71 75 65  nd the outer que
17fb0 72 79 20 64 6f 20 6e 6f 74 20 62 6f 74 68 20 75  ry do not both u
17fc0 73 65 20 61 67 67 72 65 67 61 74 65 73 2e 0a 2a  se aggregates..*
17fd0 2a 0a 2a 2a 20 20 20 28 32 29 20 20 54 68 65 20  *.**   (2)  The 
17fe0 73 75 62 71 75 65 72 79 20 69 73 20 6e 6f 74 20  subquery is not 
17ff0 61 6e 20 61 67 67 72 65 67 61 74 65 20 6f 72 20  an aggregate or 
18000 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20  the outer query 
18010 69 73 20 6e 6f 74 20 61 20 6a 6f 69 6e 2e 0a 2a  is not a join..*
18020 2a 0a 2a 2a 20 20 20 28 33 29 20 20 54 68 65 20  *.**   (3)  The 
18030 73 75 62 71 75 65 72 79 20 69 73 20 6e 6f 74 20  subquery is not 
18040 74 68 65 20 72 69 67 68 74 20 6f 70 65 72 61 6e  the right operan
18050 64 20 6f 66 20 61 20 6c 65 66 74 20 6f 75 74 65  d of a left oute
18060 72 20 6a 6f 69 6e 2c 20 6f 72 0a 2a 2a 20 20 20  r join, or.**   
18070 20 20 20 20 20 74 68 65 20 73 75 62 71 75 65 72       the subquer
18080 79 20 69 73 20 6e 6f 74 20 69 74 73 65 6c 66 20  y is not itself 
18090 61 20 6a 6f 69 6e 2e 20 20 28 54 69 63 6b 65 74  a join.  (Ticket
180a0 20 23 33 30 36 29 0a 2a 2a 0a 2a 2a 20 20 20 28   #306).**.**   (
180b0 34 29 20 20 54 68 65 20 73 75 62 71 75 65 72 79  4)  The subquery
180c0 20 69 73 20 6e 6f 74 20 44 49 53 54 49 4e 43 54   is not DISTINCT
180d0 20 6f 72 20 74 68 65 20 6f 75 74 65 72 20 71 75   or the outer qu
180e0 65 72 79 20 69 73 20 6e 6f 74 20 61 20 6a 6f 69  ery is not a joi
180f0 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20 28 35 29 20 20  n..**.**   (5)  
18100 54 68 65 20 73 75 62 71 75 65 72 79 20 69 73 20  The subquery is 
18110 6e 6f 74 20 44 49 53 54 49 4e 43 54 20 6f 72 20  not DISTINCT or 
18120 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20  the outer query 
18130 64 6f 65 73 20 6e 6f 74 20 75 73 65 0a 2a 2a 20  does not use.** 
18140 20 20 20 20 20 20 20 61 67 67 72 65 67 61 74 65         aggregate
18150 73 2e 0a 2a 2a 0a 2a 2a 20 20 20 28 36 29 20 20  s..**.**   (6)  
18160 54 68 65 20 73 75 62 71 75 65 72 79 20 64 6f 65  The subquery doe
18170 73 20 6e 6f 74 20 75 73 65 20 61 67 67 72 65 67  s not use aggreg
18180 61 74 65 73 20 6f 72 20 74 68 65 20 6f 75 74 65  ates or the oute
18190 72 20 71 75 65 72 79 20 69 73 20 6e 6f 74 0a 2a  r query is not.*
181a0 2a 20 20 20 20 20 20 20 20 44 49 53 54 49 4e 43  *        DISTINC
181b0 54 2e 0a 2a 2a 0a 2a 2a 20 20 20 28 37 29 20 20  T..**.**   (7)  
181c0 54 68 65 20 73 75 62 71 75 65 72 79 20 68 61 73  The subquery has
181d0 20 61 20 46 52 4f 4d 20 63 6c 61 75 73 65 2e 0a   a FROM clause..
181e0 2a 2a 0a 2a 2a 20 20 20 28 38 29 20 20 54 68 65  **.**   (8)  The
181f0 20 73 75 62 71 75 65 72 79 20 64 6f 65 73 20 6e   subquery does n
18200 6f 74 20 75 73 65 20 4c 49 4d 49 54 20 6f 72 20  ot use LIMIT or 
18210 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20  the outer query 
18220 69 73 20 6e 6f 74 20 61 20 6a 6f 69 6e 2e 0a 2a  is not a join..*
18230 2a 0a 2a 2a 20 20 20 28 39 29 20 20 54 68 65 20  *.**   (9)  The 
18240 73 75 62 71 75 65 72 79 20 64 6f 65 73 20 6e 6f  subquery does no
18250 74 20 75 73 65 20 4c 49 4d 49 54 20 6f 72 20 74  t use LIMIT or t
18260 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 64  he outer query d
18270 6f 65 73 20 6e 6f 74 20 75 73 65 0a 2a 2a 20 20  oes not use.**  
18280 20 20 20 20 20 20 61 67 67 72 65 67 61 74 65 73        aggregates
18290 2e 0a 2a 2a 0a 2a 2a 20 20 28 31 30 29 20 20 54  ..**.**  (10)  T
182a0 68 65 20 73 75 62 71 75 65 72 79 20 64 6f 65 73  he subquery does
182b0 20 6e 6f 74 20 75 73 65 20 61 67 67 72 65 67 61   not use aggrega
182c0 74 65 73 20 6f 72 20 74 68 65 20 6f 75 74 65 72  tes or the outer
182d0 20 71 75 65 72 79 20 64 6f 65 73 20 6e 6f 74 0a   query does not.
182e0 2a 2a 20 20 20 20 20 20 20 20 75 73 65 20 4c 49  **        use LI
182f0 4d 49 54 2e 0a 2a 2a 0a 2a 2a 20 20 28 31 31 29  MIT..**.**  (11)
18300 20 20 54 68 65 20 73 75 62 71 75 65 72 79 20 61    The subquery a
18310 6e 64 20 74 68 65 20 6f 75 74 65 72 20 71 75 65  nd the outer que
18320 72 79 20 64 6f 20 6e 6f 74 20 62 6f 74 68 20 68  ry do not both h
18330 61 76 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61  ave ORDER BY cla
18340 75 73 65 73 2e 0a 2a 2a 0a 2a 2a 20 20 28 31 32  uses..**.**  (12
18350 29 20 20 54 68 65 20 73 75 62 71 75 65 72 79 20  )  The subquery 
18360 69 73 20 6e 6f 74 20 74 68 65 20 72 69 67 68 74  is not the right
18370 20 74 65 72 6d 20 6f 66 20 61 20 4c 45 46 54 20   term of a LEFT 
18380 4f 55 54 45 52 20 4a 4f 49 4e 20 6f 72 20 74 68  OUTER JOIN or th
18390 65 0a 2a 2a 20 20 20 20 20 20 20 20 73 75 62 71  e.**        subq
183a0 75 65 72 79 20 68 61 73 20 6e 6f 20 57 48 45 52  uery has no WHER
183b0 45 20 63 6c 61 75 73 65 2e 20 20 28 61 64 64 65  E clause.  (adde
183c0 64 20 62 79 20 74 69 63 6b 65 74 20 23 33 35 30  d by ticket #350
183d0 29 0a 2a 2a 0a 2a 2a 20 20 28 31 33 29 20 20 54  ).**.**  (13)  T
183e0 68 65 20 73 75 62 71 75 65 72 79 20 61 6e 64 20  he subquery and 
183f0 6f 75 74 65 72 20 71 75 65 72 79 20 64 6f 20 6e  outer query do n
18400 6f 74 20 62 6f 74 68 20 75 73 65 20 4c 49 4d 49  ot both use LIMI
18410 54 0a 2a 2a 0a 2a 2a 20 20 28 31 34 29 20 20 54  T.**.**  (14)  T
18420 68 65 20 73 75 62 71 75 65 72 79 20 64 6f 65 73  he subquery does
18430 20 6e 6f 74 20 75 73 65 20 4f 46 46 53 45 54 0a   not use OFFSET.
18440 2a 2a 0a 2a 2a 20 20 28 31 35 29 20 20 54 68 65  **.**  (15)  The
18450 20 6f 75 74 65 72 20 71 75 65 72 79 20 69 73 20   outer query is 
18460 6e 6f 74 20 70 61 72 74 20 6f 66 20 61 20 63 6f  not part of a co
18470 6d 70 6f 75 6e 64 20 73 65 6c 65 63 74 20 6f 72  mpound select or
18480 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 20 20 73   the.**        s
18490 75 62 71 75 65 72 79 20 64 6f 65 73 20 6e 6f 74  ubquery does not
184a0 20 68 61 76 65 20 62 6f 74 68 20 61 6e 20 4f 52   have both an OR
184b0 44 45 52 20 42 59 20 61 6e 64 20 61 20 4c 49 4d  DER BY and a LIM
184c0 49 54 20 63 6c 61 75 73 65 2e 0a 2a 2a 20 20 20  IT clause..**   
184d0 20 20 20 20 20 28 53 65 65 20 74 69 63 6b 65 74       (See ticket
184e0 20 23 32 33 33 39 29 0a 2a 2a 0a 2a 2a 20 20 28   #2339).**.**  (
184f0 31 36 29 20 20 54 68 65 20 6f 75 74 65 72 20 71  16)  The outer q
18500 75 65 72 79 20 69 73 20 6e 6f 74 20 61 6e 20 61  uery is not an a
18510 67 67 72 65 67 61 74 65 20 6f 72 20 74 68 65 20  ggregate or the 
18520 73 75 62 71 75 65 72 79 20 64 6f 65 73 0a 2a 2a  subquery does.**
18530 20 20 20 20 20 20 20 20 6e 6f 74 20 63 6f 6e 74          not cont
18540 61 69 6e 20 4f 52 44 45 52 20 42 59 2e 20 20 28  ain ORDER BY.  (
18550 54 69 63 6b 65 74 20 23 32 39 34 32 29 20 20 54  Ticket #2942)  T
18560 68 69 73 20 75 73 65 64 20 74 6f 20 6e 6f 74 20  his used to not 
18570 6d 61 74 74 65 72 0a 2a 2a 20 20 20 20 20 20 20  matter.**       
18580 20 75 6e 74 69 6c 20 77 65 20 69 6e 74 72 6f 64   until we introd
18590 75 63 65 64 20 74 68 65 20 67 72 6f 75 70 5f 63  uced the group_c
185a0 6f 6e 63 61 74 28 29 20 66 75 6e 63 74 69 6f 6e  oncat() function
185b0 2e 20 20 0a 2a 2a 0a 2a 2a 20 49 6e 20 74 68 69  .  .**.** In thi
185c0 73 20 72 6f 75 74 69 6e 65 2c 20 74 68 65 20 22  s routine, the "
185d0 70 22 20 70 61 72 61 6d 65 74 65 72 20 69 73 20  p" parameter is 
185e0 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65  a pointer to the
185f0 20 6f 75 74 65 72 20 71 75 65 72 79 2e 0a 2a 2a   outer query..**
18600 20 54 68 65 20 73 75 62 71 75 65 72 79 20 69 73   The subquery is
18610 20 70 2d 3e 70 53 72 63 2d 3e 61 5b 69 46 72 6f   p->pSrc->a[iFro
18620 6d 5d 2e 20 20 69 73 41 67 67 20 69 73 20 74 72  m].  isAgg is tr
18630 75 65 20 69 66 20 74 68 65 20 6f 75 74 65 72 20  ue if the outer 
18640 71 75 65 72 79 0a 2a 2a 20 75 73 65 73 20 61 67  query.** uses ag
18650 67 72 65 67 61 74 65 73 20 61 6e 64 20 73 75 62  gregates and sub
18660 71 75 65 72 79 49 73 41 67 67 20 69 73 20 74 72  queryIsAgg is tr
18670 75 65 20 69 66 20 74 68 65 20 73 75 62 71 75 65  ue if the subque
18680 72 79 20 75 73 65 73 20 61 67 67 72 65 67 61 74  ry uses aggregat
18690 65 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 66 6c 61  es..**.** If fla
186a0 74 74 65 6e 69 6e 67 20 69 73 20 6e 6f 74 20 61  ttening is not a
186b0 74 74 65 6d 70 74 65 64 2c 20 74 68 69 73 20 72  ttempted, this r
186c0 6f 75 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f  outine is a no-o
186d0 70 20 61 6e 64 20 72 65 74 75 72 6e 73 20 30 2e  p and returns 0.
186e0 0a 2a 2a 20 49 66 20 66 6c 61 74 74 65 6e 69 6e  .** If flattenin
186f0 67 20 69 73 20 61 74 74 65 6d 70 74 65 64 20 74  g is attempted t
18700 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75  his routine retu
18710 72 6e 73 20 31 2e 0a 2a 2a 0a 2a 2a 20 41 6c 6c  rns 1..**.** All
18720 20 6f 66 20 74 68 65 20 65 78 70 72 65 73 73 69   of the expressi
18730 6f 6e 20 61 6e 61 6c 79 73 69 73 20 6d 75 73 74  on analysis must
18740 20 6f 63 63 75 72 20 6f 6e 20 62 6f 74 68 20 74   occur on both t
18750 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 61  he outer query a
18760 6e 64 0a 2a 2a 20 74 68 65 20 73 75 62 71 75 65  nd.** the subque
18770 72 79 20 62 65 66 6f 72 65 20 74 68 69 73 20 72  ry before this r
18780 6f 75 74 69 6e 65 20 72 75 6e 73 2e 0a 2a 2f 0a  outine runs..*/.
18790 73 74 61 74 69 63 20 69 6e 74 20 66 6c 61 74 74  static int flatt
187a0 65 6e 53 75 62 71 75 65 72 79 28 0a 20 20 73 71  enSubquery(.  sq
187b0 6c 69 74 65 33 20 2a 64 62 2c 20 20 20 20 20 20  lite3 *db,      
187c0 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 63     /* Database c
187d0 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 53  onnection */.  S
187e0 65 6c 65 63 74 20 2a 70 2c 20 20 20 20 20 20 20  elect *p,       
187f0 20 20 20 20 2f 2a 20 54 68 65 20 70 61 72 65 6e      /* The paren
18800 74 20 6f 72 20 6f 75 74 65 72 20 53 45 4c 45 43  t or outer SELEC
18810 54 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20  T statement */. 
18820 20 69 6e 74 20 69 46 72 6f 6d 2c 20 20 20 20 20   int iFrom,     
18830 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 69        /* Index i
18840 6e 20 70 2d 3e 70 53 72 63 2d 3e 61 5b 5d 20 6f  n p->pSrc->a[] o
18850 66 20 74 68 65 20 69 6e 6e 65 72 20 73 75 62 71  f the inner subq
18860 75 65 72 79 20 2a 2f 0a 20 20 69 6e 74 20 69 73  uery */.  int is
18870 41 67 67 2c 20 20 20 20 20 20 20 20 20 20 20 2f  Agg,           /
18880 2a 20 54 72 75 65 20 69 66 20 6f 75 74 65 72 20  * True if outer 
18890 53 45 4c 45 43 54 20 75 73 65 73 20 61 67 67 72  SELECT uses aggr
188a0 65 67 61 74 65 20 66 75 6e 63 74 69 6f 6e 73 20  egate functions 
188b0 2a 2f 0a 20 20 69 6e 74 20 73 75 62 71 75 65 72  */.  int subquer
188c0 79 49 73 41 67 67 20 20 20 20 2f 2a 20 54 72 75  yIsAgg    /* Tru
188d0 65 20 69 66 20 74 68 65 20 73 75 62 71 75 65 72  e if the subquer
188e0 79 20 75 73 65 73 20 61 67 67 72 65 67 61 74 65  y uses aggregate
188f0 20 66 75 6e 63 74 69 6f 6e 73 20 2a 2f 0a 29 7b   functions */.){
18900 0a 20 20 53 65 6c 65 63 74 20 2a 70 53 75 62 3b  .  Select *pSub;
18910 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 69 6e         /* The in
18920 6e 65 72 20 71 75 65 72 79 20 6f 72 20 22 73 75  ner query or "su
18930 62 71 75 65 72 79 22 20 2a 2f 0a 20 20 53 72 63  bquery" */.  Src
18940 4c 69 73 74 20 2a 70 53 72 63 3b 20 20 20 20 20  List *pSrc;     
18950 20 2f 2a 20 54 68 65 20 46 52 4f 4d 20 63 6c 61   /* The FROM cla
18960 75 73 65 20 6f 66 20 74 68 65 20 6f 75 74 65 72  use of the outer
18970 20 71 75 65 72 79 20 2a 2f 0a 20 20 53 72 63 4c   query */.  SrcL
18980 69 73 74 20 2a 70 53 75 62 53 72 63 3b 20 20 20  ist *pSubSrc;   
18990 2f 2a 20 54 68 65 20 46 52 4f 4d 20 63 6c 61 75  /* The FROM clau
189a0 73 65 20 6f 66 20 74 68 65 20 73 75 62 71 75 65  se of the subque
189b0 72 79 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74  ry */.  ExprList
189c0 20 2a 70 4c 69 73 74 3b 20 20 20 20 2f 2a 20 54   *pList;    /* T
189d0 68 65 20 72 65 73 75 6c 74 20 73 65 74 20 6f 66  he result set of
189e0 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79   the outer query
189f0 20 2a 2f 0a 20 20 69 6e 74 20 69 50 61 72 65 6e   */.  int iParen
18a00 74 3b 20 20 20 20 20 20 20 20 2f 2a 20 56 44 42  t;        /* VDB
18a10 45 20 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 20  E cursor number 
18a20 6f 66 20 74 68 65 20 70 53 75 62 20 72 65 73 75  of the pSub resu
18a30 6c 74 20 73 65 74 20 74 65 6d 70 20 74 61 62 6c  lt set temp tabl
18a40 65 20 2a 2f 0a 20 20 69 6e 74 20 69 3b 20 20 20  e */.  int i;   
18a50 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f             /* Lo
18a60 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20  op counter */.  
18a70 45 78 70 72 20 2a 70 57 68 65 72 65 3b 20 20 20  Expr *pWhere;   
18a80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18a90 20 2f 2a 20 54 68 65 20 57 48 45 52 45 20 63 6c   /* The WHERE cl
18aa0 61 75 73 65 20 2a 2f 0a 20 20 73 74 72 75 63 74  ause */.  struct
18ab0 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70   SrcList_item *p
18ac0 53 75 62 69 74 65 6d 3b 20 20 20 2f 2a 20 54 68  Subitem;   /* Th
18ad0 65 20 73 75 62 71 75 65 72 79 20 2a 2f 0a 0a 20  e subquery */.. 
18ae0 20 2f 2a 20 43 68 65 63 6b 20 74 6f 20 73 65 65   /* Check to see
18af0 20 69 66 20 66 6c 61 74 74 65 6e 69 6e 67 20 69   if flattening i
18b00 73 20 70 65 72 6d 69 74 74 65 64 2e 20 20 52 65  s permitted.  Re
18b10 74 75 72 6e 20 30 20 69 66 20 6e 6f 74 2e 0a 20  turn 0 if not.. 
18b20 20 2a 2f 0a 20 20 69 66 28 20 70 3d 3d 30 20 29   */.  if( p==0 )
18b30 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 70 53 72   return 0;.  pSr
18b40 63 20 3d 20 70 2d 3e 70 53 72 63 3b 0a 20 20 61  c = p->pSrc;.  a
18b50 73 73 65 72 74 28 20 70 53 72 63 20 26 26 20 69  ssert( pSrc && i
18b60 46 72 6f 6d 3e 3d 30 20 26 26 20 69 46 72 6f 6d  From>=0 && iFrom
18b70 3c 70 53 72 63 2d 3e 6e 53 72 63 20 29 3b 0a 20  <pSrc->nSrc );. 
18b80 20 70 53 75 62 69 74 65 6d 20 3d 20 26 70 53 72   pSubitem = &pSr
18b90 63 2d 3e 61 5b 69 46 72 6f 6d 5d 3b 0a 20 20 70  c->a[iFrom];.  p
18ba0 53 75 62 20 3d 20 70 53 75 62 69 74 65 6d 2d 3e  Sub = pSubitem->
18bb0 70 53 65 6c 65 63 74 3b 0a 20 20 61 73 73 65 72  pSelect;.  asser
18bc0 74 28 20 70 53 75 62 21 3d 30 20 29 3b 0a 20 20  t( pSub!=0 );.  
18bd0 69 66 28 20 69 73 41 67 67 20 26 26 20 73 75 62  if( isAgg && sub
18be0 71 75 65 72 79 49 73 41 67 67 20 29 20 72 65 74  queryIsAgg ) ret
18bf0 75 72 6e 20 30 3b 20 20 20 20 20 20 20 20 20 20  urn 0;          
18c00 20 20 20 20 20 20 20 2f 2a 20 52 65 73 74 72 69         /* Restri
18c10 63 74 69 6f 6e 20 28 31 29 20 20 2a 2f 0a 20 20  ction (1)  */.  
18c20 69 66 28 20 73 75 62 71 75 65 72 79 49 73 41 67  if( subqueryIsAg
18c30 67 20 26 26 20 70 53 72 63 2d 3e 6e 53 72 63 3e  g && pSrc->nSrc>
18c40 31 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20 20  1 ) return 0;   
18c50 20 20 20 20 20 20 20 2f 2a 20 52 65 73 74 72 69         /* Restri
18c60 63 74 69 6f 6e 20 28 32 29 20 20 2a 2f 0a 20 20  ction (2)  */.  
18c70 70 53 75 62 53 72 63 20 3d 20 70 53 75 62 2d 3e  pSubSrc = pSub->
18c80 70 53 72 63 3b 0a 20 20 61 73 73 65 72 74 28 20  pSrc;.  assert( 
18c90 70 53 75 62 53 72 63 20 29 3b 0a 20 20 2f 2a 20  pSubSrc );.  /* 
18ca0 50 72 69 6f 72 20 74 6f 20 76 65 72 73 69 6f 6e  Prior to version
18cb0 20 33 2e 31 2e 32 2c 20 77 68 65 6e 20 4c 49 4d   3.1.2, when LIM
18cc0 49 54 20 61 6e 64 20 4f 46 46 53 45 54 20 68 61  IT and OFFSET ha
18cd0 64 20 74 6f 20 62 65 20 73 69 6d 70 6c 65 20 63  d to be simple c
18ce0 6f 6e 73 74 61 6e 74 73 2c 0a 20 20 2a 2a 20 6e  onstants,.  ** n
18cf0 6f 74 20 61 72 62 69 74 72 61 72 79 20 65 78 70  ot arbitrary exp
18d00 72 65 73 73 73 69 6f 6e 73 2c 20 77 65 20 61 6c  resssions, we al
18d10 6c 6f 77 65 64 20 73 6f 6d 65 20 63 6f 6d 62 69  lowed some combi
18d20 6e 69 6e 67 20 6f 66 20 4c 49 4d 49 54 20 61 6e  ning of LIMIT an
18d30 64 20 4f 46 46 53 45 54 0a 20 20 2a 2a 20 62 65  d OFFSET.  ** be
18d40 63 61 75 73 65 20 74 68 65 79 20 63 6f 75 6c 64  cause they could
18d50 20 62 65 20 63 6f 6d 70 75 74 65 64 20 61 74 20   be computed at 
18d60 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 2e 20 20 42  compile-time.  B
18d70 75 74 20 77 68 65 6e 20 4c 49 4d 49 54 20 61 6e  ut when LIMIT an
18d80 64 20 4f 46 46 53 45 54 0a 20 20 2a 2a 20 62 65  d OFFSET.  ** be
18d90 63 61 6d 65 20 61 72 62 69 74 72 61 72 79 20 65  came arbitrary e
18da0 78 70 72 65 73 73 69 6f 6e 73 2c 20 77 65 20 77  xpressions, we w
18db0 65 72 65 20 66 6f 72 63 65 64 20 74 6f 20 61 64  ere forced to ad
18dc0 64 20 72 65 73 74 72 69 63 74 69 6f 6e 73 20 28  d restrictions (
18dd0 31 33 29 0a 20 20 2a 2a 20 61 6e 64 20 28 31 34  13).  ** and (14
18de0 29 2e 20 2a 2f 0a 20 20 69 66 28 20 70 53 75 62  ). */.  if( pSub
18df0 2d 3e 70 4c 69 6d 69 74 20 26 26 20 70 2d 3e 70  ->pLimit && p->p
18e00 4c 69 6d 69 74 20 29 20 72 65 74 75 72 6e 20 30  Limit ) return 0
18e10 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
18e20 2a 20 52 65 73 74 72 69 63 74 69 6f 6e 20 28 31  * Restriction (1
18e30 33 29 20 2a 2f 0a 20 20 69 66 28 20 70 53 75 62  3) */.  if( pSub
18e40 2d 3e 70 4f 66 66 73 65 74 20 29 20 72 65 74 75  ->pOffset ) retu
18e50 72 6e 20 30 3b 20 20 20 20 20 20 20 20 20 20 20  rn 0;           
18e60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
18e70 2a 20 52 65 73 74 72 69 63 74 69 6f 6e 20 28 31  * Restriction (1
18e80 34 29 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 70  4) */.  if( p->p
18e90 52 69 67 68 74 6d 6f 73 74 20 26 26 20 70 53 75  Rightmost && pSu
18ea0 62 2d 3e 70 4c 69 6d 69 74 20 26 26 20 70 53 75  b->pLimit && pSu
18eb0 62 2d 3e 70 4f 72 64 65 72 42 79 20 29 7b 0a 20  b->pOrderBy ){. 
18ec0 20 20 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20     return 0;    
18ed0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18ee0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18ef0 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73 74 72          /* Restr
18f00 69 63 74 69 6f 6e 20 28 31 35 29 20 2a 2f 0a 20  iction (15) */. 
18f10 20 7d 0a 20 20 69 66 28 20 70 53 75 62 53 72 63   }.  if( pSubSrc
18f20 2d 3e 6e 53 72 63 3d 3d 30 20 29 20 72 65 74 75  ->nSrc==0 ) retu
18f30 72 6e 20 30 3b 20 20 20 20 20 20 20 20 20 20 20  rn 0;           
18f40 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
18f50 65 73 74 72 69 63 74 69 6f 6e 20 28 37 29 20 20  estriction (7)  
18f60 2a 2f 0a 20 20 69 66 28 20 28 70 53 75 62 2d 3e  */.  if( (pSub->
18f70 69 73 44 69 73 74 69 6e 63 74 20 7c 7c 20 70 53  isDistinct || pS
18f80 75 62 2d 3e 70 4c 69 6d 69 74 29 20 0a 20 20 20  ub->pLimit) .   
18f90 20 20 20 20 20 20 26 26 20 28 70 53 72 63 2d 3e        && (pSrc->
18fa0 6e 53 72 63 3e 31 20 7c 7c 20 69 73 41 67 67 29  nSrc>1 || isAgg)
18fb0 20 29 7b 20 20 20 20 20 20 20 20 20 20 2f 2a 20   ){          /* 
18fc0 52 65 73 74 72 69 63 74 69 6f 6e 73 20 28 34 29  Restrictions (4)
18fd0 28 35 29 28 38 29 28 39 29 20 2a 2f 0a 20 20 20  (5)(8)(9) */.   
18fe0 20 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20    return 0;     
18ff0 20 20 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e    .  }.  if( p->
19000 69 73 44 69 73 74 69 6e 63 74 20 26 26 20 73 75  isDistinct && su
19010 62 71 75 65 72 79 49 73 41 67 67 20 29 20 72 65  bqueryIsAgg ) re
19020 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20 20 20  turn 0;         
19030 2f 2a 20 52 65 73 74 72 69 63 74 69 6f 6e 20 28  /* Restriction (
19040 36 29 20 20 2a 2f 0a 20 20 69 66 28 20 28 70 2d  6)  */.  if( (p-
19050 3e 64 69 73 61 6c 6c 6f 77 4f 72 64 65 72 42 79  >disallowOrderBy
19060 20 7c 7c 20 70 2d 3e 70 4f 72 64 65 72 42 79 29   || p->pOrderBy)
19070 20 26 26 20 70 53 75 62 2d 3e 70 4f 72 64 65 72   && pSub->pOrder
19080 42 79 20 29 7b 0a 20 20 20 20 20 72 65 74 75 72  By ){.     retur
19090 6e 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  n 0;            
190a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
190b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
190c0 2a 20 52 65 73 74 72 69 63 74 69 6f 6e 20 28 31  * Restriction (1
190d0 31 29 20 2a 2f 0a 20 20 7d 0a 20 20 69 66 28 20  1) */.  }.  if( 
190e0 69 73 41 67 67 20 26 26 20 70 53 75 62 2d 3e 70  isAgg && pSub->p
190f0 4f 72 64 65 72 42 79 20 29 20 72 65 74 75 72 6e  OrderBy ) return
19100 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
19110 20 20 20 2f 2a 20 52 65 73 74 72 69 63 74 69 6f     /* Restrictio
19120 6e 20 28 31 36 29 20 2a 2f 0a 0a 20 20 2f 2a 20  n (16) */..  /* 
19130 52 65 73 74 72 69 63 74 69 6f 6e 20 33 3a 20 20  Restriction 3:  
19140 49 66 20 74 68 65 20 73 75 62 71 75 65 72 79 20  If the subquery 
19150 69 73 20 61 20 6a 6f 69 6e 2c 20 6d 61 6b 65 20  is a join, make 
19160 73 75 72 65 20 74 68 65 20 73 75 62 71 75 65 72  sure the subquer
19170 79 20 69 73 20 0a 20 20 2a 2a 20 6e 6f 74 20 75  y is .  ** not u
19180 73 65 64 20 61 73 20 74 68 65 20 72 69 67 68 74  sed as the right
19190 20 6f 70 65 72 61 6e 64 20 6f 66 20 61 6e 20 6f   operand of an o
191a0 75 74 65 72 20 6a 6f 69 6e 2e 20 20 45 78 61 6d  uter join.  Exam
191b0 70 6c 65 73 20 6f 66 20 77 68 79 20 74 68 69 73  ples of why this
191c0 0a 20 20 2a 2a 20 69 73 20 6e 6f 74 20 61 6c 6c  .  ** is not all
191d0 6f 77 65 64 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20  owed:.  **.  ** 
191e0 20 20 20 20 20 20 20 20 74 31 20 4c 45 46 54 20          t1 LEFT 
191f0 4f 55 54 45 52 20 4a 4f 49 4e 20 28 74 32 20 4a  OUTER JOIN (t2 J
19200 4f 49 4e 20 74 33 29 0a 20 20 2a 2a 0a 20 20 2a  OIN t3).  **.  *
19210 2a 20 49 66 20 77 65 20 66 6c 61 74 74 65 6e 20  * If we flatten 
19220 74 68 65 20 61 62 6f 76 65 2c 20 77 65 20 77 6f  the above, we wo
19230 75 6c 64 20 67 65 74 0a 20 20 2a 2a 0a 20 20 2a  uld get.  **.  *
19240 2a 20 20 20 20 20 20 20 20 20 28 74 31 20 4c 45  *         (t1 LE
19250 46 54 20 4f 55 54 45 52 20 4a 4f 49 4e 20 74 32  FT OUTER JOIN t2
19260 29 20 4a 4f 49 4e 20 74 33 0a 20 20 2a 2a 0a 20  ) JOIN t3.  **. 
19270 20 2a 2a 20 77 68 69 63 68 20 69 73 20 6e 6f 74   ** which is not
19280 20 61 74 20 61 6c 6c 20 74 68 65 20 73 61 6d 65   at all the same
19290 20 74 68 69 6e 67 2e 0a 20 20 2a 2f 0a 20 20 69   thing..  */.  i
192a0 66 28 20 70 53 75 62 53 72 63 2d 3e 6e 53 72 63  f( pSubSrc->nSrc
192b0 3e 31 20 26 26 20 28 70 53 75 62 69 74 65 6d 2d  >1 && (pSubitem-
192c0 3e 6a 6f 69 6e 74 79 70 65 20 26 20 4a 54 5f 4f  >jointype & JT_O
192d0 55 54 45 52 29 21 3d 30 20 29 7b 0a 20 20 20 20  UTER)!=0 ){.    
192e0 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 0a 20  return 0;.  }.. 
192f0 20 2f 2a 20 52 65 73 74 72 69 63 74 69 6f 6e 20   /* Restriction 
19300 31 32 3a 20 20 49 66 20 74 68 65 20 73 75 62 71  12:  If the subq
19310 75 65 72 79 20 69 73 20 74 68 65 20 72 69 67 68  uery is the righ
19320 74 20 6f 70 65 72 61 6e 64 20 6f 66 20 61 20 6c  t operand of a l
19330 65 66 74 20 6f 75 74 65 72 0a 20 20 2a 2a 20 6a  eft outer.  ** j
19340 6f 69 6e 2c 20 6d 61 6b 65 20 73 75 72 65 20 74  oin, make sure t
19350 68 65 20 73 75 62 71 75 65 72 79 20 68 61 73 20  he subquery has 
19360 6e 6f 20 57 48 45 52 45 20 63 6c 61 75 73 65 2e  no WHERE clause.
19370 0a 20 20 2a 2a 20 41 6e 20 65 78 61 6d 70 6c 65  .  ** An example
19380 73 20 6f 66 20 77 68 79 20 74 68 69 73 20 69 73  s of why this is
19390 20 6e 6f 74 20 61 6c 6c 6f 77 65 64 3a 0a 20 20   not allowed:.  
193a0 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 20 20 20 20  **.  **         
193b0 74 31 20 4c 45 46 54 20 4f 55 54 45 52 20 4a 4f  t1 LEFT OUTER JO
193c0 49 4e 20 28 53 45 4c 45 43 54 20 2a 20 46 52 4f  IN (SELECT * FRO
193d0 4d 20 74 32 20 57 48 45 52 45 20 74 32 2e 78 3e  M t2 WHERE t2.x>
193e0 30 29 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20  0).  **.  ** If 
193f0 77 65 20 66 6c 61 74 74 65 6e 20 74 68 65 20 61  we flatten the a
19400 62 6f 76 65 2c 20 77 65 20 77 6f 75 6c 64 20 67  bove, we would g
19410 65 74 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20  et.  **.  **    
19420 20 20 20 20 20 28 74 31 20 4c 45 46 54 20 4f 55       (t1 LEFT OU
19430 54 45 52 20 4a 4f 49 4e 20 74 32 29 20 57 48 45  TER JOIN t2) WHE
19440 52 45 20 74 32 2e 78 3e 30 0a 20 20 2a 2a 0a 20  RE t2.x>0.  **. 
19450 20 2a 2a 20 42 75 74 20 74 68 65 20 74 32 2e 78   ** But the t2.x
19460 3e 30 20 74 65 73 74 20 77 69 6c 6c 20 61 6c 77  >0 test will alw
19470 61 79 73 20 66 61 69 6c 20 6f 6e 20 61 20 4e 55  ays fail on a NU
19480 4c 4c 20 72 6f 77 20 6f 66 20 74 32 2c 20 77 68  LL row of t2, wh
19490 69 63 68 0a 20 20 2a 2a 20 65 66 66 65 63 74 69  ich.  ** effecti
194a0 76 65 6c 79 20 63 6f 6e 76 65 72 74 73 20 74 68  vely converts th
194b0 65 20 4f 55 54 45 52 20 4a 4f 49 4e 20 69 6e 74  e OUTER JOIN int
194c0 6f 20 61 6e 20 49 4e 4e 45 52 20 4a 4f 49 4e 2e  o an INNER JOIN.
194d0 0a 20 20 2a 2f 0a 20 20 69 66 28 20 28 70 53 75  .  */.  if( (pSu
194e0 62 69 74 65 6d 2d 3e 6a 6f 69 6e 74 79 70 65 20  bitem->jointype 
194f0 26 20 4a 54 5f 4f 55 54 45 52 29 21 3d 30 20 26  & JT_OUTER)!=0 &
19500 26 20 70 53 75 62 2d 3e 70 57 68 65 72 65 21 3d  & pSub->pWhere!=
19510 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  0 ){.    return 
19520 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20  0;.  }..  /* If 
19530 77 65 20 72 65 61 63 68 20 74 68 69 73 20 70 6f  we reach this po
19540 69 6e 74 2c 20 69 74 20 6d 65 61 6e 73 20 66 6c  int, it means fl
19550 61 74 74 65 6e 69 6e 67 20 69 73 20 70 65 72 6d  attening is perm
19560 69 74 74 65 64 20 66 6f 72 20 74 68 65 0a 20 20  itted for the.  
19570 2a 2a 20 69 46 72 6f 6d 2d 74 68 20 65 6e 74 72  ** iFrom-th entr
19580 79 20 6f 66 20 74 68 65 20 46 52 4f 4d 20 63 6c  y of the FROM cl
19590 61 75 73 65 20 69 6e 20 74 68 65 20 6f 75 74 65  ause in the oute
195a0 72 20 71 75 65 72 79 2e 0a 20 20 2a 2f 0a 0a 20  r query..  */.. 
195b0 20 2f 2a 20 4d 6f 76 65 20 61 6c 6c 20 6f 66 20   /* Move all of 
195c0 74 68 65 20 46 52 4f 4d 20 65 6c 65 6d 65 6e 74  the FROM element
195d0 73 20 6f 66 20 74 68 65 20 73 75 62 71 75 65 72  s of the subquer
195e0 79 20 69 6e 74 6f 20 74 68 65 0a 20 20 2a 2a 20  y into the.  ** 
195f0 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20  the FROM clause 
19600 6f 66 20 74 68 65 20 6f 75 74 65 72 20 71 75 65  of the outer que
19610 72 79 2e 20 20 42 65 66 6f 72 65 20 64 6f 69 6e  ry.  Before doin
19620 67 20 74 68 69 73 2c 20 72 65 6d 65 6d 62 65 72  g this, remember
19630 0a 20 20 2a 2a 20 74 68 65 20 63 75 72 73 6f 72  .  ** the cursor
19640 20 6e 75 6d 62 65 72 20 66 6f 72 20 74 68 65 20   number for the 
19650 6f 72 69 67 69 6e 61 6c 20 6f 75 74 65 72 20 71  original outer q
19660 75 65 72 79 20 46 52 4f 4d 20 65 6c 65 6d 65 6e  uery FROM elemen
19670 74 20 69 6e 0a 20 20 2a 2a 20 69 50 61 72 65 6e  t in.  ** iParen
19680 74 2e 20 20 54 68 65 20 69 50 61 72 65 6e 74 20  t.  The iParent 
19690 63 75 72 73 6f 72 20 77 69 6c 6c 20 6e 65 76 65  cursor will neve
196a0 72 20 62 65 20 75 73 65 64 2e 20 20 53 75 62 73  r be used.  Subs
196b0 65 71 75 65 6e 74 20 63 6f 64 65 0a 20 20 2a 2a  equent code.  **
196c0 20 77 69 6c 6c 20 73 63 61 6e 20 65 78 70 72 65   will scan expre
196d0 73 73 69 6f 6e 73 20 6c 6f 6f 6b 69 6e 67 20 66  ssions looking f
196e0 6f 72 20 69 50 61 72 65 6e 74 20 72 65 66 65 72  or iParent refer
196f0 65 6e 63 65 73 20 61 6e 64 20 72 65 70 6c 61 63  ences and replac
19700 65 0a 20 20 2a 2a 20 74 68 6f 73 65 20 72 65 66  e.  ** those ref
19710 65 72 65 6e 63 65 73 20 77 69 74 68 20 65 78 70  erences with exp
19720 72 65 73 73 69 6f 6e 73 20 74 68 61 74 20 72 65  ressions that re
19730 73 6f 6c 76 65 20 74 6f 20 74 68 65 20 73 75 62  solve to the sub
19740 71 75 65 72 79 20 46 52 4f 4d 0a 20 20 2a 2a 20  query FROM.  ** 
19750 65 6c 65 6d 65 6e 74 73 20 77 65 20 61 72 65 20  elements we are 
19760 6e 6f 77 20 63 6f 70 79 69 6e 67 20 69 6e 2e 0a  now copying in..
19770 20 20 2a 2f 0a 20 20 69 50 61 72 65 6e 74 20 3d    */.  iParent =
19780 20 70 53 75 62 69 74 65 6d 2d 3e 69 43 75 72 73   pSubitem->iCurs
19790 6f 72 3b 0a 20 20 7b 0a 20 20 20 20 69 6e 74 20  or;.  {.    int 
197a0 6e 53 75 62 53 72 63 20 3d 20 70 53 75 62 53 72  nSubSrc = pSubSr
197b0 63 2d 3e 6e 53 72 63 3b 0a 20 20 20 20 69 6e 74  c->nSrc;.    int
197c0 20 6a 6f 69 6e 74 79 70 65 20 3d 20 70 53 75 62   jointype = pSub
197d0 69 74 65 6d 2d 3e 6a 6f 69 6e 74 79 70 65 3b 0a  item->jointype;.
197e0 0a 20 20 20 20 73 71 6c 69 74 65 33 44 65 6c 65  .    sqlite3Dele
197f0 74 65 54 61 62 6c 65 28 70 53 75 62 69 74 65 6d  teTable(pSubitem
19800 2d 3e 70 54 61 62 29 3b 0a 20 20 20 20 73 71 6c  ->pTab);.    sql
19810 69 74 65 33 5f 66 72 65 65 28 70 53 75 62 69 74  ite3_free(pSubit
19820 65 6d 2d 3e 7a 44 61 74 61 62 61 73 65 29 3b 0a  em->zDatabase);.
19830 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
19840 28 70 53 75 62 69 74 65 6d 2d 3e 7a 4e 61 6d 65  (pSubitem->zName
19850 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66  );.    sqlite3_f
19860 72 65 65 28 70 53 75 62 69 74 65 6d 2d 3e 7a 41  ree(pSubitem->zA
19870 6c 69 61 73 29 3b 0a 20 20 20 20 70 53 75 62 69  lias);.    pSubi
19880 74 65 6d 2d 3e 70 54 61 62 20 3d 20 30 3b 0a 20  tem->pTab = 0;. 
19890 20 20 20 70 53 75 62 69 74 65 6d 2d 3e 7a 44 61     pSubitem->zDa
198a0 74 61 62 61 73 65 20 3d 20 30 3b 0a 20 20 20 20  tabase = 0;.    
198b0 70 53 75 62 69 74 65 6d 2d 3e 7a 4e 61 6d 65 20  pSubitem->zName 
198c0 3d 20 30 3b 0a 20 20 20 20 70 53 75 62 69 74 65  = 0;.    pSubite
198d0 6d 2d 3e 7a 41 6c 69 61 73 20 3d 20 30 3b 0a 20  m->zAlias = 0;. 
198e0 20 20 20 69 66 28 20 6e 53 75 62 53 72 63 3e 31     if( nSubSrc>1
198f0 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 65 78   ){.      int ex
19900 74 72 61 20 3d 20 6e 53 75 62 53 72 63 20 2d 20  tra = nSubSrc - 
19910 31 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 31  1;.      for(i=1
19920 3b 20 69 3c 6e 53 75 62 53 72 63 3b 20 69 2b 2b  ; i<nSubSrc; i++
19930 29 7b 0a 20 20 20 20 20 20 20 20 70 53 72 63 20  ){.        pSrc 
19940 3d 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74  = sqlite3SrcList
19950 41 70 70 65 6e 64 28 64 62 2c 20 70 53 72 63 2c  Append(db, pSrc,
19960 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20   0, 0);.        
19970 69 66 28 20 70 53 72 63 3d 3d 30 20 29 7b 0a 20  if( pSrc==0 ){. 
19980 20 20 20 20 20 20 20 20 20 70 2d 3e 70 53 72 63           p->pSrc
19990 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20   = 0;.          
199a0 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 20 20  return 1;.      
199b0 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
199c0 20 20 70 2d 3e 70 53 72 63 20 3d 20 70 53 72 63    p->pSrc = pSrc
199d0 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 70 53  ;.      for(i=pS
199e0 72 63 2d 3e 6e 53 72 63 2d 31 3b 20 69 2d 65 78  rc->nSrc-1; i-ex
199f0 74 72 61 3e 3d 69 46 72 6f 6d 3b 20 69 2d 2d 29  tra>=iFrom; i--)
19a00 7b 0a 20 20 20 20 20 20 20 20 70 53 72 63 2d 3e  {.        pSrc->
19a10 61 5b 69 5d 20 3d 20 70 53 72 63 2d 3e 61 5b 69  a[i] = pSrc->a[i
19a20 2d 65 78 74 72 61 5d 3b 0a 20 20 20 20 20 20 7d  -extra];.      }
19a30 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f 72 28 69  .    }.    for(i
19a40 3d 30 3b 20 69 3c 6e 53 75 62 53 72 63 3b 20 69  =0; i<nSubSrc; i
19a50 2b 2b 29 7b 0a 20 20 20 20 20 20 70 53 72 63 2d  ++){.      pSrc-
19a60 3e 61 5b 69 2b 69 46 72 6f 6d 5d 20 3d 20 70 53  >a[i+iFrom] = pS
19a70 75 62 53 72 63 2d 3e 61 5b 69 5d 3b 0a 20 20 20  ubSrc->a[i];.   
19a80 20 20 20 6d 65 6d 73 65 74 28 26 70 53 75 62 53     memset(&pSubS
19a90 72 63 2d 3e 61 5b 69 5d 2c 20 30 2c 20 73 69 7a  rc->a[i], 0, siz
19aa0 65 6f 66 28 70 53 75 62 53 72 63 2d 3e 61 5b 69  eof(pSubSrc->a[i
19ab0 5d 29 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  ]));.    }.    p
19ac0 53 72 63 2d 3e 61 5b 69 46 72 6f 6d 5d 2e 6a 6f  Src->a[iFrom].jo
19ad0 69 6e 74 79 70 65 20 3d 20 6a 6f 69 6e 74 79 70  intype = jointyp
19ae0 65 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4e 6f 77  e;.  }..  /* Now
19af0 20 62 65 67 69 6e 20 73 75 62 73 74 69 74 75 74   begin substitut
19b00 69 6e 67 20 73 75 62 71 75 65 72 79 20 72 65 73  ing subquery res
19b10 75 6c 74 20 73 65 74 20 65 78 70 72 65 73 73 69  ult set expressi
19b20 6f 6e 73 20 66 6f 72 20 0a 20 20 2a 2a 20 72 65  ons for .  ** re
19b30 66 65 72 65 6e 63 65 73 20 74 6f 20 74 68 65 20  ferences to the 
19b40 69 50 61 72 65 6e 74 20 69 6e 20 74 68 65 20 6f  iParent in the o
19b50 75 74 65 72 20 71 75 65 72 79 2e 0a 20 20 2a 2a  uter query..  **
19b60 20 0a 20 20 2a 2a 20 45 78 61 6d 70 6c 65 3a 0a   .  ** Example:.
19b70 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 53 45 4c 45    **.  **   SELE
19b80 43 54 20 61 2b 35 2c 20 62 2a 31 30 20 46 52 4f  CT a+5, b*10 FRO
19b90 4d 20 28 53 45 4c 45 43 54 20 78 2a 33 20 41 53  M (SELECT x*3 AS
19ba0 20 61 2c 20 79 2b 31 30 20 41 53 20 62 20 46 52   a, y+10 AS b FR
19bb0 4f 4d 20 74 31 29 20 57 48 45 52 45 20 61 3e 62  OM t1) WHERE a>b
19bc0 3b 0a 20 20 2a 2a 20 20 20 5c 20 20 20 20 20 20  ;.  **   \      
19bd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c                 \
19be0 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 20 73 75  _____________ su
19bf0 62 71 75 65 72 79 20 5f 5f 5f 5f 5f 5f 5f 5f 5f  bquery _________
19c00 5f 2f 20 20 20 20 20 20 20 20 20 20 2f 0a 20 20  _/          /.  
19c10 2a 2a 20 20 20 20 5c 5f 5f 5f 5f 5f 5f 5f 5f 5f  **    \_________
19c20 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 20 6f 75 74  ____________ out
19c30 65 72 20 71 75 65 72 79 20 5f 5f 5f 5f 5f 5f 5f  er query _______
19c40 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f  ________________
19c50 5f 5f 5f 5f 5f 5f 5f 2f 0a 20 20 2a 2a 0a 20 20  _______/.  **.  
19c60 2a 2a 20 57 65 20 6c 6f 6f 6b 20 61 74 20 65 76  ** We look at ev
19c70 65 72 79 20 65 78 70 72 65 73 73 69 6f 6e 20 69  ery expression i
19c80 6e 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72  n the outer quer
19c90 79 20 61 6e 64 20 65 76 65 72 79 20 70 6c 61 63  y and every plac
19ca0 65 20 77 65 20 73 65 65 0a 20 20 2a 2a 20 22 61  e we see.  ** "a
19cb0 22 20 77 65 20 73 75 62 73 74 69 74 75 74 65 20  " we substitute 
19cc0 22 78 2a 33 22 20 61 6e 64 20 65 76 65 72 79 20  "x*3" and every 
19cd0 70 6c 61 63 65 20 77 65 20 73 65 65 20 22 62 22  place we see "b"
19ce0 20 77 65 20 73 75 62 73 74 69 74 75 74 65 20 22   we substitute "
19cf0 79 2b 31 30 22 2e 0a 20 20 2a 2f 0a 20 20 70 4c  y+10"..  */.  pL
19d00 69 73 74 20 3d 20 70 2d 3e 70 45 4c 69 73 74 3b  ist = p->pEList;
19d10 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4c  .  for(i=0; i<pL
19d20 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29  ist->nExpr; i++)
19d30 7b 0a 20 20 20 20 45 78 70 72 20 2a 70 45 78 70  {.    Expr *pExp
19d40 72 3b 0a 20 20 20 20 69 66 28 20 70 4c 69 73 74  r;.    if( pList
19d50 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 3d 3d 30 20  ->a[i].zName==0 
19d60 26 26 20 28 70 45 78 70 72 20 3d 20 70 4c 69 73  && (pExpr = pLis
19d70 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 29 2d 3e  t->a[i].pExpr)->
19d80 73 70 61 6e 2e 7a 21 3d 30 20 29 7b 0a 20 20 20  span.z!=0 ){.   
19d90 20 20 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a     pList->a[i].z
19da0 4e 61 6d 65 20 3d 20 0a 20 20 20 20 20 20 20 20  Name = .        
19db0 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 53 74       sqlite3DbSt
19dc0 72 4e 44 75 70 28 64 62 2c 20 28 63 68 61 72 2a  rNDup(db, (char*
19dd0 29 70 45 78 70 72 2d 3e 73 70 61 6e 2e 7a 2c 20  )pExpr->span.z, 
19de0 70 45 78 70 72 2d 3e 73 70 61 6e 2e 6e 29 3b 0a  pExpr->span.n);.
19df0 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 75 62 73      }.  }.  subs
19e00 74 45 78 70 72 4c 69 73 74 28 64 62 2c 20 70 2d  tExprList(db, p-
19e10 3e 70 45 4c 69 73 74 2c 20 69 50 61 72 65 6e 74  >pEList, iParent
19e20 2c 20 70 53 75 62 2d 3e 70 45 4c 69 73 74 29 3b  , pSub->pEList);
19e30 0a 20 20 69 66 28 20 69 73 41 67 67 20 29 7b 0a  .  if( isAgg ){.
19e40 20 20 20 20 73 75 62 73 74 45 78 70 72 4c 69 73      substExprLis
19e50 74 28 64 62 2c 20 70 2d 3e 70 47 72 6f 75 70 42  t(db, p->pGroupB
19e60 79 2c 20 69 50 61 72 65 6e 74 2c 20 70 53 75 62  y, iParent, pSub
19e70 2d 3e 70 45 4c 69 73 74 29 3b 0a 20 20 20 20 73  ->pEList);.    s
19e80 75 62 73 74 45 78 70 72 28 64 62 2c 20 70 2d 3e  ubstExpr(db, p->
19e90 70 48 61 76 69 6e 67 2c 20 69 50 61 72 65 6e 74  pHaving, iParent
19ea0 2c 20 70 53 75 62 2d 3e 70 45 4c 69 73 74 29 3b  , pSub->pEList);
19eb0 0a 20 20 7d 0a 20 20 69 66 28 20 70 53 75 62 2d  .  }.  if( pSub-
19ec0 3e 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20  >pOrderBy ){.   
19ed0 20 61 73 73 65 72 74 28 20 70 2d 3e 70 4f 72 64   assert( p->pOrd
19ee0 65 72 42 79 3d 3d 30 20 29 3b 0a 20 20 20 20 70  erBy==0 );.    p
19ef0 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20 70 53 75  ->pOrderBy = pSu
19f00 62 2d 3e 70 4f 72 64 65 72 42 79 3b 0a 20 20 20  b->pOrderBy;.   
19f10 20 70 53 75 62 2d 3e 70 4f 72 64 65 72 42 79 20   pSub->pOrderBy 
19f20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  = 0;.  }else if(
19f30 20 70 2d 3e 70 4f 72 64 65 72 42 79 20 29 7b 0a   p->pOrderBy ){.
19f40 20 20 20 20 73 75 62 73 74 45 78 70 72 4c 69 73      substExprLis
19f50 74 28 64 62 2c 20 70 2d 3e 70 4f 72 64 65 72 42  t(db, p->pOrderB
19f60 79 2c 20 69 50 61 72 65 6e 74 2c 20 70 53 75 62  y, iParent, pSub
19f70 2d 3e 70 45 4c 69 73 74 29 3b 0a 20 20 7d 0a 20  ->pEList);.  }. 
19f80 20 69 66 28 20 70 53 75 62 2d 3e 70 57 68 65 72   if( pSub->pWher
19f90 65 20 29 7b 0a 20 20 20 20 70 57 68 65 72 65 20  e ){.    pWhere 
19fa0 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44 75 70  = sqlite3ExprDup
19fb0 28 64 62 2c 20 70 53 75 62 2d 3e 70 57 68 65 72  (db, pSub->pWher
19fc0 65 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  e);.  }else{.   
19fd0 20 70 57 68 65 72 65 20 3d 20 30 3b 0a 20 20 7d   pWhere = 0;.  }
19fe0 0a 20 20 69 66 28 20 73 75 62 71 75 65 72 79 49  .  if( subqueryI
19ff0 73 41 67 67 20 29 7b 0a 20 20 20 20 61 73 73 65  sAgg ){.    asse
1a000 72 74 28 20 70 2d 3e 70 48 61 76 69 6e 67 3d 3d  rt( p->pHaving==
1a010 30 20 29 3b 0a 20 20 20 20 70 2d 3e 70 48 61 76  0 );.    p->pHav
1a020 69 6e 67 20 3d 20 70 2d 3e 70 57 68 65 72 65 3b  ing = p->pWhere;
1a030 0a 20 20 20 20 70 2d 3e 70 57 68 65 72 65 20 3d  .    p->pWhere =
1a040 20 70 57 68 65 72 65 3b 0a 20 20 20 20 73 75 62   pWhere;.    sub
1a050 73 74 45 78 70 72 28 64 62 2c 20 70 2d 3e 70 48  stExpr(db, p->pH
1a060 61 76 69 6e 67 2c 20 69 50 61 72 65 6e 74 2c 20  aving, iParent, 
1a070 70 53 75 62 2d 3e 70 45 4c 69 73 74 29 3b 0a 20  pSub->pEList);. 
1a080 20 20 20 70 2d 3e 70 48 61 76 69 6e 67 20 3d 20     p->pHaving = 
1a090 73 71 6c 69 74 65 33 45 78 70 72 41 6e 64 28 64  sqlite3ExprAnd(d
1a0a0 62 2c 20 70 2d 3e 70 48 61 76 69 6e 67 2c 20 0a  b, p->pHaving, .
1a0b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a0c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a0d0 73 71 6c 69 74 65 33 45 78 70 72 44 75 70 28 64  sqlite3ExprDup(d
1a0e0 62 2c 20 70 53 75 62 2d 3e 70 48 61 76 69 6e 67  b, pSub->pHaving
1a0f0 29 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  ));.    assert( 
1a100 70 2d 3e 70 47 72 6f 75 70 42 79 3d 3d 30 20 29  p->pGroupBy==0 )
1a110 3b 0a 20 20 20 20 70 2d 3e 70 47 72 6f 75 70 42  ;.    p->pGroupB
1a120 79 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c  y = sqlite3ExprL
1a130 69 73 74 44 75 70 28 64 62 2c 20 70 53 75 62 2d  istDup(db, pSub-
1a140 3e 70 47 72 6f 75 70 42 79 29 3b 0a 20 20 7d 65  >pGroupBy);.  }e
1a150 6c 73 65 7b 0a 20 20 20 20 73 75 62 73 74 45 78  lse{.    substEx
1a160 70 72 28 64 62 2c 20 70 2d 3e 70 57 68 65 72 65  pr(db, p->pWhere
1a170 2c 20 69 50 61 72 65 6e 74 2c 20 70 53 75 62 2d  , iParent, pSub-
1a180 3e 70 45 4c 69 73 74 29 3b 0a 20 20 20 20 70 2d  >pEList);.    p-
1a190 3e 70 57 68 65 72 65 20 3d 20 73 71 6c 69 74 65  >pWhere = sqlite
1a1a0 33 45 78 70 72 41 6e 64 28 64 62 2c 20 70 2d 3e  3ExprAnd(db, p->
1a1b0 70 57 68 65 72 65 2c 20 70 57 68 65 72 65 29 3b  pWhere, pWhere);
1a1c0 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 66  .  }..  /* The f
1a1d0 6c 61 74 74 65 6e 65 64 20 71 75 65 72 79 20 69  lattened query i
1a1e0 73 20 64 69 73 74 69 6e 63 74 20 69 66 20 65 69  s distinct if ei
1a1f0 74 68 65 72 20 74 68 65 20 69 6e 6e 65 72 20 6f  ther the inner o
1a200 72 20 74 68 65 0a 20 20 2a 2a 20 6f 75 74 65 72  r the.  ** outer
1a210 20 71 75 65 72 79 20 69 73 20 64 69 73 74 69 6e   query is distin
1a220 63 74 2e 20 0a 20 20 2a 2f 0a 20 20 70 2d 3e 69  ct. .  */.  p->i
1a230 73 44 69 73 74 69 6e 63 74 20 3d 20 70 2d 3e 69  sDistinct = p->i
1a240 73 44 69 73 74 69 6e 63 74 20 7c 7c 20 70 53 75  sDistinct || pSu
1a250 62 2d 3e 69 73 44 69 73 74 69 6e 63 74 3b 0a 0a  b->isDistinct;..
1a260 20 20 2f 2a 0a 20 20 2a 2a 20 53 45 4c 45 43 54    /*.  ** SELECT
1a270 20 2e 2e 2e 20 46 52 4f 4d 20 28 53 45 4c 45 43   ... FROM (SELEC
1a280 54 20 2e 2e 2e 20 4c 49 4d 49 54 20 61 20 4f 46  T ... LIMIT a OF
1a290 46 53 45 54 20 62 29 20 4c 49 4d 49 54 20 78 20  FSET b) LIMIT x 
1a2a0 4f 46 46 53 45 54 20 79 3b 0a 20 20 2a 2a 0a 20  OFFSET y;.  **. 
1a2b0 20 2a 2a 20 4f 6e 65 20 69 73 20 74 65 6d 70 74   ** One is tempt
1a2c0 65 64 20 74 6f 20 74 72 79 20 74 6f 20 61 64 64  ed to try to add
1a2d0 20 61 20 61 6e 64 20 62 20 74 6f 20 63 6f 6d 62   a and b to comb
1a2e0 69 6e 65 20 74 68 65 20 6c 69 6d 69 74 73 2e 20  ine the limits. 
1a2f0 20 42 75 74 20 74 68 69 73 0a 20 20 2a 2a 20 64   But this.  ** d
1a300 6f 65 73 20 6e 6f 74 20 77 6f 72 6b 20 69 66 20  oes not work if 
1a310 65 69 74 68 65 72 20 6c 69 6d 69 74 20 69 73 20  either limit is 
1a320 6e 65 67 61 74 69 76 65 2e 0a 20 20 2a 2f 0a 20  negative..  */. 
1a330 20 69 66 28 20 70 53 75 62 2d 3e 70 4c 69 6d 69   if( pSub->pLimi
1a340 74 20 29 7b 0a 20 20 20 20 70 2d 3e 70 4c 69 6d  t ){.    p->pLim
1a350 69 74 20 3d 20 70 53 75 62 2d 3e 70 4c 69 6d 69  it = pSub->pLimi
1a360 74 3b 0a 20 20 20 20 70 53 75 62 2d 3e 70 4c 69  t;.    pSub->pLi
1a370 6d 69 74 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20  mit = 0;.  }..  
1a380 2f 2a 20 46 69 6e 69 61 6c 6c 79 2c 20 64 65 6c  /* Finially, del
1a390 65 74 65 20 77 68 61 74 20 69 73 20 6c 65 66 74  ete what is left
1a3a0 20 6f 66 20 74 68 65 20 73 75 62 71 75 65 72 79   of the subquery
1a3b0 20 61 6e 64 20 72 65 74 75 72 6e 0a 20 20 2a 2a   and return.  **
1a3c0 20 73 75 63 63 65 73 73 2e 0a 20 20 2a 2f 0a 20   success..  */. 
1a3d0 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65   sqlite3SelectDe
1a3e0 6c 65 74 65 28 70 53 75 62 29 3b 0a 20 20 72 65  lete(pSub);.  re
1a3f0 74 75 72 6e 20 31 3b 0a 7d 0a 23 65 6e 64 69 66  turn 1;.}.#endif
1a400 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f   /* SQLITE_OMIT_
1a410 56 49 45 57 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 41  VIEW */../*.** A
1a420 6e 61 6c 79 7a 65 20 74 68 65 20 53 45 4c 45 43  nalyze the SELEC
1a430 54 20 73 74 61 74 65 6d 65 6e 74 20 70 61 73 73  T statement pass
1a440 65 64 20 61 73 20 61 6e 20 61 72 67 75 6d 65 6e  ed as an argumen
1a450 74 20 74 6f 20 73 65 65 20 69 66 20 69 74 0a 2a  t to see if it.*
1a460 2a 20 69 73 20 61 20 6d 69 6e 28 29 20 6f 72 20  * is a min() or 
1a470 6d 61 78 28 29 20 71 75 65 72 79 2e 20 52 65 74  max() query. Ret
1a480 75 72 6e 20 57 48 45 52 45 5f 4f 52 44 45 52 42  urn WHERE_ORDERB
1a490 59 5f 4d 49 4e 20 6f 72 20 57 48 45 52 45 5f 4f  Y_MIN or WHERE_O
1a4a0 52 44 45 52 42 59 5f 4d 41 58 20 69 66 20 0a 2a  RDERBY_MAX if .*
1a4b0 2a 20 69 74 20 69 73 2c 20 6f 72 20 30 20 6f 74  * it is, or 0 ot
1a4c0 68 65 72 77 69 73 65 2e 20 41 74 20 70 72 65 73  herwise. At pres
1a4d0 65 6e 74 2c 20 61 20 71 75 65 72 79 20 69 73 20  ent, a query is 
1a4e0 63 6f 6e 73 69 64 65 72 65 64 20 74 6f 20 62 65  considered to be
1a4f0 0a 2a 2a 20 61 20 6d 69 6e 28 29 2f 6d 61 78 28  .** a min()/max(
1a500 29 20 71 75 65 72 79 20 69 66 3a 0a 2a 2a 0a 2a  ) query if:.**.*
1a510 2a 20 20 20 31 2e 20 54 68 65 72 65 20 69 73 20  *   1. There is 
1a520 61 20 73 69 6e 67 6c 65 20 6f 62 6a 65 63 74 20  a single object 
1a530 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75  in the FROM clau
1a540 73 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 32 2e 20 54  se..**.**   2. T
1a550 68 65 72 65 20 69 73 20 61 20 73 69 6e 67 6c 65  here is a single
1a560 20 65 78 70 72 65 73 73 69 6f 6e 20 69 6e 20 74   expression in t
1a570 68 65 20 72 65 73 75 6c 74 20 73 65 74 2c 20 61  he result set, a
1a580 6e 64 20 69 74 20 69 73 0a 2a 2a 20 20 20 20 20  nd it is.**     
1a590 20 65 69 74 68 65 72 20 6d 69 6e 28 78 29 20 6f   either min(x) o
1a5a0 72 20 6d 61 78 28 78 29 2c 20 77 68 65 72 65 20  r max(x), where 
1a5b0 78 20 69 73 20 61 20 63 6f 6c 75 6d 6e 20 72 65  x is a column re
1a5c0 66 65 72 65 6e 63 65 2e 0a 2a 2f 0a 73 74 61 74  ference..*/.stat
1a5d0 69 63 20 69 6e 74 20 6d 69 6e 4d 61 78 51 75 65  ic int minMaxQue
1a5e0 72 79 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  ry(Parse *pParse
1a5f0 2c 20 53 65 6c 65 63 74 20 2a 70 29 7b 0a 20 20  , Select *p){.  
1a600 45 78 70 72 20 2a 70 45 78 70 72 3b 0a 20 20 45  Expr *pExpr;.  E
1a610 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 20  xprList *pEList 
1a620 3d 20 70 2d 3e 70 45 4c 69 73 74 3b 0a 0a 20 20  = p->pEList;..  
1a630 69 66 28 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70  if( pEList->nExp
1a640 72 21 3d 31 20 29 20 72 65 74 75 72 6e 20 57 48  r!=1 ) return WH
1a650 45 52 45 5f 4f 52 44 45 52 42 59 5f 4e 4f 52 4d  ERE_ORDERBY_NORM
1a660 41 4c 3b 0a 20 20 70 45 78 70 72 20 3d 20 70 45  AL;.  pExpr = pE
1a670 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72  List->a[0].pExpr
1a680 3b 0a 20 20 70 45 4c 69 73 74 20 3d 20 70 45 78  ;.  pEList = pEx
1a690 70 72 2d 3e 70 4c 69 73 74 3b 0a 20 20 69 66 28  pr->pList;.  if(
1a6a0 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 41   pExpr->op!=TK_A
1a6b0 47 47 5f 46 55 4e 43 54 49 4f 4e 20 7c 7c 20 70  GG_FUNCTION || p
1a6c0 45 4c 69 73 74 3d 3d 30 20 7c 7c 20 70 45 4c 69  EList==0 || pELi
1a6d0 73 74 2d 3e 6e 45 78 70 72 21 3d 31 20 29 20 72  st->nExpr!=1 ) r
1a6e0 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 70  eturn 0;.  if( p
1a6f0 45 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70  EList->a[0].pExp
1a700 72 2d 3e 6f 70 21 3d 54 4b 5f 41 47 47 5f 43 4f  r->op!=TK_AGG_CO
1a710 4c 55 4d 4e 20 29 20 72 65 74 75 72 6e 20 57 48  LUMN ) return WH
1a720 45 52 45 5f 4f 52 44 45 52 42 59 5f 4e 4f 52 4d  ERE_ORDERBY_NORM
1a730 41 4c 3b 0a 20 20 69 66 28 20 70 45 78 70 72 2d  AL;.  if( pExpr-
1a740 3e 74 6f 6b 65 6e 2e 6e 21 3d 33 20 29 20 72 65  >token.n!=3 ) re
1a750 74 75 72 6e 20 57 48 45 52 45 5f 4f 52 44 45 52  turn WHERE_ORDER
1a760 42 59 5f 4e 4f 52 4d 41 4c 3b 0a 20 20 69 66 28  BY_NORMAL;.  if(
1a770 20 73 71 6c 69 74 65 33 53 74 72 4e 49 43 6d 70   sqlite3StrNICmp
1a780 28 28 63 68 61 72 2a 29 70 45 78 70 72 2d 3e 74  ((char*)pExpr->t
1a790 6f 6b 65 6e 2e 7a 2c 22 6d 69 6e 22 2c 33 29 3d  oken.z,"min",3)=
1a7a0 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  =0 ){.    return
1a7b0 20 57 48 45 52 45 5f 4f 52 44 45 52 42 59 5f 4d   WHERE_ORDERBY_M
1a7c0 49 4e 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20  IN;.  }else if( 
1a7d0 73 71 6c 69 74 65 33 53 74 72 4e 49 43 6d 70 28  sqlite3StrNICmp(
1a7e0 28 63 68 61 72 2a 29 70 45 78 70 72 2d 3e 74 6f  (char*)pExpr->to
1a7f0 6b 65 6e 2e 7a 2c 22 6d 61 78 22 2c 33 29 3d 3d  ken.z,"max",3)==
1a800 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  0 ){.    return 
1a810 57 48 45 52 45 5f 4f 52 44 45 52 42 59 5f 4d 41  WHERE_ORDERBY_MA
1a820 58 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  X;.  }.  return 
1a830 57 48 45 52 45 5f 4f 52 44 45 52 42 59 5f 4e 4f  WHERE_ORDERBY_NO
1a840 52 4d 41 4c 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  RMAL;.}../*.** T
1a850 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 73 6f  his routine reso
1a860 6c 76 65 73 20 61 6e 79 20 6e 61 6d 65 73 20 75  lves any names u
1a870 73 65 64 20 69 6e 20 74 68 65 20 72 65 73 75 6c  sed in the resul
1a880 74 20 73 65 74 20 6f 66 20 74 68 65 0a 2a 2a 20  t set of the.** 
1a890 73 75 70 70 6c 69 65 64 20 53 45 4c 45 43 54 20  supplied SELECT 
1a8a0 73 74 61 74 65 6d 65 6e 74 2e 20 49 66 20 74 68  statement. If th
1a8b0 65 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  e SELECT stateme
1a8c0 6e 74 20 62 65 69 6e 67 20 72 65 73 6f 6c 76 65  nt being resolve
1a8d0 64 0a 2a 2a 20 69 73 20 61 20 73 75 62 2d 73 65  d.** is a sub-se
1a8e0 6c 65 63 74 2c 20 74 68 65 6e 20 70 4f 75 74 65  lect, then pOute
1a8f0 72 4e 43 20 69 73 20 61 20 70 6f 69 6e 74 65 72  rNC is a pointer
1a900 20 74 6f 20 74 68 65 20 4e 61 6d 65 43 6f 6e 74   to the NameCont
1a910 65 78 74 20 0a 2a 2a 20 6f 66 20 74 68 65 20 70  ext .** of the p
1a920 61 72 65 6e 74 20 53 45 4c 45 43 54 2e 0a 2a 2f  arent SELECT..*/
1a930 0a 69 6e 74 20 73 71 6c 69 74 65 33 53 65 6c 65  .int sqlite3Sele
1a940 63 74 52 65 73 6f 6c 76 65 28 0a 20 20 50 61 72  ctResolve(.  Par
1a950 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20  se *pParse,     
1a960 20 20 20 20 2f 2a 20 54 68 65 20 70 61 72 73 65      /* The parse
1a970 72 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53  r context */.  S
1a980 65 6c 65 63 74 20 2a 70 2c 20 20 20 20 20 20 20  elect *p,       
1a990 20 20 20 20 20 20 2f 2a 20 54 68 65 20 53 45 4c        /* The SEL
1a9a0 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 62 65  ECT statement be
1a9b0 69 6e 67 20 63 6f 64 65 64 2e 20 2a 2f 0a 20 20  ing coded. */.  
1a9c0 4e 61 6d 65 43 6f 6e 74 65 78 74 20 2a 70 4f 75  NameContext *pOu
1a9d0 74 65 72 4e 43 20 20 2f 2a 20 54 68 65 20 6f 75  terNC  /* The ou
1a9e0 74 65 72 20 6e 61 6d 65 20 63 6f 6e 74 65 78 74  ter name context
1a9f0 2e 20 4d 61 79 20 62 65 20 4e 55 4c 4c 2e 20 2a  . May be NULL. *
1aa00 2f 0a 29 7b 0a 20 20 45 78 70 72 4c 69 73 74 20  /.){.  ExprList 
1aa10 2a 70 45 4c 69 73 74 3b 20 20 20 20 20 20 20 20  *pEList;        
1aa20 20 20 2f 2a 20 52 65 73 75 6c 74 20 73 65 74 2e    /* Result set.
1aa30 20 2a 2f 0a 20 20 69 6e 74 20 69 3b 20 20 20 20   */.  int i;    
1aa40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1aa50 20 2f 2a 20 46 6f 72 2d 6c 6f 6f 70 20 76 61 72   /* For-loop var
1aa60 69 61 62 6c 65 20 75 73 65 64 20 69 6e 20 6d 75  iable used in mu
1aa70 6c 74 69 70 6c 65 20 70 6c 61 63 65 73 20 2a 2f  ltiple places */
1aa80 0a 20 20 4e 61 6d 65 43 6f 6e 74 65 78 74 20 73  .  NameContext s
1aa90 4e 43 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  NC;           /*
1aaa0 20 4c 6f 63 61 6c 20 6e 61 6d 65 2d 63 6f 6e 74   Local name-cont
1aab0 65 78 74 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73  ext */.  ExprLis
1aac0 74 20 2a 70 47 72 6f 75 70 42 79 3b 20 20 20 20  t *pGroupBy;    
1aad0 20 20 20 20 2f 2a 20 54 68 65 20 67 72 6f 75 70      /* The group
1aae0 20 62 79 20 63 6c 61 75 73 65 20 2a 2f 0a 0a 20   by clause */.. 
1aaf0 20 2f 2a 20 49 66 20 74 68 69 73 20 72 6f 75 74   /* If this rout
1ab00 69 6e 65 20 68 61 73 20 72 75 6e 20 62 65 66 6f  ine has run befo
1ab10 72 65 2c 20 72 65 74 75 72 6e 20 69 6d 6d 65 64  re, return immed
1ab20 69 61 74 65 6c 79 2e 20 2a 2f 0a 20 20 69 66 28  iately. */.  if(
1ab30 20 70 2d 3e 69 73 52 65 73 6f 6c 76 65 64 20 29   p->isResolved )
1ab40 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 21 70  {.    assert( !p
1ab50 4f 75 74 65 72 4e 43 20 29 3b 0a 20 20 20 20 72  OuterNC );.    r
1ab60 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
1ab70 0a 20 20 7d 0a 20 20 70 2d 3e 69 73 52 65 73 6f  .  }.  p->isReso
1ab80 6c 76 65 64 20 3d 20 31 3b 0a 0a 20 20 2f 2a 20  lved = 1;..  /* 
1ab90 49 66 20 74 68 65 72 65 20 68 61 76 65 20 61 6c  If there have al
1aba0 72 65 61 64 79 20 62 65 65 6e 20 65 72 72 6f 72  ready been error
1abb0 73 2c 20 64 6f 20 6e 6f 74 68 69 6e 67 2e 20 2a  s, do nothing. *
1abc0 2f 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e  /.  if( pParse->
1abd0 6e 45 72 72 3e 30 20 29 7b 0a 20 20 20 20 72 65  nErr>0 ){.    re
1abe0 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f  turn SQLITE_ERRO
1abf0 52 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 50 72 65  R;.  }..  /* Pre
1ac00 70 61 72 65 20 74 68 65 20 73 65 6c 65 63 74 20  pare the select 
1ac10 73 74 61 74 65 6d 65 6e 74 2e 20 54 68 69 73 20  statement. This 
1ac20 63 61 6c 6c 20 77 69 6c 6c 20 61 6c 6c 6f 63 61  call will alloca
1ac30 74 65 20 61 6c 6c 20 63 75 72 73 6f 72 73 0a 20  te all cursors. 
1ac40 20 2a 2a 20 72 65 71 75 69 72 65 64 20 74 6f 20   ** required to 
1ac50 68 61 6e 64 6c 65 20 74 68 65 20 74 61 62 6c 65  handle the table
1ac60 73 20 61 6e 64 20 73 75 62 71 75 65 72 69 65 73  s and subqueries
1ac70 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61   in the FROM cla
1ac80 75 73 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  use..  */.  if( 
1ac90 70 72 65 70 53 65 6c 65 63 74 53 74 6d 74 28 70  prepSelectStmt(p
1aca0 50 61 72 73 65 2c 20 70 29 20 29 7b 0a 20 20 20  Parse, p) ){.   
1acb0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45   return SQLITE_E
1acc0 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  RROR;.  }..  /* 
1acd0 52 65 73 6f 6c 76 65 20 74 68 65 20 65 78 70 72  Resolve the expr
1ace0 65 73 73 69 6f 6e 73 20 69 6e 20 74 68 65 20 4c  essions in the L
1acf0 49 4d 49 54 20 61 6e 64 20 4f 46 46 53 45 54 20  IMIT and OFFSET 
1ad00 63 6c 61 75 73 65 73 2e 20 54 68 65 73 65 0a 20  clauses. These. 
1ad10 20 2a 2a 20 61 72 65 20 6e 6f 74 20 61 6c 6c 6f   ** are not allo
1ad20 77 65 64 20 74 6f 20 72 65 66 65 72 20 74 6f 20  wed to refer to 
1ad30 61 6e 79 20 6e 61 6d 65 73 2c 20 73 6f 20 70 61  any names, so pa
1ad40 73 73 20 61 6e 20 65 6d 70 74 79 20 4e 61 6d 65  ss an empty Name
1ad50 43 6f 6e 74 65 78 74 2e 0a 20 20 2a 2f 0a 20 20  Context..  */.  
1ad60 6d 65 6d 73 65 74 28 26 73 4e 43 2c 20 30 2c 20  memset(&sNC, 0, 
1ad70 73 69 7a 65 6f 66 28 73 4e 43 29 29 3b 0a 20 20  sizeof(sNC));.  
1ad80 73 4e 43 2e 70 50 61 72 73 65 20 3d 20 70 50 61  sNC.pParse = pPa
1ad90 72 73 65 3b 0a 20 20 69 66 28 20 73 71 6c 69 74  rse;.  if( sqlit
1ada0 65 33 45 78 70 72 52 65 73 6f 6c 76 65 4e 61 6d  e3ExprResolveNam
1adb0 65 73 28 26 73 4e 43 2c 20 70 2d 3e 70 4c 69 6d  es(&sNC, p->pLim
1adc0 69 74 29 20 7c 7c 0a 20 20 20 20 20 20 73 71 6c  it) ||.      sql
1add0 69 74 65 33 45 78 70 72 52 65 73 6f 6c 76 65 4e  ite3ExprResolveN
1ade0 61 6d 65 73 28 26 73 4e 43 2c 20 70 2d 3e 70 4f  ames(&sNC, p->pO
1adf0 66 66 73 65 74 29 20 29 7b 0a 20 20 20 20 72 65  ffset) ){.    re
1ae00 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f  turn SQLITE_ERRO
1ae10 52 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 65 74  R;.  }..  /* Set
1ae20 20 75 70 20 74 68 65 20 6c 6f 63 61 6c 20 6e 61   up the local na
1ae30 6d 65 2d 63 6f 6e 74 65 78 74 20 74 6f 20 70 61  me-context to pa
1ae40 73 73 20 74 6f 20 45 78 70 72 52 65 73 6f 6c 76  ss to ExprResolv
1ae50 65 4e 61 6d 65 73 28 29 20 74 6f 0a 20 20 2a 2a  eNames() to.  **
1ae60 20 72 65 73 6f 6c 76 65 20 74 68 65 20 65 78 70   resolve the exp
1ae70 72 65 73 73 69 6f 6e 2d 6c 69 73 74 2e 0a 20 20  ression-list..  
1ae80 2a 2f 0a 20 20 73 4e 43 2e 61 6c 6c 6f 77 41 67  */.  sNC.allowAg
1ae90 67 20 3d 20 31 3b 0a 20 20 73 4e 43 2e 70 53 72  g = 1;.  sNC.pSr
1aea0 63 4c 69 73 74 20 3d 20 70 2d 3e 70 53 72 63 3b  cList = p->pSrc;
1aeb0 0a 20 20 73 4e 43 2e 70 4e 65 78 74 20 3d 20 70  .  sNC.pNext = p
1aec0 4f 75 74 65 72 4e 43 3b 0a 0a 20 20 2f 2a 20 52  OuterNC;..  /* R
1aed0 65 73 6f 6c 76 65 20 6e 61 6d 65 73 20 69 6e 20  esolve names in 
1aee0 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 2e 20  the result set. 
1aef0 2a 2f 0a 20 20 70 45 4c 69 73 74 20 3d 20 70 2d  */.  pEList = p-
1af00 3e 70 45 4c 69 73 74 3b 0a 20 20 69 66 28 20 21  >pEList;.  if( !
1af10 70 45 4c 69 73 74 20 29 20 72 65 74 75 72 6e 20  pEList ) return 
1af20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20  SQLITE_ERROR;.  
1af30 66 6f 72 28 69 3d 30 3b 20 69 3c 70 45 4c 69 73  for(i=0; i<pELis
1af40 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a  t->nExpr; i++){.
1af50 20 20 20 20 45 78 70 72 20 2a 70 58 20 3d 20 70      Expr *pX = p
1af60 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70  EList->a[i].pExp
1af70 72 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74  r;.    if( sqlit
1af80 65 33 45 78 70 72 52 65 73 6f 6c 76 65 4e 61 6d  e3ExprResolveNam
1af90 65 73 28 26 73 4e 43 2c 20 70 58 29 20 29 7b 0a  es(&sNC, pX) ){.
1afa0 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
1afb0 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d  ITE_ERROR;.    }
1afc0 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68  .  }..  /* If th
1afd0 65 72 65 20 61 72 65 20 6e 6f 20 61 67 67 72 65  ere are no aggre
1afe0 67 61 74 65 20 66 75 6e 63 74 69 6f 6e 73 20 69  gate functions i
1aff0 6e 20 74 68 65 20 72 65 73 75 6c 74 2d 73 65 74  n the result-set
1b000 2c 20 61 6e 64 20 6e 6f 20 47 52 4f 55 50 20 42  , and no GROUP B
1b010 59 20 0a 20 20 2a 2a 20 65 78 70 72 65 73 73 69  Y .  ** expressi
1b020 6f 6e 2c 20 64 6f 20 6e 6f 74 20 61 6c 6c 6f 77  on, do not allow
1b030 20 61 67 67 72 65 67 61 74 65 73 20 69 6e 20 61   aggregates in a
1b040 6e 79 20 6f 66 20 74 68 65 20 6f 74 68 65 72 20  ny of the other 
1b050 65 78 70 72 65 73 73 69 6f 6e 73 2e 0a 20 20 2a  expressions..  *
1b060 2f 0a 20 20 61 73 73 65 72 74 28 20 21 70 2d 3e  /.  assert( !p->
1b070 69 73 41 67 67 20 29 3b 0a 20 20 70 47 72 6f 75  isAgg );.  pGrou
1b080 70 42 79 20 3d 20 70 2d 3e 70 47 72 6f 75 70 42  pBy = p->pGroupB
1b090 79 3b 0a 20 20 69 66 28 20 70 47 72 6f 75 70 42  y;.  if( pGroupB
1b0a0 79 20 7c 7c 20 73 4e 43 2e 68 61 73 41 67 67 20  y || sNC.hasAgg 
1b0b0 29 7b 0a 20 20 20 20 70 2d 3e 69 73 41 67 67 20  ){.    p->isAgg 
1b0c0 3d 20 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  = 1;.  }else{.  
1b0d0 20 20 73 4e 43 2e 61 6c 6c 6f 77 41 67 67 20 3d    sNC.allowAgg =
1b0e0 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66   0;.  }..  /* If
1b0f0 20 61 20 48 41 56 49 4e 47 20 63 6c 61 75 73 65   a HAVING clause
1b100 20 69 73 20 70 72 65 73 65 6e 74 2c 20 74 68 65   is present, the
1b110 6e 20 74 68 65 72 65 20 6d 75 73 74 20 62 65 20  n there must be 
1b120 61 20 47 52 4f 55 50 20 42 59 20 63 6c 61 75 73  a GROUP BY claus
1b130 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d  e..  */.  if( p-
1b140 3e 70 48 61 76 69 6e 67 20 26 26 20 21 70 47 72  >pHaving && !pGr
1b150 6f 75 70 42 79 20 29 7b 0a 20 20 20 20 73 71 6c  oupBy ){.    sql
1b160 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
1b170 72 73 65 2c 20 22 61 20 47 52 4f 55 50 20 42 59  rse, "a GROUP BY
1b180 20 63 6c 61 75 73 65 20 69 73 20 72 65 71 75 69   clause is requi
1b190 72 65 64 20 62 65 66 6f 72 65 20 48 41 56 49 4e  red before HAVIN
1b1a0 47 22 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  G");.    return 
1b1b0 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20  SQLITE_ERROR;.  
1b1c0 7d 0a 0a 20 20 2f 2a 20 41 64 64 20 74 68 65 20  }..  /* Add the 
1b1d0 65 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 20  expression list 
1b1e0 74 6f 20 74 68 65 20 6e 61 6d 65 2d 63 6f 6e 74  to the name-cont
1b1f0 65 78 74 20 62 65 66 6f 72 65 20 70 61 72 73 69  ext before parsi
1b200 6e 67 20 74 68 65 0a 20 20 2a 2a 20 6f 74 68 65  ng the.  ** othe
1b210 72 20 65 78 70 72 65 73 73 69 6f 6e 73 20 69 6e  r expressions in
1b220 20 74 68 65 20 53 45 4c 45 43 54 20 73 74 61 74   the SELECT stat
1b230 65 6d 65 6e 74 2e 20 54 68 69 73 20 69 73 20 73  ement. This is s
1b240 6f 20 74 68 61 74 0a 20 20 2a 2a 20 65 78 70 72  o that.  ** expr
1b250 65 73 73 69 6f 6e 73 20 69 6e 20 74 68 65 20 57  essions in the W
1b260 48 45 52 45 20 63 6c 61 75 73 65 20 28 65 74 63  HERE clause (etc
1b270 2e 29 20 63 61 6e 20 72 65 66 65 72 20 74 6f 20  .) can refer to 
1b280 65 78 70 72 65 73 73 69 6f 6e 73 20 62 79 0a 20  expressions by. 
1b290 20 2a 2a 20 61 6c 69 61 73 65 73 20 69 6e 20 74   ** aliases in t
1b2a0 68 65 20 72 65 73 75 6c 74 20 73 65 74 2e 0a 20  he result set.. 
1b2b0 20 2a 2a 0a 20 20 2a 2a 20 4d 69 6e 6f 72 20 70   **.  ** Minor p
1b2c0 6f 69 6e 74 3a 20 49 66 20 74 68 69 73 20 69 73  oint: If this is
1b2d0 20 74 68 65 20 63 61 73 65 2c 20 74 68 65 6e 20   the case, then 
1b2e0 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 77  the expression w
1b2f0 69 6c 6c 20 62 65 0a 20 20 2a 2a 20 72 65 2d 65  ill be.  ** re-e
1b300 76 61 6c 75 61 74 65 64 20 66 6f 72 20 65 61 63  valuated for eac
1b310 68 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20 69  h reference to i
1b320 74 2e 0a 20 20 2a 2f 0a 20 20 73 4e 43 2e 70 45  t..  */.  sNC.pE
1b330 4c 69 73 74 20 3d 20 70 2d 3e 70 45 4c 69 73 74  List = p->pEList
1b340 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 45  ;.  if( sqlite3E
1b350 78 70 72 52 65 73 6f 6c 76 65 4e 61 6d 65 73 28  xprResolveNames(
1b360 26 73 4e 43 2c 20 70 2d 3e 70 57 68 65 72 65 29  &sNC, p->pWhere)
1b370 20 7c 7c 0a 20 20 20 20 20 73 71 6c 69 74 65 33   ||.     sqlite3
1b380 45 78 70 72 52 65 73 6f 6c 76 65 4e 61 6d 65 73  ExprResolveNames
1b390 28 26 73 4e 43 2c 20 70 2d 3e 70 48 61 76 69 6e  (&sNC, p->pHavin
1b3a0 67 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  g) ){.    return
1b3b0 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20   SQLITE_ERROR;. 
1b3c0 20 7d 0a 20 20 69 66 28 20 70 2d 3e 70 50 72 69   }.  if( p->pPri
1b3d0 6f 72 3d 3d 30 20 29 7b 0a 20 20 20 20 69 66 28  or==0 ){.    if(
1b3e0 20 70 72 6f 63 65 73 73 4f 72 64 65 72 47 72 6f   processOrderGro
1b3f0 75 70 42 79 28 70 50 61 72 73 65 2c 20 70 2c 20  upBy(pParse, p, 
1b400 70 2d 3e 70 4f 72 64 65 72 42 79 2c 20 31 2c 20  p->pOrderBy, 1, 
1b410 26 73 4e 43 2e 68 61 73 41 67 67 29 20 29 7b 0a  &sNC.hasAgg) ){.
1b420 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
1b430 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d  ITE_ERROR;.    }
1b440 0a 20 20 7d 0a 20 20 69 66 28 20 70 72 6f 63 65  .  }.  if( proce
1b450 73 73 4f 72 64 65 72 47 72 6f 75 70 42 79 28 70  ssOrderGroupBy(p
1b460 50 61 72 73 65 2c 20 70 2c 20 70 47 72 6f 75 70  Parse, p, pGroup
1b470 42 79 2c 20 30 2c 20 26 73 4e 43 2e 68 61 73 41  By, 0, &sNC.hasA
1b480 67 67 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72  gg) ){.    retur
1b490 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a  n SQLITE_ERROR;.
1b4a0 20 20 7d 0a 0a 20 20 69 66 28 20 70 50 61 72 73    }..  if( pPars
1b4b0 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  e->db->mallocFai
1b4c0 6c 65 64 20 29 7b 0a 20 20 20 20 72 65 74 75 72  led ){.    retur
1b4d0 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  n SQLITE_NOMEM;.
1b4e0 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 73    }..  /* Make s
1b4f0 75 72 65 20 74 68 65 20 47 52 4f 55 50 20 42 59  ure the GROUP BY
1b500 20 63 6c 61 75 73 65 20 64 6f 65 73 20 6e 6f 74   clause does not
1b510 20 63 6f 6e 74 61 69 6e 20 61 67 67 72 65 67 61   contain aggrega
1b520 74 65 20 66 75 6e 63 74 69 6f 6e 73 2e 0a 20 20  te functions..  
1b530 2a 2f 0a 20 20 69 66 28 20 70 47 72 6f 75 70 42  */.  if( pGroupB
1b540 79 20 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20  y ){.    struct 
1b550 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70  ExprList_item *p
1b560 49 74 65 6d 3b 0a 20 20 0a 20 20 20 20 66 6f 72  Item;.  .    for
1b570 28 69 3d 30 2c 20 70 49 74 65 6d 3d 70 47 72 6f  (i=0, pItem=pGro
1b580 75 70 42 79 2d 3e 61 3b 20 69 3c 70 47 72 6f 75  upBy->a; i<pGrou
1b590 70 42 79 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 2c  pBy->nExpr; i++,
1b5a0 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 20   pItem++){.     
1b5b0 20 69 66 28 20 45 78 70 72 48 61 73 50 72 6f 70   if( ExprHasProp
1b5c0 65 72 74 79 28 70 49 74 65 6d 2d 3e 70 45 78 70  erty(pItem->pExp
1b5d0 72 2c 20 45 50 5f 41 67 67 29 20 29 7b 0a 20 20  r, EP_Agg) ){.  
1b5e0 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72        sqlite3Err
1b5f0 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 61  orMsg(pParse, "a
1b600 67 67 72 65 67 61 74 65 20 66 75 6e 63 74 69 6f  ggregate functio
1b610 6e 73 20 61 72 65 20 6e 6f 74 20 61 6c 6c 6f 77  ns are not allow
1b620 65 64 20 69 6e 20 22 0a 20 20 20 20 20 20 20 20  ed in ".        
1b630 20 20 20 20 22 74 68 65 20 47 52 4f 55 50 20 42      "the GROUP B
1b640 59 20 63 6c 61 75 73 65 22 29 3b 0a 20 20 20 20  Y clause");.    
1b650 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
1b660 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 7d  E_ERROR;.      }
1b670 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
1b680 20 49 66 20 74 68 69 73 20 69 73 20 6f 6e 65 20   If this is one 
1b690 53 45 4c 45 43 54 20 6f 66 20 61 20 63 6f 6d 70  SELECT of a comp
1b6a0 6f 75 6e 64 2c 20 62 65 20 73 75 72 65 20 74 6f  ound, be sure to
1b6b0 20 72 65 73 6f 6c 76 65 20 6e 61 6d 65 73 0a 20   resolve names. 
1b6c0 20 2a 2a 20 69 6e 20 74 68 65 20 6f 74 68 65 72   ** in the other
1b6d0 20 53 45 4c 45 43 54 73 2e 0a 20 20 2a 2f 0a 20   SELECTs..  */. 
1b6e0 20 69 66 28 20 70 2d 3e 70 50 72 69 6f 72 20 29   if( p->pPrior )
1b6f0 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 73 71 6c  {.    return sql
1b700 69 74 65 33 53 65 6c 65 63 74 52 65 73 6f 6c 76  ite3SelectResolv
1b710 65 28 70 50 61 72 73 65 2c 20 70 2d 3e 70 50 72  e(pParse, p->pPr
1b720 69 6f 72 2c 20 70 4f 75 74 65 72 4e 43 29 3b 0a  ior, pOuterNC);.
1b730 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65 74    }else{.    ret
1b740 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
1b750 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 73 65   }.}../*.** Rese
1b760 74 20 74 68 65 20 61 67 67 72 65 67 61 74 65 20  t the aggregate 
1b770 61 63 63 75 6d 75 6c 61 74 6f 72 2e 0a 2a 2a 0a  accumulator..**.
1b780 2a 2a 20 54 68 65 20 61 67 67 72 65 67 61 74 65  ** The aggregate
1b790 20 61 63 63 75 6d 75 6c 61 74 6f 72 20 69 73 20   accumulator is 
1b7a0 61 20 73 65 74 20 6f 66 20 6d 65 6d 6f 72 79 20  a set of memory 
1b7b0 63 65 6c 6c 73 20 74 68 61 74 20 68 6f 6c 64 0a  cells that hold.
1b7c0 2a 2a 20 69 6e 74 65 72 6d 65 64 69 61 74 65 20  ** intermediate 
1b7d0 72 65 73 75 6c 74 73 20 77 68 69 6c 65 20 63 61  results while ca
1b7e0 6c 63 75 6c 61 74 69 6e 67 20 61 6e 20 61 67 67  lculating an agg
1b7f0 72 65 67 61 74 65 2e 20 20 54 68 69 73 0a 2a 2a  regate.  This.**
1b800 20 72 6f 75 74 69 6e 65 20 73 69 6d 70 6c 79 20   routine simply 
1b810 73 74 6f 72 65 73 20 4e 55 4c 4c 73 20 69 6e 20  stores NULLs in 
1b820 61 6c 6c 20 6f 66 20 74 68 6f 73 65 20 6d 65 6d  all of those mem
1b830 6f 72 79 20 63 65 6c 6c 73 2e 0a 2a 2f 0a 73 74  ory cells..*/.st
1b840 61 74 69 63 20 76 6f 69 64 20 72 65 73 65 74 41  atic void resetA
1b850 63 63 75 6d 75 6c 61 74 6f 72 28 50 61 72 73 65  ccumulator(Parse
1b860 20 2a 70 50 61 72 73 65 2c 20 41 67 67 49 6e 66   *pParse, AggInf
1b870 6f 20 2a 70 41 67 67 49 6e 66 6f 29 7b 0a 20 20  o *pAggInfo){.  
1b880 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65  Vdbe *v = pParse
1b890 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74 20 69  ->pVdbe;.  int i
1b8a0 3b 0a 20 20 73 74 72 75 63 74 20 41 67 67 49 6e  ;.  struct AggIn
1b8b0 66 6f 5f 66 75 6e 63 20 2a 70 46 75 6e 63 3b 0a  fo_func *pFunc;.
1b8c0 20 20 69 66 28 20 70 41 67 67 49 6e 66 6f 2d 3e    if( pAggInfo->
1b8d0 6e 46 75 6e 63 2b 70 41 67 67 49 6e 66 6f 2d 3e  nFunc+pAggInfo->
1b8e0 6e 43 6f 6c 75 6d 6e 3d 3d 30 20 29 7b 0a 20 20  nColumn==0 ){.  
1b8f0 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20    return;.  }.  
1b900 66 6f 72 28 69 3d 30 3b 20 69 3c 70 41 67 67 49  for(i=0; i<pAggI
1b910 6e 66 6f 2d 3e 6e 43 6f 6c 75 6d 6e 3b 20 69 2b  nfo->nColumn; i+
1b920 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  +){.    sqlite3V
1b930 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
1b940 4e 75 6c 6c 2c 20 30 2c 20 70 41 67 67 49 6e 66  Null, 0, pAggInf
1b950 6f 2d 3e 61 43 6f 6c 5b 69 5d 2e 69 4d 65 6d 29  o->aCol[i].iMem)
1b960 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 70 46 75 6e  ;.  }.  for(pFun
1b970 63 3d 70 41 67 67 49 6e 66 6f 2d 3e 61 46 75 6e  c=pAggInfo->aFun
1b980 63 2c 20 69 3d 30 3b 20 69 3c 70 41 67 67 49 6e  c, i=0; i<pAggIn
1b990 66 6f 2d 3e 6e 46 75 6e 63 3b 20 69 2b 2b 2c 20  fo->nFunc; i++, 
1b9a0 70 46 75 6e 63 2b 2b 29 7b 0a 20 20 20 20 73 71  pFunc++){.    sq
1b9b0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
1b9c0 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20 70  v, OP_Null, 0, p
1b9d0 46 75 6e 63 2d 3e 69 4d 65 6d 29 3b 0a 20 20 20  Func->iMem);.   
1b9e0 20 69 66 28 20 70 46 75 6e 63 2d 3e 69 44 69 73   if( pFunc->iDis
1b9f0 74 69 6e 63 74 3e 3d 30 20 29 7b 0a 20 20 20 20  tinct>=0 ){.    
1ba00 20 20 45 78 70 72 20 2a 70 45 20 3d 20 70 46 75    Expr *pE = pFu
1ba10 6e 63 2d 3e 70 45 78 70 72 3b 0a 20 20 20 20 20  nc->pExpr;.     
1ba20 20 69 66 28 20 70 45 2d 3e 70 4c 69 73 74 3d 3d   if( pE->pList==
1ba30 30 20 7c 7c 20 70 45 2d 3e 70 4c 69 73 74 2d 3e  0 || pE->pList->
1ba40 6e 45 78 70 72 21 3d 31 20 29 7b 0a 20 20 20 20  nExpr!=1 ){.    
1ba50 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
1ba60 4d 73 67 28 70 50 61 72 73 65 2c 20 22 44 49 53  Msg(pParse, "DIS
1ba70 54 49 4e 43 54 20 69 6e 20 61 67 67 72 65 67 61  TINCT in aggrega
1ba80 74 65 20 6d 75 73 74 20 62 65 20 66 6f 6c 6c 6f  te must be follo
1ba90 77 65 64 20 22 0a 20 20 20 20 20 20 20 20 20 20  wed ".          
1baa0 20 22 62 79 20 61 6e 20 65 78 70 72 65 73 73 69   "by an expressi
1bab0 6f 6e 22 29 3b 0a 20 20 20 20 20 20 20 20 70 46  on");.        pF
1bac0 75 6e 63 2d 3e 69 44 69 73 74 69 6e 63 74 20 3d  unc->iDistinct =
1bad0 20 2d 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65   -1;.      }else
1bae0 7b 0a 20 20 20 20 20 20 20 20 4b 65 79 49 6e 66  {.        KeyInf
1baf0 6f 20 2a 70 4b 65 79 49 6e 66 6f 20 3d 20 6b 65  o *pKeyInfo = ke
1bb00 79 49 6e 66 6f 46 72 6f 6d 45 78 70 72 4c 69 73  yInfoFromExprLis
1bb10 74 28 70 50 61 72 73 65 2c 20 70 45 2d 3e 70 4c  t(pParse, pE->pL
1bb20 69 73 74 29 3b 0a 20 20 20 20 20 20 20 20 73 71  ist);.        sq
1bb30 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28  lite3VdbeAddOp4(
1bb40 76 2c 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65  v, OP_OpenEpheme
1bb50 72 61 6c 2c 20 70 46 75 6e 63 2d 3e 69 44 69 73  ral, pFunc->iDis
1bb60 74 69 6e 63 74 2c 20 30 2c 20 30 2c 0a 20 20 20  tinct, 0, 0,.   
1bb70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bb80 20 20 20 20 20 20 20 28 63 68 61 72 2a 29 70 4b         (char*)pK
1bb90 65 79 49 6e 66 6f 2c 20 50 34 5f 4b 45 59 49 4e  eyInfo, P4_KEYIN
1bba0 46 4f 5f 48 41 4e 44 4f 46 46 29 3b 0a 20 20 20  FO_HANDOFF);.   
1bbb0 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d     }.    }.  }.}
1bbc0 0a 0a 2f 2a 0a 2a 2a 20 49 6e 76 6f 6b 65 20 74  ../*.** Invoke t
1bbd0 68 65 20 4f 50 5f 41 67 67 46 69 6e 61 6c 69 7a  he OP_AggFinaliz
1bbe0 65 20 6f 70 63 6f 64 65 20 66 6f 72 20 65 76 65  e opcode for eve
1bbf0 72 79 20 61 67 67 72 65 67 61 74 65 20 66 75 6e  ry aggregate fun
1bc00 63 74 69 6f 6e 0a 2a 2a 20 69 6e 20 74 68 65 20  ction.** in the 
1bc10 41 67 67 49 6e 66 6f 20 73 74 72 75 63 74 75 72  AggInfo structur
1bc20 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  e..*/.static voi
1bc30 64 20 66 69 6e 61 6c 69 7a 65 41 67 67 46 75 6e  d finalizeAggFun
1bc40 63 74 69 6f 6e 73 28 50 61 72 73 65 20 2a 70 50  ctions(Parse *pP
1bc50 61 72 73 65 2c 20 41 67 67 49 6e 66 6f 20 2a 70  arse, AggInfo *p
1bc60 41 67 67 49 6e 66 6f 29 7b 0a 20 20 56 64 62 65  AggInfo){.  Vdbe
1bc70 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56   *v = pParse->pV
1bc80 64 62 65 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  dbe;.  int i;.  
1bc90 73 74 72 75 63 74 20 41 67 67 49 6e 66 6f 5f 66  struct AggInfo_f
1bca0 75 6e 63 20 2a 70 46 3b 0a 20 20 66 6f 72 28 69  unc *pF;.  for(i
1bcb0 3d 30 2c 20 70 46 3d 70 41 67 67 49 6e 66 6f 2d  =0, pF=pAggInfo-
1bcc0 3e 61 46 75 6e 63 3b 20 69 3c 70 41 67 67 49 6e  >aFunc; i<pAggIn
1bcd0 66 6f 2d 3e 6e 46 75 6e 63 3b 20 69 2b 2b 2c 20  fo->nFunc; i++, 
1bce0 70 46 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72 4c  pF++){.    ExprL
1bcf0 69 73 74 20 2a 70 4c 69 73 74 20 3d 20 70 46 2d  ist *pList = pF-
1bd00 3e 70 45 78 70 72 2d 3e 70 4c 69 73 74 3b 0a 20  >pExpr->pList;. 
1bd10 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
1bd20 64 4f 70 34 28 76 2c 20 4f 50 5f 41 67 67 46 69  dOp4(v, OP_AggFi
1bd30 6e 61 6c 2c 20 70 46 2d 3e 69 4d 65 6d 2c 20 70  nal, pF->iMem, p
1bd40 4c 69 73 74 20 3f 20 70 4c 69 73 74 2d 3e 6e 45  List ? pList->nE
1bd50 78 70 72 20 3a 20 30 2c 20 30 2c 0a 20 20 20 20  xpr : 0, 0,.    
1bd60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bd70 20 20 28 76 6f 69 64 2a 29 70 46 2d 3e 70 46 75    (void*)pF->pFu
1bd80 6e 63 2c 20 50 34 5f 46 55 4e 43 44 45 46 29 3b  nc, P4_FUNCDEF);
1bd90 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 70  .  }.}../*.** Up
1bda0 64 61 74 65 20 74 68 65 20 61 63 63 75 6d 75 6c  date the accumul
1bdb0 61 74 6f 72 20 6d 65 6d 6f 72 79 20 63 65 6c 6c  ator memory cell
1bdc0 73 20 66 6f 72 20 61 6e 20 61 67 67 72 65 67 61  s for an aggrega
1bdd0 74 65 20 62 61 73 65 64 20 6f 6e 0a 2a 2a 20 74  te based on.** t
1bde0 68 65 20 63 75 72 72 65 6e 74 20 63 75 72 73 6f  he current curso
1bdf0 72 20 70 6f 73 69 74 69 6f 6e 2e 0a 2a 2f 0a 73  r position..*/.s
1be00 74 61 74 69 63 20 76 6f 69 64 20 75 70 64 61 74  tatic void updat
1be10 65 41 63 63 75 6d 75 6c 61 74 6f 72 28 50 61 72  eAccumulator(Par
1be20 73 65 20 2a 70 50 61 72 73 65 2c 20 41 67 67 49  se *pParse, AggI
1be30 6e 66 6f 20 2a 70 41 67 67 49 6e 66 6f 29 7b 0a  nfo *pAggInfo){.
1be40 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72    Vdbe *v = pPar
1be50 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74  se->pVdbe;.  int
1be60 20 69 3b 0a 20 20 73 74 72 75 63 74 20 41 67 67   i;.  struct Agg
1be70 49 6e 66 6f 5f 66 75 6e 63 20 2a 70 46 3b 0a 20  Info_func *pF;. 
1be80 20 73 74 72 75 63 74 20 41 67 67 49 6e 66 6f 5f   struct AggInfo_
1be90 63 6f 6c 20 2a 70 43 3b 0a 0a 20 20 70 41 67 67  col *pC;..  pAgg
1bea0 49 6e 66 6f 2d 3e 64 69 72 65 63 74 4d 6f 64 65  Info->directMode
1beb0 20 3d 20 31 3b 0a 20 20 66 6f 72 28 69 3d 30 2c   = 1;.  for(i=0,
1bec0 20 70 46 3d 70 41 67 67 49 6e 66 6f 2d 3e 61 46   pF=pAggInfo->aF
1bed0 75 6e 63 3b 20 69 3c 70 41 67 67 49 6e 66 6f 2d  unc; i<pAggInfo-
1bee0 3e 6e 46 75 6e 63 3b 20 69 2b 2b 2c 20 70 46 2b  >nFunc; i++, pF+
1bef0 2b 29 7b 0a 20 20 20 20 69 6e 74 20 6e 41 72 67  +){.    int nArg
1bf00 3b 0a 20 20 20 20 69 6e 74 20 61 64 64 72 4e 65  ;.    int addrNe
1bf10 78 74 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20  xt = 0;.    int 
1bf20 72 65 67 41 67 67 3b 0a 20 20 20 20 45 78 70 72  regAgg;.    Expr
1bf30 4c 69 73 74 20 2a 70 4c 69 73 74 20 3d 20 70 46  List *pList = pF
1bf40 2d 3e 70 45 78 70 72 2d 3e 70 4c 69 73 74 3b 0a  ->pExpr->pList;.
1bf50 20 20 20 20 69 66 28 20 70 4c 69 73 74 20 29 7b      if( pList ){
1bf60 0a 20 20 20 20 20 20 6e 41 72 67 20 3d 20 70 4c  .      nArg = pL
1bf70 69 73 74 2d 3e 6e 45 78 70 72 3b 0a 20 20 20 20  ist->nExpr;.    
1bf80 20 20 72 65 67 41 67 67 20 3d 20 73 71 6c 69 74    regAgg = sqlit
1bf90 65 33 47 65 74 54 65 6d 70 52 61 6e 67 65 28 70  e3GetTempRange(p
1bfa0 50 61 72 73 65 2c 20 6e 41 72 67 29 3b 0a 20 20  Parse, nArg);.  
1bfb0 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
1bfc0 6f 64 65 45 78 70 72 4c 69 73 74 28 70 50 61 72  odeExprList(pPar
1bfd0 73 65 2c 20 70 4c 69 73 74 2c 20 72 65 67 41 67  se, pList, regAg
1bfe0 67 2c 20 30 29 3b 0a 20 20 20 20 7d 65 6c 73 65  g, 0);.    }else
1bff0 7b 0a 20 20 20 20 20 20 6e 41 72 67 20 3d 20 30  {.      nArg = 0
1c000 3b 0a 20 20 20 20 20 20 72 65 67 41 67 67 20 3d  ;.      regAgg =
1c010 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66   0;.    }.    if
1c020 28 20 70 46 2d 3e 69 44 69 73 74 69 6e 63 74 3e  ( pF->iDistinct>
1c030 3d 30 20 29 7b 0a 20 20 20 20 20 20 61 64 64 72  =0 ){.      addr
1c040 4e 65 78 74 20 3d 20 73 71 6c 69 74 65 33 56 64  Next = sqlite3Vd
1c050 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a  beMakeLabel(v);.
1c060 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6e 41        assert( nA
1c070 72 67 3d 3d 31 20 29 3b 0a 20 20 20 20 20 20 63  rg==1 );.      c
1c080 6f 64 65 44 69 73 74 69 6e 63 74 28 70 50 61 72  odeDistinct(pPar
1c090 73 65 2c 20 70 46 2d 3e 69 44 69 73 74 69 6e 63  se, pF->iDistinc
1c0a0 74 2c 20 61 64 64 72 4e 65 78 74 2c 20 31 2c 20  t, addrNext, 1, 
1c0b0 72 65 67 41 67 67 29 3b 0a 20 20 20 20 7d 0a 20  regAgg);.    }. 
1c0c0 20 20 20 69 66 28 20 70 46 2d 3e 70 46 75 6e 63     if( pF->pFunc
1c0d0 2d 3e 6e 65 65 64 43 6f 6c 6c 53 65 71 20 29 7b  ->needCollSeq ){
1c0e0 0a 20 20 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a  .      CollSeq *
1c0f0 70 43 6f 6c 6c 20 3d 20 30 3b 0a 20 20 20 20 20  pColl = 0;.     
1c100 20 73 74 72 75 63 74 20 45 78 70 72 4c 69 73 74   struct ExprList
1c110 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20  _item *pItem;.  
1c120 20 20 20 20 69 6e 74 20 6a 3b 0a 20 20 20 20 20      int j;.     
1c130 20 61 73 73 65 72 74 28 20 70 4c 69 73 74 21 3d   assert( pList!=
1c140 30 20 29 3b 20 20 2f 2a 20 70 4c 69 73 74 21 3d  0 );  /* pList!=
1c150 30 20 69 66 20 70 46 2d 3e 70 46 75 6e 63 2d 3e  0 if pF->pFunc->
1c160 6e 65 65 64 43 6f 6c 6c 53 65 71 20 69 73 20 74  needCollSeq is t
1c170 72 75 65 20 2a 2f 0a 20 20 20 20 20 20 66 6f 72  rue */.      for
1c180 28 6a 3d 30 2c 20 70 49 74 65 6d 3d 70 4c 69 73  (j=0, pItem=pLis
1c190 74 2d 3e 61 3b 20 21 70 43 6f 6c 6c 20 26 26 20  t->a; !pColl && 
1c1a0 6a 3c 6e 41 72 67 3b 20 6a 2b 2b 2c 20 70 49 74  j<nArg; j++, pIt
1c1b0 65 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 70  em++){.        p
1c1c0 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 45 78  Coll = sqlite3Ex
1c1d0 70 72 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65  prCollSeq(pParse
1c1e0 2c 20 70 49 74 65 6d 2d 3e 70 45 78 70 72 29 3b  , pItem->pExpr);
1c1f0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
1c200 66 28 20 21 70 43 6f 6c 6c 20 29 7b 0a 20 20 20  f( !pColl ){.   
1c210 20 20 20 20 20 70 43 6f 6c 6c 20 3d 20 70 50 61       pColl = pPa
1c220 72 73 65 2d 3e 64 62 2d 3e 70 44 66 6c 74 43 6f  rse->db->pDfltCo
1c230 6c 6c 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ll;.      }.    
1c240 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
1c250 4f 70 34 28 76 2c 20 4f 50 5f 43 6f 6c 6c 53 65  Op4(v, OP_CollSe
1c260 71 2c 20 30 2c 20 30 2c 20 30 2c 20 28 63 68 61  q, 0, 0, 0, (cha
1c270 72 20 2a 29 70 43 6f 6c 6c 2c 20 50 34 5f 43 4f  r *)pColl, P4_CO
1c280 4c 4c 53 45 51 29 3b 0a 20 20 20 20 7d 0a 20 20  LLSEQ);.    }.  
1c290 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
1c2a0 4f 70 34 28 76 2c 20 4f 50 5f 41 67 67 53 74 65  Op4(v, OP_AggSte
1c2b0 70 2c 20 30 2c 20 72 65 67 41 67 67 2c 20 70 46  p, 0, regAgg, pF
1c2c0 2d 3e 69 4d 65 6d 2c 0a 20 20 20 20 20 20 20 20  ->iMem,.        
1c2d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 76                (v
1c2e0 6f 69 64 2a 29 70 46 2d 3e 70 46 75 6e 63 2c 20  oid*)pF->pFunc, 
1c2f0 50 34 5f 46 55 4e 43 44 45 46 29 3b 0a 20 20 20  P4_FUNCDEF);.   
1c300 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e   sqlite3VdbeChan
1c310 67 65 50 35 28 76 2c 20 6e 41 72 67 29 3b 0a 20  geP5(v, nArg);. 
1c320 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73     sqlite3Releas
1c330 65 54 65 6d 70 52 61 6e 67 65 28 70 50 61 72 73  eTempRange(pPars
1c340 65 2c 20 72 65 67 41 67 67 2c 20 6e 41 72 67 29  e, regAgg, nArg)
1c350 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70  ;.    sqlite3Exp
1c360 72 43 61 63 68 65 41 66 66 69 6e 69 74 79 43 68  rCacheAffinityCh
1c370 61 6e 67 65 28 70 50 61 72 73 65 2c 20 72 65 67  ange(pParse, reg
1c380 41 67 67 2c 20 6e 41 72 67 29 3b 0a 20 20 20 20  Agg, nArg);.    
1c390 69 66 28 20 61 64 64 72 4e 65 78 74 20 29 7b 0a  if( addrNext ){.
1c3a0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
1c3b0 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c  eResolveLabel(v,
1c3c0 20 61 64 64 72 4e 65 78 74 29 3b 0a 20 20 20 20   addrNext);.    
1c3d0 7d 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d 30 2c  }.  }.  for(i=0,
1c3e0 20 70 43 3d 70 41 67 67 49 6e 66 6f 2d 3e 61 43   pC=pAggInfo->aC
1c3f0 6f 6c 3b 20 69 3c 70 41 67 67 49 6e 66 6f 2d 3e  ol; i<pAggInfo->
1c400 6e 41 63 63 75 6d 75 6c 61 74 6f 72 3b 20 69 2b  nAccumulator; i+
1c410 2b 2c 20 70 43 2b 2b 29 7b 0a 20 20 20 20 73 71  +, pC++){.    sq
1c420 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28 70 50  lite3ExprCode(pP
1c430 61 72 73 65 2c 20 70 43 2d 3e 70 45 78 70 72 2c  arse, pC->pExpr,
1c440 20 70 43 2d 3e 69 4d 65 6d 29 3b 0a 20 20 7d 0a   pC->iMem);.  }.
1c450 20 20 70 41 67 67 49 6e 66 6f 2d 3e 64 69 72 65    pAggInfo->dire
1c460 63 74 4d 6f 64 65 20 3d 20 30 3b 0a 7d 0a 0a 23  ctMode = 0;.}..#
1c470 69 66 20 30 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  if 0./*.** This 
1c480 66 75 6e 63 74 69 6f 6e 20 69 73 20 75 73 65 64  function is used
1c490 20 77 68 65 6e 20 61 20 53 45 4c 45 43 54 20 73   when a SELECT s
1c4a0 74 61 74 65 6d 65 6e 74 20 69 73 20 75 73 65 64  tatement is used
1c4b0 20 74 6f 20 63 72 65 61 74 65 20 61 0a 2a 2a 20   to create a.** 
1c4c0 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20  temporary table 
1c4d0 66 6f 72 20 69 74 65 72 61 74 69 6e 67 20 74 68  for iterating th
1c4e0 72 6f 75 67 68 20 77 68 65 6e 20 72 75 6e 6e 69  rough when runni
1c4f0 6e 67 20 61 6e 20 49 4e 53 54 45 41 44 20 4f 46  ng an INSTEAD OF
1c500 0a 2a 2a 20 55 50 44 41 54 45 20 6f 72 20 49 4e  .** UPDATE or IN
1c510 53 54 45 41 44 20 4f 46 20 44 45 4c 45 54 45 20  STEAD OF DELETE 
1c520 74 72 69 67 67 65 72 2e 20 0a 2a 2a 0a 2a 2a 20  trigger. .**.** 
1c530 49 66 20 70 6f 73 73 69 62 6c 65 2c 20 74 68 65  If possible, the
1c540 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
1c550 74 20 69 73 20 6d 6f 64 69 66 69 65 64 20 73 6f  t is modified so
1c560 20 74 68 61 74 20 4e 55 4c 4c 20 76 61 6c 75 65   that NULL value
1c570 73 0a 2a 2a 20 61 72 65 20 73 74 6f 72 65 64 20  s.** are stored 
1c580 69 6e 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79  in the temporary
1c590 20 74 61 62 6c 65 20 66 6f 72 20 61 6c 6c 20 63   table for all c
1c5a0 6f 6c 75 6d 6e 73 20 66 6f 72 20 77 68 69 63 68  olumns for which
1c5b0 20 74 68 65 20 0a 2a 2a 20 63 6f 72 72 65 73 70   the .** corresp
1c5c0 6f 6e 64 69 6e 67 20 62 69 74 20 69 6e 20 61 72  onding bit in ar
1c5d0 67 75 6d 65 6e 74 20 6d 61 73 6b 20 69 73 20 6e  gument mask is n
1c5e0 6f 74 20 73 65 74 2e 20 49 66 20 6d 61 73 6b 20  ot set. If mask 
1c5f0 74 61 6b 65 73 20 74 68 65 0a 2a 2a 20 73 70 65  takes the.** spe
1c600 63 69 61 6c 20 76 61 6c 75 65 20 30 78 66 66 66  cial value 0xfff
1c610 66 66 66 66 66 2c 20 74 68 65 6e 20 61 6c 6c 20  fffff, then all 
1c620 63 6f 6c 75 6d 6e 73 20 61 72 65 20 70 6f 70 75  columns are popu
1c630 6c 61 74 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73  lated..*/.void s
1c640 71 6c 69 74 65 33 53 65 6c 65 63 74 4d 61 73 6b  qlite3SelectMask
1c650 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
1c660 53 65 6c 65 63 74 20 2a 70 2c 20 75 33 32 20 6d  Select *p, u32 m
1c670 61 73 6b 29 7b 0a 20 20 69 66 28 20 70 20 26 26  ask){.  if( p &&
1c680 20 21 70 2d 3e 70 50 72 69 6f 72 20 26 26 20 21   !p->pPrior && !
1c690 70 2d 3e 69 73 44 69 73 74 69 6e 63 74 20 26 26  p->isDistinct &&
1c6a0 20 6d 61 73 6b 21 3d 30 78 66 66 66 66 66 66 66   mask!=0xfffffff
1c6b0 66 20 29 7b 0a 20 20 20 20 45 78 70 72 4c 69 73  f ){.    ExprLis
1c6c0 74 20 2a 70 45 4c 69 73 74 3b 0a 20 20 20 20 69  t *pEList;.    i
1c6d0 6e 74 20 69 3b 0a 20 20 20 20 73 71 6c 69 74 65  nt i;.    sqlite
1c6e0 33 53 65 6c 65 63 74 52 65 73 6f 6c 76 65 28 70  3SelectResolve(p
1c6f0 50 61 72 73 65 2c 20 70 2c 20 30 29 3b 0a 20 20  Parse, p, 0);.  
1c700 20 20 70 45 4c 69 73 74 20 3d 20 70 2d 3e 70 45    pEList = p->pE
1c710 4c 69 73 74 3b 0a 20 20 20 20 66 6f 72 28 69 3d  List;.    for(i=
1c720 30 3b 20 70 45 4c 69 73 74 20 26 26 20 69 3c 70  0; pEList && i<p
1c730 45 4c 69 73 74 2d 3e 6e 45 78 70 72 20 26 26 20  EList->nExpr && 
1c740 69 3c 33 32 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  i<32; i++){.    
1c750 20 20 69 66 28 20 21 28 6d 61 73 6b 26 28 28 75    if( !(mask&((u
1c760 33 32 29 31 3c 3c 69 29 29 20 29 7b 0a 20 20 20  32)1<<i)) ){.   
1c770 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
1c780 44 65 6c 65 74 65 28 70 45 4c 69 73 74 2d 3e 61  Delete(pEList->a
1c790 5b 69 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20 20  [i].pExpr);.    
1c7a0 20 20 20 20 70 45 4c 69 73 74 2d 3e 61 5b 69 5d      pEList->a[i]
1c7b0 2e 70 45 78 70 72 20 3d 20 73 71 6c 69 74 65 33  .pExpr = sqlite3
1c7c0 45 78 70 72 28 70 50 61 72 73 65 2d 3e 64 62 2c  Expr(pParse->db,
1c7d0 20 54 4b 5f 4e 55 4c 4c 2c 20 30 2c 20 30 2c 20   TK_NULL, 0, 0, 
1c7e0 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  0);.      }.    
1c7f0 7d 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a  }.  }.}.#endif..
1c800 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63  /*.** Generate c
1c810 6f 64 65 20 66 6f 72 20 74 68 65 20 67 69 76 65  ode for the give
1c820 6e 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  n SELECT stateme
1c830 6e 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 72 65  nt..**.** The re
1c840 73 75 6c 74 73 20 61 72 65 20 64 69 73 74 72 69  sults are distri
1c850 62 75 74 65 64 20 69 6e 20 76 61 72 69 6f 75 73  buted in various
1c860 20 77 61 79 73 20 64 65 70 65 6e 64 69 6e 67 20   ways depending 
1c870 6f 6e 20 74 68 65 0a 2a 2a 20 63 6f 6e 74 65 6e  on the.** conten
1c880 74 73 20 6f 66 20 74 68 65 20 53 65 6c 65 63 74  ts of the Select
1c890 44 65 73 74 20 73 74 72 75 63 74 75 72 65 20 70  Dest structure p
1c8a0 6f 69 6e 74 65 64 20 74 6f 20 62 79 20 61 72 67  ointed to by arg
1c8b0 75 6d 65 6e 74 20 70 44 65 73 74 0a 2a 2a 20 61  ument pDest.** a
1c8c0 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a  s follows:.**.**
1c8d0 20 20 20 20 20 70 44 65 73 74 2d 3e 65 44 65 73       pDest->eDes
1c8e0 74 20 20 20 20 52 65 73 75 6c 74 0a 2a 2a 20 20  t    Result.**  
1c8f0 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 20     ------------ 
1c900 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d     -------------
1c910 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1c920 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a  --------------.*
1c930 2a 20 20 20 20 20 53 52 54 5f 43 61 6c 6c 62 61  *     SRT_Callba
1c940 63 6b 20 20 20 20 49 6e 76 6f 6b 65 20 74 68 65  ck    Invoke the
1c950 20 63 61 6c 6c 62 61 63 6b 20 66 6f 72 20 65 61   callback for ea
1c960 63 68 20 72 6f 77 20 6f 66 20 74 68 65 20 72 65  ch row of the re
1c970 73 75 6c 74 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20  sult..**.**     
1c980 53 52 54 5f 4d 65 6d 20 20 20 20 20 20 20 20 20  SRT_Mem         
1c990 53 74 6f 72 65 20 66 69 72 73 74 20 72 65 73 75  Store first resu
1c9a0 6c 74 20 69 6e 20 6d 65 6d 6f 72 79 20 63 65 6c  lt in memory cel
1c9b0 6c 20 70 44 65 73 74 2d 3e 69 50 61 72 6d 0a 2a  l pDest->iParm.*
1c9c0 2a 0a 2a 2a 20 20 20 20 20 53 52 54 5f 53 65 74  *.**     SRT_Set
1c9d0 20 20 20 20 20 20 20 20 20 53 74 6f 72 65 20 6e           Store n
1c9e0 6f 6e 2d 6e 75 6c 6c 20 72 65 73 75 6c 74 73 20  on-null results 
1c9f0 61 73 20 6b 65 79 73 20 6f 66 20 74 61 62 6c 65  as keys of table
1ca00 20 70 44 65 73 74 2d 3e 69 50 61 72 6d 2e 20 0a   pDest->iParm. .
1ca10 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
1ca20 20 20 20 20 20 20 20 41 70 70 6c 79 20 74 68 65         Apply the
1ca30 20 61 66 66 69 6e 69 74 79 20 70 44 65 73 74 2d   affinity pDest-
1ca40 3e 61 66 66 69 6e 69 74 79 20 62 65 66 6f 72 65  >affinity before
1ca50 20 73 74 6f 72 69 6e 67 20 74 68 65 6d 2e 0a 2a   storing them..*
1ca60 2a 0a 2a 2a 20 20 20 20 20 53 52 54 5f 55 6e 69  *.**     SRT_Uni
1ca70 6f 6e 20 20 20 20 20 20 20 53 74 6f 72 65 20 72  on       Store r
1ca80 65 73 75 6c 74 73 20 61 73 20 61 20 6b 65 79 20  esults as a key 
1ca90 69 6e 20 61 20 74 65 6d 70 6f 72 61 72 79 20 74  in a temporary t
1caa0 61 62 6c 65 20 70 44 65 73 74 2d 3e 69 50 61 72  able pDest->iPar
1cab0 6d 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 52 54  m..**.**     SRT
1cac0 5f 45 78 63 65 70 74 20 20 20 20 20 20 52 65 6d  _Except      Rem
1cad0 6f 76 65 20 72 65 73 75 6c 74 73 20 66 72 6f 6d  ove results from
1cae0 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79 20 74   the temporary t
1caf0 61 62 6c 65 20 70 44 65 73 74 2d 3e 69 50 61 72  able pDest->iPar
1cb00 6d 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 52 54  m..**.**     SRT
1cb10 5f 54 61 62 6c 65 20 20 20 20 20 20 20 53 74 6f  _Table       Sto
1cb20 72 65 20 72 65 73 75 6c 74 73 20 69 6e 20 74 65  re results in te
1cb30 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20 70 44  mporary table pD
1cb40 65 73 74 2d 3e 69 50 61 72 6d 0a 2a 2a 0a 2a 2a  est->iParm.**.**
1cb50 20 20 20 20 20 53 52 54 5f 45 70 68 65 6d 54 61       SRT_EphemTa
1cb60 62 20 20 20 20 43 72 65 61 74 65 20 61 6e 20 74  b    Create an t
1cb70 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20 70  emporary table p
1cb80 44 65 73 74 2d 3e 69 50 61 72 6d 20 61 6e 64 20  Dest->iParm and 
1cb90 73 74 6f 72 65 0a 2a 2a 20 20 20 20 20 20 20 20  store.**        
1cba0 20 20 20 20 20 20 20 20 20 20 20 20 20 74 68 65               the
1cbb0 20 72 65 73 75 6c 74 20 74 68 65 72 65 2e 20 54   result there. T
1cbc0 68 65 20 63 75 72 73 6f 72 20 69 73 20 6c 65 66  he cursor is lef
1cbd0 74 20 6f 70 65 6e 20 61 66 74 65 72 0a 2a 2a 20  t open after.** 
1cbe0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1cbf0 20 20 20 20 72 65 74 75 72 6e 69 6e 67 2e 0a 2a      returning..*
1cc00 2a 0a 2a 2a 20 20 20 20 20 53 52 54 5f 43 6f 72  *.**     SRT_Cor
1cc10 6f 75 74 69 6e 65 20 20 20 49 6e 76 6f 6b 65 20  outine   Invoke 
1cc20 61 20 63 6f 2d 72 6f 75 74 69 6e 65 20 74 6f 20  a co-routine to 
1cc30 63 6f 6d 70 75 74 65 20 61 20 73 69 6e 67 6c 65  compute a single
1cc40 20 72 6f 77 20 6f 66 20 0a 2a 2a 20 20 20 20 20   row of .**     
1cc50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1cc60 74 68 65 20 72 65 73 75 6c 74 0a 2a 2a 0a 2a 2a  the result.**.**
1cc70 20 20 20 20 20 53 52 54 5f 45 78 69 73 74 73 20       SRT_Exists 
1cc80 20 20 20 20 20 53 74 6f 72 65 20 61 20 31 20 69       Store a 1 i
1cc90 6e 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 20 70 44  n memory cell pD
1cca0 65 73 74 2d 3e 69 50 61 72 6d 20 69 66 20 74 68  est->iParm if th
1ccb0 65 20 72 65 73 75 6c 74 0a 2a 2a 20 20 20 20 20  e result.**     
1ccc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ccd0 73 65 74 20 69 73 20 6e 6f 74 20 65 6d 70 74 79  set is not empty
1cce0 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 52 54 5f  ..**.**     SRT_
1ccf0 44 69 73 63 61 72 64 20 20 20 20 20 54 68 72 6f  Discard     Thro
1cd00 77 20 74 68 65 20 72 65 73 75 6c 74 73 20 61 77  w the results aw
1cd10 61 79 2e 0a 2a 2a 0a 2a 2a 20 53 65 65 20 74 68  ay..**.** See th
1cd20 65 20 73 65 6c 65 63 74 49 6e 6e 65 72 4c 6f 6f  e selectInnerLoo
1cd30 70 28 29 20 66 75 6e 63 74 69 6f 6e 20 66 6f 72  p() function for
1cd40 20 61 20 63 61 6e 6f 6e 69 63 61 6c 20 6c 69 73   a canonical lis
1cd50 74 69 6e 67 20 6f 66 20 74 68 65 20 0a 2a 2a 20  ting of the .** 
1cd60 61 6c 6c 6f 77 65 64 20 76 61 6c 75 65 73 20 6f  allowed values o
1cd70 66 20 65 44 65 73 74 20 61 6e 64 20 74 68 65 69  f eDest and thei
1cd80 72 20 6d 65 61 6e 69 6e 67 73 2e 0a 2a 2a 0a 2a  r meanings..**.*
1cd90 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 72  * This routine r
1cda0 65 74 75 72 6e 73 20 74 68 65 20 6e 75 6d 62 65  eturns the numbe
1cdb0 72 20 6f 66 20 65 72 72 6f 72 73 2e 20 20 49 66  r of errors.  If
1cdc0 20 61 6e 79 20 65 72 72 6f 72 73 20 61 72 65 0a   any errors are.
1cdd0 2a 2a 20 65 6e 63 6f 75 6e 74 65 72 65 64 2c 20  ** encountered, 
1cde0 74 68 65 6e 20 61 6e 20 61 70 70 72 6f 70 72 69  then an appropri
1cdf0 61 74 65 20 65 72 72 6f 72 20 6d 65 73 73 61 67  ate error messag
1ce00 65 20 69 73 20 6c 65 66 74 20 69 6e 0a 2a 2a 20  e is left in.** 
1ce10 70 50 61 72 73 65 2d 3e 7a 45 72 72 4d 73 67 2e  pParse->zErrMsg.
1ce20 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
1ce30 69 6e 65 20 64 6f 65 73 20 4e 4f 54 20 66 72 65  ine does NOT fre
1ce40 65 20 74 68 65 20 53 65 6c 65 63 74 20 73 74 72  e the Select str
1ce50 75 63 74 75 72 65 20 70 61 73 73 65 64 20 69 6e  ucture passed in
1ce60 2e 20 20 54 68 65 0a 2a 2a 20 63 61 6c 6c 69 6e  .  The.** callin
1ce70 67 20 66 75 6e 63 74 69 6f 6e 20 6e 65 65 64 73  g function needs
1ce80 20 74 6f 20 64 6f 20 74 68 61 74 2e 0a 2a 2a 0a   to do that..**.
1ce90 2a 2a 20 54 68 65 20 70 50 61 72 65 6e 74 2c 20  ** The pParent, 
1cea0 70 61 72 65 6e 74 54 61 62 2c 20 61 6e 64 20 2a  parentTab, and *
1ceb0 70 50 61 72 65 6e 74 41 67 67 20 66 69 65 6c 64  pParentAgg field
1cec0 73 20 61 72 65 20 66 69 6c 6c 65 64 20 69 6e 20  s are filled in 
1ced0 69 66 20 74 68 69 73 0a 2a 2a 20 53 45 4c 45 43  if this.** SELEC
1cee0 54 20 69 73 20 61 20 73 75 62 71 75 65 72 79 2e  T is a subquery.
1cef0 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6d    This routine m
1cf00 61 79 20 74 72 79 20 74 6f 20 63 6f 6d 62 69 6e  ay try to combin
1cf10 65 20 74 68 69 73 20 53 45 4c 45 43 54 0a 2a 2a  e this SELECT.**
1cf20 20 77 69 74 68 20 69 74 73 20 70 61 72 65 6e 74   with its parent
1cf30 20 74 6f 20 66 6f 72 6d 20 61 20 73 69 6e 67 6c   to form a singl
1cf40 65 20 66 6c 61 74 20 71 75 65 72 79 2e 20 20 49  e flat query.  I
1cf50 6e 20 73 6f 20 64 6f 69 6e 67 2c 20 69 74 20 6d  n so doing, it m
1cf60 69 67 68 74 0a 2a 2a 20 63 68 61 6e 67 65 20 74  ight.** change t
1cf70 68 65 20 70 61 72 65 6e 74 20 71 75 65 72 79 20  he parent query 
1cf80 66 72 6f 6d 20 61 20 6e 6f 6e 2d 61 67 67 72 65  from a non-aggre
1cf90 67 61 74 65 20 74 6f 20 61 6e 20 61 67 67 72 65  gate to an aggre
1cfa0 67 61 74 65 20 71 75 65 72 79 2e 0a 2a 2a 20 46  gate query..** F
1cfb0 6f 72 20 74 68 61 74 20 72 65 61 73 6f 6e 2c 20  or that reason, 
1cfc0 74 68 65 20 70 50 61 72 65 6e 74 41 67 67 20 66  the pParentAgg f
1cfd0 6c 61 67 20 69 73 20 70 61 73 73 65 64 20 61 73  lag is passed as
1cfe0 20 61 20 70 6f 69 6e 74 65 72 2c 20 73 6f 20 69   a pointer, so i
1cff0 74 0a 2a 2a 20 63 61 6e 20 62 65 20 63 68 61 6e  t.** can be chan
1d000 67 65 64 2e 0a 2a 2a 0a 2a 2a 20 45 78 61 6d 70  ged..**.** Examp
1d010 6c 65 20 31 3a 20 20 20 54 68 65 20 6d 65 61 6e  le 1:   The mean
1d020 69 6e 67 20 6f 66 20 74 68 65 20 70 50 61 72 65  ing of the pPare
1d030 6e 74 20 70 61 72 61 6d 65 74 65 72 2e 0a 2a 2a  nt parameter..**
1d040 0a 2a 2a 20 20 20 20 53 45 4c 45 43 54 20 2a 20  .**    SELECT * 
1d050 46 52 4f 4d 20 74 31 20 4a 4f 49 4e 20 28 53 45  FROM t1 JOIN (SE
1d060 4c 45 43 54 20 78 2c 20 63 6f 75 6e 74 28 2a 29  LECT x, count(*)
1d070 20 46 52 4f 4d 20 74 32 29 20 4a 4f 49 4e 20 74   FROM t2) JOIN t
1d080 33 3b 0a 2a 2a 20 20 20 20 5c 20 20 20 20 20 20  3;.**    \      
1d090 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d0a0 5c 5f 5f 5f 5f 5f 5f 5f 20 73 75 62 71 75 65 72  \_______ subquer
1d0b0 79 20 5f 5f 5f 5f 5f 5f 5f 2f 20 20 20 20 20 20  y _______/      
1d0c0 20 20 2f 0a 2a 2a 20 20 20 20 20 5c 20 20 20 20    /.**     \    
1d0d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d0e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d0f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d100 20 20 2f 0a 2a 2a 20 20 20 20 20 20 5c 5f 5f 5f    /.**      \___
1d110 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f  ________________
1d120 5f 20 6f 75 74 65 72 20 71 75 65 72 79 20 5f 5f  _ outer query __
1d130 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f  ________________
1d140 5f 2f 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  _/.**.** This ro
1d150 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20  utine is called 
1d160 66 6f 72 20 74 68 65 20 6f 75 74 65 72 20 71 75  for the outer qu
1d170 65 72 79 20 66 69 72 73 74 2e 20 20 20 46 6f 72  ery first.   For
1d180 20 74 68 61 74 20 63 61 6c 6c 2c 0a 2a 2a 20 70   that call,.** p
1d190 50 61 72 65 6e 74 20 77 69 6c 6c 20 62 65 20 4e  Parent will be N
1d1a0 55 4c 4c 2e 20 20 44 75 72 69 6e 67 20 74 68 65  ULL.  During the
1d1b0 20 70 72 6f 63 65 73 73 69 6e 67 20 6f 66 20 74   processing of t
1d1c0 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 2c 20  he outer query, 
1d1d0 74 68 69 73 20 0a 2a 2a 20 72 6f 75 74 69 6e 65  this .** routine
1d1e0 20 69 73 20 63 61 6c 6c 65 64 20 72 65 63 75 72   is called recur
1d1f0 73 69 76 65 6c 79 20 74 6f 20 68 61 6e 64 6c 65  sively to handle
1d200 20 74 68 65 20 73 75 62 71 75 65 72 79 2e 20 20   the subquery.  
1d210 46 6f 72 20 74 68 65 20 72 65 63 75 72 73 69 76  For the recursiv
1d220 65 0a 2a 2a 20 63 61 6c 6c 2c 20 70 50 61 72 65  e.** call, pPare
1d230 6e 74 20 77 69 6c 6c 20 70 6f 69 6e 74 20 74 6f  nt will point to
1d240 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79   the outer query
1d250 2e 20 20 42 65 63 61 75 73 65 20 74 68 65 20 73  .  Because the s
1d260 75 62 71 75 65 72 79 20 69 73 0a 2a 2a 20 74 68  ubquery is.** th
1d270 65 20 73 65 63 6f 6e 64 20 65 6c 65 6d 65 6e 74  e second element
1d280 20 69 6e 20 61 20 74 68 72 65 65 2d 77 61 79 20   in a three-way 
1d290 6a 6f 69 6e 2c 20 74 68 65 20 70 61 72 65 6e 74  join, the parent
1d2a0 54 61 62 20 70 61 72 61 6d 65 74 65 72 20 77 69  Tab parameter wi
1d2b0 6c 6c 0a 2a 2a 20 62 65 20 31 20 28 74 68 65 20  ll.** be 1 (the 
1d2c0 32 6e 64 20 76 61 6c 75 65 20 6f 66 20 61 20 30  2nd value of a 0
1d2d0 2d 69 6e 64 65 78 65 64 20 61 72 72 61 79 2e 29  -indexed array.)
1d2e0 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 53  .*/.int sqlite3S
1d2f0 65 6c 65 63 74 28 0a 20 20 50 61 72 73 65 20 2a  elect(.  Parse *
1d300 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 20  pParse,         
1d310 2f 2a 20 54 68 65 20 70 61 72 73 65 72 20 63 6f  /* The parser co
1d320 6e 74 65 78 74 20 2a 2f 0a 20 20 53 65 6c 65 63  ntext */.  Selec
1d330 74 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20  t *p,           
1d340 20 20 2f 2a 20 54 68 65 20 53 45 4c 45 43 54 20    /* The SELECT 
1d350 73 74 61 74 65 6d 65 6e 74 20 62 65 69 6e 67 20  statement being 
1d360 63 6f 64 65 64 2e 20 2a 2f 0a 20 20 53 65 6c 65  coded. */.  Sele
1d370 63 74 44 65 73 74 20 2a 70 44 65 73 74 2c 20 20  ctDest *pDest,  
1d380 20 20 20 2f 2a 20 57 68 61 74 20 74 6f 20 64 6f     /* What to do
1d390 20 77 69 74 68 20 74 68 65 20 71 75 65 72 79 20   with the query 
1d3a0 72 65 73 75 6c 74 73 20 2a 2f 0a 20 20 53 65 6c  results */.  Sel
1d3b0 65 63 74 20 2a 70 50 61 72 65 6e 74 2c 20 20 20  ect *pParent,   
1d3c0 20 20 20 20 2f 2a 20 41 6e 6f 74 68 65 72 20 53      /* Another S
1d3d0 45 4c 45 43 54 20 66 6f 72 20 77 68 69 63 68 20  ELECT for which 
1d3e0 74 68 69 73 20 69 73 20 61 20 73 75 62 2d 71 75  this is a sub-qu
1d3f0 65 72 79 20 2a 2f 0a 20 20 69 6e 74 20 70 61 72  ery */.  int par
1d400 65 6e 74 54 61 62 2c 20 20 20 20 20 20 20 20 20  entTab,         
1d410 2f 2a 20 49 6e 64 65 78 20 69 6e 20 70 50 61 72  /* Index in pPar
1d420 65 6e 74 2d 3e 70 53 72 63 20 6f 66 20 74 68 69  ent->pSrc of thi
1d430 73 20 71 75 65 72 79 20 2a 2f 0a 20 20 69 6e 74  s query */.  int
1d440 20 2a 70 50 61 72 65 6e 74 41 67 67 2c 20 20 20   *pParentAgg,   
1d450 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 70      /* True if p
1d460 50 61 72 65 6e 74 20 75 73 65 73 20 61 67 67 72  Parent uses aggr
1d470 65 67 61 74 65 20 66 75 6e 63 74 69 6f 6e 73 20  egate functions 
1d480 2a 2f 0a 20 20 63 68 61 72 20 2a 61 66 66 20 20  */.  char *aff  
1d490 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
1d4a0 66 20 65 44 65 73 74 20 69 73 20 53 52 54 5f 55  f eDest is SRT_U
1d4b0 6e 69 6f 6e 2c 20 74 68 65 20 61 66 66 69 6e 69  nion, the affini
1d4c0 74 79 20 73 74 72 69 6e 67 20 2a 2f 0a 29 7b 0a  ty string */.){.
1d4d0 20 20 69 6e 74 20 69 2c 20 6a 3b 20 20 20 20 20    int i, j;     
1d4e0 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70           /* Loop
1d4f0 20 63 6f 75 6e 74 65 72 73 20 2a 2f 0a 20 20 57   counters */.  W
1d500 68 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f  hereInfo *pWInfo
1d510 3b 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20  ;     /* Return 
1d520 66 72 6f 6d 20 73 71 6c 69 74 65 33 57 68 65 72  from sqlite3Wher
1d530 65 42 65 67 69 6e 28 29 20 2a 2f 0a 20 20 56 64  eBegin() */.  Vd
1d540 62 65 20 2a 76 3b 20 20 20 20 20 20 20 20 20 20  be *v;          
1d550 20 20 20 20 20 2f 2a 20 54 68 65 20 76 69 72 74       /* The virt
1d560 75 61 6c 20 6d 61 63 68 69 6e 65 20 75 6e 64 65  ual machine unde
1d570 72 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 20 2a  r construction *
1d580 2f 0a 20 20 69 6e 74 20 69 73 41 67 67 3b 20 20  /.  int isAgg;  
1d590 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72             /* Tr
1d5a0 75 65 20 66 6f 72 20 73 65 6c 65 63 74 20 6c 69  ue for select li
1d5b0 73 74 73 20 6c 69 6b 65 20 22 63 6f 75 6e 74 28  sts like "count(
1d5c0 2a 29 22 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73  *)" */.  ExprLis
1d5d0 74 20 2a 70 45 4c 69 73 74 3b 20 20 20 20 20 20  t *pEList;      
1d5e0 2f 2a 20 4c 69 73 74 20 6f 66 20 63 6f 6c 75 6d  /* List of colum
1d5f0 6e 73 20 74 6f 20 65 78 74 72 61 63 74 2e 20 2a  ns to extract. *
1d600 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 54 61  /.  SrcList *pTa
1d610 62 4c 69 73 74 3b 20 20 20 20 20 2f 2a 20 4c 69  bList;     /* Li
1d620 73 74 20 6f 66 20 74 61 62 6c 65 73 20 74 6f 20  st of tables to 
1d630 73 65 6c 65 63 74 20 66 72 6f 6d 20 2a 2f 0a 20  select from */. 
1d640 20 45 78 70 72 20 2a 70 57 68 65 72 65 3b 20 20   Expr *pWhere;  
1d650 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 57          /* The W
1d660 48 45 52 45 20 63 6c 61 75 73 65 2e 20 20 4d 61  HERE clause.  Ma
1d670 79 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20 45  y be NULL */.  E
1d680 78 70 72 4c 69 73 74 20 2a 70 4f 72 64 65 72 42  xprList *pOrderB
1d690 79 3b 20 20 20 20 2f 2a 20 54 68 65 20 4f 52 44  y;    /* The ORD
1d6a0 45 52 20 42 59 20 63 6c 61 75 73 65 2e 20 20 4d  ER BY clause.  M
1d6b0 61 79 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20  ay be NULL */.  
1d6c0 45 78 70 72 4c 69 73 74 20 2a 70 47 72 6f 75 70  ExprList *pGroup
1d6d0 42 79 3b 20 20 20 20 2f 2a 20 54 68 65 20 47 52  By;    /* The GR
1d6e0 4f 55 50 20 42 59 20 63 6c 61 75 73 65 2e 20 20  OUP BY clause.  
1d6f0 4d 61 79 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20  May be NULL */. 
1d700 20 45 78 70 72 20 2a 70 48 61 76 69 6e 67 3b 20   Expr *pHaving; 
1d710 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 48          /* The H
1d720 41 56 49 4e 47 20 63 6c 61 75 73 65 2e 20 20 4d  AVING clause.  M
1d730 61 79 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20  ay be NULL */.  
1d740 69 6e 74 20 69 73 44 69 73 74 69 6e 63 74 3b 20  int isDistinct; 
1d750 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69         /* True i
1d760 66 20 74 68 65 20 44 49 53 54 49 4e 43 54 20 6b  f the DISTINCT k
1d770 65 79 77 6f 72 64 20 69 73 20 70 72 65 73 65 6e  eyword is presen
1d780 74 20 2a 2f 0a 20 20 69 6e 74 20 64 69 73 74 69  t */.  int disti
1d790 6e 63 74 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  nct;          /*
1d7a0 20 54 61 62 6c 65 20 74 6f 20 75 73 65 20 66 6f   Table to use fo
1d7b0 72 20 74 68 65 20 64 69 73 74 69 6e 63 74 20 73  r the distinct s
1d7c0 65 74 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d  et */.  int rc =
1d7d0 20 31 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f   1;            /
1d7e0 2a 20 56 61 6c 75 65 20 74 6f 20 72 65 74 75 72  * Value to retur
1d7f0 6e 20 66 72 6f 6d 20 74 68 69 73 20 66 75 6e 63  n from this func
1d800 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 61 64  tion */.  int ad
1d810 64 72 53 6f 72 74 49 6e 64 65 78 3b 20 20 20 20  drSortIndex;    
1d820 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20 61   /* Address of a
1d830 6e 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72  n OP_OpenEphemer
1d840 61 6c 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 2a  al instruction *
1d850 2f 0a 20 20 41 67 67 49 6e 66 6f 20 73 41 67 67  /.  AggInfo sAgg
1d860 49 6e 66 6f 3b 20 20 20 20 20 20 2f 2a 20 49 6e  Info;      /* In
1d870 66 6f 72 6d 61 74 69 6f 6e 20 75 73 65 64 20 62  formation used b
1d880 79 20 61 67 67 72 65 67 61 74 65 20 71 75 65 72  y aggregate quer
1d890 69 65 73 20 2a 2f 0a 20 20 69 6e 74 20 69 45 6e  ies */.  int iEn
1d8a0 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  d;              
1d8b0 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20 74 68  /* Address of th
1d8c0 65 20 65 6e 64 20 6f 66 20 74 68 65 20 71 75 65  e end of the que
1d8d0 72 79 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20  ry */.  sqlite3 
1d8e0 2a 64 62 3b 20 20 20 20 20 20 20 20 20 20 20 2f  *db;           /
1d8f0 2a 20 54 68 65 20 64 61 74 61 62 61 73 65 20 63  * The database c
1d900 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 0a 20 20  onnection */..  
1d910 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b  db = pParse->db;
1d920 0a 20 20 69 66 28 20 70 3d 3d 30 20 7c 7c 20 64  .  if( p==0 || d
1d930 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
1d940 7c 7c 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 20  || pParse->nErr 
1d950 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 31 3b  ){.    return 1;
1d960 0a 20 20 7d 0a 20 20 69 66 28 20 73 71 6c 69 74  .  }.  if( sqlit
1d970 65 33 41 75 74 68 43 68 65 63 6b 28 70 50 61 72  e3AuthCheck(pPar
1d980 73 65 2c 20 53 51 4c 49 54 45 5f 53 45 4c 45 43  se, SQLITE_SELEC
1d990 54 2c 20 30 2c 20 30 2c 20 30 29 20 29 20 72 65  T, 0, 0, 0) ) re
1d9a0 74 75 72 6e 20 31 3b 0a 20 20 6d 65 6d 73 65 74  turn 1;.  memset
1d9b0 28 26 73 41 67 67 49 6e 66 6f 2c 20 30 2c 20 73  (&sAggInfo, 0, s
1d9c0 69 7a 65 6f 66 28 73 41 67 67 49 6e 66 6f 29 29  izeof(sAggInfo))
1d9d0 3b 0a 0a 20 20 70 4f 72 64 65 72 42 79 20 3d 20  ;..  pOrderBy = 
1d9e0 70 2d 3e 70 4f 72 64 65 72 42 79 3b 0a 20 20 69  p->pOrderBy;.  i
1d9f0 66 28 20 49 67 6e 6f 72 61 62 6c 65 4f 72 64 65  f( IgnorableOrde
1da00 72 62 79 28 70 44 65 73 74 29 20 29 7b 0a 20 20  rby(pDest) ){.  
1da10 20 20 70 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20    p->pOrderBy = 
1da20 30 3b 0a 0a 20 20 20 20 2f 2a 20 49 6e 20 74 68  0;..    /* In th
1da30 65 73 65 20 63 61 73 65 73 20 74 68 65 20 44 49  ese cases the DI
1da40 53 54 49 4e 43 54 20 6f 70 65 72 61 74 6f 72 20  STINCT operator 
1da50 6d 61 6b 65 73 20 6e 6f 20 64 69 66 66 65 72 65  makes no differe
1da60 6e 63 65 20 74 6f 20 74 68 65 0a 20 20 20 20 2a  nce to the.    *
1da70 2a 20 72 65 73 75 6c 74 73 2c 20 73 6f 20 72 65  * results, so re
1da80 6d 6f 76 65 20 69 74 20 69 66 20 69 74 20 77 65  move it if it we
1da90 72 65 20 73 70 65 63 69 66 69 65 64 2e 0a 20 20  re specified..  
1daa0 20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28    */.    assert(
1dab0 70 44 65 73 74 2d 3e 65 44 65 73 74 3d 3d 53 52  pDest->eDest==SR
1dac0 54 5f 45 78 69 73 74 73 20 7c 7c 20 70 44 65 73  T_Exists || pDes
1dad0 74 2d 3e 65 44 65 73 74 3d 3d 53 52 54 5f 55 6e  t->eDest==SRT_Un
1dae0 69 6f 6e 20 7c 7c 20 0a 20 20 20 20 20 20 20 20  ion || .        
1daf0 20 20 20 70 44 65 73 74 2d 3e 65 44 65 73 74 3d     pDest->eDest=
1db00 3d 53 52 54 5f 45 78 63 65 70 74 20 7c 7c 20 70  =SRT_Except || p
1db10 44 65 73 74 2d 3e 65 44 65 73 74 3d 3d 53 52 54  Dest->eDest==SRT
1db20 5f 44 69 73 63 61 72 64 29 3b 0a 20 20 20 20 70  _Discard);.    p
1db30 2d 3e 69 73 44 69 73 74 69 6e 63 74 20 3d 20 30  ->isDistinct = 0
1db40 3b 0a 20 20 7d 0a 20 20 69 66 28 20 73 71 6c 69  ;.  }.  if( sqli
1db50 74 65 33 53 65 6c 65 63 74 52 65 73 6f 6c 76 65  te3SelectResolve
1db60 28 70 50 61 72 73 65 2c 20 70 2c 20 30 29 20 29  (pParse, p, 0) )
1db70 7b 0a 20 20 20 20 67 6f 74 6f 20 73 65 6c 65 63  {.    goto selec
1db80 74 5f 65 6e 64 3b 0a 20 20 7d 0a 20 20 70 2d 3e  t_end;.  }.  p->
1db90 70 4f 72 64 65 72 42 79 20 3d 20 70 4f 72 64 65  pOrderBy = pOrde
1dba0 72 42 79 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51  rBy;..#ifndef SQ
1dbb0 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f 4d 50 4f 55  LITE_OMIT_COMPOU
1dbc0 4e 44 5f 53 45 4c 45 43 54 0a 20 20 2f 2a 20 49  ND_SELECT.  /* I
1dbd0 66 20 74 68 65 72 65 20 69 73 20 61 72 65 20 61  f there is are a
1dbe0 20 73 65 71 75 65 6e 63 65 20 6f 66 20 71 75 65   sequence of que
1dbf0 72 69 65 73 2c 20 64 6f 20 74 68 65 20 65 61 72  ries, do the ear
1dc00 6c 69 65 72 20 6f 6e 65 73 20 66 69 72 73 74 2e  lier ones first.
1dc10 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 70  .  */.  if( p->p
1dc20 50 72 69 6f 72 20 29 7b 0a 20 20 20 20 69 66 28  Prior ){.    if(
1dc30 20 70 2d 3e 70 52 69 67 68 74 6d 6f 73 74 3d 3d   p->pRightmost==
1dc40 30 20 29 7b 0a 20 20 20 20 20 20 53 65 6c 65 63  0 ){.      Selec
1dc50 74 20 2a 70 4c 6f 6f 70 2c 20 2a 70 52 69 67 68  t *pLoop, *pRigh
1dc60 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 69 6e 74  t = 0;.      int
1dc70 20 63 6e 74 20 3d 20 30 3b 0a 20 20 20 20 20 20   cnt = 0;.      
1dc80 69 6e 74 20 6d 78 53 65 6c 65 63 74 3b 0a 20 20  int mxSelect;.  
1dc90 20 20 20 20 66 6f 72 28 70 4c 6f 6f 70 3d 70 3b      for(pLoop=p;
1dca0 20 70 4c 6f 6f 70 3b 20 70 4c 6f 6f 70 3d 70 4c   pLoop; pLoop=pL
1dcb0 6f 6f 70 2d 3e 70 50 72 69 6f 72 2c 20 63 6e 74  oop->pPrior, cnt
1dcc0 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 70 4c 6f  ++){.        pLo
1dcd0 6f 70 2d 3e 70 52 69 67 68 74 6d 6f 73 74 20 3d  op->pRightmost =
1dce0 20 70 3b 0a 20 20 20 20 20 20 20 20 70 4c 6f 6f   p;.        pLoo
1dcf0 70 2d 3e 70 4e 65 78 74 20 3d 20 70 52 69 67 68  p->pNext = pRigh
1dd00 74 3b 0a 20 20 20 20 20 20 20 20 70 52 69 67 68  t;.        pRigh
1dd10 74 20 3d 20 70 4c 6f 6f 70 3b 0a 20 20 20 20 20  t = pLoop;.     
1dd20 20 7d 0a 20 20 20 20 20 20 6d 78 53 65 6c 65 63   }.      mxSelec
1dd30 74 20 3d 20 64 62 2d 3e 61 4c 69 6d 69 74 5b 53  t = db->aLimit[S
1dd40 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 43 4f 4d 50  QLITE_LIMIT_COMP
1dd50 4f 55 4e 44 5f 53 45 4c 45 43 54 5d 3b 0a 20 20  OUND_SELECT];.  
1dd60 20 20 20 20 69 66 28 20 6d 78 53 65 6c 65 63 74      if( mxSelect
1dd70 20 26 26 20 63 6e 74 3e 6d 78 53 65 6c 65 63 74   && cnt>mxSelect
1dd80 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
1dd90 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
1dda0 73 65 2c 20 22 74 6f 6f 20 6d 61 6e 79 20 74 65  se, "too many te
1ddb0 72 6d 73 20 69 6e 20 63 6f 6d 70 6f 75 6e 64 20  rms in compound 
1ddc0 53 45 4c 45 43 54 22 29 3b 0a 20 20 20 20 20 20  SELECT");.      
1ddd0 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20    return 1;.    
1dde0 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 72 65    }.    }.    re
1ddf0 74 75 72 6e 20 6d 75 6c 74 69 53 65 6c 65 63 74  turn multiSelect
1de00 28 70 50 61 72 73 65 2c 20 70 2c 20 70 44 65 73  (pParse, p, pDes
1de10 74 2c 20 61 66 66 29 3b 0a 20 20 7d 0a 23 65 6e  t, aff);.  }.#en
1de20 64 69 66 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 6c  dif..  /* Make l
1de30 6f 63 61 6c 20 63 6f 70 69 65 73 20 6f 66 20 74  ocal copies of t
1de40 68 65 20 70 61 72 61 6d 65 74 65 72 73 20 66 6f  he parameters fo
1de50 72 20 74 68 69 73 20 71 75 65 72 79 2e 0a 20 20  r this query..  
1de60 2a 2f 0a 20 20 70 54 61 62 4c 69 73 74 20 3d 20  */.  pTabList = 
1de70 70 2d 3e 70 53 72 63 3b 0a 20 20 70 57 68 65 72  p->pSrc;.  pWher
1de80 65 20 3d 20 70 2d 3e 70 57 68 65 72 65 3b 0a 20  e = p->pWhere;. 
1de90 20 70 47 72 6f 75 70 42 79 20 3d 20 70 2d 3e 70   pGroupBy = p->p
1dea0 47 72 6f 75 70 42 79 3b 0a 20 20 70 48 61 76 69  GroupBy;.  pHavi
1deb0 6e 67 20 3d 20 70 2d 3e 70 48 61 76 69 6e 67 3b  ng = p->pHaving;
1dec0 0a 20 20 69 73 41 67 67 20 3d 20 70 2d 3e 69 73  .  isAgg = p->is
1ded0 41 67 67 3b 0a 20 20 69 73 44 69 73 74 69 6e 63  Agg;.  isDistinc
1dee0 74 20 3d 20 70 2d 3e 69 73 44 69 73 74 69 6e 63  t = p->isDistinc
1def0 74 3b 0a 20 20 70 45 4c 69 73 74 20 3d 20 70 2d  t;.  pEList = p-
1df00 3e 70 45 4c 69 73 74 3b 0a 20 20 69 66 28 20 70  >pEList;.  if( p
1df10 45 4c 69 73 74 3d 3d 30 20 29 20 67 6f 74 6f 20  EList==0 ) goto 
1df20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 0a 20 20 2f  select_end;..  /
1df30 2a 20 0a 20 20 2a 2a 20 44 6f 20 6e 6f 74 20 65  * .  ** Do not e
1df40 76 65 6e 20 61 74 74 65 6d 70 74 20 74 6f 20 67  ven attempt to g
1df50 65 6e 65 72 61 74 65 20 61 6e 79 20 63 6f 64 65  enerate any code
1df60 20 69 66 20 77 65 20 68 61 76 65 20 61 6c 72 65   if we have alre
1df70 61 64 79 20 73 65 65 6e 0a 20 20 2a 2a 20 65 72  ady seen.  ** er
1df80 72 6f 72 73 20 62 65 66 6f 72 65 20 74 68 69 73  rors before this
1df90 20 72 6f 75 74 69 6e 65 20 73 74 61 72 74 73 2e   routine starts.
1dfa0 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 50 61 72  .  */.  if( pPar
1dfb0 73 65 2d 3e 6e 45 72 72 3e 30 20 29 20 67 6f 74  se->nErr>0 ) got
1dfc0 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 0a 20  o select_end;.. 
1dfd0 20 2f 2a 20 49 66 20 77 72 69 74 69 6e 67 20 74   /* If writing t
1dfe0 6f 20 6d 65 6d 6f 72 79 20 6f 72 20 67 65 6e 65  o memory or gene
1dff0 72 61 74 69 6e 67 20 61 20 73 65 74 0a 20 20 2a  rating a set.  *
1e000 2a 20 6f 6e 6c 79 20 61 20 73 69 6e 67 6c 65 20  * only a single 
1e010 63 6f 6c 75 6d 6e 20 6d 61 79 20 62 65 20 6f 75  column may be ou
1e020 74 70 75 74 2e 0a 20 20 2a 2f 0a 23 69 66 6e 64  tput..  */.#ifnd
1e030 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53  ef SQLITE_OMIT_S
1e040 55 42 51 55 45 52 59 0a 20 20 69 66 28 20 63 68  UBQUERY.  if( ch
1e050 65 63 6b 46 6f 72 4d 75 6c 74 69 43 6f 6c 75 6d  eckForMultiColum
1e060 6e 53 65 6c 65 63 74 45 72 72 6f 72 28 70 50 61  nSelectError(pPa
1e070 72 73 65 2c 20 70 44 65 73 74 2c 20 70 45 4c 69  rse, pDest, pELi
1e080 73 74 2d 3e 6e 45 78 70 72 29 20 29 7b 0a 20 20  st->nExpr) ){.  
1e090 20 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e    goto select_en
1e0a0 64 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20  d;.  }.#endif.. 
1e0b0 20 2f 2a 20 4f 52 44 45 52 20 42 59 20 69 73 20   /* ORDER BY is 
1e0c0 69 67 6e 6f 72 65 64 20 66 6f 72 20 73 6f 6d 65  ignored for some
1e0d0 20 64 65 73 74 69 6e 61 74 69 6f 6e 73 2e 0a 20   destinations.. 
1e0e0 20 2a 2f 0a 20 20 69 66 28 20 49 67 6e 6f 72 61   */.  if( Ignora
1e0f0 62 6c 65 4f 72 64 65 72 62 79 28 70 44 65 73 74  bleOrderby(pDest
1e100 29 20 29 7b 0a 20 20 20 20 70 4f 72 64 65 72 42  ) ){.    pOrderB
1e110 79 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  y = 0;.  }..  /*
1e120 20 42 65 67 69 6e 20 67 65 6e 65 72 61 74 69 6e   Begin generatin
1e130 67 20 63 6f 64 65 2e 0a 20 20 2a 2f 0a 20 20 76  g code..  */.  v
1e140 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64 62   = sqlite3GetVdb
1e150 65 28 70 50 61 72 73 65 29 3b 0a 20 20 69 66 28  e(pParse);.  if(
1e160 20 76 3d 3d 30 20 29 20 67 6f 74 6f 20 73 65 6c   v==0 ) goto sel
1e170 65 63 74 5f 65 6e 64 3b 0a 0a 20 20 2f 2a 20 47  ect_end;..  /* G
1e180 65 6e 65 72 61 74 65 20 63 6f 64 65 20 66 6f 72  enerate code for
1e190 20 61 6c 6c 20 73 75 62 2d 71 75 65 72 69 65 73   all sub-queries
1e1a0 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61   in the FROM cla
1e1b0 75 73 65 0a 20 20 2a 2f 0a 23 69 66 20 21 64 65  use.  */.#if !de
1e1c0 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
1e1d0 54 5f 53 55 42 51 55 45 52 59 29 20 7c 7c 20 21  T_SUBQUERY) || !
1e1e0 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
1e1f0 4d 49 54 5f 56 49 45 57 29 0a 20 20 66 6f 72 28  MIT_VIEW).  for(
1e200 69 3d 30 3b 20 69 3c 70 54 61 62 4c 69 73 74 2d  i=0; i<pTabList-
1e210 3e 6e 53 72 63 3b 20 69 2b 2b 29 7b 0a 20 20 20  >nSrc; i++){.   
1e220 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 61   const char *zSa
1e230 76 65 64 41 75 74 68 43 6f 6e 74 65 78 74 20 3d  vedAuthContext =
1e240 20 30 3b 0a 20 20 20 20 69 6e 74 20 6e 65 65 64   0;.    int need
1e250 52 65 73 74 6f 72 65 43 6f 6e 74 65 78 74 3b 0a  RestoreContext;.
1e260 20 20 20 20 73 74 72 75 63 74 20 53 72 63 4c 69      struct SrcLi
1e270 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 20 3d  st_item *pItem =
1e280 20 26 70 54 61 62 4c 69 73 74 2d 3e 61 5b 69 5d   &pTabList->a[i]
1e290 3b 0a 20 20 20 20 53 65 6c 65 63 74 44 65 73 74  ;.    SelectDest
1e2a0 20 64 65 73 74 3b 0a 0a 20 20 20 20 69 66 28 20   dest;..    if( 
1e2b0 70 49 74 65 6d 2d 3e 70 53 65 6c 65 63 74 3d 3d  pItem->pSelect==
1e2c0 30 20 7c 7c 20 70 49 74 65 6d 2d 3e 69 73 50 6f  0 || pItem->isPo
1e2d0 70 75 6c 61 74 65 64 20 29 20 63 6f 6e 74 69 6e  pulated ) contin
1e2e0 75 65 3b 0a 20 20 20 20 69 66 28 20 70 49 74 65  ue;.    if( pIte
1e2f0 6d 2d 3e 7a 4e 61 6d 65 21 3d 30 20 29 7b 0a 20  m->zName!=0 ){. 
1e300 20 20 20 20 20 7a 53 61 76 65 64 41 75 74 68 43       zSavedAuthC
1e310 6f 6e 74 65 78 74 20 3d 20 70 50 61 72 73 65 2d  ontext = pParse-
1e320 3e 7a 41 75 74 68 43 6f 6e 74 65 78 74 3b 0a 20  >zAuthContext;. 
1e330 20 20 20 20 20 70 50 61 72 73 65 2d 3e 7a 41 75       pParse->zAu
1e340 74 68 43 6f 6e 74 65 78 74 20 3d 20 70 49 74 65  thContext = pIte
1e350 6d 2d 3e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20  m->zName;.      
1e360 6e 65 65 64 52 65 73 74 6f 72 65 43 6f 6e 74 65  needRestoreConte
1e370 78 74 20 3d 20 31 3b 0a 20 20 20 20 7d 65 6c 73  xt = 1;.    }els
1e380 65 7b 0a 20 20 20 20 20 20 6e 65 65 64 52 65 73  e{.      needRes
1e390 74 6f 72 65 43 6f 6e 74 65 78 74 20 3d 20 30 3b  toreContext = 0;
1e3a0 0a 20 20 20 20 7d 0a 20 20 20 20 2f 2a 20 49 6e  .    }.    /* In
1e3b0 63 72 65 6d 65 6e 74 20 50 61 72 73 65 2e 6e 48  crement Parse.nH
1e3c0 65 69 67 68 74 20 62 79 20 74 68 65 20 68 65 69  eight by the hei
1e3d0 67 68 74 20 6f 66 20 74 68 65 20 6c 61 72 67 65  ght of the large
1e3e0 73 74 20 65 78 70 72 65 73 73 69 6f 6e 0a 20 20  st expression.  
1e3f0 20 20 2a 2a 20 74 72 65 65 20 72 65 66 65 72 65    ** tree refere
1e400 64 20 74 6f 20 62 79 20 74 68 69 73 2c 20 74 68  d to by this, th
1e410 65 20 70 61 72 65 6e 74 20 73 65 6c 65 63 74 2e  e parent select.
1e420 20 54 68 65 20 63 68 69 6c 64 20 73 65 6c 65 63   The child selec
1e430 74 0a 20 20 20 20 2a 2a 20 6d 61 79 20 63 6f 6e  t.    ** may con
1e440 74 61 69 6e 20 65 78 70 72 65 73 73 69 6f 6e 20  tain expression 
1e450 74 72 65 65 73 20 6f 66 20 61 74 20 6d 6f 73 74  trees of at most
1e460 0a 20 20 20 20 2a 2a 20 28 53 51 4c 49 54 45 5f  .    ** (SQLITE_
1e470 4d 41 58 5f 45 58 50 52 5f 44 45 50 54 48 2d 50  MAX_EXPR_DEPTH-P
1e480 61 72 73 65 2e 6e 48 65 69 67 68 74 29 20 68 65  arse.nHeight) he
1e490 69 67 68 74 2e 20 54 68 69 73 20 69 73 20 61 20  ight. This is a 
1e4a0 62 69 74 0a 20 20 20 20 2a 2a 20 6d 6f 72 65 20  bit.    ** more 
1e4b0 63 6f 6e 73 65 72 76 61 74 69 76 65 20 74 68 61  conservative tha
1e4c0 6e 20 6e 65 63 65 73 73 61 72 79 2c 20 62 75 74  n necessary, but
1e4d0 20 6d 75 63 68 20 65 61 73 69 65 72 20 74 68 61   much easier tha
1e4e0 6e 20 65 6e 66 6f 72 63 69 6e 67 0a 20 20 20 20  n enforcing.    
1e4f0 2a 2a 20 61 6e 20 65 78 61 63 74 20 6c 69 6d 69  ** an exact limi
1e500 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70 50  t..    */.    pP
1e510 61 72 73 65 2d 3e 6e 48 65 69 67 68 74 20 2b 3d  arse->nHeight +=
1e520 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 45 78   sqlite3SelectEx
1e530 70 72 48 65 69 67 68 74 28 70 29 3b 0a 20 20 20  prHeight(p);.   
1e540 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65   sqlite3SelectDe
1e550 73 74 49 6e 69 74 28 26 64 65 73 74 2c 20 53 52  stInit(&dest, SR
1e560 54 5f 45 70 68 65 6d 54 61 62 2c 20 70 49 74 65  T_EphemTab, pIte
1e570 6d 2d 3e 69 43 75 72 73 6f 72 29 3b 0a 20 20 20  m->iCursor);.   
1e580 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28 70   sqlite3Select(p
1e590 50 61 72 73 65 2c 20 70 49 74 65 6d 2d 3e 70 53  Parse, pItem->pS
1e5a0 65 6c 65 63 74 2c 20 26 64 65 73 74 2c 20 70 2c  elect, &dest, p,
1e5b0 20 69 2c 20 26 69 73 41 67 67 2c 20 30 29 3b 0a   i, &isAgg, 0);.
1e5c0 20 20 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c      if( db->mall
1e5d0 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20  ocFailed ){.    
1e5e0 20 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e    goto select_en
1e5f0 64 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 61  d;.    }.    pPa
1e600 72 73 65 2d 3e 6e 48 65 69 67 68 74 20 2d 3d 20  rse->nHeight -= 
1e610 73 71 6c 69 74 65 33 53 65 6c 65 63 74 45 78 70  sqlite3SelectExp
1e620 72 48 65 69 67 68 74 28 70 29 3b 0a 20 20 20 20  rHeight(p);.    
1e630 69 66 28 20 6e 65 65 64 52 65 73 74 6f 72 65 43  if( needRestoreC
1e640 6f 6e 74 65 78 74 20 29 7b 0a 20 20 20 20 20 20  ontext ){.      
1e650 70 50 61 72 73 65 2d 3e 7a 41 75 74 68 43 6f 6e  pParse->zAuthCon
1e660 74 65 78 74 20 3d 20 7a 53 61 76 65 64 41 75 74  text = zSavedAut
1e670 68 43 6f 6e 74 65 78 74 3b 0a 20 20 20 20 7d 0a  hContext;.    }.
1e680 20 20 20 20 70 54 61 62 4c 69 73 74 20 3d 20 70      pTabList = p
1e690 2d 3e 70 53 72 63 3b 0a 20 20 20 20 70 57 68 65  ->pSrc;.    pWhe
1e6a0 72 65 20 3d 20 70 2d 3e 70 57 68 65 72 65 3b 0a  re = p->pWhere;.
1e6b0 20 20 20 20 69 66 28 20 21 49 67 6e 6f 72 61 62      if( !Ignorab
1e6c0 6c 65 4f 72 64 65 72 62 79 28 70 44 65 73 74 29  leOrderby(pDest)
1e6d0 20 29 7b 0a 20 20 20 20 20 20 70 4f 72 64 65 72   ){.      pOrder
1e6e0 42 79 20 3d 20 70 2d 3e 70 4f 72 64 65 72 42 79  By = p->pOrderBy
1e6f0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 47 72 6f  ;.    }.    pGro
1e700 75 70 42 79 20 3d 20 70 2d 3e 70 47 72 6f 75 70  upBy = p->pGroup
1e710 42 79 3b 0a 20 20 20 20 70 48 61 76 69 6e 67 20  By;.    pHaving 
1e720 3d 20 70 2d 3e 70 48 61 76 69 6e 67 3b 0a 20 20  = p->pHaving;.  
1e730 20 20 69 73 44 69 73 74 69 6e 63 74 20 3d 20 70    isDistinct = p
1e740 2d 3e 69 73 44 69 73 74 69 6e 63 74 3b 0a 20 20  ->isDistinct;.  
1e750 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 43  }.#endif..  /* C
1e760 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20 74  heck to see if t
1e770 68 69 73 20 69 73 20 61 20 73 75 62 71 75 65 72  his is a subquer
1e780 79 20 74 68 61 74 20 63 61 6e 20 62 65 20 22 66  y that can be "f
1e790 6c 61 74 74 65 6e 65 64 22 20 69 6e 74 6f 20 69  lattened" into i
1e7a0 74 73 20 70 61 72 65 6e 74 2e 0a 20 20 2a 2a 20  ts parent..  ** 
1e7b0 49 66 20 66 6c 61 74 74 65 6e 69 6e 67 20 69 73  If flattening is
1e7c0 20 61 20 70 6f 73 73 69 62 6c 69 74 79 2c 20 64   a possiblity, d
1e7d0 6f 20 73 6f 20 61 6e 64 20 72 65 74 75 72 6e 20  o so and return 
1e7e0 69 6d 6d 65 64 69 61 74 65 6c 79 2e 20 20 0a 20  immediately.  . 
1e7f0 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49   */.#ifndef SQLI
1e800 54 45 5f 4f 4d 49 54 5f 56 49 45 57 0a 20 20 69  TE_OMIT_VIEW.  i
1e810 66 28 20 70 50 61 72 65 6e 74 20 26 26 20 70 50  f( pParent && pP
1e820 61 72 65 6e 74 41 67 67 20 26 26 0a 20 20 20 20  arentAgg &&.    
1e830 20 20 66 6c 61 74 74 65 6e 53 75 62 71 75 65 72    flattenSubquer
1e840 79 28 64 62 2c 20 70 50 61 72 65 6e 74 2c 20 70  y(db, pParent, p
1e850 61 72 65 6e 74 54 61 62 2c 20 2a 70 50 61 72 65  arentTab, *pPare
1e860 6e 74 41 67 67 2c 20 69 73 41 67 67 29 20 29 7b  ntAgg, isAgg) ){
1e870 0a 20 20 20 20 69 66 28 20 69 73 41 67 67 20 29  .    if( isAgg )
1e880 20 2a 70 50 61 72 65 6e 74 41 67 67 20 3d 20 31   *pParentAgg = 1
1e890 3b 0a 20 20 20 20 67 6f 74 6f 20 73 65 6c 65 63  ;.    goto selec
1e8a0 74 5f 65 6e 64 3b 0a 20 20 7d 0a 23 65 6e 64 69  t_end;.  }.#endi
1e8b0 66 0a 0a 20 20 2f 2a 20 49 66 20 70 6f 73 73 69  f..  /* If possi
1e8c0 62 6c 65 2c 20 72 65 77 72 69 74 65 20 74 68 65  ble, rewrite the
1e8d0 20 71 75 65 72 79 20 74 6f 20 75 73 65 20 47 52   query to use GR
1e8e0 4f 55 50 20 42 59 20 69 6e 73 74 65 61 64 20 6f  OUP BY instead o
1e8f0 66 20 44 49 53 54 49 4e 43 54 2e 0a 20 20 2a 2a  f DISTINCT..  **
1e900 20 47 52 4f 55 50 20 42 59 20 6d 61 79 20 75 73   GROUP BY may us
1e910 65 20 61 6e 20 69 6e 64 65 78 2c 20 44 49 53 54  e an index, DIST
1e920 49 4e 43 54 20 6e 65 76 65 72 20 64 6f 65 73 2e  INCT never does.
1e930 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 69  .  */.  if( p->i
1e940 73 44 69 73 74 69 6e 63 74 20 26 26 20 21 70 2d  sDistinct && !p-
1e950 3e 69 73 41 67 67 20 26 26 20 21 70 2d 3e 70 47  >isAgg && !p->pG
1e960 72 6f 75 70 42 79 20 29 7b 0a 20 20 20 20 70 2d  roupBy ){.    p-
1e970 3e 70 47 72 6f 75 70 42 79 20 3d 20 73 71 6c 69  >pGroupBy = sqli
1e980 74 65 33 45 78 70 72 4c 69 73 74 44 75 70 28 64  te3ExprListDup(d
1e990 62 2c 20 70 2d 3e 70 45 4c 69 73 74 29 3b 0a 20  b, p->pEList);. 
1e9a0 20 20 20 70 47 72 6f 75 70 42 79 20 3d 20 70 2d     pGroupBy = p-
1e9b0 3e 70 47 72 6f 75 70 42 79 3b 0a 20 20 20 20 70  >pGroupBy;.    p
1e9c0 2d 3e 69 73 44 69 73 74 69 6e 63 74 20 3d 20 30  ->isDistinct = 0
1e9d0 3b 0a 20 20 20 20 69 73 44 69 73 74 69 6e 63 74  ;.    isDistinct
1e9e0 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20   = 0;.  }..  /* 
1e9f0 49 66 20 74 68 65 72 65 20 69 73 20 61 6e 20 4f  If there is an O
1ea00 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 2c 20  RDER BY clause, 
1ea10 74 68 65 6e 20 74 68 69 73 20 73 6f 72 74 69 6e  then this sortin
1ea20 67 0a 20 20 2a 2a 20 69 6e 64 65 78 20 6d 69 67  g.  ** index mig
1ea30 68 74 20 65 6e 64 20 75 70 20 62 65 69 6e 67 20  ht end up being 
1ea40 75 6e 75 73 65 64 20 69 66 20 74 68 65 20 64 61  unused if the da
1ea50 74 61 20 63 61 6e 20 62 65 20 0a 20 20 2a 2a 20  ta can be .  ** 
1ea60 65 78 74 72 61 63 74 65 64 20 69 6e 20 70 72 65  extracted in pre
1ea70 2d 73 6f 72 74 65 64 20 6f 72 64 65 72 2e 20 20  -sorted order.  
1ea80 49 66 20 74 68 61 74 20 69 73 20 74 68 65 20 63  If that is the c
1ea90 61 73 65 2c 20 74 68 65 6e 20 74 68 65 0a 20 20  ase, then the.  
1eaa0 2a 2a 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65  ** OP_OpenEpheme
1eab0 72 61 6c 20 69 6e 73 74 72 75 63 74 69 6f 6e 20  ral instruction 
1eac0 77 69 6c 6c 20 62 65 20 63 68 61 6e 67 65 64 20  will be changed 
1ead0 74 6f 20 61 6e 20 4f 50 5f 4e 6f 6f 70 20 6f 6e  to an OP_Noop on
1eae0 63 65 0a 20 20 2a 2a 20 77 65 20 66 69 67 75 72  ce.  ** we figur
1eaf0 65 20 6f 75 74 20 74 68 61 74 20 74 68 65 20 73  e out that the s
1eb00 6f 72 74 69 6e 67 20 69 6e 64 65 78 20 69 73 20  orting index is 
1eb10 6e 6f 74 20 6e 65 65 64 65 64 2e 20 20 54 68 65  not needed.  The
1eb20 20 61 64 64 72 53 6f 72 74 49 6e 64 65 78 0a 20   addrSortIndex. 
1eb30 20 2a 2a 20 76 61 72 69 61 62 6c 65 20 69 73 20   ** variable is 
1eb40 75 73 65 64 20 74 6f 20 66 61 63 69 6c 69 74 61  used to facilita
1eb50 74 65 20 74 68 61 74 20 63 68 61 6e 67 65 2e 0a  te that change..
1eb60 20 20 2a 2f 0a 20 20 69 66 28 20 70 4f 72 64 65    */.  if( pOrde
1eb70 72 42 79 20 29 7b 0a 20 20 20 20 4b 65 79 49 6e  rBy ){.    KeyIn
1eb80 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 3b 0a 20 20  fo *pKeyInfo;.  
1eb90 20 20 70 4b 65 79 49 6e 66 6f 20 3d 20 6b 65 79    pKeyInfo = key
1eba0 49 6e 66 6f 46 72 6f 6d 45 78 70 72 4c 69 73 74  InfoFromExprList
1ebb0 28 70 50 61 72 73 65 2c 20 70 4f 72 64 65 72 42  (pParse, pOrderB
1ebc0 79 29 3b 0a 20 20 20 20 70 4f 72 64 65 72 42 79  y);.    pOrderBy
1ebd0 2d 3e 69 45 43 75 72 73 6f 72 20 3d 20 70 50 61  ->iECursor = pPa
1ebe0 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20  rse->nTab++;.   
1ebf0 20 70 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d   p->addrOpenEphm
1ec00 5b 32 5d 20 3d 20 61 64 64 72 53 6f 72 74 49 6e  [2] = addrSortIn
1ec10 64 65 78 20 3d 0a 20 20 20 20 20 20 73 71 6c 69  dex =.      sqli
1ec20 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c  te3VdbeAddOp4(v,
1ec30 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61   OP_OpenEphemera
1ec40 6c 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  l,.             
1ec50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 4f                pO
1ec60 72 64 65 72 42 79 2d 3e 69 45 43 75 72 73 6f 72  rderBy->iECursor
1ec70 2c 20 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70  , pOrderBy->nExp
1ec80 72 2b 32 2c 20 30 2c 0a 20 20 20 20 20 20 20 20  r+2, 0,.        
1ec90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1eca0 20 20 20 28 63 68 61 72 2a 29 70 4b 65 79 49 6e     (char*)pKeyIn
1ecb0 66 6f 2c 20 50 34 5f 4b 45 59 49 4e 46 4f 5f 48  fo, P4_KEYINFO_H
1ecc0 41 4e 44 4f 46 46 29 3b 0a 20 20 7d 65 6c 73 65  ANDOFF);.  }else
1ecd0 7b 0a 20 20 20 20 61 64 64 72 53 6f 72 74 49 6e  {.    addrSortIn
1ece0 64 65 78 20 3d 20 2d 31 3b 0a 20 20 7d 0a 0a 20  dex = -1;.  }.. 
1ecf0 20 2f 2a 20 49 66 20 74 68 65 20 6f 75 74 70 75   /* If the outpu
1ed00 74 20 69 73 20 64 65 73 74 69 6e 65 64 20 66 6f  t is destined fo
1ed10 72 20 61 20 74 65 6d 70 6f 72 61 72 79 20 74 61  r a temporary ta
1ed20 62 6c 65 2c 20 6f 70 65 6e 20 74 68 61 74 20 74  ble, open that t
1ed30 61 62 6c 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  able..  */.  if(
1ed40 20 70 44 65 73 74 2d 3e 65 44 65 73 74 3d 3d 53   pDest->eDest==S
1ed50 52 54 5f 45 70 68 65 6d 54 61 62 20 29 7b 0a 20  RT_EphemTab ){. 
1ed60 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
1ed70 64 4f 70 32 28 76 2c 20 4f 50 5f 4f 70 65 6e 45  dOp2(v, OP_OpenE
1ed80 70 68 65 6d 65 72 61 6c 2c 20 70 44 65 73 74 2d  phemeral, pDest-
1ed90 3e 69 50 61 72 6d 2c 20 70 45 4c 69 73 74 2d 3e  >iParm, pEList->
1eda0 6e 45 78 70 72 29 3b 0a 20 20 7d 0a 0a 20 20 2f  nExpr);.  }..  /
1edb0 2a 20 53 65 74 20 74 68 65 20 6c 69 6d 69 74 65  * Set the limite
1edc0 72 2e 0a 20 20 2a 2f 0a 20 20 69 45 6e 64 20 3d  r..  */.  iEnd =
1edd0 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65   sqlite3VdbeMake
1ede0 4c 61 62 65 6c 28 76 29 3b 0a 20 20 63 6f 6d 70  Label(v);.  comp
1edf0 75 74 65 4c 69 6d 69 74 52 65 67 69 73 74 65 72  uteLimitRegister
1ee00 73 28 70 50 61 72 73 65 2c 20 70 2c 20 69 45 6e  s(pParse, p, iEn
1ee10 64 29 3b 0a 0a 20 20 2f 2a 20 4f 70 65 6e 20 61  d);..  /* Open a
1ee20 20 76 69 72 74 75 61 6c 20 69 6e 64 65 78 20 74   virtual index t
1ee30 6f 20 75 73 65 20 66 6f 72 20 74 68 65 20 64 69  o use for the di
1ee40 73 74 69 6e 63 74 20 73 65 74 2e 0a 20 20 2a 2f  stinct set..  */
1ee50 0a 20 20 69 66 28 20 69 73 44 69 73 74 69 6e 63  .  if( isDistinc
1ee60 74 20 29 7b 0a 20 20 20 20 4b 65 79 49 6e 66 6f  t ){.    KeyInfo
1ee70 20 2a 70 4b 65 79 49 6e 66 6f 3b 0a 20 20 20 20   *pKeyInfo;.    
1ee80 61 73 73 65 72 74 28 20 69 73 41 67 67 20 7c 7c  assert( isAgg ||
1ee90 20 70 47 72 6f 75 70 42 79 20 29 3b 0a 20 20 20   pGroupBy );.   
1eea0 20 64 69 73 74 69 6e 63 74 20 3d 20 70 50 61 72   distinct = pPar
1eeb0 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20  se->nTab++;.    
1eec0 70 4b 65 79 49 6e 66 6f 20 3d 20 6b 65 79 49 6e  pKeyInfo = keyIn
1eed0 66 6f 46 72 6f 6d 45 78 70 72 4c 69 73 74 28 70  foFromExprList(p
1eee0 50 61 72 73 65 2c 20 70 2d 3e 70 45 4c 69 73 74  Parse, p->pEList
1eef0 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
1ef00 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 4f  beAddOp4(v, OP_O
1ef10 70 65 6e 45 70 68 65 6d 65 72 61 6c 2c 20 64 69  penEphemeral, di
1ef20 73 74 69 6e 63 74 2c 20 30 2c 20 30 2c 0a 20 20  stinct, 0, 0,.  
1ef30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ef40 20 20 20 20 20 20 28 63 68 61 72 2a 29 70 4b 65        (char*)pKe
1ef50 79 49 6e 66 6f 2c 20 50 34 5f 4b 45 59 49 4e 46  yInfo, P4_KEYINF
1ef60 4f 5f 48 41 4e 44 4f 46 46 29 3b 0a 20 20 7d 65  O_HANDOFF);.  }e
1ef70 6c 73 65 7b 0a 20 20 20 20 64 69 73 74 69 6e 63  lse{.    distinc
1ef80 74 20 3d 20 2d 31 3b 0a 20 20 7d 0a 0a 20 20 2f  t = -1;.  }..  /
1ef90 2a 20 41 67 67 72 65 67 61 74 65 20 61 6e 64 20  * Aggregate and 
1efa0 6e 6f 6e 2d 61 67 67 72 65 67 61 74 65 20 71 75  non-aggregate qu
1efb0 65 72 69 65 73 20 61 72 65 20 68 61 6e 64 6c 65  eries are handle
1efc0 64 20 64 69 66 66 65 72 65 6e 74 6c 79 20 2a 2f  d differently */
1efd0 0a 20 20 69 66 28 20 21 69 73 41 67 67 20 26 26  .  if( !isAgg &&
1efe0 20 70 47 72 6f 75 70 42 79 3d 3d 30 20 29 7b 0a   pGroupBy==0 ){.
1eff0 20 20 20 20 2f 2a 20 54 68 69 73 20 63 61 73 65      /* This case
1f000 20 69 73 20 66 6f 72 20 6e 6f 6e 2d 61 67 67 72   is for non-aggr
1f010 65 67 61 74 65 20 71 75 65 72 69 65 73 0a 20 20  egate queries.  
1f020 20 20 2a 2a 20 42 65 67 69 6e 20 74 68 65 20 64    ** Begin the d
1f030 61 74 61 62 61 73 65 20 73 63 61 6e 0a 20 20 20  atabase scan.   
1f040 20 2a 2f 0a 20 20 20 20 70 57 49 6e 66 6f 20 3d   */.    pWInfo =
1f050 20 73 71 6c 69 74 65 33 57 68 65 72 65 42 65 67   sqlite3WhereBeg
1f060 69 6e 28 70 50 61 72 73 65 2c 20 70 54 61 62 4c  in(pParse, pTabL
1f070 69 73 74 2c 20 70 57 68 65 72 65 2c 20 26 70 4f  ist, pWhere, &pO
1f080 72 64 65 72 42 79 2c 20 30 29 3b 0a 20 20 20 20  rderBy, 0);.    
1f090 69 66 28 20 70 57 49 6e 66 6f 3d 3d 30 20 29 20  if( pWInfo==0 ) 
1f0a0 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b  goto select_end;
1f0b0 0a 0a 20 20 20 20 2f 2a 20 49 66 20 73 6f 72 74  ..    /* If sort
1f0c0 69 6e 67 20 69 6e 64 65 78 20 74 68 61 74 20 77  ing index that w
1f0d0 61 73 20 63 72 65 61 74 65 64 20 62 79 20 61 20  as created by a 
1f0e0 70 72 69 6f 72 20 4f 50 5f 4f 70 65 6e 45 70 68  prior OP_OpenEph
1f0f0 65 6d 65 72 61 6c 20 0a 20 20 20 20 2a 2a 20 69  emeral .    ** i
1f100 6e 73 74 72 75 63 74 69 6f 6e 20 65 6e 64 65 64  nstruction ended
1f110 20 75 70 20 6e 6f 74 20 62 65 69 6e 67 20 6e 65   up not being ne
1f120 65 64 65 64 2c 20 74 68 65 6e 20 63 68 61 6e 67  eded, then chang
1f130 65 20 74 68 65 20 4f 50 5f 4f 70 65 6e 45 70 68  e the OP_OpenEph
1f140 65 6d 65 72 61 6c 0a 20 20 20 20 2a 2a 20 69 6e  emeral.    ** in
1f150 74 6f 20 61 6e 20 4f 50 5f 4e 6f 6f 70 2e 0a 20  to an OP_Noop.. 
1f160 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 61 64     */.    if( ad
1f170 64 72 53 6f 72 74 49 6e 64 65 78 3e 3d 30 20 26  drSortIndex>=0 &
1f180 26 20 70 4f 72 64 65 72 42 79 3d 3d 30 20 29 7b  & pOrderBy==0 ){
1f190 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
1f1a0 62 65 43 68 61 6e 67 65 54 6f 4e 6f 6f 70 28 76  beChangeToNoop(v
1f1b0 2c 20 61 64 64 72 53 6f 72 74 49 6e 64 65 78 2c  , addrSortIndex,
1f1c0 20 31 29 3b 0a 20 20 20 20 20 20 70 2d 3e 61 64   1);.      p->ad
1f1d0 64 72 4f 70 65 6e 45 70 68 6d 5b 32 5d 20 3d 20  drOpenEphm[2] = 
1f1e0 2d 31 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  -1;.    }..    /
1f1f0 2a 20 55 73 65 20 74 68 65 20 73 74 61 6e 64 61  * Use the standa
1f200 72 64 20 69 6e 6e 65 72 20 6c 6f 6f 70 0a 20 20  rd inner loop.  
1f210 20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28    */.    assert(
1f220 21 69 73 44 69 73 74 69 6e 63 74 29 3b 0a 20 20  !isDistinct);.  
1f230 20 20 73 65 6c 65 63 74 49 6e 6e 65 72 4c 6f 6f    selectInnerLoo
1f240 70 28 70 50 61 72 73 65 2c 20 70 2c 20 70 45 4c  p(pParse, p, pEL
1f250 69 73 74 2c 20 30 2c 20 30 2c 20 70 4f 72 64 65  ist, 0, 0, pOrde
1f260 72 42 79 2c 20 2d 31 2c 20 70 44 65 73 74 2c 0a  rBy, -1, pDest,.
1f270 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f280 20 20 20 20 70 57 49 6e 66 6f 2d 3e 69 43 6f 6e      pWInfo->iCon
1f290 74 69 6e 75 65 2c 20 70 57 49 6e 66 6f 2d 3e 69  tinue, pWInfo->i
1f2a0 42 72 65 61 6b 2c 20 61 66 66 29 3b 0a 0a 20 20  Break, aff);..  
1f2b0 20 20 2f 2a 20 45 6e 64 20 74 68 65 20 64 61 74    /* End the dat
1f2c0 61 62 61 73 65 20 73 63 61 6e 20 6c 6f 6f 70 2e  abase scan loop.
1f2d0 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73 71 6c 69  .    */.    sqli
1f2e0 74 65 33 57 68 65 72 65 45 6e 64 28 70 57 49 6e  te3WhereEnd(pWIn
1f2f0 66 6f 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  fo);.  }else{.  
1f300 20 20 2f 2a 20 54 68 69 73 20 69 73 20 74 68 65    /* This is the
1f310 20 70 72 6f 63 65 73 73 69 6e 67 20 66 6f 72 20   processing for 
1f320 61 67 67 72 65 67 61 74 65 20 71 75 65 72 69 65  aggregate querie
1f330 73 20 2a 2f 0a 20 20 20 20 4e 61 6d 65 43 6f 6e  s */.    NameCon
1f340 74 65 78 74 20 73 4e 43 3b 20 20 20 20 2f 2a 20  text sNC;    /* 
1f350 4e 61 6d 65 20 63 6f 6e 74 65 78 74 20 66 6f 72  Name context for
1f360 20 70 72 6f 63 65 73 73 69 6e 67 20 61 67 67 72   processing aggr
1f370 65 67 61 74 65 20 69 6e 66 6f 72 6d 61 74 69 6f  egate informatio
1f380 6e 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 41 4d  n */.    int iAM
1f390 65 6d 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  em;          /* 
1f3a0 46 69 72 73 74 20 4d 65 6d 20 61 64 64 72 65 73  First Mem addres
1f3b0 73 20 66 6f 72 20 73 74 6f 72 69 6e 67 20 63 75  s for storing cu
1f3c0 72 72 65 6e 74 20 47 52 4f 55 50 20 42 59 20 2a  rrent GROUP BY *
1f3d0 2f 0a 20 20 20 20 69 6e 74 20 69 42 4d 65 6d 3b  /.    int iBMem;
1f3e0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72            /* Fir
1f3f0 73 74 20 4d 65 6d 20 61 64 64 72 65 73 73 20 66  st Mem address f
1f400 6f 72 20 70 72 65 76 69 6f 75 73 20 47 52 4f 55  or previous GROU
1f410 50 20 42 59 20 2a 2f 0a 20 20 20 20 69 6e 74 20  P BY */.    int 
1f420 69 55 73 65 46 6c 61 67 3b 20 20 20 20 20 20 20  iUseFlag;       
1f430 2f 2a 20 4d 65 6d 20 61 64 64 72 65 73 73 20 68  /* Mem address h
1f440 6f 6c 64 69 6e 67 20 66 6c 61 67 20 69 6e 64 69  olding flag indi
1f450 63 61 74 69 6e 67 20 74 68 61 74 20 61 74 20 6c  cating that at l
1f460 65 61 73 74 0a 20 20 20 20 20 20 20 20 20 20 20  east.           
1f470 20 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20               ** 
1f480 6f 6e 65 20 72 6f 77 20 6f 66 20 74 68 65 20 69  one row of the i
1f490 6e 70 75 74 20 74 6f 20 74 68 65 20 61 67 67 72  nput to the aggr
1f4a0 65 67 61 74 6f 72 20 68 61 73 20 62 65 65 6e 0a  egator has been.
1f4b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f4c0 20 20 20 20 20 20 20 20 2a 2a 20 70 72 6f 63 65          ** proce
1f4d0 73 73 65 64 20 2a 2f 0a 20 20 20 20 69 6e 74 20  ssed */.    int 
1f4e0 69 41 62 6f 72 74 46 6c 61 67 3b 20 20 20 20 20  iAbortFlag;     
1f4f0 2f 2a 20 4d 65 6d 20 61 64 64 72 65 73 73 20 77  /* Mem address w
1f500 68 69 63 68 20 63 61 75 73 65 73 20 71 75 65 72  hich causes quer
1f510 79 20 61 62 6f 72 74 20 69 66 20 70 6f 73 69 74  y abort if posit
1f520 69 76 65 20 2a 2f 0a 20 20 20 20 69 6e 74 20 67  ive */.    int g
1f530 72 6f 75 70 42 79 53 6f 72 74 3b 20 20 20 20 2f  roupBySort;    /
1f540 2a 20 52 6f 77 73 20 63 6f 6d 65 20 66 72 6f 6d  * Rows come from
1f550 20 73 6f 75 72 63 65 20 69 6e 20 47 52 4f 55 50   source in GROUP
1f560 20 42 59 20 6f 72 64 65 72 20 2a 2f 0a 0a 0a 20   BY order */... 
1f570 20 20 20 2f 2a 20 54 68 65 20 66 6f 6c 6c 6f 77     /* The follow
1f580 69 6e 67 20 76 61 72 69 61 62 6c 65 73 20 68 6f  ing variables ho
1f590 6c 64 20 61 64 64 72 65 73 73 65 73 20 6f 72 20  ld addresses or 
1f5a0 6c 61 62 65 6c 73 20 66 6f 72 20 70 61 72 74 73  labels for parts
1f5b0 20 6f 66 20 74 68 65 0a 20 20 20 20 2a 2a 20 76   of the.    ** v
1f5c0 69 72 74 75 61 6c 20 6d 61 63 68 69 6e 65 20 70  irtual machine p
1f5d0 72 6f 67 72 61 6d 20 77 65 20 61 72 65 20 70 75  rogram we are pu
1f5e0 74 74 69 6e 67 20 74 6f 67 65 74 68 65 72 20 2a  tting together *
1f5f0 2f 0a 20 20 20 20 69 6e 74 20 61 64 64 72 4f 75  /.    int addrOu
1f600 74 70 75 74 52 6f 77 3b 20 20 20 20 20 20 2f 2a  tputRow;      /*
1f610 20 53 74 61 72 74 20 6f 66 20 73 75 62 72 6f 75   Start of subrou
1f620 74 69 6e 65 20 74 68 61 74 20 6f 75 74 70 75 74  tine that output
1f630 73 20 61 20 72 65 73 75 6c 74 20 72 6f 77 20 2a  s a result row *
1f640 2f 0a 20 20 20 20 69 6e 74 20 72 65 67 4f 75 74  /.    int regOut
1f650 70 75 74 52 6f 77 3b 20 20 20 20 20 20 20 2f 2a  putRow;       /*
1f660 20 52 65 74 75 72 6e 20 61 64 64 72 65 73 73 20   Return address 
1f670 72 65 67 69 73 74 65 72 20 66 6f 72 20 6f 75 74  register for out
1f680 70 75 74 20 73 75 62 72 6f 75 74 69 6e 65 20 2a  put subroutine *
1f690 2f 0a 20 20 20 20 69 6e 74 20 61 64 64 72 53 65  /.    int addrSe
1f6a0 74 41 62 6f 72 74 3b 20 20 20 20 20 20 20 2f 2a  tAbort;       /*
1f6b0 20 53 65 74 20 74 68 65 20 61 62 6f 72 74 20 66   Set the abort f
1f6c0 6c 61 67 20 61 6e 64 20 72 65 74 75 72 6e 20 2a  lag and return *
1f6d0 2f 0a 20 20 20 20 69 6e 74 20 61 64 64 72 49 6e  /.    int addrIn
1f6e0 69 74 69 61 6c 69 7a 65 4c 6f 6f 70 3b 20 2f 2a  itializeLoop; /*
1f6f0 20 53 74 61 72 74 20 6f 66 20 63 6f 64 65 20 74   Start of code t
1f700 68 61 74 20 69 6e 69 74 69 61 6c 69 7a 65 73 20  hat initializes 
1f710 74 68 65 20 69 6e 70 75 74 20 6c 6f 6f 70 20 2a  the input loop *
1f720 2f 0a 20 20 20 20 69 6e 74 20 61 64 64 72 54 6f  /.    int addrTo
1f730 70 4f 66 4c 6f 6f 70 3b 20 20 20 20 20 20 2f 2a  pOfLoop;      /*
1f740 20 54 6f 70 20 6f 66 20 74 68 65 20 69 6e 70 75   Top of the inpu
1f750 74 20 6c 6f 6f 70 20 2a 2f 0a 20 20 20 20 69 6e  t loop */.    in
1f760 74 20 61 64 64 72 45 6e 64 3b 20 20 20 20 20 20  t addrEnd;      
1f770 20 20 20 20 20 20 2f 2a 20 45 6e 64 20 6f 66 20        /* End of 
1f780 61 6c 6c 20 70 72 6f 63 65 73 73 69 6e 67 20 2a  all processing *
1f790 2f 0a 20 20 20 20 69 6e 74 20 61 64 64 72 53 6f  /.    int addrSo
1f7a0 72 74 69 6e 67 49 64 78 3b 20 20 20 20 20 2f 2a  rtingIdx;     /*
1f7b0 20 54 68 65 20 4f 50 5f 4f 70 65 6e 45 70 68 65   The OP_OpenEphe
1f7c0 6d 65 72 61 6c 20 66 6f 72 20 74 68 65 20 73 6f  meral for the so
1f7d0 72 74 69 6e 67 20 69 6e 64 65 78 20 2a 2f 0a 20  rting index */. 
1f7e0 20 20 20 69 6e 74 20 61 64 64 72 52 65 73 65 74     int addrReset
1f7f0 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 75  ;          /* Su
1f800 62 72 6f 75 74 69 6e 65 20 66 6f 72 20 72 65 73  broutine for res
1f810 65 74 74 69 6e 67 20 74 68 65 20 61 63 63 75 6d  etting the accum
1f820 75 6c 61 74 6f 72 20 2a 2f 0a 20 20 20 20 69 6e  ulator */.    in
1f830 74 20 72 65 67 52 65 73 65 74 3b 20 20 20 20 20  t regReset;     
1f840 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20        /* Return 
1f850 61 64 64 72 65 73 73 20 72 65 67 69 73 74 65 72  address register
1f860 20 66 6f 72 20 72 65 73 65 74 20 73 75 62 72 6f   for reset subro
1f870 75 74 69 6e 65 20 2a 2f 0a 0a 20 20 20 20 61 64  utine */..    ad
1f880 64 72 45 6e 64 20 3d 20 73 71 6c 69 74 65 33 56  drEnd = sqlite3V
1f890 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b  dbeMakeLabel(v);
1f8a0 0a 0a 20 20 20 20 2f 2a 20 43 6f 6e 76 65 72 74  ..    /* Convert
1f8b0 20 54 4b 5f 43 4f 4c 55 4d 4e 20 6e 6f 64 65 73   TK_COLUMN nodes
1f8c0 20 69 6e 74 6f 20 54 4b 5f 41 47 47 5f 43 4f 4c   into TK_AGG_COL
1f8d0 55 4d 4e 20 61 6e 64 20 6d 61 6b 65 20 65 6e 74  UMN and make ent
1f8e0 72 69 65 73 20 69 6e 0a 20 20 20 20 2a 2a 20 73  ries in.    ** s
1f8f0 41 67 67 49 6e 66 6f 20 66 6f 72 20 61 6c 6c 20  AggInfo for all 
1f900 54 4b 5f 41 47 47 5f 46 55 4e 43 54 49 4f 4e 20  TK_AGG_FUNCTION 
1f910 6e 6f 64 65 73 20 69 6e 20 65 78 70 72 65 73 73  nodes in express
1f920 69 6f 6e 73 20 6f 66 20 74 68 65 0a 20 20 20 20  ions of the.    
1f930 2a 2a 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d  ** SELECT statem
1f940 65 6e 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ent..    */.    
1f950 6d 65 6d 73 65 74 28 26 73 4e 43 2c 20 30 2c 20  memset(&sNC, 0, 
1f960 73 69 7a 65 6f 66 28 73 4e 43 29 29 3b 0a 20 20  sizeof(sNC));.  
1f970 20 20 73 4e 43 2e 70 50 61 72 73 65 20 3d 20 70    sNC.pParse = p
1f980 50 61 72 73 65 3b 0a 20 20 20 20 73 4e 43 2e 70  Parse;.    sNC.p
1f990 53 72 63 4c 69 73 74 20 3d 20 70 54 61 62 4c 69  SrcList = pTabLi
1f9a0 73 74 3b 0a 20 20 20 20 73 4e 43 2e 70 41 67 67  st;.    sNC.pAgg
1f9b0 49 6e 66 6f 20 3d 20 26 73 41 67 67 49 6e 66 6f  Info = &sAggInfo
1f9c0 3b 0a 20 20 20 20 73 41 67 67 49 6e 66 6f 2e 6e  ;.    sAggInfo.n
1f9d0 53 6f 72 74 69 6e 67 43 6f 6c 75 6d 6e 20 3d 20  SortingColumn = 
1f9e0 70 47 72 6f 75 70 42 79 20 3f 20 70 47 72 6f 75  pGroupBy ? pGrou
1f9f0 70 42 79 2d 3e 6e 45 78 70 72 2b 31 20 3a 20 30  pBy->nExpr+1 : 0
1fa00 3b 0a 20 20 20 20 73 41 67 67 49 6e 66 6f 2e 70  ;.    sAggInfo.p
1fa10 47 72 6f 75 70 42 79 20 3d 20 70 47 72 6f 75 70  GroupBy = pGroup
1fa20 42 79 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45  By;.    sqlite3E
1fa30 78 70 72 41 6e 61 6c 79 7a 65 41 67 67 4c 69 73  xprAnalyzeAggLis
1fa40 74 28 26 73 4e 43 2c 20 70 45 4c 69 73 74 29 3b  t(&sNC, pEList);
1fa50 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72  .    sqlite3Expr
1fa60 41 6e 61 6c 79 7a 65 41 67 67 4c 69 73 74 28 26  AnalyzeAggList(&
1fa70 73 4e 43 2c 20 70 4f 72 64 65 72 42 79 29 3b 0a  sNC, pOrderBy);.
1fa80 20 20 20 20 69 66 28 20 70 48 61 76 69 6e 67 20      if( pHaving 
1fa90 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
1faa0 45 78 70 72 41 6e 61 6c 79 7a 65 41 67 67 72 65  ExprAnalyzeAggre
1fab0 67 61 74 65 73 28 26 73 4e 43 2c 20 70 48 61 76  gates(&sNC, pHav
1fac0 69 6e 67 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ing);.    }.    
1fad0 73 41 67 67 49 6e 66 6f 2e 6e 41 63 63 75 6d 75  sAggInfo.nAccumu
1fae0 6c 61 74 6f 72 20 3d 20 73 41 67 67 49 6e 66 6f  lator = sAggInfo
1faf0 2e 6e 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 66 6f  .nColumn;.    fo
1fb00 72 28 69 3d 30 3b 20 69 3c 73 41 67 67 49 6e 66  r(i=0; i<sAggInf
1fb10 6f 2e 6e 46 75 6e 63 3b 20 69 2b 2b 29 7b 0a 20  o.nFunc; i++){. 
1fb20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
1fb30 41 6e 61 6c 79 7a 65 41 67 67 4c 69 73 74 28 26  AnalyzeAggList(&
1fb40 73 4e 43 2c 20 73 41 67 67 49 6e 66 6f 2e 61 46  sNC, sAggInfo.aF
1fb50 75 6e 63 5b 69 5d 2e 70 45 78 70 72 2d 3e 70 4c  unc[i].pExpr->pL
1fb60 69 73 74 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ist);.    }.    
1fb70 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  if( db->mallocFa
1fb80 69 6c 65 64 20 29 20 67 6f 74 6f 20 73 65 6c 65  iled ) goto sele
1fb90 63 74 5f 65 6e 64 3b 0a 0a 20 20 20 20 2f 2a 20  ct_end;..    /* 
1fba0 50 72 6f 63 65 73 73 69 6e 67 20 66 6f 72 20 61  Processing for a
1fbb0 67 67 72 65 67 61 74 65 73 20 77 69 74 68 20 47  ggregates with G
1fbc0 52 4f 55 50 20 42 59 20 69 73 20 76 65 72 79 20  ROUP BY is very 
1fbd0 64 69 66 66 65 72 65 6e 74 20 61 6e 64 0a 20 20  different and.  
1fbe0 20 20 2a 2a 20 6d 75 63 68 20 6d 6f 72 65 20 63    ** much more c
1fbf0 6f 6d 70 6c 65 78 20 74 68 61 6e 20 61 67 67 72  omplex than aggr
1fc00 65 67 61 74 65 73 20 77 69 74 68 6f 75 74 20 61  egates without a
1fc10 20 47 52 4f 55 50 20 42 59 2e 0a 20 20 20 20 2a   GROUP BY..    *
1fc20 2f 0a 20 20 20 20 69 66 28 20 70 47 72 6f 75 70  /.    if( pGroup
1fc30 42 79 20 29 7b 0a 20 20 20 20 20 20 4b 65 79 49  By ){.      KeyI
1fc40 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 3b 20 20  nfo *pKeyInfo;  
1fc50 2f 2a 20 4b 65 79 69 6e 67 20 69 6e 66 6f 72 6d  /* Keying inform
1fc60 61 74 69 6f 6e 20 66 6f 72 20 74 68 65 20 67 72  ation for the gr
1fc70 6f 75 70 20 62 79 20 63 6c 61 75 73 65 20 2a 2f  oup by clause */
1fc80 0a 20 20 20 20 20 20 69 6e 74 20 6a 31 3b 0a 0a  .      int j1;..
1fc90 20 20 20 20 20 20 2f 2a 20 43 72 65 61 74 65 20        /* Create 
1fca0 6c 61 62 65 6c 73 20 74 68 61 74 20 77 65 20 77  labels that we w
1fcb0 69 6c 6c 20 62 65 20 6e 65 65 64 69 6e 67 0a 20  ill be needing. 
1fcc0 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 61 64       */.      ad
1fcd0 64 72 49 6e 69 74 69 61 6c 69 7a 65 4c 6f 6f 70  drInitializeLoop
1fce0 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61   = sqlite3VdbeMa
1fcf0 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 0a 20 20 20  keLabel(v);..   
1fd00 20 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20 69     /* If there i
1fd10 73 20 61 20 47 52 4f 55 50 20 42 59 20 63 6c 61  s a GROUP BY cla
1fd20 75 73 65 20 77 65 20 6d 69 67 68 74 20 6e 65 65  use we might nee
1fd30 64 20 61 20 73 6f 72 74 69 6e 67 20 69 6e 64 65  d a sorting inde
1fd40 78 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20 69 6d  x to.      ** im
1fd50 70 6c 65 6d 65 6e 74 20 69 74 2e 20 20 41 6c 6c  plement it.  All
1fd60 6f 63 61 74 65 20 74 68 61 74 20 73 6f 72 74 69  ocate that sorti
1fd70 6e 67 20 69 6e 64 65 78 20 6e 6f 77 2e 20 20 49  ng index now.  I
1fd80 66 20 69 74 20 74 75 72 6e 73 20 6f 75 74 0a 20  f it turns out. 
1fd90 20 20 20 20 20 2a 2a 20 74 68 61 74 20 77 65 20       ** that we 
1fda0 64 6f 20 6e 6f 74 20 6e 65 65 64 20 69 74 20 61  do not need it a
1fdb0 66 74 65 72 20 61 6c 6c 2c 20 74 68 65 20 4f 70  fter all, the Op
1fdc0 65 6e 45 70 68 65 6d 65 72 61 6c 20 69 6e 73 74  enEphemeral inst
1fdd0 72 75 63 74 69 6f 6e 0a 20 20 20 20 20 20 2a 2a  ruction.      **
1fde0 20 77 69 6c 6c 20 62 65 20 63 6f 6e 76 65 72 74   will be convert
1fdf0 65 64 20 69 6e 74 6f 20 61 20 4e 6f 6f 70 2e 20  ed into a Noop. 
1fe00 20 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20   .      */.     
1fe10 20 73 41 67 67 49 6e 66 6f 2e 73 6f 72 74 69 6e   sAggInfo.sortin
1fe20 67 49 64 78 20 3d 20 70 50 61 72 73 65 2d 3e 6e  gIdx = pParse->n
1fe30 54 61 62 2b 2b 3b 0a 20 20 20 20 20 20 70 4b 65  Tab++;.      pKe
1fe40 79 49 6e 66 6f 20 3d 20 6b 65 79 49 6e 66 6f 46  yInfo = keyInfoF
1fe50 72 6f 6d 45 78 70 72 4c 69 73 74 28 70 50 61 72  romExprList(pPar
1fe60 73 65 2c 20 70 47 72 6f 75 70 42 79 29 3b 0a 20  se, pGroupBy);. 
1fe70 20 20 20 20 20 61 64 64 72 53 6f 72 74 69 6e 67       addrSorting
1fe80 49 64 78 20 3d 20 73 71 6c 69 74 65 33 56 64 62  Idx = sqlite3Vdb
1fe90 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 4f 70  eAddOp4(v, OP_Op
1fea0 65 6e 45 70 68 65 6d 65 72 61 6c 2c 20 0a 20 20  enEphemeral, .  
1feb0 20 20 20 20 20 20 20 20 73 41 67 67 49 6e 66 6f          sAggInfo
1fec0 2e 73 6f 72 74 69 6e 67 49 64 78 2c 20 73 41 67  .sortingIdx, sAg
1fed0 67 49 6e 66 6f 2e 6e 53 6f 72 74 69 6e 67 43 6f  gInfo.nSortingCo
1fee0 6c 75 6d 6e 2c 20 0a 20 20 20 20 20 20 20 20 20  lumn, .         
1fef0 20 30 2c 20 28 63 68 61 72 2a 29 70 4b 65 79 49   0, (char*)pKeyI
1ff00 6e 66 6f 2c 20 50 34 5f 4b 45 59 49 4e 46 4f 5f  nfo, P4_KEYINFO_
1ff10 48 41 4e 44 4f 46 46 29 3b 0a 0a 20 20 20 20 20  HANDOFF);..     
1ff20 20 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 6d   /* Initialize m
1ff30 65 6d 6f 72 79 20 6c 6f 63 61 74 69 6f 6e 73 20  emory locations 
1ff40 75 73 65 64 20 62 79 20 47 52 4f 55 50 20 42 59  used by GROUP BY
1ff50 20 61 67 67 72 65 67 61 74 65 20 70 72 6f 63 65   aggregate proce
1ff60 73 73 69 6e 67 0a 20 20 20 20 20 20 2a 2f 0a 20  ssing.      */. 
1ff70 20 20 20 20 20 69 55 73 65 46 6c 61 67 20 3d 20       iUseFlag = 
1ff80 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a  ++pParse->nMem;.
1ff90 20 20 20 20 20 20 69 41 62 6f 72 74 46 6c 61 67        iAbortFlag
1ffa0 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65   = ++pParse->nMe
1ffb0 6d 3b 0a 20 20 20 20 20 20 69 41 4d 65 6d 20 3d  m;.      iAMem =
1ffc0 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 20   pParse->nMem + 
1ffd0 31 3b 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d  1;.      pParse-
1ffe0 3e 6e 4d 65 6d 20 2b 3d 20 70 47 72 6f 75 70 42  >nMem += pGroupB
1fff0 79 2d 3e 6e 45 78 70 72 3b 0a 20 20 20 20 20 20  y->nExpr;.      
20000 69 42 4d 65 6d 20 3d 20 70 50 61 72 73 65 2d 3e  iBMem = pParse->
20010 6e 4d 65 6d 20 2b 20 31 3b 0a 20 20 20 20 20 20  nMem + 1;.      
20020 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d 20  pParse->nMem += 
20030 70 47 72 6f 75 70 42 79 2d 3e 6e 45 78 70 72 3b  pGroupBy->nExpr;
20040 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
20050 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49  beAddOp2(v, OP_I
20060 6e 74 65 67 65 72 2c 20 30 2c 20 69 41 62 6f 72  nteger, 0, iAbor
20070 74 46 6c 61 67 29 3b 0a 20 20 20 20 20 20 56 64  tFlag);.      Vd
20080 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 63  beComment((v, "c
20090 6c 65 61 72 20 61 62 6f 72 74 20 66 6c 61 67 22  lear abort flag"
200a0 29 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  ));.      sqlite
200b0 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
200c0 50 5f 49 6e 74 65 67 65 72 2c 20 30 2c 20 69 55  P_Integer, 0, iU
200d0 73 65 46 6c 61 67 29 3b 0a 20 20 20 20 20 20 56  seFlag);.      V
200e0 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22  dbeComment((v, "
200f0 69 6e 64 69 63 61 74 65 20 61 63 63 75 6d 75 6c  indicate accumul
20100 61 74 6f 72 20 65 6d 70 74 79 22 29 29 3b 0a 20  ator empty"));. 
20110 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
20120 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 74  AddOp2(v, OP_Got
20130 6f 2c 20 30 2c 20 61 64 64 72 49 6e 69 74 69 61  o, 0, addrInitia
20140 6c 69 7a 65 4c 6f 6f 70 29 3b 0a 0a 20 20 20 20  lizeLoop);..    
20150 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 61 20    /* Generate a 
20160 73 75 62 72 6f 75 74 69 6e 65 20 74 68 61 74 20  subroutine that 
20170 6f 75 74 70 75 74 73 20 61 20 73 69 6e 67 6c 65  outputs a single
20180 20 72 6f 77 20 6f 66 20 74 68 65 20 72 65 73 75   row of the resu
20190 6c 74 0a 20 20 20 20 20 20 2a 2a 20 73 65 74 2e  lt.      ** set.
201a0 20 20 54 68 69 73 20 73 75 62 72 6f 75 74 69 6e    This subroutin
201b0 65 20 66 69 72 73 74 20 6c 6f 6f 6b 73 20 61 74  e first looks at
201c0 20 74 68 65 20 69 55 73 65 46 6c 61 67 2e 20 20   the iUseFlag.  
201d0 49 66 20 69 55 73 65 46 6c 61 67 0a 20 20 20 20  If iUseFlag.    
201e0 20 20 2a 2a 20 69 73 20 6c 65 73 73 20 74 68 61    ** is less tha
201f0 6e 20 6f 72 20 65 71 75 61 6c 20 74 6f 20 7a 65  n or equal to ze
20200 72 6f 2c 20 74 68 65 20 73 75 62 72 6f 75 74 69  ro, the subrouti
20210 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 20 20  ne is a no-op.  
20220 49 66 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20  If.      ** the 
20230 70 72 6f 63 65 73 73 69 6e 67 20 63 61 6c 6c 73  processing calls
20240 20 66 6f 72 20 74 68 65 20 71 75 65 72 79 20 74   for the query t
20250 6f 20 61 62 6f 72 74 2c 20 74 68 69 73 20 73 75  o abort, this su
20260 62 72 6f 75 74 69 6e 65 0a 20 20 20 20 20 20 2a  broutine.      *
20270 2a 20 69 6e 63 72 65 6d 65 6e 74 73 20 74 68 65  * increments the
20280 20 69 41 62 6f 72 74 46 6c 61 67 20 6d 65 6d 6f   iAbortFlag memo
20290 72 79 20 6c 6f 63 61 74 69 6f 6e 20 62 65 66 6f  ry location befo
202a0 72 65 20 72 65 74 75 72 6e 69 6e 67 20 69 6e 0a  re returning in.
202b0 20 20 20 20 20 20 2a 2a 20 6f 72 64 65 72 20 74        ** order t
202c0 6f 20 73 69 67 6e 61 6c 20 74 68 65 20 63 61 6c  o signal the cal
202d0 6c 65 72 20 74 6f 20 61 62 6f 72 74 2e 0a 20 20  ler to abort..  
202e0 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 61 64 64      */.      add
202f0 72 53 65 74 41 62 6f 72 74 20 3d 20 73 71 6c 69  rSetAbort = sqli
20300 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64  te3VdbeCurrentAd
20310 64 72 28 76 29 3b 0a 20 20 20 20 20 20 73 71 6c  dr(v);.      sql
20320 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
20330 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 31 2c  , OP_Integer, 1,
20340 20 69 41 62 6f 72 74 46 6c 61 67 29 3b 0a 20 20   iAbortFlag);.  
20350 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28      VdbeComment(
20360 28 76 2c 20 22 73 65 74 20 61 62 6f 72 74 20 66  (v, "set abort f
20370 6c 61 67 22 29 29 3b 0a 20 20 20 20 20 20 72 65  lag"));.      re
20380 67 4f 75 74 70 75 74 52 6f 77 20 3d 20 2b 2b 70  gOutputRow = ++p
20390 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20  Parse->nMem;.   
203a0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
203b0 64 4f 70 31 28 76 2c 20 4f 50 5f 52 65 74 75 72  dOp1(v, OP_Retur
203c0 6e 2c 20 72 65 67 4f 75 74 70 75 74 52 6f 77 29  n, regOutputRow)
203d0 3b 0a 20 20 20 20 20 20 61 64 64 72 4f 75 74 70  ;.      addrOutp
203e0 75 74 52 6f 77 20 3d 20 73 71 6c 69 74 65 33 56  utRow = sqlite3V
203f0 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76  dbeCurrentAddr(v
20400 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
20410 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
20420 5f 49 66 50 6f 73 2c 20 69 55 73 65 46 6c 61 67  _IfPos, iUseFlag
20430 2c 20 61 64 64 72 4f 75 74 70 75 74 52 6f 77 2b  , addrOutputRow+
20440 32 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f  2);.      VdbeCo
20450 6d 6d 65 6e 74 28 28 76 2c 20 22 47 72 6f 75 70  mment((v, "Group
20460 62 79 20 72 65 73 75 6c 74 20 67 65 6e 65 72 61  by result genera
20470 74 6f 72 20 65 6e 74 72 79 20 70 6f 69 6e 74 22  tor entry point"
20480 29 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  ));.      sqlite
20490 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f  3VdbeAddOp1(v, O
204a0 50 5f 52 65 74 75 72 6e 2c 20 72 65 67 4f 75 74  P_Return, regOut
204b0 70 75 74 52 6f 77 29 3b 0a 20 20 20 20 20 20 66  putRow);.      f
204c0 69 6e 61 6c 69 7a 65 41 67 67 46 75 6e 63 74 69  inalizeAggFuncti
204d0 6f 6e 73 28 70 50 61 72 73 65 2c 20 26 73 41 67  ons(pParse, &sAg
204e0 67 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20 69 66  gInfo);.      if
204f0 28 20 70 48 61 76 69 6e 67 20 29 7b 0a 20 20 20  ( pHaving ){.   
20500 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
20510 49 66 46 61 6c 73 65 28 70 50 61 72 73 65 2c 20  IfFalse(pParse, 
20520 70 48 61 76 69 6e 67 2c 20 61 64 64 72 4f 75 74  pHaving, addrOut
20530 70 75 74 52 6f 77 2b 31 2c 20 53 51 4c 49 54 45  putRow+1, SQLITE
20540 5f 4a 55 4d 50 49 46 4e 55 4c 4c 29 3b 0a 20 20  _JUMPIFNULL);.  
20550 20 20 20 20 7d 0a 20 20 20 20 20 20 73 65 6c 65      }.      sele
20560 63 74 49 6e 6e 65 72 4c 6f 6f 70 28 70 50 61 72  ctInnerLoop(pPar
20570 73 65 2c 20 70 2c 20 70 2d 3e 70 45 4c 69 73 74  se, p, p->pEList
20580 2c 20 30 2c 20 30 2c 20 70 4f 72 64 65 72 42 79  , 0, 0, pOrderBy
20590 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
205a0 20 20 20 20 20 20 20 20 64 69 73 74 69 6e 63 74          distinct
205b0 2c 20 70 44 65 73 74 2c 0a 20 20 20 20 20 20 20  , pDest,.       
205c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 61                 a
205d0 64 64 72 4f 75 74 70 75 74 52 6f 77 2b 31 2c 20  ddrOutputRow+1, 
205e0 61 64 64 72 53 65 74 41 62 6f 72 74 2c 20 61 66  addrSetAbort, af
205f0 66 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  f);.      sqlite
20600 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f  3VdbeAddOp1(v, O
20610 50 5f 52 65 74 75 72 6e 2c 20 72 65 67 4f 75 74  P_Return, regOut
20620 70 75 74 52 6f 77 29 3b 0a 20 20 20 20 20 20 56  putRow);.      V
20630 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22  dbeComment((v, "
20640 65 6e 64 20 67 72 6f 75 70 62 79 20 72 65 73 75  end groupby resu
20650 6c 74 20 67 65 6e 65 72 61 74 6f 72 22 29 29 3b  lt generator"));
20660 0a 0a 20 20 20 20 20 20 2f 2a 20 47 65 6e 65 72  ..      /* Gener
20670 61 74 65 20 61 20 73 75 62 72 6f 75 74 69 6e 65  ate a subroutine
20680 20 74 68 61 74 20 77 69 6c 6c 20 72 65 73 65 74   that will reset
20690 20 74 68 65 20 67 72 6f 75 70 2d 62 79 20 61 63   the group-by ac
206a0 63 75 6d 75 6c 61 74 6f 72 0a 20 20 20 20 20 20  cumulator.      
206b0 2a 2f 0a 20 20 20 20 20 20 61 64 64 72 52 65 73  */.      addrRes
206c0 65 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  et = sqlite3Vdbe
206d0 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b 0a  CurrentAddr(v);.
206e0 20 20 20 20 20 20 72 65 67 52 65 73 65 74 20 3d        regReset =
206f0 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b   ++pParse->nMem;
20700 0a 20 20 20 20 20 20 72 65 73 65 74 41 63 63 75  .      resetAccu
20710 6d 75 6c 61 74 6f 72 28 70 50 61 72 73 65 2c 20  mulator(pParse, 
20720 26 73 41 67 67 49 6e 66 6f 29 3b 0a 20 20 20 20  &sAggInfo);.    
20730 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
20740 4f 70 31 28 76 2c 20 4f 50 5f 52 65 74 75 72 6e  Op1(v, OP_Return
20750 2c 20 72 65 67 52 65 73 65 74 29 3b 0a 0a 20 20  , regReset);..  
20760 20 20 20 20 2f 2a 20 42 65 67 69 6e 20 61 20 6c      /* Begin a l
20770 6f 6f 70 20 74 68 61 74 20 77 69 6c 6c 20 65 78  oop that will ex
20780 74 72 61 63 74 20 61 6c 6c 20 73 6f 75 72 63 65  tract all source
20790 20 72 6f 77 73 20 69 6e 20 47 52 4f 55 50 20 42   rows in GROUP B
207a0 59 20 6f 72 64 65 72 2e 0a 20 20 20 20 20 20 2a  Y order..      *
207b0 2a 20 54 68 69 73 20 6d 69 67 68 74 20 69 6e 76  * This might inv
207c0 6f 6c 76 65 20 74 77 6f 20 73 65 70 61 72 61 74  olve two separat
207d0 65 20 6c 6f 6f 70 73 20 77 69 74 68 20 61 6e 20  e loops with an 
207e0 4f 50 5f 53 6f 72 74 20 69 6e 20 62 65 74 77 65  OP_Sort in betwe
207f0 65 6e 2c 20 6f 72 0a 20 20 20 20 20 20 2a 2a 20  en, or.      ** 
20800 69 74 20 6d 69 67 68 74 20 62 65 20 61 20 73 69  it might be a si
20810 6e 67 6c 65 20 6c 6f 6f 70 20 74 68 61 74 20 75  ngle loop that u
20820 73 65 73 20 61 6e 20 69 6e 64 65 78 20 74 6f 20  ses an index to 
20830 65 78 74 72 61 63 74 20 69 6e 66 6f 72 6d 61 74  extract informat
20840 69 6f 6e 0a 20 20 20 20 20 20 2a 2a 20 69 6e 20  ion.      ** in 
20850 74 68 65 20 72 69 67 68 74 20 6f 72 64 65 72 20  the right order 
20860 74 6f 20 62 65 67 69 6e 20 77 69 74 68 2e 0a 20  to begin with.. 
20870 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 73 71       */.      sq
20880 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65  lite3VdbeResolve
20890 4c 61 62 65 6c 28 76 2c 20 61 64 64 72 49 6e 69  Label(v, addrIni
208a0 74 69 61 6c 69 7a 65 4c 6f 6f 70 29 3b 0a 20 20  tializeLoop);.  
208b0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
208c0 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 73 75  ddOp2(v, OP_Gosu
208d0 62 2c 20 72 65 67 52 65 73 65 74 2c 20 61 64 64  b, regReset, add
208e0 72 52 65 73 65 74 29 3b 0a 20 20 20 20 20 20 70  rReset);.      p
208f0 57 49 6e 66 6f 20 3d 20 73 71 6c 69 74 65 33 57  WInfo = sqlite3W
20900 68 65 72 65 42 65 67 69 6e 28 70 50 61 72 73 65  hereBegin(pParse
20910 2c 20 70 54 61 62 4c 69 73 74 2c 20 70 57 68 65  , pTabList, pWhe
20920 72 65 2c 20 26 70 47 72 6f 75 70 42 79 2c 20 30  re, &pGroupBy, 0
20930 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 57 49  );.      if( pWI
20940 6e 66 6f 3d 3d 30 20 29 20 67 6f 74 6f 20 73 65  nfo==0 ) goto se
20950 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 20 20  lect_end;.      
20960 69 66 28 20 70 47 72 6f 75 70 42 79 3d 3d 30 20  if( pGroupBy==0 
20970 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68  ){.        /* Th
20980 65 20 6f 70 74 69 6d 69 7a 65 72 20 69 73 20 61  e optimizer is a
20990 62 6c 65 20 74 6f 20 64 65 6c 69 76 65 72 20 72  ble to deliver r
209a0 6f 77 73 20 69 6e 20 67 72 6f 75 70 20 62 79 20  ows in group by 
209b0 6f 72 64 65 72 20 73 6f 0a 20 20 20 20 20 20 20  order so.       
209c0 20 2a 2a 20 77 65 20 64 6f 20 6e 6f 74 20 68 61   ** we do not ha
209d0 76 65 20 74 6f 20 73 6f 72 74 2e 20 20 54 68 65  ve to sort.  The
209e0 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61   OP_OpenEphemera
209f0 6c 20 74 61 62 6c 65 20 77 69 6c 6c 20 62 65 0a  l table will be.
20a00 20 20 20 20 20 20 20 20 2a 2a 20 63 61 6e 63 65          ** cance
20a10 6c 6c 65 64 20 6c 61 74 65 72 20 62 65 63 61 75  lled later becau
20a20 73 65 20 77 65 20 73 74 69 6c 6c 20 6e 65 65 64  se we still need
20a30 20 74 6f 20 75 73 65 20 74 68 65 20 70 4b 65 79   to use the pKey
20a40 49 6e 66 6f 0a 20 20 20 20 20 20 20 20 2a 2f 0a  Info.        */.
20a50 20 20 20 20 20 20 20 20 70 47 72 6f 75 70 42 79          pGroupBy
20a60 20 3d 20 70 2d 3e 70 47 72 6f 75 70 42 79 3b 0a   = p->pGroupBy;.
20a70 20 20 20 20 20 20 20 20 67 72 6f 75 70 42 79 53          groupByS
20a80 6f 72 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d  ort = 0;.      }
20a90 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 2f 2a  else{.        /*
20aa0 20 52 6f 77 73 20 61 72 65 20 63 6f 6d 69 6e 67   Rows are coming
20ab0 20 6f 75 74 20 69 6e 20 75 6e 64 65 74 65 72 6d   out in undeterm
20ac0 69 6e 65 64 20 6f 72 64 65 72 2e 20 20 57 65 20  ined order.  We 
20ad0 68 61 76 65 20 74 6f 20 70 75 73 68 0a 20 20 20  have to push.   
20ae0 20 20 20 20 20 2a 2a 20 65 61 63 68 20 72 6f 77       ** each row
20af0 20 69 6e 74 6f 20 61 20 73 6f 72 74 69 6e 67 20   into a sorting 
20b00 69 6e 64 65 78 2c 20 74 65 72 6d 69 6e 61 74 65  index, terminate
20b10 20 74 68 65 20 66 69 72 73 74 20 6c 6f 6f 70 2c   the first loop,
20b20 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65 6e  .        ** then
20b30 20 6c 6f 6f 70 20 6f 76 65 72 20 74 68 65 20 73   loop over the s
20b40 6f 72 74 69 6e 67 20 69 6e 64 65 78 20 69 6e 20  orting index in 
20b50 6f 72 64 65 72 20 74 6f 20 67 65 74 20 74 68 65  order to get the
20b60 20 6f 75 74 70 75 74 0a 20 20 20 20 20 20 20 20   output.        
20b70 2a 2a 20 69 6e 20 73 6f 72 74 65 64 20 6f 72 64  ** in sorted ord
20b80 65 72 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  er.        */.  
20b90 20 20 20 20 20 20 69 6e 74 20 72 65 67 42 61 73        int regBas
20ba0 65 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 72  e;.        int r
20bb0 65 67 52 65 63 6f 72 64 3b 0a 20 20 20 20 20 20  egRecord;.      
20bc0 20 20 69 6e 74 20 6e 43 6f 6c 3b 0a 20 20 20 20    int nCol;.    
20bd0 20 20 20 20 69 6e 74 20 6e 47 72 6f 75 70 42 79      int nGroupBy
20be0 3b 0a 0a 20 20 20 20 20 20 20 20 67 72 6f 75 70  ;..        group
20bf0 42 79 53 6f 72 74 20 3d 20 31 3b 0a 20 20 20 20  BySort = 1;.    
20c00 20 20 20 20 6e 47 72 6f 75 70 42 79 20 3d 20 70      nGroupBy = p
20c10 47 72 6f 75 70 42 79 2d 3e 6e 45 78 70 72 3b 0a  GroupBy->nExpr;.
20c20 20 20 20 20 20 20 20 20 6e 43 6f 6c 20 3d 20 6e          nCol = n
20c30 47 72 6f 75 70 42 79 20 2b 20 31 3b 0a 20 20 20  GroupBy + 1;.   
20c40 20 20 20 20 20 6a 20 3d 20 6e 47 72 6f 75 70 42       j = nGroupB
20c50 79 2b 31 3b 0a 20 20 20 20 20 20 20 20 66 6f 72  y+1;.        for
20c60 28 69 3d 30 3b 20 69 3c 73 41 67 67 49 6e 66 6f  (i=0; i<sAggInfo
20c70 2e 6e 43 6f 6c 75 6d 6e 3b 20 69 2b 2b 29 7b 0a  .nColumn; i++){.
20c80 20 20 20 20 20 20 20 20 20 20 69 66 28 20 73 41            if( sA
20c90 67 67 49 6e 66 6f 2e 61 43 6f 6c 5b 69 5d 2e 69  ggInfo.aCol[i].i
20ca0 53 6f 72 74 65 72 43 6f 6c 75 6d 6e 3e 3d 6a 20  SorterColumn>=j 
20cb0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 6e  ){.            n
20cc0 43 6f 6c 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20  Col++;.         
20cd0 20 20 20 6a 2b 2b 3b 0a 20 20 20 20 20 20 20 20     j++;.        
20ce0 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20    }.        }.  
20cf0 20 20 20 20 20 20 72 65 67 42 61 73 65 20 3d 20        regBase = 
20d00 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 61  sqlite3GetTempRa
20d10 6e 67 65 28 70 50 61 72 73 65 2c 20 6e 43 6f 6c  nge(pParse, nCol
20d20 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
20d30 65 33 45 78 70 72 43 6f 64 65 45 78 70 72 4c 69  e3ExprCodeExprLi
20d40 73 74 28 70 50 61 72 73 65 2c 20 70 47 72 6f 75  st(pParse, pGrou
20d50 70 42 79 2c 20 72 65 67 42 61 73 65 2c 20 30 29  pBy, regBase, 0)
20d60 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
20d70 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
20d80 50 5f 53 65 71 75 65 6e 63 65 2c 20 73 41 67 67  P_Sequence, sAgg
20d90 49 6e 66 6f 2e 73 6f 72 74 69 6e 67 49 64 78 2c  Info.sortingIdx,
20da0 72 65 67 42 61 73 65 2b 6e 47 72 6f 75 70 42 79  regBase+nGroupBy
20db0 29 3b 0a 20 20 20 20 20 20 20 20 6a 20 3d 20 6e  );.        j = n
20dc0 47 72 6f 75 70 42 79 2b 31 3b 0a 20 20 20 20 20  GroupBy+1;.     
20dd0 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 73 41     for(i=0; i<sA
20de0 67 67 49 6e 66 6f 2e 6e 43 6f 6c 75 6d 6e 3b 20  ggInfo.nColumn; 
20df0 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20  i++){.          
20e00 73 74 72 75 63 74 20 41 67 67 49 6e 66 6f 5f 63  struct AggInfo_c
20e10 6f 6c 20 2a 70 43 6f 6c 20 3d 20 26 73 41 67 67  ol *pCol = &sAgg
20e20 49 6e 66 6f 2e 61 43 6f 6c 5b 69 5d 3b 0a 20 20  Info.aCol[i];.  
20e30 20 20 20 20 20 20 20 20 69 66 28 20 70 43 6f 6c          if( pCol
20e40 2d 3e 69 53 6f 72 74 65 72 43 6f 6c 75 6d 6e 3e  ->iSorterColumn>
20e50 3d 6a 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =j ){.          
20e60 20 20 69 6e 74 20 72 31 20 3d 20 6a 20 2b 20 72    int r1 = j + r
20e70 65 67 42 61 73 65 3b 0a 20 20 20 20 20 20 20 20  egBase;.        
20e80 20 20 20 20 69 6e 74 20 72 32 20 3d 20 73 71 6c      int r2 = sql
20e90 69 74 65 33 45 78 70 72 43 6f 64 65 47 65 74 43  ite3ExprCodeGetC
20ea0 6f 6c 75 6d 6e 28 70 50 61 72 73 65 2c 20 0a 20  olumn(pParse, . 
20eb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20ec0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 43                pC
20ed0 6f 6c 2d 3e 70 54 61 62 2c 20 70 43 6f 6c 2d 3e  ol->pTab, pCol->
20ee0 69 43 6f 6c 75 6d 6e 2c 20 70 43 6f 6c 2d 3e 69  iColumn, pCol->i
20ef0 54 61 62 6c 65 2c 20 72 31 2c 20 30 29 3b 0a 20  Table, r1, 0);. 
20f00 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72             if( r
20f10 31 21 3d 72 32 20 29 7b 0a 20 20 20 20 20 20 20  1!=r2 ){.       
20f20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
20f30 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 53  beAddOp2(v, OP_S
20f40 43 6f 70 79 2c 20 72 32 2c 20 72 31 29 3b 0a 20  Copy, r2, r1);. 
20f50 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
20f60 20 20 20 20 20 20 20 20 20 6a 2b 2b 3b 0a 20 20           j++;.  
20f70 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
20f80 20 20 7d 0a 20 20 20 20 20 20 20 20 72 65 67 52    }.        regR
20f90 65 63 6f 72 64 20 3d 20 73 71 6c 69 74 65 33 47  ecord = sqlite3G
20fa0 65 74 54 65 6d 70 52 65 67 28 70 50 61 72 73 65  etTempReg(pParse
20fb0 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
20fc0 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
20fd0 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20 72  OP_MakeRecord, r
20fe0 65 67 42 61 73 65 2c 20 6e 43 6f 6c 2c 20 72 65  egBase, nCol, re
20ff0 67 52 65 63 6f 72 64 29 3b 0a 20 20 20 20 20 20  gRecord);.      
21000 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
21010 4f 70 32 28 76 2c 20 4f 50 5f 49 64 78 49 6e 73  Op2(v, OP_IdxIns
21020 65 72 74 2c 20 73 41 67 67 49 6e 66 6f 2e 73 6f  ert, sAggInfo.so
21030 72 74 69 6e 67 49 64 78 2c 20 72 65 67 52 65 63  rtingIdx, regRec
21040 6f 72 64 29 3b 0a 20 20 20 20 20 20 20 20 73 71  ord);.        sq
21050 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70  lite3ReleaseTemp
21060 52 65 67 28 70 50 61 72 73 65 2c 20 72 65 67 52  Reg(pParse, regR
21070 65 63 6f 72 64 29 3b 0a 20 20 20 20 20 20 20 20  ecord);.        
21080 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65  sqlite3ReleaseTe
21090 6d 70 52 61 6e 67 65 28 70 50 61 72 73 65 2c 20  mpRange(pParse, 
210a0 72 65 67 42 61 73 65 2c 20 6e 43 6f 6c 29 3b 0a  regBase, nCol);.
210b0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 57          sqlite3W
210c0 68 65 72 65 45 6e 64 28 70 57 49 6e 66 6f 29 3b  hereEnd(pWInfo);
210d0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
210e0 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
210f0 5f 53 6f 72 74 2c 20 73 41 67 67 49 6e 66 6f 2e  _Sort, sAggInfo.
21100 73 6f 72 74 69 6e 67 49 64 78 2c 20 61 64 64 72  sortingIdx, addr
21110 45 6e 64 29 3b 0a 20 20 20 20 20 20 20 20 56 64  End);.        Vd
21120 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 47  beComment((v, "G
21130 52 4f 55 50 20 42 59 20 73 6f 72 74 22 29 29 3b  ROUP BY sort"));
21140 0a 20 20 20 20 20 20 20 20 73 41 67 67 49 6e 66  .        sAggInf
21150 6f 2e 75 73 65 53 6f 72 74 69 6e 67 49 64 78 20  o.useSortingIdx 
21160 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20  = 1;.      }..  
21170 20 20 20 20 2f 2a 20 45 76 61 6c 75 61 74 65 20      /* Evaluate 
21180 74 68 65 20 63 75 72 72 65 6e 74 20 47 52 4f 55  the current GROU
21190 50 20 42 59 20 74 65 72 6d 73 20 61 6e 64 20 73  P BY terms and s
211a0 74 6f 72 65 20 69 6e 20 62 30 2c 20 62 31 2c 20  tore in b0, b1, 
211b0 62 32 2e 2e 2e 0a 20 20 20 20 20 20 2a 2a 20 28  b2....      ** (
211c0 62 30 20 69 73 20 6d 65 6d 6f 72 79 20 6c 6f 63  b0 is memory loc
211d0 61 74 69 6f 6e 20 69 42 4d 65 6d 2b 30 2c 20 62  ation iBMem+0, b
211e0 31 20 69 73 20 69 42 4d 65 6d 2b 31 2c 20 61 6e  1 is iBMem+1, an
211f0 64 20 73 6f 20 66 6f 72 74 68 29 0a 20 20 20 20  d so forth).    
21200 20 20 2a 2a 20 54 68 65 6e 20 63 6f 6d 70 61 72    ** Then compar
21210 65 20 74 68 65 20 63 75 72 72 65 6e 74 20 47 52  e the current GR
21220 4f 55 50 20 42 59 20 74 65 72 6d 73 20 61 67 61  OUP BY terms aga
21230 69 6e 73 74 20 74 68 65 20 47 52 4f 55 50 20 42  inst the GROUP B
21240 59 20 74 65 72 6d 73 0a 20 20 20 20 20 20 2a 2a  Y terms.      **
21250 20 66 72 6f 6d 20 74 68 65 20 70 72 65 76 69 6f   from the previo
21260 75 73 20 72 6f 77 20 63 75 72 72 65 6e 74 6c 79  us row currently
21270 20 73 74 6f 72 65 64 20 69 6e 20 61 30 2c 20 61   stored in a0, a
21280 31 2c 20 61 32 2e 2e 2e 0a 20 20 20 20 20 20 2a  1, a2....      *
21290 2f 0a 20 20 20 20 20 20 61 64 64 72 54 6f 70 4f  /.      addrTopO
212a0 66 4c 6f 6f 70 20 3d 20 73 71 6c 69 74 65 33 56  fLoop = sqlite3V
212b0 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76  dbeCurrentAddr(v
212c0 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d 30  );.      for(j=0
212d0 3b 20 6a 3c 70 47 72 6f 75 70 42 79 2d 3e 6e 45  ; j<pGroupBy->nE
212e0 78 70 72 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20  xpr; j++){.     
212f0 20 20 20 69 66 28 20 67 72 6f 75 70 42 79 53 6f     if( groupBySo
21300 72 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  rt ){.          
21310 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
21320 33 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20  3(v, OP_Column, 
21330 73 41 67 67 49 6e 66 6f 2e 73 6f 72 74 69 6e 67  sAggInfo.sorting
21340 49 64 78 2c 20 6a 2c 20 69 42 4d 65 6d 2b 6a 29  Idx, j, iBMem+j)
21350 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  ;.        }else{
21360 0a 20 20 20 20 20 20 20 20 20 20 73 41 67 67 49  .          sAggI
21370 6e 66 6f 2e 64 69 72 65 63 74 4d 6f 64 65 20 3d  nfo.directMode =
21380 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71   1;.          sq
21390 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28 70 50  lite3ExprCode(pP
213a0 61 72 73 65 2c 20 70 47 72 6f 75 70 42 79 2d 3e  arse, pGroupBy->
213b0 61 5b 6a 5d 2e 70 45 78 70 72 2c 20 69 42 4d 65  a[j].pExpr, iBMe
213c0 6d 2b 6a 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  m+j);.        }.
213d0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71        }.      sq
213e0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28  lite3VdbeAddOp4(
213f0 76 2c 20 4f 50 5f 43 6f 6d 70 61 72 65 2c 20 69  v, OP_Compare, i
21400 41 4d 65 6d 2c 20 69 42 4d 65 6d 2c 20 70 47 72  AMem, iBMem, pGr
21410 6f 75 70 42 79 2d 3e 6e 45 78 70 72 2c 0a 20 20  oupBy->nExpr,.  
21420 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21430 20 20 20 20 20 20 20 20 28 63 68 61 72 2a 29 70          (char*)p
21440 4b 65 79 49 6e 66 6f 2c 20 50 34 5f 4b 45 59 49  KeyInfo, P4_KEYI
21450 4e 46 4f 29 3b 0a 20 20 20 20 20 20 6a 31 20 3d  NFO);.      j1 =
21460 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72   sqlite3VdbeCurr
21470 65 6e 74 41 64 64 72 28 76 29 3b 0a 20 20 20 20  entAddr(v);.    
21480 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
21490 4f 70 33 28 76 2c 20 4f 50 5f 4a 75 6d 70 2c 20  Op3(v, OP_Jump, 
214a0 6a 31 2b 31 2c 20 30 2c 20 6a 31 2b 31 29 3b 0a  j1+1, 0, j1+1);.
214b0 0a 20 20 20 20 20 20 2f 2a 20 47 65 6e 65 72 61  .      /* Genera
214c0 74 65 20 63 6f 64 65 20 74 68 61 74 20 72 75 6e  te code that run
214d0 73 20 77 68 65 6e 65 76 65 72 20 74 68 65 20 47  s whenever the G
214e0 52 4f 55 50 20 42 59 20 63 68 61 6e 67 65 73 2e  ROUP BY changes.
214f0 0a 20 20 20 20 20 20 2a 2a 20 43 68 61 6e 67 65  .      ** Change
21500 73 20 69 6e 20 74 68 65 20 47 52 4f 55 50 20 42  s in the GROUP B
21510 59 20 61 72 65 20 64 65 74 65 63 74 65 64 20 62  Y are detected b
21520 79 20 74 68 65 20 70 72 65 76 69 6f 75 73 20 63  y the previous c
21530 6f 64 65 0a 20 20 20 20 20 20 2a 2a 20 62 6c 6f  ode.      ** blo
21540 63 6b 2e 20 20 49 66 20 74 68 65 72 65 20 77 65  ck.  If there we
21550 72 65 20 6e 6f 20 63 68 61 6e 67 65 73 2c 20 74  re no changes, t
21560 68 69 73 20 62 6c 6f 63 6b 20 69 73 20 73 6b 69  his block is ski
21570 70 70 65 64 2e 0a 20 20 20 20 20 20 2a 2a 0a 20  pped..      **. 
21580 20 20 20 20 20 2a 2a 20 54 68 69 73 20 63 6f 64       ** This cod
21590 65 20 63 6f 70 69 65 73 20 63 75 72 72 65 6e 74  e copies current
215a0 20 67 72 6f 75 70 20 62 79 20 74 65 72 6d 73 20   group by terms 
215b0 69 6e 20 62 30 2c 62 31 2c 62 32 2c 2e 2e 2e 0a  in b0,b1,b2,....
215c0 20 20 20 20 20 20 2a 2a 20 6f 76 65 72 20 74 6f        ** over to
215d0 20 61 30 2c 61 31 2c 61 32 2e 20 20 49 74 20 74   a0,a1,a2.  It t
215e0 68 65 6e 20 63 61 6c 6c 73 20 74 68 65 20 6f 75  hen calls the ou
215f0 74 70 75 74 20 73 75 62 72 6f 75 74 69 6e 65 0a  tput subroutine.
21600 20 20 20 20 20 20 2a 2a 20 61 6e 64 20 72 65 73        ** and res
21610 65 74 73 20 74 68 65 20 61 67 67 72 65 67 61 74  ets the aggregat
21620 65 20 61 63 63 75 6d 75 6c 61 74 6f 72 20 72 65  e accumulator re
21630 67 69 73 74 65 72 73 20 69 6e 20 70 72 65 70 61  gisters in prepa
21640 72 61 74 69 6f 6e 0a 20 20 20 20 20 20 2a 2a 20  ration.      ** 
21650 66 6f 72 20 74 68 65 20 6e 65 78 74 20 47 52 4f  for the next GRO
21660 55 50 20 42 59 20 62 61 74 63 68 2e 0a 20 20 20  UP BY batch..   
21670 20 20 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69     */.      sqli
21680 74 65 33 45 78 70 72 43 6f 64 65 4d 6f 76 65 28  te3ExprCodeMove(
21690 70 50 61 72 73 65 2c 20 69 42 4d 65 6d 2c 20 69  pParse, iBMem, i
216a0 41 4d 65 6d 2c 20 70 47 72 6f 75 70 42 79 2d 3e  AMem, pGroupBy->
216b0 6e 45 78 70 72 29 3b 0a 20 20 20 20 20 20 73 71  nExpr);.      sq
216c0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
216d0 76 2c 20 4f 50 5f 47 6f 73 75 62 2c 20 72 65 67  v, OP_Gosub, reg
216e0 4f 75 74 70 75 74 52 6f 77 2c 20 61 64 64 72 4f  OutputRow, addrO
216f0 75 74 70 75 74 52 6f 77 29 3b 0a 20 20 20 20 20  utputRow);.     
21700 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c   VdbeComment((v,
21710 20 22 6f 75 74 70 75 74 20 6f 6e 65 20 72 6f 77   "output one row
21720 22 29 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  "));.      sqlit
21730 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
21740 4f 50 5f 49 66 50 6f 73 2c 20 69 41 62 6f 72 74  OP_IfPos, iAbort
21750 46 6c 61 67 2c 20 61 64 64 72 45 6e 64 29 3b 0a  Flag, addrEnd);.
21760 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e        VdbeCommen
21770 74 28 28 76 2c 20 22 63 68 65 63 6b 20 61 62 6f  t((v, "check abo
21780 72 74 20 66 6c 61 67 22 29 29 3b 0a 20 20 20 20  rt flag"));.    
21790 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
217a0 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 73 75 62 2c  Op2(v, OP_Gosub,
217b0 20 72 65 67 52 65 73 65 74 2c 20 61 64 64 72 52   regReset, addrR
217c0 65 73 65 74 29 3b 0a 20 20 20 20 20 20 56 64 62  eset);.      Vdb
217d0 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 72 65  eComment((v, "re
217e0 73 65 74 20 61 63 63 75 6d 75 6c 61 74 6f 72 22  set accumulator"
217f0 29 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 55 70  ));..      /* Up
21800 64 61 74 65 20 74 68 65 20 61 67 67 72 65 67 61  date the aggrega
21810 74 65 20 61 63 63 75 6d 75 6c 61 74 6f 72 73 20  te accumulators 
21820 62 61 73 65 64 20 6f 6e 20 74 68 65 20 63 6f 6e  based on the con
21830 74 65 6e 74 20 6f 66 0a 20 20 20 20 20 20 2a 2a  tent of.      **
21840 20 74 68 65 20 63 75 72 72 65 6e 74 20 72 6f 77   the current row
21850 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
21860 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48  sqlite3VdbeJumpH
21870 65 72 65 28 76 2c 20 6a 31 29 3b 0a 20 20 20 20  ere(v, j1);.    
21880 20 20 75 70 64 61 74 65 41 63 63 75 6d 75 6c 61    updateAccumula
21890 74 6f 72 28 70 50 61 72 73 65 2c 20 26 73 41 67  tor(pParse, &sAg
218a0 67 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20 73 71  gInfo);.      sq
218b0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
218c0 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 31  v, OP_Integer, 1
218d0 2c 20 69 55 73 65 46 6c 61 67 29 3b 0a 20 20 20  , iUseFlag);.   
218e0 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28     VdbeComment((
218f0 76 2c 20 22 69 6e 64 69 63 61 74 65 20 64 61 74  v, "indicate dat
21900 61 20 69 6e 20 61 63 63 75 6d 75 6c 61 74 6f 72  a in accumulator
21910 22 29 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 45  "));..      /* E
21920 6e 64 20 6f 66 20 74 68 65 20 6c 6f 6f 70 0a 20  nd of the loop. 
21930 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66       */.      if
21940 28 20 67 72 6f 75 70 42 79 53 6f 72 74 20 29 7b  ( groupBySort ){
21950 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
21960 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
21970 5f 4e 65 78 74 2c 20 73 41 67 67 49 6e 66 6f 2e  _Next, sAggInfo.
21980 73 6f 72 74 69 6e 67 49 64 78 2c 20 61 64 64 72  sortingIdx, addr
21990 54 6f 70 4f 66 4c 6f 6f 70 29 3b 0a 20 20 20 20  TopOfLoop);.    
219a0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
219b0 20 73 71 6c 69 74 65 33 57 68 65 72 65 45 6e 64   sqlite3WhereEnd
219c0 28 70 57 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20  (pWInfo);.      
219d0 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61    sqlite3VdbeCha
219e0 6e 67 65 54 6f 4e 6f 6f 70 28 76 2c 20 61 64 64  ngeToNoop(v, add
219f0 72 53 6f 72 74 69 6e 67 49 64 78 2c 20 31 29 3b  rSortingIdx, 1);
21a00 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20  .      }..      
21a10 2f 2a 20 4f 75 74 70 75 74 20 74 68 65 20 66 69  /* Output the fi
21a20 6e 61 6c 20 72 6f 77 20 6f 66 20 72 65 73 75 6c  nal row of resul
21a30 74 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  t.      */.     
21a40 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
21a50 70 32 28 76 2c 20 4f 50 5f 47 6f 73 75 62 2c 20  p2(v, OP_Gosub, 
21a60 72 65 67 4f 75 74 70 75 74 52 6f 77 2c 20 61 64  regOutputRow, ad
21a70 64 72 4f 75 74 70 75 74 52 6f 77 29 3b 0a 20 20  drOutputRow);.  
21a80 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28      VdbeComment(
21a90 28 76 2c 20 22 6f 75 74 70 75 74 20 66 69 6e 61  (v, "output fina
21aa0 6c 20 72 6f 77 22 29 29 3b 0a 20 20 20 20 20 20  l row"));.      
21ab0 0a 20 20 20 20 7d 20 2f 2a 20 65 6e 64 69 66 20  .    } /* endif 
21ac0 70 47 72 6f 75 70 42 79 20 2a 2f 0a 20 20 20 20  pGroupBy */.    
21ad0 65 6c 73 65 20 7b 0a 20 20 20 20 20 20 45 78 70  else {.      Exp
21ae0 72 4c 69 73 74 20 2a 70 4d 69 6e 4d 61 78 20 3d  rList *pMinMax =
21af0 20 30 3b 0a 20 20 20 20 20 20 45 78 70 72 4c 69   0;.      ExprLi
21b00 73 74 20 2a 70 44 65 6c 20 3d 20 30 3b 0a 20 20  st *pDel = 0;.  
21b10 20 20 20 20 75 38 20 66 6c 61 67 3b 0a 0a 20 20      u8 flag;..  
21b20 20 20 20 20 2f 2a 20 43 68 65 63 6b 20 69 66 20      /* Check if 
21b30 74 68 65 20 71 75 65 72 79 20 69 73 20 6f 66 20  the query is of 
21b40 6f 6e 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f  one of the follo
21b50 77 69 6e 67 20 66 6f 72 6d 73 3a 0a 20 20 20 20  wing forms:.    
21b60 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 20 20    **.      **   
21b70 53 45 4c 45 43 54 20 6d 69 6e 28 78 29 20 46 52  SELECT min(x) FR
21b80 4f 4d 20 2e 2e 2e 0a 20 20 20 20 20 20 2a 2a 20  OM ....      ** 
21b90 20 20 53 45 4c 45 43 54 20 6d 61 78 28 78 29 20    SELECT max(x) 
21ba0 46 52 4f 4d 20 2e 2e 2e 0a 20 20 20 20 20 20 2a  FROM ....      *
21bb0 2a 0a 20 20 20 20 20 20 2a 2a 20 49 66 20 69 74  *.      ** If it
21bc0 20 69 73 2c 20 74 68 65 6e 20 61 73 6b 20 74 68   is, then ask th
21bd0 65 20 63 6f 64 65 20 69 6e 20 77 68 65 72 65 2e  e code in where.
21be0 63 20 74 6f 20 61 74 74 65 6d 70 74 20 74 6f 20  c to attempt to 
21bf0 73 6f 72 74 20 72 65 73 75 6c 74 73 0a 20 20 20  sort results.   
21c00 20 20 20 2a 2a 20 61 73 20 69 66 20 74 68 65 72     ** as if ther
21c10 65 20 77 61 73 20 61 6e 20 22 4f 52 44 45 52 20  e was an "ORDER 
21c20 4f 4e 20 78 22 20 6f 72 20 22 4f 52 44 45 52 20  ON x" or "ORDER 
21c30 4f 4e 20 78 20 44 45 53 43 22 20 63 6c 61 75 73  ON x DESC" claus
21c40 65 2e 20 0a 20 20 20 20 20 20 2a 2a 20 49 66 20  e. .      ** If 
21c50 77 68 65 72 65 2e 63 20 69 73 20 61 62 6c 65 20  where.c is able 
21c60 74 6f 20 70 72 6f 64 75 63 65 20 72 65 73 75 6c  to produce resul
21c70 74 73 20 73 6f 72 74 65 64 20 69 6e 20 74 68 69  ts sorted in thi
21c80 73 20 6f 72 64 65 72 2c 20 74 68 65 6e 0a 20 20  s order, then.  
21c90 20 20 20 20 2a 2a 20 61 64 64 20 76 64 62 65 20      ** add vdbe 
21ca0 63 6f 64 65 20 74 6f 20 62 72 65 61 6b 20 6f 75  code to break ou
21cb0 74 20 6f 66 20 74 68 65 20 70 72 6f 63 65 73 73  t of the process
21cc0 69 6e 67 20 6c 6f 6f 70 20 61 66 74 65 72 20 74  ing loop after t
21cd0 68 65 20 0a 20 20 20 20 20 20 2a 2a 20 66 69 72  he .      ** fir
21ce0 73 74 20 69 74 65 72 61 74 69 6f 6e 20 28 73 69  st iteration (si
21cf0 6e 63 65 20 74 68 65 20 66 69 72 73 74 20 69 74  nce the first it
21d00 65 72 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 6c  eration of the l
21d10 6f 6f 70 20 69 73 20 0a 20 20 20 20 20 20 2a 2a  oop is .      **
21d20 20 67 75 61 72 61 6e 74 65 65 64 20 74 6f 20 6f   guaranteed to o
21d30 70 65 72 61 74 65 20 6f 6e 20 74 68 65 20 72 6f  perate on the ro
21d40 77 20 77 69 74 68 20 74 68 65 20 6d 69 6e 69 6d  w with the minim
21d50 75 6d 20 6f 72 20 6d 61 78 69 6d 75 6d 20 0a 20  um or maximum . 
21d60 20 20 20 20 20 2a 2a 20 76 61 6c 75 65 20 6f 66       ** value of
21d70 20 78 2c 20 74 68 65 20 6f 6e 6c 79 20 72 6f 77   x, the only row
21d80 20 72 65 71 75 69 72 65 64 29 2e 0a 20 20 20 20   required)..    
21d90 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 41 20    **.      ** A 
21da0 73 70 65 63 69 61 6c 20 66 6c 61 67 20 6d 75 73  special flag mus
21db0 74 20 62 65 20 70 61 73 73 65 64 20 74 6f 20 73  t be passed to s
21dc0 71 6c 69 74 65 33 57 68 65 72 65 42 65 67 69 6e  qlite3WhereBegin
21dd0 28 29 20 74 6f 20 73 6c 69 67 68 74 6c 79 0a 20  () to slightly. 
21de0 20 20 20 20 20 2a 2a 20 6d 6f 64 69 66 79 20 62       ** modify b
21df0 65 68 61 76 69 6f 75 72 20 61 73 20 66 6f 6c 6c  ehaviour as foll
21e00 6f 77 73 3a 0a 20 20 20 20 20 20 2a 2a 0a 20 20  ows:.      **.  
21e10 20 20 20 20 2a 2a 20 20 20 2b 20 49 66 20 74 68      **   + If th
21e20 65 20 71 75 65 72 79 20 69 73 20 61 20 22 53 45  e query is a "SE
21e30 4c 45 43 54 20 6d 69 6e 28 78 29 22 2c 20 74 68  LECT min(x)", th
21e40 65 6e 20 74 68 65 20 6c 6f 6f 70 20 63 6f 64 65  en the loop code
21e50 64 20 62 79 0a 20 20 20 20 20 20 2a 2a 20 20 20  d by.      **   
21e60 20 20 77 68 65 72 65 2e 63 20 73 68 6f 75 6c 64    where.c should
21e70 20 6e 6f 74 20 69 74 65 72 61 74 65 20 6f 76 65   not iterate ove
21e80 72 20 61 6e 79 20 76 61 6c 75 65 73 20 77 69 74  r any values wit
21e90 68 20 61 20 4e 55 4c 4c 20 76 61 6c 75 65 0a 20  h a NULL value. 
21ea0 20 20 20 20 20 2a 2a 20 20 20 20 20 66 6f 72 20       **     for 
21eb0 78 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20  x..      **.    
21ec0 20 20 2a 2a 20 20 20 2b 20 54 68 65 20 6f 70 74    **   + The opt
21ed0 69 6d 69 7a 65 72 20 63 6f 64 65 20 69 6e 20 77  imizer code in w
21ee0 68 65 72 65 2e 63 20 28 74 68 65 20 74 68 69 6e  here.c (the thin
21ef0 67 20 74 68 61 74 20 64 65 63 69 64 65 73 20 77  g that decides w
21f00 68 69 63 68 0a 20 20 20 20 20 20 2a 2a 20 20 20  hich.      **   
21f10 20 20 69 6e 64 65 78 20 6f 72 20 69 6e 64 69 63    index or indic
21f20 65 73 20 74 6f 20 75 73 65 29 20 73 68 6f 75 6c  es to use) shoul
21f30 64 20 70 6c 61 63 65 20 61 20 64 69 66 66 65 72  d place a differ
21f40 65 6e 74 20 70 72 69 6f 72 69 74 79 20 6f 6e 20  ent priority on 
21f50 0a 20 20 20 20 20 20 2a 2a 20 20 20 20 20 73 61  .      **     sa
21f60 74 69 73 66 79 69 6e 67 20 74 68 65 20 27 4f 52  tisfying the 'OR
21f70 44 45 52 20 42 59 27 20 63 6c 61 75 73 65 20 74  DER BY' clause t
21f80 68 61 6e 20 69 74 20 64 6f 65 73 20 69 6e 20 6f  han it does in o
21f90 74 68 65 72 20 63 61 73 65 73 2e 0a 20 20 20 20  ther cases..    
21fa0 20 20 2a 2a 20 20 20 20 20 52 65 66 65 72 20 74    **     Refer t
21fb0 6f 20 63 6f 64 65 20 61 6e 64 20 63 6f 6d 6d 65  o code and comme
21fc0 6e 74 73 20 69 6e 20 77 68 65 72 65 2e 63 20 66  nts in where.c f
21fd0 6f 72 20 64 65 74 61 69 6c 73 2e 0a 20 20 20 20  or details..    
21fe0 20 20 2a 2f 0a 20 20 20 20 20 20 66 6c 61 67 20    */.      flag 
21ff0 3d 20 6d 69 6e 4d 61 78 51 75 65 72 79 28 70 50  = minMaxQuery(pP
22000 61 72 73 65 2c 20 70 29 3b 0a 20 20 20 20 20 20  arse, p);.      
22010 69 66 28 20 66 6c 61 67 20 29 7b 0a 20 20 20 20  if( flag ){.    
22020 20 20 20 20 70 44 65 6c 20 3d 20 70 4d 69 6e 4d      pDel = pMinM
22030 61 78 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  ax = sqlite3Expr
22040 4c 69 73 74 44 75 70 28 64 62 2c 20 70 2d 3e 70  ListDup(db, p->p
22050 45 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70  EList->a[0].pExp
22060 72 2d 3e 70 4c 69 73 74 29 3b 0a 20 20 20 20 20  r->pList);.     
22070 20 20 20 69 66 28 20 70 4d 69 6e 4d 61 78 20 26     if( pMinMax &
22080 26 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  & !db->mallocFai
22090 6c 65 64 20 29 7b 0a 20 20 20 20 20 20 20 20 20  led ){.         
220a0 20 70 4d 69 6e 4d 61 78 2d 3e 61 5b 30 5d 2e 73   pMinMax->a[0].s
220b0 6f 72 74 4f 72 64 65 72 20 3d 20 28 28 66 6c 61  ortOrder = ((fla
220c0 67 3d 3d 57 48 45 52 45 5f 4f 52 44 45 52 42 59  g==WHERE_ORDERBY
220d0 5f 4d 49 4e 29 3f 30 3a 31 29 3b 0a 20 20 20 20  _MIN)?0:1);.    
220e0 20 20 20 20 20 20 70 4d 69 6e 4d 61 78 2d 3e 61        pMinMax->a
220f0 5b 30 5d 2e 70 45 78 70 72 2d 3e 6f 70 20 3d 20  [0].pExpr->op = 
22100 54 4b 5f 43 4f 4c 55 4d 4e 3b 0a 20 20 20 20 20  TK_COLUMN;.     
22110 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 0a 20 20     }.      }..  
22120 20 20 20 20 2f 2a 20 54 68 69 73 20 63 61 73 65      /* This case
22130 20 72 75 6e 73 20 69 66 20 74 68 65 20 61 67 67   runs if the agg
22140 72 65 67 61 74 65 20 68 61 73 20 6e 6f 20 47 52  regate has no GR
22150 4f 55 50 20 42 59 20 63 6c 61 75 73 65 2e 20 20  OUP BY clause.  
22160 54 68 65 0a 20 20 20 20 20 20 2a 2a 20 70 72 6f  The.      ** pro
22170 63 65 73 73 69 6e 67 20 69 73 20 6d 75 63 68 20  cessing is much 
22180 73 69 6d 70 6c 65 72 20 73 69 6e 63 65 20 74 68  simpler since th
22190 65 72 65 20 69 73 20 6f 6e 6c 79 20 61 20 73 69  ere is only a si
221a0 6e 67 6c 65 20 72 6f 77 0a 20 20 20 20 20 20 2a  ngle row.      *
221b0 2a 20 6f 66 20 6f 75 74 70 75 74 2e 0a 20 20 20  * of output..   
221c0 20 20 20 2a 2f 0a 20 20 20 20 20 20 72 65 73 65     */.      rese
221d0 74 41 63 63 75 6d 75 6c 61 74 6f 72 28 70 50 61  tAccumulator(pPa
221e0 72 73 65 2c 20 26 73 41 67 67 49 6e 66 6f 29 3b  rse, &sAggInfo);
221f0 0a 20 20 20 20 20 20 70 57 49 6e 66 6f 20 3d 20  .      pWInfo = 
22200 73 71 6c 69 74 65 33 57 68 65 72 65 42 65 67 69  sqlite3WhereBegi
22210 6e 28 70 50 61 72 73 65 2c 20 70 54 61 62 4c 69  n(pParse, pTabLi
22220 73 74 2c 20 70 57 68 65 72 65 2c 20 26 70 4d 69  st, pWhere, &pMi
22230 6e 4d 61 78 2c 20 66 6c 61 67 29 3b 0a 20 20 20  nMax, flag);.   
22240 20 20 20 69 66 28 20 70 57 49 6e 66 6f 3d 3d 30     if( pWInfo==0
22250 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
22260 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74  te3ExprListDelet
22270 65 28 70 44 65 6c 29 3b 0a 20 20 20 20 20 20 20  e(pDel);.       
22280 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64   goto select_end
22290 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
222a0 75 70 64 61 74 65 41 63 63 75 6d 75 6c 61 74 6f  updateAccumulato
222b0 72 28 70 50 61 72 73 65 2c 20 26 73 41 67 67 49  r(pParse, &sAggI
222c0 6e 66 6f 29 3b 0a 20 20 20 20 20 20 69 66 28 20  nfo);.      if( 
222d0 21 70 4d 69 6e 4d 61 78 20 26 26 20 66 6c 61 67  !pMinMax && flag
222e0 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
222f0 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
22300 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 70 57 49   OP_Goto, 0, pWI
22310 6e 66 6f 2d 3e 69 42 72 65 61 6b 29 3b 0a 20 20  nfo->iBreak);.  
22320 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e        VdbeCommen
22330 74 28 28 76 2c 20 22 25 73 28 29 20 62 79 20 69  t((v, "%s() by i
22340 6e 64 65 78 22 2c 28 66 6c 61 67 3d 3d 57 48 45  ndex",(flag==WHE
22350 52 45 5f 4f 52 44 45 52 42 59 5f 4d 49 4e 3f 22  RE_ORDERBY_MIN?"
22360 6d 69 6e 22 3a 22 6d 61 78 22 29 29 29 3b 0a 20  min":"max")));. 
22370 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c       }.      sql
22380 69 74 65 33 57 68 65 72 65 45 6e 64 28 70 57 49  ite3WhereEnd(pWI
22390 6e 66 6f 29 3b 0a 20 20 20 20 20 20 66 69 6e 61  nfo);.      fina
223a0 6c 69 7a 65 41 67 67 46 75 6e 63 74 69 6f 6e 73  lizeAggFunctions
223b0 28 70 50 61 72 73 65 2c 20 26 73 41 67 67 49 6e  (pParse, &sAggIn
223c0 66 6f 29 3b 0a 20 20 20 20 20 20 70 4f 72 64 65  fo);.      pOrde
223d0 72 42 79 20 3d 20 30 3b 0a 20 20 20 20 20 20 69  rBy = 0;.      i
223e0 66 28 20 70 48 61 76 69 6e 67 20 29 7b 0a 20 20  f( pHaving ){.  
223f0 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
22400 72 49 66 46 61 6c 73 65 28 70 50 61 72 73 65 2c  rIfFalse(pParse,
22410 20 70 48 61 76 69 6e 67 2c 20 61 64 64 72 45 6e   pHaving, addrEn
22420 64 2c 20 53 51 4c 49 54 45 5f 4a 55 4d 50 49 46  d, SQLITE_JUMPIF
22430 4e 55 4c 4c 29 3b 0a 20 20 20 20 20 20 7d 0a 20  NULL);.      }. 
22440 20 20 20 20 20 73 65 6c 65 63 74 49 6e 6e 65 72       selectInner
22450 4c 6f 6f 70 28 70 50 61 72 73 65 2c 20 70 2c 20  Loop(pParse, p, 
22460 70 2d 3e 70 45 4c 69 73 74 2c 20 30 2c 20 30 2c  p->pEList, 0, 0,
22470 20 30 2c 20 2d 31 2c 20 0a 20 20 20 20 20 20 20   0, -1, .       
22480 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
22490 44 65 73 74 2c 20 61 64 64 72 45 6e 64 2c 20 61  Dest, addrEnd, a
224a0 64 64 72 45 6e 64 2c 20 61 66 66 29 3b 0a 0a 20  ddrEnd, aff);.. 
224b0 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
224c0 4c 69 73 74 44 65 6c 65 74 65 28 70 44 65 6c 29  ListDelete(pDel)
224d0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  ;.    }.    sqli
224e0 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61  te3VdbeResolveLa
224f0 62 65 6c 28 76 2c 20 61 64 64 72 45 6e 64 29 3b  bel(v, addrEnd);
22500 0a 20 20 20 20 0a 20 20 7d 20 2f 2a 20 65 6e 64  .    .  } /* end
22510 69 66 20 61 67 67 72 65 67 61 74 65 20 71 75 65  if aggregate que
22520 72 79 20 2a 2f 0a 0a 20 20 2f 2a 20 49 66 20 74  ry */..  /* If t
22530 68 65 72 65 20 69 73 20 61 6e 20 4f 52 44 45 52  here is an ORDER
22540 20 42 59 20 63 6c 61 75 73 65 2c 20 74 68 65 6e   BY clause, then
22550 20 77 65 20 6e 65 65 64 20 74 6f 20 73 6f 72 74   we need to sort
22560 20 74 68 65 20 72 65 73 75 6c 74 73 0a 20 20 2a   the results.  *
22570 2a 20 61 6e 64 20 73 65 6e 64 20 74 68 65 6d 20  * and send them 
22580 74 6f 20 74 68 65 20 63 61 6c 6c 62 61 63 6b 20  to the callback 
22590 6f 6e 65 20 62 79 20 6f 6e 65 2e 0a 20 20 2a 2f  one by one..  */
225a0 0a 20 20 69 66 28 20 70 4f 72 64 65 72 42 79 20  .  if( pOrderBy 
225b0 29 7b 0a 20 20 20 20 67 65 6e 65 72 61 74 65 53  ){.    generateS
225c0 6f 72 74 54 61 69 6c 28 70 50 61 72 73 65 2c 20  ortTail(pParse, 
225d0 70 2c 20 76 2c 20 70 45 4c 69 73 74 2d 3e 6e 45  p, v, pEList->nE
225e0 78 70 72 2c 20 70 44 65 73 74 29 3b 0a 20 20 7d  xpr, pDest);.  }
225f0 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
22600 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 20  _OMIT_SUBQUERY. 
22610 20 2f 2a 20 49 66 20 74 68 69 73 20 77 61 73 20   /* If this was 
22620 61 20 73 75 62 71 75 65 72 79 2c 20 77 65 20 68  a subquery, we h
22630 61 76 65 20 6e 6f 77 20 63 6f 6e 76 65 72 74 65  ave now converte
22640 64 20 74 68 65 20 73 75 62 71 75 65 72 79 20 69  d the subquery i
22650 6e 74 6f 20 61 0a 20 20 2a 2a 20 74 65 6d 70 6f  nto a.  ** tempo
22660 72 61 72 79 20 74 61 62 6c 65 2e 20 20 53 6f 20  rary table.  So 
22670 73 65 74 20 74 68 65 20 53 72 63 4c 69 73 74 5f  set the SrcList_
22680 69 74 65 6d 2e 69 73 50 6f 70 75 6c 61 74 65 64  item.isPopulated
22690 20 66 6c 61 67 20 74 6f 20 70 72 65 76 65 6e 74   flag to prevent
226a0 0a 20 20 2a 2a 20 74 68 69 73 20 73 75 62 71 75  .  ** this subqu
226b0 65 72 79 20 66 72 6f 6d 20 62 65 69 6e 67 20 65  ery from being e
226c0 76 61 6c 75 61 74 65 64 20 61 67 61 69 6e 20 61  valuated again a
226d0 6e 64 20 74 6f 20 66 6f 72 63 65 20 74 68 65 20  nd to force the 
226e0 75 73 65 20 6f 66 0a 20 20 2a 2a 20 74 68 65 20  use of.  ** the 
226f0 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 2e  temporary table.
22700 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 50 61 72  .  */.  if( pPar
22710 65 6e 74 20 29 7b 0a 20 20 20 20 61 73 73 65 72  ent ){.    asser
22720 74 28 20 70 50 61 72 65 6e 74 2d 3e 70 53 72 63  t( pParent->pSrc
22730 2d 3e 6e 53 72 63 3e 70 61 72 65 6e 74 54 61 62  ->nSrc>parentTab
22740 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
22750 70 50 61 72 65 6e 74 2d 3e 70 53 72 63 2d 3e 61  pParent->pSrc->a
22760 5b 70 61 72 65 6e 74 54 61 62 5d 2e 70 53 65 6c  [parentTab].pSel
22770 65 63 74 3d 3d 70 20 29 3b 0a 20 20 20 20 70 50  ect==p );.    pP
22780 61 72 65 6e 74 2d 3e 70 53 72 63 2d 3e 61 5b 70  arent->pSrc->a[p
22790 61 72 65 6e 74 54 61 62 5d 2e 69 73 50 6f 70 75  arentTab].isPopu
227a0 6c 61 74 65 64 20 3d 20 31 3b 0a 20 20 7d 0a 23  lated = 1;.  }.#
227b0 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 4a 75 6d 70  endif..  /* Jump
227c0 20 68 65 72 65 20 74 6f 20 73 6b 69 70 20 74 68   here to skip th
227d0 69 73 20 71 75 65 72 79 0a 20 20 2a 2f 0a 20 20  is query.  */.  
227e0 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c  sqlite3VdbeResol
227f0 76 65 4c 61 62 65 6c 28 76 2c 20 69 45 6e 64 29  veLabel(v, iEnd)
22800 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 53 45 4c 45  ;..  /* The SELE
22810 43 54 20 77 61 73 20 73 75 63 63 65 73 73 66 75  CT was successfu
22820 6c 6c 79 20 63 6f 64 65 64 2e 20 20 20 53 65 74  lly coded.   Set
22830 20 74 68 65 20 72 65 74 75 72 6e 20 63 6f 64 65   the return code
22840 20 74 6f 20 30 0a 20 20 2a 2a 20 74 6f 20 69 6e   to 0.  ** to in
22850 64 69 63 61 74 65 20 6e 6f 20 65 72 72 6f 72 73  dicate no errors
22860 2e 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20 30 3b  ..  */.  rc = 0;
22870 0a 0a 20 20 2f 2a 20 43 6f 6e 74 72 6f 6c 20 6a  ..  /* Control j
22880 75 6d 70 73 20 74 6f 20 68 65 72 65 20 69 66 20  umps to here if 
22890 61 6e 20 65 72 72 6f 72 20 69 73 20 65 6e 63 6f  an error is enco
228a0 75 6e 74 65 72 65 64 20 61 62 6f 76 65 2c 20 6f  untered above, o
228b0 72 20 75 70 6f 6e 0a 20 20 2a 2a 20 73 75 63 63  r upon.  ** succ
228c0 65 73 73 66 75 6c 20 63 6f 64 69 6e 67 20 6f 66  essful coding of
228d0 20 74 68 65 20 53 45 4c 45 43 54 2e 0a 20 20 2a   the SELECT..  *
228e0 2f 0a 73 65 6c 65 63 74 5f 65 6e 64 3a 0a 0a 20  /.select_end:.. 
228f0 20 2f 2a 20 49 64 65 6e 74 69 66 79 20 63 6f 6c   /* Identify col
22900 75 6d 6e 20 6e 61 6d 65 73 20 69 66 20 77 65 20  umn names if we 
22910 77 69 6c 6c 20 62 65 20 75 73 69 6e 67 20 74 68  will be using th
22920 65 6d 20 69 6e 20 61 20 63 61 6c 6c 62 61 63 6b  em in a callback
22930 2e 20 20 54 68 69 73 0a 20 20 2a 2a 20 73 74 65  .  This.  ** ste
22940 70 20 69 73 20 73 6b 69 70 70 65 64 20 69 66 20  p is skipped if 
22950 74 68 65 20 6f 75 74 70 75 74 20 69 73 20 67 6f  the output is go
22960 69 6e 67 20 74 6f 20 73 6f 6d 65 20 6f 74 68 65  ing to some othe
22970 72 20 64 65 73 74 69 6e 61 74 69 6f 6e 2e 0a 20  r destination.. 
22980 20 2a 2f 0a 20 20 69 66 28 20 72 63 3d 3d 53 51   */.  if( rc==SQ
22990 4c 49 54 45 5f 4f 4b 20 26 26 20 70 44 65 73 74  LITE_OK && pDest
229a0 2d 3e 65 44 65 73 74 3d 3d 53 52 54 5f 43 61 6c  ->eDest==SRT_Cal
229b0 6c 62 61 63 6b 20 29 7b 0a 20 20 20 20 67 65 6e  lback ){.    gen
229c0 65 72 61 74 65 43 6f 6c 75 6d 6e 4e 61 6d 65 73  erateColumnNames
229d0 28 70 50 61 72 73 65 2c 20 70 54 61 62 4c 69 73  (pParse, pTabLis
229e0 74 2c 20 70 45 4c 69 73 74 29 3b 0a 20 20 7d 0a  t, pEList);.  }.
229f0 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28  .  sqlite3_free(
22a00 73 41 67 67 49 6e 66 6f 2e 61 43 6f 6c 29 3b 0a  sAggInfo.aCol);.
22a10 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 73    sqlite3_free(s
22a20 41 67 67 49 6e 66 6f 2e 61 46 75 6e 63 29 3b 0a  AggInfo.aFunc);.
22a30 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
22a40 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49  #if defined(SQLI
22a50 54 45 5f 44 45 42 55 47 29 0a 2f 2a 0a 2a 2a 2a  TE_DEBUG)./*.***
22a60 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
22a70 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
22a80 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
22a90 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
22aa0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 20  ************.** 
22ab0 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 6f  The following co
22ac0 64 65 20 69 73 20 75 73 65 64 20 66 6f 72 20 74  de is used for t
22ad0 65 73 74 69 6e 67 20 61 6e 64 20 64 65 62 75 67  esting and debug
22ae0 67 69 6e 67 20 6f 6e 6c 79 2e 20 20 54 68 65 20  ging only.  The 
22af0 63 6f 64 65 0a 2a 2a 20 74 68 61 74 20 66 6f 6c  code.** that fol
22b00 6c 6f 77 73 20 64 6f 65 73 20 6e 6f 74 20 61 70  lows does not ap
22b10 70 65 61 72 20 69 6e 20 6e 6f 72 6d 61 6c 20 62  pear in normal b
22b20 75 69 6c 64 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  uilds..**.** The
22b30 73 65 20 72 6f 75 74 69 6e 65 73 20 61 72 65 20  se routines are 
22b40 75 73 65 64 20 74 6f 20 70 72 69 6e 74 20 6f 75  used to print ou
22b50 74 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66  t the content of
22b60 20 61 6c 6c 20 6f 72 20 70 61 72 74 20 6f 66 20   all or part of 
22b70 61 20 0a 2a 2a 20 70 61 72 73 65 20 73 74 72 75  a .** parse stru
22b80 63 74 75 72 65 73 20 73 75 63 68 20 61 73 20 53  ctures such as S
22b90 65 6c 65 63 74 20 6f 72 20 45 78 70 72 2e 20 20  elect or Expr.  
22ba0 53 75 63 68 20 70 72 69 6e 74 6f 75 74 73 20 61  Such printouts a
22bb0 72 65 20 75 73 65 66 75 6c 0a 2a 2a 20 66 6f 72  re useful.** for
22bc0 20 68 65 6c 70 69 6e 67 20 74 6f 20 75 6e 64 65   helping to unde
22bd0 72 73 74 61 6e 64 20 77 68 61 74 20 69 73 20 68  rstand what is h
22be0 61 70 70 65 6e 69 6e 67 20 69 6e 73 69 64 65 20  appening inside 
22bf0 74 68 65 20 63 6f 64 65 20 67 65 6e 65 72 61 74  the code generat
22c00 6f 72 0a 2a 2a 20 64 75 72 69 6e 67 20 74 68 65  or.** during the
22c10 20 65 78 65 63 75 74 69 6f 6e 20 6f 66 20 63 6f   execution of co
22c20 6d 70 6c 65 78 20 53 45 4c 45 43 54 20 73 74 61  mplex SELECT sta
22c30 74 65 6d 65 6e 74 73 2e 0a 2a 2a 0a 2a 2a 20 54  tements..**.** T
22c40 68 65 73 65 20 72 6f 75 74 69 6e 65 20 61 72 65  hese routine are
22c50 20 6e 6f 74 20 63 61 6c 6c 65 64 20 61 6e 79 77   not called anyw
22c60 68 65 72 65 20 66 72 6f 6d 20 77 69 74 68 69 6e  here from within
22c70 20 74 68 65 20 6e 6f 72 6d 61 6c 0a 2a 2a 20 63   the normal.** c
22c80 6f 64 65 20 62 61 73 65 2e 20 20 54 68 65 6e 20  ode base.  Then 
22c90 61 72 65 20 69 6e 74 65 6e 64 65 64 20 74 6f 20  are intended to 
22ca0 62 65 20 63 61 6c 6c 65 64 20 66 72 6f 6d 20 77  be called from w
22cb0 69 74 68 69 6e 20 74 68 65 20 64 65 62 75 67 67  ithin the debugg
22cc0 65 72 0a 2a 2a 20 6f 72 20 66 72 6f 6d 20 74 65  er.** or from te
22cd0 6d 70 6f 72 61 72 79 20 22 70 72 69 6e 74 66 22  mporary "printf"
22ce0 20 73 74 61 74 65 6d 65 6e 74 73 20 69 6e 73 65   statements inse
22cf0 72 74 65 64 20 66 6f 72 20 64 65 62 75 67 67 69  rted for debuggi
22d00 6e 67 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  ng..*/.void sqli
22d10 74 65 33 50 72 69 6e 74 45 78 70 72 28 45 78 70  te3PrintExpr(Exp
22d20 72 20 2a 70 29 7b 0a 20 20 69 66 28 20 70 2d 3e  r *p){.  if( p->
22d30 74 6f 6b 65 6e 2e 7a 20 26 26 20 70 2d 3e 74 6f  token.z && p->to
22d40 6b 65 6e 2e 6e 3e 30 20 29 7b 0a 20 20 20 20 73  ken.n>0 ){.    s
22d50 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74  qlite3DebugPrint
22d60 66 28 22 28 25 2e 2a 73 22 2c 20 70 2d 3e 74 6f  f("(%.*s", p->to
22d70 6b 65 6e 2e 6e 2c 20 70 2d 3e 74 6f 6b 65 6e 2e  ken.n, p->token.
22d80 7a 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  z);.  }else{.   
22d90 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69   sqlite3DebugPri
22da0 6e 74 66 28 22 28 25 64 22 2c 20 70 2d 3e 6f 70  ntf("(%d", p->op
22db0 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e  );.  }.  if( p->
22dc0 70 4c 65 66 74 20 29 7b 0a 20 20 20 20 73 71 6c  pLeft ){.    sql
22dd0 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28  ite3DebugPrintf(
22de0 22 20 22 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  " ");.    sqlite
22df0 33 50 72 69 6e 74 45 78 70 72 28 70 2d 3e 70 4c  3PrintExpr(p->pL
22e00 65 66 74 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  eft);.  }.  if( 
22e10 70 2d 3e 70 52 69 67 68 74 20 29 7b 0a 20 20 20  p->pRight ){.   
22e20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69   sqlite3DebugPri
22e30 6e 74 66 28 22 20 22 29 3b 0a 20 20 20 20 73 71  ntf(" ");.    sq
22e40 6c 69 74 65 33 50 72 69 6e 74 45 78 70 72 28 70  lite3PrintExpr(p
22e50 2d 3e 70 52 69 67 68 74 29 3b 0a 20 20 7d 0a 20  ->pRight);.  }. 
22e60 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69   sqlite3DebugPri
22e70 6e 74 66 28 22 29 22 29 3b 0a 7d 0a 76 6f 69 64  ntf(")");.}.void
22e80 20 73 71 6c 69 74 65 33 50 72 69 6e 74 45 78 70   sqlite3PrintExp
22e90 72 4c 69 73 74 28 45 78 70 72 4c 69 73 74 20 2a  rList(ExprList *
22ea0 70 4c 69 73 74 29 7b 0a 20 20 69 6e 74 20 69 3b  pList){.  int i;
22eb0 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4c  .  for(i=0; i<pL
22ec0 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29  ist->nExpr; i++)
22ed0 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 50 72 69  {.    sqlite3Pri
22ee0 6e 74 45 78 70 72 28 70 4c 69 73 74 2d 3e 61 5b  ntExpr(pList->a[
22ef0 69 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20 20 69  i].pExpr);.    i
22f00 66 28 20 69 3c 70 4c 69 73 74 2d 3e 6e 45 78 70  f( i<pList->nExp
22f10 72 2d 31 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  r-1 ){.      sql
22f20 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28  ite3DebugPrintf(
22f30 22 2c 20 22 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  ", ");.    }.  }
22f40 0a 7d 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 50  .}.void sqlite3P
22f50 72 69 6e 74 53 65 6c 65 63 74 28 53 65 6c 65 63  rintSelect(Selec
22f60 74 20 2a 70 2c 20 69 6e 74 20 69 6e 64 65 6e 74  t *p, int indent
22f70 29 7b 0a 20 20 73 71 6c 69 74 65 33 44 65 62 75  ){.  sqlite3Debu
22f80 67 50 72 69 6e 74 66 28 22 25 2a 73 53 45 4c 45  gPrintf("%*sSELE
22f90 43 54 28 25 70 29 20 22 2c 20 69 6e 64 65 6e 74  CT(%p) ", indent
22fa0 2c 20 22 22 2c 20 70 29 3b 0a 20 20 73 71 6c 69  , "", p);.  sqli
22fb0 74 65 33 50 72 69 6e 74 45 78 70 72 4c 69 73 74  te3PrintExprList
22fc0 28 70 2d 3e 70 45 4c 69 73 74 29 3b 0a 20 20 73  (p->pEList);.  s
22fd0 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74  qlite3DebugPrint
22fe0 66 28 22 5c 6e 22 29 3b 0a 20 20 69 66 28 20 70  f("\n");.  if( p
22ff0 2d 3e 70 53 72 63 20 29 7b 0a 20 20 20 20 63 68  ->pSrc ){.    ch
23000 61 72 20 2a 7a 50 72 65 66 69 78 3b 0a 20 20 20  ar *zPrefix;.   
23010 20 69 6e 74 20 69 3b 0a 20 20 20 20 7a 50 72 65   int i;.    zPre
23020 66 69 78 20 3d 20 22 46 52 4f 4d 22 3b 0a 20 20  fix = "FROM";.  
23030 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e    for(i=0; i<p->
23040 70 53 72 63 2d 3e 6e 53 72 63 3b 20 69 2b 2b 29  pSrc->nSrc; i++)
23050 7b 0a 20 20 20 20 20 20 73 74 72 75 63 74 20 53  {.      struct S
23060 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74  rcList_item *pIt
23070 65 6d 20 3d 20 26 70 2d 3e 70 53 72 63 2d 3e 61  em = &p->pSrc->a
23080 5b 69 5d 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  [i];.      sqlit
23090 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 25  e3DebugPrintf("%
230a0 2a 73 20 22 2c 20 69 6e 64 65 6e 74 2b 36 2c 20  *s ", indent+6, 
230b0 7a 50 72 65 66 69 78 29 3b 0a 20 20 20 20 20 20  zPrefix);.      
230c0 7a 50 72 65 66 69 78 20 3d 20 22 22 3b 0a 20 20  zPrefix = "";.  
230d0 20 20 20 20 69 66 28 20 70 49 74 65 6d 2d 3e 70      if( pItem->p
230e0 53 65 6c 65 63 74 20 29 7b 0a 20 20 20 20 20 20  Select ){.      
230f0 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72    sqlite3DebugPr
23100 69 6e 74 66 28 22 28 5c 6e 22 29 3b 0a 20 20 20  intf("(\n");.   
23110 20 20 20 20 20 73 71 6c 69 74 65 33 50 72 69 6e       sqlite3Prin
23120 74 53 65 6c 65 63 74 28 70 49 74 65 6d 2d 3e 70  tSelect(pItem->p
23130 53 65 6c 65 63 74 2c 20 69 6e 64 65 6e 74 2b 31  Select, indent+1
23140 30 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  0);.        sqli
23150 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22  te3DebugPrintf("
23160 25 2a 73 29 22 2c 20 69 6e 64 65 6e 74 2b 38 2c  %*s)", indent+8,
23170 20 22 22 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73   "");.      }els
23180 65 20 69 66 28 20 70 49 74 65 6d 2d 3e 7a 4e 61  e if( pItem->zNa
23190 6d 65 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  me ){.        sq
231a0 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66  lite3DebugPrintf
231b0 28 22 25 73 22 2c 20 70 49 74 65 6d 2d 3e 7a 4e  ("%s", pItem->zN
231c0 61 6d 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ame);.      }.  
231d0 20 20 20 20 69 66 28 20 70 49 74 65 6d 2d 3e 70      if( pItem->p
231e0 54 61 62 20 29 7b 0a 20 20 20 20 20 20 20 20 73  Tab ){.        s
231f0 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74  qlite3DebugPrint
23200 66 28 22 28 74 61 62 6c 65 3a 20 25 73 29 22 2c  f("(table: %s)",
23210 20 70 49 74 65 6d 2d 3e 70 54 61 62 2d 3e 7a 4e   pItem->pTab->zN
23220 61 6d 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ame);.      }.  
23230 20 20 20 20 69 66 28 20 70 49 74 65 6d 2d 3e 7a      if( pItem->z
23240 41 6c 69 61 73 20 29 7b 0a 20 20 20 20 20 20 20  Alias ){.       
23250 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69   sqlite3DebugPri
23260 6e 74 66 28 22 20 41 53 20 25 73 22 2c 20 70 49  ntf(" AS %s", pI
23270 74 65 6d 2d 3e 7a 41 6c 69 61 73 29 3b 0a 20 20  tem->zAlias);.  
23280 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
23290 69 3c 70 2d 3e 70 53 72 63 2d 3e 6e 53 72 63 2d  i<p->pSrc->nSrc-
232a0 31 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  1 ){.        sql
232b0 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28  ite3DebugPrintf(
232c0 22 2c 22 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ",");.      }.  
232d0 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67      sqlite3Debug
232e0 50 72 69 6e 74 66 28 22 5c 6e 22 29 3b 0a 20 20  Printf("\n");.  
232f0 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d    }.  }.  if( p-
23300 3e 70 57 68 65 72 65 20 29 7b 0a 20 20 20 20 73  >pWhere ){.    s
23310 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74  qlite3DebugPrint
23320 66 28 22 25 2a 73 20 57 48 45 52 45 20 22 2c 20  f("%*s WHERE ", 
23330 69 6e 64 65 6e 74 2c 20 22 22 29 3b 0a 20 20 20  indent, "");.   
23340 20 73 71 6c 69 74 65 33 50 72 69 6e 74 45 78 70   sqlite3PrintExp
23350 72 28 70 2d 3e 70 57 68 65 72 65 29 3b 0a 20 20  r(p->pWhere);.  
23360 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72    sqlite3DebugPr
23370 69 6e 74 66 28 22 5c 6e 22 29 3b 0a 20 20 7d 0a  intf("\n");.  }.
23380 20 20 69 66 28 20 70 2d 3e 70 47 72 6f 75 70 42    if( p->pGroupB
23390 79 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  y ){.    sqlite3
233a0 44 65 62 75 67 50 72 69 6e 74 66 28 22 25 2a 73  DebugPrintf("%*s
233b0 20 47 52 4f 55 50 20 42 59 20 22 2c 20 69 6e 64   GROUP BY ", ind
233c0 65 6e 74 2c 20 22 22 29 3b 0a 20 20 20 20 73 71  ent, "");.    sq
233d0 6c 69 74 65 33 50 72 69 6e 74 45 78 70 72 4c 69  lite3PrintExprLi
233e0 73 74 28 70 2d 3e 70 47 72 6f 75 70 42 79 29 3b  st(p->pGroupBy);
233f0 0a 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75  .    sqlite3Debu
23400 67 50 72 69 6e 74 66 28 22 5c 6e 22 29 3b 0a 20  gPrintf("\n");. 
23410 20 7d 0a 20 20 69 66 28 20 70 2d 3e 70 48 61 76   }.  if( p->pHav
23420 69 6e 67 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ing ){.    sqlit
23430 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 25  e3DebugPrintf("%
23440 2a 73 20 48 41 56 49 4e 47 20 22 2c 20 69 6e 64  *s HAVING ", ind
23450 65 6e 74 2c 20 22 22 29 3b 0a 20 20 20 20 73 71  ent, "");.    sq
23460 6c 69 74 65 33 50 72 69 6e 74 45 78 70 72 28 70  lite3PrintExpr(p
23470 2d 3e 70 48 61 76 69 6e 67 29 3b 0a 20 20 20 20  ->pHaving);.    
23480 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e  sqlite3DebugPrin
23490 74 66 28 22 5c 6e 22 29 3b 0a 20 20 7d 0a 20 20  tf("\n");.  }.  
234a0 69 66 28 20 70 2d 3e 70 4f 72 64 65 72 42 79 20  if( p->pOrderBy 
234b0 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 65  ){.    sqlite3De
234c0 62 75 67 50 72 69 6e 74 66 28 22 25 2a 73 20 4f  bugPrintf("%*s O
234d0 52 44 45 52 20 42 59 20 22 2c 20 69 6e 64 65 6e  RDER BY ", inden
234e0 74 2c 20 22 22 29 3b 0a 20 20 20 20 73 71 6c 69  t, "");.    sqli
234f0 74 65 33 50 72 69 6e 74 45 78 70 72 4c 69 73 74  te3PrintExprList
23500 28 70 2d 3e 70 4f 72 64 65 72 42 79 29 3b 0a 20  (p->pOrderBy);. 
23510 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50     sqlite3DebugP
23520 72 69 6e 74 66 28 22 5c 6e 22 29 3b 0a 20 20 7d  rintf("\n");.  }
23530 0a 7d 0a 2f 2a 20 45 6e 64 20 6f 66 20 74 68 65  .}./* End of the
23540 20 73 74 72 75 63 74 75 72 65 20 64 65 62 75 67   structure debug
23550 20 70 72 69 6e 74 69 6e 67 20 63 6f 64 65 0a 2a   printing code.*
23560 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
23570 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
23580 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
23590 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
235a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 23 65  ************/.#e
235b0 6e 64 69 66 20 2f 2a 20 64 65 66 69 6e 65 64 28  ndif /* defined(
235c0 53 51 4c 49 54 45 5f 54 45 53 54 29 20 7c 7c 20  SQLITE_TEST) || 
235d0 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 44  defined(SQLITE_D
235e0 45 42 55 47 29 20 2a 2f 0a                       EBUG) */.