/ Hex Artifact Content
Login

Artifact 5b5197016a0b751fdb78758370ba127175d3f786:


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 32 31  select.c,v 1.421
0200: 20 32 30 30 38 2f 30 33 2f 32 36 20 31 32 3a 35   2008/03/26 12:5
0210: 30 3a 31 35 20 64 72 68 20 45 78 70 20 24 0a 2a  0:15 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 69 4c  fset;.  pNew->iL
0a40: 69 6d 69 74 20 3d 20 2d 31 3b 0a 20 20 70 4e 65  imit = -1;.  pNe
0a50: 77 2d 3e 69 4f 66 66 73 65 74 20 3d 20 2d 31 3b  w->iOffset = -1;
0a60: 0a 20 20 70 4e 65 77 2d 3e 61 64 64 72 4f 70 65  .  pNew->addrOpe
0a70: 6e 45 70 68 6d 5b 30 5d 20 3d 20 2d 31 3b 0a 20  nEphm[0] = -1;. 
0a80: 20 70 4e 65 77 2d 3e 61 64 64 72 4f 70 65 6e 45   pNew->addrOpenE
0a90: 70 68 6d 5b 31 5d 20 3d 20 2d 31 3b 0a 20 20 70  phm[1] = -1;.  p
0aa0: 4e 65 77 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68  New->addrOpenEph
0ab0: 6d 5b 32 5d 20 3d 20 2d 31 3b 0a 20 20 69 66 28  m[2] = -1;.  if(
0ac0: 20 70 4e 65 77 3d 3d 26 73 74 61 6e 64 69 6e 29   pNew==&standin)
0ad0: 20 7b 0a 20 20 20 20 63 6c 65 61 72 53 65 6c 65   {.    clearSele
0ae0: 63 74 28 70 4e 65 77 29 3b 0a 20 20 20 20 70 4e  ct(pNew);.    pN
0af0: 65 77 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65  ew = 0;.  }.  re
0b00: 74 75 72 6e 20 70 4e 65 77 3b 0a 7d 0a 0a 2f 2a  turn pNew;.}../*
0b10: 0a 2a 2a 20 44 65 6c 65 74 65 20 74 68 65 20 67  .** Delete the g
0b20: 69 76 65 6e 20 53 65 6c 65 63 74 20 73 74 72 75  iven Select stru
0b30: 63 74 75 72 65 20 61 6e 64 20 61 6c 6c 20 6f 66  cture and all of
0b40: 20 69 74 73 20 73 75 62 73 74 72 75 63 74 75 72   its substructur
0b50: 65 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  es..*/.void sqli
0b60: 74 65 33 53 65 6c 65 63 74 44 65 6c 65 74 65 28  te3SelectDelete(
0b70: 53 65 6c 65 63 74 20 2a 70 29 7b 0a 20 20 69 66  Select *p){.  if
0b80: 28 20 70 20 29 7b 0a 20 20 20 20 63 6c 65 61 72  ( p ){.    clear
0b90: 53 65 6c 65 63 74 28 70 29 3b 0a 20 20 20 20 73  Select(p);.    s
0ba0: 71 6c 69 74 65 33 5f 66 72 65 65 28 70 29 3b 0a  qlite3_free(p);.
0bb0: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69 76    }.}../*.** Giv
0bc0: 65 6e 20 31 20 74 6f 20 33 20 69 64 65 6e 74 69  en 1 to 3 identi
0bd0: 66 69 65 72 73 20 70 72 65 63 65 65 64 69 6e 67  fiers preceeding
0be0: 20 74 68 65 20 4a 4f 49 4e 20 6b 65 79 77 6f 72   the JOIN keywor
0bf0: 64 2c 20 64 65 74 65 72 6d 69 6e 65 20 74 68 65  d, determine the
0c00: 0a 2a 2a 20 74 79 70 65 20 6f 66 20 6a 6f 69 6e  .** type of join
0c10: 2e 20 20 52 65 74 75 72 6e 20 61 6e 20 69 6e 74  .  Return an int
0c20: 65 67 65 72 20 63 6f 6e 73 74 61 6e 74 20 74 68  eger constant th
0c30: 61 74 20 65 78 70 72 65 73 73 65 73 20 74 68 61  at expresses tha
0c40: 74 20 74 79 70 65 0a 2a 2a 20 69 6e 20 74 65 72  t type.** in ter
0c50: 6d 73 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77  ms of the follow
0c60: 69 6e 67 20 62 69 74 20 76 61 6c 75 65 73 3a 0a  ing bit values:.
0c70: 2a 2a 0a 2a 2a 20 20 20 20 20 4a 54 5f 49 4e 4e  **.**     JT_INN
0c80: 45 52 0a 2a 2a 20 20 20 20 20 4a 54 5f 43 52 4f  ER.**     JT_CRO
0c90: 53 53 0a 2a 2a 20 20 20 20 20 4a 54 5f 4f 55 54  SS.**     JT_OUT
0ca0: 45 52 0a 2a 2a 20 20 20 20 20 4a 54 5f 4e 41 54  ER.**     JT_NAT
0cb0: 55 52 41 4c 0a 2a 2a 20 20 20 20 20 4a 54 5f 4c  URAL.**     JT_L
0cc0: 45 46 54 0a 2a 2a 20 20 20 20 20 4a 54 5f 52 49  EFT.**     JT_RI
0cd0: 47 48 54 0a 2a 2a 0a 2a 2a 20 41 20 66 75 6c 6c  GHT.**.** A full
0ce0: 20 6f 75 74 65 72 20 6a 6f 69 6e 20 69 73 20 74   outer join is t
0cf0: 68 65 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 20 6f  he combination o
0d00: 66 20 4a 54 5f 4c 45 46 54 20 61 6e 64 20 4a 54  f JT_LEFT and JT
0d10: 5f 52 49 47 48 54 2e 0a 2a 2a 0a 2a 2a 20 49 66  _RIGHT..**.** If
0d20: 20 61 6e 20 69 6c 6c 65 67 61 6c 20 6f 72 20 75   an illegal or u
0d30: 6e 73 75 70 70 6f 72 74 65 64 20 6a 6f 69 6e 20  nsupported join 
0d40: 74 79 70 65 20 69 73 20 73 65 65 6e 2c 20 74 68  type is seen, th
0d50: 65 6e 20 73 74 69 6c 6c 20 72 65 74 75 72 6e 0a  en still return.
0d60: 2a 2a 20 61 20 6a 6f 69 6e 20 74 79 70 65 2c 20  ** a join type, 
0d70: 62 75 74 20 70 75 74 20 61 6e 20 65 72 72 6f 72  but put an error
0d80: 20 69 6e 20 74 68 65 20 70 50 61 72 73 65 20 73   in the pParse s
0d90: 74 72 75 63 74 75 72 65 2e 0a 2a 2f 0a 69 6e 74  tructure..*/.int
0da0: 20 73 71 6c 69 74 65 33 4a 6f 69 6e 54 79 70 65   sqlite3JoinType
0db0: 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
0dc0: 54 6f 6b 65 6e 20 2a 70 41 2c 20 54 6f 6b 65 6e  Token *pA, Token
0dd0: 20 2a 70 42 2c 20 54 6f 6b 65 6e 20 2a 70 43 29   *pB, Token *pC)
0de0: 7b 0a 20 20 69 6e 74 20 6a 6f 69 6e 74 79 70 65  {.  int jointype
0df0: 20 3d 20 30 3b 0a 20 20 54 6f 6b 65 6e 20 2a 61   = 0;.  Token *a
0e00: 70 41 6c 6c 5b 33 5d 3b 0a 20 20 54 6f 6b 65 6e  pAll[3];.  Token
0e10: 20 2a 70 3b 0a 20 20 73 74 61 74 69 63 20 63 6f   *p;.  static co
0e20: 6e 73 74 20 73 74 72 75 63 74 20 7b 0a 20 20 20  nst struct {.   
0e30: 20 63 6f 6e 73 74 20 63 68 61 72 20 7a 4b 65 79   const char zKey
0e40: 77 6f 72 64 5b 38 5d 3b 0a 20 20 20 20 75 38 20  word[8];.    u8 
0e50: 6e 43 68 61 72 3b 0a 20 20 20 20 75 38 20 63 6f  nChar;.    u8 co
0e60: 64 65 3b 0a 20 20 7d 20 6b 65 79 77 6f 72 64 73  de;.  } keywords
0e70: 5b 5d 20 3d 20 7b 0a 20 20 20 20 7b 20 22 6e 61  [] = {.    { "na
0e80: 74 75 72 61 6c 22 2c 20 37 2c 20 4a 54 5f 4e 41  tural", 7, JT_NA
0e90: 54 55 52 41 4c 20 7d 2c 0a 20 20 20 20 7b 20 22  TURAL },.    { "
0ea0: 6c 65 66 74 22 2c 20 20 20 20 34 2c 20 4a 54 5f  left",    4, JT_
0eb0: 4c 45 46 54 7c 4a 54 5f 4f 55 54 45 52 20 7d 2c  LEFT|JT_OUTER },
0ec0: 0a 20 20 20 20 7b 20 22 72 69 67 68 74 22 2c 20  .    { "right", 
0ed0: 20 20 35 2c 20 4a 54 5f 52 49 47 48 54 7c 4a 54    5, JT_RIGHT|JT
0ee0: 5f 4f 55 54 45 52 20 7d 2c 0a 20 20 20 20 7b 20  _OUTER },.    { 
0ef0: 22 66 75 6c 6c 22 2c 20 20 20 20 34 2c 20 4a 54  "full",    4, JT
0f00: 5f 4c 45 46 54 7c 4a 54 5f 52 49 47 48 54 7c 4a  _LEFT|JT_RIGHT|J
0f10: 54 5f 4f 55 54 45 52 20 7d 2c 0a 20 20 20 20 7b  T_OUTER },.    {
0f20: 20 22 6f 75 74 65 72 22 2c 20 20 20 35 2c 20 4a   "outer",   5, J
0f30: 54 5f 4f 55 54 45 52 20 7d 2c 0a 20 20 20 20 7b  T_OUTER },.    {
0f40: 20 22 69 6e 6e 65 72 22 2c 20 20 20 35 2c 20 4a   "inner",   5, J
0f50: 54 5f 49 4e 4e 45 52 20 7d 2c 0a 20 20 20 20 7b  T_INNER },.    {
0f60: 20 22 63 72 6f 73 73 22 2c 20 20 20 35 2c 20 4a   "cross",   5, J
0f70: 54 5f 49 4e 4e 45 52 7c 4a 54 5f 43 52 4f 53 53  T_INNER|JT_CROSS
0f80: 20 7d 2c 0a 20 20 7d 3b 0a 20 20 69 6e 74 20 69   },.  };.  int i
0f90: 2c 20 6a 3b 0a 20 20 61 70 41 6c 6c 5b 30 5d 20  , j;.  apAll[0] 
0fa0: 3d 20 70 41 3b 0a 20 20 61 70 41 6c 6c 5b 31 5d  = pA;.  apAll[1]
0fb0: 20 3d 20 70 42 3b 0a 20 20 61 70 41 6c 6c 5b 32   = pB;.  apAll[2
0fc0: 5d 20 3d 20 70 43 3b 0a 20 20 66 6f 72 28 69 3d  ] = pC;.  for(i=
0fd0: 30 3b 20 69 3c 33 20 26 26 20 61 70 41 6c 6c 5b  0; i<3 && apAll[
0fe0: 69 5d 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 70 20  i]; i++){.    p 
0ff0: 3d 20 61 70 41 6c 6c 5b 69 5d 3b 0a 20 20 20 20  = apAll[i];.    
1000: 66 6f 72 28 6a 3d 30 3b 20 6a 3c 73 69 7a 65 6f  for(j=0; j<sizeo
1010: 66 28 6b 65 79 77 6f 72 64 73 29 2f 73 69 7a 65  f(keywords)/size
1020: 6f 66 28 6b 65 79 77 6f 72 64 73 5b 30 5d 29 3b  of(keywords[0]);
1030: 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28   j++){.      if(
1040: 20 70 2d 3e 6e 3d 3d 6b 65 79 77 6f 72 64 73 5b   p->n==keywords[
1050: 6a 5d 2e 6e 43 68 61 72 20 0a 20 20 20 20 20 20  j].nChar .      
1060: 20 20 20 20 26 26 20 73 71 6c 69 74 65 33 53 74      && sqlite3St
1070: 72 4e 49 43 6d 70 28 28 63 68 61 72 2a 29 70 2d  rNICmp((char*)p-
1080: 3e 7a 2c 20 6b 65 79 77 6f 72 64 73 5b 6a 5d 2e  >z, keywords[j].
1090: 7a 4b 65 79 77 6f 72 64 2c 20 70 2d 3e 6e 29 3d  zKeyword, p->n)=
10a0: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 6a 6f  =0 ){.        jo
10b0: 69 6e 74 79 70 65 20 7c 3d 20 6b 65 79 77 6f 72  intype |= keywor
10c0: 64 73 5b 6a 5d 2e 63 6f 64 65 3b 0a 20 20 20 20  ds[j].code;.    
10d0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
10e0: 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28   }.    }.    if(
10f0: 20 6a 3e 3d 73 69 7a 65 6f 66 28 6b 65 79 77 6f   j>=sizeof(keywo
1100: 72 64 73 29 2f 73 69 7a 65 6f 66 28 6b 65 79 77  rds)/sizeof(keyw
1110: 6f 72 64 73 5b 30 5d 29 20 29 7b 0a 20 20 20 20  ords[0]) ){.    
1120: 20 20 6a 6f 69 6e 74 79 70 65 20 7c 3d 20 4a 54    jointype |= JT
1130: 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 62 72  _ERROR;.      br
1140: 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  eak;.    }.  }. 
1150: 20 69 66 28 0a 20 20 20 20 20 28 6a 6f 69 6e 74   if(.     (joint
1160: 79 70 65 20 26 20 28 4a 54 5f 49 4e 4e 45 52 7c  ype & (JT_INNER|
1170: 4a 54 5f 4f 55 54 45 52 29 29 3d 3d 28 4a 54 5f  JT_OUTER))==(JT_
1180: 49 4e 4e 45 52 7c 4a 54 5f 4f 55 54 45 52 29 20  INNER|JT_OUTER) 
1190: 7c 7c 0a 20 20 20 20 20 28 6a 6f 69 6e 74 79 70  ||.     (jointyp
11a0: 65 20 26 20 4a 54 5f 45 52 52 4f 52 29 21 3d 30  e & JT_ERROR)!=0
11b0: 0a 20 20 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20  .  ){.    const 
11c0: 63 68 61 72 20 2a 7a 53 70 31 20 3d 20 22 20 22  char *zSp1 = " "
11d0: 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72  ;.    const char
11e0: 20 2a 7a 53 70 32 20 3d 20 22 20 22 3b 0a 20 20   *zSp2 = " ";.  
11f0: 20 20 69 66 28 20 70 42 3d 3d 30 20 29 7b 20 7a    if( pB==0 ){ z
1200: 53 70 31 2b 2b 3b 20 7d 0a 20 20 20 20 69 66 28  Sp1++; }.    if(
1210: 20 70 43 3d 3d 30 20 29 7b 20 7a 53 70 32 2b 2b   pC==0 ){ zSp2++
1220: 3b 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 45  ; }.    sqlite3E
1230: 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
1240: 22 75 6e 6b 6e 6f 77 6e 20 6f 72 20 75 6e 73 75  "unknown or unsu
1250: 70 70 6f 72 74 65 64 20 6a 6f 69 6e 20 74 79 70  pported join typ
1260: 65 3a 20 22 0a 20 20 20 20 20 20 20 22 25 54 25  e: ".       "%T%
1270: 73 25 54 25 73 25 54 22 2c 20 70 41 2c 20 7a 53  s%T%s%T", pA, zS
1280: 70 31 2c 20 70 42 2c 20 7a 53 70 32 2c 20 70 43  p1, pB, zSp2, pC
1290: 29 3b 0a 20 20 20 20 6a 6f 69 6e 74 79 70 65 20  );.    jointype 
12a0: 3d 20 4a 54 5f 49 4e 4e 45 52 3b 0a 20 20 7d 65  = JT_INNER;.  }e
12b0: 6c 73 65 20 69 66 28 20 6a 6f 69 6e 74 79 70 65  lse if( jointype
12c0: 20 26 20 4a 54 5f 52 49 47 48 54 20 29 7b 0a 20   & JT_RIGHT ){. 
12d0: 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
12e0: 73 67 28 70 50 61 72 73 65 2c 20 0a 20 20 20 20  sg(pParse, .    
12f0: 20 20 22 52 49 47 48 54 20 61 6e 64 20 46 55 4c    "RIGHT and FUL
1300: 4c 20 4f 55 54 45 52 20 4a 4f 49 4e 73 20 61 72  L OUTER JOINs ar
1310: 65 20 6e 6f 74 20 63 75 72 72 65 6e 74 6c 79 20  e not currently 
1320: 73 75 70 70 6f 72 74 65 64 22 29 3b 0a 20 20 20  supported");.   
1330: 20 6a 6f 69 6e 74 79 70 65 20 3d 20 4a 54 5f 49   jointype = JT_I
1340: 4e 4e 45 52 3b 0a 20 20 7d 0a 20 20 72 65 74 75  NNER;.  }.  retu
1350: 72 6e 20 6a 6f 69 6e 74 79 70 65 3b 0a 7d 0a 0a  rn jointype;.}..
1360: 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  /*.** Return the
1370: 20 69 6e 64 65 78 20 6f 66 20 61 20 63 6f 6c 75   index of a colu
1380: 6d 6e 20 69 6e 20 61 20 74 61 62 6c 65 2e 20 20  mn in a table.  
1390: 52 65 74 75 72 6e 20 2d 31 20 69 66 20 74 68 65  Return -1 if the
13a0: 20 63 6f 6c 75 6d 6e 0a 2a 2a 20 69 73 20 6e 6f   column.** is no
13b0: 74 20 63 6f 6e 74 61 69 6e 65 64 20 69 6e 20 74  t contained in t
13c0: 68 65 20 74 61 62 6c 65 2e 0a 2a 2f 0a 73 74 61  he table..*/.sta
13d0: 74 69 63 20 69 6e 74 20 63 6f 6c 75 6d 6e 49 6e  tic int columnIn
13e0: 64 65 78 28 54 61 62 6c 65 20 2a 70 54 61 62 2c  dex(Table *pTab,
13f0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43 6f   const char *zCo
1400: 6c 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66  l){.  int i;.  f
1410: 6f 72 28 69 3d 30 3b 20 69 3c 70 54 61 62 2d 3e  or(i=0; i<pTab->
1420: 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  nCol; i++){.    
1430: 69 66 28 20 73 71 6c 69 74 65 33 53 74 72 49 43  if( sqlite3StrIC
1440: 6d 70 28 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 5d  mp(pTab->aCol[i]
1450: 2e 7a 4e 61 6d 65 2c 20 7a 43 6f 6c 29 3d 3d 30  .zName, zCol)==0
1460: 20 29 20 72 65 74 75 72 6e 20 69 3b 0a 20 20 7d   ) return i;.  }
1470: 0a 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a 7d 0a  .  return -1;.}.
1480: 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 76  ./*.** Set the v
1490: 61 6c 75 65 20 6f 66 20 61 20 74 6f 6b 65 6e 20  alue of a token 
14a0: 74 6f 20 61 20 27 5c 30 30 30 27 2d 74 65 72 6d  to a '\000'-term
14b0: 69 6e 61 74 65 64 20 73 74 72 69 6e 67 2e 0a 2a  inated string..*
14c0: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 65  /.static void se
14d0: 74 54 6f 6b 65 6e 28 54 6f 6b 65 6e 20 2a 70 2c  tToken(Token *p,
14e0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 29 7b   const char *z){
14f0: 0a 20 20 70 2d 3e 7a 20 3d 20 28 75 38 2a 29 7a  .  p->z = (u8*)z
1500: 3b 0a 20 20 70 2d 3e 6e 20 3d 20 7a 20 3f 20 73  ;.  p->n = z ? s
1510: 74 72 6c 65 6e 28 7a 29 20 3a 20 30 3b 0a 20 20  trlen(z) : 0;.  
1520: 70 2d 3e 64 79 6e 20 3d 20 30 3b 0a 7d 0a 0a 2f  p->dyn = 0;.}../
1530: 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 74 6f 6b  *.** Set the tok
1540: 65 6e 20 74 6f 20 74 68 65 20 64 6f 75 62 6c 65  en to the double
1550: 2d 71 75 6f 74 65 64 20 61 6e 64 20 65 73 63 61  -quoted and esca
1560: 70 65 64 20 76 65 72 73 69 6f 6e 20 6f 66 20 74  ped version of t
1570: 68 65 20 73 74 72 69 6e 67 20 70 6f 69 6e 74 65  he string pointe
1580: 64 0a 2a 2a 20 74 6f 20 62 79 20 7a 2e 20 46 6f  d.** to by z. Fo
1590: 72 20 65 78 61 6d 70 6c 65 3b 0a 2a 2a 0a 2a 2a  r example;.**.**
15a0: 20 20 20 20 7b 61 22 62 63 7d 20 20 2d 3e 20 20      {a"bc}  ->  
15b0: 7b 22 61 22 22 62 63 22 7d 0a 2a 2f 0a 73 74 61  {"a""bc"}.*/.sta
15c0: 74 69 63 20 76 6f 69 64 20 73 65 74 51 75 6f 74  tic void setQuot
15d0: 65 64 54 6f 6b 65 6e 28 50 61 72 73 65 20 2a 70  edToken(Parse *p
15e0: 50 61 72 73 65 2c 20 54 6f 6b 65 6e 20 2a 70 2c  Parse, Token *p,
15f0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 29 7b   const char *z){
1600: 0a 20 20 70 2d 3e 7a 20 3d 20 28 75 38 20 2a 29  .  p->z = (u8 *)
1610: 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 30  sqlite3MPrintf(0
1620: 2c 20 22 5c 22 25 77 5c 22 22 2c 20 7a 29 3b 0a  , "\"%w\"", z);.
1630: 20 20 70 2d 3e 64 79 6e 20 3d 20 31 3b 0a 20 20    p->dyn = 1;.  
1640: 69 66 28 20 70 2d 3e 7a 20 29 7b 0a 20 20 20 20  if( p->z ){.    
1650: 70 2d 3e 6e 20 3d 20 73 74 72 6c 65 6e 28 28 63  p->n = strlen((c
1660: 68 61 72 20 2a 29 70 2d 3e 7a 29 3b 0a 20 20 7d  har *)p->z);.  }
1670: 65 6c 73 65 7b 0a 20 20 20 20 70 50 61 72 73 65  else{.    pParse
1680: 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ->db->mallocFail
1690: 65 64 20 3d 20 31 3b 0a 20 20 7d 0a 7d 0a 0a 2f  ed = 1;.  }.}../
16a0: 2a 0a 2a 2a 20 43 72 65 61 74 65 20 61 6e 20 65  *.** Create an e
16b0: 78 70 72 65 73 73 69 6f 6e 20 6e 6f 64 65 20 66  xpression node f
16c0: 6f 72 20 61 6e 20 69 64 65 6e 74 69 66 69 65 72  or an identifier
16d0: 20 77 69 74 68 20 74 68 65 20 6e 61 6d 65 20 6f   with the name o
16e0: 66 20 7a 4e 61 6d 65 0a 2a 2f 0a 45 78 70 72 20  f zName.*/.Expr 
16f0: 2a 73 71 6c 69 74 65 33 43 72 65 61 74 65 49 64  *sqlite3CreateId
1700: 45 78 70 72 28 50 61 72 73 65 20 2a 70 50 61 72  Expr(Parse *pPar
1710: 73 65 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  se, const char *
1720: 7a 4e 61 6d 65 29 7b 0a 20 20 54 6f 6b 65 6e 20  zName){.  Token 
1730: 64 75 6d 6d 79 3b 0a 20 20 73 65 74 54 6f 6b 65  dummy;.  setToke
1740: 6e 28 26 64 75 6d 6d 79 2c 20 7a 4e 61 6d 65 29  n(&dummy, zName)
1750: 3b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74  ;.  return sqlit
1760: 65 33 50 45 78 70 72 28 70 50 61 72 73 65 2c 20  e3PExpr(pParse, 
1770: 54 4b 5f 49 44 2c 20 30 2c 20 30 2c 20 26 64 75  TK_ID, 0, 0, &du
1780: 6d 6d 79 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  mmy);.}.../*.** 
1790: 41 64 64 20 61 20 74 65 72 6d 20 74 6f 20 74 68  Add a term to th
17a0: 65 20 57 48 45 52 45 20 65 78 70 72 65 73 73 69  e WHERE expressi
17b0: 6f 6e 20 69 6e 20 2a 70 70 45 78 70 72 20 74 68  on in *ppExpr th
17c0: 61 74 20 72 65 71 75 69 72 65 73 20 74 68 65 0a  at requires the.
17d0: 2a 2a 20 7a 43 6f 6c 20 63 6f 6c 75 6d 6e 20 74  ** zCol column t
17e0: 6f 20 62 65 20 65 71 75 61 6c 20 69 6e 20 74 68  o be equal in th
17f0: 65 20 74 77 6f 20 74 61 62 6c 65 73 20 70 54 61  e two tables pTa
1800: 62 31 20 61 6e 64 20 70 54 61 62 32 2e 0a 2a 2f  b1 and pTab2..*/
1810: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 61 64 64  .static void add
1820: 57 68 65 72 65 54 65 72 6d 28 0a 20 20 50 61 72  WhereTerm(.  Par
1830: 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20  se *pParse,     
1840: 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67        /* Parsing
1850: 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 63 6f   context */.  co
1860: 6e 73 74 20 63 68 61 72 20 2a 7a 43 6f 6c 2c 20  nst char *zCol, 
1870: 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f         /* Name o
1880: 66 20 74 68 65 20 63 6f 6c 75 6d 6e 20 2a 2f 0a  f the column */.
1890: 20 20 63 6f 6e 73 74 20 54 61 62 6c 65 20 2a 70    const Table *p
18a0: 54 61 62 31 2c 20 20 20 20 20 20 2f 2a 20 46 69  Tab1,      /* Fi
18b0: 72 73 74 20 74 61 62 6c 65 20 2a 2f 0a 20 20 63  rst table */.  c
18c0: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 41 6c 69 61  onst char *zAlia
18d0: 73 31 2c 20 20 20 20 20 2f 2a 20 41 6c 69 61 73  s1,     /* Alias
18e0: 20 66 6f 72 20 66 69 72 73 74 20 74 61 62 6c 65   for first table
18f0: 2e 20 20 4d 61 79 20 62 65 20 4e 55 4c 4c 20 2a  .  May be NULL *
1900: 2f 0a 20 20 63 6f 6e 73 74 20 54 61 62 6c 65 20  /.  const Table 
1910: 2a 70 54 61 62 32 2c 20 20 20 20 20 20 2f 2a 20  *pTab2,      /* 
1920: 53 65 63 6f 6e 64 20 74 61 62 6c 65 20 2a 2f 0a  Second table */.
1930: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 41    const char *zA
1940: 6c 69 61 73 32 2c 20 20 20 20 20 2f 2a 20 41 6c  lias2,     /* Al
1950: 69 61 73 20 66 6f 72 20 73 65 63 6f 6e 64 20 74  ias for second t
1960: 61 62 6c 65 2e 20 20 4d 61 79 20 62 65 20 4e 55  able.  May be NU
1970: 4c 4c 20 2a 2f 0a 20 20 69 6e 74 20 69 52 69 67  LL */.  int iRig
1980: 68 74 4a 6f 69 6e 54 61 62 6c 65 2c 20 20 20 20  htJoinTable,    
1990: 20 2f 2a 20 56 44 42 45 20 63 75 72 73 6f 72 20   /* VDBE cursor 
19a0: 66 6f 72 20 74 68 65 20 72 69 67 68 74 20 74 61  for the right ta
19b0: 62 6c 65 20 2a 2f 0a 20 20 45 78 70 72 20 2a 2a  ble */.  Expr **
19c0: 70 70 45 78 70 72 2c 20 20 20 20 20 20 20 20 20  ppExpr,         
19d0: 20 20 2f 2a 20 41 64 64 20 74 68 65 20 65 71 75    /* Add the equ
19e0: 61 6c 69 74 79 20 74 65 72 6d 20 74 6f 20 74 68  ality term to th
19f0: 69 73 20 65 78 70 72 65 73 73 69 6f 6e 20 2a 2f  is expression */
1a00: 0a 20 20 69 6e 74 20 69 73 4f 75 74 65 72 4a 6f  .  int isOuterJo
1a10: 69 6e 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54  in          /* T
1a20: 72 75 65 20 69 66 20 64 65 61 6c 69 6e 67 20 77  rue if dealing w
1a30: 69 74 68 20 61 6e 20 4f 55 54 45 52 20 6a 6f 69  ith an OUTER joi
1a40: 6e 20 2a 2f 0a 29 7b 0a 20 20 45 78 70 72 20 2a  n */.){.  Expr *
1a50: 70 45 31 61 2c 20 2a 70 45 31 62 2c 20 2a 70 45  pE1a, *pE1b, *pE
1a60: 31 63 3b 0a 20 20 45 78 70 72 20 2a 70 45 32 61  1c;.  Expr *pE2a
1a70: 2c 20 2a 70 45 32 62 2c 20 2a 70 45 32 63 3b 0a  , *pE2b, *pE2c;.
1a80: 20 20 45 78 70 72 20 2a 70 45 3b 0a 0a 20 20 70    Expr *pE;..  p
1a90: 45 31 61 20 3d 20 73 71 6c 69 74 65 33 43 72 65  E1a = sqlite3Cre
1aa0: 61 74 65 49 64 45 78 70 72 28 70 50 61 72 73 65  ateIdExpr(pParse
1ab0: 2c 20 7a 43 6f 6c 29 3b 0a 20 20 70 45 32 61 20  , zCol);.  pE2a 
1ac0: 3d 20 73 71 6c 69 74 65 33 43 72 65 61 74 65 49  = sqlite3CreateI
1ad0: 64 45 78 70 72 28 70 50 61 72 73 65 2c 20 7a 43  dExpr(pParse, zC
1ae0: 6f 6c 29 3b 0a 20 20 69 66 28 20 7a 41 6c 69 61  ol);.  if( zAlia
1af0: 73 31 3d 3d 30 20 29 7b 0a 20 20 20 20 7a 41 6c  s1==0 ){.    zAl
1b00: 69 61 73 31 20 3d 20 70 54 61 62 31 2d 3e 7a 4e  ias1 = pTab1->zN
1b10: 61 6d 65 3b 0a 20 20 7d 0a 20 20 70 45 31 62 20  ame;.  }.  pE1b 
1b20: 3d 20 73 71 6c 69 74 65 33 43 72 65 61 74 65 49  = sqlite3CreateI
1b30: 64 45 78 70 72 28 70 50 61 72 73 65 2c 20 7a 41  dExpr(pParse, zA
1b40: 6c 69 61 73 31 29 3b 0a 20 20 69 66 28 20 7a 41  lias1);.  if( zA
1b50: 6c 69 61 73 32 3d 3d 30 20 29 7b 0a 20 20 20 20  lias2==0 ){.    
1b60: 7a 41 6c 69 61 73 32 20 3d 20 70 54 61 62 32 2d  zAlias2 = pTab2-
1b70: 3e 7a 4e 61 6d 65 3b 0a 20 20 7d 0a 20 20 70 45  >zName;.  }.  pE
1b80: 32 62 20 3d 20 73 71 6c 69 74 65 33 43 72 65 61  2b = sqlite3Crea
1b90: 74 65 49 64 45 78 70 72 28 70 50 61 72 73 65 2c  teIdExpr(pParse,
1ba0: 20 7a 41 6c 69 61 73 32 29 3b 0a 20 20 70 45 31   zAlias2);.  pE1
1bb0: 63 20 3d 20 73 71 6c 69 74 65 33 50 45 78 70 72  c = sqlite3PExpr
1bc0: 28 70 50 61 72 73 65 2c 20 54 4b 5f 44 4f 54 2c  (pParse, TK_DOT,
1bd0: 20 70 45 31 62 2c 20 70 45 31 61 2c 20 30 29 3b   pE1b, pE1a, 0);
1be0: 0a 20 20 70 45 32 63 20 3d 20 73 71 6c 69 74 65  .  pE2c = sqlite
1bf0: 33 50 45 78 70 72 28 70 50 61 72 73 65 2c 20 54  3PExpr(pParse, T
1c00: 4b 5f 44 4f 54 2c 20 70 45 32 62 2c 20 70 45 32  K_DOT, pE2b, pE2
1c10: 61 2c 20 30 29 3b 0a 20 20 70 45 20 3d 20 73 71  a, 0);.  pE = sq
1c20: 6c 69 74 65 33 50 45 78 70 72 28 70 50 61 72 73  lite3PExpr(pPars
1c30: 65 2c 20 54 4b 5f 45 51 2c 20 70 45 31 63 2c 20  e, TK_EQ, pE1c, 
1c40: 70 45 32 63 2c 20 30 29 3b 0a 20 20 69 66 28 20  pE2c, 0);.  if( 
1c50: 70 45 20 26 26 20 69 73 4f 75 74 65 72 4a 6f 69  pE && isOuterJoi
1c60: 6e 20 29 7b 0a 20 20 20 20 45 78 70 72 53 65 74  n ){.    ExprSet
1c70: 50 72 6f 70 65 72 74 79 28 70 45 2c 20 45 50 5f  Property(pE, EP_
1c80: 46 72 6f 6d 4a 6f 69 6e 29 3b 0a 20 20 20 20 70  FromJoin);.    p
1c90: 45 2d 3e 69 52 69 67 68 74 4a 6f 69 6e 54 61 62  E->iRightJoinTab
1ca0: 6c 65 20 3d 20 69 52 69 67 68 74 4a 6f 69 6e 54  le = iRightJoinT
1cb0: 61 62 6c 65 3b 0a 20 20 7d 0a 20 20 2a 70 70 45  able;.  }.  *ppE
1cc0: 78 70 72 20 3d 20 73 71 6c 69 74 65 33 45 78 70  xpr = sqlite3Exp
1cd0: 72 41 6e 64 28 70 50 61 72 73 65 2d 3e 64 62 2c  rAnd(pParse->db,
1ce0: 2a 70 70 45 78 70 72 2c 20 70 45 29 3b 0a 7d 0a  *ppExpr, pE);.}.
1cf0: 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 45  ./*.** Set the E
1d00: 50 5f 46 72 6f 6d 4a 6f 69 6e 20 70 72 6f 70 65  P_FromJoin prope
1d10: 72 74 79 20 6f 6e 20 61 6c 6c 20 74 65 72 6d 73  rty on all terms
1d20: 20 6f 66 20 74 68 65 20 67 69 76 65 6e 20 65 78   of the given ex
1d30: 70 72 65 73 73 69 6f 6e 2e 0a 2a 2a 20 41 6e 64  pression..** And
1d40: 20 73 65 74 20 74 68 65 20 45 78 70 72 2e 69 52   set the Expr.iR
1d50: 69 67 68 74 4a 6f 69 6e 54 61 62 6c 65 20 74 6f  ightJoinTable to
1d60: 20 69 54 61 62 6c 65 20 66 6f 72 20 65 76 65 72   iTable for ever
1d70: 79 20 74 65 72 6d 20 69 6e 20 74 68 65 0a 2a 2a  y term in the.**
1d80: 20 65 78 70 72 65 73 73 69 6f 6e 2e 0a 2a 2a 0a   expression..**.
1d90: 2a 2a 20 54 68 65 20 45 50 5f 46 72 6f 6d 4a 6f  ** The EP_FromJo
1da0: 69 6e 20 70 72 6f 70 65 72 74 79 20 69 73 20 75  in property is u
1db0: 73 65 64 20 6f 6e 20 74 65 72 6d 73 20 6f 66 20  sed on terms of 
1dc0: 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 74 6f  an expression to
1dd0: 20 74 65 6c 6c 0a 2a 2a 20 74 68 65 20 4c 45 46   tell.** the LEF
1de0: 54 20 4f 55 54 45 52 20 4a 4f 49 4e 20 70 72 6f  T OUTER JOIN pro
1df0: 63 65 73 73 69 6e 67 20 6c 6f 67 69 63 20 74 68  cessing logic th
1e00: 61 74 20 74 68 69 73 20 74 65 72 6d 20 69 73 20  at this term is 
1e10: 70 61 72 74 20 6f 66 20 74 68 65 0a 2a 2a 20 6a  part of the.** j
1e20: 6f 69 6e 20 72 65 73 74 72 69 63 74 69 6f 6e 20  oin restriction 
1e30: 73 70 65 63 69 66 69 65 64 20 69 6e 20 74 68 65  specified in the
1e40: 20 4f 4e 20 6f 72 20 55 53 49 4e 47 20 63 6c 61   ON or USING cla
1e50: 75 73 65 20 61 6e 64 20 6e 6f 74 20 61 20 70 61  use and not a pa
1e60: 72 74 0a 2a 2a 20 6f 66 20 74 68 65 20 6d 6f 72  rt.** of the mor
1e70: 65 20 67 65 6e 65 72 61 6c 20 57 48 45 52 45 20  e general WHERE 
1e80: 63 6c 61 75 73 65 2e 20 20 54 68 65 73 65 20 74  clause.  These t
1e90: 65 72 6d 73 20 61 72 65 20 6d 6f 76 65 64 20 6f  erms are moved o
1ea0: 76 65 72 20 74 6f 20 74 68 65 0a 2a 2a 20 57 48  ver to the.** WH
1eb0: 45 52 45 20 63 6c 61 75 73 65 20 64 75 72 69 6e  ERE clause durin
1ec0: 67 20 6a 6f 69 6e 20 70 72 6f 63 65 73 73 69 6e  g join processin
1ed0: 67 20 62 75 74 20 77 65 20 6e 65 65 64 20 74 6f  g but we need to
1ee0: 20 72 65 6d 65 6d 62 65 72 20 74 68 61 74 20 74   remember that t
1ef0: 68 65 79 0a 2a 2a 20 6f 72 69 67 69 6e 61 74 65  hey.** originate
1f00: 64 20 69 6e 20 74 68 65 20 4f 4e 20 6f 72 20 55  d in the ON or U
1f10: 53 49 4e 47 20 63 6c 61 75 73 65 2e 0a 2a 2a 0a  SING clause..**.
1f20: 2a 2a 20 54 68 65 20 45 78 70 72 2e 69 52 69 67  ** The Expr.iRig
1f30: 68 74 4a 6f 69 6e 54 61 62 6c 65 20 74 65 6c 6c  htJoinTable tell
1f40: 73 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75  s the WHERE clau
1f50: 73 65 20 70 72 6f 63 65 73 73 69 6e 67 20 74 68  se processing th
1f60: 61 74 20 74 68 65 0a 2a 2a 20 65 78 70 72 65 73  at the.** expres
1f70: 73 69 6f 6e 20 64 65 70 65 6e 64 73 20 6f 6e 20  sion depends on 
1f80: 74 61 62 6c 65 20 69 52 69 67 68 74 4a 6f 69 6e  table iRightJoin
1f90: 54 61 62 6c 65 20 65 76 65 6e 20 69 66 20 74 68  Table even if th
1fa0: 61 74 20 74 61 62 6c 65 20 69 73 20 6e 6f 74 0a  at table is not.
1fb0: 2a 2a 20 65 78 70 6c 69 63 69 74 6c 79 20 6d 65  ** explicitly me
1fc0: 6e 74 69 6f 6e 65 64 20 69 6e 20 74 68 65 20 65  ntioned in the e
1fd0: 78 70 72 65 73 73 69 6f 6e 2e 20 20 54 68 61 74  xpression.  That
1fe0: 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 73 20   information is 
1ff0: 6e 65 65 64 65 64 0a 2a 2a 20 66 6f 72 20 63 61  needed.** for ca
2000: 73 65 73 20 6c 69 6b 65 20 74 68 69 73 3a 0a 2a  ses like this:.*
2010: 2a 0a 2a 2a 20 20 20 20 53 45 4c 45 43 54 20 2a  *.**    SELECT *
2020: 20 46 52 4f 4d 20 74 31 20 4c 45 46 54 20 4a 4f   FROM t1 LEFT JO
2030: 49 4e 20 74 32 20 4f 4e 20 74 31 2e 61 3d 74 32  IN t2 ON t1.a=t2
2040: 2e 62 20 41 4e 44 20 74 31 2e 78 3d 35 0a 2a 2a  .b AND t1.x=5.**
2050: 0a 2a 2a 20 54 68 65 20 77 68 65 72 65 20 63 6c  .** The where cl
2060: 61 75 73 65 20 6e 65 65 64 73 20 74 6f 20 64 65  ause needs to de
2070: 66 65 72 20 74 68 65 20 68 61 6e 64 6c 69 6e 67  fer the handling
2080: 20 6f 66 20 74 68 65 20 74 31 2e 78 3d 35 0a 2a   of the t1.x=5.*
2090: 2a 20 74 65 72 6d 20 75 6e 74 69 6c 20 61 66 74  * term until aft
20a0: 65 72 20 74 68 65 20 74 32 20 6c 6f 6f 70 20 6f  er the t2 loop o
20b0: 66 20 74 68 65 20 6a 6f 69 6e 2e 20 20 49 6e 20  f the join.  In 
20c0: 74 68 61 74 20 77 61 79 2c 20 61 0a 2a 2a 20 4e  that way, a.** N
20d0: 55 4c 4c 20 74 32 20 72 6f 77 20 77 69 6c 6c 20  ULL t2 row will 
20e0: 62 65 20 69 6e 73 65 72 74 65 64 20 77 68 65 6e  be inserted when
20f0: 65 76 65 72 20 74 31 2e 78 21 3d 35 2e 20 20 49  ever t1.x!=5.  I
2100: 66 20 77 65 20 64 6f 20 6e 6f 74 0a 2a 2a 20 64  f we do not.** d
2110: 65 66 65 72 20 74 68 65 20 68 61 6e 64 6c 69 6e  efer the handlin
2120: 67 20 6f 66 20 74 31 2e 78 3d 35 2c 20 69 74 20  g of t1.x=5, it 
2130: 77 69 6c 6c 20 62 65 20 70 72 6f 63 65 73 73 65  will be processe
2140: 64 20 69 6d 6d 65 64 69 61 74 65 6c 79 0a 2a 2a  d immediately.**
2150: 20 61 66 74 65 72 20 74 68 65 20 74 31 20 6c 6f   after the t1 lo
2160: 6f 70 20 61 6e 64 20 72 6f 77 73 20 77 69 74 68  op and rows with
2170: 20 74 31 2e 78 21 3d 35 20 77 69 6c 6c 20 6e 65   t1.x!=5 will ne
2180: 76 65 72 20 61 70 70 65 61 72 20 69 6e 0a 2a 2a  ver appear in.**
2190: 20 74 68 65 20 6f 75 74 70 75 74 2c 20 77 68 69   the output, whi
21a0: 63 68 20 69 73 20 69 6e 63 6f 72 72 65 63 74 2e  ch is incorrect.
21b0: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
21c0: 73 65 74 4a 6f 69 6e 45 78 70 72 28 45 78 70 72  setJoinExpr(Expr
21d0: 20 2a 70 2c 20 69 6e 74 20 69 54 61 62 6c 65 29   *p, int iTable)
21e0: 7b 0a 20 20 77 68 69 6c 65 28 20 70 20 29 7b 0a  {.  while( p ){.
21f0: 20 20 20 20 45 78 70 72 53 65 74 50 72 6f 70 65      ExprSetPrope
2200: 72 74 79 28 70 2c 20 45 50 5f 46 72 6f 6d 4a 6f  rty(p, EP_FromJo
2210: 69 6e 29 3b 0a 20 20 20 20 70 2d 3e 69 52 69 67  in);.    p->iRig
2220: 68 74 4a 6f 69 6e 54 61 62 6c 65 20 3d 20 69 54  htJoinTable = iT
2230: 61 62 6c 65 3b 0a 20 20 20 20 73 65 74 4a 6f 69  able;.    setJoi
2240: 6e 45 78 70 72 28 70 2d 3e 70 4c 65 66 74 2c 20  nExpr(p->pLeft, 
2250: 69 54 61 62 6c 65 29 3b 0a 20 20 20 20 70 20 3d  iTable);.    p =
2260: 20 70 2d 3e 70 52 69 67 68 74 3b 0a 20 20 7d 20   p->pRight;.  } 
2270: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  .}../*.** This r
2280: 6f 75 74 69 6e 65 20 70 72 6f 63 65 73 73 65 73  outine processes
2290: 20 74 68 65 20 6a 6f 69 6e 20 69 6e 66 6f 72 6d   the join inform
22a0: 61 74 69 6f 6e 20 66 6f 72 20 61 20 53 45 4c 45  ation for a SELE
22b0: 43 54 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a  CT statement..**
22c0: 20 4f 4e 20 61 6e 64 20 55 53 49 4e 47 20 63 6c   ON and USING cl
22d0: 61 75 73 65 73 20 61 72 65 20 63 6f 6e 76 65 72  auses are conver
22e0: 74 65 64 20 69 6e 74 6f 20 65 78 74 72 61 20 74  ted into extra t
22f0: 65 72 6d 73 20 6f 66 20 74 68 65 20 57 48 45 52  erms of the WHER
2300: 45 20 63 6c 61 75 73 65 2e 0a 2a 2a 20 4e 41 54  E clause..** NAT
2310: 55 52 41 4c 20 6a 6f 69 6e 73 20 61 6c 73 6f 20  URAL joins also 
2320: 63 72 65 61 74 65 20 65 78 74 72 61 20 57 48 45  create extra WHE
2330: 52 45 20 63 6c 61 75 73 65 20 74 65 72 6d 73 2e  RE clause terms.
2340: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 74 65 72 6d 73  .**.** The terms
2350: 20 6f 66 20 61 20 46 52 4f 4d 20 63 6c 61 75 73   of a FROM claus
2360: 65 20 61 72 65 20 63 6f 6e 74 61 69 6e 65 64 20  e are contained 
2370: 69 6e 20 74 68 65 20 53 65 6c 65 63 74 2e 70 53  in the Select.pS
2380: 72 63 20 73 74 72 75 63 74 75 72 65 2e 0a 2a 2a  rc structure..**
2390: 20 54 68 65 20 6c 65 66 74 20 6d 6f 73 74 20 74   The left most t
23a0: 61 62 6c 65 20 69 73 20 74 68 65 20 66 69 72 73  able is the firs
23b0: 74 20 65 6e 74 72 79 20 69 6e 20 53 65 6c 65 63  t entry in Selec
23c0: 74 2e 70 53 72 63 2e 20 20 54 68 65 20 72 69 67  t.pSrc.  The rig
23d0: 68 74 2d 6d 6f 73 74 0a 2a 2a 20 74 61 62 6c 65  ht-most.** table
23e0: 20 69 73 20 74 68 65 20 6c 61 73 74 20 65 6e 74   is the last ent
23f0: 72 79 2e 20 20 54 68 65 20 6a 6f 69 6e 20 6f 70  ry.  The join op
2400: 65 72 61 74 6f 72 20 69 73 20 68 65 6c 64 20 69  erator is held i
2410: 6e 20 74 68 65 20 65 6e 74 72 79 20 74 6f 0a 2a  n the entry to.*
2420: 2a 20 74 68 65 20 6c 65 66 74 2e 20 20 54 68 75  * the left.  Thu
2430: 73 20 65 6e 74 72 79 20 30 20 63 6f 6e 74 61 69  s entry 0 contai
2440: 6e 73 20 74 68 65 20 6a 6f 69 6e 20 6f 70 65 72  ns the join oper
2450: 61 74 6f 72 20 66 6f 72 20 74 68 65 20 6a 6f 69  ator for the joi
2460: 6e 20 62 65 74 77 65 65 6e 0a 2a 2a 20 65 6e 74  n between.** ent
2470: 72 69 65 73 20 30 20 61 6e 64 20 31 2e 20 20 41  ries 0 and 1.  A
2480: 6e 79 20 4f 4e 20 6f 72 20 55 53 49 4e 47 20 63  ny ON or USING c
2490: 6c 61 75 73 65 73 20 61 73 73 6f 63 69 61 74 65  lauses associate
24a0: 64 20 77 69 74 68 20 74 68 65 20 6a 6f 69 6e 20  d with the join 
24b0: 61 72 65 0a 2a 2a 20 61 6c 73 6f 20 61 74 74 61  are.** also atta
24c0: 63 68 65 64 20 74 6f 20 74 68 65 20 6c 65 66 74  ched to the left
24d0: 20 65 6e 74 72 79 2e 0a 2a 2a 0a 2a 2a 20 54 68   entry..**.** Th
24e0: 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72  is routine retur
24f0: 6e 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  ns the number of
2500: 20 65 72 72 6f 72 73 20 65 6e 63 6f 75 6e 74 65   errors encounte
2510: 72 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  red..*/.static i
2520: 6e 74 20 73 71 6c 69 74 65 50 72 6f 63 65 73 73  nt sqliteProcess
2530: 4a 6f 69 6e 28 50 61 72 73 65 20 2a 70 50 61 72  Join(Parse *pPar
2540: 73 65 2c 20 53 65 6c 65 63 74 20 2a 70 29 7b 0a  se, Select *p){.
2550: 20 20 53 72 63 4c 69 73 74 20 2a 70 53 72 63 3b    SrcList *pSrc;
2560: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2570: 20 20 2f 2a 20 41 6c 6c 20 74 61 62 6c 65 73 20    /* All tables 
2580: 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75  in the FROM clau
2590: 73 65 20 2a 2f 0a 20 20 69 6e 74 20 69 2c 20 6a  se */.  int i, j
25a0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
25b0: 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20          /* Loop 
25c0: 63 6f 75 6e 74 65 72 73 20 2a 2f 0a 20 20 73 74  counters */.  st
25d0: 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65  ruct SrcList_ite
25e0: 6d 20 2a 70 4c 65 66 74 3b 20 20 20 20 20 2f 2a  m *pLeft;     /*
25f0: 20 4c 65 66 74 20 74 61 62 6c 65 20 62 65 69 6e   Left table bein
2600: 67 20 6a 6f 69 6e 65 64 20 2a 2f 0a 20 20 73 74  g joined */.  st
2610: 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65  ruct SrcList_ite
2620: 6d 20 2a 70 52 69 67 68 74 3b 20 20 20 20 2f 2a  m *pRight;    /*
2630: 20 52 69 67 68 74 20 74 61 62 6c 65 20 62 65 69   Right table bei
2640: 6e 67 20 6a 6f 69 6e 65 64 20 2a 2f 0a 0a 20 20  ng joined */..  
2650: 70 53 72 63 20 3d 20 70 2d 3e 70 53 72 63 3b 0a  pSrc = p->pSrc;.
2660: 20 20 70 4c 65 66 74 20 3d 20 26 70 53 72 63 2d    pLeft = &pSrc-
2670: 3e 61 5b 30 5d 3b 0a 20 20 70 52 69 67 68 74 20  >a[0];.  pRight 
2680: 3d 20 26 70 4c 65 66 74 5b 31 5d 3b 0a 20 20 66  = &pLeft[1];.  f
2690: 6f 72 28 69 3d 30 3b 20 69 3c 70 53 72 63 2d 3e  or(i=0; i<pSrc->
26a0: 6e 53 72 63 2d 31 3b 20 69 2b 2b 2c 20 70 52 69  nSrc-1; i++, pRi
26b0: 67 68 74 2b 2b 2c 20 70 4c 65 66 74 2b 2b 29 7b  ght++, pLeft++){
26c0: 0a 20 20 20 20 54 61 62 6c 65 20 2a 70 4c 65 66  .    Table *pLef
26d0: 74 54 61 62 20 3d 20 70 4c 65 66 74 2d 3e 70 54  tTab = pLeft->pT
26e0: 61 62 3b 0a 20 20 20 20 54 61 62 6c 65 20 2a 70  ab;.    Table *p
26f0: 52 69 67 68 74 54 61 62 20 3d 20 70 52 69 67 68  RightTab = pRigh
2700: 74 2d 3e 70 54 61 62 3b 0a 20 20 20 20 69 6e 74  t->pTab;.    int
2710: 20 69 73 4f 75 74 65 72 3b 0a 0a 20 20 20 20 69   isOuter;..    i
2720: 66 28 20 70 4c 65 66 74 54 61 62 3d 3d 30 20 7c  f( pLeftTab==0 |
2730: 7c 20 70 52 69 67 68 74 54 61 62 3d 3d 30 20 29  | pRightTab==0 )
2740: 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69   continue;.    i
2750: 73 4f 75 74 65 72 20 3d 20 28 70 52 69 67 68 74  sOuter = (pRight
2760: 2d 3e 6a 6f 69 6e 74 79 70 65 20 26 20 4a 54 5f  ->jointype & JT_
2770: 4f 55 54 45 52 29 21 3d 30 3b 0a 0a 20 20 20 20  OUTER)!=0;..    
2780: 2f 2a 20 57 68 65 6e 20 74 68 65 20 4e 41 54 55  /* When the NATU
2790: 52 41 4c 20 6b 65 79 77 6f 72 64 20 69 73 20 70  RAL keyword is p
27a0: 72 65 73 65 6e 74 2c 20 61 64 64 20 57 48 45 52  resent, add WHER
27b0: 45 20 63 6c 61 75 73 65 20 74 65 72 6d 73 20 66  E clause terms f
27c0: 6f 72 0a 20 20 20 20 2a 2a 20 65 76 65 72 79 20  or.    ** every 
27d0: 63 6f 6c 75 6d 6e 20 74 68 61 74 20 74 68 65 20  column that the 
27e0: 74 77 6f 20 74 61 62 6c 65 73 20 68 61 76 65 20  two tables have 
27f0: 69 6e 20 63 6f 6d 6d 6f 6e 2e 0a 20 20 20 20 2a  in common..    *
2800: 2f 0a 20 20 20 20 69 66 28 20 70 52 69 67 68 74  /.    if( pRight
2810: 2d 3e 6a 6f 69 6e 74 79 70 65 20 26 20 4a 54 5f  ->jointype & JT_
2820: 4e 41 54 55 52 41 4c 20 29 7b 0a 20 20 20 20 20  NATURAL ){.     
2830: 20 69 66 28 20 70 52 69 67 68 74 2d 3e 70 4f 6e   if( pRight->pOn
2840: 20 7c 7c 20 70 52 69 67 68 74 2d 3e 70 55 73 69   || pRight->pUsi
2850: 6e 67 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  ng ){.        sq
2860: 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
2870: 61 72 73 65 2c 20 22 61 20 4e 41 54 55 52 41 4c  arse, "a NATURAL
2880: 20 6a 6f 69 6e 20 6d 61 79 20 6e 6f 74 20 68 61   join may not ha
2890: 76 65 20 22 0a 20 20 20 20 20 20 20 20 20 20 20  ve ".           
28a0: 22 61 6e 20 4f 4e 20 6f 72 20 55 53 49 4e 47 20  "an ON or USING 
28b0: 63 6c 61 75 73 65 22 2c 20 30 29 3b 0a 20 20 20  clause", 0);.   
28c0: 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20       return 1;. 
28d0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 66 6f 72       }.      for
28e0: 28 6a 3d 30 3b 20 6a 3c 70 4c 65 66 74 54 61 62  (j=0; j<pLeftTab
28f0: 2d 3e 6e 43 6f 6c 3b 20 6a 2b 2b 29 7b 0a 20 20  ->nCol; j++){.  
2900: 20 20 20 20 20 20 63 68 61 72 20 2a 7a 4e 61 6d        char *zNam
2910: 65 20 3d 20 70 4c 65 66 74 54 61 62 2d 3e 61 43  e = pLeftTab->aC
2920: 6f 6c 5b 6a 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20  ol[j].zName;.   
2930: 20 20 20 20 20 69 66 28 20 63 6f 6c 75 6d 6e 49       if( columnI
2940: 6e 64 65 78 28 70 52 69 67 68 74 54 61 62 2c 20  ndex(pRightTab, 
2950: 7a 4e 61 6d 65 29 3e 3d 30 20 29 7b 0a 20 20 20  zName)>=0 ){.   
2960: 20 20 20 20 20 20 20 61 64 64 57 68 65 72 65 54         addWhereT
2970: 65 72 6d 28 70 50 61 72 73 65 2c 20 7a 4e 61 6d  erm(pParse, zNam
2980: 65 2c 20 70 4c 65 66 74 54 61 62 2c 20 70 4c 65  e, pLeftTab, pLe
2990: 66 74 2d 3e 7a 41 6c 69 61 73 2c 20 0a 20 20 20  ft->zAlias, .   
29a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29b0: 20 20 20 20 20 20 20 20 20 20 20 70 52 69 67 68             pRigh
29c0: 74 54 61 62 2c 20 70 52 69 67 68 74 2d 3e 7a 41  tTab, pRight->zA
29d0: 6c 69 61 73 2c 0a 20 20 20 20 20 20 20 20 20 20  lias,.          
29e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29f0: 20 20 20 20 70 52 69 67 68 74 2d 3e 69 43 75 72      pRight->iCur
2a00: 73 6f 72 2c 20 26 70 2d 3e 70 57 68 65 72 65 2c  sor, &p->pWhere,
2a10: 20 69 73 4f 75 74 65 72 29 3b 0a 20 20 20 20 20   isOuter);.     
2a20: 20 20 20 20 20 0a 20 20 20 20 20 20 20 20 7d 0a       .        }.
2a30: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20        }.    }.. 
2a40: 20 20 20 2f 2a 20 44 69 73 61 6c 6c 6f 77 20 62     /* Disallow b
2a50: 6f 74 68 20 4f 4e 20 61 6e 64 20 55 53 49 4e 47  oth ON and USING
2a60: 20 63 6c 61 75 73 65 73 20 69 6e 20 74 68 65 20   clauses in the 
2a70: 73 61 6d 65 20 6a 6f 69 6e 0a 20 20 20 20 2a 2f  same join.    */
2a80: 0a 20 20 20 20 69 66 28 20 70 52 69 67 68 74 2d  .    if( pRight-
2a90: 3e 70 4f 6e 20 26 26 20 70 52 69 67 68 74 2d 3e  >pOn && pRight->
2aa0: 70 55 73 69 6e 67 20 29 7b 0a 20 20 20 20 20 20  pUsing ){.      
2ab0: 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
2ac0: 70 50 61 72 73 65 2c 20 22 63 61 6e 6e 6f 74 20  pParse, "cannot 
2ad0: 68 61 76 65 20 62 6f 74 68 20 4f 4e 20 61 6e 64  have both ON and
2ae0: 20 55 53 49 4e 47 20 22 0a 20 20 20 20 20 20 20   USING ".       
2af0: 20 22 63 6c 61 75 73 65 73 20 69 6e 20 74 68 65   "clauses in the
2b00: 20 73 61 6d 65 20 6a 6f 69 6e 22 29 3b 0a 20 20   same join");.  
2b10: 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20      return 1;.  
2b20: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 41 64 64 20    }..    /* Add 
2b30: 74 68 65 20 4f 4e 20 63 6c 61 75 73 65 20 74 6f  the ON clause to
2b40: 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20   the end of the 
2b50: 57 48 45 52 45 20 63 6c 61 75 73 65 2c 20 63 6f  WHERE clause, co
2b60: 6e 6e 65 63 74 65 64 20 62 79 0a 20 20 20 20 2a  nnected by.    *
2b70: 2a 20 61 6e 20 41 4e 44 20 6f 70 65 72 61 74 6f  * an AND operato
2b80: 72 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  r..    */.    if
2b90: 28 20 70 52 69 67 68 74 2d 3e 70 4f 6e 20 29 7b  ( pRight->pOn ){
2ba0: 0a 20 20 20 20 20 20 69 66 28 20 69 73 4f 75 74  .      if( isOut
2bb0: 65 72 20 29 20 73 65 74 4a 6f 69 6e 45 78 70 72  er ) setJoinExpr
2bc0: 28 70 52 69 67 68 74 2d 3e 70 4f 6e 2c 20 70 52  (pRight->pOn, pR
2bd0: 69 67 68 74 2d 3e 69 43 75 72 73 6f 72 29 3b 0a  ight->iCursor);.
2be0: 20 20 20 20 20 20 70 2d 3e 70 57 68 65 72 65 20        p->pWhere 
2bf0: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 41 6e 64  = sqlite3ExprAnd
2c00: 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 2d 3e  (pParse->db, p->
2c10: 70 57 68 65 72 65 2c 20 70 52 69 67 68 74 2d 3e  pWhere, pRight->
2c20: 70 4f 6e 29 3b 0a 20 20 20 20 20 20 70 52 69 67  pOn);.      pRig
2c30: 68 74 2d 3e 70 4f 6e 20 3d 20 30 3b 0a 20 20 20  ht->pOn = 0;.   
2c40: 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 72 65 61 74   }..    /* Creat
2c50: 65 20 65 78 74 72 61 20 74 65 72 6d 73 20 6f 6e  e extra terms on
2c60: 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73   the WHERE claus
2c70: 65 20 66 6f 72 20 65 61 63 68 20 63 6f 6c 75 6d  e for each colum
2c80: 6e 20 6e 61 6d 65 64 0a 20 20 20 20 2a 2a 20 69  n named.    ** i
2c90: 6e 20 74 68 65 20 55 53 49 4e 47 20 63 6c 61 75  n the USING clau
2ca0: 73 65 2e 20 20 45 78 61 6d 70 6c 65 3a 20 49 66  se.  Example: If
2cb0: 20 74 68 65 20 74 77 6f 20 74 61 62 6c 65 73 20   the two tables 
2cc0: 74 6f 20 62 65 20 6a 6f 69 6e 65 64 20 61 72 65  to be joined are
2cd0: 20 0a 20 20 20 20 2a 2a 20 41 20 61 6e 64 20 42   .    ** A and B
2ce0: 20 61 6e 64 20 74 68 65 20 55 53 49 4e 47 20 63   and the USING c
2cf0: 6c 61 75 73 65 20 6e 61 6d 65 73 20 58 2c 20 59  lause names X, Y
2d00: 2c 20 61 6e 64 20 5a 2c 20 74 68 65 6e 20 61 64  , and Z, then ad
2d10: 64 20 74 68 69 73 0a 20 20 20 20 2a 2a 20 74 6f  d this.    ** to
2d20: 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73   the WHERE claus
2d30: 65 3a 20 20 20 20 41 2e 58 3d 42 2e 58 20 41 4e  e:    A.X=B.X AN
2d40: 44 20 41 2e 59 3d 42 2e 59 20 41 4e 44 20 41 2e  D A.Y=B.Y AND A.
2d50: 5a 3d 42 2e 5a 0a 20 20 20 20 2a 2a 20 52 65 70  Z=B.Z.    ** Rep
2d60: 6f 72 74 20 61 6e 20 65 72 72 6f 72 20 69 66 20  ort an error if 
2d70: 61 6e 79 20 63 6f 6c 75 6d 6e 20 6d 65 6e 74 69  any column menti
2d80: 6f 6e 65 64 20 69 6e 20 74 68 65 20 55 53 49 4e  oned in the USIN
2d90: 47 20 63 6c 61 75 73 65 20 69 73 0a 20 20 20 20  G clause is.    
2da0: 2a 2a 20 6e 6f 74 20 63 6f 6e 74 61 69 6e 65 64  ** not contained
2db0: 20 69 6e 20 62 6f 74 68 20 74 61 62 6c 65 73 20   in both tables 
2dc0: 74 6f 20 62 65 20 6a 6f 69 6e 65 64 2e 0a 20 20  to be joined..  
2dd0: 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 52 69    */.    if( pRi
2de0: 67 68 74 2d 3e 70 55 73 69 6e 67 20 29 7b 0a 20  ght->pUsing ){. 
2df0: 20 20 20 20 20 49 64 4c 69 73 74 20 2a 70 4c 69       IdList *pLi
2e00: 73 74 20 3d 20 70 52 69 67 68 74 2d 3e 70 55 73  st = pRight->pUs
2e10: 69 6e 67 3b 0a 20 20 20 20 20 20 66 6f 72 28 6a  ing;.      for(j
2e20: 3d 30 3b 20 6a 3c 70 4c 69 73 74 2d 3e 6e 49 64  =0; j<pList->nId
2e30: 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; j++){.        
2e40: 63 68 61 72 20 2a 7a 4e 61 6d 65 20 3d 20 70 4c  char *zName = pL
2e50: 69 73 74 2d 3e 61 5b 6a 5d 2e 7a 4e 61 6d 65 3b  ist->a[j].zName;
2e60: 0a 20 20 20 20 20 20 20 20 69 66 28 20 63 6f 6c  .        if( col
2e70: 75 6d 6e 49 6e 64 65 78 28 70 4c 65 66 74 54 61  umnIndex(pLeftTa
2e80: 62 2c 20 7a 4e 61 6d 65 29 3c 30 20 7c 7c 20 63  b, zName)<0 || c
2e90: 6f 6c 75 6d 6e 49 6e 64 65 78 28 70 52 69 67 68  olumnIndex(pRigh
2ea0: 74 54 61 62 2c 20 7a 4e 61 6d 65 29 3c 30 20 29  tTab, zName)<0 )
2eb0: 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  {.          sqli
2ec0: 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
2ed0: 73 65 2c 20 22 63 61 6e 6e 6f 74 20 6a 6f 69 6e  se, "cannot join
2ee0: 20 75 73 69 6e 67 20 63 6f 6c 75 6d 6e 20 25 73   using column %s
2ef0: 20 2d 20 63 6f 6c 75 6d 6e 20 22 0a 20 20 20 20   - column ".    
2f00: 20 20 20 20 20 20 20 20 22 6e 6f 74 20 70 72 65          "not pre
2f10: 73 65 6e 74 20 69 6e 20 62 6f 74 68 20 74 61 62  sent in both tab
2f20: 6c 65 73 22 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20  les", zName);.  
2f30: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 31          return 1
2f40: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
2f50: 20 20 20 20 61 64 64 57 68 65 72 65 54 65 72 6d      addWhereTerm
2f60: 28 70 50 61 72 73 65 2c 20 7a 4e 61 6d 65 2c 20  (pParse, zName, 
2f70: 70 4c 65 66 74 54 61 62 2c 20 70 4c 65 66 74 2d  pLeftTab, pLeft-
2f80: 3e 7a 41 6c 69 61 73 2c 20 0a 20 20 20 20 20 20  >zAlias, .      
2f90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2fa0: 20 20 20 20 20 20 70 52 69 67 68 74 54 61 62 2c        pRightTab,
2fb0: 20 70 52 69 67 68 74 2d 3e 7a 41 6c 69 61 73 2c   pRight->zAlias,
2fc0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
2fd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 70 52 69               pRi
2fe0: 67 68 74 2d 3e 69 43 75 72 73 6f 72 2c 20 26 70  ght->iCursor, &p
2ff0: 2d 3e 70 57 68 65 72 65 2c 20 69 73 4f 75 74 65  ->pWhere, isOute
3000: 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  r);.      }.    
3010: 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30  }.  }.  return 0
3020: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 73 65 72  ;.}../*.** Inser
3030: 74 20 63 6f 64 65 20 69 6e 74 6f 20 22 76 22 20  t code into "v" 
3040: 74 68 61 74 20 77 69 6c 6c 20 70 75 73 68 20 74  that will push t
3050: 68 65 20 72 65 63 6f 72 64 20 6f 6e 20 74 68 65  he record on the
3060: 20 74 6f 70 20 6f 66 20 74 68 65 0a 2a 2a 20 73   top of the.** s
3070: 74 61 63 6b 20 69 6e 74 6f 20 74 68 65 20 73 6f  tack into the so
3080: 72 74 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  rter..*/.static 
3090: 76 6f 69 64 20 70 75 73 68 4f 6e 74 6f 53 6f 72  void pushOntoSor
30a0: 74 65 72 28 0a 20 20 50 61 72 73 65 20 2a 70 50  ter(.  Parse *pP
30b0: 61 72 73 65 2c 20 20 20 20 20 20 20 20 20 2f 2a  arse,         /*
30c0: 20 50 61 72 73 65 72 20 63 6f 6e 74 65 78 74 20   Parser context 
30d0: 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70  */.  ExprList *p
30e0: 4f 72 64 65 72 42 79 2c 20 20 20 20 2f 2a 20 54  OrderBy,    /* T
30f0: 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75  he ORDER BY clau
3100: 73 65 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a  se */.  Select *
3110: 70 53 65 6c 65 63 74 2c 20 20 20 20 20 20 20 2f  pSelect,       /
3120: 2a 20 54 68 65 20 77 68 6f 6c 65 20 53 45 4c 45  * The whole SELE
3130: 43 54 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a  CT statement */.
3140: 20 20 69 6e 74 20 72 65 67 44 61 74 61 20 20 20    int regData   
3150: 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 67 69           /* Regi
3160: 73 74 65 72 20 68 6f 6c 64 69 6e 67 20 64 61 74  ster holding dat
3170: 61 20 74 6f 20 62 65 20 73 6f 72 74 65 64 20 2a  a to be sorted *
3180: 2f 0a 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d  /.){.  Vdbe *v =
3190: 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a   pParse->pVdbe;.
31a0: 20 20 69 6e 74 20 6e 45 78 70 72 20 3d 20 70 4f    int nExpr = pO
31b0: 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 3b 0a 20  rderBy->nExpr;. 
31c0: 20 69 6e 74 20 72 65 67 42 61 73 65 20 3d 20 73   int regBase = s
31d0: 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 61 6e  qlite3GetTempRan
31e0: 67 65 28 70 50 61 72 73 65 2c 20 6e 45 78 70 72  ge(pParse, nExpr
31f0: 2b 32 29 3b 0a 20 20 69 6e 74 20 72 65 67 52 65  +2);.  int regRe
3200: 63 6f 72 64 20 3d 20 73 71 6c 69 74 65 33 47 65  cord = sqlite3Ge
3210: 74 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 29  tTempReg(pParse)
3220: 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 43  ;.  sqlite3ExprC
3230: 6f 64 65 45 78 70 72 4c 69 73 74 28 70 50 61 72  odeExprList(pPar
3240: 73 65 2c 20 70 4f 72 64 65 72 42 79 2c 20 72 65  se, pOrderBy, re
3250: 67 42 61 73 65 29 3b 0a 20 20 73 71 6c 69 74 65  gBase);.  sqlite
3260: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
3270: 50 5f 53 65 71 75 65 6e 63 65 2c 20 70 4f 72 64  P_Sequence, pOrd
3280: 65 72 42 79 2d 3e 69 45 43 75 72 73 6f 72 2c 20  erBy->iECursor, 
3290: 72 65 67 42 61 73 65 2b 6e 45 78 70 72 29 3b 0a  regBase+nExpr);.
32a0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
32b0: 4f 70 32 28 76 2c 20 4f 50 5f 4d 6f 76 65 2c 20  Op2(v, OP_Move, 
32c0: 72 65 67 44 61 74 61 2c 20 72 65 67 42 61 73 65  regData, regBase
32d0: 2b 6e 45 78 70 72 2b 31 29 3b 0a 20 20 73 71 6c  +nExpr+1);.  sql
32e0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
32f0: 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c  , OP_MakeRecord,
3300: 20 72 65 67 42 61 73 65 2c 20 6e 45 78 70 72 20   regBase, nExpr 
3310: 2b 20 32 2c 20 72 65 67 52 65 63 6f 72 64 29 3b  + 2, regRecord);
3320: 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  .  sqlite3VdbeAd
3330: 64 4f 70 32 28 76 2c 20 4f 50 5f 49 64 78 49 6e  dOp2(v, OP_IdxIn
3340: 73 65 72 74 2c 20 70 4f 72 64 65 72 42 79 2d 3e  sert, pOrderBy->
3350: 69 45 43 75 72 73 6f 72 2c 20 72 65 67 52 65 63  iECursor, regRec
3360: 6f 72 64 29 3b 0a 20 20 73 71 6c 69 74 65 33 52  ord);.  sqlite3R
3370: 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50  eleaseTempReg(pP
3380: 61 72 73 65 2c 20 72 65 67 52 65 63 6f 72 64 29  arse, regRecord)
3390: 3b 0a 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61  ;.  sqlite3Relea
33a0: 73 65 54 65 6d 70 52 61 6e 67 65 28 70 50 61 72  seTempRange(pPar
33b0: 73 65 2c 20 72 65 67 42 61 73 65 2c 20 6e 45 78  se, regBase, nEx
33c0: 70 72 2b 32 29 3b 0a 20 20 69 66 28 20 70 53 65  pr+2);.  if( pSe
33d0: 6c 65 63 74 2d 3e 69 4c 69 6d 69 74 3e 3d 30 20  lect->iLimit>=0 
33e0: 29 7b 0a 20 20 20 20 69 6e 74 20 61 64 64 72 31  ){.    int addr1
33f0: 2c 20 61 64 64 72 32 3b 0a 20 20 20 20 69 6e 74  , addr2;.    int
3400: 20 69 4c 69 6d 69 74 3b 0a 20 20 20 20 69 66 28   iLimit;.    if(
3410: 20 70 53 65 6c 65 63 74 2d 3e 70 4f 66 66 73 65   pSelect->pOffse
3420: 74 20 29 7b 0a 20 20 20 20 20 20 69 4c 69 6d 69  t ){.      iLimi
3430: 74 20 3d 20 70 53 65 6c 65 63 74 2d 3e 69 4f 66  t = pSelect->iOf
3440: 66 73 65 74 2b 31 3b 0a 20 20 20 20 7d 65 6c 73  fset+1;.    }els
3450: 65 7b 0a 20 20 20 20 20 20 69 4c 69 6d 69 74 20  e{.      iLimit 
3460: 3d 20 70 53 65 6c 65 63 74 2d 3e 69 4c 69 6d 69  = pSelect->iLimi
3470: 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 64 64  t;.    }.    add
3480: 72 31 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  r1 = sqlite3Vdbe
3490: 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 49 66 5a  AddOp1(v, OP_IfZ
34a0: 65 72 6f 2c 20 69 4c 69 6d 69 74 29 3b 0a 20 20  ero, iLimit);.  
34b0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
34c0: 4f 70 32 28 76 2c 20 4f 50 5f 41 64 64 49 6d 6d  Op2(v, OP_AddImm
34d0: 2c 20 69 4c 69 6d 69 74 2c 20 2d 31 29 3b 0a 20  , iLimit, -1);. 
34e0: 20 20 20 61 64 64 72 32 20 3d 20 73 71 6c 69 74     addr2 = sqlit
34f0: 65 33 56 64 62 65 41 64 64 4f 70 30 28 76 2c 20  e3VdbeAddOp0(v, 
3500: 4f 50 5f 47 6f 74 6f 29 3b 0a 20 20 20 20 73 71  OP_Goto);.    sq
3510: 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72  lite3VdbeJumpHer
3520: 65 28 76 2c 20 61 64 64 72 31 29 3b 0a 20 20 20  e(v, addr1);.   
3530: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
3540: 70 31 28 76 2c 20 4f 50 5f 4c 61 73 74 2c 20 70  p1(v, OP_Last, p
3550: 4f 72 64 65 72 42 79 2d 3e 69 45 43 75 72 73 6f  OrderBy->iECurso
3560: 72 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  r);.    sqlite3V
3570: 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f  dbeAddOp1(v, OP_
3580: 44 65 6c 65 74 65 2c 20 70 4f 72 64 65 72 42 79  Delete, pOrderBy
3590: 2d 3e 69 45 43 75 72 73 6f 72 29 3b 0a 20 20 20  ->iECursor);.   
35a0: 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70   sqlite3VdbeJump
35b0: 48 65 72 65 28 76 2c 20 61 64 64 72 32 29 3b 0a  Here(v, addr2);.
35c0: 20 20 20 20 70 53 65 6c 65 63 74 2d 3e 69 4c 69      pSelect->iLi
35d0: 6d 69 74 20 3d 20 2d 31 3b 0a 20 20 7d 0a 7d 0a  mit = -1;.  }.}.
35e0: 0a 2f 2a 0a 2a 2a 20 41 64 64 20 63 6f 64 65 20  ./*.** Add code 
35f0: 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 74 68 65  to implement the
3600: 20 4f 46 46 53 45 54 0a 2a 2f 0a 73 74 61 74 69   OFFSET.*/.stati
3610: 63 20 76 6f 69 64 20 63 6f 64 65 4f 66 66 73 65  c void codeOffse
3620: 74 28 0a 20 20 56 64 62 65 20 2a 76 2c 20 20 20  t(.  Vdbe *v,   
3630: 20 20 20 20 20 20 20 2f 2a 20 47 65 6e 65 72 61         /* Genera
3640: 74 65 20 63 6f 64 65 20 69 6e 74 6f 20 74 68 69  te code into thi
3650: 73 20 56 4d 20 2a 2f 0a 20 20 53 65 6c 65 63 74  s VM */.  Select
3660: 20 2a 70 2c 20 20 20 20 20 20 20 20 2f 2a 20 54   *p,        /* T
3670: 68 65 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d  he SELECT statem
3680: 65 6e 74 20 62 65 69 6e 67 20 63 6f 64 65 64 20  ent being coded 
3690: 2a 2f 0a 20 20 69 6e 74 20 69 43 6f 6e 74 69 6e  */.  int iContin
36a0: 75 65 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20 68  ue     /* Jump h
36b0: 65 72 65 20 74 6f 20 73 6b 69 70 20 74 68 65 20  ere to skip the 
36c0: 63 75 72 72 65 6e 74 20 72 65 63 6f 72 64 20 2a  current record *
36d0: 2f 0a 29 7b 0a 20 20 69 66 28 20 70 2d 3e 69 4f  /.){.  if( p->iO
36e0: 66 66 73 65 74 3e 3d 30 20 26 26 20 69 43 6f 6e  ffset>=0 && iCon
36f0: 74 69 6e 75 65 21 3d 30 20 29 7b 0a 20 20 20 20  tinue!=0 ){.    
3700: 69 6e 74 20 61 64 64 72 3b 0a 20 20 20 20 73 71  int addr;.    sq
3710: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
3720: 76 2c 20 4f 50 5f 41 64 64 49 6d 6d 2c 20 70 2d  v, OP_AddImm, p-
3730: 3e 69 4f 66 66 73 65 74 2c 20 2d 31 29 3b 0a 20  >iOffset, -1);. 
3740: 20 20 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65     addr = sqlite
3750: 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f  3VdbeAddOp1(v, O
3760: 50 5f 49 66 4e 65 67 2c 20 70 2d 3e 69 4f 66 66  P_IfNeg, p->iOff
3770: 73 65 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  set);.    sqlite
3780: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
3790: 50 5f 47 6f 74 6f 2c 20 30 2c 20 69 43 6f 6e 74  P_Goto, 0, iCont
37a0: 69 6e 75 65 29 3b 0a 20 20 20 20 56 64 62 65 43  inue);.    VdbeC
37b0: 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 73 6b 69 70  omment((v, "skip
37c0: 20 4f 46 46 53 45 54 20 72 65 63 6f 72 64 73 22   OFFSET records"
37d0: 29 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  ));.    sqlite3V
37e0: 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61  dbeJumpHere(v, a
37f0: 64 64 72 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  ddr);.  }.}../*.
3800: 2a 2a 20 41 64 64 20 63 6f 64 65 20 74 68 61 74  ** Add code that
3810: 20 77 69 6c 6c 20 63 68 65 63 6b 20 74 6f 20 6d   will check to m
3820: 61 6b 65 20 73 75 72 65 20 74 68 65 20 4e 20 72  ake sure the N r
3830: 65 67 69 73 74 65 72 73 20 73 74 61 72 74 69 6e  egisters startin
3840: 67 20 61 74 20 69 4d 65 6d 0a 2a 2a 20 66 6f 72  g at iMem.** for
3850: 6d 20 61 20 64 69 73 74 69 6e 63 74 20 65 6e 74  m a distinct ent
3860: 72 79 2e 20 20 69 54 61 62 20 69 73 20 61 20 73  ry.  iTab is a s
3870: 6f 72 74 69 6e 67 20 69 6e 64 65 78 20 74 68 61  orting index tha
3880: 74 20 68 6f 6c 64 73 20 70 72 65 76 69 6f 75 73  t holds previous
3890: 6c 79 0a 2a 2a 20 73 65 65 6e 20 63 6f 6d 62 69  ly.** seen combi
38a0: 6e 61 74 69 6f 6e 73 20 6f 66 20 74 68 65 20 4e  nations of the N
38b0: 20 76 61 6c 75 65 73 2e 20 20 41 20 6e 65 77 20   values.  A new 
38c0: 65 6e 74 72 79 20 69 73 20 6d 61 64 65 20 69 6e  entry is made in
38d0: 20 69 54 61 62 0a 2a 2a 20 69 66 20 74 68 65 20   iTab.** if the 
38e0: 63 75 72 72 65 6e 74 20 4e 20 76 61 6c 75 65 73  current N values
38f0: 20 61 72 65 20 6e 65 77 2e 0a 2a 2a 0a 2a 2a 20   are new..**.** 
3900: 41 20 6a 75 6d 70 20 74 6f 20 61 64 64 72 52 65  A jump to addrRe
3910: 70 65 61 74 20 69 73 20 6d 61 64 65 20 61 6e 64  peat is made and
3920: 20 74 68 65 20 4e 2b 31 20 76 61 6c 75 65 73 20   the N+1 values 
3930: 61 72 65 20 70 6f 70 70 65 64 20 66 72 6f 6d 20  are popped from 
3940: 74 68 65 0a 2a 2a 20 73 74 61 63 6b 20 69 66 20  the.** stack if 
3950: 74 68 65 20 74 6f 70 20 4e 20 65 6c 65 6d 65 6e  the top N elemen
3960: 74 73 20 61 72 65 20 6e 6f 74 20 64 69 73 74 69  ts are not disti
3970: 6e 63 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  nct..*/.static v
3980: 6f 69 64 20 63 6f 64 65 44 69 73 74 69 6e 63 74  oid codeDistinct
3990: 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
39a0: 65 2c 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e  e,     /* Parsin
39b0: 67 20 61 6e 64 20 63 6f 64 65 20 67 65 6e 65 72  g and code gener
39c0: 61 74 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f  ating context */
39d0: 0a 20 20 69 6e 74 20 69 54 61 62 2c 20 20 20 20  .  int iTab,    
39e0: 20 20 20 20 20 20 2f 2a 20 41 20 73 6f 72 74 69        /* A sorti
39f0: 6e 67 20 69 6e 64 65 78 20 75 73 65 64 20 74 6f  ng index used to
3a00: 20 74 65 73 74 20 66 6f 72 20 64 69 73 74 69 6e   test for distin
3a10: 63 74 6e 65 73 73 20 2a 2f 0a 20 20 69 6e 74 20  ctness */.  int 
3a20: 61 64 64 72 52 65 70 65 61 74 2c 20 20 20 20 2f  addrRepeat,    /
3a30: 2a 20 4a 75 6d 70 20 74 6f 20 68 65 72 65 20 69  * Jump to here i
3a40: 66 20 6e 6f 74 20 64 69 73 74 69 6e 63 74 20 2a  f not distinct *
3a50: 2f 0a 20 20 69 6e 74 20 4e 2c 20 20 20 20 20 20  /.  int N,      
3a60: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
3a70: 20 6f 66 20 65 6c 65 6d 65 6e 74 73 20 2a 2f 0a   of elements */.
3a80: 20 20 69 6e 74 20 69 4d 65 6d 20 20 20 20 20 20    int iMem      
3a90: 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 65 6c       /* First el
3aa0: 65 6d 65 6e 74 20 2a 2f 0a 29 7b 0a 20 20 56 64  ement */.){.  Vd
3ab0: 62 65 20 2a 76 3b 0a 20 20 69 6e 74 20 72 31 3b  be *v;.  int r1;
3ac0: 0a 0a 20 20 76 20 3d 20 70 50 61 72 73 65 2d 3e  ..  v = pParse->
3ad0: 70 56 64 62 65 3b 0a 20 20 72 31 20 3d 20 73 71  pVdbe;.  r1 = sq
3ae0: 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65 67 28  lite3GetTempReg(
3af0: 70 50 61 72 73 65 29 3b 0a 20 20 73 71 6c 69 74  pParse);.  sqlit
3b00: 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
3b10: 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20 69  OP_MakeRecord, i
3b20: 4d 65 6d 2c 20 4e 2c 20 72 31 29 3b 0a 20 20 73  Mem, N, r1);.  s
3b30: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
3b40: 28 76 2c 20 4f 50 5f 46 6f 75 6e 64 2c 20 69 54  (v, OP_Found, iT
3b50: 61 62 2c 20 61 64 64 72 52 65 70 65 61 74 2c 20  ab, addrRepeat, 
3b60: 72 31 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64  r1);.  sqlite3Vd
3b70: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49  beAddOp2(v, OP_I
3b80: 64 78 49 6e 73 65 72 74 2c 20 69 54 61 62 2c 20  dxInsert, iTab, 
3b90: 72 31 29 3b 0a 20 20 73 71 6c 69 74 65 33 52 65  r1);.  sqlite3Re
3ba0: 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61  leaseTempReg(pPa
3bb0: 72 73 65 2c 20 72 31 29 3b 0a 7d 0a 0a 2f 2a 0a  rse, r1);.}../*.
3bc0: 2a 2a 20 47 65 6e 65 72 61 74 65 20 61 6e 20 65  ** Generate an e
3bd0: 72 72 6f 72 20 6d 65 73 73 61 67 65 20 77 68 65  rror message whe
3be0: 6e 20 61 20 53 45 4c 45 43 54 20 69 73 20 75 73  n a SELECT is us
3bf0: 65 64 20 77 69 74 68 69 6e 20 61 20 73 75 62 65  ed within a sube
3c00: 78 70 72 65 73 73 69 6f 6e 0a 2a 2a 20 28 65 78  xpression.** (ex
3c10: 61 6d 70 6c 65 3a 20 20 22 61 20 49 4e 20 28 53  ample:  "a IN (S
3c20: 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 61 62  ELECT * FROM tab
3c30: 6c 65 29 22 29 20 62 75 74 20 69 74 20 68 61 73  le)") but it has
3c40: 20 6d 6f 72 65 20 74 68 61 6e 20 31 20 72 65 73   more than 1 res
3c50: 75 6c 74 0a 2a 2a 20 63 6f 6c 75 6d 6e 2e 20 20  ult.** column.  
3c60: 57 65 20 64 6f 20 74 68 69 73 20 69 6e 20 61 20  We do this in a 
3c70: 73 75 62 72 6f 75 74 69 6e 65 20 62 65 63 61 75  subroutine becau
3c80: 73 65 20 74 68 65 20 65 72 72 6f 72 20 6f 63 63  se the error occ
3c90: 75 72 73 20 69 6e 20 6d 75 6c 74 69 70 6c 65 0a  urs in multiple.
3ca0: 2a 2a 20 70 6c 61 63 65 73 2e 0a 2a 2f 0a 73 74  ** places..*/.st
3cb0: 61 74 69 63 20 69 6e 74 20 63 68 65 63 6b 46 6f  atic int checkFo
3cc0: 72 4d 75 6c 74 69 43 6f 6c 75 6d 6e 53 65 6c 65  rMultiColumnSele
3cd0: 63 74 45 72 72 6f 72 28 0a 20 20 50 61 72 73 65  ctError(.  Parse
3ce0: 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20   *pParse,       
3cf0: 2f 2a 20 50 61 72 73 65 20 63 6f 6e 74 65 78 74  /* Parse context
3d00: 2e 20 2a 2f 0a 20 20 53 65 6c 65 63 74 44 65 73  . */.  SelectDes
3d10: 74 20 2a 70 44 65 73 74 2c 20 20 20 2f 2a 20 44  t *pDest,   /* D
3d20: 65 73 74 69 6e 61 74 69 6f 6e 20 6f 66 20 53 45  estination of SE
3d30: 4c 45 43 54 20 72 65 73 75 6c 74 73 20 2a 2f 0a  LECT results */.
3d40: 20 20 69 6e 74 20 6e 45 78 70 72 20 20 20 20 20    int nExpr     
3d50: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
3d60: 20 6f 66 20 72 65 73 75 6c 74 20 63 6f 6c 75 6d   of result colum
3d70: 6e 73 20 72 65 74 75 72 6e 65 64 20 62 79 20 53  ns returned by S
3d80: 45 4c 45 43 54 20 2a 2f 0a 29 7b 0a 20 20 69 6e  ELECT */.){.  in
3d90: 74 20 65 44 65 73 74 20 3d 20 70 44 65 73 74 2d  t eDest = pDest-
3da0: 3e 65 44 65 73 74 3b 0a 20 20 69 66 28 20 6e 45  >eDest;.  if( nE
3db0: 78 70 72 3e 31 20 26 26 20 28 65 44 65 73 74 3d  xpr>1 && (eDest=
3dc0: 3d 53 52 54 5f 4d 65 6d 20 7c 7c 20 65 44 65 73  =SRT_Mem || eDes
3dd0: 74 3d 3d 53 52 54 5f 53 65 74 29 20 29 7b 0a 20  t==SRT_Set) ){. 
3de0: 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
3df0: 73 67 28 70 50 61 72 73 65 2c 20 22 6f 6e 6c 79  sg(pParse, "only
3e00: 20 61 20 73 69 6e 67 6c 65 20 72 65 73 75 6c 74   a single result
3e10: 20 61 6c 6c 6f 77 65 64 20 66 6f 72 20 22 0a 20   allowed for ". 
3e20: 20 20 20 20 20 20 22 61 20 53 45 4c 45 43 54 20        "a SELECT 
3e30: 74 68 61 74 20 69 73 20 70 61 72 74 20 6f 66 20  that is part of 
3e40: 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 22 29 3b  an expression");
3e50: 0a 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20  .    return 1;. 
3e60: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65 74 75   }else{.    retu
3e70: 72 6e 20 30 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  rn 0;.  }.}../*.
3e80: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
3e90: 67 65 6e 65 72 61 74 65 73 20 74 68 65 20 63 6f  generates the co
3ea0: 64 65 20 66 6f 72 20 74 68 65 20 69 6e 73 69 64  de for the insid
3eb0: 65 20 6f 66 20 74 68 65 20 69 6e 6e 65 72 20 6c  e of the inner l
3ec0: 6f 6f 70 0a 2a 2a 20 6f 66 20 61 20 53 45 4c 45  oop.** of a SELE
3ed0: 43 54 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 73 72 63  CT..**.** If src
3ee0: 54 61 62 20 61 6e 64 20 6e 43 6f 6c 75 6d 6e 20  Tab and nColumn 
3ef0: 61 72 65 20 62 6f 74 68 20 7a 65 72 6f 2c 20 74  are both zero, t
3f00: 68 65 6e 20 74 68 65 20 70 45 4c 69 73 74 20 65  hen the pEList e
3f10: 78 70 72 65 73 73 69 6f 6e 73 0a 2a 2a 20 61 72  xpressions.** ar
3f20: 65 20 65 76 61 6c 75 61 74 65 64 20 69 6e 20 6f  e evaluated in o
3f30: 72 64 65 72 20 74 6f 20 67 65 74 20 74 68 65 20  rder to get the 
3f40: 64 61 74 61 20 66 6f 72 20 74 68 69 73 20 72 6f  data for this ro
3f50: 77 2e 20 20 49 66 20 6e 43 6f 6c 75 6d 6e 3e 30  w.  If nColumn>0
3f60: 0a 2a 2a 20 74 68 65 6e 20 64 61 74 61 20 69 73  .** then data is
3f70: 20 70 75 6c 6c 65 64 20 66 72 6f 6d 20 73 72 63   pulled from src
3f80: 54 61 62 20 61 6e 64 20 70 45 4c 69 73 74 20 69  Tab and pEList i
3f90: 73 20 75 73 65 64 20 6f 6e 6c 79 20 74 6f 20 67  s used only to g
3fa0: 65 74 20 74 68 65 0a 2a 2a 20 64 61 74 61 74 79  et the.** dataty
3fb0: 70 65 73 20 66 6f 72 20 65 61 63 68 20 63 6f 6c  pes for each col
3fc0: 75 6d 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  umn..*/.static v
3fd0: 6f 69 64 20 73 65 6c 65 63 74 49 6e 6e 65 72 4c  oid selectInnerL
3fe0: 6f 6f 70 28 0a 20 20 50 61 72 73 65 20 2a 70 50  oop(.  Parse *pP
3ff0: 61 72 73 65 2c 20 20 20 20 20 20 20 20 20 20 2f  arse,          /
4000: 2a 20 54 68 65 20 70 61 72 73 65 72 20 63 6f 6e  * The parser con
4010: 74 65 78 74 20 2a 2f 0a 20 20 53 65 6c 65 63 74  text */.  Select
4020: 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20   *p,            
4030: 20 20 2f 2a 20 54 68 65 20 63 6f 6d 70 6c 65 74    /* The complet
4040: 65 20 73 65 6c 65 63 74 20 73 74 61 74 65 6d 65  e select stateme
4050: 6e 74 20 62 65 69 6e 67 20 63 6f 64 65 64 20 2a  nt being coded *
4060: 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45  /.  ExprList *pE
4070: 4c 69 73 74 2c 20 20 20 20 20 20 20 2f 2a 20 4c  List,       /* L
4080: 69 73 74 20 6f 66 20 76 61 6c 75 65 73 20 62 65  ist of values be
4090: 69 6e 67 20 65 78 74 72 61 63 74 65 64 20 2a 2f  ing extracted */
40a0: 0a 20 20 69 6e 74 20 73 72 63 54 61 62 2c 20 20  .  int srcTab,  
40b0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 75             /* Pu
40c0: 6c 6c 20 64 61 74 61 20 66 72 6f 6d 20 74 68 69  ll data from thi
40d0: 73 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74  s table */.  int
40e0: 20 6e 43 6f 6c 75 6d 6e 2c 20 20 20 20 20 20 20   nColumn,       
40f0: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
4100: 66 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65  f columns in the
4110: 20 73 6f 75 72 63 65 20 74 61 62 6c 65 20 2a 2f   source table */
4120: 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4f 72  .  ExprList *pOr
4130: 64 65 72 42 79 2c 20 20 20 20 20 2f 2a 20 49 66  derBy,     /* If
4140: 20 6e 6f 74 20 4e 55 4c 4c 2c 20 73 6f 72 74 20   not NULL, sort 
4150: 72 65 73 75 6c 74 73 20 75 73 69 6e 67 20 74 68  results using th
4160: 69 73 20 6b 65 79 20 2a 2f 0a 20 20 69 6e 74 20  is key */.  int 
4170: 64 69 73 74 69 6e 63 74 2c 20 20 20 20 20 20 20  distinct,       
4180: 20 20 20 20 2f 2a 20 49 66 20 3e 3d 30 2c 20 6d      /* If >=0, m
4190: 61 6b 65 20 73 75 72 65 20 72 65 73 75 6c 74 73  ake sure results
41a0: 20 61 72 65 20 64 69 73 74 69 6e 63 74 20 2a 2f   are distinct */
41b0: 0a 20 20 53 65 6c 65 63 74 44 65 73 74 20 2a 70  .  SelectDest *p
41c0: 44 65 73 74 2c 20 20 20 20 20 20 2f 2a 20 48 6f  Dest,      /* Ho
41d0: 77 20 74 6f 20 64 69 73 70 6f 73 65 20 6f 66 20  w to dispose of 
41e0: 74 68 65 20 72 65 73 75 6c 74 73 20 2a 2f 0a 20  the results */. 
41f0: 20 69 6e 74 20 69 43 6f 6e 74 69 6e 75 65 2c 20   int iContinue, 
4200: 20 20 20 20 20 20 20 20 20 2f 2a 20 4a 75 6d 70           /* Jump
4210: 20 68 65 72 65 20 74 6f 20 63 6f 6e 74 69 6e 75   here to continu
4220: 65 20 77 69 74 68 20 6e 65 78 74 20 72 6f 77 20  e with next row 
4230: 2a 2f 0a 20 20 69 6e 74 20 69 42 72 65 61 6b 2c  */.  int iBreak,
4240: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
4250: 4a 75 6d 70 20 68 65 72 65 20 74 6f 20 62 72 65  Jump here to bre
4260: 61 6b 20 6f 75 74 20 6f 66 20 74 68 65 20 69 6e  ak out of the in
4270: 6e 65 72 20 6c 6f 6f 70 20 2a 2f 0a 20 20 63 68  ner loop */.  ch
4280: 61 72 20 2a 61 66 66 20 20 20 20 20 20 20 20 20  ar *aff         
4290: 20 20 20 20 20 20 2f 2a 20 61 66 66 69 6e 69 74        /* affinit
42a0: 79 20 73 74 72 69 6e 67 20 69 66 20 65 44 65 73  y string if eDes
42b0: 74 20 69 73 20 53 52 54 5f 55 6e 69 6f 6e 20 2a  t is SRT_Union *
42c0: 2f 0a 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d  /.){.  Vdbe *v =
42d0: 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a   pParse->pVdbe;.
42e0: 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 68    int i;.  int h
42f0: 61 73 44 69 73 74 69 6e 63 74 3b 20 20 20 20 20  asDistinct;     
4300: 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 74 68     /* True if th
4310: 65 20 44 49 53 54 49 4e 43 54 20 6b 65 79 77 6f  e DISTINCT keywo
4320: 72 64 20 69 73 20 70 72 65 73 65 6e 74 20 2a 2f  rd is present */
4330: 0a 20 20 69 6e 74 20 72 65 67 52 65 73 75 6c 74  .  int regResult
4340: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
4350: 2a 20 53 74 61 72 74 20 6f 66 20 6d 65 6d 6f 72  * Start of memor
4360: 79 20 68 6f 6c 64 69 6e 67 20 72 65 73 75 6c 74  y holding result
4370: 20 73 65 74 20 2a 2f 0a 20 20 69 6e 74 20 65 44   set */.  int eD
4380: 65 73 74 20 3d 20 70 44 65 73 74 2d 3e 65 44 65  est = pDest->eDe
4390: 73 74 3b 20 20 20 2f 2a 20 48 6f 77 20 74 6f 20  st;   /* How to 
43a0: 64 69 73 70 6f 73 65 20 6f 66 20 72 65 73 75 6c  dispose of resul
43b0: 74 73 20 2a 2f 0a 20 20 69 6e 74 20 69 50 61 72  ts */.  int iPar
43c0: 6d 20 3d 20 70 44 65 73 74 2d 3e 69 50 61 72 6d  m = pDest->iParm
43d0: 3b 20 20 20 2f 2a 20 46 69 72 73 74 20 61 72 67  ;   /* First arg
43e0: 75 6d 65 6e 74 20 74 6f 20 64 69 73 70 6f 73 61  ument to disposa
43f0: 6c 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 69 6e  l method */.  in
4400: 74 20 6e 52 65 73 75 6c 74 43 6f 6c 3b 20 20 20  t nResultCol;   
4410: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
4420: 62 65 72 20 6f 66 20 72 65 73 75 6c 74 20 63 6f  ber of result co
4430: 6c 75 6d 6e 73 20 2a 2f 0a 0a 20 20 69 66 28 20  lumns */..  if( 
4440: 76 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20  v==0 ) return;. 
4450: 20 61 73 73 65 72 74 28 20 70 45 4c 69 73 74 21   assert( pEList!
4460: 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74  =0 );..  /* If t
4470: 68 65 72 65 20 77 61 73 20 61 20 4c 49 4d 49 54  here was a LIMIT
4480: 20 63 6c 61 75 73 65 20 6f 6e 20 74 68 65 20 53   clause on the S
4490: 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 2c  ELECT statement,
44a0: 20 74 68 65 6e 20 64 6f 20 74 68 65 20 63 68 65   then do the che
44b0: 63 6b 0a 20 20 2a 2a 20 74 6f 20 73 65 65 20 69  ck.  ** to see i
44c0: 66 20 74 68 69 73 20 72 6f 77 20 73 68 6f 75 6c  f this row shoul
44d0: 64 20 62 65 20 6f 75 74 70 75 74 2e 0a 20 20 2a  d be output..  *
44e0: 2f 0a 20 20 68 61 73 44 69 73 74 69 6e 63 74 20  /.  hasDistinct 
44f0: 3d 20 64 69 73 74 69 6e 63 74 3e 3d 30 20 26 26  = distinct>=0 &&
4500: 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3e 30   pEList->nExpr>0
4510: 3b 0a 20 20 69 66 28 20 70 4f 72 64 65 72 42 79  ;.  if( pOrderBy
4520: 3d 3d 30 20 26 26 20 21 68 61 73 44 69 73 74 69  ==0 && !hasDisti
4530: 6e 63 74 20 29 7b 0a 20 20 20 20 63 6f 64 65 4f  nct ){.    codeO
4540: 66 66 73 65 74 28 76 2c 20 70 2c 20 69 43 6f 6e  ffset(v, p, iCon
4550: 74 69 6e 75 65 29 3b 0a 20 20 7d 0a 0a 20 20 2f  tinue);.  }..  /
4560: 2a 20 50 75 6c 6c 20 74 68 65 20 72 65 71 75 65  * Pull the reque
4570: 73 74 65 64 20 63 6f 6c 75 6d 6e 73 2e 0a 20 20  sted columns..  
4580: 2a 2f 0a 20 20 69 66 28 20 6e 43 6f 6c 75 6d 6e  */.  if( nColumn
4590: 3e 30 20 29 7b 0a 20 20 20 20 6e 52 65 73 75 6c  >0 ){.    nResul
45a0: 74 43 6f 6c 20 3d 20 6e 43 6f 6c 75 6d 6e 3b 0a  tCol = nColumn;.
45b0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6e 52 65    }else{.    nRe
45c0: 73 75 6c 74 43 6f 6c 20 3d 20 70 45 4c 69 73 74  sultCol = pEList
45d0: 2d 3e 6e 45 78 70 72 3b 0a 20 20 7d 0a 20 20 69  ->nExpr;.  }.  i
45e0: 66 28 20 70 44 65 73 74 2d 3e 69 4d 65 6d 3d 3d  f( pDest->iMem==
45f0: 30 20 29 7b 0a 20 20 20 20 70 44 65 73 74 2d 3e  0 ){.    pDest->
4600: 69 4d 65 6d 20 3d 20 73 71 6c 69 74 65 33 47 65  iMem = sqlite3Ge
4610: 74 54 65 6d 70 52 61 6e 67 65 28 70 50 61 72 73  tTempRange(pPars
4620: 65 2c 20 6e 52 65 73 75 6c 74 43 6f 6c 29 3b 0a  e, nResultCol);.
4630: 20 20 20 20 70 44 65 73 74 2d 3e 6e 4d 65 6d 20      pDest->nMem 
4640: 3d 20 6e 52 65 73 75 6c 74 43 6f 6c 3b 0a 20 20  = nResultCol;.  
4650: 7d 65 6c 73 65 20 69 66 28 20 70 44 65 73 74 2d  }else if( pDest-
4660: 3e 6e 4d 65 6d 21 3d 6e 52 65 73 75 6c 74 43 6f  >nMem!=nResultCo
4670: 6c 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 69 73  l ){.    /* This
4680: 20 68 61 70 70 65 6e 73 20 77 68 65 6e 20 74 77   happens when tw
4690: 6f 20 53 45 4c 45 43 54 73 20 6f 66 20 61 20 63  o SELECTs of a c
46a0: 6f 6d 70 6f 75 6e 64 20 53 45 4c 45 43 54 20 68  ompound SELECT h
46b0: 61 76 65 20 64 69 66 66 65 72 69 6e 67 0a 20 20  ave differing.  
46c0: 20 20 2a 2a 20 6e 75 6d 62 65 72 73 20 6f 66 20    ** numbers of 
46d0: 72 65 73 75 6c 74 20 63 6f 6c 75 6d 6e 73 2e 20  result columns. 
46e0: 20 54 68 65 20 65 72 72 6f 72 20 6d 65 73 73 61   The error messa
46f0: 67 65 20 77 69 6c 6c 20 62 65 20 67 65 6e 65 72  ge will be gener
4700: 61 74 65 64 20 62 79 0a 20 20 20 20 2a 2a 20 61  ated by.    ** a
4710: 20 68 69 67 68 65 72 2d 6c 65 76 65 6c 20 72 6f   higher-level ro
4720: 75 74 69 6e 65 2e 20 2a 2f 0a 20 20 20 20 72 65  utine. */.    re
4730: 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 72 65 67 52  turn;.  }.  regR
4740: 65 73 75 6c 74 20 3d 20 70 44 65 73 74 2d 3e 69  esult = pDest->i
4750: 4d 65 6d 3b 0a 20 20 69 66 28 20 6e 43 6f 6c 75  Mem;.  if( nColu
4760: 6d 6e 3e 30 20 29 7b 0a 20 20 20 20 66 6f 72 28  mn>0 ){.    for(
4770: 69 3d 30 3b 20 69 3c 6e 43 6f 6c 75 6d 6e 3b 20  i=0; i<nColumn; 
4780: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  i++){.      sqli
4790: 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
47a0: 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 73 72 63 54   OP_Column, srcT
47b0: 61 62 2c 20 69 2c 20 72 65 67 52 65 73 75 6c 74  ab, i, regResult
47c0: 2b 69 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c  +i);.    }.  }el
47d0: 73 65 20 69 66 28 20 65 44 65 73 74 21 3d 53 52  se if( eDest!=SR
47e0: 54 5f 45 78 69 73 74 73 20 29 7b 0a 20 20 20 20  T_Exists ){.    
47f0: 2f 2a 20 49 66 20 74 68 65 20 64 65 73 74 69 6e  /* If the destin
4800: 61 74 69 6f 6e 20 69 73 20 61 6e 20 45 58 49 53  ation is an EXIS
4810: 54 53 28 2e 2e 2e 29 20 65 78 70 72 65 73 73 69  TS(...) expressi
4820: 6f 6e 2c 20 74 68 65 20 61 63 74 75 61 6c 0a 20  on, the actual. 
4830: 20 20 20 2a 2a 20 76 61 6c 75 65 73 20 72 65 74     ** values ret
4840: 75 72 6e 65 64 20 62 79 20 74 68 65 20 53 45 4c  urned by the SEL
4850: 45 43 54 20 61 72 65 20 6e 6f 74 20 72 65 71 75  ECT are not requ
4860: 69 72 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  ired..    */.   
4870: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 52 65 73   for(i=0; i<nRes
4880: 75 6c 74 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20  ultCol; i++){.  
4890: 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
48a0: 6f 64 65 28 70 50 61 72 73 65 2c 20 70 45 4c 69  ode(pParse, pELi
48b0: 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 2c 20  st->a[i].pExpr, 
48c0: 72 65 67 52 65 73 75 6c 74 2b 69 29 3b 0a 20 20  regResult+i);.  
48d0: 20 20 7d 0a 20 20 7d 0a 20 20 6e 43 6f 6c 75 6d    }.  }.  nColum
48e0: 6e 20 3d 20 6e 52 65 73 75 6c 74 43 6f 6c 3b 0a  n = nResultCol;.
48f0: 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 44 49 53  .  /* If the DIS
4900: 54 49 4e 43 54 20 6b 65 79 77 6f 72 64 20 77 61  TINCT keyword wa
4910: 73 20 70 72 65 73 65 6e 74 20 6f 6e 20 74 68 65  s present on the
4920: 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
4930: 74 0a 20 20 2a 2a 20 61 6e 64 20 74 68 69 73 20  t.  ** and this 
4940: 72 6f 77 20 68 61 73 20 62 65 65 6e 20 73 65 65  row has been see
4950: 6e 20 62 65 66 6f 72 65 2c 20 74 68 65 6e 20 64  n before, then d
4960: 6f 20 6e 6f 74 20 6d 61 6b 65 20 74 68 69 73 20  o not make this 
4970: 72 6f 77 0a 20 20 2a 2a 20 70 61 72 74 20 6f 66  row.  ** part of
4980: 20 74 68 65 20 72 65 73 75 6c 74 2e 0a 20 20 2a   the result..  *
4990: 2f 0a 20 20 69 66 28 20 68 61 73 44 69 73 74 69  /.  if( hasDisti
49a0: 6e 63 74 20 29 7b 0a 20 20 20 20 61 73 73 65 72  nct ){.    asser
49b0: 74 28 20 70 45 4c 69 73 74 21 3d 30 20 29 3b 0a  t( pEList!=0 );.
49c0: 20 20 20 20 61 73 73 65 72 74 28 20 70 45 4c 69      assert( pELi
49d0: 73 74 2d 3e 6e 45 78 70 72 3d 3d 6e 43 6f 6c 75  st->nExpr==nColu
49e0: 6d 6e 20 29 3b 0a 20 20 20 20 63 6f 64 65 44 69  mn );.    codeDi
49f0: 73 74 69 6e 63 74 28 70 50 61 72 73 65 2c 20 64  stinct(pParse, d
4a00: 69 73 74 69 6e 63 74 2c 20 69 43 6f 6e 74 69 6e  istinct, iContin
4a10: 75 65 2c 20 6e 43 6f 6c 75 6d 6e 2c 20 72 65 67  ue, nColumn, reg
4a20: 52 65 73 75 6c 74 29 3b 0a 20 20 20 20 69 66 28  Result);.    if(
4a30: 20 70 4f 72 64 65 72 42 79 3d 3d 30 20 29 7b 0a   pOrderBy==0 ){.
4a40: 20 20 20 20 20 20 63 6f 64 65 4f 66 66 73 65 74        codeOffset
4a50: 28 76 2c 20 70 2c 20 69 43 6f 6e 74 69 6e 75 65  (v, p, iContinue
4a60: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  );.    }.  }..  
4a70: 69 66 28 20 63 68 65 63 6b 46 6f 72 4d 75 6c 74  if( checkForMult
4a80: 69 43 6f 6c 75 6d 6e 53 65 6c 65 63 74 45 72 72  iColumnSelectErr
4a90: 6f 72 28 70 50 61 72 73 65 2c 20 70 44 65 73 74  or(pParse, pDest
4aa0: 2c 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 29  , pEList->nExpr)
4ab0: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a   ){.    return;.
4ac0: 20 20 7d 0a 0a 20 20 73 77 69 74 63 68 28 20 65    }..  switch( e
4ad0: 44 65 73 74 20 29 7b 0a 20 20 20 20 2f 2a 20 49  Dest ){.    /* I
4ae0: 6e 20 74 68 69 73 20 6d 6f 64 65 2c 20 77 72 69  n this mode, wri
4af0: 74 65 20 65 61 63 68 20 71 75 65 72 79 20 72 65  te each query re
4b00: 73 75 6c 74 20 74 6f 20 74 68 65 20 6b 65 79 20  sult to the key 
4b10: 6f 66 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79  of the temporary
4b20: 0a 20 20 20 20 2a 2a 20 74 61 62 6c 65 20 69 50  .    ** table iP
4b30: 61 72 6d 2e 0a 20 20 20 20 2a 2f 0a 23 69 66 6e  arm..    */.#ifn
4b40: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
4b50: 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45 43 54 0a  COMPOUND_SELECT.
4b60: 20 20 20 20 63 61 73 65 20 53 52 54 5f 55 6e 69      case SRT_Uni
4b70: 6f 6e 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20  on: {.      int 
4b80: 72 31 3b 0a 20 20 20 20 20 20 72 31 20 3d 20 73  r1;.      r1 = s
4b90: 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65 67  qlite3GetTempReg
4ba0: 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20  (pParse);.      
4bb0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
4bc0: 33 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f  3(v, OP_MakeReco
4bd0: 72 64 2c 20 72 65 67 52 65 73 75 6c 74 2c 20 6e  rd, regResult, n
4be0: 43 6f 6c 75 6d 6e 2c 20 72 31 29 3b 0a 20 20 20  Column, r1);.   
4bf0: 20 20 20 69 66 28 20 61 66 66 20 29 7b 0a 20 20     if( aff ){.  
4c00: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
4c10: 65 43 68 61 6e 67 65 50 34 28 76 2c 20 2d 31 2c  eChangeP4(v, -1,
4c20: 20 61 66 66 2c 20 50 34 5f 53 54 41 54 49 43 29   aff, P4_STATIC)
4c30: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
4c40: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
4c50: 32 28 76 2c 20 4f 50 5f 49 64 78 49 6e 73 65 72  2(v, OP_IdxInser
4c60: 74 2c 20 69 50 61 72 6d 2c 20 72 31 29 3b 0a 20  t, iParm, r1);. 
4c70: 20 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65       sqlite3Rele
4c80: 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73  aseTempReg(pPars
4c90: 65 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 62 72  e, r1);.      br
4ca0: 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  eak;.    }..    
4cb0: 2f 2a 20 43 6f 6e 73 74 72 75 63 74 20 61 20 72  /* Construct a r
4cc0: 65 63 6f 72 64 20 66 72 6f 6d 20 74 68 65 20 71  ecord from the q
4cd0: 75 65 72 79 20 72 65 73 75 6c 74 2c 20 62 75 74  uery result, but
4ce0: 20 69 6e 73 74 65 61 64 20 6f 66 0a 20 20 20 20   instead of.    
4cf0: 2a 2a 20 73 61 76 69 6e 67 20 74 68 61 74 20 72  ** saving that r
4d00: 65 63 6f 72 64 2c 20 75 73 65 20 69 74 20 61 73  ecord, use it as
4d10: 20 61 20 6b 65 79 20 74 6f 20 64 65 6c 65 74 65   a key to delete
4d20: 20 65 6c 65 6d 65 6e 74 73 20 66 72 6f 6d 0a 20   elements from. 
4d30: 20 20 20 2a 2a 20 74 68 65 20 74 65 6d 70 6f 72     ** the tempor
4d40: 61 72 79 20 74 61 62 6c 65 20 69 50 61 72 6d 2e  ary table iParm.
4d50: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65  .    */.    case
4d60: 20 53 52 54 5f 45 78 63 65 70 74 3a 20 7b 0a 20   SRT_Except: {. 
4d70: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
4d80: 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 49 64 78  AddOp3(v, OP_Idx
4d90: 44 65 6c 65 74 65 2c 20 69 50 61 72 6d 2c 20 72  Delete, iParm, r
4da0: 65 67 52 65 73 75 6c 74 2c 20 6e 43 6f 6c 75 6d  egResult, nColum
4db0: 6e 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  n);.      break;
4dc0: 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20  .    }.#endif.. 
4dd0: 20 20 20 2f 2a 20 53 74 6f 72 65 20 74 68 65 20     /* Store the 
4de0: 72 65 73 75 6c 74 20 61 73 20 64 61 74 61 20 75  result as data u
4df0: 73 69 6e 67 20 61 20 75 6e 69 71 75 65 20 6b 65  sing a unique ke
4e00: 79 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61  y..    */.    ca
4e10: 73 65 20 53 52 54 5f 54 61 62 6c 65 3a 0a 20 20  se SRT_Table:.  
4e20: 20 20 63 61 73 65 20 53 52 54 5f 45 70 68 65 6d    case SRT_Ephem
4e30: 54 61 62 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74  Tab: {.      int
4e40: 20 72 31 20 3d 20 73 71 6c 69 74 65 33 47 65 74   r1 = sqlite3Get
4e50: 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b  TempReg(pParse);
4e60: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
4e70: 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4d  beAddOp3(v, OP_M
4e80: 61 6b 65 52 65 63 6f 72 64 2c 20 72 65 67 52 65  akeRecord, regRe
4e90: 73 75 6c 74 2c 20 6e 43 6f 6c 75 6d 6e 2c 20 72  sult, nColumn, r
4ea0: 31 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4f  1);.      if( pO
4eb0: 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20 20 20  rderBy ){.      
4ec0: 20 20 70 75 73 68 4f 6e 74 6f 53 6f 72 74 65 72    pushOntoSorter
4ed0: 28 70 50 61 72 73 65 2c 20 70 4f 72 64 65 72 42  (pParse, pOrderB
4ee0: 79 2c 20 70 2c 20 72 31 29 3b 0a 20 20 20 20 20  y, p, r1);.     
4ef0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
4f00: 69 6e 74 20 72 32 20 3d 20 73 71 6c 69 74 65 33  int r2 = sqlite3
4f10: 47 65 74 54 65 6d 70 52 65 67 28 70 50 61 72 73  GetTempReg(pPars
4f20: 65 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  e);.        sqli
4f30: 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
4f40: 20 4f 50 5f 4e 65 77 52 6f 77 69 64 2c 20 69 50   OP_NewRowid, iP
4f50: 61 72 6d 2c 20 72 32 29 3b 0a 20 20 20 20 20 20  arm, r2);.      
4f60: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
4f70: 4f 70 33 28 76 2c 20 4f 50 5f 49 6e 73 65 72 74  Op3(v, OP_Insert
4f80: 2c 20 69 50 61 72 6d 2c 20 72 31 2c 20 72 32 29  , iParm, r1, r2)
4f90: 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
4fa0: 33 56 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c  3VdbeChangeP5(v,
4fb0: 20 4f 50 46 4c 41 47 5f 41 50 50 45 4e 44 29 3b   OPFLAG_APPEND);
4fc0: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
4fd0: 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70  ReleaseTempReg(p
4fe0: 50 61 72 73 65 2c 20 72 32 29 3b 0a 20 20 20 20  Parse, r2);.    
4ff0: 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65    }.      sqlite
5000: 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28  3ReleaseTempReg(
5010: 70 50 61 72 73 65 2c 20 72 31 29 3b 0a 20 20 20  pParse, r1);.   
5020: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
5030: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
5040: 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 20 20  OMIT_SUBQUERY.  
5050: 20 20 2f 2a 20 49 66 20 77 65 20 61 72 65 20 63    /* If we are c
5060: 72 65 61 74 69 6e 67 20 61 20 73 65 74 20 66 6f  reating a set fo
5070: 72 20 61 6e 20 22 65 78 70 72 20 49 4e 20 28 53  r an "expr IN (S
5080: 45 4c 45 43 54 20 2e 2e 2e 29 22 20 63 6f 6e 73  ELECT ...)" cons
5090: 74 72 75 63 74 2c 0a 20 20 20 20 2a 2a 20 74 68  truct,.    ** th
50a0: 65 6e 20 74 68 65 72 65 20 73 68 6f 75 6c 64 20  en there should 
50b0: 62 65 20 61 20 73 69 6e 67 6c 65 20 69 74 65 6d  be a single item
50c0: 20 6f 6e 20 74 68 65 20 73 74 61 63 6b 2e 20 20   on the stack.  
50d0: 57 72 69 74 65 20 74 68 69 73 0a 20 20 20 20 2a  Write this.    *
50e0: 2a 20 69 74 65 6d 20 69 6e 74 6f 20 74 68 65 20  * item into the 
50f0: 73 65 74 20 74 61 62 6c 65 20 77 69 74 68 20 62  set table with b
5100: 6f 67 75 73 20 64 61 74 61 2e 0a 20 20 20 20 2a  ogus data..    *
5110: 2f 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f 53  /.    case SRT_S
5120: 65 74 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20  et: {.      int 
5130: 61 64 64 72 32 3b 0a 0a 20 20 20 20 20 20 61 73  addr2;..      as
5140: 73 65 72 74 28 20 6e 43 6f 6c 75 6d 6e 3d 3d 31  sert( nColumn==1
5150: 20 29 3b 0a 20 20 20 20 20 20 61 64 64 72 32 20   );.      addr2 
5160: 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  = sqlite3VdbeAdd
5170: 4f 70 31 28 76 2c 20 4f 50 5f 49 73 4e 75 6c 6c  Op1(v, OP_IsNull
5180: 2c 20 72 65 67 52 65 73 75 6c 74 29 3b 0a 20 20  , regResult);.  
5190: 20 20 20 20 70 2d 3e 61 66 66 69 6e 69 74 79 20      p->affinity 
51a0: 3d 20 73 71 6c 69 74 65 33 43 6f 6d 70 61 72 65  = sqlite3Compare
51b0: 41 66 66 69 6e 69 74 79 28 70 45 4c 69 73 74 2d  Affinity(pEList-
51c0: 3e 61 5b 30 5d 2e 70 45 78 70 72 2c 20 70 44 65  >a[0].pExpr, pDe
51d0: 73 74 2d 3e 61 66 66 69 6e 69 74 79 29 3b 0a 20  st->affinity);. 
51e0: 20 20 20 20 20 69 66 28 20 70 4f 72 64 65 72 42       if( pOrderB
51f0: 79 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  y ){.        /* 
5200: 41 74 20 66 69 72 73 74 20 67 6c 61 6e 63 65 20  At first glance 
5210: 79 6f 75 20 77 6f 75 6c 64 20 74 68 69 6e 6b 20  you would think 
5220: 77 65 20 63 6f 75 6c 64 20 6f 70 74 69 6d 69 7a  we could optimiz
5230: 65 20 6f 75 74 20 74 68 65 0a 20 20 20 20 20 20  e out the.      
5240: 20 20 2a 2a 20 4f 52 44 45 52 20 42 59 20 69 6e    ** ORDER BY in
5250: 20 74 68 69 73 20 63 61 73 65 20 73 69 6e 63 65   this case since
5260: 20 74 68 65 20 6f 72 64 65 72 20 6f 66 20 65 6e   the order of en
5270: 74 72 69 65 73 20 69 6e 20 74 68 65 20 73 65 74  tries in the set
5280: 0a 20 20 20 20 20 20 20 20 2a 2a 20 64 6f 65 73  .        ** does
5290: 20 6e 6f 74 20 6d 61 74 74 65 72 2e 20 20 42 75   not matter.  Bu
52a0: 74 20 74 68 65 72 65 20 6d 69 67 68 74 20 62 65  t there might be
52b0: 20 61 20 4c 49 4d 49 54 20 63 6c 61 75 73 65 2c   a LIMIT clause,
52c0: 20 69 6e 20 77 68 69 63 68 0a 20 20 20 20 20 20   in which.      
52d0: 20 20 2a 2a 20 63 61 73 65 20 74 68 65 20 6f 72    ** case the or
52e0: 64 65 72 20 64 6f 65 73 20 6d 61 74 74 65 72 20  der does matter 
52f0: 2a 2f 0a 20 20 20 20 20 20 20 20 70 75 73 68 4f  */.        pushO
5300: 6e 74 6f 53 6f 72 74 65 72 28 70 50 61 72 73 65  ntoSorter(pParse
5310: 2c 20 70 4f 72 64 65 72 42 79 2c 20 70 2c 20 72  , pOrderBy, p, r
5320: 65 67 52 65 73 75 6c 74 29 3b 0a 20 20 20 20 20  egResult);.     
5330: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
5340: 69 6e 74 20 72 31 20 3d 20 73 71 6c 69 74 65 33  int r1 = sqlite3
5350: 47 65 74 54 65 6d 70 52 65 67 28 70 50 61 72 73  GetTempReg(pPars
5360: 65 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  e);.        sqli
5370: 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c  te3VdbeAddOp4(v,
5380: 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20   OP_MakeRecord, 
5390: 72 65 67 52 65 73 75 6c 74 2c 20 31 2c 20 72 31  regResult, 1, r1
53a0: 2c 20 26 70 2d 3e 61 66 66 69 6e 69 74 79 2c 20  , &p->affinity, 
53b0: 31 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  1);.        sqli
53c0: 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
53d0: 20 4f 50 5f 49 64 78 49 6e 73 65 72 74 2c 20 69   OP_IdxInsert, i
53e0: 50 61 72 6d 2c 20 72 31 29 3b 0a 20 20 20 20 20  Parm, r1);.     
53f0: 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73     sqlite3Releas
5400: 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c  eTempReg(pParse,
5410: 20 72 31 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20   r1);.      }.  
5420: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a      sqlite3VdbeJ
5430: 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72 32  umpHere(v, addr2
5440: 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
5450: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66      }..    /* If
5460: 20 61 6e 79 20 72 6f 77 20 65 78 69 73 74 20 69   any row exist i
5470: 6e 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74  n the result set
5480: 2c 20 72 65 63 6f 72 64 20 74 68 61 74 20 66 61  , record that fa
5490: 63 74 20 61 6e 64 20 61 62 6f 72 74 2e 0a 20 20  ct and abort..  
54a0: 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 52    */.    case SR
54b0: 54 5f 45 78 69 73 74 73 3a 20 7b 0a 20 20 20 20  T_Exists: {.    
54c0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
54d0: 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65  Op2(v, OP_Intege
54e0: 72 2c 20 31 2c 20 69 50 61 72 6d 29 3b 0a 20 20  r, 1, iParm);.  
54f0: 20 20 20 20 2f 2a 20 54 68 65 20 4c 49 4d 49 54      /* The LIMIT
5500: 20 63 6c 61 75 73 65 20 77 69 6c 6c 20 74 65 72   clause will ter
5510: 6d 69 6e 61 74 65 20 74 68 65 20 6c 6f 6f 70 20  minate the loop 
5520: 66 6f 72 20 75 73 20 2a 2f 0a 20 20 20 20 20 20  for us */.      
5530: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20  break;.    }..  
5540: 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20    /* If this is 
5550: 61 20 73 63 61 6c 61 72 20 73 65 6c 65 63 74 20  a scalar select 
5560: 74 68 61 74 20 69 73 20 70 61 72 74 20 6f 66 20  that is part of 
5570: 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 2c 20 74  an expression, t
5580: 68 65 6e 0a 20 20 20 20 2a 2a 20 73 74 6f 72 65  hen.    ** store
5590: 20 74 68 65 20 72 65 73 75 6c 74 73 20 69 6e 20   the results in 
55a0: 74 68 65 20 61 70 70 72 6f 70 72 69 61 74 65 20  the appropriate 
55b0: 6d 65 6d 6f 72 79 20 63 65 6c 6c 20 61 6e 64 20  memory cell and 
55c0: 62 72 65 61 6b 20 6f 75 74 0a 20 20 20 20 2a 2a  break out.    **
55d0: 20 6f 66 20 74 68 65 20 73 63 61 6e 20 6c 6f 6f   of the scan loo
55e0: 70 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61  p..    */.    ca
55f0: 73 65 20 53 52 54 5f 4d 65 6d 3a 20 7b 0a 20 20  se SRT_Mem: {.  
5600: 20 20 20 20 61 73 73 65 72 74 28 20 6e 43 6f 6c      assert( nCol
5610: 75 6d 6e 3d 3d 31 20 29 3b 0a 20 20 20 20 20 20  umn==1 );.      
5620: 69 66 28 20 70 4f 72 64 65 72 42 79 20 29 7b 0a  if( pOrderBy ){.
5630: 20 20 20 20 20 20 20 20 70 75 73 68 4f 6e 74 6f          pushOnto
5640: 53 6f 72 74 65 72 28 70 50 61 72 73 65 2c 20 70  Sorter(pParse, p
5650: 4f 72 64 65 72 42 79 2c 20 70 2c 20 72 65 67 52  OrderBy, p, regR
5660: 65 73 75 6c 74 29 3b 0a 20 20 20 20 20 20 7d 65  esult);.      }e
5670: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  lse{.        sql
5680: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
5690: 2c 20 4f 50 5f 4d 6f 76 65 2c 20 72 65 67 52 65  , OP_Move, regRe
56a0: 73 75 6c 74 2c 20 69 50 61 72 6d 29 3b 0a 20 20  sult, iParm);.  
56b0: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 4c 49 4d        /* The LIM
56c0: 49 54 20 63 6c 61 75 73 65 20 77 69 6c 6c 20 6a  IT clause will j
56d0: 75 6d 70 20 6f 75 74 20 6f 66 20 74 68 65 20 6c  ump out of the l
56e0: 6f 6f 70 20 66 6f 72 20 75 73 20 2a 2f 0a 20 20  oop for us */.  
56f0: 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61      }.      brea
5700: 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 20  k;.    }.#endif 
5710: 2f 2a 20 23 69 66 6e 64 65 66 20 53 51 4c 49 54  /* #ifndef SQLIT
5720: 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 20  E_OMIT_SUBQUERY 
5730: 2a 2f 0a 0a 20 20 20 20 2f 2a 20 53 65 6e 64 20  */..    /* Send 
5740: 74 68 65 20 64 61 74 61 20 74 6f 20 74 68 65 20  the data to the 
5750: 63 61 6c 6c 62 61 63 6b 20 66 75 6e 63 74 69 6f  callback functio
5760: 6e 20 6f 72 20 74 6f 20 61 20 73 75 62 72 6f 75  n or to a subrou
5770: 74 69 6e 65 2e 20 20 49 6e 20 74 68 65 0a 20 20  tine.  In the.  
5780: 20 20 2a 2a 20 63 61 73 65 20 6f 66 20 61 20 73    ** case of a s
5790: 75 62 72 6f 75 74 69 6e 65 2c 20 74 68 65 20 73  ubroutine, the s
57a0: 75 62 72 6f 75 74 69 6e 65 20 69 74 73 65 6c 66  ubroutine itself
57b0: 20 69 73 20 72 65 73 70 6f 6e 73 69 62 6c 65 20   is responsible 
57c0: 66 6f 72 0a 20 20 20 20 2a 2a 20 70 6f 70 70 69  for.    ** poppi
57d0: 6e 67 20 74 68 65 20 64 61 74 61 20 66 72 6f 6d  ng the data from
57e0: 20 74 68 65 20 73 74 61 63 6b 2e 0a 20 20 20 20   the stack..    
57f0: 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f  */.    case SRT_
5800: 53 75 62 72 6f 75 74 69 6e 65 3a 0a 20 20 20 20  Subroutine:.    
5810: 63 61 73 65 20 53 52 54 5f 43 61 6c 6c 62 61 63  case SRT_Callbac
5820: 6b 3a 20 7b 0a 20 20 20 20 20 20 69 66 28 20 70  k: {.      if( p
5830: 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20 20  OrderBy ){.     
5840: 20 20 20 69 6e 74 20 72 31 20 3d 20 73 71 6c 69     int r1 = sqli
5850: 74 65 33 47 65 74 54 65 6d 70 52 65 67 28 70 50  te3GetTempReg(pP
5860: 61 72 73 65 29 3b 0a 20 20 20 20 20 20 20 20 73  arse);.        s
5870: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
5880: 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72  (v, OP_MakeRecor
5890: 64 2c 20 72 65 67 52 65 73 75 6c 74 2c 20 6e 43  d, regResult, nC
58a0: 6f 6c 75 6d 6e 2c 20 72 31 29 3b 0a 20 20 20 20  olumn, r1);.    
58b0: 20 20 20 20 70 75 73 68 4f 6e 74 6f 53 6f 72 74      pushOntoSort
58c0: 65 72 28 70 50 61 72 73 65 2c 20 70 4f 72 64 65  er(pParse, pOrde
58d0: 72 42 79 2c 20 70 2c 20 72 31 29 3b 0a 20 20 20  rBy, p, r1);.   
58e0: 20 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65       sqlite3Rele
58f0: 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73  aseTempReg(pPars
5900: 65 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 7d 65  e, r1);.      }e
5910: 6c 73 65 20 69 66 28 20 65 44 65 73 74 3d 3d 53  lse if( eDest==S
5920: 52 54 5f 53 75 62 72 6f 75 74 69 6e 65 20 29 7b  RT_Subroutine ){
5930: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
5940: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
5950: 5f 47 6f 73 75 62 2c 20 30 2c 20 69 50 61 72 6d  _Gosub, 0, iParm
5960: 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
5970: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
5980: 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
5990: 52 65 73 75 6c 74 52 6f 77 2c 20 72 65 67 52 65  ResultRow, regRe
59a0: 73 75 6c 74 2c 20 6e 43 6f 6c 75 6d 6e 29 3b 0a  sult, nColumn);.
59b0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72        }.      br
59c0: 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 23 69 66 20  eak;.    }..#if 
59d0: 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
59e0: 4f 4d 49 54 5f 54 52 49 47 47 45 52 29 0a 20 20  OMIT_TRIGGER).  
59f0: 20 20 2f 2a 20 44 69 73 63 61 72 64 20 74 68 65    /* Discard the
5a00: 20 72 65 73 75 6c 74 73 2e 20 20 54 68 69 73 20   results.  This 
5a10: 69 73 20 75 73 65 64 20 66 6f 72 20 53 45 4c 45  is used for SELE
5a20: 43 54 20 73 74 61 74 65 6d 65 6e 74 73 20 69 6e  CT statements in
5a30: 73 69 64 65 0a 20 20 20 20 2a 2a 20 74 68 65 20  side.    ** the 
5a40: 62 6f 64 79 20 6f 66 20 61 20 54 52 49 47 47 45  body of a TRIGGE
5a50: 52 2e 20 20 54 68 65 20 70 75 72 70 6f 73 65 20  R.  The purpose 
5a60: 6f 66 20 73 75 63 68 20 73 65 6c 65 63 74 73 20  of such selects 
5a70: 69 73 20 74 6f 20 63 61 6c 6c 0a 20 20 20 20 2a  is to call.    *
5a80: 2a 20 75 73 65 72 2d 64 65 66 69 6e 65 64 20 66  * user-defined f
5a90: 75 6e 63 74 69 6f 6e 73 20 74 68 61 74 20 68 61  unctions that ha
5aa0: 76 65 20 73 69 64 65 20 65 66 66 65 63 74 73 2e  ve side effects.
5ab0: 20 20 57 65 20 64 6f 20 6e 6f 74 20 63 61 72 65    We do not care
5ac0: 0a 20 20 20 20 2a 2a 20 61 62 6f 75 74 20 74 68  .    ** about th
5ad0: 65 20 61 63 74 75 61 6c 20 72 65 73 75 6c 74 73  e actual results
5ae0: 20 6f 66 20 74 68 65 20 73 65 6c 65 63 74 2e 0a   of the select..
5af0: 20 20 20 20 2a 2f 0a 20 20 20 20 64 65 66 61 75      */.    defau
5b00: 6c 74 3a 20 7b 0a 20 20 20 20 20 20 61 73 73 65  lt: {.      asse
5b10: 72 74 28 20 65 44 65 73 74 3d 3d 53 52 54 5f 44  rt( eDest==SRT_D
5b20: 69 73 63 61 72 64 20 29 3b 0a 20 20 20 20 20 20  iscard );.      
5b30: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e  break;.    }.#en
5b40: 64 69 66 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4a 75  dif.  }..  /* Ju
5b50: 6d 70 20 74 6f 20 74 68 65 20 65 6e 64 20 6f 66  mp to the end of
5b60: 20 74 68 65 20 6c 6f 6f 70 20 69 66 20 74 68 65   the loop if the
5b70: 20 4c 49 4d 49 54 20 69 73 20 72 65 61 63 68 65   LIMIT is reache
5b80: 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d  d..  */.  if( p-
5b90: 3e 69 4c 69 6d 69 74 3e 3d 30 20 26 26 20 70 4f  >iLimit>=0 && pO
5ba0: 72 64 65 72 42 79 3d 3d 30 20 29 7b 0a 20 20 20  rderBy==0 ){.   
5bb0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
5bc0: 70 32 28 76 2c 20 4f 50 5f 41 64 64 49 6d 6d 2c  p2(v, OP_AddImm,
5bd0: 20 70 2d 3e 69 4c 69 6d 69 74 2c 20 2d 31 29 3b   p->iLimit, -1);
5be0: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
5bf0: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 66 5a  AddOp2(v, OP_IfZ
5c00: 65 72 6f 2c 20 70 2d 3e 69 4c 69 6d 69 74 2c 20  ero, p->iLimit, 
5c10: 69 42 72 65 61 6b 29 3b 0a 20 20 7d 0a 7d 0a 0a  iBreak);.  }.}..
5c20: 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20 61 6e 20 65  /*.** Given an e
5c30: 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 2c 20  xpression list, 
5c40: 67 65 6e 65 72 61 74 65 20 61 20 4b 65 79 49 6e  generate a KeyIn
5c50: 66 6f 20 73 74 72 75 63 74 75 72 65 20 74 68 61  fo structure tha
5c60: 74 20 72 65 63 6f 72 64 73 0a 2a 2a 20 74 68 65  t records.** the
5c70: 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65   collating seque
5c80: 6e 63 65 20 66 6f 72 20 65 61 63 68 20 65 78 70  nce for each exp
5c90: 72 65 73 73 69 6f 6e 20 69 6e 20 74 68 61 74 20  ression in that 
5ca0: 65 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 2e  expression list.
5cb0: 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 45 78  .**.** If the Ex
5cc0: 70 72 4c 69 73 74 20 69 73 20 61 6e 20 4f 52 44  prList is an ORD
5cd0: 45 52 20 42 59 20 6f 72 20 47 52 4f 55 50 20 42  ER BY or GROUP B
5ce0: 59 20 63 6c 61 75 73 65 20 74 68 65 6e 20 74 68  Y clause then th
5cf0: 65 20 72 65 73 75 6c 74 69 6e 67 0a 2a 2a 20 4b  e resulting.** K
5d00: 65 79 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65  eyInfo structure
5d10: 20 69 73 20 61 70 70 72 6f 70 72 69 61 74 65 20   is appropriate 
5d20: 66 6f 72 20 69 6e 69 74 69 61 6c 69 7a 69 6e 67  for initializing
5d30: 20 61 20 76 69 72 74 75 61 6c 20 69 6e 64 65 78   a virtual index
5d40: 20 74 6f 0a 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74   to.** implement
5d50: 20 74 68 61 74 20 63 6c 61 75 73 65 2e 20 20 49   that clause.  I
5d60: 66 20 74 68 65 20 45 78 70 72 4c 69 73 74 20 69  f the ExprList i
5d70: 73 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74  s the result set
5d80: 20 6f 66 20 61 20 53 45 4c 45 43 54 0a 2a 2a 20   of a SELECT.** 
5d90: 74 68 65 6e 20 74 68 65 20 4b 65 79 49 6e 66 6f  then the KeyInfo
5da0: 20 73 74 72 75 63 74 75 72 65 20 69 73 20 61 70   structure is ap
5db0: 70 72 6f 70 72 69 61 74 65 20 66 6f 72 20 69 6e  propriate for in
5dc0: 69 74 69 61 6c 69 7a 69 6e 67 20 61 20 76 69 72  itializing a vir
5dd0: 74 75 61 6c 0a 2a 2a 20 69 6e 64 65 78 20 74 6f  tual.** index to
5de0: 20 69 6d 70 6c 65 6d 65 6e 74 20 61 20 44 49 53   implement a DIS
5df0: 54 49 4e 43 54 20 74 65 73 74 2e 0a 2a 2a 0a 2a  TINCT test..**.*
5e00: 2a 20 53 70 61 63 65 20 74 6f 20 68 6f 6c 64 20  * Space to hold 
5e10: 74 68 65 20 4b 65 79 49 6e 66 6f 20 73 74 72 75  the KeyInfo stru
5e20: 63 74 75 72 65 20 69 73 20 6f 62 74 61 69 6e 20  cture is obtain 
5e30: 66 72 6f 6d 20 6d 61 6c 6c 6f 63 2e 20 20 54 68  from malloc.  Th
5e40: 65 20 63 61 6c 6c 69 6e 67 0a 2a 2a 20 66 75 6e  e calling.** fun
5e50: 63 74 69 6f 6e 20 69 73 20 72 65 73 70 6f 6e 73  ction is respons
5e60: 69 62 6c 65 20 66 6f 72 20 73 65 65 69 6e 67 20  ible for seeing 
5e70: 74 68 61 74 20 74 68 69 73 20 73 74 72 75 63 74  that this struct
5e80: 75 72 65 20 69 73 20 65 76 65 6e 74 75 61 6c 6c  ure is eventuall
5e90: 79 0a 2a 2a 20 66 72 65 65 64 2e 20 20 41 64 64  y.** freed.  Add
5ea0: 20 74 68 65 20 4b 65 79 49 6e 66 6f 20 73 74 72   the KeyInfo str
5eb0: 75 63 74 75 72 65 20 74 6f 20 74 68 65 20 50 34  ucture to the P4
5ec0: 20 66 69 65 6c 64 20 6f 66 20 61 6e 20 6f 70 63   field of an opc
5ed0: 6f 64 65 20 75 73 69 6e 67 0a 2a 2a 20 50 34 5f  ode using.** P4_
5ee0: 4b 45 59 49 4e 46 4f 5f 48 41 4e 44 4f 46 46 20  KEYINFO_HANDOFF 
5ef0: 69 73 20 74 68 65 20 75 73 75 61 6c 20 77 61 79  is the usual way
5f00: 20 6f 66 20 64 65 61 6c 69 6e 67 20 77 69 74 68   of dealing with
5f10: 20 74 68 69 73 2e 0a 2a 2f 0a 73 74 61 74 69 63   this..*/.static
5f20: 20 4b 65 79 49 6e 66 6f 20 2a 6b 65 79 49 6e 66   KeyInfo *keyInf
5f30: 6f 46 72 6f 6d 45 78 70 72 4c 69 73 74 28 50 61  oFromExprList(Pa
5f40: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70  rse *pParse, Exp
5f50: 72 4c 69 73 74 20 2a 70 4c 69 73 74 29 7b 0a 20  rList *pList){. 
5f60: 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70   sqlite3 *db = p
5f70: 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 69 6e 74  Parse->db;.  int
5f80: 20 6e 45 78 70 72 3b 0a 20 20 4b 65 79 49 6e 66   nExpr;.  KeyInf
5f90: 6f 20 2a 70 49 6e 66 6f 3b 0a 20 20 73 74 72 75  o *pInfo;.  stru
5fa0: 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d  ct ExprList_item
5fb0: 20 2a 70 49 74 65 6d 3b 0a 20 20 69 6e 74 20 69   *pItem;.  int i
5fc0: 3b 0a 0a 20 20 6e 45 78 70 72 20 3d 20 70 4c 69  ;..  nExpr = pLi
5fd0: 73 74 2d 3e 6e 45 78 70 72 3b 0a 20 20 70 49 6e  st->nExpr;.  pIn
5fe0: 66 6f 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61  fo = sqlite3DbMa
5ff0: 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 73 69 7a  llocZero(db, siz
6000: 65 6f 66 28 2a 70 49 6e 66 6f 29 20 2b 20 6e 45  eof(*pInfo) + nE
6010: 78 70 72 2a 28 73 69 7a 65 6f 66 28 43 6f 6c 6c  xpr*(sizeof(Coll
6020: 53 65 71 2a 29 2b 31 29 20 29 3b 0a 20 20 69 66  Seq*)+1) );.  if
6030: 28 20 70 49 6e 66 6f 20 29 7b 0a 20 20 20 20 70  ( pInfo ){.    p
6040: 49 6e 66 6f 2d 3e 61 53 6f 72 74 4f 72 64 65 72  Info->aSortOrder
6050: 20 3d 20 28 75 38 2a 29 26 70 49 6e 66 6f 2d 3e   = (u8*)&pInfo->
6060: 61 43 6f 6c 6c 5b 6e 45 78 70 72 5d 3b 0a 20 20  aColl[nExpr];.  
6070: 20 20 70 49 6e 66 6f 2d 3e 6e 46 69 65 6c 64 20    pInfo->nField 
6080: 3d 20 6e 45 78 70 72 3b 0a 20 20 20 20 70 49 6e  = nExpr;.    pIn
6090: 66 6f 2d 3e 65 6e 63 20 3d 20 45 4e 43 28 64 62  fo->enc = ENC(db
60a0: 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 2c 20  );.    for(i=0, 
60b0: 70 49 74 65 6d 3d 70 4c 69 73 74 2d 3e 61 3b 20  pItem=pList->a; 
60c0: 69 3c 6e 45 78 70 72 3b 20 69 2b 2b 2c 20 70 49  i<nExpr; i++, pI
60d0: 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 43 6f  tem++){.      Co
60e0: 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 3b 0a 20 20  llSeq *pColl;.  
60f0: 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69      pColl = sqli
6100: 74 65 33 45 78 70 72 43 6f 6c 6c 53 65 71 28 70  te3ExprCollSeq(p
6110: 50 61 72 73 65 2c 20 70 49 74 65 6d 2d 3e 70 45  Parse, pItem->pE
6120: 78 70 72 29 3b 0a 20 20 20 20 20 20 69 66 28 20  xpr);.      if( 
6130: 21 70 43 6f 6c 6c 20 29 7b 0a 20 20 20 20 20 20  !pColl ){.      
6140: 20 20 70 43 6f 6c 6c 20 3d 20 64 62 2d 3e 70 44    pColl = db->pD
6150: 66 6c 74 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 7d  fltColl;.      }
6160: 0a 20 20 20 20 20 20 70 49 6e 66 6f 2d 3e 61 43  .      pInfo->aC
6170: 6f 6c 6c 5b 69 5d 20 3d 20 70 43 6f 6c 6c 3b 0a  oll[i] = pColl;.
6180: 20 20 20 20 20 20 70 49 6e 66 6f 2d 3e 61 53 6f        pInfo->aSo
6190: 72 74 4f 72 64 65 72 5b 69 5d 20 3d 20 70 49 74  rtOrder[i] = pIt
61a0: 65 6d 2d 3e 73 6f 72 74 4f 72 64 65 72 3b 0a 20  em->sortOrder;. 
61b0: 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
61c0: 6e 20 70 49 6e 66 6f 3b 0a 7d 0a 0a 0a 2f 2a 0a  n pInfo;.}.../*.
61d0: 2a 2a 20 49 66 20 74 68 65 20 69 6e 6e 65 72 20  ** If the inner 
61e0: 6c 6f 6f 70 20 77 61 73 20 67 65 6e 65 72 61 74  loop was generat
61f0: 65 64 20 75 73 69 6e 67 20 61 20 6e 6f 6e 2d 6e  ed using a non-n
6200: 75 6c 6c 20 70 4f 72 64 65 72 42 79 20 61 72 67  ull pOrderBy arg
6210: 75 6d 65 6e 74 2c 0a 2a 2a 20 74 68 65 6e 20 74  ument,.** then t
6220: 68 65 20 72 65 73 75 6c 74 73 20 77 65 72 65 20  he results were 
6230: 70 6c 61 63 65 64 20 69 6e 20 61 20 73 6f 72 74  placed in a sort
6240: 65 72 2e 20 20 41 66 74 65 72 20 74 68 65 20 6c  er.  After the l
6250: 6f 6f 70 20 69 73 20 74 65 72 6d 69 6e 61 74 65  oop is terminate
6260: 64 0a 2a 2a 20 77 65 20 6e 65 65 64 20 74 6f 20  d.** we need to 
6270: 72 75 6e 20 74 68 65 20 73 6f 72 74 65 72 20 61  run the sorter a
6280: 6e 64 20 6f 75 74 70 75 74 20 74 68 65 20 72 65  nd output the re
6290: 73 75 6c 74 73 2e 20 20 54 68 65 20 66 6f 6c 6c  sults.  The foll
62a0: 6f 77 69 6e 67 0a 2a 2a 20 72 6f 75 74 69 6e 65  owing.** routine
62b0: 20 67 65 6e 65 72 61 74 65 73 20 74 68 65 20 63   generates the c
62c0: 6f 64 65 20 6e 65 65 64 65 64 20 74 6f 20 64 6f  ode needed to do
62d0: 20 74 68 61 74 2e 0a 2a 2f 0a 73 74 61 74 69 63   that..*/.static
62e0: 20 76 6f 69 64 20 67 65 6e 65 72 61 74 65 53 6f   void generateSo
62f0: 72 74 54 61 69 6c 28 0a 20 20 50 61 72 73 65 20  rtTail(.  Parse 
6300: 2a 70 50 61 72 73 65 2c 20 20 20 20 2f 2a 20 50  *pParse,    /* P
6310: 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a  arsing context *
6320: 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 2c 20 20  /.  Select *p,  
6330: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 53 45 4c        /* The SEL
6340: 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f  ECT statement */
6350: 0a 20 20 56 64 62 65 20 2a 76 2c 20 20 20 20 20  .  Vdbe *v,     
6360: 20 20 20 20 20 2f 2a 20 47 65 6e 65 72 61 74 65       /* Generate
6370: 20 63 6f 64 65 20 69 6e 74 6f 20 74 68 69 73 20   code into this 
6380: 56 44 42 45 20 2a 2f 0a 20 20 69 6e 74 20 6e 43  VDBE */.  int nC
6390: 6f 6c 75 6d 6e 2c 20 20 20 20 20 20 2f 2a 20 4e  olumn,      /* N
63a0: 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73  umber of columns
63b0: 20 6f 66 20 64 61 74 61 20 2a 2f 0a 20 20 53 65   of data */.  Se
63c0: 6c 65 63 74 44 65 73 74 20 2a 70 44 65 73 74 20  lectDest *pDest 
63d0: 2f 2a 20 57 72 69 74 65 20 74 68 65 20 73 6f 72  /* Write the sor
63e0: 74 65 64 20 72 65 73 75 6c 74 73 20 68 65 72 65  ted results here
63f0: 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 62 72 6b   */.){.  int brk
6400: 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61   = sqlite3VdbeMa
6410: 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 69 6e  keLabel(v);.  in
6420: 74 20 63 6f 6e 74 20 3d 20 73 71 6c 69 74 65 33  t cont = sqlite3
6430: 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29  VdbeMakeLabel(v)
6440: 3b 0a 20 20 69 6e 74 20 61 64 64 72 3b 0a 20 20  ;.  int addr;.  
6450: 69 6e 74 20 69 54 61 62 3b 0a 20 20 69 6e 74 20  int iTab;.  int 
6460: 70 73 65 75 64 6f 54 61 62 20 3d 20 30 3b 0a 20  pseudoTab = 0;. 
6470: 20 45 78 70 72 4c 69 73 74 20 2a 70 4f 72 64 65   ExprList *pOrde
6480: 72 42 79 20 3d 20 70 2d 3e 70 4f 72 64 65 72 42  rBy = p->pOrderB
6490: 79 3b 0a 0a 20 20 69 6e 74 20 65 44 65 73 74 20  y;..  int eDest 
64a0: 3d 20 70 44 65 73 74 2d 3e 65 44 65 73 74 3b 0a  = pDest->eDest;.
64b0: 20 20 69 6e 74 20 69 50 61 72 6d 20 3d 20 70 44    int iParm = pD
64c0: 65 73 74 2d 3e 69 50 61 72 6d 3b 0a 0a 20 20 69  est->iParm;..  i
64d0: 6e 74 20 72 65 67 52 6f 77 3b 0a 20 20 69 6e 74  nt regRow;.  int
64e0: 20 72 65 67 52 6f 77 69 64 3b 0a 0a 20 20 69 54   regRowid;..  iT
64f0: 61 62 20 3d 20 70 4f 72 64 65 72 42 79 2d 3e 69  ab = pOrderBy->i
6500: 45 43 75 72 73 6f 72 3b 0a 20 20 69 66 28 20 65  ECursor;.  if( e
6510: 44 65 73 74 3d 3d 53 52 54 5f 43 61 6c 6c 62 61  Dest==SRT_Callba
6520: 63 6b 20 7c 7c 20 65 44 65 73 74 3d 3d 53 52 54  ck || eDest==SRT
6530: 5f 53 75 62 72 6f 75 74 69 6e 65 20 29 7b 0a 20  _Subroutine ){. 
6540: 20 20 20 70 73 65 75 64 6f 54 61 62 20 3d 20 70     pseudoTab = p
6550: 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20  Parse->nTab++;. 
6560: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
6570: 64 4f 70 32 28 76 2c 20 4f 50 5f 53 65 74 4e 75  dOp2(v, OP_SetNu
6580: 6d 43 6f 6c 75 6d 6e 73 2c 20 30 2c 20 6e 43 6f  mColumns, 0, nCo
6590: 6c 75 6d 6e 29 3b 0a 20 20 20 20 73 71 6c 69 74  lumn);.    sqlit
65a0: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
65b0: 4f 50 5f 4f 70 65 6e 50 73 65 75 64 6f 2c 20 70  OP_OpenPseudo, p
65c0: 73 65 75 64 6f 54 61 62 2c 20 30 29 3b 0a 20 20  seudoTab, 0);.  
65d0: 7d 0a 20 20 61 64 64 72 20 3d 20 31 20 2b 20 73  }.  addr = 1 + s
65e0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
65f0: 28 76 2c 20 4f 50 5f 53 6f 72 74 2c 20 69 54 61  (v, OP_Sort, iTa
6600: 62 2c 20 62 72 6b 29 3b 0a 20 20 63 6f 64 65 4f  b, brk);.  codeO
6610: 66 66 73 65 74 28 76 2c 20 70 2c 20 63 6f 6e 74  ffset(v, p, cont
6620: 29 3b 0a 20 20 72 65 67 52 6f 77 20 3d 20 73 71  );.  regRow = sq
6630: 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65 67 28  lite3GetTempReg(
6640: 70 50 61 72 73 65 29 3b 0a 20 20 72 65 67 52 6f  pParse);.  regRo
6650: 77 69 64 20 3d 20 73 71 6c 69 74 65 33 47 65 74  wid = sqlite3Get
6660: 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b  TempReg(pParse);
6670: 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  .  sqlite3VdbeAd
6680: 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d  dOp3(v, OP_Colum
6690: 6e 2c 20 69 54 61 62 2c 20 70 4f 72 64 65 72 42  n, iTab, pOrderB
66a0: 79 2d 3e 6e 45 78 70 72 20 2b 20 31 2c 20 72 65  y->nExpr + 1, re
66b0: 67 52 6f 77 29 3b 0a 20 20 73 77 69 74 63 68 28  gRow);.  switch(
66c0: 20 65 44 65 73 74 20 29 7b 0a 20 20 20 20 63 61   eDest ){.    ca
66d0: 73 65 20 53 52 54 5f 54 61 62 6c 65 3a 0a 20 20  se SRT_Table:.  
66e0: 20 20 63 61 73 65 20 53 52 54 5f 45 70 68 65 6d    case SRT_Ephem
66f0: 54 61 62 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c  Tab: {.      sql
6700: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
6710: 2c 20 4f 50 5f 4e 65 77 52 6f 77 69 64 2c 20 69  , OP_NewRowid, i
6720: 50 61 72 6d 2c 20 72 65 67 52 6f 77 69 64 29 3b  Parm, regRowid);
6730: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
6740: 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 49  beAddOp3(v, OP_I
6750: 6e 73 65 72 74 2c 20 69 50 61 72 6d 2c 20 72 65  nsert, iParm, re
6760: 67 52 6f 77 2c 20 72 65 67 52 6f 77 69 64 29 3b  gRow, regRowid);
6770: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
6780: 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20 4f 50  beChangeP5(v, OP
6790: 46 4c 41 47 5f 41 50 50 45 4e 44 29 3b 0a 20 20  FLAG_APPEND);.  
67a0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
67b0: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
67c0: 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 20 20  OMIT_SUBQUERY.  
67d0: 20 20 63 61 73 65 20 53 52 54 5f 53 65 74 3a 20    case SRT_Set: 
67e0: 7b 0a 20 20 20 20 20 20 69 6e 74 20 6a 31 3b 0a  {.      int j1;.
67f0: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6e 43        assert( nC
6800: 6f 6c 75 6d 6e 3d 3d 31 20 29 3b 0a 20 20 20 20  olumn==1 );.    
6810: 20 20 6a 31 20 3d 20 73 71 6c 69 74 65 33 56 64    j1 = sqlite3Vd
6820: 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 49  beAddOp1(v, OP_I
6830: 73 4e 75 6c 6c 2c 20 72 65 67 52 6f 77 29 3b 0a  sNull, regRow);.
6840: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
6850: 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 4d 61  eAddOp4(v, OP_Ma
6860: 6b 65 52 65 63 6f 72 64 2c 20 72 65 67 52 6f 77  keRecord, regRow
6870: 2c 20 31 2c 20 72 65 67 52 6f 77 69 64 2c 20 26  , 1, regRowid, &
6880: 70 2d 3e 61 66 66 69 6e 69 74 79 2c 20 31 29 3b  p->affinity, 1);
6890: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
68a0: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49  beAddOp2(v, OP_I
68b0: 64 78 49 6e 73 65 72 74 2c 20 69 50 61 72 6d 2c  dxInsert, iParm,
68c0: 20 72 65 67 52 6f 77 69 64 29 3b 0a 20 20 20 20   regRowid);.    
68d0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d    sqlite3VdbeJum
68e0: 70 48 65 72 65 28 76 2c 20 6a 31 29 3b 0a 20 20  pHere(v, j1);.  
68f0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
6900: 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f 4d 65  .    case SRT_Me
6910: 6d 3a 20 7b 0a 20 20 20 20 20 20 61 73 73 65 72  m: {.      asser
6920: 74 28 20 6e 43 6f 6c 75 6d 6e 3d 3d 31 20 29 3b  t( nColumn==1 );
6930: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
6940: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4d  beAddOp2(v, OP_M
6950: 6f 76 65 2c 20 72 65 67 52 6f 77 2c 20 69 50 61  ove, regRow, iPa
6960: 72 6d 29 3b 0a 20 20 20 20 20 20 2f 2a 20 54 68  rm);.      /* Th
6970: 65 20 4c 49 4d 49 54 20 63 6c 61 75 73 65 20 77  e LIMIT clause w
6980: 69 6c 6c 20 74 65 72 6d 69 6e 61 74 65 20 74 68  ill terminate th
6990: 65 20 6c 6f 6f 70 20 66 6f 72 20 75 73 20 2a 2f  e loop for us */
69a0: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
69b0: 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 63    }.#endif.    c
69c0: 61 73 65 20 53 52 54 5f 43 61 6c 6c 62 61 63 6b  ase SRT_Callback
69d0: 3a 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f 53  :.    case SRT_S
69e0: 75 62 72 6f 75 74 69 6e 65 3a 20 7b 0a 20 20 20  ubroutine: {.   
69f0: 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 20 20     int i;.      
6a00: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
6a10: 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c  2(v, OP_Integer,
6a20: 20 31 2c 20 72 65 67 52 6f 77 69 64 29 3b 0a 20   1, regRowid);. 
6a30: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
6a40: 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 49 6e 73  AddOp3(v, OP_Ins
6a50: 65 72 74 2c 20 70 73 65 75 64 6f 54 61 62 2c 20  ert, pseudoTab, 
6a60: 72 65 67 52 6f 77 2c 20 72 65 67 52 6f 77 69 64  regRow, regRowid
6a70: 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30  );.      for(i=0
6a80: 3b 20 69 3c 6e 43 6f 6c 75 6d 6e 3b 20 69 2b 2b  ; i<nColumn; i++
6a90: 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
6aa0: 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
6ab0: 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 70 73 65 75 64  OP_Column, pseud
6ac0: 6f 54 61 62 2c 20 69 2c 20 70 44 65 73 74 2d 3e  oTab, i, pDest->
6ad0: 69 4d 65 6d 2b 69 29 3b 0a 20 20 20 20 20 20 7d  iMem+i);.      }
6ae0: 0a 20 20 20 20 20 20 69 66 28 20 65 44 65 73 74  .      if( eDest
6af0: 3d 3d 53 52 54 5f 43 61 6c 6c 62 61 63 6b 20 29  ==SRT_Callback )
6b00: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
6b10: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
6b20: 50 5f 52 65 73 75 6c 74 52 6f 77 2c 20 70 44 65  P_ResultRow, pDe
6b30: 73 74 2d 3e 69 4d 65 6d 2c 20 6e 43 6f 6c 75 6d  st->iMem, nColum
6b40: 6e 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  n);.      }else{
6b50: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
6b60: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
6b70: 5f 47 6f 73 75 62 2c 20 30 2c 20 69 50 61 72 6d  _Gosub, 0, iParm
6b80: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
6b90: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
6ba0: 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20    default: {.   
6bb0: 20 20 20 2f 2a 20 44 6f 20 6e 6f 74 68 69 6e 67     /* Do nothing
6bc0: 20 2a 2f 0a 20 20 20 20 20 20 62 72 65 61 6b 3b   */.      break;
6bd0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c  .    }.  }.  sql
6be0: 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52  ite3ReleaseTempR
6bf0: 65 67 28 70 50 61 72 73 65 2c 20 72 65 67 52 6f  eg(pParse, regRo
6c00: 77 29 3b 0a 20 20 73 71 6c 69 74 65 33 52 65 6c  w);.  sqlite3Rel
6c10: 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72  easeTempReg(pPar
6c20: 73 65 2c 20 72 65 67 52 6f 77 69 64 29 3b 0a 0a  se, regRowid);..
6c30: 20 20 2f 2a 20 4a 75 6d 70 20 74 6f 20 74 68 65    /* Jump to the
6c40: 20 65 6e 64 20 6f 66 20 74 68 65 20 6c 6f 6f 70   end of the loop
6c50: 20 77 68 65 6e 20 74 68 65 20 4c 49 4d 49 54 20   when the LIMIT 
6c60: 69 73 20 72 65 61 63 68 65 64 0a 20 20 2a 2f 0a  is reached.  */.
6c70: 20 20 69 66 28 20 70 2d 3e 69 4c 69 6d 69 74 3e    if( p->iLimit>
6c80: 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  =0 ){.    sqlite
6c90: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
6ca0: 50 5f 41 64 64 49 6d 6d 2c 20 70 2d 3e 69 4c 69  P_AddImm, p->iLi
6cb0: 6d 69 74 2c 20 2d 31 29 3b 0a 20 20 20 20 73 71  mit, -1);.    sq
6cc0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
6cd0: 76 2c 20 4f 50 5f 49 66 5a 65 72 6f 2c 20 70 2d  v, OP_IfZero, p-
6ce0: 3e 69 4c 69 6d 69 74 2c 20 62 72 6b 29 3b 0a 20  >iLimit, brk);. 
6cf0: 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 62 6f 74   }..  /* The bot
6d00: 74 6f 6d 20 6f 66 20 74 68 65 20 6c 6f 6f 70 0a  tom of the loop.
6d10: 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 56 64    */.  sqlite3Vd
6d20: 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76  beResolveLabel(v
6d30: 2c 20 63 6f 6e 74 29 3b 0a 20 20 73 71 6c 69 74  , cont);.  sqlit
6d40: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
6d50: 4f 50 5f 4e 65 78 74 2c 20 69 54 61 62 2c 20 61  OP_Next, iTab, a
6d60: 64 64 72 29 3b 0a 20 20 73 71 6c 69 74 65 33 56  ddr);.  sqlite3V
6d70: 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28  dbeResolveLabel(
6d80: 76 2c 20 62 72 6b 29 3b 0a 20 20 69 66 28 20 65  v, brk);.  if( e
6d90: 44 65 73 74 3d 3d 53 52 54 5f 43 61 6c 6c 62 61  Dest==SRT_Callba
6da0: 63 6b 20 7c 7c 20 65 44 65 73 74 3d 3d 53 52 54  ck || eDest==SRT
6db0: 5f 53 75 62 72 6f 75 74 69 6e 65 20 29 7b 0a 20  _Subroutine ){. 
6dc0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
6dd0: 64 4f 70 32 28 76 2c 20 4f 50 5f 43 6c 6f 73 65  dOp2(v, OP_Close
6de0: 2c 20 70 73 65 75 64 6f 54 61 62 2c 20 30 29 3b  , pseudoTab, 0);
6df0: 0a 20 20 7d 0a 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  .  }..}../*.** R
6e00: 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20  eturn a pointer 
6e10: 74 6f 20 61 20 73 74 72 69 6e 67 20 63 6f 6e 74  to a string cont
6e20: 61 69 6e 69 6e 67 20 74 68 65 20 27 64 65 63 6c  aining the 'decl
6e30: 61 72 61 74 69 6f 6e 20 74 79 70 65 27 20 6f 66  aration type' of
6e40: 20 74 68 65 0a 2a 2a 20 65 78 70 72 65 73 73 69   the.** expressi
6e50: 6f 6e 20 70 45 78 70 72 2e 20 54 68 65 20 73 74  on pExpr. The st
6e60: 72 69 6e 67 20 6d 61 79 20 62 65 20 74 72 65 61  ring may be trea
6e70: 74 65 64 20 61 73 20 73 74 61 74 69 63 20 62 79  ted as static by
6e80: 20 74 68 65 20 63 61 6c 6c 65 72 2e 0a 2a 2a 0a   the caller..**.
6e90: 2a 2a 20 54 68 65 20 64 65 63 6c 61 72 61 74 69  ** The declarati
6ea0: 6f 6e 20 74 79 70 65 20 69 73 20 74 68 65 20 65  on type is the e
6eb0: 78 61 63 74 20 64 61 74 61 74 79 70 65 20 64 65  xact datatype de
6ec0: 66 69 6e 69 74 69 6f 6e 20 65 78 74 72 61 63 74  finition extract
6ed0: 65 64 20 66 72 6f 6d 20 74 68 65 0a 2a 2a 20 6f  ed from the.** o
6ee0: 72 69 67 69 6e 61 6c 20 43 52 45 41 54 45 20 54  riginal CREATE T
6ef0: 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 20 69  ABLE statement i
6f00: 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  f the expression
6f10: 20 69 73 20 61 20 63 6f 6c 75 6d 6e 2e 20 54 68   is a column. Th
6f20: 65 0a 2a 2a 20 64 65 63 6c 61 72 61 74 69 6f 6e  e.** declaration
6f30: 20 74 79 70 65 20 66 6f 72 20 61 20 52 4f 57 49   type for a ROWI
6f40: 44 20 66 69 65 6c 64 20 69 73 20 49 4e 54 45 47  D field is INTEG
6f50: 45 52 2e 20 45 78 61 63 74 6c 79 20 77 68 65 6e  ER. Exactly when
6f60: 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 0a 2a   an expression.*
6f70: 2a 20 69 73 20 63 6f 6e 73 69 64 65 72 65 64 20  * is considered 
6f80: 61 20 63 6f 6c 75 6d 6e 20 63 61 6e 20 62 65 20  a column can be 
6f90: 63 6f 6d 70 6c 65 78 20 69 6e 20 74 68 65 20 70  complex in the p
6fa0: 72 65 73 65 6e 63 65 20 6f 66 20 73 75 62 71 75  resence of subqu
6fb0: 65 72 69 65 73 2e 20 54 68 65 0a 2a 2a 20 72 65  eries. The.** re
6fc0: 73 75 6c 74 2d 73 65 74 20 65 78 70 72 65 73 73  sult-set express
6fd0: 69 6f 6e 20 69 6e 20 61 6c 6c 20 6f 66 20 74 68  ion in all of th
6fe0: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 53 45 4c 45  e following SELE
6ff0: 43 54 20 73 74 61 74 65 6d 65 6e 74 73 20 69 73  CT statements is
7000: 20 0a 2a 2a 20 63 6f 6e 73 69 64 65 72 65 64 20   .** considered 
7010: 61 20 63 6f 6c 75 6d 6e 20 62 79 20 74 68 69 73  a column by this
7020: 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a   function..**.**
7030: 20 20 20 53 45 4c 45 43 54 20 63 6f 6c 20 46 52     SELECT col FR
7040: 4f 4d 20 74 62 6c 3b 0a 2a 2a 20 20 20 53 45 4c  OM tbl;.**   SEL
7050: 45 43 54 20 28 53 45 4c 45 43 54 20 63 6f 6c 20  ECT (SELECT col 
7060: 46 52 4f 4d 20 74 62 6c 3b 0a 2a 2a 20 20 20 53  FROM tbl;.**   S
7070: 45 4c 45 43 54 20 28 53 45 4c 45 43 54 20 63 6f  ELECT (SELECT co
7080: 6c 20 46 52 4f 4d 20 74 62 6c 29 3b 0a 2a 2a 20  l FROM tbl);.** 
7090: 20 20 53 45 4c 45 43 54 20 61 62 63 20 46 52 4f    SELECT abc FRO
70a0: 4d 20 28 53 45 4c 45 43 54 20 63 6f 6c 20 41 53  M (SELECT col AS
70b0: 20 61 62 63 20 46 52 4f 4d 20 74 62 6c 29 3b 0a   abc FROM tbl);.
70c0: 2a 2a 20 0a 2a 2a 20 54 68 65 20 64 65 63 6c 61  ** .** The decla
70d0: 72 61 74 69 6f 6e 20 74 79 70 65 20 66 6f 72 20  ration type for 
70e0: 61 6e 79 20 65 78 70 72 65 73 73 69 6f 6e 20 6f  any expression o
70f0: 74 68 65 72 20 74 68 61 6e 20 61 20 63 6f 6c 75  ther than a colu
7100: 6d 6e 20 69 73 20 4e 55 4c 4c 2e 0a 2a 2f 0a 73  mn is NULL..*/.s
7110: 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72  tatic const char
7120: 20 2a 63 6f 6c 75 6d 6e 54 79 70 65 28 0a 20 20   *columnType(.  
7130: 4e 61 6d 65 43 6f 6e 74 65 78 74 20 2a 70 4e 43  NameContext *pNC
7140: 2c 20 0a 20 20 45 78 70 72 20 2a 70 45 78 70 72  , .  Expr *pExpr
7150: 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  ,.  const char *
7160: 2a 70 7a 4f 72 69 67 69 6e 44 62 2c 0a 20 20 63  *pzOriginDb,.  c
7170: 6f 6e 73 74 20 63 68 61 72 20 2a 2a 70 7a 4f 72  onst char **pzOr
7180: 69 67 69 6e 54 61 62 2c 0a 20 20 63 6f 6e 73 74  iginTab,.  const
7190: 20 63 68 61 72 20 2a 2a 70 7a 4f 72 69 67 69 6e   char **pzOrigin
71a0: 43 6f 6c 0a 29 7b 0a 20 20 63 68 61 72 20 63 6f  Col.){.  char co
71b0: 6e 73 74 20 2a 7a 54 79 70 65 20 3d 20 30 3b 0a  nst *zType = 0;.
71c0: 20 20 63 68 61 72 20 63 6f 6e 73 74 20 2a 7a 4f    char const *zO
71d0: 72 69 67 69 6e 44 62 20 3d 20 30 3b 0a 20 20 63  riginDb = 0;.  c
71e0: 68 61 72 20 63 6f 6e 73 74 20 2a 7a 4f 72 69 67  har const *zOrig
71f0: 69 6e 54 61 62 20 3d 20 30 3b 0a 20 20 63 68 61  inTab = 0;.  cha
7200: 72 20 63 6f 6e 73 74 20 2a 7a 4f 72 69 67 69 6e  r const *zOrigin
7210: 43 6f 6c 20 3d 20 30 3b 0a 20 20 69 6e 74 20 6a  Col = 0;.  int j
7220: 3b 0a 20 20 69 66 28 20 70 45 78 70 72 3d 3d 30  ;.  if( pExpr==0
7230: 20 7c 7c 20 70 4e 43 2d 3e 70 53 72 63 4c 69 73   || pNC->pSrcLis
7240: 74 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b  t==0 ) return 0;
7250: 0a 0a 20 20 73 77 69 74 63 68 28 20 70 45 78 70  ..  switch( pExp
7260: 72 2d 3e 6f 70 20 29 7b 0a 20 20 20 20 63 61 73  r->op ){.    cas
7270: 65 20 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 3a  e TK_AGG_COLUMN:
7280: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 43 4f 4c  .    case TK_COL
7290: 55 4d 4e 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20  UMN: {.      /* 
72a0: 54 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69  The expression i
72b0: 73 20 61 20 63 6f 6c 75 6d 6e 2e 20 4c 6f 63 61  s a column. Loca
72c0: 74 65 20 74 68 65 20 74 61 62 6c 65 20 74 68 65  te the table the
72d0: 20 63 6f 6c 75 6d 6e 20 69 73 20 62 65 69 6e 67   column is being
72e0: 0a 20 20 20 20 20 20 2a 2a 20 65 78 74 72 61 63  .      ** extrac
72f0: 74 65 64 20 66 72 6f 6d 20 69 6e 20 4e 61 6d 65  ted from in Name
7300: 43 6f 6e 74 65 78 74 2e 70 53 72 63 4c 69 73 74  Context.pSrcList
7310: 2e 20 54 68 69 73 20 74 61 62 6c 65 20 6d 61 79  . This table may
7320: 20 62 65 20 72 65 61 6c 0a 20 20 20 20 20 20 2a   be real.      *
7330: 2a 20 64 61 74 61 62 61 73 65 20 74 61 62 6c 65  * database table
7340: 20 6f 72 20 61 20 73 75 62 71 75 65 72 79 2e 0a   or a subquery..
7350: 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 54        */.      T
7360: 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 30 3b 20  able *pTab = 0; 
7370: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 61             /* Ta
7380: 62 6c 65 20 73 74 72 75 63 74 75 72 65 20 63 6f  ble structure co
7390: 6c 75 6d 6e 20 69 73 20 65 78 74 72 61 63 74 65  lumn is extracte
73a0: 64 20 66 72 6f 6d 20 2a 2f 0a 20 20 20 20 20 20  d from */.      
73b0: 53 65 6c 65 63 74 20 2a 70 53 20 3d 20 30 3b 20  Select *pS = 0; 
73c0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
73d0: 65 6c 65 63 74 20 74 68 65 20 63 6f 6c 75 6d 6e  elect the column
73e0: 20 69 73 20 65 78 74 72 61 63 74 65 64 20 66 72   is extracted fr
73f0: 6f 6d 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20  om */.      int 
7400: 69 43 6f 6c 20 3d 20 70 45 78 70 72 2d 3e 69 43  iCol = pExpr->iC
7410: 6f 6c 75 6d 6e 3b 20 20 2f 2a 20 49 6e 64 65 78  olumn;  /* Index
7420: 20 6f 66 20 63 6f 6c 75 6d 6e 20 69 6e 20 70 54   of column in pT
7430: 61 62 20 2a 2f 0a 20 20 20 20 20 20 77 68 69 6c  ab */.      whil
7440: 65 28 20 70 4e 43 20 26 26 20 21 70 54 61 62 20  e( pNC && !pTab 
7450: 29 7b 0a 20 20 20 20 20 20 20 20 53 72 63 4c 69  ){.        SrcLi
7460: 73 74 20 2a 70 54 61 62 4c 69 73 74 20 3d 20 70  st *pTabList = p
7470: 4e 43 2d 3e 70 53 72 63 4c 69 73 74 3b 0a 20 20  NC->pSrcList;.  
7480: 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 6a 3c        for(j=0;j<
7490: 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 20 26  pTabList->nSrc &
74a0: 26 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 6a 5d  & pTabList->a[j]
74b0: 2e 69 43 75 72 73 6f 72 21 3d 70 45 78 70 72 2d  .iCursor!=pExpr-
74c0: 3e 69 54 61 62 6c 65 3b 6a 2b 2b 29 3b 0a 20 20  >iTable;j++);.  
74d0: 20 20 20 20 20 20 69 66 28 20 6a 3c 70 54 61 62        if( j<pTab
74e0: 4c 69 73 74 2d 3e 6e 53 72 63 20 29 7b 0a 20 20  List->nSrc ){.  
74f0: 20 20 20 20 20 20 20 20 70 54 61 62 20 3d 20 70          pTab = p
7500: 54 61 62 4c 69 73 74 2d 3e 61 5b 6a 5d 2e 70 54  TabList->a[j].pT
7510: 61 62 3b 0a 20 20 20 20 20 20 20 20 20 20 70 53  ab;.          pS
7520: 20 3d 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 6a   = pTabList->a[j
7530: 5d 2e 70 53 65 6c 65 63 74 3b 0a 20 20 20 20 20  ].pSelect;.     
7540: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
7550: 20 20 20 20 70 4e 43 20 3d 20 70 4e 43 2d 3e 70      pNC = pNC->p
7560: 4e 65 78 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a  Next;.        }.
7570: 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 69        }..      i
7580: 66 28 20 70 54 61 62 3d 3d 30 20 29 7b 0a 20 20  f( pTab==0 ){.  
7590: 20 20 20 20 20 20 2f 2a 20 46 49 58 20 4d 45 3a        /* FIX ME:
75a0: 0a 20 20 20 20 20 20 20 20 2a 2a 20 54 68 69 73  .        ** This
75b0: 20 63 61 6e 20 6f 63 63 75 72 73 20 69 66 20 79   can occurs if y
75c0: 6f 75 20 68 61 76 65 20 73 6f 6d 65 74 68 69 6e  ou have somethin
75d0: 67 20 6c 69 6b 65 20 22 53 45 4c 45 43 54 20 6e  g like "SELECT n
75e0: 65 77 2e 78 3b 22 20 69 6e 73 69 64 65 0a 20 20  ew.x;" inside.  
75f0: 20 20 20 20 20 20 2a 2a 20 61 20 74 72 69 67 67        ** a trigg
7600: 65 72 2e 20 20 49 6e 20 6f 74 68 65 72 20 77 6f  er.  In other wo
7610: 72 64 73 2c 20 69 66 20 79 6f 75 20 72 65 66 65  rds, if you refe
7620: 72 65 6e 63 65 20 74 68 65 20 73 70 65 63 69 61  rence the specia
7630: 6c 20 22 6e 65 77 22 0a 20 20 20 20 20 20 20 20  l "new".        
7640: 2a 2a 20 74 61 62 6c 65 20 69 6e 20 74 68 65 20  ** table in the 
7650: 72 65 73 75 6c 74 20 73 65 74 20 6f 66 20 61 20  result set of a 
7660: 73 65 6c 65 63 74 2e 20 20 57 65 20 64 6f 20 6e  select.  We do n
7670: 6f 74 20 68 61 76 65 20 61 20 67 6f 6f 64 20 77  ot have a good w
7680: 61 79 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 6f  ay.        ** to
7690: 20 66 69 6e 64 20 74 68 65 20 61 63 74 75 61 6c   find the actual
76a0: 20 74 61 62 6c 65 20 74 79 70 65 2c 20 73 6f 20   table type, so 
76b0: 63 61 6c 6c 20 69 74 20 22 54 45 58 54 22 2e 20  call it "TEXT". 
76c0: 20 54 68 69 73 20 69 73 20 72 65 61 6c 6c 79 0a   This is really.
76d0: 20 20 20 20 20 20 20 20 2a 2a 20 73 6f 6d 65 74          ** somet
76e0: 68 69 6e 67 20 6f 66 20 61 20 62 75 67 2c 20 62  hing of a bug, b
76f0: 75 74 20 49 20 64 6f 20 6e 6f 74 20 6b 6e 6f 77  ut I do not know
7700: 20 68 6f 77 20 74 6f 20 66 69 78 20 69 74 2e 0a   how to fix it..
7710: 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20          **.     
7720: 20 20 20 2a 2a 20 54 68 69 73 20 63 6f 64 65 20     ** This code 
7730: 64 6f 65 73 20 6e 6f 74 20 70 72 6f 64 75 63 65  does not produce
7740: 20 74 68 65 20 63 6f 72 72 65 63 74 20 61 6e 73   the correct ans
7750: 77 65 72 20 2d 20 69 74 20 6a 75 73 74 20 70 72  wer - it just pr
7760: 65 76 65 6e 74 73 0a 20 20 20 20 20 20 20 20 2a  events.        *
7770: 2a 20 61 20 73 65 67 66 61 75 6c 74 2e 20 20 53  * a segfault.  S
7780: 65 65 20 74 69 63 6b 65 74 20 23 31 32 32 39 2e  ee ticket #1229.
7790: 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  .        */.    
77a0: 20 20 20 20 7a 54 79 70 65 20 3d 20 22 54 45 58      zType = "TEX
77b0: 54 22 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61  T";.        brea
77c0: 6b 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  k;.      }..    
77d0: 20 20 61 73 73 65 72 74 28 20 70 54 61 62 20 29    assert( pTab )
77e0: 3b 0a 20 20 20 20 20 20 69 66 28 20 70 53 20 29  ;.      if( pS )
77f0: 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65  {.        /* The
7800: 20 22 74 61 62 6c 65 22 20 69 73 20 61 63 74 75   "table" is actu
7810: 61 6c 6c 79 20 61 20 73 75 62 2d 73 65 6c 65 63  ally a sub-selec
7820: 74 20 6f 72 20 61 20 76 69 65 77 20 69 6e 20 74  t or a view in t
7830: 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 0a 20  he FROM clause. 
7840: 20 20 20 20 20 20 20 2a 2a 20 6f 66 20 74 68 65         ** of the
7850: 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
7860: 74 2e 20 52 65 74 75 72 6e 20 74 68 65 20 64 65  t. Return the de
7870: 63 6c 61 72 61 74 69 6f 6e 20 74 79 70 65 20 61  claration type a
7880: 6e 64 20 6f 72 69 67 69 6e 0a 20 20 20 20 20 20  nd origin.      
7890: 20 20 2a 2a 20 64 61 74 61 20 66 6f 72 20 74 68    ** data for th
78a0: 65 20 72 65 73 75 6c 74 2d 73 65 74 20 63 6f 6c  e result-set col
78b0: 75 6d 6e 20 6f 66 20 74 68 65 20 73 75 62 2d 73  umn of the sub-s
78c0: 65 6c 65 63 74 2e 0a 20 20 20 20 20 20 20 20 2a  elect..        *
78d0: 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20 69 43  /.        if( iC
78e0: 6f 6c 3e 3d 30 20 26 26 20 69 43 6f 6c 3c 70 53  ol>=0 && iCol<pS
78f0: 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 20  ->pEList->nExpr 
7900: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ){.          /* 
7910: 49 66 20 69 43 6f 6c 20 69 73 20 6c 65 73 73 20  If iCol is less 
7920: 74 68 61 6e 20 7a 65 72 6f 2c 20 74 68 65 6e 20  than zero, then 
7930: 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 72  the expression r
7940: 65 71 75 65 73 74 73 20 74 68 65 0a 20 20 20 20  equests the.    
7950: 20 20 20 20 20 20 2a 2a 20 72 6f 77 69 64 20 6f        ** rowid o
7960: 66 20 74 68 65 20 73 75 62 2d 73 65 6c 65 63 74  f the sub-select
7970: 20 6f 72 20 76 69 65 77 2e 20 54 68 69 73 20 65   or view. This e
7980: 78 70 72 65 73 73 69 6f 6e 20 69 73 20 6c 65 67  xpression is leg
7990: 61 6c 20 28 73 65 65 20 0a 20 20 20 20 20 20 20  al (see .       
79a0: 20 20 20 2a 2a 20 74 65 73 74 20 63 61 73 65 20     ** test case 
79b0: 6d 69 73 63 32 2e 32 2e 32 29 20 2d 20 69 74 20  misc2.2.2) - it 
79c0: 61 6c 77 61 79 73 20 65 76 61 6c 75 61 74 65 73  always evaluates
79d0: 20 74 6f 20 4e 55 4c 4c 2e 0a 20 20 20 20 20 20   to NULL..      
79e0: 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20      */.         
79f0: 20 4e 61 6d 65 43 6f 6e 74 65 78 74 20 73 4e 43   NameContext sNC
7a00: 3b 0a 20 20 20 20 20 20 20 20 20 20 45 78 70 72  ;.          Expr
7a10: 20 2a 70 20 3d 20 70 53 2d 3e 70 45 4c 69 73 74   *p = pS->pEList
7a20: 2d 3e 61 5b 69 43 6f 6c 5d 2e 70 45 78 70 72 3b  ->a[iCol].pExpr;
7a30: 0a 20 20 20 20 20 20 20 20 20 20 73 4e 43 2e 70  .          sNC.p
7a40: 53 72 63 4c 69 73 74 20 3d 20 70 53 2d 3e 70 53  SrcList = pS->pS
7a50: 72 63 3b 0a 20 20 20 20 20 20 20 20 20 20 73 4e  rc;.          sN
7a60: 43 2e 70 4e 65 78 74 20 3d 20 30 3b 0a 20 20 20  C.pNext = 0;.   
7a70: 20 20 20 20 20 20 20 73 4e 43 2e 70 50 61 72 73         sNC.pPars
7a80: 65 20 3d 20 70 4e 43 2d 3e 70 50 61 72 73 65 3b  e = pNC->pParse;
7a90: 0a 20 20 20 20 20 20 20 20 20 20 7a 54 79 70 65  .          zType
7aa0: 20 3d 20 63 6f 6c 75 6d 6e 54 79 70 65 28 26 73   = columnType(&s
7ab0: 4e 43 2c 20 70 2c 20 26 7a 4f 72 69 67 69 6e 44  NC, p, &zOriginD
7ac0: 62 2c 20 26 7a 4f 72 69 67 69 6e 54 61 62 2c 20  b, &zOriginTab, 
7ad0: 26 7a 4f 72 69 67 69 6e 43 6f 6c 29 3b 20 0a 20  &zOriginCol); . 
7ae0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
7af0: 65 6c 73 65 20 69 66 28 20 70 54 61 62 2d 3e 70  else if( pTab->p
7b00: 53 63 68 65 6d 61 20 29 7b 0a 20 20 20 20 20 20  Schema ){.      
7b10: 20 20 2f 2a 20 41 20 72 65 61 6c 20 74 61 62 6c    /* A real tabl
7b20: 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 61 73 73  e */.        ass
7b30: 65 72 74 28 20 21 70 53 20 29 3b 0a 20 20 20 20  ert( !pS );.    
7b40: 20 20 20 20 69 66 28 20 69 43 6f 6c 3c 30 20 29      if( iCol<0 )
7b50: 20 69 43 6f 6c 20 3d 20 70 54 61 62 2d 3e 69 50   iCol = pTab->iP
7b60: 4b 65 79 3b 0a 20 20 20 20 20 20 20 20 61 73 73  Key;.        ass
7b70: 65 72 74 28 20 69 43 6f 6c 3d 3d 2d 31 20 7c 7c  ert( iCol==-1 ||
7b80: 20 28 69 43 6f 6c 3e 3d 30 20 26 26 20 69 43 6f   (iCol>=0 && iCo
7b90: 6c 3c 70 54 61 62 2d 3e 6e 43 6f 6c 29 20 29 3b  l<pTab->nCol) );
7ba0: 0a 20 20 20 20 20 20 20 20 69 66 28 20 69 43 6f  .        if( iCo
7bb0: 6c 3c 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  l<0 ){.         
7bc0: 20 7a 54 79 70 65 20 3d 20 22 49 4e 54 45 47 45   zType = "INTEGE
7bd0: 52 22 3b 0a 20 20 20 20 20 20 20 20 20 20 7a 4f  R";.          zO
7be0: 72 69 67 69 6e 43 6f 6c 20 3d 20 22 72 6f 77 69  riginCol = "rowi
7bf0: 64 22 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  d";.        }els
7c00: 65 7b 0a 20 20 20 20 20 20 20 20 20 20 7a 54 79  e{.          zTy
7c10: 70 65 20 3d 20 70 54 61 62 2d 3e 61 43 6f 6c 5b  pe = pTab->aCol[
7c20: 69 43 6f 6c 5d 2e 7a 54 79 70 65 3b 0a 20 20 20  iCol].zType;.   
7c30: 20 20 20 20 20 20 20 7a 4f 72 69 67 69 6e 43 6f         zOriginCo
7c40: 6c 20 3d 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 69  l = pTab->aCol[i
7c50: 43 6f 6c 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20  Col].zName;.    
7c60: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7a 4f      }.        zO
7c70: 72 69 67 69 6e 54 61 62 20 3d 20 70 54 61 62 2d  riginTab = pTab-
7c80: 3e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20 20 20  >zName;.        
7c90: 69 66 28 20 70 4e 43 2d 3e 70 50 61 72 73 65 20  if( pNC->pParse 
7ca0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74  ){.          int
7cb0: 20 69 44 62 20 3d 20 73 71 6c 69 74 65 33 53 63   iDb = sqlite3Sc
7cc0: 68 65 6d 61 54 6f 49 6e 64 65 78 28 70 4e 43 2d  hemaToIndex(pNC-
7cd0: 3e 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 54 61  >pParse->db, pTa
7ce0: 62 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20 20  b->pSchema);.   
7cf0: 20 20 20 20 20 20 20 7a 4f 72 69 67 69 6e 44 62         zOriginDb
7d00: 20 3d 20 70 4e 43 2d 3e 70 50 61 72 73 65 2d 3e   = pNC->pParse->
7d10: 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a 4e 61  db->aDb[iDb].zNa
7d20: 6d 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  me;.        }.  
7d30: 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61      }.      brea
7d40: 6b 3b 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65 66  k;.    }.#ifndef
7d50: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42   SQLITE_OMIT_SUB
7d60: 51 55 45 52 59 0a 20 20 20 20 63 61 73 65 20 54  QUERY.    case T
7d70: 4b 5f 53 45 4c 45 43 54 3a 20 7b 0a 20 20 20 20  K_SELECT: {.    
7d80: 20 20 2f 2a 20 54 68 65 20 65 78 70 72 65 73 73    /* The express
7d90: 69 6f 6e 20 69 73 20 61 20 73 75 62 2d 73 65 6c  ion is a sub-sel
7da0: 65 63 74 2e 20 52 65 74 75 72 6e 20 74 68 65 20  ect. Return the 
7db0: 64 65 63 6c 61 72 61 74 69 6f 6e 20 74 79 70 65  declaration type
7dc0: 20 61 6e 64 0a 20 20 20 20 20 20 2a 2a 20 6f 72   and.      ** or
7dd0: 69 67 69 6e 20 69 6e 66 6f 20 66 6f 72 20 74 68  igin info for th
7de0: 65 20 73 69 6e 67 6c 65 20 63 6f 6c 75 6d 6e 20  e single column 
7df0: 69 6e 20 74 68 65 20 72 65 73 75 6c 74 20 73 65  in the result se
7e00: 74 20 6f 66 20 74 68 65 20 53 45 4c 45 43 54 0a  t of the SELECT.
7e10: 20 20 20 20 20 20 2a 2a 20 73 74 61 74 65 6d 65        ** stateme
7e20: 6e 74 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  nt..      */.   
7e30: 20 20 20 4e 61 6d 65 43 6f 6e 74 65 78 74 20 73     NameContext s
7e40: 4e 43 3b 0a 20 20 20 20 20 20 53 65 6c 65 63 74  NC;.      Select
7e50: 20 2a 70 53 20 3d 20 70 45 78 70 72 2d 3e 70 53   *pS = pExpr->pS
7e60: 65 6c 65 63 74 3b 0a 20 20 20 20 20 20 45 78 70  elect;.      Exp
7e70: 72 20 2a 70 20 3d 20 70 53 2d 3e 70 45 4c 69 73  r *p = pS->pELis
7e80: 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 3b 0a 20  t->a[0].pExpr;. 
7e90: 20 20 20 20 20 73 4e 43 2e 70 53 72 63 4c 69 73       sNC.pSrcLis
7ea0: 74 20 3d 20 70 53 2d 3e 70 53 72 63 3b 0a 20 20  t = pS->pSrc;.  
7eb0: 20 20 20 20 73 4e 43 2e 70 4e 65 78 74 20 3d 20      sNC.pNext = 
7ec0: 70 4e 43 3b 0a 20 20 20 20 20 20 73 4e 43 2e 70  pNC;.      sNC.p
7ed0: 50 61 72 73 65 20 3d 20 70 4e 43 2d 3e 70 50 61  Parse = pNC->pPa
7ee0: 72 73 65 3b 0a 20 20 20 20 20 20 7a 54 79 70 65  rse;.      zType
7ef0: 20 3d 20 63 6f 6c 75 6d 6e 54 79 70 65 28 26 73   = columnType(&s
7f00: 4e 43 2c 20 70 2c 20 26 7a 4f 72 69 67 69 6e 44  NC, p, &zOriginD
7f10: 62 2c 20 26 7a 4f 72 69 67 69 6e 54 61 62 2c 20  b, &zOriginTab, 
7f20: 26 7a 4f 72 69 67 69 6e 43 6f 6c 29 3b 20 0a 20  &zOriginCol); . 
7f30: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
7f40: 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 20 20 0a  }.#endif.  }.  .
7f50: 20 20 69 66 28 20 70 7a 4f 72 69 67 69 6e 44 62    if( pzOriginDb
7f60: 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
7f70: 70 7a 4f 72 69 67 69 6e 54 61 62 20 26 26 20 70  pzOriginTab && p
7f80: 7a 4f 72 69 67 69 6e 43 6f 6c 20 29 3b 0a 20 20  zOriginCol );.  
7f90: 20 20 2a 70 7a 4f 72 69 67 69 6e 44 62 20 3d 20    *pzOriginDb = 
7fa0: 7a 4f 72 69 67 69 6e 44 62 3b 0a 20 20 20 20 2a  zOriginDb;.    *
7fb0: 70 7a 4f 72 69 67 69 6e 54 61 62 20 3d 20 7a 4f  pzOriginTab = zO
7fc0: 72 69 67 69 6e 54 61 62 3b 0a 20 20 20 20 2a 70  riginTab;.    *p
7fd0: 7a 4f 72 69 67 69 6e 43 6f 6c 20 3d 20 7a 4f 72  zOriginCol = zOr
7fe0: 69 67 69 6e 43 6f 6c 3b 0a 20 20 7d 0a 20 20 72  iginCol;.  }.  r
7ff0: 65 74 75 72 6e 20 7a 54 79 70 65 3b 0a 7d 0a 0a  eturn zType;.}..
8000: 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63  /*.** Generate c
8010: 6f 64 65 20 74 68 61 74 20 77 69 6c 6c 20 74 65  ode that will te
8020: 6c 6c 20 74 68 65 20 56 44 42 45 20 74 68 65 20  ll the VDBE the 
8030: 64 65 63 6c 61 72 61 74 69 6f 6e 20 74 79 70 65  declaration type
8040: 73 20 6f 66 20 63 6f 6c 75 6d 6e 73 0a 2a 2a 20  s of columns.** 
8050: 69 6e 20 74 68 65 20 72 65 73 75 6c 74 20 73 65  in the result se
8060: 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  t..*/.static voi
8070: 64 20 67 65 6e 65 72 61 74 65 43 6f 6c 75 6d 6e  d generateColumn
8080: 54 79 70 65 73 28 0a 20 20 50 61 72 73 65 20 2a  Types(.  Parse *
8090: 70 50 61 72 73 65 2c 20 20 20 20 20 20 2f 2a 20  pParse,      /* 
80a0: 50 61 72 73 65 72 20 63 6f 6e 74 65 78 74 20 2a  Parser context *
80b0: 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 54 61  /.  SrcList *pTa
80c0: 62 4c 69 73 74 2c 20 20 2f 2a 20 4c 69 73 74 20  bList,  /* List 
80d0: 6f 66 20 74 61 62 6c 65 73 20 2a 2f 0a 20 20 45  of tables */.  E
80e0: 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 20  xprList *pEList 
80f0: 20 20 20 2f 2a 20 45 78 70 72 65 73 73 69 6f 6e     /* Expression
8100: 73 20 64 65 66 69 6e 69 6e 67 20 74 68 65 20 72  s defining the r
8110: 65 73 75 6c 74 20 73 65 74 20 2a 2f 0a 29 7b 0a  esult set */.){.
8120: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
8130: 4d 49 54 5f 44 45 43 4c 54 59 50 45 0a 20 20 56  MIT_DECLTYPE.  V
8140: 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d  dbe *v = pParse-
8150: 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74 20 69 3b  >pVdbe;.  int i;
8160: 0a 20 20 4e 61 6d 65 43 6f 6e 74 65 78 74 20 73  .  NameContext s
8170: 4e 43 3b 0a 20 20 73 4e 43 2e 70 53 72 63 4c 69  NC;.  sNC.pSrcLi
8180: 73 74 20 3d 20 70 54 61 62 4c 69 73 74 3b 0a 20  st = pTabList;. 
8190: 20 73 4e 43 2e 70 50 61 72 73 65 20 3d 20 70 50   sNC.pParse = pP
81a0: 61 72 73 65 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  arse;.  for(i=0;
81b0: 20 69 3c 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72   i<pEList->nExpr
81c0: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72  ; i++){.    Expr
81d0: 20 2a 70 20 3d 20 70 45 4c 69 73 74 2d 3e 61 5b   *p = pEList->a[
81e0: 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 63 6f  i].pExpr;.    co
81f0: 6e 73 74 20 63 68 61 72 20 2a 7a 54 79 70 65 3b  nst char *zType;
8200: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
8210: 4e 41 42 4c 45 5f 43 4f 4c 55 4d 4e 5f 4d 45 54  NABLE_COLUMN_MET
8220: 41 44 41 54 41 0a 20 20 20 20 63 6f 6e 73 74 20  ADATA.    const 
8230: 63 68 61 72 20 2a 7a 4f 72 69 67 44 62 20 3d 20  char *zOrigDb = 
8240: 30 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61  0;.    const cha
8250: 72 20 2a 7a 4f 72 69 67 54 61 62 20 3d 20 30 3b  r *zOrigTab = 0;
8260: 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20  .    const char 
8270: 2a 7a 4f 72 69 67 43 6f 6c 20 3d 20 30 3b 0a 20  *zOrigCol = 0;. 
8280: 20 20 20 7a 54 79 70 65 20 3d 20 63 6f 6c 75 6d     zType = colum
8290: 6e 54 79 70 65 28 26 73 4e 43 2c 20 70 2c 20 26  nType(&sNC, p, &
82a0: 7a 4f 72 69 67 44 62 2c 20 26 7a 4f 72 69 67 54  zOrigDb, &zOrigT
82b0: 61 62 2c 20 26 7a 4f 72 69 67 43 6f 6c 29 3b 0a  ab, &zOrigCol);.
82c0: 0a 20 20 20 20 2f 2a 20 54 68 65 20 76 64 62 65  .    /* The vdbe
82d0: 20 6d 75 73 74 20 6d 61 6b 65 20 69 74 73 20 6f   must make its o
82e0: 77 6e 20 63 6f 70 79 20 6f 66 20 74 68 65 20 63  wn copy of the c
82f0: 6f 6c 75 6d 6e 2d 74 79 70 65 20 61 6e 64 20 6f  olumn-type and o
8300: 74 68 65 72 20 0a 20 20 20 20 2a 2a 20 63 6f 6c  ther .    ** col
8310: 75 6d 6e 20 73 70 65 63 69 66 69 63 20 73 74 72  umn specific str
8320: 69 6e 67 73 2c 20 69 6e 20 63 61 73 65 20 74 68  ings, in case th
8330: 65 20 73 63 68 65 6d 61 20 69 73 20 72 65 73 65  e schema is rese
8340: 74 20 62 65 66 6f 72 65 20 74 68 69 73 0a 20 20  t before this.  
8350: 20 20 2a 2a 20 76 69 72 74 75 61 6c 20 6d 61 63    ** virtual mac
8360: 68 69 6e 65 20 69 73 20 64 65 6c 65 74 65 64 2e  hine is deleted.
8370: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73 71 6c 69  .    */.    sqli
8380: 74 65 33 56 64 62 65 53 65 74 43 6f 6c 4e 61 6d  te3VdbeSetColNam
8390: 65 28 76 2c 20 69 2c 20 43 4f 4c 4e 41 4d 45 5f  e(v, i, COLNAME_
83a0: 44 41 54 41 42 41 53 45 2c 20 7a 4f 72 69 67 44  DATABASE, zOrigD
83b0: 62 2c 20 50 34 5f 54 52 41 4e 53 49 45 4e 54 29  b, P4_TRANSIENT)
83c0: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
83d0: 65 53 65 74 43 6f 6c 4e 61 6d 65 28 76 2c 20 69  eSetColName(v, i
83e0: 2c 20 43 4f 4c 4e 41 4d 45 5f 54 41 42 4c 45 2c  , COLNAME_TABLE,
83f0: 20 7a 4f 72 69 67 54 61 62 2c 20 50 34 5f 54 52   zOrigTab, P4_TR
8400: 41 4e 53 49 45 4e 54 29 3b 0a 20 20 20 20 73 71  ANSIENT);.    sq
8410: 6c 69 74 65 33 56 64 62 65 53 65 74 43 6f 6c 4e  lite3VdbeSetColN
8420: 61 6d 65 28 76 2c 20 69 2c 20 43 4f 4c 4e 41 4d  ame(v, i, COLNAM
8430: 45 5f 43 4f 4c 55 4d 4e 2c 20 7a 4f 72 69 67 43  E_COLUMN, zOrigC
8440: 6f 6c 2c 20 50 34 5f 54 52 41 4e 53 49 45 4e 54  ol, P4_TRANSIENT
8450: 29 3b 0a 23 65 6c 73 65 0a 20 20 20 20 7a 54 79  );.#else.    zTy
8460: 70 65 20 3d 20 63 6f 6c 75 6d 6e 54 79 70 65 28  pe = columnType(
8470: 26 73 4e 43 2c 20 70 2c 20 30 2c 20 30 2c 20 30  &sNC, p, 0, 0, 0
8480: 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 73 71  );.#endif.    sq
8490: 6c 69 74 65 33 56 64 62 65 53 65 74 43 6f 6c 4e  lite3VdbeSetColN
84a0: 61 6d 65 28 76 2c 20 69 2c 20 43 4f 4c 4e 41 4d  ame(v, i, COLNAM
84b0: 45 5f 44 45 43 4c 54 59 50 45 2c 20 7a 54 79 70  E_DECLTYPE, zTyp
84c0: 65 2c 20 50 34 5f 54 52 41 4e 53 49 45 4e 54 29  e, P4_TRANSIENT)
84d0: 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20  ;.  }.#endif /* 
84e0: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 44 45 43 4c  SQLITE_OMIT_DECL
84f0: 54 59 50 45 20 2a 2f 0a 7d 0a 0a 2f 2a 0a 2a 2a  TYPE */.}../*.**
8500: 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74   Generate code t
8510: 68 61 74 20 77 69 6c 6c 20 74 65 6c 6c 20 74 68  hat will tell th
8520: 65 20 56 44 42 45 20 74 68 65 20 6e 61 6d 65 73  e VDBE the names
8530: 20 6f 66 20 63 6f 6c 75 6d 6e 73 0a 2a 2a 20 69   of columns.** i
8540: 6e 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74  n the result set
8550: 2e 20 20 54 68 69 73 20 69 6e 66 6f 72 6d 61 74  .  This informat
8560: 69 6f 6e 20 69 73 20 75 73 65 64 20 74 6f 20 70  ion is used to p
8570: 72 6f 76 69 64 65 20 74 68 65 0a 2a 2a 20 61 7a  rovide the.** az
8580: 43 6f 6c 5b 5d 20 76 61 6c 75 65 73 20 69 6e 20  Col[] values in 
8590: 74 68 65 20 63 61 6c 6c 62 61 63 6b 2e 0a 2a 2f  the callback..*/
85a0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 67 65 6e  .static void gen
85b0: 65 72 61 74 65 43 6f 6c 75 6d 6e 4e 61 6d 65 73  erateColumnNames
85c0: 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
85d0: 65 2c 20 20 20 20 20 20 2f 2a 20 50 61 72 73 65  e,      /* Parse
85e0: 72 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53  r context */.  S
85f0: 72 63 4c 69 73 74 20 2a 70 54 61 62 4c 69 73 74  rcList *pTabList
8600: 2c 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 74 61  ,  /* List of ta
8610: 62 6c 65 73 20 2a 2f 0a 20 20 45 78 70 72 4c 69  bles */.  ExprLi
8620: 73 74 20 2a 70 45 4c 69 73 74 20 20 20 20 2f 2a  st *pEList    /*
8630: 20 45 78 70 72 65 73 73 69 6f 6e 73 20 64 65 66   Expressions def
8640: 69 6e 69 6e 67 20 74 68 65 20 72 65 73 75 6c 74  ining the result
8650: 20 73 65 74 20 2a 2f 0a 29 7b 0a 20 20 56 64 62   set */.){.  Vdb
8660: 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70  e *v = pParse->p
8670: 56 64 62 65 3b 0a 20 20 69 6e 74 20 69 2c 20 6a  Vdbe;.  int i, j
8680: 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20  ;.  sqlite3 *db 
8690: 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20  = pParse->db;.  
86a0: 69 6e 74 20 66 75 6c 6c 4e 61 6d 65 73 2c 20 73  int fullNames, s
86b0: 68 6f 72 74 4e 61 6d 65 73 3b 0a 0a 23 69 66 6e  hortNames;..#ifn
86c0: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
86d0: 45 58 50 4c 41 49 4e 0a 20 20 2f 2a 20 49 66 20  EXPLAIN.  /* If 
86e0: 74 68 69 73 20 69 73 20 61 6e 20 45 58 50 4c 41  this is an EXPLA
86f0: 49 4e 2c 20 73 6b 69 70 20 74 68 69 73 20 73 74  IN, skip this st
8700: 65 70 20 2a 2f 0a 20 20 69 66 28 20 70 50 61 72  ep */.  if( pPar
8710: 73 65 2d 3e 65 78 70 6c 61 69 6e 20 29 7b 0a 20  se->explain ){. 
8720: 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 23     return;.  }.#
8730: 65 6e 64 69 66 0a 0a 20 20 61 73 73 65 72 74 28  endif..  assert(
8740: 20 76 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 70   v!=0 );.  if( p
8750: 50 61 72 73 65 2d 3e 63 6f 6c 4e 61 6d 65 73 53  Parse->colNamesS
8760: 65 74 20 7c 7c 20 76 3d 3d 30 20 7c 7c 20 64 62  et || v==0 || db
8770: 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
8780: 20 72 65 74 75 72 6e 3b 0a 20 20 70 50 61 72 73   return;.  pPars
8790: 65 2d 3e 63 6f 6c 4e 61 6d 65 73 53 65 74 20 3d  e->colNamesSet =
87a0: 20 31 3b 0a 20 20 66 75 6c 6c 4e 61 6d 65 73 20   1;.  fullNames 
87b0: 3d 20 28 64 62 2d 3e 66 6c 61 67 73 20 26 20 53  = (db->flags & S
87c0: 51 4c 49 54 45 5f 46 75 6c 6c 43 6f 6c 4e 61 6d  QLITE_FullColNam
87d0: 65 73 29 21 3d 30 3b 0a 20 20 73 68 6f 72 74 4e  es)!=0;.  shortN
87e0: 61 6d 65 73 20 3d 20 28 64 62 2d 3e 66 6c 61 67  ames = (db->flag
87f0: 73 20 26 20 53 51 4c 49 54 45 5f 53 68 6f 72 74  s & SQLITE_Short
8800: 43 6f 6c 4e 61 6d 65 73 29 21 3d 30 3b 0a 20 20  ColNames)!=0;.  
8810: 73 71 6c 69 74 65 33 56 64 62 65 53 65 74 4e 75  sqlite3VdbeSetNu
8820: 6d 43 6f 6c 73 28 76 2c 20 70 45 4c 69 73 74 2d  mCols(v, pEList-
8830: 3e 6e 45 78 70 72 29 3b 0a 20 20 66 6f 72 28 69  >nExpr);.  for(i
8840: 3d 30 3b 20 69 3c 70 45 4c 69 73 74 2d 3e 6e 45  =0; i<pEList->nE
8850: 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 45  xpr; i++){.    E
8860: 78 70 72 20 2a 70 3b 0a 20 20 20 20 70 20 3d 20  xpr *p;.    p = 
8870: 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78  pEList->a[i].pEx
8880: 70 72 3b 0a 20 20 20 20 69 66 28 20 70 3d 3d 30  pr;.    if( p==0
8890: 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
88a0: 20 69 66 28 20 70 45 4c 69 73 74 2d 3e 61 5b 69   if( pEList->a[i
88b0: 5d 2e 7a 4e 61 6d 65 20 29 7b 0a 20 20 20 20 20  ].zName ){.     
88c0: 20 63 68 61 72 20 2a 7a 4e 61 6d 65 20 3d 20 70   char *zName = p
88d0: 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d  EList->a[i].zNam
88e0: 65 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  e;.      sqlite3
88f0: 56 64 62 65 53 65 74 43 6f 6c 4e 61 6d 65 28 76  VdbeSetColName(v
8900: 2c 20 69 2c 20 43 4f 4c 4e 41 4d 45 5f 4e 41 4d  , i, COLNAME_NAM
8910: 45 2c 20 7a 4e 61 6d 65 2c 20 73 74 72 6c 65 6e  E, zName, strlen
8920: 28 7a 4e 61 6d 65 29 29 3b 0a 20 20 20 20 20 20  (zName));.      
8930: 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 7d 0a  continue;.    }.
8940: 20 20 20 20 69 66 28 20 70 2d 3e 6f 70 3d 3d 54      if( p->op==T
8950: 4b 5f 43 4f 4c 55 4d 4e 20 26 26 20 70 54 61 62  K_COLUMN && pTab
8960: 4c 69 73 74 20 29 7b 0a 20 20 20 20 20 20 54 61  List ){.      Ta
8970: 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20 20 20 20  ble *pTab;.     
8980: 20 63 68 61 72 20 2a 7a 43 6f 6c 3b 0a 20 20 20   char *zCol;.   
8990: 20 20 20 69 6e 74 20 69 43 6f 6c 20 3d 20 70 2d     int iCol = p-
89a0: 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20 20  >iColumn;.      
89b0: 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 54 61 62 4c  for(j=0; j<pTabL
89c0: 69 73 74 2d 3e 6e 53 72 63 20 26 26 20 70 54 61  ist->nSrc && pTa
89d0: 62 4c 69 73 74 2d 3e 61 5b 6a 5d 2e 69 43 75 72  bList->a[j].iCur
89e0: 73 6f 72 21 3d 70 2d 3e 69 54 61 62 6c 65 3b 20  sor!=p->iTable; 
89f0: 6a 2b 2b 29 7b 7d 0a 20 20 20 20 20 20 61 73 73  j++){}.      ass
8a00: 65 72 74 28 20 6a 3c 70 54 61 62 4c 69 73 74 2d  ert( j<pTabList-
8a10: 3e 6e 53 72 63 20 29 3b 0a 20 20 20 20 20 20 70  >nSrc );.      p
8a20: 54 61 62 20 3d 20 70 54 61 62 4c 69 73 74 2d 3e  Tab = pTabList->
8a30: 61 5b 6a 5d 2e 70 54 61 62 3b 0a 20 20 20 20 20  a[j].pTab;.     
8a40: 20 69 66 28 20 69 43 6f 6c 3c 30 20 29 20 69 43   if( iCol<0 ) iC
8a50: 6f 6c 20 3d 20 70 54 61 62 2d 3e 69 50 4b 65 79  ol = pTab->iPKey
8a60: 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
8a70: 69 43 6f 6c 3d 3d 2d 31 20 7c 7c 20 28 69 43 6f  iCol==-1 || (iCo
8a80: 6c 3e 3d 30 20 26 26 20 69 43 6f 6c 3c 70 54 61  l>=0 && iCol<pTa
8a90: 62 2d 3e 6e 43 6f 6c 29 20 29 3b 0a 20 20 20 20  b->nCol) );.    
8aa0: 20 20 69 66 28 20 69 43 6f 6c 3c 30 20 29 7b 0a    if( iCol<0 ){.
8ab0: 20 20 20 20 20 20 20 20 7a 43 6f 6c 20 3d 20 22          zCol = "
8ac0: 72 6f 77 69 64 22 3b 0a 20 20 20 20 20 20 7d 65  rowid";.      }e
8ad0: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 7a 43 6f  lse{.        zCo
8ae0: 6c 20 3d 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 69  l = pTab->aCol[i
8af0: 43 6f 6c 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20  Col].zName;.    
8b00: 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 21 73    }.      if( !s
8b10: 68 6f 72 74 4e 61 6d 65 73 20 26 26 20 21 66 75  hortNames && !fu
8b20: 6c 6c 4e 61 6d 65 73 20 26 26 20 70 2d 3e 73 70  llNames && p->sp
8b30: 61 6e 2e 7a 20 26 26 20 70 2d 3e 73 70 61 6e 2e  an.z && p->span.
8b40: 7a 5b 30 5d 20 29 7b 0a 20 20 20 20 20 20 20 20  z[0] ){.        
8b50: 73 71 6c 69 74 65 33 56 64 62 65 53 65 74 43 6f  sqlite3VdbeSetCo
8b60: 6c 4e 61 6d 65 28 76 2c 20 69 2c 20 43 4f 4c 4e  lName(v, i, COLN
8b70: 41 4d 45 5f 4e 41 4d 45 2c 20 28 63 68 61 72 2a  AME_NAME, (char*
8b80: 29 70 2d 3e 73 70 61 6e 2e 7a 2c 20 70 2d 3e 73  )p->span.z, p->s
8b90: 70 61 6e 2e 6e 29 3b 0a 20 20 20 20 20 20 7d 65  pan.n);.      }e
8ba0: 6c 73 65 20 69 66 28 20 66 75 6c 6c 4e 61 6d 65  lse if( fullName
8bb0: 73 20 7c 7c 20 28 21 73 68 6f 72 74 4e 61 6d 65  s || (!shortName
8bc0: 73 20 26 26 20 70 54 61 62 4c 69 73 74 2d 3e 6e  s && pTabList->n
8bd0: 53 72 63 3e 31 29 20 29 7b 0a 20 20 20 20 20 20  Src>1) ){.      
8be0: 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 20 3d 20    char *zName = 
8bf0: 30 3b 0a 20 20 20 20 20 20 20 20 63 68 61 72 20  0;.        char 
8c00: 2a 7a 54 61 62 3b 0a 20 0a 20 20 20 20 20 20 20  *zTab;. .       
8c10: 20 7a 54 61 62 20 3d 20 70 54 61 62 4c 69 73 74   zTab = pTabList
8c20: 2d 3e 61 5b 6a 5d 2e 7a 41 6c 69 61 73 3b 0a 20  ->a[j].zAlias;. 
8c30: 20 20 20 20 20 20 20 69 66 28 20 66 75 6c 6c 4e         if( fullN
8c40: 61 6d 65 73 20 7c 7c 20 7a 54 61 62 3d 3d 30 20  ames || zTab==0 
8c50: 29 20 7a 54 61 62 20 3d 20 70 54 61 62 2d 3e 7a  ) zTab = pTab->z
8c60: 4e 61 6d 65 3b 0a 20 20 20 20 20 20 20 20 73 71  Name;.        sq
8c70: 6c 69 74 65 33 53 65 74 53 74 72 69 6e 67 28 26  lite3SetString(&
8c80: 7a 4e 61 6d 65 2c 20 7a 54 61 62 2c 20 22 2e 22  zName, zTab, "."
8c90: 2c 20 7a 43 6f 6c 2c 20 28 63 68 61 72 2a 29 30  , zCol, (char*)0
8ca0: 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
8cb0: 65 33 56 64 62 65 53 65 74 43 6f 6c 4e 61 6d 65  e3VdbeSetColName
8cc0: 28 76 2c 20 69 2c 20 43 4f 4c 4e 41 4d 45 5f 4e  (v, i, COLNAME_N
8cd0: 41 4d 45 2c 20 7a 4e 61 6d 65 2c 20 50 34 5f 44  AME, zName, P4_D
8ce0: 59 4e 41 4d 49 43 29 3b 0a 20 20 20 20 20 20 7d  YNAMIC);.      }
8cf0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71  else{.        sq
8d00: 6c 69 74 65 33 56 64 62 65 53 65 74 43 6f 6c 4e  lite3VdbeSetColN
8d10: 61 6d 65 28 76 2c 20 69 2c 20 43 4f 4c 4e 41 4d  ame(v, i, COLNAM
8d20: 45 5f 4e 41 4d 45 2c 20 7a 43 6f 6c 2c 20 73 74  E_NAME, zCol, st
8d30: 72 6c 65 6e 28 7a 43 6f 6c 29 29 3b 0a 20 20 20  rlen(zCol));.   
8d40: 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 20 69     }.    }else i
8d50: 66 28 20 70 2d 3e 73 70 61 6e 2e 7a 20 26 26 20  f( p->span.z && 
8d60: 70 2d 3e 73 70 61 6e 2e 7a 5b 30 5d 20 29 7b 0a  p->span.z[0] ){.
8d70: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
8d80: 65 53 65 74 43 6f 6c 4e 61 6d 65 28 76 2c 20 69  eSetColName(v, i
8d90: 2c 20 43 4f 4c 4e 41 4d 45 5f 4e 41 4d 45 2c 20  , COLNAME_NAME, 
8da0: 28 63 68 61 72 2a 29 70 2d 3e 73 70 61 6e 2e 7a  (char*)p->span.z
8db0: 2c 20 70 2d 3e 73 70 61 6e 2e 6e 29 3b 0a 20 20  , p->span.n);.  
8dc0: 20 20 20 20 2f 2a 20 73 71 6c 69 74 65 33 56 64      /* sqlite3Vd
8dd0: 62 65 43 6f 6d 70 72 65 73 73 53 70 61 63 65 28  beCompressSpace(
8de0: 76 2c 20 61 64 64 72 29 3b 20 2a 2f 0a 20 20 20  v, addr); */.   
8df0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 63 68   }else{.      ch
8e00: 61 72 20 7a 4e 61 6d 65 5b 33 30 5d 3b 0a 20 20  ar zName[30];.  
8e10: 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6f      assert( p->o
8e20: 70 21 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 7c 7c 20  p!=TK_COLUMN || 
8e30: 70 54 61 62 4c 69 73 74 3d 3d 30 20 29 3b 0a 20  pTabList==0 );. 
8e40: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70       sqlite3_snp
8e50: 72 69 6e 74 66 28 73 69 7a 65 6f 66 28 7a 4e 61  rintf(sizeof(zNa
8e60: 6d 65 29 2c 20 7a 4e 61 6d 65 2c 20 22 63 6f 6c  me), zName, "col
8e70: 75 6d 6e 25 64 22 2c 20 69 2b 31 29 3b 0a 20 20  umn%d", i+1);.  
8e80: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 53      sqlite3VdbeS
8e90: 65 74 43 6f 6c 4e 61 6d 65 28 76 2c 20 69 2c 20  etColName(v, i, 
8ea0: 43 4f 4c 4e 41 4d 45 5f 4e 41 4d 45 2c 20 7a 4e  COLNAME_NAME, zN
8eb0: 61 6d 65 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20  ame, 0);.    }. 
8ec0: 20 7d 0a 20 20 67 65 6e 65 72 61 74 65 43 6f 6c   }.  generateCol
8ed0: 75 6d 6e 54 79 70 65 73 28 70 50 61 72 73 65 2c  umnTypes(pParse,
8ee0: 20 70 54 61 62 4c 69 73 74 2c 20 70 45 4c 69 73   pTabList, pELis
8ef0: 74 29 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53  t);.}..#ifndef S
8f00: 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f 4d 50 4f  QLITE_OMIT_COMPO
8f10: 55 4e 44 5f 53 45 4c 45 43 54 0a 2f 2a 0a 2a 2a  UND_SELECT./*.**
8f20: 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 63 6f 6e   Name of the con
8f30: 6e 65 63 74 69 6f 6e 20 6f 70 65 72 61 74 6f 72  nection operator
8f40: 2c 20 75 73 65 64 20 66 6f 72 20 65 72 72 6f 72  , used for error
8f50: 20 6d 65 73 73 61 67 65 73 2e 0a 2a 2f 0a 73 74   messages..*/.st
8f60: 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20  atic const char 
8f70: 2a 73 65 6c 65 63 74 4f 70 4e 61 6d 65 28 69 6e  *selectOpName(in
8f80: 74 20 69 64 29 7b 0a 20 20 63 68 61 72 20 2a 7a  t id){.  char *z
8f90: 3b 0a 20 20 73 77 69 74 63 68 28 20 69 64 20 29  ;.  switch( id )
8fa0: 7b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 41 4c  {.    case TK_AL
8fb0: 4c 3a 20 20 20 20 20 20 20 7a 20 3d 20 22 55 4e  L:       z = "UN
8fc0: 49 4f 4e 20 41 4c 4c 22 3b 20 20 20 62 72 65 61  ION ALL";   brea
8fd0: 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49  k;.    case TK_I
8fe0: 4e 54 45 52 53 45 43 54 3a 20 7a 20 3d 20 22 49  NTERSECT: z = "I
8ff0: 4e 54 45 52 53 45 43 54 22 3b 20 20 20 62 72 65  NTERSECT";   bre
9000: 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  ak;.    case TK_
9010: 45 58 43 45 50 54 3a 20 20 20 20 7a 20 3d 20 22  EXCEPT:    z = "
9020: 45 58 43 45 50 54 22 3b 20 20 20 20 20 20 62 72  EXCEPT";      br
9030: 65 61 6b 3b 0a 20 20 20 20 64 65 66 61 75 6c 74  eak;.    default
9040: 3a 20 20 20 20 20 20 20 20 20 20 20 7a 20 3d 20  :           z = 
9050: 22 55 4e 49 4f 4e 22 3b 20 20 20 20 20 20 20 62  "UNION";       b
9060: 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 72 65 74 75  reak;.  }.  retu
9070: 72 6e 20 7a 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f  rn z;.}.#endif /
9080: 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f  * SQLITE_OMIT_CO
9090: 4d 50 4f 55 4e 44 5f 53 45 4c 45 43 54 20 2a 2f  MPOUND_SELECT */
90a0: 0a 0a 2f 2a 0a 2a 2a 20 46 6f 72 77 61 72 64 20  ../*.** Forward 
90b0: 64 65 63 6c 61 72 61 74 69 6f 6e 0a 2a 2f 0a 73  declaration.*/.s
90c0: 74 61 74 69 63 20 69 6e 74 20 70 72 65 70 53 65  tatic int prepSe
90d0: 6c 65 63 74 53 74 6d 74 28 50 61 72 73 65 2a 2c  lectStmt(Parse*,
90e0: 20 53 65 6c 65 63 74 2a 29 3b 0a 0a 2f 2a 0a 2a   Select*);../*.*
90f0: 2a 20 47 69 76 65 6e 20 61 20 53 45 4c 45 43 54  * Given a SELECT
9100: 20 73 74 61 74 65 6d 65 6e 74 2c 20 67 65 6e 65   statement, gene
9110: 72 61 74 65 20 61 20 54 61 62 6c 65 20 73 74 72  rate a Table str
9120: 75 63 74 75 72 65 20 74 68 61 74 20 64 65 73 63  ucture that desc
9130: 72 69 62 65 73 0a 2a 2a 20 74 68 65 20 72 65 73  ribes.** the res
9140: 75 6c 74 20 73 65 74 20 6f 66 20 74 68 61 74 20  ult set of that 
9150: 53 45 4c 45 43 54 2e 0a 2a 2f 0a 54 61 62 6c 65  SELECT..*/.Table
9160: 20 2a 73 71 6c 69 74 65 33 52 65 73 75 6c 74 53   *sqlite3ResultS
9170: 65 74 4f 66 53 65 6c 65 63 74 28 50 61 72 73 65  etOfSelect(Parse
9180: 20 2a 70 50 61 72 73 65 2c 20 63 68 61 72 20 2a   *pParse, char *
9190: 7a 54 61 62 4e 61 6d 65 2c 20 53 65 6c 65 63 74  zTabName, Select
91a0: 20 2a 70 53 65 6c 65 63 74 29 7b 0a 20 20 54 61   *pSelect){.  Ta
91b0: 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20 69 6e 74  ble *pTab;.  int
91c0: 20 69 2c 20 6a 3b 0a 20 20 45 78 70 72 4c 69 73   i, j;.  ExprLis
91d0: 74 20 2a 70 45 4c 69 73 74 3b 0a 20 20 43 6f 6c  t *pEList;.  Col
91e0: 75 6d 6e 20 2a 61 43 6f 6c 2c 20 2a 70 43 6f 6c  umn *aCol, *pCol
91f0: 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20  ;.  sqlite3 *db 
9200: 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 0a 20  = pParse->db;.. 
9210: 20 77 68 69 6c 65 28 20 70 53 65 6c 65 63 74 2d   while( pSelect-
9220: 3e 70 50 72 69 6f 72 20 29 20 70 53 65 6c 65 63  >pPrior ) pSelec
9230: 74 20 3d 20 70 53 65 6c 65 63 74 2d 3e 70 50 72  t = pSelect->pPr
9240: 69 6f 72 3b 0a 20 20 69 66 28 20 70 72 65 70 53  ior;.  if( prepS
9250: 65 6c 65 63 74 53 74 6d 74 28 70 50 61 72 73 65  electStmt(pParse
9260: 2c 20 70 53 65 6c 65 63 74 29 20 29 7b 0a 20 20  , pSelect) ){.  
9270: 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a    return 0;.  }.
9280: 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 65 6c    if( sqlite3Sel
9290: 65 63 74 52 65 73 6f 6c 76 65 28 70 50 61 72 73  ectResolve(pPars
92a0: 65 2c 20 70 53 65 6c 65 63 74 2c 20 30 29 20 29  e, pSelect, 0) )
92b0: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a  {.    return 0;.
92c0: 20 20 7d 0a 20 20 70 54 61 62 20 3d 20 73 71 6c    }.  pTab = sql
92d0: 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f  ite3DbMallocZero
92e0: 28 64 62 2c 20 73 69 7a 65 6f 66 28 54 61 62 6c  (db, sizeof(Tabl
92f0: 65 29 20 29 3b 0a 20 20 69 66 28 20 70 54 61 62  e) );.  if( pTab
9300: 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ==0 ){.    retur
9310: 6e 20 30 3b 0a 20 20 7d 0a 20 20 70 54 61 62 2d  n 0;.  }.  pTab-
9320: 3e 6e 52 65 66 20 3d 20 31 3b 0a 20 20 70 54 61  >nRef = 1;.  pTa
9330: 62 2d 3e 7a 4e 61 6d 65 20 3d 20 7a 54 61 62 4e  b->zName = zTabN
9340: 61 6d 65 20 3f 20 73 71 6c 69 74 65 33 44 62 53  ame ? sqlite3DbS
9350: 74 72 44 75 70 28 64 62 2c 20 7a 54 61 62 4e 61  trDup(db, zTabNa
9360: 6d 65 29 20 3a 20 30 3b 0a 20 20 70 45 4c 69 73  me) : 0;.  pELis
9370: 74 20 3d 20 70 53 65 6c 65 63 74 2d 3e 70 45 4c  t = pSelect->pEL
9380: 69 73 74 3b 0a 20 20 70 54 61 62 2d 3e 6e 43 6f  ist;.  pTab->nCo
9390: 6c 20 3d 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70  l = pEList->nExp
93a0: 72 3b 0a 20 20 61 73 73 65 72 74 28 20 70 54 61  r;.  assert( pTa
93b0: 62 2d 3e 6e 43 6f 6c 3e 30 20 29 3b 0a 20 20 70  b->nCol>0 );.  p
93c0: 54 61 62 2d 3e 61 43 6f 6c 20 3d 20 61 43 6f 6c  Tab->aCol = aCol
93d0: 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c   = sqlite3DbMall
93e0: 6f 63 5a 65 72 6f 28 64 62 2c 20 73 69 7a 65 6f  ocZero(db, sizeo
93f0: 66 28 70 54 61 62 2d 3e 61 43 6f 6c 5b 30 5d 29  f(pTab->aCol[0])
9400: 2a 70 54 61 62 2d 3e 6e 43 6f 6c 29 3b 0a 20 20  *pTab->nCol);.  
9410: 66 6f 72 28 69 3d 30 2c 20 70 43 6f 6c 3d 61 43  for(i=0, pCol=aC
9420: 6f 6c 3b 20 69 3c 70 54 61 62 2d 3e 6e 43 6f 6c  ol; i<pTab->nCol
9430: 3b 20 69 2b 2b 2c 20 70 43 6f 6c 2b 2b 29 7b 0a  ; i++, pCol++){.
9440: 20 20 20 20 45 78 70 72 20 2a 70 2c 20 2a 70 52      Expr *p, *pR
9450: 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a 54 79 70  ;.    char *zTyp
9460: 65 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a 4e 61  e;.    char *zNa
9470: 6d 65 3b 0a 20 20 20 20 69 6e 74 20 6e 4e 61 6d  me;.    int nNam
9480: 65 3b 0a 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a  e;.    CollSeq *
9490: 70 43 6f 6c 6c 3b 0a 20 20 20 20 69 6e 74 20 63  pColl;.    int c
94a0: 6e 74 3b 0a 20 20 20 20 4e 61 6d 65 43 6f 6e 74  nt;.    NameCont
94b0: 65 78 74 20 73 4e 43 3b 0a 20 20 20 20 0a 20 20  ext sNC;.    .  
94c0: 20 20 2f 2a 20 47 65 74 20 61 6e 20 61 70 70 72    /* Get an appr
94d0: 6f 70 72 69 61 74 65 20 6e 61 6d 65 20 66 6f 72  opriate name for
94e0: 20 74 68 65 20 63 6f 6c 75 6d 6e 0a 20 20 20 20   the column.    
94f0: 2a 2f 0a 20 20 20 20 70 20 3d 20 70 45 4c 69 73  */.    p = pELis
9500: 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 20  t->a[i].pExpr;. 
9510: 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 52     assert( p->pR
9520: 69 67 68 74 3d 3d 30 20 7c 7c 20 70 2d 3e 70 52  ight==0 || p->pR
9530: 69 67 68 74 2d 3e 74 6f 6b 65 6e 2e 7a 3d 3d 30  ight->token.z==0
9540: 20 7c 7c 20 70 2d 3e 70 52 69 67 68 74 2d 3e 74   || p->pRight->t
9550: 6f 6b 65 6e 2e 7a 5b 30 5d 21 3d 30 20 29 3b 0a  oken.z[0]!=0 );.
9560: 20 20 20 20 69 66 28 20 28 7a 4e 61 6d 65 20 3d      if( (zName =
9570: 20 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e   pEList->a[i].zN
9580: 61 6d 65 29 21 3d 30 20 29 7b 0a 20 20 20 20 20  ame)!=0 ){.     
9590: 20 2f 2a 20 49 66 20 74 68 65 20 63 6f 6c 75 6d   /* If the colum
95a0: 6e 20 63 6f 6e 74 61 69 6e 73 20 61 6e 20 22 41  n contains an "A
95b0: 53 20 3c 6e 61 6d 65 3e 22 20 70 68 72 61 73 65  S <name>" phrase
95c0: 2c 20 75 73 65 20 3c 6e 61 6d 65 3e 20 61 73 20  , use <name> as 
95d0: 74 68 65 20 6e 61 6d 65 20 2a 2f 0a 20 20 20 20  the name */.    
95e0: 20 20 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65    zName = sqlite
95f0: 33 44 62 53 74 72 44 75 70 28 64 62 2c 20 7a 4e  3DbStrDup(db, zN
9600: 61 6d 65 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20  ame);.    }else 
9610: 69 66 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 44 4f  if( p->op==TK_DO
9620: 54 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  T .             
9630: 20 26 26 20 28 70 52 3d 70 2d 3e 70 52 69 67 68   && (pR=p->pRigh
9640: 74 29 21 3d 30 20 26 26 20 70 52 2d 3e 74 6f 6b  t)!=0 && pR->tok
9650: 65 6e 2e 7a 20 26 26 20 70 52 2d 3e 74 6f 6b 65  en.z && pR->toke
9660: 6e 2e 7a 5b 30 5d 20 29 7b 0a 20 20 20 20 20 20  n.z[0] ){.      
9670: 2f 2a 20 46 6f 72 20 63 6f 6c 75 6d 6e 73 20 6f  /* For columns o
9680: 66 20 74 68 65 20 66 72 6f 6d 20 41 2e 42 20 75  f the from A.B u
9690: 73 65 20 42 20 61 73 20 74 68 65 20 6e 61 6d 65  se B as the name
96a0: 20 2a 2f 0a 20 20 20 20 20 20 7a 4e 61 6d 65 20   */.      zName 
96b0: 3d 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66  = sqlite3MPrintf
96c0: 28 64 62 2c 20 22 25 54 22 2c 20 26 70 52 2d 3e  (db, "%T", &pR->
96d0: 74 6f 6b 65 6e 29 3b 0a 20 20 20 20 7d 65 6c 73  token);.    }els
96e0: 65 20 69 66 28 20 70 2d 3e 73 70 61 6e 2e 7a 20  e if( p->span.z 
96f0: 26 26 20 70 2d 3e 73 70 61 6e 2e 7a 5b 30 5d 20  && p->span.z[0] 
9700: 29 7b 0a 20 20 20 20 20 20 2f 2a 20 55 73 65 20  ){.      /* Use 
9710: 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 74 65 78  the original tex
9720: 74 20 6f 66 20 74 68 65 20 63 6f 6c 75 6d 6e 20  t of the column 
9730: 65 78 70 72 65 73 73 69 6f 6e 20 61 73 20 69 74  expression as it
9740: 73 20 6e 61 6d 65 20 2a 2f 0a 20 20 20 20 20 20  s name */.      
9750: 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 4d  zName = sqlite3M
9760: 50 72 69 6e 74 66 28 64 62 2c 20 22 25 54 22 2c  Printf(db, "%T",
9770: 20 26 70 2d 3e 73 70 61 6e 29 3b 0a 20 20 20 20   &p->span);.    
9780: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20  }else{.      /* 
9790: 49 66 20 61 6c 6c 20 65 6c 73 65 20 66 61 69 6c  If all else fail
97a0: 73 2c 20 6d 61 6b 65 20 75 70 20 61 20 6e 61 6d  s, make up a nam
97b0: 65 20 2a 2f 0a 20 20 20 20 20 20 7a 4e 61 6d 65  e */.      zName
97c0: 20 3d 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74   = sqlite3MPrint
97d0: 66 28 64 62 2c 20 22 63 6f 6c 75 6d 6e 25 64 22  f(db, "column%d"
97e0: 2c 20 69 2b 31 29 3b 0a 20 20 20 20 7d 0a 20 20  , i+1);.    }.  
97f0: 20 20 69 66 28 20 21 7a 4e 61 6d 65 20 7c 7c 20    if( !zName || 
9800: 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
9810: 20 29 7b 0a 20 20 20 20 20 20 64 62 2d 3e 6d 61   ){.      db->ma
9820: 6c 6c 6f 63 46 61 69 6c 65 64 20 3d 20 31 3b 0a  llocFailed = 1;.
9830: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72        sqlite3_fr
9840: 65 65 28 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20  ee(zName);.     
9850: 20 73 71 6c 69 74 65 33 44 65 6c 65 74 65 54 61   sqlite3DeleteTa
9860: 62 6c 65 28 70 54 61 62 29 3b 0a 20 20 20 20 20  ble(pTab);.     
9870: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d   return 0;.    }
9880: 0a 20 20 20 20 73 71 6c 69 74 65 33 44 65 71 75  .    sqlite3Dequ
9890: 6f 74 65 28 7a 4e 61 6d 65 29 3b 0a 0a 20 20 20  ote(zName);..   
98a0: 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 68   /* Make sure th
98b0: 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 20 69 73  e column name is
98c0: 20 75 6e 69 71 75 65 2e 20 20 49 66 20 74 68 65   unique.  If the
98d0: 20 6e 61 6d 65 20 69 73 20 6e 6f 74 20 75 6e 69   name is not uni
98e0: 71 75 65 2c 0a 20 20 20 20 2a 2a 20 61 70 70 65  que,.    ** appe
98f0: 6e 64 20 61 20 69 6e 74 65 67 65 72 20 74 6f 20  nd a integer to 
9900: 74 68 65 20 6e 61 6d 65 20 73 6f 20 74 68 61 74  the name so that
9910: 20 69 74 20 62 65 63 6f 6d 65 73 20 75 6e 69 71   it becomes uniq
9920: 75 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 6e  ue..    */.    n
9930: 4e 61 6d 65 20 3d 20 73 74 72 6c 65 6e 28 7a 4e  Name = strlen(zN
9940: 61 6d 65 29 3b 0a 20 20 20 20 66 6f 72 28 6a 3d  ame);.    for(j=
9950: 63 6e 74 3d 30 3b 20 6a 3c 69 3b 20 6a 2b 2b 29  cnt=0; j<i; j++)
9960: 7b 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69  {.      if( sqli
9970: 74 65 33 53 74 72 49 43 6d 70 28 61 43 6f 6c 5b  te3StrICmp(aCol[
9980: 6a 5d 2e 7a 4e 61 6d 65 2c 20 7a 4e 61 6d 65 29  j].zName, zName)
9990: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 7a  ==0 ){.        z
99a0: 4e 61 6d 65 5b 6e 4e 61 6d 65 5d 20 3d 20 30 3b  Name[nName] = 0;
99b0: 0a 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d  .        zName =
99c0: 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28   sqlite3MPrintf(
99d0: 64 62 2c 20 22 25 7a 3a 25 64 22 2c 20 7a 4e 61  db, "%z:%d", zNa
99e0: 6d 65 2c 20 2b 2b 63 6e 74 29 3b 0a 20 20 20 20  me, ++cnt);.    
99f0: 20 20 20 20 6a 20 3d 20 2d 31 3b 0a 20 20 20 20      j = -1;.    
9a00: 20 20 20 20 69 66 28 20 7a 4e 61 6d 65 3d 3d 30      if( zName==0
9a10: 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20   ) break;.      
9a20: 7d 0a 20 20 20 20 7d 0a 20 20 20 20 70 43 6f 6c  }.    }.    pCol
9a30: 2d 3e 7a 4e 61 6d 65 20 3d 20 7a 4e 61 6d 65 3b  ->zName = zName;
9a40: 0a 0a 20 20 20 20 2f 2a 20 47 65 74 20 74 68 65  ..    /* Get the
9a50: 20 74 79 70 65 6e 61 6d 65 2c 20 74 79 70 65 20   typename, type 
9a60: 61 66 66 69 6e 69 74 79 2c 20 61 6e 64 20 63 6f  affinity, and co
9a70: 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65  llating sequence
9a80: 20 66 6f 72 20 74 68 65 0a 20 20 20 20 2a 2a 20   for the.    ** 
9a90: 63 6f 6c 75 6d 6e 2e 0a 20 20 20 20 2a 2f 0a 20  column..    */. 
9aa0: 20 20 20 6d 65 6d 73 65 74 28 26 73 4e 43 2c 20     memset(&sNC, 
9ab0: 30 2c 20 73 69 7a 65 6f 66 28 73 4e 43 29 29 3b  0, sizeof(sNC));
9ac0: 0a 20 20 20 20 73 4e 43 2e 70 53 72 63 4c 69 73  .    sNC.pSrcLis
9ad0: 74 20 3d 20 70 53 65 6c 65 63 74 2d 3e 70 53 72  t = pSelect->pSr
9ae0: 63 3b 0a 20 20 20 20 7a 54 79 70 65 20 3d 20 73  c;.    zType = s
9af0: 71 6c 69 74 65 33 44 62 53 74 72 44 75 70 28 64  qlite3DbStrDup(d
9b00: 62 2c 20 63 6f 6c 75 6d 6e 54 79 70 65 28 26 73  b, columnType(&s
9b10: 4e 43 2c 20 70 2c 20 30 2c 20 30 2c 20 30 29 29  NC, p, 0, 0, 0))
9b20: 3b 0a 20 20 20 20 70 43 6f 6c 2d 3e 7a 54 79 70  ;.    pCol->zTyp
9b30: 65 20 3d 20 7a 54 79 70 65 3b 0a 20 20 20 20 70  e = zType;.    p
9b40: 43 6f 6c 2d 3e 61 66 66 69 6e 69 74 79 20 3d 20  Col->affinity = 
9b50: 73 71 6c 69 74 65 33 45 78 70 72 41 66 66 69 6e  sqlite3ExprAffin
9b60: 69 74 79 28 70 29 3b 0a 20 20 20 20 70 43 6f 6c  ity(p);.    pCol
9b70: 6c 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43  l = sqlite3ExprC
9b80: 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70  ollSeq(pParse, p
9b90: 29 3b 0a 20 20 20 20 69 66 28 20 70 43 6f 6c 6c  );.    if( pColl
9ba0: 20 29 7b 0a 20 20 20 20 20 20 70 43 6f 6c 2d 3e   ){.      pCol->
9bb0: 7a 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 44  zColl = sqlite3D
9bc0: 62 53 74 72 44 75 70 28 64 62 2c 20 70 43 6f 6c  bStrDup(db, pCol
9bd0: 6c 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 7d  l->zName);.    }
9be0: 0a 20 20 7d 0a 20 20 70 54 61 62 2d 3e 69 50 4b  .  }.  pTab->iPK
9bf0: 65 79 20 3d 20 2d 31 3b 0a 20 20 72 65 74 75 72  ey = -1;.  retur
9c00: 6e 20 70 54 61 62 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  n pTab;.}../*.**
9c10: 20 50 72 65 70 61 72 65 20 61 20 53 45 4c 45 43   Prepare a SELEC
9c20: 54 20 73 74 61 74 65 6d 65 6e 74 20 66 6f 72 20  T statement for 
9c30: 70 72 6f 63 65 73 73 69 6e 67 20 62 79 20 64 6f  processing by do
9c40: 69 6e 67 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e  ing the followin
9c50: 67 0a 2a 2a 20 74 68 69 6e 67 73 3a 0a 2a 2a 0a  g.** things:.**.
9c60: 2a 2a 20 20 20 20 28 31 29 20 20 4d 61 6b 65 20  **    (1)  Make 
9c70: 73 75 72 65 20 56 44 42 45 20 63 75 72 73 6f 72  sure VDBE cursor
9c80: 20 6e 75 6d 62 65 72 73 20 68 61 76 65 20 62 65   numbers have be
9c90: 65 6e 20 61 73 73 69 67 6e 65 64 20 74 6f 20 65  en assigned to e
9ca0: 76 65 72 79 0a 2a 2a 20 20 20 20 20 20 20 20 20  very.**         
9cb0: 65 6c 65 6d 65 6e 74 20 6f 66 20 74 68 65 20 46  element of the F
9cc0: 52 4f 4d 20 63 6c 61 75 73 65 2e 0a 2a 2a 0a 2a  ROM clause..**.*
9cd0: 2a 20 20 20 20 28 32 29 20 20 46 69 6c 6c 20 69  *    (2)  Fill i
9ce0: 6e 20 74 68 65 20 70 54 61 62 4c 69 73 74 2d 3e  n the pTabList->
9cf0: 61 5b 5d 2e 70 54 61 62 20 66 69 65 6c 64 73 20  a[].pTab fields 
9d00: 69 6e 20 74 68 65 20 53 72 63 4c 69 73 74 20 74  in the SrcList t
9d10: 68 61 74 20 0a 2a 2a 20 20 20 20 20 20 20 20 20  hat .**         
9d20: 64 65 66 69 6e 65 73 20 46 52 4f 4d 20 63 6c 61  defines FROM cla
9d30: 75 73 65 2e 20 20 57 68 65 6e 20 76 69 65 77 73  use.  When views
9d40: 20 61 70 70 65 61 72 20 69 6e 20 74 68 65 20 46   appear in the F
9d50: 52 4f 4d 20 63 6c 61 75 73 65 2c 0a 2a 2a 20 20  ROM clause,.**  
9d60: 20 20 20 20 20 20 20 66 69 6c 6c 20 70 54 61 62         fill pTab
9d70: 4c 69 73 74 2d 3e 61 5b 5d 2e 70 53 65 6c 65 63  List->a[].pSelec
9d80: 74 20 77 69 74 68 20 61 20 63 6f 70 79 20 6f 66  t with a copy of
9d90: 20 74 68 65 20 53 45 4c 45 43 54 20 73 74 61 74   the SELECT stat
9da0: 65 6d 65 6e 74 0a 2a 2a 20 20 20 20 20 20 20 20  ement.**        
9db0: 20 74 68 61 74 20 69 6d 70 6c 65 6d 65 6e 74 73   that implements
9dc0: 20 74 68 65 20 76 69 65 77 2e 20 20 41 20 63 6f   the view.  A co
9dd0: 70 79 20 69 73 20 6d 61 64 65 20 6f 66 20 74 68  py is made of th
9de0: 65 20 76 69 65 77 27 73 20 53 45 4c 45 43 54 0a  e view's SELECT.
9df0: 2a 2a 20 20 20 20 20 20 20 20 20 73 74 61 74 65  **         state
9e00: 6d 65 6e 74 20 73 6f 20 74 68 61 74 20 77 65 20  ment so that we 
9e10: 63 61 6e 20 66 72 65 65 6c 79 20 6d 6f 64 69 66  can freely modif
9e20: 79 20 6f 72 20 64 65 6c 65 74 65 20 74 68 61 74  y or delete that
9e30: 20 73 74 61 74 65 6d 65 6e 74 0a 2a 2a 20 20 20   statement.**   
9e40: 20 20 20 20 20 20 77 69 74 68 6f 75 74 20 77 6f        without wo
9e50: 72 72 79 69 6e 67 20 61 62 6f 75 74 20 6d 65 73  rrying about mes
9e60: 73 69 6e 67 20 75 70 20 74 68 65 20 70 72 65 73  sing up the pres
9e70: 69 73 74 65 6e 74 20 72 65 70 72 65 73 65 6e 74  istent represent
9e80: 61 74 69 6f 6e 0a 2a 2a 20 20 20 20 20 20 20 20  ation.**        
9e90: 20 6f 66 20 74 68 65 20 76 69 65 77 2e 0a 2a 2a   of the view..**
9ea0: 0a 2a 2a 20 20 20 20 28 33 29 20 20 41 64 64 20  .**    (3)  Add 
9eb0: 74 65 72 6d 73 20 74 6f 20 74 68 65 20 57 48 45  terms to the WHE
9ec0: 52 45 20 63 6c 61 75 73 65 20 74 6f 20 61 63 63  RE clause to acc
9ed0: 6f 6d 6f 64 61 74 65 20 74 68 65 20 4e 41 54 55  omodate the NATU
9ee0: 52 41 4c 20 6b 65 79 77 6f 72 64 0a 2a 2a 20 20  RAL keyword.**  
9ef0: 20 20 20 20 20 20 20 6f 6e 20 6a 6f 69 6e 73 20         on joins 
9f00: 61 6e 64 20 74 68 65 20 4f 4e 20 61 6e 64 20 55  and the ON and U
9f10: 53 49 4e 47 20 63 6c 61 75 73 65 20 6f 66 20 6a  SING clause of j
9f20: 6f 69 6e 73 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 28  oins..**.**    (
9f30: 34 29 20 20 53 63 61 6e 20 74 68 65 20 6c 69 73  4)  Scan the lis
9f40: 74 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 69 6e 20  t of columns in 
9f50: 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 20 28  the result set (
9f60: 70 45 4c 69 73 74 29 20 6c 6f 6f 6b 69 6e 67 0a  pEList) looking.
9f70: 2a 2a 20 20 20 20 20 20 20 20 20 66 6f 72 20 69  **         for i
9f80: 6e 73 74 61 6e 63 65 73 20 6f 66 20 74 68 65 20  nstances of the 
9f90: 22 2a 22 20 6f 70 65 72 61 74 6f 72 20 6f 72 20  "*" operator or 
9fa0: 74 68 65 20 54 41 42 4c 45 2e 2a 20 6f 70 65 72  the TABLE.* oper
9fb0: 61 74 6f 72 2e 0a 2a 2a 20 20 20 20 20 20 20 20  ator..**        
9fc0: 20 49 66 20 66 6f 75 6e 64 2c 20 65 78 70 61 6e   If found, expan
9fd0: 64 20 65 61 63 68 20 22 2a 22 20 74 6f 20 62 65  d each "*" to be
9fe0: 20 65 76 65 72 79 20 63 6f 6c 75 6d 6e 20 69 6e   every column in
9ff0: 20 65 76 65 72 79 20 74 61 62 6c 65 0a 2a 2a 20   every table.** 
a000: 20 20 20 20 20 20 20 20 61 6e 64 20 54 41 42 4c          and TABL
a010: 45 2e 2a 20 74 6f 20 62 65 20 65 76 65 72 79 20  E.* to be every 
a020: 63 6f 6c 75 6d 6e 20 69 6e 20 54 41 42 4c 45 2e  column in TABLE.
a030: 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 30 20  .**.** Return 0 
a040: 6f 6e 20 73 75 63 63 65 73 73 2e 20 20 49 66 20  on success.  If 
a050: 74 68 65 72 65 20 61 72 65 20 70 72 6f 62 6c 65  there are proble
a060: 6d 73 2c 20 6c 65 61 76 65 20 61 6e 20 65 72 72  ms, leave an err
a070: 6f 72 20 6d 65 73 73 61 67 65 0a 2a 2a 20 69 6e  or message.** in
a080: 20 70 50 61 72 73 65 20 61 6e 64 20 72 65 74 75   pParse and retu
a090: 72 6e 20 6e 6f 6e 2d 7a 65 72 6f 2e 0a 2a 2f 0a  rn non-zero..*/.
a0a0: 73 74 61 74 69 63 20 69 6e 74 20 70 72 65 70 53  static int prepS
a0b0: 65 6c 65 63 74 53 74 6d 74 28 50 61 72 73 65 20  electStmt(Parse 
a0c0: 2a 70 50 61 72 73 65 2c 20 53 65 6c 65 63 74 20  *pParse, Select 
a0d0: 2a 70 29 7b 0a 20 20 69 6e 74 20 69 2c 20 6a 2c  *p){.  int i, j,
a0e0: 20 6b 2c 20 72 63 3b 0a 20 20 53 72 63 4c 69 73   k, rc;.  SrcLis
a0f0: 74 20 2a 70 54 61 62 4c 69 73 74 3b 0a 20 20 45  t *pTabList;.  E
a100: 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 3b  xprList *pEList;
a110: 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73  .  struct SrcLis
a120: 74 5f 69 74 65 6d 20 2a 70 46 72 6f 6d 3b 0a 20  t_item *pFrom;. 
a130: 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70   sqlite3 *db = p
a140: 50 61 72 73 65 2d 3e 64 62 3b 0a 0a 20 20 69 66  Parse->db;..  if
a150: 28 20 70 3d 3d 30 20 7c 7c 20 70 2d 3e 70 53 72  ( p==0 || p->pSr
a160: 63 3d 3d 30 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c  c==0 || db->mall
a170: 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20  ocFailed ){.    
a180: 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20  return 1;.  }.  
a190: 70 54 61 62 4c 69 73 74 20 3d 20 70 2d 3e 70 53  pTabList = p->pS
a1a0: 72 63 3b 0a 20 20 70 45 4c 69 73 74 20 3d 20 70  rc;.  pEList = p
a1b0: 2d 3e 70 45 4c 69 73 74 3b 0a 0a 20 20 2f 2a 20  ->pEList;..  /* 
a1c0: 4d 61 6b 65 20 73 75 72 65 20 63 75 72 73 6f 72  Make sure cursor
a1d0: 20 6e 75 6d 62 65 72 73 20 68 61 76 65 20 62 65   numbers have be
a1e0: 65 6e 20 61 73 73 69 67 6e 65 64 20 74 6f 20 61  en assigned to a
a1f0: 6c 6c 20 65 6e 74 72 69 65 73 20 69 6e 0a 20 20  ll entries in.  
a200: 2a 2a 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75  ** the FROM clau
a210: 73 65 20 6f 66 20 74 68 65 20 53 45 4c 45 43 54  se of the SELECT
a220: 20 73 74 61 74 65 6d 65 6e 74 2e 0a 20 20 2a 2f   statement..  */
a230: 0a 20 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73  .  sqlite3SrcLis
a240: 74 41 73 73 69 67 6e 43 75 72 73 6f 72 73 28 70  tAssignCursors(p
a250: 50 61 72 73 65 2c 20 70 2d 3e 70 53 72 63 29 3b  Parse, p->pSrc);
a260: 0a 0a 20 20 2f 2a 20 4c 6f 6f 6b 20 75 70 20 65  ..  /* Look up e
a270: 76 65 72 79 20 74 61 62 6c 65 20 6e 61 6d 65 64  very table named
a280: 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61   in the FROM cla
a290: 75 73 65 20 6f 66 20 74 68 65 20 73 65 6c 65 63  use of the selec
a2a0: 74 2e 20 20 49 66 0a 20 20 2a 2a 20 61 6e 20 65  t.  If.  ** an e
a2b0: 6e 74 72 79 20 6f 66 20 74 68 65 20 46 52 4f 4d  ntry of the FROM
a2c0: 20 63 6c 61 75 73 65 20 69 73 20 61 20 73 75 62   clause is a sub
a2d0: 71 75 65 72 79 20 69 6e 73 74 65 61 64 20 6f 66  query instead of
a2e0: 20 61 20 74 61 62 6c 65 20 6f 72 20 76 69 65 77   a table or view
a2f0: 2c 0a 20 20 2a 2a 20 74 68 65 6e 20 63 72 65 61  ,.  ** then crea
a300: 74 65 20 61 20 74 72 61 6e 73 69 65 6e 74 20 74  te a transient t
a310: 61 62 6c 65 20 73 74 72 75 63 74 75 72 65 20 74  able structure t
a320: 6f 20 64 65 73 63 72 69 62 65 20 74 68 65 20 73  o describe the s
a330: 75 62 71 75 65 72 79 2e 0a 20 20 2a 2f 0a 20 20  ubquery..  */.  
a340: 66 6f 72 28 69 3d 30 2c 20 70 46 72 6f 6d 3d 70  for(i=0, pFrom=p
a350: 54 61 62 4c 69 73 74 2d 3e 61 3b 20 69 3c 70 54  TabList->a; i<pT
a360: 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3b 20 69 2b  abList->nSrc; i+
a370: 2b 2c 20 70 46 72 6f 6d 2b 2b 29 7b 0a 20 20 20  +, pFrom++){.   
a380: 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20   Table *pTab;.  
a390: 20 20 69 66 28 20 70 46 72 6f 6d 2d 3e 70 54 61    if( pFrom->pTa
a3a0: 62 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a  b!=0 ){.      /*
a3b0: 20 54 68 69 73 20 73 74 61 74 65 6d 65 6e 74 20   This statement 
a3c0: 68 61 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e  has already been
a3d0: 20 70 72 65 70 61 72 65 64 2e 20 20 54 68 65 72   prepared.  Ther
a3e0: 65 20 69 73 20 6e 6f 20 6e 65 65 64 0a 20 20 20  e is no need.   
a3f0: 20 20 20 2a 2a 20 74 6f 20 67 6f 20 66 75 72 74     ** to go furt
a400: 68 65 72 2e 20 2a 2f 0a 20 20 20 20 20 20 61 73  her. */.      as
a410: 73 65 72 74 28 20 69 3d 3d 30 20 29 3b 0a 20 20  sert( i==0 );.  
a420: 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
a430: 20 20 7d 0a 20 20 20 20 69 66 28 20 70 46 72 6f    }.    if( pFro
a440: 6d 2d 3e 7a 4e 61 6d 65 3d 3d 30 20 29 7b 0a 23  m->zName==0 ){.#
a450: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
a460: 49 54 5f 53 55 42 51 55 45 52 59 0a 20 20 20 20  IT_SUBQUERY.    
a470: 20 20 2f 2a 20 41 20 73 75 62 2d 71 75 65 72 79    /* A sub-query
a480: 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61   in the FROM cla
a490: 75 73 65 20 6f 66 20 61 20 53 45 4c 45 43 54 20  use of a SELECT 
a4a0: 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  */.      assert(
a4b0: 20 70 46 72 6f 6d 2d 3e 70 53 65 6c 65 63 74 21   pFrom->pSelect!
a4c0: 3d 30 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20  =0 );.      if( 
a4d0: 70 46 72 6f 6d 2d 3e 7a 41 6c 69 61 73 3d 3d 30  pFrom->zAlias==0
a4e0: 20 29 7b 0a 20 20 20 20 20 20 20 20 70 46 72 6f   ){.        pFro
a4f0: 6d 2d 3e 7a 41 6c 69 61 73 20 3d 0a 20 20 20 20  m->zAlias =.    
a500: 20 20 20 20 20 20 73 71 6c 69 74 65 33 4d 50 72        sqlite3MPr
a510: 69 6e 74 66 28 64 62 2c 20 22 73 71 6c 69 74 65  intf(db, "sqlite
a520: 5f 73 75 62 71 75 65 72 79 5f 25 70 5f 22 2c 20  _subquery_%p_", 
a530: 28 76 6f 69 64 2a 29 70 46 72 6f 6d 2d 3e 70 53  (void*)pFrom->pS
a540: 65 6c 65 63 74 29 3b 0a 20 20 20 20 20 20 7d 0a  elect);.      }.
a550: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 46        assert( pF
a560: 72 6f 6d 2d 3e 70 54 61 62 3d 3d 30 20 29 3b 0a  rom->pTab==0 );.
a570: 20 20 20 20 20 20 70 46 72 6f 6d 2d 3e 70 54 61        pFrom->pTa
a580: 62 20 3d 20 70 54 61 62 20 3d 20 0a 20 20 20 20  b = pTab = .    
a590: 20 20 20 20 73 71 6c 69 74 65 33 52 65 73 75 6c      sqlite3Resul
a5a0: 74 53 65 74 4f 66 53 65 6c 65 63 74 28 70 50 61  tSetOfSelect(pPa
a5b0: 72 73 65 2c 20 70 46 72 6f 6d 2d 3e 7a 41 6c 69  rse, pFrom->zAli
a5c0: 61 73 2c 20 70 46 72 6f 6d 2d 3e 70 53 65 6c 65  as, pFrom->pSele
a5d0: 63 74 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70  ct);.      if( p
a5e0: 54 61 62 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  Tab==0 ){.      
a5f0: 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20    return 1;.    
a600: 20 20 7d 0a 20 20 20 20 20 20 2f 2a 20 54 68 65    }.      /* The
a610: 20 69 73 45 70 68 65 6d 20 66 6c 61 67 20 69 6e   isEphem flag in
a620: 64 69 63 61 74 65 73 20 74 68 61 74 20 74 68 65  dicates that the
a630: 20 54 61 62 6c 65 20 73 74 72 75 63 74 75 72 65   Table structure
a640: 20 68 61 73 20 62 65 65 6e 0a 20 20 20 20 20 20   has been.      
a650: 2a 2a 20 64 79 6e 61 6d 69 63 61 6c 6c 79 20 61  ** dynamically a
a660: 6c 6c 6f 63 61 74 65 64 20 61 6e 64 20 6d 61 79  llocated and may
a670: 20 62 65 20 66 72 65 65 64 20 61 74 20 61 6e 79   be freed at any
a680: 20 74 69 6d 65 2e 20 20 49 6e 20 6f 74 68 65 72   time.  In other
a690: 20 77 6f 72 64 73 2c 0a 20 20 20 20 20 20 2a 2a   words,.      **
a6a0: 20 70 54 61 62 20 69 73 20 6e 6f 74 20 70 6f 69   pTab is not poi
a6b0: 6e 74 69 6e 67 20 74 6f 20 61 20 70 65 72 73 69  nting to a persi
a6c0: 73 74 65 6e 74 20 74 61 62 6c 65 20 73 74 72 75  stent table stru
a6d0: 63 74 75 72 65 20 74 68 61 74 20 64 65 66 69 6e  cture that defin
a6e0: 65 73 0a 20 20 20 20 20 20 2a 2a 20 70 61 72 74  es.      ** part
a6f0: 20 6f 66 20 74 68 65 20 73 63 68 65 6d 61 2e 20   of the schema. 
a700: 2a 2f 0a 20 20 20 20 20 20 70 54 61 62 2d 3e 69  */.      pTab->i
a710: 73 45 70 68 65 6d 20 3d 20 31 3b 0a 23 65 6e 64  sEphem = 1;.#end
a720: 69 66 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  if.    }else{.  
a730: 20 20 20 20 2f 2a 20 41 6e 20 6f 72 64 69 6e 61      /* An ordina
a740: 72 79 20 74 61 62 6c 65 20 6f 72 20 76 69 65 77  ry table or view
a750: 20 6e 61 6d 65 20 69 6e 20 74 68 65 20 46 52 4f   name in the FRO
a760: 4d 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 20 20  M clause */.    
a770: 20 20 61 73 73 65 72 74 28 20 70 46 72 6f 6d 2d    assert( pFrom-
a780: 3e 70 54 61 62 3d 3d 30 20 29 3b 0a 20 20 20 20  >pTab==0 );.    
a790: 20 20 70 46 72 6f 6d 2d 3e 70 54 61 62 20 3d 20    pFrom->pTab = 
a7a0: 70 54 61 62 20 3d 20 0a 20 20 20 20 20 20 20 20  pTab = .        
a7b0: 73 71 6c 69 74 65 33 4c 6f 63 61 74 65 54 61 62  sqlite3LocateTab
a7c0: 6c 65 28 70 50 61 72 73 65 2c 30 2c 70 46 72 6f  le(pParse,0,pFro
a7d0: 6d 2d 3e 7a 4e 61 6d 65 2c 70 46 72 6f 6d 2d 3e  m->zName,pFrom->
a7e0: 7a 44 61 74 61 62 61 73 65 29 3b 0a 20 20 20 20  zDatabase);.    
a7f0: 20 20 69 66 28 20 70 54 61 62 3d 3d 30 20 29 7b    if( pTab==0 ){
a800: 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
a810: 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  1;.      }.     
a820: 20 70 54 61 62 2d 3e 6e 52 65 66 2b 2b 3b 0a 23   pTab->nRef++;.#
a830: 69 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  if !defined(SQLI
a840: 54 45 5f 4f 4d 49 54 5f 56 49 45 57 29 20 7c 7c  TE_OMIT_VIEW) ||
a850: 20 21 64 65 66 69 6e 65 64 20 28 53 51 4c 49 54   !defined (SQLIT
a860: 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41  E_OMIT_VIRTUALTA
a870: 42 4c 45 29 0a 20 20 20 20 20 20 69 66 28 20 70  BLE).      if( p
a880: 54 61 62 2d 3e 70 53 65 6c 65 63 74 20 7c 7c 20  Tab->pSelect || 
a890: 49 73 56 69 72 74 75 61 6c 28 70 54 61 62 29 20  IsVirtual(pTab) 
a8a0: 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 57 65  ){.        /* We
a8b0: 20 72 65 61 63 68 20 68 65 72 65 20 69 66 20 74   reach here if t
a8c0: 68 65 20 6e 61 6d 65 64 20 74 61 62 6c 65 20 69  he named table i
a8d0: 73 20 61 20 72 65 61 6c 6c 79 20 61 20 76 69 65  s a really a vie
a8e0: 77 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28  w */.        if(
a8f0: 20 73 71 6c 69 74 65 33 56 69 65 77 47 65 74 43   sqlite3ViewGetC
a900: 6f 6c 75 6d 6e 4e 61 6d 65 73 28 70 50 61 72 73  olumnNames(pPars
a910: 65 2c 20 70 54 61 62 29 20 29 7b 0a 20 20 20 20  e, pTab) ){.    
a920: 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a        return 1;.
a930: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
a940: 20 20 2f 2a 20 49 66 20 70 46 72 6f 6d 2d 3e 70    /* If pFrom->p
a950: 53 65 6c 65 63 74 21 3d 30 20 69 74 20 6d 65 61  Select!=0 it mea
a960: 6e 73 20 77 65 20 61 72 65 20 64 65 61 6c 69 6e  ns we are dealin
a970: 67 20 77 69 74 68 20 61 0a 20 20 20 20 20 20 20  g with a.       
a980: 20 2a 2a 20 76 69 65 77 20 77 69 74 68 69 6e 20   ** view within 
a990: 61 20 76 69 65 77 2e 20 20 54 68 65 20 53 45 4c  a view.  The SEL
a9a0: 45 43 54 20 73 74 72 75 63 74 75 72 65 20 68 61  ECT structure ha
a9b0: 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e 0a 20  s already been. 
a9c0: 20 20 20 20 20 20 20 2a 2a 20 63 6f 70 69 65 64         ** copied
a9d0: 20 62 79 20 74 68 65 20 6f 75 74 65 72 20 76 69   by the outer vi
a9e0: 65 77 20 73 6f 20 77 65 20 63 61 6e 20 73 6b 69  ew so we can ski
a9f0: 70 20 74 68 65 20 63 6f 70 79 20 73 74 65 70 20  p the copy step 
aa00: 68 65 72 65 0a 20 20 20 20 20 20 20 20 2a 2a 20  here.        ** 
aa10: 69 6e 20 74 68 65 20 69 6e 6e 65 72 20 76 69 65  in the inner vie
aa20: 77 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  w..        */.  
aa30: 20 20 20 20 20 20 69 66 28 20 70 46 72 6f 6d 2d        if( pFrom-
aa40: 3e 70 53 65 6c 65 63 74 3d 3d 30 20 29 7b 0a 20  >pSelect==0 ){. 
aa50: 20 20 20 20 20 20 20 20 20 70 46 72 6f 6d 2d 3e           pFrom->
aa60: 70 53 65 6c 65 63 74 20 3d 20 73 71 6c 69 74 65  pSelect = sqlite
aa70: 33 53 65 6c 65 63 74 44 75 70 28 64 62 2c 20 70  3SelectDup(db, p
aa80: 54 61 62 2d 3e 70 53 65 6c 65 63 74 29 3b 0a 20  Tab->pSelect);. 
aa90: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
aaa0: 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a 20 20  .#endif.    }.  
aab0: 7d 0a 0a 20 20 2f 2a 20 50 72 6f 63 65 73 73 20  }..  /* Process 
aac0: 4e 41 54 55 52 41 4c 20 6b 65 79 77 6f 72 64 73  NATURAL keywords
aad0: 2c 20 61 6e 64 20 4f 4e 20 61 6e 64 20 55 53 49  , and ON and USI
aae0: 4e 47 20 63 6c 61 75 73 65 73 20 6f 66 20 6a 6f  NG clauses of jo
aaf0: 69 6e 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ins..  */.  if( 
ab00: 73 71 6c 69 74 65 50 72 6f 63 65 73 73 4a 6f 69  sqliteProcessJoi
ab10: 6e 28 70 50 61 72 73 65 2c 20 70 29 20 29 20 72  n(pParse, p) ) r
ab20: 65 74 75 72 6e 20 31 3b 0a 0a 20 20 2f 2a 20 46  eturn 1;..  /* F
ab30: 6f 72 20 65 76 65 72 79 20 22 2a 22 20 74 68 61  or every "*" tha
ab40: 74 20 6f 63 63 75 72 73 20 69 6e 20 74 68 65 20  t occurs in the 
ab50: 63 6f 6c 75 6d 6e 20 6c 69 73 74 2c 20 69 6e 73  column list, ins
ab60: 65 72 74 20 74 68 65 20 6e 61 6d 65 73 20 6f 66  ert the names of
ab70: 0a 20 20 2a 2a 20 61 6c 6c 20 63 6f 6c 75 6d 6e  .  ** all column
ab80: 73 20 69 6e 20 61 6c 6c 20 74 61 62 6c 65 73 2e  s in all tables.
ab90: 20 20 41 6e 64 20 66 6f 72 20 65 76 65 72 79 20    And for every 
aba0: 54 41 42 4c 45 2e 2a 20 69 6e 73 65 72 74 20 74  TABLE.* insert t
abb0: 68 65 20 6e 61 6d 65 73 0a 20 20 2a 2a 20 6f 66  he names.  ** of
abc0: 20 61 6c 6c 20 63 6f 6c 75 6d 6e 73 20 69 6e 20   all columns in 
abd0: 54 41 42 4c 45 2e 20 20 54 68 65 20 70 61 72 73  TABLE.  The pars
abe0: 65 72 20 69 6e 73 65 72 74 65 64 20 61 20 73 70  er inserted a sp
abf0: 65 63 69 61 6c 20 65 78 70 72 65 73 73 69 6f 6e  ecial expression
ac00: 0a 20 20 2a 2a 20 77 69 74 68 20 74 68 65 20 54  .  ** with the T
ac10: 4b 5f 41 4c 4c 20 6f 70 65 72 61 74 6f 72 20 66  K_ALL operator f
ac20: 6f 72 20 65 61 63 68 20 22 2a 22 20 74 68 61 74  or each "*" that
ac30: 20 69 74 20 66 6f 75 6e 64 20 69 6e 20 74 68 65   it found in the
ac40: 20 63 6f 6c 75 6d 6e 20 6c 69 73 74 2e 0a 20 20   column list..  
ac50: 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  ** The following
ac60: 20 63 6f 64 65 20 6a 75 73 74 20 68 61 73 20 74   code just has t
ac70: 6f 20 6c 6f 63 61 74 65 20 74 68 65 20 54 4b 5f  o locate the TK_
ac80: 41 4c 4c 20 65 78 70 72 65 73 73 69 6f 6e 73 20  ALL expressions 
ac90: 61 6e 64 20 65 78 70 61 6e 64 0a 20 20 2a 2a 20  and expand.  ** 
aca0: 65 61 63 68 20 6f 6e 65 20 74 6f 20 74 68 65 20  each one to the 
acb0: 6c 69 73 74 20 6f 66 20 61 6c 6c 20 63 6f 6c 75  list of all colu
acc0: 6d 6e 73 20 69 6e 20 61 6c 6c 20 74 61 62 6c 65  mns in all table
acd0: 73 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65  s..  **.  ** The
ace0: 20 66 69 72 73 74 20 6c 6f 6f 70 20 6a 75 73 74   first loop just
acf0: 20 63 68 65 63 6b 73 20 74 6f 20 73 65 65 20 69   checks to see i
ad00: 66 20 74 68 65 72 65 20 61 72 65 20 61 6e 79 20  f there are any 
ad10: 22 2a 22 20 6f 70 65 72 61 74 6f 72 73 0a 20 20  "*" operators.  
ad20: 2a 2a 20 74 68 61 74 20 6e 65 65 64 20 65 78 70  ** that need exp
ad30: 61 6e 64 69 6e 67 2e 0a 20 20 2a 2f 0a 20 20 66  anding..  */.  f
ad40: 6f 72 28 6b 3d 30 3b 20 6b 3c 70 45 4c 69 73 74  or(k=0; k<pEList
ad50: 2d 3e 6e 45 78 70 72 3b 20 6b 2b 2b 29 7b 0a 20  ->nExpr; k++){. 
ad60: 20 20 20 45 78 70 72 20 2a 70 45 20 3d 20 70 45     Expr *pE = pE
ad70: 4c 69 73 74 2d 3e 61 5b 6b 5d 2e 70 45 78 70 72  List->a[k].pExpr
ad80: 3b 0a 20 20 20 20 69 66 28 20 70 45 2d 3e 6f 70  ;.    if( pE->op
ad90: 3d 3d 54 4b 5f 41 4c 4c 20 29 20 62 72 65 61 6b  ==TK_ALL ) break
ada0: 3b 0a 20 20 20 20 69 66 28 20 70 45 2d 3e 6f 70  ;.    if( pE->op
adb0: 3d 3d 54 4b 5f 44 4f 54 20 26 26 20 70 45 2d 3e  ==TK_DOT && pE->
adc0: 70 52 69 67 68 74 20 26 26 20 70 45 2d 3e 70 52  pRight && pE->pR
add0: 69 67 68 74 2d 3e 6f 70 3d 3d 54 4b 5f 41 4c 4c  ight->op==TK_ALL
ade0: 0a 20 20 20 20 20 20 20 20 20 26 26 20 70 45 2d  .         && pE-
adf0: 3e 70 4c 65 66 74 20 26 26 20 70 45 2d 3e 70 4c  >pLeft && pE->pL
ae00: 65 66 74 2d 3e 6f 70 3d 3d 54 4b 5f 49 44 20 29  eft->op==TK_ID )
ae10: 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 72 63   break;.  }.  rc
ae20: 20 3d 20 30 3b 0a 20 20 69 66 28 20 6b 3c 70 45   = 0;.  if( k<pE
ae30: 4c 69 73 74 2d 3e 6e 45 78 70 72 20 29 7b 0a 20  List->nExpr ){. 
ae40: 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 49 66 20     /*.    ** If 
ae50: 77 65 20 67 65 74 20 68 65 72 65 20 69 74 20 6d  we get here it m
ae60: 65 61 6e 73 20 74 68 65 20 72 65 73 75 6c 74 20  eans the result 
ae70: 73 65 74 20 63 6f 6e 74 61 69 6e 73 20 6f 6e 65  set contains one
ae80: 20 6f 72 20 6d 6f 72 65 20 22 2a 22 0a 20 20 20   or more "*".   
ae90: 20 2a 2a 20 6f 70 65 72 61 74 6f 72 73 20 74 68   ** operators th
aea0: 61 74 20 6e 65 65 64 20 74 6f 20 62 65 20 65 78  at need to be ex
aeb0: 70 61 6e 64 65 64 2e 20 20 4c 6f 6f 70 20 74 68  panded.  Loop th
aec0: 72 6f 75 67 68 20 65 61 63 68 20 65 78 70 72 65  rough each expre
aed0: 73 73 69 6f 6e 0a 20 20 20 20 2a 2a 20 69 6e 20  ssion.    ** in 
aee0: 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 20 61  the result set a
aef0: 6e 64 20 65 78 70 61 6e 64 20 74 68 65 6d 20 6f  nd expand them o
af00: 6e 65 20 62 79 20 6f 6e 65 2e 0a 20 20 20 20 2a  ne by one..    *
af10: 2f 0a 20 20 20 20 73 74 72 75 63 74 20 45 78 70  /.    struct Exp
af20: 72 4c 69 73 74 5f 69 74 65 6d 20 2a 61 20 3d 20  rList_item *a = 
af30: 70 45 4c 69 73 74 2d 3e 61 3b 0a 20 20 20 20 45  pEList->a;.    E
af40: 78 70 72 4c 69 73 74 20 2a 70 4e 65 77 20 3d 20  xprList *pNew = 
af50: 30 3b 0a 20 20 20 20 69 6e 74 20 66 6c 61 67 73  0;.    int flags
af60: 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 66   = pParse->db->f
af70: 6c 61 67 73 3b 0a 20 20 20 20 69 6e 74 20 6c 6f  lags;.    int lo
af80: 6e 67 4e 61 6d 65 73 20 3d 20 28 66 6c 61 67 73  ngNames = (flags
af90: 20 26 20 53 51 4c 49 54 45 5f 46 75 6c 6c 43 6f   & SQLITE_FullCo
afa0: 6c 4e 61 6d 65 73 29 21 3d 30 20 26 26 0a 20 20  lNames)!=0 &&.  
afb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
afc0: 20 20 20 20 28 66 6c 61 67 73 20 26 20 53 51 4c      (flags & SQL
afd0: 49 54 45 5f 53 68 6f 72 74 43 6f 6c 4e 61 6d 65  ITE_ShortColName
afe0: 73 29 3d 3d 30 3b 0a 0a 20 20 20 20 66 6f 72 28  s)==0;..    for(
aff0: 6b 3d 30 3b 20 6b 3c 70 45 4c 69 73 74 2d 3e 6e  k=0; k<pEList->n
b000: 45 78 70 72 3b 20 6b 2b 2b 29 7b 0a 20 20 20 20  Expr; k++){.    
b010: 20 20 45 78 70 72 20 2a 70 45 20 3d 20 61 5b 6b    Expr *pE = a[k
b020: 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 20 20 69  ].pExpr;.      i
b030: 66 28 20 70 45 2d 3e 6f 70 21 3d 54 4b 5f 41 4c  f( pE->op!=TK_AL
b040: 4c 20 26 26 0a 20 20 20 20 20 20 20 20 20 20 20  L &&.           
b050: 28 70 45 2d 3e 6f 70 21 3d 54 4b 5f 44 4f 54 20  (pE->op!=TK_DOT 
b060: 7c 7c 20 70 45 2d 3e 70 52 69 67 68 74 3d 3d 30  || pE->pRight==0
b070: 20 7c 7c 20 70 45 2d 3e 70 52 69 67 68 74 2d 3e   || pE->pRight->
b080: 6f 70 21 3d 54 4b 5f 41 4c 4c 29 20 29 7b 0a 20  op!=TK_ALL) ){. 
b090: 20 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20 70         /* This p
b0a0: 61 72 74 69 63 75 6c 61 72 20 65 78 70 72 65 73  articular expres
b0b0: 73 69 6f 6e 20 64 6f 65 73 20 6e 6f 74 20 6e 65  sion does not ne
b0c0: 65 64 20 74 6f 20 62 65 20 65 78 70 61 6e 64 65  ed to be expande
b0d0: 64 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  d..        */.  
b0e0: 20 20 20 20 20 20 70 4e 65 77 20 3d 20 73 71 6c        pNew = sql
b0f0: 69 74 65 33 45 78 70 72 4c 69 73 74 41 70 70 65  ite3ExprListAppe
b100: 6e 64 28 70 50 61 72 73 65 2c 20 70 4e 65 77 2c  nd(pParse, pNew,
b110: 20 61 5b 6b 5d 2e 70 45 78 70 72 2c 20 30 29 3b   a[k].pExpr, 0);
b120: 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 4e 65  .        if( pNe
b130: 77 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70  w ){.          p
b140: 4e 65 77 2d 3e 61 5b 70 4e 65 77 2d 3e 6e 45 78  New->a[pNew->nEx
b150: 70 72 2d 31 5d 2e 7a 4e 61 6d 65 20 3d 20 61 5b  pr-1].zName = a[
b160: 6b 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20  k].zName;.      
b170: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
b180: 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 20     rc = 1;.     
b190: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 61 5b 6b     }.        a[k
b1a0: 5d 2e 70 45 78 70 72 20 3d 20 30 3b 0a 20 20 20  ].pExpr = 0;.   
b1b0: 20 20 20 20 20 61 5b 6b 5d 2e 7a 4e 61 6d 65 20       a[k].zName 
b1c0: 3d 20 30 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  = 0;.      }else
b1d0: 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68 69  {.        /* Thi
b1e0: 73 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20  s expression is 
b1f0: 61 20 22 2a 22 20 6f 72 20 61 20 22 54 41 42 4c  a "*" or a "TABL
b200: 45 2e 2a 22 20 61 6e 64 20 6e 65 65 64 73 20 74  E.*" and needs t
b210: 6f 20 62 65 0a 20 20 20 20 20 20 20 20 2a 2a 20  o be.        ** 
b220: 65 78 70 61 6e 64 65 64 2e 20 2a 2f 0a 20 20 20  expanded. */.   
b230: 20 20 20 20 20 69 6e 74 20 74 61 62 6c 65 53 65       int tableSe
b240: 65 6e 20 3d 20 30 3b 20 20 20 20 20 20 2f 2a 20  en = 0;      /* 
b250: 53 65 74 20 74 6f 20 31 20 77 68 65 6e 20 54 41  Set to 1 when TA
b260: 42 4c 45 20 6d 61 74 63 68 65 73 20 2a 2f 0a 20  BLE matches */. 
b270: 20 20 20 20 20 20 20 63 68 61 72 20 2a 7a 54 4e         char *zTN
b280: 61 6d 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ame;            
b290: 2f 2a 20 74 65 78 74 20 6f 66 20 6e 61 6d 65 20  /* text of name 
b2a0: 6f 66 20 54 41 42 4c 45 20 2a 2f 0a 20 20 20 20  of TABLE */.    
b2b0: 20 20 20 20 69 66 28 20 70 45 2d 3e 6f 70 3d 3d      if( pE->op==
b2c0: 54 4b 5f 44 4f 54 20 26 26 20 70 45 2d 3e 70 4c  TK_DOT && pE->pL
b2d0: 65 66 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20  eft ){.         
b2e0: 20 7a 54 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65   zTName = sqlite
b2f0: 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 64  3NameFromToken(d
b300: 62 2c 20 26 70 45 2d 3e 70 4c 65 66 74 2d 3e 74  b, &pE->pLeft->t
b310: 6f 6b 65 6e 29 3b 0a 20 20 20 20 20 20 20 20 7d  oken);.        }
b320: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
b330: 7a 54 4e 61 6d 65 20 3d 20 30 3b 0a 20 20 20 20  zTName = 0;.    
b340: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 66 6f      }.        fo
b350: 72 28 69 3d 30 2c 20 70 46 72 6f 6d 3d 70 54 61  r(i=0, pFrom=pTa
b360: 62 4c 69 73 74 2d 3e 61 3b 20 69 3c 70 54 61 62  bList->a; i<pTab
b370: 4c 69 73 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b 2c  List->nSrc; i++,
b380: 20 70 46 72 6f 6d 2b 2b 29 7b 0a 20 20 20 20 20   pFrom++){.     
b390: 20 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62       Table *pTab
b3a0: 20 3d 20 70 46 72 6f 6d 2d 3e 70 54 61 62 3b 0a   = pFrom->pTab;.
b3b0: 20 20 20 20 20 20 20 20 20 20 63 68 61 72 20 2a            char *
b3c0: 7a 54 61 62 4e 61 6d 65 20 3d 20 70 46 72 6f 6d  zTabName = pFrom
b3d0: 2d 3e 7a 41 6c 69 61 73 3b 0a 20 20 20 20 20 20  ->zAlias;.      
b3e0: 20 20 20 20 69 66 28 20 7a 54 61 62 4e 61 6d 65      if( zTabName
b3f0: 3d 3d 30 20 7c 7c 20 7a 54 61 62 4e 61 6d 65 5b  ==0 || zTabName[
b400: 30 5d 3d 3d 30 20 29 7b 20 0a 20 20 20 20 20 20  0]==0 ){ .      
b410: 20 20 20 20 20 20 7a 54 61 62 4e 61 6d 65 20 3d        zTabName =
b420: 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 3b 0a 20 20   pTab->zName;.  
b430: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
b440: 20 20 20 20 69 66 28 20 7a 54 4e 61 6d 65 20 26      if( zTName &
b450: 26 20 28 7a 54 61 62 4e 61 6d 65 3d 3d 30 20 7c  & (zTabName==0 |
b460: 7c 20 7a 54 61 62 4e 61 6d 65 5b 30 5d 3d 3d 30  | zTabName[0]==0
b470: 20 7c 7c 20 0a 20 20 20 20 20 20 20 20 20 20 20   || .           
b480: 20 20 20 20 20 20 73 71 6c 69 74 65 33 53 74 72        sqlite3Str
b490: 49 43 6d 70 28 7a 54 4e 61 6d 65 2c 20 7a 54 61  ICmp(zTName, zTa
b4a0: 62 4e 61 6d 65 29 21 3d 30 29 20 29 7b 0a 20 20  bName)!=0) ){.  
b4b0: 20 20 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e            contin
b4c0: 75 65 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  ue;.          }.
b4d0: 20 20 20 20 20 20 20 20 20 20 74 61 62 6c 65 53            tableS
b4e0: 65 65 6e 20 3d 20 31 3b 0a 20 20 20 20 20 20 20  een = 1;.       
b4f0: 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 54     for(j=0; j<pT
b500: 61 62 2d 3e 6e 43 6f 6c 3b 20 6a 2b 2b 29 7b 0a  ab->nCol; j++){.
b510: 20 20 20 20 20 20 20 20 20 20 20 20 45 78 70 72              Expr
b520: 20 2a 70 45 78 70 72 2c 20 2a 70 52 69 67 68 74   *pExpr, *pRight
b530: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 63 68  ;.            ch
b540: 61 72 20 2a 7a 4e 61 6d 65 20 3d 20 70 54 61 62  ar *zName = pTab
b550: 2d 3e 61 43 6f 6c 5b 6a 5d 2e 7a 4e 61 6d 65 3b  ->aCol[j].zName;
b560: 0a 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ..            /*
b570: 20 49 66 20 61 20 63 6f 6c 75 6d 6e 20 69 73 20   If a column is 
b580: 6d 61 72 6b 65 64 20 61 73 20 27 68 69 64 64 65  marked as 'hidde
b590: 6e 27 20 28 63 75 72 72 65 6e 74 6c 79 20 6f 6e  n' (currently on
b5a0: 6c 79 20 70 6f 73 73 69 62 6c 65 0a 20 20 20 20  ly possible.    
b5b0: 20 20 20 20 20 20 20 20 2a 2a 20 66 6f 72 20 76          ** for v
b5c0: 69 72 74 75 61 6c 20 74 61 62 6c 65 73 29 2c 20  irtual tables), 
b5d0: 64 6f 20 6e 6f 74 20 69 6e 63 6c 75 64 65 20 69  do not include i
b5e0: 74 20 69 6e 20 74 68 65 20 65 78 70 61 6e 64 65  t in the expande
b5f0: 64 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a  d.            **
b600: 20 72 65 73 75 6c 74 2d 73 65 74 20 6c 69 73 74   result-set list
b610: 2e 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2f  ..            */
b620: 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28  .            if(
b630: 20 49 73 48 69 64 64 65 6e 43 6f 6c 75 6d 6e 28   IsHiddenColumn(
b640: 26 70 54 61 62 2d 3e 61 43 6f 6c 5b 6a 5d 29 20  &pTab->aCol[j]) 
b650: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
b660: 20 61 73 73 65 72 74 28 49 73 56 69 72 74 75 61   assert(IsVirtua
b670: 6c 28 70 54 61 62 29 29 3b 0a 20 20 20 20 20 20  l(pTab));.      
b680: 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65          continue
b690: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a  ;.            }.
b6a0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28  .            if(
b6b0: 20 69 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20   i>0 ){.        
b6c0: 20 20 20 20 20 20 73 74 72 75 63 74 20 53 72 63        struct Src
b6d0: 4c 69 73 74 5f 69 74 65 6d 20 2a 70 4c 65 66 74  List_item *pLeft
b6e0: 20 3d 20 26 70 54 61 62 4c 69 73 74 2d 3e 61 5b   = &pTabList->a[
b6f0: 69 2d 31 5d 3b 0a 20 20 20 20 20 20 20 20 20 20  i-1];.          
b700: 20 20 20 20 69 66 28 20 28 70 4c 65 66 74 5b 31      if( (pLeft[1
b710: 5d 2e 6a 6f 69 6e 74 79 70 65 20 26 20 4a 54 5f  ].jointype & JT_
b720: 4e 41 54 55 52 41 4c 29 21 3d 30 20 26 26 0a 20  NATURAL)!=0 &&. 
b730: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b740: 20 20 20 20 20 20 20 63 6f 6c 75 6d 6e 49 6e 64         columnInd
b750: 65 78 28 70 4c 65 66 74 2d 3e 70 54 61 62 2c 20  ex(pLeft->pTab, 
b760: 7a 4e 61 6d 65 29 3e 3d 30 20 29 7b 0a 20 20 20  zName)>=0 ){.   
b770: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
b780: 49 6e 20 61 20 4e 41 54 55 52 41 4c 20 6a 6f 69  In a NATURAL joi
b790: 6e 2c 20 6f 6d 69 74 20 74 68 65 20 6a 6f 69 6e  n, omit the join
b7a0: 20 63 6f 6c 75 6d 6e 73 20 66 72 6f 6d 20 74 68   columns from th
b7b0: 65 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  e .             
b7c0: 20 20 20 2a 2a 20 74 61 62 6c 65 20 6f 6e 20 74     ** table on t
b7d0: 68 65 20 72 69 67 68 74 20 2a 2f 0a 20 20 20 20  he right */.    
b7e0: 20 20 20 20 20 20 20 20 20 20 20 20 63 6f 6e 74              cont
b7f0: 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 20 20  inue;.          
b800: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
b810: 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 49      if( sqlite3I
b820: 64 4c 69 73 74 49 6e 64 65 78 28 70 4c 65 66 74  dListIndex(pLeft
b830: 5b 31 5d 2e 70 55 73 69 6e 67 2c 20 7a 4e 61 6d  [1].pUsing, zNam
b840: 65 29 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  e)>=0 ){.       
b850: 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 20 61           /* In a
b860: 20 6a 6f 69 6e 20 77 69 74 68 20 61 20 55 53 49   join with a USI
b870: 4e 47 20 63 6c 61 75 73 65 2c 20 6f 6d 69 74 20  NG clause, omit 
b880: 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 0a 20  columns in the. 
b890: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2a                 *
b8a0: 2a 20 75 73 69 6e 67 20 63 6c 61 75 73 65 20 66  * using clause f
b8b0: 72 6f 6d 20 74 68 65 20 74 61 62 6c 65 20 6f 6e  rom the table on
b8c0: 20 74 68 65 20 72 69 67 68 74 2e 20 2a 2f 0a 20   the right. */. 
b8d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 63                 c
b8e0: 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20  ontinue;.       
b8f0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
b900: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
b910: 20 20 20 70 52 69 67 68 74 20 3d 20 73 71 6c 69     pRight = sqli
b920: 74 65 33 50 45 78 70 72 28 70 50 61 72 73 65 2c  te3PExpr(pParse,
b930: 20 54 4b 5f 49 44 2c 20 30 2c 20 30 2c 20 30 29   TK_ID, 0, 0, 0)
b940: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  ;.            if
b950: 28 20 70 52 69 67 68 74 3d 3d 30 20 29 20 62 72  ( pRight==0 ) br
b960: 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 20  eak;.           
b970: 20 73 65 74 51 75 6f 74 65 64 54 6f 6b 65 6e 28   setQuotedToken(
b980: 70 50 61 72 73 65 2c 20 26 70 52 69 67 68 74 2d  pParse, &pRight-
b990: 3e 74 6f 6b 65 6e 2c 20 7a 4e 61 6d 65 29 3b 0a  >token, zName);.
b9a0: 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
b9b0: 7a 54 61 62 4e 61 6d 65 20 26 26 20 28 6c 6f 6e  zTabName && (lon
b9c0: 67 4e 61 6d 65 73 20 7c 7c 20 70 54 61 62 4c 69  gNames || pTabLi
b9d0: 73 74 2d 3e 6e 53 72 63 3e 31 29 20 29 7b 0a 20  st->nSrc>1) ){. 
b9e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 45 78 70               Exp
b9f0: 72 20 2a 70 4c 65 66 74 20 3d 20 73 71 6c 69 74  r *pLeft = sqlit
ba00: 65 33 50 45 78 70 72 28 70 50 61 72 73 65 2c 20  e3PExpr(pParse, 
ba10: 54 4b 5f 49 44 2c 20 30 2c 20 30 2c 20 30 29 3b  TK_ID, 0, 0, 0);
ba20: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70  .              p
ba30: 45 78 70 72 20 3d 20 73 71 6c 69 74 65 33 50 45  Expr = sqlite3PE
ba40: 78 70 72 28 70 50 61 72 73 65 2c 20 54 4b 5f 44  xpr(pParse, TK_D
ba50: 4f 54 2c 20 70 4c 65 66 74 2c 20 70 52 69 67 68  OT, pLeft, pRigh
ba60: 74 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20  t, 0);.         
ba70: 20 20 20 20 20 69 66 28 20 70 45 78 70 72 3d 3d       if( pExpr==
ba80: 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20  0 ) break;.     
ba90: 20 20 20 20 20 20 20 20 20 73 65 74 51 75 6f 74           setQuot
baa0: 65 64 54 6f 6b 65 6e 28 70 50 61 72 73 65 2c 20  edToken(pParse, 
bab0: 26 70 4c 65 66 74 2d 3e 74 6f 6b 65 6e 2c 20 7a  &pLeft->token, z
bac0: 54 61 62 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20  TabName);.      
bad0: 20 20 20 20 20 20 20 20 73 65 74 54 6f 6b 65 6e          setToken
bae0: 28 26 70 45 78 70 72 2d 3e 73 70 61 6e 2c 20 0a  (&pExpr->span, .
baf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bb00: 20 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66    sqlite3MPrintf
bb10: 28 64 62 2c 20 22 25 73 2e 25 73 22 2c 20 7a 54  (db, "%s.%s", zT
bb20: 61 62 4e 61 6d 65 2c 20 7a 4e 61 6d 65 29 29 3b  abName, zName));
bb30: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70  .              p
bb40: 45 78 70 72 2d 3e 73 70 61 6e 2e 64 79 6e 20 3d  Expr->span.dyn =
bb50: 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20   1;.            
bb60: 20 20 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 7a    pExpr->token.z
bb70: 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20   = 0;.          
bb80: 20 20 20 20 70 45 78 70 72 2d 3e 74 6f 6b 65 6e      pExpr->token
bb90: 2e 6e 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  .n = 0;.        
bba0: 20 20 20 20 20 20 70 45 78 70 72 2d 3e 74 6f 6b        pExpr->tok
bbb0: 65 6e 2e 64 79 6e 20 3d 20 30 3b 0a 20 20 20 20  en.dyn = 0;.    
bbc0: 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
bbd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 70 45 78               pEx
bbe0: 70 72 20 3d 20 70 52 69 67 68 74 3b 0a 20 20 20  pr = pRight;.   
bbf0: 20 20 20 20 20 20 20 20 20 20 20 70 45 78 70 72             pExpr
bc00: 2d 3e 73 70 61 6e 20 3d 20 70 45 78 70 72 2d 3e  ->span = pExpr->
bc10: 74 6f 6b 65 6e 3b 0a 20 20 20 20 20 20 20 20 20  token;.         
bc20: 20 20 20 20 20 70 45 78 70 72 2d 3e 73 70 61 6e       pExpr->span
bc30: 2e 64 79 6e 20 3d 20 30 3b 0a 20 20 20 20 20 20  .dyn = 0;.      
bc40: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
bc50: 20 20 20 20 69 66 28 20 6c 6f 6e 67 4e 61 6d 65      if( longName
bc60: 73 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  s ){.           
bc70: 20 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65     pNew = sqlite
bc80: 33 45 78 70 72 4c 69 73 74 41 70 70 65 6e 64 28  3ExprListAppend(
bc90: 70 50 61 72 73 65 2c 20 70 4e 65 77 2c 20 70 45  pParse, pNew, pE
bca0: 78 70 72 2c 20 26 70 45 78 70 72 2d 3e 73 70 61  xpr, &pExpr->spa
bcb0: 6e 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  n);.            
bcc0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
bcd0: 20 20 20 20 20 70 4e 65 77 20 3d 20 73 71 6c 69       pNew = sqli
bce0: 74 65 33 45 78 70 72 4c 69 73 74 41 70 70 65 6e  te3ExprListAppen
bcf0: 64 28 70 50 61 72 73 65 2c 20 70 4e 65 77 2c 20  d(pParse, pNew, 
bd00: 70 45 78 70 72 2c 20 26 70 52 69 67 68 74 2d 3e  pExpr, &pRight->
bd10: 74 6f 6b 65 6e 29 3b 0a 20 20 20 20 20 20 20 20  token);.        
bd20: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
bd30: 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  }.        }.    
bd40: 20 20 20 20 69 66 28 20 21 74 61 62 6c 65 53 65      if( !tableSe
bd50: 65 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  en ){.          
bd60: 69 66 28 20 7a 54 4e 61 6d 65 20 29 7b 0a 20 20  if( zTName ){.  
bd70: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
bd80: 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
bd90: 2c 20 22 6e 6f 20 73 75 63 68 20 74 61 62 6c 65  , "no such table
bda0: 3a 20 25 73 22 2c 20 7a 54 4e 61 6d 65 29 3b 0a  : %s", zTName);.
bdb0: 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b            }else{
bdc0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c  .            sql
bdd0: 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
bde0: 72 73 65 2c 20 22 6e 6f 20 74 61 62 6c 65 73 20  rse, "no tables 
bdf0: 73 70 65 63 69 66 69 65 64 22 29 3b 0a 20 20 20  specified");.   
be00: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
be10: 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 20     rc = 1;.     
be20: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 73 71 6c     }.        sql
be30: 69 74 65 33 5f 66 72 65 65 28 7a 54 4e 61 6d 65  ite3_free(zTName
be40: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
be50: 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72  .    sqlite3Expr
be60: 4c 69 73 74 44 65 6c 65 74 65 28 70 45 4c 69 73  ListDelete(pELis
be70: 74 29 3b 0a 20 20 20 20 70 2d 3e 70 45 4c 69 73  t);.    p->pELis
be80: 74 20 3d 20 70 4e 65 77 3b 0a 20 20 7d 0a 23 69  t = pNew;.  }.#i
be90: 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f 43 4f 4c  f SQLITE_MAX_COL
bea0: 55 4d 4e 0a 20 20 69 66 28 20 70 2d 3e 70 45 4c  UMN.  if( p->pEL
beb0: 69 73 74 20 26 26 20 70 2d 3e 70 45 4c 69 73 74  ist && p->pEList
bec0: 2d 3e 6e 45 78 70 72 3e 64 62 2d 3e 61 4c 69 6d  ->nExpr>db->aLim
bed0: 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f  it[SQLITE_LIMIT_
bee0: 43 4f 4c 55 4d 4e 5d 20 29 7b 0a 20 20 20 20 73  COLUMN] ){.    s
bef0: 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
bf00: 50 61 72 73 65 2c 20 22 74 6f 6f 20 6d 61 6e 79  Parse, "too many
bf10: 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 72 65 73 75   columns in resu
bf20: 6c 74 20 73 65 74 22 29 3b 0a 20 20 20 20 72 63  lt set");.    rc
bf30: 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b   = SQLITE_ERROR;
bf40: 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 69 66  .  }.#endif.  if
bf50: 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ( db->mallocFail
bf60: 65 64 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53  ed ){.    rc = S
bf70: 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d  QLITE_NOMEM;.  }
bf80: 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
bf90: 0a 2f 2a 0a 2a 2a 20 70 45 20 69 73 20 61 20 70  ./*.** pE is a p
bfa0: 6f 69 6e 74 65 72 20 74 6f 20 61 6e 20 65 78 70  ointer to an exp
bfb0: 72 65 73 73 69 6f 6e 20 77 68 69 63 68 20 69 73  ression which is
bfc0: 20 61 20 73 69 6e 67 6c 65 20 74 65 72 6d 20 69   a single term i
bfd0: 6e 0a 2a 2a 20 4f 52 44 45 52 20 42 59 20 6f 72  n.** ORDER BY or
bfe0: 20 47 52 4f 55 50 20 42 59 20 63 6c 61 75 73 65   GROUP BY clause
bff0: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 45 20 65 76  ..**.** If pE ev
c000: 61 6c 75 61 74 65 73 20 74 6f 20 61 6e 20 69 6e  aluates to an in
c010: 74 65 67 65 72 20 63 6f 6e 73 74 61 6e 74 20 69  teger constant i
c020: 2c 20 74 68 65 6e 20 72 65 74 75 72 6e 20 69 2e  , then return i.
c030: 0a 2a 2a 20 54 68 69 73 20 69 73 20 61 6e 20 69  .** This is an i
c040: 6e 64 69 63 61 74 69 6f 6e 20 74 6f 20 74 68 65  ndication to the
c050: 20 63 61 6c 6c 65 72 20 74 68 61 74 20 69 74 20   caller that it 
c060: 73 68 6f 75 6c 64 20 73 6f 72 74 0a 2a 2a 20 62  should sort.** b
c070: 79 20 74 68 65 20 69 2d 74 68 20 63 6f 6c 75 6d  y the i-th colum
c080: 6e 20 6f 66 20 74 68 65 20 72 65 73 75 6c 74 20  n of the result 
c090: 73 65 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 45  set..**.** If pE
c0a0: 20 69 73 20 61 20 77 65 6c 6c 2d 66 6f 72 6d 65   is a well-forme
c0b0: 64 20 65 78 70 72 65 73 73 69 6f 6e 20 61 6e 64  d expression and
c0c0: 20 74 68 65 20 53 45 4c 45 43 54 20 73 74 61 74   the SELECT stat
c0d0: 65 6d 65 6e 74 0a 2a 2a 20 69 73 20 6e 6f 74 20  ement.** is not 
c0e0: 63 6f 6d 70 6f 75 6e 64 2c 20 74 68 65 6e 20 72  compound, then r
c0f0: 65 74 75 72 6e 20 30 2e 20 20 54 68 69 73 20 69  eturn 0.  This i
c100: 6e 64 69 63 61 74 65 73 20 74 6f 20 74 68 65 0a  ndicates to the.
c110: 2a 2a 20 63 61 6c 6c 65 72 20 74 68 61 74 20 69  ** caller that i
c120: 74 20 73 68 6f 75 6c 64 20 73 6f 72 74 20 62 79  t should sort by
c130: 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68   the value of th
c140: 65 20 4f 52 44 45 52 20 42 59 0a 2a 2a 20 65 78  e ORDER BY.** ex
c150: 70 72 65 73 73 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20  pression..**.** 
c160: 49 66 20 74 68 65 20 53 45 4c 45 43 54 20 69 73  If the SELECT is
c170: 20 63 6f 6d 70 6f 75 6e 64 2c 20 74 68 65 6e 20   compound, then 
c180: 61 74 74 65 6d 70 74 20 74 6f 20 6d 61 74 63 68  attempt to match
c190: 20 70 45 20 61 67 61 69 6e 73 74 0a 2a 2a 20 72   pE against.** r
c1a0: 65 73 75 6c 74 20 73 65 74 20 63 6f 6c 75 6d 6e  esult set column
c1b0: 73 20 69 6e 20 74 68 65 20 6c 65 66 74 2d 6d 6f  s in the left-mo
c1c0: 73 74 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d  st SELECT statem
c1d0: 65 6e 74 2e 20 20 52 65 74 75 72 6e 0a 2a 2a 20  ent.  Return.** 
c1e0: 74 68 65 20 69 6e 64 65 78 20 69 20 6f 66 20 74  the index i of t
c1f0: 68 65 20 6d 61 74 63 68 69 6e 67 20 63 6f 6c 75  he matching colu
c200: 6d 6e 2c 20 61 73 20 61 6e 20 69 6e 64 69 63 61  mn, as an indica
c210: 74 69 6f 6e 20 74 6f 20 74 68 65 20 0a 2a 2a 20  tion to the .** 
c220: 63 61 6c 6c 65 72 20 74 68 61 74 20 69 74 20 73  caller that it s
c230: 68 6f 75 6c 64 20 73 6f 72 74 20 62 79 20 74 68  hould sort by th
c240: 65 20 69 2d 74 68 20 63 6f 6c 75 6d 6e 2e 20 20  e i-th column.  
c250: 49 66 20 74 68 65 72 65 20 69 73 0a 2a 2a 20 6e  If there is.** n
c260: 6f 20 6d 61 74 63 68 2c 20 72 65 74 75 72 6e 20  o match, return 
c270: 2d 31 20 61 6e 64 20 6c 65 61 76 65 20 61 6e 20  -1 and leave an 
c280: 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 69 6e  error message in
c290: 20 70 50 61 72 73 65 2e 0a 2a 2f 0a 73 74 61 74   pParse..*/.stat
c2a0: 69 63 20 69 6e 74 20 6d 61 74 63 68 4f 72 64 65  ic int matchOrde
c2b0: 72 42 79 54 65 72 6d 54 6f 45 78 70 72 4c 69 73  rByTermToExprLis
c2c0: 74 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  t(.  Parse *pPar
c2d0: 73 65 2c 20 20 20 20 20 2f 2a 20 50 61 72 73 69  se,     /* Parsi
c2e0: 6e 67 20 63 6f 6e 74 65 78 74 20 66 6f 72 20 65  ng context for e
c2f0: 72 72 6f 72 20 6d 65 73 73 61 67 65 73 20 2a 2f  rror messages */
c300: 0a 20 20 53 65 6c 65 63 74 20 2a 70 53 65 6c 65  .  Select *pSele
c310: 63 74 2c 20 20 20 2f 2a 20 54 68 65 20 53 45 4c  ct,   /* The SEL
c320: 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 77 69  ECT statement wi
c330: 74 68 20 74 68 65 20 4f 52 44 45 52 20 42 59 20  th the ORDER BY 
c340: 63 6c 61 75 73 65 20 2a 2f 0a 20 20 45 78 70 72  clause */.  Expr
c350: 20 2a 70 45 2c 20 20 20 20 20 20 20 20 20 20 2f   *pE,          /
c360: 2a 20 54 68 65 20 73 70 65 63 69 66 69 63 20 4f  * The specific O
c370: 52 44 45 52 20 42 59 20 74 65 72 6d 20 2a 2f 0a  RDER BY term */.
c380: 20 20 69 6e 74 20 69 64 78 2c 20 20 20 20 20 20    int idx,      
c390: 20 20 20 20 20 2f 2a 20 57 68 65 6e 20 4f 52 44       /* When ORD
c3a0: 45 52 20 42 59 20 74 65 72 6d 20 69 73 20 74 68  ER BY term is th
c3b0: 69 73 20 2a 2f 0a 20 20 69 6e 74 20 69 73 43 6f  is */.  int isCo
c3c0: 6d 70 6f 75 6e 64 2c 20 20 20 20 2f 2a 20 54 72  mpound,    /* Tr
c3d0: 75 65 20 69 66 20 74 68 69 73 20 69 73 20 61 20  ue if this is a 
c3e0: 63 6f 6d 70 6f 75 6e 64 20 53 45 4c 45 43 54 20  compound SELECT 
c3f0: 2a 2f 0a 20 20 75 38 20 2a 70 48 61 73 41 67 67  */.  u8 *pHasAgg
c400: 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
c410: 69 66 20 65 78 70 72 65 73 73 69 6f 6e 20 63 6f  if expression co
c420: 6e 74 61 69 6e 73 20 61 67 67 72 65 67 61 74 65  ntains aggregate
c430: 20 66 75 6e 63 74 69 6f 6e 73 20 2a 2f 0a 29 7b   functions */.){
c440: 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20  .  int i;       
c450: 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f        /* Loop co
c460: 75 6e 74 65 72 20 2a 2f 0a 20 20 45 78 70 72 4c  unter */.  ExprL
c470: 69 73 74 20 2a 70 45 4c 69 73 74 3b 20 20 2f 2a  ist *pEList;  /*
c480: 20 54 68 65 20 63 6f 6c 75 6d 6e 73 20 6f 66 20   The columns of 
c490: 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 20 2a  the result set *
c4a0: 2f 0a 20 20 4e 61 6d 65 43 6f 6e 74 65 78 74 20  /.  NameContext 
c4b0: 6e 63 3b 20 20 20 20 2f 2a 20 4e 61 6d 65 20 63  nc;    /* Name c
c4c0: 6f 6e 74 65 78 74 20 66 6f 72 20 72 65 73 6f 6c  ontext for resol
c4d0: 76 69 6e 67 20 70 45 20 2a 2f 0a 0a 0a 20 20 2f  ving pE */...  /
c4e0: 2a 20 49 66 20 74 68 65 20 74 65 72 6d 20 69 73  * If the term is
c4f0: 20 61 6e 20 69 6e 74 65 67 65 72 20 63 6f 6e 73   an integer cons
c500: 74 61 6e 74 2c 20 72 65 74 75 72 6e 20 74 68 65  tant, return the
c510: 20 76 61 6c 75 65 20 6f 66 20 74 68 61 74 0a 20   value of that. 
c520: 20 2a 2a 20 63 6f 6e 73 74 61 6e 74 20 2a 2f 0a   ** constant */.
c530: 20 20 70 45 4c 69 73 74 20 3d 20 70 53 65 6c 65    pEList = pSele
c540: 63 74 2d 3e 70 45 4c 69 73 74 3b 0a 20 20 69 66  ct->pEList;.  if
c550: 28 20 73 71 6c 69 74 65 33 45 78 70 72 49 73 49  ( sqlite3ExprIsI
c560: 6e 74 65 67 65 72 28 70 45 2c 20 26 69 29 20 29  nteger(pE, &i) )
c570: 7b 0a 20 20 20 20 69 66 28 20 69 3c 3d 30 20 29  {.    if( i<=0 )
c580: 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 69 20  {.      /* If i 
c590: 69 73 20 74 6f 6f 20 73 6d 61 6c 6c 2c 20 6d 61  is too small, ma
c5a0: 6b 65 20 69 74 20 74 6f 6f 20 62 69 67 2e 20 20  ke it too big.  
c5b0: 54 68 61 74 20 77 61 79 20 74 68 65 20 63 61 6c  That way the cal
c5c0: 6c 69 6e 67 0a 20 20 20 20 20 20 2a 2a 20 66 75  ling.      ** fu
c5d0: 6e 63 74 69 6f 6e 20 73 74 69 6c 6c 20 73 65 65  nction still see
c5e0: 73 20 61 20 76 61 6c 75 65 20 74 68 61 74 20 69  s a value that i
c5f0: 73 20 6f 75 74 20 6f 66 20 72 61 6e 67 65 2c 20  s out of range, 
c600: 62 75 74 20 64 6f 65 73 0a 20 20 20 20 20 20 2a  but does.      *
c610: 2a 20 6e 6f 74 20 63 6f 6e 66 75 73 65 20 74 68  * not confuse th
c620: 65 20 63 6f 6c 75 6d 6e 20 6e 75 6d 62 65 72 20  e column number 
c630: 77 69 74 68 20 30 20 6f 72 20 2d 31 20 72 65 73  with 0 or -1 res
c640: 75 6c 74 20 63 6f 64 65 2e 0a 20 20 20 20 20 20  ult code..      
c650: 2a 2f 0a 20 20 20 20 20 20 69 20 3d 20 70 45 4c  */.      i = pEL
c660: 69 73 74 2d 3e 6e 45 78 70 72 2b 31 3b 0a 20 20  ist->nExpr+1;.  
c670: 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 69    }.    return i
c680: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74  ;.  }..  /* If t
c690: 68 65 20 74 65 72 6d 20 69 73 20 61 20 73 69 6d  he term is a sim
c6a0: 70 6c 65 20 69 64 65 6e 74 69 66 69 65 72 20 74  ple identifier t
c6b0: 68 61 74 20 74 72 79 20 74 6f 20 6d 61 74 63 68  hat try to match
c6c0: 20 74 68 61 74 20 69 64 65 6e 74 69 66 69 65 72   that identifier
c6d0: 0a 20 20 2a 2a 20 61 67 61 69 6e 73 74 20 61 20  .  ** against a 
c6e0: 63 6f 6c 75 6d 6e 20 6e 61 6d 65 20 69 6e 20 74  column name in t
c6f0: 68 65 20 72 65 73 75 6c 74 20 73 65 74 2e 0a 20  he result set.. 
c700: 20 2a 2f 0a 20 20 69 66 28 20 70 45 2d 3e 6f 70   */.  if( pE->op
c710: 3d 3d 54 4b 5f 49 44 20 7c 7c 20 28 70 45 2d 3e  ==TK_ID || (pE->
c720: 6f 70 3d 3d 54 4b 5f 53 54 52 49 4e 47 20 26 26  op==TK_STRING &&
c730: 20 70 45 2d 3e 74 6f 6b 65 6e 2e 7a 5b 30 5d 21   pE->token.z[0]!
c740: 3d 27 5c 27 27 29 20 29 7b 0a 20 20 20 20 73 71  ='\'') ){.    sq
c750: 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72  lite3 *db = pPar
c760: 73 65 2d 3e 64 62 3b 0a 20 20 20 20 63 68 61 72  se->db;.    char
c770: 20 2a 7a 43 6f 6c 20 3d 20 73 71 6c 69 74 65 33   *zCol = sqlite3
c780: 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 64 62  NameFromToken(db
c790: 2c 20 26 70 45 2d 3e 74 6f 6b 65 6e 29 3b 0a 20  , &pE->token);. 
c7a0: 20 20 20 69 66 28 20 7a 43 6f 6c 3d 3d 30 20 29     if( zCol==0 )
c7b0: 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 2d  {.      return -
c7c0: 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f 72  1;.    }.    for
c7d0: 28 69 3d 30 3b 20 69 3c 70 45 4c 69 73 74 2d 3e  (i=0; i<pEList->
c7e0: 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20  nExpr; i++){.   
c7f0: 20 20 20 63 68 61 72 20 2a 7a 41 73 20 3d 20 70     char *zAs = p
c800: 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d  EList->a[i].zNam
c810: 65 3b 0a 20 20 20 20 20 20 69 66 28 20 7a 41 73  e;.      if( zAs
c820: 21 3d 30 20 26 26 20 73 71 6c 69 74 65 33 53 74  !=0 && sqlite3St
c830: 72 49 43 6d 70 28 7a 41 73 2c 20 7a 43 6f 6c 29  rICmp(zAs, zCol)
c840: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 73  ==0 ){.        s
c850: 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 43 6f 6c  qlite3_free(zCol
c860: 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  );.        retur
c870: 6e 20 69 2b 31 3b 0a 20 20 20 20 20 20 7d 0a 20  n i+1;.      }. 
c880: 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
c890: 5f 66 72 65 65 28 7a 43 6f 6c 29 3b 0a 20 20 7d  _free(zCol);.  }
c8a0: 0a 0a 20 20 2f 2a 20 52 65 73 6f 6c 76 65 20 61  ..  /* Resolve a
c8b0: 6c 6c 20 6e 61 6d 65 73 20 69 6e 20 74 68 65 20  ll names in the 
c8c0: 4f 52 44 45 52 20 42 59 20 74 65 72 6d 20 65 78  ORDER BY term ex
c8d0: 70 72 65 73 73 69 6f 6e 0a 20 20 2a 2f 0a 20 20  pression.  */.  
c8e0: 6d 65 6d 73 65 74 28 26 6e 63 2c 20 30 2c 20 73  memset(&nc, 0, s
c8f0: 69 7a 65 6f 66 28 6e 63 29 29 3b 0a 20 20 6e 63  izeof(nc));.  nc
c900: 2e 70 50 61 72 73 65 20 3d 20 70 50 61 72 73 65  .pParse = pParse
c910: 3b 0a 20 20 6e 63 2e 70 53 72 63 4c 69 73 74 20  ;.  nc.pSrcList 
c920: 3d 20 70 53 65 6c 65 63 74 2d 3e 70 53 72 63 3b  = pSelect->pSrc;
c930: 0a 20 20 6e 63 2e 70 45 4c 69 73 74 20 3d 20 70  .  nc.pEList = p
c940: 45 4c 69 73 74 3b 0a 20 20 6e 63 2e 61 6c 6c 6f  EList;.  nc.allo
c950: 77 41 67 67 20 3d 20 31 3b 0a 20 20 6e 63 2e 6e  wAgg = 1;.  nc.n
c960: 45 72 72 20 3d 20 30 3b 0a 20 20 69 66 28 20 73  Err = 0;.  if( s
c970: 71 6c 69 74 65 33 45 78 70 72 52 65 73 6f 6c 76  qlite3ExprResolv
c980: 65 4e 61 6d 65 73 28 26 6e 63 2c 20 70 45 29 20  eNames(&nc, pE) 
c990: 29 7b 0a 20 20 20 20 69 66 28 20 69 73 43 6f 6d  ){.    if( isCom
c9a0: 70 6f 75 6e 64 20 29 7b 0a 20 20 20 20 20 20 73  pound ){.      s
c9b0: 71 6c 69 74 65 33 45 72 72 6f 72 43 6c 65 61 72  qlite3ErrorClear
c9c0: 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20  (pParse);.      
c9d0: 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d 65  return 0;.    }e
c9e0: 6c 73 65 7b 0a 20 20 20 20 20 20 72 65 74 75 72  lse{.      retur
c9f0: 6e 20 2d 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  n -1;.    }.  }.
ca00: 20 20 69 66 28 20 6e 63 2e 68 61 73 41 67 67 20    if( nc.hasAgg 
ca10: 26 26 20 70 48 61 73 41 67 67 20 29 7b 0a 20 20  && pHasAgg ){.  
ca20: 20 20 2a 70 48 61 73 41 67 67 20 3d 20 31 3b 0a    *pHasAgg = 1;.
ca30: 20 20 7d 0a 0a 20 20 2f 2a 20 46 6f 72 20 61 20    }..  /* For a 
ca40: 63 6f 6d 70 6f 75 6e 64 20 53 45 4c 45 43 54 2c  compound SELECT,
ca50: 20 77 65 20 6e 65 65 64 20 74 6f 20 74 72 79 20   we need to try 
ca60: 74 6f 20 6d 61 74 63 68 20 74 68 65 20 4f 52 44  to match the ORD
ca70: 45 52 20 42 59 0a 20 20 2a 2a 20 65 78 70 72 65  ER BY.  ** expre
ca80: 73 73 69 6f 6e 20 61 67 61 69 6e 73 74 20 61 6e  ssion against an
ca90: 20 65 78 70 72 65 73 73 69 6f 6e 20 69 6e 20 74   expression in t
caa0: 68 65 20 72 65 73 75 6c 74 20 73 65 74 0a 20 20  he result set.  
cab0: 2a 2f 0a 20 20 69 66 28 20 69 73 43 6f 6d 70 6f  */.  if( isCompo
cac0: 75 6e 64 20 29 7b 0a 20 20 20 20 66 6f 72 28 69  und ){.    for(i
cad0: 3d 30 3b 20 69 3c 70 45 4c 69 73 74 2d 3e 6e 45  =0; i<pEList->nE
cae0: 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  xpr; i++){.     
caf0: 20 69 66 28 20 73 71 6c 69 74 65 33 45 78 70 72   if( sqlite3Expr
cb00: 43 6f 6d 70 61 72 65 28 70 45 4c 69 73 74 2d 3e  Compare(pEList->
cb10: 61 5b 69 5d 2e 70 45 78 70 72 2c 20 70 45 29 20  a[i].pExpr, pE) 
cb20: 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  ){.        retur
cb30: 6e 20 69 2b 31 3b 0a 20 20 20 20 20 20 7d 0a 20  n i+1;.      }. 
cb40: 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
cb50: 6e 20 30 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 41  n 0;.}.../*.** A
cb60: 6e 61 6c 79 7a 65 20 61 6e 64 20 4f 52 44 45 52  nalyze and ORDER
cb70: 20 42 59 20 6f 72 20 47 52 4f 55 50 20 42 59 20   BY or GROUP BY 
cb80: 63 6c 61 75 73 65 20 69 6e 20 61 20 73 69 6d 70  clause in a simp
cb90: 6c 65 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d  le SELECT statem
cba0: 65 6e 74 2e 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ent..** Return t
cbb0: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 65 72 72  he number of err
cbc0: 6f 72 73 20 73 65 65 6e 2e 0a 2a 2a 0a 2a 2a 20  ors seen..**.** 
cbd0: 45 76 65 72 79 20 74 65 72 6d 20 6f 66 20 74 68  Every term of th
cbe0: 65 20 4f 52 44 45 52 20 42 59 20 6f 72 20 47 52  e ORDER BY or GR
cbf0: 4f 55 50 20 42 59 20 63 6c 61 75 73 65 20 6e 65  OUP BY clause ne
cc00: 65 64 73 20 74 6f 20 62 65 20 61 6e 0a 2a 2a 20  eds to be an.** 
cc10: 65 78 70 72 65 73 73 69 6f 6e 2e 20 20 49 66 20  expression.  If 
cc20: 61 6e 79 20 65 78 70 72 65 73 73 69 6f 6e 20 69  any expression i
cc30: 73 20 61 6e 20 69 6e 74 65 67 65 72 20 63 6f 6e  s an integer con
cc40: 73 74 61 6e 74 2c 20 74 68 65 6e 0a 2a 2a 20 74  stant, then.** t
cc50: 68 61 74 20 65 78 70 72 65 73 73 69 6f 6e 20 69  hat expression i
cc60: 73 20 72 65 70 6c 61 63 65 64 20 62 79 20 74 68  s replaced by th
cc70: 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20  e corresponding 
cc80: 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 20 66  .** expression f
cc90: 72 6f 6d 20 74 68 65 20 72 65 73 75 6c 74 20 73  rom the result s
cca0: 65 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  et..*/.static in
ccb0: 74 20 70 72 6f 63 65 73 73 4f 72 64 65 72 47 72  t processOrderGr
ccc0: 6f 75 70 42 79 28 0a 20 20 50 61 72 73 65 20 2a  oupBy(.  Parse *
ccd0: 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 2f  pParse,        /
cce0: 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78  * Parsing contex
ccf0: 74 2e 20 20 4c 65 61 76 65 20 65 72 72 6f 72 20  t.  Leave error 
cd00: 6d 65 73 73 61 67 65 73 20 68 65 72 65 20 2a 2f  messages here */
cd10: 0a 20 20 53 65 6c 65 63 74 20 2a 70 53 65 6c 65  .  Select *pSele
cd20: 63 74 2c 20 20 20 20 20 20 2f 2a 20 54 68 65 20  ct,      /* The 
cd30: 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
cd40: 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20   containing the 
cd50: 63 6c 61 75 73 65 20 2a 2f 0a 20 20 45 78 70 72  clause */.  Expr
cd60: 4c 69 73 74 20 2a 70 4f 72 64 65 72 42 79 2c 20  List *pOrderBy, 
cd70: 20 20 2f 2a 20 54 68 65 20 4f 52 44 45 52 20 42    /* The ORDER B
cd80: 59 20 6f 72 20 47 52 4f 55 50 20 42 59 20 63 6c  Y or GROUP BY cl
cd90: 61 75 73 65 20 74 6f 20 62 65 20 70 72 6f 63 65  ause to be proce
cda0: 73 73 65 64 20 2a 2f 0a 20 20 69 6e 74 20 69 73  ssed */.  int is
cdb0: 4f 72 64 65 72 2c 20 20 20 20 20 20 20 20 20 20  Order,          
cdc0: 2f 2a 20 31 20 66 6f 72 20 4f 52 44 45 52 20 42  /* 1 for ORDER B
cdd0: 59 2e 20 20 30 20 66 6f 72 20 47 52 4f 55 50 20  Y.  0 for GROUP 
cde0: 42 59 20 2a 2f 0a 20 20 75 38 20 2a 70 48 61 73  BY */.  u8 *pHas
cdf0: 41 67 67 20 20 20 20 20 20 20 20 20 20 20 2f 2a  Agg           /*
ce00: 20 53 65 74 20 74 6f 20 54 52 55 45 20 69 66 20   Set to TRUE if 
ce10: 61 6e 79 20 74 65 72 6d 20 63 6f 6e 74 61 69 6e  any term contain
ce20: 73 20 61 6e 20 61 67 67 72 65 67 61 74 65 20 2a  s an aggregate *
ce30: 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  /.){.  int i;.  
ce40: 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50  sqlite3 *db = pP
ce50: 61 72 73 65 2d 3e 64 62 3b 0a 20 20 45 78 70 72  arse->db;.  Expr
ce60: 4c 69 73 74 20 2a 70 45 4c 69 73 74 3b 0a 0a 20  List *pEList;.. 
ce70: 20 69 66 28 20 70 4f 72 64 65 72 42 79 3d 3d 30   if( pOrderBy==0
ce80: 20 7c 7c 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e   || pParse->db->
ce90: 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20 72  mallocFailed ) r
cea0: 65 74 75 72 6e 20 30 3b 0a 23 69 66 20 53 51 4c  eturn 0;.#if SQL
ceb0: 49 54 45 5f 4d 41 58 5f 43 4f 4c 55 4d 4e 0a 20  ITE_MAX_COLUMN. 
cec0: 20 69 66 28 20 70 4f 72 64 65 72 42 79 2d 3e 6e   if( pOrderBy->n
ced0: 45 78 70 72 3e 64 62 2d 3e 61 4c 69 6d 69 74 5b  Expr>db->aLimit[
cee0: 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 43 4f 4c  SQLITE_LIMIT_COL
cef0: 55 4d 4e 5d 20 29 7b 0a 20 20 20 20 63 6f 6e 73  UMN] ){.    cons
cf00: 74 20 63 68 61 72 20 2a 7a 54 79 70 65 20 3d 20  t char *zType = 
cf10: 69 73 4f 72 64 65 72 20 3f 20 22 4f 52 44 45 52  isOrder ? "ORDER
cf20: 22 20 3a 20 22 47 52 4f 55 50 22 3b 0a 20 20 20  " : "GROUP";.   
cf30: 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
cf40: 28 70 50 61 72 73 65 2c 20 22 74 6f 6f 20 6d 61  (pParse, "too ma
cf50: 6e 79 20 74 65 72 6d 73 20 69 6e 20 25 73 20 42  ny terms in %s B
cf60: 59 20 63 6c 61 75 73 65 22 2c 20 7a 54 79 70 65  Y clause", zType
cf70: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 31 3b  );.    return 1;
cf80: 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 70 45  .  }.#endif.  pE
cf90: 4c 69 73 74 20 3d 20 70 53 65 6c 65 63 74 2d 3e  List = pSelect->
cfa0: 70 45 4c 69 73 74 3b 0a 20 20 69 66 28 20 70 45  pEList;.  if( pE
cfb0: 4c 69 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20 72  List==0 ){.    r
cfc0: 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 66  eturn 0;.  }.  f
cfd0: 6f 72 28 69 3d 30 3b 20 69 3c 70 4f 72 64 65 72  or(i=0; i<pOrder
cfe0: 42 79 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b  By->nExpr; i++){
cff0: 0a 20 20 20 20 69 6e 74 20 69 43 6f 6c 3b 0a 20  .    int iCol;. 
d000: 20 20 20 45 78 70 72 20 2a 70 45 20 3d 20 70 4f     Expr *pE = pO
d010: 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 70 45 78  rderBy->a[i].pEx
d020: 70 72 3b 0a 20 20 20 20 69 43 6f 6c 20 3d 20 6d  pr;.    iCol = m
d030: 61 74 63 68 4f 72 64 65 72 42 79 54 65 72 6d 54  atchOrderByTermT
d040: 6f 45 78 70 72 4c 69 73 74 28 70 50 61 72 73 65  oExprList(pParse
d050: 2c 20 70 53 65 6c 65 63 74 2c 20 70 45 2c 20 69  , pSelect, pE, i
d060: 2b 31 2c 20 30 2c 20 70 48 61 73 41 67 67 29 3b  +1, 0, pHasAgg);
d070: 0a 20 20 20 20 69 66 28 20 69 43 6f 6c 3c 30 20  .    if( iCol<0 
d080: 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
d090: 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  1;.    }.    if(
d0a0: 20 69 43 6f 6c 3e 70 45 4c 69 73 74 2d 3e 6e 45   iCol>pEList->nE
d0b0: 78 70 72 20 29 7b 0a 20 20 20 20 20 20 63 6f 6e  xpr ){.      con
d0c0: 73 74 20 63 68 61 72 20 2a 7a 54 79 70 65 20 3d  st char *zType =
d0d0: 20 69 73 4f 72 64 65 72 20 3f 20 22 4f 52 44 45   isOrder ? "ORDE
d0e0: 52 22 20 3a 20 22 47 52 4f 55 50 22 3b 0a 20 20  R" : "GROUP";.  
d0f0: 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
d100: 4d 73 67 28 70 50 61 72 73 65 2c 20 0a 20 20 20  Msg(pParse, .   
d110: 20 20 20 20 20 20 22 25 72 20 25 73 20 42 59 20        "%r %s BY 
d120: 74 65 72 6d 20 6f 75 74 20 6f 66 20 72 61 6e 67  term out of rang
d130: 65 20 2d 20 73 68 6f 75 6c 64 20 62 65 20 22 0a  e - should be ".
d140: 20 20 20 20 20 20 20 20 20 22 62 65 74 77 65 65           "betwee
d150: 6e 20 31 20 61 6e 64 20 25 64 22 2c 20 69 2b 31  n 1 and %d", i+1
d160: 2c 20 7a 54 79 70 65 2c 20 70 45 4c 69 73 74 2d  , zType, pEList-
d170: 3e 6e 45 78 70 72 29 3b 0a 20 20 20 20 20 20 72  >nExpr);.      r
d180: 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20  eturn 1;.    }. 
d190: 20 20 20 69 66 28 20 69 43 6f 6c 3e 30 20 29 7b     if( iCol>0 ){
d1a0: 0a 20 20 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a  .      CollSeq *
d1b0: 70 43 6f 6c 6c 20 3d 20 70 45 2d 3e 70 43 6f 6c  pColl = pE->pCol
d1c0: 6c 3b 0a 20 20 20 20 20 20 69 6e 74 20 66 6c 61  l;.      int fla
d1d0: 67 73 20 3d 20 70 45 2d 3e 66 6c 61 67 73 20 26  gs = pE->flags &
d1e0: 20 45 50 5f 45 78 70 43 6f 6c 6c 61 74 65 3b 0a   EP_ExpCollate;.
d1f0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
d200: 72 44 65 6c 65 74 65 28 70 45 29 3b 0a 20 20 20  rDelete(pE);.   
d210: 20 20 20 70 45 20 3d 20 73 71 6c 69 74 65 33 45     pE = sqlite3E
d220: 78 70 72 44 75 70 28 64 62 2c 20 70 45 4c 69 73  xprDup(db, pELis
d230: 74 2d 3e 61 5b 69 43 6f 6c 2d 31 5d 2e 70 45 78  t->a[iCol-1].pEx
d240: 70 72 29 3b 0a 20 20 20 20 20 20 70 4f 72 64 65  pr);.      pOrde
d250: 72 42 79 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 20  rBy->a[i].pExpr 
d260: 3d 20 70 45 3b 0a 20 20 20 20 20 20 69 66 28 20  = pE;.      if( 
d270: 70 45 20 26 26 20 70 43 6f 6c 6c 20 26 26 20 66  pE && pColl && f
d280: 6c 61 67 73 20 29 7b 0a 20 20 20 20 20 20 20 20  lags ){.        
d290: 70 45 2d 3e 70 43 6f 6c 6c 20 3d 20 70 43 6f 6c  pE->pColl = pCol
d2a0: 6c 3b 0a 20 20 20 20 20 20 20 20 70 45 2d 3e 66  l;.        pE->f
d2b0: 6c 61 67 73 20 7c 3d 20 66 6c 61 67 73 3b 0a 20  lags |= flags;. 
d2c0: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
d2d0: 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a  .  return 0;.}..
d2e0: 2f 2a 0a 2a 2a 20 41 6e 61 6c 79 7a 65 20 61 6e  /*.** Analyze an
d2f0: 64 20 4f 52 44 45 52 20 42 59 20 6f 72 20 47 52  d ORDER BY or GR
d300: 4f 55 50 20 42 59 20 63 6c 61 75 73 65 20 69 6e  OUP BY clause in
d310: 20 61 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d   a SELECT statem
d320: 65 6e 74 2e 20 20 52 65 74 75 72 6e 0a 2a 2a 20  ent.  Return.** 
d330: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 65 72  the number of er
d340: 72 6f 72 73 20 73 65 65 6e 2e 0a 2a 2a 0a 2a 2a  rors seen..**.**
d350: 20 54 68 65 20 70 72 6f 63 65 73 73 69 6e 67 20   The processing 
d360: 64 65 70 65 6e 64 73 20 6f 6e 20 77 68 65 74 68  depends on wheth
d370: 65 72 20 74 68 65 20 53 45 4c 45 43 54 20 69 73  er the SELECT is
d380: 20 73 69 6d 70 6c 65 20 6f 72 20 63 6f 6d 70 6f   simple or compo
d390: 75 6e 64 2e 0a 2a 2a 20 46 6f 72 20 61 20 73 69  und..** For a si
d3a0: 6d 70 6c 65 20 53 45 4c 45 43 54 20 73 74 61 74  mple SELECT stat
d3b0: 65 6d 65 6e 74 2c 20 65 76 72 79 20 74 65 72 6d  ement, evry term
d3c0: 20 6f 66 20 74 68 65 20 4f 52 44 45 52 20 42 59   of the ORDER BY
d3d0: 20 6f 72 20 47 52 4f 55 50 20 42 59 0a 2a 2a 20   or GROUP BY.** 
d3e0: 63 6c 61 75 73 65 20 6e 65 65 64 73 20 74 6f 20  clause needs to 
d3f0: 62 65 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e  be an expression
d400: 2e 20 20 49 66 20 61 6e 79 20 65 78 70 72 65 73  .  If any expres
d410: 73 69 6f 6e 20 69 73 20 61 6e 20 69 6e 74 65 67  sion is an integ
d420: 65 72 0a 2a 2a 20 63 6f 6e 73 74 61 6e 74 2c 20  er.** constant, 
d430: 74 68 65 6e 20 74 68 61 74 20 65 78 70 72 65 73  then that expres
d440: 73 69 6f 6e 20 69 73 20 72 65 70 6c 61 63 65 64  sion is replaced
d450: 20 62 79 20 74 68 65 20 63 6f 72 72 65 73 70 6f   by the correspo
d460: 6e 64 69 6e 67 20 0a 2a 2a 20 65 78 70 72 65 73  nding .** expres
d470: 73 69 6f 6e 20 66 72 6f 6d 20 74 68 65 20 72 65  sion from the re
d480: 73 75 6c 74 20 73 65 74 2e 0a 2a 2a 0a 2a 2a 20  sult set..**.** 
d490: 46 6f 72 20 63 6f 6d 70 6f 75 6e 64 20 53 45 4c  For compound SEL
d4a0: 45 43 54 20 73 74 61 74 65 6d 65 6e 74 73 2c 20  ECT statements, 
d4b0: 65 76 65 72 79 20 65 78 70 72 65 73 73 69 6f 6e  every expression
d4c0: 20 6e 65 65 64 73 20 74 6f 20 62 65 20 6f 66 0a   needs to be of.
d4d0: 2a 2a 20 74 79 70 65 20 54 4b 5f 43 4f 4c 55 4d  ** type TK_COLUM
d4e0: 4e 20 77 69 74 68 20 61 20 69 54 61 62 6c 65 20  N with a iTable 
d4f0: 76 61 6c 75 65 20 61 73 20 67 69 76 65 6e 20 69  value as given i
d500: 6e 20 74 68 65 20 34 74 68 20 70 61 72 61 6d 65  n the 4th parame
d510: 74 65 72 2e 0a 2a 2a 20 49 66 20 61 6e 79 20 65  ter..** If any e
d520: 78 70 72 65 73 73 69 6f 6e 20 69 73 20 61 6e 20  xpression is an 
d530: 69 6e 74 65 67 65 72 2c 20 74 68 61 74 20 62 65  integer, that be
d540: 63 6f 6d 65 73 20 74 68 65 20 63 6f 6c 75 6d 6e  comes the column
d550: 20 6e 75 6d 62 65 72 2e 0a 2a 2a 20 4f 74 68 65   number..** Othe
d560: 72 77 69 73 65 2c 20 6d 61 74 63 68 20 74 68 65  rwise, match the
d570: 20 65 78 70 72 65 73 73 69 6f 6e 20 61 67 61 69   expression agai
d580: 6e 73 74 20 72 65 73 75 6c 74 20 73 65 74 20 63  nst result set c
d590: 6f 6c 75 6d 6e 73 20 66 72 6f 6d 0a 2a 2a 20 74  olumns from.** t
d5a0: 68 65 20 6c 65 66 74 2d 6d 6f 73 74 20 53 45 4c  he left-most SEL
d5b0: 45 43 54 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ECT..*/.static i
d5c0: 6e 74 20 70 72 6f 63 65 73 73 43 6f 6d 70 6f 75  nt processCompou
d5d0: 6e 64 4f 72 64 65 72 42 79 28 0a 20 20 50 61 72  ndOrderBy(.  Par
d5e0: 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20  se *pParse,     
d5f0: 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f     /* Parsing co
d600: 6e 74 65 78 74 2e 20 20 4c 65 61 76 65 20 65 72  ntext.  Leave er
d610: 72 6f 72 20 6d 65 73 73 61 67 65 73 20 68 65 72  ror messages her
d620: 65 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70  e */.  Select *p
d630: 53 65 6c 65 63 74 2c 20 20 20 20 20 20 2f 2a 20  Select,      /* 
d640: 54 68 65 20 53 45 4c 45 43 54 20 73 74 61 74 65  The SELECT state
d650: 6d 65 6e 74 20 63 6f 6e 74 61 69 6e 69 6e 67 20  ment containing 
d660: 74 68 65 20 4f 52 44 45 52 20 42 59 20 2a 2f 0a  the ORDER BY */.
d670: 20 20 69 6e 74 20 69 54 61 62 6c 65 20 20 20 20    int iTable    
d680: 20 20 20 20 20 20 20 20 2f 2a 20 4f 75 74 70 75          /* Outpu
d690: 74 20 74 61 62 6c 65 20 66 6f 72 20 63 6f 6d 70  t table for comp
d6a0: 6f 75 6e 64 20 53 45 4c 45 43 54 20 73 74 61 74  ound SELECT stat
d6b0: 65 6d 65 6e 74 73 20 2a 2f 0a 29 7b 0a 20 20 69  ements */.){.  i
d6c0: 6e 74 20 69 3b 0a 20 20 45 78 70 72 4c 69 73 74  nt i;.  ExprList
d6d0: 20 2a 70 4f 72 64 65 72 42 79 3b 0a 20 20 45 78   *pOrderBy;.  Ex
d6e0: 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 3b 0a  prList *pEList;.
d6f0: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20    sqlite3 *db;. 
d700: 20 69 6e 74 20 6d 6f 72 65 54 6f 44 6f 20 3d 20   int moreToDo = 
d710: 31 3b 0a 0a 20 20 70 4f 72 64 65 72 42 79 20 3d  1;..  pOrderBy =
d720: 20 70 53 65 6c 65 63 74 2d 3e 70 4f 72 64 65 72   pSelect->pOrder
d730: 42 79 3b 0a 20 20 69 66 28 20 70 4f 72 64 65 72  By;.  if( pOrder
d740: 42 79 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30  By==0 ) return 0
d750: 3b 0a 20 20 64 62 20 3d 20 70 50 61 72 73 65 2d  ;.  db = pParse-
d760: 3e 64 62 3b 0a 23 69 66 20 53 51 4c 49 54 45 5f  >db;.#if SQLITE_
d770: 4d 41 58 5f 43 4f 4c 55 4d 4e 0a 20 20 69 66 28  MAX_COLUMN.  if(
d780: 20 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72   pOrderBy->nExpr
d790: 3e 64 62 2d 3e 61 4c 69 6d 69 74 5b 53 51 4c 49  >db->aLimit[SQLI
d7a0: 54 45 5f 4c 49 4d 49 54 5f 43 4f 4c 55 4d 4e 5d  TE_LIMIT_COLUMN]
d7b0: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45   ){.    sqlite3E
d7c0: 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
d7d0: 22 74 6f 6f 20 6d 61 6e 79 20 74 65 72 6d 73 20  "too many terms 
d7e0: 69 6e 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75  in ORDER BY clau
d7f0: 73 65 22 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  se");.    return
d800: 20 31 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20   1;.  }.#endif. 
d810: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4f 72 64   for(i=0; i<pOrd
d820: 65 72 42 79 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b  erBy->nExpr; i++
d830: 29 7b 0a 20 20 20 20 70 4f 72 64 65 72 42 79 2d  ){.    pOrderBy-
d840: 3e 61 5b 69 5d 2e 64 6f 6e 65 20 3d 20 30 3b 0a  >a[i].done = 0;.
d850: 20 20 7d 0a 20 20 77 68 69 6c 65 28 20 70 53 65    }.  while( pSe
d860: 6c 65 63 74 2d 3e 70 50 72 69 6f 72 20 29 7b 0a  lect->pPrior ){.
d870: 20 20 20 20 70 53 65 6c 65 63 74 20 3d 20 70 53      pSelect = pS
d880: 65 6c 65 63 74 2d 3e 70 50 72 69 6f 72 3b 0a 20  elect->pPrior;. 
d890: 20 7d 0a 20 20 77 68 69 6c 65 28 20 70 53 65 6c   }.  while( pSel
d8a0: 65 63 74 20 26 26 20 6d 6f 72 65 54 6f 44 6f 20  ect && moreToDo 
d8b0: 29 7b 0a 20 20 20 20 6d 6f 72 65 54 6f 44 6f 20  ){.    moreToDo 
d8c0: 3d 20 30 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30  = 0;.    for(i=0
d8d0: 3b 20 69 3c 70 4f 72 64 65 72 42 79 2d 3e 6e 45  ; i<pOrderBy->nE
d8e0: 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  xpr; i++){.     
d8f0: 20 69 6e 74 20 69 43 6f 6c 20 3d 20 2d 31 3b 0a   int iCol = -1;.
d900: 20 20 20 20 20 20 45 78 70 72 20 2a 70 45 2c 20        Expr *pE, 
d910: 2a 70 44 75 70 3b 0a 20 20 20 20 20 20 69 66 28  *pDup;.      if(
d920: 20 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e   pOrderBy->a[i].
d930: 64 6f 6e 65 20 29 20 63 6f 6e 74 69 6e 75 65 3b  done ) continue;
d940: 0a 20 20 20 20 20 20 70 45 20 3d 20 70 4f 72 64  .      pE = pOrd
d950: 65 72 42 79 2d 3e 61 5b 69 5d 2e 70 45 78 70 72  erBy->a[i].pExpr
d960: 3b 0a 20 20 20 20 20 20 70 44 75 70 20 3d 20 73  ;.      pDup = s
d970: 71 6c 69 74 65 33 45 78 70 72 44 75 70 28 64 62  qlite3ExprDup(db
d980: 2c 20 70 45 29 3b 0a 20 20 20 20 20 20 69 66 28  , pE);.      if(
d990: 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c   !db->mallocFail
d9a0: 65 64 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73  ed ){.        as
d9b0: 73 65 72 74 28 70 44 75 70 29 3b 0a 20 20 20 20  sert(pDup);.    
d9c0: 20 20 20 20 69 43 6f 6c 20 3d 20 6d 61 74 63 68      iCol = match
d9d0: 4f 72 64 65 72 42 79 54 65 72 6d 54 6f 45 78 70  OrderByTermToExp
d9e0: 72 4c 69 73 74 28 70 50 61 72 73 65 2c 20 70 53  rList(pParse, pS
d9f0: 65 6c 65 63 74 2c 20 70 44 75 70 2c 20 69 2b 31  elect, pDup, i+1
da00: 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d  , 1, 0);.      }
da10: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
da20: 70 72 44 65 6c 65 74 65 28 70 44 75 70 29 3b 0a  prDelete(pDup);.
da30: 20 20 20 20 20 20 69 66 28 20 69 43 6f 6c 3c 30        if( iCol<0
da40: 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75   ){.        retu
da50: 72 6e 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20  rn 1;.      }.  
da60: 20 20 20 20 70 45 4c 69 73 74 20 3d 20 70 53 65      pEList = pSe
da70: 6c 65 63 74 2d 3e 70 45 4c 69 73 74 3b 0a 20 20  lect->pEList;.  
da80: 20 20 20 20 69 66 28 20 70 45 4c 69 73 74 3d 3d      if( pEList==
da90: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74  0 ){.        ret
daa0: 75 72 6e 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20  urn 1;.      }. 
dab0: 20 20 20 20 20 69 66 28 20 69 43 6f 6c 3e 70 45       if( iCol>pE
dac0: 4c 69 73 74 2d 3e 6e 45 78 70 72 20 29 7b 0a 20  List->nExpr ){. 
dad0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72         sqlite3Er
dae0: 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 0a  rorMsg(pParse, .
daf0: 20 20 20 20 20 20 20 20 20 20 20 22 25 72 20 4f             "%r O
db00: 52 44 45 52 20 42 59 20 74 65 72 6d 20 6f 75 74  RDER BY term out
db10: 20 6f 66 20 72 61 6e 67 65 20 2d 20 73 68 6f 75   of range - shou
db20: 6c 64 20 62 65 20 22 0a 20 20 20 20 20 20 20 20  ld be ".        
db30: 20 20 20 22 62 65 74 77 65 65 6e 20 31 20 61 6e     "between 1 an
db40: 64 20 25 64 22 2c 20 69 2b 31 2c 20 70 45 4c 69  d %d", i+1, pELi
db50: 73 74 2d 3e 6e 45 78 70 72 29 3b 0a 20 20 20 20  st->nExpr);.    
db60: 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20      return 1;.  
db70: 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
db80: 69 43 6f 6c 3e 30 20 29 7b 0a 20 20 20 20 20 20  iCol>0 ){.      
db90: 20 20 70 45 2d 3e 6f 70 20 3d 20 54 4b 5f 43 4f    pE->op = TK_CO
dba0: 4c 55 4d 4e 3b 0a 20 20 20 20 20 20 20 20 70 45  LUMN;.        pE
dbb0: 2d 3e 69 54 61 62 6c 65 20 3d 20 69 54 61 62 6c  ->iTable = iTabl
dbc0: 65 3b 0a 20 20 20 20 20 20 20 20 70 45 2d 3e 69  e;.        pE->i
dbd0: 41 67 67 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20  Agg = -1;.      
dbe0: 20 20 70 45 2d 3e 69 43 6f 6c 75 6d 6e 20 3d 20    pE->iColumn = 
dbf0: 69 43 6f 6c 2d 31 3b 0a 20 20 20 20 20 20 20 20  iCol-1;.        
dc00: 70 45 2d 3e 70 54 61 62 20 3d 20 30 3b 0a 20 20  pE->pTab = 0;.  
dc10: 20 20 20 20 20 20 70 4f 72 64 65 72 42 79 2d 3e        pOrderBy->
dc20: 61 5b 69 5d 2e 64 6f 6e 65 20 3d 20 31 3b 0a 20  a[i].done = 1;. 
dc30: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
dc40: 20 20 20 20 6d 6f 72 65 54 6f 44 6f 20 3d 20 31      moreToDo = 1
dc50: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
dc60: 20 20 20 20 70 53 65 6c 65 63 74 20 3d 20 70 53      pSelect = pS
dc70: 65 6c 65 63 74 2d 3e 70 4e 65 78 74 3b 0a 20 20  elect->pNext;.  
dc80: 7d 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70  }.  for(i=0; i<p
dc90: 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 3b 20  OrderBy->nExpr; 
dca0: 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 70 4f  i++){.    if( pO
dcb0: 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 64 6f 6e  rderBy->a[i].don
dcc0: 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71  e==0 ){.      sq
dcd0: 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
dce0: 61 72 73 65 2c 20 22 25 72 20 4f 52 44 45 52 20  arse, "%r ORDER 
dcf0: 42 59 20 74 65 72 6d 20 64 6f 65 73 20 6e 6f 74  BY term does not
dd00: 20 6d 61 74 63 68 20 61 6e 79 20 22 0a 20 20 20   match any ".   
dd10: 20 20 20 20 20 20 20 20 20 22 63 6f 6c 75 6d 6e           "column
dd20: 20 69 6e 20 74 68 65 20 72 65 73 75 6c 74 20 73   in the result s
dd30: 65 74 22 2c 20 69 2b 31 29 3b 0a 20 20 20 20 20  et", i+1);.     
dd40: 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d   return 1;.    }
dd50: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b  .  }.  return 0;
dd60: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 74 20 61 20  .}../*.** Get a 
dd70: 56 44 42 45 20 66 6f 72 20 74 68 65 20 67 69 76  VDBE for the giv
dd80: 65 6e 20 70 61 72 73 65 72 20 63 6f 6e 74 65 78  en parser contex
dd90: 74 2e 20 20 43 72 65 61 74 65 20 61 20 6e 65 77  t.  Create a new
dda0: 20 6f 6e 65 20 69 66 20 6e 65 63 65 73 73 61 72   one if necessar
ddb0: 79 2e 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f  y..** If an erro
ddc0: 72 20 6f 63 63 75 72 73 2c 20 72 65 74 75 72 6e  r occurs, return
ddd0: 20 4e 55 4c 4c 20 61 6e 64 20 6c 65 61 76 65 20   NULL and leave 
dde0: 61 20 6d 65 73 73 61 67 65 20 69 6e 20 70 50 61  a message in pPa
ddf0: 72 73 65 2e 0a 2a 2f 0a 56 64 62 65 20 2a 73 71  rse..*/.Vdbe *sq
de00: 6c 69 74 65 33 47 65 74 56 64 62 65 28 50 61 72  lite3GetVdbe(Par
de10: 73 65 20 2a 70 50 61 72 73 65 29 7b 0a 20 20 56  se *pParse){.  V
de20: 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d  dbe *v = pParse-
de30: 3e 70 56 64 62 65 3b 0a 20 20 69 66 28 20 76 3d  >pVdbe;.  if( v=
de40: 3d 30 20 29 7b 0a 20 20 20 20 76 20 3d 20 70 50  =0 ){.    v = pP
de50: 61 72 73 65 2d 3e 70 56 64 62 65 20 3d 20 73 71  arse->pVdbe = sq
de60: 6c 69 74 65 33 56 64 62 65 43 72 65 61 74 65 28  lite3VdbeCreate(
de70: 70 50 61 72 73 65 2d 3e 64 62 29 3b 0a 23 69 66  pParse->db);.#if
de80: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
de90: 5f 54 52 41 43 45 0a 20 20 20 20 69 66 28 20 76  _TRACE.    if( v
dea0: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
deb0: 33 56 64 62 65 41 64 64 4f 70 30 28 76 2c 20 4f  3VdbeAddOp0(v, O
dec0: 50 5f 54 72 61 63 65 29 3b 0a 20 20 20 20 7d 0a  P_Trace);.    }.
ded0: 23 65 6e 64 69 66 0a 20 20 7d 0a 20 20 72 65 74  #endif.  }.  ret
dee0: 75 72 6e 20 76 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  urn v;.}.../*.**
def0: 20 43 6f 6d 70 75 74 65 20 74 68 65 20 69 4c 69   Compute the iLi
df00: 6d 69 74 20 61 6e 64 20 69 4f 66 66 73 65 74 20  mit and iOffset 
df10: 66 69 65 6c 64 73 20 6f 66 20 74 68 65 20 53 45  fields of the SE
df20: 4c 45 43 54 20 62 61 73 65 64 20 6f 6e 20 74 68  LECT based on th
df30: 65 0a 2a 2a 20 70 4c 69 6d 69 74 20 61 6e 64 20  e.** pLimit and 
df40: 70 4f 66 66 73 65 74 20 65 78 70 72 65 73 73 69  pOffset expressi
df50: 6f 6e 73 2e 20 20 70 4c 69 6d 69 74 20 61 6e 64  ons.  pLimit and
df60: 20 70 4f 66 66 73 65 74 20 68 6f 6c 64 20 74 68   pOffset hold th
df70: 65 20 65 78 70 72 65 73 73 69 6f 6e 73 0a 2a 2a  e expressions.**
df80: 20 74 68 61 74 20 61 70 70 65 61 72 20 69 6e 20   that appear in 
df90: 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 53 51 4c  the original SQL
dfa0: 20 73 74 61 74 65 6d 65 6e 74 20 61 66 74 65 72   statement after
dfb0: 20 74 68 65 20 4c 49 4d 49 54 20 61 6e 64 20 4f   the LIMIT and O
dfc0: 46 46 53 45 54 0a 2a 2a 20 6b 65 79 77 6f 72 64  FFSET.** keyword
dfd0: 73 2e 20 20 4f 72 20 4e 55 4c 4c 20 69 66 20 74  s.  Or NULL if t
dfe0: 68 6f 73 65 20 6b 65 79 77 6f 72 64 73 20 61 72  hose keywords ar
dff0: 65 20 6f 6d 69 74 74 65 64 2e 20 69 4c 69 6d 69  e omitted. iLimi
e000: 74 20 61 6e 64 20 69 4f 66 66 73 65 74 20 0a 2a  t and iOffset .*
e010: 2a 20 61 72 65 20 74 68 65 20 69 6e 74 65 67 65  * are the intege
e020: 72 20 6d 65 6d 6f 72 79 20 72 65 67 69 73 74 65  r memory registe
e030: 72 20 6e 75 6d 62 65 72 73 20 66 6f 72 20 63 6f  r numbers for co
e040: 75 6e 74 65 72 73 20 75 73 65 64 20 74 6f 20 63  unters used to c
e050: 6f 6d 70 75 74 65 20 0a 2a 2a 20 74 68 65 20 6c  ompute .** the l
e060: 69 6d 69 74 20 61 6e 64 20 6f 66 66 73 65 74 2e  imit and offset.
e070: 20 20 49 66 20 74 68 65 72 65 20 69 73 20 6e 6f    If there is no
e080: 20 6c 69 6d 69 74 20 61 6e 64 2f 6f 72 20 6f 66   limit and/or of
e090: 66 73 65 74 2c 20 74 68 65 6e 20 0a 2a 2a 20 69  fset, then .** i
e0a0: 4c 69 6d 69 74 20 61 6e 64 20 69 4f 66 66 73 65  Limit and iOffse
e0b0: 74 20 61 72 65 20 6e 65 67 61 74 69 76 65 2e 0a  t are negative..
e0c0: 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
e0d0: 6e 65 20 63 68 61 6e 67 65 73 20 74 68 65 20 76  ne changes the v
e0e0: 61 6c 75 65 73 20 6f 66 20 69 4c 69 6d 69 74 20  alues of iLimit 
e0f0: 61 6e 64 20 69 4f 66 66 73 65 74 20 6f 6e 6c 79  and iOffset only
e100: 20 69 66 0a 2a 2a 20 61 20 6c 69 6d 69 74 20 6f   if.** a limit o
e110: 72 20 6f 66 66 73 65 74 20 69 73 20 64 65 66 69  r offset is defi
e120: 6e 65 64 20 62 79 20 70 4c 69 6d 69 74 20 61 6e  ned by pLimit an
e130: 64 20 70 4f 66 66 73 65 74 2e 20 20 69 4c 69 6d  d pOffset.  iLim
e140: 69 74 20 61 6e 64 0a 2a 2a 20 69 4f 66 66 73 65  it and.** iOffse
e150: 74 20 73 68 6f 75 6c 64 20 68 61 76 65 20 62 65  t should have be
e160: 65 6e 20 70 72 65 73 65 74 20 74 6f 20 61 70 70  en preset to app
e170: 72 6f 70 72 69 61 74 65 20 64 65 66 61 75 6c 74  ropriate default
e180: 20 76 61 6c 75 65 73 0a 2a 2a 20 28 75 73 75 61   values.** (usua
e190: 6c 6c 79 20 62 75 74 20 6e 6f 74 20 61 6c 77 61  lly but not alwa
e1a0: 79 73 20 2d 31 29 20 70 72 69 6f 72 20 74 6f 20  ys -1) prior to 
e1b0: 63 61 6c 6c 69 6e 67 20 74 68 69 73 20 72 6f 75  calling this rou
e1c0: 74 69 6e 65 2e 0a 2a 2a 20 4f 6e 6c 79 20 69 66  tine..** Only if
e1d0: 20 70 4c 69 6d 69 74 21 3d 30 20 6f 72 20 70 4f   pLimit!=0 or pO
e1e0: 66 66 73 65 74 21 3d 30 20 64 6f 20 74 68 65 20  ffset!=0 do the 
e1f0: 6c 69 6d 69 74 20 72 65 67 69 73 74 65 72 73 20  limit registers 
e200: 67 65 74 0a 2a 2a 20 72 65 64 65 66 69 6e 65 64  get.** redefined
e210: 2e 20 20 54 68 65 20 55 4e 49 4f 4e 20 41 4c 4c  .  The UNION ALL
e220: 20 6f 70 65 72 61 74 6f 72 20 75 73 65 73 20 74   operator uses t
e230: 68 69 73 20 70 72 6f 70 65 72 74 79 20 74 6f 20  his property to 
e240: 66 6f 72 63 65 0a 2a 2a 20 74 68 65 20 72 65 75  force.** the reu
e250: 73 65 20 6f 66 20 74 68 65 20 73 61 6d 65 20 6c  se of the same l
e260: 69 6d 69 74 20 61 6e 64 20 6f 66 66 73 65 74 20  imit and offset 
e270: 72 65 67 69 73 74 65 72 73 20 61 63 72 6f 73 73  registers across
e280: 20 6d 75 6c 74 69 70 6c 65 0a 2a 2a 20 53 45 4c   multiple.** SEL
e290: 45 43 54 20 73 74 61 74 65 6d 65 6e 74 73 2e 0a  ECT statements..
e2a0: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63  */.static void c
e2b0: 6f 6d 70 75 74 65 4c 69 6d 69 74 52 65 67 69 73  omputeLimitRegis
e2c0: 74 65 72 73 28 50 61 72 73 65 20 2a 70 50 61 72  ters(Parse *pPar
e2d0: 73 65 2c 20 53 65 6c 65 63 74 20 2a 70 2c 20 69  se, Select *p, i
e2e0: 6e 74 20 69 42 72 65 61 6b 29 7b 0a 20 20 56 64  nt iBreak){.  Vd
e2f0: 62 65 20 2a 76 20 3d 20 30 3b 0a 20 20 69 6e 74  be *v = 0;.  int
e300: 20 69 4c 69 6d 69 74 20 3d 20 30 3b 0a 20 20 69   iLimit = 0;.  i
e310: 6e 74 20 69 4f 66 66 73 65 74 3b 0a 20 20 69 6e  nt iOffset;.  in
e320: 74 20 61 64 64 72 31 3b 0a 0a 20 20 2f 2a 20 0a  t addr1;..  /* .
e330: 20 20 2a 2a 20 22 4c 49 4d 49 54 20 2d 31 22 20    ** "LIMIT -1" 
e340: 61 6c 77 61 79 73 20 73 68 6f 77 73 20 61 6c 6c  always shows all
e350: 20 72 6f 77 73 2e 20 20 54 68 65 72 65 20 69 73   rows.  There is
e360: 20 73 6f 6d 65 0a 20 20 2a 2a 20 63 6f 6e 74 72   some.  ** contr
e370: 61 76 65 72 73 79 20 61 62 6f 75 74 20 77 68 61  aversy about wha
e380: 74 20 74 68 65 20 63 6f 72 72 65 63 74 20 62 65  t the correct be
e390: 68 61 76 69 6f 72 20 73 68 6f 75 6c 64 20 62 65  havior should be
e3a0: 2e 0a 20 20 2a 2a 20 54 68 65 20 63 75 72 72 65  ..  ** The curre
e3b0: 6e 74 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  nt implementatio
e3c0: 6e 20 69 6e 74 65 72 70 72 65 74 73 20 22 4c 49  n interprets "LI
e3d0: 4d 49 54 20 30 22 20 74 6f 20 6d 65 61 6e 0a 20  MIT 0" to mean. 
e3e0: 20 2a 2a 20 6e 6f 20 72 6f 77 73 2e 0a 20 20 2a   ** no rows..  *
e3f0: 2f 0a 20 20 69 66 28 20 70 2d 3e 70 4c 69 6d 69  /.  if( p->pLimi
e400: 74 20 29 7b 0a 20 20 20 20 70 2d 3e 69 4c 69 6d  t ){.    p->iLim
e410: 69 74 20 3d 20 69 4c 69 6d 69 74 20 3d 20 2b 2b  it = iLimit = ++
e420: 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20  pParse->nMem;.  
e430: 20 20 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74    v = sqlite3Get
e440: 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20  Vdbe(pParse);.  
e450: 20 20 69 66 28 20 76 3d 3d 30 20 29 20 72 65 74    if( v==0 ) ret
e460: 75 72 6e 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  urn;.    sqlite3
e470: 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c  ExprCode(pParse,
e480: 20 70 2d 3e 70 4c 69 6d 69 74 2c 20 69 4c 69 6d   p->pLimit, iLim
e490: 69 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  it);.    sqlite3
e4a0: 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50  VdbeAddOp1(v, OP
e4b0: 5f 4d 75 73 74 42 65 49 6e 74 2c 20 69 4c 69 6d  _MustBeInt, iLim
e4c0: 69 74 29 3b 0a 20 20 20 20 56 64 62 65 43 6f 6d  it);.    VdbeCom
e4d0: 6d 65 6e 74 28 28 76 2c 20 22 4c 49 4d 49 54 20  ment((v, "LIMIT 
e4e0: 63 6f 75 6e 74 65 72 22 29 29 3b 0a 20 20 20 20  counter"));.    
e4f0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
e500: 32 28 76 2c 20 4f 50 5f 49 66 5a 65 72 6f 2c 20  2(v, OP_IfZero, 
e510: 69 4c 69 6d 69 74 2c 20 69 42 72 65 61 6b 29 3b  iLimit, iBreak);
e520: 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e 70 4f  .  }.  if( p->pO
e530: 66 66 73 65 74 20 29 7b 0a 20 20 20 20 70 2d 3e  ffset ){.    p->
e540: 69 4f 66 66 73 65 74 20 3d 20 69 4f 66 66 73 65  iOffset = iOffse
e550: 74 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d  t = ++pParse->nM
e560: 65 6d 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 70  em;.    if( p->p
e570: 4c 69 6d 69 74 20 29 7b 0a 20 20 20 20 20 20 70  Limit ){.      p
e580: 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b 2b 3b 20 20  Parse->nMem++;  
e590: 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 61 6e 20   /* Allocate an 
e5a0: 65 78 74 72 61 20 72 65 67 69 73 74 65 72 20 66  extra register f
e5b0: 6f 72 20 6c 69 6d 69 74 2b 6f 66 66 73 65 74 20  or limit+offset 
e5c0: 2a 2f 0a 20 20 20 20 7d 0a 20 20 20 20 76 20 3d  */.    }.    v =
e5d0: 20 73 71 6c 69 74 65 33 47 65 74 56 64 62 65 28   sqlite3GetVdbe(
e5e0: 70 50 61 72 73 65 29 3b 0a 20 20 20 20 69 66 28  pParse);.    if(
e5f0: 20 76 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a   v==0 ) return;.
e600: 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
e610: 6f 64 65 28 70 50 61 72 73 65 2c 20 70 2d 3e 70  ode(pParse, p->p
e620: 4f 66 66 73 65 74 2c 20 69 4f 66 66 73 65 74 29  Offset, iOffset)
e630: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
e640: 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 4d 75  eAddOp1(v, OP_Mu
e650: 73 74 42 65 49 6e 74 2c 20 69 4f 66 66 73 65 74  stBeInt, iOffset
e660: 29 3b 0a 20 20 20 20 56 64 62 65 43 6f 6d 6d 65  );.    VdbeComme
e670: 6e 74 28 28 76 2c 20 22 4f 46 46 53 45 54 20 63  nt((v, "OFFSET c
e680: 6f 75 6e 74 65 72 22 29 29 3b 0a 20 20 20 20 61  ounter"));.    a
e690: 64 64 72 31 20 3d 20 73 71 6c 69 74 65 33 56 64  ddr1 = sqlite3Vd
e6a0: 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 49  beAddOp1(v, OP_I
e6b0: 66 50 6f 73 2c 20 69 4f 66 66 73 65 74 29 3b 0a  fPos, iOffset);.
e6c0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
e6d0: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65  ddOp2(v, OP_Inte
e6e0: 67 65 72 2c 20 30 2c 20 69 4f 66 66 73 65 74 29  ger, 0, iOffset)
e6f0: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
e700: 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64  eJumpHere(v, add
e710: 72 31 29 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e  r1);.    if( p->
e720: 70 4c 69 6d 69 74 20 29 7b 0a 20 20 20 20 20 20  pLimit ){.      
e730: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
e740: 33 28 76 2c 20 4f 50 5f 41 64 64 2c 20 69 4c 69  3(v, OP_Add, iLi
e750: 6d 69 74 2c 20 69 4f 66 66 73 65 74 2c 20 69 4f  mit, iOffset, iO
e760: 66 66 73 65 74 2b 31 29 3b 0a 20 20 20 20 20 20  ffset+1);.      
e770: 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20  VdbeComment((v, 
e780: 22 4c 49 4d 49 54 2b 4f 46 46 53 45 54 22 29 29  "LIMIT+OFFSET"))
e790: 3b 0a 20 20 20 20 20 20 61 64 64 72 31 20 3d 20  ;.      addr1 = 
e7a0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
e7b0: 31 28 76 2c 20 4f 50 5f 49 66 50 6f 73 2c 20 69  1(v, OP_IfPos, i
e7c0: 4c 69 6d 69 74 29 3b 0a 20 20 20 20 20 20 73 71  Limit);.      sq
e7d0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
e7e0: 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 2d  v, OP_Integer, -
e7f0: 31 2c 20 69 4f 66 66 73 65 74 2b 31 29 3b 0a 20  1, iOffset+1);. 
e800: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
e810: 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72  JumpHere(v, addr
e820: 31 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a  1);.    }.  }.}.
e830: 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20  ./*.** Allocate 
e840: 61 20 76 69 72 74 75 61 6c 20 69 6e 64 65 78 20  a virtual index 
e850: 74 6f 20 75 73 65 20 66 6f 72 20 73 6f 72 74 69  to use for sorti
e860: 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ng..*/.static vo
e870: 69 64 20 63 72 65 61 74 65 53 6f 72 74 69 6e 67  id createSorting
e880: 49 6e 64 65 78 28 50 61 72 73 65 20 2a 70 50 61  Index(Parse *pPa
e890: 72 73 65 2c 20 53 65 6c 65 63 74 20 2a 70 2c 20  rse, Select *p, 
e8a0: 45 78 70 72 4c 69 73 74 20 2a 70 4f 72 64 65 72  ExprList *pOrder
e8b0: 42 79 29 7b 0a 20 20 69 66 28 20 70 4f 72 64 65  By){.  if( pOrde
e8c0: 72 42 79 20 29 7b 0a 20 20 20 20 69 6e 74 20 61  rBy ){.    int a
e8d0: 64 64 72 3b 0a 20 20 20 20 61 73 73 65 72 74 28  ddr;.    assert(
e8e0: 20 70 4f 72 64 65 72 42 79 2d 3e 69 45 43 75 72   pOrderBy->iECur
e8f0: 73 6f 72 3d 3d 30 20 29 3b 0a 20 20 20 20 70 4f  sor==0 );.    pO
e900: 72 64 65 72 42 79 2d 3e 69 45 43 75 72 73 6f 72  rderBy->iECursor
e910: 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b   = pParse->nTab+
e920: 2b 3b 0a 20 20 20 20 61 64 64 72 20 3d 20 73 71  +;.    addr = sq
e930: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
e940: 70 50 61 72 73 65 2d 3e 70 56 64 62 65 2c 20 4f  pParse->pVdbe, O
e950: 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 2c  P_OpenEphemeral,
e960: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
e970: 20 20 20 20 20 20 20 20 20 20 20 20 20 70 4f 72               pOr
e980: 64 65 72 42 79 2d 3e 69 45 43 75 72 73 6f 72 2c  derBy->iECursor,
e990: 20 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72   pOrderBy->nExpr
e9a0: 2b 31 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  +1);.    assert(
e9b0: 20 70 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d   p->addrOpenEphm
e9c0: 5b 32 5d 20 3d 3d 20 2d 31 20 29 3b 0a 20 20 20  [2] == -1 );.   
e9d0: 20 70 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d   p->addrOpenEphm
e9e0: 5b 32 5d 20 3d 20 61 64 64 72 3b 0a 20 20 7d 0a  [2] = addr;.  }.
e9f0: 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  }..#ifndef SQLIT
ea00: 45 5f 4f 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f  E_OMIT_COMPOUND_
ea10: 53 45 4c 45 43 54 0a 2f 2a 0a 2a 2a 20 52 65 74  SELECT./*.** Ret
ea20: 75 72 6e 20 74 68 65 20 61 70 70 72 6f 70 72 69  urn the appropri
ea30: 61 74 65 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65  ate collating se
ea40: 71 75 65 6e 63 65 20 66 6f 72 20 74 68 65 20 69  quence for the i
ea50: 43 6f 6c 2d 74 68 20 63 6f 6c 75 6d 6e 20 6f 66  Col-th column of
ea60: 0a 2a 2a 20 74 68 65 20 72 65 73 75 6c 74 20 73  .** the result s
ea70: 65 74 20 66 6f 72 20 74 68 65 20 63 6f 6d 70 6f  et for the compo
ea80: 75 6e 64 2d 73 65 6c 65 63 74 20 73 74 61 74 65  und-select state
ea90: 6d 65 6e 74 20 22 70 22 2e 20 20 52 65 74 75 72  ment "p".  Retur
eaa0: 6e 20 4e 55 4c 4c 20 69 66 0a 2a 2a 20 74 68 65  n NULL if.** the
eab0: 20 63 6f 6c 75 6d 6e 20 68 61 73 20 6e 6f 20 64   column has no d
eac0: 65 66 61 75 6c 74 20 63 6f 6c 6c 61 74 69 6e 67  efault collating
ead0: 20 73 65 71 75 65 6e 63 65 2e 0a 2a 2a 0a 2a 2a   sequence..**.**
eae0: 20 54 68 65 20 63 6f 6c 6c 61 74 69 6e 67 20 73   The collating s
eaf0: 65 71 75 65 6e 63 65 20 66 6f 72 20 74 68 65 20  equence for the 
eb00: 63 6f 6d 70 6f 75 6e 64 20 73 65 6c 65 63 74 20  compound select 
eb10: 69 73 20 74 61 6b 65 6e 20 66 72 6f 6d 20 74 68  is taken from th
eb20: 65 0a 2a 2a 20 6c 65 66 74 2d 6d 6f 73 74 20 74  e.** left-most t
eb30: 65 72 6d 20 6f 66 20 74 68 65 20 73 65 6c 65 63  erm of the selec
eb40: 74 20 74 68 61 74 20 68 61 73 20 61 20 63 6f 6c  t that has a col
eb50: 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65 2e  lating sequence.
eb60: 0a 2a 2f 0a 73 74 61 74 69 63 20 43 6f 6c 6c 53  .*/.static CollS
eb70: 65 71 20 2a 6d 75 6c 74 69 53 65 6c 65 63 74 43  eq *multiSelectC
eb80: 6f 6c 6c 53 65 71 28 50 61 72 73 65 20 2a 70 50  ollSeq(Parse *pP
eb90: 61 72 73 65 2c 20 53 65 6c 65 63 74 20 2a 70 2c  arse, Select *p,
eba0: 20 69 6e 74 20 69 43 6f 6c 29 7b 0a 20 20 43 6f   int iCol){.  Co
ebb0: 6c 6c 53 65 71 20 2a 70 52 65 74 3b 0a 20 20 69  llSeq *pRet;.  i
ebc0: 66 28 20 70 2d 3e 70 50 72 69 6f 72 20 29 7b 0a  f( p->pPrior ){.
ebd0: 20 20 20 20 70 52 65 74 20 3d 20 6d 75 6c 74 69      pRet = multi
ebe0: 53 65 6c 65 63 74 43 6f 6c 6c 53 65 71 28 70 50  SelectCollSeq(pP
ebf0: 61 72 73 65 2c 20 70 2d 3e 70 50 72 69 6f 72 2c  arse, p->pPrior,
ec00: 20 69 43 6f 6c 29 3b 0a 20 20 7d 65 6c 73 65 7b   iCol);.  }else{
ec10: 0a 20 20 20 20 70 52 65 74 20 3d 20 30 3b 0a 20  .    pRet = 0;. 
ec20: 20 7d 0a 20 20 69 66 28 20 70 52 65 74 3d 3d 30   }.  if( pRet==0
ec30: 20 29 7b 0a 20 20 20 20 70 52 65 74 20 3d 20 73   ){.    pRet = s
ec40: 71 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c 53 65  qlite3ExprCollSe
ec50: 71 28 70 50 61 72 73 65 2c 20 70 2d 3e 70 45 4c  q(pParse, p->pEL
ec60: 69 73 74 2d 3e 61 5b 69 43 6f 6c 5d 2e 70 45 78  ist->a[iCol].pEx
ec70: 70 72 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  pr);.  }.  retur
ec80: 6e 20 70 52 65 74 3b 0a 7d 0a 23 65 6e 64 69 66  n pRet;.}.#endif
ec90: 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f   /* SQLITE_OMIT_
eca0: 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45 43 54 20  COMPOUND_SELECT 
ecb0: 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  */..#ifndef SQLI
ecc0: 54 45 5f 4f 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44  TE_OMIT_COMPOUND
ecd0: 5f 53 45 4c 45 43 54 0a 2f 2a 0a 2a 2a 20 54 68  _SELECT./*.** Th
ece0: 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61  is routine is ca
ecf0: 6c 6c 65 64 20 74 6f 20 70 72 6f 63 65 73 73 20  lled to process 
ed00: 61 20 71 75 65 72 79 20 74 68 61 74 20 69 73 20  a query that is 
ed10: 72 65 61 6c 6c 79 20 74 68 65 20 75 6e 69 6f 6e  really the union
ed20: 0a 2a 2a 20 6f 72 20 69 6e 74 65 72 73 65 63 74  .** or intersect
ed30: 69 6f 6e 20 6f 66 20 74 77 6f 20 6f 72 20 6d 6f  ion of two or mo
ed40: 72 65 20 73 65 70 61 72 61 74 65 20 71 75 65 72  re separate quer
ed50: 69 65 73 2e 0a 2a 2a 0a 2a 2a 20 22 70 22 20 70  ies..**.** "p" p
ed60: 6f 69 6e 74 73 20 74 6f 20 74 68 65 20 72 69 67  oints to the rig
ed70: 68 74 2d 6d 6f 73 74 20 6f 66 20 74 68 65 20 74  ht-most of the t
ed80: 77 6f 20 71 75 65 72 69 65 73 2e 20 20 74 68 65  wo queries.  the
ed90: 20 71 75 65 72 79 20 6f 6e 20 74 68 65 0a 2a 2a   query on the.**
eda0: 20 6c 65 66 74 20 69 73 20 70 2d 3e 70 50 72 69   left is p->pPri
edb0: 6f 72 2e 20 20 54 68 65 20 6c 65 66 74 20 71 75  or.  The left qu
edc0: 65 72 79 20 63 6f 75 6c 64 20 61 6c 73 6f 20 62  ery could also b
edd0: 65 20 61 20 63 6f 6d 70 6f 75 6e 64 20 71 75 65  e a compound que
ede0: 72 79 0a 2a 2a 20 69 6e 20 77 68 69 63 68 20 63  ry.** in which c
edf0: 61 73 65 20 74 68 69 73 20 72 6f 75 74 69 6e 65  ase this routine
ee00: 20 77 69 6c 6c 20 62 65 20 63 61 6c 6c 65 64 20   will be called 
ee10: 72 65 63 75 72 73 69 76 65 6c 79 2e 20 0a 2a 2a  recursively. .**
ee20: 0a 2a 2a 20 54 68 65 20 72 65 73 75 6c 74 73 20  .** The results 
ee30: 6f 66 20 74 68 65 20 74 6f 74 61 6c 20 71 75 65  of the total que
ee40: 72 79 20 61 72 65 20 74 6f 20 62 65 20 77 72 69  ry are to be wri
ee50: 74 74 65 6e 20 69 6e 74 6f 20 61 20 64 65 73 74  tten into a dest
ee60: 69 6e 61 74 69 6f 6e 0a 2a 2a 20 6f 66 20 74 79  ination.** of ty
ee70: 70 65 20 65 44 65 73 74 20 77 69 74 68 20 70 61  pe eDest with pa
ee80: 72 61 6d 65 74 65 72 20 69 50 61 72 6d 2e 0a 2a  rameter iParm..*
ee90: 2a 0a 2a 2a 20 45 78 61 6d 70 6c 65 20 31 3a 20  *.** Example 1: 
eea0: 20 43 6f 6e 73 69 64 65 72 20 61 20 74 68 72 65   Consider a thre
eeb0: 65 2d 77 61 79 20 63 6f 6d 70 6f 75 6e 64 20 53  e-way compound S
eec0: 51 4c 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a  QL statement..**
eed0: 0a 2a 2a 20 20 20 20 20 53 45 4c 45 43 54 20 61  .**     SELECT a
eee0: 20 46 52 4f 4d 20 74 31 20 55 4e 49 4f 4e 20 53   FROM t1 UNION S
eef0: 45 4c 45 43 54 20 62 20 46 52 4f 4d 20 74 32 20  ELECT b FROM t2 
ef00: 55 4e 49 4f 4e 20 53 45 4c 45 43 54 20 63 20 46  UNION SELECT c F
ef10: 52 4f 4d 20 74 33 0a 2a 2a 0a 2a 2a 20 54 68 69  ROM t3.**.** Thi
ef20: 73 20 73 74 61 74 65 6d 65 6e 74 20 69 73 20 70  s statement is p
ef30: 61 72 73 65 64 20 75 70 20 61 73 20 66 6f 6c 6c  arsed up as foll
ef40: 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53  ows:.**.**     S
ef50: 45 4c 45 43 54 20 63 20 46 52 4f 4d 20 74 33 0a  ELECT c FROM t3.
ef60: 2a 2a 20 20 20 20 20 20 7c 0a 2a 2a 20 20 20 20  **      |.**    
ef70: 20 20 60 2d 2d 2d 2d 2d 3e 20 20 53 45 4c 45 43    `----->  SELEC
ef80: 54 20 62 20 46 52 4f 4d 20 74 32 0a 2a 2a 20 20  T b FROM t2.**  
ef90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 0a                |.
efa0: 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
efb0: 20 20 60 2d 2d 2d 2d 2d 2d 3e 20 20 53 45 4c 45    `------>  SELE
efc0: 43 54 20 61 20 46 52 4f 4d 20 74 31 0a 2a 2a 0a  CT a FROM t1.**.
efd0: 2a 2a 20 54 68 65 20 61 72 72 6f 77 73 20 69 6e  ** The arrows in
efe0: 20 74 68 65 20 64 69 61 67 72 61 6d 20 61 62 6f   the diagram abo
eff0: 76 65 20 72 65 70 72 65 73 65 6e 74 20 74 68 65  ve represent the
f000: 20 53 65 6c 65 63 74 2e 70 50 72 69 6f 72 20 70   Select.pPrior p
f010: 6f 69 6e 74 65 72 2e 0a 2a 2a 20 53 6f 20 69 66  ointer..** So if
f020: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   this routine is
f030: 20 63 61 6c 6c 65 64 20 77 69 74 68 20 70 20 65   called with p e
f040: 71 75 61 6c 20 74 6f 20 74 68 65 20 74 33 20 71  qual to the t3 q
f050: 75 65 72 79 2c 20 74 68 65 6e 0a 2a 2a 20 70 50  uery, then.** pP
f060: 72 69 6f 72 20 77 69 6c 6c 20 62 65 20 74 68 65  rior will be the
f070: 20 74 32 20 71 75 65 72 79 2e 20 20 70 2d 3e 6f   t2 query.  p->o
f080: 70 20 77 69 6c 6c 20 62 65 20 54 4b 5f 55 4e 49  p will be TK_UNI
f090: 4f 4e 20 69 6e 20 74 68 69 73 20 63 61 73 65 2e  ON in this case.
f0a0: 0a 2a 2a 0a 2a 2a 20 4e 6f 74 69 63 65 20 74 68  .**.** Notice th
f0b0: 61 74 20 62 65 63 61 75 73 65 20 6f 66 20 74 68  at because of th
f0c0: 65 20 77 61 79 20 53 51 4c 69 74 65 20 70 61 72  e way SQLite par
f0d0: 73 65 73 20 63 6f 6d 70 6f 75 6e 64 20 53 45 4c  ses compound SEL
f0e0: 45 43 54 73 2c 20 74 68 65 0a 2a 2a 20 69 6e 64  ECTs, the.** ind
f0f0: 69 76 69 64 75 61 6c 20 73 65 6c 65 63 74 73 20  ividual selects 
f100: 61 6c 77 61 79 73 20 67 72 6f 75 70 20 66 72 6f  always group fro
f110: 6d 20 6c 65 66 74 20 74 6f 20 72 69 67 68 74 2e  m left to right.
f120: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6d  .*/.static int m
f130: 75 6c 74 69 53 65 6c 65 63 74 28 0a 20 20 50 61  ultiSelect(.  Pa
f140: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20  rse *pParse,    
f150: 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63      /* Parsing c
f160: 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53 65 6c 65  ontext */.  Sele
f170: 63 74 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20  ct *p,          
f180: 20 20 2f 2a 20 54 68 65 20 72 69 67 68 74 2d 6d    /* The right-m
f190: 6f 73 74 20 6f 66 20 53 45 4c 45 43 54 73 20 74  ost of SELECTs t
f1a0: 6f 20 62 65 20 63 6f 64 65 64 20 2a 2f 0a 20 20  o be coded */.  
f1b0: 53 65 6c 65 63 74 44 65 73 74 20 2a 70 44 65 73  SelectDest *pDes
f1c0: 74 2c 20 20 20 20 2f 2a 20 57 68 61 74 20 74 6f  t,    /* What to
f1d0: 20 64 6f 20 77 69 74 68 20 71 75 65 72 79 20 72   do with query r
f1e0: 65 73 75 6c 74 73 20 2a 2f 0a 20 20 63 68 61 72  esults */.  char
f1f0: 20 2a 61 66 66 20 20 20 20 20 20 20 20 20 20 20   *aff           
f200: 20 20 2f 2a 20 49 66 20 65 44 65 73 74 20 69 73    /* If eDest is
f210: 20 53 52 54 5f 55 6e 69 6f 6e 2c 20 74 68 65 20   SRT_Union, the 
f220: 61 66 66 69 6e 69 74 79 20 73 74 72 69 6e 67 20  affinity string 
f230: 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d  */.){.  int rc =
f240: 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 2f 2a   SQLITE_OK;   /*
f250: 20 53 75 63 63 65 73 73 20 63 6f 64 65 20 66 72   Success code fr
f260: 6f 6d 20 61 20 73 75 62 72 6f 75 74 69 6e 65 20  om a subroutine 
f270: 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 50 72  */.  Select *pPr
f280: 69 6f 72 3b 20 20 20 20 20 20 20 2f 2a 20 41 6e  ior;       /* An
f290: 6f 74 68 65 72 20 53 45 4c 45 43 54 20 69 6d 6d  other SELECT imm
f2a0: 65 64 69 61 74 65 6c 79 20 74 6f 20 6f 75 72 20  ediately to our 
f2b0: 6c 65 66 74 20 2a 2f 0a 20 20 56 64 62 65 20 2a  left */.  Vdbe *
f2c0: 76 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  v;              
f2d0: 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65  /* Generate code
f2e0: 20 74 6f 20 74 68 69 73 20 56 44 42 45 20 2a 2f   to this VDBE */
f2f0: 0a 20 20 69 6e 74 20 6e 43 6f 6c 3b 20 20 20 20  .  int nCol;    
f300: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
f310: 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 69 6e  er of columns in
f320: 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 20   the result set 
f330: 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70  */.  ExprList *p
f340: 4f 72 64 65 72 42 79 3b 20 20 20 2f 2a 20 54 68  OrderBy;   /* Th
f350: 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73  e ORDER BY claus
f360: 65 20 6f 6e 20 70 20 2a 2f 0a 20 20 69 6e 74 20  e on p */.  int 
f370: 61 53 65 74 50 32 5b 32 5d 3b 20 20 20 20 20 20  aSetP2[2];      
f380: 20 20 2f 2a 20 53 65 74 20 50 32 20 76 61 6c 75    /* Set P2 valu
f390: 65 20 6f 66 20 74 68 65 73 65 20 6f 70 20 74 6f  e of these op to
f3a0: 20 6e 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d   number of colum
f3b0: 6e 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 53 65 74  ns */.  int nSet
f3c0: 50 32 20 3d 20 30 3b 20 20 20 20 20 20 20 2f 2a  P2 = 0;       /*
f3d0: 20 4e 75 6d 62 65 72 20 6f 66 20 73 6c 6f 74 73   Number of slots
f3e0: 20 69 6e 20 61 53 65 74 50 32 5b 5d 20 75 73 65   in aSetP2[] use
f3f0: 64 20 2a 2f 0a 20 20 53 65 6c 65 63 74 44 65 73  d */.  SelectDes
f400: 74 20 64 65 73 74 3b 20 20 20 20 20 20 2f 2a 20  t dest;      /* 
f410: 41 6c 74 65 72 6e 61 74 69 76 65 20 64 61 74 61  Alternative data
f420: 20 64 65 73 74 69 6e 61 74 69 6f 6e 20 2a 2f 0a   destination */.
f430: 0a 20 20 64 65 73 74 20 3d 20 2a 70 44 65 73 74  .  dest = *pDest
f440: 3b 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72  ;..  /* Make sur
f450: 65 20 74 68 65 72 65 20 69 73 20 6e 6f 20 4f 52  e there is no OR
f460: 44 45 52 20 42 59 20 6f 72 20 4c 49 4d 49 54 20  DER BY or LIMIT 
f470: 63 6c 61 75 73 65 20 6f 6e 20 70 72 69 6f 72 20  clause on prior 
f480: 53 45 4c 45 43 54 73 2e 20 20 4f 6e 6c 79 0a 20  SELECTs.  Only. 
f490: 20 2a 2a 20 74 68 65 20 6c 61 73 74 20 28 72 69   ** the last (ri
f4a0: 67 68 74 2d 6d 6f 73 74 29 20 53 45 4c 45 43 54  ght-most) SELECT
f4b0: 20 69 6e 20 74 68 65 20 73 65 72 69 65 73 20 6d   in the series m
f4c0: 61 79 20 68 61 76 65 20 61 6e 20 4f 52 44 45 52  ay have an ORDER
f4d0: 20 42 59 20 6f 72 20 4c 49 4d 49 54 2e 0a 20 20   BY or LIMIT..  
f4e0: 2a 2f 0a 20 20 69 66 28 20 70 3d 3d 30 20 7c 7c  */.  if( p==0 ||
f4f0: 20 70 2d 3e 70 50 72 69 6f 72 3d 3d 30 20 29 7b   p->pPrior==0 ){
f500: 0a 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 20  .    rc = 1;.   
f510: 20 67 6f 74 6f 20 6d 75 6c 74 69 5f 73 65 6c 65   goto multi_sele
f520: 63 74 5f 65 6e 64 3b 0a 20 20 7d 0a 20 20 70 50  ct_end;.  }.  pP
f530: 72 69 6f 72 20 3d 20 70 2d 3e 70 50 72 69 6f 72  rior = p->pPrior
f540: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 72 69  ;.  assert( pPri
f550: 6f 72 2d 3e 70 52 69 67 68 74 6d 6f 73 74 21 3d  or->pRightmost!=
f560: 70 50 72 69 6f 72 20 29 3b 0a 20 20 61 73 73 65  pPrior );.  asse
f570: 72 74 28 20 70 50 72 69 6f 72 2d 3e 70 52 69 67  rt( pPrior->pRig
f580: 68 74 6d 6f 73 74 3d 3d 70 2d 3e 70 52 69 67 68  htmost==p->pRigh
f590: 74 6d 6f 73 74 20 29 3b 0a 20 20 69 66 28 20 70  tmost );.  if( p
f5a0: 50 72 69 6f 72 2d 3e 70 4f 72 64 65 72 42 79 20  Prior->pOrderBy 
f5b0: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72  ){.    sqlite3Er
f5c0: 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 22 4f  rorMsg(pParse,"O
f5d0: 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 73  RDER BY clause s
f5e0: 68 6f 75 6c 64 20 63 6f 6d 65 20 61 66 74 65 72  hould come after
f5f0: 20 25 73 20 6e 6f 74 20 62 65 66 6f 72 65 22 2c   %s not before",
f600: 0a 20 20 20 20 20 20 73 65 6c 65 63 74 4f 70 4e  .      selectOpN
f610: 61 6d 65 28 70 2d 3e 6f 70 29 29 3b 0a 20 20 20  ame(p->op));.   
f620: 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 67 6f 74   rc = 1;.    got
f630: 6f 20 6d 75 6c 74 69 5f 73 65 6c 65 63 74 5f 65  o multi_select_e
f640: 6e 64 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50  nd;.  }.  if( pP
f650: 72 69 6f 72 2d 3e 70 4c 69 6d 69 74 20 29 7b 0a  rior->pLimit ){.
f660: 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
f670: 4d 73 67 28 70 50 61 72 73 65 2c 22 4c 49 4d 49  Msg(pParse,"LIMI
f680: 54 20 63 6c 61 75 73 65 20 73 68 6f 75 6c 64 20  T clause should 
f690: 63 6f 6d 65 20 61 66 74 65 72 20 25 73 20 6e 6f  come after %s no
f6a0: 74 20 62 65 66 6f 72 65 22 2c 0a 20 20 20 20 20  t before",.     
f6b0: 20 73 65 6c 65 63 74 4f 70 4e 61 6d 65 28 70 2d   selectOpName(p-
f6c0: 3e 6f 70 29 29 3b 0a 20 20 20 20 72 63 20 3d 20  >op));.    rc = 
f6d0: 31 3b 0a 20 20 20 20 67 6f 74 6f 20 6d 75 6c 74  1;.    goto mult
f6e0: 69 5f 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20  i_select_end;.  
f6f0: 7d 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72  }..  /* Make sur
f700: 65 20 77 65 20 68 61 76 65 20 61 20 76 61 6c 69  e we have a vali
f710: 64 20 71 75 65 72 79 20 65 6e 67 69 6e 65 2e 20  d query engine. 
f720: 20 49 66 20 6e 6f 74 2c 20 63 72 65 61 74 65 20   If not, create 
f730: 61 20 6e 65 77 20 6f 6e 65 2e 0a 20 20 2a 2f 0a  a new one..  */.
f740: 20 20 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74    v = sqlite3Get
f750: 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20  Vdbe(pParse);.  
f760: 69 66 28 20 76 3d 3d 30 20 29 7b 0a 20 20 20 20  if( v==0 ){.    
f770: 72 63 20 3d 20 31 3b 0a 20 20 20 20 67 6f 74 6f  rc = 1;.    goto
f780: 20 6d 75 6c 74 69 5f 73 65 6c 65 63 74 5f 65 6e   multi_select_en
f790: 64 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 72 65  d;.  }..  /* Cre
f7a0: 61 74 65 20 74 68 65 20 64 65 73 74 69 6e 61 74  ate the destinat
f7b0: 69 6f 6e 20 74 65 6d 70 6f 72 61 72 79 20 74 61  ion temporary ta
f7c0: 62 6c 65 20 69 66 20 6e 65 63 65 73 73 61 72 79  ble if necessary
f7d0: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 64 65 73 74  .  */.  if( dest
f7e0: 2e 65 44 65 73 74 3d 3d 53 52 54 5f 45 70 68 65  .eDest==SRT_Ephe
f7f0: 6d 54 61 62 20 29 7b 0a 20 20 20 20 61 73 73 65  mTab ){.    asse
f800: 72 74 28 20 70 2d 3e 70 45 4c 69 73 74 20 29 3b  rt( p->pEList );
f810: 0a 20 20 20 20 61 73 73 65 72 74 28 20 6e 53 65  .    assert( nSe
f820: 74 50 32 3c 73 69 7a 65 6f 66 28 61 53 65 74 50  tP2<sizeof(aSetP
f830: 32 29 2f 73 69 7a 65 6f 66 28 61 53 65 74 50 32  2)/sizeof(aSetP2
f840: 5b 30 5d 29 20 29 3b 0a 20 20 20 20 61 53 65 74  [0]) );.    aSet
f850: 50 32 5b 6e 53 65 74 50 32 2b 2b 5d 20 3d 20 73  P2[nSetP2++] = s
f860: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
f870: 28 76 2c 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d  (v, OP_OpenEphem
f880: 65 72 61 6c 2c 20 64 65 73 74 2e 69 50 61 72 6d  eral, dest.iParm
f890: 2c 20 30 29 3b 0a 20 20 20 20 64 65 73 74 2e 65  , 0);.    dest.e
f8a0: 44 65 73 74 20 3d 20 53 52 54 5f 54 61 62 6c 65  Dest = SRT_Table
f8b0: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 47 65 6e 65  ;.  }..  /* Gene
f8c0: 72 61 74 65 20 63 6f 64 65 20 66 6f 72 20 74 68  rate code for th
f8d0: 65 20 6c 65 66 74 20 61 6e 64 20 72 69 67 68 74  e left and right
f8e0: 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
f8f0: 74 73 2e 0a 20 20 2a 2f 0a 20 20 70 4f 72 64 65  ts..  */.  pOrde
f900: 72 42 79 20 3d 20 70 2d 3e 70 4f 72 64 65 72 42  rBy = p->pOrderB
f910: 79 3b 0a 20 20 73 77 69 74 63 68 28 20 70 2d 3e  y;.  switch( p->
f920: 6f 70 20 29 7b 0a 20 20 20 20 63 61 73 65 20 54  op ){.    case T
f930: 4b 5f 41 4c 4c 3a 20 7b 0a 20 20 20 20 20 20 69  K_ALL: {.      i
f940: 66 28 20 70 4f 72 64 65 72 42 79 3d 3d 30 20 29  f( pOrderBy==0 )
f950: 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 61 64  {.        int ad
f960: 64 72 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  dr = 0;.        
f970: 61 73 73 65 72 74 28 20 21 70 50 72 69 6f 72 2d  assert( !pPrior-
f980: 3e 70 4c 69 6d 69 74 20 29 3b 0a 20 20 20 20 20  >pLimit );.     
f990: 20 20 20 70 50 72 69 6f 72 2d 3e 70 4c 69 6d 69     pPrior->pLimi
f9a0: 74 20 3d 20 70 2d 3e 70 4c 69 6d 69 74 3b 0a 20  t = p->pLimit;. 
f9b0: 20 20 20 20 20 20 20 70 50 72 69 6f 72 2d 3e 70         pPrior->p
f9c0: 4f 66 66 73 65 74 20 3d 20 70 2d 3e 70 4f 66 66  Offset = p->pOff
f9d0: 73 65 74 3b 0a 20 20 20 20 20 20 20 20 72 63 20  set;.        rc 
f9e0: 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28  = sqlite3Select(
f9f0: 70 50 61 72 73 65 2c 20 70 50 72 69 6f 72 2c 20  pParse, pPrior, 
fa00: 26 64 65 73 74 2c 20 30 2c 20 30 2c 20 30 2c 20  &dest, 0, 0, 0, 
fa10: 61 66 66 29 3b 0a 20 20 20 20 20 20 20 20 70 2d  aff);.        p-
fa20: 3e 70 4c 69 6d 69 74 20 3d 20 30 3b 0a 20 20 20  >pLimit = 0;.   
fa30: 20 20 20 20 20 70 2d 3e 70 4f 66 66 73 65 74 20       p->pOffset 
fa40: 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 69 66 28  = 0;.        if(
fa50: 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20 20   rc ){.         
fa60: 20 67 6f 74 6f 20 6d 75 6c 74 69 5f 73 65 6c 65   goto multi_sele
fa70: 63 74 5f 65 6e 64 3b 0a 20 20 20 20 20 20 20 20  ct_end;.        
fa80: 7d 0a 20 20 20 20 20 20 20 20 70 2d 3e 70 50 72  }.        p->pPr
fa90: 69 6f 72 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  ior = 0;.       
faa0: 20 70 2d 3e 69 4c 69 6d 69 74 20 3d 20 70 50 72   p->iLimit = pPr
fab0: 69 6f 72 2d 3e 69 4c 69 6d 69 74 3b 0a 20 20 20  ior->iLimit;.   
fac0: 20 20 20 20 20 70 2d 3e 69 4f 66 66 73 65 74 20       p->iOffset 
fad0: 3d 20 70 50 72 69 6f 72 2d 3e 69 4f 66 66 73 65  = pPrior->iOffse
fae0: 74 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  t;.        if( p
faf0: 2d 3e 69 4c 69 6d 69 74 3e 3d 30 20 29 7b 0a 20  ->iLimit>=0 ){. 
fb00: 20 20 20 20 20 20 20 20 20 61 64 64 72 20 3d 20           addr = 
fb10: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
fb20: 31 28 76 2c 20 4f 50 5f 49 66 5a 65 72 6f 2c 20  1(v, OP_IfZero, 
fb30: 70 2d 3e 69 4c 69 6d 69 74 29 3b 0a 20 20 20 20  p->iLimit);.    
fb40: 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e        VdbeCommen
fb50: 74 28 28 76 2c 20 22 4a 75 6d 70 20 61 68 65 61  t((v, "Jump ahea
fb60: 64 20 69 66 20 4c 49 4d 49 54 20 72 65 61 63 68  d if LIMIT reach
fb70: 65 64 22 29 29 3b 0a 20 20 20 20 20 20 20 20 7d  ed"));.        }
fb80: 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71  .        rc = sq
fb90: 6c 69 74 65 33 53 65 6c 65 63 74 28 70 50 61 72  lite3Select(pPar
fba0: 73 65 2c 20 70 2c 20 26 64 65 73 74 2c 20 30 2c  se, p, &dest, 0,
fbb0: 20 30 2c 20 30 2c 20 61 66 66 29 3b 0a 20 20 20   0, 0, aff);.   
fbc0: 20 20 20 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d       p->pPrior =
fbd0: 20 70 50 72 69 6f 72 3b 0a 20 20 20 20 20 20 20   pPrior;.       
fbe0: 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20   if( rc ){.     
fbf0: 20 20 20 20 20 67 6f 74 6f 20 6d 75 6c 74 69 5f       goto multi_
fc00: 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20  select_end;.    
fc10: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66      }.        if
fc20: 28 20 61 64 64 72 20 29 7b 0a 20 20 20 20 20 20  ( addr ){.      
fc30: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a      sqlite3VdbeJ
fc40: 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72 29  umpHere(v, addr)
fc50: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
fc60: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
fc70: 20 7d 0a 20 20 20 20 20 20 2f 2a 20 46 6f 72 20   }.      /* For 
fc80: 55 4e 49 4f 4e 20 41 4c 4c 20 2e 2e 2e 20 4f 52  UNION ALL ... OR
fc90: 44 45 52 20 42 59 20 66 61 6c 6c 20 74 68 72 6f  DER BY fall thro
fca0: 75 67 68 20 74 6f 20 74 68 65 20 6e 65 78 74 20  ugh to the next 
fcb0: 63 61 73 65 20 2a 2f 0a 20 20 20 20 7d 0a 20 20  case */.    }.  
fcc0: 20 20 63 61 73 65 20 54 4b 5f 45 58 43 45 50 54    case TK_EXCEPT
fcd0: 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 55 4e  :.    case TK_UN
fce0: 49 4f 4e 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74  ION: {.      int
fcf0: 20 75 6e 69 6f 6e 54 61 62 3b 20 20 20 20 2f 2a   unionTab;    /*
fd00: 20 43 75 72 73 6f 72 20 6e 75 6d 62 65 72 20 6f   Cursor number o
fd10: 66 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79 20  f the temporary 
fd20: 74 61 62 6c 65 20 68 6f 6c 64 69 6e 67 20 72 65  table holding re
fd30: 73 75 6c 74 20 2a 2f 0a 20 20 20 20 20 20 69 6e  sult */.      in
fd40: 74 20 6f 70 20 3d 20 30 3b 20 20 20 20 20 20 2f  t op = 0;      /
fd50: 2a 20 4f 6e 65 20 6f 66 20 74 68 65 20 53 52 54  * One of the SRT
fd60: 5f 20 6f 70 65 72 61 74 69 6f 6e 73 20 74 6f 20  _ operations to 
fd70: 61 70 70 6c 79 20 74 6f 20 73 65 6c 66 20 2a 2f  apply to self */
fd80: 0a 20 20 20 20 20 20 69 6e 74 20 70 72 69 6f 72  .      int prior
fd90: 4f 70 3b 20 20 20 20 20 2f 2a 20 54 68 65 20 53  Op;     /* The S
fda0: 52 54 5f 20 6f 70 65 72 61 74 69 6f 6e 20 74 6f  RT_ operation to
fdb0: 20 61 70 70 6c 79 20 74 6f 20 70 72 69 6f 72 20   apply to prior 
fdc0: 73 65 6c 65 63 74 73 20 2a 2f 0a 20 20 20 20 20  selects */.     
fdd0: 20 45 78 70 72 20 2a 70 4c 69 6d 69 74 2c 20 2a   Expr *pLimit, *
fde0: 70 4f 66 66 73 65 74 3b 20 2f 2a 20 53 61 76 65  pOffset; /* Save
fdf0: 64 20 76 61 6c 75 65 73 20 6f 66 20 70 2d 3e 6e  d values of p->n
fe00: 4c 69 6d 69 74 20 61 6e 64 20 70 2d 3e 6e 4f 66  Limit and p->nOf
fe10: 66 73 65 74 20 2a 2f 0a 20 20 20 20 20 20 69 6e  fset */.      in
fe20: 74 20 61 64 64 72 3b 0a 20 20 20 20 20 20 53 65  t addr;.      Se
fe30: 6c 65 63 74 44 65 73 74 20 75 6e 69 6f 6e 64 65  lectDest unionde
fe40: 73 74 3b 0a 0a 20 20 20 20 20 20 70 72 69 6f 72  st;..      prior
fe50: 4f 70 20 3d 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 41  Op = p->op==TK_A
fe60: 4c 4c 20 3f 20 53 52 54 5f 54 61 62 6c 65 20 3a  LL ? SRT_Table :
fe70: 20 53 52 54 5f 55 6e 69 6f 6e 3b 0a 20 20 20 20   SRT_Union;.    
fe80: 20 20 69 66 28 20 64 65 73 74 2e 65 44 65 73 74    if( dest.eDest
fe90: 3d 3d 70 72 69 6f 72 4f 70 20 26 26 20 70 4f 72  ==priorOp && pOr
fea0: 64 65 72 42 79 3d 3d 30 20 26 26 20 21 70 2d 3e  derBy==0 && !p->
feb0: 70 4c 69 6d 69 74 20 26 26 20 21 70 2d 3e 70 4f  pLimit && !p->pO
fec0: 66 66 73 65 74 20 29 7b 0a 20 20 20 20 20 20 20  ffset ){.       
fed0: 20 2f 2a 20 57 65 20 63 61 6e 20 72 65 75 73 65   /* We can reuse
fee0: 20 61 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62   a temporary tab
fef0: 6c 65 20 67 65 6e 65 72 61 74 65 64 20 62 79 20  le generated by 
ff00: 61 20 53 45 4c 45 43 54 20 74 6f 20 6f 75 72 0a  a SELECT to our.
ff10: 20 20 20 20 20 20 20 20 2a 2a 20 72 69 67 68 74          ** right
ff20: 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20  ..        */.   
ff30: 20 20 20 20 20 75 6e 69 6f 6e 54 61 62 20 3d 20       unionTab = 
ff40: 64 65 73 74 2e 69 50 61 72 6d 3b 0a 20 20 20 20  dest.iParm;.    
ff50: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
ff60: 20 2f 2a 20 57 65 20 77 69 6c 6c 20 6e 65 65 64   /* We will need
ff70: 20 74 6f 20 63 72 65 61 74 65 20 6f 75 72 20 6f   to create our o
ff80: 77 6e 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62  wn temporary tab
ff90: 6c 65 20 74 6f 20 68 6f 6c 64 20 74 68 65 0a 20  le to hold the. 
ffa0: 20 20 20 20 20 20 20 2a 2a 20 69 6e 74 65 72 6d         ** interm
ffb0: 65 64 69 61 74 65 20 72 65 73 75 6c 74 73 2e 0a  ediate results..
ffc0: 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
ffd0: 20 20 20 75 6e 69 6f 6e 54 61 62 20 3d 20 70 50     unionTab = pP
ffe0: 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20  arse->nTab++;.  
fff0: 20 20 20 20 20 20 69 66 28 20 70 72 6f 63 65 73        if( proces
10000 73 43 6f 6d 70 6f 75 6e 64 4f 72 64 65 72 42 79  sCompoundOrderBy
10010 28 70 50 61 72 73 65 2c 20 70 2c 20 75 6e 69 6f  (pParse, p, unio
10020 6e 54 61 62 29 20 29 7b 0a 20 20 20 20 20 20 20  nTab) ){.       
10030 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 20     rc = 1;.     
10040 20 20 20 20 20 67 6f 74 6f 20 6d 75 6c 74 69 5f       goto multi_
10050 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20  select_end;.    
10060 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 61 64      }.        ad
10070 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  dr = sqlite3Vdbe
10080 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4f 70 65  AddOp2(v, OP_Ope
10090 6e 45 70 68 65 6d 65 72 61 6c 2c 20 75 6e 69 6f  nEphemeral, unio
100a0 6e 54 61 62 2c 20 30 29 3b 0a 20 20 20 20 20 20  nTab, 0);.      
100b0 20 20 69 66 28 20 70 72 69 6f 72 4f 70 3d 3d 53    if( priorOp==S
100c0 52 54 5f 54 61 62 6c 65 20 29 7b 0a 20 20 20 20  RT_Table ){.    
100d0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6e 53        assert( nS
100e0 65 74 50 32 3c 73 69 7a 65 6f 66 28 61 53 65 74  etP2<sizeof(aSet
100f0 50 32 29 2f 73 69 7a 65 6f 66 28 61 53 65 74 50  P2)/sizeof(aSetP
10100 32 5b 30 5d 29 20 29 3b 0a 20 20 20 20 20 20 20  2[0]) );.       
10110 20 20 20 61 53 65 74 50 32 5b 6e 53 65 74 50 32     aSetP2[nSetP2
10120 2b 2b 5d 20 3d 20 61 64 64 72 3b 0a 20 20 20 20  ++] = addr;.    
10130 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
10140 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e       assert( p->
10150 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b 30 5d 20  addrOpenEphm[0] 
10160 3d 3d 20 2d 31 20 29 3b 0a 20 20 20 20 20 20 20  == -1 );.       
10170 20 20 20 70 2d 3e 61 64 64 72 4f 70 65 6e 45 70     p->addrOpenEp
10180 68 6d 5b 30 5d 20 3d 20 61 64 64 72 3b 0a 20 20  hm[0] = addr;.  
10190 20 20 20 20 20 20 20 20 70 2d 3e 70 52 69 67 68          p->pRigh
101a0 74 6d 6f 73 74 2d 3e 75 73 65 73 45 70 68 6d 20  tmost->usesEphm 
101b0 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  = 1;.        }. 
101c0 20 20 20 20 20 20 20 63 72 65 61 74 65 53 6f 72         createSor
101d0 74 69 6e 67 49 6e 64 65 78 28 70 50 61 72 73 65  tingIndex(pParse
101e0 2c 20 70 2c 20 70 4f 72 64 65 72 42 79 29 3b 0a  , p, pOrderBy);.
101f0 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
10200 70 2d 3e 70 45 4c 69 73 74 20 29 3b 0a 20 20 20  p->pEList );.   
10210 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 43     }..      /* C
10220 6f 64 65 20 74 68 65 20 53 45 4c 45 43 54 20 73  ode the SELECT s
10230 74 61 74 65 6d 65 6e 74 73 20 74 6f 20 6f 75 72  tatements to our
10240 20 6c 65 66 74 0a 20 20 20 20 20 20 2a 2f 0a 20   left.      */. 
10250 20 20 20 20 20 61 73 73 65 72 74 28 20 21 70 50       assert( !pP
10260 72 69 6f 72 2d 3e 70 4f 72 64 65 72 42 79 20 29  rior->pOrderBy )
10270 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 53  ;.      sqlite3S
10280 65 6c 65 63 74 44 65 73 74 49 6e 69 74 28 26 75  electDestInit(&u
10290 6e 69 6f 6e 64 65 73 74 2c 20 70 72 69 6f 72 4f  niondest, priorO
102a0 70 2c 20 75 6e 69 6f 6e 54 61 62 29 3b 0a 20 20  p, unionTab);.  
102b0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
102c0 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70  Select(pParse, p
102d0 50 72 69 6f 72 2c 20 26 75 6e 69 6f 6e 64 65 73  Prior, &uniondes
102e0 74 2c 20 30 2c 20 30 2c 20 30 2c 20 61 66 66 29  t, 0, 0, 0, aff)
102f0 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 20 29  ;.      if( rc )
10300 7b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 6d  {.        goto m
10310 75 6c 74 69 5f 73 65 6c 65 63 74 5f 65 6e 64 3b  ulti_select_end;
10320 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20  .      }..      
10330 2f 2a 20 43 6f 64 65 20 74 68 65 20 63 75 72 72  /* Code the curr
10340 65 6e 74 20 53 45 4c 45 43 54 20 73 74 61 74 65  ent SELECT state
10350 6d 65 6e 74 0a 20 20 20 20 20 20 2a 2f 0a 20 20  ment.      */.  
10360 20 20 20 20 73 77 69 74 63 68 28 20 70 2d 3e 6f      switch( p->o
10370 70 20 29 7b 0a 20 20 20 20 20 20 20 20 20 63 61  p ){.         ca
10380 73 65 20 54 4b 5f 45 58 43 45 50 54 3a 20 20 6f  se TK_EXCEPT:  o
10390 70 20 3d 20 53 52 54 5f 45 78 63 65 70 74 3b 20  p = SRT_Except; 
103a0 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20    break;.       
103b0 20 20 63 61 73 65 20 54 4b 5f 55 4e 49 4f 4e 3a    case TK_UNION:
103c0 20 20 20 6f 70 20 3d 20 53 52 54 5f 55 6e 69 6f     op = SRT_Unio
103d0 6e 3b 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20  n;    break;.   
103e0 20 20 20 20 20 20 63 61 73 65 20 54 4b 5f 41 4c        case TK_AL
103f0 4c 3a 20 20 20 20 20 6f 70 20 3d 20 53 52 54 5f  L:     op = SRT_
10400 54 61 62 6c 65 3b 20 20 20 20 62 72 65 61 6b 3b  Table;    break;
10410 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70  .      }.      p
10420 2d 3e 70 50 72 69 6f 72 20 3d 20 30 3b 0a 20 20  ->pPrior = 0;.  
10430 20 20 20 20 70 2d 3e 70 4f 72 64 65 72 42 79 20      p->pOrderBy 
10440 3d 20 30 3b 0a 20 20 20 20 20 20 70 2d 3e 64 69  = 0;.      p->di
10450 73 61 6c 6c 6f 77 4f 72 64 65 72 42 79 20 3d 20  sallowOrderBy = 
10460 70 4f 72 64 65 72 42 79 21 3d 30 3b 0a 20 20 20  pOrderBy!=0;.   
10470 20 20 20 70 4c 69 6d 69 74 20 3d 20 70 2d 3e 70     pLimit = p->p
10480 4c 69 6d 69 74 3b 0a 20 20 20 20 20 20 70 2d 3e  Limit;.      p->
10490 70 4c 69 6d 69 74 20 3d 20 30 3b 0a 20 20 20 20  pLimit = 0;.    
104a0 20 20 70 4f 66 66 73 65 74 20 3d 20 70 2d 3e 70    pOffset = p->p
104b0 4f 66 66 73 65 74 3b 0a 20 20 20 20 20 20 70 2d  Offset;.      p-
104c0 3e 70 4f 66 66 73 65 74 20 3d 20 30 3b 0a 20 20  >pOffset = 0;.  
104d0 20 20 20 20 75 6e 69 6f 6e 64 65 73 74 2e 65 44      uniondest.eD
104e0 65 73 74 20 3d 20 6f 70 3b 0a 20 20 20 20 20 20  est = op;.      
104f0 72 63 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65  rc = sqlite3Sele
10500 63 74 28 70 50 61 72 73 65 2c 20 70 2c 20 26 75  ct(pParse, p, &u
10510 6e 69 6f 6e 64 65 73 74 2c 20 30 2c 20 30 2c 20  niondest, 0, 0, 
10520 30 2c 20 61 66 66 29 3b 0a 20 20 20 20 20 20 2f  0, aff);.      /
10530 2a 20 51 75 65 72 79 20 66 6c 61 74 74 65 6e 69  * Query flatteni
10540 6e 67 20 69 6e 20 73 71 6c 69 74 65 33 53 65 6c  ng in sqlite3Sel
10550 65 63 74 28 29 20 6d 69 67 68 74 20 72 65 66 69  ect() might refi
10560 6c 6c 20 70 2d 3e 70 4f 72 64 65 72 42 79 2e 0a  ll p->pOrderBy..
10570 20 20 20 20 20 20 2a 2a 20 42 65 20 73 75 72 65        ** Be sure
10580 20 74 6f 20 64 65 6c 65 74 65 20 70 2d 3e 70 4f   to delete p->pO
10590 72 64 65 72 42 79 2c 20 74 68 65 72 65 66 6f 72  rderBy, therefor
105a0 65 2c 20 74 6f 20 61 76 6f 69 64 20 61 20 6d 65  e, to avoid a me
105b0 6d 6f 72 79 20 6c 65 61 6b 2e 20 2a 2f 0a 20 20  mory leak. */.  
105c0 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c      sqlite3ExprL
105d0 69 73 74 44 65 6c 65 74 65 28 70 2d 3e 70 4f 72  istDelete(p->pOr
105e0 64 65 72 42 79 29 3b 0a 20 20 20 20 20 20 70 2d  derBy);.      p-
105f0 3e 70 50 72 69 6f 72 20 3d 20 70 50 72 69 6f 72  >pPrior = pPrior
10600 3b 0a 20 20 20 20 20 20 70 2d 3e 70 4f 72 64 65  ;.      p->pOrde
10610 72 42 79 20 3d 20 70 4f 72 64 65 72 42 79 3b 0a  rBy = pOrderBy;.
10620 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
10630 72 44 65 6c 65 74 65 28 70 2d 3e 70 4c 69 6d 69  rDelete(p->pLimi
10640 74 29 3b 0a 20 20 20 20 20 20 70 2d 3e 70 4c 69  t);.      p->pLi
10650 6d 69 74 20 3d 20 70 4c 69 6d 69 74 3b 0a 20 20  mit = pLimit;.  
10660 20 20 20 20 70 2d 3e 70 4f 66 66 73 65 74 20 3d      p->pOffset =
10670 20 70 4f 66 66 73 65 74 3b 0a 20 20 20 20 20 20   pOffset;.      
10680 70 2d 3e 69 4c 69 6d 69 74 20 3d 20 2d 31 3b 0a  p->iLimit = -1;.
10690 20 20 20 20 20 20 70 2d 3e 69 4f 66 66 73 65 74        p->iOffset
106a0 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 69 66 28   = -1;.      if(
106b0 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20 67   rc ){.        g
106c0 6f 74 6f 20 6d 75 6c 74 69 5f 73 65 6c 65 63 74  oto multi_select
106d0 5f 65 6e 64 3b 0a 20 20 20 20 20 20 7d 0a 0a 0a  _end;.      }...
106e0 20 20 20 20 20 20 2f 2a 20 43 6f 6e 76 65 72 74        /* Convert
106f0 20 74 68 65 20 64 61 74 61 20 69 6e 20 74 68 65   the data in the
10700 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65   temporary table
10710 20 69 6e 74 6f 20 77 68 61 74 65 76 65 72 20 66   into whatever f
10720 6f 72 6d 0a 20 20 20 20 20 20 2a 2a 20 69 74 20  orm.      ** it 
10730 69 73 20 74 68 61 74 20 77 65 20 63 75 72 72 65  is that we curre
10740 6e 74 6c 79 20 6e 65 65 64 2e 0a 20 20 20 20 20  ntly need..     
10750 20 2a 2f 20 20 20 20 20 20 0a 20 20 20 20 20 20   */      .      
10760 69 66 28 20 64 65 73 74 2e 65 44 65 73 74 21 3d  if( dest.eDest!=
10770 70 72 69 6f 72 4f 70 20 7c 7c 20 75 6e 69 6f 6e  priorOp || union
10780 54 61 62 21 3d 64 65 73 74 2e 69 50 61 72 6d 20  Tab!=dest.iParm 
10790 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69  ){.        int i
107a0 43 6f 6e 74 2c 20 69 42 72 65 61 6b 2c 20 69 53  Cont, iBreak, iS
107b0 74 61 72 74 3b 0a 20 20 20 20 20 20 20 20 61 73  tart;.        as
107c0 73 65 72 74 28 20 70 2d 3e 70 45 4c 69 73 74 20  sert( p->pEList 
107d0 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 64  );.        if( d
107e0 65 73 74 2e 65 44 65 73 74 3d 3d 53 52 54 5f 43  est.eDest==SRT_C
107f0 61 6c 6c 62 61 63 6b 20 29 7b 0a 20 20 20 20 20  allback ){.     
10800 20 20 20 20 20 53 65 6c 65 63 74 20 2a 70 46 69       Select *pFi
10810 72 73 74 20 3d 20 70 3b 0a 20 20 20 20 20 20 20  rst = p;.       
10820 20 20 20 77 68 69 6c 65 28 20 70 46 69 72 73 74     while( pFirst
10830 2d 3e 70 50 72 69 6f 72 20 29 20 70 46 69 72 73  ->pPrior ) pFirs
10840 74 20 3d 20 70 46 69 72 73 74 2d 3e 70 50 72 69  t = pFirst->pPri
10850 6f 72 3b 0a 20 20 20 20 20 20 20 20 20 20 67 65  or;.          ge
10860 6e 65 72 61 74 65 43 6f 6c 75 6d 6e 4e 61 6d 65  nerateColumnName
10870 73 28 70 50 61 72 73 65 2c 20 30 2c 20 70 46 69  s(pParse, 0, pFi
10880 72 73 74 2d 3e 70 45 4c 69 73 74 29 3b 0a 20 20  rst->pEList);.  
10890 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
108a0 69 42 72 65 61 6b 20 3d 20 73 71 6c 69 74 65 33  iBreak = sqlite3
108b0 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29  VdbeMakeLabel(v)
108c0 3b 0a 20 20 20 20 20 20 20 20 69 43 6f 6e 74 20  ;.        iCont 
108d0 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b  = sqlite3VdbeMak
108e0 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 20  eLabel(v);.     
108f0 20 20 20 63 6f 6d 70 75 74 65 4c 69 6d 69 74 52     computeLimitR
10900 65 67 69 73 74 65 72 73 28 70 50 61 72 73 65 2c  egisters(pParse,
10910 20 70 2c 20 69 42 72 65 61 6b 29 3b 0a 20 20 20   p, iBreak);.   
10920 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
10930 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52 65 77  AddOp2(v, OP_Rew
10940 69 6e 64 2c 20 75 6e 69 6f 6e 54 61 62 2c 20 69  ind, unionTab, i
10950 42 72 65 61 6b 29 3b 0a 20 20 20 20 20 20 20 20  Break);.        
10960 69 53 74 61 72 74 20 3d 20 73 71 6c 69 74 65 33  iStart = sqlite3
10970 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28  VdbeCurrentAddr(
10980 76 29 3b 0a 20 20 20 20 20 20 20 20 73 65 6c 65  v);.        sele
10990 63 74 49 6e 6e 65 72 4c 6f 6f 70 28 70 50 61 72  ctInnerLoop(pPar
109a0 73 65 2c 20 70 2c 20 70 2d 3e 70 45 4c 69 73 74  se, p, p->pEList
109b0 2c 20 75 6e 69 6f 6e 54 61 62 2c 20 70 2d 3e 70  , unionTab, p->p
109c0 45 4c 69 73 74 2d 3e 6e 45 78 70 72 2c 0a 20 20  EList->nExpr,.  
109d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
109e0 20 20 20 20 20 20 70 4f 72 64 65 72 42 79 2c 20        pOrderBy, 
109f0 2d 31 2c 20 26 64 65 73 74 2c 20 69 43 6f 6e 74  -1, &dest, iCont
10a00 2c 20 69 42 72 65 61 6b 2c 20 30 29 3b 0a 20 20  , iBreak, 0);.  
10a10 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
10a20 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c  eResolveLabel(v,
10a30 20 69 43 6f 6e 74 29 3b 0a 20 20 20 20 20 20 20   iCont);.       
10a40 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
10a50 70 32 28 76 2c 20 4f 50 5f 4e 65 78 74 2c 20 75  p2(v, OP_Next, u
10a60 6e 69 6f 6e 54 61 62 2c 20 69 53 74 61 72 74 29  nionTab, iStart)
10a70 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
10a80 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65  3VdbeResolveLabe
10a90 6c 28 76 2c 20 69 42 72 65 61 6b 29 3b 0a 20 20  l(v, iBreak);.  
10aa0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
10ab0 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 43 6c  eAddOp2(v, OP_Cl
10ac0 6f 73 65 2c 20 75 6e 69 6f 6e 54 61 62 2c 20 30  ose, unionTab, 0
10ad0 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
10ae0 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
10af0 20 20 63 61 73 65 20 54 4b 5f 49 4e 54 45 52 53    case TK_INTERS
10b00 45 43 54 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74  ECT: {.      int
10b10 20 74 61 62 31 2c 20 74 61 62 32 3b 0a 20 20 20   tab1, tab2;.   
10b20 20 20 20 69 6e 74 20 69 43 6f 6e 74 2c 20 69 42     int iCont, iB
10b30 72 65 61 6b 2c 20 69 53 74 61 72 74 3b 0a 20 20  reak, iStart;.  
10b40 20 20 20 20 45 78 70 72 20 2a 70 4c 69 6d 69 74      Expr *pLimit
10b50 2c 20 2a 70 4f 66 66 73 65 74 3b 0a 20 20 20 20  , *pOffset;.    
10b60 20 20 69 6e 74 20 61 64 64 72 3b 0a 20 20 20 20    int addr;.    
10b70 20 20 53 65 6c 65 63 74 44 65 73 74 20 69 6e 74    SelectDest int
10b80 65 72 73 65 63 74 64 65 73 74 3b 0a 20 20 20 20  ersectdest;.    
10b90 20 20 69 6e 74 20 72 31 3b 0a 0a 20 20 20 20 20    int r1;..     
10ba0 20 2f 2a 20 49 4e 54 45 52 53 45 43 54 20 69 73   /* INTERSECT is
10bb0 20 64 69 66 66 65 72 65 6e 74 20 66 72 6f 6d 20   different from 
10bc0 74 68 65 20 6f 74 68 65 72 73 20 73 69 6e 63 65  the others since
10bd0 20 69 74 20 72 65 71 75 69 72 65 73 0a 20 20 20   it requires.   
10be0 20 20 20 2a 2a 20 74 77 6f 20 74 65 6d 70 6f 72     ** two tempor
10bf0 61 72 79 20 74 61 62 6c 65 73 2e 20 20 48 65 6e  ary tables.  Hen
10c00 63 65 20 69 74 20 68 61 73 20 69 74 73 20 6f 77  ce it has its ow
10c10 6e 20 63 61 73 65 2e 20 20 42 65 67 69 6e 0a 20  n case.  Begin. 
10c20 20 20 20 20 20 2a 2a 20 62 79 20 61 6c 6c 6f 63       ** by alloc
10c30 61 74 69 6e 67 20 74 68 65 20 74 61 62 6c 65 73  ating the tables
10c40 20 77 65 20 77 69 6c 6c 20 6e 65 65 64 2e 0a 20   we will need.. 
10c50 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 74 61       */.      ta
10c60 62 31 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61  b1 = pParse->nTa
10c70 62 2b 2b 3b 0a 20 20 20 20 20 20 74 61 62 32 20  b++;.      tab2 
10c80 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b  = pParse->nTab++
10c90 3b 0a 20 20 20 20 20 20 69 66 28 20 70 72 6f 63  ;.      if( proc
10ca0 65 73 73 43 6f 6d 70 6f 75 6e 64 4f 72 64 65 72  essCompoundOrder
10cb0 42 79 28 70 50 61 72 73 65 2c 20 70 2c 20 74 61  By(pParse, p, ta
10cc0 62 31 29 20 29 7b 0a 20 20 20 20 20 20 20 20 72  b1) ){.        r
10cd0 63 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 67  c = 1;.        g
10ce0 6f 74 6f 20 6d 75 6c 74 69 5f 73 65 6c 65 63 74  oto multi_select
10cf0 5f 65 6e 64 3b 0a 20 20 20 20 20 20 7d 0a 20 20  _end;.      }.  
10d00 20 20 20 20 63 72 65 61 74 65 53 6f 72 74 69 6e      createSortin
10d10 67 49 6e 64 65 78 28 70 50 61 72 73 65 2c 20 70  gIndex(pParse, p
10d20 2c 20 70 4f 72 64 65 72 42 79 29 3b 0a 0a 20 20  , pOrderBy);..  
10d30 20 20 20 20 61 64 64 72 20 3d 20 73 71 6c 69 74      addr = sqlit
10d40 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
10d50 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c  OP_OpenEphemeral
10d60 2c 20 74 61 62 31 2c 20 30 29 3b 0a 20 20 20 20  , tab1, 0);.    
10d70 20 20 61 73 73 65 72 74 28 20 70 2d 3e 61 64 64    assert( p->add
10d80 72 4f 70 65 6e 45 70 68 6d 5b 30 5d 20 3d 3d 20  rOpenEphm[0] == 
10d90 2d 31 20 29 3b 0a 20 20 20 20 20 20 70 2d 3e 61  -1 );.      p->a
10da0 64 64 72 4f 70 65 6e 45 70 68 6d 5b 30 5d 20 3d  ddrOpenEphm[0] =
10db0 20 61 64 64 72 3b 0a 20 20 20 20 20 20 70 2d 3e   addr;.      p->
10dc0 70 52 69 67 68 74 6d 6f 73 74 2d 3e 75 73 65 73  pRightmost->uses
10dd0 45 70 68 6d 20 3d 20 31 3b 0a 20 20 20 20 20 20  Ephm = 1;.      
10de0 61 73 73 65 72 74 28 20 70 2d 3e 70 45 4c 69 73  assert( p->pELis
10df0 74 20 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 43  t );..      /* C
10e00 6f 64 65 20 74 68 65 20 53 45 4c 45 43 54 73 20  ode the SELECTs 
10e10 74 6f 20 6f 75 72 20 6c 65 66 74 20 69 6e 74 6f  to our left into
10e20 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65   temporary table
10e30 20 22 74 61 62 31 22 2e 0a 20 20 20 20 20 20 2a   "tab1"..      *
10e40 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 53  /.      sqlite3S
10e50 65 6c 65 63 74 44 65 73 74 49 6e 69 74 28 26 69  electDestInit(&i
10e60 6e 74 65 72 73 65 63 74 64 65 73 74 2c 20 53 52  ntersectdest, SR
10e70 54 5f 55 6e 69 6f 6e 2c 20 74 61 62 31 29 3b 0a  T_Union, tab1);.
10e80 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
10e90 65 33 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c  e3Select(pParse,
10ea0 20 70 50 72 69 6f 72 2c 20 26 69 6e 74 65 72 73   pPrior, &inters
10eb0 65 63 74 64 65 73 74 2c 20 30 2c 20 30 2c 20 30  ectdest, 0, 0, 0
10ec0 2c 20 61 66 66 29 3b 0a 20 20 20 20 20 20 69 66  , aff);.      if
10ed0 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20  ( rc ){.        
10ee0 67 6f 74 6f 20 6d 75 6c 74 69 5f 73 65 6c 65 63  goto multi_selec
10ef0 74 5f 65 6e 64 3b 0a 20 20 20 20 20 20 7d 0a 0a  t_end;.      }..
10f00 20 20 20 20 20 20 2f 2a 20 43 6f 64 65 20 74 68        /* Code th
10f10 65 20 63 75 72 72 65 6e 74 20 53 45 4c 45 43 54  e current SELECT
10f20 20 69 6e 74 6f 20 74 65 6d 70 6f 72 61 72 79 20   into temporary 
10f30 74 61 62 6c 65 20 22 74 61 62 32 22 0a 20 20 20  table "tab2".   
10f40 20 20 20 2a 2f 0a 20 20 20 20 20 20 61 64 64 72     */.      addr
10f50 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   = sqlite3VdbeAd
10f60 64 4f 70 32 28 76 2c 20 4f 50 5f 4f 70 65 6e 45  dOp2(v, OP_OpenE
10f70 70 68 65 6d 65 72 61 6c 2c 20 74 61 62 32 2c 20  phemeral, tab2, 
10f80 30 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  0);.      assert
10f90 28 20 70 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68  ( p->addrOpenEph
10fa0 6d 5b 31 5d 20 3d 3d 20 2d 31 20 29 3b 0a 20 20  m[1] == -1 );.  
10fb0 20 20 20 20 70 2d 3e 61 64 64 72 4f 70 65 6e 45      p->addrOpenE
10fc0 70 68 6d 5b 31 5d 20 3d 20 61 64 64 72 3b 0a 20  phm[1] = addr;. 
10fd0 20 20 20 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d       p->pPrior =
10fe0 20 30 3b 0a 20 20 20 20 20 20 70 4c 69 6d 69 74   0;.      pLimit
10ff0 20 3d 20 70 2d 3e 70 4c 69 6d 69 74 3b 0a 20 20   = p->pLimit;.  
11000 20 20 20 20 70 2d 3e 70 4c 69 6d 69 74 20 3d 20      p->pLimit = 
11010 30 3b 0a 20 20 20 20 20 20 70 4f 66 66 73 65 74  0;.      pOffset
11020 20 3d 20 70 2d 3e 70 4f 66 66 73 65 74 3b 0a 20   = p->pOffset;. 
11030 20 20 20 20 20 70 2d 3e 70 4f 66 66 73 65 74 20       p->pOffset 
11040 3d 20 30 3b 0a 20 20 20 20 20 20 69 6e 74 65 72  = 0;.      inter
11050 73 65 63 74 64 65 73 74 2e 69 50 61 72 6d 20 3d  sectdest.iParm =
11060 20 74 61 62 32 3b 0a 20 20 20 20 20 20 72 63 20   tab2;.      rc 
11070 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28  = sqlite3Select(
11080 70 50 61 72 73 65 2c 20 70 2c 20 26 69 6e 74 65  pParse, p, &inte
11090 72 73 65 63 74 64 65 73 74 2c 20 30 2c 20 30 2c  rsectdest, 0, 0,
110a0 20 30 2c 20 61 66 66 29 3b 0a 20 20 20 20 20 20   0, aff);.      
110b0 70 2d 3e 70 50 72 69 6f 72 20 3d 20 70 50 72 69  p->pPrior = pPri
110c0 6f 72 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  or;.      sqlite
110d0 33 45 78 70 72 44 65 6c 65 74 65 28 70 2d 3e 70  3ExprDelete(p->p
110e0 4c 69 6d 69 74 29 3b 0a 20 20 20 20 20 20 70 2d  Limit);.      p-
110f0 3e 70 4c 69 6d 69 74 20 3d 20 70 4c 69 6d 69 74  >pLimit = pLimit
11100 3b 0a 20 20 20 20 20 20 70 2d 3e 70 4f 66 66 73  ;.      p->pOffs
11110 65 74 20 3d 20 70 4f 66 66 73 65 74 3b 0a 20 20  et = pOffset;.  
11120 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20      if( rc ){.  
11130 20 20 20 20 20 20 67 6f 74 6f 20 6d 75 6c 74 69        goto multi
11140 5f 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20  _select_end;.   
11150 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 47     }..      /* G
11160 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20  enerate code to 
11170 74 61 6b 65 20 74 68 65 20 69 6e 74 65 72 73 65  take the interse
11180 63 74 69 6f 6e 20 6f 66 20 74 68 65 20 74 77 6f  ction of the two
11190 20 74 65 6d 70 6f 72 61 72 79 0a 20 20 20 20 20   temporary.     
111a0 20 2a 2a 20 74 61 62 6c 65 73 2e 0a 20 20 20 20   ** tables..    
111b0 20 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72    */.      asser
111c0 74 28 20 70 2d 3e 70 45 4c 69 73 74 20 29 3b 0a  t( p->pEList );.
111d0 20 20 20 20 20 20 69 66 28 20 64 65 73 74 2e 65        if( dest.e
111e0 44 65 73 74 3d 3d 53 52 54 5f 43 61 6c 6c 62 61  Dest==SRT_Callba
111f0 63 6b 20 29 7b 0a 20 20 20 20 20 20 20 20 53 65  ck ){.        Se
11200 6c 65 63 74 20 2a 70 46 69 72 73 74 20 3d 20 70  lect *pFirst = p
11210 3b 0a 20 20 20 20 20 20 20 20 77 68 69 6c 65 28  ;.        while(
11220 20 70 46 69 72 73 74 2d 3e 70 50 72 69 6f 72 20   pFirst->pPrior 
11230 29 20 70 46 69 72 73 74 20 3d 20 70 46 69 72 73  ) pFirst = pFirs
11240 74 2d 3e 70 50 72 69 6f 72 3b 0a 20 20 20 20 20  t->pPrior;.     
11250 20 20 20 67 65 6e 65 72 61 74 65 43 6f 6c 75 6d     generateColum
11260 6e 4e 61 6d 65 73 28 70 50 61 72 73 65 2c 20 30  nNames(pParse, 0
11270 2c 20 70 46 69 72 73 74 2d 3e 70 45 4c 69 73 74  , pFirst->pEList
11280 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
11290 20 69 42 72 65 61 6b 20 3d 20 73 71 6c 69 74 65   iBreak = sqlite
112a0 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76  3VdbeMakeLabel(v
112b0 29 3b 0a 20 20 20 20 20 20 69 43 6f 6e 74 20 3d  );.      iCont =
112c0 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65   sqlite3VdbeMake
112d0 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 20 20  Label(v);.      
112e0 63 6f 6d 70 75 74 65 4c 69 6d 69 74 52 65 67 69  computeLimitRegi
112f0 73 74 65 72 73 28 70 50 61 72 73 65 2c 20 70 2c  sters(pParse, p,
11300 20 69 42 72 65 61 6b 29 3b 0a 20 20 20 20 20 20   iBreak);.      
11310 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
11320 32 28 76 2c 20 4f 50 5f 52 65 77 69 6e 64 2c 20  2(v, OP_Rewind, 
11330 74 61 62 31 2c 20 69 42 72 65 61 6b 29 3b 0a 20  tab1, iBreak);. 
11340 20 20 20 20 20 72 31 20 3d 20 73 71 6c 69 74 65       r1 = sqlite
11350 33 47 65 74 54 65 6d 70 52 65 67 28 70 50 61 72  3GetTempReg(pPar
11360 73 65 29 3b 0a 20 20 20 20 20 20 69 53 74 61 72  se);.      iStar
11370 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41  t = sqlite3VdbeA
11380 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52 6f 77 4b  ddOp2(v, OP_RowK
11390 65 79 2c 20 74 61 62 31 2c 20 72 31 29 3b 0a 20  ey, tab1, r1);. 
113a0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
113b0 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4e 6f 74  AddOp3(v, OP_Not
113c0 46 6f 75 6e 64 2c 20 74 61 62 32 2c 20 69 43 6f  Found, tab2, iCo
113d0 6e 74 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 73  nt, r1);.      s
113e0 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d  qlite3ReleaseTem
113f0 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 31 29  pReg(pParse, r1)
11400 3b 0a 20 20 20 20 20 20 73 65 6c 65 63 74 49 6e  ;.      selectIn
11410 6e 65 72 4c 6f 6f 70 28 70 50 61 72 73 65 2c 20  nerLoop(pParse, 
11420 70 2c 20 70 2d 3e 70 45 4c 69 73 74 2c 20 74 61  p, p->pEList, ta
11430 62 31 2c 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e  b1, p->pEList->n
11440 45 78 70 72 2c 0a 20 20 20 20 20 20 20 20 20 20  Expr,.          
11450 20 20 20 20 20 20 20 20 20 20 20 20 70 4f 72 64              pOrd
11460 65 72 42 79 2c 20 2d 31 2c 20 26 64 65 73 74 2c  erBy, -1, &dest,
11470 20 69 43 6f 6e 74 2c 20 69 42 72 65 61 6b 2c 20   iCont, iBreak, 
11480 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  0);.      sqlite
11490 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65  3VdbeResolveLabe
114a0 6c 28 76 2c 20 69 43 6f 6e 74 29 3b 0a 20 20 20  l(v, iCont);.   
114b0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
114c0 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 65 78 74 2c  dOp2(v, OP_Next,
114d0 20 74 61 62 31 2c 20 69 53 74 61 72 74 29 3b 0a   tab1, iStart);.
114e0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
114f0 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c  eResolveLabel(v,
11500 20 69 42 72 65 61 6b 29 3b 0a 20 20 20 20 20 20   iBreak);.      
11510 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
11520 32 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 74  2(v, OP_Close, t
11530 61 62 32 2c 20 30 29 3b 0a 20 20 20 20 20 20 73  ab2, 0);.      s
11540 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
11550 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 74 61  (v, OP_Close, ta
11560 62 31 2c 20 30 29 3b 0a 20 20 20 20 20 20 62 72  b1, 0);.      br
11570 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  eak;.    }.  }..
11580 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 61    /* Make sure a
11590 6c 6c 20 53 45 4c 45 43 54 73 20 69 6e 20 74 68  ll SELECTs in th
115a0 65 20 73 74 61 74 65 6d 65 6e 74 20 68 61 76 65  e statement have
115b0 20 74 68 65 20 73 61 6d 65 20 6e 75 6d 62 65 72   the same number
115c0 20 6f 66 20 65 6c 65 6d 65 6e 74 73 0a 20 20 2a   of elements.  *
115d0 2a 20 69 6e 20 74 68 65 69 72 20 72 65 73 75 6c  * in their resul
115e0 74 20 73 65 74 73 2e 0a 20 20 2a 2f 0a 20 20 61  t sets..  */.  a
115f0 73 73 65 72 74 28 20 70 2d 3e 70 45 4c 69 73 74  ssert( p->pEList
11600 20 26 26 20 70 50 72 69 6f 72 2d 3e 70 45 4c 69   && pPrior->pELi
11610 73 74 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e 70  st );.  if( p->p
11620 45 4c 69 73 74 2d 3e 6e 45 78 70 72 21 3d 70 50  EList->nExpr!=pP
11630 72 69 6f 72 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45  rior->pEList->nE
11640 78 70 72 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  xpr ){.    sqlit
11650 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
11660 65 2c 20 22 53 45 4c 45 43 54 73 20 74 6f 20 74  e, "SELECTs to t
11670 68 65 20 6c 65 66 74 20 61 6e 64 20 72 69 67 68  he left and righ
11680 74 20 6f 66 20 25 73 22 0a 20 20 20 20 20 20 22  t of %s".      "
11690 20 64 6f 20 6e 6f 74 20 68 61 76 65 20 74 68 65   do not have the
116a0 20 73 61 6d 65 20 6e 75 6d 62 65 72 20 6f 66 20   same number of 
116b0 72 65 73 75 6c 74 20 63 6f 6c 75 6d 6e 73 22 2c  result columns",
116c0 20 73 65 6c 65 63 74 4f 70 4e 61 6d 65 28 70 2d   selectOpName(p-
116d0 3e 6f 70 29 29 3b 0a 20 20 20 20 72 63 20 3d 20  >op));.    rc = 
116e0 31 3b 0a 20 20 20 20 67 6f 74 6f 20 6d 75 6c 74  1;.    goto mult
116f0 69 5f 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20  i_select_end;.  
11700 7d 0a 0a 20 20 2f 2a 20 53 65 74 20 74 68 65 20  }..  /* Set the 
11710 6e 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e  number of column
11720 73 20 69 6e 20 74 65 6d 70 6f 72 61 72 79 20 74  s in temporary t
11730 61 62 6c 65 73 0a 20 20 2a 2f 0a 20 20 6e 43 6f  ables.  */.  nCo
11740 6c 20 3d 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e  l = p->pEList->n
11750 45 78 70 72 3b 0a 20 20 77 68 69 6c 65 28 20 6e  Expr;.  while( n
11760 53 65 74 50 32 20 29 7b 0a 20 20 20 20 73 71 6c  SetP2 ){.    sql
11770 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 32  ite3VdbeChangeP2
11780 28 76 2c 20 61 53 65 74 50 32 5b 2d 2d 6e 53 65  (v, aSetP2[--nSe
11790 74 50 32 5d 2c 20 6e 43 6f 6c 29 3b 0a 20 20 7d  tP2], nCol);.  }
117a0 0a 0a 20 20 2f 2a 20 43 6f 6d 70 75 74 65 20 63  ..  /* Compute c
117b0 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63  ollating sequenc
117c0 65 73 20 75 73 65 64 20 62 79 20 65 69 74 68 65  es used by eithe
117d0 72 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 63  r the ORDER BY c
117e0 6c 61 75 73 65 20 6f 72 0a 20 20 2a 2a 20 62 79  lause or.  ** by
117f0 20 61 6e 79 20 74 65 6d 70 6f 72 61 72 79 20 74   any temporary t
11800 61 62 6c 65 73 20 6e 65 65 64 65 64 20 74 6f 20  ables needed to 
11810 69 6d 70 6c 65 6d 65 6e 74 20 74 68 65 20 63 6f  implement the co
11820 6d 70 6f 75 6e 64 20 73 65 6c 65 63 74 2e 0a 20  mpound select.. 
11830 20 2a 2a 20 41 74 74 61 63 68 20 74 68 65 20 4b   ** Attach the K
11840 65 79 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65  eyInfo structure
11850 20 74 6f 20 61 6c 6c 20 74 65 6d 70 6f 72 61 72   to all temporar
11860 79 20 74 61 62 6c 65 73 2e 20 20 49 6e 76 6f 6b  y tables.  Invok
11870 65 20 74 68 65 0a 20 20 2a 2a 20 4f 52 44 45 52  e the.  ** ORDER
11880 20 42 59 20 70 72 6f 63 65 73 73 69 6e 67 20 69   BY processing i
11890 66 20 74 68 65 72 65 20 69 73 20 61 6e 20 4f 52  f there is an OR
118a0 44 45 52 20 42 59 20 63 6c 61 75 73 65 2e 0a 20  DER BY clause.. 
118b0 20 2a 2a 0a 20 20 2a 2a 20 54 68 69 73 20 73 65   **.  ** This se
118c0 63 74 69 6f 6e 20 69 73 20 72 75 6e 20 62 79 20  ction is run by 
118d0 74 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 20 53  the right-most S
118e0 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20  ELECT statement 
118f0 6f 6e 6c 79 2e 0a 20 20 2a 2a 20 53 45 4c 45 43  only..  ** SELEC
11900 54 20 73 74 61 74 65 6d 65 6e 74 73 20 74 6f 20  T statements to 
11910 74 68 65 20 6c 65 66 74 20 61 6c 77 61 79 73 20  the left always 
11920 73 6b 69 70 20 74 68 69 73 20 70 61 72 74 2e 20  skip this part. 
11930 20 54 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 0a   The right-most.
11940 20 20 2a 2a 20 53 45 4c 45 43 54 20 6d 69 67 68    ** SELECT migh
11950 74 20 61 6c 73 6f 20 73 6b 69 70 20 74 68 69 73  t also skip this
11960 20 70 61 72 74 20 69 66 20 69 74 20 68 61 73 20   part if it has 
11970 6e 6f 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75  no ORDER BY clau
11980 73 65 20 61 6e 64 0a 20 20 2a 2a 20 6e 6f 20 74  se and.  ** no t
11990 65 6d 70 20 74 61 62 6c 65 73 20 61 72 65 20 72  emp tables are r
119a0 65 71 75 69 72 65 64 2e 0a 20 20 2a 2f 0a 20 20  equired..  */.  
119b0 69 66 28 20 70 4f 72 64 65 72 42 79 20 7c 7c 20  if( pOrderBy || 
119c0 70 2d 3e 75 73 65 73 45 70 68 6d 20 29 7b 0a 20  p->usesEphm ){. 
119d0 20 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20     int i;       
119e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
119f0 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72   /* Loop counter
11a00 20 2a 2f 0a 20 20 20 20 4b 65 79 49 6e 66 6f 20   */.    KeyInfo 
11a10 2a 70 4b 65 79 49 6e 66 6f 3b 20 20 20 20 20 20  *pKeyInfo;      
11a20 20 20 20 20 20 20 2f 2a 20 43 6f 6c 6c 61 74 69        /* Collati
11a30 6e 67 20 73 65 71 75 65 6e 63 65 20 66 6f 72 20  ng sequence for 
11a40 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 20 2a  the result set *
11a50 2f 0a 20 20 20 20 53 65 6c 65 63 74 20 2a 70 4c  /.    Select *pL
11a60 6f 6f 70 3b 20 20 20 20 20 20 20 20 20 20 20 20  oop;            
11a70 20 20 20 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69      /* For loopi
11a80 6e 67 20 74 68 72 6f 75 67 68 20 53 45 4c 45 43  ng through SELEC
11a90 54 20 73 74 61 74 65 6d 65 6e 74 73 20 2a 2f 0a  T statements */.
11aa0 20 20 20 20 69 6e 74 20 6e 4b 65 79 43 6f 6c 3b      int nKeyCol;
11ab0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11ac0 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 65    /* Number of e
11ad0 6e 74 72 69 65 73 20 69 6e 20 70 4b 65 79 49 6e  ntries in pKeyIn
11ae0 66 6f 2d 3e 61 43 6f 6c 5b 5d 20 2a 2f 0a 20 20  fo->aCol[] */.  
11af0 20 20 43 6f 6c 6c 53 65 71 20 2a 2a 61 70 43 6f    CollSeq **apCo
11b00 6c 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ll;             
11b10 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e 67 20 74  /* For looping t
11b20 68 72 6f 75 67 68 20 70 4b 65 79 49 6e 66 6f 2d  hrough pKeyInfo-
11b30 3e 61 43 6f 6c 6c 5b 5d 20 2a 2f 0a 20 20 20 20  >aColl[] */.    
11b40 43 6f 6c 6c 53 65 71 20 2a 2a 61 43 6f 70 79 3b  CollSeq **aCopy;
11b50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
11b60 20 41 20 63 6f 70 79 20 6f 66 20 70 4b 65 79 49   A copy of pKeyI
11b70 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b 5d 20 2a 2f 0a  nfo->aColl[] */.
11b80 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e  .    assert( p->
11b90 70 52 69 67 68 74 6d 6f 73 74 3d 3d 70 20 29 3b  pRightmost==p );
11ba0 0a 20 20 20 20 6e 4b 65 79 43 6f 6c 20 3d 20 6e  .    nKeyCol = n
11bb0 43 6f 6c 20 2b 20 28 70 4f 72 64 65 72 42 79 20  Col + (pOrderBy 
11bc0 3f 20 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70  ? pOrderBy->nExp
11bd0 72 20 3a 20 30 29 3b 0a 20 20 20 20 70 4b 65 79  r : 0);.    pKey
11be0 49 6e 66 6f 20 3d 20 73 71 6c 69 74 65 33 44 62  Info = sqlite3Db
11bf0 4d 61 6c 6c 6f 63 5a 65 72 6f 28 70 50 61 72 73  MallocZero(pPars
11c00 65 2d 3e 64 62 2c 0a 20 20 20 20 20 20 20 20 20  e->db,.         
11c10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 69                si
11c20 7a 65 6f 66 28 2a 70 4b 65 79 49 6e 66 6f 29 2b  zeof(*pKeyInfo)+
11c30 6e 4b 65 79 43 6f 6c 2a 28 73 69 7a 65 6f 66 28  nKeyCol*(sizeof(
11c40 43 6f 6c 6c 53 65 71 2a 29 20 2b 20 31 29 29 3b  CollSeq*) + 1));
11c50 0a 20 20 20 20 69 66 28 20 21 70 4b 65 79 49 6e  .    if( !pKeyIn
11c60 66 6f 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  fo ){.      rc =
11c70 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
11c80 20 20 20 20 20 67 6f 74 6f 20 6d 75 6c 74 69 5f       goto multi_
11c90 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20  select_end;.    
11ca0 7d 0a 0a 20 20 20 20 70 4b 65 79 49 6e 66 6f 2d  }..    pKeyInfo-
11cb0 3e 65 6e 63 20 3d 20 45 4e 43 28 70 50 61 72 73  >enc = ENC(pPars
11cc0 65 2d 3e 64 62 29 3b 0a 20 20 20 20 70 4b 65 79  e->db);.    pKey
11cd0 49 6e 66 6f 2d 3e 6e 46 69 65 6c 64 20 3d 20 6e  Info->nField = n
11ce0 43 6f 6c 3b 0a 0a 20 20 20 20 66 6f 72 28 69 3d  Col;..    for(i=
11cf0 30 2c 20 61 70 43 6f 6c 6c 3d 70 4b 65 79 49 6e  0, apColl=pKeyIn
11d00 66 6f 2d 3e 61 43 6f 6c 6c 3b 20 69 3c 6e 43 6f  fo->aColl; i<nCo
11d10 6c 3b 20 69 2b 2b 2c 20 61 70 43 6f 6c 6c 2b 2b  l; i++, apColl++
11d20 29 7b 0a 20 20 20 20 20 20 2a 61 70 43 6f 6c 6c  ){.      *apColl
11d30 20 3d 20 6d 75 6c 74 69 53 65 6c 65 63 74 43 6f   = multiSelectCo
11d40 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70 2c  llSeq(pParse, p,
11d50 20 69 29 3b 0a 20 20 20 20 20 20 69 66 28 20 30   i);.      if( 0
11d60 3d 3d 2a 61 70 43 6f 6c 6c 20 29 7b 0a 20 20 20  ==*apColl ){.   
11d70 20 20 20 20 20 2a 61 70 43 6f 6c 6c 20 3d 20 70       *apColl = p
11d80 50 61 72 73 65 2d 3e 64 62 2d 3e 70 44 66 6c 74  Parse->db->pDflt
11d90 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 7d 0a 20 20  Coll;.      }.  
11da0 20 20 7d 0a 0a 20 20 20 20 66 6f 72 28 70 4c 6f    }..    for(pLo
11db0 6f 70 3d 70 3b 20 70 4c 6f 6f 70 3b 20 70 4c 6f  op=p; pLoop; pLo
11dc0 6f 70 3d 70 4c 6f 6f 70 2d 3e 70 50 72 69 6f 72  op=pLoop->pPrior
11dd0 29 7b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30  ){.      for(i=0
11de0 3b 20 69 3c 32 3b 20 69 2b 2b 29 7b 0a 20 20 20  ; i<2; i++){.   
11df0 20 20 20 20 20 69 6e 74 20 61 64 64 72 20 3d 20       int addr = 
11e00 70 4c 6f 6f 70 2d 3e 61 64 64 72 4f 70 65 6e 45  pLoop->addrOpenE
11e10 70 68 6d 5b 69 5d 3b 0a 20 20 20 20 20 20 20 20  phm[i];.        
11e20 69 66 28 20 61 64 64 72 3c 30 20 29 7b 0a 20 20  if( addr<0 ){.  
11e30 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 5b 30          /* If [0
11e40 5d 20 69 73 20 75 6e 75 73 65 64 20 74 68 65 6e  ] is unused then
11e50 20 5b 31 5d 20 69 73 20 61 6c 73 6f 20 75 6e 75   [1] is also unu
11e60 73 65 64 2e 20 20 53 6f 20 77 65 20 63 61 6e 0a  sed.  So we can.
11e70 20 20 20 20 20 20 20 20 20 20 2a 2a 20 61 6c 77            ** alw
11e80 61 79 73 20 73 61 66 65 6c 79 20 61 62 6f 72 74  ays safely abort
11e90 20 61 73 20 73 6f 6f 6e 20 61 73 20 74 68 65 20   as soon as the 
11ea0 66 69 72 73 74 20 75 6e 75 73 65 64 20 73 6c 6f  first unused slo
11eb0 74 20 69 73 20 66 6f 75 6e 64 20 2a 2f 0a 20 20  t is found */.  
11ec0 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
11ed0 70 4c 6f 6f 70 2d 3e 61 64 64 72 4f 70 65 6e 45  pLoop->addrOpenE
11ee0 70 68 6d 5b 31 5d 3c 30 20 29 3b 0a 20 20 20 20  phm[1]<0 );.    
11ef0 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
11f00 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 73       }.        s
11f10 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65  qlite3VdbeChange
11f20 50 32 28 76 2c 20 61 64 64 72 2c 20 6e 43 6f 6c  P2(v, addr, nCol
11f30 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
11f40 65 33 56 64 62 65 43 68 61 6e 67 65 50 34 28 76  e3VdbeChangeP4(v
11f50 2c 20 61 64 64 72 2c 20 28 63 68 61 72 2a 29 70  , addr, (char*)p
11f60 4b 65 79 49 6e 66 6f 2c 20 50 34 5f 4b 45 59 49  KeyInfo, P4_KEYI
11f70 4e 46 4f 29 3b 0a 20 20 20 20 20 20 20 20 70 4c  NFO);.        pL
11f80 6f 6f 70 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68  oop->addrOpenEph
11f90 6d 5b 69 5d 20 3d 20 2d 31 3b 0a 20 20 20 20 20  m[i] = -1;.     
11fa0 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66   }.    }..    if
11fb0 28 20 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20  ( pOrderBy ){.  
11fc0 20 20 20 20 73 74 72 75 63 74 20 45 78 70 72 4c      struct ExprL
11fd0 69 73 74 5f 69 74 65 6d 20 2a 70 4f 54 65 72 6d  ist_item *pOTerm
11fe0 20 3d 20 70 4f 72 64 65 72 42 79 2d 3e 61 3b 0a   = pOrderBy->a;.
11ff0 20 20 20 20 20 20 69 6e 74 20 6e 4f 72 64 65 72        int nOrder
12000 42 79 45 78 70 72 20 3d 20 70 4f 72 64 65 72 42  ByExpr = pOrderB
12010 79 2d 3e 6e 45 78 70 72 3b 0a 20 20 20 20 20 20  y->nExpr;.      
12020 69 6e 74 20 61 64 64 72 3b 0a 20 20 20 20 20 20  int addr;.      
12030 75 38 20 2a 70 53 6f 72 74 4f 72 64 65 72 3b 0a  u8 *pSortOrder;.
12040 0a 20 20 20 20 20 20 2f 2a 20 52 65 75 73 65 20  .      /* Reuse 
12050 74 68 65 20 73 61 6d 65 20 70 4b 65 79 49 6e 66  the same pKeyInf
12060 6f 20 66 6f 72 20 74 68 65 20 4f 52 44 45 52 20  o for the ORDER 
12070 42 59 20 61 73 20 77 61 73 20 75 73 65 64 20 61  BY as was used a
12080 62 6f 76 65 20 66 6f 72 0a 20 20 20 20 20 20 2a  bove for.      *
12090 2a 20 74 68 65 20 63 6f 6d 70 6f 75 6e 64 20 73  * the compound s
120a0 65 6c 65 63 74 20 73 74 61 74 65 6d 65 6e 74 73  elect statements
120b0 2e 20 20 45 78 63 65 70 74 20 77 65 20 68 61 76  .  Except we hav
120c0 65 20 74 6f 20 63 68 61 6e 67 65 20 6f 75 74 20  e to change out 
120d0 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 70 4b 65  the.      ** pKe
120e0 79 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b 5d 20 76  yInfo->aColl[] v
120f0 61 6c 75 65 73 2e 20 20 53 6f 6d 65 20 6f 66 20  alues.  Some of 
12100 74 68 65 20 61 43 6f 6c 6c 5b 5d 20 76 61 6c 75  the aColl[] valu
12110 65 73 20 77 69 6c 6c 20 62 65 0a 20 20 20 20 20  es will be.     
12120 20 2a 2a 20 72 65 75 73 65 64 20 77 68 65 6e 20   ** reused when 
12130 63 6f 6e 73 74 72 75 63 74 69 6e 67 20 74 68 65  constructing the
12140 20 70 4b 65 79 49 6e 66 6f 20 66 6f 72 20 74 68   pKeyInfo for th
12150 65 20 4f 52 44 45 52 20 42 59 2c 20 73 6f 20 6d  e ORDER BY, so m
12160 61 6b 65 0a 20 20 20 20 20 20 2a 2a 20 61 20 63  ake.      ** a c
12170 6f 70 79 2e 20 20 53 75 66 66 69 63 69 65 6e 74  opy.  Sufficient
12180 20 73 70 61 63 65 20 74 6f 20 68 6f 6c 64 20 62   space to hold b
12190 6f 74 68 20 74 68 65 20 6e 43 6f 6c 20 65 6e 74  oth the nCol ent
121a0 72 69 65 73 20 66 6f 72 0a 20 20 20 20 20 20 2a  ries for.      *
121b0 2a 20 74 68 65 20 63 6f 6d 70 6f 75 6e 64 20 73  * the compound s
121c0 65 6c 65 63 74 20 61 6e 64 20 74 68 65 20 6e 4f  elect and the nO
121d0 72 64 65 72 62 79 45 78 70 72 20 65 6e 74 72 69  rderbyExpr entri
121e0 65 73 20 66 6f 72 20 74 68 65 20 4f 52 44 45 52  es for the ORDER
121f0 20 42 59 0a 20 20 20 20 20 20 2a 2a 20 77 61 73   BY.      ** was
12200 20 61 6c 6c 6f 63 61 74 65 64 20 61 62 6f 76 65   allocated above
12210 2e 20 20 42 75 74 20 77 65 20 6e 65 65 64 20 74  .  But we need t
12220 6f 20 6d 6f 76 65 20 74 68 65 20 63 6f 6d 70 6f  o move the compo
12230 75 6e 64 20 73 65 6c 65 63 74 0a 20 20 20 20 20  und select.     
12240 20 2a 2a 20 65 6e 74 72 69 65 73 20 6f 75 74 20   ** entries out 
12250 6f 66 20 74 68 65 20 77 61 79 20 62 65 66 6f 72  of the way befor
12260 65 20 63 6f 6e 73 74 72 75 63 74 69 6e 67 20 74  e constructing t
12270 68 65 20 4f 52 44 45 52 20 42 59 20 65 6e 74 72  he ORDER BY entr
12280 69 65 73 2e 0a 20 20 20 20 20 20 2a 2a 20 4d 6f  ies..      ** Mo
12290 76 65 20 74 68 65 20 63 6f 6d 70 6f 75 6e 64 20  ve the compound 
122a0 73 65 6c 65 63 74 20 65 6e 74 72 69 65 73 20 69  select entries i
122b0 6e 74 6f 20 61 43 6f 70 79 5b 5d 20 77 68 65 72  nto aCopy[] wher
122c0 65 20 74 68 65 79 20 63 61 6e 20 62 65 0a 20 20  e they can be.  
122d0 20 20 20 20 2a 2a 20 61 63 63 65 73 73 65 64 20      ** accessed 
122e0 61 6e 64 20 72 65 75 73 65 64 20 77 68 65 6e 20  and reused when 
122f0 63 6f 6e 73 74 72 75 63 74 69 6e 67 20 74 68 65  constructing the
12300 20 4f 52 44 45 52 20 42 59 20 65 6e 74 72 69 65   ORDER BY entrie
12310 73 2e 0a 20 20 20 20 20 20 2a 2a 20 42 65 63 61  s..      ** Beca
12320 75 73 65 20 6e 43 6f 6c 20 6d 69 67 68 74 20 62  use nCol might b
12330 65 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 6f  e greater than o
12340 72 20 6c 65 73 73 20 74 68 61 6e 20 6e 4f 72 64  r less than nOrd
12350 65 72 42 79 45 78 70 72 0a 20 20 20 20 20 20 2a  erByExpr.      *
12360 2a 20 77 65 20 68 61 76 65 20 74 6f 20 75 73 65  * we have to use
12370 20 6d 65 6d 6d 6f 76 65 28 29 20 77 68 65 6e 20   memmove() when 
12380 64 6f 69 6e 67 20 74 68 65 20 63 6f 70 79 2e 0a  doing the copy..
12390 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 61        */.      a
123a0 43 6f 70 79 20 3d 20 26 70 4b 65 79 49 6e 66 6f  Copy = &pKeyInfo
123b0 2d 3e 61 43 6f 6c 6c 5b 6e 4f 72 64 65 72 42 79  ->aColl[nOrderBy
123c0 45 78 70 72 5d 3b 0a 20 20 20 20 20 20 70 53 6f  Expr];.      pSo
123d0 72 74 4f 72 64 65 72 20 3d 20 70 4b 65 79 49 6e  rtOrder = pKeyIn
123e0 66 6f 2d 3e 61 53 6f 72 74 4f 72 64 65 72 20 3d  fo->aSortOrder =
123f0 20 28 75 38 2a 29 26 61 43 6f 70 79 5b 6e 43 6f   (u8*)&aCopy[nCo
12400 6c 5d 3b 0a 20 20 20 20 20 20 6d 65 6d 6d 6f 76  l];.      memmov
12410 65 28 61 43 6f 70 79 2c 20 70 4b 65 79 49 6e 66  e(aCopy, pKeyInf
12420 6f 2d 3e 61 43 6f 6c 6c 2c 20 6e 43 6f 6c 2a 73  o->aColl, nCol*s
12430 69 7a 65 6f 66 28 43 6f 6c 6c 53 65 71 2a 29 29  izeof(CollSeq*))
12440 3b 0a 0a 20 20 20 20 20 20 61 70 43 6f 6c 6c 20  ;..      apColl 
12450 3d 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 43 6f 6c  = pKeyInfo->aCol
12460 6c 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30  l;.      for(i=0
12470 3b 20 69 3c 6e 4f 72 64 65 72 42 79 45 78 70 72  ; i<nOrderByExpr
12480 3b 20 69 2b 2b 2c 20 70 4f 54 65 72 6d 2b 2b 2c  ; i++, pOTerm++,
12490 20 61 70 43 6f 6c 6c 2b 2b 2c 20 70 53 6f 72 74   apColl++, pSort
124a0 4f 72 64 65 72 2b 2b 29 7b 0a 20 20 20 20 20 20  Order++){.      
124b0 20 20 45 78 70 72 20 2a 70 45 78 70 72 20 3d 20    Expr *pExpr = 
124c0 70 4f 54 65 72 6d 2d 3e 70 45 78 70 72 3b 0a 20  pOTerm->pExpr;. 
124d0 20 20 20 20 20 20 20 69 66 28 20 28 70 45 78 70         if( (pExp
124e0 72 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f 45 78  r->flags & EP_Ex
124f0 70 43 6f 6c 6c 61 74 65 29 20 29 7b 0a 20 20 20  pCollate) ){.   
12500 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
12510 45 78 70 72 2d 3e 70 43 6f 6c 6c 21 3d 30 20 29  Expr->pColl!=0 )
12520 3b 0a 20 20 20 20 20 20 20 20 20 20 2a 61 70 43  ;.          *apC
12530 6f 6c 6c 20 3d 20 70 45 78 70 72 2d 3e 70 43 6f  oll = pExpr->pCo
12540 6c 6c 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  ll;.        }els
12550 65 7b 0a 20 20 20 20 20 20 20 20 20 20 2a 61 70  e{.          *ap
12560 43 6f 6c 6c 20 3d 20 61 43 6f 70 79 5b 70 45 78  Coll = aCopy[pEx
12570 70 72 2d 3e 69 43 6f 6c 75 6d 6e 5d 3b 0a 20 20  pr->iColumn];.  
12580 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
12590 2a 70 53 6f 72 74 4f 72 64 65 72 20 3d 20 70 4f  *pSortOrder = pO
125a0 54 65 72 6d 2d 3e 73 6f 72 74 4f 72 64 65 72 3b  Term->sortOrder;
125b0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 61  .      }.      a
125c0 73 73 65 72 74 28 20 70 2d 3e 70 52 69 67 68 74  ssert( p->pRight
125d0 6d 6f 73 74 3d 3d 70 20 29 3b 0a 20 20 20 20 20  most==p );.     
125e0 20 61 73 73 65 72 74 28 20 70 2d 3e 61 64 64 72   assert( p->addr
125f0 4f 70 65 6e 45 70 68 6d 5b 32 5d 3e 3d 30 20 29  OpenEphm[2]>=0 )
12600 3b 0a 20 20 20 20 20 20 61 64 64 72 20 3d 20 70  ;.      addr = p
12610 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b 32  ->addrOpenEphm[2
12620 5d 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ];.      sqlite3
12630 56 64 62 65 43 68 61 6e 67 65 50 32 28 76 2c 20  VdbeChangeP2(v, 
12640 61 64 64 72 2c 20 70 2d 3e 70 4f 72 64 65 72 42  addr, p->pOrderB
12650 79 2d 3e 6e 45 78 70 72 2b 32 29 3b 0a 20 20 20  y->nExpr+2);.   
12660 20 20 20 70 4b 65 79 49 6e 66 6f 2d 3e 6e 46 69     pKeyInfo->nFi
12670 65 6c 64 20 3d 20 6e 4f 72 64 65 72 42 79 45 78  eld = nOrderByEx
12680 70 72 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  pr;.      sqlite
12690 33 56 64 62 65 43 68 61 6e 67 65 50 34 28 76 2c  3VdbeChangeP4(v,
126a0 20 61 64 64 72 2c 20 28 63 68 61 72 2a 29 70 4b   addr, (char*)pK
126b0 65 79 49 6e 66 6f 2c 20 50 34 5f 4b 45 59 49 4e  eyInfo, P4_KEYIN
126c0 46 4f 5f 48 41 4e 44 4f 46 46 29 3b 0a 20 20 20  FO_HANDOFF);.   
126d0 20 20 20 70 4b 65 79 49 6e 66 6f 20 3d 20 30 3b     pKeyInfo = 0;
126e0 0a 20 20 20 20 20 20 67 65 6e 65 72 61 74 65 53  .      generateS
126f0 6f 72 74 54 61 69 6c 28 70 50 61 72 73 65 2c 20  ortTail(pParse, 
12700 70 2c 20 76 2c 20 70 2d 3e 70 45 4c 69 73 74 2d  p, v, p->pEList-
12710 3e 6e 45 78 70 72 2c 20 26 64 65 73 74 29 3b 0a  >nExpr, &dest);.
12720 20 20 20 20 7d 0a 0a 20 20 20 20 73 71 6c 69 74      }..    sqlit
12730 65 33 5f 66 72 65 65 28 70 4b 65 79 49 6e 66 6f  e3_free(pKeyInfo
12740 29 3b 0a 20 20 7d 0a 0a 6d 75 6c 74 69 5f 73 65  );.  }..multi_se
12750 6c 65 63 74 5f 65 6e 64 3a 0a 20 20 70 44 65 73  lect_end:.  pDes
12760 74 2d 3e 69 4d 65 6d 20 3d 20 64 65 73 74 2e 69  t->iMem = dest.i
12770 4d 65 6d 3b 0a 20 20 70 44 65 73 74 2d 3e 6e 4d  Mem;.  pDest->nM
12780 65 6d 20 3d 20 64 65 73 74 2e 6e 4d 65 6d 3b 0a  em = dest.nMem;.
12790 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 23    return rc;.}.#
127a0 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
127b0 4f 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45  OMIT_COMPOUND_SE
127c0 4c 45 43 54 20 2a 2f 0a 0a 23 69 66 6e 64 65 66  LECT */..#ifndef
127d0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45   SQLITE_OMIT_VIE
127e0 57 0a 2f 2a 20 46 6f 72 77 61 72 64 20 44 65 63  W./* Forward Dec
127f0 6c 61 72 61 74 69 6f 6e 73 20 2a 2f 0a 73 74 61  larations */.sta
12800 74 69 63 20 76 6f 69 64 20 73 75 62 73 74 45 78  tic void substEx
12810 70 72 4c 69 73 74 28 73 71 6c 69 74 65 33 2a 2c  prList(sqlite3*,
12820 20 45 78 70 72 4c 69 73 74 2a 2c 20 69 6e 74 2c   ExprList*, int,
12830 20 45 78 70 72 4c 69 73 74 2a 29 3b 0a 73 74 61   ExprList*);.sta
12840 74 69 63 20 76 6f 69 64 20 73 75 62 73 74 53 65  tic void substSe
12850 6c 65 63 74 28 73 71 6c 69 74 65 33 2a 2c 20 53  lect(sqlite3*, S
12860 65 6c 65 63 74 20 2a 2c 20 69 6e 74 2c 20 45 78  elect *, int, Ex
12870 70 72 4c 69 73 74 20 2a 29 3b 0a 0a 2f 2a 0a 2a  prList *);../*.*
12880 2a 20 53 63 61 6e 20 74 68 72 6f 75 67 68 20 74  * Scan through t
12890 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 70 45  he expression pE
128a0 78 70 72 2e 20 20 52 65 70 6c 61 63 65 20 65 76  xpr.  Replace ev
128b0 65 72 79 20 72 65 66 65 72 65 6e 63 65 20 74 6f  ery reference to
128c0 0a 2a 2a 20 61 20 63 6f 6c 75 6d 6e 20 69 6e 20  .** a column in 
128d0 74 61 62 6c 65 20 6e 75 6d 62 65 72 20 69 54 61  table number iTa
128e0 62 6c 65 20 77 69 74 68 20 61 20 63 6f 70 79 20  ble with a copy 
128f0 6f 66 20 74 68 65 20 69 43 6f 6c 75 6d 6e 2d 74  of the iColumn-t
12900 68 0a 2a 2a 20 65 6e 74 72 79 20 69 6e 20 70 45  h.** entry in pE
12910 4c 69 73 74 2e 20 20 28 42 75 74 20 6c 65 61 76  List.  (But leav
12920 65 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20  e references to 
12930 74 68 65 20 52 4f 57 49 44 20 63 6f 6c 75 6d 6e  the ROWID column
12940 20 0a 2a 2a 20 75 6e 63 68 61 6e 67 65 64 2e 29   .** unchanged.)
12950 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
12960 69 6e 65 20 69 73 20 70 61 72 74 20 6f 66 20 74  ine is part of t
12970 68 65 20 66 6c 61 74 74 65 6e 69 6e 67 20 70 72  he flattening pr
12980 6f 63 65 64 75 72 65 2e 20 20 41 20 73 75 62 71  ocedure.  A subq
12990 75 65 72 79 0a 2a 2a 20 77 68 6f 73 65 20 72 65  uery.** whose re
129a0 73 75 6c 74 20 73 65 74 20 69 73 20 64 65 66 69  sult set is defi
129b0 6e 65 64 20 62 79 20 70 45 4c 69 73 74 20 61 70  ned by pEList ap
129c0 70 65 61 72 73 20 61 73 20 65 6e 74 72 79 20 69  pears as entry i
129d0 6e 20 74 68 65 0a 2a 2a 20 46 52 4f 4d 20 63 6c  n the.** FROM cl
129e0 61 75 73 65 20 6f 66 20 61 20 53 45 4c 45 43 54  ause of a SELECT
129f0 20 73 75 63 68 20 74 68 61 74 20 74 68 65 20 56   such that the V
12a00 44 42 45 20 63 75 72 73 6f 72 20 61 73 73 69 67  DBE cursor assig
12a10 6e 65 64 20 74 6f 20 74 68 61 74 0a 2a 2a 20 46  ned to that.** F
12a20 4f 52 4d 20 63 6c 61 75 73 65 20 65 6e 74 72 79  ORM clause entry
12a30 20 69 73 20 69 54 61 62 6c 65 2e 20 20 54 68 69   is iTable.  Thi
12a40 73 20 72 6f 75 74 69 6e 65 20 6d 61 6b 65 20 74  s routine make t
12a50 68 65 20 6e 65 63 65 73 73 61 72 79 20 0a 2a 2a  he necessary .**
12a60 20 63 68 61 6e 67 65 73 20 74 6f 20 70 45 78 70   changes to pExp
12a70 72 20 73 6f 20 74 68 61 74 20 69 74 20 72 65 66  r so that it ref
12a80 65 72 73 20 64 69 72 65 63 74 6c 79 20 74 6f 20  ers directly to 
12a90 74 68 65 20 73 6f 75 72 63 65 20 74 61 62 6c 65  the source table
12aa0 0a 2a 2a 20 6f 66 20 74 68 65 20 73 75 62 71 75  .** of the subqu
12ab0 65 72 79 20 72 61 74 68 65 72 20 74 68 65 20 72  ery rather the r
12ac0 65 73 75 6c 74 20 73 65 74 20 6f 66 20 74 68 65  esult set of the
12ad0 20 73 75 62 71 75 65 72 79 2e 0a 2a 2f 0a 73 74   subquery..*/.st
12ae0 61 74 69 63 20 76 6f 69 64 20 73 75 62 73 74 45  atic void substE
12af0 78 70 72 28 0a 20 20 73 71 6c 69 74 65 33 20 2a  xpr(.  sqlite3 *
12b00 64 62 2c 20 20 20 20 20 20 20 20 2f 2a 20 52 65  db,        /* Re
12b10 70 6f 72 74 20 6d 61 6c 6c 6f 63 20 65 72 72 6f  port malloc erro
12b20 72 73 20 74 6f 20 74 68 69 73 20 63 6f 6e 6e 65  rs to this conne
12b30 63 74 69 6f 6e 20 2a 2f 0a 20 20 45 78 70 72 20  ction */.  Expr 
12b40 2a 70 45 78 70 72 2c 20 20 20 20 20 20 20 20 2f  *pExpr,        /
12b50 2a 20 45 78 70 72 20 69 6e 20 77 68 69 63 68 20  * Expr in which 
12b60 73 75 62 73 74 69 74 75 74 69 6f 6e 20 6f 63 63  substitution occ
12b70 75 72 73 20 2a 2f 0a 20 20 69 6e 74 20 69 54 61  urs */.  int iTa
12b80 62 6c 65 2c 20 20 20 20 20 20 20 20 20 2f 2a 20  ble,         /* 
12b90 54 61 62 6c 65 20 74 6f 20 62 65 20 73 75 62 73  Table to be subs
12ba0 74 69 74 75 74 65 64 20 2a 2f 0a 20 20 45 78 70  tituted */.  Exp
12bb0 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 20 20 20  rList *pEList   
12bc0 20 2f 2a 20 53 75 62 73 74 69 74 75 74 65 20 65   /* Substitute e
12bd0 78 70 72 65 73 73 69 6f 6e 73 20 2a 2f 0a 29 7b  xpressions */.){
12be0 0a 20 20 69 66 28 20 70 45 78 70 72 3d 3d 30 20  .  if( pExpr==0 
12bf0 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20  ) return;.  if( 
12c00 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f  pExpr->op==TK_CO
12c10 4c 55 4d 4e 20 26 26 20 70 45 78 70 72 2d 3e 69  LUMN && pExpr->i
12c20 54 61 62 6c 65 3d 3d 69 54 61 62 6c 65 20 29 7b  Table==iTable ){
12c30 0a 20 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e  .    if( pExpr->
12c40 69 43 6f 6c 75 6d 6e 3c 30 20 29 7b 0a 20 20 20  iColumn<0 ){.   
12c50 20 20 20 70 45 78 70 72 2d 3e 6f 70 20 3d 20 54     pExpr->op = T
12c60 4b 5f 4e 55 4c 4c 3b 0a 20 20 20 20 7d 65 6c 73  K_NULL;.    }els
12c70 65 7b 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70  e{.      Expr *p
12c80 4e 65 77 3b 0a 20 20 20 20 20 20 61 73 73 65 72  New;.      asser
12c90 74 28 20 70 45 4c 69 73 74 21 3d 30 20 26 26 20  t( pEList!=0 && 
12ca0 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3c 70  pExpr->iColumn<p
12cb0 45 4c 69 73 74 2d 3e 6e 45 78 70 72 20 29 3b 0a  EList->nExpr );.
12cc0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 45        assert( pE
12cd0 78 70 72 2d 3e 70 4c 65 66 74 3d 3d 30 20 26 26  xpr->pLeft==0 &&
12ce0 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 3d 3d   pExpr->pRight==
12cf0 30 20 26 26 20 70 45 78 70 72 2d 3e 70 4c 69 73  0 && pExpr->pLis
12d00 74 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 70 4e  t==0 );.      pN
12d10 65 77 20 3d 20 70 45 4c 69 73 74 2d 3e 61 5b 70  ew = pEList->a[p
12d20 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 5d 2e 70  Expr->iColumn].p
12d30 45 78 70 72 3b 0a 20 20 20 20 20 20 61 73 73 65  Expr;.      asse
12d40 72 74 28 20 70 4e 65 77 21 3d 30 20 29 3b 0a 20  rt( pNew!=0 );. 
12d50 20 20 20 20 20 70 45 78 70 72 2d 3e 6f 70 20 3d       pExpr->op =
12d60 20 70 4e 65 77 2d 3e 6f 70 3b 0a 20 20 20 20 20   pNew->op;.     
12d70 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e   assert( pExpr->
12d80 70 4c 65 66 74 3d 3d 30 20 29 3b 0a 20 20 20 20  pLeft==0 );.    
12d90 20 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 20 3d    pExpr->pLeft =
12da0 20 73 71 6c 69 74 65 33 45 78 70 72 44 75 70 28   sqlite3ExprDup(
12db0 64 62 2c 20 70 4e 65 77 2d 3e 70 4c 65 66 74 29  db, pNew->pLeft)
12dc0 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
12dd0 70 45 78 70 72 2d 3e 70 52 69 67 68 74 3d 3d 30  pExpr->pRight==0
12de0 20 29 3b 0a 20 20 20 20 20 20 70 45 78 70 72 2d   );.      pExpr-
12df0 3e 70 52 69 67 68 74 20 3d 20 73 71 6c 69 74 65  >pRight = sqlite
12e00 33 45 78 70 72 44 75 70 28 64 62 2c 20 70 4e 65  3ExprDup(db, pNe
12e10 77 2d 3e 70 52 69 67 68 74 29 3b 0a 20 20 20 20  w->pRight);.    
12e20 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d    assert( pExpr-
12e30 3e 70 4c 69 73 74 3d 3d 30 20 29 3b 0a 20 20 20  >pList==0 );.   
12e40 20 20 20 70 45 78 70 72 2d 3e 70 4c 69 73 74 20     pExpr->pList 
12e50 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73  = sqlite3ExprLis
12e60 74 44 75 70 28 64 62 2c 20 70 4e 65 77 2d 3e 70  tDup(db, pNew->p
12e70 4c 69 73 74 29 3b 0a 20 20 20 20 20 20 70 45 78  List);.      pEx
12e80 70 72 2d 3e 69 54 61 62 6c 65 20 3d 20 70 4e 65  pr->iTable = pNe
12e90 77 2d 3e 69 54 61 62 6c 65 3b 0a 20 20 20 20 20  w->iTable;.     
12ea0 20 70 45 78 70 72 2d 3e 70 54 61 62 20 3d 20 70   pExpr->pTab = p
12eb0 4e 65 77 2d 3e 70 54 61 62 3b 0a 20 20 20 20 20  New->pTab;.     
12ec0 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 20   pExpr->iColumn 
12ed0 3d 20 70 4e 65 77 2d 3e 69 43 6f 6c 75 6d 6e 3b  = pNew->iColumn;
12ee0 0a 20 20 20 20 20 20 70 45 78 70 72 2d 3e 69 41  .      pExpr->iA
12ef0 67 67 20 3d 20 70 4e 65 77 2d 3e 69 41 67 67 3b  gg = pNew->iAgg;
12f00 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 54 6f  .      sqlite3To
12f10 6b 65 6e 43 6f 70 79 28 64 62 2c 20 26 70 45 78  kenCopy(db, &pEx
12f20 70 72 2d 3e 74 6f 6b 65 6e 2c 20 26 70 4e 65 77  pr->token, &pNew
12f30 2d 3e 74 6f 6b 65 6e 29 3b 0a 20 20 20 20 20 20  ->token);.      
12f40 73 71 6c 69 74 65 33 54 6f 6b 65 6e 43 6f 70 79  sqlite3TokenCopy
12f50 28 64 62 2c 20 26 70 45 78 70 72 2d 3e 73 70 61  (db, &pExpr->spa
12f60 6e 2c 20 26 70 4e 65 77 2d 3e 73 70 61 6e 29 3b  n, &pNew->span);
12f70 0a 20 20 20 20 20 20 70 45 78 70 72 2d 3e 70 53  .      pExpr->pS
12f80 65 6c 65 63 74 20 3d 20 73 71 6c 69 74 65 33 53  elect = sqlite3S
12f90 65 6c 65 63 74 44 75 70 28 64 62 2c 20 70 4e 65  electDup(db, pNe
12fa0 77 2d 3e 70 53 65 6c 65 63 74 29 3b 0a 20 20 20  w->pSelect);.   
12fb0 20 20 20 70 45 78 70 72 2d 3e 66 6c 61 67 73 20     pExpr->flags 
12fc0 3d 20 70 4e 65 77 2d 3e 66 6c 61 67 73 3b 0a 20  = pNew->flags;. 
12fd0 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20     }.  }else{.  
12fe0 20 20 73 75 62 73 74 45 78 70 72 28 64 62 2c 20    substExpr(db, 
12ff0 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 69 54  pExpr->pLeft, iT
13000 61 62 6c 65 2c 20 70 45 4c 69 73 74 29 3b 0a 20  able, pEList);. 
13010 20 20 20 73 75 62 73 74 45 78 70 72 28 64 62 2c     substExpr(db,
13020 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20   pExpr->pRight, 
13030 69 54 61 62 6c 65 2c 20 70 45 4c 69 73 74 29 3b  iTable, pEList);
13040 0a 20 20 20 20 73 75 62 73 74 53 65 6c 65 63 74  .    substSelect
13050 28 64 62 2c 20 70 45 78 70 72 2d 3e 70 53 65 6c  (db, pExpr->pSel
13060 65 63 74 2c 20 69 54 61 62 6c 65 2c 20 70 45 4c  ect, iTable, pEL
13070 69 73 74 29 3b 0a 20 20 20 20 73 75 62 73 74 45  ist);.    substE
13080 78 70 72 4c 69 73 74 28 64 62 2c 20 70 45 78 70  xprList(db, pExp
13090 72 2d 3e 70 4c 69 73 74 2c 20 69 54 61 62 6c 65  r->pList, iTable
130a0 2c 20 70 45 4c 69 73 74 29 3b 0a 20 20 7d 0a 7d  , pEList);.  }.}
130b0 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 75 62  .static void sub
130c0 73 74 45 78 70 72 4c 69 73 74 28 0a 20 20 73 71  stExprList(.  sq
130d0 6c 69 74 65 33 20 2a 64 62 2c 20 20 20 20 20 20  lite3 *db,      
130e0 20 20 20 2f 2a 20 52 65 70 6f 72 74 20 6d 61 6c     /* Report mal
130f0 6c 6f 63 20 65 72 72 6f 72 73 20 68 65 72 65 20  loc errors here 
13100 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70  */.  ExprList *p
13110 4c 69 73 74 2c 20 20 20 20 20 2f 2a 20 4c 69 73  List,     /* Lis
13120 74 20 74 6f 20 73 63 61 6e 20 61 6e 64 20 69 6e  t to scan and in
13130 20 77 68 69 63 68 20 74 6f 20 6d 61 6b 65 20 73   which to make s
13140 75 62 73 74 69 74 75 74 65 73 20 2a 2f 0a 20 20  ubstitutes */.  
13150 69 6e 74 20 69 54 61 62 6c 65 2c 20 20 20 20 20  int iTable,     
13160 20 20 20 20 20 2f 2a 20 54 61 62 6c 65 20 74 6f       /* Table to
13170 20 62 65 20 73 75 62 73 74 69 74 75 74 65 64 20   be substituted 
13180 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70  */.  ExprList *p
13190 45 4c 69 73 74 20 20 20 20 20 2f 2a 20 53 75 62  EList     /* Sub
131a0 73 74 69 74 75 74 65 20 76 61 6c 75 65 73 20 2a  stitute values *
131b0 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  /.){.  int i;.  
131c0 69 66 28 20 70 4c 69 73 74 3d 3d 30 20 29 20 72  if( pList==0 ) r
131d0 65 74 75 72 6e 3b 0a 20 20 66 6f 72 28 69 3d 30  eturn;.  for(i=0
131e0 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e 45 78 70 72  ; i<pList->nExpr
131f0 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 75 62 73  ; i++){.    subs
13200 74 45 78 70 72 28 64 62 2c 20 70 4c 69 73 74 2d  tExpr(db, pList-
13210 3e 61 5b 69 5d 2e 70 45 78 70 72 2c 20 69 54 61  >a[i].pExpr, iTa
13220 62 6c 65 2c 20 70 45 4c 69 73 74 29 3b 0a 20 20  ble, pEList);.  
13230 7d 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20  }.}.static void 
13240 73 75 62 73 74 53 65 6c 65 63 74 28 0a 20 20 73  substSelect(.  s
13250 71 6c 69 74 65 33 20 2a 64 62 2c 20 20 20 20 20  qlite3 *db,     
13260 20 20 20 20 2f 2a 20 52 65 70 6f 72 74 20 6d 61      /* Report ma
13270 6c 6c 6f 63 20 65 72 72 6f 72 73 20 68 65 72 65  lloc errors here
13280 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 2c   */.  Select *p,
13290 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 45             /* SE
132a0 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 69  LECT statement i
132b0 6e 20 77 68 69 63 68 20 74 6f 20 6d 61 6b 65 20  n which to make 
132c0 73 75 62 73 74 69 74 75 74 69 6f 6e 73 20 2a 2f  substitutions */
132d0 0a 20 20 69 6e 74 20 69 54 61 62 6c 65 2c 20 20  .  int iTable,  
132e0 20 20 20 20 20 20 20 20 2f 2a 20 54 61 62 6c 65          /* Table
132f0 20 74 6f 20 62 65 20 72 65 70 6c 61 63 65 64 20   to be replaced 
13300 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70  */.  ExprList *p
13310 45 4c 69 73 74 20 20 20 20 20 2f 2a 20 53 75 62  EList     /* Sub
13320 73 74 69 74 75 74 65 20 76 61 6c 75 65 73 20 2a  stitute values *
13330 2f 0a 29 7b 0a 20 20 69 66 28 20 21 70 20 29 20  /.){.  if( !p ) 
13340 72 65 74 75 72 6e 3b 0a 20 20 73 75 62 73 74 45  return;.  substE
13350 78 70 72 4c 69 73 74 28 64 62 2c 20 70 2d 3e 70  xprList(db, p->p
13360 45 4c 69 73 74 2c 20 69 54 61 62 6c 65 2c 20 70  EList, iTable, p
13370 45 4c 69 73 74 29 3b 0a 20 20 73 75 62 73 74 45  EList);.  substE
13380 78 70 72 4c 69 73 74 28 64 62 2c 20 70 2d 3e 70  xprList(db, p->p
13390 47 72 6f 75 70 42 79 2c 20 69 54 61 62 6c 65 2c  GroupBy, iTable,
133a0 20 70 45 4c 69 73 74 29 3b 0a 20 20 73 75 62 73   pEList);.  subs
133b0 74 45 78 70 72 4c 69 73 74 28 64 62 2c 20 70 2d  tExprList(db, p-
133c0 3e 70 4f 72 64 65 72 42 79 2c 20 69 54 61 62 6c  >pOrderBy, iTabl
133d0 65 2c 20 70 45 4c 69 73 74 29 3b 0a 20 20 73 75  e, pEList);.  su
133e0 62 73 74 45 78 70 72 28 64 62 2c 20 70 2d 3e 70  bstExpr(db, p->p
133f0 48 61 76 69 6e 67 2c 20 69 54 61 62 6c 65 2c 20  Having, iTable, 
13400 70 45 4c 69 73 74 29 3b 0a 20 20 73 75 62 73 74  pEList);.  subst
13410 45 78 70 72 28 64 62 2c 20 70 2d 3e 70 57 68 65  Expr(db, p->pWhe
13420 72 65 2c 20 69 54 61 62 6c 65 2c 20 70 45 4c 69  re, iTable, pELi
13430 73 74 29 3b 0a 20 20 73 75 62 73 74 53 65 6c 65  st);.  substSele
13440 63 74 28 64 62 2c 20 70 2d 3e 70 50 72 69 6f 72  ct(db, p->pPrior
13450 2c 20 69 54 61 62 6c 65 2c 20 70 45 4c 69 73 74  , iTable, pEList
13460 29 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 21  );.}.#endif /* !
13470 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
13480 4d 49 54 5f 56 49 45 57 29 20 2a 2f 0a 0a 23 69  MIT_VIEW) */..#i
13490 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
134a0 54 5f 56 49 45 57 0a 2f 2a 0a 2a 2a 20 54 68 69  T_VIEW./*.** Thi
134b0 73 20 72 6f 75 74 69 6e 65 20 61 74 74 65 6d 70  s routine attemp
134c0 74 73 20 74 6f 20 66 6c 61 74 74 65 6e 20 73 75  ts to flatten su
134d0 62 71 75 65 72 69 65 73 20 69 6e 20 6f 72 64 65  bqueries in orde
134e0 72 20 74 6f 20 73 70 65 65 64 0a 2a 2a 20 65 78  r to speed.** ex
134f0 65 63 75 74 69 6f 6e 2e 20 20 49 74 20 72 65 74  ecution.  It ret
13500 75 72 6e 73 20 31 20 69 66 20 69 74 20 6d 61 6b  urns 1 if it mak
13510 65 73 20 63 68 61 6e 67 65 73 20 61 6e 64 20 30  es changes and 0
13520 20 69 66 20 6e 6f 20 66 6c 61 74 74 65 6e 69 6e   if no flattenin
13530 67 0a 2a 2a 20 6f 63 63 75 72 73 2e 0a 2a 2a 0a  g.** occurs..**.
13540 2a 2a 20 54 6f 20 75 6e 64 65 72 73 74 61 6e 64  ** To understand
13550 20 74 68 65 20 63 6f 6e 63 65 70 74 20 6f 66 20   the concept of 
13560 66 6c 61 74 74 65 6e 69 6e 67 2c 20 63 6f 6e 73  flattening, cons
13570 69 64 65 72 20 74 68 65 20 66 6f 6c 6c 6f 77 69  ider the followi
13580 6e 67 0a 2a 2a 20 71 75 65 72 79 3a 0a 2a 2a 0a  ng.** query:.**.
13590 2a 2a 20 20 20 20 20 53 45 4c 45 43 54 20 61 20  **     SELECT a 
135a0 46 52 4f 4d 20 28 53 45 4c 45 43 54 20 78 2b 79  FROM (SELECT x+y
135b0 20 41 53 20 61 20 46 52 4f 4d 20 74 31 20 57 48   AS a FROM t1 WH
135c0 45 52 45 20 7a 3c 31 30 30 29 20 57 48 45 52 45  ERE z<100) WHERE
135d0 20 61 3e 35 0a 2a 2a 0a 2a 2a 20 54 68 65 20 64   a>5.**.** The d
135e0 65 66 61 75 6c 74 20 77 61 79 20 6f 66 20 69 6d  efault way of im
135f0 70 6c 65 6d 65 6e 74 69 6e 67 20 74 68 69 73 20  plementing this 
13600 71 75 65 72 79 20 69 73 20 74 6f 20 65 78 65 63  query is to exec
13610 75 74 65 20 74 68 65 0a 2a 2a 20 73 75 62 71 75  ute the.** subqu
13620 65 72 79 20 66 69 72 73 74 20 61 6e 64 20 73 74  ery first and st
13630 6f 72 65 20 74 68 65 20 72 65 73 75 6c 74 73 20  ore the results 
13640 69 6e 20 61 20 74 65 6d 70 6f 72 61 72 79 20 74  in a temporary t
13650 61 62 6c 65 2c 20 74 68 65 6e 0a 2a 2a 20 72 75  able, then.** ru
13660 6e 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72  n the outer quer
13670 79 20 6f 6e 20 74 68 61 74 20 74 65 6d 70 6f 72  y on that tempor
13680 61 72 79 20 74 61 62 6c 65 2e 20 20 54 68 69 73  ary table.  This
13690 20 72 65 71 75 69 72 65 73 20 74 77 6f 0a 2a 2a   requires two.**
136a0 20 70 61 73 73 65 73 20 6f 76 65 72 20 74 68 65   passes over the
136b0 20 64 61 74 61 2e 20 20 46 75 72 74 68 65 72 6d   data.  Furtherm
136c0 6f 72 65 2c 20 62 65 63 61 75 73 65 20 74 68 65  ore, because the
136d0 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65   temporary table
136e0 0a 2a 2a 20 68 61 73 20 6e 6f 20 69 6e 64 69 63  .** has no indic
136f0 65 73 2c 20 74 68 65 20 57 48 45 52 45 20 63 6c  es, the WHERE cl
13700 61 75 73 65 20 6f 6e 20 74 68 65 20 6f 75 74 65  ause on the oute
13710 72 20 71 75 65 72 79 20 63 61 6e 6e 6f 74 20 62  r query cannot b
13720 65 0a 2a 2a 20 6f 70 74 69 6d 69 7a 65 64 2e 0a  e.** optimized..
13730 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
13740 6e 65 20 61 74 74 65 6d 70 74 73 20 74 6f 20 72  ne attempts to r
13750 65 77 72 69 74 65 20 71 75 65 72 69 65 73 20 73  ewrite queries s
13760 75 63 68 20 61 73 20 74 68 65 20 61 62 6f 76 65  uch as the above
13770 20 69 6e 74 6f 0a 2a 2a 20 61 20 73 69 6e 67 6c   into.** a singl
13780 65 20 66 6c 61 74 20 73 65 6c 65 63 74 2c 20 6c  e flat select, l
13790 69 6b 65 20 74 68 69 73 3a 0a 2a 2a 0a 2a 2a 20  ike this:.**.** 
137a0 20 20 20 20 53 45 4c 45 43 54 20 78 2b 79 20 41      SELECT x+y A
137b0 53 20 61 20 46 52 4f 4d 20 74 31 20 57 48 45 52  S a FROM t1 WHER
137c0 45 20 7a 3c 31 30 30 20 41 4e 44 20 61 3e 35 0a  E z<100 AND a>5.
137d0 2a 2a 0a 2a 2a 20 54 68 65 20 63 6f 64 65 20 67  **.** The code g
137e0 65 6e 65 72 61 74 65 64 20 66 6f 72 20 74 68 69  enerated for thi
137f0 73 20 73 69 6d 70 69 66 69 63 61 74 69 6f 6e 20  s simpification 
13800 67 69 76 65 73 20 74 68 65 20 73 61 6d 65 20 72  gives the same r
13810 65 73 75 6c 74 0a 2a 2a 20 62 75 74 20 6f 6e 6c  esult.** but onl
13820 79 20 68 61 73 20 74 6f 20 73 63 61 6e 20 74 68  y has to scan th
13830 65 20 64 61 74 61 20 6f 6e 63 65 2e 20 20 41 6e  e data once.  An
13840 64 20 62 65 63 61 75 73 65 20 69 6e 64 69 63 65  d because indice
13850 73 20 6d 69 67 68 74 20 0a 2a 2a 20 65 78 69 73  s might .** exis
13860 74 20 6f 6e 20 74 68 65 20 74 61 62 6c 65 20 74  t on the table t
13870 31 2c 20 61 20 63 6f 6d 70 6c 65 74 65 20 73 63  1, a complete sc
13880 61 6e 20 6f 66 20 74 68 65 20 64 61 74 61 20 6d  an of the data m
13890 69 67 68 74 20 62 65 0a 2a 2a 20 61 76 6f 69 64  ight be.** avoid
138a0 65 64 2e 0a 2a 2a 0a 2a 2a 20 46 6c 61 74 74 65  ed..**.** Flatte
138b0 6e 69 6e 67 20 69 73 20 6f 6e 6c 79 20 61 74 74  ning is only att
138c0 65 6d 70 74 65 64 20 69 66 20 61 6c 6c 20 6f 66  empted if all of
138d0 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61   the following a
138e0 72 65 20 74 72 75 65 3a 0a 2a 2a 0a 2a 2a 20 20  re true:.**.**  
138f0 20 28 31 29 20 20 54 68 65 20 73 75 62 71 75 65   (1)  The subque
13900 72 79 20 61 6e 64 20 74 68 65 20 6f 75 74 65 72  ry and the outer
13910 20 71 75 65 72 79 20 64 6f 20 6e 6f 74 20 62 6f   query do not bo
13920 74 68 20 75 73 65 20 61 67 67 72 65 67 61 74 65  th use aggregate
13930 73 2e 0a 2a 2a 0a 2a 2a 20 20 20 28 32 29 20 20  s..**.**   (2)  
13940 54 68 65 20 73 75 62 71 75 65 72 79 20 69 73 20  The subquery is 
13950 6e 6f 74 20 61 6e 20 61 67 67 72 65 67 61 74 65  not an aggregate
13960 20 6f 72 20 74 68 65 20 6f 75 74 65 72 20 71 75   or the outer qu
13970 65 72 79 20 69 73 20 6e 6f 74 20 61 20 6a 6f 69  ery is not a joi
13980 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20 28 33 29 20 20  n..**.**   (3)  
13990 54 68 65 20 73 75 62 71 75 65 72 79 20 69 73 20  The subquery is 
139a0 6e 6f 74 20 74 68 65 20 72 69 67 68 74 20 6f 70  not the right op
139b0 65 72 61 6e 64 20 6f 66 20 61 20 6c 65 66 74 20  erand of a left 
139c0 6f 75 74 65 72 20 6a 6f 69 6e 2c 20 6f 72 0a 2a  outer join, or.*
139d0 2a 20 20 20 20 20 20 20 20 74 68 65 20 73 75 62  *        the sub
139e0 71 75 65 72 79 20 69 73 20 6e 6f 74 20 69 74 73  query is not its
139f0 65 6c 66 20 61 20 6a 6f 69 6e 2e 20 20 28 54 69  elf a join.  (Ti
13a00 63 6b 65 74 20 23 33 30 36 29 0a 2a 2a 0a 2a 2a  cket #306).**.**
13a10 20 20 20 28 34 29 20 20 54 68 65 20 73 75 62 71     (4)  The subq
13a20 75 65 72 79 20 69 73 20 6e 6f 74 20 44 49 53 54  uery is not DIST
13a30 49 4e 43 54 20 6f 72 20 74 68 65 20 6f 75 74 65  INCT or the oute
13a40 72 20 71 75 65 72 79 20 69 73 20 6e 6f 74 20 61  r query is not a
13a50 20 6a 6f 69 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20 28   join..**.**   (
13a60 35 29 20 20 54 68 65 20 73 75 62 71 75 65 72 79  5)  The subquery
13a70 20 69 73 20 6e 6f 74 20 44 49 53 54 49 4e 43 54   is not DISTINCT
13a80 20 6f 72 20 74 68 65 20 6f 75 74 65 72 20 71 75   or the outer qu
13a90 65 72 79 20 64 6f 65 73 20 6e 6f 74 20 75 73 65  ery does not use
13aa0 0a 2a 2a 20 20 20 20 20 20 20 20 61 67 67 72 65  .**        aggre
13ab0 67 61 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 20 20 28  gates..**.**   (
13ac0 36 29 20 20 54 68 65 20 73 75 62 71 75 65 72 79  6)  The subquery
13ad0 20 64 6f 65 73 20 6e 6f 74 20 75 73 65 20 61 67   does not use ag
13ae0 67 72 65 67 61 74 65 73 20 6f 72 20 74 68 65 20  gregates or the 
13af0 6f 75 74 65 72 20 71 75 65 72 79 20 69 73 20 6e  outer query is n
13b00 6f 74 0a 2a 2a 20 20 20 20 20 20 20 20 44 49 53  ot.**        DIS
13b10 54 49 4e 43 54 2e 0a 2a 2a 0a 2a 2a 20 20 20 28  TINCT..**.**   (
13b20 37 29 20 20 54 68 65 20 73 75 62 71 75 65 72 79  7)  The subquery
13b30 20 68 61 73 20 61 20 46 52 4f 4d 20 63 6c 61 75   has a FROM clau
13b40 73 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 28 38 29 20  se..**.**   (8) 
13b50 20 54 68 65 20 73 75 62 71 75 65 72 79 20 64 6f   The subquery do
13b60 65 73 20 6e 6f 74 20 75 73 65 20 4c 49 4d 49 54  es not use LIMIT
13b70 20 6f 72 20 74 68 65 20 6f 75 74 65 72 20 71 75   or the outer qu
13b80 65 72 79 20 69 73 20 6e 6f 74 20 61 20 6a 6f 69  ery is not a joi
13b90 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20 28 39 29 20 20  n..**.**   (9)  
13ba0 54 68 65 20 73 75 62 71 75 65 72 79 20 64 6f 65  The subquery doe
13bb0 73 20 6e 6f 74 20 75 73 65 20 4c 49 4d 49 54 20  s not use LIMIT 
13bc0 6f 72 20 74 68 65 20 6f 75 74 65 72 20 71 75 65  or the outer que
13bd0 72 79 20 64 6f 65 73 20 6e 6f 74 20 75 73 65 0a  ry does not use.
13be0 2a 2a 20 20 20 20 20 20 20 20 61 67 67 72 65 67  **        aggreg
13bf0 61 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 20 28 31 30  ates..**.**  (10
13c00 29 20 20 54 68 65 20 73 75 62 71 75 65 72 79 20  )  The subquery 
13c10 64 6f 65 73 20 6e 6f 74 20 75 73 65 20 61 67 67  does not use agg
13c20 72 65 67 61 74 65 73 20 6f 72 20 74 68 65 20 6f  regates or the o
13c30 75 74 65 72 20 71 75 65 72 79 20 64 6f 65 73 20  uter query does 
13c40 6e 6f 74 0a 2a 2a 20 20 20 20 20 20 20 20 75 73  not.**        us
13c50 65 20 4c 49 4d 49 54 2e 0a 2a 2a 0a 2a 2a 20 20  e LIMIT..**.**  
13c60 28 31 31 29 20 20 54 68 65 20 73 75 62 71 75 65  (11)  The subque
13c70 72 79 20 61 6e 64 20 74 68 65 20 6f 75 74 65 72  ry and the outer
13c80 20 71 75 65 72 79 20 64 6f 20 6e 6f 74 20 62 6f   query do not bo
13c90 74 68 20 68 61 76 65 20 4f 52 44 45 52 20 42 59  th have ORDER BY
13ca0 20 63 6c 61 75 73 65 73 2e 0a 2a 2a 0a 2a 2a 20   clauses..**.** 
13cb0 20 28 31 32 29 20 20 54 68 65 20 73 75 62 71 75   (12)  The subqu
13cc0 65 72 79 20 69 73 20 6e 6f 74 20 74 68 65 20 72  ery is not the r
13cd0 69 67 68 74 20 74 65 72 6d 20 6f 66 20 61 20 4c  ight term of a L
13ce0 45 46 54 20 4f 55 54 45 52 20 4a 4f 49 4e 20 6f  EFT OUTER JOIN o
13cf0 72 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 20 20  r the.**        
13d00 73 75 62 71 75 65 72 79 20 68 61 73 20 6e 6f 20  subquery has no 
13d10 57 48 45 52 45 20 63 6c 61 75 73 65 2e 20 20 28  WHERE clause.  (
13d20 61 64 64 65 64 20 62 79 20 74 69 63 6b 65 74 20  added by ticket 
13d30 23 33 35 30 29 0a 2a 2a 0a 2a 2a 20 20 28 31 33  #350).**.**  (13
13d40 29 20 20 54 68 65 20 73 75 62 71 75 65 72 79 20  )  The subquery 
13d50 61 6e 64 20 6f 75 74 65 72 20 71 75 65 72 79 20  and outer query 
13d60 64 6f 20 6e 6f 74 20 62 6f 74 68 20 75 73 65 20  do not both use 
13d70 4c 49 4d 49 54 0a 2a 2a 0a 2a 2a 20 20 28 31 34  LIMIT.**.**  (14
13d80 29 20 20 54 68 65 20 73 75 62 71 75 65 72 79 20  )  The subquery 
13d90 64 6f 65 73 20 6e 6f 74 20 75 73 65 20 4f 46 46  does not use OFF
13da0 53 45 54 0a 2a 2a 0a 2a 2a 20 20 28 31 35 29 20  SET.**.**  (15) 
13db0 20 54 68 65 20 6f 75 74 65 72 20 71 75 65 72 79   The outer query
13dc0 20 69 73 20 6e 6f 74 20 70 61 72 74 20 6f 66 20   is not part of 
13dd0 61 20 63 6f 6d 70 6f 75 6e 64 20 73 65 6c 65 63  a compound selec
13de0 74 20 6f 72 20 74 68 65 0a 2a 2a 20 20 20 20 20  t or the.**     
13df0 20 20 20 73 75 62 71 75 65 72 79 20 64 6f 65 73     subquery does
13e00 20 6e 6f 74 20 68 61 76 65 20 62 6f 74 68 20 61   not have both a
13e10 6e 20 4f 52 44 45 52 20 42 59 20 61 6e 64 20 61  n ORDER BY and a
13e20 20 4c 49 4d 49 54 20 63 6c 61 75 73 65 2e 0a 2a   LIMIT clause..*
13e30 2a 20 20 20 20 20 20 20 20 28 53 65 65 20 74 69  *        (See ti
13e40 63 6b 65 74 20 23 32 33 33 39 29 0a 2a 2a 0a 2a  cket #2339).**.*
13e50 2a 20 20 28 31 36 29 20 20 54 68 65 20 6f 75 74  *  (16)  The out
13e60 65 72 20 71 75 65 72 79 20 69 73 20 6e 6f 74 20  er query is not 
13e70 61 6e 20 61 67 67 72 65 67 61 74 65 20 6f 72 20  an aggregate or 
13e80 74 68 65 20 73 75 62 71 75 65 72 79 20 64 6f 65  the subquery doe
13e90 73 0a 2a 2a 20 20 20 20 20 20 20 20 6e 6f 74 20  s.**        not 
13ea0 63 6f 6e 74 61 69 6e 20 4f 52 44 45 52 20 42 59  contain ORDER BY
13eb0 2e 20 20 28 54 69 63 6b 65 74 20 23 32 39 34 32  .  (Ticket #2942
13ec0 29 20 20 54 68 69 73 20 75 73 65 64 20 74 6f 20  )  This used to 
13ed0 6e 6f 74 20 6d 61 74 74 65 72 0a 2a 2a 20 20 20  not matter.**   
13ee0 20 20 20 20 20 75 6e 74 69 6c 20 77 65 20 69 6e       until we in
13ef0 74 72 6f 64 75 63 65 64 20 74 68 65 20 67 72 6f  troduced the gro
13f00 75 70 5f 63 6f 6e 63 61 74 28 29 20 66 75 6e 63  up_concat() func
13f10 74 69 6f 6e 2e 20 20 0a 2a 2a 0a 2a 2a 20 49 6e  tion.  .**.** In
13f20 20 74 68 69 73 20 72 6f 75 74 69 6e 65 2c 20 74   this routine, t
13f30 68 65 20 22 70 22 20 70 61 72 61 6d 65 74 65 72  he "p" parameter
13f40 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f   is a pointer to
13f50 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79   the outer query
13f60 2e 0a 2a 2a 20 54 68 65 20 73 75 62 71 75 65 72  ..** The subquer
13f70 79 20 69 73 20 70 2d 3e 70 53 72 63 2d 3e 61 5b  y is p->pSrc->a[
13f80 69 46 72 6f 6d 5d 2e 20 20 69 73 41 67 67 20 69  iFrom].  isAgg i
13f90 73 20 74 72 75 65 20 69 66 20 74 68 65 20 6f 75  s true if the ou
13fa0 74 65 72 20 71 75 65 72 79 0a 2a 2a 20 75 73 65  ter query.** use
13fb0 73 20 61 67 67 72 65 67 61 74 65 73 20 61 6e 64  s aggregates and
13fc0 20 73 75 62 71 75 65 72 79 49 73 41 67 67 20 69   subqueryIsAgg i
13fd0 73 20 74 72 75 65 20 69 66 20 74 68 65 20 73 75  s true if the su
13fe0 62 71 75 65 72 79 20 75 73 65 73 20 61 67 67 72  bquery uses aggr
13ff0 65 67 61 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 49 66  egates..**.** If
14000 20 66 6c 61 74 74 65 6e 69 6e 67 20 69 73 20 6e   flattening is n
14010 6f 74 20 61 74 74 65 6d 70 74 65 64 2c 20 74 68  ot attempted, th
14020 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20  is routine is a 
14030 6e 6f 2d 6f 70 20 61 6e 64 20 72 65 74 75 72 6e  no-op and return
14040 73 20 30 2e 0a 2a 2a 20 49 66 20 66 6c 61 74 74  s 0..** If flatt
14050 65 6e 69 6e 67 20 69 73 20 61 74 74 65 6d 70 74  ening is attempt
14060 65 64 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  ed this routine 
14070 72 65 74 75 72 6e 73 20 31 2e 0a 2a 2a 0a 2a 2a  returns 1..**.**
14080 20 41 6c 6c 20 6f 66 20 74 68 65 20 65 78 70 72   All of the expr
14090 65 73 73 69 6f 6e 20 61 6e 61 6c 79 73 69 73 20  ession analysis 
140a0 6d 75 73 74 20 6f 63 63 75 72 20 6f 6e 20 62 6f  must occur on bo
140b0 74 68 20 74 68 65 20 6f 75 74 65 72 20 71 75 65  th the outer que
140c0 72 79 20 61 6e 64 0a 2a 2a 20 74 68 65 20 73 75  ry and.** the su
140d0 62 71 75 65 72 79 20 62 65 66 6f 72 65 20 74 68  bquery before th
140e0 69 73 20 72 6f 75 74 69 6e 65 20 72 75 6e 73 2e  is routine runs.
140f0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66  .*/.static int f
14100 6c 61 74 74 65 6e 53 75 62 71 75 65 72 79 28 0a  lattenSubquery(.
14110 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 20    sqlite3 *db,  
14120 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61         /* Databa
14130 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f  se connection */
14140 0a 20 20 53 65 6c 65 63 74 20 2a 70 2c 20 20 20  .  Select *p,   
14150 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70          /* The p
14160 61 72 65 6e 74 20 6f 72 20 6f 75 74 65 72 20 53  arent or outer S
14170 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20  ELECT statement 
14180 2a 2f 0a 20 20 69 6e 74 20 69 46 72 6f 6d 2c 20  */.  int iFrom, 
14190 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64            /* Ind
141a0 65 78 20 69 6e 20 70 2d 3e 70 53 72 63 2d 3e 61  ex in p->pSrc->a
141b0 5b 5d 20 6f 66 20 74 68 65 20 69 6e 6e 65 72 20  [] of the inner 
141c0 73 75 62 71 75 65 72 79 20 2a 2f 0a 20 20 69 6e  subquery */.  in
141d0 74 20 69 73 41 67 67 2c 20 20 20 20 20 20 20 20  t isAgg,        
141e0 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 6f 75     /* True if ou
141f0 74 65 72 20 53 45 4c 45 43 54 20 75 73 65 73 20  ter SELECT uses 
14200 61 67 67 72 65 67 61 74 65 20 66 75 6e 63 74 69  aggregate functi
14210 6f 6e 73 20 2a 2f 0a 20 20 69 6e 74 20 73 75 62  ons */.  int sub
14220 71 75 65 72 79 49 73 41 67 67 20 20 20 20 2f 2a  queryIsAgg    /*
14230 20 54 72 75 65 20 69 66 20 74 68 65 20 73 75 62   True if the sub
14240 71 75 65 72 79 20 75 73 65 73 20 61 67 67 72 65  query uses aggre
14250 67 61 74 65 20 66 75 6e 63 74 69 6f 6e 73 20 2a  gate functions *
14260 2f 0a 29 7b 0a 20 20 53 65 6c 65 63 74 20 2a 70  /.){.  Select *p
14270 53 75 62 3b 20 20 20 20 20 20 20 2f 2a 20 54 68  Sub;       /* Th
14280 65 20 69 6e 6e 65 72 20 71 75 65 72 79 20 6f 72  e inner query or
14290 20 22 73 75 62 71 75 65 72 79 22 20 2a 2f 0a 20   "subquery" */. 
142a0 20 53 72 63 4c 69 73 74 20 2a 70 53 72 63 3b 20   SrcList *pSrc; 
142b0 20 20 20 20 20 2f 2a 20 54 68 65 20 46 52 4f 4d       /* The FROM
142c0 20 63 6c 61 75 73 65 20 6f 66 20 74 68 65 20 6f   clause of the o
142d0 75 74 65 72 20 71 75 65 72 79 20 2a 2f 0a 20 20  uter query */.  
142e0 53 72 63 4c 69 73 74 20 2a 70 53 75 62 53 72 63  SrcList *pSubSrc
142f0 3b 20 20 20 2f 2a 20 54 68 65 20 46 52 4f 4d 20  ;   /* The FROM 
14300 63 6c 61 75 73 65 20 6f 66 20 74 68 65 20 73 75  clause of the su
14310 62 71 75 65 72 79 20 2a 2f 0a 20 20 45 78 70 72  bquery */.  Expr
14320 4c 69 73 74 20 2a 70 4c 69 73 74 3b 20 20 20 20  List *pList;    
14330 2f 2a 20 54 68 65 20 72 65 73 75 6c 74 20 73 65  /* The result se
14340 74 20 6f 66 20 74 68 65 20 6f 75 74 65 72 20 71  t of the outer q
14350 75 65 72 79 20 2a 2f 0a 20 20 69 6e 74 20 69 50  uery */.  int iP
14360 61 72 65 6e 74 3b 20 20 20 20 20 20 20 20 2f 2a  arent;        /*
14370 20 56 44 42 45 20 63 75 72 73 6f 72 20 6e 75 6d   VDBE cursor num
14380 62 65 72 20 6f 66 20 74 68 65 20 70 53 75 62 20  ber of the pSub 
14390 72 65 73 75 6c 74 20 73 65 74 20 74 65 6d 70 20  result set temp 
143a0 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 69  table */.  int i
143b0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
143c0 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a  * Loop counter *
143d0 2f 0a 20 20 45 78 70 72 20 2a 70 57 68 65 72 65  /.  Expr *pWhere
143e0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
143f0 20 20 20 20 20 2f 2a 20 54 68 65 20 57 48 45 52       /* The WHER
14400 45 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 73 74  E clause */.  st
14410 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65  ruct SrcList_ite
14420 6d 20 2a 70 53 75 62 69 74 65 6d 3b 20 20 20 2f  m *pSubitem;   /
14430 2a 20 54 68 65 20 73 75 62 71 75 65 72 79 20 2a  * The subquery *
14440 2f 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 74 6f  /..  /* Check to
14450 20 73 65 65 20 69 66 20 66 6c 61 74 74 65 6e 69   see if flatteni
14460 6e 67 20 69 73 20 70 65 72 6d 69 74 74 65 64 2e  ng is permitted.
14470 20 20 52 65 74 75 72 6e 20 30 20 69 66 20 6e 6f    Return 0 if no
14480 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 3d  t..  */.  if( p=
14490 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  =0 ) return 0;. 
144a0 20 70 53 72 63 20 3d 20 70 2d 3e 70 53 72 63 3b   pSrc = p->pSrc;
144b0 0a 20 20 61 73 73 65 72 74 28 20 70 53 72 63 20  .  assert( pSrc 
144c0 26 26 20 69 46 72 6f 6d 3e 3d 30 20 26 26 20 69  && iFrom>=0 && i
144d0 46 72 6f 6d 3c 70 53 72 63 2d 3e 6e 53 72 63 20  From<pSrc->nSrc 
144e0 29 3b 0a 20 20 70 53 75 62 69 74 65 6d 20 3d 20  );.  pSubitem = 
144f0 26 70 53 72 63 2d 3e 61 5b 69 46 72 6f 6d 5d 3b  &pSrc->a[iFrom];
14500 0a 20 20 70 53 75 62 20 3d 20 70 53 75 62 69 74  .  pSub = pSubit
14510 65 6d 2d 3e 70 53 65 6c 65 63 74 3b 0a 20 20 61  em->pSelect;.  a
14520 73 73 65 72 74 28 20 70 53 75 62 21 3d 30 20 29  ssert( pSub!=0 )
14530 3b 0a 20 20 69 66 28 20 69 73 41 67 67 20 26 26  ;.  if( isAgg &&
14540 20 73 75 62 71 75 65 72 79 49 73 41 67 67 20 29   subqueryIsAgg )
14550 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20   return 0;      
14560 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
14570 73 74 72 69 63 74 69 6f 6e 20 28 31 29 20 20 2a  striction (1)  *
14580 2f 0a 20 20 69 66 28 20 73 75 62 71 75 65 72 79  /.  if( subquery
14590 49 73 41 67 67 20 26 26 20 70 53 72 63 2d 3e 6e  IsAgg && pSrc->n
145a0 53 72 63 3e 31 20 29 20 72 65 74 75 72 6e 20 30  Src>1 ) return 0
145b0 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65  ;          /* Re
145c0 73 74 72 69 63 74 69 6f 6e 20 28 32 29 20 20 2a  striction (2)  *
145d0 2f 0a 20 20 70 53 75 62 53 72 63 20 3d 20 70 53  /.  pSubSrc = pS
145e0 75 62 2d 3e 70 53 72 63 3b 0a 20 20 61 73 73 65  ub->pSrc;.  asse
145f0 72 74 28 20 70 53 75 62 53 72 63 20 29 3b 0a 20  rt( pSubSrc );. 
14600 20 2f 2a 20 50 72 69 6f 72 20 74 6f 20 76 65 72   /* Prior to ver
14610 73 69 6f 6e 20 33 2e 31 2e 32 2c 20 77 68 65 6e  sion 3.1.2, when
14620 20 4c 49 4d 49 54 20 61 6e 64 20 4f 46 46 53 45   LIMIT and OFFSE
14630 54 20 68 61 64 20 74 6f 20 62 65 20 73 69 6d 70  T had to be simp
14640 6c 65 20 63 6f 6e 73 74 61 6e 74 73 2c 0a 20 20  le constants,.  
14650 2a 2a 20 6e 6f 74 20 61 72 62 69 74 72 61 72 79  ** not arbitrary
14660 20 65 78 70 72 65 73 73 73 69 6f 6e 73 2c 20 77   expresssions, w
14670 65 20 61 6c 6c 6f 77 65 64 20 73 6f 6d 65 20 63  e allowed some c
14680 6f 6d 62 69 6e 69 6e 67 20 6f 66 20 4c 49 4d 49  ombining of LIMI
14690 54 20 61 6e 64 20 4f 46 46 53 45 54 0a 20 20 2a  T and OFFSET.  *
146a0 2a 20 62 65 63 61 75 73 65 20 74 68 65 79 20 63  * because they c
146b0 6f 75 6c 64 20 62 65 20 63 6f 6d 70 75 74 65 64  ould be computed
146c0 20 61 74 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65   at compile-time
146d0 2e 20 20 42 75 74 20 77 68 65 6e 20 4c 49 4d 49  .  But when LIMI
146e0 54 20 61 6e 64 20 4f 46 46 53 45 54 0a 20 20 2a  T and OFFSET.  *
146f0 2a 20 62 65 63 61 6d 65 20 61 72 62 69 74 72 61  * became arbitra
14700 72 79 20 65 78 70 72 65 73 73 69 6f 6e 73 2c 20  ry expressions, 
14710 77 65 20 77 65 72 65 20 66 6f 72 63 65 64 20 74  we were forced t
14720 6f 20 61 64 64 20 72 65 73 74 72 69 63 74 69 6f  o add restrictio
14730 6e 73 20 28 31 33 29 0a 20 20 2a 2a 20 61 6e 64  ns (13).  ** and
14740 20 28 31 34 29 2e 20 2a 2f 0a 20 20 69 66 28 20   (14). */.  if( 
14750 70 53 75 62 2d 3e 70 4c 69 6d 69 74 20 26 26 20  pSub->pLimit && 
14760 70 2d 3e 70 4c 69 6d 69 74 20 29 20 72 65 74 75  p->pLimit ) retu
14770 72 6e 20 30 3b 20 20 20 20 20 20 20 20 20 20 20  rn 0;           
14780 20 20 20 2f 2a 20 52 65 73 74 72 69 63 74 69 6f     /* Restrictio
14790 6e 20 28 31 33 29 20 2a 2f 0a 20 20 69 66 28 20  n (13) */.  if( 
147a0 70 53 75 62 2d 3e 70 4f 66 66 73 65 74 20 29 20  pSub->pOffset ) 
147b0 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20  return 0;       
147c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
147d0 20 20 20 2f 2a 20 52 65 73 74 72 69 63 74 69 6f     /* Restrictio
147e0 6e 20 28 31 34 29 20 2a 2f 0a 20 20 69 66 28 20  n (14) */.  if( 
147f0 70 2d 3e 70 52 69 67 68 74 6d 6f 73 74 20 26 26  p->pRightmost &&
14800 20 70 53 75 62 2d 3e 70 4c 69 6d 69 74 20 26 26   pSub->pLimit &&
14810 20 70 53 75 62 2d 3e 70 4f 72 64 65 72 42 79 20   pSub->pOrderBy 
14820 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b  ){.    return 0;
14830 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14840 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14850 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
14860 65 73 74 72 69 63 74 69 6f 6e 20 28 31 35 29 20  estriction (15) 
14870 2a 2f 0a 20 20 7d 0a 20 20 69 66 28 20 70 53 75  */.  }.  if( pSu
14880 62 53 72 63 2d 3e 6e 53 72 63 3d 3d 30 20 29 20  bSrc->nSrc==0 ) 
14890 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20  return 0;       
148a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
148b0 2f 2a 20 52 65 73 74 72 69 63 74 69 6f 6e 20 28  /* Restriction (
148c0 37 29 20 20 2a 2f 0a 20 20 69 66 28 20 28 70 53  7)  */.  if( (pS
148d0 75 62 2d 3e 69 73 44 69 73 74 69 6e 63 74 20 7c  ub->isDistinct |
148e0 7c 20 70 53 75 62 2d 3e 70 4c 69 6d 69 74 29 20  | pSub->pLimit) 
148f0 0a 20 20 20 20 20 20 20 20 20 26 26 20 28 70 53  .         && (pS
14900 72 63 2d 3e 6e 53 72 63 3e 31 20 7c 7c 20 69 73  rc->nSrc>1 || is
14910 41 67 67 29 20 29 7b 20 20 20 20 20 20 20 20 20  Agg) ){         
14920 20 2f 2a 20 52 65 73 74 72 69 63 74 69 6f 6e 73   /* Restrictions
14930 20 28 34 29 28 35 29 28 38 29 28 39 29 20 2a 2f   (4)(5)(8)(9) */
14940 0a 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 20  .     return 0; 
14950 20 20 20 20 20 20 0a 20 20 7d 0a 20 20 69 66 28        .  }.  if(
14960 20 70 2d 3e 69 73 44 69 73 74 69 6e 63 74 20 26   p->isDistinct &
14970 26 20 73 75 62 71 75 65 72 79 49 73 41 67 67 20  & subqueryIsAgg 
14980 29 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20  ) return 0;     
14990 20 20 20 20 2f 2a 20 52 65 73 74 72 69 63 74 69      /* Restricti
149a0 6f 6e 20 28 36 29 20 20 2a 2f 0a 20 20 69 66 28  on (6)  */.  if(
149b0 20 28 70 2d 3e 64 69 73 61 6c 6c 6f 77 4f 72 64   (p->disallowOrd
149c0 65 72 42 79 20 7c 7c 20 70 2d 3e 70 4f 72 64 65  erBy || p->pOrde
149d0 72 42 79 29 20 26 26 20 70 53 75 62 2d 3e 70 4f  rBy) && pSub->pO
149e0 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20 20 72  rderBy ){.     r
149f0 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20 20  eturn 0;        
14a00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14a10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14a20 20 20 20 2f 2a 20 52 65 73 74 72 69 63 74 69 6f     /* Restrictio
14a30 6e 20 28 31 31 29 20 2a 2f 0a 20 20 7d 0a 20 20  n (11) */.  }.  
14a40 69 66 28 20 69 73 41 67 67 20 26 26 20 70 53 75  if( isAgg && pSu
14a50 62 2d 3e 70 4f 72 64 65 72 42 79 20 29 20 72 65  b->pOrderBy ) re
14a60 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20 20 20  turn 0;         
14a70 20 20 20 20 20 20 20 2f 2a 20 52 65 73 74 72 69         /* Restri
14a80 63 74 69 6f 6e 20 28 31 36 29 20 2a 2f 0a 0a 20  ction (16) */.. 
14a90 20 2f 2a 20 52 65 73 74 72 69 63 74 69 6f 6e 20   /* Restriction 
14aa0 33 3a 20 20 49 66 20 74 68 65 20 73 75 62 71 75  3:  If the subqu
14ab0 65 72 79 20 69 73 20 61 20 6a 6f 69 6e 2c 20 6d  ery is a join, m
14ac0 61 6b 65 20 73 75 72 65 20 74 68 65 20 73 75 62  ake sure the sub
14ad0 71 75 65 72 79 20 69 73 20 0a 20 20 2a 2a 20 6e  query is .  ** n
14ae0 6f 74 20 75 73 65 64 20 61 73 20 74 68 65 20 72  ot used as the r
14af0 69 67 68 74 20 6f 70 65 72 61 6e 64 20 6f 66 20  ight operand of 
14b00 61 6e 20 6f 75 74 65 72 20 6a 6f 69 6e 2e 20 20  an outer join.  
14b10 45 78 61 6d 70 6c 65 73 20 6f 66 20 77 68 79 20  Examples of why 
14b20 74 68 69 73 0a 20 20 2a 2a 20 69 73 20 6e 6f 74  this.  ** is not
14b30 20 61 6c 6c 6f 77 65 64 3a 0a 20 20 2a 2a 0a 20   allowed:.  **. 
14b40 20 2a 2a 20 20 20 20 20 20 20 20 20 74 31 20 4c   **         t1 L
14b50 45 46 54 20 4f 55 54 45 52 20 4a 4f 49 4e 20 28  EFT OUTER JOIN (
14b60 74 32 20 4a 4f 49 4e 20 74 33 29 0a 20 20 2a 2a  t2 JOIN t3).  **
14b70 0a 20 20 2a 2a 20 49 66 20 77 65 20 66 6c 61 74  .  ** If we flat
14b80 74 65 6e 20 74 68 65 20 61 62 6f 76 65 2c 20 77  ten the above, w
14b90 65 20 77 6f 75 6c 64 20 67 65 74 0a 20 20 2a 2a  e would get.  **
14ba0 0a 20 20 2a 2a 20 20 20 20 20 20 20 20 20 28 74  .  **         (t
14bb0 31 20 4c 45 46 54 20 4f 55 54 45 52 20 4a 4f 49  1 LEFT OUTER JOI
14bc0 4e 20 74 32 29 20 4a 4f 49 4e 20 74 33 0a 20 20  N t2) JOIN t3.  
14bd0 2a 2a 0a 20 20 2a 2a 20 77 68 69 63 68 20 69 73  **.  ** which is
14be0 20 6e 6f 74 20 61 74 20 61 6c 6c 20 74 68 65 20   not at all the 
14bf0 73 61 6d 65 20 74 68 69 6e 67 2e 0a 20 20 2a 2f  same thing..  */
14c00 0a 20 20 69 66 28 20 70 53 75 62 53 72 63 2d 3e  .  if( pSubSrc->
14c10 6e 53 72 63 3e 31 20 26 26 20 28 70 53 75 62 69  nSrc>1 && (pSubi
14c20 74 65 6d 2d 3e 6a 6f 69 6e 74 79 70 65 20 26 20  tem->jointype & 
14c30 4a 54 5f 4f 55 54 45 52 29 21 3d 30 20 29 7b 0a  JT_OUTER)!=0 ){.
14c40 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
14c50 7d 0a 0a 20 20 2f 2a 20 52 65 73 74 72 69 63 74  }..  /* Restrict
14c60 69 6f 6e 20 31 32 3a 20 20 49 66 20 74 68 65 20  ion 12:  If the 
14c70 73 75 62 71 75 65 72 79 20 69 73 20 74 68 65 20  subquery is the 
14c80 72 69 67 68 74 20 6f 70 65 72 61 6e 64 20 6f 66  right operand of
14c90 20 61 20 6c 65 66 74 20 6f 75 74 65 72 0a 20 20   a left outer.  
14ca0 2a 2a 20 6a 6f 69 6e 2c 20 6d 61 6b 65 20 73 75  ** join, make su
14cb0 72 65 20 74 68 65 20 73 75 62 71 75 65 72 79 20  re the subquery 
14cc0 68 61 73 20 6e 6f 20 57 48 45 52 45 20 63 6c 61  has no WHERE cla
14cd0 75 73 65 2e 0a 20 20 2a 2a 20 41 6e 20 65 78 61  use..  ** An exa
14ce0 6d 70 6c 65 73 20 6f 66 20 77 68 79 20 74 68 69  mples of why thi
14cf0 73 20 69 73 20 6e 6f 74 20 61 6c 6c 6f 77 65 64  s is not allowed
14d00 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20  :.  **.  **     
14d10 20 20 20 20 74 31 20 4c 45 46 54 20 4f 55 54 45      t1 LEFT OUTE
14d20 52 20 4a 4f 49 4e 20 28 53 45 4c 45 43 54 20 2a  R JOIN (SELECT *
14d30 20 46 52 4f 4d 20 74 32 20 57 48 45 52 45 20 74   FROM t2 WHERE t
14d40 32 2e 78 3e 30 29 0a 20 20 2a 2a 0a 20 20 2a 2a  2.x>0).  **.  **
14d50 20 49 66 20 77 65 20 66 6c 61 74 74 65 6e 20 74   If we flatten t
14d60 68 65 20 61 62 6f 76 65 2c 20 77 65 20 77 6f 75  he above, we wou
14d70 6c 64 20 67 65 74 0a 20 20 2a 2a 0a 20 20 2a 2a  ld get.  **.  **
14d80 20 20 20 20 20 20 20 20 20 28 74 31 20 4c 45 46           (t1 LEF
14d90 54 20 4f 55 54 45 52 20 4a 4f 49 4e 20 74 32 29  T OUTER JOIN t2)
14da0 20 57 48 45 52 45 20 74 32 2e 78 3e 30 0a 20 20   WHERE t2.x>0.  
14db0 2a 2a 0a 20 20 2a 2a 20 42 75 74 20 74 68 65 20  **.  ** But the 
14dc0 74 32 2e 78 3e 30 20 74 65 73 74 20 77 69 6c 6c  t2.x>0 test will
14dd0 20 61 6c 77 61 79 73 20 66 61 69 6c 20 6f 6e 20   always fail on 
14de0 61 20 4e 55 4c 4c 20 72 6f 77 20 6f 66 20 74 32  a NULL row of t2
14df0 2c 20 77 68 69 63 68 0a 20 20 2a 2a 20 65 66 66  , which.  ** eff
14e00 65 63 74 69 76 65 6c 79 20 63 6f 6e 76 65 72 74  ectively convert
14e10 73 20 74 68 65 20 4f 55 54 45 52 20 4a 4f 49 4e  s the OUTER JOIN
14e20 20 69 6e 74 6f 20 61 6e 20 49 4e 4e 45 52 20 4a   into an INNER J
14e30 4f 49 4e 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  OIN..  */.  if( 
14e40 28 70 53 75 62 69 74 65 6d 2d 3e 6a 6f 69 6e 74  (pSubitem->joint
14e50 79 70 65 20 26 20 4a 54 5f 4f 55 54 45 52 29 21  ype & JT_OUTER)!
14e60 3d 30 20 26 26 20 70 53 75 62 2d 3e 70 57 68 65  =0 && pSub->pWhe
14e70 72 65 21 3d 30 20 29 7b 0a 20 20 20 20 72 65 74  re!=0 ){.    ret
14e80 75 72 6e 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  urn 0;.  }..  /*
14e90 20 49 66 20 77 65 20 72 65 61 63 68 20 74 68 69   If we reach thi
14ea0 73 20 70 6f 69 6e 74 2c 20 69 74 20 6d 65 61 6e  s point, it mean
14eb0 73 20 66 6c 61 74 74 65 6e 69 6e 67 20 69 73 20  s flattening is 
14ec0 70 65 72 6d 69 74 74 65 64 20 66 6f 72 20 74 68  permitted for th
14ed0 65 0a 20 20 2a 2a 20 69 46 72 6f 6d 2d 74 68 20  e.  ** iFrom-th 
14ee0 65 6e 74 72 79 20 6f 66 20 74 68 65 20 46 52 4f  entry of the FRO
14ef0 4d 20 63 6c 61 75 73 65 20 69 6e 20 74 68 65 20  M clause in the 
14f00 6f 75 74 65 72 20 71 75 65 72 79 2e 0a 20 20 2a  outer query..  *
14f10 2f 0a 0a 20 20 2f 2a 20 4d 6f 76 65 20 61 6c 6c  /..  /* Move all
14f20 20 6f 66 20 74 68 65 20 46 52 4f 4d 20 65 6c 65   of the FROM ele
14f30 6d 65 6e 74 73 20 6f 66 20 74 68 65 20 73 75 62  ments of the sub
14f40 71 75 65 72 79 20 69 6e 74 6f 20 74 68 65 0a 20  query into the. 
14f50 20 2a 2a 20 74 68 65 20 46 52 4f 4d 20 63 6c 61   ** the FROM cla
14f60 75 73 65 20 6f 66 20 74 68 65 20 6f 75 74 65 72  use of the outer
14f70 20 71 75 65 72 79 2e 20 20 42 65 66 6f 72 65 20   query.  Before 
14f80 64 6f 69 6e 67 20 74 68 69 73 2c 20 72 65 6d 65  doing this, reme
14f90 6d 62 65 72 0a 20 20 2a 2a 20 74 68 65 20 63 75  mber.  ** the cu
14fa0 72 73 6f 72 20 6e 75 6d 62 65 72 20 66 6f 72 20  rsor number for 
14fb0 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 6f 75 74  the original out
14fc0 65 72 20 71 75 65 72 79 20 46 52 4f 4d 20 65 6c  er query FROM el
14fd0 65 6d 65 6e 74 20 69 6e 0a 20 20 2a 2a 20 69 50  ement in.  ** iP
14fe0 61 72 65 6e 74 2e 20 20 54 68 65 20 69 50 61 72  arent.  The iPar
14ff0 65 6e 74 20 63 75 72 73 6f 72 20 77 69 6c 6c 20  ent cursor will 
15000 6e 65 76 65 72 20 62 65 20 75 73 65 64 2e 20 20  never be used.  
15010 53 75 62 73 65 71 75 65 6e 74 20 63 6f 64 65 0a  Subsequent code.
15020 20 20 2a 2a 20 77 69 6c 6c 20 73 63 61 6e 20 65    ** will scan e
15030 78 70 72 65 73 73 69 6f 6e 73 20 6c 6f 6f 6b 69  xpressions looki
15040 6e 67 20 66 6f 72 20 69 50 61 72 65 6e 74 20 72  ng for iParent r
15050 65 66 65 72 65 6e 63 65 73 20 61 6e 64 20 72 65  eferences and re
15060 70 6c 61 63 65 0a 20 20 2a 2a 20 74 68 6f 73 65  place.  ** those
15070 20 72 65 66 65 72 65 6e 63 65 73 20 77 69 74 68   references with
15080 20 65 78 70 72 65 73 73 69 6f 6e 73 20 74 68 61   expressions tha
15090 74 20 72 65 73 6f 6c 76 65 20 74 6f 20 74 68 65  t resolve to the
150a0 20 73 75 62 71 75 65 72 79 20 46 52 4f 4d 0a 20   subquery FROM. 
150b0 20 2a 2a 20 65 6c 65 6d 65 6e 74 73 20 77 65 20   ** elements we 
150c0 61 72 65 20 6e 6f 77 20 63 6f 70 79 69 6e 67 20  are now copying 
150d0 69 6e 2e 0a 20 20 2a 2f 0a 20 20 69 50 61 72 65  in..  */.  iPare
150e0 6e 74 20 3d 20 70 53 75 62 69 74 65 6d 2d 3e 69  nt = pSubitem->i
150f0 43 75 72 73 6f 72 3b 0a 20 20 7b 0a 20 20 20 20  Cursor;.  {.    
15100 69 6e 74 20 6e 53 75 62 53 72 63 20 3d 20 70 53  int nSubSrc = pS
15110 75 62 53 72 63 2d 3e 6e 53 72 63 3b 0a 20 20 20  ubSrc->nSrc;.   
15120 20 69 6e 74 20 6a 6f 69 6e 74 79 70 65 20 3d 20   int jointype = 
15130 70 53 75 62 69 74 65 6d 2d 3e 6a 6f 69 6e 74 79  pSubitem->jointy
15140 70 65 3b 0a 0a 20 20 20 20 73 71 6c 69 74 65 33  pe;..    sqlite3
15150 44 65 6c 65 74 65 54 61 62 6c 65 28 70 53 75 62  DeleteTable(pSub
15160 69 74 65 6d 2d 3e 70 54 61 62 29 3b 0a 20 20 20  item->pTab);.   
15170 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 53   sqlite3_free(pS
15180 75 62 69 74 65 6d 2d 3e 7a 44 61 74 61 62 61 73  ubitem->zDatabas
15190 65 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  e);.    sqlite3_
151a0 66 72 65 65 28 70 53 75 62 69 74 65 6d 2d 3e 7a  free(pSubitem->z
151b0 4e 61 6d 65 29 3b 0a 20 20 20 20 73 71 6c 69 74  Name);.    sqlit
151c0 65 33 5f 66 72 65 65 28 70 53 75 62 69 74 65 6d  e3_free(pSubitem
151d0 2d 3e 7a 41 6c 69 61 73 29 3b 0a 20 20 20 20 70  ->zAlias);.    p
151e0 53 75 62 69 74 65 6d 2d 3e 70 54 61 62 20 3d 20  Subitem->pTab = 
151f0 30 3b 0a 20 20 20 20 70 53 75 62 69 74 65 6d 2d  0;.    pSubitem-
15200 3e 7a 44 61 74 61 62 61 73 65 20 3d 20 30 3b 0a  >zDatabase = 0;.
15210 20 20 20 20 70 53 75 62 69 74 65 6d 2d 3e 7a 4e      pSubitem->zN
15220 61 6d 65 20 3d 20 30 3b 0a 20 20 20 20 70 53 75  ame = 0;.    pSu
15230 62 69 74 65 6d 2d 3e 7a 41 6c 69 61 73 20 3d 20  bitem->zAlias = 
15240 30 3b 0a 20 20 20 20 69 66 28 20 6e 53 75 62 53  0;.    if( nSubS
15250 72 63 3e 31 20 29 7b 0a 20 20 20 20 20 20 69 6e  rc>1 ){.      in
15260 74 20 65 78 74 72 61 20 3d 20 6e 53 75 62 53 72  t extra = nSubSr
15270 63 20 2d 20 31 3b 0a 20 20 20 20 20 20 66 6f 72  c - 1;.      for
15280 28 69 3d 31 3b 20 69 3c 6e 53 75 62 53 72 63 3b  (i=1; i<nSubSrc;
15290 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 70   i++){.        p
152a0 53 72 63 20 3d 20 73 71 6c 69 74 65 33 53 72 63  Src = sqlite3Src
152b0 4c 69 73 74 41 70 70 65 6e 64 28 64 62 2c 20 70  ListAppend(db, p
152c0 53 72 63 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  Src, 0, 0);.    
152d0 20 20 20 20 69 66 28 20 70 53 72 63 3d 3d 30 20      if( pSrc==0 
152e0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e  ){.          p->
152f0 70 53 72 63 20 3d 20 30 3b 0a 20 20 20 20 20 20  pSrc = 0;.      
15300 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20      return 1;.  
15310 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
15320 20 20 20 20 20 20 70 2d 3e 70 53 72 63 20 3d 20        p->pSrc = 
15330 70 53 72 63 3b 0a 20 20 20 20 20 20 66 6f 72 28  pSrc;.      for(
15340 69 3d 70 53 72 63 2d 3e 6e 53 72 63 2d 31 3b 20  i=pSrc->nSrc-1; 
15350 69 2d 65 78 74 72 61 3e 3d 69 46 72 6f 6d 3b 20  i-extra>=iFrom; 
15360 69 2d 2d 29 7b 0a 20 20 20 20 20 20 20 20 70 53  i--){.        pS
15370 72 63 2d 3e 61 5b 69 5d 20 3d 20 70 53 72 63 2d  rc->a[i] = pSrc-
15380 3e 61 5b 69 2d 65 78 74 72 61 5d 3b 0a 20 20 20  >a[i-extra];.   
15390 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 66     }.    }.    f
153a0 6f 72 28 69 3d 30 3b 20 69 3c 6e 53 75 62 53 72  or(i=0; i<nSubSr
153b0 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 70  c; i++){.      p
153c0 53 72 63 2d 3e 61 5b 69 2b 69 46 72 6f 6d 5d 20  Src->a[i+iFrom] 
153d0 3d 20 70 53 75 62 53 72 63 2d 3e 61 5b 69 5d 3b  = pSubSrc->a[i];
153e0 0a 20 20 20 20 20 20 6d 65 6d 73 65 74 28 26 70  .      memset(&p
153f0 53 75 62 53 72 63 2d 3e 61 5b 69 5d 2c 20 30 2c  SubSrc->a[i], 0,
15400 20 73 69 7a 65 6f 66 28 70 53 75 62 53 72 63 2d   sizeof(pSubSrc-
15410 3e 61 5b 69 5d 29 29 3b 0a 20 20 20 20 7d 0a 20  >a[i]));.    }. 
15420 20 20 20 70 53 72 63 2d 3e 61 5b 69 46 72 6f 6d     pSrc->a[iFrom
15430 5d 2e 6a 6f 69 6e 74 79 70 65 20 3d 20 6a 6f 69  ].jointype = joi
15440 6e 74 79 70 65 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  ntype;.  }..  /*
15450 20 4e 6f 77 20 62 65 67 69 6e 20 73 75 62 73 74   Now begin subst
15460 69 74 75 74 69 6e 67 20 73 75 62 71 75 65 72 79  ituting subquery
15470 20 72 65 73 75 6c 74 20 73 65 74 20 65 78 70 72   result set expr
15480 65 73 73 69 6f 6e 73 20 66 6f 72 20 0a 20 20 2a  essions for .  *
15490 2a 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20  * references to 
154a0 74 68 65 20 69 50 61 72 65 6e 74 20 69 6e 20 74  the iParent in t
154b0 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 2e 0a  he outer query..
154c0 20 20 2a 2a 20 0a 20 20 2a 2a 20 45 78 61 6d 70    ** .  ** Examp
154d0 6c 65 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20  le:.  **.  **   
154e0 53 45 4c 45 43 54 20 61 2b 35 2c 20 62 2a 31 30  SELECT a+5, b*10
154f0 20 46 52 4f 4d 20 28 53 45 4c 45 43 54 20 78 2a   FROM (SELECT x*
15500 33 20 41 53 20 61 2c 20 79 2b 31 30 20 41 53 20  3 AS a, y+10 AS 
15510 62 20 46 52 4f 4d 20 74 31 29 20 57 48 45 52 45  b FROM t1) WHERE
15520 20 61 3e 62 3b 0a 20 20 2a 2a 20 20 20 5c 20 20   a>b;.  **   \  
15530 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15540 20 20 20 5c 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f     \____________
15550 5f 20 73 75 62 71 75 65 72 79 20 5f 5f 5f 5f 5f  _ subquery _____
15560 5f 5f 5f 5f 5f 2f 20 20 20 20 20 20 20 20 20 20  _____/          
15570 2f 0a 20 20 2a 2a 20 20 20 20 5c 5f 5f 5f 5f 5f  /.  **    \_____
15580 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f  ________________
15590 20 6f 75 74 65 72 20 71 75 65 72 79 20 5f 5f 5f   outer query ___
155a0 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f  ________________
155b0 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 2f 0a 20 20 2a  ___________/.  *
155c0 2a 0a 20 20 2a 2a 20 57 65 20 6c 6f 6f 6b 20 61  *.  ** We look a
155d0 74 20 65 76 65 72 79 20 65 78 70 72 65 73 73 69  t every expressi
155e0 6f 6e 20 69 6e 20 74 68 65 20 6f 75 74 65 72 20  on in the outer 
155f0 71 75 65 72 79 20 61 6e 64 20 65 76 65 72 79 20  query and every 
15600 70 6c 61 63 65 20 77 65 20 73 65 65 0a 20 20 2a  place we see.  *
15610 2a 20 22 61 22 20 77 65 20 73 75 62 73 74 69 74  * "a" we substit
15620 75 74 65 20 22 78 2a 33 22 20 61 6e 64 20 65 76  ute "x*3" and ev
15630 65 72 79 20 70 6c 61 63 65 20 77 65 20 73 65 65  ery place we see
15640 20 22 62 22 20 77 65 20 73 75 62 73 74 69 74 75   "b" we substitu
15650 74 65 20 22 79 2b 31 30 22 2e 0a 20 20 2a 2f 0a  te "y+10"..  */.
15660 20 20 70 4c 69 73 74 20 3d 20 70 2d 3e 70 45 4c    pList = p->pEL
15670 69 73 74 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  ist;.  for(i=0; 
15680 69 3c 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20  i<pList->nExpr; 
15690 69 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72 20 2a  i++){.    Expr *
156a0 70 45 78 70 72 3b 0a 20 20 20 20 69 66 28 20 70  pExpr;.    if( p
156b0 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65  List->a[i].zName
156c0 3d 3d 30 20 26 26 20 28 70 45 78 70 72 20 3d 20  ==0 && (pExpr = 
156d0 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70  pList->a[i].pExp
156e0 72 29 2d 3e 73 70 61 6e 2e 7a 21 3d 30 20 29 7b  r)->span.z!=0 ){
156f0 0a 20 20 20 20 20 20 70 4c 69 73 74 2d 3e 61 5b  .      pList->a[
15700 69 5d 2e 7a 4e 61 6d 65 20 3d 20 0a 20 20 20 20  i].zName = .    
15710 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
15720 44 62 53 74 72 4e 44 75 70 28 64 62 2c 20 28 63  DbStrNDup(db, (c
15730 68 61 72 2a 29 70 45 78 70 72 2d 3e 73 70 61 6e  har*)pExpr->span
15740 2e 7a 2c 20 70 45 78 70 72 2d 3e 73 70 61 6e 2e  .z, pExpr->span.
15750 6e 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  n);.    }.  }.  
15760 73 75 62 73 74 45 78 70 72 4c 69 73 74 28 64 62  substExprList(db
15770 2c 20 70 2d 3e 70 45 4c 69 73 74 2c 20 69 50 61  , p->pEList, iPa
15780 72 65 6e 74 2c 20 70 53 75 62 2d 3e 70 45 4c 69  rent, pSub->pELi
15790 73 74 29 3b 0a 20 20 69 66 28 20 69 73 41 67 67  st);.  if( isAgg
157a0 20 29 7b 0a 20 20 20 20 73 75 62 73 74 45 78 70   ){.    substExp
157b0 72 4c 69 73 74 28 64 62 2c 20 70 2d 3e 70 47 72  rList(db, p->pGr
157c0 6f 75 70 42 79 2c 20 69 50 61 72 65 6e 74 2c 20  oupBy, iParent, 
157d0 70 53 75 62 2d 3e 70 45 4c 69 73 74 29 3b 0a 20  pSub->pEList);. 
157e0 20 20 20 73 75 62 73 74 45 78 70 72 28 64 62 2c     substExpr(db,
157f0 20 70 2d 3e 70 48 61 76 69 6e 67 2c 20 69 50 61   p->pHaving, iPa
15800 72 65 6e 74 2c 20 70 53 75 62 2d 3e 70 45 4c 69  rent, pSub->pELi
15810 73 74 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  st);.  }.  if( p
15820 53 75 62 2d 3e 70 4f 72 64 65 72 42 79 20 29 7b  Sub->pOrderBy ){
15830 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e  .    assert( p->
15840 70 4f 72 64 65 72 42 79 3d 3d 30 20 29 3b 0a 20  pOrderBy==0 );. 
15850 20 20 20 70 2d 3e 70 4f 72 64 65 72 42 79 20 3d     p->pOrderBy =
15860 20 70 53 75 62 2d 3e 70 4f 72 64 65 72 42 79 3b   pSub->pOrderBy;
15870 0a 20 20 20 20 70 53 75 62 2d 3e 70 4f 72 64 65  .    pSub->pOrde
15880 72 42 79 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65  rBy = 0;.  }else
15890 20 69 66 28 20 70 2d 3e 70 4f 72 64 65 72 42 79   if( p->pOrderBy
158a0 20 29 7b 0a 20 20 20 20 73 75 62 73 74 45 78 70   ){.    substExp
158b0 72 4c 69 73 74 28 64 62 2c 20 70 2d 3e 70 4f 72  rList(db, p->pOr
158c0 64 65 72 42 79 2c 20 69 50 61 72 65 6e 74 2c 20  derBy, iParent, 
158d0 70 53 75 62 2d 3e 70 45 4c 69 73 74 29 3b 0a 20  pSub->pEList);. 
158e0 20 7d 0a 20 20 69 66 28 20 70 53 75 62 2d 3e 70   }.  if( pSub->p
158f0 57 68 65 72 65 20 29 7b 0a 20 20 20 20 70 57 68  Where ){.    pWh
15900 65 72 65 20 3d 20 73 71 6c 69 74 65 33 45 78 70  ere = sqlite3Exp
15910 72 44 75 70 28 64 62 2c 20 70 53 75 62 2d 3e 70  rDup(db, pSub->p
15920 57 68 65 72 65 29 3b 0a 20 20 7d 65 6c 73 65 7b  Where);.  }else{
15930 0a 20 20 20 20 70 57 68 65 72 65 20 3d 20 30 3b  .    pWhere = 0;
15940 0a 20 20 7d 0a 20 20 69 66 28 20 73 75 62 71 75  .  }.  if( subqu
15950 65 72 79 49 73 41 67 67 20 29 7b 0a 20 20 20 20  eryIsAgg ){.    
15960 61 73 73 65 72 74 28 20 70 2d 3e 70 48 61 76 69  assert( p->pHavi
15970 6e 67 3d 3d 30 20 29 3b 0a 20 20 20 20 70 2d 3e  ng==0 );.    p->
15980 70 48 61 76 69 6e 67 20 3d 20 70 2d 3e 70 57 68  pHaving = p->pWh
15990 65 72 65 3b 0a 20 20 20 20 70 2d 3e 70 57 68 65  ere;.    p->pWhe
159a0 72 65 20 3d 20 70 57 68 65 72 65 3b 0a 20 20 20  re = pWhere;.   
159b0 20 73 75 62 73 74 45 78 70 72 28 64 62 2c 20 70   substExpr(db, p
159c0 2d 3e 70 48 61 76 69 6e 67 2c 20 69 50 61 72 65  ->pHaving, iPare
159d0 6e 74 2c 20 70 53 75 62 2d 3e 70 45 4c 69 73 74  nt, pSub->pEList
159e0 29 3b 0a 20 20 20 20 70 2d 3e 70 48 61 76 69 6e  );.    p->pHavin
159f0 67 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 41  g = sqlite3ExprA
15a00 6e 64 28 64 62 2c 20 70 2d 3e 70 48 61 76 69 6e  nd(db, p->pHavin
15a10 67 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  g, .            
15a20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15a30 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 44      sqlite3ExprD
15a40 75 70 28 64 62 2c 20 70 53 75 62 2d 3e 70 48 61  up(db, pSub->pHa
15a50 76 69 6e 67 29 29 3b 0a 20 20 20 20 61 73 73 65  ving));.    asse
15a60 72 74 28 20 70 2d 3e 70 47 72 6f 75 70 42 79 3d  rt( p->pGroupBy=
15a70 3d 30 20 29 3b 0a 20 20 20 20 70 2d 3e 70 47 72  =0 );.    p->pGr
15a80 6f 75 70 42 79 20 3d 20 73 71 6c 69 74 65 33 45  oupBy = sqlite3E
15a90 78 70 72 4c 69 73 74 44 75 70 28 64 62 2c 20 70  xprListDup(db, p
15aa0 53 75 62 2d 3e 70 47 72 6f 75 70 42 79 29 3b 0a  Sub->pGroupBy);.
15ab0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 75 62    }else{.    sub
15ac0 73 74 45 78 70 72 28 64 62 2c 20 70 2d 3e 70 57  stExpr(db, p->pW
15ad0 68 65 72 65 2c 20 69 50 61 72 65 6e 74 2c 20 70  here, iParent, p
15ae0 53 75 62 2d 3e 70 45 4c 69 73 74 29 3b 0a 20 20  Sub->pEList);.  
15af0 20 20 70 2d 3e 70 57 68 65 72 65 20 3d 20 73 71    p->pWhere = sq
15b00 6c 69 74 65 33 45 78 70 72 41 6e 64 28 64 62 2c  lite3ExprAnd(db,
15b10 20 70 2d 3e 70 57 68 65 72 65 2c 20 70 57 68 65   p->pWhere, pWhe
15b20 72 65 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54  re);.  }..  /* T
15b30 68 65 20 66 6c 61 74 74 65 6e 65 64 20 71 75 65  he flattened que
15b40 72 79 20 69 73 20 64 69 73 74 69 6e 63 74 20 69  ry is distinct i
15b50 66 20 65 69 74 68 65 72 20 74 68 65 20 69 6e 6e  f either the inn
15b60 65 72 20 6f 72 20 74 68 65 0a 20 20 2a 2a 20 6f  er or the.  ** o
15b70 75 74 65 72 20 71 75 65 72 79 20 69 73 20 64 69  uter query is di
15b80 73 74 69 6e 63 74 2e 20 0a 20 20 2a 2f 0a 20 20  stinct. .  */.  
15b90 70 2d 3e 69 73 44 69 73 74 69 6e 63 74 20 3d 20  p->isDistinct = 
15ba0 70 2d 3e 69 73 44 69 73 74 69 6e 63 74 20 7c 7c  p->isDistinct ||
15bb0 20 70 53 75 62 2d 3e 69 73 44 69 73 74 69 6e 63   pSub->isDistinc
15bc0 74 3b 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 53 45  t;..  /*.  ** SE
15bd0 4c 45 43 54 20 2e 2e 2e 20 46 52 4f 4d 20 28 53  LECT ... FROM (S
15be0 45 4c 45 43 54 20 2e 2e 2e 20 4c 49 4d 49 54 20  ELECT ... LIMIT 
15bf0 61 20 4f 46 46 53 45 54 20 62 29 20 4c 49 4d 49  a OFFSET b) LIMI
15c00 54 20 78 20 4f 46 46 53 45 54 20 79 3b 0a 20 20  T x OFFSET y;.  
15c10 2a 2a 0a 20 20 2a 2a 20 4f 6e 65 20 69 73 20 74  **.  ** One is t
15c20 65 6d 70 74 65 64 20 74 6f 20 74 72 79 20 74 6f  empted to try to
15c30 20 61 64 64 20 61 20 61 6e 64 20 62 20 74 6f 20   add a and b to 
15c40 63 6f 6d 62 69 6e 65 20 74 68 65 20 6c 69 6d 69  combine the limi
15c50 74 73 2e 20 20 42 75 74 20 74 68 69 73 0a 20 20  ts.  But this.  
15c60 2a 2a 20 64 6f 65 73 20 6e 6f 74 20 77 6f 72 6b  ** does not work
15c70 20 69 66 20 65 69 74 68 65 72 20 6c 69 6d 69 74   if either limit
15c80 20 69 73 20 6e 65 67 61 74 69 76 65 2e 0a 20 20   is negative..  
15c90 2a 2f 0a 20 20 69 66 28 20 70 53 75 62 2d 3e 70  */.  if( pSub->p
15ca0 4c 69 6d 69 74 20 29 7b 0a 20 20 20 20 70 2d 3e  Limit ){.    p->
15cb0 70 4c 69 6d 69 74 20 3d 20 70 53 75 62 2d 3e 70  pLimit = pSub->p
15cc0 4c 69 6d 69 74 3b 0a 20 20 20 20 70 53 75 62 2d  Limit;.    pSub-
15cd0 3e 70 4c 69 6d 69 74 20 3d 20 30 3b 0a 20 20 7d  >pLimit = 0;.  }
15ce0 0a 0a 20 20 2f 2a 20 46 69 6e 69 61 6c 6c 79 2c  ..  /* Finially,
15cf0 20 64 65 6c 65 74 65 20 77 68 61 74 20 69 73 20   delete what is 
15d00 6c 65 66 74 20 6f 66 20 74 68 65 20 73 75 62 71  left of the subq
15d10 75 65 72 79 20 61 6e 64 20 72 65 74 75 72 6e 0a  uery and return.
15d20 20 20 2a 2a 20 73 75 63 63 65 73 73 2e 0a 20 20    ** success..  
15d30 2a 2f 0a 20 20 73 71 6c 69 74 65 33 53 65 6c 65  */.  sqlite3Sele
15d40 63 74 44 65 6c 65 74 65 28 70 53 75 62 29 3b 0a  ctDelete(pSub);.
15d50 20 20 72 65 74 75 72 6e 20 31 3b 0a 7d 0a 23 65    return 1;.}.#e
15d60 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f  ndif /* SQLITE_O
15d70 4d 49 54 5f 56 49 45 57 20 2a 2f 0a 0a 2f 2a 0a  MIT_VIEW */../*.
15d80 2a 2a 20 41 6e 61 6c 79 7a 65 20 74 68 65 20 53  ** Analyze the S
15d90 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20  ELECT statement 
15da0 70 61 73 73 65 64 20 61 73 20 61 6e 20 61 72 67  passed as an arg
15db0 75 6d 65 6e 74 20 74 6f 20 73 65 65 20 69 66 20  ument to see if 
15dc0 69 74 0a 2a 2a 20 69 73 20 61 20 6d 69 6e 28 29  it.** is a min()
15dd0 20 6f 72 20 6d 61 78 28 29 20 71 75 65 72 79 2e   or max() query.
15de0 20 52 65 74 75 72 6e 20 4f 52 44 45 52 42 59 5f   Return ORDERBY_
15df0 4d 49 4e 20 6f 72 20 4f 52 44 45 52 42 59 5f 4d  MIN or ORDERBY_M
15e00 41 58 20 69 66 20 0a 2a 2a 20 69 74 20 69 73 2c  AX if .** it is,
15e10 20 6f 72 20 30 20 6f 74 68 65 72 77 69 73 65 2e   or 0 otherwise.
15e20 20 41 74 20 70 72 65 73 65 6e 74 2c 20 61 20 71   At present, a q
15e30 75 65 72 79 20 69 73 20 63 6f 6e 73 69 64 65 72  uery is consider
15e40 65 64 20 74 6f 20 62 65 0a 2a 2a 20 61 20 6d 69  ed to be.** a mi
15e50 6e 28 29 2f 6d 61 78 28 29 20 71 75 65 72 79 20  n()/max() query 
15e60 69 66 3a 0a 2a 2a 0a 2a 2a 20 20 20 31 2e 20 54  if:.**.**   1. T
15e70 68 65 72 65 20 69 73 20 61 20 73 69 6e 67 6c 65  here is a single
15e80 20 6f 62 6a 65 63 74 20 69 6e 20 74 68 65 20 46   object in the F
15e90 52 4f 4d 20 63 6c 61 75 73 65 2e 0a 2a 2a 0a 2a  ROM clause..**.*
15ea0 2a 20 20 20 32 2e 20 54 68 65 72 65 20 69 73 20  *   2. There is 
15eb0 61 20 73 69 6e 67 6c 65 20 65 78 70 72 65 73 73  a single express
15ec0 69 6f 6e 20 69 6e 20 74 68 65 20 72 65 73 75 6c  ion in the resul
15ed0 74 20 73 65 74 2c 20 61 6e 64 20 69 74 20 69 73  t set, and it is
15ee0 0a 2a 2a 20 20 20 20 20 20 65 69 74 68 65 72 20  .**      either 
15ef0 6d 69 6e 28 78 29 20 6f 72 20 6d 61 78 28 78 29  min(x) or max(x)
15f00 2c 20 77 68 65 72 65 20 78 20 69 73 20 61 20 63  , where x is a c
15f10 6f 6c 75 6d 6e 20 72 65 66 65 72 65 6e 63 65 2e  olumn reference.
15f20 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6d  .*/.static int m
15f30 69 6e 4d 61 78 51 75 65 72 79 28 50 61 72 73 65  inMaxQuery(Parse
15f40 20 2a 70 50 61 72 73 65 2c 20 53 65 6c 65 63 74   *pParse, Select
15f50 20 2a 70 29 7b 0a 20 20 45 78 70 72 20 2a 70 45   *p){.  Expr *pE
15f60 78 70 72 3b 0a 20 20 45 78 70 72 4c 69 73 74 20  xpr;.  ExprList 
15f70 2a 70 45 4c 69 73 74 20 3d 20 70 2d 3e 70 45 4c  *pEList = p->pEL
15f80 69 73 74 3b 0a 0a 20 20 69 66 28 20 70 45 4c 69  ist;..  if( pELi
15f90 73 74 2d 3e 6e 45 78 70 72 21 3d 31 20 29 20 72  st->nExpr!=1 ) r
15fa0 65 74 75 72 6e 20 4f 52 44 45 52 42 59 5f 4e 4f  eturn ORDERBY_NO
15fb0 52 4d 41 4c 3b 0a 20 20 70 45 78 70 72 20 3d 20  RMAL;.  pExpr = 
15fc0 70 45 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78  pEList->a[0].pEx
15fd0 70 72 3b 0a 20 20 70 45 4c 69 73 74 20 3d 20 70  pr;.  pEList = p
15fe0 45 78 70 72 2d 3e 70 4c 69 73 74 3b 0a 20 20 69  Expr->pList;.  i
15ff0 66 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b  f( pExpr->op!=TK
16000 5f 41 47 47 5f 46 55 4e 43 54 49 4f 4e 20 7c 7c  _AGG_FUNCTION ||
16010 20 70 45 4c 69 73 74 3d 3d 30 20 7c 7c 20 70 45   pEList==0 || pE
16020 4c 69 73 74 2d 3e 6e 45 78 70 72 21 3d 31 20 29  List->nExpr!=1 )
16030 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28   return 0;.  if(
16040 20 70 45 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45   pEList->a[0].pE
16050 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 41 47 47 5f  xpr->op!=TK_AGG_
16060 43 4f 4c 55 4d 4e 20 29 20 72 65 74 75 72 6e 20  COLUMN ) return 
16070 4f 52 44 45 52 42 59 5f 4e 4f 52 4d 41 4c 3b 0a  ORDERBY_NORMAL;.
16080 20 20 69 66 28 20 70 45 78 70 72 2d 3e 74 6f 6b    if( pExpr->tok
16090 65 6e 2e 6e 21 3d 33 20 29 20 72 65 74 75 72 6e  en.n!=3 ) return
160a0 20 4f 52 44 45 52 42 59 5f 4e 4f 52 4d 41 4c 3b   ORDERBY_NORMAL;
160b0 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 74  .  if( sqlite3St
160c0 72 4e 49 43 6d 70 28 28 63 68 61 72 2a 29 70 45  rNICmp((char*)pE
160d0 78 70 72 2d 3e 74 6f 6b 65 6e 2e 7a 2c 22 6d 69  xpr->token.z,"mi
160e0 6e 22 2c 33 29 3d 3d 30 20 29 7b 0a 20 20 20 20  n",3)==0 ){.    
160f0 72 65 74 75 72 6e 20 4f 52 44 45 52 42 59 5f 4d  return ORDERBY_M
16100 49 4e 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20  IN;.  }else if( 
16110 73 71 6c 69 74 65 33 53 74 72 4e 49 43 6d 70 28  sqlite3StrNICmp(
16120 28 63 68 61 72 2a 29 70 45 78 70 72 2d 3e 74 6f  (char*)pExpr->to
16130 6b 65 6e 2e 7a 2c 22 6d 61 78 22 2c 33 29 3d 3d  ken.z,"max",3)==
16140 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  0 ){.    return 
16150 4f 52 44 45 52 42 59 5f 4d 41 58 3b 0a 20 20 7d  ORDERBY_MAX;.  }
16160 0a 20 20 72 65 74 75 72 6e 20 4f 52 44 45 52 42  .  return ORDERB
16170 59 5f 4e 4f 52 4d 41 4c 3b 0a 7d 0a 0a 2f 2a 0a  Y_NORMAL;.}../*.
16180 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
16190 72 65 73 6f 6c 76 65 73 20 61 6e 79 20 6e 61 6d  resolves any nam
161a0 65 73 20 75 73 65 64 20 69 6e 20 74 68 65 20 72  es used in the r
161b0 65 73 75 6c 74 20 73 65 74 20 6f 66 20 74 68 65  esult set of the
161c0 0a 2a 2a 20 73 75 70 70 6c 69 65 64 20 53 45 4c  .** supplied SEL
161d0 45 43 54 20 73 74 61 74 65 6d 65 6e 74 2e 20 49  ECT statement. I
161e0 66 20 74 68 65 20 53 45 4c 45 43 54 20 73 74 61  f the SELECT sta
161f0 74 65 6d 65 6e 74 20 62 65 69 6e 67 20 72 65 73  tement being res
16200 6f 6c 76 65 64 0a 2a 2a 20 69 73 20 61 20 73 75  olved.** is a su
16210 62 2d 73 65 6c 65 63 74 2c 20 74 68 65 6e 20 70  b-select, then p
16220 4f 75 74 65 72 4e 43 20 69 73 20 61 20 70 6f 69  OuterNC is a poi
16230 6e 74 65 72 20 74 6f 20 74 68 65 20 4e 61 6d 65  nter to the Name
16240 43 6f 6e 74 65 78 74 20 0a 2a 2a 20 6f 66 20 74  Context .** of t
16250 68 65 20 70 61 72 65 6e 74 20 53 45 4c 45 43 54  he parent SELECT
16260 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
16270 53 65 6c 65 63 74 52 65 73 6f 6c 76 65 28 0a 20  SelectResolve(. 
16280 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
16290 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70          /* The p
162a0 61 72 73 65 72 20 63 6f 6e 74 65 78 74 20 2a 2f  arser context */
162b0 0a 20 20 53 65 6c 65 63 74 20 2a 70 2c 20 20 20  .  Select *p,   
162c0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
162d0 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
162e0 74 20 62 65 69 6e 67 20 63 6f 64 65 64 2e 20 2a  t being coded. *
162f0 2f 0a 20 20 4e 61 6d 65 43 6f 6e 74 65 78 74 20  /.  NameContext 
16300 2a 70 4f 75 74 65 72 4e 43 20 20 2f 2a 20 54 68  *pOuterNC  /* Th
16310 65 20 6f 75 74 65 72 20 6e 61 6d 65 20 63 6f 6e  e outer name con
16320 74 65 78 74 2e 20 4d 61 79 20 62 65 20 4e 55 4c  text. May be NUL
16330 4c 2e 20 2a 2f 0a 29 7b 0a 20 20 45 78 70 72 4c  L. */.){.  ExprL
16340 69 73 74 20 2a 70 45 4c 69 73 74 3b 20 20 20 20  ist *pEList;    
16350 20 20 20 20 20 20 2f 2a 20 52 65 73 75 6c 74 20        /* Result 
16360 73 65 74 2e 20 2a 2f 0a 20 20 69 6e 74 20 69 3b  set. */.  int i;
16370 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16380 20 20 20 20 20 2f 2a 20 46 6f 72 2d 6c 6f 6f 70       /* For-loop
16390 20 76 61 72 69 61 62 6c 65 20 75 73 65 64 20 69   variable used i
163a0 6e 20 6d 75 6c 74 69 70 6c 65 20 70 6c 61 63 65  n multiple place
163b0 73 20 2a 2f 0a 20 20 4e 61 6d 65 43 6f 6e 74 65  s */.  NameConte
163c0 78 74 20 73 4e 43 3b 20 20 20 20 20 20 20 20 20  xt sNC;         
163d0 20 20 2f 2a 20 4c 6f 63 61 6c 20 6e 61 6d 65 2d    /* Local name-
163e0 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78 70  context */.  Exp
163f0 72 4c 69 73 74 20 2a 70 47 72 6f 75 70 42 79 3b  rList *pGroupBy;
16400 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 67          /* The g
16410 72 6f 75 70 20 62 79 20 63 6c 61 75 73 65 20 2a  roup by clause *
16420 2f 0a 0a 20 20 2f 2a 20 49 66 20 74 68 69 73 20  /..  /* If this 
16430 72 6f 75 74 69 6e 65 20 68 61 73 20 72 75 6e 20  routine has run 
16440 62 65 66 6f 72 65 2c 20 72 65 74 75 72 6e 20 69  before, return i
16450 6d 6d 65 64 69 61 74 65 6c 79 2e 20 2a 2f 0a 20  mmediately. */. 
16460 20 69 66 28 20 70 2d 3e 69 73 52 65 73 6f 6c 76   if( p->isResolv
16470 65 64 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  ed ){.    assert
16480 28 20 21 70 4f 75 74 65 72 4e 43 20 29 3b 0a 20  ( !pOuterNC );. 
16490 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
164a0 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 70 2d 3e 69 73  _OK;.  }.  p->is
164b0 52 65 73 6f 6c 76 65 64 20 3d 20 31 3b 0a 0a 20  Resolved = 1;.. 
164c0 20 2f 2a 20 49 66 20 74 68 65 72 65 20 68 61 76   /* If there hav
164d0 65 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 65  e already been e
164e0 72 72 6f 72 73 2c 20 64 6f 20 6e 6f 74 68 69 6e  rrors, do nothin
164f0 67 2e 20 2a 2f 0a 20 20 69 66 28 20 70 50 61 72  g. */.  if( pPar
16500 73 65 2d 3e 6e 45 72 72 3e 30 20 29 7b 0a 20 20  se->nErr>0 ){.  
16510 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
16520 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  ERROR;.  }..  /*
16530 20 50 72 65 70 61 72 65 20 74 68 65 20 73 65 6c   Prepare the sel
16540 65 63 74 20 73 74 61 74 65 6d 65 6e 74 2e 20 54  ect statement. T
16550 68 69 73 20 63 61 6c 6c 20 77 69 6c 6c 20 61 6c  his call will al
16560 6c 6f 63 61 74 65 20 61 6c 6c 20 63 75 72 73 6f  locate all curso
16570 72 73 0a 20 20 2a 2a 20 72 65 71 75 69 72 65 64  rs.  ** required
16580 20 74 6f 20 68 61 6e 64 6c 65 20 74 68 65 20 74   to handle the t
16590 61 62 6c 65 73 20 61 6e 64 20 73 75 62 71 75 65  ables and subque
165a0 72 69 65 73 20 69 6e 20 74 68 65 20 46 52 4f 4d  ries in the FROM
165b0 20 63 6c 61 75 73 65 2e 0a 20 20 2a 2f 0a 20 20   clause..  */.  
165c0 69 66 28 20 70 72 65 70 53 65 6c 65 63 74 53 74  if( prepSelectSt
165d0 6d 74 28 70 50 61 72 73 65 2c 20 70 29 20 29 7b  mt(pParse, p) ){
165e0 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
165f0 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20  TE_ERROR;.  }.. 
16600 20 2f 2a 20 52 65 73 6f 6c 76 65 20 74 68 65 20   /* Resolve the 
16610 65 78 70 72 65 73 73 69 6f 6e 73 20 69 6e 20 74  expressions in t
16620 68 65 20 4c 49 4d 49 54 20 61 6e 64 20 4f 46 46  he LIMIT and OFF
16630 53 45 54 20 63 6c 61 75 73 65 73 2e 20 54 68 65  SET clauses. The
16640 73 65 0a 20 20 2a 2a 20 61 72 65 20 6e 6f 74 20  se.  ** are not 
16650 61 6c 6c 6f 77 65 64 20 74 6f 20 72 65 66 65 72  allowed to refer
16660 20 74 6f 20 61 6e 79 20 6e 61 6d 65 73 2c 20 73   to any names, s
16670 6f 20 70 61 73 73 20 61 6e 20 65 6d 70 74 79 20  o pass an empty 
16680 4e 61 6d 65 43 6f 6e 74 65 78 74 2e 0a 20 20 2a  NameContext..  *
16690 2f 0a 20 20 6d 65 6d 73 65 74 28 26 73 4e 43 2c  /.  memset(&sNC,
166a0 20 30 2c 20 73 69 7a 65 6f 66 28 73 4e 43 29 29   0, sizeof(sNC))
166b0 3b 0a 20 20 73 4e 43 2e 70 50 61 72 73 65 20 3d  ;.  sNC.pParse =
166c0 20 70 50 61 72 73 65 3b 0a 20 20 69 66 28 20 73   pParse;.  if( s
166d0 71 6c 69 74 65 33 45 78 70 72 52 65 73 6f 6c 76  qlite3ExprResolv
166e0 65 4e 61 6d 65 73 28 26 73 4e 43 2c 20 70 2d 3e  eNames(&sNC, p->
166f0 70 4c 69 6d 69 74 29 20 7c 7c 0a 20 20 20 20 20  pLimit) ||.     
16700 20 73 71 6c 69 74 65 33 45 78 70 72 52 65 73 6f   sqlite3ExprReso
16710 6c 76 65 4e 61 6d 65 73 28 26 73 4e 43 2c 20 70  lveNames(&sNC, p
16720 2d 3e 70 4f 66 66 73 65 74 29 20 29 7b 0a 20 20  ->pOffset) ){.  
16730 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
16740 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  ERROR;.  }..  /*
16750 20 53 65 74 20 75 70 20 74 68 65 20 6c 6f 63 61   Set up the loca
16760 6c 20 6e 61 6d 65 2d 63 6f 6e 74 65 78 74 20 74  l name-context t
16770 6f 20 70 61 73 73 20 74 6f 20 45 78 70 72 52 65  o pass to ExprRe
16780 73 6f 6c 76 65 4e 61 6d 65 73 28 29 20 74 6f 0a  solveNames() to.
16790 20 20 2a 2a 20 72 65 73 6f 6c 76 65 20 74 68 65    ** resolve the
167a0 20 65 78 70 72 65 73 73 69 6f 6e 2d 6c 69 73 74   expression-list
167b0 2e 0a 20 20 2a 2f 0a 20 20 73 4e 43 2e 61 6c 6c  ..  */.  sNC.all
167c0 6f 77 41 67 67 20 3d 20 31 3b 0a 20 20 73 4e 43  owAgg = 1;.  sNC
167d0 2e 70 53 72 63 4c 69 73 74 20 3d 20 70 2d 3e 70  .pSrcList = p->p
167e0 53 72 63 3b 0a 20 20 73 4e 43 2e 70 4e 65 78 74  Src;.  sNC.pNext
167f0 20 3d 20 70 4f 75 74 65 72 4e 43 3b 0a 0a 20 20   = pOuterNC;..  
16800 2f 2a 20 52 65 73 6f 6c 76 65 20 6e 61 6d 65 73  /* Resolve names
16810 20 69 6e 20 74 68 65 20 72 65 73 75 6c 74 20 73   in the result s
16820 65 74 2e 20 2a 2f 0a 20 20 70 45 4c 69 73 74 20  et. */.  pEList 
16830 3d 20 70 2d 3e 70 45 4c 69 73 74 3b 0a 20 20 69  = p->pEList;.  i
16840 66 28 20 21 70 45 4c 69 73 74 20 29 20 72 65 74  f( !pEList ) ret
16850 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52  urn SQLITE_ERROR
16860 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70  ;.  for(i=0; i<p
16870 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b  EList->nExpr; i+
16880 2b 29 7b 0a 20 20 20 20 45 78 70 72 20 2a 70 58  +){.    Expr *pX
16890 20 3d 20 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e   = pEList->a[i].
168a0 70 45 78 70 72 3b 0a 20 20 20 20 69 66 28 20 73  pExpr;.    if( s
168b0 71 6c 69 74 65 33 45 78 70 72 52 65 73 6f 6c 76  qlite3ExprResolv
168c0 65 4e 61 6d 65 73 28 26 73 4e 43 2c 20 70 58 29  eNames(&sNC, pX)
168d0 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
168e0 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20   SQLITE_ERROR;. 
168f0 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49     }.  }..  /* I
16900 66 20 74 68 65 72 65 20 61 72 65 20 6e 6f 20 61  f there are no a
16910 67 67 72 65 67 61 74 65 20 66 75 6e 63 74 69 6f  ggregate functio
16920 6e 73 20 69 6e 20 74 68 65 20 72 65 73 75 6c 74  ns in the result
16930 2d 73 65 74 2c 20 61 6e 64 20 6e 6f 20 47 52 4f  -set, and no GRO
16940 55 50 20 42 59 20 0a 20 20 2a 2a 20 65 78 70 72  UP BY .  ** expr
16950 65 73 73 69 6f 6e 2c 20 64 6f 20 6e 6f 74 20 61  ession, do not a
16960 6c 6c 6f 77 20 61 67 67 72 65 67 61 74 65 73 20  llow aggregates 
16970 69 6e 20 61 6e 79 20 6f 66 20 74 68 65 20 6f 74  in any of the ot
16980 68 65 72 20 65 78 70 72 65 73 73 69 6f 6e 73 2e  her expressions.
16990 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  .  */.  assert( 
169a0 21 70 2d 3e 69 73 41 67 67 20 29 3b 0a 20 20 70  !p->isAgg );.  p
169b0 47 72 6f 75 70 42 79 20 3d 20 70 2d 3e 70 47 72  GroupBy = p->pGr
169c0 6f 75 70 42 79 3b 0a 20 20 69 66 28 20 70 47 72  oupBy;.  if( pGr
169d0 6f 75 70 42 79 20 7c 7c 20 73 4e 43 2e 68 61 73  oupBy || sNC.has
169e0 41 67 67 20 29 7b 0a 20 20 20 20 70 2d 3e 69 73  Agg ){.    p->is
169f0 41 67 67 20 3d 20 31 3b 0a 20 20 7d 65 6c 73 65  Agg = 1;.  }else
16a00 7b 0a 20 20 20 20 73 4e 43 2e 61 6c 6c 6f 77 41  {.    sNC.allowA
16a10 67 67 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f  gg = 0;.  }..  /
16a20 2a 20 49 66 20 61 20 48 41 56 49 4e 47 20 63 6c  * If a HAVING cl
16a30 61 75 73 65 20 69 73 20 70 72 65 73 65 6e 74 2c  ause is present,
16a40 20 74 68 65 6e 20 74 68 65 72 65 20 6d 75 73 74   then there must
16a50 20 62 65 20 61 20 47 52 4f 55 50 20 42 59 20 63   be a GROUP BY c
16a60 6c 61 75 73 65 2e 0a 20 20 2a 2f 0a 20 20 69 66  lause..  */.  if
16a70 28 20 70 2d 3e 70 48 61 76 69 6e 67 20 26 26 20  ( p->pHaving && 
16a80 21 70 47 72 6f 75 70 42 79 20 29 7b 0a 20 20 20  !pGroupBy ){.   
16a90 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
16aa0 28 70 50 61 72 73 65 2c 20 22 61 20 47 52 4f 55  (pParse, "a GROU
16ab0 50 20 42 59 20 63 6c 61 75 73 65 20 69 73 20 72  P BY clause is r
16ac0 65 71 75 69 72 65 64 20 62 65 66 6f 72 65 20 48  equired before H
16ad0 41 56 49 4e 47 22 29 3b 0a 20 20 20 20 72 65 74  AVING");.    ret
16ae0 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52  urn SQLITE_ERROR
16af0 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 64 64 20  ;.  }..  /* Add 
16b00 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 6c  the expression l
16b10 69 73 74 20 74 6f 20 74 68 65 20 6e 61 6d 65 2d  ist to the name-
16b20 63 6f 6e 74 65 78 74 20 62 65 66 6f 72 65 20 70  context before p
16b30 61 72 73 69 6e 67 20 74 68 65 0a 20 20 2a 2a 20  arsing the.  ** 
16b40 6f 74 68 65 72 20 65 78 70 72 65 73 73 69 6f 6e  other expression
16b50 73 20 69 6e 20 74 68 65 20 53 45 4c 45 43 54 20  s in the SELECT 
16b60 73 74 61 74 65 6d 65 6e 74 2e 20 54 68 69 73 20  statement. This 
16b70 69 73 20 73 6f 20 74 68 61 74 0a 20 20 2a 2a 20  is so that.  ** 
16b80 65 78 70 72 65 73 73 69 6f 6e 73 20 69 6e 20 74  expressions in t
16b90 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  he WHERE clause 
16ba0 28 65 74 63 2e 29 20 63 61 6e 20 72 65 66 65 72  (etc.) can refer
16bb0 20 74 6f 20 65 78 70 72 65 73 73 69 6f 6e 73 20   to expressions 
16bc0 62 79 0a 20 20 2a 2a 20 61 6c 69 61 73 65 73 20  by.  ** aliases 
16bd0 69 6e 20 74 68 65 20 72 65 73 75 6c 74 20 73 65  in the result se
16be0 74 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 4d 69 6e  t..  **.  ** Min
16bf0 6f 72 20 70 6f 69 6e 74 3a 20 49 66 20 74 68 69  or point: If thi
16c00 73 20 69 73 20 74 68 65 20 63 61 73 65 2c 20 74  s is the case, t
16c10 68 65 6e 20 74 68 65 20 65 78 70 72 65 73 73 69  hen the expressi
16c20 6f 6e 20 77 69 6c 6c 20 62 65 0a 20 20 2a 2a 20  on will be.  ** 
16c30 72 65 2d 65 76 61 6c 75 61 74 65 64 20 66 6f 72  re-evaluated for
16c40 20 65 61 63 68 20 72 65 66 65 72 65 6e 63 65 20   each reference 
16c50 74 6f 20 69 74 2e 0a 20 20 2a 2f 0a 20 20 73 4e  to it..  */.  sN
16c60 43 2e 70 45 4c 69 73 74 20 3d 20 70 2d 3e 70 45  C.pEList = p->pE
16c70 4c 69 73 74 3b 0a 20 20 69 66 28 20 73 71 6c 69  List;.  if( sqli
16c80 74 65 33 45 78 70 72 52 65 73 6f 6c 76 65 4e 61  te3ExprResolveNa
16c90 6d 65 73 28 26 73 4e 43 2c 20 70 2d 3e 70 57 68  mes(&sNC, p->pWh
16ca0 65 72 65 29 20 7c 7c 0a 20 20 20 20 20 73 71 6c  ere) ||.     sql
16cb0 69 74 65 33 45 78 70 72 52 65 73 6f 6c 76 65 4e  ite3ExprResolveN
16cc0 61 6d 65 73 28 26 73 4e 43 2c 20 70 2d 3e 70 48  ames(&sNC, p->pH
16cd0 61 76 69 6e 67 29 20 29 7b 0a 20 20 20 20 72 65  aving) ){.    re
16ce0 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f  turn SQLITE_ERRO
16cf0 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e  R;.  }.  if( p->
16d00 70 50 72 69 6f 72 3d 3d 30 20 29 7b 0a 20 20 20  pPrior==0 ){.   
16d10 20 69 66 28 20 70 72 6f 63 65 73 73 4f 72 64 65   if( processOrde
16d20 72 47 72 6f 75 70 42 79 28 70 50 61 72 73 65 2c  rGroupBy(pParse,
16d30 20 70 2c 20 70 2d 3e 70 4f 72 64 65 72 42 79 2c   p, p->pOrderBy,
16d40 20 31 2c 20 26 73 4e 43 2e 68 61 73 41 67 67 29   1, &sNC.hasAgg)
16d50 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
16d60 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20   SQLITE_ERROR;. 
16d70 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 70     }.  }.  if( p
16d80 72 6f 63 65 73 73 4f 72 64 65 72 47 72 6f 75 70  rocessOrderGroup
16d90 42 79 28 70 50 61 72 73 65 2c 20 70 2c 20 70 47  By(pParse, p, pG
16da0 72 6f 75 70 42 79 2c 20 30 2c 20 26 73 4e 43 2e  roupBy, 0, &sNC.
16db0 68 61 73 41 67 67 29 20 29 7b 0a 20 20 20 20 72  hasAgg) ){.    r
16dc0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52  eturn SQLITE_ERR
16dd0 4f 52 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70  OR;.  }..  if( p
16de0 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f  Parse->db->mallo
16df0 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 72  cFailed ){.    r
16e00 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d  eturn SQLITE_NOM
16e10 45 4d 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61  EM;.  }..  /* Ma
16e20 6b 65 20 73 75 72 65 20 74 68 65 20 47 52 4f 55  ke sure the GROU
16e30 50 20 42 59 20 63 6c 61 75 73 65 20 64 6f 65 73  P BY clause does
16e40 20 6e 6f 74 20 63 6f 6e 74 61 69 6e 20 61 67 67   not contain agg
16e50 72 65 67 61 74 65 20 66 75 6e 63 74 69 6f 6e 73  regate functions
16e60 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 47 72  ..  */.  if( pGr
16e70 6f 75 70 42 79 20 29 7b 0a 20 20 20 20 73 74 72  oupBy ){.    str
16e80 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65  uct ExprList_ite
16e90 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 0a 20 20 20  m *pItem;.  .   
16ea0 20 66 6f 72 28 69 3d 30 2c 20 70 49 74 65 6d 3d   for(i=0, pItem=
16eb0 70 47 72 6f 75 70 42 79 2d 3e 61 3b 20 69 3c 70  pGroupBy->a; i<p
16ec0 47 72 6f 75 70 42 79 2d 3e 6e 45 78 70 72 3b 20  GroupBy->nExpr; 
16ed0 69 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20  i++, pItem++){. 
16ee0 20 20 20 20 20 69 66 28 20 45 78 70 72 48 61 73       if( ExprHas
16ef0 50 72 6f 70 65 72 74 79 28 70 49 74 65 6d 2d 3e  Property(pItem->
16f00 70 45 78 70 72 2c 20 45 50 5f 41 67 67 29 20 29  pExpr, EP_Agg) )
16f10 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
16f20 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
16f30 2c 20 22 61 67 67 72 65 67 61 74 65 20 66 75 6e  , "aggregate fun
16f40 63 74 69 6f 6e 73 20 61 72 65 20 6e 6f 74 20 61  ctions are not a
16f50 6c 6c 6f 77 65 64 20 69 6e 20 22 0a 20 20 20 20  llowed in ".    
16f60 20 20 20 20 20 20 20 20 22 74 68 65 20 47 52 4f          "the GRO
16f70 55 50 20 42 59 20 63 6c 61 75 73 65 22 29 3b 0a  UP BY clause");.
16f80 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53          return S
16f90 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20  QLITE_ERROR;.   
16fa0 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a     }.    }.  }..
16fb0 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20    /* If this is 
16fc0 6f 6e 65 20 53 45 4c 45 43 54 20 6f 66 20 61 20  one SELECT of a 
16fd0 63 6f 6d 70 6f 75 6e 64 2c 20 62 65 20 73 75 72  compound, be sur
16fe0 65 20 74 6f 20 72 65 73 6f 6c 76 65 20 6e 61 6d  e to resolve nam
16ff0 65 73 0a 20 20 2a 2a 20 69 6e 20 74 68 65 20 6f  es.  ** in the o
17000 74 68 65 72 20 53 45 4c 45 43 54 73 2e 0a 20 20  ther SELECTs..  
17010 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 70 50 72 69  */.  if( p->pPri
17020 6f 72 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  or ){.    return
17030 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 52 65   sqlite3SelectRe
17040 73 6f 6c 76 65 28 70 50 61 72 73 65 2c 20 70 2d  solve(pParse, p-
17050 3e 70 50 72 69 6f 72 2c 20 70 4f 75 74 65 72 4e  >pPrior, pOuterN
17060 43 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  C);.  }else{.   
17070 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
17080 4b 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  K;.  }.}../*.** 
17090 52 65 73 65 74 20 74 68 65 20 61 67 67 72 65 67  Reset the aggreg
170a0 61 74 65 20 61 63 63 75 6d 75 6c 61 74 6f 72 2e  ate accumulator.
170b0 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 67 67 72 65  .**.** The aggre
170c0 67 61 74 65 20 61 63 63 75 6d 75 6c 61 74 6f 72  gate accumulator
170d0 20 69 73 20 61 20 73 65 74 20 6f 66 20 6d 65 6d   is a set of mem
170e0 6f 72 79 20 63 65 6c 6c 73 20 74 68 61 74 20 68  ory cells that h
170f0 6f 6c 64 0a 2a 2a 20 69 6e 74 65 72 6d 65 64 69  old.** intermedi
17100 61 74 65 20 72 65 73 75 6c 74 73 20 77 68 69 6c  ate results whil
17110 65 20 63 61 6c 63 75 6c 61 74 69 6e 67 20 61 6e  e calculating an
17120 20 61 67 67 72 65 67 61 74 65 2e 20 20 54 68 69   aggregate.  Thi
17130 73 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 73 69 6d  s.** routine sim
17140 70 6c 79 20 73 74 6f 72 65 73 20 4e 55 4c 4c 73  ply stores NULLs
17150 20 69 6e 20 61 6c 6c 20 6f 66 20 74 68 6f 73 65   in all of those
17160 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 73 2e 0a 2a   memory cells..*
17170 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72 65  /.static void re
17180 73 65 74 41 63 63 75 6d 75 6c 61 74 6f 72 28 50  setAccumulator(P
17190 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 41 67  arse *pParse, Ag
171a0 67 49 6e 66 6f 20 2a 70 41 67 67 49 6e 66 6f 29  gInfo *pAggInfo)
171b0 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50  {.  Vdbe *v = pP
171c0 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69  arse->pVdbe;.  i
171d0 6e 74 20 69 3b 0a 20 20 73 74 72 75 63 74 20 41  nt i;.  struct A
171e0 67 67 49 6e 66 6f 5f 66 75 6e 63 20 2a 70 46 75  ggInfo_func *pFu
171f0 6e 63 3b 0a 20 20 69 66 28 20 70 41 67 67 49 6e  nc;.  if( pAggIn
17200 66 6f 2d 3e 6e 46 75 6e 63 2b 70 41 67 67 49 6e  fo->nFunc+pAggIn
17210 66 6f 2d 3e 6e 43 6f 6c 75 6d 6e 3d 3d 30 20 29  fo->nColumn==0 )
17220 7b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20  {.    return;.  
17230 7d 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70  }.  for(i=0; i<p
17240 41 67 67 49 6e 66 6f 2d 3e 6e 43 6f 6c 75 6d 6e  AggInfo->nColumn
17250 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69  ; i++){.    sqli
17260 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
17270 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20 70 41 67   OP_Null, 0, pAg
17280 67 49 6e 66 6f 2d 3e 61 43 6f 6c 5b 69 5d 2e 69  gInfo->aCol[i].i
17290 4d 65 6d 29 3b 0a 20 20 7d 0a 20 20 66 6f 72 28  Mem);.  }.  for(
172a0 70 46 75 6e 63 3d 70 41 67 67 49 6e 66 6f 2d 3e  pFunc=pAggInfo->
172b0 61 46 75 6e 63 2c 20 69 3d 30 3b 20 69 3c 70 41  aFunc, i=0; i<pA
172c0 67 67 49 6e 66 6f 2d 3e 6e 46 75 6e 63 3b 20 69  ggInfo->nFunc; i
172d0 2b 2b 2c 20 70 46 75 6e 63 2b 2b 29 7b 0a 20 20  ++, pFunc++){.  
172e0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
172f0 4f 70 32 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20  Op2(v, OP_Null, 
17300 30 2c 20 70 46 75 6e 63 2d 3e 69 4d 65 6d 29 3b  0, pFunc->iMem);
17310 0a 20 20 20 20 69 66 28 20 70 46 75 6e 63 2d 3e  .    if( pFunc->
17320 69 44 69 73 74 69 6e 63 74 3e 3d 30 20 29 7b 0a  iDistinct>=0 ){.
17330 20 20 20 20 20 20 45 78 70 72 20 2a 70 45 20 3d        Expr *pE =
17340 20 70 46 75 6e 63 2d 3e 70 45 78 70 72 3b 0a 20   pFunc->pExpr;. 
17350 20 20 20 20 20 69 66 28 20 70 45 2d 3e 70 4c 69       if( pE->pLi
17360 73 74 3d 3d 30 20 7c 7c 20 70 45 2d 3e 70 4c 69  st==0 || pE->pLi
17370 73 74 2d 3e 6e 45 78 70 72 21 3d 31 20 29 7b 0a  st->nExpr!=1 ){.
17380 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
17390 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
173a0 22 44 49 53 54 49 4e 43 54 20 69 6e 20 61 67 67  "DISTINCT in agg
173b0 72 65 67 61 74 65 20 6d 75 73 74 20 62 65 20 66  regate must be f
173c0 6f 6c 6c 6f 77 65 64 20 22 0a 20 20 20 20 20 20  ollowed ".      
173d0 20 20 20 20 20 22 62 79 20 61 6e 20 65 78 70 72       "by an expr
173e0 65 73 73 69 6f 6e 22 29 3b 0a 20 20 20 20 20 20  ession");.      
173f0 20 20 70 46 75 6e 63 2d 3e 69 44 69 73 74 69 6e    pFunc->iDistin
17400 63 74 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 7d  ct = -1;.      }
17410 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 4b 65  else{.        Ke
17420 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 20  yInfo *pKeyInfo 
17430 3d 20 6b 65 79 49 6e 66 6f 46 72 6f 6d 45 78 70  = keyInfoFromExp
17440 72 4c 69 73 74 28 70 50 61 72 73 65 2c 20 70 45  rList(pParse, pE
17450 2d 3e 70 4c 69 73 74 29 3b 0a 20 20 20 20 20 20  ->pList);.      
17460 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
17470 4f 70 34 28 76 2c 20 4f 50 5f 4f 70 65 6e 45 70  Op4(v, OP_OpenEp
17480 68 65 6d 65 72 61 6c 2c 20 70 46 75 6e 63 2d 3e  hemeral, pFunc->
17490 69 44 69 73 74 69 6e 63 74 2c 20 30 2c 20 30 2c  iDistinct, 0, 0,
174a0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
174b0 20 20 20 20 20 20 20 20 20 20 20 28 63 68 61 72             (char
174c0 2a 29 70 4b 65 79 49 6e 66 6f 2c 20 50 34 5f 4b  *)pKeyInfo, P4_K
174d0 45 59 49 4e 46 4f 5f 48 41 4e 44 4f 46 46 29 3b  EYINFO_HANDOFF);
174e0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
174f0 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 76 6f   }.}../*.** Invo
17500 6b 65 20 74 68 65 20 4f 50 5f 41 67 67 46 69 6e  ke the OP_AggFin
17510 61 6c 69 7a 65 20 6f 70 63 6f 64 65 20 66 6f 72  alize opcode for
17520 20 65 76 65 72 79 20 61 67 67 72 65 67 61 74 65   every aggregate
17530 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 69 6e 20   function.** in 
17540 74 68 65 20 41 67 67 49 6e 66 6f 20 73 74 72 75  the AggInfo stru
17550 63 74 75 72 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  cture..*/.static
17560 20 76 6f 69 64 20 66 69 6e 61 6c 69 7a 65 41 67   void finalizeAg
17570 67 46 75 6e 63 74 69 6f 6e 73 28 50 61 72 73 65  gFunctions(Parse
17580 20 2a 70 50 61 72 73 65 2c 20 41 67 67 49 6e 66   *pParse, AggInf
17590 6f 20 2a 70 41 67 67 49 6e 66 6f 29 7b 0a 20 20  o *pAggInfo){.  
175a0 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65  Vdbe *v = pParse
175b0 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74 20 69  ->pVdbe;.  int i
175c0 3b 0a 20 20 73 74 72 75 63 74 20 41 67 67 49 6e  ;.  struct AggIn
175d0 66 6f 5f 66 75 6e 63 20 2a 70 46 3b 0a 20 20 66  fo_func *pF;.  f
175e0 6f 72 28 69 3d 30 2c 20 70 46 3d 70 41 67 67 49  or(i=0, pF=pAggI
175f0 6e 66 6f 2d 3e 61 46 75 6e 63 3b 20 69 3c 70 41  nfo->aFunc; i<pA
17600 67 67 49 6e 66 6f 2d 3e 6e 46 75 6e 63 3b 20 69  ggInfo->nFunc; i
17610 2b 2b 2c 20 70 46 2b 2b 29 7b 0a 20 20 20 20 45  ++, pF++){.    E
17620 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 20 3d  xprList *pList =
17630 20 70 46 2d 3e 70 45 78 70 72 2d 3e 70 4c 69 73   pF->pExpr->pLis
17640 74 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  t;.    sqlite3Vd
17650 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 41  beAddOp4(v, OP_A
17660 67 67 46 69 6e 61 6c 2c 20 70 46 2d 3e 69 4d 65  ggFinal, pF->iMe
17670 6d 2c 20 70 4c 69 73 74 20 3f 20 70 4c 69 73 74  m, pList ? pList
17680 2d 3e 6e 45 78 70 72 20 3a 20 30 2c 20 30 2c 0a  ->nExpr : 0, 0,.
17690 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
176a0 20 20 20 20 20 20 28 76 6f 69 64 2a 29 70 46 2d        (void*)pF-
176b0 3e 70 46 75 6e 63 2c 20 50 34 5f 46 55 4e 43 44  >pFunc, P4_FUNCD
176c0 45 46 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  EF);.  }.}../*.*
176d0 2a 20 55 70 64 61 74 65 20 74 68 65 20 61 63 63  * Update the acc
176e0 75 6d 75 6c 61 74 6f 72 20 6d 65 6d 6f 72 79 20  umulator memory 
176f0 63 65 6c 6c 73 20 66 6f 72 20 61 6e 20 61 67 67  cells for an agg
17700 72 65 67 61 74 65 20 62 61 73 65 64 20 6f 6e 0a  regate based on.
17710 2a 2a 20 74 68 65 20 63 75 72 72 65 6e 74 20 63  ** the current c
17720 75 72 73 6f 72 20 70 6f 73 69 74 69 6f 6e 2e 0a  ursor position..
17730 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 75  */.static void u
17740 70 64 61 74 65 41 63 63 75 6d 75 6c 61 74 6f 72  pdateAccumulator
17750 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
17760 41 67 67 49 6e 66 6f 20 2a 70 41 67 67 49 6e 66  AggInfo *pAggInf
17770 6f 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20  o){.  Vdbe *v = 
17780 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20  pParse->pVdbe;. 
17790 20 69 6e 74 20 69 3b 0a 20 20 73 74 72 75 63 74   int i;.  struct
177a0 20 41 67 67 49 6e 66 6f 5f 66 75 6e 63 20 2a 70   AggInfo_func *p
177b0 46 3b 0a 20 20 73 74 72 75 63 74 20 41 67 67 49  F;.  struct AggI
177c0 6e 66 6f 5f 63 6f 6c 20 2a 70 43 3b 0a 0a 20 20  nfo_col *pC;..  
177d0 70 41 67 67 49 6e 66 6f 2d 3e 64 69 72 65 63 74  pAggInfo->direct
177e0 4d 6f 64 65 20 3d 20 31 3b 0a 20 20 66 6f 72 28  Mode = 1;.  for(
177f0 69 3d 30 2c 20 70 46 3d 70 41 67 67 49 6e 66 6f  i=0, pF=pAggInfo
17800 2d 3e 61 46 75 6e 63 3b 20 69 3c 70 41 67 67 49  ->aFunc; i<pAggI
17810 6e 66 6f 2d 3e 6e 46 75 6e 63 3b 20 69 2b 2b 2c  nfo->nFunc; i++,
17820 20 70 46 2b 2b 29 7b 0a 20 20 20 20 69 6e 74 20   pF++){.    int 
17830 6e 41 72 67 3b 0a 20 20 20 20 69 6e 74 20 61 64  nArg;.    int ad
17840 64 72 4e 65 78 74 20 3d 20 30 3b 0a 20 20 20 20  drNext = 0;.    
17850 69 6e 74 20 72 65 67 41 67 67 3b 0a 20 20 20 20  int regAgg;.    
17860 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 20  ExprList *pList 
17870 3d 20 70 46 2d 3e 70 45 78 70 72 2d 3e 70 4c 69  = pF->pExpr->pLi
17880 73 74 3b 0a 20 20 20 20 69 66 28 20 70 4c 69 73  st;.    if( pLis
17890 74 20 29 7b 0a 20 20 20 20 20 20 6e 41 72 67 20  t ){.      nArg 
178a0 3d 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 0a  = pList->nExpr;.
178b0 20 20 20 20 20 20 72 65 67 41 67 67 20 3d 20 73        regAgg = s
178c0 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 61 6e  qlite3GetTempRan
178d0 67 65 28 70 50 61 72 73 65 2c 20 6e 41 72 67 29  ge(pParse, nArg)
178e0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  ;.      sqlite3E
178f0 78 70 72 43 6f 64 65 45 78 70 72 4c 69 73 74 28  xprCodeExprList(
17900 70 50 61 72 73 65 2c 20 70 4c 69 73 74 2c 20 72  pParse, pList, r
17910 65 67 41 67 67 29 3b 0a 20 20 20 20 7d 65 6c 73  egAgg);.    }els
17920 65 7b 0a 20 20 20 20 20 20 6e 41 72 67 20 3d 20  e{.      nArg = 
17930 30 3b 0a 20 20 20 20 20 20 72 65 67 41 67 67 20  0;.      regAgg 
17940 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  = 0;.    }.    i
17950 66 28 20 70 46 2d 3e 69 44 69 73 74 69 6e 63 74  f( pF->iDistinct
17960 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 61 64 64  >=0 ){.      add
17970 72 4e 65 78 74 20 3d 20 73 71 6c 69 74 65 33 56  rNext = sqlite3V
17980 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b  dbeMakeLabel(v);
17990 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6e  .      assert( n
179a0 41 72 67 3d 3d 31 20 29 3b 0a 20 20 20 20 20 20  Arg==1 );.      
179b0 63 6f 64 65 44 69 73 74 69 6e 63 74 28 70 50 61  codeDistinct(pPa
179c0 72 73 65 2c 20 70 46 2d 3e 69 44 69 73 74 69 6e  rse, pF->iDistin
179d0 63 74 2c 20 61 64 64 72 4e 65 78 74 2c 20 31 2c  ct, addrNext, 1,
179e0 20 72 65 67 41 67 67 29 3b 0a 20 20 20 20 7d 0a   regAgg);.    }.
179f0 20 20 20 20 69 66 28 20 70 46 2d 3e 70 46 75 6e      if( pF->pFun
17a00 63 2d 3e 6e 65 65 64 43 6f 6c 6c 53 65 71 20 29  c->needCollSeq )
17a10 7b 0a 20 20 20 20 20 20 43 6f 6c 6c 53 65 71 20  {.      CollSeq 
17a20 2a 70 43 6f 6c 6c 20 3d 20 30 3b 0a 20 20 20 20  *pColl = 0;.    
17a30 20 20 73 74 72 75 63 74 20 45 78 70 72 4c 69 73    struct ExprLis
17a40 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20  t_item *pItem;. 
17a50 20 20 20 20 20 69 6e 74 20 6a 3b 0a 20 20 20 20       int j;.    
17a60 20 20 61 73 73 65 72 74 28 20 70 4c 69 73 74 21    assert( pList!
17a70 3d 30 20 29 3b 20 20 2f 2a 20 70 4c 69 73 74 21  =0 );  /* pList!
17a80 3d 30 20 69 66 20 70 46 2d 3e 70 46 75 6e 63 2d  =0 if pF->pFunc-
17a90 3e 6e 65 65 64 43 6f 6c 6c 53 65 71 20 69 73 20  >needCollSeq is 
17aa0 74 72 75 65 20 2a 2f 0a 20 20 20 20 20 20 66 6f  true */.      fo
17ab0 72 28 6a 3d 30 2c 20 70 49 74 65 6d 3d 70 4c 69  r(j=0, pItem=pLi
17ac0 73 74 2d 3e 61 3b 20 21 70 43 6f 6c 6c 20 26 26  st->a; !pColl &&
17ad0 20 6a 3c 6e 41 72 67 3b 20 6a 2b 2b 2c 20 70 49   j<nArg; j++, pI
17ae0 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  tem++){.        
17af0 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 45  pColl = sqlite3E
17b00 78 70 72 43 6f 6c 6c 53 65 71 28 70 50 61 72 73  xprCollSeq(pPars
17b10 65 2c 20 70 49 74 65 6d 2d 3e 70 45 78 70 72 29  e, pItem->pExpr)
17b20 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
17b30 69 66 28 20 21 70 43 6f 6c 6c 20 29 7b 0a 20 20  if( !pColl ){.  
17b40 20 20 20 20 20 20 70 43 6f 6c 6c 20 3d 20 70 50        pColl = pP
17b50 61 72 73 65 2d 3e 64 62 2d 3e 70 44 66 6c 74 43  arse->db->pDfltC
17b60 6f 6c 6c 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  oll;.      }.   
17b70 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
17b80 64 4f 70 34 28 76 2c 20 4f 50 5f 43 6f 6c 6c 53  dOp4(v, OP_CollS
17b90 65 71 2c 20 30 2c 20 30 2c 20 30 2c 20 28 63 68  eq, 0, 0, 0, (ch
17ba0 61 72 20 2a 29 70 43 6f 6c 6c 2c 20 50 34 5f 43  ar *)pColl, P4_C
17bb0 4f 4c 4c 53 45 51 29 3b 0a 20 20 20 20 7d 0a 20  OLLSEQ);.    }. 
17bc0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
17bd0 64 4f 70 34 28 76 2c 20 4f 50 5f 41 67 67 53 74  dOp4(v, OP_AggSt
17be0 65 70 2c 20 30 2c 20 72 65 67 41 67 67 2c 20 70  ep, 0, regAgg, p
17bf0 46 2d 3e 69 4d 65 6d 2c 0a 20 20 20 20 20 20 20  F->iMem,.       
17c00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28                 (
17c10 76 6f 69 64 2a 29 70 46 2d 3e 70 46 75 6e 63 2c  void*)pF->pFunc,
17c20 20 50 34 5f 46 55 4e 43 44 45 46 29 3b 0a 20 20   P4_FUNCDEF);.  
17c30 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61    sqlite3VdbeCha
17c40 6e 67 65 50 35 28 76 2c 20 6e 41 72 67 29 3b 0a  ngeP5(v, nArg);.
17c50 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61      sqlite3Relea
17c60 73 65 54 65 6d 70 52 61 6e 67 65 28 70 50 61 72  seTempRange(pPar
17c70 73 65 2c 20 72 65 67 41 67 67 2c 20 6e 41 72 67  se, regAgg, nArg
17c80 29 3b 0a 20 20 20 20 69 66 28 20 61 64 64 72 4e  );.    if( addrN
17c90 65 78 74 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  ext ){.      sql
17ca0 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c  ite3VdbeResolveL
17cb0 61 62 65 6c 28 76 2c 20 61 64 64 72 4e 65 78 74  abel(v, addrNext
17cc0 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 66  );.    }.  }.  f
17cd0 6f 72 28 69 3d 30 2c 20 70 43 3d 70 41 67 67 49  or(i=0, pC=pAggI
17ce0 6e 66 6f 2d 3e 61 43 6f 6c 3b 20 69 3c 70 41 67  nfo->aCol; i<pAg
17cf0 67 49 6e 66 6f 2d 3e 6e 41 63 63 75 6d 75 6c 61  gInfo->nAccumula
17d00 74 6f 72 3b 20 69 2b 2b 2c 20 70 43 2b 2b 29 7b  tor; i++, pC++){
17d10 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72  .    sqlite3Expr
17d20 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70 43 2d  Code(pParse, pC-
17d30 3e 70 45 78 70 72 2c 20 70 43 2d 3e 69 4d 65 6d  >pExpr, pC->iMem
17d40 29 3b 0a 20 20 7d 0a 20 20 70 41 67 67 49 6e 66  );.  }.  pAggInf
17d50 6f 2d 3e 64 69 72 65 63 74 4d 6f 64 65 20 3d 20  o->directMode = 
17d60 30 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51  0;.}..#ifndef SQ
17d70 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 49 47 47 45  LITE_OMIT_TRIGGE
17d80 52 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  R./*.** This fun
17d90 63 74 69 6f 6e 20 69 73 20 75 73 65 64 20 77 68  ction is used wh
17da0 65 6e 20 61 20 53 45 4c 45 43 54 20 73 74 61 74  en a SELECT stat
17db0 65 6d 65 6e 74 20 69 73 20 75 73 65 64 20 74 6f  ement is used to
17dc0 20 63 72 65 61 74 65 20 61 0a 2a 2a 20 74 65 6d   create a.** tem
17dd0 70 6f 72 61 72 79 20 74 61 62 6c 65 20 66 6f 72  porary table for
17de0 20 69 74 65 72 61 74 69 6e 67 20 74 68 72 6f 75   iterating throu
17df0 67 68 20 77 68 65 6e 20 72 75 6e 6e 69 6e 67 20  gh when running 
17e00 61 6e 20 49 4e 53 54 45 41 44 20 4f 46 0a 2a 2a  an INSTEAD OF.**
17e10 20 55 50 44 41 54 45 20 6f 72 20 49 4e 53 54 45   UPDATE or INSTE
17e20 41 44 20 4f 46 20 44 45 4c 45 54 45 20 74 72 69  AD OF DELETE tri
17e30 67 67 65 72 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20  gger. .**.** If 
17e40 70 6f 73 73 69 62 6c 65 2c 20 74 68 65 20 53 45  possible, the SE
17e50 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 69  LECT statement i
17e60 73 20 6d 6f 64 69 66 69 65 64 20 73 6f 20 74 68  s modified so th
17e70 61 74 20 4e 55 4c 4c 20 76 61 6c 75 65 73 0a 2a  at NULL values.*
17e80 2a 20 61 72 65 20 73 74 6f 72 65 64 20 69 6e 20  * are stored in 
17e90 74 68 65 20 74 65 6d 70 6f 72 61 72 79 20 74 61  the temporary ta
17ea0 62 6c 65 20 66 6f 72 20 61 6c 6c 20 63 6f 6c 75  ble for all colu
17eb0 6d 6e 73 20 66 6f 72 20 77 68 69 63 68 20 74 68  mns for which th
17ec0 65 20 0a 2a 2a 20 63 6f 72 72 65 73 70 6f 6e 64  e .** correspond
17ed0 69 6e 67 20 62 69 74 20 69 6e 20 61 72 67 75 6d  ing bit in argum
17ee0 65 6e 74 20 6d 61 73 6b 20 69 73 20 6e 6f 74 20  ent mask is not 
17ef0 73 65 74 2e 20 49 66 20 6d 61 73 6b 20 74 61 6b  set. If mask tak
17f00 65 73 20 74 68 65 0a 2a 2a 20 73 70 65 63 69 61  es the.** specia
17f10 6c 20 76 61 6c 75 65 20 30 78 66 66 66 66 66 66  l value 0xffffff
17f20 66 66 2c 20 74 68 65 6e 20 61 6c 6c 20 63 6f 6c  ff, then all col
17f30 75 6d 6e 73 20 61 72 65 20 70 6f 70 75 6c 61 74  umns are populat
17f40 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  ed..*/.void sqli
17f50 74 65 33 53 65 6c 65 63 74 4d 61 73 6b 28 50 61  te3SelectMask(Pa
17f60 72 73 65 20 2a 70 50 61 72 73 65 2c 20 53 65 6c  rse *pParse, Sel
17f70 65 63 74 20 2a 70 2c 20 75 33 32 20 6d 61 73 6b  ect *p, u32 mask
17f80 29 7b 0a 20 20 69 66 28 20 70 20 26 26 20 21 70  ){.  if( p && !p
17f90 2d 3e 70 50 72 69 6f 72 20 26 26 20 21 70 2d 3e  ->pPrior && !p->
17fa0 69 73 44 69 73 74 69 6e 63 74 20 26 26 20 6d 61  isDistinct && ma
17fb0 73 6b 21 3d 30 78 66 66 66 66 66 66 66 66 20 29  sk!=0xffffffff )
17fc0 7b 0a 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a  {.    ExprList *
17fd0 70 45 4c 69 73 74 3b 0a 20 20 20 20 69 6e 74 20  pEList;.    int 
17fe0 69 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 53 65  i;.    sqlite3Se
17ff0 6c 65 63 74 52 65 73 6f 6c 76 65 28 70 50 61 72  lectResolve(pPar
18000 73 65 2c 20 70 2c 20 30 29 3b 0a 20 20 20 20 70  se, p, 0);.    p
18010 45 4c 69 73 74 20 3d 20 70 2d 3e 70 45 4c 69 73  EList = p->pELis
18020 74 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  t;.    for(i=0; 
18030 70 45 4c 69 73 74 20 26 26 20 69 3c 70 45 4c 69  pEList && i<pELi
18040 73 74 2d 3e 6e 45 78 70 72 20 26 26 20 69 3c 33  st->nExpr && i<3
18050 32 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69  2; i++){.      i
18060 66 28 20 21 28 6d 61 73 6b 26 28 28 75 33 32 29  f( !(mask&((u32)
18070 31 3c 3c 69 29 29 20 29 7b 0a 20 20 20 20 20 20  1<<i)) ){.      
18080 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c    sqlite3ExprDel
18090 65 74 65 28 70 45 4c 69 73 74 2d 3e 61 5b 69 5d  ete(pEList->a[i]
180a0 2e 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20 20  .pExpr);.       
180b0 20 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45   pEList->a[i].pE
180c0 78 70 72 20 3d 20 73 71 6c 69 74 65 33 45 78 70  xpr = sqlite3Exp
180d0 72 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 54 4b  r(pParse->db, TK
180e0 5f 4e 55 4c 4c 2c 20 30 2c 20 30 2c 20 30 29 3b  _NULL, 0, 0, 0);
180f0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
18100 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a   }.}.#endif../*.
18110 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65  ** Generate code
18120 20 66 6f 72 20 74 68 65 20 67 69 76 65 6e 20 53   for the given S
18130 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 2e  ELECT statement.
18140 0a 2a 2a 0a 2a 2a 20 54 68 65 20 72 65 73 75 6c  .**.** The resul
18150 74 73 20 61 72 65 20 64 69 73 74 72 69 62 75 74  ts are distribut
18160 65 64 20 69 6e 20 76 61 72 69 6f 75 73 20 77 61  ed in various wa
18170 79 73 20 64 65 70 65 6e 64 69 6e 67 20 6f 6e 20  ys depending on 
18180 74 68 65 0a 2a 2a 20 63 6f 6e 74 65 6e 74 73 20  the.** contents 
18190 6f 66 20 74 68 65 20 53 65 6c 65 63 74 44 65 73  of the SelectDes
181a0 74 20 73 74 72 75 63 74 75 72 65 20 70 6f 69 6e  t structure poin
181b0 74 65 64 20 74 6f 20 62 79 20 61 72 67 75 6d 65  ted to by argume
181c0 6e 74 20 70 44 65 73 74 0a 2a 2a 20 61 73 20 66  nt pDest.** as f
181d0 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20  ollows:.**.**   
181e0 20 20 70 44 65 73 74 2d 3e 65 44 65 73 74 20 20    pDest->eDest  
181f0 20 20 52 65 73 75 6c 74 0a 2a 2a 20 20 20 20 20    Result.**     
18200 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 20 20 20 20  ------------    
18210 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
18220 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
18230 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a 20 20  -----------.**  
18240 20 20 20 53 52 54 5f 43 61 6c 6c 62 61 63 6b 20     SRT_Callback 
18250 20 20 20 49 6e 76 6f 6b 65 20 74 68 65 20 63 61     Invoke the ca
18260 6c 6c 62 61 63 6b 20 66 6f 72 20 65 61 63 68 20  llback for each 
18270 72 6f 77 20 6f 66 20 74 68 65 20 72 65 73 75 6c  row of the resul
18280 74 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 52 54  t..**.**     SRT
18290 5f 4d 65 6d 20 20 20 20 20 20 20 20 20 53 74 6f  _Mem         Sto
182a0 72 65 20 66 69 72 73 74 20 72 65 73 75 6c 74 20  re first result 
182b0 69 6e 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 20 70  in memory cell p
182c0 44 65 73 74 2d 3e 69 50 61 72 6d 0a 2a 2a 0a 2a  Dest->iParm.**.*
182d0 2a 20 20 20 20 20 53 52 54 5f 53 65 74 20 20 20  *     SRT_Set   
182e0 20 20 20 20 20 20 53 74 6f 72 65 20 6e 6f 6e 2d        Store non-
182f0 6e 75 6c 6c 20 72 65 73 75 6c 74 73 20 61 73 20  null results as 
18300 6b 65 79 73 20 6f 66 20 74 61 62 6c 65 20 70 44  keys of table pD
18310 65 73 74 2d 3e 69 50 61 72 6d 2e 20 0a 2a 2a 20  est->iParm. .** 
18320 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18330 20 20 20 20 41 70 70 6c 79 20 74 68 65 20 61 66      Apply the af
18340 66 69 6e 69 74 79 20 70 44 65 73 74 2d 3e 61 66  finity pDest->af
18350 66 69 6e 69 74 79 20 62 65 66 6f 72 65 20 73 74  finity before st
18360 6f 72 69 6e 67 20 74 68 65 6d 2e 0a 2a 2a 0a 2a  oring them..**.*
18370 2a 20 20 20 20 20 53 52 54 5f 55 6e 69 6f 6e 20  *     SRT_Union 
18380 20 20 20 20 20 20 53 74 6f 72 65 20 72 65 73 75        Store resu
18390 6c 74 73 20 61 73 20 61 20 6b 65 79 20 69 6e 20  lts as a key in 
183a0 61 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c  a temporary tabl
183b0 65 20 70 44 65 73 74 2d 3e 69 50 61 72 6d 2e 0a  e pDest->iParm..
183c0 2a 2a 0a 2a 2a 20 20 20 20 20 53 52 54 5f 45 78  **.**     SRT_Ex
183d0 63 65 70 74 20 20 20 20 20 20 52 65 6d 6f 76 65  cept      Remove
183e0 20 72 65 73 75 6c 74 73 20 66 72 6f 6d 20 74 68   results from th
183f0 65 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c  e temporary tabl
18400 65 20 70 44 65 73 74 2d 3e 69 50 61 72 6d 2e 0a  e pDest->iParm..
18410 2a 2a 0a 2a 2a 20 20 20 20 20 53 52 54 5f 54 61  **.**     SRT_Ta
18420 62 6c 65 20 20 20 20 20 20 20 53 74 6f 72 65 20  ble       Store 
18430 72 65 73 75 6c 74 73 20 69 6e 20 74 65 6d 70 6f  results in tempo
18440 72 61 72 79 20 74 61 62 6c 65 20 70 44 65 73 74  rary table pDest
18450 2d 3e 69 50 61 72 6d 0a 2a 2a 0a 2a 2a 20 20 20  ->iParm.**.**   
18460 20 20 53 52 54 5f 45 70 68 65 6d 54 61 62 20 20    SRT_EphemTab  
18470 20 20 43 72 65 61 74 65 20 61 6e 20 74 65 6d 70    Create an temp
18480 6f 72 61 72 79 20 74 61 62 6c 65 20 70 44 65 73  orary table pDes
18490 74 2d 3e 69 50 61 72 6d 20 61 6e 64 20 73 74 6f  t->iParm and sto
184a0 72 65 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  re.**           
184b0 20 20 20 20 20 20 20 20 20 20 74 68 65 20 72 65            the re
184c0 73 75 6c 74 20 74 68 65 72 65 2e 20 54 68 65 20  sult there. The 
184d0 63 75 72 73 6f 72 20 69 73 20 6c 65 66 74 20 6f  cursor is left o
184e0 70 65 6e 20 61 66 74 65 72 0a 2a 2a 20 20 20 20  pen after.**    
184f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18500 20 72 65 74 75 72 6e 69 6e 67 2e 0a 2a 2a 0a 2a   returning..**.*
18510 2a 20 20 20 20 20 53 52 54 5f 53 75 62 72 6f 75  *     SRT_Subrou
18520 74 69 6e 65 20 20 46 6f 72 20 65 61 63 68 20 72  tine  For each r
18530 6f 77 20 72 65 74 75 72 6e 65 64 2c 20 70 75 73  ow returned, pus
18540 68 20 74 68 65 20 72 65 73 75 6c 74 73 20 6f 6e  h the results on
18550 74 6f 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 20  to the.**       
18560 20 20 20 20 20 20 20 20 20 20 20 20 20 20 76 64                vd
18570 62 65 20 73 74 61 63 6b 20 61 6e 64 20 63 61 6c  be stack and cal
18580 6c 20 74 68 65 20 73 75 62 72 6f 75 74 69 6e 65  l the subroutine
18590 20 28 76 69 61 20 4f 50 5f 47 6f 73 75 62 29 0a   (via OP_Gosub).
185a0 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
185b0 20 20 20 20 20 20 20 61 74 20 61 64 64 72 65 73         at addres
185c0 73 20 70 44 65 73 74 2d 3e 69 50 61 72 6d 2e 0a  s pDest->iParm..
185d0 2a 2a 0a 2a 2a 20 20 20 20 20 53 52 54 5f 45 78  **.**     SRT_Ex
185e0 69 73 74 73 20 20 20 20 20 20 53 74 6f 72 65 20  ists      Store 
185f0 61 20 31 20 69 6e 20 6d 65 6d 6f 72 79 20 63 65  a 1 in memory ce
18600 6c 6c 20 70 44 65 73 74 2d 3e 69 50 61 72 6d 20  ll pDest->iParm 
18610 69 66 20 74 68 65 20 72 65 73 75 6c 74 0a 2a 2a  if the result.**
18620 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18630 20 20 20 20 20 73 65 74 20 69 73 20 6e 6f 74 20       set is not 
18640 65 6d 70 74 79 2e 0a 2a 2a 0a 2a 2a 20 20 20 20  empty..**.**    
18650 20 53 52 54 5f 44 69 73 63 61 72 64 20 20 20 20   SRT_Discard    
18660 20 54 68 72 6f 77 20 74 68 65 20 72 65 73 75 6c   Throw the resul
18670 74 73 20 61 77 61 79 2e 0a 2a 2a 0a 2a 2a 20 53  ts away..**.** S
18680 65 65 20 74 68 65 20 73 65 6c 65 63 74 49 6e 6e  ee the selectInn
18690 65 72 4c 6f 6f 70 28 29 20 66 75 6e 63 74 69 6f  erLoop() functio
186a0 6e 20 66 6f 72 20 61 20 63 61 6e 6f 6e 69 63 61  n for a canonica
186b0 6c 20 6c 69 73 74 69 6e 67 20 6f 66 20 74 68 65  l listing of the
186c0 20 0a 2a 2a 20 61 6c 6c 6f 77 65 64 20 76 61 6c   .** allowed val
186d0 75 65 73 20 6f 66 20 65 44 65 73 74 20 61 6e 64  ues of eDest and
186e0 20 74 68 65 69 72 20 6d 65 61 6e 69 6e 67 73 2e   their meanings.
186f0 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
18700 69 6e 65 20 72 65 74 75 72 6e 73 20 74 68 65 20  ine returns the 
18710 6e 75 6d 62 65 72 20 6f 66 20 65 72 72 6f 72 73  number of errors
18720 2e 20 20 49 66 20 61 6e 79 20 65 72 72 6f 72 73  .  If any errors
18730 20 61 72 65 0a 2a 2a 20 65 6e 63 6f 75 6e 74 65   are.** encounte
18740 72 65 64 2c 20 74 68 65 6e 20 61 6e 20 61 70 70  red, then an app
18750 72 6f 70 72 69 61 74 65 20 65 72 72 6f 72 20 6d  ropriate error m
18760 65 73 73 61 67 65 20 69 73 20 6c 65 66 74 20 69  essage is left i
18770 6e 0a 2a 2a 20 70 50 61 72 73 65 2d 3e 7a 45 72  n.** pParse->zEr
18780 72 4d 73 67 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  rMsg..**.** This
18790 20 72 6f 75 74 69 6e 65 20 64 6f 65 73 20 4e 4f   routine does NO
187a0 54 20 66 72 65 65 20 74 68 65 20 53 65 6c 65 63  T free the Selec
187b0 74 20 73 74 72 75 63 74 75 72 65 20 70 61 73 73  t structure pass
187c0 65 64 20 69 6e 2e 20 20 54 68 65 0a 2a 2a 20 63  ed in.  The.** c
187d0 61 6c 6c 69 6e 67 20 66 75 6e 63 74 69 6f 6e 20  alling function 
187e0 6e 65 65 64 73 20 74 6f 20 64 6f 20 74 68 61 74  needs to do that
187f0 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 50 61 72  ..**.** The pPar
18800 65 6e 74 2c 20 70 61 72 65 6e 74 54 61 62 2c 20  ent, parentTab, 
18810 61 6e 64 20 2a 70 50 61 72 65 6e 74 41 67 67 20  and *pParentAgg 
18820 66 69 65 6c 64 73 20 61 72 65 20 66 69 6c 6c 65  fields are fille
18830 64 20 69 6e 20 69 66 20 74 68 69 73 0a 2a 2a 20  d in if this.** 
18840 53 45 4c 45 43 54 20 69 73 20 61 20 73 75 62 71  SELECT is a subq
18850 75 65 72 79 2e 20 20 54 68 69 73 20 72 6f 75 74  uery.  This rout
18860 69 6e 65 20 6d 61 79 20 74 72 79 20 74 6f 20 63  ine may try to c
18870 6f 6d 62 69 6e 65 20 74 68 69 73 20 53 45 4c 45  ombine this SELE
18880 43 54 0a 2a 2a 20 77 69 74 68 20 69 74 73 20 70  CT.** with its p
18890 61 72 65 6e 74 20 74 6f 20 66 6f 72 6d 20 61 20  arent to form a 
188a0 73 69 6e 67 6c 65 20 66 6c 61 74 20 71 75 65 72  single flat quer
188b0 79 2e 20 20 49 6e 20 73 6f 20 64 6f 69 6e 67 2c  y.  In so doing,
188c0 20 69 74 20 6d 69 67 68 74 0a 2a 2a 20 63 68 61   it might.** cha
188d0 6e 67 65 20 74 68 65 20 70 61 72 65 6e 74 20 71  nge the parent q
188e0 75 65 72 79 20 66 72 6f 6d 20 61 20 6e 6f 6e 2d  uery from a non-
188f0 61 67 67 72 65 67 61 74 65 20 74 6f 20 61 6e 20  aggregate to an 
18900 61 67 67 72 65 67 61 74 65 20 71 75 65 72 79 2e  aggregate query.
18910 0a 2a 2a 20 46 6f 72 20 74 68 61 74 20 72 65 61  .** For that rea
18920 73 6f 6e 2c 20 74 68 65 20 70 50 61 72 65 6e 74  son, the pParent
18930 41 67 67 20 66 6c 61 67 20 69 73 20 70 61 73 73  Agg flag is pass
18940 65 64 20 61 73 20 61 20 70 6f 69 6e 74 65 72 2c  ed as a pointer,
18950 20 73 6f 20 69 74 0a 2a 2a 20 63 61 6e 20 62 65   so it.** can be
18960 20 63 68 61 6e 67 65 64 2e 0a 2a 2a 0a 2a 2a 20   changed..**.** 
18970 45 78 61 6d 70 6c 65 20 31 3a 20 20 20 54 68 65  Example 1:   The
18980 20 6d 65 61 6e 69 6e 67 20 6f 66 20 74 68 65 20   meaning of the 
18990 70 50 61 72 65 6e 74 20 70 61 72 61 6d 65 74 65  pParent paramete
189a0 72 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 53 45 4c 45  r..**.**    SELE
189b0 43 54 20 2a 20 46 52 4f 4d 20 74 31 20 4a 4f 49  CT * FROM t1 JOI
189c0 4e 20 28 53 45 4c 45 43 54 20 78 2c 20 63 6f 75  N (SELECT x, cou
189d0 6e 74 28 2a 29 20 46 52 4f 4d 20 74 32 29 20 4a  nt(*) FROM t2) J
189e0 4f 49 4e 20 74 33 3b 0a 2a 2a 20 20 20 20 5c 20  OIN t3;.**    \ 
189f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18a00 20 20 20 20 20 5c 5f 5f 5f 5f 5f 5f 5f 20 73 75       \_______ su
18a10 62 71 75 65 72 79 20 5f 5f 5f 5f 5f 5f 5f 2f 20  bquery _______/ 
18a20 20 20 20 20 20 20 20 2f 0a 2a 2a 20 20 20 20 20         /.**     
18a30 5c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  \               
18a40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18a50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18a60 20 20 20 20 20 20 20 2f 0a 2a 2a 20 20 20 20 20         /.**     
18a70 20 5c 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f   \______________
18a80 5f 5f 5f 5f 5f 5f 20 6f 75 74 65 72 20 71 75 65  ______ outer que
18a90 72 79 20 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f  ry _____________
18aa0 5f 5f 5f 5f 5f 5f 2f 0a 2a 2a 0a 2a 2a 20 54 68  ______/.**.** Th
18ab0 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61  is routine is ca
18ac0 6c 6c 65 64 20 66 6f 72 20 74 68 65 20 6f 75 74  lled for the out
18ad0 65 72 20 71 75 65 72 79 20 66 69 72 73 74 2e 20  er query first. 
18ae0 20 20 46 6f 72 20 74 68 61 74 20 63 61 6c 6c 2c    For that call,
18af0 0a 2a 2a 20 70 50 61 72 65 6e 74 20 77 69 6c 6c  .** pParent will
18b00 20 62 65 20 4e 55 4c 4c 2e 20 20 44 75 72 69 6e   be NULL.  Durin
18b10 67 20 74 68 65 20 70 72 6f 63 65 73 73 69 6e 67  g the processing
18b20 20 6f 66 20 74 68 65 20 6f 75 74 65 72 20 71 75   of the outer qu
18b30 65 72 79 2c 20 74 68 69 73 20 0a 2a 2a 20 72 6f  ery, this .** ro
18b40 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20  utine is called 
18b50 72 65 63 75 72 73 69 76 65 6c 79 20 74 6f 20 68  recursively to h
18b60 61 6e 64 6c 65 20 74 68 65 20 73 75 62 71 75 65  andle the subque
18b70 72 79 2e 20 20 46 6f 72 20 74 68 65 20 72 65 63  ry.  For the rec
18b80 75 72 73 69 76 65 0a 2a 2a 20 63 61 6c 6c 2c 20  ursive.** call, 
18b90 70 50 61 72 65 6e 74 20 77 69 6c 6c 20 70 6f 69  pParent will poi
18ba0 6e 74 20 74 6f 20 74 68 65 20 6f 75 74 65 72 20  nt to the outer 
18bb0 71 75 65 72 79 2e 20 20 42 65 63 61 75 73 65 20  query.  Because 
18bc0 74 68 65 20 73 75 62 71 75 65 72 79 20 69 73 0a  the subquery is.
18bd0 2a 2a 20 74 68 65 20 73 65 63 6f 6e 64 20 65 6c  ** the second el
18be0 65 6d 65 6e 74 20 69 6e 20 61 20 74 68 72 65 65  ement in a three
18bf0 2d 77 61 79 20 6a 6f 69 6e 2c 20 74 68 65 20 70  -way join, the p
18c00 61 72 65 6e 74 54 61 62 20 70 61 72 61 6d 65 74  arentTab paramet
18c10 65 72 20 77 69 6c 6c 0a 2a 2a 20 62 65 20 31 20  er will.** be 1 
18c20 28 74 68 65 20 32 6e 64 20 76 61 6c 75 65 20 6f  (the 2nd value o
18c30 66 20 61 20 30 2d 69 6e 64 65 78 65 64 20 61 72  f a 0-indexed ar
18c40 72 61 79 2e 29 0a 2a 2f 0a 69 6e 74 20 73 71 6c  ray.).*/.int sql
18c50 69 74 65 33 53 65 6c 65 63 74 28 0a 20 20 50 61  ite3Select(.  Pa
18c60 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20  rse *pParse,    
18c70 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61 72 73       /* The pars
18c80 65 72 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  er context */.  
18c90 53 65 6c 65 63 74 20 2a 70 2c 20 20 20 20 20 20  Select *p,      
18ca0 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 53 45         /* The SE
18cb0 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 62  LECT statement b
18cc0 65 69 6e 67 20 63 6f 64 65 64 2e 20 2a 2f 0a 20  eing coded. */. 
18cd0 20 53 65 6c 65 63 74 44 65 73 74 20 2a 70 44 65   SelectDest *pDe
18ce0 73 74 2c 20 20 20 20 20 2f 2a 20 57 68 61 74 20  st,     /* What 
18cf0 74 6f 20 64 6f 20 77 69 74 68 20 74 68 65 20 71  to do with the q
18d00 75 65 72 79 20 72 65 73 75 6c 74 73 20 2a 2f 0a  uery results */.
18d10 20 20 53 65 6c 65 63 74 20 2a 70 50 61 72 65 6e    Select *pParen
18d20 74 2c 20 20 20 20 20 20 20 2f 2a 20 41 6e 6f 74  t,       /* Anot
18d30 68 65 72 20 53 45 4c 45 43 54 20 66 6f 72 20 77  her SELECT for w
18d40 68 69 63 68 20 74 68 69 73 20 69 73 20 61 20 73  hich this is a s
18d50 75 62 2d 71 75 65 72 79 20 2a 2f 0a 20 20 69 6e  ub-query */.  in
18d60 74 20 70 61 72 65 6e 74 54 61 62 2c 20 20 20 20  t parentTab,    
18d70 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 69 6e       /* Index in
18d80 20 70 50 61 72 65 6e 74 2d 3e 70 53 72 63 20 6f   pParent->pSrc o
18d90 66 20 74 68 69 73 20 71 75 65 72 79 20 2a 2f 0a  f this query */.
18da0 20 20 69 6e 74 20 2a 70 50 61 72 65 6e 74 41 67    int *pParentAg
18db0 67 2c 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65  g,       /* True
18dc0 20 69 66 20 70 50 61 72 65 6e 74 20 75 73 65 73   if pParent uses
18dd0 20 61 67 67 72 65 67 61 74 65 20 66 75 6e 63 74   aggregate funct
18de0 69 6f 6e 73 20 2a 2f 0a 20 20 63 68 61 72 20 2a  ions */.  char *
18df0 61 66 66 20 20 20 20 20 20 20 20 20 20 20 20 20  aff             
18e00 20 2f 2a 20 49 66 20 65 44 65 73 74 20 69 73 20   /* If eDest is 
18e10 53 52 54 5f 55 6e 69 6f 6e 2c 20 74 68 65 20 61  SRT_Union, the a
18e20 66 66 69 6e 69 74 79 20 73 74 72 69 6e 67 20 2a  ffinity string *
18e30 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b  /.){.  int i, j;
18e40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
18e50 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 73 20 2a   Loop counters *
18e60 2f 0a 20 20 57 68 65 72 65 49 6e 66 6f 20 2a 70  /.  WhereInfo *p
18e70 57 49 6e 66 6f 3b 20 20 20 20 20 2f 2a 20 52 65  WInfo;     /* Re
18e80 74 75 72 6e 20 66 72 6f 6d 20 73 71 6c 69 74 65  turn from sqlite
18e90 33 57 68 65 72 65 42 65 67 69 6e 28 29 20 2a 2f  3WhereBegin() */
18ea0 0a 20 20 56 64 62 65 20 2a 76 3b 20 20 20 20 20  .  Vdbe *v;     
18eb0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
18ec0 20 76 69 72 74 75 61 6c 20 6d 61 63 68 69 6e 65   virtual machine
18ed0 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74   under construct
18ee0 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 69 73 41  ion */.  int isA
18ef0 67 67 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  gg;             
18f00 2f 2a 20 54 72 75 65 20 66 6f 72 20 73 65 6c 65  /* True for sele
18f10 63 74 20 6c 69 73 74 73 20 6c 69 6b 65 20 22 63  ct lists like "c
18f20 6f 75 6e 74 28 2a 29 22 20 2a 2f 0a 20 20 45 78  ount(*)" */.  Ex
18f30 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 3b 20  prList *pEList; 
18f40 20 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20       /* List of 
18f50 63 6f 6c 75 6d 6e 73 20 74 6f 20 65 78 74 72 61  columns to extra
18f60 63 74 2e 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74  ct. */.  SrcList
18f70 20 2a 70 54 61 62 4c 69 73 74 3b 20 20 20 20 20   *pTabList;     
18f80 2f 2a 20 4c 69 73 74 20 6f 66 20 74 61 62 6c 65  /* List of table
18f90 73 20 74 6f 20 73 65 6c 65 63 74 20 66 72 6f 6d  s to select from
18fa0 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 57 68 65   */.  Expr *pWhe
18fb0 72 65 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  re;          /* 
18fc0 54 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  The WHERE clause
18fd0 2e 20 20 4d 61 79 20 62 65 20 4e 55 4c 4c 20 2a  .  May be NULL *
18fe0 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4f  /.  ExprList *pO
18ff0 72 64 65 72 42 79 3b 20 20 20 20 2f 2a 20 54 68  rderBy;    /* Th
19000 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73  e ORDER BY claus
19010 65 2e 20 20 4d 61 79 20 62 65 20 4e 55 4c 4c 20  e.  May be NULL 
19020 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70  */.  ExprList *p
19030 47 72 6f 75 70 42 79 3b 20 20 20 20 2f 2a 20 54  GroupBy;    /* T
19040 68 65 20 47 52 4f 55 50 20 42 59 20 63 6c 61 75  he GROUP BY clau
19050 73 65 2e 20 20 4d 61 79 20 62 65 20 4e 55 4c 4c  se.  May be NULL
19060 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 48 61 76   */.  Expr *pHav
19070 69 6e 67 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  ing;         /* 
19080 54 68 65 20 48 41 56 49 4e 47 20 63 6c 61 75 73  The HAVING claus
19090 65 2e 20 20 4d 61 79 20 62 65 20 4e 55 4c 4c 20  e.  May be NULL 
190a0 2a 2f 0a 20 20 69 6e 74 20 69 73 44 69 73 74 69  */.  int isDisti
190b0 6e 63 74 3b 20 20 20 20 20 20 20 20 2f 2a 20 54  nct;        /* T
190c0 72 75 65 20 69 66 20 74 68 65 20 44 49 53 54 49  rue if the DISTI
190d0 4e 43 54 20 6b 65 79 77 6f 72 64 20 69 73 20 70  NCT keyword is p
190e0 72 65 73 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20  resent */.  int 
190f0 64 69 73 74 69 6e 63 74 3b 20 20 20 20 20 20 20  distinct;       
19100 20 20 20 2f 2a 20 54 61 62 6c 65 20 74 6f 20 75     /* Table to u
19110 73 65 20 66 6f 72 20 74 68 65 20 64 69 73 74 69  se for the disti
19120 6e 63 74 20 73 65 74 20 2a 2f 0a 20 20 69 6e 74  nct set */.  int
19130 20 72 63 20 3d 20 31 3b 20 20 20 20 20 20 20 20   rc = 1;        
19140 20 20 20 20 2f 2a 20 56 61 6c 75 65 20 74 6f 20      /* Value to 
19150 72 65 74 75 72 6e 20 66 72 6f 6d 20 74 68 69 73  return from this
19160 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 69   function */.  i
19170 6e 74 20 61 64 64 72 53 6f 72 74 49 6e 64 65 78  nt addrSortIndex
19180 3b 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73  ;     /* Address
19190 20 6f 66 20 61 6e 20 4f 50 5f 4f 70 65 6e 45 70   of an OP_OpenEp
191a0 68 65 6d 65 72 61 6c 20 69 6e 73 74 72 75 63 74  hemeral instruct
191b0 69 6f 6e 20 2a 2f 0a 20 20 41 67 67 49 6e 66 6f  ion */.  AggInfo
191c0 20 73 41 67 67 49 6e 66 6f 3b 20 20 20 20 20 20   sAggInfo;      
191d0 2f 2a 20 49 6e 66 6f 72 6d 61 74 69 6f 6e 20 75  /* Information u
191e0 73 65 64 20 62 79 20 61 67 67 72 65 67 61 74 65  sed by aggregate
191f0 20 71 75 65 72 69 65 73 20 2a 2f 0a 20 20 69 6e   queries */.  in
19200 74 20 69 45 6e 64 3b 20 20 20 20 20 20 20 20 20  t iEnd;         
19210 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20       /* Address 
19220 6f 66 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68  of the end of th
19230 65 20 71 75 65 72 79 20 2a 2f 0a 20 20 73 71 6c  e query */.  sql
19240 69 74 65 33 20 2a 64 62 3b 20 20 20 20 20 20 20  ite3 *db;       
19250 20 20 20 20 2f 2a 20 54 68 65 20 64 61 74 61 62      /* The datab
19260 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a  ase connection *
19270 2f 0a 0a 20 20 64 62 20 3d 20 70 50 61 72 73 65  /..  db = pParse
19280 2d 3e 64 62 3b 0a 20 20 69 66 28 20 70 3d 3d 30  ->db;.  if( p==0
19290 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61   || db->mallocFa
192a0 69 6c 65 64 20 7c 7c 20 70 50 61 72 73 65 2d 3e  iled || pParse->
192b0 6e 45 72 72 20 29 7b 0a 20 20 20 20 72 65 74 75  nErr ){.    retu
192c0 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 69 66 28 20  rn 1;.  }.  if( 
192d0 73 71 6c 69 74 65 33 41 75 74 68 43 68 65 63 6b  sqlite3AuthCheck
192e0 28 70 50 61 72 73 65 2c 20 53 51 4c 49 54 45 5f  (pParse, SQLITE_
192f0 53 45 4c 45 43 54 2c 20 30 2c 20 30 2c 20 30 29  SELECT, 0, 0, 0)
19300 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 6d   ) return 1;.  m
19310 65 6d 73 65 74 28 26 73 41 67 67 49 6e 66 6f 2c  emset(&sAggInfo,
19320 20 30 2c 20 73 69 7a 65 6f 66 28 73 41 67 67 49   0, sizeof(sAggI
19330 6e 66 6f 29 29 3b 0a 0a 20 20 70 4f 72 64 65 72  nfo));..  pOrder
19340 42 79 20 3d 20 70 2d 3e 70 4f 72 64 65 72 42 79  By = p->pOrderBy
19350 3b 0a 20 20 69 66 28 20 49 67 6e 6f 72 61 62 6c  ;.  if( Ignorabl
19360 65 4f 72 64 65 72 62 79 28 70 44 65 73 74 29 20  eOrderby(pDest) 
19370 29 7b 0a 20 20 20 20 70 2d 3e 70 4f 72 64 65 72  ){.    p->pOrder
19380 42 79 20 3d 20 30 3b 0a 0a 20 20 20 20 2f 2a 20  By = 0;..    /* 
19390 49 6e 20 74 68 65 73 65 20 63 61 73 65 73 20 74  In these cases t
193a0 68 65 20 44 49 53 54 49 4e 43 54 20 6f 70 65 72  he DISTINCT oper
193b0 61 74 6f 72 20 6d 61 6b 65 73 20 6e 6f 20 64 69  ator makes no di
193c0 66 66 65 72 65 6e 63 65 20 74 6f 20 74 68 65 0a  fference to the.
193d0 20 20 20 20 2a 2a 20 72 65 73 75 6c 74 73 2c 20      ** results, 
193e0 73 6f 20 72 65 6d 6f 76 65 20 69 74 20 69 66 20  so remove it if 
193f0 69 74 20 77 65 72 65 20 73 70 65 63 69 66 69 65  it were specifie
19400 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61 73  d..    */.    as
19410 73 65 72 74 28 70 44 65 73 74 2d 3e 65 44 65 73  sert(pDest->eDes
19420 74 3d 3d 53 52 54 5f 45 78 69 73 74 73 20 7c 7c  t==SRT_Exists ||
19430 20 70 44 65 73 74 2d 3e 65 44 65 73 74 3d 3d 53   pDest->eDest==S
19440 52 54 5f 55 6e 69 6f 6e 20 7c 7c 20 0a 20 20 20  RT_Union || .   
19450 20 20 20 20 20 20 20 20 70 44 65 73 74 2d 3e 65          pDest->e
19460 44 65 73 74 3d 3d 53 52 54 5f 45 78 63 65 70 74  Dest==SRT_Except
19470 20 7c 7c 20 70 44 65 73 74 2d 3e 65 44 65 73 74   || pDest->eDest
19480 3d 3d 53 52 54 5f 44 69 73 63 61 72 64 29 3b 0a  ==SRT_Discard);.
19490 20 20 20 20 70 2d 3e 69 73 44 69 73 74 69 6e 63      p->isDistinc
194a0 74 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28  t = 0;.  }.  if(
194b0 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 52 65   sqlite3SelectRe
194c0 73 6f 6c 76 65 28 70 50 61 72 73 65 2c 20 70 2c  solve(pParse, p,
194d0 20 30 29 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20   0) ){.    goto 
194e0 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 7d 0a  select_end;.  }.
194f0 20 20 70 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20    p->pOrderBy = 
19500 70 4f 72 64 65 72 42 79 3b 0a 0a 23 69 66 6e 64  pOrderBy;..#ifnd
19510 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43  ef SQLITE_OMIT_C
19520 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45 43 54 0a 20  OMPOUND_SELECT. 
19530 20 2f 2a 20 49 66 20 74 68 65 72 65 20 69 73 20   /* If there is 
19540 61 72 65 20 61 20 73 65 71 75 65 6e 63 65 20 6f  are a sequence o
19550 66 20 71 75 65 72 69 65 73 2c 20 64 6f 20 74 68  f queries, do th
19560 65 20 65 61 72 6c 69 65 72 20 6f 6e 65 73 20 66  e earlier ones f
19570 69 72 73 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  irst..  */.  if(
19580 20 70 2d 3e 70 50 72 69 6f 72 20 29 7b 0a 20 20   p->pPrior ){.  
19590 20 20 69 66 28 20 70 2d 3e 70 52 69 67 68 74 6d    if( p->pRightm
195a0 6f 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ost==0 ){.      
195b0 53 65 6c 65 63 74 20 2a 70 4c 6f 6f 70 2c 20 2a  Select *pLoop, *
195c0 70 52 69 67 68 74 20 3d 20 30 3b 0a 20 20 20 20  pRight = 0;.    
195d0 20 20 69 6e 74 20 63 6e 74 20 3d 20 30 3b 0a 20    int cnt = 0;. 
195e0 20 20 20 20 20 69 6e 74 20 6d 78 53 65 6c 65 63       int mxSelec
195f0 74 3b 0a 20 20 20 20 20 20 66 6f 72 28 70 4c 6f  t;.      for(pLo
19600 6f 70 3d 70 3b 20 70 4c 6f 6f 70 3b 20 70 4c 6f  op=p; pLoop; pLo
19610 6f 70 3d 70 4c 6f 6f 70 2d 3e 70 50 72 69 6f 72  op=pLoop->pPrior
19620 2c 20 63 6e 74 2b 2b 29 7b 0a 20 20 20 20 20 20  , cnt++){.      
19630 20 20 70 4c 6f 6f 70 2d 3e 70 52 69 67 68 74 6d    pLoop->pRightm
19640 6f 73 74 20 3d 20 70 3b 0a 20 20 20 20 20 20 20  ost = p;.       
19650 20 70 4c 6f 6f 70 2d 3e 70 4e 65 78 74 20 3d 20   pLoop->pNext = 
19660 70 52 69 67 68 74 3b 0a 20 20 20 20 20 20 20 20  pRight;.        
19670 70 52 69 67 68 74 20 3d 20 70 4c 6f 6f 70 3b 0a  pRight = pLoop;.
19680 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 6d 78        }.      mx
19690 53 65 6c 65 63 74 20 3d 20 64 62 2d 3e 61 4c 69  Select = db->aLi
196a0 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54  mit[SQLITE_LIMIT
196b0 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45 43 54  _COMPOUND_SELECT
196c0 5d 3b 0a 20 20 20 20 20 20 69 66 28 20 6d 78 53  ];.      if( mxS
196d0 65 6c 65 63 74 20 26 26 20 63 6e 74 3e 6d 78 53  elect && cnt>mxS
196e0 65 6c 65 63 74 20 29 7b 0a 20 20 20 20 20 20 20  elect ){.       
196f0 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
19700 28 70 50 61 72 73 65 2c 20 22 74 6f 6f 20 6d 61  (pParse, "too ma
19710 6e 79 20 74 65 72 6d 73 20 69 6e 20 63 6f 6d 70  ny terms in comp
19720 6f 75 6e 64 20 53 45 4c 45 43 54 22 29 3b 0a 20  ound SELECT");. 
19730 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b         return 1;
19740 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
19750 20 20 20 72 65 74 75 72 6e 20 6d 75 6c 74 69 53     return multiS
19760 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70 2c  elect(pParse, p,
19770 20 70 44 65 73 74 2c 20 61 66 66 29 3b 0a 20 20   pDest, aff);.  
19780 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 4d  }.#endif..  /* M
19790 61 6b 65 20 6c 6f 63 61 6c 20 63 6f 70 69 65 73  ake local copies
197a0 20 6f 66 20 74 68 65 20 70 61 72 61 6d 65 74 65   of the paramete
197b0 72 73 20 66 6f 72 20 74 68 69 73 20 71 75 65 72  rs for this quer
197c0 79 2e 0a 20 20 2a 2f 0a 20 20 70 54 61 62 4c 69  y..  */.  pTabLi
197d0 73 74 20 3d 20 70 2d 3e 70 53 72 63 3b 0a 20 20  st = p->pSrc;.  
197e0 70 57 68 65 72 65 20 3d 20 70 2d 3e 70 57 68 65  pWhere = p->pWhe
197f0 72 65 3b 0a 20 20 70 47 72 6f 75 70 42 79 20 3d  re;.  pGroupBy =
19800 20 70 2d 3e 70 47 72 6f 75 70 42 79 3b 0a 20 20   p->pGroupBy;.  
19810 70 48 61 76 69 6e 67 20 3d 20 70 2d 3e 70 48 61  pHaving = p->pHa
19820 76 69 6e 67 3b 0a 20 20 69 73 41 67 67 20 3d 20  ving;.  isAgg = 
19830 70 2d 3e 69 73 41 67 67 3b 0a 20 20 69 73 44 69  p->isAgg;.  isDi
19840 73 74 69 6e 63 74 20 3d 20 70 2d 3e 69 73 44 69  stinct = p->isDi
19850 73 74 69 6e 63 74 3b 0a 20 20 70 45 4c 69 73 74  stinct;.  pEList
19860 20 3d 20 70 2d 3e 70 45 4c 69 73 74 3b 0a 20 20   = p->pEList;.  
19870 69 66 28 20 70 45 4c 69 73 74 3d 3d 30 20 29 20  if( pEList==0 ) 
19880 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b  goto select_end;
19890 0a 0a 20 20 2f 2a 20 0a 20 20 2a 2a 20 44 6f 20  ..  /* .  ** Do 
198a0 6e 6f 74 20 65 76 65 6e 20 61 74 74 65 6d 70 74  not even attempt
198b0 20 74 6f 20 67 65 6e 65 72 61 74 65 20 61 6e 79   to generate any
198c0 20 63 6f 64 65 20 69 66 20 77 65 20 68 61 76 65   code if we have
198d0 20 61 6c 72 65 61 64 79 20 73 65 65 6e 0a 20 20   already seen.  
198e0 2a 2a 20 65 72 72 6f 72 73 20 62 65 66 6f 72 65  ** errors before
198f0 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 73 74   this routine st
19900 61 72 74 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  arts..  */.  if(
19910 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 3e 30 20   pParse->nErr>0 
19920 29 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e  ) goto select_en
19930 64 3b 0a 0a 20 20 2f 2a 20 49 66 20 77 72 69 74  d;..  /* If writ
19940 69 6e 67 20 74 6f 20 6d 65 6d 6f 72 79 20 6f 72  ing to memory or
19950 20 67 65 6e 65 72 61 74 69 6e 67 20 61 20 73 65   generating a se
19960 74 0a 20 20 2a 2a 20 6f 6e 6c 79 20 61 20 73 69  t.  ** only a si
19970 6e 67 6c 65 20 63 6f 6c 75 6d 6e 20 6d 61 79 20  ngle column may 
19980 62 65 20 6f 75 74 70 75 74 2e 0a 20 20 2a 2f 0a  be output..  */.
19990 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
199a0 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 20 20 69  MIT_SUBQUERY.  i
199b0 66 28 20 63 68 65 63 6b 46 6f 72 4d 75 6c 74 69  f( checkForMulti
199c0 43 6f 6c 75 6d 6e 53 65 6c 65 63 74 45 72 72 6f  ColumnSelectErro
199d0 72 28 70 50 61 72 73 65 2c 20 70 44 65 73 74 2c  r(pParse, pDest,
199e0 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 29 20   pEList->nExpr) 
199f0 29 7b 0a 20 20 20 20 67 6f 74 6f 20 73 65 6c 65  ){.    goto sele
19a00 63 74 5f 65 6e 64 3b 0a 20 20 7d 0a 23 65 6e 64  ct_end;.  }.#end
19a10 69 66 0a 0a 20 20 2f 2a 20 4f 52 44 45 52 20 42  if..  /* ORDER B
19a20 59 20 69 73 20 69 67 6e 6f 72 65 64 20 66 6f 72  Y is ignored for
19a30 20 73 6f 6d 65 20 64 65 73 74 69 6e 61 74 69 6f   some destinatio
19a40 6e 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 49  ns..  */.  if( I
19a50 67 6e 6f 72 61 62 6c 65 4f 72 64 65 72 62 79 28  gnorableOrderby(
19a60 70 44 65 73 74 29 20 29 7b 0a 20 20 20 20 70 4f  pDest) ){.    pO
19a70 72 64 65 72 42 79 20 3d 20 30 3b 0a 20 20 7d 0a  rderBy = 0;.  }.
19a80 0a 20 20 2f 2a 20 42 65 67 69 6e 20 67 65 6e 65  .  /* Begin gene
19a90 72 61 74 69 6e 67 20 63 6f 64 65 2e 0a 20 20 2a  rating code..  *
19aa0 2f 0a 20 20 76 20 3d 20 73 71 6c 69 74 65 33 47  /.  v = sqlite3G
19ab0 65 74 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a  etVdbe(pParse);.
19ac0 20 20 69 66 28 20 76 3d 3d 30 20 29 20 67 6f 74    if( v==0 ) got
19ad0 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 0a 20  o select_end;.. 
19ae0 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64   /* Generate cod
19af0 65 20 66 6f 72 20 61 6c 6c 20 73 75 62 2d 71 75  e for all sub-qu
19b00 65 72 69 65 73 20 69 6e 20 74 68 65 20 46 52 4f  eries in the FRO
19b10 4d 20 63 6c 61 75 73 65 0a 20 20 2a 2f 0a 23 69  M clause.  */.#i
19b20 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  f !defined(SQLIT
19b30 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 29  E_OMIT_SUBQUERY)
19b40 20 7c 7c 20 21 64 65 66 69 6e 65 64 28 53 51 4c   || !defined(SQL
19b50 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 29 0a 20  ITE_OMIT_VIEW). 
19b60 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 54 61 62   for(i=0; i<pTab
19b70 4c 69 73 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b 29  List->nSrc; i++)
19b80 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72  {.    const char
19b90 20 2a 7a 53 61 76 65 64 41 75 74 68 43 6f 6e 74   *zSavedAuthCont
19ba0 65 78 74 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74  ext = 0;.    int
19bb0 20 6e 65 65 64 52 65 73 74 6f 72 65 43 6f 6e 74   needRestoreCont
19bc0 65 78 74 3b 0a 20 20 20 20 73 74 72 75 63 74 20  ext;.    struct 
19bd0 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49  SrcList_item *pI
19be0 74 65 6d 20 3d 20 26 70 54 61 62 4c 69 73 74 2d  tem = &pTabList-
19bf0 3e 61 5b 69 5d 3b 0a 20 20 20 20 53 65 6c 65 63  >a[i];.    Selec
19c00 74 44 65 73 74 20 64 65 73 74 3b 0a 0a 20 20 20  tDest dest;..   
19c10 20 69 66 28 20 70 49 74 65 6d 2d 3e 70 53 65 6c   if( pItem->pSel
19c20 65 63 74 3d 3d 30 20 7c 7c 20 70 49 74 65 6d 2d  ect==0 || pItem-
19c30 3e 69 73 50 6f 70 75 6c 61 74 65 64 20 29 20 63  >isPopulated ) c
19c40 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69 66 28  ontinue;.    if(
19c50 20 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65 21 3d 30   pItem->zName!=0
19c60 20 29 7b 0a 20 20 20 20 20 20 7a 53 61 76 65 64   ){.      zSaved
19c70 41 75 74 68 43 6f 6e 74 65 78 74 20 3d 20 70 50  AuthContext = pP
19c80 61 72 73 65 2d 3e 7a 41 75 74 68 43 6f 6e 74 65  arse->zAuthConte
19c90 78 74 3b 0a 20 20 20 20 20 20 70 50 61 72 73 65  xt;.      pParse
19ca0 2d 3e 7a 41 75 74 68 43 6f 6e 74 65 78 74 20 3d  ->zAuthContext =
19cb0 20 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65 3b 0a 20   pItem->zName;. 
19cc0 20 20 20 20 20 6e 65 65 64 52 65 73 74 6f 72 65       needRestore
19cd0 43 6f 6e 74 65 78 74 20 3d 20 31 3b 0a 20 20 20  Context = 1;.   
19ce0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 6e 65   }else{.      ne
19cf0 65 64 52 65 73 74 6f 72 65 43 6f 6e 74 65 78 74  edRestoreContext
19d00 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20   = 0;.    }.    
19d10 2f 2a 20 49 6e 63 72 65 6d 65 6e 74 20 50 61 72  /* Increment Par
19d20 73 65 2e 6e 48 65 69 67 68 74 20 62 79 20 74 68  se.nHeight by th
19d30 65 20 68 65 69 67 68 74 20 6f 66 20 74 68 65 20  e height of the 
19d40 6c 61 72 67 65 73 74 20 65 78 70 72 65 73 73 69  largest expressi
19d50 6f 6e 0a 20 20 20 20 2a 2a 20 74 72 65 65 20 72  on.    ** tree r
19d60 65 66 65 72 65 64 20 74 6f 20 62 79 20 74 68 69  efered to by thi
19d70 73 2c 20 74 68 65 20 70 61 72 65 6e 74 20 73 65  s, the parent se
19d80 6c 65 63 74 2e 20 54 68 65 20 63 68 69 6c 64 20  lect. The child 
19d90 73 65 6c 65 63 74 0a 20 20 20 20 2a 2a 20 6d 61  select.    ** ma
19da0 79 20 63 6f 6e 74 61 69 6e 20 65 78 70 72 65 73  y contain expres
19db0 73 69 6f 6e 20 74 72 65 65 73 20 6f 66 20 61 74  sion trees of at
19dc0 20 6d 6f 73 74 0a 20 20 20 20 2a 2a 20 28 53 51   most.    ** (SQ
19dd0 4c 49 54 45 5f 4d 41 58 5f 45 58 50 52 5f 44 45  LITE_MAX_EXPR_DE
19de0 50 54 48 2d 50 61 72 73 65 2e 6e 48 65 69 67 68  PTH-Parse.nHeigh
19df0 74 29 20 68 65 69 67 68 74 2e 20 54 68 69 73 20  t) height. This 
19e00 69 73 20 61 20 62 69 74 0a 20 20 20 20 2a 2a 20  is a bit.    ** 
19e10 6d 6f 72 65 20 63 6f 6e 73 65 72 76 61 74 69 76  more conservativ
19e20 65 20 74 68 61 6e 20 6e 65 63 65 73 73 61 72 79  e than necessary
19e30 2c 20 62 75 74 20 6d 75 63 68 20 65 61 73 69 65  , but much easie
19e40 72 20 74 68 61 6e 20 65 6e 66 6f 72 63 69 6e 67  r than enforcing
19e50 0a 20 20 20 20 2a 2a 20 61 6e 20 65 78 61 63 74  .    ** an exact
19e60 20 6c 69 6d 69 74 2e 0a 20 20 20 20 2a 2f 0a 20   limit..    */. 
19e70 20 20 20 70 50 61 72 73 65 2d 3e 6e 48 65 69 67     pParse->nHeig
19e80 68 74 20 2b 3d 20 73 71 6c 69 74 65 33 53 65 6c  ht += sqlite3Sel
19e90 65 63 74 45 78 70 72 48 65 69 67 68 74 28 70 29  ectExprHeight(p)
19ea0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c  ;.    sqlite3Sel
19eb0 65 63 74 44 65 73 74 49 6e 69 74 28 26 64 65 73  ectDestInit(&des
19ec0 74 2c 20 53 52 54 5f 45 70 68 65 6d 54 61 62 2c  t, SRT_EphemTab,
19ed0 20 70 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72 29   pItem->iCursor)
19ee0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c  ;.    sqlite3Sel
19ef0 65 63 74 28 70 50 61 72 73 65 2c 20 70 49 74 65  ect(pParse, pIte
19f00 6d 2d 3e 70 53 65 6c 65 63 74 2c 20 26 64 65 73  m->pSelect, &des
19f10 74 2c 20 70 2c 20 69 2c 20 26 69 73 41 67 67 2c  t, p, i, &isAgg,
19f20 20 30 29 3b 0a 20 20 20 20 69 66 28 20 64 62 2d   0);.    if( db-
19f30 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b  >mallocFailed ){
19f40 0a 20 20 20 20 20 20 67 6f 74 6f 20 73 65 6c 65  .      goto sele
19f50 63 74 5f 65 6e 64 3b 0a 20 20 20 20 7d 0a 20 20  ct_end;.    }.  
19f60 20 20 70 50 61 72 73 65 2d 3e 6e 48 65 69 67 68    pParse->nHeigh
19f70 74 20 2d 3d 20 73 71 6c 69 74 65 33 53 65 6c 65  t -= sqlite3Sele
19f80 63 74 45 78 70 72 48 65 69 67 68 74 28 70 29 3b  ctExprHeight(p);
19f90 0a 20 20 20 20 69 66 28 20 6e 65 65 64 52 65 73  .    if( needRes
19fa0 74 6f 72 65 43 6f 6e 74 65 78 74 20 29 7b 0a 20  toreContext ){. 
19fb0 20 20 20 20 20 70 50 61 72 73 65 2d 3e 7a 41 75       pParse->zAu
19fc0 74 68 43 6f 6e 74 65 78 74 20 3d 20 7a 53 61 76  thContext = zSav
19fd0 65 64 41 75 74 68 43 6f 6e 74 65 78 74 3b 0a 20  edAuthContext;. 
19fe0 20 20 20 7d 0a 20 20 20 20 70 54 61 62 4c 69 73     }.    pTabLis
19ff0 74 20 3d 20 70 2d 3e 70 53 72 63 3b 0a 20 20 20  t = p->pSrc;.   
1a000 20 70 57 68 65 72 65 20 3d 20 70 2d 3e 70 57 68   pWhere = p->pWh
1a010 65 72 65 3b 0a 20 20 20 20 69 66 28 20 21 49 67  ere;.    if( !Ig
1a020 6e 6f 72 61 62 6c 65 4f 72 64 65 72 62 79 28 70  norableOrderby(p
1a030 44 65 73 74 29 20 29 7b 0a 20 20 20 20 20 20 70  Dest) ){.      p
1a040 4f 72 64 65 72 42 79 20 3d 20 70 2d 3e 70 4f 72  OrderBy = p->pOr
1a050 64 65 72 42 79 3b 0a 20 20 20 20 7d 0a 20 20 20  derBy;.    }.   
1a060 20 70 47 72 6f 75 70 42 79 20 3d 20 70 2d 3e 70   pGroupBy = p->p
1a070 47 72 6f 75 70 42 79 3b 0a 20 20 20 20 70 48 61  GroupBy;.    pHa
1a080 76 69 6e 67 20 3d 20 70 2d 3e 70 48 61 76 69 6e  ving = p->pHavin
1a090 67 3b 0a 20 20 20 20 69 73 44 69 73 74 69 6e 63  g;.    isDistinc
1a0a0 74 20 3d 20 70 2d 3e 69 73 44 69 73 74 69 6e 63  t = p->isDistinc
1a0b0 74 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20  t;.  }.#endif.. 
1a0c0 20 2f 2a 20 43 68 65 63 6b 20 74 6f 20 73 65 65   /* Check to see
1a0d0 20 69 66 20 74 68 69 73 20 69 73 20 61 20 73 75   if this is a su
1a0e0 62 71 75 65 72 79 20 74 68 61 74 20 63 61 6e 20  bquery that can 
1a0f0 62 65 20 22 66 6c 61 74 74 65 6e 65 64 22 20 69  be "flattened" i
1a100 6e 74 6f 20 69 74 73 20 70 61 72 65 6e 74 2e 0a  nto its parent..
1a110 20 20 2a 2a 20 49 66 20 66 6c 61 74 74 65 6e 69    ** If flatteni
1a120 6e 67 20 69 73 20 61 20 70 6f 73 73 69 62 6c 69  ng is a possibli
1a130 74 79 2c 20 64 6f 20 73 6f 20 61 6e 64 20 72 65  ty, do so and re
1a140 74 75 72 6e 20 69 6d 6d 65 64 69 61 74 65 6c 79  turn immediately
1a150 2e 20 20 0a 20 20 2a 2f 0a 23 69 66 6e 64 65 66  .  .  */.#ifndef
1a160 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45   SQLITE_OMIT_VIE
1a170 57 0a 20 20 69 66 28 20 70 50 61 72 65 6e 74 20  W.  if( pParent 
1a180 26 26 20 70 50 61 72 65 6e 74 41 67 67 20 26 26  && pParentAgg &&
1a190 0a 20 20 20 20 20 20 66 6c 61 74 74 65 6e 53 75  .      flattenSu
1a1a0 62 71 75 65 72 79 28 64 62 2c 20 70 50 61 72 65  bquery(db, pPare
1a1b0 6e 74 2c 20 70 61 72 65 6e 74 54 61 62 2c 20 2a  nt, parentTab, *
1a1c0 70 50 61 72 65 6e 74 41 67 67 2c 20 69 73 41 67  pParentAgg, isAg
1a1d0 67 29 20 29 7b 0a 20 20 20 20 69 66 28 20 69 73  g) ){.    if( is
1a1e0 41 67 67 20 29 20 2a 70 50 61 72 65 6e 74 41 67  Agg ) *pParentAg
1a1f0 67 20 3d 20 31 3b 0a 20 20 20 20 67 6f 74 6f 20  g = 1;.    goto 
1a200 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 7d 0a  select_end;.  }.
1a210 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 49 66 20  #endif..  /* If 
1a220 70 6f 73 73 69 62 6c 65 2c 20 72 65 77 72 69 74  possible, rewrit
1a230 65 20 74 68 65 20 71 75 65 72 79 20 74 6f 20 75  e the query to u
1a240 73 65 20 47 52 4f 55 50 20 42 59 20 69 6e 73 74  se GROUP BY inst
1a250 65 61 64 20 6f 66 20 44 49 53 54 49 4e 43 54 2e  ead of DISTINCT.
1a260 0a 20 20 2a 2a 20 47 52 4f 55 50 20 42 59 20 6d  .  ** GROUP BY m
1a270 61 79 20 75 73 65 20 61 6e 20 69 6e 64 65 78 2c  ay use an index,
1a280 20 44 49 53 54 49 4e 43 54 20 6e 65 76 65 72 20   DISTINCT never 
1a290 64 6f 65 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  does..  */.  if(
1a2a0 20 70 2d 3e 69 73 44 69 73 74 69 6e 63 74 20 26   p->isDistinct &
1a2b0 26 20 21 70 2d 3e 69 73 41 67 67 20 26 26 20 21  & !p->isAgg && !
1a2c0 70 2d 3e 70 47 72 6f 75 70 42 79 20 29 7b 0a 20  p->pGroupBy ){. 
1a2d0 20 20 20 70 2d 3e 70 47 72 6f 75 70 42 79 20 3d     p->pGroupBy =
1a2e0 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
1a2f0 44 75 70 28 64 62 2c 20 70 2d 3e 70 45 4c 69 73  Dup(db, p->pELis
1a300 74 29 3b 0a 20 20 20 20 70 47 72 6f 75 70 42 79  t);.    pGroupBy
1a310 20 3d 20 70 2d 3e 70 47 72 6f 75 70 42 79 3b 0a   = p->pGroupBy;.
1a320 20 20 20 20 70 2d 3e 69 73 44 69 73 74 69 6e 63      p->isDistinc
1a330 74 20 3d 20 30 3b 0a 20 20 20 20 69 73 44 69 73  t = 0;.    isDis
1a340 74 69 6e 63 74 20 3d 20 30 3b 0a 20 20 7d 0a 0a  tinct = 0;.  }..
1a350 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20 69 73    /* If there is
1a360 20 61 6e 20 4f 52 44 45 52 20 42 59 20 63 6c 61   an ORDER BY cla
1a370 75 73 65 2c 20 74 68 65 6e 20 74 68 69 73 20 73  use, then this s
1a380 6f 72 74 69 6e 67 0a 20 20 2a 2a 20 69 6e 64 65  orting.  ** inde
1a390 78 20 6d 69 67 68 74 20 65 6e 64 20 75 70 20 62  x might end up b
1a3a0 65 69 6e 67 20 75 6e 75 73 65 64 20 69 66 20 74  eing unused if t
1a3b0 68 65 20 64 61 74 61 20 63 61 6e 20 62 65 20 0a  he data can be .
1a3c0 20 20 2a 2a 20 65 78 74 72 61 63 74 65 64 20 69    ** extracted i
1a3d0 6e 20 70 72 65 2d 73 6f 72 74 65 64 20 6f 72 64  n pre-sorted ord
1a3e0 65 72 2e 20 20 49 66 20 74 68 61 74 20 69 73 20  er.  If that is 
1a3f0 74 68 65 20 63 61 73 65 2c 20 74 68 65 6e 20 74  the case, then t
1a400 68 65 0a 20 20 2a 2a 20 4f 50 5f 4f 70 65 6e 45  he.  ** OP_OpenE
1a410 70 68 65 6d 65 72 61 6c 20 69 6e 73 74 72 75 63  phemeral instruc
1a420 74 69 6f 6e 20 77 69 6c 6c 20 62 65 20 63 68 61  tion will be cha
1a430 6e 67 65 64 20 74 6f 20 61 6e 20 4f 50 5f 4e 6f  nged to an OP_No
1a440 6f 70 20 6f 6e 63 65 0a 20 20 2a 2a 20 77 65 20  op once.  ** we 
1a450 66 69 67 75 72 65 20 6f 75 74 20 74 68 61 74 20  figure out that 
1a460 74 68 65 20 73 6f 72 74 69 6e 67 20 69 6e 64 65  the sorting inde
1a470 78 20 69 73 20 6e 6f 74 20 6e 65 65 64 65 64 2e  x is not needed.
1a480 20 20 54 68 65 20 61 64 64 72 53 6f 72 74 49 6e    The addrSortIn
1a490 64 65 78 0a 20 20 2a 2a 20 76 61 72 69 61 62 6c  dex.  ** variabl
1a4a0 65 20 69 73 20 75 73 65 64 20 74 6f 20 66 61 63  e is used to fac
1a4b0 69 6c 69 74 61 74 65 20 74 68 61 74 20 63 68 61  ilitate that cha
1a4c0 6e 67 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  nge..  */.  if( 
1a4d0 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20  pOrderBy ){.    
1a4e0 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66  KeyInfo *pKeyInf
1a4f0 6f 3b 0a 20 20 20 20 70 4b 65 79 49 6e 66 6f 20  o;.    pKeyInfo 
1a500 3d 20 6b 65 79 49 6e 66 6f 46 72 6f 6d 45 78 70  = keyInfoFromExp
1a510 72 4c 69 73 74 28 70 50 61 72 73 65 2c 20 70 4f  rList(pParse, pO
1a520 72 64 65 72 42 79 29 3b 0a 20 20 20 20 70 4f 72  rderBy);.    pOr
1a530 64 65 72 42 79 2d 3e 69 45 43 75 72 73 6f 72 20  derBy->iECursor 
1a540 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b  = pParse->nTab++
1a550 3b 0a 20 20 20 20 70 2d 3e 61 64 64 72 4f 70 65  ;.    p->addrOpe
1a560 6e 45 70 68 6d 5b 32 5d 20 3d 20 61 64 64 72 53  nEphm[2] = addrS
1a570 6f 72 74 49 6e 64 65 78 20 3d 0a 20 20 20 20 20  ortIndex =.     
1a580 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
1a590 70 34 28 76 2c 20 4f 50 5f 4f 70 65 6e 45 70 68  p4(v, OP_OpenEph
1a5a0 65 6d 65 72 61 6c 2c 0a 20 20 20 20 20 20 20 20  emeral,.        
1a5b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a5c0 20 20 20 70 4f 72 64 65 72 42 79 2d 3e 69 45 43     pOrderBy->iEC
1a5d0 75 72 73 6f 72 2c 20 70 4f 72 64 65 72 42 79 2d  ursor, pOrderBy-
1a5e0 3e 6e 45 78 70 72 2b 32 2c 20 30 2c 0a 20 20 20  >nExpr+2, 0,.   
1a5f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a600 20 20 20 20 20 20 20 20 28 63 68 61 72 2a 29 70          (char*)p
1a610 4b 65 79 49 6e 66 6f 2c 20 50 34 5f 4b 45 59 49  KeyInfo, P4_KEYI
1a620 4e 46 4f 5f 48 41 4e 44 4f 46 46 29 3b 0a 20 20  NFO_HANDOFF);.  
1a630 7d 65 6c 73 65 7b 0a 20 20 20 20 61 64 64 72 53  }else{.    addrS
1a640 6f 72 74 49 6e 64 65 78 20 3d 20 2d 31 3b 0a 20  ortIndex = -1;. 
1a650 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20   }..  /* If the 
1a660 6f 75 74 70 75 74 20 69 73 20 64 65 73 74 69 6e  output is destin
1a670 65 64 20 66 6f 72 20 61 20 74 65 6d 70 6f 72 61  ed for a tempora
1a680 72 79 20 74 61 62 6c 65 2c 20 6f 70 65 6e 20 74  ry table, open t
1a690 68 61 74 20 74 61 62 6c 65 2e 0a 20 20 2a 2f 0a  hat table..  */.
1a6a0 20 20 69 66 28 20 70 44 65 73 74 2d 3e 65 44 65    if( pDest->eDe
1a6b0 73 74 3d 3d 53 52 54 5f 45 70 68 65 6d 54 61 62  st==SRT_EphemTab
1a6c0 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56   ){.    sqlite3V
1a6d0 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
1a6e0 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 2c 20 70  OpenEphemeral, p
1a6f0 44 65 73 74 2d 3e 69 50 61 72 6d 2c 20 70 45 4c  Dest->iParm, pEL
1a700 69 73 74 2d 3e 6e 45 78 70 72 29 3b 0a 20 20 7d  ist->nExpr);.  }
1a710 0a 0a 20 20 2f 2a 20 53 65 74 20 74 68 65 20 6c  ..  /* Set the l
1a720 69 6d 69 74 65 72 2e 0a 20 20 2a 2f 0a 20 20 69  imiter..  */.  i
1a730 45 6e 64 20 3d 20 73 71 6c 69 74 65 33 56 64 62  End = sqlite3Vdb
1a740 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20  eMakeLabel(v);. 
1a750 20 63 6f 6d 70 75 74 65 4c 69 6d 69 74 52 65 67   computeLimitReg
1a760 69 73 74 65 72 73 28 70 50 61 72 73 65 2c 20 70  isters(pParse, p
1a770 2c 20 69 45 6e 64 29 3b 0a 0a 20 20 2f 2a 20 4f  , iEnd);..  /* O
1a780 70 65 6e 20 61 20 76 69 72 74 75 61 6c 20 69 6e  pen a virtual in
1a790 64 65 78 20 74 6f 20 75 73 65 20 66 6f 72 20 74  dex to use for t
1a7a0 68 65 20 64 69 73 74 69 6e 63 74 20 73 65 74 2e  he distinct set.
1a7b0 0a 20 20 2a 2f 0a 20 20 69 66 28 20 69 73 44 69  .  */.  if( isDi
1a7c0 73 74 69 6e 63 74 20 29 7b 0a 20 20 20 20 4b 65  stinct ){.    Ke
1a7d0 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 3b  yInfo *pKeyInfo;
1a7e0 0a 20 20 20 20 61 73 73 65 72 74 28 20 69 73 41  .    assert( isA
1a7f0 67 67 20 7c 7c 20 70 47 72 6f 75 70 42 79 20 29  gg || pGroupBy )
1a800 3b 0a 20 20 20 20 64 69 73 74 69 6e 63 74 20 3d  ;.    distinct =
1a810 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b   pParse->nTab++;
1a820 0a 20 20 20 20 70 4b 65 79 49 6e 66 6f 20 3d 20  .    pKeyInfo = 
1a830 6b 65 79 49 6e 66 6f 46 72 6f 6d 45 78 70 72 4c  keyInfoFromExprL
1a840 69 73 74 28 70 50 61 72 73 65 2c 20 70 2d 3e 70  ist(pParse, p->p
1a850 45 4c 69 73 74 29 3b 0a 20 20 20 20 73 71 6c 69  EList);.    sqli
1a860 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c  te3VdbeAddOp4(v,
1a870 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61   OP_OpenEphemera
1a880 6c 2c 20 64 69 73 74 69 6e 63 74 2c 20 30 2c 20  l, distinct, 0, 
1a890 30 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  0,.             
1a8a0 20 20 20 20 20 20 20 20 20 20 20 28 63 68 61 72             (char
1a8b0 2a 29 70 4b 65 79 49 6e 66 6f 2c 20 50 34 5f 4b  *)pKeyInfo, P4_K
1a8c0 45 59 49 4e 46 4f 5f 48 41 4e 44 4f 46 46 29 3b  EYINFO_HANDOFF);
1a8d0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 64 69  .  }else{.    di
1a8e0 73 74 69 6e 63 74 20 3d 20 2d 31 3b 0a 20 20 7d  stinct = -1;.  }
1a8f0 0a 0a 20 20 2f 2a 20 41 67 67 72 65 67 61 74 65  ..  /* Aggregate
1a900 20 61 6e 64 20 6e 6f 6e 2d 61 67 67 72 65 67 61   and non-aggrega
1a910 74 65 20 71 75 65 72 69 65 73 20 61 72 65 20 68  te queries are h
1a920 61 6e 64 6c 65 64 20 64 69 66 66 65 72 65 6e 74  andled different
1a930 6c 79 20 2a 2f 0a 20 20 69 66 28 20 21 69 73 41  ly */.  if( !isA
1a940 67 67 20 26 26 20 70 47 72 6f 75 70 42 79 3d 3d  gg && pGroupBy==
1a950 30 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 69 73  0 ){.    /* This
1a960 20 63 61 73 65 20 69 73 20 66 6f 72 20 6e 6f 6e   case is for non
1a970 2d 61 67 67 72 65 67 61 74 65 20 71 75 65 72 69  -aggregate queri
1a980 65 73 0a 20 20 20 20 2a 2a 20 42 65 67 69 6e 20  es.    ** Begin 
1a990 74 68 65 20 64 61 74 61 62 61 73 65 20 73 63 61  the database sca
1a9a0 6e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70 57 49  n.    */.    pWI
1a9b0 6e 66 6f 20 3d 20 73 71 6c 69 74 65 33 57 68 65  nfo = sqlite3Whe
1a9c0 72 65 42 65 67 69 6e 28 70 50 61 72 73 65 2c 20  reBegin(pParse, 
1a9d0 70 54 61 62 4c 69 73 74 2c 20 70 57 68 65 72 65  pTabList, pWhere
1a9e0 2c 20 26 70 4f 72 64 65 72 42 79 2c 20 30 29 3b  , &pOrderBy, 0);
1a9f0 0a 20 20 20 20 69 66 28 20 70 57 49 6e 66 6f 3d  .    if( pWInfo=
1aa00 3d 30 20 29 20 67 6f 74 6f 20 73 65 6c 65 63 74  =0 ) goto select
1aa10 5f 65 6e 64 3b 0a 0a 20 20 20 20 2f 2a 20 49 66  _end;..    /* If
1aa20 20 73 6f 72 74 69 6e 67 20 69 6e 64 65 78 20 74   sorting index t
1aa30 68 61 74 20 77 61 73 20 63 72 65 61 74 65 64 20  hat was created 
1aa40 62 79 20 61 20 70 72 69 6f 72 20 4f 50 5f 4f 70  by a prior OP_Op
1aa50 65 6e 45 70 68 65 6d 65 72 61 6c 20 0a 20 20 20  enEphemeral .   
1aa60 20 2a 2a 20 69 6e 73 74 72 75 63 74 69 6f 6e 20   ** instruction 
1aa70 65 6e 64 65 64 20 75 70 20 6e 6f 74 20 62 65 69  ended up not bei
1aa80 6e 67 20 6e 65 65 64 65 64 2c 20 74 68 65 6e 20  ng needed, then 
1aa90 63 68 61 6e 67 65 20 74 68 65 20 4f 50 5f 4f 70  change the OP_Op
1aaa0 65 6e 45 70 68 65 6d 65 72 61 6c 0a 20 20 20 20  enEphemeral.    
1aab0 2a 2a 20 69 6e 74 6f 20 61 6e 20 4f 50 5f 4e 6f  ** into an OP_No
1aac0 6f 70 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  op..    */.    i
1aad0 66 28 20 61 64 64 72 53 6f 72 74 49 6e 64 65 78  f( addrSortIndex
1aae0 3e 3d 30 20 26 26 20 70 4f 72 64 65 72 42 79 3d  >=0 && pOrderBy=
1aaf0 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  =0 ){.      sqli
1ab00 74 65 33 56 64 62 65 43 68 61 6e 67 65 54 6f 4e  te3VdbeChangeToN
1ab10 6f 6f 70 28 76 2c 20 61 64 64 72 53 6f 72 74 49  oop(v, addrSortI
1ab20 6e 64 65 78 2c 20 31 29 3b 0a 20 20 20 20 20 20  ndex, 1);.      
1ab30 70 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b  p->addrOpenEphm[
1ab40 32 5d 20 3d 20 2d 31 3b 0a 20 20 20 20 7d 0a 0a  2] = -1;.    }..
1ab50 20 20 20 20 2f 2a 20 55 73 65 20 74 68 65 20 73      /* Use the s
1ab60 74 61 6e 64 61 72 64 20 69 6e 6e 65 72 20 6c 6f  tandard inner lo
1ab70 6f 70 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61 73  op.    */.    as
1ab80 73 65 72 74 28 21 69 73 44 69 73 74 69 6e 63 74  sert(!isDistinct
1ab90 29 3b 0a 20 20 20 20 73 65 6c 65 63 74 49 6e 6e  );.    selectInn
1aba0 65 72 4c 6f 6f 70 28 70 50 61 72 73 65 2c 20 70  erLoop(pParse, p
1abb0 2c 20 70 45 4c 69 73 74 2c 20 30 2c 20 30 2c 20  , pEList, 0, 0, 
1abc0 70 4f 72 64 65 72 42 79 2c 20 2d 31 2c 20 70 44  pOrderBy, -1, pD
1abd0 65 73 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20  est,.           
1abe0 20 20 20 20 20 20 20 20 20 70 57 49 6e 66 6f 2d           pWInfo-
1abf0 3e 69 43 6f 6e 74 69 6e 75 65 2c 20 70 57 49 6e  >iContinue, pWIn
1ac00 66 6f 2d 3e 69 42 72 65 61 6b 2c 20 61 66 66 29  fo->iBreak, aff)
1ac10 3b 0a 0a 20 20 20 20 2f 2a 20 45 6e 64 20 74 68  ;..    /* End th
1ac20 65 20 64 61 74 61 62 61 73 65 20 73 63 61 6e 20  e database scan 
1ac30 6c 6f 6f 70 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  loop..    */.   
1ac40 20 73 71 6c 69 74 65 33 57 68 65 72 65 45 6e 64   sqlite3WhereEnd
1ac50 28 70 57 49 6e 66 6f 29 3b 0a 20 20 7d 65 6c 73  (pWInfo);.  }els
1ac60 65 7b 0a 20 20 20 20 2f 2a 20 54 68 69 73 20 69  e{.    /* This i
1ac70 73 20 74 68 65 20 70 72 6f 63 65 73 73 69 6e 67  s the processing
1ac80 20 66 6f 72 20 61 67 67 72 65 67 61 74 65 20 71   for aggregate q
1ac90 75 65 72 69 65 73 20 2a 2f 0a 20 20 20 20 4e 61  ueries */.    Na
1aca0 6d 65 43 6f 6e 74 65 78 74 20 73 4e 43 3b 20 20  meContext sNC;  
1acb0 20 20 2f 2a 20 4e 61 6d 65 20 63 6f 6e 74 65 78    /* Name contex
1acc0 74 20 66 6f 72 20 70 72 6f 63 65 73 73 69 6e 67  t for processing
1acd0 20 61 67 67 72 65 67 61 74 65 20 69 6e 66 6f 72   aggregate infor
1ace0 6d 61 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 69 6e  mation */.    in
1acf0 74 20 69 41 4d 65 6d 3b 20 20 20 20 20 20 20 20  t iAMem;        
1ad00 20 20 2f 2a 20 46 69 72 73 74 20 4d 65 6d 20 61    /* First Mem a
1ad10 64 64 72 65 73 73 20 66 6f 72 20 73 74 6f 72 69  ddress for stori
1ad20 6e 67 20 63 75 72 72 65 6e 74 20 47 52 4f 55 50  ng current GROUP
1ad30 20 42 59 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69   BY */.    int i
1ad40 42 4d 65 6d 3b 20 20 20 20 20 20 20 20 20 20 2f  BMem;          /
1ad50 2a 20 46 69 72 73 74 20 4d 65 6d 20 61 64 64 72  * First Mem addr
1ad60 65 73 73 20 66 6f 72 20 70 72 65 76 69 6f 75 73  ess for previous
1ad70 20 47 52 4f 55 50 20 42 59 20 2a 2f 0a 20 20 20   GROUP BY */.   
1ad80 20 69 6e 74 20 69 55 73 65 46 6c 61 67 3b 20 20   int iUseFlag;  
1ad90 20 20 20 20 20 2f 2a 20 4d 65 6d 20 61 64 64 72       /* Mem addr
1ada0 65 73 73 20 68 6f 6c 64 69 6e 67 20 66 6c 61 67  ess holding flag
1adb0 20 69 6e 64 69 63 61 74 69 6e 67 20 74 68 61 74   indicating that
1adc0 20 61 74 20 6c 65 61 73 74 0a 20 20 20 20 20 20   at least.      
1add0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ade0 20 20 2a 2a 20 6f 6e 65 20 72 6f 77 20 6f 66 20    ** one row of 
1adf0 74 68 65 20 69 6e 70 75 74 20 74 6f 20 74 68 65  the input to the
1ae00 20 61 67 67 72 65 67 61 74 6f 72 20 68 61 73 20   aggregator has 
1ae10 62 65 65 6e 0a 20 20 20 20 20 20 20 20 20 20 20  been.           
1ae20 20 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20               ** 
1ae30 70 72 6f 63 65 73 73 65 64 20 2a 2f 0a 20 20 20  processed */.   
1ae40 20 69 6e 74 20 69 41 62 6f 72 74 46 6c 61 67 3b   int iAbortFlag;
1ae50 20 20 20 20 20 2f 2a 20 4d 65 6d 20 61 64 64 72       /* Mem addr
1ae60 65 73 73 20 77 68 69 63 68 20 63 61 75 73 65 73  ess which causes
1ae70 20 71 75 65 72 79 20 61 62 6f 72 74 20 69 66 20   query abort if 
1ae80 70 6f 73 69 74 69 76 65 20 2a 2f 0a 20 20 20 20  positive */.    
1ae90 69 6e 74 20 67 72 6f 75 70 42 79 53 6f 72 74 3b  int groupBySort;
1aea0 20 20 20 20 2f 2a 20 52 6f 77 73 20 63 6f 6d 65      /* Rows come
1aeb0 20 66 72 6f 6d 20 73 6f 75 72 63 65 20 69 6e 20   from source in 
1aec0 47 52 4f 55 50 20 42 59 20 6f 72 64 65 72 20 2a  GROUP BY order *
1aed0 2f 0a 0a 0a 20 20 20 20 2f 2a 20 54 68 65 20 66  /...    /* The f
1aee0 6f 6c 6c 6f 77 69 6e 67 20 76 61 72 69 61 62 6c  ollowing variabl
1aef0 65 73 20 68 6f 6c 64 20 61 64 64 72 65 73 73 65  es hold addresse
1af00 73 20 6f 72 20 6c 61 62 65 6c 73 20 66 6f 72 20  s or labels for 
1af10 70 61 72 74 73 20 6f 66 20 74 68 65 0a 20 20 20  parts of the.   
1af20 20 2a 2a 20 76 69 72 74 75 61 6c 20 6d 61 63 68   ** virtual mach
1af30 69 6e 65 20 70 72 6f 67 72 61 6d 20 77 65 20 61  ine program we a
1af40 72 65 20 70 75 74 74 69 6e 67 20 74 6f 67 65 74  re putting toget
1af50 68 65 72 20 2a 2f 0a 20 20 20 20 69 6e 74 20 61  her */.    int a
1af60 64 64 72 4f 75 74 70 75 74 52 6f 77 3b 20 20 20  ddrOutputRow;   
1af70 20 20 20 2f 2a 20 53 74 61 72 74 20 6f 66 20 73     /* Start of s
1af80 75 62 72 6f 75 74 69 6e 65 20 74 68 61 74 20 6f  ubroutine that o
1af90 75 74 70 75 74 73 20 61 20 72 65 73 75 6c 74 20  utputs a result 
1afa0 72 6f 77 20 2a 2f 0a 20 20 20 20 69 6e 74 20 61  row */.    int a
1afb0 64 64 72 53 65 74 41 62 6f 72 74 3b 20 20 20 20  ddrSetAbort;    
1afc0 20 20 20 2f 2a 20 53 65 74 20 74 68 65 20 61 62     /* Set the ab
1afd0 6f 72 74 20 66 6c 61 67 20 61 6e 64 20 72 65 74  ort flag and ret
1afe0 75 72 6e 20 2a 2f 0a 20 20 20 20 69 6e 74 20 61  urn */.    int a
1aff0 64 64 72 49 6e 69 74 69 61 6c 69 7a 65 4c 6f 6f  ddrInitializeLoo
1b000 70 3b 20 2f 2a 20 53 74 61 72 74 20 6f 66 20 63  p; /* Start of c
1b010 6f 64 65 20 74 68 61 74 20 69 6e 69 74 69 61 6c  ode that initial
1b020 69 7a 65 73 20 74 68 65 20 69 6e 70 75 74 20 6c  izes the input l
1b030 6f 6f 70 20 2a 2f 0a 20 20 20 20 69 6e 74 20 61  oop */.    int a
1b040 64 64 72 54 6f 70 4f 66 4c 6f 6f 70 3b 20 20 20  ddrTopOfLoop;   
1b050 20 20 20 2f 2a 20 54 6f 70 20 6f 66 20 74 68 65     /* Top of the
1b060 20 69 6e 70 75 74 20 6c 6f 6f 70 20 2a 2f 0a 20   input loop */. 
1b070 20 20 20 69 6e 74 20 61 64 64 72 47 72 6f 75 70     int addrGroup
1b080 42 79 43 68 61 6e 67 65 3b 20 20 2f 2a 20 43 6f  ByChange;  /* Co
1b090 64 65 20 74 68 61 74 20 72 75 6e 73 20 77 68 65  de that runs whe
1b0a0 6e 20 61 6e 79 20 47 52 4f 55 50 20 42 59 20 74  n any GROUP BY t
1b0b0 65 72 6d 20 63 68 61 6e 67 65 73 20 2a 2f 0a 20  erm changes */. 
1b0c0 20 20 20 69 6e 74 20 61 64 64 72 50 72 6f 63 65     int addrProce
1b0d0 73 73 52 6f 77 3b 20 20 20 20 20 2f 2a 20 43 6f  ssRow;     /* Co
1b0e0 64 65 20 74 6f 20 70 72 6f 63 65 73 73 20 61 20  de to process a 
1b0f0 73 69 6e 67 6c 65 20 69 6e 70 75 74 20 72 6f 77  single input row
1b100 20 2a 2f 0a 20 20 20 20 69 6e 74 20 61 64 64 72   */.    int addr
1b110 45 6e 64 3b 20 20 20 20 20 20 20 20 20 20 20 20  End;            
1b120 2f 2a 20 45 6e 64 20 6f 66 20 61 6c 6c 20 70 72  /* End of all pr
1b130 6f 63 65 73 73 69 6e 67 20 2a 2f 0a 20 20 20 20  ocessing */.    
1b140 69 6e 74 20 61 64 64 72 53 6f 72 74 69 6e 67 49  int addrSortingI
1b150 64 78 3b 20 20 20 20 20 2f 2a 20 54 68 65 20 4f  dx;     /* The O
1b160 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 20  P_OpenEphemeral 
1b170 66 6f 72 20 74 68 65 20 73 6f 72 74 69 6e 67 20  for the sorting 
1b180 69 6e 64 65 78 20 2a 2f 0a 20 20 20 20 69 6e 74  index */.    int
1b190 20 61 64 64 72 52 65 73 65 74 3b 20 20 20 20 20   addrReset;     
1b1a0 20 20 20 20 20 2f 2a 20 53 75 62 72 6f 75 74 69       /* Subrouti
1b1b0 6e 65 20 66 6f 72 20 72 65 73 65 74 74 69 6e 67  ne for resetting
1b1c0 20 74 68 65 20 61 63 63 75 6d 75 6c 61 74 6f 72   the accumulator
1b1d0 20 2a 2f 0a 0a 20 20 20 20 61 64 64 72 45 6e 64   */..    addrEnd
1b1e0 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61   = sqlite3VdbeMa
1b1f0 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 0a 20 20 20  keLabel(v);..   
1b200 20 2f 2a 20 43 6f 6e 76 65 72 74 20 54 4b 5f 43   /* Convert TK_C
1b210 4f 4c 55 4d 4e 20 6e 6f 64 65 73 20 69 6e 74 6f  OLUMN nodes into
1b220 20 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 20 61   TK_AGG_COLUMN a
1b230 6e 64 20 6d 61 6b 65 20 65 6e 74 72 69 65 73 20  nd make entries 
1b240 69 6e 0a 20 20 20 20 2a 2a 20 73 41 67 67 49 6e  in.    ** sAggIn
1b250 66 6f 20 66 6f 72 20 61 6c 6c 20 54 4b 5f 41 47  fo for all TK_AG
1b260 47 5f 46 55 4e 43 54 49 4f 4e 20 6e 6f 64 65 73  G_FUNCTION nodes
1b270 20 69 6e 20 65 78 70 72 65 73 73 69 6f 6e 73 20   in expressions 
1b280 6f 66 20 74 68 65 0a 20 20 20 20 2a 2a 20 53 45  of the.    ** SE
1b290 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 2e 0a  LECT statement..
1b2a0 20 20 20 20 2a 2f 0a 20 20 20 20 6d 65 6d 73 65      */.    memse
1b2b0 74 28 26 73 4e 43 2c 20 30 2c 20 73 69 7a 65 6f  t(&sNC, 0, sizeo
1b2c0 66 28 73 4e 43 29 29 3b 0a 20 20 20 20 73 4e 43  f(sNC));.    sNC
1b2d0 2e 70 50 61 72 73 65 20 3d 20 70 50 61 72 73 65  .pParse = pParse
1b2e0 3b 0a 20 20 20 20 73 4e 43 2e 70 53 72 63 4c 69  ;.    sNC.pSrcLi
1b2f0 73 74 20 3d 20 70 54 61 62 4c 69 73 74 3b 0a 20  st = pTabList;. 
1b300 20 20 20 73 4e 43 2e 70 41 67 67 49 6e 66 6f 20     sNC.pAggInfo 
1b310 3d 20 26 73 41 67 67 49 6e 66 6f 3b 0a 20 20 20  = &sAggInfo;.   
1b320 20 73 41 67 67 49 6e 66 6f 2e 6e 53 6f 72 74 69   sAggInfo.nSorti
1b330 6e 67 43 6f 6c 75 6d 6e 20 3d 20 70 47 72 6f 75  ngColumn = pGrou
1b340 70 42 79 20 3f 20 70 47 72 6f 75 70 42 79 2d 3e  pBy ? pGroupBy->
1b350 6e 45 78 70 72 2b 31 20 3a 20 30 3b 0a 20 20 20  nExpr+1 : 0;.   
1b360 20 73 41 67 67 49 6e 66 6f 2e 70 47 72 6f 75 70   sAggInfo.pGroup
1b370 42 79 20 3d 20 70 47 72 6f 75 70 42 79 3b 0a 20  By = pGroupBy;. 
1b380 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 41 6e     sqlite3ExprAn
1b390 61 6c 79 7a 65 41 67 67 4c 69 73 74 28 26 73 4e  alyzeAggList(&sN
1b3a0 43 2c 20 70 45 4c 69 73 74 29 3b 0a 20 20 20 20  C, pEList);.    
1b3b0 73 71 6c 69 74 65 33 45 78 70 72 41 6e 61 6c 79  sqlite3ExprAnaly
1b3c0 7a 65 41 67 67 4c 69 73 74 28 26 73 4e 43 2c 20  zeAggList(&sNC, 
1b3d0 70 4f 72 64 65 72 42 79 29 3b 0a 20 20 20 20 69  pOrderBy);.    i
1b3e0 66 28 20 70 48 61 76 69 6e 67 20 29 7b 0a 20 20  f( pHaving ){.  
1b3f0 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 41      sqlite3ExprA
1b400 6e 61 6c 79 7a 65 41 67 67 72 65 67 61 74 65 73  nalyzeAggregates
1b410 28 26 73 4e 43 2c 20 70 48 61 76 69 6e 67 29 3b  (&sNC, pHaving);
1b420 0a 20 20 20 20 7d 0a 20 20 20 20 73 41 67 67 49  .    }.    sAggI
1b430 6e 66 6f 2e 6e 41 63 63 75 6d 75 6c 61 74 6f 72  nfo.nAccumulator
1b440 20 3d 20 73 41 67 67 49 6e 66 6f 2e 6e 43 6f 6c   = sAggInfo.nCol
1b450 75 6d 6e 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30  umn;.    for(i=0
1b460 3b 20 69 3c 73 41 67 67 49 6e 66 6f 2e 6e 46 75  ; i<sAggInfo.nFu
1b470 6e 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  nc; i++){.      
1b480 73 71 6c 69 74 65 33 45 78 70 72 41 6e 61 6c 79  sqlite3ExprAnaly
1b490 7a 65 41 67 67 4c 69 73 74 28 26 73 4e 43 2c 20  zeAggList(&sNC, 
1b4a0 73 41 67 67 49 6e 66 6f 2e 61 46 75 6e 63 5b 69  sAggInfo.aFunc[i
1b4b0 5d 2e 70 45 78 70 72 2d 3e 70 4c 69 73 74 29 3b  ].pExpr->pList);
1b4c0 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 64  .    }.    if( d
1b4d0 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
1b4e0 29 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e  ) goto select_en
1b4f0 64 3b 0a 0a 20 20 20 20 2f 2a 20 50 72 6f 63 65  d;..    /* Proce
1b500 73 73 69 6e 67 20 66 6f 72 20 61 67 67 72 65 67  ssing for aggreg
1b510 61 74 65 73 20 77 69 74 68 20 47 52 4f 55 50 20  ates with GROUP 
1b520 42 59 20 69 73 20 76 65 72 79 20 64 69 66 66 65  BY is very diffe
1b530 72 65 6e 74 20 61 6e 64 0a 20 20 20 20 2a 2a 20  rent and.    ** 
1b540 6d 75 63 68 20 6d 6f 72 65 20 63 6f 6d 70 6c 65  much more comple
1b550 78 20 74 68 61 6e 20 61 67 67 72 65 67 61 74 65  x than aggregate
1b560 73 20 77 69 74 68 6f 75 74 20 61 20 47 52 4f 55  s without a GROU
1b570 50 20 42 59 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  P BY..    */.   
1b580 20 69 66 28 20 70 47 72 6f 75 70 42 79 20 29 7b   if( pGroupBy ){
1b590 0a 20 20 20 20 20 20 4b 65 79 49 6e 66 6f 20 2a  .      KeyInfo *
1b5a0 70 4b 65 79 49 6e 66 6f 3b 20 20 2f 2a 20 4b 65  pKeyInfo;  /* Ke
1b5b0 79 69 6e 67 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  ying information
1b5c0 20 66 6f 72 20 74 68 65 20 67 72 6f 75 70 20 62   for the group b
1b5d0 79 20 63 6c 61 75 73 65 20 2a 2f 0a 0a 20 20 20  y clause */..   
1b5e0 20 20 20 2f 2a 20 43 72 65 61 74 65 20 6c 61 62     /* Create lab
1b5f0 65 6c 73 20 74 68 61 74 20 77 65 20 77 69 6c 6c  els that we will
1b600 20 62 65 20 6e 65 65 64 69 6e 67 0a 20 20 20 20   be needing.    
1b610 20 20 2a 2f 0a 20 20 20 20 20 0a 20 20 20 20 20    */.     .     
1b620 20 61 64 64 72 49 6e 69 74 69 61 6c 69 7a 65 4c   addrInitializeL
1b630 6f 6f 70 20 3d 20 73 71 6c 69 74 65 33 56 64 62  oop = sqlite3Vdb
1b640 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20  eMakeLabel(v);. 
1b650 20 20 20 20 20 61 64 64 72 47 72 6f 75 70 42 79       addrGroupBy
1b660 43 68 61 6e 67 65 20 3d 20 73 71 6c 69 74 65 33  Change = sqlite3
1b670 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29  VdbeMakeLabel(v)
1b680 3b 0a 20 20 20 20 20 20 61 64 64 72 50 72 6f 63  ;.      addrProc
1b690 65 73 73 52 6f 77 20 3d 20 73 71 6c 69 74 65 33  essRow = sqlite3
1b6a0 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29  VdbeMakeLabel(v)
1b6b0 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74  ;..      /* If t
1b6c0 68 65 72 65 20 69 73 20 61 20 47 52 4f 55 50 20  here is a GROUP 
1b6d0 42 59 20 63 6c 61 75 73 65 20 77 65 20 6d 69 67  BY clause we mig
1b6e0 68 74 20 6e 65 65 64 20 61 20 73 6f 72 74 69 6e  ht need a sortin
1b6f0 67 20 69 6e 64 65 78 20 74 6f 0a 20 20 20 20 20  g index to.     
1b700 20 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74 20 69 74   ** implement it
1b710 2e 20 20 41 6c 6c 6f 63 61 74 65 20 74 68 61 74  .  Allocate that
1b720 20 73 6f 72 74 69 6e 67 20 69 6e 64 65 78 20 6e   sorting index n
1b730 6f 77 2e 20 20 49 66 20 69 74 20 74 75 72 6e 73  ow.  If it turns
1b740 20 6f 75 74 0a 20 20 20 20 20 20 2a 2a 20 74 68   out.      ** th
1b750 61 74 20 77 65 20 64 6f 20 6e 6f 74 20 6e 65 65  at we do not nee
1b760 64 20 69 74 20 61 66 74 65 72 20 61 6c 6c 2c 20  d it after all, 
1b770 74 68 65 20 4f 70 65 6e 45 70 68 65 6d 65 72 61  the OpenEphemera
1b780 6c 20 69 6e 73 74 72 75 63 74 69 6f 6e 0a 20 20  l instruction.  
1b790 20 20 20 20 2a 2a 20 77 69 6c 6c 20 62 65 20 63      ** will be c
1b7a0 6f 6e 76 65 72 74 65 64 20 69 6e 74 6f 20 61 20  onverted into a 
1b7b0 4e 6f 6f 70 2e 20 20 0a 20 20 20 20 20 20 2a 2f  Noop.  .      */
1b7c0 0a 20 20 20 20 20 20 73 41 67 67 49 6e 66 6f 2e  .      sAggInfo.
1b7d0 73 6f 72 74 69 6e 67 49 64 78 20 3d 20 70 50 61  sortingIdx = pPa
1b7e0 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20  rse->nTab++;.   
1b7f0 20 20 20 70 4b 65 79 49 6e 66 6f 20 3d 20 6b 65     pKeyInfo = ke
1b800 79 49 6e 66 6f 46 72 6f 6d 45 78 70 72 4c 69 73  yInfoFromExprLis
1b810 74 28 70 50 61 72 73 65 2c 20 70 47 72 6f 75 70  t(pParse, pGroup
1b820 42 79 29 3b 0a 20 20 20 20 20 20 61 64 64 72 53  By);.      addrS
1b830 6f 72 74 69 6e 67 49 64 78 20 3d 20 73 71 6c 69  ortingIdx = sqli
1b840 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c  te3VdbeAddOp4(v,
1b850 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61   OP_OpenEphemera
1b860 6c 2c 20 0a 20 20 20 20 20 20 20 20 20 20 73 41  l, .          sA
1b870 67 67 49 6e 66 6f 2e 73 6f 72 74 69 6e 67 49 64  ggInfo.sortingId
1b880 78 2c 20 73 41 67 67 49 6e 66 6f 2e 6e 53 6f 72  x, sAggInfo.nSor
1b890 74 69 6e 67 43 6f 6c 75 6d 6e 2c 20 0a 20 20 20  tingColumn, .   
1b8a0 20 20 20 20 20 20 20 30 2c 20 28 63 68 61 72 2a         0, (char*
1b8b0 29 70 4b 65 79 49 6e 66 6f 2c 20 50 34 5f 4b 45  )pKeyInfo, P4_KE
1b8c0 59 49 4e 46 4f 5f 48 41 4e 44 4f 46 46 29 3b 0a  YINFO_HANDOFF);.
1b8d0 0a 20 20 20 20 20 20 2f 2a 20 49 6e 69 74 69 61  .      /* Initia
1b8e0 6c 69 7a 65 20 6d 65 6d 6f 72 79 20 6c 6f 63 61  lize memory loca
1b8f0 74 69 6f 6e 73 20 75 73 65 64 20 62 79 20 47 52  tions used by GR
1b900 4f 55 50 20 42 59 20 61 67 67 72 65 67 61 74 65  OUP BY aggregate
1b910 20 70 72 6f 63 65 73 73 69 6e 67 0a 20 20 20 20   processing.    
1b920 20 20 2a 2f 0a 20 20 20 20 20 20 69 55 73 65 46    */.      iUseF
1b930 6c 61 67 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e  lag = ++pParse->
1b940 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 69 41 62 6f  nMem;.      iAbo
1b950 72 74 46 6c 61 67 20 3d 20 2b 2b 70 50 61 72 73  rtFlag = ++pPars
1b960 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 69  e->nMem;.      i
1b970 41 4d 65 6d 20 3d 20 70 50 61 72 73 65 2d 3e 6e  AMem = pParse->n
1b980 4d 65 6d 20 2b 20 31 3b 0a 20 20 20 20 20 20 70  Mem + 1;.      p
1b990 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 70  Parse->nMem += p
1b9a0 47 72 6f 75 70 42 79 2d 3e 6e 45 78 70 72 3b 0a  GroupBy->nExpr;.
1b9b0 20 20 20 20 20 20 69 42 4d 65 6d 20 3d 20 70 50        iBMem = pP
1b9c0 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 20 31 3b 0a  arse->nMem + 1;.
1b9d0 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 4d        pParse->nM
1b9e0 65 6d 20 2b 3d 20 70 47 72 6f 75 70 42 79 2d 3e  em += pGroupBy->
1b9f0 6e 45 78 70 72 3b 0a 20 20 20 20 20 20 73 71 6c  nExpr;.      sql
1ba00 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
1ba10 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 30 2c  , OP_Integer, 0,
1ba20 20 69 41 62 6f 72 74 46 6c 61 67 29 3b 0a 20 20   iAbortFlag);.  
1ba30 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28      VdbeComment(
1ba40 28 76 2c 20 22 63 6c 65 61 72 20 61 62 6f 72 74  (v, "clear abort
1ba50 20 66 6c 61 67 22 29 29 3b 0a 20 20 20 20 20 20   flag"));.      
1ba60 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
1ba70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c  2(v, OP_Integer,
1ba80 20 30 2c 20 69 55 73 65 46 6c 61 67 29 3b 0a 20   0, iUseFlag);. 
1ba90 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74       VdbeComment
1baa0 28 28 76 2c 20 22 69 6e 64 69 63 61 74 65 20 61  ((v, "indicate a
1bab0 63 63 75 6d 75 6c 61 74 6f 72 20 65 6d 70 74 79  ccumulator empty
1bac0 22 29 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  "));.      sqlit
1bad0 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
1bae0 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 61 64 64 72  OP_Goto, 0, addr
1baf0 49 6e 69 74 69 61 6c 69 7a 65 4c 6f 6f 70 29 3b  InitializeLoop);
1bb00 0a 0a 20 20 20 20 20 20 2f 2a 20 47 65 6e 65 72  ..      /* Gener
1bb10 61 74 65 20 61 20 73 75 62 72 6f 75 74 69 6e 65  ate a subroutine
1bb20 20 74 68 61 74 20 6f 75 74 70 75 74 73 20 61 20   that outputs a 
1bb30 73 69 6e 67 6c 65 20 72 6f 77 20 6f 66 20 74 68  single row of th
1bb40 65 20 72 65 73 75 6c 74 0a 20 20 20 20 20 20 2a  e result.      *
1bb50 2a 20 73 65 74 2e 20 20 54 68 69 73 20 73 75 62  * set.  This sub
1bb60 72 6f 75 74 69 6e 65 20 66 69 72 73 74 20 6c 6f  routine first lo
1bb70 6f 6b 73 20 61 74 20 74 68 65 20 69 55 73 65 46  oks at the iUseF
1bb80 6c 61 67 2e 20 20 49 66 20 69 55 73 65 46 6c 61  lag.  If iUseFla
1bb90 67 0a 20 20 20 20 20 20 2a 2a 20 69 73 20 6c 65  g.      ** is le
1bba0 73 73 20 74 68 61 6e 20 6f 72 20 65 71 75 61 6c  ss than or equal
1bbb0 20 74 6f 20 7a 65 72 6f 2c 20 74 68 65 20 73 75   to zero, the su
1bbc0 62 72 6f 75 74 69 6e 65 20 69 73 20 61 20 6e 6f  broutine is a no
1bbd0 2d 6f 70 2e 20 20 49 66 0a 20 20 20 20 20 20 2a  -op.  If.      *
1bbe0 2a 20 74 68 65 20 70 72 6f 63 65 73 73 69 6e 67  * the processing
1bbf0 20 63 61 6c 6c 73 20 66 6f 72 20 74 68 65 20 71   calls for the q
1bc00 75 65 72 79 20 74 6f 20 61 62 6f 72 74 2c 20 74  uery to abort, t
1bc10 68 69 73 20 73 75 62 72 6f 75 74 69 6e 65 0a 20  his subroutine. 
1bc20 20 20 20 20 20 2a 2a 20 69 6e 63 72 65 6d 65 6e       ** incremen
1bc30 74 73 20 74 68 65 20 69 41 62 6f 72 74 46 6c 61  ts the iAbortFla
1bc40 67 20 6d 65 6d 6f 72 79 20 6c 6f 63 61 74 69 6f  g memory locatio
1bc50 6e 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69  n before returni
1bc60 6e 67 20 69 6e 0a 20 20 20 20 20 20 2a 2a 20 6f  ng in.      ** o
1bc70 72 64 65 72 20 74 6f 20 73 69 67 6e 61 6c 20 74  rder to signal t
1bc80 68 65 20 63 61 6c 6c 65 72 20 74 6f 20 61 62 6f  he caller to abo
1bc90 72 74 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  rt..      */.   
1bca0 20 20 20 61 64 64 72 53 65 74 41 62 6f 72 74 20     addrSetAbort 
1bcb0 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72  = sqlite3VdbeCur
1bcc0 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 20 20 20  rentAddr(v);.   
1bcd0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
1bce0 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67  dOp2(v, OP_Integ
1bcf0 65 72 2c 20 31 2c 20 69 41 62 6f 72 74 46 6c 61  er, 1, iAbortFla
1bd00 67 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f  g);.      VdbeCo
1bd10 6d 6d 65 6e 74 28 28 76 2c 20 22 73 65 74 20 61  mment((v, "set a
1bd20 62 6f 72 74 20 66 6c 61 67 22 29 29 3b 0a 20 20  bort flag"));.  
1bd30 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
1bd40 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52 65 74 75  ddOp2(v, OP_Retu
1bd50 72 6e 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20  rn, 0, 0);.     
1bd60 20 61 64 64 72 4f 75 74 70 75 74 52 6f 77 20 3d   addrOutputRow =
1bd70 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72   sqlite3VdbeCurr
1bd80 65 6e 74 41 64 64 72 28 76 29 3b 0a 20 20 20 20  entAddr(v);.    
1bd90 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
1bda0 4f 70 32 28 76 2c 20 4f 50 5f 49 66 50 6f 73 2c  Op2(v, OP_IfPos,
1bdb0 20 69 55 73 65 46 6c 61 67 2c 20 61 64 64 72 4f   iUseFlag, addrO
1bdc0 75 74 70 75 74 52 6f 77 2b 32 29 3b 0a 20 20 20  utputRow+2);.   
1bdd0 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28     VdbeComment((
1bde0 76 2c 20 22 47 72 6f 75 70 62 79 20 72 65 73 75  v, "Groupby resu
1bdf0 6c 74 20 67 65 6e 65 72 61 74 6f 72 20 65 6e 74  lt generator ent
1be00 72 79 20 70 6f 69 6e 74 22 29 29 3b 0a 20 20 20  ry point"));.   
1be10 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
1be20 64 4f 70 32 28 76 2c 20 4f 50 5f 52 65 74 75 72  dOp2(v, OP_Retur
1be30 6e 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20  n, 0, 0);.      
1be40 66 69 6e 61 6c 69 7a 65 41 67 67 46 75 6e 63 74  finalizeAggFunct
1be50 69 6f 6e 73 28 70 50 61 72 73 65 2c 20 26 73 41  ions(pParse, &sA
1be60 67 67 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20 69  ggInfo);.      i
1be70 66 28 20 70 48 61 76 69 6e 67 20 29 7b 0a 20 20  f( pHaving ){.  
1be80 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
1be90 72 49 66 46 61 6c 73 65 28 70 50 61 72 73 65 2c  rIfFalse(pParse,
1bea0 20 70 48 61 76 69 6e 67 2c 20 61 64 64 72 4f 75   pHaving, addrOu
1beb0 74 70 75 74 52 6f 77 2b 31 2c 20 53 51 4c 49 54  tputRow+1, SQLIT
1bec0 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c 29 3b 0a 20  E_JUMPIFNULL);. 
1bed0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 65 6c       }.      sel
1bee0 65 63 74 49 6e 6e 65 72 4c 6f 6f 70 28 70 50 61  ectInnerLoop(pPa
1bef0 72 73 65 2c 20 70 2c 20 70 2d 3e 70 45 4c 69 73  rse, p, p->pELis
1bf00 74 2c 20 30 2c 20 30 2c 20 70 4f 72 64 65 72 42  t, 0, 0, pOrderB
1bf10 79 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  y,.             
1bf20 20 20 20 20 20 20 20 20 20 64 69 73 74 69 6e 63           distinc
1bf30 74 2c 20 70 44 65 73 74 2c 0a 20 20 20 20 20 20  t, pDest,.      
1bf40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bf50 61 64 64 72 4f 75 74 70 75 74 52 6f 77 2b 31 2c  addrOutputRow+1,
1bf60 20 61 64 64 72 53 65 74 41 62 6f 72 74 2c 20 61   addrSetAbort, a
1bf70 66 66 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  ff);.      sqlit
1bf80 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
1bf90 4f 50 5f 52 65 74 75 72 6e 2c 20 30 2c 20 30 29  OP_Return, 0, 0)
1bfa0 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d  ;.      VdbeComm
1bfb0 65 6e 74 28 28 76 2c 20 22 65 6e 64 20 67 72 6f  ent((v, "end gro
1bfc0 75 70 62 79 20 72 65 73 75 6c 74 20 67 65 6e 65  upby result gene
1bfd0 72 61 74 6f 72 22 29 29 3b 0a 0a 20 20 20 20 20  rator"));..     
1bfe0 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 61 20 73   /* Generate a s
1bff0 75 62 72 6f 75 74 69 6e 65 20 74 68 61 74 20 77  ubroutine that w
1c000 69 6c 6c 20 72 65 73 65 74 20 74 68 65 20 67 72  ill reset the gr
1c010 6f 75 70 2d 62 79 20 61 63 63 75 6d 75 6c 61 74  oup-by accumulat
1c020 6f 72 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  or.      */.    
1c030 20 20 61 64 64 72 52 65 73 65 74 20 3d 20 73 71    addrReset = sq
1c040 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74  lite3VdbeCurrent
1c050 41 64 64 72 28 76 29 3b 0a 20 20 20 20 20 20 72  Addr(v);.      r
1c060 65 73 65 74 41 63 63 75 6d 75 6c 61 74 6f 72 28  esetAccumulator(
1c070 70 50 61 72 73 65 2c 20 26 73 41 67 67 49 6e 66  pParse, &sAggInf
1c080 6f 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  o);.      sqlite
1c090 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
1c0a0 50 5f 52 65 74 75 72 6e 2c 20 30 2c 20 30 29 3b  P_Return, 0, 0);
1c0b0 0a 0a 20 20 20 20 20 20 2f 2a 20 42 65 67 69 6e  ..      /* Begin
1c0c0 20 61 20 6c 6f 6f 70 20 74 68 61 74 20 77 69 6c   a loop that wil
1c0d0 6c 20 65 78 74 72 61 63 74 20 61 6c 6c 20 73 6f  l extract all so
1c0e0 75 72 63 65 20 72 6f 77 73 20 69 6e 20 47 52 4f  urce rows in GRO
1c0f0 55 50 20 42 59 20 6f 72 64 65 72 2e 0a 20 20 20  UP BY order..   
1c100 20 20 20 2a 2a 20 54 68 69 73 20 6d 69 67 68 74     ** This might
1c110 20 69 6e 76 6f 6c 76 65 20 74 77 6f 20 73 65 70   involve two sep
1c120 61 72 61 74 65 20 6c 6f 6f 70 73 20 77 69 74 68  arate loops with
1c130 20 61 6e 20 4f 50 5f 53 6f 72 74 20 69 6e 20 62   an OP_Sort in b
1c140 65 74 77 65 65 6e 2c 20 6f 72 0a 20 20 20 20 20  etween, or.     
1c150 20 2a 2a 20 69 74 20 6d 69 67 68 74 20 62 65 20   ** it might be 
1c160 61 20 73 69 6e 67 6c 65 20 6c 6f 6f 70 20 74 68  a single loop th
1c170 61 74 20 75 73 65 73 20 61 6e 20 69 6e 64 65 78  at uses an index
1c180 20 74 6f 20 65 78 74 72 61 63 74 20 69 6e 66 6f   to extract info
1c190 72 6d 61 74 69 6f 6e 0a 20 20 20 20 20 20 2a 2a  rmation.      **
1c1a0 20 69 6e 20 74 68 65 20 72 69 67 68 74 20 6f 72   in the right or
1c1b0 64 65 72 20 74 6f 20 62 65 67 69 6e 20 77 69 74  der to begin wit
1c1c0 68 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  h..      */.    
1c1d0 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73    sqlite3VdbeRes
1c1e0 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 61 64 64  olveLabel(v, add
1c1f0 72 49 6e 69 74 69 61 6c 69 7a 65 4c 6f 6f 70 29  rInitializeLoop)
1c200 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
1c210 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
1c220 47 6f 73 75 62 2c 20 30 2c 20 61 64 64 72 52 65  Gosub, 0, addrRe
1c230 73 65 74 29 3b 0a 20 20 20 20 20 20 70 57 49 6e  set);.      pWIn
1c240 66 6f 20 3d 20 73 71 6c 69 74 65 33 57 68 65 72  fo = sqlite3Wher
1c250 65 42 65 67 69 6e 28 70 50 61 72 73 65 2c 20 70  eBegin(pParse, p
1c260 54 61 62 4c 69 73 74 2c 20 70 57 68 65 72 65 2c  TabList, pWhere,
1c270 20 26 70 47 72 6f 75 70 42 79 2c 20 30 29 3b 0a   &pGroupBy, 0);.
1c280 20 20 20 20 20 20 69 66 28 20 70 57 49 6e 66 6f        if( pWInfo
1c290 3d 3d 30 20 29 20 67 6f 74 6f 20 73 65 6c 65 63  ==0 ) goto selec
1c2a0 74 5f 65 6e 64 3b 0a 20 20 20 20 20 20 69 66 28  t_end;.      if(
1c2b0 20 70 47 72 6f 75 70 42 79 3d 3d 30 20 29 7b 0a   pGroupBy==0 ){.
1c2c0 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6f          /* The o
1c2d0 70 74 69 6d 69 7a 65 72 20 69 73 20 61 62 6c 65  ptimizer is able
1c2e0 20 74 6f 20 64 65 6c 69 76 65 72 20 72 6f 77 73   to deliver rows
1c2f0 20 69 6e 20 67 72 6f 75 70 20 62 79 20 6f 72 64   in group by ord
1c300 65 72 20 73 6f 0a 20 20 20 20 20 20 20 20 2a 2a  er so.        **
1c310 20 77 65 20 64 6f 20 6e 6f 74 20 68 61 76 65 20   we do not have 
1c320 74 6f 20 73 6f 72 74 2e 20 20 54 68 65 20 4f 50  to sort.  The OP
1c330 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 20 74  _OpenEphemeral t
1c340 61 62 6c 65 20 77 69 6c 6c 20 62 65 0a 20 20 20  able will be.   
1c350 20 20 20 20 20 2a 2a 20 63 61 6e 63 65 6c 6c 65       ** cancelle
1c360 64 20 6c 61 74 65 72 20 62 65 63 61 75 73 65 20  d later because 
1c370 77 65 20 73 74 69 6c 6c 20 6e 65 65 64 20 74 6f  we still need to
1c380 20 75 73 65 20 74 68 65 20 70 4b 65 79 49 6e 66   use the pKeyInf
1c390 6f 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20  o.        */.   
1c3a0 20 20 20 20 20 70 47 72 6f 75 70 42 79 20 3d 20       pGroupBy = 
1c3b0 70 2d 3e 70 47 72 6f 75 70 42 79 3b 0a 20 20 20  p->pGroupBy;.   
1c3c0 20 20 20 20 20 67 72 6f 75 70 42 79 53 6f 72 74       groupBySort
1c3d0 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 65 6c 73   = 0;.      }els
1c3e0 65 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 52 6f  e{.        /* Ro
1c3f0 77 73 20 61 72 65 20 63 6f 6d 69 6e 67 20 6f 75  ws are coming ou
1c400 74 20 69 6e 20 75 6e 64 65 74 65 72 6d 69 6e 65  t in undetermine
1c410 64 20 6f 72 64 65 72 2e 20 20 57 65 20 68 61 76  d order.  We hav
1c420 65 20 74 6f 20 70 75 73 68 0a 20 20 20 20 20 20  e to push.      
1c430 20 20 2a 2a 20 65 61 63 68 20 72 6f 77 20 69 6e    ** each row in
1c440 74 6f 20 61 20 73 6f 72 74 69 6e 67 20 69 6e 64  to a sorting ind
1c450 65 78 2c 20 74 65 72 6d 69 6e 61 74 65 20 74 68  ex, terminate th
1c460 65 20 66 69 72 73 74 20 6c 6f 6f 70 2c 0a 20 20  e first loop,.  
1c470 20 20 20 20 20 20 2a 2a 20 74 68 65 6e 20 6c 6f        ** then lo
1c480 6f 70 20 6f 76 65 72 20 74 68 65 20 73 6f 72 74  op over the sort
1c490 69 6e 67 20 69 6e 64 65 78 20 69 6e 20 6f 72 64  ing index in ord
1c4a0 65 72 20 74 6f 20 67 65 74 20 74 68 65 20 6f 75  er to get the ou
1c4b0 74 70 75 74 0a 20 20 20 20 20 20 20 20 2a 2a 20  tput.        ** 
1c4c0 69 6e 20 73 6f 72 74 65 64 20 6f 72 64 65 72 0a  in sorted order.
1c4d0 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
1c4e0 20 20 20 69 6e 74 20 72 65 67 42 61 73 65 3b 0a     int regBase;.
1c4f0 20 20 20 20 20 20 20 20 69 6e 74 20 72 65 67 52          int regR
1c500 65 63 6f 72 64 3b 0a 20 20 20 20 20 20 20 20 69  ecord;.        i
1c510 6e 74 20 6e 43 6f 6c 3b 0a 20 20 20 20 20 20 20  nt nCol;.       
1c520 20 69 6e 74 20 6e 47 72 6f 75 70 42 79 3b 0a 0a   int nGroupBy;..
1c530 20 20 20 20 20 20 20 20 67 72 6f 75 70 42 79 53          groupByS
1c540 6f 72 74 20 3d 20 31 3b 0a 20 20 20 20 20 20 20  ort = 1;.       
1c550 20 6e 47 72 6f 75 70 42 79 20 3d 20 70 47 72 6f   nGroupBy = pGro
1c560 75 70 42 79 2d 3e 6e 45 78 70 72 3b 0a 20 20 20  upBy->nExpr;.   
1c570 20 20 20 20 20 6e 43 6f 6c 20 3d 20 6e 47 72 6f       nCol = nGro
1c580 75 70 42 79 20 2b 20 31 3b 0a 20 20 20 20 20 20  upBy + 1;.      
1c590 20 20 6a 20 3d 20 6e 47 72 6f 75 70 42 79 2b 31    j = nGroupBy+1
1c5a0 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d  ;.        for(i=
1c5b0 30 3b 20 69 3c 73 41 67 67 49 6e 66 6f 2e 6e 43  0; i<sAggInfo.nC
1c5c0 6f 6c 75 6d 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20  olumn; i++){.   
1c5d0 20 20 20 20 20 20 20 69 66 28 20 73 41 67 67 49         if( sAggI
1c5e0 6e 66 6f 2e 61 43 6f 6c 5b 69 5d 2e 69 53 6f 72  nfo.aCol[i].iSor
1c5f0 74 65 72 43 6f 6c 75 6d 6e 3e 3d 6a 20 29 7b 0a  terColumn>=j ){.
1c600 20 20 20 20 20 20 20 20 20 20 20 20 6e 43 6f 6c              nCol
1c610 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ++;.            
1c620 6a 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  j++;.          }
1c630 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
1c640 20 20 20 72 65 67 42 61 73 65 20 3d 20 73 71 6c     regBase = sql
1c650 69 74 65 33 47 65 74 54 65 6d 70 52 61 6e 67 65  ite3GetTempRange
1c660 28 70 50 61 72 73 65 2c 20 6e 43 6f 6c 29 3b 0a  (pParse, nCol);.
1c670 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
1c680 78 70 72 43 6f 64 65 45 78 70 72 4c 69 73 74 28  xprCodeExprList(
1c690 70 50 61 72 73 65 2c 20 70 47 72 6f 75 70 42 79  pParse, pGroupBy
1c6a0 2c 20 72 65 67 42 61 73 65 29 3b 0a 20 20 20 20  , regBase);.    
1c6b0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
1c6c0 64 64 4f 70 32 28 76 2c 20 4f 50 5f 53 65 71 75  ddOp2(v, OP_Sequ
1c6d0 65 6e 63 65 2c 20 73 41 67 67 49 6e 66 6f 2e 73  ence, sAggInfo.s
1c6e0 6f 72 74 69 6e 67 49 64 78 2c 72 65 67 42 61 73  ortingIdx,regBas
1c6f0 65 2b 6e 47 72 6f 75 70 42 79 29 3b 0a 20 20 20  e+nGroupBy);.   
1c700 20 20 20 20 20 6a 20 3d 20 6e 47 72 6f 75 70 42       j = nGroupB
1c710 79 2b 31 3b 0a 20 20 20 20 20 20 20 20 66 6f 72  y+1;.        for
1c720 28 69 3d 30 3b 20 69 3c 73 41 67 67 49 6e 66 6f  (i=0; i<sAggInfo
1c730 2e 6e 43 6f 6c 75 6d 6e 3b 20 69 2b 2b 29 7b 0a  .nColumn; i++){.
1c740 20 20 20 20 20 20 20 20 20 20 73 74 72 75 63 74            struct
1c750 20 41 67 67 49 6e 66 6f 5f 63 6f 6c 20 2a 70 43   AggInfo_col *pC
1c760 6f 6c 20 3d 20 26 73 41 67 67 49 6e 66 6f 2e 61  ol = &sAggInfo.a
1c770 43 6f 6c 5b 69 5d 3b 0a 20 20 20 20 20 20 20 20  Col[i];.        
1c780 20 20 69 66 28 20 70 43 6f 6c 2d 3e 69 53 6f 72    if( pCol->iSor
1c790 74 65 72 43 6f 6c 75 6d 6e 3e 3d 6a 20 29 7b 0a  terColumn>=j ){.
1c7a0 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
1c7b0 74 65 33 45 78 70 72 43 6f 64 65 47 65 74 43 6f  te3ExprCodeGetCo
1c7c0 6c 75 6d 6e 28 76 2c 20 70 43 6f 6c 2d 3e 70 54  lumn(v, pCol->pT
1c7d0 61 62 2c 20 70 43 6f 6c 2d 3e 69 43 6f 6c 75 6d  ab, pCol->iColum
1c7e0 6e 2c 20 70 43 6f 6c 2d 3e 69 54 61 62 6c 65 2c  n, pCol->iTable,
1c7f0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1c800 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c810 20 20 20 20 20 20 6a 20 2b 20 72 65 67 42 61 73        j + regBas
1c820 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  e);.            
1c830 6a 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  j++;.          }
1c840 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
1c850 20 20 20 72 65 67 52 65 63 6f 72 64 20 3d 20 73     regRecord = s
1c860 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65 67  qlite3GetTempReg
1c870 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20  (pParse);.      
1c880 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
1c890 4f 70 33 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65  Op3(v, OP_MakeRe
1c8a0 63 6f 72 64 2c 20 72 65 67 42 61 73 65 2c 20 6e  cord, regBase, n
1c8b0 43 6f 6c 2c 20 72 65 67 52 65 63 6f 72 64 29 3b  Col, regRecord);
1c8c0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
1c8d0 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
1c8e0 5f 49 64 78 49 6e 73 65 72 74 2c 20 73 41 67 67  _IdxInsert, sAgg
1c8f0 49 6e 66 6f 2e 73 6f 72 74 69 6e 67 49 64 78 2c  Info.sortingIdx,
1c900 20 72 65 67 52 65 63 6f 72 64 29 3b 0a 20 20 20   regRecord);.   
1c910 20 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65       sqlite3Rele
1c920 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73  aseTempReg(pPars
1c930 65 2c 20 72 65 67 52 65 63 6f 72 64 29 3b 0a 20  e, regRecord);. 
1c940 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 65         sqlite3Re
1c950 6c 65 61 73 65 54 65 6d 70 52 61 6e 67 65 28 70  leaseTempRange(p
1c960 50 61 72 73 65 2c 20 72 65 67 42 61 73 65 2c 20  Parse, regBase, 
1c970 6e 43 6f 6c 29 3b 0a 20 20 20 20 20 20 20 20 73  nCol);.        s
1c980 71 6c 69 74 65 33 57 68 65 72 65 45 6e 64 28 70  qlite3WhereEnd(p
1c990 57 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20 20 20  WInfo);.        
1c9a0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
1c9b0 32 28 76 2c 20 4f 50 5f 53 6f 72 74 2c 20 73 41  2(v, OP_Sort, sA
1c9c0 67 67 49 6e 66 6f 2e 73 6f 72 74 69 6e 67 49 64  ggInfo.sortingId
1c9d0 78 2c 20 61 64 64 72 45 6e 64 29 3b 0a 20 20 20  x, addrEnd);.   
1c9e0 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74       VdbeComment
1c9f0 28 28 76 2c 20 22 47 52 4f 55 50 20 42 59 20 73  ((v, "GROUP BY s
1ca00 6f 72 74 22 29 29 3b 0a 20 20 20 20 20 20 20 20  ort"));.        
1ca10 73 41 67 67 49 6e 66 6f 2e 75 73 65 53 6f 72 74  sAggInfo.useSort
1ca20 69 6e 67 49 64 78 20 3d 20 31 3b 0a 20 20 20 20  ingIdx = 1;.    
1ca30 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 45 76    }..      /* Ev
1ca40 61 6c 75 61 74 65 20 74 68 65 20 63 75 72 72 65  aluate the curre
1ca50 6e 74 20 47 52 4f 55 50 20 42 59 20 74 65 72 6d  nt GROUP BY term
1ca60 73 20 61 6e 64 20 73 74 6f 72 65 20 69 6e 20 62  s and store in b
1ca70 30 2c 20 62 31 2c 20 62 32 2e 2e 2e 0a 20 20 20  0, b1, b2....   
1ca80 20 20 20 2a 2a 20 28 62 30 20 69 73 20 6d 65 6d     ** (b0 is mem
1ca90 6f 72 79 20 6c 6f 63 61 74 69 6f 6e 20 69 42 4d  ory location iBM
1caa0 65 6d 2b 30 2c 20 62 31 20 69 73 20 69 42 4d 65  em+0, b1 is iBMe
1cab0 6d 2b 31 2c 20 61 6e 64 20 73 6f 20 66 6f 72 74  m+1, and so fort
1cac0 68 29 0a 20 20 20 20 20 20 2a 2a 20 54 68 65 6e  h).      ** Then
1cad0 20 63 6f 6d 70 61 72 65 20 74 68 65 20 63 75 72   compare the cur
1cae0 72 65 6e 74 20 47 52 4f 55 50 20 42 59 20 74 65  rent GROUP BY te
1caf0 72 6d 73 20 61 67 61 69 6e 73 74 20 74 68 65 20  rms against the 
1cb00 47 52 4f 55 50 20 42 59 20 74 65 72 6d 73 0a 20  GROUP BY terms. 
1cb10 20 20 20 20 20 2a 2a 20 66 72 6f 6d 20 74 68 65       ** from the
1cb20 20 70 72 65 76 69 6f 75 73 20 72 6f 77 20 63 75   previous row cu
1cb30 72 72 65 6e 74 6c 79 20 73 74 6f 72 65 64 20 69  rrently stored i
1cb40 6e 20 61 30 2c 20 61 31 2c 20 61 32 2e 2e 2e 0a  n a0, a1, a2....
1cb50 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 61        */.      a
1cb60 64 64 72 54 6f 70 4f 66 4c 6f 6f 70 20 3d 20 73  ddrTopOfLoop = s
1cb70 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e  qlite3VdbeCurren
1cb80 74 41 64 64 72 28 76 29 3b 0a 20 20 20 20 20 20  tAddr(v);.      
1cb90 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 47 72 6f 75  for(j=0; j<pGrou
1cba0 70 42 79 2d 3e 6e 45 78 70 72 3b 20 6a 2b 2b 29  pBy->nExpr; j++)
1cbb0 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 67 72  {.        if( gr
1cbc0 6f 75 70 42 79 53 6f 72 74 20 29 7b 0a 20 20 20  oupBySort ){.   
1cbd0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
1cbe0 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43  beAddOp3(v, OP_C
1cbf0 6f 6c 75 6d 6e 2c 20 73 41 67 67 49 6e 66 6f 2e  olumn, sAggInfo.
1cc00 73 6f 72 74 69 6e 67 49 64 78 2c 20 6a 2c 20 69  sortingIdx, j, i
1cc10 42 4d 65 6d 2b 6a 29 3b 0a 20 20 20 20 20 20 20  BMem+j);.       
1cc20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
1cc30 20 20 73 41 67 67 49 6e 66 6f 2e 64 69 72 65 63    sAggInfo.direc
1cc40 74 4d 6f 64 65 20 3d 20 31 3b 0a 20 20 20 20 20  tMode = 1;.     
1cc50 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
1cc60 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70 47 72  Code(pParse, pGr
1cc70 6f 75 70 42 79 2d 3e 61 5b 6a 5d 2e 70 45 78 70  oupBy->a[j].pExp
1cc80 72 2c 20 69 42 4d 65 6d 2b 6a 29 3b 0a 20 20 20  r, iBMem+j);.   
1cc90 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
1cca0 20 20 20 20 20 66 6f 72 28 6a 3d 70 47 72 6f 75       for(j=pGrou
1ccb0 70 42 79 2d 3e 6e 45 78 70 72 2d 31 3b 20 6a 3e  pBy->nExpr-1; j>
1ccc0 3d 30 3b 20 6a 2d 2d 29 7b 0a 20 20 20 20 20 20  =0; j--){.      
1ccd0 20 20 69 66 28 20 6a 3d 3d 30 20 29 7b 0a 20 20    if( j==0 ){.  
1cce0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
1ccf0 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
1cd00 45 71 2c 20 69 41 4d 65 6d 2b 6a 2c 20 61 64 64  Eq, iAMem+j, add
1cd10 72 50 72 6f 63 65 73 73 52 6f 77 2c 20 69 42 4d  rProcessRow, iBM
1cd20 65 6d 2b 6a 29 3b 0a 20 20 20 20 20 20 20 20 7d  em+j);.        }
1cd30 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
1cd40 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
1cd50 33 28 76 2c 20 4f 50 5f 4e 65 2c 20 69 41 4d 65  3(v, OP_Ne, iAMe
1cd60 6d 2b 6a 2c 20 61 64 64 72 47 72 6f 75 70 42 79  m+j, addrGroupBy
1cd70 43 68 61 6e 67 65 2c 20 69 42 4d 65 6d 2b 6a 29  Change, iBMem+j)
1cd80 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
1cd90 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43      sqlite3VdbeC
1cda0 68 61 6e 67 65 50 34 28 76 2c 20 2d 31 2c 20 28  hangeP4(v, -1, (
1cdb0 76 6f 69 64 2a 29 70 4b 65 79 49 6e 66 6f 2d 3e  void*)pKeyInfo->
1cdc0 61 43 6f 6c 6c 5b 6a 5d 2c 20 50 34 5f 43 4f 4c  aColl[j], P4_COL
1cdd0 4c 53 45 51 29 3b 0a 20 20 20 20 20 20 20 20 73  LSEQ);.        s
1cde0 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65  qlite3VdbeChange
1cdf0 50 35 28 76 2c 20 53 51 4c 49 54 45 5f 4e 55 4c  P5(v, SQLITE_NUL
1ce00 4c 45 51 55 41 4c 29 3b 0a 20 20 20 20 20 20 7d  LEQUAL);.      }
1ce10 0a 0a 20 20 20 20 20 20 2f 2a 20 47 65 6e 65 72  ..      /* Gener
1ce20 61 74 65 20 63 6f 64 65 20 74 68 61 74 20 72 75  ate code that ru
1ce30 6e 73 20 77 68 65 6e 65 76 65 72 20 74 68 65 20  ns whenever the 
1ce40 47 52 4f 55 50 20 42 59 20 63 68 61 6e 67 65 73  GROUP BY changes
1ce50 2e 0a 20 20 20 20 20 20 2a 2a 20 43 68 61 6e 67  ..      ** Chang
1ce60 65 20 69 6e 20 74 68 65 20 47 52 4f 55 50 20 42  e in the GROUP B
1ce70 59 20 61 72 65 20 64 65 74 65 63 74 65 64 20 62  Y are detected b
1ce80 79 20 74 68 65 20 70 72 65 76 69 6f 75 73 20 63  y the previous c
1ce90 6f 64 65 0a 20 20 20 20 20 20 2a 2a 20 62 6c 6f  ode.      ** blo
1cea0 63 6b 2e 20 20 49 66 20 74 68 65 72 65 20 77 65  ck.  If there we
1ceb0 72 65 20 6e 6f 20 63 68 61 6e 67 65 73 2c 20 74  re no changes, t
1cec0 68 69 73 20 62 6c 6f 63 6b 20 69 73 20 73 6b 69  his block is ski
1ced0 70 70 65 64 2e 0a 20 20 20 20 20 20 2a 2a 0a 20  pped..      **. 
1cee0 20 20 20 20 20 2a 2a 20 54 68 69 73 20 63 6f 64       ** This cod
1cef0 65 20 63 6f 70 69 65 73 20 63 75 72 72 65 6e 74  e copies current
1cf00 20 67 72 6f 75 70 20 62 79 20 74 65 72 6d 73 20   group by terms 
1cf10 69 6e 20 62 30 2c 62 31 2c 62 32 2c 2e 2e 2e 0a  in b0,b1,b2,....
1cf20 20 20 20 20 20 20 2a 2a 20 6f 76 65 72 20 74 6f        ** over to
1cf30 20 61 30 2c 61 31 2c 61 32 2e 20 20 49 74 20 74   a0,a1,a2.  It t
1cf40 68 65 6e 20 63 61 6c 6c 73 20 74 68 65 20 6f 75  hen calls the ou
1cf50 74 70 75 74 20 73 75 62 72 6f 75 74 69 6e 65 0a  tput subroutine.
1cf60 20 20 20 20 20 20 2a 2a 20 61 6e 64 20 72 65 73        ** and res
1cf70 65 74 73 20 74 68 65 20 61 67 67 72 65 67 61 74  ets the aggregat
1cf80 65 20 61 63 63 75 6d 75 6c 61 74 6f 72 20 72 65  e accumulator re
1cf90 67 69 73 74 65 72 73 20 69 6e 20 70 72 65 70 61  gisters in prepa
1cfa0 72 61 74 69 6f 6e 0a 20 20 20 20 20 20 2a 2a 20  ration.      ** 
1cfb0 66 6f 72 20 74 68 65 20 6e 65 78 74 20 47 52 4f  for the next GRO
1cfc0 55 50 20 42 59 20 62 61 74 63 68 2e 0a 20 20 20  UP BY batch..   
1cfd0 20 20 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69     */.      sqli
1cfe0 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61  te3VdbeResolveLa
1cff0 62 65 6c 28 76 2c 20 61 64 64 72 47 72 6f 75 70  bel(v, addrGroup
1d000 42 79 43 68 61 6e 67 65 29 3b 0a 20 20 20 20 20  ByChange);.     
1d010 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 47 72 6f   for(j=0; j<pGro
1d020 75 70 42 79 2d 3e 6e 45 78 70 72 3b 20 6a 2b 2b  upBy->nExpr; j++
1d030 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
1d040 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
1d050 4f 50 5f 4d 6f 76 65 2c 20 69 42 4d 65 6d 2b 6a  OP_Move, iBMem+j
1d060 2c 20 69 41 4d 65 6d 2b 6a 29 3b 0a 20 20 20 20  , iAMem+j);.    
1d070 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65    }.      sqlite
1d080 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
1d090 50 5f 47 6f 73 75 62 2c 20 30 2c 20 61 64 64 72  P_Gosub, 0, addr
1d0a0 4f 75 74 70 75 74 52 6f 77 29 3b 0a 20 20 20 20  OutputRow);.    
1d0b0 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76    VdbeComment((v
1d0c0 2c 20 22 6f 75 74 70 75 74 20 6f 6e 65 20 72 6f  , "output one ro
1d0d0 77 22 29 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  w"));.      sqli
1d0e0 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
1d0f0 20 4f 50 5f 49 66 50 6f 73 2c 20 69 41 62 6f 72   OP_IfPos, iAbor
1d100 74 46 6c 61 67 2c 20 61 64 64 72 45 6e 64 29 3b  tFlag, addrEnd);
1d110 0a 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65  .      VdbeComme
1d120 6e 74 28 28 76 2c 20 22 63 68 65 63 6b 20 61 62  nt((v, "check ab
1d130 6f 72 74 20 66 6c 61 67 22 29 29 3b 0a 20 20 20  ort flag"));.   
1d140 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
1d150 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 73 75 62  dOp2(v, OP_Gosub
1d160 2c 20 30 2c 20 61 64 64 72 52 65 73 65 74 29 3b  , 0, addrReset);
1d170 0a 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65  .      VdbeComme
1d180 6e 74 28 28 76 2c 20 22 72 65 73 65 74 20 61 63  nt((v, "reset ac
1d190 63 75 6d 75 6c 61 74 6f 72 22 29 29 3b 0a 0a 20  cumulator"));.. 
1d1a0 20 20 20 20 20 2f 2a 20 55 70 64 61 74 65 20 74       /* Update t
1d1b0 68 65 20 61 67 67 72 65 67 61 74 65 20 61 63 63  he aggregate acc
1d1c0 75 6d 75 6c 61 74 6f 72 73 20 62 61 73 65 64 20  umulators based 
1d1d0 6f 6e 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f  on the content o
1d1e0 66 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20 63  f.      ** the c
1d1f0 75 72 72 65 6e 74 20 72 6f 77 0a 20 20 20 20 20  urrent row.     
1d200 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65   */.      sqlite
1d210 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65  3VdbeResolveLabe
1d220 6c 28 76 2c 20 61 64 64 72 50 72 6f 63 65 73 73  l(v, addrProcess
1d230 52 6f 77 29 3b 0a 20 20 20 20 20 20 75 70 64 61  Row);.      upda
1d240 74 65 41 63 63 75 6d 75 6c 61 74 6f 72 28 70 50  teAccumulator(pP
1d250 61 72 73 65 2c 20 26 73 41 67 67 49 6e 66 6f 29  arse, &sAggInfo)
1d260 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
1d270 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
1d280 49 6e 74 65 67 65 72 2c 20 31 2c 20 69 55 73 65  Integer, 1, iUse
1d290 46 6c 61 67 29 3b 0a 20 20 20 20 20 20 56 64 62  Flag);.      Vdb
1d2a0 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 69 6e  eComment((v, "in
1d2b0 64 69 63 61 74 65 20 64 61 74 61 20 69 6e 20 61  dicate data in a
1d2c0 63 63 75 6d 75 6c 61 74 6f 72 22 29 29 3b 0a 0a  ccumulator"));..
1d2d0 20 20 20 20 20 20 2f 2a 20 45 6e 64 20 6f 66 20        /* End of 
1d2e0 74 68 65 20 6c 6f 6f 70 0a 20 20 20 20 20 20 2a  the loop.      *
1d2f0 2f 0a 20 20 20 20 20 20 69 66 28 20 67 72 6f 75  /.      if( grou
1d300 70 42 79 53 6f 72 74 20 29 7b 0a 20 20 20 20 20  pBySort ){.     
1d310 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
1d320 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 65 78 74 2c  dOp2(v, OP_Next,
1d330 20 73 41 67 67 49 6e 66 6f 2e 73 6f 72 74 69 6e   sAggInfo.sortin
1d340 67 49 64 78 2c 20 61 64 64 72 54 6f 70 4f 66 4c  gIdx, addrTopOfL
1d350 6f 6f 70 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  oop);.      }els
1d360 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  e{.        sqlit
1d370 65 33 57 68 65 72 65 45 6e 64 28 70 57 49 6e 66  e3WhereEnd(pWInf
1d380 6f 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  o);.        sqli
1d390 74 65 33 56 64 62 65 43 68 61 6e 67 65 54 6f 4e  te3VdbeChangeToN
1d3a0 6f 6f 70 28 76 2c 20 61 64 64 72 53 6f 72 74 69  oop(v, addrSorti
1d3b0 6e 67 49 64 78 2c 20 31 29 3b 0a 20 20 20 20 20  ngIdx, 1);.     
1d3c0 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 4f 75 74   }..      /* Out
1d3d0 70 75 74 20 74 68 65 20 66 69 6e 61 6c 20 72 6f  put the final ro
1d3e0 77 20 6f 66 20 72 65 73 75 6c 74 0a 20 20 20 20  w of result.    
1d3f0 20 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74    */.      sqlit
1d400 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
1d410 4f 50 5f 47 6f 73 75 62 2c 20 30 2c 20 61 64 64  OP_Gosub, 0, add
1d420 72 4f 75 74 70 75 74 52 6f 77 29 3b 0a 20 20 20  rOutputRow);.   
1d430 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28     VdbeComment((
1d440 76 2c 20 22 6f 75 74 70 75 74 20 66 69 6e 61 6c  v, "output final
1d450 20 72 6f 77 22 29 29 3b 0a 20 20 20 20 20 20 0a   row"));.      .
1d460 20 20 20 20 7d 20 2f 2a 20 65 6e 64 69 66 20 70      } /* endif p
1d470 47 72 6f 75 70 42 79 20 2a 2f 0a 20 20 20 20 65  GroupBy */.    e
1d480 6c 73 65 20 7b 0a 20 20 20 20 20 20 45 78 70 72  lse {.      Expr
1d490 4c 69 73 74 20 2a 70 4d 69 6e 4d 61 78 20 3d 20  List *pMinMax = 
1d4a0 30 3b 0a 20 20 20 20 20 20 45 78 70 72 4c 69 73  0;.      ExprLis
1d4b0 74 20 2a 70 44 65 6c 20 3d 20 30 3b 0a 20 20 20  t *pDel = 0;.   
1d4c0 20 20 20 75 38 20 66 6c 61 67 3b 0a 0a 20 20 20     u8 flag;..   
1d4d0 20 20 20 2f 2a 20 43 68 65 63 6b 20 69 66 20 74     /* Check if t
1d4e0 68 65 20 71 75 65 72 79 20 69 73 20 6f 66 20 6f  he query is of o
1d4f0 6e 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77  ne of the follow
1d500 69 6e 67 20 66 6f 72 6d 73 3a 0a 20 20 20 20 20  ing forms:.     
1d510 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 20 20 53   **.      **   S
1d520 45 4c 45 43 54 20 6d 69 6e 28 78 29 20 46 52 4f  ELECT min(x) FRO
1d530 4d 20 2e 2e 2e 0a 20 20 20 20 20 20 2a 2a 20 20  M ....      **  
1d540 20 53 45 4c 45 43 54 20 6d 61 78 28 78 29 20 46   SELECT max(x) F
1d550 52 4f 4d 20 2e 2e 2e 0a 20 20 20 20 20 20 2a 2a  ROM ....      **
1d560 0a 20 20 20 20 20 20 2a 2a 20 49 66 20 69 74 20  .      ** If it 
1d570 69 73 2c 20 74 68 65 6e 20 61 73 6b 20 74 68 65  is, then ask the
1d580 20 63 6f 64 65 20 69 6e 20 77 68 65 72 65 2e 63   code in where.c
1d590 20 74 6f 20 61 74 74 65 6d 70 74 20 74 6f 20 73   to attempt to s
1d5a0 6f 72 74 20 72 65 73 75 6c 74 73 0a 20 20 20 20  ort results.    
1d5b0 20 20 2a 2a 20 61 73 20 69 66 20 74 68 65 72 65    ** as if there
1d5c0 20 77 61 73 20 61 6e 20 22 4f 52 44 45 52 20 4f   was an "ORDER O
1d5d0 4e 20 78 22 20 6f 72 20 22 4f 52 44 45 52 20 4f  N x" or "ORDER O
1d5e0 4e 20 78 20 44 45 53 43 22 20 63 6c 61 75 73 65  N x DESC" clause
1d5f0 2e 20 0a 20 20 20 20 20 20 2a 2a 20 49 66 20 77  . .      ** If w
1d600 68 65 72 65 2e 63 20 69 73 20 61 62 6c 65 20 74  here.c is able t
1d610 6f 20 70 72 6f 64 75 63 65 20 72 65 73 75 6c 74  o produce result
1d620 73 20 73 6f 72 74 65 64 20 69 6e 20 74 68 69 73  s sorted in this
1d630 20 6f 72 64 65 72 2c 20 74 68 65 6e 0a 20 20 20   order, then.   
1d640 20 20 20 2a 2a 20 61 64 64 20 76 64 62 65 20 63     ** add vdbe c
1d650 6f 64 65 20 74 6f 20 62 72 65 61 6b 20 6f 75 74  ode to break out
1d660 20 6f 66 20 74 68 65 20 70 72 6f 63 65 73 73 69   of the processi
1d670 6e 67 20 6c 6f 6f 70 20 61 66 74 65 72 20 74 68  ng loop after th
1d680 65 20 0a 20 20 20 20 20 20 2a 2a 20 66 69 72 73  e .      ** firs
1d690 74 20 69 74 65 72 61 74 69 6f 6e 20 28 73 69 6e  t iteration (sin
1d6a0 63 65 20 74 68 65 20 66 69 72 73 74 20 69 74 65  ce the first ite
1d6b0 72 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 6c 6f  ration of the lo
1d6c0 6f 70 20 69 73 20 0a 20 20 20 20 20 20 2a 2a 20  op is .      ** 
1d6d0 67 75 61 72 61 6e 74 65 65 64 20 74 6f 20 6f 70  guaranteed to op
1d6e0 65 72 61 74 65 20 6f 6e 20 74 68 65 20 72 6f 77  erate on the row
1d6f0 20 77 69 74 68 20 74 68 65 20 6d 69 6e 69 6d 75   with the minimu
1d700 6d 20 6f 72 20 6d 61 78 69 6d 75 6d 20 0a 20 20  m or maximum .  
1d710 20 20 20 20 2a 2a 20 76 61 6c 75 65 20 6f 66 20      ** value of 
1d720 78 2c 20 74 68 65 20 6f 6e 6c 79 20 72 6f 77 20  x, the only row 
1d730 72 65 71 75 69 72 65 64 29 2e 0a 20 20 20 20 20  required)..     
1d740 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 41 20 73   **.      ** A s
1d750 70 65 63 69 61 6c 20 66 6c 61 67 20 6d 75 73 74  pecial flag must
1d760 20 62 65 20 70 61 73 73 65 64 20 74 6f 20 73 71   be passed to sq
1d770 6c 69 74 65 33 57 68 65 72 65 42 65 67 69 6e 28  lite3WhereBegin(
1d780 29 20 74 6f 20 73 6c 69 67 68 74 6c 79 0a 20 20  ) to slightly.  
1d790 20 20 20 20 2a 2a 20 6d 6f 64 69 66 79 20 62 65      ** modify be
1d7a0 68 61 76 69 6f 75 72 20 61 73 20 66 6f 6c 6c 6f  haviour as follo
1d7b0 77 73 3a 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20  ws:.      **.   
1d7c0 20 20 20 2a 2a 20 20 20 2b 20 49 66 20 74 68 65     **   + If the
1d7d0 20 71 75 65 72 79 20 69 73 20 61 20 22 53 45 4c   query is a "SEL
1d7e0 45 43 54 20 6d 69 6e 28 78 29 22 2c 20 74 68 65  ECT min(x)", the
1d7f0 6e 20 74 68 65 20 6c 6f 6f 70 20 63 6f 64 65 64  n the loop coded
1d800 20 62 79 0a 20 20 20 20 20 20 2a 2a 20 20 20 20   by.      **    
1d810 20 77 68 65 72 65 2e 63 20 73 68 6f 75 6c 64 20   where.c should 
1d820 6e 6f 74 20 69 74 65 72 61 74 65 20 6f 76 65 72  not iterate over
1d830 20 61 6e 79 20 76 61 6c 75 65 73 20 77 69 74 68   any values with
1d840 20 61 20 4e 55 4c 4c 20 76 61 6c 75 65 0a 20 20   a NULL value.  
1d850 20 20 20 20 2a 2a 20 20 20 20 20 66 6f 72 20 78      **     for x
1d860 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20  ..      **.     
1d870 20 2a 2a 20 20 20 2b 20 54 68 65 20 6f 70 74 69   **   + The opti
1d880 6d 69 7a 65 72 20 63 6f 64 65 20 69 6e 20 77 68  mizer code in wh
1d890 65 72 65 2e 63 20 28 74 68 65 20 74 68 69 6e 67  ere.c (the thing
1d8a0 20 74 68 61 74 20 64 65 63 69 64 65 73 20 77 68   that decides wh
1d8b0 69 63 68 0a 20 20 20 20 20 20 2a 2a 20 20 20 20  ich.      **    
1d8c0 20 69 6e 64 65 78 20 6f 72 20 69 6e 64 69 63 65   index or indice
1d8d0 73 20 74 6f 20 75 73 65 29 20 73 68 6f 75 6c 64  s to use) should
1d8e0 20 70 6c 61 63 65 20 61 20 64 69 66 66 65 72 65   place a differe
1d8f0 6e 74 20 70 72 69 6f 72 69 74 79 20 6f 6e 20 0a  nt priority on .
1d900 20 20 20 20 20 20 2a 2a 20 20 20 20 20 73 61 74        **     sat
1d910 69 73 66 79 69 6e 67 20 74 68 65 20 27 4f 52 44  isfying the 'ORD
1d920 45 52 20 42 59 27 20 63 6c 61 75 73 65 20 74 68  ER BY' clause th
1d930 61 6e 20 69 74 20 64 6f 65 73 20 69 6e 20 6f 74  an it does in ot
1d940 68 65 72 20 63 61 73 65 73 2e 0a 20 20 20 20 20  her cases..     
1d950 20 2a 2a 20 20 20 20 20 52 65 66 65 72 20 74 6f   **     Refer to
1d960 20 63 6f 64 65 20 61 6e 64 20 63 6f 6d 6d 65 6e   code and commen
1d970 74 73 20 69 6e 20 77 68 65 72 65 2e 63 20 66 6f  ts in where.c fo
1d980 72 20 64 65 74 61 69 6c 73 2e 0a 20 20 20 20 20  r details..     
1d990 20 2a 2f 0a 20 20 20 20 20 20 66 6c 61 67 20 3d   */.      flag =
1d9a0 20 6d 69 6e 4d 61 78 51 75 65 72 79 28 70 50 61   minMaxQuery(pPa
1d9b0 72 73 65 2c 20 70 29 3b 0a 20 20 20 20 20 20 69  rse, p);.      i
1d9c0 66 28 20 66 6c 61 67 20 29 7b 0a 20 20 20 20 20  f( flag ){.     
1d9d0 20 20 20 70 44 65 6c 20 3d 20 70 4d 69 6e 4d 61     pDel = pMinMa
1d9e0 78 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c  x = sqlite3ExprL
1d9f0 69 73 74 44 75 70 28 64 62 2c 20 70 2d 3e 70 45  istDup(db, p->pE
1da00 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72  List->a[0].pExpr
1da10 2d 3e 70 4c 69 73 74 29 3b 0a 20 20 20 20 20 20  ->pList);.      
1da20 20 20 69 66 28 20 70 4d 69 6e 4d 61 78 20 26 26    if( pMinMax &&
1da30 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c   !db->mallocFail
1da40 65 64 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ed ){.          
1da50 70 4d 69 6e 4d 61 78 2d 3e 61 5b 30 5d 2e 73 6f  pMinMax->a[0].so
1da60 72 74 4f 72 64 65 72 20 3d 20 28 28 66 6c 61 67  rtOrder = ((flag
1da70 3d 3d 4f 52 44 45 52 42 59 5f 4d 49 4e 29 3f 30  ==ORDERBY_MIN)?0
1da80 3a 31 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70  :1);.          p
1da90 4d 69 6e 4d 61 78 2d 3e 61 5b 30 5d 2e 70 45 78  MinMax->a[0].pEx
1daa0 70 72 2d 3e 6f 70 20 3d 20 54 4b 5f 43 4f 4c 55  pr->op = TK_COLU
1dab0 4d 4e 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  MN;.        }.  
1dac0 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20      }..      /* 
1dad0 54 68 69 73 20 63 61 73 65 20 72 75 6e 73 20 69  This case runs i
1dae0 66 20 74 68 65 20 61 67 67 72 65 67 61 74 65 20  f the aggregate 
1daf0 68 61 73 20 6e 6f 20 47 52 4f 55 50 20 42 59 20  has no GROUP BY 
1db00 63 6c 61 75 73 65 2e 20 20 54 68 65 0a 20 20 20  clause.  The.   
1db10 20 20 20 2a 2a 20 70 72 6f 63 65 73 73 69 6e 67     ** processing
1db20 20 69 73 20 6d 75 63 68 20 73 69 6d 70 6c 65 72   is much simpler
1db30 20 73 69 6e 63 65 20 74 68 65 72 65 20 69 73 20   since there is 
1db40 6f 6e 6c 79 20 61 20 73 69 6e 67 6c 65 20 72 6f  only a single ro
1db50 77 0a 20 20 20 20 20 20 2a 2a 20 6f 66 20 6f 75  w.      ** of ou
1db60 74 70 75 74 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  tput..      */. 
1db70 20 20 20 20 20 72 65 73 65 74 41 63 63 75 6d 75       resetAccumu
1db80 6c 61 74 6f 72 28 70 50 61 72 73 65 2c 20 26 73  lator(pParse, &s
1db90 41 67 67 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20  AggInfo);.      
1dba0 70 57 49 6e 66 6f 20 3d 20 73 71 6c 69 74 65 33  pWInfo = sqlite3
1dbb0 57 68 65 72 65 42 65 67 69 6e 28 70 50 61 72 73  WhereBegin(pPars
1dbc0 65 2c 20 70 54 61 62 4c 69 73 74 2c 20 70 57 68  e, pTabList, pWh
1dbd0 65 72 65 2c 20 26 70 4d 69 6e 4d 61 78 2c 20 66  ere, &pMinMax, f
1dbe0 6c 61 67 29 3b 0a 20 20 20 20 20 20 69 66 28 20  lag);.      if( 
1dbf0 70 57 49 6e 66 6f 3d 3d 30 20 29 7b 0a 20 20 20  pWInfo==0 ){.   
1dc00 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
1dc10 4c 69 73 74 44 65 6c 65 74 65 28 70 44 65 6c 29  ListDelete(pDel)
1dc20 3b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 73  ;.        goto s
1dc30 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 20  elect_end;.     
1dc40 20 7d 0a 20 20 20 20 20 20 75 70 64 61 74 65 41   }.      updateA
1dc50 63 63 75 6d 75 6c 61 74 6f 72 28 70 50 61 72 73  ccumulator(pPars
1dc60 65 2c 20 26 73 41 67 67 49 6e 66 6f 29 3b 0a 20  e, &sAggInfo);. 
1dc70 20 20 20 20 20 69 66 28 20 21 70 4d 69 6e 4d 61       if( !pMinMa
1dc80 78 20 26 26 20 66 6c 61 67 20 29 7b 0a 20 20 20  x && flag ){.   
1dc90 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
1dca0 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 74  AddOp2(v, OP_Got
1dcb0 6f 2c 20 30 2c 20 70 57 49 6e 66 6f 2d 3e 69 42  o, 0, pWInfo->iB
1dcc0 72 65 61 6b 29 3b 0a 20 20 20 20 20 20 20 20 56  reak);.        V
1dcd0 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22  dbeComment((v, "
1dce0 25 73 28 29 20 62 79 20 69 6e 64 65 78 22 2c 20  %s() by index", 
1dcf0 28 66 6c 61 67 3d 3d 4f 52 44 45 52 42 59 5f 4d  (flag==ORDERBY_M
1dd00 49 4e 3f 22 6d 69 6e 22 3a 22 6d 61 78 22 29 29  IN?"min":"max"))
1dd10 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
1dd20 20 73 71 6c 69 74 65 33 57 68 65 72 65 45 6e 64   sqlite3WhereEnd
1dd30 28 70 57 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20  (pWInfo);.      
1dd40 66 69 6e 61 6c 69 7a 65 41 67 67 46 75 6e 63 74  finalizeAggFunct
1dd50 69 6f 6e 73 28 70 50 61 72 73 65 2c 20 26 73 41  ions(pParse, &sA
1dd60 67 67 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20 70  ggInfo);.      p
1dd70 4f 72 64 65 72 42 79 20 3d 20 30 3b 0a 20 20 20  OrderBy = 0;.   
1dd80 20 20 20 69 66 28 20 70 48 61 76 69 6e 67 20 29     if( pHaving )
1dd90 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
1dda0 33 45 78 70 72 49 66 46 61 6c 73 65 28 70 50 61  3ExprIfFalse(pPa
1ddb0 72 73 65 2c 20 70 48 61 76 69 6e 67 2c 20 61 64  rse, pHaving, ad
1ddc0 64 72 45 6e 64 2c 20 53 51 4c 49 54 45 5f 4a 55  drEnd, SQLITE_JU
1ddd0 4d 50 49 46 4e 55 4c 4c 29 3b 0a 20 20 20 20 20  MPIFNULL);.     
1dde0 20 7d 0a 20 20 20 20 20 20 73 65 6c 65 63 74 49   }.      selectI
1ddf0 6e 6e 65 72 4c 6f 6f 70 28 70 50 61 72 73 65 2c  nnerLoop(pParse,
1de00 20 70 2c 20 70 2d 3e 70 45 4c 69 73 74 2c 20 30   p, p->pEList, 0
1de10 2c 20 30 2c 20 30 2c 20 2d 31 2c 20 0a 20 20 20  , 0, 0, -1, .   
1de20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1de30 20 20 20 70 44 65 73 74 2c 20 61 64 64 72 45 6e     pDest, addrEn
1de40 64 2c 20 61 64 64 72 45 6e 64 2c 20 61 66 66 29  d, addrEnd, aff)
1de50 3b 0a 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ;..      sqlite3
1de60 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28 70  ExprListDelete(p
1de70 44 65 6c 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  Del);.    }.    
1de80 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c  sqlite3VdbeResol
1de90 76 65 4c 61 62 65 6c 28 76 2c 20 61 64 64 72 45  veLabel(v, addrE
1dea0 6e 64 29 3b 0a 20 20 20 20 0a 20 20 7d 20 2f 2a  nd);.    .  } /*
1deb0 20 65 6e 64 69 66 20 61 67 67 72 65 67 61 74 65   endif aggregate
1dec0 20 71 75 65 72 79 20 2a 2f 0a 0a 20 20 2f 2a 20   query */..  /* 
1ded0 49 66 20 74 68 65 72 65 20 69 73 20 61 6e 20 4f  If there is an O
1dee0 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 2c 20  RDER BY clause, 
1def0 74 68 65 6e 20 77 65 20 6e 65 65 64 20 74 6f 20  then we need to 
1df00 73 6f 72 74 20 74 68 65 20 72 65 73 75 6c 74 73  sort the results
1df10 0a 20 20 2a 2a 20 61 6e 64 20 73 65 6e 64 20 74  .  ** and send t
1df20 68 65 6d 20 74 6f 20 74 68 65 20 63 61 6c 6c 62  hem to the callb
1df30 61 63 6b 20 6f 6e 65 20 62 79 20 6f 6e 65 2e 0a  ack one by one..
1df40 20 20 2a 2f 0a 20 20 69 66 28 20 70 4f 72 64 65    */.  if( pOrde
1df50 72 42 79 20 29 7b 0a 20 20 20 20 67 65 6e 65 72  rBy ){.    gener
1df60 61 74 65 53 6f 72 74 54 61 69 6c 28 70 50 61 72  ateSortTail(pPar
1df70 73 65 2c 20 70 2c 20 76 2c 20 70 45 4c 69 73 74  se, p, v, pEList
1df80 2d 3e 6e 45 78 70 72 2c 20 70 44 65 73 74 29 3b  ->nExpr, pDest);
1df90 0a 20 20 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51  .  }..#ifndef SQ
1dfa0 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45  LITE_OMIT_SUBQUE
1dfb0 52 59 0a 20 20 2f 2a 20 49 66 20 74 68 69 73 20  RY.  /* If this 
1dfc0 77 61 73 20 61 20 73 75 62 71 75 65 72 79 2c 20  was a subquery, 
1dfd0 77 65 20 68 61 76 65 20 6e 6f 77 20 63 6f 6e 76  we have now conv
1dfe0 65 72 74 65 64 20 74 68 65 20 73 75 62 71 75 65  erted the subque
1dff0 72 79 20 69 6e 74 6f 20 61 0a 20 20 2a 2a 20 74  ry into a.  ** t
1e000 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 2e 20  emporary table. 
1e010 20 53 6f 20 73 65 74 20 74 68 65 20 53 72 63 4c   So set the SrcL
1e020 69 73 74 5f 69 74 65 6d 2e 69 73 50 6f 70 75 6c  ist_item.isPopul
1e030 61 74 65 64 20 66 6c 61 67 20 74 6f 20 70 72 65  ated flag to pre
1e040 76 65 6e 74 0a 20 20 2a 2a 20 74 68 69 73 20 73  vent.  ** this s
1e050 75 62 71 75 65 72 79 20 66 72 6f 6d 20 62 65 69  ubquery from bei
1e060 6e 67 20 65 76 61 6c 75 61 74 65 64 20 61 67 61  ng evaluated aga
1e070 69 6e 20 61 6e 64 20 74 6f 20 66 6f 72 63 65 20  in and to force 
1e080 74 68 65 20 75 73 65 20 6f 66 0a 20 20 2a 2a 20  the use of.  ** 
1e090 74 68 65 20 74 65 6d 70 6f 72 61 72 79 20 74 61  the temporary ta
1e0a0 62 6c 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ble..  */.  if( 
1e0b0 70 50 61 72 65 6e 74 20 29 7b 0a 20 20 20 20 61  pParent ){.    a
1e0c0 73 73 65 72 74 28 20 70 50 61 72 65 6e 74 2d 3e  ssert( pParent->
1e0d0 70 53 72 63 2d 3e 6e 53 72 63 3e 70 61 72 65 6e  pSrc->nSrc>paren
1e0e0 74 54 61 62 20 29 3b 0a 20 20 20 20 61 73 73 65  tTab );.    asse
1e0f0 72 74 28 20 70 50 61 72 65 6e 74 2d 3e 70 53 72  rt( pParent->pSr
1e100 63 2d 3e 61 5b 70 61 72 65 6e 74 54 61 62 5d 2e  c->a[parentTab].
1e110 70 53 65 6c 65 63 74 3d 3d 70 20 29 3b 0a 20 20  pSelect==p );.  
1e120 20 20 70 50 61 72 65 6e 74 2d 3e 70 53 72 63 2d    pParent->pSrc-
1e130 3e 61 5b 70 61 72 65 6e 74 54 61 62 5d 2e 69 73  >a[parentTab].is
1e140 50 6f 70 75 6c 61 74 65 64 20 3d 20 31 3b 0a 20  Populated = 1;. 
1e150 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20   }.#endif..  /* 
1e160 4a 75 6d 70 20 68 65 72 65 20 74 6f 20 73 6b 69  Jump here to ski
1e170 70 20 74 68 69 73 20 71 75 65 72 79 0a 20 20 2a  p this query.  *
1e180 2f 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 52  /.  sqlite3VdbeR
1e190 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 69  esolveLabel(v, i
1e1a0 45 6e 64 29 3b 0a 0a 20 20 2f 2a 20 54 68 65 20  End);..  /* The 
1e1b0 53 45 4c 45 43 54 20 77 61 73 20 73 75 63 63 65  SELECT was succe
1e1c0 73 73 66 75 6c 6c 79 20 63 6f 64 65 64 2e 20 20  ssfully coded.  
1e1d0 20 53 65 74 20 74 68 65 20 72 65 74 75 72 6e 20   Set the return 
1e1e0 63 6f 64 65 20 74 6f 20 30 0a 20 20 2a 2a 20 74  code to 0.  ** t
1e1f0 6f 20 69 6e 64 69 63 61 74 65 20 6e 6f 20 65 72  o indicate no er
1e200 72 6f 72 73 2e 0a 20 20 2a 2f 0a 20 20 72 63 20  rors..  */.  rc 
1e210 3d 20 30 3b 0a 0a 20 20 2f 2a 20 43 6f 6e 74 72  = 0;..  /* Contr
1e220 6f 6c 20 6a 75 6d 70 73 20 74 6f 20 68 65 72 65  ol jumps to here
1e230 20 69 66 20 61 6e 20 65 72 72 6f 72 20 69 73 20   if an error is 
1e240 65 6e 63 6f 75 6e 74 65 72 65 64 20 61 62 6f 76  encountered abov
1e250 65 2c 20 6f 72 20 75 70 6f 6e 0a 20 20 2a 2a 20  e, or upon.  ** 
1e260 73 75 63 63 65 73 73 66 75 6c 20 63 6f 64 69 6e  successful codin
1e270 67 20 6f 66 20 74 68 65 20 53 45 4c 45 43 54 2e  g of the SELECT.
1e280 0a 20 20 2a 2f 0a 73 65 6c 65 63 74 5f 65 6e 64  .  */.select_end
1e290 3a 0a 0a 20 20 2f 2a 20 49 64 65 6e 74 69 66 79  :..  /* Identify
1e2a0 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 69 66   column names if
1e2b0 20 77 65 20 77 69 6c 6c 20 62 65 20 75 73 69 6e   we will be usin
1e2c0 67 20 74 68 65 6d 20 69 6e 20 61 20 63 61 6c 6c  g them in a call
1e2d0 62 61 63 6b 2e 20 20 54 68 69 73 0a 20 20 2a 2a  back.  This.  **
1e2e0 20 73 74 65 70 20 69 73 20 73 6b 69 70 70 65 64   step is skipped
1e2f0 20 69 66 20 74 68 65 20 6f 75 74 70 75 74 20 69   if the output i
1e300 73 20 67 6f 69 6e 67 20 74 6f 20 73 6f 6d 65 20  s going to some 
1e310 6f 74 68 65 72 20 64 65 73 74 69 6e 61 74 69 6f  other destinatio
1e320 6e 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 72 63  n..  */.  if( rc
1e330 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70  ==SQLITE_OK && p
1e340 44 65 73 74 2d 3e 65 44 65 73 74 3d 3d 53 52 54  Dest->eDest==SRT
1e350 5f 43 61 6c 6c 62 61 63 6b 20 29 7b 0a 20 20 20  _Callback ){.   
1e360 20 67 65 6e 65 72 61 74 65 43 6f 6c 75 6d 6e 4e   generateColumnN
1e370 61 6d 65 73 28 70 50 61 72 73 65 2c 20 70 54 61  ames(pParse, pTa
1e380 62 4c 69 73 74 2c 20 70 45 4c 69 73 74 29 3b 0a  bList, pEList);.
1e390 20 20 7d 0a 0a 20 20 73 71 6c 69 74 65 33 5f 66    }..  sqlite3_f
1e3a0 72 65 65 28 73 41 67 67 49 6e 66 6f 2e 61 43 6f  ree(sAggInfo.aCo
1e3b0 6c 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72  l);.  sqlite3_fr
1e3c0 65 65 28 73 41 67 67 49 6e 66 6f 2e 61 46 75 6e  ee(sAggInfo.aFun
1e3d0 63 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  c);.  return rc;
1e3e0 0a 7d 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28  .}..#if defined(
1e3f0 53 51 4c 49 54 45 5f 44 45 42 55 47 29 0a 2f 2a  SQLITE_DEBUG)./*
1e400 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  .***************
1e410 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1e420 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1e430 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1e440 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1e450 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e  .** The followin
1e460 67 20 63 6f 64 65 20 69 73 20 75 73 65 64 20 66  g code is used f
1e470 6f 72 20 74 65 73 74 69 6e 67 20 61 6e 64 20 64  or testing and d
1e480 65 62 75 67 67 69 6e 67 20 6f 6e 6c 79 2e 20 20  ebugging only.  
1e490 54 68 65 20 63 6f 64 65 0a 2a 2a 20 74 68 61 74  The code.** that
1e4a0 20 66 6f 6c 6c 6f 77 73 20 64 6f 65 73 20 6e 6f   follows does no
1e4b0 74 20 61 70 70 65 61 72 20 69 6e 20 6e 6f 72 6d  t appear in norm
1e4c0 61 6c 20 62 75 69 6c 64 73 2e 0a 2a 2a 0a 2a 2a  al builds..**.**
1e4d0 20 54 68 65 73 65 20 72 6f 75 74 69 6e 65 73 20   These routines 
1e4e0 61 72 65 20 75 73 65 64 20 74 6f 20 70 72 69 6e  are used to prin
1e4f0 74 20 6f 75 74 20 74 68 65 20 63 6f 6e 74 65 6e  t out the conten
1e500 74 20 6f 66 20 61 6c 6c 20 6f 72 20 70 61 72 74  t of all or part
1e510 20 6f 66 20 61 20 0a 2a 2a 20 70 61 72 73 65 20   of a .** parse 
1e520 73 74 72 75 63 74 75 72 65 73 20 73 75 63 68 20  structures such 
1e530 61 73 20 53 65 6c 65 63 74 20 6f 72 20 45 78 70  as Select or Exp
1e540 72 2e 20 20 53 75 63 68 20 70 72 69 6e 74 6f 75  r.  Such printou
1e550 74 73 20 61 72 65 20 75 73 65 66 75 6c 0a 2a 2a  ts are useful.**
1e560 20 66 6f 72 20 68 65 6c 70 69 6e 67 20 74 6f 20   for helping to 
1e570 75 6e 64 65 72 73 74 61 6e 64 20 77 68 61 74 20  understand what 
1e580 69 73 20 68 61 70 70 65 6e 69 6e 67 20 69 6e 73  is happening ins
1e590 69 64 65 20 74 68 65 20 63 6f 64 65 20 67 65 6e  ide the code gen
1e5a0 65 72 61 74 6f 72 0a 2a 2a 20 64 75 72 69 6e 67  erator.** during
1e5b0 20 74 68 65 20 65 78 65 63 75 74 69 6f 6e 20 6f   the execution o
1e5c0 66 20 63 6f 6d 70 6c 65 78 20 53 45 4c 45 43 54  f complex SELECT
1e5d0 20 73 74 61 74 65 6d 65 6e 74 73 2e 0a 2a 2a 0a   statements..**.
1e5e0 2a 2a 20 54 68 65 73 65 20 72 6f 75 74 69 6e 65  ** These routine
1e5f0 20 61 72 65 20 6e 6f 74 20 63 61 6c 6c 65 64 20   are not called 
1e600 61 6e 79 77 68 65 72 65 20 66 72 6f 6d 20 77 69  anywhere from wi
1e610 74 68 69 6e 20 74 68 65 20 6e 6f 72 6d 61 6c 0a  thin the normal.
1e620 2a 2a 20 63 6f 64 65 20 62 61 73 65 2e 20 20 54  ** code base.  T
1e630 68 65 6e 20 61 72 65 20 69 6e 74 65 6e 64 65 64  hen are intended
1e640 20 74 6f 20 62 65 20 63 61 6c 6c 65 64 20 66 72   to be called fr
1e650 6f 6d 20 77 69 74 68 69 6e 20 74 68 65 20 64 65  om within the de
1e660 62 75 67 67 65 72 0a 2a 2a 20 6f 72 20 66 72 6f  bugger.** or fro
1e670 6d 20 74 65 6d 70 6f 72 61 72 79 20 22 70 72 69  m temporary "pri
1e680 6e 74 66 22 20 73 74 61 74 65 6d 65 6e 74 73 20  ntf" statements 
1e690 69 6e 73 65 72 74 65 64 20 66 6f 72 20 64 65 62  inserted for deb
1e6a0 75 67 67 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69  ugging..*/.stati
1e6b0 63 20 76 6f 69 64 20 73 71 6c 69 74 65 33 50 72  c void sqlite3Pr
1e6c0 69 6e 74 45 78 70 72 28 45 78 70 72 20 2a 70 29  intExpr(Expr *p)
1e6d0 7b 0a 20 20 69 66 28 20 70 2d 3e 74 6f 6b 65 6e  {.  if( p->token
1e6e0 2e 7a 20 26 26 20 70 2d 3e 74 6f 6b 65 6e 2e 6e  .z && p->token.n
1e6f0 3e 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  >0 ){.    sqlite
1e700 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 28 25  3DebugPrintf("(%
1e710 2e 2a 73 22 2c 20 70 2d 3e 74 6f 6b 65 6e 2e 6e  .*s", p->token.n
1e720 2c 20 70 2d 3e 74 6f 6b 65 6e 2e 7a 29 3b 0a 20  , p->token.z);. 
1e730 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69   }else{.    sqli
1e740 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22  te3DebugPrintf("
1e750 28 25 64 22 2c 20 70 2d 3e 6f 70 29 3b 0a 20 20  (%d", p->op);.  
1e760 7d 0a 20 20 69 66 28 20 70 2d 3e 70 4c 65 66 74  }.  if( p->pLeft
1e770 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 44   ){.    sqlite3D
1e780 65 62 75 67 50 72 69 6e 74 66 28 22 20 22 29 3b  ebugPrintf(" ");
1e790 0a 20 20 20 20 73 71 6c 69 74 65 33 50 72 69 6e  .    sqlite3Prin
1e7a0 74 45 78 70 72 28 70 2d 3e 70 4c 65 66 74 29 3b  tExpr(p->pLeft);
1e7b0 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e 70 52  .  }.  if( p->pR
1e7c0 69 67 68 74 20 29 7b 0a 20 20 20 20 73 71 6c 69  ight ){.    sqli
1e7d0 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22  te3DebugPrintf("
1e7e0 20 22 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33   ");.    sqlite3
1e7f0 50 72 69 6e 74 45 78 70 72 28 70 2d 3e 70 52 69  PrintExpr(p->pRi
1e800 67 68 74 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  ght);.  }.  sqli
1e810 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22  te3DebugPrintf("
1e820 29 22 29 3b 0a 7d 0a 73 74 61 74 69 63 20 76 6f  )");.}.static vo
1e830 69 64 20 73 71 6c 69 74 65 33 50 72 69 6e 74 45  id sqlite3PrintE
1e840 78 70 72 4c 69 73 74 28 45 78 70 72 4c 69 73 74  xprList(ExprList
1e850 20 2a 70 4c 69 73 74 29 7b 0a 20 20 69 6e 74 20   *pList){.  int 
1e860 69 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  i;.  for(i=0; i<
1e870 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b  pList->nExpr; i+
1e880 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 50  +){.    sqlite3P
1e890 72 69 6e 74 45 78 70 72 28 70 4c 69 73 74 2d 3e  rintExpr(pList->
1e8a0 61 5b 69 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20  a[i].pExpr);.   
1e8b0 20 69 66 28 20 69 3c 70 4c 69 73 74 2d 3e 6e 45   if( i<pList->nE
1e8c0 78 70 72 2d 31 20 29 7b 0a 20 20 20 20 20 20 73  xpr-1 ){.      s
1e8d0 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74  qlite3DebugPrint
1e8e0 66 28 22 2c 20 22 29 3b 0a 20 20 20 20 7d 0a 20  f(", ");.    }. 
1e8f0 20 7d 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64   }.}.static void
1e900 20 73 71 6c 69 74 65 33 50 72 69 6e 74 53 65 6c   sqlite3PrintSel
1e910 65 63 74 28 53 65 6c 65 63 74 20 2a 70 2c 20 69  ect(Select *p, i
1e920 6e 74 20 69 6e 64 65 6e 74 29 7b 0a 20 20 73 71  nt indent){.  sq
1e930 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66  lite3DebugPrintf
1e940 28 22 25 2a 73 53 45 4c 45 43 54 28 25 70 29 20  ("%*sSELECT(%p) 
1e950 22 2c 20 69 6e 64 65 6e 74 2c 20 22 22 2c 20 70  ", indent, "", p
1e960 29 3b 0a 20 20 73 71 6c 69 74 65 33 50 72 69 6e  );.  sqlite3Prin
1e970 74 45 78 70 72 4c 69 73 74 28 70 2d 3e 70 45 4c  tExprList(p->pEL
1e980 69 73 74 29 3b 0a 20 20 73 71 6c 69 74 65 33 44  ist);.  sqlite3D
1e990 65 62 75 67 50 72 69 6e 74 66 28 22 5c 6e 22 29  ebugPrintf("\n")
1e9a0 3b 0a 20 20 69 66 28 20 70 2d 3e 70 53 72 63 20  ;.  if( p->pSrc 
1e9b0 29 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a 50 72  ){.    char *zPr
1e9c0 65 66 69 78 3b 0a 20 20 20 20 69 6e 74 20 69 3b  efix;.    int i;
1e9d0 0a 20 20 20 20 7a 50 72 65 66 69 78 20 3d 20 22  .    zPrefix = "
1e9e0 46 52 4f 4d 22 3b 0a 20 20 20 20 66 6f 72 28 69  FROM";.    for(i
1e9f0 3d 30 3b 20 69 3c 70 2d 3e 70 53 72 63 2d 3e 6e  =0; i<p->pSrc->n
1ea00 53 72 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  Src; i++){.     
1ea10 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f   struct SrcList_
1ea20 69 74 65 6d 20 2a 70 49 74 65 6d 20 3d 20 26 70  item *pItem = &p
1ea30 2d 3e 70 53 72 63 2d 3e 61 5b 69 5d 3b 0a 20 20  ->pSrc->a[i];.  
1ea40 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67      sqlite3Debug
1ea50 50 72 69 6e 74 66 28 22 25 2a 73 20 22 2c 20 69  Printf("%*s ", i
1ea60 6e 64 65 6e 74 2b 36 2c 20 7a 50 72 65 66 69 78  ndent+6, zPrefix
1ea70 29 3b 0a 20 20 20 20 20 20 7a 50 72 65 66 69 78  );.      zPrefix
1ea80 20 3d 20 22 22 3b 0a 20 20 20 20 20 20 69 66 28   = "";.      if(
1ea90 20 70 49 74 65 6d 2d 3e 70 53 65 6c 65 63 74 20   pItem->pSelect 
1eaa0 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
1eab0 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 28  e3DebugPrintf("(
1eac0 5c 6e 22 29 3b 0a 20 20 20 20 20 20 20 20 73 71  \n");.        sq
1ead0 6c 69 74 65 33 50 72 69 6e 74 53 65 6c 65 63 74  lite3PrintSelect
1eae0 28 70 49 74 65 6d 2d 3e 70 53 65 6c 65 63 74 2c  (pItem->pSelect,
1eaf0 20 69 6e 64 65 6e 74 2b 31 30 29 3b 0a 20 20 20   indent+10);.   
1eb00 20 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75       sqlite3Debu
1eb10 67 50 72 69 6e 74 66 28 22 25 2a 73 29 22 2c 20  gPrintf("%*s)", 
1eb20 69 6e 64 65 6e 74 2b 38 2c 20 22 22 29 3b 0a 20  indent+8, "");. 
1eb30 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70       }else if( p
1eb40 49 74 65 6d 2d 3e 7a 4e 61 6d 65 20 29 7b 0a 20  Item->zName ){. 
1eb50 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 65         sqlite3De
1eb60 62 75 67 50 72 69 6e 74 66 28 22 25 73 22 2c 20  bugPrintf("%s", 
1eb70 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65 29 3b 0a 20  pItem->zName);. 
1eb80 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
1eb90 20 70 49 74 65 6d 2d 3e 70 54 61 62 20 29 7b 0a   pItem->pTab ){.
1eba0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 44          sqlite3D
1ebb0 65 62 75 67 50 72 69 6e 74 66 28 22 28 74 61 62  ebugPrintf("(tab
1ebc0 6c 65 3a 20 25 73 29 22 2c 20 70 49 74 65 6d 2d  le: %s)", pItem-
1ebd0 3e 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20  >pTab->zName);. 
1ebe0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
1ebf0 20 70 49 74 65 6d 2d 3e 7a 41 6c 69 61 73 20 29   pItem->zAlias )
1ec00 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
1ec10 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 20 41  3DebugPrintf(" A
1ec20 53 20 25 73 22 2c 20 70 49 74 65 6d 2d 3e 7a 41  S %s", pItem->zA
1ec30 6c 69 61 73 29 3b 0a 20 20 20 20 20 20 7d 0a 20  lias);.      }. 
1ec40 20 20 20 20 20 69 66 28 20 69 3c 70 2d 3e 70 53       if( i<p->pS
1ec50 72 63 2d 3e 6e 53 72 63 2d 31 20 29 7b 0a 20 20  rc->nSrc-1 ){.  
1ec60 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 65 62        sqlite3Deb
1ec70 75 67 50 72 69 6e 74 66 28 22 2c 22 29 3b 0a 20  ugPrintf(",");. 
1ec80 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c       }.      sql
1ec90 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28  ite3DebugPrintf(
1eca0 22 5c 6e 22 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  "\n");.    }.  }
1ecb0 0a 20 20 69 66 28 20 70 2d 3e 70 57 68 65 72 65  .  if( p->pWhere
1ecc0 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 44   ){.    sqlite3D
1ecd0 65 62 75 67 50 72 69 6e 74 66 28 22 25 2a 73 20  ebugPrintf("%*s 
1ece0 57 48 45 52 45 20 22 2c 20 69 6e 64 65 6e 74 2c  WHERE ", indent,
1ecf0 20 22 22 29 3b 0a 20 20 20 20 73 71 6c 69 74 65   "");.    sqlite
1ed00 33 50 72 69 6e 74 45 78 70 72 28 70 2d 3e 70 57  3PrintExpr(p->pW
1ed10 68 65 72 65 29 3b 0a 20 20 20 20 73 71 6c 69 74  here);.    sqlit
1ed20 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 5c  e3DebugPrintf("\
1ed30 6e 22 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  n");.  }.  if( p
1ed40 2d 3e 70 47 72 6f 75 70 42 79 20 29 7b 0a 20 20  ->pGroupBy ){.  
1ed50 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72    sqlite3DebugPr
1ed60 69 6e 74 66 28 22 25 2a 73 20 47 52 4f 55 50 20  intf("%*s GROUP 
1ed70 42 59 20 22 2c 20 69 6e 64 65 6e 74 2c 20 22 22  BY ", indent, ""
1ed80 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 50 72  );.    sqlite3Pr
1ed90 69 6e 74 45 78 70 72 4c 69 73 74 28 70 2d 3e 70  intExprList(p->p
1eda0 47 72 6f 75 70 42 79 29 3b 0a 20 20 20 20 73 71  GroupBy);.    sq
1edb0 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66  lite3DebugPrintf
1edc0 28 22 5c 6e 22 29 3b 0a 20 20 7d 0a 20 20 69 66  ("\n");.  }.  if
1edd0 28 20 70 2d 3e 70 48 61 76 69 6e 67 20 29 7b 0a  ( p->pHaving ){.
1ede0 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67      sqlite3Debug
1edf0 50 72 69 6e 74 66 28 22 25 2a 73 20 48 41 56 49  Printf("%*s HAVI
1ee00 4e 47 20 22 2c 20 69 6e 64 65 6e 74 2c 20 22 22  NG ", indent, ""
1ee10 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 50 72  );.    sqlite3Pr
1ee20 69 6e 74 45 78 70 72 28 70 2d 3e 70 48 61 76 69  intExpr(p->pHavi
1ee30 6e 67 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  ng);.    sqlite3
1ee40 44 65 62 75 67 50 72 69 6e 74 66 28 22 5c 6e 22  DebugPrintf("\n"
1ee50 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e  );.  }.  if( p->
1ee60 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20  pOrderBy ){.    
1ee70 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e  sqlite3DebugPrin
1ee80 74 66 28 22 25 2a 73 20 4f 52 44 45 52 20 42 59  tf("%*s ORDER BY
1ee90 20 22 2c 20 69 6e 64 65 6e 74 2c 20 22 22 29 3b   ", indent, "");
1eea0 0a 20 20 20 20 73 71 6c 69 74 65 33 50 72 69 6e  .    sqlite3Prin
1eeb0 74 45 78 70 72 4c 69 73 74 28 70 2d 3e 70 4f 72  tExprList(p->pOr
1eec0 64 65 72 42 79 29 3b 0a 20 20 20 20 73 71 6c 69  derBy);.    sqli
1eed0 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22  te3DebugPrintf("
1eee0 5c 6e 22 29 3b 0a 20 20 7d 0a 7d 0a 2f 2a 20 45  \n");.  }.}./* E
1eef0 6e 64 20 6f 66 20 74 68 65 20 73 74 72 75 63 74  nd of the struct
1ef00 75 72 65 20 64 65 62 75 67 20 70 72 69 6e 74 69  ure debug printi
1ef10 6e 67 20 63 6f 64 65 0a 2a 2a 2a 2a 2a 2a 2a 2a  ng code.********
1ef20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1ef30 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1ef40 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1ef50 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1ef60 2a 2a 2a 2a 2a 2f 0a 23 65 6e 64 69 66 20 2f 2a  *****/.#endif /*
1ef70 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f   defined(SQLITE_
1ef80 54 45 53 54 29 20 7c 7c 20 64 65 66 69 6e 65 64  TEST) || defined
1ef90 28 53 51 4c 49 54 45 5f 44 45 42 55 47 29 20 2a  (SQLITE_DEBUG) *
1efa0 2f 0a                                            /.