/ Hex Artifact Content
Login

Artifact 8393c47a170923f40602622bfa59b8e7cbff9027:


0000: 2f 2a 0a 2a 2a 20 32 30 30 31 20 53 65 70 74 65  /*.** 2001 Septe
0010: 6d 62 65 72 20 31 35 0a 2a 2a 0a 2a 2a 20 54 68  mber 15.**.** Th
0020: 65 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69  e author disclai
0030: 6d 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20  ms copyright to 
0040: 74 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65  this source code
0050: 2e 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a  .  In place of.*
0060: 2a 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65  * a legal notice
0070: 2c 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73  , here is a bles
0080: 73 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d  sing:.**.**    M
0090: 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61  ay you do good a
00a0: 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20  nd not evil..** 
00b0: 20 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20     May you find 
00c0: 66 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20  forgiveness for 
00d0: 79 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72  yourself and for
00e0: 67 69 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20  give others..** 
00f0: 20 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65     May you share
0100: 20 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74   freely, never t
0110: 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20  aking more than 
0120: 79 6f 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a  you give..**.***
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66  ******.** This f
0180: 69 6c 65 20 63 6f 6e 74 61 69 6e 73 20 43 20 63  ile contains C c
0190: 6f 64 65 20 72 6f 75 74 69 6e 65 73 20 74 68 61  ode routines tha
01a0: 74 20 61 72 65 20 63 61 6c 6c 65 64 20 62 79 20  t are called by 
01b0: 74 68 65 20 70 61 72 73 65 72 0a 2a 2a 20 74 6f  the parser.** to
01c0: 20 68 61 6e 64 6c 65 20 53 45 4c 45 43 54 20 73   handle SELECT s
01d0: 74 61 74 65 6d 65 6e 74 73 20 69 6e 20 53 51 4c  tatements in SQL
01e0: 69 74 65 2e 0a 2a 2a 0a 2a 2a 20 24 49 64 3a 20  ite..**.** $Id: 
01f0: 73 65 6c 65 63 74 2e 63 2c 76 20 31 2e 34 33 32  select.c,v 1.432
0200: 20 32 30 30 38 2f 30 36 2f 32 30 20 31 38 3a 31   2008/06/20 18:1
0210: 33 3a 32 35 20 64 72 68 20 45 78 70 20 24 0a 2a  3:25 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 72 65 67  rm;.  pDest->reg
04b0: 43 6f 72 6f 75 74 69 6e 65 20 3d 20 30 3b 0a 20  Coroutine = 0;. 
04c0: 20 70 44 65 73 74 2d 3e 61 66 66 69 6e 69 74 79   pDest->affinity
04d0: 20 3d 20 30 3b 0a 20 20 70 44 65 73 74 2d 3e 69   = 0;.  pDest->i
04e0: 4d 65 6d 20 3d 20 30 3b 0a 20 20 70 44 65 73 74  Mem = 0;.  pDest
04f0: 2d 3e 6e 4d 65 6d 20 3d 20 30 3b 0a 7d 0a 0a 0a  ->nMem = 0;.}...
0500: 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 61  /*.** Allocate a
0510: 20 6e 65 77 20 53 65 6c 65 63 74 20 73 74 72 75   new Select stru
0520: 63 74 75 72 65 20 61 6e 64 20 72 65 74 75 72 6e  cture and return
0530: 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68   a pointer to th
0540: 61 74 0a 2a 2a 20 73 74 72 75 63 74 75 72 65 2e  at.** structure.
0550: 0a 2a 2f 0a 53 65 6c 65 63 74 20 2a 73 71 6c 69  .*/.Select *sqli
0560: 74 65 33 53 65 6c 65 63 74 4e 65 77 28 0a 20 20  te3SelectNew(.  
0570: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
0580: 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67        /* Parsing
0590: 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78   context */.  Ex
05a0: 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 2c 20  prList *pEList, 
05b0: 20 20 20 20 2f 2a 20 77 68 69 63 68 20 63 6f 6c      /* which col
05c0: 75 6d 6e 73 20 74 6f 20 69 6e 63 6c 75 64 65 20  umns to include 
05d0: 69 6e 20 74 68 65 20 72 65 73 75 6c 74 20 2a 2f  in the result */
05e0: 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 53 72 63  .  SrcList *pSrc
05f0: 2c 20 20 20 20 20 20 20 20 2f 2a 20 74 68 65 20  ,        /* the 
0600: 46 52 4f 4d 20 63 6c 61 75 73 65 20 2d 2d 20 77  FROM clause -- w
0610: 68 69 63 68 20 74 61 62 6c 65 73 20 74 6f 20 73  hich tables to s
0620: 63 61 6e 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70  can */.  Expr *p
0630: 57 68 65 72 65 2c 20 20 20 20 20 20 20 20 20 2f  Where,         /
0640: 2a 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75  * the WHERE clau
0650: 73 65 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74  se */.  ExprList
0660: 20 2a 70 47 72 6f 75 70 42 79 2c 20 20 20 2f 2a   *pGroupBy,   /*
0670: 20 74 68 65 20 47 52 4f 55 50 20 42 59 20 63 6c   the GROUP BY cl
0680: 61 75 73 65 20 2a 2f 0a 20 20 45 78 70 72 20 2a  ause */.  Expr *
0690: 70 48 61 76 69 6e 67 2c 20 20 20 20 20 20 20 20  pHaving,        
06a0: 2f 2a 20 74 68 65 20 48 41 56 49 4e 47 20 63 6c  /* the HAVING cl
06b0: 61 75 73 65 20 2a 2f 0a 20 20 45 78 70 72 4c 69  ause */.  ExprLi
06c0: 73 74 20 2a 70 4f 72 64 65 72 42 79 2c 20 20 20  st *pOrderBy,   
06d0: 2f 2a 20 74 68 65 20 4f 52 44 45 52 20 42 59 20  /* the ORDER BY 
06e0: 63 6c 61 75 73 65 20 2a 2f 0a 20 20 69 6e 74 20  clause */.  int 
06f0: 69 73 44 69 73 74 69 6e 63 74 2c 20 20 20 20 20  isDistinct,     
0700: 20 20 2f 2a 20 74 72 75 65 20 69 66 20 74 68 65    /* true if the
0710: 20 44 49 53 54 49 4e 43 54 20 6b 65 79 77 6f 72   DISTINCT keywor
0720: 64 20 69 73 20 70 72 65 73 65 6e 74 20 2a 2f 0a  d is present */.
0730: 20 20 45 78 70 72 20 2a 70 4c 69 6d 69 74 2c 20    Expr *pLimit, 
0740: 20 20 20 20 20 20 20 20 2f 2a 20 4c 49 4d 49 54          /* LIMIT
0750: 20 76 61 6c 75 65 2e 20 20 4e 55 4c 4c 20 6d 65   value.  NULL me
0760: 61 6e 73 20 6e 6f 74 20 75 73 65 64 20 2a 2f 0a  ans not used */.
0770: 20 20 45 78 70 72 20 2a 70 4f 66 66 73 65 74 20    Expr *pOffset 
0780: 20 20 20 20 20 20 20 20 2f 2a 20 4f 46 46 53 45          /* OFFSE
0790: 54 20 76 61 6c 75 65 2e 20 20 4e 55 4c 4c 20 6d  T value.  NULL m
07a0: 65 61 6e 73 20 6e 6f 20 6f 66 66 73 65 74 20 2a  eans no offset *
07b0: 2f 0a 29 7b 0a 20 20 53 65 6c 65 63 74 20 2a 70  /.){.  Select *p
07c0: 4e 65 77 3b 0a 20 20 53 65 6c 65 63 74 20 73 74  New;.  Select st
07d0: 61 6e 64 69 6e 3b 0a 20 20 73 71 6c 69 74 65 33  andin;.  sqlite3
07e0: 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64   *db = pParse->d
07f0: 62 3b 0a 20 20 70 4e 65 77 20 3d 20 73 71 6c 69  b;.  pNew = sqli
0800: 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28  te3DbMallocZero(
0810: 64 62 2c 20 73 69 7a 65 6f 66 28 2a 70 4e 65 77  db, sizeof(*pNew
0820: 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 21  ) );.  assert( !
0830: 70 4f 66 66 73 65 74 20 7c 7c 20 70 4c 69 6d 69  pOffset || pLimi
0840: 74 20 29 3b 20 20 20 2f 2a 20 43 61 6e 27 74 20  t );   /* Can't 
0850: 68 61 76 65 20 4f 46 46 53 45 54 20 77 69 74 68  have OFFSET with
0860: 6f 75 74 20 4c 49 4d 49 54 2e 20 2a 2f 0a 20 20  out LIMIT. */.  
0870: 69 66 28 20 70 4e 65 77 3d 3d 30 20 29 7b 0a 20  if( pNew==0 ){. 
0880: 20 20 20 70 4e 65 77 20 3d 20 26 73 74 61 6e 64     pNew = &stand
0890: 69 6e 3b 0a 20 20 20 20 6d 65 6d 73 65 74 28 70  in;.    memset(p
08a0: 4e 65 77 2c 20 30 2c 20 73 69 7a 65 6f 66 28 2a  New, 0, sizeof(*
08b0: 70 4e 65 77 29 29 3b 0a 20 20 7d 0a 20 20 69 66  pNew));.  }.  if
08c0: 28 20 70 45 4c 69 73 74 3d 3d 30 20 29 7b 0a 20  ( pEList==0 ){. 
08d0: 20 20 20 70 45 4c 69 73 74 20 3d 20 73 71 6c 69     pEList = sqli
08e0: 74 65 33 45 78 70 72 4c 69 73 74 41 70 70 65 6e  te3ExprListAppen
08f0: 64 28 70 50 61 72 73 65 2c 20 30 2c 20 73 71 6c  d(pParse, 0, sql
0900: 69 74 65 33 45 78 70 72 28 64 62 2c 54 4b 5f 41  ite3Expr(db,TK_A
0910: 4c 4c 2c 30 2c 30 2c 30 29 2c 20 30 29 3b 0a 20  LL,0,0,0), 0);. 
0920: 20 7d 0a 20 20 70 4e 65 77 2d 3e 70 45 4c 69 73   }.  pNew->pELis
0930: 74 20 3d 20 70 45 4c 69 73 74 3b 0a 20 20 70 4e  t = pEList;.  pN
0940: 65 77 2d 3e 70 53 72 63 20 3d 20 70 53 72 63 3b  ew->pSrc = pSrc;
0950: 0a 20 20 70 4e 65 77 2d 3e 70 57 68 65 72 65 20  .  pNew->pWhere 
0960: 3d 20 70 57 68 65 72 65 3b 0a 20 20 70 4e 65 77  = pWhere;.  pNew
0970: 2d 3e 70 47 72 6f 75 70 42 79 20 3d 20 70 47 72  ->pGroupBy = pGr
0980: 6f 75 70 42 79 3b 0a 20 20 70 4e 65 77 2d 3e 70  oupBy;.  pNew->p
0990: 48 61 76 69 6e 67 20 3d 20 70 48 61 76 69 6e 67  Having = pHaving
09a0: 3b 0a 20 20 70 4e 65 77 2d 3e 70 4f 72 64 65 72  ;.  pNew->pOrder
09b0: 42 79 20 3d 20 70 4f 72 64 65 72 42 79 3b 0a 20  By = pOrderBy;. 
09c0: 20 70 4e 65 77 2d 3e 69 73 44 69 73 74 69 6e 63   pNew->isDistinc
09d0: 74 20 3d 20 69 73 44 69 73 74 69 6e 63 74 3b 0a  t = isDistinct;.
09e0: 20 20 70 4e 65 77 2d 3e 6f 70 20 3d 20 54 4b 5f    pNew->op = TK_
09f0: 53 45 4c 45 43 54 3b 0a 20 20 61 73 73 65 72 74  SELECT;.  assert
0a00: 28 20 70 4f 66 66 73 65 74 3d 3d 30 20 7c 7c 20  ( pOffset==0 || 
0a10: 70 4c 69 6d 69 74 21 3d 30 20 29 3b 0a 20 20 70  pLimit!=0 );.  p
0a20: 4e 65 77 2d 3e 70 4c 69 6d 69 74 20 3d 20 70 4c  New->pLimit = pL
0a30: 69 6d 69 74 3b 0a 20 20 70 4e 65 77 2d 3e 70 4f  imit;.  pNew->pO
0a40: 66 66 73 65 74 20 3d 20 70 4f 66 66 73 65 74 3b  ffset = pOffset;
0a50: 0a 20 20 70 4e 65 77 2d 3e 69 4c 69 6d 69 74 20  .  pNew->iLimit 
0a60: 3d 20 2d 31 3b 0a 20 20 70 4e 65 77 2d 3e 69 4f  = -1;.  pNew->iO
0a70: 66 66 73 65 74 20 3d 20 2d 31 3b 0a 20 20 70 4e  ffset = -1;.  pN
0a80: 65 77 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d  ew->addrOpenEphm
0a90: 5b 30 5d 20 3d 20 2d 31 3b 0a 20 20 70 4e 65 77  [0] = -1;.  pNew
0aa0: 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b 31  ->addrOpenEphm[1
0ab0: 5d 20 3d 20 2d 31 3b 0a 20 20 70 4e 65 77 2d 3e  ] = -1;.  pNew->
0ac0: 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b 32 5d 20  addrOpenEphm[2] 
0ad0: 3d 20 2d 31 3b 0a 20 20 69 66 28 20 70 4e 65 77  = -1;.  if( pNew
0ae0: 3d 3d 26 73 74 61 6e 64 69 6e 29 20 7b 0a 20 20  ==&standin) {.  
0af0: 20 20 63 6c 65 61 72 53 65 6c 65 63 74 28 70 4e    clearSelect(pN
0b00: 65 77 29 3b 0a 20 20 20 20 70 4e 65 77 20 3d 20  ew);.    pNew = 
0b10: 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  0;.  }.  return 
0b20: 70 4e 65 77 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44  pNew;.}../*.** D
0b30: 65 6c 65 74 65 20 74 68 65 20 67 69 76 65 6e 20  elete the given 
0b40: 53 65 6c 65 63 74 20 73 74 72 75 63 74 75 72 65  Select structure
0b50: 20 61 6e 64 20 61 6c 6c 20 6f 66 20 69 74 73 20   and all of its 
0b60: 73 75 62 73 74 72 75 63 74 75 72 65 73 2e 0a 2a  substructures..*
0b70: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 53 65  /.void sqlite3Se
0b80: 6c 65 63 74 44 65 6c 65 74 65 28 53 65 6c 65 63  lectDelete(Selec
0b90: 74 20 2a 70 29 7b 0a 20 20 69 66 28 20 70 20 29  t *p){.  if( p )
0ba0: 7b 0a 20 20 20 20 63 6c 65 61 72 53 65 6c 65 63  {.    clearSelec
0bb0: 74 28 70 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  t(p);.    sqlite
0bc0: 33 5f 66 72 65 65 28 70 29 3b 0a 20 20 7d 0a 7d  3_free(p);.  }.}
0bd0: 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20 31 20  ../*.** Given 1 
0be0: 74 6f 20 33 20 69 64 65 6e 74 69 66 69 65 72 73  to 3 identifiers
0bf0: 20 70 72 65 63 65 65 64 69 6e 67 20 74 68 65 20   preceeding the 
0c00: 4a 4f 49 4e 20 6b 65 79 77 6f 72 64 2c 20 64 65  JOIN keyword, de
0c10: 74 65 72 6d 69 6e 65 20 74 68 65 0a 2a 2a 20 74  termine the.** t
0c20: 79 70 65 20 6f 66 20 6a 6f 69 6e 2e 20 20 52 65  ype of join.  Re
0c30: 74 75 72 6e 20 61 6e 20 69 6e 74 65 67 65 72 20  turn an integer 
0c40: 63 6f 6e 73 74 61 6e 74 20 74 68 61 74 20 65 78  constant that ex
0c50: 70 72 65 73 73 65 73 20 74 68 61 74 20 74 79 70  presses that typ
0c60: 65 0a 2a 2a 20 69 6e 20 74 65 72 6d 73 20 6f 66  e.** in terms of
0c70: 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 62   the following b
0c80: 69 74 20 76 61 6c 75 65 73 3a 0a 2a 2a 0a 2a 2a  it values:.**.**
0c90: 20 20 20 20 20 4a 54 5f 49 4e 4e 45 52 0a 2a 2a       JT_INNER.**
0ca0: 20 20 20 20 20 4a 54 5f 43 52 4f 53 53 0a 2a 2a       JT_CROSS.**
0cb0: 20 20 20 20 20 4a 54 5f 4f 55 54 45 52 0a 2a 2a       JT_OUTER.**
0cc0: 20 20 20 20 20 4a 54 5f 4e 41 54 55 52 41 4c 0a       JT_NATURAL.
0cd0: 2a 2a 20 20 20 20 20 4a 54 5f 4c 45 46 54 0a 2a  **     JT_LEFT.*
0ce0: 2a 20 20 20 20 20 4a 54 5f 52 49 47 48 54 0a 2a  *     JT_RIGHT.*
0cf0: 2a 0a 2a 2a 20 41 20 66 75 6c 6c 20 6f 75 74 65  *.** A full oute
0d00: 72 20 6a 6f 69 6e 20 69 73 20 74 68 65 20 63 6f  r join is the co
0d10: 6d 62 69 6e 61 74 69 6f 6e 20 6f 66 20 4a 54 5f  mbination of JT_
0d20: 4c 45 46 54 20 61 6e 64 20 4a 54 5f 52 49 47 48  LEFT and JT_RIGH
0d30: 54 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 69  T..**.** If an i
0d40: 6c 6c 65 67 61 6c 20 6f 72 20 75 6e 73 75 70 70  llegal or unsupp
0d50: 6f 72 74 65 64 20 6a 6f 69 6e 20 74 79 70 65 20  orted join type 
0d60: 69 73 20 73 65 65 6e 2c 20 74 68 65 6e 20 73 74  is seen, then st
0d70: 69 6c 6c 20 72 65 74 75 72 6e 0a 2a 2a 20 61 20  ill return.** a 
0d80: 6a 6f 69 6e 20 74 79 70 65 2c 20 62 75 74 20 70  join type, but p
0d90: 75 74 20 61 6e 20 65 72 72 6f 72 20 69 6e 20 74  ut an error in t
0da0: 68 65 20 70 50 61 72 73 65 20 73 74 72 75 63 74  he pParse struct
0db0: 75 72 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ure..*/.int sqli
0dc0: 74 65 33 4a 6f 69 6e 54 79 70 65 28 50 61 72 73  te3JoinType(Pars
0dd0: 65 20 2a 70 50 61 72 73 65 2c 20 54 6f 6b 65 6e  e *pParse, Token
0de0: 20 2a 70 41 2c 20 54 6f 6b 65 6e 20 2a 70 42 2c   *pA, Token *pB,
0df0: 20 54 6f 6b 65 6e 20 2a 70 43 29 7b 0a 20 20 69   Token *pC){.  i
0e00: 6e 74 20 6a 6f 69 6e 74 79 70 65 20 3d 20 30 3b  nt jointype = 0;
0e10: 0a 20 20 54 6f 6b 65 6e 20 2a 61 70 41 6c 6c 5b  .  Token *apAll[
0e20: 33 5d 3b 0a 20 20 54 6f 6b 65 6e 20 2a 70 3b 0a  3];.  Token *p;.
0e30: 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 73    static const s
0e40: 74 72 75 63 74 20 7b 0a 20 20 20 20 63 6f 6e 73  truct {.    cons
0e50: 74 20 63 68 61 72 20 7a 4b 65 79 77 6f 72 64 5b  t char zKeyword[
0e60: 38 5d 3b 0a 20 20 20 20 75 38 20 6e 43 68 61 72  8];.    u8 nChar
0e70: 3b 0a 20 20 20 20 75 38 20 63 6f 64 65 3b 0a 20  ;.    u8 code;. 
0e80: 20 7d 20 6b 65 79 77 6f 72 64 73 5b 5d 20 3d 20   } keywords[] = 
0e90: 7b 0a 20 20 20 20 7b 20 22 6e 61 74 75 72 61 6c  {.    { "natural
0ea0: 22 2c 20 37 2c 20 4a 54 5f 4e 41 54 55 52 41 4c  ", 7, JT_NATURAL
0eb0: 20 7d 2c 0a 20 20 20 20 7b 20 22 6c 65 66 74 22   },.    { "left"
0ec0: 2c 20 20 20 20 34 2c 20 4a 54 5f 4c 45 46 54 7c  ,    4, JT_LEFT|
0ed0: 4a 54 5f 4f 55 54 45 52 20 7d 2c 0a 20 20 20 20  JT_OUTER },.    
0ee0: 7b 20 22 72 69 67 68 74 22 2c 20 20 20 35 2c 20  { "right",   5, 
0ef0: 4a 54 5f 52 49 47 48 54 7c 4a 54 5f 4f 55 54 45  JT_RIGHT|JT_OUTE
0f00: 52 20 7d 2c 0a 20 20 20 20 7b 20 22 66 75 6c 6c  R },.    { "full
0f10: 22 2c 20 20 20 20 34 2c 20 4a 54 5f 4c 45 46 54  ",    4, JT_LEFT
0f20: 7c 4a 54 5f 52 49 47 48 54 7c 4a 54 5f 4f 55 54  |JT_RIGHT|JT_OUT
0f30: 45 52 20 7d 2c 0a 20 20 20 20 7b 20 22 6f 75 74  ER },.    { "out
0f40: 65 72 22 2c 20 20 20 35 2c 20 4a 54 5f 4f 55 54  er",   5, JT_OUT
0f50: 45 52 20 7d 2c 0a 20 20 20 20 7b 20 22 69 6e 6e  ER },.    { "inn
0f60: 65 72 22 2c 20 20 20 35 2c 20 4a 54 5f 49 4e 4e  er",   5, JT_INN
0f70: 45 52 20 7d 2c 0a 20 20 20 20 7b 20 22 63 72 6f  ER },.    { "cro
0f80: 73 73 22 2c 20 20 20 35 2c 20 4a 54 5f 49 4e 4e  ss",   5, JT_INN
0f90: 45 52 7c 4a 54 5f 43 52 4f 53 53 20 7d 2c 0a 20  ER|JT_CROSS },. 
0fa0: 20 7d 3b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 0a   };.  int i, j;.
0fb0: 20 20 61 70 41 6c 6c 5b 30 5d 20 3d 20 70 41 3b    apAll[0] = pA;
0fc0: 0a 20 20 61 70 41 6c 6c 5b 31 5d 20 3d 20 70 42  .  apAll[1] = pB
0fd0: 3b 0a 20 20 61 70 41 6c 6c 5b 32 5d 20 3d 20 70  ;.  apAll[2] = p
0fe0: 43 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  C;.  for(i=0; i<
0ff0: 33 20 26 26 20 61 70 41 6c 6c 5b 69 5d 3b 20 69  3 && apAll[i]; i
1000: 2b 2b 29 7b 0a 20 20 20 20 70 20 3d 20 61 70 41  ++){.    p = apA
1010: 6c 6c 5b 69 5d 3b 0a 20 20 20 20 66 6f 72 28 6a  ll[i];.    for(j
1020: 3d 30 3b 20 6a 3c 73 69 7a 65 6f 66 28 6b 65 79  =0; j<sizeof(key
1030: 77 6f 72 64 73 29 2f 73 69 7a 65 6f 66 28 6b 65  words)/sizeof(ke
1040: 79 77 6f 72 64 73 5b 30 5d 29 3b 20 6a 2b 2b 29  ywords[0]); j++)
1050: 7b 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 6e  {.      if( p->n
1060: 3d 3d 6b 65 79 77 6f 72 64 73 5b 6a 5d 2e 6e 43  ==keywords[j].nC
1070: 68 61 72 20 0a 20 20 20 20 20 20 20 20 20 20 26  har .          &
1080: 26 20 73 71 6c 69 74 65 33 53 74 72 4e 49 43 6d  & sqlite3StrNICm
1090: 70 28 28 63 68 61 72 2a 29 70 2d 3e 7a 2c 20 6b  p((char*)p->z, k
10a0: 65 79 77 6f 72 64 73 5b 6a 5d 2e 7a 4b 65 79 77  eywords[j].zKeyw
10b0: 6f 72 64 2c 20 70 2d 3e 6e 29 3d 3d 30 20 29 7b  ord, p->n)==0 ){
10c0: 0a 20 20 20 20 20 20 20 20 6a 6f 69 6e 74 79 70  .        jointyp
10d0: 65 20 7c 3d 20 6b 65 79 77 6f 72 64 73 5b 6a 5d  e |= keywords[j]
10e0: 2e 63 6f 64 65 3b 0a 20 20 20 20 20 20 20 20 62  .code;.        b
10f0: 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  reak;.      }.  
1100: 20 20 7d 0a 20 20 20 20 69 66 28 20 6a 3e 3d 73    }.    if( j>=s
1110: 69 7a 65 6f 66 28 6b 65 79 77 6f 72 64 73 29 2f  izeof(keywords)/
1120: 73 69 7a 65 6f 66 28 6b 65 79 77 6f 72 64 73 5b  sizeof(keywords[
1130: 30 5d 29 20 29 7b 0a 20 20 20 20 20 20 6a 6f 69  0]) ){.      joi
1140: 6e 74 79 70 65 20 7c 3d 20 4a 54 5f 45 52 52 4f  ntype |= JT_ERRO
1150: 52 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  R;.      break;.
1160: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 0a      }.  }.  if(.
1170: 20 20 20 20 20 28 6a 6f 69 6e 74 79 70 65 20 26       (jointype &
1180: 20 28 4a 54 5f 49 4e 4e 45 52 7c 4a 54 5f 4f 55   (JT_INNER|JT_OU
1190: 54 45 52 29 29 3d 3d 28 4a 54 5f 49 4e 4e 45 52  TER))==(JT_INNER
11a0: 7c 4a 54 5f 4f 55 54 45 52 29 20 7c 7c 0a 20 20  |JT_OUTER) ||.  
11b0: 20 20 20 28 6a 6f 69 6e 74 79 70 65 20 26 20 4a     (jointype & J
11c0: 54 5f 45 52 52 4f 52 29 21 3d 30 0a 20 20 29 7b  T_ERROR)!=0.  ){
11d0: 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20  .    const char 
11e0: 2a 7a 53 70 31 20 3d 20 22 20 22 3b 0a 20 20 20  *zSp1 = " ";.   
11f0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 70   const char *zSp
1200: 32 20 3d 20 22 20 22 3b 0a 20 20 20 20 69 66 28  2 = " ";.    if(
1210: 20 70 42 3d 3d 30 20 29 7b 20 7a 53 70 31 2b 2b   pB==0 ){ zSp1++
1220: 3b 20 7d 0a 20 20 20 20 69 66 28 20 70 43 3d 3d  ; }.    if( pC==
1230: 30 20 29 7b 20 7a 53 70 32 2b 2b 3b 20 7d 0a 20  0 ){ zSp2++; }. 
1240: 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
1250: 73 67 28 70 50 61 72 73 65 2c 20 22 75 6e 6b 6e  sg(pParse, "unkn
1260: 6f 77 6e 20 6f 72 20 75 6e 73 75 70 70 6f 72 74  own or unsupport
1270: 65 64 20 6a 6f 69 6e 20 74 79 70 65 3a 20 22 0a  ed join type: ".
1280: 20 20 20 20 20 20 20 22 25 54 25 73 25 54 25 73         "%T%s%T%s
1290: 25 54 22 2c 20 70 41 2c 20 7a 53 70 31 2c 20 70  %T", pA, zSp1, p
12a0: 42 2c 20 7a 53 70 32 2c 20 70 43 29 3b 0a 20 20  B, zSp2, pC);.  
12b0: 20 20 6a 6f 69 6e 74 79 70 65 20 3d 20 4a 54 5f    jointype = JT_
12c0: 49 4e 4e 45 52 3b 0a 20 20 7d 65 6c 73 65 20 69  INNER;.  }else i
12d0: 66 28 20 6a 6f 69 6e 74 79 70 65 20 26 20 4a 54  f( jointype & JT
12e0: 5f 52 49 47 48 54 20 29 7b 0a 20 20 20 20 73 71  _RIGHT ){.    sq
12f0: 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
1300: 61 72 73 65 2c 20 0a 20 20 20 20 20 20 22 52 49  arse, .      "RI
1310: 47 48 54 20 61 6e 64 20 46 55 4c 4c 20 4f 55 54  GHT and FULL OUT
1320: 45 52 20 4a 4f 49 4e 73 20 61 72 65 20 6e 6f 74  ER JOINs are not
1330: 20 63 75 72 72 65 6e 74 6c 79 20 73 75 70 70 6f   currently suppo
1340: 72 74 65 64 22 29 3b 0a 20 20 20 20 6a 6f 69 6e  rted");.    join
1350: 74 79 70 65 20 3d 20 4a 54 5f 49 4e 4e 45 52 3b  type = JT_INNER;
1360: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 6a 6f  .  }.  return jo
1370: 69 6e 74 79 70 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  intype;.}../*.**
1380: 20 52 65 74 75 72 6e 20 74 68 65 20 69 6e 64 65   Return the inde
1390: 78 20 6f 66 20 61 20 63 6f 6c 75 6d 6e 20 69 6e  x of a column in
13a0: 20 61 20 74 61 62 6c 65 2e 20 20 52 65 74 75 72   a table.  Retur
13b0: 6e 20 2d 31 20 69 66 20 74 68 65 20 63 6f 6c 75  n -1 if the colu
13c0: 6d 6e 0a 2a 2a 20 69 73 20 6e 6f 74 20 63 6f 6e  mn.** is not con
13d0: 74 61 69 6e 65 64 20 69 6e 20 74 68 65 20 74 61  tained in the ta
13e0: 62 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ble..*/.static i
13f0: 6e 74 20 63 6f 6c 75 6d 6e 49 6e 64 65 78 28 54  nt columnIndex(T
1400: 61 62 6c 65 20 2a 70 54 61 62 2c 20 63 6f 6e 73  able *pTab, cons
1410: 74 20 63 68 61 72 20 2a 7a 43 6f 6c 29 7b 0a 20  t char *zCol){. 
1420: 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d   int i;.  for(i=
1430: 30 3b 20 69 3c 70 54 61 62 2d 3e 6e 43 6f 6c 3b  0; i<pTab->nCol;
1440: 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 73   i++){.    if( s
1450: 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 70 54  qlite3StrICmp(pT
1460: 61 62 2d 3e 61 43 6f 6c 5b 69 5d 2e 7a 4e 61 6d  ab->aCol[i].zNam
1470: 65 2c 20 7a 43 6f 6c 29 3d 3d 30 20 29 20 72 65  e, zCol)==0 ) re
1480: 74 75 72 6e 20 69 3b 0a 20 20 7d 0a 20 20 72 65  turn i;.  }.  re
1490: 74 75 72 6e 20 2d 31 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn -1;.}../*.*
14a0: 2a 20 53 65 74 20 74 68 65 20 76 61 6c 75 65 20  * Set the value 
14b0: 6f 66 20 61 20 74 6f 6b 65 6e 20 74 6f 20 61 20  of a token to a 
14c0: 27 5c 30 30 30 27 2d 74 65 72 6d 69 6e 61 74 65  '\000'-terminate
14d0: 64 20 73 74 72 69 6e 67 2e 0a 2a 2f 0a 73 74 61  d string..*/.sta
14e0: 74 69 63 20 76 6f 69 64 20 73 65 74 54 6f 6b 65  tic void setToke
14f0: 6e 28 54 6f 6b 65 6e 20 2a 70 2c 20 63 6f 6e 73  n(Token *p, cons
1500: 74 20 63 68 61 72 20 2a 7a 29 7b 0a 20 20 70 2d  t char *z){.  p-
1510: 3e 7a 20 3d 20 28 75 38 2a 29 7a 3b 0a 20 20 70  >z = (u8*)z;.  p
1520: 2d 3e 6e 20 3d 20 7a 20 3f 20 73 74 72 6c 65 6e  ->n = z ? strlen
1530: 28 7a 29 20 3a 20 30 3b 0a 20 20 70 2d 3e 64 79  (z) : 0;.  p->dy
1540: 6e 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  n = 0;.}../*.** 
1550: 53 65 74 20 74 68 65 20 74 6f 6b 65 6e 20 74 6f  Set the token to
1560: 20 74 68 65 20 64 6f 75 62 6c 65 2d 71 75 6f 74   the double-quot
1570: 65 64 20 61 6e 64 20 65 73 63 61 70 65 64 20 76  ed and escaped v
1580: 65 72 73 69 6f 6e 20 6f 66 20 74 68 65 20 73 74  ersion of the st
1590: 72 69 6e 67 20 70 6f 69 6e 74 65 64 0a 2a 2a 20  ring pointed.** 
15a0: 74 6f 20 62 79 20 7a 2e 20 46 6f 72 20 65 78 61  to by z. For exa
15b0: 6d 70 6c 65 3b 0a 2a 2a 0a 2a 2a 20 20 20 20 7b  mple;.**.**    {
15c0: 61 22 62 63 7d 20 20 2d 3e 20 20 7b 22 61 22 22  a"bc}  ->  {"a""
15d0: 62 63 22 7d 0a 2a 2f 0a 73 74 61 74 69 63 20 76  bc"}.*/.static v
15e0: 6f 69 64 20 73 65 74 51 75 6f 74 65 64 54 6f 6b  oid setQuotedTok
15f0: 65 6e 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  en(Parse *pParse
1600: 2c 20 54 6f 6b 65 6e 20 2a 70 2c 20 63 6f 6e 73  , Token *p, cons
1610: 74 20 63 68 61 72 20 2a 7a 29 7b 0a 0a 20 20 2f  t char *z){..  /
1620: 2a 20 43 68 65 63 6b 20 69 66 20 74 68 65 20 73  * Check if the s
1630: 74 72 69 6e 67 20 63 6f 6e 74 61 69 6e 73 20 61  tring contains a
1640: 6e 79 20 22 20 63 68 61 72 61 63 74 65 72 73 2e  ny " characters.
1650: 20 49 66 20 69 74 20 64 6f 65 73 2c 20 74 68 65   If it does, the
1660: 6e 0a 20 20 2a 2a 20 74 68 69 73 20 66 75 6e 63  n.  ** this func
1670: 74 69 6f 6e 20 77 69 6c 6c 20 6d 61 6c 6c 6f 63  tion will malloc
1680: 20 73 70 61 63 65 20 74 6f 20 63 72 65 61 74 65   space to create
1690: 20 61 20 71 75 6f 74 65 64 20 76 65 72 73 69 6f   a quoted versio
16a0: 6e 20 6f 66 0a 20 20 2a 2a 20 74 68 65 20 73 74  n of.  ** the st
16b0: 72 69 6e 67 20 69 6e 2e 20 4f 74 68 65 72 77 69  ring in. Otherwi
16c0: 73 65 2c 20 73 61 76 65 20 61 20 63 61 6c 6c 20  se, save a call 
16d0: 74 6f 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74  to sqlite3MPrint
16e0: 66 28 29 20 62 79 0a 20 20 2a 2a 20 6a 75 73 74  f() by.  ** just
16f0: 20 63 6f 70 79 69 6e 67 20 74 68 65 20 70 6f 69   copying the poi
1700: 6e 74 65 72 20 74 6f 20 74 68 65 20 73 74 72 69  nter to the stri
1710: 6e 67 2e 0a 20 20 2a 2f 0a 20 20 63 6f 6e 73 74  ng..  */.  const
1720: 20 63 68 61 72 20 2a 7a 32 20 3d 20 7a 3b 0a 20   char *z2 = z;. 
1730: 20 77 68 69 6c 65 28 20 2a 7a 32 20 29 7b 0a 20   while( *z2 ){. 
1740: 20 20 20 69 66 28 20 2a 7a 32 3d 3d 27 22 27 20     if( *z2=='"' 
1750: 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 7a 32 2b  ) break;.    z2+
1760: 2b 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 2a 7a  +;.  }..  if( *z
1770: 32 20 29 7b 0a 20 20 20 20 2f 2a 20 53 74 72 69  2 ){.    /* Stri
1780: 6e 67 20 63 6f 6e 74 61 69 6e 73 20 22 20 63 68  ng contains " ch
1790: 61 72 61 63 74 65 72 73 20 2d 20 63 6f 70 79 20  aracters - copy 
17a0: 61 6e 64 20 71 75 6f 74 65 20 74 68 65 20 73 74  and quote the st
17b0: 72 69 6e 67 2e 20 2a 2f 0a 20 20 20 20 70 2d 3e  ring. */.    p->
17c0: 7a 20 3d 20 28 75 38 20 2a 29 73 71 6c 69 74 65  z = (u8 *)sqlite
17d0: 33 4d 50 72 69 6e 74 66 28 70 50 61 72 73 65 2d  3MPrintf(pParse-
17e0: 3e 64 62 2c 20 22 5c 22 25 77 5c 22 22 2c 20 7a  >db, "\"%w\"", z
17f0: 29 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 7a 20  );.    if( p->z 
1800: 29 7b 0a 20 20 20 20 20 20 70 2d 3e 6e 20 3d 20  ){.      p->n = 
1810: 73 74 72 6c 65 6e 28 28 63 68 61 72 20 2a 29 70  strlen((char *)p
1820: 2d 3e 7a 29 3b 0a 20 20 20 20 20 20 70 2d 3e 64  ->z);.      p->d
1830: 79 6e 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20  yn = 1;.    }.  
1840: 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 53 74  }else{.    /* St
1850: 72 69 6e 67 20 63 6f 6e 74 61 69 6e 73 20 6e 6f  ring contains no
1860: 20 22 20 63 68 61 72 61 63 74 65 72 73 20 2d 20   " characters - 
1870: 63 6f 70 79 20 74 68 65 20 70 6f 69 6e 74 65 72  copy the pointer
1880: 2e 20 2a 2f 0a 20 20 20 20 70 2d 3e 7a 20 3d 20  . */.    p->z = 
1890: 28 75 38 2a 29 7a 3b 0a 20 20 20 20 70 2d 3e 6e  (u8*)z;.    p->n
18a0: 20 3d 20 28 7a 32 20 2d 20 7a 29 3b 0a 20 20 20   = (z2 - z);.   
18b0: 20 70 2d 3e 64 79 6e 20 3d 20 30 3b 0a 20 20 7d   p->dyn = 0;.  }
18c0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65  .}../*.** Create
18d0: 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 6e   an expression n
18e0: 6f 64 65 20 66 6f 72 20 61 6e 20 69 64 65 6e 74  ode for an ident
18f0: 69 66 69 65 72 20 77 69 74 68 20 74 68 65 20 6e  ifier with the n
1900: 61 6d 65 20 6f 66 20 7a 4e 61 6d 65 0a 2a 2f 0a  ame of zName.*/.
1910: 45 78 70 72 20 2a 73 71 6c 69 74 65 33 43 72 65  Expr *sqlite3Cre
1920: 61 74 65 49 64 45 78 70 72 28 50 61 72 73 65 20  ateIdExpr(Parse 
1930: 2a 70 50 61 72 73 65 2c 20 63 6f 6e 73 74 20 63  *pParse, const c
1940: 68 61 72 20 2a 7a 4e 61 6d 65 29 7b 0a 20 20 54  har *zName){.  T
1950: 6f 6b 65 6e 20 64 75 6d 6d 79 3b 0a 20 20 73 65  oken dummy;.  se
1960: 74 54 6f 6b 65 6e 28 26 64 75 6d 6d 79 2c 20 7a  tToken(&dummy, z
1970: 4e 61 6d 65 29 3b 0a 20 20 72 65 74 75 72 6e 20  Name);.  return 
1980: 73 71 6c 69 74 65 33 50 45 78 70 72 28 70 50 61  sqlite3PExpr(pPa
1990: 72 73 65 2c 20 54 4b 5f 49 44 2c 20 30 2c 20 30  rse, TK_ID, 0, 0
19a0: 2c 20 26 64 75 6d 6d 79 29 3b 0a 7d 0a 0a 2f 2a  , &dummy);.}../*
19b0: 0a 2a 2a 20 41 64 64 20 61 20 74 65 72 6d 20 74  .** Add a term t
19c0: 6f 20 74 68 65 20 57 48 45 52 45 20 65 78 70 72  o the WHERE expr
19d0: 65 73 73 69 6f 6e 20 69 6e 20 2a 70 70 45 78 70  ession in *ppExp
19e0: 72 20 74 68 61 74 20 72 65 71 75 69 72 65 73 20  r that requires 
19f0: 74 68 65 0a 2a 2a 20 7a 43 6f 6c 20 63 6f 6c 75  the.** zCol colu
1a00: 6d 6e 20 74 6f 20 62 65 20 65 71 75 61 6c 20 69  mn to be equal i
1a10: 6e 20 74 68 65 20 74 77 6f 20 74 61 62 6c 65 73  n the two tables
1a20: 20 70 54 61 62 31 20 61 6e 64 20 70 54 61 62 32   pTab1 and pTab2
1a30: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
1a40: 20 61 64 64 57 68 65 72 65 54 65 72 6d 28 0a 20   addWhereTerm(. 
1a50: 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
1a60: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72            /* Par
1a70: 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  sing context */.
1a80: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43    const char *zC
1a90: 6f 6c 2c 20 20 20 20 20 20 20 20 2f 2a 20 4e 61  ol,        /* Na
1aa0: 6d 65 20 6f 66 20 74 68 65 20 63 6f 6c 75 6d 6e  me of the column
1ab0: 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 54 61 62 6c   */.  const Tabl
1ac0: 65 20 2a 70 54 61 62 31 2c 20 20 20 20 20 20 2f  e *pTab1,      /
1ad0: 2a 20 46 69 72 73 74 20 74 61 62 6c 65 20 2a 2f  * First table */
1ae0: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
1af0: 41 6c 69 61 73 31 2c 20 20 20 20 20 2f 2a 20 41  Alias1,     /* A
1b00: 6c 69 61 73 20 66 6f 72 20 66 69 72 73 74 20 74  lias for first t
1b10: 61 62 6c 65 2e 20 20 4d 61 79 20 62 65 20 4e 55  able.  May be NU
1b20: 4c 4c 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 54 61  LL */.  const Ta
1b30: 62 6c 65 20 2a 70 54 61 62 32 2c 20 20 20 20 20  ble *pTab2,     
1b40: 20 2f 2a 20 53 65 63 6f 6e 64 20 74 61 62 6c 65   /* Second table
1b50: 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72   */.  const char
1b60: 20 2a 7a 41 6c 69 61 73 32 2c 20 20 20 20 20 2f   *zAlias2,     /
1b70: 2a 20 41 6c 69 61 73 20 66 6f 72 20 73 65 63 6f  * Alias for seco
1b80: 6e 64 20 74 61 62 6c 65 2e 20 20 4d 61 79 20 62  nd table.  May b
1b90: 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20 69 6e 74 20  e NULL */.  int 
1ba0: 69 52 69 67 68 74 4a 6f 69 6e 54 61 62 6c 65 2c  iRightJoinTable,
1bb0: 20 20 20 20 20 2f 2a 20 56 44 42 45 20 63 75 72       /* VDBE cur
1bc0: 73 6f 72 20 66 6f 72 20 74 68 65 20 72 69 67 68  sor for the righ
1bd0: 74 20 74 61 62 6c 65 20 2a 2f 0a 20 20 45 78 70  t table */.  Exp
1be0: 72 20 2a 2a 70 70 45 78 70 72 2c 20 20 20 20 20  r **ppExpr,     
1bf0: 20 20 20 20 20 20 2f 2a 20 41 64 64 20 74 68 65        /* Add the
1c00: 20 65 71 75 61 6c 69 74 79 20 74 65 72 6d 20 74   equality term t
1c10: 6f 20 74 68 69 73 20 65 78 70 72 65 73 73 69 6f  o this expressio
1c20: 6e 20 2a 2f 0a 20 20 69 6e 74 20 69 73 4f 75 74  n */.  int isOut
1c30: 65 72 4a 6f 69 6e 20 20 20 20 20 20 20 20 20 20  erJoin          
1c40: 2f 2a 20 54 72 75 65 20 69 66 20 64 65 61 6c 69  /* True if deali
1c50: 6e 67 20 77 69 74 68 20 61 6e 20 4f 55 54 45 52  ng with an OUTER
1c60: 20 6a 6f 69 6e 20 2a 2f 0a 29 7b 0a 20 20 45 78   join */.){.  Ex
1c70: 70 72 20 2a 70 45 31 61 2c 20 2a 70 45 31 62 2c  pr *pE1a, *pE1b,
1c80: 20 2a 70 45 31 63 3b 0a 20 20 45 78 70 72 20 2a   *pE1c;.  Expr *
1c90: 70 45 32 61 2c 20 2a 70 45 32 62 2c 20 2a 70 45  pE2a, *pE2b, *pE
1ca0: 32 63 3b 0a 20 20 45 78 70 72 20 2a 70 45 3b 0a  2c;.  Expr *pE;.
1cb0: 0a 20 20 70 45 31 61 20 3d 20 73 71 6c 69 74 65  .  pE1a = sqlite
1cc0: 33 43 72 65 61 74 65 49 64 45 78 70 72 28 70 50  3CreateIdExpr(pP
1cd0: 61 72 73 65 2c 20 7a 43 6f 6c 29 3b 0a 20 20 70  arse, zCol);.  p
1ce0: 45 32 61 20 3d 20 73 71 6c 69 74 65 33 43 72 65  E2a = sqlite3Cre
1cf0: 61 74 65 49 64 45 78 70 72 28 70 50 61 72 73 65  ateIdExpr(pParse
1d00: 2c 20 7a 43 6f 6c 29 3b 0a 20 20 69 66 28 20 7a  , zCol);.  if( z
1d10: 41 6c 69 61 73 31 3d 3d 30 20 29 7b 0a 20 20 20  Alias1==0 ){.   
1d20: 20 7a 41 6c 69 61 73 31 20 3d 20 70 54 61 62 31   zAlias1 = pTab1
1d30: 2d 3e 7a 4e 61 6d 65 3b 0a 20 20 7d 0a 20 20 70  ->zName;.  }.  p
1d40: 45 31 62 20 3d 20 73 71 6c 69 74 65 33 43 72 65  E1b = sqlite3Cre
1d50: 61 74 65 49 64 45 78 70 72 28 70 50 61 72 73 65  ateIdExpr(pParse
1d60: 2c 20 7a 41 6c 69 61 73 31 29 3b 0a 20 20 69 66  , zAlias1);.  if
1d70: 28 20 7a 41 6c 69 61 73 32 3d 3d 30 20 29 7b 0a  ( zAlias2==0 ){.
1d80: 20 20 20 20 7a 41 6c 69 61 73 32 20 3d 20 70 54      zAlias2 = pT
1d90: 61 62 32 2d 3e 7a 4e 61 6d 65 3b 0a 20 20 7d 0a  ab2->zName;.  }.
1da0: 20 20 70 45 32 62 20 3d 20 73 71 6c 69 74 65 33    pE2b = sqlite3
1db0: 43 72 65 61 74 65 49 64 45 78 70 72 28 70 50 61  CreateIdExpr(pPa
1dc0: 72 73 65 2c 20 7a 41 6c 69 61 73 32 29 3b 0a 20  rse, zAlias2);. 
1dd0: 20 70 45 31 63 20 3d 20 73 71 6c 69 74 65 33 50   pE1c = sqlite3P
1de0: 45 78 70 72 28 70 50 61 72 73 65 2c 20 54 4b 5f  Expr(pParse, TK_
1df0: 44 4f 54 2c 20 70 45 31 62 2c 20 70 45 31 61 2c  DOT, pE1b, pE1a,
1e00: 20 30 29 3b 0a 20 20 70 45 32 63 20 3d 20 73 71   0);.  pE2c = sq
1e10: 6c 69 74 65 33 50 45 78 70 72 28 70 50 61 72 73  lite3PExpr(pPars
1e20: 65 2c 20 54 4b 5f 44 4f 54 2c 20 70 45 32 62 2c  e, TK_DOT, pE2b,
1e30: 20 70 45 32 61 2c 20 30 29 3b 0a 20 20 70 45 20   pE2a, 0);.  pE 
1e40: 3d 20 73 71 6c 69 74 65 33 50 45 78 70 72 28 70  = sqlite3PExpr(p
1e50: 50 61 72 73 65 2c 20 54 4b 5f 45 51 2c 20 70 45  Parse, TK_EQ, pE
1e60: 31 63 2c 20 70 45 32 63 2c 20 30 29 3b 0a 20 20  1c, pE2c, 0);.  
1e70: 69 66 28 20 70 45 20 26 26 20 69 73 4f 75 74 65  if( pE && isOute
1e80: 72 4a 6f 69 6e 20 29 7b 0a 20 20 20 20 45 78 70  rJoin ){.    Exp
1e90: 72 53 65 74 50 72 6f 70 65 72 74 79 28 70 45 2c  rSetProperty(pE,
1ea0: 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29 3b 0a 20   EP_FromJoin);. 
1eb0: 20 20 20 70 45 2d 3e 69 52 69 67 68 74 4a 6f 69     pE->iRightJoi
1ec0: 6e 54 61 62 6c 65 20 3d 20 69 52 69 67 68 74 4a  nTable = iRightJ
1ed0: 6f 69 6e 54 61 62 6c 65 3b 0a 20 20 7d 0a 20 20  oinTable;.  }.  
1ee0: 2a 70 70 45 78 70 72 20 3d 20 73 71 6c 69 74 65  *ppExpr = sqlite
1ef0: 33 45 78 70 72 41 6e 64 28 70 50 61 72 73 65 2d  3ExprAnd(pParse-
1f00: 3e 64 62 2c 2a 70 70 45 78 70 72 2c 20 70 45 29  >db,*ppExpr, pE)
1f10: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74  ;.}../*.** Set t
1f20: 68 65 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 20 70  he EP_FromJoin p
1f30: 72 6f 70 65 72 74 79 20 6f 6e 20 61 6c 6c 20 74  roperty on all t
1f40: 65 72 6d 73 20 6f 66 20 74 68 65 20 67 69 76 65  erms of the give
1f50: 6e 20 65 78 70 72 65 73 73 69 6f 6e 2e 0a 2a 2a  n expression..**
1f60: 20 41 6e 64 20 73 65 74 20 74 68 65 20 45 78 70   And set the Exp
1f70: 72 2e 69 52 69 67 68 74 4a 6f 69 6e 54 61 62 6c  r.iRightJoinTabl
1f80: 65 20 74 6f 20 69 54 61 62 6c 65 20 66 6f 72 20  e to iTable for 
1f90: 65 76 65 72 79 20 74 65 72 6d 20 69 6e 20 74 68  every term in th
1fa0: 65 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 2e  e.** expression.
1fb0: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 45 50 5f 46 72  .**.** The EP_Fr
1fc0: 6f 6d 4a 6f 69 6e 20 70 72 6f 70 65 72 74 79 20  omJoin property 
1fd0: 69 73 20 75 73 65 64 20 6f 6e 20 74 65 72 6d 73  is used on terms
1fe0: 20 6f 66 20 61 6e 20 65 78 70 72 65 73 73 69 6f   of an expressio
1ff0: 6e 20 74 6f 20 74 65 6c 6c 0a 2a 2a 20 74 68 65  n to tell.** the
2000: 20 4c 45 46 54 20 4f 55 54 45 52 20 4a 4f 49 4e   LEFT OUTER JOIN
2010: 20 70 72 6f 63 65 73 73 69 6e 67 20 6c 6f 67 69   processing logi
2020: 63 20 74 68 61 74 20 74 68 69 73 20 74 65 72 6d  c that this term
2030: 20 69 73 20 70 61 72 74 20 6f 66 20 74 68 65 0a   is part of the.
2040: 2a 2a 20 6a 6f 69 6e 20 72 65 73 74 72 69 63 74  ** join restrict
2050: 69 6f 6e 20 73 70 65 63 69 66 69 65 64 20 69 6e  ion specified in
2060: 20 74 68 65 20 4f 4e 20 6f 72 20 55 53 49 4e 47   the ON or USING
2070: 20 63 6c 61 75 73 65 20 61 6e 64 20 6e 6f 74 20   clause and not 
2080: 61 20 70 61 72 74 0a 2a 2a 20 6f 66 20 74 68 65  a part.** of the
2090: 20 6d 6f 72 65 20 67 65 6e 65 72 61 6c 20 57 48   more general WH
20a0: 45 52 45 20 63 6c 61 75 73 65 2e 20 20 54 68 65  ERE clause.  The
20b0: 73 65 20 74 65 72 6d 73 20 61 72 65 20 6d 6f 76  se terms are mov
20c0: 65 64 20 6f 76 65 72 20 74 6f 20 74 68 65 0a 2a  ed over to the.*
20d0: 2a 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 64  * WHERE clause d
20e0: 75 72 69 6e 67 20 6a 6f 69 6e 20 70 72 6f 63 65  uring join proce
20f0: 73 73 69 6e 67 20 62 75 74 20 77 65 20 6e 65 65  ssing but we nee
2100: 64 20 74 6f 20 72 65 6d 65 6d 62 65 72 20 74 68  d to remember th
2110: 61 74 20 74 68 65 79 0a 2a 2a 20 6f 72 69 67 69  at they.** origi
2120: 6e 61 74 65 64 20 69 6e 20 74 68 65 20 4f 4e 20  nated in the ON 
2130: 6f 72 20 55 53 49 4e 47 20 63 6c 61 75 73 65 2e  or USING clause.
2140: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 45 78 70 72 2e  .**.** The Expr.
2150: 69 52 69 67 68 74 4a 6f 69 6e 54 61 62 6c 65 20  iRightJoinTable 
2160: 74 65 6c 6c 73 20 74 68 65 20 57 48 45 52 45 20  tells the WHERE 
2170: 63 6c 61 75 73 65 20 70 72 6f 63 65 73 73 69 6e  clause processin
2180: 67 20 74 68 61 74 20 74 68 65 0a 2a 2a 20 65 78  g that the.** ex
2190: 70 72 65 73 73 69 6f 6e 20 64 65 70 65 6e 64 73  pression depends
21a0: 20 6f 6e 20 74 61 62 6c 65 20 69 52 69 67 68 74   on table iRight
21b0: 4a 6f 69 6e 54 61 62 6c 65 20 65 76 65 6e 20 69  JoinTable even i
21c0: 66 20 74 68 61 74 20 74 61 62 6c 65 20 69 73 20  f that table is 
21d0: 6e 6f 74 0a 2a 2a 20 65 78 70 6c 69 63 69 74 6c  not.** explicitl
21e0: 79 20 6d 65 6e 74 69 6f 6e 65 64 20 69 6e 20 74  y mentioned in t
21f0: 68 65 20 65 78 70 72 65 73 73 69 6f 6e 2e 20 20  he expression.  
2200: 54 68 61 74 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  That information
2210: 20 69 73 20 6e 65 65 64 65 64 0a 2a 2a 20 66 6f   is needed.** fo
2220: 72 20 63 61 73 65 73 20 6c 69 6b 65 20 74 68 69  r cases like thi
2230: 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 53 45 4c 45  s:.**.**    SELE
2240: 43 54 20 2a 20 46 52 4f 4d 20 74 31 20 4c 45 46  CT * FROM t1 LEF
2250: 54 20 4a 4f 49 4e 20 74 32 20 4f 4e 20 74 31 2e  T JOIN t2 ON t1.
2260: 61 3d 74 32 2e 62 20 41 4e 44 20 74 31 2e 78 3d  a=t2.b AND t1.x=
2270: 35 0a 2a 2a 0a 2a 2a 20 54 68 65 20 77 68 65 72  5.**.** The wher
2280: 65 20 63 6c 61 75 73 65 20 6e 65 65 64 73 20 74  e clause needs t
2290: 6f 20 64 65 66 65 72 20 74 68 65 20 68 61 6e 64  o defer the hand
22a0: 6c 69 6e 67 20 6f 66 20 74 68 65 20 74 31 2e 78  ling of the t1.x
22b0: 3d 35 0a 2a 2a 20 74 65 72 6d 20 75 6e 74 69 6c  =5.** term until
22c0: 20 61 66 74 65 72 20 74 68 65 20 74 32 20 6c 6f   after the t2 lo
22d0: 6f 70 20 6f 66 20 74 68 65 20 6a 6f 69 6e 2e 20  op of the join. 
22e0: 20 49 6e 20 74 68 61 74 20 77 61 79 2c 20 61 0a   In that way, a.
22f0: 2a 2a 20 4e 55 4c 4c 20 74 32 20 72 6f 77 20 77  ** NULL t2 row w
2300: 69 6c 6c 20 62 65 20 69 6e 73 65 72 74 65 64 20  ill be inserted 
2310: 77 68 65 6e 65 76 65 72 20 74 31 2e 78 21 3d 35  whenever t1.x!=5
2320: 2e 20 20 49 66 20 77 65 20 64 6f 20 6e 6f 74 0a  .  If we do not.
2330: 2a 2a 20 64 65 66 65 72 20 74 68 65 20 68 61 6e  ** defer the han
2340: 64 6c 69 6e 67 20 6f 66 20 74 31 2e 78 3d 35 2c  dling of t1.x=5,
2350: 20 69 74 20 77 69 6c 6c 20 62 65 20 70 72 6f 63   it will be proc
2360: 65 73 73 65 64 20 69 6d 6d 65 64 69 61 74 65 6c  essed immediatel
2370: 79 0a 2a 2a 20 61 66 74 65 72 20 74 68 65 20 74  y.** after the t
2380: 31 20 6c 6f 6f 70 20 61 6e 64 20 72 6f 77 73 20  1 loop and rows 
2390: 77 69 74 68 20 74 31 2e 78 21 3d 35 20 77 69 6c  with t1.x!=5 wil
23a0: 6c 20 6e 65 76 65 72 20 61 70 70 65 61 72 20 69  l never appear i
23b0: 6e 0a 2a 2a 20 74 68 65 20 6f 75 74 70 75 74 2c  n.** the output,
23c0: 20 77 68 69 63 68 20 69 73 20 69 6e 63 6f 72 72   which is incorr
23d0: 65 63 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ect..*/.static v
23e0: 6f 69 64 20 73 65 74 4a 6f 69 6e 45 78 70 72 28  oid setJoinExpr(
23f0: 45 78 70 72 20 2a 70 2c 20 69 6e 74 20 69 54 61  Expr *p, int iTa
2400: 62 6c 65 29 7b 0a 20 20 77 68 69 6c 65 28 20 70  ble){.  while( p
2410: 20 29 7b 0a 20 20 20 20 45 78 70 72 53 65 74 50   ){.    ExprSetP
2420: 72 6f 70 65 72 74 79 28 70 2c 20 45 50 5f 46 72  roperty(p, EP_Fr
2430: 6f 6d 4a 6f 69 6e 29 3b 0a 20 20 20 20 70 2d 3e  omJoin);.    p->
2440: 69 52 69 67 68 74 4a 6f 69 6e 54 61 62 6c 65 20  iRightJoinTable 
2450: 3d 20 69 54 61 62 6c 65 3b 0a 20 20 20 20 73 65  = iTable;.    se
2460: 74 4a 6f 69 6e 45 78 70 72 28 70 2d 3e 70 4c 65  tJoinExpr(p->pLe
2470: 66 74 2c 20 69 54 61 62 6c 65 29 3b 0a 20 20 20  ft, iTable);.   
2480: 20 70 20 3d 20 70 2d 3e 70 52 69 67 68 74 3b 0a   p = p->pRight;.
2490: 20 20 7d 20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68    } .}../*.** Th
24a0: 69 73 20 72 6f 75 74 69 6e 65 20 70 72 6f 63 65  is routine proce
24b0: 73 73 65 73 20 74 68 65 20 6a 6f 69 6e 20 69 6e  sses the join in
24c0: 66 6f 72 6d 61 74 69 6f 6e 20 66 6f 72 20 61 20  formation for a 
24d0: 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
24e0: 2e 0a 2a 2a 20 4f 4e 20 61 6e 64 20 55 53 49 4e  ..** ON and USIN
24f0: 47 20 63 6c 61 75 73 65 73 20 61 72 65 20 63 6f  G clauses are co
2500: 6e 76 65 72 74 65 64 20 69 6e 74 6f 20 65 78 74  nverted into ext
2510: 72 61 20 74 65 72 6d 73 20 6f 66 20 74 68 65 20  ra terms of the 
2520: 57 48 45 52 45 20 63 6c 61 75 73 65 2e 0a 2a 2a  WHERE clause..**
2530: 20 4e 41 54 55 52 41 4c 20 6a 6f 69 6e 73 20 61   NATURAL joins a
2540: 6c 73 6f 20 63 72 65 61 74 65 20 65 78 74 72 61  lso create extra
2550: 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 74 65   WHERE clause te
2560: 72 6d 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 74  rms..**.** The t
2570: 65 72 6d 73 20 6f 66 20 61 20 46 52 4f 4d 20 63  erms of a FROM c
2580: 6c 61 75 73 65 20 61 72 65 20 63 6f 6e 74 61 69  lause are contai
2590: 6e 65 64 20 69 6e 20 74 68 65 20 53 65 6c 65 63  ned in the Selec
25a0: 74 2e 70 53 72 63 20 73 74 72 75 63 74 75 72 65  t.pSrc structure
25b0: 2e 0a 2a 2a 20 54 68 65 20 6c 65 66 74 20 6d 6f  ..** The left mo
25c0: 73 74 20 74 61 62 6c 65 20 69 73 20 74 68 65 20  st table is the 
25d0: 66 69 72 73 74 20 65 6e 74 72 79 20 69 6e 20 53  first entry in S
25e0: 65 6c 65 63 74 2e 70 53 72 63 2e 20 20 54 68 65  elect.pSrc.  The
25f0: 20 72 69 67 68 74 2d 6d 6f 73 74 0a 2a 2a 20 74   right-most.** t
2600: 61 62 6c 65 20 69 73 20 74 68 65 20 6c 61 73 74  able is the last
2610: 20 65 6e 74 72 79 2e 20 20 54 68 65 20 6a 6f 69   entry.  The joi
2620: 6e 20 6f 70 65 72 61 74 6f 72 20 69 73 20 68 65  n operator is he
2630: 6c 64 20 69 6e 20 74 68 65 20 65 6e 74 72 79 20  ld in the entry 
2640: 74 6f 0a 2a 2a 20 74 68 65 20 6c 65 66 74 2e 20  to.** the left. 
2650: 20 54 68 75 73 20 65 6e 74 72 79 20 30 20 63 6f   Thus entry 0 co
2660: 6e 74 61 69 6e 73 20 74 68 65 20 6a 6f 69 6e 20  ntains the join 
2670: 6f 70 65 72 61 74 6f 72 20 66 6f 72 20 74 68 65  operator for the
2680: 20 6a 6f 69 6e 20 62 65 74 77 65 65 6e 0a 2a 2a   join between.**
2690: 20 65 6e 74 72 69 65 73 20 30 20 61 6e 64 20 31   entries 0 and 1
26a0: 2e 20 20 41 6e 79 20 4f 4e 20 6f 72 20 55 53 49  .  Any ON or USI
26b0: 4e 47 20 63 6c 61 75 73 65 73 20 61 73 73 6f 63  NG clauses assoc
26c0: 69 61 74 65 64 20 77 69 74 68 20 74 68 65 20 6a  iated with the j
26d0: 6f 69 6e 20 61 72 65 0a 2a 2a 20 61 6c 73 6f 20  oin are.** also 
26e0: 61 74 74 61 63 68 65 64 20 74 6f 20 74 68 65 20  attached to the 
26f0: 6c 65 66 74 20 65 6e 74 72 79 2e 0a 2a 2a 0a 2a  left entry..**.*
2700: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 72  * This routine r
2710: 65 74 75 72 6e 73 20 74 68 65 20 6e 75 6d 62 65  eturns the numbe
2720: 72 20 6f 66 20 65 72 72 6f 72 73 20 65 6e 63 6f  r of errors enco
2730: 75 6e 74 65 72 65 64 2e 0a 2a 2f 0a 73 74 61 74  untered..*/.stat
2740: 69 63 20 69 6e 74 20 73 71 6c 69 74 65 50 72 6f  ic int sqlitePro
2750: 63 65 73 73 4a 6f 69 6e 28 50 61 72 73 65 20 2a  cessJoin(Parse *
2760: 70 50 61 72 73 65 2c 20 53 65 6c 65 63 74 20 2a  pParse, Select *
2770: 70 29 7b 0a 20 20 53 72 63 4c 69 73 74 20 2a 70  p){.  SrcList *p
2780: 53 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20  Src;            
2790: 20 20 20 20 20 20 2f 2a 20 41 6c 6c 20 74 61 62        /* All tab
27a0: 6c 65 73 20 69 6e 20 74 68 65 20 46 52 4f 4d 20  les in the FROM 
27b0: 63 6c 61 75 73 65 20 2a 2f 0a 20 20 69 6e 74 20  clause */.  int 
27c0: 69 2c 20 6a 3b 20 20 20 20 20 20 20 20 20 20 20  i, j;           
27d0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
27e0: 6f 6f 70 20 63 6f 75 6e 74 65 72 73 20 2a 2f 0a  oop counters */.
27f0: 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74    struct SrcList
2800: 5f 69 74 65 6d 20 2a 70 4c 65 66 74 3b 20 20 20  _item *pLeft;   
2810: 20 20 2f 2a 20 4c 65 66 74 20 74 61 62 6c 65 20    /* Left table 
2820: 62 65 69 6e 67 20 6a 6f 69 6e 65 64 20 2a 2f 0a  being joined */.
2830: 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74    struct SrcList
2840: 5f 69 74 65 6d 20 2a 70 52 69 67 68 74 3b 20 20  _item *pRight;  
2850: 20 20 2f 2a 20 52 69 67 68 74 20 74 61 62 6c 65    /* Right table
2860: 20 62 65 69 6e 67 20 6a 6f 69 6e 65 64 20 2a 2f   being joined */
2870: 0a 0a 20 20 70 53 72 63 20 3d 20 70 2d 3e 70 53  ..  pSrc = p->pS
2880: 72 63 3b 0a 20 20 70 4c 65 66 74 20 3d 20 26 70  rc;.  pLeft = &p
2890: 53 72 63 2d 3e 61 5b 30 5d 3b 0a 20 20 70 52 69  Src->a[0];.  pRi
28a0: 67 68 74 20 3d 20 26 70 4c 65 66 74 5b 31 5d 3b  ght = &pLeft[1];
28b0: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 53  .  for(i=0; i<pS
28c0: 72 63 2d 3e 6e 53 72 63 2d 31 3b 20 69 2b 2b 2c  rc->nSrc-1; i++,
28d0: 20 70 52 69 67 68 74 2b 2b 2c 20 70 4c 65 66 74   pRight++, pLeft
28e0: 2b 2b 29 7b 0a 20 20 20 20 54 61 62 6c 65 20 2a  ++){.    Table *
28f0: 70 4c 65 66 74 54 61 62 20 3d 20 70 4c 65 66 74  pLeftTab = pLeft
2900: 2d 3e 70 54 61 62 3b 0a 20 20 20 20 54 61 62 6c  ->pTab;.    Tabl
2910: 65 20 2a 70 52 69 67 68 74 54 61 62 20 3d 20 70  e *pRightTab = p
2920: 52 69 67 68 74 2d 3e 70 54 61 62 3b 0a 20 20 20  Right->pTab;.   
2930: 20 69 6e 74 20 69 73 4f 75 74 65 72 3b 0a 0a 20   int isOuter;.. 
2940: 20 20 20 69 66 28 20 70 4c 65 66 74 54 61 62 3d     if( pLeftTab=
2950: 3d 30 20 7c 7c 20 70 52 69 67 68 74 54 61 62 3d  =0 || pRightTab=
2960: 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  =0 ) continue;. 
2970: 20 20 20 69 73 4f 75 74 65 72 20 3d 20 28 70 52     isOuter = (pR
2980: 69 67 68 74 2d 3e 6a 6f 69 6e 74 79 70 65 20 26  ight->jointype &
2990: 20 4a 54 5f 4f 55 54 45 52 29 21 3d 30 3b 0a 0a   JT_OUTER)!=0;..
29a0: 20 20 20 20 2f 2a 20 57 68 65 6e 20 74 68 65 20      /* When the 
29b0: 4e 41 54 55 52 41 4c 20 6b 65 79 77 6f 72 64 20  NATURAL keyword 
29c0: 69 73 20 70 72 65 73 65 6e 74 2c 20 61 64 64 20  is present, add 
29d0: 57 48 45 52 45 20 63 6c 61 75 73 65 20 74 65 72  WHERE clause ter
29e0: 6d 73 20 66 6f 72 0a 20 20 20 20 2a 2a 20 65 76  ms for.    ** ev
29f0: 65 72 79 20 63 6f 6c 75 6d 6e 20 74 68 61 74 20  ery column that 
2a00: 74 68 65 20 74 77 6f 20 74 61 62 6c 65 73 20 68  the two tables h
2a10: 61 76 65 20 69 6e 20 63 6f 6d 6d 6f 6e 2e 0a 20  ave in common.. 
2a20: 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 52     */.    if( pR
2a30: 69 67 68 74 2d 3e 6a 6f 69 6e 74 79 70 65 20 26  ight->jointype &
2a40: 20 4a 54 5f 4e 41 54 55 52 41 4c 20 29 7b 0a 20   JT_NATURAL ){. 
2a50: 20 20 20 20 20 69 66 28 20 70 52 69 67 68 74 2d       if( pRight-
2a60: 3e 70 4f 6e 20 7c 7c 20 70 52 69 67 68 74 2d 3e  >pOn || pRight->
2a70: 70 55 73 69 6e 67 20 29 7b 0a 20 20 20 20 20 20  pUsing ){.      
2a80: 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
2a90: 67 28 70 50 61 72 73 65 2c 20 22 61 20 4e 41 54  g(pParse, "a NAT
2aa0: 55 52 41 4c 20 6a 6f 69 6e 20 6d 61 79 20 6e 6f  URAL join may no
2ab0: 74 20 68 61 76 65 20 22 0a 20 20 20 20 20 20 20  t have ".       
2ac0: 20 20 20 20 22 61 6e 20 4f 4e 20 6f 72 20 55 53      "an ON or US
2ad0: 49 4e 47 20 63 6c 61 75 73 65 22 2c 20 30 29 3b  ING clause", 0);
2ae0: 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
2af0: 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  1;.      }.     
2b00: 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 4c 65 66   for(j=0; j<pLef
2b10: 74 54 61 62 2d 3e 6e 43 6f 6c 3b 20 6a 2b 2b 29  tTab->nCol; j++)
2b20: 7b 0a 20 20 20 20 20 20 20 20 63 68 61 72 20 2a  {.        char *
2b30: 7a 4e 61 6d 65 20 3d 20 70 4c 65 66 74 54 61 62  zName = pLeftTab
2b40: 2d 3e 61 43 6f 6c 5b 6a 5d 2e 7a 4e 61 6d 65 3b  ->aCol[j].zName;
2b50: 0a 20 20 20 20 20 20 20 20 69 66 28 20 63 6f 6c  .        if( col
2b60: 75 6d 6e 49 6e 64 65 78 28 70 52 69 67 68 74 54  umnIndex(pRightT
2b70: 61 62 2c 20 7a 4e 61 6d 65 29 3e 3d 30 20 29 7b  ab, zName)>=0 ){
2b80: 0a 20 20 20 20 20 20 20 20 20 20 61 64 64 57 68  .          addWh
2b90: 65 72 65 54 65 72 6d 28 70 50 61 72 73 65 2c 20  ereTerm(pParse, 
2ba0: 7a 4e 61 6d 65 2c 20 70 4c 65 66 74 54 61 62 2c  zName, pLeftTab,
2bb0: 20 70 4c 65 66 74 2d 3e 7a 41 6c 69 61 73 2c 20   pLeft->zAlias, 
2bc0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
2bd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
2be0: 52 69 67 68 74 54 61 62 2c 20 70 52 69 67 68 74  RightTab, pRight
2bf0: 2d 3e 7a 41 6c 69 61 73 2c 0a 20 20 20 20 20 20  ->zAlias,.      
2c00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c10: 20 20 20 20 20 20 20 20 70 52 69 67 68 74 2d 3e          pRight->
2c20: 69 43 75 72 73 6f 72 2c 20 26 70 2d 3e 70 57 68  iCursor, &p->pWh
2c30: 65 72 65 2c 20 69 73 4f 75 74 65 72 29 3b 0a 20  ere, isOuter);. 
2c40: 20 20 20 20 20 20 20 20 20 0a 20 20 20 20 20 20           .      
2c50: 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
2c60: 7d 0a 0a 20 20 20 20 2f 2a 20 44 69 73 61 6c 6c  }..    /* Disall
2c70: 6f 77 20 62 6f 74 68 20 4f 4e 20 61 6e 64 20 55  ow both ON and U
2c80: 53 49 4e 47 20 63 6c 61 75 73 65 73 20 69 6e 20  SING clauses in 
2c90: 74 68 65 20 73 61 6d 65 20 6a 6f 69 6e 0a 20 20  the same join.  
2ca0: 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 52 69    */.    if( pRi
2cb0: 67 68 74 2d 3e 70 4f 6e 20 26 26 20 70 52 69 67  ght->pOn && pRig
2cc0: 68 74 2d 3e 70 55 73 69 6e 67 20 29 7b 0a 20 20  ht->pUsing ){.  
2cd0: 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
2ce0: 4d 73 67 28 70 50 61 72 73 65 2c 20 22 63 61 6e  Msg(pParse, "can
2cf0: 6e 6f 74 20 68 61 76 65 20 62 6f 74 68 20 4f 4e  not have both ON
2d00: 20 61 6e 64 20 55 53 49 4e 47 20 22 0a 20 20 20   and USING ".   
2d10: 20 20 20 20 20 22 63 6c 61 75 73 65 73 20 69 6e       "clauses in
2d20: 20 74 68 65 20 73 61 6d 65 20 6a 6f 69 6e 22 29   the same join")
2d30: 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 31  ;.      return 1
2d40: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
2d50: 41 64 64 20 74 68 65 20 4f 4e 20 63 6c 61 75 73  Add the ON claus
2d60: 65 20 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 20  e to the end of 
2d70: 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  the WHERE clause
2d80: 2c 20 63 6f 6e 6e 65 63 74 65 64 20 62 79 0a 20  , connected by. 
2d90: 20 20 20 2a 2a 20 61 6e 20 41 4e 44 20 6f 70 65     ** an AND ope
2da0: 72 61 74 6f 72 2e 0a 20 20 20 20 2a 2f 0a 20 20  rator..    */.  
2db0: 20 20 69 66 28 20 70 52 69 67 68 74 2d 3e 70 4f    if( pRight->pO
2dc0: 6e 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 69  n ){.      if( i
2dd0: 73 4f 75 74 65 72 20 29 20 73 65 74 4a 6f 69 6e  sOuter ) setJoin
2de0: 45 78 70 72 28 70 52 69 67 68 74 2d 3e 70 4f 6e  Expr(pRight->pOn
2df0: 2c 20 70 52 69 67 68 74 2d 3e 69 43 75 72 73 6f  , pRight->iCurso
2e00: 72 29 3b 0a 20 20 20 20 20 20 70 2d 3e 70 57 68  r);.      p->pWh
2e10: 65 72 65 20 3d 20 73 71 6c 69 74 65 33 45 78 70  ere = sqlite3Exp
2e20: 72 41 6e 64 28 70 50 61 72 73 65 2d 3e 64 62 2c  rAnd(pParse->db,
2e30: 20 70 2d 3e 70 57 68 65 72 65 2c 20 70 52 69 67   p->pWhere, pRig
2e40: 68 74 2d 3e 70 4f 6e 29 3b 0a 20 20 20 20 20 20  ht->pOn);.      
2e50: 70 52 69 67 68 74 2d 3e 70 4f 6e 20 3d 20 30 3b  pRight->pOn = 0;
2e60: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43  .    }..    /* C
2e70: 72 65 61 74 65 20 65 78 74 72 61 20 74 65 72 6d  reate extra term
2e80: 73 20 6f 6e 20 74 68 65 20 57 48 45 52 45 20 63  s on the WHERE c
2e90: 6c 61 75 73 65 20 66 6f 72 20 65 61 63 68 20 63  lause for each c
2ea0: 6f 6c 75 6d 6e 20 6e 61 6d 65 64 0a 20 20 20 20  olumn named.    
2eb0: 2a 2a 20 69 6e 20 74 68 65 20 55 53 49 4e 47 20  ** in the USING 
2ec0: 63 6c 61 75 73 65 2e 20 20 45 78 61 6d 70 6c 65  clause.  Example
2ed0: 3a 20 49 66 20 74 68 65 20 74 77 6f 20 74 61 62  : If the two tab
2ee0: 6c 65 73 20 74 6f 20 62 65 20 6a 6f 69 6e 65 64  les to be joined
2ef0: 20 61 72 65 20 0a 20 20 20 20 2a 2a 20 41 20 61   are .    ** A a
2f00: 6e 64 20 42 20 61 6e 64 20 74 68 65 20 55 53 49  nd B and the USI
2f10: 4e 47 20 63 6c 61 75 73 65 20 6e 61 6d 65 73 20  NG clause names 
2f20: 58 2c 20 59 2c 20 61 6e 64 20 5a 2c 20 74 68 65  X, Y, and Z, the
2f30: 6e 20 61 64 64 20 74 68 69 73 0a 20 20 20 20 2a  n add this.    *
2f40: 2a 20 74 6f 20 74 68 65 20 57 48 45 52 45 20 63  * to the WHERE c
2f50: 6c 61 75 73 65 3a 20 20 20 20 41 2e 58 3d 42 2e  lause:    A.X=B.
2f60: 58 20 41 4e 44 20 41 2e 59 3d 42 2e 59 20 41 4e  X AND A.Y=B.Y AN
2f70: 44 20 41 2e 5a 3d 42 2e 5a 0a 20 20 20 20 2a 2a  D A.Z=B.Z.    **
2f80: 20 52 65 70 6f 72 74 20 61 6e 20 65 72 72 6f 72   Report an error
2f90: 20 69 66 20 61 6e 79 20 63 6f 6c 75 6d 6e 20 6d   if any column m
2fa0: 65 6e 74 69 6f 6e 65 64 20 69 6e 20 74 68 65 20  entioned in the 
2fb0: 55 53 49 4e 47 20 63 6c 61 75 73 65 20 69 73 0a  USING clause is.
2fc0: 20 20 20 20 2a 2a 20 6e 6f 74 20 63 6f 6e 74 61      ** not conta
2fd0: 69 6e 65 64 20 69 6e 20 62 6f 74 68 20 74 61 62  ined in both tab
2fe0: 6c 65 73 20 74 6f 20 62 65 20 6a 6f 69 6e 65 64  les to be joined
2ff0: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
3000: 20 70 52 69 67 68 74 2d 3e 70 55 73 69 6e 67 20   pRight->pUsing 
3010: 29 7b 0a 20 20 20 20 20 20 49 64 4c 69 73 74 20  ){.      IdList 
3020: 2a 70 4c 69 73 74 20 3d 20 70 52 69 67 68 74 2d  *pList = pRight-
3030: 3e 70 55 73 69 6e 67 3b 0a 20 20 20 20 20 20 66  >pUsing;.      f
3040: 6f 72 28 6a 3d 30 3b 20 6a 3c 70 4c 69 73 74 2d  or(j=0; j<pList-
3050: 3e 6e 49 64 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20  >nId; j++){.    
3060: 20 20 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 20      char *zName 
3070: 3d 20 70 4c 69 73 74 2d 3e 61 5b 6a 5d 2e 7a 4e  = pList->a[j].zN
3080: 61 6d 65 3b 0a 20 20 20 20 20 20 20 20 69 66 28  ame;.        if(
3090: 20 63 6f 6c 75 6d 6e 49 6e 64 65 78 28 70 4c 65   columnIndex(pLe
30a0: 66 74 54 61 62 2c 20 7a 4e 61 6d 65 29 3c 30 20  ftTab, zName)<0 
30b0: 7c 7c 20 63 6f 6c 75 6d 6e 49 6e 64 65 78 28 70  || columnIndex(p
30c0: 52 69 67 68 74 54 61 62 2c 20 7a 4e 61 6d 65 29  RightTab, zName)
30d0: 3c 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  <0 ){.          
30e0: 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
30f0: 70 50 61 72 73 65 2c 20 22 63 61 6e 6e 6f 74 20  pParse, "cannot 
3100: 6a 6f 69 6e 20 75 73 69 6e 67 20 63 6f 6c 75 6d  join using colum
3110: 6e 20 25 73 20 2d 20 63 6f 6c 75 6d 6e 20 22 0a  n %s - column ".
3120: 20 20 20 20 20 20 20 20 20 20 20 20 22 6e 6f 74              "not
3130: 20 70 72 65 73 65 6e 74 20 69 6e 20 62 6f 74 68   present in both
3140: 20 74 61 62 6c 65 73 22 2c 20 7a 4e 61 6d 65 29   tables", zName)
3150: 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75  ;.          retu
3160: 72 6e 20 31 3b 0a 20 20 20 20 20 20 20 20 7d 0a  rn 1;.        }.
3170: 20 20 20 20 20 20 20 20 61 64 64 57 68 65 72 65          addWhere
3180: 54 65 72 6d 28 70 50 61 72 73 65 2c 20 7a 4e 61  Term(pParse, zNa
3190: 6d 65 2c 20 70 4c 65 66 74 54 61 62 2c 20 70 4c  me, pLeftTab, pL
31a0: 65 66 74 2d 3e 7a 41 6c 69 61 73 2c 20 0a 20 20  eft->zAlias, .  
31b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31c0: 20 20 20 20 20 20 20 20 20 20 70 52 69 67 68 74            pRight
31d0: 54 61 62 2c 20 70 52 69 67 68 74 2d 3e 7a 41 6c  Tab, pRight->zAl
31e0: 69 61 73 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ias,.           
31f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3200: 20 70 52 69 67 68 74 2d 3e 69 43 75 72 73 6f 72   pRight->iCursor
3210: 2c 20 26 70 2d 3e 70 57 68 65 72 65 2c 20 69 73  , &p->pWhere, is
3220: 4f 75 74 65 72 29 3b 0a 20 20 20 20 20 20 7d 0a  Outer);.      }.
3230: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
3240: 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49  rn 0;.}../*.** I
3250: 6e 73 65 72 74 20 63 6f 64 65 20 69 6e 74 6f 20  nsert code into 
3260: 22 76 22 20 74 68 61 74 20 77 69 6c 6c 20 70 75  "v" that will pu
3270: 73 68 20 74 68 65 20 72 65 63 6f 72 64 20 6f 6e  sh the record on
3280: 20 74 68 65 20 74 6f 70 20 6f 66 20 74 68 65 0a   the top of the.
3290: 2a 2a 20 73 74 61 63 6b 20 69 6e 74 6f 20 74 68  ** stack into th
32a0: 65 20 73 6f 72 74 65 72 2e 0a 2a 2f 0a 73 74 61  e sorter..*/.sta
32b0: 74 69 63 20 76 6f 69 64 20 70 75 73 68 4f 6e 74  tic void pushOnt
32c0: 6f 53 6f 72 74 65 72 28 0a 20 20 50 61 72 73 65  oSorter(.  Parse
32d0: 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20   *pParse,       
32e0: 20 20 2f 2a 20 50 61 72 73 65 72 20 63 6f 6e 74    /* Parser cont
32f0: 65 78 74 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73  ext */.  ExprLis
3300: 74 20 2a 70 4f 72 64 65 72 42 79 2c 20 20 20 20  t *pOrderBy,    
3310: 2f 2a 20 54 68 65 20 4f 52 44 45 52 20 42 59 20  /* The ORDER BY 
3320: 63 6c 61 75 73 65 20 2a 2f 0a 20 20 53 65 6c 65  clause */.  Sele
3330: 63 74 20 2a 70 53 65 6c 65 63 74 2c 20 20 20 20  ct *pSelect,    
3340: 20 20 20 2f 2a 20 54 68 65 20 77 68 6f 6c 65 20     /* The whole 
3350: 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
3360: 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 44 61 74   */.  int regDat
3370: 61 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  a            /* 
3380: 52 65 67 69 73 74 65 72 20 68 6f 6c 64 69 6e 67  Register holding
3390: 20 64 61 74 61 20 74 6f 20 62 65 20 73 6f 72 74   data to be sort
33a0: 65 64 20 2a 2f 0a 29 7b 0a 20 20 56 64 62 65 20  ed */.){.  Vdbe 
33b0: 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64  *v = pParse->pVd
33c0: 62 65 3b 0a 20 20 69 6e 74 20 6e 45 78 70 72 20  be;.  int nExpr 
33d0: 3d 20 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70  = pOrderBy->nExp
33e0: 72 3b 0a 20 20 69 6e 74 20 72 65 67 42 61 73 65  r;.  int regBase
33f0: 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d   = sqlite3GetTem
3400: 70 52 61 6e 67 65 28 70 50 61 72 73 65 2c 20 6e  pRange(pParse, n
3410: 45 78 70 72 2b 32 29 3b 0a 20 20 69 6e 74 20 72  Expr+2);.  int r
3420: 65 67 52 65 63 6f 72 64 20 3d 20 73 71 6c 69 74  egRecord = sqlit
3430: 65 33 47 65 74 54 65 6d 70 52 65 67 28 70 50 61  e3GetTempReg(pPa
3440: 72 73 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 45  rse);.  sqlite3E
3450: 78 70 72 43 6f 64 65 45 78 70 72 4c 69 73 74 28  xprCodeExprList(
3460: 70 50 61 72 73 65 2c 20 70 4f 72 64 65 72 42 79  pParse, pOrderBy
3470: 2c 20 72 65 67 42 61 73 65 2c 20 30 29 3b 0a 20  , regBase, 0);. 
3480: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
3490: 70 32 28 76 2c 20 4f 50 5f 53 65 71 75 65 6e 63  p2(v, OP_Sequenc
34a0: 65 2c 20 70 4f 72 64 65 72 42 79 2d 3e 69 45 43  e, pOrderBy->iEC
34b0: 75 72 73 6f 72 2c 20 72 65 67 42 61 73 65 2b 6e  ursor, regBase+n
34c0: 45 78 70 72 29 3b 0a 20 20 73 71 6c 69 74 65 33  Expr);.  sqlite3
34d0: 45 78 70 72 43 6f 64 65 4d 6f 76 65 28 70 50 61  ExprCodeMove(pPa
34e0: 72 73 65 2c 20 72 65 67 44 61 74 61 2c 20 72 65  rse, regData, re
34f0: 67 42 61 73 65 2b 6e 45 78 70 72 2b 31 29 3b 0a  gBase+nExpr+1);.
3500: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
3510: 4f 70 33 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65  Op3(v, OP_MakeRe
3520: 63 6f 72 64 2c 20 72 65 67 42 61 73 65 2c 20 6e  cord, regBase, n
3530: 45 78 70 72 20 2b 20 32 2c 20 72 65 67 52 65 63  Expr + 2, regRec
3540: 6f 72 64 29 3b 0a 20 20 73 71 6c 69 74 65 33 56  ord);.  sqlite3V
3550: 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
3560: 49 64 78 49 6e 73 65 72 74 2c 20 70 4f 72 64 65  IdxInsert, pOrde
3570: 72 42 79 2d 3e 69 45 43 75 72 73 6f 72 2c 20 72  rBy->iECursor, r
3580: 65 67 52 65 63 6f 72 64 29 3b 0a 20 20 73 71 6c  egRecord);.  sql
3590: 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52  ite3ReleaseTempR
35a0: 65 67 28 70 50 61 72 73 65 2c 20 72 65 67 52 65  eg(pParse, regRe
35b0: 63 6f 72 64 29 3b 0a 20 20 73 71 6c 69 74 65 33  cord);.  sqlite3
35c0: 52 65 6c 65 61 73 65 54 65 6d 70 52 61 6e 67 65  ReleaseTempRange
35d0: 28 70 50 61 72 73 65 2c 20 72 65 67 42 61 73 65  (pParse, regBase
35e0: 2c 20 6e 45 78 70 72 2b 32 29 3b 0a 20 20 69 66  , nExpr+2);.  if
35f0: 28 20 70 53 65 6c 65 63 74 2d 3e 69 4c 69 6d 69  ( pSelect->iLimi
3600: 74 3e 3d 30 20 29 7b 0a 20 20 20 20 69 6e 74 20  t>=0 ){.    int 
3610: 61 64 64 72 31 2c 20 61 64 64 72 32 3b 0a 20 20  addr1, addr2;.  
3620: 20 20 69 6e 74 20 69 4c 69 6d 69 74 3b 0a 20 20    int iLimit;.  
3630: 20 20 69 66 28 20 70 53 65 6c 65 63 74 2d 3e 70    if( pSelect->p
3640: 4f 66 66 73 65 74 20 29 7b 0a 20 20 20 20 20 20  Offset ){.      
3650: 69 4c 69 6d 69 74 20 3d 20 70 53 65 6c 65 63 74  iLimit = pSelect
3660: 2d 3e 69 4f 66 66 73 65 74 2b 31 3b 0a 20 20 20  ->iOffset+1;.   
3670: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 4c   }else{.      iL
3680: 69 6d 69 74 20 3d 20 70 53 65 6c 65 63 74 2d 3e  imit = pSelect->
3690: 69 4c 69 6d 69 74 3b 0a 20 20 20 20 7d 0a 20 20  iLimit;.    }.  
36a0: 20 20 61 64 64 72 31 20 3d 20 73 71 6c 69 74 65    addr1 = sqlite
36b0: 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f  3VdbeAddOp1(v, O
36c0: 50 5f 49 66 5a 65 72 6f 2c 20 69 4c 69 6d 69 74  P_IfZero, iLimit
36d0: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
36e0: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 41  beAddOp2(v, OP_A
36f0: 64 64 49 6d 6d 2c 20 69 4c 69 6d 69 74 2c 20 2d  ddImm, iLimit, -
3700: 31 29 3b 0a 20 20 20 20 61 64 64 72 32 20 3d 20  1);.    addr2 = 
3710: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
3720: 30 28 76 2c 20 4f 50 5f 47 6f 74 6f 29 3b 0a 20  0(v, OP_Goto);. 
3730: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75     sqlite3VdbeJu
3740: 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72 31 29  mpHere(v, addr1)
3750: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
3760: 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 4c 61  eAddOp1(v, OP_La
3770: 73 74 2c 20 70 4f 72 64 65 72 42 79 2d 3e 69 45  st, pOrderBy->iE
3780: 43 75 72 73 6f 72 29 3b 0a 20 20 20 20 73 71 6c  Cursor);.    sql
3790: 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76  ite3VdbeAddOp1(v
37a0: 2c 20 4f 50 5f 44 65 6c 65 74 65 2c 20 70 4f 72  , OP_Delete, pOr
37b0: 64 65 72 42 79 2d 3e 69 45 43 75 72 73 6f 72 29  derBy->iECursor)
37c0: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
37d0: 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64  eJumpHere(v, add
37e0: 72 32 29 3b 0a 20 20 20 20 70 53 65 6c 65 63 74  r2);.    pSelect
37f0: 2d 3e 69 4c 69 6d 69 74 20 3d 20 2d 31 3b 0a 20  ->iLimit = -1;. 
3800: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20   }.}../*.** Add 
3810: 63 6f 64 65 20 74 6f 20 69 6d 70 6c 65 6d 65 6e  code to implemen
3820: 74 20 74 68 65 20 4f 46 46 53 45 54 0a 2a 2f 0a  t the OFFSET.*/.
3830: 73 74 61 74 69 63 20 76 6f 69 64 20 63 6f 64 65  static void code
3840: 4f 66 66 73 65 74 28 0a 20 20 56 64 62 65 20 2a  Offset(.  Vdbe *
3850: 76 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 47  v,          /* G
3860: 65 6e 65 72 61 74 65 20 63 6f 64 65 20 69 6e 74  enerate code int
3870: 6f 20 74 68 69 73 20 56 4d 20 2a 2f 0a 20 20 53  o this VM */.  S
3880: 65 6c 65 63 74 20 2a 70 2c 20 20 20 20 20 20 20  elect *p,       
3890: 20 2f 2a 20 54 68 65 20 53 45 4c 45 43 54 20 73   /* The SELECT s
38a0: 74 61 74 65 6d 65 6e 74 20 62 65 69 6e 67 20 63  tatement being c
38b0: 6f 64 65 64 20 2a 2f 0a 20 20 69 6e 74 20 69 43  oded */.  int iC
38c0: 6f 6e 74 69 6e 75 65 20 20 20 20 20 2f 2a 20 4a  ontinue     /* J
38d0: 75 6d 70 20 68 65 72 65 20 74 6f 20 73 6b 69 70  ump here to skip
38e0: 20 74 68 65 20 63 75 72 72 65 6e 74 20 72 65 63   the current rec
38f0: 6f 72 64 20 2a 2f 0a 29 7b 0a 20 20 69 66 28 20  ord */.){.  if( 
3900: 70 2d 3e 69 4f 66 66 73 65 74 3e 3d 30 20 26 26  p->iOffset>=0 &&
3910: 20 69 43 6f 6e 74 69 6e 75 65 21 3d 30 20 29 7b   iContinue!=0 ){
3920: 0a 20 20 20 20 69 6e 74 20 61 64 64 72 3b 0a 20  .    int addr;. 
3930: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
3940: 64 4f 70 32 28 76 2c 20 4f 50 5f 41 64 64 49 6d  dOp2(v, OP_AddIm
3950: 6d 2c 20 70 2d 3e 69 4f 66 66 73 65 74 2c 20 2d  m, p->iOffset, -
3960: 31 29 3b 0a 20 20 20 20 61 64 64 72 20 3d 20 73  1);.    addr = s
3970: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31  qlite3VdbeAddOp1
3980: 28 76 2c 20 4f 50 5f 49 66 4e 65 67 2c 20 70 2d  (v, OP_IfNeg, p-
3990: 3e 69 4f 66 66 73 65 74 29 3b 0a 20 20 20 20 73  >iOffset);.    s
39a0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
39b0: 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20  (v, OP_Goto, 0, 
39c0: 69 43 6f 6e 74 69 6e 75 65 29 3b 0a 20 20 20 20  iContinue);.    
39d0: 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20  VdbeComment((v, 
39e0: 22 73 6b 69 70 20 4f 46 46 53 45 54 20 72 65 63  "skip OFFSET rec
39f0: 6f 72 64 73 22 29 29 3b 0a 20 20 20 20 73 71 6c  ords"));.    sql
3a00: 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65  ite3VdbeJumpHere
3a10: 28 76 2c 20 61 64 64 72 29 3b 0a 20 20 7d 0a 7d  (v, addr);.  }.}
3a20: 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 63 6f 64 65  ../*.** Add code
3a30: 20 74 68 61 74 20 77 69 6c 6c 20 63 68 65 63 6b   that will check
3a40: 20 74 6f 20 6d 61 6b 65 20 73 75 72 65 20 74 68   to make sure th
3a50: 65 20 4e 20 72 65 67 69 73 74 65 72 73 20 73 74  e N registers st
3a60: 61 72 74 69 6e 67 20 61 74 20 69 4d 65 6d 0a 2a  arting at iMem.*
3a70: 2a 20 66 6f 72 6d 20 61 20 64 69 73 74 69 6e 63  * form a distinc
3a80: 74 20 65 6e 74 72 79 2e 20 20 69 54 61 62 20 69  t entry.  iTab i
3a90: 73 20 61 20 73 6f 72 74 69 6e 67 20 69 6e 64 65  s a sorting inde
3aa0: 78 20 74 68 61 74 20 68 6f 6c 64 73 20 70 72 65  x that holds pre
3ab0: 76 69 6f 75 73 6c 79 0a 2a 2a 20 73 65 65 6e 20  viously.** seen 
3ac0: 63 6f 6d 62 69 6e 61 74 69 6f 6e 73 20 6f 66 20  combinations of 
3ad0: 74 68 65 20 4e 20 76 61 6c 75 65 73 2e 20 20 41  the N values.  A
3ae0: 20 6e 65 77 20 65 6e 74 72 79 20 69 73 20 6d 61   new entry is ma
3af0: 64 65 20 69 6e 20 69 54 61 62 0a 2a 2a 20 69 66  de in iTab.** if
3b00: 20 74 68 65 20 63 75 72 72 65 6e 74 20 4e 20 76   the current N v
3b10: 61 6c 75 65 73 20 61 72 65 20 6e 65 77 2e 0a 2a  alues are new..*
3b20: 2a 0a 2a 2a 20 41 20 6a 75 6d 70 20 74 6f 20 61  *.** A jump to a
3b30: 64 64 72 52 65 70 65 61 74 20 69 73 20 6d 61 64  ddrRepeat is mad
3b40: 65 20 61 6e 64 20 74 68 65 20 4e 2b 31 20 76 61  e and the N+1 va
3b50: 6c 75 65 73 20 61 72 65 20 70 6f 70 70 65 64 20  lues are popped 
3b60: 66 72 6f 6d 20 74 68 65 0a 2a 2a 20 73 74 61 63  from the.** stac
3b70: 6b 20 69 66 20 74 68 65 20 74 6f 70 20 4e 20 65  k if the top N e
3b80: 6c 65 6d 65 6e 74 73 20 61 72 65 20 6e 6f 74 20  lements are not 
3b90: 64 69 73 74 69 6e 63 74 2e 0a 2a 2f 0a 73 74 61  distinct..*/.sta
3ba0: 74 69 63 20 76 6f 69 64 20 63 6f 64 65 44 69 73  tic void codeDis
3bb0: 74 69 6e 63 74 28 0a 20 20 50 61 72 73 65 20 2a  tinct(.  Parse *
3bc0: 70 50 61 72 73 65 2c 20 20 20 20 20 2f 2a 20 50  pParse,     /* P
3bd0: 61 72 73 69 6e 67 20 61 6e 64 20 63 6f 64 65 20  arsing and code 
3be0: 67 65 6e 65 72 61 74 69 6e 67 20 63 6f 6e 74 65  generating conte
3bf0: 78 74 20 2a 2f 0a 20 20 69 6e 74 20 69 54 61 62  xt */.  int iTab
3c00: 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 20  ,          /* A 
3c10: 73 6f 72 74 69 6e 67 20 69 6e 64 65 78 20 75 73  sorting index us
3c20: 65 64 20 74 6f 20 74 65 73 74 20 66 6f 72 20 64  ed to test for d
3c30: 69 73 74 69 6e 63 74 6e 65 73 73 20 2a 2f 0a 20  istinctness */. 
3c40: 20 69 6e 74 20 61 64 64 72 52 65 70 65 61 74 2c   int addrRepeat,
3c50: 20 20 20 20 2f 2a 20 4a 75 6d 70 20 74 6f 20 68      /* Jump to h
3c60: 65 72 65 20 69 66 20 6e 6f 74 20 64 69 73 74 69  ere if not disti
3c70: 6e 63 74 20 2a 2f 0a 20 20 69 6e 74 20 4e 2c 20  nct */.  int N, 
3c80: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
3c90: 75 6d 62 65 72 20 6f 66 20 65 6c 65 6d 65 6e 74  umber of element
3ca0: 73 20 2a 2f 0a 20 20 69 6e 74 20 69 4d 65 6d 20  s */.  int iMem 
3cb0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72            /* Fir
3cc0: 73 74 20 65 6c 65 6d 65 6e 74 20 2a 2f 0a 29 7b  st element */.){
3cd0: 0a 20 20 56 64 62 65 20 2a 76 3b 0a 20 20 69 6e  .  Vdbe *v;.  in
3ce0: 74 20 72 31 3b 0a 0a 20 20 76 20 3d 20 70 50 61  t r1;..  v = pPa
3cf0: 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 72 31  rse->pVdbe;.  r1
3d00: 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d   = sqlite3GetTem
3d10: 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20  pReg(pParse);.  
3d20: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
3d30: 33 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f  3(v, OP_MakeReco
3d40: 72 64 2c 20 69 4d 65 6d 2c 20 4e 2c 20 72 31 29  rd, iMem, N, r1)
3d50: 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41  ;.  sqlite3VdbeA
3d60: 64 64 4f 70 33 28 76 2c 20 4f 50 5f 46 6f 75 6e  ddOp3(v, OP_Foun
3d70: 64 2c 20 69 54 61 62 2c 20 61 64 64 72 52 65 70  d, iTab, addrRep
3d80: 65 61 74 2c 20 72 31 29 3b 0a 20 20 73 71 6c 69  eat, r1);.  sqli
3d90: 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
3da0: 20 4f 50 5f 49 64 78 49 6e 73 65 72 74 2c 20 69   OP_IdxInsert, i
3db0: 54 61 62 2c 20 72 31 29 3b 0a 20 20 73 71 6c 69  Tab, r1);.  sqli
3dc0: 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65  te3ReleaseTempRe
3dd0: 67 28 70 50 61 72 73 65 2c 20 72 31 29 3b 0a 7d  g(pParse, r1);.}
3de0: 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65  ../*.** Generate
3df0: 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67   an error messag
3e00: 65 20 77 68 65 6e 20 61 20 53 45 4c 45 43 54 20  e when a SELECT 
3e10: 69 73 20 75 73 65 64 20 77 69 74 68 69 6e 20 61  is used within a
3e20: 20 73 75 62 65 78 70 72 65 73 73 69 6f 6e 0a 2a   subexpression.*
3e30: 2a 20 28 65 78 61 6d 70 6c 65 3a 20 20 22 61 20  * (example:  "a 
3e40: 49 4e 20 28 53 45 4c 45 43 54 20 2a 20 46 52 4f  IN (SELECT * FRO
3e50: 4d 20 74 61 62 6c 65 29 22 29 20 62 75 74 20 69  M table)") but i
3e60: 74 20 68 61 73 20 6d 6f 72 65 20 74 68 61 6e 20  t has more than 
3e70: 31 20 72 65 73 75 6c 74 0a 2a 2a 20 63 6f 6c 75  1 result.** colu
3e80: 6d 6e 2e 20 20 57 65 20 64 6f 20 74 68 69 73 20  mn.  We do this 
3e90: 69 6e 20 61 20 73 75 62 72 6f 75 74 69 6e 65 20  in a subroutine 
3ea0: 62 65 63 61 75 73 65 20 74 68 65 20 65 72 72 6f  because the erro
3eb0: 72 20 6f 63 63 75 72 73 20 69 6e 20 6d 75 6c 74  r occurs in mult
3ec0: 69 70 6c 65 0a 2a 2a 20 70 6c 61 63 65 73 2e 0a  iple.** places..
3ed0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 63 68  */.static int ch
3ee0: 65 63 6b 46 6f 72 4d 75 6c 74 69 43 6f 6c 75 6d  eckForMultiColum
3ef0: 6e 53 65 6c 65 63 74 45 72 72 6f 72 28 0a 20 20  nSelectError(.  
3f00: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
3f10: 20 20 20 20 20 2f 2a 20 50 61 72 73 65 20 63 6f       /* Parse co
3f20: 6e 74 65 78 74 2e 20 2a 2f 0a 20 20 53 65 6c 65  ntext. */.  Sele
3f30: 63 74 44 65 73 74 20 2a 70 44 65 73 74 2c 20 20  ctDest *pDest,  
3f40: 20 2f 2a 20 44 65 73 74 69 6e 61 74 69 6f 6e 20   /* Destination 
3f50: 6f 66 20 53 45 4c 45 43 54 20 72 65 73 75 6c 74  of SELECT result
3f60: 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 45 78 70 72  s */.  int nExpr
3f70: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
3f80: 75 6d 62 65 72 20 6f 66 20 72 65 73 75 6c 74 20  umber of result 
3f90: 63 6f 6c 75 6d 6e 73 20 72 65 74 75 72 6e 65 64  columns returned
3fa0: 20 62 79 20 53 45 4c 45 43 54 20 2a 2f 0a 29 7b   by SELECT */.){
3fb0: 0a 20 20 69 6e 74 20 65 44 65 73 74 20 3d 20 70  .  int eDest = p
3fc0: 44 65 73 74 2d 3e 65 44 65 73 74 3b 0a 20 20 69  Dest->eDest;.  i
3fd0: 66 28 20 6e 45 78 70 72 3e 31 20 26 26 20 28 65  f( nExpr>1 && (e
3fe0: 44 65 73 74 3d 3d 53 52 54 5f 4d 65 6d 20 7c 7c  Dest==SRT_Mem ||
3ff0: 20 65 44 65 73 74 3d 3d 53 52 54 5f 53 65 74 29   eDest==SRT_Set)
4000: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45   ){.    sqlite3E
4010: 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
4020: 22 6f 6e 6c 79 20 61 20 73 69 6e 67 6c 65 20 72  "only a single r
4030: 65 73 75 6c 74 20 61 6c 6c 6f 77 65 64 20 66 6f  esult allowed fo
4040: 72 20 22 0a 20 20 20 20 20 20 20 22 61 20 53 45  r ".       "a SE
4050: 4c 45 43 54 20 74 68 61 74 20 69 73 20 70 61 72  LECT that is par
4060: 74 20 6f 66 20 61 6e 20 65 78 70 72 65 73 73 69  t of an expressi
4070: 6f 6e 22 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  on");.    return
4080: 20 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20   1;.  }else{.   
4090: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 7d   return 0;.  }.}
40a0: 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ../*.** This rou
40b0: 74 69 6e 65 20 67 65 6e 65 72 61 74 65 73 20 74  tine generates t
40c0: 68 65 20 63 6f 64 65 20 66 6f 72 20 74 68 65 20  he code for the 
40d0: 69 6e 73 69 64 65 20 6f 66 20 74 68 65 20 69 6e  inside of the in
40e0: 6e 65 72 20 6c 6f 6f 70 0a 2a 2a 20 6f 66 20 61  ner loop.** of a
40f0: 20 53 45 4c 45 43 54 2e 0a 2a 2a 0a 2a 2a 20 49   SELECT..**.** I
4100: 66 20 73 72 63 54 61 62 20 61 6e 64 20 6e 43 6f  f srcTab and nCo
4110: 6c 75 6d 6e 20 61 72 65 20 62 6f 74 68 20 7a 65  lumn are both ze
4120: 72 6f 2c 20 74 68 65 6e 20 74 68 65 20 70 45 4c  ro, then the pEL
4130: 69 73 74 20 65 78 70 72 65 73 73 69 6f 6e 73 0a  ist expressions.
4140: 2a 2a 20 61 72 65 20 65 76 61 6c 75 61 74 65 64  ** are evaluated
4150: 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 67 65 74   in order to get
4160: 20 74 68 65 20 64 61 74 61 20 66 6f 72 20 74 68   the data for th
4170: 69 73 20 72 6f 77 2e 20 20 49 66 20 6e 43 6f 6c  is row.  If nCol
4180: 75 6d 6e 3e 30 0a 2a 2a 20 74 68 65 6e 20 64 61  umn>0.** then da
4190: 74 61 20 69 73 20 70 75 6c 6c 65 64 20 66 72 6f  ta is pulled fro
41a0: 6d 20 73 72 63 54 61 62 20 61 6e 64 20 70 45 4c  m srcTab and pEL
41b0: 69 73 74 20 69 73 20 75 73 65 64 20 6f 6e 6c 79  ist is used only
41c0: 20 74 6f 20 67 65 74 20 74 68 65 0a 2a 2a 20 64   to get the.** d
41d0: 61 74 61 74 79 70 65 73 20 66 6f 72 20 65 61 63  atatypes for eac
41e0: 68 20 63 6f 6c 75 6d 6e 2e 0a 2a 2f 0a 73 74 61  h column..*/.sta
41f0: 74 69 63 20 76 6f 69 64 20 73 65 6c 65 63 74 49  tic void selectI
4200: 6e 6e 65 72 4c 6f 6f 70 28 0a 20 20 50 61 72 73  nnerLoop(.  Pars
4210: 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20  e *pParse,      
4220: 20 20 20 20 2f 2a 20 54 68 65 20 70 61 72 73 65      /* The parse
4230: 72 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53  r context */.  S
4240: 65 6c 65 63 74 20 2a 70 2c 20 20 20 20 20 20 20  elect *p,       
4250: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63 6f         /* The co
4260: 6d 70 6c 65 74 65 20 73 65 6c 65 63 74 20 73 74  mplete select st
4270: 61 74 65 6d 65 6e 74 20 62 65 69 6e 67 20 63 6f  atement being co
4280: 64 65 64 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73  ded */.  ExprLis
4290: 74 20 2a 70 45 4c 69 73 74 2c 20 20 20 20 20 20  t *pEList,      
42a0: 20 2f 2a 20 4c 69 73 74 20 6f 66 20 76 61 6c 75   /* List of valu
42b0: 65 73 20 62 65 69 6e 67 20 65 78 74 72 61 63 74  es being extract
42c0: 65 64 20 2a 2f 0a 20 20 69 6e 74 20 73 72 63 54  ed */.  int srcT
42d0: 61 62 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ab,             
42e0: 2f 2a 20 50 75 6c 6c 20 64 61 74 61 20 66 72 6f  /* Pull data fro
42f0: 6d 20 74 68 69 73 20 74 61 62 6c 65 20 2a 2f 0a  m this table */.
4300: 20 20 69 6e 74 20 6e 43 6f 6c 75 6d 6e 2c 20 20    int nColumn,  
4310: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
4320: 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 69  ber of columns i
4330: 6e 20 74 68 65 20 73 6f 75 72 63 65 20 74 61 62  n the source tab
4340: 6c 65 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74  le */.  ExprList
4350: 20 2a 70 4f 72 64 65 72 42 79 2c 20 20 20 20 20   *pOrderBy,     
4360: 2f 2a 20 49 66 20 6e 6f 74 20 4e 55 4c 4c 2c 20  /* If not NULL, 
4370: 73 6f 72 74 20 72 65 73 75 6c 74 73 20 75 73 69  sort results usi
4380: 6e 67 20 74 68 69 73 20 6b 65 79 20 2a 2f 0a 20  ng this key */. 
4390: 20 69 6e 74 20 64 69 73 74 69 6e 63 74 2c 20 20   int distinct,  
43a0: 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 3e           /* If >
43b0: 3d 30 2c 20 6d 61 6b 65 20 73 75 72 65 20 72 65  =0, make sure re
43c0: 73 75 6c 74 73 20 61 72 65 20 64 69 73 74 69 6e  sults are distin
43d0: 63 74 20 2a 2f 0a 20 20 53 65 6c 65 63 74 44 65  ct */.  SelectDe
43e0: 73 74 20 2a 70 44 65 73 74 2c 20 20 20 20 20 20  st *pDest,      
43f0: 2f 2a 20 48 6f 77 20 74 6f 20 64 69 73 70 6f 73  /* How to dispos
4400: 65 20 6f 66 20 74 68 65 20 72 65 73 75 6c 74 73  e of the results
4410: 20 2a 2f 0a 20 20 69 6e 74 20 69 43 6f 6e 74 69   */.  int iConti
4420: 6e 75 65 2c 20 20 20 20 20 20 20 20 20 20 2f 2a  nue,          /*
4430: 20 4a 75 6d 70 20 68 65 72 65 20 74 6f 20 63 6f   Jump here to co
4440: 6e 74 69 6e 75 65 20 77 69 74 68 20 6e 65 78 74  ntinue with next
4450: 20 72 6f 77 20 2a 2f 0a 20 20 69 6e 74 20 69 42   row */.  int iB
4460: 72 65 61 6b 2c 20 20 20 20 20 20 20 20 20 20 20  reak,           
4470: 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20 74    /* Jump here t
4480: 6f 20 62 72 65 61 6b 20 6f 75 74 20 6f 66 20 74  o break out of t
4490: 68 65 20 69 6e 6e 65 72 20 6c 6f 6f 70 20 2a 2f  he inner loop */
44a0: 0a 20 20 63 68 61 72 20 2a 61 66 66 20 20 20 20  .  char *aff    
44b0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 61 66             /* af
44c0: 66 69 6e 69 74 79 20 73 74 72 69 6e 67 20 69 66  finity string if
44d0: 20 65 44 65 73 74 20 69 73 20 53 52 54 5f 55 6e   eDest is SRT_Un
44e0: 69 6f 6e 20 2a 2f 0a 29 7b 0a 20 20 56 64 62 65  ion */.){.  Vdbe
44f0: 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56   *v = pParse->pV
4500: 64 62 65 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  dbe;.  int i;.  
4510: 69 6e 74 20 68 61 73 44 69 73 74 69 6e 63 74 3b  int hasDistinct;
4520: 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
4530: 69 66 20 74 68 65 20 44 49 53 54 49 4e 43 54 20  if the DISTINCT 
4540: 6b 65 79 77 6f 72 64 20 69 73 20 70 72 65 73 65  keyword is prese
4550: 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 52  nt */.  int regR
4560: 65 73 75 6c 74 3b 20 20 20 20 20 20 20 20 20 20  esult;          
4570: 20 20 20 20 2f 2a 20 53 74 61 72 74 20 6f 66 20      /* Start of 
4580: 6d 65 6d 6f 72 79 20 68 6f 6c 64 69 6e 67 20 72  memory holding r
4590: 65 73 75 6c 74 20 73 65 74 20 2a 2f 0a 20 20 69  esult set */.  i
45a0: 6e 74 20 65 44 65 73 74 20 3d 20 70 44 65 73 74  nt eDest = pDest
45b0: 2d 3e 65 44 65 73 74 3b 20 20 20 2f 2a 20 48 6f  ->eDest;   /* Ho
45c0: 77 20 74 6f 20 64 69 73 70 6f 73 65 20 6f 66 20  w to dispose of 
45d0: 72 65 73 75 6c 74 73 20 2a 2f 0a 20 20 69 6e 74  results */.  int
45e0: 20 69 50 61 72 6d 20 3d 20 70 44 65 73 74 2d 3e   iParm = pDest->
45f0: 69 50 61 72 6d 3b 20 20 20 2f 2a 20 46 69 72 73  iParm;   /* Firs
4600: 74 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 64 69  t argument to di
4610: 73 70 6f 73 61 6c 20 6d 65 74 68 6f 64 20 2a 2f  sposal method */
4620: 0a 20 20 69 6e 74 20 6e 52 65 73 75 6c 74 43 6f  .  int nResultCo
4630: 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  l;             /
4640: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 72 65 73 75  * Number of resu
4650: 6c 74 20 63 6f 6c 75 6d 6e 73 20 2a 2f 0a 0a 20  lt columns */.. 
4660: 20 69 66 28 20 76 3d 3d 30 20 29 20 72 65 74 75   if( v==0 ) retu
4670: 72 6e 3b 0a 20 20 61 73 73 65 72 74 28 20 70 45  rn;.  assert( pE
4680: 4c 69 73 74 21 3d 30 20 29 3b 0a 0a 20 20 2f 2a  List!=0 );..  /*
4690: 20 49 66 20 74 68 65 72 65 20 77 61 73 20 61 20   If there was a 
46a0: 4c 49 4d 49 54 20 63 6c 61 75 73 65 20 6f 6e 20  LIMIT clause on 
46b0: 74 68 65 20 53 45 4c 45 43 54 20 73 74 61 74 65  the SELECT state
46c0: 6d 65 6e 74 2c 20 74 68 65 6e 20 64 6f 20 74 68  ment, then do th
46d0: 65 20 63 68 65 63 6b 0a 20 20 2a 2a 20 74 6f 20  e check.  ** to 
46e0: 73 65 65 20 69 66 20 74 68 69 73 20 72 6f 77 20  see if this row 
46f0: 73 68 6f 75 6c 64 20 62 65 20 6f 75 74 70 75 74  should be output
4700: 2e 0a 20 20 2a 2f 0a 20 20 68 61 73 44 69 73 74  ..  */.  hasDist
4710: 69 6e 63 74 20 3d 20 64 69 73 74 69 6e 63 74 3e  inct = distinct>
4720: 3d 30 20 26 26 20 70 45 4c 69 73 74 2d 3e 6e 45  =0 && pEList->nE
4730: 78 70 72 3e 30 3b 0a 20 20 69 66 28 20 70 4f 72  xpr>0;.  if( pOr
4740: 64 65 72 42 79 3d 3d 30 20 26 26 20 21 68 61 73  derBy==0 && !has
4750: 44 69 73 74 69 6e 63 74 20 29 7b 0a 20 20 20 20  Distinct ){.    
4760: 63 6f 64 65 4f 66 66 73 65 74 28 76 2c 20 70 2c  codeOffset(v, p,
4770: 20 69 43 6f 6e 74 69 6e 75 65 29 3b 0a 20 20 7d   iContinue);.  }
4780: 0a 0a 20 20 2f 2a 20 50 75 6c 6c 20 74 68 65 20  ..  /* Pull the 
4790: 72 65 71 75 65 73 74 65 64 20 63 6f 6c 75 6d 6e  requested column
47a0: 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6e 43  s..  */.  if( nC
47b0: 6f 6c 75 6d 6e 3e 30 20 29 7b 0a 20 20 20 20 6e  olumn>0 ){.    n
47c0: 52 65 73 75 6c 74 43 6f 6c 20 3d 20 6e 43 6f 6c  ResultCol = nCol
47d0: 75 6d 6e 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  umn;.  }else{.  
47e0: 20 20 6e 52 65 73 75 6c 74 43 6f 6c 20 3d 20 70    nResultCol = p
47f0: 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 0a 20 20  EList->nExpr;.  
4800: 7d 0a 20 20 69 66 28 20 70 44 65 73 74 2d 3e 69  }.  if( pDest->i
4810: 4d 65 6d 3d 3d 30 20 29 7b 0a 20 20 20 20 70 44  Mem==0 ){.    pD
4820: 65 73 74 2d 3e 69 4d 65 6d 20 3d 20 73 71 6c 69  est->iMem = sqli
4830: 74 65 33 47 65 74 54 65 6d 70 52 61 6e 67 65 28  te3GetTempRange(
4840: 70 50 61 72 73 65 2c 20 6e 52 65 73 75 6c 74 43  pParse, nResultC
4850: 6f 6c 29 3b 0a 20 20 20 20 70 44 65 73 74 2d 3e  ol);.    pDest->
4860: 6e 4d 65 6d 20 3d 20 6e 52 65 73 75 6c 74 43 6f  nMem = nResultCo
4870: 6c 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70  l;.  }else if( p
4880: 44 65 73 74 2d 3e 6e 4d 65 6d 21 3d 6e 52 65 73  Dest->nMem!=nRes
4890: 75 6c 74 43 6f 6c 20 29 7b 0a 20 20 20 20 2f 2a  ultCol ){.    /*
48a0: 20 54 68 69 73 20 68 61 70 70 65 6e 73 20 77 68   This happens wh
48b0: 65 6e 20 74 77 6f 20 53 45 4c 45 43 54 73 20 6f  en two SELECTs o
48c0: 66 20 61 20 63 6f 6d 70 6f 75 6e 64 20 53 45 4c  f a compound SEL
48d0: 45 43 54 20 68 61 76 65 20 64 69 66 66 65 72 69  ECT have differi
48e0: 6e 67 0a 20 20 20 20 2a 2a 20 6e 75 6d 62 65 72  ng.    ** number
48f0: 73 20 6f 66 20 72 65 73 75 6c 74 20 63 6f 6c 75  s of result colu
4900: 6d 6e 73 2e 20 20 54 68 65 20 65 72 72 6f 72 20  mns.  The error 
4910: 6d 65 73 73 61 67 65 20 77 69 6c 6c 20 62 65 20  message will be 
4920: 67 65 6e 65 72 61 74 65 64 20 62 79 0a 20 20 20  generated by.   
4930: 20 2a 2a 20 61 20 68 69 67 68 65 72 2d 6c 65 76   ** a higher-lev
4940: 65 6c 20 72 6f 75 74 69 6e 65 2e 20 2a 2f 0a 20  el routine. */. 
4950: 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20     return;.  }. 
4960: 20 72 65 67 52 65 73 75 6c 74 20 3d 20 70 44 65   regResult = pDe
4970: 73 74 2d 3e 69 4d 65 6d 3b 0a 20 20 69 66 28 20  st->iMem;.  if( 
4980: 6e 43 6f 6c 75 6d 6e 3e 30 20 29 7b 0a 20 20 20  nColumn>0 ){.   
4990: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 6f 6c   for(i=0; i<nCol
49a0: 75 6d 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  umn; i++){.     
49b0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
49c0: 70 33 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c  p3(v, OP_Column,
49d0: 20 73 72 63 54 61 62 2c 20 69 2c 20 72 65 67 52   srcTab, i, regR
49e0: 65 73 75 6c 74 2b 69 29 3b 0a 20 20 20 20 7d 0a  esult+i);.    }.
49f0: 20 20 7d 65 6c 73 65 20 69 66 28 20 65 44 65 73    }else if( eDes
4a00: 74 21 3d 53 52 54 5f 45 78 69 73 74 73 20 29 7b  t!=SRT_Exists ){
4a10: 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 64  .    /* If the d
4a20: 65 73 74 69 6e 61 74 69 6f 6e 20 69 73 20 61 6e  estination is an
4a30: 20 45 58 49 53 54 53 28 2e 2e 2e 29 20 65 78 70   EXISTS(...) exp
4a40: 72 65 73 73 69 6f 6e 2c 20 74 68 65 20 61 63 74  ression, the act
4a50: 75 61 6c 0a 20 20 20 20 2a 2a 20 76 61 6c 75 65  ual.    ** value
4a60: 73 20 72 65 74 75 72 6e 65 64 20 62 79 20 74 68  s returned by th
4a70: 65 20 53 45 4c 45 43 54 20 61 72 65 20 6e 6f 74  e SELECT are not
4a80: 20 72 65 71 75 69 72 65 64 2e 0a 20 20 20 20 2a   required..    *
4a90: 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70  /.    sqlite3Exp
4aa0: 72 43 6f 64 65 45 78 70 72 4c 69 73 74 28 70 50  rCodeExprList(pP
4ab0: 61 72 73 65 2c 20 70 45 4c 69 73 74 2c 20 72 65  arse, pEList, re
4ac0: 67 52 65 73 75 6c 74 2c 20 65 44 65 73 74 3d 3d  gResult, eDest==
4ad0: 53 52 54 5f 43 61 6c 6c 62 61 63 6b 29 3b 0a 20  SRT_Callback);. 
4ae0: 20 7d 0a 20 20 6e 43 6f 6c 75 6d 6e 20 3d 20 6e   }.  nColumn = n
4af0: 52 65 73 75 6c 74 43 6f 6c 3b 0a 0a 20 20 2f 2a  ResultCol;..  /*
4b00: 20 49 66 20 74 68 65 20 44 49 53 54 49 4e 43 54   If the DISTINCT
4b10: 20 6b 65 79 77 6f 72 64 20 77 61 73 20 70 72 65   keyword was pre
4b20: 73 65 6e 74 20 6f 6e 20 74 68 65 20 53 45 4c 45  sent on the SELE
4b30: 43 54 20 73 74 61 74 65 6d 65 6e 74 0a 20 20 2a  CT statement.  *
4b40: 2a 20 61 6e 64 20 74 68 69 73 20 72 6f 77 20 68  * and this row h
4b50: 61 73 20 62 65 65 6e 20 73 65 65 6e 20 62 65 66  as been seen bef
4b60: 6f 72 65 2c 20 74 68 65 6e 20 64 6f 20 6e 6f 74  ore, then do not
4b70: 20 6d 61 6b 65 20 74 68 69 73 20 72 6f 77 0a 20   make this row. 
4b80: 20 2a 2a 20 70 61 72 74 20 6f 66 20 74 68 65 20   ** part of the 
4b90: 72 65 73 75 6c 74 2e 0a 20 20 2a 2f 0a 20 20 69  result..  */.  i
4ba0: 66 28 20 68 61 73 44 69 73 74 69 6e 63 74 20 29  f( hasDistinct )
4bb0: 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 45  {.    assert( pE
4bc0: 4c 69 73 74 21 3d 30 20 29 3b 0a 20 20 20 20 61  List!=0 );.    a
4bd0: 73 73 65 72 74 28 20 70 45 4c 69 73 74 2d 3e 6e  ssert( pEList->n
4be0: 45 78 70 72 3d 3d 6e 43 6f 6c 75 6d 6e 20 29 3b  Expr==nColumn );
4bf0: 0a 20 20 20 20 63 6f 64 65 44 69 73 74 69 6e 63  .    codeDistinc
4c00: 74 28 70 50 61 72 73 65 2c 20 64 69 73 74 69 6e  t(pParse, distin
4c10: 63 74 2c 20 69 43 6f 6e 74 69 6e 75 65 2c 20 6e  ct, iContinue, n
4c20: 43 6f 6c 75 6d 6e 2c 20 72 65 67 52 65 73 75 6c  Column, regResul
4c30: 74 29 3b 0a 20 20 20 20 69 66 28 20 70 4f 72 64  t);.    if( pOrd
4c40: 65 72 42 79 3d 3d 30 20 29 7b 0a 20 20 20 20 20  erBy==0 ){.     
4c50: 20 63 6f 64 65 4f 66 66 73 65 74 28 76 2c 20 70   codeOffset(v, p
4c60: 2c 20 69 43 6f 6e 74 69 6e 75 65 29 3b 0a 20 20  , iContinue);.  
4c70: 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20 63    }.  }..  if( c
4c80: 68 65 63 6b 46 6f 72 4d 75 6c 74 69 43 6f 6c 75  heckForMultiColu
4c90: 6d 6e 53 65 6c 65 63 74 45 72 72 6f 72 28 70 50  mnSelectError(pP
4ca0: 61 72 73 65 2c 20 70 44 65 73 74 2c 20 70 45 4c  arse, pDest, pEL
4cb0: 69 73 74 2d 3e 6e 45 78 70 72 29 20 29 7b 0a 20  ist->nExpr) ){. 
4cc0: 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 0a     return;.  }..
4cd0: 20 20 73 77 69 74 63 68 28 20 65 44 65 73 74 20    switch( eDest 
4ce0: 29 7b 0a 20 20 20 20 2f 2a 20 49 6e 20 74 68 69  ){.    /* In thi
4cf0: 73 20 6d 6f 64 65 2c 20 77 72 69 74 65 20 65 61  s mode, write ea
4d00: 63 68 20 71 75 65 72 79 20 72 65 73 75 6c 74 20  ch query result 
4d10: 74 6f 20 74 68 65 20 6b 65 79 20 6f 66 20 74 68  to the key of th
4d20: 65 20 74 65 6d 70 6f 72 61 72 79 0a 20 20 20 20  e temporary.    
4d30: 2a 2a 20 74 61 62 6c 65 20 69 50 61 72 6d 2e 0a  ** table iParm..
4d40: 20 20 20 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53      */.#ifndef S
4d50: 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f 4d 50 4f  QLITE_OMIT_COMPO
4d60: 55 4e 44 5f 53 45 4c 45 43 54 0a 20 20 20 20 63  UND_SELECT.    c
4d70: 61 73 65 20 53 52 54 5f 55 6e 69 6f 6e 3a 20 7b  ase SRT_Union: {
4d80: 0a 20 20 20 20 20 20 69 6e 74 20 72 31 3b 0a 20  .      int r1;. 
4d90: 20 20 20 20 20 72 31 20 3d 20 73 71 6c 69 74 65       r1 = sqlite
4da0: 33 47 65 74 54 65 6d 70 52 65 67 28 70 50 61 72  3GetTempReg(pPar
4db0: 73 65 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  se);.      sqlit
4dc0: 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
4dd0: 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20 72  OP_MakeRecord, r
4de0: 65 67 52 65 73 75 6c 74 2c 20 6e 43 6f 6c 75 6d  egResult, nColum
4df0: 6e 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 69 66  n, r1);.      if
4e00: 28 20 61 66 66 20 29 7b 0a 20 20 20 20 20 20 20  ( aff ){.       
4e10: 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e   sqlite3VdbeChan
4e20: 67 65 50 34 28 76 2c 20 2d 31 2c 20 61 66 66 2c  geP4(v, -1, aff,
4e30: 20 50 34 5f 53 54 41 54 49 43 29 3b 0a 20 20 20   P4_STATIC);.   
4e40: 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74     }.      sqlit
4e50: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
4e60: 4f 50 5f 49 64 78 49 6e 73 65 72 74 2c 20 69 50  OP_IdxInsert, iP
4e70: 61 72 6d 2c 20 72 31 29 3b 0a 20 20 20 20 20 20  arm, r1);.      
4e80: 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65  sqlite3ReleaseTe
4e90: 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 31  mpReg(pParse, r1
4ea0: 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
4eb0: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 6f      }..    /* Co
4ec0: 6e 73 74 72 75 63 74 20 61 20 72 65 63 6f 72 64  nstruct a record
4ed0: 20 66 72 6f 6d 20 74 68 65 20 71 75 65 72 79 20   from the query 
4ee0: 72 65 73 75 6c 74 2c 20 62 75 74 20 69 6e 73 74  result, but inst
4ef0: 65 61 64 20 6f 66 0a 20 20 20 20 2a 2a 20 73 61  ead of.    ** sa
4f00: 76 69 6e 67 20 74 68 61 74 20 72 65 63 6f 72 64  ving that record
4f10: 2c 20 75 73 65 20 69 74 20 61 73 20 61 20 6b 65  , use it as a ke
4f20: 79 20 74 6f 20 64 65 6c 65 74 65 20 65 6c 65 6d  y to delete elem
4f30: 65 6e 74 73 20 66 72 6f 6d 0a 20 20 20 20 2a 2a  ents from.    **
4f40: 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79 20 74   the temporary t
4f50: 61 62 6c 65 20 69 50 61 72 6d 2e 0a 20 20 20 20  able iParm..    
4f60: 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f  */.    case SRT_
4f70: 45 78 63 65 70 74 3a 20 7b 0a 20 20 20 20 20 20  Except: {.      
4f80: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
4f90: 33 28 76 2c 20 4f 50 5f 49 64 78 44 65 6c 65 74  3(v, OP_IdxDelet
4fa0: 65 2c 20 69 50 61 72 6d 2c 20 72 65 67 52 65 73  e, iParm, regRes
4fb0: 75 6c 74 2c 20 6e 43 6f 6c 75 6d 6e 29 3b 0a 20  ult, nColumn);. 
4fc0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
4fd0: 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 2f 2a  }.#endif..    /*
4fe0: 20 53 74 6f 72 65 20 74 68 65 20 72 65 73 75 6c   Store the resul
4ff0: 74 20 61 73 20 64 61 74 61 20 75 73 69 6e 67 20  t as data using 
5000: 61 20 75 6e 69 71 75 65 20 6b 65 79 2e 0a 20 20  a unique key..  
5010: 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 52    */.    case SR
5020: 54 5f 54 61 62 6c 65 3a 0a 20 20 20 20 63 61 73  T_Table:.    cas
5030: 65 20 53 52 54 5f 45 70 68 65 6d 54 61 62 3a 20  e SRT_EphemTab: 
5040: 7b 0a 20 20 20 20 20 20 69 6e 74 20 72 31 20 3d  {.      int r1 =
5050: 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52   sqlite3GetTempR
5060: 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20  eg(pParse);.    
5070: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
5080: 4f 70 33 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65  Op3(v, OP_MakeRe
5090: 63 6f 72 64 2c 20 72 65 67 52 65 73 75 6c 74 2c  cord, regResult,
50a0: 20 6e 43 6f 6c 75 6d 6e 2c 20 72 31 29 3b 0a 20   nColumn, r1);. 
50b0: 20 20 20 20 20 69 66 28 20 70 4f 72 64 65 72 42       if( pOrderB
50c0: 79 20 29 7b 0a 20 20 20 20 20 20 20 20 70 75 73  y ){.        pus
50d0: 68 4f 6e 74 6f 53 6f 72 74 65 72 28 70 50 61 72  hOntoSorter(pPar
50e0: 73 65 2c 20 70 4f 72 64 65 72 42 79 2c 20 70 2c  se, pOrderBy, p,
50f0: 20 72 31 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73   r1);.      }els
5100: 65 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 72  e{.        int r
5110: 32 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65  2 = sqlite3GetTe
5120: 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20  mpReg(pParse);. 
5130: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
5140: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e  beAddOp2(v, OP_N
5150: 65 77 52 6f 77 69 64 2c 20 69 50 61 72 6d 2c 20  ewRowid, iParm, 
5160: 72 32 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  r2);.        sql
5170: 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
5180: 2c 20 4f 50 5f 49 6e 73 65 72 74 2c 20 69 50 61  , OP_Insert, iPa
5190: 72 6d 2c 20 72 31 2c 20 72 32 29 3b 0a 20 20 20  rm, r1, r2);.   
51a0: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
51b0: 43 68 61 6e 67 65 50 35 28 76 2c 20 4f 50 46 4c  ChangeP5(v, OPFL
51c0: 41 47 5f 41 50 50 45 4e 44 29 3b 0a 20 20 20 20  AG_APPEND);.    
51d0: 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61      sqlite3Relea
51e0: 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65  seTempReg(pParse
51f0: 2c 20 72 32 29 3b 0a 20 20 20 20 20 20 7d 0a 20  , r2);.      }. 
5200: 20 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65       sqlite3Rele
5210: 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73  aseTempReg(pPars
5220: 65 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 62 72  e, r1);.      br
5230: 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 23 69 66 6e  eak;.    }..#ifn
5240: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
5250: 53 55 42 51 55 45 52 59 0a 20 20 20 20 2f 2a 20  SUBQUERY.    /* 
5260: 49 66 20 77 65 20 61 72 65 20 63 72 65 61 74 69  If we are creati
5270: 6e 67 20 61 20 73 65 74 20 66 6f 72 20 61 6e 20  ng a set for an 
5280: 22 65 78 70 72 20 49 4e 20 28 53 45 4c 45 43 54  "expr IN (SELECT
5290: 20 2e 2e 2e 29 22 20 63 6f 6e 73 74 72 75 63 74   ...)" construct
52a0: 2c 0a 20 20 20 20 2a 2a 20 74 68 65 6e 20 74 68  ,.    ** then th
52b0: 65 72 65 20 73 68 6f 75 6c 64 20 62 65 20 61 20  ere should be a 
52c0: 73 69 6e 67 6c 65 20 69 74 65 6d 20 6f 6e 20 74  single item on t
52d0: 68 65 20 73 74 61 63 6b 2e 20 20 57 72 69 74 65  he stack.  Write
52e0: 20 74 68 69 73 0a 20 20 20 20 2a 2a 20 69 74 65   this.    ** ite
52f0: 6d 20 69 6e 74 6f 20 74 68 65 20 73 65 74 20 74  m into the set t
5300: 61 62 6c 65 20 77 69 74 68 20 62 6f 67 75 73 20  able with bogus 
5310: 64 61 74 61 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  data..    */.   
5320: 20 63 61 73 65 20 53 52 54 5f 53 65 74 3a 20 7b   case SRT_Set: {
5330: 0a 20 20 20 20 20 20 69 6e 74 20 61 64 64 72 32  .      int addr2
5340: 3b 0a 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ;..      assert(
5350: 20 6e 43 6f 6c 75 6d 6e 3d 3d 31 20 29 3b 0a 20   nColumn==1 );. 
5360: 20 20 20 20 20 61 64 64 72 32 20 3d 20 73 71 6c       addr2 = sql
5370: 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76  ite3VdbeAddOp1(v
5380: 2c 20 4f 50 5f 49 73 4e 75 6c 6c 2c 20 72 65 67  , OP_IsNull, reg
5390: 52 65 73 75 6c 74 29 3b 0a 20 20 20 20 20 20 70  Result);.      p
53a0: 2d 3e 61 66 66 69 6e 69 74 79 20 3d 20 73 71 6c  ->affinity = sql
53b0: 69 74 65 33 43 6f 6d 70 61 72 65 41 66 66 69 6e  ite3CompareAffin
53c0: 69 74 79 28 70 45 4c 69 73 74 2d 3e 61 5b 30 5d  ity(pEList->a[0]
53d0: 2e 70 45 78 70 72 2c 20 70 44 65 73 74 2d 3e 61  .pExpr, pDest->a
53e0: 66 66 69 6e 69 74 79 29 3b 0a 20 20 20 20 20 20  ffinity);.      
53f0: 69 66 28 20 70 4f 72 64 65 72 42 79 20 29 7b 0a  if( pOrderBy ){.
5400: 20 20 20 20 20 20 20 20 2f 2a 20 41 74 20 66 69          /* At fi
5410: 72 73 74 20 67 6c 61 6e 63 65 20 79 6f 75 20 77  rst glance you w
5420: 6f 75 6c 64 20 74 68 69 6e 6b 20 77 65 20 63 6f  ould think we co
5430: 75 6c 64 20 6f 70 74 69 6d 69 7a 65 20 6f 75 74  uld optimize out
5440: 20 74 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20   the.        ** 
5450: 4f 52 44 45 52 20 42 59 20 69 6e 20 74 68 69 73  ORDER BY in this
5460: 20 63 61 73 65 20 73 69 6e 63 65 20 74 68 65 20   case since the 
5470: 6f 72 64 65 72 20 6f 66 20 65 6e 74 72 69 65 73  order of entries
5480: 20 69 6e 20 74 68 65 20 73 65 74 0a 20 20 20 20   in the set.    
5490: 20 20 20 20 2a 2a 20 64 6f 65 73 20 6e 6f 74 20      ** does not 
54a0: 6d 61 74 74 65 72 2e 20 20 42 75 74 20 74 68 65  matter.  But the
54b0: 72 65 20 6d 69 67 68 74 20 62 65 20 61 20 4c 49  re might be a LI
54c0: 4d 49 54 20 63 6c 61 75 73 65 2c 20 69 6e 20 77  MIT clause, in w
54d0: 68 69 63 68 0a 20 20 20 20 20 20 20 20 2a 2a 20  hich.        ** 
54e0: 63 61 73 65 20 74 68 65 20 6f 72 64 65 72 20 64  case the order d
54f0: 6f 65 73 20 6d 61 74 74 65 72 20 2a 2f 0a 20 20  oes matter */.  
5500: 20 20 20 20 20 20 70 75 73 68 4f 6e 74 6f 53 6f        pushOntoSo
5510: 72 74 65 72 28 70 50 61 72 73 65 2c 20 70 4f 72  rter(pParse, pOr
5520: 64 65 72 42 79 2c 20 70 2c 20 72 65 67 52 65 73  derBy, p, regRes
5530: 75 6c 74 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  ult);.      }els
5540: 65 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 72  e{.        int r
5550: 31 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65  1 = sqlite3GetTe
5560: 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20  mpReg(pParse);. 
5570: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
5580: 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 4d  beAddOp4(v, OP_M
5590: 61 6b 65 52 65 63 6f 72 64 2c 20 72 65 67 52 65  akeRecord, regRe
55a0: 73 75 6c 74 2c 20 31 2c 20 72 31 2c 20 26 70 2d  sult, 1, r1, &p-
55b0: 3e 61 66 66 69 6e 69 74 79 2c 20 31 29 3b 0a 20  >affinity, 1);. 
55c0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78         sqlite3Ex
55d0: 70 72 43 61 63 68 65 41 66 66 69 6e 69 74 79 43  prCacheAffinityC
55e0: 68 61 6e 67 65 28 70 50 61 72 73 65 2c 20 72 65  hange(pParse, re
55f0: 67 52 65 73 75 6c 74 2c 20 31 29 3b 0a 20 20 20  gResult, 1);.   
5600: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
5610: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 64 78  AddOp2(v, OP_Idx
5620: 49 6e 73 65 72 74 2c 20 69 50 61 72 6d 2c 20 72  Insert, iParm, r
5630: 31 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  1);.        sqli
5640: 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65  te3ReleaseTempRe
5650: 67 28 70 50 61 72 73 65 2c 20 72 31 29 3b 0a 20  g(pParse, r1);. 
5660: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c       }.      sql
5670: 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65  ite3VdbeJumpHere
5680: 28 76 2c 20 61 64 64 72 32 29 3b 0a 20 20 20 20  (v, addr2);.    
5690: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a    break;.    }..
56a0: 20 20 20 20 2f 2a 20 49 66 20 61 6e 79 20 72 6f      /* If any ro
56b0: 77 20 65 78 69 73 74 20 69 6e 20 74 68 65 20 72  w exist in the r
56c0: 65 73 75 6c 74 20 73 65 74 2c 20 72 65 63 6f 72  esult set, recor
56d0: 64 20 74 68 61 74 20 66 61 63 74 20 61 6e 64 20  d that fact and 
56e0: 61 62 6f 72 74 2e 0a 20 20 20 20 2a 2f 0a 20 20  abort..    */.  
56f0: 20 20 63 61 73 65 20 53 52 54 5f 45 78 69 73 74    case SRT_Exist
5700: 73 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  s: {.      sqlit
5710: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
5720: 4f 50 5f 49 6e 74 65 67 65 72 2c 20 31 2c 20 69  OP_Integer, 1, i
5730: 50 61 72 6d 29 3b 0a 20 20 20 20 20 20 2f 2a 20  Parm);.      /* 
5740: 54 68 65 20 4c 49 4d 49 54 20 63 6c 61 75 73 65  The LIMIT clause
5750: 20 77 69 6c 6c 20 74 65 72 6d 69 6e 61 74 65 20   will terminate 
5760: 74 68 65 20 6c 6f 6f 70 20 66 6f 72 20 75 73 20  the loop for us 
5770: 2a 2f 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  */.      break;.
5780: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66      }..    /* If
5790: 20 74 68 69 73 20 69 73 20 61 20 73 63 61 6c 61   this is a scala
57a0: 72 20 73 65 6c 65 63 74 20 74 68 61 74 20 69 73  r select that is
57b0: 20 70 61 72 74 20 6f 66 20 61 6e 20 65 78 70 72   part of an expr
57c0: 65 73 73 69 6f 6e 2c 20 74 68 65 6e 0a 20 20 20  ession, then.   
57d0: 20 2a 2a 20 73 74 6f 72 65 20 74 68 65 20 72 65   ** store the re
57e0: 73 75 6c 74 73 20 69 6e 20 74 68 65 20 61 70 70  sults in the app
57f0: 72 6f 70 72 69 61 74 65 20 6d 65 6d 6f 72 79 20  ropriate memory 
5800: 63 65 6c 6c 20 61 6e 64 20 62 72 65 61 6b 20 6f  cell and break o
5810: 75 74 0a 20 20 20 20 2a 2a 20 6f 66 20 74 68 65  ut.    ** of the
5820: 20 73 63 61 6e 20 6c 6f 6f 70 2e 0a 20 20 20 20   scan loop..    
5830: 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f  */.    case SRT_
5840: 4d 65 6d 3a 20 7b 0a 20 20 20 20 20 20 61 73 73  Mem: {.      ass
5850: 65 72 74 28 20 6e 43 6f 6c 75 6d 6e 3d 3d 31 20  ert( nColumn==1 
5860: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4f 72  );.      if( pOr
5870: 64 65 72 42 79 20 29 7b 0a 20 20 20 20 20 20 20  derBy ){.       
5880: 20 70 75 73 68 4f 6e 74 6f 53 6f 72 74 65 72 28   pushOntoSorter(
5890: 70 50 61 72 73 65 2c 20 70 4f 72 64 65 72 42 79  pParse, pOrderBy
58a0: 2c 20 70 2c 20 72 65 67 52 65 73 75 6c 74 29 3b  , p, regResult);
58b0: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
58c0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
58d0: 72 43 6f 64 65 4d 6f 76 65 28 70 50 61 72 73 65  rCodeMove(pParse
58e0: 2c 20 72 65 67 52 65 73 75 6c 74 2c 20 69 50 61  , regResult, iPa
58f0: 72 6d 29 3b 0a 20 20 20 20 20 20 20 20 2f 2a 20  rm);.        /* 
5900: 54 68 65 20 4c 49 4d 49 54 20 63 6c 61 75 73 65  The LIMIT clause
5910: 20 77 69 6c 6c 20 6a 75 6d 70 20 6f 75 74 20 6f   will jump out o
5920: 66 20 74 68 65 20 6c 6f 6f 70 20 66 6f 72 20 75  f the loop for u
5930: 73 20 2a 2f 0a 20 20 20 20 20 20 7d 0a 20 20 20  s */.      }.   
5940: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
5950: 23 65 6e 64 69 66 20 2f 2a 20 23 69 66 6e 64 65  #endif /* #ifnde
5960: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55  f SQLITE_OMIT_SU
5970: 42 51 55 45 52 59 20 2a 2f 0a 0a 20 20 20 20 2f  BQUERY */..    /
5980: 2a 20 53 65 6e 64 20 74 68 65 20 64 61 74 61 20  * Send the data 
5990: 74 6f 20 74 68 65 20 63 61 6c 6c 62 61 63 6b 20  to the callback 
59a0: 66 75 6e 63 74 69 6f 6e 20 6f 72 20 74 6f 20 61  function or to a
59b0: 20 73 75 62 72 6f 75 74 69 6e 65 2e 20 20 49 6e   subroutine.  In
59c0: 20 74 68 65 0a 20 20 20 20 2a 2a 20 63 61 73 65   the.    ** case
59d0: 20 6f 66 20 61 20 73 75 62 72 6f 75 74 69 6e 65   of a subroutine
59e0: 2c 20 74 68 65 20 73 75 62 72 6f 75 74 69 6e 65  , the subroutine
59f0: 20 69 74 73 65 6c 66 20 69 73 20 72 65 73 70 6f   itself is respo
5a00: 6e 73 69 62 6c 65 20 66 6f 72 0a 20 20 20 20 2a  nsible for.    *
5a10: 2a 20 70 6f 70 70 69 6e 67 20 74 68 65 20 64 61  * popping the da
5a20: 74 61 20 66 72 6f 6d 20 74 68 65 20 73 74 61 63  ta from the stac
5a30: 6b 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61  k..    */.    ca
5a40: 73 65 20 53 52 54 5f 43 6f 72 6f 75 74 69 6e 65  se SRT_Coroutine
5a50: 3a 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f 43  :.    case SRT_C
5a60: 61 6c 6c 62 61 63 6b 3a 20 7b 0a 20 20 20 20 20  allback: {.     
5a70: 20 69 66 28 20 70 4f 72 64 65 72 42 79 20 29 7b   if( pOrderBy ){
5a80: 0a 20 20 20 20 20 20 20 20 69 6e 74 20 72 31 20  .        int r1 
5a90: 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70  = sqlite3GetTemp
5aa0: 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20 20  Reg(pParse);.   
5ab0: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
5ac0: 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4d 61 6b  AddOp3(v, OP_Mak
5ad0: 65 52 65 63 6f 72 64 2c 20 72 65 67 52 65 73 75  eRecord, regResu
5ae0: 6c 74 2c 20 6e 43 6f 6c 75 6d 6e 2c 20 72 31 29  lt, nColumn, r1)
5af0: 3b 0a 20 20 20 20 20 20 20 20 70 75 73 68 4f 6e  ;.        pushOn
5b00: 74 6f 53 6f 72 74 65 72 28 70 50 61 72 73 65 2c  toSorter(pParse,
5b10: 20 70 4f 72 64 65 72 42 79 2c 20 70 2c 20 72 31   pOrderBy, p, r1
5b20: 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
5b30: 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67  e3ReleaseTempReg
5b40: 28 70 50 61 72 73 65 2c 20 72 31 29 3b 0a 20 20  (pParse, r1);.  
5b50: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 65 44      }else if( eD
5b60: 65 73 74 3d 3d 53 52 54 5f 43 6f 72 6f 75 74 69  est==SRT_Corouti
5b70: 6e 65 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  ne ){.        sq
5b80: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28  lite3VdbeAddOp1(
5b90: 76 2c 20 4f 50 5f 59 69 65 6c 64 2c 20 70 44 65  v, OP_Yield, pDe
5ba0: 73 74 2d 3e 72 65 67 43 6f 72 6f 75 74 69 6e 65  st->regCoroutine
5bb0: 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
5bc0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
5bd0: 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
5be0: 52 65 73 75 6c 74 52 6f 77 2c 20 72 65 67 52 65  ResultRow, regRe
5bf0: 73 75 6c 74 2c 20 6e 43 6f 6c 75 6d 6e 29 3b 0a  sult, nColumn);.
5c00: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
5c10: 78 70 72 43 61 63 68 65 41 66 66 69 6e 69 74 79  xprCacheAffinity
5c20: 43 68 61 6e 67 65 28 70 50 61 72 73 65 2c 20 72  Change(pParse, r
5c30: 65 67 52 65 73 75 6c 74 2c 20 6e 43 6f 6c 75 6d  egResult, nColum
5c40: 6e 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  n);.      }.    
5c50: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a    break;.    }..
5c60: 23 69 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c  #if !defined(SQL
5c70: 49 54 45 5f 4f 4d 49 54 5f 54 52 49 47 47 45 52  ITE_OMIT_TRIGGER
5c80: 29 0a 20 20 20 20 2f 2a 20 44 69 73 63 61 72 64  ).    /* Discard
5c90: 20 74 68 65 20 72 65 73 75 6c 74 73 2e 20 20 54   the results.  T
5ca0: 68 69 73 20 69 73 20 75 73 65 64 20 66 6f 72 20  his is used for 
5cb0: 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
5cc0: 73 20 69 6e 73 69 64 65 0a 20 20 20 20 2a 2a 20  s inside.    ** 
5cd0: 74 68 65 20 62 6f 64 79 20 6f 66 20 61 20 54 52  the body of a TR
5ce0: 49 47 47 45 52 2e 20 20 54 68 65 20 70 75 72 70  IGGER.  The purp
5cf0: 6f 73 65 20 6f 66 20 73 75 63 68 20 73 65 6c 65  ose of such sele
5d00: 63 74 73 20 69 73 20 74 6f 20 63 61 6c 6c 0a 20  cts is to call. 
5d10: 20 20 20 2a 2a 20 75 73 65 72 2d 64 65 66 69 6e     ** user-defin
5d20: 65 64 20 66 75 6e 63 74 69 6f 6e 73 20 74 68 61  ed functions tha
5d30: 74 20 68 61 76 65 20 73 69 64 65 20 65 66 66 65  t have side effe
5d40: 63 74 73 2e 20 20 57 65 20 64 6f 20 6e 6f 74 20  cts.  We do not 
5d50: 63 61 72 65 0a 20 20 20 20 2a 2a 20 61 62 6f 75  care.    ** abou
5d60: 74 20 74 68 65 20 61 63 74 75 61 6c 20 72 65 73  t the actual res
5d70: 75 6c 74 73 20 6f 66 20 74 68 65 20 73 65 6c 65  ults of the sele
5d80: 63 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 64  ct..    */.    d
5d90: 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20 20 20  efault: {.      
5da0: 61 73 73 65 72 74 28 20 65 44 65 73 74 3d 3d 53  assert( eDest==S
5db0: 52 54 5f 44 69 73 63 61 72 64 20 29 3b 0a 20 20  RT_Discard );.  
5dc0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
5dd0: 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 0a 20 20 2f  .#endif.  }..  /
5de0: 2a 20 4a 75 6d 70 20 74 6f 20 74 68 65 20 65 6e  * Jump to the en
5df0: 64 20 6f 66 20 74 68 65 20 6c 6f 6f 70 20 69 66  d of the loop if
5e00: 20 74 68 65 20 4c 49 4d 49 54 20 69 73 20 72 65   the LIMIT is re
5e10: 61 63 68 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66  ached..  */.  if
5e20: 28 20 70 2d 3e 69 4c 69 6d 69 74 3e 3d 30 20 26  ( p->iLimit>=0 &
5e30: 26 20 70 4f 72 64 65 72 42 79 3d 3d 30 20 29 7b  & pOrderBy==0 ){
5e40: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
5e50: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 41 64 64  AddOp2(v, OP_Add
5e60: 49 6d 6d 2c 20 70 2d 3e 69 4c 69 6d 69 74 2c 20  Imm, p->iLimit, 
5e70: 2d 31 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  -1);.    sqlite3
5e80: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
5e90: 5f 49 66 5a 65 72 6f 2c 20 70 2d 3e 69 4c 69 6d  _IfZero, p->iLim
5ea0: 69 74 2c 20 69 42 72 65 61 6b 29 3b 0a 20 20 7d  it, iBreak);.  }
5eb0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20  .}../*.** Given 
5ec0: 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 69  an expression li
5ed0: 73 74 2c 20 67 65 6e 65 72 61 74 65 20 61 20 4b  st, generate a K
5ee0: 65 79 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65  eyInfo structure
5ef0: 20 74 68 61 74 20 72 65 63 6f 72 64 73 0a 2a 2a   that records.**
5f00: 20 74 68 65 20 63 6f 6c 6c 61 74 69 6e 67 20 73   the collating s
5f10: 65 71 75 65 6e 63 65 20 66 6f 72 20 65 61 63 68  equence for each
5f20: 20 65 78 70 72 65 73 73 69 6f 6e 20 69 6e 20 74   expression in t
5f30: 68 61 74 20 65 78 70 72 65 73 73 69 6f 6e 20 6c  hat expression l
5f40: 69 73 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  ist..**.** If th
5f50: 65 20 45 78 70 72 4c 69 73 74 20 69 73 20 61 6e  e ExprList is an
5f60: 20 4f 52 44 45 52 20 42 59 20 6f 72 20 47 52 4f   ORDER BY or GRO
5f70: 55 50 20 42 59 20 63 6c 61 75 73 65 20 74 68 65  UP BY clause the
5f80: 6e 20 74 68 65 20 72 65 73 75 6c 74 69 6e 67 0a  n the resulting.
5f90: 2a 2a 20 4b 65 79 49 6e 66 6f 20 73 74 72 75 63  ** KeyInfo struc
5fa0: 74 75 72 65 20 69 73 20 61 70 70 72 6f 70 72 69  ture is appropri
5fb0: 61 74 65 20 66 6f 72 20 69 6e 69 74 69 61 6c 69  ate for initiali
5fc0: 7a 69 6e 67 20 61 20 76 69 72 74 75 61 6c 20 69  zing a virtual i
5fd0: 6e 64 65 78 20 74 6f 0a 2a 2a 20 69 6d 70 6c 65  ndex to.** imple
5fe0: 6d 65 6e 74 20 74 68 61 74 20 63 6c 61 75 73 65  ment that clause
5ff0: 2e 20 20 49 66 20 74 68 65 20 45 78 70 72 4c 69  .  If the ExprLi
6000: 73 74 20 69 73 20 74 68 65 20 72 65 73 75 6c 74  st is the result
6010: 20 73 65 74 20 6f 66 20 61 20 53 45 4c 45 43 54   set of a SELECT
6020: 0a 2a 2a 20 74 68 65 6e 20 74 68 65 20 4b 65 79  .** then the Key
6030: 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65 20 69  Info structure i
6040: 73 20 61 70 70 72 6f 70 72 69 61 74 65 20 66 6f  s appropriate fo
6050: 72 20 69 6e 69 74 69 61 6c 69 7a 69 6e 67 20 61  r initializing a
6060: 20 76 69 72 74 75 61 6c 0a 2a 2a 20 69 6e 64 65   virtual.** inde
6070: 78 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 61  x to implement a
6080: 20 44 49 53 54 49 4e 43 54 20 74 65 73 74 2e 0a   DISTINCT test..
6090: 2a 2a 0a 2a 2a 20 53 70 61 63 65 20 74 6f 20 68  **.** Space to h
60a0: 6f 6c 64 20 74 68 65 20 4b 65 79 49 6e 66 6f 20  old the KeyInfo 
60b0: 73 74 72 75 63 74 75 72 65 20 69 73 20 6f 62 74  structure is obt
60c0: 61 69 6e 20 66 72 6f 6d 20 6d 61 6c 6c 6f 63 2e  ain from malloc.
60d0: 20 20 54 68 65 20 63 61 6c 6c 69 6e 67 0a 2a 2a    The calling.**
60e0: 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 72 65 73   function is res
60f0: 70 6f 6e 73 69 62 6c 65 20 66 6f 72 20 73 65 65  ponsible for see
6100: 69 6e 67 20 74 68 61 74 20 74 68 69 73 20 73 74  ing that this st
6110: 72 75 63 74 75 72 65 20 69 73 20 65 76 65 6e 74  ructure is event
6120: 75 61 6c 6c 79 0a 2a 2a 20 66 72 65 65 64 2e 20  ually.** freed. 
6130: 20 41 64 64 20 74 68 65 20 4b 65 79 49 6e 66 6f   Add the KeyInfo
6140: 20 73 74 72 75 63 74 75 72 65 20 74 6f 20 74 68   structure to th
6150: 65 20 50 34 20 66 69 65 6c 64 20 6f 66 20 61 6e  e P4 field of an
6160: 20 6f 70 63 6f 64 65 20 75 73 69 6e 67 0a 2a 2a   opcode using.**
6170: 20 50 34 5f 4b 45 59 49 4e 46 4f 5f 48 41 4e 44   P4_KEYINFO_HAND
6180: 4f 46 46 20 69 73 20 74 68 65 20 75 73 75 61 6c  OFF is the usual
6190: 20 77 61 79 20 6f 66 20 64 65 61 6c 69 6e 67 20   way of dealing 
61a0: 77 69 74 68 20 74 68 69 73 2e 0a 2a 2f 0a 73 74  with this..*/.st
61b0: 61 74 69 63 20 4b 65 79 49 6e 66 6f 20 2a 6b 65  atic KeyInfo *ke
61c0: 79 49 6e 66 6f 46 72 6f 6d 45 78 70 72 4c 69 73  yInfoFromExprLis
61d0: 74 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  t(Parse *pParse,
61e0: 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74   ExprList *pList
61f0: 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  ){.  sqlite3 *db
6200: 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20   = pParse->db;. 
6210: 20 69 6e 74 20 6e 45 78 70 72 3b 0a 20 20 4b 65   int nExpr;.  Ke
6220: 79 49 6e 66 6f 20 2a 70 49 6e 66 6f 3b 0a 20 20  yInfo *pInfo;.  
6230: 73 74 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f  struct ExprList_
6240: 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 69  item *pItem;.  i
6250: 6e 74 20 69 3b 0a 0a 20 20 6e 45 78 70 72 20 3d  nt i;..  nExpr =
6260: 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 0a 20   pList->nExpr;. 
6270: 20 70 49 6e 66 6f 20 3d 20 73 71 6c 69 74 65 33   pInfo = sqlite3
6280: 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c  DbMallocZero(db,
6290: 20 73 69 7a 65 6f 66 28 2a 70 49 6e 66 6f 29 20   sizeof(*pInfo) 
62a0: 2b 20 6e 45 78 70 72 2a 28 73 69 7a 65 6f 66 28  + nExpr*(sizeof(
62b0: 43 6f 6c 6c 53 65 71 2a 29 2b 31 29 20 29 3b 0a  CollSeq*)+1) );.
62c0: 20 20 69 66 28 20 70 49 6e 66 6f 20 29 7b 0a 20    if( pInfo ){. 
62d0: 20 20 20 70 49 6e 66 6f 2d 3e 61 53 6f 72 74 4f     pInfo->aSortO
62e0: 72 64 65 72 20 3d 20 28 75 38 2a 29 26 70 49 6e  rder = (u8*)&pIn
62f0: 66 6f 2d 3e 61 43 6f 6c 6c 5b 6e 45 78 70 72 5d  fo->aColl[nExpr]
6300: 3b 0a 20 20 20 20 70 49 6e 66 6f 2d 3e 6e 46 69  ;.    pInfo->nFi
6310: 65 6c 64 20 3d 20 6e 45 78 70 72 3b 0a 20 20 20  eld = nExpr;.   
6320: 20 70 49 6e 66 6f 2d 3e 65 6e 63 20 3d 20 45 4e   pInfo->enc = EN
6330: 43 28 64 62 29 3b 0a 20 20 20 20 66 6f 72 28 69  C(db);.    for(i
6340: 3d 30 2c 20 70 49 74 65 6d 3d 70 4c 69 73 74 2d  =0, pItem=pList-
6350: 3e 61 3b 20 69 3c 6e 45 78 70 72 3b 20 69 2b 2b  >a; i<nExpr; i++
6360: 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20  , pItem++){.    
6370: 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c    CollSeq *pColl
6380: 3b 0a 20 20 20 20 20 20 70 43 6f 6c 6c 20 3d 20  ;.      pColl = 
6390: 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c 53  sqlite3ExprCollS
63a0: 65 71 28 70 50 61 72 73 65 2c 20 70 49 74 65 6d  eq(pParse, pItem
63b0: 2d 3e 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20  ->pExpr);.      
63c0: 69 66 28 20 21 70 43 6f 6c 6c 20 29 7b 0a 20 20  if( !pColl ){.  
63d0: 20 20 20 20 20 20 70 43 6f 6c 6c 20 3d 20 64 62        pColl = db
63e0: 2d 3e 70 44 66 6c 74 43 6f 6c 6c 3b 0a 20 20 20  ->pDfltColl;.   
63f0: 20 20 20 7d 0a 20 20 20 20 20 20 70 49 6e 66 6f     }.      pInfo
6400: 2d 3e 61 43 6f 6c 6c 5b 69 5d 20 3d 20 70 43 6f  ->aColl[i] = pCo
6410: 6c 6c 3b 0a 20 20 20 20 20 20 70 49 6e 66 6f 2d  ll;.      pInfo-
6420: 3e 61 53 6f 72 74 4f 72 64 65 72 5b 69 5d 20 3d  >aSortOrder[i] =
6430: 20 70 49 74 65 6d 2d 3e 73 6f 72 74 4f 72 64 65   pItem->sortOrde
6440: 72 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72  r;.    }.  }.  r
6450: 65 74 75 72 6e 20 70 49 6e 66 6f 3b 0a 7d 0a 0a  eturn pInfo;.}..
6460: 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20 69 6e  ./*.** If the in
6470: 6e 65 72 20 6c 6f 6f 70 20 77 61 73 20 67 65 6e  ner loop was gen
6480: 65 72 61 74 65 64 20 75 73 69 6e 67 20 61 20 6e  erated using a n
6490: 6f 6e 2d 6e 75 6c 6c 20 70 4f 72 64 65 72 42 79  on-null pOrderBy
64a0: 20 61 72 67 75 6d 65 6e 74 2c 0a 2a 2a 20 74 68   argument,.** th
64b0: 65 6e 20 74 68 65 20 72 65 73 75 6c 74 73 20 77  en the results w
64c0: 65 72 65 20 70 6c 61 63 65 64 20 69 6e 20 61 20  ere placed in a 
64d0: 73 6f 72 74 65 72 2e 20 20 41 66 74 65 72 20 74  sorter.  After t
64e0: 68 65 20 6c 6f 6f 70 20 69 73 20 74 65 72 6d 69  he loop is termi
64f0: 6e 61 74 65 64 0a 2a 2a 20 77 65 20 6e 65 65 64  nated.** we need
6500: 20 74 6f 20 72 75 6e 20 74 68 65 20 73 6f 72 74   to run the sort
6510: 65 72 20 61 6e 64 20 6f 75 74 70 75 74 20 74 68  er and output th
6520: 65 20 72 65 73 75 6c 74 73 2e 20 20 54 68 65 20  e results.  The 
6530: 66 6f 6c 6c 6f 77 69 6e 67 0a 2a 2a 20 72 6f 75  following.** rou
6540: 74 69 6e 65 20 67 65 6e 65 72 61 74 65 73 20 74  tine generates t
6550: 68 65 20 63 6f 64 65 20 6e 65 65 64 65 64 20 74  he code needed t
6560: 6f 20 64 6f 20 74 68 61 74 2e 0a 2a 2f 0a 73 74  o do that..*/.st
6570: 61 74 69 63 20 76 6f 69 64 20 67 65 6e 65 72 61  atic void genera
6580: 74 65 53 6f 72 74 54 61 69 6c 28 0a 20 20 50 61  teSortTail(.  Pa
6590: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20  rse *pParse,    
65a0: 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65  /* Parsing conte
65b0: 78 74 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a  xt */.  Select *
65c0: 70 2c 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65  p,        /* The
65d0: 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
65e0: 74 20 2a 2f 0a 20 20 56 64 62 65 20 2a 76 2c 20  t */.  Vdbe *v, 
65f0: 20 20 20 20 20 20 20 20 20 2f 2a 20 47 65 6e 65           /* Gene
6600: 72 61 74 65 20 63 6f 64 65 20 69 6e 74 6f 20 74  rate code into t
6610: 68 69 73 20 56 44 42 45 20 2a 2f 0a 20 20 69 6e  his VDBE */.  in
6620: 74 20 6e 43 6f 6c 75 6d 6e 2c 20 20 20 20 20 20  t nColumn,      
6630: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 6f 6c  /* Number of col
6640: 75 6d 6e 73 20 6f 66 20 64 61 74 61 20 2a 2f 0a  umns of data */.
6650: 20 20 53 65 6c 65 63 74 44 65 73 74 20 2a 70 44    SelectDest *pD
6660: 65 73 74 20 2f 2a 20 57 72 69 74 65 20 74 68 65  est /* Write the
6670: 20 73 6f 72 74 65 64 20 72 65 73 75 6c 74 73 20   sorted results 
6680: 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  here */.){.  int
6690: 20 62 72 6b 20 3d 20 73 71 6c 69 74 65 33 56 64   brk = sqlite3Vd
66a0: 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a  beMakeLabel(v);.
66b0: 20 20 69 6e 74 20 63 6f 6e 74 20 3d 20 73 71 6c    int cont = sql
66c0: 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65  ite3VdbeMakeLabe
66d0: 6c 28 76 29 3b 0a 20 20 69 6e 74 20 61 64 64 72  l(v);.  int addr
66e0: 3b 0a 20 20 69 6e 74 20 69 54 61 62 3b 0a 20 20  ;.  int iTab;.  
66f0: 69 6e 74 20 70 73 65 75 64 6f 54 61 62 20 3d 20  int pseudoTab = 
6700: 30 3b 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70  0;.  ExprList *p
6710: 4f 72 64 65 72 42 79 20 3d 20 70 2d 3e 70 4f 72  OrderBy = p->pOr
6720: 64 65 72 42 79 3b 0a 0a 20 20 69 6e 74 20 65 44  derBy;..  int eD
6730: 65 73 74 20 3d 20 70 44 65 73 74 2d 3e 65 44 65  est = pDest->eDe
6740: 73 74 3b 0a 20 20 69 6e 74 20 69 50 61 72 6d 20  st;.  int iParm 
6750: 3d 20 70 44 65 73 74 2d 3e 69 50 61 72 6d 3b 0a  = pDest->iParm;.
6760: 0a 20 20 69 6e 74 20 72 65 67 52 6f 77 3b 0a 20  .  int regRow;. 
6770: 20 69 6e 74 20 72 65 67 52 6f 77 69 64 3b 0a 0a   int regRowid;..
6780: 20 20 69 54 61 62 20 3d 20 70 4f 72 64 65 72 42    iTab = pOrderB
6790: 79 2d 3e 69 45 43 75 72 73 6f 72 3b 0a 20 20 69  y->iECursor;.  i
67a0: 66 28 20 65 44 65 73 74 3d 3d 53 52 54 5f 43 61  f( eDest==SRT_Ca
67b0: 6c 6c 62 61 63 6b 20 7c 7c 20 65 44 65 73 74 3d  llback || eDest=
67c0: 3d 53 52 54 5f 43 6f 72 6f 75 74 69 6e 65 20 29  =SRT_Coroutine )
67d0: 7b 0a 20 20 20 20 70 73 65 75 64 6f 54 61 62 20  {.    pseudoTab 
67e0: 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b  = pParse->nTab++
67f0: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
6800: 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 53 65  eAddOp2(v, OP_Se
6810: 74 4e 75 6d 43 6f 6c 75 6d 6e 73 2c 20 30 2c 20  tNumColumns, 0, 
6820: 6e 43 6f 6c 75 6d 6e 29 3b 0a 20 20 20 20 73 71  nColumn);.    sq
6830: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
6840: 76 2c 20 4f 50 5f 4f 70 65 6e 50 73 65 75 64 6f  v, OP_OpenPseudo
6850: 2c 20 70 73 65 75 64 6f 54 61 62 2c 20 65 44 65  , pseudoTab, eDe
6860: 73 74 3d 3d 53 52 54 5f 43 61 6c 6c 62 61 63 6b  st==SRT_Callback
6870: 29 3b 0a 20 20 7d 0a 20 20 61 64 64 72 20 3d 20  );.  }.  addr = 
6880: 31 20 2b 20 73 71 6c 69 74 65 33 56 64 62 65 41  1 + sqlite3VdbeA
6890: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 53 6f 72 74  ddOp2(v, OP_Sort
68a0: 2c 20 69 54 61 62 2c 20 62 72 6b 29 3b 0a 20 20  , iTab, brk);.  
68b0: 63 6f 64 65 4f 66 66 73 65 74 28 76 2c 20 70 2c  codeOffset(v, p,
68c0: 20 63 6f 6e 74 29 3b 0a 20 20 72 65 67 52 6f 77   cont);.  regRow
68d0: 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d   = sqlite3GetTem
68e0: 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20  pReg(pParse);.  
68f0: 72 65 67 52 6f 77 69 64 20 3d 20 73 71 6c 69 74  regRowid = sqlit
6900: 65 33 47 65 74 54 65 6d 70 52 65 67 28 70 50 61  e3GetTempReg(pPa
6910: 72 73 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 56  rse);.  sqlite3V
6920: 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
6930: 43 6f 6c 75 6d 6e 2c 20 69 54 61 62 2c 20 70 4f  Column, iTab, pO
6940: 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 20 2b 20  rderBy->nExpr + 
6950: 31 2c 20 72 65 67 52 6f 77 29 3b 0a 20 20 73 77  1, regRow);.  sw
6960: 69 74 63 68 28 20 65 44 65 73 74 20 29 7b 0a 20  itch( eDest ){. 
6970: 20 20 20 63 61 73 65 20 53 52 54 5f 54 61 62 6c     case SRT_Tabl
6980: 65 3a 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f  e:.    case SRT_
6990: 45 70 68 65 6d 54 61 62 3a 20 7b 0a 20 20 20 20  EphemTab: {.    
69a0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
69b0: 4f 70 32 28 76 2c 20 4f 50 5f 4e 65 77 52 6f 77  Op2(v, OP_NewRow
69c0: 69 64 2c 20 69 50 61 72 6d 2c 20 72 65 67 52 6f  id, iParm, regRo
69d0: 77 69 64 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  wid);.      sqli
69e0: 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
69f0: 20 4f 50 5f 49 6e 73 65 72 74 2c 20 69 50 61 72   OP_Insert, iPar
6a00: 6d 2c 20 72 65 67 52 6f 77 2c 20 72 65 67 52 6f  m, regRow, regRo
6a10: 77 69 64 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  wid);.      sqli
6a20: 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 35 28  te3VdbeChangeP5(
6a30: 76 2c 20 4f 50 46 4c 41 47 5f 41 50 50 45 4e 44  v, OPFLAG_APPEND
6a40: 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
6a50: 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51      }.#ifndef SQ
6a60: 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45  LITE_OMIT_SUBQUE
6a70: 52 59 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f  RY.    case SRT_
6a80: 53 65 74 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74  Set: {.      int
6a90: 20 6a 31 3b 0a 20 20 20 20 20 20 61 73 73 65 72   j1;.      asser
6aa0: 74 28 20 6e 43 6f 6c 75 6d 6e 3d 3d 31 20 29 3b  t( nColumn==1 );
6ab0: 0a 20 20 20 20 20 20 6a 31 20 3d 20 73 71 6c 69  .      j1 = sqli
6ac0: 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c  te3VdbeAddOp1(v,
6ad0: 20 4f 50 5f 49 73 4e 75 6c 6c 2c 20 72 65 67 52   OP_IsNull, regR
6ae0: 6f 77 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  ow);.      sqlit
6af0: 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20  e3VdbeAddOp4(v, 
6b00: 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20 72  OP_MakeRecord, r
6b10: 65 67 52 6f 77 2c 20 31 2c 20 72 65 67 52 6f 77  egRow, 1, regRow
6b20: 69 64 2c 20 26 70 2d 3e 61 66 66 69 6e 69 74 79  id, &p->affinity
6b30: 2c 20 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  , 1);.      sqli
6b40: 74 65 33 45 78 70 72 43 61 63 68 65 41 66 66 69  te3ExprCacheAffi
6b50: 6e 69 74 79 43 68 61 6e 67 65 28 70 50 61 72 73  nityChange(pPars
6b60: 65 2c 20 72 65 67 52 6f 77 2c 20 31 29 3b 0a 20  e, regRow, 1);. 
6b70: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
6b80: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 64 78  AddOp2(v, OP_Idx
6b90: 49 6e 73 65 72 74 2c 20 69 50 61 72 6d 2c 20 72  Insert, iParm, r
6ba0: 65 67 52 6f 77 69 64 29 3b 0a 20 20 20 20 20 20  egRowid);.      
6bb0: 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48  sqlite3VdbeJumpH
6bc0: 65 72 65 28 76 2c 20 6a 31 29 3b 0a 20 20 20 20  ere(v, j1);.    
6bd0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
6be0: 20 20 20 63 61 73 65 20 53 52 54 5f 4d 65 6d 3a     case SRT_Mem:
6bf0: 20 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28   {.      assert(
6c00: 20 6e 43 6f 6c 75 6d 6e 3d 3d 31 20 29 3b 0a 20   nColumn==1 );. 
6c10: 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
6c20: 43 6f 64 65 4d 6f 76 65 28 70 50 61 72 73 65 2c  CodeMove(pParse,
6c30: 20 72 65 67 52 6f 77 2c 20 69 50 61 72 6d 29 3b   regRow, iParm);
6c40: 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20 4c 49  .      /* The LI
6c50: 4d 49 54 20 63 6c 61 75 73 65 20 77 69 6c 6c 20  MIT clause will 
6c60: 74 65 72 6d 69 6e 61 74 65 20 74 68 65 20 6c 6f  terminate the lo
6c70: 6f 70 20 66 6f 72 20 75 73 20 2a 2f 0a 20 20 20  op for us */.   
6c80: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
6c90: 23 65 6e 64 69 66 0a 20 20 20 20 63 61 73 65 20  #endif.    case 
6ca0: 53 52 54 5f 43 61 6c 6c 62 61 63 6b 3a 0a 20 20  SRT_Callback:.  
6cb0: 20 20 63 61 73 65 20 53 52 54 5f 43 6f 72 6f 75    case SRT_Corou
6cc0: 74 69 6e 65 3a 20 7b 0a 20 20 20 20 20 20 69 6e  tine: {.      in
6cd0: 74 20 69 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  t i;.      sqlit
6ce0: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
6cf0: 4f 50 5f 49 6e 74 65 67 65 72 2c 20 31 2c 20 72  OP_Integer, 1, r
6d00: 65 67 52 6f 77 69 64 29 3b 0a 20 20 20 20 20 20  egRowid);.      
6d10: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
6d20: 33 28 76 2c 20 4f 50 5f 49 6e 73 65 72 74 2c 20  3(v, OP_Insert, 
6d30: 70 73 65 75 64 6f 54 61 62 2c 20 72 65 67 52 6f  pseudoTab, regRo
6d40: 77 2c 20 72 65 67 52 6f 77 69 64 29 3b 0a 20 20  w, regRowid);.  
6d50: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e      for(i=0; i<n
6d60: 43 6f 6c 75 6d 6e 3b 20 69 2b 2b 29 7b 0a 20 20  Column; i++){.  
6d70: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 72 65        assert( re
6d80: 67 52 6f 77 21 3d 70 44 65 73 74 2d 3e 69 4d 65  gRow!=pDest->iMe
6d90: 6d 2b 69 20 29 3b 0a 20 20 20 20 20 20 20 20 73  m+i );.        s
6da0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
6db0: 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 70  (v, OP_Column, p
6dc0: 73 65 75 64 6f 54 61 62 2c 20 69 2c 20 70 44 65  seudoTab, i, pDe
6dd0: 73 74 2d 3e 69 4d 65 6d 2b 69 29 3b 0a 20 20 20  st->iMem+i);.   
6de0: 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 65     }.      if( e
6df0: 44 65 73 74 3d 3d 53 52 54 5f 43 61 6c 6c 62 61  Dest==SRT_Callba
6e00: 63 6b 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  ck ){.        sq
6e10: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
6e20: 76 2c 20 4f 50 5f 52 65 73 75 6c 74 52 6f 77 2c  v, OP_ResultRow,
6e30: 20 70 44 65 73 74 2d 3e 69 4d 65 6d 2c 20 6e 43   pDest->iMem, nC
6e40: 6f 6c 75 6d 6e 29 3b 0a 20 20 20 20 20 20 20 20  olumn);.        
6e50: 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65  sqlite3ExprCache
6e60: 41 66 66 69 6e 69 74 79 43 68 61 6e 67 65 28 70  AffinityChange(p
6e70: 50 61 72 73 65 2c 20 70 44 65 73 74 2d 3e 69 4d  Parse, pDest->iM
6e80: 65 6d 2c 20 6e 43 6f 6c 75 6d 6e 29 3b 0a 20 20  em, nColumn);.  
6e90: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 65 44      }else if( eD
6ea0: 65 73 74 3d 3d 53 52 54 5f 43 6f 72 6f 75 74 69  est==SRT_Corouti
6eb0: 6e 65 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  ne ){.        sq
6ec0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28  lite3VdbeAddOp1(
6ed0: 76 2c 20 4f 50 5f 59 69 65 6c 64 2c 20 70 44 65  v, OP_Yield, pDe
6ee0: 73 74 2d 3e 72 65 67 43 6f 72 6f 75 74 69 6e 65  st->regCoroutine
6ef0: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
6f00: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
6f10: 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20    default: {.   
6f20: 20 20 20 2f 2a 20 44 6f 20 6e 6f 74 68 69 6e 67     /* Do nothing
6f30: 20 2a 2f 0a 20 20 20 20 20 20 62 72 65 61 6b 3b   */.      break;
6f40: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c  .    }.  }.  sql
6f50: 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52  ite3ReleaseTempR
6f60: 65 67 28 70 50 61 72 73 65 2c 20 72 65 67 52 6f  eg(pParse, regRo
6f70: 77 29 3b 0a 20 20 73 71 6c 69 74 65 33 52 65 6c  w);.  sqlite3Rel
6f80: 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72  easeTempReg(pPar
6f90: 73 65 2c 20 72 65 67 52 6f 77 69 64 29 3b 0a 0a  se, regRowid);..
6fa0: 20 20 2f 2a 20 4a 75 6d 70 20 74 6f 20 74 68 65    /* Jump to the
6fb0: 20 65 6e 64 20 6f 66 20 74 68 65 20 6c 6f 6f 70   end of the loop
6fc0: 20 77 68 65 6e 20 74 68 65 20 4c 49 4d 49 54 20   when the LIMIT 
6fd0: 69 73 20 72 65 61 63 68 65 64 0a 20 20 2a 2f 0a  is reached.  */.
6fe0: 20 20 69 66 28 20 70 2d 3e 69 4c 69 6d 69 74 3e    if( p->iLimit>
6ff0: 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  =0 ){.    sqlite
7000: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
7010: 50 5f 41 64 64 49 6d 6d 2c 20 70 2d 3e 69 4c 69  P_AddImm, p->iLi
7020: 6d 69 74 2c 20 2d 31 29 3b 0a 20 20 20 20 73 71  mit, -1);.    sq
7030: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
7040: 76 2c 20 4f 50 5f 49 66 5a 65 72 6f 2c 20 70 2d  v, OP_IfZero, p-
7050: 3e 69 4c 69 6d 69 74 2c 20 62 72 6b 29 3b 0a 20  >iLimit, brk);. 
7060: 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 62 6f 74   }..  /* The bot
7070: 74 6f 6d 20 6f 66 20 74 68 65 20 6c 6f 6f 70 0a  tom of the loop.
7080: 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 56 64    */.  sqlite3Vd
7090: 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76  beResolveLabel(v
70a0: 2c 20 63 6f 6e 74 29 3b 0a 20 20 73 71 6c 69 74  , cont);.  sqlit
70b0: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
70c0: 4f 50 5f 4e 65 78 74 2c 20 69 54 61 62 2c 20 61  OP_Next, iTab, a
70d0: 64 64 72 29 3b 0a 20 20 73 71 6c 69 74 65 33 56  ddr);.  sqlite3V
70e0: 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28  dbeResolveLabel(
70f0: 76 2c 20 62 72 6b 29 3b 0a 20 20 69 66 28 20 65  v, brk);.  if( e
7100: 44 65 73 74 3d 3d 53 52 54 5f 43 61 6c 6c 62 61  Dest==SRT_Callba
7110: 63 6b 20 7c 7c 20 65 44 65 73 74 3d 3d 53 52 54  ck || eDest==SRT
7120: 5f 43 6f 72 6f 75 74 69 6e 65 20 29 7b 0a 20 20  _Coroutine ){.  
7130: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
7140: 4f 70 32 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c  Op2(v, OP_Close,
7150: 20 70 73 65 75 64 6f 54 61 62 2c 20 30 29 3b 0a   pseudoTab, 0);.
7160: 20 20 7d 0a 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65    }..}../*.** Re
7170: 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74  turn a pointer t
7180: 6f 20 61 20 73 74 72 69 6e 67 20 63 6f 6e 74 61  o a string conta
7190: 69 6e 69 6e 67 20 74 68 65 20 27 64 65 63 6c 61  ining the 'decla
71a0: 72 61 74 69 6f 6e 20 74 79 70 65 27 20 6f 66 20  ration type' of 
71b0: 74 68 65 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f  the.** expressio
71c0: 6e 20 70 45 78 70 72 2e 20 54 68 65 20 73 74 72  n pExpr. The str
71d0: 69 6e 67 20 6d 61 79 20 62 65 20 74 72 65 61 74  ing may be treat
71e0: 65 64 20 61 73 20 73 74 61 74 69 63 20 62 79 20  ed as static by 
71f0: 74 68 65 20 63 61 6c 6c 65 72 2e 0a 2a 2a 0a 2a  the caller..**.*
7200: 2a 20 54 68 65 20 64 65 63 6c 61 72 61 74 69 6f  * The declaratio
7210: 6e 20 74 79 70 65 20 69 73 20 74 68 65 20 65 78  n type is the ex
7220: 61 63 74 20 64 61 74 61 74 79 70 65 20 64 65 66  act datatype def
7230: 69 6e 69 74 69 6f 6e 20 65 78 74 72 61 63 74 65  inition extracte
7240: 64 20 66 72 6f 6d 20 74 68 65 0a 2a 2a 20 6f 72  d from the.** or
7250: 69 67 69 6e 61 6c 20 43 52 45 41 54 45 20 54 41  iginal CREATE TA
7260: 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 20 69 66  BLE statement if
7270: 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   the expression 
7280: 69 73 20 61 20 63 6f 6c 75 6d 6e 2e 20 54 68 65  is a column. The
7290: 0a 2a 2a 20 64 65 63 6c 61 72 61 74 69 6f 6e 20  .** declaration 
72a0: 74 79 70 65 20 66 6f 72 20 61 20 52 4f 57 49 44  type for a ROWID
72b0: 20 66 69 65 6c 64 20 69 73 20 49 4e 54 45 47 45   field is INTEGE
72c0: 52 2e 20 45 78 61 63 74 6c 79 20 77 68 65 6e 20  R. Exactly when 
72d0: 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 0a 2a 2a  an expression.**
72e0: 20 69 73 20 63 6f 6e 73 69 64 65 72 65 64 20 61   is considered a
72f0: 20 63 6f 6c 75 6d 6e 20 63 61 6e 20 62 65 20 63   column can be c
7300: 6f 6d 70 6c 65 78 20 69 6e 20 74 68 65 20 70 72  omplex in the pr
7310: 65 73 65 6e 63 65 20 6f 66 20 73 75 62 71 75 65  esence of subque
7320: 72 69 65 73 2e 20 54 68 65 0a 2a 2a 20 72 65 73  ries. The.** res
7330: 75 6c 74 2d 73 65 74 20 65 78 70 72 65 73 73 69  ult-set expressi
7340: 6f 6e 20 69 6e 20 61 6c 6c 20 6f 66 20 74 68 65  on in all of the
7350: 20 66 6f 6c 6c 6f 77 69 6e 67 20 53 45 4c 45 43   following SELEC
7360: 54 20 73 74 61 74 65 6d 65 6e 74 73 20 69 73 20  T statements is 
7370: 0a 2a 2a 20 63 6f 6e 73 69 64 65 72 65 64 20 61  .** considered a
7380: 20 63 6f 6c 75 6d 6e 20 62 79 20 74 68 69 73 20   column by this 
7390: 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20  function..**.** 
73a0: 20 20 53 45 4c 45 43 54 20 63 6f 6c 20 46 52 4f    SELECT col FRO
73b0: 4d 20 74 62 6c 3b 0a 2a 2a 20 20 20 53 45 4c 45  M tbl;.**   SELE
73c0: 43 54 20 28 53 45 4c 45 43 54 20 63 6f 6c 20 46  CT (SELECT col F
73d0: 52 4f 4d 20 74 62 6c 3b 0a 2a 2a 20 20 20 53 45  ROM tbl;.**   SE
73e0: 4c 45 43 54 20 28 53 45 4c 45 43 54 20 63 6f 6c  LECT (SELECT col
73f0: 20 46 52 4f 4d 20 74 62 6c 29 3b 0a 2a 2a 20 20   FROM tbl);.**  
7400: 20 53 45 4c 45 43 54 20 61 62 63 20 46 52 4f 4d   SELECT abc FROM
7410: 20 28 53 45 4c 45 43 54 20 63 6f 6c 20 41 53 20   (SELECT col AS 
7420: 61 62 63 20 46 52 4f 4d 20 74 62 6c 29 3b 0a 2a  abc FROM tbl);.*
7430: 2a 20 0a 2a 2a 20 54 68 65 20 64 65 63 6c 61 72  * .** The declar
7440: 61 74 69 6f 6e 20 74 79 70 65 20 66 6f 72 20 61  ation type for a
7450: 6e 79 20 65 78 70 72 65 73 73 69 6f 6e 20 6f 74  ny expression ot
7460: 68 65 72 20 74 68 61 6e 20 61 20 63 6f 6c 75 6d  her than a colum
7470: 6e 20 69 73 20 4e 55 4c 4c 2e 0a 2a 2f 0a 73 74  n is NULL..*/.st
7480: 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20  atic const char 
7490: 2a 63 6f 6c 75 6d 6e 54 79 70 65 28 0a 20 20 4e  *columnType(.  N
74a0: 61 6d 65 43 6f 6e 74 65 78 74 20 2a 70 4e 43 2c  ameContext *pNC,
74b0: 20 0a 20 20 45 78 70 72 20 2a 70 45 78 70 72 2c   .  Expr *pExpr,
74c0: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 2a  .  const char **
74d0: 70 7a 4f 72 69 67 69 6e 44 62 2c 0a 20 20 63 6f  pzOriginDb,.  co
74e0: 6e 73 74 20 63 68 61 72 20 2a 2a 70 7a 4f 72 69  nst char **pzOri
74f0: 67 69 6e 54 61 62 2c 0a 20 20 63 6f 6e 73 74 20  ginTab,.  const 
7500: 63 68 61 72 20 2a 2a 70 7a 4f 72 69 67 69 6e 43  char **pzOriginC
7510: 6f 6c 0a 29 7b 0a 20 20 63 68 61 72 20 63 6f 6e  ol.){.  char con
7520: 73 74 20 2a 7a 54 79 70 65 20 3d 20 30 3b 0a 20  st *zType = 0;. 
7530: 20 63 68 61 72 20 63 6f 6e 73 74 20 2a 7a 4f 72   char const *zOr
7540: 69 67 69 6e 44 62 20 3d 20 30 3b 0a 20 20 63 68  iginDb = 0;.  ch
7550: 61 72 20 63 6f 6e 73 74 20 2a 7a 4f 72 69 67 69  ar const *zOrigi
7560: 6e 54 61 62 20 3d 20 30 3b 0a 20 20 63 68 61 72  nTab = 0;.  char
7570: 20 63 6f 6e 73 74 20 2a 7a 4f 72 69 67 69 6e 43   const *zOriginC
7580: 6f 6c 20 3d 20 30 3b 0a 20 20 69 6e 74 20 6a 3b  ol = 0;.  int j;
7590: 0a 20 20 69 66 28 20 70 45 78 70 72 3d 3d 30 20  .  if( pExpr==0 
75a0: 7c 7c 20 70 4e 43 2d 3e 70 53 72 63 4c 69 73 74  || pNC->pSrcList
75b0: 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  ==0 ) return 0;.
75c0: 0a 20 20 73 77 69 74 63 68 28 20 70 45 78 70 72  .  switch( pExpr
75d0: 2d 3e 6f 70 20 29 7b 0a 20 20 20 20 63 61 73 65  ->op ){.    case
75e0: 20 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 3a 0a   TK_AGG_COLUMN:.
75f0: 20 20 20 20 63 61 73 65 20 54 4b 5f 43 4f 4c 55      case TK_COLU
7600: 4d 4e 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20 54  MN: {.      /* T
7610: 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73  he expression is
7620: 20 61 20 63 6f 6c 75 6d 6e 2e 20 4c 6f 63 61 74   a column. Locat
7630: 65 20 74 68 65 20 74 61 62 6c 65 20 74 68 65 20  e the table the 
7640: 63 6f 6c 75 6d 6e 20 69 73 20 62 65 69 6e 67 0a  column is being.
7650: 20 20 20 20 20 20 2a 2a 20 65 78 74 72 61 63 74        ** extract
7660: 65 64 20 66 72 6f 6d 20 69 6e 20 4e 61 6d 65 43  ed from in NameC
7670: 6f 6e 74 65 78 74 2e 70 53 72 63 4c 69 73 74 2e  ontext.pSrcList.
7680: 20 54 68 69 73 20 74 61 62 6c 65 20 6d 61 79 20   This table may 
7690: 62 65 20 72 65 61 6c 0a 20 20 20 20 20 20 2a 2a  be real.      **
76a0: 20 64 61 74 61 62 61 73 65 20 74 61 62 6c 65 20   database table 
76b0: 6f 72 20 61 20 73 75 62 71 75 65 72 79 2e 0a 20  or a subquery.. 
76c0: 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 54 61       */.      Ta
76d0: 62 6c 65 20 2a 70 54 61 62 20 3d 20 30 3b 20 20  ble *pTab = 0;  
76e0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 61 62            /* Tab
76f0: 6c 65 20 73 74 72 75 63 74 75 72 65 20 63 6f 6c  le structure col
7700: 75 6d 6e 20 69 73 20 65 78 74 72 61 63 74 65 64  umn is extracted
7710: 20 66 72 6f 6d 20 2a 2f 0a 20 20 20 20 20 20 53   from */.      S
7720: 65 6c 65 63 74 20 2a 70 53 20 3d 20 30 3b 20 20  elect *pS = 0;  
7730: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 65             /* Se
7740: 6c 65 63 74 20 74 68 65 20 63 6f 6c 75 6d 6e 20  lect the column 
7750: 69 73 20 65 78 74 72 61 63 74 65 64 20 66 72 6f  is extracted fro
7760: 6d 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 69  m */.      int i
7770: 43 6f 6c 20 3d 20 70 45 78 70 72 2d 3e 69 43 6f  Col = pExpr->iCo
7780: 6c 75 6d 6e 3b 20 20 2f 2a 20 49 6e 64 65 78 20  lumn;  /* Index 
7790: 6f 66 20 63 6f 6c 75 6d 6e 20 69 6e 20 70 54 61  of column in pTa
77a0: 62 20 2a 2f 0a 20 20 20 20 20 20 77 68 69 6c 65  b */.      while
77b0: 28 20 70 4e 43 20 26 26 20 21 70 54 61 62 20 29  ( pNC && !pTab )
77c0: 7b 0a 20 20 20 20 20 20 20 20 53 72 63 4c 69 73  {.        SrcLis
77d0: 74 20 2a 70 54 61 62 4c 69 73 74 20 3d 20 70 4e  t *pTabList = pN
77e0: 43 2d 3e 70 53 72 63 4c 69 73 74 3b 0a 20 20 20  C->pSrcList;.   
77f0: 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 6a 3c 70       for(j=0;j<p
7800: 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 20 26 26  TabList->nSrc &&
7810: 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 6a 5d 2e   pTabList->a[j].
7820: 69 43 75 72 73 6f 72 21 3d 70 45 78 70 72 2d 3e  iCursor!=pExpr->
7830: 69 54 61 62 6c 65 3b 6a 2b 2b 29 3b 0a 20 20 20  iTable;j++);.   
7840: 20 20 20 20 20 69 66 28 20 6a 3c 70 54 61 62 4c       if( j<pTabL
7850: 69 73 74 2d 3e 6e 53 72 63 20 29 7b 0a 20 20 20  ist->nSrc ){.   
7860: 20 20 20 20 20 20 20 70 54 61 62 20 3d 20 70 54         pTab = pT
7870: 61 62 4c 69 73 74 2d 3e 61 5b 6a 5d 2e 70 54 61  abList->a[j].pTa
7880: 62 3b 0a 20 20 20 20 20 20 20 20 20 20 70 53 20  b;.          pS 
7890: 3d 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 6a 5d  = pTabList->a[j]
78a0: 2e 70 53 65 6c 65 63 74 3b 0a 20 20 20 20 20 20  .pSelect;.      
78b0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
78c0: 20 20 20 70 4e 43 20 3d 20 70 4e 43 2d 3e 70 4e     pNC = pNC->pN
78d0: 65 78 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  ext;.        }. 
78e0: 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 69 66       }..      if
78f0: 28 20 70 54 61 62 3d 3d 30 20 29 7b 0a 20 20 20  ( pTab==0 ){.   
7900: 20 20 20 20 20 2f 2a 20 46 49 58 20 4d 45 3a 0a       /* FIX ME:.
7910: 20 20 20 20 20 20 20 20 2a 2a 20 54 68 69 73 20          ** This 
7920: 63 61 6e 20 6f 63 63 75 72 73 20 69 66 20 79 6f  can occurs if yo
7930: 75 20 68 61 76 65 20 73 6f 6d 65 74 68 69 6e 67  u have something
7940: 20 6c 69 6b 65 20 22 53 45 4c 45 43 54 20 6e 65   like "SELECT ne
7950: 77 2e 78 3b 22 20 69 6e 73 69 64 65 0a 20 20 20  w.x;" inside.   
7960: 20 20 20 20 20 2a 2a 20 61 20 74 72 69 67 67 65       ** a trigge
7970: 72 2e 20 20 49 6e 20 6f 74 68 65 72 20 77 6f 72  r.  In other wor
7980: 64 73 2c 20 69 66 20 79 6f 75 20 72 65 66 65 72  ds, if you refer
7990: 65 6e 63 65 20 74 68 65 20 73 70 65 63 69 61 6c  ence the special
79a0: 20 22 6e 65 77 22 0a 20 20 20 20 20 20 20 20 2a   "new".        *
79b0: 2a 20 74 61 62 6c 65 20 69 6e 20 74 68 65 20 72  * table in the r
79c0: 65 73 75 6c 74 20 73 65 74 20 6f 66 20 61 20 73  esult set of a s
79d0: 65 6c 65 63 74 2e 20 20 57 65 20 64 6f 20 6e 6f  elect.  We do no
79e0: 74 20 68 61 76 65 20 61 20 67 6f 6f 64 20 77 61  t have a good wa
79f0: 79 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 6f 20  y.        ** to 
7a00: 66 69 6e 64 20 74 68 65 20 61 63 74 75 61 6c 20  find the actual 
7a10: 74 61 62 6c 65 20 74 79 70 65 2c 20 73 6f 20 63  table type, so c
7a20: 61 6c 6c 20 69 74 20 22 54 45 58 54 22 2e 20 20  all it "TEXT".  
7a30: 54 68 69 73 20 69 73 20 72 65 61 6c 6c 79 0a 20  This is really. 
7a40: 20 20 20 20 20 20 20 2a 2a 20 73 6f 6d 65 74 68         ** someth
7a50: 69 6e 67 20 6f 66 20 61 20 62 75 67 2c 20 62 75  ing of a bug, bu
7a60: 74 20 49 20 64 6f 20 6e 6f 74 20 6b 6e 6f 77 20  t I do not know 
7a70: 68 6f 77 20 74 6f 20 66 69 78 20 69 74 2e 0a 20  how to fix it.. 
7a80: 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20         **.      
7a90: 20 20 2a 2a 20 54 68 69 73 20 63 6f 64 65 20 64    ** This code d
7aa0: 6f 65 73 20 6e 6f 74 20 70 72 6f 64 75 63 65 20  oes not produce 
7ab0: 74 68 65 20 63 6f 72 72 65 63 74 20 61 6e 73 77  the correct answ
7ac0: 65 72 20 2d 20 69 74 20 6a 75 73 74 20 70 72 65  er - it just pre
7ad0: 76 65 6e 74 73 0a 20 20 20 20 20 20 20 20 2a 2a  vents.        **
7ae0: 20 61 20 73 65 67 66 61 75 6c 74 2e 20 20 53 65   a segfault.  Se
7af0: 65 20 74 69 63 6b 65 74 20 23 31 32 32 39 2e 0a  e ticket #1229..
7b00: 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
7b10: 20 20 20 7a 54 79 70 65 20 3d 20 22 54 45 58 54     zType = "TEXT
7b20: 22 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b  ";.        break
7b30: 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20  ;.      }..     
7b40: 20 61 73 73 65 72 74 28 20 70 54 61 62 20 29 3b   assert( pTab );
7b50: 0a 20 20 20 20 20 20 69 66 28 20 70 53 20 29 7b  .      if( pS ){
7b60: 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20  .        /* The 
7b70: 22 74 61 62 6c 65 22 20 69 73 20 61 63 74 75 61  "table" is actua
7b80: 6c 6c 79 20 61 20 73 75 62 2d 73 65 6c 65 63 74  lly a sub-select
7b90: 20 6f 72 20 61 20 76 69 65 77 20 69 6e 20 74 68   or a view in th
7ba0: 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 0a 20 20  e FROM clause.  
7bb0: 20 20 20 20 20 20 2a 2a 20 6f 66 20 74 68 65 20        ** of the 
7bc0: 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
7bd0: 2e 20 52 65 74 75 72 6e 20 74 68 65 20 64 65 63  . Return the dec
7be0: 6c 61 72 61 74 69 6f 6e 20 74 79 70 65 20 61 6e  laration type an
7bf0: 64 20 6f 72 69 67 69 6e 0a 20 20 20 20 20 20 20  d origin.       
7c00: 20 2a 2a 20 64 61 74 61 20 66 6f 72 20 74 68 65   ** data for the
7c10: 20 72 65 73 75 6c 74 2d 73 65 74 20 63 6f 6c 75   result-set colu
7c20: 6d 6e 20 6f 66 20 74 68 65 20 73 75 62 2d 73 65  mn of the sub-se
7c30: 6c 65 63 74 2e 0a 20 20 20 20 20 20 20 20 2a 2f  lect..        */
7c40: 0a 20 20 20 20 20 20 20 20 69 66 28 20 69 43 6f  .        if( iCo
7c50: 6c 3e 3d 30 20 26 26 20 69 43 6f 6c 3c 70 53 2d  l>=0 && iCol<pS-
7c60: 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 20 29  >pEList->nExpr )
7c70: 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49  {.          /* I
7c80: 66 20 69 43 6f 6c 20 69 73 20 6c 65 73 73 20 74  f iCol is less t
7c90: 68 61 6e 20 7a 65 72 6f 2c 20 74 68 65 6e 20 74  han zero, then t
7ca0: 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 72 65  he expression re
7cb0: 71 75 65 73 74 73 20 74 68 65 0a 20 20 20 20 20  quests the.     
7cc0: 20 20 20 20 20 2a 2a 20 72 6f 77 69 64 20 6f 66       ** rowid of
7cd0: 20 74 68 65 20 73 75 62 2d 73 65 6c 65 63 74 20   the sub-select 
7ce0: 6f 72 20 76 69 65 77 2e 20 54 68 69 73 20 65 78  or view. This ex
7cf0: 70 72 65 73 73 69 6f 6e 20 69 73 20 6c 65 67 61  pression is lega
7d00: 6c 20 28 73 65 65 20 0a 20 20 20 20 20 20 20 20  l (see .        
7d10: 20 20 2a 2a 20 74 65 73 74 20 63 61 73 65 20 6d    ** test case m
7d20: 69 73 63 32 2e 32 2e 32 29 20 2d 20 69 74 20 61  isc2.2.2) - it a
7d30: 6c 77 61 79 73 20 65 76 61 6c 75 61 74 65 73 20  lways evaluates 
7d40: 74 6f 20 4e 55 4c 4c 2e 0a 20 20 20 20 20 20 20  to NULL..       
7d50: 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20     */.          
7d60: 4e 61 6d 65 43 6f 6e 74 65 78 74 20 73 4e 43 3b  NameContext sNC;
7d70: 0a 20 20 20 20 20 20 20 20 20 20 45 78 70 72 20  .          Expr 
7d80: 2a 70 20 3d 20 70 53 2d 3e 70 45 4c 69 73 74 2d  *p = pS->pEList-
7d90: 3e 61 5b 69 43 6f 6c 5d 2e 70 45 78 70 72 3b 0a  >a[iCol].pExpr;.
7da0: 20 20 20 20 20 20 20 20 20 20 73 4e 43 2e 70 53            sNC.pS
7db0: 72 63 4c 69 73 74 20 3d 20 70 53 2d 3e 70 53 72  rcList = pS->pSr
7dc0: 63 3b 0a 20 20 20 20 20 20 20 20 20 20 73 4e 43  c;.          sNC
7dd0: 2e 70 4e 65 78 74 20 3d 20 30 3b 0a 20 20 20 20  .pNext = 0;.    
7de0: 20 20 20 20 20 20 73 4e 43 2e 70 50 61 72 73 65        sNC.pParse
7df0: 20 3d 20 70 4e 43 2d 3e 70 50 61 72 73 65 3b 0a   = pNC->pParse;.
7e00: 20 20 20 20 20 20 20 20 20 20 7a 54 79 70 65 20            zType 
7e10: 3d 20 63 6f 6c 75 6d 6e 54 79 70 65 28 26 73 4e  = columnType(&sN
7e20: 43 2c 20 70 2c 20 26 7a 4f 72 69 67 69 6e 44 62  C, p, &zOriginDb
7e30: 2c 20 26 7a 4f 72 69 67 69 6e 54 61 62 2c 20 26  , &zOriginTab, &
7e40: 7a 4f 72 69 67 69 6e 43 6f 6c 29 3b 20 0a 20 20  zOriginCol); .  
7e50: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65        }.      }e
7e60: 6c 73 65 20 69 66 28 20 70 54 61 62 2d 3e 70 53  lse if( pTab->pS
7e70: 63 68 65 6d 61 20 29 7b 0a 20 20 20 20 20 20 20  chema ){.       
7e80: 20 2f 2a 20 41 20 72 65 61 6c 20 74 61 62 6c 65   /* A real table
7e90: 20 2a 2f 0a 20 20 20 20 20 20 20 20 61 73 73 65   */.        asse
7ea0: 72 74 28 20 21 70 53 20 29 3b 0a 20 20 20 20 20  rt( !pS );.     
7eb0: 20 20 20 69 66 28 20 69 43 6f 6c 3c 30 20 29 20     if( iCol<0 ) 
7ec0: 69 43 6f 6c 20 3d 20 70 54 61 62 2d 3e 69 50 4b  iCol = pTab->iPK
7ed0: 65 79 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65  ey;.        asse
7ee0: 72 74 28 20 69 43 6f 6c 3d 3d 2d 31 20 7c 7c 20  rt( iCol==-1 || 
7ef0: 28 69 43 6f 6c 3e 3d 30 20 26 26 20 69 43 6f 6c  (iCol>=0 && iCol
7f00: 3c 70 54 61 62 2d 3e 6e 43 6f 6c 29 20 29 3b 0a  <pTab->nCol) );.
7f10: 20 20 20 20 20 20 20 20 69 66 28 20 69 43 6f 6c          if( iCol
7f20: 3c 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  <0 ){.          
7f30: 7a 54 79 70 65 20 3d 20 22 49 4e 54 45 47 45 52  zType = "INTEGER
7f40: 22 3b 0a 20 20 20 20 20 20 20 20 20 20 7a 4f 72  ";.          zOr
7f50: 69 67 69 6e 43 6f 6c 20 3d 20 22 72 6f 77 69 64  iginCol = "rowid
7f60: 22 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  ";.        }else
7f70: 7b 0a 20 20 20 20 20 20 20 20 20 20 7a 54 79 70  {.          zTyp
7f80: 65 20 3d 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 69  e = pTab->aCol[i
7f90: 43 6f 6c 5d 2e 7a 54 79 70 65 3b 0a 20 20 20 20  Col].zType;.    
7fa0: 20 20 20 20 20 20 7a 4f 72 69 67 69 6e 43 6f 6c        zOriginCol
7fb0: 20 3d 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 43   = pTab->aCol[iC
7fc0: 6f 6c 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20  ol].zName;.     
7fd0: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7a 4f 72     }.        zOr
7fe0: 69 67 69 6e 54 61 62 20 3d 20 70 54 61 62 2d 3e  iginTab = pTab->
7ff0: 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20 20 20 69  zName;.        i
8000: 66 28 20 70 4e 43 2d 3e 70 50 61 72 73 65 20 29  f( pNC->pParse )
8010: 7b 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74 20  {.          int 
8020: 69 44 62 20 3d 20 73 71 6c 69 74 65 33 53 63 68  iDb = sqlite3Sch
8030: 65 6d 61 54 6f 49 6e 64 65 78 28 70 4e 43 2d 3e  emaToIndex(pNC->
8040: 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 54 61 62  pParse->db, pTab
8050: 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20 20 20  ->pSchema);.    
8060: 20 20 20 20 20 20 7a 4f 72 69 67 69 6e 44 62 20        zOriginDb 
8070: 3d 20 70 4e 43 2d 3e 70 50 61 72 73 65 2d 3e 64  = pNC->pParse->d
8080: 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a 4e 61 6d  b->aDb[iDb].zNam
8090: 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  e;.        }.   
80a0: 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b     }.      break
80b0: 3b 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20  ;.    }.#ifndef 
80c0: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51  SQLITE_OMIT_SUBQ
80d0: 55 45 52 59 0a 20 20 20 20 63 61 73 65 20 54 4b  UERY.    case TK
80e0: 5f 53 45 4c 45 43 54 3a 20 7b 0a 20 20 20 20 20  _SELECT: {.     
80f0: 20 2f 2a 20 54 68 65 20 65 78 70 72 65 73 73 69   /* The expressi
8100: 6f 6e 20 69 73 20 61 20 73 75 62 2d 73 65 6c 65  on is a sub-sele
8110: 63 74 2e 20 52 65 74 75 72 6e 20 74 68 65 20 64  ct. Return the d
8120: 65 63 6c 61 72 61 74 69 6f 6e 20 74 79 70 65 20  eclaration type 
8130: 61 6e 64 0a 20 20 20 20 20 20 2a 2a 20 6f 72 69  and.      ** ori
8140: 67 69 6e 20 69 6e 66 6f 20 66 6f 72 20 74 68 65  gin info for the
8150: 20 73 69 6e 67 6c 65 20 63 6f 6c 75 6d 6e 20 69   single column i
8160: 6e 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74  n the result set
8170: 20 6f 66 20 74 68 65 20 53 45 4c 45 43 54 0a 20   of the SELECT. 
8180: 20 20 20 20 20 2a 2a 20 73 74 61 74 65 6d 65 6e       ** statemen
8190: 74 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  t..      */.    
81a0: 20 20 4e 61 6d 65 43 6f 6e 74 65 78 74 20 73 4e    NameContext sN
81b0: 43 3b 0a 20 20 20 20 20 20 53 65 6c 65 63 74 20  C;.      Select 
81c0: 2a 70 53 20 3d 20 70 45 78 70 72 2d 3e 70 53 65  *pS = pExpr->pSe
81d0: 6c 65 63 74 3b 0a 20 20 20 20 20 20 45 78 70 72  lect;.      Expr
81e0: 20 2a 70 20 3d 20 70 53 2d 3e 70 45 4c 69 73 74   *p = pS->pEList
81f0: 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 3b 0a 20 20  ->a[0].pExpr;.  
8200: 20 20 20 20 73 4e 43 2e 70 53 72 63 4c 69 73 74      sNC.pSrcList
8210: 20 3d 20 70 53 2d 3e 70 53 72 63 3b 0a 20 20 20   = pS->pSrc;.   
8220: 20 20 20 73 4e 43 2e 70 4e 65 78 74 20 3d 20 70     sNC.pNext = p
8230: 4e 43 3b 0a 20 20 20 20 20 20 73 4e 43 2e 70 50  NC;.      sNC.pP
8240: 61 72 73 65 20 3d 20 70 4e 43 2d 3e 70 50 61 72  arse = pNC->pPar
8250: 73 65 3b 0a 20 20 20 20 20 20 7a 54 79 70 65 20  se;.      zType 
8260: 3d 20 63 6f 6c 75 6d 6e 54 79 70 65 28 26 73 4e  = columnType(&sN
8270: 43 2c 20 70 2c 20 26 7a 4f 72 69 67 69 6e 44 62  C, p, &zOriginDb
8280: 2c 20 26 7a 4f 72 69 67 69 6e 54 61 62 2c 20 26  , &zOriginTab, &
8290: 7a 4f 72 69 67 69 6e 43 6f 6c 29 3b 20 0a 20 20  zOriginCol); .  
82a0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
82b0: 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 20 20 0a 20  .#endif.  }.  . 
82c0: 20 69 66 28 20 70 7a 4f 72 69 67 69 6e 44 62 20   if( pzOriginDb 
82d0: 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
82e0: 7a 4f 72 69 67 69 6e 54 61 62 20 26 26 20 70 7a  zOriginTab && pz
82f0: 4f 72 69 67 69 6e 43 6f 6c 20 29 3b 0a 20 20 20  OriginCol );.   
8300: 20 2a 70 7a 4f 72 69 67 69 6e 44 62 20 3d 20 7a   *pzOriginDb = z
8310: 4f 72 69 67 69 6e 44 62 3b 0a 20 20 20 20 2a 70  OriginDb;.    *p
8320: 7a 4f 72 69 67 69 6e 54 61 62 20 3d 20 7a 4f 72  zOriginTab = zOr
8330: 69 67 69 6e 54 61 62 3b 0a 20 20 20 20 2a 70 7a  iginTab;.    *pz
8340: 4f 72 69 67 69 6e 43 6f 6c 20 3d 20 7a 4f 72 69  OriginCol = zOri
8350: 67 69 6e 43 6f 6c 3b 0a 20 20 7d 0a 20 20 72 65  ginCol;.  }.  re
8360: 74 75 72 6e 20 7a 54 79 70 65 3b 0a 7d 0a 0a 2f  turn zType;.}../
8370: 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f  *.** Generate co
8380: 64 65 20 74 68 61 74 20 77 69 6c 6c 20 74 65 6c  de that will tel
8390: 6c 20 74 68 65 20 56 44 42 45 20 74 68 65 20 64  l the VDBE the d
83a0: 65 63 6c 61 72 61 74 69 6f 6e 20 74 79 70 65 73  eclaration types
83b0: 20 6f 66 20 63 6f 6c 75 6d 6e 73 0a 2a 2a 20 69   of columns.** i
83c0: 6e 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74  n the result set
83d0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
83e0: 20 67 65 6e 65 72 61 74 65 43 6f 6c 75 6d 6e 54   generateColumnT
83f0: 79 70 65 73 28 0a 20 20 50 61 72 73 65 20 2a 70  ypes(.  Parse *p
8400: 50 61 72 73 65 2c 20 20 20 20 20 20 2f 2a 20 50  Parse,      /* P
8410: 61 72 73 65 72 20 63 6f 6e 74 65 78 74 20 2a 2f  arser context */
8420: 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 54 61 62  .  SrcList *pTab
8430: 4c 69 73 74 2c 20 20 2f 2a 20 4c 69 73 74 20 6f  List,  /* List o
8440: 66 20 74 61 62 6c 65 73 20 2a 2f 0a 20 20 45 78  f tables */.  Ex
8450: 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 20 20  prList *pEList  
8460: 20 20 2f 2a 20 45 78 70 72 65 73 73 69 6f 6e 73    /* Expressions
8470: 20 64 65 66 69 6e 69 6e 67 20 74 68 65 20 72 65   defining the re
8480: 73 75 6c 74 20 73 65 74 20 2a 2f 0a 29 7b 0a 23  sult set */.){.#
8490: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
84a0: 49 54 5f 44 45 43 4c 54 59 50 45 0a 20 20 56 64  IT_DECLTYPE.  Vd
84b0: 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e  be *v = pParse->
84c0: 70 56 64 62 65 3b 0a 20 20 69 6e 74 20 69 3b 0a  pVdbe;.  int i;.
84d0: 20 20 4e 61 6d 65 43 6f 6e 74 65 78 74 20 73 4e    NameContext sN
84e0: 43 3b 0a 20 20 73 4e 43 2e 70 53 72 63 4c 69 73  C;.  sNC.pSrcLis
84f0: 74 20 3d 20 70 54 61 62 4c 69 73 74 3b 0a 20 20  t = pTabList;.  
8500: 73 4e 43 2e 70 50 61 72 73 65 20 3d 20 70 50 61  sNC.pParse = pPa
8510: 72 73 65 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  rse;.  for(i=0; 
8520: 69 3c 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b  i<pEList->nExpr;
8530: 20 69 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72 20   i++){.    Expr 
8540: 2a 70 20 3d 20 70 45 4c 69 73 74 2d 3e 61 5b 69  *p = pEList->a[i
8550: 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 63 6f 6e  ].pExpr;.    con
8560: 73 74 20 63 68 61 72 20 2a 7a 54 79 70 65 3b 0a  st char *zType;.
8570: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
8580: 41 42 4c 45 5f 43 4f 4c 55 4d 4e 5f 4d 45 54 41  ABLE_COLUMN_META
8590: 44 41 54 41 0a 20 20 20 20 63 6f 6e 73 74 20 63  DATA.    const c
85a0: 68 61 72 20 2a 7a 4f 72 69 67 44 62 20 3d 20 30  har *zOrigDb = 0
85b0: 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72  ;.    const char
85c0: 20 2a 7a 4f 72 69 67 54 61 62 20 3d 20 30 3b 0a   *zOrigTab = 0;.
85d0: 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
85e0: 7a 4f 72 69 67 43 6f 6c 20 3d 20 30 3b 0a 20 20  zOrigCol = 0;.  
85f0: 20 20 7a 54 79 70 65 20 3d 20 63 6f 6c 75 6d 6e    zType = column
8600: 54 79 70 65 28 26 73 4e 43 2c 20 70 2c 20 26 7a  Type(&sNC, p, &z
8610: 4f 72 69 67 44 62 2c 20 26 7a 4f 72 69 67 54 61  OrigDb, &zOrigTa
8620: 62 2c 20 26 7a 4f 72 69 67 43 6f 6c 29 3b 0a 0a  b, &zOrigCol);..
8630: 20 20 20 20 2f 2a 20 54 68 65 20 76 64 62 65 20      /* The vdbe 
8640: 6d 75 73 74 20 6d 61 6b 65 20 69 74 73 20 6f 77  must make its ow
8650: 6e 20 63 6f 70 79 20 6f 66 20 74 68 65 20 63 6f  n copy of the co
8660: 6c 75 6d 6e 2d 74 79 70 65 20 61 6e 64 20 6f 74  lumn-type and ot
8670: 68 65 72 20 0a 20 20 20 20 2a 2a 20 63 6f 6c 75  her .    ** colu
8680: 6d 6e 20 73 70 65 63 69 66 69 63 20 73 74 72 69  mn specific stri
8690: 6e 67 73 2c 20 69 6e 20 63 61 73 65 20 74 68 65  ngs, in case the
86a0: 20 73 63 68 65 6d 61 20 69 73 20 72 65 73 65 74   schema is reset
86b0: 20 62 65 66 6f 72 65 20 74 68 69 73 0a 20 20 20   before this.   
86c0: 20 2a 2a 20 76 69 72 74 75 61 6c 20 6d 61 63 68   ** virtual mach
86d0: 69 6e 65 20 69 73 20 64 65 6c 65 74 65 64 2e 0a  ine is deleted..
86e0: 20 20 20 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74      */.    sqlit
86f0: 65 33 56 64 62 65 53 65 74 43 6f 6c 4e 61 6d 65  e3VdbeSetColName
8700: 28 76 2c 20 69 2c 20 43 4f 4c 4e 41 4d 45 5f 44  (v, i, COLNAME_D
8710: 41 54 41 42 41 53 45 2c 20 7a 4f 72 69 67 44 62  ATABASE, zOrigDb
8720: 2c 20 50 34 5f 54 52 41 4e 53 49 45 4e 54 29 3b  , P4_TRANSIENT);
8730: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
8740: 53 65 74 43 6f 6c 4e 61 6d 65 28 76 2c 20 69 2c  SetColName(v, i,
8750: 20 43 4f 4c 4e 41 4d 45 5f 54 41 42 4c 45 2c 20   COLNAME_TABLE, 
8760: 7a 4f 72 69 67 54 61 62 2c 20 50 34 5f 54 52 41  zOrigTab, P4_TRA
8770: 4e 53 49 45 4e 54 29 3b 0a 20 20 20 20 73 71 6c  NSIENT);.    sql
8780: 69 74 65 33 56 64 62 65 53 65 74 43 6f 6c 4e 61  ite3VdbeSetColNa
8790: 6d 65 28 76 2c 20 69 2c 20 43 4f 4c 4e 41 4d 45  me(v, i, COLNAME
87a0: 5f 43 4f 4c 55 4d 4e 2c 20 7a 4f 72 69 67 43 6f  _COLUMN, zOrigCo
87b0: 6c 2c 20 50 34 5f 54 52 41 4e 53 49 45 4e 54 29  l, P4_TRANSIENT)
87c0: 3b 0a 23 65 6c 73 65 0a 20 20 20 20 7a 54 79 70  ;.#else.    zTyp
87d0: 65 20 3d 20 63 6f 6c 75 6d 6e 54 79 70 65 28 26  e = columnType(&
87e0: 73 4e 43 2c 20 70 2c 20 30 2c 20 30 2c 20 30 29  sNC, p, 0, 0, 0)
87f0: 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 73 71 6c  ;.#endif.    sql
8800: 69 74 65 33 56 64 62 65 53 65 74 43 6f 6c 4e 61  ite3VdbeSetColNa
8810: 6d 65 28 76 2c 20 69 2c 20 43 4f 4c 4e 41 4d 45  me(v, i, COLNAME
8820: 5f 44 45 43 4c 54 59 50 45 2c 20 7a 54 79 70 65  _DECLTYPE, zType
8830: 2c 20 50 34 5f 54 52 41 4e 53 49 45 4e 54 29 3b  , P4_TRANSIENT);
8840: 0a 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53  .  }.#endif /* S
8850: 51 4c 49 54 45 5f 4f 4d 49 54 5f 44 45 43 4c 54  QLITE_OMIT_DECLT
8860: 59 50 45 20 2a 2f 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  YPE */.}../*.** 
8870: 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 68  Generate code th
8880: 61 74 20 77 69 6c 6c 20 74 65 6c 6c 20 74 68 65  at will tell the
8890: 20 56 44 42 45 20 74 68 65 20 6e 61 6d 65 73 20   VDBE the names 
88a0: 6f 66 20 63 6f 6c 75 6d 6e 73 0a 2a 2a 20 69 6e  of columns.** in
88b0: 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 2e   the result set.
88c0: 20 20 54 68 69 73 20 69 6e 66 6f 72 6d 61 74 69    This informati
88d0: 6f 6e 20 69 73 20 75 73 65 64 20 74 6f 20 70 72  on is used to pr
88e0: 6f 76 69 64 65 20 74 68 65 0a 2a 2a 20 61 7a 43  ovide the.** azC
88f0: 6f 6c 5b 5d 20 76 61 6c 75 65 73 20 69 6e 20 74  ol[] values in t
8900: 68 65 20 63 61 6c 6c 62 61 63 6b 2e 0a 2a 2f 0a  he callback..*/.
8910: 73 74 61 74 69 63 20 76 6f 69 64 20 67 65 6e 65  static void gene
8920: 72 61 74 65 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28  rateColumnNames(
8930: 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
8940: 2c 20 20 20 20 20 20 2f 2a 20 50 61 72 73 65 72  ,      /* Parser
8950: 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53 72   context */.  Sr
8960: 63 4c 69 73 74 20 2a 70 54 61 62 4c 69 73 74 2c  cList *pTabList,
8970: 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 74 61 62    /* List of tab
8980: 6c 65 73 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73  les */.  ExprLis
8990: 74 20 2a 70 45 4c 69 73 74 20 20 20 20 2f 2a 20  t *pEList    /* 
89a0: 45 78 70 72 65 73 73 69 6f 6e 73 20 64 65 66 69  Expressions defi
89b0: 6e 69 6e 67 20 74 68 65 20 72 65 73 75 6c 74 20  ning the result 
89c0: 73 65 74 20 2a 2f 0a 29 7b 0a 20 20 56 64 62 65  set */.){.  Vdbe
89d0: 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56   *v = pParse->pV
89e0: 64 62 65 3b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b  dbe;.  int i, j;
89f0: 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d  .  sqlite3 *db =
8a00: 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 69   pParse->db;.  i
8a10: 6e 74 20 66 75 6c 6c 4e 61 6d 65 73 2c 20 73 68  nt fullNames, sh
8a20: 6f 72 74 4e 61 6d 65 73 3b 0a 0a 23 69 66 6e 64  ortNames;..#ifnd
8a30: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 45  ef SQLITE_OMIT_E
8a40: 58 50 4c 41 49 4e 0a 20 20 2f 2a 20 49 66 20 74  XPLAIN.  /* If t
8a50: 68 69 73 20 69 73 20 61 6e 20 45 58 50 4c 41 49  his is an EXPLAI
8a60: 4e 2c 20 73 6b 69 70 20 74 68 69 73 20 73 74 65  N, skip this ste
8a70: 70 20 2a 2f 0a 20 20 69 66 28 20 70 50 61 72 73  p */.  if( pPars
8a80: 65 2d 3e 65 78 70 6c 61 69 6e 20 29 7b 0a 20 20  e->explain ){.  
8a90: 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 23 65    return;.  }.#e
8aa0: 6e 64 69 66 0a 0a 20 20 61 73 73 65 72 74 28 20  ndif..  assert( 
8ab0: 76 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 50  v!=0 );.  if( pP
8ac0: 61 72 73 65 2d 3e 63 6f 6c 4e 61 6d 65 73 53 65  arse->colNamesSe
8ad0: 74 20 7c 7c 20 76 3d 3d 30 20 7c 7c 20 64 62 2d  t || v==0 || db-
8ae0: 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20  >mallocFailed ) 
8af0: 72 65 74 75 72 6e 3b 0a 20 20 70 50 61 72 73 65  return;.  pParse
8b00: 2d 3e 63 6f 6c 4e 61 6d 65 73 53 65 74 20 3d 20  ->colNamesSet = 
8b10: 31 3b 0a 20 20 66 75 6c 6c 4e 61 6d 65 73 20 3d  1;.  fullNames =
8b20: 20 28 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51   (db->flags & SQ
8b30: 4c 49 54 45 5f 46 75 6c 6c 43 6f 6c 4e 61 6d 65  LITE_FullColName
8b40: 73 29 21 3d 30 3b 0a 20 20 73 68 6f 72 74 4e 61  s)!=0;.  shortNa
8b50: 6d 65 73 20 3d 20 28 64 62 2d 3e 66 6c 61 67 73  mes = (db->flags
8b60: 20 26 20 53 51 4c 49 54 45 5f 53 68 6f 72 74 43   & SQLITE_ShortC
8b70: 6f 6c 4e 61 6d 65 73 29 21 3d 30 3b 0a 20 20 73  olNames)!=0;.  s
8b80: 71 6c 69 74 65 33 56 64 62 65 53 65 74 4e 75 6d  qlite3VdbeSetNum
8b90: 43 6f 6c 73 28 76 2c 20 70 45 4c 69 73 74 2d 3e  Cols(v, pEList->
8ba0: 6e 45 78 70 72 29 3b 0a 20 20 66 6f 72 28 69 3d  nExpr);.  for(i=
8bb0: 30 3b 20 69 3c 70 45 4c 69 73 74 2d 3e 6e 45 78  0; i<pEList->nEx
8bc0: 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 45 78  pr; i++){.    Ex
8bd0: 70 72 20 2a 70 3b 0a 20 20 20 20 70 20 3d 20 70  pr *p;.    p = p
8be0: 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70  EList->a[i].pExp
8bf0: 72 3b 0a 20 20 20 20 69 66 28 20 70 3d 3d 30 20  r;.    if( p==0 
8c00: 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
8c10: 69 66 28 20 70 45 4c 69 73 74 2d 3e 61 5b 69 5d  if( pEList->a[i]
8c20: 2e 7a 4e 61 6d 65 20 29 7b 0a 20 20 20 20 20 20  .zName ){.      
8c30: 63 68 61 72 20 2a 7a 4e 61 6d 65 20 3d 20 70 45  char *zName = pE
8c40: 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65  List->a[i].zName
8c50: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
8c60: 64 62 65 53 65 74 43 6f 6c 4e 61 6d 65 28 76 2c  dbeSetColName(v,
8c70: 20 69 2c 20 43 4f 4c 4e 41 4d 45 5f 4e 41 4d 45   i, COLNAME_NAME
8c80: 2c 20 7a 4e 61 6d 65 2c 20 73 74 72 6c 65 6e 28  , zName, strlen(
8c90: 7a 4e 61 6d 65 29 29 3b 0a 20 20 20 20 20 20 63  zName));.      c
8ca0: 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 7d 0a 20  ontinue;.    }. 
8cb0: 20 20 20 69 66 28 20 70 2d 3e 6f 70 3d 3d 54 4b     if( p->op==TK
8cc0: 5f 43 4f 4c 55 4d 4e 20 26 26 20 70 54 61 62 4c  _COLUMN && pTabL
8cd0: 69 73 74 20 29 7b 0a 20 20 20 20 20 20 54 61 62  ist ){.      Tab
8ce0: 6c 65 20 2a 70 54 61 62 3b 0a 20 20 20 20 20 20  le *pTab;.      
8cf0: 63 68 61 72 20 2a 7a 43 6f 6c 3b 0a 20 20 20 20  char *zCol;.    
8d00: 20 20 69 6e 74 20 69 43 6f 6c 20 3d 20 70 2d 3e    int iCol = p->
8d10: 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20 20 66  iColumn;.      f
8d20: 6f 72 28 6a 3d 30 3b 20 6a 3c 70 54 61 62 4c 69  or(j=0; j<pTabLi
8d30: 73 74 2d 3e 6e 53 72 63 20 26 26 20 70 54 61 62  st->nSrc && pTab
8d40: 4c 69 73 74 2d 3e 61 5b 6a 5d 2e 69 43 75 72 73  List->a[j].iCurs
8d50: 6f 72 21 3d 70 2d 3e 69 54 61 62 6c 65 3b 20 6a  or!=p->iTable; j
8d60: 2b 2b 29 7b 7d 0a 20 20 20 20 20 20 61 73 73 65  ++){}.      asse
8d70: 72 74 28 20 6a 3c 70 54 61 62 4c 69 73 74 2d 3e  rt( j<pTabList->
8d80: 6e 53 72 63 20 29 3b 0a 20 20 20 20 20 20 70 54  nSrc );.      pT
8d90: 61 62 20 3d 20 70 54 61 62 4c 69 73 74 2d 3e 61  ab = pTabList->a
8da0: 5b 6a 5d 2e 70 54 61 62 3b 0a 20 20 20 20 20 20  [j].pTab;.      
8db0: 69 66 28 20 69 43 6f 6c 3c 30 20 29 20 69 43 6f  if( iCol<0 ) iCo
8dc0: 6c 20 3d 20 70 54 61 62 2d 3e 69 50 4b 65 79 3b  l = pTab->iPKey;
8dd0: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 69  .      assert( i
8de0: 43 6f 6c 3d 3d 2d 31 20 7c 7c 20 28 69 43 6f 6c  Col==-1 || (iCol
8df0: 3e 3d 30 20 26 26 20 69 43 6f 6c 3c 70 54 61 62  >=0 && iCol<pTab
8e00: 2d 3e 6e 43 6f 6c 29 20 29 3b 0a 20 20 20 20 20  ->nCol) );.     
8e10: 20 69 66 28 20 69 43 6f 6c 3c 30 20 29 7b 0a 20   if( iCol<0 ){. 
8e20: 20 20 20 20 20 20 20 7a 43 6f 6c 20 3d 20 22 72         zCol = "r
8e30: 6f 77 69 64 22 3b 0a 20 20 20 20 20 20 7d 65 6c  owid";.      }el
8e40: 73 65 7b 0a 20 20 20 20 20 20 20 20 7a 43 6f 6c  se{.        zCol
8e50: 20 3d 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 43   = pTab->aCol[iC
8e60: 6f 6c 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20  ol].zName;.     
8e70: 20 7d 0a 20 20 20 20 20 20 69 66 28 20 21 73 68   }.      if( !sh
8e80: 6f 72 74 4e 61 6d 65 73 20 26 26 20 21 66 75 6c  ortNames && !ful
8e90: 6c 4e 61 6d 65 73 20 26 26 20 70 2d 3e 73 70 61  lNames && p->spa
8ea0: 6e 2e 7a 20 26 26 20 70 2d 3e 73 70 61 6e 2e 7a  n.z && p->span.z
8eb0: 5b 30 5d 20 29 7b 0a 20 20 20 20 20 20 20 20 73  [0] ){.        s
8ec0: 71 6c 69 74 65 33 56 64 62 65 53 65 74 43 6f 6c  qlite3VdbeSetCol
8ed0: 4e 61 6d 65 28 76 2c 20 69 2c 20 43 4f 4c 4e 41  Name(v, i, COLNA
8ee0: 4d 45 5f 4e 41 4d 45 2c 20 28 63 68 61 72 2a 29  ME_NAME, (char*)
8ef0: 70 2d 3e 73 70 61 6e 2e 7a 2c 20 70 2d 3e 73 70  p->span.z, p->sp
8f00: 61 6e 2e 6e 29 3b 0a 20 20 20 20 20 20 7d 65 6c  an.n);.      }el
8f10: 73 65 20 69 66 28 20 66 75 6c 6c 4e 61 6d 65 73  se if( fullNames
8f20: 20 7c 7c 20 28 21 73 68 6f 72 74 4e 61 6d 65 73   || (!shortNames
8f30: 20 26 26 20 70 54 61 62 4c 69 73 74 2d 3e 6e 53   && pTabList->nS
8f40: 72 63 3e 31 29 20 29 7b 0a 20 20 20 20 20 20 20  rc>1) ){.       
8f50: 20 63 68 61 72 20 2a 7a 4e 61 6d 65 20 3d 20 30   char *zName = 0
8f60: 3b 0a 20 20 20 20 20 20 20 20 63 68 61 72 20 2a  ;.        char *
8f70: 7a 54 61 62 3b 0a 20 0a 20 20 20 20 20 20 20 20  zTab;. .        
8f80: 7a 54 61 62 20 3d 20 70 54 61 62 4c 69 73 74 2d  zTab = pTabList-
8f90: 3e 61 5b 6a 5d 2e 7a 41 6c 69 61 73 3b 0a 20 20  >a[j].zAlias;.  
8fa0: 20 20 20 20 20 20 69 66 28 20 66 75 6c 6c 4e 61        if( fullNa
8fb0: 6d 65 73 20 7c 7c 20 7a 54 61 62 3d 3d 30 20 29  mes || zTab==0 )
8fc0: 20 7a 54 61 62 20 3d 20 70 54 61 62 2d 3e 7a 4e   zTab = pTab->zN
8fd0: 61 6d 65 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  ame;.        sql
8fe0: 69 74 65 33 53 65 74 53 74 72 69 6e 67 28 26 7a  ite3SetString(&z
8ff0: 4e 61 6d 65 2c 20 7a 54 61 62 2c 20 22 2e 22 2c  Name, zTab, ".",
9000: 20 7a 43 6f 6c 2c 20 28 63 68 61 72 2a 29 30 29   zCol, (char*)0)
9010: 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
9020: 33 56 64 62 65 53 65 74 43 6f 6c 4e 61 6d 65 28  3VdbeSetColName(
9030: 76 2c 20 69 2c 20 43 4f 4c 4e 41 4d 45 5f 4e 41  v, i, COLNAME_NA
9040: 4d 45 2c 20 7a 4e 61 6d 65 2c 20 50 34 5f 44 59  ME, zName, P4_DY
9050: 4e 41 4d 49 43 29 3b 0a 20 20 20 20 20 20 7d 65  NAMIC);.      }e
9060: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  lse{.        sql
9070: 69 74 65 33 56 64 62 65 53 65 74 43 6f 6c 4e 61  ite3VdbeSetColNa
9080: 6d 65 28 76 2c 20 69 2c 20 43 4f 4c 4e 41 4d 45  me(v, i, COLNAME
9090: 5f 4e 41 4d 45 2c 20 7a 43 6f 6c 2c 20 73 74 72  _NAME, zCol, str
90a0: 6c 65 6e 28 7a 43 6f 6c 29 29 3b 0a 20 20 20 20  len(zCol));.    
90b0: 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 20 69 66    }.    }else if
90c0: 28 20 70 2d 3e 73 70 61 6e 2e 7a 20 26 26 20 70  ( p->span.z && p
90d0: 2d 3e 73 70 61 6e 2e 7a 5b 30 5d 20 29 7b 0a 20  ->span.z[0] ){. 
90e0: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
90f0: 53 65 74 43 6f 6c 4e 61 6d 65 28 76 2c 20 69 2c  SetColName(v, i,
9100: 20 43 4f 4c 4e 41 4d 45 5f 4e 41 4d 45 2c 20 28   COLNAME_NAME, (
9110: 63 68 61 72 2a 29 70 2d 3e 73 70 61 6e 2e 7a 2c  char*)p->span.z,
9120: 20 70 2d 3e 73 70 61 6e 2e 6e 29 3b 0a 20 20 20   p->span.n);.   
9130: 20 20 20 2f 2a 20 73 71 6c 69 74 65 33 56 64 62     /* sqlite3Vdb
9140: 65 43 6f 6d 70 72 65 73 73 53 70 61 63 65 28 76  eCompressSpace(v
9150: 2c 20 61 64 64 72 29 3b 20 2a 2f 0a 20 20 20 20  , addr); */.    
9160: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 63 68 61  }else{.      cha
9170: 72 20 7a 4e 61 6d 65 5b 33 30 5d 3b 0a 20 20 20  r zName[30];.   
9180: 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6f 70     assert( p->op
9190: 21 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 7c 7c 20 70  !=TK_COLUMN || p
91a0: 54 61 62 4c 69 73 74 3d 3d 30 20 29 3b 0a 20 20  TabList==0 );.  
91b0: 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72      sqlite3_snpr
91c0: 69 6e 74 66 28 73 69 7a 65 6f 66 28 7a 4e 61 6d  intf(sizeof(zNam
91d0: 65 29 2c 20 7a 4e 61 6d 65 2c 20 22 63 6f 6c 75  e), zName, "colu
91e0: 6d 6e 25 64 22 2c 20 69 2b 31 29 3b 0a 20 20 20  mn%d", i+1);.   
91f0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 53 65     sqlite3VdbeSe
9200: 74 43 6f 6c 4e 61 6d 65 28 76 2c 20 69 2c 20 43  tColName(v, i, C
9210: 4f 4c 4e 41 4d 45 5f 4e 41 4d 45 2c 20 7a 4e 61  OLNAME_NAME, zNa
9220: 6d 65 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20  me, 0);.    }.  
9230: 7d 0a 20 20 67 65 6e 65 72 61 74 65 43 6f 6c 75  }.  generateColu
9240: 6d 6e 54 79 70 65 73 28 70 50 61 72 73 65 2c 20  mnTypes(pParse, 
9250: 70 54 61 62 4c 69 73 74 2c 20 70 45 4c 69 73 74  pTabList, pEList
9260: 29 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51  );.}..#ifndef SQ
9270: 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f 4d 50 4f 55  LITE_OMIT_COMPOU
9280: 4e 44 5f 53 45 4c 45 43 54 0a 2f 2a 0a 2a 2a 20  ND_SELECT./*.** 
9290: 4e 61 6d 65 20 6f 66 20 74 68 65 20 63 6f 6e 6e  Name of the conn
92a0: 65 63 74 69 6f 6e 20 6f 70 65 72 61 74 6f 72 2c  ection operator,
92b0: 20 75 73 65 64 20 66 6f 72 20 65 72 72 6f 72 20   used for error 
92c0: 6d 65 73 73 61 67 65 73 2e 0a 2a 2f 0a 73 74 61  messages..*/.sta
92d0: 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  tic const char *
92e0: 73 65 6c 65 63 74 4f 70 4e 61 6d 65 28 69 6e 74  selectOpName(int
92f0: 20 69 64 29 7b 0a 20 20 63 68 61 72 20 2a 7a 3b   id){.  char *z;
9300: 0a 20 20 73 77 69 74 63 68 28 20 69 64 20 29 7b  .  switch( id ){
9310: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 41 4c 4c  .    case TK_ALL
9320: 3a 20 20 20 20 20 20 20 7a 20 3d 20 22 55 4e 49  :       z = "UNI
9330: 4f 4e 20 41 4c 4c 22 3b 20 20 20 62 72 65 61 6b  ON ALL";   break
9340: 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49 4e  ;.    case TK_IN
9350: 54 45 52 53 45 43 54 3a 20 7a 20 3d 20 22 49 4e  TERSECT: z = "IN
9360: 54 45 52 53 45 43 54 22 3b 20 20 20 62 72 65 61  TERSECT";   brea
9370: 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 45  k;.    case TK_E
9380: 58 43 45 50 54 3a 20 20 20 20 7a 20 3d 20 22 45  XCEPT:    z = "E
9390: 58 43 45 50 54 22 3b 20 20 20 20 20 20 62 72 65  XCEPT";      bre
93a0: 61 6b 3b 0a 20 20 20 20 64 65 66 61 75 6c 74 3a  ak;.    default:
93b0: 20 20 20 20 20 20 20 20 20 20 20 7a 20 3d 20 22             z = "
93c0: 55 4e 49 4f 4e 22 3b 20 20 20 20 20 20 20 62 72  UNION";       br
93d0: 65 61 6b 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  eak;.  }.  retur
93e0: 6e 20 7a 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a  n z;.}.#endif /*
93f0: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f 4d   SQLITE_OMIT_COM
9400: 50 4f 55 4e 44 5f 53 45 4c 45 43 54 20 2a 2f 0a  POUND_SELECT */.
9410: 0a 2f 2a 0a 2a 2a 20 46 6f 72 77 61 72 64 20 64  ./*.** Forward d
9420: 65 63 6c 61 72 61 74 69 6f 6e 0a 2a 2f 0a 73 74  eclaration.*/.st
9430: 61 74 69 63 20 69 6e 74 20 70 72 65 70 53 65 6c  atic int prepSel
9440: 65 63 74 53 74 6d 74 28 50 61 72 73 65 2a 2c 20  ectStmt(Parse*, 
9450: 53 65 6c 65 63 74 2a 29 3b 0a 0a 2f 2a 0a 2a 2a  Select*);../*.**
9460: 20 47 69 76 65 6e 20 61 20 53 45 4c 45 43 54 20   Given a SELECT 
9470: 73 74 61 74 65 6d 65 6e 74 2c 20 67 65 6e 65 72  statement, gener
9480: 61 74 65 20 61 20 54 61 62 6c 65 20 73 74 72 75  ate a Table stru
9490: 63 74 75 72 65 20 74 68 61 74 20 64 65 73 63 72  cture that descr
94a0: 69 62 65 73 0a 2a 2a 20 74 68 65 20 72 65 73 75  ibes.** the resu
94b0: 6c 74 20 73 65 74 20 6f 66 20 74 68 61 74 20 53  lt set of that S
94c0: 45 4c 45 43 54 2e 0a 2a 2f 0a 54 61 62 6c 65 20  ELECT..*/.Table 
94d0: 2a 73 71 6c 69 74 65 33 52 65 73 75 6c 74 53 65  *sqlite3ResultSe
94e0: 74 4f 66 53 65 6c 65 63 74 28 50 61 72 73 65 20  tOfSelect(Parse 
94f0: 2a 70 50 61 72 73 65 2c 20 63 68 61 72 20 2a 7a  *pParse, char *z
9500: 54 61 62 4e 61 6d 65 2c 20 53 65 6c 65 63 74 20  TabName, Select 
9510: 2a 70 53 65 6c 65 63 74 29 7b 0a 20 20 54 61 62  *pSelect){.  Tab
9520: 6c 65 20 2a 70 54 61 62 3b 0a 20 20 69 6e 74 20  le *pTab;.  int 
9530: 69 2c 20 6a 3b 0a 20 20 45 78 70 72 4c 69 73 74  i, j;.  ExprList
9540: 20 2a 70 45 4c 69 73 74 3b 0a 20 20 43 6f 6c 75   *pEList;.  Colu
9550: 6d 6e 20 2a 61 43 6f 6c 2c 20 2a 70 43 6f 6c 3b  mn *aCol, *pCol;
9560: 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d  .  sqlite3 *db =
9570: 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 0a 20 20   pParse->db;..  
9580: 77 68 69 6c 65 28 20 70 53 65 6c 65 63 74 2d 3e  while( pSelect->
9590: 70 50 72 69 6f 72 20 29 20 70 53 65 6c 65 63 74  pPrior ) pSelect
95a0: 20 3d 20 70 53 65 6c 65 63 74 2d 3e 70 50 72 69   = pSelect->pPri
95b0: 6f 72 3b 0a 20 20 69 66 28 20 70 72 65 70 53 65  or;.  if( prepSe
95c0: 6c 65 63 74 53 74 6d 74 28 70 50 61 72 73 65 2c  lectStmt(pParse,
95d0: 20 70 53 65 6c 65 63 74 29 20 29 7b 0a 20 20 20   pSelect) ){.   
95e0: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20   return 0;.  }. 
95f0: 20 69 66 28 20 73 71 6c 69 74 65 33 53 65 6c 65   if( sqlite3Sele
9600: 63 74 52 65 73 6f 6c 76 65 28 70 50 61 72 73 65  ctResolve(pParse
9610: 2c 20 70 53 65 6c 65 63 74 2c 20 30 29 20 29 7b  , pSelect, 0) ){
9620: 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20  .    return 0;. 
9630: 20 7d 0a 20 20 70 54 61 62 20 3d 20 73 71 6c 69   }.  pTab = sqli
9640: 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28  te3DbMallocZero(
9650: 64 62 2c 20 73 69 7a 65 6f 66 28 54 61 62 6c 65  db, sizeof(Table
9660: 29 20 29 3b 0a 20 20 69 66 28 20 70 54 61 62 3d  ) );.  if( pTab=
9670: 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  =0 ){.    return
9680: 20 30 3b 0a 20 20 7d 0a 20 20 70 54 61 62 2d 3e   0;.  }.  pTab->
9690: 6e 52 65 66 20 3d 20 31 3b 0a 20 20 70 54 61 62  nRef = 1;.  pTab
96a0: 2d 3e 7a 4e 61 6d 65 20 3d 20 7a 54 61 62 4e 61  ->zName = zTabNa
96b0: 6d 65 20 3f 20 73 71 6c 69 74 65 33 44 62 53 74  me ? sqlite3DbSt
96c0: 72 44 75 70 28 64 62 2c 20 7a 54 61 62 4e 61 6d  rDup(db, zTabNam
96d0: 65 29 20 3a 20 30 3b 0a 20 20 70 45 4c 69 73 74  e) : 0;.  pEList
96e0: 20 3d 20 70 53 65 6c 65 63 74 2d 3e 70 45 4c 69   = pSelect->pELi
96f0: 73 74 3b 0a 20 20 70 54 61 62 2d 3e 6e 43 6f 6c  st;.  pTab->nCol
9700: 20 3d 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72   = pEList->nExpr
9710: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 54 61 62  ;.  assert( pTab
9720: 2d 3e 6e 43 6f 6c 3e 30 20 29 3b 0a 20 20 70 54  ->nCol>0 );.  pT
9730: 61 62 2d 3e 61 43 6f 6c 20 3d 20 61 43 6f 6c 20  ab->aCol = aCol 
9740: 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f  = sqlite3DbMallo
9750: 63 5a 65 72 6f 28 64 62 2c 20 73 69 7a 65 6f 66  cZero(db, sizeof
9760: 28 70 54 61 62 2d 3e 61 43 6f 6c 5b 30 5d 29 2a  (pTab->aCol[0])*
9770: 70 54 61 62 2d 3e 6e 43 6f 6c 29 3b 0a 20 20 66  pTab->nCol);.  f
9780: 6f 72 28 69 3d 30 2c 20 70 43 6f 6c 3d 61 43 6f  or(i=0, pCol=aCo
9790: 6c 3b 20 69 3c 70 54 61 62 2d 3e 6e 43 6f 6c 3b  l; i<pTab->nCol;
97a0: 20 69 2b 2b 2c 20 70 43 6f 6c 2b 2b 29 7b 0a 20   i++, pCol++){. 
97b0: 20 20 20 45 78 70 72 20 2a 70 2c 20 2a 70 52 3b     Expr *p, *pR;
97c0: 0a 20 20 20 20 63 68 61 72 20 2a 7a 54 79 70 65  .    char *zType
97d0: 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a 4e 61 6d  ;.    char *zNam
97e0: 65 3b 0a 20 20 20 20 69 6e 74 20 6e 4e 61 6d 65  e;.    int nName
97f0: 3b 0a 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a 70  ;.    CollSeq *p
9800: 43 6f 6c 6c 3b 0a 20 20 20 20 69 6e 74 20 63 6e  Coll;.    int cn
9810: 74 3b 0a 20 20 20 20 4e 61 6d 65 43 6f 6e 74 65  t;.    NameConte
9820: 78 74 20 73 4e 43 3b 0a 20 20 20 20 0a 20 20 20  xt sNC;.    .   
9830: 20 2f 2a 20 47 65 74 20 61 6e 20 61 70 70 72 6f   /* Get an appro
9840: 70 72 69 61 74 65 20 6e 61 6d 65 20 66 6f 72 20  priate name for 
9850: 74 68 65 20 63 6f 6c 75 6d 6e 0a 20 20 20 20 2a  the column.    *
9860: 2f 0a 20 20 20 20 70 20 3d 20 70 45 4c 69 73 74  /.    p = pEList
9870: 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20  ->a[i].pExpr;.  
9880: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 52 69    assert( p->pRi
9890: 67 68 74 3d 3d 30 20 7c 7c 20 70 2d 3e 70 52 69  ght==0 || p->pRi
98a0: 67 68 74 2d 3e 74 6f 6b 65 6e 2e 7a 3d 3d 30 20  ght->token.z==0 
98b0: 7c 7c 20 70 2d 3e 70 52 69 67 68 74 2d 3e 74 6f  || p->pRight->to
98c0: 6b 65 6e 2e 7a 5b 30 5d 21 3d 30 20 29 3b 0a 20  ken.z[0]!=0 );. 
98d0: 20 20 20 69 66 28 20 28 7a 4e 61 6d 65 20 3d 20     if( (zName = 
98e0: 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61  pEList->a[i].zNa
98f0: 6d 65 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  me)!=0 ){.      
9900: 2f 2a 20 49 66 20 74 68 65 20 63 6f 6c 75 6d 6e  /* If the column
9910: 20 63 6f 6e 74 61 69 6e 73 20 61 6e 20 22 41 53   contains an "AS
9920: 20 3c 6e 61 6d 65 3e 22 20 70 68 72 61 73 65 2c   <name>" phrase,
9930: 20 75 73 65 20 3c 6e 61 6d 65 3e 20 61 73 20 74   use <name> as t
9940: 68 65 20 6e 61 6d 65 20 2a 2f 0a 20 20 20 20 20  he name */.     
9950: 20 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33   zName = sqlite3
9960: 44 62 53 74 72 44 75 70 28 64 62 2c 20 7a 4e 61  DbStrDup(db, zNa
9970: 6d 65 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69  me);.    }else i
9980: 66 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 44 4f 54  f( p->op==TK_DOT
9990: 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20   .              
99a0: 26 26 20 28 70 52 3d 70 2d 3e 70 52 69 67 68 74  && (pR=p->pRight
99b0: 29 21 3d 30 20 26 26 20 70 52 2d 3e 74 6f 6b 65  )!=0 && pR->toke
99c0: 6e 2e 7a 20 26 26 20 70 52 2d 3e 74 6f 6b 65 6e  n.z && pR->token
99d0: 2e 7a 5b 30 5d 20 29 7b 0a 20 20 20 20 20 20 2f  .z[0] ){.      /
99e0: 2a 20 46 6f 72 20 63 6f 6c 75 6d 6e 73 20 6f 66  * For columns of
99f0: 20 74 68 65 20 66 72 6f 6d 20 41 2e 42 20 75 73   the from A.B us
9a00: 65 20 42 20 61 73 20 74 68 65 20 6e 61 6d 65 20  e B as the name 
9a10: 2a 2f 0a 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d  */.      zName =
9a20: 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28   sqlite3MPrintf(
9a30: 64 62 2c 20 22 25 54 22 2c 20 26 70 52 2d 3e 74  db, "%T", &pR->t
9a40: 6f 6b 65 6e 29 3b 0a 20 20 20 20 7d 65 6c 73 65  oken);.    }else
9a50: 20 69 66 28 20 70 2d 3e 73 70 61 6e 2e 7a 20 26   if( p->span.z &
9a60: 26 20 70 2d 3e 73 70 61 6e 2e 7a 5b 30 5d 20 29  & p->span.z[0] )
9a70: 7b 0a 20 20 20 20 20 20 2f 2a 20 55 73 65 20 74  {.      /* Use t
9a80: 68 65 20 6f 72 69 67 69 6e 61 6c 20 74 65 78 74  he original text
9a90: 20 6f 66 20 74 68 65 20 63 6f 6c 75 6d 6e 20 65   of the column e
9aa0: 78 70 72 65 73 73 69 6f 6e 20 61 73 20 69 74 73  xpression as its
9ab0: 20 6e 61 6d 65 20 2a 2f 0a 20 20 20 20 20 20 7a   name */.      z
9ac0: 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 4d 50  Name = sqlite3MP
9ad0: 72 69 6e 74 66 28 64 62 2c 20 22 25 54 22 2c 20  rintf(db, "%T", 
9ae0: 26 70 2d 3e 73 70 61 6e 29 3b 0a 20 20 20 20 7d  &p->span);.    }
9af0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20 49  else{.      /* I
9b00: 66 20 61 6c 6c 20 65 6c 73 65 20 66 61 69 6c 73  f all else fails
9b10: 2c 20 6d 61 6b 65 20 75 70 20 61 20 6e 61 6d 65  , make up a name
9b20: 20 2a 2f 0a 20 20 20 20 20 20 7a 4e 61 6d 65 20   */.      zName 
9b30: 3d 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66  = sqlite3MPrintf
9b40: 28 64 62 2c 20 22 63 6f 6c 75 6d 6e 25 64 22 2c  (db, "column%d",
9b50: 20 69 2b 31 29 3b 0a 20 20 20 20 7d 0a 20 20 20   i+1);.    }.   
9b60: 20 69 66 28 20 21 7a 4e 61 6d 65 20 7c 7c 20 64   if( !zName || d
9b70: 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
9b80: 29 7b 0a 20 20 20 20 20 20 64 62 2d 3e 6d 61 6c  ){.      db->mal
9b90: 6c 6f 63 46 61 69 6c 65 64 20 3d 20 31 3b 0a 20  locFailed = 1;. 
9ba0: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65       sqlite3_fre
9bb0: 65 28 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20  e(zName);.      
9bc0: 73 71 6c 69 74 65 33 44 65 6c 65 74 65 54 61 62  sqlite3DeleteTab
9bd0: 6c 65 28 70 54 61 62 29 3b 0a 20 20 20 20 20 20  le(pTab);.      
9be0: 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a  return 0;.    }.
9bf0: 20 20 20 20 73 71 6c 69 74 65 33 44 65 71 75 6f      sqlite3Dequo
9c00: 74 65 28 7a 4e 61 6d 65 29 3b 0a 0a 20 20 20 20  te(zName);..    
9c10: 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65  /* Make sure the
9c20: 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 20 69 73 20   column name is 
9c30: 75 6e 69 71 75 65 2e 20 20 49 66 20 74 68 65 20  unique.  If the 
9c40: 6e 61 6d 65 20 69 73 20 6e 6f 74 20 75 6e 69 71  name is not uniq
9c50: 75 65 2c 0a 20 20 20 20 2a 2a 20 61 70 70 65 6e  ue,.    ** appen
9c60: 64 20 61 20 69 6e 74 65 67 65 72 20 74 6f 20 74  d a integer to t
9c70: 68 65 20 6e 61 6d 65 20 73 6f 20 74 68 61 74 20  he name so that 
9c80: 69 74 20 62 65 63 6f 6d 65 73 20 75 6e 69 71 75  it becomes uniqu
9c90: 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 6e 4e  e..    */.    nN
9ca0: 61 6d 65 20 3d 20 73 74 72 6c 65 6e 28 7a 4e 61  ame = strlen(zNa
9cb0: 6d 65 29 3b 0a 20 20 20 20 66 6f 72 28 6a 3d 63  me);.    for(j=c
9cc0: 6e 74 3d 30 3b 20 6a 3c 69 3b 20 6a 2b 2b 29 7b  nt=0; j<i; j++){
9cd0: 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74  .      if( sqlit
9ce0: 65 33 53 74 72 49 43 6d 70 28 61 43 6f 6c 5b 6a  e3StrICmp(aCol[j
9cf0: 5d 2e 7a 4e 61 6d 65 2c 20 7a 4e 61 6d 65 29 3d  ].zName, zName)=
9d00: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 7a 4e  =0 ){.        zN
9d10: 61 6d 65 5b 6e 4e 61 6d 65 5d 20 3d 20 30 3b 0a  ame[nName] = 0;.
9d20: 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20          zName = 
9d30: 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 64  sqlite3MPrintf(d
9d40: 62 2c 20 22 25 7a 3a 25 64 22 2c 20 7a 4e 61 6d  b, "%z:%d", zNam
9d50: 65 2c 20 2b 2b 63 6e 74 29 3b 0a 20 20 20 20 20  e, ++cnt);.     
9d60: 20 20 20 6a 20 3d 20 2d 31 3b 0a 20 20 20 20 20     j = -1;.     
9d70: 20 20 20 69 66 28 20 7a 4e 61 6d 65 3d 3d 30 20     if( zName==0 
9d80: 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d  ) break;.      }
9d90: 0a 20 20 20 20 7d 0a 20 20 20 20 70 43 6f 6c 2d  .    }.    pCol-
9da0: 3e 7a 4e 61 6d 65 20 3d 20 7a 4e 61 6d 65 3b 0a  >zName = zName;.
9db0: 0a 20 20 20 20 2f 2a 20 47 65 74 20 74 68 65 20  .    /* Get the 
9dc0: 74 79 70 65 6e 61 6d 65 2c 20 74 79 70 65 20 61  typename, type a
9dd0: 66 66 69 6e 69 74 79 2c 20 61 6e 64 20 63 6f 6c  ffinity, and col
9de0: 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65 20  lating sequence 
9df0: 66 6f 72 20 74 68 65 0a 20 20 20 20 2a 2a 20 63  for the.    ** c
9e00: 6f 6c 75 6d 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20  olumn..    */.  
9e10: 20 20 6d 65 6d 73 65 74 28 26 73 4e 43 2c 20 30    memset(&sNC, 0
9e20: 2c 20 73 69 7a 65 6f 66 28 73 4e 43 29 29 3b 0a  , sizeof(sNC));.
9e30: 20 20 20 20 73 4e 43 2e 70 53 72 63 4c 69 73 74      sNC.pSrcList
9e40: 20 3d 20 70 53 65 6c 65 63 74 2d 3e 70 53 72 63   = pSelect->pSrc
9e50: 3b 0a 20 20 20 20 7a 54 79 70 65 20 3d 20 73 71  ;.    zType = sq
9e60: 6c 69 74 65 33 44 62 53 74 72 44 75 70 28 64 62  lite3DbStrDup(db
9e70: 2c 20 63 6f 6c 75 6d 6e 54 79 70 65 28 26 73 4e  , columnType(&sN
9e80: 43 2c 20 70 2c 20 30 2c 20 30 2c 20 30 29 29 3b  C, p, 0, 0, 0));
9e90: 0a 20 20 20 20 70 43 6f 6c 2d 3e 7a 54 79 70 65  .    pCol->zType
9ea0: 20 3d 20 7a 54 79 70 65 3b 0a 20 20 20 20 70 43   = zType;.    pC
9eb0: 6f 6c 2d 3e 61 66 66 69 6e 69 74 79 20 3d 20 73  ol->affinity = s
9ec0: 71 6c 69 74 65 33 45 78 70 72 41 66 66 69 6e 69  qlite3ExprAffini
9ed0: 74 79 28 70 29 3b 0a 20 20 20 20 70 43 6f 6c 6c  ty(p);.    pColl
9ee0: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f   = sqlite3ExprCo
9ef0: 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70 29  llSeq(pParse, p)
9f00: 3b 0a 20 20 20 20 69 66 28 20 70 43 6f 6c 6c 20  ;.    if( pColl 
9f10: 29 7b 0a 20 20 20 20 20 20 70 43 6f 6c 2d 3e 7a  ){.      pCol->z
9f20: 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 44 62  Coll = sqlite3Db
9f30: 53 74 72 44 75 70 28 64 62 2c 20 70 43 6f 6c 6c  StrDup(db, pColl
9f40: 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 7d 0a  ->zName);.    }.
9f50: 20 20 7d 0a 20 20 70 54 61 62 2d 3e 69 50 4b 65    }.  pTab->iPKe
9f60: 79 20 3d 20 2d 31 3b 0a 20 20 72 65 74 75 72 6e  y = -1;.  return
9f70: 20 70 54 61 62 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   pTab;.}../*.** 
9f80: 50 72 65 70 61 72 65 20 61 20 53 45 4c 45 43 54  Prepare a SELECT
9f90: 20 73 74 61 74 65 6d 65 6e 74 20 66 6f 72 20 70   statement for p
9fa0: 72 6f 63 65 73 73 69 6e 67 20 62 79 20 64 6f 69  rocessing by doi
9fb0: 6e 67 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  ng the following
9fc0: 0a 2a 2a 20 74 68 69 6e 67 73 3a 0a 2a 2a 0a 2a  .** things:.**.*
9fd0: 2a 20 20 20 20 28 31 29 20 20 4d 61 6b 65 20 73  *    (1)  Make s
9fe0: 75 72 65 20 56 44 42 45 20 63 75 72 73 6f 72 20  ure VDBE cursor 
9ff0: 6e 75 6d 62 65 72 73 20 68 61 76 65 20 62 65 65  numbers have bee
a000: 6e 20 61 73 73 69 67 6e 65 64 20 74 6f 20 65 76  n assigned to ev
a010: 65 72 79 0a 2a 2a 20 20 20 20 20 20 20 20 20 65  ery.**         e
a020: 6c 65 6d 65 6e 74 20 6f 66 20 74 68 65 20 46 52  lement of the FR
a030: 4f 4d 20 63 6c 61 75 73 65 2e 0a 2a 2a 0a 2a 2a  OM clause..**.**
a040: 20 20 20 20 28 32 29 20 20 46 69 6c 6c 20 69 6e      (2)  Fill in
a050: 20 74 68 65 20 70 54 61 62 4c 69 73 74 2d 3e 61   the pTabList->a
a060: 5b 5d 2e 70 54 61 62 20 66 69 65 6c 64 73 20 69  [].pTab fields i
a070: 6e 20 74 68 65 20 53 72 63 4c 69 73 74 20 74 68  n the SrcList th
a080: 61 74 20 0a 2a 2a 20 20 20 20 20 20 20 20 20 64  at .**         d
a090: 65 66 69 6e 65 73 20 46 52 4f 4d 20 63 6c 61 75  efines FROM clau
a0a0: 73 65 2e 20 20 57 68 65 6e 20 76 69 65 77 73 20  se.  When views 
a0b0: 61 70 70 65 61 72 20 69 6e 20 74 68 65 20 46 52  appear in the FR
a0c0: 4f 4d 20 63 6c 61 75 73 65 2c 0a 2a 2a 20 20 20  OM clause,.**   
a0d0: 20 20 20 20 20 20 66 69 6c 6c 20 70 54 61 62 4c        fill pTabL
a0e0: 69 73 74 2d 3e 61 5b 5d 2e 70 53 65 6c 65 63 74  ist->a[].pSelect
a0f0: 20 77 69 74 68 20 61 20 63 6f 70 79 20 6f 66 20   with a copy of 
a100: 74 68 65 20 53 45 4c 45 43 54 20 73 74 61 74 65  the SELECT state
a110: 6d 65 6e 74 0a 2a 2a 20 20 20 20 20 20 20 20 20  ment.**         
a120: 74 68 61 74 20 69 6d 70 6c 65 6d 65 6e 74 73 20  that implements 
a130: 74 68 65 20 76 69 65 77 2e 20 20 41 20 63 6f 70  the view.  A cop
a140: 79 20 69 73 20 6d 61 64 65 20 6f 66 20 74 68 65  y is made of the
a150: 20 76 69 65 77 27 73 20 53 45 4c 45 43 54 0a 2a   view's SELECT.*
a160: 2a 20 20 20 20 20 20 20 20 20 73 74 61 74 65 6d  *         statem
a170: 65 6e 74 20 73 6f 20 74 68 61 74 20 77 65 20 63  ent so that we c
a180: 61 6e 20 66 72 65 65 6c 79 20 6d 6f 64 69 66 79  an freely modify
a190: 20 6f 72 20 64 65 6c 65 74 65 20 74 68 61 74 20   or delete that 
a1a0: 73 74 61 74 65 6d 65 6e 74 0a 2a 2a 20 20 20 20  statement.**    
a1b0: 20 20 20 20 20 77 69 74 68 6f 75 74 20 77 6f 72       without wor
a1c0: 72 79 69 6e 67 20 61 62 6f 75 74 20 6d 65 73 73  rying about mess
a1d0: 69 6e 67 20 75 70 20 74 68 65 20 70 72 65 73 69  ing up the presi
a1e0: 73 74 65 6e 74 20 72 65 70 72 65 73 65 6e 74 61  stent representa
a1f0: 74 69 6f 6e 0a 2a 2a 20 20 20 20 20 20 20 20 20  tion.**         
a200: 6f 66 20 74 68 65 20 76 69 65 77 2e 0a 2a 2a 0a  of the view..**.
a210: 2a 2a 20 20 20 20 28 33 29 20 20 41 64 64 20 74  **    (3)  Add t
a220: 65 72 6d 73 20 74 6f 20 74 68 65 20 57 48 45 52  erms to the WHER
a230: 45 20 63 6c 61 75 73 65 20 74 6f 20 61 63 63 6f  E clause to acco
a240: 6d 6f 64 61 74 65 20 74 68 65 20 4e 41 54 55 52  modate the NATUR
a250: 41 4c 20 6b 65 79 77 6f 72 64 0a 2a 2a 20 20 20  AL keyword.**   
a260: 20 20 20 20 20 20 6f 6e 20 6a 6f 69 6e 73 20 61        on joins a
a270: 6e 64 20 74 68 65 20 4f 4e 20 61 6e 64 20 55 53  nd the ON and US
a280: 49 4e 47 20 63 6c 61 75 73 65 20 6f 66 20 6a 6f  ING clause of jo
a290: 69 6e 73 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 28 34  ins..**.**    (4
a2a0: 29 20 20 53 63 61 6e 20 74 68 65 20 6c 69 73 74  )  Scan the list
a2b0: 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74   of columns in t
a2c0: 68 65 20 72 65 73 75 6c 74 20 73 65 74 20 28 70  he result set (p
a2d0: 45 4c 69 73 74 29 20 6c 6f 6f 6b 69 6e 67 0a 2a  EList) looking.*
a2e0: 2a 20 20 20 20 20 20 20 20 20 66 6f 72 20 69 6e  *         for in
a2f0: 73 74 61 6e 63 65 73 20 6f 66 20 74 68 65 20 22  stances of the "
a300: 2a 22 20 6f 70 65 72 61 74 6f 72 20 6f 72 20 74  *" operator or t
a310: 68 65 20 54 41 42 4c 45 2e 2a 20 6f 70 65 72 61  he TABLE.* opera
a320: 74 6f 72 2e 0a 2a 2a 20 20 20 20 20 20 20 20 20  tor..**         
a330: 49 66 20 66 6f 75 6e 64 2c 20 65 78 70 61 6e 64  If found, expand
a340: 20 65 61 63 68 20 22 2a 22 20 74 6f 20 62 65 20   each "*" to be 
a350: 65 76 65 72 79 20 63 6f 6c 75 6d 6e 20 69 6e 20  every column in 
a360: 65 76 65 72 79 20 74 61 62 6c 65 0a 2a 2a 20 20  every table.**  
a370: 20 20 20 20 20 20 20 61 6e 64 20 54 41 42 4c 45         and TABLE
a380: 2e 2a 20 74 6f 20 62 65 20 65 76 65 72 79 20 63  .* to be every c
a390: 6f 6c 75 6d 6e 20 69 6e 20 54 41 42 4c 45 2e 0a  olumn in TABLE..
a3a0: 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 30 20 6f  **.** Return 0 o
a3b0: 6e 20 73 75 63 63 65 73 73 2e 20 20 49 66 20 74  n success.  If t
a3c0: 68 65 72 65 20 61 72 65 20 70 72 6f 62 6c 65 6d  here are problem
a3d0: 73 2c 20 6c 65 61 76 65 20 61 6e 20 65 72 72 6f  s, leave an erro
a3e0: 72 20 6d 65 73 73 61 67 65 0a 2a 2a 20 69 6e 20  r message.** in 
a3f0: 70 50 61 72 73 65 20 61 6e 64 20 72 65 74 75 72  pParse and retur
a400: 6e 20 6e 6f 6e 2d 7a 65 72 6f 2e 0a 2a 2f 0a 73  n non-zero..*/.s
a410: 74 61 74 69 63 20 69 6e 74 20 70 72 65 70 53 65  tatic int prepSe
a420: 6c 65 63 74 53 74 6d 74 28 50 61 72 73 65 20 2a  lectStmt(Parse *
a430: 70 50 61 72 73 65 2c 20 53 65 6c 65 63 74 20 2a  pParse, Select *
a440: 70 29 7b 0a 20 20 69 6e 74 20 69 2c 20 6a 2c 20  p){.  int i, j, 
a450: 6b 2c 20 72 63 3b 0a 20 20 53 72 63 4c 69 73 74  k, rc;.  SrcList
a460: 20 2a 70 54 61 62 4c 69 73 74 3b 0a 20 20 45 78   *pTabList;.  Ex
a470: 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 3b 0a  prList *pEList;.
a480: 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74    struct SrcList
a490: 5f 69 74 65 6d 20 2a 70 46 72 6f 6d 3b 0a 20 20  _item *pFrom;.  
a4a0: 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50  sqlite3 *db = pP
a4b0: 61 72 73 65 2d 3e 64 62 3b 0a 0a 20 20 69 66 28  arse->db;..  if(
a4c0: 20 70 3d 3d 30 20 7c 7c 20 70 2d 3e 70 53 72 63   p==0 || p->pSrc
a4d0: 3d 3d 30 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f  ==0 || db->mallo
a4e0: 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 72  cFailed ){.    r
a4f0: 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 70  eturn 1;.  }.  p
a500: 54 61 62 4c 69 73 74 20 3d 20 70 2d 3e 70 53 72  TabList = p->pSr
a510: 63 3b 0a 20 20 70 45 4c 69 73 74 20 3d 20 70 2d  c;.  pEList = p-
a520: 3e 70 45 4c 69 73 74 3b 0a 0a 20 20 2f 2a 20 4d  >pEList;..  /* M
a530: 61 6b 65 20 73 75 72 65 20 63 75 72 73 6f 72 20  ake sure cursor 
a540: 6e 75 6d 62 65 72 73 20 68 61 76 65 20 62 65 65  numbers have bee
a550: 6e 20 61 73 73 69 67 6e 65 64 20 74 6f 20 61 6c  n assigned to al
a560: 6c 20 65 6e 74 72 69 65 73 20 69 6e 0a 20 20 2a  l entries in.  *
a570: 2a 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73  * the FROM claus
a580: 65 20 6f 66 20 74 68 65 20 53 45 4c 45 43 54 20  e of the SELECT 
a590: 73 74 61 74 65 6d 65 6e 74 2e 0a 20 20 2a 2f 0a  statement..  */.
a5a0: 20 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74    sqlite3SrcList
a5b0: 41 73 73 69 67 6e 43 75 72 73 6f 72 73 28 70 50  AssignCursors(pP
a5c0: 61 72 73 65 2c 20 70 2d 3e 70 53 72 63 29 3b 0a  arse, p->pSrc);.
a5d0: 0a 20 20 2f 2a 20 4c 6f 6f 6b 20 75 70 20 65 76  .  /* Look up ev
a5e0: 65 72 79 20 74 61 62 6c 65 20 6e 61 6d 65 64 20  ery table named 
a5f0: 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75  in the FROM clau
a600: 73 65 20 6f 66 20 74 68 65 20 73 65 6c 65 63 74  se of the select
a610: 2e 20 20 49 66 0a 20 20 2a 2a 20 61 6e 20 65 6e  .  If.  ** an en
a620: 74 72 79 20 6f 66 20 74 68 65 20 46 52 4f 4d 20  try of the FROM 
a630: 63 6c 61 75 73 65 20 69 73 20 61 20 73 75 62 71  clause is a subq
a640: 75 65 72 79 20 69 6e 73 74 65 61 64 20 6f 66 20  uery instead of 
a650: 61 20 74 61 62 6c 65 20 6f 72 20 76 69 65 77 2c  a table or view,
a660: 0a 20 20 2a 2a 20 74 68 65 6e 20 63 72 65 61 74  .  ** then creat
a670: 65 20 61 20 74 72 61 6e 73 69 65 6e 74 20 74 61  e a transient ta
a680: 62 6c 65 20 73 74 72 75 63 74 75 72 65 20 74 6f  ble structure to
a690: 20 64 65 73 63 72 69 62 65 20 74 68 65 20 73 75   describe the su
a6a0: 62 71 75 65 72 79 2e 0a 20 20 2a 2f 0a 20 20 66  bquery..  */.  f
a6b0: 6f 72 28 69 3d 30 2c 20 70 46 72 6f 6d 3d 70 54  or(i=0, pFrom=pT
a6c0: 61 62 4c 69 73 74 2d 3e 61 3b 20 69 3c 70 54 61  abList->a; i<pTa
a6d0: 62 4c 69 73 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b  bList->nSrc; i++
a6e0: 2c 20 70 46 72 6f 6d 2b 2b 29 7b 0a 20 20 20 20  , pFrom++){.    
a6f0: 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20 20  Table *pTab;.   
a700: 20 69 66 28 20 70 46 72 6f 6d 2d 3e 70 54 61 62   if( pFrom->pTab
a710: 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  !=0 ){.      /* 
a720: 54 68 69 73 20 73 74 61 74 65 6d 65 6e 74 20 68  This statement h
a730: 61 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20  as already been 
a740: 70 72 65 70 61 72 65 64 2e 20 20 54 68 65 72 65  prepared.  There
a750: 20 69 73 20 6e 6f 20 6e 65 65 64 0a 20 20 20 20   is no need.    
a760: 20 20 2a 2a 20 74 6f 20 67 6f 20 66 75 72 74 68    ** to go furth
a770: 65 72 2e 20 2a 2f 0a 20 20 20 20 20 20 61 73 73  er. */.      ass
a780: 65 72 74 28 20 69 3d 3d 30 20 29 3b 0a 20 20 20  ert( i==0 );.   
a790: 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20     return 0;.   
a7a0: 20 7d 0a 20 20 20 20 69 66 28 20 70 46 72 6f 6d   }.    if( pFrom
a7b0: 2d 3e 7a 4e 61 6d 65 3d 3d 30 20 29 7b 0a 23 69  ->zName==0 ){.#i
a7c0: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
a7d0: 54 5f 53 55 42 51 55 45 52 59 0a 20 20 20 20 20  T_SUBQUERY.     
a7e0: 20 2f 2a 20 41 20 73 75 62 2d 71 75 65 72 79 20   /* A sub-query 
a7f0: 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75  in the FROM clau
a800: 73 65 20 6f 66 20 61 20 53 45 4c 45 43 54 20 2a  se of a SELECT *
a810: 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  /.      assert( 
a820: 70 46 72 6f 6d 2d 3e 70 53 65 6c 65 63 74 21 3d  pFrom->pSelect!=
a830: 30 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70  0 );.      if( p
a840: 46 72 6f 6d 2d 3e 7a 41 6c 69 61 73 3d 3d 30 20  From->zAlias==0 
a850: 29 7b 0a 20 20 20 20 20 20 20 20 70 46 72 6f 6d  ){.        pFrom
a860: 2d 3e 7a 41 6c 69 61 73 20 3d 0a 20 20 20 20 20  ->zAlias =.     
a870: 20 20 20 20 20 73 71 6c 69 74 65 33 4d 50 72 69       sqlite3MPri
a880: 6e 74 66 28 64 62 2c 20 22 73 71 6c 69 74 65 5f  ntf(db, "sqlite_
a890: 73 75 62 71 75 65 72 79 5f 25 70 5f 22 2c 20 28  subquery_%p_", (
a8a0: 76 6f 69 64 2a 29 70 46 72 6f 6d 2d 3e 70 53 65  void*)pFrom->pSe
a8b0: 6c 65 63 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20  lect);.      }. 
a8c0: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 46 72       assert( pFr
a8d0: 6f 6d 2d 3e 70 54 61 62 3d 3d 30 20 29 3b 0a 20  om->pTab==0 );. 
a8e0: 20 20 20 20 20 70 46 72 6f 6d 2d 3e 70 54 61 62       pFrom->pTab
a8f0: 20 3d 20 70 54 61 62 20 3d 20 0a 20 20 20 20 20   = pTab = .     
a900: 20 20 20 73 71 6c 69 74 65 33 52 65 73 75 6c 74     sqlite3Result
a910: 53 65 74 4f 66 53 65 6c 65 63 74 28 70 50 61 72  SetOfSelect(pPar
a920: 73 65 2c 20 70 46 72 6f 6d 2d 3e 7a 41 6c 69 61  se, pFrom->zAlia
a930: 73 2c 20 70 46 72 6f 6d 2d 3e 70 53 65 6c 65 63  s, pFrom->pSelec
a940: 74 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 54  t);.      if( pT
a950: 61 62 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  ab==0 ){.       
a960: 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 20   return 1;.     
a970: 20 7d 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20   }.      /* The 
a980: 69 73 45 70 68 65 6d 20 66 6c 61 67 20 69 6e 64  isEphem flag ind
a990: 69 63 61 74 65 73 20 74 68 61 74 20 74 68 65 20  icates that the 
a9a0: 54 61 62 6c 65 20 73 74 72 75 63 74 75 72 65 20  Table structure 
a9b0: 68 61 73 20 62 65 65 6e 0a 20 20 20 20 20 20 2a  has been.      *
a9c0: 2a 20 64 79 6e 61 6d 69 63 61 6c 6c 79 20 61 6c  * dynamically al
a9d0: 6c 6f 63 61 74 65 64 20 61 6e 64 20 6d 61 79 20  located and may 
a9e0: 62 65 20 66 72 65 65 64 20 61 74 20 61 6e 79 20  be freed at any 
a9f0: 74 69 6d 65 2e 20 20 49 6e 20 6f 74 68 65 72 20  time.  In other 
aa00: 77 6f 72 64 73 2c 0a 20 20 20 20 20 20 2a 2a 20  words,.      ** 
aa10: 70 54 61 62 20 69 73 20 6e 6f 74 20 70 6f 69 6e  pTab is not poin
aa20: 74 69 6e 67 20 74 6f 20 61 20 70 65 72 73 69 73  ting to a persis
aa30: 74 65 6e 74 20 74 61 62 6c 65 20 73 74 72 75 63  tent table struc
aa40: 74 75 72 65 20 74 68 61 74 20 64 65 66 69 6e 65  ture that define
aa50: 73 0a 20 20 20 20 20 20 2a 2a 20 70 61 72 74 20  s.      ** part 
aa60: 6f 66 20 74 68 65 20 73 63 68 65 6d 61 2e 20 2a  of the schema. *
aa70: 2f 0a 20 20 20 20 20 20 70 54 61 62 2d 3e 69 73  /.      pTab->is
aa80: 45 70 68 65 6d 20 3d 20 31 3b 0a 23 65 6e 64 69  Ephem = 1;.#endi
aa90: 66 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  f.    }else{.   
aaa0: 20 20 20 2f 2a 20 41 6e 20 6f 72 64 69 6e 61 72     /* An ordinar
aab0: 79 20 74 61 62 6c 65 20 6f 72 20 76 69 65 77 20  y table or view 
aac0: 6e 61 6d 65 20 69 6e 20 74 68 65 20 46 52 4f 4d  name in the FROM
aad0: 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 20 20 20   clause */.     
aae0: 20 61 73 73 65 72 74 28 20 70 46 72 6f 6d 2d 3e   assert( pFrom->
aaf0: 70 54 61 62 3d 3d 30 20 29 3b 0a 20 20 20 20 20  pTab==0 );.     
ab00: 20 70 46 72 6f 6d 2d 3e 70 54 61 62 20 3d 20 70   pFrom->pTab = p
ab10: 54 61 62 20 3d 20 0a 20 20 20 20 20 20 20 20 73  Tab = .        s
ab20: 71 6c 69 74 65 33 4c 6f 63 61 74 65 54 61 62 6c  qlite3LocateTabl
ab30: 65 28 70 50 61 72 73 65 2c 30 2c 70 46 72 6f 6d  e(pParse,0,pFrom
ab40: 2d 3e 7a 4e 61 6d 65 2c 70 46 72 6f 6d 2d 3e 7a  ->zName,pFrom->z
ab50: 44 61 74 61 62 61 73 65 29 3b 0a 20 20 20 20 20  Database);.     
ab60: 20 69 66 28 20 70 54 61 62 3d 3d 30 20 29 7b 0a   if( pTab==0 ){.
ab70: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 31          return 1
ab80: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
ab90: 70 54 61 62 2d 3e 6e 52 65 66 2b 2b 3b 0a 23 69  pTab->nRef++;.#i
aba0: 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  f !defined(SQLIT
abb0: 45 5f 4f 4d 49 54 5f 56 49 45 57 29 20 7c 7c 20  E_OMIT_VIEW) || 
abc0: 21 64 65 66 69 6e 65 64 20 28 53 51 4c 49 54 45  !defined (SQLITE
abd0: 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42  _OMIT_VIRTUALTAB
abe0: 4c 45 29 0a 20 20 20 20 20 20 69 66 28 20 70 54  LE).      if( pT
abf0: 61 62 2d 3e 70 53 65 6c 65 63 74 20 7c 7c 20 49  ab->pSelect || I
ac00: 73 56 69 72 74 75 61 6c 28 70 54 61 62 29 20 29  sVirtual(pTab) )
ac10: 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 57 65 20  {.        /* We 
ac20: 72 65 61 63 68 20 68 65 72 65 20 69 66 20 74 68  reach here if th
ac30: 65 20 6e 61 6d 65 64 20 74 61 62 6c 65 20 69 73  e named table is
ac40: 20 61 20 72 65 61 6c 6c 79 20 61 20 76 69 65 77   a really a view
ac50: 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20   */.        if( 
ac60: 73 71 6c 69 74 65 33 56 69 65 77 47 65 74 43 6f  sqlite3ViewGetCo
ac70: 6c 75 6d 6e 4e 61 6d 65 73 28 70 50 61 72 73 65  lumnNames(pParse
ac80: 2c 20 70 54 61 62 29 20 29 7b 0a 20 20 20 20 20  , pTab) ){.     
ac90: 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20       return 1;. 
aca0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
acb0: 20 2f 2a 20 49 66 20 70 46 72 6f 6d 2d 3e 70 53   /* If pFrom->pS
acc0: 65 6c 65 63 74 21 3d 30 20 69 74 20 6d 65 61 6e  elect!=0 it mean
acd0: 73 20 77 65 20 61 72 65 20 64 65 61 6c 69 6e 67  s we are dealing
ace0: 20 77 69 74 68 20 61 0a 20 20 20 20 20 20 20 20   with a.        
acf0: 2a 2a 20 76 69 65 77 20 77 69 74 68 69 6e 20 61  ** view within a
ad00: 20 76 69 65 77 2e 20 20 54 68 65 20 53 45 4c 45   view.  The SELE
ad10: 43 54 20 73 74 72 75 63 74 75 72 65 20 68 61 73  CT structure has
ad20: 20 61 6c 72 65 61 64 79 20 62 65 65 6e 0a 20 20   already been.  
ad30: 20 20 20 20 20 20 2a 2a 20 63 6f 70 69 65 64 20        ** copied 
ad40: 62 79 20 74 68 65 20 6f 75 74 65 72 20 76 69 65  by the outer vie
ad50: 77 20 73 6f 20 77 65 20 63 61 6e 20 73 6b 69 70  w so we can skip
ad60: 20 74 68 65 20 63 6f 70 79 20 73 74 65 70 20 68   the copy step h
ad70: 65 72 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 69  ere.        ** i
ad80: 6e 20 74 68 65 20 69 6e 6e 65 72 20 76 69 65 77  n the inner view
ad90: 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20  ..        */.   
ada0: 20 20 20 20 20 69 66 28 20 70 46 72 6f 6d 2d 3e       if( pFrom->
adb0: 70 53 65 6c 65 63 74 3d 3d 30 20 29 7b 0a 20 20  pSelect==0 ){.  
adc0: 20 20 20 20 20 20 20 20 70 46 72 6f 6d 2d 3e 70          pFrom->p
add0: 53 65 6c 65 63 74 20 3d 20 73 71 6c 69 74 65 33  Select = sqlite3
ade0: 53 65 6c 65 63 74 44 75 70 28 64 62 2c 20 70 54  SelectDup(db, pT
adf0: 61 62 2d 3e 70 53 65 6c 65 63 74 29 3b 0a 20 20  ab->pSelect);.  
ae00: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
ae10: 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a 20 20 7d  #endif.    }.  }
ae20: 0a 0a 20 20 2f 2a 20 50 72 6f 63 65 73 73 20 4e  ..  /* Process N
ae30: 41 54 55 52 41 4c 20 6b 65 79 77 6f 72 64 73 2c  ATURAL keywords,
ae40: 20 61 6e 64 20 4f 4e 20 61 6e 64 20 55 53 49 4e   and ON and USIN
ae50: 47 20 63 6c 61 75 73 65 73 20 6f 66 20 6a 6f 69  G clauses of joi
ae60: 6e 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 73  ns..  */.  if( s
ae70: 71 6c 69 74 65 50 72 6f 63 65 73 73 4a 6f 69 6e  qliteProcessJoin
ae80: 28 70 50 61 72 73 65 2c 20 70 29 20 29 20 72 65  (pParse, p) ) re
ae90: 74 75 72 6e 20 31 3b 0a 0a 20 20 2f 2a 20 46 6f  turn 1;..  /* Fo
aea0: 72 20 65 76 65 72 79 20 22 2a 22 20 74 68 61 74  r every "*" that
aeb0: 20 6f 63 63 75 72 73 20 69 6e 20 74 68 65 20 63   occurs in the c
aec0: 6f 6c 75 6d 6e 20 6c 69 73 74 2c 20 69 6e 73 65  olumn list, inse
aed0: 72 74 20 74 68 65 20 6e 61 6d 65 73 20 6f 66 0a  rt the names of.
aee0: 20 20 2a 2a 20 61 6c 6c 20 63 6f 6c 75 6d 6e 73    ** all columns
aef0: 20 69 6e 20 61 6c 6c 20 74 61 62 6c 65 73 2e 20   in all tables. 
af00: 20 41 6e 64 20 66 6f 72 20 65 76 65 72 79 20 54   And for every T
af10: 41 42 4c 45 2e 2a 20 69 6e 73 65 72 74 20 74 68  ABLE.* insert th
af20: 65 20 6e 61 6d 65 73 0a 20 20 2a 2a 20 6f 66 20  e names.  ** of 
af30: 61 6c 6c 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 54  all columns in T
af40: 41 42 4c 45 2e 20 20 54 68 65 20 70 61 72 73 65  ABLE.  The parse
af50: 72 20 69 6e 73 65 72 74 65 64 20 61 20 73 70 65  r inserted a spe
af60: 63 69 61 6c 20 65 78 70 72 65 73 73 69 6f 6e 0a  cial expression.
af70: 20 20 2a 2a 20 77 69 74 68 20 74 68 65 20 54 4b    ** with the TK
af80: 5f 41 4c 4c 20 6f 70 65 72 61 74 6f 72 20 66 6f  _ALL operator fo
af90: 72 20 65 61 63 68 20 22 2a 22 20 74 68 61 74 20  r each "*" that 
afa0: 69 74 20 66 6f 75 6e 64 20 69 6e 20 74 68 65 20  it found in the 
afb0: 63 6f 6c 75 6d 6e 20 6c 69 73 74 2e 0a 20 20 2a  column list..  *
afc0: 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  * The following 
afd0: 63 6f 64 65 20 6a 75 73 74 20 68 61 73 20 74 6f  code just has to
afe0: 20 6c 6f 63 61 74 65 20 74 68 65 20 54 4b 5f 41   locate the TK_A
aff0: 4c 4c 20 65 78 70 72 65 73 73 69 6f 6e 73 20 61  LL expressions a
b000: 6e 64 20 65 78 70 61 6e 64 0a 20 20 2a 2a 20 65  nd expand.  ** e
b010: 61 63 68 20 6f 6e 65 20 74 6f 20 74 68 65 20 6c  ach one to the l
b020: 69 73 74 20 6f 66 20 61 6c 6c 20 63 6f 6c 75 6d  ist of all colum
b030: 6e 73 20 69 6e 20 61 6c 6c 20 74 61 62 6c 65 73  ns in all tables
b040: 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20  ..  **.  ** The 
b050: 66 69 72 73 74 20 6c 6f 6f 70 20 6a 75 73 74 20  first loop just 
b060: 63 68 65 63 6b 73 20 74 6f 20 73 65 65 20 69 66  checks to see if
b070: 20 74 68 65 72 65 20 61 72 65 20 61 6e 79 20 22   there are any "
b080: 2a 22 20 6f 70 65 72 61 74 6f 72 73 0a 20 20 2a  *" operators.  *
b090: 2a 20 74 68 61 74 20 6e 65 65 64 20 65 78 70 61  * that need expa
b0a0: 6e 64 69 6e 67 2e 0a 20 20 2a 2f 0a 20 20 66 6f  nding..  */.  fo
b0b0: 72 28 6b 3d 30 3b 20 6b 3c 70 45 4c 69 73 74 2d  r(k=0; k<pEList-
b0c0: 3e 6e 45 78 70 72 3b 20 6b 2b 2b 29 7b 0a 20 20  >nExpr; k++){.  
b0d0: 20 20 45 78 70 72 20 2a 70 45 20 3d 20 70 45 4c    Expr *pE = pEL
b0e0: 69 73 74 2d 3e 61 5b 6b 5d 2e 70 45 78 70 72 3b  ist->a[k].pExpr;
b0f0: 0a 20 20 20 20 69 66 28 20 70 45 2d 3e 6f 70 3d  .    if( pE->op=
b100: 3d 54 4b 5f 41 4c 4c 20 29 20 62 72 65 61 6b 3b  =TK_ALL ) break;
b110: 0a 20 20 20 20 69 66 28 20 70 45 2d 3e 6f 70 3d  .    if( pE->op=
b120: 3d 54 4b 5f 44 4f 54 20 26 26 20 70 45 2d 3e 70  =TK_DOT && pE->p
b130: 52 69 67 68 74 20 26 26 20 70 45 2d 3e 70 52 69  Right && pE->pRi
b140: 67 68 74 2d 3e 6f 70 3d 3d 54 4b 5f 41 4c 4c 0a  ght->op==TK_ALL.
b150: 20 20 20 20 20 20 20 20 20 26 26 20 70 45 2d 3e           && pE->
b160: 70 4c 65 66 74 20 26 26 20 70 45 2d 3e 70 4c 65  pLeft && pE->pLe
b170: 66 74 2d 3e 6f 70 3d 3d 54 4b 5f 49 44 20 29 20  ft->op==TK_ID ) 
b180: 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 72 63 20  break;.  }.  rc 
b190: 3d 20 30 3b 0a 20 20 69 66 28 20 6b 3c 70 45 4c  = 0;.  if( k<pEL
b1a0: 69 73 74 2d 3e 6e 45 78 70 72 20 29 7b 0a 20 20  ist->nExpr ){.  
b1b0: 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 49 66 20 77    /*.    ** If w
b1c0: 65 20 67 65 74 20 68 65 72 65 20 69 74 20 6d 65  e get here it me
b1d0: 61 6e 73 20 74 68 65 20 72 65 73 75 6c 74 20 73  ans the result s
b1e0: 65 74 20 63 6f 6e 74 61 69 6e 73 20 6f 6e 65 20  et contains one 
b1f0: 6f 72 20 6d 6f 72 65 20 22 2a 22 0a 20 20 20 20  or more "*".    
b200: 2a 2a 20 6f 70 65 72 61 74 6f 72 73 20 74 68 61  ** operators tha
b210: 74 20 6e 65 65 64 20 74 6f 20 62 65 20 65 78 70  t need to be exp
b220: 61 6e 64 65 64 2e 20 20 4c 6f 6f 70 20 74 68 72  anded.  Loop thr
b230: 6f 75 67 68 20 65 61 63 68 20 65 78 70 72 65 73  ough each expres
b240: 73 69 6f 6e 0a 20 20 20 20 2a 2a 20 69 6e 20 74  sion.    ** in t
b250: 68 65 20 72 65 73 75 6c 74 20 73 65 74 20 61 6e  he result set an
b260: 64 20 65 78 70 61 6e 64 20 74 68 65 6d 20 6f 6e  d expand them on
b270: 65 20 62 79 20 6f 6e 65 2e 0a 20 20 20 20 2a 2f  e by one..    */
b280: 0a 20 20 20 20 73 74 72 75 63 74 20 45 78 70 72  .    struct Expr
b290: 4c 69 73 74 5f 69 74 65 6d 20 2a 61 20 3d 20 70  List_item *a = p
b2a0: 45 4c 69 73 74 2d 3e 61 3b 0a 20 20 20 20 45 78  EList->a;.    Ex
b2b0: 70 72 4c 69 73 74 20 2a 70 4e 65 77 20 3d 20 30  prList *pNew = 0
b2c0: 3b 0a 20 20 20 20 69 6e 74 20 66 6c 61 67 73 20  ;.    int flags 
b2d0: 3d 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 66 6c  = pParse->db->fl
b2e0: 61 67 73 3b 0a 20 20 20 20 69 6e 74 20 6c 6f 6e  ags;.    int lon
b2f0: 67 4e 61 6d 65 73 20 3d 20 28 66 6c 61 67 73 20  gNames = (flags 
b300: 26 20 53 51 4c 49 54 45 5f 46 75 6c 6c 43 6f 6c  & SQLITE_FullCol
b310: 4e 61 6d 65 73 29 21 3d 30 20 26 26 0a 20 20 20  Names)!=0 &&.   
b320: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b330: 20 20 20 28 66 6c 61 67 73 20 26 20 53 51 4c 49     (flags & SQLI
b340: 54 45 5f 53 68 6f 72 74 43 6f 6c 4e 61 6d 65 73  TE_ShortColNames
b350: 29 3d 3d 30 3b 0a 0a 20 20 20 20 66 6f 72 28 6b  )==0;..    for(k
b360: 3d 30 3b 20 6b 3c 70 45 4c 69 73 74 2d 3e 6e 45  =0; k<pEList->nE
b370: 78 70 72 3b 20 6b 2b 2b 29 7b 0a 20 20 20 20 20  xpr; k++){.     
b380: 20 45 78 70 72 20 2a 70 45 20 3d 20 61 5b 6b 5d   Expr *pE = a[k]
b390: 2e 70 45 78 70 72 3b 0a 20 20 20 20 20 20 69 66  .pExpr;.      if
b3a0: 28 20 70 45 2d 3e 6f 70 21 3d 54 4b 5f 41 4c 4c  ( pE->op!=TK_ALL
b3b0: 20 26 26 0a 20 20 20 20 20 20 20 20 20 20 20 28   &&.           (
b3c0: 70 45 2d 3e 6f 70 21 3d 54 4b 5f 44 4f 54 20 7c  pE->op!=TK_DOT |
b3d0: 7c 20 70 45 2d 3e 70 52 69 67 68 74 3d 3d 30 20  | pE->pRight==0 
b3e0: 7c 7c 20 70 45 2d 3e 70 52 69 67 68 74 2d 3e 6f  || pE->pRight->o
b3f0: 70 21 3d 54 4b 5f 41 4c 4c 29 20 29 7b 0a 20 20  p!=TK_ALL) ){.  
b400: 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20 70 61        /* This pa
b410: 72 74 69 63 75 6c 61 72 20 65 78 70 72 65 73 73  rticular express
b420: 69 6f 6e 20 64 6f 65 73 20 6e 6f 74 20 6e 65 65  ion does not nee
b430: 64 20 74 6f 20 62 65 20 65 78 70 61 6e 64 65 64  d to be expanded
b440: 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20  ..        */.   
b450: 20 20 20 20 20 70 4e 65 77 20 3d 20 73 71 6c 69       pNew = sqli
b460: 74 65 33 45 78 70 72 4c 69 73 74 41 70 70 65 6e  te3ExprListAppen
b470: 64 28 70 50 61 72 73 65 2c 20 70 4e 65 77 2c 20  d(pParse, pNew, 
b480: 61 5b 6b 5d 2e 70 45 78 70 72 2c 20 30 29 3b 0a  a[k].pExpr, 0);.
b490: 20 20 20 20 20 20 20 20 69 66 28 20 70 4e 65 77          if( pNew
b4a0: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 4e   ){.          pN
b4b0: 65 77 2d 3e 61 5b 70 4e 65 77 2d 3e 6e 45 78 70  ew->a[pNew->nExp
b4c0: 72 2d 31 5d 2e 7a 4e 61 6d 65 20 3d 20 61 5b 6b  r-1].zName = a[k
b4d0: 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20 20  ].zName;.       
b4e0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
b4f0: 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 20 20    rc = 1;.      
b500: 20 20 7d 0a 20 20 20 20 20 20 20 20 61 5b 6b 5d    }.        a[k]
b510: 2e 70 45 78 70 72 20 3d 20 30 3b 0a 20 20 20 20  .pExpr = 0;.    
b520: 20 20 20 20 61 5b 6b 5d 2e 7a 4e 61 6d 65 20 3d      a[k].zName =
b530: 20 30 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b   0;.      }else{
b540: 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68 69 73  .        /* This
b550: 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 61   expression is a
b560: 20 22 2a 22 20 6f 72 20 61 20 22 54 41 42 4c 45   "*" or a "TABLE
b570: 2e 2a 22 20 61 6e 64 20 6e 65 65 64 73 20 74 6f  .*" and needs to
b580: 20 62 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 65   be.        ** e
b590: 78 70 61 6e 64 65 64 2e 20 2a 2f 0a 20 20 20 20  xpanded. */.    
b5a0: 20 20 20 20 69 6e 74 20 74 61 62 6c 65 53 65 65      int tableSee
b5b0: 6e 20 3d 20 30 3b 20 20 20 20 20 20 2f 2a 20 53  n = 0;      /* S
b5c0: 65 74 20 74 6f 20 31 20 77 68 65 6e 20 54 41 42  et to 1 when TAB
b5d0: 4c 45 20 6d 61 74 63 68 65 73 20 2a 2f 0a 20 20  LE matches */.  
b5e0: 20 20 20 20 20 20 63 68 61 72 20 2a 7a 54 4e 61        char *zTNa
b5f0: 6d 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  me;            /
b600: 2a 20 74 65 78 74 20 6f 66 20 6e 61 6d 65 20 6f  * text of name o
b610: 66 20 54 41 42 4c 45 20 2a 2f 0a 20 20 20 20 20  f TABLE */.     
b620: 20 20 20 69 66 28 20 70 45 2d 3e 6f 70 3d 3d 54     if( pE->op==T
b630: 4b 5f 44 4f 54 20 26 26 20 70 45 2d 3e 70 4c 65  K_DOT && pE->pLe
b640: 66 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ft ){.          
b650: 7a 54 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33  zTName = sqlite3
b660: 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 64 62  NameFromToken(db
b670: 2c 20 26 70 45 2d 3e 70 4c 65 66 74 2d 3e 74 6f  , &pE->pLeft->to
b680: 6b 65 6e 29 3b 0a 20 20 20 20 20 20 20 20 7d 65  ken);.        }e
b690: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 7a  lse{.          z
b6a0: 54 4e 61 6d 65 20 3d 20 30 3b 0a 20 20 20 20 20  TName = 0;.     
b6b0: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 66 6f 72     }.        for
b6c0: 28 69 3d 30 2c 20 70 46 72 6f 6d 3d 70 54 61 62  (i=0, pFrom=pTab
b6d0: 4c 69 73 74 2d 3e 61 3b 20 69 3c 70 54 61 62 4c  List->a; i<pTabL
b6e0: 69 73 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b 2c 20  ist->nSrc; i++, 
b6f0: 70 46 72 6f 6d 2b 2b 29 7b 0a 20 20 20 20 20 20  pFrom++){.      
b700: 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20      Table *pTab 
b710: 3d 20 70 46 72 6f 6d 2d 3e 70 54 61 62 3b 0a 20  = pFrom->pTab;. 
b720: 20 20 20 20 20 20 20 20 20 63 68 61 72 20 2a 7a           char *z
b730: 54 61 62 4e 61 6d 65 20 3d 20 70 46 72 6f 6d 2d  TabName = pFrom-
b740: 3e 7a 41 6c 69 61 73 3b 0a 20 20 20 20 20 20 20  >zAlias;.       
b750: 20 20 20 69 66 28 20 7a 54 61 62 4e 61 6d 65 3d     if( zTabName=
b760: 3d 30 20 7c 7c 20 7a 54 61 62 4e 61 6d 65 5b 30  =0 || zTabName[0
b770: 5d 3d 3d 30 20 29 7b 20 0a 20 20 20 20 20 20 20  ]==0 ){ .       
b780: 20 20 20 20 20 7a 54 61 62 4e 61 6d 65 20 3d 20       zTabName = 
b790: 70 54 61 62 2d 3e 7a 4e 61 6d 65 3b 0a 20 20 20  pTab->zName;.   
b7a0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
b7b0: 20 20 20 69 66 28 20 7a 54 4e 61 6d 65 20 26 26     if( zTName &&
b7c0: 20 28 7a 54 61 62 4e 61 6d 65 3d 3d 30 20 7c 7c   (zTabName==0 ||
b7d0: 20 7a 54 61 62 4e 61 6d 65 5b 30 5d 3d 3d 30 20   zTabName[0]==0 
b7e0: 7c 7c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  || .            
b7f0: 20 20 20 20 20 73 71 6c 69 74 65 33 53 74 72 49       sqlite3StrI
b800: 43 6d 70 28 7a 54 4e 61 6d 65 2c 20 7a 54 61 62  Cmp(zTName, zTab
b810: 4e 61 6d 65 29 21 3d 30 29 20 29 7b 0a 20 20 20  Name)!=0) ){.   
b820: 20 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75           continu
b830: 65 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  e;.          }. 
b840: 20 20 20 20 20 20 20 20 20 74 61 62 6c 65 53 65           tableSe
b850: 65 6e 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20  en = 1;.        
b860: 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 54 61    for(j=0; j<pTa
b870: 62 2d 3e 6e 43 6f 6c 3b 20 6a 2b 2b 29 7b 0a 20  b->nCol; j++){. 
b880: 20 20 20 20 20 20 20 20 20 20 20 45 78 70 72 20             Expr 
b890: 2a 70 45 78 70 72 2c 20 2a 70 52 69 67 68 74 3b  *pExpr, *pRight;
b8a0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 63 68 61  .            cha
b8b0: 72 20 2a 7a 4e 61 6d 65 20 3d 20 70 54 61 62 2d  r *zName = pTab-
b8c0: 3e 61 43 6f 6c 5b 6a 5d 2e 7a 4e 61 6d 65 3b 0a  >aCol[j].zName;.
b8d0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  .            /* 
b8e0: 49 66 20 61 20 63 6f 6c 75 6d 6e 20 69 73 20 6d  If a column is m
b8f0: 61 72 6b 65 64 20 61 73 20 27 68 69 64 64 65 6e  arked as 'hidden
b900: 27 20 28 63 75 72 72 65 6e 74 6c 79 20 6f 6e 6c  ' (currently onl
b910: 79 20 70 6f 73 73 69 62 6c 65 0a 20 20 20 20 20  y possible.     
b920: 20 20 20 20 20 20 20 2a 2a 20 66 6f 72 20 76 69         ** for vi
b930: 72 74 75 61 6c 20 74 61 62 6c 65 73 29 2c 20 64  rtual tables), d
b940: 6f 20 6e 6f 74 20 69 6e 63 6c 75 64 65 20 69 74  o not include it
b950: 20 69 6e 20 74 68 65 20 65 78 70 61 6e 64 65 64   in the expanded
b960: 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20  .            ** 
b970: 72 65 73 75 6c 74 2d 73 65 74 20 6c 69 73 74 2e  result-set list.
b980: 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2f 0a  .            */.
b990: 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
b9a0: 49 73 48 69 64 64 65 6e 43 6f 6c 75 6d 6e 28 26  IsHiddenColumn(&
b9b0: 70 54 61 62 2d 3e 61 43 6f 6c 5b 6a 5d 29 20 29  pTab->aCol[j]) )
b9c0: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
b9d0: 61 73 73 65 72 74 28 49 73 56 69 72 74 75 61 6c  assert(IsVirtual
b9e0: 28 70 54 61 62 29 29 3b 0a 20 20 20 20 20 20 20  (pTab));.       
b9f0: 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b         continue;
ba00: 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 0a  .            }..
ba10: 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
ba20: 69 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  i>0 ){.         
ba30: 20 20 20 20 20 73 74 72 75 63 74 20 53 72 63 4c       struct SrcL
ba40: 69 73 74 5f 69 74 65 6d 20 2a 70 4c 65 66 74 20  ist_item *pLeft 
ba50: 3d 20 26 70 54 61 62 4c 69 73 74 2d 3e 61 5b 69  = &pTabList->a[i
ba60: 2d 31 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 20  -1];.           
ba70: 20 20 20 69 66 28 20 28 70 4c 65 66 74 5b 31 5d     if( (pLeft[1]
ba80: 2e 6a 6f 69 6e 74 79 70 65 20 26 20 4a 54 5f 4e  .jointype & JT_N
ba90: 41 54 55 52 41 4c 29 21 3d 30 20 26 26 0a 20 20  ATURAL)!=0 &&.  
baa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bab0: 20 20 20 20 20 20 63 6f 6c 75 6d 6e 49 6e 64 65        columnInde
bac0: 78 28 70 4c 65 66 74 2d 3e 70 54 61 62 2c 20 7a  x(pLeft->pTab, z
bad0: 4e 61 6d 65 29 3e 3d 30 20 29 7b 0a 20 20 20 20  Name)>=0 ){.    
bae0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
baf0: 6e 20 61 20 4e 41 54 55 52 41 4c 20 6a 6f 69 6e  n a NATURAL join
bb00: 2c 20 6f 6d 69 74 20 74 68 65 20 6a 6f 69 6e 20  , omit the join 
bb10: 63 6f 6c 75 6d 6e 73 20 66 72 6f 6d 20 74 68 65  columns from the
bb20: 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20   .              
bb30: 20 20 2a 2a 20 74 61 62 6c 65 20 6f 6e 20 74 68    ** table on th
bb40: 65 20 72 69 67 68 74 20 2a 2f 0a 20 20 20 20 20  e right */.     
bb50: 20 20 20 20 20 20 20 20 20 20 20 63 6f 6e 74 69             conti
bb60: 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20  nue;.           
bb70: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20     }.           
bb80: 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 49 64     if( sqlite3Id
bb90: 4c 69 73 74 49 6e 64 65 78 28 70 4c 65 66 74 5b  ListIndex(pLeft[
bba0: 31 5d 2e 70 55 73 69 6e 67 2c 20 7a 4e 61 6d 65  1].pUsing, zName
bbb0: 29 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )>=0 ){.        
bbc0: 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 20 61 20          /* In a 
bbd0: 6a 6f 69 6e 20 77 69 74 68 20 61 20 55 53 49 4e  join with a USIN
bbe0: 47 20 63 6c 61 75 73 65 2c 20 6f 6d 69 74 20 63  G clause, omit c
bbf0: 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 0a 20 20  olumns in the.  
bc00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a                **
bc10: 20 75 73 69 6e 67 20 63 6c 61 75 73 65 20 66 72   using clause fr
bc20: 6f 6d 20 74 68 65 20 74 61 62 6c 65 20 6f 6e 20  om the table on 
bc30: 74 68 65 20 72 69 67 68 74 2e 20 2a 2f 0a 20 20  the right. */.  
bc40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 63 6f                co
bc50: 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20  ntinue;.        
bc60: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
bc70: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
bc80: 20 20 70 52 69 67 68 74 20 3d 20 73 71 6c 69 74    pRight = sqlit
bc90: 65 33 50 45 78 70 72 28 70 50 61 72 73 65 2c 20  e3PExpr(pParse, 
bca0: 54 4b 5f 49 44 2c 20 30 2c 20 30 2c 20 30 29 3b  TK_ID, 0, 0, 0);
bcb0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28  .            if(
bcc0: 20 70 52 69 67 68 74 3d 3d 30 20 29 20 62 72 65   pRight==0 ) bre
bcd0: 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ak;.            
bce0: 73 65 74 51 75 6f 74 65 64 54 6f 6b 65 6e 28 70  setQuotedToken(p
bcf0: 50 61 72 73 65 2c 20 26 70 52 69 67 68 74 2d 3e  Parse, &pRight->
bd00: 74 6f 6b 65 6e 2c 20 7a 4e 61 6d 65 29 3b 0a 20  token, zName);. 
bd10: 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 7a             if( z
bd20: 54 61 62 4e 61 6d 65 20 26 26 20 28 6c 6f 6e 67  TabName && (long
bd30: 4e 61 6d 65 73 20 7c 7c 20 70 54 61 62 4c 69 73  Names || pTabLis
bd40: 74 2d 3e 6e 53 72 63 3e 31 29 20 29 7b 0a 20 20  t->nSrc>1) ){.  
bd50: 20 20 20 20 20 20 20 20 20 20 20 20 45 78 70 72              Expr
bd60: 20 2a 70 4c 65 66 74 20 3d 20 73 71 6c 69 74 65   *pLeft = sqlite
bd70: 33 50 45 78 70 72 28 70 50 61 72 73 65 2c 20 54  3PExpr(pParse, T
bd80: 4b 5f 49 44 2c 20 30 2c 20 30 2c 20 30 29 3b 0a  K_ID, 0, 0, 0);.
bd90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 45                pE
bda0: 78 70 72 20 3d 20 73 71 6c 69 74 65 33 50 45 78  xpr = sqlite3PEx
bdb0: 70 72 28 70 50 61 72 73 65 2c 20 54 4b 5f 44 4f  pr(pParse, TK_DO
bdc0: 54 2c 20 70 4c 65 66 74 2c 20 70 52 69 67 68 74  T, pLeft, pRight
bdd0: 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20  , 0);.          
bde0: 20 20 20 20 69 66 28 20 70 45 78 70 72 3d 3d 30      if( pExpr==0
bdf0: 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20   ) break;.      
be00: 20 20 20 20 20 20 20 20 73 65 74 51 75 6f 74 65          setQuote
be10: 64 54 6f 6b 65 6e 28 70 50 61 72 73 65 2c 20 26  dToken(pParse, &
be20: 70 4c 65 66 74 2d 3e 74 6f 6b 65 6e 2c 20 7a 54  pLeft->token, zT
be30: 61 62 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20  abName);.       
be40: 20 20 20 20 20 20 20 73 65 74 54 6f 6b 65 6e 28         setToken(
be50: 26 70 45 78 70 72 2d 3e 73 70 61 6e 2c 20 0a 20  &pExpr->span, . 
be60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
be70: 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28   sqlite3MPrintf(
be80: 64 62 2c 20 22 25 73 2e 25 73 22 2c 20 7a 54 61  db, "%s.%s", zTa
be90: 62 4e 61 6d 65 2c 20 7a 4e 61 6d 65 29 29 3b 0a  bName, zName));.
bea0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 45                pE
beb0: 78 70 72 2d 3e 73 70 61 6e 2e 64 79 6e 20 3d 20  xpr->span.dyn = 
bec0: 31 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  1;.             
bed0: 20 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 7a 20   pExpr->token.z 
bee0: 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 20  = 0;.           
bef0: 20 20 20 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e     pExpr->token.
bf00: 6e 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20  n = 0;.         
bf10: 20 20 20 20 20 70 45 78 70 72 2d 3e 74 6f 6b 65       pExpr->toke
bf20: 6e 2e 64 79 6e 20 3d 20 30 3b 0a 20 20 20 20 20  n.dyn = 0;.     
bf30: 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
bf40: 20 20 20 20 20 20 20 20 20 20 20 20 70 45 78 70              pExp
bf50: 72 20 3d 20 70 52 69 67 68 74 3b 0a 20 20 20 20  r = pRight;.    
bf60: 20 20 20 20 20 20 20 20 20 20 70 45 78 70 72 2d            pExpr-
bf70: 3e 73 70 61 6e 20 3d 20 70 45 78 70 72 2d 3e 74  >span = pExpr->t
bf80: 6f 6b 65 6e 3b 0a 20 20 20 20 20 20 20 20 20 20  oken;.          
bf90: 20 20 20 20 70 45 78 70 72 2d 3e 73 70 61 6e 2e      pExpr->span.
bfa0: 64 79 6e 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  dyn = 0;.       
bfb0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
bfc0: 20 20 20 69 66 28 20 6c 6f 6e 67 4e 61 6d 65 73     if( longNames
bfd0: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
bfe0: 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33    pNew = sqlite3
bff0: 45 78 70 72 4c 69 73 74 41 70 70 65 6e 64 28 70  ExprListAppend(p
c000: 50 61 72 73 65 2c 20 70 4e 65 77 2c 20 70 45 78  Parse, pNew, pEx
c010: 70 72 2c 20 26 70 45 78 70 72 2d 3e 73 70 61 6e  pr, &pExpr->span
c020: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  );.            }
c030: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
c040: 20 20 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74      pNew = sqlit
c050: 65 33 45 78 70 72 4c 69 73 74 41 70 70 65 6e 64  e3ExprListAppend
c060: 28 70 50 61 72 73 65 2c 20 70 4e 65 77 2c 20 70  (pParse, pNew, p
c070: 45 78 70 72 2c 20 26 70 52 69 67 68 74 2d 3e 74  Expr, &pRight->t
c080: 6f 6b 65 6e 29 3b 0a 20 20 20 20 20 20 20 20 20  oken);.         
c090: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d     }.          }
c0a0: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
c0b0: 20 20 20 69 66 28 20 21 74 61 62 6c 65 53 65 65     if( !tableSee
c0c0: 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69  n ){.          i
c0d0: 66 28 20 7a 54 4e 61 6d 65 20 29 7b 0a 20 20 20  f( zTName ){.   
c0e0: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
c0f0: 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
c100: 20 22 6e 6f 20 73 75 63 68 20 74 61 62 6c 65 3a   "no such table:
c110: 20 25 73 22 2c 20 7a 54 4e 61 6d 65 29 3b 0a 20   %s", zTName);. 
c120: 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a           }else{.
c130: 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
c140: 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
c150: 73 65 2c 20 22 6e 6f 20 74 61 62 6c 65 73 20 73  se, "no tables s
c160: 70 65 63 69 66 69 65 64 22 29 3b 0a 20 20 20 20  pecified");.    
c170: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
c180: 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 20 20    rc = 1;.      
c190: 20 20 7d 0a 20 20 20 20 20 20 20 20 73 71 6c 69    }.        sqli
c1a0: 74 65 33 5f 66 72 65 65 28 7a 54 4e 61 6d 65 29  te3_free(zTName)
c1b0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
c1c0: 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c      sqlite3ExprL
c1d0: 69 73 74 44 65 6c 65 74 65 28 70 45 4c 69 73 74  istDelete(pEList
c1e0: 29 3b 0a 20 20 20 20 70 2d 3e 70 45 4c 69 73 74  );.    p->pEList
c1f0: 20 3d 20 70 4e 65 77 3b 0a 20 20 7d 0a 23 69 66   = pNew;.  }.#if
c200: 20 53 51 4c 49 54 45 5f 4d 41 58 5f 43 4f 4c 55   SQLITE_MAX_COLU
c210: 4d 4e 0a 20 20 69 66 28 20 70 2d 3e 70 45 4c 69  MN.  if( p->pELi
c220: 73 74 20 26 26 20 70 2d 3e 70 45 4c 69 73 74 2d  st && p->pEList-
c230: 3e 6e 45 78 70 72 3e 64 62 2d 3e 61 4c 69 6d 69  >nExpr>db->aLimi
c240: 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 43  t[SQLITE_LIMIT_C
c250: 4f 4c 55 4d 4e 5d 20 29 7b 0a 20 20 20 20 73 71  OLUMN] ){.    sq
c260: 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
c270: 61 72 73 65 2c 20 22 74 6f 6f 20 6d 61 6e 79 20  arse, "too many 
c280: 63 6f 6c 75 6d 6e 73 20 69 6e 20 72 65 73 75 6c  columns in resul
c290: 74 20 73 65 74 22 29 3b 0a 20 20 20 20 72 63 20  t set");.    rc 
c2a0: 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a  = SQLITE_ERROR;.
c2b0: 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 69 66 28    }.#endif.  if(
c2c0: 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
c2d0: 64 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51  d ){.    rc = SQ
c2e0: 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a  LITE_NOMEM;.  }.
c2f0: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
c300: 2f 2a 0a 2a 2a 20 70 45 20 69 73 20 61 20 70 6f  /*.** pE is a po
c310: 69 6e 74 65 72 20 74 6f 20 61 6e 20 65 78 70 72  inter to an expr
c320: 65 73 73 69 6f 6e 20 77 68 69 63 68 20 69 73 20  ession which is 
c330: 61 20 73 69 6e 67 6c 65 20 74 65 72 6d 20 69 6e  a single term in
c340: 0a 2a 2a 20 4f 52 44 45 52 20 42 59 20 6f 72 20  .** ORDER BY or 
c350: 47 52 4f 55 50 20 42 59 20 63 6c 61 75 73 65 2e  GROUP BY clause.
c360: 0a 2a 2a 0a 2a 2a 20 49 66 20 70 45 20 65 76 61  .**.** If pE eva
c370: 6c 75 61 74 65 73 20 74 6f 20 61 6e 20 69 6e 74  luates to an int
c380: 65 67 65 72 20 63 6f 6e 73 74 61 6e 74 20 69 2c  eger constant i,
c390: 20 74 68 65 6e 20 72 65 74 75 72 6e 20 69 2e 0a   then return i..
c3a0: 2a 2a 20 54 68 69 73 20 69 73 20 61 6e 20 69 6e  ** This is an in
c3b0: 64 69 63 61 74 69 6f 6e 20 74 6f 20 74 68 65 20  dication to the 
c3c0: 63 61 6c 6c 65 72 20 74 68 61 74 20 69 74 20 73  caller that it s
c3d0: 68 6f 75 6c 64 20 73 6f 72 74 0a 2a 2a 20 62 79  hould sort.** by
c3e0: 20 74 68 65 20 69 2d 74 68 20 63 6f 6c 75 6d 6e   the i-th column
c3f0: 20 6f 66 20 74 68 65 20 72 65 73 75 6c 74 20 73   of the result s
c400: 65 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 45 20  et..**.** If pE 
c410: 69 73 20 61 20 77 65 6c 6c 2d 66 6f 72 6d 65 64  is a well-formed
c420: 20 65 78 70 72 65 73 73 69 6f 6e 20 61 6e 64 20   expression and 
c430: 74 68 65 20 53 45 4c 45 43 54 20 73 74 61 74 65  the SELECT state
c440: 6d 65 6e 74 0a 2a 2a 20 69 73 20 6e 6f 74 20 63  ment.** is not c
c450: 6f 6d 70 6f 75 6e 64 2c 20 74 68 65 6e 20 72 65  ompound, then re
c460: 74 75 72 6e 20 30 2e 20 20 54 68 69 73 20 69 6e  turn 0.  This in
c470: 64 69 63 61 74 65 73 20 74 6f 20 74 68 65 0a 2a  dicates to the.*
c480: 2a 20 63 61 6c 6c 65 72 20 74 68 61 74 20 69 74  * caller that it
c490: 20 73 68 6f 75 6c 64 20 73 6f 72 74 20 62 79 20   should sort by 
c4a0: 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65  the value of the
c4b0: 20 4f 52 44 45 52 20 42 59 0a 2a 2a 20 65 78 70   ORDER BY.** exp
c4c0: 72 65 73 73 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 49  ression..**.** I
c4d0: 66 20 74 68 65 20 53 45 4c 45 43 54 20 69 73 20  f the SELECT is 
c4e0: 63 6f 6d 70 6f 75 6e 64 2c 20 74 68 65 6e 20 61  compound, then a
c4f0: 74 74 65 6d 70 74 20 74 6f 20 6d 61 74 63 68 20  ttempt to match 
c500: 70 45 20 61 67 61 69 6e 73 74 0a 2a 2a 20 72 65  pE against.** re
c510: 73 75 6c 74 20 73 65 74 20 63 6f 6c 75 6d 6e 73  sult set columns
c520: 20 69 6e 20 74 68 65 20 6c 65 66 74 2d 6d 6f 73   in the left-mos
c530: 74 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  t SELECT stateme
c540: 6e 74 2e 20 20 52 65 74 75 72 6e 0a 2a 2a 20 74  nt.  Return.** t
c550: 68 65 20 69 6e 64 65 78 20 69 20 6f 66 20 74 68  he index i of th
c560: 65 20 6d 61 74 63 68 69 6e 67 20 63 6f 6c 75 6d  e matching colum
c570: 6e 2c 20 61 73 20 61 6e 20 69 6e 64 69 63 61 74  n, as an indicat
c580: 69 6f 6e 20 74 6f 20 74 68 65 20 0a 2a 2a 20 63  ion to the .** c
c590: 61 6c 6c 65 72 20 74 68 61 74 20 69 74 20 73 68  aller that it sh
c5a0: 6f 75 6c 64 20 73 6f 72 74 20 62 79 20 74 68 65  ould sort by the
c5b0: 20 69 2d 74 68 20 63 6f 6c 75 6d 6e 2e 20 20 49   i-th column.  I
c5c0: 66 20 74 68 65 72 65 20 69 73 0a 2a 2a 20 6e 6f  f there is.** no
c5d0: 20 6d 61 74 63 68 2c 20 72 65 74 75 72 6e 20 2d   match, return -
c5e0: 31 20 61 6e 64 20 6c 65 61 76 65 20 61 6e 20 65  1 and leave an e
c5f0: 72 72 6f 72 20 6d 65 73 73 61 67 65 20 69 6e 20  rror message in 
c600: 70 50 61 72 73 65 2e 0a 2a 2f 0a 73 74 61 74 69  pParse..*/.stati
c610: 63 20 69 6e 74 20 6d 61 74 63 68 4f 72 64 65 72  c int matchOrder
c620: 42 79 54 65 72 6d 54 6f 45 78 70 72 4c 69 73 74  ByTermToExprList
c630: 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
c640: 65 2c 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e  e,     /* Parsin
c650: 67 20 63 6f 6e 74 65 78 74 20 66 6f 72 20 65 72  g context for er
c660: 72 6f 72 20 6d 65 73 73 61 67 65 73 20 2a 2f 0a  ror messages */.
c670: 20 20 53 65 6c 65 63 74 20 2a 70 53 65 6c 65 63    Select *pSelec
c680: 74 2c 20 20 20 2f 2a 20 54 68 65 20 53 45 4c 45  t,   /* The SELE
c690: 43 54 20 73 74 61 74 65 6d 65 6e 74 20 77 69 74  CT statement wit
c6a0: 68 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 63  h the ORDER BY c
c6b0: 6c 61 75 73 65 20 2a 2f 0a 20 20 45 78 70 72 20  lause */.  Expr 
c6c0: 2a 70 45 2c 20 20 20 20 20 20 20 20 20 20 2f 2a  *pE,          /*
c6d0: 20 54 68 65 20 73 70 65 63 69 66 69 63 20 4f 52   The specific OR
c6e0: 44 45 52 20 42 59 20 74 65 72 6d 20 2a 2f 0a 20  DER BY term */. 
c6f0: 20 69 6e 74 20 69 64 78 2c 20 20 20 20 20 20 20   int idx,       
c700: 20 20 20 20 2f 2a 20 57 68 65 6e 20 4f 52 44 45      /* When ORDE
c710: 52 20 42 59 20 74 65 72 6d 20 69 73 20 74 68 69  R BY term is thi
c720: 73 20 2a 2f 0a 20 20 69 6e 74 20 69 73 43 6f 6d  s */.  int isCom
c730: 70 6f 75 6e 64 2c 20 20 20 20 2f 2a 20 54 72 75  pound,    /* Tru
c740: 65 20 69 66 20 74 68 69 73 20 69 73 20 61 20 63  e if this is a c
c750: 6f 6d 70 6f 75 6e 64 20 53 45 4c 45 43 54 20 2a  ompound SELECT *
c760: 2f 0a 20 20 75 38 20 2a 70 48 61 73 41 67 67 20  /.  u8 *pHasAgg 
c770: 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69         /* True i
c780: 66 20 65 78 70 72 65 73 73 69 6f 6e 20 63 6f 6e  f expression con
c790: 74 61 69 6e 73 20 61 67 67 72 65 67 61 74 65 20  tains aggregate 
c7a0: 66 75 6e 63 74 69 6f 6e 73 20 2a 2f 0a 29 7b 0a  functions */.){.
c7b0: 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20    int i;        
c7c0: 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75       /* Loop cou
c7d0: 6e 74 65 72 20 2a 2f 0a 20 20 45 78 70 72 4c 69  nter */.  ExprLi
c7e0: 73 74 20 2a 70 45 4c 69 73 74 3b 20 20 2f 2a 20  st *pEList;  /* 
c7f0: 54 68 65 20 63 6f 6c 75 6d 6e 73 20 6f 66 20 74  The columns of t
c800: 68 65 20 72 65 73 75 6c 74 20 73 65 74 20 2a 2f  he result set */
c810: 0a 20 20 4e 61 6d 65 43 6f 6e 74 65 78 74 20 6e  .  NameContext n
c820: 63 3b 20 20 20 20 2f 2a 20 4e 61 6d 65 20 63 6f  c;    /* Name co
c830: 6e 74 65 78 74 20 66 6f 72 20 72 65 73 6f 6c 76  ntext for resolv
c840: 69 6e 67 20 70 45 20 2a 2f 0a 0a 0a 20 20 2f 2a  ing pE */...  /*
c850: 20 49 66 20 74 68 65 20 74 65 72 6d 20 69 73 20   If the term is 
c860: 61 6e 20 69 6e 74 65 67 65 72 20 63 6f 6e 73 74  an integer const
c870: 61 6e 74 2c 20 72 65 74 75 72 6e 20 74 68 65 20  ant, return the 
c880: 76 61 6c 75 65 20 6f 66 20 74 68 61 74 0a 20 20  value of that.  
c890: 2a 2a 20 63 6f 6e 73 74 61 6e 74 20 2a 2f 0a 20  ** constant */. 
c8a0: 20 70 45 4c 69 73 74 20 3d 20 70 53 65 6c 65 63   pEList = pSelec
c8b0: 74 2d 3e 70 45 4c 69 73 74 3b 0a 20 20 69 66 28  t->pEList;.  if(
c8c0: 20 73 71 6c 69 74 65 33 45 78 70 72 49 73 49 6e   sqlite3ExprIsIn
c8d0: 74 65 67 65 72 28 70 45 2c 20 26 69 29 20 29 7b  teger(pE, &i) ){
c8e0: 0a 20 20 20 20 69 66 28 20 69 3c 3d 30 20 29 7b  .    if( i<=0 ){
c8f0: 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 69 20 69  .      /* If i i
c900: 73 20 74 6f 6f 20 73 6d 61 6c 6c 2c 20 6d 61 6b  s too small, mak
c910: 65 20 69 74 20 74 6f 6f 20 62 69 67 2e 20 20 54  e it too big.  T
c920: 68 61 74 20 77 61 79 20 74 68 65 20 63 61 6c 6c  hat way the call
c930: 69 6e 67 0a 20 20 20 20 20 20 2a 2a 20 66 75 6e  ing.      ** fun
c940: 63 74 69 6f 6e 20 73 74 69 6c 6c 20 73 65 65 73  ction still sees
c950: 20 61 20 76 61 6c 75 65 20 74 68 61 74 20 69 73   a value that is
c960: 20 6f 75 74 20 6f 66 20 72 61 6e 67 65 2c 20 62   out of range, b
c970: 75 74 20 64 6f 65 73 0a 20 20 20 20 20 20 2a 2a  ut does.      **
c980: 20 6e 6f 74 20 63 6f 6e 66 75 73 65 20 74 68 65   not confuse the
c990: 20 63 6f 6c 75 6d 6e 20 6e 75 6d 62 65 72 20 77   column number w
c9a0: 69 74 68 20 30 20 6f 72 20 2d 31 20 72 65 73 75  ith 0 or -1 resu
c9b0: 6c 74 20 63 6f 64 65 2e 0a 20 20 20 20 20 20 2a  lt code..      *
c9c0: 2f 0a 20 20 20 20 20 20 69 20 3d 20 70 45 4c 69  /.      i = pELi
c9d0: 73 74 2d 3e 6e 45 78 70 72 2b 31 3b 0a 20 20 20  st->nExpr+1;.   
c9e0: 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 69 3b   }.    return i;
c9f0: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68  .  }..  /* If th
ca00: 65 20 74 65 72 6d 20 69 73 20 61 20 73 69 6d 70  e term is a simp
ca10: 6c 65 20 69 64 65 6e 74 69 66 69 65 72 20 74 68  le identifier th
ca20: 61 74 20 74 72 79 20 74 6f 20 6d 61 74 63 68 20  at try to match 
ca30: 74 68 61 74 20 69 64 65 6e 74 69 66 69 65 72 0a  that identifier.
ca40: 20 20 2a 2a 20 61 67 61 69 6e 73 74 20 61 20 63    ** against a c
ca50: 6f 6c 75 6d 6e 20 6e 61 6d 65 20 69 6e 20 74 68  olumn name in th
ca60: 65 20 72 65 73 75 6c 74 20 73 65 74 2e 0a 20 20  e result set..  
ca70: 2a 2f 0a 20 20 69 66 28 20 70 45 2d 3e 6f 70 3d  */.  if( pE->op=
ca80: 3d 54 4b 5f 49 44 20 7c 7c 20 28 70 45 2d 3e 6f  =TK_ID || (pE->o
ca90: 70 3d 3d 54 4b 5f 53 54 52 49 4e 47 20 26 26 20  p==TK_STRING && 
caa0: 70 45 2d 3e 74 6f 6b 65 6e 2e 7a 5b 30 5d 21 3d  pE->token.z[0]!=
cab0: 27 5c 27 27 29 20 29 7b 0a 20 20 20 20 73 71 6c  '\'') ){.    sql
cac0: 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73  ite3 *db = pPars
cad0: 65 2d 3e 64 62 3b 0a 20 20 20 20 63 68 61 72 20  e->db;.    char 
cae0: 2a 7a 43 6f 6c 20 3d 20 73 71 6c 69 74 65 33 4e  *zCol = sqlite3N
caf0: 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 64 62 2c  ameFromToken(db,
cb00: 20 26 70 45 2d 3e 74 6f 6b 65 6e 29 3b 0a 20 20   &pE->token);.  
cb10: 20 20 69 66 28 20 7a 43 6f 6c 3d 3d 30 20 29 7b    if( zCol==0 ){
cb20: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 2d 31  .      return -1
cb30: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f 72 28  ;.    }.    for(
cb40: 69 3d 30 3b 20 69 3c 70 45 4c 69 73 74 2d 3e 6e  i=0; i<pEList->n
cb50: 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  Expr; i++){.    
cb60: 20 20 63 68 61 72 20 2a 7a 41 73 20 3d 20 70 45    char *zAs = pE
cb70: 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65  List->a[i].zName
cb80: 3b 0a 20 20 20 20 20 20 69 66 28 20 7a 41 73 21  ;.      if( zAs!
cb90: 3d 30 20 26 26 20 73 71 6c 69 74 65 33 53 74 72  =0 && sqlite3Str
cba0: 49 43 6d 70 28 7a 41 73 2c 20 7a 43 6f 6c 29 3d  ICmp(zAs, zCol)=
cbb0: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  =0 ){.        sq
cbc0: 6c 69 74 65 33 5f 66 72 65 65 28 7a 43 6f 6c 29  lite3_free(zCol)
cbd0: 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ;.        return
cbe0: 20 69 2b 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20   i+1;.      }.  
cbf0: 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 5f    }.    sqlite3_
cc00: 66 72 65 65 28 7a 43 6f 6c 29 3b 0a 20 20 7d 0a  free(zCol);.  }.
cc10: 0a 20 20 2f 2a 20 52 65 73 6f 6c 76 65 20 61 6c  .  /* Resolve al
cc20: 6c 20 6e 61 6d 65 73 20 69 6e 20 74 68 65 20 4f  l names in the O
cc30: 52 44 45 52 20 42 59 20 74 65 72 6d 20 65 78 70  RDER BY term exp
cc40: 72 65 73 73 69 6f 6e 0a 20 20 2a 2f 0a 20 20 6d  ression.  */.  m
cc50: 65 6d 73 65 74 28 26 6e 63 2c 20 30 2c 20 73 69  emset(&nc, 0, si
cc60: 7a 65 6f 66 28 6e 63 29 29 3b 0a 20 20 6e 63 2e  zeof(nc));.  nc.
cc70: 70 50 61 72 73 65 20 3d 20 70 50 61 72 73 65 3b  pParse = pParse;
cc80: 0a 20 20 6e 63 2e 70 53 72 63 4c 69 73 74 20 3d  .  nc.pSrcList =
cc90: 20 70 53 65 6c 65 63 74 2d 3e 70 53 72 63 3b 0a   pSelect->pSrc;.
cca0: 20 20 6e 63 2e 70 45 4c 69 73 74 20 3d 20 70 45    nc.pEList = pE
ccb0: 4c 69 73 74 3b 0a 20 20 6e 63 2e 61 6c 6c 6f 77  List;.  nc.allow
ccc0: 41 67 67 20 3d 20 31 3b 0a 20 20 6e 63 2e 6e 45  Agg = 1;.  nc.nE
ccd0: 72 72 20 3d 20 30 3b 0a 20 20 69 66 28 20 73 71  rr = 0;.  if( sq
cce0: 6c 69 74 65 33 45 78 70 72 52 65 73 6f 6c 76 65  lite3ExprResolve
ccf0: 4e 61 6d 65 73 28 26 6e 63 2c 20 70 45 29 20 29  Names(&nc, pE) )
cd00: 7b 0a 20 20 20 20 69 66 28 20 69 73 43 6f 6d 70  {.    if( isComp
cd10: 6f 75 6e 64 20 29 7b 0a 20 20 20 20 20 20 73 71  ound ){.      sq
cd20: 6c 69 74 65 33 45 72 72 6f 72 43 6c 65 61 72 28  lite3ErrorClear(
cd30: 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 72  pParse);.      r
cd40: 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d 65 6c  eturn 0;.    }el
cd50: 73 65 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  se{.      return
cd60: 20 2d 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20   -1;.    }.  }. 
cd70: 20 69 66 28 20 6e 63 2e 68 61 73 41 67 67 20 26   if( nc.hasAgg &
cd80: 26 20 70 48 61 73 41 67 67 20 29 7b 0a 20 20 20  & pHasAgg ){.   
cd90: 20 2a 70 48 61 73 41 67 67 20 3d 20 31 3b 0a 20   *pHasAgg = 1;. 
cda0: 20 7d 0a 0a 20 20 2f 2a 20 46 6f 72 20 61 20 63   }..  /* For a c
cdb0: 6f 6d 70 6f 75 6e 64 20 53 45 4c 45 43 54 2c 20  ompound SELECT, 
cdc0: 77 65 20 6e 65 65 64 20 74 6f 20 74 72 79 20 74  we need to try t
cdd0: 6f 20 6d 61 74 63 68 20 74 68 65 20 4f 52 44 45  o match the ORDE
cde0: 52 20 42 59 0a 20 20 2a 2a 20 65 78 70 72 65 73  R BY.  ** expres
cdf0: 73 69 6f 6e 20 61 67 61 69 6e 73 74 20 61 6e 20  sion against an 
ce00: 65 78 70 72 65 73 73 69 6f 6e 20 69 6e 20 74 68  expression in th
ce10: 65 20 72 65 73 75 6c 74 20 73 65 74 0a 20 20 2a  e result set.  *
ce20: 2f 0a 20 20 69 66 28 20 69 73 43 6f 6d 70 6f 75  /.  if( isCompou
ce30: 6e 64 20 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d  nd ){.    for(i=
ce40: 30 3b 20 69 3c 70 45 4c 69 73 74 2d 3e 6e 45 78  0; i<pEList->nEx
ce50: 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  pr; i++){.      
ce60: 69 66 28 20 73 71 6c 69 74 65 33 45 78 70 72 43  if( sqlite3ExprC
ce70: 6f 6d 70 61 72 65 28 70 45 4c 69 73 74 2d 3e 61  ompare(pEList->a
ce80: 5b 69 5d 2e 70 45 78 70 72 2c 20 70 45 29 20 29  [i].pExpr, pE) )
ce90: 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  {.        return
cea0: 20 69 2b 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20   i+1;.      }.  
ceb0: 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
cec0: 20 30 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 41 6e   0;.}.../*.** An
ced0: 61 6c 79 7a 65 20 61 6e 64 20 4f 52 44 45 52 20  alyze and ORDER 
cee0: 42 59 20 6f 72 20 47 52 4f 55 50 20 42 59 20 63  BY or GROUP BY c
cef0: 6c 61 75 73 65 20 69 6e 20 61 20 73 69 6d 70 6c  lause in a simpl
cf00: 65 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  e SELECT stateme
cf10: 6e 74 2e 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  nt..** Return th
cf20: 65 20 6e 75 6d 62 65 72 20 6f 66 20 65 72 72 6f  e number of erro
cf30: 72 73 20 73 65 65 6e 2e 0a 2a 2a 0a 2a 2a 20 45  rs seen..**.** E
cf40: 76 65 72 79 20 74 65 72 6d 20 6f 66 20 74 68 65  very term of the
cf50: 20 4f 52 44 45 52 20 42 59 20 6f 72 20 47 52 4f   ORDER BY or GRO
cf60: 55 50 20 42 59 20 63 6c 61 75 73 65 20 6e 65 65  UP BY clause nee
cf70: 64 73 20 74 6f 20 62 65 20 61 6e 0a 2a 2a 20 65  ds to be an.** e
cf80: 78 70 72 65 73 73 69 6f 6e 2e 20 20 49 66 20 61  xpression.  If a
cf90: 6e 79 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73  ny expression is
cfa0: 20 61 6e 20 69 6e 74 65 67 65 72 20 63 6f 6e 73   an integer cons
cfb0: 74 61 6e 74 2c 20 74 68 65 6e 0a 2a 2a 20 74 68  tant, then.** th
cfc0: 61 74 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73  at expression is
cfd0: 20 72 65 70 6c 61 63 65 64 20 62 79 20 74 68 65   replaced by the
cfe0: 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 0a   corresponding .
cff0: 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 20 66 72  ** expression fr
d000: 6f 6d 20 74 68 65 20 72 65 73 75 6c 74 20 73 65  om the result se
d010: 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  t..*/.static int
d020: 20 70 72 6f 63 65 73 73 4f 72 64 65 72 47 72 6f   processOrderGro
d030: 75 70 42 79 28 0a 20 20 50 61 72 73 65 20 2a 70  upBy(.  Parse *p
d040: 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 2f 2a  Parse,        /*
d050: 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74   Parsing context
d060: 2e 20 20 4c 65 61 76 65 20 65 72 72 6f 72 20 6d  .  Leave error m
d070: 65 73 73 61 67 65 73 20 68 65 72 65 20 2a 2f 0a  essages here */.
d080: 20 20 53 65 6c 65 63 74 20 2a 70 53 65 6c 65 63    Select *pSelec
d090: 74 2c 20 20 20 20 20 20 2f 2a 20 54 68 65 20 53  t,      /* The S
d0a0: 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20  ELECT statement 
d0b0: 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 63  containing the c
d0c0: 6c 61 75 73 65 20 2a 2f 0a 20 20 45 78 70 72 4c  lause */.  ExprL
d0d0: 69 73 74 20 2a 70 4f 72 64 65 72 42 79 2c 20 20  ist *pOrderBy,  
d0e0: 20 2f 2a 20 54 68 65 20 4f 52 44 45 52 20 42 59   /* The ORDER BY
d0f0: 20 6f 72 20 47 52 4f 55 50 20 42 59 20 63 6c 61   or GROUP BY cla
d100: 75 73 65 20 74 6f 20 62 65 20 70 72 6f 63 65 73  use to be proces
d110: 73 65 64 20 2a 2f 0a 20 20 69 6e 74 20 69 73 4f  sed */.  int isO
d120: 72 64 65 72 2c 20 20 20 20 20 20 20 20 20 20 2f  rder,          /
d130: 2a 20 31 20 66 6f 72 20 4f 52 44 45 52 20 42 59  * 1 for ORDER BY
d140: 2e 20 20 30 20 66 6f 72 20 47 52 4f 55 50 20 42  .  0 for GROUP B
d150: 59 20 2a 2f 0a 20 20 75 38 20 2a 70 48 61 73 41  Y */.  u8 *pHasA
d160: 67 67 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  gg           /* 
d170: 53 65 74 20 74 6f 20 54 52 55 45 20 69 66 20 61  Set to TRUE if a
d180: 6e 79 20 74 65 72 6d 20 63 6f 6e 74 61 69 6e 73  ny term contains
d190: 20 61 6e 20 61 67 67 72 65 67 61 74 65 20 2a 2f   an aggregate */
d1a0: 0a 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 73  .){.  int i;.  s
d1b0: 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61  qlite3 *db = pPa
d1c0: 72 73 65 2d 3e 64 62 3b 0a 20 20 45 78 70 72 4c  rse->db;.  ExprL
d1d0: 69 73 74 20 2a 70 45 4c 69 73 74 3b 0a 0a 20 20  ist *pEList;..  
d1e0: 69 66 28 20 70 4f 72 64 65 72 42 79 3d 3d 30 20  if( pOrderBy==0 
d1f0: 7c 7c 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d  || pParse->db->m
d200: 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20 72 65  allocFailed ) re
d210: 74 75 72 6e 20 30 3b 0a 23 69 66 20 53 51 4c 49  turn 0;.#if SQLI
d220: 54 45 5f 4d 41 58 5f 43 4f 4c 55 4d 4e 0a 20 20  TE_MAX_COLUMN.  
d230: 69 66 28 20 70 4f 72 64 65 72 42 79 2d 3e 6e 45  if( pOrderBy->nE
d240: 78 70 72 3e 64 62 2d 3e 61 4c 69 6d 69 74 5b 53  xpr>db->aLimit[S
d250: 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 43 4f 4c 55  QLITE_LIMIT_COLU
d260: 4d 4e 5d 20 29 7b 0a 20 20 20 20 63 6f 6e 73 74  MN] ){.    const
d270: 20 63 68 61 72 20 2a 7a 54 79 70 65 20 3d 20 69   char *zType = i
d280: 73 4f 72 64 65 72 20 3f 20 22 4f 52 44 45 52 22  sOrder ? "ORDER"
d290: 20 3a 20 22 47 52 4f 55 50 22 3b 0a 20 20 20 20   : "GROUP";.    
d2a0: 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
d2b0: 70 50 61 72 73 65 2c 20 22 74 6f 6f 20 6d 61 6e  pParse, "too man
d2c0: 79 20 74 65 72 6d 73 20 69 6e 20 25 73 20 42 59  y terms in %s BY
d2d0: 20 63 6c 61 75 73 65 22 2c 20 7a 54 79 70 65 29   clause", zType)
d2e0: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a  ;.    return 1;.
d2f0: 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 70 45 4c    }.#endif.  pEL
d300: 69 73 74 20 3d 20 70 53 65 6c 65 63 74 2d 3e 70  ist = pSelect->p
d310: 45 4c 69 73 74 3b 0a 20 20 69 66 28 20 70 45 4c  EList;.  if( pEL
d320: 69 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65  ist==0 ){.    re
d330: 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 66 6f  turn 0;.  }.  fo
d340: 72 28 69 3d 30 3b 20 69 3c 70 4f 72 64 65 72 42  r(i=0; i<pOrderB
d350: 79 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a  y->nExpr; i++){.
d360: 20 20 20 20 69 6e 74 20 69 43 6f 6c 3b 0a 20 20      int iCol;.  
d370: 20 20 45 78 70 72 20 2a 70 45 20 3d 20 70 4f 72    Expr *pE = pOr
d380: 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 70 45 78 70  derBy->a[i].pExp
d390: 72 3b 0a 20 20 20 20 69 43 6f 6c 20 3d 20 6d 61  r;.    iCol = ma
d3a0: 74 63 68 4f 72 64 65 72 42 79 54 65 72 6d 54 6f  tchOrderByTermTo
d3b0: 45 78 70 72 4c 69 73 74 28 70 50 61 72 73 65 2c  ExprList(pParse,
d3c0: 20 70 53 65 6c 65 63 74 2c 20 70 45 2c 20 69 2b   pSelect, pE, i+
d3d0: 31 2c 20 30 2c 20 70 48 61 73 41 67 67 29 3b 0a  1, 0, pHasAgg);.
d3e0: 20 20 20 20 69 66 28 20 69 43 6f 6c 3c 30 20 29      if( iCol<0 )
d3f0: 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 31  {.      return 1
d400: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
d410: 69 43 6f 6c 3e 70 45 4c 69 73 74 2d 3e 6e 45 78  iCol>pEList->nEx
d420: 70 72 20 29 7b 0a 20 20 20 20 20 20 63 6f 6e 73  pr ){.      cons
d430: 74 20 63 68 61 72 20 2a 7a 54 79 70 65 20 3d 20  t char *zType = 
d440: 69 73 4f 72 64 65 72 20 3f 20 22 4f 52 44 45 52  isOrder ? "ORDER
d450: 22 20 3a 20 22 47 52 4f 55 50 22 3b 0a 20 20 20  " : "GROUP";.   
d460: 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
d470: 73 67 28 70 50 61 72 73 65 2c 20 0a 20 20 20 20  sg(pParse, .    
d480: 20 20 20 20 20 22 25 72 20 25 73 20 42 59 20 74       "%r %s BY t
d490: 65 72 6d 20 6f 75 74 20 6f 66 20 72 61 6e 67 65  erm out of range
d4a0: 20 2d 20 73 68 6f 75 6c 64 20 62 65 20 22 0a 20   - should be ". 
d4b0: 20 20 20 20 20 20 20 20 22 62 65 74 77 65 65 6e          "between
d4c0: 20 31 20 61 6e 64 20 25 64 22 2c 20 69 2b 31 2c   1 and %d", i+1,
d4d0: 20 7a 54 79 70 65 2c 20 70 45 4c 69 73 74 2d 3e   zType, pEList->
d4e0: 6e 45 78 70 72 29 3b 0a 20 20 20 20 20 20 72 65  nExpr);.      re
d4f0: 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20  turn 1;.    }.  
d500: 20 20 69 66 28 20 69 43 6f 6c 3e 30 20 29 7b 0a    if( iCol>0 ){.
d510: 20 20 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a 70        CollSeq *p
d520: 43 6f 6c 6c 20 3d 20 70 45 2d 3e 70 43 6f 6c 6c  Coll = pE->pColl
d530: 3b 0a 20 20 20 20 20 20 69 6e 74 20 66 6c 61 67  ;.      int flag
d540: 73 20 3d 20 70 45 2d 3e 66 6c 61 67 73 20 26 20  s = pE->flags & 
d550: 45 50 5f 45 78 70 43 6f 6c 6c 61 74 65 3b 0a 20  EP_ExpCollate;. 
d560: 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
d570: 44 65 6c 65 74 65 28 70 45 29 3b 0a 20 20 20 20  Delete(pE);.    
d580: 20 20 70 45 20 3d 20 73 71 6c 69 74 65 33 45 78    pE = sqlite3Ex
d590: 70 72 44 75 70 28 64 62 2c 20 70 45 4c 69 73 74  prDup(db, pEList
d5a0: 2d 3e 61 5b 69 43 6f 6c 2d 31 5d 2e 70 45 78 70  ->a[iCol-1].pExp
d5b0: 72 29 3b 0a 20 20 20 20 20 20 70 4f 72 64 65 72  r);.      pOrder
d5c0: 42 79 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 20 3d  By->a[i].pExpr =
d5d0: 20 70 45 3b 0a 20 20 20 20 20 20 69 66 28 20 70   pE;.      if( p
d5e0: 45 20 26 26 20 70 43 6f 6c 6c 20 26 26 20 66 6c  E && pColl && fl
d5f0: 61 67 73 20 29 7b 0a 20 20 20 20 20 20 20 20 70  ags ){.        p
d600: 45 2d 3e 70 43 6f 6c 6c 20 3d 20 70 43 6f 6c 6c  E->pColl = pColl
d610: 3b 0a 20 20 20 20 20 20 20 20 70 45 2d 3e 66 6c  ;.        pE->fl
d620: 61 67 73 20 7c 3d 20 66 6c 61 67 73 3b 0a 20 20  ags |= flags;.  
d630: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
d640: 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f    return 0;.}../
d650: 2a 0a 2a 2a 20 41 6e 61 6c 79 7a 65 20 61 6e 64  *.** Analyze and
d660: 20 4f 52 44 45 52 20 42 59 20 6f 72 20 47 52 4f   ORDER BY or GRO
d670: 55 50 20 42 59 20 63 6c 61 75 73 65 20 69 6e 20  UP BY clause in 
d680: 61 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  a SELECT stateme
d690: 6e 74 2e 20 20 52 65 74 75 72 6e 0a 2a 2a 20 74  nt.  Return.** t
d6a0: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 65 72 72  he number of err
d6b0: 6f 72 73 20 73 65 65 6e 2e 0a 2a 2a 0a 2a 2a 20  ors seen..**.** 
d6c0: 54 68 65 20 70 72 6f 63 65 73 73 69 6e 67 20 64  The processing d
d6d0: 65 70 65 6e 64 73 20 6f 6e 20 77 68 65 74 68 65  epends on whethe
d6e0: 72 20 74 68 65 20 53 45 4c 45 43 54 20 69 73 20  r the SELECT is 
d6f0: 73 69 6d 70 6c 65 20 6f 72 20 63 6f 6d 70 6f 75  simple or compou
d700: 6e 64 2e 0a 2a 2a 20 46 6f 72 20 61 20 73 69 6d  nd..** For a sim
d710: 70 6c 65 20 53 45 4c 45 43 54 20 73 74 61 74 65  ple SELECT state
d720: 6d 65 6e 74 2c 20 65 76 72 79 20 74 65 72 6d 20  ment, evry term 
d730: 6f 66 20 74 68 65 20 4f 52 44 45 52 20 42 59 20  of the ORDER BY 
d740: 6f 72 20 47 52 4f 55 50 20 42 59 0a 2a 2a 20 63  or GROUP BY.** c
d750: 6c 61 75 73 65 20 6e 65 65 64 73 20 74 6f 20 62  lause needs to b
d760: 65 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 2e  e an expression.
d770: 20 20 49 66 20 61 6e 79 20 65 78 70 72 65 73 73    If any express
d780: 69 6f 6e 20 69 73 20 61 6e 20 69 6e 74 65 67 65  ion is an intege
d790: 72 0a 2a 2a 20 63 6f 6e 73 74 61 6e 74 2c 20 74  r.** constant, t
d7a0: 68 65 6e 20 74 68 61 74 20 65 78 70 72 65 73 73  hen that express
d7b0: 69 6f 6e 20 69 73 20 72 65 70 6c 61 63 65 64 20  ion is replaced 
d7c0: 62 79 20 74 68 65 20 63 6f 72 72 65 73 70 6f 6e  by the correspon
d7d0: 64 69 6e 67 20 0a 2a 2a 20 65 78 70 72 65 73 73  ding .** express
d7e0: 69 6f 6e 20 66 72 6f 6d 20 74 68 65 20 72 65 73  ion from the res
d7f0: 75 6c 74 20 73 65 74 2e 0a 2a 2a 0a 2a 2a 20 46  ult set..**.** F
d800: 6f 72 20 63 6f 6d 70 6f 75 6e 64 20 53 45 4c 45  or compound SELE
d810: 43 54 20 73 74 61 74 65 6d 65 6e 74 73 2c 20 65  CT statements, e
d820: 76 65 72 79 20 65 78 70 72 65 73 73 69 6f 6e 20  very expression 
d830: 6e 65 65 64 73 20 74 6f 20 62 65 20 6f 66 0a 2a  needs to be of.*
d840: 2a 20 74 79 70 65 20 54 4b 5f 43 4f 4c 55 4d 4e  * type TK_COLUMN
d850: 20 77 69 74 68 20 61 20 69 54 61 62 6c 65 20 76   with a iTable v
d860: 61 6c 75 65 20 61 73 20 67 69 76 65 6e 20 69 6e  alue as given in
d870: 20 74 68 65 20 34 74 68 20 70 61 72 61 6d 65 74   the 4th paramet
d880: 65 72 2e 0a 2a 2a 20 49 66 20 61 6e 79 20 65 78  er..** If any ex
d890: 70 72 65 73 73 69 6f 6e 20 69 73 20 61 6e 20 69  pression is an i
d8a0: 6e 74 65 67 65 72 2c 20 74 68 61 74 20 62 65 63  nteger, that bec
d8b0: 6f 6d 65 73 20 74 68 65 20 63 6f 6c 75 6d 6e 20  omes the column 
d8c0: 6e 75 6d 62 65 72 2e 0a 2a 2a 20 4f 74 68 65 72  number..** Other
d8d0: 77 69 73 65 2c 20 6d 61 74 63 68 20 74 68 65 20  wise, match the 
d8e0: 65 78 70 72 65 73 73 69 6f 6e 20 61 67 61 69 6e  expression again
d8f0: 73 74 20 72 65 73 75 6c 74 20 73 65 74 20 63 6f  st result set co
d900: 6c 75 6d 6e 73 20 66 72 6f 6d 0a 2a 2a 20 74 68  lumns from.** th
d910: 65 20 6c 65 66 74 2d 6d 6f 73 74 20 53 45 4c 45  e left-most SELE
d920: 43 54 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  CT..*/.static in
d930: 74 20 70 72 6f 63 65 73 73 43 6f 6d 70 6f 75 6e  t processCompoun
d940: 64 4f 72 64 65 72 42 79 28 0a 20 20 50 61 72 73  dOrderBy(.  Pars
d950: 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20  e *pParse,      
d960: 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e    /* Parsing con
d970: 74 65 78 74 2e 20 20 4c 65 61 76 65 20 65 72 72  text.  Leave err
d980: 6f 72 20 6d 65 73 73 61 67 65 73 20 68 65 72 65  or messages here
d990: 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 53   */.  Select *pS
d9a0: 65 6c 65 63 74 2c 20 20 20 20 20 20 2f 2a 20 54  elect,      /* T
d9b0: 68 65 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d  he SELECT statem
d9c0: 65 6e 74 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74  ent containing t
d9d0: 68 65 20 4f 52 44 45 52 20 42 59 20 2a 2f 0a 20  he ORDER BY */. 
d9e0: 20 69 6e 74 20 69 54 61 62 6c 65 20 20 20 20 20   int iTable     
d9f0: 20 20 20 20 20 20 20 2f 2a 20 4f 75 74 70 75 74         /* Output
da00: 20 74 61 62 6c 65 20 66 6f 72 20 63 6f 6d 70 6f   table for compo
da10: 75 6e 64 20 53 45 4c 45 43 54 20 73 74 61 74 65  und SELECT state
da20: 6d 65 6e 74 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e  ments */.){.  in
da30: 74 20 69 3b 0a 20 20 45 78 70 72 4c 69 73 74 20  t i;.  ExprList 
da40: 2a 70 4f 72 64 65 72 42 79 3b 0a 20 20 45 78 70  *pOrderBy;.  Exp
da50: 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 3b 0a 20  rList *pEList;. 
da60: 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20   sqlite3 *db;.  
da70: 69 6e 74 20 6d 6f 72 65 54 6f 44 6f 20 3d 20 31  int moreToDo = 1
da80: 3b 0a 0a 20 20 70 4f 72 64 65 72 42 79 20 3d 20  ;..  pOrderBy = 
da90: 70 53 65 6c 65 63 74 2d 3e 70 4f 72 64 65 72 42  pSelect->pOrderB
daa0: 79 3b 0a 20 20 69 66 28 20 70 4f 72 64 65 72 42  y;.  if( pOrderB
dab0: 79 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b  y==0 ) return 0;
dac0: 0a 20 20 64 62 20 3d 20 70 50 61 72 73 65 2d 3e  .  db = pParse->
dad0: 64 62 3b 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d  db;.#if SQLITE_M
dae0: 41 58 5f 43 4f 4c 55 4d 4e 0a 20 20 69 66 28 20  AX_COLUMN.  if( 
daf0: 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 3e  pOrderBy->nExpr>
db00: 64 62 2d 3e 61 4c 69 6d 69 74 5b 53 51 4c 49 54  db->aLimit[SQLIT
db10: 45 5f 4c 49 4d 49 54 5f 43 4f 4c 55 4d 4e 5d 20  E_LIMIT_COLUMN] 
db20: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72  ){.    sqlite3Er
db30: 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
db40: 74 6f 6f 20 6d 61 6e 79 20 74 65 72 6d 73 20 69  too many terms i
db50: 6e 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73  n ORDER BY claus
db60: 65 22 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  e");.    return 
db70: 31 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  1;.  }.#endif.  
db80: 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4f 72 64 65  for(i=0; i<pOrde
db90: 72 42 79 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29  rBy->nExpr; i++)
dba0: 7b 0a 20 20 20 20 70 4f 72 64 65 72 42 79 2d 3e  {.    pOrderBy->
dbb0: 61 5b 69 5d 2e 64 6f 6e 65 20 3d 20 30 3b 0a 20  a[i].done = 0;. 
dbc0: 20 7d 0a 20 20 77 68 69 6c 65 28 20 70 53 65 6c   }.  while( pSel
dbd0: 65 63 74 2d 3e 70 50 72 69 6f 72 20 29 7b 0a 20  ect->pPrior ){. 
dbe0: 20 20 20 70 53 65 6c 65 63 74 20 3d 20 70 53 65     pSelect = pSe
dbf0: 6c 65 63 74 2d 3e 70 50 72 69 6f 72 3b 0a 20 20  lect->pPrior;.  
dc00: 7d 0a 20 20 77 68 69 6c 65 28 20 70 53 65 6c 65  }.  while( pSele
dc10: 63 74 20 26 26 20 6d 6f 72 65 54 6f 44 6f 20 29  ct && moreToDo )
dc20: 7b 0a 20 20 20 20 6d 6f 72 65 54 6f 44 6f 20 3d  {.    moreToDo =
dc30: 20 30 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b   0;.    for(i=0;
dc40: 20 69 3c 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78   i<pOrderBy->nEx
dc50: 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  pr; i++){.      
dc60: 69 6e 74 20 69 43 6f 6c 20 3d 20 2d 31 3b 0a 20  int iCol = -1;. 
dc70: 20 20 20 20 20 45 78 70 72 20 2a 70 45 2c 20 2a       Expr *pE, *
dc80: 70 44 75 70 3b 0a 20 20 20 20 20 20 69 66 28 20  pDup;.      if( 
dc90: 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 64  pOrderBy->a[i].d
dca0: 6f 6e 65 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  one ) continue;.
dcb0: 20 20 20 20 20 20 70 45 20 3d 20 70 4f 72 64 65        pE = pOrde
dcc0: 72 42 79 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 3b  rBy->a[i].pExpr;
dcd0: 0a 20 20 20 20 20 20 70 44 75 70 20 3d 20 73 71  .      pDup = sq
dce0: 6c 69 74 65 33 45 78 70 72 44 75 70 28 64 62 2c  lite3ExprDup(db,
dcf0: 20 70 45 29 3b 0a 20 20 20 20 20 20 69 66 28 20   pE);.      if( 
dd00: 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65  !db->mallocFaile
dd10: 64 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73  d ){.        ass
dd20: 65 72 74 28 70 44 75 70 29 3b 0a 20 20 20 20 20  ert(pDup);.     
dd30: 20 20 20 69 43 6f 6c 20 3d 20 6d 61 74 63 68 4f     iCol = matchO
dd40: 72 64 65 72 42 79 54 65 72 6d 54 6f 45 78 70 72  rderByTermToExpr
dd50: 4c 69 73 74 28 70 50 61 72 73 65 2c 20 70 53 65  List(pParse, pSe
dd60: 6c 65 63 74 2c 20 70 44 75 70 2c 20 69 2b 31 2c  lect, pDup, i+1,
dd70: 20 31 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a   1, 0);.      }.
dd80: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
dd90: 72 44 65 6c 65 74 65 28 70 44 75 70 29 3b 0a 20  rDelete(pDup);. 
dda0: 20 20 20 20 20 69 66 28 20 69 43 6f 6c 3c 30 20       if( iCol<0 
ddb0: 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  ){.        retur
ddc0: 6e 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  n 1;.      }.   
ddd0: 20 20 20 70 45 4c 69 73 74 20 3d 20 70 53 65 6c     pEList = pSel
dde0: 65 63 74 2d 3e 70 45 4c 69 73 74 3b 0a 20 20 20  ect->pEList;.   
ddf0: 20 20 20 69 66 28 20 70 45 4c 69 73 74 3d 3d 30     if( pEList==0
de00: 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75   ){.        retu
de10: 72 6e 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20  rn 1;.      }.  
de20: 20 20 20 20 69 66 28 20 69 43 6f 6c 3e 70 45 4c      if( iCol>pEL
de30: 69 73 74 2d 3e 6e 45 78 70 72 20 29 7b 0a 20 20  ist->nExpr ){.  
de40: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72        sqlite3Err
de50: 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 0a 20  orMsg(pParse, . 
de60: 20 20 20 20 20 20 20 20 20 20 22 25 72 20 4f 52            "%r OR
de70: 44 45 52 20 42 59 20 74 65 72 6d 20 6f 75 74 20  DER BY term out 
de80: 6f 66 20 72 61 6e 67 65 20 2d 20 73 68 6f 75 6c  of range - shoul
de90: 64 20 62 65 20 22 0a 20 20 20 20 20 20 20 20 20  d be ".         
dea0: 20 20 22 62 65 74 77 65 65 6e 20 31 20 61 6e 64    "between 1 and
deb0: 20 25 64 22 2c 20 69 2b 31 2c 20 70 45 4c 69 73   %d", i+1, pELis
dec0: 74 2d 3e 6e 45 78 70 72 29 3b 0a 20 20 20 20 20  t->nExpr);.     
ded0: 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20     return 1;.   
dee0: 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 69     }.      if( i
def0: 43 6f 6c 3e 30 20 29 7b 0a 20 20 20 20 20 20 20  Col>0 ){.       
df00: 20 70 45 2d 3e 6f 70 20 3d 20 54 4b 5f 43 4f 4c   pE->op = TK_COL
df10: 55 4d 4e 3b 0a 20 20 20 20 20 20 20 20 70 45 2d  UMN;.        pE-
df20: 3e 69 54 61 62 6c 65 20 3d 20 69 54 61 62 6c 65  >iTable = iTable
df30: 3b 0a 20 20 20 20 20 20 20 20 70 45 2d 3e 69 41  ;.        pE->iA
df40: 67 67 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 20  gg = -1;.       
df50: 20 70 45 2d 3e 69 43 6f 6c 75 6d 6e 20 3d 20 69   pE->iColumn = i
df60: 43 6f 6c 2d 31 3b 0a 20 20 20 20 20 20 20 20 70  Col-1;.        p
df70: 45 2d 3e 70 54 61 62 20 3d 20 30 3b 0a 20 20 20  E->pTab = 0;.   
df80: 20 20 20 20 20 70 4f 72 64 65 72 42 79 2d 3e 61       pOrderBy->a
df90: 5b 69 5d 2e 64 6f 6e 65 20 3d 20 31 3b 0a 20 20  [i].done = 1;.  
dfa0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
dfb0: 20 20 20 6d 6f 72 65 54 6f 44 6f 20 3d 20 31 3b     moreToDo = 1;
dfc0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
dfd0: 20 20 20 70 53 65 6c 65 63 74 20 3d 20 70 53 65     pSelect = pSe
dfe0: 6c 65 63 74 2d 3e 70 4e 65 78 74 3b 0a 20 20 7d  lect->pNext;.  }
dff0: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4f  .  for(i=0; i<pO
e000: 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 3b 20 69  rderBy->nExpr; i
e010: 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 70 4f 72  ++){.    if( pOr
e020: 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 64 6f 6e 65  derBy->a[i].done
e030: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  ==0 ){.      sql
e040: 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
e050: 72 73 65 2c 20 22 25 72 20 4f 52 44 45 52 20 42  rse, "%r ORDER B
e060: 59 20 74 65 72 6d 20 64 6f 65 73 20 6e 6f 74 20  Y term does not 
e070: 6d 61 74 63 68 20 61 6e 79 20 22 0a 20 20 20 20  match any ".    
e080: 20 20 20 20 20 20 20 20 22 63 6f 6c 75 6d 6e 20          "column 
e090: 69 6e 20 74 68 65 20 72 65 73 75 6c 74 20 73 65  in the result se
e0a0: 74 22 2c 20 69 2b 31 29 3b 0a 20 20 20 20 20 20  t", i+1);.      
e0b0: 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a  return 1;.    }.
e0c0: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a    }.  return 0;.
e0d0: 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 74 20 61 20 56  }../*.** Get a V
e0e0: 44 42 45 20 66 6f 72 20 74 68 65 20 67 69 76 65  DBE for the give
e0f0: 6e 20 70 61 72 73 65 72 20 63 6f 6e 74 65 78 74  n parser context
e100: 2e 20 20 43 72 65 61 74 65 20 61 20 6e 65 77 20  .  Create a new 
e110: 6f 6e 65 20 69 66 20 6e 65 63 65 73 73 61 72 79  one if necessary
e120: 2e 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72  ..** If an error
e130: 20 6f 63 63 75 72 73 2c 20 72 65 74 75 72 6e 20   occurs, return 
e140: 4e 55 4c 4c 20 61 6e 64 20 6c 65 61 76 65 20 61  NULL and leave a
e150: 20 6d 65 73 73 61 67 65 20 69 6e 20 70 50 61 72   message in pPar
e160: 73 65 2e 0a 2a 2f 0a 56 64 62 65 20 2a 73 71 6c  se..*/.Vdbe *sql
e170: 69 74 65 33 47 65 74 56 64 62 65 28 50 61 72 73  ite3GetVdbe(Pars
e180: 65 20 2a 70 50 61 72 73 65 29 7b 0a 20 20 56 64  e *pParse){.  Vd
e190: 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e  be *v = pParse->
e1a0: 70 56 64 62 65 3b 0a 20 20 69 66 28 20 76 3d 3d  pVdbe;.  if( v==
e1b0: 30 20 29 7b 0a 20 20 20 20 76 20 3d 20 70 50 61  0 ){.    v = pPa
e1c0: 72 73 65 2d 3e 70 56 64 62 65 20 3d 20 73 71 6c  rse->pVdbe = sql
e1d0: 69 74 65 33 56 64 62 65 43 72 65 61 74 65 28 70  ite3VdbeCreate(p
e1e0: 50 61 72 73 65 2d 3e 64 62 29 3b 0a 23 69 66 6e  Parse->db);.#ifn
e1f0: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
e200: 54 52 41 43 45 0a 20 20 20 20 69 66 28 20 76 20  TRACE.    if( v 
e210: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
e220: 56 64 62 65 41 64 64 4f 70 30 28 76 2c 20 4f 50  VdbeAddOp0(v, OP
e230: 5f 54 72 61 63 65 29 3b 0a 20 20 20 20 7d 0a 23  _Trace);.    }.#
e240: 65 6e 64 69 66 0a 20 20 7d 0a 20 20 72 65 74 75  endif.  }.  retu
e250: 72 6e 20 76 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  rn v;.}.../*.** 
e260: 43 6f 6d 70 75 74 65 20 74 68 65 20 69 4c 69 6d  Compute the iLim
e270: 69 74 20 61 6e 64 20 69 4f 66 66 73 65 74 20 66  it and iOffset f
e280: 69 65 6c 64 73 20 6f 66 20 74 68 65 20 53 45 4c  ields of the SEL
e290: 45 43 54 20 62 61 73 65 64 20 6f 6e 20 74 68 65  ECT based on the
e2a0: 0a 2a 2a 20 70 4c 69 6d 69 74 20 61 6e 64 20 70  .** pLimit and p
e2b0: 4f 66 66 73 65 74 20 65 78 70 72 65 73 73 69 6f  Offset expressio
e2c0: 6e 73 2e 20 20 70 4c 69 6d 69 74 20 61 6e 64 20  ns.  pLimit and 
e2d0: 70 4f 66 66 73 65 74 20 68 6f 6c 64 20 74 68 65  pOffset hold the
e2e0: 20 65 78 70 72 65 73 73 69 6f 6e 73 0a 2a 2a 20   expressions.** 
e2f0: 74 68 61 74 20 61 70 70 65 61 72 20 69 6e 20 74  that appear in t
e300: 68 65 20 6f 72 69 67 69 6e 61 6c 20 53 51 4c 20  he original SQL 
e310: 73 74 61 74 65 6d 65 6e 74 20 61 66 74 65 72 20  statement after 
e320: 74 68 65 20 4c 49 4d 49 54 20 61 6e 64 20 4f 46  the LIMIT and OF
e330: 46 53 45 54 0a 2a 2a 20 6b 65 79 77 6f 72 64 73  FSET.** keywords
e340: 2e 20 20 4f 72 20 4e 55 4c 4c 20 69 66 20 74 68  .  Or NULL if th
e350: 6f 73 65 20 6b 65 79 77 6f 72 64 73 20 61 72 65  ose keywords are
e360: 20 6f 6d 69 74 74 65 64 2e 20 69 4c 69 6d 69 74   omitted. iLimit
e370: 20 61 6e 64 20 69 4f 66 66 73 65 74 20 0a 2a 2a   and iOffset .**
e380: 20 61 72 65 20 74 68 65 20 69 6e 74 65 67 65 72   are the integer
e390: 20 6d 65 6d 6f 72 79 20 72 65 67 69 73 74 65 72   memory register
e3a0: 20 6e 75 6d 62 65 72 73 20 66 6f 72 20 63 6f 75   numbers for cou
e3b0: 6e 74 65 72 73 20 75 73 65 64 20 74 6f 20 63 6f  nters used to co
e3c0: 6d 70 75 74 65 20 0a 2a 2a 20 74 68 65 20 6c 69  mpute .** the li
e3d0: 6d 69 74 20 61 6e 64 20 6f 66 66 73 65 74 2e 20  mit and offset. 
e3e0: 20 49 66 20 74 68 65 72 65 20 69 73 20 6e 6f 20   If there is no 
e3f0: 6c 69 6d 69 74 20 61 6e 64 2f 6f 72 20 6f 66 66  limit and/or off
e400: 73 65 74 2c 20 74 68 65 6e 20 0a 2a 2a 20 69 4c  set, then .** iL
e410: 69 6d 69 74 20 61 6e 64 20 69 4f 66 66 73 65 74  imit and iOffset
e420: 20 61 72 65 20 6e 65 67 61 74 69 76 65 2e 0a 2a   are negative..*
e430: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
e440: 65 20 63 68 61 6e 67 65 73 20 74 68 65 20 76 61  e changes the va
e450: 6c 75 65 73 20 6f 66 20 69 4c 69 6d 69 74 20 61  lues of iLimit a
e460: 6e 64 20 69 4f 66 66 73 65 74 20 6f 6e 6c 79 20  nd iOffset only 
e470: 69 66 0a 2a 2a 20 61 20 6c 69 6d 69 74 20 6f 72  if.** a limit or
e480: 20 6f 66 66 73 65 74 20 69 73 20 64 65 66 69 6e   offset is defin
e490: 65 64 20 62 79 20 70 4c 69 6d 69 74 20 61 6e 64  ed by pLimit and
e4a0: 20 70 4f 66 66 73 65 74 2e 20 20 69 4c 69 6d 69   pOffset.  iLimi
e4b0: 74 20 61 6e 64 0a 2a 2a 20 69 4f 66 66 73 65 74  t and.** iOffset
e4c0: 20 73 68 6f 75 6c 64 20 68 61 76 65 20 62 65 65   should have bee
e4d0: 6e 20 70 72 65 73 65 74 20 74 6f 20 61 70 70 72  n preset to appr
e4e0: 6f 70 72 69 61 74 65 20 64 65 66 61 75 6c 74 20  opriate default 
e4f0: 76 61 6c 75 65 73 0a 2a 2a 20 28 75 73 75 61 6c  values.** (usual
e500: 6c 79 20 62 75 74 20 6e 6f 74 20 61 6c 77 61 79  ly but not alway
e510: 73 20 2d 31 29 20 70 72 69 6f 72 20 74 6f 20 63  s -1) prior to c
e520: 61 6c 6c 69 6e 67 20 74 68 69 73 20 72 6f 75 74  alling this rout
e530: 69 6e 65 2e 0a 2a 2a 20 4f 6e 6c 79 20 69 66 20  ine..** Only if 
e540: 70 4c 69 6d 69 74 21 3d 30 20 6f 72 20 70 4f 66  pLimit!=0 or pOf
e550: 66 73 65 74 21 3d 30 20 64 6f 20 74 68 65 20 6c  fset!=0 do the l
e560: 69 6d 69 74 20 72 65 67 69 73 74 65 72 73 20 67  imit registers g
e570: 65 74 0a 2a 2a 20 72 65 64 65 66 69 6e 65 64 2e  et.** redefined.
e580: 20 20 54 68 65 20 55 4e 49 4f 4e 20 41 4c 4c 20    The UNION ALL 
e590: 6f 70 65 72 61 74 6f 72 20 75 73 65 73 20 74 68  operator uses th
e5a0: 69 73 20 70 72 6f 70 65 72 74 79 20 74 6f 20 66  is property to f
e5b0: 6f 72 63 65 0a 2a 2a 20 74 68 65 20 72 65 75 73  orce.** the reus
e5c0: 65 20 6f 66 20 74 68 65 20 73 61 6d 65 20 6c 69  e of the same li
e5d0: 6d 69 74 20 61 6e 64 20 6f 66 66 73 65 74 20 72  mit and offset r
e5e0: 65 67 69 73 74 65 72 73 20 61 63 72 6f 73 73 20  egisters across 
e5f0: 6d 75 6c 74 69 70 6c 65 0a 2a 2a 20 53 45 4c 45  multiple.** SELE
e600: 43 54 20 73 74 61 74 65 6d 65 6e 74 73 2e 0a 2a  CT statements..*
e610: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63 6f  /.static void co
e620: 6d 70 75 74 65 4c 69 6d 69 74 52 65 67 69 73 74  mputeLimitRegist
e630: 65 72 73 28 50 61 72 73 65 20 2a 70 50 61 72 73  ers(Parse *pPars
e640: 65 2c 20 53 65 6c 65 63 74 20 2a 70 2c 20 69 6e  e, Select *p, in
e650: 74 20 69 42 72 65 61 6b 29 7b 0a 20 20 56 64 62  t iBreak){.  Vdb
e660: 65 20 2a 76 20 3d 20 30 3b 0a 20 20 69 6e 74 20  e *v = 0;.  int 
e670: 69 4c 69 6d 69 74 20 3d 20 30 3b 0a 20 20 69 6e  iLimit = 0;.  in
e680: 74 20 69 4f 66 66 73 65 74 3b 0a 20 20 69 6e 74  t iOffset;.  int
e690: 20 61 64 64 72 31 3b 0a 0a 20 20 2f 2a 20 0a 20   addr1;..  /* . 
e6a0: 20 2a 2a 20 22 4c 49 4d 49 54 20 2d 31 22 20 61   ** "LIMIT -1" a
e6b0: 6c 77 61 79 73 20 73 68 6f 77 73 20 61 6c 6c 20  lways shows all 
e6c0: 72 6f 77 73 2e 20 20 54 68 65 72 65 20 69 73 20  rows.  There is 
e6d0: 73 6f 6d 65 0a 20 20 2a 2a 20 63 6f 6e 74 72 61  some.  ** contra
e6e0: 76 65 72 73 79 20 61 62 6f 75 74 20 77 68 61 74  versy about what
e6f0: 20 74 68 65 20 63 6f 72 72 65 63 74 20 62 65 68   the correct beh
e700: 61 76 69 6f 72 20 73 68 6f 75 6c 64 20 62 65 2e  avior should be.
e710: 0a 20 20 2a 2a 20 54 68 65 20 63 75 72 72 65 6e  .  ** The curren
e720: 74 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  t implementation
e730: 20 69 6e 74 65 72 70 72 65 74 73 20 22 4c 49 4d   interprets "LIM
e740: 49 54 20 30 22 20 74 6f 20 6d 65 61 6e 0a 20 20  IT 0" to mean.  
e750: 2a 2a 20 6e 6f 20 72 6f 77 73 2e 0a 20 20 2a 2f  ** no rows..  */
e760: 0a 20 20 69 66 28 20 70 2d 3e 70 4c 69 6d 69 74  .  if( p->pLimit
e770: 20 29 7b 0a 20 20 20 20 70 2d 3e 69 4c 69 6d 69   ){.    p->iLimi
e780: 74 20 3d 20 69 4c 69 6d 69 74 20 3d 20 2b 2b 70  t = iLimit = ++p
e790: 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20  Parse->nMem;.   
e7a0: 20 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56   v = sqlite3GetV
e7b0: 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20 20  dbe(pParse);.   
e7c0: 20 69 66 28 20 76 3d 3d 30 20 29 20 72 65 74 75   if( v==0 ) retu
e7d0: 72 6e 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45  rn;.    sqlite3E
e7e0: 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20  xprCode(pParse, 
e7f0: 70 2d 3e 70 4c 69 6d 69 74 2c 20 69 4c 69 6d 69  p->pLimit, iLimi
e800: 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  t);.    sqlite3V
e810: 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f  dbeAddOp1(v, OP_
e820: 4d 75 73 74 42 65 49 6e 74 2c 20 69 4c 69 6d 69  MustBeInt, iLimi
e830: 74 29 3b 0a 20 20 20 20 56 64 62 65 43 6f 6d 6d  t);.    VdbeComm
e840: 65 6e 74 28 28 76 2c 20 22 4c 49 4d 49 54 20 63  ent((v, "LIMIT c
e850: 6f 75 6e 74 65 72 22 29 29 3b 0a 20 20 20 20 73  ounter"));.    s
e860: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
e870: 28 76 2c 20 4f 50 5f 49 66 5a 65 72 6f 2c 20 69  (v, OP_IfZero, i
e880: 4c 69 6d 69 74 2c 20 69 42 72 65 61 6b 29 3b 0a  Limit, iBreak);.
e890: 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e 70 4f 66    }.  if( p->pOf
e8a0: 66 73 65 74 20 29 7b 0a 20 20 20 20 70 2d 3e 69  fset ){.    p->i
e8b0: 4f 66 66 73 65 74 20 3d 20 69 4f 66 66 73 65 74  Offset = iOffset
e8c0: 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65   = ++pParse->nMe
e8d0: 6d 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 70 4c  m;.    if( p->pL
e8e0: 69 6d 69 74 20 29 7b 0a 20 20 20 20 20 20 70 50  imit ){.      pP
e8f0: 61 72 73 65 2d 3e 6e 4d 65 6d 2b 2b 3b 20 20 20  arse->nMem++;   
e900: 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 61 6e 20 65  /* Allocate an e
e910: 78 74 72 61 20 72 65 67 69 73 74 65 72 20 66 6f  xtra register fo
e920: 72 20 6c 69 6d 69 74 2b 6f 66 66 73 65 74 20 2a  r limit+offset *
e930: 2f 0a 20 20 20 20 7d 0a 20 20 20 20 76 20 3d 20  /.    }.    v = 
e940: 73 71 6c 69 74 65 33 47 65 74 56 64 62 65 28 70  sqlite3GetVdbe(p
e950: 50 61 72 73 65 29 3b 0a 20 20 20 20 69 66 28 20  Parse);.    if( 
e960: 76 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20  v==0 ) return;. 
e970: 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f     sqlite3ExprCo
e980: 64 65 28 70 50 61 72 73 65 2c 20 70 2d 3e 70 4f  de(pParse, p->pO
e990: 66 66 73 65 74 2c 20 69 4f 66 66 73 65 74 29 3b  ffset, iOffset);
e9a0: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
e9b0: 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 4d 75 73  AddOp1(v, OP_Mus
e9c0: 74 42 65 49 6e 74 2c 20 69 4f 66 66 73 65 74 29  tBeInt, iOffset)
e9d0: 3b 0a 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e  ;.    VdbeCommen
e9e0: 74 28 28 76 2c 20 22 4f 46 46 53 45 54 20 63 6f  t((v, "OFFSET co
e9f0: 75 6e 74 65 72 22 29 29 3b 0a 20 20 20 20 61 64  unter"));.    ad
ea00: 64 72 31 20 3d 20 73 71 6c 69 74 65 33 56 64 62  dr1 = sqlite3Vdb
ea10: 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 49 66  eAddOp1(v, OP_If
ea20: 50 6f 73 2c 20 69 4f 66 66 73 65 74 29 3b 0a 20  Pos, iOffset);. 
ea30: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
ea40: 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67  dOp2(v, OP_Integ
ea50: 65 72 2c 20 30 2c 20 69 4f 66 66 73 65 74 29 3b  er, 0, iOffset);
ea60: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
ea70: 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72  JumpHere(v, addr
ea80: 31 29 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 70  1);.    if( p->p
ea90: 4c 69 6d 69 74 20 29 7b 0a 20 20 20 20 20 20 73  Limit ){.      s
eaa0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
eab0: 28 76 2c 20 4f 50 5f 41 64 64 2c 20 69 4c 69 6d  (v, OP_Add, iLim
eac0: 69 74 2c 20 69 4f 66 66 73 65 74 2c 20 69 4f 66  it, iOffset, iOf
ead0: 66 73 65 74 2b 31 29 3b 0a 20 20 20 20 20 20 56  fset+1);.      V
eae0: 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22  dbeComment((v, "
eaf0: 4c 49 4d 49 54 2b 4f 46 46 53 45 54 22 29 29 3b  LIMIT+OFFSET"));
eb00: 0a 20 20 20 20 20 20 61 64 64 72 31 20 3d 20 73  .      addr1 = s
eb10: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31  qlite3VdbeAddOp1
eb20: 28 76 2c 20 4f 50 5f 49 66 50 6f 73 2c 20 69 4c  (v, OP_IfPos, iL
eb30: 69 6d 69 74 29 3b 0a 20 20 20 20 20 20 73 71 6c  imit);.      sql
eb40: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
eb50: 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 2d 31  , OP_Integer, -1
eb60: 2c 20 69 4f 66 66 73 65 74 2b 31 29 3b 0a 20 20  , iOffset+1);.  
eb70: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a      sqlite3VdbeJ
eb80: 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72 31  umpHere(v, addr1
eb90: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a  );.    }.  }.}..
eba0: 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 61  /*.** Allocate a
ebb0: 20 76 69 72 74 75 61 6c 20 69 6e 64 65 78 20 74   virtual index t
ebc0: 6f 20 75 73 65 20 66 6f 72 20 73 6f 72 74 69 6e  o use for sortin
ebd0: 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  g..*/.static voi
ebe0: 64 20 63 72 65 61 74 65 53 6f 72 74 69 6e 67 49  d createSortingI
ebf0: 6e 64 65 78 28 50 61 72 73 65 20 2a 70 50 61 72  ndex(Parse *pPar
ec00: 73 65 2c 20 53 65 6c 65 63 74 20 2a 70 2c 20 45  se, Select *p, E
ec10: 78 70 72 4c 69 73 74 20 2a 70 4f 72 64 65 72 42  xprList *pOrderB
ec20: 79 29 7b 0a 20 20 69 66 28 20 70 4f 72 64 65 72  y){.  if( pOrder
ec30: 42 79 20 29 7b 0a 20 20 20 20 69 6e 74 20 61 64  By ){.    int ad
ec40: 64 72 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  dr;.    assert( 
ec50: 70 4f 72 64 65 72 42 79 2d 3e 69 45 43 75 72 73  pOrderBy->iECurs
ec60: 6f 72 3d 3d 30 20 29 3b 0a 20 20 20 20 70 4f 72  or==0 );.    pOr
ec70: 64 65 72 42 79 2d 3e 69 45 43 75 72 73 6f 72 20  derBy->iECursor 
ec80: 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b  = pParse->nTab++
ec90: 3b 0a 20 20 20 20 61 64 64 72 20 3d 20 73 71 6c  ;.    addr = sql
eca0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 70  ite3VdbeAddOp2(p
ecb0: 50 61 72 73 65 2d 3e 70 56 64 62 65 2c 20 4f 50  Parse->pVdbe, OP
ecc0: 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 2c 0a  _OpenEphemeral,.
ecd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ece0: 20 20 20 20 20 20 20 20 20 20 20 20 70 4f 72 64              pOrd
ecf0: 65 72 42 79 2d 3e 69 45 43 75 72 73 6f 72 2c 20  erBy->iECursor, 
ed00: 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 2b  pOrderBy->nExpr+
ed10: 31 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  1);.    assert( 
ed20: 70 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b  p->addrOpenEphm[
ed30: 32 5d 20 3d 3d 20 2d 31 20 29 3b 0a 20 20 20 20  2] == -1 );.    
ed40: 70 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b  p->addrOpenEphm[
ed50: 32 5d 20 3d 20 61 64 64 72 3b 0a 20 20 7d 0a 7d  2] = addr;.  }.}
ed60: 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
ed70: 5f 4f 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53  _OMIT_COMPOUND_S
ed80: 45 4c 45 43 54 0a 2f 2a 0a 2a 2a 20 52 65 74 75  ELECT./*.** Retu
ed90: 72 6e 20 74 68 65 20 61 70 70 72 6f 70 72 69 61  rn the appropria
eda0: 74 65 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71  te collating seq
edb0: 75 65 6e 63 65 20 66 6f 72 20 74 68 65 20 69 43  uence for the iC
edc0: 6f 6c 2d 74 68 20 63 6f 6c 75 6d 6e 20 6f 66 0a  ol-th column of.
edd0: 2a 2a 20 74 68 65 20 72 65 73 75 6c 74 20 73 65  ** the result se
ede0: 74 20 66 6f 72 20 74 68 65 20 63 6f 6d 70 6f 75  t for the compou
edf0: 6e 64 2d 73 65 6c 65 63 74 20 73 74 61 74 65 6d  nd-select statem
ee00: 65 6e 74 20 22 70 22 2e 20 20 52 65 74 75 72 6e  ent "p".  Return
ee10: 20 4e 55 4c 4c 20 69 66 0a 2a 2a 20 74 68 65 20   NULL if.** the 
ee20: 63 6f 6c 75 6d 6e 20 68 61 73 20 6e 6f 20 64 65  column has no de
ee30: 66 61 75 6c 74 20 63 6f 6c 6c 61 74 69 6e 67 20  fault collating 
ee40: 73 65 71 75 65 6e 63 65 2e 0a 2a 2a 0a 2a 2a 20  sequence..**.** 
ee50: 54 68 65 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65  The collating se
ee60: 71 75 65 6e 63 65 20 66 6f 72 20 74 68 65 20 63  quence for the c
ee70: 6f 6d 70 6f 75 6e 64 20 73 65 6c 65 63 74 20 69  ompound select i
ee80: 73 20 74 61 6b 65 6e 20 66 72 6f 6d 20 74 68 65  s taken from the
ee90: 0a 2a 2a 20 6c 65 66 74 2d 6d 6f 73 74 20 74 65  .** left-most te
eea0: 72 6d 20 6f 66 20 74 68 65 20 73 65 6c 65 63 74  rm of the select
eeb0: 20 74 68 61 74 20 68 61 73 20 61 20 63 6f 6c 6c   that has a coll
eec0: 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65 2e 0a  ating sequence..
eed0: 2a 2f 0a 73 74 61 74 69 63 20 43 6f 6c 6c 53 65  */.static CollSe
eee0: 71 20 2a 6d 75 6c 74 69 53 65 6c 65 63 74 43 6f  q *multiSelectCo
eef0: 6c 6c 53 65 71 28 50 61 72 73 65 20 2a 70 50 61  llSeq(Parse *pPa
ef00: 72 73 65 2c 20 53 65 6c 65 63 74 20 2a 70 2c 20  rse, Select *p, 
ef10: 69 6e 74 20 69 43 6f 6c 29 7b 0a 20 20 43 6f 6c  int iCol){.  Col
ef20: 6c 53 65 71 20 2a 70 52 65 74 3b 0a 20 20 69 66  lSeq *pRet;.  if
ef30: 28 20 70 2d 3e 70 50 72 69 6f 72 20 29 7b 0a 20  ( p->pPrior ){. 
ef40: 20 20 20 70 52 65 74 20 3d 20 6d 75 6c 74 69 53     pRet = multiS
ef50: 65 6c 65 63 74 43 6f 6c 6c 53 65 71 28 70 50 61  electCollSeq(pPa
ef60: 72 73 65 2c 20 70 2d 3e 70 50 72 69 6f 72 2c 20  rse, p->pPrior, 
ef70: 69 43 6f 6c 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  iCol);.  }else{.
ef80: 20 20 20 20 70 52 65 74 20 3d 20 30 3b 0a 20 20      pRet = 0;.  
ef90: 7d 0a 20 20 69 66 28 20 70 52 65 74 3d 3d 30 20  }.  if( pRet==0 
efa0: 29 7b 0a 20 20 20 20 70 52 65 74 20 3d 20 73 71  ){.    pRet = sq
efb0: 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c 53 65 71  lite3ExprCollSeq
efc0: 28 70 50 61 72 73 65 2c 20 70 2d 3e 70 45 4c 69  (pParse, p->pELi
efd0: 73 74 2d 3e 61 5b 69 43 6f 6c 5d 2e 70 45 78 70  st->a[iCol].pExp
efe0: 72 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  r);.  }.  return
eff0: 20 70 52 65 74 3b 0a 7d 0a 23 65 6e 64 69 66 20   pRet;.}.#endif 
f000: 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43  /* SQLITE_OMIT_C
f010: 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45 43 54 20 2a  OMPOUND_SELECT *
f020: 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  /..#ifndef SQLIT
f030: 45 5f 4f 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f  E_OMIT_COMPOUND_
f040: 53 45 4c 45 43 54 0a 2f 2a 0a 2a 2a 20 54 68 69  SELECT./*.** Thi
f050: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c  s routine is cal
f060: 6c 65 64 20 74 6f 20 70 72 6f 63 65 73 73 20 61  led to process a
f070: 20 63 6f 6d 70 6f 75 6e 64 20 71 75 65 72 79 20   compound query 
f080: 66 6f 72 6d 20 66 72 6f 6d 0a 2a 2a 20 74 77 6f  form from.** two
f090: 20 6f 72 20 6d 6f 72 65 20 73 65 70 61 72 61 74   or more separat
f0a0: 65 20 71 75 65 72 69 65 73 20 75 73 69 6e 67 20  e queries using 
f0b0: 55 4e 49 4f 4e 2c 20 55 4e 49 4f 4e 20 41 4c 4c  UNION, UNION ALL
f0c0: 2c 20 45 58 43 45 50 54 2c 20 6f 72 0a 2a 2a 20  , EXCEPT, or.** 
f0d0: 49 4e 54 45 52 53 45 43 54 0a 2a 2a 0a 2a 2a 20  INTERSECT.**.** 
f0e0: 22 70 22 20 70 6f 69 6e 74 73 20 74 6f 20 74 68  "p" points to th
f0f0: 65 20 72 69 67 68 74 2d 6d 6f 73 74 20 6f 66 20  e right-most of 
f100: 74 68 65 20 74 77 6f 20 71 75 65 72 69 65 73 2e  the two queries.
f110: 20 20 74 68 65 20 71 75 65 72 79 20 6f 6e 20 74    the query on t
f120: 68 65 0a 2a 2a 20 6c 65 66 74 20 69 73 20 70 2d  he.** left is p-
f130: 3e 70 50 72 69 6f 72 2e 20 20 54 68 65 20 6c 65  >pPrior.  The le
f140: 66 74 20 71 75 65 72 79 20 63 6f 75 6c 64 20 61  ft query could a
f150: 6c 73 6f 20 62 65 20 61 20 63 6f 6d 70 6f 75 6e  lso be a compoun
f160: 64 20 71 75 65 72 79 0a 2a 2a 20 69 6e 20 77 68  d query.** in wh
f170: 69 63 68 20 63 61 73 65 20 74 68 69 73 20 72 6f  ich case this ro
f180: 75 74 69 6e 65 20 77 69 6c 6c 20 62 65 20 63 61  utine will be ca
f190: 6c 6c 65 64 20 72 65 63 75 72 73 69 76 65 6c 79  lled recursively
f1a0: 2e 20 0a 2a 2a 0a 2a 2a 20 54 68 65 20 72 65 73  . .**.** The res
f1b0: 75 6c 74 73 20 6f 66 20 74 68 65 20 74 6f 74 61  ults of the tota
f1c0: 6c 20 71 75 65 72 79 20 61 72 65 20 74 6f 20 62  l query are to b
f1d0: 65 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 61  e written into a
f1e0: 20 64 65 73 74 69 6e 61 74 69 6f 6e 0a 2a 2a 20   destination.** 
f1f0: 6f 66 20 74 79 70 65 20 65 44 65 73 74 20 77 69  of type eDest wi
f200: 74 68 20 70 61 72 61 6d 65 74 65 72 20 69 50 61  th parameter iPa
f210: 72 6d 2e 0a 2a 2a 0a 2a 2a 20 45 78 61 6d 70 6c  rm..**.** Exampl
f220: 65 20 31 3a 20 20 43 6f 6e 73 69 64 65 72 20 61  e 1:  Consider a
f230: 20 74 68 72 65 65 2d 77 61 79 20 63 6f 6d 70 6f   three-way compo
f240: 75 6e 64 20 53 51 4c 20 73 74 61 74 65 6d 65 6e  und SQL statemen
f250: 74 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 45 4c  t..**.**     SEL
f260: 45 43 54 20 61 20 46 52 4f 4d 20 74 31 20 55 4e  ECT a FROM t1 UN
f270: 49 4f 4e 20 53 45 4c 45 43 54 20 62 20 46 52 4f  ION SELECT b FRO
f280: 4d 20 74 32 20 55 4e 49 4f 4e 20 53 45 4c 45 43  M t2 UNION SELEC
f290: 54 20 63 20 46 52 4f 4d 20 74 33 0a 2a 2a 0a 2a  T c FROM t3.**.*
f2a0: 2a 20 54 68 69 73 20 73 74 61 74 65 6d 65 6e 74  * This statement
f2b0: 20 69 73 20 70 61 72 73 65 64 20 75 70 20 61 73   is parsed up as
f2c0: 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20   follows:.**.** 
f2d0: 20 20 20 20 53 45 4c 45 43 54 20 63 20 46 52 4f      SELECT c FRO
f2e0: 4d 20 74 33 0a 2a 2a 20 20 20 20 20 20 7c 0a 2a  M t3.**      |.*
f2f0: 2a 20 20 20 20 20 20 60 2d 2d 2d 2d 2d 3e 20 20  *      `----->  
f300: 53 45 4c 45 43 54 20 62 20 46 52 4f 4d 20 74 32  SELECT b FROM t2
f310: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
f320: 20 20 20 7c 0a 2a 2a 20 20 20 20 20 20 20 20 20     |.**         
f330: 20 20 20 20 20 20 20 60 2d 2d 2d 2d 2d 2d 3e 20         `------> 
f340: 20 53 45 4c 45 43 54 20 61 20 46 52 4f 4d 20 74   SELECT a FROM t
f350: 31 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 72 72 6f  1.**.** The arro
f360: 77 73 20 69 6e 20 74 68 65 20 64 69 61 67 72 61  ws in the diagra
f370: 6d 20 61 62 6f 76 65 20 72 65 70 72 65 73 65 6e  m above represen
f380: 74 20 74 68 65 20 53 65 6c 65 63 74 2e 70 50 72  t the Select.pPr
f390: 69 6f 72 20 70 6f 69 6e 74 65 72 2e 0a 2a 2a 20  ior pointer..** 
f3a0: 53 6f 20 69 66 20 74 68 69 73 20 72 6f 75 74 69  So if this routi
f3b0: 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 77 69 74  ne is called wit
f3c0: 68 20 70 20 65 71 75 61 6c 20 74 6f 20 74 68 65  h p equal to the
f3d0: 20 74 33 20 71 75 65 72 79 2c 20 74 68 65 6e 0a   t3 query, then.
f3e0: 2a 2a 20 70 50 72 69 6f 72 20 77 69 6c 6c 20 62  ** pPrior will b
f3f0: 65 20 74 68 65 20 74 32 20 71 75 65 72 79 2e 20  e the t2 query. 
f400: 20 70 2d 3e 6f 70 20 77 69 6c 6c 20 62 65 20 54   p->op will be T
f410: 4b 5f 55 4e 49 4f 4e 20 69 6e 20 74 68 69 73 20  K_UNION in this 
f420: 63 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 69  case..**.** Noti
f430: 63 65 20 74 68 61 74 20 62 65 63 61 75 73 65 20  ce that because 
f440: 6f 66 20 74 68 65 20 77 61 79 20 53 51 4c 69 74  of the way SQLit
f450: 65 20 70 61 72 73 65 73 20 63 6f 6d 70 6f 75 6e  e parses compoun
f460: 64 20 53 45 4c 45 43 54 73 2c 20 74 68 65 0a 2a  d SELECTs, the.*
f470: 2a 20 69 6e 64 69 76 69 64 75 61 6c 20 73 65 6c  * individual sel
f480: 65 63 74 73 20 61 6c 77 61 79 73 20 67 72 6f 75  ects always grou
f490: 70 20 66 72 6f 6d 20 6c 65 66 74 20 74 6f 20 72  p from left to r
f4a0: 69 67 68 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ight..*/.static 
f4b0: 69 6e 74 20 6d 75 6c 74 69 53 65 6c 65 63 74 28  int multiSelect(
f4c0: 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
f4d0: 2c 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73  ,        /* Pars
f4e0: 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  ing context */. 
f4f0: 20 53 65 6c 65 63 74 20 2a 70 2c 20 20 20 20 20   Select *p,     
f500: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 72 69         /* The ri
f510: 67 68 74 2d 6d 6f 73 74 20 6f 66 20 53 45 4c 45  ght-most of SELE
f520: 43 54 73 20 74 6f 20 62 65 20 63 6f 64 65 64 20  CTs to be coded 
f530: 2a 2f 0a 20 20 53 65 6c 65 63 74 44 65 73 74 20  */.  SelectDest 
f540: 2a 70 44 65 73 74 2c 20 20 20 20 2f 2a 20 57 68  *pDest,    /* Wh
f550: 61 74 20 74 6f 20 64 6f 20 77 69 74 68 20 71 75  at to do with qu
f560: 65 72 79 20 72 65 73 75 6c 74 73 20 2a 2f 0a 20  ery results */. 
f570: 20 63 68 61 72 20 2a 61 66 66 20 20 20 20 20 20   char *aff      
f580: 20 20 20 20 20 20 20 2f 2a 20 49 66 20 65 44 65         /* If eDe
f590: 73 74 20 69 73 20 53 52 54 5f 55 6e 69 6f 6e 2c  st is SRT_Union,
f5a0: 20 74 68 65 20 61 66 66 69 6e 69 74 79 20 73 74   the affinity st
f5b0: 72 69 6e 67 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  ring */.){.  int
f5c0: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
f5d0: 20 20 20 2f 2a 20 53 75 63 63 65 73 73 20 63 6f     /* Success co
f5e0: 64 65 20 66 72 6f 6d 20 61 20 73 75 62 72 6f 75  de from a subrou
f5f0: 74 69 6e 65 20 2a 2f 0a 20 20 53 65 6c 65 63 74  tine */.  Select
f600: 20 2a 70 50 72 69 6f 72 3b 20 20 20 20 20 20 20   *pPrior;       
f610: 2f 2a 20 41 6e 6f 74 68 65 72 20 53 45 4c 45 43  /* Another SELEC
f620: 54 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 74 6f  T immediately to
f630: 20 6f 75 72 20 6c 65 66 74 20 2a 2f 0a 20 20 56   our left */.  V
f640: 64 62 65 20 2a 76 3b 20 20 20 20 20 20 20 20 20  dbe *v;         
f650: 20 20 20 20 20 2f 2a 20 47 65 6e 65 72 61 74 65       /* Generate
f660: 20 63 6f 64 65 20 74 6f 20 74 68 69 73 20 56 44   code to this VD
f670: 42 45 20 2a 2f 0a 20 20 69 6e 74 20 6e 43 6f 6c  BE */.  int nCol
f680: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
f690: 20 4e 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d   Number of colum
f6a0: 6e 73 20 69 6e 20 74 68 65 20 72 65 73 75 6c 74  ns in the result
f6b0: 20 73 65 74 20 2a 2f 0a 20 20 45 78 70 72 4c 69   set */.  ExprLi
f6c0: 73 74 20 2a 70 4f 72 64 65 72 42 79 3b 20 20 20  st *pOrderBy;   
f6d0: 2f 2a 20 54 68 65 20 4f 52 44 45 52 20 42 59 20  /* The ORDER BY 
f6e0: 63 6c 61 75 73 65 20 6f 6e 20 70 20 2a 2f 0a 20  clause on p */. 
f6f0: 20 69 6e 74 20 61 53 65 74 50 32 5b 32 5d 3b 20   int aSetP2[2]; 
f700: 20 20 20 20 20 20 20 2f 2a 20 53 65 74 20 50 32         /* Set P2
f710: 20 76 61 6c 75 65 20 6f 66 20 74 68 65 73 65 20   value of these 
f720: 6f 70 20 74 6f 20 6e 75 6d 62 65 72 20 6f 66 20  op to number of 
f730: 63 6f 6c 75 6d 6e 73 20 2a 2f 0a 20 20 69 6e 74  columns */.  int
f740: 20 6e 53 65 74 50 32 20 3d 20 30 3b 20 20 20 20   nSetP2 = 0;    
f750: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
f760: 73 6c 6f 74 73 20 69 6e 20 61 53 65 74 50 32 5b  slots in aSetP2[
f770: 5d 20 75 73 65 64 20 2a 2f 0a 20 20 53 65 6c 65  ] used */.  Sele
f780: 63 74 44 65 73 74 20 64 65 73 74 3b 20 20 20 20  ctDest dest;    
f790: 20 20 2f 2a 20 41 6c 74 65 72 6e 61 74 69 76 65    /* Alternative
f7a0: 20 64 61 74 61 20 64 65 73 74 69 6e 61 74 69 6f   data destinatio
f7b0: 6e 20 2a 2f 0a 0a 20 20 64 65 73 74 20 3d 20 2a  n */..  dest = *
f7c0: 70 44 65 73 74 3b 0a 0a 20 20 2f 2a 20 4d 61 6b  pDest;..  /* Mak
f7d0: 65 20 73 75 72 65 20 74 68 65 72 65 20 69 73 20  e sure there is 
f7e0: 6e 6f 20 4f 52 44 45 52 20 42 59 20 6f 72 20 4c  no ORDER BY or L
f7f0: 49 4d 49 54 20 63 6c 61 75 73 65 20 6f 6e 20 70  IMIT clause on p
f800: 72 69 6f 72 20 53 45 4c 45 43 54 73 2e 20 20 4f  rior SELECTs.  O
f810: 6e 6c 79 0a 20 20 2a 2a 20 74 68 65 20 6c 61 73  nly.  ** the las
f820: 74 20 28 72 69 67 68 74 2d 6d 6f 73 74 29 20 53  t (right-most) S
f830: 45 4c 45 43 54 20 69 6e 20 74 68 65 20 73 65 72  ELECT in the ser
f840: 69 65 73 20 6d 61 79 20 68 61 76 65 20 61 6e 20  ies may have an 
f850: 4f 52 44 45 52 20 42 59 20 6f 72 20 4c 49 4d 49  ORDER BY or LIMI
f860: 54 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 3d  T..  */.  if( p=
f870: 3d 30 20 7c 7c 20 70 2d 3e 70 50 72 69 6f 72 3d  =0 || p->pPrior=
f880: 3d 30 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 31  =0 ){.    rc = 1
f890: 3b 0a 20 20 20 20 67 6f 74 6f 20 6d 75 6c 74 69  ;.    goto multi
f8a0: 5f 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 7d  _select_end;.  }
f8b0: 0a 20 20 70 50 72 69 6f 72 20 3d 20 70 2d 3e 70  .  pPrior = p->p
f8c0: 50 72 69 6f 72 3b 0a 20 20 61 73 73 65 72 74 28  Prior;.  assert(
f8d0: 20 70 50 72 69 6f 72 2d 3e 70 52 69 67 68 74 6d   pPrior->pRightm
f8e0: 6f 73 74 21 3d 70 50 72 69 6f 72 20 29 3b 0a 20  ost!=pPrior );. 
f8f0: 20 61 73 73 65 72 74 28 20 70 50 72 69 6f 72 2d   assert( pPrior-
f900: 3e 70 52 69 67 68 74 6d 6f 73 74 3d 3d 70 2d 3e  >pRightmost==p->
f910: 70 52 69 67 68 74 6d 6f 73 74 20 29 3b 0a 20 20  pRightmost );.  
f920: 69 66 28 20 70 50 72 69 6f 72 2d 3e 70 4f 72 64  if( pPrior->pOrd
f930: 65 72 42 79 20 29 7b 0a 20 20 20 20 73 71 6c 69  erBy ){.    sqli
f940: 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
f950: 73 65 2c 22 4f 52 44 45 52 20 42 59 20 63 6c 61  se,"ORDER BY cla
f960: 75 73 65 20 73 68 6f 75 6c 64 20 63 6f 6d 65 20  use should come 
f970: 61 66 74 65 72 20 25 73 20 6e 6f 74 20 62 65 66  after %s not bef
f980: 6f 72 65 22 2c 0a 20 20 20 20 20 20 73 65 6c 65  ore",.      sele
f990: 63 74 4f 70 4e 61 6d 65 28 70 2d 3e 6f 70 29 29  ctOpName(p->op))
f9a0: 3b 0a 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20  ;.    rc = 1;.  
f9b0: 20 20 67 6f 74 6f 20 6d 75 6c 74 69 5f 73 65 6c    goto multi_sel
f9c0: 65 63 74 5f 65 6e 64 3b 0a 20 20 7d 0a 20 20 69  ect_end;.  }.  i
f9d0: 66 28 20 70 50 72 69 6f 72 2d 3e 70 4c 69 6d 69  f( pPrior->pLimi
f9e0: 74 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  t ){.    sqlite3
f9f0: 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
fa00: 22 4c 49 4d 49 54 20 63 6c 61 75 73 65 20 73 68  "LIMIT clause sh
fa10: 6f 75 6c 64 20 63 6f 6d 65 20 61 66 74 65 72 20  ould come after 
fa20: 25 73 20 6e 6f 74 20 62 65 66 6f 72 65 22 2c 0a  %s not before",.
fa30: 20 20 20 20 20 20 73 65 6c 65 63 74 4f 70 4e 61        selectOpNa
fa40: 6d 65 28 70 2d 3e 6f 70 29 29 3b 0a 20 20 20 20  me(p->op));.    
fa50: 72 63 20 3d 20 31 3b 0a 20 20 20 20 67 6f 74 6f  rc = 1;.    goto
fa60: 20 6d 75 6c 74 69 5f 73 65 6c 65 63 74 5f 65 6e   multi_select_en
fa70: 64 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61 6b  d;.  }..  /* Mak
fa80: 65 20 73 75 72 65 20 77 65 20 68 61 76 65 20 61  e sure we have a
fa90: 20 76 61 6c 69 64 20 71 75 65 72 79 20 65 6e 67   valid query eng
faa0: 69 6e 65 2e 20 20 49 66 20 6e 6f 74 2c 20 63 72  ine.  If not, cr
fab0: 65 61 74 65 20 61 20 6e 65 77 20 6f 6e 65 2e 0a  eate a new one..
fac0: 20 20 2a 2f 0a 20 20 76 20 3d 20 73 71 6c 69 74    */.  v = sqlit
fad0: 65 33 47 65 74 56 64 62 65 28 70 50 61 72 73 65  e3GetVdbe(pParse
fae0: 29 3b 0a 20 20 69 66 28 20 76 3d 3d 30 20 29 7b  );.  if( v==0 ){
faf0: 0a 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 20  .    rc = 1;.   
fb00: 20 67 6f 74 6f 20 6d 75 6c 74 69 5f 73 65 6c 65   goto multi_sele
fb10: 63 74 5f 65 6e 64 3b 0a 20 20 7d 0a 0a 20 20 2f  ct_end;.  }..  /
fb20: 2a 20 43 72 65 61 74 65 20 74 68 65 20 64 65 73  * Create the des
fb30: 74 69 6e 61 74 69 6f 6e 20 74 65 6d 70 6f 72 61  tination tempora
fb40: 72 79 20 74 61 62 6c 65 20 69 66 20 6e 65 63 65  ry table if nece
fb50: 73 73 61 72 79 0a 20 20 2a 2f 0a 20 20 69 66 28  ssary.  */.  if(
fb60: 20 64 65 73 74 2e 65 44 65 73 74 3d 3d 53 52 54   dest.eDest==SRT
fb70: 5f 45 70 68 65 6d 54 61 62 20 29 7b 0a 20 20 20  _EphemTab ){.   
fb80: 20 61 73 73 65 72 74 28 20 70 2d 3e 70 45 4c 69   assert( p->pELi
fb90: 73 74 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  st );.    assert
fba0: 28 20 6e 53 65 74 50 32 3c 73 69 7a 65 6f 66 28  ( nSetP2<sizeof(
fbb0: 61 53 65 74 50 32 29 2f 73 69 7a 65 6f 66 28 61  aSetP2)/sizeof(a
fbc0: 53 65 74 50 32 5b 30 5d 29 20 29 3b 0a 20 20 20  SetP2[0]) );.   
fbd0: 20 61 53 65 74 50 32 5b 6e 53 65 74 50 32 2b 2b   aSetP2[nSetP2++
fbe0: 5d 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41  ] = sqlite3VdbeA
fbf0: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4f 70 65 6e  ddOp2(v, OP_Open
fc00: 45 70 68 65 6d 65 72 61 6c 2c 20 64 65 73 74 2e  Ephemeral, dest.
fc10: 69 50 61 72 6d 2c 20 30 29 3b 0a 20 20 20 20 64  iParm, 0);.    d
fc20: 65 73 74 2e 65 44 65 73 74 20 3d 20 53 52 54 5f  est.eDest = SRT_
fc30: 54 61 62 6c 65 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  Table;.  }..  /*
fc40: 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 66   Generate code f
fc50: 6f 72 20 74 68 65 20 6c 65 66 74 20 61 6e 64 20  or the left and 
fc60: 72 69 67 68 74 20 53 45 4c 45 43 54 20 73 74 61  right SELECT sta
fc70: 74 65 6d 65 6e 74 73 2e 0a 20 20 2a 2f 0a 20 20  tements..  */.  
fc80: 70 4f 72 64 65 72 42 79 20 3d 20 70 2d 3e 70 4f  pOrderBy = p->pO
fc90: 72 64 65 72 42 79 3b 0a 20 20 73 77 69 74 63 68  rderBy;.  switch
fca0: 28 20 70 2d 3e 6f 70 20 29 7b 0a 20 20 20 20 63  ( p->op ){.    c
fcb0: 61 73 65 20 54 4b 5f 41 4c 4c 3a 20 7b 0a 20 20  ase TK_ALL: {.  
fcc0: 20 20 20 20 69 66 28 20 70 4f 72 64 65 72 42 79      if( pOrderBy
fcd0: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 69  ==0 ){.        i
fce0: 6e 74 20 61 64 64 72 20 3d 20 30 3b 0a 20 20 20  nt addr = 0;.   
fcf0: 20 20 20 20 20 61 73 73 65 72 74 28 20 21 70 50       assert( !pP
fd00: 72 69 6f 72 2d 3e 70 4c 69 6d 69 74 20 29 3b 0a  rior->pLimit );.
fd10: 20 20 20 20 20 20 20 20 70 50 72 69 6f 72 2d 3e          pPrior->
fd20: 70 4c 69 6d 69 74 20 3d 20 70 2d 3e 70 4c 69 6d  pLimit = p->pLim
fd30: 69 74 3b 0a 20 20 20 20 20 20 20 20 70 50 72 69  it;.        pPri
fd40: 6f 72 2d 3e 70 4f 66 66 73 65 74 20 3d 20 70 2d  or->pOffset = p-
fd50: 3e 70 4f 66 66 73 65 74 3b 0a 20 20 20 20 20 20  >pOffset;.      
fd60: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 53 65    rc = sqlite3Se
fd70: 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70 50 72  lect(pParse, pPr
fd80: 69 6f 72 2c 20 26 64 65 73 74 2c 20 30 2c 20 30  ior, &dest, 0, 0
fd90: 2c 20 30 2c 20 61 66 66 29 3b 0a 20 20 20 20 20  , 0, aff);.     
fda0: 20 20 20 70 2d 3e 70 4c 69 6d 69 74 20 3d 20 30     p->pLimit = 0
fdb0: 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 70 4f 66  ;.        p->pOf
fdc0: 66 73 65 74 20 3d 20 30 3b 0a 20 20 20 20 20 20  fset = 0;.      
fdd0: 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20    if( rc ){.    
fde0: 20 20 20 20 20 20 67 6f 74 6f 20 6d 75 6c 74 69        goto multi
fdf0: 5f 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20  _select_end;.   
fe00: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 70       }.        p
fe10: 2d 3e 70 50 72 69 6f 72 20 3d 20 30 3b 0a 20 20  ->pPrior = 0;.  
fe20: 20 20 20 20 20 20 70 2d 3e 69 4c 69 6d 69 74 20        p->iLimit 
fe30: 3d 20 70 50 72 69 6f 72 2d 3e 69 4c 69 6d 69 74  = pPrior->iLimit
fe40: 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 69 4f 66  ;.        p->iOf
fe50: 66 73 65 74 20 3d 20 70 50 72 69 6f 72 2d 3e 69  fset = pPrior->i
fe60: 4f 66 66 73 65 74 3b 0a 20 20 20 20 20 20 20 20  Offset;.        
fe70: 69 66 28 20 70 2d 3e 69 4c 69 6d 69 74 3e 3d 30  if( p->iLimit>=0
fe80: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 61 64   ){.          ad
fe90: 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  dr = sqlite3Vdbe
fea0: 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 49 66 5a  AddOp1(v, OP_IfZ
feb0: 65 72 6f 2c 20 70 2d 3e 69 4c 69 6d 69 74 29 3b  ero, p->iLimit);
fec0: 0a 20 20 20 20 20 20 20 20 20 20 56 64 62 65 43  .          VdbeC
fed0: 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 4a 75 6d 70  omment((v, "Jump
fee0: 20 61 68 65 61 64 20 69 66 20 4c 49 4d 49 54 20   ahead if LIMIT 
fef0: 72 65 61 63 68 65 64 22 29 29 3b 0a 20 20 20 20  reached"));.    
ff00: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 72 63      }.        rc
ff10: 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74   = sqlite3Select
ff20: 28 70 50 61 72 73 65 2c 20 70 2c 20 26 64 65 73  (pParse, p, &des
ff30: 74 2c 20 30 2c 20 30 2c 20 30 2c 20 61 66 66 29  t, 0, 0, 0, aff)
ff40: 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 70 50 72  ;.        p->pPr
ff50: 69 6f 72 20 3d 20 70 50 72 69 6f 72 3b 0a 20 20  ior = pPrior;.  
ff60: 20 20 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a        if( rc ){.
ff70: 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 6d            goto m
ff80: 75 6c 74 69 5f 73 65 6c 65 63 74 5f 65 6e 64 3b  ulti_select_end;
ff90: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
ffa0: 20 20 20 69 66 28 20 61 64 64 72 20 29 7b 0a 20     if( addr ){. 
ffb0: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
ffc0: 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20  VdbeJumpHere(v, 
ffd0: 61 64 64 72 29 3b 0a 20 20 20 20 20 20 20 20 7d  addr);.        }
ffe0: 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  .        break;.
fff0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 2f 2a        }.      /*
10000 20 46 6f 72 20 55 4e 49 4f 4e 20 41 4c 4c 20 2e   For UNION ALL .
10010 2e 2e 20 4f 52 44 45 52 20 42 59 20 66 61 6c 6c  .. ORDER BY fall
10020 20 74 68 72 6f 75 67 68 20 74 6f 20 74 68 65 20   through to the 
10030 6e 65 78 74 20 63 61 73 65 20 2a 2f 0a 20 20 20  next case */.   
10040 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 45   }.    case TK_E
10050 58 43 45 50 54 3a 0a 20 20 20 20 63 61 73 65 20  XCEPT:.    case 
10060 54 4b 5f 55 4e 49 4f 4e 3a 20 7b 0a 20 20 20 20  TK_UNION: {.    
10070 20 20 69 6e 74 20 75 6e 69 6f 6e 54 61 62 3b 20    int unionTab; 
10080 20 20 20 2f 2a 20 43 75 72 73 6f 72 20 6e 75 6d     /* Cursor num
10090 62 65 72 20 6f 66 20 74 68 65 20 74 65 6d 70 6f  ber of the tempo
100a0 72 61 72 79 20 74 61 62 6c 65 20 68 6f 6c 64 69  rary table holdi
100b0 6e 67 20 72 65 73 75 6c 74 20 2a 2f 0a 20 20 20  ng result */.   
100c0 20 20 20 69 6e 74 20 6f 70 20 3d 20 30 3b 20 20     int op = 0;  
100d0 20 20 20 20 2f 2a 20 4f 6e 65 20 6f 66 20 74 68      /* One of th
100e0 65 20 53 52 54 5f 20 6f 70 65 72 61 74 69 6f 6e  e SRT_ operation
100f0 73 20 74 6f 20 61 70 70 6c 79 20 74 6f 20 73 65  s to apply to se
10100 6c 66 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20  lf */.      int 
10110 70 72 69 6f 72 4f 70 3b 20 20 20 20 20 2f 2a 20  priorOp;     /* 
10120 54 68 65 20 53 52 54 5f 20 6f 70 65 72 61 74 69  The SRT_ operati
10130 6f 6e 20 74 6f 20 61 70 70 6c 79 20 74 6f 20 70  on to apply to p
10140 72 69 6f 72 20 73 65 6c 65 63 74 73 20 2a 2f 0a  rior selects */.
10150 20 20 20 20 20 20 45 78 70 72 20 2a 70 4c 69 6d        Expr *pLim
10160 69 74 2c 20 2a 70 4f 66 66 73 65 74 3b 20 2f 2a  it, *pOffset; /*
10170 20 53 61 76 65 64 20 76 61 6c 75 65 73 20 6f 66   Saved values of
10180 20 70 2d 3e 6e 4c 69 6d 69 74 20 61 6e 64 20 70   p->nLimit and p
10190 2d 3e 6e 4f 66 66 73 65 74 20 2a 2f 0a 20 20 20  ->nOffset */.   
101a0 20 20 20 69 6e 74 20 61 64 64 72 3b 0a 20 20 20     int addr;.   
101b0 20 20 20 53 65 6c 65 63 74 44 65 73 74 20 75 6e     SelectDest un
101c0 69 6f 6e 64 65 73 74 3b 0a 0a 20 20 20 20 20 20  iondest;..      
101d0 70 72 69 6f 72 4f 70 20 3d 20 70 2d 3e 6f 70 3d  priorOp = p->op=
101e0 3d 54 4b 5f 41 4c 4c 20 3f 20 53 52 54 5f 54 61  =TK_ALL ? SRT_Ta
101f0 62 6c 65 20 3a 20 53 52 54 5f 55 6e 69 6f 6e 3b  ble : SRT_Union;
10200 0a 20 20 20 20 20 20 69 66 28 20 64 65 73 74 2e  .      if( dest.
10210 65 44 65 73 74 3d 3d 70 72 69 6f 72 4f 70 20 26  eDest==priorOp &
10220 26 20 70 4f 72 64 65 72 42 79 3d 3d 30 20 26 26  & pOrderBy==0 &&
10230 20 21 70 2d 3e 70 4c 69 6d 69 74 20 26 26 20 21   !p->pLimit && !
10240 70 2d 3e 70 4f 66 66 73 65 74 20 29 7b 0a 20 20  p->pOffset ){.  
10250 20 20 20 20 20 20 2f 2a 20 57 65 20 63 61 6e 20        /* We can 
10260 72 65 75 73 65 20 61 20 74 65 6d 70 6f 72 61 72  reuse a temporar
10270 79 20 74 61 62 6c 65 20 67 65 6e 65 72 61 74 65  y table generate
10280 64 20 62 79 20 61 20 53 45 4c 45 43 54 20 74 6f  d by a SELECT to
10290 20 6f 75 72 0a 20 20 20 20 20 20 20 20 2a 2a 20   our.        ** 
102a0 72 69 67 68 74 2e 0a 20 20 20 20 20 20 20 20 2a  right..        *
102b0 2f 0a 20 20 20 20 20 20 20 20 75 6e 69 6f 6e 54  /.        unionT
102c0 61 62 20 3d 20 64 65 73 74 2e 69 50 61 72 6d 3b  ab = dest.iParm;
102d0 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
102e0 20 20 20 20 20 20 2f 2a 20 57 65 20 77 69 6c 6c        /* We will
102f0 20 6e 65 65 64 20 74 6f 20 63 72 65 61 74 65 20   need to create 
10300 6f 75 72 20 6f 77 6e 20 74 65 6d 70 6f 72 61 72  our own temporar
10310 79 20 74 61 62 6c 65 20 74 6f 20 68 6f 6c 64 20  y table to hold 
10320 74 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 69  the.        ** i
10330 6e 74 65 72 6d 65 64 69 61 74 65 20 72 65 73 75  ntermediate resu
10340 6c 74 73 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a  lts..        */.
10350 20 20 20 20 20 20 20 20 75 6e 69 6f 6e 54 61 62          unionTab
10360 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b   = pParse->nTab+
10370 2b 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  +;.        if( p
10380 72 6f 63 65 73 73 43 6f 6d 70 6f 75 6e 64 4f 72  rocessCompoundOr
10390 64 65 72 42 79 28 70 50 61 72 73 65 2c 20 70 2c  derBy(pParse, p,
103a0 20 75 6e 69 6f 6e 54 61 62 29 20 29 7b 0a 20 20   unionTab) ){.  
103b0 20 20 20 20 20 20 20 20 72 63 20 3d 20 31 3b 0a          rc = 1;.
103c0 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 6d            goto m
103d0 75 6c 74 69 5f 73 65 6c 65 63 74 5f 65 6e 64 3b  ulti_select_end;
103e0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
103f0 20 20 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65     addr = sqlite
10400 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
10410 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 2c  P_OpenEphemeral,
10420 20 75 6e 69 6f 6e 54 61 62 2c 20 30 29 3b 0a 20   unionTab, 0);. 
10430 20 20 20 20 20 20 20 69 66 28 20 70 72 69 6f 72         if( prior
10440 4f 70 3d 3d 53 52 54 5f 54 61 62 6c 65 20 29 7b  Op==SRT_Table ){
10450 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72  .          asser
10460 74 28 20 6e 53 65 74 50 32 3c 73 69 7a 65 6f 66  t( nSetP2<sizeof
10470 28 61 53 65 74 50 32 29 2f 73 69 7a 65 6f 66 28  (aSetP2)/sizeof(
10480 61 53 65 74 50 32 5b 30 5d 29 20 29 3b 0a 20 20  aSetP2[0]) );.  
10490 20 20 20 20 20 20 20 20 61 53 65 74 50 32 5b 6e          aSetP2[n
104a0 53 65 74 50 32 2b 2b 5d 20 3d 20 61 64 64 72 3b  SetP2++] = addr;
104b0 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
104c0 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74            assert
104d0 28 20 70 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68  ( p->addrOpenEph
104e0 6d 5b 30 5d 20 3d 3d 20 2d 31 20 29 3b 0a 20 20  m[0] == -1 );.  
104f0 20 20 20 20 20 20 20 20 70 2d 3e 61 64 64 72 4f          p->addrO
10500 70 65 6e 45 70 68 6d 5b 30 5d 20 3d 20 61 64 64  penEphm[0] = add
10510 72 3b 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e  r;.          p->
10520 70 52 69 67 68 74 6d 6f 73 74 2d 3e 75 73 65 73  pRightmost->uses
10530 45 70 68 6d 20 3d 20 31 3b 0a 20 20 20 20 20 20  Ephm = 1;.      
10540 20 20 7d 0a 20 20 20 20 20 20 20 20 63 72 65 61    }.        crea
10550 74 65 53 6f 72 74 69 6e 67 49 6e 64 65 78 28 70  teSortingIndex(p
10560 50 61 72 73 65 2c 20 70 2c 20 70 4f 72 64 65 72  Parse, p, pOrder
10570 42 79 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73  By);.        ass
10580 65 72 74 28 20 70 2d 3e 70 45 4c 69 73 74 20 29  ert( p->pEList )
10590 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20  ;.      }..     
105a0 20 2f 2a 20 43 6f 64 65 20 74 68 65 20 53 45 4c   /* Code the SEL
105b0 45 43 54 20 73 74 61 74 65 6d 65 6e 74 73 20 74  ECT statements t
105c0 6f 20 6f 75 72 20 6c 65 66 74 0a 20 20 20 20 20  o our left.     
105d0 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74   */.      assert
105e0 28 20 21 70 50 72 69 6f 72 2d 3e 70 4f 72 64 65  ( !pPrior->pOrde
105f0 72 42 79 20 29 3b 0a 20 20 20 20 20 20 73 71 6c  rBy );.      sql
10600 69 74 65 33 53 65 6c 65 63 74 44 65 73 74 49 6e  ite3SelectDestIn
10610 69 74 28 26 75 6e 69 6f 6e 64 65 73 74 2c 20 70  it(&uniondest, p
10620 72 69 6f 72 4f 70 2c 20 75 6e 69 6f 6e 54 61 62  riorOp, unionTab
10630 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  );.      rc = sq
10640 6c 69 74 65 33 53 65 6c 65 63 74 28 70 50 61 72  lite3Select(pPar
10650 73 65 2c 20 70 50 72 69 6f 72 2c 20 26 75 6e 69  se, pPrior, &uni
10660 6f 6e 64 65 73 74 2c 20 30 2c 20 30 2c 20 30 2c  ondest, 0, 0, 0,
10670 20 61 66 66 29 3b 0a 20 20 20 20 20 20 69 66 28   aff);.      if(
10680 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20 67   rc ){.        g
10690 6f 74 6f 20 6d 75 6c 74 69 5f 73 65 6c 65 63 74  oto multi_select
106a0 5f 65 6e 64 3b 0a 20 20 20 20 20 20 7d 0a 0a 20  _end;.      }.. 
106b0 20 20 20 20 20 2f 2a 20 43 6f 64 65 20 74 68 65       /* Code the
106c0 20 63 75 72 72 65 6e 74 20 53 45 4c 45 43 54 20   current SELECT 
106d0 73 74 61 74 65 6d 65 6e 74 0a 20 20 20 20 20 20  statement.      
106e0 2a 2f 0a 20 20 20 20 20 20 73 77 69 74 63 68 28  */.      switch(
106f0 20 70 2d 3e 6f 70 20 29 7b 0a 20 20 20 20 20 20   p->op ){.      
10700 20 20 20 63 61 73 65 20 54 4b 5f 45 58 43 45 50     case TK_EXCEP
10710 54 3a 20 20 6f 70 20 3d 20 53 52 54 5f 45 78 63  T:  op = SRT_Exc
10720 65 70 74 3b 20 20 20 62 72 65 61 6b 3b 0a 20 20  ept;   break;.  
10730 20 20 20 20 20 20 20 63 61 73 65 20 54 4b 5f 55         case TK_U
10740 4e 49 4f 4e 3a 20 20 20 6f 70 20 3d 20 53 52 54  NION:   op = SRT
10750 5f 55 6e 69 6f 6e 3b 20 20 20 20 62 72 65 61 6b  _Union;    break
10760 3b 0a 20 20 20 20 20 20 20 20 20 63 61 73 65 20  ;.         case 
10770 54 4b 5f 41 4c 4c 3a 20 20 20 20 20 6f 70 20 3d  TK_ALL:     op =
10780 20 53 52 54 5f 54 61 62 6c 65 3b 20 20 20 20 62   SRT_Table;    b
10790 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  reak;.      }.  
107a0 20 20 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d 20      p->pPrior = 
107b0 30 3b 0a 20 20 20 20 20 20 70 2d 3e 70 4f 72 64  0;.      p->pOrd
107c0 65 72 42 79 20 3d 20 30 3b 0a 20 20 20 20 20 20  erBy = 0;.      
107d0 70 2d 3e 64 69 73 61 6c 6c 6f 77 4f 72 64 65 72  p->disallowOrder
107e0 42 79 20 3d 20 70 4f 72 64 65 72 42 79 21 3d 30  By = pOrderBy!=0
107f0 3b 0a 20 20 20 20 20 20 70 4c 69 6d 69 74 20 3d  ;.      pLimit =
10800 20 70 2d 3e 70 4c 69 6d 69 74 3b 0a 20 20 20 20   p->pLimit;.    
10810 20 20 70 2d 3e 70 4c 69 6d 69 74 20 3d 20 30 3b    p->pLimit = 0;
10820 0a 20 20 20 20 20 20 70 4f 66 66 73 65 74 20 3d  .      pOffset =
10830 20 70 2d 3e 70 4f 66 66 73 65 74 3b 0a 20 20 20   p->pOffset;.   
10840 20 20 20 70 2d 3e 70 4f 66 66 73 65 74 20 3d 20     p->pOffset = 
10850 30 3b 0a 20 20 20 20 20 20 75 6e 69 6f 6e 64 65  0;.      unionde
10860 73 74 2e 65 44 65 73 74 20 3d 20 6f 70 3b 0a 20  st.eDest = op;. 
10870 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
10880 33 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20  3Select(pParse, 
10890 70 2c 20 26 75 6e 69 6f 6e 64 65 73 74 2c 20 30  p, &uniondest, 0
108a0 2c 20 30 2c 20 30 2c 20 61 66 66 29 3b 0a 20 20  , 0, 0, aff);.  
108b0 20 20 20 20 2f 2a 20 51 75 65 72 79 20 66 6c 61      /* Query fla
108c0 74 74 65 6e 69 6e 67 20 69 6e 20 73 71 6c 69 74  ttening in sqlit
108d0 65 33 53 65 6c 65 63 74 28 29 20 6d 69 67 68 74  e3Select() might
108e0 20 72 65 66 69 6c 6c 20 70 2d 3e 70 4f 72 64 65   refill p->pOrde
108f0 72 42 79 2e 0a 20 20 20 20 20 20 2a 2a 20 42 65  rBy..      ** Be
10900 20 73 75 72 65 20 74 6f 20 64 65 6c 65 74 65 20   sure to delete 
10910 70 2d 3e 70 4f 72 64 65 72 42 79 2c 20 74 68 65  p->pOrderBy, the
10920 72 65 66 6f 72 65 2c 20 74 6f 20 61 76 6f 69 64  refore, to avoid
10930 20 61 20 6d 65 6d 6f 72 79 20 6c 65 61 6b 2e 20   a memory leak. 
10940 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  */.      sqlite3
10950 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28 70  ExprListDelete(p
10960 2d 3e 70 4f 72 64 65 72 42 79 29 3b 0a 20 20 20  ->pOrderBy);.   
10970 20 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d 20 70     p->pPrior = p
10980 50 72 69 6f 72 3b 0a 20 20 20 20 20 20 70 2d 3e  Prior;.      p->
10990 70 4f 72 64 65 72 42 79 20 3d 20 70 4f 72 64 65  pOrderBy = pOrde
109a0 72 42 79 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  rBy;.      sqlit
109b0 65 33 45 78 70 72 44 65 6c 65 74 65 28 70 2d 3e  e3ExprDelete(p->
109c0 70 4c 69 6d 69 74 29 3b 0a 20 20 20 20 20 20 70  pLimit);.      p
109d0 2d 3e 70 4c 69 6d 69 74 20 3d 20 70 4c 69 6d 69  ->pLimit = pLimi
109e0 74 3b 0a 20 20 20 20 20 20 70 2d 3e 70 4f 66 66  t;.      p->pOff
109f0 73 65 74 20 3d 20 70 4f 66 66 73 65 74 3b 0a 20  set = pOffset;. 
10a00 20 20 20 20 20 70 2d 3e 69 4c 69 6d 69 74 20 3d       p->iLimit =
10a10 20 2d 31 3b 0a 20 20 20 20 20 20 70 2d 3e 69 4f   -1;.      p->iO
10a20 66 66 73 65 74 20 3d 20 2d 31 3b 0a 20 20 20 20  ffset = -1;.    
10a30 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20    if( rc ){.    
10a40 20 20 20 20 67 6f 74 6f 20 6d 75 6c 74 69 5f 73      goto multi_s
10a50 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 20  elect_end;.     
10a60 20 7d 0a 0a 0a 20 20 20 20 20 20 2f 2a 20 43 6f   }...      /* Co
10a70 6e 76 65 72 74 20 74 68 65 20 64 61 74 61 20 69  nvert the data i
10a80 6e 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79 20  n the temporary 
10a90 74 61 62 6c 65 20 69 6e 74 6f 20 77 68 61 74 65  table into whate
10aa0 76 65 72 20 66 6f 72 6d 0a 20 20 20 20 20 20 2a  ver form.      *
10ab0 2a 20 69 74 20 69 73 20 74 68 61 74 20 77 65 20  * it is that we 
10ac0 63 75 72 72 65 6e 74 6c 79 20 6e 65 65 64 2e 0a  currently need..
10ad0 20 20 20 20 20 20 2a 2f 20 20 20 20 20 20 0a 20        */      . 
10ae0 20 20 20 20 20 69 66 28 20 64 65 73 74 2e 65 44       if( dest.eD
10af0 65 73 74 21 3d 70 72 69 6f 72 4f 70 20 7c 7c 20  est!=priorOp || 
10b00 75 6e 69 6f 6e 54 61 62 21 3d 64 65 73 74 2e 69  unionTab!=dest.i
10b10 50 61 72 6d 20 29 7b 0a 20 20 20 20 20 20 20 20  Parm ){.        
10b20 69 6e 74 20 69 43 6f 6e 74 2c 20 69 42 72 65 61  int iCont, iBrea
10b30 6b 2c 20 69 53 74 61 72 74 3b 0a 20 20 20 20 20  k, iStart;.     
10b40 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 45     assert( p->pE
10b50 4c 69 73 74 20 29 3b 0a 20 20 20 20 20 20 20 20  List );.        
10b60 69 66 28 20 64 65 73 74 2e 65 44 65 73 74 3d 3d  if( dest.eDest==
10b70 53 52 54 5f 43 61 6c 6c 62 61 63 6b 20 29 7b 0a  SRT_Callback ){.
10b80 20 20 20 20 20 20 20 20 20 20 53 65 6c 65 63 74            Select
10b90 20 2a 70 46 69 72 73 74 20 3d 20 70 3b 0a 20 20   *pFirst = p;.  
10ba0 20 20 20 20 20 20 20 20 77 68 69 6c 65 28 20 70          while( p
10bb0 46 69 72 73 74 2d 3e 70 50 72 69 6f 72 20 29 20  First->pPrior ) 
10bc0 70 46 69 72 73 74 20 3d 20 70 46 69 72 73 74 2d  pFirst = pFirst-
10bd0 3e 70 50 72 69 6f 72 3b 0a 20 20 20 20 20 20 20  >pPrior;.       
10be0 20 20 20 67 65 6e 65 72 61 74 65 43 6f 6c 75 6d     generateColum
10bf0 6e 4e 61 6d 65 73 28 70 50 61 72 73 65 2c 20 30  nNames(pParse, 0
10c00 2c 20 70 46 69 72 73 74 2d 3e 70 45 4c 69 73 74  , pFirst->pEList
10c10 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
10c20 20 20 20 20 20 69 42 72 65 61 6b 20 3d 20 73 71       iBreak = sq
10c30 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62  lite3VdbeMakeLab
10c40 65 6c 28 76 29 3b 0a 20 20 20 20 20 20 20 20 69  el(v);.        i
10c50 43 6f 6e 74 20 3d 20 73 71 6c 69 74 65 33 56 64  Cont = sqlite3Vd
10c60 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a  beMakeLabel(v);.
10c70 20 20 20 20 20 20 20 20 63 6f 6d 70 75 74 65 4c          computeL
10c80 69 6d 69 74 52 65 67 69 73 74 65 72 73 28 70 50  imitRegisters(pP
10c90 61 72 73 65 2c 20 70 2c 20 69 42 72 65 61 6b 29  arse, p, iBreak)
10ca0 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
10cb0 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
10cc0 50 5f 52 65 77 69 6e 64 2c 20 75 6e 69 6f 6e 54  P_Rewind, unionT
10cd0 61 62 2c 20 69 42 72 65 61 6b 29 3b 0a 20 20 20  ab, iBreak);.   
10ce0 20 20 20 20 20 69 53 74 61 72 74 20 3d 20 73 71       iStart = sq
10cf0 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74  lite3VdbeCurrent
10d00 41 64 64 72 28 76 29 3b 0a 20 20 20 20 20 20 20  Addr(v);.       
10d10 20 73 65 6c 65 63 74 49 6e 6e 65 72 4c 6f 6f 70   selectInnerLoop
10d20 28 70 50 61 72 73 65 2c 20 70 2c 20 70 2d 3e 70  (pParse, p, p->p
10d30 45 4c 69 73 74 2c 20 75 6e 69 6f 6e 54 61 62 2c  EList, unionTab,
10d40 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70   p->pEList->nExp
10d50 72 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  r,.             
10d60 20 20 20 20 20 20 20 20 20 20 20 70 4f 72 64 65             pOrde
10d70 72 42 79 2c 20 2d 31 2c 20 26 64 65 73 74 2c 20  rBy, -1, &dest, 
10d80 69 43 6f 6e 74 2c 20 69 42 72 65 61 6b 2c 20 30  iCont, iBreak, 0
10d90 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
10da0 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62  e3VdbeResolveLab
10db0 65 6c 28 76 2c 20 69 43 6f 6e 74 29 3b 0a 20 20  el(v, iCont);.  
10dc0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
10dd0 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 65  eAddOp2(v, OP_Ne
10de0 78 74 2c 20 75 6e 69 6f 6e 54 61 62 2c 20 69 53  xt, unionTab, iS
10df0 74 61 72 74 29 3b 0a 20 20 20 20 20 20 20 20 73  tart);.        s
10e00 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76  qlite3VdbeResolv
10e10 65 4c 61 62 65 6c 28 76 2c 20 69 42 72 65 61 6b  eLabel(v, iBreak
10e20 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
10e30 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
10e40 4f 50 5f 43 6c 6f 73 65 2c 20 75 6e 69 6f 6e 54  OP_Close, unionT
10e50 61 62 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a  ab, 0);.      }.
10e60 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
10e70 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49   }.    case TK_I
10e80 4e 54 45 52 53 45 43 54 3a 20 7b 0a 20 20 20 20  NTERSECT: {.    
10e90 20 20 69 6e 74 20 74 61 62 31 2c 20 74 61 62 32    int tab1, tab2
10ea0 3b 0a 20 20 20 20 20 20 69 6e 74 20 69 43 6f 6e  ;.      int iCon
10eb0 74 2c 20 69 42 72 65 61 6b 2c 20 69 53 74 61 72  t, iBreak, iStar
10ec0 74 3b 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70  t;.      Expr *p
10ed0 4c 69 6d 69 74 2c 20 2a 70 4f 66 66 73 65 74 3b  Limit, *pOffset;
10ee0 0a 20 20 20 20 20 20 69 6e 74 20 61 64 64 72 3b  .      int addr;
10ef0 0a 20 20 20 20 20 20 53 65 6c 65 63 74 44 65 73  .      SelectDes
10f00 74 20 69 6e 74 65 72 73 65 63 74 64 65 73 74 3b  t intersectdest;
10f10 0a 20 20 20 20 20 20 69 6e 74 20 72 31 3b 0a 0a  .      int r1;..
10f20 20 20 20 20 20 20 2f 2a 20 49 4e 54 45 52 53 45        /* INTERSE
10f30 43 54 20 69 73 20 64 69 66 66 65 72 65 6e 74 20  CT is different 
10f40 66 72 6f 6d 20 74 68 65 20 6f 74 68 65 72 73 20  from the others 
10f50 73 69 6e 63 65 20 69 74 20 72 65 71 75 69 72 65  since it require
10f60 73 0a 20 20 20 20 20 20 2a 2a 20 74 77 6f 20 74  s.      ** two t
10f70 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 73 2e  emporary tables.
10f80 20 20 48 65 6e 63 65 20 69 74 20 68 61 73 20 69    Hence it has i
10f90 74 73 20 6f 77 6e 20 63 61 73 65 2e 20 20 42 65  ts own case.  Be
10fa0 67 69 6e 0a 20 20 20 20 20 20 2a 2a 20 62 79 20  gin.      ** by 
10fb0 61 6c 6c 6f 63 61 74 69 6e 67 20 74 68 65 20 74  allocating the t
10fc0 61 62 6c 65 73 20 77 65 20 77 69 6c 6c 20 6e 65  ables we will ne
10fd0 65 64 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  ed..      */.   
10fe0 20 20 20 74 61 62 31 20 3d 20 70 50 61 72 73 65     tab1 = pParse
10ff0 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20 20 20  ->nTab++;.      
11000 74 61 62 32 20 3d 20 70 50 61 72 73 65 2d 3e 6e  tab2 = pParse->n
11010 54 61 62 2b 2b 3b 0a 20 20 20 20 20 20 69 66 28  Tab++;.      if(
11020 20 70 72 6f 63 65 73 73 43 6f 6d 70 6f 75 6e 64   processCompound
11030 4f 72 64 65 72 42 79 28 70 50 61 72 73 65 2c 20  OrderBy(pParse, 
11040 70 2c 20 74 61 62 31 29 20 29 7b 0a 20 20 20 20  p, tab1) ){.    
11050 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20      rc = 1;.    
11060 20 20 20 20 67 6f 74 6f 20 6d 75 6c 74 69 5f 73      goto multi_s
11070 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 20  elect_end;.     
11080 20 7d 0a 20 20 20 20 20 20 63 72 65 61 74 65 53   }.      createS
11090 6f 72 74 69 6e 67 49 6e 64 65 78 28 70 50 61 72  ortingIndex(pPar
110a0 73 65 2c 20 70 2c 20 70 4f 72 64 65 72 42 79 29  se, p, pOrderBy)
110b0 3b 0a 0a 20 20 20 20 20 20 61 64 64 72 20 3d 20  ;..      addr = 
110c0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
110d0 32 28 76 2c 20 4f 50 5f 4f 70 65 6e 45 70 68 65  2(v, OP_OpenEphe
110e0 6d 65 72 61 6c 2c 20 74 61 62 31 2c 20 30 29 3b  meral, tab1, 0);
110f0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
11100 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b 30  ->addrOpenEphm[0
11110 5d 20 3d 3d 20 2d 31 20 29 3b 0a 20 20 20 20 20  ] == -1 );.     
11120 20 70 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d   p->addrOpenEphm
11130 5b 30 5d 20 3d 20 61 64 64 72 3b 0a 20 20 20 20  [0] = addr;.    
11140 20 20 70 2d 3e 70 52 69 67 68 74 6d 6f 73 74 2d    p->pRightmost-
11150 3e 75 73 65 73 45 70 68 6d 20 3d 20 31 3b 0a 20  >usesEphm = 1;. 
11160 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e       assert( p->
11170 70 45 4c 69 73 74 20 29 3b 0a 0a 20 20 20 20 20  pEList );..     
11180 20 2f 2a 20 43 6f 64 65 20 74 68 65 20 53 45 4c   /* Code the SEL
11190 45 43 54 73 20 74 6f 20 6f 75 72 20 6c 65 66 74  ECTs to our left
111a0 20 69 6e 74 6f 20 74 65 6d 70 6f 72 61 72 79 20   into temporary 
111b0 74 61 62 6c 65 20 22 74 61 62 31 22 2e 0a 20 20  table "tab1"..  
111c0 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c      */.      sql
111d0 69 74 65 33 53 65 6c 65 63 74 44 65 73 74 49 6e  ite3SelectDestIn
111e0 69 74 28 26 69 6e 74 65 72 73 65 63 74 64 65 73  it(&intersectdes
111f0 74 2c 20 53 52 54 5f 55 6e 69 6f 6e 2c 20 74 61  t, SRT_Union, ta
11200 62 31 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  b1);.      rc = 
11210 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28 70 50  sqlite3Select(pP
11220 61 72 73 65 2c 20 70 50 72 69 6f 72 2c 20 26 69  arse, pPrior, &i
11230 6e 74 65 72 73 65 63 74 64 65 73 74 2c 20 30 2c  ntersectdest, 0,
11240 20 30 2c 20 30 2c 20 61 66 66 29 3b 0a 20 20 20   0, 0, aff);.   
11250 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20     if( rc ){.   
11260 20 20 20 20 20 67 6f 74 6f 20 6d 75 6c 74 69 5f       goto multi_
11270 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20  select_end;.    
11280 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 43 6f    }..      /* Co
11290 64 65 20 74 68 65 20 63 75 72 72 65 6e 74 20 53  de the current S
112a0 45 4c 45 43 54 20 69 6e 74 6f 20 74 65 6d 70 6f  ELECT into tempo
112b0 72 61 72 79 20 74 61 62 6c 65 20 22 74 61 62 32  rary table "tab2
112c0 22 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ".      */.     
112d0 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56   addr = sqlite3V
112e0 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
112f0 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 2c 20 74  OpenEphemeral, t
11300 61 62 32 2c 20 30 29 3b 0a 20 20 20 20 20 20 61  ab2, 0);.      a
11310 73 73 65 72 74 28 20 70 2d 3e 61 64 64 72 4f 70  ssert( p->addrOp
11320 65 6e 45 70 68 6d 5b 31 5d 20 3d 3d 20 2d 31 20  enEphm[1] == -1 
11330 29 3b 0a 20 20 20 20 20 20 70 2d 3e 61 64 64 72  );.      p->addr
11340 4f 70 65 6e 45 70 68 6d 5b 31 5d 20 3d 20 61 64  OpenEphm[1] = ad
11350 64 72 3b 0a 20 20 20 20 20 20 70 2d 3e 70 50 72  dr;.      p->pPr
11360 69 6f 72 20 3d 20 30 3b 0a 20 20 20 20 20 20 70  ior = 0;.      p
11370 4c 69 6d 69 74 20 3d 20 70 2d 3e 70 4c 69 6d 69  Limit = p->pLimi
11380 74 3b 0a 20 20 20 20 20 20 70 2d 3e 70 4c 69 6d  t;.      p->pLim
11390 69 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 4f  it = 0;.      pO
113a0 66 66 73 65 74 20 3d 20 70 2d 3e 70 4f 66 66 73  ffset = p->pOffs
113b0 65 74 3b 0a 20 20 20 20 20 20 70 2d 3e 70 4f 66  et;.      p->pOf
113c0 66 73 65 74 20 3d 20 30 3b 0a 20 20 20 20 20 20  fset = 0;.      
113d0 69 6e 74 65 72 73 65 63 74 64 65 73 74 2e 69 50  intersectdest.iP
113e0 61 72 6d 20 3d 20 74 61 62 32 3b 0a 20 20 20 20  arm = tab2;.    
113f0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 53 65    rc = sqlite3Se
11400 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70 2c 20  lect(pParse, p, 
11410 26 69 6e 74 65 72 73 65 63 74 64 65 73 74 2c 20  &intersectdest, 
11420 30 2c 20 30 2c 20 30 2c 20 61 66 66 29 3b 0a 20  0, 0, 0, aff);. 
11430 20 20 20 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d       p->pPrior =
11440 20 70 50 72 69 6f 72 3b 0a 20 20 20 20 20 20 73   pPrior;.      s
11450 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65  qlite3ExprDelete
11460 28 70 2d 3e 70 4c 69 6d 69 74 29 3b 0a 20 20 20  (p->pLimit);.   
11470 20 20 20 70 2d 3e 70 4c 69 6d 69 74 20 3d 20 70     p->pLimit = p
11480 4c 69 6d 69 74 3b 0a 20 20 20 20 20 20 70 2d 3e  Limit;.      p->
11490 70 4f 66 66 73 65 74 20 3d 20 70 4f 66 66 73 65  pOffset = pOffse
114a0 74 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 20  t;.      if( rc 
114b0 29 7b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20  ){.        goto 
114c0 6d 75 6c 74 69 5f 73 65 6c 65 63 74 5f 65 6e 64  multi_select_end
114d0 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20  ;.      }..     
114e0 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64   /* Generate cod
114f0 65 20 74 6f 20 74 61 6b 65 20 74 68 65 20 69 6e  e to take the in
11500 74 65 72 73 65 63 74 69 6f 6e 20 6f 66 20 74 68  tersection of th
11510 65 20 74 77 6f 20 74 65 6d 70 6f 72 61 72 79 0a  e two temporary.
11520 20 20 20 20 20 20 2a 2a 20 74 61 62 6c 65 73 2e        ** tables.
11530 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
11540 61 73 73 65 72 74 28 20 70 2d 3e 70 45 4c 69 73  assert( p->pELis
11550 74 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 64  t );.      if( d
11560 65 73 74 2e 65 44 65 73 74 3d 3d 53 52 54 5f 43  est.eDest==SRT_C
11570 61 6c 6c 62 61 63 6b 20 29 7b 0a 20 20 20 20 20  allback ){.     
11580 20 20 20 53 65 6c 65 63 74 20 2a 70 46 69 72 73     Select *pFirs
11590 74 20 3d 20 70 3b 0a 20 20 20 20 20 20 20 20 77  t = p;.        w
115a0 68 69 6c 65 28 20 70 46 69 72 73 74 2d 3e 70 50  hile( pFirst->pP
115b0 72 69 6f 72 20 29 20 70 46 69 72 73 74 20 3d 20  rior ) pFirst = 
115c0 70 46 69 72 73 74 2d 3e 70 50 72 69 6f 72 3b 0a  pFirst->pPrior;.
115d0 20 20 20 20 20 20 20 20 67 65 6e 65 72 61 74 65          generate
115e0 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 70 50 61 72  ColumnNames(pPar
115f0 73 65 2c 20 30 2c 20 70 46 69 72 73 74 2d 3e 70  se, 0, pFirst->p
11600 45 4c 69 73 74 29 3b 0a 20 20 20 20 20 20 7d 0a  EList);.      }.
11610 20 20 20 20 20 20 69 42 72 65 61 6b 20 3d 20 73        iBreak = s
11620 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61  qlite3VdbeMakeLa
11630 62 65 6c 28 76 29 3b 0a 20 20 20 20 20 20 69 43  bel(v);.      iC
11640 6f 6e 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62  ont = sqlite3Vdb
11650 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20  eMakeLabel(v);. 
11660 20 20 20 20 20 63 6f 6d 70 75 74 65 4c 69 6d 69       computeLimi
11670 74 52 65 67 69 73 74 65 72 73 28 70 50 61 72 73  tRegisters(pPars
11680 65 2c 20 70 2c 20 69 42 72 65 61 6b 29 3b 0a 20  e, p, iBreak);. 
11690 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
116a0 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52 65 77  AddOp2(v, OP_Rew
116b0 69 6e 64 2c 20 74 61 62 31 2c 20 69 42 72 65 61  ind, tab1, iBrea
116c0 6b 29 3b 0a 20 20 20 20 20 20 72 31 20 3d 20 73  k);.      r1 = s
116d0 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65 67  qlite3GetTempReg
116e0 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20  (pParse);.      
116f0 69 53 74 61 72 74 20 3d 20 73 71 6c 69 74 65 33  iStart = sqlite3
11700 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
11710 5f 52 6f 77 4b 65 79 2c 20 74 61 62 31 2c 20 72  _RowKey, tab1, r
11720 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  1);.      sqlite
11730 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
11740 50 5f 4e 6f 74 46 6f 75 6e 64 2c 20 74 61 62 32  P_NotFound, tab2
11750 2c 20 69 43 6f 6e 74 2c 20 72 31 29 3b 0a 20 20  , iCont, r1);.  
11760 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61      sqlite3Relea
11770 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65  seTempReg(pParse
11780 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 73 65 6c  , r1);.      sel
11790 65 63 74 49 6e 6e 65 72 4c 6f 6f 70 28 70 50 61  ectInnerLoop(pPa
117a0 72 73 65 2c 20 70 2c 20 70 2d 3e 70 45 4c 69 73  rse, p, p->pELis
117b0 74 2c 20 74 61 62 31 2c 20 70 2d 3e 70 45 4c 69  t, tab1, p->pELi
117c0 73 74 2d 3e 6e 45 78 70 72 2c 0a 20 20 20 20 20  st->nExpr,.     
117d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
117e0 20 70 4f 72 64 65 72 42 79 2c 20 2d 31 2c 20 26   pOrderBy, -1, &
117f0 64 65 73 74 2c 20 69 43 6f 6e 74 2c 20 69 42 72  dest, iCont, iBr
11800 65 61 6b 2c 20 30 29 3b 0a 20 20 20 20 20 20 73  eak, 0);.      s
11810 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76  qlite3VdbeResolv
11820 65 4c 61 62 65 6c 28 76 2c 20 69 43 6f 6e 74 29  eLabel(v, iCont)
11830 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
11840 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
11850 4e 65 78 74 2c 20 74 61 62 31 2c 20 69 53 74 61  Next, tab1, iSta
11860 72 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  rt);.      sqlit
11870 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62  e3VdbeResolveLab
11880 65 6c 28 76 2c 20 69 42 72 65 61 6b 29 3b 0a 20  el(v, iBreak);. 
11890 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
118a0 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 43 6c 6f  AddOp2(v, OP_Clo
118b0 73 65 2c 20 74 61 62 32 2c 20 30 29 3b 0a 20 20  se, tab2, 0);.  
118c0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
118d0 64 64 4f 70 32 28 76 2c 20 4f 50 5f 43 6c 6f 73  ddOp2(v, OP_Clos
118e0 65 2c 20 74 61 62 31 2c 20 30 29 3b 0a 20 20 20  e, tab1, 0);.   
118f0 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
11900 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 73    }..  /* Make s
11910 75 72 65 20 61 6c 6c 20 53 45 4c 45 43 54 73 20  ure all SELECTs 
11920 69 6e 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74  in the statement
11930 20 68 61 76 65 20 74 68 65 20 73 61 6d 65 20 6e   have the same n
11940 75 6d 62 65 72 20 6f 66 20 65 6c 65 6d 65 6e 74  umber of element
11950 73 0a 20 20 2a 2a 20 69 6e 20 74 68 65 69 72 20  s.  ** in their 
11960 72 65 73 75 6c 74 20 73 65 74 73 2e 0a 20 20 2a  result sets..  *
11970 2f 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70  /.  assert( p->p
11980 45 4c 69 73 74 20 26 26 20 70 50 72 69 6f 72 2d  EList && pPrior-
11990 3e 70 45 4c 69 73 74 20 29 3b 0a 20 20 69 66 28  >pEList );.  if(
119a0 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70   p->pEList->nExp
119b0 72 21 3d 70 50 72 69 6f 72 2d 3e 70 45 4c 69 73  r!=pPrior->pELis
119c0 74 2d 3e 6e 45 78 70 72 20 29 7b 0a 20 20 20 20  t->nExpr ){.    
119d0 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
119e0 70 50 61 72 73 65 2c 20 22 53 45 4c 45 43 54 73  pParse, "SELECTs
119f0 20 74 6f 20 74 68 65 20 6c 65 66 74 20 61 6e 64   to the left and
11a00 20 72 69 67 68 74 20 6f 66 20 25 73 22 0a 20 20   right of %s".  
11a10 20 20 20 20 22 20 64 6f 20 6e 6f 74 20 68 61 76      " do not hav
11a20 65 20 74 68 65 20 73 61 6d 65 20 6e 75 6d 62 65  e the same numbe
11a30 72 20 6f 66 20 72 65 73 75 6c 74 20 63 6f 6c 75  r of result colu
11a40 6d 6e 73 22 2c 20 73 65 6c 65 63 74 4f 70 4e 61  mns", selectOpNa
11a50 6d 65 28 70 2d 3e 6f 70 29 29 3b 0a 20 20 20 20  me(p->op));.    
11a60 72 63 20 3d 20 31 3b 0a 20 20 20 20 67 6f 74 6f  rc = 1;.    goto
11a70 20 6d 75 6c 74 69 5f 73 65 6c 65 63 74 5f 65 6e   multi_select_en
11a80 64 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 65 74  d;.  }..  /* Set
11a90 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 63   the number of c
11aa0 6f 6c 75 6d 6e 73 20 69 6e 20 74 65 6d 70 6f 72  olumns in tempor
11ab0 61 72 79 20 74 61 62 6c 65 73 0a 20 20 2a 2f 0a  ary tables.  */.
11ac0 20 20 6e 43 6f 6c 20 3d 20 70 2d 3e 70 45 4c 69    nCol = p->pELi
11ad0 73 74 2d 3e 6e 45 78 70 72 3b 0a 20 20 77 68 69  st->nExpr;.  whi
11ae0 6c 65 28 20 6e 53 65 74 50 32 20 29 7b 0a 20 20  le( nSetP2 ){.  
11af0 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61    sqlite3VdbeCha
11b00 6e 67 65 50 32 28 76 2c 20 61 53 65 74 50 32 5b  ngeP2(v, aSetP2[
11b10 2d 2d 6e 53 65 74 50 32 5d 2c 20 6e 43 6f 6c 29  --nSetP2], nCol)
11b20 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 6f 6d 70  ;.  }..  /* Comp
11b30 75 74 65 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65  ute collating se
11b40 71 75 65 6e 63 65 73 20 75 73 65 64 20 62 79 20  quences used by 
11b50 65 69 74 68 65 72 20 74 68 65 20 4f 52 44 45 52  either the ORDER
11b60 20 42 59 20 63 6c 61 75 73 65 20 6f 72 0a 20 20   BY clause or.  
11b70 2a 2a 20 62 79 20 61 6e 79 20 74 65 6d 70 6f 72  ** by any tempor
11b80 61 72 79 20 74 61 62 6c 65 73 20 6e 65 65 64 65  ary tables neede
11b90 64 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 74  d to implement t
11ba0 68 65 20 63 6f 6d 70 6f 75 6e 64 20 73 65 6c 65  he compound sele
11bb0 63 74 2e 0a 20 20 2a 2a 20 41 74 74 61 63 68 20  ct..  ** Attach 
11bc0 74 68 65 20 4b 65 79 49 6e 66 6f 20 73 74 72 75  the KeyInfo stru
11bd0 63 74 75 72 65 20 74 6f 20 61 6c 6c 20 74 65 6d  cture to all tem
11be0 70 6f 72 61 72 79 20 74 61 62 6c 65 73 2e 20 20  porary tables.  
11bf0 49 6e 76 6f 6b 65 20 74 68 65 0a 20 20 2a 2a 20  Invoke the.  ** 
11c00 4f 52 44 45 52 20 42 59 20 70 72 6f 63 65 73 73  ORDER BY process
11c10 69 6e 67 20 69 66 20 74 68 65 72 65 20 69 73 20  ing if there is 
11c20 61 6e 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75  an ORDER BY clau
11c30 73 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68  se..  **.  ** Th
11c40 69 73 20 73 65 63 74 69 6f 6e 20 69 73 20 72 75  is section is ru
11c50 6e 20 62 79 20 74 68 65 20 72 69 67 68 74 2d 6d  n by the right-m
11c60 6f 73 74 20 53 45 4c 45 43 54 20 73 74 61 74 65  ost SELECT state
11c70 6d 65 6e 74 20 6f 6e 6c 79 2e 0a 20 20 2a 2a 20  ment only..  ** 
11c80 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
11c90 73 20 74 6f 20 74 68 65 20 6c 65 66 74 20 61 6c  s to the left al
11ca0 77 61 79 73 20 73 6b 69 70 20 74 68 69 73 20 70  ways skip this p
11cb0 61 72 74 2e 20 20 54 68 65 20 72 69 67 68 74 2d  art.  The right-
11cc0 6d 6f 73 74 0a 20 20 2a 2a 20 53 45 4c 45 43 54  most.  ** SELECT
11cd0 20 6d 69 67 68 74 20 61 6c 73 6f 20 73 6b 69 70   might also skip
11ce0 20 74 68 69 73 20 70 61 72 74 20 69 66 20 69 74   this part if it
11cf0 20 68 61 73 20 6e 6f 20 4f 52 44 45 52 20 42 59   has no ORDER BY
11d00 20 63 6c 61 75 73 65 20 61 6e 64 0a 20 20 2a 2a   clause and.  **
11d10 20 6e 6f 20 74 65 6d 70 20 74 61 62 6c 65 73 20   no temp tables 
11d20 61 72 65 20 72 65 71 75 69 72 65 64 2e 0a 20 20  are required..  
11d30 2a 2f 0a 20 20 69 66 28 20 70 4f 72 64 65 72 42  */.  if( pOrderB
11d40 79 20 7c 7c 20 70 2d 3e 75 73 65 73 45 70 68 6d  y || p->usesEphm
11d50 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 20 20   ){.    int i;  
11d60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11d70 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f        /* Loop co
11d80 75 6e 74 65 72 20 2a 2f 0a 20 20 20 20 4b 65 79  unter */.    Key
11d90 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 3b 20  Info *pKeyInfo; 
11da0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f             /* Co
11db0 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65  llating sequence
11dc0 20 66 6f 72 20 74 68 65 20 72 65 73 75 6c 74 20   for the result 
11dd0 73 65 74 20 2a 2f 0a 20 20 20 20 53 65 6c 65 63  set */.    Selec
11de0 74 20 2a 70 4c 6f 6f 70 3b 20 20 20 20 20 20 20  t *pLoop;       
11df0 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6f 72 20           /* For 
11e00 6c 6f 6f 70 69 6e 67 20 74 68 72 6f 75 67 68 20  looping through 
11e10 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
11e20 73 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 4b 65  s */.    int nKe
11e30 79 43 6f 6c 3b 20 20 20 20 20 20 20 20 20 20 20  yCol;           
11e40 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
11e50 20 6f 66 20 65 6e 74 72 69 65 73 20 69 6e 20 70   of entries in p
11e60 4b 65 79 49 6e 66 6f 2d 3e 61 43 6f 6c 5b 5d 20  KeyInfo->aCol[] 
11e70 2a 2f 0a 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a  */.    CollSeq *
11e80 2a 61 70 43 6f 6c 6c 3b 20 20 20 20 20 20 20 20  *apColl;        
11e90 20 20 20 20 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70       /* For loop
11ea0 69 6e 67 20 74 68 72 6f 75 67 68 20 70 4b 65 79  ing through pKey
11eb0 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b 5d 20 2a 2f  Info->aColl[] */
11ec0 0a 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a 2a 61  .    CollSeq **a
11ed0 43 6f 70 79 3b 20 20 20 20 20 20 20 20 20 20 20  Copy;           
11ee0 20 20 20 2f 2a 20 41 20 63 6f 70 79 20 6f 66 20     /* A copy of 
11ef0 70 4b 65 79 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b  pKeyInfo->aColl[
11f00 5d 20 2a 2f 0a 0a 20 20 20 20 61 73 73 65 72 74  ] */..    assert
11f10 28 20 70 2d 3e 70 52 69 67 68 74 6d 6f 73 74 3d  ( p->pRightmost=
11f20 3d 70 20 29 3b 0a 20 20 20 20 6e 4b 65 79 43 6f  =p );.    nKeyCo
11f30 6c 20 3d 20 6e 43 6f 6c 20 2b 20 28 70 4f 72 64  l = nCol + (pOrd
11f40 65 72 42 79 20 3f 20 70 4f 72 64 65 72 42 79 2d  erBy ? pOrderBy-
11f50 3e 6e 45 78 70 72 20 3a 20 30 29 3b 0a 20 20 20  >nExpr : 0);.   
11f60 20 70 4b 65 79 49 6e 66 6f 20 3d 20 73 71 6c 69   pKeyInfo = sqli
11f70 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28  te3DbMallocZero(
11f80 70 50 61 72 73 65 2d 3e 64 62 2c 0a 20 20 20 20  pParse->db,.    
11f90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11fa0 20 20 20 73 69 7a 65 6f 66 28 2a 70 4b 65 79 49     sizeof(*pKeyI
11fb0 6e 66 6f 29 2b 6e 4b 65 79 43 6f 6c 2a 28 73 69  nfo)+nKeyCol*(si
11fc0 7a 65 6f 66 28 43 6f 6c 6c 53 65 71 2a 29 20 2b  zeof(CollSeq*) +
11fd0 20 31 29 29 3b 0a 20 20 20 20 69 66 28 20 21 70   1));.    if( !p
11fe0 4b 65 79 49 6e 66 6f 20 29 7b 0a 20 20 20 20 20  KeyInfo ){.     
11ff0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d   rc = SQLITE_NOM
12000 45 4d 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 6d  EM;.      goto m
12010 75 6c 74 69 5f 73 65 6c 65 63 74 5f 65 6e 64 3b  ulti_select_end;
12020 0a 20 20 20 20 7d 0a 0a 20 20 20 20 70 4b 65 79  .    }..    pKey
12030 49 6e 66 6f 2d 3e 65 6e 63 20 3d 20 45 4e 43 28  Info->enc = ENC(
12040 70 50 61 72 73 65 2d 3e 64 62 29 3b 0a 20 20 20  pParse->db);.   
12050 20 70 4b 65 79 49 6e 66 6f 2d 3e 6e 46 69 65 6c   pKeyInfo->nFiel
12060 64 20 3d 20 6e 43 6f 6c 3b 0a 0a 20 20 20 20 66  d = nCol;..    f
12070 6f 72 28 69 3d 30 2c 20 61 70 43 6f 6c 6c 3d 70  or(i=0, apColl=p
12080 4b 65 79 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 3b 20  KeyInfo->aColl; 
12090 69 3c 6e 43 6f 6c 3b 20 69 2b 2b 2c 20 61 70 43  i<nCol; i++, apC
120a0 6f 6c 6c 2b 2b 29 7b 0a 20 20 20 20 20 20 2a 61  oll++){.      *a
120b0 70 43 6f 6c 6c 20 3d 20 6d 75 6c 74 69 53 65 6c  pColl = multiSel
120c0 65 63 74 43 6f 6c 6c 53 65 71 28 70 50 61 72 73  ectCollSeq(pPars
120d0 65 2c 20 70 2c 20 69 29 3b 0a 20 20 20 20 20 20  e, p, i);.      
120e0 69 66 28 20 30 3d 3d 2a 61 70 43 6f 6c 6c 20 29  if( 0==*apColl )
120f0 7b 0a 20 20 20 20 20 20 20 20 2a 61 70 43 6f 6c  {.        *apCol
12100 6c 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e  l = pParse->db->
12110 70 44 66 6c 74 43 6f 6c 6c 3b 0a 20 20 20 20 20  pDfltColl;.     
12120 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 66 6f   }.    }..    fo
12130 72 28 70 4c 6f 6f 70 3d 70 3b 20 70 4c 6f 6f 70  r(pLoop=p; pLoop
12140 3b 20 70 4c 6f 6f 70 3d 70 4c 6f 6f 70 2d 3e 70  ; pLoop=pLoop->p
12150 50 72 69 6f 72 29 7b 0a 20 20 20 20 20 20 66 6f  Prior){.      fo
12160 72 28 69 3d 30 3b 20 69 3c 32 3b 20 69 2b 2b 29  r(i=0; i<2; i++)
12170 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 61 64  {.        int ad
12180 64 72 20 3d 20 70 4c 6f 6f 70 2d 3e 61 64 64 72  dr = pLoop->addr
12190 4f 70 65 6e 45 70 68 6d 5b 69 5d 3b 0a 20 20 20  OpenEphm[i];.   
121a0 20 20 20 20 20 69 66 28 20 61 64 64 72 3c 30 20       if( addr<0 
121b0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ){.          /* 
121c0 49 66 20 5b 30 5d 20 69 73 20 75 6e 75 73 65 64  If [0] is unused
121d0 20 74 68 65 6e 20 5b 31 5d 20 69 73 20 61 6c 73   then [1] is als
121e0 6f 20 75 6e 75 73 65 64 2e 20 20 53 6f 20 77 65  o unused.  So we
121f0 20 63 61 6e 0a 20 20 20 20 20 20 20 20 20 20 2a   can.          *
12200 2a 20 61 6c 77 61 79 73 20 73 61 66 65 6c 79 20  * always safely 
12210 61 62 6f 72 74 20 61 73 20 73 6f 6f 6e 20 61 73  abort as soon as
12220 20 74 68 65 20 66 69 72 73 74 20 75 6e 75 73 65   the first unuse
12230 64 20 73 6c 6f 74 20 69 73 20 66 6f 75 6e 64 20  d slot is found 
12240 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 61 73 73  */.          ass
12250 65 72 74 28 20 70 4c 6f 6f 70 2d 3e 61 64 64 72  ert( pLoop->addr
12260 4f 70 65 6e 45 70 68 6d 5b 31 5d 3c 30 20 29 3b  OpenEphm[1]<0 );
12270 0a 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b  .          break
12280 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
12290 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43      sqlite3VdbeC
122a0 68 61 6e 67 65 50 32 28 76 2c 20 61 64 64 72 2c  hangeP2(v, addr,
122b0 20 6e 43 6f 6c 29 3b 0a 20 20 20 20 20 20 20 20   nCol);.        
122c0 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67  sqlite3VdbeChang
122d0 65 50 34 28 76 2c 20 61 64 64 72 2c 20 28 63 68  eP4(v, addr, (ch
122e0 61 72 2a 29 70 4b 65 79 49 6e 66 6f 2c 20 50 34  ar*)pKeyInfo, P4
122f0 5f 4b 45 59 49 4e 46 4f 29 3b 0a 20 20 20 20 20  _KEYINFO);.     
12300 20 20 20 70 4c 6f 6f 70 2d 3e 61 64 64 72 4f 70     pLoop->addrOp
12310 65 6e 45 70 68 6d 5b 69 5d 20 3d 20 2d 31 3b 0a  enEphm[i] = -1;.
12320 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20        }.    }.. 
12330 20 20 20 69 66 28 20 70 4f 72 64 65 72 42 79 20     if( pOrderBy 
12340 29 7b 0a 20 20 20 20 20 20 73 74 72 75 63 74 20  ){.      struct 
12350 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70  ExprList_item *p
12360 4f 54 65 72 6d 20 3d 20 70 4f 72 64 65 72 42 79  OTerm = pOrderBy
12370 2d 3e 61 3b 0a 20 20 20 20 20 20 69 6e 74 20 6e  ->a;.      int n
12380 4f 72 64 65 72 42 79 45 78 70 72 20 3d 20 70 4f  OrderByExpr = pO
12390 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 3b 0a 20  rderBy->nExpr;. 
123a0 20 20 20 20 20 69 6e 74 20 61 64 64 72 3b 0a 20       int addr;. 
123b0 20 20 20 20 20 75 38 20 2a 70 53 6f 72 74 4f 72       u8 *pSortOr
123c0 64 65 72 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 52  der;..      /* R
123d0 65 75 73 65 20 74 68 65 20 73 61 6d 65 20 70 4b  euse the same pK
123e0 65 79 49 6e 66 6f 20 66 6f 72 20 74 68 65 20 4f  eyInfo for the O
123f0 52 44 45 52 20 42 59 20 61 73 20 77 61 73 20 75  RDER BY as was u
12400 73 65 64 20 61 62 6f 76 65 20 66 6f 72 0a 20 20  sed above for.  
12410 20 20 20 20 2a 2a 20 74 68 65 20 63 6f 6d 70 6f      ** the compo
12420 75 6e 64 20 73 65 6c 65 63 74 20 73 74 61 74 65  und select state
12430 6d 65 6e 74 73 2e 20 20 45 78 63 65 70 74 20 77  ments.  Except w
12440 65 20 68 61 76 65 20 74 6f 20 63 68 61 6e 67 65  e have to change
12450 20 6f 75 74 20 74 68 65 0a 20 20 20 20 20 20 2a   out the.      *
12460 2a 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 43 6f 6c  * pKeyInfo->aCol
12470 6c 5b 5d 20 76 61 6c 75 65 73 2e 20 20 53 6f 6d  l[] values.  Som
12480 65 20 6f 66 20 74 68 65 20 61 43 6f 6c 6c 5b 5d  e of the aColl[]
12490 20 76 61 6c 75 65 73 20 77 69 6c 6c 20 62 65 0a   values will be.
124a0 20 20 20 20 20 20 2a 2a 20 72 65 75 73 65 64 20        ** reused 
124b0 77 68 65 6e 20 63 6f 6e 73 74 72 75 63 74 69 6e  when constructin
124c0 67 20 74 68 65 20 70 4b 65 79 49 6e 66 6f 20 66  g the pKeyInfo f
124d0 6f 72 20 74 68 65 20 4f 52 44 45 52 20 42 59 2c  or the ORDER BY,
124e0 20 73 6f 20 6d 61 6b 65 0a 20 20 20 20 20 20 2a   so make.      *
124f0 2a 20 61 20 63 6f 70 79 2e 20 20 53 75 66 66 69  * a copy.  Suffi
12500 63 69 65 6e 74 20 73 70 61 63 65 20 74 6f 20 68  cient space to h
12510 6f 6c 64 20 62 6f 74 68 20 74 68 65 20 6e 43 6f  old both the nCo
12520 6c 20 65 6e 74 72 69 65 73 20 66 6f 72 0a 20 20  l entries for.  
12530 20 20 20 20 2a 2a 20 74 68 65 20 63 6f 6d 70 6f      ** the compo
12540 75 6e 64 20 73 65 6c 65 63 74 20 61 6e 64 20 74  und select and t
12550 68 65 20 6e 4f 72 64 65 72 62 79 45 78 70 72 20  he nOrderbyExpr 
12560 65 6e 74 72 69 65 73 20 66 6f 72 20 74 68 65 20  entries for the 
12570 4f 52 44 45 52 20 42 59 0a 20 20 20 20 20 20 2a  ORDER BY.      *
12580 2a 20 77 61 73 20 61 6c 6c 6f 63 61 74 65 64 20  * was allocated 
12590 61 62 6f 76 65 2e 20 20 42 75 74 20 77 65 20 6e  above.  But we n
125a0 65 65 64 20 74 6f 20 6d 6f 76 65 20 74 68 65 20  eed to move the 
125b0 63 6f 6d 70 6f 75 6e 64 20 73 65 6c 65 63 74 0a  compound select.
125c0 20 20 20 20 20 20 2a 2a 20 65 6e 74 72 69 65 73        ** entries
125d0 20 6f 75 74 20 6f 66 20 74 68 65 20 77 61 79 20   out of the way 
125e0 62 65 66 6f 72 65 20 63 6f 6e 73 74 72 75 63 74  before construct
125f0 69 6e 67 20 74 68 65 20 4f 52 44 45 52 20 42 59  ing the ORDER BY
12600 20 65 6e 74 72 69 65 73 2e 0a 20 20 20 20 20 20   entries..      
12610 2a 2a 20 4d 6f 76 65 20 74 68 65 20 63 6f 6d 70  ** Move the comp
12620 6f 75 6e 64 20 73 65 6c 65 63 74 20 65 6e 74 72  ound select entr
12630 69 65 73 20 69 6e 74 6f 20 61 43 6f 70 79 5b 5d  ies into aCopy[]
12640 20 77 68 65 72 65 20 74 68 65 79 20 63 61 6e 20   where they can 
12650 62 65 0a 20 20 20 20 20 20 2a 2a 20 61 63 63 65  be.      ** acce
12660 73 73 65 64 20 61 6e 64 20 72 65 75 73 65 64 20  ssed and reused 
12670 77 68 65 6e 20 63 6f 6e 73 74 72 75 63 74 69 6e  when constructin
12680 67 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 65  g the ORDER BY e
12690 6e 74 72 69 65 73 2e 0a 20 20 20 20 20 20 2a 2a  ntries..      **
126a0 20 42 65 63 61 75 73 65 20 6e 43 6f 6c 20 6d 69   Because nCol mi
126b0 67 68 74 20 62 65 20 67 72 65 61 74 65 72 20 74  ght be greater t
126c0 68 61 6e 20 6f 72 20 6c 65 73 73 20 74 68 61 6e  han or less than
126d0 20 6e 4f 72 64 65 72 42 79 45 78 70 72 0a 20 20   nOrderByExpr.  
126e0 20 20 20 20 2a 2a 20 77 65 20 68 61 76 65 20 74      ** we have t
126f0 6f 20 75 73 65 20 6d 65 6d 6d 6f 76 65 28 29 20  o use memmove() 
12700 77 68 65 6e 20 64 6f 69 6e 67 20 74 68 65 20 63  when doing the c
12710 6f 70 79 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  opy..      */.  
12720 20 20 20 20 61 43 6f 70 79 20 3d 20 26 70 4b 65      aCopy = &pKe
12730 79 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b 6e 4f 72  yInfo->aColl[nOr
12740 64 65 72 42 79 45 78 70 72 5d 3b 0a 20 20 20 20  derByExpr];.    
12750 20 20 70 53 6f 72 74 4f 72 64 65 72 20 3d 20 70    pSortOrder = p
12760 4b 65 79 49 6e 66 6f 2d 3e 61 53 6f 72 74 4f 72  KeyInfo->aSortOr
12770 64 65 72 20 3d 20 28 75 38 2a 29 26 61 43 6f 70  der = (u8*)&aCop
12780 79 5b 6e 43 6f 6c 5d 3b 0a 20 20 20 20 20 20 6d  y[nCol];.      m
12790 65 6d 6d 6f 76 65 28 61 43 6f 70 79 2c 20 70 4b  emmove(aCopy, pK
127a0 65 79 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 2c 20 6e  eyInfo->aColl, n
127b0 43 6f 6c 2a 73 69 7a 65 6f 66 28 43 6f 6c 6c 53  Col*sizeof(CollS
127c0 65 71 2a 29 29 3b 0a 0a 20 20 20 20 20 20 61 70  eq*));..      ap
127d0 43 6f 6c 6c 20 3d 20 70 4b 65 79 49 6e 66 6f 2d  Coll = pKeyInfo-
127e0 3e 61 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 66 6f  >aColl;.      fo
127f0 72 28 69 3d 30 3b 20 69 3c 6e 4f 72 64 65 72 42  r(i=0; i<nOrderB
12800 79 45 78 70 72 3b 20 69 2b 2b 2c 20 70 4f 54 65  yExpr; i++, pOTe
12810 72 6d 2b 2b 2c 20 61 70 43 6f 6c 6c 2b 2b 2c 20  rm++, apColl++, 
12820 70 53 6f 72 74 4f 72 64 65 72 2b 2b 29 7b 0a 20  pSortOrder++){. 
12830 20 20 20 20 20 20 20 45 78 70 72 20 2a 70 45 78         Expr *pEx
12840 70 72 20 3d 20 70 4f 54 65 72 6d 2d 3e 70 45 78  pr = pOTerm->pEx
12850 70 72 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  pr;.        if( 
12860 28 70 45 78 70 72 2d 3e 66 6c 61 67 73 20 26 20  (pExpr->flags & 
12870 45 50 5f 45 78 70 43 6f 6c 6c 61 74 65 29 20 29  EP_ExpCollate) )
12880 7b 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65  {.          asse
12890 72 74 28 20 70 45 78 70 72 2d 3e 70 43 6f 6c 6c  rt( pExpr->pColl
128a0 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 20  !=0 );.         
128b0 20 2a 61 70 43 6f 6c 6c 20 3d 20 70 45 78 70 72   *apColl = pExpr
128c0 2d 3e 70 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 20  ->pColl;.       
128d0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
128e0 20 20 2a 61 70 43 6f 6c 6c 20 3d 20 61 43 6f 70    *apColl = aCop
128f0 79 5b 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e  y[pExpr->iColumn
12900 5d 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  ];.        }.   
12910 20 20 20 20 20 2a 70 53 6f 72 74 4f 72 64 65 72       *pSortOrder
12920 20 3d 20 70 4f 54 65 72 6d 2d 3e 73 6f 72 74 4f   = pOTerm->sortO
12930 72 64 65 72 3b 0a 20 20 20 20 20 20 7d 0a 20 20  rder;.      }.  
12940 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70      assert( p->p
12950 52 69 67 68 74 6d 6f 73 74 3d 3d 70 20 29 3b 0a  Rightmost==p );.
12960 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d        assert( p-
12970 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b 32 5d  >addrOpenEphm[2]
12980 3e 3d 30 20 29 3b 0a 20 20 20 20 20 20 61 64 64  >=0 );.      add
12990 72 20 3d 20 70 2d 3e 61 64 64 72 4f 70 65 6e 45  r = p->addrOpenE
129a0 70 68 6d 5b 32 5d 3b 0a 20 20 20 20 20 20 73 71  phm[2];.      sq
129b0 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50  lite3VdbeChangeP
129c0 32 28 76 2c 20 61 64 64 72 2c 20 70 2d 3e 70 4f  2(v, addr, p->pO
129d0 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 2b 32 29  rderBy->nExpr+2)
129e0 3b 0a 20 20 20 20 20 20 70 4b 65 79 49 6e 66 6f  ;.      pKeyInfo
129f0 2d 3e 6e 46 69 65 6c 64 20 3d 20 6e 4f 72 64 65  ->nField = nOrde
12a00 72 42 79 45 78 70 72 3b 0a 20 20 20 20 20 20 73  rByExpr;.      s
12a10 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65  qlite3VdbeChange
12a20 50 34 28 76 2c 20 61 64 64 72 2c 20 28 63 68 61  P4(v, addr, (cha
12a30 72 2a 29 70 4b 65 79 49 6e 66 6f 2c 20 50 34 5f  r*)pKeyInfo, P4_
12a40 4b 45 59 49 4e 46 4f 5f 48 41 4e 44 4f 46 46 29  KEYINFO_HANDOFF)
12a50 3b 0a 20 20 20 20 20 20 70 4b 65 79 49 6e 66 6f  ;.      pKeyInfo
12a60 20 3d 20 30 3b 0a 20 20 20 20 20 20 67 65 6e 65   = 0;.      gene
12a70 72 61 74 65 53 6f 72 74 54 61 69 6c 28 70 50 61  rateSortTail(pPa
12a80 72 73 65 2c 20 70 2c 20 76 2c 20 70 2d 3e 70 45  rse, p, v, p->pE
12a90 4c 69 73 74 2d 3e 6e 45 78 70 72 2c 20 26 64 65  List->nExpr, &de
12aa0 73 74 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  st);.    }..    
12ab0 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 4b 65  sqlite3_free(pKe
12ac0 79 49 6e 66 6f 29 3b 0a 20 20 7d 0a 0a 6d 75 6c  yInfo);.  }..mul
12ad0 74 69 5f 73 65 6c 65 63 74 5f 65 6e 64 3a 0a 20  ti_select_end:. 
12ae0 20 70 44 65 73 74 2d 3e 69 4d 65 6d 20 3d 20 64   pDest->iMem = d
12af0 65 73 74 2e 69 4d 65 6d 3b 0a 20 20 70 44 65 73  est.iMem;.  pDes
12b00 74 2d 3e 6e 4d 65 6d 20 3d 20 64 65 73 74 2e 6e  t->nMem = dest.n
12b10 4d 65 6d 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  Mem;.  return rc
12b20 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51  ;.}.#endif /* SQ
12b30 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f 4d 50 4f 55  LITE_OMIT_COMPOU
12b40 4e 44 5f 53 45 4c 45 43 54 20 2a 2f 0a 0a 23 69  ND_SELECT */..#i
12b50 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
12b60 54 5f 56 49 45 57 0a 2f 2a 20 46 6f 72 77 61 72  T_VIEW./* Forwar
12b70 64 20 44 65 63 6c 61 72 61 74 69 6f 6e 73 20 2a  d Declarations *
12b80 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 75  /.static void su
12b90 62 73 74 45 78 70 72 4c 69 73 74 28 73 71 6c 69  bstExprList(sqli
12ba0 74 65 33 2a 2c 20 45 78 70 72 4c 69 73 74 2a 2c  te3*, ExprList*,
12bb0 20 69 6e 74 2c 20 45 78 70 72 4c 69 73 74 2a 29   int, ExprList*)
12bc0 3b 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 75  ;.static void su
12bd0 62 73 74 53 65 6c 65 63 74 28 73 71 6c 69 74 65  bstSelect(sqlite
12be0 33 2a 2c 20 53 65 6c 65 63 74 20 2a 2c 20 69 6e  3*, Select *, in
12bf0 74 2c 20 45 78 70 72 4c 69 73 74 20 2a 29 3b 0a  t, ExprList *);.
12c00 0a 2f 2a 0a 2a 2a 20 53 63 61 6e 20 74 68 72 6f  ./*.** Scan thro
12c10 75 67 68 20 74 68 65 20 65 78 70 72 65 73 73 69  ugh the expressi
12c20 6f 6e 20 70 45 78 70 72 2e 20 20 52 65 70 6c 61  on pExpr.  Repla
12c30 63 65 20 65 76 65 72 79 20 72 65 66 65 72 65 6e  ce every referen
12c40 63 65 20 74 6f 0a 2a 2a 20 61 20 63 6f 6c 75 6d  ce to.** a colum
12c50 6e 20 69 6e 20 74 61 62 6c 65 20 6e 75 6d 62 65  n in table numbe
12c60 72 20 69 54 61 62 6c 65 20 77 69 74 68 20 61 20  r iTable with a 
12c70 63 6f 70 79 20 6f 66 20 74 68 65 20 69 43 6f 6c  copy of the iCol
12c80 75 6d 6e 2d 74 68 0a 2a 2a 20 65 6e 74 72 79 20  umn-th.** entry 
12c90 69 6e 20 70 45 4c 69 73 74 2e 20 20 28 42 75 74  in pEList.  (But
12ca0 20 6c 65 61 76 65 20 72 65 66 65 72 65 6e 63 65   leave reference
12cb0 73 20 74 6f 20 74 68 65 20 52 4f 57 49 44 20 63  s to the ROWID c
12cc0 6f 6c 75 6d 6e 20 0a 2a 2a 20 75 6e 63 68 61 6e  olumn .** unchan
12cd0 67 65 64 2e 29 0a 2a 2a 0a 2a 2a 20 54 68 69 73  ged.).**.** This
12ce0 20 72 6f 75 74 69 6e 65 20 69 73 20 70 61 72 74   routine is part
12cf0 20 6f 66 20 74 68 65 20 66 6c 61 74 74 65 6e 69   of the flatteni
12d00 6e 67 20 70 72 6f 63 65 64 75 72 65 2e 20 20 41  ng procedure.  A
12d10 20 73 75 62 71 75 65 72 79 0a 2a 2a 20 77 68 6f   subquery.** who
12d20 73 65 20 72 65 73 75 6c 74 20 73 65 74 20 69 73  se result set is
12d30 20 64 65 66 69 6e 65 64 20 62 79 20 70 45 4c 69   defined by pELi
12d40 73 74 20 61 70 70 65 61 72 73 20 61 73 20 65 6e  st appears as en
12d50 74 72 79 20 69 6e 20 74 68 65 0a 2a 2a 20 46 52  try in the.** FR
12d60 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20 61 20 53  OM clause of a S
12d70 45 4c 45 43 54 20 73 75 63 68 20 74 68 61 74 20  ELECT such that 
12d80 74 68 65 20 56 44 42 45 20 63 75 72 73 6f 72 20  the VDBE cursor 
12d90 61 73 73 69 67 6e 65 64 20 74 6f 20 74 68 61 74  assigned to that
12da0 0a 2a 2a 20 46 4f 52 4d 20 63 6c 61 75 73 65 20  .** FORM clause 
12db0 65 6e 74 72 79 20 69 73 20 69 54 61 62 6c 65 2e  entry is iTable.
12dc0 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6d    This routine m
12dd0 61 6b 65 20 74 68 65 20 6e 65 63 65 73 73 61 72  ake the necessar
12de0 79 20 0a 2a 2a 20 63 68 61 6e 67 65 73 20 74 6f  y .** changes to
12df0 20 70 45 78 70 72 20 73 6f 20 74 68 61 74 20 69   pExpr so that i
12e00 74 20 72 65 66 65 72 73 20 64 69 72 65 63 74 6c  t refers directl
12e10 79 20 74 6f 20 74 68 65 20 73 6f 75 72 63 65 20  y to the source 
12e20 74 61 62 6c 65 0a 2a 2a 20 6f 66 20 74 68 65 20  table.** of the 
12e30 73 75 62 71 75 65 72 79 20 72 61 74 68 65 72 20  subquery rather 
12e40 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 20 6f  the result set o
12e50 66 20 74 68 65 20 73 75 62 71 75 65 72 79 2e 0a  f the subquery..
12e60 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73  */.static void s
12e70 75 62 73 74 45 78 70 72 28 0a 20 20 73 71 6c 69  ubstExpr(.  sqli
12e80 74 65 33 20 2a 64 62 2c 20 20 20 20 20 20 20 20  te3 *db,        
12e90 2f 2a 20 52 65 70 6f 72 74 20 6d 61 6c 6c 6f 63  /* Report malloc
12ea0 20 65 72 72 6f 72 73 20 74 6f 20 74 68 69 73 20   errors to this 
12eb0 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20  connection */.  
12ec0 45 78 70 72 20 2a 70 45 78 70 72 2c 20 20 20 20  Expr *pExpr,    
12ed0 20 20 20 20 2f 2a 20 45 78 70 72 20 69 6e 20 77      /* Expr in w
12ee0 68 69 63 68 20 73 75 62 73 74 69 74 75 74 69 6f  hich substitutio
12ef0 6e 20 6f 63 63 75 72 73 20 2a 2f 0a 20 20 69 6e  n occurs */.  in
12f00 74 20 69 54 61 62 6c 65 2c 20 20 20 20 20 20 20  t iTable,       
12f10 20 20 2f 2a 20 54 61 62 6c 65 20 74 6f 20 62 65    /* Table to be
12f20 20 73 75 62 73 74 69 74 75 74 65 64 20 2a 2f 0a   substituted */.
12f30 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69    ExprList *pELi
12f40 73 74 20 20 20 20 2f 2a 20 53 75 62 73 74 69 74  st    /* Substit
12f50 75 74 65 20 65 78 70 72 65 73 73 69 6f 6e 73 20  ute expressions 
12f60 2a 2f 0a 29 7b 0a 20 20 69 66 28 20 70 45 78 70  */.){.  if( pExp
12f70 72 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20  r==0 ) return;. 
12f80 20 69 66 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d   if( pExpr->op==
12f90 54 4b 5f 43 4f 4c 55 4d 4e 20 26 26 20 70 45 78  TK_COLUMN && pEx
12fa0 70 72 2d 3e 69 54 61 62 6c 65 3d 3d 69 54 61 62  pr->iTable==iTab
12fb0 6c 65 20 29 7b 0a 20 20 20 20 69 66 28 20 70 45  le ){.    if( pE
12fc0 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3c 30 20 29  xpr->iColumn<0 )
12fd0 7b 0a 20 20 20 20 20 20 70 45 78 70 72 2d 3e 6f  {.      pExpr->o
12fe0 70 20 3d 20 54 4b 5f 4e 55 4c 4c 3b 0a 20 20 20  p = TK_NULL;.   
12ff0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 45 78   }else{.      Ex
13000 70 72 20 2a 70 4e 65 77 3b 0a 20 20 20 20 20 20  pr *pNew;.      
13010 61 73 73 65 72 74 28 20 70 45 4c 69 73 74 21 3d  assert( pEList!=
13020 30 20 26 26 20 70 45 78 70 72 2d 3e 69 43 6f 6c  0 && pExpr->iCol
13030 75 6d 6e 3c 70 45 4c 69 73 74 2d 3e 6e 45 78 70  umn<pEList->nExp
13040 72 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  r );.      asser
13050 74 28 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 3d  t( pExpr->pLeft=
13060 3d 30 20 26 26 20 70 45 78 70 72 2d 3e 70 52 69  =0 && pExpr->pRi
13070 67 68 74 3d 3d 30 20 26 26 20 70 45 78 70 72 2d  ght==0 && pExpr-
13080 3e 70 4c 69 73 74 3d 3d 30 20 29 3b 0a 20 20 20  >pList==0 );.   
13090 20 20 20 70 4e 65 77 20 3d 20 70 45 4c 69 73 74     pNew = pEList
130a0 2d 3e 61 5b 70 45 78 70 72 2d 3e 69 43 6f 6c 75  ->a[pExpr->iColu
130b0 6d 6e 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 20  mn].pExpr;.     
130c0 20 61 73 73 65 72 74 28 20 70 4e 65 77 21 3d 30   assert( pNew!=0
130d0 20 29 3b 0a 20 20 20 20 20 20 70 45 78 70 72 2d   );.      pExpr-
130e0 3e 6f 70 20 3d 20 70 4e 65 77 2d 3e 6f 70 3b 0a  >op = pNew->op;.
130f0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 45        assert( pE
13100 78 70 72 2d 3e 70 4c 65 66 74 3d 3d 30 20 29 3b  xpr->pLeft==0 );
13110 0a 20 20 20 20 20 20 70 45 78 70 72 2d 3e 70 4c  .      pExpr->pL
13120 65 66 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70  eft = sqlite3Exp
13130 72 44 75 70 28 64 62 2c 20 70 4e 65 77 2d 3e 70  rDup(db, pNew->p
13140 4c 65 66 74 29 3b 0a 20 20 20 20 20 20 61 73 73  Left);.      ass
13150 65 72 74 28 20 70 45 78 70 72 2d 3e 70 52 69 67  ert( pExpr->pRig
13160 68 74 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 70  ht==0 );.      p
13170 45 78 70 72 2d 3e 70 52 69 67 68 74 20 3d 20 73  Expr->pRight = s
13180 71 6c 69 74 65 33 45 78 70 72 44 75 70 28 64 62  qlite3ExprDup(db
13190 2c 20 70 4e 65 77 2d 3e 70 52 69 67 68 74 29 3b  , pNew->pRight);
131a0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
131b0 45 78 70 72 2d 3e 70 4c 69 73 74 3d 3d 30 20 29  Expr->pList==0 )
131c0 3b 0a 20 20 20 20 20 20 70 45 78 70 72 2d 3e 70  ;.      pExpr->p
131d0 4c 69 73 74 20 3d 20 73 71 6c 69 74 65 33 45 78  List = sqlite3Ex
131e0 70 72 4c 69 73 74 44 75 70 28 64 62 2c 20 70 4e  prListDup(db, pN
131f0 65 77 2d 3e 70 4c 69 73 74 29 3b 0a 20 20 20 20  ew->pList);.    
13200 20 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 20    pExpr->iTable 
13210 3d 20 70 4e 65 77 2d 3e 69 54 61 62 6c 65 3b 0a  = pNew->iTable;.
13220 20 20 20 20 20 20 70 45 78 70 72 2d 3e 70 54 61        pExpr->pTa
13230 62 20 3d 20 70 4e 65 77 2d 3e 70 54 61 62 3b 0a  b = pNew->pTab;.
13240 20 20 20 20 20 20 70 45 78 70 72 2d 3e 69 43 6f        pExpr->iCo
13250 6c 75 6d 6e 20 3d 20 70 4e 65 77 2d 3e 69 43 6f  lumn = pNew->iCo
13260 6c 75 6d 6e 3b 0a 20 20 20 20 20 20 70 45 78 70  lumn;.      pExp
13270 72 2d 3e 69 41 67 67 20 3d 20 70 4e 65 77 2d 3e  r->iAgg = pNew->
13280 69 41 67 67 3b 0a 20 20 20 20 20 20 73 71 6c 69  iAgg;.      sqli
13290 74 65 33 54 6f 6b 65 6e 43 6f 70 79 28 64 62 2c  te3TokenCopy(db,
132a0 20 26 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2c 20   &pExpr->token, 
132b0 26 70 4e 65 77 2d 3e 74 6f 6b 65 6e 29 3b 0a 20  &pNew->token);. 
132c0 20 20 20 20 20 73 71 6c 69 74 65 33 54 6f 6b 65       sqlite3Toke
132d0 6e 43 6f 70 79 28 64 62 2c 20 26 70 45 78 70 72  nCopy(db, &pExpr
132e0 2d 3e 73 70 61 6e 2c 20 26 70 4e 65 77 2d 3e 73  ->span, &pNew->s
132f0 70 61 6e 29 3b 0a 20 20 20 20 20 20 70 45 78 70  pan);.      pExp
13300 72 2d 3e 70 53 65 6c 65 63 74 20 3d 20 73 71 6c  r->pSelect = sql
13310 69 74 65 33 53 65 6c 65 63 74 44 75 70 28 64 62  ite3SelectDup(db
13320 2c 20 70 4e 65 77 2d 3e 70 53 65 6c 65 63 74 29  , pNew->pSelect)
13330 3b 0a 20 20 20 20 20 20 70 45 78 70 72 2d 3e 66  ;.      pExpr->f
13340 6c 61 67 73 20 3d 20 70 4e 65 77 2d 3e 66 6c 61  lags = pNew->fla
13350 67 73 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73  gs;.    }.  }els
13360 65 7b 0a 20 20 20 20 73 75 62 73 74 45 78 70 72  e{.    substExpr
13370 28 64 62 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66  (db, pExpr->pLef
13380 74 2c 20 69 54 61 62 6c 65 2c 20 70 45 4c 69 73  t, iTable, pELis
13390 74 29 3b 0a 20 20 20 20 73 75 62 73 74 45 78 70  t);.    substExp
133a0 72 28 64 62 2c 20 70 45 78 70 72 2d 3e 70 52 69  r(db, pExpr->pRi
133b0 67 68 74 2c 20 69 54 61 62 6c 65 2c 20 70 45 4c  ght, iTable, pEL
133c0 69 73 74 29 3b 0a 20 20 20 20 73 75 62 73 74 53  ist);.    substS
133d0 65 6c 65 63 74 28 64 62 2c 20 70 45 78 70 72 2d  elect(db, pExpr-
133e0 3e 70 53 65 6c 65 63 74 2c 20 69 54 61 62 6c 65  >pSelect, iTable
133f0 2c 20 70 45 4c 69 73 74 29 3b 0a 20 20 20 20 73  , pEList);.    s
13400 75 62 73 74 45 78 70 72 4c 69 73 74 28 64 62 2c  ubstExprList(db,
13410 20 70 45 78 70 72 2d 3e 70 4c 69 73 74 2c 20 69   pExpr->pList, i
13420 54 61 62 6c 65 2c 20 70 45 4c 69 73 74 29 3b 0a  Table, pEList);.
13430 20 20 7d 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69    }.}.static voi
13440 64 20 73 75 62 73 74 45 78 70 72 4c 69 73 74 28  d substExprList(
13450 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  .  sqlite3 *db, 
13460 20 20 20 20 20 20 20 20 2f 2a 20 52 65 70 6f 72          /* Repor
13470 74 20 6d 61 6c 6c 6f 63 20 65 72 72 6f 72 73 20  t malloc errors 
13480 68 65 72 65 20 2a 2f 0a 20 20 45 78 70 72 4c 69  here */.  ExprLi
13490 73 74 20 2a 70 4c 69 73 74 2c 20 20 20 20 20 2f  st *pList,     /
134a0 2a 20 4c 69 73 74 20 74 6f 20 73 63 61 6e 20 61  * List to scan a
134b0 6e 64 20 69 6e 20 77 68 69 63 68 20 74 6f 20 6d  nd in which to m
134c0 61 6b 65 20 73 75 62 73 74 69 74 75 74 65 73 20  ake substitutes 
134d0 2a 2f 0a 20 20 69 6e 74 20 69 54 61 62 6c 65 2c  */.  int iTable,
134e0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 61 62            /* Tab
134f0 6c 65 20 74 6f 20 62 65 20 73 75 62 73 74 69 74  le to be substit
13500 75 74 65 64 20 2a 2f 0a 20 20 45 78 70 72 4c 69  uted */.  ExprLi
13510 73 74 20 2a 70 45 4c 69 73 74 20 20 20 20 20 2f  st *pEList     /
13520 2a 20 53 75 62 73 74 69 74 75 74 65 20 76 61 6c  * Substitute val
13530 75 65 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  ues */.){.  int 
13540 69 3b 0a 20 20 69 66 28 20 70 4c 69 73 74 3d 3d  i;.  if( pList==
13550 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 66 6f  0 ) return;.  fo
13560 72 28 69 3d 30 3b 20 69 3c 70 4c 69 73 74 2d 3e  r(i=0; i<pList->
13570 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20  nExpr; i++){.   
13580 20 73 75 62 73 74 45 78 70 72 28 64 62 2c 20 70   substExpr(db, p
13590 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72  List->a[i].pExpr
135a0 2c 20 69 54 61 62 6c 65 2c 20 70 45 4c 69 73 74  , iTable, pEList
135b0 29 3b 0a 20 20 7d 0a 7d 0a 73 74 61 74 69 63 20  );.  }.}.static 
135c0 76 6f 69 64 20 73 75 62 73 74 53 65 6c 65 63 74  void substSelect
135d0 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c  (.  sqlite3 *db,
135e0 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 70 6f           /* Repo
135f0 72 74 20 6d 61 6c 6c 6f 63 20 65 72 72 6f 72 73  rt malloc errors
13600 20 68 65 72 65 20 2a 2f 0a 20 20 53 65 6c 65 63   here */.  Selec
13610 74 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20  t *p,           
13620 2f 2a 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d  /* SELECT statem
13630 65 6e 74 20 69 6e 20 77 68 69 63 68 20 74 6f 20  ent in which to 
13640 6d 61 6b 65 20 73 75 62 73 74 69 74 75 74 69 6f  make substitutio
13650 6e 73 20 2a 2f 0a 20 20 69 6e 74 20 69 54 61 62  ns */.  int iTab
13660 6c 65 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20  le,          /* 
13670 54 61 62 6c 65 20 74 6f 20 62 65 20 72 65 70 6c  Table to be repl
13680 61 63 65 64 20 2a 2f 0a 20 20 45 78 70 72 4c 69  aced */.  ExprLi
13690 73 74 20 2a 70 45 4c 69 73 74 20 20 20 20 20 2f  st *pEList     /
136a0 2a 20 53 75 62 73 74 69 74 75 74 65 20 76 61 6c  * Substitute val
136b0 75 65 73 20 2a 2f 0a 29 7b 0a 20 20 69 66 28 20  ues */.){.  if( 
136c0 21 70 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 73  !p ) return;.  s
136d0 75 62 73 74 45 78 70 72 4c 69 73 74 28 64 62 2c  ubstExprList(db,
136e0 20 70 2d 3e 70 45 4c 69 73 74 2c 20 69 54 61 62   p->pEList, iTab
136f0 6c 65 2c 20 70 45 4c 69 73 74 29 3b 0a 20 20 73  le, pEList);.  s
13700 75 62 73 74 45 78 70 72 4c 69 73 74 28 64 62 2c  ubstExprList(db,
13710 20 70 2d 3e 70 47 72 6f 75 70 42 79 2c 20 69 54   p->pGroupBy, iT
13720 61 62 6c 65 2c 20 70 45 4c 69 73 74 29 3b 0a 20  able, pEList);. 
13730 20 73 75 62 73 74 45 78 70 72 4c 69 73 74 28 64   substExprList(d
13740 62 2c 20 70 2d 3e 70 4f 72 64 65 72 42 79 2c 20  b, p->pOrderBy, 
13750 69 54 61 62 6c 65 2c 20 70 45 4c 69 73 74 29 3b  iTable, pEList);
13760 0a 20 20 73 75 62 73 74 45 78 70 72 28 64 62 2c  .  substExpr(db,
13770 20 70 2d 3e 70 48 61 76 69 6e 67 2c 20 69 54 61   p->pHaving, iTa
13780 62 6c 65 2c 20 70 45 4c 69 73 74 29 3b 0a 20 20  ble, pEList);.  
13790 73 75 62 73 74 45 78 70 72 28 64 62 2c 20 70 2d  substExpr(db, p-
137a0 3e 70 57 68 65 72 65 2c 20 69 54 61 62 6c 65 2c  >pWhere, iTable,
137b0 20 70 45 4c 69 73 74 29 3b 0a 20 20 73 75 62 73   pEList);.  subs
137c0 74 53 65 6c 65 63 74 28 64 62 2c 20 70 2d 3e 70  tSelect(db, p->p
137d0 50 72 69 6f 72 2c 20 69 54 61 62 6c 65 2c 20 70  Prior, iTable, p
137e0 45 4c 69 73 74 29 3b 0a 7d 0a 23 65 6e 64 69 66  EList);.}.#endif
137f0 20 2f 2a 20 21 64 65 66 69 6e 65 64 28 53 51 4c   /* !defined(SQL
13800 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 29 20 2a  ITE_OMIT_VIEW) *
13810 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  /..#ifndef SQLIT
13820 45 5f 4f 4d 49 54 5f 56 49 45 57 0a 2f 2a 0a 2a  E_OMIT_VIEW./*.*
13830 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 61  * This routine a
13840 74 74 65 6d 70 74 73 20 74 6f 20 66 6c 61 74 74  ttempts to flatt
13850 65 6e 20 73 75 62 71 75 65 72 69 65 73 20 69 6e  en subqueries in
13860 20 6f 72 64 65 72 20 74 6f 20 73 70 65 65 64 0a   order to speed.
13870 2a 2a 20 65 78 65 63 75 74 69 6f 6e 2e 20 20 49  ** execution.  I
13880 74 20 72 65 74 75 72 6e 73 20 31 20 69 66 20 69  t returns 1 if i
13890 74 20 6d 61 6b 65 73 20 63 68 61 6e 67 65 73 20  t makes changes 
138a0 61 6e 64 20 30 20 69 66 20 6e 6f 20 66 6c 61 74  and 0 if no flat
138b0 74 65 6e 69 6e 67 0a 2a 2a 20 6f 63 63 75 72 73  tening.** occurs
138c0 2e 0a 2a 2a 0a 2a 2a 20 54 6f 20 75 6e 64 65 72  ..**.** To under
138d0 73 74 61 6e 64 20 74 68 65 20 63 6f 6e 63 65 70  stand the concep
138e0 74 20 6f 66 20 66 6c 61 74 74 65 6e 69 6e 67 2c  t of flattening,
138f0 20 63 6f 6e 73 69 64 65 72 20 74 68 65 20 66 6f   consider the fo
13900 6c 6c 6f 77 69 6e 67 0a 2a 2a 20 71 75 65 72 79  llowing.** query
13910 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 45 4c 45  :.**.**     SELE
13920 43 54 20 61 20 46 52 4f 4d 20 28 53 45 4c 45 43  CT a FROM (SELEC
13930 54 20 78 2b 79 20 41 53 20 61 20 46 52 4f 4d 20  T x+y AS a FROM 
13940 74 31 20 57 48 45 52 45 20 7a 3c 31 30 30 29 20  t1 WHERE z<100) 
13950 57 48 45 52 45 20 61 3e 35 0a 2a 2a 0a 2a 2a 20  WHERE a>5.**.** 
13960 54 68 65 20 64 65 66 61 75 6c 74 20 77 61 79 20  The default way 
13970 6f 66 20 69 6d 70 6c 65 6d 65 6e 74 69 6e 67 20  of implementing 
13980 74 68 69 73 20 71 75 65 72 79 20 69 73 20 74 6f  this query is to
13990 20 65 78 65 63 75 74 65 20 74 68 65 0a 2a 2a 20   execute the.** 
139a0 73 75 62 71 75 65 72 79 20 66 69 72 73 74 20 61  subquery first a
139b0 6e 64 20 73 74 6f 72 65 20 74 68 65 20 72 65 73  nd store the res
139c0 75 6c 74 73 20 69 6e 20 61 20 74 65 6d 70 6f 72  ults in a tempor
139d0 61 72 79 20 74 61 62 6c 65 2c 20 74 68 65 6e 0a  ary table, then.
139e0 2a 2a 20 72 75 6e 20 74 68 65 20 6f 75 74 65 72  ** run the outer
139f0 20 71 75 65 72 79 20 6f 6e 20 74 68 61 74 20 74   query on that t
13a00 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 2e 20  emporary table. 
13a10 20 54 68 69 73 20 72 65 71 75 69 72 65 73 20 74   This requires t
13a20 77 6f 0a 2a 2a 20 70 61 73 73 65 73 20 6f 76 65  wo.** passes ove
13a30 72 20 74 68 65 20 64 61 74 61 2e 20 20 46 75 72  r the data.  Fur
13a40 74 68 65 72 6d 6f 72 65 2c 20 62 65 63 61 75 73  thermore, becaus
13a50 65 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79 20  e the temporary 
13a60 74 61 62 6c 65 0a 2a 2a 20 68 61 73 20 6e 6f 20  table.** has no 
13a70 69 6e 64 69 63 65 73 2c 20 74 68 65 20 57 48 45  indices, the WHE
13a80 52 45 20 63 6c 61 75 73 65 20 6f 6e 20 74 68 65  RE clause on the
13a90 20 6f 75 74 65 72 20 71 75 65 72 79 20 63 61 6e   outer query can
13aa0 6e 6f 74 20 62 65 0a 2a 2a 20 6f 70 74 69 6d 69  not be.** optimi
13ab0 7a 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  zed..**.** This 
13ac0 72 6f 75 74 69 6e 65 20 61 74 74 65 6d 70 74 73  routine attempts
13ad0 20 74 6f 20 72 65 77 72 69 74 65 20 71 75 65 72   to rewrite quer
13ae0 69 65 73 20 73 75 63 68 20 61 73 20 74 68 65 20  ies such as the 
13af0 61 62 6f 76 65 20 69 6e 74 6f 0a 2a 2a 20 61 20  above into.** a 
13b00 73 69 6e 67 6c 65 20 66 6c 61 74 20 73 65 6c 65  single flat sele
13b10 63 74 2c 20 6c 69 6b 65 20 74 68 69 73 3a 0a 2a  ct, like this:.*
13b20 2a 0a 2a 2a 20 20 20 20 20 53 45 4c 45 43 54 20  *.**     SELECT 
13b30 78 2b 79 20 41 53 20 61 20 46 52 4f 4d 20 74 31  x+y AS a FROM t1
13b40 20 57 48 45 52 45 20 7a 3c 31 30 30 20 41 4e 44   WHERE z<100 AND
13b50 20 61 3e 35 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63   a>5.**.** The c
13b60 6f 64 65 20 67 65 6e 65 72 61 74 65 64 20 66 6f  ode generated fo
13b70 72 20 74 68 69 73 20 73 69 6d 70 69 66 69 63 61  r this simpifica
13b80 74 69 6f 6e 20 67 69 76 65 73 20 74 68 65 20 73  tion gives the s
13b90 61 6d 65 20 72 65 73 75 6c 74 0a 2a 2a 20 62 75  ame result.** bu
13ba0 74 20 6f 6e 6c 79 20 68 61 73 20 74 6f 20 73 63  t only has to sc
13bb0 61 6e 20 74 68 65 20 64 61 74 61 20 6f 6e 63 65  an the data once
13bc0 2e 20 20 41 6e 64 20 62 65 63 61 75 73 65 20 69  .  And because i
13bd0 6e 64 69 63 65 73 20 6d 69 67 68 74 20 0a 2a 2a  ndices might .**
13be0 20 65 78 69 73 74 20 6f 6e 20 74 68 65 20 74 61   exist on the ta
13bf0 62 6c 65 20 74 31 2c 20 61 20 63 6f 6d 70 6c 65  ble t1, a comple
13c00 74 65 20 73 63 61 6e 20 6f 66 20 74 68 65 20 64  te scan of the d
13c10 61 74 61 20 6d 69 67 68 74 20 62 65 0a 2a 2a 20  ata might be.** 
13c20 61 76 6f 69 64 65 64 2e 0a 2a 2a 0a 2a 2a 20 46  avoided..**.** F
13c30 6c 61 74 74 65 6e 69 6e 67 20 69 73 20 6f 6e 6c  lattening is onl
13c40 79 20 61 74 74 65 6d 70 74 65 64 20 69 66 20 61  y attempted if a
13c50 6c 6c 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77  ll of the follow
13c60 69 6e 67 20 61 72 65 20 74 72 75 65 3a 0a 2a 2a  ing are true:.**
13c70 0a 2a 2a 20 20 20 28 31 29 20 20 54 68 65 20 73  .**   (1)  The s
13c80 75 62 71 75 65 72 79 20 61 6e 64 20 74 68 65 20  ubquery and the 
13c90 6f 75 74 65 72 20 71 75 65 72 79 20 64 6f 20 6e  outer query do n
13ca0 6f 74 20 62 6f 74 68 20 75 73 65 20 61 67 67 72  ot both use aggr
13cb0 65 67 61 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 20 20  egates..**.**   
13cc0 28 32 29 20 20 54 68 65 20 73 75 62 71 75 65 72  (2)  The subquer
13cd0 79 20 69 73 20 6e 6f 74 20 61 6e 20 61 67 67 72  y is not an aggr
13ce0 65 67 61 74 65 20 6f 72 20 74 68 65 20 6f 75 74  egate or the out
13cf0 65 72 20 71 75 65 72 79 20 69 73 20 6e 6f 74 20  er query is not 
13d00 61 20 6a 6f 69 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20  a join..**.**   
13d10 28 33 29 20 20 54 68 65 20 73 75 62 71 75 65 72  (3)  The subquer
13d20 79 20 69 73 20 6e 6f 74 20 74 68 65 20 72 69 67  y is not the rig
13d30 68 74 20 6f 70 65 72 61 6e 64 20 6f 66 20 61 20  ht operand of a 
13d40 6c 65 66 74 20 6f 75 74 65 72 20 6a 6f 69 6e 2c  left outer join,
13d50 20 6f 72 0a 2a 2a 20 20 20 20 20 20 20 20 74 68   or.**        th
13d60 65 20 73 75 62 71 75 65 72 79 20 69 73 20 6e 6f  e subquery is no
13d70 74 20 69 74 73 65 6c 66 20 61 20 6a 6f 69 6e 2e  t itself a join.
13d80 20 20 28 54 69 63 6b 65 74 20 23 33 30 36 29 0a    (Ticket #306).
13d90 2a 2a 0a 2a 2a 20 20 20 28 34 29 20 20 54 68 65  **.**   (4)  The
13da0 20 73 75 62 71 75 65 72 79 20 69 73 20 6e 6f 74   subquery is not
13db0 20 44 49 53 54 49 4e 43 54 20 6f 72 20 74 68 65   DISTINCT or the
13dc0 20 6f 75 74 65 72 20 71 75 65 72 79 20 69 73 20   outer query is 
13dd0 6e 6f 74 20 61 20 6a 6f 69 6e 2e 0a 2a 2a 0a 2a  not a join..**.*
13de0 2a 20 20 20 28 35 29 20 20 54 68 65 20 73 75 62  *   (5)  The sub
13df0 71 75 65 72 79 20 69 73 20 6e 6f 74 20 44 49 53  query is not DIS
13e00 54 49 4e 43 54 20 6f 72 20 74 68 65 20 6f 75 74  TINCT or the out
13e10 65 72 20 71 75 65 72 79 20 64 6f 65 73 20 6e 6f  er query does no
13e20 74 20 75 73 65 0a 2a 2a 20 20 20 20 20 20 20 20  t use.**        
13e30 61 67 67 72 65 67 61 74 65 73 2e 0a 2a 2a 0a 2a  aggregates..**.*
13e40 2a 20 20 20 28 36 29 20 20 54 68 65 20 73 75 62  *   (6)  The sub
13e50 71 75 65 72 79 20 64 6f 65 73 20 6e 6f 74 20 75  query does not u
13e60 73 65 20 61 67 67 72 65 67 61 74 65 73 20 6f 72  se aggregates or
13e70 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79   the outer query
13e80 20 69 73 20 6e 6f 74 0a 2a 2a 20 20 20 20 20 20   is not.**      
13e90 20 20 44 49 53 54 49 4e 43 54 2e 0a 2a 2a 0a 2a    DISTINCT..**.*
13ea0 2a 20 20 20 28 37 29 20 20 54 68 65 20 73 75 62  *   (7)  The sub
13eb0 71 75 65 72 79 20 68 61 73 20 61 20 46 52 4f 4d  query has a FROM
13ec0 20 63 6c 61 75 73 65 2e 0a 2a 2a 0a 2a 2a 20 20   clause..**.**  
13ed0 20 28 38 29 20 20 54 68 65 20 73 75 62 71 75 65   (8)  The subque
13ee0 72 79 20 64 6f 65 73 20 6e 6f 74 20 75 73 65 20  ry does not use 
13ef0 4c 49 4d 49 54 20 6f 72 20 74 68 65 20 6f 75 74  LIMIT or the out
13f00 65 72 20 71 75 65 72 79 20 69 73 20 6e 6f 74 20  er query is not 
13f10 61 20 6a 6f 69 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20  a join..**.**   
13f20 28 39 29 20 20 54 68 65 20 73 75 62 71 75 65 72  (9)  The subquer
13f30 79 20 64 6f 65 73 20 6e 6f 74 20 75 73 65 20 4c  y does not use L
13f40 49 4d 49 54 20 6f 72 20 74 68 65 20 6f 75 74 65  IMIT or the oute
13f50 72 20 71 75 65 72 79 20 64 6f 65 73 20 6e 6f 74  r query does not
13f60 20 75 73 65 0a 2a 2a 20 20 20 20 20 20 20 20 61   use.**        a
13f70 67 67 72 65 67 61 74 65 73 2e 0a 2a 2a 0a 2a 2a  ggregates..**.**
13f80 20 20 28 31 30 29 20 20 54 68 65 20 73 75 62 71    (10)  The subq
13f90 75 65 72 79 20 64 6f 65 73 20 6e 6f 74 20 75 73  uery does not us
13fa0 65 20 61 67 67 72 65 67 61 74 65 73 20 6f 72 20  e aggregates or 
13fb0 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20  the outer query 
13fc0 64 6f 65 73 20 6e 6f 74 0a 2a 2a 20 20 20 20 20  does not.**     
13fd0 20 20 20 75 73 65 20 4c 49 4d 49 54 2e 0a 2a 2a     use LIMIT..**
13fe0 0a 2a 2a 20 20 28 31 31 29 20 20 54 68 65 20 73  .**  (11)  The s
13ff0 75 62 71 75 65 72 79 20 61 6e 64 20 74 68 65 20  ubquery and the 
14000 6f 75 74 65 72 20 71 75 65 72 79 20 64 6f 20 6e  outer query do n
14010 6f 74 20 62 6f 74 68 20 68 61 76 65 20 4f 52 44  ot both have ORD
14020 45 52 20 42 59 20 63 6c 61 75 73 65 73 2e 0a 2a  ER BY clauses..*
14030 2a 0a 2a 2a 20 20 28 31 32 29 20 20 54 68 65 20  *.**  (12)  The 
14040 73 75 62 71 75 65 72 79 20 69 73 20 6e 6f 74 20  subquery is not 
14050 74 68 65 20 72 69 67 68 74 20 74 65 72 6d 20 6f  the right term o
14060 66 20 61 20 4c 45 46 54 20 4f 55 54 45 52 20 4a  f a LEFT OUTER J
14070 4f 49 4e 20 6f 72 20 74 68 65 0a 2a 2a 20 20 20  OIN or the.**   
14080 20 20 20 20 20 73 75 62 71 75 65 72 79 20 68 61       subquery ha
14090 73 20 6e 6f 20 57 48 45 52 45 20 63 6c 61 75 73  s no WHERE claus
140a0 65 2e 20 20 28 61 64 64 65 64 20 62 79 20 74 69  e.  (added by ti
140b0 63 6b 65 74 20 23 33 35 30 29 0a 2a 2a 0a 2a 2a  cket #350).**.**
140c0 20 20 28 31 33 29 20 20 54 68 65 20 73 75 62 71    (13)  The subq
140d0 75 65 72 79 20 61 6e 64 20 6f 75 74 65 72 20 71  uery and outer q
140e0 75 65 72 79 20 64 6f 20 6e 6f 74 20 62 6f 74 68  uery do not both
140f0 20 75 73 65 20 4c 49 4d 49 54 0a 2a 2a 0a 2a 2a   use LIMIT.**.**
14100 20 20 28 31 34 29 20 20 54 68 65 20 73 75 62 71    (14)  The subq
14110 75 65 72 79 20 64 6f 65 73 20 6e 6f 74 20 75 73  uery does not us
14120 65 20 4f 46 46 53 45 54 0a 2a 2a 0a 2a 2a 20 20  e OFFSET.**.**  
14130 28 31 35 29 20 20 54 68 65 20 6f 75 74 65 72 20  (15)  The outer 
14140 71 75 65 72 79 20 69 73 20 6e 6f 74 20 70 61 72  query is not par
14150 74 20 6f 66 20 61 20 63 6f 6d 70 6f 75 6e 64 20  t of a compound 
14160 73 65 6c 65 63 74 20 6f 72 20 74 68 65 0a 2a 2a  select or the.**
14170 20 20 20 20 20 20 20 20 73 75 62 71 75 65 72 79          subquery
14180 20 64 6f 65 73 20 6e 6f 74 20 68 61 76 65 20 62   does not have b
14190 6f 74 68 20 61 6e 20 4f 52 44 45 52 20 42 59 20  oth an ORDER BY 
141a0 61 6e 64 20 61 20 4c 49 4d 49 54 20 63 6c 61 75  and a LIMIT clau
141b0 73 65 2e 0a 2a 2a 20 20 20 20 20 20 20 20 28 53  se..**        (S
141c0 65 65 20 74 69 63 6b 65 74 20 23 32 33 33 39 29  ee ticket #2339)
141d0 0a 2a 2a 0a 2a 2a 20 20 28 31 36 29 20 20 54 68  .**.**  (16)  Th
141e0 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 69 73  e outer query is
141f0 20 6e 6f 74 20 61 6e 20 61 67 67 72 65 67 61 74   not an aggregat
14200 65 20 6f 72 20 74 68 65 20 73 75 62 71 75 65 72  e or the subquer
14210 79 20 64 6f 65 73 0a 2a 2a 20 20 20 20 20 20 20  y does.**       
14220 20 6e 6f 74 20 63 6f 6e 74 61 69 6e 20 4f 52 44   not contain ORD
14230 45 52 20 42 59 2e 20 20 28 54 69 63 6b 65 74 20  ER BY.  (Ticket 
14240 23 32 39 34 32 29 20 20 54 68 69 73 20 75 73 65  #2942)  This use
14250 64 20 74 6f 20 6e 6f 74 20 6d 61 74 74 65 72 0a  d to not matter.
14260 2a 2a 20 20 20 20 20 20 20 20 75 6e 74 69 6c 20  **        until 
14270 77 65 20 69 6e 74 72 6f 64 75 63 65 64 20 74 68  we introduced th
14280 65 20 67 72 6f 75 70 5f 63 6f 6e 63 61 74 28 29  e group_concat()
14290 20 66 75 6e 63 74 69 6f 6e 2e 20 20 0a 2a 2a 0a   function.  .**.
142a0 2a 2a 20 49 6e 20 74 68 69 73 20 72 6f 75 74 69  ** In this routi
142b0 6e 65 2c 20 74 68 65 20 22 70 22 20 70 61 72 61  ne, the "p" para
142c0 6d 65 74 65 72 20 69 73 20 61 20 70 6f 69 6e 74  meter is a point
142d0 65 72 20 74 6f 20 74 68 65 20 6f 75 74 65 72 20  er to the outer 
142e0 71 75 65 72 79 2e 0a 2a 2a 20 54 68 65 20 73 75  query..** The su
142f0 62 71 75 65 72 79 20 69 73 20 70 2d 3e 70 53 72  bquery is p->pSr
14300 63 2d 3e 61 5b 69 46 72 6f 6d 5d 2e 20 20 69 73  c->a[iFrom].  is
14310 41 67 67 20 69 73 20 74 72 75 65 20 69 66 20 74  Agg is true if t
14320 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 0a 2a  he outer query.*
14330 2a 20 75 73 65 73 20 61 67 67 72 65 67 61 74 65  * uses aggregate
14340 73 20 61 6e 64 20 73 75 62 71 75 65 72 79 49 73  s and subqueryIs
14350 41 67 67 20 69 73 20 74 72 75 65 20 69 66 20 74  Agg is true if t
14360 68 65 20 73 75 62 71 75 65 72 79 20 75 73 65 73  he subquery uses
14370 20 61 67 67 72 65 67 61 74 65 73 2e 0a 2a 2a 0a   aggregates..**.
14380 2a 2a 20 49 66 20 66 6c 61 74 74 65 6e 69 6e 67  ** If flattening
14390 20 69 73 20 6e 6f 74 20 61 74 74 65 6d 70 74 65   is not attempte
143a0 64 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  d, this routine 
143b0 69 73 20 61 20 6e 6f 2d 6f 70 20 61 6e 64 20 72  is a no-op and r
143c0 65 74 75 72 6e 73 20 30 2e 0a 2a 2a 20 49 66 20  eturns 0..** If 
143d0 66 6c 61 74 74 65 6e 69 6e 67 20 69 73 20 61 74  flattening is at
143e0 74 65 6d 70 74 65 64 20 74 68 69 73 20 72 6f 75  tempted this rou
143f0 74 69 6e 65 20 72 65 74 75 72 6e 73 20 31 2e 0a  tine returns 1..
14400 2a 2a 0a 2a 2a 20 41 6c 6c 20 6f 66 20 74 68 65  **.** All of the
14410 20 65 78 70 72 65 73 73 69 6f 6e 20 61 6e 61 6c   expression anal
14420 79 73 69 73 20 6d 75 73 74 20 6f 63 63 75 72 20  ysis must occur 
14430 6f 6e 20 62 6f 74 68 20 74 68 65 20 6f 75 74 65  on both the oute
14440 72 20 71 75 65 72 79 20 61 6e 64 0a 2a 2a 20 74  r query and.** t
14450 68 65 20 73 75 62 71 75 65 72 79 20 62 65 66 6f  he subquery befo
14460 72 65 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  re this routine 
14470 72 75 6e 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  runs..*/.static 
14480 69 6e 74 20 66 6c 61 74 74 65 6e 53 75 62 71 75  int flattenSubqu
14490 65 72 79 28 0a 20 20 73 71 6c 69 74 65 33 20 2a  ery(.  sqlite3 *
144a0 64 62 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 44  db,         /* D
144b0 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69  atabase connecti
144c0 6f 6e 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a  on */.  Select *
144d0 70 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  p,           /* 
144e0 54 68 65 20 70 61 72 65 6e 74 20 6f 72 20 6f 75  The parent or ou
144f0 74 65 72 20 53 45 4c 45 43 54 20 73 74 61 74 65  ter SELECT state
14500 6d 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 69 46  ment */.  int iF
14510 72 6f 6d 2c 20 20 20 20 20 20 20 20 20 20 20 2f  rom,           /
14520 2a 20 49 6e 64 65 78 20 69 6e 20 70 2d 3e 70 53  * Index in p->pS
14530 72 63 2d 3e 61 5b 5d 20 6f 66 20 74 68 65 20 69  rc->a[] of the i
14540 6e 6e 65 72 20 73 75 62 71 75 65 72 79 20 2a 2f  nner subquery */
14550 0a 20 20 69 6e 74 20 69 73 41 67 67 2c 20 20 20  .  int isAgg,   
14560 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
14570 69 66 20 6f 75 74 65 72 20 53 45 4c 45 43 54 20  if outer SELECT 
14580 75 73 65 73 20 61 67 67 72 65 67 61 74 65 20 66  uses aggregate f
14590 75 6e 63 74 69 6f 6e 73 20 2a 2f 0a 20 20 69 6e  unctions */.  in
145a0 74 20 73 75 62 71 75 65 72 79 49 73 41 67 67 20  t subqueryIsAgg 
145b0 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 74 68     /* True if th
145c0 65 20 73 75 62 71 75 65 72 79 20 75 73 65 73 20  e subquery uses 
145d0 61 67 67 72 65 67 61 74 65 20 66 75 6e 63 74 69  aggregate functi
145e0 6f 6e 73 20 2a 2f 0a 29 7b 0a 20 20 53 65 6c 65  ons */.){.  Sele
145f0 63 74 20 2a 70 53 75 62 3b 20 20 20 20 20 20 20  ct *pSub;       
14600 2f 2a 20 54 68 65 20 69 6e 6e 65 72 20 71 75 65  /* The inner que
14610 72 79 20 6f 72 20 22 73 75 62 71 75 65 72 79 22  ry or "subquery"
14620 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a 70   */.  SrcList *p
14630 53 72 63 3b 20 20 20 20 20 20 2f 2a 20 54 68 65  Src;      /* The
14640 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20   FROM clause of 
14650 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20  the outer query 
14660 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 53  */.  SrcList *pS
14670 75 62 53 72 63 3b 20 20 20 2f 2a 20 54 68 65 20  ubSrc;   /* The 
14680 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20 74  FROM clause of t
14690 68 65 20 73 75 62 71 75 65 72 79 20 2a 2f 0a 20  he subquery */. 
146a0 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74   ExprList *pList
146b0 3b 20 20 20 20 2f 2a 20 54 68 65 20 72 65 73 75  ;    /* The resu
146c0 6c 74 20 73 65 74 20 6f 66 20 74 68 65 20 6f 75  lt set of the ou
146d0 74 65 72 20 71 75 65 72 79 20 2a 2f 0a 20 20 69  ter query */.  i
146e0 6e 74 20 69 50 61 72 65 6e 74 3b 20 20 20 20 20  nt iParent;     
146f0 20 20 20 2f 2a 20 56 44 42 45 20 63 75 72 73 6f     /* VDBE curso
14700 72 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20  r number of the 
14710 70 53 75 62 20 72 65 73 75 6c 74 20 73 65 74 20  pSub result set 
14720 74 65 6d 70 20 74 61 62 6c 65 20 2a 2f 0a 20 20  temp table */.  
14730 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20 20  int i;          
14740 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e      /* Loop coun
14750 74 65 72 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70  ter */.  Expr *p
14760 57 68 65 72 65 3b 20 20 20 20 20 20 20 20 20 20  Where;          
14770 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
14780 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 2a 2f   WHERE clause */
14790 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73  .  struct SrcLis
147a0 74 5f 69 74 65 6d 20 2a 70 53 75 62 69 74 65 6d  t_item *pSubitem
147b0 3b 20 20 20 2f 2a 20 54 68 65 20 73 75 62 71 75  ;   /* The subqu
147c0 65 72 79 20 2a 2f 0a 0a 20 20 2f 2a 20 43 68 65  ery */..  /* Che
147d0 63 6b 20 74 6f 20 73 65 65 20 69 66 20 66 6c 61  ck to see if fla
147e0 74 74 65 6e 69 6e 67 20 69 73 20 70 65 72 6d 69  ttening is permi
147f0 74 74 65 64 2e 20 20 52 65 74 75 72 6e 20 30 20  tted.  Return 0 
14800 69 66 20 6e 6f 74 2e 0a 20 20 2a 2f 0a 20 20 69  if not..  */.  i
14810 66 28 20 70 3d 3d 30 20 29 20 72 65 74 75 72 6e  f( p==0 ) return
14820 20 30 3b 0a 20 20 70 53 72 63 20 3d 20 70 2d 3e   0;.  pSrc = p->
14830 70 53 72 63 3b 0a 20 20 61 73 73 65 72 74 28 20  pSrc;.  assert( 
14840 70 53 72 63 20 26 26 20 69 46 72 6f 6d 3e 3d 30  pSrc && iFrom>=0
14850 20 26 26 20 69 46 72 6f 6d 3c 70 53 72 63 2d 3e   && iFrom<pSrc->
14860 6e 53 72 63 20 29 3b 0a 20 20 70 53 75 62 69 74  nSrc );.  pSubit
14870 65 6d 20 3d 20 26 70 53 72 63 2d 3e 61 5b 69 46  em = &pSrc->a[iF
14880 72 6f 6d 5d 3b 0a 20 20 70 53 75 62 20 3d 20 70  rom];.  pSub = p
14890 53 75 62 69 74 65 6d 2d 3e 70 53 65 6c 65 63 74  Subitem->pSelect
148a0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 53 75 62  ;.  assert( pSub
148b0 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 69 73 41  !=0 );.  if( isA
148c0 67 67 20 26 26 20 73 75 62 71 75 65 72 79 49 73  gg && subqueryIs
148d0 41 67 67 20 29 20 72 65 74 75 72 6e 20 30 3b 20  Agg ) return 0; 
148e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
148f0 2f 2a 20 52 65 73 74 72 69 63 74 69 6f 6e 20 28  /* Restriction (
14900 31 29 20 20 2a 2f 0a 20 20 69 66 28 20 73 75 62  1)  */.  if( sub
14910 71 75 65 72 79 49 73 41 67 67 20 26 26 20 70 53  queryIsAgg && pS
14920 72 63 2d 3e 6e 53 72 63 3e 31 20 29 20 72 65 74  rc->nSrc>1 ) ret
14930 75 72 6e 20 30 3b 20 20 20 20 20 20 20 20 20 20  urn 0;          
14940 2f 2a 20 52 65 73 74 72 69 63 74 69 6f 6e 20 28  /* Restriction (
14950 32 29 20 20 2a 2f 0a 20 20 70 53 75 62 53 72 63  2)  */.  pSubSrc
14960 20 3d 20 70 53 75 62 2d 3e 70 53 72 63 3b 0a 20   = pSub->pSrc;. 
14970 20 61 73 73 65 72 74 28 20 70 53 75 62 53 72 63   assert( pSubSrc
14980 20 29 3b 0a 20 20 2f 2a 20 50 72 69 6f 72 20 74   );.  /* Prior t
14990 6f 20 76 65 72 73 69 6f 6e 20 33 2e 31 2e 32 2c  o version 3.1.2,
149a0 20 77 68 65 6e 20 4c 49 4d 49 54 20 61 6e 64 20   when LIMIT and 
149b0 4f 46 46 53 45 54 20 68 61 64 20 74 6f 20 62 65  OFFSET had to be
149c0 20 73 69 6d 70 6c 65 20 63 6f 6e 73 74 61 6e 74   simple constant
149d0 73 2c 0a 20 20 2a 2a 20 6e 6f 74 20 61 72 62 69  s,.  ** not arbi
149e0 74 72 61 72 79 20 65 78 70 72 65 73 73 73 69 6f  trary expresssio
149f0 6e 73 2c 20 77 65 20 61 6c 6c 6f 77 65 64 20 73  ns, we allowed s
14a00 6f 6d 65 20 63 6f 6d 62 69 6e 69 6e 67 20 6f 66  ome combining of
14a10 20 4c 49 4d 49 54 20 61 6e 64 20 4f 46 46 53 45   LIMIT and OFFSE
14a20 54 0a 20 20 2a 2a 20 62 65 63 61 75 73 65 20 74  T.  ** because t
14a30 68 65 79 20 63 6f 75 6c 64 20 62 65 20 63 6f 6d  hey could be com
14a40 70 75 74 65 64 20 61 74 20 63 6f 6d 70 69 6c 65  puted at compile
14a50 2d 74 69 6d 65 2e 20 20 42 75 74 20 77 68 65 6e  -time.  But when
14a60 20 4c 49 4d 49 54 20 61 6e 64 20 4f 46 46 53 45   LIMIT and OFFSE
14a70 54 0a 20 20 2a 2a 20 62 65 63 61 6d 65 20 61 72  T.  ** became ar
14a80 62 69 74 72 61 72 79 20 65 78 70 72 65 73 73 69  bitrary expressi
14a90 6f 6e 73 2c 20 77 65 20 77 65 72 65 20 66 6f 72  ons, we were for
14aa0 63 65 64 20 74 6f 20 61 64 64 20 72 65 73 74 72  ced to add restr
14ab0 69 63 74 69 6f 6e 73 20 28 31 33 29 0a 20 20 2a  ictions (13).  *
14ac0 2a 20 61 6e 64 20 28 31 34 29 2e 20 2a 2f 0a 20  * and (14). */. 
14ad0 20 69 66 28 20 70 53 75 62 2d 3e 70 4c 69 6d 69   if( pSub->pLimi
14ae0 74 20 26 26 20 70 2d 3e 70 4c 69 6d 69 74 20 29  t && p->pLimit )
14af0 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20   return 0;      
14b00 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73 74 72          /* Restr
14b10 69 63 74 69 6f 6e 20 28 31 33 29 20 2a 2f 0a 20  iction (13) */. 
14b20 20 69 66 28 20 70 53 75 62 2d 3e 70 4f 66 66 73   if( pSub->pOffs
14b30 65 74 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20  et ) return 0;  
14b40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14b50 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73 74 72          /* Restr
14b60 69 63 74 69 6f 6e 20 28 31 34 29 20 2a 2f 0a 20  iction (14) */. 
14b70 20 69 66 28 20 70 2d 3e 70 52 69 67 68 74 6d 6f   if( p->pRightmo
14b80 73 74 20 26 26 20 70 53 75 62 2d 3e 70 4c 69 6d  st && pSub->pLim
14b90 69 74 20 26 26 20 70 53 75 62 2d 3e 70 4f 72 64  it && pSub->pOrd
14ba0 65 72 42 79 20 29 7b 0a 20 20 20 20 72 65 74 75  erBy ){.    retu
14bb0 72 6e 20 30 3b 20 20 20 20 20 20 20 20 20 20 20  rn 0;           
14bc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14bd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14be0 20 2f 2a 20 52 65 73 74 72 69 63 74 69 6f 6e 20   /* Restriction 
14bf0 28 31 35 29 20 2a 2f 0a 20 20 7d 0a 20 20 69 66  (15) */.  }.  if
14c00 28 20 70 53 75 62 53 72 63 2d 3e 6e 53 72 63 3d  ( pSubSrc->nSrc=
14c10 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20  =0 ) return 0;  
14c20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14c30 20 20 20 20 20 2f 2a 20 52 65 73 74 72 69 63 74       /* Restrict
14c40 69 6f 6e 20 28 37 29 20 20 2a 2f 0a 20 20 69 66  ion (7)  */.  if
14c50 28 20 28 70 53 75 62 2d 3e 69 73 44 69 73 74 69  ( (pSub->isDisti
14c60 6e 63 74 20 7c 7c 20 70 53 75 62 2d 3e 70 4c 69  nct || pSub->pLi
14c70 6d 69 74 29 20 0a 20 20 20 20 20 20 20 20 20 26  mit) .         &
14c80 26 20 28 70 53 72 63 2d 3e 6e 53 72 63 3e 31 20  & (pSrc->nSrc>1 
14c90 7c 7c 20 69 73 41 67 67 29 20 29 7b 20 20 20 20  || isAgg) ){    
14ca0 20 20 20 20 20 20 2f 2a 20 52 65 73 74 72 69 63        /* Restric
14cb0 74 69 6f 6e 73 20 28 34 29 28 35 29 28 38 29 28  tions (4)(5)(8)(
14cc0 39 29 20 2a 2f 0a 20 20 20 20 20 72 65 74 75 72  9) */.     retur
14cd0 6e 20 30 3b 20 20 20 20 20 20 20 0a 20 20 7d 0a  n 0;       .  }.
14ce0 20 20 69 66 28 20 70 2d 3e 69 73 44 69 73 74 69    if( p->isDisti
14cf0 6e 63 74 20 26 26 20 73 75 62 71 75 65 72 79 49  nct && subqueryI
14d00 73 41 67 67 20 29 20 72 65 74 75 72 6e 20 30 3b  sAgg ) return 0;
14d10 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73 74           /* Rest
14d20 72 69 63 74 69 6f 6e 20 28 36 29 20 20 2a 2f 0a  riction (6)  */.
14d30 20 20 69 66 28 20 28 70 2d 3e 64 69 73 61 6c 6c    if( (p->disall
14d40 6f 77 4f 72 64 65 72 42 79 20 7c 7c 20 70 2d 3e  owOrderBy || p->
14d50 70 4f 72 64 65 72 42 79 29 20 26 26 20 70 53 75  pOrderBy) && pSu
14d60 62 2d 3e 70 4f 72 64 65 72 42 79 20 29 7b 0a 20  b->pOrderBy ){. 
14d70 20 20 20 20 72 65 74 75 72 6e 20 30 3b 20 20 20      return 0;   
14d80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14d90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14da0 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73 74 72          /* Restr
14db0 69 63 74 69 6f 6e 20 28 31 31 29 20 2a 2f 0a 20  iction (11) */. 
14dc0 20 7d 0a 20 20 69 66 28 20 69 73 41 67 67 20 26   }.  if( isAgg &
14dd0 26 20 70 53 75 62 2d 3e 70 4f 72 64 65 72 42 79  & pSub->pOrderBy
14de0 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20   ) return 0;    
14df0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
14e00 65 73 74 72 69 63 74 69 6f 6e 20 28 31 36 29 20  estriction (16) 
14e10 2a 2f 0a 0a 20 20 2f 2a 20 52 65 73 74 72 69 63  */..  /* Restric
14e20 74 69 6f 6e 20 33 3a 20 20 49 66 20 74 68 65 20  tion 3:  If the 
14e30 73 75 62 71 75 65 72 79 20 69 73 20 61 20 6a 6f  subquery is a jo
14e40 69 6e 2c 20 6d 61 6b 65 20 73 75 72 65 20 74 68  in, make sure th
14e50 65 20 73 75 62 71 75 65 72 79 20 69 73 20 0a 20  e subquery is . 
14e60 20 2a 2a 20 6e 6f 74 20 75 73 65 64 20 61 73 20   ** not used as 
14e70 74 68 65 20 72 69 67 68 74 20 6f 70 65 72 61 6e  the right operan
14e80 64 20 6f 66 20 61 6e 20 6f 75 74 65 72 20 6a 6f  d of an outer jo
14e90 69 6e 2e 20 20 45 78 61 6d 70 6c 65 73 20 6f 66  in.  Examples of
14ea0 20 77 68 79 20 74 68 69 73 0a 20 20 2a 2a 20 69   why this.  ** i
14eb0 73 20 6e 6f 74 20 61 6c 6c 6f 77 65 64 3a 0a 20  s not allowed:. 
14ec0 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 20 20 20   **.  **        
14ed0 20 74 31 20 4c 45 46 54 20 4f 55 54 45 52 20 4a   t1 LEFT OUTER J
14ee0 4f 49 4e 20 28 74 32 20 4a 4f 49 4e 20 74 33 29  OIN (t2 JOIN t3)
14ef0 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 77 65  .  **.  ** If we
14f00 20 66 6c 61 74 74 65 6e 20 74 68 65 20 61 62 6f   flatten the abo
14f10 76 65 2c 20 77 65 20 77 6f 75 6c 64 20 67 65 74  ve, we would get
14f20 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 20  .  **.  **      
14f30 20 20 20 28 74 31 20 4c 45 46 54 20 4f 55 54 45     (t1 LEFT OUTE
14f40 52 20 4a 4f 49 4e 20 74 32 29 20 4a 4f 49 4e 20  R JOIN t2) JOIN 
14f50 74 33 0a 20 20 2a 2a 0a 20 20 2a 2a 20 77 68 69  t3.  **.  ** whi
14f60 63 68 20 69 73 20 6e 6f 74 20 61 74 20 61 6c 6c  ch is not at all
14f70 20 74 68 65 20 73 61 6d 65 20 74 68 69 6e 67 2e   the same thing.
14f80 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 53 75 62  .  */.  if( pSub
14f90 53 72 63 2d 3e 6e 53 72 63 3e 31 20 26 26 20 28  Src->nSrc>1 && (
14fa0 70 53 75 62 69 74 65 6d 2d 3e 6a 6f 69 6e 74 79  pSubitem->jointy
14fb0 70 65 20 26 20 4a 54 5f 4f 55 54 45 52 29 21 3d  pe & JT_OUTER)!=
14fc0 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  0 ){.    return 
14fd0 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 65 73  0;.  }..  /* Res
14fe0 74 72 69 63 74 69 6f 6e 20 31 32 3a 20 20 49 66  triction 12:  If
14ff0 20 74 68 65 20 73 75 62 71 75 65 72 79 20 69 73   the subquery is
15000 20 74 68 65 20 72 69 67 68 74 20 6f 70 65 72 61   the right opera
15010 6e 64 20 6f 66 20 61 20 6c 65 66 74 20 6f 75 74  nd of a left out
15020 65 72 0a 20 20 2a 2a 20 6a 6f 69 6e 2c 20 6d 61  er.  ** join, ma
15030 6b 65 20 73 75 72 65 20 74 68 65 20 73 75 62 71  ke sure the subq
15040 75 65 72 79 20 68 61 73 20 6e 6f 20 57 48 45 52  uery has no WHER
15050 45 20 63 6c 61 75 73 65 2e 0a 20 20 2a 2a 20 41  E clause..  ** A
15060 6e 20 65 78 61 6d 70 6c 65 73 20 6f 66 20 77 68  n examples of wh
15070 79 20 74 68 69 73 20 69 73 20 6e 6f 74 20 61 6c  y this is not al
15080 6c 6f 77 65 64 3a 0a 20 20 2a 2a 0a 20 20 2a 2a  lowed:.  **.  **
15090 20 20 20 20 20 20 20 20 20 74 31 20 4c 45 46 54           t1 LEFT
150a0 20 4f 55 54 45 52 20 4a 4f 49 4e 20 28 53 45 4c   OUTER JOIN (SEL
150b0 45 43 54 20 2a 20 46 52 4f 4d 20 74 32 20 57 48  ECT * FROM t2 WH
150c0 45 52 45 20 74 32 2e 78 3e 30 29 0a 20 20 2a 2a  ERE t2.x>0).  **
150d0 0a 20 20 2a 2a 20 49 66 20 77 65 20 66 6c 61 74  .  ** If we flat
150e0 74 65 6e 20 74 68 65 20 61 62 6f 76 65 2c 20 77  ten the above, w
150f0 65 20 77 6f 75 6c 64 20 67 65 74 0a 20 20 2a 2a  e would get.  **
15100 0a 20 20 2a 2a 20 20 20 20 20 20 20 20 20 28 74  .  **         (t
15110 31 20 4c 45 46 54 20 4f 55 54 45 52 20 4a 4f 49  1 LEFT OUTER JOI
15120 4e 20 74 32 29 20 57 48 45 52 45 20 74 32 2e 78  N t2) WHERE t2.x
15130 3e 30 0a 20 20 2a 2a 0a 20 20 2a 2a 20 42 75 74  >0.  **.  ** But
15140 20 74 68 65 20 74 32 2e 78 3e 30 20 74 65 73 74   the t2.x>0 test
15150 20 77 69 6c 6c 20 61 6c 77 61 79 73 20 66 61 69   will always fai
15160 6c 20 6f 6e 20 61 20 4e 55 4c 4c 20 72 6f 77 20  l on a NULL row 
15170 6f 66 20 74 32 2c 20 77 68 69 63 68 0a 20 20 2a  of t2, which.  *
15180 2a 20 65 66 66 65 63 74 69 76 65 6c 79 20 63 6f  * effectively co
15190 6e 76 65 72 74 73 20 74 68 65 20 4f 55 54 45 52  nverts the OUTER
151a0 20 4a 4f 49 4e 20 69 6e 74 6f 20 61 6e 20 49 4e   JOIN into an IN
151b0 4e 45 52 20 4a 4f 49 4e 2e 0a 20 20 2a 2f 0a 20  NER JOIN..  */. 
151c0 20 69 66 28 20 28 70 53 75 62 69 74 65 6d 2d 3e   if( (pSubitem->
151d0 6a 6f 69 6e 74 79 70 65 20 26 20 4a 54 5f 4f 55  jointype & JT_OU
151e0 54 45 52 29 21 3d 30 20 26 26 20 70 53 75 62 2d  TER)!=0 && pSub-
151f0 3e 70 57 68 65 72 65 21 3d 30 20 29 7b 0a 20 20  >pWhere!=0 ){.  
15200 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a    return 0;.  }.
15210 0a 20 20 2f 2a 20 49 66 20 77 65 20 72 65 61 63  .  /* If we reac
15220 68 20 74 68 69 73 20 70 6f 69 6e 74 2c 20 69 74  h this point, it
15230 20 6d 65 61 6e 73 20 66 6c 61 74 74 65 6e 69 6e   means flattenin
15240 67 20 69 73 20 70 65 72 6d 69 74 74 65 64 20 66  g is permitted f
15250 6f 72 20 74 68 65 0a 20 20 2a 2a 20 69 46 72 6f  or the.  ** iFro
15260 6d 2d 74 68 20 65 6e 74 72 79 20 6f 66 20 74 68  m-th entry of th
15270 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 69 6e  e FROM clause in
15280 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79   the outer query
15290 2e 0a 20 20 2a 2f 0a 0a 20 20 2f 2a 20 4d 6f 76  ..  */..  /* Mov
152a0 65 20 61 6c 6c 20 6f 66 20 74 68 65 20 46 52 4f  e all of the FRO
152b0 4d 20 65 6c 65 6d 65 6e 74 73 20 6f 66 20 74 68  M elements of th
152c0 65 20 73 75 62 71 75 65 72 79 20 69 6e 74 6f 20  e subquery into 
152d0 74 68 65 0a 20 20 2a 2a 20 74 68 65 20 46 52 4f  the.  ** the FRO
152e0 4d 20 63 6c 61 75 73 65 20 6f 66 20 74 68 65 20  M clause of the 
152f0 6f 75 74 65 72 20 71 75 65 72 79 2e 20 20 42 65  outer query.  Be
15300 66 6f 72 65 20 64 6f 69 6e 67 20 74 68 69 73 2c  fore doing this,
15310 20 72 65 6d 65 6d 62 65 72 0a 20 20 2a 2a 20 74   remember.  ** t
15320 68 65 20 63 75 72 73 6f 72 20 6e 75 6d 62 65 72  he cursor number
15330 20 66 6f 72 20 74 68 65 20 6f 72 69 67 69 6e 61   for the origina
15340 6c 20 6f 75 74 65 72 20 71 75 65 72 79 20 46 52  l outer query FR
15350 4f 4d 20 65 6c 65 6d 65 6e 74 20 69 6e 0a 20 20  OM element in.  
15360 2a 2a 20 69 50 61 72 65 6e 74 2e 20 20 54 68 65  ** iParent.  The
15370 20 69 50 61 72 65 6e 74 20 63 75 72 73 6f 72 20   iParent cursor 
15380 77 69 6c 6c 20 6e 65 76 65 72 20 62 65 20 75 73  will never be us
15390 65 64 2e 20 20 53 75 62 73 65 71 75 65 6e 74 20  ed.  Subsequent 
153a0 63 6f 64 65 0a 20 20 2a 2a 20 77 69 6c 6c 20 73  code.  ** will s
153b0 63 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 73 20  can expressions 
153c0 6c 6f 6f 6b 69 6e 67 20 66 6f 72 20 69 50 61 72  looking for iPar
153d0 65 6e 74 20 72 65 66 65 72 65 6e 63 65 73 20 61  ent references a
153e0 6e 64 20 72 65 70 6c 61 63 65 0a 20 20 2a 2a 20  nd replace.  ** 
153f0 74 68 6f 73 65 20 72 65 66 65 72 65 6e 63 65 73  those references
15400 20 77 69 74 68 20 65 78 70 72 65 73 73 69 6f 6e   with expression
15410 73 20 74 68 61 74 20 72 65 73 6f 6c 76 65 20 74  s that resolve t
15420 6f 20 74 68 65 20 73 75 62 71 75 65 72 79 20 46  o the subquery F
15430 52 4f 4d 0a 20 20 2a 2a 20 65 6c 65 6d 65 6e 74  ROM.  ** element
15440 73 20 77 65 20 61 72 65 20 6e 6f 77 20 63 6f 70  s we are now cop
15450 79 69 6e 67 20 69 6e 2e 0a 20 20 2a 2f 0a 20 20  ying in..  */.  
15460 69 50 61 72 65 6e 74 20 3d 20 70 53 75 62 69 74  iParent = pSubit
15470 65 6d 2d 3e 69 43 75 72 73 6f 72 3b 0a 20 20 7b  em->iCursor;.  {
15480 0a 20 20 20 20 69 6e 74 20 6e 53 75 62 53 72 63  .    int nSubSrc
15490 20 3d 20 70 53 75 62 53 72 63 2d 3e 6e 53 72 63   = pSubSrc->nSrc
154a0 3b 0a 20 20 20 20 69 6e 74 20 6a 6f 69 6e 74 79  ;.    int jointy
154b0 70 65 20 3d 20 70 53 75 62 69 74 65 6d 2d 3e 6a  pe = pSubitem->j
154c0 6f 69 6e 74 79 70 65 3b 0a 0a 20 20 20 20 73 71  ointype;..    sq
154d0 6c 69 74 65 33 44 65 6c 65 74 65 54 61 62 6c 65  lite3DeleteTable
154e0 28 70 53 75 62 69 74 65 6d 2d 3e 70 54 61 62 29  (pSubitem->pTab)
154f0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72  ;.    sqlite3_fr
15500 65 65 28 70 53 75 62 69 74 65 6d 2d 3e 7a 44 61  ee(pSubitem->zDa
15510 74 61 62 61 73 65 29 3b 0a 20 20 20 20 73 71 6c  tabase);.    sql
15520 69 74 65 33 5f 66 72 65 65 28 70 53 75 62 69 74  ite3_free(pSubit
15530 65 6d 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  em->zName);.    
15540 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 53 75  sqlite3_free(pSu
15550 62 69 74 65 6d 2d 3e 7a 41 6c 69 61 73 29 3b 0a  bitem->zAlias);.
15560 20 20 20 20 70 53 75 62 69 74 65 6d 2d 3e 70 54      pSubitem->pT
15570 61 62 20 3d 20 30 3b 0a 20 20 20 20 70 53 75 62  ab = 0;.    pSub
15580 69 74 65 6d 2d 3e 7a 44 61 74 61 62 61 73 65 20  item->zDatabase 
15590 3d 20 30 3b 0a 20 20 20 20 70 53 75 62 69 74 65  = 0;.    pSubite
155a0 6d 2d 3e 7a 4e 61 6d 65 20 3d 20 30 3b 0a 20 20  m->zName = 0;.  
155b0 20 20 70 53 75 62 69 74 65 6d 2d 3e 7a 41 6c 69    pSubitem->zAli
155c0 61 73 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20  as = 0;.    if( 
155d0 6e 53 75 62 53 72 63 3e 31 20 29 7b 0a 20 20 20  nSubSrc>1 ){.   
155e0 20 20 20 69 6e 74 20 65 78 74 72 61 20 3d 20 6e     int extra = n
155f0 53 75 62 53 72 63 20 2d 20 31 3b 0a 20 20 20 20  SubSrc - 1;.    
15600 20 20 66 6f 72 28 69 3d 31 3b 20 69 3c 6e 53 75    for(i=1; i<nSu
15610 62 53 72 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  bSrc; i++){.    
15620 20 20 20 20 70 53 72 63 20 3d 20 73 71 6c 69 74      pSrc = sqlit
15630 65 33 53 72 63 4c 69 73 74 41 70 70 65 6e 64 28  e3SrcListAppend(
15640 64 62 2c 20 70 53 72 63 2c 20 30 2c 20 30 29 3b  db, pSrc, 0, 0);
15650 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 53 72  .        if( pSr
15660 63 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  c==0 ){.        
15670 20 20 70 2d 3e 70 53 72 63 20 3d 20 30 3b 0a 20    p->pSrc = 0;. 
15680 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20           return 
15690 31 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  1;.        }.   
156a0 20 20 20 7d 0a 20 20 20 20 20 20 70 2d 3e 70 53     }.      p->pS
156b0 72 63 20 3d 20 70 53 72 63 3b 0a 20 20 20 20 20  rc = pSrc;.     
156c0 20 66 6f 72 28 69 3d 70 53 72 63 2d 3e 6e 53 72   for(i=pSrc->nSr
156d0 63 2d 31 3b 20 69 2d 65 78 74 72 61 3e 3d 69 46  c-1; i-extra>=iF
156e0 72 6f 6d 3b 20 69 2d 2d 29 7b 0a 20 20 20 20 20  rom; i--){.     
156f0 20 20 20 70 53 72 63 2d 3e 61 5b 69 5d 20 3d 20     pSrc->a[i] = 
15700 70 53 72 63 2d 3e 61 5b 69 2d 65 78 74 72 61 5d  pSrc->a[i-extra]
15710 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
15720 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e      for(i=0; i<n
15730 53 75 62 53 72 63 3b 20 69 2b 2b 29 7b 0a 20 20  SubSrc; i++){.  
15740 20 20 20 20 70 53 72 63 2d 3e 61 5b 69 2b 69 46      pSrc->a[i+iF
15750 72 6f 6d 5d 20 3d 20 70 53 75 62 53 72 63 2d 3e  rom] = pSubSrc->
15760 61 5b 69 5d 3b 0a 20 20 20 20 20 20 6d 65 6d 73  a[i];.      mems
15770 65 74 28 26 70 53 75 62 53 72 63 2d 3e 61 5b 69  et(&pSubSrc->a[i
15780 5d 2c 20 30 2c 20 73 69 7a 65 6f 66 28 70 53 75  ], 0, sizeof(pSu
15790 62 53 72 63 2d 3e 61 5b 69 5d 29 29 3b 0a 20 20  bSrc->a[i]));.  
157a0 20 20 7d 0a 20 20 20 20 70 53 72 63 2d 3e 61 5b    }.    pSrc->a[
157b0 69 46 72 6f 6d 5d 2e 6a 6f 69 6e 74 79 70 65 20  iFrom].jointype 
157c0 3d 20 6a 6f 69 6e 74 79 70 65 3b 0a 20 20 7d 0a  = jointype;.  }.
157d0 0a 20 20 2f 2a 20 4e 6f 77 20 62 65 67 69 6e 20  .  /* Now begin 
157e0 73 75 62 73 74 69 74 75 74 69 6e 67 20 73 75 62  substituting sub
157f0 71 75 65 72 79 20 72 65 73 75 6c 74 20 73 65 74  query result set
15800 20 65 78 70 72 65 73 73 69 6f 6e 73 20 66 6f 72   expressions for
15810 20 0a 20 20 2a 2a 20 72 65 66 65 72 65 6e 63 65   .  ** reference
15820 73 20 74 6f 20 74 68 65 20 69 50 61 72 65 6e 74  s to the iParent
15830 20 69 6e 20 74 68 65 20 6f 75 74 65 72 20 71 75   in the outer qu
15840 65 72 79 2e 0a 20 20 2a 2a 20 0a 20 20 2a 2a 20  ery..  ** .  ** 
15850 45 78 61 6d 70 6c 65 3a 0a 20 20 2a 2a 0a 20 20  Example:.  **.  
15860 2a 2a 20 20 20 53 45 4c 45 43 54 20 61 2b 35 2c  **   SELECT a+5,
15870 20 62 2a 31 30 20 46 52 4f 4d 20 28 53 45 4c 45   b*10 FROM (SELE
15880 43 54 20 78 2a 33 20 41 53 20 61 2c 20 79 2b 31  CT x*3 AS a, y+1
15890 30 20 41 53 20 62 20 46 52 4f 4d 20 74 31 29 20  0 AS b FROM t1) 
158a0 57 48 45 52 45 20 61 3e 62 3b 0a 20 20 2a 2a 20  WHERE a>b;.  ** 
158b0 20 20 5c 20 20 20 20 20 20 20 20 20 20 20 20 20    \             
158c0 20 20 20 20 20 20 20 20 5c 5f 5f 5f 5f 5f 5f 5f          \_______
158d0 5f 5f 5f 5f 5f 5f 20 73 75 62 71 75 65 72 79 20  ______ subquery 
158e0 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 2f 20 20 20 20 20  __________/     
158f0 20 20 20 20 20 2f 0a 20 20 2a 2a 20 20 20 20 5c       /.  **    \
15900 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f  ________________
15910 5f 5f 5f 5f 5f 20 6f 75 74 65 72 20 71 75 65 72  _____ outer quer
15920 79 20 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f  y ______________
15930 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f  ________________
15940 2f 0a 20 20 2a 2a 0a 20 20 2a 2a 20 57 65 20 6c  /.  **.  ** We l
15950 6f 6f 6b 20 61 74 20 65 76 65 72 79 20 65 78 70  ook at every exp
15960 72 65 73 73 69 6f 6e 20 69 6e 20 74 68 65 20 6f  ression in the o
15970 75 74 65 72 20 71 75 65 72 79 20 61 6e 64 20 65  uter query and e
15980 76 65 72 79 20 70 6c 61 63 65 20 77 65 20 73 65  very place we se
15990 65 0a 20 20 2a 2a 20 22 61 22 20 77 65 20 73 75  e.  ** "a" we su
159a0 62 73 74 69 74 75 74 65 20 22 78 2a 33 22 20 61  bstitute "x*3" a
159b0 6e 64 20 65 76 65 72 79 20 70 6c 61 63 65 20 77  nd every place w
159c0 65 20 73 65 65 20 22 62 22 20 77 65 20 73 75 62  e see "b" we sub
159d0 73 74 69 74 75 74 65 20 22 79 2b 31 30 22 2e 0a  stitute "y+10"..
159e0 20 20 2a 2f 0a 20 20 70 4c 69 73 74 20 3d 20 70    */.  pList = p
159f0 2d 3e 70 45 4c 69 73 74 3b 0a 20 20 66 6f 72 28  ->pEList;.  for(
15a00 69 3d 30 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e 45  i=0; i<pList->nE
15a10 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 45  xpr; i++){.    E
15a20 78 70 72 20 2a 70 45 78 70 72 3b 0a 20 20 20 20  xpr *pExpr;.    
15a30 69 66 28 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e  if( pList->a[i].
15a40 7a 4e 61 6d 65 3d 3d 30 20 26 26 20 28 70 45 78  zName==0 && (pEx
15a50 70 72 20 3d 20 70 4c 69 73 74 2d 3e 61 5b 69 5d  pr = pList->a[i]
15a60 2e 70 45 78 70 72 29 2d 3e 73 70 61 6e 2e 7a 21  .pExpr)->span.z!
15a70 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 4c 69 73  =0 ){.      pLis
15a80 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 20 3d 20  t->a[i].zName = 
15a90 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71  .             sq
15aa0 6c 69 74 65 33 44 62 53 74 72 4e 44 75 70 28 64  lite3DbStrNDup(d
15ab0 62 2c 20 28 63 68 61 72 2a 29 70 45 78 70 72 2d  b, (char*)pExpr-
15ac0 3e 73 70 61 6e 2e 7a 2c 20 70 45 78 70 72 2d 3e  >span.z, pExpr->
15ad0 73 70 61 6e 2e 6e 29 3b 0a 20 20 20 20 7d 0a 20  span.n);.    }. 
15ae0 20 7d 0a 20 20 73 75 62 73 74 45 78 70 72 4c 69   }.  substExprLi
15af0 73 74 28 64 62 2c 20 70 2d 3e 70 45 4c 69 73 74  st(db, p->pEList
15b00 2c 20 69 50 61 72 65 6e 74 2c 20 70 53 75 62 2d  , iParent, pSub-
15b10 3e 70 45 4c 69 73 74 29 3b 0a 20 20 69 66 28 20  >pEList);.  if( 
15b20 69 73 41 67 67 20 29 7b 0a 20 20 20 20 73 75 62  isAgg ){.    sub
15b30 73 74 45 78 70 72 4c 69 73 74 28 64 62 2c 20 70  stExprList(db, p
15b40 2d 3e 70 47 72 6f 75 70 42 79 2c 20 69 50 61 72  ->pGroupBy, iPar
15b50 65 6e 74 2c 20 70 53 75 62 2d 3e 70 45 4c 69 73  ent, pSub->pELis
15b60 74 29 3b 0a 20 20 20 20 73 75 62 73 74 45 78 70  t);.    substExp
15b70 72 28 64 62 2c 20 70 2d 3e 70 48 61 76 69 6e 67  r(db, p->pHaving
15b80 2c 20 69 50 61 72 65 6e 74 2c 20 70 53 75 62 2d  , iParent, pSub-
15b90 3e 70 45 4c 69 73 74 29 3b 0a 20 20 7d 0a 20 20  >pEList);.  }.  
15ba0 69 66 28 20 70 53 75 62 2d 3e 70 4f 72 64 65 72  if( pSub->pOrder
15bb0 42 79 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  By ){.    assert
15bc0 28 20 70 2d 3e 70 4f 72 64 65 72 42 79 3d 3d 30  ( p->pOrderBy==0
15bd0 20 29 3b 0a 20 20 20 20 70 2d 3e 70 4f 72 64 65   );.    p->pOrde
15be0 72 42 79 20 3d 20 70 53 75 62 2d 3e 70 4f 72 64  rBy = pSub->pOrd
15bf0 65 72 42 79 3b 0a 20 20 20 20 70 53 75 62 2d 3e  erBy;.    pSub->
15c00 70 4f 72 64 65 72 42 79 20 3d 20 30 3b 0a 20 20  pOrderBy = 0;.  
15c10 7d 65 6c 73 65 20 69 66 28 20 70 2d 3e 70 4f 72  }else if( p->pOr
15c20 64 65 72 42 79 20 29 7b 0a 20 20 20 20 73 75 62  derBy ){.    sub
15c30 73 74 45 78 70 72 4c 69 73 74 28 64 62 2c 20 70  stExprList(db, p
15c40 2d 3e 70 4f 72 64 65 72 42 79 2c 20 69 50 61 72  ->pOrderBy, iPar
15c50 65 6e 74 2c 20 70 53 75 62 2d 3e 70 45 4c 69 73  ent, pSub->pELis
15c60 74 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 53  t);.  }.  if( pS
15c70 75 62 2d 3e 70 57 68 65 72 65 20 29 7b 0a 20 20  ub->pWhere ){.  
15c80 20 20 70 57 68 65 72 65 20 3d 20 73 71 6c 69 74    pWhere = sqlit
15c90 65 33 45 78 70 72 44 75 70 28 64 62 2c 20 70 53  e3ExprDup(db, pS
15ca0 75 62 2d 3e 70 57 68 65 72 65 29 3b 0a 20 20 7d  ub->pWhere);.  }
15cb0 65 6c 73 65 7b 0a 20 20 20 20 70 57 68 65 72 65  else{.    pWhere
15cc0 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20   = 0;.  }.  if( 
15cd0 73 75 62 71 75 65 72 79 49 73 41 67 67 20 29 7b  subqueryIsAgg ){
15ce0 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e  .    assert( p->
15cf0 70 48 61 76 69 6e 67 3d 3d 30 20 29 3b 0a 20 20  pHaving==0 );.  
15d00 20 20 70 2d 3e 70 48 61 76 69 6e 67 20 3d 20 70    p->pHaving = p
15d10 2d 3e 70 57 68 65 72 65 3b 0a 20 20 20 20 70 2d  ->pWhere;.    p-
15d20 3e 70 57 68 65 72 65 20 3d 20 70 57 68 65 72 65  >pWhere = pWhere
15d30 3b 0a 20 20 20 20 73 75 62 73 74 45 78 70 72 28  ;.    substExpr(
15d40 64 62 2c 20 70 2d 3e 70 48 61 76 69 6e 67 2c 20  db, p->pHaving, 
15d50 69 50 61 72 65 6e 74 2c 20 70 53 75 62 2d 3e 70  iParent, pSub->p
15d60 45 4c 69 73 74 29 3b 0a 20 20 20 20 70 2d 3e 70  EList);.    p->p
15d70 48 61 76 69 6e 67 20 3d 20 73 71 6c 69 74 65 33  Having = sqlite3
15d80 45 78 70 72 41 6e 64 28 64 62 2c 20 70 2d 3e 70  ExprAnd(db, p->p
15d90 48 61 76 69 6e 67 2c 20 0a 20 20 20 20 20 20 20  Having, .       
15da0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15db0 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
15dc0 45 78 70 72 44 75 70 28 64 62 2c 20 70 53 75 62  ExprDup(db, pSub
15dd0 2d 3e 70 48 61 76 69 6e 67 29 29 3b 0a 20 20 20  ->pHaving));.   
15de0 20 61 73 73 65 72 74 28 20 70 2d 3e 70 47 72 6f   assert( p->pGro
15df0 75 70 42 79 3d 3d 30 20 29 3b 0a 20 20 20 20 70  upBy==0 );.    p
15e00 2d 3e 70 47 72 6f 75 70 42 79 20 3d 20 73 71 6c  ->pGroupBy = sql
15e10 69 74 65 33 45 78 70 72 4c 69 73 74 44 75 70 28  ite3ExprListDup(
15e20 64 62 2c 20 70 53 75 62 2d 3e 70 47 72 6f 75 70  db, pSub->pGroup
15e30 42 79 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  By);.  }else{.  
15e40 20 20 73 75 62 73 74 45 78 70 72 28 64 62 2c 20    substExpr(db, 
15e50 70 2d 3e 70 57 68 65 72 65 2c 20 69 50 61 72 65  p->pWhere, iPare
15e60 6e 74 2c 20 70 53 75 62 2d 3e 70 45 4c 69 73 74  nt, pSub->pEList
15e70 29 3b 0a 20 20 20 20 70 2d 3e 70 57 68 65 72 65  );.    p->pWhere
15e80 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 41 6e   = sqlite3ExprAn
15e90 64 28 64 62 2c 20 70 2d 3e 70 57 68 65 72 65 2c  d(db, p->pWhere,
15ea0 20 70 57 68 65 72 65 29 3b 0a 20 20 7d 0a 0a 20   pWhere);.  }.. 
15eb0 20 2f 2a 20 54 68 65 20 66 6c 61 74 74 65 6e 65   /* The flattene
15ec0 64 20 71 75 65 72 79 20 69 73 20 64 69 73 74 69  d query is disti
15ed0 6e 63 74 20 69 66 20 65 69 74 68 65 72 20 74 68  nct if either th
15ee0 65 20 69 6e 6e 65 72 20 6f 72 20 74 68 65 0a 20  e inner or the. 
15ef0 20 2a 2a 20 6f 75 74 65 72 20 71 75 65 72 79 20   ** outer query 
15f00 69 73 20 64 69 73 74 69 6e 63 74 2e 20 0a 20 20  is distinct. .  
15f10 2a 2f 0a 20 20 70 2d 3e 69 73 44 69 73 74 69 6e  */.  p->isDistin
15f20 63 74 20 3d 20 70 2d 3e 69 73 44 69 73 74 69 6e  ct = p->isDistin
15f30 63 74 20 7c 7c 20 70 53 75 62 2d 3e 69 73 44 69  ct || pSub->isDi
15f40 73 74 69 6e 63 74 3b 0a 0a 20 20 2f 2a 0a 20 20  stinct;..  /*.  
15f50 2a 2a 20 53 45 4c 45 43 54 20 2e 2e 2e 20 46 52  ** SELECT ... FR
15f60 4f 4d 20 28 53 45 4c 45 43 54 20 2e 2e 2e 20 4c  OM (SELECT ... L
15f70 49 4d 49 54 20 61 20 4f 46 46 53 45 54 20 62 29  IMIT a OFFSET b)
15f80 20 4c 49 4d 49 54 20 78 20 4f 46 46 53 45 54 20   LIMIT x OFFSET 
15f90 79 3b 0a 20 20 2a 2a 0a 20 20 2a 2a 20 4f 6e 65  y;.  **.  ** One
15fa0 20 69 73 20 74 65 6d 70 74 65 64 20 74 6f 20 74   is tempted to t
15fb0 72 79 20 74 6f 20 61 64 64 20 61 20 61 6e 64 20  ry to add a and 
15fc0 62 20 74 6f 20 63 6f 6d 62 69 6e 65 20 74 68 65  b to combine the
15fd0 20 6c 69 6d 69 74 73 2e 20 20 42 75 74 20 74 68   limits.  But th
15fe0 69 73 0a 20 20 2a 2a 20 64 6f 65 73 20 6e 6f 74  is.  ** does not
15ff0 20 77 6f 72 6b 20 69 66 20 65 69 74 68 65 72 20   work if either 
16000 6c 69 6d 69 74 20 69 73 20 6e 65 67 61 74 69 76  limit is negativ
16010 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 53  e..  */.  if( pS
16020 75 62 2d 3e 70 4c 69 6d 69 74 20 29 7b 0a 20 20  ub->pLimit ){.  
16030 20 20 70 2d 3e 70 4c 69 6d 69 74 20 3d 20 70 53    p->pLimit = pS
16040 75 62 2d 3e 70 4c 69 6d 69 74 3b 0a 20 20 20 20  ub->pLimit;.    
16050 70 53 75 62 2d 3e 70 4c 69 6d 69 74 20 3d 20 30  pSub->pLimit = 0
16060 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46 69 6e 69  ;.  }..  /* Fini
16070 61 6c 6c 79 2c 20 64 65 6c 65 74 65 20 77 68 61  ally, delete wha
16080 74 20 69 73 20 6c 65 66 74 20 6f 66 20 74 68 65  t is left of the
16090 20 73 75 62 71 75 65 72 79 20 61 6e 64 20 72 65   subquery and re
160a0 74 75 72 6e 0a 20 20 2a 2a 20 73 75 63 63 65 73  turn.  ** succes
160b0 73 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65  s..  */.  sqlite
160c0 33 53 65 6c 65 63 74 44 65 6c 65 74 65 28 70 53  3SelectDelete(pS
160d0 75 62 29 3b 0a 20 20 72 65 74 75 72 6e 20 31 3b  ub);.  return 1;
160e0 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c  .}.#endif /* SQL
160f0 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 20 2a 2f  ITE_OMIT_VIEW */
16100 0a 0a 2f 2a 0a 2a 2a 20 41 6e 61 6c 79 7a 65 20  ../*.** Analyze 
16110 74 68 65 20 53 45 4c 45 43 54 20 73 74 61 74 65  the SELECT state
16120 6d 65 6e 74 20 70 61 73 73 65 64 20 61 73 20 61  ment passed as a
16130 6e 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 73 65  n argument to se
16140 65 20 69 66 20 69 74 0a 2a 2a 20 69 73 20 61 20  e if it.** is a 
16150 6d 69 6e 28 29 20 6f 72 20 6d 61 78 28 29 20 71  min() or max() q
16160 75 65 72 79 2e 20 52 65 74 75 72 6e 20 57 48 45  uery. Return WHE
16170 52 45 5f 4f 52 44 45 52 42 59 5f 4d 49 4e 20 6f  RE_ORDERBY_MIN o
16180 72 20 57 48 45 52 45 5f 4f 52 44 45 52 42 59 5f  r WHERE_ORDERBY_
16190 4d 41 58 20 69 66 20 0a 2a 2a 20 69 74 20 69 73  MAX if .** it is
161a0 2c 20 6f 72 20 30 20 6f 74 68 65 72 77 69 73 65  , or 0 otherwise
161b0 2e 20 41 74 20 70 72 65 73 65 6e 74 2c 20 61 20  . At present, a 
161c0 71 75 65 72 79 20 69 73 20 63 6f 6e 73 69 64 65  query is conside
161d0 72 65 64 20 74 6f 20 62 65 0a 2a 2a 20 61 20 6d  red to be.** a m
161e0 69 6e 28 29 2f 6d 61 78 28 29 20 71 75 65 72 79  in()/max() query
161f0 20 69 66 3a 0a 2a 2a 0a 2a 2a 20 20 20 31 2e 20   if:.**.**   1. 
16200 54 68 65 72 65 20 69 73 20 61 20 73 69 6e 67 6c  There is a singl
16210 65 20 6f 62 6a 65 63 74 20 69 6e 20 74 68 65 20  e object in the 
16220 46 52 4f 4d 20 63 6c 61 75 73 65 2e 0a 2a 2a 0a  FROM clause..**.
16230 2a 2a 20 20 20 32 2e 20 54 68 65 72 65 20 69 73  **   2. There is
16240 20 61 20 73 69 6e 67 6c 65 20 65 78 70 72 65 73   a single expres
16250 73 69 6f 6e 20 69 6e 20 74 68 65 20 72 65 73 75  sion in the resu
16260 6c 74 20 73 65 74 2c 20 61 6e 64 20 69 74 20 69  lt set, and it i
16270 73 0a 2a 2a 20 20 20 20 20 20 65 69 74 68 65 72  s.**      either
16280 20 6d 69 6e 28 78 29 20 6f 72 20 6d 61 78 28 78   min(x) or max(x
16290 29 2c 20 77 68 65 72 65 20 78 20 69 73 20 61 20  ), where x is a 
162a0 63 6f 6c 75 6d 6e 20 72 65 66 65 72 65 6e 63 65  column reference
162b0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
162c0 6d 69 6e 4d 61 78 51 75 65 72 79 28 50 61 72 73  minMaxQuery(Pars
162d0 65 20 2a 70 50 61 72 73 65 2c 20 53 65 6c 65 63  e *pParse, Selec
162e0 74 20 2a 70 29 7b 0a 20 20 45 78 70 72 20 2a 70  t *p){.  Expr *p
162f0 45 78 70 72 3b 0a 20 20 45 78 70 72 4c 69 73 74  Expr;.  ExprList
16300 20 2a 70 45 4c 69 73 74 20 3d 20 70 2d 3e 70 45   *pEList = p->pE
16310 4c 69 73 74 3b 0a 0a 20 20 69 66 28 20 70 45 4c  List;..  if( pEL
16320 69 73 74 2d 3e 6e 45 78 70 72 21 3d 31 20 29 20  ist->nExpr!=1 ) 
16330 72 65 74 75 72 6e 20 57 48 45 52 45 5f 4f 52 44  return WHERE_ORD
16340 45 52 42 59 5f 4e 4f 52 4d 41 4c 3b 0a 20 20 70  ERBY_NORMAL;.  p
16350 45 78 70 72 20 3d 20 70 45 4c 69 73 74 2d 3e 61  Expr = pEList->a
16360 5b 30 5d 2e 70 45 78 70 72 3b 0a 20 20 70 45 4c  [0].pExpr;.  pEL
16370 69 73 74 20 3d 20 70 45 78 70 72 2d 3e 70 4c 69  ist = pExpr->pLi
16380 73 74 3b 0a 20 20 69 66 28 20 70 45 78 70 72 2d  st;.  if( pExpr-
16390 3e 6f 70 21 3d 54 4b 5f 41 47 47 5f 46 55 4e 43  >op!=TK_AGG_FUNC
163a0 54 49 4f 4e 20 7c 7c 20 70 45 4c 69 73 74 3d 3d  TION || pEList==
163b0 30 20 7c 7c 20 70 45 4c 69 73 74 2d 3e 6e 45 78  0 || pEList->nEx
163c0 70 72 21 3d 31 20 29 20 72 65 74 75 72 6e 20 30  pr!=1 ) return 0
163d0 3b 0a 20 20 69 66 28 20 70 45 4c 69 73 74 2d 3e  ;.  if( pEList->
163e0 61 5b 30 5d 2e 70 45 78 70 72 2d 3e 6f 70 21 3d  a[0].pExpr->op!=
163f0 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 20 29 20  TK_AGG_COLUMN ) 
16400 72 65 74 75 72 6e 20 57 48 45 52 45 5f 4f 52 44  return WHERE_ORD
16410 45 52 42 59 5f 4e 4f 52 4d 41 4c 3b 0a 20 20 69  ERBY_NORMAL;.  i
16420 66 28 20 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e  f( pExpr->token.
16430 6e 21 3d 33 20 29 20 72 65 74 75 72 6e 20 57 48  n!=3 ) return WH
16440 45 52 45 5f 4f 52 44 45 52 42 59 5f 4e 4f 52 4d  ERE_ORDERBY_NORM
16450 41 4c 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65  AL;.  if( sqlite
16460 33 53 74 72 4e 49 43 6d 70 28 28 63 68 61 72 2a  3StrNICmp((char*
16470 29 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 7a 2c  )pExpr->token.z,
16480 22 6d 69 6e 22 2c 33 29 3d 3d 30 20 29 7b 0a 20  "min",3)==0 ){. 
16490 20 20 20 72 65 74 75 72 6e 20 57 48 45 52 45 5f     return WHERE_
164a0 4f 52 44 45 52 42 59 5f 4d 49 4e 3b 0a 20 20 7d  ORDERBY_MIN;.  }
164b0 65 6c 73 65 20 69 66 28 20 73 71 6c 69 74 65 33  else if( sqlite3
164c0 53 74 72 4e 49 43 6d 70 28 28 63 68 61 72 2a 29  StrNICmp((char*)
164d0 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 7a 2c 22  pExpr->token.z,"
164e0 6d 61 78 22 2c 33 29 3d 3d 30 20 29 7b 0a 20 20  max",3)==0 ){.  
164f0 20 20 72 65 74 75 72 6e 20 57 48 45 52 45 5f 4f    return WHERE_O
16500 52 44 45 52 42 59 5f 4d 41 58 3b 0a 20 20 7d 0a  RDERBY_MAX;.  }.
16510 20 20 72 65 74 75 72 6e 20 57 48 45 52 45 5f 4f    return WHERE_O
16520 52 44 45 52 42 59 5f 4e 4f 52 4d 41 4c 3b 0a 7d  RDERBY_NORMAL;.}
16530 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ../*.** This rou
16540 74 69 6e 65 20 72 65 73 6f 6c 76 65 73 20 61 6e  tine resolves an
16550 79 20 6e 61 6d 65 73 20 75 73 65 64 20 69 6e 20  y names used in 
16560 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 20 6f  the result set o
16570 66 20 74 68 65 0a 2a 2a 20 73 75 70 70 6c 69 65  f the.** supplie
16580 64 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  d SELECT stateme
16590 6e 74 2e 20 49 66 20 74 68 65 20 53 45 4c 45 43  nt. If the SELEC
165a0 54 20 73 74 61 74 65 6d 65 6e 74 20 62 65 69 6e  T statement bein
165b0 67 20 72 65 73 6f 6c 76 65 64 0a 2a 2a 20 69 73  g resolved.** is
165c0 20 61 20 73 75 62 2d 73 65 6c 65 63 74 2c 20 74   a sub-select, t
165d0 68 65 6e 20 70 4f 75 74 65 72 4e 43 20 69 73 20  hen pOuterNC is 
165e0 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65  a pointer to the
165f0 20 4e 61 6d 65 43 6f 6e 74 65 78 74 20 0a 2a 2a   NameContext .**
16600 20 6f 66 20 74 68 65 20 70 61 72 65 6e 74 20 53   of the parent S
16610 45 4c 45 43 54 2e 0a 2a 2f 0a 69 6e 74 20 73 71  ELECT..*/.int sq
16620 6c 69 74 65 33 53 65 6c 65 63 74 52 65 73 6f 6c  lite3SelectResol
16630 76 65 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  ve(.  Parse *pPa
16640 72 73 65 2c 20 20 20 20 20 20 20 20 20 2f 2a 20  rse,         /* 
16650 54 68 65 20 70 61 72 73 65 72 20 63 6f 6e 74 65  The parser conte
16660 78 74 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a  xt */.  Select *
16670 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  p,             /
16680 2a 20 54 68 65 20 53 45 4c 45 43 54 20 73 74 61  * The SELECT sta
16690 74 65 6d 65 6e 74 20 62 65 69 6e 67 20 63 6f 64  tement being cod
166a0 65 64 2e 20 2a 2f 0a 20 20 4e 61 6d 65 43 6f 6e  ed. */.  NameCon
166b0 74 65 78 74 20 2a 70 4f 75 74 65 72 4e 43 20 20  text *pOuterNC  
166c0 2f 2a 20 54 68 65 20 6f 75 74 65 72 20 6e 61 6d  /* The outer nam
166d0 65 20 63 6f 6e 74 65 78 74 2e 20 4d 61 79 20 62  e context. May b
166e0 65 20 4e 55 4c 4c 2e 20 2a 2f 0a 29 7b 0a 20 20  e NULL. */.){.  
166f0 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74  ExprList *pEList
16700 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65  ;          /* Re
16710 73 75 6c 74 20 73 65 74 2e 20 2a 2f 0a 20 20 69  sult set. */.  i
16720 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20 20 20  nt i;           
16730 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6f 72            /* For
16740 2d 6c 6f 6f 70 20 76 61 72 69 61 62 6c 65 20 75  -loop variable u
16750 73 65 64 20 69 6e 20 6d 75 6c 74 69 70 6c 65 20  sed in multiple 
16760 70 6c 61 63 65 73 20 2a 2f 0a 20 20 4e 61 6d 65  places */.  Name
16770 43 6f 6e 74 65 78 74 20 73 4e 43 3b 20 20 20 20  Context sNC;    
16780 20 20 20 20 20 20 20 2f 2a 20 4c 6f 63 61 6c 20         /* Local 
16790 6e 61 6d 65 2d 63 6f 6e 74 65 78 74 20 2a 2f 0a  name-context */.
167a0 20 20 45 78 70 72 4c 69 73 74 20 2a 70 47 72 6f    ExprList *pGro
167b0 75 70 42 79 3b 20 20 20 20 20 20 20 20 2f 2a 20  upBy;        /* 
167c0 54 68 65 20 67 72 6f 75 70 20 62 79 20 63 6c 61  The group by cla
167d0 75 73 65 20 2a 2f 0a 0a 20 20 2f 2a 20 49 66 20  use */..  /* If 
167e0 74 68 69 73 20 72 6f 75 74 69 6e 65 20 68 61 73  this routine has
167f0 20 72 75 6e 20 62 65 66 6f 72 65 2c 20 72 65 74   run before, ret
16800 75 72 6e 20 69 6d 6d 65 64 69 61 74 65 6c 79 2e  urn immediately.
16810 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 69 73 52   */.  if( p->isR
16820 65 73 6f 6c 76 65 64 20 29 7b 0a 20 20 20 20 61  esolved ){.    a
16830 73 73 65 72 74 28 20 21 70 4f 75 74 65 72 4e 43  ssert( !pOuterNC
16840 20 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   );.    return S
16850 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20  QLITE_OK;.  }.  
16860 70 2d 3e 69 73 52 65 73 6f 6c 76 65 64 20 3d 20  p->isResolved = 
16870 31 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 72  1;..  /* If ther
16880 65 20 68 61 76 65 20 61 6c 72 65 61 64 79 20 62  e have already b
16890 65 65 6e 20 65 72 72 6f 72 73 2c 20 64 6f 20 6e  een errors, do n
168a0 6f 74 68 69 6e 67 2e 20 2a 2f 0a 20 20 69 66 28  othing. */.  if(
168b0 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 3e 30 20   pParse->nErr>0 
168c0 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
168d0 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a  LITE_ERROR;.  }.
168e0 0a 20 20 2f 2a 20 50 72 65 70 61 72 65 20 74 68  .  /* Prepare th
168f0 65 20 73 65 6c 65 63 74 20 73 74 61 74 65 6d 65  e select stateme
16900 6e 74 2e 20 54 68 69 73 20 63 61 6c 6c 20 77 69  nt. This call wi
16910 6c 6c 20 61 6c 6c 6f 63 61 74 65 20 61 6c 6c 20  ll allocate all 
16920 63 75 72 73 6f 72 73 0a 20 20 2a 2a 20 72 65 71  cursors.  ** req
16930 75 69 72 65 64 20 74 6f 20 68 61 6e 64 6c 65 20  uired to handle 
16940 74 68 65 20 74 61 62 6c 65 73 20 61 6e 64 20 73  the tables and s
16950 75 62 71 75 65 72 69 65 73 20 69 6e 20 74 68 65  ubqueries in the
16960 20 46 52 4f 4d 20 63 6c 61 75 73 65 2e 0a 20 20   FROM clause..  
16970 2a 2f 0a 20 20 69 66 28 20 70 72 65 70 53 65 6c  */.  if( prepSel
16980 65 63 74 53 74 6d 74 28 70 50 61 72 73 65 2c 20  ectStmt(pParse, 
16990 70 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  p) ){.    return
169a0 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20   SQLITE_ERROR;. 
169b0 20 7d 0a 0a 20 20 2f 2a 20 52 65 73 6f 6c 76 65   }..  /* Resolve
169c0 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 73   the expressions
169d0 20 69 6e 20 74 68 65 20 4c 49 4d 49 54 20 61 6e   in the LIMIT an
169e0 64 20 4f 46 46 53 45 54 20 63 6c 61 75 73 65 73  d OFFSET clauses
169f0 2e 20 54 68 65 73 65 0a 20 20 2a 2a 20 61 72 65  . These.  ** are
16a00 20 6e 6f 74 20 61 6c 6c 6f 77 65 64 20 74 6f 20   not allowed to 
16a10 72 65 66 65 72 20 74 6f 20 61 6e 79 20 6e 61 6d  refer to any nam
16a20 65 73 2c 20 73 6f 20 70 61 73 73 20 61 6e 20 65  es, so pass an e
16a30 6d 70 74 79 20 4e 61 6d 65 43 6f 6e 74 65 78 74  mpty NameContext
16a40 2e 0a 20 20 2a 2f 0a 20 20 6d 65 6d 73 65 74 28  ..  */.  memset(
16a50 26 73 4e 43 2c 20 30 2c 20 73 69 7a 65 6f 66 28  &sNC, 0, sizeof(
16a60 73 4e 43 29 29 3b 0a 20 20 73 4e 43 2e 70 50 61  sNC));.  sNC.pPa
16a70 72 73 65 20 3d 20 70 50 61 72 73 65 3b 0a 20 20  rse = pParse;.  
16a80 69 66 28 20 73 71 6c 69 74 65 33 45 78 70 72 52  if( sqlite3ExprR
16a90 65 73 6f 6c 76 65 4e 61 6d 65 73 28 26 73 4e 43  esolveNames(&sNC
16aa0 2c 20 70 2d 3e 70 4c 69 6d 69 74 29 20 7c 7c 0a  , p->pLimit) ||.
16ab0 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
16ac0 72 52 65 73 6f 6c 76 65 4e 61 6d 65 73 28 26 73  rResolveNames(&s
16ad0 4e 43 2c 20 70 2d 3e 70 4f 66 66 73 65 74 29 20  NC, p->pOffset) 
16ae0 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
16af0 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a  LITE_ERROR;.  }.
16b00 0a 20 20 2f 2a 20 53 65 74 20 75 70 20 74 68 65  .  /* Set up the
16b10 20 6c 6f 63 61 6c 20 6e 61 6d 65 2d 63 6f 6e 74   local name-cont
16b20 65 78 74 20 74 6f 20 70 61 73 73 20 74 6f 20 45  ext to pass to E
16b30 78 70 72 52 65 73 6f 6c 76 65 4e 61 6d 65 73 28  xprResolveNames(
16b40 29 20 74 6f 0a 20 20 2a 2a 20 72 65 73 6f 6c 76  ) to.  ** resolv
16b50 65 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  e the expression
16b60 2d 6c 69 73 74 2e 0a 20 20 2a 2f 0a 20 20 73 4e  -list..  */.  sN
16b70 43 2e 61 6c 6c 6f 77 41 67 67 20 3d 20 31 3b 0a  C.allowAgg = 1;.
16b80 20 20 73 4e 43 2e 70 53 72 63 4c 69 73 74 20 3d    sNC.pSrcList =
16b90 20 70 2d 3e 70 53 72 63 3b 0a 20 20 73 4e 43 2e   p->pSrc;.  sNC.
16ba0 70 4e 65 78 74 20 3d 20 70 4f 75 74 65 72 4e 43  pNext = pOuterNC
16bb0 3b 0a 0a 20 20 2f 2a 20 52 65 73 6f 6c 76 65 20  ;..  /* Resolve 
16bc0 6e 61 6d 65 73 20 69 6e 20 74 68 65 20 72 65 73  names in the res
16bd0 75 6c 74 20 73 65 74 2e 20 2a 2f 0a 20 20 70 45  ult set. */.  pE
16be0 4c 69 73 74 20 3d 20 70 2d 3e 70 45 4c 69 73 74  List = p->pEList
16bf0 3b 0a 20 20 69 66 28 20 21 70 45 4c 69 73 74 20  ;.  if( !pEList 
16c00 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ) return SQLITE_
16c10 45 52 52 4f 52 3b 0a 20 20 66 6f 72 28 69 3d 30  ERROR;.  for(i=0
16c20 3b 20 69 3c 70 45 4c 69 73 74 2d 3e 6e 45 78 70  ; i<pEList->nExp
16c30 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 45 78 70  r; i++){.    Exp
16c40 72 20 2a 70 58 20 3d 20 70 45 4c 69 73 74 2d 3e  r *pX = pEList->
16c50 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20  a[i].pExpr;.    
16c60 69 66 28 20 73 71 6c 69 74 65 33 45 78 70 72 52  if( sqlite3ExprR
16c70 65 73 6f 6c 76 65 4e 61 6d 65 73 28 26 73 4e 43  esolveNames(&sNC
16c80 2c 20 70 58 29 20 29 7b 0a 20 20 20 20 20 20 72  , pX) ){.      r
16c90 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52  eturn SQLITE_ERR
16ca0 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  OR;.    }.  }.. 
16cb0 20 2f 2a 20 49 66 20 74 68 65 72 65 20 61 72 65   /* If there are
16cc0 20 6e 6f 20 61 67 67 72 65 67 61 74 65 20 66 75   no aggregate fu
16cd0 6e 63 74 69 6f 6e 73 20 69 6e 20 74 68 65 20 72  nctions in the r
16ce0 65 73 75 6c 74 2d 73 65 74 2c 20 61 6e 64 20 6e  esult-set, and n
16cf0 6f 20 47 52 4f 55 50 20 42 59 20 0a 20 20 2a 2a  o GROUP BY .  **
16d00 20 65 78 70 72 65 73 73 69 6f 6e 2c 20 64 6f 20   expression, do 
16d10 6e 6f 74 20 61 6c 6c 6f 77 20 61 67 67 72 65 67  not allow aggreg
16d20 61 74 65 73 20 69 6e 20 61 6e 79 20 6f 66 20 74  ates in any of t
16d30 68 65 20 6f 74 68 65 72 20 65 78 70 72 65 73 73  he other express
16d40 69 6f 6e 73 2e 0a 20 20 2a 2f 0a 20 20 61 73 73  ions..  */.  ass
16d50 65 72 74 28 20 21 70 2d 3e 69 73 41 67 67 20 29  ert( !p->isAgg )
16d60 3b 0a 20 20 70 47 72 6f 75 70 42 79 20 3d 20 70  ;.  pGroupBy = p
16d70 2d 3e 70 47 72 6f 75 70 42 79 3b 0a 20 20 69 66  ->pGroupBy;.  if
16d80 28 20 70 47 72 6f 75 70 42 79 20 7c 7c 20 73 4e  ( pGroupBy || sN
16d90 43 2e 68 61 73 41 67 67 20 29 7b 0a 20 20 20 20  C.hasAgg ){.    
16da0 70 2d 3e 69 73 41 67 67 20 3d 20 31 3b 0a 20 20  p->isAgg = 1;.  
16db0 7d 65 6c 73 65 7b 0a 20 20 20 20 73 4e 43 2e 61  }else{.    sNC.a
16dc0 6c 6c 6f 77 41 67 67 20 3d 20 30 3b 0a 20 20 7d  llowAgg = 0;.  }
16dd0 0a 0a 20 20 2f 2a 20 49 66 20 61 20 48 41 56 49  ..  /* If a HAVI
16de0 4e 47 20 63 6c 61 75 73 65 20 69 73 20 70 72 65  NG clause is pre
16df0 73 65 6e 74 2c 20 74 68 65 6e 20 74 68 65 72 65  sent, then there
16e00 20 6d 75 73 74 20 62 65 20 61 20 47 52 4f 55 50   must be a GROUP
16e10 20 42 59 20 63 6c 61 75 73 65 2e 0a 20 20 2a 2f   BY clause..  */
16e20 0a 20 20 69 66 28 20 70 2d 3e 70 48 61 76 69 6e  .  if( p->pHavin
16e30 67 20 26 26 20 21 70 47 72 6f 75 70 42 79 20 29  g && !pGroupBy )
16e40 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72  {.    sqlite3Err
16e50 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 61  orMsg(pParse, "a
16e60 20 47 52 4f 55 50 20 42 59 20 63 6c 61 75 73 65   GROUP BY clause
16e70 20 69 73 20 72 65 71 75 69 72 65 64 20 62 65 66   is required bef
16e80 6f 72 65 20 48 41 56 49 4e 47 22 29 3b 0a 20 20  ore HAVING");.  
16e90 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
16ea0 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  ERROR;.  }..  /*
16eb0 20 41 64 64 20 74 68 65 20 65 78 70 72 65 73 73   Add the express
16ec0 69 6f 6e 20 6c 69 73 74 20 74 6f 20 74 68 65 20  ion list to the 
16ed0 6e 61 6d 65 2d 63 6f 6e 74 65 78 74 20 62 65 66  name-context bef
16ee0 6f 72 65 20 70 61 72 73 69 6e 67 20 74 68 65 0a  ore parsing the.
16ef0 20 20 2a 2a 20 6f 74 68 65 72 20 65 78 70 72 65    ** other expre
16f00 73 73 69 6f 6e 73 20 69 6e 20 74 68 65 20 53 45  ssions in the SE
16f10 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 2e 20  LECT statement. 
16f20 54 68 69 73 20 69 73 20 73 6f 20 74 68 61 74 0a  This is so that.
16f30 20 20 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 73    ** expressions
16f40 20 69 6e 20 74 68 65 20 57 48 45 52 45 20 63 6c   in the WHERE cl
16f50 61 75 73 65 20 28 65 74 63 2e 29 20 63 61 6e 20  ause (etc.) can 
16f60 72 65 66 65 72 20 74 6f 20 65 78 70 72 65 73 73  refer to express
16f70 69 6f 6e 73 20 62 79 0a 20 20 2a 2a 20 61 6c 69  ions by.  ** ali
16f80 61 73 65 73 20 69 6e 20 74 68 65 20 72 65 73 75  ases in the resu
16f90 6c 74 20 73 65 74 2e 0a 20 20 2a 2a 0a 20 20 2a  lt set..  **.  *
16fa0 2a 20 4d 69 6e 6f 72 20 70 6f 69 6e 74 3a 20 49  * Minor point: I
16fb0 66 20 74 68 69 73 20 69 73 20 74 68 65 20 63 61  f this is the ca
16fc0 73 65 2c 20 74 68 65 6e 20 74 68 65 20 65 78 70  se, then the exp
16fd0 72 65 73 73 69 6f 6e 20 77 69 6c 6c 20 62 65 0a  ression will be.
16fe0 20 20 2a 2a 20 72 65 2d 65 76 61 6c 75 61 74 65    ** re-evaluate
16ff0 64 20 66 6f 72 20 65 61 63 68 20 72 65 66 65 72  d for each refer
17000 65 6e 63 65 20 74 6f 20 69 74 2e 0a 20 20 2a 2f  ence to it..  */
17010 0a 20 20 73 4e 43 2e 70 45 4c 69 73 74 20 3d 20  .  sNC.pEList = 
17020 70 2d 3e 70 45 4c 69 73 74 3b 0a 20 20 69 66 28  p->pEList;.  if(
17030 20 73 71 6c 69 74 65 33 45 78 70 72 52 65 73 6f   sqlite3ExprReso
17040 6c 76 65 4e 61 6d 65 73 28 26 73 4e 43 2c 20 70  lveNames(&sNC, p
17050 2d 3e 70 57 68 65 72 65 29 20 7c 7c 0a 20 20 20  ->pWhere) ||.   
17060 20 20 73 71 6c 69 74 65 33 45 78 70 72 52 65 73    sqlite3ExprRes
17070 6f 6c 76 65 4e 61 6d 65 73 28 26 73 4e 43 2c 20  olveNames(&sNC, 
17080 70 2d 3e 70 48 61 76 69 6e 67 29 20 29 7b 0a 20  p->pHaving) ){. 
17090 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
170a0 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66  _ERROR;.  }.  if
170b0 28 20 70 2d 3e 70 50 72 69 6f 72 3d 3d 30 20 29  ( p->pPrior==0 )
170c0 7b 0a 20 20 20 20 69 66 28 20 70 72 6f 63 65 73  {.    if( proces
170d0 73 4f 72 64 65 72 47 72 6f 75 70 42 79 28 70 50  sOrderGroupBy(pP
170e0 61 72 73 65 2c 20 70 2c 20 70 2d 3e 70 4f 72 64  arse, p, p->pOrd
170f0 65 72 42 79 2c 20 31 2c 20 26 73 4e 43 2e 68 61  erBy, 1, &sNC.ha
17100 73 41 67 67 29 20 29 7b 0a 20 20 20 20 20 20 72  sAgg) ){.      r
17110 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52  eturn SQLITE_ERR
17120 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  OR;.    }.  }.  
17130 69 66 28 20 70 72 6f 63 65 73 73 4f 72 64 65 72  if( processOrder
17140 47 72 6f 75 70 42 79 28 70 50 61 72 73 65 2c 20  GroupBy(pParse, 
17150 70 2c 20 70 47 72 6f 75 70 42 79 2c 20 30 2c 20  p, pGroupBy, 0, 
17160 26 73 4e 43 2e 68 61 73 41 67 67 29 20 29 7b 0a  &sNC.hasAgg) ){.
17170 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
17180 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20  E_ERROR;.  }..  
17190 69 66 28 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e  if( pParse->db->
171a0 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a  mallocFailed ){.
171b0 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
171c0 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 0a 20 20  E_NOMEM;.  }..  
171d0 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65  /* Make sure the
171e0 20 47 52 4f 55 50 20 42 59 20 63 6c 61 75 73 65   GROUP BY clause
171f0 20 64 6f 65 73 20 6e 6f 74 20 63 6f 6e 74 61 69   does not contai
17200 6e 20 61 67 67 72 65 67 61 74 65 20 66 75 6e 63  n aggregate func
17210 74 69 6f 6e 73 2e 0a 20 20 2a 2f 0a 20 20 69 66  tions..  */.  if
17220 28 20 70 47 72 6f 75 70 42 79 20 29 7b 0a 20 20  ( pGroupBy ){.  
17230 20 20 73 74 72 75 63 74 20 45 78 70 72 4c 69 73    struct ExprLis
17240 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20  t_item *pItem;. 
17250 20 0a 20 20 20 20 66 6f 72 28 69 3d 30 2c 20 70   .    for(i=0, p
17260 49 74 65 6d 3d 70 47 72 6f 75 70 42 79 2d 3e 61  Item=pGroupBy->a
17270 3b 20 69 3c 70 47 72 6f 75 70 42 79 2d 3e 6e 45  ; i<pGroupBy->nE
17280 78 70 72 3b 20 69 2b 2b 2c 20 70 49 74 65 6d 2b  xpr; i++, pItem+
17290 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 45 78  +){.      if( Ex
172a0 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 49  prHasProperty(pI
172b0 74 65 6d 2d 3e 70 45 78 70 72 2c 20 45 50 5f 41  tem->pExpr, EP_A
172c0 67 67 29 20 29 7b 0a 20 20 20 20 20 20 20 20 73  gg) ){.        s
172d0 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
172e0 50 61 72 73 65 2c 20 22 61 67 67 72 65 67 61 74  Parse, "aggregat
172f0 65 20 66 75 6e 63 74 69 6f 6e 73 20 61 72 65 20  e functions are 
17300 6e 6f 74 20 61 6c 6c 6f 77 65 64 20 69 6e 20 22  not allowed in "
17310 0a 20 20 20 20 20 20 20 20 20 20 20 20 22 74 68  .            "th
17320 65 20 47 52 4f 55 50 20 42 59 20 63 6c 61 75 73  e GROUP BY claus
17330 65 22 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74  e");.        ret
17340 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52  urn SQLITE_ERROR
17350 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
17360 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 69    }..  /* If thi
17370 73 20 69 73 20 6f 6e 65 20 53 45 4c 45 43 54 20  s is one SELECT 
17380 6f 66 20 61 20 63 6f 6d 70 6f 75 6e 64 2c 20 62  of a compound, b
17390 65 20 73 75 72 65 20 74 6f 20 72 65 73 6f 6c 76  e sure to resolv
173a0 65 20 6e 61 6d 65 73 0a 20 20 2a 2a 20 69 6e 20  e names.  ** in 
173b0 74 68 65 20 6f 74 68 65 72 20 53 45 4c 45 43 54  the other SELECT
173c0 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d  s..  */.  if( p-
173d0 3e 70 50 72 69 6f 72 20 29 7b 0a 20 20 20 20 72  >pPrior ){.    r
173e0 65 74 75 72 6e 20 73 71 6c 69 74 65 33 53 65 6c  eturn sqlite3Sel
173f0 65 63 74 52 65 73 6f 6c 76 65 28 70 50 61 72 73  ectResolve(pPars
17400 65 2c 20 70 2d 3e 70 50 72 69 6f 72 2c 20 70 4f  e, p->pPrior, pO
17410 75 74 65 72 4e 43 29 3b 0a 20 20 7d 65 6c 73 65  uterNC);.  }else
17420 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
17430 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 7d 0a 0a 2f  ITE_OK;.  }.}../
17440 2a 0a 2a 2a 20 52 65 73 65 74 20 74 68 65 20 61  *.** Reset the a
17450 67 67 72 65 67 61 74 65 20 61 63 63 75 6d 75 6c  ggregate accumul
17460 61 74 6f 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  ator..**.** The 
17470 61 67 67 72 65 67 61 74 65 20 61 63 63 75 6d 75  aggregate accumu
17480 6c 61 74 6f 72 20 69 73 20 61 20 73 65 74 20 6f  lator is a set o
17490 66 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 73 20 74  f memory cells t
174a0 68 61 74 20 68 6f 6c 64 0a 2a 2a 20 69 6e 74 65  hat hold.** inte
174b0 72 6d 65 64 69 61 74 65 20 72 65 73 75 6c 74 73  rmediate results
174c0 20 77 68 69 6c 65 20 63 61 6c 63 75 6c 61 74 69   while calculati
174d0 6e 67 20 61 6e 20 61 67 67 72 65 67 61 74 65 2e  ng an aggregate.
174e0 20 20 54 68 69 73 0a 2a 2a 20 72 6f 75 74 69 6e    This.** routin
174f0 65 20 73 69 6d 70 6c 79 20 73 74 6f 72 65 73 20  e simply stores 
17500 4e 55 4c 4c 73 20 69 6e 20 61 6c 6c 20 6f 66 20  NULLs in all of 
17510 74 68 6f 73 65 20 6d 65 6d 6f 72 79 20 63 65 6c  those memory cel
17520 6c 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ls..*/.static vo
17530 69 64 20 72 65 73 65 74 41 63 63 75 6d 75 6c 61  id resetAccumula
17540 74 6f 72 28 50 61 72 73 65 20 2a 70 50 61 72 73  tor(Parse *pPars
17550 65 2c 20 41 67 67 49 6e 66 6f 20 2a 70 41 67 67  e, AggInfo *pAgg
17560 49 6e 66 6f 29 7b 0a 20 20 56 64 62 65 20 2a 76  Info){.  Vdbe *v
17570 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65   = pParse->pVdbe
17580 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 73 74 72  ;.  int i;.  str
17590 75 63 74 20 41 67 67 49 6e 66 6f 5f 66 75 6e 63  uct AggInfo_func
175a0 20 2a 70 46 75 6e 63 3b 0a 20 20 69 66 28 20 70   *pFunc;.  if( p
175b0 41 67 67 49 6e 66 6f 2d 3e 6e 46 75 6e 63 2b 70  AggInfo->nFunc+p
175c0 41 67 67 49 6e 66 6f 2d 3e 6e 43 6f 6c 75 6d 6e  AggInfo->nColumn
175d0 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ==0 ){.    retur
175e0 6e 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d 30  n;.  }.  for(i=0
175f0 3b 20 69 3c 70 41 67 67 49 6e 66 6f 2d 3e 6e 43  ; i<pAggInfo->nC
17600 6f 6c 75 6d 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20  olumn; i++){.   
17610 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
17620 70 32 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30  p2(v, OP_Null, 0
17630 2c 20 70 41 67 67 49 6e 66 6f 2d 3e 61 43 6f 6c  , pAggInfo->aCol
17640 5b 69 5d 2e 69 4d 65 6d 29 3b 0a 20 20 7d 0a 20  [i].iMem);.  }. 
17650 20 66 6f 72 28 70 46 75 6e 63 3d 70 41 67 67 49   for(pFunc=pAggI
17660 6e 66 6f 2d 3e 61 46 75 6e 63 2c 20 69 3d 30 3b  nfo->aFunc, i=0;
17670 20 69 3c 70 41 67 67 49 6e 66 6f 2d 3e 6e 46 75   i<pAggInfo->nFu
17680 6e 63 3b 20 69 2b 2b 2c 20 70 46 75 6e 63 2b 2b  nc; i++, pFunc++
17690 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  ){.    sqlite3Vd
176a0 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e  beAddOp2(v, OP_N
176b0 75 6c 6c 2c 20 30 2c 20 70 46 75 6e 63 2d 3e 69  ull, 0, pFunc->i
176c0 4d 65 6d 29 3b 0a 20 20 20 20 69 66 28 20 70 46  Mem);.    if( pF
176d0 75 6e 63 2d 3e 69 44 69 73 74 69 6e 63 74 3e 3d  unc->iDistinct>=
176e0 30 20 29 7b 0a 20 20 20 20 20 20 45 78 70 72 20  0 ){.      Expr 
176f0 2a 70 45 20 3d 20 70 46 75 6e 63 2d 3e 70 45 78  *pE = pFunc->pEx
17700 70 72 3b 0a 20 20 20 20 20 20 69 66 28 20 70 45  pr;.      if( pE
17710 2d 3e 70 4c 69 73 74 3d 3d 30 20 7c 7c 20 70 45  ->pList==0 || pE
17720 2d 3e 70 4c 69 73 74 2d 3e 6e 45 78 70 72 21 3d  ->pList->nExpr!=
17730 31 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  1 ){.        sql
17740 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
17750 72 73 65 2c 20 22 44 49 53 54 49 4e 43 54 20 69  rse, "DISTINCT i
17760 6e 20 61 67 67 72 65 67 61 74 65 20 6d 75 73 74  n aggregate must
17770 20 62 65 20 66 6f 6c 6c 6f 77 65 64 20 22 0a 20   be followed ". 
17780 20 20 20 20 20 20 20 20 20 20 22 62 79 20 61 6e            "by an
17790 20 65 78 70 72 65 73 73 69 6f 6e 22 29 3b 0a 20   expression");. 
177a0 20 20 20 20 20 20 20 70 46 75 6e 63 2d 3e 69 44         pFunc->iD
177b0 69 73 74 69 6e 63 74 20 3d 20 2d 31 3b 0a 20 20  istinct = -1;.  
177c0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
177d0 20 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79     KeyInfo *pKey
177e0 49 6e 66 6f 20 3d 20 6b 65 79 49 6e 66 6f 46 72  Info = keyInfoFr
177f0 6f 6d 45 78 70 72 4c 69 73 74 28 70 50 61 72 73  omExprList(pPars
17800 65 2c 20 70 45 2d 3e 70 4c 69 73 74 29 3b 0a 20  e, pE->pList);. 
17810 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
17820 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 4f  beAddOp4(v, OP_O
17830 70 65 6e 45 70 68 65 6d 65 72 61 6c 2c 20 70 46  penEphemeral, pF
17840 75 6e 63 2d 3e 69 44 69 73 74 69 6e 63 74 2c 20  unc->iDistinct, 
17850 30 2c 20 30 2c 0a 20 20 20 20 20 20 20 20 20 20  0, 0,.          
17860 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17870 28 63 68 61 72 2a 29 70 4b 65 79 49 6e 66 6f 2c  (char*)pKeyInfo,
17880 20 50 34 5f 4b 45 59 49 4e 46 4f 5f 48 41 4e 44   P4_KEYINFO_HAND
17890 4f 46 46 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  OFF);.      }.  
178a0 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a    }.  }.}../*.**
178b0 20 49 6e 76 6f 6b 65 20 74 68 65 20 4f 50 5f 41   Invoke the OP_A
178c0 67 67 46 69 6e 61 6c 69 7a 65 20 6f 70 63 6f 64  ggFinalize opcod
178d0 65 20 66 6f 72 20 65 76 65 72 79 20 61 67 67 72  e for every aggr
178e0 65 67 61 74 65 20 66 75 6e 63 74 69 6f 6e 0a 2a  egate function.*
178f0 2a 20 69 6e 20 74 68 65 20 41 67 67 49 6e 66 6f  * in the AggInfo
17900 20 73 74 72 75 63 74 75 72 65 2e 0a 2a 2f 0a 73   structure..*/.s
17910 74 61 74 69 63 20 76 6f 69 64 20 66 69 6e 61 6c  tatic void final
17920 69 7a 65 41 67 67 46 75 6e 63 74 69 6f 6e 73 28  izeAggFunctions(
17930 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 41  Parse *pParse, A
17940 67 67 49 6e 66 6f 20 2a 70 41 67 67 49 6e 66 6f  ggInfo *pAggInfo
17950 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70  ){.  Vdbe *v = p
17960 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20  Parse->pVdbe;.  
17970 69 6e 74 20 69 3b 0a 20 20 73 74 72 75 63 74 20  int i;.  struct 
17980 41 67 67 49 6e 66 6f 5f 66 75 6e 63 20 2a 70 46  AggInfo_func *pF
17990 3b 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70 46 3d  ;.  for(i=0, pF=
179a0 70 41 67 67 49 6e 66 6f 2d 3e 61 46 75 6e 63 3b  pAggInfo->aFunc;
179b0 20 69 3c 70 41 67 67 49 6e 66 6f 2d 3e 6e 46 75   i<pAggInfo->nFu
179c0 6e 63 3b 20 69 2b 2b 2c 20 70 46 2b 2b 29 7b 0a  nc; i++, pF++){.
179d0 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c      ExprList *pL
179e0 69 73 74 20 3d 20 70 46 2d 3e 70 45 78 70 72 2d  ist = pF->pExpr-
179f0 3e 70 4c 69 73 74 3b 0a 20 20 20 20 73 71 6c 69  >pList;.    sqli
17a00 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c  te3VdbeAddOp4(v,
17a10 20 4f 50 5f 41 67 67 46 69 6e 61 6c 2c 20 70 46   OP_AggFinal, pF
17a20 2d 3e 69 4d 65 6d 2c 20 70 4c 69 73 74 20 3f 20  ->iMem, pList ? 
17a30 70 4c 69 73 74 2d 3e 6e 45 78 70 72 20 3a 20 30  pList->nExpr : 0
17a40 2c 20 30 2c 0a 20 20 20 20 20 20 20 20 20 20 20  , 0,.           
17a50 20 20 20 20 20 20 20 20 20 20 20 28 76 6f 69 64             (void
17a60 2a 29 70 46 2d 3e 70 46 75 6e 63 2c 20 50 34 5f  *)pF->pFunc, P4_
17a70 46 55 4e 43 44 45 46 29 3b 0a 20 20 7d 0a 7d 0a  FUNCDEF);.  }.}.
17a80 0a 2f 2a 0a 2a 2a 20 55 70 64 61 74 65 20 74 68  ./*.** Update th
17a90 65 20 61 63 63 75 6d 75 6c 61 74 6f 72 20 6d 65  e accumulator me
17aa0 6d 6f 72 79 20 63 65 6c 6c 73 20 66 6f 72 20 61  mory cells for a
17ab0 6e 20 61 67 67 72 65 67 61 74 65 20 62 61 73 65  n aggregate base
17ac0 64 20 6f 6e 0a 2a 2a 20 74 68 65 20 63 75 72 72  d on.** the curr
17ad0 65 6e 74 20 63 75 72 73 6f 72 20 70 6f 73 69 74  ent cursor posit
17ae0 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ion..*/.static v
17af0 6f 69 64 20 75 70 64 61 74 65 41 63 63 75 6d 75  oid updateAccumu
17b00 6c 61 74 6f 72 28 50 61 72 73 65 20 2a 70 50 61  lator(Parse *pPa
17b10 72 73 65 2c 20 41 67 67 49 6e 66 6f 20 2a 70 41  rse, AggInfo *pA
17b20 67 67 49 6e 66 6f 29 7b 0a 20 20 56 64 62 65 20  ggInfo){.  Vdbe 
17b30 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64  *v = pParse->pVd
17b40 62 65 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 73  be;.  int i;.  s
17b50 74 72 75 63 74 20 41 67 67 49 6e 66 6f 5f 66 75  truct AggInfo_fu
17b60 6e 63 20 2a 70 46 3b 0a 20 20 73 74 72 75 63 74  nc *pF;.  struct
17b70 20 41 67 67 49 6e 66 6f 5f 63 6f 6c 20 2a 70 43   AggInfo_col *pC
17b80 3b 0a 0a 20 20 70 41 67 67 49 6e 66 6f 2d 3e 64  ;..  pAggInfo->d
17b90 69 72 65 63 74 4d 6f 64 65 20 3d 20 31 3b 0a 20  irectMode = 1;. 
17ba0 20 66 6f 72 28 69 3d 30 2c 20 70 46 3d 70 41 67   for(i=0, pF=pAg
17bb0 67 49 6e 66 6f 2d 3e 61 46 75 6e 63 3b 20 69 3c  gInfo->aFunc; i<
17bc0 70 41 67 67 49 6e 66 6f 2d 3e 6e 46 75 6e 63 3b  pAggInfo->nFunc;
17bd0 20 69 2b 2b 2c 20 70 46 2b 2b 29 7b 0a 20 20 20   i++, pF++){.   
17be0 20 69 6e 74 20 6e 41 72 67 3b 0a 20 20 20 20 69   int nArg;.    i
17bf0 6e 74 20 61 64 64 72 4e 65 78 74 20 3d 20 30 3b  nt addrNext = 0;
17c00 0a 20 20 20 20 69 6e 74 20 72 65 67 41 67 67 3b  .    int regAgg;
17c10 0a 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70  .    ExprList *p
17c20 4c 69 73 74 20 3d 20 70 46 2d 3e 70 45 78 70 72  List = pF->pExpr
17c30 2d 3e 70 4c 69 73 74 3b 0a 20 20 20 20 69 66 28  ->pList;.    if(
17c40 20 70 4c 69 73 74 20 29 7b 0a 20 20 20 20 20 20   pList ){.      
17c50 6e 41 72 67 20 3d 20 70 4c 69 73 74 2d 3e 6e 45  nArg = pList->nE
17c60 78 70 72 3b 0a 20 20 20 20 20 20 72 65 67 41 67  xpr;.      regAg
17c70 67 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65  g = sqlite3GetTe
17c80 6d 70 52 61 6e 67 65 28 70 50 61 72 73 65 2c 20  mpRange(pParse, 
17c90 6e 41 72 67 29 3b 0a 20 20 20 20 20 20 73 71 6c  nArg);.      sql
17ca0 69 74 65 33 45 78 70 72 43 6f 64 65 45 78 70 72  ite3ExprCodeExpr
17cb0 4c 69 73 74 28 70 50 61 72 73 65 2c 20 70 4c 69  List(pParse, pLi
17cc0 73 74 2c 20 72 65 67 41 67 67 2c 20 30 29 3b 0a  st, regAgg, 0);.
17cd0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
17ce0 20 6e 41 72 67 20 3d 20 30 3b 0a 20 20 20 20 20   nArg = 0;.     
17cf0 20 72 65 67 41 67 67 20 3d 20 30 3b 0a 20 20 20   regAgg = 0;.   
17d00 20 7d 0a 20 20 20 20 69 66 28 20 70 46 2d 3e 69   }.    if( pF->i
17d10 44 69 73 74 69 6e 63 74 3e 3d 30 20 29 7b 0a 20  Distinct>=0 ){. 
17d20 20 20 20 20 20 61 64 64 72 4e 65 78 74 20 3d 20       addrNext = 
17d30 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c  sqlite3VdbeMakeL
17d40 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 20 20 61  abel(v);.      a
17d50 73 73 65 72 74 28 20 6e 41 72 67 3d 3d 31 20 29  ssert( nArg==1 )
17d60 3b 0a 20 20 20 20 20 20 63 6f 64 65 44 69 73 74  ;.      codeDist
17d70 69 6e 63 74 28 70 50 61 72 73 65 2c 20 70 46 2d  inct(pParse, pF-
17d80 3e 69 44 69 73 74 69 6e 63 74 2c 20 61 64 64 72  >iDistinct, addr
17d90 4e 65 78 74 2c 20 31 2c 20 72 65 67 41 67 67 29  Next, 1, regAgg)
17da0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
17db0 70 46 2d 3e 70 46 75 6e 63 2d 3e 6e 65 65 64 43  pF->pFunc->needC
17dc0 6f 6c 6c 53 65 71 20 29 7b 0a 20 20 20 20 20 20  ollSeq ){.      
17dd0 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 20 3d  CollSeq *pColl =
17de0 20 30 3b 0a 20 20 20 20 20 20 73 74 72 75 63 74   0;.      struct
17df0 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a   ExprList_item *
17e00 70 49 74 65 6d 3b 0a 20 20 20 20 20 20 69 6e 74  pItem;.      int
17e10 20 6a 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   j;.      assert
17e20 28 20 70 4c 69 73 74 21 3d 30 20 29 3b 20 20 2f  ( pList!=0 );  /
17e30 2a 20 70 4c 69 73 74 21 3d 30 20 69 66 20 70 46  * pList!=0 if pF
17e40 2d 3e 70 46 75 6e 63 2d 3e 6e 65 65 64 43 6f 6c  ->pFunc->needCol
17e50 6c 53 65 71 20 69 73 20 74 72 75 65 20 2a 2f 0a  lSeq is true */.
17e60 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 2c 20 70        for(j=0, p
17e70 49 74 65 6d 3d 70 4c 69 73 74 2d 3e 61 3b 20 21  Item=pList->a; !
17e80 70 43 6f 6c 6c 20 26 26 20 6a 3c 6e 41 72 67 3b  pColl && j<nArg;
17e90 20 6a 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a   j++, pItem++){.
17ea0 20 20 20 20 20 20 20 20 70 43 6f 6c 6c 20 3d 20          pColl = 
17eb0 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c 53  sqlite3ExprCollS
17ec0 65 71 28 70 50 61 72 73 65 2c 20 70 49 74 65 6d  eq(pParse, pItem
17ed0 2d 3e 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20  ->pExpr);.      
17ee0 7d 0a 20 20 20 20 20 20 69 66 28 20 21 70 43 6f  }.      if( !pCo
17ef0 6c 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 70 43  ll ){.        pC
17f00 6f 6c 6c 20 3d 20 70 50 61 72 73 65 2d 3e 64 62  oll = pParse->db
17f10 2d 3e 70 44 66 6c 74 43 6f 6c 6c 3b 0a 20 20 20  ->pDfltColl;.   
17f20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74     }.      sqlit
17f30 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20  e3VdbeAddOp4(v, 
17f40 4f 50 5f 43 6f 6c 6c 53 65 71 2c 20 30 2c 20 30  OP_CollSeq, 0, 0
17f50 2c 20 30 2c 20 28 63 68 61 72 20 2a 29 70 43 6f  , 0, (char *)pCo
17f60 6c 6c 2c 20 50 34 5f 43 4f 4c 4c 53 45 51 29 3b  ll, P4_COLLSEQ);
17f70 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
17f80 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20  e3VdbeAddOp4(v, 
17f90 4f 50 5f 41 67 67 53 74 65 70 2c 20 30 2c 20 72  OP_AggStep, 0, r
17fa0 65 67 41 67 67 2c 20 70 46 2d 3e 69 4d 65 6d 2c  egAgg, pF->iMem,
17fb0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
17fc0 20 20 20 20 20 20 20 28 76 6f 69 64 2a 29 70 46         (void*)pF
17fd0 2d 3e 70 46 75 6e 63 2c 20 50 34 5f 46 55 4e 43  ->pFunc, P4_FUNC
17fe0 44 45 46 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  DEF);.    sqlite
17ff0 33 56 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c  3VdbeChangeP5(v,
18000 20 6e 41 72 67 29 3b 0a 20 20 20 20 73 71 6c 69   nArg);.    sqli
18010 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 61  te3ReleaseTempRa
18020 6e 67 65 28 70 50 61 72 73 65 2c 20 72 65 67 41  nge(pParse, regA
18030 67 67 2c 20 6e 41 72 67 29 3b 0a 20 20 20 20 73  gg, nArg);.    s
18040 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 41  qlite3ExprCacheA
18050 66 66 69 6e 69 74 79 43 68 61 6e 67 65 28 70 50  ffinityChange(pP
18060 61 72 73 65 2c 20 72 65 67 41 67 67 2c 20 6e 41  arse, regAgg, nA
18070 72 67 29 3b 0a 20 20 20 20 69 66 28 20 61 64 64  rg);.    if( add
18080 72 4e 65 78 74 20 29 7b 0a 20 20 20 20 20 20 73  rNext ){.      s
18090 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76  qlite3VdbeResolv
180a0 65 4c 61 62 65 6c 28 76 2c 20 61 64 64 72 4e 65  eLabel(v, addrNe
180b0 78 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  xt);.    }.  }. 
180c0 20 66 6f 72 28 69 3d 30 2c 20 70 43 3d 70 41 67   for(i=0, pC=pAg
180d0 67 49 6e 66 6f 2d 3e 61 43 6f 6c 3b 20 69 3c 70  gInfo->aCol; i<p
180e0 41 67 67 49 6e 66 6f 2d 3e 6e 41 63 63 75 6d 75  AggInfo->nAccumu
180f0 6c 61 74 6f 72 3b 20 69 2b 2b 2c 20 70 43 2b 2b  lator; i++, pC++
18100 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78  ){.    sqlite3Ex
18110 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70  prCode(pParse, p
18120 43 2d 3e 70 45 78 70 72 2c 20 70 43 2d 3e 69 4d  C->pExpr, pC->iM
18130 65 6d 29 3b 0a 20 20 7d 0a 20 20 70 41 67 67 49  em);.  }.  pAggI
18140 6e 66 6f 2d 3e 64 69 72 65 63 74 4d 6f 64 65 20  nfo->directMode 
18150 3d 20 30 3b 0a 7d 0a 0a 23 69 66 20 30 0a 2f 2a  = 0;.}..#if 0./*
18160 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
18170 6e 20 69 73 20 75 73 65 64 20 77 68 65 6e 20 61  n is used when a
18180 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
18190 74 20 69 73 20 75 73 65 64 20 74 6f 20 63 72 65  t is used to cre
181a0 61 74 65 20 61 0a 2a 2a 20 74 65 6d 70 6f 72 61  ate a.** tempora
181b0 72 79 20 74 61 62 6c 65 20 66 6f 72 20 69 74 65  ry table for ite
181c0 72 61 74 69 6e 67 20 74 68 72 6f 75 67 68 20 77  rating through w
181d0 68 65 6e 20 72 75 6e 6e 69 6e 67 20 61 6e 20 49  hen running an I
181e0 4e 53 54 45 41 44 20 4f 46 0a 2a 2a 20 55 50 44  NSTEAD OF.** UPD
181f0 41 54 45 20 6f 72 20 49 4e 53 54 45 41 44 20 4f  ATE or INSTEAD O
18200 46 20 44 45 4c 45 54 45 20 74 72 69 67 67 65 72  F DELETE trigger
18210 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20 70 6f 73 73  . .**.** If poss
18220 69 62 6c 65 2c 20 74 68 65 20 53 45 4c 45 43 54  ible, the SELECT
18230 20 73 74 61 74 65 6d 65 6e 74 20 69 73 20 6d 6f   statement is mo
18240 64 69 66 69 65 64 20 73 6f 20 74 68 61 74 20 4e  dified so that N
18250 55 4c 4c 20 76 61 6c 75 65 73 0a 2a 2a 20 61 72  ULL values.** ar
18260 65 20 73 74 6f 72 65 64 20 69 6e 20 74 68 65 20  e stored in the 
18270 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20  temporary table 
18280 66 6f 72 20 61 6c 6c 20 63 6f 6c 75 6d 6e 73 20  for all columns 
18290 66 6f 72 20 77 68 69 63 68 20 74 68 65 20 0a 2a  for which the .*
182a0 2a 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20  * corresponding 
182b0 62 69 74 20 69 6e 20 61 72 67 75 6d 65 6e 74 20  bit in argument 
182c0 6d 61 73 6b 20 69 73 20 6e 6f 74 20 73 65 74 2e  mask is not set.
182d0 20 49 66 20 6d 61 73 6b 20 74 61 6b 65 73 20 74   If mask takes t
182e0 68 65 0a 2a 2a 20 73 70 65 63 69 61 6c 20 76 61  he.** special va
182f0 6c 75 65 20 30 78 66 66 66 66 66 66 66 66 2c 20  lue 0xffffffff, 
18300 74 68 65 6e 20 61 6c 6c 20 63 6f 6c 75 6d 6e 73  then all columns
18310 20 61 72 65 20 70 6f 70 75 6c 61 74 65 64 2e 0a   are populated..
18320 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 53  */.void sqlite3S
18330 65 6c 65 63 74 4d 61 73 6b 28 50 61 72 73 65 20  electMask(Parse 
18340 2a 70 50 61 72 73 65 2c 20 53 65 6c 65 63 74 20  *pParse, Select 
18350 2a 70 2c 20 75 33 32 20 6d 61 73 6b 29 7b 0a 20  *p, u32 mask){. 
18360 20 69 66 28 20 70 20 26 26 20 21 70 2d 3e 70 50   if( p && !p->pP
18370 72 69 6f 72 20 26 26 20 21 70 2d 3e 69 73 44 69  rior && !p->isDi
18380 73 74 69 6e 63 74 20 26 26 20 6d 61 73 6b 21 3d  stinct && mask!=
18390 30 78 66 66 66 66 66 66 66 66 20 29 7b 0a 20 20  0xffffffff ){.  
183a0 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69    ExprList *pELi
183b0 73 74 3b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20  st;.    int i;. 
183c0 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74     sqlite3Select
183d0 52 65 73 6f 6c 76 65 28 70 50 61 72 73 65 2c 20  Resolve(pParse, 
183e0 70 2c 20 30 29 3b 0a 20 20 20 20 70 45 4c 69 73  p, 0);.    pELis
183f0 74 20 3d 20 70 2d 3e 70 45 4c 69 73 74 3b 0a 20  t = p->pEList;. 
18400 20 20 20 66 6f 72 28 69 3d 30 3b 20 70 45 4c 69     for(i=0; pELi
18410 73 74 20 26 26 20 69 3c 70 45 4c 69 73 74 2d 3e  st && i<pEList->
18420 6e 45 78 70 72 20 26 26 20 69 3c 33 32 3b 20 69  nExpr && i<32; i
18430 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 21  ++){.      if( !
18440 28 6d 61 73 6b 26 28 28 75 33 32 29 31 3c 3c 69  (mask&((u32)1<<i
18450 29 29 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  )) ){.        sq
18460 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28  lite3ExprDelete(
18470 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78  pEList->a[i].pEx
18480 70 72 29 3b 0a 20 20 20 20 20 20 20 20 70 45 4c  pr);.        pEL
18490 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 20  ist->a[i].pExpr 
184a0 3d 20 73 71 6c 69 74 65 33 45 78 70 72 28 70 50  = sqlite3Expr(pP
184b0 61 72 73 65 2d 3e 64 62 2c 20 54 4b 5f 4e 55 4c  arse->db, TK_NUL
184c0 4c 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20  L, 0, 0, 0);.   
184d0 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d     }.    }.  }.}
184e0 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 47  .#endif../*.** G
184f0 65 6e 65 72 61 74 65 20 63 6f 64 65 20 66 6f 72  enerate code for
18500 20 74 68 65 20 67 69 76 65 6e 20 53 45 4c 45 43   the given SELEC
18510 54 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 0a  T statement..**.
18520 2a 2a 20 54 68 65 20 72 65 73 75 6c 74 73 20 61  ** The results a
18530 72 65 20 64 69 73 74 72 69 62 75 74 65 64 20 69  re distributed i
18540 6e 20 76 61 72 69 6f 75 73 20 77 61 79 73 20 64  n various ways d
18550 65 70 65 6e 64 69 6e 67 20 6f 6e 20 74 68 65 0a  epending on the.
18560 2a 2a 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74  ** contents of t
18570 68 65 20 53 65 6c 65 63 74 44 65 73 74 20 73 74  he SelectDest st
18580 72 75 63 74 75 72 65 20 70 6f 69 6e 74 65 64 20  ructure pointed 
18590 74 6f 20 62 79 20 61 72 67 75 6d 65 6e 74 20 70  to by argument p
185a0 44 65 73 74 0a 2a 2a 20 61 73 20 66 6f 6c 6c 6f  Dest.** as follo
185b0 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 70 44  ws:.**.**     pD
185c0 65 73 74 2d 3e 65 44 65 73 74 20 20 20 20 52 65  est->eDest    Re
185d0 73 75 6c 74 0a 2a 2a 20 20 20 20 20 2d 2d 2d 2d  sult.**     ----
185e0 2d 2d 2d 2d 2d 2d 2d 2d 20 20 20 20 2d 2d 2d 2d  --------    ----
185f0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
18600 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
18610 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a 20 20 20 20 20 53  -------.**     S
18620 52 54 5f 43 61 6c 6c 62 61 63 6b 20 20 20 20 49  RT_Callback    I
18630 6e 76 6f 6b 65 20 74 68 65 20 63 61 6c 6c 62 61  nvoke the callba
18640 63 6b 20 66 6f 72 20 65 61 63 68 20 72 6f 77 20  ck for each row 
18650 6f 66 20 74 68 65 20 72 65 73 75 6c 74 2e 0a 2a  of the result..*
18660 2a 0a 2a 2a 20 20 20 20 20 53 52 54 5f 4d 65 6d  *.**     SRT_Mem
18670 20 20 20 20 20 20 20 20 20 53 74 6f 72 65 20 66           Store f
18680 69 72 73 74 20 72 65 73 75 6c 74 20 69 6e 20 6d  irst result in m
18690 65 6d 6f 72 79 20 63 65 6c 6c 20 70 44 65 73 74  emory cell pDest
186a0 2d 3e 69 50 61 72 6d 0a 2a 2a 0a 2a 2a 20 20 20  ->iParm.**.**   
186b0 20 20 53 52 54 5f 53 65 74 20 20 20 20 20 20 20    SRT_Set       
186c0 20 20 53 74 6f 72 65 20 6e 6f 6e 2d 6e 75 6c 6c    Store non-null
186d0 20 72 65 73 75 6c 74 73 20 61 73 20 6b 65 79 73   results as keys
186e0 20 6f 66 20 74 61 62 6c 65 20 70 44 65 73 74 2d   of table pDest-
186f0 3e 69 50 61 72 6d 2e 20 0a 2a 2a 20 20 20 20 20  >iParm. .**     
18700 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18710 41 70 70 6c 79 20 74 68 65 20 61 66 66 69 6e 69  Apply the affini
18720 74 79 20 70 44 65 73 74 2d 3e 61 66 66 69 6e 69  ty pDest->affini
18730 74 79 20 62 65 66 6f 72 65 20 73 74 6f 72 69 6e  ty before storin
18740 67 20 74 68 65 6d 2e 0a 2a 2a 0a 2a 2a 20 20 20  g them..**.**   
18750 20 20 53 52 54 5f 55 6e 69 6f 6e 20 20 20 20 20    SRT_Union     
18760 20 20 53 74 6f 72 65 20 72 65 73 75 6c 74 73 20    Store results 
18770 61 73 20 61 20 6b 65 79 20 69 6e 20 61 20 74 65  as a key in a te
18780 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20 70 44  mporary table pD
18790 65 73 74 2d 3e 69 50 61 72 6d 2e 0a 2a 2a 0a 2a  est->iParm..**.*
187a0 2a 20 20 20 20 20 53 52 54 5f 45 78 63 65 70 74  *     SRT_Except
187b0 20 20 20 20 20 20 52 65 6d 6f 76 65 20 72 65 73        Remove res
187c0 75 6c 74 73 20 66 72 6f 6d 20 74 68 65 20 74 65  ults from the te
187d0 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20 70 44  mporary table pD
187e0 65 73 74 2d 3e 69 50 61 72 6d 2e 0a 2a 2a 0a 2a  est->iParm..**.*
187f0 2a 20 20 20 20 20 53 52 54 5f 54 61 62 6c 65 20  *     SRT_Table 
18800 20 20 20 20 20 20 53 74 6f 72 65 20 72 65 73 75        Store resu
18810 6c 74 73 20 69 6e 20 74 65 6d 70 6f 72 61 72 79  lts in temporary
18820 20 74 61 62 6c 65 20 70 44 65 73 74 2d 3e 69 50   table pDest->iP
18830 61 72 6d 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 52  arm.**.**     SR
18840 54 5f 45 70 68 65 6d 54 61 62 20 20 20 20 43 72  T_EphemTab    Cr
18850 65 61 74 65 20 61 6e 20 74 65 6d 70 6f 72 61 72  eate an temporar
18860 79 20 74 61 62 6c 65 20 70 44 65 73 74 2d 3e 69  y table pDest->i
18870 50 61 72 6d 20 61 6e 64 20 73 74 6f 72 65 0a 2a  Parm and store.*
18880 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *               
18890 20 20 20 20 20 20 74 68 65 20 72 65 73 75 6c 74        the result
188a0 20 74 68 65 72 65 2e 20 54 68 65 20 63 75 72 73   there. The curs
188b0 6f 72 20 69 73 20 6c 65 66 74 20 6f 70 65 6e 20  or is left open 
188c0 61 66 74 65 72 0a 2a 2a 20 20 20 20 20 20 20 20  after.**        
188d0 20 20 20 20 20 20 20 20 20 20 20 20 20 72 65 74               ret
188e0 75 72 6e 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 20 20  urning..**.**   
188f0 20 20 53 52 54 5f 43 6f 72 6f 75 74 69 6e 65 20    SRT_Coroutine 
18900 20 20 49 6e 76 6f 6b 65 20 61 20 63 6f 2d 72 6f    Invoke a co-ro
18910 75 74 69 6e 65 20 74 6f 20 63 6f 6d 70 75 74 65  utine to compute
18920 20 61 20 73 69 6e 67 6c 65 20 72 6f 77 20 6f 66   a single row of
18930 20 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20   .**            
18940 20 20 20 20 20 20 20 20 20 74 68 65 20 72 65 73           the res
18950 75 6c 74 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 52  ult.**.**     SR
18960 54 5f 45 78 69 73 74 73 20 20 20 20 20 20 53 74  T_Exists      St
18970 6f 72 65 20 61 20 31 20 69 6e 20 6d 65 6d 6f 72  ore a 1 in memor
18980 79 20 63 65 6c 6c 20 70 44 65 73 74 2d 3e 69 50  y cell pDest->iP
18990 61 72 6d 20 69 66 20 74 68 65 20 72 65 73 75 6c  arm if the resul
189a0 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  t.**            
189b0 20 20 20 20 20 20 20 20 20 73 65 74 20 69 73 20           set is 
189c0 6e 6f 74 20 65 6d 70 74 79 2e 0a 2a 2a 0a 2a 2a  not empty..**.**
189d0 20 20 20 20 20 53 52 54 5f 44 69 73 63 61 72 64       SRT_Discard
189e0 20 20 20 20 20 54 68 72 6f 77 20 74 68 65 20 72       Throw the r
189f0 65 73 75 6c 74 73 20 61 77 61 79 2e 0a 2a 2a 0a  esults away..**.
18a00 2a 2a 20 53 65 65 20 74 68 65 20 73 65 6c 65 63  ** See the selec
18a10 74 49 6e 6e 65 72 4c 6f 6f 70 28 29 20 66 75 6e  tInnerLoop() fun
18a20 63 74 69 6f 6e 20 66 6f 72 20 61 20 63 61 6e 6f  ction for a cano
18a30 6e 69 63 61 6c 20 6c 69 73 74 69 6e 67 20 6f 66  nical listing of
18a40 20 74 68 65 20 0a 2a 2a 20 61 6c 6c 6f 77 65 64   the .** allowed
18a50 20 76 61 6c 75 65 73 20 6f 66 20 65 44 65 73 74   values of eDest
18a60 20 61 6e 64 20 74 68 65 69 72 20 6d 65 61 6e 69   and their meani
18a70 6e 67 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ngs..**.** This 
18a80 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73 20  routine returns 
18a90 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 65 72  the number of er
18aa0 72 6f 72 73 2e 20 20 49 66 20 61 6e 79 20 65 72  rors.  If any er
18ab0 72 6f 72 73 20 61 72 65 0a 2a 2a 20 65 6e 63 6f  rors are.** enco
18ac0 75 6e 74 65 72 65 64 2c 20 74 68 65 6e 20 61 6e  untered, then an
18ad0 20 61 70 70 72 6f 70 72 69 61 74 65 20 65 72 72   appropriate err
18ae0 6f 72 20 6d 65 73 73 61 67 65 20 69 73 20 6c 65  or message is le
18af0 66 74 20 69 6e 0a 2a 2a 20 70 50 61 72 73 65 2d  ft in.** pParse-
18b00 3e 7a 45 72 72 4d 73 67 2e 0a 2a 2a 0a 2a 2a 20  >zErrMsg..**.** 
18b10 54 68 69 73 20 72 6f 75 74 69 6e 65 20 64 6f 65  This routine doe
18b20 73 20 4e 4f 54 20 66 72 65 65 20 74 68 65 20 53  s NOT free the S
18b30 65 6c 65 63 74 20 73 74 72 75 63 74 75 72 65 20  elect structure 
18b40 70 61 73 73 65 64 20 69 6e 2e 20 20 54 68 65 0a  passed in.  The.
18b50 2a 2a 20 63 61 6c 6c 69 6e 67 20 66 75 6e 63 74  ** calling funct
18b60 69 6f 6e 20 6e 65 65 64 73 20 74 6f 20 64 6f 20  ion needs to do 
18b70 74 68 61 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  that..**.** The 
18b80 70 50 61 72 65 6e 74 2c 20 70 61 72 65 6e 74 54  pParent, parentT
18b90 61 62 2c 20 61 6e 64 20 2a 70 50 61 72 65 6e 74  ab, and *pParent
18ba0 41 67 67 20 66 69 65 6c 64 73 20 61 72 65 20 66  Agg fields are f
18bb0 69 6c 6c 65 64 20 69 6e 20 69 66 20 74 68 69 73  illed in if this
18bc0 0a 2a 2a 20 53 45 4c 45 43 54 20 69 73 20 61 20  .** SELECT is a 
18bd0 73 75 62 71 75 65 72 79 2e 20 20 54 68 69 73 20  subquery.  This 
18be0 72 6f 75 74 69 6e 65 20 6d 61 79 20 74 72 79 20  routine may try 
18bf0 74 6f 20 63 6f 6d 62 69 6e 65 20 74 68 69 73 20  to combine this 
18c00 53 45 4c 45 43 54 0a 2a 2a 20 77 69 74 68 20 69  SELECT.** with i
18c10 74 73 20 70 61 72 65 6e 74 20 74 6f 20 66 6f 72  ts parent to for
18c20 6d 20 61 20 73 69 6e 67 6c 65 20 66 6c 61 74 20  m a single flat 
18c30 71 75 65 72 79 2e 20 20 49 6e 20 73 6f 20 64 6f  query.  In so do
18c40 69 6e 67 2c 20 69 74 20 6d 69 67 68 74 0a 2a 2a  ing, it might.**
18c50 20 63 68 61 6e 67 65 20 74 68 65 20 70 61 72 65   change the pare
18c60 6e 74 20 71 75 65 72 79 20 66 72 6f 6d 20 61 20  nt query from a 
18c70 6e 6f 6e 2d 61 67 67 72 65 67 61 74 65 20 74 6f  non-aggregate to
18c80 20 61 6e 20 61 67 67 72 65 67 61 74 65 20 71 75   an aggregate qu
18c90 65 72 79 2e 0a 2a 2a 20 46 6f 72 20 74 68 61 74  ery..** For that
18ca0 20 72 65 61 73 6f 6e 2c 20 74 68 65 20 70 50 61   reason, the pPa
18cb0 72 65 6e 74 41 67 67 20 66 6c 61 67 20 69 73 20  rentAgg flag is 
18cc0 70 61 73 73 65 64 20 61 73 20 61 20 70 6f 69 6e  passed as a poin
18cd0 74 65 72 2c 20 73 6f 20 69 74 0a 2a 2a 20 63 61  ter, so it.** ca
18ce0 6e 20 62 65 20 63 68 61 6e 67 65 64 2e 0a 2a 2a  n be changed..**
18cf0 0a 2a 2a 20 45 78 61 6d 70 6c 65 20 31 3a 20 20  .** Example 1:  
18d00 20 54 68 65 20 6d 65 61 6e 69 6e 67 20 6f 66 20   The meaning of 
18d10 74 68 65 20 70 50 61 72 65 6e 74 20 70 61 72 61  the pParent para
18d20 6d 65 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 20 20 20  meter..**.**    
18d30 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31  SELECT * FROM t1
18d40 20 4a 4f 49 4e 20 28 53 45 4c 45 43 54 20 78 2c   JOIN (SELECT x,
18d50 20 63 6f 75 6e 74 28 2a 29 20 46 52 4f 4d 20 74   count(*) FROM t
18d60 32 29 20 4a 4f 49 4e 20 74 33 3b 0a 2a 2a 20 20  2) JOIN t3;.**  
18d70 20 20 5c 20 20 20 20 20 20 20 20 20 20 20 20 20    \             
18d80 20 20 20 20 20 20 20 20 20 5c 5f 5f 5f 5f 5f 5f           \______
18d90 5f 20 73 75 62 71 75 65 72 79 20 5f 5f 5f 5f 5f  _ subquery _____
18da0 5f 5f 2f 20 20 20 20 20 20 20 20 2f 0a 2a 2a 20  __/        /.** 
18db0 20 20 20 20 5c 20 20 20 20 20 20 20 20 20 20 20      \           
18dc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18dd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18de0 20 20 20 20 20 20 20 20 20 20 20 2f 0a 2a 2a 20             /.** 
18df0 20 20 20 20 20 5c 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f       \__________
18e00 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 20 6f 75 74 65 72  __________ outer
18e10 20 71 75 65 72 79 20 5f 5f 5f 5f 5f 5f 5f 5f 5f   query _________
18e20 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 2f 0a 2a 2a 0a 2a  __________/.**.*
18e30 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
18e40 73 20 63 61 6c 6c 65 64 20 66 6f 72 20 74 68 65  s called for the
18e50 20 6f 75 74 65 72 20 71 75 65 72 79 20 66 69 72   outer query fir
18e60 73 74 2e 20 20 20 46 6f 72 20 74 68 61 74 20 63  st.   For that c
18e70 61 6c 6c 2c 0a 2a 2a 20 70 50 61 72 65 6e 74 20  all,.** pParent 
18e80 77 69 6c 6c 20 62 65 20 4e 55 4c 4c 2e 20 20 44  will be NULL.  D
18e90 75 72 69 6e 67 20 74 68 65 20 70 72 6f 63 65 73  uring the proces
18ea0 73 69 6e 67 20 6f 66 20 74 68 65 20 6f 75 74 65  sing of the oute
18eb0 72 20 71 75 65 72 79 2c 20 74 68 69 73 20 0a 2a  r query, this .*
18ec0 2a 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c  * routine is cal
18ed0 6c 65 64 20 72 65 63 75 72 73 69 76 65 6c 79 20  led recursively 
18ee0 74 6f 20 68 61 6e 64 6c 65 20 74 68 65 20 73 75  to handle the su
18ef0 62 71 75 65 72 79 2e 20 20 46 6f 72 20 74 68 65  bquery.  For the
18f00 20 72 65 63 75 72 73 69 76 65 0a 2a 2a 20 63 61   recursive.** ca
18f10 6c 6c 2c 20 70 50 61 72 65 6e 74 20 77 69 6c 6c  ll, pParent will
18f20 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 6f 75   point to the ou
18f30 74 65 72 20 71 75 65 72 79 2e 20 20 42 65 63 61  ter query.  Beca
18f40 75 73 65 20 74 68 65 20 73 75 62 71 75 65 72 79  use the subquery
18f50 20 69 73 0a 2a 2a 20 74 68 65 20 73 65 63 6f 6e   is.** the secon
18f60 64 20 65 6c 65 6d 65 6e 74 20 69 6e 20 61 20 74  d element in a t
18f70 68 72 65 65 2d 77 61 79 20 6a 6f 69 6e 2c 20 74  hree-way join, t
18f80 68 65 20 70 61 72 65 6e 74 54 61 62 20 70 61 72  he parentTab par
18f90 61 6d 65 74 65 72 20 77 69 6c 6c 0a 2a 2a 20 62  ameter will.** b
18fa0 65 20 31 20 28 74 68 65 20 32 6e 64 20 76 61 6c  e 1 (the 2nd val
18fb0 75 65 20 6f 66 20 61 20 30 2d 69 6e 64 65 78 65  ue of a 0-indexe
18fc0 64 20 61 72 72 61 79 2e 29 0a 2a 2f 0a 69 6e 74  d array.).*/.int
18fd0 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28 0a   sqlite3Select(.
18fe0 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
18ff0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
19000 70 61 72 73 65 72 20 63 6f 6e 74 65 78 74 20 2a  parser context *
19010 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 2c 20 20  /.  Select *p,  
19020 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
19030 65 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  e SELECT stateme
19040 6e 74 20 62 65 69 6e 67 20 63 6f 64 65 64 2e 20  nt being coded. 
19050 2a 2f 0a 20 20 53 65 6c 65 63 74 44 65 73 74 20  */.  SelectDest 
19060 2a 70 44 65 73 74 2c 20 20 20 20 20 2f 2a 20 57  *pDest,     /* W
19070 68 61 74 20 74 6f 20 64 6f 20 77 69 74 68 20 74  hat to do with t
19080 68 65 20 71 75 65 72 79 20 72 65 73 75 6c 74 73  he query results
19090 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 50   */.  Select *pP
190a0 61 72 65 6e 74 2c 20 20 20 20 20 20 20 2f 2a 20  arent,       /* 
190b0 41 6e 6f 74 68 65 72 20 53 45 4c 45 43 54 20 66  Another SELECT f
190c0 6f 72 20 77 68 69 63 68 20 74 68 69 73 20 69 73  or which this is
190d0 20 61 20 73 75 62 2d 71 75 65 72 79 20 2a 2f 0a   a sub-query */.
190e0 20 20 69 6e 74 20 70 61 72 65 6e 74 54 61 62 2c    int parentTab,
190f0 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65           /* Inde
19100 78 20 69 6e 20 70 50 61 72 65 6e 74 2d 3e 70 53  x in pParent->pS
19110 72 63 20 6f 66 20 74 68 69 73 20 71 75 65 72 79  rc of this query
19120 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 50 61 72 65   */.  int *pPare
19130 6e 74 41 67 67 2c 20 20 20 20 20 20 20 2f 2a 20  ntAgg,       /* 
19140 54 72 75 65 20 69 66 20 70 50 61 72 65 6e 74 20  True if pParent 
19150 75 73 65 73 20 61 67 67 72 65 67 61 74 65 20 66  uses aggregate f
19160 75 6e 63 74 69 6f 6e 73 20 2a 2f 0a 20 20 63 68  unctions */.  ch
19170 61 72 20 2a 61 66 66 20 20 20 20 20 20 20 20 20  ar *aff         
19180 20 20 20 20 20 2f 2a 20 49 66 20 65 44 65 73 74       /* If eDest
19190 20 69 73 20 53 52 54 5f 55 6e 69 6f 6e 2c 20 74   is SRT_Union, t
191a0 68 65 20 61 66 66 69 6e 69 74 79 20 73 74 72 69  he affinity stri
191b0 6e 67 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69  ng */.){.  int i
191c0 2c 20 6a 3b 20 20 20 20 20 20 20 20 20 20 20 20  , j;            
191d0 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65    /* Loop counte
191e0 72 73 20 2a 2f 0a 20 20 57 68 65 72 65 49 6e 66  rs */.  WhereInf
191f0 6f 20 2a 70 57 49 6e 66 6f 3b 20 20 20 20 20 2f  o *pWInfo;     /
19200 2a 20 52 65 74 75 72 6e 20 66 72 6f 6d 20 73 71  * Return from sq
19210 6c 69 74 65 33 57 68 65 72 65 42 65 67 69 6e 28  lite3WhereBegin(
19220 29 20 2a 2f 0a 20 20 56 64 62 65 20 2a 76 3b 20  ) */.  Vdbe *v; 
19230 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
19240 20 54 68 65 20 76 69 72 74 75 61 6c 20 6d 61 63   The virtual mac
19250 68 69 6e 65 20 75 6e 64 65 72 20 63 6f 6e 73 74  hine under const
19260 72 75 63 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74  ruction */.  int
19270 20 69 73 41 67 67 3b 20 20 20 20 20 20 20 20 20   isAgg;         
19280 20 20 20 20 2f 2a 20 54 72 75 65 20 66 6f 72 20      /* True for 
19290 73 65 6c 65 63 74 20 6c 69 73 74 73 20 6c 69 6b  select lists lik
192a0 65 20 22 63 6f 75 6e 74 28 2a 29 22 20 2a 2f 0a  e "count(*)" */.
192b0 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69    ExprList *pELi
192c0 73 74 3b 20 20 20 20 20 20 2f 2a 20 4c 69 73 74  st;      /* List
192d0 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 74 6f 20 65   of columns to e
192e0 78 74 72 61 63 74 2e 20 2a 2f 0a 20 20 53 72 63  xtract. */.  Src
192f0 4c 69 73 74 20 2a 70 54 61 62 4c 69 73 74 3b 20  List *pTabList; 
19300 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 74      /* List of t
19310 61 62 6c 65 73 20 74 6f 20 73 65 6c 65 63 74 20  ables to select 
19320 66 72 6f 6d 20 2a 2f 0a 20 20 45 78 70 72 20 2a  from */.  Expr *
19330 70 57 68 65 72 65 3b 20 20 20 20 20 20 20 20 20  pWhere;         
19340 20 2f 2a 20 54 68 65 20 57 48 45 52 45 20 63 6c   /* The WHERE cl
19350 61 75 73 65 2e 20 20 4d 61 79 20 62 65 20 4e 55  ause.  May be NU
19360 4c 4c 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74  LL */.  ExprList
19370 20 2a 70 4f 72 64 65 72 42 79 3b 20 20 20 20 2f   *pOrderBy;    /
19380 2a 20 54 68 65 20 4f 52 44 45 52 20 42 59 20 63  * The ORDER BY c
19390 6c 61 75 73 65 2e 20 20 4d 61 79 20 62 65 20 4e  lause.  May be N
193a0 55 4c 4c 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73  ULL */.  ExprLis
193b0 74 20 2a 70 47 72 6f 75 70 42 79 3b 20 20 20 20  t *pGroupBy;    
193c0 2f 2a 20 54 68 65 20 47 52 4f 55 50 20 42 59 20  /* The GROUP BY 
193d0 63 6c 61 75 73 65 2e 20 20 4d 61 79 20 62 65 20  clause.  May be 
193e0 4e 55 4c 4c 20 2a 2f 0a 20 20 45 78 70 72 20 2a  NULL */.  Expr *
193f0 70 48 61 76 69 6e 67 3b 20 20 20 20 20 20 20 20  pHaving;        
19400 20 2f 2a 20 54 68 65 20 48 41 56 49 4e 47 20 63   /* The HAVING c
19410 6c 61 75 73 65 2e 20 20 4d 61 79 20 62 65 20 4e  lause.  May be N
19420 55 4c 4c 20 2a 2f 0a 20 20 69 6e 74 20 69 73 44  ULL */.  int isD
19430 69 73 74 69 6e 63 74 3b 20 20 20 20 20 20 20 20  istinct;        
19440 2f 2a 20 54 72 75 65 20 69 66 20 74 68 65 20 44  /* True if the D
19450 49 53 54 49 4e 43 54 20 6b 65 79 77 6f 72 64 20  ISTINCT keyword 
19460 69 73 20 70 72 65 73 65 6e 74 20 2a 2f 0a 20 20  is present */.  
19470 69 6e 74 20 64 69 73 74 69 6e 63 74 3b 20 20 20  int distinct;   
19480 20 20 20 20 20 20 20 2f 2a 20 54 61 62 6c 65 20         /* Table 
19490 74 6f 20 75 73 65 20 66 6f 72 20 74 68 65 20 64  to use for the d
194a0 69 73 74 69 6e 63 74 20 73 65 74 20 2a 2f 0a 20  istinct set */. 
194b0 20 69 6e 74 20 72 63 20 3d 20 31 3b 20 20 20 20   int rc = 1;    
194c0 20 20 20 20 20 20 20 20 2f 2a 20 56 61 6c 75 65          /* Value
194d0 20 74 6f 20 72 65 74 75 72 6e 20 66 72 6f 6d 20   to return from 
194e0 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 2a 2f  this function */
194f0 0a 20 20 69 6e 74 20 61 64 64 72 53 6f 72 74 49  .  int addrSortI
19500 6e 64 65 78 3b 20 20 20 20 20 2f 2a 20 41 64 64  ndex;     /* Add
19510 72 65 73 73 20 6f 66 20 61 6e 20 4f 50 5f 4f 70  ress of an OP_Op
19520 65 6e 45 70 68 65 6d 65 72 61 6c 20 69 6e 73 74  enEphemeral inst
19530 72 75 63 74 69 6f 6e 20 2a 2f 0a 20 20 41 67 67  ruction */.  Agg
19540 49 6e 66 6f 20 73 41 67 67 49 6e 66 6f 3b 20 20  Info sAggInfo;  
19550 20 20 20 20 2f 2a 20 49 6e 66 6f 72 6d 61 74 69      /* Informati
19560 6f 6e 20 75 73 65 64 20 62 79 20 61 67 67 72 65  on used by aggre
19570 67 61 74 65 20 71 75 65 72 69 65 73 20 2a 2f 0a  gate queries */.
19580 20 20 69 6e 74 20 69 45 6e 64 3b 20 20 20 20 20    int iEnd;     
19590 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72           /* Addr
195a0 65 73 73 20 6f 66 20 74 68 65 20 65 6e 64 20 6f  ess of the end o
195b0 66 20 74 68 65 20 71 75 65 72 79 20 2a 2f 0a 20  f the query */. 
195c0 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 20 20 20   sqlite3 *db;   
195d0 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 64          /* The d
195e0 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69  atabase connecti
195f0 6f 6e 20 2a 2f 0a 0a 20 20 64 62 20 3d 20 70 50  on */..  db = pP
19600 61 72 73 65 2d 3e 64 62 3b 0a 20 20 69 66 28 20  arse->db;.  if( 
19610 70 3d 3d 30 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c  p==0 || db->mall
19620 6f 63 46 61 69 6c 65 64 20 7c 7c 20 70 50 61 72  ocFailed || pPar
19630 73 65 2d 3e 6e 45 72 72 20 29 7b 0a 20 20 20 20  se->nErr ){.    
19640 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20  return 1;.  }.  
19650 69 66 28 20 73 71 6c 69 74 65 33 41 75 74 68 43  if( sqlite3AuthC
19660 68 65 63 6b 28 70 50 61 72 73 65 2c 20 53 51 4c  heck(pParse, SQL
19670 49 54 45 5f 53 45 4c 45 43 54 2c 20 30 2c 20 30  ITE_SELECT, 0, 0
19680 2c 20 30 29 20 29 20 72 65 74 75 72 6e 20 31 3b  , 0) ) return 1;
19690 0a 20 20 6d 65 6d 73 65 74 28 26 73 41 67 67 49  .  memset(&sAggI
196a0 6e 66 6f 2c 20 30 2c 20 73 69 7a 65 6f 66 28 73  nfo, 0, sizeof(s
196b0 41 67 67 49 6e 66 6f 29 29 3b 0a 0a 20 20 70 4f  AggInfo));..  pO
196c0 72 64 65 72 42 79 20 3d 20 70 2d 3e 70 4f 72 64  rderBy = p->pOrd
196d0 65 72 42 79 3b 0a 20 20 69 66 28 20 49 67 6e 6f  erBy;.  if( Igno
196e0 72 61 62 6c 65 4f 72 64 65 72 62 79 28 70 44 65  rableOrderby(pDe
196f0 73 74 29 20 29 7b 0a 20 20 20 20 70 2d 3e 70 4f  st) ){.    p->pO
19700 72 64 65 72 42 79 20 3d 20 30 3b 0a 0a 20 20 20  rderBy = 0;..   
19710 20 2f 2a 20 49 6e 20 74 68 65 73 65 20 63 61 73   /* In these cas
19720 65 73 20 74 68 65 20 44 49 53 54 49 4e 43 54 20  es the DISTINCT 
19730 6f 70 65 72 61 74 6f 72 20 6d 61 6b 65 73 20 6e  operator makes n
19740 6f 20 64 69 66 66 65 72 65 6e 63 65 20 74 6f 20  o difference to 
19750 74 68 65 0a 20 20 20 20 2a 2a 20 72 65 73 75 6c  the.    ** resul
19760 74 73 2c 20 73 6f 20 72 65 6d 6f 76 65 20 69 74  ts, so remove it
19770 20 69 66 20 69 74 20 77 65 72 65 20 73 70 65 63   if it were spec
19780 69 66 69 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20  ified..    */.  
19790 20 20 61 73 73 65 72 74 28 70 44 65 73 74 2d 3e    assert(pDest->
197a0 65 44 65 73 74 3d 3d 53 52 54 5f 45 78 69 73 74  eDest==SRT_Exist
197b0 73 20 7c 7c 20 70 44 65 73 74 2d 3e 65 44 65 73  s || pDest->eDes
197c0 74 3d 3d 53 52 54 5f 55 6e 69 6f 6e 20 7c 7c 20  t==SRT_Union || 
197d0 0a 20 20 20 20 20 20 20 20 20 20 20 70 44 65 73  .           pDes
197e0 74 2d 3e 65 44 65 73 74 3d 3d 53 52 54 5f 45 78  t->eDest==SRT_Ex
197f0 63 65 70 74 20 7c 7c 20 70 44 65 73 74 2d 3e 65  cept || pDest->e
19800 44 65 73 74 3d 3d 53 52 54 5f 44 69 73 63 61 72  Dest==SRT_Discar
19810 64 29 3b 0a 20 20 20 20 70 2d 3e 69 73 44 69 73  d);.    p->isDis
19820 74 69 6e 63 74 20 3d 20 30 3b 0a 20 20 7d 0a 20  tinct = 0;.  }. 
19830 20 69 66 28 20 73 71 6c 69 74 65 33 53 65 6c 65   if( sqlite3Sele
19840 63 74 52 65 73 6f 6c 76 65 28 70 50 61 72 73 65  ctResolve(pParse
19850 2c 20 70 2c 20 30 29 20 29 7b 0a 20 20 20 20 67  , p, 0) ){.    g
19860 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a  oto select_end;.
19870 20 20 7d 0a 20 20 70 2d 3e 70 4f 72 64 65 72 42    }.  p->pOrderB
19880 79 20 3d 20 70 4f 72 64 65 72 42 79 3b 0a 0a 23  y = pOrderBy;..#
19890 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
198a0 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45  IT_COMPOUND_SELE
198b0 43 54 0a 20 20 2f 2a 20 49 66 20 74 68 65 72 65  CT.  /* If there
198c0 20 69 73 20 61 72 65 20 61 20 73 65 71 75 65 6e   is are a sequen
198d0 63 65 20 6f 66 20 71 75 65 72 69 65 73 2c 20 64  ce of queries, d
198e0 6f 20 74 68 65 20 65 61 72 6c 69 65 72 20 6f 6e  o the earlier on
198f0 65 73 20 66 69 72 73 74 2e 0a 20 20 2a 2f 0a 20  es first..  */. 
19900 20 69 66 28 20 70 2d 3e 70 50 72 69 6f 72 20 29   if( p->pPrior )
19910 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e 70 52 69  {.    if( p->pRi
19920 67 68 74 6d 6f 73 74 3d 3d 30 20 29 7b 0a 20 20  ghtmost==0 ){.  
19930 20 20 20 20 53 65 6c 65 63 74 20 2a 70 4c 6f 6f      Select *pLoo
19940 70 2c 20 2a 70 52 69 67 68 74 20 3d 20 30 3b 0a  p, *pRight = 0;.
19950 20 20 20 20 20 20 69 6e 74 20 63 6e 74 20 3d 20        int cnt = 
19960 30 3b 0a 20 20 20 20 20 20 69 6e 74 20 6d 78 53  0;.      int mxS
19970 65 6c 65 63 74 3b 0a 20 20 20 20 20 20 66 6f 72  elect;.      for
19980 28 70 4c 6f 6f 70 3d 70 3b 20 70 4c 6f 6f 70 3b  (pLoop=p; pLoop;
19990 20 70 4c 6f 6f 70 3d 70 4c 6f 6f 70 2d 3e 70 50   pLoop=pLoop->pP
199a0 72 69 6f 72 2c 20 63 6e 74 2b 2b 29 7b 0a 20 20  rior, cnt++){.  
199b0 20 20 20 20 20 20 70 4c 6f 6f 70 2d 3e 70 52 69        pLoop->pRi
199c0 67 68 74 6d 6f 73 74 20 3d 20 70 3b 0a 20 20 20  ghtmost = p;.   
199d0 20 20 20 20 20 70 4c 6f 6f 70 2d 3e 70 4e 65 78       pLoop->pNex
199e0 74 20 3d 20 70 52 69 67 68 74 3b 0a 20 20 20 20  t = pRight;.    
199f0 20 20 20 20 70 52 69 67 68 74 20 3d 20 70 4c 6f      pRight = pLo
19a00 6f 70 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  op;.      }.    
19a10 20 20 6d 78 53 65 6c 65 63 74 20 3d 20 64 62 2d    mxSelect = db-
19a20 3e 61 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c  >aLimit[SQLITE_L
19a30 49 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45  IMIT_COMPOUND_SE
19a40 4c 45 43 54 5d 3b 0a 20 20 20 20 20 20 69 66 28  LECT];.      if(
19a50 20 6d 78 53 65 6c 65 63 74 20 26 26 20 63 6e 74   mxSelect && cnt
19a60 3e 6d 78 53 65 6c 65 63 74 20 29 7b 0a 20 20 20  >mxSelect ){.   
19a70 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f       sqlite3Erro
19a80 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 74 6f  rMsg(pParse, "to
19a90 6f 20 6d 61 6e 79 20 74 65 72 6d 73 20 69 6e 20  o many terms in 
19aa0 63 6f 6d 70 6f 75 6e 64 20 53 45 4c 45 43 54 22  compound SELECT"
19ab0 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  );.        retur
19ac0 6e 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  n 1;.      }.   
19ad0 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 6d 75   }.    return mu
19ae0 6c 74 69 53 65 6c 65 63 74 28 70 50 61 72 73 65  ltiSelect(pParse
19af0 2c 20 70 2c 20 70 44 65 73 74 2c 20 61 66 66 29  , p, pDest, aff)
19b00 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20  ;.  }.#endif..  
19b10 2f 2a 20 4d 61 6b 65 20 6c 6f 63 61 6c 20 63 6f  /* Make local co
19b20 70 69 65 73 20 6f 66 20 74 68 65 20 70 61 72 61  pies of the para
19b30 6d 65 74 65 72 73 20 66 6f 72 20 74 68 69 73 20  meters for this 
19b40 71 75 65 72 79 2e 0a 20 20 2a 2f 0a 20 20 70 54  query..  */.  pT
19b50 61 62 4c 69 73 74 20 3d 20 70 2d 3e 70 53 72 63  abList = p->pSrc
19b60 3b 0a 20 20 70 57 68 65 72 65 20 3d 20 70 2d 3e  ;.  pWhere = p->
19b70 70 57 68 65 72 65 3b 0a 20 20 70 47 72 6f 75 70  pWhere;.  pGroup
19b80 42 79 20 3d 20 70 2d 3e 70 47 72 6f 75 70 42 79  By = p->pGroupBy
19b90 3b 0a 20 20 70 48 61 76 69 6e 67 20 3d 20 70 2d  ;.  pHaving = p-
19ba0 3e 70 48 61 76 69 6e 67 3b 0a 20 20 69 73 41 67  >pHaving;.  isAg
19bb0 67 20 3d 20 70 2d 3e 69 73 41 67 67 3b 0a 20 20  g = p->isAgg;.  
19bc0 69 73 44 69 73 74 69 6e 63 74 20 3d 20 70 2d 3e  isDistinct = p->
19bd0 69 73 44 69 73 74 69 6e 63 74 3b 0a 20 20 70 45  isDistinct;.  pE
19be0 4c 69 73 74 20 3d 20 70 2d 3e 70 45 4c 69 73 74  List = p->pEList
19bf0 3b 0a 20 20 69 66 28 20 70 45 4c 69 73 74 3d 3d  ;.  if( pEList==
19c00 30 20 29 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f  0 ) goto select_
19c10 65 6e 64 3b 0a 0a 20 20 2f 2a 20 0a 20 20 2a 2a  end;..  /* .  **
19c20 20 44 6f 20 6e 6f 74 20 65 76 65 6e 20 61 74 74   Do not even att
19c30 65 6d 70 74 20 74 6f 20 67 65 6e 65 72 61 74 65  empt to generate
19c40 20 61 6e 79 20 63 6f 64 65 20 69 66 20 77 65 20   any code if we 
19c50 68 61 76 65 20 61 6c 72 65 61 64 79 20 73 65 65  have already see
19c60 6e 0a 20 20 2a 2a 20 65 72 72 6f 72 73 20 62 65  n.  ** errors be
19c70 66 6f 72 65 20 74 68 69 73 20 72 6f 75 74 69 6e  fore this routin
19c80 65 20 73 74 61 72 74 73 2e 0a 20 20 2a 2f 0a 20  e starts..  */. 
19c90 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 45 72   if( pParse->nEr
19ca0 72 3e 30 20 29 20 67 6f 74 6f 20 73 65 6c 65 63  r>0 ) goto selec
19cb0 74 5f 65 6e 64 3b 0a 0a 20 20 2f 2a 20 49 66 20  t_end;..  /* If 
19cc0 77 72 69 74 69 6e 67 20 74 6f 20 6d 65 6d 6f 72  writing to memor
19cd0 79 20 6f 72 20 67 65 6e 65 72 61 74 69 6e 67 20  y or generating 
19ce0 61 20 73 65 74 0a 20 20 2a 2a 20 6f 6e 6c 79 20  a set.  ** only 
19cf0 61 20 73 69 6e 67 6c 65 20 63 6f 6c 75 6d 6e 20  a single column 
19d00 6d 61 79 20 62 65 20 6f 75 74 70 75 74 2e 0a 20  may be output.. 
19d10 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49   */.#ifndef SQLI
19d20 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59  TE_OMIT_SUBQUERY
19d30 0a 20 20 69 66 28 20 63 68 65 63 6b 46 6f 72 4d  .  if( checkForM
19d40 75 6c 74 69 43 6f 6c 75 6d 6e 53 65 6c 65 63 74  ultiColumnSelect
19d50 45 72 72 6f 72 28 70 50 61 72 73 65 2c 20 70 44  Error(pParse, pD
19d60 65 73 74 2c 20 70 45 4c 69 73 74 2d 3e 6e 45 78  est, pEList->nEx
19d70 70 72 29 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20  pr) ){.    goto 
19d80 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 7d 0a  select_end;.  }.
19d90 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 4f 52 44  #endif..  /* ORD
19da0 45 52 20 42 59 20 69 73 20 69 67 6e 6f 72 65 64  ER BY is ignored
19db0 20 66 6f 72 20 73 6f 6d 65 20 64 65 73 74 69 6e   for some destin
19dc0 61 74 69 6f 6e 73 2e 0a 20 20 2a 2f 0a 20 20 69  ations..  */.  i
19dd0 66 28 20 49 67 6e 6f 72 61 62 6c 65 4f 72 64 65  f( IgnorableOrde
19de0 72 62 79 28 70 44 65 73 74 29 20 29 7b 0a 20 20  rby(pDest) ){.  
19df0 20 20 70 4f 72 64 65 72 42 79 20 3d 20 30 3b 0a    pOrderBy = 0;.
19e00 20 20 7d 0a 0a 20 20 2f 2a 20 42 65 67 69 6e 20    }..  /* Begin 
19e10 67 65 6e 65 72 61 74 69 6e 67 20 63 6f 64 65 2e  generating code.
19e20 0a 20 20 2a 2f 0a 20 20 76 20 3d 20 73 71 6c 69  .  */.  v = sqli
19e30 74 65 33 47 65 74 56 64 62 65 28 70 50 61 72 73  te3GetVdbe(pPars
19e40 65 29 3b 0a 20 20 69 66 28 20 76 3d 3d 30 20 29  e);.  if( v==0 )
19e50 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64   goto select_end
19e60 3b 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65  ;..  /* Generate
19e70 20 63 6f 64 65 20 66 6f 72 20 61 6c 6c 20 73 75   code for all su
19e80 62 2d 71 75 65 72 69 65 73 20 69 6e 20 74 68 65  b-queries in the
19e90 20 46 52 4f 4d 20 63 6c 61 75 73 65 0a 20 20 2a   FROM clause.  *
19ea0 2f 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53  /.#if !defined(S
19eb0 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55  QLITE_OMIT_SUBQU
19ec0 45 52 59 29 20 7c 7c 20 21 64 65 66 69 6e 65 64  ERY) || !defined
19ed0 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45  (SQLITE_OMIT_VIE
19ee0 57 29 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  W).  for(i=0; i<
19ef0 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3b 20  pTabList->nSrc; 
19f00 69 2b 2b 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20  i++){.    const 
19f10 63 68 61 72 20 2a 7a 53 61 76 65 64 41 75 74 68  char *zSavedAuth
19f20 43 6f 6e 74 65 78 74 20 3d 20 30 3b 0a 20 20 20  Context = 0;.   
19f30 20 69 6e 74 20 6e 65 65 64 52 65 73 74 6f 72 65   int needRestore
19f40 43 6f 6e 74 65 78 74 3b 0a 20 20 20 20 73 74 72  Context;.    str
19f50 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d  uct SrcList_item
19f60 20 2a 70 49 74 65 6d 20 3d 20 26 70 54 61 62 4c   *pItem = &pTabL
19f70 69 73 74 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20 53  ist->a[i];.    S
19f80 65 6c 65 63 74 44 65 73 74 20 64 65 73 74 3b 0a  electDest dest;.
19f90 0a 20 20 20 20 69 66 28 20 70 49 74 65 6d 2d 3e  .    if( pItem->
19fa0 70 53 65 6c 65 63 74 3d 3d 30 20 7c 7c 20 70 49  pSelect==0 || pI
19fb0 74 65 6d 2d 3e 69 73 50 6f 70 75 6c 61 74 65 64  tem->isPopulated
19fc0 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
19fd0 20 69 66 28 20 70 49 74 65 6d 2d 3e 7a 4e 61 6d   if( pItem->zNam
19fe0 65 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 7a 53  e!=0 ){.      zS
19ff0 61 76 65 64 41 75 74 68 43 6f 6e 74 65 78 74 20  avedAuthContext 
1a000 3d 20 70 50 61 72 73 65 2d 3e 7a 41 75 74 68 43  = pParse->zAuthC
1a010 6f 6e 74 65 78 74 3b 0a 20 20 20 20 20 20 70 50  ontext;.      pP
1a020 61 72 73 65 2d 3e 7a 41 75 74 68 43 6f 6e 74 65  arse->zAuthConte
1a030 78 74 20 3d 20 70 49 74 65 6d 2d 3e 7a 4e 61 6d  xt = pItem->zNam
1a040 65 3b 0a 20 20 20 20 20 20 6e 65 65 64 52 65 73  e;.      needRes
1a050 74 6f 72 65 43 6f 6e 74 65 78 74 20 3d 20 31 3b  toreContext = 1;
1a060 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
1a070 20 20 6e 65 65 64 52 65 73 74 6f 72 65 43 6f 6e    needRestoreCon
1a080 74 65 78 74 20 3d 20 30 3b 0a 20 20 20 20 7d 0a  text = 0;.    }.
1a090 20 20 20 20 2f 2a 20 49 6e 63 72 65 6d 65 6e 74      /* Increment
1a0a0 20 50 61 72 73 65 2e 6e 48 65 69 67 68 74 20 62   Parse.nHeight b
1a0b0 79 20 74 68 65 20 68 65 69 67 68 74 20 6f 66 20  y the height of 
1a0c0 74 68 65 20 6c 61 72 67 65 73 74 20 65 78 70 72  the largest expr
1a0d0 65 73 73 69 6f 6e 0a 20 20 20 20 2a 2a 20 74 72  ession.    ** tr
1a0e0 65 65 20 72 65 66 65 72 65 64 20 74 6f 20 62 79  ee refered to by
1a0f0 20 74 68 69 73 2c 20 74 68 65 20 70 61 72 65 6e   this, the paren
1a100 74 20 73 65 6c 65 63 74 2e 20 54 68 65 20 63 68  t select. The ch
1a110 69 6c 64 20 73 65 6c 65 63 74 0a 20 20 20 20 2a  ild select.    *
1a120 2a 20 6d 61 79 20 63 6f 6e 74 61 69 6e 20 65 78  * may contain ex
1a130 70 72 65 73 73 69 6f 6e 20 74 72 65 65 73 20 6f  pression trees o
1a140 66 20 61 74 20 6d 6f 73 74 0a 20 20 20 20 2a 2a  f at most.    **
1a150 20 28 53 51 4c 49 54 45 5f 4d 41 58 5f 45 58 50   (SQLITE_MAX_EXP
1a160 52 5f 44 45 50 54 48 2d 50 61 72 73 65 2e 6e 48  R_DEPTH-Parse.nH
1a170 65 69 67 68 74 29 20 68 65 69 67 68 74 2e 20 54  eight) height. T
1a180 68 69 73 20 69 73 20 61 20 62 69 74 0a 20 20 20  his is a bit.   
1a190 20 2a 2a 20 6d 6f 72 65 20 63 6f 6e 73 65 72 76   ** more conserv
1a1a0 61 74 69 76 65 20 74 68 61 6e 20 6e 65 63 65 73  ative than neces
1a1b0 73 61 72 79 2c 20 62 75 74 20 6d 75 63 68 20 65  sary, but much e
1a1c0 61 73 69 65 72 20 74 68 61 6e 20 65 6e 66 6f 72  asier than enfor
1a1d0 63 69 6e 67 0a 20 20 20 20 2a 2a 20 61 6e 20 65  cing.    ** an e
1a1e0 78 61 63 74 20 6c 69 6d 69 74 2e 0a 20 20 20 20  xact limit..    
1a1f0 2a 2f 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 6e  */.    pParse->n
1a200 48 65 69 67 68 74 20 2b 3d 20 73 71 6c 69 74 65  Height += sqlite
1a210 33 53 65 6c 65 63 74 45 78 70 72 48 65 69 67 68  3SelectExprHeigh
1a220 74 28 70 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  t(p);.    sqlite
1a230 33 53 65 6c 65 63 74 44 65 73 74 49 6e 69 74 28  3SelectDestInit(
1a240 26 64 65 73 74 2c 20 53 52 54 5f 45 70 68 65 6d  &dest, SRT_Ephem
1a250 54 61 62 2c 20 70 49 74 65 6d 2d 3e 69 43 75 72  Tab, pItem->iCur
1a260 73 6f 72 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  sor);.    sqlite
1a270 33 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20  3Select(pParse, 
1a280 70 49 74 65 6d 2d 3e 70 53 65 6c 65 63 74 2c 20  pItem->pSelect, 
1a290 26 64 65 73 74 2c 20 70 2c 20 69 2c 20 26 69 73  &dest, p, i, &is
1a2a0 41 67 67 2c 20 30 29 3b 0a 20 20 20 20 69 66 28  Agg, 0);.    if(
1a2b0 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
1a2c0 64 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20  d ){.      goto 
1a2d0 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20  select_end;.    
1a2e0 7d 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 48  }.    pParse->nH
1a2f0 65 69 67 68 74 20 2d 3d 20 73 71 6c 69 74 65 33  eight -= sqlite3
1a300 53 65 6c 65 63 74 45 78 70 72 48 65 69 67 68 74  SelectExprHeight
1a310 28 70 29 3b 0a 20 20 20 20 69 66 28 20 6e 65 65  (p);.    if( nee
1a320 64 52 65 73 74 6f 72 65 43 6f 6e 74 65 78 74 20  dRestoreContext 
1a330 29 7b 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d  ){.      pParse-
1a340 3e 7a 41 75 74 68 43 6f 6e 74 65 78 74 20 3d 20  >zAuthContext = 
1a350 7a 53 61 76 65 64 41 75 74 68 43 6f 6e 74 65 78  zSavedAuthContex
1a360 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 54 61  t;.    }.    pTa
1a370 62 4c 69 73 74 20 3d 20 70 2d 3e 70 53 72 63 3b  bList = p->pSrc;
1a380 0a 20 20 20 20 70 57 68 65 72 65 20 3d 20 70 2d  .    pWhere = p-
1a390 3e 70 57 68 65 72 65 3b 0a 20 20 20 20 69 66 28  >pWhere;.    if(
1a3a0 20 21 49 67 6e 6f 72 61 62 6c 65 4f 72 64 65 72   !IgnorableOrder
1a3b0 62 79 28 70 44 65 73 74 29 20 29 7b 0a 20 20 20  by(pDest) ){.   
1a3c0 20 20 20 70 4f 72 64 65 72 42 79 20 3d 20 70 2d     pOrderBy = p-
1a3d0 3e 70 4f 72 64 65 72 42 79 3b 0a 20 20 20 20 7d  >pOrderBy;.    }
1a3e0 0a 20 20 20 20 70 47 72 6f 75 70 42 79 20 3d 20  .    pGroupBy = 
1a3f0 70 2d 3e 70 47 72 6f 75 70 42 79 3b 0a 20 20 20  p->pGroupBy;.   
1a400 20 70 48 61 76 69 6e 67 20 3d 20 70 2d 3e 70 48   pHaving = p->pH
1a410 61 76 69 6e 67 3b 0a 20 20 20 20 69 73 44 69 73  aving;.    isDis
1a420 74 69 6e 63 74 20 3d 20 70 2d 3e 69 73 44 69 73  tinct = p->isDis
1a430 74 69 6e 63 74 3b 0a 20 20 7d 0a 23 65 6e 64 69  tinct;.  }.#endi
1a440 66 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 74 6f  f..  /* Check to
1a450 20 73 65 65 20 69 66 20 74 68 69 73 20 69 73 20   see if this is 
1a460 61 20 73 75 62 71 75 65 72 79 20 74 68 61 74 20  a subquery that 
1a470 63 61 6e 20 62 65 20 22 66 6c 61 74 74 65 6e 65  can be "flattene
1a480 64 22 20 69 6e 74 6f 20 69 74 73 20 70 61 72 65  d" into its pare
1a490 6e 74 2e 0a 20 20 2a 2a 20 49 66 20 66 6c 61 74  nt..  ** If flat
1a4a0 74 65 6e 69 6e 67 20 69 73 20 61 20 70 6f 73 73  tening is a poss
1a4b0 69 62 6c 69 74 79 2c 20 64 6f 20 73 6f 20 61 6e  iblity, do so an
1a4c0 64 20 72 65 74 75 72 6e 20 69 6d 6d 65 64 69 61  d return immedia
1a4d0 74 65 6c 79 2e 20 20 0a 20 20 2a 2f 0a 23 69 66  tely.  .  */.#if
1a4e0 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
1a4f0 5f 56 49 45 57 0a 20 20 69 66 28 20 70 50 61 72  _VIEW.  if( pPar
1a500 65 6e 74 20 26 26 20 70 50 61 72 65 6e 74 41 67  ent && pParentAg
1a510 67 20 26 26 0a 20 20 20 20 20 20 66 6c 61 74 74  g &&.      flatt
1a520 65 6e 53 75 62 71 75 65 72 79 28 64 62 2c 20 70  enSubquery(db, p
1a530 50 61 72 65 6e 74 2c 20 70 61 72 65 6e 74 54 61  Parent, parentTa
1a540 62 2c 20 2a 70 50 61 72 65 6e 74 41 67 67 2c 20  b, *pParentAgg, 
1a550 69 73 41 67 67 29 20 29 7b 0a 20 20 20 20 69 66  isAgg) ){.    if
1a560 28 20 69 73 41 67 67 20 29 20 2a 70 50 61 72 65  ( isAgg ) *pPare
1a570 6e 74 41 67 67 20 3d 20 31 3b 0a 20 20 20 20 67  ntAgg = 1;.    g
1a580 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a  oto select_end;.
1a590 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a    }.#endif..  /*
1a5a0 20 49 66 20 70 6f 73 73 69 62 6c 65 2c 20 72 65   If possible, re
1a5b0 77 72 69 74 65 20 74 68 65 20 71 75 65 72 79 20  write the query 
1a5c0 74 6f 20 75 73 65 20 47 52 4f 55 50 20 42 59 20  to use GROUP BY 
1a5d0 69 6e 73 74 65 61 64 20 6f 66 20 44 49 53 54 49  instead of DISTI
1a5e0 4e 43 54 2e 0a 20 20 2a 2a 20 47 52 4f 55 50 20  NCT..  ** GROUP 
1a5f0 42 59 20 6d 61 79 20 75 73 65 20 61 6e 20 69 6e  BY may use an in
1a600 64 65 78 2c 20 44 49 53 54 49 4e 43 54 20 6e 65  dex, DISTINCT ne
1a610 76 65 72 20 64 6f 65 73 2e 0a 20 20 2a 2f 0a 20  ver does..  */. 
1a620 20 69 66 28 20 70 2d 3e 69 73 44 69 73 74 69 6e   if( p->isDistin
1a630 63 74 20 26 26 20 21 70 2d 3e 69 73 41 67 67 20  ct && !p->isAgg 
1a640 26 26 20 21 70 2d 3e 70 47 72 6f 75 70 42 79 20  && !p->pGroupBy 
1a650 29 7b 0a 20 20 20 20 70 2d 3e 70 47 72 6f 75 70  ){.    p->pGroup
1a660 42 79 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  By = sqlite3Expr
1a670 4c 69 73 74 44 75 70 28 64 62 2c 20 70 2d 3e 70  ListDup(db, p->p
1a680 45 4c 69 73 74 29 3b 0a 20 20 20 20 70 47 72 6f  EList);.    pGro
1a690 75 70 42 79 20 3d 20 70 2d 3e 70 47 72 6f 75 70  upBy = p->pGroup
1a6a0 42 79 3b 0a 20 20 20 20 70 2d 3e 69 73 44 69 73  By;.    p->isDis
1a6b0 74 69 6e 63 74 20 3d 20 30 3b 0a 20 20 20 20 69  tinct = 0;.    i
1a6c0 73 44 69 73 74 69 6e 63 74 20 3d 20 30 3b 0a 20  sDistinct = 0;. 
1a6d0 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 72   }..  /* If ther
1a6e0 65 20 69 73 20 61 6e 20 4f 52 44 45 52 20 42 59  e is an ORDER BY
1a6f0 20 63 6c 61 75 73 65 2c 20 74 68 65 6e 20 74 68   clause, then th
1a700 69 73 20 73 6f 72 74 69 6e 67 0a 20 20 2a 2a 20  is sorting.  ** 
1a710 69 6e 64 65 78 20 6d 69 67 68 74 20 65 6e 64 20  index might end 
1a720 75 70 20 62 65 69 6e 67 20 75 6e 75 73 65 64 20  up being unused 
1a730 69 66 20 74 68 65 20 64 61 74 61 20 63 61 6e 20  if the data can 
1a740 62 65 20 0a 20 20 2a 2a 20 65 78 74 72 61 63 74  be .  ** extract
1a750 65 64 20 69 6e 20 70 72 65 2d 73 6f 72 74 65 64  ed in pre-sorted
1a760 20 6f 72 64 65 72 2e 20 20 49 66 20 74 68 61 74   order.  If that
1a770 20 69 73 20 74 68 65 20 63 61 73 65 2c 20 74 68   is the case, th
1a780 65 6e 20 74 68 65 0a 20 20 2a 2a 20 4f 50 5f 4f  en the.  ** OP_O
1a790 70 65 6e 45 70 68 65 6d 65 72 61 6c 20 69 6e 73  penEphemeral ins
1a7a0 74 72 75 63 74 69 6f 6e 20 77 69 6c 6c 20 62 65  truction will be
1a7b0 20 63 68 61 6e 67 65 64 20 74 6f 20 61 6e 20 4f   changed to an O
1a7c0 50 5f 4e 6f 6f 70 20 6f 6e 63 65 0a 20 20 2a 2a  P_Noop once.  **
1a7d0 20 77 65 20 66 69 67 75 72 65 20 6f 75 74 20 74   we figure out t
1a7e0 68 61 74 20 74 68 65 20 73 6f 72 74 69 6e 67 20  hat the sorting 
1a7f0 69 6e 64 65 78 20 69 73 20 6e 6f 74 20 6e 65 65  index is not nee
1a800 64 65 64 2e 20 20 54 68 65 20 61 64 64 72 53 6f  ded.  The addrSo
1a810 72 74 49 6e 64 65 78 0a 20 20 2a 2a 20 76 61 72  rtIndex.  ** var
1a820 69 61 62 6c 65 20 69 73 20 75 73 65 64 20 74 6f  iable is used to
1a830 20 66 61 63 69 6c 69 74 61 74 65 20 74 68 61 74   facilitate that
1a840 20 63 68 61 6e 67 65 2e 0a 20 20 2a 2f 0a 20 20   change..  */.  
1a850 69 66 28 20 70 4f 72 64 65 72 42 79 20 29 7b 0a  if( pOrderBy ){.
1a860 20 20 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65      KeyInfo *pKe
1a870 79 49 6e 66 6f 3b 0a 20 20 20 20 70 4b 65 79 49  yInfo;.    pKeyI
1a880 6e 66 6f 20 3d 20 6b 65 79 49 6e 66 6f 46 72 6f  nfo = keyInfoFro
1a890 6d 45 78 70 72 4c 69 73 74 28 70 50 61 72 73 65  mExprList(pParse
1a8a0 2c 20 70 4f 72 64 65 72 42 79 29 3b 0a 20 20 20  , pOrderBy);.   
1a8b0 20 70 4f 72 64 65 72 42 79 2d 3e 69 45 43 75 72   pOrderBy->iECur
1a8c0 73 6f 72 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54  sor = pParse->nT
1a8d0 61 62 2b 2b 3b 0a 20 20 20 20 70 2d 3e 61 64 64  ab++;.    p->add
1a8e0 72 4f 70 65 6e 45 70 68 6d 5b 32 5d 20 3d 20 61  rOpenEphm[2] = a
1a8f0 64 64 72 53 6f 72 74 49 6e 64 65 78 20 3d 0a 20  ddrSortIndex =. 
1a900 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
1a910 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 4f 70 65  AddOp4(v, OP_Ope
1a920 6e 45 70 68 65 6d 65 72 61 6c 2c 0a 20 20 20 20  nEphemeral,.    
1a930 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a940 20 20 20 20 20 20 20 70 4f 72 64 65 72 42 79 2d         pOrderBy-
1a950 3e 69 45 43 75 72 73 6f 72 2c 20 70 4f 72 64 65  >iECursor, pOrde
1a960 72 42 79 2d 3e 6e 45 78 70 72 2b 32 2c 20 30 2c  rBy->nExpr+2, 0,
1a970 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1a980 20 20 20 20 20 20 20 20 20 20 20 20 28 63 68 61              (cha
1a990 72 2a 29 70 4b 65 79 49 6e 66 6f 2c 20 50 34 5f  r*)pKeyInfo, P4_
1a9a0 4b 45 59 49 4e 46 4f 5f 48 41 4e 44 4f 46 46 29  KEYINFO_HANDOFF)
1a9b0 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61  ;.  }else{.    a
1a9c0 64 64 72 53 6f 72 74 49 6e 64 65 78 20 3d 20 2d  ddrSortIndex = -
1a9d0 31 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20  1;.  }..  /* If 
1a9e0 74 68 65 20 6f 75 74 70 75 74 20 69 73 20 64 65  the output is de
1a9f0 73 74 69 6e 65 64 20 66 6f 72 20 61 20 74 65 6d  stined for a tem
1aa00 70 6f 72 61 72 79 20 74 61 62 6c 65 2c 20 6f 70  porary table, op
1aa10 65 6e 20 74 68 61 74 20 74 61 62 6c 65 2e 0a 20  en that table.. 
1aa20 20 2a 2f 0a 20 20 69 66 28 20 70 44 65 73 74 2d   */.  if( pDest-
1aa30 3e 65 44 65 73 74 3d 3d 53 52 54 5f 45 70 68 65  >eDest==SRT_Ephe
1aa40 6d 54 61 62 20 29 7b 0a 20 20 20 20 73 71 6c 69  mTab ){.    sqli
1aa50 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
1aa60 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61   OP_OpenEphemera
1aa70 6c 2c 20 70 44 65 73 74 2d 3e 69 50 61 72 6d 2c  l, pDest->iParm,
1aa80 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 29 3b   pEList->nExpr);
1aa90 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 65 74 20 74  .  }..  /* Set t
1aaa0 68 65 20 6c 69 6d 69 74 65 72 2e 0a 20 20 2a 2f  he limiter..  */
1aab0 0a 20 20 69 45 6e 64 20 3d 20 73 71 6c 69 74 65  .  iEnd = sqlite
1aac0 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76  3VdbeMakeLabel(v
1aad0 29 3b 0a 20 20 63 6f 6d 70 75 74 65 4c 69 6d 69  );.  computeLimi
1aae0 74 52 65 67 69 73 74 65 72 73 28 70 50 61 72 73  tRegisters(pPars
1aaf0 65 2c 20 70 2c 20 69 45 6e 64 29 3b 0a 0a 20 20  e, p, iEnd);..  
1ab00 2f 2a 20 4f 70 65 6e 20 61 20 76 69 72 74 75 61  /* Open a virtua
1ab10 6c 20 69 6e 64 65 78 20 74 6f 20 75 73 65 20 66  l index to use f
1ab20 6f 72 20 74 68 65 20 64 69 73 74 69 6e 63 74 20  or the distinct 
1ab30 73 65 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  set..  */.  if( 
1ab40 69 73 44 69 73 74 69 6e 63 74 20 29 7b 0a 20 20  isDistinct ){.  
1ab50 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49    KeyInfo *pKeyI
1ab60 6e 66 6f 3b 0a 20 20 20 20 61 73 73 65 72 74 28  nfo;.    assert(
1ab70 20 69 73 41 67 67 20 7c 7c 20 70 47 72 6f 75 70   isAgg || pGroup
1ab80 42 79 20 29 3b 0a 20 20 20 20 64 69 73 74 69 6e  By );.    distin
1ab90 63 74 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61  ct = pParse->nTa
1aba0 62 2b 2b 3b 0a 20 20 20 20 70 4b 65 79 49 6e 66  b++;.    pKeyInf
1abb0 6f 20 3d 20 6b 65 79 49 6e 66 6f 46 72 6f 6d 45  o = keyInfoFromE
1abc0 78 70 72 4c 69 73 74 28 70 50 61 72 73 65 2c 20  xprList(pParse, 
1abd0 70 2d 3e 70 45 4c 69 73 74 29 3b 0a 20 20 20 20  p->pEList);.    
1abe0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
1abf0 34 28 76 2c 20 4f 50 5f 4f 70 65 6e 45 70 68 65  4(v, OP_OpenEphe
1ac00 6d 65 72 61 6c 2c 20 64 69 73 74 69 6e 63 74 2c  meral, distinct,
1ac10 20 30 2c 20 30 2c 0a 20 20 20 20 20 20 20 20 20   0, 0,.         
1ac20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28                 (
1ac30 63 68 61 72 2a 29 70 4b 65 79 49 6e 66 6f 2c 20  char*)pKeyInfo, 
1ac40 50 34 5f 4b 45 59 49 4e 46 4f 5f 48 41 4e 44 4f  P4_KEYINFO_HANDO
1ac50 46 46 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  FF);.  }else{.  
1ac60 20 20 64 69 73 74 69 6e 63 74 20 3d 20 2d 31 3b    distinct = -1;
1ac70 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 67 67 72 65  .  }..  /* Aggre
1ac80 67 61 74 65 20 61 6e 64 20 6e 6f 6e 2d 61 67 67  gate and non-agg
1ac90 72 65 67 61 74 65 20 71 75 65 72 69 65 73 20 61  regate queries a
1aca0 72 65 20 68 61 6e 64 6c 65 64 20 64 69 66 66 65  re handled diffe
1acb0 72 65 6e 74 6c 79 20 2a 2f 0a 20 20 69 66 28 20  rently */.  if( 
1acc0 21 69 73 41 67 67 20 26 26 20 70 47 72 6f 75 70  !isAgg && pGroup
1acd0 42 79 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20  By==0 ){.    /* 
1ace0 54 68 69 73 20 63 61 73 65 20 69 73 20 66 6f 72  This case is for
1acf0 20 6e 6f 6e 2d 61 67 67 72 65 67 61 74 65 20 71   non-aggregate q
1ad00 75 65 72 69 65 73 0a 20 20 20 20 2a 2a 20 42 65  ueries.    ** Be
1ad10 67 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65  gin the database
1ad20 20 73 63 61 6e 0a 20 20 20 20 2a 2f 0a 20 20 20   scan.    */.   
1ad30 20 70 57 49 6e 66 6f 20 3d 20 73 71 6c 69 74 65   pWInfo = sqlite
1ad40 33 57 68 65 72 65 42 65 67 69 6e 28 70 50 61 72  3WhereBegin(pPar
1ad50 73 65 2c 20 70 54 61 62 4c 69 73 74 2c 20 70 57  se, pTabList, pW
1ad60 68 65 72 65 2c 20 26 70 4f 72 64 65 72 42 79 2c  here, &pOrderBy,
1ad70 20 30 29 3b 0a 20 20 20 20 69 66 28 20 70 57 49   0);.    if( pWI
1ad80 6e 66 6f 3d 3d 30 20 29 20 67 6f 74 6f 20 73 65  nfo==0 ) goto se
1ad90 6c 65 63 74 5f 65 6e 64 3b 0a 0a 20 20 20 20 2f  lect_end;..    /
1ada0 2a 20 49 66 20 73 6f 72 74 69 6e 67 20 69 6e 64  * If sorting ind
1adb0 65 78 20 74 68 61 74 20 77 61 73 20 63 72 65 61  ex that was crea
1adc0 74 65 64 20 62 79 20 61 20 70 72 69 6f 72 20 4f  ted by a prior O
1add0 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 20  P_OpenEphemeral 
1ade0 0a 20 20 20 20 2a 2a 20 69 6e 73 74 72 75 63 74  .    ** instruct
1adf0 69 6f 6e 20 65 6e 64 65 64 20 75 70 20 6e 6f 74  ion ended up not
1ae00 20 62 65 69 6e 67 20 6e 65 65 64 65 64 2c 20 74   being needed, t
1ae10 68 65 6e 20 63 68 61 6e 67 65 20 74 68 65 20 4f  hen change the O
1ae20 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 0a  P_OpenEphemeral.
1ae30 20 20 20 20 2a 2a 20 69 6e 74 6f 20 61 6e 20 4f      ** into an O
1ae40 50 5f 4e 6f 6f 70 2e 0a 20 20 20 20 2a 2f 0a 20  P_Noop..    */. 
1ae50 20 20 20 69 66 28 20 61 64 64 72 53 6f 72 74 49     if( addrSortI
1ae60 6e 64 65 78 3e 3d 30 20 26 26 20 70 4f 72 64 65  ndex>=0 && pOrde
1ae70 72 42 79 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  rBy==0 ){.      
1ae80 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67  sqlite3VdbeChang
1ae90 65 54 6f 4e 6f 6f 70 28 76 2c 20 61 64 64 72 53  eToNoop(v, addrS
1aea0 6f 72 74 49 6e 64 65 78 2c 20 31 29 3b 0a 20 20  ortIndex, 1);.  
1aeb0 20 20 20 20 70 2d 3e 61 64 64 72 4f 70 65 6e 45      p->addrOpenE
1aec0 70 68 6d 5b 32 5d 20 3d 20 2d 31 3b 0a 20 20 20  phm[2] = -1;.   
1aed0 20 7d 0a 0a 20 20 20 20 2f 2a 20 55 73 65 20 74   }..    /* Use t
1aee0 68 65 20 73 74 61 6e 64 61 72 64 20 69 6e 6e 65  he standard inne
1aef0 72 20 6c 6f 6f 70 0a 20 20 20 20 2a 2f 0a 20 20  r loop.    */.  
1af00 20 20 61 73 73 65 72 74 28 21 69 73 44 69 73 74    assert(!isDist
1af10 69 6e 63 74 29 3b 0a 20 20 20 20 73 65 6c 65 63  inct);.    selec
1af20 74 49 6e 6e 65 72 4c 6f 6f 70 28 70 50 61 72 73  tInnerLoop(pPars
1af30 65 2c 20 70 2c 20 70 45 4c 69 73 74 2c 20 30 2c  e, p, pEList, 0,
1af40 20 30 2c 20 70 4f 72 64 65 72 42 79 2c 20 2d 31   0, pOrderBy, -1
1af50 2c 20 70 44 65 73 74 2c 0a 20 20 20 20 20 20 20  , pDest,.       
1af60 20 20 20 20 20 20 20 20 20 20 20 20 20 70 57 49               pWI
1af70 6e 66 6f 2d 3e 69 43 6f 6e 74 69 6e 75 65 2c 20  nfo->iContinue, 
1af80 70 57 49 6e 66 6f 2d 3e 69 42 72 65 61 6b 2c 20  pWInfo->iBreak, 
1af90 61 66 66 29 3b 0a 0a 20 20 20 20 2f 2a 20 45 6e  aff);..    /* En
1afa0 64 20 74 68 65 20 64 61 74 61 62 61 73 65 20 73  d the database s
1afb0 63 61 6e 20 6c 6f 6f 70 2e 0a 20 20 20 20 2a 2f  can loop..    */
1afc0 0a 20 20 20 20 73 71 6c 69 74 65 33 57 68 65 72  .    sqlite3Wher
1afd0 65 45 6e 64 28 70 57 49 6e 66 6f 29 3b 0a 20 20  eEnd(pWInfo);.  
1afe0 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 54 68  }else{.    /* Th
1aff0 69 73 20 69 73 20 74 68 65 20 70 72 6f 63 65 73  is is the proces
1b000 73 69 6e 67 20 66 6f 72 20 61 67 67 72 65 67 61  sing for aggrega
1b010 74 65 20 71 75 65 72 69 65 73 20 2a 2f 0a 20 20  te queries */.  
1b020 20 20 4e 61 6d 65 43 6f 6e 74 65 78 74 20 73 4e    NameContext sN
1b030 43 3b 20 20 20 20 2f 2a 20 4e 61 6d 65 20 63 6f  C;    /* Name co
1b040 6e 74 65 78 74 20 66 6f 72 20 70 72 6f 63 65 73  ntext for proces
1b050 73 69 6e 67 20 61 67 67 72 65 67 61 74 65 20 69  sing aggregate i
1b060 6e 66 6f 72 6d 61 74 69 6f 6e 20 2a 2f 0a 20 20  nformation */.  
1b070 20 20 69 6e 74 20 69 41 4d 65 6d 3b 20 20 20 20    int iAMem;    
1b080 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 4d        /* First M
1b090 65 6d 20 61 64 64 72 65 73 73 20 66 6f 72 20 73  em address for s
1b0a0 74 6f 72 69 6e 67 20 63 75 72 72 65 6e 74 20 47  toring current G
1b0b0 52 4f 55 50 20 42 59 20 2a 2f 0a 20 20 20 20 69  ROUP BY */.    i
1b0c0 6e 74 20 69 42 4d 65 6d 3b 20 20 20 20 20 20 20  nt iBMem;       
1b0d0 20 20 20 2f 2a 20 46 69 72 73 74 20 4d 65 6d 20     /* First Mem 
1b0e0 61 64 64 72 65 73 73 20 66 6f 72 20 70 72 65 76  address for prev
1b0f0 69 6f 75 73 20 47 52 4f 55 50 20 42 59 20 2a 2f  ious GROUP BY */
1b100 0a 20 20 20 20 69 6e 74 20 69 55 73 65 46 6c 61  .    int iUseFla
1b110 67 3b 20 20 20 20 20 20 20 2f 2a 20 4d 65 6d 20  g;       /* Mem 
1b120 61 64 64 72 65 73 73 20 68 6f 6c 64 69 6e 67 20  address holding 
1b130 66 6c 61 67 20 69 6e 64 69 63 61 74 69 6e 67 20  flag indicating 
1b140 74 68 61 74 20 61 74 20 6c 65 61 73 74 0a 20 20  that at least.  
1b150 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b160 20 20 20 20 20 20 2a 2a 20 6f 6e 65 20 72 6f 77        ** one row
1b170 20 6f 66 20 74 68 65 20 69 6e 70 75 74 20 74 6f   of the input to
1b180 20 74 68 65 20 61 67 67 72 65 67 61 74 6f 72 20   the aggregator 
1b190 68 61 73 20 62 65 65 6e 0a 20 20 20 20 20 20 20  has been.       
1b1a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b1b0 20 2a 2a 20 70 72 6f 63 65 73 73 65 64 20 2a 2f   ** processed */
1b1c0 0a 20 20 20 20 69 6e 74 20 69 41 62 6f 72 74 46  .    int iAbortF
1b1d0 6c 61 67 3b 20 20 20 20 20 2f 2a 20 4d 65 6d 20  lag;     /* Mem 
1b1e0 61 64 64 72 65 73 73 20 77 68 69 63 68 20 63 61  address which ca
1b1f0 75 73 65 73 20 71 75 65 72 79 20 61 62 6f 72 74  uses query abort
1b200 20 69 66 20 70 6f 73 69 74 69 76 65 20 2a 2f 0a   if positive */.
1b210 20 20 20 20 69 6e 74 20 67 72 6f 75 70 42 79 53      int groupByS
1b220 6f 72 74 3b 20 20 20 20 2f 2a 20 52 6f 77 73 20  ort;    /* Rows 
1b230 63 6f 6d 65 20 66 72 6f 6d 20 73 6f 75 72 63 65  come from source
1b240 20 69 6e 20 47 52 4f 55 50 20 42 59 20 6f 72 64   in GROUP BY ord
1b250 65 72 20 2a 2f 0a 0a 0a 20 20 20 20 2f 2a 20 54  er */...    /* T
1b260 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 76 61 72  he following var
1b270 69 61 62 6c 65 73 20 68 6f 6c 64 20 61 64 64 72  iables hold addr
1b280 65 73 73 65 73 20 6f 72 20 6c 61 62 65 6c 73 20  esses or labels 
1b290 66 6f 72 20 70 61 72 74 73 20 6f 66 20 74 68 65  for parts of the
1b2a0 0a 20 20 20 20 2a 2a 20 76 69 72 74 75 61 6c 20  .    ** virtual 
1b2b0 6d 61 63 68 69 6e 65 20 70 72 6f 67 72 61 6d 20  machine program 
1b2c0 77 65 20 61 72 65 20 70 75 74 74 69 6e 67 20 74  we are putting t
1b2d0 6f 67 65 74 68 65 72 20 2a 2f 0a 20 20 20 20 69  ogether */.    i
1b2e0 6e 74 20 61 64 64 72 4f 75 74 70 75 74 52 6f 77  nt addrOutputRow
1b2f0 3b 20 20 20 20 20 20 2f 2a 20 53 74 61 72 74 20  ;      /* Start 
1b300 6f 66 20 73 75 62 72 6f 75 74 69 6e 65 20 74 68  of subroutine th
1b310 61 74 20 6f 75 74 70 75 74 73 20 61 20 72 65 73  at outputs a res
1b320 75 6c 74 20 72 6f 77 20 2a 2f 0a 20 20 20 20 69  ult row */.    i
1b330 6e 74 20 72 65 67 4f 75 74 70 75 74 52 6f 77 3b  nt regOutputRow;
1b340 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e         /* Return
1b350 20 61 64 64 72 65 73 73 20 72 65 67 69 73 74 65   address registe
1b360 72 20 66 6f 72 20 6f 75 74 70 75 74 20 73 75 62  r for output sub
1b370 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 20 20 69  routine */.    i
1b380 6e 74 20 61 64 64 72 53 65 74 41 62 6f 72 74 3b  nt addrSetAbort;
1b390 20 20 20 20 20 20 20 2f 2a 20 53 65 74 20 74 68         /* Set th
1b3a0 65 20 61 62 6f 72 74 20 66 6c 61 67 20 61 6e 64  e abort flag and
1b3b0 20 72 65 74 75 72 6e 20 2a 2f 0a 20 20 20 20 69   return */.    i
1b3c0 6e 74 20 61 64 64 72 49 6e 69 74 69 61 6c 69 7a  nt addrInitializ
1b3d0 65 4c 6f 6f 70 3b 20 2f 2a 20 53 74 61 72 74 20  eLoop; /* Start 
1b3e0 6f 66 20 63 6f 64 65 20 74 68 61 74 20 69 6e 69  of code that ini
1b3f0 74 69 61 6c 69 7a 65 73 20 74 68 65 20 69 6e 70  tializes the inp
1b400 75 74 20 6c 6f 6f 70 20 2a 2f 0a 20 20 20 20 69  ut loop */.    i
1b410 6e 74 20 61 64 64 72 54 6f 70 4f 66 4c 6f 6f 70  nt addrTopOfLoop
1b420 3b 20 20 20 20 20 20 2f 2a 20 54 6f 70 20 6f 66  ;      /* Top of
1b430 20 74 68 65 20 69 6e 70 75 74 20 6c 6f 6f 70 20   the input loop 
1b440 2a 2f 0a 20 20 20 20 69 6e 74 20 61 64 64 72 45  */.    int addrE
1b450 6e 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  nd;            /
1b460 2a 20 45 6e 64 20 6f 66 20 61 6c 6c 20 70 72 6f  * End of all pro
1b470 63 65 73 73 69 6e 67 20 2a 2f 0a 20 20 20 20 69  cessing */.    i
1b480 6e 74 20 61 64 64 72 53 6f 72 74 69 6e 67 49 64  nt addrSortingId
1b490 78 3b 20 20 20 20 20 2f 2a 20 54 68 65 20 4f 50  x;     /* The OP
1b4a0 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 20 66  _OpenEphemeral f
1b4b0 6f 72 20 74 68 65 20 73 6f 72 74 69 6e 67 20 69  or the sorting i
1b4c0 6e 64 65 78 20 2a 2f 0a 20 20 20 20 69 6e 74 20  ndex */.    int 
1b4d0 61 64 64 72 52 65 73 65 74 3b 20 20 20 20 20 20  addrReset;      
1b4e0 20 20 20 20 2f 2a 20 53 75 62 72 6f 75 74 69 6e      /* Subroutin
1b4f0 65 20 66 6f 72 20 72 65 73 65 74 74 69 6e 67 20  e for resetting 
1b500 74 68 65 20 61 63 63 75 6d 75 6c 61 74 6f 72 20  the accumulator 
1b510 2a 2f 0a 20 20 20 20 69 6e 74 20 72 65 67 52 65  */.    int regRe
1b520 73 65 74 3b 20 20 20 20 20 20 20 20 20 20 20 2f  set;           /
1b530 2a 20 52 65 74 75 72 6e 20 61 64 64 72 65 73 73  * Return address
1b540 20 72 65 67 69 73 74 65 72 20 66 6f 72 20 72 65   register for re
1b550 73 65 74 20 73 75 62 72 6f 75 74 69 6e 65 20 2a  set subroutine *
1b560 2f 0a 0a 20 20 20 20 61 64 64 72 45 6e 64 20 3d  /..    addrEnd =
1b570 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65   sqlite3VdbeMake
1b580 4c 61 62 65 6c 28 76 29 3b 0a 0a 20 20 20 20 2f  Label(v);..    /
1b590 2a 20 43 6f 6e 76 65 72 74 20 54 4b 5f 43 4f 4c  * Convert TK_COL
1b5a0 55 4d 4e 20 6e 6f 64 65 73 20 69 6e 74 6f 20 54  UMN nodes into T
1b5b0 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 20 61 6e 64  K_AGG_COLUMN and
1b5c0 20 6d 61 6b 65 20 65 6e 74 72 69 65 73 20 69 6e   make entries in
1b5d0 0a 20 20 20 20 2a 2a 20 73 41 67 67 49 6e 66 6f  .    ** sAggInfo
1b5e0 20 66 6f 72 20 61 6c 6c 20 54 4b 5f 41 47 47 5f   for all TK_AGG_
1b5f0 46 55 4e 43 54 49 4f 4e 20 6e 6f 64 65 73 20 69  FUNCTION nodes i
1b600 6e 20 65 78 70 72 65 73 73 69 6f 6e 73 20 6f 66  n expressions of
1b610 20 74 68 65 0a 20 20 20 20 2a 2a 20 53 45 4c 45   the.    ** SELE
1b620 43 54 20 73 74 61 74 65 6d 65 6e 74 2e 0a 20 20  CT statement..  
1b630 20 20 2a 2f 0a 20 20 20 20 6d 65 6d 73 65 74 28    */.    memset(
1b640 26 73 4e 43 2c 20 30 2c 20 73 69 7a 65 6f 66 28  &sNC, 0, sizeof(
1b650 73 4e 43 29 29 3b 0a 20 20 20 20 73 4e 43 2e 70  sNC));.    sNC.p
1b660 50 61 72 73 65 20 3d 20 70 50 61 72 73 65 3b 0a  Parse = pParse;.
1b670 20 20 20 20 73 4e 43 2e 70 53 72 63 4c 69 73 74      sNC.pSrcList
1b680 20 3d 20 70 54 61 62 4c 69 73 74 3b 0a 20 20 20   = pTabList;.   
1b690 20 73 4e 43 2e 70 41 67 67 49 6e 66 6f 20 3d 20   sNC.pAggInfo = 
1b6a0 26 73 41 67 67 49 6e 66 6f 3b 0a 20 20 20 20 73  &sAggInfo;.    s
1b6b0 41 67 67 49 6e 66 6f 2e 6e 53 6f 72 74 69 6e 67  AggInfo.nSorting
1b6c0 43 6f 6c 75 6d 6e 20 3d 20 70 47 72 6f 75 70 42  Column = pGroupB
1b6d0 79 20 3f 20 70 47 72 6f 75 70 42 79 2d 3e 6e 45  y ? pGroupBy->nE
1b6e0 78 70 72 2b 31 20 3a 20 30 3b 0a 20 20 20 20 73  xpr+1 : 0;.    s
1b6f0 41 67 67 49 6e 66 6f 2e 70 47 72 6f 75 70 42 79  AggInfo.pGroupBy
1b700 20 3d 20 70 47 72 6f 75 70 42 79 3b 0a 20 20 20   = pGroupBy;.   
1b710 20 73 71 6c 69 74 65 33 45 78 70 72 41 6e 61 6c   sqlite3ExprAnal
1b720 79 7a 65 41 67 67 4c 69 73 74 28 26 73 4e 43 2c  yzeAggList(&sNC,
1b730 20 70 45 4c 69 73 74 29 3b 0a 20 20 20 20 73 71   pEList);.    sq
1b740 6c 69 74 65 33 45 78 70 72 41 6e 61 6c 79 7a 65  lite3ExprAnalyze
1b750 41 67 67 4c 69 73 74 28 26 73 4e 43 2c 20 70 4f  AggList(&sNC, pO
1b760 72 64 65 72 42 79 29 3b 0a 20 20 20 20 69 66 28  rderBy);.    if(
1b770 20 70 48 61 76 69 6e 67 20 29 7b 0a 20 20 20 20   pHaving ){.    
1b780 20 20 73 71 6c 69 74 65 33 45 78 70 72 41 6e 61    sqlite3ExprAna
1b790 6c 79 7a 65 41 67 67 72 65 67 61 74 65 73 28 26  lyzeAggregates(&
1b7a0 73 4e 43 2c 20 70 48 61 76 69 6e 67 29 3b 0a 20  sNC, pHaving);. 
1b7b0 20 20 20 7d 0a 20 20 20 20 73 41 67 67 49 6e 66     }.    sAggInf
1b7c0 6f 2e 6e 41 63 63 75 6d 75 6c 61 74 6f 72 20 3d  o.nAccumulator =
1b7d0 20 73 41 67 67 49 6e 66 6f 2e 6e 43 6f 6c 75 6d   sAggInfo.nColum
1b7e0 6e 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  n;.    for(i=0; 
1b7f0 69 3c 73 41 67 67 49 6e 66 6f 2e 6e 46 75 6e 63  i<sAggInfo.nFunc
1b800 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 73 71  ; i++){.      sq
1b810 6c 69 74 65 33 45 78 70 72 41 6e 61 6c 79 7a 65  lite3ExprAnalyze
1b820 41 67 67 4c 69 73 74 28 26 73 4e 43 2c 20 73 41  AggList(&sNC, sA
1b830 67 67 49 6e 66 6f 2e 61 46 75 6e 63 5b 69 5d 2e  ggInfo.aFunc[i].
1b840 70 45 78 70 72 2d 3e 70 4c 69 73 74 29 3b 0a 20  pExpr->pList);. 
1b850 20 20 20 7d 0a 20 20 20 20 69 66 28 20 64 62 2d     }.    if( db-
1b860 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20  >mallocFailed ) 
1b870 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b  goto select_end;
1b880 0a 0a 20 20 20 20 2f 2a 20 50 72 6f 63 65 73 73  ..    /* Process
1b890 69 6e 67 20 66 6f 72 20 61 67 67 72 65 67 61 74  ing for aggregat
1b8a0 65 73 20 77 69 74 68 20 47 52 4f 55 50 20 42 59  es with GROUP BY
1b8b0 20 69 73 20 76 65 72 79 20 64 69 66 66 65 72 65   is very differe
1b8c0 6e 74 20 61 6e 64 0a 20 20 20 20 2a 2a 20 6d 75  nt and.    ** mu
1b8d0 63 68 20 6d 6f 72 65 20 63 6f 6d 70 6c 65 78 20  ch more complex 
1b8e0 74 68 61 6e 20 61 67 67 72 65 67 61 74 65 73 20  than aggregates 
1b8f0 77 69 74 68 6f 75 74 20 61 20 47 52 4f 55 50 20  without a GROUP 
1b900 42 59 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  BY..    */.    i
1b910 66 28 20 70 47 72 6f 75 70 42 79 20 29 7b 0a 20  f( pGroupBy ){. 
1b920 20 20 20 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b       KeyInfo *pK
1b930 65 79 49 6e 66 6f 3b 20 20 2f 2a 20 4b 65 79 69  eyInfo;  /* Keyi
1b940 6e 67 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66  ng information f
1b950 6f 72 20 74 68 65 20 67 72 6f 75 70 20 62 79 20  or the group by 
1b960 63 6c 61 75 73 65 20 2a 2f 0a 20 20 20 20 20 20  clause */.      
1b970 69 6e 74 20 6a 31 3b 0a 0a 20 20 20 20 20 20 2f  int j1;..      /
1b980 2a 20 43 72 65 61 74 65 20 6c 61 62 65 6c 73 20  * Create labels 
1b990 74 68 61 74 20 77 65 20 77 69 6c 6c 20 62 65 20  that we will be 
1b9a0 6e 65 65 64 69 6e 67 0a 20 20 20 20 20 20 2a 2f  needing.      */
1b9b0 0a 20 20 20 20 20 20 61 64 64 72 49 6e 69 74 69  .      addrIniti
1b9c0 61 6c 69 7a 65 4c 6f 6f 70 20 3d 20 73 71 6c 69  alizeLoop = sqli
1b9d0 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c  te3VdbeMakeLabel
1b9e0 28 76 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 49  (v);..      /* I
1b9f0 66 20 74 68 65 72 65 20 69 73 20 61 20 47 52 4f  f there is a GRO
1ba00 55 50 20 42 59 20 63 6c 61 75 73 65 20 77 65 20  UP BY clause we 
1ba10 6d 69 67 68 74 20 6e 65 65 64 20 61 20 73 6f 72  might need a sor
1ba20 74 69 6e 67 20 69 6e 64 65 78 20 74 6f 0a 20 20  ting index to.  
1ba30 20 20 20 20 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74      ** implement
1ba40 20 69 74 2e 20 20 41 6c 6c 6f 63 61 74 65 20 74   it.  Allocate t
1ba50 68 61 74 20 73 6f 72 74 69 6e 67 20 69 6e 64 65  hat sorting inde
1ba60 78 20 6e 6f 77 2e 20 20 49 66 20 69 74 20 74 75  x now.  If it tu
1ba70 72 6e 73 20 6f 75 74 0a 20 20 20 20 20 20 2a 2a  rns out.      **
1ba80 20 74 68 61 74 20 77 65 20 64 6f 20 6e 6f 74 20   that we do not 
1ba90 6e 65 65 64 20 69 74 20 61 66 74 65 72 20 61 6c  need it after al
1baa0 6c 2c 20 74 68 65 20 4f 70 65 6e 45 70 68 65 6d  l, the OpenEphem
1bab0 65 72 61 6c 20 69 6e 73 74 72 75 63 74 69 6f 6e  eral instruction
1bac0 0a 20 20 20 20 20 20 2a 2a 20 77 69 6c 6c 20 62  .      ** will b
1bad0 65 20 63 6f 6e 76 65 72 74 65 64 20 69 6e 74 6f  e converted into
1bae0 20 61 20 4e 6f 6f 70 2e 20 20 0a 20 20 20 20 20   a Noop.  .     
1baf0 20 2a 2f 0a 20 20 20 20 20 20 73 41 67 67 49 6e   */.      sAggIn
1bb00 66 6f 2e 73 6f 72 74 69 6e 67 49 64 78 20 3d 20  fo.sortingIdx = 
1bb10 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a  pParse->nTab++;.
1bb20 20 20 20 20 20 20 70 4b 65 79 49 6e 66 6f 20 3d        pKeyInfo =
1bb30 20 6b 65 79 49 6e 66 6f 46 72 6f 6d 45 78 70 72   keyInfoFromExpr
1bb40 4c 69 73 74 28 70 50 61 72 73 65 2c 20 70 47 72  List(pParse, pGr
1bb50 6f 75 70 42 79 29 3b 0a 20 20 20 20 20 20 61 64  oupBy);.      ad
1bb60 64 72 53 6f 72 74 69 6e 67 49 64 78 20 3d 20 73  drSortingIdx = s
1bb70 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34  qlite3VdbeAddOp4
1bb80 28 76 2c 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d  (v, OP_OpenEphem
1bb90 65 72 61 6c 2c 20 0a 20 20 20 20 20 20 20 20 20  eral, .         
1bba0 20 73 41 67 67 49 6e 66 6f 2e 73 6f 72 74 69 6e   sAggInfo.sortin
1bbb0 67 49 64 78 2c 20 73 41 67 67 49 6e 66 6f 2e 6e  gIdx, sAggInfo.n
1bbc0 53 6f 72 74 69 6e 67 43 6f 6c 75 6d 6e 2c 20 0a  SortingColumn, .
1bbd0 20 20 20 20 20 20 20 20 20 20 30 2c 20 28 63 68            0, (ch
1bbe0 61 72 2a 29 70 4b 65 79 49 6e 66 6f 2c 20 50 34  ar*)pKeyInfo, P4
1bbf0 5f 4b 45 59 49 4e 46 4f 5f 48 41 4e 44 4f 46 46  _KEYINFO_HANDOFF
1bc00 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 49 6e 69  );..      /* Ini
1bc10 74 69 61 6c 69 7a 65 20 6d 65 6d 6f 72 79 20 6c  tialize memory l
1bc20 6f 63 61 74 69 6f 6e 73 20 75 73 65 64 20 62 79  ocations used by
1bc30 20 47 52 4f 55 50 20 42 59 20 61 67 67 72 65 67   GROUP BY aggreg
1bc40 61 74 65 20 70 72 6f 63 65 73 73 69 6e 67 0a 20  ate processing. 
1bc50 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 55       */.      iU
1bc60 73 65 46 6c 61 67 20 3d 20 2b 2b 70 50 61 72 73  seFlag = ++pPars
1bc70 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 69  e->nMem;.      i
1bc80 41 62 6f 72 74 46 6c 61 67 20 3d 20 2b 2b 70 50  AbortFlag = ++pP
1bc90 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20  arse->nMem;.    
1bca0 20 20 69 41 4d 65 6d 20 3d 20 70 50 61 72 73 65    iAMem = pParse
1bcb0 2d 3e 6e 4d 65 6d 20 2b 20 31 3b 0a 20 20 20 20  ->nMem + 1;.    
1bcc0 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b    pParse->nMem +
1bcd0 3d 20 70 47 72 6f 75 70 42 79 2d 3e 6e 45 78 70  = pGroupBy->nExp
1bce0 72 3b 0a 20 20 20 20 20 20 69 42 4d 65 6d 20 3d  r;.      iBMem =
1bcf0 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 20   pParse->nMem + 
1bd00 31 3b 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d  1;.      pParse-
1bd10 3e 6e 4d 65 6d 20 2b 3d 20 70 47 72 6f 75 70 42  >nMem += pGroupB
1bd20 79 2d 3e 6e 45 78 70 72 3b 0a 20 20 20 20 20 20  y->nExpr;.      
1bd30 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
1bd40 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c  2(v, OP_Integer,
1bd50 20 30 2c 20 69 41 62 6f 72 74 46 6c 61 67 29 3b   0, iAbortFlag);
1bd60 0a 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65  .      VdbeComme
1bd70 6e 74 28 28 76 2c 20 22 63 6c 65 61 72 20 61 62  nt((v, "clear ab
1bd80 6f 72 74 20 66 6c 61 67 22 29 29 3b 0a 20 20 20  ort flag"));.   
1bd90 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
1bda0 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67  dOp2(v, OP_Integ
1bdb0 65 72 2c 20 30 2c 20 69 55 73 65 46 6c 61 67 29  er, 0, iUseFlag)
1bdc0 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d  ;.      VdbeComm
1bdd0 65 6e 74 28 28 76 2c 20 22 69 6e 64 69 63 61 74  ent((v, "indicat
1bde0 65 20 61 63 63 75 6d 75 6c 61 74 6f 72 20 65 6d  e accumulator em
1bdf0 70 74 79 22 29 29 3b 0a 20 20 20 20 20 20 73 71  pty"));.      sq
1be00 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
1be10 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 61  v, OP_Goto, 0, a
1be20 64 64 72 49 6e 69 74 69 61 6c 69 7a 65 4c 6f 6f  ddrInitializeLoo
1be30 70 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 47 65  p);..      /* Ge
1be40 6e 65 72 61 74 65 20 61 20 73 75 62 72 6f 75 74  nerate a subrout
1be50 69 6e 65 20 74 68 61 74 20 6f 75 74 70 75 74 73  ine that outputs
1be60 20 61 20 73 69 6e 67 6c 65 20 72 6f 77 20 6f 66   a single row of
1be70 20 74 68 65 20 72 65 73 75 6c 74 0a 20 20 20 20   the result.    
1be80 20 20 2a 2a 20 73 65 74 2e 20 20 54 68 69 73 20    ** set.  This 
1be90 73 75 62 72 6f 75 74 69 6e 65 20 66 69 72 73 74  subroutine first
1bea0 20 6c 6f 6f 6b 73 20 61 74 20 74 68 65 20 69 55   looks at the iU
1beb0 73 65 46 6c 61 67 2e 20 20 49 66 20 69 55 73 65  seFlag.  If iUse
1bec0 46 6c 61 67 0a 20 20 20 20 20 20 2a 2a 20 69 73  Flag.      ** is
1bed0 20 6c 65 73 73 20 74 68 61 6e 20 6f 72 20 65 71   less than or eq
1bee0 75 61 6c 20 74 6f 20 7a 65 72 6f 2c 20 74 68 65  ual to zero, the
1bef0 20 73 75 62 72 6f 75 74 69 6e 65 20 69 73 20 61   subroutine is a
1bf00 20 6e 6f 2d 6f 70 2e 20 20 49 66 0a 20 20 20 20   no-op.  If.    
1bf10 20 20 2a 2a 20 74 68 65 20 70 72 6f 63 65 73 73    ** the process
1bf20 69 6e 67 20 63 61 6c 6c 73 20 66 6f 72 20 74 68  ing calls for th
1bf30 65 20 71 75 65 72 79 20 74 6f 20 61 62 6f 72 74  e query to abort
1bf40 2c 20 74 68 69 73 20 73 75 62 72 6f 75 74 69 6e  , this subroutin
1bf50 65 0a 20 20 20 20 20 20 2a 2a 20 69 6e 63 72 65  e.      ** incre
1bf60 6d 65 6e 74 73 20 74 68 65 20 69 41 62 6f 72 74  ments the iAbort
1bf70 46 6c 61 67 20 6d 65 6d 6f 72 79 20 6c 6f 63 61  Flag memory loca
1bf80 74 69 6f 6e 20 62 65 66 6f 72 65 20 72 65 74 75  tion before retu
1bf90 72 6e 69 6e 67 20 69 6e 0a 20 20 20 20 20 20 2a  rning in.      *
1bfa0 2a 20 6f 72 64 65 72 20 74 6f 20 73 69 67 6e 61  * order to signa
1bfb0 6c 20 74 68 65 20 63 61 6c 6c 65 72 20 74 6f 20  l the caller to 
1bfc0 61 62 6f 72 74 2e 0a 20 20 20 20 20 20 2a 2f 0a  abort..      */.
1bfd0 20 20 20 20 20 20 61 64 64 72 53 65 74 41 62 6f        addrSetAbo
1bfe0 72 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  rt = sqlite3Vdbe
1bff0 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b 0a  CurrentAddr(v);.
1c000 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
1c010 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e  eAddOp2(v, OP_In
1c020 74 65 67 65 72 2c 20 31 2c 20 69 41 62 6f 72 74  teger, 1, iAbort
1c030 46 6c 61 67 29 3b 0a 20 20 20 20 20 20 56 64 62  Flag);.      Vdb
1c040 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 73 65  eComment((v, "se
1c050 74 20 61 62 6f 72 74 20 66 6c 61 67 22 29 29 3b  t abort flag"));
1c060 0a 20 20 20 20 20 20 72 65 67 4f 75 74 70 75 74  .      regOutput
1c070 52 6f 77 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e  Row = ++pParse->
1c080 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 73 71 6c 69  nMem;.      sqli
1c090 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c  te3VdbeAddOp1(v,
1c0a0 20 4f 50 5f 52 65 74 75 72 6e 2c 20 72 65 67 4f   OP_Return, regO
1c0b0 75 74 70 75 74 52 6f 77 29 3b 0a 20 20 20 20 20  utputRow);.     
1c0c0 20 61 64 64 72 4f 75 74 70 75 74 52 6f 77 20 3d   addrOutputRow =
1c0d0 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72   sqlite3VdbeCurr
1c0e0 65 6e 74 41 64 64 72 28 76 29 3b 0a 20 20 20 20  entAddr(v);.    
1c0f0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
1c100 4f 70 32 28 76 2c 20 4f 50 5f 49 66 50 6f 73 2c  Op2(v, OP_IfPos,
1c110 20 69 55 73 65 46 6c 61 67 2c 20 61 64 64 72 4f   iUseFlag, addrO
1c120 75 74 70 75 74 52 6f 77 2b 32 29 3b 0a 20 20 20  utputRow+2);.   
1c130 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28     VdbeComment((
1c140 76 2c 20 22 47 72 6f 75 70 62 79 20 72 65 73 75  v, "Groupby resu
1c150 6c 74 20 67 65 6e 65 72 61 74 6f 72 20 65 6e 74  lt generator ent
1c160 72 79 20 70 6f 69 6e 74 22 29 29 3b 0a 20 20 20  ry point"));.   
1c170 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
1c180 64 4f 70 31 28 76 2c 20 4f 50 5f 52 65 74 75 72  dOp1(v, OP_Retur
1c190 6e 2c 20 72 65 67 4f 75 74 70 75 74 52 6f 77 29  n, regOutputRow)
1c1a0 3b 0a 20 20 20 20 20 20 66 69 6e 61 6c 69 7a 65  ;.      finalize
1c1b0 41 67 67 46 75 6e 63 74 69 6f 6e 73 28 70 50 61  AggFunctions(pPa
1c1c0 72 73 65 2c 20 26 73 41 67 67 49 6e 66 6f 29 3b  rse, &sAggInfo);
1c1d0 0a 20 20 20 20 20 20 69 66 28 20 70 48 61 76 69  .      if( pHavi
1c1e0 6e 67 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  ng ){.        sq
1c1f0 6c 69 74 65 33 45 78 70 72 49 66 46 61 6c 73 65  lite3ExprIfFalse
1c200 28 70 50 61 72 73 65 2c 20 70 48 61 76 69 6e 67  (pParse, pHaving
1c210 2c 20 61 64 64 72 4f 75 74 70 75 74 52 6f 77 2b  , addrOutputRow+
1c220 31 2c 20 53 51 4c 49 54 45 5f 4a 55 4d 50 49 46  1, SQLITE_JUMPIF
1c230 4e 55 4c 4c 29 3b 0a 20 20 20 20 20 20 7d 0a 20  NULL);.      }. 
1c240 20 20 20 20 20 73 65 6c 65 63 74 49 6e 6e 65 72       selectInner
1c250 4c 6f 6f 70 28 70 50 61 72 73 65 2c 20 70 2c 20  Loop(pParse, p, 
1c260 70 2d 3e 70 45 4c 69 73 74 2c 20 30 2c 20 30 2c  p->pEList, 0, 0,
1c270 20 70 4f 72 64 65 72 42 79 2c 0a 20 20 20 20 20   pOrderBy,.     
1c280 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c290 20 64 69 73 74 69 6e 63 74 2c 20 70 44 65 73 74   distinct, pDest
1c2a0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
1c2b0 20 20 20 20 20 20 20 20 61 64 64 72 4f 75 74 70          addrOutp
1c2c0 75 74 52 6f 77 2b 31 2c 20 61 64 64 72 53 65 74  utRow+1, addrSet
1c2d0 41 62 6f 72 74 2c 20 61 66 66 29 3b 0a 20 20 20  Abort, aff);.   
1c2e0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
1c2f0 64 4f 70 31 28 76 2c 20 4f 50 5f 52 65 74 75 72  dOp1(v, OP_Retur
1c300 6e 2c 20 72 65 67 4f 75 74 70 75 74 52 6f 77 29  n, regOutputRow)
1c310 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d  ;.      VdbeComm
1c320 65 6e 74 28 28 76 2c 20 22 65 6e 64 20 67 72 6f  ent((v, "end gro
1c330 75 70 62 79 20 72 65 73 75 6c 74 20 67 65 6e 65  upby result gene
1c340 72 61 74 6f 72 22 29 29 3b 0a 0a 20 20 20 20 20  rator"));..     
1c350 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 61 20 73   /* Generate a s
1c360 75 62 72 6f 75 74 69 6e 65 20 74 68 61 74 20 77  ubroutine that w
1c370 69 6c 6c 20 72 65 73 65 74 20 74 68 65 20 67 72  ill reset the gr
1c380 6f 75 70 2d 62 79 20 61 63 63 75 6d 75 6c 61 74  oup-by accumulat
1c390 6f 72 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  or.      */.    
1c3a0 20 20 61 64 64 72 52 65 73 65 74 20 3d 20 73 71    addrReset = sq
1c3b0 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74  lite3VdbeCurrent
1c3c0 41 64 64 72 28 76 29 3b 0a 20 20 20 20 20 20 72  Addr(v);.      r
1c3d0 65 67 52 65 73 65 74 20 3d 20 2b 2b 70 50 61 72  egReset = ++pPar
1c3e0 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20  se->nMem;.      
1c3f0 72 65 73 65 74 41 63 63 75 6d 75 6c 61 74 6f 72  resetAccumulator
1c400 28 70 50 61 72 73 65 2c 20 26 73 41 67 67 49 6e  (pParse, &sAggIn
1c410 66 6f 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  fo);.      sqlit
1c420 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20  e3VdbeAddOp1(v, 
1c430 4f 50 5f 52 65 74 75 72 6e 2c 20 72 65 67 52 65  OP_Return, regRe
1c440 73 65 74 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20  set);..      /* 
1c450 42 65 67 69 6e 20 61 20 6c 6f 6f 70 20 74 68 61  Begin a loop tha
1c460 74 20 77 69 6c 6c 20 65 78 74 72 61 63 74 20 61  t will extract a
1c470 6c 6c 20 73 6f 75 72 63 65 20 72 6f 77 73 20 69  ll source rows i
1c480 6e 20 47 52 4f 55 50 20 42 59 20 6f 72 64 65 72  n GROUP BY order
1c490 2e 0a 20 20 20 20 20 20 2a 2a 20 54 68 69 73 20  ..      ** This 
1c4a0 6d 69 67 68 74 20 69 6e 76 6f 6c 76 65 20 74 77  might involve tw
1c4b0 6f 20 73 65 70 61 72 61 74 65 20 6c 6f 6f 70 73  o separate loops
1c4c0 20 77 69 74 68 20 61 6e 20 4f 50 5f 53 6f 72 74   with an OP_Sort
1c4d0 20 69 6e 20 62 65 74 77 65 65 6e 2c 20 6f 72 0a   in between, or.
1c4e0 20 20 20 20 20 20 2a 2a 20 69 74 20 6d 69 67 68        ** it migh
1c4f0 74 20 62 65 20 61 20 73 69 6e 67 6c 65 20 6c 6f  t be a single lo
1c500 6f 70 20 74 68 61 74 20 75 73 65 73 20 61 6e 20  op that uses an 
1c510 69 6e 64 65 78 20 74 6f 20 65 78 74 72 61 63 74  index to extract
1c520 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 0a 20 20 20   information.   
1c530 20 20 20 2a 2a 20 69 6e 20 74 68 65 20 72 69 67     ** in the rig
1c540 68 74 20 6f 72 64 65 72 20 74 6f 20 62 65 67 69  ht order to begi
1c550 6e 20 77 69 74 68 2e 0a 20 20 20 20 20 20 2a 2f  n with..      */
1c560 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
1c570 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76  beResolveLabel(v
1c580 2c 20 61 64 64 72 49 6e 69 74 69 61 6c 69 7a 65  , addrInitialize
1c590 4c 6f 6f 70 29 3b 0a 20 20 20 20 20 20 73 71 6c  Loop);.      sql
1c5a0 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
1c5b0 2c 20 4f 50 5f 47 6f 73 75 62 2c 20 72 65 67 52  , OP_Gosub, regR
1c5c0 65 73 65 74 2c 20 61 64 64 72 52 65 73 65 74 29  eset, addrReset)
1c5d0 3b 0a 20 20 20 20 20 20 70 57 49 6e 66 6f 20 3d  ;.      pWInfo =
1c5e0 20 73 71 6c 69 74 65 33 57 68 65 72 65 42 65 67   sqlite3WhereBeg
1c5f0 69 6e 28 70 50 61 72 73 65 2c 20 70 54 61 62 4c  in(pParse, pTabL
1c600 69 73 74 2c 20 70 57 68 65 72 65 2c 20 26 70 47  ist, pWhere, &pG
1c610 72 6f 75 70 42 79 2c 20 30 29 3b 0a 20 20 20 20  roupBy, 0);.    
1c620 20 20 69 66 28 20 70 57 49 6e 66 6f 3d 3d 30 20    if( pWInfo==0 
1c630 29 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e  ) goto select_en
1c640 64 3b 0a 20 20 20 20 20 20 69 66 28 20 70 47 72  d;.      if( pGr
1c650 6f 75 70 42 79 3d 3d 30 20 29 7b 0a 20 20 20 20  oupBy==0 ){.    
1c660 20 20 20 20 2f 2a 20 54 68 65 20 6f 70 74 69 6d      /* The optim
1c670 69 7a 65 72 20 69 73 20 61 62 6c 65 20 74 6f 20  izer is able to 
1c680 64 65 6c 69 76 65 72 20 72 6f 77 73 20 69 6e 20  deliver rows in 
1c690 67 72 6f 75 70 20 62 79 20 6f 72 64 65 72 20 73  group by order s
1c6a0 6f 0a 20 20 20 20 20 20 20 20 2a 2a 20 77 65 20  o.        ** we 
1c6b0 64 6f 20 6e 6f 74 20 68 61 76 65 20 74 6f 20 73  do not have to s
1c6c0 6f 72 74 2e 20 20 54 68 65 20 4f 50 5f 4f 70 65  ort.  The OP_Ope
1c6d0 6e 45 70 68 65 6d 65 72 61 6c 20 74 61 62 6c 65  nEphemeral table
1c6e0 20 77 69 6c 6c 20 62 65 0a 20 20 20 20 20 20 20   will be.       
1c6f0 20 2a 2a 20 63 61 6e 63 65 6c 6c 65 64 20 6c 61   ** cancelled la
1c700 74 65 72 20 62 65 63 61 75 73 65 20 77 65 20 73  ter because we s
1c710 74 69 6c 6c 20 6e 65 65 64 20 74 6f 20 75 73 65  till need to use
1c720 20 74 68 65 20 70 4b 65 79 49 6e 66 6f 0a 20 20   the pKeyInfo.  
1c730 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
1c740 20 70 47 72 6f 75 70 42 79 20 3d 20 70 2d 3e 70   pGroupBy = p->p
1c750 47 72 6f 75 70 42 79 3b 0a 20 20 20 20 20 20 20  GroupBy;.       
1c760 20 67 72 6f 75 70 42 79 53 6f 72 74 20 3d 20 30   groupBySort = 0
1c770 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
1c780 20 20 20 20 20 20 20 2f 2a 20 52 6f 77 73 20 61         /* Rows a
1c790 72 65 20 63 6f 6d 69 6e 67 20 6f 75 74 20 69 6e  re coming out in
1c7a0 20 75 6e 64 65 74 65 72 6d 69 6e 65 64 20 6f 72   undetermined or
1c7b0 64 65 72 2e 20 20 57 65 20 68 61 76 65 20 74 6f  der.  We have to
1c7c0 20 70 75 73 68 0a 20 20 20 20 20 20 20 20 2a 2a   push.        **
1c7d0 20 65 61 63 68 20 72 6f 77 20 69 6e 74 6f 20 61   each row into a
1c7e0 20 73 6f 72 74 69 6e 67 20 69 6e 64 65 78 2c 20   sorting index, 
1c7f0 74 65 72 6d 69 6e 61 74 65 20 74 68 65 20 66 69  terminate the fi
1c800 72 73 74 20 6c 6f 6f 70 2c 0a 20 20 20 20 20 20  rst loop,.      
1c810 20 20 2a 2a 20 74 68 65 6e 20 6c 6f 6f 70 20 6f    ** then loop o
1c820 76 65 72 20 74 68 65 20 73 6f 72 74 69 6e 67 20  ver the sorting 
1c830 69 6e 64 65 78 20 69 6e 20 6f 72 64 65 72 20 74  index in order t
1c840 6f 20 67 65 74 20 74 68 65 20 6f 75 74 70 75 74  o get the output
1c850 0a 20 20 20 20 20 20 20 20 2a 2a 20 69 6e 20 73  .        ** in s
1c860 6f 72 74 65 64 20 6f 72 64 65 72 0a 20 20 20 20  orted order.    
1c870 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 69      */.        i
1c880 6e 74 20 72 65 67 42 61 73 65 3b 0a 20 20 20 20  nt regBase;.    
1c890 20 20 20 20 69 6e 74 20 72 65 67 52 65 63 6f 72      int regRecor
1c8a0 64 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6e  d;.        int n
1c8b0 43 6f 6c 3b 0a 20 20 20 20 20 20 20 20 69 6e 74  Col;.        int
1c8c0 20 6e 47 72 6f 75 70 42 79 3b 0a 0a 20 20 20 20   nGroupBy;..    
1c8d0 20 20 20 20 67 72 6f 75 70 42 79 53 6f 72 74 20      groupBySort 
1c8e0 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 6e 47 72  = 1;.        nGr
1c8f0 6f 75 70 42 79 20 3d 20 70 47 72 6f 75 70 42 79  oupBy = pGroupBy
1c900 2d 3e 6e 45 78 70 72 3b 0a 20 20 20 20 20 20 20  ->nExpr;.       
1c910 20 6e 43 6f 6c 20 3d 20 6e 47 72 6f 75 70 42 79   nCol = nGroupBy
1c920 20 2b 20 31 3b 0a 20 20 20 20 20 20 20 20 6a 20   + 1;.        j 
1c930 3d 20 6e 47 72 6f 75 70 42 79 2b 31 3b 0a 20 20  = nGroupBy+1;.  
1c940 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69        for(i=0; i
1c950 3c 73 41 67 67 49 6e 66 6f 2e 6e 43 6f 6c 75 6d  <sAggInfo.nColum
1c960 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20  n; i++){.       
1c970 20 20 20 69 66 28 20 73 41 67 67 49 6e 66 6f 2e     if( sAggInfo.
1c980 61 43 6f 6c 5b 69 5d 2e 69 53 6f 72 74 65 72 43  aCol[i].iSorterC
1c990 6f 6c 75 6d 6e 3e 3d 6a 20 29 7b 0a 20 20 20 20  olumn>=j ){.    
1c9a0 20 20 20 20 20 20 20 20 6e 43 6f 6c 2b 2b 3b 0a          nCol++;.
1c9b0 20 20 20 20 20 20 20 20 20 20 20 20 6a 2b 2b 3b              j++;
1c9c0 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
1c9d0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 72       }.        r
1c9e0 65 67 42 61 73 65 20 3d 20 73 71 6c 69 74 65 33  egBase = sqlite3
1c9f0 47 65 74 54 65 6d 70 52 61 6e 67 65 28 70 50 61  GetTempRange(pPa
1ca00 72 73 65 2c 20 6e 43 6f 6c 29 3b 0a 20 20 20 20  rse, nCol);.    
1ca10 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
1ca20 6f 64 65 45 78 70 72 4c 69 73 74 28 70 50 61 72  odeExprList(pPar
1ca30 73 65 2c 20 70 47 72 6f 75 70 42 79 2c 20 72 65  se, pGroupBy, re
1ca40 67 42 61 73 65 2c 20 30 29 3b 0a 20 20 20 20 20  gBase, 0);.     
1ca50 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
1ca60 64 4f 70 32 28 76 2c 20 4f 50 5f 53 65 71 75 65  dOp2(v, OP_Seque
1ca70 6e 63 65 2c 20 73 41 67 67 49 6e 66 6f 2e 73 6f  nce, sAggInfo.so
1ca80 72 74 69 6e 67 49 64 78 2c 72 65 67 42 61 73 65  rtingIdx,regBase
1ca90 2b 6e 47 72 6f 75 70 42 79 29 3b 0a 20 20 20 20  +nGroupBy);.    
1caa0 20 20 20 20 6a 20 3d 20 6e 47 72 6f 75 70 42 79      j = nGroupBy
1cab0 2b 31 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28  +1;.        for(
1cac0 69 3d 30 3b 20 69 3c 73 41 67 67 49 6e 66 6f 2e  i=0; i<sAggInfo.
1cad0 6e 43 6f 6c 75 6d 6e 3b 20 69 2b 2b 29 7b 0a 20  nColumn; i++){. 
1cae0 20 20 20 20 20 20 20 20 20 73 74 72 75 63 74 20           struct 
1caf0 41 67 67 49 6e 66 6f 5f 63 6f 6c 20 2a 70 43 6f  AggInfo_col *pCo
1cb00 6c 20 3d 20 26 73 41 67 67 49 6e 66 6f 2e 61 43  l = &sAggInfo.aC
1cb10 6f 6c 5b 69 5d 3b 0a 20 20 20 20 20 20 20 20 20  ol[i];.         
1cb20 20 69 66 28 20 70 43 6f 6c 2d 3e 69 53 6f 72 74   if( pCol->iSort
1cb30 65 72 43 6f 6c 75 6d 6e 3e 3d 6a 20 29 7b 0a 20  erColumn>=j ){. 
1cb40 20 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 72             int r
1cb50 31 20 3d 20 6a 20 2b 20 72 65 67 42 61 73 65 3b  1 = j + regBase;
1cb60 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 6e 74  .            int
1cb70 20 72 32 20 3d 20 73 71 6c 69 74 65 33 45 78 70   r2 = sqlite3Exp
1cb80 72 43 6f 64 65 47 65 74 43 6f 6c 75 6d 6e 28 70  rCodeGetColumn(p
1cb90 50 61 72 73 65 2c 20 0a 20 20 20 20 20 20 20 20  Parse, .        
1cba0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1cbb0 20 20 20 20 20 20 20 70 43 6f 6c 2d 3e 70 54 61         pCol->pTa
1cbc0 62 2c 20 70 43 6f 6c 2d 3e 69 43 6f 6c 75 6d 6e  b, pCol->iColumn
1cbd0 2c 20 70 43 6f 6c 2d 3e 69 54 61 62 6c 65 2c 20  , pCol->iTable, 
1cbe0 72 31 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20  r1, 0);.        
1cbf0 20 20 20 20 69 66 28 20 72 31 21 3d 72 32 20 29      if( r1!=r2 )
1cc00 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
1cc10 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
1cc20 32 28 76 2c 20 4f 50 5f 53 43 6f 70 79 2c 20 72  2(v, OP_SCopy, r
1cc30 32 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 20 20  2, r1);.        
1cc40 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
1cc50 20 20 6a 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20    j++;.         
1cc60 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20   }.        }.   
1cc70 20 20 20 20 20 72 65 67 52 65 63 6f 72 64 20 3d       regRecord =
1cc80 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52   sqlite3GetTempR
1cc90 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20  eg(pParse);.    
1cca0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
1ccb0 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4d 61 6b 65  ddOp3(v, OP_Make
1ccc0 52 65 63 6f 72 64 2c 20 72 65 67 42 61 73 65 2c  Record, regBase,
1ccd0 20 6e 43 6f 6c 2c 20 72 65 67 52 65 63 6f 72 64   nCol, regRecord
1cce0 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
1ccf0 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
1cd00 4f 50 5f 49 64 78 49 6e 73 65 72 74 2c 20 73 41  OP_IdxInsert, sA
1cd10 67 67 49 6e 66 6f 2e 73 6f 72 74 69 6e 67 49 64  ggInfo.sortingId
1cd20 78 2c 20 72 65 67 52 65 63 6f 72 64 29 3b 0a 20  x, regRecord);. 
1cd30 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 65         sqlite3Re
1cd40 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61  leaseTempReg(pPa
1cd50 72 73 65 2c 20 72 65 67 52 65 63 6f 72 64 29 3b  rse, regRecord);
1cd60 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
1cd70 52 65 6c 65 61 73 65 54 65 6d 70 52 61 6e 67 65  ReleaseTempRange
1cd80 28 70 50 61 72 73 65 2c 20 72 65 67 42 61 73 65  (pParse, regBase
1cd90 2c 20 6e 43 6f 6c 29 3b 0a 20 20 20 20 20 20 20  , nCol);.       
1cda0 20 73 71 6c 69 74 65 33 57 68 65 72 65 45 6e 64   sqlite3WhereEnd
1cdb0 28 70 57 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20  (pWInfo);.      
1cdc0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
1cdd0 4f 70 32 28 76 2c 20 4f 50 5f 53 6f 72 74 2c 20  Op2(v, OP_Sort, 
1cde0 73 41 67 67 49 6e 66 6f 2e 73 6f 72 74 69 6e 67  sAggInfo.sorting
1cdf0 49 64 78 2c 20 61 64 64 72 45 6e 64 29 3b 0a 20  Idx, addrEnd);. 
1ce00 20 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65         VdbeComme
1ce10 6e 74 28 28 76 2c 20 22 47 52 4f 55 50 20 42 59  nt((v, "GROUP BY
1ce20 20 73 6f 72 74 22 29 29 3b 0a 20 20 20 20 20 20   sort"));.      
1ce30 20 20 73 41 67 67 49 6e 66 6f 2e 75 73 65 53 6f    sAggInfo.useSo
1ce40 72 74 69 6e 67 49 64 78 20 3d 20 31 3b 0a 20 20  rtingIdx = 1;.  
1ce50 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20      }..      /* 
1ce60 45 76 61 6c 75 61 74 65 20 74 68 65 20 63 75 72  Evaluate the cur
1ce70 72 65 6e 74 20 47 52 4f 55 50 20 42 59 20 74 65  rent GROUP BY te
1ce80 72 6d 73 20 61 6e 64 20 73 74 6f 72 65 20 69 6e  rms and store in
1ce90 20 62 30 2c 20 62 31 2c 20 62 32 2e 2e 2e 0a 20   b0, b1, b2.... 
1cea0 20 20 20 20 20 2a 2a 20 28 62 30 20 69 73 20 6d       ** (b0 is m
1ceb0 65 6d 6f 72 79 20 6c 6f 63 61 74 69 6f 6e 20 69  emory location i
1cec0 42 4d 65 6d 2b 30 2c 20 62 31 20 69 73 20 69 42  BMem+0, b1 is iB
1ced0 4d 65 6d 2b 31 2c 20 61 6e 64 20 73 6f 20 66 6f  Mem+1, and so fo
1cee0 72 74 68 29 0a 20 20 20 20 20 20 2a 2a 20 54 68  rth).      ** Th
1cef0 65 6e 20 63 6f 6d 70 61 72 65 20 74 68 65 20 63  en compare the c
1cf00 75 72 72 65 6e 74 20 47 52 4f 55 50 20 42 59 20  urrent GROUP BY 
1cf10 74 65 72 6d 73 20 61 67 61 69 6e 73 74 20 74 68  terms against th
1cf20 65 20 47 52 4f 55 50 20 42 59 20 74 65 72 6d 73  e GROUP BY terms
1cf30 0a 20 20 20 20 20 20 2a 2a 20 66 72 6f 6d 20 74  .      ** from t
1cf40 68 65 20 70 72 65 76 69 6f 75 73 20 72 6f 77 20  he previous row 
1cf50 63 75 72 72 65 6e 74 6c 79 20 73 74 6f 72 65 64  currently stored
1cf60 20 69 6e 20 61 30 2c 20 61 31 2c 20 61 32 2e 2e   in a0, a1, a2..
1cf70 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
1cf80 20 61 64 64 72 54 6f 70 4f 66 4c 6f 6f 70 20 3d   addrTopOfLoop =
1cf90 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72   sqlite3VdbeCurr
1cfa0 65 6e 74 41 64 64 72 28 76 29 3b 0a 20 20 20 20  entAddr(v);.    
1cfb0 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 47 72    for(j=0; j<pGr
1cfc0 6f 75 70 42 79 2d 3e 6e 45 78 70 72 3b 20 6a 2b  oupBy->nExpr; j+
1cfd0 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20  +){.        if( 
1cfe0 67 72 6f 75 70 42 79 53 6f 72 74 20 29 7b 0a 20  groupBySort ){. 
1cff0 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
1d000 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
1d010 5f 43 6f 6c 75 6d 6e 2c 20 73 41 67 67 49 6e 66  _Column, sAggInf
1d020 6f 2e 73 6f 72 74 69 6e 67 49 64 78 2c 20 6a 2c  o.sortingIdx, j,
1d030 20 69 42 4d 65 6d 2b 6a 29 3b 0a 20 20 20 20 20   iBMem+j);.     
1d040 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1d050 20 20 20 20 73 41 67 67 49 6e 66 6f 2e 64 69 72      sAggInfo.dir
1d060 65 63 74 4d 6f 64 65 20 3d 20 31 3b 0a 20 20 20  ectMode = 1;.   
1d070 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78         sqlite3Ex
1d080 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70  prCode(pParse, p
1d090 47 72 6f 75 70 42 79 2d 3e 61 5b 6a 5d 2e 70 45  GroupBy->a[j].pE
1d0a0 78 70 72 2c 20 69 42 4d 65 6d 2b 6a 29 3b 0a 20  xpr, iBMem+j);. 
1d0b0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
1d0c0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
1d0d0 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 43  beAddOp4(v, OP_C
1d0e0 6f 6d 70 61 72 65 2c 20 69 41 4d 65 6d 2c 20 69  ompare, iAMem, i
1d0f0 42 4d 65 6d 2c 20 70 47 72 6f 75 70 42 79 2d 3e  BMem, pGroupBy->
1d100 6e 45 78 70 72 2c 0a 20 20 20 20 20 20 20 20 20  nExpr,.         
1d110 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d120 20 28 63 68 61 72 2a 29 70 4b 65 79 49 6e 66 6f   (char*)pKeyInfo
1d130 2c 20 50 34 5f 4b 45 59 49 4e 46 4f 5f 53 54 41  , P4_KEYINFO_STA
1d140 54 49 43 29 3b 0a 20 20 20 20 20 20 6a 31 20 3d  TIC);.      j1 =
1d150 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72   sqlite3VdbeCurr
1d160 65 6e 74 41 64 64 72 28 76 29 3b 0a 20 20 20 20  entAddr(v);.    
1d170 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
1d180 4f 70 33 28 76 2c 20 4f 50 5f 4a 75 6d 70 2c 20  Op3(v, OP_Jump, 
1d190 6a 31 2b 31 2c 20 30 2c 20 6a 31 2b 31 29 3b 0a  j1+1, 0, j1+1);.
1d1a0 0a 20 20 20 20 20 20 2f 2a 20 47 65 6e 65 72 61  .      /* Genera
1d1b0 74 65 20 63 6f 64 65 20 74 68 61 74 20 72 75 6e  te code that run
1d1c0 73 20 77 68 65 6e 65 76 65 72 20 74 68 65 20 47  s whenever the G
1d1d0 52 4f 55 50 20 42 59 20 63 68 61 6e 67 65 73 2e  ROUP BY changes.
1d1e0 0a 20 20 20 20 20 20 2a 2a 20 43 68 61 6e 67 65  .      ** Change
1d1f0 73 20 69 6e 20 74 68 65 20 47 52 4f 55 50 20 42  s in the GROUP B
1d200 59 20 61 72 65 20 64 65 74 65 63 74 65 64 20 62  Y are detected b
1d210 79 20 74 68 65 20 70 72 65 76 69 6f 75 73 20 63  y the previous c
1d220 6f 64 65 0a 20 20 20 20 20 20 2a 2a 20 62 6c 6f  ode.      ** blo
1d230 63 6b 2e 20 20 49 66 20 74 68 65 72 65 20 77 65  ck.  If there we
1d240 72 65 20 6e 6f 20 63 68 61 6e 67 65 73 2c 20 74  re no changes, t
1d250 68 69 73 20 62 6c 6f 63 6b 20 69 73 20 73 6b 69  his block is ski
1d260 70 70 65 64 2e 0a 20 20 20 20 20 20 2a 2a 0a 20  pped..      **. 
1d270 20 20 20 20 20 2a 2a 20 54 68 69 73 20 63 6f 64       ** This cod
1d280 65 20 63 6f 70 69 65 73 20 63 75 72 72 65 6e 74  e copies current
1d290 20 67 72 6f 75 70 20 62 79 20 74 65 72 6d 73 20   group by terms 
1d2a0 69 6e 20 62 30 2c 62 31 2c 62 32 2c 2e 2e 2e 0a  in b0,b1,b2,....
1d2b0 20 20 20 20 20 20 2a 2a 20 6f 76 65 72 20 74 6f        ** over to
1d2c0 20 61 30 2c 61 31 2c 61 32 2e 20 20 49 74 20 74   a0,a1,a2.  It t
1d2d0 68 65 6e 20 63 61 6c 6c 73 20 74 68 65 20 6f 75  hen calls the ou
1d2e0 74 70 75 74 20 73 75 62 72 6f 75 74 69 6e 65 0a  tput subroutine.
1d2f0 20 20 20 20 20 20 2a 2a 20 61 6e 64 20 72 65 73        ** and res
1d300 65 74 73 20 74 68 65 20 61 67 67 72 65 67 61 74  ets the aggregat
1d310 65 20 61 63 63 75 6d 75 6c 61 74 6f 72 20 72 65  e accumulator re
1d320 67 69 73 74 65 72 73 20 69 6e 20 70 72 65 70 61  gisters in prepa
1d330 72 61 74 69 6f 6e 0a 20 20 20 20 20 20 2a 2a 20  ration.      ** 
1d340 66 6f 72 20 74 68 65 20 6e 65 78 74 20 47 52 4f  for the next GRO
1d350 55 50 20 42 59 20 62 61 74 63 68 2e 0a 20 20 20  UP BY batch..   
1d360 20 20 20 2a 2f 0a 20 20 20 20 20 20 66 6f 72 28     */.      for(
1d370 6a 3d 30 3b 20 6a 3c 70 47 72 6f 75 70 42 79 2d  j=0; j<pGroupBy-
1d380 3e 6e 45 78 70 72 3b 20 6a 2b 2b 29 7b 0a 20 20  >nExpr; j++){.  
1d390 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
1d3a0 72 43 6f 64 65 4d 6f 76 65 28 70 50 61 72 73 65  rCodeMove(pParse
1d3b0 2c 20 69 42 4d 65 6d 2b 6a 2c 20 69 41 4d 65 6d  , iBMem+j, iAMem
1d3c0 2b 6a 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  +j);.      }.   
1d3d0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
1d3e0 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 73 75 62  dOp2(v, OP_Gosub
1d3f0 2c 20 72 65 67 4f 75 74 70 75 74 52 6f 77 2c 20  , regOutputRow, 
1d400 61 64 64 72 4f 75 74 70 75 74 52 6f 77 29 3b 0a  addrOutputRow);.
1d410 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e        VdbeCommen
1d420 74 28 28 76 2c 20 22 6f 75 74 70 75 74 20 6f 6e  t((v, "output on
1d430 65 20 72 6f 77 22 29 29 3b 0a 20 20 20 20 20 20  e row"));.      
1d440 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
1d450 32 28 76 2c 20 4f 50 5f 49 66 50 6f 73 2c 20 69  2(v, OP_IfPos, i
1d460 41 62 6f 72 74 46 6c 61 67 2c 20 61 64 64 72 45  AbortFlag, addrE
1d470 6e 64 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43  nd);.      VdbeC
1d480 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 63 68 65 63  omment((v, "chec
1d490 6b 20 61 62 6f 72 74 20 66 6c 61 67 22 29 29 3b  k abort flag"));
1d4a0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
1d4b0 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47  beAddOp2(v, OP_G
1d4c0 6f 73 75 62 2c 20 72 65 67 52 65 73 65 74 2c 20  osub, regReset, 
1d4d0 61 64 64 72 52 65 73 65 74 29 3b 0a 20 20 20 20  addrReset);.    
1d4e0 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76    VdbeComment((v
1d4f0 2c 20 22 72 65 73 65 74 20 61 63 63 75 6d 75 6c  , "reset accumul
1d500 61 74 6f 72 22 29 29 3b 0a 0a 20 20 20 20 20 20  ator"));..      
1d510 2f 2a 20 55 70 64 61 74 65 20 74 68 65 20 61 67  /* Update the ag
1d520 67 72 65 67 61 74 65 20 61 63 63 75 6d 75 6c 61  gregate accumula
1d530 74 6f 72 73 20 62 61 73 65 64 20 6f 6e 20 74 68  tors based on th
1d540 65 20 63 6f 6e 74 65 6e 74 20 6f 66 0a 20 20 20  e content of.   
1d550 20 20 20 2a 2a 20 74 68 65 20 63 75 72 72 65 6e     ** the curren
1d560 74 20 72 6f 77 0a 20 20 20 20 20 20 2a 2f 0a 20  t row.      */. 
1d570 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
1d580 4a 75 6d 70 48 65 72 65 28 76 2c 20 6a 31 29 3b  JumpHere(v, j1);
1d590 0a 20 20 20 20 20 20 75 70 64 61 74 65 41 63 63  .      updateAcc
1d5a0 75 6d 75 6c 61 74 6f 72 28 70 50 61 72 73 65 2c  umulator(pParse,
1d5b0 20 26 73 41 67 67 49 6e 66 6f 29 3b 0a 20 20 20   &sAggInfo);.   
1d5c0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
1d5d0 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67  dOp2(v, OP_Integ
1d5e0 65 72 2c 20 31 2c 20 69 55 73 65 46 6c 61 67 29  er, 1, iUseFlag)
1d5f0 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d  ;.      VdbeComm
1d600 65 6e 74 28 28 76 2c 20 22 69 6e 64 69 63 61 74  ent((v, "indicat
1d610 65 20 64 61 74 61 20 69 6e 20 61 63 63 75 6d 75  e data in accumu
1d620 6c 61 74 6f 72 22 29 29 3b 0a 0a 20 20 20 20 20  lator"));..     
1d630 20 2f 2a 20 45 6e 64 20 6f 66 20 74 68 65 20 6c   /* End of the l
1d640 6f 6f 70 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  oop.      */.   
1d650 20 20 20 69 66 28 20 67 72 6f 75 70 42 79 53 6f     if( groupBySo
1d660 72 74 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  rt ){.        sq
1d670 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
1d680 76 2c 20 4f 50 5f 4e 65 78 74 2c 20 73 41 67 67  v, OP_Next, sAgg
1d690 49 6e 66 6f 2e 73 6f 72 74 69 6e 67 49 64 78 2c  Info.sortingIdx,
1d6a0 20 61 64 64 72 54 6f 70 4f 66 4c 6f 6f 70 29 3b   addrTopOfLoop);
1d6b0 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
1d6c0 20 20 20 20 20 20 73 71 6c 69 74 65 33 57 68 65        sqlite3Whe
1d6d0 72 65 45 6e 64 28 70 57 49 6e 66 6f 29 3b 0a 20  reEnd(pWInfo);. 
1d6e0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
1d6f0 62 65 43 68 61 6e 67 65 54 6f 4e 6f 6f 70 28 76  beChangeToNoop(v
1d700 2c 20 61 64 64 72 53 6f 72 74 69 6e 67 49 64 78  , addrSortingIdx
1d710 2c 20 31 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20  , 1);.      }.. 
1d720 20 20 20 20 20 2f 2a 20 4f 75 74 70 75 74 20 74       /* Output t
1d730 68 65 20 66 69 6e 61 6c 20 72 6f 77 20 6f 66 20  he final row of 
1d740 72 65 73 75 6c 74 0a 20 20 20 20 20 20 2a 2f 0a  result.      */.
1d750 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
1d760 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f  eAddOp2(v, OP_Go
1d770 73 75 62 2c 20 72 65 67 4f 75 74 70 75 74 52 6f  sub, regOutputRo
1d780 77 2c 20 61 64 64 72 4f 75 74 70 75 74 52 6f 77  w, addrOutputRow
1d790 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 6d  );.      VdbeCom
1d7a0 6d 65 6e 74 28 28 76 2c 20 22 6f 75 74 70 75 74  ment((v, "output
1d7b0 20 66 69 6e 61 6c 20 72 6f 77 22 29 29 3b 0a 20   final row"));. 
1d7c0 20 20 20 20 20 0a 20 20 20 20 7d 20 2f 2a 20 65       .    } /* e
1d7d0 6e 64 69 66 20 70 47 72 6f 75 70 42 79 20 2a 2f  ndif pGroupBy */
1d7e0 0a 20 20 20 20 65 6c 73 65 20 7b 0a 20 20 20 20  .    else {.    
1d7f0 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4d 69 6e    ExprList *pMin
1d800 4d 61 78 20 3d 20 30 3b 0a 20 20 20 20 20 20 45  Max = 0;.      E
1d810 78 70 72 4c 69 73 74 20 2a 70 44 65 6c 20 3d 20  xprList *pDel = 
1d820 30 3b 0a 20 20 20 20 20 20 75 38 20 66 6c 61 67  0;.      u8 flag
1d830 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 43 68 65 63  ;..      /* Chec
1d840 6b 20 69 66 20 74 68 65 20 71 75 65 72 79 20 69  k if the query i
1d850 73 20 6f 66 20 6f 6e 65 20 6f 66 20 74 68 65 20  s of one of the 
1d860 66 6f 6c 6c 6f 77 69 6e 67 20 66 6f 72 6d 73 3a  following forms:
1d870 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20  .      **.      
1d880 2a 2a 20 20 20 53 45 4c 45 43 54 20 6d 69 6e 28  **   SELECT min(
1d890 78 29 20 46 52 4f 4d 20 2e 2e 2e 0a 20 20 20 20  x) FROM ....    
1d8a0 20 20 2a 2a 20 20 20 53 45 4c 45 43 54 20 6d 61    **   SELECT ma
1d8b0 78 28 78 29 20 46 52 4f 4d 20 2e 2e 2e 0a 20 20  x(x) FROM ....  
1d8c0 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20      **.      ** 
1d8d0 49 66 20 69 74 20 69 73 2c 20 74 68 65 6e 20 61  If it is, then a
1d8e0 73 6b 20 74 68 65 20 63 6f 64 65 20 69 6e 20 77  sk the code in w
1d8f0 68 65 72 65 2e 63 20 74 6f 20 61 74 74 65 6d 70  here.c to attemp
1d900 74 20 74 6f 20 73 6f 72 74 20 72 65 73 75 6c 74  t to sort result
1d910 73 0a 20 20 20 20 20 20 2a 2a 20 61 73 20 69 66  s.      ** as if
1d920 20 74 68 65 72 65 20 77 61 73 20 61 6e 20 22 4f   there was an "O
1d930 52 44 45 52 20 4f 4e 20 78 22 20 6f 72 20 22 4f  RDER ON x" or "O
1d940 52 44 45 52 20 4f 4e 20 78 20 44 45 53 43 22 20  RDER ON x DESC" 
1d950 63 6c 61 75 73 65 2e 20 0a 20 20 20 20 20 20 2a  clause. .      *
1d960 2a 20 49 66 20 77 68 65 72 65 2e 63 20 69 73 20  * If where.c is 
1d970 61 62 6c 65 20 74 6f 20 70 72 6f 64 75 63 65 20  able to produce 
1d980 72 65 73 75 6c 74 73 20 73 6f 72 74 65 64 20 69  results sorted i
1d990 6e 20 74 68 69 73 20 6f 72 64 65 72 2c 20 74 68  n this order, th
1d9a0 65 6e 0a 20 20 20 20 20 20 2a 2a 20 61 64 64 20  en.      ** add 
1d9b0 76 64 62 65 20 63 6f 64 65 20 74 6f 20 62 72 65  vdbe code to bre
1d9c0 61 6b 20 6f 75 74 20 6f 66 20 74 68 65 20 70 72  ak out of the pr
1d9d0 6f 63 65 73 73 69 6e 67 20 6c 6f 6f 70 20 61 66  ocessing loop af
1d9e0 74 65 72 20 74 68 65 20 0a 20 20 20 20 20 20 2a  ter the .      *
1d9f0 2a 20 66 69 72 73 74 20 69 74 65 72 61 74 69 6f  * first iteratio
1da00 6e 20 28 73 69 6e 63 65 20 74 68 65 20 66 69 72  n (since the fir
1da10 73 74 20 69 74 65 72 61 74 69 6f 6e 20 6f 66 20  st iteration of 
1da20 74 68 65 20 6c 6f 6f 70 20 69 73 20 0a 20 20 20  the loop is .   
1da30 20 20 20 2a 2a 20 67 75 61 72 61 6e 74 65 65 64     ** guaranteed
1da40 20 74 6f 20 6f 70 65 72 61 74 65 20 6f 6e 20 74   to operate on t
1da50 68 65 20 72 6f 77 20 77 69 74 68 20 74 68 65 20  he row with the 
1da60 6d 69 6e 69 6d 75 6d 20 6f 72 20 6d 61 78 69 6d  minimum or maxim
1da70 75 6d 20 0a 20 20 20 20 20 20 2a 2a 20 76 61 6c  um .      ** val
1da80 75 65 20 6f 66 20 78 2c 20 74 68 65 20 6f 6e 6c  ue of x, the onl
1da90 79 20 72 6f 77 20 72 65 71 75 69 72 65 64 29 2e  y row required).
1daa0 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20  .      **.      
1dab0 2a 2a 20 41 20 73 70 65 63 69 61 6c 20 66 6c 61  ** A special fla
1dac0 67 20 6d 75 73 74 20 62 65 20 70 61 73 73 65 64  g must be passed
1dad0 20 74 6f 20 73 71 6c 69 74 65 33 57 68 65 72 65   to sqlite3Where
1dae0 42 65 67 69 6e 28 29 20 74 6f 20 73 6c 69 67 68  Begin() to sligh
1daf0 74 6c 79 0a 20 20 20 20 20 20 2a 2a 20 6d 6f 64  tly.      ** mod
1db00 69 66 79 20 62 65 68 61 76 69 6f 75 72 20 61 73  ify behaviour as
1db10 20 66 6f 6c 6c 6f 77 73 3a 0a 20 20 20 20 20 20   follows:.      
1db20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 20 20 2b 20  **.      **   + 
1db30 49 66 20 74 68 65 20 71 75 65 72 79 20 69 73 20  If the query is 
1db40 61 20 22 53 45 4c 45 43 54 20 6d 69 6e 28 78 29  a "SELECT min(x)
1db50 22 2c 20 74 68 65 6e 20 74 68 65 20 6c 6f 6f 70  ", then the loop
1db60 20 63 6f 64 65 64 20 62 79 0a 20 20 20 20 20 20   coded by.      
1db70 2a 2a 20 20 20 20 20 77 68 65 72 65 2e 63 20 73  **     where.c s
1db80 68 6f 75 6c 64 20 6e 6f 74 20 69 74 65 72 61 74  hould not iterat
1db90 65 20 6f 76 65 72 20 61 6e 79 20 76 61 6c 75 65  e over any value
1dba0 73 20 77 69 74 68 20 61 20 4e 55 4c 4c 20 76 61  s with a NULL va
1dbb0 6c 75 65 0a 20 20 20 20 20 20 2a 2a 20 20 20 20  lue.      **    
1dbc0 20 66 6f 72 20 78 2e 0a 20 20 20 20 20 20 2a 2a   for x..      **
1dbd0 0a 20 20 20 20 20 20 2a 2a 20 20 20 2b 20 54 68  .      **   + Th
1dbe0 65 20 6f 70 74 69 6d 69 7a 65 72 20 63 6f 64 65  e optimizer code
1dbf0 20 69 6e 20 77 68 65 72 65 2e 63 20 28 74 68 65   in where.c (the
1dc00 20 74 68 69 6e 67 20 74 68 61 74 20 64 65 63 69   thing that deci
1dc10 64 65 73 20 77 68 69 63 68 0a 20 20 20 20 20 20  des which.      
1dc20 2a 2a 20 20 20 20 20 69 6e 64 65 78 20 6f 72 20  **     index or 
1dc30 69 6e 64 69 63 65 73 20 74 6f 20 75 73 65 29 20  indices to use) 
1dc40 73 68 6f 75 6c 64 20 70 6c 61 63 65 20 61 20 64  should place a d
1dc50 69 66 66 65 72 65 6e 74 20 70 72 69 6f 72 69 74  ifferent priorit
1dc60 79 20 6f 6e 20 0a 20 20 20 20 20 20 2a 2a 20 20  y on .      **  
1dc70 20 20 20 73 61 74 69 73 66 79 69 6e 67 20 74 68     satisfying th
1dc80 65 20 27 4f 52 44 45 52 20 42 59 27 20 63 6c 61  e 'ORDER BY' cla
1dc90 75 73 65 20 74 68 61 6e 20 69 74 20 64 6f 65 73  use than it does
1dca0 20 69 6e 20 6f 74 68 65 72 20 63 61 73 65 73 2e   in other cases.
1dcb0 0a 20 20 20 20 20 20 2a 2a 20 20 20 20 20 52 65  .      **     Re
1dcc0 66 65 72 20 74 6f 20 63 6f 64 65 20 61 6e 64 20  fer to code and 
1dcd0 63 6f 6d 6d 65 6e 74 73 20 69 6e 20 77 68 65 72  comments in wher
1dce0 65 2e 63 20 66 6f 72 20 64 65 74 61 69 6c 73 2e  e.c for details.
1dcf0 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
1dd00 66 6c 61 67 20 3d 20 6d 69 6e 4d 61 78 51 75 65  flag = minMaxQue
1dd10 72 79 28 70 50 61 72 73 65 2c 20 70 29 3b 0a 20  ry(pParse, p);. 
1dd20 20 20 20 20 20 69 66 28 20 66 6c 61 67 20 29 7b       if( flag ){
1dd30 0a 20 20 20 20 20 20 20 20 70 44 65 6c 20 3d 20  .        pDel = 
1dd40 70 4d 69 6e 4d 61 78 20 3d 20 73 71 6c 69 74 65  pMinMax = sqlite
1dd50 33 45 78 70 72 4c 69 73 74 44 75 70 28 64 62 2c  3ExprListDup(db,
1dd60 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b 30 5d   p->pEList->a[0]
1dd70 2e 70 45 78 70 72 2d 3e 70 4c 69 73 74 29 3b 0a  .pExpr->pList);.
1dd80 20 20 20 20 20 20 20 20 69 66 28 20 70 4d 69 6e          if( pMin
1dd90 4d 61 78 20 26 26 20 21 64 62 2d 3e 6d 61 6c 6c  Max && !db->mall
1dda0 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20  ocFailed ){.    
1ddb0 20 20 20 20 20 20 70 4d 69 6e 4d 61 78 2d 3e 61        pMinMax->a
1ddc0 5b 30 5d 2e 73 6f 72 74 4f 72 64 65 72 20 3d 20  [0].sortOrder = 
1ddd0 28 28 66 6c 61 67 3d 3d 57 48 45 52 45 5f 4f 52  ((flag==WHERE_OR
1dde0 44 45 52 42 59 5f 4d 49 4e 29 3f 30 3a 31 29 3b  DERBY_MIN)?0:1);
1ddf0 0a 20 20 20 20 20 20 20 20 20 20 70 4d 69 6e 4d  .          pMinM
1de00 61 78 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 2d 3e  ax->a[0].pExpr->
1de10 6f 70 20 3d 20 54 4b 5f 43 4f 4c 55 4d 4e 3b 0a  op = TK_COLUMN;.
1de20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
1de30 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 54 68 69 73  }..      /* This
1de40 20 63 61 73 65 20 72 75 6e 73 20 69 66 20 74 68   case runs if th
1de50 65 20 61 67 67 72 65 67 61 74 65 20 68 61 73 20  e aggregate has 
1de60 6e 6f 20 47 52 4f 55 50 20 42 59 20 63 6c 61 75  no GROUP BY clau
1de70 73 65 2e 20 20 54 68 65 0a 20 20 20 20 20 20 2a  se.  The.      *
1de80 2a 20 70 72 6f 63 65 73 73 69 6e 67 20 69 73 20  * processing is 
1de90 6d 75 63 68 20 73 69 6d 70 6c 65 72 20 73 69 6e  much simpler sin
1dea0 63 65 20 74 68 65 72 65 20 69 73 20 6f 6e 6c 79  ce there is only
1deb0 20 61 20 73 69 6e 67 6c 65 20 72 6f 77 0a 20 20   a single row.  
1dec0 20 20 20 20 2a 2a 20 6f 66 20 6f 75 74 70 75 74      ** of output
1ded0 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
1dee0 20 72 65 73 65 74 41 63 63 75 6d 75 6c 61 74 6f   resetAccumulato
1def0 72 28 70 50 61 72 73 65 2c 20 26 73 41 67 67 49  r(pParse, &sAggI
1df00 6e 66 6f 29 3b 0a 20 20 20 20 20 20 70 57 49 6e  nfo);.      pWIn
1df10 66 6f 20 3d 20 73 71 6c 69 74 65 33 57 68 65 72  fo = sqlite3Wher
1df20 65 42 65 67 69 6e 28 70 50 61 72 73 65 2c 20 70  eBegin(pParse, p
1df30 54 61 62 4c 69 73 74 2c 20 70 57 68 65 72 65 2c  TabList, pWhere,
1df40 20 26 70 4d 69 6e 4d 61 78 2c 20 66 6c 61 67 29   &pMinMax, flag)
1df50 3b 0a 20 20 20 20 20 20 69 66 28 20 70 57 49 6e  ;.      if( pWIn
1df60 66 6f 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  fo==0 ){.       
1df70 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
1df80 44 65 6c 65 74 65 28 70 44 65 6c 29 3b 0a 20 20  Delete(pDel);.  
1df90 20 20 20 20 20 20 67 6f 74 6f 20 73 65 6c 65 63        goto selec
1dfa0 74 5f 65 6e 64 3b 0a 20 20 20 20 20 20 7d 0a 20  t_end;.      }. 
1dfb0 20 20 20 20 20 75 70 64 61 74 65 41 63 63 75 6d       updateAccum
1dfc0 75 6c 61 74 6f 72 28 70 50 61 72 73 65 2c 20 26  ulator(pParse, &
1dfd0 73 41 67 67 49 6e 66 6f 29 3b 0a 20 20 20 20 20  sAggInfo);.     
1dfe0 20 69 66 28 20 21 70 4d 69 6e 4d 61 78 20 26 26   if( !pMinMax &&
1dff0 20 66 6c 61 67 20 29 7b 0a 20 20 20 20 20 20 20   flag ){.       
1e000 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
1e010 70 32 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30  p2(v, OP_Goto, 0
1e020 2c 20 70 57 49 6e 66 6f 2d 3e 69 42 72 65 61 6b  , pWInfo->iBreak
1e030 29 3b 0a 20 20 20 20 20 20 20 20 56 64 62 65 43  );.        VdbeC
1e040 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 25 73 28 29  omment((v, "%s()
1e050 20 62 79 20 69 6e 64 65 78 22 2c 28 66 6c 61 67   by index",(flag
1e060 3d 3d 57 48 45 52 45 5f 4f 52 44 45 52 42 59 5f  ==WHERE_ORDERBY_
1e070 4d 49 4e 3f 22 6d 69 6e 22 3a 22 6d 61 78 22 29  MIN?"min":"max")
1e080 29 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ));.      }.    
1e090 20 20 73 71 6c 69 74 65 33 57 68 65 72 65 45 6e    sqlite3WhereEn
1e0a0 64 28 70 57 49 6e 66 6f 29 3b 0a 20 20 20 20 20  d(pWInfo);.     
1e0b0 20 66 69 6e 61 6c 69 7a 65 41 67 67 46 75 6e 63   finalizeAggFunc
1e0c0 74 69 6f 6e 73 28 70 50 61 72 73 65 2c 20 26 73  tions(pParse, &s
1e0d0 41 67 67 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20  AggInfo);.      
1e0e0 70 4f 72 64 65 72 42 79 20 3d 20 30 3b 0a 20 20  pOrderBy = 0;.  
1e0f0 20 20 20 20 69 66 28 20 70 48 61 76 69 6e 67 20      if( pHaving 
1e100 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
1e110 65 33 45 78 70 72 49 66 46 61 6c 73 65 28 70 50  e3ExprIfFalse(pP
1e120 61 72 73 65 2c 20 70 48 61 76 69 6e 67 2c 20 61  arse, pHaving, a
1e130 64 64 72 45 6e 64 2c 20 53 51 4c 49 54 45 5f 4a  ddrEnd, SQLITE_J
1e140 55 4d 50 49 46 4e 55 4c 4c 29 3b 0a 20 20 20 20  UMPIFNULL);.    
1e150 20 20 7d 0a 20 20 20 20 20 20 73 65 6c 65 63 74    }.      select
1e160 49 6e 6e 65 72 4c 6f 6f 70 28 70 50 61 72 73 65  InnerLoop(pParse
1e170 2c 20 70 2c 20 70 2d 3e 70 45 4c 69 73 74 2c 20  , p, p->pEList, 
1e180 30 2c 20 30 2c 20 30 2c 20 2d 31 2c 20 0a 20 20  0, 0, 0, -1, .  
1e190 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e1a0 20 20 20 20 70 44 65 73 74 2c 20 61 64 64 72 45      pDest, addrE
1e1b0 6e 64 2c 20 61 64 64 72 45 6e 64 2c 20 61 66 66  nd, addrEnd, aff
1e1c0 29 3b 0a 0a 20 20 20 20 20 20 73 71 6c 69 74 65  );..      sqlite
1e1d0 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28  3ExprListDelete(
1e1e0 70 44 65 6c 29 3b 0a 20 20 20 20 7d 0a 20 20 20  pDel);.    }.   
1e1f0 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f   sqlite3VdbeReso
1e200 6c 76 65 4c 61 62 65 6c 28 76 2c 20 61 64 64 72  lveLabel(v, addr
1e210 45 6e 64 29 3b 0a 20 20 20 20 0a 20 20 7d 20 2f  End);.    .  } /
1e220 2a 20 65 6e 64 69 66 20 61 67 67 72 65 67 61 74  * endif aggregat
1e230 65 20 71 75 65 72 79 20 2a 2f 0a 0a 20 20 2f 2a  e query */..  /*
1e240 20 49 66 20 74 68 65 72 65 20 69 73 20 61 6e 20   If there is an 
1e250 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 2c  ORDER BY clause,
1e260 20 74 68 65 6e 20 77 65 20 6e 65 65 64 20 74 6f   then we need to
1e270 20 73 6f 72 74 20 74 68 65 20 72 65 73 75 6c 74   sort the result
1e280 73 0a 20 20 2a 2a 20 61 6e 64 20 73 65 6e 64 20  s.  ** and send 
1e290 74 68 65 6d 20 74 6f 20 74 68 65 20 63 61 6c 6c  them to the call
1e2a0 62 61 63 6b 20 6f 6e 65 20 62 79 20 6f 6e 65 2e  back one by one.
1e2b0 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 4f 72 64  .  */.  if( pOrd
1e2c0 65 72 42 79 20 29 7b 0a 20 20 20 20 67 65 6e 65  erBy ){.    gene
1e2d0 72 61 74 65 53 6f 72 74 54 61 69 6c 28 70 50 61  rateSortTail(pPa
1e2e0 72 73 65 2c 20 70 2c 20 76 2c 20 70 45 4c 69 73  rse, p, v, pELis
1e2f0 74 2d 3e 6e 45 78 70 72 2c 20 70 44 65 73 74 29  t->nExpr, pDest)
1e300 3b 0a 20 20 7d 0a 0a 23 69 66 6e 64 65 66 20 53  ;.  }..#ifndef S
1e310 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55  QLITE_OMIT_SUBQU
1e320 45 52 59 0a 20 20 2f 2a 20 49 66 20 74 68 69 73  ERY.  /* If this
1e330 20 77 61 73 20 61 20 73 75 62 71 75 65 72 79 2c   was a subquery,
1e340 20 77 65 20 68 61 76 65 20 6e 6f 77 20 63 6f 6e   we have now con
1e350 76 65 72 74 65 64 20 74 68 65 20 73 75 62 71 75  verted the subqu
1e360 65 72 79 20 69 6e 74 6f 20 61 0a 20 20 2a 2a 20  ery into a.  ** 
1e370 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 2e  temporary table.
1e380 20 20 53 6f 20 73 65 74 20 74 68 65 20 53 72 63    So set the Src
1e390 4c 69 73 74 5f 69 74 65 6d 2e 69 73 50 6f 70 75  List_item.isPopu
1e3a0 6c 61 74 65 64 20 66 6c 61 67 20 74 6f 20 70 72  lated flag to pr
1e3b0 65 76 65 6e 74 0a 20 20 2a 2a 20 74 68 69 73 20  event.  ** this 
1e3c0 73 75 62 71 75 65 72 79 20 66 72 6f 6d 20 62 65  subquery from be
1e3d0 69 6e 67 20 65 76 61 6c 75 61 74 65 64 20 61 67  ing evaluated ag
1e3e0 61 69 6e 20 61 6e 64 20 74 6f 20 66 6f 72 63 65  ain and to force
1e3f0 20 74 68 65 20 75 73 65 20 6f 66 0a 20 20 2a 2a   the use of.  **
1e400 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79 20 74   the temporary t
1e410 61 62 6c 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  able..  */.  if(
1e420 20 70 50 61 72 65 6e 74 20 29 7b 0a 20 20 20 20   pParent ){.    
1e430 61 73 73 65 72 74 28 20 70 50 61 72 65 6e 74 2d  assert( pParent-
1e440 3e 70 53 72 63 2d 3e 6e 53 72 63 3e 70 61 72 65  >pSrc->nSrc>pare
1e450 6e 74 54 61 62 20 29 3b 0a 20 20 20 20 61 73 73  ntTab );.    ass
1e460 65 72 74 28 20 70 50 61 72 65 6e 74 2d 3e 70 53  ert( pParent->pS
1e470 72 63 2d 3e 61 5b 70 61 72 65 6e 74 54 61 62 5d  rc->a[parentTab]
1e480 2e 70 53 65 6c 65 63 74 3d 3d 70 20 29 3b 0a 20  .pSelect==p );. 
1e490 20 20 20 70 50 61 72 65 6e 74 2d 3e 70 53 72 63     pParent->pSrc
1e4a0 2d 3e 61 5b 70 61 72 65 6e 74 54 61 62 5d 2e 69  ->a[parentTab].i
1e4b0 73 50 6f 70 75 6c 61 74 65 64 20 3d 20 31 3b 0a  sPopulated = 1;.
1e4c0 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a    }.#endif..  /*
1e4d0 20 4a 75 6d 70 20 68 65 72 65 20 74 6f 20 73 6b   Jump here to sk
1e4e0 69 70 20 74 68 69 73 20 71 75 65 72 79 0a 20 20  ip this query.  
1e4f0 2a 2f 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  */.  sqlite3Vdbe
1e500 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20  ResolveLabel(v, 
1e510 69 45 6e 64 29 3b 0a 0a 20 20 2f 2a 20 54 68 65  iEnd);..  /* The
1e520 20 53 45 4c 45 43 54 20 77 61 73 20 73 75 63 63   SELECT was succ
1e530 65 73 73 66 75 6c 6c 79 20 63 6f 64 65 64 2e 20  essfully coded. 
1e540 20 20 53 65 74 20 74 68 65 20 72 65 74 75 72 6e    Set the return
1e550 20 63 6f 64 65 20 74 6f 20 30 0a 20 20 2a 2a 20   code to 0.  ** 
1e560 74 6f 20 69 6e 64 69 63 61 74 65 20 6e 6f 20 65  to indicate no e
1e570 72 72 6f 72 73 2e 0a 20 20 2a 2f 0a 20 20 72 63  rrors..  */.  rc
1e580 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20 43 6f 6e 74   = 0;..  /* Cont
1e590 72 6f 6c 20 6a 75 6d 70 73 20 74 6f 20 68 65 72  rol jumps to her
1e5a0 65 20 69 66 20 61 6e 20 65 72 72 6f 72 20 69 73  e if an error is
1e5b0 20 65 6e 63 6f 75 6e 74 65 72 65 64 20 61 62 6f   encountered abo
1e5c0 76 65 2c 20 6f 72 20 75 70 6f 6e 0a 20 20 2a 2a  ve, or upon.  **
1e5d0 20 73 75 63 63 65 73 73 66 75 6c 20 63 6f 64 69   successful codi
1e5e0 6e 67 20 6f 66 20 74 68 65 20 53 45 4c 45 43 54  ng of the SELECT
1e5f0 2e 0a 20 20 2a 2f 0a 73 65 6c 65 63 74 5f 65 6e  ..  */.select_en
1e600 64 3a 0a 0a 20 20 2f 2a 20 49 64 65 6e 74 69 66  d:..  /* Identif
1e610 79 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 69  y column names i
1e620 66 20 77 65 20 77 69 6c 6c 20 62 65 20 75 73 69  f we will be usi
1e630 6e 67 20 74 68 65 6d 20 69 6e 20 61 20 63 61 6c  ng them in a cal
1e640 6c 62 61 63 6b 2e 20 20 54 68 69 73 0a 20 20 2a  lback.  This.  *
1e650 2a 20 73 74 65 70 20 69 73 20 73 6b 69 70 70 65  * step is skippe
1e660 64 20 69 66 20 74 68 65 20 6f 75 74 70 75 74 20  d if the output 
1e670 69 73 20 67 6f 69 6e 67 20 74 6f 20 73 6f 6d 65  is going to some
1e680 20 6f 74 68 65 72 20 64 65 73 74 69 6e 61 74 69   other destinati
1e690 6f 6e 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 72  on..  */.  if( r
1e6a0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
1e6b0 70 44 65 73 74 2d 3e 65 44 65 73 74 3d 3d 53 52  pDest->eDest==SR
1e6c0 54 5f 43 61 6c 6c 62 61 63 6b 20 29 7b 0a 20 20  T_Callback ){.  
1e6d0 20 20 67 65 6e 65 72 61 74 65 43 6f 6c 75 6d 6e    generateColumn
1e6e0 4e 61 6d 65 73 28 70 50 61 72 73 65 2c 20 70 54  Names(pParse, pT
1e6f0 61 62 4c 69 73 74 2c 20 70 45 4c 69 73 74 29 3b  abList, pEList);
1e700 0a 20 20 7d 0a 0a 20 20 73 71 6c 69 74 65 33 5f  .  }..  sqlite3_
1e710 66 72 65 65 28 73 41 67 67 49 6e 66 6f 2e 61 43  free(sAggInfo.aC
1e720 6f 6c 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66  ol);.  sqlite3_f
1e730 72 65 65 28 73 41 67 67 49 6e 66 6f 2e 61 46 75  ree(sAggInfo.aFu
1e740 6e 63 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  nc);.  return rc
1e750 3b 0a 7d 0a 0a 23 69 66 20 64 65 66 69 6e 65 64  ;.}..#if defined
1e760 28 53 51 4c 49 54 45 5f 44 45 42 55 47 29 0a 2f  (SQLITE_DEBUG)./
1e770 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  *.**************
1e780 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1e790 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1e7a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1e7b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1e7c0 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69  *.** The followi
1e7d0 6e 67 20 63 6f 64 65 20 69 73 20 75 73 65 64 20  ng code is used 
1e7e0 66 6f 72 20 74 65 73 74 69 6e 67 20 61 6e 64 20  for testing and 
1e7f0 64 65 62 75 67 67 69 6e 67 20 6f 6e 6c 79 2e 20  debugging only. 
1e800 20 54 68 65 20 63 6f 64 65 0a 2a 2a 20 74 68 61   The code.** tha
1e810 74 20 66 6f 6c 6c 6f 77 73 20 64 6f 65 73 20 6e  t follows does n
1e820 6f 74 20 61 70 70 65 61 72 20 69 6e 20 6e 6f 72  ot appear in nor
1e830 6d 61 6c 20 62 75 69 6c 64 73 2e 0a 2a 2a 0a 2a  mal builds..**.*
1e840 2a 20 54 68 65 73 65 20 72 6f 75 74 69 6e 65 73  * These routines
1e850 20 61 72 65 20 75 73 65 64 20 74 6f 20 70 72 69   are used to pri
1e860 6e 74 20 6f 75 74 20 74 68 65 20 63 6f 6e 74 65  nt out the conte
1e870 6e 74 20 6f 66 20 61 6c 6c 20 6f 72 20 70 61 72  nt of all or par
1e880 74 20 6f 66 20 61 20 0a 2a 2a 20 70 61 72 73 65  t of a .** parse
1e890 20 73 74 72 75 63 74 75 72 65 73 20 73 75 63 68   structures such
1e8a0 20 61 73 20 53 65 6c 65 63 74 20 6f 72 20 45 78   as Select or Ex
1e8b0 70 72 2e 20 20 53 75 63 68 20 70 72 69 6e 74 6f  pr.  Such printo
1e8c0 75 74 73 20 61 72 65 20 75 73 65 66 75 6c 0a 2a  uts are useful.*
1e8d0 2a 20 66 6f 72 20 68 65 6c 70 69 6e 67 20 74 6f  * for helping to
1e8e0 20 75 6e 64 65 72 73 74 61 6e 64 20 77 68 61 74   understand what
1e8f0 20 69 73 20 68 61 70 70 65 6e 69 6e 67 20 69 6e   is happening in
1e900 73 69 64 65 20 74 68 65 20 63 6f 64 65 20 67 65  side the code ge
1e910 6e 65 72 61 74 6f 72 0a 2a 2a 20 64 75 72 69 6e  nerator.** durin
1e920 67 20 74 68 65 20 65 78 65 63 75 74 69 6f 6e 20  g the execution 
1e930 6f 66 20 63 6f 6d 70 6c 65 78 20 53 45 4c 45 43  of complex SELEC
1e940 54 20 73 74 61 74 65 6d 65 6e 74 73 2e 0a 2a 2a  T statements..**
1e950 0a 2a 2a 20 54 68 65 73 65 20 72 6f 75 74 69 6e  .** These routin
1e960 65 20 61 72 65 20 6e 6f 74 20 63 61 6c 6c 65 64  e are not called
1e970 20 61 6e 79 77 68 65 72 65 20 66 72 6f 6d 20 77   anywhere from w
1e980 69 74 68 69 6e 20 74 68 65 20 6e 6f 72 6d 61 6c  ithin the normal
1e990 0a 2a 2a 20 63 6f 64 65 20 62 61 73 65 2e 20 20  .** code base.  
1e9a0 54 68 65 6e 20 61 72 65 20 69 6e 74 65 6e 64 65  Then are intende
1e9b0 64 20 74 6f 20 62 65 20 63 61 6c 6c 65 64 20 66  d to be called f
1e9c0 72 6f 6d 20 77 69 74 68 69 6e 20 74 68 65 20 64  rom within the d
1e9d0 65 62 75 67 67 65 72 0a 2a 2a 20 6f 72 20 66 72  ebugger.** or fr
1e9e0 6f 6d 20 74 65 6d 70 6f 72 61 72 79 20 22 70 72  om temporary "pr
1e9f0 69 6e 74 66 22 20 73 74 61 74 65 6d 65 6e 74 73  intf" statements
1ea00 20 69 6e 73 65 72 74 65 64 20 66 6f 72 20 64 65   inserted for de
1ea10 62 75 67 67 69 6e 67 2e 0a 2a 2f 0a 76 6f 69 64  bugging..*/.void
1ea20 20 73 71 6c 69 74 65 33 50 72 69 6e 74 45 78 70   sqlite3PrintExp
1ea30 72 28 45 78 70 72 20 2a 70 29 7b 0a 20 20 69 66  r(Expr *p){.  if
1ea40 28 20 70 2d 3e 74 6f 6b 65 6e 2e 7a 20 26 26 20  ( p->token.z && 
1ea50 70 2d 3e 74 6f 6b 65 6e 2e 6e 3e 30 20 29 7b 0a  p->token.n>0 ){.
1ea60 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67      sqlite3Debug
1ea70 50 72 69 6e 74 66 28 22 28 25 2e 2a 73 22 2c 20  Printf("(%.*s", 
1ea80 70 2d 3e 74 6f 6b 65 6e 2e 6e 2c 20 70 2d 3e 74  p->token.n, p->t
1ea90 6f 6b 65 6e 2e 7a 29 3b 0a 20 20 7d 65 6c 73 65  oken.z);.  }else
1eaa0 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 65 62  {.    sqlite3Deb
1eab0 75 67 50 72 69 6e 74 66 28 22 28 25 64 22 2c 20  ugPrintf("(%d", 
1eac0 70 2d 3e 6f 70 29 3b 0a 20 20 7d 0a 20 20 69 66  p->op);.  }.  if
1ead0 28 20 70 2d 3e 70 4c 65 66 74 20 29 7b 0a 20 20  ( p->pLeft ){.  
1eae0 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72    sqlite3DebugPr
1eaf0 69 6e 74 66 28 22 20 22 29 3b 0a 20 20 20 20 73  intf(" ");.    s
1eb00 71 6c 69 74 65 33 50 72 69 6e 74 45 78 70 72 28  qlite3PrintExpr(
1eb10 70 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 7d 0a 20  p->pLeft);.  }. 
1eb20 20 69 66 28 20 70 2d 3e 70 52 69 67 68 74 20 29   if( p->pRight )
1eb30 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 65 62  {.    sqlite3Deb
1eb40 75 67 50 72 69 6e 74 66 28 22 20 22 29 3b 0a 20  ugPrintf(" ");. 
1eb50 20 20 20 73 71 6c 69 74 65 33 50 72 69 6e 74 45     sqlite3PrintE
1eb60 78 70 72 28 70 2d 3e 70 52 69 67 68 74 29 3b 0a  xpr(p->pRight);.
1eb70 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 44 65 62    }.  sqlite3Deb
1eb80 75 67 50 72 69 6e 74 66 28 22 29 22 29 3b 0a 7d  ugPrintf(")");.}
1eb90 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 50 72 69  .void sqlite3Pri
1eba0 6e 74 45 78 70 72 4c 69 73 74 28 45 78 70 72 4c  ntExprList(ExprL
1ebb0 69 73 74 20 2a 70 4c 69 73 74 29 7b 0a 20 20 69  ist *pList){.  i
1ebc0 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  nt i;.  for(i=0;
1ebd0 20 69 3c 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b   i<pList->nExpr;
1ebe0 20 69 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74   i++){.    sqlit
1ebf0 65 33 50 72 69 6e 74 45 78 70 72 28 70 4c 69 73  e3PrintExpr(pLis
1ec00 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 29 3b 0a  t->a[i].pExpr);.
1ec10 20 20 20 20 69 66 28 20 69 3c 70 4c 69 73 74 2d      if( i<pList-
1ec20 3e 6e 45 78 70 72 2d 31 20 29 7b 0a 20 20 20 20  >nExpr-1 ){.    
1ec30 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72    sqlite3DebugPr
1ec40 69 6e 74 66 28 22 2c 20 22 29 3b 0a 20 20 20 20  intf(", ");.    
1ec50 7d 0a 20 20 7d 0a 7d 0a 76 6f 69 64 20 73 71 6c  }.  }.}.void sql
1ec60 69 74 65 33 50 72 69 6e 74 53 65 6c 65 63 74 28  ite3PrintSelect(
1ec70 53 65 6c 65 63 74 20 2a 70 2c 20 69 6e 74 20 69  Select *p, int i
1ec80 6e 64 65 6e 74 29 7b 0a 20 20 73 71 6c 69 74 65  ndent){.  sqlite
1ec90 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 25 2a  3DebugPrintf("%*
1eca0 73 53 45 4c 45 43 54 28 25 70 29 20 22 2c 20 69  sSELECT(%p) ", i
1ecb0 6e 64 65 6e 74 2c 20 22 22 2c 20 70 29 3b 0a 20  ndent, "", p);. 
1ecc0 20 73 71 6c 69 74 65 33 50 72 69 6e 74 45 78 70   sqlite3PrintExp
1ecd0 72 4c 69 73 74 28 70 2d 3e 70 45 4c 69 73 74 29  rList(p->pEList)
1ece0 3b 0a 20 20 73 71 6c 69 74 65 33 44 65 62 75 67  ;.  sqlite3Debug
1ecf0 50 72 69 6e 74 66 28 22 5c 6e 22 29 3b 0a 20 20  Printf("\n");.  
1ed00 69 66 28 20 70 2d 3e 70 53 72 63 20 29 7b 0a 20  if( p->pSrc ){. 
1ed10 20 20 20 63 68 61 72 20 2a 7a 50 72 65 66 69 78     char *zPrefix
1ed20 3b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20  ;.    int i;.   
1ed30 20 7a 50 72 65 66 69 78 20 3d 20 22 46 52 4f 4d   zPrefix = "FROM
1ed40 22 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  ";.    for(i=0; 
1ed50 69 3c 70 2d 3e 70 53 72 63 2d 3e 6e 53 72 63 3b  i<p->pSrc->nSrc;
1ed60 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 73 74 72   i++){.      str
1ed70 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d  uct SrcList_item
1ed80 20 2a 70 49 74 65 6d 20 3d 20 26 70 2d 3e 70 53   *pItem = &p->pS
1ed90 72 63 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20 20 20  rc->a[i];.      
1eda0 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e  sqlite3DebugPrin
1edb0 74 66 28 22 25 2a 73 20 22 2c 20 69 6e 64 65 6e  tf("%*s ", inden
1edc0 74 2b 36 2c 20 7a 50 72 65 66 69 78 29 3b 0a 20  t+6, zPrefix);. 
1edd0 20 20 20 20 20 7a 50 72 65 66 69 78 20 3d 20 22       zPrefix = "
1ede0 22 3b 0a 20 20 20 20 20 20 69 66 28 20 70 49 74  ";.      if( pIt
1edf0 65 6d 2d 3e 70 53 65 6c 65 63 74 20 29 7b 0a 20  em->pSelect ){. 
1ee00 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 65         sqlite3De
1ee10 62 75 67 50 72 69 6e 74 66 28 22 28 5c 6e 22 29  bugPrintf("(\n")
1ee20 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
1ee30 33 50 72 69 6e 74 53 65 6c 65 63 74 28 70 49 74  3PrintSelect(pIt
1ee40 65 6d 2d 3e 70 53 65 6c 65 63 74 2c 20 69 6e 64  em->pSelect, ind
1ee50 65 6e 74 2b 31 30 29 3b 0a 20 20 20 20 20 20 20  ent+10);.       
1ee60 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69   sqlite3DebugPri
1ee70 6e 74 66 28 22 25 2a 73 29 22 2c 20 69 6e 64 65  ntf("%*s)", inde
1ee80 6e 74 2b 38 2c 20 22 22 29 3b 0a 20 20 20 20 20  nt+8, "");.     
1ee90 20 7d 65 6c 73 65 20 69 66 28 20 70 49 74 65 6d   }else if( pItem
1eea0 2d 3e 7a 4e 61 6d 65 20 29 7b 0a 20 20 20 20 20  ->zName ){.     
1eeb0 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50     sqlite3DebugP
1eec0 72 69 6e 74 66 28 22 25 73 22 2c 20 70 49 74 65  rintf("%s", pIte
1eed0 6d 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20  m->zName);.     
1eee0 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70 49 74   }.      if( pIt
1eef0 65 6d 2d 3e 70 54 61 62 20 29 7b 0a 20 20 20 20  em->pTab ){.    
1ef00 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67      sqlite3Debug
1ef10 50 72 69 6e 74 66 28 22 28 74 61 62 6c 65 3a 20  Printf("(table: 
1ef20 25 73 29 22 2c 20 70 49 74 65 6d 2d 3e 70 54 61  %s)", pItem->pTa
1ef30 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20  b->zName);.     
1ef40 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70 49 74   }.      if( pIt
1ef50 65 6d 2d 3e 7a 41 6c 69 61 73 20 29 7b 0a 20 20  em->zAlias ){.  
1ef60 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 65 62        sqlite3Deb
1ef70 75 67 50 72 69 6e 74 66 28 22 20 41 53 20 25 73  ugPrintf(" AS %s
1ef80 22 2c 20 70 49 74 65 6d 2d 3e 7a 41 6c 69 61 73  ", pItem->zAlias
1ef90 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
1efa0 20 69 66 28 20 69 3c 70 2d 3e 70 53 72 63 2d 3e   if( i<p->pSrc->
1efb0 6e 53 72 63 2d 31 20 29 7b 0a 20 20 20 20 20 20  nSrc-1 ){.      
1efc0 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72    sqlite3DebugPr
1efd0 69 6e 74 66 28 22 2c 22 29 3b 0a 20 20 20 20 20  intf(",");.     
1efe0 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   }.      sqlite3
1eff0 44 65 62 75 67 50 72 69 6e 74 66 28 22 5c 6e 22  DebugPrintf("\n"
1f000 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69  );.    }.  }.  i
1f010 66 28 20 70 2d 3e 70 57 68 65 72 65 20 29 7b 0a  f( p->pWhere ){.
1f020 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67      sqlite3Debug
1f030 50 72 69 6e 74 66 28 22 25 2a 73 20 57 48 45 52  Printf("%*s WHER
1f040 45 20 22 2c 20 69 6e 64 65 6e 74 2c 20 22 22 29  E ", indent, "")
1f050 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 50 72 69  ;.    sqlite3Pri
1f060 6e 74 45 78 70 72 28 70 2d 3e 70 57 68 65 72 65  ntExpr(p->pWhere
1f070 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 65  );.    sqlite3De
1f080 62 75 67 50 72 69 6e 74 66 28 22 5c 6e 22 29 3b  bugPrintf("\n");
1f090 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e 70 47  .  }.  if( p->pG
1f0a0 72 6f 75 70 42 79 20 29 7b 0a 20 20 20 20 73 71  roupBy ){.    sq
1f0b0 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66  lite3DebugPrintf
1f0c0 28 22 25 2a 73 20 47 52 4f 55 50 20 42 59 20 22  ("%*s GROUP BY "
1f0d0 2c 20 69 6e 64 65 6e 74 2c 20 22 22 29 3b 0a 20  , indent, "");. 
1f0e0 20 20 20 73 71 6c 69 74 65 33 50 72 69 6e 74 45     sqlite3PrintE
1f0f0 78 70 72 4c 69 73 74 28 70 2d 3e 70 47 72 6f 75  xprList(p->pGrou
1f100 70 42 79 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  pBy);.    sqlite
1f110 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 5c 6e  3DebugPrintf("\n
1f120 22 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d  ");.  }.  if( p-
1f130 3e 70 48 61 76 69 6e 67 20 29 7b 0a 20 20 20 20  >pHaving ){.    
1f140 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e  sqlite3DebugPrin
1f150 74 66 28 22 25 2a 73 20 48 41 56 49 4e 47 20 22  tf("%*s HAVING "
1f160 2c 20 69 6e 64 65 6e 74 2c 20 22 22 29 3b 0a 20  , indent, "");. 
1f170 20 20 20 73 71 6c 69 74 65 33 50 72 69 6e 74 45     sqlite3PrintE
1f180 78 70 72 28 70 2d 3e 70 48 61 76 69 6e 67 29 3b  xpr(p->pHaving);
1f190 0a 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75  .    sqlite3Debu
1f1a0 67 50 72 69 6e 74 66 28 22 5c 6e 22 29 3b 0a 20  gPrintf("\n");. 
1f1b0 20 7d 0a 20 20 69 66 28 20 70 2d 3e 70 4f 72 64   }.  if( p->pOrd
1f1c0 65 72 42 79 20 29 7b 0a 20 20 20 20 73 71 6c 69  erBy ){.    sqli
1f1d0 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22  te3DebugPrintf("
1f1e0 25 2a 73 20 4f 52 44 45 52 20 42 59 20 22 2c 20  %*s ORDER BY ", 
1f1f0 69 6e 64 65 6e 74 2c 20 22 22 29 3b 0a 20 20 20  indent, "");.   
1f200 20 73 71 6c 69 74 65 33 50 72 69 6e 74 45 78 70   sqlite3PrintExp
1f210 72 4c 69 73 74 28 70 2d 3e 70 4f 72 64 65 72 42  rList(p->pOrderB
1f220 79 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44  y);.    sqlite3D
1f230 65 62 75 67 50 72 69 6e 74 66 28 22 5c 6e 22 29  ebugPrintf("\n")
1f240 3b 0a 20 20 7d 0a 7d 0a 2f 2a 20 45 6e 64 20 6f  ;.  }.}./* End o
1f250 66 20 74 68 65 20 73 74 72 75 63 74 75 72 65 20  f the structure 
1f260 64 65 62 75 67 20 70 72 69 6e 74 69 6e 67 20 63  debug printing c
1f270 6f 64 65 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ode.************
1f280 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1f290 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1f2a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1f2b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1f2c0 2a 2f 0a 23 65 6e 64 69 66 20 2f 2a 20 64 65 66  */.#endif /* def
1f2d0 69 6e 65 64 28 53 51 4c 49 54 45 5f 54 45 53 54  ined(SQLITE_TEST
1f2e0 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 53 51 4c  ) || defined(SQL
1f2f0 49 54 45 5f 44 45 42 55 47 29 20 2a 2f 0a        ITE_DEBUG) */.