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

Artifact e6a2546de63cd9cdad2499e224f8535743b99f1a:


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 33 34 30  select.c,v 1.340
0200: 20 32 30 30 37 2f 30 35 2f 30 34 20 31 33 3a 31   2007/05/04 13:1
0210: 35 3a 35 36 20 64 72 68 20 45 78 70 20 24 0a 2a  5:56 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 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61  }.../*.** Alloca
0410: 74 65 20 61 20 6e 65 77 20 53 65 6c 65 63 74 20  te a new Select 
0420: 73 74 72 75 63 74 75 72 65 20 61 6e 64 20 72 65  structure and re
0430: 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74  turn a pointer t
0440: 6f 20 74 68 61 74 0a 2a 2a 20 73 74 72 75 63 74  o that.** struct
0450: 75 72 65 2e 0a 2a 2f 0a 53 65 6c 65 63 74 20 2a  ure..*/.Select *
0460: 73 71 6c 69 74 65 33 53 65 6c 65 63 74 4e 65 77  sqlite3SelectNew
0470: 28 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45  (.  ExprList *pE
0480: 4c 69 73 74 2c 20 20 20 20 20 2f 2a 20 77 68 69  List,     /* whi
0490: 63 68 20 63 6f 6c 75 6d 6e 73 20 74 6f 20 69 6e  ch columns to in
04a0: 63 6c 75 64 65 20 69 6e 20 74 68 65 20 72 65 73  clude in the res
04b0: 75 6c 74 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74  ult */.  SrcList
04c0: 20 2a 70 53 72 63 2c 20 20 20 20 20 20 20 20 2f   *pSrc,        /
04d0: 2a 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73  * the FROM claus
04e0: 65 20 2d 2d 20 77 68 69 63 68 20 74 61 62 6c 65  e -- which table
04f0: 73 20 74 6f 20 73 63 61 6e 20 2a 2f 0a 20 20 45  s to scan */.  E
0500: 78 70 72 20 2a 70 57 68 65 72 65 2c 20 20 20 20  xpr *pWhere,    
0510: 20 20 20 20 20 2f 2a 20 74 68 65 20 57 48 45 52       /* the WHER
0520: 45 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 45 78  E clause */.  Ex
0530: 70 72 4c 69 73 74 20 2a 70 47 72 6f 75 70 42 79  prList *pGroupBy
0540: 2c 20 20 20 2f 2a 20 74 68 65 20 47 52 4f 55 50  ,   /* the GROUP
0550: 20 42 59 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20   BY clause */.  
0560: 45 78 70 72 20 2a 70 48 61 76 69 6e 67 2c 20 20  Expr *pHaving,  
0570: 20 20 20 20 20 20 2f 2a 20 74 68 65 20 48 41 56        /* the HAV
0580: 49 4e 47 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20  ING clause */.  
0590: 45 78 70 72 4c 69 73 74 20 2a 70 4f 72 64 65 72  ExprList *pOrder
05a0: 42 79 2c 20 20 20 2f 2a 20 74 68 65 20 4f 52 44  By,   /* the ORD
05b0: 45 52 20 42 59 20 63 6c 61 75 73 65 20 2a 2f 0a  ER BY clause */.
05c0: 20 20 69 6e 74 20 69 73 44 69 73 74 69 6e 63 74    int isDistinct
05d0: 2c 20 20 20 20 20 20 20 2f 2a 20 74 72 75 65 20  ,       /* true 
05e0: 69 66 20 74 68 65 20 44 49 53 54 49 4e 43 54 20  if the DISTINCT 
05f0: 6b 65 79 77 6f 72 64 20 69 73 20 70 72 65 73 65  keyword is prese
0600: 6e 74 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 4c  nt */.  Expr *pL
0610: 69 6d 69 74 2c 20 20 20 20 20 20 20 20 20 2f 2a  imit,         /*
0620: 20 4c 49 4d 49 54 20 76 61 6c 75 65 2e 20 20 4e   LIMIT value.  N
0630: 55 4c 4c 20 6d 65 61 6e 73 20 6e 6f 74 20 75 73  ULL means not us
0640: 65 64 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 4f  ed */.  Expr *pO
0650: 66 66 73 65 74 20 20 20 20 20 20 20 20 20 2f 2a  ffset         /*
0660: 20 4f 46 46 53 45 54 20 76 61 6c 75 65 2e 20 20   OFFSET value.  
0670: 4e 55 4c 4c 20 6d 65 61 6e 73 20 6e 6f 20 6f 66  NULL means no of
0680: 66 73 65 74 20 2a 2f 0a 29 7b 0a 20 20 53 65 6c  fset */.){.  Sel
0690: 65 63 74 20 2a 70 4e 65 77 3b 0a 20 20 53 65 6c  ect *pNew;.  Sel
06a0: 65 63 74 20 73 74 61 6e 64 69 6e 3b 0a 20 20 70  ect standin;.  p
06b0: 4e 65 77 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c  New = sqliteMall
06c0: 6f 63 28 20 73 69 7a 65 6f 66 28 2a 70 4e 65 77  oc( sizeof(*pNew
06d0: 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 21  ) );.  assert( !
06e0: 70 4f 66 66 73 65 74 20 7c 7c 20 70 4c 69 6d 69  pOffset || pLimi
06f0: 74 20 29 3b 20 20 20 2f 2a 20 43 61 6e 27 74 20  t );   /* Can't 
0700: 68 61 76 65 20 4f 46 46 53 45 54 20 77 69 74 68  have OFFSET with
0710: 6f 75 74 20 4c 49 4d 49 54 2e 20 2a 2f 0a 20 20  out LIMIT. */.  
0720: 69 66 28 20 70 4e 65 77 3d 3d 30 20 29 7b 0a 20  if( pNew==0 ){. 
0730: 20 20 20 70 4e 65 77 20 3d 20 26 73 74 61 6e 64     pNew = &stand
0740: 69 6e 3b 0a 20 20 20 20 6d 65 6d 73 65 74 28 70  in;.    memset(p
0750: 4e 65 77 2c 20 30 2c 20 73 69 7a 65 6f 66 28 2a  New, 0, sizeof(*
0760: 70 4e 65 77 29 29 3b 0a 20 20 7d 0a 20 20 69 66  pNew));.  }.  if
0770: 28 20 70 45 4c 69 73 74 3d 3d 30 20 29 7b 0a 20  ( pEList==0 ){. 
0780: 20 20 20 70 45 4c 69 73 74 20 3d 20 73 71 6c 69     pEList = sqli
0790: 74 65 33 45 78 70 72 4c 69 73 74 41 70 70 65 6e  te3ExprListAppen
07a0: 64 28 30 2c 20 73 71 6c 69 74 65 33 45 78 70 72  d(0, sqlite3Expr
07b0: 28 54 4b 5f 41 4c 4c 2c 30 2c 30 2c 30 29 2c 20  (TK_ALL,0,0,0), 
07c0: 30 29 3b 0a 20 20 7d 0a 20 20 70 4e 65 77 2d 3e  0);.  }.  pNew->
07d0: 70 45 4c 69 73 74 20 3d 20 70 45 4c 69 73 74 3b  pEList = pEList;
07e0: 0a 20 20 70 4e 65 77 2d 3e 70 53 72 63 20 3d 20  .  pNew->pSrc = 
07f0: 70 53 72 63 3b 0a 20 20 70 4e 65 77 2d 3e 70 57  pSrc;.  pNew->pW
0800: 68 65 72 65 20 3d 20 70 57 68 65 72 65 3b 0a 20  here = pWhere;. 
0810: 20 70 4e 65 77 2d 3e 70 47 72 6f 75 70 42 79 20   pNew->pGroupBy 
0820: 3d 20 70 47 72 6f 75 70 42 79 3b 0a 20 20 70 4e  = pGroupBy;.  pN
0830: 65 77 2d 3e 70 48 61 76 69 6e 67 20 3d 20 70 48  ew->pHaving = pH
0840: 61 76 69 6e 67 3b 0a 20 20 70 4e 65 77 2d 3e 70  aving;.  pNew->p
0850: 4f 72 64 65 72 42 79 20 3d 20 70 4f 72 64 65 72  OrderBy = pOrder
0860: 42 79 3b 0a 20 20 70 4e 65 77 2d 3e 69 73 44 69  By;.  pNew->isDi
0870: 73 74 69 6e 63 74 20 3d 20 69 73 44 69 73 74 69  stinct = isDisti
0880: 6e 63 74 3b 0a 20 20 70 4e 65 77 2d 3e 6f 70 20  nct;.  pNew->op 
0890: 3d 20 54 4b 5f 53 45 4c 45 43 54 3b 0a 20 20 61  = TK_SELECT;.  a
08a0: 73 73 65 72 74 28 20 70 4f 66 66 73 65 74 3d 3d  ssert( pOffset==
08b0: 30 20 7c 7c 20 70 4c 69 6d 69 74 21 3d 30 20 29  0 || pLimit!=0 )
08c0: 3b 0a 20 20 70 4e 65 77 2d 3e 70 4c 69 6d 69 74  ;.  pNew->pLimit
08d0: 20 3d 20 70 4c 69 6d 69 74 3b 0a 20 20 70 4e 65   = pLimit;.  pNe
08e0: 77 2d 3e 70 4f 66 66 73 65 74 20 3d 20 70 4f 66  w->pOffset = pOf
08f0: 66 73 65 74 3b 0a 20 20 70 4e 65 77 2d 3e 69 4c  fset;.  pNew->iL
0900: 69 6d 69 74 20 3d 20 2d 31 3b 0a 20 20 70 4e 65  imit = -1;.  pNe
0910: 77 2d 3e 69 4f 66 66 73 65 74 20 3d 20 2d 31 3b  w->iOffset = -1;
0920: 0a 20 20 70 4e 65 77 2d 3e 61 64 64 72 4f 70 65  .  pNew->addrOpe
0930: 6e 45 70 68 6d 5b 30 5d 20 3d 20 2d 31 3b 0a 20  nEphm[0] = -1;. 
0940: 20 70 4e 65 77 2d 3e 61 64 64 72 4f 70 65 6e 45   pNew->addrOpenE
0950: 70 68 6d 5b 31 5d 20 3d 20 2d 31 3b 0a 20 20 70  phm[1] = -1;.  p
0960: 4e 65 77 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68  New->addrOpenEph
0970: 6d 5b 32 5d 20 3d 20 2d 31 3b 0a 20 20 69 66 28  m[2] = -1;.  if(
0980: 20 70 4e 65 77 3d 3d 26 73 74 61 6e 64 69 6e 29   pNew==&standin)
0990: 20 7b 0a 20 20 20 20 63 6c 65 61 72 53 65 6c 65   {.    clearSele
09a0: 63 74 28 70 4e 65 77 29 3b 0a 20 20 20 20 70 4e  ct(pNew);.    pN
09b0: 65 77 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65  ew = 0;.  }.  re
09c0: 74 75 72 6e 20 70 4e 65 77 3b 0a 7d 0a 0a 2f 2a  turn pNew;.}../*
09d0: 0a 2a 2a 20 44 65 6c 65 74 65 20 74 68 65 20 67  .** Delete the g
09e0: 69 76 65 6e 20 53 65 6c 65 63 74 20 73 74 72 75  iven Select stru
09f0: 63 74 75 72 65 20 61 6e 64 20 61 6c 6c 20 6f 66  cture and all of
0a00: 20 69 74 73 20 73 75 62 73 74 72 75 63 74 75 72   its substructur
0a10: 65 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  es..*/.void sqli
0a20: 74 65 33 53 65 6c 65 63 74 44 65 6c 65 74 65 28  te3SelectDelete(
0a30: 53 65 6c 65 63 74 20 2a 70 29 7b 0a 20 20 69 66  Select *p){.  if
0a40: 28 20 70 20 29 7b 0a 20 20 20 20 63 6c 65 61 72  ( p ){.    clear
0a50: 53 65 6c 65 63 74 28 70 29 3b 0a 20 20 20 20 73  Select(p);.    s
0a60: 71 6c 69 74 65 46 72 65 65 28 70 29 3b 0a 20 20  qliteFree(p);.  
0a70: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e  }.}../*.** Given
0a80: 20 31 20 74 6f 20 33 20 69 64 65 6e 74 69 66 69   1 to 3 identifi
0a90: 65 72 73 20 70 72 65 63 65 65 64 69 6e 67 20 74  ers preceeding t
0aa0: 68 65 20 4a 4f 49 4e 20 6b 65 79 77 6f 72 64 2c  he JOIN keyword,
0ab0: 20 64 65 74 65 72 6d 69 6e 65 20 74 68 65 0a 2a   determine the.*
0ac0: 2a 20 74 79 70 65 20 6f 66 20 6a 6f 69 6e 2e 20  * type of join. 
0ad0: 20 52 65 74 75 72 6e 20 61 6e 20 69 6e 74 65 67   Return an integ
0ae0: 65 72 20 63 6f 6e 73 74 61 6e 74 20 74 68 61 74  er constant that
0af0: 20 65 78 70 72 65 73 73 65 73 20 74 68 61 74 20   expresses that 
0b00: 74 79 70 65 0a 2a 2a 20 69 6e 20 74 65 72 6d 73  type.** in terms
0b10: 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   of the followin
0b20: 67 20 62 69 74 20 76 61 6c 75 65 73 3a 0a 2a 2a  g bit values:.**
0b30: 0a 2a 2a 20 20 20 20 20 4a 54 5f 49 4e 4e 45 52  .**     JT_INNER
0b40: 0a 2a 2a 20 20 20 20 20 4a 54 5f 43 52 4f 53 53  .**     JT_CROSS
0b50: 0a 2a 2a 20 20 20 20 20 4a 54 5f 4f 55 54 45 52  .**     JT_OUTER
0b60: 0a 2a 2a 20 20 20 20 20 4a 54 5f 4e 41 54 55 52  .**     JT_NATUR
0b70: 41 4c 0a 2a 2a 20 20 20 20 20 4a 54 5f 4c 45 46  AL.**     JT_LEF
0b80: 54 0a 2a 2a 20 20 20 20 20 4a 54 5f 52 49 47 48  T.**     JT_RIGH
0b90: 54 0a 2a 2a 0a 2a 2a 20 41 20 66 75 6c 6c 20 6f  T.**.** A full o
0ba0: 75 74 65 72 20 6a 6f 69 6e 20 69 73 20 74 68 65  uter join is the
0bb0: 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 20 6f 66 20   combination of 
0bc0: 4a 54 5f 4c 45 46 54 20 61 6e 64 20 4a 54 5f 52  JT_LEFT and JT_R
0bd0: 49 47 48 54 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61  IGHT..**.** If a
0be0: 6e 20 69 6c 6c 65 67 61 6c 20 6f 72 20 75 6e 73  n illegal or uns
0bf0: 75 70 70 6f 72 74 65 64 20 6a 6f 69 6e 20 74 79  upported join ty
0c00: 70 65 20 69 73 20 73 65 65 6e 2c 20 74 68 65 6e  pe is seen, then
0c10: 20 73 74 69 6c 6c 20 72 65 74 75 72 6e 0a 2a 2a   still return.**
0c20: 20 61 20 6a 6f 69 6e 20 74 79 70 65 2c 20 62 75   a join type, bu
0c30: 74 20 70 75 74 20 61 6e 20 65 72 72 6f 72 20 69  t put an error i
0c40: 6e 20 74 68 65 20 70 50 61 72 73 65 20 73 74 72  n the pParse str
0c50: 75 63 74 75 72 65 2e 0a 2a 2f 0a 69 6e 74 20 73  ucture..*/.int s
0c60: 71 6c 69 74 65 33 4a 6f 69 6e 54 79 70 65 28 50  qlite3JoinType(P
0c70: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 54 6f  arse *pParse, To
0c80: 6b 65 6e 20 2a 70 41 2c 20 54 6f 6b 65 6e 20 2a  ken *pA, Token *
0c90: 70 42 2c 20 54 6f 6b 65 6e 20 2a 70 43 29 7b 0a  pB, Token *pC){.
0ca0: 20 20 69 6e 74 20 6a 6f 69 6e 74 79 70 65 20 3d    int jointype =
0cb0: 20 30 3b 0a 20 20 54 6f 6b 65 6e 20 2a 61 70 41   0;.  Token *apA
0cc0: 6c 6c 5b 33 5d 3b 0a 20 20 54 6f 6b 65 6e 20 2a  ll[3];.  Token *
0cd0: 70 3b 0a 20 20 73 74 61 74 69 63 20 63 6f 6e 73  p;.  static cons
0ce0: 74 20 73 74 72 75 63 74 20 7b 0a 20 20 20 20 63  t struct {.    c
0cf0: 6f 6e 73 74 20 63 68 61 72 20 7a 4b 65 79 77 6f  onst char zKeywo
0d00: 72 64 5b 38 5d 3b 0a 20 20 20 20 75 38 20 6e 43  rd[8];.    u8 nC
0d10: 68 61 72 3b 0a 20 20 20 20 75 38 20 63 6f 64 65  har;.    u8 code
0d20: 3b 0a 20 20 7d 20 6b 65 79 77 6f 72 64 73 5b 5d  ;.  } keywords[]
0d30: 20 3d 20 7b 0a 20 20 20 20 7b 20 22 6e 61 74 75   = {.    { "natu
0d40: 72 61 6c 22 2c 20 37 2c 20 4a 54 5f 4e 41 54 55  ral", 7, JT_NATU
0d50: 52 41 4c 20 7d 2c 0a 20 20 20 20 7b 20 22 6c 65  RAL },.    { "le
0d60: 66 74 22 2c 20 20 20 20 34 2c 20 4a 54 5f 4c 45  ft",    4, JT_LE
0d70: 46 54 7c 4a 54 5f 4f 55 54 45 52 20 7d 2c 0a 20  FT|JT_OUTER },. 
0d80: 20 20 20 7b 20 22 72 69 67 68 74 22 2c 20 20 20     { "right",   
0d90: 35 2c 20 4a 54 5f 52 49 47 48 54 7c 4a 54 5f 4f  5, JT_RIGHT|JT_O
0da0: 55 54 45 52 20 7d 2c 0a 20 20 20 20 7b 20 22 66  UTER },.    { "f
0db0: 75 6c 6c 22 2c 20 20 20 20 34 2c 20 4a 54 5f 4c  ull",    4, JT_L
0dc0: 45 46 54 7c 4a 54 5f 52 49 47 48 54 7c 4a 54 5f  EFT|JT_RIGHT|JT_
0dd0: 4f 55 54 45 52 20 7d 2c 0a 20 20 20 20 7b 20 22  OUTER },.    { "
0de0: 6f 75 74 65 72 22 2c 20 20 20 35 2c 20 4a 54 5f  outer",   5, JT_
0df0: 4f 55 54 45 52 20 7d 2c 0a 20 20 20 20 7b 20 22  OUTER },.    { "
0e00: 69 6e 6e 65 72 22 2c 20 20 20 35 2c 20 4a 54 5f  inner",   5, JT_
0e10: 49 4e 4e 45 52 20 7d 2c 0a 20 20 20 20 7b 20 22  INNER },.    { "
0e20: 63 72 6f 73 73 22 2c 20 20 20 35 2c 20 4a 54 5f  cross",   5, JT_
0e30: 49 4e 4e 45 52 7c 4a 54 5f 43 52 4f 53 53 20 7d  INNER|JT_CROSS }
0e40: 2c 0a 20 20 7d 3b 0a 20 20 69 6e 74 20 69 2c 20  ,.  };.  int i, 
0e50: 6a 3b 0a 20 20 61 70 41 6c 6c 5b 30 5d 20 3d 20  j;.  apAll[0] = 
0e60: 70 41 3b 0a 20 20 61 70 41 6c 6c 5b 31 5d 20 3d  pA;.  apAll[1] =
0e70: 20 70 42 3b 0a 20 20 61 70 41 6c 6c 5b 32 5d 20   pB;.  apAll[2] 
0e80: 3d 20 70 43 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  = pC;.  for(i=0;
0e90: 20 69 3c 33 20 26 26 20 61 70 41 6c 6c 5b 69 5d   i<3 && apAll[i]
0ea0: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 70 20 3d 20  ; i++){.    p = 
0eb0: 61 70 41 6c 6c 5b 69 5d 3b 0a 20 20 20 20 66 6f  apAll[i];.    fo
0ec0: 72 28 6a 3d 30 3b 20 6a 3c 73 69 7a 65 6f 66 28  r(j=0; j<sizeof(
0ed0: 6b 65 79 77 6f 72 64 73 29 2f 73 69 7a 65 6f 66  keywords)/sizeof
0ee0: 28 6b 65 79 77 6f 72 64 73 5b 30 5d 29 3b 20 6a  (keywords[0]); j
0ef0: 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70  ++){.      if( p
0f00: 2d 3e 6e 3d 3d 6b 65 79 77 6f 72 64 73 5b 6a 5d  ->n==keywords[j]
0f10: 2e 6e 43 68 61 72 20 0a 20 20 20 20 20 20 20 20  .nChar .        
0f20: 20 20 26 26 20 73 71 6c 69 74 65 33 53 74 72 4e    && sqlite3StrN
0f30: 49 43 6d 70 28 28 63 68 61 72 2a 29 70 2d 3e 7a  ICmp((char*)p->z
0f40: 2c 20 6b 65 79 77 6f 72 64 73 5b 6a 5d 2e 7a 4b  , keywords[j].zK
0f50: 65 79 77 6f 72 64 2c 20 70 2d 3e 6e 29 3d 3d 30  eyword, p->n)==0
0f60: 20 29 7b 0a 20 20 20 20 20 20 20 20 6a 6f 69 6e   ){.        join
0f70: 74 79 70 65 20 7c 3d 20 6b 65 79 77 6f 72 64 73  type |= keywords
0f80: 5b 6a 5d 2e 63 6f 64 65 3b 0a 20 20 20 20 20 20  [j].code;.      
0f90: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d    break;.      }
0fa0: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6a  .    }.    if( j
0fb0: 3e 3d 73 69 7a 65 6f 66 28 6b 65 79 77 6f 72 64  >=sizeof(keyword
0fc0: 73 29 2f 73 69 7a 65 6f 66 28 6b 65 79 77 6f 72  s)/sizeof(keywor
0fd0: 64 73 5b 30 5d 29 20 29 7b 0a 20 20 20 20 20 20  ds[0]) ){.      
0fe0: 6a 6f 69 6e 74 79 70 65 20 7c 3d 20 4a 54 5f 45  jointype |= JT_E
0ff0: 52 52 4f 52 3b 0a 20 20 20 20 20 20 62 72 65 61  RROR;.      brea
1000: 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69  k;.    }.  }.  i
1010: 66 28 0a 20 20 20 20 20 28 6a 6f 69 6e 74 79 70  f(.     (jointyp
1020: 65 20 26 20 28 4a 54 5f 49 4e 4e 45 52 7c 4a 54  e & (JT_INNER|JT
1030: 5f 4f 55 54 45 52 29 29 3d 3d 28 4a 54 5f 49 4e  _OUTER))==(JT_IN
1040: 4e 45 52 7c 4a 54 5f 4f 55 54 45 52 29 20 7c 7c  NER|JT_OUTER) ||
1050: 0a 20 20 20 20 20 28 6a 6f 69 6e 74 79 70 65 20  .     (jointype 
1060: 26 20 4a 54 5f 45 52 52 4f 52 29 21 3d 30 0a 20  & JT_ERROR)!=0. 
1070: 20 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68   ){.    const ch
1080: 61 72 20 2a 7a 53 70 31 20 3d 20 22 20 22 3b 0a  ar *zSp1 = " ";.
1090: 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
10a0: 7a 53 70 32 20 3d 20 22 20 22 3b 0a 20 20 20 20  zSp2 = " ";.    
10b0: 69 66 28 20 70 42 3d 3d 30 20 29 7b 20 7a 53 70  if( pB==0 ){ zSp
10c0: 31 2b 2b 3b 20 7d 0a 20 20 20 20 69 66 28 20 70  1++; }.    if( p
10d0: 43 3d 3d 30 20 29 7b 20 7a 53 70 32 2b 2b 3b 20  C==0 ){ zSp2++; 
10e0: 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72  }.    sqlite3Err
10f0: 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 75  orMsg(pParse, "u
1100: 6e 6b 6e 6f 77 6e 20 6f 72 20 75 6e 73 75 70 70  nknown or unsupp
1110: 6f 72 74 65 64 20 6a 6f 69 6e 20 74 79 70 65 3a  orted join type:
1120: 20 22 0a 20 20 20 20 20 20 20 22 25 54 25 73 25   ".       "%T%s%
1130: 54 25 73 25 54 22 2c 20 70 41 2c 20 7a 53 70 31  T%s%T", pA, zSp1
1140: 2c 20 70 42 2c 20 7a 53 70 32 2c 20 70 43 29 3b  , pB, zSp2, pC);
1150: 0a 20 20 20 20 6a 6f 69 6e 74 79 70 65 20 3d 20  .    jointype = 
1160: 4a 54 5f 49 4e 4e 45 52 3b 0a 20 20 7d 65 6c 73  JT_INNER;.  }els
1170: 65 20 69 66 28 20 6a 6f 69 6e 74 79 70 65 20 26  e if( jointype &
1180: 20 4a 54 5f 52 49 47 48 54 20 29 7b 0a 20 20 20   JT_RIGHT ){.   
1190: 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
11a0: 28 70 50 61 72 73 65 2c 20 0a 20 20 20 20 20 20  (pParse, .      
11b0: 22 52 49 47 48 54 20 61 6e 64 20 46 55 4c 4c 20  "RIGHT and FULL 
11c0: 4f 55 54 45 52 20 4a 4f 49 4e 73 20 61 72 65 20  OUTER JOINs are 
11d0: 6e 6f 74 20 63 75 72 72 65 6e 74 6c 79 20 73 75  not currently su
11e0: 70 70 6f 72 74 65 64 22 29 3b 0a 20 20 20 20 6a  pported");.    j
11f0: 6f 69 6e 74 79 70 65 20 3d 20 4a 54 5f 49 4e 4e  ointype = JT_INN
1200: 45 52 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  ER;.  }.  return
1210: 20 6a 6f 69 6e 74 79 70 65 3b 0a 7d 0a 0a 2f 2a   jointype;.}../*
1220: 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 69  .** Return the i
1230: 6e 64 65 78 20 6f 66 20 61 20 63 6f 6c 75 6d 6e  ndex of a column
1240: 20 69 6e 20 61 20 74 61 62 6c 65 2e 20 20 52 65   in a table.  Re
1250: 74 75 72 6e 20 2d 31 20 69 66 20 74 68 65 20 63  turn -1 if the c
1260: 6f 6c 75 6d 6e 0a 2a 2a 20 69 73 20 6e 6f 74 20  olumn.** is not 
1270: 63 6f 6e 74 61 69 6e 65 64 20 69 6e 20 74 68 65  contained in the
1280: 20 74 61 62 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69   table..*/.stati
1290: 63 20 69 6e 74 20 63 6f 6c 75 6d 6e 49 6e 64 65  c int columnInde
12a0: 78 28 54 61 62 6c 65 20 2a 70 54 61 62 2c 20 63  x(Table *pTab, c
12b0: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43 6f 6c 29  onst char *zCol)
12c0: 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72  {.  int i;.  for
12d0: 28 69 3d 30 3b 20 69 3c 70 54 61 62 2d 3e 6e 43  (i=0; i<pTab->nC
12e0: 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66  ol; i++){.    if
12f0: 28 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70  ( sqlite3StrICmp
1300: 28 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 5d 2e 7a  (pTab->aCol[i].z
1310: 4e 61 6d 65 2c 20 7a 43 6f 6c 29 3d 3d 30 20 29  Name, zCol)==0 )
1320: 20 72 65 74 75 72 6e 20 69 3b 0a 20 20 7d 0a 20   return i;.  }. 
1330: 20 72 65 74 75 72 6e 20 2d 31 3b 0a 7d 0a 0a 2f   return -1;.}../
1340: 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 76 61 6c  *.** Set the val
1350: 75 65 20 6f 66 20 61 20 74 6f 6b 65 6e 20 74 6f  ue of a token to
1360: 20 61 20 27 5c 30 30 30 27 2d 74 65 72 6d 69 6e   a '\000'-termin
1370: 61 74 65 64 20 73 74 72 69 6e 67 2e 0a 2a 2f 0a  ated string..*/.
1380: 73 74 61 74 69 63 20 76 6f 69 64 20 73 65 74 54  static void setT
1390: 6f 6b 65 6e 28 54 6f 6b 65 6e 20 2a 70 2c 20 63  oken(Token *p, c
13a0: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 29 7b 0a 20  onst char *z){. 
13b0: 20 70 2d 3e 7a 20 3d 20 28 75 38 2a 29 7a 3b 0a   p->z = (u8*)z;.
13c0: 20 20 70 2d 3e 6e 20 3d 20 7a 20 3f 20 73 74 72    p->n = z ? str
13d0: 6c 65 6e 28 7a 29 20 3a 20 30 3b 0a 20 20 70 2d  len(z) : 0;.  p-
13e0: 3e 64 79 6e 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a  >dyn = 0;.}../*.
13f0: 2a 2a 20 43 72 65 61 74 65 20 61 6e 20 65 78 70  ** Create an exp
1400: 72 65 73 73 69 6f 6e 20 6e 6f 64 65 20 66 6f 72  ression node for
1410: 20 61 6e 20 69 64 65 6e 74 69 66 69 65 72 20 77   an identifier w
1420: 69 74 68 20 74 68 65 20 6e 61 6d 65 20 6f 66 20  ith the name of 
1430: 7a 4e 61 6d 65 0a 2a 2f 0a 45 78 70 72 20 2a 73  zName.*/.Expr *s
1440: 71 6c 69 74 65 33 43 72 65 61 74 65 49 64 45 78  qlite3CreateIdEx
1450: 70 72 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  pr(const char *z
1460: 4e 61 6d 65 29 7b 0a 20 20 54 6f 6b 65 6e 20 64  Name){.  Token d
1470: 75 6d 6d 79 3b 0a 20 20 73 65 74 54 6f 6b 65 6e  ummy;.  setToken
1480: 28 26 64 75 6d 6d 79 2c 20 7a 4e 61 6d 65 29 3b  (&dummy, zName);
1490: 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65  .  return sqlite
14a0: 33 45 78 70 72 28 54 4b 5f 49 44 2c 20 30 2c 20  3Expr(TK_ID, 0, 
14b0: 30 2c 20 26 64 75 6d 6d 79 29 3b 0a 7d 0a 0a 0a  0, &dummy);.}...
14c0: 2f 2a 0a 2a 2a 20 41 64 64 20 61 20 74 65 72 6d  /*.** Add a term
14d0: 20 74 6f 20 74 68 65 20 57 48 45 52 45 20 65 78   to the WHERE ex
14e0: 70 72 65 73 73 69 6f 6e 20 69 6e 20 2a 70 70 45  pression in *ppE
14f0: 78 70 72 20 74 68 61 74 20 72 65 71 75 69 72 65  xpr that require
1500: 73 20 74 68 65 0a 2a 2a 20 7a 43 6f 6c 20 63 6f  s the.** zCol co
1510: 6c 75 6d 6e 20 74 6f 20 62 65 20 65 71 75 61 6c  lumn to be equal
1520: 20 69 6e 20 74 68 65 20 74 77 6f 20 74 61 62 6c   in the two tabl
1530: 65 73 20 70 54 61 62 31 20 61 6e 64 20 70 54 61  es pTab1 and pTa
1540: 62 32 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  b2..*/.static vo
1550: 69 64 20 61 64 64 57 68 65 72 65 54 65 72 6d 28  id addWhereTerm(
1560: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
1570: 43 6f 6c 2c 20 20 20 20 20 20 20 20 2f 2a 20 4e  Col,        /* N
1580: 61 6d 65 20 6f 66 20 74 68 65 20 63 6f 6c 75 6d  ame of the colum
1590: 6e 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 54 61 62  n */.  const Tab
15a0: 6c 65 20 2a 70 54 61 62 31 2c 20 20 20 20 20 20  le *pTab1,      
15b0: 2f 2a 20 46 69 72 73 74 20 74 61 62 6c 65 20 2a  /* First table *
15c0: 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  /.  const char *
15d0: 7a 41 6c 69 61 73 31 2c 20 20 20 20 20 2f 2a 20  zAlias1,     /* 
15e0: 41 6c 69 61 73 20 66 6f 72 20 66 69 72 73 74 20  Alias for first 
15f0: 74 61 62 6c 65 2e 20 20 4d 61 79 20 62 65 20 4e  table.  May be N
1600: 55 4c 4c 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 54  ULL */.  const T
1610: 61 62 6c 65 20 2a 70 54 61 62 32 2c 20 20 20 20  able *pTab2,    
1620: 20 20 2f 2a 20 53 65 63 6f 6e 64 20 74 61 62 6c    /* Second tabl
1630: 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61  e */.  const cha
1640: 72 20 2a 7a 41 6c 69 61 73 32 2c 20 20 20 20 20  r *zAlias2,     
1650: 2f 2a 20 41 6c 69 61 73 20 66 6f 72 20 73 65 63  /* Alias for sec
1660: 6f 6e 64 20 74 61 62 6c 65 2e 20 20 4d 61 79 20  ond table.  May 
1670: 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20 69 6e 74  be NULL */.  int
1680: 20 69 52 69 67 68 74 4a 6f 69 6e 54 61 62 6c 65   iRightJoinTable
1690: 2c 20 20 20 20 20 2f 2a 20 56 44 42 45 20 63 75  ,     /* VDBE cu
16a0: 72 73 6f 72 20 66 6f 72 20 74 68 65 20 72 69 67  rsor for the rig
16b0: 68 74 20 74 61 62 6c 65 20 2a 2f 0a 20 20 45 78  ht table */.  Ex
16c0: 70 72 20 2a 2a 70 70 45 78 70 72 20 20 20 20 20  pr **ppExpr     
16d0: 20 20 20 20 20 20 20 2f 2a 20 41 64 64 20 74 68         /* Add th
16e0: 65 20 65 71 75 61 6c 69 74 79 20 74 65 72 6d 20  e equality term 
16f0: 74 6f 20 74 68 69 73 20 65 78 70 72 65 73 73 69  to this expressi
1700: 6f 6e 20 2a 2f 0a 29 7b 0a 20 20 45 78 70 72 20  on */.){.  Expr 
1710: 2a 70 45 31 61 2c 20 2a 70 45 31 62 2c 20 2a 70  *pE1a, *pE1b, *p
1720: 45 31 63 3b 0a 20 20 45 78 70 72 20 2a 70 45 32  E1c;.  Expr *pE2
1730: 61 2c 20 2a 70 45 32 62 2c 20 2a 70 45 32 63 3b  a, *pE2b, *pE2c;
1740: 0a 20 20 45 78 70 72 20 2a 70 45 3b 0a 0a 20 20  .  Expr *pE;..  
1750: 70 45 31 61 20 3d 20 73 71 6c 69 74 65 33 43 72  pE1a = sqlite3Cr
1760: 65 61 74 65 49 64 45 78 70 72 28 7a 43 6f 6c 29  eateIdExpr(zCol)
1770: 3b 0a 20 20 70 45 32 61 20 3d 20 73 71 6c 69 74  ;.  pE2a = sqlit
1780: 65 33 43 72 65 61 74 65 49 64 45 78 70 72 28 7a  e3CreateIdExpr(z
1790: 43 6f 6c 29 3b 0a 20 20 69 66 28 20 7a 41 6c 69  Col);.  if( zAli
17a0: 61 73 31 3d 3d 30 20 29 7b 0a 20 20 20 20 7a 41  as1==0 ){.    zA
17b0: 6c 69 61 73 31 20 3d 20 70 54 61 62 31 2d 3e 7a  lias1 = pTab1->z
17c0: 4e 61 6d 65 3b 0a 20 20 7d 0a 20 20 70 45 31 62  Name;.  }.  pE1b
17d0: 20 3d 20 73 71 6c 69 74 65 33 43 72 65 61 74 65   = sqlite3Create
17e0: 49 64 45 78 70 72 28 7a 41 6c 69 61 73 31 29 3b  IdExpr(zAlias1);
17f0: 0a 20 20 69 66 28 20 7a 41 6c 69 61 73 32 3d 3d  .  if( zAlias2==
1800: 30 20 29 7b 0a 20 20 20 20 7a 41 6c 69 61 73 32  0 ){.    zAlias2
1810: 20 3d 20 70 54 61 62 32 2d 3e 7a 4e 61 6d 65 3b   = pTab2->zName;
1820: 0a 20 20 7d 0a 20 20 70 45 32 62 20 3d 20 73 71  .  }.  pE2b = sq
1830: 6c 69 74 65 33 43 72 65 61 74 65 49 64 45 78 70  lite3CreateIdExp
1840: 72 28 7a 41 6c 69 61 73 32 29 3b 0a 20 20 70 45  r(zAlias2);.  pE
1850: 31 63 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  1c = sqlite3Expr
1860: 4f 72 46 72 65 65 28 54 4b 5f 44 4f 54 2c 20 70  OrFree(TK_DOT, p
1870: 45 31 62 2c 20 70 45 31 61 2c 20 30 29 3b 0a 20  E1b, pE1a, 0);. 
1880: 20 70 45 32 63 20 3d 20 73 71 6c 69 74 65 33 45   pE2c = sqlite3E
1890: 78 70 72 4f 72 46 72 65 65 28 54 4b 5f 44 4f 54  xprOrFree(TK_DOT
18a0: 2c 20 70 45 32 62 2c 20 70 45 32 61 2c 20 30 29  , pE2b, pE2a, 0)
18b0: 3b 0a 20 20 70 45 20 3d 20 73 71 6c 69 74 65 33  ;.  pE = sqlite3
18c0: 45 78 70 72 4f 72 46 72 65 65 28 54 4b 5f 45 51  ExprOrFree(TK_EQ
18d0: 2c 20 70 45 31 63 2c 20 70 45 32 63 2c 20 30 29  , pE1c, pE2c, 0)
18e0: 3b 0a 20 20 69 66 28 20 70 45 20 29 7b 0a 20 20  ;.  if( pE ){.  
18f0: 20 20 45 78 70 72 53 65 74 50 72 6f 70 65 72 74    ExprSetPropert
1900: 79 28 70 45 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69  y(pE, EP_FromJoi
1910: 6e 29 3b 0a 20 20 20 20 70 45 2d 3e 69 52 69 67  n);.    pE->iRig
1920: 68 74 4a 6f 69 6e 54 61 62 6c 65 20 3d 20 69 52  htJoinTable = iR
1930: 69 67 68 74 4a 6f 69 6e 54 61 62 6c 65 3b 0a 20  ightJoinTable;. 
1940: 20 7d 0a 20 20 70 45 20 3d 20 73 71 6c 69 74 65   }.  pE = sqlite
1950: 33 45 78 70 72 41 6e 64 28 2a 70 70 45 78 70 72  3ExprAnd(*ppExpr
1960: 2c 20 70 45 29 3b 0a 20 20 69 66 28 20 70 45 20  , pE);.  if( pE 
1970: 29 7b 0a 20 20 20 20 2a 70 70 45 78 70 72 20 3d  ){.    *ppExpr =
1980: 20 70 45 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a   pE;.  }.}../*.*
1990: 2a 20 53 65 74 20 74 68 65 20 45 50 5f 46 72 6f  * Set the EP_Fro
19a0: 6d 4a 6f 69 6e 20 70 72 6f 70 65 72 74 79 20 6f  mJoin property o
19b0: 6e 20 61 6c 6c 20 74 65 72 6d 73 20 6f 66 20 74  n all terms of t
19c0: 68 65 20 67 69 76 65 6e 20 65 78 70 72 65 73 73  he given express
19d0: 69 6f 6e 2e 0a 2a 2a 20 41 6e 64 20 73 65 74 20  ion..** And set 
19e0: 74 68 65 20 45 78 70 72 2e 69 52 69 67 68 74 4a  the Expr.iRightJ
19f0: 6f 69 6e 54 61 62 6c 65 20 74 6f 20 69 54 61 62  oinTable to iTab
1a00: 6c 65 20 66 6f 72 20 65 76 65 72 79 20 74 65 72  le for every ter
1a10: 6d 20 69 6e 20 74 68 65 0a 2a 2a 20 65 78 70 72  m in the.** expr
1a20: 65 73 73 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68  ession..**.** Th
1a30: 65 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 20 70 72  e EP_FromJoin pr
1a40: 6f 70 65 72 74 79 20 69 73 20 75 73 65 64 20 6f  operty is used o
1a50: 6e 20 74 65 72 6d 73 20 6f 66 20 61 6e 20 65 78  n terms of an ex
1a60: 70 72 65 73 73 69 6f 6e 20 74 6f 20 74 65 6c 6c  pression to tell
1a70: 0a 2a 2a 20 74 68 65 20 4c 45 46 54 20 4f 55 54  .** the LEFT OUT
1a80: 45 52 20 4a 4f 49 4e 20 70 72 6f 63 65 73 73 69  ER JOIN processi
1a90: 6e 67 20 6c 6f 67 69 63 20 74 68 61 74 20 74 68  ng logic that th
1aa0: 69 73 20 74 65 72 6d 20 69 73 20 70 61 72 74 20  is term is part 
1ab0: 6f 66 20 74 68 65 0a 2a 2a 20 6a 6f 69 6e 20 72  of the.** join r
1ac0: 65 73 74 72 69 63 74 69 6f 6e 20 73 70 65 63 69  estriction speci
1ad0: 66 69 65 64 20 69 6e 20 74 68 65 20 4f 4e 20 6f  fied in the ON o
1ae0: 72 20 55 53 49 4e 47 20 63 6c 61 75 73 65 20 61  r USING clause a
1af0: 6e 64 20 6e 6f 74 20 61 20 70 61 72 74 0a 2a 2a  nd not a part.**
1b00: 20 6f 66 20 74 68 65 20 6d 6f 72 65 20 67 65 6e   of the more gen
1b10: 65 72 61 6c 20 57 48 45 52 45 20 63 6c 61 75 73  eral WHERE claus
1b20: 65 2e 20 20 54 68 65 73 65 20 74 65 72 6d 73 20  e.  These terms 
1b30: 61 72 65 20 6d 6f 76 65 64 20 6f 76 65 72 20 74  are moved over t
1b40: 6f 20 74 68 65 0a 2a 2a 20 57 48 45 52 45 20 63  o the.** WHERE c
1b50: 6c 61 75 73 65 20 64 75 72 69 6e 67 20 6a 6f 69  lause during joi
1b60: 6e 20 70 72 6f 63 65 73 73 69 6e 67 20 62 75 74  n processing but
1b70: 20 77 65 20 6e 65 65 64 20 74 6f 20 72 65 6d 65   we need to reme
1b80: 6d 62 65 72 20 74 68 61 74 20 74 68 65 79 0a 2a  mber that they.*
1b90: 2a 20 6f 72 69 67 69 6e 61 74 65 64 20 69 6e 20  * originated in 
1ba0: 74 68 65 20 4f 4e 20 6f 72 20 55 53 49 4e 47 20  the ON or USING 
1bb0: 63 6c 61 75 73 65 2e 0a 2a 2a 0a 2a 2a 20 54 68  clause..**.** Th
1bc0: 65 20 45 78 70 72 2e 69 52 69 67 68 74 4a 6f 69  e Expr.iRightJoi
1bd0: 6e 54 61 62 6c 65 20 74 65 6c 6c 73 20 74 68 65  nTable tells the
1be0: 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 70 72   WHERE clause pr
1bf0: 6f 63 65 73 73 69 6e 67 20 74 68 61 74 20 74 68  ocessing that th
1c00: 65 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 20  e.** expression 
1c10: 64 65 70 65 6e 64 73 20 6f 6e 20 74 61 62 6c 65  depends on table
1c20: 20 69 52 69 67 68 74 4a 6f 69 6e 54 61 62 6c 65   iRightJoinTable
1c30: 20 65 76 65 6e 20 69 66 20 74 68 61 74 20 74 61   even if that ta
1c40: 62 6c 65 20 69 73 20 6e 6f 74 0a 2a 2a 20 65 78  ble is not.** ex
1c50: 70 6c 69 63 69 74 6c 79 20 6d 65 6e 74 69 6f 6e  plicitly mention
1c60: 65 64 20 69 6e 20 74 68 65 20 65 78 70 72 65 73  ed in the expres
1c70: 73 69 6f 6e 2e 20 20 54 68 61 74 20 69 6e 66 6f  sion.  That info
1c80: 72 6d 61 74 69 6f 6e 20 69 73 20 6e 65 65 64 65  rmation is neede
1c90: 64 0a 2a 2a 20 66 6f 72 20 63 61 73 65 73 20 6c  d.** for cases l
1ca0: 69 6b 65 20 74 68 69 73 3a 0a 2a 2a 0a 2a 2a 20  ike this:.**.** 
1cb0: 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d     SELECT * FROM
1cc0: 20 74 31 20 4c 45 46 54 20 4a 4f 49 4e 20 74 32   t1 LEFT JOIN t2
1cd0: 20 4f 4e 20 74 31 2e 61 3d 74 32 2e 62 20 41 4e   ON t1.a=t2.b AN
1ce0: 44 20 74 31 2e 78 3d 35 0a 2a 2a 0a 2a 2a 20 54  D t1.x=5.**.** T
1cf0: 68 65 20 77 68 65 72 65 20 63 6c 61 75 73 65 20  he where clause 
1d00: 6e 65 65 64 73 20 74 6f 20 64 65 66 65 72 20 74  needs to defer t
1d10: 68 65 20 68 61 6e 64 6c 69 6e 67 20 6f 66 20 74  he handling of t
1d20: 68 65 20 74 31 2e 78 3d 35 0a 2a 2a 20 74 65 72  he t1.x=5.** ter
1d30: 6d 20 75 6e 74 69 6c 20 61 66 74 65 72 20 74 68  m until after th
1d40: 65 20 74 32 20 6c 6f 6f 70 20 6f 66 20 74 68 65  e t2 loop of the
1d50: 20 6a 6f 69 6e 2e 20 20 49 6e 20 74 68 61 74 20   join.  In that 
1d60: 77 61 79 2c 20 61 0a 2a 2a 20 4e 55 4c 4c 20 74  way, a.** NULL t
1d70: 32 20 72 6f 77 20 77 69 6c 6c 20 62 65 20 69 6e  2 row will be in
1d80: 73 65 72 74 65 64 20 77 68 65 6e 65 76 65 72 20  serted whenever 
1d90: 74 31 2e 78 21 3d 35 2e 20 20 49 66 20 77 65 20  t1.x!=5.  If we 
1da0: 64 6f 20 6e 6f 74 0a 2a 2a 20 64 65 66 65 72 20  do not.** defer 
1db0: 74 68 65 20 68 61 6e 64 6c 69 6e 67 20 6f 66 20  the handling of 
1dc0: 74 31 2e 78 3d 35 2c 20 69 74 20 77 69 6c 6c 20  t1.x=5, it will 
1dd0: 62 65 20 70 72 6f 63 65 73 73 65 64 20 69 6d 6d  be processed imm
1de0: 65 64 69 61 74 65 6c 79 0a 2a 2a 20 61 66 74 65  ediately.** afte
1df0: 72 20 74 68 65 20 74 31 20 6c 6f 6f 70 20 61 6e  r the t1 loop an
1e00: 64 20 72 6f 77 73 20 77 69 74 68 20 74 31 2e 78  d rows with t1.x
1e10: 21 3d 35 20 77 69 6c 6c 20 6e 65 76 65 72 20 61  !=5 will never a
1e20: 70 70 65 61 72 20 69 6e 0a 2a 2a 20 74 68 65 20  ppear in.** the 
1e30: 6f 75 74 70 75 74 2c 20 77 68 69 63 68 20 69 73  output, which is
1e40: 20 69 6e 63 6f 72 72 65 63 74 2e 0a 2a 2f 0a 73   incorrect..*/.s
1e50: 74 61 74 69 63 20 76 6f 69 64 20 73 65 74 4a 6f  tatic void setJo
1e60: 69 6e 45 78 70 72 28 45 78 70 72 20 2a 70 2c 20  inExpr(Expr *p, 
1e70: 69 6e 74 20 69 54 61 62 6c 65 29 7b 0a 20 20 77  int iTable){.  w
1e80: 68 69 6c 65 28 20 70 20 29 7b 0a 20 20 20 20 45  hile( p ){.    E
1e90: 78 70 72 53 65 74 50 72 6f 70 65 72 74 79 28 70  xprSetProperty(p
1ea0: 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29 3b 0a  , EP_FromJoin);.
1eb0: 20 20 20 20 70 2d 3e 69 52 69 67 68 74 4a 6f 69      p->iRightJoi
1ec0: 6e 54 61 62 6c 65 20 3d 20 69 54 61 62 6c 65 3b  nTable = iTable;
1ed0: 0a 20 20 20 20 73 65 74 4a 6f 69 6e 45 78 70 72  .    setJoinExpr
1ee0: 28 70 2d 3e 70 4c 65 66 74 2c 20 69 54 61 62 6c  (p->pLeft, iTabl
1ef0: 65 29 3b 0a 20 20 20 20 70 20 3d 20 70 2d 3e 70  e);.    p = p->p
1f00: 52 69 67 68 74 3b 0a 20 20 7d 20 0a 7d 0a 0a 2f  Right;.  } .}../
1f10: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
1f20: 65 20 70 72 6f 63 65 73 73 65 73 20 74 68 65 20  e processes the 
1f30: 6a 6f 69 6e 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  join information
1f40: 20 66 6f 72 20 61 20 53 45 4c 45 43 54 20 73 74   for a SELECT st
1f50: 61 74 65 6d 65 6e 74 2e 0a 2a 2a 20 4f 4e 20 61  atement..** ON a
1f60: 6e 64 20 55 53 49 4e 47 20 63 6c 61 75 73 65 73  nd USING clauses
1f70: 20 61 72 65 20 63 6f 6e 76 65 72 74 65 64 20 69   are converted i
1f80: 6e 74 6f 20 65 78 74 72 61 20 74 65 72 6d 73 20  nto extra terms 
1f90: 6f 66 20 74 68 65 20 57 48 45 52 45 20 63 6c 61  of the WHERE cla
1fa0: 75 73 65 2e 0a 2a 2a 20 4e 41 54 55 52 41 4c 20  use..** NATURAL 
1fb0: 6a 6f 69 6e 73 20 61 6c 73 6f 20 63 72 65 61 74  joins also creat
1fc0: 65 20 65 78 74 72 61 20 57 48 45 52 45 20 63 6c  e extra WHERE cl
1fd0: 61 75 73 65 20 74 65 72 6d 73 2e 0a 2a 2a 0a 2a  ause terms..**.*
1fe0: 2a 20 54 68 65 20 74 65 72 6d 73 20 6f 66 20 61  * The terms of a
1ff0: 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 61 72 65   FROM clause are
2000: 20 63 6f 6e 74 61 69 6e 65 64 20 69 6e 20 74 68   contained in th
2010: 65 20 53 65 6c 65 63 74 2e 70 53 72 63 20 73 74  e Select.pSrc st
2020: 72 75 63 74 75 72 65 2e 0a 2a 2a 20 54 68 65 20  ructure..** The 
2030: 6c 65 66 74 20 6d 6f 73 74 20 74 61 62 6c 65 20  left most table 
2040: 69 73 20 74 68 65 20 66 69 72 73 74 20 65 6e 74  is the first ent
2050: 72 79 20 69 6e 20 53 65 6c 65 63 74 2e 70 53 72  ry in Select.pSr
2060: 63 2e 20 20 54 68 65 20 72 69 67 68 74 2d 6d 6f  c.  The right-mo
2070: 73 74 0a 2a 2a 20 74 61 62 6c 65 20 69 73 20 74  st.** table is t
2080: 68 65 20 6c 61 73 74 20 65 6e 74 72 79 2e 20 20  he last entry.  
2090: 54 68 65 20 6a 6f 69 6e 20 6f 70 65 72 61 74 6f  The join operato
20a0: 72 20 69 73 20 68 65 6c 64 20 69 6e 20 74 68 65  r is held in the
20b0: 20 65 6e 74 72 79 20 74 6f 0a 2a 2a 20 74 68 65   entry to.** the
20c0: 20 6c 65 66 74 2e 20 20 54 68 75 73 20 65 6e 74   left.  Thus ent
20d0: 72 79 20 30 20 63 6f 6e 74 61 69 6e 73 20 74 68  ry 0 contains th
20e0: 65 20 6a 6f 69 6e 20 6f 70 65 72 61 74 6f 72 20  e join operator 
20f0: 66 6f 72 20 74 68 65 20 6a 6f 69 6e 20 62 65 74  for the join bet
2100: 77 65 65 6e 0a 2a 2a 20 65 6e 74 72 69 65 73 20  ween.** entries 
2110: 30 20 61 6e 64 20 31 2e 20 20 41 6e 79 20 4f 4e  0 and 1.  Any ON
2120: 20 6f 72 20 55 53 49 4e 47 20 63 6c 61 75 73 65   or USING clause
2130: 73 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74  s associated wit
2140: 68 20 74 68 65 20 6a 6f 69 6e 20 61 72 65 0a 2a  h the join are.*
2150: 2a 20 61 6c 73 6f 20 61 74 74 61 63 68 65 64 20  * also attached 
2160: 74 6f 20 74 68 65 20 6c 65 66 74 20 65 6e 74 72  to the left entr
2170: 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  y..**.** This ro
2180: 75 74 69 6e 65 20 72 65 74 75 72 6e 73 20 74 68  utine returns th
2190: 65 20 6e 75 6d 62 65 72 20 6f 66 20 65 72 72 6f  e number of erro
21a0: 72 73 20 65 6e 63 6f 75 6e 74 65 72 65 64 2e 0a  rs encountered..
21b0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 71  */.static int sq
21c0: 6c 69 74 65 50 72 6f 63 65 73 73 4a 6f 69 6e 28  liteProcessJoin(
21d0: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 53  Parse *pParse, S
21e0: 65 6c 65 63 74 20 2a 70 29 7b 0a 20 20 53 72 63  elect *p){.  Src
21f0: 4c 69 73 74 20 2a 70 53 72 63 3b 20 20 20 20 20  List *pSrc;     
2200: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2210: 41 6c 6c 20 74 61 62 6c 65 73 20 69 6e 20 74 68  All tables in th
2220: 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 2a 2f  e FROM clause */
2230: 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 20 20 20 20  .  int i, j;    
2240: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2250: 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74     /* Loop count
2260: 65 72 73 20 2a 2f 0a 20 20 73 74 72 75 63 74 20  ers */.  struct 
2270: 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 4c  SrcList_item *pL
2280: 65 66 74 3b 20 20 20 20 20 2f 2a 20 4c 65 66 74  eft;     /* Left
2290: 20 74 61 62 6c 65 20 62 65 69 6e 67 20 6a 6f 69   table being joi
22a0: 6e 65 64 20 2a 2f 0a 20 20 73 74 72 75 63 74 20  ned */.  struct 
22b0: 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 52  SrcList_item *pR
22c0: 69 67 68 74 3b 20 20 20 20 2f 2a 20 52 69 67 68  ight;    /* Righ
22d0: 74 20 74 61 62 6c 65 20 62 65 69 6e 67 20 6a 6f  t table being jo
22e0: 69 6e 65 64 20 2a 2f 0a 0a 20 20 70 53 72 63 20  ined */..  pSrc 
22f0: 3d 20 70 2d 3e 70 53 72 63 3b 0a 20 20 70 4c 65  = p->pSrc;.  pLe
2300: 66 74 20 3d 20 26 70 53 72 63 2d 3e 61 5b 30 5d  ft = &pSrc->a[0]
2310: 3b 0a 20 20 70 52 69 67 68 74 20 3d 20 26 70 4c  ;.  pRight = &pL
2320: 65 66 74 5b 31 5d 3b 0a 20 20 66 6f 72 28 69 3d  eft[1];.  for(i=
2330: 30 3b 20 69 3c 70 53 72 63 2d 3e 6e 53 72 63 2d  0; i<pSrc->nSrc-
2340: 31 3b 20 69 2b 2b 2c 20 70 52 69 67 68 74 2b 2b  1; i++, pRight++
2350: 2c 20 70 4c 65 66 74 2b 2b 29 7b 0a 20 20 20 20  , pLeft++){.    
2360: 54 61 62 6c 65 20 2a 70 4c 65 66 74 54 61 62 20  Table *pLeftTab 
2370: 3d 20 70 4c 65 66 74 2d 3e 70 54 61 62 3b 0a 20  = pLeft->pTab;. 
2380: 20 20 20 54 61 62 6c 65 20 2a 70 52 69 67 68 74     Table *pRight
2390: 54 61 62 20 3d 20 70 52 69 67 68 74 2d 3e 70 54  Tab = pRight->pT
23a0: 61 62 3b 0a 0a 20 20 20 20 69 66 28 20 70 4c 65  ab;..    if( pLe
23b0: 66 74 54 61 62 3d 3d 30 20 7c 7c 20 70 52 69 67  ftTab==0 || pRig
23c0: 68 74 54 61 62 3d 3d 30 20 29 20 63 6f 6e 74 69  htTab==0 ) conti
23d0: 6e 75 65 3b 0a 0a 20 20 20 20 2f 2a 20 57 68 65  nue;..    /* Whe
23e0: 6e 20 74 68 65 20 4e 41 54 55 52 41 4c 20 6b 65  n the NATURAL ke
23f0: 79 77 6f 72 64 20 69 73 20 70 72 65 73 65 6e 74  yword is present
2400: 2c 20 61 64 64 20 57 48 45 52 45 20 63 6c 61 75  , add WHERE clau
2410: 73 65 20 74 65 72 6d 73 20 66 6f 72 0a 20 20 20  se terms for.   
2420: 20 2a 2a 20 65 76 65 72 79 20 63 6f 6c 75 6d 6e   ** every column
2430: 20 74 68 61 74 20 74 68 65 20 74 77 6f 20 74 61   that the two ta
2440: 62 6c 65 73 20 68 61 76 65 20 69 6e 20 63 6f 6d  bles have in com
2450: 6d 6f 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  mon..    */.    
2460: 69 66 28 20 70 52 69 67 68 74 2d 3e 6a 6f 69 6e  if( pRight->join
2470: 74 79 70 65 20 26 20 4a 54 5f 4e 41 54 55 52 41  type & JT_NATURA
2480: 4c 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70  L ){.      if( p
2490: 52 69 67 68 74 2d 3e 70 4f 6e 20 7c 7c 20 70 52  Right->pOn || pR
24a0: 69 67 68 74 2d 3e 70 55 73 69 6e 67 20 29 7b 0a  ight->pUsing ){.
24b0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
24c0: 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
24d0: 22 61 20 4e 41 54 55 52 41 4c 20 6a 6f 69 6e 20  "a NATURAL join 
24e0: 6d 61 79 20 6e 6f 74 20 68 61 76 65 20 22 0a 20  may not have ". 
24f0: 20 20 20 20 20 20 20 20 20 20 22 61 6e 20 4f 4e            "an ON
2500: 20 6f 72 20 55 53 49 4e 47 20 63 6c 61 75 73 65   or USING clause
2510: 22 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 72  ", 0);.        r
2520: 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 20 20 7d  eturn 1;.      }
2530: 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20  .      for(j=0; 
2540: 6a 3c 70 4c 65 66 74 54 61 62 2d 3e 6e 43 6f 6c  j<pLeftTab->nCol
2550: 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; j++){.        
2560: 63 68 61 72 20 2a 7a 4e 61 6d 65 20 3d 20 70 4c  char *zName = pL
2570: 65 66 74 54 61 62 2d 3e 61 43 6f 6c 5b 6a 5d 2e  eftTab->aCol[j].
2580: 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20 20 20 69  zName;.        i
2590: 66 28 20 63 6f 6c 75 6d 6e 49 6e 64 65 78 28 70  f( columnIndex(p
25a0: 52 69 67 68 74 54 61 62 2c 20 7a 4e 61 6d 65 29  RightTab, zName)
25b0: 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  >=0 ){.         
25c0: 20 61 64 64 57 68 65 72 65 54 65 72 6d 28 7a 4e   addWhereTerm(zN
25d0: 61 6d 65 2c 20 70 4c 65 66 74 54 61 62 2c 20 70  ame, pLeftTab, p
25e0: 4c 65 66 74 2d 3e 7a 41 6c 69 61 73 2c 20 0a 20  Left->zAlias, . 
25f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2600: 20 20 20 20 20 20 20 20 20 20 20 20 20 70 52 69               pRi
2610: 67 68 74 54 61 62 2c 20 70 52 69 67 68 74 2d 3e  ghtTab, pRight->
2620: 7a 41 6c 69 61 73 2c 0a 20 20 20 20 20 20 20 20  zAlias,.        
2630: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2640: 20 20 20 20 20 20 70 52 69 67 68 74 2d 3e 69 43        pRight->iC
2650: 75 72 73 6f 72 2c 20 26 70 2d 3e 70 57 68 65 72  ursor, &p->pWher
2660: 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 0a 20  e);.          . 
2670: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
2680: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 44  .    }..    /* D
2690: 69 73 61 6c 6c 6f 77 20 62 6f 74 68 20 4f 4e 20  isallow both ON 
26a0: 61 6e 64 20 55 53 49 4e 47 20 63 6c 61 75 73 65  and USING clause
26b0: 73 20 69 6e 20 74 68 65 20 73 61 6d 65 20 6a 6f  s in the same jo
26c0: 69 6e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  in.    */.    if
26d0: 28 20 70 52 69 67 68 74 2d 3e 70 4f 6e 20 26 26  ( pRight->pOn &&
26e0: 20 70 52 69 67 68 74 2d 3e 70 55 73 69 6e 67 20   pRight->pUsing 
26f0: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
2700: 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
2710: 20 22 63 61 6e 6e 6f 74 20 68 61 76 65 20 62 6f   "cannot have bo
2720: 74 68 20 4f 4e 20 61 6e 64 20 55 53 49 4e 47 20  th ON and USING 
2730: 22 0a 20 20 20 20 20 20 20 20 22 63 6c 61 75 73  ".        "claus
2740: 65 73 20 69 6e 20 74 68 65 20 73 61 6d 65 20 6a  es in the same j
2750: 6f 69 6e 22 29 3b 0a 20 20 20 20 20 20 72 65 74  oin");.      ret
2760: 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 0a 20 20  urn 1;.    }..  
2770: 20 20 2f 2a 20 41 64 64 20 74 68 65 20 4f 4e 20    /* Add the ON 
2780: 63 6c 61 75 73 65 20 74 6f 20 74 68 65 20 65 6e  clause to the en
2790: 64 20 6f 66 20 74 68 65 20 57 48 45 52 45 20 63  d of the WHERE c
27a0: 6c 61 75 73 65 2c 20 63 6f 6e 6e 65 63 74 65 64  lause, connected
27b0: 20 62 79 0a 20 20 20 20 2a 2a 20 61 6e 20 41 4e   by.    ** an AN
27c0: 44 20 6f 70 65 72 61 74 6f 72 2e 0a 20 20 20 20  D operator..    
27d0: 2a 2f 0a 20 20 20 20 69 66 28 20 70 52 69 67 68  */.    if( pRigh
27e0: 74 2d 3e 70 4f 6e 20 29 7b 0a 20 20 20 20 20 20  t->pOn ){.      
27f0: 73 65 74 4a 6f 69 6e 45 78 70 72 28 70 52 69 67  setJoinExpr(pRig
2800: 68 74 2d 3e 70 4f 6e 2c 20 70 52 69 67 68 74 2d  ht->pOn, pRight-
2810: 3e 69 43 75 72 73 6f 72 29 3b 0a 20 20 20 20 20  >iCursor);.     
2820: 20 70 2d 3e 70 57 68 65 72 65 20 3d 20 73 71 6c   p->pWhere = sql
2830: 69 74 65 33 45 78 70 72 41 6e 64 28 70 2d 3e 70  ite3ExprAnd(p->p
2840: 57 68 65 72 65 2c 20 70 52 69 67 68 74 2d 3e 70  Where, pRight->p
2850: 4f 6e 29 3b 0a 20 20 20 20 20 20 70 52 69 67 68  On);.      pRigh
2860: 74 2d 3e 70 4f 6e 20 3d 20 30 3b 0a 20 20 20 20  t->pOn = 0;.    
2870: 7d 0a 0a 20 20 20 20 2f 2a 20 43 72 65 61 74 65  }..    /* Create
2880: 20 65 78 74 72 61 20 74 65 72 6d 73 20 6f 6e 20   extra terms on 
2890: 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  the WHERE clause
28a0: 20 66 6f 72 20 65 61 63 68 20 63 6f 6c 75 6d 6e   for each column
28b0: 20 6e 61 6d 65 64 0a 20 20 20 20 2a 2a 20 69 6e   named.    ** in
28c0: 20 74 68 65 20 55 53 49 4e 47 20 63 6c 61 75 73   the USING claus
28d0: 65 2e 20 20 45 78 61 6d 70 6c 65 3a 20 49 66 20  e.  Example: If 
28e0: 74 68 65 20 74 77 6f 20 74 61 62 6c 65 73 20 74  the two tables t
28f0: 6f 20 62 65 20 6a 6f 69 6e 65 64 20 61 72 65 20  o be joined are 
2900: 0a 20 20 20 20 2a 2a 20 41 20 61 6e 64 20 42 20  .    ** A and B 
2910: 61 6e 64 20 74 68 65 20 55 53 49 4e 47 20 63 6c  and the USING cl
2920: 61 75 73 65 20 6e 61 6d 65 73 20 58 2c 20 59 2c  ause names X, Y,
2930: 20 61 6e 64 20 5a 2c 20 74 68 65 6e 20 61 64 64   and Z, then add
2940: 20 74 68 69 73 0a 20 20 20 20 2a 2a 20 74 6f 20   this.    ** to 
2950: 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  the WHERE clause
2960: 3a 20 20 20 20 41 2e 58 3d 42 2e 58 20 41 4e 44  :    A.X=B.X AND
2970: 20 41 2e 59 3d 42 2e 59 20 41 4e 44 20 41 2e 5a   A.Y=B.Y AND A.Z
2980: 3d 42 2e 5a 0a 20 20 20 20 2a 2a 20 52 65 70 6f  =B.Z.    ** Repo
2990: 72 74 20 61 6e 20 65 72 72 6f 72 20 69 66 20 61  rt an error if a
29a0: 6e 79 20 63 6f 6c 75 6d 6e 20 6d 65 6e 74 69 6f  ny column mentio
29b0: 6e 65 64 20 69 6e 20 74 68 65 20 55 53 49 4e 47  ned in the USING
29c0: 20 63 6c 61 75 73 65 20 69 73 0a 20 20 20 20 2a   clause is.    *
29d0: 2a 20 6e 6f 74 20 63 6f 6e 74 61 69 6e 65 64 20  * not contained 
29e0: 69 6e 20 62 6f 74 68 20 74 61 62 6c 65 73 20 74  in both tables t
29f0: 6f 20 62 65 20 6a 6f 69 6e 65 64 2e 0a 20 20 20  o be joined..   
2a00: 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 52 69 67   */.    if( pRig
2a10: 68 74 2d 3e 70 55 73 69 6e 67 20 29 7b 0a 20 20  ht->pUsing ){.  
2a20: 20 20 20 20 49 64 4c 69 73 74 20 2a 70 4c 69 73      IdList *pLis
2a30: 74 20 3d 20 70 52 69 67 68 74 2d 3e 70 55 73 69  t = pRight->pUsi
2a40: 6e 67 3b 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d  ng;.      for(j=
2a50: 30 3b 20 6a 3c 70 4c 69 73 74 2d 3e 6e 49 64 3b  0; j<pList->nId;
2a60: 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 63   j++){.        c
2a70: 68 61 72 20 2a 7a 4e 61 6d 65 20 3d 20 70 4c 69  har *zName = pLi
2a80: 73 74 2d 3e 61 5b 6a 5d 2e 7a 4e 61 6d 65 3b 0a  st->a[j].zName;.
2a90: 20 20 20 20 20 20 20 20 69 66 28 20 63 6f 6c 75          if( colu
2aa0: 6d 6e 49 6e 64 65 78 28 70 4c 65 66 74 54 61 62  mnIndex(pLeftTab
2ab0: 2c 20 7a 4e 61 6d 65 29 3c 30 20 7c 7c 20 63 6f  , zName)<0 || co
2ac0: 6c 75 6d 6e 49 6e 64 65 78 28 70 52 69 67 68 74  lumnIndex(pRight
2ad0: 54 61 62 2c 20 7a 4e 61 6d 65 29 3c 30 20 29 7b  Tab, zName)<0 ){
2ae0: 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
2af0: 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
2b00: 65 2c 20 22 63 61 6e 6e 6f 74 20 6a 6f 69 6e 20  e, "cannot join 
2b10: 75 73 69 6e 67 20 63 6f 6c 75 6d 6e 20 25 73 20  using column %s 
2b20: 2d 20 63 6f 6c 75 6d 6e 20 22 0a 20 20 20 20 20  - column ".     
2b30: 20 20 20 20 20 20 20 22 6e 6f 74 20 70 72 65 73         "not pres
2b40: 65 6e 74 20 69 6e 20 62 6f 74 68 20 74 61 62 6c  ent in both tabl
2b50: 65 73 22 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20  es", zName);.   
2b60: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b         return 1;
2b70: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
2b80: 20 20 20 61 64 64 57 68 65 72 65 54 65 72 6d 28     addWhereTerm(
2b90: 7a 4e 61 6d 65 2c 20 70 4c 65 66 74 54 61 62 2c  zName, pLeftTab,
2ba0: 20 70 4c 65 66 74 2d 3e 7a 41 6c 69 61 73 2c 20   pLeft->zAlias, 
2bb0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
2bc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 70 52 69               pRi
2bd0: 67 68 74 54 61 62 2c 20 70 52 69 67 68 74 2d 3e  ghtTab, pRight->
2be0: 7a 41 6c 69 61 73 2c 0a 20 20 20 20 20 20 20 20  zAlias,.        
2bf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c00: 20 20 20 20 70 52 69 67 68 74 2d 3e 69 43 75 72      pRight->iCur
2c10: 73 6f 72 2c 20 26 70 2d 3e 70 57 68 65 72 65 29  sor, &p->pWhere)
2c20: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
2c30: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a    }.  return 0;.
2c40: 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 73 65 72 74 20  }../*.** Insert 
2c50: 63 6f 64 65 20 69 6e 74 6f 20 22 76 22 20 74 68  code into "v" th
2c60: 61 74 20 77 69 6c 6c 20 70 75 73 68 20 74 68 65  at will push the
2c70: 20 72 65 63 6f 72 64 20 6f 6e 20 74 68 65 20 74   record on the t
2c80: 6f 70 20 6f 66 20 74 68 65 0a 2a 2a 20 73 74 61  op of the.** sta
2c90: 63 6b 20 69 6e 74 6f 20 74 68 65 20 73 6f 72 74  ck into the sort
2ca0: 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  er..*/.static vo
2cb0: 69 64 20 70 75 73 68 4f 6e 74 6f 53 6f 72 74 65  id pushOntoSorte
2cc0: 72 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  r(.  Parse *pPar
2cd0: 73 65 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 50  se,         /* P
2ce0: 61 72 73 65 72 20 63 6f 6e 74 65 78 74 20 2a 2f  arser context */
2cf0: 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4f 72  .  ExprList *pOr
2d00: 64 65 72 42 79 2c 20 20 20 20 2f 2a 20 54 68 65  derBy,    /* The
2d10: 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65   ORDER BY clause
2d20: 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 53   */.  Select *pS
2d30: 65 6c 65 63 74 20 20 20 20 20 20 20 20 2f 2a 20  elect        /* 
2d40: 54 68 65 20 77 68 6f 6c 65 20 53 45 4c 45 43 54  The whole SELECT
2d50: 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 29 7b   statement */.){
2d60: 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61  .  Vdbe *v = pPa
2d70: 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 73 71  rse->pVdbe;.  sq
2d80: 6c 69 74 65 33 45 78 70 72 43 6f 64 65 45 78 70  lite3ExprCodeExp
2d90: 72 4c 69 73 74 28 70 50 61 72 73 65 2c 20 70 4f  rList(pParse, pO
2da0: 72 64 65 72 42 79 29 3b 0a 20 20 73 71 6c 69 74  rderBy);.  sqlit
2db0: 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
2dc0: 50 5f 53 65 71 75 65 6e 63 65 2c 20 70 4f 72 64  P_Sequence, pOrd
2dd0: 65 72 42 79 2d 3e 69 45 43 75 72 73 6f 72 2c 20  erBy->iECursor, 
2de0: 30 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  0);.  sqlite3Vdb
2df0: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 50 75 6c  eAddOp(v, OP_Pul
2e00: 6c 2c 20 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78  l, pOrderBy->nEx
2e10: 70 72 20 2b 20 31 2c 20 30 29 3b 0a 20 20 73 71  pr + 1, 0);.  sq
2e20: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
2e30: 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c  , OP_MakeRecord,
2e40: 20 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72   pOrderBy->nExpr
2e50: 20 2b 20 32 2c 20 30 29 3b 0a 20 20 73 71 6c 69   + 2, 0);.  sqli
2e60: 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
2e70: 4f 50 5f 49 64 78 49 6e 73 65 72 74 2c 20 70 4f  OP_IdxInsert, pO
2e80: 72 64 65 72 42 79 2d 3e 69 45 43 75 72 73 6f 72  rderBy->iECursor
2e90: 2c 20 30 29 3b 0a 20 20 69 66 28 20 70 53 65 6c  , 0);.  if( pSel
2ea0: 65 63 74 2d 3e 69 4c 69 6d 69 74 3e 3d 30 20 29  ect->iLimit>=0 )
2eb0: 7b 0a 20 20 20 20 69 6e 74 20 61 64 64 72 31 2c  {.    int addr1,
2ec0: 20 61 64 64 72 32 3b 0a 20 20 20 20 61 64 64 72   addr2;.    addr
2ed0: 31 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41  1 = sqlite3VdbeA
2ee0: 64 64 4f 70 28 76 2c 20 4f 50 5f 49 66 4d 65 6d  ddOp(v, OP_IfMem
2ef0: 5a 65 72 6f 2c 20 70 53 65 6c 65 63 74 2d 3e 69  Zero, pSelect->i
2f00: 4c 69 6d 69 74 2b 31 2c 20 30 29 3b 0a 20 20 20  Limit+1, 0);.   
2f10: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
2f20: 70 28 76 2c 20 4f 50 5f 4d 65 6d 49 6e 63 72 2c  p(v, OP_MemIncr,
2f30: 20 2d 31 2c 20 70 53 65 6c 65 63 74 2d 3e 69 4c   -1, pSelect->iL
2f40: 69 6d 69 74 2b 31 29 3b 0a 20 20 20 20 61 64 64  imit+1);.    add
2f50: 72 32 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  r2 = sqlite3Vdbe
2f60: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 47 6f 74 6f  AddOp(v, OP_Goto
2f70: 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c  , 0, 0);.    sql
2f80: 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65  ite3VdbeJumpHere
2f90: 28 76 2c 20 61 64 64 72 31 29 3b 0a 20 20 20 20  (v, addr1);.    
2fa0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
2fb0: 28 76 2c 20 4f 50 5f 4c 61 73 74 2c 20 70 4f 72  (v, OP_Last, pOr
2fc0: 64 65 72 42 79 2d 3e 69 45 43 75 72 73 6f 72 2c  derBy->iECursor,
2fd0: 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33   0);.    sqlite3
2fe0: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
2ff0: 44 65 6c 65 74 65 2c 20 70 4f 72 64 65 72 42 79  Delete, pOrderBy
3000: 2d 3e 69 45 43 75 72 73 6f 72 2c 20 30 29 3b 0a  ->iECursor, 0);.
3010: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a      sqlite3VdbeJ
3020: 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72 32  umpHere(v, addr2
3030: 29 3b 0a 20 20 20 20 70 53 65 6c 65 63 74 2d 3e  );.    pSelect->
3040: 69 4c 69 6d 69 74 20 3d 20 2d 31 3b 0a 20 20 7d  iLimit = -1;.  }
3050: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 63 6f  .}../*.** Add co
3060: 64 65 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20  de to implement 
3070: 74 68 65 20 4f 46 46 53 45 54 0a 2a 2f 0a 73 74  the OFFSET.*/.st
3080: 61 74 69 63 20 76 6f 69 64 20 63 6f 64 65 4f 66  atic void codeOf
3090: 66 73 65 74 28 0a 20 20 56 64 62 65 20 2a 76 2c  fset(.  Vdbe *v,
30a0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 47 65 6e            /* Gen
30b0: 65 72 61 74 65 20 63 6f 64 65 20 69 6e 74 6f 20  erate code into 
30c0: 74 68 69 73 20 56 4d 20 2a 2f 0a 20 20 53 65 6c  this VM */.  Sel
30d0: 65 63 74 20 2a 70 2c 20 20 20 20 20 20 20 20 2f  ect *p,        /
30e0: 2a 20 54 68 65 20 53 45 4c 45 43 54 20 73 74 61  * The SELECT sta
30f0: 74 65 6d 65 6e 74 20 62 65 69 6e 67 20 63 6f 64  tement being cod
3100: 65 64 20 2a 2f 0a 20 20 69 6e 74 20 69 43 6f 6e  ed */.  int iCon
3110: 74 69 6e 75 65 2c 20 20 20 20 2f 2a 20 4a 75 6d  tinue,    /* Jum
3120: 70 20 68 65 72 65 20 74 6f 20 73 6b 69 70 20 74  p here to skip t
3130: 68 65 20 63 75 72 72 65 6e 74 20 72 65 63 6f 72  he current recor
3140: 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 50 6f 70 20  d */.  int nPop 
3150: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
3160: 65 72 20 6f 66 20 74 69 6d 65 73 20 74 6f 20 70  er of times to p
3170: 6f 70 20 73 74 61 63 6b 20 77 68 65 6e 20 6a 75  op stack when ju
3180: 6d 70 69 6e 67 20 2a 2f 0a 29 7b 0a 20 20 69 66  mping */.){.  if
3190: 28 20 70 2d 3e 69 4f 66 66 73 65 74 3e 3d 30 20  ( p->iOffset>=0 
31a0: 26 26 20 69 43 6f 6e 74 69 6e 75 65 21 3d 30 20  && iContinue!=0 
31b0: 29 7b 0a 20 20 20 20 69 6e 74 20 61 64 64 72 3b  ){.    int addr;
31c0: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
31d0: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 65 6d 49  AddOp(v, OP_MemI
31e0: 6e 63 72 2c 20 2d 31 2c 20 70 2d 3e 69 4f 66 66  ncr, -1, p->iOff
31f0: 73 65 74 29 3b 0a 20 20 20 20 61 64 64 72 20 3d  set);.    addr =
3200: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
3210: 70 28 76 2c 20 4f 50 5f 49 66 4d 65 6d 4e 65 67  p(v, OP_IfMemNeg
3220: 2c 20 70 2d 3e 69 4f 66 66 73 65 74 2c 20 30 29  , p->iOffset, 0)
3230: 3b 0a 20 20 20 20 69 66 28 20 6e 50 6f 70 3e 30  ;.    if( nPop>0
3240: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
3250: 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
3260: 5f 50 6f 70 2c 20 6e 50 6f 70 2c 20 30 29 3b 0a  _Pop, nPop, 0);.
3270: 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
3280: 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
3290: 5f 47 6f 74 6f 2c 20 30 2c 20 69 43 6f 6e 74 69  _Goto, 0, iConti
32a0: 6e 75 65 29 3b 0a 20 20 20 20 56 64 62 65 43 6f  nue);.    VdbeCo
32b0: 6d 6d 65 6e 74 28 28 76 2c 20 22 23 20 73 6b 69  mment((v, "# ski
32c0: 70 20 4f 46 46 53 45 54 20 72 65 63 6f 72 64 73  p OFFSET records
32d0: 22 29 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  "));.    sqlite3
32e0: 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20  VdbeJumpHere(v, 
32f0: 61 64 64 72 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  addr);.  }.}../*
3300: 0a 2a 2a 20 41 64 64 20 63 6f 64 65 20 74 68 61  .** Add code tha
3310: 74 20 77 69 6c 6c 20 63 68 65 63 6b 20 74 6f 20  t will check to 
3320: 6d 61 6b 65 20 73 75 72 65 20 74 68 65 20 74 6f  make sure the to
3330: 70 20 4e 20 65 6c 65 6d 65 6e 74 73 20 6f 66 20  p N elements of 
3340: 74 68 65 0a 2a 2a 20 73 74 61 63 6b 20 61 72 65  the.** stack are
3350: 20 64 69 73 74 69 6e 63 74 2e 20 20 69 54 61 62   distinct.  iTab
3360: 20 69 73 20 61 20 73 6f 72 74 69 6e 67 20 69 6e   is a sorting in
3370: 64 65 78 20 74 68 61 74 20 68 6f 6c 64 73 20 70  dex that holds p
3380: 72 65 76 69 6f 75 73 6c 79 0a 2a 2a 20 73 65 65  reviously.** see
3390: 6e 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 73 20 6f  n combinations o
33a0: 66 20 74 68 65 20 4e 20 76 61 6c 75 65 73 2e 20  f the N values. 
33b0: 20 41 20 6e 65 77 20 65 6e 74 72 79 20 69 73 20   A new entry is 
33c0: 6d 61 64 65 20 69 6e 20 69 54 61 62 0a 2a 2a 20  made in iTab.** 
33d0: 69 66 20 74 68 65 20 63 75 72 72 65 6e 74 20 4e  if the current N
33e0: 20 76 61 6c 75 65 73 20 61 72 65 20 6e 65 77 2e   values are new.
33f0: 0a 2a 2a 0a 2a 2a 20 41 20 6a 75 6d 70 20 74 6f  .**.** A jump to
3400: 20 61 64 64 72 52 65 70 65 61 74 20 69 73 20 6d   addrRepeat is m
3410: 61 64 65 20 61 6e 64 20 74 68 65 20 4e 2b 31 20  ade and the N+1 
3420: 76 61 6c 75 65 73 20 61 72 65 20 70 6f 70 70 65  values are poppe
3430: 64 20 66 72 6f 6d 20 74 68 65 0a 2a 2a 20 73 74  d from the.** st
3440: 61 63 6b 20 69 66 20 74 68 65 20 74 6f 70 20 4e  ack if the top N
3450: 20 65 6c 65 6d 65 6e 74 73 20 61 72 65 20 6e 6f   elements are no
3460: 74 20 64 69 73 74 69 6e 63 74 2e 0a 2a 2f 0a 73  t distinct..*/.s
3470: 74 61 74 69 63 20 76 6f 69 64 20 63 6f 64 65 44  tatic void codeD
3480: 69 73 74 69 6e 63 74 28 0a 20 20 56 64 62 65 20  istinct(.  Vdbe 
3490: 2a 76 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a  *v,           /*
34a0: 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 69   Generate code i
34b0: 6e 74 6f 20 74 68 69 73 20 56 4d 20 2a 2f 0a 20  nto this VM */. 
34c0: 20 69 6e 74 20 69 54 61 62 2c 20 20 20 20 20 20   int iTab,      
34d0: 20 20 20 20 2f 2a 20 41 20 73 6f 72 74 69 6e 67      /* A sorting
34e0: 20 69 6e 64 65 78 20 75 73 65 64 20 74 6f 20 74   index used to t
34f0: 65 73 74 20 66 6f 72 20 64 69 73 74 69 6e 63 74  est for distinct
3500: 6e 65 73 73 20 2a 2f 0a 20 20 69 6e 74 20 61 64  ness */.  int ad
3510: 64 72 52 65 70 65 61 74 2c 20 20 20 20 2f 2a 20  drRepeat,    /* 
3520: 4a 75 6d 70 20 74 6f 20 68 65 72 65 20 69 66 20  Jump to here if 
3530: 6e 6f 74 20 64 69 73 74 69 6e 63 74 20 2a 2f 0a  not distinct */.
3540: 20 20 69 6e 74 20 4e 20 20 20 20 20 20 20 20 20    int N         
3550: 20 20 20 20 20 2f 2a 20 54 68 65 20 74 6f 70 20       /* The top 
3560: 4e 20 65 6c 65 6d 65 6e 74 73 20 6f 66 20 74 68  N elements of th
3570: 65 20 73 74 61 63 6b 20 6d 75 73 74 20 62 65 20  e stack must be 
3580: 64 69 73 74 69 6e 63 74 20 2a 2f 0a 29 7b 0a 20  distinct */.){. 
3590: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
35a0: 70 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f  p(v, OP_MakeReco
35b0: 72 64 2c 20 2d 4e 2c 20 30 29 3b 0a 20 20 73 71  rd, -N, 0);.  sq
35c0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
35d0: 2c 20 4f 50 5f 44 69 73 74 69 6e 63 74 2c 20 69  , OP_Distinct, i
35e0: 54 61 62 2c 20 73 71 6c 69 74 65 33 56 64 62 65  Tab, sqlite3Vdbe
35f0: 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 2b 33  CurrentAddr(v)+3
3600: 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  );.  sqlite3Vdbe
3610: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 50 6f 70 2c  AddOp(v, OP_Pop,
3620: 20 4e 2b 31 2c 20 30 29 3b 0a 20 20 73 71 6c 69   N+1, 0);.  sqli
3630: 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
3640: 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 61 64 64 72  OP_Goto, 0, addr
3650: 52 65 70 65 61 74 29 3b 0a 20 20 56 64 62 65 43  Repeat);.  VdbeC
3660: 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 23 20 73 6b  omment((v, "# sk
3670: 69 70 20 69 6e 64 69 73 74 69 6e 63 74 20 72 65  ip indistinct re
3680: 63 6f 72 64 73 22 29 29 3b 0a 20 20 73 71 6c 69  cords"));.  sqli
3690: 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
36a0: 4f 50 5f 49 64 78 49 6e 73 65 72 74 2c 20 69 54  OP_IdxInsert, iT
36b0: 61 62 2c 20 30 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a  ab, 0);.}.../*.*
36c0: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 67  * This routine g
36d0: 65 6e 65 72 61 74 65 73 20 74 68 65 20 63 6f 64  enerates the cod
36e0: 65 20 66 6f 72 20 74 68 65 20 69 6e 73 69 64 65  e for the inside
36f0: 20 6f 66 20 74 68 65 20 69 6e 6e 65 72 20 6c 6f   of the inner lo
3700: 6f 70 0a 2a 2a 20 6f 66 20 61 20 53 45 4c 45 43  op.** of a SELEC
3710: 54 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 73 72 63 54  T..**.** If srcT
3720: 61 62 20 61 6e 64 20 6e 43 6f 6c 75 6d 6e 20 61  ab and nColumn a
3730: 72 65 20 62 6f 74 68 20 7a 65 72 6f 2c 20 74 68  re both zero, th
3740: 65 6e 20 74 68 65 20 70 45 4c 69 73 74 20 65 78  en the pEList ex
3750: 70 72 65 73 73 69 6f 6e 73 0a 2a 2a 20 61 72 65  pressions.** are
3760: 20 65 76 61 6c 75 61 74 65 64 20 69 6e 20 6f 72   evaluated in or
3770: 64 65 72 20 74 6f 20 67 65 74 20 74 68 65 20 64  der to get the d
3780: 61 74 61 20 66 6f 72 20 74 68 69 73 20 72 6f 77  ata for this row
3790: 2e 20 20 49 66 20 6e 43 6f 6c 75 6d 6e 3e 30 0a  .  If nColumn>0.
37a0: 2a 2a 20 74 68 65 6e 20 64 61 74 61 20 69 73 20  ** then data is 
37b0: 70 75 6c 6c 65 64 20 66 72 6f 6d 20 73 72 63 54  pulled from srcT
37c0: 61 62 20 61 6e 64 20 70 45 4c 69 73 74 20 69 73  ab and pEList is
37d0: 20 75 73 65 64 20 6f 6e 6c 79 20 74 6f 20 67 65   used only to ge
37e0: 74 20 74 68 65 0a 2a 2a 20 64 61 74 61 74 79 70  t the.** datatyp
37f0: 65 73 20 66 6f 72 20 65 61 63 68 20 63 6f 6c 75  es for each colu
3800: 6d 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  mn..*/.static in
3810: 74 20 73 65 6c 65 63 74 49 6e 6e 65 72 4c 6f 6f  t selectInnerLoo
3820: 70 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  p(.  Parse *pPar
3830: 73 65 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20  se,          /* 
3840: 54 68 65 20 70 61 72 73 65 72 20 63 6f 6e 74 65  The parser conte
3850: 78 74 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a  xt */.  Select *
3860: 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p,              
3870: 2f 2a 20 54 68 65 20 63 6f 6d 70 6c 65 74 65 20  /* The complete 
3880: 73 65 6c 65 63 74 20 73 74 61 74 65 6d 65 6e 74  select statement
3890: 20 62 65 69 6e 67 20 63 6f 64 65 64 20 2a 2f 0a   being coded */.
38a0: 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69    ExprList *pELi
38b0: 73 74 2c 20 20 20 20 20 20 20 2f 2a 20 4c 69 73  st,       /* Lis
38c0: 74 20 6f 66 20 76 61 6c 75 65 73 20 62 65 69 6e  t of values bein
38d0: 67 20 65 78 74 72 61 63 74 65 64 20 2a 2f 0a 20  g extracted */. 
38e0: 20 69 6e 74 20 73 72 63 54 61 62 2c 20 20 20 20   int srcTab,    
38f0: 20 20 20 20 20 20 20 20 20 2f 2a 20 50 75 6c 6c           /* Pull
3900: 20 64 61 74 61 20 66 72 6f 6d 20 74 68 69 73 20   data from this 
3910: 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 6e  table */.  int n
3920: 43 6f 6c 75 6d 6e 2c 20 20 20 20 20 20 20 20 20  Column,         
3930: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
3940: 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20 73  columns in the s
3950: 6f 75 72 63 65 20 74 61 62 6c 65 20 2a 2f 0a 20  ource table */. 
3960: 20 45 78 70 72 4c 69 73 74 20 2a 70 4f 72 64 65   ExprList *pOrde
3970: 72 42 79 2c 20 20 20 20 20 2f 2a 20 49 66 20 6e  rBy,     /* If n
3980: 6f 74 20 4e 55 4c 4c 2c 20 73 6f 72 74 20 72 65  ot NULL, sort re
3990: 73 75 6c 74 73 20 75 73 69 6e 67 20 74 68 69 73  sults using this
39a0: 20 6b 65 79 20 2a 2f 0a 20 20 69 6e 74 20 64 69   key */.  int di
39b0: 73 74 69 6e 63 74 2c 20 20 20 20 20 20 20 20 20  stinct,         
39c0: 20 20 2f 2a 20 49 66 20 3e 3d 30 2c 20 6d 61 6b    /* If >=0, mak
39d0: 65 20 73 75 72 65 20 72 65 73 75 6c 74 73 20 61  e sure results a
39e0: 72 65 20 64 69 73 74 69 6e 63 74 20 2a 2f 0a 20  re distinct */. 
39f0: 20 69 6e 74 20 65 44 65 73 74 2c 20 20 20 20 20   int eDest,     
3a00: 20 20 20 20 20 20 20 20 20 2f 2a 20 48 6f 77 20           /* How 
3a10: 74 6f 20 64 69 73 70 6f 73 65 20 6f 66 20 74 68  to dispose of th
3a20: 65 20 72 65 73 75 6c 74 73 20 2a 2f 0a 20 20 69  e results */.  i
3a30: 6e 74 20 69 50 61 72 6d 2c 20 20 20 20 20 20 20  nt iParm,       
3a40: 20 20 20 20 20 20 20 2f 2a 20 41 6e 20 61 72 67         /* An arg
3a50: 75 6d 65 6e 74 20 74 6f 20 74 68 65 20 64 69 73  ument to the dis
3a60: 70 6f 73 61 6c 20 6d 65 74 68 6f 64 20 2a 2f 0a  posal method */.
3a70: 20 20 69 6e 74 20 69 43 6f 6e 74 69 6e 75 65 2c    int iContinue,
3a80: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4a 75 6d            /* Jum
3a90: 70 20 68 65 72 65 20 74 6f 20 63 6f 6e 74 69 6e  p here to contin
3aa0: 75 65 20 77 69 74 68 20 6e 65 78 74 20 72 6f 77  ue with next row
3ab0: 20 2a 2f 0a 20 20 69 6e 74 20 69 42 72 65 61 6b   */.  int iBreak
3ac0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ,             /*
3ad0: 20 4a 75 6d 70 20 68 65 72 65 20 74 6f 20 62 72   Jump here to br
3ae0: 65 61 6b 20 6f 75 74 20 6f 66 20 74 68 65 20 69  eak out of the i
3af0: 6e 6e 65 72 20 6c 6f 6f 70 20 2a 2f 0a 20 20 63  nner loop */.  c
3b00: 68 61 72 20 2a 61 66 66 20 20 20 20 20 20 20 20  har *aff        
3b10: 20 20 20 20 20 20 20 2f 2a 20 61 66 66 69 6e 69         /* affini
3b20: 74 79 20 73 74 72 69 6e 67 20 69 66 20 65 44 65  ty string if eDe
3b30: 73 74 20 69 73 20 53 52 54 5f 55 6e 69 6f 6e 20  st is SRT_Union 
3b40: 2a 2f 0a 29 7b 0a 20 20 56 64 62 65 20 2a 76 20  */.){.  Vdbe *v 
3b50: 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b  = pParse->pVdbe;
3b60: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20  .  int i;.  int 
3b70: 68 61 73 44 69 73 74 69 6e 63 74 3b 20 20 20 20  hasDistinct;    
3b80: 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 74      /* True if t
3b90: 68 65 20 44 49 53 54 49 4e 43 54 20 6b 65 79 77  he DISTINCT keyw
3ba0: 6f 72 64 20 69 73 20 70 72 65 73 65 6e 74 20 2a  ord is present *
3bb0: 2f 0a 0a 20 20 69 66 28 20 76 3d 3d 30 20 29 20  /..  if( v==0 ) 
3bc0: 72 65 74 75 72 6e 20 30 3b 0a 20 20 61 73 73 65  return 0;.  asse
3bd0: 72 74 28 20 70 45 4c 69 73 74 21 3d 30 20 29 3b  rt( pEList!=0 );
3be0: 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20  ..  /* If there 
3bf0: 77 61 73 20 61 20 4c 49 4d 49 54 20 63 6c 61 75  was a LIMIT clau
3c00: 73 65 20 6f 6e 20 74 68 65 20 53 45 4c 45 43 54  se on the SELECT
3c10: 20 73 74 61 74 65 6d 65 6e 74 2c 20 74 68 65 6e   statement, then
3c20: 20 64 6f 20 74 68 65 20 63 68 65 63 6b 0a 20 20   do the check.  
3c30: 2a 2a 20 74 6f 20 73 65 65 20 69 66 20 74 68 69  ** to see if thi
3c40: 73 20 72 6f 77 20 73 68 6f 75 6c 64 20 62 65 20  s row should be 
3c50: 6f 75 74 70 75 74 2e 0a 20 20 2a 2f 0a 20 20 68  output..  */.  h
3c60: 61 73 44 69 73 74 69 6e 63 74 20 3d 20 64 69 73  asDistinct = dis
3c70: 74 69 6e 63 74 3e 3d 30 20 26 26 20 70 45 4c 69  tinct>=0 && pELi
3c80: 73 74 2d 3e 6e 45 78 70 72 3e 30 3b 0a 20 20 69  st->nExpr>0;.  i
3c90: 66 28 20 70 4f 72 64 65 72 42 79 3d 3d 30 20 26  f( pOrderBy==0 &
3ca0: 26 20 21 68 61 73 44 69 73 74 69 6e 63 74 20 29  & !hasDistinct )
3cb0: 7b 0a 20 20 20 20 63 6f 64 65 4f 66 66 73 65 74  {.    codeOffset
3cc0: 28 76 2c 20 70 2c 20 69 43 6f 6e 74 69 6e 75 65  (v, p, iContinue
3cd0: 2c 20 30 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  , 0);.  }..  /* 
3ce0: 50 75 6c 6c 20 74 68 65 20 72 65 71 75 65 73 74  Pull the request
3cf0: 65 64 20 63 6f 6c 75 6d 6e 73 2e 0a 20 20 2a 2f  ed columns..  */
3d00: 0a 20 20 69 66 28 20 6e 43 6f 6c 75 6d 6e 3e 30  .  if( nColumn>0
3d10: 20 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b   ){.    for(i=0;
3d20: 20 69 3c 6e 43 6f 6c 75 6d 6e 3b 20 69 2b 2b 29   i<nColumn; i++)
3d30: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  {.      sqlite3V
3d40: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 43  dbeAddOp(v, OP_C
3d50: 6f 6c 75 6d 6e 2c 20 73 72 63 54 61 62 2c 20 69  olumn, srcTab, i
3d60: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65  );.    }.  }else
3d70: 7b 0a 20 20 20 20 6e 43 6f 6c 75 6d 6e 20 3d 20  {.    nColumn = 
3d80: 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 0a 20  pEList->nExpr;. 
3d90: 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f     sqlite3ExprCo
3da0: 64 65 45 78 70 72 4c 69 73 74 28 70 50 61 72 73  deExprList(pPars
3db0: 65 2c 20 70 45 4c 69 73 74 29 3b 0a 20 20 7d 0a  e, pEList);.  }.
3dc0: 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 44 49 53  .  /* If the DIS
3dd0: 54 49 4e 43 54 20 6b 65 79 77 6f 72 64 20 77 61  TINCT keyword wa
3de0: 73 20 70 72 65 73 65 6e 74 20 6f 6e 20 74 68 65  s present on the
3df0: 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
3e00: 74 0a 20 20 2a 2a 20 61 6e 64 20 74 68 69 73 20  t.  ** and this 
3e10: 72 6f 77 20 68 61 73 20 62 65 65 6e 20 73 65 65  row has been see
3e20: 6e 20 62 65 66 6f 72 65 2c 20 74 68 65 6e 20 64  n before, then d
3e30: 6f 20 6e 6f 74 20 6d 61 6b 65 20 74 68 69 73 20  o not make this 
3e40: 72 6f 77 0a 20 20 2a 2a 20 70 61 72 74 20 6f 66  row.  ** part of
3e50: 20 74 68 65 20 72 65 73 75 6c 74 2e 0a 20 20 2a   the result..  *
3e60: 2f 0a 20 20 69 66 28 20 68 61 73 44 69 73 74 69  /.  if( hasDisti
3e70: 6e 63 74 20 29 7b 0a 20 20 20 20 61 73 73 65 72  nct ){.    asser
3e80: 74 28 20 70 45 4c 69 73 74 21 3d 30 20 29 3b 0a  t( pEList!=0 );.
3e90: 20 20 20 20 61 73 73 65 72 74 28 20 70 45 4c 69      assert( pELi
3ea0: 73 74 2d 3e 6e 45 78 70 72 3d 3d 6e 43 6f 6c 75  st->nExpr==nColu
3eb0: 6d 6e 20 29 3b 0a 20 20 20 20 63 6f 64 65 44 69  mn );.    codeDi
3ec0: 73 74 69 6e 63 74 28 76 2c 20 64 69 73 74 69 6e  stinct(v, distin
3ed0: 63 74 2c 20 69 43 6f 6e 74 69 6e 75 65 2c 20 6e  ct, iContinue, n
3ee0: 43 6f 6c 75 6d 6e 29 3b 0a 20 20 20 20 69 66 28  Column);.    if(
3ef0: 20 70 4f 72 64 65 72 42 79 3d 3d 30 20 29 7b 0a   pOrderBy==0 ){.
3f00: 20 20 20 20 20 20 63 6f 64 65 4f 66 66 73 65 74        codeOffset
3f10: 28 76 2c 20 70 2c 20 69 43 6f 6e 74 69 6e 75 65  (v, p, iContinue
3f20: 2c 20 6e 43 6f 6c 75 6d 6e 29 3b 0a 20 20 20 20  , nColumn);.    
3f30: 7d 0a 20 20 7d 0a 0a 20 20 73 77 69 74 63 68 28  }.  }..  switch(
3f40: 20 65 44 65 73 74 20 29 7b 0a 20 20 20 20 2f 2a   eDest ){.    /*
3f50: 20 49 6e 20 74 68 69 73 20 6d 6f 64 65 2c 20 77   In this mode, w
3f60: 72 69 74 65 20 65 61 63 68 20 71 75 65 72 79 20  rite each query 
3f70: 72 65 73 75 6c 74 20 74 6f 20 74 68 65 20 6b 65  result to the ke
3f80: 79 20 6f 66 20 74 68 65 20 74 65 6d 70 6f 72 61  y of the tempora
3f90: 72 79 0a 20 20 20 20 2a 2a 20 74 61 62 6c 65 20  ry.    ** table 
3fa0: 69 50 61 72 6d 2e 0a 20 20 20 20 2a 2f 0a 23 69  iParm..    */.#i
3fb0: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
3fc0: 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45 43  T_COMPOUND_SELEC
3fd0: 54 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f 55  T.    case SRT_U
3fe0: 6e 69 6f 6e 3a 20 7b 0a 20 20 20 20 20 20 73 71  nion: {.      sq
3ff0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
4000: 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c  , OP_MakeRecord,
4010: 20 6e 43 6f 6c 75 6d 6e 2c 20 30 29 3b 0a 20 20   nColumn, 0);.  
4020: 20 20 20 20 69 66 28 20 61 66 66 20 29 7b 0a 20      if( aff ){. 
4030: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
4040: 62 65 43 68 61 6e 67 65 50 33 28 76 2c 20 2d 31  beChangeP3(v, -1
4050: 2c 20 61 66 66 2c 20 50 33 5f 53 54 41 54 49 43  , aff, P3_STATIC
4060: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
4070: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
4080: 70 28 76 2c 20 4f 50 5f 49 64 78 49 6e 73 65 72  p(v, OP_IdxInser
4090: 74 2c 20 69 50 61 72 6d 2c 20 30 29 3b 0a 20 20  t, iParm, 0);.  
40a0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
40b0: 0a 0a 20 20 20 20 2f 2a 20 43 6f 6e 73 74 72 75  ..    /* Constru
40c0: 63 74 20 61 20 72 65 63 6f 72 64 20 66 72 6f 6d  ct a record from
40d0: 20 74 68 65 20 71 75 65 72 79 20 72 65 73 75 6c   the query resul
40e0: 74 2c 20 62 75 74 20 69 6e 73 74 65 61 64 20 6f  t, but instead o
40f0: 66 0a 20 20 20 20 2a 2a 20 73 61 76 69 6e 67 20  f.    ** saving 
4100: 74 68 61 74 20 72 65 63 6f 72 64 2c 20 75 73 65  that record, use
4110: 20 69 74 20 61 73 20 61 20 6b 65 79 20 74 6f 20   it as a key to 
4120: 64 65 6c 65 74 65 20 65 6c 65 6d 65 6e 74 73 20  delete elements 
4130: 66 72 6f 6d 0a 20 20 20 20 2a 2a 20 74 68 65 20  from.    ** the 
4140: 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20  temporary table 
4150: 69 50 61 72 6d 2e 0a 20 20 20 20 2a 2f 0a 20 20  iParm..    */.  
4160: 20 20 63 61 73 65 20 53 52 54 5f 45 78 63 65 70    case SRT_Excep
4170: 74 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 61  t: {.      int a
4180: 64 64 72 3b 0a 20 20 20 20 20 20 61 64 64 72 20  ddr;.      addr 
4190: 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  = sqlite3VdbeAdd
41a0: 4f 70 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63  Op(v, OP_MakeRec
41b0: 6f 72 64 2c 20 6e 43 6f 6c 75 6d 6e 2c 20 30 29  ord, nColumn, 0)
41c0: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
41d0: 64 62 65 43 68 61 6e 67 65 50 33 28 76 2c 20 2d  dbeChangeP3(v, -
41e0: 31 2c 20 61 66 66 2c 20 50 33 5f 53 54 41 54 49  1, aff, P3_STATI
41f0: 43 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  C);.      sqlite
4200: 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
4210: 5f 4e 6f 74 46 6f 75 6e 64 2c 20 69 50 61 72 6d  _NotFound, iParm
4220: 2c 20 61 64 64 72 2b 33 29 3b 0a 20 20 20 20 20  , addr+3);.     
4230: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
4240: 70 28 76 2c 20 4f 50 5f 44 65 6c 65 74 65 2c 20  p(v, OP_Delete, 
4250: 69 50 61 72 6d 2c 20 30 29 3b 0a 20 20 20 20 20  iParm, 0);.     
4260: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65   break;.    }.#e
4270: 6e 64 69 66 0a 0a 20 20 20 20 2f 2a 20 53 74 6f  ndif..    /* Sto
4280: 72 65 20 74 68 65 20 72 65 73 75 6c 74 20 61 73  re the result as
4290: 20 64 61 74 61 20 75 73 69 6e 67 20 61 20 75 6e   data using a un
42a0: 69 71 75 65 20 6b 65 79 2e 0a 20 20 20 20 2a 2f  ique key..    */
42b0: 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f 54 61  .    case SRT_Ta
42c0: 62 6c 65 3a 0a 20 20 20 20 63 61 73 65 20 53 52  ble:.    case SR
42d0: 54 5f 45 70 68 65 6d 54 61 62 3a 20 7b 0a 20 20  T_EphemTab: {.  
42e0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
42f0: 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 61 6b 65 52  ddOp(v, OP_MakeR
4300: 65 63 6f 72 64 2c 20 6e 43 6f 6c 75 6d 6e 2c 20  ecord, nColumn, 
4310: 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4f  0);.      if( pO
4320: 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20 20 20  rderBy ){.      
4330: 20 20 70 75 73 68 4f 6e 74 6f 53 6f 72 74 65 72    pushOntoSorter
4340: 28 70 50 61 72 73 65 2c 20 70 4f 72 64 65 72 42  (pParse, pOrderB
4350: 79 2c 20 70 29 3b 0a 20 20 20 20 20 20 7d 65 6c  y, p);.      }el
4360: 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  se{.        sqli
4370: 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
4380: 4f 50 5f 4e 65 77 52 6f 77 69 64 2c 20 69 50 61  OP_NewRowid, iPa
4390: 72 6d 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20  rm, 0);.        
43a0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
43b0: 28 76 2c 20 4f 50 5f 50 75 6c 6c 2c 20 31 2c 20  (v, OP_Pull, 1, 
43c0: 30 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  0);.        sqli
43d0: 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
43e0: 4f 50 5f 49 6e 73 65 72 74 2c 20 69 50 61 72 6d  OP_Insert, iParm
43f0: 2c 20 4f 50 46 4c 41 47 5f 41 50 50 45 4e 44 29  , OPFLAG_APPEND)
4400: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
4410: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 23 69  break;.    }..#i
4420: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
4430: 54 5f 53 55 42 51 55 45 52 59 0a 20 20 20 20 2f  T_SUBQUERY.    /
4440: 2a 20 49 66 20 77 65 20 61 72 65 20 63 72 65 61  * If we are crea
4450: 74 69 6e 67 20 61 20 73 65 74 20 66 6f 72 20 61  ting a set for a
4460: 6e 20 22 65 78 70 72 20 49 4e 20 28 53 45 4c 45  n "expr IN (SELE
4470: 43 54 20 2e 2e 2e 29 22 20 63 6f 6e 73 74 72 75  CT ...)" constru
4480: 63 74 2c 0a 20 20 20 20 2a 2a 20 74 68 65 6e 20  ct,.    ** then 
4490: 74 68 65 72 65 20 73 68 6f 75 6c 64 20 62 65 20  there should be 
44a0: 61 20 73 69 6e 67 6c 65 20 69 74 65 6d 20 6f 6e  a single item on
44b0: 20 74 68 65 20 73 74 61 63 6b 2e 20 20 57 72 69   the stack.  Wri
44c0: 74 65 20 74 68 69 73 0a 20 20 20 20 2a 2a 20 69  te this.    ** i
44d0: 74 65 6d 20 69 6e 74 6f 20 74 68 65 20 73 65 74  tem into the set
44e0: 20 74 61 62 6c 65 20 77 69 74 68 20 62 6f 67 75   table with bogu
44f0: 73 20 64 61 74 61 2e 0a 20 20 20 20 2a 2f 0a 20  s data..    */. 
4500: 20 20 20 63 61 73 65 20 53 52 54 5f 53 65 74 3a     case SRT_Set:
4510: 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 61 64 64   {.      int add
4520: 72 31 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  r1 = sqlite3Vdbe
4530: 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b 0a  CurrentAddr(v);.
4540: 20 20 20 20 20 20 69 6e 74 20 61 64 64 72 32 3b        int addr2;
4550: 0a 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ..      assert( 
4560: 6e 43 6f 6c 75 6d 6e 3d 3d 31 20 29 3b 0a 20 20  nColumn==1 );.  
4570: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
4580: 64 64 4f 70 28 76 2c 20 4f 50 5f 4e 6f 74 4e 75  ddOp(v, OP_NotNu
4590: 6c 6c 2c 20 2d 31 2c 20 61 64 64 72 31 2b 33 29  ll, -1, addr1+3)
45a0: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
45b0: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 50  dbeAddOp(v, OP_P
45c0: 6f 70 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20 20  op, 1, 0);.     
45d0: 20 61 64 64 72 32 20 3d 20 73 71 6c 69 74 65 33   addr2 = sqlite3
45e0: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
45f0: 47 6f 74 6f 2c 20 30 2c 20 30 29 3b 0a 20 20 20  Goto, 0, 0);.   
4600: 20 20 20 70 2d 3e 61 66 66 69 6e 69 74 79 20 3d     p->affinity =
4610: 20 73 71 6c 69 74 65 33 43 6f 6d 70 61 72 65 41   sqlite3CompareA
4620: 66 66 69 6e 69 74 79 28 70 45 4c 69 73 74 2d 3e  ffinity(pEList->
4630: 61 5b 30 5d 2e 70 45 78 70 72 2c 28 69 50 61 72  a[0].pExpr,(iPar
4640: 6d 3e 3e 31 36 29 26 30 78 66 66 29 3b 0a 20 20  m>>16)&0xff);.  
4650: 20 20 20 20 69 66 28 20 70 4f 72 64 65 72 42 79      if( pOrderBy
4660: 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 41   ){.        /* A
4670: 74 20 66 69 72 73 74 20 67 6c 61 6e 63 65 20 79  t first glance y
4680: 6f 75 20 77 6f 75 6c 64 20 74 68 69 6e 6b 20 77  ou would think w
4690: 65 20 63 6f 75 6c 64 20 6f 70 74 69 6d 69 7a 65  e could optimize
46a0: 20 6f 75 74 20 74 68 65 0a 20 20 20 20 20 20 20   out the.       
46b0: 20 2a 2a 20 4f 52 44 45 52 20 42 59 20 69 6e 20   ** ORDER BY in 
46c0: 74 68 69 73 20 63 61 73 65 20 73 69 6e 63 65 20  this case since 
46d0: 74 68 65 20 6f 72 64 65 72 20 6f 66 20 65 6e 74  the order of ent
46e0: 72 69 65 73 20 69 6e 20 74 68 65 20 73 65 74 0a  ries in the set.
46f0: 20 20 20 20 20 20 20 20 2a 2a 20 64 6f 65 73 20          ** does 
4700: 6e 6f 74 20 6d 61 74 74 65 72 2e 20 20 42 75 74  not matter.  But
4710: 20 74 68 65 72 65 20 6d 69 67 68 74 20 62 65 20   there might be 
4720: 61 20 4c 49 4d 49 54 20 63 6c 61 75 73 65 2c 20  a LIMIT clause, 
4730: 69 6e 20 77 68 69 63 68 0a 20 20 20 20 20 20 20  in which.       
4740: 20 2a 2a 20 63 61 73 65 20 74 68 65 20 6f 72 64   ** case the ord
4750: 65 72 20 64 6f 65 73 20 6d 61 74 74 65 72 20 2a  er does matter *
4760: 2f 0a 20 20 20 20 20 20 20 20 70 75 73 68 4f 6e  /.        pushOn
4770: 74 6f 53 6f 72 74 65 72 28 70 50 61 72 73 65 2c  toSorter(pParse,
4780: 20 70 4f 72 64 65 72 42 79 2c 20 70 29 3b 0a 20   pOrderBy, p);. 
4790: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
47a0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4f      sqlite3VdbeO
47b0: 70 33 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63  p3(v, OP_MakeRec
47c0: 6f 72 64 2c 20 31 2c 20 30 2c 20 26 70 2d 3e 61  ord, 1, 0, &p->a
47d0: 66 66 69 6e 69 74 79 2c 20 31 29 3b 0a 20 20 20  ffinity, 1);.   
47e0: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
47f0: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49 64 78 49  AddOp(v, OP_IdxI
4800: 6e 73 65 72 74 2c 20 28 69 50 61 72 6d 26 30 78  nsert, (iParm&0x
4810: 30 30 30 30 46 46 46 46 29 2c 20 30 29 3b 0a 20  0000FFFF), 0);. 
4820: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c       }.      sql
4830: 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65  ite3VdbeJumpHere
4840: 28 76 2c 20 61 64 64 72 32 29 3b 0a 20 20 20 20  (v, addr2);.    
4850: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a    break;.    }..
4860: 20 20 20 20 2f 2a 20 49 66 20 61 6e 79 20 72 6f      /* If any ro
4870: 77 20 65 78 69 73 74 20 69 6e 20 74 68 65 20 72  w exist in the r
4880: 65 73 75 6c 74 20 73 65 74 2c 20 72 65 63 6f 72  esult set, recor
4890: 64 20 74 68 61 74 20 66 61 63 74 20 61 6e 64 20  d that fact and 
48a0: 61 62 6f 72 74 2e 0a 20 20 20 20 2a 2f 0a 20 20  abort..    */.  
48b0: 20 20 63 61 73 65 20 53 52 54 5f 45 78 69 73 74    case SRT_Exist
48c0: 73 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  s: {.      sqlit
48d0: 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
48e0: 50 5f 4d 65 6d 49 6e 74 2c 20 31 2c 20 69 50 61  P_MemInt, 1, iPa
48f0: 72 6d 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  rm);.      sqlit
4900: 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
4910: 50 5f 50 6f 70 2c 20 6e 43 6f 6c 75 6d 6e 2c 20  P_Pop, nColumn, 
4920: 30 29 3b 0a 20 20 20 20 20 20 2f 2a 20 54 68 65  0);.      /* The
4930: 20 4c 49 4d 49 54 20 63 6c 61 75 73 65 20 77 69   LIMIT clause wi
4940: 6c 6c 20 74 65 72 6d 69 6e 61 74 65 20 74 68 65  ll terminate the
4950: 20 6c 6f 6f 70 20 66 6f 72 20 75 73 20 2a 2f 0a   loop for us */.
4960: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
4970: 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68   }..    /* If th
4980: 69 73 20 69 73 20 61 20 73 63 61 6c 61 72 20 73  is is a scalar s
4990: 65 6c 65 63 74 20 74 68 61 74 20 69 73 20 70 61  elect that is pa
49a0: 72 74 20 6f 66 20 61 6e 20 65 78 70 72 65 73 73  rt of an express
49b0: 69 6f 6e 2c 20 74 68 65 6e 0a 20 20 20 20 2a 2a  ion, then.    **
49c0: 20 73 74 6f 72 65 20 74 68 65 20 72 65 73 75 6c   store the resul
49d0: 74 73 20 69 6e 20 74 68 65 20 61 70 70 72 6f 70  ts in the approp
49e0: 72 69 61 74 65 20 6d 65 6d 6f 72 79 20 63 65 6c  riate memory cel
49f0: 6c 20 61 6e 64 20 62 72 65 61 6b 20 6f 75 74 0a  l and break out.
4a00: 20 20 20 20 2a 2a 20 6f 66 20 74 68 65 20 73 63      ** of the sc
4a10: 61 6e 20 6c 6f 6f 70 2e 0a 20 20 20 20 2a 2f 0a  an loop..    */.
4a20: 20 20 20 20 63 61 73 65 20 53 52 54 5f 4d 65 6d      case SRT_Mem
4a30: 3a 20 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74  : {.      assert
4a40: 28 20 6e 43 6f 6c 75 6d 6e 3d 3d 31 20 29 3b 0a  ( nColumn==1 );.
4a50: 20 20 20 20 20 20 69 66 28 20 70 4f 72 64 65 72        if( pOrder
4a60: 42 79 20 29 7b 0a 20 20 20 20 20 20 20 20 70 75  By ){.        pu
4a70: 73 68 4f 6e 74 6f 53 6f 72 74 65 72 28 70 50 61  shOntoSorter(pPa
4a80: 72 73 65 2c 20 70 4f 72 64 65 72 42 79 2c 20 70  rse, pOrderBy, p
4a90: 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
4aa0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
4ab0: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d  dbeAddOp(v, OP_M
4ac0: 65 6d 53 74 6f 72 65 2c 20 69 50 61 72 6d 2c 20  emStore, iParm, 
4ad0: 31 29 3b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54  1);.        /* T
4ae0: 68 65 20 4c 49 4d 49 54 20 63 6c 61 75 73 65 20  he LIMIT clause 
4af0: 77 69 6c 6c 20 6a 75 6d 70 20 6f 75 74 20 6f 66  will jump out of
4b00: 20 74 68 65 20 6c 6f 6f 70 20 66 6f 72 20 75 73   the loop for us
4b10: 20 2a 2f 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   */.      }.    
4b20: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23    break;.    }.#
4b30: 65 6e 64 69 66 20 2f 2a 20 23 69 66 6e 64 65 66  endif /* #ifndef
4b40: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42   SQLITE_OMIT_SUB
4b50: 51 55 45 52 59 20 2a 2f 0a 0a 20 20 20 20 2f 2a  QUERY */..    /*
4b60: 20 53 65 6e 64 20 74 68 65 20 64 61 74 61 20 74   Send the data t
4b70: 6f 20 74 68 65 20 63 61 6c 6c 62 61 63 6b 20 66  o the callback f
4b80: 75 6e 63 74 69 6f 6e 20 6f 72 20 74 6f 20 61 20  unction or to a 
4b90: 73 75 62 72 6f 75 74 69 6e 65 2e 20 20 49 6e 20  subroutine.  In 
4ba0: 74 68 65 0a 20 20 20 20 2a 2a 20 63 61 73 65 20  the.    ** case 
4bb0: 6f 66 20 61 20 73 75 62 72 6f 75 74 69 6e 65 2c  of a subroutine,
4bc0: 20 74 68 65 20 73 75 62 72 6f 75 74 69 6e 65 20   the subroutine 
4bd0: 69 74 73 65 6c 66 20 69 73 20 72 65 73 70 6f 6e  itself is respon
4be0: 73 69 62 6c 65 20 66 6f 72 0a 20 20 20 20 2a 2a  sible for.    **
4bf0: 20 70 6f 70 70 69 6e 67 20 74 68 65 20 64 61 74   popping the dat
4c00: 61 20 66 72 6f 6d 20 74 68 65 20 73 74 61 63 6b  a from the stack
4c10: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73  ..    */.    cas
4c20: 65 20 53 52 54 5f 53 75 62 72 6f 75 74 69 6e 65  e SRT_Subroutine
4c30: 3a 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f 43  :.    case SRT_C
4c40: 61 6c 6c 62 61 63 6b 3a 20 7b 0a 20 20 20 20 20  allback: {.     
4c50: 20 69 66 28 20 70 4f 72 64 65 72 42 79 20 29 7b   if( pOrderBy ){
4c60: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
4c70: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
4c80: 4d 61 6b 65 52 65 63 6f 72 64 2c 20 6e 43 6f 6c  MakeRecord, nCol
4c90: 75 6d 6e 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  umn, 0);.       
4ca0: 20 70 75 73 68 4f 6e 74 6f 53 6f 72 74 65 72 28   pushOntoSorter(
4cb0: 70 50 61 72 73 65 2c 20 70 4f 72 64 65 72 42 79  pParse, pOrderBy
4cc0: 2c 20 70 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  , p);.      }els
4cd0: 65 20 69 66 28 20 65 44 65 73 74 3d 3d 53 52 54  e if( eDest==SRT
4ce0: 5f 53 75 62 72 6f 75 74 69 6e 65 20 29 7b 0a 20  _Subroutine ){. 
4cf0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
4d00: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 47 6f  beAddOp(v, OP_Go
4d10: 73 75 62 2c 20 30 2c 20 69 50 61 72 6d 29 3b 0a  sub, 0, iParm);.
4d20: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
4d30: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
4d40: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 43 61 6c 6c  AddOp(v, OP_Call
4d50: 62 61 63 6b 2c 20 6e 43 6f 6c 75 6d 6e 2c 20 30  back, nColumn, 0
4d60: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
4d70: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 23   break;.    }..#
4d80: 69 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  if !defined(SQLI
4d90: 54 45 5f 4f 4d 49 54 5f 54 52 49 47 47 45 52 29  TE_OMIT_TRIGGER)
4da0: 0a 20 20 20 20 2f 2a 20 44 69 73 63 61 72 64 20  .    /* Discard 
4db0: 74 68 65 20 72 65 73 75 6c 74 73 2e 20 20 54 68  the results.  Th
4dc0: 69 73 20 69 73 20 75 73 65 64 20 66 6f 72 20 53  is is used for S
4dd0: 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 73  ELECT statements
4de0: 20 69 6e 73 69 64 65 0a 20 20 20 20 2a 2a 20 74   inside.    ** t
4df0: 68 65 20 62 6f 64 79 20 6f 66 20 61 20 54 52 49  he body of a TRI
4e00: 47 47 45 52 2e 20 20 54 68 65 20 70 75 72 70 6f  GGER.  The purpo
4e10: 73 65 20 6f 66 20 73 75 63 68 20 73 65 6c 65 63  se of such selec
4e20: 74 73 20 69 73 20 74 6f 20 63 61 6c 6c 0a 20 20  ts is to call.  
4e30: 20 20 2a 2a 20 75 73 65 72 2d 64 65 66 69 6e 65    ** user-define
4e40: 64 20 66 75 6e 63 74 69 6f 6e 73 20 74 68 61 74  d functions that
4e50: 20 68 61 76 65 20 73 69 64 65 20 65 66 66 65 63   have side effec
4e60: 74 73 2e 20 20 57 65 20 64 6f 20 6e 6f 74 20 63  ts.  We do not c
4e70: 61 72 65 0a 20 20 20 20 2a 2a 20 61 62 6f 75 74  are.    ** about
4e80: 20 74 68 65 20 61 63 74 75 61 6c 20 72 65 73 75   the actual resu
4e90: 6c 74 73 20 6f 66 20 74 68 65 20 73 65 6c 65 63  lts of the selec
4ea0: 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 64 65  t..    */.    de
4eb0: 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20 20 20 61  fault: {.      a
4ec0: 73 73 65 72 74 28 20 65 44 65 73 74 3d 3d 53 52  ssert( eDest==SR
4ed0: 54 5f 44 69 73 63 61 72 64 20 29 3b 0a 20 20 20  T_Discard );.   
4ee0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
4ef0: 64 4f 70 28 76 2c 20 4f 50 5f 50 6f 70 2c 20 6e  dOp(v, OP_Pop, n
4f00: 43 6f 6c 75 6d 6e 2c 20 30 29 3b 0a 20 20 20 20  Column, 0);.    
4f10: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23    break;.    }.#
4f20: 65 6e 64 69 66 0a 20 20 7d 0a 0a 20 20 2f 2a 20  endif.  }..  /* 
4f30: 4a 75 6d 70 20 74 6f 20 74 68 65 20 65 6e 64 20  Jump to the end 
4f40: 6f 66 20 74 68 65 20 6c 6f 6f 70 20 69 66 20 74  of the loop if t
4f50: 68 65 20 4c 49 4d 49 54 20 69 73 20 72 65 61 63  he LIMIT is reac
4f60: 68 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  hed..  */.  if( 
4f70: 70 2d 3e 69 4c 69 6d 69 74 3e 3d 30 20 26 26 20  p->iLimit>=0 && 
4f80: 70 4f 72 64 65 72 42 79 3d 3d 30 20 29 7b 0a 20  pOrderBy==0 ){. 
4f90: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
4fa0: 64 4f 70 28 76 2c 20 4f 50 5f 4d 65 6d 49 6e 63  dOp(v, OP_MemInc
4fb0: 72 2c 20 2d 31 2c 20 70 2d 3e 69 4c 69 6d 69 74  r, -1, p->iLimit
4fc0: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
4fd0: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49 66  beAddOp(v, OP_If
4fe0: 4d 65 6d 5a 65 72 6f 2c 20 70 2d 3e 69 4c 69 6d  MemZero, p->iLim
4ff0: 69 74 2c 20 69 42 72 65 61 6b 29 3b 0a 20 20 7d  it, iBreak);.  }
5000: 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a  .  return 0;.}..
5010: 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20 61 6e 20 65  /*.** Given an e
5020: 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 2c 20  xpression list, 
5030: 67 65 6e 65 72 61 74 65 20 61 20 4b 65 79 49 6e  generate a KeyIn
5040: 66 6f 20 73 74 72 75 63 74 75 72 65 20 74 68 61  fo structure tha
5050: 74 20 72 65 63 6f 72 64 73 0a 2a 2a 20 74 68 65  t records.** the
5060: 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65   collating seque
5070: 6e 63 65 20 66 6f 72 20 65 61 63 68 20 65 78 70  nce for each exp
5080: 72 65 73 73 69 6f 6e 20 69 6e 20 74 68 61 74 20  ression in that 
5090: 65 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 2e  expression list.
50a0: 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 45 78  .**.** If the Ex
50b0: 70 72 4c 69 73 74 20 69 73 20 61 6e 20 4f 52 44  prList is an ORD
50c0: 45 52 20 42 59 20 6f 72 20 47 52 4f 55 50 20 42  ER BY or GROUP B
50d0: 59 20 63 6c 61 75 73 65 20 74 68 65 6e 20 74 68  Y clause then th
50e0: 65 20 72 65 73 75 6c 74 69 6e 67 0a 2a 2a 20 4b  e resulting.** K
50f0: 65 79 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65  eyInfo structure
5100: 20 69 73 20 61 70 70 72 6f 70 72 69 61 74 65 20   is appropriate 
5110: 66 6f 72 20 69 6e 69 74 69 61 6c 69 7a 69 6e 67  for initializing
5120: 20 61 20 76 69 72 74 75 61 6c 20 69 6e 64 65 78   a virtual index
5130: 20 74 6f 0a 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74   to.** implement
5140: 20 74 68 61 74 20 63 6c 61 75 73 65 2e 20 20 49   that clause.  I
5150: 66 20 74 68 65 20 45 78 70 72 4c 69 73 74 20 69  f the ExprList i
5160: 73 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74  s the result set
5170: 20 6f 66 20 61 20 53 45 4c 45 43 54 0a 2a 2a 20   of a SELECT.** 
5180: 74 68 65 6e 20 74 68 65 20 4b 65 79 49 6e 66 6f  then the KeyInfo
5190: 20 73 74 72 75 63 74 75 72 65 20 69 73 20 61 70   structure is ap
51a0: 70 72 6f 70 72 69 61 74 65 20 66 6f 72 20 69 6e  propriate for in
51b0: 69 74 69 61 6c 69 7a 69 6e 67 20 61 20 76 69 72  itializing a vir
51c0: 74 75 61 6c 0a 2a 2a 20 69 6e 64 65 78 20 74 6f  tual.** index to
51d0: 20 69 6d 70 6c 65 6d 65 6e 74 20 61 20 44 49 53   implement a DIS
51e0: 54 49 4e 43 54 20 74 65 73 74 2e 0a 2a 2a 0a 2a  TINCT test..**.*
51f0: 2a 20 53 70 61 63 65 20 74 6f 20 68 6f 6c 64 20  * Space to hold 
5200: 74 68 65 20 4b 65 79 49 6e 66 6f 20 73 74 72 75  the KeyInfo stru
5210: 63 74 75 72 65 20 69 73 20 6f 62 74 61 69 6e 20  cture is obtain 
5220: 66 72 6f 6d 20 6d 61 6c 6c 6f 63 2e 20 20 54 68  from malloc.  Th
5230: 65 20 63 61 6c 6c 69 6e 67 0a 2a 2a 20 66 75 6e  e calling.** fun
5240: 63 74 69 6f 6e 20 69 73 20 72 65 73 70 6f 6e 73  ction is respons
5250: 69 62 6c 65 20 66 6f 72 20 73 65 65 69 6e 67 20  ible for seeing 
5260: 74 68 61 74 20 74 68 69 73 20 73 74 72 75 63 74  that this struct
5270: 75 72 65 20 69 73 20 65 76 65 6e 74 75 61 6c 6c  ure is eventuall
5280: 79 0a 2a 2a 20 66 72 65 65 64 2e 20 20 41 64 64  y.** freed.  Add
5290: 20 74 68 65 20 4b 65 79 49 6e 66 6f 20 73 74 72   the KeyInfo str
52a0: 75 63 74 75 72 65 20 74 6f 20 74 68 65 20 50 33  ucture to the P3
52b0: 20 66 69 65 6c 64 20 6f 66 20 61 6e 20 6f 70 63   field of an opc
52c0: 6f 64 65 20 75 73 69 6e 67 0a 2a 2a 20 50 33 5f  ode using.** P3_
52d0: 4b 45 59 49 4e 46 4f 5f 48 41 4e 44 4f 46 46 20  KEYINFO_HANDOFF 
52e0: 69 73 20 74 68 65 20 75 73 75 61 6c 20 77 61 79  is the usual way
52f0: 20 6f 66 20 64 65 61 6c 69 6e 67 20 77 69 74 68   of dealing with
5300: 20 74 68 69 73 2e 0a 2a 2f 0a 73 74 61 74 69 63   this..*/.static
5310: 20 4b 65 79 49 6e 66 6f 20 2a 6b 65 79 49 6e 66   KeyInfo *keyInf
5320: 6f 46 72 6f 6d 45 78 70 72 4c 69 73 74 28 50 61  oFromExprList(Pa
5330: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70  rse *pParse, Exp
5340: 72 4c 69 73 74 20 2a 70 4c 69 73 74 29 7b 0a 20  rList *pList){. 
5350: 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70   sqlite3 *db = p
5360: 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 69 6e 74  Parse->db;.  int
5370: 20 6e 45 78 70 72 3b 0a 20 20 4b 65 79 49 6e 66   nExpr;.  KeyInf
5380: 6f 20 2a 70 49 6e 66 6f 3b 0a 20 20 73 74 72 75  o *pInfo;.  stru
5390: 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d  ct ExprList_item
53a0: 20 2a 70 49 74 65 6d 3b 0a 20 20 69 6e 74 20 69   *pItem;.  int i
53b0: 3b 0a 0a 20 20 6e 45 78 70 72 20 3d 20 70 4c 69  ;..  nExpr = pLi
53c0: 73 74 2d 3e 6e 45 78 70 72 3b 0a 20 20 70 49 6e  st->nExpr;.  pIn
53d0: 66 6f 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f  fo = sqliteMallo
53e0: 63 28 20 73 69 7a 65 6f 66 28 2a 70 49 6e 66 6f  c( sizeof(*pInfo
53f0: 29 20 2b 20 6e 45 78 70 72 2a 28 73 69 7a 65 6f  ) + nExpr*(sizeo
5400: 66 28 43 6f 6c 6c 53 65 71 2a 29 2b 31 29 20 29  f(CollSeq*)+1) )
5410: 3b 0a 20 20 69 66 28 20 70 49 6e 66 6f 20 29 7b  ;.  if( pInfo ){
5420: 0a 20 20 20 20 70 49 6e 66 6f 2d 3e 61 53 6f 72  .    pInfo->aSor
5430: 74 4f 72 64 65 72 20 3d 20 28 75 38 2a 29 26 70  tOrder = (u8*)&p
5440: 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b 6e 45 78 70  Info->aColl[nExp
5450: 72 5d 3b 0a 20 20 20 20 70 49 6e 66 6f 2d 3e 6e  r];.    pInfo->n
5460: 46 69 65 6c 64 20 3d 20 6e 45 78 70 72 3b 0a 20  Field = nExpr;. 
5470: 20 20 20 70 49 6e 66 6f 2d 3e 65 6e 63 20 3d 20     pInfo->enc = 
5480: 45 4e 43 28 64 62 29 3b 0a 20 20 20 20 66 6f 72  ENC(db);.    for
5490: 28 69 3d 30 2c 20 70 49 74 65 6d 3d 70 4c 69 73  (i=0, pItem=pLis
54a0: 74 2d 3e 61 3b 20 69 3c 6e 45 78 70 72 3b 20 69  t->a; i<nExpr; i
54b0: 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20  ++, pItem++){.  
54c0: 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f      CollSeq *pCo
54d0: 6c 6c 3b 0a 20 20 20 20 20 20 70 43 6f 6c 6c 20  ll;.      pColl 
54e0: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6c  = sqlite3ExprCol
54f0: 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70 49 74  lSeq(pParse, pIt
5500: 65 6d 2d 3e 70 45 78 70 72 29 3b 0a 20 20 20 20  em->pExpr);.    
5510: 20 20 69 66 28 20 21 70 43 6f 6c 6c 20 29 7b 0a    if( !pColl ){.
5520: 20 20 20 20 20 20 20 20 70 43 6f 6c 6c 20 3d 20          pColl = 
5530: 64 62 2d 3e 70 44 66 6c 74 43 6f 6c 6c 3b 0a 20  db->pDfltColl;. 
5540: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 49 6e       }.      pIn
5550: 66 6f 2d 3e 61 43 6f 6c 6c 5b 69 5d 20 3d 20 70  fo->aColl[i] = p
5560: 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 70 49 6e 66  Coll;.      pInf
5570: 6f 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b 69 5d  o->aSortOrder[i]
5580: 20 3d 20 70 49 74 65 6d 2d 3e 73 6f 72 74 4f 72   = pItem->sortOr
5590: 64 65 72 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  der;.    }.  }. 
55a0: 20 72 65 74 75 72 6e 20 70 49 6e 66 6f 3b 0a 7d   return pInfo;.}
55b0: 0a 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20  .../*.** If the 
55c0: 69 6e 6e 65 72 20 6c 6f 6f 70 20 77 61 73 20 67  inner loop was g
55d0: 65 6e 65 72 61 74 65 64 20 75 73 69 6e 67 20 61  enerated using a
55e0: 20 6e 6f 6e 2d 6e 75 6c 6c 20 70 4f 72 64 65 72   non-null pOrder
55f0: 42 79 20 61 72 67 75 6d 65 6e 74 2c 0a 2a 2a 20  By argument,.** 
5600: 74 68 65 6e 20 74 68 65 20 72 65 73 75 6c 74 73  then the results
5610: 20 77 65 72 65 20 70 6c 61 63 65 64 20 69 6e 20   were placed in 
5620: 61 20 73 6f 72 74 65 72 2e 20 20 41 66 74 65 72  a sorter.  After
5630: 20 74 68 65 20 6c 6f 6f 70 20 69 73 20 74 65 72   the loop is ter
5640: 6d 69 6e 61 74 65 64 0a 2a 2a 20 77 65 20 6e 65  minated.** we ne
5650: 65 64 20 74 6f 20 72 75 6e 20 74 68 65 20 73 6f  ed to run the so
5660: 72 74 65 72 20 61 6e 64 20 6f 75 74 70 75 74 20  rter and output 
5670: 74 68 65 20 72 65 73 75 6c 74 73 2e 20 20 54 68  the results.  Th
5680: 65 20 66 6f 6c 6c 6f 77 69 6e 67 0a 2a 2a 20 72  e following.** r
5690: 6f 75 74 69 6e 65 20 67 65 6e 65 72 61 74 65 73  outine generates
56a0: 20 74 68 65 20 63 6f 64 65 20 6e 65 65 64 65 64   the code needed
56b0: 20 74 6f 20 64 6f 20 74 68 61 74 2e 0a 2a 2f 0a   to do that..*/.
56c0: 73 74 61 74 69 63 20 76 6f 69 64 20 67 65 6e 65  static void gene
56d0: 72 61 74 65 53 6f 72 74 54 61 69 6c 28 0a 20 20  rateSortTail(.  
56e0: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
56f0: 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74   /* Parsing cont
5700: 65 78 74 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20  ext */.  Select 
5710: 2a 70 2c 20 20 20 20 20 20 20 2f 2a 20 54 68 65  *p,       /* The
5720: 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
5730: 74 20 2a 2f 0a 20 20 56 64 62 65 20 2a 76 2c 20  t */.  Vdbe *v, 
5740: 20 20 20 20 20 20 20 20 2f 2a 20 47 65 6e 65 72          /* Gener
5750: 61 74 65 20 63 6f 64 65 20 69 6e 74 6f 20 74 68  ate code into th
5760: 69 73 20 56 44 42 45 20 2a 2f 0a 20 20 69 6e 74  is VDBE */.  int
5770: 20 6e 43 6f 6c 75 6d 6e 2c 20 20 20 20 20 2f 2a   nColumn,     /*
5780: 20 4e 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d   Number of colum
5790: 6e 73 20 6f 66 20 64 61 74 61 20 2a 2f 0a 20 20  ns of data */.  
57a0: 69 6e 74 20 65 44 65 73 74 2c 20 20 20 20 20 20  int eDest,      
57b0: 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20 73 6f   /* Write the so
57c0: 72 74 65 64 20 72 65 73 75 6c 74 73 20 68 65 72  rted results her
57d0: 65 20 2a 2f 0a 20 20 69 6e 74 20 69 50 61 72 6d  e */.  int iParm
57e0: 20 20 20 20 20 20 20 20 2f 2a 20 4f 70 74 69 6f          /* Optio
57f0: 6e 61 6c 20 70 61 72 61 6d 65 74 65 72 20 61 73  nal parameter as
5800: 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 65 44  sociated with eD
5810: 65 73 74 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  est */.){.  int 
5820: 62 72 6b 20 3d 20 73 71 6c 69 74 65 33 56 64 62  brk = sqlite3Vdb
5830: 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20  eMakeLabel(v);. 
5840: 20 69 6e 74 20 63 6f 6e 74 20 3d 20 73 71 6c 69   int cont = sqli
5850: 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c  te3VdbeMakeLabel
5860: 28 76 29 3b 0a 20 20 69 6e 74 20 61 64 64 72 3b  (v);.  int addr;
5870: 0a 20 20 69 6e 74 20 69 54 61 62 3b 0a 20 20 69  .  int iTab;.  i
5880: 6e 74 20 70 73 65 75 64 6f 54 61 62 20 3d 20 30  nt pseudoTab = 0
5890: 3b 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4f  ;.  ExprList *pO
58a0: 72 64 65 72 42 79 20 3d 20 70 2d 3e 70 4f 72 64  rderBy = p->pOrd
58b0: 65 72 42 79 3b 0a 0a 20 20 69 54 61 62 20 3d 20  erBy;..  iTab = 
58c0: 70 4f 72 64 65 72 42 79 2d 3e 69 45 43 75 72 73  pOrderBy->iECurs
58d0: 6f 72 3b 0a 20 20 69 66 28 20 65 44 65 73 74 3d  or;.  if( eDest=
58e0: 3d 53 52 54 5f 43 61 6c 6c 62 61 63 6b 20 7c 7c  =SRT_Callback ||
58f0: 20 65 44 65 73 74 3d 3d 53 52 54 5f 53 75 62 72   eDest==SRT_Subr
5900: 6f 75 74 69 6e 65 20 29 7b 0a 20 20 20 20 70 73  outine ){.    ps
5910: 65 75 64 6f 54 61 62 20 3d 20 70 50 61 72 73 65  eudoTab = pParse
5920: 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20 73 71  ->nTab++;.    sq
5930: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
5940: 2c 20 4f 50 5f 4f 70 65 6e 50 73 65 75 64 6f 2c  , OP_OpenPseudo,
5950: 20 70 73 65 75 64 6f 54 61 62 2c 20 30 29 3b 0a   pseudoTab, 0);.
5960: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
5970: 64 64 4f 70 28 76 2c 20 4f 50 5f 53 65 74 4e 75  ddOp(v, OP_SetNu
5980: 6d 43 6f 6c 75 6d 6e 73 2c 20 70 73 65 75 64 6f  mColumns, pseudo
5990: 54 61 62 2c 20 6e 43 6f 6c 75 6d 6e 29 3b 0a 20  Tab, nColumn);. 
59a0: 20 7d 0a 20 20 61 64 64 72 20 3d 20 31 20 2b 20   }.  addr = 1 + 
59b0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
59c0: 28 76 2c 20 4f 50 5f 53 6f 72 74 2c 20 69 54 61  (v, OP_Sort, iTa
59d0: 62 2c 20 62 72 6b 29 3b 0a 20 20 63 6f 64 65 4f  b, brk);.  codeO
59e0: 66 66 73 65 74 28 76 2c 20 70 2c 20 63 6f 6e 74  ffset(v, p, cont
59f0: 2c 20 30 29 3b 0a 20 20 69 66 28 20 65 44 65 73  , 0);.  if( eDes
5a00: 74 3d 3d 53 52 54 5f 43 61 6c 6c 62 61 63 6b 20  t==SRT_Callback 
5a10: 7c 7c 20 65 44 65 73 74 3d 3d 53 52 54 5f 53 75  || eDest==SRT_Su
5a20: 62 72 6f 75 74 69 6e 65 20 29 7b 0a 20 20 20 20  broutine ){.    
5a30: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
5a40: 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20  (v, OP_Integer, 
5a50: 31 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 73 71 6c  1, 0);.  }.  sql
5a60: 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
5a70: 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 69 54 61 62   OP_Column, iTab
5a80: 2c 20 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70  , pOrderBy->nExp
5a90: 72 20 2b 20 31 29 3b 0a 20 20 73 77 69 74 63 68  r + 1);.  switch
5aa0: 28 20 65 44 65 73 74 20 29 7b 0a 20 20 20 20 63  ( eDest ){.    c
5ab0: 61 73 65 20 53 52 54 5f 54 61 62 6c 65 3a 0a 20  ase SRT_Table:. 
5ac0: 20 20 20 63 61 73 65 20 53 52 54 5f 45 70 68 65     case SRT_Ephe
5ad0: 6d 54 61 62 3a 20 7b 0a 20 20 20 20 20 20 73 71  mTab: {.      sq
5ae0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
5af0: 2c 20 4f 50 5f 4e 65 77 52 6f 77 69 64 2c 20 69  , OP_NewRowid, i
5b00: 50 61 72 6d 2c 20 30 29 3b 0a 20 20 20 20 20 20  Parm, 0);.      
5b10: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
5b20: 28 76 2c 20 4f 50 5f 50 75 6c 6c 2c 20 31 2c 20  (v, OP_Pull, 1, 
5b30: 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  0);.      sqlite
5b40: 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
5b50: 5f 49 6e 73 65 72 74 2c 20 69 50 61 72 6d 2c 20  _Insert, iParm, 
5b60: 4f 50 46 4c 41 47 5f 41 50 50 45 4e 44 29 3b 0a  OPFLAG_APPEND);.
5b70: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
5b80: 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54   }.#ifndef SQLIT
5b90: 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a  E_OMIT_SUBQUERY.
5ba0: 20 20 20 20 63 61 73 65 20 53 52 54 5f 53 65 74      case SRT_Set
5bb0: 3a 20 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74  : {.      assert
5bc0: 28 20 6e 43 6f 6c 75 6d 6e 3d 3d 31 20 29 3b 0a  ( nColumn==1 );.
5bd0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
5be0: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4e 6f 74  eAddOp(v, OP_Not
5bf0: 4e 75 6c 6c 2c 20 2d 31 2c 20 73 71 6c 69 74 65  Null, -1, sqlite
5c00: 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72  3VdbeCurrentAddr
5c10: 28 76 29 2b 33 29 3b 0a 20 20 20 20 20 20 73 71  (v)+3);.      sq
5c20: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
5c30: 2c 20 4f 50 5f 50 6f 70 2c 20 31 2c 20 30 29 3b  , OP_Pop, 1, 0);
5c40: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
5c50: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 47 6f  beAddOp(v, OP_Go
5c60: 74 6f 2c 20 30 2c 20 73 71 6c 69 74 65 33 56 64  to, 0, sqlite3Vd
5c70: 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29  beCurrentAddr(v)
5c80: 2b 33 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  +3);.      sqlit
5c90: 65 33 56 64 62 65 4f 70 33 28 76 2c 20 4f 50 5f  e3VdbeOp3(v, OP_
5ca0: 4d 61 6b 65 52 65 63 6f 72 64 2c 20 31 2c 20 30  MakeRecord, 1, 0
5cb0: 2c 20 26 70 2d 3e 61 66 66 69 6e 69 74 79 2c 20  , &p->affinity, 
5cc0: 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  1);.      sqlite
5cd0: 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
5ce0: 5f 49 64 78 49 6e 73 65 72 74 2c 20 28 69 50 61  _IdxInsert, (iPa
5cf0: 72 6d 26 30 78 30 30 30 30 46 46 46 46 29 2c 20  rm&0x0000FFFF), 
5d00: 30 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  0);.      break;
5d10: 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
5d20: 53 52 54 5f 4d 65 6d 3a 20 7b 0a 20 20 20 20 20  SRT_Mem: {.     
5d30: 20 61 73 73 65 72 74 28 20 6e 43 6f 6c 75 6d 6e   assert( nColumn
5d40: 3d 3d 31 20 29 3b 0a 20 20 20 20 20 20 73 71 6c  ==1 );.      sql
5d50: 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
5d60: 20 4f 50 5f 4d 65 6d 53 74 6f 72 65 2c 20 69 50   OP_MemStore, iP
5d70: 61 72 6d 2c 20 31 29 3b 0a 20 20 20 20 20 20 2f  arm, 1);.      /
5d80: 2a 20 54 68 65 20 4c 49 4d 49 54 20 63 6c 61 75  * The LIMIT clau
5d90: 73 65 20 77 69 6c 6c 20 74 65 72 6d 69 6e 61 74  se will terminat
5da0: 65 20 74 68 65 20 6c 6f 6f 70 20 66 6f 72 20 75  e the loop for u
5db0: 73 20 2a 2f 0a 20 20 20 20 20 20 62 72 65 61 6b  s */.      break
5dc0: 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20  ;.    }.#endif. 
5dd0: 20 20 20 63 61 73 65 20 53 52 54 5f 43 61 6c 6c     case SRT_Call
5de0: 62 61 63 6b 3a 0a 20 20 20 20 63 61 73 65 20 53  back:.    case S
5df0: 52 54 5f 53 75 62 72 6f 75 74 69 6e 65 3a 20 7b  RT_Subroutine: {
5e00: 0a 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 20 20  .      int i;.  
5e10: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
5e20: 64 64 4f 70 28 76 2c 20 4f 50 5f 49 6e 73 65 72  ddOp(v, OP_Inser
5e30: 74 2c 20 70 73 65 75 64 6f 54 61 62 2c 20 30 29  t, pseudoTab, 0)
5e40: 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b  ;.      for(i=0;
5e50: 20 69 3c 6e 43 6f 6c 75 6d 6e 3b 20 69 2b 2b 29   i<nColumn; i++)
5e60: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
5e70: 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
5e80: 5f 43 6f 6c 75 6d 6e 2c 20 70 73 65 75 64 6f 54  _Column, pseudoT
5e90: 61 62 2c 20 69 29 3b 0a 20 20 20 20 20 20 7d 0a  ab, i);.      }.
5ea0: 20 20 20 20 20 20 69 66 28 20 65 44 65 73 74 3d        if( eDest=
5eb0: 3d 53 52 54 5f 43 61 6c 6c 62 61 63 6b 20 29 7b  =SRT_Callback ){
5ec0: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
5ed0: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
5ee0: 43 61 6c 6c 62 61 63 6b 2c 20 6e 43 6f 6c 75 6d  Callback, nColum
5ef0: 6e 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 65 6c  n, 0);.      }el
5f00: 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  se{.        sqli
5f10: 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
5f20: 4f 50 5f 47 6f 73 75 62 2c 20 30 2c 20 69 50 61  OP_Gosub, 0, iPa
5f30: 72 6d 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  rm);.      }.   
5f40: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
5f50: 20 20 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20      default: {. 
5f60: 20 20 20 20 20 2f 2a 20 44 6f 20 6e 6f 74 68 69       /* Do nothi
5f70: 6e 67 20 2a 2f 0a 20 20 20 20 20 20 62 72 65 61  ng */.      brea
5f80: 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  k;.    }.  }..  
5f90: 2f 2a 20 4a 75 6d 70 20 74 6f 20 74 68 65 20 65  /* Jump to the e
5fa0: 6e 64 20 6f 66 20 74 68 65 20 6c 6f 6f 70 20 77  nd of the loop w
5fb0: 68 65 6e 20 74 68 65 20 4c 49 4d 49 54 20 69 73  hen the LIMIT is
5fc0: 20 72 65 61 63 68 65 64 0a 20 20 2a 2f 0a 20 20   reached.  */.  
5fd0: 69 66 28 20 70 2d 3e 69 4c 69 6d 69 74 3e 3d 30  if( p->iLimit>=0
5fe0: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56   ){.    sqlite3V
5ff0: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d  dbeAddOp(v, OP_M
6000: 65 6d 49 6e 63 72 2c 20 2d 31 2c 20 70 2d 3e 69  emIncr, -1, p->i
6010: 4c 69 6d 69 74 29 3b 0a 20 20 20 20 73 71 6c 69  Limit);.    sqli
6020: 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
6030: 4f 50 5f 49 66 4d 65 6d 5a 65 72 6f 2c 20 70 2d  OP_IfMemZero, p-
6040: 3e 69 4c 69 6d 69 74 2c 20 62 72 6b 29 3b 0a 20  >iLimit, brk);. 
6050: 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 62 6f 74   }..  /* The bot
6060: 74 6f 6d 20 6f 66 20 74 68 65 20 6c 6f 6f 70 0a  tom of the loop.
6070: 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 56 64    */.  sqlite3Vd
6080: 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76  beResolveLabel(v
6090: 2c 20 63 6f 6e 74 29 3b 0a 20 20 73 71 6c 69 74  , cont);.  sqlit
60a0: 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
60b0: 50 5f 4e 65 78 74 2c 20 69 54 61 62 2c 20 61 64  P_Next, iTab, ad
60c0: 64 72 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64  dr);.  sqlite3Vd
60d0: 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76  beResolveLabel(v
60e0: 2c 20 62 72 6b 29 3b 0a 20 20 69 66 28 20 65 44  , brk);.  if( eD
60f0: 65 73 74 3d 3d 53 52 54 5f 43 61 6c 6c 62 61 63  est==SRT_Callbac
6100: 6b 20 7c 7c 20 65 44 65 73 74 3d 3d 53 52 54 5f  k || eDest==SRT_
6110: 53 75 62 72 6f 75 74 69 6e 65 20 29 7b 0a 20 20  Subroutine ){.  
6120: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
6130: 4f 70 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20  Op(v, OP_Close, 
6140: 70 73 65 75 64 6f 54 61 62 2c 20 30 29 3b 0a 20  pseudoTab, 0);. 
6150: 20 7d 0a 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74   }..}../*.** Ret
6160: 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  urn a pointer to
6170: 20 61 20 73 74 72 69 6e 67 20 63 6f 6e 74 61 69   a string contai
6180: 6e 69 6e 67 20 74 68 65 20 27 64 65 63 6c 61 72  ning the 'declar
6190: 61 74 69 6f 6e 20 74 79 70 65 27 20 6f 66 20 74  ation type' of t
61a0: 68 65 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e  he.** expression
61b0: 20 70 45 78 70 72 2e 20 54 68 65 20 73 74 72 69   pExpr. The stri
61c0: 6e 67 20 6d 61 79 20 62 65 20 74 72 65 61 74 65  ng may be treate
61d0: 64 20 61 73 20 73 74 61 74 69 63 20 62 79 20 74  d as static by t
61e0: 68 65 20 63 61 6c 6c 65 72 2e 0a 2a 2a 0a 2a 2a  he caller..**.**
61f0: 20 54 68 65 20 64 65 63 6c 61 72 61 74 69 6f 6e   The declaration
6200: 20 74 79 70 65 20 69 73 20 74 68 65 20 65 78 61   type is the exa
6210: 63 74 20 64 61 74 61 74 79 70 65 20 64 65 66 69  ct datatype defi
6220: 6e 69 74 69 6f 6e 20 65 78 74 72 61 63 74 65 64  nition extracted
6230: 20 66 72 6f 6d 20 74 68 65 0a 2a 2a 20 6f 72 69   from the.** ori
6240: 67 69 6e 61 6c 20 43 52 45 41 54 45 20 54 41 42  ginal CREATE TAB
6250: 4c 45 20 73 74 61 74 65 6d 65 6e 74 20 69 66 20  LE statement if 
6260: 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69  the expression i
6270: 73 20 61 20 63 6f 6c 75 6d 6e 2e 20 54 68 65 0a  s a column. The.
6280: 2a 2a 20 64 65 63 6c 61 72 61 74 69 6f 6e 20 74  ** declaration t
6290: 79 70 65 20 66 6f 72 20 61 20 52 4f 57 49 44 20  ype for a ROWID 
62a0: 66 69 65 6c 64 20 69 73 20 49 4e 54 45 47 45 52  field is INTEGER
62b0: 2e 20 45 78 61 63 74 6c 79 20 77 68 65 6e 20 61  . Exactly when a
62c0: 6e 20 65 78 70 72 65 73 73 69 6f 6e 0a 2a 2a 20  n expression.** 
62d0: 69 73 20 63 6f 6e 73 69 64 65 72 65 64 20 61 20  is considered a 
62e0: 63 6f 6c 75 6d 6e 20 63 61 6e 20 62 65 20 63 6f  column can be co
62f0: 6d 70 6c 65 78 20 69 6e 20 74 68 65 20 70 72 65  mplex in the pre
6300: 73 65 6e 63 65 20 6f 66 20 73 75 62 71 75 65 72  sence of subquer
6310: 69 65 73 2e 20 54 68 65 0a 2a 2a 20 72 65 73 75  ies. The.** resu
6320: 6c 74 2d 73 65 74 20 65 78 70 72 65 73 73 69 6f  lt-set expressio
6330: 6e 20 69 6e 20 61 6c 6c 20 6f 66 20 74 68 65 20  n in all of the 
6340: 66 6f 6c 6c 6f 77 69 6e 67 20 53 45 4c 45 43 54  following SELECT
6350: 20 73 74 61 74 65 6d 65 6e 74 73 20 69 73 20 0a   statements is .
6360: 2a 2a 20 63 6f 6e 73 69 64 65 72 65 64 20 61 20  ** considered a 
6370: 63 6f 6c 75 6d 6e 20 62 79 20 74 68 69 73 20 66  column by this f
6380: 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 20  unction..**.**  
6390: 20 53 45 4c 45 43 54 20 63 6f 6c 20 46 52 4f 4d   SELECT col FROM
63a0: 20 74 62 6c 3b 0a 2a 2a 20 20 20 53 45 4c 45 43   tbl;.**   SELEC
63b0: 54 20 28 53 45 4c 45 43 54 20 63 6f 6c 20 46 52  T (SELECT col FR
63c0: 4f 4d 20 74 62 6c 3b 0a 2a 2a 20 20 20 53 45 4c  OM tbl;.**   SEL
63d0: 45 43 54 20 28 53 45 4c 45 43 54 20 63 6f 6c 20  ECT (SELECT col 
63e0: 46 52 4f 4d 20 74 62 6c 29 3b 0a 2a 2a 20 20 20  FROM tbl);.**   
63f0: 53 45 4c 45 43 54 20 61 62 63 20 46 52 4f 4d 20  SELECT abc FROM 
6400: 28 53 45 4c 45 43 54 20 63 6f 6c 20 41 53 20 61  (SELECT col AS a
6410: 62 63 20 46 52 4f 4d 20 74 62 6c 29 3b 0a 2a 2a  bc FROM tbl);.**
6420: 20 0a 2a 2a 20 54 68 65 20 64 65 63 6c 61 72 61   .** The declara
6430: 74 69 6f 6e 20 74 79 70 65 20 66 6f 72 20 61 6e  tion type for an
6440: 79 20 65 78 70 72 65 73 73 69 6f 6e 20 6f 74 68  y expression oth
6450: 65 72 20 74 68 61 6e 20 61 20 63 6f 6c 75 6d 6e  er than a column
6460: 20 69 73 20 4e 55 4c 4c 2e 0a 2a 2f 0a 73 74 61   is NULL..*/.sta
6470: 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  tic const char *
6480: 63 6f 6c 75 6d 6e 54 79 70 65 28 0a 20 20 4e 61  columnType(.  Na
6490: 6d 65 43 6f 6e 74 65 78 74 20 2a 70 4e 43 2c 20  meContext *pNC, 
64a0: 0a 20 20 45 78 70 72 20 2a 70 45 78 70 72 2c 0a  .  Expr *pExpr,.
64b0: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 2a 70    const char **p
64c0: 7a 4f 72 69 67 69 6e 44 62 2c 0a 20 20 63 6f 6e  zOriginDb,.  con
64d0: 73 74 20 63 68 61 72 20 2a 2a 70 7a 4f 72 69 67  st char **pzOrig
64e0: 69 6e 54 61 62 2c 0a 20 20 63 6f 6e 73 74 20 63  inTab,.  const c
64f0: 68 61 72 20 2a 2a 70 7a 4f 72 69 67 69 6e 43 6f  har **pzOriginCo
6500: 6c 0a 29 7b 0a 20 20 63 68 61 72 20 63 6f 6e 73  l.){.  char cons
6510: 74 20 2a 7a 54 79 70 65 20 3d 20 30 3b 0a 20 20  t *zType = 0;.  
6520: 63 68 61 72 20 63 6f 6e 73 74 20 2a 7a 4f 72 69  char const *zOri
6530: 67 69 6e 44 62 20 3d 20 30 3b 0a 20 20 63 68 61  ginDb = 0;.  cha
6540: 72 20 63 6f 6e 73 74 20 2a 7a 4f 72 69 67 69 6e  r const *zOrigin
6550: 54 61 62 20 3d 20 30 3b 0a 20 20 63 68 61 72 20  Tab = 0;.  char 
6560: 63 6f 6e 73 74 20 2a 7a 4f 72 69 67 69 6e 43 6f  const *zOriginCo
6570: 6c 20 3d 20 30 3b 0a 20 20 69 6e 74 20 6a 3b 0a  l = 0;.  int j;.
6580: 20 20 69 66 28 20 70 45 78 70 72 3d 3d 30 20 7c    if( pExpr==0 |
6590: 7c 20 70 4e 43 2d 3e 70 53 72 63 4c 69 73 74 3d  | pNC->pSrcList=
65a0: 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 0a  =0 ) return 0;..
65b0: 20 20 2f 2a 20 54 68 65 20 54 4b 5f 41 53 20 6f    /* The TK_AS o
65c0: 70 65 72 61 74 6f 72 20 63 61 6e 20 6f 6e 6c 79  perator can only
65d0: 20 6f 63 63 75 72 20 69 6e 20 4f 52 44 45 52 20   occur in ORDER 
65e0: 42 59 2c 20 47 52 4f 55 50 20 42 59 2c 20 48 41  BY, GROUP BY, HA
65f0: 56 49 4e 47 2c 0a 20 20 2a 2a 20 61 6e 64 20 4c  VING,.  ** and L
6600: 49 4d 49 54 20 63 6c 61 75 73 65 73 2e 20 20 42  IMIT clauses.  B
6610: 75 74 20 70 45 78 70 72 20 6f 72 69 67 69 6e 61  ut pExpr origina
6620: 74 65 73 20 69 6e 20 74 68 65 20 72 65 73 75 6c  tes in the resul
6630: 74 20 73 65 74 20 6f 66 20 61 0a 20 20 2a 2a 20  t set of a.  ** 
6640: 53 45 4c 45 43 54 2e 20 20 53 6f 20 70 45 78 70  SELECT.  So pExp
6650: 72 20 63 61 6e 20 6e 65 76 65 72 20 63 6f 6e 74  r can never cont
6660: 61 69 6e 20 61 6e 20 41 53 20 6f 70 65 72 61 74  ain an AS operat
6670: 6f 72 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72  or..  */.  asser
6680: 74 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b  t( pExpr->op!=TK
6690: 5f 41 53 20 29 3b 0a 0a 20 20 73 77 69 74 63 68  _AS );..  switch
66a0: 28 20 70 45 78 70 72 2d 3e 6f 70 20 29 7b 0a 20  ( pExpr->op ){. 
66b0: 20 20 20 63 61 73 65 20 54 4b 5f 41 47 47 5f 43     case TK_AGG_C
66c0: 4f 4c 55 4d 4e 3a 0a 20 20 20 20 63 61 73 65 20  OLUMN:.    case 
66d0: 54 4b 5f 43 4f 4c 55 4d 4e 3a 20 7b 0a 20 20 20  TK_COLUMN: {.   
66e0: 20 20 20 2f 2a 20 54 68 65 20 65 78 70 72 65 73     /* The expres
66f0: 73 69 6f 6e 20 69 73 20 61 20 63 6f 6c 75 6d 6e  sion is a column
6700: 2e 20 4c 6f 63 61 74 65 20 74 68 65 20 74 61 62  . Locate the tab
6710: 6c 65 20 74 68 65 20 63 6f 6c 75 6d 6e 20 69 73  le the column is
6720: 20 62 65 69 6e 67 0a 20 20 20 20 20 20 2a 2a 20   being.      ** 
6730: 65 78 74 72 61 63 74 65 64 20 66 72 6f 6d 20 69  extracted from i
6740: 6e 20 4e 61 6d 65 43 6f 6e 74 65 78 74 2e 70 53  n NameContext.pS
6750: 72 63 4c 69 73 74 2e 20 54 68 69 73 20 74 61 62  rcList. This tab
6760: 6c 65 20 6d 61 79 20 62 65 20 72 65 61 6c 0a 20  le may be real. 
6770: 20 20 20 20 20 2a 2a 20 64 61 74 61 62 61 73 65       ** database
6780: 20 74 61 62 6c 65 20 6f 72 20 61 20 73 75 62 71   table or a subq
6790: 75 65 72 79 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  uery..      */. 
67a0: 20 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62       Table *pTab
67b0: 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
67c0: 20 2f 2a 20 54 61 62 6c 65 20 73 74 72 75 63 74   /* Table struct
67d0: 75 72 65 20 63 6f 6c 75 6d 6e 20 69 73 20 65 78  ure column is ex
67e0: 74 72 61 63 74 65 64 20 66 72 6f 6d 20 2a 2f 0a  tracted from */.
67f0: 20 20 20 20 20 20 53 65 6c 65 63 74 20 2a 70 53        Select *pS
6800: 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
6810: 20 20 2f 2a 20 53 65 6c 65 63 74 20 74 68 65 20    /* Select the 
6820: 63 6f 6c 75 6d 6e 20 69 73 20 65 78 74 72 61 63  column is extrac
6830: 74 65 64 20 66 72 6f 6d 20 2a 2f 0a 20 20 20 20  ted from */.    
6840: 20 20 69 6e 74 20 69 43 6f 6c 20 3d 20 70 45 78    int iCol = pEx
6850: 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3b 20 20 2f 2a  pr->iColumn;  /*
6860: 20 49 6e 64 65 78 20 6f 66 20 63 6f 6c 75 6d 6e   Index of column
6870: 20 69 6e 20 70 54 61 62 20 2a 2f 0a 20 20 20 20   in pTab */.    
6880: 20 20 77 68 69 6c 65 28 20 70 4e 43 20 26 26 20    while( pNC && 
6890: 21 70 54 61 62 20 29 7b 0a 20 20 20 20 20 20 20  !pTab ){.       
68a0: 20 53 72 63 4c 69 73 74 20 2a 70 54 61 62 4c 69   SrcList *pTabLi
68b0: 73 74 20 3d 20 70 4e 43 2d 3e 70 53 72 63 4c 69  st = pNC->pSrcLi
68c0: 73 74 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28  st;.        for(
68d0: 6a 3d 30 3b 6a 3c 70 54 61 62 4c 69 73 74 2d 3e  j=0;j<pTabList->
68e0: 6e 53 72 63 20 26 26 20 70 54 61 62 4c 69 73 74  nSrc && pTabList
68f0: 2d 3e 61 5b 6a 5d 2e 69 43 75 72 73 6f 72 21 3d  ->a[j].iCursor!=
6900: 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 3b 6a 2b  pExpr->iTable;j+
6910: 2b 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  +);.        if( 
6920: 6a 3c 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63  j<pTabList->nSrc
6930: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 54   ){.          pT
6940: 61 62 20 3d 20 70 54 61 62 4c 69 73 74 2d 3e 61  ab = pTabList->a
6950: 5b 6a 5d 2e 70 54 61 62 3b 0a 20 20 20 20 20 20  [j].pTab;.      
6960: 20 20 20 20 70 53 20 3d 20 70 54 61 62 4c 69 73      pS = pTabLis
6970: 74 2d 3e 61 5b 6a 5d 2e 70 53 65 6c 65 63 74 3b  t->a[j].pSelect;
6980: 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
6990: 20 20 20 20 20 20 20 20 20 20 70 4e 43 20 3d 20            pNC = 
69a0: 70 4e 43 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20  pNC->pNext;.    
69b0: 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 0a 20      }.      }.. 
69c0: 20 20 20 20 20 69 66 28 20 70 54 61 62 3d 3d 30       if( pTab==0
69d0: 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 46   ){.        /* F
69e0: 49 58 20 4d 45 3a 0a 20 20 20 20 20 20 20 20 2a  IX ME:.        *
69f0: 2a 20 54 68 69 73 20 63 61 6e 20 6f 63 63 75 72  * This can occur
6a00: 73 20 69 66 20 79 6f 75 20 68 61 76 65 20 73 6f  s if you have so
6a10: 6d 65 74 68 69 6e 67 20 6c 69 6b 65 20 22 53 45  mething like "SE
6a20: 4c 45 43 54 20 6e 65 77 2e 78 3b 22 20 69 6e 73  LECT new.x;" ins
6a30: 69 64 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 61  ide.        ** a
6a40: 20 74 72 69 67 67 65 72 2e 20 20 49 6e 20 6f 74   trigger.  In ot
6a50: 68 65 72 20 77 6f 72 64 73 2c 20 69 66 20 79 6f  her words, if yo
6a60: 75 20 72 65 66 65 72 65 6e 63 65 20 74 68 65 20  u reference the 
6a70: 73 70 65 63 69 61 6c 20 22 6e 65 77 22 0a 20 20  special "new".  
6a80: 20 20 20 20 20 20 2a 2a 20 74 61 62 6c 65 20 69        ** table i
6a90: 6e 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74  n the result set
6aa0: 20 6f 66 20 61 20 73 65 6c 65 63 74 2e 20 20 57   of a select.  W
6ab0: 65 20 64 6f 20 6e 6f 74 20 68 61 76 65 20 61 20  e do not have a 
6ac0: 67 6f 6f 64 20 77 61 79 0a 20 20 20 20 20 20 20  good way.       
6ad0: 20 2a 2a 20 74 6f 20 66 69 6e 64 20 74 68 65 20   ** to find the 
6ae0: 61 63 74 75 61 6c 20 74 61 62 6c 65 20 74 79 70  actual table typ
6af0: 65 2c 20 73 6f 20 63 61 6c 6c 20 69 74 20 22 54  e, so call it "T
6b00: 45 58 54 22 2e 20 20 54 68 69 73 20 69 73 20 72  EXT".  This is r
6b10: 65 61 6c 6c 79 0a 20 20 20 20 20 20 20 20 2a 2a  eally.        **
6b20: 20 73 6f 6d 65 74 68 69 6e 67 20 6f 66 20 61 20   something of a 
6b30: 62 75 67 2c 20 62 75 74 20 49 20 64 6f 20 6e 6f  bug, but I do no
6b40: 74 20 6b 6e 6f 77 20 68 6f 77 20 74 6f 20 66 69  t know how to fi
6b50: 78 20 69 74 2e 0a 20 20 20 20 20 20 20 20 2a 2a  x it..        **
6b60: 0a 20 20 20 20 20 20 20 20 2a 2a 20 54 68 69 73  .        ** This
6b70: 20 63 6f 64 65 20 64 6f 65 73 20 6e 6f 74 20 70   code does not p
6b80: 72 6f 64 75 63 65 20 74 68 65 20 63 6f 72 72 65  roduce the corre
6b90: 63 74 20 61 6e 73 77 65 72 20 2d 20 69 74 20 6a  ct answer - it j
6ba0: 75 73 74 20 70 72 65 76 65 6e 74 73 0a 20 20 20  ust prevents.   
6bb0: 20 20 20 20 20 2a 2a 20 61 20 73 65 67 66 61 75       ** a segfau
6bc0: 6c 74 2e 20 20 53 65 65 20 74 69 63 6b 65 74 20  lt.  See ticket 
6bd0: 23 31 32 32 39 2e 0a 20 20 20 20 20 20 20 20 2a  #1229..        *
6be0: 2f 0a 20 20 20 20 20 20 20 20 7a 54 79 70 65 20  /.        zType 
6bf0: 3d 20 22 54 45 58 54 22 3b 0a 20 20 20 20 20 20  = "TEXT";.      
6c00: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d    break;.      }
6c10: 0a 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ..      assert( 
6c20: 70 54 61 62 20 29 3b 0a 20 20 20 20 20 20 69 66  pTab );.      if
6c30: 28 20 70 53 20 29 7b 0a 20 20 20 20 20 20 20 20  ( pS ){.        
6c40: 2f 2a 20 54 68 65 20 22 74 61 62 6c 65 22 20 69  /* The "table" i
6c50: 73 20 61 63 74 75 61 6c 6c 79 20 61 20 73 75 62  s actually a sub
6c60: 2d 73 65 6c 65 63 74 20 6f 72 20 61 20 76 69 65  -select or a vie
6c70: 77 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c  w in the FROM cl
6c80: 61 75 73 65 0a 20 20 20 20 20 20 20 20 2a 2a 20  ause.        ** 
6c90: 6f 66 20 74 68 65 20 53 45 4c 45 43 54 20 73 74  of the SELECT st
6ca0: 61 74 65 6d 65 6e 74 2e 20 52 65 74 75 72 6e 20  atement. Return 
6cb0: 74 68 65 20 64 65 63 6c 61 72 61 74 69 6f 6e 20  the declaration 
6cc0: 74 79 70 65 20 61 6e 64 20 6f 72 69 67 69 6e 0a  type and origin.
6cd0: 20 20 20 20 20 20 20 20 2a 2a 20 64 61 74 61 20          ** data 
6ce0: 66 6f 72 20 74 68 65 20 72 65 73 75 6c 74 2d 73  for the result-s
6cf0: 65 74 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 68 65  et column of the
6d00: 20 73 75 62 2d 73 65 6c 65 63 74 2e 0a 20 20 20   sub-select..   
6d10: 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
6d20: 69 66 28 20 69 43 6f 6c 3e 3d 30 20 26 26 20 69  if( iCol>=0 && i
6d30: 43 6f 6c 3c 70 53 2d 3e 70 45 4c 69 73 74 2d 3e  Col<pS->pEList->
6d40: 6e 45 78 70 72 20 29 7b 0a 20 20 20 20 20 20 20  nExpr ){.       
6d50: 20 20 20 2f 2a 20 49 66 20 69 43 6f 6c 20 69 73     /* If iCol is
6d60: 20 6c 65 73 73 20 74 68 61 6e 20 7a 65 72 6f 2c   less than zero,
6d70: 20 74 68 65 6e 20 74 68 65 20 65 78 70 72 65 73   then the expres
6d80: 73 69 6f 6e 20 72 65 71 75 65 73 74 73 20 74 68  sion requests th
6d90: 65 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 72  e.          ** r
6da0: 6f 77 69 64 20 6f 66 20 74 68 65 20 73 75 62 2d  owid of the sub-
6db0: 73 65 6c 65 63 74 20 6f 72 20 76 69 65 77 2e 20  select or view. 
6dc0: 54 68 69 73 20 65 78 70 72 65 73 73 69 6f 6e 20  This expression 
6dd0: 69 73 20 6c 65 67 61 6c 20 28 73 65 65 20 0a 20  is legal (see . 
6de0: 20 20 20 20 20 20 20 20 20 2a 2a 20 74 65 73 74           ** test
6df0: 20 63 61 73 65 20 6d 69 73 63 32 2e 32 2e 32 29   case misc2.2.2)
6e00: 20 2d 20 69 74 20 61 6c 77 61 79 73 20 65 76 61   - it always eva
6e10: 6c 75 61 74 65 73 20 74 6f 20 4e 55 4c 4c 2e 0a  luates to NULL..
6e20: 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20            */.   
6e30: 20 20 20 20 20 20 20 4e 61 6d 65 43 6f 6e 74 65         NameConte
6e40: 78 74 20 73 4e 43 3b 0a 20 20 20 20 20 20 20 20  xt sNC;.        
6e50: 20 20 45 78 70 72 20 2a 70 20 3d 20 70 53 2d 3e    Expr *p = pS->
6e60: 70 45 4c 69 73 74 2d 3e 61 5b 69 43 6f 6c 5d 2e  pEList->a[iCol].
6e70: 70 45 78 70 72 3b 0a 20 20 20 20 20 20 20 20 20  pExpr;.         
6e80: 20 73 4e 43 2e 70 53 72 63 4c 69 73 74 20 3d 20   sNC.pSrcList = 
6e90: 70 53 2d 3e 70 53 72 63 3b 0a 20 20 20 20 20 20  pS->pSrc;.      
6ea0: 20 20 20 20 73 4e 43 2e 70 4e 65 78 74 20 3d 20      sNC.pNext = 
6eb0: 30 3b 0a 20 20 20 20 20 20 20 20 20 20 73 4e 43  0;.          sNC
6ec0: 2e 70 50 61 72 73 65 20 3d 20 70 4e 43 2d 3e 70  .pParse = pNC->p
6ed0: 50 61 72 73 65 3b 0a 20 20 20 20 20 20 20 20 20  Parse;.         
6ee0: 20 7a 54 79 70 65 20 3d 20 63 6f 6c 75 6d 6e 54   zType = columnT
6ef0: 79 70 65 28 26 73 4e 43 2c 20 70 2c 20 26 7a 4f  ype(&sNC, p, &zO
6f00: 72 69 67 69 6e 44 62 2c 20 26 7a 4f 72 69 67 69  riginDb, &zOrigi
6f10: 6e 54 61 62 2c 20 26 7a 4f 72 69 67 69 6e 43 6f  nTab, &zOriginCo
6f20: 6c 29 3b 20 0a 20 20 20 20 20 20 20 20 7d 0a 20  l); .        }. 
6f30: 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70       }else if( p
6f40: 54 61 62 2d 3e 70 53 63 68 65 6d 61 20 29 7b 0a  Tab->pSchema ){.
6f50: 20 20 20 20 20 20 20 20 2f 2a 20 41 20 72 65 61          /* A rea
6f60: 6c 20 74 61 62 6c 65 20 2a 2f 0a 20 20 20 20 20  l table */.     
6f70: 20 20 20 61 73 73 65 72 74 28 20 21 70 53 20 29     assert( !pS )
6f80: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 69 43  ;.        if( iC
6f90: 6f 6c 3c 30 20 29 20 69 43 6f 6c 20 3d 20 70 54  ol<0 ) iCol = pT
6fa0: 61 62 2d 3e 69 50 4b 65 79 3b 0a 20 20 20 20 20  ab->iPKey;.     
6fb0: 20 20 20 61 73 73 65 72 74 28 20 69 43 6f 6c 3d     assert( iCol=
6fc0: 3d 2d 31 20 7c 7c 20 28 69 43 6f 6c 3e 3d 30 20  =-1 || (iCol>=0 
6fd0: 26 26 20 69 43 6f 6c 3c 70 54 61 62 2d 3e 6e 43  && iCol<pTab->nC
6fe0: 6f 6c 29 20 29 3b 0a 20 20 20 20 20 20 20 20 69  ol) );.        i
6ff0: 66 28 20 69 43 6f 6c 3c 30 20 29 7b 0a 20 20 20  f( iCol<0 ){.   
7000: 20 20 20 20 20 20 20 7a 54 79 70 65 20 3d 20 22         zType = "
7010: 49 4e 54 45 47 45 52 22 3b 0a 20 20 20 20 20 20  INTEGER";.      
7020: 20 20 20 20 7a 4f 72 69 67 69 6e 43 6f 6c 20 3d      zOriginCol =
7030: 20 22 72 6f 77 69 64 22 3b 0a 20 20 20 20 20 20   "rowid";.      
7040: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
7050: 20 20 20 7a 54 79 70 65 20 3d 20 70 54 61 62 2d     zType = pTab-
7060: 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 7a 54 79 70  >aCol[iCol].zTyp
7070: 65 3b 0a 20 20 20 20 20 20 20 20 20 20 7a 4f 72  e;.          zOr
7080: 69 67 69 6e 43 6f 6c 20 3d 20 70 54 61 62 2d 3e  iginCol = pTab->
7090: 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 7a 4e 61 6d 65  aCol[iCol].zName
70a0: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
70b0: 20 20 20 20 7a 4f 72 69 67 69 6e 54 61 62 20 3d      zOriginTab =
70c0: 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 3b 0a 20 20   pTab->zName;.  
70d0: 20 20 20 20 20 20 69 66 28 20 70 4e 43 2d 3e 70        if( pNC->p
70e0: 50 61 72 73 65 20 29 7b 0a 20 20 20 20 20 20 20  Parse ){.       
70f0: 20 20 20 69 6e 74 20 69 44 62 20 3d 20 73 71 6c     int iDb = sql
7100: 69 74 65 33 53 63 68 65 6d 61 54 6f 49 6e 64 65  ite3SchemaToInde
7110: 78 28 70 4e 43 2d 3e 70 50 61 72 73 65 2d 3e 64  x(pNC->pParse->d
7120: 62 2c 20 70 54 61 62 2d 3e 70 53 63 68 65 6d 61  b, pTab->pSchema
7130: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7a 4f 72  );.          zOr
7140: 69 67 69 6e 44 62 20 3d 20 70 4e 43 2d 3e 70 50  iginDb = pNC->pP
7150: 61 72 73 65 2d 3e 64 62 2d 3e 61 44 62 5b 69 44  arse->db->aDb[iD
7160: 62 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20  b].zName;.      
7170: 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
7180: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23    break;.    }.#
7190: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
71a0: 49 54 5f 53 55 42 51 55 45 52 59 0a 20 20 20 20  IT_SUBQUERY.    
71b0: 63 61 73 65 20 54 4b 5f 53 45 4c 45 43 54 3a 20  case TK_SELECT: 
71c0: 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20 65  {.      /* The e
71d0: 78 70 72 65 73 73 69 6f 6e 20 69 73 20 61 20 73  xpression is a s
71e0: 75 62 2d 73 65 6c 65 63 74 2e 20 52 65 74 75 72  ub-select. Retur
71f0: 6e 20 74 68 65 20 64 65 63 6c 61 72 61 74 69 6f  n the declaratio
7200: 6e 20 74 79 70 65 20 61 6e 64 0a 20 20 20 20 20  n type and.     
7210: 20 2a 2a 20 6f 72 69 67 69 6e 20 69 6e 66 6f 20   ** origin info 
7220: 66 6f 72 20 74 68 65 20 73 69 6e 67 6c 65 20 63  for the single c
7230: 6f 6c 75 6d 6e 20 69 6e 20 74 68 65 20 72 65 73  olumn in the res
7240: 75 6c 74 20 73 65 74 20 6f 66 20 74 68 65 20 53  ult set of the S
7250: 45 4c 45 43 54 0a 20 20 20 20 20 20 2a 2a 20 73  ELECT.      ** s
7260: 74 61 74 65 6d 65 6e 74 2e 0a 20 20 20 20 20 20  tatement..      
7270: 2a 2f 0a 20 20 20 20 20 20 4e 61 6d 65 43 6f 6e  */.      NameCon
7280: 74 65 78 74 20 73 4e 43 3b 0a 20 20 20 20 20 20  text sNC;.      
7290: 53 65 6c 65 63 74 20 2a 70 53 20 3d 20 70 45 78  Select *pS = pEx
72a0: 70 72 2d 3e 70 53 65 6c 65 63 74 3b 0a 20 20 20  pr->pSelect;.   
72b0: 20 20 20 45 78 70 72 20 2a 70 20 3d 20 70 53 2d     Expr *p = pS-
72c0: 3e 70 45 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45  >pEList->a[0].pE
72d0: 78 70 72 3b 0a 20 20 20 20 20 20 73 4e 43 2e 70  xpr;.      sNC.p
72e0: 53 72 63 4c 69 73 74 20 3d 20 70 53 2d 3e 70 53  SrcList = pS->pS
72f0: 72 63 3b 0a 20 20 20 20 20 20 73 4e 43 2e 70 4e  rc;.      sNC.pN
7300: 65 78 74 20 3d 20 70 4e 43 3b 0a 20 20 20 20 20  ext = pNC;.     
7310: 20 73 4e 43 2e 70 50 61 72 73 65 20 3d 20 70 4e   sNC.pParse = pN
7320: 43 2d 3e 70 50 61 72 73 65 3b 0a 20 20 20 20 20  C->pParse;.     
7330: 20 7a 54 79 70 65 20 3d 20 63 6f 6c 75 6d 6e 54   zType = columnT
7340: 79 70 65 28 26 73 4e 43 2c 20 70 2c 20 26 7a 4f  ype(&sNC, p, &zO
7350: 72 69 67 69 6e 44 62 2c 20 26 7a 4f 72 69 67 69  riginDb, &zOrigi
7360: 6e 54 61 62 2c 20 26 7a 4f 72 69 67 69 6e 43 6f  nTab, &zOriginCo
7370: 6c 29 3b 20 0a 20 20 20 20 20 20 62 72 65 61 6b  l); .      break
7380: 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20  ;.    }.#endif. 
7390: 20 7d 0a 20 20 0a 20 20 69 66 28 20 70 7a 4f 72   }.  .  if( pzOr
73a0: 69 67 69 6e 44 62 20 29 7b 0a 20 20 20 20 61 73  iginDb ){.    as
73b0: 73 65 72 74 28 20 70 7a 4f 72 69 67 69 6e 54 61  sert( pzOriginTa
73c0: 62 20 26 26 20 70 7a 4f 72 69 67 69 6e 43 6f 6c  b && pzOriginCol
73d0: 20 29 3b 0a 20 20 20 20 2a 70 7a 4f 72 69 67 69   );.    *pzOrigi
73e0: 6e 44 62 20 3d 20 7a 4f 72 69 67 69 6e 44 62 3b  nDb = zOriginDb;
73f0: 0a 20 20 20 20 2a 70 7a 4f 72 69 67 69 6e 54 61  .    *pzOriginTa
7400: 62 20 3d 20 7a 4f 72 69 67 69 6e 54 61 62 3b 0a  b = zOriginTab;.
7410: 20 20 20 20 2a 70 7a 4f 72 69 67 69 6e 43 6f 6c      *pzOriginCol
7420: 20 3d 20 7a 4f 72 69 67 69 6e 43 6f 6c 3b 0a 20   = zOriginCol;. 
7430: 20 7d 0a 20 20 72 65 74 75 72 6e 20 7a 54 79 70   }.  return zTyp
7440: 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65  e;.}../*.** Gene
7450: 72 61 74 65 20 63 6f 64 65 20 74 68 61 74 20 77  rate code that w
7460: 69 6c 6c 20 74 65 6c 6c 20 74 68 65 20 56 44 42  ill tell the VDB
7470: 45 20 74 68 65 20 64 65 63 6c 61 72 61 74 69 6f  E the declaratio
7480: 6e 20 74 79 70 65 73 20 6f 66 20 63 6f 6c 75 6d  n types of colum
7490: 6e 73 0a 2a 2a 20 69 6e 20 74 68 65 20 72 65 73  ns.** in the res
74a0: 75 6c 74 20 73 65 74 2e 0a 2a 2f 0a 73 74 61 74  ult set..*/.stat
74b0: 69 63 20 76 6f 69 64 20 67 65 6e 65 72 61 74 65  ic void generate
74c0: 43 6f 6c 75 6d 6e 54 79 70 65 73 28 0a 20 20 50  ColumnTypes(.  P
74d0: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
74e0: 20 20 20 2f 2a 20 50 61 72 73 65 72 20 63 6f 6e     /* Parser con
74f0: 74 65 78 74 20 2a 2f 0a 20 20 53 72 63 4c 69 73  text */.  SrcLis
7500: 74 20 2a 70 54 61 62 4c 69 73 74 2c 20 20 2f 2a  t *pTabList,  /*
7510: 20 4c 69 73 74 20 6f 66 20 74 61 62 6c 65 73 20   List of tables 
7520: 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70  */.  ExprList *p
7530: 45 4c 69 73 74 20 20 20 20 2f 2a 20 45 78 70 72  EList    /* Expr
7540: 65 73 73 69 6f 6e 73 20 64 65 66 69 6e 69 6e 67  essions defining
7550: 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 20   the result set 
7560: 2a 2f 0a 29 7b 0a 20 20 56 64 62 65 20 2a 76 20  */.){.  Vdbe *v 
7570: 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b  = pParse->pVdbe;
7580: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 4e 61 6d 65  .  int i;.  Name
7590: 43 6f 6e 74 65 78 74 20 73 4e 43 3b 0a 20 20 73  Context sNC;.  s
75a0: 4e 43 2e 70 53 72 63 4c 69 73 74 20 3d 20 70 54  NC.pSrcList = pT
75b0: 61 62 4c 69 73 74 3b 0a 20 20 73 4e 43 2e 70 50  abList;.  sNC.pP
75c0: 61 72 73 65 20 3d 20 70 50 61 72 73 65 3b 0a 20  arse = pParse;. 
75d0: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 45 4c 69   for(i=0; i<pELi
75e0: 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b  st->nExpr; i++){
75f0: 0a 20 20 20 20 45 78 70 72 20 2a 70 20 3d 20 70  .    Expr *p = p
7600: 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70  EList->a[i].pExp
7610: 72 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61  r;.    const cha
7620: 72 20 2a 7a 4f 72 69 67 44 62 20 3d 20 30 3b 0a  r *zOrigDb = 0;.
7630: 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
7640: 7a 4f 72 69 67 54 61 62 20 3d 20 30 3b 0a 20 20  zOrigTab = 0;.  
7650: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4f    const char *zO
7660: 72 69 67 43 6f 6c 20 3d 20 30 3b 0a 20 20 20 20  rigCol = 0;.    
7670: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 79 70  const char *zTyp
7680: 65 20 3d 20 63 6f 6c 75 6d 6e 54 79 70 65 28 26  e = columnType(&
7690: 73 4e 43 2c 20 70 2c 20 26 7a 4f 72 69 67 44 62  sNC, p, &zOrigDb
76a0: 2c 20 26 7a 4f 72 69 67 54 61 62 2c 20 26 7a 4f  , &zOrigTab, &zO
76b0: 72 69 67 43 6f 6c 29 3b 0a 0a 20 20 20 20 2f 2a  rigCol);..    /*
76c0: 20 54 68 65 20 76 64 62 65 20 6d 75 73 74 20 6d   The vdbe must m
76d0: 61 6b 65 20 69 74 27 73 20 6f 77 6e 20 63 6f 70  ake it's own cop
76e0: 79 20 6f 66 20 74 68 65 20 63 6f 6c 75 6d 6e 2d  y of the column-
76f0: 74 79 70 65 20 61 6e 64 20 6f 74 68 65 72 20 0a  type and other .
7700: 20 20 20 20 2a 2a 20 63 6f 6c 75 6d 6e 20 73 70      ** column sp
7710: 65 63 69 66 69 63 20 73 74 72 69 6e 67 73 2c 20  ecific strings, 
7720: 69 6e 20 63 61 73 65 20 74 68 65 20 73 63 68 65  in case the sche
7730: 6d 61 20 69 73 20 72 65 73 65 74 20 62 65 66 6f  ma is reset befo
7740: 72 65 20 74 68 69 73 0a 20 20 20 20 2a 2a 20 76  re this.    ** v
7750: 69 72 74 75 61 6c 20 6d 61 63 68 69 6e 65 20 69  irtual machine i
7760: 73 20 64 65 6c 65 74 65 64 2e 0a 20 20 20 20 2a  s deleted..    *
7770: 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  /.    sqlite3Vdb
7780: 65 53 65 74 43 6f 6c 4e 61 6d 65 28 76 2c 20 69  eSetColName(v, i
7790: 2c 20 43 4f 4c 4e 41 4d 45 5f 44 45 43 4c 54 59  , COLNAME_DECLTY
77a0: 50 45 2c 20 7a 54 79 70 65 2c 20 50 33 5f 54 52  PE, zType, P3_TR
77b0: 41 4e 53 49 45 4e 54 29 3b 0a 20 20 20 20 73 71  ANSIENT);.    sq
77c0: 6c 69 74 65 33 56 64 62 65 53 65 74 43 6f 6c 4e  lite3VdbeSetColN
77d0: 61 6d 65 28 76 2c 20 69 2c 20 43 4f 4c 4e 41 4d  ame(v, i, COLNAM
77e0: 45 5f 44 41 54 41 42 41 53 45 2c 20 7a 4f 72 69  E_DATABASE, zOri
77f0: 67 44 62 2c 20 50 33 5f 54 52 41 4e 53 49 45 4e  gDb, P3_TRANSIEN
7800: 54 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  T);.    sqlite3V
7810: 64 62 65 53 65 74 43 6f 6c 4e 61 6d 65 28 76 2c  dbeSetColName(v,
7820: 20 69 2c 20 43 4f 4c 4e 41 4d 45 5f 54 41 42 4c   i, COLNAME_TABL
7830: 45 2c 20 7a 4f 72 69 67 54 61 62 2c 20 50 33 5f  E, zOrigTab, P3_
7840: 54 52 41 4e 53 49 45 4e 54 29 3b 0a 20 20 20 20  TRANSIENT);.    
7850: 73 71 6c 69 74 65 33 56 64 62 65 53 65 74 43 6f  sqlite3VdbeSetCo
7860: 6c 4e 61 6d 65 28 76 2c 20 69 2c 20 43 4f 4c 4e  lName(v, i, COLN
7870: 41 4d 45 5f 43 4f 4c 55 4d 4e 2c 20 7a 4f 72 69  AME_COLUMN, zOri
7880: 67 43 6f 6c 2c 20 50 33 5f 54 52 41 4e 53 49 45  gCol, P3_TRANSIE
7890: 4e 54 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  NT);.  }.}../*.*
78a0: 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20  * Generate code 
78b0: 74 68 61 74 20 77 69 6c 6c 20 74 65 6c 6c 20 74  that will tell t
78c0: 68 65 20 56 44 42 45 20 74 68 65 20 6e 61 6d 65  he VDBE the name
78d0: 73 20 6f 66 20 63 6f 6c 75 6d 6e 73 0a 2a 2a 20  s of columns.** 
78e0: 69 6e 20 74 68 65 20 72 65 73 75 6c 74 20 73 65  in the result se
78f0: 74 2e 20 20 54 68 69 73 20 69 6e 66 6f 72 6d 61  t.  This informa
7900: 74 69 6f 6e 20 69 73 20 75 73 65 64 20 74 6f 20  tion is used to 
7910: 70 72 6f 76 69 64 65 20 74 68 65 0a 2a 2a 20 61  provide the.** a
7920: 7a 43 6f 6c 5b 5d 20 76 61 6c 75 65 73 20 69 6e  zCol[] values in
7930: 20 74 68 65 20 63 61 6c 6c 62 61 63 6b 2e 0a 2a   the callback..*
7940: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 67 65  /.static void ge
7950: 6e 65 72 61 74 65 43 6f 6c 75 6d 6e 4e 61 6d 65  nerateColumnName
7960: 73 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  s(.  Parse *pPar
7970: 73 65 2c 20 20 20 20 20 20 2f 2a 20 50 61 72 73  se,      /* Pars
7980: 65 72 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  er context */.  
7990: 53 72 63 4c 69 73 74 20 2a 70 54 61 62 4c 69 73  SrcList *pTabLis
79a0: 74 2c 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 74  t,  /* List of t
79b0: 61 62 6c 65 73 20 2a 2f 0a 20 20 45 78 70 72 4c  ables */.  ExprL
79c0: 69 73 74 20 2a 70 45 4c 69 73 74 20 20 20 20 2f  ist *pEList    /
79d0: 2a 20 45 78 70 72 65 73 73 69 6f 6e 73 20 64 65  * Expressions de
79e0: 66 69 6e 69 6e 67 20 74 68 65 20 72 65 73 75 6c  fining the resul
79f0: 74 20 73 65 74 20 2a 2f 0a 29 7b 0a 20 20 56 64  t set */.){.  Vd
7a00: 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e  be *v = pParse->
7a10: 70 56 64 62 65 3b 0a 20 20 69 6e 74 20 69 2c 20  pVdbe;.  int i, 
7a20: 6a 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  j;.  sqlite3 *db
7a30: 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20   = pParse->db;. 
7a40: 20 69 6e 74 20 66 75 6c 6c 4e 61 6d 65 73 2c 20   int fullNames, 
7a50: 73 68 6f 72 74 4e 61 6d 65 73 3b 0a 0a 23 69 66  shortNames;..#if
7a60: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
7a70: 5f 45 58 50 4c 41 49 4e 0a 20 20 2f 2a 20 49 66  _EXPLAIN.  /* If
7a80: 20 74 68 69 73 20 69 73 20 61 6e 20 45 58 50 4c   this is an EXPL
7a90: 41 49 4e 2c 20 73 6b 69 70 20 74 68 69 73 20 73  AIN, skip this s
7aa0: 74 65 70 20 2a 2f 0a 20 20 69 66 28 20 70 50 61  tep */.  if( pPa
7ab0: 72 73 65 2d 3e 65 78 70 6c 61 69 6e 20 29 7b 0a  rse->explain ){.
7ac0: 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a      return;.  }.
7ad0: 23 65 6e 64 69 66 0a 0a 20 20 61 73 73 65 72 74  #endif..  assert
7ae0: 28 20 76 21 3d 30 20 29 3b 0a 20 20 69 66 28 20  ( v!=0 );.  if( 
7af0: 70 50 61 72 73 65 2d 3e 63 6f 6c 4e 61 6d 65 73  pParse->colNames
7b00: 53 65 74 20 7c 7c 20 76 3d 3d 30 20 7c 7c 20 73  Set || v==0 || s
7b10: 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 46 61 69 6c  qlite3MallocFail
7b20: 65 64 28 29 20 29 20 72 65 74 75 72 6e 3b 0a 20  ed() ) return;. 
7b30: 20 70 50 61 72 73 65 2d 3e 63 6f 6c 4e 61 6d 65   pParse->colName
7b40: 73 53 65 74 20 3d 20 31 3b 0a 20 20 66 75 6c 6c  sSet = 1;.  full
7b50: 4e 61 6d 65 73 20 3d 20 28 64 62 2d 3e 66 6c 61  Names = (db->fla
7b60: 67 73 20 26 20 53 51 4c 49 54 45 5f 46 75 6c 6c  gs & SQLITE_Full
7b70: 43 6f 6c 4e 61 6d 65 73 29 21 3d 30 3b 0a 20 20  ColNames)!=0;.  
7b80: 73 68 6f 72 74 4e 61 6d 65 73 20 3d 20 28 64 62  shortNames = (db
7b90: 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45  ->flags & SQLITE
7ba0: 5f 53 68 6f 72 74 43 6f 6c 4e 61 6d 65 73 29 21  _ShortColNames)!
7bb0: 3d 30 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  =0;.  sqlite3Vdb
7bc0: 65 53 65 74 4e 75 6d 43 6f 6c 73 28 76 2c 20 70  eSetNumCols(v, p
7bd0: 45 4c 69 73 74 2d 3e 6e 45 78 70 72 29 3b 0a 20  EList->nExpr);. 
7be0: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 45 4c 69   for(i=0; i<pELi
7bf0: 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b  st->nExpr; i++){
7c00: 0a 20 20 20 20 45 78 70 72 20 2a 70 3b 0a 20 20  .    Expr *p;.  
7c10: 20 20 70 20 3d 20 70 45 4c 69 73 74 2d 3e 61 5b    p = pEList->a[
7c20: 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 69 66  i].pExpr;.    if
7c30: 28 20 70 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75  ( p==0 ) continu
7c40: 65 3b 0a 20 20 20 20 69 66 28 20 70 45 4c 69 73  e;.    if( pELis
7c50: 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 20 29 7b  t->a[i].zName ){
7c60: 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a 4e 61  .      char *zNa
7c70: 6d 65 20 3d 20 70 45 4c 69 73 74 2d 3e 61 5b 69  me = pEList->a[i
7c80: 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20 73  ].zName;.      s
7c90: 71 6c 69 74 65 33 56 64 62 65 53 65 74 43 6f 6c  qlite3VdbeSetCol
7ca0: 4e 61 6d 65 28 76 2c 20 69 2c 20 43 4f 4c 4e 41  Name(v, i, COLNA
7cb0: 4d 45 5f 4e 41 4d 45 2c 20 7a 4e 61 6d 65 2c 20  ME_NAME, zName, 
7cc0: 73 74 72 6c 65 6e 28 7a 4e 61 6d 65 29 29 3b 0a  strlen(zName));.
7cd0: 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a        continue;.
7ce0: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 2d      }.    if( p-
7cf0: 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 26  >op==TK_COLUMN &
7d00: 26 20 70 54 61 62 4c 69 73 74 20 29 7b 0a 20 20  & pTabList ){.  
7d10: 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b      Table *pTab;
7d20: 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a 43 6f  .      char *zCo
7d30: 6c 3b 0a 20 20 20 20 20 20 69 6e 74 20 69 43 6f  l;.      int iCo
7d40: 6c 20 3d 20 70 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a  l = p->iColumn;.
7d50: 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a        for(j=0; j
7d60: 3c 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 20  <pTabList->nSrc 
7d70: 26 26 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 6a  && pTabList->a[j
7d80: 5d 2e 69 43 75 72 73 6f 72 21 3d 70 2d 3e 69 54  ].iCursor!=p->iT
7d90: 61 62 6c 65 3b 20 6a 2b 2b 29 7b 7d 0a 20 20 20  able; j++){}.   
7da0: 20 20 20 61 73 73 65 72 74 28 20 6a 3c 70 54 61     assert( j<pTa
7db0: 62 4c 69 73 74 2d 3e 6e 53 72 63 20 29 3b 0a 20  bList->nSrc );. 
7dc0: 20 20 20 20 20 70 54 61 62 20 3d 20 70 54 61 62       pTab = pTab
7dd0: 4c 69 73 74 2d 3e 61 5b 6a 5d 2e 70 54 61 62 3b  List->a[j].pTab;
7de0: 0a 20 20 20 20 20 20 69 66 28 20 69 43 6f 6c 3c  .      if( iCol<
7df0: 30 20 29 20 69 43 6f 6c 20 3d 20 70 54 61 62 2d  0 ) iCol = pTab-
7e00: 3e 69 50 4b 65 79 3b 0a 20 20 20 20 20 20 61 73  >iPKey;.      as
7e10: 73 65 72 74 28 20 69 43 6f 6c 3d 3d 2d 31 20 7c  sert( iCol==-1 |
7e20: 7c 20 28 69 43 6f 6c 3e 3d 30 20 26 26 20 69 43  | (iCol>=0 && iC
7e30: 6f 6c 3c 70 54 61 62 2d 3e 6e 43 6f 6c 29 20 29  ol<pTab->nCol) )
7e40: 3b 0a 20 20 20 20 20 20 69 66 28 20 69 43 6f 6c  ;.      if( iCol
7e50: 3c 30 20 29 7b 0a 20 20 20 20 20 20 20 20 7a 43  <0 ){.        zC
7e60: 6f 6c 20 3d 20 22 72 6f 77 69 64 22 3b 0a 20 20  ol = "rowid";.  
7e70: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
7e80: 20 20 20 7a 43 6f 6c 20 3d 20 70 54 61 62 2d 3e     zCol = pTab->
7e90: 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 7a 4e 61 6d 65  aCol[iCol].zName
7ea0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
7eb0: 69 66 28 20 21 73 68 6f 72 74 4e 61 6d 65 73 20  if( !shortNames 
7ec0: 26 26 20 21 66 75 6c 6c 4e 61 6d 65 73 20 26 26  && !fullNames &&
7ed0: 20 70 2d 3e 73 70 61 6e 2e 7a 20 26 26 20 70 2d   p->span.z && p-
7ee0: 3e 73 70 61 6e 2e 7a 5b 30 5d 20 29 7b 0a 20 20  >span.z[0] ){.  
7ef0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
7f00: 65 53 65 74 43 6f 6c 4e 61 6d 65 28 76 2c 20 69  eSetColName(v, i
7f10: 2c 20 43 4f 4c 4e 41 4d 45 5f 4e 41 4d 45 2c 20  , COLNAME_NAME, 
7f20: 28 63 68 61 72 2a 29 70 2d 3e 73 70 61 6e 2e 7a  (char*)p->span.z
7f30: 2c 20 70 2d 3e 73 70 61 6e 2e 6e 29 3b 0a 20 20  , p->span.n);.  
7f40: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 66 75      }else if( fu
7f50: 6c 6c 4e 61 6d 65 73 20 7c 7c 20 28 21 73 68 6f  llNames || (!sho
7f60: 72 74 4e 61 6d 65 73 20 26 26 20 70 54 61 62 4c  rtNames && pTabL
7f70: 69 73 74 2d 3e 6e 53 72 63 3e 31 29 20 29 7b 0a  ist->nSrc>1) ){.
7f80: 20 20 20 20 20 20 20 20 63 68 61 72 20 2a 7a 4e          char *zN
7f90: 61 6d 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  ame = 0;.       
7fa0: 20 63 68 61 72 20 2a 7a 54 61 62 3b 0a 20 0a 20   char *zTab;. . 
7fb0: 20 20 20 20 20 20 20 7a 54 61 62 20 3d 20 70 54         zTab = pT
7fc0: 61 62 4c 69 73 74 2d 3e 61 5b 6a 5d 2e 7a 41 6c  abList->a[j].zAl
7fd0: 69 61 73 3b 0a 20 20 20 20 20 20 20 20 69 66 28  ias;.        if(
7fe0: 20 66 75 6c 6c 4e 61 6d 65 73 20 7c 7c 20 7a 54   fullNames || zT
7ff0: 61 62 3d 3d 30 20 29 20 7a 54 61 62 20 3d 20 70  ab==0 ) zTab = p
8000: 54 61 62 2d 3e 7a 4e 61 6d 65 3b 0a 20 20 20 20  Tab->zName;.    
8010: 20 20 20 20 73 71 6c 69 74 65 33 53 65 74 53 74      sqlite3SetSt
8020: 72 69 6e 67 28 26 7a 4e 61 6d 65 2c 20 7a 54 61  ring(&zName, zTa
8030: 62 2c 20 22 2e 22 2c 20 7a 43 6f 6c 2c 20 28 63  b, ".", zCol, (c
8040: 68 61 72 2a 29 30 29 3b 0a 20 20 20 20 20 20 20  har*)0);.       
8050: 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 74 43   sqlite3VdbeSetC
8060: 6f 6c 4e 61 6d 65 28 76 2c 20 69 2c 20 43 4f 4c  olName(v, i, COL
8070: 4e 41 4d 45 5f 4e 41 4d 45 2c 20 7a 4e 61 6d 65  NAME_NAME, zName
8080: 2c 20 50 33 5f 44 59 4e 41 4d 49 43 29 3b 0a 20  , P3_DYNAMIC);. 
8090: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
80a0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 53      sqlite3VdbeS
80b0: 65 74 43 6f 6c 4e 61 6d 65 28 76 2c 20 69 2c 20  etColName(v, i, 
80c0: 43 4f 4c 4e 41 4d 45 5f 4e 41 4d 45 2c 20 7a 43  COLNAME_NAME, zC
80d0: 6f 6c 2c 20 73 74 72 6c 65 6e 28 7a 43 6f 6c 29  ol, strlen(zCol)
80e0: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
80f0: 65 6c 73 65 20 69 66 28 20 70 2d 3e 73 70 61 6e  else if( p->span
8100: 2e 7a 20 26 26 20 70 2d 3e 73 70 61 6e 2e 7a 5b  .z && p->span.z[
8110: 30 5d 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  0] ){.      sqli
8120: 74 65 33 56 64 62 65 53 65 74 43 6f 6c 4e 61 6d  te3VdbeSetColNam
8130: 65 28 76 2c 20 69 2c 20 43 4f 4c 4e 41 4d 45 5f  e(v, i, COLNAME_
8140: 4e 41 4d 45 2c 20 28 63 68 61 72 2a 29 70 2d 3e  NAME, (char*)p->
8150: 73 70 61 6e 2e 7a 2c 20 70 2d 3e 73 70 61 6e 2e  span.z, p->span.
8160: 6e 29 3b 0a 20 20 20 20 20 20 2f 2a 20 73 71 6c  n);.      /* sql
8170: 69 74 65 33 56 64 62 65 43 6f 6d 70 72 65 73 73  ite3VdbeCompress
8180: 53 70 61 63 65 28 76 2c 20 61 64 64 72 29 3b 20  Space(v, addr); 
8190: 2a 2f 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  */.    }else{.  
81a0: 20 20 20 20 63 68 61 72 20 7a 4e 61 6d 65 5b 33      char zName[3
81b0: 30 5d 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  0];.      assert
81c0: 28 20 70 2d 3e 6f 70 21 3d 54 4b 5f 43 4f 4c 55  ( p->op!=TK_COLU
81d0: 4d 4e 20 7c 7c 20 70 54 61 62 4c 69 73 74 3d 3d  MN || pTabList==
81e0: 30 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  0 );.      sqlit
81f0: 65 33 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a 65  e3_snprintf(size
8200: 6f 66 28 7a 4e 61 6d 65 29 2c 20 7a 4e 61 6d 65  of(zName), zName
8210: 2c 20 22 63 6f 6c 75 6d 6e 25 64 22 2c 20 69 2b  , "column%d", i+
8220: 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  1);.      sqlite
8230: 33 56 64 62 65 53 65 74 43 6f 6c 4e 61 6d 65 28  3VdbeSetColName(
8240: 76 2c 20 69 2c 20 43 4f 4c 4e 41 4d 45 5f 4e 41  v, i, COLNAME_NA
8250: 4d 45 2c 20 7a 4e 61 6d 65 2c 20 30 29 3b 0a 20  ME, zName, 0);. 
8260: 20 20 20 7d 0a 20 20 7d 0a 20 20 67 65 6e 65 72     }.  }.  gener
8270: 61 74 65 43 6f 6c 75 6d 6e 54 79 70 65 73 28 70  ateColumnTypes(p
8280: 50 61 72 73 65 2c 20 70 54 61 62 4c 69 73 74 2c  Parse, pTabList,
8290: 20 70 45 4c 69 73 74 29 3b 0a 7d 0a 0a 23 69 66   pEList);.}..#if
82a0: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
82b0: 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45 43 54  _COMPOUND_SELECT
82c0: 0a 2f 2a 0a 2a 2a 20 4e 61 6d 65 20 6f 66 20 74  ./*.** Name of t
82d0: 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 6f 70  he connection op
82e0: 65 72 61 74 6f 72 2c 20 75 73 65 64 20 66 6f 72  erator, used for
82f0: 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 73 2e   error messages.
8300: 0a 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73 74  .*/.static const
8310: 20 63 68 61 72 20 2a 73 65 6c 65 63 74 4f 70 4e   char *selectOpN
8320: 61 6d 65 28 69 6e 74 20 69 64 29 7b 0a 20 20 63  ame(int id){.  c
8330: 68 61 72 20 2a 7a 3b 0a 20 20 73 77 69 74 63 68  har *z;.  switch
8340: 28 20 69 64 20 29 7b 0a 20 20 20 20 63 61 73 65  ( id ){.    case
8350: 20 54 4b 5f 41 4c 4c 3a 20 20 20 20 20 20 20 7a   TK_ALL:       z
8360: 20 3d 20 22 55 4e 49 4f 4e 20 41 4c 4c 22 3b 20   = "UNION ALL"; 
8370: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73    break;.    cas
8380: 65 20 54 4b 5f 49 4e 54 45 52 53 45 43 54 3a 20  e TK_INTERSECT: 
8390: 7a 20 3d 20 22 49 4e 54 45 52 53 45 43 54 22 3b  z = "INTERSECT";
83a0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61     break;.    ca
83b0: 73 65 20 54 4b 5f 45 58 43 45 50 54 3a 20 20 20  se TK_EXCEPT:   
83c0: 20 7a 20 3d 20 22 45 58 43 45 50 54 22 3b 20 20   z = "EXCEPT";  
83d0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 64      break;.    d
83e0: 65 66 61 75 6c 74 3a 20 20 20 20 20 20 20 20 20  efault:         
83f0: 20 20 7a 20 3d 20 22 55 4e 49 4f 4e 22 3b 20 20    z = "UNION";  
8400: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a       break;.  }.
8410: 20 20 72 65 74 75 72 6e 20 7a 3b 0a 7d 0a 23 65    return z;.}.#e
8420: 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f  ndif /* SQLITE_O
8430: 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c  MIT_COMPOUND_SEL
8440: 45 43 54 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 46 6f  ECT */../*.** Fo
8450: 72 77 61 72 64 20 64 65 63 6c 61 72 61 74 69 6f  rward declaratio
8460: 6e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  n.*/.static int 
8470: 70 72 65 70 53 65 6c 65 63 74 53 74 6d 74 28 50  prepSelectStmt(P
8480: 61 72 73 65 2a 2c 20 53 65 6c 65 63 74 2a 29 3b  arse*, Select*);
8490: 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20 61 20  ../*.** Given a 
84a0: 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
84b0: 2c 20 67 65 6e 65 72 61 74 65 20 61 20 54 61 62  , generate a Tab
84c0: 6c 65 20 73 74 72 75 63 74 75 72 65 20 74 68 61  le structure tha
84d0: 74 20 64 65 73 63 72 69 62 65 73 0a 2a 2a 20 74  t describes.** t
84e0: 68 65 20 72 65 73 75 6c 74 20 73 65 74 20 6f 66  he result set of
84f0: 20 74 68 61 74 20 53 45 4c 45 43 54 2e 0a 2a 2f   that SELECT..*/
8500: 0a 54 61 62 6c 65 20 2a 73 71 6c 69 74 65 33 52  .Table *sqlite3R
8510: 65 73 75 6c 74 53 65 74 4f 66 53 65 6c 65 63 74  esultSetOfSelect
8520: 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
8530: 63 68 61 72 20 2a 7a 54 61 62 4e 61 6d 65 2c 20  char *zTabName, 
8540: 53 65 6c 65 63 74 20 2a 70 53 65 6c 65 63 74 29  Select *pSelect)
8550: 7b 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b  {.  Table *pTab;
8560: 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 45  .  int i, j;.  E
8570: 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 3b  xprList *pEList;
8580: 0a 20 20 43 6f 6c 75 6d 6e 20 2a 61 43 6f 6c 2c  .  Column *aCol,
8590: 20 2a 70 43 6f 6c 3b 0a 0a 20 20 77 68 69 6c 65   *pCol;..  while
85a0: 28 20 70 53 65 6c 65 63 74 2d 3e 70 50 72 69 6f  ( pSelect->pPrio
85b0: 72 20 29 20 70 53 65 6c 65 63 74 20 3d 20 70 53  r ) pSelect = pS
85c0: 65 6c 65 63 74 2d 3e 70 50 72 69 6f 72 3b 0a 20  elect->pPrior;. 
85d0: 20 69 66 28 20 70 72 65 70 53 65 6c 65 63 74 53   if( prepSelectS
85e0: 74 6d 74 28 70 50 61 72 73 65 2c 20 70 53 65 6c  tmt(pParse, pSel
85f0: 65 63 74 29 20 29 7b 0a 20 20 20 20 72 65 74 75  ect) ){.    retu
8600: 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20  rn 0;.  }.  if( 
8610: 73 71 6c 69 74 65 33 53 65 6c 65 63 74 52 65 73  sqlite3SelectRes
8620: 6f 6c 76 65 28 70 50 61 72 73 65 2c 20 70 53 65  olve(pParse, pSe
8630: 6c 65 63 74 2c 20 30 29 20 29 7b 0a 20 20 20 20  lect, 0) ){.    
8640: 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20  return 0;.  }.  
8650: 70 54 61 62 20 3d 20 73 71 6c 69 74 65 4d 61 6c  pTab = sqliteMal
8660: 6c 6f 63 28 20 73 69 7a 65 6f 66 28 54 61 62 6c  loc( sizeof(Tabl
8670: 65 29 20 29 3b 0a 20 20 69 66 28 20 70 54 61 62  e) );.  if( pTab
8680: 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ==0 ){.    retur
8690: 6e 20 30 3b 0a 20 20 7d 0a 20 20 70 54 61 62 2d  n 0;.  }.  pTab-
86a0: 3e 6e 52 65 66 20 3d 20 31 3b 0a 20 20 70 54 61  >nRef = 1;.  pTa
86b0: 62 2d 3e 7a 4e 61 6d 65 20 3d 20 7a 54 61 62 4e  b->zName = zTabN
86c0: 61 6d 65 20 3f 20 73 71 6c 69 74 65 53 74 72 44  ame ? sqliteStrD
86d0: 75 70 28 7a 54 61 62 4e 61 6d 65 29 20 3a 20 30  up(zTabName) : 0
86e0: 3b 0a 20 20 70 45 4c 69 73 74 20 3d 20 70 53 65  ;.  pEList = pSe
86f0: 6c 65 63 74 2d 3e 70 45 4c 69 73 74 3b 0a 20 20  lect->pEList;.  
8700: 70 54 61 62 2d 3e 6e 43 6f 6c 20 3d 20 70 45 4c  pTab->nCol = pEL
8710: 69 73 74 2d 3e 6e 45 78 70 72 3b 0a 20 20 61 73  ist->nExpr;.  as
8720: 73 65 72 74 28 20 70 54 61 62 2d 3e 6e 43 6f 6c  sert( pTab->nCol
8730: 3e 30 20 29 3b 0a 20 20 70 54 61 62 2d 3e 61 43  >0 );.  pTab->aC
8740: 6f 6c 20 3d 20 61 43 6f 6c 20 3d 20 73 71 6c 69  ol = aCol = sqli
8750: 74 65 4d 61 6c 6c 6f 63 28 20 73 69 7a 65 6f 66  teMalloc( sizeof
8760: 28 70 54 61 62 2d 3e 61 43 6f 6c 5b 30 5d 29 2a  (pTab->aCol[0])*
8770: 70 54 61 62 2d 3e 6e 43 6f 6c 20 29 3b 0a 20 20  pTab->nCol );.  
8780: 66 6f 72 28 69 3d 30 2c 20 70 43 6f 6c 3d 61 43  for(i=0, pCol=aC
8790: 6f 6c 3b 20 69 3c 70 54 61 62 2d 3e 6e 43 6f 6c  ol; i<pTab->nCol
87a0: 3b 20 69 2b 2b 2c 20 70 43 6f 6c 2b 2b 29 7b 0a  ; i++, pCol++){.
87b0: 20 20 20 20 45 78 70 72 20 2a 70 2c 20 2a 70 52      Expr *p, *pR
87c0: 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a 54 79 70  ;.    char *zTyp
87d0: 65 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a 4e 61  e;.    char *zNa
87e0: 6d 65 3b 0a 20 20 20 20 69 6e 74 20 6e 4e 61 6d  me;.    int nNam
87f0: 65 3b 0a 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a  e;.    CollSeq *
8800: 70 43 6f 6c 6c 3b 0a 20 20 20 20 69 6e 74 20 63  pColl;.    int c
8810: 6e 74 3b 0a 20 20 20 20 4e 61 6d 65 43 6f 6e 74  nt;.    NameCont
8820: 65 78 74 20 73 4e 43 3b 0a 20 20 20 20 0a 20 20  ext sNC;.    .  
8830: 20 20 2f 2a 20 47 65 74 20 61 6e 20 61 70 70 72    /* Get an appr
8840: 6f 70 72 69 61 74 65 20 6e 61 6d 65 20 66 6f 72  opriate name for
8850: 20 74 68 65 20 63 6f 6c 75 6d 6e 0a 20 20 20 20   the column.    
8860: 2a 2f 0a 20 20 20 20 70 20 3d 20 70 45 4c 69 73  */.    p = pELis
8870: 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 20  t->a[i].pExpr;. 
8880: 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 52     assert( p->pR
8890: 69 67 68 74 3d 3d 30 20 7c 7c 20 70 2d 3e 70 52  ight==0 || p->pR
88a0: 69 67 68 74 2d 3e 74 6f 6b 65 6e 2e 7a 3d 3d 30  ight->token.z==0
88b0: 20 7c 7c 20 70 2d 3e 70 52 69 67 68 74 2d 3e 74   || p->pRight->t
88c0: 6f 6b 65 6e 2e 7a 5b 30 5d 21 3d 30 20 29 3b 0a  oken.z[0]!=0 );.
88d0: 20 20 20 20 69 66 28 20 28 7a 4e 61 6d 65 20 3d      if( (zName =
88e0: 20 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e   pEList->a[i].zN
88f0: 61 6d 65 29 21 3d 30 20 29 7b 0a 20 20 20 20 20  ame)!=0 ){.     
8900: 20 2f 2a 20 49 66 20 74 68 65 20 63 6f 6c 75 6d   /* If the colum
8910: 6e 20 63 6f 6e 74 61 69 6e 73 20 61 6e 20 22 41  n contains an "A
8920: 53 20 3c 6e 61 6d 65 3e 22 20 70 68 72 61 73 65  S <name>" phrase
8930: 2c 20 75 73 65 20 3c 6e 61 6d 65 3e 20 61 73 20  , use <name> as 
8940: 74 68 65 20 6e 61 6d 65 20 2a 2f 0a 20 20 20 20  the name */.    
8950: 20 20 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65    zName = sqlite
8960: 53 74 72 44 75 70 28 7a 4e 61 6d 65 29 3b 0a 20  StrDup(zName);. 
8970: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 2d 3e     }else if( p->
8980: 6f 70 3d 3d 54 4b 5f 44 4f 54 20 0a 20 20 20 20  op==TK_DOT .    
8990: 20 20 20 20 20 20 20 20 20 20 26 26 20 28 70 52            && (pR
89a0: 3d 70 2d 3e 70 52 69 67 68 74 29 21 3d 30 20 26  =p->pRight)!=0 &
89b0: 26 20 70 52 2d 3e 74 6f 6b 65 6e 2e 7a 20 26 26  & pR->token.z &&
89c0: 20 70 52 2d 3e 74 6f 6b 65 6e 2e 7a 5b 30 5d 20   pR->token.z[0] 
89d0: 29 7b 0a 20 20 20 20 20 20 2f 2a 20 46 6f 72 20  ){.      /* For 
89e0: 63 6f 6c 75 6d 6e 73 20 6f 66 20 74 68 65 20 66  columns of the f
89f0: 72 6f 6d 20 41 2e 42 20 75 73 65 20 42 20 61 73  rom A.B use B as
8a00: 20 74 68 65 20 6e 61 6d 65 20 2a 2f 0a 20 20 20   the name */.   
8a10: 20 20 20 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74     zName = sqlit
8a20: 65 33 4d 50 72 69 6e 74 66 28 22 25 54 22 2c 20  e3MPrintf("%T", 
8a30: 26 70 52 2d 3e 74 6f 6b 65 6e 29 3b 0a 20 20 20  &pR->token);.   
8a40: 20 7d 65 6c 73 65 20 69 66 28 20 70 2d 3e 73 70   }else if( p->sp
8a50: 61 6e 2e 7a 20 26 26 20 70 2d 3e 73 70 61 6e 2e  an.z && p->span.
8a60: 7a 5b 30 5d 20 29 7b 0a 20 20 20 20 20 20 2f 2a  z[0] ){.      /*
8a70: 20 55 73 65 20 74 68 65 20 6f 72 69 67 69 6e 61   Use the origina
8a80: 6c 20 74 65 78 74 20 6f 66 20 74 68 65 20 63 6f  l text of the co
8a90: 6c 75 6d 6e 20 65 78 70 72 65 73 73 69 6f 6e 20  lumn expression 
8aa0: 61 73 20 69 74 73 20 6e 61 6d 65 20 2a 2f 0a 20  as its name */. 
8ab0: 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 73 71 6c       zName = sql
8ac0: 69 74 65 33 4d 50 72 69 6e 74 66 28 22 25 54 22  ite3MPrintf("%T"
8ad0: 2c 20 26 70 2d 3e 73 70 61 6e 29 3b 0a 20 20 20  , &p->span);.   
8ae0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a   }else{.      /*
8af0: 20 49 66 20 61 6c 6c 20 65 6c 73 65 20 66 61 69   If all else fai
8b00: 6c 73 2c 20 6d 61 6b 65 20 75 70 20 61 20 6e 61  ls, make up a na
8b10: 6d 65 20 2a 2f 0a 20 20 20 20 20 20 7a 4e 61 6d  me */.      zNam
8b20: 65 20 3d 20 73 71 6c 69 74 65 33 4d 50 72 69 6e  e = sqlite3MPrin
8b30: 74 66 28 22 63 6f 6c 75 6d 6e 25 64 22 2c 20 69  tf("column%d", i
8b40: 2b 31 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73  +1);.    }.    s
8b50: 71 6c 69 74 65 33 44 65 71 75 6f 74 65 28 7a 4e  qlite3Dequote(zN
8b60: 61 6d 65 29 3b 0a 20 20 20 20 69 66 28 20 73 71  ame);.    if( sq
8b70: 6c 69 74 65 33 4d 61 6c 6c 6f 63 46 61 69 6c 65  lite3MallocFaile
8b80: 64 28 29 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  d() ){.      sql
8b90: 69 74 65 46 72 65 65 28 7a 4e 61 6d 65 29 3b 0a  iteFree(zName);.
8ba0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 65 6c        sqlite3Del
8bb0: 65 74 65 54 61 62 6c 65 28 70 54 61 62 29 3b 0a  eteTable(pTab);.
8bc0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a        return 0;.
8bd0: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 4d 61      }..    /* Ma
8be0: 6b 65 20 73 75 72 65 20 74 68 65 20 63 6f 6c 75  ke sure the colu
8bf0: 6d 6e 20 6e 61 6d 65 20 69 73 20 75 6e 69 71 75  mn name is uniqu
8c00: 65 2e 20 20 49 66 20 74 68 65 20 6e 61 6d 65 20  e.  If the name 
8c10: 69 73 20 6e 6f 74 20 75 6e 69 71 75 65 2c 0a 20  is not unique,. 
8c20: 20 20 20 2a 2a 20 61 70 70 65 6e 64 20 61 20 69     ** append a i
8c30: 6e 74 65 67 65 72 20 74 6f 20 74 68 65 20 6e 61  nteger to the na
8c40: 6d 65 20 73 6f 20 74 68 61 74 20 69 74 20 62 65  me so that it be
8c50: 63 6f 6d 65 73 20 75 6e 69 71 75 65 2e 0a 20 20  comes unique..  
8c60: 20 20 2a 2f 0a 20 20 20 20 6e 4e 61 6d 65 20 3d    */.    nName =
8c70: 20 73 74 72 6c 65 6e 28 7a 4e 61 6d 65 29 3b 0a   strlen(zName);.
8c80: 20 20 20 20 66 6f 72 28 6a 3d 63 6e 74 3d 30 3b      for(j=cnt=0;
8c90: 20 6a 3c 69 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20   j<i; j++){.    
8ca0: 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 74 72    if( sqlite3Str
8cb0: 49 43 6d 70 28 61 43 6f 6c 5b 6a 5d 2e 7a 4e 61  ICmp(aCol[j].zNa
8cc0: 6d 65 2c 20 7a 4e 61 6d 65 29 3d 3d 30 20 29 7b  me, zName)==0 ){
8cd0: 0a 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 5b 6e  .        zName[n
8ce0: 4e 61 6d 65 5d 20 3d 20 30 3b 0a 20 20 20 20 20  Name] = 0;.     
8cf0: 20 20 20 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74     zName = sqlit
8d00: 65 33 4d 50 72 69 6e 74 66 28 22 25 7a 3a 25 64  e3MPrintf("%z:%d
8d10: 22 2c 20 7a 4e 61 6d 65 2c 20 2b 2b 63 6e 74 29  ", zName, ++cnt)
8d20: 3b 0a 20 20 20 20 20 20 20 20 6a 20 3d 20 2d 31  ;.        j = -1
8d30: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 7a 4e  ;.        if( zN
8d40: 61 6d 65 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a  ame==0 ) break;.
8d50: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
8d60: 20 20 70 43 6f 6c 2d 3e 7a 4e 61 6d 65 20 3d 20    pCol->zName = 
8d70: 7a 4e 61 6d 65 3b 0a 0a 20 20 20 20 2f 2a 20 47  zName;..    /* G
8d80: 65 74 20 74 68 65 20 74 79 70 65 6e 61 6d 65 2c  et the typename,
8d90: 20 74 79 70 65 20 61 66 66 69 6e 69 74 79 2c 20   type affinity, 
8da0: 61 6e 64 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65  and collating se
8db0: 71 75 65 6e 63 65 20 66 6f 72 20 74 68 65 0a 20  quence for the. 
8dc0: 20 20 20 2a 2a 20 63 6f 6c 75 6d 6e 2e 0a 20 20     ** column..  
8dd0: 20 20 2a 2f 0a 20 20 20 20 6d 65 6d 73 65 74 28    */.    memset(
8de0: 26 73 4e 43 2c 20 30 2c 20 73 69 7a 65 6f 66 28  &sNC, 0, sizeof(
8df0: 73 4e 43 29 29 3b 0a 20 20 20 20 73 4e 43 2e 70  sNC));.    sNC.p
8e00: 53 72 63 4c 69 73 74 20 3d 20 70 53 65 6c 65 63  SrcList = pSelec
8e10: 74 2d 3e 70 53 72 63 3b 0a 20 20 20 20 7a 54 79  t->pSrc;.    zTy
8e20: 70 65 20 3d 20 73 71 6c 69 74 65 53 74 72 44 75  pe = sqliteStrDu
8e30: 70 28 63 6f 6c 75 6d 6e 54 79 70 65 28 26 73 4e  p(columnType(&sN
8e40: 43 2c 20 70 2c 20 30 2c 20 30 2c 20 30 29 29 3b  C, p, 0, 0, 0));
8e50: 0a 20 20 20 20 70 43 6f 6c 2d 3e 7a 54 79 70 65  .    pCol->zType
8e60: 20 3d 20 7a 54 79 70 65 3b 0a 20 20 20 20 70 43   = zType;.    pC
8e70: 6f 6c 2d 3e 61 66 66 69 6e 69 74 79 20 3d 20 73  ol->affinity = s
8e80: 71 6c 69 74 65 33 45 78 70 72 41 66 66 69 6e 69  qlite3ExprAffini
8e90: 74 79 28 70 29 3b 0a 20 20 20 20 70 43 6f 6c 6c  ty(p);.    pColl
8ea0: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f   = sqlite3ExprCo
8eb0: 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70 29  llSeq(pParse, p)
8ec0: 3b 0a 20 20 20 20 69 66 28 20 70 43 6f 6c 6c 20  ;.    if( pColl 
8ed0: 29 7b 0a 20 20 20 20 20 20 70 43 6f 6c 2d 3e 7a  ){.      pCol->z
8ee0: 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 53 74 72  Coll = sqliteStr
8ef0: 44 75 70 28 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65  Dup(pColl->zName
8f00: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70  );.    }.  }.  p
8f10: 54 61 62 2d 3e 69 50 4b 65 79 20 3d 20 2d 31 3b  Tab->iPKey = -1;
8f20: 0a 20 20 72 65 74 75 72 6e 20 70 54 61 62 3b 0a  .  return pTab;.
8f30: 7d 0a 0a 2f 2a 0a 2a 2a 20 50 72 65 70 61 72 65  }../*.** Prepare
8f40: 20 61 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d   a SELECT statem
8f50: 65 6e 74 20 66 6f 72 20 70 72 6f 63 65 73 73 69  ent for processi
8f60: 6e 67 20 62 79 20 64 6f 69 6e 67 20 74 68 65 20  ng by doing the 
8f70: 66 6f 6c 6c 6f 77 69 6e 67 0a 2a 2a 20 74 68 69  following.** thi
8f80: 6e 67 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 28 31  ngs:.**.**    (1
8f90: 29 20 20 4d 61 6b 65 20 73 75 72 65 20 56 44 42  )  Make sure VDB
8fa0: 45 20 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 73  E cursor numbers
8fb0: 20 68 61 76 65 20 62 65 65 6e 20 61 73 73 69 67   have been assig
8fc0: 6e 65 64 20 74 6f 20 65 76 65 72 79 0a 2a 2a 20  ned to every.** 
8fd0: 20 20 20 20 20 20 20 20 65 6c 65 6d 65 6e 74 20          element 
8fe0: 6f 66 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75  of the FROM clau
8ff0: 73 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 28 32 29  se..**.**    (2)
9000: 20 20 46 69 6c 6c 20 69 6e 20 74 68 65 20 70 54    Fill in the pT
9010: 61 62 4c 69 73 74 2d 3e 61 5b 5d 2e 70 54 61 62  abList->a[].pTab
9020: 20 66 69 65 6c 64 73 20 69 6e 20 74 68 65 20 53   fields in the S
9030: 72 63 4c 69 73 74 20 74 68 61 74 20 0a 2a 2a 20  rcList that .** 
9040: 20 20 20 20 20 20 20 20 64 65 66 69 6e 65 73 20          defines 
9050: 46 52 4f 4d 20 63 6c 61 75 73 65 2e 20 20 57 68  FROM clause.  Wh
9060: 65 6e 20 76 69 65 77 73 20 61 70 70 65 61 72 20  en views appear 
9070: 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75  in the FROM clau
9080: 73 65 2c 0a 2a 2a 20 20 20 20 20 20 20 20 20 66  se,.**         f
9090: 69 6c 6c 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b  ill pTabList->a[
90a0: 5d 2e 70 53 65 6c 65 63 74 20 77 69 74 68 20 61  ].pSelect with a
90b0: 20 63 6f 70 79 20 6f 66 20 74 68 65 20 53 45 4c   copy of the SEL
90c0: 45 43 54 20 73 74 61 74 65 6d 65 6e 74 0a 2a 2a  ECT statement.**
90d0: 20 20 20 20 20 20 20 20 20 74 68 61 74 20 69 6d           that im
90e0: 70 6c 65 6d 65 6e 74 73 20 74 68 65 20 76 69 65  plements the vie
90f0: 77 2e 20 20 41 20 63 6f 70 79 20 69 73 20 6d 61  w.  A copy is ma
9100: 64 65 20 6f 66 20 74 68 65 20 76 69 65 77 27 73  de of the view's
9110: 20 53 45 4c 45 43 54 0a 2a 2a 20 20 20 20 20 20   SELECT.**      
9120: 20 20 20 73 74 61 74 65 6d 65 6e 74 20 73 6f 20     statement so 
9130: 74 68 61 74 20 77 65 20 63 61 6e 20 66 72 65 65  that we can free
9140: 6c 79 20 6d 6f 64 69 66 79 20 6f 72 20 64 65 6c  ly modify or del
9150: 65 74 65 20 74 68 61 74 20 73 74 61 74 65 6d 65  ete that stateme
9160: 6e 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 77 69  nt.**         wi
9170: 74 68 6f 75 74 20 77 6f 72 72 79 69 6e 67 20 61  thout worrying a
9180: 62 6f 75 74 20 6d 65 73 73 69 6e 67 20 75 70 20  bout messing up 
9190: 74 68 65 20 70 72 65 73 69 73 74 65 6e 74 20 72  the presistent r
91a0: 65 70 72 65 73 65 6e 74 61 74 69 6f 6e 0a 2a 2a  epresentation.**
91b0: 20 20 20 20 20 20 20 20 20 6f 66 20 74 68 65 20           of the 
91c0: 76 69 65 77 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 28  view..**.**    (
91d0: 33 29 20 20 41 64 64 20 74 65 72 6d 73 20 74 6f  3)  Add terms to
91e0: 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73   the WHERE claus
91f0: 65 20 74 6f 20 61 63 63 6f 6d 6f 64 61 74 65 20  e to accomodate 
9200: 74 68 65 20 4e 41 54 55 52 41 4c 20 6b 65 79 77  the NATURAL keyw
9210: 6f 72 64 0a 2a 2a 20 20 20 20 20 20 20 20 20 6f  ord.**         o
9220: 6e 20 6a 6f 69 6e 73 20 61 6e 64 20 74 68 65 20  n joins and the 
9230: 4f 4e 20 61 6e 64 20 55 53 49 4e 47 20 63 6c 61  ON and USING cla
9240: 75 73 65 20 6f 66 20 6a 6f 69 6e 73 2e 0a 2a 2a  use of joins..**
9250: 0a 2a 2a 20 20 20 20 28 34 29 20 20 53 63 61 6e  .**    (4)  Scan
9260: 20 74 68 65 20 6c 69 73 74 20 6f 66 20 63 6f 6c   the list of col
9270: 75 6d 6e 73 20 69 6e 20 74 68 65 20 72 65 73 75  umns in the resu
9280: 6c 74 20 73 65 74 20 28 70 45 4c 69 73 74 29 20  lt set (pEList) 
9290: 6c 6f 6f 6b 69 6e 67 0a 2a 2a 20 20 20 20 20 20  looking.**      
92a0: 20 20 20 66 6f 72 20 69 6e 73 74 61 6e 63 65 73     for instances
92b0: 20 6f 66 20 74 68 65 20 22 2a 22 20 6f 70 65 72   of the "*" oper
92c0: 61 74 6f 72 20 6f 72 20 74 68 65 20 54 41 42 4c  ator or the TABL
92d0: 45 2e 2a 20 6f 70 65 72 61 74 6f 72 2e 0a 2a 2a  E.* operator..**
92e0: 20 20 20 20 20 20 20 20 20 49 66 20 66 6f 75 6e           If foun
92f0: 64 2c 20 65 78 70 61 6e 64 20 65 61 63 68 20 22  d, expand each "
9300: 2a 22 20 74 6f 20 62 65 20 65 76 65 72 79 20 63  *" to be every c
9310: 6f 6c 75 6d 6e 20 69 6e 20 65 76 65 72 79 20 74  olumn in every t
9320: 61 62 6c 65 0a 2a 2a 20 20 20 20 20 20 20 20 20  able.**         
9330: 61 6e 64 20 54 41 42 4c 45 2e 2a 20 74 6f 20 62  and TABLE.* to b
9340: 65 20 65 76 65 72 79 20 63 6f 6c 75 6d 6e 20 69  e every column i
9350: 6e 20 54 41 42 4c 45 2e 0a 2a 2a 0a 2a 2a 20 52  n TABLE..**.** R
9360: 65 74 75 72 6e 20 30 20 6f 6e 20 73 75 63 63 65  eturn 0 on succe
9370: 73 73 2e 20 20 49 66 20 74 68 65 72 65 20 61 72  ss.  If there ar
9380: 65 20 70 72 6f 62 6c 65 6d 73 2c 20 6c 65 61 76  e problems, leav
9390: 65 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61  e an error messa
93a0: 67 65 0a 2a 2a 20 69 6e 20 70 50 61 72 73 65 20  ge.** in pParse 
93b0: 61 6e 64 20 72 65 74 75 72 6e 20 6e 6f 6e 2d 7a  and return non-z
93c0: 65 72 6f 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ero..*/.static i
93d0: 6e 74 20 70 72 65 70 53 65 6c 65 63 74 53 74 6d  nt prepSelectStm
93e0: 74 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  t(Parse *pParse,
93f0: 20 53 65 6c 65 63 74 20 2a 70 29 7b 0a 20 20 69   Select *p){.  i
9400: 6e 74 20 69 2c 20 6a 2c 20 6b 2c 20 72 63 3b 0a  nt i, j, k, rc;.
9410: 20 20 53 72 63 4c 69 73 74 20 2a 70 54 61 62 4c    SrcList *pTabL
9420: 69 73 74 3b 0a 20 20 45 78 70 72 4c 69 73 74 20  ist;.  ExprList 
9430: 2a 70 45 4c 69 73 74 3b 0a 20 20 73 74 72 75 63  *pEList;.  struc
9440: 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a  t SrcList_item *
9450: 70 46 72 6f 6d 3b 0a 0a 20 20 69 66 28 20 70 3d  pFrom;..  if( p=
9460: 3d 30 20 7c 7c 20 70 2d 3e 70 53 72 63 3d 3d 30  =0 || p->pSrc==0
9470: 20 7c 7c 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f   || sqlite3Mallo
9480: 63 46 61 69 6c 65 64 28 29 20 29 7b 0a 20 20 20  cFailed() ){.   
9490: 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20   return 1;.  }. 
94a0: 20 70 54 61 62 4c 69 73 74 20 3d 20 70 2d 3e 70   pTabList = p->p
94b0: 53 72 63 3b 0a 20 20 70 45 4c 69 73 74 20 3d 20  Src;.  pEList = 
94c0: 70 2d 3e 70 45 4c 69 73 74 3b 0a 0a 20 20 2f 2a  p->pEList;..  /*
94d0: 20 4d 61 6b 65 20 73 75 72 65 20 63 75 72 73 6f   Make sure curso
94e0: 72 20 6e 75 6d 62 65 72 73 20 68 61 76 65 20 62  r numbers have b
94f0: 65 65 6e 20 61 73 73 69 67 6e 65 64 20 74 6f 20  een assigned to 
9500: 61 6c 6c 20 65 6e 74 72 69 65 73 20 69 6e 0a 20  all entries in. 
9510: 20 2a 2a 20 74 68 65 20 46 52 4f 4d 20 63 6c 61   ** the FROM cla
9520: 75 73 65 20 6f 66 20 74 68 65 20 53 45 4c 45 43  use of the SELEC
9530: 54 20 73 74 61 74 65 6d 65 6e 74 2e 0a 20 20 2a  T statement..  *
9540: 2f 0a 20 20 73 71 6c 69 74 65 33 53 72 63 4c 69  /.  sqlite3SrcLi
9550: 73 74 41 73 73 69 67 6e 43 75 72 73 6f 72 73 28  stAssignCursors(
9560: 70 50 61 72 73 65 2c 20 70 2d 3e 70 53 72 63 29  pParse, p->pSrc)
9570: 3b 0a 0a 20 20 2f 2a 20 4c 6f 6f 6b 20 75 70 20  ;..  /* Look up 
9580: 65 76 65 72 79 20 74 61 62 6c 65 20 6e 61 6d 65  every table name
9590: 64 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c  d in the FROM cl
95a0: 61 75 73 65 20 6f 66 20 74 68 65 20 73 65 6c 65  ause of the sele
95b0: 63 74 2e 20 20 49 66 0a 20 20 2a 2a 20 61 6e 20  ct.  If.  ** an 
95c0: 65 6e 74 72 79 20 6f 66 20 74 68 65 20 46 52 4f  entry of the FRO
95d0: 4d 20 63 6c 61 75 73 65 20 69 73 20 61 20 73 75  M clause is a su
95e0: 62 71 75 65 72 79 20 69 6e 73 74 65 61 64 20 6f  bquery instead o
95f0: 66 20 61 20 74 61 62 6c 65 20 6f 72 20 76 69 65  f a table or vie
9600: 77 2c 0a 20 20 2a 2a 20 74 68 65 6e 20 63 72 65  w,.  ** then cre
9610: 61 74 65 20 61 20 74 72 61 6e 73 69 65 6e 74 20  ate a transient 
9620: 74 61 62 6c 65 20 73 74 72 75 63 74 75 72 65 20  table structure 
9630: 74 6f 20 64 65 73 63 72 69 62 65 20 74 68 65 20  to describe the 
9640: 73 75 62 71 75 65 72 79 2e 0a 20 20 2a 2f 0a 20  subquery..  */. 
9650: 20 66 6f 72 28 69 3d 30 2c 20 70 46 72 6f 6d 3d   for(i=0, pFrom=
9660: 70 54 61 62 4c 69 73 74 2d 3e 61 3b 20 69 3c 70  pTabList->a; i<p
9670: 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3b 20 69  TabList->nSrc; i
9680: 2b 2b 2c 20 70 46 72 6f 6d 2b 2b 29 7b 0a 20 20  ++, pFrom++){.  
9690: 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20    Table *pTab;. 
96a0: 20 20 20 69 66 28 20 70 46 72 6f 6d 2d 3e 70 54     if( pFrom->pT
96b0: 61 62 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 2f  ab!=0 ){.      /
96c0: 2a 20 54 68 69 73 20 73 74 61 74 65 6d 65 6e 74  * This statement
96d0: 20 68 61 73 20 61 6c 72 65 61 64 79 20 62 65 65   has already bee
96e0: 6e 20 70 72 65 70 61 72 65 64 2e 20 20 54 68 65  n prepared.  The
96f0: 72 65 20 69 73 20 6e 6f 20 6e 65 65 64 0a 20 20  re is no need.  
9700: 20 20 20 20 2a 2a 20 74 6f 20 67 6f 20 66 75 72      ** to go fur
9710: 74 68 65 72 2e 20 2a 2f 0a 20 20 20 20 20 20 61  ther. */.      a
9720: 73 73 65 72 74 28 20 69 3d 3d 30 20 29 3b 0a 20  ssert( i==0 );. 
9730: 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20       return 0;. 
9740: 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 46 72     }.    if( pFr
9750: 6f 6d 2d 3e 7a 4e 61 6d 65 3d 3d 30 20 29 7b 0a  om->zName==0 ){.
9760: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
9770: 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 20 20 20  MIT_SUBQUERY.   
9780: 20 20 20 2f 2a 20 41 20 73 75 62 2d 71 75 65 72     /* A sub-quer
9790: 79 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c  y in the FROM cl
97a0: 61 75 73 65 20 6f 66 20 61 20 53 45 4c 45 43 54  ause of a SELECT
97b0: 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74   */.      assert
97c0: 28 20 70 46 72 6f 6d 2d 3e 70 53 65 6c 65 63 74  ( pFrom->pSelect
97d0: 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 69 66 28  !=0 );.      if(
97e0: 20 70 46 72 6f 6d 2d 3e 7a 41 6c 69 61 73 3d 3d   pFrom->zAlias==
97f0: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70 46 72  0 ){.        pFr
9800: 6f 6d 2d 3e 7a 41 6c 69 61 73 20 3d 0a 20 20 20  om->zAlias =.   
9810: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 4d 50         sqlite3MP
9820: 72 69 6e 74 66 28 22 73 71 6c 69 74 65 5f 73 75  rintf("sqlite_su
9830: 62 71 75 65 72 79 5f 25 70 5f 22 2c 20 28 76 6f  bquery_%p_", (vo
9840: 69 64 2a 29 70 46 72 6f 6d 2d 3e 70 53 65 6c 65  id*)pFrom->pSele
9850: 63 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ct);.      }.   
9860: 20 20 20 61 73 73 65 72 74 28 20 70 46 72 6f 6d     assert( pFrom
9870: 2d 3e 70 54 61 62 3d 3d 30 20 29 3b 0a 20 20 20  ->pTab==0 );.   
9880: 20 20 20 70 46 72 6f 6d 2d 3e 70 54 61 62 20 3d     pFrom->pTab =
9890: 20 70 54 61 62 20 3d 20 0a 20 20 20 20 20 20 20   pTab = .       
98a0: 20 73 71 6c 69 74 65 33 52 65 73 75 6c 74 53 65   sqlite3ResultSe
98b0: 74 4f 66 53 65 6c 65 63 74 28 70 50 61 72 73 65  tOfSelect(pParse
98c0: 2c 20 70 46 72 6f 6d 2d 3e 7a 41 6c 69 61 73 2c  , pFrom->zAlias,
98d0: 20 70 46 72 6f 6d 2d 3e 70 53 65 6c 65 63 74 29   pFrom->pSelect)
98e0: 3b 0a 20 20 20 20 20 20 69 66 28 20 70 54 61 62  ;.      if( pTab
98f0: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 72  ==0 ){.        r
9900: 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 20 20 7d  eturn 1;.      }
9910: 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20 69 73  .      /* The is
9920: 45 70 68 65 6d 20 66 6c 61 67 20 69 6e 64 69 63  Ephem flag indic
9930: 61 74 65 73 20 74 68 61 74 20 74 68 65 20 54 61  ates that the Ta
9940: 62 6c 65 20 73 74 72 75 63 74 75 72 65 20 68 61  ble structure ha
9950: 73 20 62 65 65 6e 0a 20 20 20 20 20 20 2a 2a 20  s been.      ** 
9960: 64 79 6e 61 6d 69 63 61 6c 6c 79 20 61 6c 6c 6f  dynamically allo
9970: 63 61 74 65 64 20 61 6e 64 20 6d 61 79 20 62 65  cated and may be
9980: 20 66 72 65 65 64 20 61 74 20 61 6e 79 20 74 69   freed at any ti
9990: 6d 65 2e 20 20 49 6e 20 6f 74 68 65 72 20 77 6f  me.  In other wo
99a0: 72 64 73 2c 0a 20 20 20 20 20 20 2a 2a 20 70 54  rds,.      ** pT
99b0: 61 62 20 69 73 20 6e 6f 74 20 70 6f 69 6e 74 69  ab is not pointi
99c0: 6e 67 20 74 6f 20 61 20 70 65 72 73 69 73 74 65  ng to a persiste
99d0: 6e 74 20 74 61 62 6c 65 20 73 74 72 75 63 74 75  nt table structu
99e0: 72 65 20 74 68 61 74 20 64 65 66 69 6e 65 73 0a  re that defines.
99f0: 20 20 20 20 20 20 2a 2a 20 70 61 72 74 20 6f 66        ** part of
9a00: 20 74 68 65 20 73 63 68 65 6d 61 2e 20 2a 2f 0a   the schema. */.
9a10: 20 20 20 20 20 20 70 54 61 62 2d 3e 69 73 45 70        pTab->isEp
9a20: 68 65 6d 20 3d 20 31 3b 0a 23 65 6e 64 69 66 0a  hem = 1;.#endif.
9a30: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
9a40: 20 2f 2a 20 41 6e 20 6f 72 64 69 6e 61 72 79 20   /* An ordinary 
9a50: 74 61 62 6c 65 20 6f 72 20 76 69 65 77 20 6e 61  table or view na
9a60: 6d 65 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63  me in the FROM c
9a70: 6c 61 75 73 65 20 2a 2f 0a 20 20 20 20 20 20 61  lause */.      a
9a80: 73 73 65 72 74 28 20 70 46 72 6f 6d 2d 3e 70 54  ssert( pFrom->pT
9a90: 61 62 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 70  ab==0 );.      p
9aa0: 46 72 6f 6d 2d 3e 70 54 61 62 20 3d 20 70 54 61  From->pTab = pTa
9ab0: 62 20 3d 20 0a 20 20 20 20 20 20 20 20 73 71 6c  b = .        sql
9ac0: 69 74 65 33 4c 6f 63 61 74 65 54 61 62 6c 65 28  ite3LocateTable(
9ad0: 70 50 61 72 73 65 2c 70 46 72 6f 6d 2d 3e 7a 4e  pParse,pFrom->zN
9ae0: 61 6d 65 2c 70 46 72 6f 6d 2d 3e 7a 44 61 74 61  ame,pFrom->zData
9af0: 62 61 73 65 29 3b 0a 20 20 20 20 20 20 69 66 28  base);.      if(
9b00: 20 70 54 61 62 3d 3d 30 20 29 7b 0a 20 20 20 20   pTab==0 ){.    
9b10: 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20      return 1;.  
9b20: 20 20 20 20 7d 0a 20 20 20 20 20 20 70 54 61 62      }.      pTab
9b30: 2d 3e 6e 52 65 66 2b 2b 3b 0a 23 69 66 20 21 64  ->nRef++;.#if !d
9b40: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
9b50: 49 54 5f 56 49 45 57 29 20 7c 7c 20 21 64 65 66  IT_VIEW) || !def
9b60: 69 6e 65 64 20 28 53 51 4c 49 54 45 5f 4f 4d 49  ined (SQLITE_OMI
9b70: 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 29 0a  T_VIRTUALTABLE).
9b80: 20 20 20 20 20 20 69 66 28 20 70 54 61 62 2d 3e        if( pTab->
9b90: 70 53 65 6c 65 63 74 20 7c 7c 20 49 73 56 69 72  pSelect || IsVir
9ba0: 74 75 61 6c 28 70 54 61 62 29 20 29 7b 0a 20 20  tual(pTab) ){.  
9bb0: 20 20 20 20 20 20 2f 2a 20 57 65 20 72 65 61 63        /* We reac
9bc0: 68 20 68 65 72 65 20 69 66 20 74 68 65 20 6e 61  h here if the na
9bd0: 6d 65 64 20 74 61 62 6c 65 20 69 73 20 61 20 72  med table is a r
9be0: 65 61 6c 6c 79 20 61 20 76 69 65 77 20 2a 2f 0a  eally a view */.
9bf0: 20 20 20 20 20 20 20 20 69 66 28 20 73 71 6c 69          if( sqli
9c00: 74 65 33 56 69 65 77 47 65 74 43 6f 6c 75 6d 6e  te3ViewGetColumn
9c10: 4e 61 6d 65 73 28 70 50 61 72 73 65 2c 20 70 54  Names(pParse, pT
9c20: 61 62 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ab) ){.         
9c30: 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 20   return 1;.     
9c40: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 2f 2a 20     }.        /* 
9c50: 49 66 20 70 46 72 6f 6d 2d 3e 70 53 65 6c 65 63  If pFrom->pSelec
9c60: 74 21 3d 30 20 69 74 20 6d 65 61 6e 73 20 77 65  t!=0 it means we
9c70: 20 61 72 65 20 64 65 61 6c 69 6e 67 20 77 69 74   are dealing wit
9c80: 68 20 61 0a 20 20 20 20 20 20 20 20 2a 2a 20 76  h a.        ** v
9c90: 69 65 77 20 77 69 74 68 69 6e 20 61 20 76 69 65  iew within a vie
9ca0: 77 2e 20 20 54 68 65 20 53 45 4c 45 43 54 20 73  w.  The SELECT s
9cb0: 74 72 75 63 74 75 72 65 20 68 61 73 20 61 6c 72  tructure has alr
9cc0: 65 61 64 79 20 62 65 65 6e 0a 20 20 20 20 20 20  eady been.      
9cd0: 20 20 2a 2a 20 63 6f 70 69 65 64 20 62 79 20 74    ** copied by t
9ce0: 68 65 20 6f 75 74 65 72 20 76 69 65 77 20 73 6f  he outer view so
9cf0: 20 77 65 20 63 61 6e 20 73 6b 69 70 20 74 68 65   we can skip the
9d00: 20 63 6f 70 79 20 73 74 65 70 20 68 65 72 65 0a   copy step here.
9d10: 20 20 20 20 20 20 20 20 2a 2a 20 69 6e 20 74 68          ** in th
9d20: 65 20 69 6e 6e 65 72 20 76 69 65 77 2e 0a 20 20  e inner view..  
9d30: 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
9d40: 20 69 66 28 20 70 46 72 6f 6d 2d 3e 70 53 65 6c   if( pFrom->pSel
9d50: 65 63 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ect==0 ){.      
9d60: 20 20 20 20 70 46 72 6f 6d 2d 3e 70 53 65 6c 65      pFrom->pSele
9d70: 63 74 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65  ct = sqlite3Sele
9d80: 63 74 44 75 70 28 70 54 61 62 2d 3e 70 53 65 6c  ctDup(pTab->pSel
9d90: 65 63 74 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  ect);.        }.
9da0: 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20        }.#endif. 
9db0: 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 50     }.  }..  /* P
9dc0: 72 6f 63 65 73 73 20 4e 41 54 55 52 41 4c 20 6b  rocess NATURAL k
9dd0: 65 79 77 6f 72 64 73 2c 20 61 6e 64 20 4f 4e 20  eywords, and ON 
9de0: 61 6e 64 20 55 53 49 4e 47 20 63 6c 61 75 73 65  and USING clause
9df0: 73 20 6f 66 20 6a 6f 69 6e 73 2e 0a 20 20 2a 2f  s of joins..  */
9e00: 0a 20 20 69 66 28 20 73 71 6c 69 74 65 50 72 6f  .  if( sqlitePro
9e10: 63 65 73 73 4a 6f 69 6e 28 70 50 61 72 73 65 2c  cessJoin(pParse,
9e20: 20 70 29 20 29 20 72 65 74 75 72 6e 20 31 3b 0a   p) ) return 1;.
9e30: 0a 20 20 2f 2a 20 46 6f 72 20 65 76 65 72 79 20  .  /* For every 
9e40: 22 2a 22 20 74 68 61 74 20 6f 63 63 75 72 73 20  "*" that occurs 
9e50: 69 6e 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6c 69  in the column li
9e60: 73 74 2c 20 69 6e 73 65 72 74 20 74 68 65 20 6e  st, insert the n
9e70: 61 6d 65 73 20 6f 66 0a 20 20 2a 2a 20 61 6c 6c  ames of.  ** all
9e80: 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 61 6c 6c 20   columns in all 
9e90: 74 61 62 6c 65 73 2e 20 20 41 6e 64 20 66 6f 72  tables.  And for
9ea0: 20 65 76 65 72 79 20 54 41 42 4c 45 2e 2a 20 69   every TABLE.* i
9eb0: 6e 73 65 72 74 20 74 68 65 20 6e 61 6d 65 73 0a  nsert the names.
9ec0: 20 20 2a 2a 20 6f 66 20 61 6c 6c 20 63 6f 6c 75    ** of all colu
9ed0: 6d 6e 73 20 69 6e 20 54 41 42 4c 45 2e 20 20 54  mns in TABLE.  T
9ee0: 68 65 20 70 61 72 73 65 72 20 69 6e 73 65 72 74  he parser insert
9ef0: 65 64 20 61 20 73 70 65 63 69 61 6c 20 65 78 70  ed a special exp
9f00: 72 65 73 73 69 6f 6e 0a 20 20 2a 2a 20 77 69 74  ression.  ** wit
9f10: 68 20 74 68 65 20 54 4b 5f 41 4c 4c 20 6f 70 65  h the TK_ALL ope
9f20: 72 61 74 6f 72 20 66 6f 72 20 65 61 63 68 20 22  rator for each "
9f30: 2a 22 20 74 68 61 74 20 69 74 20 66 6f 75 6e 64  *" that it found
9f40: 20 69 6e 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6c   in the column l
9f50: 69 73 74 2e 0a 20 20 2a 2a 20 54 68 65 20 66 6f  ist..  ** The fo
9f60: 6c 6c 6f 77 69 6e 67 20 63 6f 64 65 20 6a 75 73  llowing code jus
9f70: 74 20 68 61 73 20 74 6f 20 6c 6f 63 61 74 65 20  t has to locate 
9f80: 74 68 65 20 54 4b 5f 41 4c 4c 20 65 78 70 72 65  the TK_ALL expre
9f90: 73 73 69 6f 6e 73 20 61 6e 64 20 65 78 70 61 6e  ssions and expan
9fa0: 64 0a 20 20 2a 2a 20 65 61 63 68 20 6f 6e 65 20  d.  ** each one 
9fb0: 74 6f 20 74 68 65 20 6c 69 73 74 20 6f 66 20 61  to the list of a
9fc0: 6c 6c 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 61 6c  ll columns in al
9fd0: 6c 20 74 61 62 6c 65 73 2e 0a 20 20 2a 2a 0a 20  l tables..  **. 
9fe0: 20 2a 2a 20 54 68 65 20 66 69 72 73 74 20 6c 6f   ** The first lo
9ff0: 6f 70 20 6a 75 73 74 20 63 68 65 63 6b 73 20 74  op just checks t
a000: 6f 20 73 65 65 20 69 66 20 74 68 65 72 65 20 61  o see if there a
a010: 72 65 20 61 6e 79 20 22 2a 22 20 6f 70 65 72 61  re any "*" opera
a020: 74 6f 72 73 0a 20 20 2a 2a 20 74 68 61 74 20 6e  tors.  ** that n
a030: 65 65 64 20 65 78 70 61 6e 64 69 6e 67 2e 0a 20  eed expanding.. 
a040: 20 2a 2f 0a 20 20 66 6f 72 28 6b 3d 30 3b 20 6b   */.  for(k=0; k
a050: 3c 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20  <pEList->nExpr; 
a060: 6b 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72 20 2a  k++){.    Expr *
a070: 70 45 20 3d 20 70 45 4c 69 73 74 2d 3e 61 5b 6b  pE = pEList->a[k
a080: 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 69 66 28  ].pExpr;.    if(
a090: 20 70 45 2d 3e 6f 70 3d 3d 54 4b 5f 41 4c 4c 20   pE->op==TK_ALL 
a0a0: 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 69 66 28  ) break;.    if(
a0b0: 20 70 45 2d 3e 6f 70 3d 3d 54 4b 5f 44 4f 54 20   pE->op==TK_DOT 
a0c0: 26 26 20 70 45 2d 3e 70 52 69 67 68 74 20 26 26  && pE->pRight &&
a0d0: 20 70 45 2d 3e 70 52 69 67 68 74 2d 3e 6f 70 3d   pE->pRight->op=
a0e0: 3d 54 4b 5f 41 4c 4c 0a 20 20 20 20 20 20 20 20  =TK_ALL.        
a0f0: 20 26 26 20 70 45 2d 3e 70 4c 65 66 74 20 26 26   && pE->pLeft &&
a100: 20 70 45 2d 3e 70 4c 65 66 74 2d 3e 6f 70 3d 3d   pE->pLeft->op==
a110: 54 4b 5f 49 44 20 29 20 62 72 65 61 6b 3b 0a 20  TK_ID ) break;. 
a120: 20 7d 0a 20 20 72 63 20 3d 20 30 3b 0a 20 20 69   }.  rc = 0;.  i
a130: 66 28 20 6b 3c 70 45 4c 69 73 74 2d 3e 6e 45 78  f( k<pEList->nEx
a140: 70 72 20 29 7b 0a 20 20 20 20 2f 2a 0a 20 20 20  pr ){.    /*.   
a150: 20 2a 2a 20 49 66 20 77 65 20 67 65 74 20 68 65   ** If we get he
a160: 72 65 20 69 74 20 6d 65 61 6e 73 20 74 68 65 20  re it means the 
a170: 72 65 73 75 6c 74 20 73 65 74 20 63 6f 6e 74 61  result set conta
a180: 69 6e 73 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20  ins one or more 
a190: 22 2a 22 0a 20 20 20 20 2a 2a 20 6f 70 65 72 61  "*".    ** opera
a1a0: 74 6f 72 73 20 74 68 61 74 20 6e 65 65 64 20 74  tors that need t
a1b0: 6f 20 62 65 20 65 78 70 61 6e 64 65 64 2e 20 20  o be expanded.  
a1c0: 4c 6f 6f 70 20 74 68 72 6f 75 67 68 20 65 61 63  Loop through eac
a1d0: 68 20 65 78 70 72 65 73 73 69 6f 6e 0a 20 20 20  h expression.   
a1e0: 20 2a 2a 20 69 6e 20 74 68 65 20 72 65 73 75 6c   ** in the resul
a1f0: 74 20 73 65 74 20 61 6e 64 20 65 78 70 61 6e 64  t set and expand
a200: 20 74 68 65 6d 20 6f 6e 65 20 62 79 20 6f 6e 65   them one by one
a210: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73 74 72  ..    */.    str
a220: 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65  uct ExprList_ite
a230: 6d 20 2a 61 20 3d 20 70 45 4c 69 73 74 2d 3e 61  m *a = pEList->a
a240: 3b 0a 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a  ;.    ExprList *
a250: 70 4e 65 77 20 3d 20 30 3b 0a 20 20 20 20 69 6e  pNew = 0;.    in
a260: 74 20 66 6c 61 67 73 20 3d 20 70 50 61 72 73 65  t flags = pParse
a270: 2d 3e 64 62 2d 3e 66 6c 61 67 73 3b 0a 20 20 20  ->db->flags;.   
a280: 20 69 6e 74 20 6c 6f 6e 67 4e 61 6d 65 73 20 3d   int longNames =
a290: 20 28 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45   (flags & SQLITE
a2a0: 5f 46 75 6c 6c 43 6f 6c 4e 61 6d 65 73 29 21 3d  _FullColNames)!=
a2b0: 30 20 26 26 0a 20 20 20 20 20 20 20 20 20 20 20  0 &&.           
a2c0: 20 20 20 20 20 20 20 20 20 20 20 28 66 6c 61 67             (flag
a2d0: 73 20 26 20 53 51 4c 49 54 45 5f 53 68 6f 72 74  s & SQLITE_Short
a2e0: 43 6f 6c 4e 61 6d 65 73 29 3d 3d 30 3b 0a 0a 20  ColNames)==0;.. 
a2f0: 20 20 20 66 6f 72 28 6b 3d 30 3b 20 6b 3c 70 45     for(k=0; k<pE
a300: 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 6b 2b 2b  List->nExpr; k++
a310: 29 7b 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70  ){.      Expr *p
a320: 45 20 3d 20 61 5b 6b 5d 2e 70 45 78 70 72 3b 0a  E = a[k].pExpr;.
a330: 20 20 20 20 20 20 69 66 28 20 70 45 2d 3e 6f 70        if( pE->op
a340: 21 3d 54 4b 5f 41 4c 4c 20 26 26 0a 20 20 20 20  !=TK_ALL &&.    
a350: 20 20 20 20 20 20 20 28 70 45 2d 3e 6f 70 21 3d         (pE->op!=
a360: 54 4b 5f 44 4f 54 20 7c 7c 20 70 45 2d 3e 70 52  TK_DOT || pE->pR
a370: 69 67 68 74 3d 3d 30 20 7c 7c 20 70 45 2d 3e 70  ight==0 || pE->p
a380: 52 69 67 68 74 2d 3e 6f 70 21 3d 54 4b 5f 41 4c  Right->op!=TK_AL
a390: 4c 29 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a  L) ){.        /*
a3a0: 20 54 68 69 73 20 70 61 72 74 69 63 75 6c 61 72   This particular
a3b0: 20 65 78 70 72 65 73 73 69 6f 6e 20 64 6f 65 73   expression does
a3c0: 20 6e 6f 74 20 6e 65 65 64 20 74 6f 20 62 65 20   not need to be 
a3d0: 65 78 70 61 6e 64 65 64 2e 0a 20 20 20 20 20 20  expanded..      
a3e0: 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 70 4e 65    */.        pNe
a3f0: 77 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c  w = sqlite3ExprL
a400: 69 73 74 41 70 70 65 6e 64 28 70 4e 65 77 2c 20  istAppend(pNew, 
a410: 61 5b 6b 5d 2e 70 45 78 70 72 2c 20 30 29 3b 0a  a[k].pExpr, 0);.
a420: 20 20 20 20 20 20 20 20 69 66 28 20 70 4e 65 77          if( pNew
a430: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 4e   ){.          pN
a440: 65 77 2d 3e 61 5b 70 4e 65 77 2d 3e 6e 45 78 70  ew->a[pNew->nExp
a450: 72 2d 31 5d 2e 7a 4e 61 6d 65 20 3d 20 61 5b 6b  r-1].zName = a[k
a460: 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20 20  ].zName;.       
a470: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
a480: 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 20 20    rc = 1;.      
a490: 20 20 7d 0a 20 20 20 20 20 20 20 20 61 5b 6b 5d    }.        a[k]
a4a0: 2e 70 45 78 70 72 20 3d 20 30 3b 0a 20 20 20 20  .pExpr = 0;.    
a4b0: 20 20 20 20 61 5b 6b 5d 2e 7a 4e 61 6d 65 20 3d      a[k].zName =
a4c0: 20 30 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b   0;.      }else{
a4d0: 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68 69 73  .        /* This
a4e0: 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 61   expression is a
a4f0: 20 22 2a 22 20 6f 72 20 61 20 22 54 41 42 4c 45   "*" or a "TABLE
a500: 2e 2a 22 20 61 6e 64 20 6e 65 65 64 73 20 74 6f  .*" and needs to
a510: 20 62 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 65   be.        ** e
a520: 78 70 61 6e 64 65 64 2e 20 2a 2f 0a 20 20 20 20  xpanded. */.    
a530: 20 20 20 20 69 6e 74 20 74 61 62 6c 65 53 65 65      int tableSee
a540: 6e 20 3d 20 30 3b 20 20 20 20 20 20 2f 2a 20 53  n = 0;      /* S
a550: 65 74 20 74 6f 20 31 20 77 68 65 6e 20 54 41 42  et to 1 when TAB
a560: 4c 45 20 6d 61 74 63 68 65 73 20 2a 2f 0a 20 20  LE matches */.  
a570: 20 20 20 20 20 20 63 68 61 72 20 2a 7a 54 4e 61        char *zTNa
a580: 6d 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  me;            /
a590: 2a 20 74 65 78 74 20 6f 66 20 6e 61 6d 65 20 6f  * text of name o
a5a0: 66 20 54 41 42 4c 45 20 2a 2f 0a 20 20 20 20 20  f TABLE */.     
a5b0: 20 20 20 69 66 28 20 70 45 2d 3e 6f 70 3d 3d 54     if( pE->op==T
a5c0: 4b 5f 44 4f 54 20 26 26 20 70 45 2d 3e 70 4c 65  K_DOT && pE->pLe
a5d0: 66 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ft ){.          
a5e0: 7a 54 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33  zTName = sqlite3
a5f0: 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 26 70  NameFromToken(&p
a600: 45 2d 3e 70 4c 65 66 74 2d 3e 74 6f 6b 65 6e 29  E->pLeft->token)
a610: 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  ;.        }else{
a620: 0a 20 20 20 20 20 20 20 20 20 20 7a 54 4e 61 6d  .          zTNam
a630: 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7d  e = 0;.        }
a640: 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30  .        for(i=0
a650: 2c 20 70 46 72 6f 6d 3d 70 54 61 62 4c 69 73 74  , pFrom=pTabList
a660: 2d 3e 61 3b 20 69 3c 70 54 61 62 4c 69 73 74 2d  ->a; i<pTabList-
a670: 3e 6e 53 72 63 3b 20 69 2b 2b 2c 20 70 46 72 6f  >nSrc; i++, pFro
a680: 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20  m++){.          
a690: 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 70 46  Table *pTab = pF
a6a0: 72 6f 6d 2d 3e 70 54 61 62 3b 0a 20 20 20 20 20  rom->pTab;.     
a6b0: 20 20 20 20 20 63 68 61 72 20 2a 7a 54 61 62 4e       char *zTabN
a6c0: 61 6d 65 20 3d 20 70 46 72 6f 6d 2d 3e 7a 41 6c  ame = pFrom->zAl
a6d0: 69 61 73 3b 0a 20 20 20 20 20 20 20 20 20 20 69  ias;.          i
a6e0: 66 28 20 7a 54 61 62 4e 61 6d 65 3d 3d 30 20 7c  f( zTabName==0 |
a6f0: 7c 20 7a 54 61 62 4e 61 6d 65 5b 30 5d 3d 3d 30  | zTabName[0]==0
a700: 20 29 7b 20 0a 20 20 20 20 20 20 20 20 20 20 20   ){ .           
a710: 20 7a 54 61 62 4e 61 6d 65 20 3d 20 70 54 61 62   zTabName = pTab
a720: 2d 3e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20 20  ->zName;.       
a730: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 69     }.          i
a740: 66 28 20 7a 54 4e 61 6d 65 20 26 26 20 28 7a 54  f( zTName && (zT
a750: 61 62 4e 61 6d 65 3d 3d 30 20 7c 7c 20 7a 54 61  abName==0 || zTa
a760: 62 4e 61 6d 65 5b 30 5d 3d 3d 30 20 7c 7c 20 0a  bName[0]==0 || .
a770: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a780: 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28   sqlite3StrICmp(
a790: 7a 54 4e 61 6d 65 2c 20 7a 54 61 62 4e 61 6d 65  zTName, zTabName
a7a0: 29 21 3d 30 29 20 29 7b 0a 20 20 20 20 20 20 20  )!=0) ){.       
a7b0: 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20       continue;. 
a7c0: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
a7d0: 20 20 20 20 20 74 61 62 6c 65 53 65 65 6e 20 3d       tableSeen =
a7e0: 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20 66 6f   1;.          fo
a7f0: 72 28 6a 3d 30 3b 20 6a 3c 70 54 61 62 2d 3e 6e  r(j=0; j<pTab->n
a800: 43 6f 6c 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20  Col; j++){.     
a810: 20 20 20 20 20 20 20 45 78 70 72 20 2a 70 45 78         Expr *pEx
a820: 70 72 2c 20 2a 70 52 69 67 68 74 3b 0a 20 20 20  pr, *pRight;.   
a830: 20 20 20 20 20 20 20 20 20 63 68 61 72 20 2a 7a           char *z
a840: 4e 61 6d 65 20 3d 20 70 54 61 62 2d 3e 61 43 6f  Name = pTab->aCo
a850: 6c 5b 6a 5d 2e 7a 4e 61 6d 65 3b 0a 0a 20 20 20  l[j].zName;..   
a860: 20 20 20 20 20 20 20 20 20 69 66 28 20 69 3e 30           if( i>0
a870: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
a880: 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74    struct SrcList
a890: 5f 69 74 65 6d 20 2a 70 4c 65 66 74 20 3d 20 26  _item *pLeft = &
a8a0: 70 54 61 62 4c 69 73 74 2d 3e 61 5b 69 2d 31 5d  pTabList->a[i-1]
a8b0: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
a8c0: 69 66 28 20 28 70 4c 65 66 74 5b 31 5d 2e 6a 6f  if( (pLeft[1].jo
a8d0: 69 6e 74 79 70 65 20 26 20 4a 54 5f 4e 41 54 55  intype & JT_NATU
a8e0: 52 41 4c 29 21 3d 30 20 26 26 0a 20 20 20 20 20  RAL)!=0 &&.     
a8f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a900: 20 20 20 63 6f 6c 75 6d 6e 49 6e 64 65 78 28 70     columnIndex(p
a910: 4c 65 66 74 2d 3e 70 54 61 62 2c 20 7a 4e 61 6d  Left->pTab, zNam
a920: 65 29 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  e)>=0 ){.       
a930: 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 20 61           /* In a
a940: 20 4e 41 54 55 52 41 4c 20 6a 6f 69 6e 2c 20 6f   NATURAL join, o
a950: 6d 69 74 20 74 68 65 20 6a 6f 69 6e 20 63 6f 6c  mit the join col
a960: 75 6d 6e 73 20 66 72 6f 6d 20 74 68 65 20 0a 20  umns from the . 
a970: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2a                 *
a980: 2a 20 74 61 62 6c 65 20 6f 6e 20 74 68 65 20 72  * table on the r
a990: 69 67 68 74 20 2a 2f 0a 20 20 20 20 20 20 20 20  ight */.        
a9a0: 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65          continue
a9b0: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
a9c0: 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  }.              
a9d0: 69 66 28 20 73 71 6c 69 74 65 33 49 64 4c 69 73  if( sqlite3IdLis
a9e0: 74 49 6e 64 65 78 28 70 4c 65 66 74 5b 31 5d 2e  tIndex(pLeft[1].
a9f0: 70 55 73 69 6e 67 2c 20 7a 4e 61 6d 65 29 3e 3d  pUsing, zName)>=
aa00: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  0 ){.           
aa10: 20 20 20 20 20 2f 2a 20 49 6e 20 61 20 6a 6f 69       /* In a joi
aa20: 6e 20 77 69 74 68 20 61 20 55 53 49 4e 47 20 63  n with a USING c
aa30: 6c 61 75 73 65 2c 20 6f 6d 69 74 20 63 6f 6c 75  lause, omit colu
aa40: 6d 6e 73 20 69 6e 20 74 68 65 0a 20 20 20 20 20  mns in the.     
aa50: 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 75 73             ** us
aa60: 69 6e 67 20 63 6c 61 75 73 65 20 66 72 6f 6d 20  ing clause from 
aa70: 74 68 65 20 74 61 62 6c 65 20 6f 6e 20 74 68 65  the table on the
aa80: 20 72 69 67 68 74 2e 20 2a 2f 0a 20 20 20 20 20   right. */.     
aa90: 20 20 20 20 20 20 20 20 20 20 20 63 6f 6e 74 69             conti
aaa0: 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20  nue;.           
aab0: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20     }.           
aac0: 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 70   }.            p
aad0: 52 69 67 68 74 20 3d 20 73 71 6c 69 74 65 33 45  Right = sqlite3E
aae0: 78 70 72 28 54 4b 5f 49 44 2c 20 30 2c 20 30 2c  xpr(TK_ID, 0, 0,
aaf0: 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20   0);.           
ab00: 20 69 66 28 20 70 52 69 67 68 74 3d 3d 30 20 29   if( pRight==0 )
ab10: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
ab20: 20 20 20 20 73 65 74 54 6f 6b 65 6e 28 26 70 52      setToken(&pR
ab30: 69 67 68 74 2d 3e 74 6f 6b 65 6e 2c 20 7a 4e 61  ight->token, zNa
ab40: 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  me);.           
ab50: 20 69 66 28 20 7a 54 61 62 4e 61 6d 65 20 26 26   if( zTabName &&
ab60: 20 28 6c 6f 6e 67 4e 61 6d 65 73 20 7c 7c 20 70   (longNames || p
ab70: 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3e 31 29  TabList->nSrc>1)
ab80: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
ab90: 20 20 45 78 70 72 20 2a 70 4c 65 66 74 20 3d 20    Expr *pLeft = 
aba0: 73 71 6c 69 74 65 33 45 78 70 72 28 54 4b 5f 49  sqlite3Expr(TK_I
abb0: 44 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20  D, 0, 0, 0);.   
abc0: 20 20 20 20 20 20 20 20 20 20 20 70 45 78 70 72             pExpr
abd0: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 28 54   = sqlite3Expr(T
abe0: 4b 5f 44 4f 54 2c 20 70 4c 65 66 74 2c 20 70 52  K_DOT, pLeft, pR
abf0: 69 67 68 74 2c 20 30 29 3b 0a 20 20 20 20 20 20  ight, 0);.      
ac00: 20 20 20 20 20 20 20 20 69 66 28 20 70 45 78 70          if( pExp
ac10: 72 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20  r==0 ) break;.  
ac20: 20 20 20 20 20 20 20 20 20 20 20 20 73 65 74 54              setT
ac30: 6f 6b 65 6e 28 26 70 4c 65 66 74 2d 3e 74 6f 6b  oken(&pLeft->tok
ac40: 65 6e 2c 20 7a 54 61 62 4e 61 6d 65 29 3b 0a 20  en, zTabName);. 
ac50: 20 20 20 20 20 20 20 20 20 20 20 20 20 73 65 74               set
ac60: 54 6f 6b 65 6e 28 26 70 45 78 70 72 2d 3e 73 70  Token(&pExpr->sp
ac70: 61 6e 2c 20 73 71 6c 69 74 65 33 4d 50 72 69 6e  an, sqlite3MPrin
ac80: 74 66 28 22 25 73 2e 25 73 22 2c 20 7a 54 61 62  tf("%s.%s", zTab
ac90: 4e 61 6d 65 2c 20 7a 4e 61 6d 65 29 29 3b 0a 20  Name, zName));. 
aca0: 20 20 20 20 20 20 20 20 20 20 20 20 20 70 45 78               pEx
acb0: 70 72 2d 3e 73 70 61 6e 2e 64 79 6e 20 3d 20 31  pr->span.dyn = 1
acc0: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
acd0: 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 7a 20 3d  pExpr->token.z =
ace0: 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20   0;.            
acf0: 20 20 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 6e    pExpr->token.n
ad00: 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20   = 0;.          
ad10: 20 20 20 20 70 45 78 70 72 2d 3e 74 6f 6b 65 6e      pExpr->token
ad20: 2e 64 79 6e 20 3d 20 30 3b 0a 20 20 20 20 20 20  .dyn = 0;.      
ad30: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
ad40: 20 20 20 20 20 20 20 20 20 20 20 70 45 78 70 72             pExpr
ad50: 20 3d 20 70 52 69 67 68 74 3b 0a 20 20 20 20 20   = pRight;.     
ad60: 20 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e           pExpr->
ad70: 73 70 61 6e 20 3d 20 70 45 78 70 72 2d 3e 74 6f  span = pExpr->to
ad80: 6b 65 6e 3b 0a 20 20 20 20 20 20 20 20 20 20 20  ken;.           
ad90: 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 69   }.            i
ada0: 66 28 20 6c 6f 6e 67 4e 61 6d 65 73 20 29 7b 0a  f( longNames ){.
adb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 4e                pN
adc0: 65 77 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  ew = sqlite3Expr
add0: 4c 69 73 74 41 70 70 65 6e 64 28 70 4e 65 77 2c  ListAppend(pNew,
ade0: 20 70 45 78 70 72 2c 20 26 70 45 78 70 72 2d 3e   pExpr, &pExpr->
adf0: 73 70 61 6e 29 3b 0a 20 20 20 20 20 20 20 20 20  span);.         
ae00: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
ae10: 20 20 20 20 20 20 20 20 70 4e 65 77 20 3d 20 73          pNew = s
ae20: 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 41 70  qlite3ExprListAp
ae30: 70 65 6e 64 28 70 4e 65 77 2c 20 70 45 78 70 72  pend(pNew, pExpr
ae40: 2c 20 26 70 52 69 67 68 74 2d 3e 74 6f 6b 65 6e  , &pRight->token
ae50: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  );.            }
ae60: 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
ae70: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69       }.        i
ae80: 66 28 20 21 74 61 62 6c 65 53 65 65 6e 20 29 7b  f( !tableSeen ){
ae90: 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 7a  .          if( z
aea0: 54 4e 61 6d 65 20 29 7b 0a 20 20 20 20 20 20 20  TName ){.       
aeb0: 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f       sqlite3Erro
aec0: 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 6e 6f  rMsg(pParse, "no
aed0: 20 73 75 63 68 20 74 61 62 6c 65 3a 20 25 73 22   such table: %s"
aee0: 2c 20 7a 54 4e 61 6d 65 29 3b 0a 20 20 20 20 20  , zTName);.     
aef0: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
af00: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
af10: 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
af20: 22 6e 6f 20 74 61 62 6c 65 73 20 73 70 65 63 69  "no tables speci
af30: 66 69 65 64 22 29 3b 0a 20 20 20 20 20 20 20 20  fied");.        
af40: 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 72 63    }.          rc
af50: 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 7d 0a   = 1;.        }.
af60: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 46 72          sqliteFr
af70: 65 65 28 7a 54 4e 61 6d 65 29 3b 0a 20 20 20 20  ee(zTName);.    
af80: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73 71    }.    }.    sq
af90: 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c  lite3ExprListDel
afa0: 65 74 65 28 70 45 4c 69 73 74 29 3b 0a 20 20 20  ete(pEList);.   
afb0: 20 70 2d 3e 70 45 4c 69 73 74 20 3d 20 70 4e 65   p->pEList = pNe
afc0: 77 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  w;.  }.  return 
afd0: 72 63 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53  rc;.}..#ifndef S
afe0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f 4d 50 4f  QLITE_OMIT_COMPO
aff0: 55 4e 44 5f 53 45 4c 45 43 54 0a 2f 2a 0a 2a 2a  UND_SELECT./*.**
b000: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 61 73   This routine as
b010: 73 6f 63 69 61 74 65 73 20 65 6e 74 72 69 65 73  sociates entries
b020: 20 69 6e 20 61 6e 20 4f 52 44 45 52 20 42 59 20   in an ORDER BY 
b030: 65 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 20  expression list 
b040: 77 69 74 68 0a 2a 2a 20 63 6f 6c 75 6d 6e 73 20  with.** columns 
b050: 69 6e 20 61 20 72 65 73 75 6c 74 2e 20 20 46 6f  in a result.  Fo
b060: 72 20 65 61 63 68 20 4f 52 44 45 52 20 42 59 20  r each ORDER BY 
b070: 65 78 70 72 65 73 73 69 6f 6e 2c 20 74 68 65 20  expression, the 
b080: 6f 70 63 6f 64 65 20 6f 66 0a 2a 2a 20 74 68 65  opcode of.** the
b090: 20 74 6f 70 2d 6c 65 76 65 6c 20 6e 6f 64 65 20   top-level node 
b0a0: 69 73 20 63 68 61 6e 67 65 64 20 74 6f 20 54 4b  is changed to TK
b0b0: 5f 43 4f 4c 55 4d 4e 20 61 6e 64 20 74 68 65 20  _COLUMN and the 
b0c0: 69 43 6f 6c 75 6d 6e 20 76 61 6c 75 65 20 6f 66  iColumn value of
b0d0: 0a 2a 2a 20 74 68 65 20 74 6f 70 2d 6c 65 76 65  .** the top-leve
b0e0: 6c 20 6e 6f 64 65 20 69 73 20 66 69 6c 6c 65 64  l node is filled
b0f0: 20 69 6e 20 77 69 74 68 20 63 6f 6c 75 6d 6e 20   in with column 
b100: 6e 75 6d 62 65 72 20 61 6e 64 20 74 68 65 20 69  number and the i
b110: 54 61 62 6c 65 0a 2a 2a 20 76 61 6c 75 65 20 6f  Table.** value o
b120: 66 20 74 68 65 20 74 6f 70 2d 6c 65 76 65 6c 20  f the top-level 
b130: 6e 6f 64 65 20 69 73 20 66 69 6c 6c 65 64 20 77  node is filled w
b140: 69 74 68 20 69 54 61 62 6c 65 20 70 61 72 61 6d  ith iTable param
b150: 65 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  eter..**.** If t
b160: 68 65 72 65 20 61 72 65 20 70 72 69 6f 72 20 53  here are prior S
b170: 45 4c 45 43 54 20 63 6c 61 75 73 65 73 2c 20 74  ELECT clauses, t
b180: 68 65 79 20 61 72 65 20 70 72 6f 63 65 73 73 65  hey are processe
b190: 64 20 66 69 72 73 74 2e 20 20 41 20 6d 61 74 63  d first.  A matc
b1a0: 68 0a 2a 2a 20 69 6e 20 61 6e 20 65 61 72 6c 69  h.** in an earli
b1b0: 65 72 20 53 45 4c 45 43 54 20 74 61 6b 65 73 20  er SELECT takes 
b1c0: 70 72 65 63 65 64 65 6e 63 65 20 6f 76 65 72 20  precedence over 
b1d0: 61 20 6c 61 74 65 72 20 53 45 4c 45 43 54 2e 0a  a later SELECT..
b1e0: 2a 2a 0a 2a 2a 20 41 6e 79 20 65 6e 74 72 79 20  **.** Any entry 
b1f0: 74 68 61 74 20 64 6f 65 73 20 6e 6f 74 20 6d 61  that does not ma
b200: 74 63 68 20 69 73 20 66 6c 61 67 67 65 64 20 61  tch is flagged a
b210: 73 20 61 6e 20 65 72 72 6f 72 2e 20 20 54 68 65  s an error.  The
b220: 20 6e 75 6d 62 65 72 0a 2a 2a 20 6f 66 20 65 72   number.** of er
b230: 72 6f 72 73 20 69 73 20 72 65 74 75 72 6e 65 64  rors is returned
b240: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
b250: 6d 61 74 63 68 4f 72 64 65 72 62 79 54 6f 43 6f  matchOrderbyToCo
b260: 6c 75 6d 6e 28 0a 20 20 50 61 72 73 65 20 2a 70  lumn(.  Parse *p
b270: 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 20 20  Parse,          
b280: 2f 2a 20 41 20 70 6c 61 63 65 20 74 6f 20 6c 65  /* A place to le
b290: 61 76 65 20 65 72 72 6f 72 20 6d 65 73 73 61 67  ave error messag
b2a0: 65 73 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a  es */.  Select *
b2b0: 70 53 65 6c 65 63 74 2c 20 20 20 20 20 20 20 20  pSelect,        
b2c0: 2f 2a 20 4d 61 74 63 68 20 74 6f 20 72 65 73 75  /* Match to resu
b2d0: 6c 74 20 63 6f 6c 75 6d 6e 73 20 6f 66 20 74 68  lt columns of th
b2e0: 69 73 20 53 45 4c 45 43 54 20 2a 2f 0a 20 20 45  is SELECT */.  E
b2f0: 78 70 72 4c 69 73 74 20 2a 70 4f 72 64 65 72 42  xprList *pOrderB
b300: 79 2c 20 20 20 20 20 2f 2a 20 54 68 65 20 4f 52  y,     /* The OR
b310: 44 45 52 20 42 59 20 76 61 6c 75 65 73 20 74 6f  DER BY values to
b320: 20 6d 61 74 63 68 20 61 67 61 69 6e 73 74 20 63   match against c
b330: 6f 6c 75 6d 6e 73 20 2a 2f 0a 20 20 69 6e 74 20  olumns */.  int 
b340: 69 54 61 62 6c 65 2c 20 20 20 20 20 20 20 20 20  iTable,         
b350: 20 20 20 20 2f 2a 20 49 6e 73 65 72 74 20 74 68      /* Insert th
b360: 69 73 20 76 61 6c 75 65 20 69 6e 20 69 54 61 62  is value in iTab
b370: 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 6d 75 73 74  le */.  int must
b380: 43 6f 6d 70 6c 65 74 65 20 20 20 20 20 20 20 20  Complete        
b390: 2f 2a 20 49 66 20 54 52 55 45 20 61 6c 6c 20 4f  /* If TRUE all O
b3a0: 52 44 45 52 20 42 59 73 20 6d 75 73 74 20 6d 61  RDER BYs must ma
b3b0: 74 63 68 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  tch */.){.  int 
b3c0: 6e 45 72 72 20 3d 20 30 3b 0a 20 20 69 6e 74 20  nErr = 0;.  int 
b3d0: 69 2c 20 6a 3b 0a 20 20 45 78 70 72 4c 69 73 74  i, j;.  ExprList
b3e0: 20 2a 70 45 4c 69 73 74 3b 0a 0a 20 20 69 66 28   *pEList;..  if(
b3f0: 20 70 53 65 6c 65 63 74 3d 3d 30 20 7c 7c 20 70   pSelect==0 || p
b400: 4f 72 64 65 72 42 79 3d 3d 30 20 29 20 72 65 74  OrderBy==0 ) ret
b410: 75 72 6e 20 31 3b 0a 20 20 69 66 28 20 6d 75 73  urn 1;.  if( mus
b420: 74 43 6f 6d 70 6c 65 74 65 20 29 7b 0a 20 20 20  tComplete ){.   
b430: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4f 72 64   for(i=0; i<pOrd
b440: 65 72 42 79 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b  erBy->nExpr; i++
b450: 29 7b 20 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69  ){ pOrderBy->a[i
b460: 5d 2e 64 6f 6e 65 20 3d 20 30 3b 20 7d 0a 20 20  ].done = 0; }.  
b470: 7d 0a 20 20 69 66 28 20 70 72 65 70 53 65 6c 65  }.  if( prepSele
b480: 63 74 53 74 6d 74 28 70 50 61 72 73 65 2c 20 70  ctStmt(pParse, p
b490: 53 65 6c 65 63 74 29 20 29 7b 0a 20 20 20 20 72  Select) ){.    r
b4a0: 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 69  eturn 1;.  }.  i
b4b0: 66 28 20 70 53 65 6c 65 63 74 2d 3e 70 50 72 69  f( pSelect->pPri
b4c0: 6f 72 20 29 7b 0a 20 20 20 20 69 66 28 20 6d 61  or ){.    if( ma
b4d0: 74 63 68 4f 72 64 65 72 62 79 54 6f 43 6f 6c 75  tchOrderbyToColu
b4e0: 6d 6e 28 70 50 61 72 73 65 2c 20 70 53 65 6c 65  mn(pParse, pSele
b4f0: 63 74 2d 3e 70 50 72 69 6f 72 2c 20 70 4f 72 64  ct->pPrior, pOrd
b500: 65 72 42 79 2c 20 69 54 61 62 6c 65 2c 20 30 29  erBy, iTable, 0)
b510: 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
b520: 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20   1;.    }.  }.  
b530: 70 45 4c 69 73 74 20 3d 20 70 53 65 6c 65 63 74  pEList = pSelect
b540: 2d 3e 70 45 4c 69 73 74 3b 0a 20 20 66 6f 72 28  ->pEList;.  for(
b550: 69 3d 30 3b 20 69 3c 70 4f 72 64 65 72 42 79 2d  i=0; i<pOrderBy-
b560: 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20  >nExpr; i++){.  
b570: 20 20 73 74 72 75 63 74 20 45 78 70 72 4c 69 73    struct ExprLis
b580: 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20  t_item *pItem;. 
b590: 20 20 20 45 78 70 72 20 2a 70 45 20 3d 20 70 4f     Expr *pE = pO
b5a0: 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 70 45 78  rderBy->a[i].pEx
b5b0: 70 72 3b 0a 20 20 20 20 69 6e 74 20 69 43 6f 6c  pr;.    int iCol
b5c0: 20 3d 20 2d 31 3b 0a 20 20 20 20 63 68 61 72 20   = -1;.    char 
b5d0: 2a 7a 4c 61 62 65 6c 3b 0a 0a 20 20 20 20 69 66  *zLabel;..    if
b5e0: 28 20 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d  ( pOrderBy->a[i]
b5f0: 2e 64 6f 6e 65 20 29 20 63 6f 6e 74 69 6e 75 65  .done ) continue
b600: 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65  ;.    if( sqlite
b610: 33 45 78 70 72 49 73 49 6e 74 65 67 65 72 28 70  3ExprIsInteger(p
b620: 45 2c 20 26 69 43 6f 6c 29 20 29 7b 0a 20 20 20  E, &iCol) ){.   
b630: 20 20 20 69 66 28 20 69 43 6f 6c 3c 3d 30 20 7c     if( iCol<=0 |
b640: 7c 20 69 43 6f 6c 3e 70 45 4c 69 73 74 2d 3e 6e  | iCol>pEList->n
b650: 45 78 70 72 20 29 7b 0a 20 20 20 20 20 20 20 20  Expr ){.        
b660: 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
b670: 70 50 61 72 73 65 2c 0a 20 20 20 20 20 20 20 20  pParse,.        
b680: 20 20 22 4f 52 44 45 52 20 42 59 20 70 6f 73 69    "ORDER BY posi
b690: 74 69 6f 6e 20 25 64 20 73 68 6f 75 6c 64 20 62  tion %d should b
b6a0: 65 20 62 65 74 77 65 65 6e 20 31 20 61 6e 64 20  e between 1 and 
b6b0: 25 64 22 2c 0a 20 20 20 20 20 20 20 20 20 20 69  %d",.          i
b6c0: 43 6f 6c 2c 20 70 45 4c 69 73 74 2d 3e 6e 45 78  Col, pEList->nEx
b6d0: 70 72 29 3b 0a 20 20 20 20 20 20 20 20 6e 45 72  pr);.        nEr
b6e0: 72 2b 2b 3b 0a 20 20 20 20 20 20 20 20 62 72 65  r++;.        bre
b6f0: 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ak;.      }.    
b700: 20 20 69 66 28 20 21 6d 75 73 74 43 6f 6d 70 6c    if( !mustCompl
b710: 65 74 65 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  ete ) continue;.
b720: 20 20 20 20 20 20 69 43 6f 6c 2d 2d 3b 0a 20 20        iCol--;.  
b730: 20 20 7d 0a 20 20 20 20 69 66 28 20 69 43 6f 6c    }.    if( iCol
b740: 3c 30 20 26 26 20 28 7a 4c 61 62 65 6c 20 3d 20  <0 && (zLabel = 
b750: 73 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54  sqlite3NameFromT
b760: 6f 6b 65 6e 28 26 70 45 2d 3e 74 6f 6b 65 6e 29  oken(&pE->token)
b770: 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 66 6f  )!=0 ){.      fo
b780: 72 28 6a 3d 30 2c 20 70 49 74 65 6d 3d 70 45 4c  r(j=0, pItem=pEL
b790: 69 73 74 2d 3e 61 3b 20 6a 3c 70 45 4c 69 73 74  ist->a; j<pEList
b7a0: 2d 3e 6e 45 78 70 72 3b 20 6a 2b 2b 2c 20 70 49  ->nExpr; j++, pI
b7b0: 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  tem++){.        
b7c0: 63 68 61 72 20 2a 7a 4e 61 6d 65 3b 0a 20 20 20  char *zName;.   
b7d0: 20 20 20 20 20 69 6e 74 20 69 73 4d 61 74 63 68       int isMatch
b7e0: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 49  ;.        if( pI
b7f0: 74 65 6d 2d 3e 7a 4e 61 6d 65 20 29 7b 0a 20 20  tem->zName ){.  
b800: 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20          zName = 
b810: 73 71 6c 69 74 65 33 53 74 72 44 75 70 28 70 49  sqlite3StrDup(pI
b820: 74 65 6d 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20  tem->zName);.   
b830: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
b840: 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 73 71        zName = sq
b850: 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b  lite3NameFromTok
b860: 65 6e 28 26 70 49 74 65 6d 2d 3e 70 45 78 70 72  en(&pItem->pExpr
b870: 2d 3e 74 6f 6b 65 6e 29 3b 0a 20 20 20 20 20 20  ->token);.      
b880: 20 20 7d 0a 20 20 20 20 20 20 20 20 69 73 4d 61    }.        isMa
b890: 74 63 68 20 3d 20 7a 4e 61 6d 65 20 26 26 20 73  tch = zName && s
b8a0: 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 7a 4e  qlite3StrICmp(zN
b8b0: 61 6d 65 2c 20 7a 4c 61 62 65 6c 29 3d 3d 30 3b  ame, zLabel)==0;
b8c0: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 46  .        sqliteF
b8d0: 72 65 65 28 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  ree(zName);.    
b8e0: 20 20 20 20 69 66 28 20 69 73 4d 61 74 63 68 20      if( isMatch 
b8f0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 43 6f  ){.          iCo
b900: 6c 20 3d 20 6a 3b 0a 20 20 20 20 20 20 20 20 20  l = j;.         
b910: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
b920: 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  }.      }.      
b930: 73 71 6c 69 74 65 46 72 65 65 28 7a 4c 61 62 65  sqliteFree(zLabe
b940: 6c 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  l);.    }.    if
b950: 28 20 69 43 6f 6c 3e 3d 30 20 29 7b 0a 20 20 20  ( iCol>=0 ){.   
b960: 20 20 20 70 45 2d 3e 6f 70 20 3d 20 54 4b 5f 43     pE->op = TK_C
b970: 4f 4c 55 4d 4e 3b 0a 20 20 20 20 20 20 70 45 2d  OLUMN;.      pE-
b980: 3e 69 43 6f 6c 75 6d 6e 20 3d 20 69 43 6f 6c 3b  >iColumn = iCol;
b990: 0a 20 20 20 20 20 20 70 45 2d 3e 69 54 61 62 6c  .      pE->iTabl
b9a0: 65 20 3d 20 69 54 61 62 6c 65 3b 0a 20 20 20 20  e = iTable;.    
b9b0: 20 20 70 45 2d 3e 69 41 67 67 20 3d 20 2d 31 3b    pE->iAgg = -1;
b9c0: 0a 20 20 20 20 20 20 70 4f 72 64 65 72 42 79 2d  .      pOrderBy-
b9d0: 3e 61 5b 69 5d 2e 64 6f 6e 65 20 3d 20 31 3b 0a  >a[i].done = 1;.
b9e0: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6d 75      }else if( mu
b9f0: 73 74 43 6f 6d 70 6c 65 74 65 20 29 7b 0a 20 20  stComplete ){.  
ba00: 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
ba10: 4d 73 67 28 70 50 61 72 73 65 2c 0a 20 20 20 20  Msg(pParse,.    
ba20: 20 20 20 20 22 4f 52 44 45 52 20 42 59 20 74 65      "ORDER BY te
ba30: 72 6d 20 6e 75 6d 62 65 72 20 25 64 20 64 6f 65  rm number %d doe
ba40: 73 20 6e 6f 74 20 6d 61 74 63 68 20 61 6e 79 20  s not match any 
ba50: 72 65 73 75 6c 74 20 63 6f 6c 75 6d 6e 22 2c 20  result column", 
ba60: 69 2b 31 29 3b 0a 20 20 20 20 20 20 6e 45 72 72  i+1);.      nErr
ba70: 2b 2b 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  ++;.      break;
ba80: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
ba90: 75 72 6e 20 6e 45 72 72 3b 20 20 0a 7d 0a 23 65  urn nErr;  .}.#e
baa0: 6e 64 69 66 20 2f 2a 20 23 69 66 6e 64 65 66 20  ndif /* #ifndef 
bab0: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f 4d 50  SQLITE_OMIT_COMP
bac0: 4f 55 4e 44 5f 53 45 4c 45 43 54 20 2a 2f 0a 0a  OUND_SELECT */..
bad0: 2f 2a 0a 2a 2a 20 47 65 74 20 61 20 56 44 42 45  /*.** Get a VDBE
bae0: 20 66 6f 72 20 74 68 65 20 67 69 76 65 6e 20 70   for the given p
baf0: 61 72 73 65 72 20 63 6f 6e 74 65 78 74 2e 20 20  arser context.  
bb00: 43 72 65 61 74 65 20 61 20 6e 65 77 20 6f 6e 65  Create a new one
bb10: 20 69 66 20 6e 65 63 65 73 73 61 72 79 2e 0a 2a   if necessary..*
bb20: 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63  * If an error oc
bb30: 63 75 72 73 2c 20 72 65 74 75 72 6e 20 4e 55 4c  curs, return NUL
bb40: 4c 20 61 6e 64 20 6c 65 61 76 65 20 61 20 6d 65  L and leave a me
bb50: 73 73 61 67 65 20 69 6e 20 70 50 61 72 73 65 2e  ssage in pParse.
bb60: 0a 2a 2f 0a 56 64 62 65 20 2a 73 71 6c 69 74 65  .*/.Vdbe *sqlite
bb70: 33 47 65 74 56 64 62 65 28 50 61 72 73 65 20 2a  3GetVdbe(Parse *
bb80: 70 50 61 72 73 65 29 7b 0a 20 20 56 64 62 65 20  pParse){.  Vdbe 
bb90: 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64  *v = pParse->pVd
bba0: 62 65 3b 0a 20 20 69 66 28 20 76 3d 3d 30 20 29  be;.  if( v==0 )
bbb0: 7b 0a 20 20 20 20 76 20 3d 20 70 50 61 72 73 65  {.    v = pParse
bbc0: 2d 3e 70 56 64 62 65 20 3d 20 73 71 6c 69 74 65  ->pVdbe = sqlite
bbd0: 33 56 64 62 65 43 72 65 61 74 65 28 70 50 61 72  3VdbeCreate(pPar
bbe0: 73 65 2d 3e 64 62 29 3b 0a 20 20 7d 0a 20 20 72  se->db);.  }.  r
bbf0: 65 74 75 72 6e 20 76 3b 0a 7d 0a 0a 0a 2f 2a 0a  eturn v;.}.../*.
bc00: 2a 2a 20 43 6f 6d 70 75 74 65 20 74 68 65 20 69  ** Compute the i
bc10: 4c 69 6d 69 74 20 61 6e 64 20 69 4f 66 66 73 65  Limit and iOffse
bc20: 74 20 66 69 65 6c 64 73 20 6f 66 20 74 68 65 20  t fields of the 
bc30: 53 45 4c 45 43 54 20 62 61 73 65 64 20 6f 6e 20  SELECT based on 
bc40: 74 68 65 0a 2a 2a 20 70 4c 69 6d 69 74 20 61 6e  the.** pLimit an
bc50: 64 20 70 4f 66 66 73 65 74 20 65 78 70 72 65 73  d pOffset expres
bc60: 73 69 6f 6e 73 2e 20 20 70 4c 69 6d 69 74 20 61  sions.  pLimit a
bc70: 6e 64 20 70 4f 66 66 73 65 74 20 68 6f 6c 64 20  nd pOffset hold 
bc80: 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 73 0a  the expressions.
bc90: 2a 2a 20 74 68 61 74 20 61 70 70 65 61 72 20 69  ** that appear i
bca0: 6e 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 53  n the original S
bcb0: 51 4c 20 73 74 61 74 65 6d 65 6e 74 20 61 66 74  QL statement aft
bcc0: 65 72 20 74 68 65 20 4c 49 4d 49 54 20 61 6e 64  er the LIMIT and
bcd0: 20 4f 46 46 53 45 54 0a 2a 2a 20 6b 65 79 77 6f   OFFSET.** keywo
bce0: 72 64 73 2e 20 20 4f 72 20 4e 55 4c 4c 20 69 66  rds.  Or NULL if
bcf0: 20 74 68 6f 73 65 20 6b 65 79 77 6f 72 64 73 20   those keywords 
bd00: 61 72 65 20 6f 6d 69 74 74 65 64 2e 20 69 4c 69  are omitted. iLi
bd10: 6d 69 74 20 61 6e 64 20 69 4f 66 66 73 65 74 20  mit and iOffset 
bd20: 0a 2a 2a 20 61 72 65 20 74 68 65 20 69 6e 74 65  .** are the inte
bd30: 67 65 72 20 6d 65 6d 6f 72 79 20 72 65 67 69 73  ger memory regis
bd40: 74 65 72 20 6e 75 6d 62 65 72 73 20 66 6f 72 20  ter numbers for 
bd50: 63 6f 75 6e 74 65 72 73 20 75 73 65 64 20 74 6f  counters used to
bd60: 20 63 6f 6d 70 75 74 65 20 0a 2a 2a 20 74 68 65   compute .** the
bd70: 20 6c 69 6d 69 74 20 61 6e 64 20 6f 66 66 73 65   limit and offse
bd80: 74 2e 20 20 49 66 20 74 68 65 72 65 20 69 73 20  t.  If there is 
bd90: 6e 6f 20 6c 69 6d 69 74 20 61 6e 64 2f 6f 72 20  no limit and/or 
bda0: 6f 66 66 73 65 74 2c 20 74 68 65 6e 20 0a 2a 2a  offset, then .**
bdb0: 20 69 4c 69 6d 69 74 20 61 6e 64 20 69 4f 66 66   iLimit and iOff
bdc0: 73 65 74 20 61 72 65 20 6e 65 67 61 74 69 76 65  set are negative
bdd0: 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
bde0: 74 69 6e 65 20 63 68 61 6e 67 65 73 20 74 68 65  tine changes the
bdf0: 20 76 61 6c 75 65 73 20 6f 66 20 69 4c 69 6d 69   values of iLimi
be00: 74 20 61 6e 64 20 69 4f 66 66 73 65 74 20 6f 6e  t and iOffset on
be10: 6c 79 20 69 66 0a 2a 2a 20 61 20 6c 69 6d 69 74  ly if.** a limit
be20: 20 6f 72 20 6f 66 66 73 65 74 20 69 73 20 64 65   or offset is de
be30: 66 69 6e 65 64 20 62 79 20 70 4c 69 6d 69 74 20  fined by pLimit 
be40: 61 6e 64 20 70 4f 66 66 73 65 74 2e 20 20 69 4c  and pOffset.  iL
be50: 69 6d 69 74 20 61 6e 64 0a 2a 2a 20 69 4f 66 66  imit and.** iOff
be60: 73 65 74 20 73 68 6f 75 6c 64 20 68 61 76 65 20  set should have 
be70: 62 65 65 6e 20 70 72 65 73 65 74 20 74 6f 20 61  been preset to a
be80: 70 70 72 6f 70 72 69 61 74 65 20 64 65 66 61 75  ppropriate defau
be90: 6c 74 20 76 61 6c 75 65 73 0a 2a 2a 20 28 75 73  lt values.** (us
bea0: 75 61 6c 6c 79 20 62 75 74 20 6e 6f 74 20 61 6c  ually but not al
beb0: 77 61 79 73 20 2d 31 29 20 70 72 69 6f 72 20 74  ways -1) prior t
bec0: 6f 20 63 61 6c 6c 69 6e 67 20 74 68 69 73 20 72  o calling this r
bed0: 6f 75 74 69 6e 65 2e 0a 2a 2a 20 4f 6e 6c 79 20  outine..** Only 
bee0: 69 66 20 70 4c 69 6d 69 74 21 3d 30 20 6f 72 20  if pLimit!=0 or 
bef0: 70 4f 66 66 73 65 74 21 3d 30 20 64 6f 20 74 68  pOffset!=0 do th
bf00: 65 20 6c 69 6d 69 74 20 72 65 67 69 73 74 65 72  e limit register
bf10: 73 20 67 65 74 0a 2a 2a 20 72 65 64 65 66 69 6e  s get.** redefin
bf20: 65 64 2e 20 20 54 68 65 20 55 4e 49 4f 4e 20 41  ed.  The UNION A
bf30: 4c 4c 20 6f 70 65 72 61 74 6f 72 20 75 73 65 73  LL operator uses
bf40: 20 74 68 69 73 20 70 72 6f 70 65 72 74 79 20 74   this property t
bf50: 6f 20 66 6f 72 63 65 0a 2a 2a 20 74 68 65 20 72  o force.** the r
bf60: 65 75 73 65 20 6f 66 20 74 68 65 20 73 61 6d 65  euse of the same
bf70: 20 6c 69 6d 69 74 20 61 6e 64 20 6f 66 66 73 65   limit and offse
bf80: 74 20 72 65 67 69 73 74 65 72 73 20 61 63 72 6f  t registers acro
bf90: 73 73 20 6d 75 6c 74 69 70 6c 65 0a 2a 2a 20 53  ss multiple.** S
bfa0: 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 73  ELECT statements
bfb0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
bfc0: 20 63 6f 6d 70 75 74 65 4c 69 6d 69 74 52 65 67   computeLimitReg
bfd0: 69 73 74 65 72 73 28 50 61 72 73 65 20 2a 70 50  isters(Parse *pP
bfe0: 61 72 73 65 2c 20 53 65 6c 65 63 74 20 2a 70 2c  arse, Select *p,
bff0: 20 69 6e 74 20 69 42 72 65 61 6b 29 7b 0a 20 20   int iBreak){.  
c000: 56 64 62 65 20 2a 76 20 3d 20 30 3b 0a 20 20 69  Vdbe *v = 0;.  i
c010: 6e 74 20 69 4c 69 6d 69 74 20 3d 20 30 3b 0a 20  nt iLimit = 0;. 
c020: 20 69 6e 74 20 69 4f 66 66 73 65 74 3b 0a 20 20   int iOffset;.  
c030: 69 6e 74 20 61 64 64 72 31 2c 20 61 64 64 72 32  int addr1, addr2
c040: 3b 0a 0a 20 20 2f 2a 20 0a 20 20 2a 2a 20 22 4c  ;..  /* .  ** "L
c050: 49 4d 49 54 20 2d 31 22 20 61 6c 77 61 79 73 20  IMIT -1" always 
c060: 73 68 6f 77 73 20 61 6c 6c 20 72 6f 77 73 2e 20  shows all rows. 
c070: 20 54 68 65 72 65 20 69 73 20 73 6f 6d 65 0a 20   There is some. 
c080: 20 2a 2a 20 63 6f 6e 74 72 61 76 65 72 73 79 20   ** contraversy 
c090: 61 62 6f 75 74 20 77 68 61 74 20 74 68 65 20 63  about what the c
c0a0: 6f 72 72 65 63 74 20 62 65 68 61 76 69 6f 72 20  orrect behavior 
c0b0: 73 68 6f 75 6c 64 20 62 65 2e 0a 20 20 2a 2a 20  should be..  ** 
c0c0: 54 68 65 20 63 75 72 72 65 6e 74 20 69 6d 70 6c  The current impl
c0d0: 65 6d 65 6e 74 61 74 69 6f 6e 20 69 6e 74 65 72  ementation inter
c0e0: 70 72 65 74 73 20 22 4c 49 4d 49 54 20 30 22 20  prets "LIMIT 0" 
c0f0: 74 6f 20 6d 65 61 6e 0a 20 20 2a 2a 20 6e 6f 20  to mean.  ** no 
c100: 72 6f 77 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  rows..  */.  if(
c110: 20 70 2d 3e 70 4c 69 6d 69 74 20 29 7b 0a 20 20   p->pLimit ){.  
c120: 20 20 70 2d 3e 69 4c 69 6d 69 74 20 3d 20 69 4c    p->iLimit = iL
c130: 69 6d 69 74 20 3d 20 70 50 61 72 73 65 2d 3e 6e  imit = pParse->n
c140: 4d 65 6d 3b 0a 20 20 20 20 70 50 61 72 73 65 2d  Mem;.    pParse-
c150: 3e 6e 4d 65 6d 20 2b 3d 20 32 3b 0a 20 20 20 20  >nMem += 2;.    
c160: 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64  v = sqlite3GetVd
c170: 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20  be(pParse);.    
c180: 69 66 28 20 76 3d 3d 30 20 29 20 72 65 74 75 72  if( v==0 ) retur
c190: 6e 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78  n;.    sqlite3Ex
c1a0: 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70  prCode(pParse, p
c1b0: 2d 3e 70 4c 69 6d 69 74 29 3b 0a 20 20 20 20 73  ->pLimit);.    s
c1c0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
c1d0: 76 2c 20 4f 50 5f 4d 75 73 74 42 65 49 6e 74 2c  v, OP_MustBeInt,
c1e0: 20 30 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69   0, 0);.    sqli
c1f0: 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
c200: 4f 50 5f 4d 65 6d 53 74 6f 72 65 2c 20 69 4c 69  OP_MemStore, iLi
c210: 6d 69 74 2c 20 30 29 3b 0a 20 20 20 20 56 64 62  mit, 0);.    Vdb
c220: 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 23 20  eComment((v, "# 
c230: 4c 49 4d 49 54 20 63 6f 75 6e 74 65 72 22 29 29  LIMIT counter"))
c240: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
c250: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49 66 4d  eAddOp(v, OP_IfM
c260: 65 6d 5a 65 72 6f 2c 20 69 4c 69 6d 69 74 2c 20  emZero, iLimit, 
c270: 69 42 72 65 61 6b 29 3b 0a 20 20 7d 0a 20 20 69  iBreak);.  }.  i
c280: 66 28 20 70 2d 3e 70 4f 66 66 73 65 74 20 29 7b  f( p->pOffset ){
c290: 0a 20 20 20 20 70 2d 3e 69 4f 66 66 73 65 74 20  .    p->iOffset 
c2a0: 3d 20 69 4f 66 66 73 65 74 20 3d 20 70 50 61 72  = iOffset = pPar
c2b0: 73 65 2d 3e 6e 4d 65 6d 2b 2b 3b 0a 20 20 20 20  se->nMem++;.    
c2c0: 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64  v = sqlite3GetVd
c2d0: 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20  be(pParse);.    
c2e0: 69 66 28 20 76 3d 3d 30 20 29 20 72 65 74 75 72  if( v==0 ) retur
c2f0: 6e 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78  n;.    sqlite3Ex
c300: 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70  prCode(pParse, p
c310: 2d 3e 70 4f 66 66 73 65 74 29 3b 0a 20 20 20 20  ->pOffset);.    
c320: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
c330: 28 76 2c 20 4f 50 5f 4d 75 73 74 42 65 49 6e 74  (v, OP_MustBeInt
c340: 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c  , 0, 0);.    sql
c350: 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
c360: 20 4f 50 5f 4d 65 6d 53 74 6f 72 65 2c 20 69 4f   OP_MemStore, iO
c370: 66 66 73 65 74 2c 20 70 2d 3e 70 4c 69 6d 69 74  ffset, p->pLimit
c380: 3d 3d 30 29 3b 0a 20 20 20 20 56 64 62 65 43 6f  ==0);.    VdbeCo
c390: 6d 6d 65 6e 74 28 28 76 2c 20 22 23 20 4f 46 46  mment((v, "# OFF
c3a0: 53 45 54 20 63 6f 75 6e 74 65 72 22 29 29 3b 0a  SET counter"));.
c3b0: 20 20 20 20 61 64 64 72 31 20 3d 20 73 71 6c 69      addr1 = sqli
c3c0: 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
c3d0: 4f 50 5f 49 66 4d 65 6d 50 6f 73 2c 20 69 4f 66  OP_IfMemPos, iOf
c3e0: 66 73 65 74 2c 20 30 29 3b 0a 20 20 20 20 73 71  fset, 0);.    sq
c3f0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
c400: 2c 20 4f 50 5f 50 6f 70 2c 20 31 2c 20 30 29 3b  , OP_Pop, 1, 0);
c410: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
c420: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49 6e 74 65  AddOp(v, OP_Inte
c430: 67 65 72 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  ger, 0, 0);.    
c440: 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48  sqlite3VdbeJumpH
c450: 65 72 65 28 76 2c 20 61 64 64 72 31 29 3b 0a 20  ere(v, addr1);. 
c460: 20 20 20 69 66 28 20 70 2d 3e 70 4c 69 6d 69 74     if( p->pLimit
c470: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
c480: 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
c490: 5f 41 64 64 2c 20 30 2c 20 30 29 3b 0a 20 20 20  _Add, 0, 0);.   
c4a0: 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e   }.  }.  if( p->
c4b0: 70 4c 69 6d 69 74 20 29 7b 0a 20 20 20 20 61 64  pLimit ){.    ad
c4c0: 64 72 31 20 3d 20 73 71 6c 69 74 65 33 56 64 62  dr1 = sqlite3Vdb
c4d0: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49 66 4d  eAddOp(v, OP_IfM
c4e0: 65 6d 50 6f 73 2c 20 69 4c 69 6d 69 74 2c 20 30  emPos, iLimit, 0
c4f0: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
c500: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 50 6f  beAddOp(v, OP_Po
c510: 70 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20 73 71  p, 1, 0);.    sq
c520: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
c530: 2c 20 4f 50 5f 4d 65 6d 49 6e 74 2c 20 2d 31 2c  , OP_MemInt, -1,
c540: 20 69 4c 69 6d 69 74 2b 31 29 3b 0a 20 20 20 20   iLimit+1);.    
c550: 61 64 64 72 32 20 3d 20 73 71 6c 69 74 65 33 56  addr2 = sqlite3V
c560: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 47  dbeAddOp(v, OP_G
c570: 6f 74 6f 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  oto, 0, 0);.    
c580: 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48  sqlite3VdbeJumpH
c590: 65 72 65 28 76 2c 20 61 64 64 72 31 29 3b 0a 20  ere(v, addr1);. 
c5a0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
c5b0: 64 4f 70 28 76 2c 20 4f 50 5f 4d 65 6d 53 74 6f  dOp(v, OP_MemSto
c5c0: 72 65 2c 20 69 4c 69 6d 69 74 2b 31 2c 20 31 29  re, iLimit+1, 1)
c5d0: 3b 0a 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e  ;.    VdbeCommen
c5e0: 74 28 28 76 2c 20 22 23 20 4c 49 4d 49 54 2b 4f  t((v, "# LIMIT+O
c5f0: 46 46 53 45 54 22 29 29 3b 0a 20 20 20 20 73 71  FFSET"));.    sq
c600: 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72  lite3VdbeJumpHer
c610: 65 28 76 2c 20 61 64 64 72 32 29 3b 0a 20 20 7d  e(v, addr2);.  }
c620: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61  .}../*.** Alloca
c630: 74 65 20 61 20 76 69 72 74 75 61 6c 20 69 6e 64  te a virtual ind
c640: 65 78 20 74 6f 20 75 73 65 20 66 6f 72 20 73 6f  ex to use for so
c650: 72 74 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63  rting..*/.static
c660: 20 76 6f 69 64 20 63 72 65 61 74 65 53 6f 72 74   void createSort
c670: 69 6e 67 49 6e 64 65 78 28 50 61 72 73 65 20 2a  ingIndex(Parse *
c680: 70 50 61 72 73 65 2c 20 53 65 6c 65 63 74 20 2a  pParse, Select *
c690: 70 2c 20 45 78 70 72 4c 69 73 74 20 2a 70 4f 72  p, ExprList *pOr
c6a0: 64 65 72 42 79 29 7b 0a 20 20 69 66 28 20 70 4f  derBy){.  if( pO
c6b0: 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20 69 6e  rderBy ){.    in
c6c0: 74 20 61 64 64 72 3b 0a 20 20 20 20 61 73 73 65  t addr;.    asse
c6d0: 72 74 28 20 70 4f 72 64 65 72 42 79 2d 3e 69 45  rt( pOrderBy->iE
c6e0: 43 75 72 73 6f 72 3d 3d 30 20 29 3b 0a 20 20 20  Cursor==0 );.   
c6f0: 20 70 4f 72 64 65 72 42 79 2d 3e 69 45 43 75 72   pOrderBy->iECur
c700: 73 6f 72 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54  sor = pParse->nT
c710: 61 62 2b 2b 3b 0a 20 20 20 20 61 64 64 72 20 3d  ab++;.    addr =
c720: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
c730: 70 28 70 50 61 72 73 65 2d 3e 70 56 64 62 65 2c  p(pParse->pVdbe,
c740: 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61   OP_OpenEphemera
c750: 6c 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  l,.             
c760: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
c770: 4f 72 64 65 72 42 79 2d 3e 69 45 43 75 72 73 6f  OrderBy->iECurso
c780: 72 2c 20 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78  r, pOrderBy->nEx
c790: 70 72 2b 31 29 3b 0a 20 20 20 20 61 73 73 65 72  pr+1);.    asser
c7a0: 74 28 20 70 2d 3e 61 64 64 72 4f 70 65 6e 45 70  t( p->addrOpenEp
c7b0: 68 6d 5b 32 5d 20 3d 3d 20 2d 31 20 29 3b 0a 20  hm[2] == -1 );. 
c7c0: 20 20 20 70 2d 3e 61 64 64 72 4f 70 65 6e 45 70     p->addrOpenEp
c7d0: 68 6d 5b 32 5d 20 3d 20 61 64 64 72 3b 0a 20 20  hm[2] = addr;.  
c7e0: 7d 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c  }.}..#ifndef SQL
c7f0: 49 54 45 5f 4f 4d 49 54 5f 43 4f 4d 50 4f 55 4e  ITE_OMIT_COMPOUN
c800: 44 5f 53 45 4c 45 43 54 0a 2f 2a 0a 2a 2a 20 52  D_SELECT./*.** R
c810: 65 74 75 72 6e 20 74 68 65 20 61 70 70 72 6f 70  eturn the approp
c820: 72 69 61 74 65 20 63 6f 6c 6c 61 74 69 6e 67 20  riate collating 
c830: 73 65 71 75 65 6e 63 65 20 66 6f 72 20 74 68 65  sequence for the
c840: 20 69 43 6f 6c 2d 74 68 20 63 6f 6c 75 6d 6e 20   iCol-th column 
c850: 6f 66 0a 2a 2a 20 74 68 65 20 72 65 73 75 6c 74  of.** the result
c860: 20 73 65 74 20 66 6f 72 20 74 68 65 20 63 6f 6d   set for the com
c870: 70 6f 75 6e 64 2d 73 65 6c 65 63 74 20 73 74 61  pound-select sta
c880: 74 65 6d 65 6e 74 20 22 70 22 2e 20 20 52 65 74  tement "p".  Ret
c890: 75 72 6e 20 4e 55 4c 4c 20 69 66 0a 2a 2a 20 74  urn NULL if.** t
c8a0: 68 65 20 63 6f 6c 75 6d 6e 20 68 61 73 20 6e 6f  he column has no
c8b0: 20 64 65 66 61 75 6c 74 20 63 6f 6c 6c 61 74 69   default collati
c8c0: 6e 67 20 73 65 71 75 65 6e 63 65 2e 0a 2a 2a 0a  ng sequence..**.
c8d0: 2a 2a 20 54 68 65 20 63 6f 6c 6c 61 74 69 6e 67  ** The collating
c8e0: 20 73 65 71 75 65 6e 63 65 20 66 6f 72 20 74 68   sequence for th
c8f0: 65 20 63 6f 6d 70 6f 75 6e 64 20 73 65 6c 65 63  e compound selec
c900: 74 20 69 73 20 74 61 6b 65 6e 20 66 72 6f 6d 20  t is taken from 
c910: 74 68 65 0a 2a 2a 20 6c 65 66 74 2d 6d 6f 73 74  the.** left-most
c920: 20 74 65 72 6d 20 6f 66 20 74 68 65 20 73 65 6c   term of the sel
c930: 65 63 74 20 74 68 61 74 20 68 61 73 20 61 20 63  ect that has a c
c940: 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63  ollating sequenc
c950: 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 43 6f 6c  e..*/.static Col
c960: 6c 53 65 71 20 2a 6d 75 6c 74 69 53 65 6c 65 63  lSeq *multiSelec
c970: 74 43 6f 6c 6c 53 65 71 28 50 61 72 73 65 20 2a  tCollSeq(Parse *
c980: 70 50 61 72 73 65 2c 20 53 65 6c 65 63 74 20 2a  pParse, Select *
c990: 70 2c 20 69 6e 74 20 69 43 6f 6c 29 7b 0a 20 20  p, int iCol){.  
c9a0: 43 6f 6c 6c 53 65 71 20 2a 70 52 65 74 3b 0a 20  CollSeq *pRet;. 
c9b0: 20 69 66 28 20 70 2d 3e 70 50 72 69 6f 72 20 29   if( p->pPrior )
c9c0: 7b 0a 20 20 20 20 70 52 65 74 20 3d 20 6d 75 6c  {.    pRet = mul
c9d0: 74 69 53 65 6c 65 63 74 43 6f 6c 6c 53 65 71 28  tiSelectCollSeq(
c9e0: 70 50 61 72 73 65 2c 20 70 2d 3e 70 50 72 69 6f  pParse, p->pPrio
c9f0: 72 2c 20 69 43 6f 6c 29 3b 0a 20 20 7d 65 6c 73  r, iCol);.  }els
ca00: 65 7b 0a 20 20 20 20 70 52 65 74 20 3d 20 30 3b  e{.    pRet = 0;
ca10: 0a 20 20 7d 0a 20 20 69 66 28 20 70 52 65 74 3d  .  }.  if( pRet=
ca20: 3d 30 20 29 7b 0a 20 20 20 20 70 52 65 74 20 3d  =0 ){.    pRet =
ca30: 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c   sqlite3ExprColl
ca40: 53 65 71 28 70 50 61 72 73 65 2c 20 70 2d 3e 70  Seq(pParse, p->p
ca50: 45 4c 69 73 74 2d 3e 61 5b 69 43 6f 6c 5d 2e 70  EList->a[iCol].p
ca60: 45 78 70 72 29 3b 0a 20 20 7d 0a 20 20 72 65 74  Expr);.  }.  ret
ca70: 75 72 6e 20 70 52 65 74 3b 0a 7d 0a 23 65 6e 64  urn pRet;.}.#end
ca80: 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49  if /* SQLITE_OMI
ca90: 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45 43  T_COMPOUND_SELEC
caa0: 54 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51  T */..#ifndef SQ
cab0: 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f 4d 50 4f 55  LITE_OMIT_COMPOU
cac0: 4e 44 5f 53 45 4c 45 43 54 0a 2f 2a 0a 2a 2a 20  ND_SELECT./*.** 
cad0: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
cae0: 63 61 6c 6c 65 64 20 74 6f 20 70 72 6f 63 65 73  called to proces
caf0: 73 20 61 20 71 75 65 72 79 20 74 68 61 74 20 69  s a query that i
cb00: 73 20 72 65 61 6c 6c 79 20 74 68 65 20 75 6e 69  s really the uni
cb10: 6f 6e 0a 2a 2a 20 6f 72 20 69 6e 74 65 72 73 65  on.** or interse
cb20: 63 74 69 6f 6e 20 6f 66 20 74 77 6f 20 6f 72 20  ction of two or 
cb30: 6d 6f 72 65 20 73 65 70 61 72 61 74 65 20 71 75  more separate qu
cb40: 65 72 69 65 73 2e 0a 2a 2a 0a 2a 2a 20 22 70 22  eries..**.** "p"
cb50: 20 70 6f 69 6e 74 73 20 74 6f 20 74 68 65 20 72   points to the r
cb60: 69 67 68 74 2d 6d 6f 73 74 20 6f 66 20 74 68 65  ight-most of the
cb70: 20 74 77 6f 20 71 75 65 72 69 65 73 2e 20 20 74   two queries.  t
cb80: 68 65 20 71 75 65 72 79 20 6f 6e 20 74 68 65 0a  he query on the.
cb90: 2a 2a 20 6c 65 66 74 20 69 73 20 70 2d 3e 70 50  ** left is p->pP
cba0: 72 69 6f 72 2e 20 20 54 68 65 20 6c 65 66 74 20  rior.  The left 
cbb0: 71 75 65 72 79 20 63 6f 75 6c 64 20 61 6c 73 6f  query could also
cbc0: 20 62 65 20 61 20 63 6f 6d 70 6f 75 6e 64 20 71   be a compound q
cbd0: 75 65 72 79 0a 2a 2a 20 69 6e 20 77 68 69 63 68  uery.** in which
cbe0: 20 63 61 73 65 20 74 68 69 73 20 72 6f 75 74 69   case this routi
cbf0: 6e 65 20 77 69 6c 6c 20 62 65 20 63 61 6c 6c 65  ne will be calle
cc00: 64 20 72 65 63 75 72 73 69 76 65 6c 79 2e 20 0a  d recursively. .
cc10: 2a 2a 0a 2a 2a 20 54 68 65 20 72 65 73 75 6c 74  **.** The result
cc20: 73 20 6f 66 20 74 68 65 20 74 6f 74 61 6c 20 71  s of the total q
cc30: 75 65 72 79 20 61 72 65 20 74 6f 20 62 65 20 77  uery are to be w
cc40: 72 69 74 74 65 6e 20 69 6e 74 6f 20 61 20 64 65  ritten into a de
cc50: 73 74 69 6e 61 74 69 6f 6e 0a 2a 2a 20 6f 66 20  stination.** of 
cc60: 74 79 70 65 20 65 44 65 73 74 20 77 69 74 68 20  type eDest with 
cc70: 70 61 72 61 6d 65 74 65 72 20 69 50 61 72 6d 2e  parameter iParm.
cc80: 0a 2a 2a 0a 2a 2a 20 45 78 61 6d 70 6c 65 20 31  .**.** Example 1
cc90: 3a 20 20 43 6f 6e 73 69 64 65 72 20 61 20 74 68  :  Consider a th
cca0: 72 65 65 2d 77 61 79 20 63 6f 6d 70 6f 75 6e 64  ree-way compound
ccb0: 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 2e 0a   SQL statement..
ccc0: 2a 2a 0a 2a 2a 20 20 20 20 20 53 45 4c 45 43 54  **.**     SELECT
ccd0: 20 61 20 46 52 4f 4d 20 74 31 20 55 4e 49 4f 4e   a FROM t1 UNION
cce0: 20 53 45 4c 45 43 54 20 62 20 46 52 4f 4d 20 74   SELECT b FROM t
ccf0: 32 20 55 4e 49 4f 4e 20 53 45 4c 45 43 54 20 63  2 UNION SELECT c
cd00: 20 46 52 4f 4d 20 74 33 0a 2a 2a 0a 2a 2a 20 54   FROM t3.**.** T
cd10: 68 69 73 20 73 74 61 74 65 6d 65 6e 74 20 69 73  his statement is
cd20: 20 70 61 72 73 65 64 20 75 70 20 61 73 20 66 6f   parsed up as fo
cd30: 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  llows:.**.**    
cd40: 20 53 45 4c 45 43 54 20 63 20 46 52 4f 4d 20 74   SELECT c FROM t
cd50: 33 0a 2a 2a 20 20 20 20 20 20 7c 0a 2a 2a 20 20  3.**      |.**  
cd60: 20 20 20 20 60 2d 2d 2d 2d 2d 3e 20 20 53 45 4c      `----->  SEL
cd70: 45 43 54 20 62 20 46 52 4f 4d 20 74 32 0a 2a 2a  ECT b FROM t2.**
cd80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cd90: 7c 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  |.**            
cda0: 20 20 20 20 60 2d 2d 2d 2d 2d 2d 3e 20 20 53 45      `------>  SE
cdb0: 4c 45 43 54 20 61 20 46 52 4f 4d 20 74 31 0a 2a  LECT a FROM t1.*
cdc0: 2a 0a 2a 2a 20 54 68 65 20 61 72 72 6f 77 73 20  *.** The arrows 
cdd0: 69 6e 20 74 68 65 20 64 69 61 67 72 61 6d 20 61  in the diagram a
cde0: 62 6f 76 65 20 72 65 70 72 65 73 65 6e 74 20 74  bove represent t
cdf0: 68 65 20 53 65 6c 65 63 74 2e 70 50 72 69 6f 72  he Select.pPrior
ce00: 20 70 6f 69 6e 74 65 72 2e 0a 2a 2a 20 53 6f 20   pointer..** So 
ce10: 69 66 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  if this routine 
ce20: 69 73 20 63 61 6c 6c 65 64 20 77 69 74 68 20 70  is called with p
ce30: 20 65 71 75 61 6c 20 74 6f 20 74 68 65 20 74 33   equal to the t3
ce40: 20 71 75 65 72 79 2c 20 74 68 65 6e 0a 2a 2a 20   query, then.** 
ce50: 70 50 72 69 6f 72 20 77 69 6c 6c 20 62 65 20 74  pPrior will be t
ce60: 68 65 20 74 32 20 71 75 65 72 79 2e 20 20 70 2d  he t2 query.  p-
ce70: 3e 6f 70 20 77 69 6c 6c 20 62 65 20 54 4b 5f 55  >op will be TK_U
ce80: 4e 49 4f 4e 20 69 6e 20 74 68 69 73 20 63 61 73  NION in this cas
ce90: 65 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 69 63 65 20  e..**.** Notice 
cea0: 74 68 61 74 20 62 65 63 61 75 73 65 20 6f 66 20  that because of 
ceb0: 74 68 65 20 77 61 79 20 53 51 4c 69 74 65 20 70  the way SQLite p
cec0: 61 72 73 65 73 20 63 6f 6d 70 6f 75 6e 64 20 53  arses compound S
ced0: 45 4c 45 43 54 73 2c 20 74 68 65 0a 2a 2a 20 69  ELECTs, the.** i
cee0: 6e 64 69 76 69 64 75 61 6c 20 73 65 6c 65 63 74  ndividual select
cef0: 73 20 61 6c 77 61 79 73 20 67 72 6f 75 70 20 66  s always group f
cf00: 72 6f 6d 20 6c 65 66 74 20 74 6f 20 72 69 67 68  rom left to righ
cf10: 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  t..*/.static int
cf20: 20 6d 75 6c 74 69 53 65 6c 65 63 74 28 0a 20 20   multiSelect(.  
cf30: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
cf40: 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67        /* Parsing
cf50: 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53 65   context */.  Se
cf60: 6c 65 63 74 20 2a 70 2c 20 20 20 20 20 20 20 20  lect *p,        
cf70: 20 20 20 20 2f 2a 20 54 68 65 20 72 69 67 68 74      /* The right
cf80: 2d 6d 6f 73 74 20 6f 66 20 53 45 4c 45 43 54 73  -most of SELECTs
cf90: 20 74 6f 20 62 65 20 63 6f 64 65 64 20 2a 2f 0a   to be coded */.
cfa0: 20 20 69 6e 74 20 65 44 65 73 74 2c 20 20 20 20    int eDest,    
cfb0: 20 20 20 20 20 20 20 20 2f 2a 20 5c 5f 5f 5f 20          /* \___ 
cfc0: 20 53 74 6f 72 65 20 71 75 65 72 79 20 72 65 73   Store query res
cfd0: 75 6c 74 73 20 61 73 20 73 70 65 63 69 66 69 65  ults as specifie
cfe0: 64 20 2a 2f 0a 20 20 69 6e 74 20 69 50 61 72 6d  d */.  int iParm
cff0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ,            /* 
d000: 2f 20 20 20 20 20 62 79 20 74 68 65 73 65 20 74  /     by these t
d010: 77 6f 20 70 61 72 61 6d 65 74 65 72 73 2e 20 20  wo parameters.  
d020: 20 20 20 20 20 20 20 2a 2f 0a 20 20 63 68 61 72         */.  char
d030: 20 2a 61 66 66 20 20 20 20 20 20 20 20 20 20 20   *aff           
d040: 20 20 2f 2a 20 49 66 20 65 44 65 73 74 20 69 73    /* If eDest is
d050: 20 53 52 54 5f 55 6e 69 6f 6e 2c 20 74 68 65 20   SRT_Union, the 
d060: 61 66 66 69 6e 69 74 79 20 73 74 72 69 6e 67 20  affinity string 
d070: 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d  */.){.  int rc =
d080: 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 2f 2a   SQLITE_OK;   /*
d090: 20 53 75 63 63 65 73 73 20 63 6f 64 65 20 66 72   Success code fr
d0a0: 6f 6d 20 61 20 73 75 62 72 6f 75 74 69 6e 65 20  om a subroutine 
d0b0: 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 50 72  */.  Select *pPr
d0c0: 69 6f 72 3b 20 20 20 20 20 20 20 2f 2a 20 41 6e  ior;       /* An
d0d0: 6f 74 68 65 72 20 53 45 4c 45 43 54 20 69 6d 6d  other SELECT imm
d0e0: 65 64 69 61 74 65 6c 79 20 74 6f 20 6f 75 72 20  ediately to our 
d0f0: 6c 65 66 74 20 2a 2f 0a 20 20 56 64 62 65 20 2a  left */.  Vdbe *
d100: 76 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  v;              
d110: 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65  /* Generate code
d120: 20 74 6f 20 74 68 69 73 20 56 44 42 45 20 2a 2f   to this VDBE */
d130: 0a 20 20 69 6e 74 20 6e 43 6f 6c 3b 20 20 20 20  .  int nCol;    
d140: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
d150: 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 69 6e  er of columns in
d160: 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 20   the result set 
d170: 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70  */.  ExprList *p
d180: 4f 72 64 65 72 42 79 3b 20 20 20 2f 2a 20 54 68  OrderBy;   /* Th
d190: 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73  e ORDER BY claus
d1a0: 65 20 6f 6e 20 70 20 2a 2f 0a 20 20 69 6e 74 20  e on p */.  int 
d1b0: 61 53 65 74 50 32 5b 32 5d 3b 20 20 20 20 20 20  aSetP2[2];      
d1c0: 20 20 2f 2a 20 53 65 74 20 50 32 20 76 61 6c 75    /* Set P2 valu
d1d0: 65 20 6f 66 20 74 68 65 73 65 20 6f 70 20 74 6f  e of these op to
d1e0: 20 6e 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d   number of colum
d1f0: 6e 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 53 65 74  ns */.  int nSet
d200: 50 32 20 3d 20 30 3b 20 20 20 20 20 20 20 2f 2a  P2 = 0;       /*
d210: 20 4e 75 6d 62 65 72 20 6f 66 20 73 6c 6f 74 73   Number of slots
d220: 20 69 6e 20 61 53 65 74 50 32 5b 5d 20 75 73 65   in aSetP2[] use
d230: 64 20 2a 2f 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20  d */..  /* Make 
d240: 73 75 72 65 20 74 68 65 72 65 20 69 73 20 6e 6f  sure there is no
d250: 20 4f 52 44 45 52 20 42 59 20 6f 72 20 4c 49 4d   ORDER BY or LIM
d260: 49 54 20 63 6c 61 75 73 65 20 6f 6e 20 70 72 69  IT clause on pri
d270: 6f 72 20 53 45 4c 45 43 54 73 2e 20 20 4f 6e 6c  or SELECTs.  Onl
d280: 79 0a 20 20 2a 2a 20 74 68 65 20 6c 61 73 74 20  y.  ** the last 
d290: 28 72 69 67 68 74 2d 6d 6f 73 74 29 20 53 45 4c  (right-most) SEL
d2a0: 45 43 54 20 69 6e 20 74 68 65 20 73 65 72 69 65  ECT in the serie
d2b0: 73 20 6d 61 79 20 68 61 76 65 20 61 6e 20 4f 52  s may have an OR
d2c0: 44 45 52 20 42 59 20 6f 72 20 4c 49 4d 49 54 2e  DER BY or LIMIT.
d2d0: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 3d 3d 30  .  */.  if( p==0
d2e0: 20 7c 7c 20 70 2d 3e 70 50 72 69 6f 72 3d 3d 30   || p->pPrior==0
d2f0: 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 31 3b 0a   ){.    rc = 1;.
d300: 20 20 20 20 67 6f 74 6f 20 6d 75 6c 74 69 5f 73      goto multi_s
d310: 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 7d 0a 20  elect_end;.  }. 
d320: 20 70 50 72 69 6f 72 20 3d 20 70 2d 3e 70 50 72   pPrior = p->pPr
d330: 69 6f 72 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ior;.  assert( p
d340: 50 72 69 6f 72 2d 3e 70 52 69 67 68 74 6d 6f 73  Prior->pRightmos
d350: 74 21 3d 70 50 72 69 6f 72 20 29 3b 0a 20 20 61  t!=pPrior );.  a
d360: 73 73 65 72 74 28 20 70 50 72 69 6f 72 2d 3e 70  ssert( pPrior->p
d370: 52 69 67 68 74 6d 6f 73 74 3d 3d 70 2d 3e 70 52  Rightmost==p->pR
d380: 69 67 68 74 6d 6f 73 74 20 29 3b 0a 20 20 69 66  ightmost );.  if
d390: 28 20 70 50 72 69 6f 72 2d 3e 70 4f 72 64 65 72  ( pPrior->pOrder
d3a0: 42 79 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  By ){.    sqlite
d3b0: 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
d3c0: 2c 22 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73  ,"ORDER BY claus
d3d0: 65 20 73 68 6f 75 6c 64 20 63 6f 6d 65 20 61 66  e should come af
d3e0: 74 65 72 20 25 73 20 6e 6f 74 20 62 65 66 6f 72  ter %s not befor
d3f0: 65 22 2c 0a 20 20 20 20 20 20 73 65 6c 65 63 74  e",.      select
d400: 4f 70 4e 61 6d 65 28 70 2d 3e 6f 70 29 29 3b 0a  OpName(p->op));.
d410: 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20      rc = 1;.    
d420: 67 6f 74 6f 20 6d 75 6c 74 69 5f 73 65 6c 65 63  goto multi_selec
d430: 74 5f 65 6e 64 3b 0a 20 20 7d 0a 20 20 69 66 28  t_end;.  }.  if(
d440: 20 70 50 72 69 6f 72 2d 3e 70 4c 69 6d 69 74 20   pPrior->pLimit 
d450: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72  ){.    sqlite3Er
d460: 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 22 4c  rorMsg(pParse,"L
d470: 49 4d 49 54 20 63 6c 61 75 73 65 20 73 68 6f 75  IMIT clause shou
d480: 6c 64 20 63 6f 6d 65 20 61 66 74 65 72 20 25 73  ld come after %s
d490: 20 6e 6f 74 20 62 65 66 6f 72 65 22 2c 0a 20 20   not before",.  
d4a0: 20 20 20 20 73 65 6c 65 63 74 4f 70 4e 61 6d 65      selectOpName
d4b0: 28 70 2d 3e 6f 70 29 29 3b 0a 20 20 20 20 72 63  (p->op));.    rc
d4c0: 20 3d 20 31 3b 0a 20 20 20 20 67 6f 74 6f 20 6d   = 1;.    goto m
d4d0: 75 6c 74 69 5f 73 65 6c 65 63 74 5f 65 6e 64 3b  ulti_select_end;
d4e0: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20  .  }..  /* Make 
d4f0: 73 75 72 65 20 77 65 20 68 61 76 65 20 61 20 76  sure we have a v
d500: 61 6c 69 64 20 71 75 65 72 79 20 65 6e 67 69 6e  alid query engin
d510: 65 2e 20 20 49 66 20 6e 6f 74 2c 20 63 72 65 61  e.  If not, crea
d520: 74 65 20 61 20 6e 65 77 20 6f 6e 65 2e 0a 20 20  te a new one..  
d530: 2a 2f 0a 20 20 76 20 3d 20 73 71 6c 69 74 65 33  */.  v = sqlite3
d540: 47 65 74 56 64 62 65 28 70 50 61 72 73 65 29 3b  GetVdbe(pParse);
d550: 0a 20 20 69 66 28 20 76 3d 3d 30 20 29 7b 0a 20  .  if( v==0 ){. 
d560: 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 67     rc = 1;.    g
d570: 6f 74 6f 20 6d 75 6c 74 69 5f 73 65 6c 65 63 74  oto multi_select
d580: 5f 65 6e 64 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  _end;.  }..  /* 
d590: 43 72 65 61 74 65 20 74 68 65 20 64 65 73 74 69  Create the desti
d5a0: 6e 61 74 69 6f 6e 20 74 65 6d 70 6f 72 61 72 79  nation temporary
d5b0: 20 74 61 62 6c 65 20 69 66 20 6e 65 63 65 73 73   table if necess
d5c0: 61 72 79 0a 20 20 2a 2f 0a 20 20 69 66 28 20 65  ary.  */.  if( e
d5d0: 44 65 73 74 3d 3d 53 52 54 5f 45 70 68 65 6d 54  Dest==SRT_EphemT
d5e0: 61 62 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  ab ){.    assert
d5f0: 28 20 70 2d 3e 70 45 4c 69 73 74 20 29 3b 0a 20  ( p->pEList );. 
d600: 20 20 20 61 73 73 65 72 74 28 20 6e 53 65 74 50     assert( nSetP
d610: 32 3c 73 69 7a 65 6f 66 28 61 53 65 74 50 32 29  2<sizeof(aSetP2)
d620: 2f 73 69 7a 65 6f 66 28 61 53 65 74 50 32 5b 30  /sizeof(aSetP2[0
d630: 5d 29 20 29 3b 0a 20 20 20 20 61 53 65 74 50 32  ]) );.    aSetP2
d640: 5b 6e 53 65 74 50 32 2b 2b 5d 20 3d 20 73 71 6c  [nSetP2++] = sql
d650: 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
d660: 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61   OP_OpenEphemera
d670: 6c 2c 20 69 50 61 72 6d 2c 20 30 29 3b 0a 20 20  l, iParm, 0);.  
d680: 20 20 65 44 65 73 74 20 3d 20 53 52 54 5f 54 61    eDest = SRT_Ta
d690: 62 6c 65 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 47  ble;.  }..  /* G
d6a0: 65 6e 65 72 61 74 65 20 63 6f 64 65 20 66 6f 72  enerate code for
d6b0: 20 74 68 65 20 6c 65 66 74 20 61 6e 64 20 72 69   the left and ri
d6c0: 67 68 74 20 53 45 4c 45 43 54 20 73 74 61 74 65  ght SELECT state
d6d0: 6d 65 6e 74 73 2e 0a 20 20 2a 2f 0a 20 20 70 4f  ments..  */.  pO
d6e0: 72 64 65 72 42 79 20 3d 20 70 2d 3e 70 4f 72 64  rderBy = p->pOrd
d6f0: 65 72 42 79 3b 0a 20 20 73 77 69 74 63 68 28 20  erBy;.  switch( 
d700: 70 2d 3e 6f 70 20 29 7b 0a 20 20 20 20 63 61 73  p->op ){.    cas
d710: 65 20 54 4b 5f 41 4c 4c 3a 20 7b 0a 20 20 20 20  e TK_ALL: {.    
d720: 20 20 69 66 28 20 70 4f 72 64 65 72 42 79 3d 3d    if( pOrderBy==
d730: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74  0 ){.        int
d740: 20 61 64 64 72 20 3d 20 30 3b 0a 20 20 20 20 20   addr = 0;.     
d750: 20 20 20 61 73 73 65 72 74 28 20 21 70 50 72 69     assert( !pPri
d760: 6f 72 2d 3e 70 4c 69 6d 69 74 20 29 3b 0a 20 20  or->pLimit );.  
d770: 20 20 20 20 20 20 70 50 72 69 6f 72 2d 3e 70 4c        pPrior->pL
d780: 69 6d 69 74 20 3d 20 70 2d 3e 70 4c 69 6d 69 74  imit = p->pLimit
d790: 3b 0a 20 20 20 20 20 20 20 20 70 50 72 69 6f 72  ;.        pPrior
d7a0: 2d 3e 70 4f 66 66 73 65 74 20 3d 20 70 2d 3e 70  ->pOffset = p->p
d7b0: 4f 66 66 73 65 74 3b 0a 20 20 20 20 20 20 20 20  Offset;.        
d7c0: 72 63 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65  rc = sqlite3Sele
d7d0: 63 74 28 70 50 61 72 73 65 2c 20 70 50 72 69 6f  ct(pParse, pPrio
d7e0: 72 2c 20 65 44 65 73 74 2c 20 69 50 61 72 6d 2c  r, eDest, iParm,
d7f0: 20 30 2c 20 30 2c 20 30 2c 20 61 66 66 29 3b 0a   0, 0, 0, aff);.
d800: 20 20 20 20 20 20 20 20 70 2d 3e 70 4c 69 6d 69          p->pLimi
d810: 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 70  t = 0;.        p
d820: 2d 3e 70 4f 66 66 73 65 74 20 3d 20 30 3b 0a 20  ->pOffset = 0;. 
d830: 20 20 20 20 20 20 20 69 66 28 20 72 63 20 29 7b         if( rc ){
d840: 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20  .          goto 
d850: 6d 75 6c 74 69 5f 73 65 6c 65 63 74 5f 65 6e 64  multi_select_end
d860: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
d870: 20 20 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d 20      p->pPrior = 
d880: 30 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 69 4c  0;.        p->iL
d890: 69 6d 69 74 20 3d 20 70 50 72 69 6f 72 2d 3e 69  imit = pPrior->i
d8a0: 4c 69 6d 69 74 3b 0a 20 20 20 20 20 20 20 20 70  Limit;.        p
d8b0: 2d 3e 69 4f 66 66 73 65 74 20 3d 20 70 50 72 69  ->iOffset = pPri
d8c0: 6f 72 2d 3e 69 4f 66 66 73 65 74 3b 0a 20 20 20  or->iOffset;.   
d8d0: 20 20 20 20 20 69 66 28 20 70 2d 3e 69 4c 69 6d       if( p->iLim
d8e0: 69 74 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  it>=0 ){.       
d8f0: 20 20 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65     addr = sqlite
d900: 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
d910: 5f 49 66 4d 65 6d 5a 65 72 6f 2c 20 70 2d 3e 69  _IfMemZero, p->i
d920: 4c 69 6d 69 74 2c 20 30 29 3b 0a 20 20 20 20 20  Limit, 0);.     
d930: 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74       VdbeComment
d940: 28 28 76 2c 20 22 23 20 4a 75 6d 70 20 61 68 65  ((v, "# Jump ahe
d950: 61 64 20 69 66 20 4c 49 4d 49 54 20 72 65 61 63  ad if LIMIT reac
d960: 68 65 64 22 29 29 3b 0a 20 20 20 20 20 20 20 20  hed"));.        
d970: 7d 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73  }.        rc = s
d980: 71 6c 69 74 65 33 53 65 6c 65 63 74 28 70 50 61  qlite3Select(pPa
d990: 72 73 65 2c 20 70 2c 20 65 44 65 73 74 2c 20 69  rse, p, eDest, i
d9a0: 50 61 72 6d 2c 20 30 2c 20 30 2c 20 30 2c 20 61  Parm, 0, 0, 0, a
d9b0: 66 66 29 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e  ff);.        p->
d9c0: 70 50 72 69 6f 72 20 3d 20 70 50 72 69 6f 72 3b  pPrior = pPrior;
d9d0: 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 20  .        if( rc 
d9e0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74  ){.          got
d9f0: 6f 20 6d 75 6c 74 69 5f 73 65 6c 65 63 74 5f 65  o multi_select_e
da00: 6e 64 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  nd;.        }.  
da10: 20 20 20 20 20 20 69 66 28 20 61 64 64 72 20 29        if( addr )
da20: 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  {.          sqli
da30: 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28  te3VdbeJumpHere(
da40: 76 2c 20 61 64 64 72 29 3b 0a 20 20 20 20 20 20  v, addr);.      
da50: 20 20 7d 0a 20 20 20 20 20 20 20 20 62 72 65 61    }.        brea
da60: 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  k;.      }.     
da70: 20 2f 2a 20 46 6f 72 20 55 4e 49 4f 4e 20 41 4c   /* For UNION AL
da80: 4c 20 2e 2e 2e 20 4f 52 44 45 52 20 42 59 20 66  L ... ORDER BY f
da90: 61 6c 6c 20 74 68 72 6f 75 67 68 20 74 6f 20 74  all through to t
daa0: 68 65 20 6e 65 78 74 20 63 61 73 65 20 2a 2f 0a  he next case */.
dab0: 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54      }.    case T
dac0: 4b 5f 45 58 43 45 50 54 3a 0a 20 20 20 20 63 61  K_EXCEPT:.    ca
dad0: 73 65 20 54 4b 5f 55 4e 49 4f 4e 3a 20 7b 0a 20  se TK_UNION: {. 
dae0: 20 20 20 20 20 69 6e 74 20 75 6e 69 6f 6e 54 61       int unionTa
daf0: 62 3b 20 20 20 20 2f 2a 20 43 75 72 73 6f 72 20  b;    /* Cursor 
db00: 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20 74 65  number of the te
db10: 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20 68 6f  mporary table ho
db20: 6c 64 69 6e 67 20 72 65 73 75 6c 74 20 2a 2f 0a  lding result */.
db30: 20 20 20 20 20 20 69 6e 74 20 6f 70 20 3d 20 30        int op = 0
db40: 3b 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20 6f 66  ;      /* One of
db50: 20 74 68 65 20 53 52 54 5f 20 6f 70 65 72 61 74   the SRT_ operat
db60: 69 6f 6e 73 20 74 6f 20 61 70 70 6c 79 20 74 6f  ions to apply to
db70: 20 73 65 6c 66 20 2a 2f 0a 20 20 20 20 20 20 69   self */.      i
db80: 6e 74 20 70 72 69 6f 72 4f 70 3b 20 20 20 20 20  nt priorOp;     
db90: 2f 2a 20 54 68 65 20 53 52 54 5f 20 6f 70 65 72  /* The SRT_ oper
dba0: 61 74 69 6f 6e 20 74 6f 20 61 70 70 6c 79 20 74  ation to apply t
dbb0: 6f 20 70 72 69 6f 72 20 73 65 6c 65 63 74 73 20  o prior selects 
dbc0: 2a 2f 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70  */.      Expr *p
dbd0: 4c 69 6d 69 74 2c 20 2a 70 4f 66 66 73 65 74 3b  Limit, *pOffset;
dbe0: 20 2f 2a 20 53 61 76 65 64 20 76 61 6c 75 65 73   /* Saved values
dbf0: 20 6f 66 20 70 2d 3e 6e 4c 69 6d 69 74 20 61 6e   of p->nLimit an
dc00: 64 20 70 2d 3e 6e 4f 66 66 73 65 74 20 2a 2f 0a  d p->nOffset */.
dc10: 20 20 20 20 20 20 69 6e 74 20 61 64 64 72 3b 0a        int addr;.
dc20: 0a 20 20 20 20 20 20 70 72 69 6f 72 4f 70 20 3d  .      priorOp =
dc30: 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 41 4c 4c 20 3f   p->op==TK_ALL ?
dc40: 20 53 52 54 5f 54 61 62 6c 65 20 3a 20 53 52 54   SRT_Table : SRT
dc50: 5f 55 6e 69 6f 6e 3b 0a 20 20 20 20 20 20 69 66  _Union;.      if
dc60: 28 20 65 44 65 73 74 3d 3d 70 72 69 6f 72 4f 70  ( eDest==priorOp
dc70: 20 26 26 20 70 4f 72 64 65 72 42 79 3d 3d 30 20   && pOrderBy==0 
dc80: 26 26 20 21 70 2d 3e 70 4c 69 6d 69 74 20 26 26  && !p->pLimit &&
dc90: 20 21 70 2d 3e 70 4f 66 66 73 65 74 20 29 7b 0a   !p->pOffset ){.
dca0: 20 20 20 20 20 20 20 20 2f 2a 20 57 65 20 63 61          /* We ca
dcb0: 6e 20 72 65 75 73 65 20 61 20 74 65 6d 70 6f 72  n reuse a tempor
dcc0: 61 72 79 20 74 61 62 6c 65 20 67 65 6e 65 72 61  ary table genera
dcd0: 74 65 64 20 62 79 20 61 20 53 45 4c 45 43 54 20  ted by a SELECT 
dce0: 74 6f 20 6f 75 72 0a 20 20 20 20 20 20 20 20 2a  to our.        *
dcf0: 2a 20 72 69 67 68 74 2e 0a 20 20 20 20 20 20 20  * right..       
dd00: 20 2a 2f 0a 20 20 20 20 20 20 20 20 75 6e 69 6f   */.        unio
dd10: 6e 54 61 62 20 3d 20 69 50 61 72 6d 3b 0a 20 20  nTab = iParm;.  
dd20: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
dd30: 20 20 20 2f 2a 20 57 65 20 77 69 6c 6c 20 6e 65     /* We will ne
dd40: 65 64 20 74 6f 20 63 72 65 61 74 65 20 6f 75 72  ed to create our
dd50: 20 6f 77 6e 20 74 65 6d 70 6f 72 61 72 79 20 74   own temporary t
dd60: 61 62 6c 65 20 74 6f 20 68 6f 6c 64 20 74 68 65  able to hold the
dd70: 0a 20 20 20 20 20 20 20 20 2a 2a 20 69 6e 74 65  .        ** inte
dd80: 72 6d 65 64 69 61 74 65 20 72 65 73 75 6c 74 73  rmediate results
dd90: 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20  ..        */.   
dda0: 20 20 20 20 20 75 6e 69 6f 6e 54 61 62 20 3d 20       unionTab = 
ddb0: 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a  pParse->nTab++;.
ddc0: 20 20 20 20 20 20 20 20 69 66 28 20 70 4f 72 64          if( pOrd
ddd0: 65 72 42 79 20 26 26 20 6d 61 74 63 68 4f 72 64  erBy && matchOrd
dde0: 65 72 62 79 54 6f 43 6f 6c 75 6d 6e 28 70 50 61  erbyToColumn(pPa
ddf0: 72 73 65 2c 20 70 2c 20 70 4f 72 64 65 72 42 79  rse, p, pOrderBy
de00: 2c 20 75 6e 69 6f 6e 54 61 62 2c 31 29 20 29 7b  , unionTab,1) ){
de10: 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
de20: 31 3b 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74  1;.          got
de30: 6f 20 6d 75 6c 74 69 5f 73 65 6c 65 63 74 5f 65  o multi_select_e
de40: 6e 64 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  nd;.        }.  
de50: 20 20 20 20 20 20 61 64 64 72 20 3d 20 73 71 6c        addr = sql
de60: 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
de70: 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61   OP_OpenEphemera
de80: 6c 2c 20 75 6e 69 6f 6e 54 61 62 2c 20 30 29 3b  l, unionTab, 0);
de90: 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 72 69  .        if( pri
dea0: 6f 72 4f 70 3d 3d 53 52 54 5f 54 61 62 6c 65 20  orOp==SRT_Table 
deb0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 61 73 73  ){.          ass
dec0: 65 72 74 28 20 6e 53 65 74 50 32 3c 73 69 7a 65  ert( nSetP2<size
ded0: 6f 66 28 61 53 65 74 50 32 29 2f 73 69 7a 65 6f  of(aSetP2)/sizeo
dee0: 66 28 61 53 65 74 50 32 5b 30 5d 29 20 29 3b 0a  f(aSetP2[0]) );.
def0: 20 20 20 20 20 20 20 20 20 20 61 53 65 74 50 32            aSetP2
df00: 5b 6e 53 65 74 50 32 2b 2b 5d 20 3d 20 61 64 64  [nSetP2++] = add
df10: 72 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  r;.        }else
df20: 7b 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65  {.          asse
df30: 72 74 28 20 70 2d 3e 61 64 64 72 4f 70 65 6e 45  rt( p->addrOpenE
df40: 70 68 6d 5b 30 5d 20 3d 3d 20 2d 31 20 29 3b 0a  phm[0] == -1 );.
df50: 20 20 20 20 20 20 20 20 20 20 70 2d 3e 61 64 64            p->add
df60: 72 4f 70 65 6e 45 70 68 6d 5b 30 5d 20 3d 20 61  rOpenEphm[0] = a
df70: 64 64 72 3b 0a 20 20 20 20 20 20 20 20 20 20 70  ddr;.          p
df80: 2d 3e 70 52 69 67 68 74 6d 6f 73 74 2d 3e 75 73  ->pRightmost->us
df90: 65 73 45 70 68 6d 20 3d 20 31 3b 0a 20 20 20 20  esEphm = 1;.    
dfa0: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 63 72      }.        cr
dfb0: 65 61 74 65 53 6f 72 74 69 6e 67 49 6e 64 65 78  eateSortingIndex
dfc0: 28 70 50 61 72 73 65 2c 20 70 2c 20 70 4f 72 64  (pParse, p, pOrd
dfd0: 65 72 42 79 29 3b 0a 20 20 20 20 20 20 20 20 61  erBy);.        a
dfe0: 73 73 65 72 74 28 20 70 2d 3e 70 45 4c 69 73 74  ssert( p->pEList
dff0: 20 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20   );.      }..   
e000: 20 20 20 2f 2a 20 43 6f 64 65 20 74 68 65 20 53     /* Code the S
e010: 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 73  ELECT statements
e020: 20 74 6f 20 6f 75 72 20 6c 65 66 74 0a 20 20 20   to our left.   
e030: 20 20 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65     */.      asse
e040: 72 74 28 20 21 70 50 72 69 6f 72 2d 3e 70 4f 72  rt( !pPrior->pOr
e050: 64 65 72 42 79 20 29 3b 0a 20 20 20 20 20 20 72  derBy );.      r
e060: 63 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63  c = sqlite3Selec
e070: 74 28 70 50 61 72 73 65 2c 20 70 50 72 69 6f 72  t(pParse, pPrior
e080: 2c 20 70 72 69 6f 72 4f 70 2c 20 75 6e 69 6f 6e  , priorOp, union
e090: 54 61 62 2c 20 30 2c 20 30 2c 20 30 2c 20 61 66  Tab, 0, 0, 0, af
e0a0: 66 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  f);.      if( rc
e0b0: 20 29 7b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f   ){.        goto
e0c0: 20 6d 75 6c 74 69 5f 73 65 6c 65 63 74 5f 65 6e   multi_select_en
e0d0: 64 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  d;.      }..    
e0e0: 20 20 2f 2a 20 43 6f 64 65 20 74 68 65 20 63 75    /* Code the cu
e0f0: 72 72 65 6e 74 20 53 45 4c 45 43 54 20 73 74 61  rrent SELECT sta
e100: 74 65 6d 65 6e 74 0a 20 20 20 20 20 20 2a 2f 0a  tement.      */.
e110: 20 20 20 20 20 20 73 77 69 74 63 68 28 20 70 2d        switch( p-
e120: 3e 6f 70 20 29 7b 0a 20 20 20 20 20 20 20 20 20  >op ){.         
e130: 63 61 73 65 20 54 4b 5f 45 58 43 45 50 54 3a 20  case TK_EXCEPT: 
e140: 20 6f 70 20 3d 20 53 52 54 5f 45 78 63 65 70 74   op = SRT_Except
e150: 3b 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20  ;   break;.     
e160: 20 20 20 20 63 61 73 65 20 54 4b 5f 55 4e 49 4f      case TK_UNIO
e170: 4e 3a 20 20 20 6f 70 20 3d 20 53 52 54 5f 55 6e  N:   op = SRT_Un
e180: 69 6f 6e 3b 20 20 20 20 62 72 65 61 6b 3b 0a 20  ion;    break;. 
e190: 20 20 20 20 20 20 20 20 63 61 73 65 20 54 4b 5f          case TK_
e1a0: 41 4c 4c 3a 20 20 20 20 20 6f 70 20 3d 20 53 52  ALL:     op = SR
e1b0: 54 5f 54 61 62 6c 65 3b 20 20 20 20 62 72 65 61  T_Table;    brea
e1c0: 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  k;.      }.     
e1d0: 20 70 2d 3e 70 50 72 69 6f 72 20 3d 20 30 3b 0a   p->pPrior = 0;.
e1e0: 20 20 20 20 20 20 70 2d 3e 70 4f 72 64 65 72 42        p->pOrderB
e1f0: 79 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 2d 3e  y = 0;.      p->
e200: 64 69 73 61 6c 6c 6f 77 4f 72 64 65 72 42 79 20  disallowOrderBy 
e210: 3d 20 70 4f 72 64 65 72 42 79 21 3d 30 3b 0a 20  = pOrderBy!=0;. 
e220: 20 20 20 20 20 70 4c 69 6d 69 74 20 3d 20 70 2d       pLimit = p-
e230: 3e 70 4c 69 6d 69 74 3b 0a 20 20 20 20 20 20 70  >pLimit;.      p
e240: 2d 3e 70 4c 69 6d 69 74 20 3d 20 30 3b 0a 20 20  ->pLimit = 0;.  
e250: 20 20 20 20 70 4f 66 66 73 65 74 20 3d 20 70 2d      pOffset = p-
e260: 3e 70 4f 66 66 73 65 74 3b 0a 20 20 20 20 20 20  >pOffset;.      
e270: 70 2d 3e 70 4f 66 66 73 65 74 20 3d 20 30 3b 0a  p->pOffset = 0;.
e280: 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
e290: 65 33 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c  e3Select(pParse,
e2a0: 20 70 2c 20 6f 70 2c 20 75 6e 69 6f 6e 54 61 62   p, op, unionTab
e2b0: 2c 20 30 2c 20 30 2c 20 30 2c 20 61 66 66 29 3b  , 0, 0, 0, aff);
e2c0: 0a 20 20 20 20 20 20 70 2d 3e 70 50 72 69 6f 72  .      p->pPrior
e2d0: 20 3d 20 70 50 72 69 6f 72 3b 0a 20 20 20 20 20   = pPrior;.     
e2e0: 20 70 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20 70   p->pOrderBy = p
e2f0: 4f 72 64 65 72 42 79 3b 0a 20 20 20 20 20 20 73  OrderBy;.      s
e300: 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65  qlite3ExprDelete
e310: 28 70 2d 3e 70 4c 69 6d 69 74 29 3b 0a 20 20 20  (p->pLimit);.   
e320: 20 20 20 70 2d 3e 70 4c 69 6d 69 74 20 3d 20 70     p->pLimit = p
e330: 4c 69 6d 69 74 3b 0a 20 20 20 20 20 20 70 2d 3e  Limit;.      p->
e340: 70 4f 66 66 73 65 74 20 3d 20 70 4f 66 66 73 65  pOffset = pOffse
e350: 74 3b 0a 20 20 20 20 20 20 70 2d 3e 69 4c 69 6d  t;.      p->iLim
e360: 69 74 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 70  it = -1;.      p
e370: 2d 3e 69 4f 66 66 73 65 74 20 3d 20 2d 31 3b 0a  ->iOffset = -1;.
e380: 20 20 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a        if( rc ){.
e390: 20 20 20 20 20 20 20 20 67 6f 74 6f 20 6d 75 6c          goto mul
e3a0: 74 69 5f 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20  ti_select_end;. 
e3b0: 20 20 20 20 20 7d 0a 0a 0a 20 20 20 20 20 20 2f       }...      /
e3c0: 2a 20 43 6f 6e 76 65 72 74 20 74 68 65 20 64 61  * Convert the da
e3d0: 74 61 20 69 6e 20 74 68 65 20 74 65 6d 70 6f 72  ta in the tempor
e3e0: 61 72 79 20 74 61 62 6c 65 20 69 6e 74 6f 20 77  ary table into w
e3f0: 68 61 74 65 76 65 72 20 66 6f 72 6d 0a 20 20 20  hatever form.   
e400: 20 20 20 2a 2a 20 69 74 20 69 73 20 74 68 61 74     ** it is that
e410: 20 77 65 20 63 75 72 72 65 6e 74 6c 79 20 6e 65   we currently ne
e420: 65 64 2e 0a 20 20 20 20 20 20 2a 2f 20 20 20 20  ed..      */    
e430: 20 20 0a 20 20 20 20 20 20 69 66 28 20 65 44 65    .      if( eDe
e440: 73 74 21 3d 70 72 69 6f 72 4f 70 20 7c 7c 20 75  st!=priorOp || u
e450: 6e 69 6f 6e 54 61 62 21 3d 69 50 61 72 6d 20 29  nionTab!=iParm )
e460: 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69 43  {.        int iC
e470: 6f 6e 74 2c 20 69 42 72 65 61 6b 2c 20 69 53 74  ont, iBreak, iSt
e480: 61 72 74 3b 0a 20 20 20 20 20 20 20 20 61 73 73  art;.        ass
e490: 65 72 74 28 20 70 2d 3e 70 45 4c 69 73 74 20 29  ert( p->pEList )
e4a0: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 65 44  ;.        if( eD
e4b0: 65 73 74 3d 3d 53 52 54 5f 43 61 6c 6c 62 61 63  est==SRT_Callbac
e4c0: 6b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 53  k ){.          S
e4d0: 65 6c 65 63 74 20 2a 70 46 69 72 73 74 20 3d 20  elect *pFirst = 
e4e0: 70 3b 0a 20 20 20 20 20 20 20 20 20 20 77 68 69  p;.          whi
e4f0: 6c 65 28 20 70 46 69 72 73 74 2d 3e 70 50 72 69  le( pFirst->pPri
e500: 6f 72 20 29 20 70 46 69 72 73 74 20 3d 20 70 46  or ) pFirst = pF
e510: 69 72 73 74 2d 3e 70 50 72 69 6f 72 3b 0a 20 20  irst->pPrior;.  
e520: 20 20 20 20 20 20 20 20 67 65 6e 65 72 61 74 65          generate
e530: 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 70 50 61 72  ColumnNames(pPar
e540: 73 65 2c 20 30 2c 20 70 46 69 72 73 74 2d 3e 70  se, 0, pFirst->p
e550: 45 4c 69 73 74 29 3b 0a 20 20 20 20 20 20 20 20  EList);.        
e560: 7d 0a 20 20 20 20 20 20 20 20 69 42 72 65 61 6b  }.        iBreak
e570: 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61   = sqlite3VdbeMa
e580: 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20  keLabel(v);.    
e590: 20 20 20 20 69 43 6f 6e 74 20 3d 20 73 71 6c 69      iCont = sqli
e5a0: 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c  te3VdbeMakeLabel
e5b0: 28 76 29 3b 0a 20 20 20 20 20 20 20 20 63 6f 6d  (v);.        com
e5c0: 70 75 74 65 4c 69 6d 69 74 52 65 67 69 73 74 65  puteLimitRegiste
e5d0: 72 73 28 70 50 61 72 73 65 2c 20 70 2c 20 69 42  rs(pParse, p, iB
e5e0: 72 65 61 6b 29 3b 0a 20 20 20 20 20 20 20 20 73  reak);.        s
e5f0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
e600: 76 2c 20 4f 50 5f 52 65 77 69 6e 64 2c 20 75 6e  v, OP_Rewind, un
e610: 69 6f 6e 54 61 62 2c 20 69 42 72 65 61 6b 29 3b  ionTab, iBreak);
e620: 0a 20 20 20 20 20 20 20 20 69 53 74 61 72 74 20  .        iStart 
e630: 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72  = sqlite3VdbeCur
e640: 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 20 20 20  rentAddr(v);.   
e650: 20 20 20 20 20 72 63 20 3d 20 73 65 6c 65 63 74       rc = select
e660: 49 6e 6e 65 72 4c 6f 6f 70 28 70 50 61 72 73 65  InnerLoop(pParse
e670: 2c 20 70 2c 20 70 2d 3e 70 45 4c 69 73 74 2c 20  , p, p->pEList, 
e680: 75 6e 69 6f 6e 54 61 62 2c 20 70 2d 3e 70 45 4c  unionTab, p->pEL
e690: 69 73 74 2d 3e 6e 45 78 70 72 2c 0a 20 20 20 20  ist->nExpr,.    
e6a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e6b0: 20 20 20 20 20 20 20 20 20 70 4f 72 64 65 72 42           pOrderB
e6c0: 79 2c 20 2d 31 2c 20 65 44 65 73 74 2c 20 69 50  y, -1, eDest, iP
e6d0: 61 72 6d 2c 20 0a 20 20 20 20 20 20 20 20 20 20  arm, .          
e6e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e6f0: 20 20 20 69 43 6f 6e 74 2c 20 69 42 72 65 61 6b     iCont, iBreak
e700: 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 69 66  , 0);.        if
e710: 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20  ( rc ){.        
e720: 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 20 20    rc = 1;.      
e730: 20 20 20 20 67 6f 74 6f 20 6d 75 6c 74 69 5f 73      goto multi_s
e740: 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 20  elect_end;.     
e750: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 73 71 6c     }.        sql
e760: 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c  ite3VdbeResolveL
e770: 61 62 65 6c 28 76 2c 20 69 43 6f 6e 74 29 3b 0a  abel(v, iCont);.
e780: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
e790: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4e  dbeAddOp(v, OP_N
e7a0: 65 78 74 2c 20 75 6e 69 6f 6e 54 61 62 2c 20 69  ext, unionTab, i
e7b0: 53 74 61 72 74 29 3b 0a 20 20 20 20 20 20 20 20  Start);.        
e7c0: 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c  sqlite3VdbeResol
e7d0: 76 65 4c 61 62 65 6c 28 76 2c 20 69 42 72 65 61  veLabel(v, iBrea
e7e0: 6b 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  k);.        sqli
e7f0: 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
e800: 4f 50 5f 43 6c 6f 73 65 2c 20 75 6e 69 6f 6e 54  OP_Close, unionT
e810: 61 62 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a  ab, 0);.      }.
e820: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
e830: 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49   }.    case TK_I
e840: 4e 54 45 52 53 45 43 54 3a 20 7b 0a 20 20 20 20  NTERSECT: {.    
e850: 20 20 69 6e 74 20 74 61 62 31 2c 20 74 61 62 32    int tab1, tab2
e860: 3b 0a 20 20 20 20 20 20 69 6e 74 20 69 43 6f 6e  ;.      int iCon
e870: 74 2c 20 69 42 72 65 61 6b 2c 20 69 53 74 61 72  t, iBreak, iStar
e880: 74 3b 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70  t;.      Expr *p
e890: 4c 69 6d 69 74 2c 20 2a 70 4f 66 66 73 65 74 3b  Limit, *pOffset;
e8a0: 0a 20 20 20 20 20 20 69 6e 74 20 61 64 64 72 3b  .      int addr;
e8b0: 0a 0a 20 20 20 20 20 20 2f 2a 20 49 4e 54 45 52  ..      /* INTER
e8c0: 53 45 43 54 20 69 73 20 64 69 66 66 65 72 65 6e  SECT is differen
e8d0: 74 20 66 72 6f 6d 20 74 68 65 20 6f 74 68 65 72  t from the other
e8e0: 73 20 73 69 6e 63 65 20 69 74 20 72 65 71 75 69  s since it requi
e8f0: 72 65 73 0a 20 20 20 20 20 20 2a 2a 20 74 77 6f  res.      ** two
e900: 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65   temporary table
e910: 73 2e 20 20 48 65 6e 63 65 20 69 74 20 68 61 73  s.  Hence it has
e920: 20 69 74 73 20 6f 77 6e 20 63 61 73 65 2e 20 20   its own case.  
e930: 42 65 67 69 6e 0a 20 20 20 20 20 20 2a 2a 20 62  Begin.      ** b
e940: 79 20 61 6c 6c 6f 63 61 74 69 6e 67 20 74 68 65  y allocating the
e950: 20 74 61 62 6c 65 73 20 77 65 20 77 69 6c 6c 20   tables we will 
e960: 6e 65 65 64 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  need..      */. 
e970: 20 20 20 20 20 74 61 62 31 20 3d 20 70 50 61 72       tab1 = pPar
e980: 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20  se->nTab++;.    
e990: 20 20 74 61 62 32 20 3d 20 70 50 61 72 73 65 2d    tab2 = pParse-
e9a0: 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20 20 20 69  >nTab++;.      i
e9b0: 66 28 20 70 4f 72 64 65 72 42 79 20 26 26 20 6d  f( pOrderBy && m
e9c0: 61 74 63 68 4f 72 64 65 72 62 79 54 6f 43 6f 6c  atchOrderbyToCol
e9d0: 75 6d 6e 28 70 50 61 72 73 65 2c 70 2c 70 4f 72  umn(pParse,p,pOr
e9e0: 64 65 72 42 79 2c 74 61 62 31 2c 31 29 20 29 7b  derBy,tab1,1) ){
e9f0: 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 31 3b  .        rc = 1;
ea00: 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 6d 75  .        goto mu
ea10: 6c 74 69 5f 73 65 6c 65 63 74 5f 65 6e 64 3b 0a  lti_select_end;.
ea20: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 63 72        }.      cr
ea30: 65 61 74 65 53 6f 72 74 69 6e 67 49 6e 64 65 78  eateSortingIndex
ea40: 28 70 50 61 72 73 65 2c 20 70 2c 20 70 4f 72 64  (pParse, p, pOrd
ea50: 65 72 42 79 29 3b 0a 0a 20 20 20 20 20 20 61 64  erBy);..      ad
ea60: 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  dr = sqlite3Vdbe
ea70: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4f 70 65 6e  AddOp(v, OP_Open
ea80: 45 70 68 65 6d 65 72 61 6c 2c 20 74 61 62 31 2c  Ephemeral, tab1,
ea90: 20 30 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72   0);.      asser
eaa0: 74 28 20 70 2d 3e 61 64 64 72 4f 70 65 6e 45 70  t( p->addrOpenEp
eab0: 68 6d 5b 30 5d 20 3d 3d 20 2d 31 20 29 3b 0a 20  hm[0] == -1 );. 
eac0: 20 20 20 20 20 70 2d 3e 61 64 64 72 4f 70 65 6e       p->addrOpen
ead0: 45 70 68 6d 5b 30 5d 20 3d 20 61 64 64 72 3b 0a  Ephm[0] = addr;.
eae0: 20 20 20 20 20 20 70 2d 3e 70 52 69 67 68 74 6d        p->pRightm
eaf0: 6f 73 74 2d 3e 75 73 65 73 45 70 68 6d 20 3d 20  ost->usesEphm = 
eb00: 31 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  1;.      assert(
eb10: 20 70 2d 3e 70 45 4c 69 73 74 20 29 3b 0a 0a 20   p->pEList );.. 
eb20: 20 20 20 20 20 2f 2a 20 43 6f 64 65 20 74 68 65       /* Code the
eb30: 20 53 45 4c 45 43 54 73 20 74 6f 20 6f 75 72 20   SELECTs to our 
eb40: 6c 65 66 74 20 69 6e 74 6f 20 74 65 6d 70 6f 72  left into tempor
eb50: 61 72 79 20 74 61 62 6c 65 20 22 74 61 62 31 22  ary table "tab1"
eb60: 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
eb70: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 53 65 6c   rc = sqlite3Sel
eb80: 65 63 74 28 70 50 61 72 73 65 2c 20 70 50 72 69  ect(pParse, pPri
eb90: 6f 72 2c 20 53 52 54 5f 55 6e 69 6f 6e 2c 20 74  or, SRT_Union, t
eba0: 61 62 31 2c 20 30 2c 20 30 2c 20 30 2c 20 61 66  ab1, 0, 0, 0, af
ebb0: 66 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  f);.      if( rc
ebc0: 20 29 7b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f   ){.        goto
ebd0: 20 6d 75 6c 74 69 5f 73 65 6c 65 63 74 5f 65 6e   multi_select_en
ebe0: 64 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  d;.      }..    
ebf0: 20 20 2f 2a 20 43 6f 64 65 20 74 68 65 20 63 75    /* Code the cu
ec00: 72 72 65 6e 74 20 53 45 4c 45 43 54 20 69 6e 74  rrent SELECT int
ec10: 6f 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c  o temporary tabl
ec20: 65 20 22 74 61 62 32 22 0a 20 20 20 20 20 20 2a  e "tab2".      *
ec30: 2f 0a 20 20 20 20 20 20 61 64 64 72 20 3d 20 73  /.      addr = s
ec40: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
ec50: 76 2c 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65  v, OP_OpenEpheme
ec60: 72 61 6c 2c 20 74 61 62 32 2c 20 30 29 3b 0a 20  ral, tab2, 0);. 
ec70: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e       assert( p->
ec80: 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b 31 5d 20  addrOpenEphm[1] 
ec90: 3d 3d 20 2d 31 20 29 3b 0a 20 20 20 20 20 20 70  == -1 );.      p
eca0: 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b 31  ->addrOpenEphm[1
ecb0: 5d 20 3d 20 61 64 64 72 3b 0a 20 20 20 20 20 20  ] = addr;.      
ecc0: 70 2d 3e 70 50 72 69 6f 72 20 3d 20 30 3b 0a 20  p->pPrior = 0;. 
ecd0: 20 20 20 20 20 70 4c 69 6d 69 74 20 3d 20 70 2d       pLimit = p-
ece0: 3e 70 4c 69 6d 69 74 3b 0a 20 20 20 20 20 20 70  >pLimit;.      p
ecf0: 2d 3e 70 4c 69 6d 69 74 20 3d 20 30 3b 0a 20 20  ->pLimit = 0;.  
ed00: 20 20 20 20 70 4f 66 66 73 65 74 20 3d 20 70 2d      pOffset = p-
ed10: 3e 70 4f 66 66 73 65 74 3b 0a 20 20 20 20 20 20  >pOffset;.      
ed20: 70 2d 3e 70 4f 66 66 73 65 74 20 3d 20 30 3b 0a  p->pOffset = 0;.
ed30: 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
ed40: 65 33 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c  e3Select(pParse,
ed50: 20 70 2c 20 53 52 54 5f 55 6e 69 6f 6e 2c 20 74   p, SRT_Union, t
ed60: 61 62 32 2c 20 30 2c 20 30 2c 20 30 2c 20 61 66  ab2, 0, 0, 0, af
ed70: 66 29 3b 0a 20 20 20 20 20 20 70 2d 3e 70 50 72  f);.      p->pPr
ed80: 69 6f 72 20 3d 20 70 50 72 69 6f 72 3b 0a 20 20  ior = pPrior;.  
ed90: 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 44      sqlite3ExprD
eda0: 65 6c 65 74 65 28 70 2d 3e 70 4c 69 6d 69 74 29  elete(p->pLimit)
edb0: 3b 0a 20 20 20 20 20 20 70 2d 3e 70 4c 69 6d 69  ;.      p->pLimi
edc0: 74 20 3d 20 70 4c 69 6d 69 74 3b 0a 20 20 20 20  t = pLimit;.    
edd0: 20 20 70 2d 3e 70 4f 66 66 73 65 74 20 3d 20 70    p->pOffset = p
ede0: 4f 66 66 73 65 74 3b 0a 20 20 20 20 20 20 69 66  Offset;.      if
edf0: 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20  ( rc ){.        
ee00: 67 6f 74 6f 20 6d 75 6c 74 69 5f 73 65 6c 65 63  goto multi_selec
ee10: 74 5f 65 6e 64 3b 0a 20 20 20 20 20 20 7d 0a 0a  t_end;.      }..
ee20: 20 20 20 20 20 20 2f 2a 20 47 65 6e 65 72 61 74        /* Generat
ee30: 65 20 63 6f 64 65 20 74 6f 20 74 61 6b 65 20 74  e code to take t
ee40: 68 65 20 69 6e 74 65 72 73 65 63 74 69 6f 6e 20  he intersection 
ee50: 6f 66 20 74 68 65 20 74 77 6f 20 74 65 6d 70 6f  of the two tempo
ee60: 72 61 72 79 0a 20 20 20 20 20 20 2a 2a 20 74 61  rary.      ** ta
ee70: 62 6c 65 73 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  bles..      */. 
ee80: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e       assert( p->
ee90: 70 45 4c 69 73 74 20 29 3b 0a 20 20 20 20 20 20  pEList );.      
eea0: 69 66 28 20 65 44 65 73 74 3d 3d 53 52 54 5f 43  if( eDest==SRT_C
eeb0: 61 6c 6c 62 61 63 6b 20 29 7b 0a 20 20 20 20 20  allback ){.     
eec0: 20 20 20 53 65 6c 65 63 74 20 2a 70 46 69 72 73     Select *pFirs
eed0: 74 20 3d 20 70 3b 0a 20 20 20 20 20 20 20 20 77  t = p;.        w
eee0: 68 69 6c 65 28 20 70 46 69 72 73 74 2d 3e 70 50  hile( pFirst->pP
eef0: 72 69 6f 72 20 29 20 70 46 69 72 73 74 20 3d 20  rior ) pFirst = 
ef00: 70 46 69 72 73 74 2d 3e 70 50 72 69 6f 72 3b 0a  pFirst->pPrior;.
ef10: 20 20 20 20 20 20 20 20 67 65 6e 65 72 61 74 65          generate
ef20: 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 70 50 61 72  ColumnNames(pPar
ef30: 73 65 2c 20 30 2c 20 70 46 69 72 73 74 2d 3e 70  se, 0, pFirst->p
ef40: 45 4c 69 73 74 29 3b 0a 20 20 20 20 20 20 7d 0a  EList);.      }.
ef50: 20 20 20 20 20 20 69 42 72 65 61 6b 20 3d 20 73        iBreak = s
ef60: 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61  qlite3VdbeMakeLa
ef70: 62 65 6c 28 76 29 3b 0a 20 20 20 20 20 20 69 43  bel(v);.      iC
ef80: 6f 6e 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62  ont = sqlite3Vdb
ef90: 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20  eMakeLabel(v);. 
efa0: 20 20 20 20 20 63 6f 6d 70 75 74 65 4c 69 6d 69       computeLimi
efb0: 74 52 65 67 69 73 74 65 72 73 28 70 50 61 72 73  tRegisters(pPars
efc0: 65 2c 20 70 2c 20 69 42 72 65 61 6b 29 3b 0a 20  e, p, iBreak);. 
efd0: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
efe0: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 52 65 77 69  AddOp(v, OP_Rewi
eff0: 6e 64 2c 20 74 61 62 31 2c 20 69 42 72 65 61 6b  nd, tab1, iBreak
f000: 29 3b 0a 20 20 20 20 20 20 69 53 74 61 72 74 20  );.      iStart 
f010: 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  = sqlite3VdbeAdd
f020: 4f 70 28 76 2c 20 4f 50 5f 52 6f 77 4b 65 79 2c  Op(v, OP_RowKey,
f030: 20 74 61 62 31 2c 20 30 29 3b 0a 20 20 20 20 20   tab1, 0);.     
f040: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
f050: 70 28 76 2c 20 4f 50 5f 4e 6f 74 46 6f 75 6e 64  p(v, OP_NotFound
f060: 2c 20 74 61 62 32 2c 20 69 43 6f 6e 74 29 3b 0a  , tab2, iCont);.
f070: 20 20 20 20 20 20 72 63 20 3d 20 73 65 6c 65 63        rc = selec
f080: 74 49 6e 6e 65 72 4c 6f 6f 70 28 70 50 61 72 73  tInnerLoop(pPars
f090: 65 2c 20 70 2c 20 70 2d 3e 70 45 4c 69 73 74 2c  e, p, p->pEList,
f0a0: 20 74 61 62 31 2c 20 70 2d 3e 70 45 4c 69 73 74   tab1, p->pEList
f0b0: 2d 3e 6e 45 78 70 72 2c 0a 20 20 20 20 20 20 20  ->nExpr,.       
f0c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f0d0: 20 20 20 20 20 20 70 4f 72 64 65 72 42 79 2c 20        pOrderBy, 
f0e0: 2d 31 2c 20 65 44 65 73 74 2c 20 69 50 61 72 6d  -1, eDest, iParm
f0f0: 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  , .             
f100: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f110: 69 43 6f 6e 74 2c 20 69 42 72 65 61 6b 2c 20 30  iCont, iBreak, 0
f120: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 20  );.      if( rc 
f130: 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
f140: 31 3b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20  1;.        goto 
f150: 6d 75 6c 74 69 5f 73 65 6c 65 63 74 5f 65 6e 64  multi_select_end
f160: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
f170: 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c  sqlite3VdbeResol
f180: 76 65 4c 61 62 65 6c 28 76 2c 20 69 43 6f 6e 74  veLabel(v, iCont
f190: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
f1a0: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
f1b0: 4e 65 78 74 2c 20 74 61 62 31 2c 20 69 53 74 61  Next, tab1, iSta
f1c0: 72 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  rt);.      sqlit
f1d0: 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62  e3VdbeResolveLab
f1e0: 65 6c 28 76 2c 20 69 42 72 65 61 6b 29 3b 0a 20  el(v, iBreak);. 
f1f0: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
f200: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 43 6c 6f 73  AddOp(v, OP_Clos
f210: 65 2c 20 74 61 62 32 2c 20 30 29 3b 0a 20 20 20  e, tab2, 0);.   
f220: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
f230: 64 4f 70 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c  dOp(v, OP_Close,
f240: 20 74 61 62 31 2c 20 30 29 3b 0a 20 20 20 20 20   tab1, 0);.     
f250: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
f260: 7d 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72  }..  /* Make sur
f270: 65 20 61 6c 6c 20 53 45 4c 45 43 54 73 20 69 6e  e all SELECTs in
f280: 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 68   the statement h
f290: 61 76 65 20 74 68 65 20 73 61 6d 65 20 6e 75 6d  ave the same num
f2a0: 62 65 72 20 6f 66 20 65 6c 65 6d 65 6e 74 73 0a  ber of elements.
f2b0: 20 20 2a 2a 20 69 6e 20 74 68 65 69 72 20 72 65    ** in their re
f2c0: 73 75 6c 74 20 73 65 74 73 2e 0a 20 20 2a 2f 0a  sult sets..  */.
f2d0: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 45 4c    assert( p->pEL
f2e0: 69 73 74 20 26 26 20 70 50 72 69 6f 72 2d 3e 70  ist && pPrior->p
f2f0: 45 4c 69 73 74 20 29 3b 0a 20 20 69 66 28 20 70  EList );.  if( p
f300: 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 21  ->pEList->nExpr!
f310: 3d 70 50 72 69 6f 72 2d 3e 70 45 4c 69 73 74 2d  =pPrior->pEList-
f320: 3e 6e 45 78 70 72 20 29 7b 0a 20 20 20 20 73 71  >nExpr ){.    sq
f330: 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
f340: 61 72 73 65 2c 20 22 53 45 4c 45 43 54 73 20 74  arse, "SELECTs t
f350: 6f 20 74 68 65 20 6c 65 66 74 20 61 6e 64 20 72  o the left and r
f360: 69 67 68 74 20 6f 66 20 25 73 22 0a 20 20 20 20  ight of %s".    
f370: 20 20 22 20 64 6f 20 6e 6f 74 20 68 61 76 65 20    " do not have 
f380: 74 68 65 20 73 61 6d 65 20 6e 75 6d 62 65 72 20  the same number 
f390: 6f 66 20 72 65 73 75 6c 74 20 63 6f 6c 75 6d 6e  of result column
f3a0: 73 22 2c 20 73 65 6c 65 63 74 4f 70 4e 61 6d 65  s", selectOpName
f3b0: 28 70 2d 3e 6f 70 29 29 3b 0a 20 20 20 20 72 63  (p->op));.    rc
f3c0: 20 3d 20 31 3b 0a 20 20 20 20 67 6f 74 6f 20 6d   = 1;.    goto m
f3d0: 75 6c 74 69 5f 73 65 6c 65 63 74 5f 65 6e 64 3b  ulti_select_end;
f3e0: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 65 74 20 74  .  }..  /* Set t
f3f0: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 63 6f 6c  he number of col
f400: 75 6d 6e 73 20 69 6e 20 74 65 6d 70 6f 72 61 72  umns in temporar
f410: 79 20 74 61 62 6c 65 73 0a 20 20 2a 2f 0a 20 20  y tables.  */.  
f420: 6e 43 6f 6c 20 3d 20 70 2d 3e 70 45 4c 69 73 74  nCol = p->pEList
f430: 2d 3e 6e 45 78 70 72 3b 0a 20 20 77 68 69 6c 65  ->nExpr;.  while
f440: 28 20 6e 53 65 74 50 32 20 29 7b 0a 20 20 20 20  ( nSetP2 ){.    
f450: 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67  sqlite3VdbeChang
f460: 65 50 32 28 76 2c 20 61 53 65 74 50 32 5b 2d 2d  eP2(v, aSetP2[--
f470: 6e 53 65 74 50 32 5d 2c 20 6e 43 6f 6c 29 3b 0a  nSetP2], nCol);.
f480: 20 20 7d 0a 0a 20 20 2f 2a 20 43 6f 6d 70 75 74    }..  /* Comput
f490: 65 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75  e collating sequ
f4a0: 65 6e 63 65 73 20 75 73 65 64 20 62 79 20 65 69  ences used by ei
f4b0: 74 68 65 72 20 74 68 65 20 4f 52 44 45 52 20 42  ther the ORDER B
f4c0: 59 20 63 6c 61 75 73 65 20 6f 72 0a 20 20 2a 2a  Y clause or.  **
f4d0: 20 62 79 20 61 6e 79 20 74 65 6d 70 6f 72 61 72   by any temporar
f4e0: 79 20 74 61 62 6c 65 73 20 6e 65 65 64 65 64 20  y tables needed 
f4f0: 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 74 68 65  to implement the
f500: 20 63 6f 6d 70 6f 75 6e 64 20 73 65 6c 65 63 74   compound select
f510: 2e 0a 20 20 2a 2a 20 41 74 74 61 63 68 20 74 68  ..  ** Attach th
f520: 65 20 4b 65 79 49 6e 66 6f 20 73 74 72 75 63 74  e KeyInfo struct
f530: 75 72 65 20 74 6f 20 61 6c 6c 20 74 65 6d 70 6f  ure to all tempo
f540: 72 61 72 79 20 74 61 62 6c 65 73 2e 20 20 49 6e  rary tables.  In
f550: 76 6f 6b 65 20 74 68 65 0a 20 20 2a 2a 20 4f 52  voke the.  ** OR
f560: 44 45 52 20 42 59 20 70 72 6f 63 65 73 73 69 6e  DER BY processin
f570: 67 20 69 66 20 74 68 65 72 65 20 69 73 20 61 6e  g if there is an
f580: 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65   ORDER BY clause
f590: 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 69 73  ..  **.  ** This
f5a0: 20 73 65 63 74 69 6f 6e 20 69 73 20 72 75 6e 20   section is run 
f5b0: 62 79 20 74 68 65 20 72 69 67 68 74 2d 6d 6f 73  by the right-mos
f5c0: 74 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  t SELECT stateme
f5d0: 6e 74 20 6f 6e 6c 79 2e 0a 20 20 2a 2a 20 53 45  nt only..  ** SE
f5e0: 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 73 20  LECT statements 
f5f0: 74 6f 20 74 68 65 20 6c 65 66 74 20 61 6c 77 61  to the left alwa
f600: 79 73 20 73 6b 69 70 20 74 68 69 73 20 70 61 72  ys skip this par
f610: 74 2e 20 20 54 68 65 20 72 69 67 68 74 2d 6d 6f  t.  The right-mo
f620: 73 74 0a 20 20 2a 2a 20 53 45 4c 45 43 54 20 6d  st.  ** SELECT m
f630: 69 67 68 74 20 61 6c 73 6f 20 73 6b 69 70 20 74  ight also skip t
f640: 68 69 73 20 70 61 72 74 20 69 66 20 69 74 20 68  his part if it h
f650: 61 73 20 6e 6f 20 4f 52 44 45 52 20 42 59 20 63  as no ORDER BY c
f660: 6c 61 75 73 65 20 61 6e 64 0a 20 20 2a 2a 20 6e  lause and.  ** n
f670: 6f 20 74 65 6d 70 20 74 61 62 6c 65 73 20 61 72  o temp tables ar
f680: 65 20 72 65 71 75 69 72 65 64 2e 0a 20 20 2a 2f  e required..  */
f690: 0a 20 20 69 66 28 20 70 4f 72 64 65 72 42 79 20  .  if( pOrderBy 
f6a0: 7c 7c 20 70 2d 3e 75 73 65 73 45 70 68 6d 20 29  || p->usesEphm )
f6b0: 7b 0a 20 20 20 20 69 6e 74 20 69 3b 20 20 20 20  {.    int i;    
f6c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f6d0: 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e      /* Loop coun
f6e0: 74 65 72 20 2a 2f 0a 20 20 20 20 4b 65 79 49 6e  ter */.    KeyIn
f6f0: 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 3b 20 20 20  fo *pKeyInfo;   
f700: 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6c 6c           /* Coll
f710: 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65 20 66  ating sequence f
f720: 6f 72 20 74 68 65 20 72 65 73 75 6c 74 20 73 65  or the result se
f730: 74 20 2a 2f 0a 20 20 20 20 53 65 6c 65 63 74 20  t */.    Select 
f740: 2a 70 4c 6f 6f 70 3b 20 20 20 20 20 20 20 20 20  *pLoop;         
f750: 20 20 20 20 20 20 20 2f 2a 20 46 6f 72 20 6c 6f         /* For lo
f760: 6f 70 69 6e 67 20 74 68 72 6f 75 67 68 20 53 45  oping through SE
f770: 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 73 20  LECT statements 
f780: 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 4b 65 79 43  */.    int nKeyC
f790: 6f 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ol;             
f7a0: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
f7b0: 66 20 65 6e 74 72 69 65 73 20 69 6e 20 70 4b 65  f entries in pKe
f7c0: 79 49 6e 66 6f 2d 3e 61 43 6f 6c 5b 5d 20 2a 2f  yInfo->aCol[] */
f7d0: 0a 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a 2a 61  .    CollSeq **a
f7e0: 70 43 6f 6c 6c 3b 20 20 20 20 20 20 20 20 20 20  pColl;          
f7f0: 20 20 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e     /* For loopin
f800: 67 20 74 68 72 6f 75 67 68 20 70 4b 65 79 49 6e  g through pKeyIn
f810: 66 6f 2d 3e 61 43 6f 6c 6c 5b 5d 20 2a 2f 0a 20  fo->aColl[] */. 
f820: 20 20 20 43 6f 6c 6c 53 65 71 20 2a 2a 61 43 6f     CollSeq **aCo
f830: 70 79 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  py;             
f840: 20 2f 2a 20 41 20 63 6f 70 79 20 6f 66 20 70 4b   /* A copy of pK
f850: 65 79 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b 5d 20  eyInfo->aColl[] 
f860: 2a 2f 0a 0a 20 20 20 20 61 73 73 65 72 74 28 20  */..    assert( 
f870: 70 2d 3e 70 52 69 67 68 74 6d 6f 73 74 3d 3d 70  p->pRightmost==p
f880: 20 29 3b 0a 20 20 20 20 6e 4b 65 79 43 6f 6c 20   );.    nKeyCol 
f890: 3d 20 6e 43 6f 6c 20 2b 20 28 70 4f 72 64 65 72  = nCol + (pOrder
f8a0: 42 79 20 3f 20 70 4f 72 64 65 72 42 79 2d 3e 6e  By ? pOrderBy->n
f8b0: 45 78 70 72 20 3a 20 30 29 3b 0a 20 20 20 20 70  Expr : 0);.    p
f8c0: 4b 65 79 49 6e 66 6f 20 3d 20 73 71 6c 69 74 65  KeyInfo = sqlite
f8d0: 4d 61 6c 6c 6f 63 28 73 69 7a 65 6f 66 28 2a 70  Malloc(sizeof(*p
f8e0: 4b 65 79 49 6e 66 6f 29 2b 6e 4b 65 79 43 6f 6c  KeyInfo)+nKeyCol
f8f0: 2a 28 73 69 7a 65 6f 66 28 43 6f 6c 6c 53 65 71  *(sizeof(CollSeq
f900: 2a 29 20 2b 20 31 29 29 3b 0a 20 20 20 20 69 66  *) + 1));.    if
f910: 28 20 21 70 4b 65 79 49 6e 66 6f 20 29 7b 0a 20  ( !pKeyInfo ){. 
f920: 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
f930: 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 67 6f  _NOMEM;.      go
f940: 74 6f 20 6d 75 6c 74 69 5f 73 65 6c 65 63 74 5f  to multi_select_
f950: 65 6e 64 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  end;.    }..    
f960: 70 4b 65 79 49 6e 66 6f 2d 3e 65 6e 63 20 3d 20  pKeyInfo->enc = 
f970: 45 4e 43 28 70 50 61 72 73 65 2d 3e 64 62 29 3b  ENC(pParse->db);
f980: 0a 20 20 20 20 70 4b 65 79 49 6e 66 6f 2d 3e 6e  .    pKeyInfo->n
f990: 46 69 65 6c 64 20 3d 20 6e 43 6f 6c 3b 0a 0a 20  Field = nCol;.. 
f9a0: 20 20 20 66 6f 72 28 69 3d 30 2c 20 61 70 43 6f     for(i=0, apCo
f9b0: 6c 6c 3d 70 4b 65 79 49 6e 66 6f 2d 3e 61 43 6f  ll=pKeyInfo->aCo
f9c0: 6c 6c 3b 20 69 3c 6e 43 6f 6c 3b 20 69 2b 2b 2c  ll; i<nCol; i++,
f9d0: 20 61 70 43 6f 6c 6c 2b 2b 29 7b 0a 20 20 20 20   apColl++){.    
f9e0: 20 20 2a 61 70 43 6f 6c 6c 20 3d 20 6d 75 6c 74    *apColl = mult
f9f0: 69 53 65 6c 65 63 74 43 6f 6c 6c 53 65 71 28 70  iSelectCollSeq(p
fa00: 50 61 72 73 65 2c 20 70 2c 20 69 29 3b 0a 20 20  Parse, p, i);.  
fa10: 20 20 20 20 69 66 28 20 30 3d 3d 2a 61 70 43 6f      if( 0==*apCo
fa20: 6c 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 2a 61  ll ){.        *a
fa30: 70 43 6f 6c 6c 20 3d 20 70 50 61 72 73 65 2d 3e  pColl = pParse->
fa40: 64 62 2d 3e 70 44 66 6c 74 43 6f 6c 6c 3b 0a 20  db->pDfltColl;. 
fa50: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20       }.    }..  
fa60: 20 20 66 6f 72 28 70 4c 6f 6f 70 3d 70 3b 20 70    for(pLoop=p; p
fa70: 4c 6f 6f 70 3b 20 70 4c 6f 6f 70 3d 70 4c 6f 6f  Loop; pLoop=pLoo
fa80: 70 2d 3e 70 50 72 69 6f 72 29 7b 0a 20 20 20 20  p->pPrior){.    
fa90: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 32 3b 20    for(i=0; i<2; 
faa0: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 6e  i++){.        in
fab0: 74 20 61 64 64 72 20 3d 20 70 4c 6f 6f 70 2d 3e  t addr = pLoop->
fac0: 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b 69 5d 3b  addrOpenEphm[i];
fad0: 0a 20 20 20 20 20 20 20 20 69 66 28 20 61 64 64  .        if( add
fae0: 72 3c 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  r<0 ){.         
faf0: 20 2f 2a 20 49 66 20 5b 30 5d 20 69 73 20 75 6e   /* If [0] is un
fb00: 75 73 65 64 20 74 68 65 6e 20 5b 31 5d 20 69 73  used then [1] is
fb10: 20 61 6c 73 6f 20 75 6e 75 73 65 64 2e 20 20 53   also unused.  S
fb20: 6f 20 77 65 20 63 61 6e 0a 20 20 20 20 20 20 20  o we can.       
fb30: 20 20 20 2a 2a 20 61 6c 77 61 79 73 20 73 61 66     ** always saf
fb40: 65 6c 79 20 61 62 6f 72 74 20 61 73 20 73 6f 6f  ely abort as soo
fb50: 6e 20 61 73 20 74 68 65 20 66 69 72 73 74 20 75  n as the first u
fb60: 6e 75 73 65 64 20 73 6c 6f 74 20 69 73 20 66 6f  nused slot is fo
fb70: 75 6e 64 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  und */.         
fb80: 20 61 73 73 65 72 74 28 20 70 4c 6f 6f 70 2d 3e   assert( pLoop->
fb90: 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b 31 5d 3c  addrOpenEphm[1]<
fba0: 30 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 62  0 );.          b
fbb0: 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a  reak;.        }.
fbc0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
fbd0: 64 62 65 43 68 61 6e 67 65 50 32 28 76 2c 20 61  dbeChangeP2(v, a
fbe0: 64 64 72 2c 20 6e 43 6f 6c 29 3b 0a 20 20 20 20  ddr, nCol);.    
fbf0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43      sqlite3VdbeC
fc00: 68 61 6e 67 65 50 33 28 76 2c 20 61 64 64 72 2c  hangeP3(v, addr,
fc10: 20 28 63 68 61 72 2a 29 70 4b 65 79 49 6e 66 6f   (char*)pKeyInfo
fc20: 2c 20 50 33 5f 4b 45 59 49 4e 46 4f 29 3b 0a 20  , P3_KEYINFO);. 
fc30: 20 20 20 20 20 20 20 70 4c 6f 6f 70 2d 3e 61 64         pLoop->ad
fc40: 64 72 4f 70 65 6e 45 70 68 6d 5b 69 5d 20 3d 20  drOpenEphm[i] = 
fc50: 2d 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  -1;.      }.    
fc60: 7d 0a 0a 20 20 20 20 69 66 28 20 70 4f 72 64 65  }..    if( pOrde
fc70: 72 42 79 20 29 7b 0a 20 20 20 20 20 20 73 74 72  rBy ){.      str
fc80: 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65  uct ExprList_ite
fc90: 6d 20 2a 70 4f 54 65 72 6d 20 3d 20 70 4f 72 64  m *pOTerm = pOrd
fca0: 65 72 42 79 2d 3e 61 3b 0a 20 20 20 20 20 20 69  erBy->a;.      i
fcb0: 6e 74 20 6e 4f 72 64 65 72 42 79 45 78 70 72 20  nt nOrderByExpr 
fcc0: 3d 20 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70  = pOrderBy->nExp
fcd0: 72 3b 0a 20 20 20 20 20 20 69 6e 74 20 61 64 64  r;.      int add
fce0: 72 3b 0a 20 20 20 20 20 20 75 38 20 2a 70 53 6f  r;.      u8 *pSo
fcf0: 72 74 4f 72 64 65 72 3b 0a 0a 20 20 20 20 20 20  rtOrder;..      
fd00: 2f 2a 20 52 65 75 73 65 20 74 68 65 20 73 61 6d  /* Reuse the sam
fd10: 65 20 70 4b 65 79 49 6e 66 6f 20 66 6f 72 20 74  e pKeyInfo for t
fd20: 68 65 20 4f 52 44 45 52 20 42 59 20 61 73 20 77  he ORDER BY as w
fd30: 61 73 20 75 73 65 64 20 61 62 6f 76 65 20 66 6f  as used above fo
fd40: 72 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20 63  r.      ** the c
fd50: 6f 6d 70 6f 75 6e 64 20 73 65 6c 65 63 74 20 73  ompound select s
fd60: 74 61 74 65 6d 65 6e 74 73 2e 20 20 45 78 63 65  tatements.  Exce
fd70: 70 74 20 77 65 20 68 61 76 65 20 74 6f 20 63 68  pt we have to ch
fd80: 61 6e 67 65 20 6f 75 74 20 74 68 65 0a 20 20 20  ange out the.   
fd90: 20 20 20 2a 2a 20 70 4b 65 79 49 6e 66 6f 2d 3e     ** pKeyInfo->
fda0: 61 43 6f 6c 6c 5b 5d 20 76 61 6c 75 65 73 2e 20  aColl[] values. 
fdb0: 20 53 6f 6d 65 20 6f 66 20 74 68 65 20 61 43 6f   Some of the aCo
fdc0: 6c 6c 5b 5d 20 76 61 6c 75 65 73 20 77 69 6c 6c  ll[] values will
fdd0: 20 62 65 0a 20 20 20 20 20 20 2a 2a 20 72 65 75   be.      ** reu
fde0: 73 65 64 20 77 68 65 6e 20 63 6f 6e 73 74 72 75  sed when constru
fdf0: 63 74 69 6e 67 20 74 68 65 20 70 4b 65 79 49 6e  cting the pKeyIn
fe00: 66 6f 20 66 6f 72 20 74 68 65 20 4f 52 44 45 52  fo for the ORDER
fe10: 20 42 59 2c 20 73 6f 20 6d 61 6b 65 0a 20 20 20   BY, so make.   
fe20: 20 20 20 2a 2a 20 61 20 63 6f 70 79 2e 20 20 53     ** a copy.  S
fe30: 75 66 66 69 63 69 65 6e 74 20 73 70 61 63 65 20  ufficient space 
fe40: 74 6f 20 68 6f 6c 64 20 62 6f 74 68 20 74 68 65  to hold both the
fe50: 20 6e 43 6f 6c 20 65 6e 74 72 69 65 73 20 66 6f   nCol entries fo
fe60: 72 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20 63  r.      ** the c
fe70: 6f 6d 70 6f 75 6e 64 20 73 65 6c 65 63 74 20 61  ompound select a
fe80: 6e 64 20 74 68 65 20 6e 4f 72 64 65 72 62 79 45  nd the nOrderbyE
fe90: 78 70 72 20 65 6e 74 72 69 65 73 20 66 6f 72 20  xpr entries for 
fea0: 74 68 65 20 4f 52 44 45 52 20 42 59 0a 20 20 20  the ORDER BY.   
feb0: 20 20 20 2a 2a 20 77 61 73 20 61 6c 6c 6f 63 61     ** was alloca
fec0: 74 65 64 20 61 62 6f 76 65 2e 20 20 42 75 74 20  ted above.  But 
fed0: 77 65 20 6e 65 65 64 20 74 6f 20 6d 6f 76 65 20  we need to move 
fee0: 74 68 65 20 63 6f 6d 70 6f 75 6e 64 20 73 65 6c  the compound sel
fef0: 65 63 74 0a 20 20 20 20 20 20 2a 2a 20 65 6e 74  ect.      ** ent
ff00: 72 69 65 73 20 6f 75 74 20 6f 66 20 74 68 65 20  ries out of the 
ff10: 77 61 79 20 62 65 66 6f 72 65 20 63 6f 6e 73 74  way before const
ff20: 72 75 63 74 69 6e 67 20 74 68 65 20 4f 52 44 45  ructing the ORDE
ff30: 52 20 42 59 20 65 6e 74 72 69 65 73 2e 0a 20 20  R BY entries..  
ff40: 20 20 20 20 2a 2a 20 4d 6f 76 65 20 74 68 65 20      ** Move the 
ff50: 63 6f 6d 70 6f 75 6e 64 20 73 65 6c 65 63 74 20  compound select 
ff60: 65 6e 74 72 69 65 73 20 69 6e 74 6f 20 61 43 6f  entries into aCo
ff70: 70 79 5b 5d 20 77 68 65 72 65 20 74 68 65 79 20  py[] where they 
ff80: 63 61 6e 20 62 65 0a 20 20 20 20 20 20 2a 2a 20  can be.      ** 
ff90: 61 63 63 65 73 73 65 64 20 61 6e 64 20 72 65 75  accessed and reu
ffa0: 73 65 64 20 77 68 65 6e 20 63 6f 6e 73 74 72 75  sed when constru
ffb0: 63 74 69 6e 67 20 74 68 65 20 4f 52 44 45 52 20  cting the ORDER 
ffc0: 42 59 20 65 6e 74 72 69 65 73 2e 0a 20 20 20 20  BY entries..    
ffd0: 20 20 2a 2a 20 42 65 63 61 75 73 65 20 6e 43 6f    ** Because nCo
ffe0: 6c 20 6d 69 67 68 74 20 62 65 20 67 72 65 61 74  l might be great
fff0: 65 72 20 74 68 61 6e 20 6f 72 20 6c 65 73 73 20  er than or less 
10000 74 68 61 6e 20 6e 4f 72 64 65 72 42 79 45 78 70  than nOrderByExp
10010 72 0a 20 20 20 20 20 20 2a 2a 20 77 65 20 68 61  r.      ** we ha
10020 76 65 20 74 6f 20 75 73 65 20 6d 65 6d 6d 6f 76  ve to use memmov
10030 65 28 29 20 77 68 65 6e 20 64 6f 69 6e 67 20 74  e() when doing t
10040 68 65 20 63 6f 70 79 2e 0a 20 20 20 20 20 20 2a  he copy..      *
10050 2f 0a 20 20 20 20 20 20 61 43 6f 70 79 20 3d 20  /.      aCopy = 
10060 26 70 4b 65 79 49 6e 66 6f 2d 3e 61 43 6f 6c 6c  &pKeyInfo->aColl
10070 5b 6e 4f 72 64 65 72 42 79 45 78 70 72 5d 3b 0a  [nOrderByExpr];.
10080 20 20 20 20 20 20 70 53 6f 72 74 4f 72 64 65 72        pSortOrder
10090 20 3d 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 53 6f   = pKeyInfo->aSo
100a0 72 74 4f 72 64 65 72 20 3d 20 28 75 38 2a 29 26  rtOrder = (u8*)&
100b0 61 43 6f 70 79 5b 6e 43 6f 6c 5d 3b 0a 20 20 20  aCopy[nCol];.   
100c0 20 20 20 6d 65 6d 6d 6f 76 65 28 61 43 6f 70 79     memmove(aCopy
100d0 2c 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 43 6f 6c  , pKeyInfo->aCol
100e0 6c 2c 20 6e 43 6f 6c 2a 73 69 7a 65 6f 66 28 43  l, nCol*sizeof(C
100f0 6f 6c 6c 53 65 71 2a 29 29 3b 0a 0a 20 20 20 20  ollSeq*));..    
10100 20 20 61 70 43 6f 6c 6c 20 3d 20 70 4b 65 79 49    apColl = pKeyI
10110 6e 66 6f 2d 3e 61 43 6f 6c 6c 3b 0a 20 20 20 20  nfo->aColl;.    
10120 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 4f 72    for(i=0; i<nOr
10130 64 65 72 42 79 45 78 70 72 3b 20 69 2b 2b 2c 20  derByExpr; i++, 
10140 70 4f 54 65 72 6d 2b 2b 2c 20 61 70 43 6f 6c 6c  pOTerm++, apColl
10150 2b 2b 2c 20 70 53 6f 72 74 4f 72 64 65 72 2b 2b  ++, pSortOrder++
10160 29 7b 0a 20 20 20 20 20 20 20 20 45 78 70 72 20  ){.        Expr 
10170 2a 70 45 78 70 72 20 3d 20 70 4f 54 65 72 6d 2d  *pExpr = pOTerm-
10180 3e 70 45 78 70 72 3b 0a 20 20 20 20 20 20 20 20  >pExpr;.        
10190 69 66 28 20 28 70 45 78 70 72 2d 3e 66 6c 61 67  if( (pExpr->flag
101a0 73 20 26 20 45 50 5f 45 78 70 43 6f 6c 6c 61 74  s & EP_ExpCollat
101b0 65 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  e) ){.          
101c0 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 70  assert( pExpr->p
101d0 43 6f 6c 6c 21 3d 30 20 29 3b 0a 20 20 20 20 20  Coll!=0 );.     
101e0 20 20 20 20 20 2a 61 70 43 6f 6c 6c 20 3d 20 70       *apColl = p
101f0 45 78 70 72 2d 3e 70 43 6f 6c 6c 3b 0a 20 20 20  Expr->pColl;.   
10200 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
10210 20 20 20 20 20 20 2a 61 70 43 6f 6c 6c 20 3d 20        *apColl = 
10220 61 43 6f 70 79 5b 70 45 78 70 72 2d 3e 69 43 6f  aCopy[pExpr->iCo
10230 6c 75 6d 6e 5d 3b 0a 20 20 20 20 20 20 20 20 7d  lumn];.        }
10240 0a 20 20 20 20 20 20 20 20 2a 70 53 6f 72 74 4f  .        *pSortO
10250 72 64 65 72 20 3d 20 70 4f 54 65 72 6d 2d 3e 73  rder = pOTerm->s
10260 6f 72 74 4f 72 64 65 72 3b 0a 20 20 20 20 20 20  ortOrder;.      
10270 7d 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  }.      assert( 
10280 70 2d 3e 70 52 69 67 68 74 6d 6f 73 74 3d 3d 70  p->pRightmost==p
10290 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
102a0 28 20 70 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68  ( p->addrOpenEph
102b0 6d 5b 32 5d 3e 3d 30 20 29 3b 0a 20 20 20 20 20  m[2]>=0 );.     
102c0 20 61 64 64 72 20 3d 20 70 2d 3e 61 64 64 72 4f   addr = p->addrO
102d0 70 65 6e 45 70 68 6d 5b 32 5d 3b 0a 20 20 20 20  penEphm[2];.    
102e0 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61    sqlite3VdbeCha
102f0 6e 67 65 50 32 28 76 2c 20 61 64 64 72 2c 20 70  ngeP2(v, addr, p
10300 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 2b  ->pEList->nExpr+
10310 32 29 3b 0a 20 20 20 20 20 20 70 4b 65 79 49 6e  2);.      pKeyIn
10320 66 6f 2d 3e 6e 46 69 65 6c 64 20 3d 20 6e 4f 72  fo->nField = nOr
10330 64 65 72 42 79 45 78 70 72 3b 0a 20 20 20 20 20  derByExpr;.     
10340 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e   sqlite3VdbeChan
10350 67 65 50 33 28 76 2c 20 61 64 64 72 2c 20 28 63  geP3(v, addr, (c
10360 68 61 72 2a 29 70 4b 65 79 49 6e 66 6f 2c 20 50  har*)pKeyInfo, P
10370 33 5f 4b 45 59 49 4e 46 4f 5f 48 41 4e 44 4f 46  3_KEYINFO_HANDOF
10380 46 29 3b 0a 20 20 20 20 20 20 70 4b 65 79 49 6e  F);.      pKeyIn
10390 66 6f 20 3d 20 30 3b 0a 20 20 20 20 20 20 67 65  fo = 0;.      ge
103a0 6e 65 72 61 74 65 53 6f 72 74 54 61 69 6c 28 70  nerateSortTail(p
103b0 50 61 72 73 65 2c 20 70 2c 20 76 2c 20 70 2d 3e  Parse, p, v, p->
103c0 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 2c 20 65  pEList->nExpr, e
103d0 44 65 73 74 2c 20 69 50 61 72 6d 29 3b 0a 20 20  Dest, iParm);.  
103e0 20 20 7d 0a 0a 20 20 20 20 73 71 6c 69 74 65 46    }..    sqliteF
103f0 72 65 65 28 70 4b 65 79 49 6e 66 6f 29 3b 0a 20  ree(pKeyInfo);. 
10400 20 7d 0a 0a 6d 75 6c 74 69 5f 73 65 6c 65 63 74   }..multi_select
10410 5f 65 6e 64 3a 0a 20 20 72 65 74 75 72 6e 20 72  _end:.  return r
10420 63 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53  c;.}.#endif /* S
10430 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f 4d 50 4f  QLITE_OMIT_COMPO
10440 55 4e 44 5f 53 45 4c 45 43 54 20 2a 2f 0a 0a 23  UND_SELECT */..#
10450 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
10460 49 54 5f 56 49 45 57 0a 2f 2a 0a 2a 2a 20 53 63  IT_VIEW./*.** Sc
10470 61 6e 20 74 68 72 6f 75 67 68 20 74 68 65 20 65  an through the e
10480 78 70 72 65 73 73 69 6f 6e 20 70 45 78 70 72 2e  xpression pExpr.
10490 20 20 52 65 70 6c 61 63 65 20 65 76 65 72 79 20    Replace every 
104a0 72 65 66 65 72 65 6e 63 65 20 74 6f 0a 2a 2a 20  reference to.** 
104b0 61 20 63 6f 6c 75 6d 6e 20 69 6e 20 74 61 62 6c  a column in tabl
104c0 65 20 6e 75 6d 62 65 72 20 69 54 61 62 6c 65 20  e number iTable 
104d0 77 69 74 68 20 61 20 63 6f 70 79 20 6f 66 20 74  with a copy of t
104e0 68 65 20 69 43 6f 6c 75 6d 6e 2d 74 68 0a 2a 2a  he iColumn-th.**
104f0 20 65 6e 74 72 79 20 69 6e 20 70 45 4c 69 73 74   entry in pEList
10500 2e 20 20 28 42 75 74 20 6c 65 61 76 65 20 72 65  .  (But leave re
10510 66 65 72 65 6e 63 65 73 20 74 6f 20 74 68 65 20  ferences to the 
10520 52 4f 57 49 44 20 63 6f 6c 75 6d 6e 20 0a 2a 2a  ROWID column .**
10530 20 75 6e 63 68 61 6e 67 65 64 2e 29 0a 2a 2a 0a   unchanged.).**.
10540 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
10550 69 73 20 70 61 72 74 20 6f 66 20 74 68 65 20 66  is part of the f
10560 6c 61 74 74 65 6e 69 6e 67 20 70 72 6f 63 65 64  lattening proced
10570 75 72 65 2e 20 20 41 20 73 75 62 71 75 65 72 79  ure.  A subquery
10580 0a 2a 2a 20 77 68 6f 73 65 20 72 65 73 75 6c 74  .** whose result
10590 20 73 65 74 20 69 73 20 64 65 66 69 6e 65 64 20   set is defined 
105a0 62 79 20 70 45 4c 69 73 74 20 61 70 70 65 61 72  by pEList appear
105b0 73 20 61 73 20 65 6e 74 72 79 20 69 6e 20 74 68  s as entry in th
105c0 65 0a 2a 2a 20 46 52 4f 4d 20 63 6c 61 75 73 65  e.** FROM clause
105d0 20 6f 66 20 61 20 53 45 4c 45 43 54 20 73 75 63   of a SELECT suc
105e0 68 20 74 68 61 74 20 74 68 65 20 56 44 42 45 20  h that the VDBE 
105f0 63 75 72 73 6f 72 20 61 73 73 69 67 6e 65 64 20  cursor assigned 
10600 74 6f 20 74 68 61 74 0a 2a 2a 20 46 4f 52 4d 20  to that.** FORM 
10610 63 6c 61 75 73 65 20 65 6e 74 72 79 20 69 73 20  clause entry is 
10620 69 54 61 62 6c 65 2e 20 20 54 68 69 73 20 72 6f  iTable.  This ro
10630 75 74 69 6e 65 20 6d 61 6b 65 20 74 68 65 20 6e  utine make the n
10640 65 63 65 73 73 61 72 79 20 0a 2a 2a 20 63 68 61  ecessary .** cha
10650 6e 67 65 73 20 74 6f 20 70 45 78 70 72 20 73 6f  nges to pExpr so
10660 20 74 68 61 74 20 69 74 20 72 65 66 65 72 73 20   that it refers 
10670 64 69 72 65 63 74 6c 79 20 74 6f 20 74 68 65 20  directly to the 
10680 73 6f 75 72 63 65 20 74 61 62 6c 65 0a 2a 2a 20  source table.** 
10690 6f 66 20 74 68 65 20 73 75 62 71 75 65 72 79 20  of the subquery 
106a0 72 61 74 68 65 72 20 74 68 65 20 72 65 73 75 6c  rather the resul
106b0 74 20 73 65 74 20 6f 66 20 74 68 65 20 73 75 62  t set of the sub
106c0 71 75 65 72 79 2e 0a 2a 2f 0a 73 74 61 74 69 63  query..*/.static
106d0 20 76 6f 69 64 20 73 75 62 73 74 45 78 70 72 4c   void substExprL
106e0 69 73 74 28 45 78 70 72 4c 69 73 74 2a 2c 69 6e  ist(ExprList*,in
106f0 74 2c 45 78 70 72 4c 69 73 74 2a 29 3b 20 20 2f  t,ExprList*);  /
10700 2a 20 46 6f 72 77 61 72 64 20 44 65 63 6c 20 2a  * Forward Decl *
10710 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 75  /.static void su
10720 62 73 74 53 65 6c 65 63 74 28 53 65 6c 65 63 74  bstSelect(Select
10730 20 2a 2c 20 69 6e 74 2c 20 45 78 70 72 4c 69 73   *, int, ExprLis
10740 74 20 2a 29 3b 20 20 2f 2a 20 46 6f 72 77 61 72  t *);  /* Forwar
10750 64 20 44 65 63 6c 20 2a 2f 0a 73 74 61 74 69 63  d Decl */.static
10760 20 76 6f 69 64 20 73 75 62 73 74 45 78 70 72 28   void substExpr(
10770 45 78 70 72 20 2a 70 45 78 70 72 2c 20 69 6e 74  Expr *pExpr, int
10780 20 69 54 61 62 6c 65 2c 20 45 78 70 72 4c 69 73   iTable, ExprLis
10790 74 20 2a 70 45 4c 69 73 74 29 7b 0a 20 20 69 66  t *pEList){.  if
107a0 28 20 70 45 78 70 72 3d 3d 30 20 29 20 72 65 74  ( pExpr==0 ) ret
107b0 75 72 6e 3b 0a 20 20 69 66 28 20 70 45 78 70 72  urn;.  if( pExpr
107c0 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20  ->op==TK_COLUMN 
107d0 26 26 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65  && pExpr->iTable
107e0 3d 3d 69 54 61 62 6c 65 20 29 7b 0a 20 20 20 20  ==iTable ){.    
107f0 69 66 28 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75  if( pExpr->iColu
10800 6d 6e 3c 30 20 29 7b 0a 20 20 20 20 20 20 70 45  mn<0 ){.      pE
10810 78 70 72 2d 3e 6f 70 20 3d 20 54 4b 5f 4e 55 4c  xpr->op = TK_NUL
10820 4c 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  L;.    }else{.  
10830 20 20 20 20 45 78 70 72 20 2a 70 4e 65 77 3b 0a      Expr *pNew;.
10840 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 45        assert( pE
10850 4c 69 73 74 21 3d 30 20 26 26 20 70 45 78 70 72  List!=0 && pExpr
10860 2d 3e 69 43 6f 6c 75 6d 6e 3c 70 45 4c 69 73 74  ->iColumn<pEList
10870 2d 3e 6e 45 78 70 72 20 29 3b 0a 20 20 20 20 20  ->nExpr );.     
10880 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e   assert( pExpr->
10890 70 4c 65 66 74 3d 3d 30 20 26 26 20 70 45 78 70  pLeft==0 && pExp
108a0 72 2d 3e 70 52 69 67 68 74 3d 3d 30 20 26 26 20  r->pRight==0 && 
108b0 70 45 78 70 72 2d 3e 70 4c 69 73 74 3d 3d 30 20  pExpr->pList==0 
108c0 29 3b 0a 20 20 20 20 20 20 70 4e 65 77 20 3d 20  );.      pNew = 
108d0 70 45 4c 69 73 74 2d 3e 61 5b 70 45 78 70 72 2d  pEList->a[pExpr-
108e0 3e 69 43 6f 6c 75 6d 6e 5d 2e 70 45 78 70 72 3b  >iColumn].pExpr;
108f0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
10900 4e 65 77 21 3d 30 20 29 3b 0a 20 20 20 20 20 20  New!=0 );.      
10910 70 45 78 70 72 2d 3e 6f 70 20 3d 20 70 4e 65 77  pExpr->op = pNew
10920 2d 3e 6f 70 3b 0a 20 20 20 20 20 20 61 73 73 65  ->op;.      asse
10930 72 74 28 20 70 45 78 70 72 2d 3e 70 4c 65 66 74  rt( pExpr->pLeft
10940 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 70 45 78  ==0 );.      pEx
10950 70 72 2d 3e 70 4c 65 66 74 20 3d 20 73 71 6c 69  pr->pLeft = sqli
10960 74 65 33 45 78 70 72 44 75 70 28 70 4e 65 77 2d  te3ExprDup(pNew-
10970 3e 70 4c 65 66 74 29 3b 0a 20 20 20 20 20 20 61  >pLeft);.      a
10980 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 70 52  ssert( pExpr->pR
10990 69 67 68 74 3d 3d 30 20 29 3b 0a 20 20 20 20 20  ight==0 );.     
109a0 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 20 3d   pExpr->pRight =
109b0 20 73 71 6c 69 74 65 33 45 78 70 72 44 75 70 28   sqlite3ExprDup(
109c0 70 4e 65 77 2d 3e 70 52 69 67 68 74 29 3b 0a 20  pNew->pRight);. 
109d0 20 20 20 20 20 61 73 73 65 72 74 28 20 70 45 78       assert( pEx
109e0 70 72 2d 3e 70 4c 69 73 74 3d 3d 30 20 29 3b 0a  pr->pList==0 );.
109f0 20 20 20 20 20 20 70 45 78 70 72 2d 3e 70 4c 69        pExpr->pLi
10a00 73 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  st = sqlite3Expr
10a10 4c 69 73 74 44 75 70 28 70 4e 65 77 2d 3e 70 4c  ListDup(pNew->pL
10a20 69 73 74 29 3b 0a 20 20 20 20 20 20 70 45 78 70  ist);.      pExp
10a30 72 2d 3e 69 54 61 62 6c 65 20 3d 20 70 4e 65 77  r->iTable = pNew
10a40 2d 3e 69 54 61 62 6c 65 3b 0a 20 20 20 20 20 20  ->iTable;.      
10a50 70 45 78 70 72 2d 3e 70 54 61 62 20 3d 20 70 4e  pExpr->pTab = pN
10a60 65 77 2d 3e 70 54 61 62 3b 0a 20 20 20 20 20 20  ew->pTab;.      
10a70 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 20 3d  pExpr->iColumn =
10a80 20 70 4e 65 77 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a   pNew->iColumn;.
10a90 20 20 20 20 20 20 70 45 78 70 72 2d 3e 69 41 67        pExpr->iAg
10aa0 67 20 3d 20 70 4e 65 77 2d 3e 69 41 67 67 3b 0a  g = pNew->iAgg;.
10ab0 20 20 20 20 20 20 73 71 6c 69 74 65 33 54 6f 6b        sqlite3Tok
10ac0 65 6e 43 6f 70 79 28 26 70 45 78 70 72 2d 3e 74  enCopy(&pExpr->t
10ad0 6f 6b 65 6e 2c 20 26 70 4e 65 77 2d 3e 74 6f 6b  oken, &pNew->tok
10ae0 65 6e 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  en);.      sqlit
10af0 65 33 54 6f 6b 65 6e 43 6f 70 79 28 26 70 45 78  e3TokenCopy(&pEx
10b00 70 72 2d 3e 73 70 61 6e 2c 20 26 70 4e 65 77 2d  pr->span, &pNew-
10b10 3e 73 70 61 6e 29 3b 0a 20 20 20 20 20 20 70 45  >span);.      pE
10b20 78 70 72 2d 3e 70 53 65 6c 65 63 74 20 3d 20 73  xpr->pSelect = s
10b30 71 6c 69 74 65 33 53 65 6c 65 63 74 44 75 70 28  qlite3SelectDup(
10b40 70 4e 65 77 2d 3e 70 53 65 6c 65 63 74 29 3b 0a  pNew->pSelect);.
10b50 20 20 20 20 20 20 70 45 78 70 72 2d 3e 66 6c 61        pExpr->fla
10b60 67 73 20 3d 20 70 4e 65 77 2d 3e 66 6c 61 67 73  gs = pNew->flags
10b70 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b  ;.    }.  }else{
10b80 0a 20 20 20 20 73 75 62 73 74 45 78 70 72 28 70  .    substExpr(p
10b90 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 69 54 61  Expr->pLeft, iTa
10ba0 62 6c 65 2c 20 70 45 4c 69 73 74 29 3b 0a 20 20  ble, pEList);.  
10bb0 20 20 73 75 62 73 74 45 78 70 72 28 70 45 78 70    substExpr(pExp
10bc0 72 2d 3e 70 52 69 67 68 74 2c 20 69 54 61 62 6c  r->pRight, iTabl
10bd0 65 2c 20 70 45 4c 69 73 74 29 3b 0a 20 20 20 20  e, pEList);.    
10be0 73 75 62 73 74 53 65 6c 65 63 74 28 70 45 78 70  substSelect(pExp
10bf0 72 2d 3e 70 53 65 6c 65 63 74 2c 20 69 54 61 62  r->pSelect, iTab
10c00 6c 65 2c 20 70 45 4c 69 73 74 29 3b 0a 20 20 20  le, pEList);.   
10c10 20 73 75 62 73 74 45 78 70 72 4c 69 73 74 28 70   substExprList(p
10c20 45 78 70 72 2d 3e 70 4c 69 73 74 2c 20 69 54 61  Expr->pList, iTa
10c30 62 6c 65 2c 20 70 45 4c 69 73 74 29 3b 0a 20 20  ble, pEList);.  
10c40 7d 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20  }.}.static void 
10c50 73 75 62 73 74 45 78 70 72 4c 69 73 74 28 45 78  substExprList(Ex
10c60 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20 69  prList *pList, i
10c70 6e 74 20 69 54 61 62 6c 65 2c 20 45 78 70 72 4c  nt iTable, ExprL
10c80 69 73 74 20 2a 70 45 4c 69 73 74 29 7b 0a 20 20  ist *pEList){.  
10c90 69 6e 74 20 69 3b 0a 20 20 69 66 28 20 70 4c 69  int i;.  if( pLi
10ca0 73 74 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a  st==0 ) return;.
10cb0 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4c 69    for(i=0; i<pLi
10cc0 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b  st->nExpr; i++){
10cd0 0a 20 20 20 20 73 75 62 73 74 45 78 70 72 28 70  .    substExpr(p
10ce0 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72  List->a[i].pExpr
10cf0 2c 20 69 54 61 62 6c 65 2c 20 70 45 4c 69 73 74  , iTable, pEList
10d00 29 3b 0a 20 20 7d 0a 7d 0a 73 74 61 74 69 63 20  );.  }.}.static 
10d10 76 6f 69 64 20 73 75 62 73 74 53 65 6c 65 63 74  void substSelect
10d20 28 53 65 6c 65 63 74 20 2a 70 2c 20 69 6e 74 20  (Select *p, int 
10d30 69 54 61 62 6c 65 2c 20 45 78 70 72 4c 69 73 74  iTable, ExprList
10d40 20 2a 70 45 4c 69 73 74 29 7b 0a 20 20 69 66 28   *pEList){.  if(
10d50 20 21 70 20 29 20 72 65 74 75 72 6e 3b 0a 20 20   !p ) return;.  
10d60 73 75 62 73 74 45 78 70 72 4c 69 73 74 28 70 2d  substExprList(p-
10d70 3e 70 45 4c 69 73 74 2c 20 69 54 61 62 6c 65 2c  >pEList, iTable,
10d80 20 70 45 4c 69 73 74 29 3b 0a 20 20 73 75 62 73   pEList);.  subs
10d90 74 45 78 70 72 4c 69 73 74 28 70 2d 3e 70 47 72  tExprList(p->pGr
10da0 6f 75 70 42 79 2c 20 69 54 61 62 6c 65 2c 20 70  oupBy, iTable, p
10db0 45 4c 69 73 74 29 3b 0a 20 20 73 75 62 73 74 45  EList);.  substE
10dc0 78 70 72 4c 69 73 74 28 70 2d 3e 70 4f 72 64 65  xprList(p->pOrde
10dd0 72 42 79 2c 20 69 54 61 62 6c 65 2c 20 70 45 4c  rBy, iTable, pEL
10de0 69 73 74 29 3b 0a 20 20 73 75 62 73 74 45 78 70  ist);.  substExp
10df0 72 28 70 2d 3e 70 48 61 76 69 6e 67 2c 20 69 54  r(p->pHaving, iT
10e00 61 62 6c 65 2c 20 70 45 4c 69 73 74 29 3b 0a 20  able, pEList);. 
10e10 20 73 75 62 73 74 45 78 70 72 28 70 2d 3e 70 57   substExpr(p->pW
10e20 68 65 72 65 2c 20 69 54 61 62 6c 65 2c 20 70 45  here, iTable, pE
10e30 4c 69 73 74 29 3b 0a 7d 0a 23 65 6e 64 69 66 20  List);.}.#endif 
10e40 2f 2a 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  /* !defined(SQLI
10e50 54 45 5f 4f 4d 49 54 5f 56 49 45 57 29 20 2a 2f  TE_OMIT_VIEW) */
10e60 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
10e70 5f 4f 4d 49 54 5f 56 49 45 57 0a 2f 2a 0a 2a 2a  _OMIT_VIEW./*.**
10e80 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 61 74   This routine at
10e90 74 65 6d 70 74 73 20 74 6f 20 66 6c 61 74 74 65  tempts to flatte
10ea0 6e 20 73 75 62 71 75 65 72 69 65 73 20 69 6e 20  n subqueries in 
10eb0 6f 72 64 65 72 20 74 6f 20 73 70 65 65 64 0a 2a  order to speed.*
10ec0 2a 20 65 78 65 63 75 74 69 6f 6e 2e 20 20 49 74  * execution.  It
10ed0 20 72 65 74 75 72 6e 73 20 31 20 69 66 20 69 74   returns 1 if it
10ee0 20 6d 61 6b 65 73 20 63 68 61 6e 67 65 73 20 61   makes changes a
10ef0 6e 64 20 30 20 69 66 20 6e 6f 20 66 6c 61 74 74  nd 0 if no flatt
10f00 65 6e 69 6e 67 0a 2a 2a 20 6f 63 63 75 72 73 2e  ening.** occurs.
10f10 0a 2a 2a 0a 2a 2a 20 54 6f 20 75 6e 64 65 72 73  .**.** To unders
10f20 74 61 6e 64 20 74 68 65 20 63 6f 6e 63 65 70 74  tand the concept
10f30 20 6f 66 20 66 6c 61 74 74 65 6e 69 6e 67 2c 20   of flattening, 
10f40 63 6f 6e 73 69 64 65 72 20 74 68 65 20 66 6f 6c  consider the fol
10f50 6c 6f 77 69 6e 67 0a 2a 2a 20 71 75 65 72 79 3a  lowing.** query:
10f60 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 45 4c 45 43  .**.**     SELEC
10f70 54 20 61 20 46 52 4f 4d 20 28 53 45 4c 45 43 54  T a FROM (SELECT
10f80 20 78 2b 79 20 41 53 20 61 20 46 52 4f 4d 20 74   x+y AS a FROM t
10f90 31 20 57 48 45 52 45 20 7a 3c 31 30 30 29 20 57  1 WHERE z<100) W
10fa0 48 45 52 45 20 61 3e 35 0a 2a 2a 0a 2a 2a 20 54  HERE a>5.**.** T
10fb0 68 65 20 64 65 66 61 75 6c 74 20 77 61 79 20 6f  he default way o
10fc0 66 20 69 6d 70 6c 65 6d 65 6e 74 69 6e 67 20 74  f implementing t
10fd0 68 69 73 20 71 75 65 72 79 20 69 73 20 74 6f 20  his query is to 
10fe0 65 78 65 63 75 74 65 20 74 68 65 0a 2a 2a 20 73  execute the.** s
10ff0 75 62 71 75 65 72 79 20 66 69 72 73 74 20 61 6e  ubquery first an
11000 64 20 73 74 6f 72 65 20 74 68 65 20 72 65 73 75  d store the resu
11010 6c 74 73 20 69 6e 20 61 20 74 65 6d 70 6f 72 61  lts in a tempora
11020 72 79 20 74 61 62 6c 65 2c 20 74 68 65 6e 0a 2a  ry table, then.*
11030 2a 20 72 75 6e 20 74 68 65 20 6f 75 74 65 72 20  * run the outer 
11040 71 75 65 72 79 20 6f 6e 20 74 68 61 74 20 74 65  query on that te
11050 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 2e 20 20  mporary table.  
11060 54 68 69 73 20 72 65 71 75 69 72 65 73 20 74 77  This requires tw
11070 6f 0a 2a 2a 20 70 61 73 73 65 73 20 6f 76 65 72  o.** passes over
11080 20 74 68 65 20 64 61 74 61 2e 20 20 46 75 72 74   the data.  Furt
11090 68 65 72 6d 6f 72 65 2c 20 62 65 63 61 75 73 65  hermore, because
110a0 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79 20 74   the temporary t
110b0 61 62 6c 65 0a 2a 2a 20 68 61 73 20 6e 6f 20 69  able.** has no i
110c0 6e 64 69 63 65 73 2c 20 74 68 65 20 57 48 45 52  ndices, the WHER
110d0 45 20 63 6c 61 75 73 65 20 6f 6e 20 74 68 65 20  E clause on the 
110e0 6f 75 74 65 72 20 71 75 65 72 79 20 63 61 6e 6e  outer query cann
110f0 6f 74 20 62 65 0a 2a 2a 20 6f 70 74 69 6d 69 7a  ot be.** optimiz
11100 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  ed..**.** This r
11110 6f 75 74 69 6e 65 20 61 74 74 65 6d 70 74 73 20  outine attempts 
11120 74 6f 20 72 65 77 72 69 74 65 20 71 75 65 72 69  to rewrite queri
11130 65 73 20 73 75 63 68 20 61 73 20 74 68 65 20 61  es such as the a
11140 62 6f 76 65 20 69 6e 74 6f 0a 2a 2a 20 61 20 73  bove into.** a s
11150 69 6e 67 6c 65 20 66 6c 61 74 20 73 65 6c 65 63  ingle flat selec
11160 74 2c 20 6c 69 6b 65 20 74 68 69 73 3a 0a 2a 2a  t, like this:.**
11170 0a 2a 2a 20 20 20 20 20 53 45 4c 45 43 54 20 78  .**     SELECT x
11180 2b 79 20 41 53 20 61 20 46 52 4f 4d 20 74 31 20  +y AS a FROM t1 
11190 57 48 45 52 45 20 7a 3c 31 30 30 20 41 4e 44 20  WHERE z<100 AND 
111a0 61 3e 35 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 6f  a>5.**.** The co
111b0 64 65 20 67 65 6e 65 72 61 74 65 64 20 66 6f 72  de generated for
111c0 20 74 68 69 73 20 73 69 6d 70 69 66 69 63 61 74   this simpificat
111d0 69 6f 6e 20 67 69 76 65 73 20 74 68 65 20 73 61  ion gives the sa
111e0 6d 65 20 72 65 73 75 6c 74 0a 2a 2a 20 62 75 74  me result.** but
111f0 20 6f 6e 6c 79 20 68 61 73 20 74 6f 20 73 63 61   only has to sca
11200 6e 20 74 68 65 20 64 61 74 61 20 6f 6e 63 65 2e  n the data once.
11210 20 20 41 6e 64 20 62 65 63 61 75 73 65 20 69 6e    And because in
11220 64 69 63 65 73 20 6d 69 67 68 74 20 0a 2a 2a 20  dices might .** 
11230 65 78 69 73 74 20 6f 6e 20 74 68 65 20 74 61 62  exist on the tab
11240 6c 65 20 74 31 2c 20 61 20 63 6f 6d 70 6c 65 74  le t1, a complet
11250 65 20 73 63 61 6e 20 6f 66 20 74 68 65 20 64 61  e scan of the da
11260 74 61 20 6d 69 67 68 74 20 62 65 0a 2a 2a 20 61  ta might be.** a
11270 76 6f 69 64 65 64 2e 0a 2a 2a 0a 2a 2a 20 46 6c  voided..**.** Fl
11280 61 74 74 65 6e 69 6e 67 20 69 73 20 6f 6e 6c 79  attening is only
11290 20 61 74 74 65 6d 70 74 65 64 20 69 66 20 61 6c   attempted if al
112a0 6c 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69  l of the followi
112b0 6e 67 20 61 72 65 20 74 72 75 65 3a 0a 2a 2a 0a  ng are true:.**.
112c0 2a 2a 20 20 20 28 31 29 20 20 54 68 65 20 73 75  **   (1)  The su
112d0 62 71 75 65 72 79 20 61 6e 64 20 74 68 65 20 6f  bquery and the o
112e0 75 74 65 72 20 71 75 65 72 79 20 64 6f 20 6e 6f  uter query do no
112f0 74 20 62 6f 74 68 20 75 73 65 20 61 67 67 72 65  t both use aggre
11300 67 61 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 20 20 28  gates..**.**   (
11310 32 29 20 20 54 68 65 20 73 75 62 71 75 65 72 79  2)  The subquery
11320 20 69 73 20 6e 6f 74 20 61 6e 20 61 67 67 72 65   is not an aggre
11330 67 61 74 65 20 6f 72 20 74 68 65 20 6f 75 74 65  gate or the oute
11340 72 20 71 75 65 72 79 20 69 73 20 6e 6f 74 20 61  r query is not a
11350 20 6a 6f 69 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20 28   join..**.**   (
11360 33 29 20 20 54 68 65 20 73 75 62 71 75 65 72 79  3)  The subquery
11370 20 69 73 20 6e 6f 74 20 74 68 65 20 72 69 67 68   is not the righ
11380 74 20 6f 70 65 72 61 6e 64 20 6f 66 20 61 20 6c  t operand of a l
11390 65 66 74 20 6f 75 74 65 72 20 6a 6f 69 6e 2c 20  eft outer join, 
113a0 6f 72 0a 2a 2a 20 20 20 20 20 20 20 20 74 68 65  or.**        the
113b0 20 73 75 62 71 75 65 72 79 20 69 73 20 6e 6f 74   subquery is not
113c0 20 69 74 73 65 6c 66 20 61 20 6a 6f 69 6e 2e 20   itself a join. 
113d0 20 28 54 69 63 6b 65 74 20 23 33 30 36 29 0a 2a   (Ticket #306).*
113e0 2a 0a 2a 2a 20 20 20 28 34 29 20 20 54 68 65 20  *.**   (4)  The 
113f0 73 75 62 71 75 65 72 79 20 69 73 20 6e 6f 74 20  subquery is not 
11400 44 49 53 54 49 4e 43 54 20 6f 72 20 74 68 65 20  DISTINCT or the 
11410 6f 75 74 65 72 20 71 75 65 72 79 20 69 73 20 6e  outer query is n
11420 6f 74 20 61 20 6a 6f 69 6e 2e 0a 2a 2a 0a 2a 2a  ot a join..**.**
11430 20 20 20 28 35 29 20 20 54 68 65 20 73 75 62 71     (5)  The subq
11440 75 65 72 79 20 69 73 20 6e 6f 74 20 44 49 53 54  uery is not DIST
11450 49 4e 43 54 20 6f 72 20 74 68 65 20 6f 75 74 65  INCT or the oute
11460 72 20 71 75 65 72 79 20 64 6f 65 73 20 6e 6f 74  r query does not
11470 20 75 73 65 0a 2a 2a 20 20 20 20 20 20 20 20 61   use.**        a
11480 67 67 72 65 67 61 74 65 73 2e 0a 2a 2a 0a 2a 2a  ggregates..**.**
11490 20 20 20 28 36 29 20 20 54 68 65 20 73 75 62 71     (6)  The subq
114a0 75 65 72 79 20 64 6f 65 73 20 6e 6f 74 20 75 73  uery does not us
114b0 65 20 61 67 67 72 65 67 61 74 65 73 20 6f 72 20  e aggregates or 
114c0 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20  the outer query 
114d0 69 73 20 6e 6f 74 0a 2a 2a 20 20 20 20 20 20 20  is not.**       
114e0 20 44 49 53 54 49 4e 43 54 2e 0a 2a 2a 0a 2a 2a   DISTINCT..**.**
114f0 20 20 20 28 37 29 20 20 54 68 65 20 73 75 62 71     (7)  The subq
11500 75 65 72 79 20 68 61 73 20 61 20 46 52 4f 4d 20  uery has a FROM 
11510 63 6c 61 75 73 65 2e 0a 2a 2a 0a 2a 2a 20 20 20  clause..**.**   
11520 28 38 29 20 20 54 68 65 20 73 75 62 71 75 65 72  (8)  The subquer
11530 79 20 64 6f 65 73 20 6e 6f 74 20 75 73 65 20 4c  y does not use L
11540 49 4d 49 54 20 6f 72 20 74 68 65 20 6f 75 74 65  IMIT or the oute
11550 72 20 71 75 65 72 79 20 69 73 20 6e 6f 74 20 61  r query is not a
11560 20 6a 6f 69 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20 28   join..**.**   (
11570 39 29 20 20 54 68 65 20 73 75 62 71 75 65 72 79  9)  The subquery
11580 20 64 6f 65 73 20 6e 6f 74 20 75 73 65 20 4c 49   does not use LI
11590 4d 49 54 20 6f 72 20 74 68 65 20 6f 75 74 65 72  MIT or the outer
115a0 20 71 75 65 72 79 20 64 6f 65 73 20 6e 6f 74 20   query does not 
115b0 75 73 65 0a 2a 2a 20 20 20 20 20 20 20 20 61 67  use.**        ag
115c0 67 72 65 67 61 74 65 73 2e 0a 2a 2a 0a 2a 2a 20  gregates..**.** 
115d0 20 28 31 30 29 20 20 54 68 65 20 73 75 62 71 75   (10)  The subqu
115e0 65 72 79 20 64 6f 65 73 20 6e 6f 74 20 75 73 65  ery does not use
115f0 20 61 67 67 72 65 67 61 74 65 73 20 6f 72 20 74   aggregates or t
11600 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 64  he outer query d
11610 6f 65 73 20 6e 6f 74 0a 2a 2a 20 20 20 20 20 20  oes not.**      
11620 20 20 75 73 65 20 4c 49 4d 49 54 2e 0a 2a 2a 0a    use LIMIT..**.
11630 2a 2a 20 20 28 31 31 29 20 20 54 68 65 20 73 75  **  (11)  The su
11640 62 71 75 65 72 79 20 61 6e 64 20 74 68 65 20 6f  bquery and the o
11650 75 74 65 72 20 71 75 65 72 79 20 64 6f 20 6e 6f  uter query do no
11660 74 20 62 6f 74 68 20 68 61 76 65 20 4f 52 44 45  t both have ORDE
11670 52 20 42 59 20 63 6c 61 75 73 65 73 2e 0a 2a 2a  R BY clauses..**
11680 0a 2a 2a 20 20 28 31 32 29 20 20 54 68 65 20 73  .**  (12)  The s
11690 75 62 71 75 65 72 79 20 69 73 20 6e 6f 74 20 74  ubquery is not t
116a0 68 65 20 72 69 67 68 74 20 74 65 72 6d 20 6f 66  he right term of
116b0 20 61 20 4c 45 46 54 20 4f 55 54 45 52 20 4a 4f   a LEFT OUTER JO
116c0 49 4e 20 6f 72 20 74 68 65 0a 2a 2a 20 20 20 20  IN or the.**    
116d0 20 20 20 20 73 75 62 71 75 65 72 79 20 68 61 73      subquery has
116e0 20 6e 6f 20 57 48 45 52 45 20 63 6c 61 75 73 65   no WHERE clause
116f0 2e 20 20 28 61 64 64 65 64 20 62 79 20 74 69 63  .  (added by tic
11700 6b 65 74 20 23 33 35 30 29 0a 2a 2a 0a 2a 2a 20  ket #350).**.** 
11710 20 28 31 33 29 20 20 54 68 65 20 73 75 62 71 75   (13)  The subqu
11720 65 72 79 20 61 6e 64 20 6f 75 74 65 72 20 71 75  ery and outer qu
11730 65 72 79 20 64 6f 20 6e 6f 74 20 62 6f 74 68 20  ery do not both 
11740 75 73 65 20 4c 49 4d 49 54 0a 2a 2a 0a 2a 2a 20  use LIMIT.**.** 
11750 20 28 31 34 29 20 20 54 68 65 20 73 75 62 71 75   (14)  The subqu
11760 65 72 79 20 64 6f 65 73 20 6e 6f 74 20 75 73 65  ery does not use
11770 20 4f 46 46 53 45 54 0a 2a 2a 0a 2a 2a 20 49 6e   OFFSET.**.** In
11780 20 74 68 69 73 20 72 6f 75 74 69 6e 65 2c 20 74   this routine, t
11790 68 65 20 22 70 22 20 70 61 72 61 6d 65 74 65 72  he "p" parameter
117a0 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f   is a pointer to
117b0 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79   the outer query
117c0 2e 0a 2a 2a 20 54 68 65 20 73 75 62 71 75 65 72  ..** The subquer
117d0 79 20 69 73 20 70 2d 3e 70 53 72 63 2d 3e 61 5b  y is p->pSrc->a[
117e0 69 46 72 6f 6d 5d 2e 20 20 69 73 41 67 67 20 69  iFrom].  isAgg i
117f0 73 20 74 72 75 65 20 69 66 20 74 68 65 20 6f 75  s true if the ou
11800 74 65 72 20 71 75 65 72 79 0a 2a 2a 20 75 73 65  ter query.** use
11810 73 20 61 67 67 72 65 67 61 74 65 73 20 61 6e 64  s aggregates and
11820 20 73 75 62 71 75 65 72 79 49 73 41 67 67 20 69   subqueryIsAgg i
11830 73 20 74 72 75 65 20 69 66 20 74 68 65 20 73 75  s true if the su
11840 62 71 75 65 72 79 20 75 73 65 73 20 61 67 67 72  bquery uses aggr
11850 65 67 61 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 49 66  egates..**.** If
11860 20 66 6c 61 74 74 65 6e 69 6e 67 20 69 73 20 6e   flattening is n
11870 6f 74 20 61 74 74 65 6d 70 74 65 64 2c 20 74 68  ot attempted, th
11880 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20  is routine is a 
11890 6e 6f 2d 6f 70 20 61 6e 64 20 72 65 74 75 72 6e  no-op and return
118a0 73 20 30 2e 0a 2a 2a 20 49 66 20 66 6c 61 74 74  s 0..** If flatt
118b0 65 6e 69 6e 67 20 69 73 20 61 74 74 65 6d 70 74  ening is attempt
118c0 65 64 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  ed this routine 
118d0 72 65 74 75 72 6e 73 20 31 2e 0a 2a 2a 0a 2a 2a  returns 1..**.**
118e0 20 41 6c 6c 20 6f 66 20 74 68 65 20 65 78 70 72   All of the expr
118f0 65 73 73 69 6f 6e 20 61 6e 61 6c 79 73 69 73 20  ession analysis 
11900 6d 75 73 74 20 6f 63 63 75 72 20 6f 6e 20 62 6f  must occur on bo
11910 74 68 20 74 68 65 20 6f 75 74 65 72 20 71 75 65  th the outer que
11920 72 79 20 61 6e 64 0a 2a 2a 20 74 68 65 20 73 75  ry and.** the su
11930 62 71 75 65 72 79 20 62 65 66 6f 72 65 20 74 68  bquery before th
11940 69 73 20 72 6f 75 74 69 6e 65 20 72 75 6e 73 2e  is routine runs.
11950 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66  .*/.static int f
11960 6c 61 74 74 65 6e 53 75 62 71 75 65 72 79 28 0a  lattenSubquery(.
11970 20 20 53 65 6c 65 63 74 20 2a 70 2c 20 20 20 20    Select *p,    
11980 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61         /* The pa
11990 72 65 6e 74 20 6f 72 20 6f 75 74 65 72 20 53 45  rent or outer SE
119a0 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 2a  LECT statement *
119b0 2f 0a 20 20 69 6e 74 20 69 46 72 6f 6d 2c 20 20  /.  int iFrom,  
119c0 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65           /* Inde
119d0 78 20 69 6e 20 70 2d 3e 70 53 72 63 2d 3e 61 5b  x in p->pSrc->a[
119e0 5d 20 6f 66 20 74 68 65 20 69 6e 6e 65 72 20 73  ] of the inner s
119f0 75 62 71 75 65 72 79 20 2a 2f 0a 20 20 69 6e 74  ubquery */.  int
11a00 20 69 73 41 67 67 2c 20 20 20 20 20 20 20 20 20   isAgg,         
11a10 20 20 2f 2a 20 54 72 75 65 20 69 66 20 6f 75 74    /* True if out
11a20 65 72 20 53 45 4c 45 43 54 20 75 73 65 73 20 61  er SELECT uses a
11a30 67 67 72 65 67 61 74 65 20 66 75 6e 63 74 69 6f  ggregate functio
11a40 6e 73 20 2a 2f 0a 20 20 69 6e 74 20 73 75 62 71  ns */.  int subq
11a50 75 65 72 79 49 73 41 67 67 20 20 20 20 2f 2a 20  ueryIsAgg    /* 
11a60 54 72 75 65 20 69 66 20 74 68 65 20 73 75 62 71  True if the subq
11a70 75 65 72 79 20 75 73 65 73 20 61 67 67 72 65 67  uery uses aggreg
11a80 61 74 65 20 66 75 6e 63 74 69 6f 6e 73 20 2a 2f  ate functions */
11a90 0a 29 7b 0a 20 20 53 65 6c 65 63 74 20 2a 70 53  .){.  Select *pS
11aa0 75 62 3b 20 20 20 20 20 20 20 2f 2a 20 54 68 65  ub;       /* The
11ab0 20 69 6e 6e 65 72 20 71 75 65 72 79 20 6f 72 20   inner query or 
11ac0 22 73 75 62 71 75 65 72 79 22 20 2a 2f 0a 20 20  "subquery" */.  
11ad0 53 72 63 4c 69 73 74 20 2a 70 53 72 63 3b 20 20  SrcList *pSrc;  
11ae0 20 20 20 20 2f 2a 20 54 68 65 20 46 52 4f 4d 20      /* The FROM 
11af0 63 6c 61 75 73 65 20 6f 66 20 74 68 65 20 6f 75  clause of the ou
11b00 74 65 72 20 71 75 65 72 79 20 2a 2f 0a 20 20 53  ter query */.  S
11b10 72 63 4c 69 73 74 20 2a 70 53 75 62 53 72 63 3b  rcList *pSubSrc;
11b20 20 20 20 2f 2a 20 54 68 65 20 46 52 4f 4d 20 63     /* The FROM c
11b30 6c 61 75 73 65 20 6f 66 20 74 68 65 20 73 75 62  lause of the sub
11b40 71 75 65 72 79 20 2a 2f 0a 20 20 45 78 70 72 4c  query */.  ExprL
11b50 69 73 74 20 2a 70 4c 69 73 74 3b 20 20 20 20 2f  ist *pList;    /
11b60 2a 20 54 68 65 20 72 65 73 75 6c 74 20 73 65 74  * The result set
11b70 20 6f 66 20 74 68 65 20 6f 75 74 65 72 20 71 75   of the outer qu
11b80 65 72 79 20 2a 2f 0a 20 20 69 6e 74 20 69 50 61  ery */.  int iPa
11b90 72 65 6e 74 3b 20 20 20 20 20 20 20 20 2f 2a 20  rent;        /* 
11ba0 56 44 42 45 20 63 75 72 73 6f 72 20 6e 75 6d 62  VDBE cursor numb
11bb0 65 72 20 6f 66 20 74 68 65 20 70 53 75 62 20 72  er of the pSub r
11bc0 65 73 75 6c 74 20 73 65 74 20 74 65 6d 70 20 74  esult set temp t
11bd0 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 69 3b  able */.  int i;
11be0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
11bf0 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f   Loop counter */
11c00 0a 20 20 45 78 70 72 20 2a 70 57 68 65 72 65 3b  .  Expr *pWhere;
11c10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11c20 20 20 20 20 2f 2a 20 54 68 65 20 57 48 45 52 45      /* The WHERE
11c30 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 73 74 72   clause */.  str
11c40 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d  uct SrcList_item
11c50 20 2a 70 53 75 62 69 74 65 6d 3b 20 20 20 2f 2a   *pSubitem;   /*
11c60 20 54 68 65 20 73 75 62 71 75 65 72 79 20 2a 2f   The subquery */
11c70 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 74 6f 20  ..  /* Check to 
11c80 73 65 65 20 69 66 20 66 6c 61 74 74 65 6e 69 6e  see if flattenin
11c90 67 20 69 73 20 70 65 72 6d 69 74 74 65 64 2e 20  g is permitted. 
11ca0 20 52 65 74 75 72 6e 20 30 20 69 66 20 6e 6f 74   Return 0 if not
11cb0 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 3d 3d  ..  */.  if( p==
11cc0 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  0 ) return 0;.  
11cd0 70 53 72 63 20 3d 20 70 2d 3e 70 53 72 63 3b 0a  pSrc = p->pSrc;.
11ce0 20 20 61 73 73 65 72 74 28 20 70 53 72 63 20 26    assert( pSrc &
11cf0 26 20 69 46 72 6f 6d 3e 3d 30 20 26 26 20 69 46  & iFrom>=0 && iF
11d00 72 6f 6d 3c 70 53 72 63 2d 3e 6e 53 72 63 20 29  rom<pSrc->nSrc )
11d10 3b 0a 20 20 70 53 75 62 69 74 65 6d 20 3d 20 26  ;.  pSubitem = &
11d20 70 53 72 63 2d 3e 61 5b 69 46 72 6f 6d 5d 3b 0a  pSrc->a[iFrom];.
11d30 20 20 70 53 75 62 20 3d 20 70 53 75 62 69 74 65    pSub = pSubite
11d40 6d 2d 3e 70 53 65 6c 65 63 74 3b 0a 20 20 61 73  m->pSelect;.  as
11d50 73 65 72 74 28 20 70 53 75 62 21 3d 30 20 29 3b  sert( pSub!=0 );
11d60 0a 20 20 69 66 28 20 69 73 41 67 67 20 26 26 20  .  if( isAgg && 
11d70 73 75 62 71 75 65 72 79 49 73 41 67 67 20 29 20  subqueryIsAgg ) 
11d80 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20  return 0;       
11d90 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73            /* Res
11da0 74 72 69 63 74 69 6f 6e 20 28 31 29 20 20 2a 2f  triction (1)  */
11db0 0a 20 20 69 66 28 20 73 75 62 71 75 65 72 79 49  .  if( subqueryI
11dc0 73 41 67 67 20 26 26 20 70 53 72 63 2d 3e 6e 53  sAgg && pSrc->nS
11dd0 72 63 3e 31 20 29 20 72 65 74 75 72 6e 20 30 3b  rc>1 ) return 0;
11de0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73            /* Res
11df0 74 72 69 63 74 69 6f 6e 20 28 32 29 20 20 2a 2f  triction (2)  */
11e00 0a 20 20 70 53 75 62 53 72 63 20 3d 20 70 53 75  .  pSubSrc = pSu
11e10 62 2d 3e 70 53 72 63 3b 0a 20 20 61 73 73 65 72  b->pSrc;.  asser
11e20 74 28 20 70 53 75 62 53 72 63 20 29 3b 0a 20 20  t( pSubSrc );.  
11e30 2f 2a 20 50 72 69 6f 72 20 74 6f 20 76 65 72 73  /* Prior to vers
11e40 69 6f 6e 20 33 2e 31 2e 32 2c 20 77 68 65 6e 20  ion 3.1.2, when 
11e50 4c 49 4d 49 54 20 61 6e 64 20 4f 46 46 53 45 54  LIMIT and OFFSET
11e60 20 68 61 64 20 74 6f 20 62 65 20 73 69 6d 70 6c   had to be simpl
11e70 65 20 63 6f 6e 73 74 61 6e 74 73 2c 0a 20 20 2a  e constants,.  *
11e80 2a 20 6e 6f 74 20 61 72 62 69 74 72 61 72 79 20  * not arbitrary 
11e90 65 78 70 72 65 73 73 73 69 6f 6e 73 2c 20 77 65  expresssions, we
11ea0 20 61 6c 6c 6f 77 65 64 20 73 6f 6d 65 20 63 6f   allowed some co
11eb0 6d 62 69 6e 69 6e 67 20 6f 66 20 4c 49 4d 49 54  mbining of LIMIT
11ec0 20 61 6e 64 20 4f 46 46 53 45 54 0a 20 20 2a 2a   and OFFSET.  **
11ed0 20 62 65 63 61 75 73 65 20 74 68 65 79 20 63 6f   because they co
11ee0 75 6c 64 20 62 65 20 63 6f 6d 70 75 74 65 64 20  uld be computed 
11ef0 61 74 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 2e  at compile-time.
11f00 20 20 42 75 74 20 77 68 65 6e 20 4c 49 4d 49 54    But when LIMIT
11f10 20 61 6e 64 20 4f 46 46 53 45 54 0a 20 20 2a 2a   and OFFSET.  **
11f20 20 62 65 63 61 6d 65 20 61 72 62 69 74 72 61 72   became arbitrar
11f30 79 20 65 78 70 72 65 73 73 69 6f 6e 73 2c 20 77  y expressions, w
11f40 65 20 77 65 72 65 20 66 6f 72 63 65 64 20 74 6f  e were forced to
11f50 20 61 64 64 20 72 65 73 74 72 69 63 74 69 6f 6e   add restriction
11f60 73 20 28 31 33 29 0a 20 20 2a 2a 20 61 6e 64 20  s (13).  ** and 
11f70 28 31 34 29 2e 20 2a 2f 0a 20 20 69 66 28 20 70  (14). */.  if( p
11f80 53 75 62 2d 3e 70 4c 69 6d 69 74 20 26 26 20 70  Sub->pLimit && p
11f90 2d 3e 70 4c 69 6d 69 74 20 29 20 72 65 74 75 72  ->pLimit ) retur
11fa0 6e 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  n 0;            
11fb0 20 20 2f 2a 20 52 65 73 74 72 69 63 74 69 6f 6e    /* Restriction
11fc0 20 28 31 33 29 20 2a 2f 0a 20 20 69 66 28 20 70   (13) */.  if( p
11fd0 53 75 62 2d 3e 70 4f 66 66 73 65 74 20 29 20 72  Sub->pOffset ) r
11fe0 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20 20  eturn 0;        
11ff0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12000 20 20 2f 2a 20 52 65 73 74 72 69 63 74 69 6f 6e    /* Restriction
12010 20 28 31 34 29 20 2a 2f 0a 20 20 69 66 28 20 70   (14) */.  if( p
12020 53 75 62 53 72 63 2d 3e 6e 53 72 63 3d 3d 30 20  SubSrc->nSrc==0 
12030 29 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20  ) return 0;     
12040 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12050 20 20 2f 2a 20 52 65 73 74 72 69 63 74 69 6f 6e    /* Restriction
12060 20 28 37 29 20 20 2a 2f 0a 20 20 69 66 28 20 28   (7)  */.  if( (
12070 70 53 75 62 2d 3e 69 73 44 69 73 74 69 6e 63 74  pSub->isDistinct
12080 20 7c 7c 20 70 53 75 62 2d 3e 70 4c 69 6d 69 74   || pSub->pLimit
12090 29 20 0a 20 20 20 20 20 20 20 20 20 26 26 20 28  ) .         && (
120a0 70 53 72 63 2d 3e 6e 53 72 63 3e 31 20 7c 7c 20  pSrc->nSrc>1 || 
120b0 69 73 41 67 67 29 20 29 7b 20 20 20 20 20 20 20  isAgg) ){       
120c0 20 20 20 2f 2a 20 52 65 73 74 72 69 63 74 69 6f     /* Restrictio
120d0 6e 73 20 28 34 29 28 35 29 28 38 29 28 39 29 20  ns (4)(5)(8)(9) 
120e0 2a 2f 0a 20 20 20 20 20 72 65 74 75 72 6e 20 30  */.     return 0
120f0 3b 20 20 20 20 20 20 20 0a 20 20 7d 0a 20 20 69  ;       .  }.  i
12100 66 28 20 70 2d 3e 69 73 44 69 73 74 69 6e 63 74  f( p->isDistinct
12110 20 26 26 20 73 75 62 71 75 65 72 79 49 73 41 67   && subqueryIsAg
12120 67 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20 20  g ) return 0;   
12130 20 20 20 20 20 20 2f 2a 20 52 65 73 74 72 69 63        /* Restric
12140 74 69 6f 6e 20 28 36 29 20 20 2a 2f 0a 20 20 69  tion (6)  */.  i
12150 66 28 20 28 70 2d 3e 64 69 73 61 6c 6c 6f 77 4f  f( (p->disallowO
12160 72 64 65 72 42 79 20 7c 7c 20 70 2d 3e 70 4f 72  rderBy || p->pOr
12170 64 65 72 42 79 29 20 26 26 20 70 53 75 62 2d 3e  derBy) && pSub->
12180 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20  pOrderBy ){.    
12190 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20   return 0;      
121a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
121b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
121c0 20 20 20 20 20 2f 2a 20 52 65 73 74 72 69 63 74       /* Restrict
121d0 69 6f 6e 20 28 31 31 29 20 2a 2f 0a 20 20 7d 0a  ion (11) */.  }.
121e0 0a 20 20 2f 2a 20 52 65 73 74 72 69 63 74 69 6f  .  /* Restrictio
121f0 6e 20 33 3a 20 20 49 66 20 74 68 65 20 73 75 62  n 3:  If the sub
12200 71 75 65 72 79 20 69 73 20 61 20 6a 6f 69 6e 2c  query is a join,
12210 20 6d 61 6b 65 20 73 75 72 65 20 74 68 65 20 73   make sure the s
12220 75 62 71 75 65 72 79 20 69 73 20 0a 20 20 2a 2a  ubquery is .  **
12230 20 6e 6f 74 20 75 73 65 64 20 61 73 20 74 68 65   not used as the
12240 20 72 69 67 68 74 20 6f 70 65 72 61 6e 64 20 6f   right operand o
12250 66 20 61 6e 20 6f 75 74 65 72 20 6a 6f 69 6e 2e  f an outer join.
12260 20 20 45 78 61 6d 70 6c 65 73 20 6f 66 20 77 68    Examples of wh
12270 79 20 74 68 69 73 0a 20 20 2a 2a 20 69 73 20 6e  y this.  ** is n
12280 6f 74 20 61 6c 6c 6f 77 65 64 3a 0a 20 20 2a 2a  ot allowed:.  **
12290 0a 20 20 2a 2a 20 20 20 20 20 20 20 20 20 74 31  .  **         t1
122a0 20 4c 45 46 54 20 4f 55 54 45 52 20 4a 4f 49 4e   LEFT OUTER JOIN
122b0 20 28 74 32 20 4a 4f 49 4e 20 74 33 29 0a 20 20   (t2 JOIN t3).  
122c0 2a 2a 0a 20 20 2a 2a 20 49 66 20 77 65 20 66 6c  **.  ** If we fl
122d0 61 74 74 65 6e 20 74 68 65 20 61 62 6f 76 65 2c  atten the above,
122e0 20 77 65 20 77 6f 75 6c 64 20 67 65 74 0a 20 20   we would get.  
122f0 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 20 20 20 20  **.  **         
12300 28 74 31 20 4c 45 46 54 20 4f 55 54 45 52 20 4a  (t1 LEFT OUTER J
12310 4f 49 4e 20 74 32 29 20 4a 4f 49 4e 20 74 33 0a  OIN t2) JOIN t3.
12320 20 20 2a 2a 0a 20 20 2a 2a 20 77 68 69 63 68 20    **.  ** which 
12330 69 73 20 6e 6f 74 20 61 74 20 61 6c 6c 20 74 68  is not at all th
12340 65 20 73 61 6d 65 20 74 68 69 6e 67 2e 0a 20 20  e same thing..  
12350 2a 2f 0a 20 20 69 66 28 20 70 53 75 62 53 72 63  */.  if( pSubSrc
12360 2d 3e 6e 53 72 63 3e 31 20 26 26 20 28 70 53 75  ->nSrc>1 && (pSu
12370 62 69 74 65 6d 2d 3e 6a 6f 69 6e 74 79 70 65 20  bitem->jointype 
12380 26 20 4a 54 5f 4f 55 54 45 52 29 21 3d 30 20 29  & JT_OUTER)!=0 )
12390 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a  {.    return 0;.
123a0 20 20 7d 0a 0a 20 20 2f 2a 20 52 65 73 74 72 69    }..  /* Restri
123b0 63 74 69 6f 6e 20 31 32 3a 20 20 49 66 20 74 68  ction 12:  If th
123c0 65 20 73 75 62 71 75 65 72 79 20 69 73 20 74 68  e subquery is th
123d0 65 20 72 69 67 68 74 20 6f 70 65 72 61 6e 64 20  e right operand 
123e0 6f 66 20 61 20 6c 65 66 74 20 6f 75 74 65 72 0a  of a left outer.
123f0 20 20 2a 2a 20 6a 6f 69 6e 2c 20 6d 61 6b 65 20    ** join, make 
12400 73 75 72 65 20 74 68 65 20 73 75 62 71 75 65 72  sure the subquer
12410 79 20 68 61 73 20 6e 6f 20 57 48 45 52 45 20 63  y has no WHERE c
12420 6c 61 75 73 65 2e 0a 20 20 2a 2a 20 41 6e 20 65  lause..  ** An e
12430 78 61 6d 70 6c 65 73 20 6f 66 20 77 68 79 20 74  xamples of why t
12440 68 69 73 20 69 73 20 6e 6f 74 20 61 6c 6c 6f 77  his is not allow
12450 65 64 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20  ed:.  **.  **   
12460 20 20 20 20 20 20 74 31 20 4c 45 46 54 20 4f 55        t1 LEFT OU
12470 54 45 52 20 4a 4f 49 4e 20 28 53 45 4c 45 43 54  TER JOIN (SELECT
12480 20 2a 20 46 52 4f 4d 20 74 32 20 57 48 45 52 45   * FROM t2 WHERE
12490 20 74 32 2e 78 3e 30 29 0a 20 20 2a 2a 0a 20 20   t2.x>0).  **.  
124a0 2a 2a 20 49 66 20 77 65 20 66 6c 61 74 74 65 6e  ** If we flatten
124b0 20 74 68 65 20 61 62 6f 76 65 2c 20 77 65 20 77   the above, we w
124c0 6f 75 6c 64 20 67 65 74 0a 20 20 2a 2a 0a 20 20  ould get.  **.  
124d0 2a 2a 20 20 20 20 20 20 20 20 20 28 74 31 20 4c  **         (t1 L
124e0 45 46 54 20 4f 55 54 45 52 20 4a 4f 49 4e 20 74  EFT OUTER JOIN t
124f0 32 29 20 57 48 45 52 45 20 74 32 2e 78 3e 30 0a  2) WHERE t2.x>0.
12500 20 20 2a 2a 0a 20 20 2a 2a 20 42 75 74 20 74 68    **.  ** But th
12510 65 20 74 32 2e 78 3e 30 20 74 65 73 74 20 77 69  e t2.x>0 test wi
12520 6c 6c 20 61 6c 77 61 79 73 20 66 61 69 6c 20 6f  ll always fail o
12530 6e 20 61 20 4e 55 4c 4c 20 72 6f 77 20 6f 66 20  n a NULL row of 
12540 74 32 2c 20 77 68 69 63 68 0a 20 20 2a 2a 20 65  t2, which.  ** e
12550 66 66 65 63 74 69 76 65 6c 79 20 63 6f 6e 76 65  ffectively conve
12560 72 74 73 20 74 68 65 20 4f 55 54 45 52 20 4a 4f  rts the OUTER JO
12570 49 4e 20 69 6e 74 6f 20 61 6e 20 49 4e 4e 45 52  IN into an INNER
12580 20 4a 4f 49 4e 2e 0a 20 20 2a 2f 0a 20 20 69 66   JOIN..  */.  if
12590 28 20 28 70 53 75 62 69 74 65 6d 2d 3e 6a 6f 69  ( (pSubitem->joi
125a0 6e 74 79 70 65 20 26 20 4a 54 5f 4f 55 54 45 52  ntype & JT_OUTER
125b0 29 21 3d 30 20 26 26 20 70 53 75 62 2d 3e 70 57  )!=0 && pSub->pW
125c0 68 65 72 65 21 3d 30 20 29 7b 0a 20 20 20 20 72  here!=0 ){.    r
125d0 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 0a 20 20  eturn 0;.  }..  
125e0 2f 2a 20 49 66 20 77 65 20 72 65 61 63 68 20 74  /* If we reach t
125f0 68 69 73 20 70 6f 69 6e 74 2c 20 69 74 20 6d 65  his point, it me
12600 61 6e 73 20 66 6c 61 74 74 65 6e 69 6e 67 20 69  ans flattening i
12610 73 20 70 65 72 6d 69 74 74 65 64 20 66 6f 72 20  s permitted for 
12620 74 68 65 0a 20 20 2a 2a 20 69 46 72 6f 6d 2d 74  the.  ** iFrom-t
12630 68 20 65 6e 74 72 79 20 6f 66 20 74 68 65 20 46  h entry of the F
12640 52 4f 4d 20 63 6c 61 75 73 65 20 69 6e 20 74 68  ROM clause in th
12650 65 20 6f 75 74 65 72 20 71 75 65 72 79 2e 0a 20  e outer query.. 
12660 20 2a 2f 0a 0a 20 20 2f 2a 20 4d 6f 76 65 20 61   */..  /* Move a
12670 6c 6c 20 6f 66 20 74 68 65 20 46 52 4f 4d 20 65  ll of the FROM e
12680 6c 65 6d 65 6e 74 73 20 6f 66 20 74 68 65 20 73  lements of the s
12690 75 62 71 75 65 72 79 20 69 6e 74 6f 20 74 68 65  ubquery into the
126a0 0a 20 20 2a 2a 20 74 68 65 20 46 52 4f 4d 20 63  .  ** the FROM c
126b0 6c 61 75 73 65 20 6f 66 20 74 68 65 20 6f 75 74  lause of the out
126c0 65 72 20 71 75 65 72 79 2e 20 20 42 65 66 6f 72  er query.  Befor
126d0 65 20 64 6f 69 6e 67 20 74 68 69 73 2c 20 72 65  e doing this, re
126e0 6d 65 6d 62 65 72 0a 20 20 2a 2a 20 74 68 65 20  member.  ** the 
126f0 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 20 66 6f  cursor number fo
12700 72 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 6f  r the original o
12710 75 74 65 72 20 71 75 65 72 79 20 46 52 4f 4d 20  uter query FROM 
12720 65 6c 65 6d 65 6e 74 20 69 6e 0a 20 20 2a 2a 20  element in.  ** 
12730 69 50 61 72 65 6e 74 2e 20 20 54 68 65 20 69 50  iParent.  The iP
12740 61 72 65 6e 74 20 63 75 72 73 6f 72 20 77 69 6c  arent cursor wil
12750 6c 20 6e 65 76 65 72 20 62 65 20 75 73 65 64 2e  l never be used.
12760 20 20 53 75 62 73 65 71 75 65 6e 74 20 63 6f 64    Subsequent cod
12770 65 0a 20 20 2a 2a 20 77 69 6c 6c 20 73 63 61 6e  e.  ** will scan
12780 20 65 78 70 72 65 73 73 69 6f 6e 73 20 6c 6f 6f   expressions loo
12790 6b 69 6e 67 20 66 6f 72 20 69 50 61 72 65 6e 74  king for iParent
127a0 20 72 65 66 65 72 65 6e 63 65 73 20 61 6e 64 20   references and 
127b0 72 65 70 6c 61 63 65 0a 20 20 2a 2a 20 74 68 6f  replace.  ** tho
127c0 73 65 20 72 65 66 65 72 65 6e 63 65 73 20 77 69  se references wi
127d0 74 68 20 65 78 70 72 65 73 73 69 6f 6e 73 20 74  th expressions t
127e0 68 61 74 20 72 65 73 6f 6c 76 65 20 74 6f 20 74  hat resolve to t
127f0 68 65 20 73 75 62 71 75 65 72 79 20 46 52 4f 4d  he subquery FROM
12800 0a 20 20 2a 2a 20 65 6c 65 6d 65 6e 74 73 20 77  .  ** elements w
12810 65 20 61 72 65 20 6e 6f 77 20 63 6f 70 79 69 6e  e are now copyin
12820 67 20 69 6e 2e 0a 20 20 2a 2f 0a 20 20 69 50 61  g in..  */.  iPa
12830 72 65 6e 74 20 3d 20 70 53 75 62 69 74 65 6d 2d  rent = pSubitem-
12840 3e 69 43 75 72 73 6f 72 3b 0a 20 20 7b 0a 20 20  >iCursor;.  {.  
12850 20 20 69 6e 74 20 6e 53 75 62 53 72 63 20 3d 20    int nSubSrc = 
12860 70 53 75 62 53 72 63 2d 3e 6e 53 72 63 3b 0a 20  pSubSrc->nSrc;. 
12870 20 20 20 69 6e 74 20 6a 6f 69 6e 74 79 70 65 20     int jointype 
12880 3d 20 70 53 75 62 69 74 65 6d 2d 3e 6a 6f 69 6e  = pSubitem->join
12890 74 79 70 65 3b 0a 0a 20 20 20 20 73 71 6c 69 74  type;..    sqlit
128a0 65 33 44 65 6c 65 74 65 54 61 62 6c 65 28 70 53  e3DeleteTable(pS
128b0 75 62 69 74 65 6d 2d 3e 70 54 61 62 29 3b 0a 20  ubitem->pTab);. 
128c0 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 53     sqliteFree(pS
128d0 75 62 69 74 65 6d 2d 3e 7a 44 61 74 61 62 61 73  ubitem->zDatabas
128e0 65 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 46 72  e);.    sqliteFr
128f0 65 65 28 70 53 75 62 69 74 65 6d 2d 3e 7a 4e 61  ee(pSubitem->zNa
12900 6d 65 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 46  me);.    sqliteF
12910 72 65 65 28 70 53 75 62 69 74 65 6d 2d 3e 7a 41  ree(pSubitem->zA
12920 6c 69 61 73 29 3b 0a 20 20 20 20 69 66 28 20 6e  lias);.    if( n
12930 53 75 62 53 72 63 3e 31 20 29 7b 0a 20 20 20 20  SubSrc>1 ){.    
12940 20 20 69 6e 74 20 65 78 74 72 61 20 3d 20 6e 53    int extra = nS
12950 75 62 53 72 63 20 2d 20 31 3b 0a 20 20 20 20 20  ubSrc - 1;.     
12960 20 66 6f 72 28 69 3d 31 3b 20 69 3c 6e 53 75 62   for(i=1; i<nSub
12970 53 72 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  Src; i++){.     
12980 20 20 20 70 53 72 63 20 3d 20 73 71 6c 69 74 65     pSrc = sqlite
12990 33 53 72 63 4c 69 73 74 41 70 70 65 6e 64 28 70  3SrcListAppend(p
129a0 53 72 63 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  Src, 0, 0);.    
129b0 20 20 7d 0a 20 20 20 20 20 20 70 2d 3e 70 53 72    }.      p->pSr
129c0 63 20 3d 20 70 53 72 63 3b 0a 20 20 20 20 20 20  c = pSrc;.      
129d0 66 6f 72 28 69 3d 70 53 72 63 2d 3e 6e 53 72 63  for(i=pSrc->nSrc
129e0 2d 31 3b 20 69 2d 65 78 74 72 61 3e 3d 69 46 72  -1; i-extra>=iFr
129f0 6f 6d 3b 20 69 2d 2d 29 7b 0a 20 20 20 20 20 20  om; i--){.      
12a00 20 20 70 53 72 63 2d 3e 61 5b 69 5d 20 3d 20 70    pSrc->a[i] = p
12a10 53 72 63 2d 3e 61 5b 69 2d 65 78 74 72 61 5d 3b  Src->a[i-extra];
12a20 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
12a30 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 53     for(i=0; i<nS
12a40 75 62 53 72 63 3b 20 69 2b 2b 29 7b 0a 20 20 20  ubSrc; i++){.   
12a50 20 20 20 70 53 72 63 2d 3e 61 5b 69 2b 69 46 72     pSrc->a[i+iFr
12a60 6f 6d 5d 20 3d 20 70 53 75 62 53 72 63 2d 3e 61  om] = pSubSrc->a
12a70 5b 69 5d 3b 0a 20 20 20 20 20 20 6d 65 6d 73 65  [i];.      memse
12a80 74 28 26 70 53 75 62 53 72 63 2d 3e 61 5b 69 5d  t(&pSubSrc->a[i]
12a90 2c 20 30 2c 20 73 69 7a 65 6f 66 28 70 53 75 62  , 0, sizeof(pSub
12aa0 53 72 63 2d 3e 61 5b 69 5d 29 29 3b 0a 20 20 20  Src->a[i]));.   
12ab0 20 7d 0a 20 20 20 20 70 53 72 63 2d 3e 61 5b 69   }.    pSrc->a[i
12ac0 46 72 6f 6d 5d 2e 6a 6f 69 6e 74 79 70 65 20 3d  From].jointype =
12ad0 20 6a 6f 69 6e 74 79 70 65 3b 0a 20 20 7d 0a 0a   jointype;.  }..
12ae0 20 20 2f 2a 20 4e 6f 77 20 62 65 67 69 6e 20 73    /* Now begin s
12af0 75 62 73 74 69 74 75 74 69 6e 67 20 73 75 62 71  ubstituting subq
12b00 75 65 72 79 20 72 65 73 75 6c 74 20 73 65 74 20  uery result set 
12b10 65 78 70 72 65 73 73 69 6f 6e 73 20 66 6f 72 20  expressions for 
12b20 0a 20 20 2a 2a 20 72 65 66 65 72 65 6e 63 65 73  .  ** references
12b30 20 74 6f 20 74 68 65 20 69 50 61 72 65 6e 74 20   to the iParent 
12b40 69 6e 20 74 68 65 20 6f 75 74 65 72 20 71 75 65  in the outer que
12b50 72 79 2e 0a 20 20 2a 2a 20 0a 20 20 2a 2a 20 45  ry..  ** .  ** E
12b60 78 61 6d 70 6c 65 3a 0a 20 20 2a 2a 0a 20 20 2a  xample:.  **.  *
12b70 2a 20 20 20 53 45 4c 45 43 54 20 61 2b 35 2c 20  *   SELECT a+5, 
12b80 62 2a 31 30 20 46 52 4f 4d 20 28 53 45 4c 45 43  b*10 FROM (SELEC
12b90 54 20 78 2a 33 20 41 53 20 61 2c 20 79 2b 31 30  T x*3 AS a, y+10
12ba0 20 41 53 20 62 20 46 52 4f 4d 20 74 31 29 20 57   AS b FROM t1) W
12bb0 48 45 52 45 20 61 3e 62 3b 0a 20 20 2a 2a 20 20  HERE a>b;.  **  
12bc0 20 5c 20 20 20 20 20 20 20 20 20 20 20 20 20 20   \              
12bd0 20 20 20 20 20 20 20 5c 5f 5f 5f 5f 5f 5f 5f 5f         \________
12be0 5f 5f 5f 5f 5f 20 73 75 62 71 75 65 72 79 20 5f  _____ subquery _
12bf0 5f 5f 5f 5f 5f 5f 5f 5f 5f 2f 20 20 20 20 20 20  _________/      
12c00 20 20 20 20 2f 0a 20 20 2a 2a 20 20 20 20 5c 5f      /.  **    \_
12c10 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f  ________________
12c20 5f 5f 5f 5f 20 6f 75 74 65 72 20 71 75 65 72 79  ____ outer query
12c30 20 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f   _______________
12c40 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 2f  _______________/
12c50 0a 20 20 2a 2a 0a 20 20 2a 2a 20 57 65 20 6c 6f  .  **.  ** We lo
12c60 6f 6b 20 61 74 20 65 76 65 72 79 20 65 78 70 72  ok at every expr
12c70 65 73 73 69 6f 6e 20 69 6e 20 74 68 65 20 6f 75  ession in the ou
12c80 74 65 72 20 71 75 65 72 79 20 61 6e 64 20 65 76  ter query and ev
12c90 65 72 79 20 70 6c 61 63 65 20 77 65 20 73 65 65  ery place we see
12ca0 0a 20 20 2a 2a 20 22 61 22 20 77 65 20 73 75 62  .  ** "a" we sub
12cb0 73 74 69 74 75 74 65 20 22 78 2a 33 22 20 61 6e  stitute "x*3" an
12cc0 64 20 65 76 65 72 79 20 70 6c 61 63 65 20 77 65  d every place we
12cd0 20 73 65 65 20 22 62 22 20 77 65 20 73 75 62 73   see "b" we subs
12ce0 74 69 74 75 74 65 20 22 79 2b 31 30 22 2e 0a 20  titute "y+10".. 
12cf0 20 2a 2f 0a 20 20 70 4c 69 73 74 20 3d 20 70 2d   */.  pList = p-
12d00 3e 70 45 4c 69 73 74 3b 0a 20 20 66 6f 72 28 69  >pEList;.  for(i
12d10 3d 30 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e 45 78  =0; i<pList->nEx
12d20 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 45 78  pr; i++){.    Ex
12d30 70 72 20 2a 70 45 78 70 72 3b 0a 20 20 20 20 69  pr *pExpr;.    i
12d40 66 28 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a  f( pList->a[i].z
12d50 4e 61 6d 65 3d 3d 30 20 26 26 20 28 70 45 78 70  Name==0 && (pExp
12d60 72 20 3d 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e  r = pList->a[i].
12d70 70 45 78 70 72 29 2d 3e 73 70 61 6e 2e 7a 21 3d  pExpr)->span.z!=
12d80 30 20 29 7b 0a 20 20 20 20 20 20 70 4c 69 73 74  0 ){.      pList
12d90 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 20 3d 20 73  ->a[i].zName = s
12da0 71 6c 69 74 65 53 74 72 4e 44 75 70 28 28 63 68  qliteStrNDup((ch
12db0 61 72 2a 29 70 45 78 70 72 2d 3e 73 70 61 6e 2e  ar*)pExpr->span.
12dc0 7a 2c 20 70 45 78 70 72 2d 3e 73 70 61 6e 2e 6e  z, pExpr->span.n
12dd0 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73  );.    }.  }.  s
12de0 75 62 73 74 45 78 70 72 4c 69 73 74 28 70 2d 3e  ubstExprList(p->
12df0 70 45 4c 69 73 74 2c 20 69 50 61 72 65 6e 74 2c  pEList, iParent,
12e00 20 70 53 75 62 2d 3e 70 45 4c 69 73 74 29 3b 0a   pSub->pEList);.
12e10 20 20 69 66 28 20 69 73 41 67 67 20 29 7b 0a 20    if( isAgg ){. 
12e20 20 20 20 73 75 62 73 74 45 78 70 72 4c 69 73 74     substExprList
12e30 28 70 2d 3e 70 47 72 6f 75 70 42 79 2c 20 69 50  (p->pGroupBy, iP
12e40 61 72 65 6e 74 2c 20 70 53 75 62 2d 3e 70 45 4c  arent, pSub->pEL
12e50 69 73 74 29 3b 0a 20 20 20 20 73 75 62 73 74 45  ist);.    substE
12e60 78 70 72 28 70 2d 3e 70 48 61 76 69 6e 67 2c 20  xpr(p->pHaving, 
12e70 69 50 61 72 65 6e 74 2c 20 70 53 75 62 2d 3e 70  iParent, pSub->p
12e80 45 4c 69 73 74 29 3b 0a 20 20 7d 0a 20 20 69 66  EList);.  }.  if
12e90 28 20 70 53 75 62 2d 3e 70 4f 72 64 65 72 42 79  ( pSub->pOrderBy
12ea0 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
12eb0 70 2d 3e 70 4f 72 64 65 72 42 79 3d 3d 30 20 29  p->pOrderBy==0 )
12ec0 3b 0a 20 20 20 20 70 2d 3e 70 4f 72 64 65 72 42  ;.    p->pOrderB
12ed0 79 20 3d 20 70 53 75 62 2d 3e 70 4f 72 64 65 72  y = pSub->pOrder
12ee0 42 79 3b 0a 20 20 20 20 70 53 75 62 2d 3e 70 4f  By;.    pSub->pO
12ef0 72 64 65 72 42 79 20 3d 20 30 3b 0a 20 20 7d 65  rderBy = 0;.  }e
12f00 6c 73 65 20 69 66 28 20 70 2d 3e 70 4f 72 64 65  lse if( p->pOrde
12f10 72 42 79 20 29 7b 0a 20 20 20 20 73 75 62 73 74  rBy ){.    subst
12f20 45 78 70 72 4c 69 73 74 28 70 2d 3e 70 4f 72 64  ExprList(p->pOrd
12f30 65 72 42 79 2c 20 69 50 61 72 65 6e 74 2c 20 70  erBy, iParent, p
12f40 53 75 62 2d 3e 70 45 4c 69 73 74 29 3b 0a 20 20  Sub->pEList);.  
12f50 7d 0a 20 20 69 66 28 20 70 53 75 62 2d 3e 70 57  }.  if( pSub->pW
12f60 68 65 72 65 20 29 7b 0a 20 20 20 20 70 57 68 65  here ){.    pWhe
12f70 72 65 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  re = sqlite3Expr
12f80 44 75 70 28 70 53 75 62 2d 3e 70 57 68 65 72 65  Dup(pSub->pWhere
12f90 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
12fa0 70 57 68 65 72 65 20 3d 20 30 3b 0a 20 20 7d 0a  pWhere = 0;.  }.
12fb0 20 20 69 66 28 20 73 75 62 71 75 65 72 79 49 73    if( subqueryIs
12fc0 41 67 67 20 29 7b 0a 20 20 20 20 61 73 73 65 72  Agg ){.    asser
12fd0 74 28 20 70 2d 3e 70 48 61 76 69 6e 67 3d 3d 30  t( p->pHaving==0
12fe0 20 29 3b 0a 20 20 20 20 70 2d 3e 70 48 61 76 69   );.    p->pHavi
12ff0 6e 67 20 3d 20 70 2d 3e 70 57 68 65 72 65 3b 0a  ng = p->pWhere;.
13000 20 20 20 20 70 2d 3e 70 57 68 65 72 65 20 3d 20      p->pWhere = 
13010 70 57 68 65 72 65 3b 0a 20 20 20 20 73 75 62 73  pWhere;.    subs
13020 74 45 78 70 72 28 70 2d 3e 70 48 61 76 69 6e 67  tExpr(p->pHaving
13030 2c 20 69 50 61 72 65 6e 74 2c 20 70 53 75 62 2d  , iParent, pSub-
13040 3e 70 45 4c 69 73 74 29 3b 0a 20 20 20 20 70 2d  >pEList);.    p-
13050 3e 70 48 61 76 69 6e 67 20 3d 20 73 71 6c 69 74  >pHaving = sqlit
13060 65 33 45 78 70 72 41 6e 64 28 70 2d 3e 70 48 61  e3ExprAnd(p->pHa
13070 76 69 6e 67 2c 20 73 71 6c 69 74 65 33 45 78 70  ving, sqlite3Exp
13080 72 44 75 70 28 70 53 75 62 2d 3e 70 48 61 76 69  rDup(pSub->pHavi
13090 6e 67 29 29 3b 0a 20 20 20 20 61 73 73 65 72 74  ng));.    assert
130a0 28 20 70 2d 3e 70 47 72 6f 75 70 42 79 3d 3d 30  ( p->pGroupBy==0
130b0 20 29 3b 0a 20 20 20 20 70 2d 3e 70 47 72 6f 75   );.    p->pGrou
130c0 70 42 79 20 3d 20 73 71 6c 69 74 65 33 45 78 70  pBy = sqlite3Exp
130d0 72 4c 69 73 74 44 75 70 28 70 53 75 62 2d 3e 70  rListDup(pSub->p
130e0 47 72 6f 75 70 42 79 29 3b 0a 20 20 7d 65 6c 73  GroupBy);.  }els
130f0 65 7b 0a 20 20 20 20 73 75 62 73 74 45 78 70 72  e{.    substExpr
13100 28 70 2d 3e 70 57 68 65 72 65 2c 20 69 50 61 72  (p->pWhere, iPar
13110 65 6e 74 2c 20 70 53 75 62 2d 3e 70 45 4c 69 73  ent, pSub->pELis
13120 74 29 3b 0a 20 20 20 20 70 2d 3e 70 57 68 65 72  t);.    p->pWher
13130 65 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 41  e = sqlite3ExprA
13140 6e 64 28 70 2d 3e 70 57 68 65 72 65 2c 20 70 57  nd(p->pWhere, pW
13150 68 65 72 65 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  here);.  }..  /*
13160 20 54 68 65 20 66 6c 61 74 74 65 6e 65 64 20 71   The flattened q
13170 75 65 72 79 20 69 73 20 64 69 73 74 69 6e 63 74  uery is distinct
13180 20 69 66 20 65 69 74 68 65 72 20 74 68 65 20 69   if either the i
13190 6e 6e 65 72 20 6f 72 20 74 68 65 0a 20 20 2a 2a  nner or the.  **
131a0 20 6f 75 74 65 72 20 71 75 65 72 79 20 69 73 20   outer query is 
131b0 64 69 73 74 69 6e 63 74 2e 20 0a 20 20 2a 2f 0a  distinct. .  */.
131c0 20 20 70 2d 3e 69 73 44 69 73 74 69 6e 63 74 20    p->isDistinct 
131d0 3d 20 70 2d 3e 69 73 44 69 73 74 69 6e 63 74 20  = p->isDistinct 
131e0 7c 7c 20 70 53 75 62 2d 3e 69 73 44 69 73 74 69  || pSub->isDisti
131f0 6e 63 74 3b 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20  nct;..  /*.  ** 
13200 53 45 4c 45 43 54 20 2e 2e 2e 20 46 52 4f 4d 20  SELECT ... FROM 
13210 28 53 45 4c 45 43 54 20 2e 2e 2e 20 4c 49 4d 49  (SELECT ... LIMI
13220 54 20 61 20 4f 46 46 53 45 54 20 62 29 20 4c 49  T a OFFSET b) LI
13230 4d 49 54 20 78 20 4f 46 46 53 45 54 20 79 3b 0a  MIT x OFFSET y;.
13240 20 20 2a 2a 0a 20 20 2a 2a 20 4f 6e 65 20 69 73    **.  ** One is
13250 20 74 65 6d 70 74 65 64 20 74 6f 20 74 72 79 20   tempted to try 
13260 74 6f 20 61 64 64 20 61 20 61 6e 64 20 62 20 74  to add a and b t
13270 6f 20 63 6f 6d 62 69 6e 65 20 74 68 65 20 6c 69  o combine the li
13280 6d 69 74 73 2e 20 20 42 75 74 20 74 68 69 73 0a  mits.  But this.
13290 20 20 2a 2a 20 64 6f 65 73 20 6e 6f 74 20 77 6f    ** does not wo
132a0 72 6b 20 69 66 20 65 69 74 68 65 72 20 6c 69 6d  rk if either lim
132b0 69 74 20 69 73 20 6e 65 67 61 74 69 76 65 2e 0a  it is negative..
132c0 20 20 2a 2f 0a 20 20 69 66 28 20 70 53 75 62 2d    */.  if( pSub-
132d0 3e 70 4c 69 6d 69 74 20 29 7b 0a 20 20 20 20 70  >pLimit ){.    p
132e0 2d 3e 70 4c 69 6d 69 74 20 3d 20 70 53 75 62 2d  ->pLimit = pSub-
132f0 3e 70 4c 69 6d 69 74 3b 0a 20 20 20 20 70 53 75  >pLimit;.    pSu
13300 62 2d 3e 70 4c 69 6d 69 74 20 3d 20 30 3b 0a 20  b->pLimit = 0;. 
13310 20 7d 0a 0a 20 20 2f 2a 20 46 69 6e 69 61 6c 6c   }..  /* Finiall
13320 79 2c 20 64 65 6c 65 74 65 20 77 68 61 74 20 69  y, delete what i
13330 73 20 6c 65 66 74 20 6f 66 20 74 68 65 20 73 75  s left of the su
13340 62 71 75 65 72 79 20 61 6e 64 20 72 65 74 75 72  bquery and retur
13350 6e 0a 20 20 2a 2a 20 73 75 63 63 65 73 73 2e 0a  n.  ** success..
13360 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 53 65    */.  sqlite3Se
13370 6c 65 63 74 44 65 6c 65 74 65 28 70 53 75 62 29  lectDelete(pSub)
13380 3b 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a 7d 0a  ;.  return 1;.}.
13390 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
133a0 5f 4f 4d 49 54 5f 56 49 45 57 20 2a 2f 0a 0a 2f  _OMIT_VIEW */../
133b0 2a 0a 2a 2a 20 41 6e 61 6c 79 7a 65 20 74 68 65  *.** Analyze the
133c0 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
133d0 74 20 70 61 73 73 65 64 20 69 6e 20 61 73 20 61  t passed in as a
133e0 6e 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 73 65  n argument to se
133f0 65 20 69 66 20 69 74 0a 2a 2a 20 69 73 20 61 20  e if it.** is a 
13400 73 69 6d 70 6c 65 20 6d 69 6e 28 29 20 6f 72 20  simple min() or 
13410 6d 61 78 28 29 20 71 75 65 72 79 2e 20 20 49 66  max() query.  If
13420 20 69 74 20 69 73 20 61 6e 64 20 74 68 69 73 20   it is and this 
13430 71 75 65 72 79 20 63 61 6e 20 62 65 0a 2a 2a 20  query can be.** 
13440 73 61 74 69 73 66 69 65 64 20 75 73 69 6e 67 20  satisfied using 
13450 61 20 73 69 6e 67 6c 65 20 73 65 65 6b 20 74 6f  a single seek to
13460 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f   the beginning o
13470 72 20 65 6e 64 20 6f 66 20 61 6e 20 69 6e 64 65  r end of an inde
13480 78 2c 0a 2a 2a 20 74 68 65 6e 20 67 65 6e 65 72  x,.** then gener
13490 61 74 65 20 74 68 65 20 63 6f 64 65 20 66 6f 72  ate the code for
134a0 20 74 68 69 73 20 53 45 4c 45 43 54 20 61 6e 64   this SELECT and
134b0 20 72 65 74 75 72 6e 20 31 2e 20 20 49 66 20 74   return 1.  If t
134c0 68 69 73 20 69 73 20 6e 6f 74 20 61 20 0a 2a 2a  his is not a .**
134d0 20 73 69 6d 70 6c 65 20 6d 69 6e 28 29 20 6f 72   simple min() or
134e0 20 6d 61 78 28 29 20 71 75 65 72 79 2c 20 74 68   max() query, th
134f0 65 6e 20 72 65 74 75 72 6e 20 30 3b 0a 2a 2a 0a  en return 0;.**.
13500 2a 2a 20 41 20 73 69 6d 70 6c 79 20 6d 69 6e 28  ** A simply min(
13510 29 20 6f 72 20 6d 61 78 28 29 20 71 75 65 72 79  ) or max() query
13520 20 6c 6f 6f 6b 73 20 6c 69 6b 65 20 74 68 69 73   looks like this
13530 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 53 45 4c 45 43  :.**.**    SELEC
13540 54 20 6d 69 6e 28 61 29 20 46 52 4f 4d 20 74 61  T min(a) FROM ta
13550 62 6c 65 3b 0a 2a 2a 20 20 20 20 53 45 4c 45 43  ble;.**    SELEC
13560 54 20 6d 61 78 28 61 29 20 46 52 4f 4d 20 74 61  T max(a) FROM ta
13570 62 6c 65 3b 0a 2a 2a 0a 2a 2a 20 54 68 65 20 71  ble;.**.** The q
13580 75 65 72 79 20 6d 61 79 20 68 61 76 65 20 6f 6e  uery may have on
13590 6c 79 20 61 20 73 69 6e 67 6c 65 20 74 61 62 6c  ly a single tabl
135a0 65 20 69 6e 20 69 74 73 20 46 52 4f 4d 20 61 72  e in its FROM ar
135b0 67 75 6d 65 6e 74 2e 20 20 54 68 65 72 65 0a 2a  gument.  There.*
135c0 2a 20 63 61 6e 20 62 65 20 6e 6f 20 47 52 4f 55  * can be no GROU
135d0 50 20 42 59 20 6f 72 20 48 41 56 49 4e 47 20 6f  P BY or HAVING o
135e0 72 20 57 48 45 52 45 20 63 6c 61 75 73 65 73 2e  r WHERE clauses.
135f0 20 20 54 68 65 20 72 65 73 75 6c 74 20 73 65 74    The result set
13600 20 6d 75 73 74 0a 2a 2a 20 62 65 20 74 68 65 20   must.** be the 
13610 6d 69 6e 28 29 20 6f 72 20 6d 61 78 28 29 20 6f  min() or max() o
13620 66 20 61 20 73 69 6e 67 6c 65 20 63 6f 6c 75 6d  f a single colum
13630 6e 20 6f 66 20 74 68 65 20 74 61 62 6c 65 2e 20  n of the table. 
13640 20 54 68 65 20 63 6f 6c 75 6d 6e 0a 2a 2a 20 69   The column.** i
13650 6e 20 74 68 65 20 6d 69 6e 28 29 20 6f 72 20 6d  n the min() or m
13660 61 78 28 29 20 66 75 6e 63 74 69 6f 6e 20 6d 75  ax() function mu
13670 73 74 20 62 65 20 69 6e 64 65 78 65 64 2e 0a 2a  st be indexed..*
13680 2a 0a 2a 2a 20 54 68 65 20 70 61 72 61 6d 65 74  *.** The paramet
13690 65 72 73 20 74 6f 20 74 68 69 73 20 72 6f 75 74  ers to this rout
136a0 69 6e 65 20 61 72 65 20 74 68 65 20 73 61 6d 65  ine are the same
136b0 20 61 73 20 66 6f 72 20 73 71 6c 69 74 65 33 53   as for sqlite3S
136c0 65 6c 65 63 74 28 29 2e 0a 2a 2a 20 53 65 65 20  elect()..** See 
136d0 74 68 65 20 68 65 61 64 65 72 20 63 6f 6d 6d 65  the header comme
136e0 6e 74 20 6f 6e 20 74 68 61 74 20 72 6f 75 74 69  nt on that routi
136f0 6e 65 20 66 6f 72 20 61 64 64 69 74 69 6f 6e 61  ne for additiona
13700 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 0a 2a  l information..*
13710 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 69 6d  /.static int sim
13720 70 6c 65 4d 69 6e 4d 61 78 51 75 65 72 79 28 50  pleMinMaxQuery(P
13730 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 53 65  arse *pParse, Se
13740 6c 65 63 74 20 2a 70 2c 20 69 6e 74 20 65 44 65  lect *p, int eDe
13750 73 74 2c 20 69 6e 74 20 69 50 61 72 6d 29 7b 0a  st, int iParm){.
13760 20 20 45 78 70 72 20 2a 70 45 78 70 72 3b 0a 20    Expr *pExpr;. 
13770 20 69 6e 74 20 69 43 6f 6c 3b 0a 20 20 54 61 62   int iCol;.  Tab
13780 6c 65 20 2a 70 54 61 62 3b 0a 20 20 49 6e 64 65  le *pTab;.  Inde
13790 78 20 2a 70 49 64 78 3b 0a 20 20 69 6e 74 20 62  x *pIdx;.  int b
137a0 61 73 65 3b 0a 20 20 56 64 62 65 20 2a 76 3b 0a  ase;.  Vdbe *v;.
137b0 20 20 69 6e 74 20 73 65 65 6b 4f 70 3b 0a 20 20    int seekOp;.  
137c0 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74  ExprList *pEList
137d0 2c 20 2a 70 4c 69 73 74 2c 20 65 4c 69 73 74 3b  , *pList, eList;
137e0 0a 20 20 73 74 72 75 63 74 20 45 78 70 72 4c 69  .  struct ExprLi
137f0 73 74 5f 69 74 65 6d 20 65 4c 69 73 74 49 74 65  st_item eListIte
13800 6d 3b 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 53  m;.  SrcList *pS
13810 72 63 3b 0a 20 20 69 6e 74 20 62 72 6b 3b 0a 20  rc;.  int brk;. 
13820 20 69 6e 74 20 69 44 62 3b 0a 0a 20 20 2f 2a 20   int iDb;..  /* 
13830 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20  Check to see if 
13840 74 68 69 73 20 71 75 65 72 79 20 69 73 20 61 20  this query is a 
13850 73 69 6d 70 6c 65 20 6d 69 6e 28 29 20 6f 72 20  simple min() or 
13860 6d 61 78 28 29 20 71 75 65 72 79 2e 20 20 52 65  max() query.  Re
13870 74 75 72 6e 0a 20 20 2a 2a 20 7a 65 72 6f 20 69  turn.  ** zero i
13880 66 20 69 74 20 69 73 20 20 6e 6f 74 2e 0a 20 20  f it is  not..  
13890 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 70 47 72 6f  */.  if( p->pGro
138a0 75 70 42 79 20 7c 7c 20 70 2d 3e 70 48 61 76 69  upBy || p->pHavi
138b0 6e 67 20 7c 7c 20 70 2d 3e 70 57 68 65 72 65 20  ng || p->pWhere 
138c0 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 70 53  ) return 0;.  pS
138d0 72 63 20 3d 20 70 2d 3e 70 53 72 63 3b 0a 20 20  rc = p->pSrc;.  
138e0 69 66 28 20 70 53 72 63 2d 3e 6e 53 72 63 21 3d  if( pSrc->nSrc!=
138f0 31 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  1 ) return 0;.  
13900 70 45 4c 69 73 74 20 3d 20 70 2d 3e 70 45 4c 69  pEList = p->pELi
13910 73 74 3b 0a 20 20 69 66 28 20 70 45 4c 69 73 74  st;.  if( pEList
13920 2d 3e 6e 45 78 70 72 21 3d 31 20 29 20 72 65 74  ->nExpr!=1 ) ret
13930 75 72 6e 20 30 3b 0a 20 20 70 45 78 70 72 20 3d  urn 0;.  pExpr =
13940 20 70 45 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45   pEList->a[0].pE
13950 78 70 72 3b 0a 20 20 69 66 28 20 70 45 78 70 72  xpr;.  if( pExpr
13960 2d 3e 6f 70 21 3d 54 4b 5f 41 47 47 5f 46 55 4e  ->op!=TK_AGG_FUN
13970 43 54 49 4f 4e 20 29 20 72 65 74 75 72 6e 20 30  CTION ) return 0
13980 3b 0a 20 20 70 4c 69 73 74 20 3d 20 70 45 78 70  ;.  pList = pExp
13990 72 2d 3e 70 4c 69 73 74 3b 0a 20 20 69 66 28 20  r->pList;.  if( 
139a0 70 4c 69 73 74 3d 3d 30 20 7c 7c 20 70 4c 69 73  pList==0 || pLis
139b0 74 2d 3e 6e 45 78 70 72 21 3d 31 20 29 20 72 65  t->nExpr!=1 ) re
139c0 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 70 45  turn 0;.  if( pE
139d0 78 70 72 2d 3e 74 6f 6b 65 6e 2e 6e 21 3d 33 20  xpr->token.n!=3 
139e0 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66  ) return 0;.  if
139f0 28 20 73 71 6c 69 74 65 33 53 74 72 4e 49 43 6d  ( sqlite3StrNICm
13a00 70 28 28 63 68 61 72 2a 29 70 45 78 70 72 2d 3e  p((char*)pExpr->
13a10 74 6f 6b 65 6e 2e 7a 2c 22 6d 69 6e 22 2c 33 29  token.z,"min",3)
13a20 3d 3d 30 20 29 7b 0a 20 20 20 20 73 65 65 6b 4f  ==0 ){.    seekO
13a30 70 20 3d 20 4f 50 5f 52 65 77 69 6e 64 3b 0a 20  p = OP_Rewind;. 
13a40 20 7d 65 6c 73 65 20 69 66 28 20 73 71 6c 69 74   }else if( sqlit
13a50 65 33 53 74 72 4e 49 43 6d 70 28 28 63 68 61 72  e3StrNICmp((char
13a60 2a 29 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 7a  *)pExpr->token.z
13a70 2c 22 6d 61 78 22 2c 33 29 3d 3d 30 20 29 7b 0a  ,"max",3)==0 ){.
13a80 20 20 20 20 73 65 65 6b 4f 70 20 3d 20 4f 50 5f      seekOp = OP_
13a90 4c 61 73 74 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  Last;.  }else{. 
13aa0 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d     return 0;.  }
13ab0 0a 20 20 70 45 78 70 72 20 3d 20 70 4c 69 73 74  .  pExpr = pList
13ac0 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 3b 0a 20 20  ->a[0].pExpr;.  
13ad0 69 66 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54  if( pExpr->op!=T
13ae0 4b 5f 43 4f 4c 55 4d 4e 20 29 20 72 65 74 75 72  K_COLUMN ) retur
13af0 6e 20 30 3b 0a 20 20 69 43 6f 6c 20 3d 20 70 45  n 0;.  iCol = pE
13b00 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20  xpr->iColumn;.  
13b10 70 54 61 62 20 3d 20 70 53 72 63 2d 3e 61 5b 30  pTab = pSrc->a[0
13b20 5d 2e 70 54 61 62 3b 0a 0a 20 20 2f 2a 20 54 68  ].pTab;..  /* Th
13b30 69 73 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20  is optimization 
13b40 63 61 6e 6e 6f 74 20 62 65 20 75 73 65 64 20 77  cannot be used w
13b50 69 74 68 20 76 69 72 74 75 61 6c 20 74 61 62 6c  ith virtual tabl
13b60 65 73 2e 20 2a 2f 0a 20 20 69 66 28 20 49 73 56  es. */.  if( IsV
13b70 69 72 74 75 61 6c 28 70 54 61 62 29 20 29 20 72  irtual(pTab) ) r
13b80 65 74 75 72 6e 20 30 3b 0a 0a 20 20 2f 2a 20 49  eturn 0;..  /* I
13b90 66 20 77 65 20 67 65 74 20 74 6f 20 68 65 72 65  f we get to here
13ba0 2c 20 69 74 20 6d 65 61 6e 73 20 74 68 65 20 71  , it means the q
13bb0 75 65 72 79 20 69 73 20 6f 66 20 74 68 65 20 63  uery is of the c
13bc0 6f 72 72 65 63 74 20 66 6f 72 6d 2e 0a 20 20 2a  orrect form..  *
13bd0 2a 20 43 68 65 63 6b 20 74 6f 20 6d 61 6b 65 20  * Check to make 
13be0 73 75 72 65 20 77 65 20 68 61 76 65 20 61 6e 20  sure we have an 
13bf0 69 6e 64 65 78 20 61 6e 64 20 6d 61 6b 65 20 70  index and make p
13c00 49 64 78 20 70 6f 69 6e 74 20 74 6f 20 74 68 65  Idx point to the
13c10 0a 20 20 2a 2a 20 61 70 70 72 6f 70 72 69 61 74  .  ** appropriat
13c20 65 20 69 6e 64 65 78 2e 20 20 49 66 20 74 68 65  e index.  If the
13c30 20 6d 69 6e 28 29 20 6f 72 20 6d 61 78 28 29 20   min() or max() 
13c40 69 73 20 6f 6e 20 61 6e 20 49 4e 54 45 47 45 52  is on an INTEGER
13c50 20 50 52 49 4d 41 52 59 0a 20 20 2a 2a 20 6b 65   PRIMARY.  ** ke
13c60 79 20 63 6f 6c 75 6d 6e 2c 20 6e 6f 20 69 6e 64  y column, no ind
13c70 65 78 20 69 73 20 6e 65 63 65 73 73 61 72 79 20  ex is necessary 
13c80 73 6f 20 73 65 74 20 70 49 64 78 20 74 6f 20 4e  so set pIdx to N
13c90 55 4c 4c 2e 20 20 49 66 20 6e 6f 0a 20 20 2a 2a  ULL.  If no.  **
13ca0 20 75 73 61 62 6c 65 20 69 6e 64 65 78 20 69 73   usable index is
13cb0 20 66 6f 75 6e 64 2c 20 72 65 74 75 72 6e 20 30   found, return 0
13cc0 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 69 43 6f  ..  */.  if( iCo
13cd0 6c 3c 30 20 29 7b 0a 20 20 20 20 70 49 64 78 20  l<0 ){.    pIdx 
13ce0 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  = 0;.  }else{.  
13cf0 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c    CollSeq *pColl
13d00 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f   = sqlite3ExprCo
13d10 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70 45  llSeq(pParse, pE
13d20 78 70 72 29 3b 0a 20 20 20 20 69 66 28 20 70 43  xpr);.    if( pC
13d30 6f 6c 6c 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  oll==0 ) return 
13d40 30 3b 0a 20 20 20 20 66 6f 72 28 70 49 64 78 3d  0;.    for(pIdx=
13d50 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b 20 70 49  pTab->pIndex; pI
13d60 64 78 3b 20 70 49 64 78 3d 70 49 64 78 2d 3e 70  dx; pIdx=pIdx->p
13d70 4e 65 78 74 29 7b 0a 20 20 20 20 20 20 61 73 73  Next){.      ass
13d80 65 72 74 28 20 70 49 64 78 2d 3e 6e 43 6f 6c 75  ert( pIdx->nColu
13d90 6d 6e 3e 3d 31 20 29 3b 0a 20 20 20 20 20 20 69  mn>=1 );.      i
13da0 66 28 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d  f( pIdx->aiColum
13db0 6e 5b 30 5d 3d 3d 69 43 6f 6c 20 26 26 20 0a 20  n[0]==iCol && . 
13dc0 20 20 20 20 20 20 20 20 20 30 3d 3d 73 71 6c 69           0==sqli
13dd0 74 65 33 53 74 72 49 43 6d 70 28 70 49 64 78 2d  te3StrICmp(pIdx-
13de0 3e 61 7a 43 6f 6c 6c 5b 30 5d 2c 20 70 43 6f 6c  >azColl[0], pCol
13df0 6c 2d 3e 7a 4e 61 6d 65 29 20 29 7b 0a 20 20 20  l->zName) ){.   
13e00 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
13e10 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66    }.    }.    if
13e20 28 20 70 49 64 78 3d 3d 30 20 29 20 72 65 74 75  ( pIdx==0 ) retu
13e30 72 6e 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  rn 0;.  }..  /* 
13e40 49 64 65 6e 74 69 66 79 20 63 6f 6c 75 6d 6e 20  Identify column 
13e50 74 79 70 65 73 20 69 66 20 77 65 20 77 69 6c 6c  types if we will
13e60 20 62 65 20 75 73 69 6e 67 20 74 68 65 20 63 61   be using the ca
13e70 6c 6c 62 61 63 6b 2e 20 20 54 68 69 73 0a 20 20  llback.  This.  
13e80 2a 2a 20 73 74 65 70 20 69 73 20 73 6b 69 70 70  ** step is skipp
13e90 65 64 20 69 66 20 74 68 65 20 6f 75 74 70 75 74  ed if the output
13ea0 20 69 73 20 67 6f 69 6e 67 20 74 6f 20 61 20 74   is going to a t
13eb0 61 62 6c 65 20 6f 72 20 61 20 6d 65 6d 6f 72 79  able or a memory
13ec0 20 63 65 6c 6c 2e 0a 20 20 2a 2a 20 54 68 65 20   cell..  ** The 
13ed0 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 68 61 76  column names hav
13ee0 65 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 67  e already been g
13ef0 65 6e 65 72 61 74 65 64 20 69 6e 20 74 68 65 20  enerated in the 
13f00 63 61 6c 6c 69 6e 67 20 66 75 6e 63 74 69 6f 6e  calling function
13f10 2e 0a 20 20 2a 2f 0a 20 20 76 20 3d 20 73 71 6c  ..  */.  v = sql
13f20 69 74 65 33 47 65 74 56 64 62 65 28 70 50 61 72  ite3GetVdbe(pPar
13f30 73 65 29 3b 0a 20 20 69 66 28 20 76 3d 3d 30 20  se);.  if( v==0 
13f40 29 20 72 65 74 75 72 6e 20 30 3b 0a 0a 20 20 2f  ) return 0;..  /
13f50 2a 20 49 66 20 74 68 65 20 6f 75 74 70 75 74 20  * If the output 
13f60 69 73 20 64 65 73 74 69 6e 65 64 20 66 6f 72 20  is destined for 
13f70 61 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c  a temporary tabl
13f80 65 2c 20 6f 70 65 6e 20 74 68 61 74 20 74 61 62  e, open that tab
13f90 6c 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 65  le..  */.  if( e
13fa0 44 65 73 74 3d 3d 53 52 54 5f 45 70 68 65 6d 54  Dest==SRT_EphemT
13fb0 61 62 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  ab ){.    sqlite
13fc0 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
13fd0 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 2c 20  _OpenEphemeral, 
13fe0 69 50 61 72 6d 2c 20 31 29 3b 0a 20 20 7d 0a 0a  iParm, 1);.  }..
13ff0 20 20 2f 2a 20 47 65 6e 65 72 61 74 69 6e 67 20    /* Generating 
14000 63 6f 64 65 20 74 6f 20 66 69 6e 64 20 74 68 65  code to find the
14010 20 6d 69 6e 20 6f 72 20 74 68 65 20 6d 61 78 2e   min or the max.
14020 20 20 42 61 73 69 63 61 6c 6c 79 20 61 6c 6c 20    Basically all 
14030 77 65 20 68 61 76 65 0a 20 20 2a 2a 20 74 6f 20  we have.  ** to 
14040 64 6f 20 69 73 20 66 69 6e 64 20 74 68 65 20 66  do is find the f
14050 69 72 73 74 20 6f 72 20 74 68 65 20 6c 61 73 74  irst or the last
14060 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20 63 68   entry in the ch
14070 6f 73 65 6e 20 69 6e 64 65 78 2e 20 20 49 66 0a  osen index.  If.
14080 20 20 2a 2a 20 74 68 65 20 6d 69 6e 28 29 20 6f    ** the min() o
14090 72 20 6d 61 78 28 29 20 69 73 20 6f 6e 20 74 68  r max() is on th
140a0 65 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52  e INTEGER PRIMAR
140b0 59 20 4b 45 59 2c 20 74 68 65 6e 20 66 69 6e 64  Y KEY, then find
140c0 20 74 68 65 20 66 69 72 73 74 0a 20 20 2a 2a 20   the first.  ** 
140d0 6f 72 20 6c 61 73 74 20 65 6e 74 72 79 20 69 6e  or last entry in
140e0 20 74 68 65 20 6d 61 69 6e 20 74 61 62 6c 65 2e   the main table.
140f0 0a 20 20 2a 2f 0a 20 20 69 44 62 20 3d 20 73 71  .  */.  iDb = sq
14100 6c 69 74 65 33 53 63 68 65 6d 61 54 6f 49 6e 64  lite3SchemaToInd
14110 65 78 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70  ex(pParse->db, p
14120 54 61 62 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20  Tab->pSchema);. 
14130 20 61 73 73 65 72 74 28 20 69 44 62 3e 3d 30 20   assert( iDb>=0 
14140 7c 7c 20 70 54 61 62 2d 3e 69 73 45 70 68 65 6d  || pTab->isEphem
14150 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 43 6f 64   );.  sqlite3Cod
14160 65 56 65 72 69 66 79 53 63 68 65 6d 61 28 70 50  eVerifySchema(pP
14170 61 72 73 65 2c 20 69 44 62 29 3b 0a 20 20 73 71  arse, iDb);.  sq
14180 6c 69 74 65 33 54 61 62 6c 65 4c 6f 63 6b 28 70  lite3TableLock(p
14190 50 61 72 73 65 2c 20 69 44 62 2c 20 70 54 61 62  Parse, iDb, pTab
141a0 2d 3e 74 6e 75 6d 2c 20 30 2c 20 70 54 61 62 2d  ->tnum, 0, pTab-
141b0 3e 7a 4e 61 6d 65 29 3b 0a 20 20 62 61 73 65 20  >zName);.  base 
141c0 3d 20 70 53 72 63 2d 3e 61 5b 30 5d 2e 69 43 75  = pSrc->a[0].iCu
141d0 72 73 6f 72 3b 0a 20 20 62 72 6b 20 3d 20 73 71  rsor;.  brk = sq
141e0 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62  lite3VdbeMakeLab
141f0 65 6c 28 76 29 3b 0a 20 20 63 6f 6d 70 75 74 65  el(v);.  compute
14200 4c 69 6d 69 74 52 65 67 69 73 74 65 72 73 28 70  LimitRegisters(p
14210 50 61 72 73 65 2c 20 70 2c 20 62 72 6b 29 3b 0a  Parse, p, brk);.
14220 20 20 69 66 28 20 70 53 72 63 2d 3e 61 5b 30 5d    if( pSrc->a[0]
14230 2e 70 53 65 6c 65 63 74 3d 3d 30 20 29 7b 0a 20  .pSelect==0 ){. 
14240 20 20 20 73 71 6c 69 74 65 33 4f 70 65 6e 54 61     sqlite3OpenTa
14250 62 6c 65 28 70 50 61 72 73 65 2c 20 62 61 73 65  ble(pParse, base
14260 2c 20 69 44 62 2c 20 70 54 61 62 2c 20 4f 50 5f  , iDb, pTab, OP_
14270 4f 70 65 6e 52 65 61 64 29 3b 0a 20 20 7d 0a 20  OpenRead);.  }. 
14280 20 69 66 28 20 70 49 64 78 3d 3d 30 20 29 7b 0a   if( pIdx==0 ){.
14290 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
142a0 64 64 4f 70 28 76 2c 20 73 65 65 6b 4f 70 2c 20  ddOp(v, seekOp, 
142b0 62 61 73 65 2c 20 30 29 3b 0a 20 20 7d 65 6c 73  base, 0);.  }els
142c0 65 7b 0a 20 20 20 20 2f 2a 20 45 76 65 6e 20 74  e{.    /* Even t
142d0 68 6f 75 67 68 20 74 68 65 20 63 75 72 73 6f 72  hough the cursor
142e0 20 75 73 65 64 20 74 6f 20 6f 70 65 6e 20 74 68   used to open th
142f0 65 20 69 6e 64 65 78 20 68 65 72 65 20 69 73 20  e index here is 
14300 63 6c 6f 73 65 64 0a 20 20 20 20 2a 2a 20 61 73  closed.    ** as
14310 20 73 6f 6f 6e 20 61 73 20 61 20 73 69 6e 67 6c   soon as a singl
14320 65 20 76 61 6c 75 65 20 68 61 73 20 62 65 65 6e  e value has been
14330 20 72 65 61 64 20 66 72 6f 6d 20 69 74 2c 20 61   read from it, a
14340 6c 6c 6f 63 61 74 65 20 69 74 0a 20 20 20 20 2a  llocate it.    *
14350 2a 20 75 73 69 6e 67 20 28 70 50 61 72 73 65 2d  * using (pParse-
14360 3e 6e 54 61 62 2b 2b 29 20 74 6f 20 70 72 65 76  >nTab++) to prev
14370 65 6e 74 20 74 68 65 20 63 75 72 73 6f 72 20 69  ent the cursor i
14380 64 20 66 72 6f 6d 20 62 65 69 6e 67 20 0a 20 20  d from being .  
14390 20 20 2a 2a 20 72 65 75 73 65 64 2e 20 54 68 69    ** reused. Thi
143a0 73 20 69 73 20 69 6d 70 6f 72 74 61 6e 74 20 66  s is important f
143b0 6f 72 20 73 74 61 74 65 6d 65 6e 74 73 20 6f 66  or statements of
143c0 20 74 68 65 20 66 6f 72 6d 20 0a 20 20 20 20 2a   the form .    *
143d0 2a 20 22 49 4e 53 45 52 54 20 49 4e 54 4f 20 78  * "INSERT INTO x
143e0 20 53 45 4c 45 43 54 20 6d 61 78 28 29 20 46 52   SELECT max() FR
143f0 4f 4d 20 78 22 2e 0a 20 20 20 20 2a 2f 0a 20 20  OM x"..    */.  
14400 20 20 69 6e 74 20 69 49 64 78 3b 0a 20 20 20 20    int iIdx;.    
14410 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 20 3d 20  KeyInfo *pKey = 
14420 73 71 6c 69 74 65 33 49 6e 64 65 78 4b 65 79 69  sqlite3IndexKeyi
14430 6e 66 6f 28 70 50 61 72 73 65 2c 20 70 49 64 78  nfo(pParse, pIdx
14440 29 3b 0a 20 20 20 20 69 49 64 78 20 3d 20 70 50  );.    iIdx = pP
14450 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20  arse->nTab++;.  
14460 20 20 61 73 73 65 72 74 28 20 70 49 64 78 2d 3e    assert( pIdx->
14470 70 53 63 68 65 6d 61 3d 3d 70 54 61 62 2d 3e 70  pSchema==pTab->p
14480 53 63 68 65 6d 61 20 29 3b 0a 20 20 20 20 73 71  Schema );.    sq
14490 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
144a0 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 69 44  , OP_Integer, iD
144b0 62 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74  b, 0);.    sqlit
144c0 65 33 56 64 62 65 4f 70 33 28 76 2c 20 4f 50 5f  e3VdbeOp3(v, OP_
144d0 4f 70 65 6e 52 65 61 64 2c 20 69 49 64 78 2c 20  OpenRead, iIdx, 
144e0 70 49 64 78 2d 3e 74 6e 75 6d 2c 20 0a 20 20 20  pIdx->tnum, .   
144f0 20 20 20 20 20 28 63 68 61 72 2a 29 70 4b 65 79       (char*)pKey
14500 2c 20 50 33 5f 4b 45 59 49 4e 46 4f 5f 48 41 4e  , P3_KEYINFO_HAN
14510 44 4f 46 46 29 3b 0a 20 20 20 20 69 66 28 20 73  DOFF);.    if( s
14520 65 65 6b 4f 70 3d 3d 4f 50 5f 52 65 77 69 6e 64  eekOp==OP_Rewind
14530 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
14540 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
14550 5f 4e 75 6c 6c 2c 20 30 2c 20 30 29 3b 0a 20 20  _Null, 0, 0);.  
14560 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
14570 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 61 6b 65 52  ddOp(v, OP_MakeR
14580 65 63 6f 72 64 2c 20 31 2c 20 30 29 3b 0a 20 20  ecord, 1, 0);.  
14590 20 20 20 20 73 65 65 6b 4f 70 20 3d 20 4f 50 5f      seekOp = OP_
145a0 4d 6f 76 65 47 74 3b 0a 20 20 20 20 7d 0a 20 20  MoveGt;.    }.  
145b0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
145c0 4f 70 28 76 2c 20 73 65 65 6b 4f 70 2c 20 69 49  Op(v, seekOp, iI
145d0 64 78 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69  dx, 0);.    sqli
145e0 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
145f0 4f 50 5f 49 64 78 52 6f 77 69 64 2c 20 69 49 64  OP_IdxRowid, iId
14600 78 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74  x, 0);.    sqlit
14610 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
14620 50 5f 43 6c 6f 73 65 2c 20 69 49 64 78 2c 20 30  P_Close, iIdx, 0
14630 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
14640 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 6f  beAddOp(v, OP_Mo
14650 76 65 47 65 2c 20 62 61 73 65 2c 20 30 29 3b 0a  veGe, base, 0);.
14660 20 20 7d 0a 20 20 65 4c 69 73 74 2e 6e 45 78 70    }.  eList.nExp
14670 72 20 3d 20 31 3b 0a 20 20 6d 65 6d 73 65 74 28  r = 1;.  memset(
14680 26 65 4c 69 73 74 49 74 65 6d 2c 20 30 2c 20 73  &eListItem, 0, s
14690 69 7a 65 6f 66 28 65 4c 69 73 74 49 74 65 6d 29  izeof(eListItem)
146a0 29 3b 0a 20 20 65 4c 69 73 74 2e 61 20 3d 20 26  );.  eList.a = &
146b0 65 4c 69 73 74 49 74 65 6d 3b 0a 20 20 65 4c 69  eListItem;.  eLi
146c0 73 74 2e 61 5b 30 5d 2e 70 45 78 70 72 20 3d 20  st.a[0].pExpr = 
146d0 70 45 78 70 72 3b 0a 20 20 73 65 6c 65 63 74 49  pExpr;.  selectI
146e0 6e 6e 65 72 4c 6f 6f 70 28 70 50 61 72 73 65 2c  nnerLoop(pParse,
146f0 20 70 2c 20 26 65 4c 69 73 74 2c 20 30 2c 20 30   p, &eList, 0, 0
14700 2c 20 30 2c 20 2d 31 2c 20 65 44 65 73 74 2c 20  , 0, -1, eDest, 
14710 69 50 61 72 6d 2c 20 62 72 6b 2c 20 62 72 6b 2c  iParm, brk, brk,
14720 20 30 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64   0);.  sqlite3Vd
14730 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76  beResolveLabel(v
14740 2c 20 62 72 6b 29 3b 0a 20 20 73 71 6c 69 74 65  , brk);.  sqlite
14750 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
14760 5f 43 6c 6f 73 65 2c 20 62 61 73 65 2c 20 30 29  _Close, base, 0)
14770 3b 0a 20 20 0a 20 20 72 65 74 75 72 6e 20 31 3b  ;.  .  return 1;
14780 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6e 61 6c 79 7a  .}../*.** Analyz
14790 65 20 61 6e 64 20 4f 52 44 45 52 20 42 59 20 6f  e and ORDER BY o
147a0 72 20 47 52 4f 55 50 20 42 59 20 63 6c 61 75 73  r GROUP BY claus
147b0 65 20 69 6e 20 61 20 53 45 4c 45 43 54 20 73 74  e in a SELECT st
147c0 61 74 65 6d 65 6e 74 2e 20 20 52 65 74 75 72 6e  atement.  Return
147d0 0a 2a 2a 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  .** the number o
147e0 66 20 65 72 72 6f 72 73 20 73 65 65 6e 2e 0a 2a  f errors seen..*
147f0 2a 0a 2a 2a 20 41 6e 20 4f 52 44 45 52 20 42 59  *.** An ORDER BY
14800 20 6f 72 20 47 52 4f 55 50 20 42 59 20 69 73 20   or GROUP BY is 
14810 61 20 6c 69 73 74 20 6f 66 20 65 78 70 72 65 73  a list of expres
14820 73 69 6f 6e 73 2e 20 20 49 66 20 61 6e 79 20 65  sions.  If any e
14830 78 70 72 65 73 73 69 6f 6e 0a 2a 2a 20 69 73 20  xpression.** is 
14840 61 6e 20 69 6e 74 65 67 65 72 20 63 6f 6e 73 74  an integer const
14850 61 6e 74 2c 20 74 68 65 6e 20 74 68 61 74 20 65  ant, then that e
14860 78 70 72 65 73 73 69 6f 6e 20 69 73 20 72 65 70  xpression is rep
14870 6c 61 63 65 64 20 62 79 20 74 68 65 0a 2a 2a 20  laced by the.** 
14880 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 65 6e  corresponding en
14890 74 72 79 20 69 6e 20 74 68 65 20 72 65 73 75 6c  try in the resul
148a0 74 20 73 65 74 2e 0a 2a 2f 0a 73 74 61 74 69 63  t set..*/.static
148b0 20 69 6e 74 20 70 72 6f 63 65 73 73 4f 72 64 65   int processOrde
148c0 72 47 72 6f 75 70 42 79 28 0a 20 20 4e 61 6d 65  rGroupBy(.  Name
148d0 43 6f 6e 74 65 78 74 20 2a 70 4e 43 2c 20 20 20  Context *pNC,   
148e0 20 20 2f 2a 20 4e 61 6d 65 20 63 6f 6e 74 65 78    /* Name contex
148f0 74 20 6f 66 20 74 68 65 20 53 45 4c 45 43 54 20  t of the SELECT 
14900 73 74 61 74 65 6d 65 6e 74 2e 20 2a 2f 0a 20 20  statement. */.  
14910 45 78 70 72 4c 69 73 74 20 2a 70 4f 72 64 65 72  ExprList *pOrder
14920 42 79 2c 20 20 20 2f 2a 20 54 68 65 20 4f 52 44  By,   /* The ORD
14930 45 52 20 42 59 20 6f 72 20 47 52 4f 55 50 20 42  ER BY or GROUP B
14940 59 20 63 6c 61 75 73 65 20 74 6f 20 62 65 20 70  Y clause to be p
14950 72 6f 63 65 73 73 65 64 20 2a 2f 0a 20 20 63 6f  rocessed */.  co
14960 6e 73 74 20 63 68 61 72 20 2a 7a 54 79 70 65 20  nst char *zType 
14970 20 20 20 20 2f 2a 20 45 69 74 68 65 72 20 22 4f      /* Either "O
14980 52 44 45 52 22 20 6f 72 20 22 47 52 4f 55 50 22  RDER" or "GROUP"
14990 2c 20 61 73 20 61 70 70 72 6f 70 72 69 61 74 65  , as appropriate
149a0 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 3b 0a   */.){.  int i;.
149b0 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69    ExprList *pELi
149c0 73 74 20 3d 20 70 4e 43 2d 3e 70 45 4c 69 73 74  st = pNC->pEList
149d0 3b 20 20 20 20 20 2f 2a 20 54 68 65 20 72 65 73  ;     /* The res
149e0 75 6c 74 20 73 65 74 20 6f 66 20 74 68 65 20 53  ult set of the S
149f0 45 4c 45 43 54 20 2a 2f 0a 20 20 50 61 72 73 65  ELECT */.  Parse
14a00 20 2a 70 50 61 72 73 65 20 3d 20 70 4e 43 2d 3e   *pParse = pNC->
14a10 70 50 61 72 73 65 3b 20 20 20 20 20 2f 2a 20 54  pParse;     /* T
14a20 68 65 20 72 65 73 75 6c 74 20 73 65 74 20 6f 66  he result set of
14a30 20 74 68 65 20 53 45 4c 45 43 54 20 2a 2f 0a 20   the SELECT */. 
14a40 20 61 73 73 65 72 74 28 20 70 45 4c 69 73 74 20   assert( pEList 
14a50 29 3b 0a 0a 20 20 69 66 28 20 70 4f 72 64 65 72  );..  if( pOrder
14a60 42 79 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30  By==0 ) return 0
14a70 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70  ;.  for(i=0; i<p
14a80 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 3b 20  OrderBy->nExpr; 
14a90 69 2b 2b 29 7b 0a 20 20 20 20 69 6e 74 20 69 43  i++){.    int iC
14aa0 6f 6c 3b 0a 20 20 20 20 45 78 70 72 20 2a 70 45  ol;.    Expr *pE
14ab0 20 3d 20 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69   = pOrderBy->a[i
14ac0 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 69 66 28  ].pExpr;.    if(
14ad0 20 73 71 6c 69 74 65 33 45 78 70 72 49 73 49 6e   sqlite3ExprIsIn
14ae0 74 65 67 65 72 28 70 45 2c 20 26 69 43 6f 6c 29  teger(pE, &iCol)
14af0 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 69 43   ){.      if( iC
14b00 6f 6c 3e 30 20 26 26 20 69 43 6f 6c 3c 3d 70 45  ol>0 && iCol<=pE
14b10 4c 69 73 74 2d 3e 6e 45 78 70 72 20 29 7b 0a 20  List->nExpr ){. 
14b20 20 20 20 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a         CollSeq *
14b30 70 43 6f 6c 6c 20 3d 20 70 45 2d 3e 70 43 6f 6c  pColl = pE->pCol
14b40 6c 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 66  l;.        int f
14b50 6c 61 67 73 20 3d 20 70 45 2d 3e 66 6c 61 67 73  lags = pE->flags
14b60 20 26 20 45 50 5f 45 78 70 43 6f 6c 6c 61 74 65   & EP_ExpCollate
14b70 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
14b80 33 45 78 70 72 44 65 6c 65 74 65 28 70 45 29 3b  3ExprDelete(pE);
14b90 0a 20 20 20 20 20 20 20 20 70 45 20 3d 20 70 4f  .        pE = pO
14ba0 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 70 45 78  rderBy->a[i].pEx
14bb0 70 72 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  pr = sqlite3Expr
14bc0 44 75 70 28 70 45 4c 69 73 74 2d 3e 61 5b 69 43  Dup(pEList->a[iC
14bd0 6f 6c 2d 31 5d 2e 70 45 78 70 72 29 3b 0a 20 20  ol-1].pExpr);.  
14be0 20 20 20 20 20 20 69 66 28 20 70 43 6f 6c 6c 20        if( pColl 
14bf0 26 26 20 66 6c 61 67 73 20 29 7b 0a 20 20 20 20  && flags ){.    
14c00 20 20 20 20 20 20 70 45 2d 3e 70 43 6f 6c 6c 20        pE->pColl 
14c10 3d 20 70 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 20  = pColl;.       
14c20 20 20 20 70 45 2d 3e 66 6c 61 67 73 20 7c 3d 20     pE->flags |= 
14c30 66 6c 61 67 73 3b 0a 20 20 20 20 20 20 20 20 7d  flags;.        }
14c40 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
14c50 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72        sqlite3Err
14c60 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 0a 20  orMsg(pParse, . 
14c70 20 20 20 20 20 20 20 20 20 20 22 25 73 20 42 59            "%s BY
14c80 20 63 6f 6c 75 6d 6e 20 6e 75 6d 62 65 72 20 25   column number %
14c90 64 20 6f 75 74 20 6f 66 20 72 61 6e 67 65 20 2d  d out of range -
14ca0 20 73 68 6f 75 6c 64 20 62 65 20 22 0a 20 20 20   should be ".   
14cb0 20 20 20 20 20 20 20 20 22 62 65 74 77 65 65 6e          "between
14cc0 20 31 20 61 6e 64 20 25 64 22 2c 20 7a 54 79 70   1 and %d", zTyp
14cd0 65 2c 20 69 43 6f 6c 2c 20 70 45 4c 69 73 74 2d  e, iCol, pEList-
14ce0 3e 6e 45 78 70 72 29 3b 0a 20 20 20 20 20 20 20  >nExpr);.       
14cf0 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 20   return 1;.     
14d00 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28   }.    }.    if(
14d10 20 73 71 6c 69 74 65 33 45 78 70 72 52 65 73 6f   sqlite3ExprReso
14d20 6c 76 65 4e 61 6d 65 73 28 70 4e 43 2c 20 70 45  lveNames(pNC, pE
14d30 29 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  ) ){.      retur
14d40 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  n 1;.    }.  }. 
14d50 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a   return 0;.}../*
14d60 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
14d70 20 72 65 73 6f 6c 76 65 73 20 61 6e 79 20 6e 61   resolves any na
14d80 6d 65 73 20 75 73 65 64 20 69 6e 20 74 68 65 20  mes used in the 
14d90 72 65 73 75 6c 74 20 73 65 74 20 6f 66 20 74 68  result set of th
14da0 65 0a 2a 2a 20 73 75 70 70 6c 69 65 64 20 53 45  e.** supplied SE
14db0 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 2e 20  LECT statement. 
14dc0 49 66 20 74 68 65 20 53 45 4c 45 43 54 20 73 74  If the SELECT st
14dd0 61 74 65 6d 65 6e 74 20 62 65 69 6e 67 20 72 65  atement being re
14de0 73 6f 6c 76 65 64 0a 2a 2a 20 69 73 20 61 20 73  solved.** is a s
14df0 75 62 2d 73 65 6c 65 63 74 2c 20 74 68 65 6e 20  ub-select, then 
14e00 70 4f 75 74 65 72 4e 43 20 69 73 20 61 20 70 6f  pOuterNC is a po
14e10 69 6e 74 65 72 20 74 6f 20 74 68 65 20 4e 61 6d  inter to the Nam
14e20 65 43 6f 6e 74 65 78 74 20 0a 2a 2a 20 6f 66 20  eContext .** of 
14e30 74 68 65 20 70 61 72 65 6e 74 20 53 45 4c 45 43  the parent SELEC
14e40 54 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  T..*/.int sqlite
14e50 33 53 65 6c 65 63 74 52 65 73 6f 6c 76 65 28 0a  3SelectResolve(.
14e60 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
14e70 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
14e80 70 61 72 73 65 72 20 63 6f 6e 74 65 78 74 20 2a  parser context *
14e90 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 2c 20 20  /.  Select *p,  
14ea0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
14eb0 65 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  e SELECT stateme
14ec0 6e 74 20 62 65 69 6e 67 20 63 6f 64 65 64 2e 20  nt being coded. 
14ed0 2a 2f 0a 20 20 4e 61 6d 65 43 6f 6e 74 65 78 74  */.  NameContext
14ee0 20 2a 70 4f 75 74 65 72 4e 43 20 20 2f 2a 20 54   *pOuterNC  /* T
14ef0 68 65 20 6f 75 74 65 72 20 6e 61 6d 65 20 63 6f  he outer name co
14f00 6e 74 65 78 74 2e 20 4d 61 79 20 62 65 20 4e 55  ntext. May be NU
14f10 4c 4c 2e 20 2a 2f 0a 29 7b 0a 20 20 45 78 70 72  LL. */.){.  Expr
14f20 4c 69 73 74 20 2a 70 45 4c 69 73 74 3b 20 20 20  List *pEList;   
14f30 20 20 20 20 20 20 20 2f 2a 20 52 65 73 75 6c 74         /* Result
14f40 20 73 65 74 2e 20 2a 2f 0a 20 20 69 6e 74 20 69   set. */.  int i
14f50 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
14f60 20 20 20 20 20 20 2f 2a 20 46 6f 72 2d 6c 6f 6f        /* For-loo
14f70 70 20 76 61 72 69 61 62 6c 65 20 75 73 65 64 20  p variable used 
14f80 69 6e 20 6d 75 6c 74 69 70 6c 65 20 70 6c 61 63  in multiple plac
14f90 65 73 20 2a 2f 0a 20 20 4e 61 6d 65 43 6f 6e 74  es */.  NameCont
14fa0 65 78 74 20 73 4e 43 3b 20 20 20 20 20 20 20 20  ext sNC;        
14fb0 20 20 20 2f 2a 20 4c 6f 63 61 6c 20 6e 61 6d 65     /* Local name
14fc0 2d 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78  -context */.  Ex
14fd0 70 72 4c 69 73 74 20 2a 70 47 72 6f 75 70 42 79  prList *pGroupBy
14fe0 3b 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20  ;        /* The 
14ff0 67 72 6f 75 70 20 62 79 20 63 6c 61 75 73 65 20  group by clause 
15000 2a 2f 0a 0a 20 20 2f 2a 20 49 66 20 74 68 69 73  */..  /* If this
15010 20 72 6f 75 74 69 6e 65 20 68 61 73 20 72 75 6e   routine has run
15020 20 62 65 66 6f 72 65 2c 20 72 65 74 75 72 6e 20   before, return 
15030 69 6d 6d 65 64 69 61 74 65 6c 79 2e 20 2a 2f 0a  immediately. */.
15040 20 20 69 66 28 20 70 2d 3e 69 73 52 65 73 6f 6c    if( p->isResol
15050 76 65 64 20 29 7b 0a 20 20 20 20 61 73 73 65 72  ved ){.    asser
15060 74 28 20 21 70 4f 75 74 65 72 4e 43 20 29 3b 0a  t( !pOuterNC );.
15070 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
15080 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 70 2d 3e 69  E_OK;.  }.  p->i
15090 73 52 65 73 6f 6c 76 65 64 20 3d 20 31 3b 0a 0a  sResolved = 1;..
150a0 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20 68 61    /* If there ha
150b0 76 65 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20  ve already been 
150c0 65 72 72 6f 72 73 2c 20 64 6f 20 6e 6f 74 68 69  errors, do nothi
150d0 6e 67 2e 20 2a 2f 0a 20 20 69 66 28 20 70 50 61  ng. */.  if( pPa
150e0 72 73 65 2d 3e 6e 45 72 72 3e 30 20 29 7b 0a 20  rse->nErr>0 ){. 
150f0 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
15100 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 2f  _ERROR;.  }..  /
15110 2a 20 50 72 65 70 61 72 65 20 74 68 65 20 73 65  * Prepare the se
15120 6c 65 63 74 20 73 74 61 74 65 6d 65 6e 74 2e 20  lect statement. 
15130 54 68 69 73 20 63 61 6c 6c 20 77 69 6c 6c 20 61  This call will a
15140 6c 6c 6f 63 61 74 65 20 61 6c 6c 20 63 75 72 73  llocate all curs
15150 6f 72 73 0a 20 20 2a 2a 20 72 65 71 75 69 72 65  ors.  ** require
15160 64 20 74 6f 20 68 61 6e 64 6c 65 20 74 68 65 20  d to handle the 
15170 74 61 62 6c 65 73 20 61 6e 64 20 73 75 62 71 75  tables and subqu
15180 65 72 69 65 73 20 69 6e 20 74 68 65 20 46 52 4f  eries in the FRO
15190 4d 20 63 6c 61 75 73 65 2e 0a 20 20 2a 2f 0a 20  M clause..  */. 
151a0 20 69 66 28 20 70 72 65 70 53 65 6c 65 63 74 53   if( prepSelectS
151b0 74 6d 74 28 70 50 61 72 73 65 2c 20 70 29 20 29  tmt(pParse, p) )
151c0 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
151d0 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a  ITE_ERROR;.  }..
151e0 20 20 2f 2a 20 52 65 73 6f 6c 76 65 20 74 68 65    /* Resolve the
151f0 20 65 78 70 72 65 73 73 69 6f 6e 73 20 69 6e 20   expressions in 
15200 74 68 65 20 4c 49 4d 49 54 20 61 6e 64 20 4f 46  the LIMIT and OF
15210 46 53 45 54 20 63 6c 61 75 73 65 73 2e 20 54 68  FSET clauses. Th
15220 65 73 65 0a 20 20 2a 2a 20 61 72 65 20 6e 6f 74  ese.  ** are not
15230 20 61 6c 6c 6f 77 65 64 20 74 6f 20 72 65 66 65   allowed to refe
15240 72 20 74 6f 20 61 6e 79 20 6e 61 6d 65 73 2c 20  r to any names, 
15250 73 6f 20 70 61 73 73 20 61 6e 20 65 6d 70 74 79  so pass an empty
15260 20 4e 61 6d 65 43 6f 6e 74 65 78 74 2e 0a 20 20   NameContext..  
15270 2a 2f 0a 20 20 6d 65 6d 73 65 74 28 26 73 4e 43  */.  memset(&sNC
15280 2c 20 30 2c 20 73 69 7a 65 6f 66 28 73 4e 43 29  , 0, sizeof(sNC)
15290 29 3b 0a 20 20 73 4e 43 2e 70 50 61 72 73 65 20  );.  sNC.pParse 
152a0 3d 20 70 50 61 72 73 65 3b 0a 20 20 69 66 28 20  = pParse;.  if( 
152b0 73 71 6c 69 74 65 33 45 78 70 72 52 65 73 6f 6c  sqlite3ExprResol
152c0 76 65 4e 61 6d 65 73 28 26 73 4e 43 2c 20 70 2d  veNames(&sNC, p-
152d0 3e 70 4c 69 6d 69 74 29 20 7c 7c 0a 20 20 20 20  >pLimit) ||.    
152e0 20 20 73 71 6c 69 74 65 33 45 78 70 72 52 65 73    sqlite3ExprRes
152f0 6f 6c 76 65 4e 61 6d 65 73 28 26 73 4e 43 2c 20  olveNames(&sNC, 
15300 70 2d 3e 70 4f 66 66 73 65 74 29 20 29 7b 0a 20  p->pOffset) ){. 
15310 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
15320 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 2f  _ERROR;.  }..  /
15330 2a 20 53 65 74 20 75 70 20 74 68 65 20 6c 6f 63  * Set up the loc
15340 61 6c 20 6e 61 6d 65 2d 63 6f 6e 74 65 78 74 20  al name-context 
15350 74 6f 20 70 61 73 73 20 74 6f 20 45 78 70 72 52  to pass to ExprR
15360 65 73 6f 6c 76 65 4e 61 6d 65 73 28 29 20 74 6f  esolveNames() to
15370 0a 20 20 2a 2a 20 72 65 73 6f 6c 76 65 20 74 68  .  ** resolve th
15380 65 20 65 78 70 72 65 73 73 69 6f 6e 2d 6c 69 73  e expression-lis
15390 74 2e 0a 20 20 2a 2f 0a 20 20 73 4e 43 2e 61 6c  t..  */.  sNC.al
153a0 6c 6f 77 41 67 67 20 3d 20 31 3b 0a 20 20 73 4e  lowAgg = 1;.  sN
153b0 43 2e 70 53 72 63 4c 69 73 74 20 3d 20 70 2d 3e  C.pSrcList = p->
153c0 70 53 72 63 3b 0a 20 20 73 4e 43 2e 70 4e 65 78  pSrc;.  sNC.pNex
153d0 74 20 3d 20 70 4f 75 74 65 72 4e 43 3b 0a 0a 20  t = pOuterNC;.. 
153e0 20 2f 2a 20 52 65 73 6f 6c 76 65 20 6e 61 6d 65   /* Resolve name
153f0 73 20 69 6e 20 74 68 65 20 72 65 73 75 6c 74 20  s in the result 
15400 73 65 74 2e 20 2a 2f 0a 20 20 70 45 4c 69 73 74  set. */.  pEList
15410 20 3d 20 70 2d 3e 70 45 4c 69 73 74 3b 0a 20 20   = p->pEList;.  
15420 69 66 28 20 21 70 45 4c 69 73 74 20 29 20 72 65  if( !pEList ) re
15430 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f  turn SQLITE_ERRO
15440 52 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  R;.  for(i=0; i<
15450 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69  pEList->nExpr; i
15460 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72 20 2a 70  ++){.    Expr *p
15470 58 20 3d 20 70 45 4c 69 73 74 2d 3e 61 5b 69 5d  X = pEList->a[i]
15480 2e 70 45 78 70 72 3b 0a 20 20 20 20 69 66 28 20  .pExpr;.    if( 
15490 73 71 6c 69 74 65 33 45 78 70 72 52 65 73 6f 6c  sqlite3ExprResol
154a0 76 65 4e 61 6d 65 73 28 26 73 4e 43 2c 20 70 58  veNames(&sNC, pX
154b0 29 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  ) ){.      retur
154c0 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a  n SQLITE_ERROR;.
154d0 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
154e0 49 66 20 74 68 65 72 65 20 61 72 65 20 6e 6f 20  If there are no 
154f0 61 67 67 72 65 67 61 74 65 20 66 75 6e 63 74 69  aggregate functi
15500 6f 6e 73 20 69 6e 20 74 68 65 20 72 65 73 75 6c  ons in the resul
15510 74 2d 73 65 74 2c 20 61 6e 64 20 6e 6f 20 47 52  t-set, and no GR
15520 4f 55 50 20 42 59 20 0a 20 20 2a 2a 20 65 78 70  OUP BY .  ** exp
15530 72 65 73 73 69 6f 6e 2c 20 64 6f 20 6e 6f 74 20  ression, do not 
15540 61 6c 6c 6f 77 20 61 67 67 72 65 67 61 74 65 73  allow aggregates
15550 20 69 6e 20 61 6e 79 20 6f 66 20 74 68 65 20 6f   in any of the o
15560 74 68 65 72 20 65 78 70 72 65 73 73 69 6f 6e 73  ther expressions
15570 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  ..  */.  assert(
15580 20 21 70 2d 3e 69 73 41 67 67 20 29 3b 0a 20 20   !p->isAgg );.  
15590 70 47 72 6f 75 70 42 79 20 3d 20 70 2d 3e 70 47  pGroupBy = p->pG
155a0 72 6f 75 70 42 79 3b 0a 20 20 69 66 28 20 70 47  roupBy;.  if( pG
155b0 72 6f 75 70 42 79 20 7c 7c 20 73 4e 43 2e 68 61  roupBy || sNC.ha
155c0 73 41 67 67 20 29 7b 0a 20 20 20 20 70 2d 3e 69  sAgg ){.    p->i
155d0 73 41 67 67 20 3d 20 31 3b 0a 20 20 7d 65 6c 73  sAgg = 1;.  }els
155e0 65 7b 0a 20 20 20 20 73 4e 43 2e 61 6c 6c 6f 77  e{.    sNC.allow
155f0 41 67 67 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20  Agg = 0;.  }..  
15600 2f 2a 20 49 66 20 61 20 48 41 56 49 4e 47 20 63  /* If a HAVING c
15610 6c 61 75 73 65 20 69 73 20 70 72 65 73 65 6e 74  lause is present
15620 2c 20 74 68 65 6e 20 74 68 65 72 65 20 6d 75 73  , then there mus
15630 74 20 62 65 20 61 20 47 52 4f 55 50 20 42 59 20  t be a GROUP BY 
15640 63 6c 61 75 73 65 2e 0a 20 20 2a 2f 0a 20 20 69  clause..  */.  i
15650 66 28 20 70 2d 3e 70 48 61 76 69 6e 67 20 26 26  f( p->pHaving &&
15660 20 21 70 47 72 6f 75 70 42 79 20 29 7b 0a 20 20   !pGroupBy ){.  
15670 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
15680 67 28 70 50 61 72 73 65 2c 20 22 61 20 47 52 4f  g(pParse, "a GRO
15690 55 50 20 42 59 20 63 6c 61 75 73 65 20 69 73 20  UP BY clause is 
156a0 72 65 71 75 69 72 65 64 20 62 65 66 6f 72 65 20  required before 
156b0 48 41 56 49 4e 47 22 29 3b 0a 20 20 20 20 72 65  HAVING");.    re
156c0 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f  turn SQLITE_ERRO
156d0 52 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 64 64  R;.  }..  /* Add
156e0 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   the expression 
156f0 6c 69 73 74 20 74 6f 20 74 68 65 20 6e 61 6d 65  list to the name
15700 2d 63 6f 6e 74 65 78 74 20 62 65 66 6f 72 65 20  -context before 
15710 70 61 72 73 69 6e 67 20 74 68 65 0a 20 20 2a 2a  parsing the.  **
15720 20 6f 74 68 65 72 20 65 78 70 72 65 73 73 69 6f   other expressio
15730 6e 73 20 69 6e 20 74 68 65 20 53 45 4c 45 43 54  ns in the SELECT
15740 20 73 74 61 74 65 6d 65 6e 74 2e 20 54 68 69 73   statement. This
15750 20 69 73 20 73 6f 20 74 68 61 74 0a 20 20 2a 2a   is so that.  **
15760 20 65 78 70 72 65 73 73 69 6f 6e 73 20 69 6e 20   expressions in 
15770 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  the WHERE clause
15780 20 28 65 74 63 2e 29 20 63 61 6e 20 72 65 66 65   (etc.) can refe
15790 72 20 74 6f 20 65 78 70 72 65 73 73 69 6f 6e 73  r to expressions
157a0 20 62 79 0a 20 20 2a 2a 20 61 6c 69 61 73 65 73   by.  ** aliases
157b0 20 69 6e 20 74 68 65 20 72 65 73 75 6c 74 20 73   in the result s
157c0 65 74 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 4d 69  et..  **.  ** Mi
157d0 6e 6f 72 20 70 6f 69 6e 74 3a 20 49 66 20 74 68  nor point: If th
157e0 69 73 20 69 73 20 74 68 65 20 63 61 73 65 2c 20  is is the case, 
157f0 74 68 65 6e 20 74 68 65 20 65 78 70 72 65 73 73  then the express
15800 69 6f 6e 20 77 69 6c 6c 20 62 65 0a 20 20 2a 2a  ion will be.  **
15810 20 72 65 2d 65 76 61 6c 75 61 74 65 64 20 66 6f   re-evaluated fo
15820 72 20 65 61 63 68 20 72 65 66 65 72 65 6e 63 65  r each reference
15830 20 74 6f 20 69 74 2e 0a 20 20 2a 2f 0a 20 20 73   to it..  */.  s
15840 4e 43 2e 70 45 4c 69 73 74 20 3d 20 70 2d 3e 70  NC.pEList = p->p
15850 45 4c 69 73 74 3b 0a 20 20 69 66 28 20 73 71 6c  EList;.  if( sql
15860 69 74 65 33 45 78 70 72 52 65 73 6f 6c 76 65 4e  ite3ExprResolveN
15870 61 6d 65 73 28 26 73 4e 43 2c 20 70 2d 3e 70 57  ames(&sNC, p->pW
15880 68 65 72 65 29 20 7c 7c 0a 20 20 20 20 20 73 71  here) ||.     sq
15890 6c 69 74 65 33 45 78 70 72 52 65 73 6f 6c 76 65  lite3ExprResolve
158a0 4e 61 6d 65 73 28 26 73 4e 43 2c 20 70 2d 3e 70  Names(&sNC, p->p
158b0 48 61 76 69 6e 67 29 20 29 7b 0a 20 20 20 20 72  Having) ){.    r
158c0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52  eturn SQLITE_ERR
158d0 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d  OR;.  }.  if( p-
158e0 3e 70 50 72 69 6f 72 3d 3d 30 20 29 7b 0a 20 20  >pPrior==0 ){.  
158f0 20 20 69 66 28 20 70 72 6f 63 65 73 73 4f 72 64    if( processOrd
15900 65 72 47 72 6f 75 70 42 79 28 26 73 4e 43 2c 20  erGroupBy(&sNC, 
15910 70 2d 3e 70 4f 72 64 65 72 42 79 2c 20 22 4f 52  p->pOrderBy, "OR
15920 44 45 52 22 29 20 7c 7c 0a 20 20 20 20 20 20 20  DER") ||.       
15930 20 70 72 6f 63 65 73 73 4f 72 64 65 72 47 72 6f   processOrderGro
15940 75 70 42 79 28 26 73 4e 43 2c 20 70 47 72 6f 75  upBy(&sNC, pGrou
15950 70 42 79 2c 20 22 47 52 4f 55 50 22 29 20 29 7b  pBy, "GROUP") ){
15960 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
15970 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20  LITE_ERROR;.    
15980 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61 6b 65  }.  }..  /* Make
15990 20 73 75 72 65 20 74 68 65 20 47 52 4f 55 50 20   sure the GROUP 
159a0 42 59 20 63 6c 61 75 73 65 20 64 6f 65 73 20 6e  BY clause does n
159b0 6f 74 20 63 6f 6e 74 61 69 6e 20 61 67 67 72 65  ot contain aggre
159c0 67 61 74 65 20 66 75 6e 63 74 69 6f 6e 73 2e 0a  gate functions..
159d0 20 20 2a 2f 0a 20 20 69 66 28 20 70 47 72 6f 75    */.  if( pGrou
159e0 70 42 79 20 29 7b 0a 20 20 20 20 73 74 72 75 63  pBy ){.    struc
159f0 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20  t ExprList_item 
15a00 2a 70 49 74 65 6d 3b 0a 20 20 0a 20 20 20 20 66  *pItem;.  .    f
15a10 6f 72 28 69 3d 30 2c 20 70 49 74 65 6d 3d 70 47  or(i=0, pItem=pG
15a20 72 6f 75 70 42 79 2d 3e 61 3b 20 69 3c 70 47 72  roupBy->a; i<pGr
15a30 6f 75 70 42 79 2d 3e 6e 45 78 70 72 3b 20 69 2b  oupBy->nExpr; i+
15a40 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20  +, pItem++){.   
15a50 20 20 20 69 66 28 20 45 78 70 72 48 61 73 50 72     if( ExprHasPr
15a60 6f 70 65 72 74 79 28 70 49 74 65 6d 2d 3e 70 45  operty(pItem->pE
15a70 78 70 72 2c 20 45 50 5f 41 67 67 29 20 29 7b 0a  xpr, EP_Agg) ){.
15a80 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
15a90 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
15aa0 22 61 67 67 72 65 67 61 74 65 20 66 75 6e 63 74  "aggregate funct
15ab0 69 6f 6e 73 20 61 72 65 20 6e 6f 74 20 61 6c 6c  ions are not all
15ac0 6f 77 65 64 20 69 6e 20 22 0a 20 20 20 20 20 20  owed in ".      
15ad0 20 20 20 20 20 20 22 74 68 65 20 47 52 4f 55 50        "the GROUP
15ae0 20 42 59 20 63 6c 61 75 73 65 22 29 3b 0a 20 20   BY clause");.  
15af0 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
15b00 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20  ITE_ERROR;.     
15b10 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20   }.    }.  }..  
15b20 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20 6f 6e  /* If this is on
15b30 65 20 53 45 4c 45 43 54 20 6f 66 20 61 20 63 6f  e SELECT of a co
15b40 6d 70 6f 75 6e 64 2c 20 62 65 20 73 75 72 65 20  mpound, be sure 
15b50 74 6f 20 72 65 73 6f 6c 76 65 20 6e 61 6d 65 73  to resolve names
15b60 0a 20 20 2a 2a 20 69 6e 20 74 68 65 20 6f 74 68  .  ** in the oth
15b70 65 72 20 53 45 4c 45 43 54 73 2e 0a 20 20 2a 2f  er SELECTs..  */
15b80 0a 20 20 69 66 28 20 70 2d 3e 70 50 72 69 6f 72  .  if( p->pPrior
15b90 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 73   ){.    return s
15ba0 71 6c 69 74 65 33 53 65 6c 65 63 74 52 65 73 6f  qlite3SelectReso
15bb0 6c 76 65 28 70 50 61 72 73 65 2c 20 70 2d 3e 70  lve(pParse, p->p
15bc0 50 72 69 6f 72 2c 20 70 4f 75 74 65 72 4e 43 29  Prior, pOuterNC)
15bd0 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72  ;.  }else{.    r
15be0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
15bf0 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  .  }.}../*.** Re
15c00 73 65 74 20 74 68 65 20 61 67 67 72 65 67 61 74  set the aggregat
15c10 65 20 61 63 63 75 6d 75 6c 61 74 6f 72 2e 0a 2a  e accumulator..*
15c20 2a 0a 2a 2a 20 54 68 65 20 61 67 67 72 65 67 61  *.** The aggrega
15c30 74 65 20 61 63 63 75 6d 75 6c 61 74 6f 72 20 69  te accumulator i
15c40 73 20 61 20 73 65 74 20 6f 66 20 6d 65 6d 6f 72  s a set of memor
15c50 79 20 63 65 6c 6c 73 20 74 68 61 74 20 68 6f 6c  y cells that hol
15c60 64 0a 2a 2a 20 69 6e 74 65 72 6d 65 64 69 61 74  d.** intermediat
15c70 65 20 72 65 73 75 6c 74 73 20 77 68 69 6c 65 20  e results while 
15c80 63 61 6c 63 75 6c 61 74 69 6e 67 20 61 6e 20 61  calculating an a
15c90 67 67 72 65 67 61 74 65 2e 20 20 54 68 69 73 0a  ggregate.  This.
15ca0 2a 2a 20 72 6f 75 74 69 6e 65 20 73 69 6d 70 6c  ** routine simpl
15cb0 79 20 73 74 6f 72 65 73 20 4e 55 4c 4c 73 20 69  y stores NULLs i
15cc0 6e 20 61 6c 6c 20 6f 66 20 74 68 6f 73 65 20 6d  n all of those m
15cd0 65 6d 6f 72 79 20 63 65 6c 6c 73 2e 0a 2a 2f 0a  emory cells..*/.
15ce0 73 74 61 74 69 63 20 76 6f 69 64 20 72 65 73 65  static void rese
15cf0 74 41 63 63 75 6d 75 6c 61 74 6f 72 28 50 61 72  tAccumulator(Par
15d00 73 65 20 2a 70 50 61 72 73 65 2c 20 41 67 67 49  se *pParse, AggI
15d10 6e 66 6f 20 2a 70 41 67 67 49 6e 66 6f 29 7b 0a  nfo *pAggInfo){.
15d20 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72    Vdbe *v = pPar
15d30 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74  se->pVdbe;.  int
15d40 20 69 3b 0a 20 20 73 74 72 75 63 74 20 41 67 67   i;.  struct Agg
15d50 49 6e 66 6f 5f 66 75 6e 63 20 2a 70 46 75 6e 63  Info_func *pFunc
15d60 3b 0a 20 20 69 66 28 20 70 41 67 67 49 6e 66 6f  ;.  if( pAggInfo
15d70 2d 3e 6e 46 75 6e 63 2b 70 41 67 67 49 6e 66 6f  ->nFunc+pAggInfo
15d80 2d 3e 6e 43 6f 6c 75 6d 6e 3d 3d 30 20 29 7b 0a  ->nColumn==0 ){.
15d90 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a      return;.  }.
15da0 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 41 67    for(i=0; i<pAg
15db0 67 49 6e 66 6f 2d 3e 6e 43 6f 6c 75 6d 6e 3b 20  gInfo->nColumn; 
15dc0 69 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  i++){.    sqlite
15dd0 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
15de0 5f 4d 65 6d 4e 75 6c 6c 2c 20 70 41 67 67 49 6e  _MemNull, pAggIn
15df0 66 6f 2d 3e 61 43 6f 6c 5b 69 5d 2e 69 4d 65 6d  fo->aCol[i].iMem
15e00 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 66 6f 72 28  , 0);.  }.  for(
15e10 70 46 75 6e 63 3d 70 41 67 67 49 6e 66 6f 2d 3e  pFunc=pAggInfo->
15e20 61 46 75 6e 63 2c 20 69 3d 30 3b 20 69 3c 70 41  aFunc, i=0; i<pA
15e30 67 67 49 6e 66 6f 2d 3e 6e 46 75 6e 63 3b 20 69  ggInfo->nFunc; i
15e40 2b 2b 2c 20 70 46 75 6e 63 2b 2b 29 7b 0a 20 20  ++, pFunc++){.  
15e50 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
15e60 4f 70 28 76 2c 20 4f 50 5f 4d 65 6d 4e 75 6c 6c  Op(v, OP_MemNull
15e70 2c 20 70 46 75 6e 63 2d 3e 69 4d 65 6d 2c 20 30  , pFunc->iMem, 0
15e80 29 3b 0a 20 20 20 20 69 66 28 20 70 46 75 6e 63  );.    if( pFunc
15e90 2d 3e 69 44 69 73 74 69 6e 63 74 3e 3d 30 20 29  ->iDistinct>=0 )
15ea0 7b 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 45  {.      Expr *pE
15eb0 20 3d 20 70 46 75 6e 63 2d 3e 70 45 78 70 72 3b   = pFunc->pExpr;
15ec0 0a 20 20 20 20 20 20 69 66 28 20 70 45 2d 3e 70  .      if( pE->p
15ed0 4c 69 73 74 3d 3d 30 20 7c 7c 20 70 45 2d 3e 70  List==0 || pE->p
15ee0 4c 69 73 74 2d 3e 6e 45 78 70 72 21 3d 31 20 29  List->nExpr!=1 )
15ef0 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
15f00 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
15f10 2c 20 22 44 49 53 54 49 4e 43 54 20 69 6e 20 61  , "DISTINCT in a
15f20 67 67 72 65 67 61 74 65 20 6d 75 73 74 20 62 65  ggregate must be
15f30 20 66 6f 6c 6c 6f 77 65 64 20 22 0a 20 20 20 20   followed ".    
15f40 20 20 20 20 20 20 20 22 62 79 20 61 6e 20 65 78         "by an ex
15f50 70 72 65 73 73 69 6f 6e 22 29 3b 0a 20 20 20 20  pression");.    
15f60 20 20 20 20 70 46 75 6e 63 2d 3e 69 44 69 73 74      pFunc->iDist
15f70 69 6e 63 74 20 3d 20 2d 31 3b 0a 20 20 20 20 20  inct = -1;.     
15f80 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
15f90 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66  KeyInfo *pKeyInf
15fa0 6f 20 3d 20 6b 65 79 49 6e 66 6f 46 72 6f 6d 45  o = keyInfoFromE
15fb0 78 70 72 4c 69 73 74 28 70 50 61 72 73 65 2c 20  xprList(pParse, 
15fc0 70 45 2d 3e 70 4c 69 73 74 29 3b 0a 20 20 20 20  pE->pList);.    
15fd0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4f      sqlite3VdbeO
15fe0 70 33 28 76 2c 20 4f 50 5f 4f 70 65 6e 45 70 68  p3(v, OP_OpenEph
15ff0 65 6d 65 72 61 6c 2c 20 70 46 75 6e 63 2d 3e 69  emeral, pFunc->i
16000 44 69 73 74 69 6e 63 74 2c 20 30 2c 20 0a 20 20  Distinct, 0, .  
16010 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16020 20 20 20 20 20 20 20 20 28 63 68 61 72 2a 29 70          (char*)p
16030 4b 65 79 49 6e 66 6f 2c 20 50 33 5f 4b 45 59 49  KeyInfo, P3_KEYI
16040 4e 46 4f 5f 48 41 4e 44 4f 46 46 29 3b 0a 20 20  NFO_HANDOFF);.  
16050 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
16060 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 76 6f 6b 65 20  }../*.** Invoke 
16070 74 68 65 20 4f 50 5f 41 67 67 46 69 6e 61 6c 69  the OP_AggFinali
16080 7a 65 20 6f 70 63 6f 64 65 20 66 6f 72 20 65 76  ze opcode for ev
16090 65 72 79 20 61 67 67 72 65 67 61 74 65 20 66 75  ery aggregate fu
160a0 6e 63 74 69 6f 6e 0a 2a 2a 20 69 6e 20 74 68 65  nction.** in the
160b0 20 41 67 67 49 6e 66 6f 20 73 74 72 75 63 74 75   AggInfo structu
160c0 72 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  re..*/.static vo
160d0 69 64 20 66 69 6e 61 6c 69 7a 65 41 67 67 46 75  id finalizeAggFu
160e0 6e 63 74 69 6f 6e 73 28 50 61 72 73 65 20 2a 70  nctions(Parse *p
160f0 50 61 72 73 65 2c 20 41 67 67 49 6e 66 6f 20 2a  Parse, AggInfo *
16100 70 41 67 67 49 6e 66 6f 29 7b 0a 20 20 56 64 62  pAggInfo){.  Vdb
16110 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70  e *v = pParse->p
16120 56 64 62 65 3b 0a 20 20 69 6e 74 20 69 3b 0a 20  Vdbe;.  int i;. 
16130 20 73 74 72 75 63 74 20 41 67 67 49 6e 66 6f 5f   struct AggInfo_
16140 66 75 6e 63 20 2a 70 46 3b 0a 20 20 66 6f 72 28  func *pF;.  for(
16150 69 3d 30 2c 20 70 46 3d 70 41 67 67 49 6e 66 6f  i=0, pF=pAggInfo
16160 2d 3e 61 46 75 6e 63 3b 20 69 3c 70 41 67 67 49  ->aFunc; i<pAggI
16170 6e 66 6f 2d 3e 6e 46 75 6e 63 3b 20 69 2b 2b 2c  nfo->nFunc; i++,
16180 20 70 46 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72   pF++){.    Expr
16190 4c 69 73 74 20 2a 70 4c 69 73 74 20 3d 20 70 46  List *pList = pF
161a0 2d 3e 70 45 78 70 72 2d 3e 70 4c 69 73 74 3b 0a  ->pExpr->pList;.
161b0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4f      sqlite3VdbeO
161c0 70 33 28 76 2c 20 4f 50 5f 41 67 67 46 69 6e 61  p3(v, OP_AggFina
161d0 6c 2c 20 70 46 2d 3e 69 4d 65 6d 2c 20 70 4c 69  l, pF->iMem, pLi
161e0 73 74 20 3f 20 70 4c 69 73 74 2d 3e 6e 45 78 70  st ? pList->nExp
161f0 72 20 3a 20 30 2c 0a 20 20 20 20 20 20 20 20 20  r : 0,.         
16200 20 20 20 20 20 20 20 20 20 20 20 20 20 28 76 6f               (vo
16210 69 64 2a 29 70 46 2d 3e 70 46 75 6e 63 2c 20 50  id*)pF->pFunc, P
16220 33 5f 46 55 4e 43 44 45 46 29 3b 0a 20 20 7d 0a  3_FUNCDEF);.  }.
16230 7d 0a 0a 2f 2a 0a 2a 2a 20 55 70 64 61 74 65 20  }../*.** Update 
16240 74 68 65 20 61 63 63 75 6d 75 6c 61 74 6f 72 20  the accumulator 
16250 6d 65 6d 6f 72 79 20 63 65 6c 6c 73 20 66 6f 72  memory cells for
16260 20 61 6e 20 61 67 67 72 65 67 61 74 65 20 62 61   an aggregate ba
16270 73 65 64 20 6f 6e 0a 2a 2a 20 74 68 65 20 63 75  sed on.** the cu
16280 72 72 65 6e 74 20 63 75 72 73 6f 72 20 70 6f 73  rrent cursor pos
16290 69 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63  ition..*/.static
162a0 20 76 6f 69 64 20 75 70 64 61 74 65 41 63 63 75   void updateAccu
162b0 6d 75 6c 61 74 6f 72 28 50 61 72 73 65 20 2a 70  mulator(Parse *p
162c0 50 61 72 73 65 2c 20 41 67 67 49 6e 66 6f 20 2a  Parse, AggInfo *
162d0 70 41 67 67 49 6e 66 6f 29 7b 0a 20 20 56 64 62  pAggInfo){.  Vdb
162e0 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70  e *v = pParse->p
162f0 56 64 62 65 3b 0a 20 20 69 6e 74 20 69 3b 0a 20  Vdbe;.  int i;. 
16300 20 73 74 72 75 63 74 20 41 67 67 49 6e 66 6f 5f   struct AggInfo_
16310 66 75 6e 63 20 2a 70 46 3b 0a 20 20 73 74 72 75  func *pF;.  stru
16320 63 74 20 41 67 67 49 6e 66 6f 5f 63 6f 6c 20 2a  ct AggInfo_col *
16330 70 43 3b 0a 0a 20 20 70 41 67 67 49 6e 66 6f 2d  pC;..  pAggInfo-
16340 3e 64 69 72 65 63 74 4d 6f 64 65 20 3d 20 31 3b  >directMode = 1;
16350 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70 46 3d 70  .  for(i=0, pF=p
16360 41 67 67 49 6e 66 6f 2d 3e 61 46 75 6e 63 3b 20  AggInfo->aFunc; 
16370 69 3c 70 41 67 67 49 6e 66 6f 2d 3e 6e 46 75 6e  i<pAggInfo->nFun
16380 63 3b 20 69 2b 2b 2c 20 70 46 2b 2b 29 7b 0a 20  c; i++, pF++){. 
16390 20 20 20 69 6e 74 20 6e 41 72 67 3b 0a 20 20 20     int nArg;.   
163a0 20 69 6e 74 20 61 64 64 72 4e 65 78 74 20 3d 20   int addrNext = 
163b0 30 3b 0a 20 20 20 20 45 78 70 72 4c 69 73 74 20  0;.    ExprList 
163c0 2a 70 4c 69 73 74 20 3d 20 70 46 2d 3e 70 45 78  *pList = pF->pEx
163d0 70 72 2d 3e 70 4c 69 73 74 3b 0a 20 20 20 20 69  pr->pList;.    i
163e0 66 28 20 70 4c 69 73 74 20 29 7b 0a 20 20 20 20  f( pList ){.    
163f0 20 20 6e 41 72 67 20 3d 20 70 4c 69 73 74 2d 3e    nArg = pList->
16400 6e 45 78 70 72 3b 0a 20 20 20 20 20 20 73 71 6c  nExpr;.      sql
16410 69 74 65 33 45 78 70 72 43 6f 64 65 45 78 70 72  ite3ExprCodeExpr
16420 4c 69 73 74 28 70 50 61 72 73 65 2c 20 70 4c 69  List(pParse, pLi
16430 73 74 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  st);.    }else{.
16440 20 20 20 20 20 20 6e 41 72 67 20 3d 20 30 3b 0a        nArg = 0;.
16450 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 46      }.    if( pF
16460 2d 3e 69 44 69 73 74 69 6e 63 74 3e 3d 30 20 29  ->iDistinct>=0 )
16470 7b 0a 20 20 20 20 20 20 61 64 64 72 4e 65 78 74  {.      addrNext
16480 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61   = sqlite3VdbeMa
16490 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20  keLabel(v);.    
164a0 20 20 61 73 73 65 72 74 28 20 6e 41 72 67 3d 3d    assert( nArg==
164b0 31 20 29 3b 0a 20 20 20 20 20 20 63 6f 64 65 44  1 );.      codeD
164c0 69 73 74 69 6e 63 74 28 76 2c 20 70 46 2d 3e 69  istinct(v, pF->i
164d0 44 69 73 74 69 6e 63 74 2c 20 61 64 64 72 4e 65  Distinct, addrNe
164e0 78 74 2c 20 31 29 3b 0a 20 20 20 20 7d 0a 20 20  xt, 1);.    }.  
164f0 20 20 69 66 28 20 70 46 2d 3e 70 46 75 6e 63 2d    if( pF->pFunc-
16500 3e 6e 65 65 64 43 6f 6c 6c 53 65 71 20 29 7b 0a  >needCollSeq ){.
16510 20 20 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a 70        CollSeq *p
16520 43 6f 6c 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20  Coll = 0;.      
16530 73 74 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f  struct ExprList_
16540 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 20  item *pItem;.   
16550 20 20 20 69 6e 74 20 6a 3b 0a 20 20 20 20 20 20     int j;.      
16560 61 73 73 65 72 74 28 20 70 4c 69 73 74 21 3d 30  assert( pList!=0
16570 20 29 3b 20 20 2f 2a 20 70 4c 69 73 74 21 3d 30   );  /* pList!=0
16580 20 69 66 20 70 46 2d 3e 70 46 75 6e 63 2d 3e 6e   if pF->pFunc->n
16590 65 65 64 43 6f 6c 6c 53 65 71 20 69 73 20 74 72  eedCollSeq is tr
165a0 75 65 20 2a 2f 0a 20 20 20 20 20 20 66 6f 72 28  ue */.      for(
165b0 6a 3d 30 2c 20 70 49 74 65 6d 3d 70 4c 69 73 74  j=0, pItem=pList
165c0 2d 3e 61 3b 20 21 70 43 6f 6c 6c 20 26 26 20 6a  ->a; !pColl && j
165d0 3c 6e 41 72 67 3b 20 6a 2b 2b 2c 20 70 49 74 65  <nArg; j++, pIte
165e0 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 70 43  m++){.        pC
165f0 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 45 78 70  oll = sqlite3Exp
16600 72 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c  rCollSeq(pParse,
16610 20 70 49 74 65 6d 2d 3e 70 45 78 70 72 29 3b 0a   pItem->pExpr);.
16620 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
16630 28 20 21 70 43 6f 6c 6c 20 29 7b 0a 20 20 20 20  ( !pColl ){.    
16640 20 20 20 20 70 43 6f 6c 6c 20 3d 20 70 50 61 72      pColl = pPar
16650 73 65 2d 3e 64 62 2d 3e 70 44 66 6c 74 43 6f 6c  se->db->pDfltCol
16660 6c 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  l;.      }.     
16670 20 73 71 6c 69 74 65 33 56 64 62 65 4f 70 33 28   sqlite3VdbeOp3(
16680 76 2c 20 4f 50 5f 43 6f 6c 6c 53 65 71 2c 20 30  v, OP_CollSeq, 0
16690 2c 20 30 2c 20 28 63 68 61 72 20 2a 29 70 43 6f  , 0, (char *)pCo
166a0 6c 6c 2c 20 50 33 5f 43 4f 4c 4c 53 45 51 29 3b  ll, P3_COLLSEQ);
166b0 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
166c0 65 33 56 64 62 65 4f 70 33 28 76 2c 20 4f 50 5f  e3VdbeOp3(v, OP_
166d0 41 67 67 53 74 65 70 2c 20 70 46 2d 3e 69 4d 65  AggStep, pF->iMe
166e0 6d 2c 20 6e 41 72 67 2c 20 28 76 6f 69 64 2a 29  m, nArg, (void*)
166f0 70 46 2d 3e 70 46 75 6e 63 2c 20 50 33 5f 46 55  pF->pFunc, P3_FU
16700 4e 43 44 45 46 29 3b 0a 20 20 20 20 69 66 28 20  NCDEF);.    if( 
16710 61 64 64 72 4e 65 78 74 20 29 7b 0a 20 20 20 20  addrNext ){.    
16720 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73    sqlite3VdbeRes
16730 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 61 64 64  olveLabel(v, add
16740 72 4e 65 78 74 29 3b 0a 20 20 20 20 7d 0a 20 20  rNext);.    }.  
16750 7d 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70 43 3d  }.  for(i=0, pC=
16760 70 41 67 67 49 6e 66 6f 2d 3e 61 43 6f 6c 3b 20  pAggInfo->aCol; 
16770 69 3c 70 41 67 67 49 6e 66 6f 2d 3e 6e 41 63 63  i<pAggInfo->nAcc
16780 75 6d 75 6c 61 74 6f 72 3b 20 69 2b 2b 2c 20 70  umulator; i++, p
16790 43 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  C++){.    sqlite
167a0 33 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65  3ExprCode(pParse
167b0 2c 20 70 43 2d 3e 70 45 78 70 72 29 3b 0a 20 20  , pC->pExpr);.  
167c0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
167d0 4f 70 28 76 2c 20 4f 50 5f 4d 65 6d 53 74 6f 72  Op(v, OP_MemStor
167e0 65 2c 20 70 43 2d 3e 69 4d 65 6d 2c 20 31 29 3b  e, pC->iMem, 1);
167f0 0a 20 20 7d 0a 20 20 70 41 67 67 49 6e 66 6f 2d  .  }.  pAggInfo-
16800 3e 64 69 72 65 63 74 4d 6f 64 65 20 3d 20 30 3b  >directMode = 0;
16810 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72  .}.../*.** Gener
16820 61 74 65 20 63 6f 64 65 20 66 6f 72 20 74 68 65  ate code for the
16830 20 67 69 76 65 6e 20 53 45 4c 45 43 54 20 73 74   given SELECT st
16840 61 74 65 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 54  atement..**.** T
16850 68 65 20 72 65 73 75 6c 74 73 20 61 72 65 20 64  he results are d
16860 69 73 74 72 69 62 75 74 65 64 20 69 6e 20 76 61  istributed in va
16870 72 69 6f 75 73 20 77 61 79 73 20 64 65 70 65 6e  rious ways depen
16880 64 69 6e 67 20 6f 6e 20 74 68 65 0a 2a 2a 20 76  ding on the.** v
16890 61 6c 75 65 20 6f 66 20 65 44 65 73 74 20 61 6e  alue of eDest an
168a0 64 20 69 50 61 72 6d 2e 0a 2a 2a 0a 2a 2a 20 20  d iParm..**.**  
168b0 20 20 20 65 44 65 73 74 20 56 61 6c 75 65 20 20     eDest Value  
168c0 20 20 20 20 20 52 65 73 75 6c 74 0a 2a 2a 20 20       Result.**  
168d0 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 20     ------------ 
168e0 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d     -------------
168f0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
16900 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a  --------------.*
16910 2a 20 20 20 20 20 53 52 54 5f 43 61 6c 6c 62 61  *     SRT_Callba
16920 63 6b 20 20 20 20 49 6e 76 6f 6b 65 20 74 68 65  ck    Invoke the
16930 20 63 61 6c 6c 62 61 63 6b 20 66 6f 72 20 65 61   callback for ea
16940 63 68 20 72 6f 77 20 6f 66 20 74 68 65 20 72 65  ch row of the re
16950 73 75 6c 74 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20  sult..**.**     
16960 53 52 54 5f 4d 65 6d 20 20 20 20 20 20 20 20 20  SRT_Mem         
16970 53 74 6f 72 65 20 66 69 72 73 74 20 72 65 73 75  Store first resu
16980 6c 74 20 69 6e 20 6d 65 6d 6f 72 79 20 63 65 6c  lt in memory cel
16990 6c 20 69 50 61 72 6d 0a 2a 2a 0a 2a 2a 20 20 20  l iParm.**.**   
169a0 20 20 53 52 54 5f 53 65 74 20 20 20 20 20 20 20    SRT_Set       
169b0 20 20 53 74 6f 72 65 20 72 65 73 75 6c 74 73 20    Store results 
169c0 61 73 20 6b 65 79 73 20 6f 66 20 74 61 62 6c 65  as keys of table
169d0 20 69 50 61 72 6d 2e 0a 2a 2a 0a 2a 2a 20 20 20   iParm..**.**   
169e0 20 20 53 52 54 5f 55 6e 69 6f 6e 20 20 20 20 20    SRT_Union     
169f0 20 20 53 74 6f 72 65 20 72 65 73 75 6c 74 73 20    Store results 
16a00 61 73 20 61 20 6b 65 79 20 69 6e 20 61 20 74 65  as a key in a te
16a10 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20 69 50  mporary table iP
16a20 61 72 6d 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 52  arm.**.**     SR
16a30 54 5f 45 78 63 65 70 74 20 20 20 20 20 20 52 65  T_Except      Re
16a40 6d 6f 76 65 20 72 65 73 75 6c 74 73 20 66 72 6f  move results fro
16a50 6d 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79 20  m the temporary 
16a60 74 61 62 6c 65 20 69 50 61 72 6d 2e 0a 2a 2a 0a  table iParm..**.
16a70 2a 2a 20 20 20 20 20 53 52 54 5f 54 61 62 6c 65  **     SRT_Table
16a80 20 20 20 20 20 20 20 53 74 6f 72 65 20 72 65 73         Store res
16a90 75 6c 74 73 20 69 6e 20 74 65 6d 70 6f 72 61 72  ults in temporar
16aa0 79 20 74 61 62 6c 65 20 69 50 61 72 6d 0a 2a 2a  y table iParm.**
16ab0 0a 2a 2a 20 54 68 65 20 74 61 62 6c 65 20 61 62  .** The table ab
16ac0 6f 76 65 20 69 73 20 69 6e 63 6f 6d 70 6c 65 74  ove is incomplet
16ad0 65 2e 20 20 41 64 64 69 74 69 6f 6e 61 6c 20 65  e.  Additional e
16ae0 44 69 73 74 20 76 61 6c 75 65 20 68 61 76 65 20  Dist value have 
16af0 62 65 20 61 64 64 65 64 0a 2a 2a 20 73 69 6e 63  be added.** sinc
16b00 65 20 74 68 69 73 20 63 6f 6d 6d 65 6e 74 20 77  e this comment w
16b10 61 73 20 77 72 69 74 74 65 6e 2e 20 20 53 65 65  as written.  See
16b20 20 74 68 65 20 73 65 6c 65 63 74 49 6e 6e 65 72   the selectInner
16b30 4c 6f 6f 70 28 29 20 66 75 6e 63 74 69 6f 6e 20  Loop() function 
16b40 66 6f 72 0a 2a 2a 20 61 20 63 6f 6d 70 6c 65 74  for.** a complet
16b50 65 20 6c 69 73 74 69 6e 67 20 6f 66 20 74 68 65  e listing of the
16b60 20 61 6c 6c 6f 77 65 64 20 76 61 6c 75 65 73 20   allowed values 
16b70 6f 66 20 65 44 65 73 74 20 61 6e 64 20 74 68 65  of eDest and the
16b80 69 72 20 6d 65 61 6e 69 6e 67 73 2e 0a 2a 2a 0a  ir meanings..**.
16b90 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
16ba0 72 65 74 75 72 6e 73 20 74 68 65 20 6e 75 6d 62  returns the numb
16bb0 65 72 20 6f 66 20 65 72 72 6f 72 73 2e 20 20 49  er of errors.  I
16bc0 66 20 61 6e 79 20 65 72 72 6f 72 73 20 61 72 65  f any errors are
16bd0 0a 2a 2a 20 65 6e 63 6f 75 6e 74 65 72 65 64 2c  .** encountered,
16be0 20 74 68 65 6e 20 61 6e 20 61 70 70 72 6f 70 72   then an appropr
16bf0 69 61 74 65 20 65 72 72 6f 72 20 6d 65 73 73 61  iate error messa
16c00 67 65 20 69 73 20 6c 65 66 74 20 69 6e 0a 2a 2a  ge is left in.**
16c10 20 70 50 61 72 73 65 2d 3e 7a 45 72 72 4d 73 67   pParse->zErrMsg
16c20 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
16c30 74 69 6e 65 20 64 6f 65 73 20 4e 4f 54 20 66 72  tine does NOT fr
16c40 65 65 20 74 68 65 20 53 65 6c 65 63 74 20 73 74  ee the Select st
16c50 72 75 63 74 75 72 65 20 70 61 73 73 65 64 20 69  ructure passed i
16c60 6e 2e 20 20 54 68 65 0a 2a 2a 20 63 61 6c 6c 69  n.  The.** calli
16c70 6e 67 20 66 75 6e 63 74 69 6f 6e 20 6e 65 65 64  ng function need
16c80 73 20 74 6f 20 64 6f 20 74 68 61 74 2e 0a 2a 2a  s to do that..**
16c90 0a 2a 2a 20 54 68 65 20 70 50 61 72 65 6e 74 2c  .** The pParent,
16ca0 20 70 61 72 65 6e 74 54 61 62 2c 20 61 6e 64 20   parentTab, and 
16cb0 2a 70 50 61 72 65 6e 74 41 67 67 20 66 69 65 6c  *pParentAgg fiel
16cc0 64 73 20 61 72 65 20 66 69 6c 6c 65 64 20 69 6e  ds are filled in
16cd0 20 69 66 20 74 68 69 73 0a 2a 2a 20 53 45 4c 45   if this.** SELE
16ce0 43 54 20 69 73 20 61 20 73 75 62 71 75 65 72 79  CT is a subquery
16cf0 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  .  This routine 
16d00 6d 61 79 20 74 72 79 20 74 6f 20 63 6f 6d 62 69  may try to combi
16d10 6e 65 20 74 68 69 73 20 53 45 4c 45 43 54 0a 2a  ne this SELECT.*
16d20 2a 20 77 69 74 68 20 69 74 73 20 70 61 72 65 6e  * with its paren
16d30 74 20 74 6f 20 66 6f 72 6d 20 61 20 73 69 6e 67  t to form a sing
16d40 6c 65 20 66 6c 61 74 20 71 75 65 72 79 2e 20 20  le flat query.  
16d50 49 6e 20 73 6f 20 64 6f 69 6e 67 2c 20 69 74 20  In so doing, it 
16d60 6d 69 67 68 74 0a 2a 2a 20 63 68 61 6e 67 65 20  might.** change 
16d70 74 68 65 20 70 61 72 65 6e 74 20 71 75 65 72 79  the parent query
16d80 20 66 72 6f 6d 20 61 20 6e 6f 6e 2d 61 67 67 72   from a non-aggr
16d90 65 67 61 74 65 20 74 6f 20 61 6e 20 61 67 67 72  egate to an aggr
16da0 65 67 61 74 65 20 71 75 65 72 79 2e 0a 2a 2a 20  egate query..** 
16db0 46 6f 72 20 74 68 61 74 20 72 65 61 73 6f 6e 2c  For that reason,
16dc0 20 74 68 65 20 70 50 61 72 65 6e 74 41 67 67 20   the pParentAgg 
16dd0 66 6c 61 67 20 69 73 20 70 61 73 73 65 64 20 61  flag is passed a
16de0 73 20 61 20 70 6f 69 6e 74 65 72 2c 20 73 6f 20  s a pointer, so 
16df0 69 74 0a 2a 2a 20 63 61 6e 20 62 65 20 63 68 61  it.** can be cha
16e00 6e 67 65 64 2e 0a 2a 2a 0a 2a 2a 20 45 78 61 6d  nged..**.** Exam
16e10 70 6c 65 20 31 3a 20 20 20 54 68 65 20 6d 65 61  ple 1:   The mea
16e20 6e 69 6e 67 20 6f 66 20 74 68 65 20 70 50 61 72  ning of the pPar
16e30 65 6e 74 20 70 61 72 61 6d 65 74 65 72 2e 0a 2a  ent parameter..*
16e40 2a 0a 2a 2a 20 20 20 20 53 45 4c 45 43 54 20 2a  *.**    SELECT *
16e50 20 46 52 4f 4d 20 74 31 20 4a 4f 49 4e 20 28 53   FROM t1 JOIN (S
16e60 45 4c 45 43 54 20 78 2c 20 63 6f 75 6e 74 28 2a  ELECT x, count(*
16e70 29 20 46 52 4f 4d 20 74 32 29 20 4a 4f 49 4e 20  ) FROM t2) JOIN 
16e80 74 33 3b 0a 2a 2a 20 20 20 20 5c 20 20 20 20 20  t3;.**    \     
16e90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16ea0 20 5c 5f 5f 5f 5f 5f 5f 5f 20 73 75 62 71 75 65   \_______ subque
16eb0 72 79 20 5f 5f 5f 5f 5f 5f 5f 2f 20 20 20 20 20  ry _______/     
16ec0 20 20 20 2f 0a 2a 2a 20 20 20 20 20 5c 20 20 20     /.**     \   
16ed0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16ee0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16ef0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16f00 20 20 20 2f 0a 2a 2a 20 20 20 20 20 20 5c 5f 5f     /.**      \__
16f10 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f  ________________
16f20 5f 5f 20 6f 75 74 65 72 20 71 75 65 72 79 20 5f  __ outer query _
16f30 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f  ________________
16f40 5f 5f 2f 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  __/.**.** This r
16f50 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64  outine is called
16f60 20 66 6f 72 20 74 68 65 20 6f 75 74 65 72 20 71   for the outer q
16f70 75 65 72 79 20 66 69 72 73 74 2e 20 20 20 46 6f  uery first.   Fo
16f80 72 20 74 68 61 74 20 63 61 6c 6c 2c 0a 2a 2a 20  r that call,.** 
16f90 70 50 61 72 65 6e 74 20 77 69 6c 6c 20 62 65 20  pParent will be 
16fa0 4e 55 4c 4c 2e 20 20 44 75 72 69 6e 67 20 74 68  NULL.  During th
16fb0 65 20 70 72 6f 63 65 73 73 69 6e 67 20 6f 66 20  e processing of 
16fc0 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 2c  the outer query,
16fd0 20 74 68 69 73 20 0a 2a 2a 20 72 6f 75 74 69 6e   this .** routin
16fe0 65 20 69 73 20 63 61 6c 6c 65 64 20 72 65 63 75  e is called recu
16ff0 72 73 69 76 65 6c 79 20 74 6f 20 68 61 6e 64 6c  rsively to handl
17000 65 20 74 68 65 20 73 75 62 71 75 65 72 79 2e 20  e the subquery. 
17010 20 46 6f 72 20 74 68 65 20 72 65 63 75 72 73 69   For the recursi
17020 76 65 0a 2a 2a 20 63 61 6c 6c 2c 20 70 50 61 72  ve.** call, pPar
17030 65 6e 74 20 77 69 6c 6c 20 70 6f 69 6e 74 20 74  ent will point t
17040 6f 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72  o the outer quer
17050 79 2e 20 20 42 65 63 61 75 73 65 20 74 68 65 20  y.  Because the 
17060 73 75 62 71 75 65 72 79 20 69 73 0a 2a 2a 20 74  subquery is.** t
17070 68 65 20 73 65 63 6f 6e 64 20 65 6c 65 6d 65 6e  he second elemen
17080 74 20 69 6e 20 61 20 74 68 72 65 65 2d 77 61 79  t in a three-way
17090 20 6a 6f 69 6e 2c 20 74 68 65 20 70 61 72 65 6e   join, the paren
170a0 74 54 61 62 20 70 61 72 61 6d 65 74 65 72 20 77  tTab parameter w
170b0 69 6c 6c 0a 2a 2a 20 62 65 20 31 20 28 74 68 65  ill.** be 1 (the
170c0 20 32 6e 64 20 76 61 6c 75 65 20 6f 66 20 61 20   2nd value of a 
170d0 30 2d 69 6e 64 65 78 65 64 20 61 72 72 61 79 2e  0-indexed array.
170e0 29 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ).*/.int sqlite3
170f0 53 65 6c 65 63 74 28 0a 20 20 50 61 72 73 65 20  Select(.  Parse 
17100 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20  *pParse,        
17110 20 2f 2a 20 54 68 65 20 70 61 72 73 65 72 20 63   /* The parser c
17120 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53 65 6c 65  ontext */.  Sele
17130 63 74 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20  ct *p,          
17140 20 20 20 2f 2a 20 54 68 65 20 53 45 4c 45 43 54     /* The SELECT
17150 20 73 74 61 74 65 6d 65 6e 74 20 62 65 69 6e 67   statement being
17160 20 63 6f 64 65 64 2e 20 2a 2f 0a 20 20 69 6e 74   coded. */.  int
17170 20 65 44 65 73 74 2c 20 20 20 20 20 20 20 20 20   eDest,         
17180 20 20 20 20 2f 2a 20 48 6f 77 20 74 6f 20 64 69      /* How to di
17190 73 70 6f 73 65 20 6f 66 20 74 68 65 20 72 65 73  spose of the res
171a0 75 6c 74 73 20 2a 2f 0a 20 20 69 6e 74 20 69 50  ults */.  int iP
171b0 61 72 6d 2c 20 20 20 20 20 20 20 20 20 20 20 20  arm,            
171c0 20 2f 2a 20 41 20 70 61 72 61 6d 65 74 65 72 20   /* A parameter 
171d0 75 73 65 64 20 62 79 20 74 68 65 20 65 44 65 73  used by the eDes
171e0 74 20 64 69 73 70 6f 73 61 6c 20 6d 65 74 68 6f  t disposal metho
171f0 64 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70  d */.  Select *p
17200 50 61 72 65 6e 74 2c 20 20 20 20 20 20 20 2f 2a  Parent,       /*
17210 20 41 6e 6f 74 68 65 72 20 53 45 4c 45 43 54 20   Another SELECT 
17220 66 6f 72 20 77 68 69 63 68 20 74 68 69 73 20 69  for which this i
17230 73 20 61 20 73 75 62 2d 71 75 65 72 79 20 2a 2f  s a sub-query */
17240 0a 20 20 69 6e 74 20 70 61 72 65 6e 74 54 61 62  .  int parentTab
17250 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64  ,         /* Ind
17260 65 78 20 69 6e 20 70 50 61 72 65 6e 74 2d 3e 70  ex in pParent->p
17270 53 72 63 20 6f 66 20 74 68 69 73 20 71 75 65 72  Src of this quer
17280 79 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 50 61 72  y */.  int *pPar
17290 65 6e 74 41 67 67 2c 20 20 20 20 20 20 20 2f 2a  entAgg,       /*
172a0 20 54 72 75 65 20 69 66 20 70 50 61 72 65 6e 74   True if pParent
172b0 20 75 73 65 73 20 61 67 67 72 65 67 61 74 65 20   uses aggregate 
172c0 66 75 6e 63 74 69 6f 6e 73 20 2a 2f 0a 20 20 63  functions */.  c
172d0 68 61 72 20 2a 61 66 66 20 20 20 20 20 20 20 20  har *aff        
172e0 20 20 20 20 20 20 2f 2a 20 49 66 20 65 44 65 73        /* If eDes
172f0 74 20 69 73 20 53 52 54 5f 55 6e 69 6f 6e 2c 20  t is SRT_Union, 
17300 74 68 65 20 61 66 66 69 6e 69 74 79 20 73 74 72  the affinity str
17310 69 6e 67 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  ing */.){.  int 
17320 69 2c 20 6a 3b 20 20 20 20 20 20 20 20 20 20 20  i, j;           
17330 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74     /* Loop count
17340 65 72 73 20 2a 2f 0a 20 20 57 68 65 72 65 49 6e  ers */.  WhereIn
17350 66 6f 20 2a 70 57 49 6e 66 6f 3b 20 20 20 20 20  fo *pWInfo;     
17360 2f 2a 20 52 65 74 75 72 6e 20 66 72 6f 6d 20 73  /* Return from s
17370 71 6c 69 74 65 33 57 68 65 72 65 42 65 67 69 6e  qlite3WhereBegin
17380 28 29 20 2a 2f 0a 20 20 56 64 62 65 20 2a 76 3b  () */.  Vdbe *v;
17390 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
173a0 2a 20 54 68 65 20 76 69 72 74 75 61 6c 20 6d 61  * The virtual ma
173b0 63 68 69 6e 65 20 75 6e 64 65 72 20 63 6f 6e 73  chine under cons
173c0 74 72 75 63 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e  truction */.  in
173d0 74 20 69 73 41 67 67 3b 20 20 20 20 20 20 20 20  t isAgg;        
173e0 20 20 20 20 20 2f 2a 20 54 72 75 65 20 66 6f 72       /* True for
173f0 20 73 65 6c 65 63 74 20 6c 69 73 74 73 20 6c 69   select lists li
17400 6b 65 20 22 63 6f 75 6e 74 28 2a 29 22 20 2a 2f  ke "count(*)" */
17410 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c  .  ExprList *pEL
17420 69 73 74 3b 20 20 20 20 20 20 2f 2a 20 4c 69 73  ist;      /* Lis
17430 74 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 74 6f 20  t of columns to 
17440 65 78 74 72 61 63 74 2e 20 2a 2f 0a 20 20 53 72  extract. */.  Sr
17450 63 4c 69 73 74 20 2a 70 54 61 62 4c 69 73 74 3b  cList *pTabList;
17460 20 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20       /* List of 
17470 74 61 62 6c 65 73 20 74 6f 20 73 65 6c 65 63 74  tables to select
17480 20 66 72 6f 6d 20 2a 2f 0a 20 20 45 78 70 72 20   from */.  Expr 
17490 2a 70 57 68 65 72 65 3b 20 20 20 20 20 20 20 20  *pWhere;        
174a0 20 20 2f 2a 20 54 68 65 20 57 48 45 52 45 20 63    /* The WHERE c
174b0 6c 61 75 73 65 2e 20 20 4d 61 79 20 62 65 20 4e  lause.  May be N
174c0 55 4c 4c 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73  ULL */.  ExprLis
174d0 74 20 2a 70 4f 72 64 65 72 42 79 3b 20 20 20 20  t *pOrderBy;    
174e0 2f 2a 20 54 68 65 20 4f 52 44 45 52 20 42 59 20  /* The ORDER BY 
174f0 63 6c 61 75 73 65 2e 20 20 4d 61 79 20 62 65 20  clause.  May be 
17500 4e 55 4c 4c 20 2a 2f 0a 20 20 45 78 70 72 4c 69  NULL */.  ExprLi
17510 73 74 20 2a 70 47 72 6f 75 70 42 79 3b 20 20 20  st *pGroupBy;   
17520 20 2f 2a 20 54 68 65 20 47 52 4f 55 50 20 42 59   /* The GROUP BY
17530 20 63 6c 61 75 73 65 2e 20 20 4d 61 79 20 62 65   clause.  May be
17540 20 4e 55 4c 4c 20 2a 2f 0a 20 20 45 78 70 72 20   NULL */.  Expr 
17550 2a 70 48 61 76 69 6e 67 3b 20 20 20 20 20 20 20  *pHaving;       
17560 20 20 2f 2a 20 54 68 65 20 48 41 56 49 4e 47 20    /* The HAVING 
17570 63 6c 61 75 73 65 2e 20 20 4d 61 79 20 62 65 20  clause.  May be 
17580 4e 55 4c 4c 20 2a 2f 0a 20 20 69 6e 74 20 69 73  NULL */.  int is
17590 44 69 73 74 69 6e 63 74 3b 20 20 20 20 20 20 20  Distinct;       
175a0 20 2f 2a 20 54 72 75 65 20 69 66 20 74 68 65 20   /* True if the 
175b0 44 49 53 54 49 4e 43 54 20 6b 65 79 77 6f 72 64  DISTINCT keyword
175c0 20 69 73 20 70 72 65 73 65 6e 74 20 2a 2f 0a 20   is present */. 
175d0 20 69 6e 74 20 64 69 73 74 69 6e 63 74 3b 20 20   int distinct;  
175e0 20 20 20 20 20 20 20 20 2f 2a 20 54 61 62 6c 65          /* Table
175f0 20 74 6f 20 75 73 65 20 66 6f 72 20 74 68 65 20   to use for the 
17600 64 69 73 74 69 6e 63 74 20 73 65 74 20 2a 2f 0a  distinct set */.
17610 20 20 69 6e 74 20 72 63 20 3d 20 31 3b 20 20 20    int rc = 1;   
17620 20 20 20 20 20 20 20 20 20 2f 2a 20 56 61 6c 75           /* Valu
17630 65 20 74 6f 20 72 65 74 75 72 6e 20 66 72 6f 6d  e to return from
17640 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 2a   this function *
17650 2f 0a 20 20 69 6e 74 20 61 64 64 72 53 6f 72 74  /.  int addrSort
17660 49 6e 64 65 78 3b 20 20 20 20 20 2f 2a 20 41 64  Index;     /* Ad
17670 64 72 65 73 73 20 6f 66 20 61 6e 20 4f 50 5f 4f  dress of an OP_O
17680 70 65 6e 45 70 68 65 6d 65 72 61 6c 20 69 6e 73  penEphemeral ins
17690 74 72 75 63 74 69 6f 6e 20 2a 2f 0a 20 20 41 67  truction */.  Ag
176a0 67 49 6e 66 6f 20 73 41 67 67 49 6e 66 6f 3b 20  gInfo sAggInfo; 
176b0 20 20 20 20 20 2f 2a 20 49 6e 66 6f 72 6d 61 74       /* Informat
176c0 69 6f 6e 20 75 73 65 64 20 62 79 20 61 67 67 72  ion used by aggr
176d0 65 67 61 74 65 20 71 75 65 72 69 65 73 20 2a 2f  egate queries */
176e0 0a 20 20 69 6e 74 20 69 45 6e 64 3b 20 20 20 20  .  int iEnd;    
176f0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64            /* Add
17700 72 65 73 73 20 6f 66 20 74 68 65 20 65 6e 64 20  ress of the end 
17710 6f 66 20 74 68 65 20 71 75 65 72 79 20 2a 2f 0a  of the query */.
17720 0a 20 20 69 66 28 20 70 3d 3d 30 20 7c 7c 20 73  .  if( p==0 || s
17730 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 46 61 69 6c  qlite3MallocFail
17740 65 64 28 29 20 7c 7c 20 70 50 61 72 73 65 2d 3e  ed() || pParse->
17750 6e 45 72 72 20 29 7b 0a 20 20 20 20 72 65 74 75  nErr ){.    retu
17760 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 69 66 28 20  rn 1;.  }.  if( 
17770 73 71 6c 69 74 65 33 41 75 74 68 43 68 65 63 6b  sqlite3AuthCheck
17780 28 70 50 61 72 73 65 2c 20 53 51 4c 49 54 45 5f  (pParse, SQLITE_
17790 53 45 4c 45 43 54 2c 20 30 2c 20 30 2c 20 30 29  SELECT, 0, 0, 0)
177a0 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 6d   ) return 1;.  m
177b0 65 6d 73 65 74 28 26 73 41 67 67 49 6e 66 6f 2c  emset(&sAggInfo,
177c0 20 30 2c 20 73 69 7a 65 6f 66 28 73 41 67 67 49   0, sizeof(sAggI
177d0 6e 66 6f 29 29 3b 0a 0a 23 69 66 6e 64 65 66 20  nfo));..#ifndef 
177e0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f 4d 50  SQLITE_OMIT_COMP
177f0 4f 55 4e 44 5f 53 45 4c 45 43 54 0a 20 20 2f 2a  OUND_SELECT.  /*
17800 20 49 66 20 74 68 65 72 65 20 69 73 20 61 72 65   If there is are
17810 20 61 20 73 65 71 75 65 6e 63 65 20 6f 66 20 71   a sequence of q
17820 75 65 72 69 65 73 2c 20 64 6f 20 74 68 65 20 65  ueries, do the e
17830 61 72 6c 69 65 72 20 6f 6e 65 73 20 66 69 72 73  arlier ones firs
17840 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d  t..  */.  if( p-
17850 3e 70 50 72 69 6f 72 20 29 7b 0a 20 20 20 20 69  >pPrior ){.    i
17860 66 28 20 70 2d 3e 70 52 69 67 68 74 6d 6f 73 74  f( p->pRightmost
17870 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 53 65 6c  ==0 ){.      Sel
17880 65 63 74 20 2a 70 4c 6f 6f 70 3b 0a 20 20 20 20  ect *pLoop;.    
17890 20 20 66 6f 72 28 70 4c 6f 6f 70 3d 70 3b 20 70    for(pLoop=p; p
178a0 4c 6f 6f 70 3b 20 70 4c 6f 6f 70 3d 70 4c 6f 6f  Loop; pLoop=pLoo
178b0 70 2d 3e 70 50 72 69 6f 72 29 7b 0a 20 20 20 20  p->pPrior){.    
178c0 20 20 20 20 70 4c 6f 6f 70 2d 3e 70 52 69 67 68      pLoop->pRigh
178d0 74 6d 6f 73 74 20 3d 20 70 3b 0a 20 20 20 20 20  tmost = p;.     
178e0 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74   }.    }.    ret
178f0 75 72 6e 20 6d 75 6c 74 69 53 65 6c 65 63 74 28  urn multiSelect(
17900 70 50 61 72 73 65 2c 20 70 2c 20 65 44 65 73 74  pParse, p, eDest
17910 2c 20 69 50 61 72 6d 2c 20 61 66 66 29 3b 0a 20  , iParm, aff);. 
17920 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 70 4f 72   }.#endif..  pOr
17930 64 65 72 42 79 20 3d 20 70 2d 3e 70 4f 72 64 65  derBy = p->pOrde
17940 72 42 79 3b 0a 20 20 69 66 28 20 49 67 6e 6f 72  rBy;.  if( Ignor
17950 61 62 6c 65 4f 72 64 65 72 62 79 28 65 44 65 73  ableOrderby(eDes
17960 74 29 20 29 7b 0a 20 20 20 20 70 2d 3e 70 4f 72  t) ){.    p->pOr
17970 64 65 72 42 79 20 3d 20 30 3b 0a 20 20 7d 0a 20  derBy = 0;.  }. 
17980 20 69 66 28 20 73 71 6c 69 74 65 33 53 65 6c 65   if( sqlite3Sele
17990 63 74 52 65 73 6f 6c 76 65 28 70 50 61 72 73 65  ctResolve(pParse
179a0 2c 20 70 2c 20 30 29 20 29 7b 0a 20 20 20 20 67  , p, 0) ){.    g
179b0 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a  oto select_end;.
179c0 20 20 7d 0a 20 20 70 2d 3e 70 4f 72 64 65 72 42    }.  p->pOrderB
179d0 79 20 3d 20 70 4f 72 64 65 72 42 79 3b 0a 0a 20  y = pOrderBy;.. 
179e0 20 2f 2a 20 4d 61 6b 65 20 6c 6f 63 61 6c 20 63   /* Make local c
179f0 6f 70 69 65 73 20 6f 66 20 74 68 65 20 70 61 72  opies of the par
17a00 61 6d 65 74 65 72 73 20 66 6f 72 20 74 68 69 73  ameters for this
17a10 20 71 75 65 72 79 2e 0a 20 20 2a 2f 0a 20 20 70   query..  */.  p
17a20 54 61 62 4c 69 73 74 20 3d 20 70 2d 3e 70 53 72  TabList = p->pSr
17a30 63 3b 0a 20 20 70 57 68 65 72 65 20 3d 20 70 2d  c;.  pWhere = p-
17a40 3e 70 57 68 65 72 65 3b 0a 20 20 70 47 72 6f 75  >pWhere;.  pGrou
17a50 70 42 79 20 3d 20 70 2d 3e 70 47 72 6f 75 70 42  pBy = p->pGroupB
17a60 79 3b 0a 20 20 70 48 61 76 69 6e 67 20 3d 20 70  y;.  pHaving = p
17a70 2d 3e 70 48 61 76 69 6e 67 3b 0a 20 20 69 73 41  ->pHaving;.  isA
17a80 67 67 20 3d 20 70 2d 3e 69 73 41 67 67 3b 0a 20  gg = p->isAgg;. 
17a90 20 69 73 44 69 73 74 69 6e 63 74 20 3d 20 70 2d   isDistinct = p-
17aa0 3e 69 73 44 69 73 74 69 6e 63 74 3b 0a 20 20 70  >isDistinct;.  p
17ab0 45 4c 69 73 74 20 3d 20 70 2d 3e 70 45 4c 69 73  EList = p->pELis
17ac0 74 3b 0a 20 20 69 66 28 20 70 45 4c 69 73 74 3d  t;.  if( pEList=
17ad0 3d 30 20 29 20 67 6f 74 6f 20 73 65 6c 65 63 74  =0 ) goto select
17ae0 5f 65 6e 64 3b 0a 0a 20 20 2f 2a 20 0a 20 20 2a  _end;..  /* .  *
17af0 2a 20 44 6f 20 6e 6f 74 20 65 76 65 6e 20 61 74  * Do not even at
17b00 74 65 6d 70 74 20 74 6f 20 67 65 6e 65 72 61 74  tempt to generat
17b10 65 20 61 6e 79 20 63 6f 64 65 20 69 66 20 77 65  e any code if we
17b20 20 68 61 76 65 20 61 6c 72 65 61 64 79 20 73 65   have already se
17b30 65 6e 0a 20 20 2a 2a 20 65 72 72 6f 72 73 20 62  en.  ** errors b
17b40 65 66 6f 72 65 20 74 68 69 73 20 72 6f 75 74 69  efore this routi
17b50 6e 65 20 73 74 61 72 74 73 2e 0a 20 20 2a 2f 0a  ne starts..  */.
17b60 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 45    if( pParse->nE
17b70 72 72 3e 30 20 29 20 67 6f 74 6f 20 73 65 6c 65  rr>0 ) goto sele
17b80 63 74 5f 65 6e 64 3b 0a 0a 20 20 2f 2a 20 49 66  ct_end;..  /* If
17b90 20 77 72 69 74 69 6e 67 20 74 6f 20 6d 65 6d 6f   writing to memo
17ba0 72 79 20 6f 72 20 67 65 6e 65 72 61 74 69 6e 67  ry or generating
17bb0 20 61 20 73 65 74 0a 20 20 2a 2a 20 6f 6e 6c 79   a set.  ** only
17bc0 20 61 20 73 69 6e 67 6c 65 20 63 6f 6c 75 6d 6e   a single column
17bd0 20 6d 61 79 20 62 65 20 6f 75 74 70 75 74 2e 0a   may be output..
17be0 20 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c    */.#ifndef SQL
17bf0 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52  ITE_OMIT_SUBQUER
17c00 59 0a 20 20 69 66 28 20 28 65 44 65 73 74 3d 3d  Y.  if( (eDest==
17c10 53 52 54 5f 4d 65 6d 20 7c 7c 20 65 44 65 73 74  SRT_Mem || eDest
17c20 3d 3d 53 52 54 5f 53 65 74 29 20 26 26 20 70 45  ==SRT_Set) && pE
17c30 4c 69 73 74 2d 3e 6e 45 78 70 72 3e 31 20 29 7b  List->nExpr>1 ){
17c40 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f  .    sqlite3Erro
17c50 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 6f 6e  rMsg(pParse, "on
17c60 6c 79 20 61 20 73 69 6e 67 6c 65 20 72 65 73 75  ly a single resu
17c70 6c 74 20 61 6c 6c 6f 77 65 64 20 66 6f 72 20 22  lt allowed for "
17c80 0a 20 20 20 20 20 20 20 22 61 20 53 45 4c 45 43  .       "a SELEC
17c90 54 20 74 68 61 74 20 69 73 20 70 61 72 74 20 6f  T that is part o
17ca0 66 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 22  f an expression"
17cb0 29 3b 0a 20 20 20 20 67 6f 74 6f 20 73 65 6c 65  );.    goto sele
17cc0 63 74 5f 65 6e 64 3b 0a 20 20 7d 0a 23 65 6e 64  ct_end;.  }.#end
17cd0 69 66 0a 0a 20 20 2f 2a 20 4f 52 44 45 52 20 42  if..  /* ORDER B
17ce0 59 20 69 73 20 69 67 6e 6f 72 65 64 20 66 6f 72  Y is ignored for
17cf0 20 73 6f 6d 65 20 64 65 73 74 69 6e 61 74 69 6f   some destinatio
17d00 6e 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 49  ns..  */.  if( I
17d10 67 6e 6f 72 61 62 6c 65 4f 72 64 65 72 62 79 28  gnorableOrderby(
17d20 65 44 65 73 74 29 20 29 7b 0a 20 20 20 20 70 4f  eDest) ){.    pO
17d30 72 64 65 72 42 79 20 3d 20 30 3b 0a 20 20 7d 0a  rderBy = 0;.  }.
17d40 0a 20 20 2f 2a 20 42 65 67 69 6e 20 67 65 6e 65  .  /* Begin gene
17d50 72 61 74 69 6e 67 20 63 6f 64 65 2e 0a 20 20 2a  rating code..  *
17d60 2f 0a 20 20 76 20 3d 20 73 71 6c 69 74 65 33 47  /.  v = sqlite3G
17d70 65 74 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a  etVdbe(pParse);.
17d80 20 20 69 66 28 20 76 3d 3d 30 20 29 20 67 6f 74    if( v==0 ) got
17d90 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 0a 20  o select_end;.. 
17da0 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64   /* Generate cod
17db0 65 20 66 6f 72 20 61 6c 6c 20 73 75 62 2d 71 75  e for all sub-qu
17dc0 65 72 69 65 73 20 69 6e 20 74 68 65 20 46 52 4f  eries in the FRO
17dd0 4d 20 63 6c 61 75 73 65 0a 20 20 2a 2f 0a 23 69  M clause.  */.#i
17de0 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  f !defined(SQLIT
17df0 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 29  E_OMIT_SUBQUERY)
17e00 20 7c 7c 20 21 64 65 66 69 6e 65 64 28 53 51 4c   || !defined(SQL
17e10 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 29 0a 20  ITE_OMIT_VIEW). 
17e20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 54 61 62   for(i=0; i<pTab
17e30 4c 69 73 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b 29  List->nSrc; i++)
17e40 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72  {.    const char
17e50 20 2a 7a 53 61 76 65 64 41 75 74 68 43 6f 6e 74   *zSavedAuthCont
17e60 65 78 74 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74  ext = 0;.    int
17e70 20 6e 65 65 64 52 65 73 74 6f 72 65 43 6f 6e 74   needRestoreCont
17e80 65 78 74 3b 0a 20 20 20 20 73 74 72 75 63 74 20  ext;.    struct 
17e90 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49  SrcList_item *pI
17ea0 74 65 6d 20 3d 20 26 70 54 61 62 4c 69 73 74 2d  tem = &pTabList-
17eb0 3e 61 5b 69 5d 3b 0a 0a 20 20 20 20 69 66 28 20  >a[i];..    if( 
17ec0 70 49 74 65 6d 2d 3e 70 53 65 6c 65 63 74 3d 3d  pItem->pSelect==
17ed0 30 20 7c 7c 20 70 49 74 65 6d 2d 3e 69 73 50 6f  0 || pItem->isPo
17ee0 70 75 6c 61 74 65 64 20 29 20 63 6f 6e 74 69 6e  pulated ) contin
17ef0 75 65 3b 0a 20 20 20 20 69 66 28 20 70 49 74 65  ue;.    if( pIte
17f00 6d 2d 3e 7a 4e 61 6d 65 21 3d 30 20 29 7b 0a 20  m->zName!=0 ){. 
17f10 20 20 20 20 20 7a 53 61 76 65 64 41 75 74 68 43       zSavedAuthC
17f20 6f 6e 74 65 78 74 20 3d 20 70 50 61 72 73 65 2d  ontext = pParse-
17f30 3e 7a 41 75 74 68 43 6f 6e 74 65 78 74 3b 0a 20  >zAuthContext;. 
17f40 20 20 20 20 20 70 50 61 72 73 65 2d 3e 7a 41 75       pParse->zAu
17f50 74 68 43 6f 6e 74 65 78 74 20 3d 20 70 49 74 65  thContext = pIte
17f60 6d 2d 3e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20  m->zName;.      
17f70 6e 65 65 64 52 65 73 74 6f 72 65 43 6f 6e 74 65  needRestoreConte
17f80 78 74 20 3d 20 31 3b 0a 20 20 20 20 7d 65 6c 73  xt = 1;.    }els
17f90 65 7b 0a 20 20 20 20 20 20 6e 65 65 64 52 65 73  e{.      needRes
17fa0 74 6f 72 65 43 6f 6e 74 65 78 74 20 3d 20 30 3b  toreContext = 0;
17fb0 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
17fc0 65 33 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c  e3Select(pParse,
17fd0 20 70 49 74 65 6d 2d 3e 70 53 65 6c 65 63 74 2c   pItem->pSelect,
17fe0 20 53 52 54 5f 45 70 68 65 6d 54 61 62 2c 20 0a   SRT_EphemTab, .
17ff0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18000 20 70 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72 2c   pItem->iCursor,
18010 20 70 2c 20 69 2c 20 26 69 73 41 67 67 2c 20 30   p, i, &isAgg, 0
18020 29 3b 0a 20 20 20 20 69 66 28 20 6e 65 65 64 52  );.    if( needR
18030 65 73 74 6f 72 65 43 6f 6e 74 65 78 74 20 29 7b  estoreContext ){
18040 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 7a  .      pParse->z
18050 41 75 74 68 43 6f 6e 74 65 78 74 20 3d 20 7a 53  AuthContext = zS
18060 61 76 65 64 41 75 74 68 43 6f 6e 74 65 78 74 3b  avedAuthContext;
18070 0a 20 20 20 20 7d 0a 20 20 20 20 70 54 61 62 4c  .    }.    pTabL
18080 69 73 74 20 3d 20 70 2d 3e 70 53 72 63 3b 0a 20  ist = p->pSrc;. 
18090 20 20 20 70 57 68 65 72 65 20 3d 20 70 2d 3e 70     pWhere = p->p
180a0 57 68 65 72 65 3b 0a 20 20 20 20 69 66 28 20 21  Where;.    if( !
180b0 49 67 6e 6f 72 61 62 6c 65 4f 72 64 65 72 62 79  IgnorableOrderby
180c0 28 65 44 65 73 74 29 20 29 7b 0a 20 20 20 20 20  (eDest) ){.     
180d0 20 70 4f 72 64 65 72 42 79 20 3d 20 70 2d 3e 70   pOrderBy = p->p
180e0 4f 72 64 65 72 42 79 3b 0a 20 20 20 20 7d 0a 20  OrderBy;.    }. 
180f0 20 20 20 70 47 72 6f 75 70 42 79 20 3d 20 70 2d     pGroupBy = p-
18100 3e 70 47 72 6f 75 70 42 79 3b 0a 20 20 20 20 70  >pGroupBy;.    p
18110 48 61 76 69 6e 67 20 3d 20 70 2d 3e 70 48 61 76  Having = p->pHav
18120 69 6e 67 3b 0a 20 20 20 20 69 73 44 69 73 74 69  ing;.    isDisti
18130 6e 63 74 20 3d 20 70 2d 3e 69 73 44 69 73 74 69  nct = p->isDisti
18140 6e 63 74 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  nct;.  }.#endif.
18150 0a 20 20 2f 2a 20 43 68 65 63 6b 20 66 6f 72 20  .  /* Check for 
18160 74 68 65 20 73 70 65 63 69 61 6c 20 63 61 73 65  the special case
18170 20 6f 66 20 61 20 6d 69 6e 28 29 20 6f 72 20 6d   of a min() or m
18180 61 78 28 29 20 66 75 6e 63 74 69 6f 6e 20 62 79  ax() function by
18190 20 69 74 73 65 6c 66 0a 20 20 2a 2a 20 69 6e 20   itself.  ** in 
181a0 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 2e 0a  the result set..
181b0 20 20 2a 2f 0a 20 20 69 66 28 20 73 69 6d 70 6c    */.  if( simpl
181c0 65 4d 69 6e 4d 61 78 51 75 65 72 79 28 70 50 61  eMinMaxQuery(pPa
181d0 72 73 65 2c 20 70 2c 20 65 44 65 73 74 2c 20 69  rse, p, eDest, i
181e0 50 61 72 6d 29 20 29 7b 0a 20 20 20 20 72 63 20  Parm) ){.    rc 
181f0 3d 20 30 3b 0a 20 20 20 20 67 6f 74 6f 20 73 65  = 0;.    goto se
18200 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 7d 0a 0a 20  lect_end;.  }.. 
18210 20 2f 2a 20 43 68 65 63 6b 20 74 6f 20 73 65 65   /* Check to see
18220 20 69 66 20 74 68 69 73 20 69 73 20 61 20 73 75   if this is a su
18230 62 71 75 65 72 79 20 74 68 61 74 20 63 61 6e 20  bquery that can 
18240 62 65 20 22 66 6c 61 74 74 65 6e 65 64 22 20 69  be "flattened" i
18250 6e 74 6f 20 69 74 73 20 70 61 72 65 6e 74 2e 0a  nto its parent..
18260 20 20 2a 2a 20 49 66 20 66 6c 61 74 74 65 6e 69    ** If flatteni
18270 6e 67 20 69 73 20 61 20 70 6f 73 73 69 62 6c 69  ng is a possibli
18280 74 79 2c 20 64 6f 20 73 6f 20 61 6e 64 20 72 65  ty, do so and re
18290 74 75 72 6e 20 69 6d 6d 65 64 69 61 74 65 6c 79  turn immediately
182a0 2e 20 20 0a 20 20 2a 2f 0a 23 69 66 6e 64 65 66  .  .  */.#ifndef
182b0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45   SQLITE_OMIT_VIE
182c0 57 0a 20 20 69 66 28 20 70 50 61 72 65 6e 74 20  W.  if( pParent 
182d0 26 26 20 70 50 61 72 65 6e 74 41 67 67 20 26 26  && pParentAgg &&
182e0 0a 20 20 20 20 20 20 66 6c 61 74 74 65 6e 53 75  .      flattenSu
182f0 62 71 75 65 72 79 28 70 50 61 72 65 6e 74 2c 20  bquery(pParent, 
18300 70 61 72 65 6e 74 54 61 62 2c 20 2a 70 50 61 72  parentTab, *pPar
18310 65 6e 74 41 67 67 2c 20 69 73 41 67 67 29 20 29  entAgg, isAgg) )
18320 7b 0a 20 20 20 20 69 66 28 20 69 73 41 67 67 20  {.    if( isAgg 
18330 29 20 2a 70 50 61 72 65 6e 74 41 67 67 20 3d 20  ) *pParentAgg = 
18340 31 3b 0a 20 20 20 20 67 6f 74 6f 20 73 65 6c 65  1;.    goto sele
18350 63 74 5f 65 6e 64 3b 0a 20 20 7d 0a 23 65 6e 64  ct_end;.  }.#end
18360 69 66 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 72  if..  /* If ther
18370 65 20 69 73 20 61 6e 20 4f 52 44 45 52 20 42 59  e is an ORDER BY
18380 20 63 6c 61 75 73 65 2c 20 74 68 65 6e 20 74 68   clause, then th
18390 69 73 20 73 6f 72 74 69 6e 67 0a 20 20 2a 2a 20  is sorting.  ** 
183a0 69 6e 64 65 78 20 6d 69 67 68 74 20 65 6e 64 20  index might end 
183b0 75 70 20 62 65 69 6e 67 20 75 6e 75 73 65 64 20  up being unused 
183c0 69 66 20 74 68 65 20 64 61 74 61 20 63 61 6e 20  if the data can 
183d0 62 65 20 0a 20 20 2a 2a 20 65 78 74 72 61 63 74  be .  ** extract
183e0 65 64 20 69 6e 20 70 72 65 2d 73 6f 72 74 65 64  ed in pre-sorted
183f0 20 6f 72 64 65 72 2e 20 20 49 66 20 74 68 61 74   order.  If that
18400 20 69 73 20 74 68 65 20 63 61 73 65 2c 20 74 68   is the case, th
18410 65 6e 20 74 68 65 0a 20 20 2a 2a 20 4f 50 5f 4f  en the.  ** OP_O
18420 70 65 6e 45 70 68 65 6d 65 72 61 6c 20 69 6e 73  penEphemeral ins
18430 74 72 75 63 74 69 6f 6e 20 77 69 6c 6c 20 62 65  truction will be
18440 20 63 68 61 6e 67 65 64 20 74 6f 20 61 6e 20 4f   changed to an O
18450 50 5f 4e 6f 6f 70 20 6f 6e 63 65 0a 20 20 2a 2a  P_Noop once.  **
18460 20 77 65 20 66 69 67 75 72 65 20 6f 75 74 20 74   we figure out t
18470 68 61 74 20 74 68 65 20 73 6f 72 74 69 6e 67 20  hat the sorting 
18480 69 6e 64 65 78 20 69 73 20 6e 6f 74 20 6e 65 65  index is not nee
18490 64 65 64 2e 20 20 54 68 65 20 61 64 64 72 53 6f  ded.  The addrSo
184a0 72 74 49 6e 64 65 78 0a 20 20 2a 2a 20 76 61 72  rtIndex.  ** var
184b0 69 61 62 6c 65 20 69 73 20 75 73 65 64 20 74 6f  iable is used to
184c0 20 66 61 63 69 6c 69 74 61 74 65 20 74 68 61 74   facilitate that
184d0 20 63 68 61 6e 67 65 2e 0a 20 20 2a 2f 0a 20 20   change..  */.  
184e0 69 66 28 20 70 4f 72 64 65 72 42 79 20 29 7b 0a  if( pOrderBy ){.
184f0 20 20 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65      KeyInfo *pKe
18500 79 49 6e 66 6f 3b 0a 20 20 20 20 69 66 28 20 70  yInfo;.    if( p
18510 50 61 72 73 65 2d 3e 6e 45 72 72 20 29 7b 0a 20  Parse->nErr ){. 
18520 20 20 20 20 20 67 6f 74 6f 20 73 65 6c 65 63 74       goto select
18530 5f 65 6e 64 3b 0a 20 20 20 20 7d 0a 20 20 20 20  _end;.    }.    
18540 70 4b 65 79 49 6e 66 6f 20 3d 20 6b 65 79 49 6e  pKeyInfo = keyIn
18550 66 6f 46 72 6f 6d 45 78 70 72 4c 69 73 74 28 70  foFromExprList(p
18560 50 61 72 73 65 2c 20 70 4f 72 64 65 72 42 79 29  Parse, pOrderBy)
18570 3b 0a 20 20 20 20 70 4f 72 64 65 72 42 79 2d 3e  ;.    pOrderBy->
18580 69 45 43 75 72 73 6f 72 20 3d 20 70 50 61 72 73  iECursor = pPars
18590 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20 70  e->nTab++;.    p
185a0 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b 32  ->addrOpenEphm[2
185b0 5d 20 3d 20 61 64 64 72 53 6f 72 74 49 6e 64 65  ] = addrSortInde
185c0 78 20 3d 0a 20 20 20 20 20 20 73 71 6c 69 74 65  x =.      sqlite
185d0 33 56 64 62 65 4f 70 33 28 76 2c 20 4f 50 5f 4f  3VdbeOp3(v, OP_O
185e0 70 65 6e 45 70 68 65 6d 65 72 61 6c 2c 20 70 4f  penEphemeral, pO
185f0 72 64 65 72 42 79 2d 3e 69 45 43 75 72 73 6f 72  rderBy->iECursor
18600 2c 20 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70  , pOrderBy->nExp
18610 72 2b 32 2c 20 20 20 20 20 20 20 20 20 20 20 20  r+2,            
18620 20 20 20 20 20 20 20 20 20 28 63 68 61 72 2a 29           (char*)
18630 70 4b 65 79 49 6e 66 6f 2c 20 50 33 5f 4b 45 59  pKeyInfo, P3_KEY
18640 49 4e 46 4f 5f 48 41 4e 44 4f 46 46 29 3b 0a 20  INFO_HANDOFF);. 
18650 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 64 64 72   }else{.    addr
18660 53 6f 72 74 49 6e 64 65 78 20 3d 20 2d 31 3b 0a  SortIndex = -1;.
18670 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65    }..  /* If the
18680 20 6f 75 74 70 75 74 20 69 73 20 64 65 73 74 69   output is desti
18690 6e 65 64 20 66 6f 72 20 61 20 74 65 6d 70 6f 72  ned for a tempor
186a0 61 72 79 20 74 61 62 6c 65 2c 20 6f 70 65 6e 20  ary table, open 
186b0 74 68 61 74 20 74 61 62 6c 65 2e 0a 20 20 2a 2f  that table..  */
186c0 0a 20 20 69 66 28 20 65 44 65 73 74 3d 3d 53 52  .  if( eDest==SR
186d0 54 5f 45 70 68 65 6d 54 61 62 20 29 7b 0a 20 20  T_EphemTab ){.  
186e0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
186f0 4f 70 28 76 2c 20 4f 50 5f 4f 70 65 6e 45 70 68  Op(v, OP_OpenEph
18700 65 6d 65 72 61 6c 2c 20 69 50 61 72 6d 2c 20 70  emeral, iParm, p
18710 45 4c 69 73 74 2d 3e 6e 45 78 70 72 29 3b 0a 20  EList->nExpr);. 
18720 20 7d 0a 0a 20 20 2f 2a 20 53 65 74 20 74 68 65   }..  /* Set the
18730 20 6c 69 6d 69 74 65 72 2e 0a 20 20 2a 2f 0a 20   limiter..  */. 
18740 20 69 45 6e 64 20 3d 20 73 71 6c 69 74 65 33 56   iEnd = sqlite3V
18750 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b  dbeMakeLabel(v);
18760 0a 20 20 63 6f 6d 70 75 74 65 4c 69 6d 69 74 52  .  computeLimitR
18770 65 67 69 73 74 65 72 73 28 70 50 61 72 73 65 2c  egisters(pParse,
18780 20 70 2c 20 69 45 6e 64 29 3b 0a 0a 20 20 2f 2a   p, iEnd);..  /*
18790 20 4f 70 65 6e 20 61 20 76 69 72 74 75 61 6c 20   Open a virtual 
187a0 69 6e 64 65 78 20 74 6f 20 75 73 65 20 66 6f 72  index to use for
187b0 20 74 68 65 20 64 69 73 74 69 6e 63 74 20 73 65   the distinct se
187c0 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 69 73  t..  */.  if( is
187d0 44 69 73 74 69 6e 63 74 20 29 7b 0a 20 20 20 20  Distinct ){.    
187e0 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66  KeyInfo *pKeyInf
187f0 6f 3b 0a 20 20 20 20 64 69 73 74 69 6e 63 74 20  o;.    distinct 
18800 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b  = pParse->nTab++
18810 3b 0a 20 20 20 20 70 4b 65 79 49 6e 66 6f 20 3d  ;.    pKeyInfo =
18820 20 6b 65 79 49 6e 66 6f 46 72 6f 6d 45 78 70 72   keyInfoFromExpr
18830 4c 69 73 74 28 70 50 61 72 73 65 2c 20 70 2d 3e  List(pParse, p->
18840 70 45 4c 69 73 74 29 3b 0a 20 20 20 20 73 71 6c  pEList);.    sql
18850 69 74 65 33 56 64 62 65 4f 70 33 28 76 2c 20 4f  ite3VdbeOp3(v, O
18860 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 2c  P_OpenEphemeral,
18870 20 64 69 73 74 69 6e 63 74 2c 20 30 2c 20 0a 20   distinct, 0, . 
18880 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18890 20 20 20 20 20 20 20 28 63 68 61 72 2a 29 70 4b         (char*)pK
188a0 65 79 49 6e 66 6f 2c 20 50 33 5f 4b 45 59 49 4e  eyInfo, P3_KEYIN
188b0 46 4f 5f 48 41 4e 44 4f 46 46 29 3b 0a 20 20 7d  FO_HANDOFF);.  }
188c0 65 6c 73 65 7b 0a 20 20 20 20 64 69 73 74 69 6e  else{.    distin
188d0 63 74 20 3d 20 2d 31 3b 0a 20 20 7d 0a 0a 20 20  ct = -1;.  }..  
188e0 2f 2a 20 41 67 67 72 65 67 61 74 65 20 61 6e 64  /* Aggregate and
188f0 20 6e 6f 6e 2d 61 67 67 72 65 67 61 74 65 20 71   non-aggregate q
18900 75 65 72 69 65 73 20 61 72 65 20 68 61 6e 64 6c  ueries are handl
18910 65 64 20 64 69 66 66 65 72 65 6e 74 6c 79 20 2a  ed differently *
18920 2f 0a 20 20 69 66 28 20 21 69 73 41 67 67 20 26  /.  if( !isAgg &
18930 26 20 70 47 72 6f 75 70 42 79 3d 3d 30 20 29 7b  & pGroupBy==0 ){
18940 0a 20 20 20 20 2f 2a 20 54 68 69 73 20 63 61 73  .    /* This cas
18950 65 20 69 73 20 66 6f 72 20 6e 6f 6e 2d 61 67 67  e is for non-agg
18960 72 65 67 61 74 65 20 71 75 65 72 69 65 73 0a 20  regate queries. 
18970 20 20 20 2a 2a 20 42 65 67 69 6e 20 74 68 65 20     ** Begin the 
18980 64 61 74 61 62 61 73 65 20 73 63 61 6e 0a 20 20  database scan.  
18990 20 20 2a 2f 0a 20 20 20 20 70 57 49 6e 66 6f 20    */.    pWInfo 
189a0 3d 20 73 71 6c 69 74 65 33 57 68 65 72 65 42 65  = sqlite3WhereBe
189b0 67 69 6e 28 70 50 61 72 73 65 2c 20 70 54 61 62  gin(pParse, pTab
189c0 4c 69 73 74 2c 20 70 57 68 65 72 65 2c 20 26 70  List, pWhere, &p
189d0 4f 72 64 65 72 42 79 29 3b 0a 20 20 20 20 69 66  OrderBy);.    if
189e0 28 20 70 57 49 6e 66 6f 3d 3d 30 20 29 20 67 6f  ( pWInfo==0 ) go
189f0 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 0a  to select_end;..
18a00 20 20 20 20 2f 2a 20 49 66 20 73 6f 72 74 69 6e      /* If sortin
18a10 67 20 69 6e 64 65 78 20 74 68 61 74 20 77 61 73  g index that was
18a20 20 63 72 65 61 74 65 64 20 62 79 20 61 20 70 72   created by a pr
18a30 69 6f 72 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d  ior OP_OpenEphem
18a40 65 72 61 6c 20 0a 20 20 20 20 2a 2a 20 69 6e 73  eral .    ** ins
18a50 74 72 75 63 74 69 6f 6e 20 65 6e 64 65 64 20 75  truction ended u
18a60 70 20 6e 6f 74 20 62 65 69 6e 67 20 6e 65 65 64  p not being need
18a70 65 64 2c 20 74 68 65 6e 20 63 68 61 6e 67 65 20  ed, then change 
18a80 74 68 65 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d  the OP_OpenEphem
18a90 65 72 61 6c 0a 20 20 20 20 2a 2a 20 69 6e 74 6f  eral.    ** into
18aa0 20 61 6e 20 4f 50 5f 4e 6f 6f 70 2e 0a 20 20 20   an OP_Noop..   
18ab0 20 2a 2f 0a 20 20 20 20 69 66 28 20 61 64 64 72   */.    if( addr
18ac0 53 6f 72 74 49 6e 64 65 78 3e 3d 30 20 26 26 20  SortIndex>=0 && 
18ad0 70 4f 72 64 65 72 42 79 3d 3d 30 20 29 7b 0a 20  pOrderBy==0 ){. 
18ae0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
18af0 43 68 61 6e 67 65 54 6f 4e 6f 6f 70 28 76 2c 20  ChangeToNoop(v, 
18b00 61 64 64 72 53 6f 72 74 49 6e 64 65 78 2c 20 31  addrSortIndex, 1
18b10 29 3b 0a 20 20 20 20 20 20 70 2d 3e 61 64 64 72  );.      p->addr
18b20 4f 70 65 6e 45 70 68 6d 5b 32 5d 20 3d 20 2d 31  OpenEphm[2] = -1
18b30 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
18b40 55 73 65 20 74 68 65 20 73 74 61 6e 64 61 72 64  Use the standard
18b50 20 69 6e 6e 65 72 20 6c 6f 6f 70 0a 20 20 20 20   inner loop.    
18b60 2a 2f 0a 20 20 20 20 69 66 28 20 73 65 6c 65 63  */.    if( selec
18b70 74 49 6e 6e 65 72 4c 6f 6f 70 28 70 50 61 72 73  tInnerLoop(pPars
18b80 65 2c 20 70 2c 20 70 45 4c 69 73 74 2c 20 30 2c  e, p, pEList, 0,
18b90 20 30 2c 20 70 4f 72 64 65 72 42 79 2c 20 64 69   0, pOrderBy, di
18ba0 73 74 69 6e 63 74 2c 20 65 44 65 73 74 2c 0a 20  stinct, eDest,. 
18bb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18bc0 20 20 20 69 50 61 72 6d 2c 20 70 57 49 6e 66 6f     iParm, pWInfo
18bd0 2d 3e 69 43 6f 6e 74 69 6e 75 65 2c 20 70 57 49  ->iContinue, pWI
18be0 6e 66 6f 2d 3e 69 42 72 65 61 6b 2c 20 61 66 66  nfo->iBreak, aff
18bf0 29 20 29 7b 0a 20 20 20 20 20 20 20 67 6f 74 6f  ) ){.       goto
18c00 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20   select_end;.   
18c10 20 7d 0a 0a 20 20 20 20 2f 2a 20 45 6e 64 20 74   }..    /* End t
18c20 68 65 20 64 61 74 61 62 61 73 65 20 73 63 61 6e  he database scan
18c30 20 6c 6f 6f 70 2e 0a 20 20 20 20 2a 2f 0a 20 20   loop..    */.  
18c40 20 20 73 71 6c 69 74 65 33 57 68 65 72 65 45 6e    sqlite3WhereEn
18c50 64 28 70 57 49 6e 66 6f 29 3b 0a 20 20 7d 65 6c  d(pWInfo);.  }el
18c60 73 65 7b 0a 20 20 20 20 2f 2a 20 54 68 69 73 20  se{.    /* This 
18c70 69 73 20 74 68 65 20 70 72 6f 63 65 73 73 69 6e  is the processin
18c80 67 20 66 6f 72 20 61 67 67 72 65 67 61 74 65 20  g for aggregate 
18c90 71 75 65 72 69 65 73 20 2a 2f 0a 20 20 20 20 4e  queries */.    N
18ca0 61 6d 65 43 6f 6e 74 65 78 74 20 73 4e 43 3b 20  ameContext sNC; 
18cb0 20 20 20 2f 2a 20 4e 61 6d 65 20 63 6f 6e 74 65     /* Name conte
18cc0 78 74 20 66 6f 72 20 70 72 6f 63 65 73 73 69 6e  xt for processin
18cd0 67 20 61 67 67 72 65 67 61 74 65 20 69 6e 66 6f  g aggregate info
18ce0 72 6d 61 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 69  rmation */.    i
18cf0 6e 74 20 69 41 4d 65 6d 3b 20 20 20 20 20 20 20  nt iAMem;       
18d00 20 20 20 2f 2a 20 46 69 72 73 74 20 4d 65 6d 20     /* First Mem 
18d10 61 64 64 72 65 73 73 20 66 6f 72 20 73 74 6f 72  address for stor
18d20 69 6e 67 20 63 75 72 72 65 6e 74 20 47 52 4f 55  ing current GROU
18d30 50 20 42 59 20 2a 2f 0a 20 20 20 20 69 6e 74 20  P BY */.    int 
18d40 69 42 4d 65 6d 3b 20 20 20 20 20 20 20 20 20 20  iBMem;          
18d50 2f 2a 20 46 69 72 73 74 20 4d 65 6d 20 61 64 64  /* First Mem add
18d60 72 65 73 73 20 66 6f 72 20 70 72 65 76 69 6f 75  ress for previou
18d70 73 20 47 52 4f 55 50 20 42 59 20 2a 2f 0a 20 20  s GROUP BY */.  
18d80 20 20 69 6e 74 20 69 55 73 65 46 6c 61 67 3b 20    int iUseFlag; 
18d90 20 20 20 20 20 20 2f 2a 20 4d 65 6d 20 61 64 64        /* Mem add
18da0 72 65 73 73 20 68 6f 6c 64 69 6e 67 20 66 6c 61  ress holding fla
18db0 67 20 69 6e 64 69 63 61 74 69 6e 67 20 74 68 61  g indicating tha
18dc0 74 20 61 74 20 6c 65 61 73 74 0a 20 20 20 20 20  t at least.     
18dd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18de0 20 20 20 2a 2a 20 6f 6e 65 20 72 6f 77 20 6f 66     ** one row of
18df0 20 74 68 65 20 69 6e 70 75 74 20 74 6f 20 74 68   the input to th
18e00 65 20 61 67 67 72 65 67 61 74 6f 72 20 68 61 73  e aggregator has
18e10 20 62 65 65 6e 0a 20 20 20 20 20 20 20 20 20 20   been.          
18e20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a                **
18e30 20 70 72 6f 63 65 73 73 65 64 20 2a 2f 0a 20 20   processed */.  
18e40 20 20 69 6e 74 20 69 41 62 6f 72 74 46 6c 61 67    int iAbortFlag
18e50 3b 20 20 20 20 20 2f 2a 20 4d 65 6d 20 61 64 64  ;     /* Mem add
18e60 72 65 73 73 20 77 68 69 63 68 20 63 61 75 73 65  ress which cause
18e70 73 20 71 75 65 72 79 20 61 62 6f 72 74 20 69 66  s query abort if
18e80 20 70 6f 73 69 74 69 76 65 20 2a 2f 0a 20 20 20   positive */.   
18e90 20 69 6e 74 20 67 72 6f 75 70 42 79 53 6f 72 74   int groupBySort
18ea0 3b 20 20 20 20 2f 2a 20 52 6f 77 73 20 63 6f 6d  ;    /* Rows com
18eb0 65 20 66 72 6f 6d 20 73 6f 75 72 63 65 20 69 6e  e from source in
18ec0 20 47 52 4f 55 50 20 42 59 20 6f 72 64 65 72 20   GROUP BY order 
18ed0 2a 2f 0a 0a 0a 20 20 20 20 2f 2a 20 54 68 65 20  */...    /* The 
18ee0 66 6f 6c 6c 6f 77 69 6e 67 20 76 61 72 69 61 62  following variab
18ef0 6c 65 73 20 68 6f 6c 64 20 61 64 64 72 65 73 73  les hold address
18f00 65 73 20 6f 72 20 6c 61 62 65 6c 73 20 66 6f 72  es or labels for
18f10 20 70 61 72 74 73 20 6f 66 20 74 68 65 0a 20 20   parts of the.  
18f20 20 20 2a 2a 20 76 69 72 74 75 61 6c 20 6d 61 63    ** virtual mac
18f30 68 69 6e 65 20 70 72 6f 67 72 61 6d 20 77 65 20  hine program we 
18f40 61 72 65 20 70 75 74 74 69 6e 67 20 74 6f 67 65  are putting toge
18f50 74 68 65 72 20 2a 2f 0a 20 20 20 20 69 6e 74 20  ther */.    int 
18f60 61 64 64 72 4f 75 74 70 75 74 52 6f 77 3b 20 20  addrOutputRow;  
18f70 20 20 20 20 2f 2a 20 53 74 61 72 74 20 6f 66 20      /* Start of 
18f80 73 75 62 72 6f 75 74 69 6e 65 20 74 68 61 74 20  subroutine that 
18f90 6f 75 74 70 75 74 73 20 61 20 72 65 73 75 6c 74  outputs a result
18fa0 20 72 6f 77 20 2a 2f 0a 20 20 20 20 69 6e 74 20   row */.    int 
18fb0 61 64 64 72 53 65 74 41 62 6f 72 74 3b 20 20 20  addrSetAbort;   
18fc0 20 20 20 20 2f 2a 20 53 65 74 20 74 68 65 20 61      /* Set the a
18fd0 62 6f 72 74 20 66 6c 61 67 20 61 6e 64 20 72 65  bort flag and re
18fe0 74 75 72 6e 20 2a 2f 0a 20 20 20 20 69 6e 74 20  turn */.    int 
18ff0 61 64 64 72 49 6e 69 74 69 61 6c 69 7a 65 4c 6f  addrInitializeLo
19000 6f 70 3b 20 2f 2a 20 53 74 61 72 74 20 6f 66 20  op; /* Start of 
19010 63 6f 64 65 20 74 68 61 74 20 69 6e 69 74 69 61  code that initia
19020 6c 69 7a 65 73 20 74 68 65 20 69 6e 70 75 74 20  lizes the input 
19030 6c 6f 6f 70 20 2a 2f 0a 20 20 20 20 69 6e 74 20  loop */.    int 
19040 61 64 64 72 54 6f 70 4f 66 4c 6f 6f 70 3b 20 20  addrTopOfLoop;  
19050 20 20 20 20 2f 2a 20 54 6f 70 20 6f 66 20 74 68      /* Top of th
19060 65 20 69 6e 70 75 74 20 6c 6f 6f 70 20 2a 2f 0a  e input loop */.
19070 20 20 20 20 69 6e 74 20 61 64 64 72 47 72 6f 75      int addrGrou
19080 70 42 79 43 68 61 6e 67 65 3b 20 20 2f 2a 20 43  pByChange;  /* C
19090 6f 64 65 20 74 68 61 74 20 72 75 6e 73 20 77 68  ode that runs wh
190a0 65 6e 20 61 6e 79 20 47 52 4f 55 50 20 42 59 20  en any GROUP BY 
190b0 74 65 72 6d 20 63 68 61 6e 67 65 73 20 2a 2f 0a  term changes */.
190c0 20 20 20 20 69 6e 74 20 61 64 64 72 50 72 6f 63      int addrProc
190d0 65 73 73 52 6f 77 3b 20 20 20 20 20 2f 2a 20 43  essRow;     /* C
190e0 6f 64 65 20 74 6f 20 70 72 6f 63 65 73 73 20 61  ode to process a
190f0 20 73 69 6e 67 6c 65 20 69 6e 70 75 74 20 72 6f   single input ro
19100 77 20 2a 2f 0a 20 20 20 20 69 6e 74 20 61 64 64  w */.    int add
19110 72 45 6e 64 3b 20 20 20 20 20 20 20 20 20 20 20  rEnd;           
19120 20 2f 2a 20 45 6e 64 20 6f 66 20 61 6c 6c 20 70   /* End of all p
19130 72 6f 63 65 73 73 69 6e 67 20 2a 2f 0a 20 20 20  rocessing */.   
19140 20 69 6e 74 20 61 64 64 72 53 6f 72 74 69 6e 67   int addrSorting
19150 49 64 78 3b 20 20 20 20 20 2f 2a 20 54 68 65 20  Idx;     /* The 
19160 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c  OP_OpenEphemeral
19170 20 66 6f 72 20 74 68 65 20 73 6f 72 74 69 6e 67   for the sorting
19180 20 69 6e 64 65 78 20 2a 2f 0a 20 20 20 20 69 6e   index */.    in
19190 74 20 61 64 64 72 52 65 73 65 74 3b 20 20 20 20  t addrReset;    
191a0 20 20 20 20 20 20 2f 2a 20 53 75 62 72 6f 75 74        /* Subrout
191b0 69 6e 65 20 66 6f 72 20 72 65 73 65 74 74 69 6e  ine for resettin
191c0 67 20 74 68 65 20 61 63 63 75 6d 75 6c 61 74 6f  g the accumulato
191d0 72 20 2a 2f 0a 0a 20 20 20 20 61 64 64 72 45 6e  r */..    addrEn
191e0 64 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d  d = sqlite3VdbeM
191f0 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 0a 20 20  akeLabel(v);..  
19200 20 20 2f 2a 20 43 6f 6e 76 65 72 74 20 54 4b 5f    /* Convert TK_
19210 43 4f 4c 55 4d 4e 20 6e 6f 64 65 73 20 69 6e 74  COLUMN nodes int
19220 6f 20 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 20  o TK_AGG_COLUMN 
19230 61 6e 64 20 6d 61 6b 65 20 65 6e 74 72 69 65 73  and make entries
19240 20 69 6e 0a 20 20 20 20 2a 2a 20 73 41 67 67 49   in.    ** sAggI
19250 6e 66 6f 20 66 6f 72 20 61 6c 6c 20 54 4b 5f 41  nfo for all TK_A
19260 47 47 5f 46 55 4e 43 54 49 4f 4e 20 6e 6f 64 65  GG_FUNCTION node
19270 73 20 69 6e 20 65 78 70 72 65 73 73 69 6f 6e 73  s in expressions
19280 20 6f 66 20 74 68 65 0a 20 20 20 20 2a 2a 20 53   of the.    ** S
19290 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 2e  ELECT statement.
192a0 0a 20 20 20 20 2a 2f 0a 20 20 20 20 6d 65 6d 73  .    */.    mems
192b0 65 74 28 26 73 4e 43 2c 20 30 2c 20 73 69 7a 65  et(&sNC, 0, size
192c0 6f 66 28 73 4e 43 29 29 3b 0a 20 20 20 20 73 4e  of(sNC));.    sN
192d0 43 2e 70 50 61 72 73 65 20 3d 20 70 50 61 72 73  C.pParse = pPars
192e0 65 3b 0a 20 20 20 20 73 4e 43 2e 70 53 72 63 4c  e;.    sNC.pSrcL
192f0 69 73 74 20 3d 20 70 54 61 62 4c 69 73 74 3b 0a  ist = pTabList;.
19300 20 20 20 20 73 4e 43 2e 70 41 67 67 49 6e 66 6f      sNC.pAggInfo
19310 20 3d 20 26 73 41 67 67 49 6e 66 6f 3b 0a 20 20   = &sAggInfo;.  
19320 20 20 73 41 67 67 49 6e 66 6f 2e 6e 53 6f 72 74    sAggInfo.nSort
19330 69 6e 67 43 6f 6c 75 6d 6e 20 3d 20 70 47 72 6f  ingColumn = pGro
19340 75 70 42 79 20 3f 20 70 47 72 6f 75 70 42 79 2d  upBy ? pGroupBy-
19350 3e 6e 45 78 70 72 2b 31 20 3a 20 30 3b 0a 20 20  >nExpr+1 : 0;.  
19360 20 20 73 41 67 67 49 6e 66 6f 2e 70 47 72 6f 75    sAggInfo.pGrou
19370 70 42 79 20 3d 20 70 47 72 6f 75 70 42 79 3b 0a  pBy = pGroupBy;.
19380 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 45      if( sqlite3E
19390 78 70 72 41 6e 61 6c 79 7a 65 41 67 67 4c 69 73  xprAnalyzeAggLis
193a0 74 28 26 73 4e 43 2c 20 70 45 4c 69 73 74 29 20  t(&sNC, pEList) 
193b0 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 73 65  ){.      goto se
193c0 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 7d 0a  lect_end;.    }.
193d0 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 45      if( sqlite3E
193e0 78 70 72 41 6e 61 6c 79 7a 65 41 67 67 4c 69 73  xprAnalyzeAggLis
193f0 74 28 26 73 4e 43 2c 20 70 4f 72 64 65 72 42 79  t(&sNC, pOrderBy
19400 29 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20  ) ){.      goto 
19410 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20  select_end;.    
19420 7d 0a 20 20 20 20 69 66 28 20 70 48 61 76 69 6e  }.    if( pHavin
19430 67 20 26 26 20 73 71 6c 69 74 65 33 45 78 70 72  g && sqlite3Expr
19440 41 6e 61 6c 79 7a 65 41 67 67 72 65 67 61 74 65  AnalyzeAggregate
19450 73 28 26 73 4e 43 2c 20 70 48 61 76 69 6e 67 29  s(&sNC, pHaving)
19460 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 73   ){.      goto s
19470 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 7d  elect_end;.    }
19480 0a 20 20 20 20 73 41 67 67 49 6e 66 6f 2e 6e 41  .    sAggInfo.nA
19490 63 63 75 6d 75 6c 61 74 6f 72 20 3d 20 73 41 67  ccumulator = sAg
194a0 67 49 6e 66 6f 2e 6e 43 6f 6c 75 6d 6e 3b 0a 20  gInfo.nColumn;. 
194b0 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 73 41     for(i=0; i<sA
194c0 67 67 49 6e 66 6f 2e 6e 46 75 6e 63 3b 20 69 2b  ggInfo.nFunc; i+
194d0 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 73 71  +){.      if( sq
194e0 6c 69 74 65 33 45 78 70 72 41 6e 61 6c 79 7a 65  lite3ExprAnalyze
194f0 41 67 67 4c 69 73 74 28 26 73 4e 43 2c 20 73 41  AggList(&sNC, sA
19500 67 67 49 6e 66 6f 2e 61 46 75 6e 63 5b 69 5d 2e  ggInfo.aFunc[i].
19510 70 45 78 70 72 2d 3e 70 4c 69 73 74 29 20 29 7b  pExpr->pList) ){
19520 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 73 65  .        goto se
19530 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 20 20  lect_end;.      
19540 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  }.    }.    if( 
19550 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 46 61 69  sqlite3MallocFai
19560 6c 65 64 28 29 20 29 20 67 6f 74 6f 20 73 65 6c  led() ) goto sel
19570 65 63 74 5f 65 6e 64 3b 0a 0a 20 20 20 20 2f 2a  ect_end;..    /*
19580 20 50 72 6f 63 65 73 73 69 6e 67 20 66 6f 72 20   Processing for 
19590 61 67 67 72 65 67 61 74 65 73 20 77 69 74 68 20  aggregates with 
195a0 47 52 4f 55 50 20 42 59 20 69 73 20 76 65 72 79  GROUP BY is very
195b0 20 64 69 66 66 65 72 65 6e 74 20 61 6e 64 0a 20   different and. 
195c0 20 20 20 2a 2a 20 6d 75 63 68 20 6d 6f 72 65 20     ** much more 
195d0 63 6f 6d 70 6c 65 78 20 74 68 61 20 61 67 67 72  complex tha aggr
195e0 65 67 61 74 65 73 20 77 69 74 68 6f 75 74 20 61  egates without a
195f0 20 47 52 4f 55 50 20 42 59 2e 0a 20 20 20 20 2a   GROUP BY..    *
19600 2f 0a 20 20 20 20 69 66 28 20 70 47 72 6f 75 70  /.    if( pGroup
19610 42 79 20 29 7b 0a 20 20 20 20 20 20 4b 65 79 49  By ){.      KeyI
19620 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 3b 20 20  nfo *pKeyInfo;  
19630 2f 2a 20 4b 65 79 69 6e 67 20 69 6e 66 6f 72 6d  /* Keying inform
19640 61 74 69 6f 6e 20 66 6f 72 20 74 68 65 20 67 72  ation for the gr
19650 6f 75 70 20 62 79 20 63 6c 61 75 73 65 20 2a 2f  oup by clause */
19660 0a 0a 20 20 20 20 20 20 2f 2a 20 43 72 65 61 74  ..      /* Creat
19670 65 20 6c 61 62 65 6c 73 20 74 68 61 74 20 77 65  e labels that we
19680 20 77 69 6c 6c 20 62 65 20 6e 65 65 64 69 6e 67   will be needing
19690 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 0a  .      */.     .
196a0 20 20 20 20 20 20 61 64 64 72 49 6e 69 74 69 61        addrInitia
196b0 6c 69 7a 65 4c 6f 6f 70 20 3d 20 73 71 6c 69 74  lizeLoop = sqlit
196c0 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28  e3VdbeMakeLabel(
196d0 76 29 3b 0a 20 20 20 20 20 20 61 64 64 72 47 72  v);.      addrGr
196e0 6f 75 70 42 79 43 68 61 6e 67 65 20 3d 20 73 71  oupByChange = sq
196f0 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62  lite3VdbeMakeLab
19700 65 6c 28 76 29 3b 0a 20 20 20 20 20 20 61 64 64  el(v);.      add
19710 72 50 72 6f 63 65 73 73 52 6f 77 20 3d 20 73 71  rProcessRow = sq
19720 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62  lite3VdbeMakeLab
19730 65 6c 28 76 29 3b 0a 0a 20 20 20 20 20 20 2f 2a  el(v);..      /*
19740 20 49 66 20 74 68 65 72 65 20 69 73 20 61 20 47   If there is a G
19750 52 4f 55 50 20 42 59 20 63 6c 61 75 73 65 20 77  ROUP BY clause w
19760 65 20 6d 69 67 68 74 20 6e 65 65 64 20 61 20 73  e might need a s
19770 6f 72 74 69 6e 67 20 69 6e 64 65 78 20 74 6f 0a  orting index to.
19780 20 20 20 20 20 20 2a 2a 20 69 6d 70 6c 65 6d 65        ** impleme
19790 6e 74 20 69 74 2e 20 20 41 6c 6c 6f 63 61 74 65  nt it.  Allocate
197a0 20 74 68 61 74 20 73 6f 72 74 69 6e 67 20 69 6e   that sorting in
197b0 64 65 78 20 6e 6f 77 2e 20 20 49 66 20 69 74 20  dex now.  If it 
197c0 74 75 72 6e 73 20 6f 75 74 0a 20 20 20 20 20 20  turns out.      
197d0 2a 2a 20 74 68 61 74 20 77 65 20 64 6f 20 6e 6f  ** that we do no
197e0 74 20 6e 65 65 64 20 69 74 20 61 66 74 65 72 20  t need it after 
197f0 61 6c 6c 2c 20 74 68 65 20 4f 70 65 6e 45 70 68  all, the OpenEph
19800 65 6d 65 72 61 6c 20 69 6e 73 74 72 75 63 74 69  emeral instructi
19810 6f 6e 0a 20 20 20 20 20 20 2a 2a 20 77 69 6c 6c  on.      ** will
19820 20 62 65 20 63 6f 6e 76 65 72 74 65 64 20 69 6e   be converted in
19830 74 6f 20 61 20 4e 6f 6f 70 2e 20 20 0a 20 20 20  to a Noop.  .   
19840 20 20 20 2a 2f 0a 20 20 20 20 20 20 73 41 67 67     */.      sAgg
19850 49 6e 66 6f 2e 73 6f 72 74 69 6e 67 49 64 78 20  Info.sortingIdx 
19860 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b  = pParse->nTab++
19870 3b 0a 20 20 20 20 20 20 70 4b 65 79 49 6e 66 6f  ;.      pKeyInfo
19880 20 3d 20 6b 65 79 49 6e 66 6f 46 72 6f 6d 45 78   = keyInfoFromEx
19890 70 72 4c 69 73 74 28 70 50 61 72 73 65 2c 20 70  prList(pParse, p
198a0 47 72 6f 75 70 42 79 29 3b 0a 20 20 20 20 20 20  GroupBy);.      
198b0 61 64 64 72 53 6f 72 74 69 6e 67 49 64 78 20 3d  addrSortingIdx =
198c0 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
198d0 65 33 56 64 62 65 4f 70 33 28 76 2c 20 4f 50 5f  e3VdbeOp3(v, OP_
198e0 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 2c 20 73  OpenEphemeral, s
198f0 41 67 67 49 6e 66 6f 2e 73 6f 72 74 69 6e 67 49  AggInfo.sortingI
19900 64 78 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  dx,.            
19910 20 20 20 20 20 20 20 20 20 20 20 20 20 73 41 67               sAg
19920 67 49 6e 66 6f 2e 6e 53 6f 72 74 69 6e 67 43 6f  gInfo.nSortingCo
19930 6c 75 6d 6e 2c 0a 20 20 20 20 20 20 20 20 20 20  lumn,.          
19940 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28                 (
19950 63 68 61 72 2a 29 70 4b 65 79 49 6e 66 6f 2c 20  char*)pKeyInfo, 
19960 50 33 5f 4b 45 59 49 4e 46 4f 5f 48 41 4e 44 4f  P3_KEYINFO_HANDO
19970 46 46 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 49  FF);..      /* I
19980 6e 69 74 69 61 6c 69 7a 65 20 6d 65 6d 6f 72 79  nitialize memory
19990 20 6c 6f 63 61 74 69 6f 6e 73 20 75 73 65 64 20   locations used 
199a0 62 79 20 47 52 4f 55 50 20 42 59 20 61 67 67 72  by GROUP BY aggr
199b0 65 67 61 74 65 20 70 72 6f 63 65 73 73 69 6e 67  egate processing
199c0 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
199d0 69 55 73 65 46 6c 61 67 20 3d 20 70 50 61 72 73  iUseFlag = pPars
199e0 65 2d 3e 6e 4d 65 6d 2b 2b 3b 0a 20 20 20 20 20  e->nMem++;.     
199f0 20 69 41 62 6f 72 74 46 6c 61 67 20 3d 20 70 50   iAbortFlag = pP
19a00 61 72 73 65 2d 3e 6e 4d 65 6d 2b 2b 3b 0a 20 20  arse->nMem++;.  
19a10 20 20 20 20 69 41 4d 65 6d 20 3d 20 70 50 61 72      iAMem = pPar
19a20 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20  se->nMem;.      
19a30 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d 20  pParse->nMem += 
19a40 70 47 72 6f 75 70 42 79 2d 3e 6e 45 78 70 72 3b  pGroupBy->nExpr;
19a50 0a 20 20 20 20 20 20 69 42 4d 65 6d 20 3d 20 70  .      iBMem = p
19a60 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20  Parse->nMem;.   
19a70 20 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20     pParse->nMem 
19a80 2b 3d 20 70 47 72 6f 75 70 42 79 2d 3e 6e 45 78  += pGroupBy->nEx
19a90 70 72 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  pr;.      sqlite
19aa0 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
19ab0 5f 4d 65 6d 49 6e 74 2c 20 30 2c 20 69 41 62 6f  _MemInt, 0, iAbo
19ac0 72 74 46 6c 61 67 29 3b 0a 20 20 20 20 20 20 56  rtFlag);.      V
19ad0 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22  dbeComment((v, "
19ae0 23 20 63 6c 65 61 72 20 61 62 6f 72 74 20 66 6c  # clear abort fl
19af0 61 67 22 29 29 3b 0a 20 20 20 20 20 20 73 71 6c  ag"));.      sql
19b00 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
19b10 20 4f 50 5f 4d 65 6d 49 6e 74 2c 20 30 2c 20 69   OP_MemInt, 0, i
19b20 55 73 65 46 6c 61 67 29 3b 0a 20 20 20 20 20 20  UseFlag);.      
19b30 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20  VdbeComment((v, 
19b40 22 23 20 69 6e 64 69 63 61 74 65 20 61 63 63 75  "# indicate accu
19b50 6d 75 6c 61 74 6f 72 20 65 6d 70 74 79 22 29 29  mulator empty"))
19b60 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
19b70 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 47  dbeAddOp(v, OP_G
19b80 6f 74 6f 2c 20 30 2c 20 61 64 64 72 49 6e 69 74  oto, 0, addrInit
19b90 69 61 6c 69 7a 65 4c 6f 6f 70 29 3b 0a 0a 20 20  ializeLoop);..  
19ba0 20 20 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20      /* Generate 
19bb0 61 20 73 75 62 72 6f 75 74 69 6e 65 20 74 68 61  a subroutine tha
19bc0 74 20 6f 75 74 70 75 74 73 20 61 20 73 69 6e 67  t outputs a sing
19bd0 6c 65 20 72 6f 77 20 6f 66 20 74 68 65 20 72 65  le row of the re
19be0 73 75 6c 74 0a 20 20 20 20 20 20 2a 2a 20 73 65  sult.      ** se
19bf0 74 2e 20 20 54 68 69 73 20 73 75 62 72 6f 75 74  t.  This subrout
19c00 69 6e 65 20 66 69 72 73 74 20 6c 6f 6f 6b 73 20  ine first looks 
19c10 61 74 20 74 68 65 20 69 55 73 65 46 6c 61 67 2e  at the iUseFlag.
19c20 20 20 49 66 20 69 55 73 65 46 6c 61 67 0a 20 20    If iUseFlag.  
19c30 20 20 20 20 2a 2a 20 69 73 20 6c 65 73 73 20 74      ** is less t
19c40 68 61 6e 20 6f 72 20 65 71 75 61 6c 20 74 6f 20  han or equal to 
19c50 7a 65 72 6f 2c 20 74 68 65 20 73 75 62 72 6f 75  zero, the subrou
19c60 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70 2e  tine is a no-op.
19c70 20 20 49 66 0a 20 20 20 20 20 20 2a 2a 20 74 68    If.      ** th
19c80 65 20 70 72 6f 63 65 73 73 69 6e 67 20 63 61 6c  e processing cal
19c90 6c 73 20 66 6f 72 20 74 68 65 20 71 75 65 72 79  ls for the query
19ca0 20 74 6f 20 61 62 6f 72 74 2c 20 74 68 69 73 20   to abort, this 
19cb0 73 75 62 72 6f 75 74 69 6e 65 0a 20 20 20 20 20  subroutine.     
19cc0 20 2a 2a 20 69 6e 63 72 65 6d 65 6e 74 73 20 74   ** increments t
19cd0 68 65 20 69 41 62 6f 72 74 46 6c 61 67 20 6d 65  he iAbortFlag me
19ce0 6d 6f 72 79 20 6c 6f 63 61 74 69 6f 6e 20 62 65  mory location be
19cf0 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 20 69  fore returning i
19d00 6e 0a 20 20 20 20 20 20 2a 2a 20 6f 72 64 65 72  n.      ** order
19d10 20 74 6f 20 73 69 67 6e 61 6c 20 74 68 65 20 63   to signal the c
19d20 61 6c 6c 65 72 20 74 6f 20 61 62 6f 72 74 2e 0a  aller to abort..
19d30 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 61        */.      a
19d40 64 64 72 53 65 74 41 62 6f 72 74 20 3d 20 73 71  ddrSetAbort = sq
19d50 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74  lite3VdbeCurrent
19d60 41 64 64 72 28 76 29 3b 0a 20 20 20 20 20 20 73  Addr(v);.      s
19d70 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
19d80 76 2c 20 4f 50 5f 4d 65 6d 49 6e 74 2c 20 31 2c  v, OP_MemInt, 1,
19d90 20 69 41 62 6f 72 74 46 6c 61 67 29 3b 0a 20 20   iAbortFlag);.  
19da0 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28      VdbeComment(
19db0 28 76 2c 20 22 23 20 73 65 74 20 61 62 6f 72 74  (v, "# set abort
19dc0 20 66 6c 61 67 22 29 29 3b 0a 20 20 20 20 20 20   flag"));.      
19dd0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
19de0 28 76 2c 20 4f 50 5f 52 65 74 75 72 6e 2c 20 30  (v, OP_Return, 0
19df0 2c 20 30 29 3b 0a 20 20 20 20 20 20 61 64 64 72  , 0);.      addr
19e00 4f 75 74 70 75 74 52 6f 77 20 3d 20 73 71 6c 69  OutputRow = sqli
19e10 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64  te3VdbeCurrentAd
19e20 64 72 28 76 29 3b 0a 20 20 20 20 20 20 73 71 6c  dr(v);.      sql
19e30 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
19e40 20 4f 50 5f 49 66 4d 65 6d 50 6f 73 2c 20 69 55   OP_IfMemPos, iU
19e50 73 65 46 6c 61 67 2c 20 61 64 64 72 4f 75 74 70  seFlag, addrOutp
19e60 75 74 52 6f 77 2b 32 29 3b 0a 20 20 20 20 20 20  utRow+2);.      
19e70 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20  VdbeComment((v, 
19e80 22 23 20 47 72 6f 75 70 62 79 20 72 65 73 75 6c  "# Groupby resul
19e90 74 20 67 65 6e 65 72 61 74 6f 72 20 65 6e 74 72  t generator entr
19ea0 79 20 70 6f 69 6e 74 22 29 29 3b 0a 20 20 20 20  y point"));.    
19eb0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
19ec0 4f 70 28 76 2c 20 4f 50 5f 52 65 74 75 72 6e 2c  Op(v, OP_Return,
19ed0 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 66 69   0, 0);.      fi
19ee0 6e 61 6c 69 7a 65 41 67 67 46 75 6e 63 74 69 6f  nalizeAggFunctio
19ef0 6e 73 28 70 50 61 72 73 65 2c 20 26 73 41 67 67  ns(pParse, &sAgg
19f00 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20 69 66 28  Info);.      if(
19f10 20 70 48 61 76 69 6e 67 20 29 7b 0a 20 20 20 20   pHaving ){.    
19f20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 49      sqlite3ExprI
19f30 66 46 61 6c 73 65 28 70 50 61 72 73 65 2c 20 70  fFalse(pParse, p
19f40 48 61 76 69 6e 67 2c 20 61 64 64 72 4f 75 74 70  Having, addrOutp
19f50 75 74 52 6f 77 2b 31 2c 20 31 29 3b 0a 20 20 20  utRow+1, 1);.   
19f60 20 20 20 7d 0a 20 20 20 20 20 20 72 63 20 3d 20     }.      rc = 
19f70 73 65 6c 65 63 74 49 6e 6e 65 72 4c 6f 6f 70 28  selectInnerLoop(
19f80 70 50 61 72 73 65 2c 20 70 2c 20 70 2d 3e 70 45  pParse, p, p->pE
19f90 4c 69 73 74 2c 20 30 2c 20 30 2c 20 70 4f 72 64  List, 0, 0, pOrd
19fa0 65 72 42 79 2c 0a 20 20 20 20 20 20 20 20 20 20  erBy,.          
19fb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19fc0 20 64 69 73 74 69 6e 63 74 2c 20 65 44 65 73 74   distinct, eDest
19fd0 2c 20 69 50 61 72 6d 2c 20 0a 20 20 20 20 20 20  , iParm, .      
19fe0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19ff0 20 20 20 20 20 61 64 64 72 4f 75 74 70 75 74 52       addrOutputR
1a000 6f 77 2b 31 2c 20 61 64 64 72 53 65 74 41 62 6f  ow+1, addrSetAbo
1a010 72 74 2c 20 61 66 66 29 3b 0a 20 20 20 20 20 20  rt, aff);.      
1a020 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20  if( rc ){.      
1a030 20 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e    goto select_en
1a040 64 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  d;.      }.     
1a050 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
1a060 70 28 76 2c 20 4f 50 5f 52 65 74 75 72 6e 2c 20  p(v, OP_Return, 
1a070 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 56 64 62  0, 0);.      Vdb
1a080 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 23 20  eComment((v, "# 
1a090 65 6e 64 20 67 72 6f 75 70 62 79 20 72 65 73 75  end groupby resu
1a0a0 6c 74 20 67 65 6e 65 72 61 74 6f 72 22 29 29 3b  lt generator"));
1a0b0 0a 0a 20 20 20 20 20 20 2f 2a 20 47 65 6e 65 72  ..      /* Gener
1a0c0 61 74 65 20 61 20 73 75 62 72 6f 75 74 69 6e 65  ate a subroutine
1a0d0 20 74 68 61 74 20 77 69 6c 6c 20 72 65 73 65 74   that will reset
1a0e0 20 74 68 65 20 67 72 6f 75 70 2d 62 79 20 61 63   the group-by ac
1a0f0 63 75 6d 75 6c 61 74 6f 72 0a 20 20 20 20 20 20  cumulator.      
1a100 2a 2f 0a 20 20 20 20 20 20 61 64 64 72 52 65 73  */.      addrRes
1a110 65 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  et = sqlite3Vdbe
1a120 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b 0a  CurrentAddr(v);.
1a130 20 20 20 20 20 20 72 65 73 65 74 41 63 63 75 6d        resetAccum
1a140 75 6c 61 74 6f 72 28 70 50 61 72 73 65 2c 20 26  ulator(pParse, &
1a150 73 41 67 67 49 6e 66 6f 29 3b 0a 20 20 20 20 20  sAggInfo);.     
1a160 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
1a170 70 28 76 2c 20 4f 50 5f 52 65 74 75 72 6e 2c 20  p(v, OP_Return, 
1a180 30 2c 20 30 29 3b 0a 0a 20 20 20 20 20 20 2f 2a  0, 0);..      /*
1a190 20 42 65 67 69 6e 20 61 20 6c 6f 6f 70 20 74 68   Begin a loop th
1a1a0 61 74 20 77 69 6c 6c 20 65 78 74 72 61 63 74 20  at will extract 
1a1b0 61 6c 6c 20 73 6f 75 72 63 65 20 72 6f 77 73 20  all source rows 
1a1c0 69 6e 20 47 52 4f 55 50 20 42 59 20 6f 72 64 65  in GROUP BY orde
1a1d0 72 2e 0a 20 20 20 20 20 20 2a 2a 20 54 68 69 73  r..      ** This
1a1e0 20 6d 69 67 68 74 20 69 6e 76 6f 6c 76 65 20 74   might involve t
1a1f0 77 6f 20 73 65 70 61 72 61 74 65 20 6c 6f 6f 70  wo separate loop
1a200 73 20 77 69 74 68 20 61 6e 20 4f 50 5f 53 6f 72  s with an OP_Sor
1a210 74 20 69 6e 20 62 65 74 77 65 65 6e 2c 20 6f 72  t in between, or
1a220 0a 20 20 20 20 20 20 2a 2a 20 69 74 20 6d 69 67  .      ** it mig
1a230 68 74 20 62 65 20 61 20 73 69 6e 67 6c 65 20 6c  ht be a single l
1a240 6f 6f 70 20 74 68 61 74 20 75 73 65 73 20 61 6e  oop that uses an
1a250 20 69 6e 64 65 78 20 74 6f 20 65 78 74 72 61 63   index to extrac
1a260 74 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 0a 20 20  t information.  
1a270 20 20 20 20 2a 2a 20 69 6e 20 74 68 65 20 72 69      ** in the ri
1a280 67 68 74 20 6f 72 64 65 72 20 74 6f 20 62 65 67  ght order to beg
1a290 69 6e 20 77 69 74 68 2e 0a 20 20 20 20 20 20 2a  in with..      *
1a2a0 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  /.      sqlite3V
1a2b0 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28  dbeResolveLabel(
1a2c0 76 2c 20 61 64 64 72 49 6e 69 74 69 61 6c 69 7a  v, addrInitializ
1a2d0 65 4c 6f 6f 70 29 3b 0a 20 20 20 20 20 20 73 71  eLoop);.      sq
1a2e0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
1a2f0 2c 20 4f 50 5f 47 6f 73 75 62 2c 20 30 2c 20 61  , OP_Gosub, 0, a
1a300 64 64 72 52 65 73 65 74 29 3b 0a 20 20 20 20 20  ddrReset);.     
1a310 20 70 57 49 6e 66 6f 20 3d 20 73 71 6c 69 74 65   pWInfo = sqlite
1a320 33 57 68 65 72 65 42 65 67 69 6e 28 70 50 61 72  3WhereBegin(pPar
1a330 73 65 2c 20 70 54 61 62 4c 69 73 74 2c 20 70 57  se, pTabList, pW
1a340 68 65 72 65 2c 20 26 70 47 72 6f 75 70 42 79 29  here, &pGroupBy)
1a350 3b 0a 20 20 20 20 20 20 69 66 28 20 70 57 49 6e  ;.      if( pWIn
1a360 66 6f 3d 3d 30 20 29 20 67 6f 74 6f 20 73 65 6c  fo==0 ) goto sel
1a370 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 20 20 69  ect_end;.      i
1a380 66 28 20 70 47 72 6f 75 70 42 79 3d 3d 30 20 29  f( pGroupBy==0 )
1a390 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65  {.        /* The
1a3a0 20 6f 70 74 69 6d 69 7a 65 72 20 69 73 20 61 62   optimizer is ab
1a3b0 6c 65 20 74 6f 20 64 65 6c 69 76 65 72 20 72 6f  le to deliver ro
1a3c0 77 73 20 69 6e 20 67 72 6f 75 70 20 62 79 20 6f  ws in group by o
1a3d0 72 64 65 72 20 73 6f 0a 20 20 20 20 20 20 20 20  rder so.        
1a3e0 2a 2a 20 77 65 20 64 6f 20 6e 6f 74 20 68 61 76  ** we do not hav
1a3f0 65 20 74 6f 20 73 6f 72 74 2e 20 20 54 68 65 20  e to sort.  The 
1a400 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c  OP_OpenEphemeral
1a410 20 74 61 62 6c 65 20 77 69 6c 6c 20 62 65 0a 20   table will be. 
1a420 20 20 20 20 20 20 20 2a 2a 20 63 61 6e 63 65 6c         ** cancel
1a430 6c 65 64 20 6c 61 74 65 72 20 62 65 63 61 75 73  led later becaus
1a440 65 20 77 65 20 73 74 69 6c 6c 20 6e 65 65 64 20  e we still need 
1a450 74 6f 20 75 73 65 20 74 68 65 20 70 4b 65 79 49  to use the pKeyI
1a460 6e 66 6f 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20  nfo.        */. 
1a470 20 20 20 20 20 20 20 70 47 72 6f 75 70 42 79 20         pGroupBy 
1a480 3d 20 70 2d 3e 70 47 72 6f 75 70 42 79 3b 0a 20  = p->pGroupBy;. 
1a490 20 20 20 20 20 20 20 67 72 6f 75 70 42 79 53 6f         groupBySo
1a4a0 72 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 65  rt = 0;.      }e
1a4b0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  lse{.        /* 
1a4c0 52 6f 77 73 20 61 72 65 20 63 6f 6d 69 6e 67 20  Rows are coming 
1a4d0 6f 75 74 20 69 6e 20 75 6e 64 65 74 65 72 6d 69  out in undetermi
1a4e0 6e 65 64 20 6f 72 64 65 72 2e 20 20 57 65 20 68  ned order.  We h
1a4f0 61 76 65 20 74 6f 20 70 75 73 68 0a 20 20 20 20  ave to push.    
1a500 20 20 20 20 2a 2a 20 65 61 63 68 20 72 6f 77 20      ** each row 
1a510 69 6e 74 6f 20 61 20 73 6f 72 74 69 6e 67 20 69  into a sorting i
1a520 6e 64 65 78 2c 20 74 65 72 6d 69 6e 61 74 65 20  ndex, terminate 
1a530 74 68 65 20 66 69 72 73 74 20 6c 6f 6f 70 2c 0a  the first loop,.
1a540 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65 6e 20          ** then 
1a550 6c 6f 6f 70 20 6f 76 65 72 20 74 68 65 20 73 6f  loop over the so
1a560 72 74 69 6e 67 20 69 6e 64 65 78 20 69 6e 20 6f  rting index in o
1a570 72 64 65 72 20 74 6f 20 67 65 74 20 74 68 65 20  rder to get the 
1a580 6f 75 74 70 75 74 0a 20 20 20 20 20 20 20 20 2a  output.        *
1a590 2a 20 69 6e 20 73 6f 72 74 65 64 20 6f 72 64 65  * in sorted orde
1a5a0 72 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20  r.        */.   
1a5b0 20 20 20 20 20 67 72 6f 75 70 42 79 53 6f 72 74       groupBySort
1a5c0 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 73 71   = 1;.        sq
1a5d0 6c 69 74 65 33 45 78 70 72 43 6f 64 65 45 78 70  lite3ExprCodeExp
1a5e0 72 4c 69 73 74 28 70 50 61 72 73 65 2c 20 70 47  rList(pParse, pG
1a5f0 72 6f 75 70 42 79 29 3b 0a 20 20 20 20 20 20 20  roupBy);.       
1a600 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
1a610 70 28 76 2c 20 4f 50 5f 53 65 71 75 65 6e 63 65  p(v, OP_Sequence
1a620 2c 20 73 41 67 67 49 6e 66 6f 2e 73 6f 72 74 69  , sAggInfo.sorti
1a630 6e 67 49 64 78 2c 20 30 29 3b 0a 20 20 20 20 20  ngIdx, 0);.     
1a640 20 20 20 6a 20 3d 20 70 47 72 6f 75 70 42 79 2d     j = pGroupBy-
1a650 3e 6e 45 78 70 72 2b 31 3b 0a 20 20 20 20 20 20  >nExpr+1;.      
1a660 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 73 41 67    for(i=0; i<sAg
1a670 67 49 6e 66 6f 2e 6e 43 6f 6c 75 6d 6e 3b 20 69  gInfo.nColumn; i
1a680 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73  ++){.          s
1a690 74 72 75 63 74 20 41 67 67 49 6e 66 6f 5f 63 6f  truct AggInfo_co
1a6a0 6c 20 2a 70 43 6f 6c 20 3d 20 26 73 41 67 67 49  l *pCol = &sAggI
1a6b0 6e 66 6f 2e 61 43 6f 6c 5b 69 5d 3b 0a 20 20 20  nfo.aCol[i];.   
1a6c0 20 20 20 20 20 20 20 69 66 28 20 70 43 6f 6c 2d         if( pCol-
1a6d0 3e 69 53 6f 72 74 65 72 43 6f 6c 75 6d 6e 3c 6a  >iSorterColumn<j
1a6e0 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
1a6f0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78         sqlite3Ex
1a700 70 72 43 6f 64 65 47 65 74 43 6f 6c 75 6d 6e 28  prCodeGetColumn(
1a710 76 2c 20 70 43 6f 6c 2d 3e 70 54 61 62 2c 20 70  v, pCol->pTab, p
1a720 43 6f 6c 2d 3e 69 43 6f 6c 75 6d 6e 2c 20 70 43  Col->iColumn, pC
1a730 6f 6c 2d 3e 69 54 61 62 6c 65 29 3b 0a 20 20 20  ol->iTable);.   
1a740 20 20 20 20 20 20 20 6a 2b 2b 3b 0a 20 20 20 20         j++;.    
1a750 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 73 71      }.        sq
1a760 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
1a770 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c  , OP_MakeRecord,
1a780 20 6a 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20   j, 0);.        
1a790 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
1a7a0 28 76 2c 20 4f 50 5f 49 64 78 49 6e 73 65 72 74  (v, OP_IdxInsert
1a7b0 2c 20 73 41 67 67 49 6e 66 6f 2e 73 6f 72 74 69  , sAggInfo.sorti
1a7c0 6e 67 49 64 78 2c 20 30 29 3b 0a 20 20 20 20 20  ngIdx, 0);.     
1a7d0 20 20 20 73 71 6c 69 74 65 33 57 68 65 72 65 45     sqlite3WhereE
1a7e0 6e 64 28 70 57 49 6e 66 6f 29 3b 0a 20 20 20 20  nd(pWInfo);.    
1a7f0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
1a800 64 64 4f 70 28 76 2c 20 4f 50 5f 53 6f 72 74 2c  ddOp(v, OP_Sort,
1a810 20 73 41 67 67 49 6e 66 6f 2e 73 6f 72 74 69 6e   sAggInfo.sortin
1a820 67 49 64 78 2c 20 61 64 64 72 45 6e 64 29 3b 0a  gIdx, addrEnd);.
1a830 20 20 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d          VdbeComm
1a840 65 6e 74 28 28 76 2c 20 22 23 20 47 52 4f 55 50  ent((v, "# GROUP
1a850 20 42 59 20 73 6f 72 74 22 29 29 3b 0a 20 20 20   BY sort"));.   
1a860 20 20 20 20 20 73 41 67 67 49 6e 66 6f 2e 75 73       sAggInfo.us
1a870 65 53 6f 72 74 69 6e 67 49 64 78 20 3d 20 31 3b  eSortingIdx = 1;
1a880 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20  .      }..      
1a890 2f 2a 20 45 76 61 6c 75 61 74 65 20 74 68 65 20  /* Evaluate the 
1a8a0 63 75 72 72 65 6e 74 20 47 52 4f 55 50 20 42 59  current GROUP BY
1a8b0 20 74 65 72 6d 73 20 61 6e 64 20 73 74 6f 72 65   terms and store
1a8c0 20 69 6e 20 62 30 2c 20 62 31 2c 20 62 32 2e 2e   in b0, b1, b2..
1a8d0 2e 0a 20 20 20 20 20 20 2a 2a 20 28 62 30 20 69  ..      ** (b0 i
1a8e0 73 20 6d 65 6d 6f 72 79 20 6c 6f 63 61 74 69 6f  s memory locatio
1a8f0 6e 20 69 42 4d 65 6d 2b 30 2c 20 62 31 20 69 73  n iBMem+0, b1 is
1a900 20 69 42 4d 65 6d 2b 31 2c 20 61 6e 64 20 73 6f   iBMem+1, and so
1a910 20 66 6f 72 74 68 29 0a 20 20 20 20 20 20 2a 2a   forth).      **
1a920 20 54 68 65 6e 20 63 6f 6d 70 61 72 65 20 74 68   Then compare th
1a930 65 20 63 75 72 72 65 6e 74 20 47 52 4f 55 50 20  e current GROUP 
1a940 42 59 20 74 65 72 6d 73 20 61 67 61 69 6e 73 74  BY terms against
1a950 20 74 68 65 20 47 52 4f 55 50 20 42 59 20 74 65   the GROUP BY te
1a960 72 6d 73 0a 20 20 20 20 20 20 2a 2a 20 66 72 6f  rms.      ** fro
1a970 6d 20 74 68 65 20 70 72 65 76 69 6f 75 73 20 72  m the previous r
1a980 6f 77 20 63 75 72 72 65 6e 74 6c 79 20 73 74 6f  ow currently sto
1a990 72 65 64 20 69 6e 20 61 30 2c 20 61 31 2c 20 61  red in a0, a1, a
1a9a0 32 2e 2e 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  2....      */.  
1a9b0 20 20 20 20 61 64 64 72 54 6f 70 4f 66 4c 6f 6f      addrTopOfLoo
1a9c0 70 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43  p = sqlite3VdbeC
1a9d0 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 20  urrentAddr(v);. 
1a9e0 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c       for(j=0; j<
1a9f0 70 47 72 6f 75 70 42 79 2d 3e 6e 45 78 70 72 3b  pGroupBy->nExpr;
1aa00 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69   j++){.        i
1aa10 66 28 20 67 72 6f 75 70 42 79 53 6f 72 74 20 29  f( groupBySort )
1aa20 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  {.          sqli
1aa30 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
1aa40 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 73 41 67 67 49  OP_Column, sAggI
1aa50 6e 66 6f 2e 73 6f 72 74 69 6e 67 49 64 78 2c 20  nfo.sortingIdx, 
1aa60 6a 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  j);.        }els
1aa70 65 7b 0a 20 20 20 20 20 20 20 20 20 20 73 41 67  e{.          sAg
1aa80 67 49 6e 66 6f 2e 64 69 72 65 63 74 4d 6f 64 65  gInfo.directMode
1aa90 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20   = 1;.          
1aaa0 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28  sqlite3ExprCode(
1aab0 70 50 61 72 73 65 2c 20 70 47 72 6f 75 70 42 79  pParse, pGroupBy
1aac0 2d 3e 61 5b 6a 5d 2e 70 45 78 70 72 29 3b 0a 20  ->a[j].pExpr);. 
1aad0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
1aae0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
1aaf0 70 28 76 2c 20 4f 50 5f 4d 65 6d 53 74 6f 72 65  p(v, OP_MemStore
1ab00 2c 20 69 42 4d 65 6d 2b 6a 2c 20 6a 3c 70 47 72  , iBMem+j, j<pGr
1ab10 6f 75 70 42 79 2d 3e 6e 45 78 70 72 2d 31 29 3b  oupBy->nExpr-1);
1ab20 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 66  .      }.      f
1ab30 6f 72 28 6a 3d 70 47 72 6f 75 70 42 79 2d 3e 6e  or(j=pGroupBy->n
1ab40 45 78 70 72 2d 31 3b 20 6a 3e 3d 30 3b 20 6a 2d  Expr-1; j>=0; j-
1ab50 2d 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20  -){.        if( 
1ab60 6a 3c 70 47 72 6f 75 70 42 79 2d 3e 6e 45 78 70  j<pGroupBy->nExp
1ab70 72 2d 31 20 29 7b 0a 20 20 20 20 20 20 20 20 20  r-1 ){.         
1ab80 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
1ab90 70 28 76 2c 20 4f 50 5f 4d 65 6d 4c 6f 61 64 2c  p(v, OP_MemLoad,
1aba0 20 69 42 4d 65 6d 2b 6a 2c 20 30 29 3b 0a 20 20   iBMem+j, 0);.  
1abb0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
1abc0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
1abd0 28 76 2c 20 4f 50 5f 4d 65 6d 4c 6f 61 64 2c 20  (v, OP_MemLoad, 
1abe0 69 41 4d 65 6d 2b 6a 2c 20 30 29 3b 0a 20 20 20  iAMem+j, 0);.   
1abf0 20 20 20 20 20 69 66 28 20 6a 3d 3d 30 20 29 7b       if( j==0 ){
1ac00 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
1ac10 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
1ac20 50 5f 45 71 2c 20 30 78 32 30 30 2c 20 61 64 64  P_Eq, 0x200, add
1ac30 72 50 72 6f 63 65 73 73 52 6f 77 29 3b 0a 20 20  rProcessRow);.  
1ac40 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
1ac50 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
1ac60 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4e 65  beAddOp(v, OP_Ne
1ac70 2c 20 30 78 32 30 30 2c 20 61 64 64 72 47 72 6f  , 0x200, addrGro
1ac80 75 70 42 79 43 68 61 6e 67 65 29 3b 0a 20 20 20  upByChange);.   
1ac90 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 73       }.        s
1aca0 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65  qlite3VdbeChange
1acb0 50 33 28 76 2c 20 2d 31 2c 20 28 76 6f 69 64 2a  P3(v, -1, (void*
1acc0 29 70 4b 65 79 49 6e 66 6f 2d 3e 61 43 6f 6c 6c  )pKeyInfo->aColl
1acd0 5b 6a 5d 2c 20 50 33 5f 43 4f 4c 4c 53 45 51 29  [j], P3_COLLSEQ)
1ace0 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20  ;.      }..     
1acf0 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64   /* Generate cod
1ad00 65 20 74 68 61 74 20 72 75 6e 73 20 77 68 65 6e  e that runs when
1ad10 65 76 65 72 20 74 68 65 20 47 52 4f 55 50 20 42  ever the GROUP B
1ad20 59 20 63 68 61 6e 67 65 73 2e 0a 20 20 20 20 20  Y changes..     
1ad30 20 2a 2a 20 43 68 61 6e 67 65 20 69 6e 20 74 68   ** Change in th
1ad40 65 20 47 52 4f 55 50 20 42 59 20 61 72 65 20 64  e GROUP BY are d
1ad50 65 74 65 63 74 65 64 20 62 79 20 74 68 65 20 70  etected by the p
1ad60 72 65 76 69 6f 75 73 20 63 6f 64 65 0a 20 20 20  revious code.   
1ad70 20 20 20 2a 2a 20 62 6c 6f 63 6b 2e 20 20 49 66     ** block.  If
1ad80 20 74 68 65 72 65 20 77 65 72 65 20 6e 6f 20 63   there were no c
1ad90 68 61 6e 67 65 73 2c 20 74 68 69 73 20 62 6c 6f  hanges, this blo
1ada0 63 6b 20 69 73 20 73 6b 69 70 70 65 64 2e 0a 20  ck is skipped.. 
1adb0 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a       **.      **
1adc0 20 54 68 69 73 20 63 6f 64 65 20 63 6f 70 69 65   This code copie
1add0 73 20 63 75 72 72 65 6e 74 20 67 72 6f 75 70 20  s current group 
1ade0 62 79 20 74 65 72 6d 73 20 69 6e 20 62 30 2c 62  by terms in b0,b
1adf0 31 2c 62 32 2c 2e 2e 2e 0a 20 20 20 20 20 20 2a  1,b2,....      *
1ae00 2a 20 6f 76 65 72 20 74 6f 20 61 30 2c 61 31 2c  * over to a0,a1,
1ae10 61 32 2e 20 20 49 74 20 74 68 65 6e 20 63 61 6c  a2.  It then cal
1ae20 6c 73 20 74 68 65 20 6f 75 74 70 75 74 20 73 75  ls the output su
1ae30 62 72 6f 75 74 69 6e 65 0a 20 20 20 20 20 20 2a  broutine.      *
1ae40 2a 20 61 6e 64 20 72 65 73 65 74 73 20 74 68 65  * and resets the
1ae50 20 61 67 67 72 65 67 61 74 65 20 61 63 63 75 6d   aggregate accum
1ae60 75 6c 61 74 6f 72 20 72 65 67 69 73 74 65 72 73  ulator registers
1ae70 20 69 6e 20 70 72 65 70 61 72 61 74 69 6f 6e 0a   in preparation.
1ae80 20 20 20 20 20 20 2a 2a 20 66 6f 72 20 74 68 65        ** for the
1ae90 20 6e 65 78 74 20 47 52 4f 55 50 20 42 59 20 62   next GROUP BY b
1aea0 61 74 63 68 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  atch..      */. 
1aeb0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
1aec0 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20  ResolveLabel(v, 
1aed0 61 64 64 72 47 72 6f 75 70 42 79 43 68 61 6e 67  addrGroupByChang
1aee0 65 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d  e);.      for(j=
1aef0 30 3b 20 6a 3c 70 47 72 6f 75 70 42 79 2d 3e 6e  0; j<pGroupBy->n
1af00 45 78 70 72 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20  Expr; j++){.    
1af10 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
1af20 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 65 6d 4d 6f  ddOp(v, OP_MemMo
1af30 76 65 2c 20 69 41 4d 65 6d 2b 6a 2c 20 69 42 4d  ve, iAMem+j, iBM
1af40 65 6d 2b 6a 29 3b 0a 20 20 20 20 20 20 7d 0a 20  em+j);.      }. 
1af50 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
1af60 41 64 64 4f 70 28 76 2c 20 4f 50 5f 47 6f 73 75  AddOp(v, OP_Gosu
1af70 62 2c 20 30 2c 20 61 64 64 72 4f 75 74 70 75 74  b, 0, addrOutput
1af80 52 6f 77 29 3b 0a 20 20 20 20 20 20 56 64 62 65  Row);.      Vdbe
1af90 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 23 20 6f  Comment((v, "# o
1afa0 75 74 70 75 74 20 6f 6e 65 20 72 6f 77 22 29 29  utput one row"))
1afb0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
1afc0 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49  dbeAddOp(v, OP_I
1afd0 66 4d 65 6d 50 6f 73 2c 20 69 41 62 6f 72 74 46  fMemPos, iAbortF
1afe0 6c 61 67 2c 20 61 64 64 72 45 6e 64 29 3b 0a 20  lag, addrEnd);. 
1aff0 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74       VdbeComment
1b000 28 28 76 2c 20 22 23 20 63 68 65 63 6b 20 61 62  ((v, "# check ab
1b010 6f 72 74 20 66 6c 61 67 22 29 29 3b 0a 20 20 20  ort flag"));.   
1b020 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
1b030 64 4f 70 28 76 2c 20 4f 50 5f 47 6f 73 75 62 2c  dOp(v, OP_Gosub,
1b040 20 30 2c 20 61 64 64 72 52 65 73 65 74 29 3b 0a   0, addrReset);.
1b050 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e        VdbeCommen
1b060 74 28 28 76 2c 20 22 23 20 72 65 73 65 74 20 61  t((v, "# reset a
1b070 63 63 75 6d 75 6c 61 74 6f 72 22 29 29 3b 0a 0a  ccumulator"));..
1b080 20 20 20 20 20 20 2f 2a 20 55 70 64 61 74 65 20        /* Update 
1b090 74 68 65 20 61 67 67 72 65 67 61 74 65 20 61 63  the aggregate ac
1b0a0 63 75 6d 75 6c 61 74 6f 72 73 20 62 61 73 65 64  cumulators based
1b0b0 20 6f 6e 20 74 68 65 20 63 6f 6e 74 65 6e 74 20   on the content 
1b0c0 6f 66 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20  of.      ** the 
1b0d0 63 75 72 72 65 6e 74 20 72 6f 77 0a 20 20 20 20  current row.    
1b0e0 20 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74    */.      sqlit
1b0f0 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62  e3VdbeResolveLab
1b100 65 6c 28 76 2c 20 61 64 64 72 50 72 6f 63 65 73  el(v, addrProces
1b110 73 52 6f 77 29 3b 0a 20 20 20 20 20 20 75 70 64  sRow);.      upd
1b120 61 74 65 41 63 63 75 6d 75 6c 61 74 6f 72 28 70  ateAccumulator(p
1b130 50 61 72 73 65 2c 20 26 73 41 67 67 49 6e 66 6f  Parse, &sAggInfo
1b140 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
1b150 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
1b160 4d 65 6d 49 6e 74 2c 20 31 2c 20 69 55 73 65 46  MemInt, 1, iUseF
1b170 6c 61 67 29 3b 0a 20 20 20 20 20 20 56 64 62 65  lag);.      Vdbe
1b180 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 23 20 69  Comment((v, "# i
1b190 6e 64 69 63 61 74 65 20 64 61 74 61 20 69 6e 20  ndicate data in 
1b1a0 61 63 63 75 6d 75 6c 61 74 6f 72 22 29 29 3b 0a  accumulator"));.
1b1b0 0a 20 20 20 20 20 20 2f 2a 20 45 6e 64 20 6f 66  .      /* End of
1b1c0 20 74 68 65 20 6c 6f 6f 70 0a 20 20 20 20 20 20   the loop.      
1b1d0 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 67 72 6f  */.      if( gro
1b1e0 75 70 42 79 53 6f 72 74 20 29 7b 0a 20 20 20 20  upBySort ){.    
1b1f0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
1b200 64 64 4f 70 28 76 2c 20 4f 50 5f 4e 65 78 74 2c  ddOp(v, OP_Next,
1b210 20 73 41 67 67 49 6e 66 6f 2e 73 6f 72 74 69 6e   sAggInfo.sortin
1b220 67 49 64 78 2c 20 61 64 64 72 54 6f 70 4f 66 4c  gIdx, addrTopOfL
1b230 6f 6f 70 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  oop);.      }els
1b240 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  e{.        sqlit
1b250 65 33 57 68 65 72 65 45 6e 64 28 70 57 49 6e 66  e3WhereEnd(pWInf
1b260 6f 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  o);.        sqli
1b270 74 65 33 56 64 62 65 43 68 61 6e 67 65 54 6f 4e  te3VdbeChangeToN
1b280 6f 6f 70 28 76 2c 20 61 64 64 72 53 6f 72 74 69  oop(v, addrSorti
1b290 6e 67 49 64 78 2c 20 31 29 3b 0a 20 20 20 20 20  ngIdx, 1);.     
1b2a0 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 4f 75 74   }..      /* Out
1b2b0 70 75 74 20 74 68 65 20 66 69 6e 61 6c 20 72 6f  put the final ro
1b2c0 77 20 6f 66 20 72 65 73 75 6c 74 0a 20 20 20 20  w of result.    
1b2d0 20 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74    */.      sqlit
1b2e0 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
1b2f0 50 5f 47 6f 73 75 62 2c 20 30 2c 20 61 64 64 72  P_Gosub, 0, addr
1b300 4f 75 74 70 75 74 52 6f 77 29 3b 0a 20 20 20 20  OutputRow);.    
1b310 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76    VdbeComment((v
1b320 2c 20 22 23 20 6f 75 74 70 75 74 20 66 69 6e 61  , "# output fina
1b330 6c 20 72 6f 77 22 29 29 3b 0a 20 20 20 20 20 20  l row"));.      
1b340 0a 20 20 20 20 7d 20 2f 2a 20 65 6e 64 69 66 20  .    } /* endif 
1b350 70 47 72 6f 75 70 42 79 20 2a 2f 0a 20 20 20 20  pGroupBy */.    
1b360 65 6c 73 65 20 7b 0a 20 20 20 20 20 20 2f 2a 20  else {.      /* 
1b370 54 68 69 73 20 63 61 73 65 20 72 75 6e 73 20 69  This case runs i
1b380 66 20 74 68 65 20 61 67 67 72 65 67 61 74 65 20  f the aggregate 
1b390 68 61 73 20 6e 6f 20 47 52 4f 55 50 20 42 59 20  has no GROUP BY 
1b3a0 63 6c 61 75 73 65 2e 20 20 54 68 65 0a 20 20 20  clause.  The.   
1b3b0 20 20 20 2a 2a 20 70 72 6f 63 65 73 73 69 6e 67     ** processing
1b3c0 20 69 73 20 6d 75 63 68 20 73 69 6d 70 6c 65 72   is much simpler
1b3d0 20 73 69 6e 63 65 20 74 68 65 72 65 20 69 73 20   since there is 
1b3e0 6f 6e 6c 79 20 61 20 73 69 6e 67 6c 65 20 72 6f  only a single ro
1b3f0 77 0a 20 20 20 20 20 20 2a 2a 20 6f 66 20 6f 75  w.      ** of ou
1b400 74 70 75 74 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  tput..      */. 
1b410 20 20 20 20 20 72 65 73 65 74 41 63 63 75 6d 75       resetAccumu
1b420 6c 61 74 6f 72 28 70 50 61 72 73 65 2c 20 26 73  lator(pParse, &s
1b430 41 67 67 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20  AggInfo);.      
1b440 70 57 49 6e 66 6f 20 3d 20 73 71 6c 69 74 65 33  pWInfo = sqlite3
1b450 57 68 65 72 65 42 65 67 69 6e 28 70 50 61 72 73  WhereBegin(pPars
1b460 65 2c 20 70 54 61 62 4c 69 73 74 2c 20 70 57 68  e, pTabList, pWh
1b470 65 72 65 2c 20 30 29 3b 0a 20 20 20 20 20 20 69  ere, 0);.      i
1b480 66 28 20 70 57 49 6e 66 6f 3d 3d 30 20 29 20 67  f( pWInfo==0 ) g
1b490 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a  oto select_end;.
1b4a0 20 20 20 20 20 20 75 70 64 61 74 65 41 63 63 75        updateAccu
1b4b0 6d 75 6c 61 74 6f 72 28 70 50 61 72 73 65 2c 20  mulator(pParse, 
1b4c0 26 73 41 67 67 49 6e 66 6f 29 3b 0a 20 20 20 20  &sAggInfo);.    
1b4d0 20 20 73 71 6c 69 74 65 33 57 68 65 72 65 45 6e    sqlite3WhereEn
1b4e0 64 28 70 57 49 6e 66 6f 29 3b 0a 20 20 20 20 20  d(pWInfo);.     
1b4f0 20 66 69 6e 61 6c 69 7a 65 41 67 67 46 75 6e 63   finalizeAggFunc
1b500 74 69 6f 6e 73 28 70 50 61 72 73 65 2c 20 26 73  tions(pParse, &s
1b510 41 67 67 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20  AggInfo);.      
1b520 70 4f 72 64 65 72 42 79 20 3d 20 30 3b 0a 20 20  pOrderBy = 0;.  
1b530 20 20 20 20 69 66 28 20 70 48 61 76 69 6e 67 20      if( pHaving 
1b540 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
1b550 65 33 45 78 70 72 49 66 46 61 6c 73 65 28 70 50  e3ExprIfFalse(pP
1b560 61 72 73 65 2c 20 70 48 61 76 69 6e 67 2c 20 61  arse, pHaving, a
1b570 64 64 72 45 6e 64 2c 20 31 29 3b 0a 20 20 20 20  ddrEnd, 1);.    
1b580 20 20 7d 0a 20 20 20 20 20 20 73 65 6c 65 63 74    }.      select
1b590 49 6e 6e 65 72 4c 6f 6f 70 28 70 50 61 72 73 65  InnerLoop(pParse
1b5a0 2c 20 70 2c 20 70 2d 3e 70 45 4c 69 73 74 2c 20  , p, p->pEList, 
1b5b0 30 2c 20 30 2c 20 30 2c 20 2d 31 2c 20 0a 20 20  0, 0, 0, -1, .  
1b5c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b5d0 20 20 20 20 65 44 65 73 74 2c 20 69 50 61 72 6d      eDest, iParm
1b5e0 2c 20 61 64 64 72 45 6e 64 2c 20 61 64 64 72 45  , addrEnd, addrE
1b5f0 6e 64 2c 20 61 66 66 29 3b 0a 20 20 20 20 7d 0a  nd, aff);.    }.
1b600 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 52      sqlite3VdbeR
1b610 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 61  esolveLabel(v, a
1b620 64 64 72 45 6e 64 29 3b 0a 20 20 20 20 0a 20 20  ddrEnd);.    .  
1b630 7d 20 2f 2a 20 65 6e 64 69 66 20 61 67 67 72 65  } /* endif aggre
1b640 67 61 74 65 20 71 75 65 72 79 20 2a 2f 0a 0a 20  gate query */.. 
1b650 20 2f 2a 20 49 66 20 74 68 65 72 65 20 69 73 20   /* If there is 
1b660 61 6e 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75  an ORDER BY clau
1b670 73 65 2c 20 74 68 65 6e 20 77 65 20 6e 65 65 64  se, then we need
1b680 20 74 6f 20 73 6f 72 74 20 74 68 65 20 72 65 73   to sort the res
1b690 75 6c 74 73 0a 20 20 2a 2a 20 61 6e 64 20 73 65  ults.  ** and se
1b6a0 6e 64 20 74 68 65 6d 20 74 6f 20 74 68 65 20 63  nd them to the c
1b6b0 61 6c 6c 62 61 63 6b 20 6f 6e 65 20 62 79 20 6f  allback one by o
1b6c0 6e 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  ne..  */.  if( p
1b6d0 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20 67  OrderBy ){.    g
1b6e0 65 6e 65 72 61 74 65 53 6f 72 74 54 61 69 6c 28  enerateSortTail(
1b6f0 70 50 61 72 73 65 2c 20 70 2c 20 76 2c 20 70 45  pParse, p, v, pE
1b700 4c 69 73 74 2d 3e 6e 45 78 70 72 2c 20 65 44 65  List->nExpr, eDe
1b710 73 74 2c 20 69 50 61 72 6d 29 3b 0a 20 20 7d 0a  st, iParm);.  }.
1b720 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
1b730 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 20 20  OMIT_SUBQUERY.  
1b740 2f 2a 20 49 66 20 74 68 69 73 20 77 61 73 20 61  /* If this was a
1b750 20 73 75 62 71 75 65 72 79 2c 20 77 65 20 68 61   subquery, we ha
1b760 76 65 20 6e 6f 77 20 63 6f 6e 76 65 72 74 65 64  ve now converted
1b770 20 74 68 65 20 73 75 62 71 75 65 72 79 20 69 6e   the subquery in
1b780 74 6f 20 61 0a 20 20 2a 2a 20 74 65 6d 70 6f 72  to a.  ** tempor
1b790 61 72 79 20 74 61 62 6c 65 2e 20 20 53 6f 20 73  ary table.  So s
1b7a0 65 74 20 74 68 65 20 53 72 63 4c 69 73 74 5f 69  et the SrcList_i
1b7b0 74 65 6d 2e 69 73 50 6f 70 75 6c 61 74 65 64 20  tem.isPopulated 
1b7c0 66 6c 61 67 20 74 6f 20 70 72 65 76 65 6e 74 0a  flag to prevent.
1b7d0 20 20 2a 2a 20 74 68 69 73 20 73 75 62 71 75 65    ** this subque
1b7e0 72 79 20 66 72 6f 6d 20 62 65 69 6e 67 20 65 76  ry from being ev
1b7f0 61 6c 75 61 74 65 64 20 61 67 61 69 6e 20 61 6e  aluated again an
1b800 64 20 74 6f 20 66 6f 72 63 65 20 74 68 65 20 75  d to force the u
1b810 73 65 20 6f 66 0a 20 20 2a 2a 20 74 68 65 20 74  se of.  ** the t
1b820 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 2e 0a  emporary table..
1b830 20 20 2a 2f 0a 20 20 69 66 28 20 70 50 61 72 65    */.  if( pPare
1b840 6e 74 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  nt ){.    assert
1b850 28 20 70 50 61 72 65 6e 74 2d 3e 70 53 72 63 2d  ( pParent->pSrc-
1b860 3e 6e 53 72 63 3e 70 61 72 65 6e 74 54 61 62 20  >nSrc>parentTab 
1b870 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
1b880 50 61 72 65 6e 74 2d 3e 70 53 72 63 2d 3e 61 5b  Parent->pSrc->a[
1b890 70 61 72 65 6e 74 54 61 62 5d 2e 70 53 65 6c 65  parentTab].pSele
1b8a0 63 74 3d 3d 70 20 29 3b 0a 20 20 20 20 70 50 61  ct==p );.    pPa
1b8b0 72 65 6e 74 2d 3e 70 53 72 63 2d 3e 61 5b 70 61  rent->pSrc->a[pa
1b8c0 72 65 6e 74 54 61 62 5d 2e 69 73 50 6f 70 75 6c  rentTab].isPopul
1b8d0 61 74 65 64 20 3d 20 31 3b 0a 20 20 7d 0a 23 65  ated = 1;.  }.#e
1b8e0 6e 64 69 66 0a 0a 20 20 2f 2a 20 4a 75 6d 70 20  ndif..  /* Jump 
1b8f0 68 65 72 65 20 74 6f 20 73 6b 69 70 20 74 68 69  here to skip thi
1b900 73 20 71 75 65 72 79 0a 20 20 2a 2f 0a 20 20 73  s query.  */.  s
1b910 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76  qlite3VdbeResolv
1b920 65 4c 61 62 65 6c 28 76 2c 20 69 45 6e 64 29 3b  eLabel(v, iEnd);
1b930 0a 0a 20 20 2f 2a 20 54 68 65 20 53 45 4c 45 43  ..  /* The SELEC
1b940 54 20 77 61 73 20 73 75 63 63 65 73 73 66 75 6c  T was successful
1b950 6c 79 20 63 6f 64 65 64 2e 20 20 20 53 65 74 20  ly coded.   Set 
1b960 74 68 65 20 72 65 74 75 72 6e 20 63 6f 64 65 20  the return code 
1b970 74 6f 20 30 0a 20 20 2a 2a 20 74 6f 20 69 6e 64  to 0.  ** to ind
1b980 69 63 61 74 65 20 6e 6f 20 65 72 72 6f 72 73 2e  icate no errors.
1b990 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20 30 3b 0a  .  */.  rc = 0;.
1b9a0 0a 20 20 2f 2a 20 43 6f 6e 74 72 6f 6c 20 6a 75  .  /* Control ju
1b9b0 6d 70 73 20 74 6f 20 68 65 72 65 20 69 66 20 61  mps to here if a
1b9c0 6e 20 65 72 72 6f 72 20 69 73 20 65 6e 63 6f 75  n error is encou
1b9d0 6e 74 65 72 65 64 20 61 62 6f 76 65 2c 20 6f 72  ntered above, or
1b9e0 20 75 70 6f 6e 0a 20 20 2a 2a 20 73 75 63 63 65   upon.  ** succe
1b9f0 73 73 66 75 6c 20 63 6f 64 69 6e 67 20 6f 66 20  ssful coding of 
1ba00 74 68 65 20 53 45 4c 45 43 54 2e 0a 20 20 2a 2f  the SELECT..  */
1ba10 0a 73 65 6c 65 63 74 5f 65 6e 64 3a 0a 0a 20 20  .select_end:..  
1ba20 2f 2a 20 49 64 65 6e 74 69 66 79 20 63 6f 6c 75  /* Identify colu
1ba30 6d 6e 20 6e 61 6d 65 73 20 69 66 20 77 65 20 77  mn names if we w
1ba40 69 6c 6c 20 62 65 20 75 73 69 6e 67 20 74 68 65  ill be using the
1ba50 6d 20 69 6e 20 61 20 63 61 6c 6c 62 61 63 6b 2e  m in a callback.
1ba60 20 20 54 68 69 73 0a 20 20 2a 2a 20 73 74 65 70    This.  ** step
1ba70 20 69 73 20 73 6b 69 70 70 65 64 20 69 66 20 74   is skipped if t
1ba80 68 65 20 6f 75 74 70 75 74 20 69 73 20 67 6f 69  he output is goi
1ba90 6e 67 20 74 6f 20 73 6f 6d 65 20 6f 74 68 65 72  ng to some other
1baa0 20 64 65 73 74 69 6e 61 74 69 6f 6e 2e 0a 20 20   destination..  
1bab0 2a 2f 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  */.  if( rc==SQL
1bac0 49 54 45 5f 4f 4b 20 26 26 20 65 44 65 73 74 3d  ITE_OK && eDest=
1bad0 3d 53 52 54 5f 43 61 6c 6c 62 61 63 6b 20 29 7b  =SRT_Callback ){
1bae0 0a 20 20 20 20 67 65 6e 65 72 61 74 65 43 6f 6c  .    generateCol
1baf0 75 6d 6e 4e 61 6d 65 73 28 70 50 61 72 73 65 2c  umnNames(pParse,
1bb00 20 70 54 61 62 4c 69 73 74 2c 20 70 45 4c 69 73   pTabList, pELis
1bb10 74 29 3b 0a 20 20 7d 0a 0a 20 20 73 71 6c 69 74  t);.  }..  sqlit
1bb20 65 46 72 65 65 28 73 41 67 67 49 6e 66 6f 2e 61  eFree(sAggInfo.a
1bb30 43 6f 6c 29 3b 0a 20 20 73 71 6c 69 74 65 46 72  Col);.  sqliteFr
1bb40 65 65 28 73 41 67 67 49 6e 66 6f 2e 61 46 75 6e  ee(sAggInfo.aFun
1bb50 63 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  c);.  return rc;
1bb60 0a 7d 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28  .}..#if defined(
1bb70 53 51 4c 49 54 45 5f 44 45 42 55 47 29 0a 2f 2a  SQLITE_DEBUG)./*
1bb80 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  .***************
1bb90 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1bba0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1bbb0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1bbc0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1bbd0 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e  .** The followin
1bbe0 67 20 63 6f 64 65 20 69 73 20 75 73 65 64 20 66  g code is used f
1bbf0 6f 72 20 74 65 73 74 69 6e 67 20 61 6e 64 20 64  or testing and d
1bc00 65 62 75 67 67 69 6e 67 20 6f 6e 6c 79 2e 20 20  ebugging only.  
1bc10 54 68 65 20 63 6f 64 65 0a 2a 2a 20 74 68 61 74  The code.** that
1bc20 20 66 6f 6c 6c 6f 77 73 20 64 6f 65 73 20 6e 6f   follows does no
1bc30 74 20 61 70 70 65 61 72 20 69 6e 20 6e 6f 72 6d  t appear in norm
1bc40 61 6c 20 62 75 69 6c 64 73 2e 0a 2a 2a 0a 2a 2a  al builds..**.**
1bc50 20 54 68 65 73 65 20 72 6f 75 74 69 6e 65 73 20   These routines 
1bc60 61 72 65 20 75 73 65 64 20 74 6f 20 70 72 69 6e  are used to prin
1bc70 74 20 6f 75 74 20 74 68 65 20 63 6f 6e 74 65 6e  t out the conten
1bc80 74 20 6f 66 20 61 6c 6c 20 6f 72 20 70 61 72 74  t of all or part
1bc90 20 6f 66 20 61 20 0a 2a 2a 20 70 61 72 73 65 20   of a .** parse 
1bca0 73 74 72 75 63 74 75 72 65 73 20 73 75 63 68 20  structures such 
1bcb0 61 73 20 53 65 6c 65 63 74 20 6f 72 20 45 78 70  as Select or Exp
1bcc0 72 2e 20 20 53 75 63 68 20 70 72 69 6e 74 6f 75  r.  Such printou
1bcd0 74 73 20 61 72 65 20 75 73 65 66 75 6c 0a 2a 2a  ts are useful.**
1bce0 20 66 6f 72 20 68 65 6c 70 69 6e 67 20 74 6f 20   for helping to 
1bcf0 75 6e 64 65 72 73 74 61 6e 64 20 77 68 61 74 20  understand what 
1bd00 69 73 20 68 61 70 70 65 6e 69 6e 67 20 69 6e 73  is happening ins
1bd10 69 64 65 20 74 68 65 20 63 6f 64 65 20 67 65 6e  ide the code gen
1bd20 65 72 61 74 6f 72 0a 2a 2a 20 64 75 72 69 6e 67  erator.** during
1bd30 20 74 68 65 20 65 78 65 63 75 74 69 6f 6e 20 6f   the execution o
1bd40 66 20 63 6f 6d 70 6c 65 78 20 53 45 4c 45 43 54  f complex SELECT
1bd50 20 73 74 61 74 65 6d 65 6e 74 73 2e 0a 2a 2a 0a   statements..**.
1bd60 2a 2a 20 54 68 65 73 65 20 72 6f 75 74 69 6e 65  ** These routine
1bd70 20 61 72 65 20 6e 6f 74 20 63 61 6c 6c 65 64 20   are not called 
1bd80 61 6e 79 77 68 65 72 65 20 66 72 6f 6d 20 77 69  anywhere from wi
1bd90 74 68 69 6e 20 74 68 65 20 6e 6f 72 6d 61 6c 0a  thin the normal.
1bda0 2a 2a 20 63 6f 64 65 20 62 61 73 65 2e 20 20 54  ** code base.  T
1bdb0 68 65 6e 20 61 72 65 20 69 6e 74 65 6e 64 65 64  hen are intended
1bdc0 20 74 6f 20 62 65 20 63 61 6c 6c 65 64 20 66 72   to be called fr
1bdd0 6f 6d 20 77 69 74 68 69 6e 20 74 68 65 20 64 65  om within the de
1bde0 62 75 67 67 65 72 0a 2a 2a 20 6f 72 20 66 72 6f  bugger.** or fro
1bdf0 6d 20 74 65 6d 70 6f 72 61 72 79 20 22 70 72 69  m temporary "pri
1be00 6e 74 66 22 20 73 74 61 74 65 6d 65 6e 74 73 20  ntf" statements 
1be10 69 6e 73 65 72 74 65 64 20 66 6f 72 20 64 65 62  inserted for deb
1be20 75 67 67 69 6e 67 2e 0a 2a 2f 0a 76 6f 69 64 20  ugging..*/.void 
1be30 73 71 6c 69 74 65 33 50 72 69 6e 74 45 78 70 72  sqlite3PrintExpr
1be40 28 45 78 70 72 20 2a 70 29 7b 0a 20 20 69 66 28  (Expr *p){.  if(
1be50 20 70 2d 3e 74 6f 6b 65 6e 2e 7a 20 26 26 20 70   p->token.z && p
1be60 2d 3e 74 6f 6b 65 6e 2e 6e 3e 30 20 29 7b 0a 20  ->token.n>0 ){. 
1be70 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50     sqlite3DebugP
1be80 72 69 6e 74 66 28 22 28 25 2e 2a 73 22 2c 20 70  rintf("(%.*s", p
1be90 2d 3e 74 6f 6b 65 6e 2e 6e 2c 20 70 2d 3e 74 6f  ->token.n, p->to
1bea0 6b 65 6e 2e 7a 29 3b 0a 20 20 7d 65 6c 73 65 7b  ken.z);.  }else{
1beb0 0a 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75  .    sqlite3Debu
1bec0 67 50 72 69 6e 74 66 28 22 28 25 64 22 2c 20 70  gPrintf("(%d", p
1bed0 2d 3e 6f 70 29 3b 0a 20 20 7d 0a 20 20 69 66 28  ->op);.  }.  if(
1bee0 20 70 2d 3e 70 4c 65 66 74 20 29 7b 0a 20 20 20   p->pLeft ){.   
1bef0 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69   sqlite3DebugPri
1bf00 6e 74 66 28 22 20 22 29 3b 0a 20 20 20 20 73 71  ntf(" ");.    sq
1bf10 6c 69 74 65 33 50 72 69 6e 74 45 78 70 72 28 70  lite3PrintExpr(p
1bf20 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 7d 0a 20 20  ->pLeft);.  }.  
1bf30 69 66 28 20 70 2d 3e 70 52 69 67 68 74 20 29 7b  if( p->pRight ){
1bf40 0a 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75  .    sqlite3Debu
1bf50 67 50 72 69 6e 74 66 28 22 20 22 29 3b 0a 20 20  gPrintf(" ");.  
1bf60 20 20 73 71 6c 69 74 65 33 50 72 69 6e 74 45 78    sqlite3PrintEx
1bf70 70 72 28 70 2d 3e 70 52 69 67 68 74 29 3b 0a 20  pr(p->pRight);. 
1bf80 20 7d 0a 20 20 73 71 6c 69 74 65 33 44 65 62 75   }.  sqlite3Debu
1bf90 67 50 72 69 6e 74 66 28 22 29 22 29 3b 0a 7d 0a  gPrintf(")");.}.
1bfa0 76 6f 69 64 20 73 71 6c 69 74 65 33 50 72 69 6e  void sqlite3Prin
1bfb0 74 45 78 70 72 4c 69 73 74 28 45 78 70 72 4c 69  tExprList(ExprLi
1bfc0 73 74 20 2a 70 4c 69 73 74 29 7b 0a 20 20 69 6e  st *pList){.  in
1bfd0 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  t i;.  for(i=0; 
1bfe0 69 3c 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20  i<pList->nExpr; 
1bff0 69 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  i++){.    sqlite
1c000 33 50 72 69 6e 74 45 78 70 72 28 70 4c 69 73 74  3PrintExpr(pList
1c010 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 29 3b 0a 20  ->a[i].pExpr);. 
1c020 20 20 20 69 66 28 20 69 3c 70 4c 69 73 74 2d 3e     if( i<pList->
1c030 6e 45 78 70 72 2d 31 20 29 7b 0a 20 20 20 20 20  nExpr-1 ){.     
1c040 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69   sqlite3DebugPri
1c050 6e 74 66 28 22 2c 20 22 29 3b 0a 20 20 20 20 7d  ntf(", ");.    }
1c060 0a 20 20 7d 0a 7d 0a 76 6f 69 64 20 73 71 6c 69  .  }.}.void sqli
1c070 74 65 33 50 72 69 6e 74 53 65 6c 65 63 74 28 53  te3PrintSelect(S
1c080 65 6c 65 63 74 20 2a 70 2c 20 69 6e 74 20 69 6e  elect *p, int in
1c090 64 65 6e 74 29 7b 0a 20 20 73 71 6c 69 74 65 33  dent){.  sqlite3
1c0a0 44 65 62 75 67 50 72 69 6e 74 66 28 22 25 2a 73  DebugPrintf("%*s
1c0b0 53 45 4c 45 43 54 28 25 70 29 20 22 2c 20 69 6e  SELECT(%p) ", in
1c0c0 64 65 6e 74 2c 20 22 22 2c 20 70 29 3b 0a 20 20  dent, "", p);.  
1c0d0 73 71 6c 69 74 65 33 50 72 69 6e 74 45 78 70 72  sqlite3PrintExpr
1c0e0 4c 69 73 74 28 70 2d 3e 70 45 4c 69 73 74 29 3b  List(p->pEList);
1c0f0 0a 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50  .  sqlite3DebugP
1c100 72 69 6e 74 66 28 22 5c 6e 22 29 3b 0a 20 20 69  rintf("\n");.  i
1c110 66 28 20 70 2d 3e 70 53 72 63 20 29 7b 0a 20 20  f( p->pSrc ){.  
1c120 20 20 63 68 61 72 20 2a 7a 50 72 65 66 69 78 3b    char *zPrefix;
1c130 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20  .    int i;.    
1c140 7a 50 72 65 66 69 78 20 3d 20 22 46 52 4f 4d 22  zPrefix = "FROM"
1c150 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  ;.    for(i=0; i
1c160 3c 70 2d 3e 70 53 72 63 2d 3e 6e 53 72 63 3b 20  <p->pSrc->nSrc; 
1c170 69 2b 2b 29 7b 0a 20 20 20 20 20 20 73 74 72 75  i++){.      stru
1c180 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20  ct SrcList_item 
1c190 2a 70 49 74 65 6d 20 3d 20 26 70 2d 3e 70 53 72  *pItem = &p->pSr
1c1a0 63 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20 20 20 73  c->a[i];.      s
1c1b0 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74  qlite3DebugPrint
1c1c0 66 28 22 25 2a 73 20 22 2c 20 69 6e 64 65 6e 74  f("%*s ", indent
1c1d0 2b 36 2c 20 7a 50 72 65 66 69 78 29 3b 0a 20 20  +6, zPrefix);.  
1c1e0 20 20 20 20 7a 50 72 65 66 69 78 20 3d 20 22 22      zPrefix = ""
1c1f0 3b 0a 20 20 20 20 20 20 69 66 28 20 70 49 74 65  ;.      if( pIte
1c200 6d 2d 3e 70 53 65 6c 65 63 74 20 29 7b 0a 20 20  m->pSelect ){.  
1c210 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 65 62        sqlite3Deb
1c220 75 67 50 72 69 6e 74 66 28 22 28 5c 6e 22 29 3b  ugPrintf("(\n");
1c230 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
1c240 50 72 69 6e 74 53 65 6c 65 63 74 28 70 49 74 65  PrintSelect(pIte
1c250 6d 2d 3e 70 53 65 6c 65 63 74 2c 20 69 6e 64 65  m->pSelect, inde
1c260 6e 74 2b 31 30 29 3b 0a 20 20 20 20 20 20 20 20  nt+10);.        
1c270 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e  sqlite3DebugPrin
1c280 74 66 28 22 25 2a 73 29 22 2c 20 69 6e 64 65 6e  tf("%*s)", inden
1c290 74 2b 38 2c 20 22 22 29 3b 0a 20 20 20 20 20 20  t+8, "");.      
1c2a0 7d 65 6c 73 65 20 69 66 28 20 70 49 74 65 6d 2d  }else if( pItem-
1c2b0 3e 7a 4e 61 6d 65 20 29 7b 0a 20 20 20 20 20 20  >zName ){.      
1c2c0 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72    sqlite3DebugPr
1c2d0 69 6e 74 66 28 22 25 73 22 2c 20 70 49 74 65 6d  intf("%s", pItem
1c2e0 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20  ->zName);.      
1c2f0 7d 0a 20 20 20 20 20 20 69 66 28 20 70 49 74 65  }.      if( pIte
1c300 6d 2d 3e 70 54 61 62 20 29 7b 0a 20 20 20 20 20  m->pTab ){.     
1c310 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50     sqlite3DebugP
1c320 72 69 6e 74 66 28 22 28 74 61 62 6c 65 3a 20 25  rintf("(table: %
1c330 73 29 22 2c 20 70 49 74 65 6d 2d 3e 70 54 61 62  s)", pItem->pTab
1c340 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20  ->zName);.      
1c350 7d 0a 20 20 20 20 20 20 69 66 28 20 70 49 74 65  }.      if( pIte
1c360 6d 2d 3e 7a 41 6c 69 61 73 20 29 7b 0a 20 20 20  m->zAlias ){.   
1c370 20 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75       sqlite3Debu
1c380 67 50 72 69 6e 74 66 28 22 20 41 53 20 25 73 22  gPrintf(" AS %s"
1c390 2c 20 70 49 74 65 6d 2d 3e 7a 41 6c 69 61 73 29  , pItem->zAlias)
1c3a0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
1c3b0 69 66 28 20 69 3c 70 2d 3e 70 53 72 63 2d 3e 6e  if( i<p->pSrc->n
1c3c0 53 72 63 2d 31 20 29 7b 0a 20 20 20 20 20 20 20  Src-1 ){.       
1c3d0 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69   sqlite3DebugPri
1c3e0 6e 74 66 28 22 2c 22 29 3b 0a 20 20 20 20 20 20  ntf(",");.      
1c3f0 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 44  }.      sqlite3D
1c400 65 62 75 67 50 72 69 6e 74 66 28 22 5c 6e 22 29  ebugPrintf("\n")
1c410 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66  ;.    }.  }.  if
1c420 28 20 70 2d 3e 70 57 68 65 72 65 20 29 7b 0a 20  ( p->pWhere ){. 
1c430 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50     sqlite3DebugP
1c440 72 69 6e 74 66 28 22 25 2a 73 20 57 48 45 52 45  rintf("%*s WHERE
1c450 20 22 2c 20 69 6e 64 65 6e 74 2c 20 22 22 29 3b   ", indent, "");
1c460 0a 20 20 20 20 73 71 6c 69 74 65 33 50 72 69 6e  .    sqlite3Prin
1c470 74 45 78 70 72 28 70 2d 3e 70 57 68 65 72 65 29  tExpr(p->pWhere)
1c480 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 65 62  ;.    sqlite3Deb
1c490 75 67 50 72 69 6e 74 66 28 22 5c 6e 22 29 3b 0a  ugPrintf("\n");.
1c4a0 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e 70 47 72    }.  if( p->pGr
1c4b0 6f 75 70 42 79 20 29 7b 0a 20 20 20 20 73 71 6c  oupBy ){.    sql
1c4c0 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28  ite3DebugPrintf(
1c4d0 22 25 2a 73 20 47 52 4f 55 50 20 42 59 20 22 2c  "%*s GROUP BY ",
1c4e0 20 69 6e 64 65 6e 74 2c 20 22 22 29 3b 0a 20 20   indent, "");.  
1c4f0 20 20 73 71 6c 69 74 65 33 50 72 69 6e 74 45 78    sqlite3PrintEx
1c500 70 72 4c 69 73 74 28 70 2d 3e 70 47 72 6f 75 70  prList(p->pGroup
1c510 42 79 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  By);.    sqlite3
1c520 44 65 62 75 67 50 72 69 6e 74 66 28 22 5c 6e 22  DebugPrintf("\n"
1c530 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e  );.  }.  if( p->
1c540 70 48 61 76 69 6e 67 20 29 7b 0a 20 20 20 20 73  pHaving ){.    s
1c550 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74  qlite3DebugPrint
1c560 66 28 22 25 2a 73 20 48 41 56 49 4e 47 20 22 2c  f("%*s HAVING ",
1c570 20 69 6e 64 65 6e 74 2c 20 22 22 29 3b 0a 20 20   indent, "");.  
1c580 20 20 73 71 6c 69 74 65 33 50 72 69 6e 74 45 78    sqlite3PrintEx
1c590 70 72 28 70 2d 3e 70 48 61 76 69 6e 67 29 3b 0a  pr(p->pHaving);.
1c5a0 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67      sqlite3Debug
1c5b0 50 72 69 6e 74 66 28 22 5c 6e 22 29 3b 0a 20 20  Printf("\n");.  
1c5c0 7d 0a 20 20 69 66 28 20 70 2d 3e 70 4f 72 64 65  }.  if( p->pOrde
1c5d0 72 42 79 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  rBy ){.    sqlit
1c5e0 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 25  e3DebugPrintf("%
1c5f0 2a 73 20 4f 52 44 45 52 20 42 59 20 22 2c 20 69  *s ORDER BY ", i
1c600 6e 64 65 6e 74 2c 20 22 22 29 3b 0a 20 20 20 20  ndent, "");.    
1c610 73 71 6c 69 74 65 33 50 72 69 6e 74 45 78 70 72  sqlite3PrintExpr
1c620 4c 69 73 74 28 70 2d 3e 70 4f 72 64 65 72 42 79  List(p->pOrderBy
1c630 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 65  );.    sqlite3De
1c640 62 75 67 50 72 69 6e 74 66 28 22 5c 6e 22 29 3b  bugPrintf("\n");
1c650 0a 20 20 7d 0a 7d 0a 2f 2a 20 45 6e 64 20 6f 66  .  }.}./* End of
1c660 20 74 68 65 20 73 74 72 75 63 74 75 72 65 20 64   the structure d
1c670 65 62 75 67 20 70 72 69 6e 74 69 6e 67 20 63 6f  ebug printing co
1c680 64 65 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  de.*************
1c690 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1c6a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1c6b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1c6c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1c6d0 2f 0a 23 65 6e 64 69 66 20 2f 2a 20 64 65 66 69  /.#endif /* defi
1c6e0 6e 65 64 28 53 51 4c 49 54 45 5f 54 45 53 54 29  ned(SQLITE_TEST)
1c6f0 20 7c 7c 20 64 65 66 69 6e 65 64 28 53 51 4c 49   || defined(SQLI
1c700 54 45 5f 44 45 42 55 47 29 20 2a 2f 0a           TE_DEBUG) */.