/ Hex Artifact Content
Login

Artifact 0c887fe1a88ee40a11e71127f4e91a0d864508cd:


0000: 2f 2a 0a 2a 2a 20 32 30 30 31 20 53 65 70 74 65  /*.** 2001 Septe
0010: 6d 62 65 72 20 31 35 0a 2a 2a 0a 2a 2a 20 54 68  mber 15.**.** Th
0020: 65 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69  e author disclai
0030: 6d 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20  ms copyright to 
0040: 74 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65  this source code
0050: 2e 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a  .  In place of.*
0060: 2a 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65  * a legal notice
0070: 2c 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73  , here is a bles
0080: 73 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d  sing:.**.**    M
0090: 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61  ay you do good a
00a0: 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20  nd not evil..** 
00b0: 20 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20     May you find 
00c0: 66 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20  forgiveness for 
00d0: 79 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72  yourself and for
00e0: 67 69 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20  give others..** 
00f0: 20 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65     May you share
0100: 20 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74   freely, never t
0110: 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20  aking more than 
0120: 79 6f 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a  you give..**.***
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66  ******.** This f
0180: 69 6c 65 20 63 6f 6e 74 61 69 6e 73 20 43 20 63  ile contains C c
0190: 6f 64 65 20 72 6f 75 74 69 6e 65 73 20 74 68 61  ode routines tha
01a0: 74 20 61 72 65 20 63 61 6c 6c 65 64 20 62 79 20  t are called by 
01b0: 74 68 65 20 70 61 72 73 65 72 0a 2a 2a 20 74 6f  the parser.** to
01c0: 20 68 61 6e 64 6c 65 20 53 45 4c 45 43 54 20 73   handle SELECT s
01d0: 74 61 74 65 6d 65 6e 74 73 20 69 6e 20 53 51 4c  tatements in SQL
01e0: 69 74 65 2e 0a 2a 2a 0a 2a 2a 20 24 49 64 3a 20  ite..**.** $Id: 
01f0: 73 65 6c 65 63 74 2e 63 2c 76 20 31 2e 34 35 33  select.c,v 1.453
0200: 20 32 30 30 38 2f 30 37 2f 31 30 20 30 30 3a 33   2008/07/10 00:3
0210: 32 3a 34 32 20 64 72 68 20 45 78 70 20 24 0a 2a  2:42 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 20 3d  onst char *zSp =
11a0: 20 22 20 22 3b 0a 20 20 20 20 61 73 73 65 72 74   " ";.    assert
11b0: 28 20 70 42 21 3d 30 20 29 3b 0a 20 20 20 20 69  ( pB!=0 );.    i
11c0: 66 28 20 70 43 3d 3d 30 20 29 7b 20 7a 53 70 2b  f( pC==0 ){ zSp+
11d0: 2b 3b 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33  +; }.    sqlite3
11e0: 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
11f0: 20 22 75 6e 6b 6e 6f 77 6e 20 6f 72 20 75 6e 73   "unknown or uns
1200: 75 70 70 6f 72 74 65 64 20 6a 6f 69 6e 20 74 79  upported join ty
1210: 70 65 3a 20 22 0a 20 20 20 20 20 20 20 22 25 54  pe: ".       "%T
1220: 20 25 54 25 73 25 54 22 2c 20 70 41 2c 20 70 42   %T%s%T", pA, pB
1230: 2c 20 7a 53 70 2c 20 70 43 29 3b 0a 20 20 20 20  , zSp, pC);.    
1240: 6a 6f 69 6e 74 79 70 65 20 3d 20 4a 54 5f 49 4e  jointype = JT_IN
1250: 4e 45 52 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  NER;.  }else if(
1260: 20 6a 6f 69 6e 74 79 70 65 20 26 20 4a 54 5f 52   jointype & JT_R
1270: 49 47 48 54 20 29 7b 0a 20 20 20 20 73 71 6c 69  IGHT ){.    sqli
1280: 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
1290: 73 65 2c 20 0a 20 20 20 20 20 20 22 52 49 47 48  se, .      "RIGH
12a0: 54 20 61 6e 64 20 46 55 4c 4c 20 4f 55 54 45 52  T and FULL OUTER
12b0: 20 4a 4f 49 4e 73 20 61 72 65 20 6e 6f 74 20 63   JOINs are not c
12c0: 75 72 72 65 6e 74 6c 79 20 73 75 70 70 6f 72 74  urrently support
12d0: 65 64 22 29 3b 0a 20 20 20 20 6a 6f 69 6e 74 79  ed");.    jointy
12e0: 70 65 20 3d 20 4a 54 5f 49 4e 4e 45 52 3b 0a 20  pe = JT_INNER;. 
12f0: 20 7d 0a 20 20 72 65 74 75 72 6e 20 6a 6f 69 6e   }.  return join
1300: 74 79 70 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  type;.}../*.** R
1310: 65 74 75 72 6e 20 74 68 65 20 69 6e 64 65 78 20  eturn the index 
1320: 6f 66 20 61 20 63 6f 6c 75 6d 6e 20 69 6e 20 61  of a column in a
1330: 20 74 61 62 6c 65 2e 20 20 52 65 74 75 72 6e 20   table.  Return 
1340: 2d 31 20 69 66 20 74 68 65 20 63 6f 6c 75 6d 6e  -1 if the column
1350: 0a 2a 2a 20 69 73 20 6e 6f 74 20 63 6f 6e 74 61  .** is not conta
1360: 69 6e 65 64 20 69 6e 20 74 68 65 20 74 61 62 6c  ined in the tabl
1370: 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
1380: 20 63 6f 6c 75 6d 6e 49 6e 64 65 78 28 54 61 62   columnIndex(Tab
1390: 6c 65 20 2a 70 54 61 62 2c 20 63 6f 6e 73 74 20  le *pTab, const 
13a0: 63 68 61 72 20 2a 7a 43 6f 6c 29 7b 0a 20 20 69  char *zCol){.  i
13b0: 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  nt i;.  for(i=0;
13c0: 20 69 3c 70 54 61 62 2d 3e 6e 43 6f 6c 3b 20 69   i<pTab->nCol; i
13d0: 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 73 71 6c  ++){.    if( sql
13e0: 69 74 65 33 53 74 72 49 43 6d 70 28 70 54 61 62  ite3StrICmp(pTab
13f0: 2d 3e 61 43 6f 6c 5b 69 5d 2e 7a 4e 61 6d 65 2c  ->aCol[i].zName,
1400: 20 7a 43 6f 6c 29 3d 3d 30 20 29 20 72 65 74 75   zCol)==0 ) retu
1410: 72 6e 20 69 3b 0a 20 20 7d 0a 20 20 72 65 74 75  rn i;.  }.  retu
1420: 72 6e 20 2d 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn -1;.}../*.** 
1430: 53 65 74 20 74 68 65 20 76 61 6c 75 65 20 6f 66  Set the value of
1440: 20 61 20 74 6f 6b 65 6e 20 74 6f 20 61 20 27 5c   a token to a '\
1450: 30 30 30 27 2d 74 65 72 6d 69 6e 61 74 65 64 20  000'-terminated 
1460: 73 74 72 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69  string..*/.stati
1470: 63 20 76 6f 69 64 20 73 65 74 54 6f 6b 65 6e 28  c void setToken(
1480: 54 6f 6b 65 6e 20 2a 70 2c 20 63 6f 6e 73 74 20  Token *p, const 
1490: 63 68 61 72 20 2a 7a 29 7b 0a 20 20 70 2d 3e 7a  char *z){.  p->z
14a0: 20 3d 20 28 75 38 2a 29 7a 3b 0a 20 20 70 2d 3e   = (u8*)z;.  p->
14b0: 6e 20 3d 20 7a 20 3f 20 73 74 72 6c 65 6e 28 7a  n = z ? strlen(z
14c0: 29 20 3a 20 30 3b 0a 20 20 70 2d 3e 64 79 6e 20  ) : 0;.  p->dyn 
14d0: 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65  = 0;.}../*.** Se
14e0: 74 20 74 68 65 20 74 6f 6b 65 6e 20 74 6f 20 74  t the token to t
14f0: 68 65 20 64 6f 75 62 6c 65 2d 71 75 6f 74 65 64  he double-quoted
1500: 20 61 6e 64 20 65 73 63 61 70 65 64 20 76 65 72   and escaped ver
1510: 73 69 6f 6e 20 6f 66 20 74 68 65 20 73 74 72 69  sion of the stri
1520: 6e 67 20 70 6f 69 6e 74 65 64 0a 2a 2a 20 74 6f  ng pointed.** to
1530: 20 62 79 20 7a 2e 20 46 6f 72 20 65 78 61 6d 70   by z. For examp
1540: 6c 65 3b 0a 2a 2a 0a 2a 2a 20 20 20 20 7b 61 22  le;.**.**    {a"
1550: 62 63 7d 20 20 2d 3e 20 20 7b 22 61 22 22 62 63  bc}  ->  {"a""bc
1560: 22 7d 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  "}.*/.static voi
1570: 64 20 73 65 74 51 75 6f 74 65 64 54 6f 6b 65 6e  d setQuotedToken
1580: 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
1590: 54 6f 6b 65 6e 20 2a 70 2c 20 63 6f 6e 73 74 20  Token *p, const 
15a0: 63 68 61 72 20 2a 7a 29 7b 0a 0a 20 20 2f 2a 20  char *z){..  /* 
15b0: 43 68 65 63 6b 20 69 66 20 74 68 65 20 73 74 72  Check if the str
15c0: 69 6e 67 20 63 6f 6e 74 61 69 6e 73 20 61 6e 79  ing contains any
15d0: 20 22 20 63 68 61 72 61 63 74 65 72 73 2e 20 49   " characters. I
15e0: 66 20 69 74 20 64 6f 65 73 2c 20 74 68 65 6e 0a  f it does, then.
15f0: 20 20 2a 2a 20 74 68 69 73 20 66 75 6e 63 74 69    ** this functi
1600: 6f 6e 20 77 69 6c 6c 20 6d 61 6c 6c 6f 63 20 73  on will malloc s
1610: 70 61 63 65 20 74 6f 20 63 72 65 61 74 65 20 61  pace to create a
1620: 20 71 75 6f 74 65 64 20 76 65 72 73 69 6f 6e 20   quoted version 
1630: 6f 66 0a 20 20 2a 2a 20 74 68 65 20 73 74 72 69  of.  ** the stri
1640: 6e 67 20 69 6e 2e 20 4f 74 68 65 72 77 69 73 65  ng in. Otherwise
1650: 2c 20 73 61 76 65 20 61 20 63 61 6c 6c 20 74 6f  , save a call to
1660: 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28   sqlite3MPrintf(
1670: 29 20 62 79 0a 20 20 2a 2a 20 6a 75 73 74 20 63  ) by.  ** just c
1680: 6f 70 79 69 6e 67 20 74 68 65 20 70 6f 69 6e 74  opying the point
1690: 65 72 20 74 6f 20 74 68 65 20 73 74 72 69 6e 67  er to the string
16a0: 2e 0a 20 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63  ..  */.  const c
16b0: 68 61 72 20 2a 7a 32 20 3d 20 7a 3b 0a 20 20 77  har *z2 = z;.  w
16c0: 68 69 6c 65 28 20 2a 7a 32 20 29 7b 0a 20 20 20  hile( *z2 ){.   
16d0: 20 69 66 28 20 2a 7a 32 3d 3d 27 22 27 20 29 20   if( *z2=='"' ) 
16e0: 62 72 65 61 6b 3b 0a 20 20 20 20 7a 32 2b 2b 3b  break;.    z2++;
16f0: 0a 20 20 7d 0a 0a 20 20 69 66 28 20 2a 7a 32 20  .  }..  if( *z2 
1700: 29 7b 0a 20 20 20 20 2f 2a 20 53 74 72 69 6e 67  ){.    /* String
1710: 20 63 6f 6e 74 61 69 6e 73 20 22 20 63 68 61 72   contains " char
1720: 61 63 74 65 72 73 20 2d 20 63 6f 70 79 20 61 6e  acters - copy an
1730: 64 20 71 75 6f 74 65 20 74 68 65 20 73 74 72 69  d quote the stri
1740: 6e 67 2e 20 2a 2f 0a 20 20 20 20 70 2d 3e 7a 20  ng. */.    p->z 
1750: 3d 20 28 75 38 20 2a 29 73 71 6c 69 74 65 33 4d  = (u8 *)sqlite3M
1760: 50 72 69 6e 74 66 28 70 50 61 72 73 65 2d 3e 64  Printf(pParse->d
1770: 62 2c 20 22 5c 22 25 77 5c 22 22 2c 20 7a 29 3b  b, "\"%w\"", z);
1780: 0a 20 20 20 20 69 66 28 20 70 2d 3e 7a 20 29 7b  .    if( p->z ){
1790: 0a 20 20 20 20 20 20 70 2d 3e 6e 20 3d 20 73 74  .      p->n = st
17a0: 72 6c 65 6e 28 28 63 68 61 72 20 2a 29 70 2d 3e  rlen((char *)p->
17b0: 7a 29 3b 0a 20 20 20 20 20 20 70 2d 3e 64 79 6e  z);.      p->dyn
17c0: 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 65   = 1;.    }.  }e
17d0: 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 53 74 72 69  lse{.    /* Stri
17e0: 6e 67 20 63 6f 6e 74 61 69 6e 73 20 6e 6f 20 22  ng contains no "
17f0: 20 63 68 61 72 61 63 74 65 72 73 20 2d 20 63 6f   characters - co
1800: 70 79 20 74 68 65 20 70 6f 69 6e 74 65 72 2e 20  py the pointer. 
1810: 2a 2f 0a 20 20 20 20 70 2d 3e 7a 20 3d 20 28 75  */.    p->z = (u
1820: 38 2a 29 7a 3b 0a 20 20 20 20 70 2d 3e 6e 20 3d  8*)z;.    p->n =
1830: 20 28 7a 32 20 2d 20 7a 29 3b 0a 20 20 20 20 70   (z2 - z);.    p
1840: 2d 3e 64 79 6e 20 3d 20 30 3b 0a 20 20 7d 0a 7d  ->dyn = 0;.  }.}
1850: 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20 61  ../*.** Create a
1860: 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 6e 6f 64  n expression nod
1870: 65 20 66 6f 72 20 61 6e 20 69 64 65 6e 74 69 66  e for an identif
1880: 69 65 72 20 77 69 74 68 20 74 68 65 20 6e 61 6d  ier with the nam
1890: 65 20 6f 66 20 7a 4e 61 6d 65 0a 2a 2f 0a 45 78  e of zName.*/.Ex
18a0: 70 72 20 2a 73 71 6c 69 74 65 33 43 72 65 61 74  pr *sqlite3Creat
18b0: 65 49 64 45 78 70 72 28 50 61 72 73 65 20 2a 70  eIdExpr(Parse *p
18c0: 50 61 72 73 65 2c 20 63 6f 6e 73 74 20 63 68 61  Parse, const cha
18d0: 72 20 2a 7a 4e 61 6d 65 29 7b 0a 20 20 54 6f 6b  r *zName){.  Tok
18e0: 65 6e 20 64 75 6d 6d 79 3b 0a 20 20 73 65 74 54  en dummy;.  setT
18f0: 6f 6b 65 6e 28 26 64 75 6d 6d 79 2c 20 7a 4e 61  oken(&dummy, zNa
1900: 6d 65 29 3b 0a 20 20 72 65 74 75 72 6e 20 73 71  me);.  return sq
1910: 6c 69 74 65 33 50 45 78 70 72 28 70 50 61 72 73  lite3PExpr(pPars
1920: 65 2c 20 54 4b 5f 49 44 2c 20 30 2c 20 30 2c 20  e, TK_ID, 0, 0, 
1930: 26 64 75 6d 6d 79 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  &dummy);.}../*.*
1940: 2a 20 41 64 64 20 61 20 74 65 72 6d 20 74 6f 20  * Add a term to 
1950: 74 68 65 20 57 48 45 52 45 20 65 78 70 72 65 73  the WHERE expres
1960: 73 69 6f 6e 20 69 6e 20 2a 70 70 45 78 70 72 20  sion in *ppExpr 
1970: 74 68 61 74 20 72 65 71 75 69 72 65 73 20 74 68  that requires th
1980: 65 0a 2a 2a 20 7a 43 6f 6c 20 63 6f 6c 75 6d 6e  e.** zCol column
1990: 20 74 6f 20 62 65 20 65 71 75 61 6c 20 69 6e 20   to be equal in 
19a0: 74 68 65 20 74 77 6f 20 74 61 62 6c 65 73 20 70  the two tables p
19b0: 54 61 62 31 20 61 6e 64 20 70 54 61 62 32 2e 0a  Tab1 and pTab2..
19c0: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 61  */.static void a
19d0: 64 64 57 68 65 72 65 54 65 72 6d 28 0a 20 20 50  ddWhereTerm(.  P
19e0: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
19f0: 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69          /* Parsi
1a00: 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  ng context */.  
1a10: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43 6f 6c  const char *zCol
1a20: 2c 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65  ,        /* Name
1a30: 20 6f 66 20 74 68 65 20 63 6f 6c 75 6d 6e 20 2a   of the column *
1a40: 2f 0a 20 20 63 6f 6e 73 74 20 54 61 62 6c 65 20  /.  const Table 
1a50: 2a 70 54 61 62 31 2c 20 20 20 20 20 20 2f 2a 20  *pTab1,      /* 
1a60: 46 69 72 73 74 20 74 61 62 6c 65 20 2a 2f 0a 20  First table */. 
1a70: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 41 6c   const char *zAl
1a80: 69 61 73 31 2c 20 20 20 20 20 2f 2a 20 41 6c 69  ias1,     /* Ali
1a90: 61 73 20 66 6f 72 20 66 69 72 73 74 20 74 61 62  as for first tab
1aa0: 6c 65 2e 20 20 4d 61 79 20 62 65 20 4e 55 4c 4c  le.  May be NULL
1ab0: 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 54 61 62 6c   */.  const Tabl
1ac0: 65 20 2a 70 54 61 62 32 2c 20 20 20 20 20 20 2f  e *pTab2,      /
1ad0: 2a 20 53 65 63 6f 6e 64 20 74 61 62 6c 65 20 2a  * Second table *
1ae0: 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  /.  const char *
1af0: 7a 41 6c 69 61 73 32 2c 20 20 20 20 20 2f 2a 20  zAlias2,     /* 
1b00: 41 6c 69 61 73 20 66 6f 72 20 73 65 63 6f 6e 64  Alias for second
1b10: 20 74 61 62 6c 65 2e 20 20 4d 61 79 20 62 65 20   table.  May be 
1b20: 4e 55 4c 4c 20 2a 2f 0a 20 20 69 6e 74 20 69 52  NULL */.  int iR
1b30: 69 67 68 74 4a 6f 69 6e 54 61 62 6c 65 2c 20 20  ightJoinTable,  
1b40: 20 20 20 2f 2a 20 56 44 42 45 20 63 75 72 73 6f     /* VDBE curso
1b50: 72 20 66 6f 72 20 74 68 65 20 72 69 67 68 74 20  r for the right 
1b60: 74 61 62 6c 65 20 2a 2f 0a 20 20 45 78 70 72 20  table */.  Expr 
1b70: 2a 2a 70 70 45 78 70 72 2c 20 20 20 20 20 20 20  **ppExpr,       
1b80: 20 20 20 20 2f 2a 20 41 64 64 20 74 68 65 20 65      /* Add the e
1b90: 71 75 61 6c 69 74 79 20 74 65 72 6d 20 74 6f 20  quality term to 
1ba0: 74 68 69 73 20 65 78 70 72 65 73 73 69 6f 6e 20  this expression 
1bb0: 2a 2f 0a 20 20 69 6e 74 20 69 73 4f 75 74 65 72  */.  int isOuter
1bc0: 4a 6f 69 6e 20 20 20 20 20 20 20 20 20 20 2f 2a  Join          /*
1bd0: 20 54 72 75 65 20 69 66 20 64 65 61 6c 69 6e 67   True if dealing
1be0: 20 77 69 74 68 20 61 6e 20 4f 55 54 45 52 20 6a   with an OUTER j
1bf0: 6f 69 6e 20 2a 2f 0a 29 7b 0a 20 20 45 78 70 72  oin */.){.  Expr
1c00: 20 2a 70 45 31 61 2c 20 2a 70 45 31 62 2c 20 2a   *pE1a, *pE1b, *
1c10: 70 45 31 63 3b 0a 20 20 45 78 70 72 20 2a 70 45  pE1c;.  Expr *pE
1c20: 32 61 2c 20 2a 70 45 32 62 2c 20 2a 70 45 32 63  2a, *pE2b, *pE2c
1c30: 3b 0a 20 20 45 78 70 72 20 2a 70 45 3b 0a 0a 20  ;.  Expr *pE;.. 
1c40: 20 70 45 31 61 20 3d 20 73 71 6c 69 74 65 33 43   pE1a = sqlite3C
1c50: 72 65 61 74 65 49 64 45 78 70 72 28 70 50 61 72  reateIdExpr(pPar
1c60: 73 65 2c 20 7a 43 6f 6c 29 3b 0a 20 20 70 45 32  se, zCol);.  pE2
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 69 66 28 20 7a 41 6c  zCol);.  if( zAl
1ca0: 69 61 73 31 3d 3d 30 20 29 7b 0a 20 20 20 20 7a  ias1==0 ){.    z
1cb0: 41 6c 69 61 73 31 20 3d 20 70 54 61 62 31 2d 3e  Alias1 = pTab1->
1cc0: 7a 4e 61 6d 65 3b 0a 20 20 7d 0a 20 20 70 45 31  zName;.  }.  pE1
1cd0: 62 20 3d 20 73 71 6c 69 74 65 33 43 72 65 61 74  b = sqlite3Creat
1ce0: 65 49 64 45 78 70 72 28 70 50 61 72 73 65 2c 20  eIdExpr(pParse, 
1cf0: 7a 41 6c 69 61 73 31 29 3b 0a 20 20 69 66 28 20  zAlias1);.  if( 
1d00: 7a 41 6c 69 61 73 32 3d 3d 30 20 29 7b 0a 20 20  zAlias2==0 ){.  
1d10: 20 20 7a 41 6c 69 61 73 32 20 3d 20 70 54 61 62    zAlias2 = pTab
1d20: 32 2d 3e 7a 4e 61 6d 65 3b 0a 20 20 7d 0a 20 20  2->zName;.  }.  
1d30: 70 45 32 62 20 3d 20 73 71 6c 69 74 65 33 43 72  pE2b = sqlite3Cr
1d40: 65 61 74 65 49 64 45 78 70 72 28 70 50 61 72 73  eateIdExpr(pPars
1d50: 65 2c 20 7a 41 6c 69 61 73 32 29 3b 0a 20 20 70  e, zAlias2);.  p
1d60: 45 31 63 20 3d 20 73 71 6c 69 74 65 33 50 45 78  E1c = sqlite3PEx
1d70: 70 72 28 70 50 61 72 73 65 2c 20 54 4b 5f 44 4f  pr(pParse, TK_DO
1d80: 54 2c 20 70 45 31 62 2c 20 70 45 31 61 2c 20 30  T, pE1b, pE1a, 0
1d90: 29 3b 0a 20 20 70 45 32 63 20 3d 20 73 71 6c 69  );.  pE2c = sqli
1da0: 74 65 33 50 45 78 70 72 28 70 50 61 72 73 65 2c  te3PExpr(pParse,
1db0: 20 54 4b 5f 44 4f 54 2c 20 70 45 32 62 2c 20 70   TK_DOT, pE2b, p
1dc0: 45 32 61 2c 20 30 29 3b 0a 20 20 70 45 20 3d 20  E2a, 0);.  pE = 
1dd0: 73 71 6c 69 74 65 33 50 45 78 70 72 28 70 50 61  sqlite3PExpr(pPa
1de0: 72 73 65 2c 20 54 4b 5f 45 51 2c 20 70 45 31 63  rse, TK_EQ, pE1c
1df0: 2c 20 70 45 32 63 2c 20 30 29 3b 0a 20 20 69 66  , pE2c, 0);.  if
1e00: 28 20 70 45 20 26 26 20 69 73 4f 75 74 65 72 4a  ( pE && isOuterJ
1e10: 6f 69 6e 20 29 7b 0a 20 20 20 20 45 78 70 72 53  oin ){.    ExprS
1e20: 65 74 50 72 6f 70 65 72 74 79 28 70 45 2c 20 45  etProperty(pE, E
1e30: 50 5f 46 72 6f 6d 4a 6f 69 6e 29 3b 0a 20 20 20  P_FromJoin);.   
1e40: 20 70 45 2d 3e 69 52 69 67 68 74 4a 6f 69 6e 54   pE->iRightJoinT
1e50: 61 62 6c 65 20 3d 20 69 52 69 67 68 74 4a 6f 69  able = iRightJoi
1e60: 6e 54 61 62 6c 65 3b 0a 20 20 7d 0a 20 20 2a 70  nTable;.  }.  *p
1e70: 70 45 78 70 72 20 3d 20 73 71 6c 69 74 65 33 45  pExpr = sqlite3E
1e80: 78 70 72 41 6e 64 28 70 50 61 72 73 65 2d 3e 64  xprAnd(pParse->d
1e90: 62 2c 2a 70 70 45 78 70 72 2c 20 70 45 29 3b 0a  b,*ppExpr, pE);.
1ea0: 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65  }../*.** Set the
1eb0: 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 20 70 72 6f   EP_FromJoin pro
1ec0: 70 65 72 74 79 20 6f 6e 20 61 6c 6c 20 74 65 72  perty on all ter
1ed0: 6d 73 20 6f 66 20 74 68 65 20 67 69 76 65 6e 20  ms of the given 
1ee0: 65 78 70 72 65 73 73 69 6f 6e 2e 0a 2a 2a 20 41  expression..** A
1ef0: 6e 64 20 73 65 74 20 74 68 65 20 45 78 70 72 2e  nd set the Expr.
1f00: 69 52 69 67 68 74 4a 6f 69 6e 54 61 62 6c 65 20  iRightJoinTable 
1f10: 74 6f 20 69 54 61 62 6c 65 20 66 6f 72 20 65 76  to iTable for ev
1f20: 65 72 79 20 74 65 72 6d 20 69 6e 20 74 68 65 0a  ery term in the.
1f30: 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 2e 0a 2a  ** expression..*
1f40: 2a 0a 2a 2a 20 54 68 65 20 45 50 5f 46 72 6f 6d  *.** The EP_From
1f50: 4a 6f 69 6e 20 70 72 6f 70 65 72 74 79 20 69 73  Join property is
1f60: 20 75 73 65 64 20 6f 6e 20 74 65 72 6d 73 20 6f   used on terms o
1f70: 66 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20  f an expression 
1f80: 74 6f 20 74 65 6c 6c 0a 2a 2a 20 74 68 65 20 4c  to tell.** the L
1f90: 45 46 54 20 4f 55 54 45 52 20 4a 4f 49 4e 20 70  EFT OUTER JOIN p
1fa0: 72 6f 63 65 73 73 69 6e 67 20 6c 6f 67 69 63 20  rocessing logic 
1fb0: 74 68 61 74 20 74 68 69 73 20 74 65 72 6d 20 69  that this term i
1fc0: 73 20 70 61 72 74 20 6f 66 20 74 68 65 0a 2a 2a  s part of the.**
1fd0: 20 6a 6f 69 6e 20 72 65 73 74 72 69 63 74 69 6f   join restrictio
1fe0: 6e 20 73 70 65 63 69 66 69 65 64 20 69 6e 20 74  n specified in t
1ff0: 68 65 20 4f 4e 20 6f 72 20 55 53 49 4e 47 20 63  he ON or USING c
2000: 6c 61 75 73 65 20 61 6e 64 20 6e 6f 74 20 61 20  lause and not a 
2010: 70 61 72 74 0a 2a 2a 20 6f 66 20 74 68 65 20 6d  part.** of the m
2020: 6f 72 65 20 67 65 6e 65 72 61 6c 20 57 48 45 52  ore general WHER
2030: 45 20 63 6c 61 75 73 65 2e 20 20 54 68 65 73 65  E clause.  These
2040: 20 74 65 72 6d 73 20 61 72 65 20 6d 6f 76 65 64   terms are moved
2050: 20 6f 76 65 72 20 74 6f 20 74 68 65 0a 2a 2a 20   over to the.** 
2060: 57 48 45 52 45 20 63 6c 61 75 73 65 20 64 75 72  WHERE clause dur
2070: 69 6e 67 20 6a 6f 69 6e 20 70 72 6f 63 65 73 73  ing join process
2080: 69 6e 67 20 62 75 74 20 77 65 20 6e 65 65 64 20  ing but we need 
2090: 74 6f 20 72 65 6d 65 6d 62 65 72 20 74 68 61 74  to remember that
20a0: 20 74 68 65 79 0a 2a 2a 20 6f 72 69 67 69 6e 61   they.** origina
20b0: 74 65 64 20 69 6e 20 74 68 65 20 4f 4e 20 6f 72  ted in the ON or
20c0: 20 55 53 49 4e 47 20 63 6c 61 75 73 65 2e 0a 2a   USING clause..*
20d0: 2a 0a 2a 2a 20 54 68 65 20 45 78 70 72 2e 69 52  *.** The Expr.iR
20e0: 69 67 68 74 4a 6f 69 6e 54 61 62 6c 65 20 74 65  ightJoinTable te
20f0: 6c 6c 73 20 74 68 65 20 57 48 45 52 45 20 63 6c  lls the WHERE cl
2100: 61 75 73 65 20 70 72 6f 63 65 73 73 69 6e 67 20  ause processing 
2110: 74 68 61 74 20 74 68 65 0a 2a 2a 20 65 78 70 72  that the.** expr
2120: 65 73 73 69 6f 6e 20 64 65 70 65 6e 64 73 20 6f  ession depends o
2130: 6e 20 74 61 62 6c 65 20 69 52 69 67 68 74 4a 6f  n table iRightJo
2140: 69 6e 54 61 62 6c 65 20 65 76 65 6e 20 69 66 20  inTable even if 
2150: 74 68 61 74 20 74 61 62 6c 65 20 69 73 20 6e 6f  that table is no
2160: 74 0a 2a 2a 20 65 78 70 6c 69 63 69 74 6c 79 20  t.** explicitly 
2170: 6d 65 6e 74 69 6f 6e 65 64 20 69 6e 20 74 68 65  mentioned in the
2180: 20 65 78 70 72 65 73 73 69 6f 6e 2e 20 20 54 68   expression.  Th
2190: 61 74 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69  at information i
21a0: 73 20 6e 65 65 64 65 64 0a 2a 2a 20 66 6f 72 20  s needed.** for 
21b0: 63 61 73 65 73 20 6c 69 6b 65 20 74 68 69 73 3a  cases like this:
21c0: 0a 2a 2a 0a 2a 2a 20 20 20 20 53 45 4c 45 43 54  .**.**    SELECT
21d0: 20 2a 20 46 52 4f 4d 20 74 31 20 4c 45 46 54 20   * FROM t1 LEFT 
21e0: 4a 4f 49 4e 20 74 32 20 4f 4e 20 74 31 2e 61 3d  JOIN t2 ON t1.a=
21f0: 74 32 2e 62 20 41 4e 44 20 74 31 2e 78 3d 35 0a  t2.b AND t1.x=5.
2200: 2a 2a 0a 2a 2a 20 54 68 65 20 77 68 65 72 65 20  **.** The where 
2210: 63 6c 61 75 73 65 20 6e 65 65 64 73 20 74 6f 20  clause needs to 
2220: 64 65 66 65 72 20 74 68 65 20 68 61 6e 64 6c 69  defer the handli
2230: 6e 67 20 6f 66 20 74 68 65 20 74 31 2e 78 3d 35  ng of the t1.x=5
2240: 0a 2a 2a 20 74 65 72 6d 20 75 6e 74 69 6c 20 61  .** term until a
2250: 66 74 65 72 20 74 68 65 20 74 32 20 6c 6f 6f 70  fter the t2 loop
2260: 20 6f 66 20 74 68 65 20 6a 6f 69 6e 2e 20 20 49   of the join.  I
2270: 6e 20 74 68 61 74 20 77 61 79 2c 20 61 0a 2a 2a  n that way, a.**
2280: 20 4e 55 4c 4c 20 74 32 20 72 6f 77 20 77 69 6c   NULL t2 row wil
2290: 6c 20 62 65 20 69 6e 73 65 72 74 65 64 20 77 68  l be inserted wh
22a0: 65 6e 65 76 65 72 20 74 31 2e 78 21 3d 35 2e 20  enever t1.x!=5. 
22b0: 20 49 66 20 77 65 20 64 6f 20 6e 6f 74 0a 2a 2a   If we do not.**
22c0: 20 64 65 66 65 72 20 74 68 65 20 68 61 6e 64 6c   defer the handl
22d0: 69 6e 67 20 6f 66 20 74 31 2e 78 3d 35 2c 20 69  ing of t1.x=5, i
22e0: 74 20 77 69 6c 6c 20 62 65 20 70 72 6f 63 65 73  t will be proces
22f0: 73 65 64 20 69 6d 6d 65 64 69 61 74 65 6c 79 0a  sed immediately.
2300: 2a 2a 20 61 66 74 65 72 20 74 68 65 20 74 31 20  ** after the t1 
2310: 6c 6f 6f 70 20 61 6e 64 20 72 6f 77 73 20 77 69  loop and rows wi
2320: 74 68 20 74 31 2e 78 21 3d 35 20 77 69 6c 6c 20  th t1.x!=5 will 
2330: 6e 65 76 65 72 20 61 70 70 65 61 72 20 69 6e 0a  never appear in.
2340: 2a 2a 20 74 68 65 20 6f 75 74 70 75 74 2c 20 77  ** the output, w
2350: 68 69 63 68 20 69 73 20 69 6e 63 6f 72 72 65 63  hich is incorrec
2360: 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  t..*/.static voi
2370: 64 20 73 65 74 4a 6f 69 6e 45 78 70 72 28 45 78  d setJoinExpr(Ex
2380: 70 72 20 2a 70 2c 20 69 6e 74 20 69 54 61 62 6c  pr *p, int iTabl
2390: 65 29 7b 0a 20 20 77 68 69 6c 65 28 20 70 20 29  e){.  while( p )
23a0: 7b 0a 20 20 20 20 45 78 70 72 53 65 74 50 72 6f  {.    ExprSetPro
23b0: 70 65 72 74 79 28 70 2c 20 45 50 5f 46 72 6f 6d  perty(p, EP_From
23c0: 4a 6f 69 6e 29 3b 0a 20 20 20 20 70 2d 3e 69 52  Join);.    p->iR
23d0: 69 67 68 74 4a 6f 69 6e 54 61 62 6c 65 20 3d 20  ightJoinTable = 
23e0: 69 54 61 62 6c 65 3b 0a 20 20 20 20 73 65 74 4a  iTable;.    setJ
23f0: 6f 69 6e 45 78 70 72 28 70 2d 3e 70 4c 65 66 74  oinExpr(p->pLeft
2400: 2c 20 69 54 61 62 6c 65 29 3b 0a 20 20 20 20 70  , iTable);.    p
2410: 20 3d 20 70 2d 3e 70 52 69 67 68 74 3b 0a 20 20   = p->pRight;.  
2420: 7d 20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  } .}../*.** This
2430: 20 72 6f 75 74 69 6e 65 20 70 72 6f 63 65 73 73   routine process
2440: 65 73 20 74 68 65 20 6a 6f 69 6e 20 69 6e 66 6f  es the join info
2450: 72 6d 61 74 69 6f 6e 20 66 6f 72 20 61 20 53 45  rmation for a SE
2460: 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 2e 0a  LECT statement..
2470: 2a 2a 20 4f 4e 20 61 6e 64 20 55 53 49 4e 47 20  ** ON and USING 
2480: 63 6c 61 75 73 65 73 20 61 72 65 20 63 6f 6e 76  clauses are conv
2490: 65 72 74 65 64 20 69 6e 74 6f 20 65 78 74 72 61  erted into extra
24a0: 20 74 65 72 6d 73 20 6f 66 20 74 68 65 20 57 48   terms of the WH
24b0: 45 52 45 20 63 6c 61 75 73 65 2e 0a 2a 2a 20 4e  ERE clause..** N
24c0: 41 54 55 52 41 4c 20 6a 6f 69 6e 73 20 61 6c 73  ATURAL joins als
24d0: 6f 20 63 72 65 61 74 65 20 65 78 74 72 61 20 57  o create extra W
24e0: 48 45 52 45 20 63 6c 61 75 73 65 20 74 65 72 6d  HERE clause term
24f0: 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 74 65 72  s..**.** The ter
2500: 6d 73 20 6f 66 20 61 20 46 52 4f 4d 20 63 6c 61  ms of a FROM cla
2510: 75 73 65 20 61 72 65 20 63 6f 6e 74 61 69 6e 65  use are containe
2520: 64 20 69 6e 20 74 68 65 20 53 65 6c 65 63 74 2e  d in the Select.
2530: 70 53 72 63 20 73 74 72 75 63 74 75 72 65 2e 0a  pSrc structure..
2540: 2a 2a 20 54 68 65 20 6c 65 66 74 20 6d 6f 73 74  ** The left most
2550: 20 74 61 62 6c 65 20 69 73 20 74 68 65 20 66 69   table is the fi
2560: 72 73 74 20 65 6e 74 72 79 20 69 6e 20 53 65 6c  rst entry in Sel
2570: 65 63 74 2e 70 53 72 63 2e 20 20 54 68 65 20 72  ect.pSrc.  The r
2580: 69 67 68 74 2d 6d 6f 73 74 0a 2a 2a 20 74 61 62  ight-most.** tab
2590: 6c 65 20 69 73 20 74 68 65 20 6c 61 73 74 20 65  le is the last e
25a0: 6e 74 72 79 2e 20 20 54 68 65 20 6a 6f 69 6e 20  ntry.  The join 
25b0: 6f 70 65 72 61 74 6f 72 20 69 73 20 68 65 6c 64  operator is held
25c0: 20 69 6e 20 74 68 65 20 65 6e 74 72 79 20 74 6f   in the entry to
25d0: 0a 2a 2a 20 74 68 65 20 6c 65 66 74 2e 20 20 54  .** the left.  T
25e0: 68 75 73 20 65 6e 74 72 79 20 30 20 63 6f 6e 74  hus entry 0 cont
25f0: 61 69 6e 73 20 74 68 65 20 6a 6f 69 6e 20 6f 70  ains the join op
2600: 65 72 61 74 6f 72 20 66 6f 72 20 74 68 65 20 6a  erator for the j
2610: 6f 69 6e 20 62 65 74 77 65 65 6e 0a 2a 2a 20 65  oin between.** e
2620: 6e 74 72 69 65 73 20 30 20 61 6e 64 20 31 2e 20  ntries 0 and 1. 
2630: 20 41 6e 79 20 4f 4e 20 6f 72 20 55 53 49 4e 47   Any ON or USING
2640: 20 63 6c 61 75 73 65 73 20 61 73 73 6f 63 69 61   clauses associa
2650: 74 65 64 20 77 69 74 68 20 74 68 65 20 6a 6f 69  ted with the joi
2660: 6e 20 61 72 65 0a 2a 2a 20 61 6c 73 6f 20 61 74  n are.** also at
2670: 74 61 63 68 65 64 20 74 6f 20 74 68 65 20 6c 65  tached to the le
2680: 66 74 20 65 6e 74 72 79 2e 0a 2a 2a 0a 2a 2a 20  ft entry..**.** 
2690: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74  This routine ret
26a0: 75 72 6e 73 20 74 68 65 20 6e 75 6d 62 65 72 20  urns the number 
26b0: 6f 66 20 65 72 72 6f 72 73 20 65 6e 63 6f 75 6e  of errors encoun
26c0: 74 65 72 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  tered..*/.static
26d0: 20 69 6e 74 20 73 71 6c 69 74 65 50 72 6f 63 65   int sqliteProce
26e0: 73 73 4a 6f 69 6e 28 50 61 72 73 65 20 2a 70 50  ssJoin(Parse *pP
26f0: 61 72 73 65 2c 20 53 65 6c 65 63 74 20 2a 70 29  arse, Select *p)
2700: 7b 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 53 72  {.  SrcList *pSr
2710: 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c;              
2720: 20 20 20 20 2f 2a 20 41 6c 6c 20 74 61 62 6c 65      /* All table
2730: 73 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c  s in the FROM cl
2740: 61 75 73 65 20 2a 2f 0a 20 20 69 6e 74 20 69 2c  ause */.  int i,
2750: 20 6a 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   j;             
2760: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f            /* Loo
2770: 70 20 63 6f 75 6e 74 65 72 73 20 2a 2f 0a 20 20  p counters */.  
2780: 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69  struct SrcList_i
2790: 74 65 6d 20 2a 70 4c 65 66 74 3b 20 20 20 20 20  tem *pLeft;     
27a0: 2f 2a 20 4c 65 66 74 20 74 61 62 6c 65 20 62 65  /* Left table be
27b0: 69 6e 67 20 6a 6f 69 6e 65 64 20 2a 2f 0a 20 20  ing joined */.  
27c0: 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69  struct SrcList_i
27d0: 74 65 6d 20 2a 70 52 69 67 68 74 3b 20 20 20 20  tem *pRight;    
27e0: 2f 2a 20 52 69 67 68 74 20 74 61 62 6c 65 20 62  /* Right table b
27f0: 65 69 6e 67 20 6a 6f 69 6e 65 64 20 2a 2f 0a 0a  eing joined */..
2800: 20 20 70 53 72 63 20 3d 20 70 2d 3e 70 53 72 63    pSrc = p->pSrc
2810: 3b 0a 20 20 70 4c 65 66 74 20 3d 20 26 70 53 72  ;.  pLeft = &pSr
2820: 63 2d 3e 61 5b 30 5d 3b 0a 20 20 70 52 69 67 68  c->a[0];.  pRigh
2830: 74 20 3d 20 26 70 4c 65 66 74 5b 31 5d 3b 0a 20  t = &pLeft[1];. 
2840: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 53 72 63   for(i=0; i<pSrc
2850: 2d 3e 6e 53 72 63 2d 31 3b 20 69 2b 2b 2c 20 70  ->nSrc-1; i++, p
2860: 52 69 67 68 74 2b 2b 2c 20 70 4c 65 66 74 2b 2b  Right++, pLeft++
2870: 29 7b 0a 20 20 20 20 54 61 62 6c 65 20 2a 70 4c  ){.    Table *pL
2880: 65 66 74 54 61 62 20 3d 20 70 4c 65 66 74 2d 3e  eftTab = pLeft->
2890: 70 54 61 62 3b 0a 20 20 20 20 54 61 62 6c 65 20  pTab;.    Table 
28a0: 2a 70 52 69 67 68 74 54 61 62 20 3d 20 70 52 69  *pRightTab = pRi
28b0: 67 68 74 2d 3e 70 54 61 62 3b 0a 20 20 20 20 69  ght->pTab;.    i
28c0: 6e 74 20 69 73 4f 75 74 65 72 3b 0a 0a 20 20 20  nt isOuter;..   
28d0: 20 69 66 28 20 70 4c 65 66 74 54 61 62 3d 3d 30   if( pLeftTab==0
28e0: 20 7c 7c 20 70 52 69 67 68 74 54 61 62 3d 3d 30   || pRightTab==0
28f0: 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
2900: 20 69 73 4f 75 74 65 72 20 3d 20 28 70 52 69 67   isOuter = (pRig
2910: 68 74 2d 3e 6a 6f 69 6e 74 79 70 65 20 26 20 4a  ht->jointype & J
2920: 54 5f 4f 55 54 45 52 29 21 3d 30 3b 0a 0a 20 20  T_OUTER)!=0;..  
2930: 20 20 2f 2a 20 57 68 65 6e 20 74 68 65 20 4e 41    /* When the NA
2940: 54 55 52 41 4c 20 6b 65 79 77 6f 72 64 20 69 73  TURAL keyword is
2950: 20 70 72 65 73 65 6e 74 2c 20 61 64 64 20 57 48   present, add WH
2960: 45 52 45 20 63 6c 61 75 73 65 20 74 65 72 6d 73  ERE clause terms
2970: 20 66 6f 72 0a 20 20 20 20 2a 2a 20 65 76 65 72   for.    ** ever
2980: 79 20 63 6f 6c 75 6d 6e 20 74 68 61 74 20 74 68  y column that th
2990: 65 20 74 77 6f 20 74 61 62 6c 65 73 20 68 61 76  e two tables hav
29a0: 65 20 69 6e 20 63 6f 6d 6d 6f 6e 2e 0a 20 20 20  e in common..   
29b0: 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 52 69 67   */.    if( pRig
29c0: 68 74 2d 3e 6a 6f 69 6e 74 79 70 65 20 26 20 4a  ht->jointype & J
29d0: 54 5f 4e 41 54 55 52 41 4c 20 29 7b 0a 20 20 20  T_NATURAL ){.   
29e0: 20 20 20 69 66 28 20 70 52 69 67 68 74 2d 3e 70     if( pRight->p
29f0: 4f 6e 20 7c 7c 20 70 52 69 67 68 74 2d 3e 70 55  On || pRight->pU
2a00: 73 69 6e 67 20 29 7b 0a 20 20 20 20 20 20 20 20  sing ){.        
2a10: 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
2a20: 70 50 61 72 73 65 2c 20 22 61 20 4e 41 54 55 52  pParse, "a NATUR
2a30: 41 4c 20 6a 6f 69 6e 20 6d 61 79 20 6e 6f 74 20  AL join may not 
2a40: 68 61 76 65 20 22 0a 20 20 20 20 20 20 20 20 20  have ".         
2a50: 20 20 22 61 6e 20 4f 4e 20 6f 72 20 55 53 49 4e    "an ON or USIN
2a60: 47 20 63 6c 61 75 73 65 22 2c 20 30 29 3b 0a 20  G clause", 0);. 
2a70: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b         return 1;
2a80: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 66  .      }.      f
2a90: 6f 72 28 6a 3d 30 3b 20 6a 3c 70 4c 65 66 74 54  or(j=0; j<pLeftT
2aa0: 61 62 2d 3e 6e 43 6f 6c 3b 20 6a 2b 2b 29 7b 0a  ab->nCol; j++){.
2ab0: 20 20 20 20 20 20 20 20 63 68 61 72 20 2a 7a 4e          char *zN
2ac0: 61 6d 65 20 3d 20 70 4c 65 66 74 54 61 62 2d 3e  ame = pLeftTab->
2ad0: 61 43 6f 6c 5b 6a 5d 2e 7a 4e 61 6d 65 3b 0a 20  aCol[j].zName;. 
2ae0: 20 20 20 20 20 20 20 69 66 28 20 63 6f 6c 75 6d         if( colum
2af0: 6e 49 6e 64 65 78 28 70 52 69 67 68 74 54 61 62  nIndex(pRightTab
2b00: 2c 20 7a 4e 61 6d 65 29 3e 3d 30 20 29 7b 0a 20  , zName)>=0 ){. 
2b10: 20 20 20 20 20 20 20 20 20 61 64 64 57 68 65 72           addWher
2b20: 65 54 65 72 6d 28 70 50 61 72 73 65 2c 20 7a 4e  eTerm(pParse, zN
2b30: 61 6d 65 2c 20 70 4c 65 66 74 54 61 62 2c 20 70  ame, pLeftTab, p
2b40: 4c 65 66 74 2d 3e 7a 41 6c 69 61 73 2c 20 0a 20  Left->zAlias, . 
2b50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b60: 20 20 20 20 20 20 20 20 20 20 20 20 20 70 52 69               pRi
2b70: 67 68 74 54 61 62 2c 20 70 52 69 67 68 74 2d 3e  ghtTab, pRight->
2b80: 7a 41 6c 69 61 73 2c 0a 20 20 20 20 20 20 20 20  zAlias,.        
2b90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ba0: 20 20 20 20 20 20 70 52 69 67 68 74 2d 3e 69 43        pRight->iC
2bb0: 75 72 73 6f 72 2c 20 26 70 2d 3e 70 57 68 65 72  ursor, &p->pWher
2bc0: 65 2c 20 69 73 4f 75 74 65 72 29 3b 0a 20 20 20  e, isOuter);.   
2bd0: 20 20 20 20 20 20 20 0a 20 20 20 20 20 20 20 20         .        
2be0: 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  }.      }.    }.
2bf0: 0a 20 20 20 20 2f 2a 20 44 69 73 61 6c 6c 6f 77  .    /* Disallow
2c00: 20 62 6f 74 68 20 4f 4e 20 61 6e 64 20 55 53 49   both ON and USI
2c10: 4e 47 20 63 6c 61 75 73 65 73 20 69 6e 20 74 68  NG clauses in th
2c20: 65 20 73 61 6d 65 20 6a 6f 69 6e 0a 20 20 20 20  e same join.    
2c30: 2a 2f 0a 20 20 20 20 69 66 28 20 70 52 69 67 68  */.    if( pRigh
2c40: 74 2d 3e 70 4f 6e 20 26 26 20 70 52 69 67 68 74  t->pOn && pRight
2c50: 2d 3e 70 55 73 69 6e 67 20 29 7b 0a 20 20 20 20  ->pUsing ){.    
2c60: 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
2c70: 67 28 70 50 61 72 73 65 2c 20 22 63 61 6e 6e 6f  g(pParse, "canno
2c80: 74 20 68 61 76 65 20 62 6f 74 68 20 4f 4e 20 61  t have both ON a
2c90: 6e 64 20 55 53 49 4e 47 20 22 0a 20 20 20 20 20  nd USING ".     
2ca0: 20 20 20 22 63 6c 61 75 73 65 73 20 69 6e 20 74     "clauses in t
2cb0: 68 65 20 73 61 6d 65 20 6a 6f 69 6e 22 29 3b 0a  he same join");.
2cc0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a        return 1;.
2cd0: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 41 64      }..    /* Ad
2ce0: 64 20 74 68 65 20 4f 4e 20 63 6c 61 75 73 65 20  d the ON clause 
2cf0: 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68  to the end of th
2d00: 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 2c 20  e WHERE clause, 
2d10: 63 6f 6e 6e 65 63 74 65 64 20 62 79 0a 20 20 20  connected by.   
2d20: 20 2a 2a 20 61 6e 20 41 4e 44 20 6f 70 65 72 61   ** an AND opera
2d30: 74 6f 72 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  tor..    */.    
2d40: 69 66 28 20 70 52 69 67 68 74 2d 3e 70 4f 6e 20  if( pRight->pOn 
2d50: 29 7b 0a 20 20 20 20 20 20 69 66 28 20 69 73 4f  ){.      if( isO
2d60: 75 74 65 72 20 29 20 73 65 74 4a 6f 69 6e 45 78  uter ) setJoinEx
2d70: 70 72 28 70 52 69 67 68 74 2d 3e 70 4f 6e 2c 20  pr(pRight->pOn, 
2d80: 70 52 69 67 68 74 2d 3e 69 43 75 72 73 6f 72 29  pRight->iCursor)
2d90: 3b 0a 20 20 20 20 20 20 70 2d 3e 70 57 68 65 72  ;.      p->pWher
2da0: 65 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 41  e = sqlite3ExprA
2db0: 6e 64 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70  nd(pParse->db, p
2dc0: 2d 3e 70 57 68 65 72 65 2c 20 70 52 69 67 68 74  ->pWhere, pRight
2dd0: 2d 3e 70 4f 6e 29 3b 0a 20 20 20 20 20 20 70 52  ->pOn);.      pR
2de0: 69 67 68 74 2d 3e 70 4f 6e 20 3d 20 30 3b 0a 20  ight->pOn = 0;. 
2df0: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 72 65     }..    /* Cre
2e00: 61 74 65 20 65 78 74 72 61 20 74 65 72 6d 73 20  ate extra terms 
2e10: 6f 6e 20 74 68 65 20 57 48 45 52 45 20 63 6c 61  on the WHERE cla
2e20: 75 73 65 20 66 6f 72 20 65 61 63 68 20 63 6f 6c  use for each col
2e30: 75 6d 6e 20 6e 61 6d 65 64 0a 20 20 20 20 2a 2a  umn named.    **
2e40: 20 69 6e 20 74 68 65 20 55 53 49 4e 47 20 63 6c   in the USING cl
2e50: 61 75 73 65 2e 20 20 45 78 61 6d 70 6c 65 3a 20  ause.  Example: 
2e60: 49 66 20 74 68 65 20 74 77 6f 20 74 61 62 6c 65  If the two table
2e70: 73 20 74 6f 20 62 65 20 6a 6f 69 6e 65 64 20 61  s to be joined a
2e80: 72 65 20 0a 20 20 20 20 2a 2a 20 41 20 61 6e 64  re .    ** A and
2e90: 20 42 20 61 6e 64 20 74 68 65 20 55 53 49 4e 47   B and the USING
2ea0: 20 63 6c 61 75 73 65 20 6e 61 6d 65 73 20 58 2c   clause names X,
2eb0: 20 59 2c 20 61 6e 64 20 5a 2c 20 74 68 65 6e 20   Y, and Z, then 
2ec0: 61 64 64 20 74 68 69 73 0a 20 20 20 20 2a 2a 20  add this.    ** 
2ed0: 74 6f 20 74 68 65 20 57 48 45 52 45 20 63 6c 61  to the WHERE cla
2ee0: 75 73 65 3a 20 20 20 20 41 2e 58 3d 42 2e 58 20  use:    A.X=B.X 
2ef0: 41 4e 44 20 41 2e 59 3d 42 2e 59 20 41 4e 44 20  AND A.Y=B.Y AND 
2f00: 41 2e 5a 3d 42 2e 5a 0a 20 20 20 20 2a 2a 20 52  A.Z=B.Z.    ** R
2f10: 65 70 6f 72 74 20 61 6e 20 65 72 72 6f 72 20 69  eport an error i
2f20: 66 20 61 6e 79 20 63 6f 6c 75 6d 6e 20 6d 65 6e  f any column men
2f30: 74 69 6f 6e 65 64 20 69 6e 20 74 68 65 20 55 53  tioned in the US
2f40: 49 4e 47 20 63 6c 61 75 73 65 20 69 73 0a 20 20  ING clause is.  
2f50: 20 20 2a 2a 20 6e 6f 74 20 63 6f 6e 74 61 69 6e    ** not contain
2f60: 65 64 20 69 6e 20 62 6f 74 68 20 74 61 62 6c 65  ed in both table
2f70: 73 20 74 6f 20 62 65 20 6a 6f 69 6e 65 64 2e 0a  s to be joined..
2f80: 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70      */.    if( p
2f90: 52 69 67 68 74 2d 3e 70 55 73 69 6e 67 20 29 7b  Right->pUsing ){
2fa0: 0a 20 20 20 20 20 20 49 64 4c 69 73 74 20 2a 70  .      IdList *p
2fb0: 4c 69 73 74 20 3d 20 70 52 69 67 68 74 2d 3e 70  List = pRight->p
2fc0: 55 73 69 6e 67 3b 0a 20 20 20 20 20 20 66 6f 72  Using;.      for
2fd0: 28 6a 3d 30 3b 20 6a 3c 70 4c 69 73 74 2d 3e 6e  (j=0; j<pList->n
2fe0: 49 64 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20  Id; j++){.      
2ff0: 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 20 3d 20    char *zName = 
3000: 70 4c 69 73 74 2d 3e 61 5b 6a 5d 2e 7a 4e 61 6d  pList->a[j].zNam
3010: 65 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 63  e;.        if( c
3020: 6f 6c 75 6d 6e 49 6e 64 65 78 28 70 4c 65 66 74  olumnIndex(pLeft
3030: 54 61 62 2c 20 7a 4e 61 6d 65 29 3c 30 20 7c 7c  Tab, zName)<0 ||
3040: 20 63 6f 6c 75 6d 6e 49 6e 64 65 78 28 70 52 69   columnIndex(pRi
3050: 67 68 74 54 61 62 2c 20 7a 4e 61 6d 65 29 3c 30  ghtTab, zName)<0
3060: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71   ){.          sq
3070: 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
3080: 61 72 73 65 2c 20 22 63 61 6e 6e 6f 74 20 6a 6f  arse, "cannot jo
3090: 69 6e 20 75 73 69 6e 67 20 63 6f 6c 75 6d 6e 20  in using column 
30a0: 25 73 20 2d 20 63 6f 6c 75 6d 6e 20 22 0a 20 20  %s - column ".  
30b0: 20 20 20 20 20 20 20 20 20 20 22 6e 6f 74 20 70            "not p
30c0: 72 65 73 65 6e 74 20 69 6e 20 62 6f 74 68 20 74  resent in both t
30d0: 61 62 6c 65 73 22 2c 20 7a 4e 61 6d 65 29 3b 0a  ables", zName);.
30e0: 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
30f0: 20 31 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20   1;.        }.  
3100: 20 20 20 20 20 20 61 64 64 57 68 65 72 65 54 65        addWhereTe
3110: 72 6d 28 70 50 61 72 73 65 2c 20 7a 4e 61 6d 65  rm(pParse, zName
3120: 2c 20 70 4c 65 66 74 54 61 62 2c 20 70 4c 65 66  , pLeftTab, pLef
3130: 74 2d 3e 7a 41 6c 69 61 73 2c 20 0a 20 20 20 20  t->zAlias, .    
3140: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3150: 20 20 20 20 20 20 20 20 70 52 69 67 68 74 54 61          pRightTa
3160: 62 2c 20 70 52 69 67 68 74 2d 3e 7a 41 6c 69 61  b, pRight->zAlia
3170: 73 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  s,.             
3180: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
3190: 52 69 67 68 74 2d 3e 69 43 75 72 73 6f 72 2c 20  Right->iCursor, 
31a0: 26 70 2d 3e 70 57 68 65 72 65 2c 20 69 73 4f 75  &p->pWhere, isOu
31b0: 74 65 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ter);.      }.  
31c0: 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
31d0: 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 73   0;.}../*.** Ins
31e0: 65 72 74 20 63 6f 64 65 20 69 6e 74 6f 20 22 76  ert code into "v
31f0: 22 20 74 68 61 74 20 77 69 6c 6c 20 70 75 73 68  " that will push
3200: 20 74 68 65 20 72 65 63 6f 72 64 20 6f 6e 20 74   the record on t
3210: 68 65 20 74 6f 70 20 6f 66 20 74 68 65 0a 2a 2a  he top of the.**
3220: 20 73 74 61 63 6b 20 69 6e 74 6f 20 74 68 65 20   stack into the 
3230: 73 6f 72 74 65 72 2e 0a 2a 2f 0a 73 74 61 74 69  sorter..*/.stati
3240: 63 20 76 6f 69 64 20 70 75 73 68 4f 6e 74 6f 53  c void pushOntoS
3250: 6f 72 74 65 72 28 0a 20 20 50 61 72 73 65 20 2a  orter(.  Parse *
3260: 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 20  pParse,         
3270: 2f 2a 20 50 61 72 73 65 72 20 63 6f 6e 74 65 78  /* Parser contex
3280: 74 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20  t */.  ExprList 
3290: 2a 70 4f 72 64 65 72 42 79 2c 20 20 20 20 2f 2a  *pOrderBy,    /*
32a0: 20 54 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c   The ORDER BY cl
32b0: 61 75 73 65 20 2a 2f 0a 20 20 53 65 6c 65 63 74  ause */.  Select
32c0: 20 2a 70 53 65 6c 65 63 74 2c 20 20 20 20 20 20   *pSelect,      
32d0: 20 2f 2a 20 54 68 65 20 77 68 6f 6c 65 20 53 45   /* The whole SE
32e0: 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 2a  LECT statement *
32f0: 2f 0a 20 20 69 6e 74 20 72 65 67 44 61 74 61 20  /.  int regData 
3300: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
3310: 67 69 73 74 65 72 20 68 6f 6c 64 69 6e 67 20 64  gister holding d
3320: 61 74 61 20 74 6f 20 62 65 20 73 6f 72 74 65 64  ata to be sorted
3330: 20 2a 2f 0a 29 7b 0a 20 20 56 64 62 65 20 2a 76   */.){.  Vdbe *v
3340: 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65   = pParse->pVdbe
3350: 3b 0a 20 20 69 6e 74 20 6e 45 78 70 72 20 3d 20  ;.  int nExpr = 
3360: 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 3b  pOrderBy->nExpr;
3370: 0a 20 20 69 6e 74 20 72 65 67 42 61 73 65 20 3d  .  int regBase =
3380: 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52   sqlite3GetTempR
3390: 61 6e 67 65 28 70 50 61 72 73 65 2c 20 6e 45 78  ange(pParse, nEx
33a0: 70 72 2b 32 29 3b 0a 20 20 69 6e 74 20 72 65 67  pr+2);.  int reg
33b0: 52 65 63 6f 72 64 20 3d 20 73 71 6c 69 74 65 33  Record = sqlite3
33c0: 47 65 74 54 65 6d 70 52 65 67 28 70 50 61 72 73  GetTempReg(pPars
33d0: 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70  e);.  sqlite3Exp
33e0: 72 43 6f 64 65 45 78 70 72 4c 69 73 74 28 70 50  rCodeExprList(pP
33f0: 61 72 73 65 2c 20 70 4f 72 64 65 72 42 79 2c 20  arse, pOrderBy, 
3400: 72 65 67 42 61 73 65 2c 20 30 29 3b 0a 20 20 73  regBase, 0);.  s
3410: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
3420: 28 76 2c 20 4f 50 5f 53 65 71 75 65 6e 63 65 2c  (v, OP_Sequence,
3430: 20 70 4f 72 64 65 72 42 79 2d 3e 69 45 43 75 72   pOrderBy->iECur
3440: 73 6f 72 2c 20 72 65 67 42 61 73 65 2b 6e 45 78  sor, regBase+nEx
3450: 70 72 29 3b 0a 20 20 73 71 6c 69 74 65 33 45 78  pr);.  sqlite3Ex
3460: 70 72 43 6f 64 65 4d 6f 76 65 28 70 50 61 72 73  prCodeMove(pPars
3470: 65 2c 20 72 65 67 44 61 74 61 2c 20 72 65 67 42  e, regData, regB
3480: 61 73 65 2b 6e 45 78 70 72 2b 31 2c 20 31 29 3b  ase+nExpr+1, 1);
3490: 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  .  sqlite3VdbeAd
34a0: 64 4f 70 33 28 76 2c 20 4f 50 5f 4d 61 6b 65 52  dOp3(v, OP_MakeR
34b0: 65 63 6f 72 64 2c 20 72 65 67 42 61 73 65 2c 20  ecord, regBase, 
34c0: 6e 45 78 70 72 20 2b 20 32 2c 20 72 65 67 52 65  nExpr + 2, regRe
34d0: 63 6f 72 64 29 3b 0a 20 20 73 71 6c 69 74 65 33  cord);.  sqlite3
34e0: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
34f0: 5f 49 64 78 49 6e 73 65 72 74 2c 20 70 4f 72 64  _IdxInsert, pOrd
3500: 65 72 42 79 2d 3e 69 45 43 75 72 73 6f 72 2c 20  erBy->iECursor, 
3510: 72 65 67 52 65 63 6f 72 64 29 3b 0a 20 20 73 71  regRecord);.  sq
3520: 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70  lite3ReleaseTemp
3530: 52 65 67 28 70 50 61 72 73 65 2c 20 72 65 67 52  Reg(pParse, 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 61 6e 67  3ReleaseTempRang
3560: 65 28 70 50 61 72 73 65 2c 20 72 65 67 42 61 73  e(pParse, regBas
3570: 65 2c 20 6e 45 78 70 72 2b 32 29 3b 0a 20 20 69  e, nExpr+2);.  i
3580: 66 28 20 70 53 65 6c 65 63 74 2d 3e 69 4c 69 6d  f( pSelect->iLim
3590: 69 74 20 29 7b 0a 20 20 20 20 69 6e 74 20 61 64  it ){.    int ad
35a0: 64 72 31 2c 20 61 64 64 72 32 3b 0a 20 20 20 20  dr1, addr2;.    
35b0: 69 6e 74 20 69 4c 69 6d 69 74 3b 0a 20 20 20 20  int iLimit;.    
35c0: 69 66 28 20 70 53 65 6c 65 63 74 2d 3e 69 4f 66  if( pSelect->iOf
35d0: 66 73 65 74 20 29 7b 0a 20 20 20 20 20 20 69 4c  fset ){.      iL
35e0: 69 6d 69 74 20 3d 20 70 53 65 6c 65 63 74 2d 3e  imit = pSelect->
35f0: 69 4f 66 66 73 65 74 2b 31 3b 0a 20 20 20 20 7d  iOffset+1;.    }
3600: 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 4c 69 6d  else{.      iLim
3610: 69 74 20 3d 20 70 53 65 6c 65 63 74 2d 3e 69 4c  it = pSelect->iL
3620: 69 6d 69 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20  imit;.    }.    
3630: 61 64 64 72 31 20 3d 20 73 71 6c 69 74 65 33 56  addr1 = sqlite3V
3640: 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f  dbeAddOp1(v, OP_
3650: 49 66 5a 65 72 6f 2c 20 69 4c 69 6d 69 74 29 3b  IfZero, iLimit);
3660: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
3670: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 41 64 64  AddOp2(v, OP_Add
3680: 49 6d 6d 2c 20 69 4c 69 6d 69 74 2c 20 2d 31 29  Imm, iLimit, -1)
3690: 3b 0a 20 20 20 20 61 64 64 72 32 20 3d 20 73 71  ;.    addr2 = sq
36a0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 30 28  lite3VdbeAddOp0(
36b0: 76 2c 20 4f 50 5f 47 6f 74 6f 29 3b 0a 20 20 20  v, OP_Goto);.   
36c0: 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70   sqlite3VdbeJump
36d0: 48 65 72 65 28 76 2c 20 61 64 64 72 31 29 3b 0a  Here(v, addr1);.
36e0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
36f0: 64 64 4f 70 31 28 76 2c 20 4f 50 5f 4c 61 73 74  ddOp1(v, OP_Last
3700: 2c 20 70 4f 72 64 65 72 42 79 2d 3e 69 45 43 75  , pOrderBy->iECu
3710: 72 73 6f 72 29 3b 0a 20 20 20 20 73 71 6c 69 74  rsor);.    sqlit
3720: 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20  e3VdbeAddOp1(v, 
3730: 4f 50 5f 44 65 6c 65 74 65 2c 20 70 4f 72 64 65  OP_Delete, pOrde
3740: 72 42 79 2d 3e 69 45 43 75 72 73 6f 72 29 3b 0a  rBy->iECursor);.
3750: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a      sqlite3VdbeJ
3760: 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72 32  umpHere(v, addr2
3770: 29 3b 0a 20 20 20 20 70 53 65 6c 65 63 74 2d 3e  );.    pSelect->
3780: 69 4c 69 6d 69 74 20 3d 20 30 3b 0a 20 20 7d 0a  iLimit = 0;.  }.
3790: 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 63 6f 64  }../*.** Add cod
37a0: 65 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 74  e to implement t
37b0: 68 65 20 4f 46 46 53 45 54 0a 2a 2f 0a 73 74 61  he OFFSET.*/.sta
37c0: 74 69 63 20 76 6f 69 64 20 63 6f 64 65 4f 66 66  tic void codeOff
37d0: 73 65 74 28 0a 20 20 56 64 62 65 20 2a 76 2c 20  set(.  Vdbe *v, 
37e0: 20 20 20 20 20 20 20 20 20 2f 2a 20 47 65 6e 65           /* Gene
37f0: 72 61 74 65 20 63 6f 64 65 20 69 6e 74 6f 20 74  rate code into t
3800: 68 69 73 20 56 4d 20 2a 2f 0a 20 20 53 65 6c 65  his VM */.  Sele
3810: 63 74 20 2a 70 2c 20 20 20 20 20 20 20 20 2f 2a  ct *p,        /*
3820: 20 54 68 65 20 53 45 4c 45 43 54 20 73 74 61 74   The SELECT stat
3830: 65 6d 65 6e 74 20 62 65 69 6e 67 20 63 6f 64 65  ement being code
3840: 64 20 2a 2f 0a 20 20 69 6e 74 20 69 43 6f 6e 74  d */.  int iCont
3850: 69 6e 75 65 20 20 20 20 20 2f 2a 20 4a 75 6d 70  inue     /* Jump
3860: 20 68 65 72 65 20 74 6f 20 73 6b 69 70 20 74 68   here to skip th
3870: 65 20 63 75 72 72 65 6e 74 20 72 65 63 6f 72 64  e current record
3880: 20 2a 2f 0a 29 7b 0a 20 20 69 66 28 20 70 2d 3e   */.){.  if( p->
3890: 69 4f 66 66 73 65 74 20 26 26 20 69 43 6f 6e 74  iOffset && iCont
38a0: 69 6e 75 65 21 3d 30 20 29 7b 0a 20 20 20 20 69  inue!=0 ){.    i
38b0: 6e 74 20 61 64 64 72 3b 0a 20 20 20 20 73 71 6c  nt addr;.    sql
38c0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
38d0: 2c 20 4f 50 5f 41 64 64 49 6d 6d 2c 20 70 2d 3e  , OP_AddImm, p->
38e0: 69 4f 66 66 73 65 74 2c 20 2d 31 29 3b 0a 20 20  iOffset, -1);.  
38f0: 20 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65 33    addr = sqlite3
3900: 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50  VdbeAddOp1(v, OP
3910: 5f 49 66 4e 65 67 2c 20 70 2d 3e 69 4f 66 66 73  _IfNeg, p->iOffs
3920: 65 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  et);.    sqlite3
3930: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
3940: 5f 47 6f 74 6f 2c 20 30 2c 20 69 43 6f 6e 74 69  _Goto, 0, iConti
3950: 6e 75 65 29 3b 0a 20 20 20 20 56 64 62 65 43 6f  nue);.    VdbeCo
3960: 6d 6d 65 6e 74 28 28 76 2c 20 22 73 6b 69 70 20  mment((v, "skip 
3970: 4f 46 46 53 45 54 20 72 65 63 6f 72 64 73 22 29  OFFSET records")
3980: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
3990: 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64  beJumpHere(v, ad
39a0: 64 72 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  dr);.  }.}../*.*
39b0: 2a 20 41 64 64 20 63 6f 64 65 20 74 68 61 74 20  * Add code that 
39c0: 77 69 6c 6c 20 63 68 65 63 6b 20 74 6f 20 6d 61  will check to ma
39d0: 6b 65 20 73 75 72 65 20 74 68 65 20 4e 20 72 65  ke sure the N re
39e0: 67 69 73 74 65 72 73 20 73 74 61 72 74 69 6e 67  gisters starting
39f0: 20 61 74 20 69 4d 65 6d 0a 2a 2a 20 66 6f 72 6d   at iMem.** form
3a00: 20 61 20 64 69 73 74 69 6e 63 74 20 65 6e 74 72   a distinct entr
3a10: 79 2e 20 20 69 54 61 62 20 69 73 20 61 20 73 6f  y.  iTab is a so
3a20: 72 74 69 6e 67 20 69 6e 64 65 78 20 74 68 61 74  rting index that
3a30: 20 68 6f 6c 64 73 20 70 72 65 76 69 6f 75 73 6c   holds previousl
3a40: 79 0a 2a 2a 20 73 65 65 6e 20 63 6f 6d 62 69 6e  y.** seen combin
3a50: 61 74 69 6f 6e 73 20 6f 66 20 74 68 65 20 4e 20  ations of the N 
3a60: 76 61 6c 75 65 73 2e 20 20 41 20 6e 65 77 20 65  values.  A new e
3a70: 6e 74 72 79 20 69 73 20 6d 61 64 65 20 69 6e 20  ntry is made in 
3a80: 69 54 61 62 0a 2a 2a 20 69 66 20 74 68 65 20 63  iTab.** if the c
3a90: 75 72 72 65 6e 74 20 4e 20 76 61 6c 75 65 73 20  urrent N values 
3aa0: 61 72 65 20 6e 65 77 2e 0a 2a 2a 0a 2a 2a 20 41  are new..**.** A
3ab0: 20 6a 75 6d 70 20 74 6f 20 61 64 64 72 52 65 70   jump to addrRep
3ac0: 65 61 74 20 69 73 20 6d 61 64 65 20 61 6e 64 20  eat is made and 
3ad0: 74 68 65 20 4e 2b 31 20 76 61 6c 75 65 73 20 61  the N+1 values a
3ae0: 72 65 20 70 6f 70 70 65 64 20 66 72 6f 6d 20 74  re popped from t
3af0: 68 65 0a 2a 2a 20 73 74 61 63 6b 20 69 66 20 74  he.** stack if t
3b00: 68 65 20 74 6f 70 20 4e 20 65 6c 65 6d 65 6e 74  he top N element
3b10: 73 20 61 72 65 20 6e 6f 74 20 64 69 73 74 69 6e  s are not distin
3b20: 63 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ct..*/.static vo
3b30: 69 64 20 63 6f 64 65 44 69 73 74 69 6e 63 74 28  id codeDistinct(
3b40: 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
3b50: 2c 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67  ,     /* Parsing
3b60: 20 61 6e 64 20 63 6f 64 65 20 67 65 6e 65 72 61   and code genera
3b70: 74 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  ting context */.
3b80: 20 20 69 6e 74 20 69 54 61 62 2c 20 20 20 20 20    int iTab,     
3b90: 20 20 20 20 20 2f 2a 20 41 20 73 6f 72 74 69 6e       /* A sortin
3ba0: 67 20 69 6e 64 65 78 20 75 73 65 64 20 74 6f 20  g index used to 
3bb0: 74 65 73 74 20 66 6f 72 20 64 69 73 74 69 6e 63  test for distinc
3bc0: 74 6e 65 73 73 20 2a 2f 0a 20 20 69 6e 74 20 61  tness */.  int a
3bd0: 64 64 72 52 65 70 65 61 74 2c 20 20 20 20 2f 2a  ddrRepeat,    /*
3be0: 20 4a 75 6d 70 20 74 6f 20 68 65 72 65 20 69 66   Jump to here if
3bf0: 20 6e 6f 74 20 64 69 73 74 69 6e 63 74 20 2a 2f   not distinct */
3c00: 0a 20 20 69 6e 74 20 4e 2c 20 20 20 20 20 20 20  .  int N,       
3c10: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
3c20: 6f 66 20 65 6c 65 6d 65 6e 74 73 20 2a 2f 0a 20  of elements */. 
3c30: 20 69 6e 74 20 69 4d 65 6d 20 20 20 20 20 20 20   int iMem       
3c40: 20 20 20 20 2f 2a 20 46 69 72 73 74 20 65 6c 65      /* First ele
3c50: 6d 65 6e 74 20 2a 2f 0a 29 7b 0a 20 20 56 64 62  ment */.){.  Vdb
3c60: 65 20 2a 76 3b 0a 20 20 69 6e 74 20 72 31 3b 0a  e *v;.  int r1;.
3c70: 0a 20 20 76 20 3d 20 70 50 61 72 73 65 2d 3e 70  .  v = pParse->p
3c80: 56 64 62 65 3b 0a 20 20 72 31 20 3d 20 73 71 6c  Vdbe;.  r1 = sql
3c90: 69 74 65 33 47 65 74 54 65 6d 70 52 65 67 28 70  ite3GetTempReg(p
3ca0: 50 61 72 73 65 29 3b 0a 20 20 73 71 6c 69 74 65  Parse);.  sqlite
3cb0: 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
3cc0: 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20 69 4d  P_MakeRecord, iM
3cd0: 65 6d 2c 20 4e 2c 20 72 31 29 3b 0a 20 20 73 71  em, N, r1);.  sq
3ce0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
3cf0: 76 2c 20 4f 50 5f 46 6f 75 6e 64 2c 20 69 54 61  v, OP_Found, iTa
3d00: 62 2c 20 61 64 64 72 52 65 70 65 61 74 2c 20 72  b, addrRepeat, r
3d10: 31 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  1);.  sqlite3Vdb
3d20: 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 64  eAddOp2(v, OP_Id
3d30: 78 49 6e 73 65 72 74 2c 20 69 54 61 62 2c 20 72  xInsert, iTab, r
3d40: 31 29 3b 0a 20 20 73 71 6c 69 74 65 33 52 65 6c  1);.  sqlite3Rel
3d50: 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72  easeTempReg(pPar
3d60: 73 65 2c 20 72 31 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  se, r1);.}../*.*
3d70: 2a 20 47 65 6e 65 72 61 74 65 20 61 6e 20 65 72  * Generate an er
3d80: 72 6f 72 20 6d 65 73 73 61 67 65 20 77 68 65 6e  ror message when
3d90: 20 61 20 53 45 4c 45 43 54 20 69 73 20 75 73 65   a SELECT is use
3da0: 64 20 77 69 74 68 69 6e 20 61 20 73 75 62 65 78  d within a subex
3db0: 70 72 65 73 73 69 6f 6e 0a 2a 2a 20 28 65 78 61  pression.** (exa
3dc0: 6d 70 6c 65 3a 20 20 22 61 20 49 4e 20 28 53 45  mple:  "a IN (SE
3dd0: 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 61 62 6c  LECT * FROM tabl
3de0: 65 29 22 29 20 62 75 74 20 69 74 20 68 61 73 20  e)") but it has 
3df0: 6d 6f 72 65 20 74 68 61 6e 20 31 20 72 65 73 75  more than 1 resu
3e00: 6c 74 0a 2a 2a 20 63 6f 6c 75 6d 6e 2e 20 20 57  lt.** column.  W
3e10: 65 20 64 6f 20 74 68 69 73 20 69 6e 20 61 20 73  e do this in a s
3e20: 75 62 72 6f 75 74 69 6e 65 20 62 65 63 61 75 73  ubroutine becaus
3e30: 65 20 74 68 65 20 65 72 72 6f 72 20 6f 63 63 75  e the error occu
3e40: 72 73 20 69 6e 20 6d 75 6c 74 69 70 6c 65 0a 2a  rs in multiple.*
3e50: 2a 20 70 6c 61 63 65 73 2e 0a 2a 2f 0a 73 74 61  * places..*/.sta
3e60: 74 69 63 20 69 6e 74 20 63 68 65 63 6b 46 6f 72  tic int checkFor
3e70: 4d 75 6c 74 69 43 6f 6c 75 6d 6e 53 65 6c 65 63  MultiColumnSelec
3e80: 74 45 72 72 6f 72 28 0a 20 20 50 61 72 73 65 20  tError(.  Parse 
3e90: 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 2f  *pParse,       /
3ea0: 2a 20 50 61 72 73 65 20 63 6f 6e 74 65 78 74 2e  * Parse context.
3eb0: 20 2a 2f 0a 20 20 53 65 6c 65 63 74 44 65 73 74   */.  SelectDest
3ec0: 20 2a 70 44 65 73 74 2c 20 20 20 2f 2a 20 44 65   *pDest,   /* De
3ed0: 73 74 69 6e 61 74 69 6f 6e 20 6f 66 20 53 45 4c  stination of SEL
3ee0: 45 43 54 20 72 65 73 75 6c 74 73 20 2a 2f 0a 20  ECT results */. 
3ef0: 20 69 6e 74 20 6e 45 78 70 72 20 20 20 20 20 20   int nExpr      
3f00: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
3f10: 6f 66 20 72 65 73 75 6c 74 20 63 6f 6c 75 6d 6e  of result column
3f20: 73 20 72 65 74 75 72 6e 65 64 20 62 79 20 53 45  s returned by SE
3f30: 4c 45 43 54 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  LECT */.){.  int
3f40: 20 65 44 65 73 74 20 3d 20 70 44 65 73 74 2d 3e   eDest = pDest->
3f50: 65 44 65 73 74 3b 0a 20 20 69 66 28 20 6e 45 78  eDest;.  if( nEx
3f60: 70 72 3e 31 20 26 26 20 28 65 44 65 73 74 3d 3d  pr>1 && (eDest==
3f70: 53 52 54 5f 4d 65 6d 20 7c 7c 20 65 44 65 73 74  SRT_Mem || eDest
3f80: 3d 3d 53 52 54 5f 53 65 74 29 20 29 7b 0a 20 20  ==SRT_Set) ){.  
3f90: 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
3fa0: 67 28 70 50 61 72 73 65 2c 20 22 6f 6e 6c 79 20  g(pParse, "only 
3fb0: 61 20 73 69 6e 67 6c 65 20 72 65 73 75 6c 74 20  a single result 
3fc0: 61 6c 6c 6f 77 65 64 20 66 6f 72 20 22 0a 20 20  allowed for ".  
3fd0: 20 20 20 20 20 22 61 20 53 45 4c 45 43 54 20 74       "a SELECT t
3fe0: 68 61 74 20 69 73 20 70 61 72 74 20 6f 66 20 61  hat is part of a
3ff0: 6e 20 65 78 70 72 65 73 73 69 6f 6e 22 29 3b 0a  n expression");.
4000: 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20      return 1;.  
4010: 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65 74 75 72  }else{.    retur
4020: 6e 20 30 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  n 0;.  }.}../*.*
4030: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 67  * This routine g
4040: 65 6e 65 72 61 74 65 73 20 74 68 65 20 63 6f 64  enerates the cod
4050: 65 20 66 6f 72 20 74 68 65 20 69 6e 73 69 64 65  e for the inside
4060: 20 6f 66 20 74 68 65 20 69 6e 6e 65 72 20 6c 6f   of the inner lo
4070: 6f 70 0a 2a 2a 20 6f 66 20 61 20 53 45 4c 45 43  op.** of a SELEC
4080: 54 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 73 72 63 54  T..**.** If srcT
4090: 61 62 20 61 6e 64 20 6e 43 6f 6c 75 6d 6e 20 61  ab and nColumn a
40a0: 72 65 20 62 6f 74 68 20 7a 65 72 6f 2c 20 74 68  re both zero, th
40b0: 65 6e 20 74 68 65 20 70 45 4c 69 73 74 20 65 78  en the pEList ex
40c0: 70 72 65 73 73 69 6f 6e 73 0a 2a 2a 20 61 72 65  pressions.** are
40d0: 20 65 76 61 6c 75 61 74 65 64 20 69 6e 20 6f 72   evaluated in or
40e0: 64 65 72 20 74 6f 20 67 65 74 20 74 68 65 20 64  der to get the d
40f0: 61 74 61 20 66 6f 72 20 74 68 69 73 20 72 6f 77  ata for this row
4100: 2e 20 20 49 66 20 6e 43 6f 6c 75 6d 6e 3e 30 0a  .  If nColumn>0.
4110: 2a 2a 20 74 68 65 6e 20 64 61 74 61 20 69 73 20  ** then data is 
4120: 70 75 6c 6c 65 64 20 66 72 6f 6d 20 73 72 63 54  pulled from srcT
4130: 61 62 20 61 6e 64 20 70 45 4c 69 73 74 20 69 73  ab and pEList is
4140: 20 75 73 65 64 20 6f 6e 6c 79 20 74 6f 20 67 65   used only to ge
4150: 74 20 74 68 65 0a 2a 2a 20 64 61 74 61 74 79 70  t the.** datatyp
4160: 65 73 20 66 6f 72 20 65 61 63 68 20 63 6f 6c 75  es for each colu
4170: 6d 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  mn..*/.static vo
4180: 69 64 20 73 65 6c 65 63 74 49 6e 6e 65 72 4c 6f  id selectInnerLo
4190: 6f 70 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  op(.  Parse *pPa
41a0: 72 73 65 2c 20 20 20 20 20 20 20 20 20 20 2f 2a  rse,          /*
41b0: 20 54 68 65 20 70 61 72 73 65 72 20 63 6f 6e 74   The parser cont
41c0: 65 78 74 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20  ext */.  Select 
41d0: 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  *p,             
41e0: 20 2f 2a 20 54 68 65 20 63 6f 6d 70 6c 65 74 65   /* The complete
41f0: 20 73 65 6c 65 63 74 20 73 74 61 74 65 6d 65 6e   select statemen
4200: 74 20 62 65 69 6e 67 20 63 6f 64 65 64 20 2a 2f  t being coded */
4210: 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c  .  ExprList *pEL
4220: 69 73 74 2c 20 20 20 20 20 20 20 2f 2a 20 4c 69  ist,       /* Li
4230: 73 74 20 6f 66 20 76 61 6c 75 65 73 20 62 65 69  st of values bei
4240: 6e 67 20 65 78 74 72 61 63 74 65 64 20 2a 2f 0a  ng extracted */.
4250: 20 20 69 6e 74 20 73 72 63 54 61 62 2c 20 20 20    int srcTab,   
4260: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 75 6c            /* Pul
4270: 6c 20 64 61 74 61 20 66 72 6f 6d 20 74 68 69 73  l data from this
4280: 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20   table */.  int 
4290: 6e 43 6f 6c 75 6d 6e 2c 20 20 20 20 20 20 20 20  nColumn,        
42a0: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
42b0: 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20   columns in the 
42c0: 73 6f 75 72 63 65 20 74 61 62 6c 65 20 2a 2f 0a  source table */.
42d0: 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4f 72 64    ExprList *pOrd
42e0: 65 72 42 79 2c 20 20 20 20 20 2f 2a 20 49 66 20  erBy,     /* If 
42f0: 6e 6f 74 20 4e 55 4c 4c 2c 20 73 6f 72 74 20 72  not NULL, sort r
4300: 65 73 75 6c 74 73 20 75 73 69 6e 67 20 74 68 69  esults using thi
4310: 73 20 6b 65 79 20 2a 2f 0a 20 20 69 6e 74 20 64  s key */.  int d
4320: 69 73 74 69 6e 63 74 2c 20 20 20 20 20 20 20 20  istinct,        
4330: 20 20 20 2f 2a 20 49 66 20 3e 3d 30 2c 20 6d 61     /* If >=0, ma
4340: 6b 65 20 73 75 72 65 20 72 65 73 75 6c 74 73 20  ke sure results 
4350: 61 72 65 20 64 69 73 74 69 6e 63 74 20 2a 2f 0a  are distinct */.
4360: 20 20 53 65 6c 65 63 74 44 65 73 74 20 2a 70 44    SelectDest *pD
4370: 65 73 74 2c 20 20 20 20 20 20 2f 2a 20 48 6f 77  est,      /* How
4380: 20 74 6f 20 64 69 73 70 6f 73 65 20 6f 66 20 74   to dispose of t
4390: 68 65 20 72 65 73 75 6c 74 73 20 2a 2f 0a 20 20  he results */.  
43a0: 69 6e 74 20 69 43 6f 6e 74 69 6e 75 65 2c 20 20  int iContinue,  
43b0: 20 20 20 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20          /* Jump 
43c0: 68 65 72 65 20 74 6f 20 63 6f 6e 74 69 6e 75 65  here to continue
43d0: 20 77 69 74 68 20 6e 65 78 74 20 72 6f 77 20 2a   with next row *
43e0: 2f 0a 20 20 69 6e 74 20 69 42 72 65 61 6b 20 20  /.  int iBreak  
43f0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4a              /* J
4400: 75 6d 70 20 68 65 72 65 20 74 6f 20 62 72 65 61  ump here to brea
4410: 6b 20 6f 75 74 20 6f 66 20 74 68 65 20 69 6e 6e  k out of the inn
4420: 65 72 20 6c 6f 6f 70 20 2a 2f 0a 29 7b 0a 20 20  er loop */.){.  
4430: 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65  Vdbe *v = pParse
4440: 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74 20 69  ->pVdbe;.  int i
4450: 3b 0a 20 20 69 6e 74 20 68 61 73 44 69 73 74 69  ;.  int hasDisti
4460: 6e 63 74 3b 20 20 20 20 20 20 20 20 2f 2a 20 54  nct;        /* T
4470: 72 75 65 20 69 66 20 74 68 65 20 44 49 53 54 49  rue if the DISTI
4480: 4e 43 54 20 6b 65 79 77 6f 72 64 20 69 73 20 70  NCT keyword is p
4490: 72 65 73 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20  resent */.  int 
44a0: 72 65 67 52 65 73 75 6c 74 3b 20 20 20 20 20 20  regResult;      
44b0: 20 20 20 20 20 20 20 20 2f 2a 20 53 74 61 72 74          /* Start
44c0: 20 6f 66 20 6d 65 6d 6f 72 79 20 68 6f 6c 64 69   of memory holdi
44d0: 6e 67 20 72 65 73 75 6c 74 20 73 65 74 20 2a 2f  ng result set */
44e0: 0a 20 20 69 6e 74 20 65 44 65 73 74 20 3d 20 70  .  int eDest = p
44f0: 44 65 73 74 2d 3e 65 44 65 73 74 3b 20 20 20 2f  Dest->eDest;   /
4500: 2a 20 48 6f 77 20 74 6f 20 64 69 73 70 6f 73 65  * How to dispose
4510: 20 6f 66 20 72 65 73 75 6c 74 73 20 2a 2f 0a 20   of results */. 
4520: 20 69 6e 74 20 69 50 61 72 6d 20 3d 20 70 44 65   int iParm = pDe
4530: 73 74 2d 3e 69 50 61 72 6d 3b 20 20 20 2f 2a 20  st->iParm;   /* 
4540: 46 69 72 73 74 20 61 72 67 75 6d 65 6e 74 20 74  First argument t
4550: 6f 20 64 69 73 70 6f 73 61 6c 20 6d 65 74 68 6f  o disposal metho
4560: 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 52 65 73 75  d */.  int nResu
4570: 6c 74 43 6f 6c 3b 20 20 20 20 20 20 20 20 20 20  ltCol;          
4580: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
4590: 72 65 73 75 6c 74 20 63 6f 6c 75 6d 6e 73 20 2a  result columns *
45a0: 2f 0a 0a 20 20 69 66 28 20 76 3d 3d 30 20 29 20  /..  if( v==0 ) 
45b0: 72 65 74 75 72 6e 3b 0a 20 20 61 73 73 65 72 74  return;.  assert
45c0: 28 20 70 45 4c 69 73 74 21 3d 30 20 29 3b 0a 20  ( pEList!=0 );. 
45d0: 20 68 61 73 44 69 73 74 69 6e 63 74 20 3d 20 64   hasDistinct = d
45e0: 69 73 74 69 6e 63 74 3e 3d 30 3b 0a 20 20 69 66  istinct>=0;.  if
45f0: 28 20 70 4f 72 64 65 72 42 79 3d 3d 30 20 26 26  ( pOrderBy==0 &&
4600: 20 21 68 61 73 44 69 73 74 69 6e 63 74 20 29 7b   !hasDistinct ){
4610: 0a 20 20 20 20 63 6f 64 65 4f 66 66 73 65 74 28  .    codeOffset(
4620: 76 2c 20 70 2c 20 69 43 6f 6e 74 69 6e 75 65 29  v, p, iContinue)
4630: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 50 75 6c 6c  ;.  }..  /* Pull
4640: 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20 63   the requested c
4650: 6f 6c 75 6d 6e 73 2e 0a 20 20 2a 2f 0a 20 20 69  olumns..  */.  i
4660: 66 28 20 6e 43 6f 6c 75 6d 6e 3e 30 20 29 7b 0a  f( nColumn>0 ){.
4670: 20 20 20 20 6e 52 65 73 75 6c 74 43 6f 6c 20 3d      nResultCol =
4680: 20 6e 43 6f 6c 75 6d 6e 3b 0a 20 20 7d 65 6c 73   nColumn;.  }els
4690: 65 7b 0a 20 20 20 20 6e 52 65 73 75 6c 74 43 6f  e{.    nResultCo
46a0: 6c 20 3d 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70  l = pEList->nExp
46b0: 72 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 44 65  r;.  }.  if( pDe
46c0: 73 74 2d 3e 69 4d 65 6d 3d 3d 30 20 29 7b 0a 20  st->iMem==0 ){. 
46d0: 20 20 20 70 44 65 73 74 2d 3e 69 4d 65 6d 20 3d     pDest->iMem =
46e0: 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b 31 3b   pParse->nMem+1;
46f0: 0a 20 20 20 20 70 44 65 73 74 2d 3e 6e 4d 65 6d  .    pDest->nMem
4700: 20 3d 20 6e 52 65 73 75 6c 74 43 6f 6c 3b 0a 20   = nResultCol;. 
4710: 20 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20     pParse->nMem 
4720: 2b 3d 20 6e 52 65 73 75 6c 74 43 6f 6c 3b 0a 20  += nResultCol;. 
4730: 20 7d 65 6c 73 65 20 69 66 28 20 70 44 65 73 74   }else if( pDest
4740: 2d 3e 6e 4d 65 6d 21 3d 6e 52 65 73 75 6c 74 43  ->nMem!=nResultC
4750: 6f 6c 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 69  ol ){.    /* Thi
4760: 73 20 68 61 70 70 65 6e 73 20 77 68 65 6e 20 74  s happens when t
4770: 77 6f 20 53 45 4c 45 43 54 73 20 6f 66 20 61 20  wo SELECTs of a 
4780: 63 6f 6d 70 6f 75 6e 64 20 53 45 4c 45 43 54 20  compound SELECT 
4790: 68 61 76 65 20 64 69 66 66 65 72 69 6e 67 0a 20  have differing. 
47a0: 20 20 20 2a 2a 20 6e 75 6d 62 65 72 73 20 6f 66     ** numbers of
47b0: 20 72 65 73 75 6c 74 20 63 6f 6c 75 6d 6e 73 2e   result columns.
47c0: 20 20 54 68 65 20 65 72 72 6f 72 20 6d 65 73 73    The error mess
47d0: 61 67 65 20 77 69 6c 6c 20 62 65 20 67 65 6e 65  age will be gene
47e0: 72 61 74 65 64 20 62 79 0a 20 20 20 20 2a 2a 20  rated by.    ** 
47f0: 61 20 68 69 67 68 65 72 2d 6c 65 76 65 6c 20 72  a higher-level r
4800: 6f 75 74 69 6e 65 2e 20 2a 2f 0a 20 20 20 20 72  outine. */.    r
4810: 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 72 65 67  eturn;.  }.  reg
4820: 52 65 73 75 6c 74 20 3d 20 70 44 65 73 74 2d 3e  Result = pDest->
4830: 69 4d 65 6d 3b 0a 20 20 69 66 28 20 6e 43 6f 6c  iMem;.  if( nCol
4840: 75 6d 6e 3e 30 20 29 7b 0a 20 20 20 20 66 6f 72  umn>0 ){.    for
4850: 28 69 3d 30 3b 20 69 3c 6e 43 6f 6c 75 6d 6e 3b  (i=0; i<nColumn;
4860: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 73 71 6c   i++){.      sql
4870: 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
4880: 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 73 72 63  , OP_Column, src
4890: 54 61 62 2c 20 69 2c 20 72 65 67 52 65 73 75 6c  Tab, i, regResul
48a0: 74 2b 69 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65  t+i);.    }.  }e
48b0: 6c 73 65 20 69 66 28 20 65 44 65 73 74 21 3d 53  lse if( eDest!=S
48c0: 52 54 5f 45 78 69 73 74 73 20 29 7b 0a 20 20 20  RT_Exists ){.   
48d0: 20 2f 2a 20 49 66 20 74 68 65 20 64 65 73 74 69   /* If the desti
48e0: 6e 61 74 69 6f 6e 20 69 73 20 61 6e 20 45 58 49  nation is an EXI
48f0: 53 54 53 28 2e 2e 2e 29 20 65 78 70 72 65 73 73  STS(...) express
4900: 69 6f 6e 2c 20 74 68 65 20 61 63 74 75 61 6c 0a  ion, the actual.
4910: 20 20 20 20 2a 2a 20 76 61 6c 75 65 73 20 72 65      ** values re
4920: 74 75 72 6e 65 64 20 62 79 20 74 68 65 20 53 45  turned by the SE
4930: 4c 45 43 54 20 61 72 65 20 6e 6f 74 20 72 65 71  LECT are not req
4940: 75 69 72 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20  uired..    */.  
4950: 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64    sqlite3ExprCod
4960: 65 45 78 70 72 4c 69 73 74 28 70 50 61 72 73 65  eExprList(pParse
4970: 2c 20 70 45 4c 69 73 74 2c 20 72 65 67 52 65 73  , pEList, regRes
4980: 75 6c 74 2c 20 65 44 65 73 74 3d 3d 53 52 54 5f  ult, eDest==SRT_
4990: 43 61 6c 6c 62 61 63 6b 29 3b 0a 20 20 7d 0a 20  Callback);.  }. 
49a0: 20 6e 43 6f 6c 75 6d 6e 20 3d 20 6e 52 65 73 75   nColumn = nResu
49b0: 6c 74 43 6f 6c 3b 0a 0a 20 20 2f 2a 20 49 66 20  ltCol;..  /* If 
49c0: 74 68 65 20 44 49 53 54 49 4e 43 54 20 6b 65 79  the DISTINCT key
49d0: 77 6f 72 64 20 77 61 73 20 70 72 65 73 65 6e 74  word was present
49e0: 20 6f 6e 20 74 68 65 20 53 45 4c 45 43 54 20 73   on the SELECT s
49f0: 74 61 74 65 6d 65 6e 74 0a 20 20 2a 2a 20 61 6e  tatement.  ** an
4a00: 64 20 74 68 69 73 20 72 6f 77 20 68 61 73 20 62  d this row has b
4a10: 65 65 6e 20 73 65 65 6e 20 62 65 66 6f 72 65 2c  een seen before,
4a20: 20 74 68 65 6e 20 64 6f 20 6e 6f 74 20 6d 61 6b   then do not mak
4a30: 65 20 74 68 69 73 20 72 6f 77 0a 20 20 2a 2a 20  e this row.  ** 
4a40: 70 61 72 74 20 6f 66 20 74 68 65 20 72 65 73 75  part of the resu
4a50: 6c 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 68  lt..  */.  if( h
4a60: 61 73 44 69 73 74 69 6e 63 74 20 29 7b 0a 20 20  asDistinct ){.  
4a70: 20 20 61 73 73 65 72 74 28 20 70 45 4c 69 73 74    assert( pEList
4a80: 21 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72  !=0 );.    asser
4a90: 74 28 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72  t( pEList->nExpr
4aa0: 3d 3d 6e 43 6f 6c 75 6d 6e 20 29 3b 0a 20 20 20  ==nColumn );.   
4ab0: 20 63 6f 64 65 44 69 73 74 69 6e 63 74 28 70 50   codeDistinct(pP
4ac0: 61 72 73 65 2c 20 64 69 73 74 69 6e 63 74 2c 20  arse, distinct, 
4ad0: 69 43 6f 6e 74 69 6e 75 65 2c 20 6e 43 6f 6c 75  iContinue, nColu
4ae0: 6d 6e 2c 20 72 65 67 52 65 73 75 6c 74 29 3b 0a  mn, regResult);.
4af0: 20 20 20 20 69 66 28 20 70 4f 72 64 65 72 42 79      if( pOrderBy
4b00: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 63 6f 64  ==0 ){.      cod
4b10: 65 4f 66 66 73 65 74 28 76 2c 20 70 2c 20 69 43  eOffset(v, p, iC
4b20: 6f 6e 74 69 6e 75 65 29 3b 0a 20 20 20 20 7d 0a  ontinue);.    }.
4b30: 20 20 7d 0a 0a 20 20 69 66 28 20 63 68 65 63 6b    }..  if( check
4b40: 46 6f 72 4d 75 6c 74 69 43 6f 6c 75 6d 6e 53 65  ForMultiColumnSe
4b50: 6c 65 63 74 45 72 72 6f 72 28 70 50 61 72 73 65  lectError(pParse
4b60: 2c 20 70 44 65 73 74 2c 20 70 45 4c 69 73 74 2d  , pDest, pEList-
4b70: 3e 6e 45 78 70 72 29 20 29 7b 0a 20 20 20 20 72  >nExpr) ){.    r
4b80: 65 74 75 72 6e 3b 0a 20 20 7d 0a 0a 20 20 73 77  eturn;.  }..  sw
4b90: 69 74 63 68 28 20 65 44 65 73 74 20 29 7b 0a 20  itch( eDest ){. 
4ba0: 20 20 20 2f 2a 20 49 6e 20 74 68 69 73 20 6d 6f     /* In this mo
4bb0: 64 65 2c 20 77 72 69 74 65 20 65 61 63 68 20 71  de, write each q
4bc0: 75 65 72 79 20 72 65 73 75 6c 74 20 74 6f 20 74  uery result to t
4bd0: 68 65 20 6b 65 79 20 6f 66 20 74 68 65 20 74 65  he key of the te
4be0: 6d 70 6f 72 61 72 79 0a 20 20 20 20 2a 2a 20 74  mporary.    ** t
4bf0: 61 62 6c 65 20 69 50 61 72 6d 2e 0a 20 20 20 20  able iParm..    
4c00: 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  */.#ifndef SQLIT
4c10: 45 5f 4f 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f  E_OMIT_COMPOUND_
4c20: 53 45 4c 45 43 54 0a 20 20 20 20 63 61 73 65 20  SELECT.    case 
4c30: 53 52 54 5f 55 6e 69 6f 6e 3a 20 7b 0a 20 20 20  SRT_Union: {.   
4c40: 20 20 20 69 6e 74 20 72 31 3b 0a 20 20 20 20 20     int r1;.     
4c50: 20 72 31 20 3d 20 73 71 6c 69 74 65 33 47 65 74   r1 = sqlite3Get
4c60: 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b  TempReg(pParse);
4c70: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
4c80: 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4d  beAddOp3(v, OP_M
4c90: 61 6b 65 52 65 63 6f 72 64 2c 20 72 65 67 52 65  akeRecord, regRe
4ca0: 73 75 6c 74 2c 20 6e 43 6f 6c 75 6d 6e 2c 20 72  sult, nColumn, r
4cb0: 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  1);.      sqlite
4cc0: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
4cd0: 50 5f 49 64 78 49 6e 73 65 72 74 2c 20 69 50 61  P_IdxInsert, iPa
4ce0: 72 6d 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 73  rm, r1);.      s
4cf0: 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d  qlite3ReleaseTem
4d00: 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 31 29  pReg(pParse, r1)
4d10: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
4d20: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 6f 6e     }..    /* Con
4d30: 73 74 72 75 63 74 20 61 20 72 65 63 6f 72 64 20  struct a record 
4d40: 66 72 6f 6d 20 74 68 65 20 71 75 65 72 79 20 72  from the query r
4d50: 65 73 75 6c 74 2c 20 62 75 74 20 69 6e 73 74 65  esult, but inste
4d60: 61 64 20 6f 66 0a 20 20 20 20 2a 2a 20 73 61 76  ad of.    ** sav
4d70: 69 6e 67 20 74 68 61 74 20 72 65 63 6f 72 64 2c  ing that record,
4d80: 20 75 73 65 20 69 74 20 61 73 20 61 20 6b 65 79   use it as a key
4d90: 20 74 6f 20 64 65 6c 65 74 65 20 65 6c 65 6d 65   to delete eleme
4da0: 6e 74 73 20 66 72 6f 6d 0a 20 20 20 20 2a 2a 20  nts from.    ** 
4db0: 74 68 65 20 74 65 6d 70 6f 72 61 72 79 20 74 61  the temporary ta
4dc0: 62 6c 65 20 69 50 61 72 6d 2e 0a 20 20 20 20 2a  ble iParm..    *
4dd0: 2f 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f 45  /.    case SRT_E
4de0: 78 63 65 70 74 3a 20 7b 0a 20 20 20 20 20 20 73  xcept: {.      s
4df0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
4e00: 28 76 2c 20 4f 50 5f 49 64 78 44 65 6c 65 74 65  (v, OP_IdxDelete
4e10: 2c 20 69 50 61 72 6d 2c 20 72 65 67 52 65 73 75  , iParm, regResu
4e20: 6c 74 2c 20 6e 43 6f 6c 75 6d 6e 29 3b 0a 20 20  lt, nColumn);.  
4e30: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
4e40: 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 2f 2a 20  .#endif..    /* 
4e50: 53 74 6f 72 65 20 74 68 65 20 72 65 73 75 6c 74  Store the result
4e60: 20 61 73 20 64 61 74 61 20 75 73 69 6e 67 20 61   as data using a
4e70: 20 75 6e 69 71 75 65 20 6b 65 79 2e 0a 20 20 20   unique key..   
4e80: 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 52 54   */.    case SRT
4e90: 5f 54 61 62 6c 65 3a 0a 20 20 20 20 63 61 73 65  _Table:.    case
4ea0: 20 53 52 54 5f 45 70 68 65 6d 54 61 62 3a 20 7b   SRT_EphemTab: {
4eb0: 0a 20 20 20 20 20 20 69 6e 74 20 72 31 20 3d 20  .      int r1 = 
4ec0: 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65  sqlite3GetTempRe
4ed0: 67 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20  g(pParse);.     
4ee0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
4ef0: 70 33 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63  p3(v, OP_MakeRec
4f00: 6f 72 64 2c 20 72 65 67 52 65 73 75 6c 74 2c 20  ord, regResult, 
4f10: 6e 43 6f 6c 75 6d 6e 2c 20 72 31 29 3b 0a 20 20  nColumn, r1);.  
4f20: 20 20 20 20 69 66 28 20 70 4f 72 64 65 72 42 79      if( pOrderBy
4f30: 20 29 7b 0a 20 20 20 20 20 20 20 20 70 75 73 68   ){.        push
4f40: 4f 6e 74 6f 53 6f 72 74 65 72 28 70 50 61 72 73  OntoSorter(pPars
4f50: 65 2c 20 70 4f 72 64 65 72 42 79 2c 20 70 2c 20  e, pOrderBy, p, 
4f60: 72 31 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  r1);.      }else
4f70: 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 72 32  {.        int r2
4f80: 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d   = sqlite3GetTem
4f90: 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20  pReg(pParse);.  
4fa0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
4fb0: 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 65  eAddOp2(v, OP_Ne
4fc0: 77 52 6f 77 69 64 2c 20 69 50 61 72 6d 2c 20 72  wRowid, iParm, r
4fd0: 32 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  2);.        sqli
4fe0: 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
4ff0: 20 4f 50 5f 49 6e 73 65 72 74 2c 20 69 50 61 72   OP_Insert, iPar
5000: 6d 2c 20 72 31 2c 20 72 32 29 3b 0a 20 20 20 20  m, r1, r2);.    
5010: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43      sqlite3VdbeC
5020: 68 61 6e 67 65 50 35 28 76 2c 20 4f 50 46 4c 41  hangeP5(v, OPFLA
5030: 47 5f 41 50 50 45 4e 44 29 3b 0a 20 20 20 20 20  G_APPEND);.     
5040: 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73     sqlite3Releas
5050: 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c  eTempReg(pParse,
5060: 20 72 32 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20   r2);.      }.  
5070: 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61      sqlite3Relea
5080: 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65  seTempReg(pParse
5090: 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 62 72 65  , r1);.      bre
50a0: 61 6b 3b 0a 20 20 20 20 7d 0a 0a 23 69 66 6e 64  ak;.    }..#ifnd
50b0: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53  ef SQLITE_OMIT_S
50c0: 55 42 51 55 45 52 59 0a 20 20 20 20 2f 2a 20 49  UBQUERY.    /* I
50d0: 66 20 77 65 20 61 72 65 20 63 72 65 61 74 69 6e  f we are creatin
50e0: 67 20 61 20 73 65 74 20 66 6f 72 20 61 6e 20 22  g a set for an "
50f0: 65 78 70 72 20 49 4e 20 28 53 45 4c 45 43 54 20  expr IN (SELECT 
5100: 2e 2e 2e 29 22 20 63 6f 6e 73 74 72 75 63 74 2c  ...)" construct,
5110: 0a 20 20 20 20 2a 2a 20 74 68 65 6e 20 74 68 65  .    ** then the
5120: 72 65 20 73 68 6f 75 6c 64 20 62 65 20 61 20 73  re should be a s
5130: 69 6e 67 6c 65 20 69 74 65 6d 20 6f 6e 20 74 68  ingle item on th
5140: 65 20 73 74 61 63 6b 2e 20 20 57 72 69 74 65 20  e stack.  Write 
5150: 74 68 69 73 0a 20 20 20 20 2a 2a 20 69 74 65 6d  this.    ** item
5160: 20 69 6e 74 6f 20 74 68 65 20 73 65 74 20 74 61   into the set ta
5170: 62 6c 65 20 77 69 74 68 20 62 6f 67 75 73 20 64  ble with bogus d
5180: 61 74 61 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ata..    */.    
5190: 63 61 73 65 20 53 52 54 5f 53 65 74 3a 20 7b 0a  case SRT_Set: {.
51a0: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6e 43        assert( nC
51b0: 6f 6c 75 6d 6e 3d 3d 31 20 29 3b 0a 20 20 20 20  olumn==1 );.    
51c0: 20 20 70 2d 3e 61 66 66 69 6e 69 74 79 20 3d 20    p->affinity = 
51d0: 73 71 6c 69 74 65 33 43 6f 6d 70 61 72 65 41 66  sqlite3CompareAf
51e0: 66 69 6e 69 74 79 28 70 45 4c 69 73 74 2d 3e 61  finity(pEList->a
51f0: 5b 30 5d 2e 70 45 78 70 72 2c 20 70 44 65 73 74  [0].pExpr, pDest
5200: 2d 3e 61 66 66 69 6e 69 74 79 29 3b 0a 20 20 20  ->affinity);.   
5210: 20 20 20 69 66 28 20 70 4f 72 64 65 72 42 79 20     if( pOrderBy 
5220: 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 41 74  ){.        /* At
5230: 20 66 69 72 73 74 20 67 6c 61 6e 63 65 20 79 6f   first glance yo
5240: 75 20 77 6f 75 6c 64 20 74 68 69 6e 6b 20 77 65  u would think we
5250: 20 63 6f 75 6c 64 20 6f 70 74 69 6d 69 7a 65 20   could optimize 
5260: 6f 75 74 20 74 68 65 0a 20 20 20 20 20 20 20 20  out the.        
5270: 2a 2a 20 4f 52 44 45 52 20 42 59 20 69 6e 20 74  ** ORDER BY in t
5280: 68 69 73 20 63 61 73 65 20 73 69 6e 63 65 20 74  his case since t
5290: 68 65 20 6f 72 64 65 72 20 6f 66 20 65 6e 74 72  he order of entr
52a0: 69 65 73 20 69 6e 20 74 68 65 20 73 65 74 0a 20  ies in the set. 
52b0: 20 20 20 20 20 20 20 2a 2a 20 64 6f 65 73 20 6e         ** does n
52c0: 6f 74 20 6d 61 74 74 65 72 2e 20 20 42 75 74 20  ot matter.  But 
52d0: 74 68 65 72 65 20 6d 69 67 68 74 20 62 65 20 61  there might be a
52e0: 20 4c 49 4d 49 54 20 63 6c 61 75 73 65 2c 20 69   LIMIT clause, i
52f0: 6e 20 77 68 69 63 68 0a 20 20 20 20 20 20 20 20  n which.        
5300: 2a 2a 20 63 61 73 65 20 74 68 65 20 6f 72 64 65  ** case the orde
5310: 72 20 64 6f 65 73 20 6d 61 74 74 65 72 20 2a 2f  r does matter */
5320: 0a 20 20 20 20 20 20 20 20 70 75 73 68 4f 6e 74  .        pushOnt
5330: 6f 53 6f 72 74 65 72 28 70 50 61 72 73 65 2c 20  oSorter(pParse, 
5340: 70 4f 72 64 65 72 42 79 2c 20 70 2c 20 72 65 67  pOrderBy, p, reg
5350: 52 65 73 75 6c 74 29 3b 0a 20 20 20 20 20 20 7d  Result);.      }
5360: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 69 6e  else{.        in
5370: 74 20 72 31 20 3d 20 73 71 6c 69 74 65 33 47 65  t r1 = sqlite3Ge
5380: 74 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 29  tTempReg(pParse)
5390: 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
53a0: 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f  3VdbeAddOp4(v, O
53b0: 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20 72 65  P_MakeRecord, re
53c0: 67 52 65 73 75 6c 74 2c 20 31 2c 20 72 31 2c 20  gResult, 1, r1, 
53d0: 26 70 2d 3e 61 66 66 69 6e 69 74 79 2c 20 31 29  &p->affinity, 1)
53e0: 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
53f0: 33 45 78 70 72 43 61 63 68 65 41 66 66 69 6e 69  3ExprCacheAffini
5400: 74 79 43 68 61 6e 67 65 28 70 50 61 72 73 65 2c  tyChange(pParse,
5410: 20 72 65 67 52 65 73 75 6c 74 2c 20 31 29 3b 0a   regResult, 1);.
5420: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
5430: 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
5440: 49 64 78 49 6e 73 65 72 74 2c 20 69 50 61 72 6d  IdxInsert, iParm
5450: 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 20 20 73  , r1);.        s
5460: 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d  qlite3ReleaseTem
5470: 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 31 29  pReg(pParse, r1)
5480: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
5490: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20  break;.    }..  
54a0: 20 20 2f 2a 20 49 66 20 61 6e 79 20 72 6f 77 20    /* If any row 
54b0: 65 78 69 73 74 20 69 6e 20 74 68 65 20 72 65 73  exist in the res
54c0: 75 6c 74 20 73 65 74 2c 20 72 65 63 6f 72 64 20  ult set, record 
54d0: 74 68 61 74 20 66 61 63 74 20 61 6e 64 20 61 62  that fact and ab
54e0: 6f 72 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ort..    */.    
54f0: 63 61 73 65 20 53 52 54 5f 45 78 69 73 74 73 3a  case SRT_Exists:
5500: 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   {.      sqlite3
5510: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
5520: 5f 49 6e 74 65 67 65 72 2c 20 31 2c 20 69 50 61  _Integer, 1, iPa
5530: 72 6d 29 3b 0a 20 20 20 20 20 20 2f 2a 20 54 68  rm);.      /* Th
5540: 65 20 4c 49 4d 49 54 20 63 6c 61 75 73 65 20 77  e LIMIT clause w
5550: 69 6c 6c 20 74 65 72 6d 69 6e 61 74 65 20 74 68  ill terminate th
5560: 65 20 6c 6f 6f 70 20 66 6f 72 20 75 73 20 2a 2f  e loop for us */
5570: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
5580: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74    }..    /* If t
5590: 68 69 73 20 69 73 20 61 20 73 63 61 6c 61 72 20  his is a scalar 
55a0: 73 65 6c 65 63 74 20 74 68 61 74 20 69 73 20 70  select that is p
55b0: 61 72 74 20 6f 66 20 61 6e 20 65 78 70 72 65 73  art of an expres
55c0: 73 69 6f 6e 2c 20 74 68 65 6e 0a 20 20 20 20 2a  sion, then.    *
55d0: 2a 20 73 74 6f 72 65 20 74 68 65 20 72 65 73 75  * store the resu
55e0: 6c 74 73 20 69 6e 20 74 68 65 20 61 70 70 72 6f  lts in the appro
55f0: 70 72 69 61 74 65 20 6d 65 6d 6f 72 79 20 63 65  priate memory ce
5600: 6c 6c 20 61 6e 64 20 62 72 65 61 6b 20 6f 75 74  ll and break out
5610: 0a 20 20 20 20 2a 2a 20 6f 66 20 74 68 65 20 73  .    ** of the s
5620: 63 61 6e 20 6c 6f 6f 70 2e 0a 20 20 20 20 2a 2f  can loop..    */
5630: 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f 4d 65  .    case SRT_Me
5640: 6d 3a 20 7b 0a 20 20 20 20 20 20 61 73 73 65 72  m: {.      asser
5650: 74 28 20 6e 43 6f 6c 75 6d 6e 3d 3d 31 20 29 3b  t( nColumn==1 );
5660: 0a 20 20 20 20 20 20 69 66 28 20 70 4f 72 64 65  .      if( pOrde
5670: 72 42 79 20 29 7b 0a 20 20 20 20 20 20 20 20 70  rBy ){.        p
5680: 75 73 68 4f 6e 74 6f 53 6f 72 74 65 72 28 70 50  ushOntoSorter(pP
5690: 61 72 73 65 2c 20 70 4f 72 64 65 72 42 79 2c 20  arse, pOrderBy, 
56a0: 70 2c 20 72 65 67 52 65 73 75 6c 74 29 3b 0a 20  p, regResult);. 
56b0: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
56c0: 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
56d0: 6f 64 65 4d 6f 76 65 28 70 50 61 72 73 65 2c 20  odeMove(pParse, 
56e0: 72 65 67 52 65 73 75 6c 74 2c 20 69 50 61 72 6d  regResult, iParm
56f0: 2c 20 31 29 3b 0a 20 20 20 20 20 20 20 20 2f 2a  , 1);.        /*
5700: 20 54 68 65 20 4c 49 4d 49 54 20 63 6c 61 75 73   The LIMIT claus
5710: 65 20 77 69 6c 6c 20 6a 75 6d 70 20 6f 75 74 20  e will jump out 
5720: 6f 66 20 74 68 65 20 6c 6f 6f 70 20 66 6f 72 20  of the loop for 
5730: 75 73 20 2a 2f 0a 20 20 20 20 20 20 7d 0a 20 20  us */.      }.  
5740: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
5750: 0a 23 65 6e 64 69 66 20 2f 2a 20 23 69 66 6e 64  .#endif /* #ifnd
5760: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53  ef SQLITE_OMIT_S
5770: 55 42 51 55 45 52 59 20 2a 2f 0a 0a 20 20 20 20  UBQUERY */..    
5780: 2f 2a 20 53 65 6e 64 20 74 68 65 20 64 61 74 61  /* Send the data
5790: 20 74 6f 20 74 68 65 20 63 61 6c 6c 62 61 63 6b   to the callback
57a0: 20 66 75 6e 63 74 69 6f 6e 20 6f 72 20 74 6f 20   function or to 
57b0: 61 20 73 75 62 72 6f 75 74 69 6e 65 2e 20 20 49  a subroutine.  I
57c0: 6e 20 74 68 65 0a 20 20 20 20 2a 2a 20 63 61 73  n the.    ** cas
57d0: 65 20 6f 66 20 61 20 73 75 62 72 6f 75 74 69 6e  e of a subroutin
57e0: 65 2c 20 74 68 65 20 73 75 62 72 6f 75 74 69 6e  e, the subroutin
57f0: 65 20 69 74 73 65 6c 66 20 69 73 20 72 65 73 70  e itself is resp
5800: 6f 6e 73 69 62 6c 65 20 66 6f 72 0a 20 20 20 20  onsible for.    
5810: 2a 2a 20 70 6f 70 70 69 6e 67 20 74 68 65 20 64  ** popping the d
5820: 61 74 61 20 66 72 6f 6d 20 74 68 65 20 73 74 61  ata from the sta
5830: 63 6b 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63  ck..    */.    c
5840: 61 73 65 20 53 52 54 5f 43 6f 72 6f 75 74 69 6e  ase SRT_Coroutin
5850: 65 3a 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f  e:.    case SRT_
5860: 43 61 6c 6c 62 61 63 6b 3a 20 7b 0a 20 20 20 20  Callback: {.    
5870: 20 20 69 66 28 20 70 4f 72 64 65 72 42 79 20 29    if( pOrderBy )
5880: 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 72 31  {.        int r1
5890: 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d   = sqlite3GetTem
58a0: 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20  pReg(pParse);.  
58b0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
58c0: 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4d 61  eAddOp3(v, OP_Ma
58d0: 6b 65 52 65 63 6f 72 64 2c 20 72 65 67 52 65 73  keRecord, regRes
58e0: 75 6c 74 2c 20 6e 43 6f 6c 75 6d 6e 2c 20 72 31  ult, nColumn, r1
58f0: 29 3b 0a 20 20 20 20 20 20 20 20 70 75 73 68 4f  );.        pushO
5900: 6e 74 6f 53 6f 72 74 65 72 28 70 50 61 72 73 65  ntoSorter(pParse
5910: 2c 20 70 4f 72 64 65 72 42 79 2c 20 70 2c 20 72  , pOrderBy, p, r
5920: 31 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  1);.        sqli
5930: 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65  te3ReleaseTempRe
5940: 67 28 70 50 61 72 73 65 2c 20 72 31 29 3b 0a 20  g(pParse, r1);. 
5950: 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 65       }else if( e
5960: 44 65 73 74 3d 3d 53 52 54 5f 43 6f 72 6f 75 74  Dest==SRT_Corout
5970: 69 6e 65 20 29 7b 0a 20 20 20 20 20 20 20 20 73  ine ){.        s
5980: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31  qlite3VdbeAddOp1
5990: 28 76 2c 20 4f 50 5f 59 69 65 6c 64 2c 20 70 44  (v, OP_Yield, pD
59a0: 65 73 74 2d 3e 69 50 61 72 6d 29 3b 0a 20 20 20  est->iParm);.   
59b0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
59c0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
59d0: 4f 70 32 28 76 2c 20 4f 50 5f 52 65 73 75 6c 74  Op2(v, OP_Result
59e0: 52 6f 77 2c 20 72 65 67 52 65 73 75 6c 74 2c 20  Row, regResult, 
59f0: 6e 43 6f 6c 75 6d 6e 29 3b 0a 20 20 20 20 20 20  nColumn);.      
5a00: 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63    sqlite3ExprCac
5a10: 68 65 41 66 66 69 6e 69 74 79 43 68 61 6e 67 65  heAffinityChange
5a20: 28 70 50 61 72 73 65 2c 20 72 65 67 52 65 73 75  (pParse, regResu
5a30: 6c 74 2c 20 6e 43 6f 6c 75 6d 6e 29 3b 0a 20 20  lt, nColumn);.  
5a40: 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61      }.      brea
5a50: 6b 3b 0a 20 20 20 20 7d 0a 0a 23 69 66 20 21 64  k;.    }..#if !d
5a60: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
5a70: 49 54 5f 54 52 49 47 47 45 52 29 0a 20 20 20 20  IT_TRIGGER).    
5a80: 2f 2a 20 44 69 73 63 61 72 64 20 74 68 65 20 72  /* Discard the r
5a90: 65 73 75 6c 74 73 2e 20 20 54 68 69 73 20 69 73  esults.  This is
5aa0: 20 75 73 65 64 20 66 6f 72 20 53 45 4c 45 43 54   used for SELECT
5ab0: 20 73 74 61 74 65 6d 65 6e 74 73 20 69 6e 73 69   statements insi
5ac0: 64 65 0a 20 20 20 20 2a 2a 20 74 68 65 20 62 6f  de.    ** the bo
5ad0: 64 79 20 6f 66 20 61 20 54 52 49 47 47 45 52 2e  dy of a TRIGGER.
5ae0: 20 20 54 68 65 20 70 75 72 70 6f 73 65 20 6f 66    The purpose of
5af0: 20 73 75 63 68 20 73 65 6c 65 63 74 73 20 69 73   such selects is
5b00: 20 74 6f 20 63 61 6c 6c 0a 20 20 20 20 2a 2a 20   to call.    ** 
5b10: 75 73 65 72 2d 64 65 66 69 6e 65 64 20 66 75 6e  user-defined fun
5b20: 63 74 69 6f 6e 73 20 74 68 61 74 20 68 61 76 65  ctions that have
5b30: 20 73 69 64 65 20 65 66 66 65 63 74 73 2e 20 20   side effects.  
5b40: 57 65 20 64 6f 20 6e 6f 74 20 63 61 72 65 0a 20  We do not care. 
5b50: 20 20 20 2a 2a 20 61 62 6f 75 74 20 74 68 65 20     ** about the 
5b60: 61 63 74 75 61 6c 20 72 65 73 75 6c 74 73 20 6f  actual results o
5b70: 66 20 74 68 65 20 73 65 6c 65 63 74 2e 0a 20 20  f the select..  
5b80: 20 20 2a 2f 0a 20 20 20 20 64 65 66 61 75 6c 74    */.    default
5b90: 3a 20 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74  : {.      assert
5ba0: 28 20 65 44 65 73 74 3d 3d 53 52 54 5f 44 69 73  ( eDest==SRT_Dis
5bb0: 63 61 72 64 20 29 3b 0a 20 20 20 20 20 20 62 72  card );.      br
5bc0: 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69  eak;.    }.#endi
5bd0: 66 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4a 75 6d 70  f.  }..  /* Jump
5be0: 20 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 20 74   to the end of t
5bf0: 68 65 20 6c 6f 6f 70 20 69 66 20 74 68 65 20 4c  he loop if the L
5c00: 49 4d 49 54 20 69 73 20 72 65 61 63 68 65 64 2e  IMIT is reached.
5c10: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 69  .  */.  if( p->i
5c20: 4c 69 6d 69 74 20 29 7b 0a 20 20 20 20 61 73 73  Limit ){.    ass
5c30: 65 72 74 28 20 70 4f 72 64 65 72 42 79 3d 3d 30  ert( pOrderBy==0
5c40: 20 29 3b 20 20 2f 2a 20 49 66 20 74 68 65 72 65   );  /* If there
5c50: 20 69 73 20 61 6e 20 4f 52 44 45 52 20 42 59 2c   is an ORDER BY,
5c60: 20 74 68 65 20 63 61 6c 6c 20 74 6f 0a 20 20 20   the call to.   
5c70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5c80: 20 20 20 20 20 20 20 20 20 2a 2a 20 70 75 73 68           ** push
5c90: 4f 6e 74 6f 53 6f 72 74 65 72 28 29 20 77 6f 75  OntoSorter() wou
5ca0: 6c 64 20 68 61 76 65 20 63 6c 65 61 72 65 64 20  ld have cleared 
5cb0: 70 2d 3e 69 4c 69 6d 69 74 20 2a 2f 0a 20 20 20  p->iLimit */.   
5cc0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
5cd0: 70 32 28 76 2c 20 4f 50 5f 41 64 64 49 6d 6d 2c  p2(v, OP_AddImm,
5ce0: 20 70 2d 3e 69 4c 69 6d 69 74 2c 20 2d 31 29 3b   p->iLimit, -1);
5cf0: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
5d00: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 66 5a  AddOp2(v, OP_IfZ
5d10: 65 72 6f 2c 20 70 2d 3e 69 4c 69 6d 69 74 2c 20  ero, p->iLimit, 
5d20: 69 42 72 65 61 6b 29 3b 0a 20 20 7d 0a 7d 0a 0a  iBreak);.  }.}..
5d30: 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20 61 6e 20 65  /*.** Given an e
5d40: 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 2c 20  xpression list, 
5d50: 67 65 6e 65 72 61 74 65 20 61 20 4b 65 79 49 6e  generate a KeyIn
5d60: 66 6f 20 73 74 72 75 63 74 75 72 65 20 74 68 61  fo structure tha
5d70: 74 20 72 65 63 6f 72 64 73 0a 2a 2a 20 74 68 65  t records.** the
5d80: 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65   collating seque
5d90: 6e 63 65 20 66 6f 72 20 65 61 63 68 20 65 78 70  nce for each exp
5da0: 72 65 73 73 69 6f 6e 20 69 6e 20 74 68 61 74 20  ression in that 
5db0: 65 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 2e  expression list.
5dc0: 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 45 78  .**.** If the Ex
5dd0: 70 72 4c 69 73 74 20 69 73 20 61 6e 20 4f 52 44  prList is an ORD
5de0: 45 52 20 42 59 20 6f 72 20 47 52 4f 55 50 20 42  ER BY or GROUP B
5df0: 59 20 63 6c 61 75 73 65 20 74 68 65 6e 20 74 68  Y clause then th
5e00: 65 20 72 65 73 75 6c 74 69 6e 67 0a 2a 2a 20 4b  e resulting.** K
5e10: 65 79 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65  eyInfo structure
5e20: 20 69 73 20 61 70 70 72 6f 70 72 69 61 74 65 20   is appropriate 
5e30: 66 6f 72 20 69 6e 69 74 69 61 6c 69 7a 69 6e 67  for initializing
5e40: 20 61 20 76 69 72 74 75 61 6c 20 69 6e 64 65 78   a virtual index
5e50: 20 74 6f 0a 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74   to.** implement
5e60: 20 74 68 61 74 20 63 6c 61 75 73 65 2e 20 20 49   that clause.  I
5e70: 66 20 74 68 65 20 45 78 70 72 4c 69 73 74 20 69  f the ExprList i
5e80: 73 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74  s the result set
5e90: 20 6f 66 20 61 20 53 45 4c 45 43 54 0a 2a 2a 20   of a SELECT.** 
5ea0: 74 68 65 6e 20 74 68 65 20 4b 65 79 49 6e 66 6f  then the KeyInfo
5eb0: 20 73 74 72 75 63 74 75 72 65 20 69 73 20 61 70   structure is ap
5ec0: 70 72 6f 70 72 69 61 74 65 20 66 6f 72 20 69 6e  propriate for in
5ed0: 69 74 69 61 6c 69 7a 69 6e 67 20 61 20 76 69 72  itializing a vir
5ee0: 74 75 61 6c 0a 2a 2a 20 69 6e 64 65 78 20 74 6f  tual.** index to
5ef0: 20 69 6d 70 6c 65 6d 65 6e 74 20 61 20 44 49 53   implement a DIS
5f00: 54 49 4e 43 54 20 74 65 73 74 2e 0a 2a 2a 0a 2a  TINCT test..**.*
5f10: 2a 20 53 70 61 63 65 20 74 6f 20 68 6f 6c 64 20  * Space to hold 
5f20: 74 68 65 20 4b 65 79 49 6e 66 6f 20 73 74 72 75  the KeyInfo stru
5f30: 63 74 75 72 65 20 69 73 20 6f 62 74 61 69 6e 20  cture is obtain 
5f40: 66 72 6f 6d 20 6d 61 6c 6c 6f 63 2e 20 20 54 68  from malloc.  Th
5f50: 65 20 63 61 6c 6c 69 6e 67 0a 2a 2a 20 66 75 6e  e calling.** fun
5f60: 63 74 69 6f 6e 20 69 73 20 72 65 73 70 6f 6e 73  ction is respons
5f70: 69 62 6c 65 20 66 6f 72 20 73 65 65 69 6e 67 20  ible for seeing 
5f80: 74 68 61 74 20 74 68 69 73 20 73 74 72 75 63 74  that this struct
5f90: 75 72 65 20 69 73 20 65 76 65 6e 74 75 61 6c 6c  ure is eventuall
5fa0: 79 0a 2a 2a 20 66 72 65 65 64 2e 20 20 41 64 64  y.** freed.  Add
5fb0: 20 74 68 65 20 4b 65 79 49 6e 66 6f 20 73 74 72   the KeyInfo str
5fc0: 75 63 74 75 72 65 20 74 6f 20 74 68 65 20 50 34  ucture to the P4
5fd0: 20 66 69 65 6c 64 20 6f 66 20 61 6e 20 6f 70 63   field of an opc
5fe0: 6f 64 65 20 75 73 69 6e 67 0a 2a 2a 20 50 34 5f  ode using.** P4_
5ff0: 4b 45 59 49 4e 46 4f 5f 48 41 4e 44 4f 46 46 20  KEYINFO_HANDOFF 
6000: 69 73 20 74 68 65 20 75 73 75 61 6c 20 77 61 79  is the usual way
6010: 20 6f 66 20 64 65 61 6c 69 6e 67 20 77 69 74 68   of dealing with
6020: 20 74 68 69 73 2e 0a 2a 2f 0a 73 74 61 74 69 63   this..*/.static
6030: 20 4b 65 79 49 6e 66 6f 20 2a 6b 65 79 49 6e 66   KeyInfo *keyInf
6040: 6f 46 72 6f 6d 45 78 70 72 4c 69 73 74 28 50 61  oFromExprList(Pa
6050: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70  rse *pParse, Exp
6060: 72 4c 69 73 74 20 2a 70 4c 69 73 74 29 7b 0a 20  rList *pList){. 
6070: 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70   sqlite3 *db = p
6080: 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 69 6e 74  Parse->db;.  int
6090: 20 6e 45 78 70 72 3b 0a 20 20 4b 65 79 49 6e 66   nExpr;.  KeyInf
60a0: 6f 20 2a 70 49 6e 66 6f 3b 0a 20 20 73 74 72 75  o *pInfo;.  stru
60b0: 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d  ct ExprList_item
60c0: 20 2a 70 49 74 65 6d 3b 0a 20 20 69 6e 74 20 69   *pItem;.  int i
60d0: 3b 0a 0a 20 20 6e 45 78 70 72 20 3d 20 70 4c 69  ;..  nExpr = pLi
60e0: 73 74 2d 3e 6e 45 78 70 72 3b 0a 20 20 70 49 6e  st->nExpr;.  pIn
60f0: 66 6f 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61  fo = sqlite3DbMa
6100: 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 73 69 7a  llocZero(db, siz
6110: 65 6f 66 28 2a 70 49 6e 66 6f 29 20 2b 20 6e 45  eof(*pInfo) + nE
6120: 78 70 72 2a 28 73 69 7a 65 6f 66 28 43 6f 6c 6c  xpr*(sizeof(Coll
6130: 53 65 71 2a 29 2b 31 29 20 29 3b 0a 20 20 69 66  Seq*)+1) );.  if
6140: 28 20 70 49 6e 66 6f 20 29 7b 0a 20 20 20 20 70  ( pInfo ){.    p
6150: 49 6e 66 6f 2d 3e 61 53 6f 72 74 4f 72 64 65 72  Info->aSortOrder
6160: 20 3d 20 28 75 38 2a 29 26 70 49 6e 66 6f 2d 3e   = (u8*)&pInfo->
6170: 61 43 6f 6c 6c 5b 6e 45 78 70 72 5d 3b 0a 20 20  aColl[nExpr];.  
6180: 20 20 70 49 6e 66 6f 2d 3e 6e 46 69 65 6c 64 20    pInfo->nField 
6190: 3d 20 6e 45 78 70 72 3b 0a 20 20 20 20 70 49 6e  = nExpr;.    pIn
61a0: 66 6f 2d 3e 65 6e 63 20 3d 20 45 4e 43 28 64 62  fo->enc = ENC(db
61b0: 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 2c 20  );.    for(i=0, 
61c0: 70 49 74 65 6d 3d 70 4c 69 73 74 2d 3e 61 3b 20  pItem=pList->a; 
61d0: 69 3c 6e 45 78 70 72 3b 20 69 2b 2b 2c 20 70 49  i<nExpr; i++, pI
61e0: 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 43 6f  tem++){.      Co
61f0: 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 3b 0a 20 20  llSeq *pColl;.  
6200: 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69      pColl = sqli
6210: 74 65 33 45 78 70 72 43 6f 6c 6c 53 65 71 28 70  te3ExprCollSeq(p
6220: 50 61 72 73 65 2c 20 70 49 74 65 6d 2d 3e 70 45  Parse, pItem->pE
6230: 78 70 72 29 3b 0a 20 20 20 20 20 20 69 66 28 20  xpr);.      if( 
6240: 21 70 43 6f 6c 6c 20 29 7b 0a 20 20 20 20 20 20  !pColl ){.      
6250: 20 20 70 43 6f 6c 6c 20 3d 20 64 62 2d 3e 70 44    pColl = db->pD
6260: 66 6c 74 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 7d  fltColl;.      }
6270: 0a 20 20 20 20 20 20 70 49 6e 66 6f 2d 3e 61 43  .      pInfo->aC
6280: 6f 6c 6c 5b 69 5d 20 3d 20 70 43 6f 6c 6c 3b 0a  oll[i] = pColl;.
6290: 20 20 20 20 20 20 70 49 6e 66 6f 2d 3e 61 53 6f        pInfo->aSo
62a0: 72 74 4f 72 64 65 72 5b 69 5d 20 3d 20 70 49 74  rtOrder[i] = pIt
62b0: 65 6d 2d 3e 73 6f 72 74 4f 72 64 65 72 3b 0a 20  em->sortOrder;. 
62c0: 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
62d0: 6e 20 70 49 6e 66 6f 3b 0a 7d 0a 0a 0a 2f 2a 0a  n pInfo;.}.../*.
62e0: 2a 2a 20 49 66 20 74 68 65 20 69 6e 6e 65 72 20  ** If the inner 
62f0: 6c 6f 6f 70 20 77 61 73 20 67 65 6e 65 72 61 74  loop was generat
6300: 65 64 20 75 73 69 6e 67 20 61 20 6e 6f 6e 2d 6e  ed using a non-n
6310: 75 6c 6c 20 70 4f 72 64 65 72 42 79 20 61 72 67  ull pOrderBy arg
6320: 75 6d 65 6e 74 2c 0a 2a 2a 20 74 68 65 6e 20 74  ument,.** then t
6330: 68 65 20 72 65 73 75 6c 74 73 20 77 65 72 65 20  he results were 
6340: 70 6c 61 63 65 64 20 69 6e 20 61 20 73 6f 72 74  placed in a sort
6350: 65 72 2e 20 20 41 66 74 65 72 20 74 68 65 20 6c  er.  After the l
6360: 6f 6f 70 20 69 73 20 74 65 72 6d 69 6e 61 74 65  oop is terminate
6370: 64 0a 2a 2a 20 77 65 20 6e 65 65 64 20 74 6f 20  d.** we need to 
6380: 72 75 6e 20 74 68 65 20 73 6f 72 74 65 72 20 61  run the sorter a
6390: 6e 64 20 6f 75 74 70 75 74 20 74 68 65 20 72 65  nd output the re
63a0: 73 75 6c 74 73 2e 20 20 54 68 65 20 66 6f 6c 6c  sults.  The foll
63b0: 6f 77 69 6e 67 0a 2a 2a 20 72 6f 75 74 69 6e 65  owing.** routine
63c0: 20 67 65 6e 65 72 61 74 65 73 20 74 68 65 20 63   generates the c
63d0: 6f 64 65 20 6e 65 65 64 65 64 20 74 6f 20 64 6f  ode needed to do
63e0: 20 74 68 61 74 2e 0a 2a 2f 0a 73 74 61 74 69 63   that..*/.static
63f0: 20 76 6f 69 64 20 67 65 6e 65 72 61 74 65 53 6f   void generateSo
6400: 72 74 54 61 69 6c 28 0a 20 20 50 61 72 73 65 20  rtTail(.  Parse 
6410: 2a 70 50 61 72 73 65 2c 20 20 20 20 2f 2a 20 50  *pParse,    /* P
6420: 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a  arsing context *
6430: 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 2c 20 20  /.  Select *p,  
6440: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 53 45 4c        /* The SEL
6450: 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f  ECT statement */
6460: 0a 20 20 56 64 62 65 20 2a 76 2c 20 20 20 20 20  .  Vdbe *v,     
6470: 20 20 20 20 20 2f 2a 20 47 65 6e 65 72 61 74 65       /* Generate
6480: 20 63 6f 64 65 20 69 6e 74 6f 20 74 68 69 73 20   code into this 
6490: 56 44 42 45 20 2a 2f 0a 20 20 69 6e 74 20 6e 43  VDBE */.  int nC
64a0: 6f 6c 75 6d 6e 2c 20 20 20 20 20 20 2f 2a 20 4e  olumn,      /* N
64b0: 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73  umber of columns
64c0: 20 6f 66 20 64 61 74 61 20 2a 2f 0a 20 20 53 65   of data */.  Se
64d0: 6c 65 63 74 44 65 73 74 20 2a 70 44 65 73 74 20  lectDest *pDest 
64e0: 2f 2a 20 57 72 69 74 65 20 74 68 65 20 73 6f 72  /* Write the sor
64f0: 74 65 64 20 72 65 73 75 6c 74 73 20 68 65 72 65  ted results here
6500: 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 62 72 6b   */.){.  int brk
6510: 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61   = sqlite3VdbeMa
6520: 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 69 6e  keLabel(v);.  in
6530: 74 20 63 6f 6e 74 20 3d 20 73 71 6c 69 74 65 33  t cont = sqlite3
6540: 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29  VdbeMakeLabel(v)
6550: 3b 0a 20 20 69 6e 74 20 61 64 64 72 3b 0a 20 20  ;.  int addr;.  
6560: 69 6e 74 20 69 54 61 62 3b 0a 20 20 69 6e 74 20  int iTab;.  int 
6570: 70 73 65 75 64 6f 54 61 62 20 3d 20 30 3b 0a 20  pseudoTab = 0;. 
6580: 20 45 78 70 72 4c 69 73 74 20 2a 70 4f 72 64 65   ExprList *pOrde
6590: 72 42 79 20 3d 20 70 2d 3e 70 4f 72 64 65 72 42  rBy = p->pOrderB
65a0: 79 3b 0a 0a 20 20 69 6e 74 20 65 44 65 73 74 20  y;..  int eDest 
65b0: 3d 20 70 44 65 73 74 2d 3e 65 44 65 73 74 3b 0a  = pDest->eDest;.
65c0: 20 20 69 6e 74 20 69 50 61 72 6d 20 3d 20 70 44    int iParm = pD
65d0: 65 73 74 2d 3e 69 50 61 72 6d 3b 0a 0a 20 20 69  est->iParm;..  i
65e0: 6e 74 20 72 65 67 52 6f 77 3b 0a 20 20 69 6e 74  nt regRow;.  int
65f0: 20 72 65 67 52 6f 77 69 64 3b 0a 0a 20 20 69 54   regRowid;..  iT
6600: 61 62 20 3d 20 70 4f 72 64 65 72 42 79 2d 3e 69  ab = pOrderBy->i
6610: 45 43 75 72 73 6f 72 3b 0a 20 20 69 66 28 20 65  ECursor;.  if( e
6620: 44 65 73 74 3d 3d 53 52 54 5f 43 61 6c 6c 62 61  Dest==SRT_Callba
6630: 63 6b 20 7c 7c 20 65 44 65 73 74 3d 3d 53 52 54  ck || eDest==SRT
6640: 5f 43 6f 72 6f 75 74 69 6e 65 20 29 7b 0a 20 20  _Coroutine ){.  
6650: 20 20 70 73 65 75 64 6f 54 61 62 20 3d 20 70 50    pseudoTab = pP
6660: 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20  arse->nTab++;.  
6670: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
6680: 4f 70 32 28 76 2c 20 4f 50 5f 53 65 74 4e 75 6d  Op2(v, OP_SetNum
6690: 43 6f 6c 75 6d 6e 73 2c 20 30 2c 20 6e 43 6f 6c  Columns, 0, nCol
66a0: 75 6d 6e 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  umn);.    sqlite
66b0: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
66c0: 50 5f 4f 70 65 6e 50 73 65 75 64 6f 2c 20 70 73  P_OpenPseudo, ps
66d0: 65 75 64 6f 54 61 62 2c 20 65 44 65 73 74 3d 3d  eudoTab, eDest==
66e0: 53 52 54 5f 43 61 6c 6c 62 61 63 6b 29 3b 0a 20  SRT_Callback);. 
66f0: 20 7d 0a 20 20 61 64 64 72 20 3d 20 31 20 2b 20   }.  addr = 1 + 
6700: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
6710: 32 28 76 2c 20 4f 50 5f 53 6f 72 74 2c 20 69 54  2(v, OP_Sort, iT
6720: 61 62 2c 20 62 72 6b 29 3b 0a 20 20 63 6f 64 65  ab, brk);.  code
6730: 4f 66 66 73 65 74 28 76 2c 20 70 2c 20 63 6f 6e  Offset(v, p, con
6740: 74 29 3b 0a 20 20 72 65 67 52 6f 77 20 3d 20 73  t);.  regRow = s
6750: 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65 67  qlite3GetTempReg
6760: 28 70 50 61 72 73 65 29 3b 0a 20 20 72 65 67 52  (pParse);.  regR
6770: 6f 77 69 64 20 3d 20 73 71 6c 69 74 65 33 47 65  owid = sqlite3Ge
6780: 74 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 29  tTempReg(pParse)
6790: 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41  ;.  sqlite3VdbeA
67a0: 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 6c 75  ddOp3(v, OP_Colu
67b0: 6d 6e 2c 20 69 54 61 62 2c 20 70 4f 72 64 65 72  mn, iTab, pOrder
67c0: 42 79 2d 3e 6e 45 78 70 72 20 2b 20 31 2c 20 72  By->nExpr + 1, r
67d0: 65 67 52 6f 77 29 3b 0a 20 20 73 77 69 74 63 68  egRow);.  switch
67e0: 28 20 65 44 65 73 74 20 29 7b 0a 20 20 20 20 63  ( eDest ){.    c
67f0: 61 73 65 20 53 52 54 5f 54 61 62 6c 65 3a 0a 20  ase SRT_Table:. 
6800: 20 20 20 63 61 73 65 20 53 52 54 5f 45 70 68 65     case SRT_Ephe
6810: 6d 54 61 62 3a 20 7b 0a 20 20 20 20 20 20 73 71  mTab: {.      sq
6820: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
6830: 76 2c 20 4f 50 5f 4e 65 77 52 6f 77 69 64 2c 20  v, OP_NewRowid, 
6840: 69 50 61 72 6d 2c 20 72 65 67 52 6f 77 69 64 29  iParm, regRowid)
6850: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
6860: 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
6870: 49 6e 73 65 72 74 2c 20 69 50 61 72 6d 2c 20 72  Insert, iParm, r
6880: 65 67 52 6f 77 2c 20 72 65 67 52 6f 77 69 64 29  egRow, regRowid)
6890: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
68a0: 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20 4f  dbeChangeP5(v, O
68b0: 50 46 4c 41 47 5f 41 50 50 45 4e 44 29 3b 0a 20  PFLAG_APPEND);. 
68c0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
68d0: 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  }.#ifndef SQLITE
68e0: 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 20  _OMIT_SUBQUERY. 
68f0: 20 20 20 63 61 73 65 20 53 52 54 5f 53 65 74 3a     case SRT_Set:
6900: 20 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28   {.      assert(
6910: 20 6e 43 6f 6c 75 6d 6e 3d 3d 31 20 29 3b 0a 20   nColumn==1 );. 
6920: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
6930: 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 4d 61 6b  AddOp4(v, OP_Mak
6940: 65 52 65 63 6f 72 64 2c 20 72 65 67 52 6f 77 2c  eRecord, regRow,
6950: 20 31 2c 20 72 65 67 52 6f 77 69 64 2c 20 26 70   1, regRowid, &p
6960: 2d 3e 61 66 66 69 6e 69 74 79 2c 20 31 29 3b 0a  ->affinity, 1);.
6970: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
6980: 72 43 61 63 68 65 41 66 66 69 6e 69 74 79 43 68  rCacheAffinityCh
6990: 61 6e 67 65 28 70 50 61 72 73 65 2c 20 72 65 67  ange(pParse, reg
69a0: 52 6f 77 2c 20 31 29 3b 0a 20 20 20 20 20 20 73  Row, 1);.      s
69b0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
69c0: 28 76 2c 20 4f 50 5f 49 64 78 49 6e 73 65 72 74  (v, OP_IdxInsert
69d0: 2c 20 69 50 61 72 6d 2c 20 72 65 67 52 6f 77 69  , iParm, regRowi
69e0: 64 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  d);.      break;
69f0: 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
6a00: 53 52 54 5f 4d 65 6d 3a 20 7b 0a 20 20 20 20 20  SRT_Mem: {.     
6a10: 20 61 73 73 65 72 74 28 20 6e 43 6f 6c 75 6d 6e   assert( nColumn
6a20: 3d 3d 31 20 29 3b 0a 20 20 20 20 20 20 73 71 6c  ==1 );.      sql
6a30: 69 74 65 33 45 78 70 72 43 6f 64 65 4d 6f 76 65  ite3ExprCodeMove
6a40: 28 70 50 61 72 73 65 2c 20 72 65 67 52 6f 77 2c  (pParse, regRow,
6a50: 20 69 50 61 72 6d 2c 20 31 29 3b 0a 20 20 20 20   iParm, 1);.    
6a60: 20 20 2f 2a 20 54 68 65 20 4c 49 4d 49 54 20 63    /* The LIMIT c
6a70: 6c 61 75 73 65 20 77 69 6c 6c 20 74 65 72 6d 69  lause will termi
6a80: 6e 61 74 65 20 74 68 65 20 6c 6f 6f 70 20 66 6f  nate the loop fo
6a90: 72 20 75 73 20 2a 2f 0a 20 20 20 20 20 20 62 72  r us */.      br
6aa0: 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69  eak;.    }.#endi
6ab0: 66 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f 43  f.    case SRT_C
6ac0: 61 6c 6c 62 61 63 6b 3a 0a 20 20 20 20 63 61 73  allback:.    cas
6ad0: 65 20 53 52 54 5f 43 6f 72 6f 75 74 69 6e 65 3a  e SRT_Coroutine:
6ae0: 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 3b 0a   {.      int i;.
6af0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
6b00: 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e  eAddOp2(v, OP_In
6b10: 74 65 67 65 72 2c 20 31 2c 20 72 65 67 52 6f 77  teger, 1, regRow
6b20: 69 64 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  id);.      sqlit
6b30: 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
6b40: 4f 50 5f 49 6e 73 65 72 74 2c 20 70 73 65 75 64  OP_Insert, pseud
6b50: 6f 54 61 62 2c 20 72 65 67 52 6f 77 2c 20 72 65  oTab, regRow, re
6b60: 67 52 6f 77 69 64 29 3b 0a 20 20 20 20 20 20 66  gRowid);.      f
6b70: 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 6f 6c 75 6d  or(i=0; i<nColum
6b80: 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20  n; i++){.       
6b90: 20 61 73 73 65 72 74 28 20 72 65 67 52 6f 77 21   assert( regRow!
6ba0: 3d 70 44 65 73 74 2d 3e 69 4d 65 6d 2b 69 20 29  =pDest->iMem+i )
6bb0: 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
6bc0: 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
6bd0: 50 5f 43 6f 6c 75 6d 6e 2c 20 70 73 65 75 64 6f  P_Column, pseudo
6be0: 54 61 62 2c 20 69 2c 20 70 44 65 73 74 2d 3e 69  Tab, i, pDest->i
6bf0: 4d 65 6d 2b 69 29 3b 0a 20 20 20 20 20 20 7d 0a  Mem+i);.      }.
6c00: 20 20 20 20 20 20 69 66 28 20 65 44 65 73 74 3d        if( eDest=
6c10: 3d 53 52 54 5f 43 61 6c 6c 62 61 63 6b 20 29 7b  =SRT_Callback ){
6c20: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
6c30: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
6c40: 5f 52 65 73 75 6c 74 52 6f 77 2c 20 70 44 65 73  _ResultRow, pDes
6c50: 74 2d 3e 69 4d 65 6d 2c 20 6e 43 6f 6c 75 6d 6e  t->iMem, nColumn
6c60: 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
6c70: 65 33 45 78 70 72 43 61 63 68 65 41 66 66 69 6e  e3ExprCacheAffin
6c80: 69 74 79 43 68 61 6e 67 65 28 70 50 61 72 73 65  ityChange(pParse
6c90: 2c 20 70 44 65 73 74 2d 3e 69 4d 65 6d 2c 20 6e  , pDest->iMem, n
6ca0: 43 6f 6c 75 6d 6e 29 3b 0a 20 20 20 20 20 20 7d  Column);.      }
6cb0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71  else{.        sq
6cc0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28  lite3VdbeAddOp1(
6cd0: 76 2c 20 4f 50 5f 59 69 65 6c 64 2c 20 70 44 65  v, OP_Yield, pDe
6ce0: 73 74 2d 3e 69 50 61 72 6d 29 3b 0a 20 20 20 20  st->iParm);.    
6cf0: 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b    }.      break;
6d00: 0a 20 20 20 20 7d 0a 20 20 20 20 64 65 66 61 75  .    }.    defau
6d10: 6c 74 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20 44  lt: {.      /* D
6d20: 6f 20 6e 6f 74 68 69 6e 67 20 2a 2f 0a 20 20 20  o nothing */.   
6d30: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
6d40: 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 52 65 6c    }.  sqlite3Rel
6d50: 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72  easeTempReg(pPar
6d60: 73 65 2c 20 72 65 67 52 6f 77 29 3b 0a 20 20 73  se, regRow);.  s
6d70: 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d  qlite3ReleaseTem
6d80: 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 65 67  pReg(pParse, reg
6d90: 52 6f 77 69 64 29 3b 0a 0a 20 20 2f 2a 20 4c 49  Rowid);..  /* LI
6da0: 4d 49 54 20 68 61 73 20 62 65 65 6e 20 69 6d 70  MIT has been imp
6db0: 6c 65 6d 65 6e 74 65 64 20 62 79 20 74 68 65 20  lemented by the 
6dc0: 70 75 73 68 4f 6e 74 6f 53 6f 72 74 65 72 28 29  pushOntoSorter()
6dd0: 20 72 6f 75 74 69 6e 65 2e 0a 20 20 2a 2f 0a 20   routine..  */. 
6de0: 20 61 73 73 65 72 74 28 20 70 2d 3e 69 4c 69 6d   assert( p->iLim
6df0: 69 74 3d 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 54  it==0 );..  /* T
6e00: 68 65 20 62 6f 74 74 6f 6d 20 6f 66 20 74 68 65  he bottom of the
6e10: 20 6c 6f 6f 70 0a 20 20 2a 2f 0a 20 20 73 71 6c   loop.  */.  sql
6e20: 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c  ite3VdbeResolveL
6e30: 61 62 65 6c 28 76 2c 20 63 6f 6e 74 29 3b 0a 20  abel(v, cont);. 
6e40: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
6e50: 70 32 28 76 2c 20 4f 50 5f 4e 65 78 74 2c 20 69  p2(v, OP_Next, i
6e60: 54 61 62 2c 20 61 64 64 72 29 3b 0a 20 20 73 71  Tab, addr);.  sq
6e70: 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65  lite3VdbeResolve
6e80: 4c 61 62 65 6c 28 76 2c 20 62 72 6b 29 3b 0a 20  Label(v, brk);. 
6e90: 20 69 66 28 20 65 44 65 73 74 3d 3d 53 52 54 5f   if( eDest==SRT_
6ea0: 43 61 6c 6c 62 61 63 6b 20 7c 7c 20 65 44 65 73  Callback || eDes
6eb0: 74 3d 3d 53 52 54 5f 43 6f 72 6f 75 74 69 6e 65  t==SRT_Coroutine
6ec0: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56   ){.    sqlite3V
6ed0: 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
6ee0: 43 6c 6f 73 65 2c 20 70 73 65 75 64 6f 54 61 62  Close, pseudoTab
6ef0: 2c 20 30 29 3b 0a 20 20 7d 0a 0a 7d 0a 0a 2f 2a  , 0);.  }..}../*
6f00: 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 70 6f 69  .** Return a poi
6f10: 6e 74 65 72 20 74 6f 20 61 20 73 74 72 69 6e 67  nter to a string
6f20: 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20   containing the 
6f30: 27 64 65 63 6c 61 72 61 74 69 6f 6e 20 74 79 70  'declaration typ
6f40: 65 27 20 6f 66 20 74 68 65 0a 2a 2a 20 65 78 70  e' of the.** exp
6f50: 72 65 73 73 69 6f 6e 20 70 45 78 70 72 2e 20 54  ression pExpr. T
6f60: 68 65 20 73 74 72 69 6e 67 20 6d 61 79 20 62 65  he string may be
6f70: 20 74 72 65 61 74 65 64 20 61 73 20 73 74 61 74   treated as stat
6f80: 69 63 20 62 79 20 74 68 65 20 63 61 6c 6c 65 72  ic by the caller
6f90: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 64 65 63 6c  ..**.** The decl
6fa0: 61 72 61 74 69 6f 6e 20 74 79 70 65 20 69 73 20  aration type is 
6fb0: 74 68 65 20 65 78 61 63 74 20 64 61 74 61 74 79  the exact dataty
6fc0: 70 65 20 64 65 66 69 6e 69 74 69 6f 6e 20 65 78  pe definition ex
6fd0: 74 72 61 63 74 65 64 20 66 72 6f 6d 20 74 68 65  tracted from the
6fe0: 0a 2a 2a 20 6f 72 69 67 69 6e 61 6c 20 43 52 45  .** original CRE
6ff0: 41 54 45 20 54 41 42 4c 45 20 73 74 61 74 65 6d  ATE TABLE statem
7000: 65 6e 74 20 69 66 20 74 68 65 20 65 78 70 72 65  ent if the expre
7010: 73 73 69 6f 6e 20 69 73 20 61 20 63 6f 6c 75 6d  ssion is a colum
7020: 6e 2e 20 54 68 65 0a 2a 2a 20 64 65 63 6c 61 72  n. The.** declar
7030: 61 74 69 6f 6e 20 74 79 70 65 20 66 6f 72 20 61  ation type for a
7040: 20 52 4f 57 49 44 20 66 69 65 6c 64 20 69 73 20   ROWID field is 
7050: 49 4e 54 45 47 45 52 2e 20 45 78 61 63 74 6c 79  INTEGER. Exactly
7060: 20 77 68 65 6e 20 61 6e 20 65 78 70 72 65 73 73   when an express
7070: 69 6f 6e 0a 2a 2a 20 69 73 20 63 6f 6e 73 69 64  ion.** is consid
7080: 65 72 65 64 20 61 20 63 6f 6c 75 6d 6e 20 63 61  ered a column ca
7090: 6e 20 62 65 20 63 6f 6d 70 6c 65 78 20 69 6e 20  n be complex in 
70a0: 74 68 65 20 70 72 65 73 65 6e 63 65 20 6f 66 20  the presence of 
70b0: 73 75 62 71 75 65 72 69 65 73 2e 20 54 68 65 0a  subqueries. The.
70c0: 2a 2a 20 72 65 73 75 6c 74 2d 73 65 74 20 65 78  ** result-set ex
70d0: 70 72 65 73 73 69 6f 6e 20 69 6e 20 61 6c 6c 20  pression in all 
70e0: 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  of the following
70f0: 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
7100: 74 73 20 69 73 20 0a 2a 2a 20 63 6f 6e 73 69 64  ts is .** consid
7110: 65 72 65 64 20 61 20 63 6f 6c 75 6d 6e 20 62 79  ered a column by
7120: 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e 0a   this function..
7130: 2a 2a 0a 2a 2a 20 20 20 53 45 4c 45 43 54 20 63  **.**   SELECT c
7140: 6f 6c 20 46 52 4f 4d 20 74 62 6c 3b 0a 2a 2a 20  ol FROM tbl;.** 
7150: 20 20 53 45 4c 45 43 54 20 28 53 45 4c 45 43 54    SELECT (SELECT
7160: 20 63 6f 6c 20 46 52 4f 4d 20 74 62 6c 3b 0a 2a   col FROM tbl;.*
7170: 2a 20 20 20 53 45 4c 45 43 54 20 28 53 45 4c 45  *   SELECT (SELE
7180: 43 54 20 63 6f 6c 20 46 52 4f 4d 20 74 62 6c 29  CT col FROM tbl)
7190: 3b 0a 2a 2a 20 20 20 53 45 4c 45 43 54 20 61 62  ;.**   SELECT ab
71a0: 63 20 46 52 4f 4d 20 28 53 45 4c 45 43 54 20 63  c FROM (SELECT c
71b0: 6f 6c 20 41 53 20 61 62 63 20 46 52 4f 4d 20 74  ol AS abc FROM t
71c0: 62 6c 29 3b 0a 2a 2a 20 0a 2a 2a 20 54 68 65 20  bl);.** .** The 
71d0: 64 65 63 6c 61 72 61 74 69 6f 6e 20 74 79 70 65  declaration type
71e0: 20 66 6f 72 20 61 6e 79 20 65 78 70 72 65 73 73   for any express
71f0: 69 6f 6e 20 6f 74 68 65 72 20 74 68 61 6e 20 61  ion other than a
7200: 20 63 6f 6c 75 6d 6e 20 69 73 20 4e 55 4c 4c 2e   column is NULL.
7210: 0a 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73 74  .*/.static const
7220: 20 63 68 61 72 20 2a 63 6f 6c 75 6d 6e 54 79 70   char *columnTyp
7230: 65 28 0a 20 20 4e 61 6d 65 43 6f 6e 74 65 78 74  e(.  NameContext
7240: 20 2a 70 4e 43 2c 20 0a 20 20 45 78 70 72 20 2a   *pNC, .  Expr *
7250: 70 45 78 70 72 2c 0a 20 20 63 6f 6e 73 74 20 63  pExpr,.  const c
7260: 68 61 72 20 2a 2a 70 7a 4f 72 69 67 69 6e 44 62  har **pzOriginDb
7270: 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  ,.  const char *
7280: 2a 70 7a 4f 72 69 67 69 6e 54 61 62 2c 0a 20 20  *pzOriginTab,.  
7290: 63 6f 6e 73 74 20 63 68 61 72 20 2a 2a 70 7a 4f  const char **pzO
72a0: 72 69 67 69 6e 43 6f 6c 0a 29 7b 0a 20 20 63 68  riginCol.){.  ch
72b0: 61 72 20 63 6f 6e 73 74 20 2a 7a 54 79 70 65 20  ar const *zType 
72c0: 3d 20 30 3b 0a 20 20 63 68 61 72 20 63 6f 6e 73  = 0;.  char cons
72d0: 74 20 2a 7a 4f 72 69 67 69 6e 44 62 20 3d 20 30  t *zOriginDb = 0
72e0: 3b 0a 20 20 63 68 61 72 20 63 6f 6e 73 74 20 2a  ;.  char const *
72f0: 7a 4f 72 69 67 69 6e 54 61 62 20 3d 20 30 3b 0a  zOriginTab = 0;.
7300: 20 20 63 68 61 72 20 63 6f 6e 73 74 20 2a 7a 4f    char const *zO
7310: 72 69 67 69 6e 43 6f 6c 20 3d 20 30 3b 0a 20 20  riginCol = 0;.  
7320: 69 6e 74 20 6a 3b 0a 20 20 69 66 28 20 70 45 78  int j;.  if( pEx
7330: 70 72 3d 3d 30 20 7c 7c 20 70 4e 43 2d 3e 70 53  pr==0 || pNC->pS
7340: 72 63 4c 69 73 74 3d 3d 30 20 29 20 72 65 74 75  rcList==0 ) retu
7350: 72 6e 20 30 3b 0a 0a 20 20 73 77 69 74 63 68 28  rn 0;..  switch(
7360: 20 70 45 78 70 72 2d 3e 6f 70 20 29 7b 0a 20 20   pExpr->op ){.  
7370: 20 20 63 61 73 65 20 54 4b 5f 41 47 47 5f 43 4f    case TK_AGG_CO
7380: 4c 55 4d 4e 3a 0a 20 20 20 20 63 61 73 65 20 54  LUMN:.    case T
7390: 4b 5f 43 4f 4c 55 4d 4e 3a 20 7b 0a 20 20 20 20  K_COLUMN: {.    
73a0: 20 20 2f 2a 20 54 68 65 20 65 78 70 72 65 73 73    /* The express
73b0: 69 6f 6e 20 69 73 20 61 20 63 6f 6c 75 6d 6e 2e  ion is a column.
73c0: 20 4c 6f 63 61 74 65 20 74 68 65 20 74 61 62 6c   Locate the tabl
73d0: 65 20 74 68 65 20 63 6f 6c 75 6d 6e 20 69 73 20  e the column is 
73e0: 62 65 69 6e 67 0a 20 20 20 20 20 20 2a 2a 20 65  being.      ** e
73f0: 78 74 72 61 63 74 65 64 20 66 72 6f 6d 20 69 6e  xtracted from in
7400: 20 4e 61 6d 65 43 6f 6e 74 65 78 74 2e 70 53 72   NameContext.pSr
7410: 63 4c 69 73 74 2e 20 54 68 69 73 20 74 61 62 6c  cList. This tabl
7420: 65 20 6d 61 79 20 62 65 20 72 65 61 6c 0a 20 20  e may be real.  
7430: 20 20 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20      ** database 
7440: 74 61 62 6c 65 20 6f 72 20 61 20 73 75 62 71 75  table or a subqu
7450: 65 72 79 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  ery..      */.  
7460: 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20      Table *pTab 
7470: 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
7480: 2f 2a 20 54 61 62 6c 65 20 73 74 72 75 63 74 75  /* Table structu
7490: 72 65 20 63 6f 6c 75 6d 6e 20 69 73 20 65 78 74  re column is ext
74a0: 72 61 63 74 65 64 20 66 72 6f 6d 20 2a 2f 0a 20  racted from */. 
74b0: 20 20 20 20 20 53 65 6c 65 63 74 20 2a 70 53 20       Select *pS 
74c0: 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
74d0: 20 2f 2a 20 53 65 6c 65 63 74 20 74 68 65 20 63   /* Select the c
74e0: 6f 6c 75 6d 6e 20 69 73 20 65 78 74 72 61 63 74  olumn is extract
74f0: 65 64 20 66 72 6f 6d 20 2a 2f 0a 20 20 20 20 20  ed from */.     
7500: 20 69 6e 74 20 69 43 6f 6c 20 3d 20 70 45 78 70   int iCol = pExp
7510: 72 2d 3e 69 43 6f 6c 75 6d 6e 3b 20 20 2f 2a 20  r->iColumn;  /* 
7520: 49 6e 64 65 78 20 6f 66 20 63 6f 6c 75 6d 6e 20  Index of column 
7530: 69 6e 20 70 54 61 62 20 2a 2f 0a 20 20 20 20 20  in pTab */.     
7540: 20 77 68 69 6c 65 28 20 70 4e 43 20 26 26 20 21   while( pNC && !
7550: 70 54 61 62 20 29 7b 0a 20 20 20 20 20 20 20 20  pTab ){.        
7560: 53 72 63 4c 69 73 74 20 2a 70 54 61 62 4c 69 73  SrcList *pTabLis
7570: 74 20 3d 20 70 4e 43 2d 3e 70 53 72 63 4c 69 73  t = pNC->pSrcLis
7580: 74 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 6a  t;.        for(j
7590: 3d 30 3b 6a 3c 70 54 61 62 4c 69 73 74 2d 3e 6e  =0;j<pTabList->n
75a0: 53 72 63 20 26 26 20 70 54 61 62 4c 69 73 74 2d  Src && pTabList-
75b0: 3e 61 5b 6a 5d 2e 69 43 75 72 73 6f 72 21 3d 70  >a[j].iCursor!=p
75c0: 45 78 70 72 2d 3e 69 54 61 62 6c 65 3b 6a 2b 2b  Expr->iTable;j++
75d0: 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 6a  );.        if( j
75e0: 3c 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 20  <pTabList->nSrc 
75f0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 54 61  ){.          pTa
7600: 62 20 3d 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b  b = pTabList->a[
7610: 6a 5d 2e 70 54 61 62 3b 0a 20 20 20 20 20 20 20  j].pTab;.       
7620: 20 20 20 70 53 20 3d 20 70 54 61 62 4c 69 73 74     pS = pTabList
7630: 2d 3e 61 5b 6a 5d 2e 70 53 65 6c 65 63 74 3b 0a  ->a[j].pSelect;.
7640: 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
7650: 20 20 20 20 20 20 20 20 20 70 4e 43 20 3d 20 70           pNC = p
7660: 4e 43 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20  NC->pNext;.     
7670: 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 0a 20 20     }.      }..  
7680: 20 20 20 20 69 66 28 20 70 54 61 62 3d 3d 30 20      if( pTab==0 
7690: 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 46 49  ){.        /* FI
76a0: 58 20 4d 45 3a 0a 20 20 20 20 20 20 20 20 2a 2a  X ME:.        **
76b0: 20 54 68 69 73 20 63 61 6e 20 6f 63 63 75 72 73   This can occurs
76c0: 20 69 66 20 79 6f 75 20 68 61 76 65 20 73 6f 6d   if you have som
76d0: 65 74 68 69 6e 67 20 6c 69 6b 65 20 22 53 45 4c  ething like "SEL
76e0: 45 43 54 20 6e 65 77 2e 78 3b 22 20 69 6e 73 69  ECT new.x;" insi
76f0: 64 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 20  de.        ** a 
7700: 74 72 69 67 67 65 72 2e 20 20 49 6e 20 6f 74 68  trigger.  In oth
7710: 65 72 20 77 6f 72 64 73 2c 20 69 66 20 79 6f 75  er words, if you
7720: 20 72 65 66 65 72 65 6e 63 65 20 74 68 65 20 73   reference the s
7730: 70 65 63 69 61 6c 20 22 6e 65 77 22 0a 20 20 20  pecial "new".   
7740: 20 20 20 20 20 2a 2a 20 74 61 62 6c 65 20 69 6e       ** table in
7750: 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 20   the result set 
7760: 6f 66 20 61 20 73 65 6c 65 63 74 2e 20 20 57 65  of a select.  We
7770: 20 64 6f 20 6e 6f 74 20 68 61 76 65 20 61 20 67   do not have a g
7780: 6f 6f 64 20 77 61 79 0a 20 20 20 20 20 20 20 20  ood way.        
7790: 2a 2a 20 74 6f 20 66 69 6e 64 20 74 68 65 20 61  ** to find the a
77a0: 63 74 75 61 6c 20 74 61 62 6c 65 20 74 79 70 65  ctual table type
77b0: 2c 20 73 6f 20 63 61 6c 6c 20 69 74 20 22 54 45  , so call it "TE
77c0: 58 54 22 2e 20 20 54 68 69 73 20 69 73 20 72 65  XT".  This is re
77d0: 61 6c 6c 79 0a 20 20 20 20 20 20 20 20 2a 2a 20  ally.        ** 
77e0: 73 6f 6d 65 74 68 69 6e 67 20 6f 66 20 61 20 62  something of a b
77f0: 75 67 2c 20 62 75 74 20 49 20 64 6f 20 6e 6f 74  ug, but I do not
7800: 20 6b 6e 6f 77 20 68 6f 77 20 74 6f 20 66 69 78   know how to fix
7810: 20 69 74 2e 0a 20 20 20 20 20 20 20 20 2a 2a 0a   it..        **.
7820: 20 20 20 20 20 20 20 20 2a 2a 20 54 68 69 73 20          ** This 
7830: 63 6f 64 65 20 64 6f 65 73 20 6e 6f 74 20 70 72  code does not pr
7840: 6f 64 75 63 65 20 74 68 65 20 63 6f 72 72 65 63  oduce the correc
7850: 74 20 61 6e 73 77 65 72 20 2d 20 69 74 20 6a 75  t answer - it ju
7860: 73 74 20 70 72 65 76 65 6e 74 73 0a 20 20 20 20  st prevents.    
7870: 20 20 20 20 2a 2a 20 61 20 73 65 67 66 61 75 6c      ** a segfaul
7880: 74 2e 20 20 53 65 65 20 74 69 63 6b 65 74 20 23  t.  See ticket #
7890: 31 32 32 39 2e 0a 20 20 20 20 20 20 20 20 2a 2f  1229..        */
78a0: 0a 20 20 20 20 20 20 20 20 7a 54 79 70 65 20 3d  .        zType =
78b0: 20 22 54 45 58 54 22 3b 0a 20 20 20 20 20 20 20   "TEXT";.       
78c0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
78d0: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
78e0: 54 61 62 20 29 3b 0a 20 20 20 20 20 20 69 66 28  Tab );.      if(
78f0: 20 70 53 20 29 7b 0a 20 20 20 20 20 20 20 20 2f   pS ){.        /
7900: 2a 20 54 68 65 20 22 74 61 62 6c 65 22 20 69 73  * The "table" is
7910: 20 61 63 74 75 61 6c 6c 79 20 61 20 73 75 62 2d   actually a sub-
7920: 73 65 6c 65 63 74 20 6f 72 20 61 20 76 69 65 77  select or a view
7930: 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61   in the FROM cla
7940: 75 73 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f  use.        ** o
7950: 66 20 74 68 65 20 53 45 4c 45 43 54 20 73 74 61  f the SELECT sta
7960: 74 65 6d 65 6e 74 2e 20 52 65 74 75 72 6e 20 74  tement. Return t
7970: 68 65 20 64 65 63 6c 61 72 61 74 69 6f 6e 20 74  he declaration t
7980: 79 70 65 20 61 6e 64 20 6f 72 69 67 69 6e 0a 20  ype and origin. 
7990: 20 20 20 20 20 20 20 2a 2a 20 64 61 74 61 20 66         ** data f
79a0: 6f 72 20 74 68 65 20 72 65 73 75 6c 74 2d 73 65  or the result-se
79b0: 74 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 68 65 20  t column of the 
79c0: 73 75 62 2d 73 65 6c 65 63 74 2e 0a 20 20 20 20  sub-select..    
79d0: 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 69      */.        i
79e0: 66 28 20 69 43 6f 6c 3e 3d 30 20 26 26 20 69 43  f( iCol>=0 && iC
79f0: 6f 6c 3c 70 53 2d 3e 70 45 4c 69 73 74 2d 3e 6e  ol<pS->pEList->n
7a00: 45 78 70 72 20 29 7b 0a 20 20 20 20 20 20 20 20  Expr ){.        
7a10: 20 20 2f 2a 20 49 66 20 69 43 6f 6c 20 69 73 20    /* If iCol is 
7a20: 6c 65 73 73 20 74 68 61 6e 20 7a 65 72 6f 2c 20  less than zero, 
7a30: 74 68 65 6e 20 74 68 65 20 65 78 70 72 65 73 73  then the express
7a40: 69 6f 6e 20 72 65 71 75 65 73 74 73 20 74 68 65  ion requests the
7a50: 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 72 6f  .          ** ro
7a60: 77 69 64 20 6f 66 20 74 68 65 20 73 75 62 2d 73  wid of the sub-s
7a70: 65 6c 65 63 74 20 6f 72 20 76 69 65 77 2e 20 54  elect or view. T
7a80: 68 69 73 20 65 78 70 72 65 73 73 69 6f 6e 20 69  his expression i
7a90: 73 20 6c 65 67 61 6c 20 28 73 65 65 20 0a 20 20  s legal (see .  
7aa0: 20 20 20 20 20 20 20 20 2a 2a 20 74 65 73 74 20          ** test 
7ab0: 63 61 73 65 20 6d 69 73 63 32 2e 32 2e 32 29 20  case misc2.2.2) 
7ac0: 2d 20 69 74 20 61 6c 77 61 79 73 20 65 76 61 6c  - it always eval
7ad0: 75 61 74 65 73 20 74 6f 20 4e 55 4c 4c 2e 0a 20  uates to NULL.. 
7ae0: 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20           */.    
7af0: 20 20 20 20 20 20 4e 61 6d 65 43 6f 6e 74 65 78        NameContex
7b00: 74 20 73 4e 43 3b 0a 20 20 20 20 20 20 20 20 20  t sNC;.         
7b10: 20 45 78 70 72 20 2a 70 20 3d 20 70 53 2d 3e 70   Expr *p = pS->p
7b20: 45 4c 69 73 74 2d 3e 61 5b 69 43 6f 6c 5d 2e 70  EList->a[iCol].p
7b30: 45 78 70 72 3b 0a 20 20 20 20 20 20 20 20 20 20  Expr;.          
7b40: 73 4e 43 2e 70 53 72 63 4c 69 73 74 20 3d 20 70  sNC.pSrcList = p
7b50: 53 2d 3e 70 53 72 63 3b 0a 20 20 20 20 20 20 20  S->pSrc;.       
7b60: 20 20 20 73 4e 43 2e 70 4e 65 78 74 20 3d 20 30     sNC.pNext = 0
7b70: 3b 0a 20 20 20 20 20 20 20 20 20 20 73 4e 43 2e  ;.          sNC.
7b80: 70 50 61 72 73 65 20 3d 20 70 4e 43 2d 3e 70 50  pParse = pNC->pP
7b90: 61 72 73 65 3b 0a 20 20 20 20 20 20 20 20 20 20  arse;.          
7ba0: 7a 54 79 70 65 20 3d 20 63 6f 6c 75 6d 6e 54 79  zType = columnTy
7bb0: 70 65 28 26 73 4e 43 2c 20 70 2c 20 26 7a 4f 72  pe(&sNC, p, &zOr
7bc0: 69 67 69 6e 44 62 2c 20 26 7a 4f 72 69 67 69 6e  iginDb, &zOrigin
7bd0: 54 61 62 2c 20 26 7a 4f 72 69 67 69 6e 43 6f 6c  Tab, &zOriginCol
7be0: 29 3b 20 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ); .        }.  
7bf0: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 54      }else if( pT
7c00: 61 62 2d 3e 70 53 63 68 65 6d 61 20 29 7b 0a 20  ab->pSchema ){. 
7c10: 20 20 20 20 20 20 20 2f 2a 20 41 20 72 65 61 6c         /* A real
7c20: 20 74 61 62 6c 65 20 2a 2f 0a 20 20 20 20 20 20   table */.      
7c30: 20 20 61 73 73 65 72 74 28 20 21 70 53 20 29 3b    assert( !pS );
7c40: 0a 20 20 20 20 20 20 20 20 69 66 28 20 69 43 6f  .        if( iCo
7c50: 6c 3c 30 20 29 20 69 43 6f 6c 20 3d 20 70 54 61  l<0 ) iCol = pTa
7c60: 62 2d 3e 69 50 4b 65 79 3b 0a 20 20 20 20 20 20  b->iPKey;.      
7c70: 20 20 61 73 73 65 72 74 28 20 69 43 6f 6c 3d 3d    assert( iCol==
7c80: 2d 31 20 7c 7c 20 28 69 43 6f 6c 3e 3d 30 20 26  -1 || (iCol>=0 &
7c90: 26 20 69 43 6f 6c 3c 70 54 61 62 2d 3e 6e 43 6f  & iCol<pTab->nCo
7ca0: 6c 29 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66  l) );.        if
7cb0: 28 20 69 43 6f 6c 3c 30 20 29 7b 0a 20 20 20 20  ( iCol<0 ){.    
7cc0: 20 20 20 20 20 20 7a 54 79 70 65 20 3d 20 22 49        zType = "I
7cd0: 4e 54 45 47 45 52 22 3b 0a 20 20 20 20 20 20 20  NTEGER";.       
7ce0: 20 20 20 7a 4f 72 69 67 69 6e 43 6f 6c 20 3d 20     zOriginCol = 
7cf0: 22 72 6f 77 69 64 22 3b 0a 20 20 20 20 20 20 20  "rowid";.       
7d00: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
7d10: 20 20 7a 54 79 70 65 20 3d 20 70 54 61 62 2d 3e    zType = pTab->
7d20: 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 7a 54 79 70 65  aCol[iCol].zType
7d30: 3b 0a 20 20 20 20 20 20 20 20 20 20 7a 4f 72 69  ;.          zOri
7d40: 67 69 6e 43 6f 6c 20 3d 20 70 54 61 62 2d 3e 61  ginCol = pTab->a
7d50: 43 6f 6c 5b 69 43 6f 6c 5d 2e 7a 4e 61 6d 65 3b  Col[iCol].zName;
7d60: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
7d70: 20 20 20 7a 4f 72 69 67 69 6e 54 61 62 20 3d 20     zOriginTab = 
7d80: 70 54 61 62 2d 3e 7a 4e 61 6d 65 3b 0a 20 20 20  pTab->zName;.   
7d90: 20 20 20 20 20 69 66 28 20 70 4e 43 2d 3e 70 50       if( pNC->pP
7da0: 61 72 73 65 20 29 7b 0a 20 20 20 20 20 20 20 20  arse ){.        
7db0: 20 20 69 6e 74 20 69 44 62 20 3d 20 73 71 6c 69    int iDb = sqli
7dc0: 74 65 33 53 63 68 65 6d 61 54 6f 49 6e 64 65 78  te3SchemaToIndex
7dd0: 28 70 4e 43 2d 3e 70 50 61 72 73 65 2d 3e 64 62  (pNC->pParse->db
7de0: 2c 20 70 54 61 62 2d 3e 70 53 63 68 65 6d 61 29  , pTab->pSchema)
7df0: 3b 0a 20 20 20 20 20 20 20 20 20 20 7a 4f 72 69  ;.          zOri
7e00: 67 69 6e 44 62 20 3d 20 70 4e 43 2d 3e 70 50 61  ginDb = pNC->pPa
7e10: 72 73 65 2d 3e 64 62 2d 3e 61 44 62 5b 69 44 62  rse->db->aDb[iDb
7e20: 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20 20  ].zName;.       
7e30: 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20   }.      }.     
7e40: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 69   break;.    }.#i
7e50: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
7e60: 54 5f 53 55 42 51 55 45 52 59 0a 20 20 20 20 63  T_SUBQUERY.    c
7e70: 61 73 65 20 54 4b 5f 53 45 4c 45 43 54 3a 20 7b  ase TK_SELECT: {
7e80: 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20 65 78  .      /* The ex
7e90: 70 72 65 73 73 69 6f 6e 20 69 73 20 61 20 73 75  pression is a su
7ea0: 62 2d 73 65 6c 65 63 74 2e 20 52 65 74 75 72 6e  b-select. Return
7eb0: 20 74 68 65 20 64 65 63 6c 61 72 61 74 69 6f 6e   the declaration
7ec0: 20 74 79 70 65 20 61 6e 64 0a 20 20 20 20 20 20   type and.      
7ed0: 2a 2a 20 6f 72 69 67 69 6e 20 69 6e 66 6f 20 66  ** origin info f
7ee0: 6f 72 20 74 68 65 20 73 69 6e 67 6c 65 20 63 6f  or the single co
7ef0: 6c 75 6d 6e 20 69 6e 20 74 68 65 20 72 65 73 75  lumn in the resu
7f00: 6c 74 20 73 65 74 20 6f 66 20 74 68 65 20 53 45  lt set of the SE
7f10: 4c 45 43 54 0a 20 20 20 20 20 20 2a 2a 20 73 74  LECT.      ** st
7f20: 61 74 65 6d 65 6e 74 2e 0a 20 20 20 20 20 20 2a  atement..      *
7f30: 2f 0a 20 20 20 20 20 20 4e 61 6d 65 43 6f 6e 74  /.      NameCont
7f40: 65 78 74 20 73 4e 43 3b 0a 20 20 20 20 20 20 53  ext sNC;.      S
7f50: 65 6c 65 63 74 20 2a 70 53 20 3d 20 70 45 78 70  elect *pS = pExp
7f60: 72 2d 3e 70 53 65 6c 65 63 74 3b 0a 20 20 20 20  r->pSelect;.    
7f70: 20 20 45 78 70 72 20 2a 70 20 3d 20 70 53 2d 3e    Expr *p = pS->
7f80: 70 45 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78  pEList->a[0].pEx
7f90: 70 72 3b 0a 20 20 20 20 20 20 73 4e 43 2e 70 53  pr;.      sNC.pS
7fa0: 72 63 4c 69 73 74 20 3d 20 70 53 2d 3e 70 53 72  rcList = pS->pSr
7fb0: 63 3b 0a 20 20 20 20 20 20 73 4e 43 2e 70 4e 65  c;.      sNC.pNe
7fc0: 78 74 20 3d 20 70 4e 43 3b 0a 20 20 20 20 20 20  xt = pNC;.      
7fd0: 73 4e 43 2e 70 50 61 72 73 65 20 3d 20 70 4e 43  sNC.pParse = pNC
7fe0: 2d 3e 70 50 61 72 73 65 3b 0a 20 20 20 20 20 20  ->pParse;.      
7ff0: 7a 54 79 70 65 20 3d 20 63 6f 6c 75 6d 6e 54 79  zType = columnTy
8000: 70 65 28 26 73 4e 43 2c 20 70 2c 20 26 7a 4f 72  pe(&sNC, p, &zOr
8010: 69 67 69 6e 44 62 2c 20 26 7a 4f 72 69 67 69 6e  iginDb, &zOrigin
8020: 54 61 62 2c 20 26 7a 4f 72 69 67 69 6e 43 6f 6c  Tab, &zOriginCol
8030: 29 3b 20 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  ); .      break;
8040: 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  .    }.#endif.  
8050: 7d 0a 20 20 0a 20 20 69 66 28 20 70 7a 4f 72 69  }.  .  if( pzOri
8060: 67 69 6e 44 62 20 29 7b 0a 20 20 20 20 61 73 73  ginDb ){.    ass
8070: 65 72 74 28 20 70 7a 4f 72 69 67 69 6e 54 61 62  ert( pzOriginTab
8080: 20 26 26 20 70 7a 4f 72 69 67 69 6e 43 6f 6c 20   && pzOriginCol 
8090: 29 3b 0a 20 20 20 20 2a 70 7a 4f 72 69 67 69 6e  );.    *pzOrigin
80a0: 44 62 20 3d 20 7a 4f 72 69 67 69 6e 44 62 3b 0a  Db = zOriginDb;.
80b0: 20 20 20 20 2a 70 7a 4f 72 69 67 69 6e 54 61 62      *pzOriginTab
80c0: 20 3d 20 7a 4f 72 69 67 69 6e 54 61 62 3b 0a 20   = zOriginTab;. 
80d0: 20 20 20 2a 70 7a 4f 72 69 67 69 6e 43 6f 6c 20     *pzOriginCol 
80e0: 3d 20 7a 4f 72 69 67 69 6e 43 6f 6c 3b 0a 20 20  = zOriginCol;.  
80f0: 7d 0a 20 20 72 65 74 75 72 6e 20 7a 54 79 70 65  }.  return zType
8100: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72  ;.}../*.** Gener
8110: 61 74 65 20 63 6f 64 65 20 74 68 61 74 20 77 69  ate code that wi
8120: 6c 6c 20 74 65 6c 6c 20 74 68 65 20 56 44 42 45  ll tell the VDBE
8130: 20 74 68 65 20 64 65 63 6c 61 72 61 74 69 6f 6e   the declaration
8140: 20 74 79 70 65 73 20 6f 66 20 63 6f 6c 75 6d 6e   types of column
8150: 73 0a 2a 2a 20 69 6e 20 74 68 65 20 72 65 73 75  s.** in the resu
8160: 6c 74 20 73 65 74 2e 0a 2a 2f 0a 73 74 61 74 69  lt set..*/.stati
8170: 63 20 76 6f 69 64 20 67 65 6e 65 72 61 74 65 43  c void generateC
8180: 6f 6c 75 6d 6e 54 79 70 65 73 28 0a 20 20 50 61  olumnTypes(.  Pa
8190: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20  rse *pParse,    
81a0: 20 20 2f 2a 20 50 61 72 73 65 72 20 63 6f 6e 74    /* Parser cont
81b0: 65 78 74 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74  ext */.  SrcList
81c0: 20 2a 70 54 61 62 4c 69 73 74 2c 20 20 2f 2a 20   *pTabList,  /* 
81d0: 4c 69 73 74 20 6f 66 20 74 61 62 6c 65 73 20 2a  List of tables *
81e0: 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45  /.  ExprList *pE
81f0: 4c 69 73 74 20 20 20 20 2f 2a 20 45 78 70 72 65  List    /* Expre
8200: 73 73 69 6f 6e 73 20 64 65 66 69 6e 69 6e 67 20  ssions defining 
8210: 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 20 2a  the result set *
8220: 2f 0a 29 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c  /.){.#ifndef SQL
8230: 49 54 45 5f 4f 4d 49 54 5f 44 45 43 4c 54 59 50  ITE_OMIT_DECLTYP
8240: 45 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50  E.  Vdbe *v = pP
8250: 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69  arse->pVdbe;.  i
8260: 6e 74 20 69 3b 0a 20 20 4e 61 6d 65 43 6f 6e 74  nt i;.  NameCont
8270: 65 78 74 20 73 4e 43 3b 0a 20 20 73 4e 43 2e 70  ext sNC;.  sNC.p
8280: 53 72 63 4c 69 73 74 20 3d 20 70 54 61 62 4c 69  SrcList = pTabLi
8290: 73 74 3b 0a 20 20 73 4e 43 2e 70 50 61 72 73 65  st;.  sNC.pParse
82a0: 20 3d 20 70 50 61 72 73 65 3b 0a 20 20 66 6f 72   = pParse;.  for
82b0: 28 69 3d 30 3b 20 69 3c 70 45 4c 69 73 74 2d 3e  (i=0; i<pEList->
82c0: 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20  nExpr; i++){.   
82d0: 20 45 78 70 72 20 2a 70 20 3d 20 70 45 4c 69 73   Expr *p = pELis
82e0: 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 20  t->a[i].pExpr;. 
82f0: 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
8300: 54 79 70 65 3b 0a 23 69 66 64 65 66 20 53 51 4c  Type;.#ifdef SQL
8310: 49 54 45 5f 45 4e 41 42 4c 45 5f 43 4f 4c 55 4d  ITE_ENABLE_COLUM
8320: 4e 5f 4d 45 54 41 44 41 54 41 0a 20 20 20 20 63  N_METADATA.    c
8330: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4f 72 69 67  onst char *zOrig
8340: 44 62 20 3d 20 30 3b 0a 20 20 20 20 63 6f 6e 73  Db = 0;.    cons
8350: 74 20 63 68 61 72 20 2a 7a 4f 72 69 67 54 61 62  t char *zOrigTab
8360: 20 3d 20 30 3b 0a 20 20 20 20 63 6f 6e 73 74 20   = 0;.    const 
8370: 63 68 61 72 20 2a 7a 4f 72 69 67 43 6f 6c 20 3d  char *zOrigCol =
8380: 20 30 3b 0a 20 20 20 20 7a 54 79 70 65 20 3d 20   0;.    zType = 
8390: 63 6f 6c 75 6d 6e 54 79 70 65 28 26 73 4e 43 2c  columnType(&sNC,
83a0: 20 70 2c 20 26 7a 4f 72 69 67 44 62 2c 20 26 7a   p, &zOrigDb, &z
83b0: 4f 72 69 67 54 61 62 2c 20 26 7a 4f 72 69 67 43  OrigTab, &zOrigC
83c0: 6f 6c 29 3b 0a 0a 20 20 20 20 2f 2a 20 54 68 65  ol);..    /* The
83d0: 20 76 64 62 65 20 6d 75 73 74 20 6d 61 6b 65 20   vdbe must make 
83e0: 69 74 73 20 6f 77 6e 20 63 6f 70 79 20 6f 66 20  its own copy of 
83f0: 74 68 65 20 63 6f 6c 75 6d 6e 2d 74 79 70 65 20  the column-type 
8400: 61 6e 64 20 6f 74 68 65 72 20 0a 20 20 20 20 2a  and other .    *
8410: 2a 20 63 6f 6c 75 6d 6e 20 73 70 65 63 69 66 69  * column specifi
8420: 63 20 73 74 72 69 6e 67 73 2c 20 69 6e 20 63 61  c strings, in ca
8430: 73 65 20 74 68 65 20 73 63 68 65 6d 61 20 69 73  se the schema is
8440: 20 72 65 73 65 74 20 62 65 66 6f 72 65 20 74 68   reset before th
8450: 69 73 0a 20 20 20 20 2a 2a 20 76 69 72 74 75 61  is.    ** virtua
8460: 6c 20 6d 61 63 68 69 6e 65 20 69 73 20 64 65 6c  l machine is del
8470: 65 74 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  eted..    */.   
8480: 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 74 43   sqlite3VdbeSetC
8490: 6f 6c 4e 61 6d 65 28 76 2c 20 69 2c 20 43 4f 4c  olName(v, i, COL
84a0: 4e 41 4d 45 5f 44 41 54 41 42 41 53 45 2c 20 7a  NAME_DATABASE, z
84b0: 4f 72 69 67 44 62 2c 20 50 34 5f 54 52 41 4e 53  OrigDb, P4_TRANS
84c0: 49 45 4e 54 29 3b 0a 20 20 20 20 73 71 6c 69 74  IENT);.    sqlit
84d0: 65 33 56 64 62 65 53 65 74 43 6f 6c 4e 61 6d 65  e3VdbeSetColName
84e0: 28 76 2c 20 69 2c 20 43 4f 4c 4e 41 4d 45 5f 54  (v, i, COLNAME_T
84f0: 41 42 4c 45 2c 20 7a 4f 72 69 67 54 61 62 2c 20  ABLE, zOrigTab, 
8500: 50 34 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a 20  P4_TRANSIENT);. 
8510: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 53 65     sqlite3VdbeSe
8520: 74 43 6f 6c 4e 61 6d 65 28 76 2c 20 69 2c 20 43  tColName(v, i, C
8530: 4f 4c 4e 41 4d 45 5f 43 4f 4c 55 4d 4e 2c 20 7a  OLNAME_COLUMN, z
8540: 4f 72 69 67 43 6f 6c 2c 20 50 34 5f 54 52 41 4e  OrigCol, P4_TRAN
8550: 53 49 45 4e 54 29 3b 0a 23 65 6c 73 65 0a 20 20  SIENT);.#else.  
8560: 20 20 7a 54 79 70 65 20 3d 20 63 6f 6c 75 6d 6e    zType = column
8570: 54 79 70 65 28 26 73 4e 43 2c 20 70 2c 20 30 2c  Type(&sNC, p, 0,
8580: 20 30 2c 20 30 29 3b 0a 23 65 6e 64 69 66 0a 20   0, 0);.#endif. 
8590: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 53 65     sqlite3VdbeSe
85a0: 74 43 6f 6c 4e 61 6d 65 28 76 2c 20 69 2c 20 43  tColName(v, i, C
85b0: 4f 4c 4e 41 4d 45 5f 44 45 43 4c 54 59 50 45 2c  OLNAME_DECLTYPE,
85c0: 20 7a 54 79 70 65 2c 20 50 34 5f 54 52 41 4e 53   zType, P4_TRANS
85d0: 49 45 4e 54 29 3b 0a 20 20 7d 0a 23 65 6e 64 69  IENT);.  }.#endi
85e0: 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54  f /* SQLITE_OMIT
85f0: 5f 44 45 43 4c 54 59 50 45 20 2a 2f 0a 7d 0a 0a  _DECLTYPE */.}..
8600: 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63  /*.** Generate c
8610: 6f 64 65 20 74 68 61 74 20 77 69 6c 6c 20 74 65  ode that will te
8620: 6c 6c 20 74 68 65 20 56 44 42 45 20 74 68 65 20  ll the VDBE the 
8630: 6e 61 6d 65 73 20 6f 66 20 63 6f 6c 75 6d 6e 73  names of columns
8640: 0a 2a 2a 20 69 6e 20 74 68 65 20 72 65 73 75 6c  .** in the resul
8650: 74 20 73 65 74 2e 20 20 54 68 69 73 20 69 6e 66  t set.  This inf
8660: 6f 72 6d 61 74 69 6f 6e 20 69 73 20 75 73 65 64  ormation is used
8670: 20 74 6f 20 70 72 6f 76 69 64 65 20 74 68 65 0a   to provide the.
8680: 2a 2a 20 61 7a 43 6f 6c 5b 5d 20 76 61 6c 75 65  ** azCol[] value
8690: 73 20 69 6e 20 74 68 65 20 63 61 6c 6c 62 61 63  s in the callbac
86a0: 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  k..*/.static voi
86b0: 64 20 67 65 6e 65 72 61 74 65 43 6f 6c 75 6d 6e  d generateColumn
86c0: 4e 61 6d 65 73 28 0a 20 20 50 61 72 73 65 20 2a  Names(.  Parse *
86d0: 70 50 61 72 73 65 2c 20 20 20 20 20 20 2f 2a 20  pParse,      /* 
86e0: 50 61 72 73 65 72 20 63 6f 6e 74 65 78 74 20 2a  Parser context *
86f0: 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 54 61  /.  SrcList *pTa
8700: 62 4c 69 73 74 2c 20 20 2f 2a 20 4c 69 73 74 20  bList,  /* List 
8710: 6f 66 20 74 61 62 6c 65 73 20 2a 2f 0a 20 20 45  of tables */.  E
8720: 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 20  xprList *pEList 
8730: 20 20 20 2f 2a 20 45 78 70 72 65 73 73 69 6f 6e     /* Expression
8740: 73 20 64 65 66 69 6e 69 6e 67 20 74 68 65 20 72  s defining the r
8750: 65 73 75 6c 74 20 73 65 74 20 2a 2f 0a 29 7b 0a  esult set */.){.
8760: 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72    Vdbe *v = pPar
8770: 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74  se->pVdbe;.  int
8780: 20 69 2c 20 6a 3b 0a 20 20 73 71 6c 69 74 65 33   i, j;.  sqlite3
8790: 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64   *db = pParse->d
87a0: 62 3b 0a 20 20 69 6e 74 20 66 75 6c 6c 4e 61 6d  b;.  int fullNam
87b0: 65 73 2c 20 73 68 6f 72 74 4e 61 6d 65 73 3b 0a  es, shortNames;.
87c0: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
87d0: 4f 4d 49 54 5f 45 58 50 4c 41 49 4e 0a 20 20 2f  OMIT_EXPLAIN.  /
87e0: 2a 20 49 66 20 74 68 69 73 20 69 73 20 61 6e 20  * If this is an 
87f0: 45 58 50 4c 41 49 4e 2c 20 73 6b 69 70 20 74 68  EXPLAIN, skip th
8800: 69 73 20 73 74 65 70 20 2a 2f 0a 20 20 69 66 28  is step */.  if(
8810: 20 70 50 61 72 73 65 2d 3e 65 78 70 6c 61 69 6e   pParse->explain
8820: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a   ){.    return;.
8830: 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 61 73    }.#endif..  as
8840: 73 65 72 74 28 20 76 21 3d 30 20 29 3b 0a 20 20  sert( v!=0 );.  
8850: 69 66 28 20 70 50 61 72 73 65 2d 3e 63 6f 6c 4e  if( pParse->colN
8860: 61 6d 65 73 53 65 74 20 7c 7c 20 76 3d 3d 30 20  amesSet || v==0 
8870: 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  || db->mallocFai
8880: 6c 65 64 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  led ) return;.  
8890: 70 50 61 72 73 65 2d 3e 63 6f 6c 4e 61 6d 65 73  pParse->colNames
88a0: 53 65 74 20 3d 20 31 3b 0a 20 20 66 75 6c 6c 4e  Set = 1;.  fullN
88b0: 61 6d 65 73 20 3d 20 28 64 62 2d 3e 66 6c 61 67  ames = (db->flag
88c0: 73 20 26 20 53 51 4c 49 54 45 5f 46 75 6c 6c 43  s & SQLITE_FullC
88d0: 6f 6c 4e 61 6d 65 73 29 21 3d 30 3b 0a 20 20 73  olNames)!=0;.  s
88e0: 68 6f 72 74 4e 61 6d 65 73 20 3d 20 28 64 62 2d  hortNames = (db-
88f0: 3e 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f  >flags & SQLITE_
8900: 53 68 6f 72 74 43 6f 6c 4e 61 6d 65 73 29 21 3d  ShortColNames)!=
8910: 30 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  0;.  sqlite3Vdbe
8920: 53 65 74 4e 75 6d 43 6f 6c 73 28 76 2c 20 70 45  SetNumCols(v, pE
8930: 4c 69 73 74 2d 3e 6e 45 78 70 72 29 3b 0a 20 20  List->nExpr);.  
8940: 66 6f 72 28 69 3d 30 3b 20 69 3c 70 45 4c 69 73  for(i=0; i<pELis
8950: 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a  t->nExpr; i++){.
8960: 20 20 20 20 45 78 70 72 20 2a 70 3b 0a 20 20 20      Expr *p;.   
8970: 20 70 20 3d 20 70 45 4c 69 73 74 2d 3e 61 5b 69   p = pEList->a[i
8980: 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 69 66 28  ].pExpr;.    if(
8990: 20 70 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65   p==0 ) continue
89a0: 3b 0a 20 20 20 20 69 66 28 20 70 45 4c 69 73 74  ;.    if( pEList
89b0: 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 20 29 7b 0a  ->a[i].zName ){.
89c0: 20 20 20 20 20 20 63 68 61 72 20 2a 7a 4e 61 6d        char *zNam
89d0: 65 20 3d 20 70 45 4c 69 73 74 2d 3e 61 5b 69 5d  e = pEList->a[i]
89e0: 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20 73 71  .zName;.      sq
89f0: 6c 69 74 65 33 56 64 62 65 53 65 74 43 6f 6c 4e  lite3VdbeSetColN
8a00: 61 6d 65 28 76 2c 20 69 2c 20 43 4f 4c 4e 41 4d  ame(v, i, COLNAM
8a10: 45 5f 4e 41 4d 45 2c 20 7a 4e 61 6d 65 2c 20 73  E_NAME, zName, s
8a20: 74 72 6c 65 6e 28 7a 4e 61 6d 65 29 29 3b 0a 20  trlen(zName));. 
8a30: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 2d 3e     }else if( p->
8a40: 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 26 26  op==TK_COLUMN &&
8a50: 20 70 54 61 62 4c 69 73 74 20 29 7b 0a 20 20 20   pTabList ){.   
8a60: 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a     Table *pTab;.
8a70: 20 20 20 20 20 20 63 68 61 72 20 2a 7a 43 6f 6c        char *zCol
8a80: 3b 0a 20 20 20 20 20 20 69 6e 74 20 69 43 6f 6c  ;.      int iCol
8a90: 20 3d 20 70 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20   = p->iColumn;. 
8aa0: 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c       for(j=0; j<
8ab0: 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 20 26  pTabList->nSrc &
8ac0: 26 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 6a 5d  & pTabList->a[j]
8ad0: 2e 69 43 75 72 73 6f 72 21 3d 70 2d 3e 69 54 61  .iCursor!=p->iTa
8ae0: 62 6c 65 3b 20 6a 2b 2b 29 7b 7d 0a 20 20 20 20  ble; j++){}.    
8af0: 20 20 61 73 73 65 72 74 28 20 6a 3c 70 54 61 62    assert( j<pTab
8b00: 4c 69 73 74 2d 3e 6e 53 72 63 20 29 3b 0a 20 20  List->nSrc );.  
8b10: 20 20 20 20 70 54 61 62 20 3d 20 70 54 61 62 4c      pTab = pTabL
8b20: 69 73 74 2d 3e 61 5b 6a 5d 2e 70 54 61 62 3b 0a  ist->a[j].pTab;.
8b30: 20 20 20 20 20 20 69 66 28 20 69 43 6f 6c 3c 30        if( iCol<0
8b40: 20 29 20 69 43 6f 6c 20 3d 20 70 54 61 62 2d 3e   ) iCol = pTab->
8b50: 69 50 4b 65 79 3b 0a 20 20 20 20 20 20 61 73 73  iPKey;.      ass
8b60: 65 72 74 28 20 69 43 6f 6c 3d 3d 2d 31 20 7c 7c  ert( iCol==-1 ||
8b70: 20 28 69 43 6f 6c 3e 3d 30 20 26 26 20 69 43 6f   (iCol>=0 && iCo
8b80: 6c 3c 70 54 61 62 2d 3e 6e 43 6f 6c 29 20 29 3b  l<pTab->nCol) );
8b90: 0a 20 20 20 20 20 20 69 66 28 20 69 43 6f 6c 3c  .      if( iCol<
8ba0: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 7a 43 6f  0 ){.        zCo
8bb0: 6c 20 3d 20 22 72 6f 77 69 64 22 3b 0a 20 20 20  l = "rowid";.   
8bc0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
8bd0: 20 20 7a 43 6f 6c 20 3d 20 70 54 61 62 2d 3e 61    zCol = pTab->a
8be0: 43 6f 6c 5b 69 43 6f 6c 5d 2e 7a 4e 61 6d 65 3b  Col[iCol].zName;
8bf0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
8c00: 66 28 20 21 73 68 6f 72 74 4e 61 6d 65 73 20 26  f( !shortNames &
8c10: 26 20 21 66 75 6c 6c 4e 61 6d 65 73 20 29 7b 0a  & !fullNames ){.
8c20: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
8c30: 64 62 65 53 65 74 43 6f 6c 4e 61 6d 65 28 76 2c  dbeSetColName(v,
8c40: 20 69 2c 20 43 4f 4c 4e 41 4d 45 5f 4e 41 4d 45   i, COLNAME_NAME
8c50: 2c 20 28 63 68 61 72 2a 29 70 2d 3e 73 70 61 6e  , (char*)p->span
8c60: 2e 7a 2c 20 70 2d 3e 73 70 61 6e 2e 6e 29 3b 0a  .z, p->span.n);.
8c70: 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
8c80: 66 75 6c 6c 4e 61 6d 65 73 20 7c 7c 20 28 21 73  fullNames || (!s
8c90: 68 6f 72 74 4e 61 6d 65 73 20 26 26 20 70 54 61  hortNames && pTa
8ca0: 62 4c 69 73 74 2d 3e 6e 53 72 63 3e 31 29 20 29  bList->nSrc>1) )
8cb0: 7b 0a 20 20 20 20 20 20 20 20 63 68 61 72 20 2a  {.        char *
8cc0: 7a 4e 61 6d 65 20 3d 20 30 3b 0a 20 20 20 20 20  zName = 0;.     
8cd0: 20 20 20 63 68 61 72 20 2a 7a 54 61 62 3b 0a 20     char *zTab;. 
8ce0: 0a 20 20 20 20 20 20 20 20 7a 54 61 62 20 3d 20  .        zTab = 
8cf0: 70 54 61 62 4c 69 73 74 2d 3e 61 5b 6a 5d 2e 7a  pTabList->a[j].z
8d00: 41 6c 69 61 73 3b 0a 20 20 20 20 20 20 20 20 69  Alias;.        i
8d10: 66 28 20 66 75 6c 6c 4e 61 6d 65 73 20 7c 7c 20  f( fullNames || 
8d20: 7a 54 61 62 3d 3d 30 20 29 20 7a 54 61 62 20 3d  zTab==0 ) zTab =
8d30: 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 3b 0a 20 20   pTab->zName;.  
8d40: 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 73 71        zName = sq
8d50: 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 64 62 2c  lite3MPrintf(db,
8d60: 20 22 25 73 2e 25 73 22 2c 20 7a 54 61 62 2c 20   "%s.%s", zTab, 
8d70: 7a 43 6f 6c 29 3b 0a 20 20 20 20 20 20 20 20 73  zCol);.        s
8d80: 71 6c 69 74 65 33 56 64 62 65 53 65 74 43 6f 6c  qlite3VdbeSetCol
8d90: 4e 61 6d 65 28 76 2c 20 69 2c 20 43 4f 4c 4e 41  Name(v, i, COLNA
8da0: 4d 45 5f 4e 41 4d 45 2c 20 7a 4e 61 6d 65 2c 20  ME_NAME, zName, 
8db0: 50 34 5f 44 59 4e 41 4d 49 43 29 3b 0a 20 20 20  P4_DYNAMIC);.   
8dc0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
8dd0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 74    sqlite3VdbeSet
8de0: 43 6f 6c 4e 61 6d 65 28 76 2c 20 69 2c 20 43 4f  ColName(v, i, CO
8df0: 4c 4e 41 4d 45 5f 4e 41 4d 45 2c 20 7a 43 6f 6c  LNAME_NAME, zCol
8e00: 2c 20 73 74 72 6c 65 6e 28 7a 43 6f 6c 29 29 3b  , strlen(zCol));
8e10: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c  .      }.    }el
8e20: 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  se{.      sqlite
8e30: 33 56 64 62 65 53 65 74 43 6f 6c 4e 61 6d 65 28  3VdbeSetColName(
8e40: 76 2c 20 69 2c 20 43 4f 4c 4e 41 4d 45 5f 4e 41  v, i, COLNAME_NA
8e50: 4d 45 2c 20 28 63 68 61 72 2a 29 70 2d 3e 73 70  ME, (char*)p->sp
8e60: 61 6e 2e 7a 2c 20 70 2d 3e 73 70 61 6e 2e 6e 29  an.z, p->span.n)
8e70: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 67 65  ;.    }.  }.  ge
8e80: 6e 65 72 61 74 65 43 6f 6c 75 6d 6e 54 79 70 65  nerateColumnType
8e90: 73 28 70 50 61 72 73 65 2c 20 70 54 61 62 4c 69  s(pParse, pTabLi
8ea0: 73 74 2c 20 70 45 4c 69 73 74 29 3b 0a 7d 0a 0a  st, pEList);.}..
8eb0: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
8ec0: 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c  MIT_COMPOUND_SEL
8ed0: 45 43 54 0a 2f 2a 0a 2a 2a 20 4e 61 6d 65 20 6f  ECT./*.** Name o
8ee0: 66 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  f the connection
8ef0: 20 6f 70 65 72 61 74 6f 72 2c 20 75 73 65 64 20   operator, used 
8f00: 66 6f 72 20 65 72 72 6f 72 20 6d 65 73 73 61 67  for error messag
8f10: 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 6f  es..*/.static co
8f20: 6e 73 74 20 63 68 61 72 20 2a 73 65 6c 65 63 74  nst char *select
8f30: 4f 70 4e 61 6d 65 28 69 6e 74 20 69 64 29 7b 0a  OpName(int id){.
8f40: 20 20 63 68 61 72 20 2a 7a 3b 0a 20 20 73 77 69    char *z;.  swi
8f50: 74 63 68 28 20 69 64 20 29 7b 0a 20 20 20 20 63  tch( id ){.    c
8f60: 61 73 65 20 54 4b 5f 41 4c 4c 3a 20 20 20 20 20  ase TK_ALL:     
8f70: 20 20 7a 20 3d 20 22 55 4e 49 4f 4e 20 41 4c 4c    z = "UNION ALL
8f80: 22 3b 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20  ";   break;.    
8f90: 63 61 73 65 20 54 4b 5f 49 4e 54 45 52 53 45 43  case TK_INTERSEC
8fa0: 54 3a 20 7a 20 3d 20 22 49 4e 54 45 52 53 45 43  T: z = "INTERSEC
8fb0: 54 22 3b 20 20 20 62 72 65 61 6b 3b 0a 20 20 20  T";   break;.   
8fc0: 20 63 61 73 65 20 54 4b 5f 45 58 43 45 50 54 3a   case TK_EXCEPT:
8fd0: 20 20 20 20 7a 20 3d 20 22 45 58 43 45 50 54 22      z = "EXCEPT"
8fe0: 3b 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  ;      break;.  
8ff0: 20 20 64 65 66 61 75 6c 74 3a 20 20 20 20 20 20    default:      
9000: 20 20 20 20 20 7a 20 3d 20 22 55 4e 49 4f 4e 22       z = "UNION"
9010: 3b 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;       break;. 
9020: 20 7d 0a 20 20 72 65 74 75 72 6e 20 7a 3b 0a 7d   }.  return z;.}
9030: 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
9040: 45 5f 4f 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f  E_OMIT_COMPOUND_
9050: 53 45 4c 45 43 54 20 2a 2f 0a 0a 2f 2a 0a 2a 2a  SELECT */../*.**
9060: 20 46 6f 72 77 61 72 64 20 64 65 63 6c 61 72 61   Forward declara
9070: 74 69 6f 6e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  tion.*/.static i
9080: 6e 74 20 70 72 65 70 53 65 6c 65 63 74 53 74 6d  nt prepSelectStm
9090: 74 28 50 61 72 73 65 2a 2c 20 53 65 6c 65 63 74  t(Parse*, Select
90a0: 2a 29 3b 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e  *);../*.** Given
90b0: 20 61 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d   a SELECT statem
90c0: 65 6e 74 2c 20 67 65 6e 65 72 61 74 65 20 61 20  ent, generate a 
90d0: 54 61 62 6c 65 20 73 74 72 75 63 74 75 72 65 20  Table structure 
90e0: 74 68 61 74 20 64 65 73 63 72 69 62 65 73 0a 2a  that describes.*
90f0: 2a 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74  * the result set
9100: 20 6f 66 20 74 68 61 74 20 53 45 4c 45 43 54 2e   of that SELECT.
9110: 0a 2a 2f 0a 54 61 62 6c 65 20 2a 73 71 6c 69 74  .*/.Table *sqlit
9120: 65 33 52 65 73 75 6c 74 53 65 74 4f 66 53 65 6c  e3ResultSetOfSel
9130: 65 63 74 28 50 61 72 73 65 20 2a 70 50 61 72 73  ect(Parse *pPars
9140: 65 2c 20 63 68 61 72 20 2a 7a 54 61 62 4e 61 6d  e, char *zTabNam
9150: 65 2c 20 53 65 6c 65 63 74 20 2a 70 53 65 6c 65  e, Select *pSele
9160: 63 74 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 54  ct){.  Table *pT
9170: 61 62 3b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 0a  ab;.  int i, j;.
9180: 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69    ExprList *pELi
9190: 73 74 3b 0a 20 20 43 6f 6c 75 6d 6e 20 2a 61 43  st;.  Column *aC
91a0: 6f 6c 2c 20 2a 70 43 6f 6c 3b 0a 20 20 73 71 6c  ol, *pCol;.  sql
91b0: 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73  ite3 *db = pPars
91c0: 65 2d 3e 64 62 3b 0a 0a 20 20 69 66 28 20 73 71  e->db;..  if( sq
91d0: 6c 69 74 65 33 53 65 6c 65 63 74 52 65 73 6f 6c  lite3SelectResol
91e0: 76 65 28 70 50 61 72 73 65 2c 20 70 53 65 6c 65  ve(pParse, pSele
91f0: 63 74 2c 20 30 29 20 29 7b 0a 20 20 20 20 72 65  ct, 0) ){.    re
9200: 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 0a 20 20 77  turn 0;.  }..  w
9210: 68 69 6c 65 28 20 70 53 65 6c 65 63 74 2d 3e 70  hile( pSelect->p
9220: 50 72 69 6f 72 20 29 20 70 53 65 6c 65 63 74 20  Prior ) pSelect 
9230: 3d 20 70 53 65 6c 65 63 74 2d 3e 70 50 72 69 6f  = pSelect->pPrio
9240: 72 3b 0a 20 20 69 66 28 20 70 72 65 70 53 65 6c  r;.  if( prepSel
9250: 65 63 74 53 74 6d 74 28 70 50 61 72 73 65 2c 20  ectStmt(pParse, 
9260: 70 53 65 6c 65 63 74 29 20 29 7b 0a 20 20 20 20  pSelect) ){.    
9270: 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20  return 0;.  }.  
9280: 69 66 28 20 73 71 6c 69 74 65 33 53 65 6c 65 63  if( sqlite3Selec
9290: 74 52 65 73 6f 6c 76 65 28 70 50 61 72 73 65 2c  tResolve(pParse,
92a0: 20 70 53 65 6c 65 63 74 2c 20 30 29 20 29 7b 0a   pSelect, 0) ){.
92b0: 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
92c0: 7d 0a 20 20 70 54 61 62 20 3d 20 73 71 6c 69 74  }.  pTab = sqlit
92d0: 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64  e3DbMallocZero(d
92e0: 62 2c 20 73 69 7a 65 6f 66 28 54 61 62 6c 65 29  b, sizeof(Table)
92f0: 20 29 3b 0a 20 20 69 66 28 20 70 54 61 62 3d 3d   );.  if( pTab==
9300: 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  0 ){.    return 
9310: 30 3b 0a 20 20 7d 0a 20 20 70 54 61 62 2d 3e 6e  0;.  }.  pTab->n
9320: 52 65 66 20 3d 20 31 3b 0a 20 20 70 54 61 62 2d  Ref = 1;.  pTab-
9330: 3e 7a 4e 61 6d 65 20 3d 20 7a 54 61 62 4e 61 6d  >zName = zTabNam
9340: 65 20 3f 20 73 71 6c 69 74 65 33 44 62 53 74 72  e ? sqlite3DbStr
9350: 44 75 70 28 64 62 2c 20 7a 54 61 62 4e 61 6d 65  Dup(db, zTabName
9360: 29 20 3a 20 30 3b 0a 20 20 70 45 4c 69 73 74 20  ) : 0;.  pEList 
9370: 3d 20 70 53 65 6c 65 63 74 2d 3e 70 45 4c 69 73  = pSelect->pELis
9380: 74 3b 0a 20 20 70 54 61 62 2d 3e 6e 43 6f 6c 20  t;.  pTab->nCol 
9390: 3d 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b  = pEList->nExpr;
93a0: 0a 20 20 61 73 73 65 72 74 28 20 70 54 61 62 2d  .  assert( pTab-
93b0: 3e 6e 43 6f 6c 3e 30 20 29 3b 0a 20 20 70 54 61  >nCol>0 );.  pTa
93c0: 62 2d 3e 61 43 6f 6c 20 3d 20 61 43 6f 6c 20 3d  b->aCol = aCol =
93d0: 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63   sqlite3DbMalloc
93e0: 5a 65 72 6f 28 64 62 2c 20 73 69 7a 65 6f 66 28  Zero(db, sizeof(
93f0: 70 54 61 62 2d 3e 61 43 6f 6c 5b 30 5d 29 2a 70  pTab->aCol[0])*p
9400: 54 61 62 2d 3e 6e 43 6f 6c 29 3b 0a 20 20 66 6f  Tab->nCol);.  fo
9410: 72 28 69 3d 30 2c 20 70 43 6f 6c 3d 61 43 6f 6c  r(i=0, pCol=aCol
9420: 3b 20 69 3c 70 54 61 62 2d 3e 6e 43 6f 6c 3b 20  ; i<pTab->nCol; 
9430: 69 2b 2b 2c 20 70 43 6f 6c 2b 2b 29 7b 0a 20 20  i++, pCol++){.  
9440: 20 20 45 78 70 72 20 2a 70 2c 20 2a 70 52 3b 0a    Expr *p, *pR;.
9450: 20 20 20 20 63 68 61 72 20 2a 7a 54 79 70 65 3b      char *zType;
9460: 0a 20 20 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65  .    char *zName
9470: 3b 0a 20 20 20 20 69 6e 74 20 6e 4e 61 6d 65 3b  ;.    int nName;
9480: 0a 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43  .    CollSeq *pC
9490: 6f 6c 6c 3b 0a 20 20 20 20 69 6e 74 20 63 6e 74  oll;.    int cnt
94a0: 3b 0a 20 20 20 20 4e 61 6d 65 43 6f 6e 74 65 78  ;.    NameContex
94b0: 74 20 73 4e 43 3b 0a 20 20 20 20 0a 20 20 20 20  t sNC;.    .    
94c0: 2f 2a 20 47 65 74 20 61 6e 20 61 70 70 72 6f 70  /* Get an approp
94d0: 72 69 61 74 65 20 6e 61 6d 65 20 66 6f 72 20 74  riate name for t
94e0: 68 65 20 63 6f 6c 75 6d 6e 0a 20 20 20 20 2a 2f  he column.    */
94f0: 0a 20 20 20 20 70 20 3d 20 70 45 4c 69 73 74 2d  .    p = pEList-
9500: 3e 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20  >a[i].pExpr;.   
9510: 20 61 73 73 65 72 74 28 20 70 2d 3e 70 52 69 67   assert( p->pRig
9520: 68 74 3d 3d 30 20 7c 7c 20 70 2d 3e 70 52 69 67  ht==0 || p->pRig
9530: 68 74 2d 3e 74 6f 6b 65 6e 2e 7a 3d 3d 30 20 7c  ht->token.z==0 |
9540: 7c 20 70 2d 3e 70 52 69 67 68 74 2d 3e 74 6f 6b  | p->pRight->tok
9550: 65 6e 2e 7a 5b 30 5d 21 3d 30 20 29 3b 0a 20 20  en.z[0]!=0 );.  
9560: 20 20 69 66 28 20 28 7a 4e 61 6d 65 20 3d 20 70    if( (zName = p
9570: 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d  EList->a[i].zNam
9580: 65 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 2f  e)!=0 ){.      /
9590: 2a 20 49 66 20 74 68 65 20 63 6f 6c 75 6d 6e 20  * If the column 
95a0: 63 6f 6e 74 61 69 6e 73 20 61 6e 20 22 41 53 20  contains an "AS 
95b0: 3c 6e 61 6d 65 3e 22 20 70 68 72 61 73 65 2c 20  <name>" phrase, 
95c0: 75 73 65 20 3c 6e 61 6d 65 3e 20 61 73 20 74 68  use <name> as th
95d0: 65 20 6e 61 6d 65 20 2a 2f 0a 20 20 20 20 20 20  e name */.      
95e0: 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 44  zName = sqlite3D
95f0: 62 53 74 72 44 75 70 28 64 62 2c 20 7a 4e 61 6d  bStrDup(db, zNam
9600: 65 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66  e);.    }else if
9610: 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55  ( p->op==TK_COLU
9620: 4d 4e 20 26 26 20 70 2d 3e 70 54 61 62 20 29 7b  MN && p->pTab ){
9630: 0a 20 20 20 20 20 20 2f 2a 20 46 6f 72 20 63 6f  .      /* For co
9640: 6c 75 6d 6e 73 20 75 73 65 20 74 68 65 20 63 6f  lumns use the co
9650: 6c 75 6d 6e 20 6e 61 6d 65 20 6e 61 6d 65 20 2a  lumn name name *
9660: 2f 0a 20 20 20 20 20 20 69 6e 74 20 69 43 6f 6c  /.      int iCol
9670: 20 3d 20 70 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20   = p->iColumn;. 
9680: 20 20 20 20 20 69 66 28 20 69 43 6f 6c 3c 30 20       if( iCol<0 
9690: 29 20 69 43 6f 6c 20 3d 20 70 2d 3e 70 54 61 62  ) iCol = p->pTab
96a0: 2d 3e 69 50 4b 65 79 3b 0a 20 20 20 20 20 20 7a  ->iPKey;.      z
96b0: 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 4d 50  Name = sqlite3MP
96c0: 72 69 6e 74 66 28 64 62 2c 20 22 25 73 22 2c 20  rintf(db, "%s", 
96d0: 70 2d 3e 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 43  p->pTab->aCol[iC
96e0: 6f 6c 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  ol].zName);.    
96f0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20  }else{.      /* 
9700: 55 73 65 20 74 68 65 20 6f 72 69 67 69 6e 61 6c  Use the original
9710: 20 74 65 78 74 20 6f 66 20 74 68 65 20 63 6f 6c   text of the col
9720: 75 6d 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 61  umn expression a
9730: 73 20 69 74 73 20 6e 61 6d 65 20 2a 2f 0a 20 20  s its name */.  
9740: 20 20 20 20 7a 4e 61 6d 65 20 3d 20 73 71 6c 69      zName = sqli
9750: 74 65 33 4d 50 72 69 6e 74 66 28 64 62 2c 20 22  te3MPrintf(db, "
9760: 25 54 22 2c 20 26 70 2d 3e 73 70 61 6e 29 3b 0a  %T", &p->span);.
9770: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 21 7a      }.    if( !z
9780: 4e 61 6d 65 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c  Name || db->mall
9790: 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20  ocFailed ){.    
97a0: 20 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c    db->mallocFail
97b0: 65 64 20 3d 20 31 3b 0a 20 20 20 20 20 20 73 71  ed = 1;.      sq
97c0: 6c 69 74 65 33 5f 66 72 65 65 28 7a 4e 61 6d 65  lite3_free(zName
97d0: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
97e0: 44 65 6c 65 74 65 54 61 62 6c 65 28 70 54 61 62  DeleteTable(pTab
97f0: 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
9800: 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c  0;.    }.    sql
9810: 69 74 65 33 44 65 71 75 6f 74 65 28 7a 4e 61 6d  ite3Dequote(zNam
9820: 65 29 3b 0a 0a 20 20 20 20 2f 2a 20 4d 61 6b 65  e);..    /* Make
9830: 20 73 75 72 65 20 74 68 65 20 63 6f 6c 75 6d 6e   sure the column
9840: 20 6e 61 6d 65 20 69 73 20 75 6e 69 71 75 65 2e   name is unique.
9850: 20 20 49 66 20 74 68 65 20 6e 61 6d 65 20 69 73    If the name is
9860: 20 6e 6f 74 20 75 6e 69 71 75 65 2c 0a 20 20 20   not unique,.   
9870: 20 2a 2a 20 61 70 70 65 6e 64 20 61 20 69 6e 74   ** append a int
9880: 65 67 65 72 20 74 6f 20 74 68 65 20 6e 61 6d 65  eger to the name
9890: 20 73 6f 20 74 68 61 74 20 69 74 20 62 65 63 6f   so that it beco
98a0: 6d 65 73 20 75 6e 69 71 75 65 2e 0a 20 20 20 20  mes unique..    
98b0: 2a 2f 0a 20 20 20 20 6e 4e 61 6d 65 20 3d 20 73  */.    nName = s
98c0: 74 72 6c 65 6e 28 7a 4e 61 6d 65 29 3b 0a 20 20  trlen(zName);.  
98d0: 20 20 66 6f 72 28 6a 3d 63 6e 74 3d 30 3b 20 6a    for(j=cnt=0; j
98e0: 3c 69 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20  <i; j++){.      
98f0: 69 66 28 20 73 71 6c 69 74 65 33 53 74 72 49 43  if( sqlite3StrIC
9900: 6d 70 28 61 43 6f 6c 5b 6a 5d 2e 7a 4e 61 6d 65  mp(aCol[j].zName
9910: 2c 20 7a 4e 61 6d 65 29 3d 3d 30 20 29 7b 0a 20  , zName)==0 ){. 
9920: 20 20 20 20 20 20 20 7a 4e 61 6d 65 5b 6e 4e 61         zName[nNa
9930: 6d 65 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  me] = 0;.       
9940: 20 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33   zName = sqlite3
9950: 4d 50 72 69 6e 74 66 28 64 62 2c 20 22 25 7a 3a  MPrintf(db, "%z:
9960: 25 64 22 2c 20 7a 4e 61 6d 65 2c 20 2b 2b 63 6e  %d", zName, ++cn
9970: 74 29 3b 0a 20 20 20 20 20 20 20 20 6a 20 3d 20  t);.        j = 
9980: 2d 31 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  -1;.        if( 
9990: 7a 4e 61 6d 65 3d 3d 30 20 29 20 62 72 65 61 6b  zName==0 ) break
99a0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
99b0: 20 20 20 20 70 43 6f 6c 2d 3e 7a 4e 61 6d 65 20      pCol->zName 
99c0: 3d 20 7a 4e 61 6d 65 3b 0a 0a 20 20 20 20 2f 2a  = zName;..    /*
99d0: 20 47 65 74 20 74 68 65 20 74 79 70 65 6e 61 6d   Get the typenam
99e0: 65 2c 20 74 79 70 65 20 61 66 66 69 6e 69 74 79  e, type affinity
99f0: 2c 20 61 6e 64 20 63 6f 6c 6c 61 74 69 6e 67 20  , and collating 
9a00: 73 65 71 75 65 6e 63 65 20 66 6f 72 20 74 68 65  sequence for the
9a10: 0a 20 20 20 20 2a 2a 20 63 6f 6c 75 6d 6e 2e 0a  .    ** column..
9a20: 20 20 20 20 2a 2f 0a 20 20 20 20 6d 65 6d 73 65      */.    memse
9a30: 74 28 26 73 4e 43 2c 20 30 2c 20 73 69 7a 65 6f  t(&sNC, 0, sizeo
9a40: 66 28 73 4e 43 29 29 3b 0a 20 20 20 20 73 4e 43  f(sNC));.    sNC
9a50: 2e 70 53 72 63 4c 69 73 74 20 3d 20 70 53 65 6c  .pSrcList = pSel
9a60: 65 63 74 2d 3e 70 53 72 63 3b 0a 20 20 20 20 7a  ect->pSrc;.    z
9a70: 54 79 70 65 20 3d 20 73 71 6c 69 74 65 33 44 62  Type = sqlite3Db
9a80: 53 74 72 44 75 70 28 64 62 2c 20 63 6f 6c 75 6d  StrDup(db, colum
9a90: 6e 54 79 70 65 28 26 73 4e 43 2c 20 70 2c 20 30  nType(&sNC, p, 0
9aa0: 2c 20 30 2c 20 30 29 29 3b 0a 20 20 20 20 70 43  , 0, 0));.    pC
9ab0: 6f 6c 2d 3e 7a 54 79 70 65 20 3d 20 7a 54 79 70  ol->zType = zTyp
9ac0: 65 3b 0a 20 20 20 20 70 43 6f 6c 2d 3e 61 66 66  e;.    pCol->aff
9ad0: 69 6e 69 74 79 20 3d 20 73 71 6c 69 74 65 33 45  inity = sqlite3E
9ae0: 78 70 72 41 66 66 69 6e 69 74 79 28 70 29 3b 0a  xprAffinity(p);.
9af0: 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69      pColl = sqli
9b00: 74 65 33 45 78 70 72 43 6f 6c 6c 53 65 71 28 70  te3ExprCollSeq(p
9b10: 50 61 72 73 65 2c 20 70 29 3b 0a 20 20 20 20 69  Parse, p);.    i
9b20: 66 28 20 70 43 6f 6c 6c 20 29 7b 0a 20 20 20 20  f( pColl ){.    
9b30: 20 20 70 43 6f 6c 2d 3e 7a 43 6f 6c 6c 20 3d 20    pCol->zColl = 
9b40: 73 71 6c 69 74 65 33 44 62 53 74 72 44 75 70 28  sqlite3DbStrDup(
9b50: 64 62 2c 20 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65  db, pColl->zName
9b60: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70  );.    }.  }.  p
9b70: 54 61 62 2d 3e 69 50 4b 65 79 20 3d 20 2d 31 3b  Tab->iPKey = -1;
9b80: 0a 20 20 72 65 74 75 72 6e 20 70 54 61 62 3b 0a  .  return pTab;.
9b90: 7d 0a 0a 2f 2a 0a 2a 2a 20 50 72 65 70 61 72 65  }../*.** Prepare
9ba0: 20 61 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d   a SELECT statem
9bb0: 65 6e 74 20 66 6f 72 20 70 72 6f 63 65 73 73 69  ent for processi
9bc0: 6e 67 20 62 79 20 64 6f 69 6e 67 20 74 68 65 20  ng by doing the 
9bd0: 66 6f 6c 6c 6f 77 69 6e 67 0a 2a 2a 20 74 68 69  following.** thi
9be0: 6e 67 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 28 31  ngs:.**.**    (1
9bf0: 29 20 20 4d 61 6b 65 20 73 75 72 65 20 56 44 42  )  Make sure VDB
9c00: 45 20 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 73  E cursor numbers
9c10: 20 68 61 76 65 20 62 65 65 6e 20 61 73 73 69 67   have been assig
9c20: 6e 65 64 20 74 6f 20 65 76 65 72 79 0a 2a 2a 20  ned to every.** 
9c30: 20 20 20 20 20 20 20 20 65 6c 65 6d 65 6e 74 20          element 
9c40: 6f 66 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75  of the FROM clau
9c50: 73 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 28 32 29  se..**.**    (2)
9c60: 20 20 46 69 6c 6c 20 69 6e 20 74 68 65 20 70 54    Fill in the pT
9c70: 61 62 4c 69 73 74 2d 3e 61 5b 5d 2e 70 54 61 62  abList->a[].pTab
9c80: 20 66 69 65 6c 64 73 20 69 6e 20 74 68 65 20 53   fields in the S
9c90: 72 63 4c 69 73 74 20 74 68 61 74 20 0a 2a 2a 20  rcList that .** 
9ca0: 20 20 20 20 20 20 20 20 64 65 66 69 6e 65 73 20          defines 
9cb0: 46 52 4f 4d 20 63 6c 61 75 73 65 2e 20 20 57 68  FROM clause.  Wh
9cc0: 65 6e 20 76 69 65 77 73 20 61 70 70 65 61 72 20  en views appear 
9cd0: 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75  in the FROM clau
9ce0: 73 65 2c 0a 2a 2a 20 20 20 20 20 20 20 20 20 66  se,.**         f
9cf0: 69 6c 6c 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b  ill pTabList->a[
9d00: 5d 2e 70 53 65 6c 65 63 74 20 77 69 74 68 20 61  ].pSelect with a
9d10: 20 63 6f 70 79 20 6f 66 20 74 68 65 20 53 45 4c   copy of the SEL
9d20: 45 43 54 20 73 74 61 74 65 6d 65 6e 74 0a 2a 2a  ECT statement.**
9d30: 20 20 20 20 20 20 20 20 20 74 68 61 74 20 69 6d           that im
9d40: 70 6c 65 6d 65 6e 74 73 20 74 68 65 20 76 69 65  plements the vie
9d50: 77 2e 20 20 41 20 63 6f 70 79 20 69 73 20 6d 61  w.  A copy is ma
9d60: 64 65 20 6f 66 20 74 68 65 20 76 69 65 77 27 73  de of the view's
9d70: 20 53 45 4c 45 43 54 0a 2a 2a 20 20 20 20 20 20   SELECT.**      
9d80: 20 20 20 73 74 61 74 65 6d 65 6e 74 20 73 6f 20     statement so 
9d90: 74 68 61 74 20 77 65 20 63 61 6e 20 66 72 65 65  that we can free
9da0: 6c 79 20 6d 6f 64 69 66 79 20 6f 72 20 64 65 6c  ly modify or del
9db0: 65 74 65 20 74 68 61 74 20 73 74 61 74 65 6d 65  ete that stateme
9dc0: 6e 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 77 69  nt.**         wi
9dd0: 74 68 6f 75 74 20 77 6f 72 72 79 69 6e 67 20 61  thout worrying a
9de0: 62 6f 75 74 20 6d 65 73 73 69 6e 67 20 75 70 20  bout messing up 
9df0: 74 68 65 20 70 72 65 73 69 73 74 65 6e 74 20 72  the presistent r
9e00: 65 70 72 65 73 65 6e 74 61 74 69 6f 6e 0a 2a 2a  epresentation.**
9e10: 20 20 20 20 20 20 20 20 20 6f 66 20 74 68 65 20           of the 
9e20: 76 69 65 77 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 28  view..**.**    (
9e30: 33 29 20 20 41 64 64 20 74 65 72 6d 73 20 74 6f  3)  Add terms to
9e40: 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73   the WHERE claus
9e50: 65 20 74 6f 20 61 63 63 6f 6d 6f 64 61 74 65 20  e to accomodate 
9e60: 74 68 65 20 4e 41 54 55 52 41 4c 20 6b 65 79 77  the NATURAL keyw
9e70: 6f 72 64 0a 2a 2a 20 20 20 20 20 20 20 20 20 6f  ord.**         o
9e80: 6e 20 6a 6f 69 6e 73 20 61 6e 64 20 74 68 65 20  n joins and the 
9e90: 4f 4e 20 61 6e 64 20 55 53 49 4e 47 20 63 6c 61  ON and USING cla
9ea0: 75 73 65 20 6f 66 20 6a 6f 69 6e 73 2e 0a 2a 2a  use of joins..**
9eb0: 0a 2a 2a 20 20 20 20 28 34 29 20 20 53 63 61 6e  .**    (4)  Scan
9ec0: 20 74 68 65 20 6c 69 73 74 20 6f 66 20 63 6f 6c   the list of col
9ed0: 75 6d 6e 73 20 69 6e 20 74 68 65 20 72 65 73 75  umns in the resu
9ee0: 6c 74 20 73 65 74 20 28 70 45 4c 69 73 74 29 20  lt set (pEList) 
9ef0: 6c 6f 6f 6b 69 6e 67 0a 2a 2a 20 20 20 20 20 20  looking.**      
9f00: 20 20 20 66 6f 72 20 69 6e 73 74 61 6e 63 65 73     for instances
9f10: 20 6f 66 20 74 68 65 20 22 2a 22 20 6f 70 65 72   of the "*" oper
9f20: 61 74 6f 72 20 6f 72 20 74 68 65 20 54 41 42 4c  ator or the TABL
9f30: 45 2e 2a 20 6f 70 65 72 61 74 6f 72 2e 0a 2a 2a  E.* operator..**
9f40: 20 20 20 20 20 20 20 20 20 49 66 20 66 6f 75 6e           If foun
9f50: 64 2c 20 65 78 70 61 6e 64 20 65 61 63 68 20 22  d, expand each "
9f60: 2a 22 20 74 6f 20 62 65 20 65 76 65 72 79 20 63  *" to be every c
9f70: 6f 6c 75 6d 6e 20 69 6e 20 65 76 65 72 79 20 74  olumn in every t
9f80: 61 62 6c 65 0a 2a 2a 20 20 20 20 20 20 20 20 20  able.**         
9f90: 61 6e 64 20 54 41 42 4c 45 2e 2a 20 74 6f 20 62  and TABLE.* to b
9fa0: 65 20 65 76 65 72 79 20 63 6f 6c 75 6d 6e 20 69  e every column i
9fb0: 6e 20 54 41 42 4c 45 2e 0a 2a 2a 0a 2a 2a 20 52  n TABLE..**.** R
9fc0: 65 74 75 72 6e 20 30 20 6f 6e 20 73 75 63 63 65  eturn 0 on succe
9fd0: 73 73 2e 20 20 49 66 20 74 68 65 72 65 20 61 72  ss.  If there ar
9fe0: 65 20 70 72 6f 62 6c 65 6d 73 2c 20 6c 65 61 76  e problems, leav
9ff0: 65 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61  e an error messa
a000: 67 65 0a 2a 2a 20 69 6e 20 70 50 61 72 73 65 20  ge.** in pParse 
a010: 61 6e 64 20 72 65 74 75 72 6e 20 6e 6f 6e 2d 7a  and return non-z
a020: 65 72 6f 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ero..*/.static i
a030: 6e 74 20 70 72 65 70 53 65 6c 65 63 74 53 74 6d  nt prepSelectStm
a040: 74 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  t(Parse *pParse,
a050: 20 53 65 6c 65 63 74 20 2a 70 29 7b 0a 20 20 69   Select *p){.  i
a060: 6e 74 20 69 2c 20 6a 2c 20 6b 2c 20 72 63 3b 0a  nt i, j, k, rc;.
a070: 20 20 53 72 63 4c 69 73 74 20 2a 70 54 61 62 4c    SrcList *pTabL
a080: 69 73 74 3b 0a 20 20 45 78 70 72 4c 69 73 74 20  ist;.  ExprList 
a090: 2a 70 45 4c 69 73 74 3b 0a 20 20 73 74 72 75 63  *pEList;.  struc
a0a0: 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a  t SrcList_item *
a0b0: 70 46 72 6f 6d 3b 0a 20 20 73 71 6c 69 74 65 33  pFrom;.  sqlite3
a0c0: 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64   *db = pParse->d
a0d0: 62 3b 0a 0a 20 20 69 66 28 20 70 3d 3d 30 20 7c  b;..  if( p==0 |
a0e0: 7c 20 70 2d 3e 70 53 72 63 3d 3d 30 20 7c 7c 20  | p->pSrc==0 || 
a0f0: 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
a100: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 31   ){.    return 1
a110: 3b 0a 20 20 7d 0a 20 20 70 54 61 62 4c 69 73 74  ;.  }.  pTabList
a120: 20 3d 20 70 2d 3e 70 53 72 63 3b 0a 20 20 70 45   = p->pSrc;.  pE
a130: 4c 69 73 74 20 3d 20 70 2d 3e 70 45 4c 69 73 74  List = p->pEList
a140: 3b 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72  ;..  /* Make sur
a150: 65 20 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 73  e cursor numbers
a160: 20 68 61 76 65 20 62 65 65 6e 20 61 73 73 69 67   have been assig
a170: 6e 65 64 20 74 6f 20 61 6c 6c 20 65 6e 74 72 69  ned to all entri
a180: 65 73 20 69 6e 0a 20 20 2a 2a 20 74 68 65 20 46  es in.  ** the F
a190: 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20 74 68  ROM clause of th
a1a0: 65 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  e SELECT stateme
a1b0: 6e 74 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74  nt..  */.  sqlit
a1c0: 65 33 53 72 63 4c 69 73 74 41 73 73 69 67 6e 43  e3SrcListAssignC
a1d0: 75 72 73 6f 72 73 28 70 50 61 72 73 65 2c 20 70  ursors(pParse, p
a1e0: 2d 3e 70 53 72 63 29 3b 0a 0a 20 20 2f 2a 20 4c  ->pSrc);..  /* L
a1f0: 6f 6f 6b 20 75 70 20 65 76 65 72 79 20 74 61 62  ook up every tab
a200: 6c 65 20 6e 61 6d 65 64 20 69 6e 20 74 68 65 20  le named in the 
a210: 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20 74  FROM clause of t
a220: 68 65 20 73 65 6c 65 63 74 2e 20 20 49 66 0a 20  he select.  If. 
a230: 20 2a 2a 20 61 6e 20 65 6e 74 72 79 20 6f 66 20   ** an entry of 
a240: 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20  the FROM clause 
a250: 69 73 20 61 20 73 75 62 71 75 65 72 79 20 69 6e  is a subquery in
a260: 73 74 65 61 64 20 6f 66 20 61 20 74 61 62 6c 65  stead of a table
a270: 20 6f 72 20 76 69 65 77 2c 0a 20 20 2a 2a 20 74   or view,.  ** t
a280: 68 65 6e 20 63 72 65 61 74 65 20 61 20 74 72 61  hen create a tra
a290: 6e 73 69 65 6e 74 20 74 61 62 6c 65 20 73 74 72  nsient table str
a2a0: 75 63 74 75 72 65 20 74 6f 20 64 65 73 63 72 69  ucture to descri
a2b0: 62 65 20 74 68 65 20 73 75 62 71 75 65 72 79 2e  be the subquery.
a2c0: 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 2c  .  */.  for(i=0,
a2d0: 20 70 46 72 6f 6d 3d 70 54 61 62 4c 69 73 74 2d   pFrom=pTabList-
a2e0: 3e 61 3b 20 69 3c 70 54 61 62 4c 69 73 74 2d 3e  >a; i<pTabList->
a2f0: 6e 53 72 63 3b 20 69 2b 2b 2c 20 70 46 72 6f 6d  nSrc; i++, pFrom
a300: 2b 2b 29 7b 0a 20 20 20 20 54 61 62 6c 65 20 2a  ++){.    Table *
a310: 70 54 61 62 3b 0a 20 20 20 20 69 66 28 20 70 46  pTab;.    if( pF
a320: 72 6f 6d 2d 3e 70 54 61 62 21 3d 30 20 29 7b 0a  rom->pTab!=0 ){.
a330: 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20 73 74        /* This st
a340: 61 74 65 6d 65 6e 74 20 68 61 73 20 61 6c 72 65  atement has alre
a350: 61 64 79 20 62 65 65 6e 20 70 72 65 70 61 72 65  ady been prepare
a360: 64 2e 20 20 54 68 65 72 65 20 69 73 20 6e 6f 20  d.  There is no 
a370: 6e 65 65 64 0a 20 20 20 20 20 20 2a 2a 20 74 6f  need.      ** to
a380: 20 67 6f 20 66 75 72 74 68 65 72 2e 20 2a 2f 0a   go further. */.
a390: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 69 3d        assert( i=
a3a0: 3d 30 20 29 3b 0a 20 20 20 20 20 20 72 65 74 75  =0 );.      retu
a3b0: 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20  rn 0;.    }.    
a3c0: 69 66 28 20 70 46 72 6f 6d 2d 3e 7a 4e 61 6d 65  if( pFrom->zName
a3d0: 3d 3d 30 20 29 7b 0a 23 69 66 6e 64 65 66 20 53  ==0 ){.#ifndef S
a3e0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55  QLITE_OMIT_SUBQU
a3f0: 45 52 59 0a 20 20 20 20 20 20 2f 2a 20 41 20 73  ERY.      /* A s
a400: 75 62 2d 71 75 65 72 79 20 69 6e 20 74 68 65 20  ub-query in the 
a410: 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20 61  FROM clause of a
a420: 20 53 45 4c 45 43 54 20 2a 2f 0a 20 20 20 20 20   SELECT */.     
a430: 20 61 73 73 65 72 74 28 20 70 46 72 6f 6d 2d 3e   assert( pFrom->
a440: 70 53 65 6c 65 63 74 21 3d 30 20 29 3b 0a 20 20  pSelect!=0 );.  
a450: 20 20 20 20 69 66 28 20 70 46 72 6f 6d 2d 3e 7a      if( pFrom->z
a460: 41 6c 69 61 73 3d 3d 30 20 29 7b 0a 20 20 20 20  Alias==0 ){.    
a470: 20 20 20 20 70 46 72 6f 6d 2d 3e 7a 41 6c 69 61      pFrom->zAlia
a480: 73 20 3d 0a 20 20 20 20 20 20 20 20 20 20 73 71  s =.          sq
a490: 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 64 62 2c  lite3MPrintf(db,
a4a0: 20 22 73 71 6c 69 74 65 5f 73 75 62 71 75 65 72   "sqlite_subquer
a4b0: 79 5f 25 70 5f 22 2c 20 28 76 6f 69 64 2a 29 70  y_%p_", (void*)p
a4c0: 46 72 6f 6d 2d 3e 70 53 65 6c 65 63 74 29 3b 0a  From->pSelect);.
a4d0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 61 73        }.      as
a4e0: 73 65 72 74 28 20 70 46 72 6f 6d 2d 3e 70 54 61  sert( pFrom->pTa
a4f0: 62 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 70 46  b==0 );.      pF
a500: 72 6f 6d 2d 3e 70 54 61 62 20 3d 20 70 54 61 62  rom->pTab = pTab
a510: 20 3d 20 0a 20 20 20 20 20 20 20 20 73 71 6c 69   = .        sqli
a520: 74 65 33 52 65 73 75 6c 74 53 65 74 4f 66 53 65  te3ResultSetOfSe
a530: 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70 46 72  lect(pParse, pFr
a540: 6f 6d 2d 3e 7a 41 6c 69 61 73 2c 20 70 46 72 6f  om->zAlias, pFro
a550: 6d 2d 3e 70 53 65 6c 65 63 74 29 3b 0a 20 20 20  m->pSelect);.   
a560: 20 20 20 69 66 28 20 70 54 61 62 3d 3d 30 20 29     if( pTab==0 )
a570: 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  {.        return
a580: 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   1;.      }.    
a590: 20 20 2f 2a 20 54 68 65 20 69 73 45 70 68 65 6d    /* The isEphem
a5a0: 20 66 6c 61 67 20 69 6e 64 69 63 61 74 65 73 20   flag indicates 
a5b0: 74 68 61 74 20 74 68 65 20 54 61 62 6c 65 20 73  that the Table s
a5c0: 74 72 75 63 74 75 72 65 20 68 61 73 20 62 65 65  tructure has bee
a5d0: 6e 0a 20 20 20 20 20 20 2a 2a 20 64 79 6e 61 6d  n.      ** dynam
a5e0: 69 63 61 6c 6c 79 20 61 6c 6c 6f 63 61 74 65 64  ically allocated
a5f0: 20 61 6e 64 20 6d 61 79 20 62 65 20 66 72 65 65   and may be free
a600: 64 20 61 74 20 61 6e 79 20 74 69 6d 65 2e 20 20  d at any time.  
a610: 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 0a  In other words,.
a620: 20 20 20 20 20 20 2a 2a 20 70 54 61 62 20 69 73        ** pTab is
a630: 20 6e 6f 74 20 70 6f 69 6e 74 69 6e 67 20 74 6f   not pointing to
a640: 20 61 20 70 65 72 73 69 73 74 65 6e 74 20 74 61   a persistent ta
a650: 62 6c 65 20 73 74 72 75 63 74 75 72 65 20 74 68  ble structure th
a660: 61 74 20 64 65 66 69 6e 65 73 0a 20 20 20 20 20  at defines.     
a670: 20 2a 2a 20 70 61 72 74 20 6f 66 20 74 68 65 20   ** part of the 
a680: 73 63 68 65 6d 61 2e 20 2a 2f 0a 20 20 20 20 20  schema. */.     
a690: 20 70 54 61 62 2d 3e 69 73 45 70 68 65 6d 20 3d   pTab->isEphem =
a6a0: 20 31 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d   1;.#endif.    }
a6b0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20 41  else{.      /* A
a6c0: 6e 20 6f 72 64 69 6e 61 72 79 20 74 61 62 6c 65  n ordinary table
a6d0: 20 6f 72 20 76 69 65 77 20 6e 61 6d 65 20 69 6e   or view name in
a6e0: 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65   the FROM clause
a6f0: 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74   */.      assert
a700: 28 20 70 46 72 6f 6d 2d 3e 70 54 61 62 3d 3d 30  ( pFrom->pTab==0
a710: 20 29 3b 0a 20 20 20 20 20 20 70 46 72 6f 6d 2d   );.      pFrom-
a720: 3e 70 54 61 62 20 3d 20 70 54 61 62 20 3d 20 0a  >pTab = pTab = .
a730: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 4c          sqlite3L
a740: 6f 63 61 74 65 54 61 62 6c 65 28 70 50 61 72 73  ocateTable(pPars
a750: 65 2c 30 2c 70 46 72 6f 6d 2d 3e 7a 4e 61 6d 65  e,0,pFrom->zName
a760: 2c 70 46 72 6f 6d 2d 3e 7a 44 61 74 61 62 61 73  ,pFrom->zDatabas
a770: 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 54  e);.      if( pT
a780: 61 62 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  ab==0 ){.       
a790: 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 20   return 1;.     
a7a0: 20 7d 0a 20 20 20 20 20 20 70 54 61 62 2d 3e 6e   }.      pTab->n
a7b0: 52 65 66 2b 2b 3b 0a 23 69 66 20 21 64 65 66 69  Ref++;.#if !defi
a7c0: 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
a7d0: 56 49 45 57 29 20 7c 7c 20 21 64 65 66 69 6e 65  VIEW) || !define
a7e0: 64 20 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56  d (SQLITE_OMIT_V
a7f0: 49 52 54 55 41 4c 54 41 42 4c 45 29 0a 20 20 20  IRTUALTABLE).   
a800: 20 20 20 69 66 28 20 70 54 61 62 2d 3e 70 53 65     if( pTab->pSe
a810: 6c 65 63 74 20 7c 7c 20 49 73 56 69 72 74 75 61  lect || IsVirtua
a820: 6c 28 70 54 61 62 29 20 29 7b 0a 20 20 20 20 20  l(pTab) ){.     
a830: 20 20 20 2f 2a 20 57 65 20 72 65 61 63 68 20 68     /* We reach h
a840: 65 72 65 20 69 66 20 74 68 65 20 6e 61 6d 65 64  ere if the named
a850: 20 74 61 62 6c 65 20 69 73 20 61 20 72 65 61 6c   table is a real
a860: 6c 79 20 61 20 76 69 65 77 20 2a 2f 0a 20 20 20  ly a view */.   
a870: 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33       if( sqlite3
a880: 56 69 65 77 47 65 74 43 6f 6c 75 6d 6e 4e 61 6d  ViewGetColumnNam
a890: 65 73 28 70 50 61 72 73 65 2c 20 70 54 61 62 29  es(pParse, pTab)
a8a0: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65   ){.          re
a8b0: 74 75 72 6e 20 31 3b 0a 20 20 20 20 20 20 20 20  turn 1;.        
a8c0: 7d 0a 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20  }.        /* If 
a8d0: 70 46 72 6f 6d 2d 3e 70 53 65 6c 65 63 74 21 3d  pFrom->pSelect!=
a8e0: 30 20 69 74 20 6d 65 61 6e 73 20 77 65 20 61 72  0 it means we ar
a8f0: 65 20 64 65 61 6c 69 6e 67 20 77 69 74 68 20 61  e dealing with a
a900: 0a 20 20 20 20 20 20 20 20 2a 2a 20 76 69 65 77  .        ** view
a910: 20 77 69 74 68 69 6e 20 61 20 76 69 65 77 2e 20   within a view. 
a920: 20 54 68 65 20 53 45 4c 45 43 54 20 73 74 72 75   The SELECT stru
a930: 63 74 75 72 65 20 68 61 73 20 61 6c 72 65 61 64  cture has alread
a940: 79 20 62 65 65 6e 0a 20 20 20 20 20 20 20 20 2a  y been.        *
a950: 2a 20 63 6f 70 69 65 64 20 62 79 20 74 68 65 20  * copied by the 
a960: 6f 75 74 65 72 20 76 69 65 77 20 73 6f 20 77 65  outer view so we
a970: 20 63 61 6e 20 73 6b 69 70 20 74 68 65 20 63 6f   can skip the co
a980: 70 79 20 73 74 65 70 20 68 65 72 65 0a 20 20 20  py step here.   
a990: 20 20 20 20 20 2a 2a 20 69 6e 20 74 68 65 20 69       ** in the i
a9a0: 6e 6e 65 72 20 76 69 65 77 2e 0a 20 20 20 20 20  nner view..     
a9b0: 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66     */.        if
a9c0: 28 20 70 46 72 6f 6d 2d 3e 70 53 65 6c 65 63 74  ( pFrom->pSelect
a9d0: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ==0 ){.         
a9e0: 20 70 46 72 6f 6d 2d 3e 70 53 65 6c 65 63 74 20   pFrom->pSelect 
a9f0: 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44  = sqlite3SelectD
aa00: 75 70 28 64 62 2c 20 70 54 61 62 2d 3e 70 53 65  up(db, pTab->pSe
aa10: 6c 65 63 74 29 3b 0a 20 20 20 20 20 20 20 20 7d  lect);.        }
aa20: 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  .      }.#endif.
aa30: 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
aa40: 50 72 6f 63 65 73 73 20 4e 41 54 55 52 41 4c 20  Process NATURAL 
aa50: 6b 65 79 77 6f 72 64 73 2c 20 61 6e 64 20 4f 4e  keywords, and ON
aa60: 20 61 6e 64 20 55 53 49 4e 47 20 63 6c 61 75 73   and USING claus
aa70: 65 73 20 6f 66 20 6a 6f 69 6e 73 2e 0a 20 20 2a  es of joins..  *
aa80: 2f 0a 20 20 69 66 28 20 73 71 6c 69 74 65 50 72  /.  if( sqlitePr
aa90: 6f 63 65 73 73 4a 6f 69 6e 28 70 50 61 72 73 65  ocessJoin(pParse
aaa0: 2c 20 70 29 20 29 20 72 65 74 75 72 6e 20 31 3b  , p) ) return 1;
aab0: 0a 0a 20 20 2f 2a 20 46 6f 72 20 65 76 65 72 79  ..  /* For every
aac0: 20 22 2a 22 20 74 68 61 74 20 6f 63 63 75 72 73   "*" that occurs
aad0: 20 69 6e 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6c   in the column l
aae0: 69 73 74 2c 20 69 6e 73 65 72 74 20 74 68 65 20  ist, insert the 
aaf0: 6e 61 6d 65 73 20 6f 66 0a 20 20 2a 2a 20 61 6c  names of.  ** al
ab00: 6c 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 61 6c 6c  l columns in all
ab10: 20 74 61 62 6c 65 73 2e 20 20 41 6e 64 20 66 6f   tables.  And fo
ab20: 72 20 65 76 65 72 79 20 54 41 42 4c 45 2e 2a 20  r every TABLE.* 
ab30: 69 6e 73 65 72 74 20 74 68 65 20 6e 61 6d 65 73  insert the names
ab40: 0a 20 20 2a 2a 20 6f 66 20 61 6c 6c 20 63 6f 6c  .  ** of all col
ab50: 75 6d 6e 73 20 69 6e 20 54 41 42 4c 45 2e 20 20  umns in TABLE.  
ab60: 54 68 65 20 70 61 72 73 65 72 20 69 6e 73 65 72  The parser inser
ab70: 74 65 64 20 61 20 73 70 65 63 69 61 6c 20 65 78  ted a special ex
ab80: 70 72 65 73 73 69 6f 6e 0a 20 20 2a 2a 20 77 69  pression.  ** wi
ab90: 74 68 20 74 68 65 20 54 4b 5f 41 4c 4c 20 6f 70  th the TK_ALL op
aba0: 65 72 61 74 6f 72 20 66 6f 72 20 65 61 63 68 20  erator for each 
abb0: 22 2a 22 20 74 68 61 74 20 69 74 20 66 6f 75 6e  "*" that it foun
abc0: 64 20 69 6e 20 74 68 65 20 63 6f 6c 75 6d 6e 20  d in the column 
abd0: 6c 69 73 74 2e 0a 20 20 2a 2a 20 54 68 65 20 66  list..  ** The f
abe0: 6f 6c 6c 6f 77 69 6e 67 20 63 6f 64 65 20 6a 75  ollowing code ju
abf0: 73 74 20 68 61 73 20 74 6f 20 6c 6f 63 61 74 65  st has to locate
ac00: 20 74 68 65 20 54 4b 5f 41 4c 4c 20 65 78 70 72   the TK_ALL expr
ac10: 65 73 73 69 6f 6e 73 20 61 6e 64 20 65 78 70 61  essions and expa
ac20: 6e 64 0a 20 20 2a 2a 20 65 61 63 68 20 6f 6e 65  nd.  ** each one
ac30: 20 74 6f 20 74 68 65 20 6c 69 73 74 20 6f 66 20   to the list of 
ac40: 61 6c 6c 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 61  all columns in a
ac50: 6c 6c 20 74 61 62 6c 65 73 2e 0a 20 20 2a 2a 0a  ll tables..  **.
ac60: 20 20 2a 2a 20 54 68 65 20 66 69 72 73 74 20 6c    ** The first l
ac70: 6f 6f 70 20 6a 75 73 74 20 63 68 65 63 6b 73 20  oop just checks 
ac80: 74 6f 20 73 65 65 20 69 66 20 74 68 65 72 65 20  to see if there 
ac90: 61 72 65 20 61 6e 79 20 22 2a 22 20 6f 70 65 72  are any "*" oper
aca0: 61 74 6f 72 73 0a 20 20 2a 2a 20 74 68 61 74 20  ators.  ** that 
acb0: 6e 65 65 64 20 65 78 70 61 6e 64 69 6e 67 2e 0a  need expanding..
acc0: 20 20 2a 2f 0a 20 20 66 6f 72 28 6b 3d 30 3b 20    */.  for(k=0; 
acd0: 6b 3c 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b  k<pEList->nExpr;
ace0: 20 6b 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72 20   k++){.    Expr 
acf0: 2a 70 45 20 3d 20 70 45 4c 69 73 74 2d 3e 61 5b  *pE = pEList->a[
ad00: 6b 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 69 66  k].pExpr;.    if
ad10: 28 20 70 45 2d 3e 6f 70 3d 3d 54 4b 5f 41 4c 4c  ( pE->op==TK_ALL
ad20: 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 69 66   ) break;.    if
ad30: 28 20 70 45 2d 3e 6f 70 3d 3d 54 4b 5f 44 4f 54  ( pE->op==TK_DOT
ad40: 20 26 26 20 70 45 2d 3e 70 52 69 67 68 74 20 26   && pE->pRight &
ad50: 26 20 70 45 2d 3e 70 52 69 67 68 74 2d 3e 6f 70  & pE->pRight->op
ad60: 3d 3d 54 4b 5f 41 4c 4c 0a 20 20 20 20 20 20 20  ==TK_ALL.       
ad70: 20 20 26 26 20 70 45 2d 3e 70 4c 65 66 74 20 26    && pE->pLeft &
ad80: 26 20 70 45 2d 3e 70 4c 65 66 74 2d 3e 6f 70 3d  & pE->pLeft->op=
ad90: 3d 54 4b 5f 49 44 20 29 20 62 72 65 61 6b 3b 0a  =TK_ID ) break;.
ada0: 20 20 7d 0a 20 20 72 63 20 3d 20 30 3b 0a 20 20    }.  rc = 0;.  
adb0: 69 66 28 20 6b 3c 70 45 4c 69 73 74 2d 3e 6e 45  if( k<pEList->nE
adc0: 78 70 72 20 29 7b 0a 20 20 20 20 2f 2a 0a 20 20  xpr ){.    /*.  
add0: 20 20 2a 2a 20 49 66 20 77 65 20 67 65 74 20 68    ** If we get h
ade0: 65 72 65 20 69 74 20 6d 65 61 6e 73 20 74 68 65  ere it means the
adf0: 20 72 65 73 75 6c 74 20 73 65 74 20 63 6f 6e 74   result set cont
ae00: 61 69 6e 73 20 6f 6e 65 20 6f 72 20 6d 6f 72 65  ains one or more
ae10: 20 22 2a 22 0a 20 20 20 20 2a 2a 20 6f 70 65 72   "*".    ** oper
ae20: 61 74 6f 72 73 20 74 68 61 74 20 6e 65 65 64 20  ators that need 
ae30: 74 6f 20 62 65 20 65 78 70 61 6e 64 65 64 2e 20  to be expanded. 
ae40: 20 4c 6f 6f 70 20 74 68 72 6f 75 67 68 20 65 61   Loop through ea
ae50: 63 68 20 65 78 70 72 65 73 73 69 6f 6e 0a 20 20  ch expression.  
ae60: 20 20 2a 2a 20 69 6e 20 74 68 65 20 72 65 73 75    ** in the resu
ae70: 6c 74 20 73 65 74 20 61 6e 64 20 65 78 70 61 6e  lt set and expan
ae80: 64 20 74 68 65 6d 20 6f 6e 65 20 62 79 20 6f 6e  d them one by on
ae90: 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73 74  e..    */.    st
aea0: 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74  ruct ExprList_it
aeb0: 65 6d 20 2a 61 20 3d 20 70 45 4c 69 73 74 2d 3e  em *a = pEList->
aec0: 61 3b 0a 20 20 20 20 45 78 70 72 4c 69 73 74 20  a;.    ExprList 
aed0: 2a 70 4e 65 77 20 3d 20 30 3b 0a 20 20 20 20 69  *pNew = 0;.    i
aee0: 6e 74 20 66 6c 61 67 73 20 3d 20 70 50 61 72 73  nt flags = pPars
aef0: 65 2d 3e 64 62 2d 3e 66 6c 61 67 73 3b 0a 20 20  e->db->flags;.  
af00: 20 20 69 6e 74 20 6c 6f 6e 67 4e 61 6d 65 73 20    int longNames 
af10: 3d 20 28 66 6c 61 67 73 20 26 20 53 51 4c 49 54  = (flags & SQLIT
af20: 45 5f 46 75 6c 6c 43 6f 6c 4e 61 6d 65 73 29 21  E_FullColNames)!
af30: 3d 30 20 26 26 0a 20 20 20 20 20 20 20 20 20 20  =0 &&.          
af40: 20 20 20 20 20 20 20 20 20 20 20 20 28 66 6c 61              (fla
af50: 67 73 20 26 20 53 51 4c 49 54 45 5f 53 68 6f 72  gs & SQLITE_Shor
af60: 74 43 6f 6c 4e 61 6d 65 73 29 3d 3d 30 3b 0a 0a  tColNames)==0;..
af70: 20 20 20 20 66 6f 72 28 6b 3d 30 3b 20 6b 3c 70      for(k=0; k<p
af80: 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 6b 2b  EList->nExpr; k+
af90: 2b 29 7b 0a 20 20 20 20 20 20 45 78 70 72 20 2a  +){.      Expr *
afa0: 70 45 20 3d 20 61 5b 6b 5d 2e 70 45 78 70 72 3b  pE = a[k].pExpr;
afb0: 0a 20 20 20 20 20 20 69 66 28 20 70 45 2d 3e 6f  .      if( pE->o
afc0: 70 21 3d 54 4b 5f 41 4c 4c 20 26 26 0a 20 20 20  p!=TK_ALL &&.   
afd0: 20 20 20 20 20 20 20 20 28 70 45 2d 3e 6f 70 21          (pE->op!
afe0: 3d 54 4b 5f 44 4f 54 20 7c 7c 20 70 45 2d 3e 70  =TK_DOT || pE->p
aff0: 52 69 67 68 74 3d 3d 30 20 7c 7c 20 70 45 2d 3e  Right==0 || pE->
b000: 70 52 69 67 68 74 2d 3e 6f 70 21 3d 54 4b 5f 41  pRight->op!=TK_A
b010: 4c 4c 29 20 29 7b 0a 20 20 20 20 20 20 20 20 2f  LL) ){.        /
b020: 2a 20 54 68 69 73 20 70 61 72 74 69 63 75 6c 61  * This particula
b030: 72 20 65 78 70 72 65 73 73 69 6f 6e 20 64 6f 65  r expression doe
b040: 73 20 6e 6f 74 20 6e 65 65 64 20 74 6f 20 62 65  s not need to be
b050: 20 65 78 70 61 6e 64 65 64 2e 0a 20 20 20 20 20   expanded..     
b060: 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 70 4e     */.        pN
b070: 65 77 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  ew = sqlite3Expr
b080: 4c 69 73 74 41 70 70 65 6e 64 28 70 50 61 72 73  ListAppend(pPars
b090: 65 2c 20 70 4e 65 77 2c 20 61 5b 6b 5d 2e 70 45  e, pNew, a[k].pE
b0a0: 78 70 72 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  xpr, 0);.       
b0b0: 20 69 66 28 20 70 4e 65 77 20 29 7b 0a 20 20 20   if( pNew ){.   
b0c0: 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 61 5b 70         pNew->a[p
b0d0: 4e 65 77 2d 3e 6e 45 78 70 72 2d 31 5d 2e 7a 4e  New->nExpr-1].zN
b0e0: 61 6d 65 20 3d 20 61 5b 6b 5d 2e 7a 4e 61 6d 65  ame = a[k].zName
b0f0: 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  ;.        }else{
b100: 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
b110: 31 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  1;.        }.   
b120: 20 20 20 20 20 61 5b 6b 5d 2e 70 45 78 70 72 20       a[k].pExpr 
b130: 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 61 5b 6b  = 0;.        a[k
b140: 5d 2e 7a 4e 61 6d 65 20 3d 20 30 3b 0a 20 20 20  ].zName = 0;.   
b150: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
b160: 20 20 2f 2a 20 54 68 69 73 20 65 78 70 72 65 73    /* This expres
b170: 73 69 6f 6e 20 69 73 20 61 20 22 2a 22 20 6f 72  sion is a "*" or
b180: 20 61 20 22 54 41 42 4c 45 2e 2a 22 20 61 6e 64   a "TABLE.*" and
b190: 20 6e 65 65 64 73 20 74 6f 20 62 65 0a 20 20 20   needs to be.   
b1a0: 20 20 20 20 20 2a 2a 20 65 78 70 61 6e 64 65 64       ** expanded
b1b0: 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e 74  . */.        int
b1c0: 20 74 61 62 6c 65 53 65 65 6e 20 3d 20 30 3b 20   tableSeen = 0; 
b1d0: 20 20 20 20 20 2f 2a 20 53 65 74 20 74 6f 20 31       /* Set to 1
b1e0: 20 77 68 65 6e 20 54 41 42 4c 45 20 6d 61 74 63   when TABLE matc
b1f0: 68 65 73 20 2a 2f 0a 20 20 20 20 20 20 20 20 63  hes */.        c
b200: 68 61 72 20 2a 7a 54 4e 61 6d 65 3b 20 20 20 20  har *zTName;    
b210: 20 20 20 20 20 20 20 20 2f 2a 20 74 65 78 74 20          /* text 
b220: 6f 66 20 6e 61 6d 65 20 6f 66 20 54 41 42 4c 45  of name of TABLE
b230: 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20   */.        if( 
b240: 70 45 2d 3e 6f 70 3d 3d 54 4b 5f 44 4f 54 20 26  pE->op==TK_DOT &
b250: 26 20 70 45 2d 3e 70 4c 65 66 74 20 29 7b 0a 20  & pE->pLeft ){. 
b260: 20 20 20 20 20 20 20 20 20 7a 54 4e 61 6d 65 20           zTName 
b270: 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f  = sqlite3NameFro
b280: 6d 54 6f 6b 65 6e 28 64 62 2c 20 26 70 45 2d 3e  mToken(db, &pE->
b290: 70 4c 65 66 74 2d 3e 74 6f 6b 65 6e 29 3b 0a 20  pLeft->token);. 
b2a0: 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
b2b0: 20 20 20 20 20 20 20 20 7a 54 4e 61 6d 65 20 3d          zTName =
b2c0: 20 30 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20   0;.        }.  
b2d0: 20 20 20 20 20 20 66 6f 72 28 69 3d 30 2c 20 70        for(i=0, p
b2e0: 46 72 6f 6d 3d 70 54 61 62 4c 69 73 74 2d 3e 61  From=pTabList->a
b2f0: 3b 20 69 3c 70 54 61 62 4c 69 73 74 2d 3e 6e 53  ; i<pTabList->nS
b300: 72 63 3b 20 69 2b 2b 2c 20 70 46 72 6f 6d 2b 2b  rc; i++, pFrom++
b310: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 54 61 62  ){.          Tab
b320: 6c 65 20 2a 70 54 61 62 20 3d 20 70 46 72 6f 6d  le *pTab = pFrom
b330: 2d 3e 70 54 61 62 3b 0a 20 20 20 20 20 20 20 20  ->pTab;.        
b340: 20 20 63 68 61 72 20 2a 7a 54 61 62 4e 61 6d 65    char *zTabName
b350: 20 3d 20 70 46 72 6f 6d 2d 3e 7a 41 6c 69 61 73   = pFrom->zAlias
b360: 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
b370: 7a 54 61 62 4e 61 6d 65 3d 3d 30 20 7c 7c 20 7a  zTabName==0 || z
b380: 54 61 62 4e 61 6d 65 5b 30 5d 3d 3d 30 20 29 7b  TabName[0]==0 ){
b390: 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 7a 54   .            zT
b3a0: 61 62 4e 61 6d 65 20 3d 20 70 54 61 62 2d 3e 7a  abName = pTab->z
b3b0: 4e 61 6d 65 3b 0a 20 20 20 20 20 20 20 20 20 20  Name;.          
b3c0: 7d 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65  }.          asse
b3d0: 72 74 28 20 7a 54 61 62 4e 61 6d 65 20 29 3b 0a  rt( zTabName );.
b3e0: 20 20 20 20 20 20 20 20 20 20 69 66 28 20 7a 54            if( zT
b3f0: 4e 61 6d 65 20 26 26 20 73 71 6c 69 74 65 33 53  Name && sqlite3S
b400: 74 72 49 43 6d 70 28 7a 54 4e 61 6d 65 2c 20 7a  trICmp(zTName, z
b410: 54 61 62 4e 61 6d 65 29 21 3d 30 20 29 7b 0a 20  TabName)!=0 ){. 
b420: 20 20 20 20 20 20 20 20 20 20 20 63 6f 6e 74 69             conti
b430: 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  nue;.          }
b440: 0a 20 20 20 20 20 20 20 20 20 20 74 61 62 6c 65  .          table
b450: 53 65 65 6e 20 3d 20 31 3b 0a 20 20 20 20 20 20  Seen = 1;.      
b460: 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70      for(j=0; j<p
b470: 54 61 62 2d 3e 6e 43 6f 6c 3b 20 6a 2b 2b 29 7b  Tab->nCol; j++){
b480: 0a 20 20 20 20 20 20 20 20 20 20 20 20 45 78 70  .            Exp
b490: 72 20 2a 70 45 78 70 72 2c 20 2a 70 52 69 67 68  r *pExpr, *pRigh
b4a0: 74 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 63  t;.            c
b4b0: 68 61 72 20 2a 7a 4e 61 6d 65 20 3d 20 70 54 61  har *zName = pTa
b4c0: 62 2d 3e 61 43 6f 6c 5b 6a 5d 2e 7a 4e 61 6d 65  b->aCol[j].zName
b4d0: 3b 0a 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;..            /
b4e0: 2a 20 49 66 20 61 20 63 6f 6c 75 6d 6e 20 69 73  * If a column is
b4f0: 20 6d 61 72 6b 65 64 20 61 73 20 27 68 69 64 64   marked as 'hidd
b500: 65 6e 27 20 28 63 75 72 72 65 6e 74 6c 79 20 6f  en' (currently o
b510: 6e 6c 79 20 70 6f 73 73 69 62 6c 65 0a 20 20 20  nly possible.   
b520: 20 20 20 20 20 20 20 20 20 2a 2a 20 66 6f 72 20           ** for 
b530: 76 69 72 74 75 61 6c 20 74 61 62 6c 65 73 29 2c  virtual tables),
b540: 20 64 6f 20 6e 6f 74 20 69 6e 63 6c 75 64 65 20   do not include 
b550: 69 74 20 69 6e 20 74 68 65 20 65 78 70 61 6e 64  it in the expand
b560: 65 64 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a  ed.            *
b570: 2a 20 72 65 73 75 6c 74 2d 73 65 74 20 6c 69 73  * result-set lis
b580: 74 2e 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a  t..            *
b590: 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  /.            if
b5a0: 28 20 49 73 48 69 64 64 65 6e 43 6f 6c 75 6d 6e  ( IsHiddenColumn
b5b0: 28 26 70 54 61 62 2d 3e 61 43 6f 6c 5b 6a 5d 29  (&pTab->aCol[j])
b5c0: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
b5d0: 20 20 61 73 73 65 72 74 28 49 73 56 69 72 74 75    assert(IsVirtu
b5e0: 61 6c 28 70 54 61 62 29 29 3b 0a 20 20 20 20 20  al(pTab));.     
b5f0: 20 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75           continu
b600: 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  e;.            }
b610: 0a 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  ..            if
b620: 28 20 69 3e 30 20 29 7b 0a 20 20 20 20 20 20 20  ( i>0 ){.       
b630: 20 20 20 20 20 20 20 73 74 72 75 63 74 20 53 72         struct Sr
b640: 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 4c 65 66  cList_item *pLef
b650: 74 20 3d 20 26 70 54 61 62 4c 69 73 74 2d 3e 61  t = &pTabList->a
b660: 5b 69 2d 31 5d 3b 0a 20 20 20 20 20 20 20 20 20  [i-1];.         
b670: 20 20 20 20 20 69 66 28 20 28 70 4c 65 66 74 5b       if( (pLeft[
b680: 31 5d 2e 6a 6f 69 6e 74 79 70 65 20 26 20 4a 54  1].jointype & JT
b690: 5f 4e 41 54 55 52 41 4c 29 21 3d 30 20 26 26 0a  _NATURAL)!=0 &&.
b6a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b6b0: 20 20 20 20 20 20 20 20 63 6f 6c 75 6d 6e 49 6e          columnIn
b6c0: 64 65 78 28 70 4c 65 66 74 2d 3e 70 54 61 62 2c  dex(pLeft->pTab,
b6d0: 20 7a 4e 61 6d 65 29 3e 3d 30 20 29 7b 0a 20 20   zName)>=0 ){.  
b6e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
b6f0: 20 49 6e 20 61 20 4e 41 54 55 52 41 4c 20 6a 6f   In a NATURAL jo
b700: 69 6e 2c 20 6f 6d 69 74 20 74 68 65 20 6a 6f 69  in, omit the joi
b710: 6e 20 63 6f 6c 75 6d 6e 73 20 66 72 6f 6d 20 74  n columns from t
b720: 68 65 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  he .            
b730: 20 20 20 20 2a 2a 20 74 61 62 6c 65 20 6f 6e 20      ** table on 
b740: 74 68 65 20 72 69 67 68 74 20 2a 2f 0a 20 20 20  the right */.   
b750: 20 20 20 20 20 20 20 20 20 20 20 20 20 63 6f 6e               con
b760: 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 20  tinue;.         
b770: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
b780: 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33       if( sqlite3
b790: 49 64 4c 69 73 74 49 6e 64 65 78 28 70 4c 65 66  IdListIndex(pLef
b7a0: 74 5b 31 5d 2e 70 55 73 69 6e 67 2c 20 7a 4e 61  t[1].pUsing, zNa
b7b0: 6d 65 29 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20  me)>=0 ){.      
b7c0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 20            /* In 
b7d0: 61 20 6a 6f 69 6e 20 77 69 74 68 20 61 20 55 53  a join with a US
b7e0: 49 4e 47 20 63 6c 61 75 73 65 2c 20 6f 6d 69 74  ING clause, omit
b7f0: 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 0a   columns in the.
b800: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b810: 2a 2a 20 75 73 69 6e 67 20 63 6c 61 75 73 65 20  ** using clause 
b820: 66 72 6f 6d 20 74 68 65 20 74 61 62 6c 65 20 6f  from the table o
b830: 6e 20 74 68 65 20 72 69 67 68 74 2e 20 2a 2f 0a  n the right. */.
b840: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b850: 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
b860: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
b870: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
b880: 20 20 20 20 70 52 69 67 68 74 20 3d 20 73 71 6c      pRight = sql
b890: 69 74 65 33 50 45 78 70 72 28 70 50 61 72 73 65  ite3PExpr(pParse
b8a0: 2c 20 54 4b 5f 49 44 2c 20 30 2c 20 30 2c 20 30  , TK_ID, 0, 0, 0
b8b0: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  );.            i
b8c0: 66 28 20 70 52 69 67 68 74 3d 3d 30 20 29 20 62  f( pRight==0 ) b
b8d0: 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20  reak;.          
b8e0: 20 20 73 65 74 51 75 6f 74 65 64 54 6f 6b 65 6e    setQuotedToken
b8f0: 28 70 50 61 72 73 65 2c 20 26 70 52 69 67 68 74  (pParse, &pRight
b900: 2d 3e 74 6f 6b 65 6e 2c 20 7a 4e 61 6d 65 29 3b  ->token, zName);
b910: 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28  .            if(
b920: 20 6c 6f 6e 67 4e 61 6d 65 73 20 7c 7c 20 70 54   longNames || pT
b930: 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3e 31 20 29  abList->nSrc>1 )
b940: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
b950: 45 78 70 72 20 2a 70 4c 65 66 74 20 3d 20 73 71  Expr *pLeft = sq
b960: 6c 69 74 65 33 50 45 78 70 72 28 70 50 61 72 73  lite3PExpr(pPars
b970: 65 2c 20 54 4b 5f 49 44 2c 20 30 2c 20 30 2c 20  e, TK_ID, 0, 0, 
b980: 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  0);.            
b990: 20 20 70 45 78 70 72 20 3d 20 73 71 6c 69 74 65    pExpr = sqlite
b9a0: 33 50 45 78 70 72 28 70 50 61 72 73 65 2c 20 54  3PExpr(pParse, T
b9b0: 4b 5f 44 4f 54 2c 20 70 4c 65 66 74 2c 20 70 52  K_DOT, pLeft, pR
b9c0: 69 67 68 74 2c 20 30 29 3b 0a 20 20 20 20 20 20  ight, 0);.      
b9d0: 20 20 20 20 20 20 20 20 69 66 28 20 70 45 78 70          if( pExp
b9e0: 72 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20  r==0 ) break;.  
b9f0: 20 20 20 20 20 20 20 20 20 20 20 20 73 65 74 51              setQ
ba00: 75 6f 74 65 64 54 6f 6b 65 6e 28 70 50 61 72 73  uotedToken(pPars
ba10: 65 2c 20 26 70 4c 65 66 74 2d 3e 74 6f 6b 65 6e  e, &pLeft->token
ba20: 2c 20 7a 54 61 62 4e 61 6d 65 29 3b 0a 20 20 20  , zTabName);.   
ba30: 20 20 20 20 20 20 20 20 20 20 20 73 65 74 54 6f             setTo
ba40: 6b 65 6e 28 26 70 45 78 70 72 2d 3e 73 70 61 6e  ken(&pExpr->span
ba50: 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  , .             
ba60: 20 20 20 20 20 73 71 6c 69 74 65 33 4d 50 72 69       sqlite3MPri
ba70: 6e 74 66 28 64 62 2c 20 22 25 73 2e 25 73 22 2c  ntf(db, "%s.%s",
ba80: 20 7a 54 61 62 4e 61 6d 65 2c 20 7a 4e 61 6d 65   zTabName, zName
ba90: 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ));.            
baa0: 20 20 70 45 78 70 72 2d 3e 73 70 61 6e 2e 64 79    pExpr->span.dy
bab0: 6e 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20  n = 1;.         
bac0: 20 20 20 20 20 70 45 78 70 72 2d 3e 74 6f 6b 65       pExpr->toke
bad0: 6e 2e 7a 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  n.z = 0;.       
bae0: 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 74 6f         pExpr->to
baf0: 6b 65 6e 2e 6e 20 3d 20 30 3b 0a 20 20 20 20 20  ken.n = 0;.     
bb00: 20 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e           pExpr->
bb10: 74 6f 6b 65 6e 2e 64 79 6e 20 3d 20 30 3b 0a 20  token.dyn = 0;. 
bb20: 20 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65             }else
bb30: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
bb40: 70 45 78 70 72 20 3d 20 70 52 69 67 68 74 3b 0a  pExpr = pRight;.
bb50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 45                pE
bb60: 78 70 72 2d 3e 73 70 61 6e 20 3d 20 70 45 78 70  xpr->span = pExp
bb70: 72 2d 3e 74 6f 6b 65 6e 3b 0a 20 20 20 20 20 20  r->token;.      
bb80: 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 73          pExpr->s
bb90: 70 61 6e 2e 64 79 6e 20 3d 20 30 3b 0a 20 20 20  pan.dyn = 0;.   
bba0: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
bbb0: 20 20 20 20 20 20 20 69 66 28 20 6c 6f 6e 67 4e         if( longN
bbc0: 61 6d 65 73 20 29 7b 0a 20 20 20 20 20 20 20 20  ames ){.        
bbd0: 20 20 20 20 20 20 70 4e 65 77 20 3d 20 73 71 6c        pNew = sql
bbe0: 69 74 65 33 45 78 70 72 4c 69 73 74 41 70 70 65  ite3ExprListAppe
bbf0: 6e 64 28 70 50 61 72 73 65 2c 20 70 4e 65 77 2c  nd(pParse, pNew,
bc00: 20 70 45 78 70 72 2c 20 26 70 45 78 70 72 2d 3e   pExpr, &pExpr->
bc10: 73 70 61 6e 29 3b 0a 20 20 20 20 20 20 20 20 20  span);.         
bc20: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
bc30: 20 20 20 20 20 20 20 20 70 4e 65 77 20 3d 20 73          pNew = s
bc40: 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 41 70  qlite3ExprListAp
bc50: 70 65 6e 64 28 70 50 61 72 73 65 2c 20 70 4e 65  pend(pParse, pNe
bc60: 77 2c 20 70 45 78 70 72 2c 20 26 70 52 69 67 68  w, pExpr, &pRigh
bc70: 74 2d 3e 74 6f 6b 65 6e 29 3b 0a 20 20 20 20 20  t->token);.     
bc80: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
bc90: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20     }.        }. 
bca0: 20 20 20 20 20 20 20 69 66 28 20 21 74 61 62 6c         if( !tabl
bcb0: 65 53 65 65 6e 20 29 7b 0a 20 20 20 20 20 20 20  eSeen ){.       
bcc0: 20 20 20 69 66 28 20 7a 54 4e 61 6d 65 20 29 7b     if( zTName ){
bcd0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c  .            sql
bce0: 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
bcf0: 72 73 65 2c 20 22 6e 6f 20 73 75 63 68 20 74 61  rse, "no such ta
bd00: 62 6c 65 3a 20 25 73 22 2c 20 7a 54 4e 61 6d 65  ble: %s", zTName
bd10: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c  );.          }el
bd20: 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  se{.            
bd30: 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
bd40: 70 50 61 72 73 65 2c 20 22 6e 6f 20 74 61 62 6c  pParse, "no tabl
bd50: 65 73 20 73 70 65 63 69 66 69 65 64 22 29 3b 0a  es specified");.
bd60: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
bd70: 20 20 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20        rc = 1;.  
bd80: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
bd90: 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 54 4e  sqlite3_free(zTN
bda0: 61 6d 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ame);.      }.  
bdb0: 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 45    }.    sqlite3E
bdc0: 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28 70 45  xprListDelete(pE
bdd0: 4c 69 73 74 29 3b 0a 20 20 20 20 70 2d 3e 70 45  List);.    p->pE
bde0: 4c 69 73 74 20 3d 20 70 4e 65 77 3b 0a 20 20 7d  List = pNew;.  }
bdf0: 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f  .#if SQLITE_MAX_
be00: 43 4f 4c 55 4d 4e 0a 20 20 69 66 28 20 70 2d 3e  COLUMN.  if( p->
be10: 70 45 4c 69 73 74 20 26 26 20 70 2d 3e 70 45 4c  pEList && p->pEL
be20: 69 73 74 2d 3e 6e 45 78 70 72 3e 64 62 2d 3e 61  ist->nExpr>db->a
be30: 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d  Limit[SQLITE_LIM
be40: 49 54 5f 43 4f 4c 55 4d 4e 5d 20 29 7b 0a 20 20  IT_COLUMN] ){.  
be50: 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
be60: 67 28 70 50 61 72 73 65 2c 20 22 74 6f 6f 20 6d  g(pParse, "too m
be70: 61 6e 79 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 72  any columns in r
be80: 65 73 75 6c 74 20 73 65 74 22 29 3b 0a 20 20 20  esult set");.   
be90: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 45 52 52   rc = SQLITE_ERR
bea0: 4f 52 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20  OR;.  }.#endif. 
beb0: 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46   if( db->mallocF
bec0: 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 72 63 20  ailed ){.    rc 
bed0: 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  = SQLITE_NOMEM;.
bee0: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
bef0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 70 45 20 69 73 20  .}../*.** pE is 
bf00: 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 6e 20  a pointer to an 
bf10: 65 78 70 72 65 73 73 69 6f 6e 20 77 68 69 63 68  expression which
bf20: 20 69 73 20 61 20 73 69 6e 67 6c 65 20 74 65 72   is a single ter
bf30: 6d 20 69 6e 0a 2a 2a 20 4f 52 44 45 52 20 42 59  m in.** ORDER BY
bf40: 20 6f 72 20 47 52 4f 55 50 20 42 59 20 63 6c 61   or GROUP BY cla
bf50: 75 73 65 2e 0a 2a 2a 0a 2a 2a 20 41 74 20 74 68  use..**.** At th
bf60: 65 20 70 6f 69 6e 74 20 74 68 69 73 20 72 6f 75  e point this rou
bf70: 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 2c 20  tine is called, 
bf80: 77 65 20 61 6c 72 65 61 64 79 20 6b 6e 6f 77 20  we already know 
bf90: 74 68 61 74 20 74 68 65 0a 2a 2a 20 4f 52 44 45  that the.** ORDE
bfa0: 52 20 42 59 20 74 65 72 6d 20 69 73 20 6e 6f 74  R BY term is not
bfb0: 20 61 6e 20 69 6e 74 65 67 65 72 20 69 6e 64 65   an integer inde
bfc0: 78 20 69 6e 74 6f 20 74 68 65 20 72 65 73 75 6c  x into the resul
bfd0: 74 20 73 65 74 2e 20 20 54 68 61 74 0a 2a 2a 20  t set.  That.** 
bfe0: 63 61 73 65 65 20 69 73 20 68 61 6e 64 6c 65 64  casee is handled
bff0: 20 62 79 20 74 68 65 20 63 61 6c 6c 69 6e 67 20   by the calling 
c000: 72 6f 75 74 69 6e 65 2e 0a 2a 2a 0a 2a 2a 20 49  routine..**.** I
c010: 66 20 70 45 20 69 73 20 61 20 77 65 6c 6c 2d 66  f pE is a well-f
c020: 6f 72 6d 65 64 20 65 78 70 72 65 73 73 69 6f 6e  ormed expression
c030: 20 61 6e 64 20 74 68 65 20 53 45 4c 45 43 54 20   and the SELECT 
c040: 73 74 61 74 65 6d 65 6e 74 0a 2a 2a 20 69 73 20  statement.** is 
c050: 6e 6f 74 20 63 6f 6d 70 6f 75 6e 64 2c 20 74 68  not compound, th
c060: 65 6e 20 72 65 74 75 72 6e 20 30 2e 20 20 54 68  en return 0.  Th
c070: 69 73 20 69 6e 64 69 63 61 74 65 73 20 74 6f 20  is indicates to 
c080: 74 68 65 0a 2a 2a 20 63 61 6c 6c 65 72 20 74 68  the.** caller th
c090: 61 74 20 69 74 20 73 68 6f 75 6c 64 20 73 6f 72  at it should sor
c0a0: 74 20 62 79 20 74 68 65 20 76 61 6c 75 65 20 6f  t by the value o
c0b0: 66 20 74 68 65 20 4f 52 44 45 52 20 42 59 0a 2a  f the ORDER BY.*
c0c0: 2a 20 65 78 70 72 65 73 73 69 6f 6e 2e 0a 2a 2a  * expression..**
c0d0: 0a 2a 2a 20 49 66 20 74 68 65 20 53 45 4c 45 43  .** If the SELEC
c0e0: 54 20 69 73 20 63 6f 6d 70 6f 75 6e 64 2c 20 74  T is compound, t
c0f0: 68 65 6e 20 61 74 74 65 6d 70 74 20 74 6f 20 6d  hen attempt to m
c100: 61 74 63 68 20 70 45 20 61 67 61 69 6e 73 74 0a  atch pE against.
c110: 2a 2a 20 72 65 73 75 6c 74 20 73 65 74 20 63 6f  ** result set co
c120: 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20 6c 65 66  lumns in the lef
c130: 74 2d 6d 6f 73 74 20 53 45 4c 45 43 54 20 73 74  t-most SELECT st
c140: 61 74 65 6d 65 6e 74 2e 20 20 52 65 74 75 72 6e  atement.  Return
c150: 0a 2a 2a 20 74 68 65 20 69 6e 64 65 78 20 69 20  .** the index i 
c160: 6f 66 20 74 68 65 20 6d 61 74 63 68 69 6e 67 20  of the matching 
c170: 63 6f 6c 75 6d 6e 2c 20 61 73 20 61 6e 20 69 6e  column, as an in
c180: 64 69 63 61 74 69 6f 6e 20 74 6f 20 74 68 65 20  dication to the 
c190: 0a 2a 2a 20 63 61 6c 6c 65 72 20 74 68 61 74 20  .** caller that 
c1a0: 69 74 20 73 68 6f 75 6c 64 20 73 6f 72 74 20 62  it should sort b
c1b0: 79 20 74 68 65 20 69 2d 74 68 20 63 6f 6c 75 6d  y the i-th colum
c1c0: 6e 2e 20 20 49 66 20 74 68 65 72 65 20 69 73 0a  n.  If there is.
c1d0: 2a 2a 20 6e 6f 20 6d 61 74 63 68 2c 20 72 65 74  ** no match, ret
c1e0: 75 72 6e 20 2d 31 20 61 6e 64 20 6c 65 61 76 65  urn -1 and leave
c1f0: 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67   an error messag
c200: 65 20 69 6e 20 70 50 61 72 73 65 2e 0a 2a 2f 0a  e in pParse..*/.
c210: 73 74 61 74 69 63 20 69 6e 74 20 6d 61 74 63 68  static int match
c220: 4f 72 64 65 72 42 79 54 65 72 6d 54 6f 45 78 70  OrderByTermToExp
c230: 72 4c 69 73 74 28 0a 20 20 50 61 72 73 65 20 2a  rList(.  Parse *
c240: 70 50 61 72 73 65 2c 20 20 20 20 20 2f 2a 20 50  pParse,     /* P
c250: 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 66  arsing context f
c260: 6f 72 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65  or error message
c270: 73 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70  s */.  Select *p
c280: 53 65 6c 65 63 74 2c 20 20 20 2f 2a 20 54 68 65  Select,   /* The
c290: 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
c2a0: 74 20 77 69 74 68 20 74 68 65 20 4f 52 44 45 52  t with the ORDER
c2b0: 20 42 59 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20   BY clause */.  
c2c0: 45 78 70 72 20 2a 70 45 2c 20 20 20 20 20 20 20  Expr *pE,       
c2d0: 20 20 20 2f 2a 20 54 68 65 20 73 70 65 63 69 66     /* The specif
c2e0: 69 63 20 4f 52 44 45 52 20 42 59 20 74 65 72 6d  ic ORDER BY term
c2f0: 20 2a 2f 0a 20 20 69 6e 74 20 69 64 78 2c 20 20   */.  int idx,  
c300: 20 20 20 20 20 20 20 20 20 2f 2a 20 57 68 65 6e           /* When
c310: 20 4f 52 44 45 52 20 42 59 20 74 65 72 6d 20 69   ORDER BY term i
c320: 73 20 74 68 69 73 20 2a 2f 0a 20 20 69 6e 74 20  s this */.  int 
c330: 69 73 43 6f 6d 70 6f 75 6e 64 2c 20 20 20 20 2f  isCompound,    /
c340: 2a 20 54 72 75 65 20 69 66 20 74 68 69 73 20 69  * True if this i
c350: 73 20 61 20 63 6f 6d 70 6f 75 6e 64 20 53 45 4c  s a compound SEL
c360: 45 43 54 20 2a 2f 0a 20 20 75 38 20 2a 70 48 61  ECT */.  u8 *pHa
c370: 73 41 67 67 20 20 20 20 20 20 20 20 2f 2a 20 54  sAgg        /* T
c380: 72 75 65 20 69 66 20 65 78 70 72 65 73 73 69 6f  rue if expressio
c390: 6e 20 63 6f 6e 74 61 69 6e 73 20 61 67 67 72 65  n contains aggre
c3a0: 67 61 74 65 20 66 75 6e 63 74 69 6f 6e 73 20 2a  gate functions *
c3b0: 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 3b 20 20 20  /.){.  int i;   
c3c0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f            /* Loo
c3d0: 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 45  p counter */.  E
c3e0: 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 3b  xprList *pEList;
c3f0: 20 20 2f 2a 20 54 68 65 20 63 6f 6c 75 6d 6e 73    /* The columns
c400: 20 6f 66 20 74 68 65 20 72 65 73 75 6c 74 20 73   of the result s
c410: 65 74 20 2a 2f 0a 20 20 4e 61 6d 65 43 6f 6e 74  et */.  NameCont
c420: 65 78 74 20 6e 63 3b 20 20 20 20 2f 2a 20 4e 61  ext nc;    /* Na
c430: 6d 65 20 63 6f 6e 74 65 78 74 20 66 6f 72 20 72  me context for r
c440: 65 73 6f 6c 76 69 6e 67 20 70 45 20 2a 2f 0a 0a  esolving pE */..
c450: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
c460: 33 45 78 70 72 49 73 49 6e 74 65 67 65 72 28 70  3ExprIsInteger(p
c470: 45 2c 20 26 69 29 3d 3d 30 20 29 3b 0a 20 20 70  E, &i)==0 );.  p
c480: 45 4c 69 73 74 20 3d 20 70 53 65 6c 65 63 74 2d  EList = pSelect-
c490: 3e 70 45 4c 69 73 74 3b 0a 0a 20 20 2f 2a 20 49  >pEList;..  /* I
c4a0: 66 20 74 68 65 20 74 65 72 6d 20 69 73 20 61 20  f the term is a 
c4b0: 73 69 6d 70 6c 65 20 69 64 65 6e 74 69 66 69 65  simple identifie
c4c0: 72 20 74 68 61 74 20 74 72 79 20 74 6f 20 6d 61  r that try to ma
c4d0: 74 63 68 20 74 68 61 74 20 69 64 65 6e 74 69 66  tch that identif
c4e0: 69 65 72 0a 20 20 2a 2a 20 61 67 61 69 6e 73 74  ier.  ** against
c4f0: 20 61 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 20 69   a column name i
c500: 6e 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74  n the result set
c510: 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 45 2d  ..  */.  if( pE-
c520: 3e 6f 70 3d 3d 54 4b 5f 49 44 20 7c 7c 20 28 70  >op==TK_ID || (p
c530: 45 2d 3e 6f 70 3d 3d 54 4b 5f 53 54 52 49 4e 47  E->op==TK_STRING
c540: 20 26 26 20 70 45 2d 3e 74 6f 6b 65 6e 2e 7a 5b   && pE->token.z[
c550: 30 5d 21 3d 27 5c 27 27 29 20 29 7b 0a 20 20 20  0]!='\'') ){.   
c560: 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70   sqlite3 *db = p
c570: 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 20 20 63  Parse->db;.    c
c580: 68 61 72 20 2a 7a 43 6f 6c 20 3d 20 73 71 6c 69  har *zCol = sqli
c590: 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e  te3NameFromToken
c5a0: 28 64 62 2c 20 26 70 45 2d 3e 74 6f 6b 65 6e 29  (db, &pE->token)
c5b0: 3b 0a 20 20 20 20 69 66 28 20 7a 43 6f 6c 3d 3d  ;.    if( zCol==
c5c0: 30 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  0 ){.      retur
c5d0: 6e 20 2d 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20  n -1;.    }.    
c5e0: 66 6f 72 28 69 3d 30 3b 20 69 3c 70 45 4c 69 73  for(i=0; i<pELis
c5f0: 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a  t->nExpr; i++){.
c600: 20 20 20 20 20 20 63 68 61 72 20 2a 7a 41 73 20        char *zAs 
c610: 3d 20 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a  = pEList->a[i].z
c620: 4e 61 6d 65 3b 0a 20 20 20 20 20 20 69 66 28 20  Name;.      if( 
c630: 7a 41 73 21 3d 30 20 26 26 20 73 71 6c 69 74 65  zAs!=0 && sqlite
c640: 33 53 74 72 49 43 6d 70 28 7a 41 73 2c 20 7a 43  3StrICmp(zAs, zC
c650: 6f 6c 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ol)==0 ){.      
c660: 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
c670: 43 6f 6c 29 3b 0a 20 20 20 20 20 20 20 20 72 65  Col);.        re
c680: 74 75 72 6e 20 69 2b 31 3b 0a 20 20 20 20 20 20  turn i+1;.      
c690: 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  }.    }.    sqli
c6a0: 74 65 33 5f 66 72 65 65 28 7a 43 6f 6c 29 3b 0a  te3_free(zCol);.
c6b0: 20 20 7d 0a 0a 20 20 2f 2a 20 52 65 73 6f 6c 76    }..  /* Resolv
c6c0: 65 20 61 6c 6c 20 6e 61 6d 65 73 20 69 6e 20 74  e all names in t
c6d0: 68 65 20 4f 52 44 45 52 20 42 59 20 74 65 72 6d  he ORDER BY term
c6e0: 20 65 78 70 72 65 73 73 69 6f 6e 0a 20 20 2a 2f   expression.  */
c6f0: 0a 20 20 6d 65 6d 73 65 74 28 26 6e 63 2c 20 30  .  memset(&nc, 0
c700: 2c 20 73 69 7a 65 6f 66 28 6e 63 29 29 3b 0a 20  , sizeof(nc));. 
c710: 20 6e 63 2e 70 50 61 72 73 65 20 3d 20 70 50 61   nc.pParse = pPa
c720: 72 73 65 3b 0a 20 20 6e 63 2e 70 53 72 63 4c 69  rse;.  nc.pSrcLi
c730: 73 74 20 3d 20 70 53 65 6c 65 63 74 2d 3e 70 53  st = pSelect->pS
c740: 72 63 3b 0a 20 20 6e 63 2e 70 45 4c 69 73 74 20  rc;.  nc.pEList 
c750: 3d 20 70 45 4c 69 73 74 3b 0a 20 20 6e 63 2e 61  = pEList;.  nc.a
c760: 6c 6c 6f 77 41 67 67 20 3d 20 31 3b 0a 20 20 6e  llowAgg = 1;.  n
c770: 63 2e 6e 45 72 72 20 3d 20 30 3b 0a 20 20 69 66  c.nErr = 0;.  if
c780: 28 20 73 71 6c 69 74 65 33 45 78 70 72 52 65 73  ( sqlite3ExprRes
c790: 6f 6c 76 65 4e 61 6d 65 73 28 26 6e 63 2c 20 70  olveNames(&nc, p
c7a0: 45 29 20 29 7b 0a 20 20 20 20 69 66 28 20 69 73  E) ){.    if( is
c7b0: 43 6f 6d 70 6f 75 6e 64 20 29 7b 0a 20 20 20 20  Compound ){.    
c7c0: 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 43 6c    sqlite3ErrorCl
c7d0: 65 61 72 28 70 50 61 72 73 65 29 3b 0a 20 20 20  ear(pParse);.   
c7e0: 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20     return 0;.   
c7f0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 65   }else{.      re
c800: 74 75 72 6e 20 2d 31 3b 0a 20 20 20 20 7d 0a 20  turn -1;.    }. 
c810: 20 7d 0a 20 20 69 66 28 20 6e 63 2e 68 61 73 41   }.  if( nc.hasA
c820: 67 67 20 26 26 20 70 48 61 73 41 67 67 20 29 7b  gg && pHasAgg ){
c830: 0a 20 20 20 20 2a 70 48 61 73 41 67 67 20 3d 20  .    *pHasAgg = 
c840: 31 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46 6f 72  1;.  }..  /* For
c850: 20 61 20 63 6f 6d 70 6f 75 6e 64 20 53 45 4c 45   a compound SELE
c860: 43 54 2c 20 77 65 20 6e 65 65 64 20 74 6f 20 74  CT, we need to t
c870: 72 79 20 74 6f 20 6d 61 74 63 68 20 74 68 65 20  ry to match the 
c880: 4f 52 44 45 52 20 42 59 0a 20 20 2a 2a 20 65 78  ORDER BY.  ** ex
c890: 70 72 65 73 73 69 6f 6e 20 61 67 61 69 6e 73 74  pression against
c8a0: 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 69   an expression i
c8b0: 6e 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74  n the result set
c8c0: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 69 73 43 6f  .  */.  if( isCo
c8d0: 6d 70 6f 75 6e 64 20 29 7b 0a 20 20 20 20 66 6f  mpound ){.    fo
c8e0: 72 28 69 3d 30 3b 20 69 3c 70 45 4c 69 73 74 2d  r(i=0; i<pEList-
c8f0: 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20  >nExpr; i++){.  
c900: 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 45      if( sqlite3E
c910: 78 70 72 43 6f 6d 70 61 72 65 28 70 45 4c 69 73  xprCompare(pELis
c920: 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 2c 20 70  t->a[i].pExpr, p
c930: 45 29 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65  E) ){.        re
c940: 74 75 72 6e 20 69 2b 31 3b 0a 20 20 20 20 20 20  turn i+1;.      
c950: 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  }.    }.  }.  re
c960: 74 75 72 6e 20 30 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a  turn 0;.}.../*.*
c970: 2a 20 41 6e 61 6c 79 7a 65 20 61 6e 64 20 4f 52  * Analyze and OR
c980: 44 45 52 20 42 59 20 6f 72 20 47 52 4f 55 50 20  DER BY or GROUP 
c990: 42 59 20 63 6c 61 75 73 65 20 69 6e 20 61 20 73  BY clause in a s
c9a0: 69 6d 70 6c 65 20 53 45 4c 45 43 54 20 73 74 61  imple SELECT sta
c9b0: 74 65 6d 65 6e 74 2e 0a 2a 2a 20 52 65 74 75 72  tement..** Retur
c9c0: 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  n the number of 
c9d0: 65 72 72 6f 72 73 20 73 65 65 6e 2e 0a 2a 2a 0a  errors seen..**.
c9e0: 2a 2a 20 45 76 65 72 79 20 74 65 72 6d 20 6f 66  ** Every term of
c9f0: 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 6f 72   the ORDER BY or
ca00: 20 47 52 4f 55 50 20 42 59 20 63 6c 61 75 73 65   GROUP BY clause
ca10: 20 6e 65 65 64 73 20 74 6f 20 62 65 20 61 6e 0a   needs to be an.
ca20: 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 2e 20 20  ** expression.  
ca30: 49 66 20 61 6e 79 20 65 78 70 72 65 73 73 69 6f  If any expressio
ca40: 6e 20 69 73 20 61 6e 20 69 6e 74 65 67 65 72 20  n is an integer 
ca50: 63 6f 6e 73 74 61 6e 74 2c 20 74 68 65 6e 0a 2a  constant, then.*
ca60: 2a 20 74 68 61 74 20 65 78 70 72 65 73 73 69 6f  * that expressio
ca70: 6e 20 69 73 20 72 65 70 6c 61 63 65 64 20 62 79  n is replaced by
ca80: 20 74 68 65 20 63 6f 72 72 65 73 70 6f 6e 64 69   the correspondi
ca90: 6e 67 20 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f  ng .** expressio
caa0: 6e 20 66 72 6f 6d 20 74 68 65 20 72 65 73 75 6c  n from the resul
cab0: 74 20 73 65 74 2e 0a 2a 2f 0a 73 74 61 74 69 63  t set..*/.static
cac0: 20 69 6e 74 20 70 72 6f 63 65 73 73 4f 72 64 65   int processOrde
cad0: 72 47 72 6f 75 70 42 79 28 0a 20 20 50 61 72 73  rGroupBy(.  Pars
cae0: 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20  e *pParse,      
caf0: 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e    /* Parsing con
cb00: 74 65 78 74 2e 20 20 4c 65 61 76 65 20 65 72 72  text.  Leave err
cb10: 6f 72 20 6d 65 73 73 61 67 65 73 20 68 65 72 65  or messages here
cb20: 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 53   */.  Select *pS
cb30: 65 6c 65 63 74 2c 20 20 20 20 20 20 2f 2a 20 54  elect,      /* T
cb40: 68 65 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d  he SELECT statem
cb50: 65 6e 74 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74  ent containing t
cb60: 68 65 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 45  he clause */.  E
cb70: 78 70 72 4c 69 73 74 20 2a 70 4f 72 64 65 72 42  xprList *pOrderB
cb80: 79 2c 20 20 20 2f 2a 20 54 68 65 20 4f 52 44 45  y,   /* The ORDE
cb90: 52 20 42 59 20 6f 72 20 47 52 4f 55 50 20 42 59  R BY or GROUP BY
cba0: 20 63 6c 61 75 73 65 20 74 6f 20 62 65 20 70 72   clause to be pr
cbb0: 6f 63 65 73 73 65 64 20 2a 2f 0a 20 20 69 6e 74  ocessed */.  int
cbc0: 20 69 73 4f 72 64 65 72 2c 20 20 20 20 20 20 20   isOrder,       
cbd0: 20 20 20 2f 2a 20 31 20 66 6f 72 20 4f 52 44 45     /* 1 for ORDE
cbe0: 52 20 42 59 2e 20 20 30 20 66 6f 72 20 47 52 4f  R BY.  0 for GRO
cbf0: 55 50 20 42 59 20 2a 2f 0a 20 20 75 38 20 2a 70  UP BY */.  u8 *p
cc00: 48 61 73 41 67 67 20 20 20 20 20 20 20 20 20 20  HasAgg          
cc10: 20 2f 2a 20 53 65 74 20 74 6f 20 54 52 55 45 20   /* Set to TRUE 
cc20: 69 66 20 61 6e 79 20 74 65 72 6d 20 63 6f 6e 74  if any term cont
cc30: 61 69 6e 73 20 61 6e 20 61 67 67 72 65 67 61 74  ains an aggregat
cc40: 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 3b  e */.){.  int i;
cc50: 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d  .  sqlite3 *db =
cc60: 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 45   pParse->db;.  E
cc70: 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 3b  xprList *pEList;
cc80: 0a 0a 20 20 69 66 28 20 70 4f 72 64 65 72 42 79  ..  if( pOrderBy
cc90: 3d 3d 30 20 7c 7c 20 70 50 61 72 73 65 2d 3e 64  ==0 || pParse->d
cca0: 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
ccb0: 29 20 72 65 74 75 72 6e 20 30 3b 0a 23 69 66 20  ) return 0;.#if 
ccc0: 53 51 4c 49 54 45 5f 4d 41 58 5f 43 4f 4c 55 4d  SQLITE_MAX_COLUM
ccd0: 4e 0a 20 20 69 66 28 20 70 4f 72 64 65 72 42 79  N.  if( pOrderBy
cce0: 2d 3e 6e 45 78 70 72 3e 64 62 2d 3e 61 4c 69 6d  ->nExpr>db->aLim
ccf0: 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f  it[SQLITE_LIMIT_
cd00: 43 4f 4c 55 4d 4e 5d 20 29 7b 0a 20 20 20 20 63  COLUMN] ){.    c
cd10: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 79 70 65  onst char *zType
cd20: 20 3d 20 69 73 4f 72 64 65 72 20 3f 20 22 4f 52   = isOrder ? "OR
cd30: 44 45 52 22 20 3a 20 22 47 52 4f 55 50 22 3b 0a  DER" : "GROUP";.
cd40: 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
cd50: 4d 73 67 28 70 50 61 72 73 65 2c 20 22 74 6f 6f  Msg(pParse, "too
cd60: 20 6d 61 6e 79 20 74 65 72 6d 73 20 69 6e 20 25   many terms in %
cd70: 73 20 42 59 20 63 6c 61 75 73 65 22 2c 20 7a 54  s BY clause", zT
cd80: 79 70 65 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  ype);.    return
cd90: 20 31 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20   1;.  }.#endif. 
cda0: 20 70 45 4c 69 73 74 20 3d 20 70 53 65 6c 65 63   pEList = pSelec
cdb0: 74 2d 3e 70 45 4c 69 73 74 3b 0a 20 20 69 66 28  t->pEList;.  if(
cdc0: 20 70 45 4c 69 73 74 3d 3d 30 20 29 7b 0a 20 20   pEList==0 ){.  
cdd0: 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a    return 0;.  }.
cde0: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4f 72    for(i=0; i<pOr
cdf0: 64 65 72 42 79 2d 3e 6e 45 78 70 72 3b 20 69 2b  derBy->nExpr; i+
ce00: 2b 29 7b 0a 20 20 20 20 69 6e 74 20 69 43 6f 6c  +){.    int iCol
ce10: 3b 0a 20 20 20 20 45 78 70 72 20 2a 70 45 20 3d  ;.    Expr *pE =
ce20: 20 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e   pOrderBy->a[i].
ce30: 70 45 78 70 72 3b 0a 20 20 20 20 69 66 28 20 73  pExpr;.    if( s
ce40: 71 6c 69 74 65 33 45 78 70 72 49 73 49 6e 74 65  qlite3ExprIsInte
ce50: 67 65 72 28 70 45 2c 20 26 69 43 6f 6c 29 20 29  ger(pE, &iCol) )
ce60: 7b 0a 20 20 20 20 20 20 69 66 28 20 69 43 6f 6c  {.      if( iCol
ce70: 3c 3d 30 20 7c 7c 20 69 43 6f 6c 3e 70 45 4c 69  <=0 || iCol>pELi
ce80: 73 74 2d 3e 6e 45 78 70 72 20 29 7b 0a 20 20 20  st->nExpr ){.   
ce90: 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20       const char 
cea0: 2a 7a 54 79 70 65 20 3d 20 69 73 4f 72 64 65 72  *zType = isOrder
ceb0: 20 3f 20 22 4f 52 44 45 52 22 20 3a 20 22 47 52   ? "ORDER" : "GR
cec0: 4f 55 50 22 3b 0a 20 20 20 20 20 20 20 20 73 71  OUP";.        sq
ced0: 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
cee0: 61 72 73 65 2c 20 0a 20 20 20 20 20 20 20 20 20  arse, .         
cef0: 20 20 22 25 72 20 25 73 20 42 59 20 74 65 72 6d    "%r %s BY term
cf00: 20 6f 75 74 20 6f 66 20 72 61 6e 67 65 20 2d 20   out of range - 
cf10: 73 68 6f 75 6c 64 20 62 65 20 22 0a 20 20 20 20  should be ".    
cf20: 20 20 20 20 20 20 20 22 62 65 74 77 65 65 6e 20         "between 
cf30: 31 20 61 6e 64 20 25 64 22 2c 20 69 2b 31 2c 20  1 and %d", i+1, 
cf40: 7a 54 79 70 65 2c 20 70 45 4c 69 73 74 2d 3e 6e  zType, pEList->n
cf50: 45 78 70 72 29 3b 0a 20 20 20 20 20 20 20 20 72  Expr);.        r
cf60: 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 20 20 7d  eturn 1;.      }
cf70: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
cf80: 20 20 69 43 6f 6c 20 3d 20 6d 61 74 63 68 4f 72    iCol = matchOr
cf90: 64 65 72 42 79 54 65 72 6d 54 6f 45 78 70 72 4c  derByTermToExprL
cfa0: 69 73 74 28 70 50 61 72 73 65 2c 20 70 53 65 6c  ist(pParse, pSel
cfb0: 65 63 74 2c 20 70 45 2c 20 69 2b 31 2c 20 30 2c  ect, pE, i+1, 0,
cfc0: 20 70 48 61 73 41 67 67 29 3b 0a 20 20 20 20 20   pHasAgg);.     
cfd0: 20 69 66 28 20 69 43 6f 6c 3c 30 20 29 7b 0a 20   if( iCol<0 ){. 
cfe0: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b         return 1;
cff0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
d000: 20 20 20 69 66 28 20 69 43 6f 6c 3e 30 20 29 7b     if( iCol>0 ){
d010: 0a 20 20 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a  .      CollSeq *
d020: 70 43 6f 6c 6c 20 3d 20 70 45 2d 3e 70 43 6f 6c  pColl = pE->pCol
d030: 6c 3b 0a 20 20 20 20 20 20 69 6e 74 20 66 6c 61  l;.      int fla
d040: 67 73 20 3d 20 70 45 2d 3e 66 6c 61 67 73 20 26  gs = pE->flags &
d050: 20 45 50 5f 45 78 70 43 6f 6c 6c 61 74 65 3b 0a   EP_ExpCollate;.
d060: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
d070: 72 44 65 6c 65 74 65 28 70 45 29 3b 0a 20 20 20  rDelete(pE);.   
d080: 20 20 20 70 45 20 3d 20 73 71 6c 69 74 65 33 45     pE = sqlite3E
d090: 78 70 72 44 75 70 28 64 62 2c 20 70 45 4c 69 73  xprDup(db, pELis
d0a0: 74 2d 3e 61 5b 69 43 6f 6c 2d 31 5d 2e 70 45 78  t->a[iCol-1].pEx
d0b0: 70 72 29 3b 0a 20 20 20 20 20 20 70 4f 72 64 65  pr);.      pOrde
d0c0: 72 42 79 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 20  rBy->a[i].pExpr 
d0d0: 3d 20 70 45 3b 0a 20 20 20 20 20 20 69 66 28 20  = pE;.      if( 
d0e0: 70 45 20 26 26 20 70 43 6f 6c 6c 20 26 26 20 66  pE && pColl && f
d0f0: 6c 61 67 73 20 29 7b 0a 20 20 20 20 20 20 20 20  lags ){.        
d100: 70 45 2d 3e 70 43 6f 6c 6c 20 3d 20 70 43 6f 6c  pE->pColl = pCol
d110: 6c 3b 0a 20 20 20 20 20 20 20 20 70 45 2d 3e 66  l;.        pE->f
d120: 6c 61 67 73 20 7c 3d 20 66 6c 61 67 73 3b 0a 20  lags |= flags;. 
d130: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
d140: 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a  .  return 0;.}..
d150: 2f 2a 0a 2a 2a 20 41 6e 61 6c 79 7a 65 20 61 6e  /*.** Analyze an
d160: 64 20 4f 52 44 45 52 20 42 59 20 6f 72 20 47 52  d ORDER BY or GR
d170: 4f 55 50 20 42 59 20 63 6c 61 75 73 65 20 69 6e  OUP BY clause in
d180: 20 61 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d   a SELECT statem
d190: 65 6e 74 2e 20 20 52 65 74 75 72 6e 0a 2a 2a 20  ent.  Return.** 
d1a0: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 65 72  the number of er
d1b0: 72 6f 72 73 20 73 65 65 6e 2e 0a 2a 2a 0a 2a 2a  rors seen..**.**
d1c0: 20 49 66 20 69 54 61 62 6c 65 3e 30 20 74 68 65   If iTable>0 the
d1d0: 6e 20 6d 61 6b 65 20 74 68 65 20 4e 2d 74 68 20  n make the N-th 
d1e0: 74 65 72 6d 20 6f 66 20 74 68 65 20 4f 52 44 45  term of the ORDE
d1f0: 52 20 42 59 20 63 6c 61 75 73 65 20 72 65 66 65  R BY clause refe
d200: 72 20 74 6f 0a 2a 2a 20 74 68 65 20 4e 2d 74 68  r to.** the N-th
d210: 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 61 62 6c 65   column of table
d220: 20 69 54 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 49   iTable..**.** I
d230: 66 20 69 54 61 62 6c 65 3d 3d 30 20 74 68 65 6e  f iTable==0 then
d240: 20 74 72 61 6e 73 66 6f 72 6d 20 65 61 63 68 20   transform each 
d250: 74 65 72 6d 20 6f 66 20 74 68 65 20 4f 52 44 45  term of the ORDE
d260: 52 20 42 59 20 63 6c 61 75 73 65 20 74 6f 20 72  R BY clause to r
d270: 65 66 65 72 0a 2a 2a 20 74 6f 20 61 20 63 6f 6c  efer.** to a col
d280: 75 6d 6e 20 6f 66 20 74 68 65 20 72 65 73 75 6c  umn of the resul
d290: 74 20 73 65 74 20 62 79 20 6e 75 6d 62 65 72 2e  t set by number.
d2a0: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70  .*/.static int p
d2b0: 72 6f 63 65 73 73 43 6f 6d 70 6f 75 6e 64 4f 72  rocessCompoundOr
d2c0: 64 65 72 42 79 28 0a 20 20 50 61 72 73 65 20 2a  derBy(.  Parse *
d2d0: 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 2f  pParse,        /
d2e0: 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78  * Parsing contex
d2f0: 74 2e 20 20 4c 65 61 76 65 20 65 72 72 6f 72 20  t.  Leave error 
d300: 6d 65 73 73 61 67 65 73 20 68 65 72 65 20 2a 2f  messages here */
d310: 0a 20 20 53 65 6c 65 63 74 20 2a 70 53 65 6c 65  .  Select *pSele
d320: 63 74 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20  ct       /* The 
d330: 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
d340: 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20   containing the 
d350: 4f 52 44 45 52 20 42 59 20 2a 2f 0a 29 7b 0a 20  ORDER BY */.){. 
d360: 20 69 6e 74 20 69 3b 0a 20 20 45 78 70 72 4c 69   int i;.  ExprLi
d370: 73 74 20 2a 70 4f 72 64 65 72 42 79 3b 0a 20 20  st *pOrderBy;.  
d380: 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74  ExprList *pEList
d390: 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b  ;.  sqlite3 *db;
d3a0: 0a 20 20 69 6e 74 20 6d 6f 72 65 54 6f 44 6f 20  .  int moreToDo 
d3b0: 3d 20 31 3b 0a 0a 20 20 70 4f 72 64 65 72 42 79  = 1;..  pOrderBy
d3c0: 20 3d 20 70 53 65 6c 65 63 74 2d 3e 70 4f 72 64   = pSelect->pOrd
d3d0: 65 72 42 79 3b 0a 20 20 69 66 28 20 70 4f 72 64  erBy;.  if( pOrd
d3e0: 65 72 42 79 3d 3d 30 20 29 20 72 65 74 75 72 6e  erBy==0 ) return
d3f0: 20 30 3b 0a 20 20 64 62 20 3d 20 70 50 61 72 73   0;.  db = pPars
d400: 65 2d 3e 64 62 3b 0a 23 69 66 20 53 51 4c 49 54  e->db;.#if SQLIT
d410: 45 5f 4d 41 58 5f 43 4f 4c 55 4d 4e 0a 20 20 69  E_MAX_COLUMN.  i
d420: 66 28 20 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78  f( pOrderBy->nEx
d430: 70 72 3e 64 62 2d 3e 61 4c 69 6d 69 74 5b 53 51  pr>db->aLimit[SQ
d440: 4c 49 54 45 5f 4c 49 4d 49 54 5f 43 4f 4c 55 4d  LITE_LIMIT_COLUM
d450: 4e 5d 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  N] ){.    sqlite
d460: 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
d470: 2c 20 22 74 6f 6f 20 6d 61 6e 79 20 74 65 72 6d  , "too many term
d480: 73 20 69 6e 20 4f 52 44 45 52 20 42 59 20 63 6c  s in ORDER BY cl
d490: 61 75 73 65 22 29 3b 0a 20 20 20 20 72 65 74 75  ause");.    retu
d4a0: 72 6e 20 31 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  rn 1;.  }.#endif
d4b0: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4f  .  for(i=0; i<pO
d4c0: 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 3b 20 69  rderBy->nExpr; i
d4d0: 2b 2b 29 7b 0a 20 20 20 20 70 4f 72 64 65 72 42  ++){.    pOrderB
d4e0: 79 2d 3e 61 5b 69 5d 2e 64 6f 6e 65 20 3d 20 30  y->a[i].done = 0
d4f0: 3b 0a 20 20 7d 0a 20 20 77 68 69 6c 65 28 20 70  ;.  }.  while( p
d500: 53 65 6c 65 63 74 2d 3e 70 50 72 69 6f 72 20 29  Select->pPrior )
d510: 7b 0a 20 20 20 20 70 53 65 6c 65 63 74 20 3d 20  {.    pSelect = 
d520: 70 53 65 6c 65 63 74 2d 3e 70 50 72 69 6f 72 3b  pSelect->pPrior;
d530: 0a 20 20 7d 0a 20 20 77 68 69 6c 65 28 20 70 53  .  }.  while( pS
d540: 65 6c 65 63 74 20 26 26 20 6d 6f 72 65 54 6f 44  elect && moreToD
d550: 6f 20 29 7b 0a 20 20 20 20 6d 6f 72 65 54 6f 44  o ){.    moreToD
d560: 6f 20 3d 20 30 3b 0a 20 20 20 20 70 45 4c 69 73  o = 0;.    pELis
d570: 74 20 3d 20 70 53 65 6c 65 63 74 2d 3e 70 45 4c  t = pSelect->pEL
d580: 69 73 74 3b 0a 20 20 20 20 69 66 28 20 70 45 4c  ist;.    if( pEL
d590: 69 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ist==0 ){.      
d5a0: 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a  return 1;.    }.
d5b0: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70      for(i=0; i<p
d5c0: 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 3b 20  OrderBy->nExpr; 
d5d0: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  i++){.      int 
d5e0: 69 43 6f 6c 20 3d 20 2d 31 3b 0a 20 20 20 20 20  iCol = -1;.     
d5f0: 20 45 78 70 72 20 2a 70 45 2c 20 2a 70 44 75 70   Expr *pE, *pDup
d600: 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4f 72 64  ;.      if( pOrd
d610: 65 72 42 79 2d 3e 61 5b 69 5d 2e 64 6f 6e 65 20  erBy->a[i].done 
d620: 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
d630: 20 20 70 45 20 3d 20 70 4f 72 64 65 72 42 79 2d    pE = pOrderBy-
d640: 3e 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20  >a[i].pExpr;.   
d650: 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 45 78     if( sqlite3Ex
d660: 70 72 49 73 49 6e 74 65 67 65 72 28 70 45 2c 20  prIsInteger(pE, 
d670: 26 69 43 6f 6c 29 20 29 7b 0a 20 20 20 20 20 20  &iCol) ){.      
d680: 20 20 69 66 28 20 69 43 6f 6c 3c 30 20 7c 7c 20    if( iCol<0 || 
d690: 69 43 6f 6c 3e 70 45 4c 69 73 74 2d 3e 6e 45 78  iCol>pEList->nEx
d6a0: 70 72 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  pr ){.          
d6b0: 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
d6c0: 70 50 61 72 73 65 2c 20 0a 20 20 20 20 20 20 20  pParse, .       
d6d0: 20 20 20 20 20 20 22 25 72 20 4f 52 44 45 52 20        "%r ORDER 
d6e0: 42 59 20 74 65 72 6d 20 6f 75 74 20 6f 66 20 72  BY term out of r
d6f0: 61 6e 67 65 20 2d 20 73 68 6f 75 6c 64 20 62 65  ange - should be
d700: 20 22 0a 20 20 20 20 20 20 20 20 20 20 20 20 20   ".             
d710: 22 62 65 74 77 65 65 6e 20 31 20 61 6e 64 20 25  "between 1 and %
d720: 64 22 2c 20 69 2b 31 2c 20 70 45 4c 69 73 74 2d  d", i+1, pEList-
d730: 3e 6e 45 78 70 72 29 3b 0a 20 20 20 20 20 20 20  >nExpr);.       
d740: 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20     return 1;.   
d750: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c       }.      }el
d760: 73 65 7b 0a 20 20 20 20 20 20 20 20 70 44 75 70  se{.        pDup
d770: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44 75   = sqlite3ExprDu
d780: 70 28 64 62 2c 20 70 45 29 3b 0a 20 20 20 20 20  p(db, pE);.     
d790: 20 20 20 69 66 28 20 21 64 62 2d 3e 6d 61 6c 6c     if( !db->mall
d7a0: 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20  ocFailed ){.    
d7b0: 20 20 20 20 20 20 61 73 73 65 72 74 28 70 44 75        assert(pDu
d7c0: 70 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 43  p);.          iC
d7d0: 6f 6c 20 3d 20 6d 61 74 63 68 4f 72 64 65 72 42  ol = matchOrderB
d7e0: 79 54 65 72 6d 54 6f 45 78 70 72 4c 69 73 74 28  yTermToExprList(
d7f0: 70 50 61 72 73 65 2c 20 70 53 65 6c 65 63 74 2c  pParse, pSelect,
d800: 20 70 44 75 70 2c 20 69 2b 31 2c 20 31 2c 20 30   pDup, i+1, 1, 0
d810: 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
d820: 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
d830: 44 65 6c 65 74 65 28 70 44 75 70 29 3b 0a 20 20  Delete(pDup);.  
d840: 20 20 20 20 20 20 69 66 28 20 69 43 6f 6c 3c 30        if( iCol<0
d850: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65   ){.          re
d860: 74 75 72 6e 20 31 3b 0a 20 20 20 20 20 20 20 20  turn 1;.        
d870: 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  }.      }.      
d880: 69 66 28 20 69 43 6f 6c 3e 30 20 29 7b 0a 20 20  if( iCol>0 ){.  
d890: 20 20 20 20 20 20 70 45 2d 3e 6f 70 20 3d 20 54        pE->op = T
d8a0: 4b 5f 49 4e 54 45 47 45 52 3b 0a 20 20 20 20 20  K_INTEGER;.     
d8b0: 20 20 20 70 45 2d 3e 66 6c 61 67 73 20 7c 3d 20     pE->flags |= 
d8c0: 45 50 5f 49 6e 74 56 61 6c 75 65 3b 0a 20 20 20  EP_IntValue;.   
d8d0: 20 20 20 20 20 70 45 2d 3e 69 54 61 62 6c 65 20       pE->iTable 
d8e0: 3d 20 69 43 6f 6c 3b 0a 20 20 20 20 20 20 20 20  = iCol;.        
d8f0: 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 64  pOrderBy->a[i].d
d900: 6f 6e 65 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d  one = 1;.      }
d910: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 6d 6f  else{.        mo
d920: 72 65 54 6f 44 6f 20 3d 20 31 3b 0a 20 20 20 20  reToDo = 1;.    
d930: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 70 53    }.    }.    pS
d940: 65 6c 65 63 74 20 3d 20 70 53 65 6c 65 63 74 2d  elect = pSelect-
d950: 3e 70 4e 65 78 74 3b 0a 20 20 7d 0a 20 20 66 6f  >pNext;.  }.  fo
d960: 72 28 69 3d 30 3b 20 69 3c 70 4f 72 64 65 72 42  r(i=0; i<pOrderB
d970: 79 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a  y->nExpr; i++){.
d980: 20 20 20 20 69 66 28 20 70 4f 72 64 65 72 42 79      if( pOrderBy
d990: 2d 3e 61 5b 69 5d 2e 64 6f 6e 65 3d 3d 30 20 29  ->a[i].done==0 )
d9a0: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  {.      sqlite3E
d9b0: 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
d9c0: 22 25 72 20 4f 52 44 45 52 20 42 59 20 74 65 72  "%r ORDER BY ter
d9d0: 6d 20 64 6f 65 73 20 6e 6f 74 20 6d 61 74 63 68  m does not match
d9e0: 20 61 6e 79 20 22 0a 20 20 20 20 20 20 20 20 20   any ".         
d9f0: 20 20 20 22 63 6f 6c 75 6d 6e 20 69 6e 20 74 68     "column in th
da00: 65 20 72 65 73 75 6c 74 20 73 65 74 22 2c 20 69  e result set", i
da10: 2b 31 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  +1);.      retur
da20: 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  n 1;.    }.  }. 
da30: 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a   return 0;.}../*
da40: 0a 2a 2a 20 47 65 74 20 61 20 56 44 42 45 20 66  .** Get a VDBE f
da50: 6f 72 20 74 68 65 20 67 69 76 65 6e 20 70 61 72  or the given par
da60: 73 65 72 20 63 6f 6e 74 65 78 74 2e 20 20 43 72  ser context.  Cr
da70: 65 61 74 65 20 61 20 6e 65 77 20 6f 6e 65 20 69  eate a new one i
da80: 66 20 6e 65 63 65 73 73 61 72 79 2e 0a 2a 2a 20  f necessary..** 
da90: 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75  If an error occu
daa0: 72 73 2c 20 72 65 74 75 72 6e 20 4e 55 4c 4c 20  rs, return NULL 
dab0: 61 6e 64 20 6c 65 61 76 65 20 61 20 6d 65 73 73  and leave a mess
dac0: 61 67 65 20 69 6e 20 70 50 61 72 73 65 2e 0a 2a  age in pParse..*
dad0: 2f 0a 56 64 62 65 20 2a 73 71 6c 69 74 65 33 47  /.Vdbe *sqlite3G
dae0: 65 74 56 64 62 65 28 50 61 72 73 65 20 2a 70 50  etVdbe(Parse *pP
daf0: 61 72 73 65 29 7b 0a 20 20 56 64 62 65 20 2a 76  arse){.  Vdbe *v
db00: 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65   = pParse->pVdbe
db10: 3b 0a 20 20 69 66 28 20 76 3d 3d 30 20 29 7b 0a  ;.  if( v==0 ){.
db20: 20 20 20 20 76 20 3d 20 70 50 61 72 73 65 2d 3e      v = pParse->
db30: 70 56 64 62 65 20 3d 20 73 71 6c 69 74 65 33 56  pVdbe = sqlite3V
db40: 64 62 65 43 72 65 61 74 65 28 70 50 61 72 73 65  dbeCreate(pParse
db50: 2d 3e 64 62 29 3b 0a 23 69 66 6e 64 65 66 20 53  ->db);.#ifndef S
db60: 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 41 43 45  QLITE_OMIT_TRACE
db70: 0a 20 20 20 20 69 66 28 20 76 20 29 7b 0a 20 20  .    if( v ){.  
db80: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
db90: 64 64 4f 70 30 28 76 2c 20 4f 50 5f 54 72 61 63  ddOp0(v, OP_Trac
dba0: 65 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66  e);.    }.#endif
dbb0: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 76 3b  .  }.  return v;
dbc0: 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 75  .}.../*.** Compu
dbd0: 74 65 20 74 68 65 20 69 4c 69 6d 69 74 20 61 6e  te the iLimit an
dbe0: 64 20 69 4f 66 66 73 65 74 20 66 69 65 6c 64 73  d iOffset fields
dbf0: 20 6f 66 20 74 68 65 20 53 45 4c 45 43 54 20 62   of the SELECT b
dc00: 61 73 65 64 20 6f 6e 20 74 68 65 0a 2a 2a 20 70  ased on the.** p
dc10: 4c 69 6d 69 74 20 61 6e 64 20 70 4f 66 66 73 65  Limit and pOffse
dc20: 74 20 65 78 70 72 65 73 73 69 6f 6e 73 2e 20 20  t expressions.  
dc30: 70 4c 69 6d 69 74 20 61 6e 64 20 70 4f 66 66 73  pLimit and pOffs
dc40: 65 74 20 68 6f 6c 64 20 74 68 65 20 65 78 70 72  et hold the expr
dc50: 65 73 73 69 6f 6e 73 0a 2a 2a 20 74 68 61 74 20  essions.** that 
dc60: 61 70 70 65 61 72 20 69 6e 20 74 68 65 20 6f 72  appear in the or
dc70: 69 67 69 6e 61 6c 20 53 51 4c 20 73 74 61 74 65  iginal SQL state
dc80: 6d 65 6e 74 20 61 66 74 65 72 20 74 68 65 20 4c  ment after the L
dc90: 49 4d 49 54 20 61 6e 64 20 4f 46 46 53 45 54 0a  IMIT and OFFSET.
dca0: 2a 2a 20 6b 65 79 77 6f 72 64 73 2e 20 20 4f 72  ** keywords.  Or
dcb0: 20 4e 55 4c 4c 20 69 66 20 74 68 6f 73 65 20 6b   NULL if those k
dcc0: 65 79 77 6f 72 64 73 20 61 72 65 20 6f 6d 69 74  eywords are omit
dcd0: 74 65 64 2e 20 69 4c 69 6d 69 74 20 61 6e 64 20  ted. iLimit and 
dce0: 69 4f 66 66 73 65 74 20 0a 2a 2a 20 61 72 65 20  iOffset .** are 
dcf0: 74 68 65 20 69 6e 74 65 67 65 72 20 6d 65 6d 6f  the integer memo
dd00: 72 79 20 72 65 67 69 73 74 65 72 20 6e 75 6d 62  ry register numb
dd10: 65 72 73 20 66 6f 72 20 63 6f 75 6e 74 65 72 73  ers for counters
dd20: 20 75 73 65 64 20 74 6f 20 63 6f 6d 70 75 74 65   used to compute
dd30: 20 0a 2a 2a 20 74 68 65 20 6c 69 6d 69 74 20 61   .** the limit a
dd40: 6e 64 20 6f 66 66 73 65 74 2e 20 20 49 66 20 74  nd offset.  If t
dd50: 68 65 72 65 20 69 73 20 6e 6f 20 6c 69 6d 69 74  here is no limit
dd60: 20 61 6e 64 2f 6f 72 20 6f 66 66 73 65 74 2c 20   and/or offset, 
dd70: 74 68 65 6e 20 0a 2a 2a 20 69 4c 69 6d 69 74 20  then .** iLimit 
dd80: 61 6e 64 20 69 4f 66 66 73 65 74 20 61 72 65 20  and iOffset are 
dd90: 6e 65 67 61 74 69 76 65 2e 0a 2a 2a 0a 2a 2a 20  negative..**.** 
dda0: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 63 68 61  This routine cha
ddb0: 6e 67 65 73 20 74 68 65 20 76 61 6c 75 65 73 20  nges the values 
ddc0: 6f 66 20 69 4c 69 6d 69 74 20 61 6e 64 20 69 4f  of iLimit and iO
ddd0: 66 66 73 65 74 20 6f 6e 6c 79 20 69 66 0a 2a 2a  ffset only if.**
dde0: 20 61 20 6c 69 6d 69 74 20 6f 72 20 6f 66 66 73   a limit or offs
ddf0: 65 74 20 69 73 20 64 65 66 69 6e 65 64 20 62 79  et is defined by
de00: 20 70 4c 69 6d 69 74 20 61 6e 64 20 70 4f 66 66   pLimit and pOff
de10: 73 65 74 2e 20 20 69 4c 69 6d 69 74 20 61 6e 64  set.  iLimit and
de20: 0a 2a 2a 20 69 4f 66 66 73 65 74 20 73 68 6f 75  .** iOffset shou
de30: 6c 64 20 68 61 76 65 20 62 65 65 6e 20 70 72 65  ld have been pre
de40: 73 65 74 20 74 6f 20 61 70 70 72 6f 70 72 69 61  set to appropria
de50: 74 65 20 64 65 66 61 75 6c 74 20 76 61 6c 75 65  te default value
de60: 73 0a 2a 2a 20 28 75 73 75 61 6c 6c 79 20 62 75  s.** (usually bu
de70: 74 20 6e 6f 74 20 61 6c 77 61 79 73 20 2d 31 29  t not always -1)
de80: 20 70 72 69 6f 72 20 74 6f 20 63 61 6c 6c 69 6e   prior to callin
de90: 67 20 74 68 69 73 20 72 6f 75 74 69 6e 65 2e 0a  g this routine..
dea0: 2a 2a 20 4f 6e 6c 79 20 69 66 20 70 4c 69 6d 69  ** Only if pLimi
deb0: 74 21 3d 30 20 6f 72 20 70 4f 66 66 73 65 74 21  t!=0 or pOffset!
dec0: 3d 30 20 64 6f 20 74 68 65 20 6c 69 6d 69 74 20  =0 do the limit 
ded0: 72 65 67 69 73 74 65 72 73 20 67 65 74 0a 2a 2a  registers get.**
dee0: 20 72 65 64 65 66 69 6e 65 64 2e 20 20 54 68 65   redefined.  The
def0: 20 55 4e 49 4f 4e 20 41 4c 4c 20 6f 70 65 72 61   UNION ALL opera
df00: 74 6f 72 20 75 73 65 73 20 74 68 69 73 20 70 72  tor uses this pr
df10: 6f 70 65 72 74 79 20 74 6f 20 66 6f 72 63 65 0a  operty to force.
df20: 2a 2a 20 74 68 65 20 72 65 75 73 65 20 6f 66 20  ** the reuse of 
df30: 74 68 65 20 73 61 6d 65 20 6c 69 6d 69 74 20 61  the same limit a
df40: 6e 64 20 6f 66 66 73 65 74 20 72 65 67 69 73 74  nd offset regist
df50: 65 72 73 20 61 63 72 6f 73 73 20 6d 75 6c 74 69  ers across multi
df60: 70 6c 65 0a 2a 2a 20 53 45 4c 45 43 54 20 73 74  ple.** SELECT st
df70: 61 74 65 6d 65 6e 74 73 2e 0a 2a 2f 0a 73 74 61  atements..*/.sta
df80: 74 69 63 20 76 6f 69 64 20 63 6f 6d 70 75 74 65  tic void compute
df90: 4c 69 6d 69 74 52 65 67 69 73 74 65 72 73 28 50  LimitRegisters(P
dfa0: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 53 65  arse *pParse, Se
dfb0: 6c 65 63 74 20 2a 70 2c 20 69 6e 74 20 69 42 72  lect *p, int iBr
dfc0: 65 61 6b 29 7b 0a 20 20 56 64 62 65 20 2a 76 20  eak){.  Vdbe *v 
dfd0: 3d 20 30 3b 0a 20 20 69 6e 74 20 69 4c 69 6d 69  = 0;.  int iLimi
dfe0: 74 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69 4f 66  t = 0;.  int iOf
dff0: 66 73 65 74 3b 0a 20 20 69 6e 74 20 61 64 64 72  fset;.  int addr
e000: 31 3b 0a 20 20 69 66 28 20 70 2d 3e 69 4c 69 6d  1;.  if( p->iLim
e010: 69 74 20 29 20 72 65 74 75 72 6e 3b 0a 0a 20 20  it ) return;..  
e020: 2f 2a 20 0a 20 20 2a 2a 20 22 4c 49 4d 49 54 20  /* .  ** "LIMIT 
e030: 2d 31 22 20 61 6c 77 61 79 73 20 73 68 6f 77 73  -1" always shows
e040: 20 61 6c 6c 20 72 6f 77 73 2e 20 20 54 68 65 72   all rows.  Ther
e050: 65 20 69 73 20 73 6f 6d 65 0a 20 20 2a 2a 20 63  e is some.  ** c
e060: 6f 6e 74 72 61 76 65 72 73 79 20 61 62 6f 75 74  ontraversy about
e070: 20 77 68 61 74 20 74 68 65 20 63 6f 72 72 65 63   what the correc
e080: 74 20 62 65 68 61 76 69 6f 72 20 73 68 6f 75 6c  t behavior shoul
e090: 64 20 62 65 2e 0a 20 20 2a 2a 20 54 68 65 20 63  d be..  ** The c
e0a0: 75 72 72 65 6e 74 20 69 6d 70 6c 65 6d 65 6e 74  urrent implement
e0b0: 61 74 69 6f 6e 20 69 6e 74 65 72 70 72 65 74 73  ation interprets
e0c0: 20 22 4c 49 4d 49 54 20 30 22 20 74 6f 20 6d 65   "LIMIT 0" to me
e0d0: 61 6e 0a 20 20 2a 2a 20 6e 6f 20 72 6f 77 73 2e  an.  ** no rows.
e0e0: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 70  .  */.  if( p->p
e0f0: 4c 69 6d 69 74 20 29 7b 0a 20 20 20 20 70 2d 3e  Limit ){.    p->
e100: 69 4c 69 6d 69 74 20 3d 20 69 4c 69 6d 69 74 20  iLimit = iLimit 
e110: 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d  = ++pParse->nMem
e120: 3b 0a 20 20 20 20 76 20 3d 20 73 71 6c 69 74 65  ;.    v = sqlite
e130: 33 47 65 74 56 64 62 65 28 70 50 61 72 73 65 29  3GetVdbe(pParse)
e140: 3b 0a 20 20 20 20 69 66 28 20 76 3d 3d 30 20 29  ;.    if( v==0 )
e150: 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 73 71 6c   return;.    sql
e160: 69 74 65 33 45 78 70 72 43 6f 64 65 28 70 50 61  ite3ExprCode(pPa
e170: 72 73 65 2c 20 70 2d 3e 70 4c 69 6d 69 74 2c 20  rse, p->pLimit, 
e180: 69 4c 69 6d 69 74 29 3b 0a 20 20 20 20 73 71 6c  iLimit);.    sql
e190: 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76  ite3VdbeAddOp1(v
e1a0: 2c 20 4f 50 5f 4d 75 73 74 42 65 49 6e 74 2c 20  , OP_MustBeInt, 
e1b0: 69 4c 69 6d 69 74 29 3b 0a 20 20 20 20 56 64 62  iLimit);.    Vdb
e1c0: 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 4c 49  eComment((v, "LI
e1d0: 4d 49 54 20 63 6f 75 6e 74 65 72 22 29 29 3b 0a  MIT counter"));.
e1e0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
e1f0: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 66 5a 65  ddOp2(v, OP_IfZe
e200: 72 6f 2c 20 69 4c 69 6d 69 74 2c 20 69 42 72 65  ro, iLimit, iBre
e210: 61 6b 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  ak);.  }.  if( p
e220: 2d 3e 70 4f 66 66 73 65 74 20 29 7b 0a 20 20 20  ->pOffset ){.   
e230: 20 70 2d 3e 69 4f 66 66 73 65 74 20 3d 20 69 4f   p->iOffset = iO
e240: 66 66 73 65 74 20 3d 20 2b 2b 70 50 61 72 73 65  ffset = ++pParse
e250: 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 69 66 28 20  ->nMem;.    if( 
e260: 70 2d 3e 70 4c 69 6d 69 74 20 29 7b 0a 20 20 20  p->pLimit ){.   
e270: 20 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b     pParse->nMem+
e280: 2b 3b 20 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65  +;   /* Allocate
e290: 20 61 6e 20 65 78 74 72 61 20 72 65 67 69 73 74   an extra regist
e2a0: 65 72 20 66 6f 72 20 6c 69 6d 69 74 2b 6f 66 66  er for limit+off
e2b0: 73 65 74 20 2a 2f 0a 20 20 20 20 7d 0a 20 20 20  set */.    }.   
e2c0: 20 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56   v = sqlite3GetV
e2d0: 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20 20  dbe(pParse);.   
e2e0: 20 69 66 28 20 76 3d 3d 30 20 29 20 72 65 74 75   if( v==0 ) retu
e2f0: 72 6e 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45  rn;.    sqlite3E
e300: 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20  xprCode(pParse, 
e310: 70 2d 3e 70 4f 66 66 73 65 74 2c 20 69 4f 66 66  p->pOffset, iOff
e320: 73 65 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  set);.    sqlite
e330: 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f  3VdbeAddOp1(v, O
e340: 50 5f 4d 75 73 74 42 65 49 6e 74 2c 20 69 4f 66  P_MustBeInt, iOf
e350: 66 73 65 74 29 3b 0a 20 20 20 20 56 64 62 65 43  fset);.    VdbeC
e360: 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 4f 46 46 53  omment((v, "OFFS
e370: 45 54 20 63 6f 75 6e 74 65 72 22 29 29 3b 0a 20  ET counter"));. 
e380: 20 20 20 61 64 64 72 31 20 3d 20 73 71 6c 69 74     addr1 = sqlit
e390: 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20  e3VdbeAddOp1(v, 
e3a0: 4f 50 5f 49 66 50 6f 73 2c 20 69 4f 66 66 73 65  OP_IfPos, iOffse
e3b0: 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  t);.    sqlite3V
e3c0: 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
e3d0: 49 6e 74 65 67 65 72 2c 20 30 2c 20 69 4f 66 66  Integer, 0, iOff
e3e0: 73 65 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  set);.    sqlite
e3f0: 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c  3VdbeJumpHere(v,
e400: 20 61 64 64 72 31 29 3b 0a 20 20 20 20 69 66 28   addr1);.    if(
e410: 20 70 2d 3e 70 4c 69 6d 69 74 20 29 7b 0a 20 20   p->pLimit ){.  
e420: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
e430: 64 64 4f 70 33 28 76 2c 20 4f 50 5f 41 64 64 2c  ddOp3(v, OP_Add,
e440: 20 69 4c 69 6d 69 74 2c 20 69 4f 66 66 73 65 74   iLimit, iOffset
e450: 2c 20 69 4f 66 66 73 65 74 2b 31 29 3b 0a 20 20  , iOffset+1);.  
e460: 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28      VdbeComment(
e470: 28 76 2c 20 22 4c 49 4d 49 54 2b 4f 46 46 53 45  (v, "LIMIT+OFFSE
e480: 54 22 29 29 3b 0a 20 20 20 20 20 20 61 64 64 72  T"));.      addr
e490: 31 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41  1 = sqlite3VdbeA
e4a0: 64 64 4f 70 31 28 76 2c 20 4f 50 5f 49 66 50 6f  ddOp1(v, OP_IfPo
e4b0: 73 2c 20 69 4c 69 6d 69 74 29 3b 0a 20 20 20 20  s, iLimit);.    
e4c0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
e4d0: 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65  Op2(v, OP_Intege
e4e0: 72 2c 20 2d 31 2c 20 69 4f 66 66 73 65 74 2b 31  r, -1, iOffset+1
e4f0: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
e500: 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20  VdbeJumpHere(v, 
e510: 61 64 64 72 31 29 3b 0a 20 20 20 20 7d 0a 20 20  addr1);.    }.  
e520: 7d 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c  }.}..#ifndef SQL
e530: 49 54 45 5f 4f 4d 49 54 5f 43 4f 4d 50 4f 55 4e  ITE_OMIT_COMPOUN
e540: 44 5f 53 45 4c 45 43 54 0a 2f 2a 0a 2a 2a 20 52  D_SELECT./*.** R
e550: 65 74 75 72 6e 20 74 68 65 20 61 70 70 72 6f 70  eturn the approp
e560: 72 69 61 74 65 20 63 6f 6c 6c 61 74 69 6e 67 20  riate collating 
e570: 73 65 71 75 65 6e 63 65 20 66 6f 72 20 74 68 65  sequence for the
e580: 20 69 43 6f 6c 2d 74 68 20 63 6f 6c 75 6d 6e 20   iCol-th column 
e590: 6f 66 0a 2a 2a 20 74 68 65 20 72 65 73 75 6c 74  of.** the result
e5a0: 20 73 65 74 20 66 6f 72 20 74 68 65 20 63 6f 6d   set for the com
e5b0: 70 6f 75 6e 64 2d 73 65 6c 65 63 74 20 73 74 61  pound-select sta
e5c0: 74 65 6d 65 6e 74 20 22 70 22 2e 20 20 52 65 74  tement "p".  Ret
e5d0: 75 72 6e 20 4e 55 4c 4c 20 69 66 0a 2a 2a 20 74  urn NULL if.** t
e5e0: 68 65 20 63 6f 6c 75 6d 6e 20 68 61 73 20 6e 6f  he column has no
e5f0: 20 64 65 66 61 75 6c 74 20 63 6f 6c 6c 61 74 69   default collati
e600: 6e 67 20 73 65 71 75 65 6e 63 65 2e 0a 2a 2a 0a  ng sequence..**.
e610: 2a 2a 20 54 68 65 20 63 6f 6c 6c 61 74 69 6e 67  ** The collating
e620: 20 73 65 71 75 65 6e 63 65 20 66 6f 72 20 74 68   sequence for th
e630: 65 20 63 6f 6d 70 6f 75 6e 64 20 73 65 6c 65 63  e compound selec
e640: 74 20 69 73 20 74 61 6b 65 6e 20 66 72 6f 6d 20  t is taken from 
e650: 74 68 65 0a 2a 2a 20 6c 65 66 74 2d 6d 6f 73 74  the.** left-most
e660: 20 74 65 72 6d 20 6f 66 20 74 68 65 20 73 65 6c   term of the sel
e670: 65 63 74 20 74 68 61 74 20 68 61 73 20 61 20 63  ect that has a c
e680: 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63  ollating sequenc
e690: 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 43 6f 6c  e..*/.static Col
e6a0: 6c 53 65 71 20 2a 6d 75 6c 74 69 53 65 6c 65 63  lSeq *multiSelec
e6b0: 74 43 6f 6c 6c 53 65 71 28 50 61 72 73 65 20 2a  tCollSeq(Parse *
e6c0: 70 50 61 72 73 65 2c 20 53 65 6c 65 63 74 20 2a  pParse, Select *
e6d0: 70 2c 20 69 6e 74 20 69 43 6f 6c 29 7b 0a 20 20  p, int iCol){.  
e6e0: 43 6f 6c 6c 53 65 71 20 2a 70 52 65 74 3b 0a 20  CollSeq *pRet;. 
e6f0: 20 69 66 28 20 70 2d 3e 70 50 72 69 6f 72 20 29   if( p->pPrior )
e700: 7b 0a 20 20 20 20 70 52 65 74 20 3d 20 6d 75 6c  {.    pRet = mul
e710: 74 69 53 65 6c 65 63 74 43 6f 6c 6c 53 65 71 28  tiSelectCollSeq(
e720: 70 50 61 72 73 65 2c 20 70 2d 3e 70 50 72 69 6f  pParse, p->pPrio
e730: 72 2c 20 69 43 6f 6c 29 3b 0a 20 20 7d 65 6c 73  r, iCol);.  }els
e740: 65 7b 0a 20 20 20 20 70 52 65 74 20 3d 20 30 3b  e{.    pRet = 0;
e750: 0a 20 20 7d 0a 20 20 69 66 28 20 70 52 65 74 3d  .  }.  if( pRet=
e760: 3d 30 20 29 7b 0a 20 20 20 20 70 52 65 74 20 3d  =0 ){.    pRet =
e770: 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c   sqlite3ExprColl
e780: 53 65 71 28 70 50 61 72 73 65 2c 20 70 2d 3e 70  Seq(pParse, p->p
e790: 45 4c 69 73 74 2d 3e 61 5b 69 43 6f 6c 5d 2e 70  EList->a[iCol].p
e7a0: 45 78 70 72 29 3b 0a 20 20 7d 0a 20 20 72 65 74  Expr);.  }.  ret
e7b0: 75 72 6e 20 70 52 65 74 3b 0a 7d 0a 23 65 6e 64  urn pRet;.}.#end
e7c0: 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49  if /* SQLITE_OMI
e7d0: 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45 43  T_COMPOUND_SELEC
e7e0: 54 20 2a 2f 0a 0a 2f 2a 20 46 6f 72 77 61 72 64  T */../* Forward
e7f0: 20 72 65 66 65 72 65 6e 63 65 20 2a 2f 0a 73 74   reference */.st
e800: 61 74 69 63 20 69 6e 74 20 6d 75 6c 74 69 53 65  atic int multiSe
e810: 6c 65 63 74 4f 72 64 65 72 42 79 28 0a 20 20 50  lectOrderBy(.  P
e820: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
e830: 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20       /* Parsing 
e840: 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53 65 6c  context */.  Sel
e850: 65 63 74 20 2a 70 2c 20 20 20 20 20 20 20 20 20  ect *p,         
e860: 20 20 20 2f 2a 20 54 68 65 20 72 69 67 68 74 2d     /* The right-
e870: 6d 6f 73 74 20 6f 66 20 53 45 4c 45 43 54 73 20  most of SELECTs 
e880: 74 6f 20 62 65 20 63 6f 64 65 64 20 2a 2f 0a 20  to be coded */. 
e890: 20 53 65 6c 65 63 74 44 65 73 74 20 2a 70 44 65   SelectDest *pDe
e8a0: 73 74 20 20 20 20 20 2f 2a 20 57 68 61 74 20 74  st     /* What t
e8b0: 6f 20 64 6f 20 77 69 74 68 20 71 75 65 72 79 20  o do with query 
e8c0: 72 65 73 75 6c 74 73 20 2a 2f 0a 29 3b 0a 0a 0a  results */.);...
e8d0: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
e8e0: 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c  MIT_COMPOUND_SEL
e8f0: 45 43 54 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  ECT./*.** This r
e900: 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64  outine is called
e910: 20 74 6f 20 70 72 6f 63 65 73 73 20 61 20 63 6f   to process a co
e920: 6d 70 6f 75 6e 64 20 71 75 65 72 79 20 66 6f 72  mpound query for
e930: 6d 20 66 72 6f 6d 0a 2a 2a 20 74 77 6f 20 6f 72  m from.** two or
e940: 20 6d 6f 72 65 20 73 65 70 61 72 61 74 65 20 71   more separate q
e950: 75 65 72 69 65 73 20 75 73 69 6e 67 20 55 4e 49  ueries using UNI
e960: 4f 4e 2c 20 55 4e 49 4f 4e 20 41 4c 4c 2c 20 45  ON, UNION ALL, E
e970: 58 43 45 50 54 2c 20 6f 72 0a 2a 2a 20 49 4e 54  XCEPT, or.** INT
e980: 45 52 53 45 43 54 0a 2a 2a 0a 2a 2a 20 22 70 22  ERSECT.**.** "p"
e990: 20 70 6f 69 6e 74 73 20 74 6f 20 74 68 65 20 72   points to the r
e9a0: 69 67 68 74 2d 6d 6f 73 74 20 6f 66 20 74 68 65  ight-most of the
e9b0: 20 74 77 6f 20 71 75 65 72 69 65 73 2e 20 20 74   two queries.  t
e9c0: 68 65 20 71 75 65 72 79 20 6f 6e 20 74 68 65 0a  he query on the.
e9d0: 2a 2a 20 6c 65 66 74 20 69 73 20 70 2d 3e 70 50  ** left is p->pP
e9e0: 72 69 6f 72 2e 20 20 54 68 65 20 6c 65 66 74 20  rior.  The left 
e9f0: 71 75 65 72 79 20 63 6f 75 6c 64 20 61 6c 73 6f  query could also
ea00: 20 62 65 20 61 20 63 6f 6d 70 6f 75 6e 64 20 71   be a compound q
ea10: 75 65 72 79 0a 2a 2a 20 69 6e 20 77 68 69 63 68  uery.** in which
ea20: 20 63 61 73 65 20 74 68 69 73 20 72 6f 75 74 69   case this routi
ea30: 6e 65 20 77 69 6c 6c 20 62 65 20 63 61 6c 6c 65  ne will be calle
ea40: 64 20 72 65 63 75 72 73 69 76 65 6c 79 2e 20 0a  d recursively. .
ea50: 2a 2a 0a 2a 2a 20 54 68 65 20 72 65 73 75 6c 74  **.** The result
ea60: 73 20 6f 66 20 74 68 65 20 74 6f 74 61 6c 20 71  s of the total q
ea70: 75 65 72 79 20 61 72 65 20 74 6f 20 62 65 20 77  uery are to be w
ea80: 72 69 74 74 65 6e 20 69 6e 74 6f 20 61 20 64 65  ritten into a de
ea90: 73 74 69 6e 61 74 69 6f 6e 0a 2a 2a 20 6f 66 20  stination.** of 
eaa0: 74 79 70 65 20 65 44 65 73 74 20 77 69 74 68 20  type eDest with 
eab0: 70 61 72 61 6d 65 74 65 72 20 69 50 61 72 6d 2e  parameter iParm.
eac0: 0a 2a 2a 0a 2a 2a 20 45 78 61 6d 70 6c 65 20 31  .**.** Example 1
ead0: 3a 20 20 43 6f 6e 73 69 64 65 72 20 61 20 74 68  :  Consider a th
eae0: 72 65 65 2d 77 61 79 20 63 6f 6d 70 6f 75 6e 64  ree-way compound
eaf0: 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 2e 0a   SQL statement..
eb00: 2a 2a 0a 2a 2a 20 20 20 20 20 53 45 4c 45 43 54  **.**     SELECT
eb10: 20 61 20 46 52 4f 4d 20 74 31 20 55 4e 49 4f 4e   a FROM t1 UNION
eb20: 20 53 45 4c 45 43 54 20 62 20 46 52 4f 4d 20 74   SELECT b FROM t
eb30: 32 20 55 4e 49 4f 4e 20 53 45 4c 45 43 54 20 63  2 UNION SELECT c
eb40: 20 46 52 4f 4d 20 74 33 0a 2a 2a 0a 2a 2a 20 54   FROM t3.**.** T
eb50: 68 69 73 20 73 74 61 74 65 6d 65 6e 74 20 69 73  his statement is
eb60: 20 70 61 72 73 65 64 20 75 70 20 61 73 20 66 6f   parsed up as fo
eb70: 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  llows:.**.**    
eb80: 20 53 45 4c 45 43 54 20 63 20 46 52 4f 4d 20 74   SELECT c FROM t
eb90: 33 0a 2a 2a 20 20 20 20 20 20 7c 0a 2a 2a 20 20  3.**      |.**  
eba0: 20 20 20 20 60 2d 2d 2d 2d 2d 3e 20 20 53 45 4c      `----->  SEL
ebb0: 45 43 54 20 62 20 46 52 4f 4d 20 74 32 0a 2a 2a  ECT b FROM t2.**
ebc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ebd0: 7c 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  |.**            
ebe0: 20 20 20 20 60 2d 2d 2d 2d 2d 2d 3e 20 20 53 45      `------>  SE
ebf0: 4c 45 43 54 20 61 20 46 52 4f 4d 20 74 31 0a 2a  LECT a FROM t1.*
ec00: 2a 0a 2a 2a 20 54 68 65 20 61 72 72 6f 77 73 20  *.** The arrows 
ec10: 69 6e 20 74 68 65 20 64 69 61 67 72 61 6d 20 61  in the diagram a
ec20: 62 6f 76 65 20 72 65 70 72 65 73 65 6e 74 20 74  bove represent t
ec30: 68 65 20 53 65 6c 65 63 74 2e 70 50 72 69 6f 72  he Select.pPrior
ec40: 20 70 6f 69 6e 74 65 72 2e 0a 2a 2a 20 53 6f 20   pointer..** So 
ec50: 69 66 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  if this routine 
ec60: 69 73 20 63 61 6c 6c 65 64 20 77 69 74 68 20 70  is called with p
ec70: 20 65 71 75 61 6c 20 74 6f 20 74 68 65 20 74 33   equal to the t3
ec80: 20 71 75 65 72 79 2c 20 74 68 65 6e 0a 2a 2a 20   query, then.** 
ec90: 70 50 72 69 6f 72 20 77 69 6c 6c 20 62 65 20 74  pPrior will be t
eca0: 68 65 20 74 32 20 71 75 65 72 79 2e 20 20 70 2d  he t2 query.  p-
ecb0: 3e 6f 70 20 77 69 6c 6c 20 62 65 20 54 4b 5f 55  >op will be TK_U
ecc0: 4e 49 4f 4e 20 69 6e 20 74 68 69 73 20 63 61 73  NION in this cas
ecd0: 65 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 69 63 65 20  e..**.** Notice 
ece0: 74 68 61 74 20 62 65 63 61 75 73 65 20 6f 66 20  that because of 
ecf0: 74 68 65 20 77 61 79 20 53 51 4c 69 74 65 20 70  the way SQLite p
ed00: 61 72 73 65 73 20 63 6f 6d 70 6f 75 6e 64 20 53  arses compound S
ed10: 45 4c 45 43 54 73 2c 20 74 68 65 0a 2a 2a 20 69  ELECTs, the.** i
ed20: 6e 64 69 76 69 64 75 61 6c 20 73 65 6c 65 63 74  ndividual select
ed30: 73 20 61 6c 77 61 79 73 20 67 72 6f 75 70 20 66  s always group f
ed40: 72 6f 6d 20 6c 65 66 74 20 74 6f 20 72 69 67 68  rom left to righ
ed50: 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  t..*/.static int
ed60: 20 6d 75 6c 74 69 53 65 6c 65 63 74 28 0a 20 20   multiSelect(.  
ed70: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
ed80: 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67        /* Parsing
ed90: 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53 65   context */.  Se
eda0: 6c 65 63 74 20 2a 70 2c 20 20 20 20 20 20 20 20  lect *p,        
edb0: 20 20 20 20 2f 2a 20 54 68 65 20 72 69 67 68 74      /* The right
edc0: 2d 6d 6f 73 74 20 6f 66 20 53 45 4c 45 43 54 73  -most of SELECTs
edd0: 20 74 6f 20 62 65 20 63 6f 64 65 64 20 2a 2f 0a   to be coded */.
ede0: 20 20 53 65 6c 65 63 74 44 65 73 74 20 2a 70 44    SelectDest *pD
edf0: 65 73 74 20 20 20 20 20 2f 2a 20 57 68 61 74 20  est     /* What 
ee00: 74 6f 20 64 6f 20 77 69 74 68 20 71 75 65 72 79  to do with query
ee10: 20 72 65 73 75 6c 74 73 20 2a 2f 0a 29 7b 0a 20   results */.){. 
ee20: 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
ee30: 5f 4f 4b 3b 20 20 20 2f 2a 20 53 75 63 63 65 73  _OK;   /* Succes
ee40: 73 20 63 6f 64 65 20 66 72 6f 6d 20 61 20 73 75  s code from a su
ee50: 62 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 53 65  broutine */.  Se
ee60: 6c 65 63 74 20 2a 70 50 72 69 6f 72 3b 20 20 20  lect *pPrior;   
ee70: 20 20 20 20 2f 2a 20 41 6e 6f 74 68 65 72 20 53      /* Another S
ee80: 45 4c 45 43 54 20 69 6d 6d 65 64 69 61 74 65 6c  ELECT immediatel
ee90: 79 20 74 6f 20 6f 75 72 20 6c 65 66 74 20 2a 2f  y to our left */
eea0: 0a 20 20 56 64 62 65 20 2a 76 3b 20 20 20 20 20  .  Vdbe *v;     
eeb0: 20 20 20 20 20 20 20 20 20 2f 2a 20 47 65 6e 65           /* Gene
eec0: 72 61 74 65 20 63 6f 64 65 20 74 6f 20 74 68 69  rate code to thi
eed0: 73 20 56 44 42 45 20 2a 2f 0a 20 20 53 65 6c 65  s VDBE */.  Sele
eee0: 63 74 44 65 73 74 20 64 65 73 74 3b 20 20 20 20  ctDest dest;    
eef0: 20 20 2f 2a 20 41 6c 74 65 72 6e 61 74 69 76 65    /* Alternative
ef00: 20 64 61 74 61 20 64 65 73 74 69 6e 61 74 69 6f   data destinatio
ef10: 6e 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70  n */.  Select *p
ef20: 44 65 6c 65 74 65 20 3d 20 30 3b 20 20 2f 2a 20  Delete = 0;  /* 
ef30: 43 68 61 69 6e 20 6f 66 20 73 69 6d 70 6c 65 20  Chain of simple 
ef40: 73 65 6c 65 63 74 73 20 74 6f 20 64 65 6c 65 74  selects to delet
ef50: 65 20 2a 2f 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20  e */..  /* Make 
ef60: 73 75 72 65 20 74 68 65 72 65 20 69 73 20 6e 6f  sure there is no
ef70: 20 4f 52 44 45 52 20 42 59 20 6f 72 20 4c 49 4d   ORDER BY or LIM
ef80: 49 54 20 63 6c 61 75 73 65 20 6f 6e 20 70 72 69  IT clause on pri
ef90: 6f 72 20 53 45 4c 45 43 54 73 2e 20 20 4f 6e 6c  or SELECTs.  Onl
efa0: 79 0a 20 20 2a 2a 20 74 68 65 20 6c 61 73 74 20  y.  ** the last 
efb0: 28 72 69 67 68 74 2d 6d 6f 73 74 29 20 53 45 4c  (right-most) SEL
efc0: 45 43 54 20 69 6e 20 74 68 65 20 73 65 72 69 65  ECT in the serie
efd0: 73 20 6d 61 79 20 68 61 76 65 20 61 6e 20 4f 52  s may have an OR
efe0: 44 45 52 20 42 59 20 6f 72 20 4c 49 4d 49 54 2e  DER BY or LIMIT.
eff0: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 3d 3d 30  .  */.  if( p==0
f000: 20 7c 7c 20 70 2d 3e 70 50 72 69 6f 72 3d 3d 30   || p->pPrior==0
f010: 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 31 3b 0a   ){.    rc = 1;.
f020: 20 20 20 20 67 6f 74 6f 20 6d 75 6c 74 69 5f 73      goto multi_s
f030: 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 7d 0a 20  elect_end;.  }. 
f040: 20 70 50 72 69 6f 72 20 3d 20 70 2d 3e 70 50 72   pPrior = p->pPr
f050: 69 6f 72 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ior;.  assert( p
f060: 50 72 69 6f 72 2d 3e 70 52 69 67 68 74 6d 6f 73  Prior->pRightmos
f070: 74 21 3d 70 50 72 69 6f 72 20 29 3b 0a 20 20 61  t!=pPrior );.  a
f080: 73 73 65 72 74 28 20 70 50 72 69 6f 72 2d 3e 70  ssert( pPrior->p
f090: 52 69 67 68 74 6d 6f 73 74 3d 3d 70 2d 3e 70 52  Rightmost==p->pR
f0a0: 69 67 68 74 6d 6f 73 74 20 29 3b 0a 20 20 69 66  ightmost );.  if
f0b0: 28 20 70 50 72 69 6f 72 2d 3e 70 4f 72 64 65 72  ( pPrior->pOrder
f0c0: 42 79 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  By ){.    sqlite
f0d0: 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
f0e0: 2c 22 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73  ,"ORDER BY claus
f0f0: 65 20 73 68 6f 75 6c 64 20 63 6f 6d 65 20 61 66  e should come af
f100: 74 65 72 20 25 73 20 6e 6f 74 20 62 65 66 6f 72  ter %s not befor
f110: 65 22 2c 0a 20 20 20 20 20 20 73 65 6c 65 63 74  e",.      select
f120: 4f 70 4e 61 6d 65 28 70 2d 3e 6f 70 29 29 3b 0a  OpName(p->op));.
f130: 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20      rc = 1;.    
f140: 67 6f 74 6f 20 6d 75 6c 74 69 5f 73 65 6c 65 63  goto multi_selec
f150: 74 5f 65 6e 64 3b 0a 20 20 7d 0a 20 20 69 66 28  t_end;.  }.  if(
f160: 20 70 50 72 69 6f 72 2d 3e 70 4c 69 6d 69 74 20   pPrior->pLimit 
f170: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72  ){.    sqlite3Er
f180: 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 22 4c  rorMsg(pParse,"L
f190: 49 4d 49 54 20 63 6c 61 75 73 65 20 73 68 6f 75  IMIT clause shou
f1a0: 6c 64 20 63 6f 6d 65 20 61 66 74 65 72 20 25 73  ld come after %s
f1b0: 20 6e 6f 74 20 62 65 66 6f 72 65 22 2c 0a 20 20   not before",.  
f1c0: 20 20 20 20 73 65 6c 65 63 74 4f 70 4e 61 6d 65      selectOpName
f1d0: 28 70 2d 3e 6f 70 29 29 3b 0a 20 20 20 20 72 63  (p->op));.    rc
f1e0: 20 3d 20 31 3b 0a 20 20 20 20 67 6f 74 6f 20 6d   = 1;.    goto m
f1f0: 75 6c 74 69 5f 73 65 6c 65 63 74 5f 65 6e 64 3b  ulti_select_end;
f200: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20  .  }..  /* Make 
f210: 73 75 72 65 20 77 65 20 68 61 76 65 20 61 20 76  sure we have a v
f220: 61 6c 69 64 20 71 75 65 72 79 20 65 6e 67 69 6e  alid query engin
f230: 65 2e 20 20 49 66 20 6e 6f 74 2c 20 63 72 65 61  e.  If not, crea
f240: 74 65 20 61 20 6e 65 77 20 6f 6e 65 2e 0a 20 20  te a new one..  
f250: 2a 2f 0a 20 20 76 20 3d 20 73 71 6c 69 74 65 33  */.  v = sqlite3
f260: 47 65 74 56 64 62 65 28 70 50 61 72 73 65 29 3b  GetVdbe(pParse);
f270: 0a 20 20 69 66 28 20 76 3d 3d 30 20 29 7b 0a 20  .  if( v==0 ){. 
f280: 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 67     rc = 1;.    g
f290: 6f 74 6f 20 6d 75 6c 74 69 5f 73 65 6c 65 63 74  oto multi_select
f2a0: 5f 65 6e 64 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  _end;.  }..  /* 
f2b0: 43 72 65 61 74 65 20 74 68 65 20 64 65 73 74 69  Create the desti
f2c0: 6e 61 74 69 6f 6e 20 74 65 6d 70 6f 72 61 72 79  nation temporary
f2d0: 20 74 61 62 6c 65 20 69 66 20 6e 65 63 65 73 73   table if necess
f2e0: 61 72 79 0a 20 20 2a 2f 0a 20 20 64 65 73 74 20  ary.  */.  dest 
f2f0: 3d 20 2a 70 44 65 73 74 3b 0a 20 20 69 66 28 20  = *pDest;.  if( 
f300: 64 65 73 74 2e 65 44 65 73 74 3d 3d 53 52 54 5f  dest.eDest==SRT_
f310: 45 70 68 65 6d 54 61 62 20 29 7b 0a 20 20 20 20  EphemTab ){.    
f320: 61 73 73 65 72 74 28 20 70 2d 3e 70 45 4c 69 73  assert( p->pELis
f330: 74 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  t );.    sqlite3
f340: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
f350: 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 2c 20  _OpenEphemeral, 
f360: 64 65 73 74 2e 69 50 61 72 6d 2c 20 70 2d 3e 70  dest.iParm, p->p
f370: 45 4c 69 73 74 2d 3e 6e 45 78 70 72 29 3b 0a 20  EList->nExpr);. 
f380: 20 20 20 64 65 73 74 2e 65 44 65 73 74 20 3d 20     dest.eDest = 
f390: 53 52 54 5f 54 61 62 6c 65 3b 0a 20 20 7d 0a 0a  SRT_Table;.  }..
f3a0: 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 61    /* Make sure a
f3b0: 6c 6c 20 53 45 4c 45 43 54 73 20 69 6e 20 74 68  ll SELECTs in th
f3c0: 65 20 73 74 61 74 65 6d 65 6e 74 20 68 61 76 65  e statement have
f3d0: 20 74 68 65 20 73 61 6d 65 20 6e 75 6d 62 65 72   the same number
f3e0: 20 6f 66 20 65 6c 65 6d 65 6e 74 73 0a 20 20 2a   of elements.  *
f3f0: 2a 20 69 6e 20 74 68 65 69 72 20 72 65 73 75 6c  * in their resul
f400: 74 20 73 65 74 73 2e 0a 20 20 2a 2f 0a 20 20 61  t sets..  */.  a
f410: 73 73 65 72 74 28 20 70 2d 3e 70 45 4c 69 73 74  ssert( p->pEList
f420: 20 26 26 20 70 50 72 69 6f 72 2d 3e 70 45 4c 69   && pPrior->pELi
f430: 73 74 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e 70  st );.  if( p->p
f440: 45 4c 69 73 74 2d 3e 6e 45 78 70 72 21 3d 70 50  EList->nExpr!=pP
f450: 72 69 6f 72 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45  rior->pEList->nE
f460: 78 70 72 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  xpr ){.    sqlit
f470: 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
f480: 65 2c 20 22 53 45 4c 45 43 54 73 20 74 6f 20 74  e, "SELECTs to t
f490: 68 65 20 6c 65 66 74 20 61 6e 64 20 72 69 67 68  he left and righ
f4a0: 74 20 6f 66 20 25 73 22 0a 20 20 20 20 20 20 22  t of %s".      "
f4b0: 20 64 6f 20 6e 6f 74 20 68 61 76 65 20 74 68 65   do not have the
f4c0: 20 73 61 6d 65 20 6e 75 6d 62 65 72 20 6f 66 20   same number of 
f4d0: 72 65 73 75 6c 74 20 63 6f 6c 75 6d 6e 73 22 2c  result columns",
f4e0: 20 73 65 6c 65 63 74 4f 70 4e 61 6d 65 28 70 2d   selectOpName(p-
f4f0: 3e 6f 70 29 29 3b 0a 20 20 20 20 72 63 20 3d 20  >op));.    rc = 
f500: 31 3b 0a 20 20 20 20 67 6f 74 6f 20 6d 75 6c 74  1;.    goto mult
f510: 69 5f 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20  i_select_end;.  
f520: 7d 0a 0a 20 20 2f 2a 20 43 6f 6d 70 6f 75 6e 64  }..  /* Compound
f530: 20 53 45 4c 45 43 54 73 20 74 68 61 74 20 68 61   SELECTs that ha
f540: 76 65 20 61 6e 20 4f 52 44 45 52 20 42 59 20 63  ve an ORDER BY c
f550: 6c 61 75 73 65 20 61 72 65 20 68 61 6e 64 6c 65  lause are handle
f560: 64 20 73 65 70 61 72 61 74 65 6c 79 2e 0a 20 20  d separately..  
f570: 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 70 4f 72 64  */.  if( p->pOrd
f580: 65 72 42 79 20 29 7b 0a 20 20 20 20 72 65 74 75  erBy ){.    retu
f590: 72 6e 20 6d 75 6c 74 69 53 65 6c 65 63 74 4f 72  rn multiSelectOr
f5a0: 64 65 72 42 79 28 70 50 61 72 73 65 2c 20 70 2c  derBy(pParse, p,
f5b0: 20 70 44 65 73 74 29 3b 0a 20 20 7d 0a 0a 20 20   pDest);.  }..  
f5c0: 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65  /* Generate code
f5d0: 20 66 6f 72 20 74 68 65 20 6c 65 66 74 20 61 6e   for the left an
f5e0: 64 20 72 69 67 68 74 20 53 45 4c 45 43 54 20 73  d right SELECT s
f5f0: 74 61 74 65 6d 65 6e 74 73 2e 0a 20 20 2a 2f 0a  tatements..  */.
f600: 20 20 73 77 69 74 63 68 28 20 70 2d 3e 6f 70 20    switch( p->op 
f610: 29 7b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 41  ){.    case TK_A
f620: 4c 4c 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20  LL: {.      int 
f630: 61 64 64 72 20 3d 20 30 3b 0a 20 20 20 20 20 20  addr = 0;.      
f640: 61 73 73 65 72 74 28 20 21 70 50 72 69 6f 72 2d  assert( !pPrior-
f650: 3e 70 4c 69 6d 69 74 20 29 3b 0a 20 20 20 20 20  >pLimit );.     
f660: 20 70 50 72 69 6f 72 2d 3e 70 4c 69 6d 69 74 20   pPrior->pLimit 
f670: 3d 20 70 2d 3e 70 4c 69 6d 69 74 3b 0a 20 20 20  = p->pLimit;.   
f680: 20 20 20 70 50 72 69 6f 72 2d 3e 70 4f 66 66 73     pPrior->pOffs
f690: 65 74 20 3d 20 70 2d 3e 70 4f 66 66 73 65 74 3b  et = p->pOffset;
f6a0: 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
f6b0: 74 65 33 53 65 6c 65 63 74 28 70 50 61 72 73 65  te3Select(pParse
f6c0: 2c 20 70 50 72 69 6f 72 2c 20 26 64 65 73 74 2c  , pPrior, &dest,
f6d0: 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20   0, 0, 0);.     
f6e0: 20 70 2d 3e 70 4c 69 6d 69 74 20 3d 20 30 3b 0a   p->pLimit = 0;.
f6f0: 20 20 20 20 20 20 70 2d 3e 70 4f 66 66 73 65 74        p->pOffset
f700: 20 3d 20 30 3b 0a 20 20 20 20 20 20 69 66 28 20   = 0;.      if( 
f710: 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20 67 6f  rc ){.        go
f720: 74 6f 20 6d 75 6c 74 69 5f 73 65 6c 65 63 74 5f  to multi_select_
f730: 65 6e 64 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  end;.      }.   
f740: 20 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d 20 30     p->pPrior = 0
f750: 3b 0a 20 20 20 20 20 20 70 2d 3e 69 4c 69 6d 69  ;.      p->iLimi
f760: 74 20 3d 20 70 50 72 69 6f 72 2d 3e 69 4c 69 6d  t = pPrior->iLim
f770: 69 74 3b 0a 20 20 20 20 20 20 70 2d 3e 69 4f 66  it;.      p->iOf
f780: 66 73 65 74 20 3d 20 70 50 72 69 6f 72 2d 3e 69  fset = pPrior->i
f790: 4f 66 66 73 65 74 3b 0a 20 20 20 20 20 20 69 66  Offset;.      if
f7a0: 28 20 70 2d 3e 69 4c 69 6d 69 74 20 29 7b 0a 20  ( p->iLimit ){. 
f7b0: 20 20 20 20 20 20 20 61 64 64 72 20 3d 20 73 71         addr = sq
f7c0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28  lite3VdbeAddOp1(
f7d0: 76 2c 20 4f 50 5f 49 66 5a 65 72 6f 2c 20 70 2d  v, OP_IfZero, p-
f7e0: 3e 69 4c 69 6d 69 74 29 3b 0a 20 20 20 20 20 20  >iLimit);.      
f7f0: 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76    VdbeComment((v
f800: 2c 20 22 4a 75 6d 70 20 61 68 65 61 64 20 69 66  , "Jump ahead if
f810: 20 4c 49 4d 49 54 20 72 65 61 63 68 65 64 22 29   LIMIT reached")
f820: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
f830: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 53 65 6c   rc = sqlite3Sel
f840: 65 63 74 28 70 50 61 72 73 65 2c 20 70 2c 20 26  ect(pParse, p, &
f850: 64 65 73 74 2c 20 30 2c 20 30 2c 20 30 29 3b 0a  dest, 0, 0, 0);.
f860: 20 20 20 20 20 20 70 44 65 6c 65 74 65 20 3d 20        pDelete = 
f870: 70 2d 3e 70 50 72 69 6f 72 3b 0a 20 20 20 20 20  p->pPrior;.     
f880: 20 70 2d 3e 70 50 72 69 6f 72 20 3d 20 70 50 72   p->pPrior = pPr
f890: 69 6f 72 3b 0a 20 20 20 20 20 20 69 66 28 20 72  ior;.      if( r
f8a0: 63 20 29 7b 0a 20 20 20 20 20 20 20 20 67 6f 74  c ){.        got
f8b0: 6f 20 6d 75 6c 74 69 5f 73 65 6c 65 63 74 5f 65  o multi_select_e
f8c0: 6e 64 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  nd;.      }.    
f8d0: 20 20 69 66 28 20 61 64 64 72 20 29 7b 0a 20 20    if( addr ){.  
f8e0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
f8f0: 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64  eJumpHere(v, add
f900: 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  r);.      }.    
f910: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
f920: 20 20 20 63 61 73 65 20 54 4b 5f 45 58 43 45 50     case TK_EXCEP
f930: 54 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 55  T:.    case TK_U
f940: 4e 49 4f 4e 3a 20 7b 0a 20 20 20 20 20 20 69 6e  NION: {.      in
f950: 74 20 75 6e 69 6f 6e 54 61 62 3b 20 20 20 20 2f  t unionTab;    /
f960: 2a 20 43 75 72 73 6f 72 20 6e 75 6d 62 65 72 20  * Cursor number 
f970: 6f 66 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79  of the temporary
f980: 20 74 61 62 6c 65 20 68 6f 6c 64 69 6e 67 20 72   table holding r
f990: 65 73 75 6c 74 20 2a 2f 0a 20 20 20 20 20 20 69  esult */.      i
f9a0: 6e 74 20 6f 70 20 3d 20 30 3b 20 20 20 20 20 20  nt op = 0;      
f9b0: 2f 2a 20 4f 6e 65 20 6f 66 20 74 68 65 20 53 52  /* One of the SR
f9c0: 54 5f 20 6f 70 65 72 61 74 69 6f 6e 73 20 74 6f  T_ operations to
f9d0: 20 61 70 70 6c 79 20 74 6f 20 73 65 6c 66 20 2a   apply to self *
f9e0: 2f 0a 20 20 20 20 20 20 69 6e 74 20 70 72 69 6f  /.      int prio
f9f0: 72 4f 70 3b 20 20 20 20 20 2f 2a 20 54 68 65 20  rOp;     /* The 
fa00: 53 52 54 5f 20 6f 70 65 72 61 74 69 6f 6e 20 74  SRT_ operation t
fa10: 6f 20 61 70 70 6c 79 20 74 6f 20 70 72 69 6f 72  o apply to prior
fa20: 20 73 65 6c 65 63 74 73 20 2a 2f 0a 20 20 20 20   selects */.    
fa30: 20 20 45 78 70 72 20 2a 70 4c 69 6d 69 74 2c 20    Expr *pLimit, 
fa40: 2a 70 4f 66 66 73 65 74 3b 20 2f 2a 20 53 61 76  *pOffset; /* Sav
fa50: 65 64 20 76 61 6c 75 65 73 20 6f 66 20 70 2d 3e  ed values of p->
fa60: 6e 4c 69 6d 69 74 20 61 6e 64 20 70 2d 3e 6e 4f  nLimit and p->nO
fa70: 66 66 73 65 74 20 2a 2f 0a 20 20 20 20 20 20 69  ffset */.      i
fa80: 6e 74 20 61 64 64 72 3b 0a 20 20 20 20 20 20 53  nt addr;.      S
fa90: 65 6c 65 63 74 44 65 73 74 20 75 6e 69 6f 6e 64  electDest uniond
faa0: 65 73 74 3b 0a 0a 20 20 20 20 20 20 70 72 69 6f  est;..      prio
fab0: 72 4f 70 20 3d 20 53 52 54 5f 55 6e 69 6f 6e 3b  rOp = SRT_Union;
fac0: 0a 20 20 20 20 20 20 69 66 28 20 64 65 73 74 2e  .      if( dest.
fad0: 65 44 65 73 74 3d 3d 70 72 69 6f 72 4f 70 20 26  eDest==priorOp &
fae0: 26 20 21 70 2d 3e 70 4c 69 6d 69 74 20 26 26 20  & !p->pLimit && 
faf0: 21 70 2d 3e 70 4f 66 66 73 65 74 20 29 7b 0a 20  !p->pOffset ){. 
fb00: 20 20 20 20 20 20 20 2f 2a 20 57 65 20 63 61 6e         /* We can
fb10: 20 72 65 75 73 65 20 61 20 74 65 6d 70 6f 72 61   reuse a tempora
fb20: 72 79 20 74 61 62 6c 65 20 67 65 6e 65 72 61 74  ry table generat
fb30: 65 64 20 62 79 20 61 20 53 45 4c 45 43 54 20 74  ed by a SELECT t
fb40: 6f 20 6f 75 72 0a 20 20 20 20 20 20 20 20 2a 2a  o our.        **
fb50: 20 72 69 67 68 74 2e 0a 20 20 20 20 20 20 20 20   right..        
fb60: 2a 2f 0a 20 20 20 20 20 20 20 20 75 6e 69 6f 6e  */.        union
fb70: 54 61 62 20 3d 20 64 65 73 74 2e 69 50 61 72 6d  Tab = dest.iParm
fb80: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
fb90: 20 20 20 20 20 20 20 2f 2a 20 57 65 20 77 69 6c         /* We wil
fba0: 6c 20 6e 65 65 64 20 74 6f 20 63 72 65 61 74 65  l need to create
fbb0: 20 6f 75 72 20 6f 77 6e 20 74 65 6d 70 6f 72 61   our own tempora
fbc0: 72 79 20 74 61 62 6c 65 20 74 6f 20 68 6f 6c 64  ry table to hold
fbd0: 20 74 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20   the.        ** 
fbe0: 69 6e 74 65 72 6d 65 64 69 61 74 65 20 72 65 73  intermediate res
fbf0: 75 6c 74 73 2e 0a 20 20 20 20 20 20 20 20 2a 2f  ults..        */
fc00: 0a 20 20 20 20 20 20 20 20 75 6e 69 6f 6e 54 61  .        unionTa
fc10: 62 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62  b = pParse->nTab
fc20: 2b 2b 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65  ++;.        asse
fc30: 72 74 28 20 70 2d 3e 70 4f 72 64 65 72 42 79 3d  rt( p->pOrderBy=
fc40: 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 61 64  =0 );.        ad
fc50: 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  dr = sqlite3Vdbe
fc60: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4f 70 65  AddOp2(v, OP_Ope
fc70: 6e 45 70 68 65 6d 65 72 61 6c 2c 20 75 6e 69 6f  nEphemeral, unio
fc80: 6e 54 61 62 2c 20 30 29 3b 0a 20 20 20 20 20 20  nTab, 0);.      
fc90: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 61 64 64    assert( p->add
fca0: 72 4f 70 65 6e 45 70 68 6d 5b 30 5d 20 3d 3d 20  rOpenEphm[0] == 
fcb0: 2d 31 20 29 3b 0a 20 20 20 20 20 20 20 20 70 2d  -1 );.        p-
fcc0: 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b 30 5d  >addrOpenEphm[0]
fcd0: 20 3d 20 61 64 64 72 3b 0a 20 20 20 20 20 20 20   = addr;.       
fce0: 20 70 2d 3e 70 52 69 67 68 74 6d 6f 73 74 2d 3e   p->pRightmost->
fcf0: 75 73 65 73 45 70 68 6d 20 3d 20 31 3b 0a 20 20  usesEphm = 1;.  
fd00: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d        assert( p-
fd10: 3e 70 45 4c 69 73 74 20 29 3b 0a 20 20 20 20 20  >pEList );.     
fd20: 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 43 6f 64   }..      /* Cod
fd30: 65 20 74 68 65 20 53 45 4c 45 43 54 20 73 74 61  e the SELECT sta
fd40: 74 65 6d 65 6e 74 73 20 74 6f 20 6f 75 72 20 6c  tements to our l
fd50: 65 66 74 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  eft.      */.   
fd60: 20 20 20 61 73 73 65 72 74 28 20 21 70 50 72 69     assert( !pPri
fd70: 6f 72 2d 3e 70 4f 72 64 65 72 42 79 20 29 3b 0a  or->pOrderBy );.
fd80: 20 20 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c        sqlite3Sel
fd90: 65 63 74 44 65 73 74 49 6e 69 74 28 26 75 6e 69  ectDestInit(&uni
fda0: 6f 6e 64 65 73 74 2c 20 70 72 69 6f 72 4f 70 2c  ondest, priorOp,
fdb0: 20 75 6e 69 6f 6e 54 61 62 29 3b 0a 20 20 20 20   unionTab);.    
fdc0: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 53 65    rc = sqlite3Se
fdd0: 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70 50 72  lect(pParse, pPr
fde0: 69 6f 72 2c 20 26 75 6e 69 6f 6e 64 65 73 74 2c  ior, &uniondest,
fdf0: 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20   0, 0, 0);.     
fe00: 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20   if( rc ){.     
fe10: 20 20 20 67 6f 74 6f 20 6d 75 6c 74 69 5f 73 65     goto multi_se
fe20: 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 20 20  lect_end;.      
fe30: 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 43 6f 64 65  }..      /* Code
fe40: 20 74 68 65 20 63 75 72 72 65 6e 74 20 53 45 4c   the current SEL
fe50: 45 43 54 20 73 74 61 74 65 6d 65 6e 74 0a 20 20  ECT statement.  
fe60: 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 73 77 69      */.      swi
fe70: 74 63 68 28 20 70 2d 3e 6f 70 20 29 7b 0a 20 20  tch( p->op ){.  
fe80: 20 20 20 20 20 20 20 63 61 73 65 20 54 4b 5f 45         case TK_E
fe90: 58 43 45 50 54 3a 20 20 6f 70 20 3d 20 53 52 54  XCEPT:  op = SRT
fea0: 5f 45 78 63 65 70 74 3b 20 20 20 62 72 65 61 6b  _Except;   break
feb0: 3b 0a 20 20 20 20 20 20 20 20 20 63 61 73 65 20  ;.         case 
fec0: 54 4b 5f 55 4e 49 4f 4e 3a 20 20 20 6f 70 20 3d  TK_UNION:   op =
fed0: 20 53 52 54 5f 55 6e 69 6f 6e 3b 20 20 20 20 62   SRT_Union;    b
fee0: 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 63  reak;.         c
fef0: 61 73 65 20 54 4b 5f 41 4c 4c 3a 20 20 20 20 20  ase TK_ALL:     
ff00: 6f 70 20 3d 20 53 52 54 5f 54 61 62 6c 65 3b 20  op = SRT_Table; 
ff10: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
ff20: 7d 0a 20 20 20 20 20 20 70 2d 3e 70 50 72 69 6f  }.      p->pPrio
ff30: 72 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 2d 3e  r = 0;.      p->
ff40: 64 69 73 61 6c 6c 6f 77 4f 72 64 65 72 42 79 20  disallowOrderBy 
ff50: 3d 20 30 3b 0a 20 20 20 20 20 20 70 4c 69 6d 69  = 0;.      pLimi
ff60: 74 20 3d 20 70 2d 3e 70 4c 69 6d 69 74 3b 0a 20  t = p->pLimit;. 
ff70: 20 20 20 20 20 70 2d 3e 70 4c 69 6d 69 74 20 3d       p->pLimit =
ff80: 20 30 3b 0a 20 20 20 20 20 20 70 4f 66 66 73 65   0;.      pOffse
ff90: 74 20 3d 20 70 2d 3e 70 4f 66 66 73 65 74 3b 0a  t = p->pOffset;.
ffa0: 20 20 20 20 20 20 70 2d 3e 70 4f 66 66 73 65 74        p->pOffset
ffb0: 20 3d 20 30 3b 0a 20 20 20 20 20 20 75 6e 69 6f   = 0;.      unio
ffc0: 6e 64 65 73 74 2e 65 44 65 73 74 20 3d 20 6f 70  ndest.eDest = op
ffd0: 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  ;.      rc = sql
ffe0: 69 74 65 33 53 65 6c 65 63 74 28 70 50 61 72 73  ite3Select(pPars
fff0: 65 2c 20 70 2c 20 26 75 6e 69 6f 6e 64 65 73 74  e, p, &uniondest
10000 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  , 0, 0, 0);.    
10010 20 20 2f 2a 20 51 75 65 72 79 20 66 6c 61 74 74    /* Query flatt
10020 65 6e 69 6e 67 20 69 6e 20 73 71 6c 69 74 65 33  ening in sqlite3
10030 53 65 6c 65 63 74 28 29 20 6d 69 67 68 74 20 72  Select() might r
10040 65 66 69 6c 6c 20 70 2d 3e 70 4f 72 64 65 72 42  efill p->pOrderB
10050 79 2e 0a 20 20 20 20 20 20 2a 2a 20 42 65 20 73  y..      ** Be s
10060 75 72 65 20 74 6f 20 64 65 6c 65 74 65 20 70 2d  ure to delete p-
10070 3e 70 4f 72 64 65 72 42 79 2c 20 74 68 65 72 65  >pOrderBy, there
10080 66 6f 72 65 2c 20 74 6f 20 61 76 6f 69 64 20 61  fore, to avoid a
10090 20 6d 65 6d 6f 72 79 20 6c 65 61 6b 2e 20 2a 2f   memory leak. */
100a0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
100b0 70 72 4c 69 73 74 44 65 6c 65 74 65 28 70 2d 3e  prListDelete(p->
100c0 70 4f 72 64 65 72 42 79 29 3b 0a 20 20 20 20 20  pOrderBy);.     
100d0 20 70 44 65 6c 65 74 65 20 3d 20 70 2d 3e 70 50   pDelete = p->pP
100e0 72 69 6f 72 3b 0a 20 20 20 20 20 20 70 2d 3e 70  rior;.      p->p
100f0 50 72 69 6f 72 20 3d 20 70 50 72 69 6f 72 3b 0a  Prior = pPrior;.
10100 20 20 20 20 20 20 70 2d 3e 70 4f 72 64 65 72 42        p->pOrderB
10110 79 20 3d 20 30 3b 0a 20 20 20 20 20 20 73 71 6c  y = 0;.      sql
10120 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 70  ite3ExprDelete(p
10130 2d 3e 70 4c 69 6d 69 74 29 3b 0a 20 20 20 20 20  ->pLimit);.     
10140 20 70 2d 3e 70 4c 69 6d 69 74 20 3d 20 70 4c 69   p->pLimit = pLi
10150 6d 69 74 3b 0a 20 20 20 20 20 20 70 2d 3e 70 4f  mit;.      p->pO
10160 66 66 73 65 74 20 3d 20 70 4f 66 66 73 65 74 3b  ffset = pOffset;
10170 0a 20 20 20 20 20 20 70 2d 3e 69 4c 69 6d 69 74  .      p->iLimit
10180 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 2d 3e 69   = 0;.      p->i
10190 4f 66 66 73 65 74 20 3d 20 30 3b 0a 20 20 20 20  Offset = 0;.    
101a0 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20    if( rc ){.    
101b0 20 20 20 20 67 6f 74 6f 20 6d 75 6c 74 69 5f 73      goto multi_s
101c0 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 20  elect_end;.     
101d0 20 7d 0a 0a 0a 20 20 20 20 20 20 2f 2a 20 43 6f   }...      /* Co
101e0 6e 76 65 72 74 20 74 68 65 20 64 61 74 61 20 69  nvert the data i
101f0 6e 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79 20  n the temporary 
10200 74 61 62 6c 65 20 69 6e 74 6f 20 77 68 61 74 65  table into whate
10210 76 65 72 20 66 6f 72 6d 0a 20 20 20 20 20 20 2a  ver form.      *
10220 2a 20 69 74 20 69 73 20 74 68 61 74 20 77 65 20  * it is that we 
10230 63 75 72 72 65 6e 74 6c 79 20 6e 65 65 64 2e 0a  currently need..
10240 20 20 20 20 20 20 2a 2f 20 20 20 20 20 20 0a 20        */      . 
10250 20 20 20 20 20 69 66 28 20 64 65 73 74 2e 65 44       if( dest.eD
10260 65 73 74 21 3d 70 72 69 6f 72 4f 70 20 7c 7c 20  est!=priorOp || 
10270 75 6e 69 6f 6e 54 61 62 21 3d 64 65 73 74 2e 69  unionTab!=dest.i
10280 50 61 72 6d 20 29 7b 0a 20 20 20 20 20 20 20 20  Parm ){.        
10290 69 6e 74 20 69 43 6f 6e 74 2c 20 69 42 72 65 61  int iCont, iBrea
102a0 6b 2c 20 69 53 74 61 72 74 3b 0a 20 20 20 20 20  k, iStart;.     
102b0 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 45     assert( p->pE
102c0 4c 69 73 74 20 29 3b 0a 20 20 20 20 20 20 20 20  List );.        
102d0 69 66 28 20 64 65 73 74 2e 65 44 65 73 74 3d 3d  if( dest.eDest==
102e0 53 52 54 5f 43 61 6c 6c 62 61 63 6b 20 29 7b 0a  SRT_Callback ){.
102f0 20 20 20 20 20 20 20 20 20 20 53 65 6c 65 63 74            Select
10300 20 2a 70 46 69 72 73 74 20 3d 20 70 3b 0a 20 20   *pFirst = p;.  
10310 20 20 20 20 20 20 20 20 77 68 69 6c 65 28 20 70          while( p
10320 46 69 72 73 74 2d 3e 70 50 72 69 6f 72 20 29 20  First->pPrior ) 
10330 70 46 69 72 73 74 20 3d 20 70 46 69 72 73 74 2d  pFirst = pFirst-
10340 3e 70 50 72 69 6f 72 3b 0a 20 20 20 20 20 20 20  >pPrior;.       
10350 20 20 20 67 65 6e 65 72 61 74 65 43 6f 6c 75 6d     generateColum
10360 6e 4e 61 6d 65 73 28 70 50 61 72 73 65 2c 20 30  nNames(pParse, 0
10370 2c 20 70 46 69 72 73 74 2d 3e 70 45 4c 69 73 74  , pFirst->pEList
10380 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
10390 20 20 20 20 20 69 42 72 65 61 6b 20 3d 20 73 71       iBreak = sq
103a0 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62  lite3VdbeMakeLab
103b0 65 6c 28 76 29 3b 0a 20 20 20 20 20 20 20 20 69  el(v);.        i
103c0 43 6f 6e 74 20 3d 20 73 71 6c 69 74 65 33 56 64  Cont = sqlite3Vd
103d0 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a  beMakeLabel(v);.
103e0 20 20 20 20 20 20 20 20 63 6f 6d 70 75 74 65 4c          computeL
103f0 69 6d 69 74 52 65 67 69 73 74 65 72 73 28 70 50  imitRegisters(pP
10400 61 72 73 65 2c 20 70 2c 20 69 42 72 65 61 6b 29  arse, p, iBreak)
10410 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
10420 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
10430 50 5f 52 65 77 69 6e 64 2c 20 75 6e 69 6f 6e 54  P_Rewind, unionT
10440 61 62 2c 20 69 42 72 65 61 6b 29 3b 0a 20 20 20  ab, iBreak);.   
10450 20 20 20 20 20 69 53 74 61 72 74 20 3d 20 73 71       iStart = sq
10460 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74  lite3VdbeCurrent
10470 41 64 64 72 28 76 29 3b 0a 20 20 20 20 20 20 20  Addr(v);.       
10480 20 73 65 6c 65 63 74 49 6e 6e 65 72 4c 6f 6f 70   selectInnerLoop
10490 28 70 50 61 72 73 65 2c 20 70 2c 20 70 2d 3e 70  (pParse, p, p->p
104a0 45 4c 69 73 74 2c 20 75 6e 69 6f 6e 54 61 62 2c  EList, unionTab,
104b0 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70   p->pEList->nExp
104c0 72 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  r,.             
104d0 20 20 20 20 20 20 20 20 20 20 20 30 2c 20 2d 31             0, -1
104e0 2c 20 26 64 65 73 74 2c 20 69 43 6f 6e 74 2c 20  , &dest, iCont, 
104f0 69 42 72 65 61 6b 29 3b 0a 20 20 20 20 20 20 20  iBreak);.       
10500 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f   sqlite3VdbeReso
10510 6c 76 65 4c 61 62 65 6c 28 76 2c 20 69 43 6f 6e  lveLabel(v, iCon
10520 74 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  t);.        sqli
10530 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
10540 20 4f 50 5f 4e 65 78 74 2c 20 75 6e 69 6f 6e 54   OP_Next, unionT
10550 61 62 2c 20 69 53 74 61 72 74 29 3b 0a 20 20 20  ab, iStart);.   
10560 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
10570 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20  ResolveLabel(v, 
10580 69 42 72 65 61 6b 29 3b 0a 20 20 20 20 20 20 20  iBreak);.       
10590 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
105a0 70 32 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20  p2(v, OP_Close, 
105b0 75 6e 69 6f 6e 54 61 62 2c 20 30 29 3b 0a 20 20  unionTab, 0);.  
105c0 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61      }.      brea
105d0 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  k;.    }.    cas
105e0 65 20 54 4b 5f 49 4e 54 45 52 53 45 43 54 3a 20  e TK_INTERSECT: 
105f0 7b 0a 20 20 20 20 20 20 69 6e 74 20 74 61 62 31  {.      int tab1
10600 2c 20 74 61 62 32 3b 0a 20 20 20 20 20 20 69 6e  , tab2;.      in
10610 74 20 69 43 6f 6e 74 2c 20 69 42 72 65 61 6b 2c  t iCont, iBreak,
10620 20 69 53 74 61 72 74 3b 0a 20 20 20 20 20 20 45   iStart;.      E
10630 78 70 72 20 2a 70 4c 69 6d 69 74 2c 20 2a 70 4f  xpr *pLimit, *pO
10640 66 66 73 65 74 3b 0a 20 20 20 20 20 20 69 6e 74  ffset;.      int
10650 20 61 64 64 72 3b 0a 20 20 20 20 20 20 53 65 6c   addr;.      Sel
10660 65 63 74 44 65 73 74 20 69 6e 74 65 72 73 65 63  ectDest intersec
10670 74 64 65 73 74 3b 0a 20 20 20 20 20 20 69 6e 74  tdest;.      int
10680 20 72 31 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 49   r1;..      /* I
10690 4e 54 45 52 53 45 43 54 20 69 73 20 64 69 66 66  NTERSECT is diff
106a0 65 72 65 6e 74 20 66 72 6f 6d 20 74 68 65 20 6f  erent from the o
106b0 74 68 65 72 73 20 73 69 6e 63 65 20 69 74 20 72  thers since it r
106c0 65 71 75 69 72 65 73 0a 20 20 20 20 20 20 2a 2a  equires.      **
106d0 20 74 77 6f 20 74 65 6d 70 6f 72 61 72 79 20 74   two temporary t
106e0 61 62 6c 65 73 2e 20 20 48 65 6e 63 65 20 69 74  ables.  Hence it
106f0 20 68 61 73 20 69 74 73 20 6f 77 6e 20 63 61 73   has its own cas
10700 65 2e 20 20 42 65 67 69 6e 0a 20 20 20 20 20 20  e.  Begin.      
10710 2a 2a 20 62 79 20 61 6c 6c 6f 63 61 74 69 6e 67  ** by allocating
10720 20 74 68 65 20 74 61 62 6c 65 73 20 77 65 20 77   the tables we w
10730 69 6c 6c 20 6e 65 65 64 2e 0a 20 20 20 20 20 20  ill need..      
10740 2a 2f 0a 20 20 20 20 20 20 74 61 62 31 20 3d 20  */.      tab1 = 
10750 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a  pParse->nTab++;.
10760 20 20 20 20 20 20 74 61 62 32 20 3d 20 70 50 61        tab2 = pPa
10770 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20  rse->nTab++;.   
10780 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 4f     assert( p->pO
10790 72 64 65 72 42 79 3d 3d 30 20 29 3b 0a 0a 20 20  rderBy==0 );..  
107a0 20 20 20 20 61 64 64 72 20 3d 20 73 71 6c 69 74      addr = sqlit
107b0 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
107c0 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c  OP_OpenEphemeral
107d0 2c 20 74 61 62 31 2c 20 30 29 3b 0a 20 20 20 20  , tab1, 0);.    
107e0 20 20 61 73 73 65 72 74 28 20 70 2d 3e 61 64 64    assert( p->add
107f0 72 4f 70 65 6e 45 70 68 6d 5b 30 5d 20 3d 3d 20  rOpenEphm[0] == 
10800 2d 31 20 29 3b 0a 20 20 20 20 20 20 70 2d 3e 61  -1 );.      p->a
10810 64 64 72 4f 70 65 6e 45 70 68 6d 5b 30 5d 20 3d  ddrOpenEphm[0] =
10820 20 61 64 64 72 3b 0a 20 20 20 20 20 20 70 2d 3e   addr;.      p->
10830 70 52 69 67 68 74 6d 6f 73 74 2d 3e 75 73 65 73  pRightmost->uses
10840 45 70 68 6d 20 3d 20 31 3b 0a 20 20 20 20 20 20  Ephm = 1;.      
10850 61 73 73 65 72 74 28 20 70 2d 3e 70 45 4c 69 73  assert( p->pELis
10860 74 20 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 43  t );..      /* C
10870 6f 64 65 20 74 68 65 20 53 45 4c 45 43 54 73 20  ode the SELECTs 
10880 74 6f 20 6f 75 72 20 6c 65 66 74 20 69 6e 74 6f  to our left into
10890 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65   temporary table
108a0 20 22 74 61 62 31 22 2e 0a 20 20 20 20 20 20 2a   "tab1"..      *
108b0 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 53  /.      sqlite3S
108c0 65 6c 65 63 74 44 65 73 74 49 6e 69 74 28 26 69  electDestInit(&i
108d0 6e 74 65 72 73 65 63 74 64 65 73 74 2c 20 53 52  ntersectdest, SR
108e0 54 5f 55 6e 69 6f 6e 2c 20 74 61 62 31 29 3b 0a  T_Union, tab1);.
108f0 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
10900 65 33 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c  e3Select(pParse,
10910 20 70 50 72 69 6f 72 2c 20 26 69 6e 74 65 72 73   pPrior, &inters
10920 65 63 74 64 65 73 74 2c 20 30 2c 20 30 2c 20 30  ectdest, 0, 0, 0
10930 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 20  );.      if( rc 
10940 29 7b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20  ){.        goto 
10950 6d 75 6c 74 69 5f 73 65 6c 65 63 74 5f 65 6e 64  multi_select_end
10960 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20  ;.      }..     
10970 20 2f 2a 20 43 6f 64 65 20 74 68 65 20 63 75 72   /* Code the cur
10980 72 65 6e 74 20 53 45 4c 45 43 54 20 69 6e 74 6f  rent SELECT into
10990 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65   temporary table
109a0 20 22 74 61 62 32 22 0a 20 20 20 20 20 20 2a 2f   "tab2".      */
109b0 0a 20 20 20 20 20 20 61 64 64 72 20 3d 20 73 71  .      addr = sq
109c0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
109d0 76 2c 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65  v, OP_OpenEpheme
109e0 72 61 6c 2c 20 74 61 62 32 2c 20 30 29 3b 0a 20  ral, tab2, 0);. 
109f0 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e       assert( p->
10a00 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b 31 5d 20  addrOpenEphm[1] 
10a10 3d 3d 20 2d 31 20 29 3b 0a 20 20 20 20 20 20 70  == -1 );.      p
10a20 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b 31  ->addrOpenEphm[1
10a30 5d 20 3d 20 61 64 64 72 3b 0a 20 20 20 20 20 20  ] = addr;.      
10a40 70 2d 3e 70 50 72 69 6f 72 20 3d 20 30 3b 0a 20  p->pPrior = 0;. 
10a50 20 20 20 20 20 70 4c 69 6d 69 74 20 3d 20 70 2d       pLimit = p-
10a60 3e 70 4c 69 6d 69 74 3b 0a 20 20 20 20 20 20 70  >pLimit;.      p
10a70 2d 3e 70 4c 69 6d 69 74 20 3d 20 30 3b 0a 20 20  ->pLimit = 0;.  
10a80 20 20 20 20 70 4f 66 66 73 65 74 20 3d 20 70 2d      pOffset = p-
10a90 3e 70 4f 66 66 73 65 74 3b 0a 20 20 20 20 20 20  >pOffset;.      
10aa0 70 2d 3e 70 4f 66 66 73 65 74 20 3d 20 30 3b 0a  p->pOffset = 0;.
10ab0 20 20 20 20 20 20 69 6e 74 65 72 73 65 63 74 64        intersectd
10ac0 65 73 74 2e 69 50 61 72 6d 20 3d 20 74 61 62 32  est.iParm = tab2
10ad0 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  ;.      rc = sql
10ae0 69 74 65 33 53 65 6c 65 63 74 28 70 50 61 72 73  ite3Select(pPars
10af0 65 2c 20 70 2c 20 26 69 6e 74 65 72 73 65 63 74  e, p, &intersect
10b00 64 65 73 74 2c 20 30 2c 20 30 2c 20 30 29 3b 0a  dest, 0, 0, 0);.
10b10 20 20 20 20 20 20 70 44 65 6c 65 74 65 20 3d 20        pDelete = 
10b20 70 2d 3e 70 50 72 69 6f 72 3b 0a 20 20 20 20 20  p->pPrior;.     
10b30 20 70 2d 3e 70 50 72 69 6f 72 20 3d 20 70 50 72   p->pPrior = pPr
10b40 69 6f 72 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  ior;.      sqlit
10b50 65 33 45 78 70 72 44 65 6c 65 74 65 28 70 2d 3e  e3ExprDelete(p->
10b60 70 4c 69 6d 69 74 29 3b 0a 20 20 20 20 20 20 70  pLimit);.      p
10b70 2d 3e 70 4c 69 6d 69 74 20 3d 20 70 4c 69 6d 69  ->pLimit = pLimi
10b80 74 3b 0a 20 20 20 20 20 20 70 2d 3e 70 4f 66 66  t;.      p->pOff
10b90 73 65 74 20 3d 20 70 4f 66 66 73 65 74 3b 0a 20  set = pOffset;. 
10ba0 20 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20       if( rc ){. 
10bb0 20 20 20 20 20 20 20 67 6f 74 6f 20 6d 75 6c 74         goto mult
10bc0 69 5f 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20  i_select_end;.  
10bd0 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20      }..      /* 
10be0 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f  Generate code to
10bf0 20 74 61 6b 65 20 74 68 65 20 69 6e 74 65 72 73   take the inters
10c00 65 63 74 69 6f 6e 20 6f 66 20 74 68 65 20 74 77  ection of the tw
10c10 6f 20 74 65 6d 70 6f 72 61 72 79 0a 20 20 20 20  o temporary.    
10c20 20 20 2a 2a 20 74 61 62 6c 65 73 2e 0a 20 20 20    ** tables..   
10c30 20 20 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65     */.      asse
10c40 72 74 28 20 70 2d 3e 70 45 4c 69 73 74 20 29 3b  rt( p->pEList );
10c50 0a 20 20 20 20 20 20 69 66 28 20 64 65 73 74 2e  .      if( dest.
10c60 65 44 65 73 74 3d 3d 53 52 54 5f 43 61 6c 6c 62  eDest==SRT_Callb
10c70 61 63 6b 20 29 7b 0a 20 20 20 20 20 20 20 20 53  ack ){.        S
10c80 65 6c 65 63 74 20 2a 70 46 69 72 73 74 20 3d 20  elect *pFirst = 
10c90 70 3b 0a 20 20 20 20 20 20 20 20 77 68 69 6c 65  p;.        while
10ca0 28 20 70 46 69 72 73 74 2d 3e 70 50 72 69 6f 72  ( pFirst->pPrior
10cb0 20 29 20 70 46 69 72 73 74 20 3d 20 70 46 69 72   ) pFirst = pFir
10cc0 73 74 2d 3e 70 50 72 69 6f 72 3b 0a 20 20 20 20  st->pPrior;.    
10cd0 20 20 20 20 67 65 6e 65 72 61 74 65 43 6f 6c 75      generateColu
10ce0 6d 6e 4e 61 6d 65 73 28 70 50 61 72 73 65 2c 20  mnNames(pParse, 
10cf0 30 2c 20 70 46 69 72 73 74 2d 3e 70 45 4c 69 73  0, pFirst->pELis
10d00 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  t);.      }.    
10d10 20 20 69 42 72 65 61 6b 20 3d 20 73 71 6c 69 74    iBreak = sqlit
10d20 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28  e3VdbeMakeLabel(
10d30 76 29 3b 0a 20 20 20 20 20 20 69 43 6f 6e 74 20  v);.      iCont 
10d40 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b  = sqlite3VdbeMak
10d50 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 20  eLabel(v);.     
10d60 20 63 6f 6d 70 75 74 65 4c 69 6d 69 74 52 65 67   computeLimitReg
10d70 69 73 74 65 72 73 28 70 50 61 72 73 65 2c 20 70  isters(pParse, p
10d80 2c 20 69 42 72 65 61 6b 29 3b 0a 20 20 20 20 20  , iBreak);.     
10d90 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
10da0 70 32 28 76 2c 20 4f 50 5f 52 65 77 69 6e 64 2c  p2(v, OP_Rewind,
10db0 20 74 61 62 31 2c 20 69 42 72 65 61 6b 29 3b 0a   tab1, iBreak);.
10dc0 20 20 20 20 20 20 72 31 20 3d 20 73 71 6c 69 74        r1 = sqlit
10dd0 65 33 47 65 74 54 65 6d 70 52 65 67 28 70 50 61  e3GetTempReg(pPa
10de0 72 73 65 29 3b 0a 20 20 20 20 20 20 69 53 74 61  rse);.      iSta
10df0 72 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  rt = sqlite3Vdbe
10e00 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52 6f 77  AddOp2(v, OP_Row
10e10 4b 65 79 2c 20 74 61 62 31 2c 20 72 31 29 3b 0a  Key, tab1, r1);.
10e20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
10e30 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4e 6f  eAddOp3(v, OP_No
10e40 74 46 6f 75 6e 64 2c 20 74 61 62 32 2c 20 69 43  tFound, tab2, iC
10e50 6f 6e 74 2c 20 72 31 29 3b 0a 20 20 20 20 20 20  ont, r1);.      
10e60 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65  sqlite3ReleaseTe
10e70 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 31  mpReg(pParse, r1
10e80 29 3b 0a 20 20 20 20 20 20 73 65 6c 65 63 74 49  );.      selectI
10e90 6e 6e 65 72 4c 6f 6f 70 28 70 50 61 72 73 65 2c  nnerLoop(pParse,
10ea0 20 70 2c 20 70 2d 3e 70 45 4c 69 73 74 2c 20 74   p, p->pEList, t
10eb0 61 62 31 2c 20 70 2d 3e 70 45 4c 69 73 74 2d 3e  ab1, p->pEList->
10ec0 6e 45 78 70 72 2c 0a 20 20 20 20 20 20 20 20 20  nExpr,.         
10ed0 20 20 20 20 20 20 20 20 20 20 20 20 20 30 2c 20               0, 
10ee0 2d 31 2c 20 26 64 65 73 74 2c 20 69 43 6f 6e 74  -1, &dest, iCont
10ef0 2c 20 69 42 72 65 61 6b 29 3b 0a 20 20 20 20 20  , iBreak);.     
10f00 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f   sqlite3VdbeReso
10f10 6c 76 65 4c 61 62 65 6c 28 76 2c 20 69 43 6f 6e  lveLabel(v, iCon
10f20 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  t);.      sqlite
10f30 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
10f40 50 5f 4e 65 78 74 2c 20 74 61 62 31 2c 20 69 53  P_Next, tab1, iS
10f50 74 61 72 74 29 3b 0a 20 20 20 20 20 20 73 71 6c  tart);.      sql
10f60 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c  ite3VdbeResolveL
10f70 61 62 65 6c 28 76 2c 20 69 42 72 65 61 6b 29 3b  abel(v, iBreak);
10f80 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
10f90 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 43  beAddOp2(v, OP_C
10fa0 6c 6f 73 65 2c 20 74 61 62 32 2c 20 30 29 3b 0a  lose, tab2, 0);.
10fb0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
10fc0 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 43 6c  eAddOp2(v, OP_Cl
10fd0 6f 73 65 2c 20 74 61 62 31 2c 20 30 29 3b 0a 20  ose, tab1, 0);. 
10fe0 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
10ff0 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 6f 6d 70  }.  }..  /* Comp
11000 75 74 65 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65  ute collating se
11010 71 75 65 6e 63 65 73 20 75 73 65 64 20 62 79 20  quences used by 
11020 0a 20 20 2a 2a 20 74 65 6d 70 6f 72 61 72 79 20  .  ** temporary 
11030 74 61 62 6c 65 73 20 6e 65 65 64 65 64 20 74 6f  tables needed to
11040 20 69 6d 70 6c 65 6d 65 6e 74 20 74 68 65 20 63   implement the c
11050 6f 6d 70 6f 75 6e 64 20 73 65 6c 65 63 74 2e 0a  ompound select..
11060 20 20 2a 2a 20 41 74 74 61 63 68 20 74 68 65 20    ** Attach the 
11070 4b 65 79 49 6e 66 6f 20 73 74 72 75 63 74 75 72  KeyInfo structur
11080 65 20 74 6f 20 61 6c 6c 20 74 65 6d 70 6f 72 61  e to all tempora
11090 72 79 20 74 61 62 6c 65 73 2e 0a 20 20 2a 2a 0a  ry tables..  **.
110a0 20 20 2a 2a 20 54 68 69 73 20 73 65 63 74 69 6f    ** This sectio
110b0 6e 20 69 73 20 72 75 6e 20 62 79 20 74 68 65 20  n is run by the 
110c0 72 69 67 68 74 2d 6d 6f 73 74 20 53 45 4c 45 43  right-most SELEC
110d0 54 20 73 74 61 74 65 6d 65 6e 74 20 6f 6e 6c 79  T statement only
110e0 2e 0a 20 20 2a 2a 20 53 45 4c 45 43 54 20 73 74  ..  ** SELECT st
110f0 61 74 65 6d 65 6e 74 73 20 74 6f 20 74 68 65 20  atements to the 
11100 6c 65 66 74 20 61 6c 77 61 79 73 20 73 6b 69 70  left always skip
11110 20 74 68 69 73 20 70 61 72 74 2e 20 20 54 68 65   this part.  The
11120 20 72 69 67 68 74 2d 6d 6f 73 74 0a 20 20 2a 2a   right-most.  **
11130 20 53 45 4c 45 43 54 20 6d 69 67 68 74 20 61 6c   SELECT might al
11140 73 6f 20 73 6b 69 70 20 74 68 69 73 20 70 61 72  so skip this par
11150 74 20 69 66 20 69 74 20 68 61 73 20 6e 6f 20 4f  t if it has no O
11160 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 61  RDER BY clause a
11170 6e 64 0a 20 20 2a 2a 20 6e 6f 20 74 65 6d 70 20  nd.  ** no temp 
11180 74 61 62 6c 65 73 20 61 72 65 20 72 65 71 75 69  tables are requi
11190 72 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  red..  */.  if( 
111a0 70 2d 3e 75 73 65 73 45 70 68 6d 20 29 7b 0a 20  p->usesEphm ){. 
111b0 20 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20     int i;       
111c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
111d0 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72   /* Loop counter
111e0 20 2a 2f 0a 20 20 20 20 4b 65 79 49 6e 66 6f 20   */.    KeyInfo 
111f0 2a 70 4b 65 79 49 6e 66 6f 3b 20 20 20 20 20 20  *pKeyInfo;      
11200 20 20 20 20 20 20 2f 2a 20 43 6f 6c 6c 61 74 69        /* Collati
11210 6e 67 20 73 65 71 75 65 6e 63 65 20 66 6f 72 20  ng sequence for 
11220 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 20 2a  the result set *
11230 2f 0a 20 20 20 20 53 65 6c 65 63 74 20 2a 70 4c  /.    Select *pL
11240 6f 6f 70 3b 20 20 20 20 20 20 20 20 20 20 20 20  oop;            
11250 20 20 20 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69      /* For loopi
11260 6e 67 20 74 68 72 6f 75 67 68 20 53 45 4c 45 43  ng through SELEC
11270 54 20 73 74 61 74 65 6d 65 6e 74 73 20 2a 2f 0a  T statements */.
11280 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a 2a 61 70      CollSeq **ap
11290 43 6f 6c 6c 3b 20 20 20 20 20 20 20 20 20 20 20  Coll;           
112a0 20 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e 67    /* For looping
112b0 20 74 68 72 6f 75 67 68 20 70 4b 65 79 49 6e 66   through pKeyInf
112c0 6f 2d 3e 61 43 6f 6c 6c 5b 5d 20 2a 2f 0a 20 20  o->aColl[] */.  
112d0 20 20 69 6e 74 20 6e 43 6f 6c 3b 20 20 20 20 20    int nCol;     
112e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
112f0 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 6f 6c  /* Number of col
11300 75 6d 6e 73 20 69 6e 20 72 65 73 75 6c 74 20 73  umns in result s
11310 65 74 20 2a 2f 0a 0a 20 20 20 20 61 73 73 65 72  et */..    asser
11320 74 28 20 70 2d 3e 70 52 69 67 68 74 6d 6f 73 74  t( p->pRightmost
11330 3d 3d 70 20 29 3b 0a 20 20 20 20 6e 43 6f 6c 20  ==p );.    nCol 
11340 3d 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78  = p->pEList->nEx
11350 70 72 3b 0a 20 20 20 20 70 4b 65 79 49 6e 66 6f  pr;.    pKeyInfo
11360 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c   = sqlite3DbMall
11370 6f 63 5a 65 72 6f 28 70 50 61 72 73 65 2d 3e 64  ocZero(pParse->d
11380 62 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  b,.             
11390 20 20 20 20 20 20 20 20 20 20 73 69 7a 65 6f 66            sizeof
113a0 28 2a 70 4b 65 79 49 6e 66 6f 29 2b 6e 43 6f 6c  (*pKeyInfo)+nCol
113b0 2a 28 73 69 7a 65 6f 66 28 43 6f 6c 6c 53 65 71  *(sizeof(CollSeq
113c0 2a 29 20 2b 20 31 29 29 3b 0a 20 20 20 20 69 66  *) + 1));.    if
113d0 28 20 21 70 4b 65 79 49 6e 66 6f 20 29 7b 0a 20  ( !pKeyInfo ){. 
113e0 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
113f0 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 67 6f  _NOMEM;.      go
11400 74 6f 20 6d 75 6c 74 69 5f 73 65 6c 65 63 74 5f  to multi_select_
11410 65 6e 64 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  end;.    }..    
11420 70 4b 65 79 49 6e 66 6f 2d 3e 65 6e 63 20 3d 20  pKeyInfo->enc = 
11430 45 4e 43 28 70 50 61 72 73 65 2d 3e 64 62 29 3b  ENC(pParse->db);
11440 0a 20 20 20 20 70 4b 65 79 49 6e 66 6f 2d 3e 6e  .    pKeyInfo->n
11450 46 69 65 6c 64 20 3d 20 6e 43 6f 6c 3b 0a 0a 20  Field = nCol;.. 
11460 20 20 20 66 6f 72 28 69 3d 30 2c 20 61 70 43 6f     for(i=0, apCo
11470 6c 6c 3d 70 4b 65 79 49 6e 66 6f 2d 3e 61 43 6f  ll=pKeyInfo->aCo
11480 6c 6c 3b 20 69 3c 6e 43 6f 6c 3b 20 69 2b 2b 2c  ll; i<nCol; i++,
11490 20 61 70 43 6f 6c 6c 2b 2b 29 7b 0a 20 20 20 20   apColl++){.    
114a0 20 20 2a 61 70 43 6f 6c 6c 20 3d 20 6d 75 6c 74    *apColl = mult
114b0 69 53 65 6c 65 63 74 43 6f 6c 6c 53 65 71 28 70  iSelectCollSeq(p
114c0 50 61 72 73 65 2c 20 70 2c 20 69 29 3b 0a 20 20  Parse, p, i);.  
114d0 20 20 20 20 69 66 28 20 30 3d 3d 2a 61 70 43 6f      if( 0==*apCo
114e0 6c 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 2a 61  ll ){.        *a
114f0 70 43 6f 6c 6c 20 3d 20 70 50 61 72 73 65 2d 3e  pColl = pParse->
11500 64 62 2d 3e 70 44 66 6c 74 43 6f 6c 6c 3b 0a 20  db->pDfltColl;. 
11510 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20       }.    }..  
11520 20 20 66 6f 72 28 70 4c 6f 6f 70 3d 70 3b 20 70    for(pLoop=p; p
11530 4c 6f 6f 70 3b 20 70 4c 6f 6f 70 3d 70 4c 6f 6f  Loop; pLoop=pLoo
11540 70 2d 3e 70 50 72 69 6f 72 29 7b 0a 20 20 20 20  p->pPrior){.    
11550 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 32 3b 20    for(i=0; i<2; 
11560 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 6e  i++){.        in
11570 74 20 61 64 64 72 20 3d 20 70 4c 6f 6f 70 2d 3e  t addr = pLoop->
11580 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b 69 5d 3b  addrOpenEphm[i];
11590 0a 20 20 20 20 20 20 20 20 69 66 28 20 61 64 64  .        if( add
115a0 72 3c 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  r<0 ){.         
115b0 20 2f 2a 20 49 66 20 5b 30 5d 20 69 73 20 75 6e   /* If [0] is un
115c0 75 73 65 64 20 74 68 65 6e 20 5b 31 5d 20 69 73  used then [1] is
115d0 20 61 6c 73 6f 20 75 6e 75 73 65 64 2e 20 20 53   also unused.  S
115e0 6f 20 77 65 20 63 61 6e 0a 20 20 20 20 20 20 20  o we can.       
115f0 20 20 20 2a 2a 20 61 6c 77 61 79 73 20 73 61 66     ** always saf
11600 65 6c 79 20 61 62 6f 72 74 20 61 73 20 73 6f 6f  ely abort as soo
11610 6e 20 61 73 20 74 68 65 20 66 69 72 73 74 20 75  n as the first u
11620 6e 75 73 65 64 20 73 6c 6f 74 20 69 73 20 66 6f  nused slot is fo
11630 75 6e 64 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  und */.         
11640 20 61 73 73 65 72 74 28 20 70 4c 6f 6f 70 2d 3e   assert( pLoop->
11650 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b 31 5d 3c  addrOpenEphm[1]<
11660 30 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 62  0 );.          b
11670 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a  reak;.        }.
11680 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
11690 64 62 65 43 68 61 6e 67 65 50 32 28 76 2c 20 61  dbeChangeP2(v, a
116a0 64 64 72 2c 20 6e 43 6f 6c 29 3b 0a 20 20 20 20  ddr, nCol);.    
116b0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43      sqlite3VdbeC
116c0 68 61 6e 67 65 50 34 28 76 2c 20 61 64 64 72 2c  hangeP4(v, addr,
116d0 20 28 63 68 61 72 2a 29 70 4b 65 79 49 6e 66 6f   (char*)pKeyInfo
116e0 2c 20 50 34 5f 4b 45 59 49 4e 46 4f 29 3b 0a 20  , P4_KEYINFO);. 
116f0 20 20 20 20 20 20 20 70 4c 6f 6f 70 2d 3e 61 64         pLoop->ad
11700 64 72 4f 70 65 6e 45 70 68 6d 5b 69 5d 20 3d 20  drOpenEphm[i] = 
11710 2d 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  -1;.      }.    
11720 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72  }.    sqlite3_fr
11730 65 65 28 70 4b 65 79 49 6e 66 6f 29 3b 0a 20 20  ee(pKeyInfo);.  
11740 7d 0a 0a 6d 75 6c 74 69 5f 73 65 6c 65 63 74 5f  }..multi_select_
11750 65 6e 64 3a 0a 20 20 70 44 65 73 74 2d 3e 69 4d  end:.  pDest->iM
11760 65 6d 20 3d 20 64 65 73 74 2e 69 4d 65 6d 3b 0a  em = dest.iMem;.
11770 20 20 70 44 65 73 74 2d 3e 6e 4d 65 6d 20 3d 20    pDest->nMem = 
11780 64 65 73 74 2e 6e 4d 65 6d 3b 0a 20 20 73 71 6c  dest.nMem;.  sql
11790 69 74 65 33 53 65 6c 65 63 74 44 65 6c 65 74 65  ite3SelectDelete
117a0 28 70 44 65 6c 65 74 65 29 3b 0a 20 20 72 65 74  (pDelete);.  ret
117b0 75 72 6e 20 72 63 3b 0a 7d 0a 23 65 6e 64 69 66  urn rc;.}.#endif
117c0 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f   /* SQLITE_OMIT_
117d0 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45 43 54 20  COMPOUND_SELECT 
117e0 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 43 6f 64 65 20 61  */../*.** Code a
117f0 6e 20 6f 75 74 70 75 74 20 73 75 62 72 6f 75 74  n output subrout
11800 69 6e 65 20 66 6f 72 20 61 20 63 6f 72 6f 75 74  ine for a corout
11810 69 6e 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69  ine implementati
11820 6f 6e 20 6f 66 20 61 0a 2a 2a 20 53 45 4c 45 43  on of a.** SELEC
11830 54 20 73 74 61 74 6d 65 6e 74 2e 0a 2a 2a 0a 2a  T statment..**.*
11840 2a 20 54 68 65 20 64 61 74 61 20 74 6f 20 62 65  * The data to be
11850 20 6f 75 74 70 75 74 20 69 73 20 63 6f 6e 74 61   output is conta
11860 69 6e 65 64 20 69 6e 20 70 49 6e 2d 3e 69 4d 65  ined in pIn->iMe
11870 6d 2e 20 20 54 68 65 72 65 20 61 72 65 0a 2a 2a  m.  There are.**
11880 20 70 49 6e 2d 3e 6e 4d 65 6d 20 63 6f 6c 75 6d   pIn->nMem colum
11890 6e 73 20 74 6f 20 62 65 20 6f 75 74 70 75 74 2e  ns to be output.
118a0 20 20 70 44 65 73 74 20 69 73 20 77 68 65 72 65    pDest is where
118b0 20 74 68 65 20 6f 75 74 70 75 74 20 73 68 6f 75   the output shou
118c0 6c 64 0a 2a 2a 20 62 65 20 73 65 6e 74 2e 0a 2a  ld.** be sent..*
118d0 2a 0a 2a 2a 20 72 65 67 52 65 74 75 72 6e 20 69  *.** regReturn i
118e0 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  s the number of 
118f0 74 68 65 20 72 65 67 69 73 74 65 72 20 68 6f 6c  the register hol
11900 64 69 6e 67 20 74 68 65 20 73 75 62 72 6f 75 74  ding the subrout
11910 69 6e 65 0a 2a 2a 20 72 65 74 75 72 6e 20 61 64  ine.** return ad
11920 64 72 65 73 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  dress..**.** If 
11930 72 65 67 50 72 65 76 3e 30 20 74 68 65 6e 20 69  regPrev>0 then i
11940 74 20 69 73 20 61 20 74 68 65 20 66 69 72 73 74  t is a the first
11950 20 72 65 67 69 73 74 65 72 20 69 6e 20 61 20 76   register in a v
11960 65 63 74 6f 72 20 74 68 61 74 0a 2a 2a 20 72 65  ector that.** re
11970 63 6f 72 64 73 20 74 68 65 20 70 72 65 76 69 6f  cords the previo
11980 75 73 20 6f 75 74 70 75 74 2e 20 20 6d 65 6d 5b  us output.  mem[
11990 72 65 67 50 72 65 76 5d 20 69 73 20 61 20 66 6c  regPrev] is a fl
119a0 61 67 20 74 68 61 74 20 69 73 20 66 61 6c 73 65  ag that is false
119b0 0a 2a 2a 20 69 66 20 74 68 65 72 65 20 68 61 73  .** if there has
119c0 20 62 65 65 6e 20 6e 6f 20 70 72 65 76 69 6f 75   been no previou
119d0 73 20 6f 75 74 70 75 74 2e 20 20 49 66 20 72 65  s output.  If re
119e0 67 50 72 65 76 3e 30 20 74 68 65 6e 20 63 6f 64  gPrev>0 then cod
119f0 65 20 69 73 0a 2a 2a 20 67 65 6e 65 72 61 74 65  e is.** generate
11a00 64 20 74 6f 20 73 75 70 70 72 65 73 73 20 64 75  d to suppress du
11a10 70 6c 69 63 61 74 65 73 2e 20 20 70 4b 65 79 49  plicates.  pKeyI
11a20 6e 66 6f 20 69 73 20 75 73 65 64 20 66 6f 72 20  nfo is used for 
11a30 63 6f 6d 70 61 72 69 6e 67 0a 2a 2a 20 6b 65 79  comparing.** key
11a40 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  s..**.** If the 
11a50 4c 49 4d 49 54 20 66 6f 75 6e 64 20 69 6e 20 70  LIMIT found in p
11a60 2d 3e 69 4c 69 6d 69 74 20 69 73 20 72 65 61 63  ->iLimit is reac
11a70 68 65 64 2c 20 6a 75 6d 70 20 69 6d 6d 65 64 69  hed, jump immedi
11a80 61 74 65 6c 79 20 74 6f 0a 2a 2a 20 69 42 72 65  ately to.** iBre
11a90 61 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ak..*/.static in
11aa0 74 20 67 65 6e 65 72 61 74 65 4f 75 74 70 75 74  t generateOutput
11ab0 53 75 62 72 6f 75 74 69 6e 65 28 0a 20 20 50 61  Subroutine(.  Pa
11ac0 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20  rse *pParse,    
11ad0 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67        /* Parsing
11ae0 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53 65   context */.  Se
11af0 6c 65 63 74 20 2a 70 2c 20 20 20 20 20 20 20 20  lect *p,        
11b00 20 20 20 20 20 20 2f 2a 20 54 68 65 20 53 45 4c        /* The SEL
11b10 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f  ECT statement */
11b20 0a 20 20 53 65 6c 65 63 74 44 65 73 74 20 2a 70  .  SelectDest *p
11b30 49 6e 2c 20 20 20 20 20 20 20 20 2f 2a 20 43 6f  In,        /* Co
11b40 72 6f 75 74 69 6e 65 20 73 75 70 70 6c 79 69 6e  routine supplyin
11b50 67 20 64 61 74 61 20 2a 2f 0a 20 20 53 65 6c 65  g data */.  Sele
11b60 63 74 44 65 73 74 20 2a 70 44 65 73 74 2c 20 20  ctDest *pDest,  
11b70 20 20 20 20 2f 2a 20 57 68 65 72 65 20 74 6f 20      /* Where to 
11b80 73 65 6e 64 20 74 68 65 20 64 61 74 61 20 2a 2f  send the data */
11b90 0a 20 20 69 6e 74 20 72 65 67 52 65 74 75 72 6e  .  int regReturn
11ba0 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68  ,          /* Th
11bb0 65 20 72 65 74 75 72 6e 20 61 64 64 72 65 73 73  e return address
11bc0 20 72 65 67 69 73 74 65 72 20 2a 2f 0a 20 20 69   register */.  i
11bd0 6e 74 20 72 65 67 50 72 65 76 2c 20 20 20 20 20  nt regPrev,     
11be0 20 20 20 20 20 20 20 2f 2a 20 50 72 65 76 69 6f         /* Previo
11bf0 75 73 20 72 65 73 75 6c 74 20 72 65 67 69 73 74  us result regist
11c00 65 72 2e 20 20 4e 6f 20 75 6e 69 71 75 65 6e 65  er.  No uniquene
11c10 73 73 20 69 66 20 30 20 2a 2f 0a 20 20 4b 65 79  ss if 0 */.  Key
11c20 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 2c 20  Info *pKeyInfo, 
11c30 20 20 20 20 20 2f 2a 20 46 6f 72 20 63 6f 6d 70       /* For comp
11c40 61 72 69 6e 67 20 77 69 74 68 20 70 72 65 76 69  aring with previ
11c50 6f 75 73 20 65 6e 74 72 79 20 2a 2f 0a 20 20 69  ous entry */.  i
11c60 6e 74 20 70 34 74 79 70 65 2c 20 20 20 20 20 20  nt p4type,      
11c70 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 34         /* The p4
11c80 20 74 79 70 65 20 66 6f 72 20 70 4b 65 79 49 6e   type for pKeyIn
11c90 66 6f 20 2a 2f 0a 20 20 69 6e 74 20 69 42 72 65  fo */.  int iBre
11ca0 61 6b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ak              
11cb0 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20 69 66 20  /* Jump here if 
11cc0 77 65 20 68 69 74 20 74 68 65 20 4c 49 4d 49 54  we hit the LIMIT
11cd0 20 2a 2f 0a 29 7b 0a 20 20 56 64 62 65 20 2a 76   */.){.  Vdbe *v
11ce0 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65   = pParse->pVdbe
11cf0 3b 0a 20 20 69 6e 74 20 69 43 6f 6e 74 69 6e 75  ;.  int iContinu
11d00 65 3b 0a 20 20 69 6e 74 20 61 64 64 72 3b 0a 0a  e;.  int addr;..
11d10 20 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65 33    addr = sqlite3
11d20 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28  VdbeCurrentAddr(
11d30 76 29 3b 0a 20 20 69 43 6f 6e 74 69 6e 75 65 20  v);.  iContinue 
11d40 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b  = sqlite3VdbeMak
11d50 65 4c 61 62 65 6c 28 76 29 3b 0a 0a 20 20 2f 2a  eLabel(v);..  /*
11d60 20 53 75 70 70 72 65 73 73 20 64 75 70 6c 69 63   Suppress duplic
11d70 61 74 65 73 20 66 6f 72 20 55 4e 49 4f 4e 2c 20  ates for UNION, 
11d80 45 58 43 45 50 54 2c 20 61 6e 64 20 49 4e 54 45  EXCEPT, and INTE
11d90 52 53 45 43 54 20 0a 20 20 2a 2f 0a 20 20 69 66  RSECT .  */.  if
11da0 28 20 72 65 67 50 72 65 76 20 29 7b 0a 20 20 20  ( regPrev ){.   
11db0 20 69 6e 74 20 6a 31 2c 20 6a 32 3b 0a 20 20 20   int j1, j2;.   
11dc0 20 6a 31 20 3d 20 73 71 6c 69 74 65 33 56 64 62   j1 = sqlite3Vdb
11dd0 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 49 66  eAddOp1(v, OP_If
11de0 4e 6f 74 2c 20 72 65 67 50 72 65 76 29 3b 0a 20  Not, regPrev);. 
11df0 20 20 20 6a 32 20 3d 20 73 71 6c 69 74 65 33 56     j2 = sqlite3V
11e00 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f  dbeAddOp4(v, OP_
11e10 43 6f 6d 70 61 72 65 2c 20 70 49 6e 2d 3e 69 4d  Compare, pIn->iM
11e20 65 6d 2c 20 72 65 67 50 72 65 76 2b 31 2c 20 70  em, regPrev+1, p
11e30 49 6e 2d 3e 6e 4d 65 6d 2c 0a 20 20 20 20 20 20  In->nMem,.      
11e40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11e50 20 20 20 20 20 20 20 20 28 63 68 61 72 2a 29 70          (char*)p
11e60 4b 65 79 49 6e 66 6f 2c 20 70 34 74 79 70 65 29  KeyInfo, p4type)
11e70 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
11e80 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4a 75  eAddOp3(v, OP_Ju
11e90 6d 70 2c 20 6a 32 2b 32 2c 20 69 43 6f 6e 74 69  mp, j2+2, iConti
11ea0 6e 75 65 2c 20 6a 32 2b 32 29 3b 0a 20 20 20 20  nue, j2+2);.    
11eb0 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48  sqlite3VdbeJumpH
11ec0 65 72 65 28 76 2c 20 6a 31 29 3b 0a 20 20 20 20  ere(v, j1);.    
11ed0 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 43  sqlite3ExprCodeC
11ee0 6f 70 79 28 70 50 61 72 73 65 2c 20 70 49 6e 2d  opy(pParse, pIn-
11ef0 3e 69 4d 65 6d 2c 20 72 65 67 50 72 65 76 2b 31  >iMem, regPrev+1
11f00 2c 20 70 49 6e 2d 3e 6e 4d 65 6d 29 3b 0a 20 20  , pIn->nMem);.  
11f10 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
11f20 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65  Op2(v, OP_Intege
11f30 72 2c 20 31 2c 20 72 65 67 50 72 65 76 29 3b 0a  r, 1, regPrev);.
11f40 20 20 7d 0a 20 20 69 66 28 20 70 50 61 72 73 65    }.  if( pParse
11f50 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ->db->mallocFail
11f60 65 64 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 0a  ed ) return 0;..
11f70 20 20 2f 2a 20 53 75 70 70 72 65 73 73 20 74 68    /* Suppress th
11f80 65 20 74 68 65 20 66 69 72 73 74 20 4f 46 46 53  e the first OFFS
11f90 45 54 20 65 6e 74 72 69 65 73 20 69 66 20 74 68  ET entries if th
11fa0 65 72 65 20 69 73 20 61 6e 20 4f 46 46 53 45 54  ere is an OFFSET
11fb0 20 63 6c 61 75 73 65 0a 20 20 2a 2f 0a 20 20 63   clause.  */.  c
11fc0 6f 64 65 4f 66 66 73 65 74 28 76 2c 20 70 2c 20  odeOffset(v, p, 
11fd0 69 43 6f 6e 74 69 6e 75 65 29 3b 0a 0a 20 20 73  iContinue);..  s
11fe0 77 69 74 63 68 28 20 70 44 65 73 74 2d 3e 65 44  witch( pDest->eD
11ff0 65 73 74 20 29 7b 0a 20 20 20 20 2f 2a 20 53 74  est ){.    /* St
12000 6f 72 65 20 74 68 65 20 72 65 73 75 6c 74 20 61  ore the result a
12010 73 20 64 61 74 61 20 75 73 69 6e 67 20 61 20 75  s data using a u
12020 6e 69 71 75 65 20 6b 65 79 2e 0a 20 20 20 20 2a  nique key..    *
12030 2f 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f 54  /.    case SRT_T
12040 61 62 6c 65 3a 0a 20 20 20 20 63 61 73 65 20 53  able:.    case S
12050 52 54 5f 45 70 68 65 6d 54 61 62 3a 20 7b 0a 20  RT_EphemTab: {. 
12060 20 20 20 20 20 69 6e 74 20 72 31 20 3d 20 73 71       int r1 = sq
12070 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65 67 28  lite3GetTempReg(
12080 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 69  pParse);.      i
12090 6e 74 20 72 32 20 3d 20 73 71 6c 69 74 65 33 47  nt r2 = sqlite3G
120a0 65 74 54 65 6d 70 52 65 67 28 70 50 61 72 73 65  etTempReg(pParse
120b0 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
120c0 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
120d0 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20 70 49 6e  _MakeRecord, pIn
120e0 2d 3e 69 4d 65 6d 2c 20 70 49 6e 2d 3e 6e 4d 65  ->iMem, pIn->nMe
120f0 6d 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 73 71  m, r1);.      sq
12100 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
12110 76 2c 20 4f 50 5f 4e 65 77 52 6f 77 69 64 2c 20  v, OP_NewRowid, 
12120 70 44 65 73 74 2d 3e 69 50 61 72 6d 2c 20 72 32  pDest->iParm, r2
12130 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
12140 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
12150 5f 49 6e 73 65 72 74 2c 20 70 44 65 73 74 2d 3e  _Insert, pDest->
12160 69 50 61 72 6d 2c 20 72 31 2c 20 72 32 29 3b 0a  iParm, r1, r2);.
12170 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
12180 65 43 68 61 6e 67 65 50 35 28 76 2c 20 4f 50 46  eChangeP5(v, OPF
12190 4c 41 47 5f 41 50 50 45 4e 44 29 3b 0a 20 20 20  LAG_APPEND);.   
121a0 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73     sqlite3Releas
121b0 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c  eTempReg(pParse,
121c0 20 72 32 29 3b 0a 20 20 20 20 20 20 73 71 6c 69   r2);.      sqli
121d0 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65  te3ReleaseTempRe
121e0 67 28 70 50 61 72 73 65 2c 20 72 31 29 3b 0a 20  g(pParse, r1);. 
121f0 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
12200 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  }..#ifndef SQLIT
12210 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a  E_OMIT_SUBQUERY.
12220 20 20 20 20 2f 2a 20 49 66 20 77 65 20 61 72 65      /* If we are
12230 20 63 72 65 61 74 69 6e 67 20 61 20 73 65 74 20   creating a set 
12240 66 6f 72 20 61 6e 20 22 65 78 70 72 20 49 4e 20  for an "expr IN 
12250 28 53 45 4c 45 43 54 20 2e 2e 2e 29 22 20 63 6f  (SELECT ...)" co
12260 6e 73 74 72 75 63 74 2c 0a 20 20 20 20 2a 2a 20  nstruct,.    ** 
12270 74 68 65 6e 20 74 68 65 72 65 20 73 68 6f 75 6c  then there shoul
12280 64 20 62 65 20 61 20 73 69 6e 67 6c 65 20 69 74  d be a single it
12290 65 6d 20 6f 6e 20 74 68 65 20 73 74 61 63 6b 2e  em on the stack.
122a0 20 20 57 72 69 74 65 20 74 68 69 73 0a 20 20 20    Write this.   
122b0 20 2a 2a 20 69 74 65 6d 20 69 6e 74 6f 20 74 68   ** item into th
122c0 65 20 73 65 74 20 74 61 62 6c 65 20 77 69 74 68  e set table with
122d0 20 62 6f 67 75 73 20 64 61 74 61 2e 0a 20 20 20   bogus data..   
122e0 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 52 54   */.    case SRT
122f0 5f 53 65 74 3a 20 7b 0a 20 20 20 20 20 20 69 6e  _Set: {.      in
12300 74 20 72 31 3b 0a 20 20 20 20 20 20 61 73 73 65  t r1;.      asse
12310 72 74 28 20 70 49 6e 2d 3e 6e 4d 65 6d 3d 3d 31  rt( pIn->nMem==1
12320 20 29 3b 0a 20 20 20 20 20 20 70 2d 3e 61 66 66   );.      p->aff
12330 69 6e 69 74 79 20 3d 20 0a 20 20 20 20 20 20 20  inity = .       
12340 20 20 73 71 6c 69 74 65 33 43 6f 6d 70 61 72 65    sqlite3Compare
12350 41 66 66 69 6e 69 74 79 28 70 2d 3e 70 45 4c 69  Affinity(p->pELi
12360 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 2c 20  st->a[0].pExpr, 
12370 70 44 65 73 74 2d 3e 61 66 66 69 6e 69 74 79 29  pDest->affinity)
12380 3b 0a 20 20 20 20 20 20 72 31 20 3d 20 73 71 6c  ;.      r1 = sql
12390 69 74 65 33 47 65 74 54 65 6d 70 52 65 67 28 70  ite3GetTempReg(p
123a0 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 73 71  Parse);.      sq
123b0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28  lite3VdbeAddOp4(
123c0 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64  v, OP_MakeRecord
123d0 2c 20 70 49 6e 2d 3e 69 4d 65 6d 2c 20 31 2c 20  , pIn->iMem, 1, 
123e0 72 31 2c 20 26 70 2d 3e 61 66 66 69 6e 69 74 79  r1, &p->affinity
123f0 2c 20 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  , 1);.      sqli
12400 74 65 33 45 78 70 72 43 61 63 68 65 41 66 66 69  te3ExprCacheAffi
12410 6e 69 74 79 43 68 61 6e 67 65 28 70 50 61 72 73  nityChange(pPars
12420 65 2c 20 70 49 6e 2d 3e 69 4d 65 6d 2c 20 31 29  e, pIn->iMem, 1)
12430 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
12440 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
12450 49 64 78 49 6e 73 65 72 74 2c 20 70 44 65 73 74  IdxInsert, pDest
12460 2d 3e 69 50 61 72 6d 2c 20 72 31 29 3b 0a 20 20  ->iParm, r1);.  
12470 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61      sqlite3Relea
12480 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65  seTempReg(pParse
12490 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 62 72 65  , r1);.      bre
124a0 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  ak;.    }..    /
124b0 2a 20 49 66 20 61 6e 79 20 72 6f 77 20 65 78 69  * If any row exi
124c0 73 74 20 69 6e 20 74 68 65 20 72 65 73 75 6c 74  st in the result
124d0 20 73 65 74 2c 20 72 65 63 6f 72 64 20 74 68 61   set, record tha
124e0 74 20 66 61 63 74 20 61 6e 64 20 61 62 6f 72 74  t fact and abort
124f0 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73  ..    */.    cas
12500 65 20 53 52 54 5f 45 78 69 73 74 73 3a 20 7b 0a  e SRT_Exists: {.
12510 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
12520 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e  eAddOp2(v, OP_In
12530 74 65 67 65 72 2c 20 31 2c 20 70 44 65 73 74 2d  teger, 1, pDest-
12540 3e 69 50 61 72 6d 29 3b 0a 20 20 20 20 20 20 2f  >iParm);.      /
12550 2a 20 54 68 65 20 4c 49 4d 49 54 20 63 6c 61 75  * The LIMIT clau
12560 73 65 20 77 69 6c 6c 20 74 65 72 6d 69 6e 61 74  se will terminat
12570 65 20 74 68 65 20 6c 6f 6f 70 20 66 6f 72 20 75  e the loop for u
12580 73 20 2a 2f 0a 20 20 20 20 20 20 62 72 65 61 6b  s */.      break
12590 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
125a0 49 66 20 74 68 69 73 20 69 73 20 61 20 73 63 61  If this is a sca
125b0 6c 61 72 20 73 65 6c 65 63 74 20 74 68 61 74 20  lar select that 
125c0 69 73 20 70 61 72 74 20 6f 66 20 61 6e 20 65 78  is part of an ex
125d0 70 72 65 73 73 69 6f 6e 2c 20 74 68 65 6e 0a 20  pression, then. 
125e0 20 20 20 2a 2a 20 73 74 6f 72 65 20 74 68 65 20     ** store the 
125f0 72 65 73 75 6c 74 73 20 69 6e 20 74 68 65 20 61  results in the a
12600 70 70 72 6f 70 72 69 61 74 65 20 6d 65 6d 6f 72  ppropriate memor
12610 79 20 63 65 6c 6c 20 61 6e 64 20 62 72 65 61 6b  y cell and break
12620 20 6f 75 74 0a 20 20 20 20 2a 2a 20 6f 66 20 74   out.    ** of t
12630 68 65 20 73 63 61 6e 20 6c 6f 6f 70 2e 0a 20 20  he scan loop..  
12640 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 52    */.    case SR
12650 54 5f 4d 65 6d 3a 20 7b 0a 20 20 20 20 20 20 61  T_Mem: {.      a
12660 73 73 65 72 74 28 20 70 49 6e 2d 3e 6e 4d 65 6d  ssert( pIn->nMem
12670 3d 3d 31 20 29 3b 0a 20 20 20 20 20 20 73 71 6c  ==1 );.      sql
12680 69 74 65 33 45 78 70 72 43 6f 64 65 4d 6f 76 65  ite3ExprCodeMove
12690 28 70 50 61 72 73 65 2c 20 70 49 6e 2d 3e 69 4d  (pParse, pIn->iM
126a0 65 6d 2c 20 70 44 65 73 74 2d 3e 69 50 61 72 6d  em, pDest->iParm
126b0 2c 20 31 29 3b 0a 20 20 20 20 20 20 2f 2a 20 54  , 1);.      /* T
126c0 68 65 20 4c 49 4d 49 54 20 63 6c 61 75 73 65 20  he LIMIT clause 
126d0 77 69 6c 6c 20 6a 75 6d 70 20 6f 75 74 20 6f 66  will jump out of
126e0 20 74 68 65 20 6c 6f 6f 70 20 66 6f 72 20 75 73   the loop for us
126f0 20 2a 2f 0a 20 20 20 20 20 20 62 72 65 61 6b 3b   */.      break;
12700 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a  .    }.#endif /*
12710 20 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f   #ifndef SQLITE_
12720 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 20 2a 2f  OMIT_SUBQUERY */
12730 0a 0a 20 20 20 20 2f 2a 20 53 65 6e 64 20 74 68  ..    /* Send th
12740 65 20 64 61 74 61 20 74 6f 20 74 68 65 20 63 61  e data to the ca
12750 6c 6c 62 61 63 6b 20 66 75 6e 63 74 69 6f 6e 20  llback function 
12760 6f 72 20 74 6f 20 61 20 73 75 62 72 6f 75 74 69  or to a subrouti
12770 6e 65 2e 20 20 49 6e 20 74 68 65 0a 20 20 20 20  ne.  In the.    
12780 2a 2a 20 63 61 73 65 20 6f 66 20 61 20 73 75 62  ** case of a sub
12790 72 6f 75 74 69 6e 65 2c 20 74 68 65 20 73 75 62  routine, the sub
127a0 72 6f 75 74 69 6e 65 20 69 74 73 65 6c 66 20 69  routine itself i
127b0 73 20 72 65 73 70 6f 6e 73 69 62 6c 65 20 66 6f  s responsible fo
127c0 72 0a 20 20 20 20 2a 2a 20 70 6f 70 70 69 6e 67  r.    ** popping
127d0 20 74 68 65 20 64 61 74 61 20 66 72 6f 6d 20 74   the data from t
127e0 68 65 20 73 74 61 63 6b 2e 0a 20 20 20 20 2a 2f  he stack..    */
127f0 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f 43 6f  .    case SRT_Co
12800 72 6f 75 74 69 6e 65 3a 20 7b 0a 20 20 20 20 20  routine: {.     
12810 20 69 66 28 20 70 44 65 73 74 2d 3e 69 4d 65 6d   if( pDest->iMem
12820 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70  ==0 ){.        p
12830 44 65 73 74 2d 3e 69 4d 65 6d 20 3d 20 73 71 6c  Dest->iMem = sql
12840 69 74 65 33 47 65 74 54 65 6d 70 52 61 6e 67 65  ite3GetTempRange
12850 28 70 50 61 72 73 65 2c 20 70 49 6e 2d 3e 6e 4d  (pParse, pIn->nM
12860 65 6d 29 3b 0a 20 20 20 20 20 20 20 20 70 44 65  em);.        pDe
12870 73 74 2d 3e 6e 4d 65 6d 20 3d 20 70 49 6e 2d 3e  st->nMem = pIn->
12880 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 7d 0a 20 20  nMem;.      }.  
12890 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
128a0 6f 64 65 4d 6f 76 65 28 70 50 61 72 73 65 2c 20  odeMove(pParse, 
128b0 70 49 6e 2d 3e 69 4d 65 6d 2c 20 70 44 65 73 74  pIn->iMem, pDest
128c0 2d 3e 69 4d 65 6d 2c 20 70 44 65 73 74 2d 3e 6e  ->iMem, pDest->n
128d0 4d 65 6d 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  Mem);.      sqli
128e0 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c  te3VdbeAddOp1(v,
128f0 20 4f 50 5f 59 69 65 6c 64 2c 20 70 44 65 73 74   OP_Yield, pDest
12900 2d 3e 69 50 61 72 6d 29 3b 0a 20 20 20 20 20 20  ->iParm);.      
12910 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20  break;.    }..  
12920 20 20 63 61 73 65 20 53 52 54 5f 43 61 6c 6c 62    case SRT_Callb
12930 61 63 6b 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c  ack: {.      sql
12940 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
12950 2c 20 4f 50 5f 52 65 73 75 6c 74 52 6f 77 2c 20  , OP_ResultRow, 
12960 70 49 6e 2d 3e 69 4d 65 6d 2c 20 70 49 6e 2d 3e  pIn->iMem, pIn->
12970 6e 4d 65 6d 29 3b 0a 20 20 20 20 20 20 73 71 6c  nMem);.      sql
12980 69 74 65 33 45 78 70 72 43 61 63 68 65 41 66 66  ite3ExprCacheAff
12990 69 6e 69 74 79 43 68 61 6e 67 65 28 70 50 61 72  inityChange(pPar
129a0 73 65 2c 20 70 49 6e 2d 3e 69 4d 65 6d 2c 20 70  se, pIn->iMem, p
129b0 49 6e 2d 3e 6e 4d 65 6d 29 3b 0a 20 20 20 20 20  In->nMem);.     
129c0 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 23   break;.    }..#
129d0 69 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  if !defined(SQLI
129e0 54 45 5f 4f 4d 49 54 5f 54 52 49 47 47 45 52 29  TE_OMIT_TRIGGER)
129f0 0a 20 20 20 20 2f 2a 20 44 69 73 63 61 72 64 20  .    /* Discard 
12a00 74 68 65 20 72 65 73 75 6c 74 73 2e 20 20 54 68  the results.  Th
12a10 69 73 20 69 73 20 75 73 65 64 20 66 6f 72 20 53  is is used for S
12a20 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 73  ELECT statements
12a30 20 69 6e 73 69 64 65 0a 20 20 20 20 2a 2a 20 74   inside.    ** t
12a40 68 65 20 62 6f 64 79 20 6f 66 20 61 20 54 52 49  he body of a TRI
12a50 47 47 45 52 2e 20 20 54 68 65 20 70 75 72 70 6f  GGER.  The purpo
12a60 73 65 20 6f 66 20 73 75 63 68 20 73 65 6c 65 63  se of such selec
12a70 74 73 20 69 73 20 74 6f 20 63 61 6c 6c 0a 20 20  ts is to call.  
12a80 20 20 2a 2a 20 75 73 65 72 2d 64 65 66 69 6e 65    ** user-define
12a90 64 20 66 75 6e 63 74 69 6f 6e 73 20 74 68 61 74  d functions that
12aa0 20 68 61 76 65 20 73 69 64 65 20 65 66 66 65 63   have side effec
12ab0 74 73 2e 20 20 57 65 20 64 6f 20 6e 6f 74 20 63  ts.  We do not c
12ac0 61 72 65 0a 20 20 20 20 2a 2a 20 61 62 6f 75 74  are.    ** about
12ad0 20 74 68 65 20 61 63 74 75 61 6c 20 72 65 73 75   the actual resu
12ae0 6c 74 73 20 6f 66 20 74 68 65 20 73 65 6c 65 63  lts of the selec
12af0 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 64 65  t..    */.    de
12b00 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20 20 20 62  fault: {.      b
12b10 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64  reak;.    }.#end
12b20 69 66 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4a 75 6d  if.  }..  /* Jum
12b30 70 20 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 20  p to the end of 
12b40 74 68 65 20 6c 6f 6f 70 20 69 66 20 74 68 65 20  the loop if the 
12b50 4c 49 4d 49 54 20 69 73 20 72 65 61 63 68 65 64  LIMIT is reached
12b60 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e  ..  */.  if( p->
12b70 69 4c 69 6d 69 74 20 29 7b 0a 20 20 20 20 73 71  iLimit ){.    sq
12b80 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
12b90 76 2c 20 4f 50 5f 41 64 64 49 6d 6d 2c 20 70 2d  v, OP_AddImm, p-
12ba0 3e 69 4c 69 6d 69 74 2c 20 2d 31 29 3b 0a 20 20  >iLimit, -1);.  
12bb0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
12bc0 4f 70 32 28 76 2c 20 4f 50 5f 49 66 5a 65 72 6f  Op2(v, OP_IfZero
12bd0 2c 20 70 2d 3e 69 4c 69 6d 69 74 2c 20 69 42 72  , p->iLimit, iBr
12be0 65 61 6b 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  eak);.  }..  /* 
12bf0 47 65 6e 65 72 61 74 65 20 74 68 65 20 73 75 62  Generate the sub
12c00 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 0a 20  routine return. 
12c10 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 56 64 62   */.  sqlite3Vdb
12c20 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c  eResolveLabel(v,
12c30 20 69 43 6f 6e 74 69 6e 75 65 29 3b 0a 20 20 73   iContinue);.  s
12c40 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31  qlite3VdbeAddOp1
12c50 28 76 2c 20 4f 50 5f 52 65 74 75 72 6e 2c 20 72  (v, OP_Return, r
12c60 65 67 52 65 74 75 72 6e 29 3b 0a 0a 20 20 72 65  egReturn);..  re
12c70 74 75 72 6e 20 61 64 64 72 3b 0a 7d 0a 0a 2f 2a  turn addr;.}../*
12c80 0a 2a 2a 20 41 6c 74 65 72 6e 61 74 69 76 65 20  .** Alternative 
12c90 63 6f 6d 70 6f 75 6e 64 20 73 65 6c 65 63 74 20  compound select 
12ca0 63 6f 64 65 20 67 65 6e 65 72 61 74 6f 72 20 66  code generator f
12cb0 6f 72 20 63 61 73 65 73 20 77 68 65 6e 20 74 68  or cases when th
12cc0 65 72 65 0a 2a 2a 20 69 73 20 61 6e 20 4f 52 44  ere.** is an ORD
12cd0 45 52 20 42 59 20 63 6c 61 75 73 65 2e 0a 2a 2a  ER BY clause..**
12ce0 0a 2a 2a 20 57 65 20 61 73 73 75 6d 65 20 61 20  .** We assume a 
12cf0 71 75 65 72 79 20 6f 66 20 74 68 65 20 66 6f 6c  query of the fol
12d00 6c 6f 77 69 6e 67 20 66 6f 72 6d 3a 0a 2a 2a 0a  lowing form:.**.
12d10 2a 2a 20 20 20 20 20 20 3c 73 65 6c 65 63 74 41  **      <selectA
12d20 3e 20 20 3c 6f 70 65 72 61 74 6f 72 3e 20 20 3c  >  <operator>  <
12d30 73 65 6c 65 63 74 42 3e 20 20 4f 52 44 45 52 20  selectB>  ORDER 
12d40 42 59 20 3c 6f 72 64 65 72 62 79 6c 69 73 74 3e  BY <orderbylist>
12d50 0a 2a 2a 0a 2a 2a 20 3c 6f 70 65 72 61 74 6f 72  .**.** <operator
12d60 3e 20 69 73 20 6f 6e 65 20 6f 66 20 55 4e 49 4f  > is one of UNIO
12d70 4e 20 41 4c 4c 2c 20 55 4e 49 4f 4e 2c 20 45 58  N ALL, UNION, EX
12d80 43 45 50 54 2c 20 6f 72 20 49 4e 54 45 52 53 45  CEPT, or INTERSE
12d90 43 54 2e 20 20 54 68 65 20 69 64 65 61 0a 2a 2a  CT.  The idea.**
12da0 20 69 73 20 74 6f 20 63 6f 64 65 20 62 6f 74 68   is to code both
12db0 20 3c 73 65 6c 65 63 74 41 3e 20 61 6e 64 20 3c   <selectA> and <
12dc0 73 65 6c 65 63 74 42 3e 20 77 69 74 68 20 74 68  selectB> with th
12dd0 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73  e ORDER BY claus
12de0 65 20 61 73 0a 2a 2a 20 63 6f 2d 72 6f 75 74 69  e as.** co-routi
12df0 6e 65 73 2e 20 20 54 68 65 6e 20 72 75 6e 20 74  nes.  Then run t
12e00 68 65 20 63 6f 2d 72 6f 75 74 69 6e 65 73 20 69  he co-routines i
12e10 6e 20 70 61 72 61 6c 6c 65 6c 20 61 6e 64 20 6d  n parallel and m
12e20 65 72 67 65 20 74 68 65 20 72 65 73 75 6c 74 73  erge the results
12e30 0a 2a 2a 20 69 6e 74 6f 20 74 68 65 20 6f 75 74  .** into the out
12e40 70 75 74 2e 20 20 49 6e 20 61 64 64 69 74 69 6f  put.  In additio
12e50 6e 20 74 6f 20 74 68 65 20 74 77 6f 20 63 6f 72  n to the two cor
12e60 6f 75 74 69 6e 65 73 20 28 63 61 6c 6c 65 64 20  outines (called 
12e70 73 65 6c 65 63 74 41 20 61 6e 64 0a 2a 2a 20 73  selectA and.** s
12e80 65 6c 65 63 74 42 29 20 74 68 65 72 65 20 61 72  electB) there ar
12e90 65 20 37 20 73 75 62 72 6f 75 74 69 6e 65 73 3a  e 7 subroutines:
12ea0 0a 2a 2a 0a 2a 2a 20 20 20 20 6f 75 74 41 3a 20  .**.**    outA: 
12eb0 20 20 20 4d 6f 76 65 20 74 68 65 20 6f 75 74 70     Move the outp
12ec0 75 74 20 6f 66 20 74 68 65 20 73 65 6c 65 63 74  ut of the select
12ed0 41 20 63 6f 72 6f 75 74 69 6e 65 20 69 6e 74 6f  A coroutine into
12ee0 20 74 68 65 20 6f 75 74 70 75 74 0a 2a 2a 20 20   the output.**  
12ef0 20 20 20 20 20 20 20 20 20 20 20 6f 66 20 74 68             of th
12f00 65 20 63 6f 6d 70 6f 75 6e 64 20 71 75 65 72 79  e compound query
12f10 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 6f 75 74 42 3a  ..**.**    outB:
12f20 20 20 20 20 4d 6f 76 65 20 74 68 65 20 6f 75 74      Move the out
12f30 70 75 74 20 6f 66 20 74 68 65 20 73 65 6c 65 63  put of the selec
12f40 74 42 20 63 6f 72 6f 75 74 69 6e 65 20 69 6e 74  tB coroutine int
12f50 6f 20 74 68 65 20 6f 75 74 70 75 74 0a 2a 2a 20  o the output.** 
12f60 20 20 20 20 20 20 20 20 20 20 20 20 6f 66 20 74              of t
12f70 68 65 20 63 6f 6d 70 6f 75 6e 64 20 71 75 65 72  he compound quer
12f80 79 2e 20 20 28 4f 6e 6c 79 20 67 65 6e 65 72 61  y.  (Only genera
12f90 74 65 64 20 66 6f 72 20 55 4e 49 4f 4e 20 61 6e  ted for UNION an
12fa0 64 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  d.**            
12fb0 20 55 4e 49 4f 4e 20 41 4c 4c 2e 20 20 45 58 43   UNION ALL.  EXC
12fc0 45 50 54 20 61 6e 64 20 49 4e 53 45 52 54 53 45  EPT and INSERTSE
12fd0 43 54 20 6e 65 76 65 72 20 6f 75 74 70 75 74 20  CT never output 
12fe0 61 20 72 6f 77 20 74 68 61 74 0a 2a 2a 20 20 20  a row that.**   
12ff0 20 20 20 20 20 20 20 20 20 20 61 70 70 65 61 72            appear
13000 73 20 6f 6e 6c 79 20 69 6e 20 42 2e 29 0a 2a 2a  s only in B.).**
13010 0a 2a 2a 20 20 20 20 41 6c 74 42 3a 20 20 20 20  .**    AltB:    
13020 43 61 6c 6c 65 64 20 77 68 65 6e 20 74 68 65 72  Called when ther
13030 65 20 69 73 20 64 61 74 61 20 66 72 6f 6d 20 62  e is data from b
13040 6f 74 68 20 63 6f 72 6f 75 74 69 6e 65 73 20 61  oth coroutines a
13050 6e 64 20 41 3c 42 2e 0a 2a 2a 0a 2a 2a 20 20 20  nd A<B..**.**   
13060 20 41 65 71 42 3a 20 20 20 20 43 61 6c 6c 65 64   AeqB:    Called
13070 20 77 68 65 6e 20 74 68 65 72 65 20 69 73 20 64   when there is d
13080 61 74 61 20 66 72 6f 6d 20 62 6f 74 68 20 63 6f  ata from both co
13090 72 6f 75 74 69 6e 65 73 20 61 6e 64 20 41 3d 3d  routines and A==
130a0 42 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 41 67 74 42  B..**.**    AgtB
130b0 3a 20 20 20 20 43 61 6c 6c 65 64 20 77 68 65 6e  :    Called when
130c0 20 74 68 65 72 65 20 69 73 20 64 61 74 61 20 66   there is data f
130d0 72 6f 6d 20 62 6f 74 68 20 63 6f 72 6f 75 74 69  rom both corouti
130e0 6e 65 73 20 61 6e 64 20 41 3e 42 2e 0a 2a 2a 0a  nes and A>B..**.
130f0 2a 2a 20 20 20 20 45 6f 66 41 3a 20 20 20 20 43  **    EofA:    C
13100 61 6c 6c 65 64 20 77 68 65 6e 20 64 61 74 61 20  alled when data 
13110 69 73 20 65 78 68 61 75 73 74 65 64 20 66 72 6f  is exhausted fro
13120 6d 20 73 65 6c 65 63 74 41 2e 0a 2a 2a 0a 2a 2a  m selectA..**.**
13130 20 20 20 20 45 6f 66 42 3a 20 20 20 20 43 61 6c      EofB:    Cal
13140 6c 65 64 20 77 68 65 6e 20 64 61 74 61 20 69 73  led when data is
13150 20 65 78 68 61 75 73 74 65 64 20 66 72 6f 6d 20   exhausted from 
13160 73 65 6c 65 63 74 42 2e 0a 2a 2a 0a 2a 2a 20 54  selectB..**.** T
13170 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  he implementatio
13180 6e 20 6f 66 20 74 68 65 20 6c 61 74 74 65 72 20  n of the latter 
13190 66 69 76 65 20 73 75 62 72 6f 75 74 69 6e 65 73  five subroutines
131a0 20 64 65 70 65 6e 64 20 6f 6e 20 77 68 69 63 68   depend on which
131b0 20 0a 2a 2a 20 3c 6f 70 65 72 61 74 6f 72 3e 20   .** <operator> 
131c0 69 73 20 75 73 65 64 3a 0a 2a 2a 0a 2a 2a 0a 2a  is used:.**.**.*
131d0 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 55 4e  *             UN
131e0 49 4f 4e 20 41 4c 4c 20 20 20 20 20 20 20 20 20  ION ALL         
131f0 55 4e 49 4f 4e 20 20 20 20 20 20 20 20 20 20 20  UNION           
13200 20 45 58 43 45 50 54 20 20 20 20 20 20 20 20 20   EXCEPT         
13210 20 49 4e 54 45 52 53 45 43 54 0a 2a 2a 20 20 20   INTERSECT.**   
13220 20 20 20 20 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d         ---------
13230 2d 2d 2d 2d 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----  ----------
13240 2d 2d 2d 2d 2d 2d 2d 20 20 2d 2d 2d 2d 2d 2d 2d  -------  -------
13250 2d 2d 2d 2d 2d 2d 2d 20 20 2d 2d 2d 2d 2d 2d 2d  -------  -------
13260 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a 20 20 20  ----------.**   
13270 41 6c 74 42 3a 20 20 20 6f 75 74 41 2c 20 6e 65  AltB:   outA, ne
13280 78 74 41 20 20 20 20 20 20 6f 75 74 41 2c 20 6e  xtA      outA, n
13290 65 78 74 41 20 20 20 20 20 20 20 6f 75 74 41 2c  extA       outA,
132a0 20 6e 65 78 74 41 20 20 20 20 20 20 20 20 20 6e   nextA         n
132b0 65 78 74 41 0a 2a 2a 0a 2a 2a 20 20 20 41 65 71  extA.**.**   Aeq
132c0 42 3a 20 20 20 6f 75 74 41 2c 20 6e 65 78 74 41  B:   outA, nextA
132d0 20 20 20 20 20 20 20 20 20 6e 65 78 74 41 20 20           nextA  
132e0 20 20 20 20 20 20 20 20 20 20 20 6e 65 78 74 41             nextA
132f0 20 20 20 20 20 20 20 20 20 6f 75 74 41 2c 20 6e           outA, n
13300 65 78 74 41 0a 2a 2a 0a 2a 2a 20 20 20 41 67 74  extA.**.**   Agt
13310 42 3a 20 20 20 6f 75 74 42 2c 20 6e 65 78 74 42  B:   outB, nextB
13320 20 20 20 20 20 20 6f 75 74 42 2c 20 6e 65 78 74        outB, next
13330 42 20 20 20 20 20 20 20 20 20 20 6e 65 78 74 42  B          nextB
13340 20 20 20 20 20 20 20 20 20 20 20 20 6e 65 78 74              next
13350 42 0a 2a 2a 0a 2a 2a 20 20 20 45 6f 66 41 3a 20  B.**.**   EofA: 
13360 20 20 6f 75 74 42 2c 20 6e 65 78 74 42 20 20 20    outB, nextB   
13370 20 20 20 6f 75 74 42 2c 20 6e 65 78 74 42 20 20     outB, nextB  
13380 20 20 20 20 20 20 20 20 68 61 6c 74 20 20 20 20          halt    
13390 20 20 20 20 20 20 20 20 20 68 61 6c 74 0a 2a 2a           halt.**
133a0 0a 2a 2a 20 20 20 45 6f 66 42 3a 20 20 20 6f 75  .**   EofB:   ou
133b0 74 41 2c 20 6e 65 78 74 41 20 20 20 20 20 20 6f  tA, nextA      o
133c0 75 74 41 2c 20 6e 65 78 74 41 20 20 20 20 20 20  utA, nextA      
133d0 20 6f 75 74 41 2c 20 6e 65 78 74 41 20 20 20 20   outA, nextA    
133e0 20 20 20 20 20 68 61 6c 74 0a 2a 2a 0a 2a 2a 20       halt.**.** 
133f0 49 6e 20 74 68 65 20 41 6c 74 42 2c 20 41 65 71  In the AltB, Aeq
13400 42 2c 20 61 6e 64 20 41 67 74 42 20 73 75 62 72  B, and AgtB subr
13410 6f 75 74 69 6e 65 73 2c 20 61 6e 20 45 4f 46 20  outines, an EOF 
13420 6f 6e 20 41 20 66 6f 6c 6c 6f 77 69 6e 67 20 6e  on A following n
13430 65 78 74 41 0a 2a 2a 20 63 61 75 73 65 73 20 61  extA.** causes a
13440 6e 20 69 6d 6d 65 64 69 61 74 65 20 6a 75 6d 70  n immediate jump
13450 20 74 6f 20 45 6f 66 41 20 61 6e 64 20 61 6e 20   to EofA and an 
13460 45 4f 46 20 6f 6e 20 42 20 66 6f 6c 6c 6f 77 69  EOF on B followi
13470 6e 67 20 6e 65 78 74 42 20 63 61 75 73 65 73 0a  ng nextB causes.
13480 2a 2a 20 61 6e 20 69 6d 6d 65 64 69 61 74 65 20  ** an immediate 
13490 6a 75 6d 70 20 74 6f 20 45 6f 66 42 2e 20 20 57  jump to EofB.  W
134a0 69 74 68 69 6e 20 45 6f 66 41 20 61 6e 64 20 45  ithin EofA and E
134b0 6f 66 42 2c 20 61 6e 64 20 45 4f 46 20 6f 6e 20  ofB, and EOF on 
134c0 65 6e 74 72 79 20 6f 72 0a 2a 2a 20 66 6f 6c 6c  entry or.** foll
134d0 6f 77 69 6e 67 20 6e 65 78 74 58 20 63 61 75 73  owing nextX caus
134e0 65 73 20 61 20 6a 75 6d 70 20 74 6f 20 74 68 65  es a jump to the
134f0 20 65 6e 64 20 6f 66 20 74 68 65 20 73 65 6c 65   end of the sele
13500 63 74 20 70 72 6f 63 65 73 73 69 6e 67 2e 0a 2a  ct processing..*
13510 2a 0a 2a 2a 20 44 75 70 6c 69 63 61 74 65 20 72  *.** Duplicate r
13520 65 6d 6f 76 61 6c 20 69 6e 20 74 68 65 20 55 4e  emoval in the UN
13530 49 4f 4e 2c 20 45 58 43 45 50 54 2c 20 61 6e 64  ION, EXCEPT, and
13540 20 49 4e 54 45 52 53 45 43 54 20 63 61 73 65 73   INTERSECT cases
13550 20 69 73 20 68 61 6e 64 6c 65 64 0a 2a 2a 20 77   is handled.** w
13560 69 74 68 69 6e 20 74 68 65 20 6f 75 74 70 75 74  ithin the output
13570 20 73 75 62 72 6f 75 74 69 6e 65 2e 20 20 54 68   subroutine.  Th
13580 65 20 72 65 67 50 72 65 76 20 72 65 67 69 73 74  e regPrev regist
13590 65 72 20 73 65 74 20 68 6f 6c 64 73 20 74 68 65  er set holds the
135a0 20 70 72 65 76 69 6f 75 73 6c 79 0a 2a 2a 20 6f   previously.** o
135b0 75 74 70 75 74 20 76 61 6c 75 65 2e 20 20 41 20  utput value.  A 
135c0 63 6f 6d 70 61 72 69 73 6f 6e 20 69 73 20 6d 61  comparison is ma
135d0 64 65 20 61 67 61 69 6e 73 74 20 74 68 69 73 20  de against this 
135e0 76 61 6c 75 65 20 61 6e 64 20 74 68 65 20 6f 75  value and the ou
135f0 74 70 75 74 0a 2a 2a 20 69 73 20 73 6b 69 70 70  tput.** is skipp
13600 65 64 20 69 66 20 74 68 65 20 6e 65 78 74 20 72  ed if the next r
13610 65 73 75 6c 74 73 20 77 6f 75 6c 64 20 62 65 20  esults would be 
13620 74 68 65 20 73 61 6d 65 20 61 73 20 74 68 65 20  the same as the 
13630 70 72 65 76 69 6f 75 73 2e 0a 2a 2a 0a 2a 2a 20  previous..**.** 
13640 54 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69  The implementati
13650 6f 6e 20 70 6c 61 6e 20 69 73 20 74 6f 20 69 6d  on plan is to im
13660 70 6c 65 6d 65 6e 74 20 74 68 65 20 74 77 6f 20  plement the two 
13670 63 6f 72 6f 75 74 69 6e 65 73 20 61 6e 64 20 73  coroutines and s
13680 65 76 65 6e 0a 2a 2a 20 73 75 62 72 6f 75 74 69  even.** subrouti
13690 6e 65 73 20 66 69 72 73 74 2c 20 74 68 65 6e 20  nes first, then 
136a0 70 75 74 20 74 68 65 20 63 6f 6e 74 72 6f 6c 20  put the control 
136b0 6c 6f 67 69 63 20 61 74 20 74 68 65 20 62 6f 74  logic at the bot
136c0 74 6f 6d 2e 20 20 4c 69 6b 65 20 74 68 69 73 3a  tom.  Like this:
136d0 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  .**.**          
136e0 67 6f 74 6f 20 49 6e 69 74 0a 2a 2a 20 20 20 20  goto Init.**    
136f0 20 63 6f 41 3a 20 63 6f 72 6f 75 74 69 6e 65 20   coA: coroutine 
13700 66 6f 72 20 6c 65 66 74 20 71 75 65 72 79 20 28  for left query (
13710 41 29 0a 2a 2a 20 20 20 20 20 63 6f 42 3a 20 63  A).**     coB: c
13720 6f 72 6f 75 74 69 6e 65 20 66 6f 72 20 72 69 67  oroutine for rig
13730 68 74 20 71 75 65 72 79 20 28 42 29 0a 2a 2a 20  ht query (B).** 
13740 20 20 20 6f 75 74 41 3a 20 6f 75 74 70 75 74 20     outA: output 
13750 6f 6e 65 20 72 6f 77 20 6f 66 20 41 0a 2a 2a 20  one row of A.** 
13760 20 20 20 6f 75 74 42 3a 20 6f 75 74 70 75 74 20     outB: output 
13770 6f 6e 65 20 72 6f 77 20 6f 66 20 42 20 28 55 4e  one row of B (UN
13780 49 4f 4e 20 61 6e 64 20 55 4e 49 4f 4e 20 41 4c  ION and UNION AL
13790 4c 20 6f 6e 6c 79 29 0a 2a 2a 20 20 20 20 45 6f  L only).**    Eo
137a0 66 41 3a 20 2e 2e 2e 0a 2a 2a 20 20 20 20 45 6f  fA: ....**    Eo
137b0 66 42 3a 20 2e 2e 2e 0a 2a 2a 20 20 20 20 41 6c  fB: ....**    Al
137c0 74 42 3a 20 2e 2e 2e 0a 2a 2a 20 20 20 20 41 65  tB: ....**    Ae
137d0 71 42 3a 20 2e 2e 2e 0a 2a 2a 20 20 20 20 41 67  qB: ....**    Ag
137e0 74 42 3a 20 2e 2e 2e 0a 2a 2a 20 20 20 20 49 6e  tB: ....**    In
137f0 69 74 3a 20 69 6e 69 74 69 61 6c 69 7a 65 20 63  it: initialize c
13800 6f 72 6f 75 74 69 6e 65 20 72 65 67 69 73 74 65  oroutine registe
13810 72 73 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 79  rs.**          y
13820 69 65 6c 64 20 63 6f 41 0a 2a 2a 20 20 20 20 20  ield coA.**     
13830 20 20 20 20 20 69 66 20 65 6f 66 28 41 29 20 67       if eof(A) g
13840 6f 74 6f 20 45 6f 66 41 0a 2a 2a 20 20 20 20 20  oto EofA.**     
13850 20 20 20 20 20 79 69 65 6c 64 20 63 6f 42 0a 2a       yield coB.*
13860 2a 20 20 20 20 20 20 20 20 20 20 69 66 20 65 6f  *          if eo
13870 66 28 42 29 20 67 6f 74 6f 20 45 6f 66 42 0a 2a  f(B) goto EofB.*
13880 2a 20 20 20 20 43 6d 70 72 3a 20 43 6f 6d 70 61  *    Cmpr: Compa
13890 72 65 20 41 2c 20 42 0a 2a 2a 20 20 20 20 20 20  re A, B.**      
138a0 20 20 20 20 4a 75 6d 70 20 41 6c 74 42 2c 20 41      Jump AltB, A
138b0 65 71 42 2c 20 41 67 74 42 0a 2a 2a 20 20 20 20  eqB, AgtB.**    
138c0 20 45 6e 64 3a 20 2e 2e 2e 0a 2a 2a 0a 2a 2a 20   End: ....**.** 
138d0 57 65 20 63 61 6c 6c 20 41 6c 74 42 2c 20 41 65  We call AltB, Ae
138e0 71 42 2c 20 41 67 74 42 2c 20 45 6f 66 41 2c 20  qB, AgtB, EofA, 
138f0 61 6e 64 20 45 6f 66 42 20 22 73 75 62 72 6f 75  and EofB "subrou
13900 74 69 6e 65 73 22 20 62 75 74 20 74 68 65 79 20  tines" but they 
13910 61 72 65 20 6e 6f 74 0a 2a 2a 20 61 63 74 75 61  are not.** actua
13920 6c 6c 79 20 63 61 6c 6c 65 64 20 75 73 69 6e 67  lly called using
13930 20 47 6f 73 75 62 20 61 6e 64 20 74 68 65 79 20   Gosub and they 
13940 64 6f 20 6e 6f 74 20 52 65 74 75 72 6e 2e 20 20  do not Return.  
13950 45 6f 66 41 20 61 6e 64 20 45 6f 66 42 20 6c 6f  EofA and EofB lo
13960 6f 70 0a 2a 2a 20 75 6e 74 69 6c 20 61 6c 6c 20  op.** until all 
13970 64 61 74 61 20 69 73 20 65 78 68 61 75 73 74 65  data is exhauste
13980 64 20 74 68 65 6e 20 6a 75 6d 70 20 74 6f 20 74  d then jump to t
13990 68 65 20 22 65 6e 64 22 20 6c 61 62 65 2e 20 20  he "end" labe.  
139a0 41 6c 74 42 2c 20 41 65 71 42 2c 0a 2a 2a 20 61  AltB, AeqB,.** a
139b0 6e 64 20 41 67 74 42 20 6a 75 6d 70 20 74 6f 20  nd AgtB jump to 
139c0 65 69 74 68 65 72 20 4c 32 20 6f 72 20 74 6f 20  either L2 or to 
139d0 6f 6e 65 20 6f 66 20 45 6f 66 41 20 6f 72 20 45  one of EofA or E
139e0 6f 66 42 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ofB..*/.static i
139f0 6e 74 20 6d 75 6c 74 69 53 65 6c 65 63 74 4f 72  nt multiSelectOr
13a00 64 65 72 42 79 28 0a 20 20 50 61 72 73 65 20 2a  derBy(.  Parse *
13a10 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 2f  pParse,        /
13a20 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78  * Parsing contex
13a30 74 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70  t */.  Select *p
13a40 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ,            /* 
13a50 54 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 20 6f  The right-most o
13a60 66 20 53 45 4c 45 43 54 73 20 74 6f 20 62 65 20  f SELECTs to be 
13a70 63 6f 64 65 64 20 2a 2f 0a 20 20 53 65 6c 65 63  coded */.  Selec
13a80 74 44 65 73 74 20 2a 70 44 65 73 74 20 20 20 20  tDest *pDest    
13a90 20 2f 2a 20 57 68 61 74 20 74 6f 20 64 6f 20 77   /* What to do w
13aa0 69 74 68 20 71 75 65 72 79 20 72 65 73 75 6c 74  ith query result
13ab0 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 2c  s */.){.  int i,
13ac0 20 6a 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   j;             
13ad0 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 73  /* Loop counters
13ae0 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 50   */.  Select *pP
13af0 72 69 6f 72 3b 20 20 20 20 20 20 20 2f 2a 20 41  rior;       /* A
13b00 6e 6f 74 68 65 72 20 53 45 4c 45 43 54 20 69 6d  nother SELECT im
13b10 6d 65 64 69 61 74 65 6c 79 20 74 6f 20 6f 75 72  mediately to our
13b20 20 6c 65 66 74 20 2a 2f 0a 20 20 56 64 62 65 20   left */.  Vdbe 
13b30 2a 76 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  *v;             
13b40 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64   /* Generate cod
13b50 65 20 74 6f 20 74 68 69 73 20 56 44 42 45 20 2a  e to this VDBE *
13b60 2f 0a 20 20 53 65 6c 65 63 74 44 65 73 74 20 64  /.  SelectDest d
13b70 65 73 74 41 3b 20 20 20 20 20 2f 2a 20 44 65 73  estA;     /* Des
13b80 74 69 6e 61 74 69 6f 6e 20 66 6f 72 20 63 6f 72  tination for cor
13b90 6f 75 74 69 6e 65 20 41 20 2a 2f 0a 20 20 53 65  outine A */.  Se
13ba0 6c 65 63 74 44 65 73 74 20 64 65 73 74 42 3b 20  lectDest destB; 
13bb0 20 20 20 20 2f 2a 20 44 65 73 74 69 6e 61 74 69      /* Destinati
13bc0 6f 6e 20 66 6f 72 20 63 6f 72 6f 75 74 69 6e 65  on for coroutine
13bd0 20 42 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 41   B */.  int regA
13be0 64 64 72 41 3b 20 20 20 20 20 20 20 20 20 2f 2a  ddrA;         /*
13bf0 20 41 64 64 72 65 73 73 20 72 65 67 69 73 74 65   Address registe
13c00 72 20 66 6f 72 20 73 65 6c 65 63 74 2d 41 20 63  r for select-A c
13c10 6f 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 69 6e  oroutine */.  in
13c20 74 20 72 65 67 45 6f 66 41 3b 20 20 20 20 20 20  t regEofA;      
13c30 20 20 20 20 2f 2a 20 46 6c 61 67 20 74 6f 20 69      /* Flag to i
13c40 6e 64 69 63 61 74 65 20 77 68 65 6e 20 73 65 6c  ndicate when sel
13c50 65 63 74 2d 41 20 69 73 20 63 6f 6d 70 6c 65 74  ect-A is complet
13c60 65 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 41 64  e */.  int regAd
13c70 64 72 42 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  drB;         /* 
13c80 41 64 64 72 65 73 73 20 72 65 67 69 73 74 65 72  Address register
13c90 20 66 6f 72 20 73 65 6c 65 63 74 2d 42 20 63 6f   for select-B co
13ca0 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 69 6e 74  routine */.  int
13cb0 20 72 65 67 45 6f 66 42 3b 20 20 20 20 20 20 20   regEofB;       
13cc0 20 20 20 2f 2a 20 46 6c 61 67 20 74 6f 20 69 6e     /* Flag to in
13cd0 64 69 63 61 74 65 20 77 68 65 6e 20 73 65 6c 65  dicate when sele
13ce0 63 74 2d 42 20 69 73 20 63 6f 6d 70 6c 65 74 65  ct-B is complete
13cf0 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 53 65   */.  int addrSe
13d00 6c 65 63 74 41 3b 20 20 20 20 20 20 2f 2a 20 41  lectA;      /* A
13d10 64 64 72 65 73 73 20 6f 66 20 74 68 65 20 73 65  ddress of the se
13d20 6c 65 63 74 2d 41 20 63 6f 72 6f 75 74 69 6e 65  lect-A coroutine
13d30 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 53 65   */.  int addrSe
13d40 6c 65 63 74 42 3b 20 20 20 20 20 20 2f 2a 20 41  lectB;      /* A
13d50 64 64 72 65 73 73 20 6f 66 20 74 68 65 20 73 65  ddress of the se
13d60 6c 65 63 74 2d 42 20 63 6f 72 6f 75 74 69 6e 65  lect-B coroutine
13d70 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 4f 75 74   */.  int regOut
13d80 41 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41  A;          /* A
13d90 64 64 72 65 73 73 20 72 65 67 69 73 74 65 72 20  ddress register 
13da0 66 6f 72 20 74 68 65 20 6f 75 74 70 75 74 2d 41  for the output-A
13db0 20 73 75 62 72 6f 75 74 69 6e 65 20 2a 2f 0a 20   subroutine */. 
13dc0 20 69 6e 74 20 72 65 67 4f 75 74 42 3b 20 20 20   int regOutB;   
13dd0 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73         /* Addres
13de0 73 20 72 65 67 69 73 74 65 72 20 66 6f 72 20 74  s register for t
13df0 68 65 20 6f 75 74 70 75 74 2d 42 20 73 75 62 72  he output-B subr
13e00 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20  outine */.  int 
13e10 61 64 64 72 4f 75 74 41 3b 20 20 20 20 20 20 20  addrOutA;       
13e20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20    /* Address of 
13e30 74 68 65 20 6f 75 74 70 75 74 2d 41 20 73 75 62  the output-A sub
13e40 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 69 6e 74  routine */.  int
13e50 20 61 64 64 72 4f 75 74 42 3b 20 20 20 20 20 20   addrOutB;      
13e60 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66     /* Address of
13e70 20 74 68 65 20 6f 75 74 70 75 74 2d 42 20 73 75   the output-B su
13e80 62 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 69 6e  broutine */.  in
13e90 74 20 61 64 64 72 45 6f 66 41 3b 20 20 20 20 20  t addrEofA;     
13ea0 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f      /* Address o
13eb0 66 20 74 68 65 20 73 65 6c 65 63 74 2d 41 2d 65  f the select-A-e
13ec0 78 68 61 75 73 74 65 64 20 73 75 62 72 6f 75 74  xhausted subrout
13ed0 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64  ine */.  int add
13ee0 72 45 6f 66 42 3b 20 20 20 20 20 20 20 20 20 2f  rEofB;         /
13ef0 2a 20 41 64 64 72 65 73 73 20 6f 66 20 74 68 65  * Address of the
13f00 20 73 65 6c 65 63 74 2d 42 2d 65 78 68 61 75 73   select-B-exhaus
13f10 74 65 64 20 73 75 62 72 6f 75 74 69 6e 65 20 2a  ted subroutine *
13f20 2f 0a 20 20 69 6e 74 20 61 64 64 72 41 6c 74 42  /.  int addrAltB
13f30 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64  ;         /* Add
13f40 72 65 73 73 20 6f 66 20 74 68 65 20 41 3c 42 20  ress of the A<B 
13f50 73 75 62 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20  subroutine */.  
13f60 69 6e 74 20 61 64 64 72 41 65 71 42 3b 20 20 20  int addrAeqB;   
13f70 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73        /* Address
13f80 20 6f 66 20 74 68 65 20 41 3d 3d 42 20 73 75 62   of the A==B sub
13f90 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 69 6e 74  routine */.  int
13fa0 20 61 64 64 72 41 67 74 42 3b 20 20 20 20 20 20   addrAgtB;      
13fb0 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66     /* Address of
13fc0 20 74 68 65 20 41 3e 42 20 73 75 62 72 6f 75 74   the A>B subrout
13fd0 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67  ine */.  int reg
13fe0 4c 69 6d 69 74 41 3b 20 20 20 20 20 20 20 20 2f  LimitA;        /
13ff0 2a 20 4c 69 6d 69 74 20 72 65 67 69 73 74 65 72  * Limit register
14000 20 66 6f 72 20 73 65 6c 65 63 74 2d 41 20 2a 2f   for select-A */
14010 0a 20 20 69 6e 74 20 72 65 67 4c 69 6d 69 74 42  .  int regLimitB
14020 3b 20 20 20 20 20 20 20 20 2f 2a 20 4c 69 6d 69  ;        /* Limi
14030 74 20 72 65 67 69 73 74 65 72 20 66 6f 72 20 73  t register for s
14040 65 6c 65 63 74 2d 41 20 2a 2f 0a 20 20 69 6e 74  elect-A */.  int
14050 20 72 65 67 50 72 65 76 3b 20 20 20 20 20 20 20   regPrev;       
14060 20 20 20 2f 2a 20 41 20 72 61 6e 67 65 20 6f 66     /* A range of
14070 20 72 65 67 69 73 74 65 72 73 20 74 6f 20 68 6f   registers to ho
14080 6c 64 20 70 72 65 76 69 6f 75 73 20 6f 75 74 70  ld previous outp
14090 75 74 20 2a 2f 0a 20 20 69 6e 74 20 73 61 76 65  ut */.  int save
140a0 64 4c 69 6d 69 74 3b 20 20 20 20 20 20 20 2f 2a  dLimit;       /*
140b0 20 53 61 76 65 64 20 76 61 6c 75 65 20 6f 66 20   Saved value of 
140c0 70 2d 3e 69 4c 69 6d 69 74 20 2a 2f 0a 20 20 69  p->iLimit */.  i
140d0 6e 74 20 73 61 76 65 64 4f 66 66 73 65 74 3b 20  nt savedOffset; 
140e0 20 20 20 20 20 2f 2a 20 53 61 76 65 64 20 76 61       /* Saved va
140f0 6c 75 65 20 6f 66 20 70 2d 3e 69 4f 66 66 73 65  lue of p->iOffse
14100 74 20 2a 2f 0a 20 20 69 6e 74 20 6c 61 62 65 6c  t */.  int label
14110 43 6d 70 72 3b 20 20 20 20 20 20 20 20 2f 2a 20  Cmpr;        /* 
14120 4c 61 62 65 6c 20 66 6f 72 20 74 68 65 20 73 74  Label for the st
14130 61 72 74 20 6f 66 20 74 68 65 20 6d 65 72 67 65  art of the merge
14140 20 61 6c 67 6f 72 69 74 68 6d 20 2a 2f 0a 20 20   algorithm */.  
14150 69 6e 74 20 6c 61 62 65 6c 45 6e 64 3b 20 20 20  int labelEnd;   
14160 20 20 20 20 20 20 2f 2a 20 4c 61 62 65 6c 20 66        /* Label f
14170 6f 72 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68  or the end of th
14180 65 20 6f 76 65 72 61 6c 6c 20 53 45 4c 45 43 54  e overall SELECT
14190 20 73 74 6d 74 20 2a 2f 0a 20 20 69 6e 74 20 6a   stmt */.  int j
141a0 31 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  1;              
141b0 20 2f 2a 20 4a 75 6d 70 20 69 6e 73 74 72 75 63   /* Jump instruc
141c0 74 69 6f 6e 73 20 74 68 61 74 20 67 65 74 20 72  tions that get r
141d0 65 74 61 72 67 65 74 74 65 64 20 2a 2f 0a 20 20  etargetted */.  
141e0 69 6e 74 20 6f 70 3b 20 20 20 20 20 20 20 20 20  int op;         
141f0 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20 6f 66 20        /* One of 
14200 54 4b 5f 41 4c 4c 2c 20 54 4b 5f 55 4e 49 4f 4e  TK_ALL, TK_UNION
14210 2c 20 54 4b 5f 45 58 43 45 50 54 2c 20 54 4b 5f  , TK_EXCEPT, TK_
14220 49 4e 54 45 52 53 45 43 54 20 2a 2f 0a 20 20 4b  INTERSECT */.  K
14230 65 79 49 6e 66 6f 20 2a 70 4b 65 79 44 75 70 3b  eyInfo *pKeyDup;
14240 20 20 20 20 20 2f 2a 20 43 6f 6d 70 61 72 69 73       /* Comparis
14250 6f 6e 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66  on information f
14260 6f 72 20 64 75 70 6c 69 63 61 74 65 20 72 65 6d  or duplicate rem
14270 6f 76 61 6c 20 2a 2f 0a 20 20 4b 65 79 49 6e 66  oval */.  KeyInf
14280 6f 20 2a 70 4b 65 79 4d 65 72 67 65 3b 20 20 20  o *pKeyMerge;   
14290 2f 2a 20 43 6f 6d 70 61 72 69 73 6f 6e 20 69 6e  /* Comparison in
142a0 66 6f 72 6d 61 74 69 6f 6e 20 66 6f 72 20 6d 65  formation for me
142b0 72 67 69 6e 67 20 72 6f 77 73 20 2a 2f 0a 20 20  rging rows */.  
142c0 73 71 6c 69 74 65 33 20 2a 64 62 3b 20 20 20 20  sqlite3 *db;    
142d0 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73        /* Databas
142e0 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a  e connection */.
142f0 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4f 72 64    ExprList *pOrd
14300 65 72 42 79 3b 20 20 20 2f 2a 20 54 68 65 20 4f  erBy;   /* The O
14310 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 2a  RDER BY clause *
14320 2f 0a 20 20 69 6e 74 20 6e 4f 72 64 65 72 42 79  /.  int nOrderBy
14330 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d  ;         /* Num
14340 62 65 72 20 6f 66 20 74 65 72 6d 73 20 69 6e 20  ber of terms in 
14350 74 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61  the ORDER BY cla
14360 75 73 65 20 2a 2f 0a 20 20 69 6e 74 20 2a 61 50  use */.  int *aP
14370 65 72 6d 75 74 65 3b 20 20 20 20 20 20 20 20 2f  ermute;        /
14380 2a 20 4d 61 70 70 69 6e 67 20 66 72 6f 6d 20 4f  * Mapping from O
14390 52 44 45 52 20 42 59 20 74 65 72 6d 73 20 74 6f  RDER BY terms to
143a0 20 72 65 73 75 6c 74 20 73 65 74 20 63 6f 6c 75   result set colu
143b0 6d 6e 73 20 2a 2f 0a 20 20 75 38 20 4e 6f 74 55  mns */.  u8 NotU
143c0 73 65 64 3b 20 20 20 20 20 20 20 20 20 20 20 2f  sed;           /
143d0 2a 20 44 75 6d 6d 79 20 76 61 72 69 61 62 6c 65  * Dummy variable
143e0 73 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20  s */..  assert( 
143f0 70 2d 3e 70 4f 72 64 65 72 42 79 21 3d 30 20 29  p->pOrderBy!=0 )
14400 3b 0a 20 20 64 62 20 3d 20 70 50 61 72 73 65 2d  ;.  db = pParse-
14410 3e 64 62 3b 0a 20 20 76 20 3d 20 70 50 61 72 73  >db;.  v = pPars
14420 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69 66 28 20  e->pVdbe;.  if( 
14430 76 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51  v==0 ) return SQ
14440 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 6c 61  LITE_NOMEM;.  la
14450 62 65 6c 45 6e 64 20 3d 20 73 71 6c 69 74 65 33  belEnd = sqlite3
14460 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29  VdbeMakeLabel(v)
14470 3b 0a 20 20 6c 61 62 65 6c 43 6d 70 72 20 3d 20  ;.  labelCmpr = 
14480 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c  sqlite3VdbeMakeL
14490 61 62 65 6c 28 76 29 3b 0a 0a 0a 20 20 2f 2a 20  abel(v);...  /* 
144a0 50 61 74 63 68 20 75 70 20 74 68 65 20 4f 52 44  Patch up the ORD
144b0 45 52 20 42 59 20 63 6c 61 75 73 65 0a 20 20 2a  ER BY clause.  *
144c0 2f 0a 20 20 6f 70 20 3d 20 70 2d 3e 6f 70 3b 20  /.  op = p->op; 
144d0 20 0a 20 20 70 50 72 69 6f 72 20 3d 20 70 2d 3e   .  pPrior = p->
144e0 70 50 72 69 6f 72 3b 0a 20 20 61 73 73 65 72 74  pPrior;.  assert
144f0 28 20 70 50 72 69 6f 72 2d 3e 70 4f 72 64 65 72  ( pPrior->pOrder
14500 42 79 3d 3d 30 20 29 3b 0a 20 20 70 4f 72 64 65  By==0 );.  pOrde
14510 72 42 79 20 3d 20 70 2d 3e 70 4f 72 64 65 72 42  rBy = p->pOrderB
14520 79 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4f 72  y;.  assert( pOr
14530 64 65 72 42 79 20 29 3b 0a 20 20 69 66 28 20 70  derBy );.  if( p
14540 72 6f 63 65 73 73 43 6f 6d 70 6f 75 6e 64 4f 72  rocessCompoundOr
14550 64 65 72 42 79 28 70 50 61 72 73 65 2c 20 70 29  derBy(pParse, p)
14560 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
14570 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d  QLITE_ERROR;.  }
14580 0a 20 20 6e 4f 72 64 65 72 42 79 20 3d 20 70 4f  .  nOrderBy = pO
14590 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 3b 0a 0a  rderBy->nExpr;..
145a0 20 20 2f 2a 20 46 6f 72 20 6f 70 65 72 61 74 6f    /* For operato
145b0 72 73 20 6f 74 68 65 72 20 74 68 61 6e 20 55 4e  rs other than UN
145c0 49 4f 4e 20 41 4c 4c 20 77 65 20 68 61 76 65 20  ION ALL we have 
145d0 74 6f 20 6d 61 6b 65 20 73 75 72 65 20 74 68 61  to make sure tha
145e0 74 0a 20 20 2a 2a 20 74 68 65 20 4f 52 44 45 52  t.  ** the ORDER
145f0 20 42 59 20 63 6c 61 75 73 65 20 63 6f 76 65 72   BY clause cover
14600 73 20 65 76 65 72 79 20 74 65 72 6d 20 6f 66 20  s every term of 
14610 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 2e 20  the result set. 
14620 20 41 64 64 0a 20 20 2a 2a 20 74 65 72 6d 73 20   Add.  ** terms 
14630 74 6f 20 74 68 65 20 4f 52 44 45 52 20 42 59 20  to the ORDER BY 
14640 63 6c 61 75 73 65 20 61 73 20 6e 65 63 65 73 73  clause as necess
14650 61 72 79 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ary..  */.  if( 
14660 6f 70 21 3d 54 4b 5f 41 4c 4c 20 29 7b 0a 20 20  op!=TK_ALL ){.  
14670 20 20 66 6f 72 28 69 3d 31 3b 20 64 62 2d 3e 6d    for(i=1; db->m
14680 61 6c 6c 6f 63 46 61 69 6c 65 64 3d 3d 30 20 26  allocFailed==0 &
14690 26 20 69 3c 3d 70 2d 3e 70 45 4c 69 73 74 2d 3e  & i<=p->pEList->
146a0 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20  nExpr; i++){.   
146b0 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 6e 4f     for(j=0; j<nO
146c0 72 64 65 72 42 79 3b 20 6a 2b 2b 29 7b 0a 20 20  rderBy; j++){.  
146d0 20 20 20 20 20 20 45 78 70 72 20 2a 70 54 65 72        Expr *pTer
146e0 6d 20 3d 20 70 4f 72 64 65 72 42 79 2d 3e 61 5b  m = pOrderBy->a[
146f0 6a 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 20 20  j].pExpr;.      
14700 20 20 61 73 73 65 72 74 28 20 70 54 65 72 6d 2d    assert( pTerm-
14710 3e 6f 70 3d 3d 54 4b 5f 49 4e 54 45 47 45 52 20  >op==TK_INTEGER 
14720 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  );.        asser
14730 74 28 20 28 70 54 65 72 6d 2d 3e 66 6c 61 67 73  t( (pTerm->flags
14740 20 26 20 45 50 5f 49 6e 74 56 61 6c 75 65 29 21   & EP_IntValue)!
14750 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66  =0 );.        if
14760 28 20 70 54 65 72 6d 2d 3e 69 54 61 62 6c 65 3d  ( pTerm->iTable=
14770 3d 69 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20  =i ) break;.    
14780 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 6a 3d    }.      if( j=
14790 3d 6e 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20  =nOrderBy ){.   
147a0 20 20 20 20 20 45 78 70 72 20 2a 70 4e 65 77 20       Expr *pNew 
147b0 3d 20 73 71 6c 69 74 65 33 50 45 78 70 72 28 70  = sqlite3PExpr(p
147c0 50 61 72 73 65 2c 20 54 4b 5f 49 4e 54 45 47 45  Parse, TK_INTEGE
147d0 52 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20  R, 0, 0, 0);.   
147e0 20 20 20 20 20 69 66 28 20 70 4e 65 77 3d 3d 30       if( pNew==0
147f0 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45   ) return SQLITE
14800 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 20 20  _NOMEM;.        
14810 70 4e 65 77 2d 3e 66 6c 61 67 73 20 7c 3d 20 45  pNew->flags |= E
14820 50 5f 49 6e 74 56 61 6c 75 65 3b 0a 20 20 20 20  P_IntValue;.    
14830 20 20 20 20 70 4e 65 77 2d 3e 69 54 61 62 6c 65      pNew->iTable
14840 20 3d 20 69 3b 0a 20 20 20 20 20 20 20 20 70 4f   = i;.        pO
14850 72 64 65 72 42 79 20 3d 20 73 71 6c 69 74 65 33  rderBy = sqlite3
14860 45 78 70 72 4c 69 73 74 41 70 70 65 6e 64 28 70  ExprListAppend(p
14870 50 61 72 73 65 2c 20 70 4f 72 64 65 72 42 79 2c  Parse, pOrderBy,
14880 20 70 4e 65 77 2c 20 30 29 3b 0a 20 20 20 20 20   pNew, 0);.     
14890 20 20 20 6e 4f 72 64 65 72 42 79 2b 2b 3b 0a 20     nOrderBy++;. 
148a0 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
148b0 0a 0a 20 20 2f 2a 20 43 6f 6d 70 75 74 65 20 74  ..  /* Compute t
148c0 68 65 20 63 6f 6d 70 61 72 69 73 6f 6e 20 70 65  he comparison pe
148d0 72 6d 75 74 61 74 69 6f 6e 20 61 6e 64 20 6b 65  rmutation and ke
148e0 79 69 6e 66 6f 20 74 68 61 74 20 69 73 20 75 73  yinfo that is us
148f0 65 64 20 77 69 74 68 0a 20 20 2a 2a 20 74 68 65  ed with.  ** the
14900 20 70 65 72 6d 75 74 61 74 69 6f 6e 20 69 6e 20   permutation in 
14910 6f 72 64 65 72 20 74 6f 20 63 6f 6d 70 61 72 69  order to compari
14920 73 6f 6e 73 20 74 6f 20 64 65 74 65 72 6d 69 6e  sons to determin
14930 65 20 69 66 20 74 68 65 20 6e 65 78 74 0a 20 20  e if the next.  
14940 2a 2a 20 72 6f 77 20 6f 66 20 72 65 73 75 6c 74  ** row of result
14950 73 20 63 6f 6d 65 73 20 66 72 6f 6d 20 73 65 6c  s comes from sel
14960 65 63 74 41 20 6f 72 20 73 65 6c 65 63 74 42 2e  ectA or selectB.
14970 20 20 41 6c 73 6f 20 61 64 64 20 65 78 70 6c 69    Also add expli
14980 63 69 74 0a 20 20 2a 2a 20 63 6f 6c 6c 61 74 69  cit.  ** collati
14990 6f 6e 73 20 74 6f 20 74 68 65 20 4f 52 44 45 52  ons to the ORDER
149a0 20 42 59 20 63 6c 61 75 73 65 20 74 65 72 6d 73   BY clause terms
149b0 20 73 6f 20 74 68 61 74 20 77 68 65 6e 20 74 68   so that when th
149c0 65 20 73 75 62 71 75 65 72 69 65 73 0a 20 20 2a  e subqueries.  *
149d0 2a 20 74 6f 20 74 68 65 20 72 69 67 68 74 20 61  * to the right a
149e0 6e 64 20 74 68 65 20 6c 65 66 74 20 61 72 65 20  nd the left are 
149f0 65 76 61 6c 75 61 74 65 64 2c 20 74 68 65 79 20  evaluated, they 
14a00 75 73 65 20 74 68 65 20 63 6f 72 72 65 63 74 0a  use the correct.
14a10 20 20 2a 2a 20 63 6f 6c 6c 61 74 69 6f 6e 2e 0a    ** collation..
14a20 20 20 2a 2f 0a 20 20 61 50 65 72 6d 75 74 65 20    */.  aPermute 
14a30 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f  = sqlite3DbMallo
14a40 63 52 61 77 28 64 62 2c 20 73 69 7a 65 6f 66 28  cRaw(db, sizeof(
14a50 69 6e 74 29 2a 6e 4f 72 64 65 72 42 79 29 3b 0a  int)*nOrderBy);.
14a60 20 20 69 66 28 20 61 50 65 72 6d 75 74 65 20 29    if( aPermute )
14a70 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  {.    for(i=0; i
14a80 3c 6e 4f 72 64 65 72 42 79 3b 20 69 2b 2b 29 7b  <nOrderBy; i++){
14a90 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 54 65  .      Expr *pTe
14aa0 72 6d 20 3d 20 70 4f 72 64 65 72 42 79 2d 3e 61  rm = pOrderBy->a
14ab0 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 20  [i].pExpr;.     
14ac0 20 61 73 73 65 72 74 28 20 70 54 65 72 6d 2d 3e   assert( pTerm->
14ad0 6f 70 3d 3d 54 4b 5f 49 4e 54 45 47 45 52 20 29  op==TK_INTEGER )
14ae0 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
14af0 28 70 54 65 72 6d 2d 3e 66 6c 61 67 73 20 26 20  (pTerm->flags & 
14b00 45 50 5f 49 6e 74 56 61 6c 75 65 29 21 3d 30 20  EP_IntValue)!=0 
14b10 29 3b 0a 20 20 20 20 20 20 61 50 65 72 6d 75 74  );.      aPermut
14b20 65 5b 69 5d 20 3d 20 70 54 65 72 6d 2d 3e 69 54  e[i] = pTerm->iT
14b30 61 62 6c 65 2d 31 3b 0a 20 20 20 20 20 20 61 73  able-1;.      as
14b40 73 65 72 74 28 20 61 50 65 72 6d 75 74 65 5b 69  sert( aPermute[i
14b50 5d 3e 3d 30 20 26 26 20 61 50 65 72 6d 75 74 65  ]>=0 && aPermute
14b60 5b 69 5d 3c 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e  [i]<p->pEList->n
14b70 45 78 70 72 20 29 3b 0a 20 20 20 20 7d 0a 20 20  Expr );.    }.  
14b80 20 20 70 4b 65 79 4d 65 72 67 65 20 3d 0a 20 20    pKeyMerge =.  
14b90 20 20 20 20 73 71 6c 69 74 65 33 44 62 4d 61 6c      sqlite3DbMal
14ba0 6c 6f 63 52 61 77 28 64 62 2c 20 73 69 7a 65 6f  locRaw(db, sizeo
14bb0 66 28 2a 70 4b 65 79 4d 65 72 67 65 29 2b 6e 4f  f(*pKeyMerge)+nO
14bc0 72 64 65 72 42 79 2a 28 73 69 7a 65 6f 66 28 43  rderBy*(sizeof(C
14bd0 6f 6c 6c 53 65 71 2a 29 2b 31 29 29 3b 0a 20 20  ollSeq*)+1));.  
14be0 20 20 69 66 28 20 70 4b 65 79 4d 65 72 67 65 20    if( pKeyMerge 
14bf0 29 7b 0a 20 20 20 20 20 20 70 4b 65 79 4d 65 72  ){.      pKeyMer
14c00 67 65 2d 3e 61 53 6f 72 74 4f 72 64 65 72 20 3d  ge->aSortOrder =
14c10 20 28 75 38 2a 29 26 70 4b 65 79 4d 65 72 67 65   (u8*)&pKeyMerge
14c20 2d 3e 61 43 6f 6c 6c 5b 6e 4f 72 64 65 72 42 79  ->aColl[nOrderBy
14c30 5d 3b 0a 20 20 20 20 20 20 70 4b 65 79 4d 65 72  ];.      pKeyMer
14c40 67 65 2d 3e 6e 46 69 65 6c 64 20 3d 20 6e 4f 72  ge->nField = nOr
14c50 64 65 72 42 79 3b 0a 20 20 20 20 20 20 70 4b 65  derBy;.      pKe
14c60 79 4d 65 72 67 65 2d 3e 65 6e 63 20 3d 20 45 4e  yMerge->enc = EN
14c70 43 28 64 62 29 3b 0a 20 20 20 20 20 20 66 6f 72  C(db);.      for
14c80 28 69 3d 30 3b 20 69 3c 6e 4f 72 64 65 72 42 79  (i=0; i<nOrderBy
14c90 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; i++){.        
14ca0 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 3b 0a  CollSeq *pColl;.
14cb0 20 20 20 20 20 20 20 20 45 78 70 72 20 2a 70 54          Expr *pT
14cc0 65 72 6d 20 3d 20 70 4f 72 64 65 72 42 79 2d 3e  erm = pOrderBy->
14cd0 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20  a[i].pExpr;.    
14ce0 20 20 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 66      if( pTerm->f
14cf0 6c 61 67 73 20 26 20 45 50 5f 45 78 70 43 6f 6c  lags & EP_ExpCol
14d00 6c 61 74 65 20 29 7b 0a 20 20 20 20 20 20 20 20  late ){.        
14d10 20 20 70 43 6f 6c 6c 20 3d 20 70 54 65 72 6d 2d    pColl = pTerm-
14d20 3e 70 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 20 20  >pColl;.        
14d30 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
14d40 20 70 43 6f 6c 6c 20 3d 20 6d 75 6c 74 69 53 65   pColl = multiSe
14d50 6c 65 63 74 43 6f 6c 6c 53 65 71 28 70 50 61 72  lectCollSeq(pPar
14d60 73 65 2c 20 70 2c 20 61 50 65 72 6d 75 74 65 5b  se, p, aPermute[
14d70 69 5d 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70  i]);.          p
14d80 54 65 72 6d 2d 3e 66 6c 61 67 73 20 7c 3d 20 45  Term->flags |= E
14d90 50 5f 45 78 70 43 6f 6c 6c 61 74 65 3b 0a 20 20  P_ExpCollate;.  
14da0 20 20 20 20 20 20 20 20 70 54 65 72 6d 2d 3e 70          pTerm->p
14db0 43 6f 6c 6c 20 3d 20 70 43 6f 6c 6c 3b 0a 20 20  Coll = pColl;.  
14dc0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
14dd0 70 4b 65 79 4d 65 72 67 65 2d 3e 61 43 6f 6c 6c  pKeyMerge->aColl
14de0 5b 69 5d 20 3d 20 70 43 6f 6c 6c 3b 0a 20 20 20  [i] = pColl;.   
14df0 20 20 20 20 20 70 4b 65 79 4d 65 72 67 65 2d 3e       pKeyMerge->
14e00 61 53 6f 72 74 4f 72 64 65 72 5b 69 5d 20 3d 20  aSortOrder[i] = 
14e10 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 73  pOrderBy->a[i].s
14e20 6f 72 74 4f 72 64 65 72 3b 0a 20 20 20 20 20 20  ortOrder;.      
14e30 7d 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b  }.    }.  }else{
14e40 0a 20 20 20 20 70 4b 65 79 4d 65 72 67 65 20 3d  .    pKeyMerge =
14e50 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 65   0;.  }..  /* Re
14e60 61 74 74 61 63 68 20 74 68 65 20 4f 52 44 45 52  attach the ORDER
14e70 20 42 59 20 63 6c 61 75 73 65 20 74 6f 20 74 68   BY clause to th
14e80 65 20 71 75 65 72 79 2e 0a 20 20 2a 2f 0a 20 20  e query..  */.  
14e90 70 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20 70 4f  p->pOrderBy = pO
14ea0 72 64 65 72 42 79 3b 0a 20 20 70 50 72 69 6f 72  rderBy;.  pPrior
14eb0 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20 73 71 6c  ->pOrderBy = sql
14ec0 69 74 65 33 45 78 70 72 4c 69 73 74 44 75 70 28  ite3ExprListDup(
14ed0 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 4f 72 64  pParse->db, pOrd
14ee0 65 72 42 79 29 3b 0a 0a 20 20 2f 2a 20 41 6c 6c  erBy);..  /* All
14ef0 6f 63 61 74 65 20 61 20 72 61 6e 67 65 20 6f 66  ocate a range of
14f00 20 74 65 6d 70 6f 72 61 72 79 20 72 65 67 69 73   temporary regis
14f10 74 65 72 73 20 61 6e 64 20 74 68 65 20 4b 65 79  ters and the Key
14f20 49 6e 66 6f 20 6e 65 65 64 65 64 0a 20 20 2a 2a  Info needed.  **
14f30 20 66 6f 72 20 74 68 65 20 6c 6f 67 69 63 20 74   for the logic t
14f40 68 61 74 20 72 65 6d 6f 76 65 73 20 64 75 70 6c  hat removes dupl
14f50 69 63 61 74 65 20 72 65 73 75 6c 74 20 72 6f 77  icate result row
14f60 73 20 77 68 65 6e 20 74 68 65 0a 20 20 2a 2a 20  s when the.  ** 
14f70 6f 70 65 72 61 74 6f 72 20 69 73 20 55 4e 49 4f  operator is UNIO
14f80 4e 2c 20 45 58 43 45 50 54 2c 20 6f 72 20 49 4e  N, EXCEPT, or IN
14f90 54 45 52 53 45 43 54 20 28 62 75 74 20 6e 6f 74  TERSECT (but not
14fa0 20 55 4e 49 4f 4e 20 41 4c 4c 29 2e 0a 20 20 2a   UNION ALL)..  *
14fb0 2f 0a 20 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 41  /.  if( op==TK_A
14fc0 4c 4c 20 29 7b 0a 20 20 20 20 72 65 67 50 72 65  LL ){.    regPre
14fd0 76 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a  v = 0;.  }else{.
14fe0 20 20 20 20 69 6e 74 20 6e 45 78 70 72 20 3d 20      int nExpr = 
14ff0 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72  p->pEList->nExpr
15000 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 6e 4f  ;.    assert( nO
15010 72 64 65 72 42 79 3e 3d 6e 45 78 70 72 20 29 3b  rderBy>=nExpr );
15020 0a 20 20 20 20 72 65 67 50 72 65 76 20 3d 20 73  .    regPrev = s
15030 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 61 6e  qlite3GetTempRan
15040 67 65 28 70 50 61 72 73 65 2c 20 6e 45 78 70 72  ge(pParse, nExpr
15050 2b 31 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  +1);.    sqlite3
15060 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
15070 5f 49 6e 74 65 67 65 72 2c 20 30 2c 20 72 65 67  _Integer, 0, reg
15080 50 72 65 76 29 3b 0a 20 20 20 20 70 4b 65 79 44  Prev);.    pKeyD
15090 75 70 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61  up = sqlite3DbMa
150a0 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 0a 20 20 20  llocZero(db,.   
150b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73                 s
150c0 69 7a 65 6f 66 28 2a 70 4b 65 79 44 75 70 29 20  izeof(*pKeyDup) 
150d0 2b 20 6e 45 78 70 72 2a 28 73 69 7a 65 6f 66 28  + nExpr*(sizeof(
150e0 43 6f 6c 6c 53 65 71 2a 29 2b 31 29 20 29 3b 0a  CollSeq*)+1) );.
150f0 20 20 20 20 69 66 28 20 70 4b 65 79 44 75 70 20      if( pKeyDup 
15100 29 7b 0a 20 20 20 20 20 20 70 4b 65 79 44 75 70  ){.      pKeyDup
15110 2d 3e 61 53 6f 72 74 4f 72 64 65 72 20 3d 20 28  ->aSortOrder = (
15120 75 38 2a 29 26 70 4b 65 79 44 75 70 2d 3e 61 43  u8*)&pKeyDup->aC
15130 6f 6c 6c 5b 6e 45 78 70 72 5d 3b 0a 20 20 20 20  oll[nExpr];.    
15140 20 20 70 4b 65 79 44 75 70 2d 3e 6e 46 69 65 6c    pKeyDup->nFiel
15150 64 20 3d 20 6e 45 78 70 72 3b 0a 20 20 20 20 20  d = nExpr;.     
15160 20 70 4b 65 79 44 75 70 2d 3e 65 6e 63 20 3d 20   pKeyDup->enc = 
15170 45 4e 43 28 64 62 29 3b 0a 20 20 20 20 20 20 66  ENC(db);.      f
15180 6f 72 28 69 3d 30 3b 20 69 3c 6e 45 78 70 72 3b  or(i=0; i<nExpr;
15190 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 70   i++){.        p
151a0 4b 65 79 44 75 70 2d 3e 61 43 6f 6c 6c 5b 69 5d  KeyDup->aColl[i]
151b0 20 3d 20 6d 75 6c 74 69 53 65 6c 65 63 74 43 6f   = multiSelectCo
151c0 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70 2c  llSeq(pParse, p,
151d0 20 69 29 3b 0a 20 20 20 20 20 20 20 20 70 4b 65   i);.        pKe
151e0 79 44 75 70 2d 3e 61 53 6f 72 74 4f 72 64 65 72  yDup->aSortOrder
151f0 5b 69 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d  [i] = 0;.      }
15200 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 0a 20 20 2f  .    }.  }. .  /
15210 2a 20 53 65 70 61 72 61 74 65 20 74 68 65 20 6c  * Separate the l
15220 65 66 74 20 61 6e 64 20 74 68 65 20 72 69 67 68  eft and the righ
15230 74 20 71 75 65 72 79 20 66 72 6f 6d 20 6f 6e 65  t query from one
15240 20 61 6e 6f 74 68 65 72 0a 20 20 2a 2f 0a 20 20   another.  */.  
15250 70 2d 3e 70 50 72 69 6f 72 20 3d 20 30 3b 0a 20  p->pPrior = 0;. 
15260 20 70 50 72 69 6f 72 2d 3e 70 52 69 67 68 74 6d   pPrior->pRightm
15270 6f 73 74 20 3d 20 30 3b 0a 20 20 70 72 6f 63 65  ost = 0;.  proce
15280 73 73 4f 72 64 65 72 47 72 6f 75 70 42 79 28 70  ssOrderGroupBy(p
15290 50 61 72 73 65 2c 20 70 2c 20 70 2d 3e 70 4f 72  Parse, p, p->pOr
152a0 64 65 72 42 79 2c 20 31 2c 20 26 4e 6f 74 55 73  derBy, 1, &NotUs
152b0 65 64 29 3b 0a 20 20 69 66 28 20 70 50 72 69 6f  ed);.  if( pPrio
152c0 72 2d 3e 70 50 72 69 6f 72 3d 3d 30 20 29 7b 0a  r->pPrior==0 ){.
152d0 20 20 20 20 70 72 6f 63 65 73 73 4f 72 64 65 72      processOrder
152e0 47 72 6f 75 70 42 79 28 70 50 61 72 73 65 2c 20  GroupBy(pParse, 
152f0 70 50 72 69 6f 72 2c 20 70 50 72 69 6f 72 2d 3e  pPrior, pPrior->
15300 70 4f 72 64 65 72 42 79 2c 20 31 2c 20 26 4e 6f  pOrderBy, 1, &No
15310 74 55 73 65 64 29 3b 0a 20 20 7d 0a 0a 20 20 2f  tUsed);.  }..  /
15320 2a 20 43 6f 6d 70 75 74 65 20 74 68 65 20 6c 69  * Compute the li
15330 6d 69 74 20 72 65 67 69 73 74 65 72 73 20 2a 2f  mit registers */
15340 0a 20 20 63 6f 6d 70 75 74 65 4c 69 6d 69 74 52  .  computeLimitR
15350 65 67 69 73 74 65 72 73 28 70 50 61 72 73 65 2c  egisters(pParse,
15360 20 70 2c 20 6c 61 62 65 6c 45 6e 64 29 3b 0a 20   p, labelEnd);. 
15370 20 69 66 28 20 70 2d 3e 69 4c 69 6d 69 74 20 26   if( p->iLimit &
15380 26 20 6f 70 3d 3d 54 4b 5f 41 4c 4c 20 29 7b 0a  & op==TK_ALL ){.
15390 20 20 20 20 72 65 67 4c 69 6d 69 74 41 20 3d 20      regLimitA = 
153a0 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a  ++pParse->nMem;.
153b0 20 20 20 20 72 65 67 4c 69 6d 69 74 42 20 3d 20      regLimitB = 
153c0 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a  ++pParse->nMem;.
153d0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
153e0 64 64 4f 70 32 28 76 2c 20 4f 50 5f 43 6f 70 79  ddOp2(v, OP_Copy
153f0 2c 20 70 2d 3e 69 4f 66 66 73 65 74 20 3f 20 70  , p->iOffset ? p
15400 2d 3e 69 4f 66 66 73 65 74 2b 31 20 3a 20 70 2d  ->iOffset+1 : p-
15410 3e 69 4c 69 6d 69 74 2c 0a 20 20 20 20 20 20 20  >iLimit,.       
15420 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15430 20 20 20 20 20 20 20 20 20 20 20 72 65 67 4c 69             regLi
15440 6d 69 74 41 29 3b 0a 20 20 20 20 73 71 6c 69 74  mitA);.    sqlit
15450 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
15460 4f 50 5f 43 6f 70 79 2c 20 72 65 67 4c 69 6d 69  OP_Copy, regLimi
15470 74 41 2c 20 72 65 67 4c 69 6d 69 74 42 29 3b 0a  tA, regLimitB);.
15480 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65 67    }else{.    reg
15490 4c 69 6d 69 74 41 20 3d 20 72 65 67 4c 69 6d 69  LimitA = regLimi
154a0 74 42 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 73 71  tB = 0;.  }.  sq
154b0 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28  lite3ExprDelete(
154c0 70 2d 3e 70 4c 69 6d 69 74 29 3b 0a 20 20 70 2d  p->pLimit);.  p-
154d0 3e 70 4c 69 6d 69 74 20 3d 20 30 3b 0a 20 20 73  >pLimit = 0;.  s
154e0 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65  qlite3ExprDelete
154f0 28 70 2d 3e 70 4f 66 66 73 65 74 29 3b 0a 20 20  (p->pOffset);.  
15500 70 2d 3e 70 4f 66 66 73 65 74 20 3d 20 30 3b 0a  p->pOffset = 0;.
15510 0a 20 20 72 65 67 41 64 64 72 41 20 3d 20 2b 2b  .  regAddrA = ++
15520 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20  pParse->nMem;.  
15530 72 65 67 45 6f 66 41 20 3d 20 2b 2b 70 50 61 72  regEofA = ++pPar
15540 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 72 65 67 41  se->nMem;.  regA
15550 64 64 72 42 20 3d 20 2b 2b 70 50 61 72 73 65 2d  ddrB = ++pParse-
15560 3e 6e 4d 65 6d 3b 0a 20 20 72 65 67 45 6f 66 42  >nMem;.  regEofB
15570 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65   = ++pParse->nMe
15580 6d 3b 0a 20 20 72 65 67 4f 75 74 41 20 3d 20 2b  m;.  regOutA = +
15590 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20  +pParse->nMem;. 
155a0 20 72 65 67 4f 75 74 42 20 3d 20 2b 2b 70 50 61   regOutB = ++pPa
155b0 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 73 71 6c  rse->nMem;.  sql
155c0 69 74 65 33 53 65 6c 65 63 74 44 65 73 74 49 6e  ite3SelectDestIn
155d0 69 74 28 26 64 65 73 74 41 2c 20 53 52 54 5f 43  it(&destA, SRT_C
155e0 6f 72 6f 75 74 69 6e 65 2c 20 72 65 67 41 64 64  oroutine, regAdd
155f0 72 41 29 3b 0a 20 20 73 71 6c 69 74 65 33 53 65  rA);.  sqlite3Se
15600 6c 65 63 74 44 65 73 74 49 6e 69 74 28 26 64 65  lectDestInit(&de
15610 73 74 42 2c 20 53 52 54 5f 43 6f 72 6f 75 74 69  stB, SRT_Corouti
15620 6e 65 2c 20 72 65 67 41 64 64 72 42 29 3b 0a 0a  ne, regAddrB);..
15630 20 20 2f 2a 20 4a 75 6d 70 20 70 61 73 74 20 74    /* Jump past t
15640 68 65 20 76 61 72 69 6f 75 73 20 73 75 62 72 6f  he various subro
15650 75 74 69 6e 65 73 20 61 6e 64 20 63 6f 72 6f 75  utines and corou
15660 74 69 6e 65 73 20 74 6f 20 74 68 65 20 6d 61 69  tines to the mai
15670 6e 0a 20 20 2a 2a 20 6d 65 72 67 65 20 6c 6f 6f  n.  ** merge loo
15680 70 0a 20 20 2a 2f 0a 20 20 6a 31 20 3d 20 73 71  p.  */.  j1 = sq
15690 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 30 28  lite3VdbeAddOp0(
156a0 76 2c 20 4f 50 5f 47 6f 74 6f 29 3b 0a 20 20 61  v, OP_Goto);.  a
156b0 64 64 72 53 65 6c 65 63 74 41 20 3d 20 73 71 6c  ddrSelectA = sql
156c0 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41  ite3VdbeCurrentA
156d0 64 64 72 28 76 29 3b 0a 0a 0a 20 20 2f 2a 20 47  ddr(v);...  /* G
156e0 65 6e 65 72 61 74 65 20 61 20 63 6f 72 6f 75 74  enerate a corout
156f0 69 6e 65 20 74 6f 20 65 76 61 6c 75 61 74 65 20  ine to evaluate 
15700 74 68 65 20 53 45 4c 45 43 54 20 73 74 61 74 65  the SELECT state
15710 6d 65 6e 74 20 74 6f 20 74 68 65 0a 20 20 2a 2a  ment to the.  **
15720 20 6c 65 66 74 20 6f 66 20 74 68 65 20 63 6f 6d   left of the com
15730 70 6f 75 6e 64 20 6f 70 65 72 61 74 6f 72 20 2d  pound operator -
15740 20 74 68 65 20 22 41 22 20 73 65 6c 65 63 74 2e   the "A" select.
15750 0a 20 20 2a 2f 0a 20 20 56 64 62 65 4e 6f 6f 70  .  */.  VdbeNoop
15760 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 42 65 67  Comment((v, "Beg
15770 69 6e 20 63 6f 72 6f 75 74 69 6e 65 20 66 6f 72  in coroutine for
15780 20 6c 65 66 74 20 53 45 4c 45 43 54 22 29 29 3b   left SELECT"));
15790 0a 20 20 70 50 72 69 6f 72 2d 3e 69 4c 69 6d 69  .  pPrior->iLimi
157a0 74 20 3d 20 72 65 67 4c 69 6d 69 74 41 3b 0a 20  t = regLimitA;. 
157b0 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28 70   sqlite3Select(p
157c0 50 61 72 73 65 2c 20 70 50 72 69 6f 72 2c 20 26  Parse, pPrior, &
157d0 64 65 73 74 41 2c 20 30 2c 20 30 2c 20 30 29 3b  destA, 0, 0, 0);
157e0 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  .  sqlite3VdbeAd
157f0 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67  dOp2(v, OP_Integ
15800 65 72 2c 20 31 2c 20 72 65 67 45 6f 66 41 29 3b  er, 1, regEofA);
15810 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  .  sqlite3VdbeAd
15820 64 4f 70 31 28 76 2c 20 4f 50 5f 59 69 65 6c 64  dOp1(v, OP_Yield
15830 2c 20 72 65 67 41 64 64 72 41 29 3b 0a 20 20 56  , regAddrA);.  V
15840 64 62 65 4e 6f 6f 70 43 6f 6d 6d 65 6e 74 28 28  dbeNoopComment((
15850 76 2c 20 22 45 6e 64 20 63 6f 72 6f 75 74 69 6e  v, "End coroutin
15860 65 20 66 6f 72 20 6c 65 66 74 20 53 45 4c 45 43  e for left SELEC
15870 54 22 29 29 3b 0a 0a 20 20 2f 2a 20 47 65 6e 65  T"));..  /* Gene
15880 72 61 74 65 20 61 20 63 6f 72 6f 75 74 69 6e 65  rate a coroutine
15890 20 74 6f 20 65 76 61 6c 75 61 74 65 20 74 68 65   to evaluate the
158a0 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
158b0 74 20 6f 6e 20 0a 20 20 2a 2a 20 74 68 65 20 72  t on .  ** the r
158c0 69 67 68 74 20 2d 20 74 68 65 20 22 42 22 20 73  ight - the "B" s
158d0 65 6c 65 63 74 0a 20 20 2a 2f 0a 20 20 61 64 64  elect.  */.  add
158e0 72 53 65 6c 65 63 74 42 20 3d 20 73 71 6c 69 74  rSelectB = sqlit
158f0 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64  e3VdbeCurrentAdd
15900 72 28 76 29 3b 0a 20 20 56 64 62 65 4e 6f 6f 70  r(v);.  VdbeNoop
15910 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 42 65 67  Comment((v, "Beg
15920 69 6e 20 63 6f 72 6f 75 74 69 6e 65 20 66 6f 72  in coroutine for
15930 20 72 69 67 68 74 20 53 45 4c 45 43 54 22 29 29   right SELECT"))
15940 3b 0a 20 20 73 61 76 65 64 4c 69 6d 69 74 20 3d  ;.  savedLimit =
15950 20 70 2d 3e 69 4c 69 6d 69 74 3b 0a 20 20 73 61   p->iLimit;.  sa
15960 76 65 64 4f 66 66 73 65 74 20 3d 20 70 2d 3e 69  vedOffset = p->i
15970 4f 66 66 73 65 74 3b 0a 20 20 70 2d 3e 69 4c 69  Offset;.  p->iLi
15980 6d 69 74 20 3d 20 72 65 67 4c 69 6d 69 74 42 3b  mit = regLimitB;
15990 0a 20 20 70 2d 3e 69 4f 66 66 73 65 74 20 3d 20  .  p->iOffset = 
159a0 30 3b 20 20 0a 20 20 73 71 6c 69 74 65 33 53 65  0;  .  sqlite3Se
159b0 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70 2c 20  lect(pParse, p, 
159c0 26 64 65 73 74 42 2c 20 30 2c 20 30 2c 20 30 29  &destB, 0, 0, 0)
159d0 3b 0a 20 20 70 2d 3e 69 4c 69 6d 69 74 20 3d 20  ;.  p->iLimit = 
159e0 73 61 76 65 64 4c 69 6d 69 74 3b 0a 20 20 70 2d  savedLimit;.  p-
159f0 3e 69 4f 66 66 73 65 74 20 3d 20 73 61 76 65 64  >iOffset = saved
15a00 4f 66 66 73 65 74 3b 0a 20 20 73 71 6c 69 74 65  Offset;.  sqlite
15a10 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
15a20 50 5f 49 6e 74 65 67 65 72 2c 20 31 2c 20 72 65  P_Integer, 1, re
15a30 67 45 6f 66 42 29 3b 0a 20 20 73 71 6c 69 74 65  gEofB);.  sqlite
15a40 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f  3VdbeAddOp1(v, O
15a50 50 5f 59 69 65 6c 64 2c 20 72 65 67 41 64 64 72  P_Yield, regAddr
15a60 42 29 3b 0a 20 20 56 64 62 65 4e 6f 6f 70 43 6f  B);.  VdbeNoopCo
15a70 6d 6d 65 6e 74 28 28 76 2c 20 22 45 6e 64 20 63  mment((v, "End c
15a80 6f 72 6f 75 74 69 6e 65 20 66 6f 72 20 72 69 67  oroutine for rig
15a90 68 74 20 53 45 4c 45 43 54 22 29 29 3b 0a 0a 20  ht SELECT"));.. 
15aa0 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 61 20 73   /* Generate a s
15ab0 75 62 72 6f 75 74 69 6e 65 20 74 68 61 74 20 6f  ubroutine that o
15ac0 75 74 70 75 74 73 20 74 68 65 20 63 75 72 72 65  utputs the curre
15ad0 6e 74 20 72 6f 77 20 6f 66 20 74 68 65 20 41 0a  nt row of the A.
15ae0 20 20 2a 2a 20 73 65 6c 65 63 74 20 61 73 20 74    ** select as t
15af0 68 65 20 6e 65 78 74 20 6f 75 74 70 75 74 20 72  he next output r
15b00 6f 77 20 6f 66 20 74 68 65 20 63 6f 6d 70 6f 75  ow of the compou
15b10 6e 64 20 73 65 6c 65 63 74 2e 0a 20 20 2a 2f 0a  nd select..  */.
15b20 20 20 56 64 62 65 4e 6f 6f 70 43 6f 6d 6d 65 6e    VdbeNoopCommen
15b30 74 28 28 76 2c 20 22 4f 75 74 70 75 74 20 72 6f  t((v, "Output ro
15b40 75 74 69 6e 65 20 66 6f 72 20 41 22 29 29 3b 0a  utine for A"));.
15b50 20 20 61 64 64 72 4f 75 74 41 20 3d 20 67 65 6e    addrOutA = gen
15b60 65 72 61 74 65 4f 75 74 70 75 74 53 75 62 72 6f  erateOutputSubro
15b70 75 74 69 6e 65 28 70 50 61 72 73 65 2c 0a 20 20  utine(pParse,.  
15b80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
15b90 2c 20 26 64 65 73 74 41 2c 20 70 44 65 73 74 2c  , &destA, pDest,
15ba0 20 72 65 67 4f 75 74 41 2c 0a 20 20 20 20 20 20   regOutA,.      
15bb0 20 20 20 20 20 20 20 20 20 20 20 72 65 67 50 72             regPr
15bc0 65 76 2c 20 70 4b 65 79 44 75 70 2c 20 50 34 5f  ev, pKeyDup, P4_
15bd0 4b 45 59 49 4e 46 4f 5f 48 41 4e 44 4f 46 46 2c  KEYINFO_HANDOFF,
15be0 20 6c 61 62 65 6c 45 6e 64 29 3b 0a 20 20 0a 20   labelEnd);.  . 
15bf0 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 61 20 73   /* Generate a s
15c00 75 62 72 6f 75 74 69 6e 65 20 74 68 61 74 20 6f  ubroutine that o
15c10 75 74 70 75 74 73 20 74 68 65 20 63 75 72 72 65  utputs the curre
15c20 6e 74 20 72 6f 77 20 6f 66 20 74 68 65 20 42 0a  nt row of the B.
15c30 20 20 2a 2a 20 73 65 6c 65 63 74 20 61 73 20 74    ** select as t
15c40 68 65 20 6e 65 78 74 20 6f 75 74 70 75 74 20 72  he next output r
15c50 6f 77 20 6f 66 20 74 68 65 20 63 6f 6d 70 6f 75  ow of the compou
15c60 6e 64 20 73 65 6c 65 63 74 2e 0a 20 20 2a 2f 0a  nd select..  */.
15c70 20 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 41 4c 4c    if( op==TK_ALL
15c80 20 7c 7c 20 6f 70 3d 3d 54 4b 5f 55 4e 49 4f 4e   || op==TK_UNION
15c90 20 29 7b 0a 20 20 20 20 56 64 62 65 4e 6f 6f 70   ){.    VdbeNoop
15ca0 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 4f 75 74  Comment((v, "Out
15cb0 70 75 74 20 72 6f 75 74 69 6e 65 20 66 6f 72 20  put routine for 
15cc0 42 22 29 29 3b 0a 20 20 20 20 61 64 64 72 4f 75  B"));.    addrOu
15cd0 74 42 20 3d 20 67 65 6e 65 72 61 74 65 4f 75 74  tB = generateOut
15ce0 70 75 74 53 75 62 72 6f 75 74 69 6e 65 28 70 50  putSubroutine(pP
15cf0 61 72 73 65 2c 0a 20 20 20 20 20 20 20 20 20 20  arse,.          
15d00 20 20 20 20 20 20 20 70 2c 20 26 64 65 73 74 42         p, &destB
15d10 2c 20 70 44 65 73 74 2c 20 72 65 67 4f 75 74 42  , pDest, regOutB
15d20 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
15d30 20 20 20 72 65 67 50 72 65 76 2c 20 70 4b 65 79     regPrev, pKey
15d40 44 75 70 2c 20 50 34 5f 4b 45 59 49 4e 46 4f 5f  Dup, P4_KEYINFO_
15d50 53 54 41 54 49 43 2c 20 6c 61 62 65 6c 45 6e 64  STATIC, labelEnd
15d60 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 47 65 6e  );.  }..  /* Gen
15d70 65 72 61 74 65 20 61 20 73 75 62 72 6f 75 74 69  erate a subrouti
15d80 6e 65 20 74 6f 20 72 75 6e 20 77 68 65 6e 20 74  ne to run when t
15d90 68 65 20 72 65 73 75 6c 74 73 20 66 72 6f 6d 20  he results from 
15da0 73 65 6c 65 63 74 20 41 0a 20 20 2a 2a 20 61 72  select A.  ** ar
15db0 65 20 65 78 68 61 75 73 74 65 64 20 61 6e 64 20  e exhausted and 
15dc0 6f 6e 6c 79 20 64 61 74 61 20 69 6e 20 73 65 6c  only data in sel
15dd0 65 63 74 20 42 20 72 65 6d 61 69 6e 73 2e 0a 20  ect B remains.. 
15de0 20 2a 2f 0a 20 20 56 64 62 65 4e 6f 6f 70 43 6f   */.  VdbeNoopCo
15df0 6d 6d 65 6e 74 28 28 76 2c 20 22 65 6f 66 2d 41  mment((v, "eof-A
15e00 20 73 75 62 72 6f 75 74 69 6e 65 22 29 29 3b 0a   subroutine"));.
15e10 20 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 45 58 43    if( op==TK_EXC
15e20 45 50 54 20 7c 7c 20 6f 70 3d 3d 54 4b 5f 49 4e  EPT || op==TK_IN
15e30 54 45 52 53 45 43 54 20 29 7b 0a 20 20 20 20 61  TERSECT ){.    a
15e40 64 64 72 45 6f 66 41 20 3d 20 73 71 6c 69 74 65  ddrEofA = sqlite
15e50 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
15e60 50 5f 47 6f 74 6f 2c 20 30 2c 20 6c 61 62 65 6c  P_Goto, 0, label
15e70 45 6e 64 29 3b 0a 20 20 7d 65 6c 73 65 7b 20 20  End);.  }else{  
15e80 0a 20 20 20 20 61 64 64 72 45 6f 66 41 20 3d 20  .    addrEofA = 
15e90 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
15ea0 32 28 76 2c 20 4f 50 5f 49 66 2c 20 72 65 67 45  2(v, OP_If, regE
15eb0 6f 66 42 2c 20 6c 61 62 65 6c 45 6e 64 29 3b 0a  ofB, labelEnd);.
15ec0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
15ed0 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 73 75  ddOp2(v, OP_Gosu
15ee0 62 2c 20 72 65 67 4f 75 74 42 2c 20 61 64 64 72  b, regOutB, addr
15ef0 4f 75 74 42 29 3b 0a 20 20 20 20 73 71 6c 69 74  OutB);.    sqlit
15f00 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20  e3VdbeAddOp1(v, 
15f10 4f 50 5f 59 69 65 6c 64 2c 20 72 65 67 41 64 64  OP_Yield, regAdd
15f20 72 42 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  rB);.    sqlite3
15f30 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
15f40 5f 47 6f 74 6f 2c 20 30 2c 20 61 64 64 72 45 6f  _Goto, 0, addrEo
15f50 66 41 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 47  fA);.  }..  /* G
15f60 65 6e 65 72 61 74 65 20 61 20 73 75 62 72 6f 75  enerate a subrou
15f70 74 69 6e 65 20 74 6f 20 72 75 6e 20 77 68 65 6e  tine to run when
15f80 20 74 68 65 20 72 65 73 75 6c 74 73 20 66 72 6f   the results fro
15f90 6d 20 73 65 6c 65 63 74 20 42 0a 20 20 2a 2a 20  m select B.  ** 
15fa0 61 72 65 20 65 78 68 61 75 73 74 65 64 20 61 6e  are exhausted an
15fb0 64 20 6f 6e 6c 79 20 64 61 74 61 20 69 6e 20 73  d only data in s
15fc0 65 6c 65 63 74 20 41 20 72 65 6d 61 69 6e 73 2e  elect A remains.
15fd0 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6f 70 3d 3d  .  */.  if( op==
15fe0 54 4b 5f 49 4e 54 45 52 53 45 43 54 20 29 7b 0a  TK_INTERSECT ){.
15ff0 20 20 20 20 61 64 64 72 45 6f 66 42 20 3d 20 61      addrEofB = a
16000 64 64 72 45 6f 66 41 3b 0a 20 20 7d 65 6c 73 65  ddrEofA;.  }else
16010 7b 20 20 0a 20 20 20 20 56 64 62 65 4e 6f 6f 70  {  .    VdbeNoop
16020 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 65 6f 66  Comment((v, "eof
16030 2d 42 20 73 75 62 72 6f 75 74 69 6e 65 22 29 29  -B subroutine"))
16040 3b 0a 20 20 20 20 61 64 64 72 45 6f 66 42 20 3d  ;.    addrEofB =
16050 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
16060 70 32 28 76 2c 20 4f 50 5f 49 66 2c 20 72 65 67  p2(v, OP_If, reg
16070 45 6f 66 41 2c 20 6c 61 62 65 6c 45 6e 64 29 3b  EofA, labelEnd);
16080 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
16090 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 73  AddOp2(v, OP_Gos
160a0 75 62 2c 20 72 65 67 4f 75 74 41 2c 20 61 64 64  ub, regOutA, add
160b0 72 4f 75 74 41 29 3b 0a 20 20 20 20 73 71 6c 69  rOutA);.    sqli
160c0 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c  te3VdbeAddOp1(v,
160d0 20 4f 50 5f 59 69 65 6c 64 2c 20 72 65 67 41 64   OP_Yield, regAd
160e0 64 72 41 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  drA);.    sqlite
160f0 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
16100 50 5f 47 6f 74 6f 2c 20 30 2c 20 61 64 64 72 45  P_Goto, 0, addrE
16110 6f 66 42 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  ofB);.  }..  /* 
16120 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f  Generate code to
16130 20 68 61 6e 64 6c 65 20 74 68 65 20 63 61 73 65   handle the case
16140 20 6f 66 20 41 3c 42 0a 20 20 2a 2f 0a 20 20 56   of A<B.  */.  V
16150 64 62 65 4e 6f 6f 70 43 6f 6d 6d 65 6e 74 28 28  dbeNoopComment((
16160 76 2c 20 22 41 2d 6c 74 2d 42 20 73 75 62 72 6f  v, "A-lt-B subro
16170 75 74 69 6e 65 22 29 29 3b 0a 20 20 61 64 64 72  utine"));.  addr
16180 41 6c 74 42 20 3d 20 73 71 6c 69 74 65 33 56 64  AltB = sqlite3Vd
16190 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47  beAddOp2(v, OP_G
161a0 6f 73 75 62 2c 20 72 65 67 4f 75 74 41 2c 20 61  osub, regOutA, a
161b0 64 64 72 4f 75 74 41 29 3b 0a 20 20 73 71 6c 69  ddrOutA);.  sqli
161c0 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c  te3VdbeAddOp1(v,
161d0 20 4f 50 5f 59 69 65 6c 64 2c 20 72 65 67 41 64   OP_Yield, regAd
161e0 64 72 41 29 3b 0a 20 20 73 71 6c 69 74 65 33 56  drA);.  sqlite3V
161f0 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
16200 49 66 2c 20 72 65 67 45 6f 66 41 2c 20 61 64 64  If, regEofA, add
16210 72 45 6f 66 41 29 3b 0a 20 20 73 71 6c 69 74 65  rEofA);.  sqlite
16220 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
16230 50 5f 47 6f 74 6f 2c 20 30 2c 20 6c 61 62 65 6c  P_Goto, 0, label
16240 43 6d 70 72 29 3b 0a 0a 20 20 2f 2a 20 47 65 6e  Cmpr);..  /* Gen
16250 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20 68 61  erate code to ha
16260 6e 64 6c 65 20 74 68 65 20 63 61 73 65 20 6f 66  ndle the case of
16270 20 41 3d 3d 42 0a 20 20 2a 2f 0a 20 20 69 66 28   A==B.  */.  if(
16280 20 6f 70 3d 3d 54 4b 5f 41 4c 4c 20 29 7b 0a 20   op==TK_ALL ){. 
16290 20 20 20 61 64 64 72 41 65 71 42 20 3d 20 61 64     addrAeqB = ad
162a0 64 72 41 6c 74 42 3b 0a 20 20 7d 65 6c 73 65 20  drAltB;.  }else 
162b0 69 66 28 20 6f 70 3d 3d 54 4b 5f 49 4e 54 45 52  if( op==TK_INTER
162c0 53 45 43 54 20 29 7b 0a 20 20 20 20 61 64 64 72  SECT ){.    addr
162d0 41 65 71 42 20 3d 20 61 64 64 72 41 6c 74 42 3b  AeqB = addrAltB;
162e0 0a 20 20 20 20 61 64 64 72 41 6c 74 42 2b 2b 3b  .    addrAltB++;
162f0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 56 64  .  }else{.    Vd
16300 62 65 4e 6f 6f 70 43 6f 6d 6d 65 6e 74 28 28 76  beNoopComment((v
16310 2c 20 22 41 2d 65 71 2d 42 20 73 75 62 72 6f 75  , "A-eq-B subrou
16320 74 69 6e 65 22 29 29 3b 0a 20 20 20 20 61 64 64  tine"));.    add
16330 72 41 65 71 42 20 3d 0a 20 20 20 20 73 71 6c 69  rAeqB =.    sqli
16340 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c  te3VdbeAddOp1(v,
16350 20 4f 50 5f 59 69 65 6c 64 2c 20 72 65 67 41 64   OP_Yield, regAd
16360 64 72 41 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  drA);.    sqlite
16370 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
16380 50 5f 49 66 2c 20 72 65 67 45 6f 66 41 2c 20 61  P_If, regEofA, a
16390 64 64 72 45 6f 66 41 29 3b 0a 20 20 20 20 73 71  ddrEofA);.    sq
163a0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
163b0 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 6c  v, OP_Goto, 0, l
163c0 61 62 65 6c 43 6d 70 72 29 3b 0a 20 20 7d 0a 0a  abelCmpr);.  }..
163d0 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f    /* Generate co
163e0 64 65 20 74 6f 20 68 61 6e 64 6c 65 20 74 68 65  de to handle the
163f0 20 63 61 73 65 20 6f 66 20 41 3e 42 0a 20 20 2a   case of A>B.  *
16400 2f 0a 20 20 56 64 62 65 4e 6f 6f 70 43 6f 6d 6d  /.  VdbeNoopComm
16410 65 6e 74 28 28 76 2c 20 22 41 2d 67 74 2d 42 20  ent((v, "A-gt-B 
16420 73 75 62 72 6f 75 74 69 6e 65 22 29 29 3b 0a 20  subroutine"));. 
16430 20 61 64 64 72 41 67 74 42 20 3d 20 73 71 6c 69   addrAgtB = sqli
16440 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64  te3VdbeCurrentAd
16450 64 72 28 76 29 3b 0a 20 20 69 66 28 20 6f 70 3d  dr(v);.  if( op=
16460 3d 54 4b 5f 41 4c 4c 20 7c 7c 20 6f 70 3d 3d 54  =TK_ALL || op==T
16470 4b 5f 55 4e 49 4f 4e 20 29 7b 0a 20 20 20 20 73  K_UNION ){.    s
16480 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
16490 28 76 2c 20 4f 50 5f 47 6f 73 75 62 2c 20 72 65  (v, OP_Gosub, re
164a0 67 4f 75 74 42 2c 20 61 64 64 72 4f 75 74 42 29  gOutB, addrOutB)
164b0 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 56  ;.  }.  sqlite3V
164c0 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f  dbeAddOp1(v, OP_
164d0 59 69 65 6c 64 2c 20 72 65 67 41 64 64 72 42 29  Yield, regAddrB)
164e0 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41  ;.  sqlite3VdbeA
164f0 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 66 2c 20  ddOp2(v, OP_If, 
16500 72 65 67 45 6f 66 42 2c 20 61 64 64 72 45 6f 66  regEofB, addrEof
16510 42 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  B);.  sqlite3Vdb
16520 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f  eAddOp2(v, OP_Go
16530 74 6f 2c 20 30 2c 20 6c 61 62 65 6c 43 6d 70 72  to, 0, labelCmpr
16540 29 3b 0a 0a 20 20 2f 2a 20 54 68 69 73 20 63 6f  );..  /* This co
16550 64 65 20 72 75 6e 73 20 6f 6e 63 65 20 74 6f 20  de runs once to 
16560 69 6e 69 74 69 61 6c 69 7a 65 20 65 76 65 72 79  initialize every
16570 74 68 69 6e 67 2e 0a 20 20 2a 2f 0a 20 20 73 71  thing..  */.  sq
16580 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72  lite3VdbeJumpHer
16590 65 28 76 2c 20 6a 31 29 3b 0a 20 20 73 71 6c 69  e(v, j1);.  sqli
165a0 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
165b0 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 30 2c 20   OP_Integer, 0, 
165c0 72 65 67 45 6f 66 41 29 3b 0a 20 20 73 71 6c 69  regEofA);.  sqli
165d0 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
165e0 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 30 2c 20   OP_Integer, 0, 
165f0 72 65 67 45 6f 66 42 29 3b 0a 20 20 73 71 6c 69  regEofB);.  sqli
16600 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
16610 20 4f 50 5f 47 6f 73 75 62 2c 20 72 65 67 41 64   OP_Gosub, regAd
16620 64 72 41 2c 20 61 64 64 72 53 65 6c 65 63 74 41  drA, addrSelectA
16630 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  );.  sqlite3Vdbe
16640 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 73  AddOp2(v, OP_Gos
16650 75 62 2c 20 72 65 67 41 64 64 72 42 2c 20 61 64  ub, regAddrB, ad
16660 64 72 53 65 6c 65 63 74 42 29 3b 0a 20 20 73 71  drSelectB);.  sq
16670 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
16680 76 2c 20 4f 50 5f 49 66 2c 20 72 65 67 45 6f 66  v, OP_If, regEof
16690 41 2c 20 61 64 64 72 45 6f 66 41 29 3b 0a 20 20  A, addrEofA);.  
166a0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
166b0 32 28 76 2c 20 4f 50 5f 49 66 2c 20 72 65 67 45  2(v, OP_If, regE
166c0 6f 66 42 2c 20 61 64 64 72 45 6f 66 42 29 3b 0a  ofB, addrEofB);.
166d0 0a 20 20 2f 2a 20 49 6d 70 6c 65 6d 65 6e 74 20  .  /* Implement 
166e0 74 68 65 20 6d 61 69 6e 20 6d 65 72 67 65 20 6c  the main merge l
166f0 6f 6f 70 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74  oop.  */.  sqlit
16700 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62  e3VdbeResolveLab
16710 65 6c 28 76 2c 20 6c 61 62 65 6c 43 6d 70 72 29  el(v, labelCmpr)
16720 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41  ;.  sqlite3VdbeA
16730 64 64 4f 70 34 28 76 2c 20 4f 50 5f 50 65 72 6d  ddOp4(v, OP_Perm
16740 75 74 61 74 69 6f 6e 2c 20 30 2c 20 30 2c 20 30  utation, 0, 0, 0
16750 2c 20 28 63 68 61 72 2a 29 61 50 65 72 6d 75 74  , (char*)aPermut
16760 65 2c 20 50 34 5f 49 4e 54 41 52 52 41 59 29 3b  e, P4_INTARRAY);
16770 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  .  sqlite3VdbeAd
16780 64 4f 70 34 28 76 2c 20 4f 50 5f 43 6f 6d 70 61  dOp4(v, OP_Compa
16790 72 65 2c 20 64 65 73 74 41 2e 69 4d 65 6d 2c 20  re, destA.iMem, 
167a0 64 65 73 74 42 2e 69 4d 65 6d 2c 20 6e 4f 72 64  destB.iMem, nOrd
167b0 65 72 42 79 2c 0a 20 20 20 20 20 20 20 20 20 20  erBy,.          
167c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28                 (
167d0 63 68 61 72 2a 29 70 4b 65 79 4d 65 72 67 65 2c  char*)pKeyMerge,
167e0 20 50 34 5f 4b 45 59 49 4e 46 4f 5f 48 41 4e 44   P4_KEYINFO_HAND
167f0 4f 46 46 29 3b 0a 20 20 73 71 6c 69 74 65 33 56  OFF);.  sqlite3V
16800 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
16810 4a 75 6d 70 2c 20 61 64 64 72 41 6c 74 42 2c 20  Jump, addrAltB, 
16820 61 64 64 72 41 65 71 42 2c 20 61 64 64 72 41 67  addrAeqB, addrAg
16830 74 42 29 3b 0a 0a 20 20 2f 2a 20 52 65 6c 65 61  tB);..  /* Relea
16840 73 65 20 74 65 6d 70 6f 72 61 72 79 20 72 65 67  se temporary reg
16850 69 73 74 65 72 73 0a 20 20 2a 2f 0a 20 20 69 66  isters.  */.  if
16860 28 20 72 65 67 50 72 65 76 20 29 7b 0a 20 20 20  ( regPrev ){.   
16870 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54   sqlite3ReleaseT
16880 65 6d 70 52 61 6e 67 65 28 70 50 61 72 73 65 2c  empRange(pParse,
16890 20 72 65 67 50 72 65 76 2c 20 6e 4f 72 64 65 72   regPrev, nOrder
168a0 42 79 2b 31 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  By+1);.  }..  /*
168b0 20 4a 75 6d 70 20 74 6f 20 74 68 65 20 74 68 69   Jump to the thi
168c0 73 20 70 6f 69 6e 74 20 69 6e 20 6f 72 64 65 72  s point in order
168d0 20 74 6f 20 74 65 72 6d 69 6e 61 74 65 20 74 68   to terminate th
168e0 65 20 71 75 65 72 79 2e 0a 20 20 2a 2f 0a 20 20  e query..  */.  
168f0 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c  sqlite3VdbeResol
16900 76 65 4c 61 62 65 6c 28 76 2c 20 6c 61 62 65 6c  veLabel(v, label
16910 45 6e 64 29 3b 0a 0a 20 20 2f 2a 20 53 65 74 20  End);..  /* Set 
16920 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 6f 75  the number of ou
16930 74 70 75 74 20 63 6f 6c 75 6d 6e 73 0a 20 20 2a  tput columns.  *
16940 2f 0a 20 20 69 66 28 20 70 44 65 73 74 2d 3e 65  /.  if( pDest->e
16950 44 65 73 74 3d 3d 53 52 54 5f 43 61 6c 6c 62 61  Dest==SRT_Callba
16960 63 6b 20 29 7b 0a 20 20 20 20 53 65 6c 65 63 74  ck ){.    Select
16970 20 2a 70 46 69 72 73 74 20 3d 20 70 50 72 69 6f   *pFirst = pPrio
16980 72 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 70 46  r;.    while( pF
16990 69 72 73 74 2d 3e 70 50 72 69 6f 72 20 29 20 70  irst->pPrior ) p
169a0 46 69 72 73 74 20 3d 20 70 46 69 72 73 74 2d 3e  First = pFirst->
169b0 70 50 72 69 6f 72 3b 0a 20 20 20 20 67 65 6e 65  pPrior;.    gene
169c0 72 61 74 65 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28  rateColumnNames(
169d0 70 50 61 72 73 65 2c 20 30 2c 20 70 46 69 72 73  pParse, 0, pFirs
169e0 74 2d 3e 70 45 4c 69 73 74 29 3b 0a 20 20 7d 0a  t->pEList);.  }.
169f0 0a 20 20 2f 2a 20 52 65 61 73 73 65 6d 62 6c 79  .  /* Reassembly
16a00 20 74 68 65 20 63 6f 6d 70 6f 75 6e 64 20 71 75   the compound qu
16a10 65 72 79 20 73 6f 20 74 68 61 74 20 69 74 20 77  ery so that it w
16a20 69 6c 6c 20 62 65 20 66 72 65 65 64 20 63 6f 72  ill be freed cor
16a30 72 65 63 74 6c 79 0a 20 20 2a 2a 20 62 79 20 74  rectly.  ** by t
16a40 68 65 20 63 61 6c 6c 69 6e 67 20 66 75 6e 63 74  he calling funct
16a50 69 6f 6e 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e  ion */.  if( p->
16a60 70 50 72 69 6f 72 20 29 7b 0a 20 20 20 20 73 71  pPrior ){.    sq
16a70 6c 69 74 65 33 53 65 6c 65 63 74 44 65 6c 65 74  lite3SelectDelet
16a80 65 28 70 2d 3e 70 50 72 69 6f 72 29 3b 0a 20 20  e(p->pPrior);.  
16a90 7d 0a 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d 20  }.  p->pPrior = 
16aa0 70 50 72 69 6f 72 3b 0a 0a 20 20 2f 2a 2a 2a 20  pPrior;..  /*** 
16ab0 54 42 44 3a 20 20 49 6e 73 65 72 74 20 73 75 62  TBD:  Insert sub
16ac0 72 6f 75 74 69 6e 65 20 63 61 6c 6c 73 20 74 6f  routine calls to
16ad0 20 63 6c 6f 73 65 20 63 75 72 73 6f 72 73 20 6f   close cursors o
16ae0 6e 20 69 6e 63 6f 6d 70 6c 65 74 65 0a 20 20 2a  n incomplete.  *
16af0 2a 2a 2a 20 73 75 62 71 75 65 72 69 65 73 20 2a  *** subqueries *
16b00 2a 2a 2a 2f 0a 20 20 72 65 74 75 72 6e 20 53 51  ***/.  return SQ
16b10 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23 69 66 6e  LITE_OK;.}..#ifn
16b20 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
16b30 56 49 45 57 0a 2f 2a 20 46 6f 72 77 61 72 64 20  VIEW./* Forward 
16b40 44 65 63 6c 61 72 61 74 69 6f 6e 73 20 2a 2f 0a  Declarations */.
16b50 73 74 61 74 69 63 20 76 6f 69 64 20 73 75 62 73  static void subs
16b60 74 45 78 70 72 4c 69 73 74 28 73 71 6c 69 74 65  tExprList(sqlite
16b70 33 2a 2c 20 45 78 70 72 4c 69 73 74 2a 2c 20 69  3*, ExprList*, i
16b80 6e 74 2c 20 45 78 70 72 4c 69 73 74 2a 29 3b 0a  nt, ExprList*);.
16b90 73 74 61 74 69 63 20 76 6f 69 64 20 73 75 62 73  static void subs
16ba0 74 53 65 6c 65 63 74 28 73 71 6c 69 74 65 33 2a  tSelect(sqlite3*
16bb0 2c 20 53 65 6c 65 63 74 20 2a 2c 20 69 6e 74 2c  , Select *, int,
16bc0 20 45 78 70 72 4c 69 73 74 20 2a 29 3b 0a 0a 2f   ExprList *);../
16bd0 2a 0a 2a 2a 20 53 63 61 6e 20 74 68 72 6f 75 67  *.** Scan throug
16be0 68 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  h the expression
16bf0 20 70 45 78 70 72 2e 20 20 52 65 70 6c 61 63 65   pExpr.  Replace
16c00 20 65 76 65 72 79 20 72 65 66 65 72 65 6e 63 65   every reference
16c10 20 74 6f 0a 2a 2a 20 61 20 63 6f 6c 75 6d 6e 20   to.** a column 
16c20 69 6e 20 74 61 62 6c 65 20 6e 75 6d 62 65 72 20  in table number 
16c30 69 54 61 62 6c 65 20 77 69 74 68 20 61 20 63 6f  iTable with a co
16c40 70 79 20 6f 66 20 74 68 65 20 69 43 6f 6c 75 6d  py of the iColum
16c50 6e 2d 74 68 0a 2a 2a 20 65 6e 74 72 79 20 69 6e  n-th.** entry in
16c60 20 70 45 4c 69 73 74 2e 20 20 28 42 75 74 20 6c   pEList.  (But l
16c70 65 61 76 65 20 72 65 66 65 72 65 6e 63 65 73 20  eave references 
16c80 74 6f 20 74 68 65 20 52 4f 57 49 44 20 63 6f 6c  to the ROWID col
16c90 75 6d 6e 20 0a 2a 2a 20 75 6e 63 68 61 6e 67 65  umn .** unchange
16ca0 64 2e 29 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  d.).**.** This r
16cb0 6f 75 74 69 6e 65 20 69 73 20 70 61 72 74 20 6f  outine is part o
16cc0 66 20 74 68 65 20 66 6c 61 74 74 65 6e 69 6e 67  f the flattening
16cd0 20 70 72 6f 63 65 64 75 72 65 2e 20 20 41 20 73   procedure.  A s
16ce0 75 62 71 75 65 72 79 0a 2a 2a 20 77 68 6f 73 65  ubquery.** whose
16cf0 20 72 65 73 75 6c 74 20 73 65 74 20 69 73 20 64   result set is d
16d00 65 66 69 6e 65 64 20 62 79 20 70 45 4c 69 73 74  efined by pEList
16d10 20 61 70 70 65 61 72 73 20 61 73 20 65 6e 74 72   appears as entr
16d20 79 20 69 6e 20 74 68 65 0a 2a 2a 20 46 52 4f 4d  y in the.** FROM
16d30 20 63 6c 61 75 73 65 20 6f 66 20 61 20 53 45 4c   clause of a SEL
16d40 45 43 54 20 73 75 63 68 20 74 68 61 74 20 74 68  ECT such that th
16d50 65 20 56 44 42 45 20 63 75 72 73 6f 72 20 61 73  e VDBE cursor as
16d60 73 69 67 6e 65 64 20 74 6f 20 74 68 61 74 0a 2a  signed to that.*
16d70 2a 20 46 4f 52 4d 20 63 6c 61 75 73 65 20 65 6e  * FORM clause en
16d80 74 72 79 20 69 73 20 69 54 61 62 6c 65 2e 20 20  try is iTable.  
16d90 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6d 61 6b  This routine mak
16da0 65 20 74 68 65 20 6e 65 63 65 73 73 61 72 79 20  e the necessary 
16db0 0a 2a 2a 20 63 68 61 6e 67 65 73 20 74 6f 20 70  .** changes to p
16dc0 45 78 70 72 20 73 6f 20 74 68 61 74 20 69 74 20  Expr so that it 
16dd0 72 65 66 65 72 73 20 64 69 72 65 63 74 6c 79 20  refers directly 
16de0 74 6f 20 74 68 65 20 73 6f 75 72 63 65 20 74 61  to the source ta
16df0 62 6c 65 0a 2a 2a 20 6f 66 20 74 68 65 20 73 75  ble.** of the su
16e00 62 71 75 65 72 79 20 72 61 74 68 65 72 20 74 68  bquery rather th
16e10 65 20 72 65 73 75 6c 74 20 73 65 74 20 6f 66 20  e result set of 
16e20 74 68 65 20 73 75 62 71 75 65 72 79 2e 0a 2a 2f  the subquery..*/
16e30 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 75 62  .static void sub
16e40 73 74 45 78 70 72 28 0a 20 20 73 71 6c 69 74 65  stExpr(.  sqlite
16e50 33 20 2a 64 62 2c 20 20 20 20 20 20 20 20 2f 2a  3 *db,        /*
16e60 20 52 65 70 6f 72 74 20 6d 61 6c 6c 6f 63 20 65   Report malloc e
16e70 72 72 6f 72 73 20 74 6f 20 74 68 69 73 20 63 6f  rrors to this co
16e80 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 45 78  nnection */.  Ex
16e90 70 72 20 2a 70 45 78 70 72 2c 20 20 20 20 20 20  pr *pExpr,      
16ea0 20 20 2f 2a 20 45 78 70 72 20 69 6e 20 77 68 69    /* Expr in whi
16eb0 63 68 20 73 75 62 73 74 69 74 75 74 69 6f 6e 20  ch substitution 
16ec0 6f 63 63 75 72 73 20 2a 2f 0a 20 20 69 6e 74 20  occurs */.  int 
16ed0 69 54 61 62 6c 65 2c 20 20 20 20 20 20 20 20 20  iTable,         
16ee0 2f 2a 20 54 61 62 6c 65 20 74 6f 20 62 65 20 73  /* Table to be s
16ef0 75 62 73 74 69 74 75 74 65 64 20 2a 2f 0a 20 20  ubstituted */.  
16f00 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74  ExprList *pEList
16f10 20 20 20 20 2f 2a 20 53 75 62 73 74 69 74 75 74      /* Substitut
16f20 65 20 65 78 70 72 65 73 73 69 6f 6e 73 20 2a 2f  e expressions */
16f30 0a 29 7b 0a 20 20 69 66 28 20 70 45 78 70 72 3d  .){.  if( pExpr=
16f40 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69  =0 ) return;.  i
16f50 66 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b  f( pExpr->op==TK
16f60 5f 43 4f 4c 55 4d 4e 20 26 26 20 70 45 78 70 72  _COLUMN && pExpr
16f70 2d 3e 69 54 61 62 6c 65 3d 3d 69 54 61 62 6c 65  ->iTable==iTable
16f80 20 29 7b 0a 20 20 20 20 69 66 28 20 70 45 78 70   ){.    if( pExp
16f90 72 2d 3e 69 43 6f 6c 75 6d 6e 3c 30 20 29 7b 0a  r->iColumn<0 ){.
16fa0 20 20 20 20 20 20 70 45 78 70 72 2d 3e 6f 70 20        pExpr->op 
16fb0 3d 20 54 4b 5f 4e 55 4c 4c 3b 0a 20 20 20 20 7d  = TK_NULL;.    }
16fc0 65 6c 73 65 7b 0a 20 20 20 20 20 20 45 78 70 72  else{.      Expr
16fd0 20 2a 70 4e 65 77 3b 0a 20 20 20 20 20 20 61 73   *pNew;.      as
16fe0 73 65 72 74 28 20 70 45 4c 69 73 74 21 3d 30 20  sert( pEList!=0 
16ff0 26 26 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d  && pExpr->iColum
17000 6e 3c 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 20  n<pEList->nExpr 
17010 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
17020 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 3d 3d 30   pExpr->pLeft==0
17030 20 26 26 20 70 45 78 70 72 2d 3e 70 52 69 67 68   && pExpr->pRigh
17040 74 3d 3d 30 20 26 26 20 70 45 78 70 72 2d 3e 70  t==0 && pExpr->p
17050 4c 69 73 74 3d 3d 30 20 29 3b 0a 20 20 20 20 20  List==0 );.     
17060 20 70 4e 65 77 20 3d 20 70 45 4c 69 73 74 2d 3e   pNew = pEList->
17070 61 5b 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e  a[pExpr->iColumn
17080 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 20 20 61  ].pExpr;.      a
17090 73 73 65 72 74 28 20 70 4e 65 77 21 3d 30 20 29  ssert( pNew!=0 )
170a0 3b 0a 20 20 20 20 20 20 70 45 78 70 72 2d 3e 6f  ;.      pExpr->o
170b0 70 20 3d 20 70 4e 65 77 2d 3e 6f 70 3b 0a 20 20  p = pNew->op;.  
170c0 20 20 20 20 61 73 73 65 72 74 28 20 70 45 78 70      assert( pExp
170d0 72 2d 3e 70 4c 65 66 74 3d 3d 30 20 29 3b 0a 20  r->pLeft==0 );. 
170e0 20 20 20 20 20 70 45 78 70 72 2d 3e 70 4c 65 66       pExpr->pLef
170f0 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44  t = sqlite3ExprD
17100 75 70 28 64 62 2c 20 70 4e 65 77 2d 3e 70 4c 65  up(db, pNew->pLe
17110 66 74 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  ft);.      asser
17120 74 28 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74  t( pExpr->pRight
17130 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 70 45 78  ==0 );.      pEx
17140 70 72 2d 3e 70 52 69 67 68 74 20 3d 20 73 71 6c  pr->pRight = sql
17150 69 74 65 33 45 78 70 72 44 75 70 28 64 62 2c 20  ite3ExprDup(db, 
17160 70 4e 65 77 2d 3e 70 52 69 67 68 74 29 3b 0a 20  pNew->pRight);. 
17170 20 20 20 20 20 61 73 73 65 72 74 28 20 70 45 78       assert( pEx
17180 70 72 2d 3e 70 4c 69 73 74 3d 3d 30 20 29 3b 0a  pr->pList==0 );.
17190 20 20 20 20 20 20 70 45 78 70 72 2d 3e 70 4c 69        pExpr->pLi
171a0 73 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  st = sqlite3Expr
171b0 4c 69 73 74 44 75 70 28 64 62 2c 20 70 4e 65 77  ListDup(db, pNew
171c0 2d 3e 70 4c 69 73 74 29 3b 0a 20 20 20 20 20 20  ->pList);.      
171d0 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 20 3d 20  pExpr->iTable = 
171e0 70 4e 65 77 2d 3e 69 54 61 62 6c 65 3b 0a 20 20  pNew->iTable;.  
171f0 20 20 20 20 70 45 78 70 72 2d 3e 70 54 61 62 20      pExpr->pTab 
17200 3d 20 70 4e 65 77 2d 3e 70 54 61 62 3b 0a 20 20  = pNew->pTab;.  
17210 20 20 20 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75      pExpr->iColu
17220 6d 6e 20 3d 20 70 4e 65 77 2d 3e 69 43 6f 6c 75  mn = pNew->iColu
17230 6d 6e 3b 0a 20 20 20 20 20 20 70 45 78 70 72 2d  mn;.      pExpr-
17240 3e 69 41 67 67 20 3d 20 70 4e 65 77 2d 3e 69 41  >iAgg = pNew->iA
17250 67 67 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  gg;.      sqlite
17260 33 54 6f 6b 65 6e 43 6f 70 79 28 64 62 2c 20 26  3TokenCopy(db, &
17270 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2c 20 26 70  pExpr->token, &p
17280 4e 65 77 2d 3e 74 6f 6b 65 6e 29 3b 0a 20 20 20  New->token);.   
17290 20 20 20 73 71 6c 69 74 65 33 54 6f 6b 65 6e 43     sqlite3TokenC
172a0 6f 70 79 28 64 62 2c 20 26 70 45 78 70 72 2d 3e  opy(db, &pExpr->
172b0 73 70 61 6e 2c 20 26 70 4e 65 77 2d 3e 73 70 61  span, &pNew->spa
172c0 6e 29 3b 0a 20 20 20 20 20 20 70 45 78 70 72 2d  n);.      pExpr-
172d0 3e 70 53 65 6c 65 63 74 20 3d 20 73 71 6c 69 74  >pSelect = sqlit
172e0 65 33 53 65 6c 65 63 74 44 75 70 28 64 62 2c 20  e3SelectDup(db, 
172f0 70 4e 65 77 2d 3e 70 53 65 6c 65 63 74 29 3b 0a  pNew->pSelect);.
17300 20 20 20 20 20 20 70 45 78 70 72 2d 3e 66 6c 61        pExpr->fla
17310 67 73 20 3d 20 70 4e 65 77 2d 3e 66 6c 61 67 73  gs = pNew->flags
17320 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b  ;.    }.  }else{
17330 0a 20 20 20 20 73 75 62 73 74 45 78 70 72 28 64  .    substExpr(d
17340 62 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c  b, pExpr->pLeft,
17350 20 69 54 61 62 6c 65 2c 20 70 45 4c 69 73 74 29   iTable, pEList)
17360 3b 0a 20 20 20 20 73 75 62 73 74 45 78 70 72 28  ;.    substExpr(
17370 64 62 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68  db, pExpr->pRigh
17380 74 2c 20 69 54 61 62 6c 65 2c 20 70 45 4c 69 73  t, iTable, pELis
17390 74 29 3b 0a 20 20 20 20 73 75 62 73 74 53 65 6c  t);.    substSel
173a0 65 63 74 28 64 62 2c 20 70 45 78 70 72 2d 3e 70  ect(db, pExpr->p
173b0 53 65 6c 65 63 74 2c 20 69 54 61 62 6c 65 2c 20  Select, iTable, 
173c0 70 45 4c 69 73 74 29 3b 0a 20 20 20 20 73 75 62  pEList);.    sub
173d0 73 74 45 78 70 72 4c 69 73 74 28 64 62 2c 20 70  stExprList(db, p
173e0 45 78 70 72 2d 3e 70 4c 69 73 74 2c 20 69 54 61  Expr->pList, iTa
173f0 62 6c 65 2c 20 70 45 4c 69 73 74 29 3b 0a 20 20  ble, pEList);.  
17400 7d 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20  }.}.static void 
17410 73 75 62 73 74 45 78 70 72 4c 69 73 74 28 0a 20  substExprList(. 
17420 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 20 20   sqlite3 *db,   
17430 20 20 20 20 20 20 2f 2a 20 52 65 70 6f 72 74 20        /* Report 
17440 6d 61 6c 6c 6f 63 20 65 72 72 6f 72 73 20 68 65  malloc errors he
17450 72 65 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74  re */.  ExprList
17460 20 2a 70 4c 69 73 74 2c 20 20 20 20 20 2f 2a 20   *pList,     /* 
17470 4c 69 73 74 20 74 6f 20 73 63 61 6e 20 61 6e 64  List to scan and
17480 20 69 6e 20 77 68 69 63 68 20 74 6f 20 6d 61 6b   in which to mak
17490 65 20 73 75 62 73 74 69 74 75 74 65 73 20 2a 2f  e substitutes */
174a0 0a 20 20 69 6e 74 20 69 54 61 62 6c 65 2c 20 20  .  int iTable,  
174b0 20 20 20 20 20 20 20 20 2f 2a 20 54 61 62 6c 65          /* Table
174c0 20 74 6f 20 62 65 20 73 75 62 73 74 69 74 75 74   to be substitut
174d0 65 64 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74  ed */.  ExprList
174e0 20 2a 70 45 4c 69 73 74 20 20 20 20 20 2f 2a 20   *pEList     /* 
174f0 53 75 62 73 74 69 74 75 74 65 20 76 61 6c 75 65  Substitute value
17500 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 3b  s */.){.  int i;
17510 0a 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20  .  if( pList==0 
17520 29 20 72 65 74 75 72 6e 3b 0a 20 20 66 6f 72 28  ) return;.  for(
17530 69 3d 30 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e 45  i=0; i<pList->nE
17540 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73  xpr; i++){.    s
17550 75 62 73 74 45 78 70 72 28 64 62 2c 20 70 4c 69  ubstExpr(db, pLi
17560 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 2c 20  st->a[i].pExpr, 
17570 69 54 61 62 6c 65 2c 20 70 45 4c 69 73 74 29 3b  iTable, pEList);
17580 0a 20 20 7d 0a 7d 0a 73 74 61 74 69 63 20 76 6f  .  }.}.static vo
17590 69 64 20 73 75 62 73 74 53 65 6c 65 63 74 28 0a  id substSelect(.
175a0 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 20    sqlite3 *db,  
175b0 20 20 20 20 20 20 20 2f 2a 20 52 65 70 6f 72 74         /* Report
175c0 20 6d 61 6c 6c 6f 63 20 65 72 72 6f 72 73 20 68   malloc errors h
175d0 65 72 65 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20  ere */.  Select 
175e0 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a  *p,           /*
175f0 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
17600 74 20 69 6e 20 77 68 69 63 68 20 74 6f 20 6d 61  t in which to ma
17610 6b 65 20 73 75 62 73 74 69 74 75 74 69 6f 6e 73  ke substitutions
17620 20 2a 2f 0a 20 20 69 6e 74 20 69 54 61 62 6c 65   */.  int iTable
17630 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 61  ,          /* Ta
17640 62 6c 65 20 74 6f 20 62 65 20 72 65 70 6c 61 63  ble to be replac
17650 65 64 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74  ed */.  ExprList
17660 20 2a 70 45 4c 69 73 74 20 20 20 20 20 2f 2a 20   *pEList     /* 
17670 53 75 62 73 74 69 74 75 74 65 20 76 61 6c 75 65  Substitute value
17680 73 20 2a 2f 0a 29 7b 0a 20 20 69 66 28 20 21 70  s */.){.  if( !p
17690 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 73 75 62   ) return;.  sub
176a0 73 74 45 78 70 72 4c 69 73 74 28 64 62 2c 20 70  stExprList(db, p
176b0 2d 3e 70 45 4c 69 73 74 2c 20 69 54 61 62 6c 65  ->pEList, iTable
176c0 2c 20 70 45 4c 69 73 74 29 3b 0a 20 20 73 75 62  , pEList);.  sub
176d0 73 74 45 78 70 72 4c 69 73 74 28 64 62 2c 20 70  stExprList(db, p
176e0 2d 3e 70 47 72 6f 75 70 42 79 2c 20 69 54 61 62  ->pGroupBy, iTab
176f0 6c 65 2c 20 70 45 4c 69 73 74 29 3b 0a 20 20 73  le, pEList);.  s
17700 75 62 73 74 45 78 70 72 4c 69 73 74 28 64 62 2c  ubstExprList(db,
17710 20 70 2d 3e 70 4f 72 64 65 72 42 79 2c 20 69 54   p->pOrderBy, iT
17720 61 62 6c 65 2c 20 70 45 4c 69 73 74 29 3b 0a 20  able, pEList);. 
17730 20 73 75 62 73 74 45 78 70 72 28 64 62 2c 20 70   substExpr(db, p
17740 2d 3e 70 48 61 76 69 6e 67 2c 20 69 54 61 62 6c  ->pHaving, iTabl
17750 65 2c 20 70 45 4c 69 73 74 29 3b 0a 20 20 73 75  e, pEList);.  su
17760 62 73 74 45 78 70 72 28 64 62 2c 20 70 2d 3e 70  bstExpr(db, p->p
17770 57 68 65 72 65 2c 20 69 54 61 62 6c 65 2c 20 70  Where, iTable, p
17780 45 4c 69 73 74 29 3b 0a 20 20 73 75 62 73 74 53  EList);.  substS
17790 65 6c 65 63 74 28 64 62 2c 20 70 2d 3e 70 50 72  elect(db, p->pPr
177a0 69 6f 72 2c 20 69 54 61 62 6c 65 2c 20 70 45 4c  ior, iTable, pEL
177b0 69 73 74 29 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f  ist);.}.#endif /
177c0 2a 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  * !defined(SQLIT
177d0 45 5f 4f 4d 49 54 5f 56 49 45 57 29 20 2a 2f 0a  E_OMIT_VIEW) */.
177e0 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
177f0 4f 4d 49 54 5f 56 49 45 57 0a 2f 2a 0a 2a 2a 20  OMIT_VIEW./*.** 
17800 54 68 69 73 20 72 6f 75 74 69 6e 65 20 61 74 74  This routine att
17810 65 6d 70 74 73 20 74 6f 20 66 6c 61 74 74 65 6e  empts to flatten
17820 20 73 75 62 71 75 65 72 69 65 73 20 69 6e 20 6f   subqueries in o
17830 72 64 65 72 20 74 6f 20 73 70 65 65 64 0a 2a 2a  rder to speed.**
17840 20 65 78 65 63 75 74 69 6f 6e 2e 20 20 49 74 20   execution.  It 
17850 72 65 74 75 72 6e 73 20 31 20 69 66 20 69 74 20  returns 1 if it 
17860 6d 61 6b 65 73 20 63 68 61 6e 67 65 73 20 61 6e  makes changes an
17870 64 20 30 20 69 66 20 6e 6f 20 66 6c 61 74 74 65  d 0 if no flatte
17880 6e 69 6e 67 0a 2a 2a 20 6f 63 63 75 72 73 2e 0a  ning.** occurs..
17890 2a 2a 0a 2a 2a 20 54 6f 20 75 6e 64 65 72 73 74  **.** To underst
178a0 61 6e 64 20 74 68 65 20 63 6f 6e 63 65 70 74 20  and the concept 
178b0 6f 66 20 66 6c 61 74 74 65 6e 69 6e 67 2c 20 63  of flattening, c
178c0 6f 6e 73 69 64 65 72 20 74 68 65 20 66 6f 6c 6c  onsider the foll
178d0 6f 77 69 6e 67 0a 2a 2a 20 71 75 65 72 79 3a 0a  owing.** query:.
178e0 2a 2a 0a 2a 2a 20 20 20 20 20 53 45 4c 45 43 54  **.**     SELECT
178f0 20 61 20 46 52 4f 4d 20 28 53 45 4c 45 43 54 20   a FROM (SELECT 
17900 78 2b 79 20 41 53 20 61 20 46 52 4f 4d 20 74 31  x+y AS a FROM t1
17910 20 57 48 45 52 45 20 7a 3c 31 30 30 29 20 57 48   WHERE z<100) WH
17920 45 52 45 20 61 3e 35 0a 2a 2a 0a 2a 2a 20 54 68  ERE a>5.**.** Th
17930 65 20 64 65 66 61 75 6c 74 20 77 61 79 20 6f 66  e default way of
17940 20 69 6d 70 6c 65 6d 65 6e 74 69 6e 67 20 74 68   implementing th
17950 69 73 20 71 75 65 72 79 20 69 73 20 74 6f 20 65  is query is to e
17960 78 65 63 75 74 65 20 74 68 65 0a 2a 2a 20 73 75  xecute the.** su
17970 62 71 75 65 72 79 20 66 69 72 73 74 20 61 6e 64  bquery first and
17980 20 73 74 6f 72 65 20 74 68 65 20 72 65 73 75 6c   store the resul
17990 74 73 20 69 6e 20 61 20 74 65 6d 70 6f 72 61 72  ts in a temporar
179a0 79 20 74 61 62 6c 65 2c 20 74 68 65 6e 0a 2a 2a  y table, then.**
179b0 20 72 75 6e 20 74 68 65 20 6f 75 74 65 72 20 71   run the outer q
179c0 75 65 72 79 20 6f 6e 20 74 68 61 74 20 74 65 6d  uery on that tem
179d0 70 6f 72 61 72 79 20 74 61 62 6c 65 2e 20 20 54  porary table.  T
179e0 68 69 73 20 72 65 71 75 69 72 65 73 20 74 77 6f  his requires two
179f0 0a 2a 2a 20 70 61 73 73 65 73 20 6f 76 65 72 20  .** passes over 
17a00 74 68 65 20 64 61 74 61 2e 20 20 46 75 72 74 68  the data.  Furth
17a10 65 72 6d 6f 72 65 2c 20 62 65 63 61 75 73 65 20  ermore, because 
17a20 74 68 65 20 74 65 6d 70 6f 72 61 72 79 20 74 61  the temporary ta
17a30 62 6c 65 0a 2a 2a 20 68 61 73 20 6e 6f 20 69 6e  ble.** has no in
17a40 64 69 63 65 73 2c 20 74 68 65 20 57 48 45 52 45  dices, the WHERE
17a50 20 63 6c 61 75 73 65 20 6f 6e 20 74 68 65 20 6f   clause on the o
17a60 75 74 65 72 20 71 75 65 72 79 20 63 61 6e 6e 6f  uter query canno
17a70 74 20 62 65 0a 2a 2a 20 6f 70 74 69 6d 69 7a 65  t be.** optimize
17a80 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  d..**.** This ro
17a90 75 74 69 6e 65 20 61 74 74 65 6d 70 74 73 20 74  utine attempts t
17aa0 6f 20 72 65 77 72 69 74 65 20 71 75 65 72 69 65  o rewrite querie
17ab0 73 20 73 75 63 68 20 61 73 20 74 68 65 20 61 62  s such as the ab
17ac0 6f 76 65 20 69 6e 74 6f 0a 2a 2a 20 61 20 73 69  ove into.** a si
17ad0 6e 67 6c 65 20 66 6c 61 74 20 73 65 6c 65 63 74  ngle flat select
17ae0 2c 20 6c 69 6b 65 20 74 68 69 73 3a 0a 2a 2a 0a  , like this:.**.
17af0 2a 2a 20 20 20 20 20 53 45 4c 45 43 54 20 78 2b  **     SELECT x+
17b00 79 20 41 53 20 61 20 46 52 4f 4d 20 74 31 20 57  y AS a FROM t1 W
17b10 48 45 52 45 20 7a 3c 31 30 30 20 41 4e 44 20 61  HERE z<100 AND a
17b20 3e 35 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 6f 64  >5.**.** The cod
17b30 65 20 67 65 6e 65 72 61 74 65 64 20 66 6f 72 20  e generated for 
17b40 74 68 69 73 20 73 69 6d 70 69 66 69 63 61 74 69  this simpificati
17b50 6f 6e 20 67 69 76 65 73 20 74 68 65 20 73 61 6d  on gives the sam
17b60 65 20 72 65 73 75 6c 74 0a 2a 2a 20 62 75 74 20  e result.** but 
17b70 6f 6e 6c 79 20 68 61 73 20 74 6f 20 73 63 61 6e  only has to scan
17b80 20 74 68 65 20 64 61 74 61 20 6f 6e 63 65 2e 20   the data once. 
17b90 20 41 6e 64 20 62 65 63 61 75 73 65 20 69 6e 64   And because ind
17ba0 69 63 65 73 20 6d 69 67 68 74 20 0a 2a 2a 20 65  ices might .** e
17bb0 78 69 73 74 20 6f 6e 20 74 68 65 20 74 61 62 6c  xist on the tabl
17bc0 65 20 74 31 2c 20 61 20 63 6f 6d 70 6c 65 74 65  e t1, a complete
17bd0 20 73 63 61 6e 20 6f 66 20 74 68 65 20 64 61 74   scan of the dat
17be0 61 20 6d 69 67 68 74 20 62 65 0a 2a 2a 20 61 76  a might be.** av
17bf0 6f 69 64 65 64 2e 0a 2a 2a 0a 2a 2a 20 46 6c 61  oided..**.** Fla
17c00 74 74 65 6e 69 6e 67 20 69 73 20 6f 6e 6c 79 20  ttening is only 
17c10 61 74 74 65 6d 70 74 65 64 20 69 66 20 61 6c 6c  attempted if all
17c20 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   of the followin
17c30 67 20 61 72 65 20 74 72 75 65 3a 0a 2a 2a 0a 2a  g are true:.**.*
17c40 2a 20 20 20 28 31 29 20 20 54 68 65 20 73 75 62  *   (1)  The sub
17c50 71 75 65 72 79 20 61 6e 64 20 74 68 65 20 6f 75  query and the ou
17c60 74 65 72 20 71 75 65 72 79 20 64 6f 20 6e 6f 74  ter query do not
17c70 20 62 6f 74 68 20 75 73 65 20 61 67 67 72 65 67   both use aggreg
17c80 61 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 20 20 28 32  ates..**.**   (2
17c90 29 20 20 54 68 65 20 73 75 62 71 75 65 72 79 20  )  The subquery 
17ca0 69 73 20 6e 6f 74 20 61 6e 20 61 67 67 72 65 67  is not an aggreg
17cb0 61 74 65 20 6f 72 20 74 68 65 20 6f 75 74 65 72  ate or the outer
17cc0 20 71 75 65 72 79 20 69 73 20 6e 6f 74 20 61 20   query is not a 
17cd0 6a 6f 69 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20 28 33  join..**.**   (3
17ce0 29 20 20 54 68 65 20 73 75 62 71 75 65 72 79 20  )  The subquery 
17cf0 69 73 20 6e 6f 74 20 74 68 65 20 72 69 67 68 74  is not the right
17d00 20 6f 70 65 72 61 6e 64 20 6f 66 20 61 20 6c 65   operand of a le
17d10 66 74 20 6f 75 74 65 72 20 6a 6f 69 6e 2c 20 6f  ft outer join, o
17d20 72 0a 2a 2a 20 20 20 20 20 20 20 20 74 68 65 20  r.**        the 
17d30 73 75 62 71 75 65 72 79 20 69 73 20 6e 6f 74 20  subquery is not 
17d40 69 74 73 65 6c 66 20 61 20 6a 6f 69 6e 2e 20 20  itself a join.  
17d50 28 54 69 63 6b 65 74 20 23 33 30 36 29 0a 2a 2a  (Ticket #306).**
17d60 0a 2a 2a 20 20 20 28 34 29 20 20 54 68 65 20 73  .**   (4)  The s
17d70 75 62 71 75 65 72 79 20 69 73 20 6e 6f 74 20 44  ubquery is not D
17d80 49 53 54 49 4e 43 54 20 6f 72 20 74 68 65 20 6f  ISTINCT or the o
17d90 75 74 65 72 20 71 75 65 72 79 20 69 73 20 6e 6f  uter query is no
17da0 74 20 61 20 6a 6f 69 6e 2e 0a 2a 2a 0a 2a 2a 20  t a join..**.** 
17db0 20 20 28 35 29 20 20 54 68 65 20 73 75 62 71 75    (5)  The subqu
17dc0 65 72 79 20 69 73 20 6e 6f 74 20 44 49 53 54 49  ery is not DISTI
17dd0 4e 43 54 20 6f 72 20 74 68 65 20 6f 75 74 65 72  NCT or the outer
17de0 20 71 75 65 72 79 20 64 6f 65 73 20 6e 6f 74 20   query does not 
17df0 75 73 65 0a 2a 2a 20 20 20 20 20 20 20 20 61 67  use.**        ag
17e00 67 72 65 67 61 74 65 73 2e 0a 2a 2a 0a 2a 2a 20  gregates..**.** 
17e10 20 20 28 36 29 20 20 54 68 65 20 73 75 62 71 75    (6)  The subqu
17e20 65 72 79 20 64 6f 65 73 20 6e 6f 74 20 75 73 65  ery does not use
17e30 20 61 67 67 72 65 67 61 74 65 73 20 6f 72 20 74   aggregates or t
17e40 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 69  he outer query i
17e50 73 20 6e 6f 74 0a 2a 2a 20 20 20 20 20 20 20 20  s not.**        
17e60 44 49 53 54 49 4e 43 54 2e 0a 2a 2a 0a 2a 2a 20  DISTINCT..**.** 
17e70 20 20 28 37 29 20 20 54 68 65 20 73 75 62 71 75    (7)  The subqu
17e80 65 72 79 20 68 61 73 20 61 20 46 52 4f 4d 20 63  ery has a FROM c
17e90 6c 61 75 73 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 28  lause..**.**   (
17ea0 38 29 20 20 54 68 65 20 73 75 62 71 75 65 72 79  8)  The subquery
17eb0 20 64 6f 65 73 20 6e 6f 74 20 75 73 65 20 4c 49   does not use LI
17ec0 4d 49 54 20 6f 72 20 74 68 65 20 6f 75 74 65 72  MIT or the outer
17ed0 20 71 75 65 72 79 20 69 73 20 6e 6f 74 20 61 20   query is not a 
17ee0 6a 6f 69 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20 28 39  join..**.**   (9
17ef0 29 20 20 54 68 65 20 73 75 62 71 75 65 72 79 20  )  The subquery 
17f00 64 6f 65 73 20 6e 6f 74 20 75 73 65 20 4c 49 4d  does not use LIM
17f10 49 54 20 6f 72 20 74 68 65 20 6f 75 74 65 72 20  IT or the outer 
17f20 71 75 65 72 79 20 64 6f 65 73 20 6e 6f 74 20 75  query does not u
17f30 73 65 0a 2a 2a 20 20 20 20 20 20 20 20 61 67 67  se.**        agg
17f40 72 65 67 61 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 20  regates..**.**  
17f50 28 31 30 29 20 20 54 68 65 20 73 75 62 71 75 65  (10)  The subque
17f60 72 79 20 64 6f 65 73 20 6e 6f 74 20 75 73 65 20  ry does not use 
17f70 61 67 67 72 65 67 61 74 65 73 20 6f 72 20 74 68  aggregates or th
17f80 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 64 6f  e outer query do
17f90 65 73 20 6e 6f 74 0a 2a 2a 20 20 20 20 20 20 20  es not.**       
17fa0 20 75 73 65 20 4c 49 4d 49 54 2e 0a 2a 2a 0a 2a   use LIMIT..**.*
17fb0 2a 20 20 28 31 31 29 20 20 54 68 65 20 73 75 62  *  (11)  The sub
17fc0 71 75 65 72 79 20 61 6e 64 20 74 68 65 20 6f 75  query and the ou
17fd0 74 65 72 20 71 75 65 72 79 20 64 6f 20 6e 6f 74  ter query do not
17fe0 20 62 6f 74 68 20 68 61 76 65 20 4f 52 44 45 52   both have ORDER
17ff0 20 42 59 20 63 6c 61 75 73 65 73 2e 0a 2a 2a 0a   BY clauses..**.
18000 2a 2a 20 20 28 31 32 29 20 20 54 68 65 20 73 75  **  (12)  The su
18010 62 71 75 65 72 79 20 69 73 20 6e 6f 74 20 74 68  bquery is not th
18020 65 20 72 69 67 68 74 20 74 65 72 6d 20 6f 66 20  e right term of 
18030 61 20 4c 45 46 54 20 4f 55 54 45 52 20 4a 4f 49  a LEFT OUTER JOI
18040 4e 20 6f 72 20 74 68 65 0a 2a 2a 20 20 20 20 20  N or the.**     
18050 20 20 20 73 75 62 71 75 65 72 79 20 68 61 73 20     subquery has 
18060 6e 6f 20 57 48 45 52 45 20 63 6c 61 75 73 65 2e  no WHERE clause.
18070 20 20 28 61 64 64 65 64 20 62 79 20 74 69 63 6b    (added by tick
18080 65 74 20 23 33 35 30 29 0a 2a 2a 0a 2a 2a 20 20  et #350).**.**  
18090 28 31 33 29 20 20 54 68 65 20 73 75 62 71 75 65  (13)  The subque
180a0 72 79 20 61 6e 64 20 6f 75 74 65 72 20 71 75 65  ry and outer que
180b0 72 79 20 64 6f 20 6e 6f 74 20 62 6f 74 68 20 75  ry do not both u
180c0 73 65 20 4c 49 4d 49 54 0a 2a 2a 0a 2a 2a 20 20  se LIMIT.**.**  
180d0 28 31 34 29 20 20 54 68 65 20 73 75 62 71 75 65  (14)  The subque
180e0 72 79 20 64 6f 65 73 20 6e 6f 74 20 75 73 65 20  ry does not use 
180f0 4f 46 46 53 45 54 0a 2a 2a 0a 2a 2a 20 20 28 31  OFFSET.**.**  (1
18100 35 29 20 20 54 68 65 20 6f 75 74 65 72 20 71 75  5)  The outer qu
18110 65 72 79 20 69 73 20 6e 6f 74 20 70 61 72 74 20  ery is not part 
18120 6f 66 20 61 20 63 6f 6d 70 6f 75 6e 64 20 73 65  of a compound se
18130 6c 65 63 74 20 6f 72 20 74 68 65 0a 2a 2a 20 20  lect or the.**  
18140 20 20 20 20 20 20 73 75 62 71 75 65 72 79 20 64        subquery d
18150 6f 65 73 20 6e 6f 74 20 68 61 76 65 20 62 6f 74  oes not have bot
18160 68 20 61 6e 20 4f 52 44 45 52 20 42 59 20 61 6e  h an ORDER BY an
18170 64 20 61 20 4c 49 4d 49 54 20 63 6c 61 75 73 65  d a LIMIT clause
18180 2e 0a 2a 2a 20 20 20 20 20 20 20 20 28 53 65 65  ..**        (See
18190 20 74 69 63 6b 65 74 20 23 32 33 33 39 29 0a 2a   ticket #2339).*
181a0 2a 0a 2a 2a 20 20 28 31 36 29 20 20 54 68 65 20  *.**  (16)  The 
181b0 6f 75 74 65 72 20 71 75 65 72 79 20 69 73 20 6e  outer query is n
181c0 6f 74 20 61 6e 20 61 67 67 72 65 67 61 74 65 20  ot an aggregate 
181d0 6f 72 20 74 68 65 20 73 75 62 71 75 65 72 79 20  or the subquery 
181e0 64 6f 65 73 0a 2a 2a 20 20 20 20 20 20 20 20 6e  does.**        n
181f0 6f 74 20 63 6f 6e 74 61 69 6e 20 4f 52 44 45 52  ot contain ORDER
18200 20 42 59 2e 20 20 28 54 69 63 6b 65 74 20 23 32   BY.  (Ticket #2
18210 39 34 32 29 20 20 54 68 69 73 20 75 73 65 64 20  942)  This used 
18220 74 6f 20 6e 6f 74 20 6d 61 74 74 65 72 0a 2a 2a  to not matter.**
18230 20 20 20 20 20 20 20 20 75 6e 74 69 6c 20 77 65          until we
18240 20 69 6e 74 72 6f 64 75 63 65 64 20 74 68 65 20   introduced the 
18250 67 72 6f 75 70 5f 63 6f 6e 63 61 74 28 29 20 66  group_concat() f
18260 75 6e 63 74 69 6f 6e 2e 20 20 0a 2a 2a 0a 2a 2a  unction.  .**.**
18270 20 20 28 31 37 29 20 20 54 68 65 20 73 75 62 2d    (17)  The sub-
18280 71 75 65 72 79 20 69 73 20 6e 6f 74 20 61 20 63  query is not a c
18290 6f 6d 70 6f 75 6e 64 20 73 65 6c 65 63 74 2c 20  ompound select, 
182a0 6f 72 20 69 74 20 69 73 20 61 20 55 4e 49 4f 4e  or it is a UNION
182b0 20 41 4c 4c 20 0a 2a 2a 20 20 20 20 20 20 20 20   ALL .**        
182c0 63 6f 6d 70 6f 75 6e 64 20 63 6c 61 75 73 65 20  compound clause 
182d0 6d 61 64 65 20 75 70 20 65 6e 74 69 72 65 6c 79  made up entirely
182e0 20 6f 66 20 6e 6f 6e 2d 61 67 67 72 65 67 61 74   of non-aggregat
182f0 65 20 71 75 65 72 69 65 73 2c 20 61 6e 64 20 0a  e queries, and .
18300 2a 2a 20 20 20 20 20 20 20 20 74 68 65 20 70 61  **        the pa
18310 72 65 6e 74 20 71 75 65 72 79 3a 0a 2a 2a 0a 2a  rent query:.**.*
18320 2a 20 20 20 20 20 20 20 20 20 20 2a 20 69 73 20  *          * is 
18330 6e 6f 74 20 69 74 73 65 6c 66 20 70 61 72 74 20  not itself part 
18340 6f 66 20 61 20 63 6f 6d 70 6f 75 6e 64 20 73 65  of a compound se
18350 6c 65 63 74 2c 0a 2a 2a 20 20 20 20 20 20 20 20  lect,.**        
18360 20 20 2a 20 69 73 20 6e 6f 74 20 61 6e 20 61 67    * is not an ag
18370 67 72 65 67 61 74 65 20 6f 72 20 44 49 53 54 49  gregate or DISTI
18380 4e 43 54 20 71 75 65 72 79 2c 20 61 6e 64 0a 2a  NCT query, and.*
18390 2a 20 20 20 20 20 20 20 20 20 20 2a 20 68 61 73  *          * has
183a0 20 6e 6f 20 6f 74 68 65 72 20 74 61 62 6c 65 73   no other tables
183b0 20 6f 72 20 73 75 62 2d 73 65 6c 65 63 74 73 20   or sub-selects 
183c0 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75  in the FROM clau
183d0 73 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20  se..**.**       
183e0 20 54 68 65 20 70 61 72 65 6e 74 20 61 6e 64 20   The parent and 
183f0 73 75 62 2d 71 75 65 72 79 20 6d 61 79 20 63 6f  sub-query may co
18400 6e 74 61 69 6e 20 57 48 45 52 45 20 63 6c 61 75  ntain WHERE clau
18410 73 65 73 2e 20 53 75 62 6a 65 63 74 20 74 6f 0a  ses. Subject to.
18420 2a 2a 20 20 20 20 20 20 20 20 72 75 6c 65 73 20  **        rules 
18430 28 31 31 29 2c 20 28 31 33 29 20 61 6e 64 20 28  (11), (13) and (
18440 31 34 29 2c 20 74 68 65 79 20 6d 61 79 20 61 6c  14), they may al
18450 73 6f 20 63 6f 6e 74 61 69 6e 20 4f 52 44 45 52  so contain ORDER
18460 20 42 59 2c 0a 2a 2a 20 20 20 20 20 20 20 20 4c   BY,.**        L
18470 49 4d 49 54 20 61 6e 64 20 4f 46 46 53 45 54 20  IMIT and OFFSET 
18480 63 6c 61 75 73 65 73 2e 0a 2a 2a 0a 2a 2a 20 20  clauses..**.**  
18490 28 31 38 29 20 20 49 66 20 74 68 65 20 73 75 62  (18)  If the sub
184a0 2d 71 75 65 72 79 20 69 73 20 61 20 63 6f 6d 70  -query is a comp
184b0 6f 75 6e 64 20 73 65 6c 65 63 74 2c 20 74 68 65  ound select, the
184c0 6e 20 61 6c 6c 20 74 65 72 6d 73 20 6f 66 20 74  n all terms of t
184d0 68 65 0a 2a 2a 20 20 20 20 20 20 20 20 4f 52 44  he.**        ORD
184e0 45 52 20 62 79 20 63 6c 61 75 73 65 20 6f 66 20  ER by clause of 
184f0 74 68 65 20 70 61 72 65 6e 74 20 6d 75 73 74 20  the parent must 
18500 62 65 20 73 69 6d 70 6c 65 20 72 65 66 65 72 65  be simple refere
18510 6e 63 65 73 20 74 6f 20 0a 2a 2a 20 20 20 20 20  nces to .**     
18520 20 20 20 63 6f 6c 75 6d 6e 73 20 6f 66 20 74 68     columns of th
18530 65 20 73 75 62 2d 71 75 65 72 79 2e 0a 2a 2a 0a  e sub-query..**.
18540 2a 2a 20 49 6e 20 74 68 69 73 20 72 6f 75 74 69  ** In this routi
18550 6e 65 2c 20 74 68 65 20 22 70 22 20 70 61 72 61  ne, the "p" para
18560 6d 65 74 65 72 20 69 73 20 61 20 70 6f 69 6e 74  meter is a point
18570 65 72 20 74 6f 20 74 68 65 20 6f 75 74 65 72 20  er to the outer 
18580 71 75 65 72 79 2e 0a 2a 2a 20 54 68 65 20 73 75  query..** The su
18590 62 71 75 65 72 79 20 69 73 20 70 2d 3e 70 53 72  bquery is p->pSr
185a0 63 2d 3e 61 5b 69 46 72 6f 6d 5d 2e 20 20 69 73  c->a[iFrom].  is
185b0 41 67 67 20 69 73 20 74 72 75 65 20 69 66 20 74  Agg is true if t
185c0 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 0a 2a  he outer query.*
185d0 2a 20 75 73 65 73 20 61 67 67 72 65 67 61 74 65  * uses aggregate
185e0 73 20 61 6e 64 20 73 75 62 71 75 65 72 79 49 73  s and subqueryIs
185f0 41 67 67 20 69 73 20 74 72 75 65 20 69 66 20 74  Agg is true if t
18600 68 65 20 73 75 62 71 75 65 72 79 20 75 73 65 73  he subquery uses
18610 20 61 67 67 72 65 67 61 74 65 73 2e 0a 2a 2a 0a   aggregates..**.
18620 2a 2a 20 49 66 20 66 6c 61 74 74 65 6e 69 6e 67  ** If flattening
18630 20 69 73 20 6e 6f 74 20 61 74 74 65 6d 70 74 65   is not attempte
18640 64 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  d, this routine 
18650 69 73 20 61 20 6e 6f 2d 6f 70 20 61 6e 64 20 72  is a no-op and r
18660 65 74 75 72 6e 73 20 30 2e 0a 2a 2a 20 49 66 20  eturns 0..** If 
18670 66 6c 61 74 74 65 6e 69 6e 67 20 69 73 20 61 74  flattening is at
18680 74 65 6d 70 74 65 64 20 74 68 69 73 20 72 6f 75  tempted this rou
18690 74 69 6e 65 20 72 65 74 75 72 6e 73 20 31 2e 0a  tine returns 1..
186a0 2a 2a 0a 2a 2a 20 41 6c 6c 20 6f 66 20 74 68 65  **.** All of the
186b0 20 65 78 70 72 65 73 73 69 6f 6e 20 61 6e 61 6c   expression anal
186c0 79 73 69 73 20 6d 75 73 74 20 6f 63 63 75 72 20  ysis must occur 
186d0 6f 6e 20 62 6f 74 68 20 74 68 65 20 6f 75 74 65  on both the oute
186e0 72 20 71 75 65 72 79 20 61 6e 64 0a 2a 2a 20 74  r query and.** t
186f0 68 65 20 73 75 62 71 75 65 72 79 20 62 65 66 6f  he subquery befo
18700 72 65 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  re this routine 
18710 72 75 6e 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  runs..*/.static 
18720 69 6e 74 20 66 6c 61 74 74 65 6e 53 75 62 71 75  int flattenSubqu
18730 65 72 79 28 0a 20 20 50 61 72 73 65 20 2a 70 50  ery(.  Parse *pP
18740 61 72 73 65 2c 20 20 20 20 20 20 20 2f 2a 20 50  arse,       /* P
18750 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a  arsing context *
18760 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 2c 20 20  /.  Select *p,  
18770 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
18780 70 61 72 65 6e 74 20 6f 72 20 6f 75 74 65 72 20  parent or outer 
18790 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
187a0 20 2a 2f 0a 20 20 69 6e 74 20 69 46 72 6f 6d 2c   */.  int iFrom,
187b0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
187c0 64 65 78 20 69 6e 20 70 2d 3e 70 53 72 63 2d 3e  dex in p->pSrc->
187d0 61 5b 5d 20 6f 66 20 74 68 65 20 69 6e 6e 65 72  a[] of the inner
187e0 20 73 75 62 71 75 65 72 79 20 2a 2f 0a 20 20 69   subquery */.  i
187f0 6e 74 20 69 73 41 67 67 2c 20 20 20 20 20 20 20  nt isAgg,       
18800 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 6f      /* True if o
18810 75 74 65 72 20 53 45 4c 45 43 54 20 75 73 65 73  uter SELECT uses
18820 20 61 67 67 72 65 67 61 74 65 20 66 75 6e 63 74   aggregate funct
18830 69 6f 6e 73 20 2a 2f 0a 20 20 69 6e 74 20 73 75  ions */.  int su
18840 62 71 75 65 72 79 49 73 41 67 67 20 20 20 20 2f  bqueryIsAgg    /
18850 2a 20 54 72 75 65 20 69 66 20 74 68 65 20 73 75  * True if the su
18860 62 71 75 65 72 79 20 75 73 65 73 20 61 67 67 72  bquery uses aggr
18870 65 67 61 74 65 20 66 75 6e 63 74 69 6f 6e 73 20  egate functions 
18880 2a 2f 0a 29 7b 0a 20 20 63 6f 6e 73 74 20 63 68  */.){.  const ch
18890 61 72 20 2a 7a 53 61 76 65 64 41 75 74 68 43 6f  ar *zSavedAuthCo
188a0 6e 74 65 78 74 20 3d 20 70 50 61 72 73 65 2d 3e  ntext = pParse->
188b0 7a 41 75 74 68 43 6f 6e 74 65 78 74 3b 0a 20 20  zAuthContext;.  
188c0 53 65 6c 65 63 74 20 2a 70 50 61 72 65 6e 74 3b  Select *pParent;
188d0 0a 20 20 53 65 6c 65 63 74 20 2a 70 53 75 62 3b  .  Select *pSub;
188e0 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 69 6e         /* The in
188f0 6e 65 72 20 71 75 65 72 79 20 6f 72 20 22 73 75  ner query or "su
18900 62 71 75 65 72 79 22 20 2a 2f 0a 20 20 53 65 6c  bquery" */.  Sel
18910 65 63 74 20 2a 70 53 75 62 31 3b 20 20 20 20 20  ect *pSub1;     
18920 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 74   /* Pointer to t
18930 68 65 20 72 69 67 68 74 6d 6f 73 74 20 73 65 6c  he rightmost sel
18940 65 63 74 20 69 6e 20 73 75 62 2d 71 75 65 72 79  ect in sub-query
18950 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a 70   */.  SrcList *p
18960 53 72 63 3b 20 20 20 20 20 20 2f 2a 20 54 68 65  Src;      /* The
18970 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20   FROM clause of 
18980 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20  the outer query 
18990 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 53  */.  SrcList *pS
189a0 75 62 53 72 63 3b 20 20 20 2f 2a 20 54 68 65 20  ubSrc;   /* The 
189b0 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20 74  FROM clause of t
189c0 68 65 20 73 75 62 71 75 65 72 79 20 2a 2f 0a 20  he subquery */. 
189d0 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74   ExprList *pList
189e0 3b 20 20 20 20 2f 2a 20 54 68 65 20 72 65 73 75  ;    /* The resu
189f0 6c 74 20 73 65 74 20 6f 66 20 74 68 65 20 6f 75  lt set of the ou
18a00 74 65 72 20 71 75 65 72 79 20 2a 2f 0a 20 20 69  ter query */.  i
18a10 6e 74 20 69 50 61 72 65 6e 74 3b 20 20 20 20 20  nt iParent;     
18a20 20 20 20 2f 2a 20 56 44 42 45 20 63 75 72 73 6f     /* VDBE curso
18a30 72 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20  r number of the 
18a40 70 53 75 62 20 72 65 73 75 6c 74 20 73 65 74 20  pSub result set 
18a50 74 65 6d 70 20 74 61 62 6c 65 20 2a 2f 0a 20 20  temp table */.  
18a60 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20 20  int i;          
18a70 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e      /* Loop coun
18a80 74 65 72 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70  ter */.  Expr *p
18a90 57 68 65 72 65 3b 20 20 20 20 20 20 20 20 20 20  Where;          
18aa0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
18ab0 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 2a 2f   WHERE clause */
18ac0 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73  .  struct SrcLis
18ad0 74 5f 69 74 65 6d 20 2a 70 53 75 62 69 74 65 6d  t_item *pSubitem
18ae0 3b 20 20 20 2f 2a 20 54 68 65 20 73 75 62 71 75  ;   /* The subqu
18af0 65 72 79 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ery */.  sqlite3
18b00 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64   *db = pParse->d
18b10 62 3b 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 74  b;..  /* Check t
18b20 6f 20 73 65 65 20 69 66 20 66 6c 61 74 74 65 6e  o see if flatten
18b30 69 6e 67 20 69 73 20 70 65 72 6d 69 74 74 65 64  ing is permitted
18b40 2e 20 20 52 65 74 75 72 6e 20 30 20 69 66 20 6e  .  Return 0 if n
18b50 6f 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  ot..  */.  if( p
18b60 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  ==0 ) return 0;.
18b70 20 20 70 53 72 63 20 3d 20 70 2d 3e 70 53 72 63    pSrc = p->pSrc
18b80 3b 0a 20 20 61 73 73 65 72 74 28 20 70 53 72 63  ;.  assert( pSrc
18b90 20 26 26 20 69 46 72 6f 6d 3e 3d 30 20 26 26 20   && iFrom>=0 && 
18ba0 69 46 72 6f 6d 3c 70 53 72 63 2d 3e 6e 53 72 63  iFrom<pSrc->nSrc
18bb0 20 29 3b 0a 20 20 70 53 75 62 69 74 65 6d 20 3d   );.  pSubitem =
18bc0 20 26 70 53 72 63 2d 3e 61 5b 69 46 72 6f 6d 5d   &pSrc->a[iFrom]
18bd0 3b 0a 20 20 69 50 61 72 65 6e 74 20 3d 20 70 53  ;.  iParent = pS
18be0 75 62 69 74 65 6d 2d 3e 69 43 75 72 73 6f 72 3b  ubitem->iCursor;
18bf0 0a 20 20 70 53 75 62 20 3d 20 70 53 75 62 69 74  .  pSub = pSubit
18c00 65 6d 2d 3e 70 53 65 6c 65 63 74 3b 0a 20 20 61  em->pSelect;.  a
18c10 73 73 65 72 74 28 20 70 53 75 62 21 3d 30 20 29  ssert( pSub!=0 )
18c20 3b 0a 20 20 69 66 28 20 69 73 41 67 67 20 26 26  ;.  if( isAgg &&
18c30 20 73 75 62 71 75 65 72 79 49 73 41 67 67 20 29   subqueryIsAgg )
18c40 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20   return 0;      
18c50 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
18c60 73 74 72 69 63 74 69 6f 6e 20 28 31 29 20 20 2a  striction (1)  *
18c70 2f 0a 20 20 69 66 28 20 73 75 62 71 75 65 72 79  /.  if( subquery
18c80 49 73 41 67 67 20 26 26 20 70 53 72 63 2d 3e 6e  IsAgg && pSrc->n
18c90 53 72 63 3e 31 20 29 20 72 65 74 75 72 6e 20 30  Src>1 ) return 0
18ca0 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65  ;          /* Re
18cb0 73 74 72 69 63 74 69 6f 6e 20 28 32 29 20 20 2a  striction (2)  *
18cc0 2f 0a 20 20 70 53 75 62 53 72 63 20 3d 20 70 53  /.  pSubSrc = pS
18cd0 75 62 2d 3e 70 53 72 63 3b 0a 20 20 61 73 73 65  ub->pSrc;.  asse
18ce0 72 74 28 20 70 53 75 62 53 72 63 20 29 3b 0a 20  rt( pSubSrc );. 
18cf0 20 2f 2a 20 50 72 69 6f 72 20 74 6f 20 76 65 72   /* Prior to ver
18d00 73 69 6f 6e 20 33 2e 31 2e 32 2c 20 77 68 65 6e  sion 3.1.2, when
18d10 20 4c 49 4d 49 54 20 61 6e 64 20 4f 46 46 53 45   LIMIT and OFFSE
18d20 54 20 68 61 64 20 74 6f 20 62 65 20 73 69 6d 70  T had to be simp
18d30 6c 65 20 63 6f 6e 73 74 61 6e 74 73 2c 0a 20 20  le constants,.  
18d40 2a 2a 20 6e 6f 74 20 61 72 62 69 74 72 61 72 79  ** not arbitrary
18d50 20 65 78 70 72 65 73 73 73 69 6f 6e 73 2c 20 77   expresssions, w
18d60 65 20 61 6c 6c 6f 77 65 64 20 73 6f 6d 65 20 63  e allowed some c
18d70 6f 6d 62 69 6e 69 6e 67 20 6f 66 20 4c 49 4d 49  ombining of LIMI
18d80 54 20 61 6e 64 20 4f 46 46 53 45 54 0a 20 20 2a  T and OFFSET.  *
18d90 2a 20 62 65 63 61 75 73 65 20 74 68 65 79 20 63  * because they c
18da0 6f 75 6c 64 20 62 65 20 63 6f 6d 70 75 74 65 64  ould be computed
18db0 20 61 74 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65   at compile-time
18dc0 2e 20 20 42 75 74 20 77 68 65 6e 20 4c 49 4d 49  .  But when LIMI
18dd0 54 20 61 6e 64 20 4f 46 46 53 45 54 0a 20 20 2a  T and OFFSET.  *
18de0 2a 20 62 65 63 61 6d 65 20 61 72 62 69 74 72 61  * became arbitra
18df0 72 79 20 65 78 70 72 65 73 73 69 6f 6e 73 2c 20  ry expressions, 
18e00 77 65 20 77 65 72 65 20 66 6f 72 63 65 64 20 74  we were forced t
18e10 6f 20 61 64 64 20 72 65 73 74 72 69 63 74 69 6f  o add restrictio
18e20 6e 73 20 28 31 33 29 0a 20 20 2a 2a 20 61 6e 64  ns (13).  ** and
18e30 20 28 31 34 29 2e 20 2a 2f 0a 20 20 69 66 28 20   (14). */.  if( 
18e40 70 53 75 62 2d 3e 70 4c 69 6d 69 74 20 26 26 20  pSub->pLimit && 
18e50 70 2d 3e 70 4c 69 6d 69 74 20 29 20 72 65 74 75  p->pLimit ) retu
18e60 72 6e 20 30 3b 20 20 20 20 20 20 20 20 20 20 20  rn 0;           
18e70 20 20 20 2f 2a 20 52 65 73 74 72 69 63 74 69 6f     /* Restrictio
18e80 6e 20 28 31 33 29 20 2a 2f 0a 20 20 69 66 28 20  n (13) */.  if( 
18e90 70 53 75 62 2d 3e 70 4f 66 66 73 65 74 20 29 20  pSub->pOffset ) 
18ea0 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20  return 0;       
18eb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18ec0 20 20 20 2f 2a 20 52 65 73 74 72 69 63 74 69 6f     /* Restrictio
18ed0 6e 20 28 31 34 29 20 2a 2f 0a 20 20 69 66 28 20  n (14) */.  if( 
18ee0 70 2d 3e 70 52 69 67 68 74 6d 6f 73 74 20 26 26  p->pRightmost &&
18ef0 20 70 53 75 62 2d 3e 70 4c 69 6d 69 74 20 26 26   pSub->pLimit &&
18f00 20 70 53 75 62 2d 3e 70 4f 72 64 65 72 42 79 20   pSub->pOrderBy 
18f10 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b  ){.    return 0;
18f20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18f30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
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 31 35 29 20  estriction (15) 
18f60 2a 2f 0a 20 20 7d 0a 20 20 69 66 28 20 70 53 75  */.  }.  if( pSu
18f70 62 53 72 63 2d 3e 6e 53 72 63 3d 3d 30 20 29 20  bSrc->nSrc==0 ) 
18f80 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20  return 0;       
18f90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18fa0 2f 2a 20 52 65 73 74 72 69 63 74 69 6f 6e 20 28  /* Restriction (
18fb0 37 29 20 20 2a 2f 0a 20 20 69 66 28 20 28 70 53  7)  */.  if( (pS
18fc0 75 62 2d 3e 69 73 44 69 73 74 69 6e 63 74 20 7c  ub->isDistinct |
18fd0 7c 20 70 53 75 62 2d 3e 70 4c 69 6d 69 74 29 20  | pSub->pLimit) 
18fe0 0a 20 20 20 20 20 20 20 20 20 26 26 20 28 70 53  .         && (pS
18ff0 72 63 2d 3e 6e 53 72 63 3e 31 20 7c 7c 20 69 73  rc->nSrc>1 || is
19000 41 67 67 29 20 29 7b 20 20 20 20 20 20 20 20 20  Agg) ){         
19010 20 2f 2a 20 52 65 73 74 72 69 63 74 69 6f 6e 73   /* Restrictions
19020 20 28 34 29 28 35 29 28 38 29 28 39 29 20 2a 2f   (4)(5)(8)(9) */
19030 0a 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 20  .     return 0; 
19040 20 20 20 20 20 20 0a 20 20 7d 0a 20 20 69 66 28        .  }.  if(
19050 20 70 2d 3e 69 73 44 69 73 74 69 6e 63 74 20 26   p->isDistinct &
19060 26 20 73 75 62 71 75 65 72 79 49 73 41 67 67 20  & subqueryIsAgg 
19070 29 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20  ) return 0;     
19080 20 20 20 20 2f 2a 20 52 65 73 74 72 69 63 74 69      /* Restricti
19090 6f 6e 20 28 36 29 20 20 2a 2f 0a 20 20 69 66 28  on (6)  */.  if(
190a0 20 28 70 2d 3e 64 69 73 61 6c 6c 6f 77 4f 72 64   (p->disallowOrd
190b0 65 72 42 79 20 7c 7c 20 70 2d 3e 70 4f 72 64 65  erBy || p->pOrde
190c0 72 42 79 29 20 26 26 20 70 53 75 62 2d 3e 70 4f  rBy) && pSub->pO
190d0 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20 20 72  rderBy ){.     r
190e0 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20 20  eturn 0;        
190f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19100 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19110 20 20 20 2f 2a 20 52 65 73 74 72 69 63 74 69 6f     /* Restrictio
19120 6e 20 28 31 31 29 20 2a 2f 0a 20 20 7d 0a 20 20  n (11) */.  }.  
19130 69 66 28 20 69 73 41 67 67 20 26 26 20 70 53 75  if( isAgg && pSu
19140 62 2d 3e 70 4f 72 64 65 72 42 79 20 29 20 72 65  b->pOrderBy ) re
19150 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20 20 20  turn 0;         
19160 20 20 20 20 20 20 20 2f 2a 20 52 65 73 74 72 69         /* Restri
19170 63 74 69 6f 6e 20 28 31 36 29 20 2a 2f 0a 0a 20  ction (16) */.. 
19180 20 2f 2a 20 52 65 73 74 72 69 63 74 69 6f 6e 20   /* Restriction 
19190 33 3a 20 20 49 66 20 74 68 65 20 73 75 62 71 75  3:  If the subqu
191a0 65 72 79 20 69 73 20 61 20 6a 6f 69 6e 2c 20 6d  ery is a join, m
191b0 61 6b 65 20 73 75 72 65 20 74 68 65 20 73 75 62  ake sure the sub
191c0 71 75 65 72 79 20 69 73 20 0a 20 20 2a 2a 20 6e  query is .  ** n
191d0 6f 74 20 75 73 65 64 20 61 73 20 74 68 65 20 72  ot used as the r
191e0 69 67 68 74 20 6f 70 65 72 61 6e 64 20 6f 66 20  ight operand of 
191f0 61 6e 20 6f 75 74 65 72 20 6a 6f 69 6e 2e 20 20  an outer join.  
19200 45 78 61 6d 70 6c 65 73 20 6f 66 20 77 68 79 20  Examples of why 
19210 74 68 69 73 0a 20 20 2a 2a 20 69 73 20 6e 6f 74  this.  ** is not
19220 20 61 6c 6c 6f 77 65 64 3a 0a 20 20 2a 2a 0a 20   allowed:.  **. 
19230 20 2a 2a 20 20 20 20 20 20 20 20 20 74 31 20 4c   **         t1 L
19240 45 46 54 20 4f 55 54 45 52 20 4a 4f 49 4e 20 28  EFT OUTER JOIN (
19250 74 32 20 4a 4f 49 4e 20 74 33 29 0a 20 20 2a 2a  t2 JOIN t3).  **
19260 0a 20 20 2a 2a 20 49 66 20 77 65 20 66 6c 61 74  .  ** If we flat
19270 74 65 6e 20 74 68 65 20 61 62 6f 76 65 2c 20 77  ten the above, w
19280 65 20 77 6f 75 6c 64 20 67 65 74 0a 20 20 2a 2a  e would get.  **
19290 0a 20 20 2a 2a 20 20 20 20 20 20 20 20 20 28 74  .  **         (t
192a0 31 20 4c 45 46 54 20 4f 55 54 45 52 20 4a 4f 49  1 LEFT OUTER JOI
192b0 4e 20 74 32 29 20 4a 4f 49 4e 20 74 33 0a 20 20  N t2) JOIN t3.  
192c0 2a 2a 0a 20 20 2a 2a 20 77 68 69 63 68 20 69 73  **.  ** which is
192d0 20 6e 6f 74 20 61 74 20 61 6c 6c 20 74 68 65 20   not at all the 
192e0 73 61 6d 65 20 74 68 69 6e 67 2e 0a 20 20 2a 2f  same thing..  */
192f0 0a 20 20 69 66 28 20 70 53 75 62 53 72 63 2d 3e  .  if( pSubSrc->
19300 6e 53 72 63 3e 31 20 26 26 20 28 70 53 75 62 69  nSrc>1 && (pSubi
19310 74 65 6d 2d 3e 6a 6f 69 6e 74 79 70 65 20 26 20  tem->jointype & 
19320 4a 54 5f 4f 55 54 45 52 29 21 3d 30 20 29 7b 0a  JT_OUTER)!=0 ){.
19330 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
19340 7d 0a 0a 20 20 2f 2a 20 52 65 73 74 72 69 63 74  }..  /* Restrict
19350 69 6f 6e 20 31 32 3a 20 20 49 66 20 74 68 65 20  ion 12:  If the 
19360 73 75 62 71 75 65 72 79 20 69 73 20 74 68 65 20  subquery is the 
19370 72 69 67 68 74 20 6f 70 65 72 61 6e 64 20 6f 66  right operand of
19380 20 61 20 6c 65 66 74 20 6f 75 74 65 72 0a 20 20   a left outer.  
19390 2a 2a 20 6a 6f 69 6e 2c 20 6d 61 6b 65 20 73 75  ** join, make su
193a0 72 65 20 74 68 65 20 73 75 62 71 75 65 72 79 20  re the subquery 
193b0 68 61 73 20 6e 6f 20 57 48 45 52 45 20 63 6c 61  has no WHERE cla
193c0 75 73 65 2e 0a 20 20 2a 2a 20 41 6e 20 65 78 61  use..  ** An exa
193d0 6d 70 6c 65 73 20 6f 66 20 77 68 79 20 74 68 69  mples of why thi
193e0 73 20 69 73 20 6e 6f 74 20 61 6c 6c 6f 77 65 64  s is not allowed
193f0 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20  :.  **.  **     
19400 20 20 20 20 74 31 20 4c 45 46 54 20 4f 55 54 45      t1 LEFT OUTE
19410 52 20 4a 4f 49 4e 20 28 53 45 4c 45 43 54 20 2a  R JOIN (SELECT *
19420 20 46 52 4f 4d 20 74 32 20 57 48 45 52 45 20 74   FROM t2 WHERE t
19430 32 2e 78 3e 30 29 0a 20 20 2a 2a 0a 20 20 2a 2a  2.x>0).  **.  **
19440 20 49 66 20 77 65 20 66 6c 61 74 74 65 6e 20 74   If we flatten t
19450 68 65 20 61 62 6f 76 65 2c 20 77 65 20 77 6f 75  he above, we wou
19460 6c 64 20 67 65 74 0a 20 20 2a 2a 0a 20 20 2a 2a  ld get.  **.  **
19470 20 20 20 20 20 20 20 20 20 28 74 31 20 4c 45 46           (t1 LEF
19480 54 20 4f 55 54 45 52 20 4a 4f 49 4e 20 74 32 29  T OUTER JOIN t2)
19490 20 57 48 45 52 45 20 74 32 2e 78 3e 30 0a 20 20   WHERE t2.x>0.  
194a0 2a 2a 0a 20 20 2a 2a 20 42 75 74 20 74 68 65 20  **.  ** But the 
194b0 74 32 2e 78 3e 30 20 74 65 73 74 20 77 69 6c 6c  t2.x>0 test will
194c0 20 61 6c 77 61 79 73 20 66 61 69 6c 20 6f 6e 20   always fail on 
194d0 61 20 4e 55 4c 4c 20 72 6f 77 20 6f 66 20 74 32  a NULL row of t2
194e0 2c 20 77 68 69 63 68 0a 20 20 2a 2a 20 65 66 66  , which.  ** eff
194f0 65 63 74 69 76 65 6c 79 20 63 6f 6e 76 65 72 74  ectively convert
19500 73 20 74 68 65 20 4f 55 54 45 52 20 4a 4f 49 4e  s the OUTER JOIN
19510 20 69 6e 74 6f 20 61 6e 20 49 4e 4e 45 52 20 4a   into an INNER J
19520 4f 49 4e 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  OIN..  */.  if( 
19530 28 70 53 75 62 69 74 65 6d 2d 3e 6a 6f 69 6e 74  (pSubitem->joint
19540 79 70 65 20 26 20 4a 54 5f 4f 55 54 45 52 29 21  ype & JT_OUTER)!
19550 3d 30 20 26 26 20 70 53 75 62 2d 3e 70 57 68 65  =0 && pSub->pWhe
19560 72 65 21 3d 30 20 29 7b 0a 20 20 20 20 72 65 74  re!=0 ){.    ret
19570 75 72 6e 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  urn 0;.  }..  /*
19580 20 52 65 73 74 72 69 63 74 69 6f 6e 20 31 37 3a   Restriction 17:
19590 20 49 66 20 74 68 65 20 73 75 62 2d 71 75 65 72   If the sub-quer
195a0 79 20 69 73 20 61 20 63 6f 6d 70 6f 75 6e 64 20  y is a compound 
195b0 53 45 4c 45 43 54 2c 20 74 68 65 6e 20 69 74 20  SELECT, then it 
195c0 6d 75 73 74 0a 20 20 2a 2a 20 75 73 65 20 6f 6e  must.  ** use on
195d0 6c 79 20 74 68 65 20 55 4e 49 4f 4e 20 41 4c 4c  ly the UNION ALL
195e0 20 6f 70 65 72 61 74 6f 72 2e 20 41 6e 64 20 6e   operator. And n
195f0 6f 6e 65 20 6f 66 20 74 68 65 20 73 69 6d 70 6c  one of the simpl
19600 65 20 73 65 6c 65 63 74 20 71 75 65 72 69 65 73  e select queries
19610 0a 20 20 2a 2a 20 74 68 61 74 20 6d 61 6b 65 20  .  ** that make 
19620 75 70 20 74 68 65 20 63 6f 6d 70 6f 75 6e 64 20  up the compound 
19630 53 45 4c 45 43 54 20 61 72 65 20 61 6c 6c 6f 77  SELECT are allow
19640 65 64 20 74 6f 20 62 65 20 61 67 67 72 65 67 61  ed to be aggrega
19650 74 65 20 6f 72 20 64 69 73 74 69 6e 63 74 0a 20  te or distinct. 
19660 20 2a 2a 20 71 75 65 72 69 65 73 2e 0a 20 20 2a   ** queries..  *
19670 2f 0a 20 20 69 66 28 20 70 53 75 62 2d 3e 70 50  /.  if( pSub->pP
19680 72 69 6f 72 20 29 7b 0a 20 20 20 20 69 66 28 20  rior ){.    if( 
19690 70 2d 3e 70 50 72 69 6f 72 20 7c 7c 20 69 73 41  p->pPrior || isA
196a0 67 67 20 7c 7c 20 70 2d 3e 69 73 44 69 73 74 69  gg || p->isDisti
196b0 6e 63 74 20 7c 7c 20 70 53 72 63 2d 3e 6e 53 72  nct || pSrc->nSr
196c0 63 21 3d 31 20 29 7b 0a 20 20 20 20 20 20 72 65  c!=1 ){.      re
196d0 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 20 20  turn 0;.    }.  
196e0 20 20 66 6f 72 28 70 53 75 62 31 3d 70 53 75 62    for(pSub1=pSub
196f0 3b 20 70 53 75 62 31 3b 20 70 53 75 62 31 3d 70  ; pSub1; pSub1=p
19700 53 75 62 31 2d 3e 70 50 72 69 6f 72 29 7b 0a 20  Sub1->pPrior){. 
19710 20 20 20 20 20 69 66 28 20 70 53 75 62 31 2d 3e       if( pSub1->
19720 69 73 41 67 67 20 7c 7c 20 70 53 75 62 31 2d 3e  isAgg || pSub1->
19730 69 73 44 69 73 74 69 6e 63 74 20 0a 20 20 20 20  isDistinct .    
19740 20 20 20 7c 7c 20 28 70 53 75 62 31 2d 3e 70 50     || (pSub1->pP
19750 72 69 6f 72 20 26 26 20 70 53 75 62 31 2d 3e 6f  rior && pSub1->o
19760 70 21 3d 54 4b 5f 41 4c 4c 29 20 29 7b 0a 20 20  p!=TK_ALL) ){.  
19770 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a        return 0;.
19780 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20        }.    }.. 
19790 20 20 20 2f 2a 20 52 65 73 74 72 69 63 74 69 6f     /* Restrictio
197a0 6e 20 31 38 2e 20 2a 2f 0a 20 20 20 20 69 66 28  n 18. */.    if(
197b0 20 70 2d 3e 70 4f 72 64 65 72 42 79 20 29 7b 0a   p->pOrderBy ){.
197c0 20 20 20 20 20 20 69 6e 74 20 69 69 3b 0a 20 20        int ii;.  
197d0 20 20 20 20 66 6f 72 28 69 69 3d 30 3b 20 69 69      for(ii=0; ii
197e0 3c 70 2d 3e 70 4f 72 64 65 72 42 79 2d 3e 6e 45  <p->pOrderBy->nE
197f0 78 70 72 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20  xpr; ii++){.    
19800 20 20 20 20 45 78 70 72 20 2a 70 45 78 70 72 20      Expr *pExpr 
19810 3d 20 70 2d 3e 70 4f 72 64 65 72 42 79 2d 3e 61  = p->pOrderBy->a
19820 5b 69 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20  [ii].pExpr;.    
19830 20 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e 6f      if( pExpr->o
19840 70 21 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 7c 7c 20  p!=TK_COLUMN || 
19850 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 21 3d 69  pExpr->iTable!=i
19860 50 61 72 65 6e 74 20 29 7b 20 0a 20 20 20 20 20  Parent ){ .     
19870 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20       return 0;. 
19880 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
19890 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 70 50  .    }.  }..  pP
198a0 61 72 73 65 2d 3e 7a 41 75 74 68 43 6f 6e 74 65  arse->zAuthConte
198b0 78 74 20 3d 20 70 53 75 62 69 74 65 6d 2d 3e 7a  xt = pSubitem->z
198c0 4e 61 6d 65 3b 0a 20 20 73 71 6c 69 74 65 33 41  Name;.  sqlite3A
198d0 75 74 68 43 68 65 63 6b 28 70 50 61 72 73 65 2c  uthCheck(pParse,
198e0 20 53 51 4c 49 54 45 5f 53 45 4c 45 43 54 2c 20   SQLITE_SELECT, 
198f0 30 2c 20 30 2c 20 30 29 3b 0a 20 20 70 50 61 72  0, 0, 0);.  pPar
19900 73 65 2d 3e 7a 41 75 74 68 43 6f 6e 74 65 78 74  se->zAuthContext
19910 20 3d 20 7a 53 61 76 65 64 41 75 74 68 43 6f 6e   = zSavedAuthCon
19920 74 65 78 74 3b 0a 0a 20 20 2f 2a 20 49 66 20 74  text;..  /* If t
19930 68 65 20 73 75 62 2d 71 75 65 72 79 20 69 73 20  he sub-query is 
19940 61 20 63 6f 6d 70 6f 75 6e 64 20 53 45 4c 45 43  a compound SELEC
19950 54 20 73 74 61 74 65 6d 65 6e 74 2c 20 74 68 65  T statement, the
19960 6e 20 69 74 20 6d 75 73 74 20 62 65 0a 20 20 2a  n it must be.  *
19970 2a 20 61 20 55 4e 49 4f 4e 20 41 4c 4c 20 61 6e  * a UNION ALL an
19980 64 20 74 68 65 20 70 61 72 65 6e 74 20 71 75 65  d the parent que
19990 72 79 20 6d 75 73 74 20 62 65 20 6f 66 20 74 68  ry must be of th
199a0 65 20 66 6f 72 6d 3a 0a 20 20 2a 2a 0a 20 20 2a  e form:.  **.  *
199b0 2a 20 20 20 20 20 53 45 4c 45 43 54 20 3c 65 78  *     SELECT <ex
199c0 70 72 2d 6c 69 73 74 3e 20 46 52 4f 4d 20 28 3c  pr-list> FROM (<
199d0 73 75 62 2d 71 75 65 72 79 3e 29 20 3c 77 68 65  sub-query>) <whe
199e0 72 65 2d 63 6c 61 75 73 65 3e 20 0a 20 20 2a 2a  re-clause> .  **
199f0 0a 20 20 2a 2a 20 66 6f 6c 6c 6f 77 65 64 20 62  .  ** followed b
19a00 79 20 61 6e 79 20 4f 52 44 45 52 20 42 59 2c 20  y any ORDER BY, 
19a10 4c 49 4d 49 54 20 61 6e 64 2f 6f 72 20 4f 46 46  LIMIT and/or OFF
19a20 53 45 54 20 63 6c 61 75 73 65 73 2e 20 54 68 69  SET clauses. Thi
19a30 73 20 62 6c 6f 63 6b 0a 20 20 2a 2a 20 63 72 65  s block.  ** cre
19a40 61 74 65 73 20 4e 20 63 6f 70 69 65 73 20 6f 66  ates N copies of
19a50 20 74 68 65 20 70 61 72 65 6e 74 20 71 75 65 72   the parent quer
19a60 79 20 77 69 74 68 6f 75 74 20 61 6e 79 20 4f 52  y without any OR
19a70 44 45 52 20 42 59 2c 20 4c 49 4d 49 54 20 6f 72  DER BY, LIMIT or
19a80 20 0a 20 20 2a 2a 20 4f 46 46 53 45 54 20 63 6c   .  ** OFFSET cl
19a90 61 75 73 65 73 20 61 6e 64 20 6a 6f 69 6e 73 20  auses and joins 
19aa0 74 68 65 6d 20 74 6f 20 74 68 65 20 6c 65 66 74  them to the left
19ab0 2d 68 61 6e 64 2d 73 69 64 65 20 6f 66 20 74 68  -hand-side of th
19ac0 65 20 6f 72 69 67 69 6e 61 6c 0a 20 20 2a 2a 20  e original.  ** 
19ad0 75 73 69 6e 67 20 55 4e 49 4f 4e 20 41 4c 4c 20  using UNION ALL 
19ae0 6f 70 65 72 61 74 6f 72 73 2e 20 49 6e 20 74 68  operators. In th
19af0 69 73 20 63 61 73 65 20 4e 20 69 73 20 74 68 65  is case N is the
19b00 20 6e 75 6d 62 65 72 20 6f 66 20 73 69 6d 70 6c   number of simpl
19b10 65 0a 20 20 2a 2a 20 73 65 6c 65 63 74 20 73 74  e.  ** select st
19b20 61 74 65 6d 65 6e 74 73 20 69 6e 20 74 68 65 20  atements in the 
19b30 63 6f 6d 70 6f 75 6e 64 20 73 75 62 2d 71 75 65  compound sub-que
19b40 72 79 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 70  ry..  */.  for(p
19b50 53 75 62 3d 70 53 75 62 2d 3e 70 50 72 69 6f 72  Sub=pSub->pPrior
19b60 3b 20 70 53 75 62 3b 20 70 53 75 62 3d 70 53 75  ; pSub; pSub=pSu
19b70 62 2d 3e 70 50 72 69 6f 72 29 7b 0a 20 20 20 20  b->pPrior){.    
19b80 53 65 6c 65 63 74 20 2a 70 4e 65 77 3b 0a 20 20  Select *pNew;.  
19b90 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4f 72 64    ExprList *pOrd
19ba0 65 72 42 79 20 3d 20 70 2d 3e 70 4f 72 64 65 72  erBy = p->pOrder
19bb0 42 79 3b 0a 20 20 20 20 45 78 70 72 20 2a 70 4c  By;.    Expr *pL
19bc0 69 6d 69 74 20 3d 20 70 2d 3e 70 4c 69 6d 69 74  imit = p->pLimit
19bd0 3b 0a 20 20 20 20 45 78 70 72 20 2a 70 4f 66 66  ;.    Expr *pOff
19be0 73 65 74 20 3d 20 70 2d 3e 70 4f 66 66 73 65 74  set = p->pOffset
19bf0 3b 0a 20 20 20 20 53 65 6c 65 63 74 20 2a 70 50  ;.    Select *pP
19c00 72 69 6f 72 20 3d 20 70 2d 3e 70 50 72 69 6f 72  rior = p->pPrior
19c10 3b 0a 20 20 20 20 70 2d 3e 70 4f 72 64 65 72 42  ;.    p->pOrderB
19c20 79 20 3d 20 30 3b 0a 20 20 20 20 70 2d 3e 70 53  y = 0;.    p->pS
19c30 72 63 20 3d 20 30 3b 0a 20 20 20 20 70 2d 3e 70  rc = 0;.    p->p
19c40 50 72 69 6f 72 20 3d 20 30 3b 0a 20 20 20 20 70  Prior = 0;.    p
19c50 2d 3e 70 4c 69 6d 69 74 20 3d 20 30 3b 0a 20 20  ->pLimit = 0;.  
19c60 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33    pNew = sqlite3
19c70 53 65 6c 65 63 74 44 75 70 28 64 62 2c 20 70 29  SelectDup(db, p)
19c80 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 70 50 72 69  ;.    pNew->pPri
19c90 6f 72 20 3d 20 70 50 72 69 6f 72 3b 0a 20 20 20  or = pPrior;.   
19ca0 20 70 2d 3e 70 50 72 69 6f 72 20 3d 20 70 4e 65   p->pPrior = pNe
19cb0 77 3b 0a 20 20 20 20 70 2d 3e 70 4f 72 64 65 72  w;.    p->pOrder
19cc0 42 79 20 3d 20 70 4f 72 64 65 72 42 79 3b 0a 20  By = pOrderBy;. 
19cd0 20 20 20 70 2d 3e 6f 70 20 3d 20 54 4b 5f 41 4c     p->op = TK_AL
19ce0 4c 3b 0a 20 20 20 20 70 2d 3e 70 53 72 63 20 3d  L;.    p->pSrc =
19cf0 20 70 53 72 63 3b 0a 20 20 20 20 70 2d 3e 70 4c   pSrc;.    p->pL
19d00 69 6d 69 74 20 3d 20 70 4c 69 6d 69 74 3b 0a 20  imit = pLimit;. 
19d10 20 20 20 70 2d 3e 70 4f 66 66 73 65 74 20 3d 20     p->pOffset = 
19d20 70 4f 66 66 73 65 74 3b 0a 20 20 20 20 70 2d 3e  pOffset;.    p->
19d30 70 52 69 67 68 74 6d 6f 73 74 20 3d 20 30 3b 0a  pRightmost = 0;.
19d40 20 20 20 20 70 4e 65 77 2d 3e 70 52 69 67 68 74      pNew->pRight
19d50 6d 6f 73 74 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20  most = 0;.  }.. 
19d60 20 2f 2a 20 49 66 20 77 65 20 72 65 61 63 68 20   /* If we reach 
19d70 74 68 69 73 20 70 6f 69 6e 74 2c 20 69 74 20 6d  this point, it m
19d80 65 61 6e 73 20 66 6c 61 74 74 65 6e 69 6e 67 20  eans flattening 
19d90 69 73 20 70 65 72 6d 69 74 74 65 64 20 66 6f 72  is permitted for
19da0 20 74 68 65 0a 20 20 2a 2a 20 69 46 72 6f 6d 2d   the.  ** iFrom-
19db0 74 68 20 65 6e 74 72 79 20 6f 66 20 74 68 65 20  th entry of the 
19dc0 46 52 4f 4d 20 63 6c 61 75 73 65 20 69 6e 20 74  FROM clause in t
19dd0 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 2e 0a  he outer query..
19de0 20 20 2a 2f 0a 20 20 70 53 75 62 20 3d 20 70 53    */.  pSub = pS
19df0 75 62 31 20 3d 20 70 53 75 62 69 74 65 6d 2d 3e  ub1 = pSubitem->
19e00 70 53 65 6c 65 63 74 3b 0a 20 20 66 6f 72 28 70  pSelect;.  for(p
19e10 50 61 72 65 6e 74 3d 70 3b 20 70 50 61 72 65 6e  Parent=p; pParen
19e20 74 3b 20 70 50 61 72 65 6e 74 3d 70 50 61 72 65  t; pParent=pPare
19e30 6e 74 2d 3e 70 50 72 69 6f 72 2c 20 70 53 75 62  nt->pPrior, pSub
19e40 3d 70 53 75 62 2d 3e 70 50 72 69 6f 72 29 7b 0a  =pSub->pPrior){.
19e50 20 20 20 20 69 6e 74 20 6e 53 75 62 53 72 63 20      int nSubSrc 
19e60 3d 20 70 53 75 62 53 72 63 2d 3e 6e 53 72 63 3b  = pSubSrc->nSrc;
19e70 0a 20 20 20 20 69 6e 74 20 6a 6f 69 6e 74 79 70  .    int jointyp
19e80 65 20 3d 20 30 3b 0a 20 20 20 20 70 53 75 62 53  e = 0;.    pSubS
19e90 72 63 20 3d 20 70 53 75 62 2d 3e 70 53 72 63 3b  rc = pSub->pSrc;
19ea0 0a 20 20 20 20 70 53 72 63 20 3d 20 70 50 61 72  .    pSrc = pPar
19eb0 65 6e 74 2d 3e 70 53 72 63 3b 0a 0a 20 20 20 20  ent->pSrc;..    
19ec0 2f 2a 20 4d 6f 76 65 20 61 6c 6c 20 6f 66 20 74  /* Move all of t
19ed0 68 65 20 46 52 4f 4d 20 65 6c 65 6d 65 6e 74 73  he FROM elements
19ee0 20 6f 66 20 74 68 65 20 73 75 62 71 75 65 72 79   of the subquery
19ef0 20 69 6e 74 6f 20 74 68 65 0a 20 20 20 20 2a 2a   into the.    **
19f00 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65   the FROM clause
19f10 20 6f 66 20 74 68 65 20 6f 75 74 65 72 20 71 75   of the outer qu
19f20 65 72 79 2e 20 20 42 65 66 6f 72 65 20 64 6f 69  ery.  Before doi
19f30 6e 67 20 74 68 69 73 2c 20 72 65 6d 65 6d 62 65  ng this, remembe
19f40 72 0a 20 20 20 20 2a 2a 20 74 68 65 20 63 75 72  r.    ** the cur
19f50 73 6f 72 20 6e 75 6d 62 65 72 20 66 6f 72 20 74  sor number for t
19f60 68 65 20 6f 72 69 67 69 6e 61 6c 20 6f 75 74 65  he original oute
19f70 72 20 71 75 65 72 79 20 46 52 4f 4d 20 65 6c 65  r query FROM ele
19f80 6d 65 6e 74 20 69 6e 0a 20 20 20 20 2a 2a 20 69  ment in.    ** i
19f90 50 61 72 65 6e 74 2e 20 20 54 68 65 20 69 50 61  Parent.  The iPa
19fa0 72 65 6e 74 20 63 75 72 73 6f 72 20 77 69 6c 6c  rent cursor will
19fb0 20 6e 65 76 65 72 20 62 65 20 75 73 65 64 2e 20   never be used. 
19fc0 20 53 75 62 73 65 71 75 65 6e 74 20 63 6f 64 65   Subsequent code
19fd0 0a 20 20 20 20 2a 2a 20 77 69 6c 6c 20 73 63 61  .    ** will sca
19fe0 6e 20 65 78 70 72 65 73 73 69 6f 6e 73 20 6c 6f  n expressions lo
19ff0 6f 6b 69 6e 67 20 66 6f 72 20 69 50 61 72 65 6e  oking for iParen
1a000 74 20 72 65 66 65 72 65 6e 63 65 73 20 61 6e 64  t references and
1a010 20 72 65 70 6c 61 63 65 0a 20 20 20 20 2a 2a 20   replace.    ** 
1a020 74 68 6f 73 65 20 72 65 66 65 72 65 6e 63 65 73  those references
1a030 20 77 69 74 68 20 65 78 70 72 65 73 73 69 6f 6e   with expression
1a040 73 20 74 68 61 74 20 72 65 73 6f 6c 76 65 20 74  s that resolve t
1a050 6f 20 74 68 65 20 73 75 62 71 75 65 72 79 20 46  o the subquery F
1a060 52 4f 4d 0a 20 20 20 20 2a 2a 20 65 6c 65 6d 65  ROM.    ** eleme
1a070 6e 74 73 20 77 65 20 61 72 65 20 6e 6f 77 20 63  nts we are now c
1a080 6f 70 79 69 6e 67 20 69 6e 2e 0a 20 20 20 20 2a  opying in..    *
1a090 2f 0a 20 20 20 20 69 66 28 20 70 53 72 63 20 29  /.    if( pSrc )
1a0a0 7b 0a 20 20 20 20 20 20 70 53 75 62 69 74 65 6d  {.      pSubitem
1a0b0 20 3d 20 26 70 53 72 63 2d 3e 61 5b 69 46 72 6f   = &pSrc->a[iFro
1a0c0 6d 5d 3b 0a 20 20 20 20 20 20 6e 53 75 62 53 72  m];.      nSubSr
1a0d0 63 20 3d 20 70 53 75 62 53 72 63 2d 3e 6e 53 72  c = pSubSrc->nSr
1a0e0 63 3b 0a 20 20 20 20 20 20 6a 6f 69 6e 74 79 70  c;.      jointyp
1a0f0 65 20 3d 20 70 53 75 62 69 74 65 6d 2d 3e 6a 6f  e = pSubitem->jo
1a100 69 6e 74 79 70 65 3b 0a 20 20 20 20 20 20 73 71  intype;.      sq
1a110 6c 69 74 65 33 44 65 6c 65 74 65 54 61 62 6c 65  lite3DeleteTable
1a120 28 70 53 75 62 69 74 65 6d 2d 3e 70 54 61 62 29  (pSubitem->pTab)
1a130 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  ;.      sqlite3_
1a140 66 72 65 65 28 70 53 75 62 69 74 65 6d 2d 3e 7a  free(pSubitem->z
1a150 44 61 74 61 62 61 73 65 29 3b 0a 20 20 20 20 20  Database);.     
1a160 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 53   sqlite3_free(pS
1a170 75 62 69 74 65 6d 2d 3e 7a 4e 61 6d 65 29 3b 0a  ubitem->zName);.
1a180 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72        sqlite3_fr
1a190 65 65 28 70 53 75 62 69 74 65 6d 2d 3e 7a 41 6c  ee(pSubitem->zAl
1a1a0 69 61 73 29 3b 0a 20 20 20 20 20 20 70 53 75 62  ias);.      pSub
1a1b0 69 74 65 6d 2d 3e 70 54 61 62 20 3d 20 30 3b 0a  item->pTab = 0;.
1a1c0 20 20 20 20 20 20 70 53 75 62 69 74 65 6d 2d 3e        pSubitem->
1a1d0 7a 44 61 74 61 62 61 73 65 20 3d 20 30 3b 0a 20  zDatabase = 0;. 
1a1e0 20 20 20 20 20 70 53 75 62 69 74 65 6d 2d 3e 7a       pSubitem->z
1a1f0 4e 61 6d 65 20 3d 20 30 3b 0a 20 20 20 20 20 20  Name = 0;.      
1a200 70 53 75 62 69 74 65 6d 2d 3e 7a 41 6c 69 61 73  pSubitem->zAlias
1a210 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20   = 0;.    }.    
1a220 69 66 28 20 6e 53 75 62 53 72 63 21 3d 31 20 7c  if( nSubSrc!=1 |
1a230 7c 20 21 70 53 72 63 20 29 7b 0a 20 20 20 20 20  | !pSrc ){.     
1a240 20 69 6e 74 20 65 78 74 72 61 20 3d 20 6e 53 75   int extra = nSu
1a250 62 53 72 63 20 2d 20 31 3b 0a 20 20 20 20 20 20  bSrc - 1;.      
1a260 66 6f 72 28 69 3d 28 70 53 72 63 3f 31 3a 30 29  for(i=(pSrc?1:0)
1a270 3b 20 69 3c 6e 53 75 62 53 72 63 3b 20 69 2b 2b  ; i<nSubSrc; i++
1a280 29 7b 0a 20 20 20 20 20 20 20 20 70 53 72 63 20  ){.        pSrc 
1a290 3d 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74  = sqlite3SrcList
1a2a0 41 70 70 65 6e 64 28 64 62 2c 20 70 53 72 63 2c  Append(db, pSrc,
1a2b0 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20   0, 0);.        
1a2c0 69 66 28 20 70 53 72 63 3d 3d 30 20 29 7b 0a 20  if( pSrc==0 ){. 
1a2d0 20 20 20 20 20 20 20 20 20 70 50 61 72 65 6e 74           pParent
1a2e0 2d 3e 70 53 72 63 20 3d 20 30 3b 0a 20 20 20 20  ->pSrc = 0;.    
1a2f0 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a        return 1;.
1a300 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
1a310 7d 0a 20 20 20 20 20 20 70 50 61 72 65 6e 74 2d  }.      pParent-
1a320 3e 70 53 72 63 20 3d 20 70 53 72 63 3b 0a 20 20  >pSrc = pSrc;.  
1a330 20 20 20 20 66 6f 72 28 69 3d 70 53 72 63 2d 3e      for(i=pSrc->
1a340 6e 53 72 63 2d 31 3b 20 69 2d 65 78 74 72 61 3e  nSrc-1; i-extra>
1a350 3d 69 46 72 6f 6d 3b 20 69 2d 2d 29 7b 0a 20 20  =iFrom; i--){.  
1a360 20 20 20 20 20 20 70 53 72 63 2d 3e 61 5b 69 5d        pSrc->a[i]
1a370 20 3d 20 70 53 72 63 2d 3e 61 5b 69 2d 65 78 74   = pSrc->a[i-ext
1a380 72 61 5d 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ra];.      }.   
1a390 20 7d 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20   }.    for(i=0; 
1a3a0 69 3c 6e 53 75 62 53 72 63 3b 20 69 2b 2b 29 7b  i<nSubSrc; i++){
1a3b0 0a 20 20 20 20 20 20 70 53 72 63 2d 3e 61 5b 69  .      pSrc->a[i
1a3c0 2b 69 46 72 6f 6d 5d 20 3d 20 70 53 75 62 53 72  +iFrom] = pSubSr
1a3d0 63 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20 20 20 6d  c->a[i];.      m
1a3e0 65 6d 73 65 74 28 26 70 53 75 62 53 72 63 2d 3e  emset(&pSubSrc->
1a3f0 61 5b 69 5d 2c 20 30 2c 20 73 69 7a 65 6f 66 28  a[i], 0, sizeof(
1a400 70 53 75 62 53 72 63 2d 3e 61 5b 69 5d 29 29 3b  pSubSrc->a[i]));
1a410 0a 20 20 20 20 7d 0a 20 20 20 20 70 53 72 63 2d  .    }.    pSrc-
1a420 3e 61 5b 69 46 72 6f 6d 5d 2e 6a 6f 69 6e 74 79  >a[iFrom].jointy
1a430 70 65 20 3d 20 6a 6f 69 6e 74 79 70 65 3b 0a 20  pe = jointype;. 
1a440 20 0a 20 20 20 20 2f 2a 20 4e 6f 77 20 62 65 67   .    /* Now beg
1a450 69 6e 20 73 75 62 73 74 69 74 75 74 69 6e 67 20  in substituting 
1a460 73 75 62 71 75 65 72 79 20 72 65 73 75 6c 74 20  subquery result 
1a470 73 65 74 20 65 78 70 72 65 73 73 69 6f 6e 73 20  set expressions 
1a480 66 6f 72 20 0a 20 20 20 20 2a 2a 20 72 65 66 65  for .    ** refe
1a490 72 65 6e 63 65 73 20 74 6f 20 74 68 65 20 69 50  rences to the iP
1a4a0 61 72 65 6e 74 20 69 6e 20 74 68 65 20 6f 75 74  arent in the out
1a4b0 65 72 20 71 75 65 72 79 2e 0a 20 20 20 20 2a 2a  er query..    **
1a4c0 20 0a 20 20 20 20 2a 2a 20 45 78 61 6d 70 6c 65   .    ** Example
1a4d0 3a 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  :.    **.    ** 
1a4e0 20 20 53 45 4c 45 43 54 20 61 2b 35 2c 20 62 2a    SELECT a+5, b*
1a4f0 31 30 20 46 52 4f 4d 20 28 53 45 4c 45 43 54 20  10 FROM (SELECT 
1a500 78 2a 33 20 41 53 20 61 2c 20 79 2b 31 30 20 41  x*3 AS a, y+10 A
1a510 53 20 62 20 46 52 4f 4d 20 74 31 29 20 57 48 45  S b FROM t1) WHE
1a520 52 45 20 61 3e 62 3b 0a 20 20 20 20 2a 2a 20 20  RE a>b;.    **  
1a530 20 5c 20 20 20 20 20 20 20 20 20 20 20 20 20 20   \              
1a540 20 20 20 20 20 20 20 5c 5f 5f 5f 5f 5f 5f 5f 5f         \________
1a550 5f 5f 5f 5f 5f 20 73 75 62 71 75 65 72 79 20 5f  _____ subquery _
1a560 5f 5f 5f 5f 5f 5f 5f 5f 5f 2f 20 20 20 20 20 20  _________/      
1a570 20 20 20 20 2f 0a 20 20 20 20 2a 2a 20 20 20 20      /.    **    
1a580 5c 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f  \_______________
1a590 5f 5f 5f 5f 5f 5f 20 6f 75 74 65 72 20 71 75 65  ______ outer que
1a5a0 72 79 20 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f  ry _____________
1a5b0 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f  ________________
1a5c0 5f 2f 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  _/.    **.    **
1a5d0 20 57 65 20 6c 6f 6f 6b 20 61 74 20 65 76 65 72   We look at ever
1a5e0 79 20 65 78 70 72 65 73 73 69 6f 6e 20 69 6e 20  y expression in 
1a5f0 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20  the outer query 
1a600 61 6e 64 20 65 76 65 72 79 20 70 6c 61 63 65 20  and every place 
1a610 77 65 20 73 65 65 0a 20 20 20 20 2a 2a 20 22 61  we see.    ** "a
1a620 22 20 77 65 20 73 75 62 73 74 69 74 75 74 65 20  " we substitute 
1a630 22 78 2a 33 22 20 61 6e 64 20 65 76 65 72 79 20  "x*3" and every 
1a640 70 6c 61 63 65 20 77 65 20 73 65 65 20 22 62 22  place we see "b"
1a650 20 77 65 20 73 75 62 73 74 69 74 75 74 65 20 22   we substitute "
1a660 79 2b 31 30 22 2e 0a 20 20 20 20 2a 2f 0a 20 20  y+10"..    */.  
1a670 20 20 70 4c 69 73 74 20 3d 20 70 50 61 72 65 6e    pList = pParen
1a680 74 2d 3e 70 45 4c 69 73 74 3b 0a 20 20 20 20 66  t->pEList;.    f
1a690 6f 72 28 69 3d 30 3b 20 69 3c 70 4c 69 73 74 2d  or(i=0; i<pList-
1a6a0 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20  >nExpr; i++){.  
1a6b0 20 20 20 20 45 78 70 72 20 2a 70 45 78 70 72 3b      Expr *pExpr;
1a6c0 0a 20 20 20 20 20 20 69 66 28 20 70 4c 69 73 74  .      if( pList
1a6d0 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 3d 3d 30 20  ->a[i].zName==0 
1a6e0 26 26 20 28 70 45 78 70 72 20 3d 20 70 4c 69 73  && (pExpr = pLis
1a6f0 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 29 2d 3e  t->a[i].pExpr)->
1a700 73 70 61 6e 2e 7a 21 3d 30 20 29 7b 0a 20 20 20  span.z!=0 ){.   
1a710 20 20 20 20 20 70 4c 69 73 74 2d 3e 61 5b 69 5d       pList->a[i]
1a720 2e 7a 4e 61 6d 65 20 3d 20 0a 20 20 20 20 20 20  .zName = .      
1a730 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
1a740 44 62 53 74 72 4e 44 75 70 28 64 62 2c 20 28 63  DbStrNDup(db, (c
1a750 68 61 72 2a 29 70 45 78 70 72 2d 3e 73 70 61 6e  har*)pExpr->span
1a760 2e 7a 2c 20 70 45 78 70 72 2d 3e 73 70 61 6e 2e  .z, pExpr->span.
1a770 6e 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  n);.      }.    
1a780 7d 0a 20 20 20 20 73 75 62 73 74 45 78 70 72 4c  }.    substExprL
1a790 69 73 74 28 64 62 2c 20 70 50 61 72 65 6e 74 2d  ist(db, pParent-
1a7a0 3e 70 45 4c 69 73 74 2c 20 69 50 61 72 65 6e 74  >pEList, iParent
1a7b0 2c 20 70 53 75 62 2d 3e 70 45 4c 69 73 74 29 3b  , pSub->pEList);
1a7c0 0a 20 20 20 20 69 66 28 20 69 73 41 67 67 20 29  .    if( isAgg )
1a7d0 7b 0a 20 20 20 20 20 20 73 75 62 73 74 45 78 70  {.      substExp
1a7e0 72 4c 69 73 74 28 64 62 2c 20 70 50 61 72 65 6e  rList(db, pParen
1a7f0 74 2d 3e 70 47 72 6f 75 70 42 79 2c 20 69 50 61  t->pGroupBy, iPa
1a800 72 65 6e 74 2c 20 70 53 75 62 2d 3e 70 45 4c 69  rent, pSub->pELi
1a810 73 74 29 3b 0a 20 20 20 20 20 20 73 75 62 73 74  st);.      subst
1a820 45 78 70 72 28 64 62 2c 20 70 50 61 72 65 6e 74  Expr(db, pParent
1a830 2d 3e 70 48 61 76 69 6e 67 2c 20 69 50 61 72 65  ->pHaving, iPare
1a840 6e 74 2c 20 70 53 75 62 2d 3e 70 45 4c 69 73 74  nt, pSub->pEList
1a850 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  );.    }.    if(
1a860 20 70 53 75 62 2d 3e 70 4f 72 64 65 72 42 79 20   pSub->pOrderBy 
1a870 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ){.      assert(
1a880 20 70 50 61 72 65 6e 74 2d 3e 70 4f 72 64 65 72   pParent->pOrder
1a890 42 79 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 70  By==0 );.      p
1a8a0 50 61 72 65 6e 74 2d 3e 70 4f 72 64 65 72 42 79  Parent->pOrderBy
1a8b0 20 3d 20 70 53 75 62 2d 3e 70 4f 72 64 65 72 42   = pSub->pOrderB
1a8c0 79 3b 0a 20 20 20 20 20 20 70 53 75 62 2d 3e 70  y;.      pSub->p
1a8d0 4f 72 64 65 72 42 79 20 3d 20 30 3b 0a 20 20 20  OrderBy = 0;.   
1a8e0 20 7d 65 6c 73 65 20 69 66 28 20 70 50 61 72 65   }else if( pPare
1a8f0 6e 74 2d 3e 70 4f 72 64 65 72 42 79 20 29 7b 0a  nt->pOrderBy ){.
1a900 20 20 20 20 20 20 73 75 62 73 74 45 78 70 72 4c        substExprL
1a910 69 73 74 28 64 62 2c 20 70 50 61 72 65 6e 74 2d  ist(db, pParent-
1a920 3e 70 4f 72 64 65 72 42 79 2c 20 69 50 61 72 65  >pOrderBy, iPare
1a930 6e 74 2c 20 70 53 75 62 2d 3e 70 45 4c 69 73 74  nt, pSub->pEList
1a940 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  );.    }.    if(
1a950 20 70 53 75 62 2d 3e 70 57 68 65 72 65 20 29 7b   pSub->pWhere ){
1a960 0a 20 20 20 20 20 20 70 57 68 65 72 65 20 3d 20  .      pWhere = 
1a970 73 71 6c 69 74 65 33 45 78 70 72 44 75 70 28 64  sqlite3ExprDup(d
1a980 62 2c 20 70 53 75 62 2d 3e 70 57 68 65 72 65 29  b, pSub->pWhere)
1a990 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
1a9a0 20 20 20 70 57 68 65 72 65 20 3d 20 30 3b 0a 20     pWhere = 0;. 
1a9b0 20 20 20 7d 0a 20 20 20 20 69 66 28 20 73 75 62     }.    if( sub
1a9c0 71 75 65 72 79 49 73 41 67 67 20 29 7b 0a 20 20  queryIsAgg ){.  
1a9d0 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 72      assert( pPar
1a9e0 65 6e 74 2d 3e 70 48 61 76 69 6e 67 3d 3d 30 20  ent->pHaving==0 
1a9f0 29 3b 0a 20 20 20 20 20 20 70 50 61 72 65 6e 74  );.      pParent
1aa00 2d 3e 70 48 61 76 69 6e 67 20 3d 20 70 50 61 72  ->pHaving = pPar
1aa10 65 6e 74 2d 3e 70 57 68 65 72 65 3b 0a 20 20 20  ent->pWhere;.   
1aa20 20 20 20 70 50 61 72 65 6e 74 2d 3e 70 57 68 65     pParent->pWhe
1aa30 72 65 20 3d 20 70 57 68 65 72 65 3b 0a 20 20 20  re = pWhere;.   
1aa40 20 20 20 73 75 62 73 74 45 78 70 72 28 64 62 2c     substExpr(db,
1aa50 20 70 50 61 72 65 6e 74 2d 3e 70 48 61 76 69 6e   pParent->pHavin
1aa60 67 2c 20 69 50 61 72 65 6e 74 2c 20 70 53 75 62  g, iParent, pSub
1aa70 2d 3e 70 45 4c 69 73 74 29 3b 0a 20 20 20 20 20  ->pEList);.     
1aa80 20 70 50 61 72 65 6e 74 2d 3e 70 48 61 76 69 6e   pParent->pHavin
1aa90 67 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 41  g = sqlite3ExprA
1aaa0 6e 64 28 64 62 2c 20 70 50 61 72 65 6e 74 2d 3e  nd(db, pParent->
1aab0 70 48 61 76 69 6e 67 2c 20 0a 20 20 20 20 20 20  pHaving, .      
1aac0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1aad0 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
1aae0 74 65 33 45 78 70 72 44 75 70 28 64 62 2c 20 70  te3ExprDup(db, p
1aaf0 53 75 62 2d 3e 70 48 61 76 69 6e 67 29 29 3b 0a  Sub->pHaving));.
1ab00 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50        assert( pP
1ab10 61 72 65 6e 74 2d 3e 70 47 72 6f 75 70 42 79 3d  arent->pGroupBy=
1ab20 3d 30 20 29 3b 0a 20 20 20 20 20 20 70 50 61 72  =0 );.      pPar
1ab30 65 6e 74 2d 3e 70 47 72 6f 75 70 42 79 20 3d 20  ent->pGroupBy = 
1ab40 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44  sqlite3ExprListD
1ab50 75 70 28 64 62 2c 20 70 53 75 62 2d 3e 70 47 72  up(db, pSub->pGr
1ab60 6f 75 70 42 79 29 3b 0a 20 20 20 20 7d 65 6c 73  oupBy);.    }els
1ab70 65 7b 0a 20 20 20 20 20 20 73 75 62 73 74 45 78  e{.      substEx
1ab80 70 72 28 64 62 2c 20 70 50 61 72 65 6e 74 2d 3e  pr(db, pParent->
1ab90 70 57 68 65 72 65 2c 20 69 50 61 72 65 6e 74 2c  pWhere, iParent,
1aba0 20 70 53 75 62 2d 3e 70 45 4c 69 73 74 29 3b 0a   pSub->pEList);.
1abb0 20 20 20 20 20 20 70 50 61 72 65 6e 74 2d 3e 70        pParent->p
1abc0 57 68 65 72 65 20 3d 20 73 71 6c 69 74 65 33 45  Where = sqlite3E
1abd0 78 70 72 41 6e 64 28 64 62 2c 20 70 50 61 72 65  xprAnd(db, pPare
1abe0 6e 74 2d 3e 70 57 68 65 72 65 2c 20 70 57 68 65  nt->pWhere, pWhe
1abf0 72 65 29 3b 0a 20 20 20 20 7d 0a 20 20 0a 20 20  re);.    }.  .  
1ac00 20 20 2f 2a 20 54 68 65 20 66 6c 61 74 74 65 6e    /* The flatten
1ac10 65 64 20 71 75 65 72 79 20 69 73 20 64 69 73 74  ed query is dist
1ac20 69 6e 63 74 20 69 66 20 65 69 74 68 65 72 20 74  inct if either t
1ac30 68 65 20 69 6e 6e 65 72 20 6f 72 20 74 68 65 0a  he inner or the.
1ac40 20 20 20 20 2a 2a 20 6f 75 74 65 72 20 71 75 65      ** outer que
1ac50 72 79 20 69 73 20 64 69 73 74 69 6e 63 74 2e 20  ry is distinct. 
1ac60 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70 50 61 72  .    */.    pPar
1ac70 65 6e 74 2d 3e 69 73 44 69 73 74 69 6e 63 74 20  ent->isDistinct 
1ac80 3d 20 70 50 61 72 65 6e 74 2d 3e 69 73 44 69 73  = pParent->isDis
1ac90 74 69 6e 63 74 20 7c 7c 20 70 53 75 62 2d 3e 69  tinct || pSub->i
1aca0 73 44 69 73 74 69 6e 63 74 3b 0a 20 20 0a 20 20  sDistinct;.  .  
1acb0 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 53 45 4c 45    /*.    ** SELE
1acc0 43 54 20 2e 2e 2e 20 46 52 4f 4d 20 28 53 45 4c  CT ... FROM (SEL
1acd0 45 43 54 20 2e 2e 2e 20 4c 49 4d 49 54 20 61 20  ECT ... LIMIT a 
1ace0 4f 46 46 53 45 54 20 62 29 20 4c 49 4d 49 54 20  OFFSET b) LIMIT 
1acf0 78 20 4f 46 46 53 45 54 20 79 3b 0a 20 20 20 20  x OFFSET y;.    
1ad00 2a 2a 0a 20 20 20 20 2a 2a 20 4f 6e 65 20 69 73  **.    ** One is
1ad10 20 74 65 6d 70 74 65 64 20 74 6f 20 74 72 79 20   tempted to try 
1ad20 74 6f 20 61 64 64 20 61 20 61 6e 64 20 62 20 74  to add a and b t
1ad30 6f 20 63 6f 6d 62 69 6e 65 20 74 68 65 20 6c 69  o combine the li
1ad40 6d 69 74 73 2e 20 20 42 75 74 20 74 68 69 73 0a  mits.  But this.
1ad50 20 20 20 20 2a 2a 20 64 6f 65 73 20 6e 6f 74 20      ** does not 
1ad60 77 6f 72 6b 20 69 66 20 65 69 74 68 65 72 20 6c  work if either l
1ad70 69 6d 69 74 20 69 73 20 6e 65 67 61 74 69 76 65  imit is negative
1ad80 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
1ad90 20 70 53 75 62 2d 3e 70 4c 69 6d 69 74 20 29 7b   pSub->pLimit ){
1ada0 0a 20 20 20 20 20 20 70 50 61 72 65 6e 74 2d 3e  .      pParent->
1adb0 70 4c 69 6d 69 74 20 3d 20 70 53 75 62 2d 3e 70  pLimit = pSub->p
1adc0 4c 69 6d 69 74 3b 0a 20 20 20 20 20 20 70 53 75  Limit;.      pSu
1add0 62 2d 3e 70 4c 69 6d 69 74 20 3d 20 30 3b 0a 20  b->pLimit = 0;. 
1ade0 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46     }.  }..  /* F
1adf0 69 6e 69 61 6c 6c 79 2c 20 64 65 6c 65 74 65 20  inially, delete 
1ae00 77 68 61 74 20 69 73 20 6c 65 66 74 20 6f 66 20  what is left of 
1ae10 74 68 65 20 73 75 62 71 75 65 72 79 20 61 6e 64  the subquery and
1ae20 20 72 65 74 75 72 6e 0a 20 20 2a 2a 20 73 75 63   return.  ** suc
1ae30 63 65 73 73 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c  cess..  */.  sql
1ae40 69 74 65 33 53 65 6c 65 63 74 44 65 6c 65 74 65  ite3SelectDelete
1ae50 28 70 53 75 62 31 29 3b 0a 0a 20 20 72 65 74 75  (pSub1);..  retu
1ae60 72 6e 20 31 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f  rn 1;.}.#endif /
1ae70 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49  * SQLITE_OMIT_VI
1ae80 45 57 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 41 6e 61  EW */../*.** Ana
1ae90 6c 79 7a 65 20 74 68 65 20 53 45 4c 45 43 54 20  lyze the SELECT 
1aea0 73 74 61 74 65 6d 65 6e 74 20 70 61 73 73 65 64  statement passed
1aeb0 20 61 73 20 61 6e 20 61 72 67 75 6d 65 6e 74 20   as an argument 
1aec0 74 6f 20 73 65 65 20 69 66 20 69 74 0a 2a 2a 20  to see if it.** 
1aed0 69 73 20 61 20 6d 69 6e 28 29 20 6f 72 20 6d 61  is a min() or ma
1aee0 78 28 29 20 71 75 65 72 79 2e 20 52 65 74 75 72  x() query. Retur
1aef0 6e 20 57 48 45 52 45 5f 4f 52 44 45 52 42 59 5f  n WHERE_ORDERBY_
1af00 4d 49 4e 20 6f 72 20 57 48 45 52 45 5f 4f 52 44  MIN or WHERE_ORD
1af10 45 52 42 59 5f 4d 41 58 20 69 66 20 0a 2a 2a 20  ERBY_MAX if .** 
1af20 69 74 20 69 73 2c 20 6f 72 20 30 20 6f 74 68 65  it is, or 0 othe
1af30 72 77 69 73 65 2e 20 41 74 20 70 72 65 73 65 6e  rwise. At presen
1af40 74 2c 20 61 20 71 75 65 72 79 20 69 73 20 63 6f  t, a query is co
1af50 6e 73 69 64 65 72 65 64 20 74 6f 20 62 65 0a 2a  nsidered to be.*
1af60 2a 20 61 20 6d 69 6e 28 29 2f 6d 61 78 28 29 20  * a min()/max() 
1af70 71 75 65 72 79 20 69 66 3a 0a 2a 2a 0a 2a 2a 20  query if:.**.** 
1af80 20 20 31 2e 20 54 68 65 72 65 20 69 73 20 61 20    1. There is a 
1af90 73 69 6e 67 6c 65 20 6f 62 6a 65 63 74 20 69 6e  single object in
1afa0 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65   the FROM clause
1afb0 2e 0a 2a 2a 0a 2a 2a 20 20 20 32 2e 20 54 68 65  ..**.**   2. The
1afc0 72 65 20 69 73 20 61 20 73 69 6e 67 6c 65 20 65  re is a single e
1afd0 78 70 72 65 73 73 69 6f 6e 20 69 6e 20 74 68 65  xpression in the
1afe0 20 72 65 73 75 6c 74 20 73 65 74 2c 20 61 6e 64   result set, and
1aff0 20 69 74 20 69 73 0a 2a 2a 20 20 20 20 20 20 65   it is.**      e
1b000 69 74 68 65 72 20 6d 69 6e 28 78 29 20 6f 72 20  ither min(x) or 
1b010 6d 61 78 28 78 29 2c 20 77 68 65 72 65 20 78 20  max(x), where x 
1b020 69 73 20 61 20 63 6f 6c 75 6d 6e 20 72 65 66 65  is a column refe
1b030 72 65 6e 63 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  rence..*/.static
1b040 20 69 6e 74 20 6d 69 6e 4d 61 78 51 75 65 72 79   int minMaxQuery
1b050 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
1b060 53 65 6c 65 63 74 20 2a 70 29 7b 0a 20 20 45 78  Select *p){.  Ex
1b070 70 72 20 2a 70 45 78 70 72 3b 0a 20 20 45 78 70  pr *pExpr;.  Exp
1b080 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 20 3d 20  rList *pEList = 
1b090 70 2d 3e 70 45 4c 69 73 74 3b 0a 0a 20 20 69 66  p->pEList;..  if
1b0a0 28 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 21  ( pEList->nExpr!
1b0b0 3d 31 20 29 20 72 65 74 75 72 6e 20 57 48 45 52  =1 ) return WHER
1b0c0 45 5f 4f 52 44 45 52 42 59 5f 4e 4f 52 4d 41 4c  E_ORDERBY_NORMAL
1b0d0 3b 0a 20 20 70 45 78 70 72 20 3d 20 70 45 4c 69  ;.  pExpr = pELi
1b0e0 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 3b 0a  st->a[0].pExpr;.
1b0f0 20 20 70 45 4c 69 73 74 20 3d 20 70 45 78 70 72    pEList = pExpr
1b100 2d 3e 70 4c 69 73 74 3b 0a 20 20 69 66 28 20 70  ->pList;.  if( p
1b110 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 41 47 47  Expr->op!=TK_AGG
1b120 5f 46 55 4e 43 54 49 4f 4e 20 7c 7c 20 70 45 4c  _FUNCTION || pEL
1b130 69 73 74 3d 3d 30 20 7c 7c 20 70 45 4c 69 73 74  ist==0 || pEList
1b140 2d 3e 6e 45 78 70 72 21 3d 31 20 29 20 72 65 74  ->nExpr!=1 ) ret
1b150 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 70 45 4c  urn 0;.  if( pEL
1b160 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 2d  ist->a[0].pExpr-
1b170 3e 6f 70 21 3d 54 4b 5f 41 47 47 5f 43 4f 4c 55  >op!=TK_AGG_COLU
1b180 4d 4e 20 29 20 72 65 74 75 72 6e 20 57 48 45 52  MN ) return WHER
1b190 45 5f 4f 52 44 45 52 42 59 5f 4e 4f 52 4d 41 4c  E_ORDERBY_NORMAL
1b1a0 3b 0a 20 20 69 66 28 20 70 45 78 70 72 2d 3e 74  ;.  if( pExpr->t
1b1b0 6f 6b 65 6e 2e 6e 21 3d 33 20 29 20 72 65 74 75  oken.n!=3 ) retu
1b1c0 72 6e 20 57 48 45 52 45 5f 4f 52 44 45 52 42 59  rn WHERE_ORDERBY
1b1d0 5f 4e 4f 52 4d 41 4c 3b 0a 20 20 69 66 28 20 73  _NORMAL;.  if( s
1b1e0 71 6c 69 74 65 33 53 74 72 4e 49 43 6d 70 28 28  qlite3StrNICmp((
1b1f0 63 68 61 72 2a 29 70 45 78 70 72 2d 3e 74 6f 6b  char*)pExpr->tok
1b200 65 6e 2e 7a 2c 22 6d 69 6e 22 2c 33 29 3d 3d 30  en.z,"min",3)==0
1b210 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 57   ){.    return W
1b220 48 45 52 45 5f 4f 52 44 45 52 42 59 5f 4d 49 4e  HERE_ORDERBY_MIN
1b230 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 73 71  ;.  }else if( sq
1b240 6c 69 74 65 33 53 74 72 4e 49 43 6d 70 28 28 63  lite3StrNICmp((c
1b250 68 61 72 2a 29 70 45 78 70 72 2d 3e 74 6f 6b 65  har*)pExpr->toke
1b260 6e 2e 7a 2c 22 6d 61 78 22 2c 33 29 3d 3d 30 20  n.z,"max",3)==0 
1b270 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 57 48  ){.    return WH
1b280 45 52 45 5f 4f 52 44 45 52 42 59 5f 4d 41 58 3b  ERE_ORDERBY_MAX;
1b290 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 57 48  .  }.  return WH
1b2a0 45 52 45 5f 4f 52 44 45 52 42 59 5f 4e 4f 52 4d  ERE_ORDERBY_NORM
1b2b0 41 4c 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  AL;.}../*.** Thi
1b2c0 73 20 72 6f 75 74 69 6e 65 20 72 65 73 6f 6c 76  s routine resolv
1b2d0 65 73 20 61 6e 79 20 6e 61 6d 65 73 20 75 73 65  es any names use
1b2e0 64 20 69 6e 20 74 68 65 20 72 65 73 75 6c 74 20  d in the result 
1b2f0 73 65 74 20 6f 66 20 74 68 65 0a 2a 2a 20 73 75  set of the.** su
1b300 70 70 6c 69 65 64 20 53 45 4c 45 43 54 20 73 74  pplied SELECT st
1b310 61 74 65 6d 65 6e 74 2e 20 49 66 20 74 68 65 20  atement. If the 
1b320 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
1b330 20 62 65 69 6e 67 20 72 65 73 6f 6c 76 65 64 0a   being resolved.
1b340 2a 2a 20 69 73 20 61 20 73 75 62 2d 73 65 6c 65  ** is a sub-sele
1b350 63 74 2c 20 74 68 65 6e 20 70 4f 75 74 65 72 4e  ct, then pOuterN
1b360 43 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74  C is a pointer t
1b370 6f 20 74 68 65 20 4e 61 6d 65 43 6f 6e 74 65 78  o the NameContex
1b380 74 20 0a 2a 2a 20 6f 66 20 74 68 65 20 70 61 72  t .** of the par
1b390 65 6e 74 20 53 45 4c 45 43 54 2e 0a 2a 2f 0a 69  ent SELECT..*/.i
1b3a0 6e 74 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74  nt sqlite3Select
1b3b0 52 65 73 6f 6c 76 65 28 0a 20 20 50 61 72 73 65  Resolve(.  Parse
1b3c0 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20   *pParse,       
1b3d0 20 20 2f 2a 20 54 68 65 20 70 61 72 73 65 72 20    /* The parser 
1b3e0 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53 65 6c  context */.  Sel
1b3f0 65 63 74 20 2a 70 2c 20 20 20 20 20 20 20 20 20  ect *p,         
1b400 20 20 20 20 2f 2a 20 54 68 65 20 53 45 4c 45 43      /* The SELEC
1b410 54 20 73 74 61 74 65 6d 65 6e 74 20 62 65 69 6e  T statement bein
1b420 67 20 63 6f 64 65 64 2e 20 2a 2f 0a 20 20 4e 61  g coded. */.  Na
1b430 6d 65 43 6f 6e 74 65 78 74 20 2a 70 4f 75 74 65  meContext *pOute
1b440 72 4e 43 20 20 2f 2a 20 54 68 65 20 6f 75 74 65  rNC  /* The oute
1b450 72 20 6e 61 6d 65 20 63 6f 6e 74 65 78 74 2e 20  r name context. 
1b460 4d 61 79 20 62 65 20 4e 55 4c 4c 2e 20 2a 2f 0a  May be NULL. */.
1b470 29 7b 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70  ){.  ExprList *p
1b480 45 4c 69 73 74 3b 20 20 20 20 20 20 20 20 20 20  EList;          
1b490 2f 2a 20 52 65 73 75 6c 74 20 73 65 74 2e 20 2a  /* Result set. *
1b4a0 2f 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20  /.  int i;      
1b4b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1b4c0 2a 20 46 6f 72 2d 6c 6f 6f 70 20 76 61 72 69 61  * For-loop varia
1b4d0 62 6c 65 20 75 73 65 64 20 69 6e 20 6d 75 6c 74  ble used in mult
1b4e0 69 70 6c 65 20 70 6c 61 63 65 73 20 2a 2f 0a 20  iple places */. 
1b4f0 20 4e 61 6d 65 43 6f 6e 74 65 78 74 20 73 4e 43   NameContext sNC
1b500 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c  ;           /* L
1b510 6f 63 61 6c 20 6e 61 6d 65 2d 63 6f 6e 74 65 78  ocal name-contex
1b520 74 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20  t */.  ExprList 
1b530 2a 70 47 72 6f 75 70 42 79 3b 20 20 20 20 20 20  *pGroupBy;      
1b540 20 20 2f 2a 20 54 68 65 20 67 72 6f 75 70 20 62    /* The group b
1b550 79 20 63 6c 61 75 73 65 20 2a 2f 0a 0a 20 20 2f  y clause */..  /
1b560 2a 20 49 66 20 74 68 69 73 20 72 6f 75 74 69 6e  * If this routin
1b570 65 20 68 61 73 20 72 75 6e 20 62 65 66 6f 72 65  e has run before
1b580 2c 20 72 65 74 75 72 6e 20 69 6d 6d 65 64 69 61  , return immedia
1b590 74 65 6c 79 2e 20 2a 2f 0a 20 20 69 66 28 20 70  tely. */.  if( p
1b5a0 2d 3e 69 73 52 65 73 6f 6c 76 65 64 20 29 7b 0a  ->isResolved ){.
1b5b0 20 20 20 20 61 73 73 65 72 74 28 20 21 70 4f 75      assert( !pOu
1b5c0 74 65 72 4e 43 20 29 3b 0a 20 20 20 20 72 65 74  terNC );.    ret
1b5d0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
1b5e0 20 7d 0a 20 20 70 2d 3e 69 73 52 65 73 6f 6c 76   }.  p->isResolv
1b5f0 65 64 20 3d 20 31 3b 0a 0a 20 20 2f 2a 20 49 66  ed = 1;..  /* If
1b600 20 74 68 65 72 65 20 68 61 76 65 20 61 6c 72 65   there have alre
1b610 61 64 79 20 62 65 65 6e 20 65 72 72 6f 72 73 2c  ady been errors,
1b620 20 64 6f 20 6e 6f 74 68 69 6e 67 2e 20 2a 2f 0a   do nothing. */.
1b630 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 45    if( pParse->nE
1b640 72 72 3e 30 20 29 7b 0a 20 20 20 20 72 65 74 75  rr>0 ){.    retu
1b650 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b  rn SQLITE_ERROR;
1b660 0a 20 20 7d 0a 0a 20 20 2f 2a 20 50 72 65 70 61  .  }..  /* Prepa
1b670 72 65 20 74 68 65 20 73 65 6c 65 63 74 20 73 74  re the select st
1b680 61 74 65 6d 65 6e 74 2e 20 54 68 69 73 20 63 61  atement. This ca
1b690 6c 6c 20 77 69 6c 6c 20 61 6c 6c 6f 63 61 74 65  ll will allocate
1b6a0 20 61 6c 6c 20 63 75 72 73 6f 72 73 0a 20 20 2a   all cursors.  *
1b6b0 2a 20 72 65 71 75 69 72 65 64 20 74 6f 20 68 61  * required to ha
1b6c0 6e 64 6c 65 20 74 68 65 20 74 61 62 6c 65 73 20  ndle the tables 
1b6d0 61 6e 64 20 73 75 62 71 75 65 72 69 65 73 20 69  and subqueries i
1b6e0 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73  n the FROM claus
1b6f0 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 72  e..  */.  if( pr
1b700 65 70 53 65 6c 65 63 74 53 74 6d 74 28 70 50 61  epSelectStmt(pPa
1b710 72 73 65 2c 20 70 29 20 29 7b 0a 20 20 20 20 72  rse, p) ){.    r
1b720 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52  eturn SQLITE_ERR
1b730 4f 52 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 65  OR;.  }..  /* Re
1b740 73 6f 6c 76 65 20 74 68 65 20 65 78 70 72 65 73  solve the expres
1b750 73 69 6f 6e 73 20 69 6e 20 74 68 65 20 4c 49 4d  sions in the LIM
1b760 49 54 20 61 6e 64 20 4f 46 46 53 45 54 20 63 6c  IT and OFFSET cl
1b770 61 75 73 65 73 2e 20 54 68 65 73 65 0a 20 20 2a  auses. These.  *
1b780 2a 20 61 72 65 20 6e 6f 74 20 61 6c 6c 6f 77 65  * are not allowe
1b790 64 20 74 6f 20 72 65 66 65 72 20 74 6f 20 61 6e  d to refer to an
1b7a0 79 20 6e 61 6d 65 73 2c 20 73 6f 20 70 61 73 73  y names, so pass
1b7b0 20 61 6e 20 65 6d 70 74 79 20 4e 61 6d 65 43 6f   an empty NameCo
1b7c0 6e 74 65 78 74 2e 0a 20 20 2a 2f 0a 20 20 6d 65  ntext..  */.  me
1b7d0 6d 73 65 74 28 26 73 4e 43 2c 20 30 2c 20 73 69  mset(&sNC, 0, si
1b7e0 7a 65 6f 66 28 73 4e 43 29 29 3b 0a 20 20 73 4e  zeof(sNC));.  sN
1b7f0 43 2e 70 50 61 72 73 65 20 3d 20 70 50 61 72 73  C.pParse = pPars
1b800 65 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33  e;.  if( sqlite3
1b810 45 78 70 72 52 65 73 6f 6c 76 65 4e 61 6d 65 73  ExprResolveNames
1b820 28 26 73 4e 43 2c 20 70 2d 3e 70 4c 69 6d 69 74  (&sNC, p->pLimit
1b830 29 20 7c 7c 0a 20 20 20 20 20 20 73 71 6c 69 74  ) ||.      sqlit
1b840 65 33 45 78 70 72 52 65 73 6f 6c 76 65 4e 61 6d  e3ExprResolveNam
1b850 65 73 28 26 73 4e 43 2c 20 70 2d 3e 70 4f 66 66  es(&sNC, p->pOff
1b860 73 65 74 29 20 29 7b 0a 20 20 20 20 72 65 74 75  set) ){.    retu
1b870 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b  rn SQLITE_ERROR;
1b880 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 65 74 20 75  .  }..  /* Set u
1b890 70 20 74 68 65 20 6c 6f 63 61 6c 20 6e 61 6d 65  p the local name
1b8a0 2d 63 6f 6e 74 65 78 74 20 74 6f 20 70 61 73 73  -context to pass
1b8b0 20 74 6f 20 45 78 70 72 52 65 73 6f 6c 76 65 4e   to ExprResolveN
1b8c0 61 6d 65 73 28 29 20 74 6f 0a 20 20 2a 2a 20 72  ames() to.  ** r
1b8d0 65 73 6f 6c 76 65 20 74 68 65 20 65 78 70 72 65  esolve the expre
1b8e0 73 73 69 6f 6e 2d 6c 69 73 74 2e 0a 20 20 2a 2f  ssion-list..  */
1b8f0 0a 20 20 73 4e 43 2e 61 6c 6c 6f 77 41 67 67 20  .  sNC.allowAgg 
1b900 3d 20 31 3b 0a 20 20 73 4e 43 2e 70 53 72 63 4c  = 1;.  sNC.pSrcL
1b910 69 73 74 20 3d 20 70 2d 3e 70 53 72 63 3b 0a 20  ist = p->pSrc;. 
1b920 20 73 4e 43 2e 70 4e 65 78 74 20 3d 20 70 4f 75   sNC.pNext = pOu
1b930 74 65 72 4e 43 3b 0a 0a 20 20 2f 2a 20 52 65 73  terNC;..  /* Res
1b940 6f 6c 76 65 20 6e 61 6d 65 73 20 69 6e 20 74 68  olve names in th
1b950 65 20 72 65 73 75 6c 74 20 73 65 74 2e 20 2a 2f  e result set. */
1b960 0a 20 20 70 45 4c 69 73 74 20 3d 20 70 2d 3e 70  .  pEList = p->p
1b970 45 4c 69 73 74 3b 0a 20 20 69 66 28 20 21 70 45  EList;.  if( !pE
1b980 4c 69 73 74 20 29 20 72 65 74 75 72 6e 20 53 51  List ) return SQ
1b990 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 66 6f  LITE_ERROR;.  fo
1b9a0 72 28 69 3d 30 3b 20 69 3c 70 45 4c 69 73 74 2d  r(i=0; i<pEList-
1b9b0 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20  >nExpr; i++){.  
1b9c0 20 20 45 78 70 72 20 2a 70 58 20 3d 20 70 45 4c    Expr *pX = pEL
1b9d0 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 3b  ist->a[i].pExpr;
1b9e0 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33  .    if( sqlite3
1b9f0 45 78 70 72 52 65 73 6f 6c 76 65 4e 61 6d 65 73  ExprResolveNames
1ba00 28 26 73 4e 43 2c 20 70 58 29 20 29 7b 0a 20 20  (&sNC, pX) ){.  
1ba10 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
1ba20 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20  E_ERROR;.    }. 
1ba30 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 72   }..  /* If ther
1ba40 65 20 61 72 65 20 6e 6f 20 61 67 67 72 65 67 61  e are no aggrega
1ba50 74 65 20 66 75 6e 63 74 69 6f 6e 73 20 69 6e 20  te functions in 
1ba60 74 68 65 20 72 65 73 75 6c 74 2d 73 65 74 2c 20  the result-set, 
1ba70 61 6e 64 20 6e 6f 20 47 52 4f 55 50 20 42 59 20  and no GROUP BY 
1ba80 0a 20 20 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e  .  ** expression
1ba90 2c 20 64 6f 20 6e 6f 74 20 61 6c 6c 6f 77 20 61  , do not allow a
1baa0 67 67 72 65 67 61 74 65 73 20 69 6e 20 61 6e 79  ggregates in any
1bab0 20 6f 66 20 74 68 65 20 6f 74 68 65 72 20 65 78   of the other ex
1bac0 70 72 65 73 73 69 6f 6e 73 2e 0a 20 20 2a 2f 0a  pressions..  */.
1bad0 20 20 61 73 73 65 72 74 28 20 21 70 2d 3e 69 73    assert( !p->is
1bae0 41 67 67 20 29 3b 0a 20 20 70 47 72 6f 75 70 42  Agg );.  pGroupB
1baf0 79 20 3d 20 70 2d 3e 70 47 72 6f 75 70 42 79 3b  y = p->pGroupBy;
1bb00 0a 20 20 69 66 28 20 70 47 72 6f 75 70 42 79 20  .  if( pGroupBy 
1bb10 7c 7c 20 73 4e 43 2e 68 61 73 41 67 67 20 29 7b  || sNC.hasAgg ){
1bb20 0a 20 20 20 20 70 2d 3e 69 73 41 67 67 20 3d 20  .    p->isAgg = 
1bb30 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  1;.  }else{.    
1bb40 73 4e 43 2e 61 6c 6c 6f 77 41 67 67 20 3d 20 30  sNC.allowAgg = 0
1bb50 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 61  ;.  }..  /* If a
1bb60 20 48 41 56 49 4e 47 20 63 6c 61 75 73 65 20 69   HAVING clause i
1bb70 73 20 70 72 65 73 65 6e 74 2c 20 74 68 65 6e 20  s present, then 
1bb80 74 68 65 72 65 20 6d 75 73 74 20 62 65 20 61 20  there must be a 
1bb90 47 52 4f 55 50 20 42 59 20 63 6c 61 75 73 65 2e  GROUP BY clause.
1bba0 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 70  .  */.  if( p->p
1bbb0 48 61 76 69 6e 67 20 26 26 20 21 70 47 72 6f 75  Having && !pGrou
1bbc0 70 42 79 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  pBy ){.    sqlit
1bbd0 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
1bbe0 65 2c 20 22 61 20 47 52 4f 55 50 20 42 59 20 63  e, "a GROUP BY c
1bbf0 6c 61 75 73 65 20 69 73 20 72 65 71 75 69 72 65  lause is require
1bc00 64 20 62 65 66 6f 72 65 20 48 41 56 49 4e 47 22  d before HAVING"
1bc10 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  );.    return SQ
1bc20 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a  LITE_ERROR;.  }.
1bc30 0a 20 20 2f 2a 20 41 64 64 20 74 68 65 20 65 78  .  /* Add the ex
1bc40 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 20 74 6f  pression list to
1bc50 20 74 68 65 20 6e 61 6d 65 2d 63 6f 6e 74 65 78   the name-contex
1bc60 74 20 62 65 66 6f 72 65 20 70 61 72 73 69 6e 67  t before parsing
1bc70 20 74 68 65 0a 20 20 2a 2a 20 6f 74 68 65 72 20   the.  ** other 
1bc80 65 78 70 72 65 73 73 69 6f 6e 73 20 69 6e 20 74  expressions in t
1bc90 68 65 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d  he SELECT statem
1bca0 65 6e 74 2e 20 54 68 69 73 20 69 73 20 73 6f 20  ent. This is so 
1bcb0 74 68 61 74 0a 20 20 2a 2a 20 65 78 70 72 65 73  that.  ** expres
1bcc0 73 69 6f 6e 73 20 69 6e 20 74 68 65 20 57 48 45  sions in the WHE
1bcd0 52 45 20 63 6c 61 75 73 65 20 28 65 74 63 2e 29  RE clause (etc.)
1bce0 20 63 61 6e 20 72 65 66 65 72 20 74 6f 20 65 78   can refer to ex
1bcf0 70 72 65 73 73 69 6f 6e 73 20 62 79 0a 20 20 2a  pressions by.  *
1bd00 2a 20 61 6c 69 61 73 65 73 20 69 6e 20 74 68 65  * aliases in the
1bd10 20 72 65 73 75 6c 74 20 73 65 74 2e 0a 20 20 2a   result set..  *
1bd20 2a 0a 20 20 2a 2a 20 4d 69 6e 6f 72 20 70 6f 69  *.  ** Minor poi
1bd30 6e 74 3a 20 49 66 20 74 68 69 73 20 69 73 20 74  nt: If this is t
1bd40 68 65 20 63 61 73 65 2c 20 74 68 65 6e 20 74 68  he case, then th
1bd50 65 20 65 78 70 72 65 73 73 69 6f 6e 20 77 69 6c  e expression wil
1bd60 6c 20 62 65 0a 20 20 2a 2a 20 72 65 2d 65 76 61  l be.  ** re-eva
1bd70 6c 75 61 74 65 64 20 66 6f 72 20 65 61 63 68 20  luated for each 
1bd80 72 65 66 65 72 65 6e 63 65 20 74 6f 20 69 74 2e  reference to it.
1bd90 0a 20 20 2a 2f 0a 20 20 73 4e 43 2e 70 45 4c 69  .  */.  sNC.pELi
1bda0 73 74 20 3d 20 70 2d 3e 70 45 4c 69 73 74 3b 0a  st = p->pEList;.
1bdb0 20 20 69 66 28 20 73 71 6c 69 74 65 33 45 78 70    if( sqlite3Exp
1bdc0 72 52 65 73 6f 6c 76 65 4e 61 6d 65 73 28 26 73  rResolveNames(&s
1bdd0 4e 43 2c 20 70 2d 3e 70 57 68 65 72 65 29 20 7c  NC, p->pWhere) |
1bde0 7c 0a 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  |.     sqlite3Ex
1bdf0 70 72 52 65 73 6f 6c 76 65 4e 61 6d 65 73 28 26  prResolveNames(&
1be00 73 4e 43 2c 20 70 2d 3e 70 48 61 76 69 6e 67 29  sNC, p->pHaving)
1be10 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
1be20 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d  QLITE_ERROR;.  }
1be30 0a 20 20 69 66 28 20 70 2d 3e 70 50 72 69 6f 72  .  if( p->pPrior
1be40 3d 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20 70  ==0 ){.    if( p
1be50 72 6f 63 65 73 73 4f 72 64 65 72 47 72 6f 75 70  rocessOrderGroup
1be60 42 79 28 70 50 61 72 73 65 2c 20 70 2c 20 70 2d  By(pParse, p, p-
1be70 3e 70 4f 72 64 65 72 42 79 2c 20 31 2c 20 26 73  >pOrderBy, 1, &s
1be80 4e 43 2e 68 61 73 41 67 67 29 20 29 7b 0a 20 20  NC.hasAgg) ){.  
1be90 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
1bea0 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20  E_ERROR;.    }. 
1beb0 20 7d 0a 20 20 69 66 28 20 70 72 6f 63 65 73 73   }.  if( process
1bec0 4f 72 64 65 72 47 72 6f 75 70 42 79 28 70 50 61  OrderGroupBy(pPa
1bed0 72 73 65 2c 20 70 2c 20 70 47 72 6f 75 70 42 79  rse, p, pGroupBy
1bee0 2c 20 30 2c 20 26 73 4e 43 2e 68 61 73 41 67 67  , 0, &sNC.hasAgg
1bef0 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  ) ){.    return 
1bf00 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20  SQLITE_ERROR;.  
1bf10 7d 0a 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d  }..  if( pParse-
1bf20 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65  >db->mallocFaile
1bf30 64 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  d ){.    return 
1bf40 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
1bf50 7d 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72  }..  /* Make sur
1bf60 65 20 74 68 65 20 47 52 4f 55 50 20 42 59 20 63  e the GROUP BY c
1bf70 6c 61 75 73 65 20 64 6f 65 73 20 6e 6f 74 20 63  lause does not c
1bf80 6f 6e 74 61 69 6e 20 61 67 67 72 65 67 61 74 65  ontain aggregate
1bf90 20 66 75 6e 63 74 69 6f 6e 73 2e 0a 20 20 2a 2f   functions..  */
1bfa0 0a 20 20 69 66 28 20 70 47 72 6f 75 70 42 79 20  .  if( pGroupBy 
1bfb0 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20 45 78  ){.    struct Ex
1bfc0 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74  prList_item *pIt
1bfd0 65 6d 3b 0a 20 20 0a 20 20 20 20 66 6f 72 28 69  em;.  .    for(i
1bfe0 3d 30 2c 20 70 49 74 65 6d 3d 70 47 72 6f 75 70  =0, pItem=pGroup
1bff0 42 79 2d 3e 61 3b 20 69 3c 70 47 72 6f 75 70 42  By->a; i<pGroupB
1c000 79 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 2c 20 70  y->nExpr; i++, p
1c010 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 69  Item++){.      i
1c020 66 28 20 45 78 70 72 48 61 73 50 72 6f 70 65 72  f( ExprHasProper
1c030 74 79 28 70 49 74 65 6d 2d 3e 70 45 78 70 72 2c  ty(pItem->pExpr,
1c040 20 45 50 5f 41 67 67 29 20 29 7b 0a 20 20 20 20   EP_Agg) ){.    
1c050 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
1c060 4d 73 67 28 70 50 61 72 73 65 2c 20 22 61 67 67  Msg(pParse, "agg
1c070 72 65 67 61 74 65 20 66 75 6e 63 74 69 6f 6e 73  regate functions
1c080 20 61 72 65 20 6e 6f 74 20 61 6c 6c 6f 77 65 64   are not allowed
1c090 20 69 6e 20 22 0a 20 20 20 20 20 20 20 20 20 20   in ".          
1c0a0 20 20 22 74 68 65 20 47 52 4f 55 50 20 42 59 20    "the GROUP BY 
1c0b0 63 6c 61 75 73 65 22 29 3b 0a 20 20 20 20 20 20  clause");.      
1c0c0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
1c0d0 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 7d 0a 20  ERROR;.      }. 
1c0e0 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49     }.  }..  /* I
1c0f0 66 20 74 68 69 73 20 69 73 20 6f 6e 65 20 53 45  f this is one SE
1c100 4c 45 43 54 20 6f 66 20 61 20 63 6f 6d 70 6f 75  LECT of a compou
1c110 6e 64 2c 20 62 65 20 73 75 72 65 20 74 6f 20 72  nd, be sure to r
1c120 65 73 6f 6c 76 65 20 6e 61 6d 65 73 0a 20 20 2a  esolve names.  *
1c130 2a 20 69 6e 20 74 68 65 20 6f 74 68 65 72 20 53  * in the other S
1c140 45 4c 45 43 54 73 2e 0a 20 20 2a 2f 0a 20 20 69  ELECTs..  */.  i
1c150 66 28 20 70 2d 3e 70 50 72 69 6f 72 20 29 7b 0a  f( p->pPrior ){.
1c160 20 20 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74      return sqlit
1c170 65 33 53 65 6c 65 63 74 52 65 73 6f 6c 76 65 28  e3SelectResolve(
1c180 70 50 61 72 73 65 2c 20 70 2d 3e 70 50 72 69 6f  pParse, p->pPrio
1c190 72 2c 20 70 4f 75 74 65 72 4e 43 29 3b 0a 20 20  r, pOuterNC);.  
1c1a0 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65 74 75 72  }else{.    retur
1c1b0 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d  n SQLITE_OK;.  }
1c1c0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 73 65 74 20  .}../*.** Reset 
1c1d0 74 68 65 20 61 67 67 72 65 67 61 74 65 20 61 63  the aggregate ac
1c1e0 63 75 6d 75 6c 61 74 6f 72 2e 0a 2a 2a 0a 2a 2a  cumulator..**.**
1c1f0 20 54 68 65 20 61 67 67 72 65 67 61 74 65 20 61   The aggregate a
1c200 63 63 75 6d 75 6c 61 74 6f 72 20 69 73 20 61 20  ccumulator is a 
1c210 73 65 74 20 6f 66 20 6d 65 6d 6f 72 79 20 63 65  set of memory ce
1c220 6c 6c 73 20 74 68 61 74 20 68 6f 6c 64 0a 2a 2a  lls that hold.**
1c230 20 69 6e 74 65 72 6d 65 64 69 61 74 65 20 72 65   intermediate re
1c240 73 75 6c 74 73 20 77 68 69 6c 65 20 63 61 6c 63  sults while calc
1c250 75 6c 61 74 69 6e 67 20 61 6e 20 61 67 67 72 65  ulating an aggre
1c260 67 61 74 65 2e 20 20 54 68 69 73 0a 2a 2a 20 72  gate.  This.** r
1c270 6f 75 74 69 6e 65 20 73 69 6d 70 6c 79 20 73 74  outine simply st
1c280 6f 72 65 73 20 4e 55 4c 4c 73 20 69 6e 20 61 6c  ores NULLs in al
1c290 6c 20 6f 66 20 74 68 6f 73 65 20 6d 65 6d 6f 72  l of those memor
1c2a0 79 20 63 65 6c 6c 73 2e 0a 2a 2f 0a 73 74 61 74  y cells..*/.stat
1c2b0 69 63 20 76 6f 69 64 20 72 65 73 65 74 41 63 63  ic void resetAcc
1c2c0 75 6d 75 6c 61 74 6f 72 28 50 61 72 73 65 20 2a  umulator(Parse *
1c2d0 70 50 61 72 73 65 2c 20 41 67 67 49 6e 66 6f 20  pParse, AggInfo 
1c2e0 2a 70 41 67 67 49 6e 66 6f 29 7b 0a 20 20 56 64  *pAggInfo){.  Vd
1c2f0 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e  be *v = pParse->
1c300 70 56 64 62 65 3b 0a 20 20 69 6e 74 20 69 3b 0a  pVdbe;.  int i;.
1c310 20 20 73 74 72 75 63 74 20 41 67 67 49 6e 66 6f    struct AggInfo
1c320 5f 66 75 6e 63 20 2a 70 46 75 6e 63 3b 0a 20 20  _func *pFunc;.  
1c330 69 66 28 20 70 41 67 67 49 6e 66 6f 2d 3e 6e 46  if( pAggInfo->nF
1c340 75 6e 63 2b 70 41 67 67 49 6e 66 6f 2d 3e 6e 43  unc+pAggInfo->nC
1c350 6f 6c 75 6d 6e 3d 3d 30 20 29 7b 0a 20 20 20 20  olumn==0 ){.    
1c360 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 66 6f  return;.  }.  fo
1c370 72 28 69 3d 30 3b 20 69 3c 70 41 67 67 49 6e 66  r(i=0; i<pAggInf
1c380 6f 2d 3e 6e 43 6f 6c 75 6d 6e 3b 20 69 2b 2b 29  o->nColumn; i++)
1c390 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  {.    sqlite3Vdb
1c3a0 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 75  eAddOp2(v, OP_Nu
1c3b0 6c 6c 2c 20 30 2c 20 70 41 67 67 49 6e 66 6f 2d  ll, 0, pAggInfo-
1c3c0 3e 61 43 6f 6c 5b 69 5d 2e 69 4d 65 6d 29 3b 0a  >aCol[i].iMem);.
1c3d0 20 20 7d 0a 20 20 66 6f 72 28 70 46 75 6e 63 3d    }.  for(pFunc=
1c3e0 70 41 67 67 49 6e 66 6f 2d 3e 61 46 75 6e 63 2c  pAggInfo->aFunc,
1c3f0 20 69 3d 30 3b 20 69 3c 70 41 67 67 49 6e 66 6f   i=0; i<pAggInfo
1c400 2d 3e 6e 46 75 6e 63 3b 20 69 2b 2b 2c 20 70 46  ->nFunc; i++, pF
1c410 75 6e 63 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69  unc++){.    sqli
1c420 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
1c430 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20 70 46 75   OP_Null, 0, pFu
1c440 6e 63 2d 3e 69 4d 65 6d 29 3b 0a 20 20 20 20 69  nc->iMem);.    i
1c450 66 28 20 70 46 75 6e 63 2d 3e 69 44 69 73 74 69  f( pFunc->iDisti
1c460 6e 63 74 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20  nct>=0 ){.      
1c470 45 78 70 72 20 2a 70 45 20 3d 20 70 46 75 6e 63  Expr *pE = pFunc
1c480 2d 3e 70 45 78 70 72 3b 0a 20 20 20 20 20 20 69  ->pExpr;.      i
1c490 66 28 20 70 45 2d 3e 70 4c 69 73 74 3d 3d 30 20  f( pE->pList==0 
1c4a0 7c 7c 20 70 45 2d 3e 70 4c 69 73 74 2d 3e 6e 45  || pE->pList->nE
1c4b0 78 70 72 21 3d 31 20 29 7b 0a 20 20 20 20 20 20  xpr!=1 ){.      
1c4c0 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
1c4d0 67 28 70 50 61 72 73 65 2c 20 22 44 49 53 54 49  g(pParse, "DISTI
1c4e0 4e 43 54 20 69 6e 20 61 67 67 72 65 67 61 74 65  NCT in aggregate
1c4f0 20 6d 75 73 74 20 62 65 20 66 6f 6c 6c 6f 77 65   must be followe
1c500 64 20 22 0a 20 20 20 20 20 20 20 20 20 20 20 22  d ".           "
1c510 62 79 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e  by an expression
1c520 22 29 3b 0a 20 20 20 20 20 20 20 20 70 46 75 6e  ");.        pFun
1c530 63 2d 3e 69 44 69 73 74 69 6e 63 74 20 3d 20 2d  c->iDistinct = -
1c540 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  1;.      }else{.
1c550 20 20 20 20 20 20 20 20 4b 65 79 49 6e 66 6f 20          KeyInfo 
1c560 2a 70 4b 65 79 49 6e 66 6f 20 3d 20 6b 65 79 49  *pKeyInfo = keyI
1c570 6e 66 6f 46 72 6f 6d 45 78 70 72 4c 69 73 74 28  nfoFromExprList(
1c580 70 50 61 72 73 65 2c 20 70 45 2d 3e 70 4c 69 73  pParse, pE->pLis
1c590 74 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  t);.        sqli
1c5a0 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c  te3VdbeAddOp4(v,
1c5b0 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61   OP_OpenEphemera
1c5c0 6c 2c 20 70 46 75 6e 63 2d 3e 69 44 69 73 74 69  l, pFunc->iDisti
1c5d0 6e 63 74 2c 20 30 2c 20 30 2c 0a 20 20 20 20 20  nct, 0, 0,.     
1c5e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c5f0 20 20 20 20 20 28 63 68 61 72 2a 29 70 4b 65 79       (char*)pKey
1c600 49 6e 66 6f 2c 20 50 34 5f 4b 45 59 49 4e 46 4f  Info, P4_KEYINFO
1c610 5f 48 41 4e 44 4f 46 46 29 3b 0a 20 20 20 20 20  _HANDOFF);.     
1c620 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a   }.    }.  }.}..
1c630 2f 2a 0a 2a 2a 20 49 6e 76 6f 6b 65 20 74 68 65  /*.** Invoke the
1c640 20 4f 50 5f 41 67 67 46 69 6e 61 6c 69 7a 65 20   OP_AggFinalize 
1c650 6f 70 63 6f 64 65 20 66 6f 72 20 65 76 65 72 79  opcode for every
1c660 20 61 67 67 72 65 67 61 74 65 20 66 75 6e 63 74   aggregate funct
1c670 69 6f 6e 0a 2a 2a 20 69 6e 20 74 68 65 20 41 67  ion.** in the Ag
1c680 67 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65 2e  gInfo structure.
1c690 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
1c6a0 66 69 6e 61 6c 69 7a 65 41 67 67 46 75 6e 63 74  finalizeAggFunct
1c6b0 69 6f 6e 73 28 50 61 72 73 65 20 2a 70 50 61 72  ions(Parse *pPar
1c6c0 73 65 2c 20 41 67 67 49 6e 66 6f 20 2a 70 41 67  se, AggInfo *pAg
1c6d0 67 49 6e 66 6f 29 7b 0a 20 20 56 64 62 65 20 2a  gInfo){.  Vdbe *
1c6e0 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62  v = pParse->pVdb
1c6f0 65 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 73 74  e;.  int i;.  st
1c700 72 75 63 74 20 41 67 67 49 6e 66 6f 5f 66 75 6e  ruct AggInfo_fun
1c710 63 20 2a 70 46 3b 0a 20 20 66 6f 72 28 69 3d 30  c *pF;.  for(i=0
1c720 2c 20 70 46 3d 70 41 67 67 49 6e 66 6f 2d 3e 61  , pF=pAggInfo->a
1c730 46 75 6e 63 3b 20 69 3c 70 41 67 67 49 6e 66 6f  Func; i<pAggInfo
1c740 2d 3e 6e 46 75 6e 63 3b 20 69 2b 2b 2c 20 70 46  ->nFunc; i++, pF
1c750 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72 4c 69 73  ++){.    ExprLis
1c760 74 20 2a 70 4c 69 73 74 20 3d 20 70 46 2d 3e 70  t *pList = pF->p
1c770 45 78 70 72 2d 3e 70 4c 69 73 74 3b 0a 20 20 20  Expr->pList;.   
1c780 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
1c790 70 34 28 76 2c 20 4f 50 5f 41 67 67 46 69 6e 61  p4(v, OP_AggFina
1c7a0 6c 2c 20 70 46 2d 3e 69 4d 65 6d 2c 20 70 4c 69  l, pF->iMem, pLi
1c7b0 73 74 20 3f 20 70 4c 69 73 74 2d 3e 6e 45 78 70  st ? pList->nExp
1c7c0 72 20 3a 20 30 2c 20 30 2c 0a 20 20 20 20 20 20  r : 0, 0,.      
1c7d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c7e0 28 76 6f 69 64 2a 29 70 46 2d 3e 70 46 75 6e 63  (void*)pF->pFunc
1c7f0 2c 20 50 34 5f 46 55 4e 43 44 45 46 29 3b 0a 20  , P4_FUNCDEF);. 
1c800 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 70 64 61   }.}../*.** Upda
1c810 74 65 20 74 68 65 20 61 63 63 75 6d 75 6c 61 74  te the accumulat
1c820 6f 72 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 73 20  or memory cells 
1c830 66 6f 72 20 61 6e 20 61 67 67 72 65 67 61 74 65  for an aggregate
1c840 20 62 61 73 65 64 20 6f 6e 0a 2a 2a 20 74 68 65   based on.** the
1c850 20 63 75 72 72 65 6e 74 20 63 75 72 73 6f 72 20   current cursor 
1c860 70 6f 73 69 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61  position..*/.sta
1c870 74 69 63 20 76 6f 69 64 20 75 70 64 61 74 65 41  tic void updateA
1c880 63 63 75 6d 75 6c 61 74 6f 72 28 50 61 72 73 65  ccumulator(Parse
1c890 20 2a 70 50 61 72 73 65 2c 20 41 67 67 49 6e 66   *pParse, AggInf
1c8a0 6f 20 2a 70 41 67 67 49 6e 66 6f 29 7b 0a 20 20  o *pAggInfo){.  
1c8b0 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65  Vdbe *v = pParse
1c8c0 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74 20 69  ->pVdbe;.  int i
1c8d0 3b 0a 20 20 73 74 72 75 63 74 20 41 67 67 49 6e  ;.  struct AggIn
1c8e0 66 6f 5f 66 75 6e 63 20 2a 70 46 3b 0a 20 20 73  fo_func *pF;.  s
1c8f0 74 72 75 63 74 20 41 67 67 49 6e 66 6f 5f 63 6f  truct AggInfo_co
1c900 6c 20 2a 70 43 3b 0a 0a 20 20 70 41 67 67 49 6e  l *pC;..  pAggIn
1c910 66 6f 2d 3e 64 69 72 65 63 74 4d 6f 64 65 20 3d  fo->directMode =
1c920 20 31 3b 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70   1;.  for(i=0, p
1c930 46 3d 70 41 67 67 49 6e 66 6f 2d 3e 61 46 75 6e  F=pAggInfo->aFun
1c940 63 3b 20 69 3c 70 41 67 67 49 6e 66 6f 2d 3e 6e  c; i<pAggInfo->n
1c950 46 75 6e 63 3b 20 69 2b 2b 2c 20 70 46 2b 2b 29  Func; i++, pF++)
1c960 7b 0a 20 20 20 20 69 6e 74 20 6e 41 72 67 3b 0a  {.    int nArg;.
1c970 20 20 20 20 69 6e 74 20 61 64 64 72 4e 65 78 74      int addrNext
1c980 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 72 65   = 0;.    int re
1c990 67 41 67 67 3b 0a 20 20 20 20 45 78 70 72 4c 69  gAgg;.    ExprLi
1c9a0 73 74 20 2a 70 4c 69 73 74 20 3d 20 70 46 2d 3e  st *pList = pF->
1c9b0 70 45 78 70 72 2d 3e 70 4c 69 73 74 3b 0a 20 20  pExpr->pList;.  
1c9c0 20 20 69 66 28 20 70 4c 69 73 74 20 29 7b 0a 20    if( pList ){. 
1c9d0 20 20 20 20 20 6e 41 72 67 20 3d 20 70 4c 69 73       nArg = pLis
1c9e0 74 2d 3e 6e 45 78 70 72 3b 0a 20 20 20 20 20 20  t->nExpr;.      
1c9f0 72 65 67 41 67 67 20 3d 20 73 71 6c 69 74 65 33  regAgg = sqlite3
1ca00 47 65 74 54 65 6d 70 52 61 6e 67 65 28 70 50 61  GetTempRange(pPa
1ca10 72 73 65 2c 20 6e 41 72 67 29 3b 0a 20 20 20 20  rse, nArg);.    
1ca20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64    sqlite3ExprCod
1ca30 65 45 78 70 72 4c 69 73 74 28 70 50 61 72 73 65  eExprList(pParse
1ca40 2c 20 70 4c 69 73 74 2c 20 72 65 67 41 67 67 2c  , pList, regAgg,
1ca50 20 30 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a   0);.    }else{.
1ca60 20 20 20 20 20 20 6e 41 72 67 20 3d 20 30 3b 0a        nArg = 0;.
1ca70 20 20 20 20 20 20 72 65 67 41 67 67 20 3d 20 30        regAgg = 0
1ca80 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
1ca90 70 46 2d 3e 69 44 69 73 74 69 6e 63 74 3e 3d 30  pF->iDistinct>=0
1caa0 20 29 7b 0a 20 20 20 20 20 20 61 64 64 72 4e 65   ){.      addrNe
1cab0 78 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  xt = sqlite3Vdbe
1cac0 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20  MakeLabel(v);.  
1cad0 20 20 20 20 61 73 73 65 72 74 28 20 6e 41 72 67      assert( nArg
1cae0 3d 3d 31 20 29 3b 0a 20 20 20 20 20 20 63 6f 64  ==1 );.      cod
1caf0 65 44 69 73 74 69 6e 63 74 28 70 50 61 72 73 65  eDistinct(pParse
1cb00 2c 20 70 46 2d 3e 69 44 69 73 74 69 6e 63 74 2c  , pF->iDistinct,
1cb10 20 61 64 64 72 4e 65 78 74 2c 20 31 2c 20 72 65   addrNext, 1, re
1cb20 67 41 67 67 29 3b 0a 20 20 20 20 7d 0a 20 20 20  gAgg);.    }.   
1cb30 20 69 66 28 20 70 46 2d 3e 70 46 75 6e 63 2d 3e   if( pF->pFunc->
1cb40 6e 65 65 64 43 6f 6c 6c 53 65 71 20 29 7b 0a 20  needCollSeq ){. 
1cb50 20 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43       CollSeq *pC
1cb60 6f 6c 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20 73  oll = 0;.      s
1cb70 74 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69  truct ExprList_i
1cb80 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 20 20  tem *pItem;.    
1cb90 20 20 69 6e 74 20 6a 3b 0a 20 20 20 20 20 20 61    int j;.      a
1cba0 73 73 65 72 74 28 20 70 4c 69 73 74 21 3d 30 20  ssert( pList!=0 
1cbb0 29 3b 20 20 2f 2a 20 70 4c 69 73 74 21 3d 30 20  );  /* pList!=0 
1cbc0 69 66 20 70 46 2d 3e 70 46 75 6e 63 2d 3e 6e 65  if pF->pFunc->ne
1cbd0 65 64 43 6f 6c 6c 53 65 71 20 69 73 20 74 72 75  edCollSeq is tru
1cbe0 65 20 2a 2f 0a 20 20 20 20 20 20 66 6f 72 28 6a  e */.      for(j
1cbf0 3d 30 2c 20 70 49 74 65 6d 3d 70 4c 69 73 74 2d  =0, pItem=pList-
1cc00 3e 61 3b 20 21 70 43 6f 6c 6c 20 26 26 20 6a 3c  >a; !pColl && j<
1cc10 6e 41 72 67 3b 20 6a 2b 2b 2c 20 70 49 74 65 6d  nArg; j++, pItem
1cc20 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 70 43 6f  ++){.        pCo
1cc30 6c 6c 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  ll = sqlite3Expr
1cc40 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20  CollSeq(pParse, 
1cc50 70 49 74 65 6d 2d 3e 70 45 78 70 72 29 3b 0a 20  pItem->pExpr);. 
1cc60 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
1cc70 20 21 70 43 6f 6c 6c 20 29 7b 0a 20 20 20 20 20   !pColl ){.     
1cc80 20 20 20 70 43 6f 6c 6c 20 3d 20 70 50 61 72 73     pColl = pPars
1cc90 65 2d 3e 64 62 2d 3e 70 44 66 6c 74 43 6f 6c 6c  e->db->pDfltColl
1cca0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
1ccb0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
1ccc0 34 28 76 2c 20 4f 50 5f 43 6f 6c 6c 53 65 71 2c  4(v, OP_CollSeq,
1ccd0 20 30 2c 20 30 2c 20 30 2c 20 28 63 68 61 72 20   0, 0, 0, (char 
1cce0 2a 29 70 43 6f 6c 6c 2c 20 50 34 5f 43 4f 4c 4c  *)pColl, P4_COLL
1ccf0 53 45 51 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  SEQ);.    }.    
1cd00 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
1cd10 34 28 76 2c 20 4f 50 5f 41 67 67 53 74 65 70 2c  4(v, OP_AggStep,
1cd20 20 30 2c 20 72 65 67 41 67 67 2c 20 70 46 2d 3e   0, regAgg, pF->
1cd30 69 4d 65 6d 2c 0a 20 20 20 20 20 20 20 20 20 20  iMem,.          
1cd40 20 20 20 20 20 20 20 20 20 20 20 20 28 76 6f 69              (voi
1cd50 64 2a 29 70 46 2d 3e 70 46 75 6e 63 2c 20 50 34  d*)pF->pFunc, P4
1cd60 5f 46 55 4e 43 44 45 46 29 3b 0a 20 20 20 20 73  _FUNCDEF);.    s
1cd70 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65  qlite3VdbeChange
1cd80 50 35 28 76 2c 20 6e 41 72 67 29 3b 0a 20 20 20  P5(v, nArg);.   
1cd90 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54   sqlite3ReleaseT
1cda0 65 6d 70 52 61 6e 67 65 28 70 50 61 72 73 65 2c  empRange(pParse,
1cdb0 20 72 65 67 41 67 67 2c 20 6e 41 72 67 29 3b 0a   regAgg, nArg);.
1cdc0 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
1cdd0 61 63 68 65 41 66 66 69 6e 69 74 79 43 68 61 6e  acheAffinityChan
1cde0 67 65 28 70 50 61 72 73 65 2c 20 72 65 67 41 67  ge(pParse, regAg
1cdf0 67 2c 20 6e 41 72 67 29 3b 0a 20 20 20 20 69 66  g, nArg);.    if
1ce00 28 20 61 64 64 72 4e 65 78 74 20 29 7b 0a 20 20  ( addrNext ){.  
1ce10 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 52      sqlite3VdbeR
1ce20 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 61  esolveLabel(v, a
1ce30 64 64 72 4e 65 78 74 29 3b 0a 20 20 20 20 7d 0a  ddrNext);.    }.
1ce40 20 20 7d 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70    }.  for(i=0, p
1ce50 43 3d 70 41 67 67 49 6e 66 6f 2d 3e 61 43 6f 6c  C=pAggInfo->aCol
1ce60 3b 20 69 3c 70 41 67 67 49 6e 66 6f 2d 3e 6e 41  ; i<pAggInfo->nA
1ce70 63 63 75 6d 75 6c 61 74 6f 72 3b 20 69 2b 2b 2c  ccumulator; i++,
1ce80 20 70 43 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69   pC++){.    sqli
1ce90 74 65 33 45 78 70 72 43 6f 64 65 28 70 50 61 72  te3ExprCode(pPar
1cea0 73 65 2c 20 70 43 2d 3e 70 45 78 70 72 2c 20 70  se, pC->pExpr, p
1ceb0 43 2d 3e 69 4d 65 6d 29 3b 0a 20 20 7d 0a 20 20  C->iMem);.  }.  
1cec0 70 41 67 67 49 6e 66 6f 2d 3e 64 69 72 65 63 74  pAggInfo->direct
1ced0 4d 6f 64 65 20 3d 20 30 3b 0a 7d 0a 0a 23 69 66  Mode = 0;.}..#if
1cee0 20 30 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75   0./*.** This fu
1cef0 6e 63 74 69 6f 6e 20 69 73 20 75 73 65 64 20 77  nction is used w
1cf00 68 65 6e 20 61 20 53 45 4c 45 43 54 20 73 74 61  hen a SELECT sta
1cf10 74 65 6d 65 6e 74 20 69 73 20 75 73 65 64 20 74  tement is used t
1cf20 6f 20 63 72 65 61 74 65 20 61 0a 2a 2a 20 74 65  o create a.** te
1cf30 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20 66 6f  mporary table fo
1cf40 72 20 69 74 65 72 61 74 69 6e 67 20 74 68 72 6f  r iterating thro
1cf50 75 67 68 20 77 68 65 6e 20 72 75 6e 6e 69 6e 67  ugh when running
1cf60 20 61 6e 20 49 4e 53 54 45 41 44 20 4f 46 0a 2a   an INSTEAD OF.*
1cf70 2a 20 55 50 44 41 54 45 20 6f 72 20 49 4e 53 54  * UPDATE or INST
1cf80 45 41 44 20 4f 46 20 44 45 4c 45 54 45 20 74 72  EAD OF DELETE tr
1cf90 69 67 67 65 72 2e 20 0a 2a 2a 0a 2a 2a 20 49 66  igger. .**.** If
1cfa0 20 70 6f 73 73 69 62 6c 65 2c 20 74 68 65 20 53   possible, the S
1cfb0 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20  ELECT statement 
1cfc0 69 73 20 6d 6f 64 69 66 69 65 64 20 73 6f 20 74  is modified so t
1cfd0 68 61 74 20 4e 55 4c 4c 20 76 61 6c 75 65 73 0a  hat NULL values.
1cfe0 2a 2a 20 61 72 65 20 73 74 6f 72 65 64 20 69 6e  ** are stored in
1cff0 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79 20 74   the temporary t
1d000 61 62 6c 65 20 66 6f 72 20 61 6c 6c 20 63 6f 6c  able for all col
1d010 75 6d 6e 73 20 66 6f 72 20 77 68 69 63 68 20 74  umns for which t
1d020 68 65 20 0a 2a 2a 20 63 6f 72 72 65 73 70 6f 6e  he .** correspon
1d030 64 69 6e 67 20 62 69 74 20 69 6e 20 61 72 67 75  ding bit in argu
1d040 6d 65 6e 74 20 6d 61 73 6b 20 69 73 20 6e 6f 74  ment mask is not
1d050 20 73 65 74 2e 20 49 66 20 6d 61 73 6b 20 74 61   set. If mask ta
1d060 6b 65 73 20 74 68 65 0a 2a 2a 20 73 70 65 63 69  kes the.** speci
1d070 61 6c 20 76 61 6c 75 65 20 30 78 66 66 66 66 66  al value 0xfffff
1d080 66 66 66 2c 20 74 68 65 6e 20 61 6c 6c 20 63 6f  fff, then all co
1d090 6c 75 6d 6e 73 20 61 72 65 20 70 6f 70 75 6c 61  lumns are popula
1d0a0 74 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ted..*/.void sql
1d0b0 69 74 65 33 53 65 6c 65 63 74 4d 61 73 6b 28 50  ite3SelectMask(P
1d0c0 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 53 65  arse *pParse, Se
1d0d0 6c 65 63 74 20 2a 70 2c 20 75 33 32 20 6d 61 73  lect *p, u32 mas
1d0e0 6b 29 7b 0a 20 20 69 66 28 20 70 20 26 26 20 21  k){.  if( p && !
1d0f0 70 2d 3e 70 50 72 69 6f 72 20 26 26 20 21 70 2d  p->pPrior && !p-
1d100 3e 69 73 44 69 73 74 69 6e 63 74 20 26 26 20 6d  >isDistinct && m
1d110 61 73 6b 21 3d 30 78 66 66 66 66 66 66 66 66 20  ask!=0xffffffff 
1d120 29 7b 0a 20 20 20 20 45 78 70 72 4c 69 73 74 20  ){.    ExprList 
1d130 2a 70 45 4c 69 73 74 3b 0a 20 20 20 20 69 6e 74  *pEList;.    int
1d140 20 69 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 53   i;.    sqlite3S
1d150 65 6c 65 63 74 52 65 73 6f 6c 76 65 28 70 50 61  electResolve(pPa
1d160 72 73 65 2c 20 70 2c 20 30 29 3b 0a 20 20 20 20  rse, p, 0);.    
1d170 70 45 4c 69 73 74 20 3d 20 70 2d 3e 70 45 4c 69  pEList = p->pELi
1d180 73 74 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b  st;.    for(i=0;
1d190 20 70 45 4c 69 73 74 20 26 26 20 69 3c 70 45 4c   pEList && i<pEL
1d1a0 69 73 74 2d 3e 6e 45 78 70 72 20 26 26 20 69 3c  ist->nExpr && i<
1d1b0 33 32 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  32; i++){.      
1d1c0 69 66 28 20 21 28 6d 61 73 6b 26 28 28 75 33 32  if( !(mask&((u32
1d1d0 29 31 3c 3c 69 29 29 20 29 7b 0a 20 20 20 20 20  )1<<i)) ){.     
1d1e0 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65     sqlite3ExprDe
1d1f0 6c 65 74 65 28 70 45 4c 69 73 74 2d 3e 61 5b 69  lete(pEList->a[i
1d200 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20  ].pExpr);.      
1d210 20 20 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70    pEList->a[i].p
1d220 45 78 70 72 20 3d 20 73 71 6c 69 74 65 33 45 78  Expr = sqlite3Ex
1d230 70 72 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 54  pr(pParse->db, T
1d240 4b 5f 4e 55 4c 4c 2c 20 30 2c 20 30 2c 20 30 29  K_NULL, 0, 0, 0)
1d250 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
1d260 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a    }.}.#endif../*
1d270 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64  .** Generate cod
1d280 65 20 66 6f 72 20 74 68 65 20 67 69 76 65 6e 20  e for the given 
1d290 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
1d2a0 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 72 65 73 75  ..**.** The resu
1d2b0 6c 74 73 20 61 72 65 20 64 69 73 74 72 69 62 75  lts are distribu
1d2c0 74 65 64 20 69 6e 20 76 61 72 69 6f 75 73 20 77  ted in various w
1d2d0 61 79 73 20 64 65 70 65 6e 64 69 6e 67 20 6f 6e  ays depending on
1d2e0 20 74 68 65 0a 2a 2a 20 63 6f 6e 74 65 6e 74 73   the.** contents
1d2f0 20 6f 66 20 74 68 65 20 53 65 6c 65 63 74 44 65   of the SelectDe
1d300 73 74 20 73 74 72 75 63 74 75 72 65 20 70 6f 69  st structure poi
1d310 6e 74 65 64 20 74 6f 20 62 79 20 61 72 67 75 6d  nted to by argum
1d320 65 6e 74 20 70 44 65 73 74 0a 2a 2a 20 61 73 20  ent pDest.** as 
1d330 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20  follows:.**.**  
1d340 20 20 20 70 44 65 73 74 2d 3e 65 44 65 73 74 20     pDest->eDest 
1d350 20 20 20 52 65 73 75 6c 74 0a 2a 2a 20 20 20 20     Result.**    
1d360 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 20 20 20   ------------   
1d370 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   ---------------
1d380 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1d390 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a 20  ------------.** 
1d3a0 20 20 20 20 53 52 54 5f 43 61 6c 6c 62 61 63 6b      SRT_Callback
1d3b0 20 20 20 20 49 6e 76 6f 6b 65 20 74 68 65 20 63      Invoke the c
1d3c0 61 6c 6c 62 61 63 6b 20 66 6f 72 20 65 61 63 68  allback for each
1d3d0 20 72 6f 77 20 6f 66 20 74 68 65 20 72 65 73 75   row of the resu
1d3e0 6c 74 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 52  lt..**.**     SR
1d3f0 54 5f 4d 65 6d 20 20 20 20 20 20 20 20 20 53 74  T_Mem         St
1d400 6f 72 65 20 66 69 72 73 74 20 72 65 73 75 6c 74  ore first result
1d410 20 69 6e 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 20   in memory cell 
1d420 70 44 65 73 74 2d 3e 69 50 61 72 6d 0a 2a 2a 0a  pDest->iParm.**.
1d430 2a 2a 20 20 20 20 20 53 52 54 5f 53 65 74 20 20  **     SRT_Set  
1d440 20 20 20 20 20 20 20 53 74 6f 72 65 20 72 65 73         Store res
1d450 75 6c 74 73 20 61 73 20 6b 65 79 73 20 6f 66 20  ults as keys of 
1d460 74 61 62 6c 65 20 70 44 65 73 74 2d 3e 69 50 61  table pDest->iPa
1d470 72 6d 2e 20 0a 2a 2a 20 20 20 20 20 20 20 20 20  rm. .**         
1d480 20 20 20 20 20 20 20 20 20 20 20 20 41 70 70 6c              Appl
1d490 79 20 74 68 65 20 61 66 66 69 6e 69 74 79 20 70  y the affinity p
1d4a0 44 65 73 74 2d 3e 61 66 66 69 6e 69 74 79 20 62  Dest->affinity b
1d4b0 65 66 6f 72 65 20 73 74 6f 72 69 6e 67 20 74 68  efore storing th
1d4c0 65 6d 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 52  em..**.**     SR
1d4d0 54 5f 55 6e 69 6f 6e 20 20 20 20 20 20 20 53 74  T_Union       St
1d4e0 6f 72 65 20 72 65 73 75 6c 74 73 20 61 73 20 61  ore results as a
1d4f0 20 6b 65 79 20 69 6e 20 61 20 74 65 6d 70 6f 72   key in a tempor
1d500 61 72 79 20 74 61 62 6c 65 20 70 44 65 73 74 2d  ary table pDest-
1d510 3e 69 50 61 72 6d 2e 0a 2a 2a 0a 2a 2a 20 20 20  >iParm..**.**   
1d520 20 20 53 52 54 5f 45 78 63 65 70 74 20 20 20 20    SRT_Except    
1d530 20 20 52 65 6d 6f 76 65 20 72 65 73 75 6c 74 73    Remove results
1d540 20 66 72 6f 6d 20 74 68 65 20 74 65 6d 70 6f 72   from the tempor
1d550 61 72 79 20 74 61 62 6c 65 20 70 44 65 73 74 2d  ary table pDest-
1d560 3e 69 50 61 72 6d 2e 0a 2a 2a 0a 2a 2a 20 20 20  >iParm..**.**   
1d570 20 20 53 52 54 5f 54 61 62 6c 65 20 20 20 20 20    SRT_Table     
1d580 20 20 53 74 6f 72 65 20 72 65 73 75 6c 74 73 20    Store results 
1d590 69 6e 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62  in temporary tab
1d5a0 6c 65 20 70 44 65 73 74 2d 3e 69 50 61 72 6d 0a  le pDest->iParm.
1d5b0 2a 2a 0a 2a 2a 20 20 20 20 20 53 52 54 5f 45 70  **.**     SRT_Ep
1d5c0 68 65 6d 54 61 62 20 20 20 20 43 72 65 61 74 65  hemTab    Create
1d5d0 20 61 6e 20 74 65 6d 70 6f 72 61 72 79 20 74 61   an temporary ta
1d5e0 62 6c 65 20 70 44 65 73 74 2d 3e 69 50 61 72 6d  ble pDest->iParm
1d5f0 20 61 6e 64 20 73 74 6f 72 65 0a 2a 2a 20 20 20   and store.**   
1d600 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d610 20 20 74 68 65 20 72 65 73 75 6c 74 20 74 68 65    the result the
1d620 72 65 2e 20 54 68 65 20 63 75 72 73 6f 72 20 69  re. The cursor i
1d630 73 20 6c 65 66 74 20 6f 70 65 6e 20 61 66 74 65  s left open afte
1d640 72 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  r.**            
1d650 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 69           returni
1d660 6e 67 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 52  ng..**.**     SR
1d670 54 5f 43 6f 72 6f 75 74 69 6e 65 20 20 20 49 6e  T_Coroutine   In
1d680 76 6f 6b 65 20 61 20 63 6f 2d 72 6f 75 74 69 6e  voke a co-routin
1d690 65 20 74 6f 20 63 6f 6d 70 75 74 65 20 61 20 73  e to compute a s
1d6a0 69 6e 67 6c 65 20 72 6f 77 20 6f 66 20 0a 2a 2a  ingle row of .**
1d6b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d6c0 20 20 20 20 20 74 68 65 20 72 65 73 75 6c 74 0a       the result.
1d6d0 2a 2a 0a 2a 2a 20 20 20 20 20 53 52 54 5f 45 78  **.**     SRT_Ex
1d6e0 69 73 74 73 20 20 20 20 20 20 53 74 6f 72 65 20  ists      Store 
1d6f0 61 20 31 20 69 6e 20 6d 65 6d 6f 72 79 20 63 65  a 1 in memory ce
1d700 6c 6c 20 70 44 65 73 74 2d 3e 69 50 61 72 6d 20  ll pDest->iParm 
1d710 69 66 20 74 68 65 20 72 65 73 75 6c 74 0a 2a 2a  if the result.**
1d720 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d730 20 20 20 20 20 73 65 74 20 69 73 20 6e 6f 74 20       set is not 
1d740 65 6d 70 74 79 2e 0a 2a 2a 0a 2a 2a 20 20 20 20  empty..**.**    
1d750 20 53 52 54 5f 44 69 73 63 61 72 64 20 20 20 20   SRT_Discard    
1d760 20 54 68 72 6f 77 20 74 68 65 20 72 65 73 75 6c   Throw the resul
1d770 74 73 20 61 77 61 79 2e 0a 2a 2a 0a 2a 2a 20 53  ts away..**.** S
1d780 65 65 20 74 68 65 20 73 65 6c 65 63 74 49 6e 6e  ee the selectInn
1d790 65 72 4c 6f 6f 70 28 29 20 66 75 6e 63 74 69 6f  erLoop() functio
1d7a0 6e 20 66 6f 72 20 61 20 63 61 6e 6f 6e 69 63 61  n for a canonica
1d7b0 6c 20 6c 69 73 74 69 6e 67 20 6f 66 20 74 68 65  l listing of the
1d7c0 20 0a 2a 2a 20 61 6c 6c 6f 77 65 64 20 76 61 6c   .** allowed val
1d7d0 75 65 73 20 6f 66 20 65 44 65 73 74 20 61 6e 64  ues of eDest and
1d7e0 20 74 68 65 69 72 20 6d 65 61 6e 69 6e 67 73 2e   their meanings.
1d7f0 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
1d800 69 6e 65 20 72 65 74 75 72 6e 73 20 74 68 65 20  ine returns the 
1d810 6e 75 6d 62 65 72 20 6f 66 20 65 72 72 6f 72 73  number of errors
1d820 2e 20 20 49 66 20 61 6e 79 20 65 72 72 6f 72 73  .  If any errors
1d830 20 61 72 65 0a 2a 2a 20 65 6e 63 6f 75 6e 74 65   are.** encounte
1d840 72 65 64 2c 20 74 68 65 6e 20 61 6e 20 61 70 70  red, then an app
1d850 72 6f 70 72 69 61 74 65 20 65 72 72 6f 72 20 6d  ropriate error m
1d860 65 73 73 61 67 65 20 69 73 20 6c 65 66 74 20 69  essage is left i
1d870 6e 0a 2a 2a 20 70 50 61 72 73 65 2d 3e 7a 45 72  n.** pParse->zEr
1d880 72 4d 73 67 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  rMsg..**.** This
1d890 20 72 6f 75 74 69 6e 65 20 64 6f 65 73 20 4e 4f   routine does NO
1d8a0 54 20 66 72 65 65 20 74 68 65 20 53 65 6c 65 63  T free the Selec
1d8b0 74 20 73 74 72 75 63 74 75 72 65 20 70 61 73 73  t structure pass
1d8c0 65 64 20 69 6e 2e 20 20 54 68 65 0a 2a 2a 20 63  ed in.  The.** c
1d8d0 61 6c 6c 69 6e 67 20 66 75 6e 63 74 69 6f 6e 20  alling function 
1d8e0 6e 65 65 64 73 20 74 6f 20 64 6f 20 74 68 61 74  needs to do that
1d8f0 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 50 61 72  ..**.** The pPar
1d900 65 6e 74 2c 20 70 61 72 65 6e 74 54 61 62 2c 20  ent, parentTab, 
1d910 61 6e 64 20 2a 70 50 61 72 65 6e 74 41 67 67 20  and *pParentAgg 
1d920 66 69 65 6c 64 73 20 61 72 65 20 66 69 6c 6c 65  fields are fille
1d930 64 20 69 6e 20 69 66 20 74 68 69 73 0a 2a 2a 20  d in if this.** 
1d940 53 45 4c 45 43 54 20 69 73 20 61 20 73 75 62 71  SELECT is a subq
1d950 75 65 72 79 2e 20 20 54 68 69 73 20 72 6f 75 74  uery.  This rout
1d960 69 6e 65 20 6d 61 79 20 74 72 79 20 74 6f 20 63  ine may try to c
1d970 6f 6d 62 69 6e 65 20 74 68 69 73 20 53 45 4c 45  ombine this SELE
1d980 43 54 0a 2a 2a 20 77 69 74 68 20 69 74 73 20 70  CT.** with its p
1d990 61 72 65 6e 74 20 74 6f 20 66 6f 72 6d 20 61 20  arent to form a 
1d9a0 73 69 6e 67 6c 65 20 66 6c 61 74 20 71 75 65 72  single flat quer
1d9b0 79 2e 20 20 49 6e 20 73 6f 20 64 6f 69 6e 67 2c  y.  In so doing,
1d9c0 20 69 74 20 6d 69 67 68 74 0a 2a 2a 20 63 68 61   it might.** cha
1d9d0 6e 67 65 20 74 68 65 20 70 61 72 65 6e 74 20 71  nge the parent q
1d9e0 75 65 72 79 20 66 72 6f 6d 20 61 20 6e 6f 6e 2d  uery from a non-
1d9f0 61 67 67 72 65 67 61 74 65 20 74 6f 20 61 6e 20  aggregate to an 
1da00 61 67 67 72 65 67 61 74 65 20 71 75 65 72 79 2e  aggregate query.
1da10 0a 2a 2a 20 46 6f 72 20 74 68 61 74 20 72 65 61  .** For that rea
1da20 73 6f 6e 2c 20 74 68 65 20 70 50 61 72 65 6e 74  son, the pParent
1da30 41 67 67 20 66 6c 61 67 20 69 73 20 70 61 73 73  Agg flag is pass
1da40 65 64 20 61 73 20 61 20 70 6f 69 6e 74 65 72 2c  ed as a pointer,
1da50 20 73 6f 20 69 74 0a 2a 2a 20 63 61 6e 20 62 65   so it.** can be
1da60 20 63 68 61 6e 67 65 64 2e 0a 2a 2a 0a 2a 2a 20   changed..**.** 
1da70 45 78 61 6d 70 6c 65 20 31 3a 20 20 20 54 68 65  Example 1:   The
1da80 20 6d 65 61 6e 69 6e 67 20 6f 66 20 74 68 65 20   meaning of the 
1da90 70 50 61 72 65 6e 74 20 70 61 72 61 6d 65 74 65  pParent paramete
1daa0 72 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 53 45 4c 45  r..**.**    SELE
1dab0 43 54 20 2a 20 46 52 4f 4d 20 74 31 20 4a 4f 49  CT * FROM t1 JOI
1dac0 4e 20 28 53 45 4c 45 43 54 20 78 2c 20 63 6f 75  N (SELECT x, cou
1dad0 6e 74 28 2a 29 20 46 52 4f 4d 20 74 32 29 20 4a  nt(*) FROM t2) J
1dae0 4f 49 4e 20 74 33 3b 0a 2a 2a 20 20 20 20 5c 20  OIN t3;.**    \ 
1daf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1db00 20 20 20 20 20 5c 5f 5f 5f 5f 5f 5f 5f 20 73 75       \_______ su
1db10 62 71 75 65 72 79 20 5f 5f 5f 5f 5f 5f 5f 2f 20  bquery _______/ 
1db20 20 20 20 20 20 20 20 2f 0a 2a 2a 20 20 20 20 20         /.**     
1db30 5c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  \               
1db40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1db50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1db60 20 20 20 20 20 20 20 2f 0a 2a 2a 20 20 20 20 20         /.**     
1db70 20 5c 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f   \______________
1db80 5f 5f 5f 5f 5f 5f 20 6f 75 74 65 72 20 71 75 65  ______ outer que
1db90 72 79 20 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f  ry _____________
1dba0 5f 5f 5f 5f 5f 5f 2f 0a 2a 2a 0a 2a 2a 20 54 68  ______/.**.** Th
1dbb0 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61  is routine is ca
1dbc0 6c 6c 65 64 20 66 6f 72 20 74 68 65 20 6f 75 74  lled for the out
1dbd0 65 72 20 71 75 65 72 79 20 66 69 72 73 74 2e 20  er query first. 
1dbe0 20 20 46 6f 72 20 74 68 61 74 20 63 61 6c 6c 2c    For that call,
1dbf0 0a 2a 2a 20 70 50 61 72 65 6e 74 20 77 69 6c 6c  .** pParent will
1dc00 20 62 65 20 4e 55 4c 4c 2e 20 20 44 75 72 69 6e   be NULL.  Durin
1dc10 67 20 74 68 65 20 70 72 6f 63 65 73 73 69 6e 67  g the processing
1dc20 20 6f 66 20 74 68 65 20 6f 75 74 65 72 20 71 75   of the outer qu
1dc30 65 72 79 2c 20 74 68 69 73 20 0a 2a 2a 20 72 6f  ery, this .** ro
1dc40 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20  utine is called 
1dc50 72 65 63 75 72 73 69 76 65 6c 79 20 74 6f 20 68  recursively to h
1dc60 61 6e 64 6c 65 20 74 68 65 20 73 75 62 71 75 65  andle the subque
1dc70 72 79 2e 20 20 46 6f 72 20 74 68 65 20 72 65 63  ry.  For the rec
1dc80 75 72 73 69 76 65 0a 2a 2a 20 63 61 6c 6c 2c 20  ursive.** call, 
1dc90 70 50 61 72 65 6e 74 20 77 69 6c 6c 20 70 6f 69  pParent will poi
1dca0 6e 74 20 74 6f 20 74 68 65 20 6f 75 74 65 72 20  nt to the outer 
1dcb0 71 75 65 72 79 2e 20 20 42 65 63 61 75 73 65 20  query.  Because 
1dcc0 74 68 65 20 73 75 62 71 75 65 72 79 20 69 73 0a  the subquery is.
1dcd0 2a 2a 20 74 68 65 20 73 65 63 6f 6e 64 20 65 6c  ** the second el
1dce0 65 6d 65 6e 74 20 69 6e 20 61 20 74 68 72 65 65  ement in a three
1dcf0 2d 77 61 79 20 6a 6f 69 6e 2c 20 74 68 65 20 70  -way join, the p
1dd00 61 72 65 6e 74 54 61 62 20 70 61 72 61 6d 65 74  arentTab paramet
1dd10 65 72 20 77 69 6c 6c 0a 2a 2a 20 62 65 20 31 20  er will.** be 1 
1dd20 28 74 68 65 20 32 6e 64 20 76 61 6c 75 65 20 6f  (the 2nd value o
1dd30 66 20 61 20 30 2d 69 6e 64 65 78 65 64 20 61 72  f a 0-indexed ar
1dd40 72 61 79 2e 29 0a 2a 2f 0a 69 6e 74 20 73 71 6c  ray.).*/.int sql
1dd50 69 74 65 33 53 65 6c 65 63 74 28 0a 20 20 50 61  ite3Select(.  Pa
1dd60 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20  rse *pParse,    
1dd70 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61 72 73       /* The pars
1dd80 65 72 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  er context */.  
1dd90 53 65 6c 65 63 74 20 2a 70 2c 20 20 20 20 20 20  Select *p,      
1dda0 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 53 45         /* The SE
1ddb0 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 62  LECT statement b
1ddc0 65 69 6e 67 20 63 6f 64 65 64 2e 20 2a 2f 0a 20  eing coded. */. 
1ddd0 20 53 65 6c 65 63 74 44 65 73 74 20 2a 70 44 65   SelectDest *pDe
1dde0 73 74 2c 20 20 20 20 20 2f 2a 20 57 68 61 74 20  st,     /* What 
1ddf0 74 6f 20 64 6f 20 77 69 74 68 20 74 68 65 20 71  to do with the q
1de00 75 65 72 79 20 72 65 73 75 6c 74 73 20 2a 2f 0a  uery results */.
1de10 20 20 53 65 6c 65 63 74 20 2a 70 50 61 72 65 6e    Select *pParen
1de20 74 2c 20 20 20 20 20 20 20 2f 2a 20 41 6e 6f 74  t,       /* Anot
1de30 68 65 72 20 53 45 4c 45 43 54 20 66 6f 72 20 77  her SELECT for w
1de40 68 69 63 68 20 74 68 69 73 20 69 73 20 61 20 73  hich this is a s
1de50 75 62 2d 71 75 65 72 79 20 2a 2f 0a 20 20 69 6e  ub-query */.  in
1de60 74 20 70 61 72 65 6e 74 54 61 62 2c 20 20 20 20  t parentTab,    
1de70 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 69 6e       /* Index in
1de80 20 70 50 61 72 65 6e 74 2d 3e 70 53 72 63 20 6f   pParent->pSrc o
1de90 66 20 74 68 69 73 20 71 75 65 72 79 20 2a 2f 0a  f this query */.
1dea0 20 20 69 6e 74 20 2a 70 50 61 72 65 6e 74 41 67    int *pParentAg
1deb0 67 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65  g        /* True
1dec0 20 69 66 20 70 50 61 72 65 6e 74 20 75 73 65 73   if pParent uses
1ded0 20 61 67 67 72 65 67 61 74 65 20 66 75 6e 63 74   aggregate funct
1dee0 69 6f 6e 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  ions */.){.  int
1def0 20 69 2c 20 6a 3b 20 20 20 20 20 20 20 20 20 20   i, j;          
1df00 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e      /* Loop coun
1df10 74 65 72 73 20 2a 2f 0a 20 20 57 68 65 72 65 49  ters */.  WhereI
1df20 6e 66 6f 20 2a 70 57 49 6e 66 6f 3b 20 20 20 20  nfo *pWInfo;    
1df30 20 2f 2a 20 52 65 74 75 72 6e 20 66 72 6f 6d 20   /* Return from 
1df40 73 71 6c 69 74 65 33 57 68 65 72 65 42 65 67 69  sqlite3WhereBegi
1df50 6e 28 29 20 2a 2f 0a 20 20 56 64 62 65 20 2a 76  n() */.  Vdbe *v
1df60 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1df70 2f 2a 20 54 68 65 20 76 69 72 74 75 61 6c 20 6d  /* The virtual m
1df80 61 63 68 69 6e 65 20 75 6e 64 65 72 20 63 6f 6e  achine under con
1df90 73 74 72 75 63 74 69 6f 6e 20 2a 2f 0a 20 20 69  struction */.  i
1dfa0 6e 74 20 69 73 41 67 67 3b 20 20 20 20 20 20 20  nt isAgg;       
1dfb0 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 66 6f        /* True fo
1dfc0 72 20 73 65 6c 65 63 74 20 6c 69 73 74 73 20 6c  r select lists l
1dfd0 69 6b 65 20 22 63 6f 75 6e 74 28 2a 29 22 20 2a  ike "count(*)" *
1dfe0 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45  /.  ExprList *pE
1dff0 4c 69 73 74 3b 20 20 20 20 20 20 2f 2a 20 4c 69  List;      /* Li
1e000 73 74 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 74 6f  st of columns to
1e010 20 65 78 74 72 61 63 74 2e 20 2a 2f 0a 20 20 53   extract. */.  S
1e020 72 63 4c 69 73 74 20 2a 70 54 61 62 4c 69 73 74  rcList *pTabList
1e030 3b 20 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66  ;     /* List of
1e040 20 74 61 62 6c 65 73 20 74 6f 20 73 65 6c 65 63   tables to selec
1e050 74 20 66 72 6f 6d 20 2a 2f 0a 20 20 45 78 70 72  t from */.  Expr
1e060 20 2a 70 57 68 65 72 65 3b 20 20 20 20 20 20 20   *pWhere;       
1e070 20 20 20 2f 2a 20 54 68 65 20 57 48 45 52 45 20     /* The WHERE 
1e080 63 6c 61 75 73 65 2e 20 20 4d 61 79 20 62 65 20  clause.  May be 
1e090 4e 55 4c 4c 20 2a 2f 0a 20 20 45 78 70 72 4c 69  NULL */.  ExprLi
1e0a0 73 74 20 2a 70 4f 72 64 65 72 42 79 3b 20 20 20  st *pOrderBy;   
1e0b0 20 2f 2a 20 54 68 65 20 4f 52 44 45 52 20 42 59   /* The ORDER BY
1e0c0 20 63 6c 61 75 73 65 2e 20 20 4d 61 79 20 62 65   clause.  May be
1e0d0 20 4e 55 4c 4c 20 2a 2f 0a 20 20 45 78 70 72 4c   NULL */.  ExprL
1e0e0 69 73 74 20 2a 70 47 72 6f 75 70 42 79 3b 20 20  ist *pGroupBy;  
1e0f0 20 20 2f 2a 20 54 68 65 20 47 52 4f 55 50 20 42    /* The GROUP B
1e100 59 20 63 6c 61 75 73 65 2e 20 20 4d 61 79 20 62  Y clause.  May b
1e110 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20 45 78 70 72  e NULL */.  Expr
1e120 20 2a 70 48 61 76 69 6e 67 3b 20 20 20 20 20 20   *pHaving;      
1e130 20 20 20 2f 2a 20 54 68 65 20 48 41 56 49 4e 47     /* The HAVING
1e140 20 63 6c 61 75 73 65 2e 20 20 4d 61 79 20 62 65   clause.  May be
1e150 20 4e 55 4c 4c 20 2a 2f 0a 20 20 69 6e 74 20 69   NULL */.  int i
1e160 73 44 69 73 74 69 6e 63 74 3b 20 20 20 20 20 20  sDistinct;      
1e170 20 20 2f 2a 20 54 72 75 65 20 69 66 20 74 68 65    /* True if the
1e180 20 44 49 53 54 49 4e 43 54 20 6b 65 79 77 6f 72   DISTINCT keywor
1e190 64 20 69 73 20 70 72 65 73 65 6e 74 20 2a 2f 0a  d is present */.
1e1a0 20 20 69 6e 74 20 64 69 73 74 69 6e 63 74 3b 20    int distinct; 
1e1b0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 61 62 6c           /* Tabl
1e1c0 65 20 74 6f 20 75 73 65 20 66 6f 72 20 74 68 65  e to use for the
1e1d0 20 64 69 73 74 69 6e 63 74 20 73 65 74 20 2a 2f   distinct set */
1e1e0 0a 20 20 69 6e 74 20 72 63 20 3d 20 31 3b 20 20  .  int rc = 1;  
1e1f0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56 61 6c            /* Val
1e200 75 65 20 74 6f 20 72 65 74 75 72 6e 20 66 72 6f  ue to return fro
1e210 6d 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  m this function 
1e220 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 53 6f 72  */.  int addrSor
1e230 74 49 6e 64 65 78 3b 20 20 20 20 20 2f 2a 20 41  tIndex;     /* A
1e240 64 64 72 65 73 73 20 6f 66 20 61 6e 20 4f 50 5f  ddress of an OP_
1e250 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 20 69 6e  OpenEphemeral in
1e260 73 74 72 75 63 74 69 6f 6e 20 2a 2f 0a 20 20 41  struction */.  A
1e270 67 67 49 6e 66 6f 20 73 41 67 67 49 6e 66 6f 3b  ggInfo sAggInfo;
1e280 20 20 20 20 20 20 2f 2a 20 49 6e 66 6f 72 6d 61        /* Informa
1e290 74 69 6f 6e 20 75 73 65 64 20 62 79 20 61 67 67  tion used by agg
1e2a0 72 65 67 61 74 65 20 71 75 65 72 69 65 73 20 2a  regate queries *
1e2b0 2f 0a 20 20 69 6e 74 20 69 45 6e 64 3b 20 20 20  /.  int iEnd;   
1e2c0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64             /* Ad
1e2d0 64 72 65 73 73 20 6f 66 20 74 68 65 20 65 6e 64  dress of the end
1e2e0 20 6f 66 20 74 68 65 20 71 75 65 72 79 20 2a 2f   of the query */
1e2f0 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 20  .  sqlite3 *db; 
1e300 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
1e310 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63   database connec
1e320 74 69 6f 6e 20 2a 2f 0a 0a 20 20 64 62 20 3d 20  tion */..  db = 
1e330 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 69 66  pParse->db;.  if
1e340 28 20 70 3d 3d 30 20 7c 7c 20 64 62 2d 3e 6d 61  ( p==0 || db->ma
1e350 6c 6c 6f 63 46 61 69 6c 65 64 20 7c 7c 20 70 50  llocFailed || pP
1e360 61 72 73 65 2d 3e 6e 45 72 72 20 29 7b 0a 20 20  arse->nErr ){.  
1e370 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a    return 1;.  }.
1e380 20 20 69 66 28 20 73 71 6c 69 74 65 33 41 75 74    if( sqlite3Aut
1e390 68 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20 53  hCheck(pParse, S
1e3a0 51 4c 49 54 45 5f 53 45 4c 45 43 54 2c 20 30 2c  QLITE_SELECT, 0,
1e3b0 20 30 2c 20 30 29 20 29 20 72 65 74 75 72 6e 20   0, 0) ) return 
1e3c0 31 3b 0a 20 20 6d 65 6d 73 65 74 28 26 73 41 67  1;.  memset(&sAg
1e3d0 67 49 6e 66 6f 2c 20 30 2c 20 73 69 7a 65 6f 66  gInfo, 0, sizeof
1e3e0 28 73 41 67 67 49 6e 66 6f 29 29 3b 0a 0a 20 20  (sAggInfo));..  
1e3f0 70 4f 72 64 65 72 42 79 20 3d 20 70 2d 3e 70 4f  pOrderBy = p->pO
1e400 72 64 65 72 42 79 3b 0a 20 20 69 66 28 20 49 67  rderBy;.  if( Ig
1e410 6e 6f 72 61 62 6c 65 4f 72 64 65 72 62 79 28 70  norableOrderby(p
1e420 44 65 73 74 29 20 29 7b 0a 20 20 20 20 70 2d 3e  Dest) ){.    p->
1e430 70 4f 72 64 65 72 42 79 20 3d 20 30 3b 0a 0a 20  pOrderBy = 0;.. 
1e440 20 20 20 2f 2a 20 49 6e 20 74 68 65 73 65 20 63     /* In these c
1e450 61 73 65 73 20 74 68 65 20 44 49 53 54 49 4e 43  ases the DISTINC
1e460 54 20 6f 70 65 72 61 74 6f 72 20 6d 61 6b 65 73  T operator makes
1e470 20 6e 6f 20 64 69 66 66 65 72 65 6e 63 65 20 74   no difference t
1e480 6f 20 74 68 65 0a 20 20 20 20 2a 2a 20 72 65 73  o the.    ** res
1e490 75 6c 74 73 2c 20 73 6f 20 72 65 6d 6f 76 65 20  ults, so remove 
1e4a0 69 74 20 69 66 20 69 74 20 77 65 72 65 20 73 70  it if it were sp
1e4b0 65 63 69 66 69 65 64 2e 0a 20 20 20 20 2a 2f 0a  ecified..    */.
1e4c0 20 20 20 20 61 73 73 65 72 74 28 70 44 65 73 74      assert(pDest
1e4d0 2d 3e 65 44 65 73 74 3d 3d 53 52 54 5f 45 78 69  ->eDest==SRT_Exi
1e4e0 73 74 73 20 7c 7c 20 70 44 65 73 74 2d 3e 65 44  sts || pDest->eD
1e4f0 65 73 74 3d 3d 53 52 54 5f 55 6e 69 6f 6e 20 7c  est==SRT_Union |
1e500 7c 20 0a 20 20 20 20 20 20 20 20 20 20 20 70 44  | .           pD
1e510 65 73 74 2d 3e 65 44 65 73 74 3d 3d 53 52 54 5f  est->eDest==SRT_
1e520 45 78 63 65 70 74 20 7c 7c 20 70 44 65 73 74 2d  Except || pDest-
1e530 3e 65 44 65 73 74 3d 3d 53 52 54 5f 44 69 73 63  >eDest==SRT_Disc
1e540 61 72 64 29 3b 0a 20 20 20 20 70 2d 3e 69 73 44  ard);.    p->isD
1e550 69 73 74 69 6e 63 74 20 3d 20 30 3b 0a 20 20 7d  istinct = 0;.  }
1e560 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 65  .  if( sqlite3Se
1e570 6c 65 63 74 52 65 73 6f 6c 76 65 28 70 50 61 72  lectResolve(pPar
1e580 73 65 2c 20 70 2c 20 30 29 20 29 7b 0a 20 20 20  se, p, 0) ){.   
1e590 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64   goto select_end
1e5a0 3b 0a 20 20 7d 0a 20 20 70 2d 3e 70 4f 72 64 65  ;.  }.  p->pOrde
1e5b0 72 42 79 20 3d 20 70 4f 72 64 65 72 42 79 3b 0a  rBy = pOrderBy;.
1e5c0 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 6c 6f 63 61  ..  /* Make loca
1e5d0 6c 20 63 6f 70 69 65 73 20 6f 66 20 74 68 65 20  l copies of the 
1e5e0 70 61 72 61 6d 65 74 65 72 73 20 66 6f 72 20 74  parameters for t
1e5f0 68 69 73 20 71 75 65 72 79 2e 0a 20 20 2a 2f 0a  his query..  */.
1e600 20 20 70 54 61 62 4c 69 73 74 20 3d 20 70 2d 3e    pTabList = p->
1e610 70 53 72 63 3b 0a 20 20 69 73 41 67 67 20 3d 20  pSrc;.  isAgg = 
1e620 70 2d 3e 69 73 41 67 67 3b 0a 20 20 70 45 4c 69  p->isAgg;.  pELi
1e630 73 74 20 3d 20 70 2d 3e 70 45 4c 69 73 74 3b 0a  st = p->pEList;.
1e640 20 20 69 66 28 20 70 45 4c 69 73 74 3d 3d 30 20    if( pEList==0 
1e650 29 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e  ) goto select_en
1e660 64 3b 0a 0a 20 20 2f 2a 20 0a 20 20 2a 2a 20 44  d;..  /* .  ** D
1e670 6f 20 6e 6f 74 20 65 76 65 6e 20 61 74 74 65 6d  o not even attem
1e680 70 74 20 74 6f 20 67 65 6e 65 72 61 74 65 20 61  pt to generate a
1e690 6e 79 20 63 6f 64 65 20 69 66 20 77 65 20 68 61  ny code if we ha
1e6a0 76 65 20 61 6c 72 65 61 64 79 20 73 65 65 6e 0a  ve already seen.
1e6b0 20 20 2a 2a 20 65 72 72 6f 72 73 20 62 65 66 6f    ** errors befo
1e6c0 72 65 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  re this routine 
1e6d0 73 74 61 72 74 73 2e 0a 20 20 2a 2f 0a 20 20 69  starts..  */.  i
1e6e0 66 28 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 3e  f( pParse->nErr>
1e6f0 30 20 29 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f  0 ) goto select_
1e700 65 6e 64 3b 0a 0a 20 20 2f 2a 20 4f 52 44 45 52  end;..  /* ORDER
1e710 20 42 59 20 69 73 20 69 67 6e 6f 72 65 64 20 66   BY is ignored f
1e720 6f 72 20 73 6f 6d 65 20 64 65 73 74 69 6e 61 74  or some destinat
1e730 69 6f 6e 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  ions..  */.  if(
1e740 20 49 67 6e 6f 72 61 62 6c 65 4f 72 64 65 72 62   IgnorableOrderb
1e750 79 28 70 44 65 73 74 29 20 29 7b 0a 20 20 20 20  y(pDest) ){.    
1e760 70 4f 72 64 65 72 42 79 20 3d 20 30 3b 0a 20 20  pOrderBy = 0;.  
1e770 7d 0a 0a 20 20 2f 2a 20 42 65 67 69 6e 20 67 65  }..  /* Begin ge
1e780 6e 65 72 61 74 69 6e 67 20 63 6f 64 65 2e 0a 20  nerating code.. 
1e790 20 2a 2f 0a 20 20 76 20 3d 20 73 71 6c 69 74 65   */.  v = sqlite
1e7a0 33 47 65 74 56 64 62 65 28 70 50 61 72 73 65 29  3GetVdbe(pParse)
1e7b0 3b 0a 20 20 69 66 28 20 76 3d 3d 30 20 29 20 67  ;.  if( v==0 ) g
1e7c0 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a  oto select_end;.
1e7d0 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63  .  /* Generate c
1e7e0 6f 64 65 20 66 6f 72 20 61 6c 6c 20 73 75 62 2d  ode for all sub-
1e7f0 71 75 65 72 69 65 73 20 69 6e 20 74 68 65 20 46  queries in the F
1e800 52 4f 4d 20 63 6c 61 75 73 65 0a 20 20 2a 2f 0a  ROM clause.  */.
1e810 23 69 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c  #if !defined(SQL
1e820 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52  ITE_OMIT_SUBQUER
1e830 59 29 20 7c 7c 20 21 64 65 66 69 6e 65 64 28 53  Y) || !defined(S
1e840 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 29  QLITE_OMIT_VIEW)
1e850 0a 20 20 66 6f 72 28 69 3d 30 3b 20 21 70 2d 3e  .  for(i=0; !p->
1e860 70 50 72 69 6f 72 20 26 26 20 69 3c 70 54 61 62  pPrior && i<pTab
1e870 4c 69 73 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b 29  List->nSrc; i++)
1e880 7b 0a 20 20 20 20 73 74 72 75 63 74 20 53 72 63  {.    struct Src
1e890 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d  List_item *pItem
1e8a0 20 3d 20 26 70 54 61 62 4c 69 73 74 2d 3e 61 5b   = &pTabList->a[
1e8b0 69 5d 3b 0a 20 20 20 20 53 65 6c 65 63 74 44 65  i];.    SelectDe
1e8c0 73 74 20 64 65 73 74 3b 0a 20 20 20 20 53 65 6c  st dest;.    Sel
1e8d0 65 63 74 20 2a 70 53 75 62 20 3d 20 70 49 74 65  ect *pSub = pIte
1e8e0 6d 2d 3e 70 53 65 6c 65 63 74 3b 0a 20 20 20 20  m->pSelect;.    
1e8f0 69 6e 74 20 69 73 41 67 67 53 75 62 3b 0a 20 20  int isAggSub;.  
1e900 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 20 3d 20    char *zName = 
1e910 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65 3b 0a 0a 20  pItem->zName;.. 
1e920 20 20 20 69 66 28 20 70 53 75 62 3d 3d 30 20 7c     if( pSub==0 |
1e930 7c 20 70 49 74 65 6d 2d 3e 69 73 50 6f 70 75 6c  | pItem->isPopul
1e940 61 74 65 64 20 29 20 63 6f 6e 74 69 6e 75 65 3b  ated ) continue;
1e950 0a 20 20 20 20 69 66 28 20 7a 4e 61 6d 65 21 3d  .    if( zName!=
1e960 30 20 29 7b 20 20 20 2f 2a 20 41 6e 20 73 71 6c  0 ){   /* An sql
1e970 20 76 69 65 77 20 2a 2f 0a 20 20 20 20 20 20 63   view */.      c
1e980 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 61 76 65  onst char *zSave
1e990 64 41 75 74 68 43 6f 6e 74 65 78 74 20 3d 20 70  dAuthContext = p
1e9a0 50 61 72 73 65 2d 3e 7a 41 75 74 68 43 6f 6e 74  Parse->zAuthCont
1e9b0 65 78 74 3b 0a 20 20 20 20 20 20 70 50 61 72 73  ext;.      pPars
1e9c0 65 2d 3e 7a 41 75 74 68 43 6f 6e 74 65 78 74 20  e->zAuthContext 
1e9d0 3d 20 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20 72  = zName;.      r
1e9e0 63 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63  c = sqlite3Selec
1e9f0 74 52 65 73 6f 6c 76 65 28 70 50 61 72 73 65 2c  tResolve(pParse,
1ea00 20 70 53 75 62 2c 20 30 29 3b 0a 20 20 20 20 20   pSub, 0);.     
1ea10 20 70 50 61 72 73 65 2d 3e 7a 41 75 74 68 43 6f   pParse->zAuthCo
1ea20 6e 74 65 78 74 20 3d 20 7a 53 61 76 65 64 41 75  ntext = zSavedAu
1ea30 74 68 43 6f 6e 74 65 78 74 3b 0a 20 20 20 20 20  thContext;.     
1ea40 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20   if( rc ){.     
1ea50 20 20 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65     goto select_e
1ea60 6e 64 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  nd;.      }.    
1ea70 7d 0a 0a 20 20 20 20 2f 2a 20 49 6e 63 72 65 6d  }..    /* Increm
1ea80 65 6e 74 20 50 61 72 73 65 2e 6e 48 65 69 67 68  ent Parse.nHeigh
1ea90 74 20 62 79 20 74 68 65 20 68 65 69 67 68 74 20  t by the height 
1eaa0 6f 66 20 74 68 65 20 6c 61 72 67 65 73 74 20 65  of the largest e
1eab0 78 70 72 65 73 73 69 6f 6e 0a 20 20 20 20 2a 2a  xpression.    **
1eac0 20 74 72 65 65 20 72 65 66 65 72 65 64 20 74 6f   tree refered to
1ead0 20 62 79 20 74 68 69 73 2c 20 74 68 65 20 70 61   by this, the pa
1eae0 72 65 6e 74 20 73 65 6c 65 63 74 2e 20 54 68 65  rent select. The
1eaf0 20 63 68 69 6c 64 20 73 65 6c 65 63 74 0a 20 20   child select.  
1eb00 20 20 2a 2a 20 6d 61 79 20 63 6f 6e 74 61 69 6e    ** may contain
1eb10 20 65 78 70 72 65 73 73 69 6f 6e 20 74 72 65 65   expression tree
1eb20 73 20 6f 66 20 61 74 20 6d 6f 73 74 0a 20 20 20  s of at most.   
1eb30 20 2a 2a 20 28 53 51 4c 49 54 45 5f 4d 41 58 5f   ** (SQLITE_MAX_
1eb40 45 58 50 52 5f 44 45 50 54 48 2d 50 61 72 73 65  EXPR_DEPTH-Parse
1eb50 2e 6e 48 65 69 67 68 74 29 20 68 65 69 67 68 74  .nHeight) height
1eb60 2e 20 54 68 69 73 20 69 73 20 61 20 62 69 74 0a  . This is a bit.
1eb70 20 20 20 20 2a 2a 20 6d 6f 72 65 20 63 6f 6e 73      ** more cons
1eb80 65 72 76 61 74 69 76 65 20 74 68 61 6e 20 6e 65  ervative than ne
1eb90 63 65 73 73 61 72 79 2c 20 62 75 74 20 6d 75 63  cessary, but muc
1eba0 68 20 65 61 73 69 65 72 20 74 68 61 6e 20 65 6e  h easier than en
1ebb0 66 6f 72 63 69 6e 67 0a 20 20 20 20 2a 2a 20 61  forcing.    ** a
1ebc0 6e 20 65 78 61 63 74 20 6c 69 6d 69 74 2e 0a 20  n exact limit.. 
1ebd0 20 20 20 2a 2f 0a 20 20 20 20 70 50 61 72 73 65     */.    pParse
1ebe0 2d 3e 6e 48 65 69 67 68 74 20 2b 3d 20 73 71 6c  ->nHeight += sql
1ebf0 69 74 65 33 53 65 6c 65 63 74 45 78 70 72 48 65  ite3SelectExprHe
1ec00 69 67 68 74 28 70 29 3b 0a 0a 20 20 20 20 2f 2a  ight(p);..    /*
1ec10 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66   Check to see if
1ec20 20 74 68 65 20 73 75 62 71 75 65 72 79 20 63 61   the subquery ca
1ec30 6e 20 62 65 20 61 62 73 6f 72 62 65 64 20 69 6e  n be absorbed in
1ec40 74 6f 20 74 68 65 20 70 61 72 65 6e 74 2e 20 2a  to the parent. *
1ec50 2f 0a 20 20 20 20 69 73 41 67 67 53 75 62 20 3d  /.    isAggSub =
1ec60 20 70 53 75 62 2d 3e 69 73 41 67 67 3b 0a 20 20   pSub->isAgg;.  
1ec70 20 20 69 66 28 20 66 6c 61 74 74 65 6e 53 75 62    if( flattenSub
1ec80 71 75 65 72 79 28 70 50 61 72 73 65 2c 20 70 2c  query(pParse, p,
1ec90 20 69 2c 20 69 73 41 67 67 2c 20 69 73 41 67 67   i, isAgg, isAgg
1eca0 53 75 62 29 20 29 7b 0a 20 20 20 20 20 20 69 66  Sub) ){.      if
1ecb0 28 20 69 73 41 67 67 53 75 62 20 29 7b 0a 20 20  ( isAggSub ){.  
1ecc0 20 20 20 20 20 20 70 2d 3e 69 73 41 67 67 20 3d        p->isAgg =
1ecd0 20 69 73 41 67 67 20 3d 20 31 3b 0a 20 20 20 20   isAgg = 1;.    
1ece0 20 20 7d 0a 20 20 20 20 20 20 69 20 3d 20 2d 31    }.      i = -1
1ecf0 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
1ed00 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74     sqlite3Select
1ed10 44 65 73 74 49 6e 69 74 28 26 64 65 73 74 2c 20  DestInit(&dest, 
1ed20 53 52 54 5f 45 70 68 65 6d 54 61 62 2c 20 70 49  SRT_EphemTab, pI
1ed30 74 65 6d 2d 3e 69 43 75 72 73 6f 72 29 3b 0a 20  tem->iCursor);. 
1ed40 20 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65       sqlite3Sele
1ed50 63 74 28 70 50 61 72 73 65 2c 20 70 53 75 62 2c  ct(pParse, pSub,
1ed60 20 26 64 65 73 74 2c 20 70 2c 20 69 2c 20 26 69   &dest, p, i, &i
1ed70 73 41 67 67 29 3b 0a 20 20 20 20 7d 0a 20 20 20  sAgg);.    }.   
1ed80 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 45 72   if( pParse->nEr
1ed90 72 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46  r || db->mallocF
1eda0 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 20 20 67  ailed ){.      g
1edb0 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a  oto select_end;.
1edc0 20 20 20 20 7d 0a 20 20 20 20 70 50 61 72 73 65      }.    pParse
1edd0 2d 3e 6e 48 65 69 67 68 74 20 2d 3d 20 73 71 6c  ->nHeight -= sql
1ede0 69 74 65 33 53 65 6c 65 63 74 45 78 70 72 48 65  ite3SelectExprHe
1edf0 69 67 68 74 28 70 29 3b 0a 20 20 20 20 70 54 61  ight(p);.    pTa
1ee00 62 4c 69 73 74 20 3d 20 70 2d 3e 70 53 72 63 3b  bList = p->pSrc;
1ee10 0a 20 20 20 20 69 66 28 20 21 49 67 6e 6f 72 61  .    if( !Ignora
1ee20 62 6c 65 4f 72 64 65 72 62 79 28 70 44 65 73 74  bleOrderby(pDest
1ee30 29 20 29 7b 0a 20 20 20 20 20 20 70 4f 72 64 65  ) ){.      pOrde
1ee40 72 42 79 20 3d 20 70 2d 3e 70 4f 72 64 65 72 42  rBy = p->pOrderB
1ee50 79 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70  y;.    }.  }.  p
1ee60 45 4c 69 73 74 20 3d 20 70 2d 3e 70 45 4c 69 73  EList = p->pELis
1ee70 74 3b 0a 23 65 6e 64 69 66 0a 20 20 70 57 68 65  t;.#endif.  pWhe
1ee80 72 65 20 3d 20 70 2d 3e 70 57 68 65 72 65 3b 0a  re = p->pWhere;.
1ee90 20 20 70 47 72 6f 75 70 42 79 20 3d 20 70 2d 3e    pGroupBy = p->
1eea0 70 47 72 6f 75 70 42 79 3b 0a 20 20 70 48 61 76  pGroupBy;.  pHav
1eeb0 69 6e 67 20 3d 20 70 2d 3e 70 48 61 76 69 6e 67  ing = p->pHaving
1eec0 3b 0a 20 20 69 73 44 69 73 74 69 6e 63 74 20 3d  ;.  isDistinct =
1eed0 20 70 2d 3e 69 73 44 69 73 74 69 6e 63 74 3b 0a   p->isDistinct;.
1eee0 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
1eef0 4f 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45  OMIT_COMPOUND_SE
1ef00 4c 45 43 54 0a 20 20 2f 2a 20 49 66 20 74 68 65  LECT.  /* If the
1ef10 72 65 20 69 73 20 61 72 65 20 61 20 73 65 71 75  re is are a sequ
1ef20 65 6e 63 65 20 6f 66 20 71 75 65 72 69 65 73 2c  ence of queries,
1ef30 20 64 6f 20 74 68 65 20 65 61 72 6c 69 65 72 20   do the earlier 
1ef40 6f 6e 65 73 20 66 69 72 73 74 2e 0a 20 20 2a 2f  ones first..  */
1ef50 0a 20 20 69 66 28 20 70 2d 3e 70 50 72 69 6f 72  .  if( p->pPrior
1ef60 20 29 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e 70   ){.    if( p->p
1ef70 52 69 67 68 74 6d 6f 73 74 3d 3d 30 20 29 7b 0a  Rightmost==0 ){.
1ef80 20 20 20 20 20 20 53 65 6c 65 63 74 20 2a 70 4c        Select *pL
1ef90 6f 6f 70 2c 20 2a 70 52 69 67 68 74 20 3d 20 30  oop, *pRight = 0
1efa0 3b 0a 20 20 20 20 20 20 69 6e 74 20 63 6e 74 20  ;.      int cnt 
1efb0 3d 20 30 3b 0a 20 20 20 20 20 20 69 6e 74 20 6d  = 0;.      int m
1efc0 78 53 65 6c 65 63 74 3b 0a 20 20 20 20 20 20 66  xSelect;.      f
1efd0 6f 72 28 70 4c 6f 6f 70 3d 70 3b 20 70 4c 6f 6f  or(pLoop=p; pLoo
1efe0 70 3b 20 70 4c 6f 6f 70 3d 70 4c 6f 6f 70 2d 3e  p; pLoop=pLoop->
1eff0 70 50 72 69 6f 72 2c 20 63 6e 74 2b 2b 29 7b 0a  pPrior, cnt++){.
1f000 20 20 20 20 20 20 20 20 70 4c 6f 6f 70 2d 3e 70          pLoop->p
1f010 52 69 67 68 74 6d 6f 73 74 20 3d 20 70 3b 0a 20  Rightmost = p;. 
1f020 20 20 20 20 20 20 20 70 4c 6f 6f 70 2d 3e 70 4e         pLoop->pN
1f030 65 78 74 20 3d 20 70 52 69 67 68 74 3b 0a 20 20  ext = pRight;.  
1f040 20 20 20 20 20 20 70 52 69 67 68 74 20 3d 20 70        pRight = p
1f050 4c 6f 6f 70 3b 0a 20 20 20 20 20 20 7d 0a 20 20  Loop;.      }.  
1f060 20 20 20 20 6d 78 53 65 6c 65 63 74 20 3d 20 64      mxSelect = d
1f070 62 2d 3e 61 4c 69 6d 69 74 5b 53 51 4c 49 54 45  b->aLimit[SQLITE
1f080 5f 4c 49 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f  _LIMIT_COMPOUND_
1f090 53 45 4c 45 43 54 5d 3b 0a 20 20 20 20 20 20 69  SELECT];.      i
1f0a0 66 28 20 6d 78 53 65 6c 65 63 74 20 26 26 20 63  f( mxSelect && c
1f0b0 6e 74 3e 6d 78 53 65 6c 65 63 74 20 29 7b 0a 20  nt>mxSelect ){. 
1f0c0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72         sqlite3Er
1f0d0 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
1f0e0 74 6f 6f 20 6d 61 6e 79 20 74 65 72 6d 73 20 69  too many terms i
1f0f0 6e 20 63 6f 6d 70 6f 75 6e 64 20 53 45 4c 45 43  n compound SELEC
1f100 54 22 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74  T");.        ret
1f110 75 72 6e 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20  urn 1;.      }. 
1f120 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20     }.    return 
1f130 6d 75 6c 74 69 53 65 6c 65 63 74 28 70 50 61 72  multiSelect(pPar
1f140 73 65 2c 20 70 2c 20 70 44 65 73 74 29 3b 0a 20  se, p, pDest);. 
1f150 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20   }.#endif..  /* 
1f160 49 66 20 77 72 69 74 69 6e 67 20 74 6f 20 6d 65  If writing to me
1f170 6d 6f 72 79 20 6f 72 20 67 65 6e 65 72 61 74 69  mory or generati
1f180 6e 67 20 61 20 73 65 74 0a 20 20 2a 2a 20 6f 6e  ng a set.  ** on
1f190 6c 79 20 61 20 73 69 6e 67 6c 65 20 63 6f 6c 75  ly a single colu
1f1a0 6d 6e 20 6d 61 79 20 62 65 20 6f 75 74 70 75 74  mn may be output
1f1b0 2e 0a 20 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53  ..  */.#ifndef S
1f1c0 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55  QLITE_OMIT_SUBQU
1f1d0 45 52 59 0a 20 20 69 66 28 20 63 68 65 63 6b 46  ERY.  if( checkF
1f1e0 6f 72 4d 75 6c 74 69 43 6f 6c 75 6d 6e 53 65 6c  orMultiColumnSel
1f1f0 65 63 74 45 72 72 6f 72 28 70 50 61 72 73 65 2c  ectError(pParse,
1f200 20 70 44 65 73 74 2c 20 70 45 4c 69 73 74 2d 3e   pDest, pEList->
1f210 6e 45 78 70 72 29 20 29 7b 0a 20 20 20 20 67 6f  nExpr) ){.    go
1f220 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20  to select_end;. 
1f230 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20   }.#endif..  /* 
1f240 49 66 20 70 6f 73 73 69 62 6c 65 2c 20 72 65 77  If possible, rew
1f250 72 69 74 65 20 74 68 65 20 71 75 65 72 79 20 74  rite the query t
1f260 6f 20 75 73 65 20 47 52 4f 55 50 20 42 59 20 69  o use GROUP BY i
1f270 6e 73 74 65 61 64 20 6f 66 20 44 49 53 54 49 4e  nstead of DISTIN
1f280 43 54 2e 0a 20 20 2a 2a 20 47 52 4f 55 50 20 42  CT..  ** GROUP B
1f290 59 20 6d 61 79 20 75 73 65 20 61 6e 20 69 6e 64  Y may use an ind
1f2a0 65 78 2c 20 44 49 53 54 49 4e 43 54 20 6e 65 76  ex, DISTINCT nev
1f2b0 65 72 20 64 6f 65 73 2e 0a 20 20 2a 2f 0a 20 20  er does..  */.  
1f2c0 69 66 28 20 70 2d 3e 69 73 44 69 73 74 69 6e 63  if( p->isDistinc
1f2d0 74 20 26 26 20 21 70 2d 3e 69 73 41 67 67 20 26  t && !p->isAgg &
1f2e0 26 20 21 70 2d 3e 70 47 72 6f 75 70 42 79 20 29  & !p->pGroupBy )
1f2f0 7b 0a 20 20 20 20 70 2d 3e 70 47 72 6f 75 70 42  {.    p->pGroupB
1f300 79 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c  y = sqlite3ExprL
1f310 69 73 74 44 75 70 28 64 62 2c 20 70 2d 3e 70 45  istDup(db, p->pE
1f320 4c 69 73 74 29 3b 0a 20 20 20 20 70 47 72 6f 75  List);.    pGrou
1f330 70 42 79 20 3d 20 70 2d 3e 70 47 72 6f 75 70 42  pBy = p->pGroupB
1f340 79 3b 0a 20 20 20 20 70 2d 3e 69 73 44 69 73 74  y;.    p->isDist
1f350 69 6e 63 74 20 3d 20 30 3b 0a 20 20 20 20 69 73  inct = 0;.    is
1f360 44 69 73 74 69 6e 63 74 20 3d 20 30 3b 0a 20 20  Distinct = 0;.  
1f370 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 72 65  }..  /* If there
1f380 20 69 73 20 61 6e 20 4f 52 44 45 52 20 42 59 20   is an ORDER BY 
1f390 63 6c 61 75 73 65 2c 20 74 68 65 6e 20 74 68 69  clause, then thi
1f3a0 73 20 73 6f 72 74 69 6e 67 0a 20 20 2a 2a 20 69  s sorting.  ** i
1f3b0 6e 64 65 78 20 6d 69 67 68 74 20 65 6e 64 20 75  ndex might end u
1f3c0 70 20 62 65 69 6e 67 20 75 6e 75 73 65 64 20 69  p being unused i
1f3d0 66 20 74 68 65 20 64 61 74 61 20 63 61 6e 20 62  f the data can b
1f3e0 65 20 0a 20 20 2a 2a 20 65 78 74 72 61 63 74 65  e .  ** extracte
1f3f0 64 20 69 6e 20 70 72 65 2d 73 6f 72 74 65 64 20  d in pre-sorted 
1f400 6f 72 64 65 72 2e 20 20 49 66 20 74 68 61 74 20  order.  If that 
1f410 69 73 20 74 68 65 20 63 61 73 65 2c 20 74 68 65  is the case, the
1f420 6e 20 74 68 65 0a 20 20 2a 2a 20 4f 50 5f 4f 70  n the.  ** OP_Op
1f430 65 6e 45 70 68 65 6d 65 72 61 6c 20 69 6e 73 74  enEphemeral inst
1f440 72 75 63 74 69 6f 6e 20 77 69 6c 6c 20 62 65 20  ruction will be 
1f450 63 68 61 6e 67 65 64 20 74 6f 20 61 6e 20 4f 50  changed to an OP
1f460 5f 4e 6f 6f 70 20 6f 6e 63 65 0a 20 20 2a 2a 20  _Noop once.  ** 
1f470 77 65 20 66 69 67 75 72 65 20 6f 75 74 20 74 68  we figure out th
1f480 61 74 20 74 68 65 20 73 6f 72 74 69 6e 67 20 69  at the sorting i
1f490 6e 64 65 78 20 69 73 20 6e 6f 74 20 6e 65 65 64  ndex is not need
1f4a0 65 64 2e 20 20 54 68 65 20 61 64 64 72 53 6f 72  ed.  The addrSor
1f4b0 74 49 6e 64 65 78 0a 20 20 2a 2a 20 76 61 72 69  tIndex.  ** vari
1f4c0 61 62 6c 65 20 69 73 20 75 73 65 64 20 74 6f 20  able is used to 
1f4d0 66 61 63 69 6c 69 74 61 74 65 20 74 68 61 74 20  facilitate that 
1f4e0 63 68 61 6e 67 65 2e 0a 20 20 2a 2f 0a 20 20 69  change..  */.  i
1f4f0 66 28 20 70 4f 72 64 65 72 42 79 20 29 7b 0a 20  f( pOrderBy ){. 
1f500 20 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79     KeyInfo *pKey
1f510 49 6e 66 6f 3b 0a 20 20 20 20 70 4b 65 79 49 6e  Info;.    pKeyIn
1f520 66 6f 20 3d 20 6b 65 79 49 6e 66 6f 46 72 6f 6d  fo = keyInfoFrom
1f530 45 78 70 72 4c 69 73 74 28 70 50 61 72 73 65 2c  ExprList(pParse,
1f540 20 70 4f 72 64 65 72 42 79 29 3b 0a 20 20 20 20   pOrderBy);.    
1f550 70 4f 72 64 65 72 42 79 2d 3e 69 45 43 75 72 73  pOrderBy->iECurs
1f560 6f 72 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61  or = pParse->nTa
1f570 62 2b 2b 3b 0a 20 20 20 20 70 2d 3e 61 64 64 72  b++;.    p->addr
1f580 4f 70 65 6e 45 70 68 6d 5b 32 5d 20 3d 20 61 64  OpenEphm[2] = ad
1f590 64 72 53 6f 72 74 49 6e 64 65 78 20 3d 0a 20 20  drSortIndex =.  
1f5a0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
1f5b0 64 64 4f 70 34 28 76 2c 20 4f 50 5f 4f 70 65 6e  ddOp4(v, OP_Open
1f5c0 45 70 68 65 6d 65 72 61 6c 2c 0a 20 20 20 20 20  Ephemeral,.     
1f5d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f5e0 20 20 20 20 20 20 70 4f 72 64 65 72 42 79 2d 3e        pOrderBy->
1f5f0 69 45 43 75 72 73 6f 72 2c 20 70 4f 72 64 65 72  iECursor, pOrder
1f600 42 79 2d 3e 6e 45 78 70 72 2b 32 2c 20 30 2c 0a  By->nExpr+2, 0,.
1f610 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f620 20 20 20 20 20 20 20 20 20 20 20 28 63 68 61 72             (char
1f630 2a 29 70 4b 65 79 49 6e 66 6f 2c 20 50 34 5f 4b  *)pKeyInfo, P4_K
1f640 45 59 49 4e 46 4f 5f 48 41 4e 44 4f 46 46 29 3b  EYINFO_HANDOFF);
1f650 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 64  .  }else{.    ad
1f660 64 72 53 6f 72 74 49 6e 64 65 78 20 3d 20 2d 31  drSortIndex = -1
1f670 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74  ;.  }..  /* If t
1f680 68 65 20 6f 75 74 70 75 74 20 69 73 20 64 65 73  he output is des
1f690 74 69 6e 65 64 20 66 6f 72 20 61 20 74 65 6d 70  tined for a temp
1f6a0 6f 72 61 72 79 20 74 61 62 6c 65 2c 20 6f 70 65  orary table, ope
1f6b0 6e 20 74 68 61 74 20 74 61 62 6c 65 2e 0a 20 20  n that table..  
1f6c0 2a 2f 0a 20 20 69 66 28 20 70 44 65 73 74 2d 3e  */.  if( pDest->
1f6d0 65 44 65 73 74 3d 3d 53 52 54 5f 45 70 68 65 6d  eDest==SRT_Ephem
1f6e0 54 61 62 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  Tab ){.    sqlit
1f6f0 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
1f700 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c  OP_OpenEphemeral
1f710 2c 20 70 44 65 73 74 2d 3e 69 50 61 72 6d 2c 20  , pDest->iParm, 
1f720 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 29 3b 0a  pEList->nExpr);.
1f730 20 20 7d 0a 0a 20 20 2f 2a 20 53 65 74 20 74 68    }..  /* Set th
1f740 65 20 6c 69 6d 69 74 65 72 2e 0a 20 20 2a 2f 0a  e limiter..  */.
1f750 20 20 69 45 6e 64 20 3d 20 73 71 6c 69 74 65 33    iEnd = sqlite3
1f760 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29  VdbeMakeLabel(v)
1f770 3b 0a 20 20 63 6f 6d 70 75 74 65 4c 69 6d 69 74  ;.  computeLimit
1f780 52 65 67 69 73 74 65 72 73 28 70 50 61 72 73 65  Registers(pParse
1f790 2c 20 70 2c 20 69 45 6e 64 29 3b 0a 0a 20 20 2f  , p, iEnd);..  /
1f7a0 2a 20 4f 70 65 6e 20 61 20 76 69 72 74 75 61 6c  * Open a virtual
1f7b0 20 69 6e 64 65 78 20 74 6f 20 75 73 65 20 66 6f   index to use fo
1f7c0 72 20 74 68 65 20 64 69 73 74 69 6e 63 74 20 73  r the distinct s
1f7d0 65 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 69  et..  */.  if( i
1f7e0 73 44 69 73 74 69 6e 63 74 20 29 7b 0a 20 20 20  sDistinct ){.   
1f7f0 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e   KeyInfo *pKeyIn
1f800 66 6f 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  fo;.    assert( 
1f810 69 73 41 67 67 20 7c 7c 20 70 47 72 6f 75 70 42  isAgg || pGroupB
1f820 79 20 29 3b 0a 20 20 20 20 64 69 73 74 69 6e 63  y );.    distinc
1f830 74 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62  t = pParse->nTab
1f840 2b 2b 3b 0a 20 20 20 20 70 4b 65 79 49 6e 66 6f  ++;.    pKeyInfo
1f850 20 3d 20 6b 65 79 49 6e 66 6f 46 72 6f 6d 45 78   = keyInfoFromEx
1f860 70 72 4c 69 73 74 28 70 50 61 72 73 65 2c 20 70  prList(pParse, p
1f870 2d 3e 70 45 4c 69 73 74 29 3b 0a 20 20 20 20 73  ->pEList);.    s
1f880 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34  qlite3VdbeAddOp4
1f890 28 76 2c 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d  (v, OP_OpenEphem
1f8a0 65 72 61 6c 2c 20 64 69 73 74 69 6e 63 74 2c 20  eral, distinct, 
1f8b0 30 2c 20 30 2c 0a 20 20 20 20 20 20 20 20 20 20  0, 0,.          
1f8c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 63                (c
1f8d0 68 61 72 2a 29 70 4b 65 79 49 6e 66 6f 2c 20 50  har*)pKeyInfo, P
1f8e0 34 5f 4b 45 59 49 4e 46 4f 5f 48 41 4e 44 4f 46  4_KEYINFO_HANDOF
1f8f0 46 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  F);.  }else{.   
1f900 20 64 69 73 74 69 6e 63 74 20 3d 20 2d 31 3b 0a   distinct = -1;.
1f910 20 20 7d 0a 0a 20 20 2f 2a 20 41 67 67 72 65 67    }..  /* Aggreg
1f920 61 74 65 20 61 6e 64 20 6e 6f 6e 2d 61 67 67 72  ate and non-aggr
1f930 65 67 61 74 65 20 71 75 65 72 69 65 73 20 61 72  egate queries ar
1f940 65 20 68 61 6e 64 6c 65 64 20 64 69 66 66 65 72  e handled differ
1f950 65 6e 74 6c 79 20 2a 2f 0a 20 20 69 66 28 20 21  ently */.  if( !
1f960 69 73 41 67 67 20 26 26 20 70 47 72 6f 75 70 42  isAgg && pGroupB
1f970 79 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20 54  y==0 ){.    /* T
1f980 68 69 73 20 63 61 73 65 20 69 73 20 66 6f 72 20  his case is for 
1f990 6e 6f 6e 2d 61 67 67 72 65 67 61 74 65 20 71 75  non-aggregate qu
1f9a0 65 72 69 65 73 0a 20 20 20 20 2a 2a 20 42 65 67  eries.    ** Beg
1f9b0 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  in the database 
1f9c0 73 63 61 6e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  scan.    */.    
1f9d0 70 57 49 6e 66 6f 20 3d 20 73 71 6c 69 74 65 33  pWInfo = sqlite3
1f9e0 57 68 65 72 65 42 65 67 69 6e 28 70 50 61 72 73  WhereBegin(pPars
1f9f0 65 2c 20 70 54 61 62 4c 69 73 74 2c 20 70 57 68  e, pTabList, pWh
1fa00 65 72 65 2c 20 26 70 4f 72 64 65 72 42 79 2c 20  ere, &pOrderBy, 
1fa10 30 29 3b 0a 20 20 20 20 69 66 28 20 70 57 49 6e  0);.    if( pWIn
1fa20 66 6f 3d 3d 30 20 29 20 67 6f 74 6f 20 73 65 6c  fo==0 ) goto sel
1fa30 65 63 74 5f 65 6e 64 3b 0a 0a 20 20 20 20 2f 2a  ect_end;..    /*
1fa40 20 49 66 20 73 6f 72 74 69 6e 67 20 69 6e 64 65   If sorting inde
1fa50 78 20 74 68 61 74 20 77 61 73 20 63 72 65 61 74  x that was creat
1fa60 65 64 20 62 79 20 61 20 70 72 69 6f 72 20 4f 50  ed by a prior OP
1fa70 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 20 0a  _OpenEphemeral .
1fa80 20 20 20 20 2a 2a 20 69 6e 73 74 72 75 63 74 69      ** instructi
1fa90 6f 6e 20 65 6e 64 65 64 20 75 70 20 6e 6f 74 20  on ended up not 
1faa0 62 65 69 6e 67 20 6e 65 65 64 65 64 2c 20 74 68  being needed, th
1fab0 65 6e 20 63 68 61 6e 67 65 20 74 68 65 20 4f 50  en change the OP
1fac0 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 0a 20  _OpenEphemeral. 
1fad0 20 20 20 2a 2a 20 69 6e 74 6f 20 61 6e 20 4f 50     ** into an OP
1fae0 5f 4e 6f 6f 70 2e 0a 20 20 20 20 2a 2f 0a 20 20  _Noop..    */.  
1faf0 20 20 69 66 28 20 61 64 64 72 53 6f 72 74 49 6e    if( addrSortIn
1fb00 64 65 78 3e 3d 30 20 26 26 20 70 4f 72 64 65 72  dex>=0 && pOrder
1fb10 42 79 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73  By==0 ){.      s
1fb20 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65  qlite3VdbeChange
1fb30 54 6f 4e 6f 6f 70 28 76 2c 20 61 64 64 72 53 6f  ToNoop(v, addrSo
1fb40 72 74 49 6e 64 65 78 2c 20 31 29 3b 0a 20 20 20  rtIndex, 1);.   
1fb50 20 20 20 70 2d 3e 61 64 64 72 4f 70 65 6e 45 70     p->addrOpenEp
1fb60 68 6d 5b 32 5d 20 3d 20 2d 31 3b 0a 20 20 20 20  hm[2] = -1;.    
1fb70 7d 0a 0a 20 20 20 20 2f 2a 20 55 73 65 20 74 68  }..    /* Use th
1fb80 65 20 73 74 61 6e 64 61 72 64 20 69 6e 6e 65 72  e standard inner
1fb90 20 6c 6f 6f 70 0a 20 20 20 20 2a 2f 0a 20 20 20   loop.    */.   
1fba0 20 61 73 73 65 72 74 28 21 69 73 44 69 73 74 69   assert(!isDisti
1fbb0 6e 63 74 29 3b 0a 20 20 20 20 73 65 6c 65 63 74  nct);.    select
1fbc0 49 6e 6e 65 72 4c 6f 6f 70 28 70 50 61 72 73 65  InnerLoop(pParse
1fbd0 2c 20 70 2c 20 70 45 4c 69 73 74 2c 20 30 2c 20  , p, pEList, 0, 
1fbe0 30 2c 20 70 4f 72 64 65 72 42 79 2c 20 2d 31 2c  0, pOrderBy, -1,
1fbf0 20 70 44 65 73 74 2c 0a 20 20 20 20 20 20 20 20   pDest,.        
1fc00 20 20 20 20 20 20 20 20 20 20 20 20 70 57 49 6e              pWIn
1fc10 66 6f 2d 3e 69 43 6f 6e 74 69 6e 75 65 2c 20 70  fo->iContinue, p
1fc20 57 49 6e 66 6f 2d 3e 69 42 72 65 61 6b 29 3b 0a  WInfo->iBreak);.
1fc30 0a 20 20 20 20 2f 2a 20 45 6e 64 20 74 68 65 20  .    /* End the 
1fc40 64 61 74 61 62 61 73 65 20 73 63 61 6e 20 6c 6f  database scan lo
1fc50 6f 70 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73  op..    */.    s
1fc60 71 6c 69 74 65 33 57 68 65 72 65 45 6e 64 28 70  qlite3WhereEnd(p
1fc70 57 49 6e 66 6f 29 3b 0a 20 20 7d 65 6c 73 65 7b  WInfo);.  }else{
1fc80 0a 20 20 20 20 2f 2a 20 54 68 69 73 20 69 73 20  .    /* This is 
1fc90 74 68 65 20 70 72 6f 63 65 73 73 69 6e 67 20 66  the processing f
1fca0 6f 72 20 61 67 67 72 65 67 61 74 65 20 71 75 65  or aggregate que
1fcb0 72 69 65 73 20 2a 2f 0a 20 20 20 20 4e 61 6d 65  ries */.    Name
1fcc0 43 6f 6e 74 65 78 74 20 73 4e 43 3b 20 20 20 20  Context sNC;    
1fcd0 2f 2a 20 4e 61 6d 65 20 63 6f 6e 74 65 78 74 20  /* Name context 
1fce0 66 6f 72 20 70 72 6f 63 65 73 73 69 6e 67 20 61  for processing a
1fcf0 67 67 72 65 67 61 74 65 20 69 6e 66 6f 72 6d 61  ggregate informa
1fd00 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 69 6e 74 20  tion */.    int 
1fd10 69 41 4d 65 6d 3b 20 20 20 20 20 20 20 20 20 20  iAMem;          
1fd20 2f 2a 20 46 69 72 73 74 20 4d 65 6d 20 61 64 64  /* First Mem add
1fd30 72 65 73 73 20 66 6f 72 20 73 74 6f 72 69 6e 67  ress for storing
1fd40 20 63 75 72 72 65 6e 74 20 47 52 4f 55 50 20 42   current GROUP B
1fd50 59 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 42 4d  Y */.    int iBM
1fd60 65 6d 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  em;          /* 
1fd70 46 69 72 73 74 20 4d 65 6d 20 61 64 64 72 65 73  First Mem addres
1fd80 73 20 66 6f 72 20 70 72 65 76 69 6f 75 73 20 47  s for previous G
1fd90 52 4f 55 50 20 42 59 20 2a 2f 0a 20 20 20 20 69  ROUP BY */.    i
1fda0 6e 74 20 69 55 73 65 46 6c 61 67 3b 20 20 20 20  nt iUseFlag;    
1fdb0 20 20 20 2f 2a 20 4d 65 6d 20 61 64 64 72 65 73     /* Mem addres
1fdc0 73 20 68 6f 6c 64 69 6e 67 20 66 6c 61 67 20 69  s holding flag i
1fdd0 6e 64 69 63 61 74 69 6e 67 20 74 68 61 74 20 61  ndicating that a
1fde0 74 20 6c 65 61 73 74 0a 20 20 20 20 20 20 20 20  t least.        
1fdf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fe00 2a 2a 20 6f 6e 65 20 72 6f 77 20 6f 66 20 74 68  ** one row of th
1fe10 65 20 69 6e 70 75 74 20 74 6f 20 74 68 65 20 61  e input to the a
1fe20 67 67 72 65 67 61 74 6f 72 20 68 61 73 20 62 65  ggregator has be
1fe30 65 6e 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  en.             
1fe40 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 70 72             ** pr
1fe50 6f 63 65 73 73 65 64 20 2a 2f 0a 20 20 20 20 69  ocessed */.    i
1fe60 6e 74 20 69 41 62 6f 72 74 46 6c 61 67 3b 20 20  nt iAbortFlag;  
1fe70 20 20 20 2f 2a 20 4d 65 6d 20 61 64 64 72 65 73     /* Mem addres
1fe80 73 20 77 68 69 63 68 20 63 61 75 73 65 73 20 71  s which causes q
1fe90 75 65 72 79 20 61 62 6f 72 74 20 69 66 20 70 6f  uery abort if po
1fea0 73 69 74 69 76 65 20 2a 2f 0a 20 20 20 20 69 6e  sitive */.    in
1feb0 74 20 67 72 6f 75 70 42 79 53 6f 72 74 3b 20 20  t groupBySort;  
1fec0 20 20 2f 2a 20 52 6f 77 73 20 63 6f 6d 65 20 66    /* Rows come f
1fed0 72 6f 6d 20 73 6f 75 72 63 65 20 69 6e 20 47 52  rom source in GR
1fee0 4f 55 50 20 42 59 20 6f 72 64 65 72 20 2a 2f 0a  OUP BY order */.
1fef0 0a 0a 20 20 20 20 2f 2a 20 54 68 65 20 66 6f 6c  ..    /* The fol
1ff00 6c 6f 77 69 6e 67 20 76 61 72 69 61 62 6c 65 73  lowing variables
1ff10 20 68 6f 6c 64 20 61 64 64 72 65 73 73 65 73 20   hold addresses 
1ff20 6f 72 20 6c 61 62 65 6c 73 20 66 6f 72 20 70 61  or labels for pa
1ff30 72 74 73 20 6f 66 20 74 68 65 0a 20 20 20 20 2a  rts of the.    *
1ff40 2a 20 76 69 72 74 75 61 6c 20 6d 61 63 68 69 6e  * virtual machin
1ff50 65 20 70 72 6f 67 72 61 6d 20 77 65 20 61 72 65  e program we are
1ff60 20 70 75 74 74 69 6e 67 20 74 6f 67 65 74 68 65   putting togethe
1ff70 72 20 2a 2f 0a 20 20 20 20 69 6e 74 20 61 64 64  r */.    int add
1ff80 72 4f 75 74 70 75 74 52 6f 77 3b 20 20 20 20 20  rOutputRow;     
1ff90 20 2f 2a 20 53 74 61 72 74 20 6f 66 20 73 75 62   /* Start of sub
1ffa0 72 6f 75 74 69 6e 65 20 74 68 61 74 20 6f 75 74  routine that out
1ffb0 70 75 74 73 20 61 20 72 65 73 75 6c 74 20 72 6f  puts a result ro
1ffc0 77 20 2a 2f 0a 20 20 20 20 69 6e 74 20 72 65 67  w */.    int reg
1ffd0 4f 75 74 70 75 74 52 6f 77 3b 20 20 20 20 20 20  OutputRow;      
1ffe0 20 2f 2a 20 52 65 74 75 72 6e 20 61 64 64 72 65   /* Return addre
1fff0 73 73 20 72 65 67 69 73 74 65 72 20 66 6f 72 20  ss register for 
20000 6f 75 74 70 75 74 20 73 75 62 72 6f 75 74 69 6e  output subroutin
20010 65 20 2a 2f 0a 20 20 20 20 69 6e 74 20 61 64 64  e */.    int add
20020 72 53 65 74 41 62 6f 72 74 3b 20 20 20 20 20 20  rSetAbort;      
20030 20 2f 2a 20 53 65 74 20 74 68 65 20 61 62 6f 72   /* Set the abor
20040 74 20 66 6c 61 67 20 61 6e 64 20 72 65 74 75 72  t flag and retur
20050 6e 20 2a 2f 0a 20 20 20 20 69 6e 74 20 61 64 64  n */.    int add
20060 72 49 6e 69 74 69 61 6c 69 7a 65 4c 6f 6f 70 3b  rInitializeLoop;
20070 20 2f 2a 20 53 74 61 72 74 20 6f 66 20 63 6f 64   /* Start of cod
20080 65 20 74 68 61 74 20 69 6e 69 74 69 61 6c 69 7a  e that initializ
20090 65 73 20 74 68 65 20 69 6e 70 75 74 20 6c 6f 6f  es the input loo
200a0 70 20 2a 2f 0a 20 20 20 20 69 6e 74 20 61 64 64  p */.    int add
200b0 72 54 6f 70 4f 66 4c 6f 6f 70 3b 20 20 20 20 20  rTopOfLoop;     
200c0 20 2f 2a 20 54 6f 70 20 6f 66 20 74 68 65 20 69   /* Top of the i
200d0 6e 70 75 74 20 6c 6f 6f 70 20 2a 2f 0a 20 20 20  nput loop */.   
200e0 20 69 6e 74 20 61 64 64 72 45 6e 64 3b 20 20 20   int addrEnd;   
200f0 20 20 20 20 20 20 20 20 20 2f 2a 20 45 6e 64 20           /* End 
20100 6f 66 20 61 6c 6c 20 70 72 6f 63 65 73 73 69 6e  of all processin
20110 67 20 2a 2f 0a 20 20 20 20 69 6e 74 20 61 64 64  g */.    int add
20120 72 53 6f 72 74 69 6e 67 49 64 78 3b 20 20 20 20  rSortingIdx;    
20130 20 2f 2a 20 54 68 65 20 4f 50 5f 4f 70 65 6e 45   /* The OP_OpenE
20140 70 68 65 6d 65 72 61 6c 20 66 6f 72 20 74 68 65  phemeral for the
20150 20 73 6f 72 74 69 6e 67 20 69 6e 64 65 78 20 2a   sorting index *
20160 2f 0a 20 20 20 20 69 6e 74 20 61 64 64 72 52 65  /.    int addrRe
20170 73 65 74 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  set;          /*
20180 20 53 75 62 72 6f 75 74 69 6e 65 20 66 6f 72 20   Subroutine for 
20190 72 65 73 65 74 74 69 6e 67 20 74 68 65 20 61 63  resetting the ac
201a0 63 75 6d 75 6c 61 74 6f 72 20 2a 2f 0a 20 20 20  cumulator */.   
201b0 20 69 6e 74 20 72 65 67 52 65 73 65 74 3b 20 20   int regReset;  
201c0 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75           /* Retu
201d0 72 6e 20 61 64 64 72 65 73 73 20 72 65 67 69 73  rn address regis
201e0 74 65 72 20 66 6f 72 20 72 65 73 65 74 20 73 75  ter for reset su
201f0 62 72 6f 75 74 69 6e 65 20 2a 2f 0a 0a 20 20 20  broutine */..   
20200 20 61 64 64 72 45 6e 64 20 3d 20 73 71 6c 69 74   addrEnd = sqlit
20210 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28  e3VdbeMakeLabel(
20220 76 29 3b 0a 0a 20 20 20 20 2f 2a 20 43 6f 6e 76  v);..    /* Conv
20230 65 72 74 20 54 4b 5f 43 4f 4c 55 4d 4e 20 6e 6f  ert TK_COLUMN no
20240 64 65 73 20 69 6e 74 6f 20 54 4b 5f 41 47 47 5f  des into TK_AGG_
20250 43 4f 4c 55 4d 4e 20 61 6e 64 20 6d 61 6b 65 20  COLUMN and make 
20260 65 6e 74 72 69 65 73 20 69 6e 0a 20 20 20 20 2a  entries in.    *
20270 2a 20 73 41 67 67 49 6e 66 6f 20 66 6f 72 20 61  * sAggInfo for a
20280 6c 6c 20 54 4b 5f 41 47 47 5f 46 55 4e 43 54 49  ll TK_AGG_FUNCTI
20290 4f 4e 20 6e 6f 64 65 73 20 69 6e 20 65 78 70 72  ON nodes in expr
202a0 65 73 73 69 6f 6e 73 20 6f 66 20 74 68 65 0a 20  essions of the. 
202b0 20 20 20 2a 2a 20 53 45 4c 45 43 54 20 73 74 61     ** SELECT sta
202c0 74 65 6d 65 6e 74 2e 0a 20 20 20 20 2a 2f 0a 20  tement..    */. 
202d0 20 20 20 6d 65 6d 73 65 74 28 26 73 4e 43 2c 20     memset(&sNC, 
202e0 30 2c 20 73 69 7a 65 6f 66 28 73 4e 43 29 29 3b  0, sizeof(sNC));
202f0 0a 20 20 20 20 73 4e 43 2e 70 50 61 72 73 65 20  .    sNC.pParse 
20300 3d 20 70 50 61 72 73 65 3b 0a 20 20 20 20 73 4e  = pParse;.    sN
20310 43 2e 70 53 72 63 4c 69 73 74 20 3d 20 70 54 61  C.pSrcList = pTa
20320 62 4c 69 73 74 3b 0a 20 20 20 20 73 4e 43 2e 70  bList;.    sNC.p
20330 41 67 67 49 6e 66 6f 20 3d 20 26 73 41 67 67 49  AggInfo = &sAggI
20340 6e 66 6f 3b 0a 20 20 20 20 73 41 67 67 49 6e 66  nfo;.    sAggInf
20350 6f 2e 6e 53 6f 72 74 69 6e 67 43 6f 6c 75 6d 6e  o.nSortingColumn
20360 20 3d 20 70 47 72 6f 75 70 42 79 20 3f 20 70 47   = pGroupBy ? pG
20370 72 6f 75 70 42 79 2d 3e 6e 45 78 70 72 2b 31 20  roupBy->nExpr+1 
20380 3a 20 30 3b 0a 20 20 20 20 73 41 67 67 49 6e 66  : 0;.    sAggInf
20390 6f 2e 70 47 72 6f 75 70 42 79 20 3d 20 70 47 72  o.pGroupBy = pGr
203a0 6f 75 70 42 79 3b 0a 20 20 20 20 73 71 6c 69 74  oupBy;.    sqlit
203b0 65 33 45 78 70 72 41 6e 61 6c 79 7a 65 41 67 67  e3ExprAnalyzeAgg
203c0 4c 69 73 74 28 26 73 4e 43 2c 20 70 45 4c 69 73  List(&sNC, pELis
203d0 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45  t);.    sqlite3E
203e0 78 70 72 41 6e 61 6c 79 7a 65 41 67 67 4c 69 73  xprAnalyzeAggLis
203f0 74 28 26 73 4e 43 2c 20 70 4f 72 64 65 72 42 79  t(&sNC, pOrderBy
20400 29 3b 0a 20 20 20 20 69 66 28 20 70 48 61 76 69  );.    if( pHavi
20410 6e 67 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  ng ){.      sqli
20420 74 65 33 45 78 70 72 41 6e 61 6c 79 7a 65 41 67  te3ExprAnalyzeAg
20430 67 72 65 67 61 74 65 73 28 26 73 4e 43 2c 20 70  gregates(&sNC, p
20440 48 61 76 69 6e 67 29 3b 0a 20 20 20 20 7d 0a 20  Having);.    }. 
20450 20 20 20 73 41 67 67 49 6e 66 6f 2e 6e 41 63 63     sAggInfo.nAcc
20460 75 6d 75 6c 61 74 6f 72 20 3d 20 73 41 67 67 49  umulator = sAggI
20470 6e 66 6f 2e 6e 43 6f 6c 75 6d 6e 3b 0a 20 20 20  nfo.nColumn;.   
20480 20 66 6f 72 28 69 3d 30 3b 20 69 3c 73 41 67 67   for(i=0; i<sAgg
20490 49 6e 66 6f 2e 6e 46 75 6e 63 3b 20 69 2b 2b 29  Info.nFunc; i++)
204a0 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  {.      sqlite3E
204b0 78 70 72 41 6e 61 6c 79 7a 65 41 67 67 4c 69 73  xprAnalyzeAggLis
204c0 74 28 26 73 4e 43 2c 20 73 41 67 67 49 6e 66 6f  t(&sNC, sAggInfo
204d0 2e 61 46 75 6e 63 5b 69 5d 2e 70 45 78 70 72 2d  .aFunc[i].pExpr-
204e0 3e 70 4c 69 73 74 29 3b 0a 20 20 20 20 7d 0a 20  >pList);.    }. 
204f0 20 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f     if( db->mallo
20500 63 46 61 69 6c 65 64 20 29 20 67 6f 74 6f 20 73  cFailed ) goto s
20510 65 6c 65 63 74 5f 65 6e 64 3b 0a 0a 20 20 20 20  elect_end;..    
20520 2f 2a 20 50 72 6f 63 65 73 73 69 6e 67 20 66 6f  /* Processing fo
20530 72 20 61 67 67 72 65 67 61 74 65 73 20 77 69 74  r aggregates wit
20540 68 20 47 52 4f 55 50 20 42 59 20 69 73 20 76 65  h GROUP BY is ve
20550 72 79 20 64 69 66 66 65 72 65 6e 74 20 61 6e 64  ry different and
20560 0a 20 20 20 20 2a 2a 20 6d 75 63 68 20 6d 6f 72  .    ** much mor
20570 65 20 63 6f 6d 70 6c 65 78 20 74 68 61 6e 20 61  e complex than a
20580 67 67 72 65 67 61 74 65 73 20 77 69 74 68 6f 75  ggregates withou
20590 74 20 61 20 47 52 4f 55 50 20 42 59 2e 0a 20 20  t a GROUP BY..  
205a0 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 47 72    */.    if( pGr
205b0 6f 75 70 42 79 20 29 7b 0a 20 20 20 20 20 20 4b  oupBy ){.      K
205c0 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f  eyInfo *pKeyInfo
205d0 3b 20 20 2f 2a 20 4b 65 79 69 6e 67 20 69 6e 66  ;  /* Keying inf
205e0 6f 72 6d 61 74 69 6f 6e 20 66 6f 72 20 74 68 65  ormation for the
205f0 20 67 72 6f 75 70 20 62 79 20 63 6c 61 75 73 65   group by clause
20600 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 6a 31   */.      int j1
20610 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 43 72 65 61  ;..      /* Crea
20620 74 65 20 6c 61 62 65 6c 73 20 74 68 61 74 20 77  te labels that w
20630 65 20 77 69 6c 6c 20 62 65 20 6e 65 65 64 69 6e  e will be needin
20640 67 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  g.      */.     
20650 20 61 64 64 72 49 6e 69 74 69 61 6c 69 7a 65 4c   addrInitializeL
20660 6f 6f 70 20 3d 20 73 71 6c 69 74 65 33 56 64 62  oop = sqlite3Vdb
20670 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 0a  eMakeLabel(v);..
20680 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 72        /* If ther
20690 65 20 69 73 20 61 20 47 52 4f 55 50 20 42 59 20  e is a GROUP BY 
206a0 63 6c 61 75 73 65 20 77 65 20 6d 69 67 68 74 20  clause we might 
206b0 6e 65 65 64 20 61 20 73 6f 72 74 69 6e 67 20 69  need a sorting i
206c0 6e 64 65 78 20 74 6f 0a 20 20 20 20 20 20 2a 2a  ndex to.      **
206d0 20 69 6d 70 6c 65 6d 65 6e 74 20 69 74 2e 20 20   implement it.  
206e0 41 6c 6c 6f 63 61 74 65 20 74 68 61 74 20 73 6f  Allocate that so
206f0 72 74 69 6e 67 20 69 6e 64 65 78 20 6e 6f 77 2e  rting index now.
20700 20 20 49 66 20 69 74 20 74 75 72 6e 73 20 6f 75    If it turns ou
20710 74 0a 20 20 20 20 20 20 2a 2a 20 74 68 61 74 20  t.      ** that 
20720 77 65 20 64 6f 20 6e 6f 74 20 6e 65 65 64 20 69  we do not need i
20730 74 20 61 66 74 65 72 20 61 6c 6c 2c 20 74 68 65  t after all, the
20740 20 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 20 69   OpenEphemeral i
20750 6e 73 74 72 75 63 74 69 6f 6e 0a 20 20 20 20 20  nstruction.     
20760 20 2a 2a 20 77 69 6c 6c 20 62 65 20 63 6f 6e 76   ** will be conv
20770 65 72 74 65 64 20 69 6e 74 6f 20 61 20 4e 6f 6f  erted into a Noo
20780 70 2e 20 20 0a 20 20 20 20 20 20 2a 2f 0a 20 20  p.  .      */.  
20790 20 20 20 20 73 41 67 67 49 6e 66 6f 2e 73 6f 72      sAggInfo.sor
207a0 74 69 6e 67 49 64 78 20 3d 20 70 50 61 72 73 65  tingIdx = pParse
207b0 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20 20 20  ->nTab++;.      
207c0 70 4b 65 79 49 6e 66 6f 20 3d 20 6b 65 79 49 6e  pKeyInfo = keyIn
207d0 66 6f 46 72 6f 6d 45 78 70 72 4c 69 73 74 28 70  foFromExprList(p
207e0 50 61 72 73 65 2c 20 70 47 72 6f 75 70 42 79 29  Parse, pGroupBy)
207f0 3b 0a 20 20 20 20 20 20 61 64 64 72 53 6f 72 74  ;.      addrSort
20800 69 6e 67 49 64 78 20 3d 20 73 71 6c 69 74 65 33  ingIdx = sqlite3
20810 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50  VdbeAddOp4(v, OP
20820 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 2c 20  _OpenEphemeral, 
20830 0a 20 20 20 20 20 20 20 20 20 20 73 41 67 67 49  .          sAggI
20840 6e 66 6f 2e 73 6f 72 74 69 6e 67 49 64 78 2c 20  nfo.sortingIdx, 
20850 73 41 67 67 49 6e 66 6f 2e 6e 53 6f 72 74 69 6e  sAggInfo.nSortin
20860 67 43 6f 6c 75 6d 6e 2c 20 0a 20 20 20 20 20 20  gColumn, .      
20870 20 20 20 20 30 2c 20 28 63 68 61 72 2a 29 70 4b      0, (char*)pK
20880 65 79 49 6e 66 6f 2c 20 50 34 5f 4b 45 59 49 4e  eyInfo, P4_KEYIN
20890 46 4f 5f 48 41 4e 44 4f 46 46 29 3b 0a 0a 20 20  FO_HANDOFF);..  
208a0 20 20 20 20 2f 2a 20 49 6e 69 74 69 61 6c 69 7a      /* Initializ
208b0 65 20 6d 65 6d 6f 72 79 20 6c 6f 63 61 74 69 6f  e memory locatio
208c0 6e 73 20 75 73 65 64 20 62 79 20 47 52 4f 55 50  ns used by GROUP
208d0 20 42 59 20 61 67 67 72 65 67 61 74 65 20 70 72   BY aggregate pr
208e0 6f 63 65 73 73 69 6e 67 0a 20 20 20 20 20 20 2a  ocessing.      *
208f0 2f 0a 20 20 20 20 20 20 69 55 73 65 46 6c 61 67  /.      iUseFlag
20900 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65   = ++pParse->nMe
20910 6d 3b 0a 20 20 20 20 20 20 69 41 62 6f 72 74 46  m;.      iAbortF
20920 6c 61 67 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e  lag = ++pParse->
20930 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 69 41 4d 65  nMem;.      iAMe
20940 6d 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d  m = pParse->nMem
20950 20 2b 20 31 3b 0a 20 20 20 20 20 20 70 50 61 72   + 1;.      pPar
20960 73 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 70 47 72 6f  se->nMem += pGro
20970 75 70 42 79 2d 3e 6e 45 78 70 72 3b 0a 20 20 20  upBy->nExpr;.   
20980 20 20 20 69 42 4d 65 6d 20 3d 20 70 50 61 72 73     iBMem = pPars
20990 65 2d 3e 6e 4d 65 6d 20 2b 20 31 3b 0a 20 20 20  e->nMem + 1;.   
209a0 20 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20     pParse->nMem 
209b0 2b 3d 20 70 47 72 6f 75 70 42 79 2d 3e 6e 45 78  += pGroupBy->nEx
209c0 70 72 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  pr;.      sqlite
209d0 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
209e0 50 5f 49 6e 74 65 67 65 72 2c 20 30 2c 20 69 41  P_Integer, 0, iA
209f0 62 6f 72 74 46 6c 61 67 29 3b 0a 20 20 20 20 20  bortFlag);.     
20a00 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c   VdbeComment((v,
20a10 20 22 63 6c 65 61 72 20 61 62 6f 72 74 20 66 6c   "clear abort fl
20a20 61 67 22 29 29 3b 0a 20 20 20 20 20 20 73 71 6c  ag"));.      sql
20a30 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
20a40 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 30 2c  , OP_Integer, 0,
20a50 20 69 55 73 65 46 6c 61 67 29 3b 0a 20 20 20 20   iUseFlag);.    
20a60 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76    VdbeComment((v
20a70 2c 20 22 69 6e 64 69 63 61 74 65 20 61 63 63 75  , "indicate accu
20a80 6d 75 6c 61 74 6f 72 20 65 6d 70 74 79 22 29 29  mulator empty"))
20a90 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
20aa0 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
20ab0 47 6f 74 6f 2c 20 30 2c 20 61 64 64 72 49 6e 69  Goto, 0, addrIni
20ac0 74 69 61 6c 69 7a 65 4c 6f 6f 70 29 3b 0a 0a 20  tializeLoop);.. 
20ad0 20 20 20 20 20 2f 2a 20 47 65 6e 65 72 61 74 65       /* Generate
20ae0 20 61 20 73 75 62 72 6f 75 74 69 6e 65 20 74 68   a subroutine th
20af0 61 74 20 6f 75 74 70 75 74 73 20 61 20 73 69 6e  at outputs a sin
20b00 67 6c 65 20 72 6f 77 20 6f 66 20 74 68 65 20 72  gle row of the r
20b10 65 73 75 6c 74 0a 20 20 20 20 20 20 2a 2a 20 73  esult.      ** s
20b20 65 74 2e 20 20 54 68 69 73 20 73 75 62 72 6f 75  et.  This subrou
20b30 74 69 6e 65 20 66 69 72 73 74 20 6c 6f 6f 6b 73  tine first looks
20b40 20 61 74 20 74 68 65 20 69 55 73 65 46 6c 61 67   at the iUseFlag
20b50 2e 20 20 49 66 20 69 55 73 65 46 6c 61 67 0a 20  .  If iUseFlag. 
20b60 20 20 20 20 20 2a 2a 20 69 73 20 6c 65 73 73 20       ** is less 
20b70 74 68 61 6e 20 6f 72 20 65 71 75 61 6c 20 74 6f  than or equal to
20b80 20 7a 65 72 6f 2c 20 74 68 65 20 73 75 62 72 6f   zero, the subro
20b90 75 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70  utine is a no-op
20ba0 2e 20 20 49 66 0a 20 20 20 20 20 20 2a 2a 20 74  .  If.      ** t
20bb0 68 65 20 70 72 6f 63 65 73 73 69 6e 67 20 63 61  he processing ca
20bc0 6c 6c 73 20 66 6f 72 20 74 68 65 20 71 75 65 72  lls for the quer
20bd0 79 20 74 6f 20 61 62 6f 72 74 2c 20 74 68 69 73  y to abort, this
20be0 20 73 75 62 72 6f 75 74 69 6e 65 0a 20 20 20 20   subroutine.    
20bf0 20 20 2a 2a 20 69 6e 63 72 65 6d 65 6e 74 73 20    ** increments 
20c00 74 68 65 20 69 41 62 6f 72 74 46 6c 61 67 20 6d  the iAbortFlag m
20c10 65 6d 6f 72 79 20 6c 6f 63 61 74 69 6f 6e 20 62  emory location b
20c20 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 20  efore returning 
20c30 69 6e 0a 20 20 20 20 20 20 2a 2a 20 6f 72 64 65  in.      ** orde
20c40 72 20 74 6f 20 73 69 67 6e 61 6c 20 74 68 65 20  r to signal the 
20c50 63 61 6c 6c 65 72 20 74 6f 20 61 62 6f 72 74 2e  caller to abort.
20c60 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
20c70 61 64 64 72 53 65 74 41 62 6f 72 74 20 3d 20 73  addrSetAbort = s
20c80 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e  qlite3VdbeCurren
20c90 74 41 64 64 72 28 76 29 3b 0a 20 20 20 20 20 20  tAddr(v);.      
20ca0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
20cb0 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c  2(v, OP_Integer,
20cc0 20 31 2c 20 69 41 62 6f 72 74 46 6c 61 67 29 3b   1, iAbortFlag);
20cd0 0a 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65  .      VdbeComme
20ce0 6e 74 28 28 76 2c 20 22 73 65 74 20 61 62 6f 72  nt((v, "set abor
20cf0 74 20 66 6c 61 67 22 29 29 3b 0a 20 20 20 20 20  t flag"));.     
20d00 20 72 65 67 4f 75 74 70 75 74 52 6f 77 20 3d 20   regOutputRow = 
20d10 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a  ++pParse->nMem;.
20d20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
20d30 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 52 65  eAddOp1(v, OP_Re
20d40 74 75 72 6e 2c 20 72 65 67 4f 75 74 70 75 74 52  turn, regOutputR
20d50 6f 77 29 3b 0a 20 20 20 20 20 20 61 64 64 72 4f  ow);.      addrO
20d60 75 74 70 75 74 52 6f 77 20 3d 20 73 71 6c 69 74  utputRow = sqlit
20d70 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64  e3VdbeCurrentAdd
20d80 72 28 76 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  r(v);.      sqli
20d90 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
20da0 20 4f 50 5f 49 66 50 6f 73 2c 20 69 55 73 65 46   OP_IfPos, iUseF
20db0 6c 61 67 2c 20 61 64 64 72 4f 75 74 70 75 74 52  lag, addrOutputR
20dc0 6f 77 2b 32 29 3b 0a 20 20 20 20 20 20 56 64 62  ow+2);.      Vdb
20dd0 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 47 72  eComment((v, "Gr
20de0 6f 75 70 62 79 20 72 65 73 75 6c 74 20 67 65 6e  oupby result gen
20df0 65 72 61 74 6f 72 20 65 6e 74 72 79 20 70 6f 69  erator entry poi
20e00 6e 74 22 29 29 3b 0a 20 20 20 20 20 20 73 71 6c  nt"));.      sql
20e10 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76  ite3VdbeAddOp1(v
20e20 2c 20 4f 50 5f 52 65 74 75 72 6e 2c 20 72 65 67  , OP_Return, reg
20e30 4f 75 74 70 75 74 52 6f 77 29 3b 0a 20 20 20 20  OutputRow);.    
20e40 20 20 66 69 6e 61 6c 69 7a 65 41 67 67 46 75 6e    finalizeAggFun
20e50 63 74 69 6f 6e 73 28 70 50 61 72 73 65 2c 20 26  ctions(pParse, &
20e60 73 41 67 67 49 6e 66 6f 29 3b 0a 20 20 20 20 20  sAggInfo);.     
20e70 20 69 66 28 20 70 48 61 76 69 6e 67 20 29 7b 0a   if( pHaving ){.
20e80 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
20e90 78 70 72 49 66 46 61 6c 73 65 28 70 50 61 72 73  xprIfFalse(pPars
20ea0 65 2c 20 70 48 61 76 69 6e 67 2c 20 61 64 64 72  e, pHaving, addr
20eb0 4f 75 74 70 75 74 52 6f 77 2b 31 2c 20 53 51 4c  OutputRow+1, SQL
20ec0 49 54 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c 29 3b  ITE_JUMPIFNULL);
20ed0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73  .      }.      s
20ee0 65 6c 65 63 74 49 6e 6e 65 72 4c 6f 6f 70 28 70  electInnerLoop(p
20ef0 50 61 72 73 65 2c 20 70 2c 20 70 2d 3e 70 45 4c  Parse, p, p->pEL
20f00 69 73 74 2c 20 30 2c 20 30 2c 20 70 4f 72 64 65  ist, 0, 0, pOrde
20f10 72 42 79 2c 0a 20 20 20 20 20 20 20 20 20 20 20  rBy,.           
20f20 20 20 20 20 20 20 20 20 20 20 20 64 69 73 74 69             disti
20f30 6e 63 74 2c 20 70 44 65 73 74 2c 0a 20 20 20 20  nct, pDest,.    
20f40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20f50 20 20 61 64 64 72 4f 75 74 70 75 74 52 6f 77 2b    addrOutputRow+
20f60 31 2c 20 61 64 64 72 53 65 74 41 62 6f 72 74 29  1, addrSetAbort)
20f70 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
20f80 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f  dbeAddOp1(v, OP_
20f90 52 65 74 75 72 6e 2c 20 72 65 67 4f 75 74 70 75  Return, regOutpu
20fa0 74 52 6f 77 29 3b 0a 20 20 20 20 20 20 56 64 62  tRow);.      Vdb
20fb0 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 65 6e  eComment((v, "en
20fc0 64 20 67 72 6f 75 70 62 79 20 72 65 73 75 6c 74  d groupby result
20fd0 20 67 65 6e 65 72 61 74 6f 72 22 29 29 3b 0a 0a   generator"));..
20fe0 20 20 20 20 20 20 2f 2a 20 47 65 6e 65 72 61 74        /* Generat
20ff0 65 20 61 20 73 75 62 72 6f 75 74 69 6e 65 20 74  e a subroutine t
21000 68 61 74 20 77 69 6c 6c 20 72 65 73 65 74 20 74  hat will reset t
21010 68 65 20 67 72 6f 75 70 2d 62 79 20 61 63 63 75  he group-by accu
21020 6d 75 6c 61 74 6f 72 0a 20 20 20 20 20 20 2a 2f  mulator.      */
21030 0a 20 20 20 20 20 20 61 64 64 72 52 65 73 65 74  .      addrReset
21040 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43 75   = sqlite3VdbeCu
21050 72 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 20 20  rrentAddr(v);.  
21060 20 20 20 20 72 65 67 52 65 73 65 74 20 3d 20 2b      regReset = +
21070 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20  +pParse->nMem;. 
21080 20 20 20 20 20 72 65 73 65 74 41 63 63 75 6d 75       resetAccumu
21090 6c 61 74 6f 72 28 70 50 61 72 73 65 2c 20 26 73  lator(pParse, &s
210a0 41 67 67 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20  AggInfo);.      
210b0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
210c0 31 28 76 2c 20 4f 50 5f 52 65 74 75 72 6e 2c 20  1(v, OP_Return, 
210d0 72 65 67 52 65 73 65 74 29 3b 0a 0a 20 20 20 20  regReset);..    
210e0 20 20 2f 2a 20 42 65 67 69 6e 20 61 20 6c 6f 6f    /* Begin a loo
210f0 70 20 74 68 61 74 20 77 69 6c 6c 20 65 78 74 72  p that will extr
21100 61 63 74 20 61 6c 6c 20 73 6f 75 72 63 65 20 72  act all source r
21110 6f 77 73 20 69 6e 20 47 52 4f 55 50 20 42 59 20  ows in GROUP BY 
21120 6f 72 64 65 72 2e 0a 20 20 20 20 20 20 2a 2a 20  order..      ** 
21130 54 68 69 73 20 6d 69 67 68 74 20 69 6e 76 6f 6c  This might invol
21140 76 65 20 74 77 6f 20 73 65 70 61 72 61 74 65 20  ve two separate 
21150 6c 6f 6f 70 73 20 77 69 74 68 20 61 6e 20 4f 50  loops with an OP
21160 5f 53 6f 72 74 20 69 6e 20 62 65 74 77 65 65 6e  _Sort in between
21170 2c 20 6f 72 0a 20 20 20 20 20 20 2a 2a 20 69 74  , or.      ** it
21180 20 6d 69 67 68 74 20 62 65 20 61 20 73 69 6e 67   might be a sing
21190 6c 65 20 6c 6f 6f 70 20 74 68 61 74 20 75 73 65  le loop that use
211a0 73 20 61 6e 20 69 6e 64 65 78 20 74 6f 20 65 78  s an index to ex
211b0 74 72 61 63 74 20 69 6e 66 6f 72 6d 61 74 69 6f  tract informatio
211c0 6e 0a 20 20 20 20 20 20 2a 2a 20 69 6e 20 74 68  n.      ** in th
211d0 65 20 72 69 67 68 74 20 6f 72 64 65 72 20 74 6f  e right order to
211e0 20 62 65 67 69 6e 20 77 69 74 68 2e 0a 20 20 20   begin with..   
211f0 20 20 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69     */.      sqli
21200 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61  te3VdbeResolveLa
21210 62 65 6c 28 76 2c 20 61 64 64 72 49 6e 69 74 69  bel(v, addrIniti
21220 61 6c 69 7a 65 4c 6f 6f 70 29 3b 0a 20 20 20 20  alizeLoop);.    
21230 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
21240 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 73 75 62 2c  Op2(v, OP_Gosub,
21250 20 72 65 67 52 65 73 65 74 2c 20 61 64 64 72 52   regReset, addrR
21260 65 73 65 74 29 3b 0a 20 20 20 20 20 20 70 57 49  eset);.      pWI
21270 6e 66 6f 20 3d 20 73 71 6c 69 74 65 33 57 68 65  nfo = sqlite3Whe
21280 72 65 42 65 67 69 6e 28 70 50 61 72 73 65 2c 20  reBegin(pParse, 
21290 70 54 61 62 4c 69 73 74 2c 20 70 57 68 65 72 65  pTabList, pWhere
212a0 2c 20 26 70 47 72 6f 75 70 42 79 2c 20 30 29 3b  , &pGroupBy, 0);
212b0 0a 20 20 20 20 20 20 69 66 28 20 70 57 49 6e 66  .      if( pWInf
212c0 6f 3d 3d 30 20 29 20 67 6f 74 6f 20 73 65 6c 65  o==0 ) goto sele
212d0 63 74 5f 65 6e 64 3b 0a 20 20 20 20 20 20 69 66  ct_end;.      if
212e0 28 20 70 47 72 6f 75 70 42 79 3d 3d 30 20 29 7b  ( pGroupBy==0 ){
212f0 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20  .        /* The 
21300 6f 70 74 69 6d 69 7a 65 72 20 69 73 20 61 62 6c  optimizer is abl
21310 65 20 74 6f 20 64 65 6c 69 76 65 72 20 72 6f 77  e to deliver row
21320 73 20 69 6e 20 67 72 6f 75 70 20 62 79 20 6f 72  s in group by or
21330 64 65 72 20 73 6f 0a 20 20 20 20 20 20 20 20 2a  der so.        *
21340 2a 20 77 65 20 64 6f 20 6e 6f 74 20 68 61 76 65  * we do not have
21350 20 74 6f 20 73 6f 72 74 2e 20 20 54 68 65 20 4f   to sort.  The O
21360 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 20  P_OpenEphemeral 
21370 74 61 62 6c 65 20 77 69 6c 6c 20 62 65 0a 20 20  table will be.  
21380 20 20 20 20 20 20 2a 2a 20 63 61 6e 63 65 6c 6c        ** cancell
21390 65 64 20 6c 61 74 65 72 20 62 65 63 61 75 73 65  ed later because
213a0 20 77 65 20 73 74 69 6c 6c 20 6e 65 65 64 20 74   we still need t
213b0 6f 20 75 73 65 20 74 68 65 20 70 4b 65 79 49 6e  o use the pKeyIn
213c0 66 6f 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  fo.        */.  
213d0 20 20 20 20 20 20 70 47 72 6f 75 70 42 79 20 3d        pGroupBy =
213e0 20 70 2d 3e 70 47 72 6f 75 70 42 79 3b 0a 20 20   p->pGroupBy;.  
213f0 20 20 20 20 20 20 67 72 6f 75 70 42 79 53 6f 72        groupBySor
21400 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 65 6c  t = 0;.      }el
21410 73 65 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 52  se{.        /* R
21420 6f 77 73 20 61 72 65 20 63 6f 6d 69 6e 67 20 6f  ows are coming o
21430 75 74 20 69 6e 20 75 6e 64 65 74 65 72 6d 69 6e  ut in undetermin
21440 65 64 20 6f 72 64 65 72 2e 20 20 57 65 20 68 61  ed order.  We ha
21450 76 65 20 74 6f 20 70 75 73 68 0a 20 20 20 20 20  ve to push.     
21460 20 20 20 2a 2a 20 65 61 63 68 20 72 6f 77 20 69     ** each row i
21470 6e 74 6f 20 61 20 73 6f 72 74 69 6e 67 20 69 6e  nto a sorting in
21480 64 65 78 2c 20 74 65 72 6d 69 6e 61 74 65 20 74  dex, terminate t
21490 68 65 20 66 69 72 73 74 20 6c 6f 6f 70 2c 0a 20  he first loop,. 
214a0 20 20 20 20 20 20 20 2a 2a 20 74 68 65 6e 20 6c         ** then l
214b0 6f 6f 70 20 6f 76 65 72 20 74 68 65 20 73 6f 72  oop over the sor
214c0 74 69 6e 67 20 69 6e 64 65 78 20 69 6e 20 6f 72  ting index in or
214d0 64 65 72 20 74 6f 20 67 65 74 20 74 68 65 20 6f  der to get the o
214e0 75 74 70 75 74 0a 20 20 20 20 20 20 20 20 2a 2a  utput.        **
214f0 20 69 6e 20 73 6f 72 74 65 64 20 6f 72 64 65 72   in sorted order
21500 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  .        */.    
21510 20 20 20 20 69 6e 74 20 72 65 67 42 61 73 65 3b      int regBase;
21520 0a 20 20 20 20 20 20 20 20 69 6e 74 20 72 65 67  .        int reg
21530 52 65 63 6f 72 64 3b 0a 20 20 20 20 20 20 20 20  Record;.        
21540 69 6e 74 20 6e 43 6f 6c 3b 0a 20 20 20 20 20 20  int nCol;.      
21550 20 20 69 6e 74 20 6e 47 72 6f 75 70 42 79 3b 0a    int nGroupBy;.
21560 0a 20 20 20 20 20 20 20 20 67 72 6f 75 70 42 79  .        groupBy
21570 53 6f 72 74 20 3d 20 31 3b 0a 20 20 20 20 20 20  Sort = 1;.      
21580 20 20 6e 47 72 6f 75 70 42 79 20 3d 20 70 47 72    nGroupBy = pGr
21590 6f 75 70 42 79 2d 3e 6e 45 78 70 72 3b 0a 20 20  oupBy->nExpr;.  
215a0 20 20 20 20 20 20 6e 43 6f 6c 20 3d 20 6e 47 72        nCol = nGr
215b0 6f 75 70 42 79 20 2b 20 31 3b 0a 20 20 20 20 20  oupBy + 1;.     
215c0 20 20 20 6a 20 3d 20 6e 47 72 6f 75 70 42 79 2b     j = nGroupBy+
215d0 31 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69  1;.        for(i
215e0 3d 30 3b 20 69 3c 73 41 67 67 49 6e 66 6f 2e 6e  =0; i<sAggInfo.n
215f0 43 6f 6c 75 6d 6e 3b 20 69 2b 2b 29 7b 0a 20 20  Column; i++){.  
21600 20 20 20 20 20 20 20 20 69 66 28 20 73 41 67 67          if( sAgg
21610 49 6e 66 6f 2e 61 43 6f 6c 5b 69 5d 2e 69 53 6f  Info.aCol[i].iSo
21620 72 74 65 72 43 6f 6c 75 6d 6e 3e 3d 6a 20 29 7b  rterColumn>=j ){
21630 0a 20 20 20 20 20 20 20 20 20 20 20 20 6e 43 6f  .            nCo
21640 6c 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 20  l++;.           
21650 20 6a 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20   j++;.          
21660 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  }.        }.    
21670 20 20 20 20 72 65 67 42 61 73 65 20 3d 20 73 71      regBase = sq
21680 6c 69 74 65 33 47 65 74 54 65 6d 70 52 61 6e 67  lite3GetTempRang
21690 65 28 70 50 61 72 73 65 2c 20 6e 43 6f 6c 29 3b  e(pParse, nCol);
216a0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
216b0 45 78 70 72 43 6f 64 65 45 78 70 72 4c 69 73 74  ExprCodeExprList
216c0 28 70 50 61 72 73 65 2c 20 70 47 72 6f 75 70 42  (pParse, pGroupB
216d0 79 2c 20 72 65 67 42 61 73 65 2c 20 30 29 3b 0a  y, regBase, 0);.
216e0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
216f0 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
21700 53 65 71 75 65 6e 63 65 2c 20 73 41 67 67 49 6e  Sequence, sAggIn
21710 66 6f 2e 73 6f 72 74 69 6e 67 49 64 78 2c 72 65  fo.sortingIdx,re
21720 67 42 61 73 65 2b 6e 47 72 6f 75 70 42 79 29 3b  gBase+nGroupBy);
21730 0a 20 20 20 20 20 20 20 20 6a 20 3d 20 6e 47 72  .        j = nGr
21740 6f 75 70 42 79 2b 31 3b 0a 20 20 20 20 20 20 20  oupBy+1;.       
21750 20 66 6f 72 28 69 3d 30 3b 20 69 3c 73 41 67 67   for(i=0; i<sAgg
21760 49 6e 66 6f 2e 6e 43 6f 6c 75 6d 6e 3b 20 69 2b  Info.nColumn; i+
21770 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 74  +){.          st
21780 72 75 63 74 20 41 67 67 49 6e 66 6f 5f 63 6f 6c  ruct AggInfo_col
21790 20 2a 70 43 6f 6c 20 3d 20 26 73 41 67 67 49 6e   *pCol = &sAggIn
217a0 66 6f 2e 61 43 6f 6c 5b 69 5d 3b 0a 20 20 20 20  fo.aCol[i];.    
217b0 20 20 20 20 20 20 69 66 28 20 70 43 6f 6c 2d 3e        if( pCol->
217c0 69 53 6f 72 74 65 72 43 6f 6c 75 6d 6e 3e 3d 6a  iSorterColumn>=j
217d0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
217e0 69 6e 74 20 72 31 20 3d 20 6a 20 2b 20 72 65 67  int r1 = j + reg
217f0 42 61 73 65 3b 0a 20 20 20 20 20 20 20 20 20 20  Base;.          
21800 20 20 69 6e 74 20 72 32 20 3d 20 73 71 6c 69 74    int r2 = sqlit
21810 65 33 45 78 70 72 43 6f 64 65 47 65 74 43 6f 6c  e3ExprCodeGetCol
21820 75 6d 6e 28 70 50 61 72 73 65 2c 20 0a 20 20 20  umn(pParse, .   
21830 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21840 20 20 20 20 20 20 20 20 20 20 20 20 70 43 6f 6c              pCol
21850 2d 3e 70 54 61 62 2c 20 70 43 6f 6c 2d 3e 69 43  ->pTab, pCol->iC
21860 6f 6c 75 6d 6e 2c 20 70 43 6f 6c 2d 3e 69 54 61  olumn, pCol->iTa
21870 62 6c 65 2c 20 72 31 2c 20 30 29 3b 0a 20 20 20  ble, r1, 0);.   
21880 20 20 20 20 20 20 20 20 20 69 66 28 20 72 31 21           if( r1!
21890 3d 72 32 20 29 7b 0a 20 20 20 20 20 20 20 20 20  =r2 ){.         
218a0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
218b0 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 53 43 6f  AddOp2(v, OP_SCo
218c0 70 79 2c 20 72 32 2c 20 72 31 29 3b 0a 20 20 20  py, r2, r1);.   
218d0 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
218e0 20 20 20 20 20 20 20 6a 2b 2b 3b 0a 20 20 20 20         j++;.    
218f0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
21900 7d 0a 20 20 20 20 20 20 20 20 72 65 67 52 65 63  }.        regRec
21910 6f 72 64 20 3d 20 73 71 6c 69 74 65 33 47 65 74  ord = sqlite3Get
21920 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b  TempReg(pParse);
21930 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
21940 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
21950 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20 72 65 67  _MakeRecord, reg
21960 42 61 73 65 2c 20 6e 43 6f 6c 2c 20 72 65 67 52  Base, nCol, regR
21970 65 63 6f 72 64 29 3b 0a 20 20 20 20 20 20 20 20  ecord);.        
21980 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
21990 32 28 76 2c 20 4f 50 5f 49 64 78 49 6e 73 65 72  2(v, OP_IdxInser
219a0 74 2c 20 73 41 67 67 49 6e 66 6f 2e 73 6f 72 74  t, sAggInfo.sort
219b0 69 6e 67 49 64 78 2c 20 72 65 67 52 65 63 6f 72  ingIdx, regRecor
219c0 64 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  d);.        sqli
219d0 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65  te3ReleaseTempRe
219e0 67 28 70 50 61 72 73 65 2c 20 72 65 67 52 65 63  g(pParse, regRec
219f0 6f 72 64 29 3b 0a 20 20 20 20 20 20 20 20 73 71  ord);.        sq
21a00 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70  lite3ReleaseTemp
21a10 52 61 6e 67 65 28 70 50 61 72 73 65 2c 20 72 65  Range(pParse, re
21a20 67 42 61 73 65 2c 20 6e 43 6f 6c 29 3b 0a 20 20  gBase, nCol);.  
21a30 20 20 20 20 20 20 73 71 6c 69 74 65 33 57 68 65        sqlite3Whe
21a40 72 65 45 6e 64 28 70 57 49 6e 66 6f 29 3b 0a 20  reEnd(pWInfo);. 
21a50 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
21a60 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 53  beAddOp2(v, OP_S
21a70 6f 72 74 2c 20 73 41 67 67 49 6e 66 6f 2e 73 6f  ort, sAggInfo.so
21a80 72 74 69 6e 67 49 64 78 2c 20 61 64 64 72 45 6e  rtingIdx, addrEn
21a90 64 29 3b 0a 20 20 20 20 20 20 20 20 56 64 62 65  d);.        Vdbe
21aa0 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 47 52 4f  Comment((v, "GRO
21ab0 55 50 20 42 59 20 73 6f 72 74 22 29 29 3b 0a 20  UP BY sort"));. 
21ac0 20 20 20 20 20 20 20 73 41 67 67 49 6e 66 6f 2e         sAggInfo.
21ad0 75 73 65 53 6f 72 74 69 6e 67 49 64 78 20 3d 20  useSortingIdx = 
21ae0 31 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  1;.      }..    
21af0 20 20 2f 2a 20 45 76 61 6c 75 61 74 65 20 74 68    /* Evaluate th
21b00 65 20 63 75 72 72 65 6e 74 20 47 52 4f 55 50 20  e current GROUP 
21b10 42 59 20 74 65 72 6d 73 20 61 6e 64 20 73 74 6f  BY terms and sto
21b20 72 65 20 69 6e 20 62 30 2c 20 62 31 2c 20 62 32  re in b0, b1, b2
21b30 2e 2e 2e 0a 20 20 20 20 20 20 2a 2a 20 28 62 30  ....      ** (b0
21b40 20 69 73 20 6d 65 6d 6f 72 79 20 6c 6f 63 61 74   is memory locat
21b50 69 6f 6e 20 69 42 4d 65 6d 2b 30 2c 20 62 31 20  ion iBMem+0, b1 
21b60 69 73 20 69 42 4d 65 6d 2b 31 2c 20 61 6e 64 20  is iBMem+1, and 
21b70 73 6f 20 66 6f 72 74 68 29 0a 20 20 20 20 20 20  so forth).      
21b80 2a 2a 20 54 68 65 6e 20 63 6f 6d 70 61 72 65 20  ** Then compare 
21b90 74 68 65 20 63 75 72 72 65 6e 74 20 47 52 4f 55  the current GROU
21ba0 50 20 42 59 20 74 65 72 6d 73 20 61 67 61 69 6e  P BY terms again
21bb0 73 74 20 74 68 65 20 47 52 4f 55 50 20 42 59 20  st the GROUP BY 
21bc0 74 65 72 6d 73 0a 20 20 20 20 20 20 2a 2a 20 66  terms.      ** f
21bd0 72 6f 6d 20 74 68 65 20 70 72 65 76 69 6f 75 73  rom the previous
21be0 20 72 6f 77 20 63 75 72 72 65 6e 74 6c 79 20 73   row currently s
21bf0 74 6f 72 65 64 20 69 6e 20 61 30 2c 20 61 31 2c  tored in a0, a1,
21c00 20 61 32 2e 2e 2e 0a 20 20 20 20 20 20 2a 2f 0a   a2....      */.
21c10 20 20 20 20 20 20 61 64 64 72 54 6f 70 4f 66 4c        addrTopOfL
21c20 6f 6f 70 20 3d 20 73 71 6c 69 74 65 33 56 64 62  oop = sqlite3Vdb
21c30 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b  eCurrentAddr(v);
21c40 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20  .      for(j=0; 
21c50 6a 3c 70 47 72 6f 75 70 42 79 2d 3e 6e 45 78 70  j<pGroupBy->nExp
21c60 72 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20  r; j++){.       
21c70 20 69 66 28 20 67 72 6f 75 70 42 79 53 6f 72 74   if( groupBySort
21c80 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71   ){.          sq
21c90 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
21ca0 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 73 41  v, OP_Column, sA
21cb0 67 67 49 6e 66 6f 2e 73 6f 72 74 69 6e 67 49 64  ggInfo.sortingId
21cc0 78 2c 20 6a 2c 20 69 42 4d 65 6d 2b 6a 29 3b 0a  x, j, iBMem+j);.
21cd0 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
21ce0 20 20 20 20 20 20 20 20 20 73 41 67 67 49 6e 66           sAggInf
21cf0 6f 2e 64 69 72 65 63 74 4d 6f 64 65 20 3d 20 31  o.directMode = 1
21d00 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  ;.          sqli
21d10 74 65 33 45 78 70 72 43 6f 64 65 28 70 50 61 72  te3ExprCode(pPar
21d20 73 65 2c 20 70 47 72 6f 75 70 42 79 2d 3e 61 5b  se, pGroupBy->a[
21d30 6a 5d 2e 70 45 78 70 72 2c 20 69 42 4d 65 6d 2b  j].pExpr, iBMem+
21d40 6a 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  j);.        }.  
21d50 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69      }.      sqli
21d60 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c  te3VdbeAddOp4(v,
21d70 20 4f 50 5f 43 6f 6d 70 61 72 65 2c 20 69 41 4d   OP_Compare, iAM
21d80 65 6d 2c 20 69 42 4d 65 6d 2c 20 70 47 72 6f 75  em, iBMem, pGrou
21d90 70 42 79 2d 3e 6e 45 78 70 72 2c 0a 20 20 20 20  pBy->nExpr,.    
21da0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21db0 20 20 20 20 20 20 28 63 68 61 72 2a 29 70 4b 65        (char*)pKe
21dc0 79 49 6e 66 6f 2c 20 50 34 5f 4b 45 59 49 4e 46  yInfo, P4_KEYINF
21dd0 4f 29 3b 0a 20 20 20 20 20 20 6a 31 20 3d 20 73  O);.      j1 = s
21de0 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e  qlite3VdbeCurren
21df0 74 41 64 64 72 28 76 29 3b 0a 20 20 20 20 20 20  tAddr(v);.      
21e00 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
21e10 33 28 76 2c 20 4f 50 5f 4a 75 6d 70 2c 20 6a 31  3(v, OP_Jump, j1
21e20 2b 31 2c 20 30 2c 20 6a 31 2b 31 29 3b 0a 0a 20  +1, 0, j1+1);.. 
21e30 20 20 20 20 20 2f 2a 20 47 65 6e 65 72 61 74 65       /* Generate
21e40 20 63 6f 64 65 20 74 68 61 74 20 72 75 6e 73 20   code that runs 
21e50 77 68 65 6e 65 76 65 72 20 74 68 65 20 47 52 4f  whenever the GRO
21e60 55 50 20 42 59 20 63 68 61 6e 67 65 73 2e 0a 20  UP BY changes.. 
21e70 20 20 20 20 20 2a 2a 20 43 68 61 6e 67 65 73 20       ** Changes 
21e80 69 6e 20 74 68 65 20 47 52 4f 55 50 20 42 59 20  in the GROUP BY 
21e90 61 72 65 20 64 65 74 65 63 74 65 64 20 62 79 20  are detected by 
21ea0 74 68 65 20 70 72 65 76 69 6f 75 73 20 63 6f 64  the previous cod
21eb0 65 0a 20 20 20 20 20 20 2a 2a 20 62 6c 6f 63 6b  e.      ** block
21ec0 2e 20 20 49 66 20 74 68 65 72 65 20 77 65 72 65  .  If there were
21ed0 20 6e 6f 20 63 68 61 6e 67 65 73 2c 20 74 68 69   no changes, thi
21ee0 73 20 62 6c 6f 63 6b 20 69 73 20 73 6b 69 70 70  s block is skipp
21ef0 65 64 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20  ed..      **.   
21f00 20 20 20 2a 2a 20 54 68 69 73 20 63 6f 64 65 20     ** This code 
21f10 63 6f 70 69 65 73 20 63 75 72 72 65 6e 74 20 67  copies current g
21f20 72 6f 75 70 20 62 79 20 74 65 72 6d 73 20 69 6e  roup by terms in
21f30 20 62 30 2c 62 31 2c 62 32 2c 2e 2e 2e 0a 20 20   b0,b1,b2,....  
21f40 20 20 20 20 2a 2a 20 6f 76 65 72 20 74 6f 20 61      ** over to a
21f50 30 2c 61 31 2c 61 32 2e 20 20 49 74 20 74 68 65  0,a1,a2.  It the
21f60 6e 20 63 61 6c 6c 73 20 74 68 65 20 6f 75 74 70  n calls the outp
21f70 75 74 20 73 75 62 72 6f 75 74 69 6e 65 0a 20 20  ut subroutine.  
21f80 20 20 20 20 2a 2a 20 61 6e 64 20 72 65 73 65 74      ** and reset
21f90 73 20 74 68 65 20 61 67 67 72 65 67 61 74 65 20  s the aggregate 
21fa0 61 63 63 75 6d 75 6c 61 74 6f 72 20 72 65 67 69  accumulator regi
21fb0 73 74 65 72 73 20 69 6e 20 70 72 65 70 61 72 61  sters in prepara
21fc0 74 69 6f 6e 0a 20 20 20 20 20 20 2a 2a 20 66 6f  tion.      ** fo
21fd0 72 20 74 68 65 20 6e 65 78 74 20 47 52 4f 55 50  r the next GROUP
21fe0 20 42 59 20 62 61 74 63 68 2e 0a 20 20 20 20 20   BY batch..     
21ff0 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65   */.      sqlite
22000 33 45 78 70 72 43 6f 64 65 4d 6f 76 65 28 70 50  3ExprCodeMove(pP
22010 61 72 73 65 2c 20 69 42 4d 65 6d 2c 20 69 41 4d  arse, iBMem, iAM
22020 65 6d 2c 20 70 47 72 6f 75 70 42 79 2d 3e 6e 45  em, pGroupBy->nE
22030 78 70 72 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  xpr);.      sqli
22040 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
22050 20 4f 50 5f 47 6f 73 75 62 2c 20 72 65 67 4f 75   OP_Gosub, regOu
22060 74 70 75 74 52 6f 77 2c 20 61 64 64 72 4f 75 74  tputRow, addrOut
22070 70 75 74 52 6f 77 29 3b 0a 20 20 20 20 20 20 56  putRow);.      V
22080 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22  dbeComment((v, "
22090 6f 75 74 70 75 74 20 6f 6e 65 20 72 6f 77 22 29  output one row")
220a0 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
220b0 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
220c0 5f 49 66 50 6f 73 2c 20 69 41 62 6f 72 74 46 6c  _IfPos, iAbortFl
220d0 61 67 2c 20 61 64 64 72 45 6e 64 29 3b 0a 20 20  ag, addrEnd);.  
220e0 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28      VdbeComment(
220f0 28 76 2c 20 22 63 68 65 63 6b 20 61 62 6f 72 74  (v, "check abort
22100 20 66 6c 61 67 22 29 29 3b 0a 20 20 20 20 20 20   flag"));.      
22110 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
22120 32 28 76 2c 20 4f 50 5f 47 6f 73 75 62 2c 20 72  2(v, OP_Gosub, r
22130 65 67 52 65 73 65 74 2c 20 61 64 64 72 52 65 73  egReset, addrRes
22140 65 74 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43  et);.      VdbeC
22150 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 72 65 73 65  omment((v, "rese
22160 74 20 61 63 63 75 6d 75 6c 61 74 6f 72 22 29 29  t accumulator"))
22170 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 55 70 64 61  ;..      /* Upda
22180 74 65 20 74 68 65 20 61 67 67 72 65 67 61 74 65  te the aggregate
22190 20 61 63 63 75 6d 75 6c 61 74 6f 72 73 20 62 61   accumulators ba
221a0 73 65 64 20 6f 6e 20 74 68 65 20 63 6f 6e 74 65  sed on the conte
221b0 6e 74 20 6f 66 0a 20 20 20 20 20 20 2a 2a 20 74  nt of.      ** t
221c0 68 65 20 63 75 72 72 65 6e 74 20 72 6f 77 0a 20  he current row. 
221d0 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 73 71       */.      sq
221e0 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72  lite3VdbeJumpHer
221f0 65 28 76 2c 20 6a 31 29 3b 0a 20 20 20 20 20 20  e(v, j1);.      
22200 75 70 64 61 74 65 41 63 63 75 6d 75 6c 61 74 6f  updateAccumulato
22210 72 28 70 50 61 72 73 65 2c 20 26 73 41 67 67 49  r(pParse, &sAggI
22220 6e 66 6f 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  nfo);.      sqli
22230 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
22240 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 31 2c 20   OP_Integer, 1, 
22250 69 55 73 65 46 6c 61 67 29 3b 0a 20 20 20 20 20  iUseFlag);.     
22260 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c   VdbeComment((v,
22270 20 22 69 6e 64 69 63 61 74 65 20 64 61 74 61 20   "indicate data 
22280 69 6e 20 61 63 63 75 6d 75 6c 61 74 6f 72 22 29  in accumulator")
22290 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 45 6e 64  );..      /* End
222a0 20 6f 66 20 74 68 65 20 6c 6f 6f 70 0a 20 20 20   of the loop.   
222b0 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20     */.      if( 
222c0 67 72 6f 75 70 42 79 53 6f 72 74 20 29 7b 0a 20  groupBySort ){. 
222d0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
222e0 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e  beAddOp2(v, OP_N
222f0 65 78 74 2c 20 73 41 67 67 49 6e 66 6f 2e 73 6f  ext, sAggInfo.so
22300 72 74 69 6e 67 49 64 78 2c 20 61 64 64 72 54 6f  rtingIdx, addrTo
22310 70 4f 66 4c 6f 6f 70 29 3b 0a 20 20 20 20 20 20  pOfLoop);.      
22320 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73  }else{.        s
22330 71 6c 69 74 65 33 57 68 65 72 65 45 6e 64 28 70  qlite3WhereEnd(p
22340 57 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20 20 20  WInfo);.        
22350 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67  sqlite3VdbeChang
22360 65 54 6f 4e 6f 6f 70 28 76 2c 20 61 64 64 72 53  eToNoop(v, addrS
22370 6f 72 74 69 6e 67 49 64 78 2c 20 31 29 3b 0a 20  ortingIdx, 1);. 
22380 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a       }..      /*
22390 20 4f 75 74 70 75 74 20 74 68 65 20 66 69 6e 61   Output the fina
223a0 6c 20 72 6f 77 20 6f 66 20 72 65 73 75 6c 74 0a  l row of result.
223b0 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 73        */.      s
223c0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
223d0 28 76 2c 20 4f 50 5f 47 6f 73 75 62 2c 20 72 65  (v, OP_Gosub, re
223e0 67 4f 75 74 70 75 74 52 6f 77 2c 20 61 64 64 72  gOutputRow, addr
223f0 4f 75 74 70 75 74 52 6f 77 29 3b 0a 20 20 20 20  OutputRow);.    
22400 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76    VdbeComment((v
22410 2c 20 22 6f 75 74 70 75 74 20 66 69 6e 61 6c 20  , "output final 
22420 72 6f 77 22 29 29 3b 0a 20 20 20 20 20 20 0a 20  row"));.      . 
22430 20 20 20 7d 20 2f 2a 20 65 6e 64 69 66 20 70 47     } /* endif pG
22440 72 6f 75 70 42 79 20 2a 2f 0a 20 20 20 20 65 6c  roupBy */.    el
22450 73 65 20 7b 0a 20 20 20 20 20 20 45 78 70 72 4c  se {.      ExprL
22460 69 73 74 20 2a 70 4d 69 6e 4d 61 78 20 3d 20 30  ist *pMinMax = 0
22470 3b 0a 20 20 20 20 20 20 45 78 70 72 4c 69 73 74  ;.      ExprList
22480 20 2a 70 44 65 6c 20 3d 20 30 3b 0a 20 20 20 20   *pDel = 0;.    
22490 20 20 75 38 20 66 6c 61 67 3b 0a 0a 20 20 20 20    u8 flag;..    
224a0 20 20 2f 2a 20 43 68 65 63 6b 20 69 66 20 74 68    /* Check if th
224b0 65 20 71 75 65 72 79 20 69 73 20 6f 66 20 6f 6e  e query is of on
224c0 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69  e of the followi
224d0 6e 67 20 66 6f 72 6d 73 3a 0a 20 20 20 20 20 20  ng forms:.      
224e0 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 20 20 53 45  **.      **   SE
224f0 4c 45 43 54 20 6d 69 6e 28 78 29 20 46 52 4f 4d  LECT min(x) FROM
22500 20 2e 2e 2e 0a 20 20 20 20 20 20 2a 2a 20 20 20   ....      **   
22510 53 45 4c 45 43 54 20 6d 61 78 28 78 29 20 46 52  SELECT max(x) FR
22520 4f 4d 20 2e 2e 2e 0a 20 20 20 20 20 20 2a 2a 0a  OM ....      **.
22530 20 20 20 20 20 20 2a 2a 20 49 66 20 69 74 20 69        ** If it i
22540 73 2c 20 74 68 65 6e 20 61 73 6b 20 74 68 65 20  s, then ask the 
22550 63 6f 64 65 20 69 6e 20 77 68 65 72 65 2e 63 20  code in where.c 
22560 74 6f 20 61 74 74 65 6d 70 74 20 74 6f 20 73 6f  to attempt to so
22570 72 74 20 72 65 73 75 6c 74 73 0a 20 20 20 20 20  rt results.     
22580 20 2a 2a 20 61 73 20 69 66 20 74 68 65 72 65 20   ** as if there 
22590 77 61 73 20 61 6e 20 22 4f 52 44 45 52 20 4f 4e  was an "ORDER ON
225a0 20 78 22 20 6f 72 20 22 4f 52 44 45 52 20 4f 4e   x" or "ORDER ON
225b0 20 78 20 44 45 53 43 22 20 63 6c 61 75 73 65 2e   x DESC" clause.
225c0 20 0a 20 20 20 20 20 20 2a 2a 20 49 66 20 77 68   .      ** If wh
225d0 65 72 65 2e 63 20 69 73 20 61 62 6c 65 20 74 6f  ere.c is able to
225e0 20 70 72 6f 64 75 63 65 20 72 65 73 75 6c 74 73   produce results
225f0 20 73 6f 72 74 65 64 20 69 6e 20 74 68 69 73 20   sorted in this 
22600 6f 72 64 65 72 2c 20 74 68 65 6e 0a 20 20 20 20  order, then.    
22610 20 20 2a 2a 20 61 64 64 20 76 64 62 65 20 63 6f    ** add vdbe co
22620 64 65 20 74 6f 20 62 72 65 61 6b 20 6f 75 74 20  de to break out 
22630 6f 66 20 74 68 65 20 70 72 6f 63 65 73 73 69 6e  of the processin
22640 67 20 6c 6f 6f 70 20 61 66 74 65 72 20 74 68 65  g loop after the
22650 20 0a 20 20 20 20 20 20 2a 2a 20 66 69 72 73 74   .      ** first
22660 20 69 74 65 72 61 74 69 6f 6e 20 28 73 69 6e 63   iteration (sinc
22670 65 20 74 68 65 20 66 69 72 73 74 20 69 74 65 72  e the first iter
22680 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 6c 6f 6f  ation of the loo
22690 70 20 69 73 20 0a 20 20 20 20 20 20 2a 2a 20 67  p is .      ** g
226a0 75 61 72 61 6e 74 65 65 64 20 74 6f 20 6f 70 65  uaranteed to ope
226b0 72 61 74 65 20 6f 6e 20 74 68 65 20 72 6f 77 20  rate on the row 
226c0 77 69 74 68 20 74 68 65 20 6d 69 6e 69 6d 75 6d  with the minimum
226d0 20 6f 72 20 6d 61 78 69 6d 75 6d 20 0a 20 20 20   or maximum .   
226e0 20 20 20 2a 2a 20 76 61 6c 75 65 20 6f 66 20 78     ** value of x
226f0 2c 20 74 68 65 20 6f 6e 6c 79 20 72 6f 77 20 72  , the only row r
22700 65 71 75 69 72 65 64 29 2e 0a 20 20 20 20 20 20  equired)..      
22710 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 41 20 73 70  **.      ** A sp
22720 65 63 69 61 6c 20 66 6c 61 67 20 6d 75 73 74 20  ecial flag must 
22730 62 65 20 70 61 73 73 65 64 20 74 6f 20 73 71 6c  be passed to sql
22740 69 74 65 33 57 68 65 72 65 42 65 67 69 6e 28 29  ite3WhereBegin()
22750 20 74 6f 20 73 6c 69 67 68 74 6c 79 0a 20 20 20   to slightly.   
22760 20 20 20 2a 2a 20 6d 6f 64 69 66 79 20 62 65 68     ** modify beh
22770 61 76 69 6f 75 72 20 61 73 20 66 6f 6c 6c 6f 77  aviour as follow
22780 73 3a 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20  s:.      **.    
22790 20 20 2a 2a 20 20 20 2b 20 49 66 20 74 68 65 20    **   + If the 
227a0 71 75 65 72 79 20 69 73 20 61 20 22 53 45 4c 45  query is a "SELE
227b0 43 54 20 6d 69 6e 28 78 29 22 2c 20 74 68 65 6e  CT min(x)", then
227c0 20 74 68 65 20 6c 6f 6f 70 20 63 6f 64 65 64 20   the loop coded 
227d0 62 79 0a 20 20 20 20 20 20 2a 2a 20 20 20 20 20  by.      **     
227e0 77 68 65 72 65 2e 63 20 73 68 6f 75 6c 64 20 6e  where.c should n
227f0 6f 74 20 69 74 65 72 61 74 65 20 6f 76 65 72 20  ot iterate over 
22800 61 6e 79 20 76 61 6c 75 65 73 20 77 69 74 68 20  any values with 
22810 61 20 4e 55 4c 4c 20 76 61 6c 75 65 0a 20 20 20  a NULL value.   
22820 20 20 20 2a 2a 20 20 20 20 20 66 6f 72 20 78 2e     **     for x.
22830 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20  .      **.      
22840 2a 2a 20 20 20 2b 20 54 68 65 20 6f 70 74 69 6d  **   + The optim
22850 69 7a 65 72 20 63 6f 64 65 20 69 6e 20 77 68 65  izer code in whe
22860 72 65 2e 63 20 28 74 68 65 20 74 68 69 6e 67 20  re.c (the thing 
22870 74 68 61 74 20 64 65 63 69 64 65 73 20 77 68 69  that decides whi
22880 63 68 0a 20 20 20 20 20 20 2a 2a 20 20 20 20 20  ch.      **     
22890 69 6e 64 65 78 20 6f 72 20 69 6e 64 69 63 65 73  index or indices
228a0 20 74 6f 20 75 73 65 29 20 73 68 6f 75 6c 64 20   to use) should 
228b0 70 6c 61 63 65 20 61 20 64 69 66 66 65 72 65 6e  place a differen
228c0 74 20 70 72 69 6f 72 69 74 79 20 6f 6e 20 0a 20  t priority on . 
228d0 20 20 20 20 20 2a 2a 20 20 20 20 20 73 61 74 69       **     sati
228e0 73 66 79 69 6e 67 20 74 68 65 20 27 4f 52 44 45  sfying the 'ORDE
228f0 52 20 42 59 27 20 63 6c 61 75 73 65 20 74 68 61  R BY' clause tha
22900 6e 20 69 74 20 64 6f 65 73 20 69 6e 20 6f 74 68  n it does in oth
22910 65 72 20 63 61 73 65 73 2e 0a 20 20 20 20 20 20  er cases..      
22920 2a 2a 20 20 20 20 20 52 65 66 65 72 20 74 6f 20  **     Refer to 
22930 63 6f 64 65 20 61 6e 64 20 63 6f 6d 6d 65 6e 74  code and comment
22940 73 20 69 6e 20 77 68 65 72 65 2e 63 20 66 6f 72  s in where.c for
22950 20 64 65 74 61 69 6c 73 2e 0a 20 20 20 20 20 20   details..      
22960 2a 2f 0a 20 20 20 20 20 20 66 6c 61 67 20 3d 20  */.      flag = 
22970 6d 69 6e 4d 61 78 51 75 65 72 79 28 70 50 61 72  minMaxQuery(pPar
22980 73 65 2c 20 70 29 3b 0a 20 20 20 20 20 20 69 66  se, p);.      if
22990 28 20 66 6c 61 67 20 29 7b 0a 20 20 20 20 20 20  ( flag ){.      
229a0 20 20 70 44 65 6c 20 3d 20 70 4d 69 6e 4d 61 78    pDel = pMinMax
229b0 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69   = sqlite3ExprLi
229c0 73 74 44 75 70 28 64 62 2c 20 70 2d 3e 70 45 4c  stDup(db, p->pEL
229d0 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 2d  ist->a[0].pExpr-
229e0 3e 70 4c 69 73 74 29 3b 0a 20 20 20 20 20 20 20  >pList);.       
229f0 20 69 66 28 20 70 4d 69 6e 4d 61 78 20 26 26 20   if( pMinMax && 
22a00 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65  !db->mallocFaile
22a10 64 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70  d ){.          p
22a20 4d 69 6e 4d 61 78 2d 3e 61 5b 30 5d 2e 73 6f 72  MinMax->a[0].sor
22a30 74 4f 72 64 65 72 20 3d 20 66 6c 61 67 21 3d 57  tOrder = flag!=W
22a40 48 45 52 45 5f 4f 52 44 45 52 42 59 5f 4d 49 4e  HERE_ORDERBY_MIN
22a50 3b 0a 20 20 20 20 20 20 20 20 20 20 70 4d 69 6e  ;.          pMin
22a60 4d 61 78 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 2d  Max->a[0].pExpr-
22a70 3e 6f 70 20 3d 20 54 4b 5f 43 4f 4c 55 4d 4e 3b  >op = TK_COLUMN;
22a80 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
22a90 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 54 68 69   }..      /* Thi
22aa0 73 20 63 61 73 65 20 72 75 6e 73 20 69 66 20 74  s case runs if t
22ab0 68 65 20 61 67 67 72 65 67 61 74 65 20 68 61 73  he aggregate has
22ac0 20 6e 6f 20 47 52 4f 55 50 20 42 59 20 63 6c 61   no GROUP BY cla
22ad0 75 73 65 2e 20 20 54 68 65 0a 20 20 20 20 20 20  use.  The.      
22ae0 2a 2a 20 70 72 6f 63 65 73 73 69 6e 67 20 69 73  ** processing is
22af0 20 6d 75 63 68 20 73 69 6d 70 6c 65 72 20 73 69   much simpler si
22b00 6e 63 65 20 74 68 65 72 65 20 69 73 20 6f 6e 6c  nce there is onl
22b10 79 20 61 20 73 69 6e 67 6c 65 20 72 6f 77 0a 20  y a single row. 
22b20 20 20 20 20 20 2a 2a 20 6f 66 20 6f 75 74 70 75       ** of outpu
22b30 74 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  t..      */.    
22b40 20 20 72 65 73 65 74 41 63 63 75 6d 75 6c 61 74    resetAccumulat
22b50 6f 72 28 70 50 61 72 73 65 2c 20 26 73 41 67 67  or(pParse, &sAgg
22b60 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20 70 57 49  Info);.      pWI
22b70 6e 66 6f 20 3d 20 73 71 6c 69 74 65 33 57 68 65  nfo = sqlite3Whe
22b80 72 65 42 65 67 69 6e 28 70 50 61 72 73 65 2c 20  reBegin(pParse, 
22b90 70 54 61 62 4c 69 73 74 2c 20 70 57 68 65 72 65  pTabList, pWhere
22ba0 2c 20 26 70 4d 69 6e 4d 61 78 2c 20 66 6c 61 67  , &pMinMax, flag
22bb0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 57 49  );.      if( pWI
22bc0 6e 66 6f 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  nfo==0 ){.      
22bd0 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73    sqlite3ExprLis
22be0 74 44 65 6c 65 74 65 28 70 44 65 6c 29 3b 0a 20  tDelete(pDel);. 
22bf0 20 20 20 20 20 20 20 67 6f 74 6f 20 73 65 6c 65         goto sele
22c00 63 74 5f 65 6e 64 3b 0a 20 20 20 20 20 20 7d 0a  ct_end;.      }.
22c10 20 20 20 20 20 20 75 70 64 61 74 65 41 63 63 75        updateAccu
22c20 6d 75 6c 61 74 6f 72 28 70 50 61 72 73 65 2c 20  mulator(pParse, 
22c30 26 73 41 67 67 49 6e 66 6f 29 3b 0a 20 20 20 20  &sAggInfo);.    
22c40 20 20 69 66 28 20 21 70 4d 69 6e 4d 61 78 20 26    if( !pMinMax &
22c50 26 20 66 6c 61 67 20 29 7b 0a 20 20 20 20 20 20  & flag ){.      
22c60 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
22c70 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20  Op2(v, OP_Goto, 
22c80 30 2c 20 70 57 49 6e 66 6f 2d 3e 69 42 72 65 61  0, pWInfo->iBrea
22c90 6b 29 3b 0a 20 20 20 20 20 20 20 20 56 64 62 65  k);.        Vdbe
22ca0 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 25 73 28  Comment((v, "%s(
22cb0 29 20 62 79 20 69 6e 64 65 78 22 2c 28 66 6c 61  ) by index",(fla
22cc0 67 3d 3d 57 48 45 52 45 5f 4f 52 44 45 52 42 59  g==WHERE_ORDERBY
22cd0 5f 4d 49 4e 3f 22 6d 69 6e 22 3a 22 6d 61 78 22  _MIN?"min":"max"
22ce0 29 29 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  )));.      }.   
22cf0 20 20 20 73 71 6c 69 74 65 33 57 68 65 72 65 45     sqlite3WhereE
22d00 6e 64 28 70 57 49 6e 66 6f 29 3b 0a 20 20 20 20  nd(pWInfo);.    
22d10 20 20 66 69 6e 61 6c 69 7a 65 41 67 67 46 75 6e    finalizeAggFun
22d20 63 74 69 6f 6e 73 28 70 50 61 72 73 65 2c 20 26  ctions(pParse, &
22d30 73 41 67 67 49 6e 66 6f 29 3b 0a 20 20 20 20 20  sAggInfo);.     
22d40 20 70 4f 72 64 65 72 42 79 20 3d 20 30 3b 0a 20   pOrderBy = 0;. 
22d50 20 20 20 20 20 69 66 28 20 70 48 61 76 69 6e 67       if( pHaving
22d60 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
22d70 74 65 33 45 78 70 72 49 66 46 61 6c 73 65 28 70  te3ExprIfFalse(p
22d80 50 61 72 73 65 2c 20 70 48 61 76 69 6e 67 2c 20  Parse, pHaving, 
22d90 61 64 64 72 45 6e 64 2c 20 53 51 4c 49 54 45 5f  addrEnd, SQLITE_
22da0 4a 55 4d 50 49 46 4e 55 4c 4c 29 3b 0a 20 20 20  JUMPIFNULL);.   
22db0 20 20 20 7d 0a 20 20 20 20 20 20 73 65 6c 65 63     }.      selec
22dc0 74 49 6e 6e 65 72 4c 6f 6f 70 28 70 50 61 72 73  tInnerLoop(pPars
22dd0 65 2c 20 70 2c 20 70 2d 3e 70 45 4c 69 73 74 2c  e, p, p->pEList,
22de0 20 30 2c 20 30 2c 20 30 2c 20 2d 31 2c 20 0a 20   0, 0, 0, -1, . 
22df0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22e00 20 20 20 20 20 70 44 65 73 74 2c 20 61 64 64 72       pDest, addr
22e10 45 6e 64 2c 20 61 64 64 72 45 6e 64 29 3b 0a 0a  End, addrEnd);..
22e20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
22e30 72 4c 69 73 74 44 65 6c 65 74 65 28 70 44 65 6c  rListDelete(pDel
22e40 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c  );.    }.    sql
22e50 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c  ite3VdbeResolveL
22e60 61 62 65 6c 28 76 2c 20 61 64 64 72 45 6e 64 29  abel(v, addrEnd)
22e70 3b 0a 20 20 20 20 0a 20 20 7d 20 2f 2a 20 65 6e  ;.    .  } /* en
22e80 64 69 66 20 61 67 67 72 65 67 61 74 65 20 71 75  dif aggregate qu
22e90 65 72 79 20 2a 2f 0a 0a 20 20 2f 2a 20 49 66 20  ery */..  /* If 
22ea0 74 68 65 72 65 20 69 73 20 61 6e 20 4f 52 44 45  there is an ORDE
22eb0 52 20 42 59 20 63 6c 61 75 73 65 2c 20 74 68 65  R BY clause, the
22ec0 6e 20 77 65 20 6e 65 65 64 20 74 6f 20 73 6f 72  n we need to sor
22ed0 74 20 74 68 65 20 72 65 73 75 6c 74 73 0a 20 20  t the results.  
22ee0 2a 2a 20 61 6e 64 20 73 65 6e 64 20 74 68 65 6d  ** and send them
22ef0 20 74 6f 20 74 68 65 20 63 61 6c 6c 62 61 63 6b   to the callback
22f00 20 6f 6e 65 20 62 79 20 6f 6e 65 2e 0a 20 20 2a   one by one..  *
22f10 2f 0a 20 20 69 66 28 20 70 4f 72 64 65 72 42 79  /.  if( pOrderBy
22f20 20 29 7b 0a 20 20 20 20 67 65 6e 65 72 61 74 65   ){.    generate
22f30 53 6f 72 74 54 61 69 6c 28 70 50 61 72 73 65 2c  SortTail(pParse,
22f40 20 70 2c 20 76 2c 20 70 45 4c 69 73 74 2d 3e 6e   p, v, pEList->n
22f50 45 78 70 72 2c 20 70 44 65 73 74 29 3b 0a 20 20  Expr, pDest);.  
22f60 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  }..#ifndef SQLIT
22f70 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a  E_OMIT_SUBQUERY.
22f80 20 20 2f 2a 20 49 66 20 74 68 69 73 20 77 61 73    /* If this was
22f90 20 61 20 73 75 62 71 75 65 72 79 2c 20 77 65 20   a subquery, we 
22fa0 68 61 76 65 20 6e 6f 77 20 63 6f 6e 76 65 72 74  have now convert
22fb0 65 64 20 74 68 65 20 73 75 62 71 75 65 72 79 20  ed the subquery 
22fc0 69 6e 74 6f 20 61 0a 20 20 2a 2a 20 74 65 6d 70  into a.  ** temp
22fd0 6f 72 61 72 79 20 74 61 62 6c 65 2e 20 20 53 6f  orary table.  So
22fe0 20 73 65 74 20 74 68 65 20 53 72 63 4c 69 73 74   set the SrcList
22ff0 5f 69 74 65 6d 2e 69 73 50 6f 70 75 6c 61 74 65  _item.isPopulate
23000 64 20 66 6c 61 67 20 74 6f 20 70 72 65 76 65 6e  d flag to preven
23010 74 0a 20 20 2a 2a 20 74 68 69 73 20 73 75 62 71  t.  ** this subq
23020 75 65 72 79 20 66 72 6f 6d 20 62 65 69 6e 67 20  uery from being 
23030 65 76 61 6c 75 61 74 65 64 20 61 67 61 69 6e 20  evaluated again 
23040 61 6e 64 20 74 6f 20 66 6f 72 63 65 20 74 68 65  and to force the
23050 20 75 73 65 20 6f 66 0a 20 20 2a 2a 20 74 68 65   use of.  ** the
23060 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65   temporary table
23070 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 50 61  ..  */.  if( pPa
23080 72 65 6e 74 20 29 7b 0a 20 20 20 20 61 73 73 65  rent ){.    asse
23090 72 74 28 20 70 50 61 72 65 6e 74 2d 3e 70 53 72  rt( pParent->pSr
230a0 63 2d 3e 6e 53 72 63 3e 70 61 72 65 6e 74 54 61  c->nSrc>parentTa
230b0 62 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  b );.    assert(
230c0 20 70 50 61 72 65 6e 74 2d 3e 70 53 72 63 2d 3e   pParent->pSrc->
230d0 61 5b 70 61 72 65 6e 74 54 61 62 5d 2e 70 53 65  a[parentTab].pSe
230e0 6c 65 63 74 3d 3d 70 20 29 3b 0a 20 20 20 20 70  lect==p );.    p
230f0 50 61 72 65 6e 74 2d 3e 70 53 72 63 2d 3e 61 5b  Parent->pSrc->a[
23100 70 61 72 65 6e 74 54 61 62 5d 2e 69 73 50 6f 70  parentTab].isPop
23110 75 6c 61 74 65 64 20 3d 20 31 3b 0a 20 20 7d 0a  ulated = 1;.  }.
23120 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 4a 75 6d  #endif..  /* Jum
23130 70 20 68 65 72 65 20 74 6f 20 73 6b 69 70 20 74  p here to skip t
23140 68 69 73 20 71 75 65 72 79 0a 20 20 2a 2f 0a 20  his query.  */. 
23150 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f   sqlite3VdbeReso
23160 6c 76 65 4c 61 62 65 6c 28 76 2c 20 69 45 6e 64  lveLabel(v, iEnd
23170 29 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 53 45 4c  );..  /* The SEL
23180 45 43 54 20 77 61 73 20 73 75 63 63 65 73 73 66  ECT was successf
23190 75 6c 6c 79 20 63 6f 64 65 64 2e 20 20 20 53 65  ully coded.   Se
231a0 74 20 74 68 65 20 72 65 74 75 72 6e 20 63 6f 64  t the return cod
231b0 65 20 74 6f 20 30 0a 20 20 2a 2a 20 74 6f 20 69  e to 0.  ** to i
231c0 6e 64 69 63 61 74 65 20 6e 6f 20 65 72 72 6f 72  ndicate no error
231d0 73 2e 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20 30  s..  */.  rc = 0
231e0 3b 0a 0a 20 20 2f 2a 20 43 6f 6e 74 72 6f 6c 20  ;..  /* Control 
231f0 6a 75 6d 70 73 20 74 6f 20 68 65 72 65 20 69 66  jumps to here if
23200 20 61 6e 20 65 72 72 6f 72 20 69 73 20 65 6e 63   an error is enc
23210 6f 75 6e 74 65 72 65 64 20 61 62 6f 76 65 2c 20  ountered above, 
23220 6f 72 20 75 70 6f 6e 0a 20 20 2a 2a 20 73 75 63  or upon.  ** suc
23230 63 65 73 73 66 75 6c 20 63 6f 64 69 6e 67 20 6f  cessful coding o
23240 66 20 74 68 65 20 53 45 4c 45 43 54 2e 0a 20 20  f the SELECT..  
23250 2a 2f 0a 73 65 6c 65 63 74 5f 65 6e 64 3a 0a 0a  */.select_end:..
23260 20 20 2f 2a 20 49 64 65 6e 74 69 66 79 20 63 6f    /* Identify co
23270 6c 75 6d 6e 20 6e 61 6d 65 73 20 69 66 20 77 65  lumn names if we
23280 20 77 69 6c 6c 20 62 65 20 75 73 69 6e 67 20 74   will be using t
23290 68 65 6d 20 69 6e 20 61 20 63 61 6c 6c 62 61 63  hem in a callbac
232a0 6b 2e 20 20 54 68 69 73 0a 20 20 2a 2a 20 73 74  k.  This.  ** st
232b0 65 70 20 69 73 20 73 6b 69 70 70 65 64 20 69 66  ep is skipped if
232c0 20 74 68 65 20 6f 75 74 70 75 74 20 69 73 20 67   the output is g
232d0 6f 69 6e 67 20 74 6f 20 73 6f 6d 65 20 6f 74 68  oing to some oth
232e0 65 72 20 64 65 73 74 69 6e 61 74 69 6f 6e 2e 0a  er destination..
232f0 20 20 2a 2f 0a 20 20 69 66 28 20 72 63 3d 3d 53    */.  if( rc==S
23300 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 44 65 73  QLITE_OK && pDes
23310 74 2d 3e 65 44 65 73 74 3d 3d 53 52 54 5f 43 61  t->eDest==SRT_Ca
23320 6c 6c 62 61 63 6b 20 29 7b 0a 20 20 20 20 67 65  llback ){.    ge
23330 6e 65 72 61 74 65 43 6f 6c 75 6d 6e 4e 61 6d 65  nerateColumnName
23340 73 28 70 50 61 72 73 65 2c 20 70 54 61 62 4c 69  s(pParse, pTabLi
23350 73 74 2c 20 70 45 4c 69 73 74 29 3b 0a 20 20 7d  st, pEList);.  }
23360 0a 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65  ..  sqlite3_free
23370 28 73 41 67 67 49 6e 66 6f 2e 61 43 6f 6c 29 3b  (sAggInfo.aCol);
23380 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28  .  sqlite3_free(
23390 73 41 67 67 49 6e 66 6f 2e 61 46 75 6e 63 29 3b  sAggInfo.aFunc);
233a0 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
233b0 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c  .#if defined(SQL
233c0 49 54 45 5f 44 45 42 55 47 29 0a 2f 2a 0a 2a 2a  ITE_DEBUG)./*.**
233d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
233e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
233f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
23400 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
23410 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a  *************.**
23420 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63   The following c
23430 6f 64 65 20 69 73 20 75 73 65 64 20 66 6f 72 20  ode is used for 
23440 74 65 73 74 69 6e 67 20 61 6e 64 20 64 65 62 75  testing and debu
23450 67 67 69 6e 67 20 6f 6e 6c 79 2e 20 20 54 68 65  gging only.  The
23460 20 63 6f 64 65 0a 2a 2a 20 74 68 61 74 20 66 6f   code.** that fo
23470 6c 6c 6f 77 73 20 64 6f 65 73 20 6e 6f 74 20 61  llows does not a
23480 70 70 65 61 72 20 69 6e 20 6e 6f 72 6d 61 6c 20  ppear in normal 
23490 62 75 69 6c 64 73 2e 0a 2a 2a 0a 2a 2a 20 54 68  builds..**.** Th
234a0 65 73 65 20 72 6f 75 74 69 6e 65 73 20 61 72 65  ese routines are
234b0 20 75 73 65 64 20 74 6f 20 70 72 69 6e 74 20 6f   used to print o
234c0 75 74 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f  ut the content o
234d0 66 20 61 6c 6c 20 6f 72 20 70 61 72 74 20 6f 66  f all or part of
234e0 20 61 20 0a 2a 2a 20 70 61 72 73 65 20 73 74 72   a .** parse str
234f0 75 63 74 75 72 65 73 20 73 75 63 68 20 61 73 20  uctures such as 
23500 53 65 6c 65 63 74 20 6f 72 20 45 78 70 72 2e 20  Select or Expr. 
23510 20 53 75 63 68 20 70 72 69 6e 74 6f 75 74 73 20   Such printouts 
23520 61 72 65 20 75 73 65 66 75 6c 0a 2a 2a 20 66 6f  are useful.** fo
23530 72 20 68 65 6c 70 69 6e 67 20 74 6f 20 75 6e 64  r helping to und
23540 65 72 73 74 61 6e 64 20 77 68 61 74 20 69 73 20  erstand what is 
23550 68 61 70 70 65 6e 69 6e 67 20 69 6e 73 69 64 65  happening inside
23560 20 74 68 65 20 63 6f 64 65 20 67 65 6e 65 72 61   the code genera
23570 74 6f 72 0a 2a 2a 20 64 75 72 69 6e 67 20 74 68  tor.** during th
23580 65 20 65 78 65 63 75 74 69 6f 6e 20 6f 66 20 63  e execution of c
23590 6f 6d 70 6c 65 78 20 53 45 4c 45 43 54 20 73 74  omplex SELECT st
235a0 61 74 65 6d 65 6e 74 73 2e 0a 2a 2a 0a 2a 2a 20  atements..**.** 
235b0 54 68 65 73 65 20 72 6f 75 74 69 6e 65 20 61 72  These routine ar
235c0 65 20 6e 6f 74 20 63 61 6c 6c 65 64 20 61 6e 79  e not called any
235d0 77 68 65 72 65 20 66 72 6f 6d 20 77 69 74 68 69  where from withi
235e0 6e 20 74 68 65 20 6e 6f 72 6d 61 6c 0a 2a 2a 20  n the normal.** 
235f0 63 6f 64 65 20 62 61 73 65 2e 20 20 54 68 65 6e  code base.  Then
23600 20 61 72 65 20 69 6e 74 65 6e 64 65 64 20 74 6f   are intended to
23610 20 62 65 20 63 61 6c 6c 65 64 20 66 72 6f 6d 20   be called from 
23620 77 69 74 68 69 6e 20 74 68 65 20 64 65 62 75 67  within the debug
23630 67 65 72 0a 2a 2a 20 6f 72 20 66 72 6f 6d 20 74  ger.** or from t
23640 65 6d 70 6f 72 61 72 79 20 22 70 72 69 6e 74 66  emporary "printf
23650 22 20 73 74 61 74 65 6d 65 6e 74 73 20 69 6e 73  " statements ins
23660 65 72 74 65 64 20 66 6f 72 20 64 65 62 75 67 67  erted for debugg
23670 69 6e 67 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ing..*/.void sql
23680 69 74 65 33 50 72 69 6e 74 45 78 70 72 28 45 78  ite3PrintExpr(Ex
23690 70 72 20 2a 70 29 7b 0a 20 20 69 66 28 20 70 2d  pr *p){.  if( p-
236a0 3e 74 6f 6b 65 6e 2e 7a 20 26 26 20 70 2d 3e 74  >token.z && p->t
236b0 6f 6b 65 6e 2e 6e 3e 30 20 29 7b 0a 20 20 20 20  oken.n>0 ){.    
236c0 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e  sqlite3DebugPrin
236d0 74 66 28 22 28 25 2e 2a 73 22 2c 20 70 2d 3e 74  tf("(%.*s", p->t
236e0 6f 6b 65 6e 2e 6e 2c 20 70 2d 3e 74 6f 6b 65 6e  oken.n, p->token
236f0 2e 7a 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  .z);.  }else{.  
23700 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72    sqlite3DebugPr
23710 69 6e 74 66 28 22 28 25 64 22 2c 20 70 2d 3e 6f  intf("(%d", p->o
23720 70 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d  p);.  }.  if( p-
23730 3e 70 4c 65 66 74 20 29 7b 0a 20 20 20 20 73 71  >pLeft ){.    sq
23740 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66  lite3DebugPrintf
23750 28 22 20 22 29 3b 0a 20 20 20 20 73 71 6c 69 74  (" ");.    sqlit
23760 65 33 50 72 69 6e 74 45 78 70 72 28 70 2d 3e 70  e3PrintExpr(p->p
23770 4c 65 66 74 29 3b 0a 20 20 7d 0a 20 20 69 66 28  Left);.  }.  if(
23780 20 70 2d 3e 70 52 69 67 68 74 20 29 7b 0a 20 20   p->pRight ){.  
23790 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72    sqlite3DebugPr
237a0 69 6e 74 66 28 22 20 22 29 3b 0a 20 20 20 20 73  intf(" ");.    s
237b0 71 6c 69 74 65 33 50 72 69 6e 74 45 78 70 72 28  qlite3PrintExpr(
237c0 70 2d 3e 70 52 69 67 68 74 29 3b 0a 20 20 7d 0a  p->pRight);.  }.
237d0 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72    sqlite3DebugPr
237e0 69 6e 74 66 28 22 29 22 29 3b 0a 7d 0a 76 6f 69  intf(")");.}.voi
237f0 64 20 73 71 6c 69 74 65 33 50 72 69 6e 74 45 78  d sqlite3PrintEx
23800 70 72 4c 69 73 74 28 45 78 70 72 4c 69 73 74 20  prList(ExprList 
23810 2a 70 4c 69 73 74 29 7b 0a 20 20 69 6e 74 20 69  *pList){.  int i
23820 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70  ;.  for(i=0; i<p
23830 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b  List->nExpr; i++
23840 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 50 72  ){.    sqlite3Pr
23850 69 6e 74 45 78 70 72 28 70 4c 69 73 74 2d 3e 61  intExpr(pList->a
23860 5b 69 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20 20  [i].pExpr);.    
23870 69 66 28 20 69 3c 70 4c 69 73 74 2d 3e 6e 45 78  if( i<pList->nEx
23880 70 72 2d 31 20 29 7b 0a 20 20 20 20 20 20 73 71  pr-1 ){.      sq
23890 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66  lite3DebugPrintf
238a0 28 22 2c 20 22 29 3b 0a 20 20 20 20 7d 0a 20 20  (", ");.    }.  
238b0 7d 0a 7d 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  }.}.void sqlite3
238c0 50 72 69 6e 74 53 65 6c 65 63 74 28 53 65 6c 65  PrintSelect(Sele
238d0 63 74 20 2a 70 2c 20 69 6e 74 20 69 6e 64 65 6e  ct *p, int inden
238e0 74 29 7b 0a 20 20 73 71 6c 69 74 65 33 44 65 62  t){.  sqlite3Deb
238f0 75 67 50 72 69 6e 74 66 28 22 25 2a 73 53 45 4c  ugPrintf("%*sSEL
23900 45 43 54 28 25 70 29 20 22 2c 20 69 6e 64 65 6e  ECT(%p) ", inden
23910 74 2c 20 22 22 2c 20 70 29 3b 0a 20 20 73 71 6c  t, "", p);.  sql
23920 69 74 65 33 50 72 69 6e 74 45 78 70 72 4c 69 73  ite3PrintExprLis
23930 74 28 70 2d 3e 70 45 4c 69 73 74 29 3b 0a 20 20  t(p->pEList);.  
23940 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e  sqlite3DebugPrin
23950 74 66 28 22 5c 6e 22 29 3b 0a 20 20 69 66 28 20  tf("\n");.  if( 
23960 70 2d 3e 70 53 72 63 20 29 7b 0a 20 20 20 20 63  p->pSrc ){.    c
23970 68 61 72 20 2a 7a 50 72 65 66 69 78 3b 0a 20 20  har *zPrefix;.  
23980 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 7a 50 72    int i;.    zPr
23990 65 66 69 78 20 3d 20 22 46 52 4f 4d 22 3b 0a 20  efix = "FROM";. 
239a0 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d     for(i=0; i<p-
239b0 3e 70 53 72 63 2d 3e 6e 53 72 63 3b 20 69 2b 2b  >pSrc->nSrc; i++
239c0 29 7b 0a 20 20 20 20 20 20 73 74 72 75 63 74 20  ){.      struct 
239d0 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49  SrcList_item *pI
239e0 74 65 6d 20 3d 20 26 70 2d 3e 70 53 72 63 2d 3e  tem = &p->pSrc->
239f0 61 5b 69 5d 3b 0a 20 20 20 20 20 20 73 71 6c 69  a[i];.      sqli
23a00 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22  te3DebugPrintf("
23a10 25 2a 73 20 22 2c 20 69 6e 64 65 6e 74 2b 36 2c  %*s ", indent+6,
23a20 20 7a 50 72 65 66 69 78 29 3b 0a 20 20 20 20 20   zPrefix);.     
23a30 20 7a 50 72 65 66 69 78 20 3d 20 22 22 3b 0a 20   zPrefix = "";. 
23a40 20 20 20 20 20 69 66 28 20 70 49 74 65 6d 2d 3e       if( pItem->
23a50 70 53 65 6c 65 63 74 20 29 7b 0a 20 20 20 20 20  pSelect ){.     
23a60 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50     sqlite3DebugP
23a70 72 69 6e 74 66 28 22 28 5c 6e 22 29 3b 0a 20 20  rintf("(\n");.  
23a80 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 72 69        sqlite3Pri
23a90 6e 74 53 65 6c 65 63 74 28 70 49 74 65 6d 2d 3e  ntSelect(pItem->
23aa0 70 53 65 6c 65 63 74 2c 20 69 6e 64 65 6e 74 2b  pSelect, indent+
23ab0 31 30 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  10);.        sql
23ac0 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28  ite3DebugPrintf(
23ad0 22 25 2a 73 29 22 2c 20 69 6e 64 65 6e 74 2b 38  "%*s)", indent+8
23ae0 2c 20 22 22 29 3b 0a 20 20 20 20 20 20 7d 65 6c  , "");.      }el
23af0 73 65 20 69 66 28 20 70 49 74 65 6d 2d 3e 7a 4e  se if( pItem->zN
23b00 61 6d 65 20 29 7b 0a 20 20 20 20 20 20 20 20 73  ame ){.        s
23b10 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74  qlite3DebugPrint
23b20 66 28 22 25 73 22 2c 20 70 49 74 65 6d 2d 3e 7a  f("%s", pItem->z
23b30 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20  Name);.      }. 
23b40 20 20 20 20 20 69 66 28 20 70 49 74 65 6d 2d 3e       if( pItem->
23b50 70 54 61 62 20 29 7b 0a 20 20 20 20 20 20 20 20  pTab ){.        
23b60 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e  sqlite3DebugPrin
23b70 74 66 28 22 28 74 61 62 6c 65 3a 20 25 73 29 22  tf("(table: %s)"
23b80 2c 20 70 49 74 65 6d 2d 3e 70 54 61 62 2d 3e 7a  , pItem->pTab->z
23b90 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20  Name);.      }. 
23ba0 20 20 20 20 20 69 66 28 20 70 49 74 65 6d 2d 3e       if( pItem->
23bb0 7a 41 6c 69 61 73 20 29 7b 0a 20 20 20 20 20 20  zAlias ){.      
23bc0 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72    sqlite3DebugPr
23bd0 69 6e 74 66 28 22 20 41 53 20 25 73 22 2c 20 70  intf(" AS %s", p
23be0 49 74 65 6d 2d 3e 7a 41 6c 69 61 73 29 3b 0a 20  Item->zAlias);. 
23bf0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
23c00 20 69 3c 70 2d 3e 70 53 72 63 2d 3e 6e 53 72 63   i<p->pSrc->nSrc
23c10 2d 31 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  -1 ){.        sq
23c20 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66  lite3DebugPrintf
23c30 28 22 2c 22 29 3b 0a 20 20 20 20 20 20 7d 0a 20  (",");.      }. 
23c40 20 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75       sqlite3Debu
23c50 67 50 72 69 6e 74 66 28 22 5c 6e 22 29 3b 0a 20  gPrintf("\n");. 
23c60 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 70     }.  }.  if( p
23c70 2d 3e 70 57 68 65 72 65 20 29 7b 0a 20 20 20 20  ->pWhere ){.    
23c80 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e  sqlite3DebugPrin
23c90 74 66 28 22 25 2a 73 20 57 48 45 52 45 20 22 2c  tf("%*s WHERE ",
23ca0 20 69 6e 64 65 6e 74 2c 20 22 22 29 3b 0a 20 20   indent, "");.  
23cb0 20 20 73 71 6c 69 74 65 33 50 72 69 6e 74 45 78    sqlite3PrintEx
23cc0 70 72 28 70 2d 3e 70 57 68 65 72 65 29 3b 0a 20  pr(p->pWhere);. 
23cd0 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50     sqlite3DebugP
23ce0 72 69 6e 74 66 28 22 5c 6e 22 29 3b 0a 20 20 7d  rintf("\n");.  }
23cf0 0a 20 20 69 66 28 20 70 2d 3e 70 47 72 6f 75 70  .  if( p->pGroup
23d00 42 79 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  By ){.    sqlite
23d10 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 25 2a  3DebugPrintf("%*
23d20 73 20 47 52 4f 55 50 20 42 59 20 22 2c 20 69 6e  s GROUP BY ", in
23d30 64 65 6e 74 2c 20 22 22 29 3b 0a 20 20 20 20 73  dent, "");.    s
23d40 71 6c 69 74 65 33 50 72 69 6e 74 45 78 70 72 4c  qlite3PrintExprL
23d50 69 73 74 28 70 2d 3e 70 47 72 6f 75 70 42 79 29  ist(p->pGroupBy)
23d60 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 65 62  ;.    sqlite3Deb
23d70 75 67 50 72 69 6e 74 66 28 22 5c 6e 22 29 3b 0a  ugPrintf("\n");.
23d80 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e 70 48 61    }.  if( p->pHa
23d90 76 69 6e 67 20 29 7b 0a 20 20 20 20 73 71 6c 69  ving ){.    sqli
23da0 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22  te3DebugPrintf("
23db0 25 2a 73 20 48 41 56 49 4e 47 20 22 2c 20 69 6e  %*s HAVING ", in
23dc0 64 65 6e 74 2c 20 22 22 29 3b 0a 20 20 20 20 73  dent, "");.    s
23dd0 71 6c 69 74 65 33 50 72 69 6e 74 45 78 70 72 28  qlite3PrintExpr(
23de0 70 2d 3e 70 48 61 76 69 6e 67 29 3b 0a 20 20 20  p->pHaving);.   
23df0 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69   sqlite3DebugPri
23e00 6e 74 66 28 22 5c 6e 22 29 3b 0a 20 20 7d 0a 20  ntf("\n");.  }. 
23e10 20 69 66 28 20 70 2d 3e 70 4f 72 64 65 72 42 79   if( p->pOrderBy
23e20 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 44   ){.    sqlite3D
23e30 65 62 75 67 50 72 69 6e 74 66 28 22 25 2a 73 20  ebugPrintf("%*s 
23e40 4f 52 44 45 52 20 42 59 20 22 2c 20 69 6e 64 65  ORDER BY ", inde
23e50 6e 74 2c 20 22 22 29 3b 0a 20 20 20 20 73 71 6c  nt, "");.    sql
23e60 69 74 65 33 50 72 69 6e 74 45 78 70 72 4c 69 73  ite3PrintExprLis
23e70 74 28 70 2d 3e 70 4f 72 64 65 72 42 79 29 3b 0a  t(p->pOrderBy);.
23e80 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67      sqlite3Debug
23e90 50 72 69 6e 74 66 28 22 5c 6e 22 29 3b 0a 20 20  Printf("\n");.  
23ea0 7d 0a 7d 0a 2f 2a 20 45 6e 64 20 6f 66 20 74 68  }.}./* End of th
23eb0 65 20 73 74 72 75 63 74 75 72 65 20 64 65 62 75  e structure debu
23ec0 67 20 70 72 69 6e 74 69 6e 67 20 63 6f 64 65 0a  g printing code.
23ed0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
23ee0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
23ef0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
23f00 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
23f10 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 23  *************/.#
23f20 65 6e 64 69 66 20 2f 2a 20 64 65 66 69 6e 65 64  endif /* defined
23f30 28 53 51 4c 49 54 45 5f 54 45 53 54 29 20 7c 7c  (SQLITE_TEST) ||
23f40 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f   defined(SQLITE_
23f50 44 45 42 55 47 29 20 2a 2f 0a                    DEBUG) */.